From 4cc3ff02fa66f711b10608e46a509bfcec57a876 Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@59561ff5-6e30-0410-9f3c-9617f08c8826> Date: Thu, 3 Jun 2004 03:38:44 +0000 Subject: [PATCH 0001/1469] New repository initialized by cvs2svn. git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1 59561ff5-6e30-0410-9f3c-9617f08c8826 From fa67ddcad9ce4ce04668d8ce46f4ac0057c914c2 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 3 Jun 2004 03:38:44 +0000 Subject: [PATCH 0002/1469] Initial revision git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@2 59561ff5-6e30-0410-9f3c-9617f08c8826 --- AUTHORS | 1 + BUGS | 31 + COPYING | 27 + ChangeLog | 130 + INSTALL | 14 + MANIFEST | 9 + Makefile.am | 8 + Makefile.in | 430 ++ NEWS | 0 README | 69 + TODO | 18 + aclocal.m4 | 998 ++++ asn1c/Makefile.am | 25 + asn1c/Makefile.in | 556 ++ asn1c/README | 1 + asn1c/asn1c.1 | 99 + asn1c/asn1c.c | 267 + asn1c/check-parsing.sh | 18 + asn1c/tests/Makefile.am | 10 + asn1c/tests/Makefile.in | 284 + asn1c/tests/README | 6 + asn1c/tests/check-22.c | 141 + asn1c/tests/check-24.c | 94 + asn1c/tests/check-25.c | 252 + asn1c/tests/check-30.c | 116 + asn1c/tests/check-31.c | 175 + asn1c/tests/check-32.c | 21 + asn1c/tests/check-33.c | 21 + asn1c/tests/check-35.c | 277 + asn1c/tests/check-41.c | 315 + asn1c/tests/check-43.c | 24 + asn1c/tests/check-assembly.sh | 56 + config.guess | 1314 +++++ config.h.in | 81 + config.sub | 1410 +++++ configure | 6937 +++++++++++++++++++++++ configure.in | 95 + depcomp | 411 ++ doc/Makefile.am | 3 + doc/Makefile.in | 221 + doc/asn1c-usage.pdf | Bin 0 -> 129406 bytes examples/Makefile.am | 4 + examples/Makefile.in | 246 + examples/README | 6 + examples/clyx2asn1.pl | 51 + examples/crfc2asn1.pl | 86 + install-sh | 251 + libasn1compiler/Makefile.am | 28 + libasn1compiler/Makefile.in | 424 ++ libasn1compiler/asn1c_C.c | 2021 +++++++ libasn1compiler/asn1c_C.h | 69 + libasn1compiler/asn1c_internal.h | 81 + libasn1compiler/asn1c_lang.c | 32 + libasn1compiler/asn1c_lang.h | 28 + libasn1compiler/asn1c_misc.c | 232 + libasn1compiler/asn1c_misc.h | 28 + libasn1compiler/asn1c_out.c | 75 + libasn1compiler/asn1c_out.h | 31 + libasn1compiler/asn1c_save.c | 225 + libasn1compiler/asn1c_save.h | 6 + libasn1compiler/asn1compiler.c | 160 + libasn1compiler/asn1compiler.h | 41 + libasn1compiler/check_compiler.c | 7 + libasn1fix/Makefile.am | 36 + libasn1fix/Makefile.in | 454 ++ libasn1fix/asn1fix.c | 354 ++ libasn1fix/asn1fix.h | 30 + libasn1fix/asn1fix_bitstring.c | 230 + libasn1fix/asn1fix_bitstring.h | 6 + libasn1fix/asn1fix_class.c | 237 + libasn1fix/asn1fix_class.h | 16 + libasn1fix/asn1fix_compat.c | 132 + libasn1fix/asn1fix_compat.h | 14 + libasn1fix/asn1fix_constr.c | 364 ++ libasn1fix/asn1fix_constr.h | 24 + libasn1fix/asn1fix_cstring.c | 73 + libasn1fix/asn1fix_cstring.h | 6 + libasn1fix/asn1fix_dereft.c | 68 + libasn1fix/asn1fix_dereft.h | 6 + libasn1fix/asn1fix_derefv.c | 56 + libasn1fix/asn1fix_derefv.h | 6 + libasn1fix/asn1fix_enum.c | 136 + libasn1fix/asn1fix_enum.h | 6 + libasn1fix/asn1fix_export.c | 48 + libasn1fix/asn1fix_export.h | 32 + libasn1fix/asn1fix_integer.c | 161 + libasn1fix/asn1fix_integer.h | 6 + libasn1fix/asn1fix_internal.h | 106 + libasn1fix/asn1fix_misc.c | 276 + libasn1fix/asn1fix_misc.h | 47 + libasn1fix/asn1fix_param.c | 165 + libasn1fix/asn1fix_param.h | 6 + libasn1fix/asn1fix_retrieve.c | 366 ++ libasn1fix/asn1fix_retrieve.h | 73 + libasn1fix/asn1fix_tags.c | 47 + libasn1fix/asn1fix_tags.h | 6 + libasn1fix/asn1fix_value.c | 159 + libasn1fix/asn1fix_value.h | 28 + libasn1fix/check_fixer.c | 313 + libasn1parser/Makefile.am | 35 + libasn1parser/Makefile.in | 459 ++ libasn1parser/asn1p_class.c | 135 + libasn1parser/asn1p_class.h | 53 + libasn1parser/asn1p_constr.c | 91 + libasn1parser/asn1p_constr.h | 79 + libasn1parser/asn1p_expr.c | 112 + libasn1parser/asn1p_expr.h | 214 + libasn1parser/asn1p_expr2uclass.h | 41 + libasn1parser/asn1p_expr_str.h | 57 + libasn1parser/asn1p_l.c | 3861 +++++++++++++ libasn1parser/asn1p_l.l | 560 ++ libasn1parser/asn1p_list.h | 57 + libasn1parser/asn1p_module.c | 62 + libasn1parser/asn1p_module.h | 88 + libasn1parser/asn1p_oid.c | 95 + libasn1parser/asn1p_oid.h | 66 + libasn1parser/asn1p_param.c | 111 + libasn1parser/asn1p_param.h | 30 + libasn1parser/asn1p_ref.c | 137 + libasn1parser/asn1p_ref.h | 62 + libasn1parser/asn1p_value.c | 178 + libasn1parser/asn1p_value.h | 60 + libasn1parser/asn1p_xports.c | 34 + libasn1parser/asn1p_xports.h | 40 + libasn1parser/asn1p_y.c | 3484 ++++++++++++ libasn1parser/asn1p_y.h | 132 + libasn1parser/asn1p_y.y | 1982 +++++++ libasn1parser/asn1parser.c | 171 + libasn1parser/asn1parser.h | 73 + libasn1parser/expr-h.pl | 49 + libasn1print/Makefile.am | 14 + libasn1print/Makefile.in | 382 ++ libasn1print/README | 4 + libasn1print/asn1print.c | 456 ++ libasn1print/asn1print.h | 16 + ltconfig | 3096 ++++++++++ ltmain.sh | 4122 ++++++++++++++ missing | 283 + mkinstalldirs | 40 + skeletons/BIT_STRING.c | 96 + skeletons/BIT_STRING.h | 18 + skeletons/BMPString.c | 65 + skeletons/BMPString.h | 17 + skeletons/BOOLEAN.c | 147 + skeletons/BOOLEAN.h | 21 + skeletons/ENUMERATED.c | 26 + skeletons/ENUMERATED.h | 15 + skeletons/GeneralString.c | 27 + skeletons/GeneralString.h | 15 + skeletons/GeneralizedTime.c | 302 + skeletons/GeneralizedTime.h | 26 + skeletons/GraphicString.c | 27 + skeletons/GraphicString.h | 15 + skeletons/IA5String.c | 57 + skeletons/IA5String.h | 20 + skeletons/INTEGER.c | 305 + skeletons/INTEGER.h | 33 + skeletons/ISO646String.c | 27 + skeletons/ISO646String.h | 15 + skeletons/Makefile.am | 7 + skeletons/Makefile.in | 364 ++ skeletons/NULL.c | 51 + skeletons/NULL.h | 19 + skeletons/NativeEnumerated.c | 32 + skeletons/NativeEnumerated.h | 19 + skeletons/NativeInteger.c | 193 + skeletons/NativeInteger.h | 24 + skeletons/NumericString.c | 62 + skeletons/NumericString.h | 17 + skeletons/OBJECT_IDENTIFIER.c | 356 ++ skeletons/OBJECT_IDENTIFIER.h | 95 + skeletons/OCTET_STRING.c | 588 ++ skeletons/OCTET_STRING.h | 51 + skeletons/ObjectDescriptor.c | 27 + skeletons/ObjectDescriptor.h | 15 + skeletons/PrintableString.c | 81 + skeletons/PrintableString.h | 17 + skeletons/README | 6 + skeletons/RELATIVE-OID.c | 155 + skeletons/RELATIVE-OID.h | 30 + skeletons/T61String.c | 27 + skeletons/T61String.h | 15 + skeletons/TeletexString.c | 27 + skeletons/TeletexString.h | 15 + skeletons/UTCTime.c | 105 + skeletons/UTCTime.h | 26 + skeletons/UTF8String.c | 112 + skeletons/UTF8String.h | 22 + skeletons/UniversalString.c | 83 + skeletons/UniversalString.h | 17 + skeletons/VideotexString.c | 27 + skeletons/VideotexString.h | 15 + skeletons/VisibleString.c | 81 + skeletons/VisibleString.h | 17 + skeletons/asn_SEQUENCE_OF.c | 41 + skeletons/asn_SEQUENCE_OF.h | 36 + skeletons/asn_SET_OF.c | 89 + skeletons/asn_SET_OF.h | 46 + skeletons/asn_types.h | 63 + skeletons/ber_decoder.c | 230 + skeletons/ber_decoder.h | 77 + skeletons/ber_tlv_length.c | 159 + skeletons/ber_tlv_length.h | 40 + skeletons/ber_tlv_tag.c | 145 + skeletons/ber_tlv_tag.h | 52 + skeletons/constr_CHOICE.c | 627 ++ skeletons/constr_CHOICE.h | 65 + skeletons/constr_SEQUENCE.c | 588 ++ skeletons/constr_SEQUENCE.h | 53 + skeletons/constr_SEQUENCE_OF.c | 84 + skeletons/constr_SEQUENCE_OF.h | 21 + skeletons/constr_SET.c | 682 +++ skeletons/constr_SET.h | 90 + skeletons/constr_SET_OF.c | 530 ++ skeletons/constr_SET_OF.h | 38 + skeletons/constr_TYPE.c | 58 + skeletons/constr_TYPE.h | 98 + skeletons/constraints.c | 111 + skeletons/constraints.h | 57 + skeletons/der_encoder.c | 143 + skeletons/der_encoder.h | 73 + skeletons/tests/Makefile.am | 9 + skeletons/tests/Makefile.in | 411 ++ skeletons/tests/check-GeneralizedTime.c | 54 + skeletons/tests/check-INTEGER.c | 56 + skeletons/tests/check-OIDs.c | 228 + skeletons/tests/check-UTCTime.c | 54 + stamp-h.in | 1 + tests/00-empty-OK.asn1 | 1 + tests/01-empty-OK.asn1 | 14 + tests/02-garbage-NP.asn1 | 17 + tests/03-enum-OK.asn1 | 22 + tests/04-enum-SE.asn1 | 19 + tests/05-enum-SE.asn1 | 21 + tests/06-enum-SE.asn1 | 20 + tests/07-int-OK.asn1 | 26 + tests/08-int-SE.asn1 | 19 + tests/09-int-SE.asn1 | 20 + tests/10-int-OK.asn1 | 29 + tests/11-int-SE.asn1 | 18 + tests/12-int-SE.asn1 | 17 + tests/13-resolver-OK.asn1 | 47 + tests/14-resolver-OK.asn1 | 45 + tests/15-resolver-SE.asn1 | 35 + tests/16-constraint-OK.asn1 | 23 + tests/17-tags-OK.asn1 | 24 + tests/18-class-OK.asn1 | 36 + tests/19-param-OK.asn1 | 30 + tests/20-constr-OK.asn1 | 30 + tests/21-tags-OK.asn1 | 34 + tests/22-tags-OK.asn1 | 23 + tests/23-bits-OK.asn1 | 22 + tests/24-sequence-OK.asn1 | 21 + tests/25-misc-OK.asn1 | 29 + tests/26-sequence-SE.asn1 | 20 + tests/27-set-SE.asn1 | 21 + tests/28-tags-SE.asn1 | 26 + tests/29-tags-OK.asn1 | 26 + tests/30-set-OK.asn1 | 21 + tests/31-set-of-OK.asn1 | 21 + tests/32-sequence-of-OK.asn1 | 22 + tests/33-misc-OK.asn1 | 33 + tests/34-class-OK.asn1 | 51 + tests/35-set-choice-OK.asn1 | 36 + tests/36-indirect-choice-SE.asn1 | 25 + tests/37-indirect-choice-OK.asn1 | 32 + tests/38-comments-OK.asn1 | 33 + tests/39-sequence-of-OK.asn1 | 24 + tests/39-sequence-of-OK.asn1.-P | 171 + tests/40-int-optional-SE.asn1 | 27 + tests/41-int-optional-OK.asn1 | 27 + tests/42-real-life-OK.asn1 | 67 + tests/42-real-life-OK.asn1.-PR | 569 ++ tests/43-recursion-OK.asn1 | 26 + tests/Makefile.am | 2 + tests/Makefile.in | 219 + tests/README | 24 + 277 files changed, 55557 insertions(+) create mode 100644 AUTHORS create mode 100644 BUGS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 INSTALL create mode 100644 MANIFEST create mode 100644 Makefile.am create mode 100644 Makefile.in create mode 100644 NEWS create mode 100644 README create mode 100644 TODO create mode 100644 aclocal.m4 create mode 100644 asn1c/Makefile.am create mode 100644 asn1c/Makefile.in create mode 100644 asn1c/README create mode 100644 asn1c/asn1c.1 create mode 100644 asn1c/asn1c.c create mode 100755 asn1c/check-parsing.sh create mode 100644 asn1c/tests/Makefile.am create mode 100644 asn1c/tests/Makefile.in create mode 100644 asn1c/tests/README create mode 100644 asn1c/tests/check-22.c create mode 100644 asn1c/tests/check-24.c create mode 100644 asn1c/tests/check-25.c create mode 100644 asn1c/tests/check-30.c create mode 100644 asn1c/tests/check-31.c create mode 100644 asn1c/tests/check-32.c create mode 100644 asn1c/tests/check-33.c create mode 100644 asn1c/tests/check-35.c create mode 100644 asn1c/tests/check-41.c create mode 100644 asn1c/tests/check-43.c create mode 100755 asn1c/tests/check-assembly.sh create mode 100755 config.guess create mode 100644 config.h.in create mode 100755 config.sub create mode 100755 configure create mode 100644 configure.in create mode 100755 depcomp create mode 100644 doc/Makefile.am create mode 100644 doc/Makefile.in create mode 100644 doc/asn1c-usage.pdf create mode 100644 examples/Makefile.am create mode 100644 examples/Makefile.in create mode 100644 examples/README create mode 100755 examples/clyx2asn1.pl create mode 100755 examples/crfc2asn1.pl create mode 100755 install-sh create mode 100644 libasn1compiler/Makefile.am create mode 100644 libasn1compiler/Makefile.in create mode 100644 libasn1compiler/asn1c_C.c create mode 100644 libasn1compiler/asn1c_C.h create mode 100644 libasn1compiler/asn1c_internal.h create mode 100644 libasn1compiler/asn1c_lang.c create mode 100644 libasn1compiler/asn1c_lang.h create mode 100644 libasn1compiler/asn1c_misc.c create mode 100644 libasn1compiler/asn1c_misc.h create mode 100644 libasn1compiler/asn1c_out.c create mode 100644 libasn1compiler/asn1c_out.h create mode 100644 libasn1compiler/asn1c_save.c create mode 100644 libasn1compiler/asn1c_save.h create mode 100644 libasn1compiler/asn1compiler.c create mode 100644 libasn1compiler/asn1compiler.h create mode 100644 libasn1compiler/check_compiler.c create mode 100644 libasn1fix/Makefile.am create mode 100644 libasn1fix/Makefile.in create mode 100644 libasn1fix/asn1fix.c create mode 100644 libasn1fix/asn1fix.h create mode 100644 libasn1fix/asn1fix_bitstring.c create mode 100644 libasn1fix/asn1fix_bitstring.h create mode 100644 libasn1fix/asn1fix_class.c create mode 100644 libasn1fix/asn1fix_class.h create mode 100644 libasn1fix/asn1fix_compat.c create mode 100644 libasn1fix/asn1fix_compat.h create mode 100644 libasn1fix/asn1fix_constr.c create mode 100644 libasn1fix/asn1fix_constr.h create mode 100644 libasn1fix/asn1fix_cstring.c create mode 100644 libasn1fix/asn1fix_cstring.h create mode 100644 libasn1fix/asn1fix_dereft.c create mode 100644 libasn1fix/asn1fix_dereft.h create mode 100644 libasn1fix/asn1fix_derefv.c create mode 100644 libasn1fix/asn1fix_derefv.h create mode 100644 libasn1fix/asn1fix_enum.c create mode 100644 libasn1fix/asn1fix_enum.h create mode 100644 libasn1fix/asn1fix_export.c create mode 100644 libasn1fix/asn1fix_export.h create mode 100644 libasn1fix/asn1fix_integer.c create mode 100644 libasn1fix/asn1fix_integer.h create mode 100644 libasn1fix/asn1fix_internal.h create mode 100644 libasn1fix/asn1fix_misc.c create mode 100644 libasn1fix/asn1fix_misc.h create mode 100644 libasn1fix/asn1fix_param.c create mode 100644 libasn1fix/asn1fix_param.h create mode 100644 libasn1fix/asn1fix_retrieve.c create mode 100644 libasn1fix/asn1fix_retrieve.h create mode 100644 libasn1fix/asn1fix_tags.c create mode 100644 libasn1fix/asn1fix_tags.h create mode 100644 libasn1fix/asn1fix_value.c create mode 100644 libasn1fix/asn1fix_value.h create mode 100644 libasn1fix/check_fixer.c create mode 100644 libasn1parser/Makefile.am create mode 100644 libasn1parser/Makefile.in create mode 100644 libasn1parser/asn1p_class.c create mode 100644 libasn1parser/asn1p_class.h create mode 100644 libasn1parser/asn1p_constr.c create mode 100644 libasn1parser/asn1p_constr.h create mode 100644 libasn1parser/asn1p_expr.c create mode 100644 libasn1parser/asn1p_expr.h create mode 100644 libasn1parser/asn1p_expr2uclass.h create mode 100644 libasn1parser/asn1p_expr_str.h create mode 100644 libasn1parser/asn1p_l.c create mode 100644 libasn1parser/asn1p_l.l create mode 100644 libasn1parser/asn1p_list.h create mode 100644 libasn1parser/asn1p_module.c create mode 100644 libasn1parser/asn1p_module.h create mode 100644 libasn1parser/asn1p_oid.c create mode 100644 libasn1parser/asn1p_oid.h create mode 100644 libasn1parser/asn1p_param.c create mode 100644 libasn1parser/asn1p_param.h create mode 100644 libasn1parser/asn1p_ref.c create mode 100644 libasn1parser/asn1p_ref.h create mode 100644 libasn1parser/asn1p_value.c create mode 100644 libasn1parser/asn1p_value.h create mode 100644 libasn1parser/asn1p_xports.c create mode 100644 libasn1parser/asn1p_xports.h create mode 100644 libasn1parser/asn1p_y.c create mode 100644 libasn1parser/asn1p_y.h create mode 100644 libasn1parser/asn1p_y.y create mode 100644 libasn1parser/asn1parser.c create mode 100644 libasn1parser/asn1parser.h create mode 100755 libasn1parser/expr-h.pl create mode 100644 libasn1print/Makefile.am create mode 100644 libasn1print/Makefile.in create mode 100644 libasn1print/README create mode 100644 libasn1print/asn1print.c create mode 100644 libasn1print/asn1print.h create mode 100755 ltconfig create mode 100644 ltmain.sh create mode 100755 missing create mode 100755 mkinstalldirs create mode 100644 skeletons/BIT_STRING.c create mode 100644 skeletons/BIT_STRING.h create mode 100644 skeletons/BMPString.c create mode 100644 skeletons/BMPString.h create mode 100644 skeletons/BOOLEAN.c create mode 100644 skeletons/BOOLEAN.h create mode 100644 skeletons/ENUMERATED.c create mode 100644 skeletons/ENUMERATED.h create mode 100644 skeletons/GeneralString.c create mode 100644 skeletons/GeneralString.h create mode 100644 skeletons/GeneralizedTime.c create mode 100644 skeletons/GeneralizedTime.h create mode 100644 skeletons/GraphicString.c create mode 100644 skeletons/GraphicString.h create mode 100644 skeletons/IA5String.c create mode 100644 skeletons/IA5String.h create mode 100644 skeletons/INTEGER.c create mode 100644 skeletons/INTEGER.h create mode 100644 skeletons/ISO646String.c create mode 100644 skeletons/ISO646String.h create mode 100644 skeletons/Makefile.am create mode 100644 skeletons/Makefile.in create mode 100644 skeletons/NULL.c create mode 100644 skeletons/NULL.h create mode 100644 skeletons/NativeEnumerated.c create mode 100644 skeletons/NativeEnumerated.h create mode 100644 skeletons/NativeInteger.c create mode 100644 skeletons/NativeInteger.h create mode 100644 skeletons/NumericString.c create mode 100644 skeletons/NumericString.h create mode 100644 skeletons/OBJECT_IDENTIFIER.c create mode 100644 skeletons/OBJECT_IDENTIFIER.h create mode 100644 skeletons/OCTET_STRING.c create mode 100644 skeletons/OCTET_STRING.h create mode 100644 skeletons/ObjectDescriptor.c create mode 100644 skeletons/ObjectDescriptor.h create mode 100644 skeletons/PrintableString.c create mode 100644 skeletons/PrintableString.h create mode 100644 skeletons/README create mode 100644 skeletons/RELATIVE-OID.c create mode 100644 skeletons/RELATIVE-OID.h create mode 100644 skeletons/T61String.c create mode 100644 skeletons/T61String.h create mode 100644 skeletons/TeletexString.c create mode 100644 skeletons/TeletexString.h create mode 100644 skeletons/UTCTime.c create mode 100644 skeletons/UTCTime.h create mode 100644 skeletons/UTF8String.c create mode 100644 skeletons/UTF8String.h create mode 100644 skeletons/UniversalString.c create mode 100644 skeletons/UniversalString.h create mode 100644 skeletons/VideotexString.c create mode 100644 skeletons/VideotexString.h create mode 100644 skeletons/VisibleString.c create mode 100644 skeletons/VisibleString.h create mode 100644 skeletons/asn_SEQUENCE_OF.c create mode 100644 skeletons/asn_SEQUENCE_OF.h create mode 100644 skeletons/asn_SET_OF.c create mode 100644 skeletons/asn_SET_OF.h create mode 100644 skeletons/asn_types.h create mode 100644 skeletons/ber_decoder.c create mode 100644 skeletons/ber_decoder.h create mode 100644 skeletons/ber_tlv_length.c create mode 100644 skeletons/ber_tlv_length.h create mode 100644 skeletons/ber_tlv_tag.c create mode 100644 skeletons/ber_tlv_tag.h create mode 100644 skeletons/constr_CHOICE.c create mode 100644 skeletons/constr_CHOICE.h create mode 100644 skeletons/constr_SEQUENCE.c create mode 100644 skeletons/constr_SEQUENCE.h create mode 100644 skeletons/constr_SEQUENCE_OF.c create mode 100644 skeletons/constr_SEQUENCE_OF.h create mode 100644 skeletons/constr_SET.c create mode 100644 skeletons/constr_SET.h create mode 100644 skeletons/constr_SET_OF.c create mode 100644 skeletons/constr_SET_OF.h create mode 100644 skeletons/constr_TYPE.c create mode 100644 skeletons/constr_TYPE.h create mode 100644 skeletons/constraints.c create mode 100644 skeletons/constraints.h create mode 100644 skeletons/der_encoder.c create mode 100644 skeletons/der_encoder.h create mode 100644 skeletons/tests/Makefile.am create mode 100644 skeletons/tests/Makefile.in create mode 100644 skeletons/tests/check-GeneralizedTime.c create mode 100644 skeletons/tests/check-INTEGER.c create mode 100644 skeletons/tests/check-OIDs.c create mode 100644 skeletons/tests/check-UTCTime.c create mode 100644 stamp-h.in create mode 100644 tests/00-empty-OK.asn1 create mode 100644 tests/01-empty-OK.asn1 create mode 100644 tests/02-garbage-NP.asn1 create mode 100644 tests/03-enum-OK.asn1 create mode 100644 tests/04-enum-SE.asn1 create mode 100644 tests/05-enum-SE.asn1 create mode 100644 tests/06-enum-SE.asn1 create mode 100644 tests/07-int-OK.asn1 create mode 100644 tests/08-int-SE.asn1 create mode 100644 tests/09-int-SE.asn1 create mode 100644 tests/10-int-OK.asn1 create mode 100644 tests/11-int-SE.asn1 create mode 100644 tests/12-int-SE.asn1 create mode 100644 tests/13-resolver-OK.asn1 create mode 100644 tests/14-resolver-OK.asn1 create mode 100644 tests/15-resolver-SE.asn1 create mode 100644 tests/16-constraint-OK.asn1 create mode 100644 tests/17-tags-OK.asn1 create mode 100644 tests/18-class-OK.asn1 create mode 100644 tests/19-param-OK.asn1 create mode 100644 tests/20-constr-OK.asn1 create mode 100644 tests/21-tags-OK.asn1 create mode 100644 tests/22-tags-OK.asn1 create mode 100644 tests/23-bits-OK.asn1 create mode 100644 tests/24-sequence-OK.asn1 create mode 100644 tests/25-misc-OK.asn1 create mode 100644 tests/26-sequence-SE.asn1 create mode 100644 tests/27-set-SE.asn1 create mode 100644 tests/28-tags-SE.asn1 create mode 100644 tests/29-tags-OK.asn1 create mode 100644 tests/30-set-OK.asn1 create mode 100644 tests/31-set-of-OK.asn1 create mode 100644 tests/32-sequence-of-OK.asn1 create mode 100644 tests/33-misc-OK.asn1 create mode 100644 tests/34-class-OK.asn1 create mode 100644 tests/35-set-choice-OK.asn1 create mode 100644 tests/36-indirect-choice-SE.asn1 create mode 100644 tests/37-indirect-choice-OK.asn1 create mode 100644 tests/38-comments-OK.asn1 create mode 100644 tests/39-sequence-of-OK.asn1 create mode 100644 tests/39-sequence-of-OK.asn1.-P create mode 100644 tests/40-int-optional-SE.asn1 create mode 100644 tests/41-int-optional-OK.asn1 create mode 100644 tests/42-real-life-OK.asn1 create mode 100644 tests/42-real-life-OK.asn1.-PR create mode 100644 tests/43-recursion-OK.asn1 create mode 100644 tests/Makefile.am create mode 100644 tests/Makefile.in create mode 100644 tests/README diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 000000000..d510bcdee --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +Lev Walkin diff --git a/BUGS b/BUGS new file mode 100644 index 000000000..3e8145c01 --- /dev/null +++ b/BUGS @@ -0,0 +1,31 @@ + +0. ASN.1 grammar parser is written mostly with respect to constructing a tree, +so a tree destruction is not fully supported and certain memory leaks are +known. Not a huge problem for run-once programs like a compiler. +NOTE: This statement does not apply to the target code _produced_ + by the compiler. + +1. REAL type is not supported yet. + +2. For purposes of compilation, INTEGER type is modelled using a large +static type (asn_integer_t), but defined as any positive or negative value +by ASN.1. Not a problem as most specifications use very small values anyway. +NOTE: This statement does not apply to the target code _produced_ + by the compiler. + +3. ASN Macros are prohibited by the current ASN.1 standard, +and are not supported. + +4. Multiple tags applied at the same level are not supported: + BadTags ::= [0] EXPLICIT [2] IMPLICIT OtherType + The same thing could be achieved by using the indirection: + GoodTags ::= [0] EXPLICIT OtherTypePtr + OtherTypePtr ::= [2] IMPLICIT OtherType + +5. Mixed definite/indefinite length in a _single_ BER tags sequence is not +supported. Should not be a problem in the real world. Please note that it +is still possible, for example, to encode a wrapper structure using definite +length, and encode its substructure member using indefinite length. The BER +decoder is perfectly capable of decoding such sequences. + + diff --git a/COPYING b/COPYING new file mode 100644 index 000000000..5addee944 --- /dev/null +++ b/COPYING @@ -0,0 +1,27 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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 AUTHOR 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 AUTHOR 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. + * + * $Id$ + */ diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 000000000..45a11c82a --- /dev/null +++ b/ChangeLog @@ -0,0 +1,130 @@ + +0.8.10: 2004-Jun-02 + + * Added const qualifier where necessary. + * Changed position of outmost_tag fetcher within asn1_TYPE_descriptor_t + structure. + +0.8.9: 2004-May-26 + + * Added *_{get|set}_arcs_*() functions for OBJECT IDENTIFIER + and RELATIVE-OID, together with test cases. + +0.8.8: 2004-May-09 + + * Introduced subtype constraints support (incomplete!). + * Fixed compiler. If the last member of the SEQUENCE is OPTIONAL + and absent in the encoding, and the type is extensible (...) or + EXTENSIBILITY IMPLIED flag is set, then the structure could not + be correctly decoded. (Severity: high, Security impact: low). + * Compiler: fixed recursive ASN.1 types inclusion (Severity: low, + Security impact: none). + * Parser: IMPORTS/FROM fixes, now allowing multiple sections. + * Code compiled and checked on PowerPC (@MacOS X). No major portability + issues experienced. + +0.8.7: 2004-Apr-11 T-version-0-8-7 + + * Fixed SEQUENCE BER decoder: if the last member of the SEQUENCE is + OPTIONAL and absent in the encoding, RC_FAIL was returned instead + of RC_OK (Severity: high, Security impact: low). + * Added test case to check the above problem. + * Added test case to check -fnative-integers mode. + +0.8.6: 2004-Apr-03 T-version-0-8-6 + + * Fixed compiler output for embedded ASN.1 structures. + +0.8.5: 2004-Mar-28 T-version-0-8-5 + + * Fixed ber_tlv_length() computation problem (Severity: blocker, + Security impact: none). + Reported by + +0.8.4: 2004-Mar-22 + + * Removed RC_ITAG enumeration element from BER decoder. + This return code did not have much practical value. + +0.8.3: 2004-Mar-14 T-version-0-8-3 + + * Fixed SET::BER decoder: restart after reaching a buffer boundary + weas broken (Severity: blocker, Security impact: low). + * Fixed OCTET STRING::BER decoder: restart after reaching a buffer + boundary was broken (Severity: blocker, Security impact: low). + Reported by + * Added test cases to check decoders restartability. + * Slightly more general INTEGER2long decoder. + * Allowed nested /* C-type */ comments, as per X.680:2002. + +0.8.2: 2004-Mar-01 T-version-0-8-2 + + * Fixed SEQUENCE BER decoder: an OPTIONAL element was required, where + should not have been (Severity: major; Security impact: low). + * Fixed print_struct pointer inheritance. + * Added -fno-c99 and -funnamed-unions + +0.8.1: 2004-Feb-22 + + * -R switch to asn1c: Omit support code, compile only the tables. + * Introduced NativeInteger pseudotype. + * Corrected the informal print_struct()'s output format. + +0.8.0: 2004-Feb-03 T-version-0-8-0 + + * Some documentation is created (a .pdf and a short manual page). + * Last touches to the code. + +0.7.9: 2004-Feb-01 T-version-0-7-9 + + * Human readable printing support. + * Support for implicit (standard) constraints. + +0.7.8: 2004-Jan-31 + + * SET now rejects duplicate fields in the data stream. + +0.7.7: 2004-Jan-25 + + * Added types: GeneralizedTime and UTCTime. + +0.7.6: 2004-Jan-24 T-version-0-7-6 + + * DER encoding of a SET OF now involves dynamic sorting. + +0.7.5: 2004-Jan-24 T-version-0-7-5 + + * DER encoding of a SET with untagged CHOICE + now involves dynamic sorting. + +0.7.0: 2004-Jan-19 T-version-0-7-0 + + * A bunch of DER encoders is implemented. + +0.6.6: 2004-Jan-11 + + * Implemented CHOICE decoder. + * Implemented destructors support. + +0.6.5: 2004-Jan-03 + + * Implemented SET decoder. + * Implemented SET OF and SEQUENCE OF decoders. + +0.6.4: 2003-Dec-31 + + * Implemented BOOLEAN, NULL, ENUMERATED decoders. + * Implemented OCTET STRING decoder. + * Implemented BIT STRING decoder. + +0.6: 2003-Dec-30 + + * First decoding of a BER-encoded structure! + +0.5: 2003-Dec-28 + + * Framework and most of the compiler backbone coding done. + +0.1: 2003-Nov-28 + + * Programming started. diff --git a/INSTALL b/INSTALL new file mode 100644 index 000000000..5d2d54c5f --- /dev/null +++ b/INSTALL @@ -0,0 +1,14 @@ +QUICK START INSTALLATION +======================== + +./configure # Configure the build infrastructure for your platform +make # Build the libraries and the compiler +make check # Ensure that the code is still behaving well + # after compiling on your platform +make install # Install the compiler into standard location + + +QUICK USAGE GUIDE +================= + +For usage guide and more information please refer to README file. diff --git a/MANIFEST b/MANIFEST new file mode 100644 index 000000000..1be9e9f6b --- /dev/null +++ b/MANIFEST @@ -0,0 +1,9 @@ +libasn1compiler +libasn1parser +libasn1print +libasn1fix +skeletons +examples +tests +asn1c +doc diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 000000000..da7f6821c --- /dev/null +++ b/Makefile.am @@ -0,0 +1,8 @@ + +SUBDIRS = \ + libasn1parser libasn1print \ + libasn1fix libasn1compiler \ + skeletons examples tests \ + doc asn1c + +EXTRA_DIST = BUGS MANIFEST diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 000000000..1ce7ad4c0 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,430 @@ +# Makefile.in generated automatically by automake 1.5 from Makefile.am. + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = . + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_alias = @build_alias@ +build_triplet = @build@ +host_alias = @host_alias@ +host_triplet = @host@ +target_alias = @target_alias@ +target_triplet = @target@ +ADD_CFLAGS = @ADD_CFLAGS@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +AWK = @AWK@ +CC = @CC@ +CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPP = @CPP@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +EXEEXT = @EXEEXT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LEX = @LEX@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +MAINT = @MAINT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PATH = @PATH@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ +YACC = @YACC@ +am__include = @am__include@ +am__quote = @am__quote@ +install_sh = @install_sh@ + +SUBDIRS = \ + libasn1parser libasn1print \ + libasn1fix libasn1compiler \ + skeletons examples tests \ + doc asn1c + + +EXTRA_DIST = BUGS MANIFEST +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = +DIST_SOURCES = + +RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \ + uninstall-info-recursive all-recursive install-data-recursive \ + install-exec-recursive installdirs-recursive install-recursive \ + uninstall-recursive check-recursive installcheck-recursive +DIST_COMMON = README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \ + Makefile.am Makefile.in NEWS TODO aclocal.m4 config.guess \ + config.h.in config.sub configure configure.in depcomp \ + install-sh ltconfig ltmain.sh missing mkinstalldirs +DIST_SUBDIRS = $(SUBDIRS) +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && \ + CONFIG_HEADERS= CONFIG_LINKS= \ + CONFIG_FILES=$@ $(SHELL) ./config.status + +$(top_builddir)/config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck +$(srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) + cd $(srcdir) && $(AUTOCONF) + +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.in + cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +config.h: stamp-h + @if test ! -f $@; then \ + rm -f stamp-h; \ + $(MAKE) stamp-h; \ + else :; fi +stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h stamp-hT + @echo timestamp > stamp-hT 2> /dev/null + cd $(top_builddir) \ + && CONFIG_FILES= CONFIG_HEADERS=config.h \ + $(SHELL) ./config.status + @mv stamp-hT stamp-h +$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/./stamp-h.in + @if test ! -f $@; then \ + rm -f $(srcdir)/./stamp-h.in; \ + $(MAKE) $(srcdir)/./stamp-h.in; \ + else :; fi +$(srcdir)/./stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) + @rm -f $(srcdir)/./stamp-h.in $(srcdir)/./stamp-h.inT + @echo timestamp > $(srcdir)/./stamp-h.inT 2> /dev/null + cd $(top_srcdir) && $(AUTOHEADER) + @mv $(srcdir)/./stamp-h.inT $(srcdir)/./stamp-h.in + +distclean-hdr: + -rm -f config.h +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique $(LISP) + +TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \ + || etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) + +GTAGS: + here=`CDPATH=: && cd $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = . +# Avoid unsightly `./'. +distdir = $(PACKAGE)-$(VERSION) + +GZIP_ENV = --best + +distdir: $(DISTFILES) + -chmod -R a+w $(distdir) >/dev/null 2>&1; rm -rf $(distdir) + mkdir $(distdir) + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + $(mkinstalldirs) "$(distdir)/$$dir"; \ + fi; \ + if test -d $$d/$$file; then \ + cp -pR $$d/$$file $(distdir) \ + || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + for subdir in $(SUBDIRS); do \ + if test "$$subdir" = .; then :; else \ + test -d $(distdir)/$$subdir \ + || mkdir $(distdir)/$$subdir \ + || exit 1; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" \ + distdir=../$(distdir)/$$subdir \ + distdir) \ + || exit 1; \ + fi; \ + done + -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r $(distdir) +dist: distdir + $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + -chmod -R a+w $(distdir) >/dev/null 2>&1; rm -rf $(distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + -chmod -R a+w $(distdir) > /dev/null 2>&1; rm -rf $(distdir) + GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf - + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/=build + mkdir $(distdir)/=inst + chmod a-w $(distdir) + dc_install_base=`CDPATH=: && cd $(distdir)/=inst && pwd` \ + && cd $(distdir)/=build \ + && ../configure --srcdir=.. --prefix=$$dc_install_base \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && (test `find $$dc_install_base -type f -print | wc -l` -le 1 \ + || (echo "Error: files left after uninstall" 1>&2; \ + exit 1) ) \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && $(MAKE) $(AM_MAKEFLAGS) distclean \ + && rm -f $(distdir).tar.gz \ + && (test `find . -type f -print | wc -l` -eq 0 \ + || (echo "Error: files left after distclean" 1>&2; \ + exit 1) ) + -chmod -R a+w $(distdir) > /dev/null 2>&1; rm -rf $(distdir) + @echo "$(distdir).tar.gz is ready for distribution" | \ + sed 'h;s/./=/g;p;x;p;x' +check-am: all-am +check: check-recursive +all-am: Makefile config.h +installdirs: installdirs-recursive +installdirs-am: + +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +dist-all: distdir + $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + -chmod -R a+w $(distdir) >/dev/null 2>&1; rm -rf $(distdir) +distclean: distclean-recursive + -rm -f config.status config.cache config.log +distclean-am: clean-am distclean-generic distclean-hdr distclean-libtool \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \ + clean-generic clean-libtool clean-recursive dist dist-all \ + distcheck distclean distclean-generic distclean-hdr \ + distclean-libtool distclean-recursive distclean-tags distdir \ + dvi dvi-am dvi-recursive info info-am info-recursive install \ + install-am install-data install-data-am install-data-recursive \ + install-exec install-exec-am install-exec-recursive \ + install-info install-info-am install-info-recursive install-man \ + install-recursive install-strip installcheck installcheck-am \ + installdirs installdirs-am installdirs-recursive \ + maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-generic \ + mostlyclean-libtool mostlyclean-recursive tags tags-recursive \ + uninstall uninstall-am uninstall-info-am \ + uninstall-info-recursive uninstall-recursive + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/NEWS b/NEWS new file mode 100644 index 000000000..e69de29bb diff --git a/README b/README new file mode 100644 index 000000000..586bb3d38 --- /dev/null +++ b/README @@ -0,0 +1,69 @@ +WHAT TO READ? +============= + +For quick installation tips read INSTALL. + +For more complete documentation on this compiler and on using the +results of compilation please look into ./doc directory. + +An excellent book on ASN.1 is written by Olivier Dubuisson: +"ASN.1 Communication between heterogeneous systems", ISBN:0-12-6333361-0. + + +QUICK START +=========== + +After building [and installing] the compiler (see INSTALL), you may use +the asn1c command to compile the ASN.1 specification: + + asn1c + +If several specifications contain interdependencies, all of them must be +specified: + + asn1c ... + +The ./examples directory contains several ASN.1 modules and a script to +extract ASN.1 modules from RFC documents. To compile X.509 PKI module: + + ./asn1c/asn1c -P ./examples/*PKIX*93*.asn1 + +In this example, -P option is used to instruct the compiler to print the +compiled text on the standard output instead of creating multiple .c +and .h files for every ASN.1 type found inside the specified files. +This is useful for debugging and tests automation. + +The compiler -E and -EF options are used for testing the parser and +the semantic fixer, respectively. These options will instruct the compiler +to dump out the parsed (and fixed) ASN.1 specification as it was +"understood" by the compiler. It might be useful for checking +whether a particular syntactic construction is properly supported +by the compiler. + + asn1c -EF + + +MODEL OF OPERATION +================== + +The asn1c compiler works by processing the ASN.1 module specification +in several stages: +1. In the first stage, the ASN.1 file is parsed. + (Parsing produces an ASN.1 syntax tree for the subsequent levels.) +2. In the second stage, the syntax tree is "fixed". + (Fixing is done by checking the tree for semantic errors + and by transforming the tree into the canonical representation.) +3. In the third stage, the syntax tree is compiled into the target language. + +There are several command-line options reserved for printing the results +after each stage of operation: + + => print (-E) + => => print (-E -F) + => => => print (-P) + => => => save-compiled [default] + + +-- +Lev Walkin +vlm@lionet.info diff --git a/TODO b/TODO new file mode 100644 index 000000000..1316b857a --- /dev/null +++ b/TODO @@ -0,0 +1,18 @@ +MAJOR: + +1. Support for the explicit subtype constraints: + Name ::= IA5String (FROM("A".."Z")) + Status: in progress. + +2. Support for Information Object Classes. + Status: support for parsing IOCs is mostly present. Support for slicing + the IOCs to produce "views" is not yet designed. + +3. Support for PER encoding. Requires advanced subtype constraints support (#1) + +4. Support for XER encoding. + +MISC: + +1. Make sure asn1_DEF__tags is not an empty structure. + diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 000000000..f71fa03eb --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,998 @@ +# aclocal.m4 generated automatically by aclocal 1.5 + +# Copyright 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +# Do all the work for Automake. This macro actually does too much -- +# some checks are only needed if your package does certain things. +# But this isn't really a big deal. + +# serial 5 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# We require 2.13 because we rely on SHELL being computed by configure. +AC_PREREQ([2.13]) + +# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ----------------------------------------------------------- +# If MACRO-NAME is provided do IF-PROVIDED, else IF-NOT-PROVIDED. +# The purpose of this macro is to provide the user with a means to +# check macros which are provided without letting her know how the +# information is coded. +# If this macro is not defined by Autoconf, define it here. +ifdef([AC_PROVIDE_IFELSE], + [], + [define([AC_PROVIDE_IFELSE], + [ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) + + +# AM_INIT_AUTOMAKE(PACKAGE,VERSION, [NO-DEFINE]) +# ---------------------------------------------- +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_REQUIRE([AC_PROG_INSTALL])dnl +# test to see if srcdir already configured +if test "`CDPATH=:; cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run \"make distclean\" there first]) +fi + +# Define the identity of the package. +PACKAGE=$1 +AC_SUBST(PACKAGE)dnl +VERSION=$2 +AC_SUBST(VERSION)dnl +ifelse([$3],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) +AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])]) + +# Autoconf 2.50 wants to disallow AM_ names. We explicitly allow +# the ones we care about. +ifdef([m4_pattern_allow], + [m4_pattern_allow([^AM_[A-Z]+FLAGS])])dnl + +# Autoconf 2.50 always computes EXEEXT. However we need to be +# compatible with 2.13, for now. So we always define EXEEXT, but we +# don't compute it. +AC_SUBST(EXEEXT) +# Similar for OBJEXT -- only we only use OBJEXT if the user actually +# requests that it be used. This is a bit dumb. +: ${OBJEXT=o} +AC_SUBST(OBJEXT) + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_MISSING_PROG(AMTAR, tar) +AM_PROG_INSTALL_SH +AM_PROG_INSTALL_STRIP +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl +AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_PROVIDE_IFELSE([AC_PROG_][CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_][CC], + defn([AC_PROG_][CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_][CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_][CXX], + defn([AC_PROG_][CXX])[_AM_DEPENDENCIES(CXX)])])dnl +]) + +# +# Check to make sure that the build environment is sane. +# + +# serial 3 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + + +# serial 2 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + am_backtick='`' + AC_MSG_WARN([${am_backtick}missing' script is too old or missing]) +fi +]) + +# AM_AUX_DIR_EXPAND + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], [ +# expand $ac_aux_dir to an absolute path +am_aux_dir=`CDPATH=:; cd $ac_aux_dir && pwd` +]) + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +install_sh=${install_sh-"$am_aux_dir/install-sh"} +AC_SUBST(install_sh)]) + +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# serial 4 -*- Autoconf -*- + + + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + + +# _AM_DEPENDENCIES(NAME) +# --------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX" or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'] + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + for depmode in $am_compiler_list; do + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + echo '#include "conftest.h"' > conftest.c + echo 'int i;' > conftest.h + echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=conftest.c object=conftest.o \ + depfile=conftest.Po tmpdepfile=conftest.TPo \ + $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 && + grep conftest.h conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +$1DEPMODE="depmode=$am_cv_$1_dependencies_compiler_type" +AC_SUBST([$1DEPMODE]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[rm -f .deps 2>/dev/null +mkdir .deps 2>/dev/null +if test -d .deps; then + DEPDIR=.deps +else + # MS-DOS does not allow filenames that begin with a dot. + DEPDIR=_deps +fi +rmdir .deps 2>/dev/null +AC_SUBST(DEPDIR) +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking Speeds up one-time builds + --enable-dependency-tracking Do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +pushdef([subst], defn([AC_SUBST])) +subst(AMDEPBACKSLASH) +popdef([subst]) +]) + +# Generate code to set up dependency tracking. +# This macro should only be invoked once -- use via AC_REQUIRE. +# Usage: +# AM_OUTPUT_DEPENDENCY_COMMANDS + +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],[ +AC_OUTPUT_COMMANDS([ +test x"$AMDEP_TRUE" != x"" || +for mf in $CONFIG_FILES; do + case "$mf" in + Makefile) dirpart=.;; + */Makefile) dirpart=`echo "$mf" | sed -e 's|/[^/]*$||'`;; + *) continue;; + esac + grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue + # Extract the definition of DEP_FILES from the Makefile without + # running `make'. + DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` + test -z "$DEPDIR" && continue + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n -e '/^U = / s///p' < "$mf"` + test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" + # We invoke sed twice because it is the simplest approach to + # changing $(DEPDIR) to its actual value in the expansion. + for file in `sed -n -e ' + /^DEP_FILES = .*\\\\$/ { + s/^DEP_FILES = // + :loop + s/\\\\$// + p + n + /\\\\$/ b loop + p + } + /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`echo "$file" | sed -e 's|/[^/]*$||'` + $ac_aux_dir/mkinstalldirs "$dirpart/$fdir" > /dev/null 2>&1 + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done +], [AMDEP_TRUE="$AMDEP_TRUE" +ac_aux_dir="$ac_aux_dir"])]) + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +doit: + @echo done +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include='#' +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | fgrep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote='"' + _am_result=BSD + fi +fi +AC_SUBST(am__include) +AC_SUBST(am__quote) +AC_MSG_RESULT($_am_result) +rm -f confinc confmf +]) + +# serial 3 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +# +# FIXME: Once using 2.50, use this: +# m4_match([$1], [^TRUE\|FALSE$], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_DEFUN([AM_CONDITIONAL], +[ifelse([$1], [TRUE], + [errprint(__file__:__line__: [$0: invalid condition: $1 +])dnl +m4exit(1)])dnl +ifelse([$1], [FALSE], + [errprint(__file__:__line__: [$0: invalid condition: $1 +])dnl +m4exit(1)])dnl +AC_SUBST([$1_TRUE]) +AC_SUBST([$1_FALSE]) +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi]) + +# Add --enable-maintainer-mode option to configure. +# From Jim Meyering + +# serial 1 + +AC_DEFUN([AM_MAINTAINER_MODE], +[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode is disabled by default + AC_ARG_ENABLE(maintainer-mode, +[ --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer], + USE_MAINTAINER_MODE=$enableval, + USE_MAINTAINER_MODE=no) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST(MAINT)dnl +] +) + + +# serial 40 AC_PROG_LIBTOOL +AC_DEFUN(AC_PROG_LIBTOOL, +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl + +# Save cache, so that ltconfig can load it +AC_CACHE_SAVE + +# Actually configure libtool. ac_aux_dir is where install-sh is found. +CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \ +LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \ +LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \ +DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \ +${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \ +$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \ +|| AC_MSG_ERROR([libtool configure failed]) + +# Reload cache, that may have been modified by ltconfig +AC_CACHE_LOAD + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +# Redirect the config.log output again, so that the ltconfig log is not +# clobbered by the next message. +exec 5>>./config.log +]) + +AC_DEFUN(AC_LIBTOOL_SETUP, +[AC_PREREQ(2.13)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_RANLIB])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_NM])dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +dnl + +case "$target" in +NONE) lt_target="$host" ;; +*) lt_target="$target" ;; +esac + +# Check for any special flags to pass to ltconfig. +libtool_flags="--cache-file=$cache_file" +test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared" +test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static" +test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install" +test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc" +test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld" +ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], +[libtool_flags="$libtool_flags --enable-dlopen"]) +ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +[libtool_flags="$libtool_flags --enable-win32-dll"]) +AC_ARG_ENABLE(libtool-lock, + [ --disable-libtool-lock avoid locking (might break parallel builds)]) +test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock" +test x"$silent" = xyes && libtool_flags="$libtool_flags --silent" + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case "$lt_target" in +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; + +ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +]) +esac +]) + +# AC_LIBTOOL_DLOPEN - enable checks for dlopen support +AC_DEFUN(AC_LIBTOOL_DLOPEN, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])]) + +# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's +AC_DEFUN(AC_LIBTOOL_WIN32_DLL, [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])]) + +# AC_ENABLE_SHARED - implement the --enable-shared flag +# Usage: AC_ENABLE_SHARED[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. +AC_DEFUN(AC_ENABLE_SHARED, [dnl +define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(shared, +changequote(<<, >>)dnl +<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case "$enableval" in +yes) enable_shared=yes ;; +no) enable_shared=no ;; +*) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl +]) + +# AC_DISABLE_SHARED - set the default shared flag to --disable-shared +AC_DEFUN(AC_DISABLE_SHARED, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no)]) + +# AC_ENABLE_STATIC - implement the --enable-static flag +# Usage: AC_ENABLE_STATIC[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. +AC_DEFUN(AC_ENABLE_STATIC, [dnl +define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(static, +changequote(<<, >>)dnl +<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case "$enableval" in +yes) enable_static=yes ;; +no) enable_static=no ;; +*) + enable_static=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_static=AC_ENABLE_STATIC_DEFAULT)dnl +]) + +# AC_DISABLE_STATIC - set the default static flag to --disable-static +AC_DEFUN(AC_DISABLE_STATIC, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no)]) + + +# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag +# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. +AC_DEFUN(AC_ENABLE_FAST_INSTALL, [dnl +define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(fast-install, +changequote(<<, >>)dnl +<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case "$enableval" in +yes) enable_fast_install=yes ;; +no) enable_fast_install=no ;; +*) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl +]) + +# AC_ENABLE_FAST_INSTALL - set the default to --disable-fast-install +AC_DEFUN(AC_DISABLE_FAST_INSTALL, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no)]) + +# AC_PROG_LD - find the path to the GNU or non-GNU linker +AC_DEFUN(AC_PROG_LD, +[AC_ARG_WITH(gnu-ld, +[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], +test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$ac_cv_prog_gcc" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + ac_prog=`($CC -print-prog-name=ld) 2>&5` + case "$ac_prog" in + # Accept absolute paths. +changequote(,)dnl + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' +changequote([,])dnl + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(ac_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + ac_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + ac_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$ac_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_PROG_LD_GNU +]) + +AC_DEFUN(AC_PROG_LD_GNU, +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + ac_cv_prog_gnu_ld=yes +else + ac_cv_prog_gnu_ld=no +fi]) +]) + +# AC_PROG_NM - find the path to a BSD-compatible name lister +AC_DEFUN(AC_PROG_NM, +[AC_MSG_CHECKING([for BSD-compatible nm]) +AC_CACHE_VAL(ac_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + ac_cv_path_NM="$NM" +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + ac_cv_path_NM="$ac_dir/nm -B" + break + elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + ac_cv_path_NM="$ac_dir/nm -p" + break + else + ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm +fi]) +NM="$ac_cv_path_NM" +AC_MSG_RESULT([$NM]) +]) + +# AC_CHECK_LIBM - check for math library +AC_DEFUN(AC_CHECK_LIBM, +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case "$lt_target" in +*-*-beos* | *-*-cygwin*) + # These system don't have libm + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, main, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, main, LIBM="-lm") + ;; +esac +]) + +# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for +# the libltdl convenience library, adds --enable-ltdl-convenience to +# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor +# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed +# to be `${top_builddir}/libltdl'. Make sure you start DIR with +# '${top_builddir}/' (note the single quotes!) if your package is not +# flat, and, if you're not using automake, define top_builddir as +# appropriate in the Makefiles. +AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case "$enable_ltdl_convenience" in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdlc.la + INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl']) +]) + +# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for +# the libltdl installable library, and adds --enable-ltdl-install to +# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor +# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed +# to be `${top_builddir}/libltdl'. Make sure you start DIR with +# '${top_builddir}/' (note the single quotes!) if your package is not +# flat, and, if you're not using automake, define top_builddir as +# appropriate in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN(AC_LIBLTDL_INSTALLABLE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, main, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdl.la + INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + INCLTDL= + fi +]) + +dnl old names +AC_DEFUN(AM_PROG_LIBTOOL, [indir([AC_PROG_LIBTOOL])])dnl +AC_DEFUN(AM_ENABLE_SHARED, [indir([AC_ENABLE_SHARED], $@)])dnl +AC_DEFUN(AM_ENABLE_STATIC, [indir([AC_ENABLE_STATIC], $@)])dnl +AC_DEFUN(AM_DISABLE_SHARED, [indir([AC_DISABLE_SHARED], $@)])dnl +AC_DEFUN(AM_DISABLE_STATIC, [indir([AC_DISABLE_STATIC], $@)])dnl +AC_DEFUN(AM_PROG_LD, [indir([AC_PROG_LD])])dnl +AC_DEFUN(AM_PROG_NM, [indir([AC_PROG_NM])])dnl + +dnl This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL])dnl + +# Like AC_CONFIG_HEADER, but automatically create stamp file. + +# serial 3 + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. We must strip everything past the first ":", +# and everything past the last "/". + +AC_PREREQ([2.12]) + +AC_DEFUN([AM_CONFIG_HEADER], +[ifdef([AC_FOREACH],dnl + [dnl init our file count if it isn't already + m4_ifndef([_AM_Config_Header_Index], m4_define([_AM_Config_Header_Index], [0])) + dnl prepare to store our destination file list for use in config.status + AC_FOREACH([_AM_File], [$1], + [m4_pushdef([_AM_Dest], m4_patsubst(_AM_File, [:.*])) + m4_define([_AM_Config_Header_Index], m4_incr(_AM_Config_Header_Index)) + dnl and add it to the list of files AC keeps track of, along + dnl with our hook + AC_CONFIG_HEADERS(_AM_File, +dnl COMMANDS, [, INIT-CMDS] +[# update the timestamp +echo timestamp >"AS_ESCAPE(_AM_DIRNAME(]_AM_Dest[))/stamp-h]_AM_Config_Header_Index[" +][$2]m4_ifval([$3], [, [$3]]))dnl AC_CONFIG_HEADERS + m4_popdef([_AM_Dest])])],dnl +[AC_CONFIG_HEADER([$1]) + AC_OUTPUT_COMMANDS( + ifelse(patsubst([$1], [[^ ]], []), + [], + [test -z "$CONFIG_HEADERS" || echo timestamp >dnl + patsubst([$1], [^\([^:]*/\)?.*], [\1])stamp-h]),dnl +[am_indx=1 +for am_file in $1; do + case " \$CONFIG_HEADERS " in + *" \$am_file "*) + am_dir=\`echo \$am_file |sed 's%:.*%%;s%[^/]*\$%%'\` + if test -n "\$am_dir"; then + am_tmpdir=\`echo \$am_dir |sed 's%^\(/*\).*\$%\1%'\` + for am_subdir in \`echo \$am_dir |sed 's%/% %'\`; do + am_tmpdir=\$am_tmpdir\$am_subdir/ + if test ! -d \$am_tmpdir; then + mkdir \$am_tmpdir + fi + done + fi + echo timestamp > "\$am_dir"stamp-h\$am_indx + ;; + esac + am_indx=\`expr \$am_indx + 1\` +done]) +])]) # AM_CONFIG_HEADER + +# _AM_DIRNAME(PATH) +# ----------------- +# Like AS_DIRNAME, only do it during macro expansion +AC_DEFUN([_AM_DIRNAME], + [m4_if(m4_regexp([$1], [^.*[^/]//*[^/][^/]*/*$]), -1, + m4_if(m4_regexp([$1], [^//\([^/]\|$\)]), -1, + m4_if(m4_regexp([$1], [^/.*]), -1, + [.], + m4_patsubst([$1], [^\(/\).*], [\1])), + m4_patsubst([$1], [^\(//\)\([^/].*\|$\)], [\1])), + m4_patsubst([$1], [^\(.*[^/]\)//*[^/][^/]*/*$], [\1]))[]dnl +]) # _AM_DIRNAME + + +# AM_PROG_LEX +# Look for flex, lex or missing, then run AC_PROG_LEX and AC_DECL_YYTEXT +AC_DEFUN([AM_PROG_LEX], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +AC_CHECK_PROGS(LEX, flex lex, [${am_missing_run}flex]) +dnl AC_PROG_LEX +AC_DECL_YYTEXT]) + diff --git a/asn1c/Makefile.am b/asn1c/Makefile.am new file mode 100644 index 000000000..2363c1898 --- /dev/null +++ b/asn1c/Makefile.am @@ -0,0 +1,25 @@ + +SUBDIRS = . tests + +AM_CFLAGS = @ADD_CFLAGS@ +AM_CPPFLAGS = \ + -I${top_srcdir}/libasn1compiler \ + -I${top_srcdir}/libasn1parser \ + -I${top_srcdir}/libasn1print \ + -I${top_srcdir}/libasn1fix \ + -DDATADIR=\"${pkgdatadir}\" + +LDADD = \ + ${top_builddir}/libasn1parser/libasn1parser.la \ + ${top_builddir}/libasn1fix/libasn1fix.la \ + ${top_builddir}/libasn1print/libasn1print.la \ + ${top_builddir}/libasn1compiler/libasn1compiler.la + +bin_PROGRAMS = asn1c + +dist_man1_MANS = asn1c.1 + +check_SCRIPTS = check-parsing.sh +TESTS = check-parsing.sh +EXTRA_DIST = check-parsing.sh +CLEANFILES = .check-parsing.*.tmp diff --git a/asn1c/Makefile.in b/asn1c/Makefile.in new file mode 100644 index 000000000..6b7805bc0 --- /dev/null +++ b/asn1c/Makefile.in @@ -0,0 +1,556 @@ +# Makefile.in generated automatically by automake 1.5 from Makefile.am. + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_alias = @build_alias@ +build_triplet = @build@ +host_alias = @host_alias@ +host_triplet = @host@ +target_alias = @target_alias@ +target_triplet = @target@ +ADD_CFLAGS = @ADD_CFLAGS@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +AWK = @AWK@ +CC = @CC@ +CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPP = @CPP@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +EXEEXT = @EXEEXT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LEX = @LEX@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +MAINT = @MAINT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PATH = @PATH@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ +YACC = @YACC@ +am__include = @am__include@ +am__quote = @am__quote@ +install_sh = @install_sh@ + +SUBDIRS = . tests + +AM_CFLAGS = @ADD_CFLAGS@ +AM_CPPFLAGS = \ + -I${top_srcdir}/libasn1compiler \ + -I${top_srcdir}/libasn1parser \ + -I${top_srcdir}/libasn1print \ + -I${top_srcdir}/libasn1fix \ + -DDATADIR=\"${pkgdatadir}\" + + +LDADD = \ + ${top_builddir}/libasn1parser/libasn1parser.la \ + ${top_builddir}/libasn1fix/libasn1fix.la \ + ${top_builddir}/libasn1print/libasn1print.la \ + ${top_builddir}/libasn1compiler/libasn1compiler.la + + +bin_PROGRAMS = asn1c + +dist_man1_MANS = asn1c.1 + +check_SCRIPTS = check-parsing.sh +TESTS = check-parsing.sh +EXTRA_DIST = check-parsing.sh +CLEANFILES = .check-parsing.*.tmp +subdir = asn1c +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +bin_PROGRAMS = asn1c$(EXEEXT) +PROGRAMS = $(bin_PROGRAMS) + +asn1c_SOURCES = asn1c.c +asn1c_OBJECTS = asn1c.$(OBJEXT) +asn1c_LDADD = $(LDADD) +asn1c_DEPENDENCIES = ${top_builddir}/libasn1parser/libasn1parser.la \ + ${top_builddir}/libasn1fix/libasn1fix.la \ + ${top_builddir}/libasn1print/libasn1print.la \ + ${top_builddir}/libasn1compiler/libasn1compiler.la +asn1c_LDFLAGS = + +DEFS = @DEFS@ +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/asn1c.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ + $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +CFLAGS = @CFLAGS@ +DIST_SOURCES = asn1c.c + +NROFF = nroff +MANS = $(dist_man1_MANS) + +RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \ + uninstall-info-recursive all-recursive install-data-recursive \ + install-exec-recursive installdirs-recursive install-recursive \ + uninstall-recursive check-recursive installcheck-recursive +DIST_COMMON = README $(dist_man1_MANS) Makefile.am Makefile.in +DIST_SUBDIRS = $(SUBDIRS) +SOURCES = asn1c.c + +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu asn1c/Makefile +Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && \ + CONFIG_HEADERS= CONFIG_LINKS= \ + CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(bindir) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + || test -f $$p1 \ + ; then \ + f=`echo $$p1|sed '$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$f"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$f; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f $(DESTDIR)$(bindir)/$$f"; \ + rm -f $(DESTDIR)$(bindir)/$$f; \ + done + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +asn1c$(EXEEXT): $(asn1c_OBJECTS) $(asn1c_DEPENDENCIES) + @rm -f asn1c$(EXEEXT) + $(LINK) $(asn1c_LDFLAGS) $(asn1c_OBJECTS) $(asn1c_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) core *.core + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1c.Po@am__quote@ + +distclean-depend: + -rm -rf $(DEPDIR) + +.c.o: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< + +.c.obj: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `cygpath -w $<` + +.c.lo: +@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< +CCDEPMODE = @CCDEPMODE@ +uninstall-info-am: + +man1dir = $(mandir)/man1 +install-man1: $(man1_MANS) $(man_MANS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(man1dir) + @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \ + $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \ + done +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \ + rm -f $(DESTDIR)$(man1dir)/$$inst; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique $(LISP) + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) + +GTAGS: + here=`CDPATH=: && cd $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; \ + srcdir=$(srcdir); export srcdir; \ + list='$(TESTS)'; \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *" $$tst "*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ + ;; \ + *) \ + echo "PASS: $$tst"; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *" $$tst "*) \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ + ;; \ + esac; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all tests failed"; \ + else \ + banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ + fi; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0; \ + fi + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + $(mkinstalldirs) "$(distdir)/$$dir"; \ + fi; \ + if test -d $$d/$$file; then \ + cp -pR $$d/$$file $(distdir) \ + || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + for subdir in $(SUBDIRS); do \ + if test "$$subdir" = .; then :; else \ + test -d $(distdir)/$$subdir \ + || mkdir $(distdir)/$$subdir \ + || exit 1; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" \ + distdir=../$(distdir)/$$subdir \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_SCRIPTS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-recursive +all-am: Makefile $(PROGRAMS) $(MANS) +installdirs: installdirs-recursive +installdirs-am: + $(mkinstalldirs) $(DESTDIR)$(bindir) $(DESTDIR)$(man1dir) + +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + +distclean-am: clean-am distclean-compile distclean-depend \ + distclean-generic distclean-libtool distclean-tags + +dvi: dvi-recursive + +dvi-am: + +info: info-recursive + +info-am: + +install-data-am: install-man + +install-exec-am: install-binPROGRAMS + +install-info: install-info-recursive + +install-man: install-man1 + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +uninstall-am: uninstall-binPROGRAMS uninstall-info-am uninstall-man + +uninstall-info: uninstall-info-recursive + +uninstall-man: uninstall-man1 + +.PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-TESTS check-am \ + clean clean-binPROGRAMS clean-generic clean-libtool \ + clean-recursive distclean distclean-compile distclean-depend \ + distclean-generic distclean-libtool distclean-recursive \ + distclean-tags distdir dvi dvi-am dvi-recursive info info-am \ + info-recursive install install-am install-binPROGRAMS \ + install-data install-data-am install-data-recursive \ + install-exec install-exec-am install-exec-recursive \ + install-info install-info-am install-info-recursive install-man \ + install-man1 install-recursive install-strip installcheck \ + installcheck-am installdirs installdirs-am \ + installdirs-recursive maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool mostlyclean-recursive \ + tags tags-recursive uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-info-am \ + uninstall-info-recursive uninstall-man uninstall-man1 \ + uninstall-recursive + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/asn1c/README b/asn1c/README new file mode 100644 index 000000000..158cd1150 --- /dev/null +++ b/asn1c/README @@ -0,0 +1 @@ +The ASN.1 Compiler diff --git a/asn1c/asn1c.1 b/asn1c/asn1c.1 new file mode 100644 index 000000000..1b58f4df9 --- /dev/null +++ b/asn1c/asn1c.1 @@ -0,0 +1,99 @@ +.de Id +.. +.Id $Id" +.TH ASN1C 1 "\*(Dt" "ASN.1 Compiler" "ASN.1 Compiler" +.SH NAME +asn1c \- ASN.1 Compiler +.ND ASN.1 compiler +.SH SYNOPSIS +.B asn1c +.RI "[ " option " | " filename " ].\|.\|." +.SH DESCRIPTION +asn1c is a tool to compile the ASN.1 specifications into C language structures +and accompanying routines to perform data encoding and decoding. +.SH OPTIONS +.TP +.B Overall Options +\-E +\-F +\-L +\-N +\-P +.RI "\-S " directory +\-R +.TP +.B Language Options +.br +\-ftypes88 +\-fnative-integers +\-fno-c99 +\-funnamed-unions +.TP +.B Warning Options +.br +\-Werror +\-Wdebug-lexer +\-Wdebug-fixer +\-Wdebug-compiler +.SH OVERALL OPTIONS +.TP +.B \-E +Stop after the parsing stage. The output is reconstructed ASN.1 +specification code, which is sent to the standard output. +.TP +.B \-F +Used together with \c +.B \-E\c +, instructs the compiler to stop after the ASN.1 syntax +tree fixing stage and dump the reconstructed ASN.1 specification +to the standard output. +.TP +.B \-L +Generate "-- #line" comments in +.B -E +output. +.TP +.B \-N +Do not generate certain type of comments in +.B -E +output. +.TP +.B \-P +Dump the compiled output to the standard output instead of creating the +target language files on disk. +.TP +.B \-S directory +Use the specified directory with ASN.1 skeleton files. +.TP +.B \-R +Restrict the compiler to generate only the ASN.1 tables, +omitting the usual support code. +.SH LANGUAGE OPTIONS +.TP +.B \-ftypes88 +Use only ASN.1:1988 embedded types. +.TP +.B \-fnative-integers +Use native machine's integer types whenever possible, +instead of the complex ASN.1 INTEGER and ENUMERATED types. +.TP +.B \-fno-c99 +Disable use of certain C99 extensions, like designated initializers. +.TP +.B \-funnamed-unions +Enable unnamed unions in structures definitions. +.SH WARNING OPTIONS +.TP +.B \-Werror +Treat warnings as errors; abort if any warning is produced. +.TP +.B \-Wdebug-lexer +Enable lexer debugging during the ASN.1 parsing stage. +.TP +.B \-Wdebug-fixer +Enable ASN.1 syntax tree fixer debugging during the fixing stage. +.TP +.B \-Wdebug-compiler +Enable debugging during the actual compile time. +.SH AUTHORS +Lev Walkin diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c new file mode 100644 index 000000000..afedf6bf0 --- /dev/null +++ b/asn1c/asn1c.c @@ -0,0 +1,267 @@ +/* + * This is the program that connects the libasn1* libraries together. + * It uses them in turn to parse, fix and then compile or print the ASN.1 tree. + */ +#include +#include +#include +#include +#include /* for stat(2) */ +#include +#include /* for basename(3) */ +#include /* for EX_USAGE */ +#include +#include + +#include /* Parse the ASN.1 file and build a tree */ +#include /* Fix the ASN.1 tree */ +#include /* Print the ASN.1 tree */ +#include /* Compile the ASN.1 tree */ + +static void usage(char *av0); /* Print the Usage screen and exit(EX_USAGE) */ + +int +main(int ac, char **av) { + enum asn1p_flags asn1_parser_flags = A1P_NOFLAGS; + enum asn1f_flags asn1_fixer_flags = A1F_NOFLAGS; + enum asn1c_flags asn1_compiler_flags = A1C_NOFLAGS; + int print_arg__print_out = 0; /* Don't compile, just print parsed */ + int print_arg__fix_n_print = 0; /* Fix and print */ + enum asn1print_flags_e print_arg__flags = APF_NOFLAGS; + int warnings_as_errors = 0; /* Treat warnings as errors */ + char *skeletons_dir = NULL; /* Directory with supplementary stuff */ + asn1p_t *asn = 0; /* An ASN.1 parsed tree */ + int ret; /* Return value from misc functions */ + int ch; /* Command line character */ + int i; /* Index in some loops */ + + /* + * Process command-line options. + */ + while((ch = getopt(ac, av, "EFf:LNPRS:W:")) != -1) + switch(ch) { + case 'E': + print_arg__print_out = 1; + break; + case 'F': + print_arg__fix_n_print = 1; + break; + case 'f': + if(strcmp(optarg, "types88") == 0) { + asn1_parser_flags |= A1P_TYPES_RESTRICT_TO_1988; + } else if(strcmp(optarg, "constr90") == 0) { + asn1_parser_flags |= A1P_CONSTRUCTS_RESTRICT_TO_1990; + } else if(strcmp(optarg, "native-integers") == 0) { + asn1_compiler_flags |= A1C_USE_NATIVE_INTEGERS; + } else if(strcmp(optarg, "no-c99") == 0) { + asn1_compiler_flags |= A1C_NO_C99; + } else if(strcmp(optarg, "unnamed-unions") == 0) { + asn1_compiler_flags |= A1C_UNNAMED_UNIONS; + } else { + fprintf(stderr, "-f%s: Invalid argument\n", optarg); + exit(EX_USAGE); + } + break; + case 'L': + print_arg__flags = APF_LINE_COMMENTS; + break; + case 'N': + print_arg__flags = APF_NO_SOURCE_COMMENTS; + break; + case 'P': + asn1_compiler_flags |= A1C_PRINT_COMPILED; + break; + case 'R': + asn1_compiler_flags |= A1C_OMIT_SUPPORT_CODE; + break; + case 'S': + skeletons_dir = optarg; + break; + case 'W': + if(strcmp(optarg, "error") == 0) { + warnings_as_errors = 1; + break; + } else if(strcmp(optarg, "debug-lexer") == 0) { + asn1_parser_flags |= A1P_LEXER_DEBUG; + break; + } else if(strcmp(optarg, "debug-fixer") == 0) { + asn1_fixer_flags |= A1F_DEBUG; + break; + } else if(strcmp(optarg, "debug-compiler") == 0) { + asn1_compiler_flags |= A1C_DEBUG; + break; + } else { + fprintf(stderr, "-W%s: Invalid argument\n", optarg); + exit(EX_USAGE); + } + break; + default: + usage(av[0]); + } + + /* + * Validate the options combination. + */ + if(!print_arg__print_out) { + if(print_arg__fix_n_print) { + fprintf(stderr, "Error: -F requires -E\n"); + exit(EX_USAGE); + } + } + + /* + * Ensure that there are some input files present. + */ + if(ac > optind) { + ac -= optind; + av += optind; + } else { + fprintf(stderr, "%s: No input files specified\n", + basename(av[0])); + exit(1); + } + + /* + * Iterate over input files and parse each. + * All syntax trees from all files will be bundled together. + */ + for(i = 0; i < ac; i++) { + asn1p_t *new_asn; + + new_asn = asn1p_parse_file(av[i], asn1_parser_flags); + if(new_asn == NULL) { + fprintf(stderr, "Cannot parse \"%s\"\n", av[i]); + exit(EX_DATAERR); + } + + /* + * Bundle the parsed tree with existing one. + */ + if(asn) { + asn1p_module_t *mod; + while((mod = TQ_REMOVE(&(new_asn->modules), mod_next))) + TQ_ADD(&(asn->modules), mod, mod_next); + asn1p_free(new_asn); + } else { + asn = new_asn; + } + + } + + /* + * Dump the parsed ASN.1 tree if -E specified and -F is not given. + */ + if(print_arg__print_out && !print_arg__fix_n_print) { + if(asn1print(asn, print_arg__flags)) + exit(EX_SOFTWARE); + return 0; + } + + + /* + * Process the ASN.1 specification: perform semantic checks, + * expand references, etc, etc. + * This function will emit necessary warnings and error messages. + */ + ret = asn1f_process(asn, asn1_fixer_flags, + NULL /* default fprintf(stderr) */); + switch(ret) { + case 1: + if(!warnings_as_errors) + /* Fall through */ + case 0: + break; /* All clear */ + case -1: + exit(EX_DATAERR); /* Fatal failure */ + } + + /* + * Dump the parsed ASN.1 tree if -E specified and -F is given. + */ + if(print_arg__print_out && print_arg__fix_n_print) { + if(asn1print(asn, print_arg__flags)) + exit(EX_SOFTWARE); + return 0; + } + + /* + * Make sure the skeleton directory is out there. + */ + if(skeletons_dir == NULL) { + struct stat sb; + skeletons_dir = DATADIR; + if((av[-optind][0] == '.' || av[-optind][1] == '/') + && stat(skeletons_dir, &sb)) { + /* + * The default skeletons directory does not exist, + * compute it from my file name: + * ./asn1c/asn1c -> ./skeletons + */ + char *p; + int len; + + p = dirname(av[-optind]); + + len = strlen(p) + sizeof("/../skeletons"); + skeletons_dir = alloca(len); + snprintf(skeletons_dir, len, "%s/../skeletons", p); + if(stat(skeletons_dir, &sb)) { + fprintf(stderr, + "WARNING: skeletons are neither in " + "\"%s\" nor in \"%s\"!\n", + DATADIR, skeletons_dir); + if(warnings_as_errors) + exit(EX_SOFTWARE); + } + } + } + + /* + * Compile the ASN.1 tree into a set of source files + * of another language. + */ + if(asn1_compile(asn, skeletons_dir, asn1_compiler_flags)) { + exit(EX_SOFTWARE); + } + + return 0; +} + +/* + * Print the usage screen and exit(EX_USAGE). + */ +static void +usage(char *av0) { + fprintf(stderr, + "ASN.1 Compiler, v" VERSION "\n" + "Copyright (c) 2003, 2004 Lev Walkin \n" + "Usage: %s [options] ...\n" + "Where [options] are:\n" + "\t-E\tRun only the ASN.1 parser and print out the tree\n" + "\t-F\tDuring -E operation, also perform tree fixing\n" + "\t-L\tGenerate \"-- #line\" comments in -E output\n" + "\t-N\tDo not generate certain type of comments in -E output\n" + "\n" + "\t-P \tConcatenate and print the compiled text\n" + "\t-S \tDirectory with support (skeleton?) files\n" + "\t \t(Default is \"%s\")\n" + "\t-R \tRestrict output (tables only, no support code)\n" + "\n" + "\t-ftypes88\tUse only ASN.1:1988 embedded types\n" +/* + "\t-fconstr90\tUse only ASN.1:1990 constructs (not available)\n" +*/ + "\t-fnative-integers\tUse native integers where possible\n" + "\t-fno-c99\tDisable C99 extensions\n" + "\t-funnamed-unions\tEnable unnamed unions in structures\n" + "\n" + "\t-Werror \tTreat warnings as errors; abort if any warning\n" + "\t-Wdebug-lexer\tEnable verbose debugging output from lexer\n" + "\t-Wdebug-fixer\tDebug ASN.1 semantics processor\n" + "\t-Wdebug-compiler\tDebug ASN.1 compiler\n" + , + basename(av0), DATADIR + ); + exit(EX_USAGE); +} + diff --git a/asn1c/check-parsing.sh b/asn1c/check-parsing.sh new file mode 100755 index 000000000..9a7bfde72 --- /dev/null +++ b/asn1c/check-parsing.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +tmpfile=".check-parsing.$$.tmp" + +ec=0 + +for ref in ../tests/*.asn1.-*; do + src=`echo "$ref" | sed -e 's/\.-[a-zA-Z]*$//'` + flags=`echo "$ref" | sed -e 's/.*\.-//'` + echo "Checking $src against $ref" + ./asn1c "-$flags" "$src" > "$tmpfile" || ec=$? + if [ $? = 0 ]; then + diff "$ref" "$tmpfile" || ec=$? + fi + rm -f "$tmpfile" +done + +exit $ec diff --git a/asn1c/tests/Makefile.am b/asn1c/tests/Makefile.am new file mode 100644 index 000000000..91dc54d37 --- /dev/null +++ b/asn1c/tests/Makefile.am @@ -0,0 +1,10 @@ + +check_SCRIPTS = ./check-assembly.sh + +TESTS_ENVIRONMENT= ./check-assembly.sh +TESTS = check-*.c + +EXTRA_DIST = ${check_SCRIPTS} check-*.c + +clean: + for t in test-*; do rm -rf $$t; done diff --git a/asn1c/tests/Makefile.in b/asn1c/tests/Makefile.in new file mode 100644 index 000000000..6689049c8 --- /dev/null +++ b/asn1c/tests/Makefile.in @@ -0,0 +1,284 @@ +# Makefile.in generated automatically by automake 1.5 from Makefile.am. + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../.. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_alias = @build_alias@ +build_triplet = @build@ +host_alias = @host_alias@ +host_triplet = @host@ +target_alias = @target_alias@ +target_triplet = @target@ +ADD_CFLAGS = @ADD_CFLAGS@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +AWK = @AWK@ +CC = @CC@ +CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPP = @CPP@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +EXEEXT = @EXEEXT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LEX = @LEX@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +MAINT = @MAINT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PATH = @PATH@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ +YACC = @YACC@ +am__include = @am__include@ +am__quote = @am__quote@ +install_sh = @install_sh@ + +check_SCRIPTS = ./check-assembly.sh + +TESTS_ENVIRONMENT = ./check-assembly.sh +TESTS = check-*.c + +EXTRA_DIST = ${check_SCRIPTS} check-*.c +subdir = asn1c/tests +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +DIST_SOURCES = +DIST_COMMON = README Makefile.am Makefile.in +all: all-am + +.SUFFIXES: + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu asn1c/tests/Makefile +Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && \ + CONFIG_HEADERS= CONFIG_LINKS= \ + CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status +uninstall-info-am: +tags: TAGS +TAGS: + + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; \ + srcdir=$(srcdir); export srcdir; \ + list='$(TESTS)'; \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *" $$tst "*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ + ;; \ + *) \ + echo "PASS: $$tst"; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *" $$tst "*) \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ + ;; \ + esac; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all tests failed"; \ + else \ + banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ + fi; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0; \ + fi + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = ../.. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + $(mkinstalldirs) "$(distdir)/$$dir"; \ + fi; \ + if test -d $$d/$$file; then \ + cp -pR $$d/$$file $(distdir) \ + || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_SCRIPTS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile + +installdirs: + +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + +distclean-am: clean-am distclean-generic distclean-libtool + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +uninstall-am: uninstall-info-am + +.PHONY: all all-am check check-TESTS check-am clean clean-generic \ + clean-libtool distclean distclean-generic distclean-libtool \ + distdir dvi dvi-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool uninstall uninstall-am uninstall-info-am + + +clean: + for t in test-*; do rm -rf $$t; done +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/asn1c/tests/README b/asn1c/tests/README new file mode 100644 index 000000000..b7fb56054 --- /dev/null +++ b/asn1c/tests/README @@ -0,0 +1,6 @@ + +This is a very funny test automation. The name of the check-*.c file is used +as a pointer to the file in ../..//tests/*-*.asn1. This file is compiled +using the asn1c from above directory. Then, everything is build together +in a temporary directory with a check-*.c used as a testing engine. + diff --git a/asn1c/tests/check-22.c b/asn1c/tests/check-22.c new file mode 100644 index 000000000..c80f98810 --- /dev/null +++ b/asn1c/tests/check-22.c @@ -0,0 +1,141 @@ +#undef NDEBUG +#include +#include +#include +#include +#include + +#include + +uint8_t buf1[] = { + 32 | 16, /* [UNIVERSAL 16], constructed */ + 12, /* L */ + /* INTEGER a */ + ((2 << 6) + 0), /* [0], primitive */ + 2, /* L */ + 150, + 70, + /* b [1] EXPLICIT CHOICE */ + 32 | ((2 << 6) + 1), /* [1] */ + 3, /* L */ + ((2 << 6) + 1), /* [1] */ + 1, + 'i', + /* UTF8String c */ + ((2 << 6) + 2), /* [2], primitive */ + 1, /* L */ + 'x' +}; + +uint8_t buf2[128]; +int buf2_pos; + +static int +buf2_fill(const void *buffer, size_t size, void *app_key) { + if(buf2_pos + size > sizeof(buf2)) + return -1; + + memcpy(buf2 + buf2_pos, buffer, size); + buf2_pos += size; + + return 0; +} + +static void +check(int is_ok, uint8_t *buf, int size, int consumed) { + T1_t t, *tp; + ber_dec_rval_t rval; + der_enc_rval_t erval; + int i; + + tp = memset(&t, 0, sizeof(t)); + + fprintf(stderr, "Buf %p\n", buf); + rval = ber_decode(&asn1_DEF_T1, (void **)&tp, buf, size); + fprintf(stderr, "Returned code %d, consumed %d\n", + (int)rval.code, (int)rval.consumed); + + if(is_ok) { + assert(rval.code == RC_OK); + assert(rval.consumed == consumed); + assert(t.a.size == 2); + assert(t.b.present == b_PR_n); + assert(t.b.choice.n.size == 1); + assert(t.b.choice.n.buf[0] == 'i'); + assert(t.c.size == 1); + assert(t.c.buf[0] == 'x'); + + } else { + if(rval.code == RC_OK) { + assert(t.a.size != 2 + || t.b.present != b_PR_n + || t.b.choice.n.size != 1 + || t.c.size != 1 + ); + } + assert(rval.consumed <= consumed); + return; + } + + fprintf(stderr, "=> Re-creating using DER encoder <=\n"); + + /* + * Try to re-create using DER encoding. + */ + buf2_pos = 0; + erval = der_encode(&asn1_DEF_T1, tp, buf2_fill, 0); + assert(erval.encoded != -1); + if(erval.encoded != sizeof(buf1)) { + printf("%d != %d\n", (int)erval.encoded, (int)sizeof(buf1)); + } + assert(erval.encoded == sizeof(buf1)); + for(i = 0; i < sizeof(buf1); i++) { + if(buf1[i] != buf2[i]) { + fprintf(stderr, "Recreated buffer content mismatch:\n"); + fprintf(stderr, "Byte %d, %x != %x (%d != %d)\n", + i, + buf1[i], buf2[i], + buf1[i], buf2[i] + ); + } + assert(buf1[i] == buf2[i]); + } + + fprintf(stderr, "=== PRINT ===\n"); + asn_fprint(stderr, &asn1_DEF_T1, tp); + fprintf(stderr, "=== EOF ===\n"); +} + +static void +try_corrupt(uint8_t *buf, int size) { + uint8_t *tmp; + int i; + + fprintf(stderr, "\nCorrupting...\n"); + + tmp = alloca(size); + + for(i = 0; i < 1000; i++) { + int loc; + memcpy(tmp, buf, size); + + /* Corrupt random _non-value_ location. */ + do { loc = random() % size; } while(tmp[loc] >= 70); + do { tmp[loc] ^= random(); } while(tmp[loc] == buf[loc]); + + fprintf(stderr, "\nTry %d: corrupting byte %d (%d->%d)\n", + i, loc, buf[loc], tmp[loc]); + + check(0, tmp, size, size); + } +} + +int +main(int ac, char **av) { + + check(1, buf1, sizeof(buf1), sizeof(buf1)); + try_corrupt(buf1, sizeof(buf1)); + check(1, buf1, sizeof(buf1) + 10, sizeof(buf1)); + + return 0; +} diff --git a/asn1c/tests/check-24.c b/asn1c/tests/check-24.c new file mode 100644 index 000000000..b74ca1659 --- /dev/null +++ b/asn1c/tests/check-24.c @@ -0,0 +1,94 @@ +#undef NDEBUG +#include +#include +#include +#include +#include + +#include + +uint8_t buf1[] = { + 32 | ((2 << 6) + 5), /* [5], constructed */ + 17, /* L */ + 32 | 16, /* [UNIVERSAL 16], constructed */ + 15, /* L */ + /* INTEGER a */ + 2, /* [UNIVERSAL 2] */ + 2, /* L */ + 150, + 70, + /* INTEGER b */ + ((2 << 6) + 0), /* [0] */ + 1, /* L */ + 123, + /* INTEGER c */ + ((2 << 6) + 1), /* [1] */ + 1, /* L */ + 123, + /* INTEGER d */ + 32 | ((2 << 6) + 5), /* [5], constructed */ + 3, + 2, + 1, /* L */ + 123, +}; + +static void +check(int is_ok, uint8_t *buf, int size, int consumed) { + T_t t, *tp; + ber_dec_rval_t rval; + + tp = memset(&t, 0, sizeof(t)); + + fprintf(stderr, "Buf %p\n", buf); + rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf, size); + fprintf(stderr, "Returned code %d, consumed %d\n", + (int)rval.code, (int)rval.consumed); + + if(is_ok) { + assert(rval.code == RC_OK); + assert(rval.consumed == consumed); + } else { + if(rval.code == RC_OK) { + assert(t.a.size != 2 + || (!t.b || t.b->size != 1) + || (!t.c || t.c->size != 1) + || t.d.size != 1 + ); + } + assert(rval.consumed <= consumed); + } +} + +static void +try_corrupt(uint8_t *buf, int size) { + uint8_t *tmp; + int i; + + fprintf(stderr, "\nCorrupting...\n"); + + tmp = alloca(size); + + for(i = 0; i < 1000; i++) { + int loc; + memcpy(tmp, buf, size); + + /* Corrupt random _non-value_ location. */ + do { loc = random() % size; } while(tmp[loc] >= 70); + do { tmp[loc] ^= random(); } while(tmp[loc] == buf[loc]); + + fprintf(stderr, "\nTry %d: corrupting byte %d (%d->%d)\n", + i, loc, buf[loc], tmp[loc]); + + check(0, tmp, size, size); + } +} + +int +main(int ac, char **av) { + + check(1, buf1, sizeof(buf1), sizeof(buf1)); + try_corrupt(buf1, sizeof(buf1)); + + return 0; +} diff --git a/asn1c/tests/check-25.c b/asn1c/tests/check-25.c new file mode 100644 index 000000000..bd803da3a --- /dev/null +++ b/asn1c/tests/check-25.c @@ -0,0 +1,252 @@ +#undef NDEBUG +#include +#include +#include +#include +#include + +#include + +uint8_t buf1[] = { + 32 | 16, /* [UNIVERSAL 16], constructed */ + 128, /* L */ + /* a INTEGER */ + 2, /* [UNIVERSAL 2] */ + 2, /* L */ + 150, + 70, + /* b BOOLEAN */ + 128 | 2, /* [2] */ + 1, /* L */ + 0xff, + /* c NULL */ + 5, /* [UNIVERSAL 5] */ + 0, /* L */ + /* d ENUMERATED */ + 10, /* [UNIVERSAL 10] */ + 1, /* L */ + 222, + 4, /* [UNIVERSAL 4] */ + 3, /* L */ + 'x', + 'y', + 'z', + /* f OCTET STRING */ + 32 | 4, /* [UNIVERSAL 4], constructed */ + 128, /* L indefinite */ + 4, /* [UNIVERSAL 4], primitive */ + 2, + 'l', + 'o', + 32 | 4, /* [UNIVERSAL 4], recursively constructed */ + 128, + 4, + 1, + 'v', + 4, + 2, + 'e', + '_', + 0, + 0, + 4, /* [UNIVERSAL 4], primitive */ + 2, + 'i', + 't', + 0, + 0, + /* g BIT STRING */ + 3, /* [UNIVERSAL 3], primitive */ + 3, /* L */ + 2, /* Skip 2 bits */ + 147, + 150, /* => 148 */ + /* h BIT STRING */ + 32 | 3, /* [UNIVERSAL 3], constructed */ + 128, /* L indefinite */ + 3, /* [UNIVERSAL 3], primitive */ + 3, /* L */ + 0, /* Skip 0 bits */ + 140, + 141, + 3, /* [UNIVERSAL 3], primitive */ + 2, /* L */ + 1, /* Skip 1 bit */ + 143, /* => 142 */ + 0, /* End of f */ + 0, + 0, /* End of the whole structure */ + 0, + /* Three bytes of planned leftover */ + 111, 222, 223 +}; + +static void +check(int is_ok, uint8_t *buf, int size, int consumed) { + T_t t, *tp; + ber_dec_rval_t rval; + + tp = memset(&t, 0, sizeof(t)); + + fprintf(stderr, "Buf %p (%d)\n", buf, (int)size); + rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf, size); + fprintf(stderr, "Returned code %d, consumed %d, expected %d\n", + (int)rval.code, (int)rval.consumed, (int)consumed); + + if(is_ok) { + assert(rval.code == RC_OK); + assert(rval.consumed == consumed); + + assert(strcmp(t.e->buf, "xyz") == 0); + assert(strcmp(t.f->buf, "love_it") == 0); + + assert(t.g->size == 3); + assert(t.g->buf[0] == 2); + assert(t.g->buf[1] == 147); + assert(t.g->buf[2] == 148); + + printf("%d\n", t.h->buf[3]); + assert(t.h->size == 4); + assert(t.h->buf[0] == 1); + assert(t.h->buf[1] == 140); + assert(t.h->buf[2] == 141); + assert(t.h->buf[3] == 142); + } else { + if(rval.code == RC_OK) { + assert(t.a.size != 2 + || !t.d + || t.d->size != 1 + || !t.e + || t.e->size != 3 + || !t.f + || t.f->size != 7 + || !t.g + || t.g->size != 3 + || !t.h + || t.h->size != 4 + ); + } + fprintf(stderr, "%d %d\n", (int)rval.consumed, (int)consumed); + assert(rval.consumed <= consumed); + } + + asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); +} + +static void +try_corrupt(uint8_t *buf, int size, int allow_consume) { + uint8_t *tmp; + int i; + + fprintf(stderr, "\nCorrupting...\n"); + + tmp = alloca(size); + + for(i = 0; i < 1000; i++) { + int loc; + memcpy(tmp, buf, size); + + /* Corrupt random _non-value_ location. */ + do { loc = random() % size; } while( + loc == 44 /* bit skips */ + || loc == 51 /* bit skips */ + || loc == 56 /* bit skips */ + || tmp[loc] >= 70); + do { tmp[loc] = buf[loc] ^ random(); } while( + (tmp[loc] == buf[loc]) + || (buf[loc] == 0 && tmp[loc] == 0x80)); + + fprintf(stderr, "\nTry %d: corrupting byte %d (%d->%d)\n", + i, loc, buf[loc], tmp[loc]); + + check(0, tmp, size, allow_consume); + } +} + +static void +partial_read(uint8_t *buf, int size) { + T_t t, *tp; + ber_dec_rval_t rval; + int i1, i2; + uint8_t *buf1 = alloca(size); + uint8_t *buf2 = alloca(size); + uint8_t *buf3 = alloca(size); + + fprintf(stderr, "\nPartial read sequence...\n"); + + /* + * Divide the space (size) into three blocks in various combinations: + * |<----->i1<----->i2<----->| + * ^ buf ^ buf+size + * Try to read block by block. + */ + for(i1 = 0; i1 < size; i1++) { + for(i2 = i1; i2 < size; i2++) { + uint8_t *chunk1 = buf; + int size1 = i1; + uint8_t *chunk2 = buf + size1; + int size2 = i2 - i1; + uint8_t *chunk3 = buf + size1 + size2; + int size3 = size - size1 - size2; + + fprintf(stderr, "\n%d:{%d, %d, %d}...\n", + size, size1, size2, size3); + + memset(buf1, 0, size); + memset(buf2, 0, size); + memset(buf3, 0, size); + memcpy(buf1, chunk1, size1); + memcpy(buf2, chunk2, size2); + memcpy(buf3, chunk3, size3); + + tp = memset(&t, 0, sizeof(t)); + + fprintf(stderr, "=> Chunk 1 (%d):\n", size1); + rval = ber_decode(&asn1_DEF_T, (void **)&tp, + buf1, size1); + assert(rval.code == RC_WMORE); + assert(rval.consumed <= size1); + if(rval.consumed < size1) { + int leftover = size1 - rval.consumed; + memcpy(buf2, buf1 + rval.consumed, leftover); + memcpy(buf2 + leftover, chunk2, size2); + size2 += leftover; + } + + fprintf(stderr, "=> Chunk 2 (%d):\n", size2); + rval = ber_decode(&asn1_DEF_T, (void **)&tp, + buf2, size2); + assert(rval.code == RC_WMORE); + assert(rval.consumed <= size2); + if(rval.consumed < size2) { + int leftover = size2 - rval.consumed; + memcpy(buf3, buf2 + rval.consumed, leftover); + memcpy(buf3 + leftover, chunk3, size3); + size3 += leftover; + } + + fprintf(stderr, "=> Chunk 3 (%d):\n", size3); + rval = ber_decode(&asn1_DEF_T, (void **)&tp, + buf3, size3); + assert(rval.code == RC_OK); + assert(rval.consumed == size3); + + asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); + } + } +} + +int +main(int ac, char **av) { + + /* Check that the full buffer may be decoded normally */ + check(1, buf1, sizeof(buf1), sizeof(buf1) - 3); + + /* Check that some types of buffer corruptions will lead to failure */ + try_corrupt(buf1, sizeof(buf1) - 3, sizeof(buf1) - 3); + + /* Split the buffer in parts and check decoder restartability */ + partial_read(buf1, sizeof(buf1) - 3); + + return 0; +} diff --git a/asn1c/tests/check-30.c b/asn1c/tests/check-30.c new file mode 100644 index 000000000..9e5adf22d --- /dev/null +++ b/asn1c/tests/check-30.c @@ -0,0 +1,116 @@ +#undef NDEBUG +#include +#include +#include +#include +#include + +#include + +uint8_t buf1[] = { + 32 | 17, /* [UNIVERSAL 17], constructed */ + 8, /* L */ + + /* a INTEGER */ + 64 | 3, /* [APPLICATION 3] */ + 1, /* L */ + 96, + + /* b IA5String */ + 22, /* [UNIVERSAL 22] */ + 3, /* L */ + 'x', + 'y', + 'z' +}; + +/* + * This buffer aims at checking the duplication. + */ +uint8_t buf2[] = { + 32 | 17, /* [UNIVERSAL 17], constructed */ + 8, /* L */ + + /* a INTEGER */ + 64 | 3, /* [APPLICATION 3] */ + 1, /* L */ + 96, + + /* a INTEGER _again_ */ + 64 | 3, /* [APPLICATION 3] */ + 1, /* L */ + 97, +}; + +static void +check(int is_ok, uint8_t *buf, int size, int consumed) { + T_t t, *tp; + ber_dec_rval_t rval; + + tp = memset(&t, 0, sizeof(t)); + + fprintf(stderr, "Buf %p\n", buf); + rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf, size); + fprintf(stderr, "Returned code %d, consumed %d\n", + (int)rval.code, (int)rval.consumed); + + if(is_ok) { + assert(rval.code == RC_OK); + assert(rval.consumed == consumed); + + assert(t.a.size == 1); + assert(t.a.buf[0] == 96); + assert(t.b.size == 3); + assert(t.c == 0); + assert(strcmp(t.b.buf, "xyz") == 0); + } else { + if(rval.code == RC_OK) { + assert(t.a.size != 1 + || t.b.size != 3 + || !t.c + ); + } + assert(rval.consumed <= consumed); + } +} + +static void +try_corrupt(uint8_t *buf, int size) { + uint8_t *tmp; + int i; + + fprintf(stderr, "\nCorrupting...\n"); + + tmp = alloca(size); + + for(i = 0; i < 1000; i++) { + int loc; + memcpy(tmp, buf, size); + + /* Corrupt random _non-value_ location. */ + do { loc = random() % size; } while(tmp[loc] >= 70); + do { tmp[loc] = buf[loc] ^ random(); } while( + (tmp[loc] == buf[loc]) + || (buf[loc] == 0 && tmp[loc] == 0x80)); + + fprintf(stderr, "\nTry %d: corrupting byte %d (%d->%d)\n", + i, loc, buf[loc], tmp[loc]); + + check(0, tmp, size, size); + } +} + +int +main(int ac, char **av) { + + fprintf(stderr, "Must succeed:\n"); + check(1, buf1, sizeof(buf1) + 20, sizeof(buf1)); + + fprintf(stderr, "\nMust fail:\n"); + check(0, buf2, sizeof(buf2) + 1, 5); + + fprintf(stderr, "\nPseudo-random buffer corruptions must fail\n"); + try_corrupt(buf1, sizeof(buf1)); + + return 0; +} diff --git a/asn1c/tests/check-31.c b/asn1c/tests/check-31.c new file mode 100644 index 000000000..53a90cbaf --- /dev/null +++ b/asn1c/tests/check-31.c @@ -0,0 +1,175 @@ +#undef NDEBUG +#include +#include +#include +#include +#include + +#include + +uint8_t buf1[] = { + 32 | 17, /* [UNIVERSAL 17], constructed */ + 128, /* L, indefinite */ + + 32 | 16, /* [UNIVERSAL 16], constructed */ + 6, /* L */ + + /* height INTEGER */ + 2, /* [UNIVERSAL 2] */ + 1, /* L */ + 100, + /* width INTEGER */ + 2, /* [UNIVERSAL 2] */ + 1, /* L */ + 80, + + 32 | 16, /* [UNIVERSAL 16], constructed */ + 6, /* L */ + + /* height INTEGER */ + 2, /* [UNIVERSAL 2] */ + 1, /* L */ + 110, + /* width INTEGER */ + 2, /* [UNIVERSAL 2] */ + 1, /* L */ + 82, + + 0, /* End of forest */ + 0 +}; + +uint8_t buf1_reconstr[] = { + 32 | 17, /* [UNIVERSAL 17], constructed */ + 16, /* L */ + + 32 | 16, /* [UNIVERSAL 16], constructed */ + 6, /* L */ + + /* height INTEGER */ + 2, /* [UNIVERSAL 2] */ + 1, /* L */ + 100, + /* width INTEGER */ + 2, /* [UNIVERSAL 2] */ + 1, /* L */ + 80, + + 32 | 16, /* [UNIVERSAL 16], constructed */ + 6, /* L */ + + /* height INTEGER */ + 2, /* [UNIVERSAL 2] */ + 1, /* L */ + 110, + /* width INTEGER */ + 2, /* [UNIVERSAL 2] */ + 1, /* L */ + 82 + +}; + +int buf_pos; +int bytes_compare(const void *bufferp, size_t size, void *key) { + const uint8_t *buffer = bufferp; + assert(buf_pos + size <= sizeof(buf1_reconstr)); + + fprintf(stderr, " writing %d (%d)\n", (int)size, buf_pos + (int)size); + + for(; size; buf_pos++, size--, buffer++) { + if(buf1_reconstr[buf_pos] != *buffer) { + fprintf(stderr, + "Byte %d is different: %d != %d (%x != %x)\n", + buf_pos, + *buffer, buf1_reconstr[buf_pos], + *buffer, buf1_reconstr[buf_pos] + ); + assert(buf1_reconstr[buf_pos] == *buffer); + } + } + + return 0; +} + +static void +check(int is_ok, uint8_t *buf, int size, int consumed) { + Forest_t t, *tp; + ber_dec_rval_t rval; + + tp = memset(&t, 0, sizeof(t)); + + fprintf(stderr, "Buf %p\n", buf); + rval = ber_decode(&asn1_DEF_Forest, (void **)&tp, buf, size); + fprintf(stderr, "Returned code %d, consumed %d\n", + (int)rval.code, (int)rval.consumed); + + if(is_ok) { + assert(rval.code == RC_OK); + assert(rval.consumed == consumed); + + assert(t.list.count == 2); + assert(t.list.array[0]->height.size == 1); + assert(t.list.array[0]->width.size == 1); + assert(t.list.array[1]->height.size == 1); + assert(t.list.array[1]->width.size == 1); + } else { + if(rval.code == RC_OK) { + assert(t.list.count != 2 + || t.list.array[0]->height.size != 1 + || t.list.array[0]->width.size != 1 + || t.list.array[1]->height.size != 1 + || t.list.array[1]->width.size != 1 + ); + } + assert(rval.consumed <= consumed); + return; + } + + /* + * Try to re-create the buffer. + */ + buf_pos = 0; + der_encode(&asn1_DEF_Forest, &t, + bytes_compare, buf1_reconstr); + assert(buf_pos == sizeof(buf1_reconstr)); + + asn_fprint(stderr, &asn1_DEF_Forest, &t); + + asn1_DEF_Forest.free_struct(&asn1_DEF_Forest, &t, 1); +} + +static void +try_corrupt(uint8_t *buf, int size) { + uint8_t *tmp; + int i; + + fprintf(stderr, "\nCorrupting...\n"); + + tmp = alloca(size); + + for(i = 0; i < 1000; i++) { + int loc; + memcpy(tmp, buf, size); + + /* Corrupt random _non-value_ location. */ + do { loc = random() % size; } while(tmp[loc] >= 70); + do { tmp[loc] = buf[loc] ^ random(); } while( + (tmp[loc] == buf[loc]) + || (buf[loc] == 0 && tmp[loc] == 0x80)); + + fprintf(stderr, "\nTry %d: corrupting byte %d (%d->%d)\n", + i, loc, buf[loc], tmp[loc]); + + check(0, tmp, size, size); + } +} + +int +main(int ac, char **av) { + + check(1, buf1, sizeof(buf1), sizeof(buf1)); + try_corrupt(buf1, sizeof(buf1)); + check(1, buf1, sizeof(buf1) + 20, sizeof(buf1)); + + return 0; +} diff --git a/asn1c/tests/check-32.c b/asn1c/tests/check-32.c new file mode 100644 index 000000000..3cb0fdac9 --- /dev/null +++ b/asn1c/tests/check-32.c @@ -0,0 +1,21 @@ +#undef NDEBUG +#include +#include +#include +#include +#include + +#include + +int +main(int ac, char **av) { + Programming_t p; + + memset(&p, 0, sizeof(p)); + + /* + * No plans to fill it up: just checking whether it compiles or not. + */ + + return 0; +} diff --git a/asn1c/tests/check-33.c b/asn1c/tests/check-33.c new file mode 100644 index 000000000..14f5377a5 --- /dev/null +++ b/asn1c/tests/check-33.c @@ -0,0 +1,21 @@ +#undef NDEBUG +#include +#include +#include +#include +#include + +#include + +int +main(int ac, char **av) { + T_t t; + + memset(&t, 0, sizeof(t)); + + /* + * No plans to fill it up: just checking whether it compiles or not. + */ + + return 0; +} diff --git a/asn1c/tests/check-35.c b/asn1c/tests/check-35.c new file mode 100644 index 000000000..6b6c04d65 --- /dev/null +++ b/asn1c/tests/check-35.c @@ -0,0 +1,277 @@ +#undef NDEBUG +#include +#include +#include +#include +#include + +#include + +uint8_t buf1[] = { + 32 | 17, /* [UNIVERSAL 17], constructed */ + 13, /* L */ + + /* b CHOICE { b2 ObjectDescriptor }*/ + 7, /* [UNIVERSAL 7] */ + 1, /* L */ + 'z', + + /* c BOOLEAN */ + 1, /* [UNIVERSAL 1] */ + 0, /* L */ + + /* a NumericString */ + 18, /* [UNIVERSAL 18] */ + 2, /* L */ + 'n', + 's', + + /* d.r-oid RELATIVE-OID */ + 13, /* [UNIVERSAL 13] */ + 2, /* L */ + 85, + 79, + +}; + +uint8_t buf1_reconstr[] = { + 32 | 17, /* [UNIVERSAL 17], constructed */ + 14, /* L */ + + /* c BOOLEAN */ + 1, /* [UNIVERSAL 1] */ + 1, /* L */ + 0, + + /* b CHOICE { b2 ObjectDescriptor }*/ + 7, /* [UNIVERSAL 7] */ + 1, /* L */ + 'z', + + /* d.r-oid RELATIVE-OID */ + 13, /* [UNIVERSAL 1] */ + 2, /* L */ + 85, + 79, + + /* a NumericString */ + 18, /* [UNIVERSAL 18] */ + 2, /* L */ + 'n', + 's' +}; + +uint8_t buf2[] = { + 32 | 17, /* [UNIVERSAL 17], constructed */ + 13, /* L */ + + /* a NumericString */ + 18, /* [UNIVERSAL 18] */ + 2, /* L */ + 'n', + 's', + + /* c BOOLEAN */ + 1, /* [UNIVERSAL 1] */ + 1, /* L */ + 2, /* True */ + + /* b CHOICE { b1 IA5String }*/ + 22, /* [UNIVERSAL 22] */ + 1, /* L */ + 'z', + + /* d.oid RELATIVE-OID */ + 6, /* [UNIVERSAL 6] */ + 1, /* L */ + 81, + +}; + +uint8_t buf2_reconstr[] = { + 32 | 17, /* [UNIVERSAL 17], constructed */ + 13, /* L */ + + /* c BOOLEAN */ + 1, /* [UNIVERSAL 1] */ + 1, /* L */ + 0xff, /* Canonical True */ + + /* d.oid RELATIVE-OID */ + 6, /* [UNIVERSAL 6] */ + 1, /* L */ + 81, + + /* a NumericString */ + 18, /* [UNIVERSAL 18] */ + 2, /* L */ + 'n', + 's', + + /* b CHOICE { b1 IA5String }*/ + 22, /* [UNIVERSAL 22] */ + 1, /* L */ + 'z' +}; + +static void +check(T_t *tp, uint8_t *buf, int size, int consumed) { + ber_dec_rval_t rval; + + tp = memset(tp, 0, sizeof(*tp)); + + fprintf(stderr, "Buf %p (%d)\n", buf, size); + rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf, size); + fprintf(stderr, "Returned code %d, consumed %d\n", + (int)rval.code, (int)rval.consumed); + + assert(rval.code == RC_OK); + assert(rval.consumed == consumed); + + assert(strcmp(tp->a.buf, "ns") == 0); + assert(strcmp(tp->b.choice.b1.buf, "z") == 0 + && strcmp(tp->b.choice.b2.buf, "z") == 0); +} + +int buf_pos; +int buf_size; +uint8_t *buf; + +static int +buf_fill(const void *buffer, size_t size, void *app_key) { + + if(buf_pos + size > buf_size) { + fprintf(stderr, "%d + %d > %d\n", buf_pos, (int)size, buf_size); + return -1; + } + + memcpy(buf + buf_pos, buffer, size); + buf_pos += size; + fprintf(stderr, " written %d (%d)\n", (int)size, buf_pos); + + return 0; +} + +void +compare(T_t *tp, uint8_t *cmp_buf, int cmp_buf_size) { + der_enc_rval_t erval; + int i; + + buf_size = cmp_buf_size + 100; + buf = alloca(buf_size); + buf_pos = 0; + + /* + * Try to re-create using DER encoding. + */ + erval = der_encode(&asn1_DEF_T, tp, buf_fill, 0); + assert(erval.encoded != -1); + if(erval.encoded != cmp_buf_size) { + printf("%d != %d\n", erval.encoded, cmp_buf_size); + } + assert(erval.encoded == cmp_buf_size); + for(i = 0; i < cmp_buf_size; i++) { + if(buf[i] != cmp_buf[i]) { + fprintf(stderr, "Recreated buffer content mismatch:\n"); + fprintf(stderr, "Byte %d, %x != %x (%d != %d)\n", + i, + buf[i], cmp_buf[i], + buf[i], cmp_buf[i] + ); + } + assert(buf[i] == cmp_buf[i]); + } +} + +static void +partial_read(uint8_t *buf, int size) { + T_t t, *tp; + ber_dec_rval_t rval; + int i1, i2; + uint8_t *buf1 = alloca(size); + uint8_t *buf2 = alloca(size); + uint8_t *buf3 = alloca(size); + + fprintf(stderr, "\nPartial read sequence...\n"); + + /* + * Divide the space (size) into three blocks in various combinations: + * |<----->i1<----->i2<----->| + * ^ buf ^ buf+size + * Try to read block by block. + */ + for(i1 = 0; i1 < size; i1++) { + for(i2 = i1; i2 < size; i2++) { + uint8_t *chunk1 = buf; + int size1 = i1; + uint8_t *chunk2 = buf + size1; + int size2 = i2 - i1; + uint8_t *chunk3 = buf + size1 + size2; + int size3 = size - size1 - size2; + + fprintf(stderr, "\n%d:{%d, %d, %d}...\n", + size, size1, size2, size3); + + memset(buf1, 0, size); + memset(buf2, 0, size); + memset(buf3, 0, size); + memcpy(buf1, chunk1, size1); + memcpy(buf2, chunk2, size2); + memcpy(buf3, chunk3, size3); + + tp = memset(&t, 0, sizeof(t)); + + fprintf(stderr, "=> Chunk 1 (%d):\n", size1); + rval = ber_decode(&asn1_DEF_T, (void **)&tp, + buf1, size1); + assert(rval.code == RC_WMORE); + assert(rval.consumed <= size1); + if(rval.consumed < size1) { + int leftover = size1 - rval.consumed; + memcpy(buf2, buf1 + rval.consumed, leftover); + memcpy(buf2 + leftover, chunk2, size2); + size2 += leftover; + } + + fprintf(stderr, "=> Chunk 2 (%d):\n", size2); + rval = ber_decode(&asn1_DEF_T, (void **)&tp, + buf2, size2); + assert(rval.code == RC_WMORE); + assert(rval.consumed <= size2); + if(rval.consumed < size2) { + int leftover = size2 - rval.consumed; + memcpy(buf3, buf2 + rval.consumed, leftover); + memcpy(buf3 + leftover, chunk3, size3); + size3 += leftover; + } + + fprintf(stderr, "=> Chunk 3 (%d):\n", size3); + rval = ber_decode(&asn1_DEF_T, (void **)&tp, + buf3, size3); + assert(rval.code == RC_OK); + assert(rval.consumed == size3); + + asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); + } + } +} + +int +main(int ac, char **av) { + T_t t; + + check(&t, buf1, sizeof(buf1) + 10, sizeof(buf1)); + compare(&t, buf1_reconstr, sizeof(buf1_reconstr)); + asn_fprint(stderr, &asn1_DEF_T, &t); + asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); + + check(&t, buf2, sizeof(buf2) + 10, sizeof(buf2)); + compare(&t, buf2_reconstr, sizeof(buf2_reconstr)); + asn_fprint(stderr, &asn1_DEF_T, &t); + asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); + + /* Split the buffer in parts and check decoder restartability */ + partial_read(buf1, sizeof(buf1)); + + return 0; +} diff --git a/asn1c/tests/check-41.c b/asn1c/tests/check-41.c new file mode 100644 index 000000000..c2238cf5a --- /dev/null +++ b/asn1c/tests/check-41.c @@ -0,0 +1,315 @@ +#undef NDEBUG +#include +#include +#include +#include +#include + +#include + +uint8_t buf0[] = { + 32 | ((2 << 6) + 1), /* [1], constructed */ + 18, + + /* string [0] IMPLICIT UTF8String, */ + (2 << 6), /* [0] */ + 16, /* L */ + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', +}; + +uint8_t buf0_reconstr[] = { + 32 | ((2 << 6) + 1), /* [1], constructed */ + 18, + + /* string [0] IMPLICIT UTF8String, */ + (2 << 6), /* [0] */ + 16, /* L */ + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', +}; + + + +uint8_t buf1[] = { + 32 | (2 << 6), /* [0], constructed */ + 0x80 | 1, /* L */ + 134, + + /* string [0] IMPLICIT UTF8String, */ + (2 << 6), /* [0] */ + 0x80 | 1, /* L */ + 128, + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + + /* alpha [1] IMPLICIT INTEGER OPTIONAL */ + (2 << 6) + 1, /* [1] */ + 1, /* L */ + 75, +}; + +uint8_t buf1_reconstr[] = { + 32 | (2 << 6), /* [0], constructed */ + 0x80 | 1, /* L */ + 134, + + /* string [0] IMPLICIT UTF8String, */ + (2 << 6), /* [0] */ + 0x80 | 1, /* L */ + 128, + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + + /* alpha [1] IMPLICIT INTEGER OPTIONAL */ + (2 << 6) + 1, /* [1] */ + 1, /* L */ + 75, +}; + +uint8_t buf2[] = { + 32 | ((2 << 6) + 1), /* [1], constructed */ + 0x80 | 1, /* L */ + 134, + + /* string [0] IMPLICIT UTF8String, */ + (2 << 6), /* [0] */ + 0x80 | 1, /* L */ + 128, + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + + /* beta [2] IMPLICIT INTEGER OPTIONAL */ + (2 << 6) + 2, /* [2] */ + 1, /* L */ + 75, +}; + +uint8_t buf2_reconstr[] = { + 32 | ((2 << 6) + 1), /* [1], constructed */ + 0x80 | 1, /* L */ + 134, + + /* string [0] IMPLICIT UTF8String, */ + (2 << 6), /* [0] */ + 0x80 | 1, /* L */ + 128, + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', + + /* beta [2] IMPLICIT INTEGER OPTIONAL */ + (2 << 6) + 2, /* [2] */ + 1, /* L */ + 75, +}; + + + + + +static void +check(T_t *tp, uint8_t *buf, int size, int consumed) { + ber_dec_rval_t rval; + + tp = memset(tp, 0, sizeof(*tp)); + + fprintf(stderr, "Buf %p (%d)\n", buf, size); + rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf, size); + fprintf(stderr, "Returned code %d, consumed %d\n", + (int)rval.code, (int)rval.consumed); + + assert(rval.code == RC_OK); + assert(rval.consumed == consumed); + + /* + assert(tp->string.size == 128); + assert(strncmp(tp->string.buf, "zz") == 0); + assert(strcmp(tp->b.choice.b1.buf, "z") == 0 + && strcmp(tp->b.choice.b2.buf, "z") == 0); + */ +} + +int buf_pos; +int buf_size; +uint8_t *buf; + +static int +buf_fill(const void *buffer, size_t size, void *app_key) { + + if(buf_pos + size > buf_size) { + fprintf(stderr, "%d + %d > %d\n", buf_pos, (int)size, buf_size); + return -1; + } + + memcpy(buf + buf_pos, buffer, size); + buf_pos += size; + fprintf(stderr, " written %d (%d)\n", (int)size, buf_pos); + + return 0; +} + +void +compare(T_t *tp, uint8_t *cmp_buf, int cmp_buf_size) { + der_enc_rval_t erval; + int i; + + buf_size = cmp_buf_size + 100; + buf = alloca(buf_size); + buf_pos = 0; + + /* + * Try to re-create using DER encoding. + */ + erval = der_encode(&asn1_DEF_T, tp, buf_fill, 0); + assert(erval.encoded != -1); + if(erval.encoded != cmp_buf_size) { + printf("%d != %d\n", erval.encoded, cmp_buf_size); + } + assert(erval.encoded == cmp_buf_size); + for(i = 0; i < cmp_buf_size; i++) { + if(buf[i] != cmp_buf[i]) { + fprintf(stderr, "Recreated buffer content mismatch:\n"); + fprintf(stderr, "Byte %d, %x != %x (%d != %d)\n", + i, + buf[i], cmp_buf[i], + buf[i], cmp_buf[i] + ); + } + assert(buf[i] == cmp_buf[i]); + } +} + +static void +partial_read(uint8_t *buf, int size) { + T_t t, *tp; + ber_dec_rval_t rval; + int i1, i2; + uint8_t *buf1 = alloca(size); + uint8_t *buf2 = alloca(size); + uint8_t *buf3 = alloca(size); + + fprintf(stderr, "\nPartial read sequence...\n"); + + /* + * Divide the space (size) into three blocks in various combinations: + * |<----->i1<----->i2<----->| + * ^ buf ^ buf+size + * Try to read block by block. + */ + for(i1 = 0; i1 < size; i1++) { + for(i2 = i1; i2 < size; i2++) { + uint8_t *chunk1 = buf; + int size1 = i1; + uint8_t *chunk2 = buf + size1; + int size2 = i2 - i1; + uint8_t *chunk3 = buf + size1 + size2; + int size3 = size - size1 - size2; + + fprintf(stderr, "\n%d:{%d, %d, %d}...\n", + size, size1, size2, size3); + + memset(buf1, 0, size); + memset(buf2, 0, size); + memset(buf3, 0, size); + memcpy(buf1, chunk1, size1); + memcpy(buf2, chunk2, size2); + memcpy(buf3, chunk3, size3); + + tp = memset(&t, 0, sizeof(t)); + + fprintf(stderr, "=> Chunk 1 (%d):\n", size1); + rval = ber_decode(&asn1_DEF_T, (void **)&tp, + buf1, size1); + assert(rval.code == RC_WMORE); + assert(rval.consumed <= size1); + if(rval.consumed < size1) { + int leftover = size1 - rval.consumed; + memcpy(buf2, buf1 + rval.consumed, leftover); + memcpy(buf2 + leftover, chunk2, size2); + size2 += leftover; + } + + fprintf(stderr, "=> Chunk 2 (%d):\n", size2); + rval = ber_decode(&asn1_DEF_T, (void **)&tp, + buf2, size2); + assert(rval.code == RC_WMORE); + assert(rval.consumed <= size2); + if(rval.consumed < size2) { + int leftover = size2 - rval.consumed; + memcpy(buf3, buf2 + rval.consumed, leftover); + memcpy(buf3 + leftover, chunk3, size3); + size3 += leftover; + } + + fprintf(stderr, "=> Chunk 3 (%d):\n", size3); + rval = ber_decode(&asn1_DEF_T, (void **)&tp, + buf3, size3); + assert(rval.code == RC_OK); + assert(rval.consumed == size3); + + asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); + } + } +} + +int +main(int ac, char **av) { + T_t t; + + /* Check exact buf0 */ + check(&t, buf0, sizeof(buf0), sizeof(buf0)); + compare(&t, buf0_reconstr, sizeof(buf0_reconstr)); + asn_fprint(stderr, &asn1_DEF_T, &t); + asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); + + /* Check exact buf1 */ + check(&t, buf1, sizeof(buf1), sizeof(buf1)); + compare(&t, buf1_reconstr, sizeof(buf1_reconstr)); + asn_fprint(stderr, &asn1_DEF_T, &t); + asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); + + /* Check slightly more than buf1 */ + check(&t, buf1, sizeof(buf1) + 10, sizeof(buf1)); + compare(&t, buf1_reconstr, sizeof(buf1_reconstr)); + asn_fprint(stderr, &asn1_DEF_T, &t); + asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); + + /* Check exact buf2 */ + check(&t, buf2, sizeof(buf2), sizeof(buf2)); + compare(&t, buf2_reconstr, sizeof(buf2_reconstr)); + asn_fprint(stderr, &asn1_DEF_T, &t); + asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); + + /* Check slightly more than buf2 */ + check(&t, buf2, sizeof(buf2) + 10, sizeof(buf2)); + compare(&t, buf2_reconstr, sizeof(buf2_reconstr)); + asn_fprint(stderr, &asn1_DEF_T, &t); + asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); + + /* Split the buffer in parts and check decoder restartability */ + partial_read(buf0, sizeof(buf0)); + + return 0; +} diff --git a/asn1c/tests/check-43.c b/asn1c/tests/check-43.c new file mode 100644 index 000000000..e44218d84 --- /dev/null +++ b/asn1c/tests/check-43.c @@ -0,0 +1,24 @@ +#undef NDEBUG +#include +#include +#include +#include +#include + +#include +#include + +int +main(int ac, char **av) { + Test_structure_1_t ts1; + Sets_t s1; + + memset(&ts1, 0, sizeof(ts1)); + memset(&s1, 0, sizeof(s1)); + + /* + * No plans to fill it up: just checking whether it compiles or not. + */ + + return 0; +} diff --git a/asn1c/tests/check-assembly.sh b/asn1c/tests/check-assembly.sh new file mode 100755 index 000000000..a1756b4d6 --- /dev/null +++ b/asn1c/tests/check-assembly.sh @@ -0,0 +1,56 @@ +#!/bin/sh + +# +# This script is designed to quickly create lots of files in underlying +# test-* directories, do lots of other magic stuff and exit cleanly. +# + +# Compute the .asn1 spec name by the given file name. +source=$(echo "$1" | sed -e 's/.*\///') +testno=`echo "$source" | cut -f2 -d'-' | cut -f1 -d'.'` + +args=$(echo "$source" | sed -e 's/\.c$//') +testdir=test-${args} + +OFS=$IFS +IFS="." +set $args +shift +IFS=$OFS + +if [ ! -d $testdir ]; then + mkdir $testdir || exit $? +fi +cd $testdir || exit $? +ln -fs ../$source || exit $? +# Compile the corresponding .asn1 spec. +set -x +../../asn1c \ + -S ../../../skeletons \ + -Wdebug-compiler "$@" \ + ../../../tests/${testno}-*.asn1 || exit $? +set +x + +# Create a Makefile for the project. +cat > Makefile <. +# Please send patches to . +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + + +dummy=dummy-$$ +trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int dummy(){}" > $dummy.c ; + for c in cc gcc c89 ; do + ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ; + if test $? = 0 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + rm -f $dummy.c $dummy.o $dummy.rel ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # Netbsd (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # Determine the machine/vendor (is the vendor relevant). + case "${UNAME_MACHINE}" in + amiga) machine=m68k-unknown ;; + arm32) machine=arm-unknown ;; + atari*) machine=m68k-atari ;; + sun3*) machine=m68k-sun ;; + mac68k) machine=m68k-apple ;; + macppc) machine=powerpc-apple ;; + hp3[0-9][05]) machine=m68k-hp ;; + ibmrt|romp-ibm) machine=romp-ibm ;; + *) machine=${UNAME_MACHINE}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE}" in + i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit 0 ;; + alpha:OSF1:*:*) + if test $UNAME_RELEASE = "V4.0"; then + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + fi + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + cat <$dummy.s + .data +\$Lformat: + .byte 37,100,45,37,120,10,0 # "%d-%x\n" + + .text + .globl main + .align 4 + .ent main +main: + .frame \$30,16,\$26,0 + ldgp \$29,0(\$27) + .prologue 1 + .long 0x47e03d80 # implver \$0 + lda \$2,-1 + .long 0x47e20c21 # amask \$2,\$1 + lda \$16,\$Lformat + mov \$0,\$17 + not \$1,\$18 + jsr \$26,printf + ldgp \$29,0(\$26) + mov 0,\$16 + jsr \$26,exit + .end main +EOF + eval $set_cc_for_build + $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null + if test "$?" = 0 ; then + case `./$dummy` in + 0-0) + UNAME_MACHINE="alpha" + ;; + 1-0) + UNAME_MACHINE="alphaev5" + ;; + 1-1) + UNAME_MACHINE="alphaev56" + ;; + 1-101) + UNAME_MACHINE="alphapca56" + ;; + 2-303) + UNAME_MACHINE="alphaev6" + ;; + 2-307) + UNAME_MACHINE="alphaev67" + ;; + 2-1307) + UNAME_MACHINE="alphaev68" + ;; + esac + fi + rm -f $dummy.s $dummy + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit 0;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + arc64:OpenBSD:*:*) + echo mips64el-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hkmips:OpenBSD:*:*) + echo mips-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mips-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + sparc*:NetBSD:*) + echo `uname -p`-unknown-netbsd${UNAME_RELEASE} + exit 0 ;; + atari*:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + sun3*:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + eval $set_cc_for_build + $CC_FOR_BUILD $dummy.c -o $dummy \ + && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + eval $set_cc_for_build + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + case "${HPUX_REV}" in + 11.[0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + esac ;; + esac + fi ;; + esac + if [ "${HP_ARCH}" = "" ]; then + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + eval $set_cc_for_build + (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` + if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi + rm -f $dummy.c $dummy + fi ;; + esac + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + eval $set_cc_for_build + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + hppa*:OpenBSD:*:*) + echo hppa-unknown-openbsd + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*X-MP:*:*:*) + echo xmp-cray-unicos + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3D:*:*:*) + echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY-2:*:*:*) + echo cray2-cray-unicos + exit 0 ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit 0 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i386-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux + exit 0 ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + mips:Linux:*:*) + case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in + big) echo mips-unknown-linux-gnu && exit 0 ;; + little) echo mipsel-unknown-linux-gnu && exit 0 ;; + esac + ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit 0 ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit 0 ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit 0 ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit 0 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit 0 ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit 0 ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit 0 ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + ld_supported_targets=`cd /; ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit 0 ;; + esac + # Determine whether the default compiler is a.out or elf + cat >$dummy.c < +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif +#ifdef __ELF__ +# ifdef __GLIBC__ +# if __GLIBC__ >= 2 + printf ("%s-pc-linux-gnu\n", argv[1]); +# else + printf ("%s-pc-linux-gnulibc1\n", argv[1]); +# endif +# else + printf ("%s-pc-linux-gnulibc1\n", argv[1]); +# endif +#else + printf ("%s-pc-linux-gnuaout\n", argv[1]); +#endif + return 0; +} +EOF + eval $set_cc_for_build + $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit 0 ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit 0 ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit 0 ;; + i*86:*:5:[78]*) + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit 0 ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` + (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit 0 ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit 0 ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + echo `uname -p`-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + if test "${UNAME_MACHINE}" = "x86pc"; then + UNAME_MACHINE=pc + fi + echo `uname -p`-${UNAME_MACHINE}-nto-qnx + exit 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSR-[KW]:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit 0 ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit 0 ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit 0 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit 0 ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit 0 ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit 0 ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit 0 ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit 0 ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit 0 ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit 0 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +eval $set_cc_for_build +$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0 +rm -f $dummy.c $dummy + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config.h.in b/config.h.in new file mode 100644 index 000000000..1910711f8 --- /dev/null +++ b/config.h.in @@ -0,0 +1,81 @@ +/* config.h.in. Generated from configure.in by autoheader. */ + +/* Define to 1 if you have the header file. */ +#undef HAVE_ERRNO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strtoimax' function. */ +#undef HAVE_STRTOIMAX + +/* Define to 1 if you have the `strtoll' function. */ +#undef HAVE_STRTOLL + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to 1 if your declares `struct tm'. */ +#undef TM_IN_SYS_TIME + +/* Version number of package */ +#undef VERSION + +/* Define to 1 if your processor stores words with the most significant byte + first (like Motorola and SPARC, unlike Intel and VAX). */ +#undef WORDS_BIGENDIAN + +/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a + `char[]'. */ +#undef YYTEXT_POINTER + +/* Define to `int64_t' if does not define. */ +#undef intmax_t + +/* Define to `long' if does not define. */ +#undef off_t + +/* Define to `unsigned' if does not define. */ +#undef size_t diff --git a/config.sub b/config.sub new file mode 100755 index 000000000..12ebc7875 --- /dev/null +++ b/config.sub @@ -0,0 +1,1410 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. + +timestamp='2001-08-13' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit 0;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | c4x | clipper \ + | d10v | d30v | dsp16xx \ + | fr30 \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | m32r | m68000 | m68k | m88k | mcore \ + | mips16 | mips64 | mips64el | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el | mips64vr4300 \ + | mips64vr4300el | mips64vr5000 | mips64vr5000el \ + | mipsbe | mipsel | mipsle | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | ns16k | ns32k \ + | openrisc \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | s390 | s390x \ + | sh | sh[34] | sh[34]eb | shbe | shle \ + | sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \ + | strongarm \ + | tahoe | thumb | tic80 | tron \ + | v850 \ + | we32k \ + | x86 | xscale \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alphapca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armv*-* \ + | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c54x-* \ + | clipper-* | cray2-* | cydra-* \ + | d10v-* | d30v-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | m32r-* \ + | m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | mcore-* \ + | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \ + | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipsel-* \ + | mipsle-* | mipstx39-* | mipstx39el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | s390-* | s390x-* \ + | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \ + | sparc-* | sparc64-* | sparc86x-* | sparclite-* \ + | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* \ + | t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \ + | v850-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xmp-* | xps100-* | xscale-* \ + | ymp-* \ + | z8k-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | ymp) + basic_machine=ymp-cray + os=-unicos + ;; + cray2) + basic_machine=cray2-cray + os=-unicos + ;; + [cjt]90) + basic_machine=${basic_machine}-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mipsel*-linux*) + basic_machine=mipsel-unknown + os=-linux-gnu + ;; + mips*-linux*) + basic_machine=mips-unknown + os=-linux-gnu + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + mmix*) + basic_machine=mmix-knuth + os=-mmixware + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexgen) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon) + basic_machine=i686-pc + ;; + pentiumii | pentium2) + basic_machine=i686-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sparclite-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=t3e-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + windows32) + basic_machine=i386-pc + os=-windows32-msvcrt + ;; + xmp) + basic_machine=xmp-cray + os=-unicos + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + mips) + if [ x$os = x-linux-gnu ]; then + basic_machine=mips-unknown + else + basic_machine=mips-mips + fi + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh3 | sh4 | sh3eb | sh4eb) + basic_machine=sh-unknown + ;; + sparc | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + c4x*) + basic_machine=c4x-none + os=-coff + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto*) + os=-nto-qnx + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/configure b/configure new file mode 100755 index 000000000..b7be21105 --- /dev/null +++ b/configure @@ -0,0 +1,6937 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.57. +# +# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +# Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_config_libobj_dir=. +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_unique_file="libasn1parser/asn1p_y.y" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA PACKAGE VERSION EXEEXT OBJEXT ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO AMTAR install_sh INSTALL_STRIP_PROGRAM AWK SET_MAKE AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH DEPDIR PATH MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT RANLIB ac_ct_RANLIB CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC am__include am__quote CCDEPMODE LN_S LIBTOOL CONFIGURE_DEPENDS CPP YACC LEX LEXLIB LEX_OUTPUT_ROOT AR ADD_CFLAGS EGREP LIBOBJS LTLIBOBJS' +ac_subst_files='' + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +ac_prev= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_option in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +_ACEOF + + cat <<_ACEOF +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] + --target=TARGET configure for building compilers for TARGET [HOST] +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-dependency-tracking Speeds up one-time builds + --enable-dependency-tracking Do not reject slow dependency extractors + --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer + --enable-shared=PKGS build shared libraries default=yes + --enable-static=PKGS build static libraries default=yes + --enable-fast-install=PKGS optimize for fast installation default=yes + --disable-libtool-lock avoid locking (might break parallel builds) + --disable-autoconf disable automatic generation of configure script + --enable-Werror abort compilation after any C compiler warning + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-gnu-ld assume the C compiler uses GNU ld default=no + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style configure. + if test -f $ac_srcdir/configure.gnu; then + echo + $SHELL $ac_srcdir/configure.gnu --help=recursive + elif test -f $ac_srcdir/configure; then + echo + $SHELL $ac_srcdir/configure --help=recursive + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd $ac_popdir + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit 0 +fi +exec 5>config.log +cat >&5 <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.57. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" +done + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_sep= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------- ## +## Output files. ## +## ------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + sed "/^$/d" confdefs.h | sort + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core core.* *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" + eval ac_new_val="\$ac_env_${ac_var}_value" + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + + + + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f $ac_dir/shtool; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# Make sure we can run config.sub. +$ac_config_sub sun4 >/dev/null 2>&1 || + { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 +echo "$as_me: error: cannot run $ac_config_sub" >&2;} + { (exit 1); exit 1; }; } + +echo "$as_me:$LINENO: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6 +if test "${ac_cv_build+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_build_alias=$build_alias +test -z "$ac_cv_build_alias" && + ac_cv_build_alias=`$ac_config_guess` +test -z "$ac_cv_build_alias" && + { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6 +build=$ac_cv_build +build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +echo "$as_me:$LINENO: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6 +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_host_alias=$host_alias +test -z "$ac_cv_host_alias" && + ac_cv_host_alias=$ac_cv_build_alias +ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6 +host=$ac_cv_host +host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +echo "$as_me:$LINENO: checking target system type" >&5 +echo $ECHO_N "checking target system type... $ECHO_C" >&6 +if test "${ac_cv_target+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_target_alias=$target_alias +test "x$ac_cv_target_alias" = "x" && + ac_cv_target_alias=$ac_cv_host_alias +ac_cv_target=`$ac_config_sub $ac_cv_target_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_target_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_target_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_target" >&5 +echo "${ECHO_T}$ac_cv_target" >&6 +target=$ac_cv_target +target_cpu=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +target_vendor=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +target_os=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +test -n "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&5 +echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&2;} + { (exit 1); exit 1; }; } + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! +Check your system clock" >&5 +echo "$as_me: error: newly created file is older than distributed files! +Check your system clock" >&2;} + { (exit 1); exit 1; }; } +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +test "$program_prefix" != NONE && + program_transform_name="s,^,$program_prefix,;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s,\$,$program_suffix,;$program_transform_name" +# Double any \ or $. echo might interpret backslashes. +# By default was `s,x,x', remove it if useless. +cat <<\_ACEOF >conftest.sed +s/[\\$]/&&/g;s/;s,x,x,$// +_ACEOF +program_transform_name=`echo $program_transform_name | sed -f conftest.sed` +rm conftest.sed + + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`CDPATH=:; cd $ac_aux_dir && pwd` + +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + am_backtick='`' + { echo "$as_me:$LINENO: WARNING: ${am_backtick}missing' script is too old or missing" >&5 +echo "$as_me: WARNING: ${am_backtick}missing' script is too old or missing" >&2;} +fi + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AWK+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + echo "$as_me:$LINENO: result: $AWK" >&5 +echo "${ECHO_T}$AWK" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$AWK" && break +done + +echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +all: + @echo 'ac_maketemp="$(MAKE)"' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + +# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then + enableval="$enable_dependency_tracking" + +fi; +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + + +if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + + +rm -f .deps 2>/dev/null +mkdir .deps 2>/dev/null +if test -d .deps; then + DEPDIR=.deps +else + # MS-DOS does not allow filenames that begin with a dot. + DEPDIR=_deps +fi +rmdir .deps 2>/dev/null + + +# test to see if srcdir already configured +if test "`CDPATH=:; cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { (exit 1); exit 1; }; } +fi + +# Define the identity of the package. +PACKAGE=asn1c +VERSION=0.8.10 + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + + +# Autoconf 2.50 wants to disallow AM_ names. We explicitly allow +# the ones we care about. + +# Autoconf 2.50 always computes EXEEXT. However we need to be +# compatible with 2.13, for now. So we always define EXEEXT, but we +# don't compute it. + +# Similar for OBJEXT -- only we only use OBJEXT if the user actually +# requests that it be used. This is a bit dumb. +: ${OBJEXT=o} + + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +install_sh=${install_sh-"$am_aux_dir/install-sh"} + +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. + + + + +echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 +echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6 + # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then + enableval="$enable_maintainer_mode" + USE_MAINTAINER_MODE=$enableval +else + USE_MAINTAINER_MODE=no +fi; + echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 +echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6 + + +if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + MAINT=$MAINTAINER_MODE_TRUE + + + +# Check whether --enable-shared or --disable-shared was given. +if test "${enable_shared+set}" = set; then + enableval="$enable_shared" + p=${PACKAGE-default} +case "$enableval" in +yes) enable_shared=yes ;; +no) enable_shared=no ;; +*) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac +else + enable_shared=yes +fi; +# Check whether --enable-static or --disable-static was given. +if test "${enable_static+set}" = set; then + enableval="$enable_static" + p=${PACKAGE-default} +case "$enableval" in +yes) enable_static=yes ;; +no) enable_static=no ;; +*) + enable_static=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac +else + enable_static=yes +fi; +# Check whether --enable-fast-install or --disable-fast-install was given. +if test "${enable_fast_install+set}" = set; then + enableval="$enable_fast_install" + p=${PACKAGE-default} +case "$enableval" in +yes) enable_fast_install=yes ;; +no) enable_fast_install=no ;; +*) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac +else + enable_fast_install=yes +fi; +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + RANLIB=$ac_ct_RANLIB +else + RANLIB="$ac_cv_prog_RANLIB" +fi + + + ac_config_commands="$ac_config_commands default-1" + +am_make=${MAKE-make} +cat > confinc << 'END' +doit: + @echo done +END +# If we don't find an include directive, just comment out the code. +echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 +am__include='#' +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | fgrep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote='"' + _am_result=BSD + fi +fi + + +echo "$as_me:$LINENO: result: $_am_result" >&5 +echo "${ECHO_T}$_am_result" >&6 +rm -f confinc confmf + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +echo "$as_me:$LINENO: checking for C compiler default output" >&5 +echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. + +# Be careful to initialize this variable, since it used to be cached. +# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. +ac_cv_exeext= +# b.out is created by i960 compilers. +for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) + ;; + conftest.$ac_ext ) + # This is the source file. + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool, + # but it would be cool to find out if it's true. Does anybody + # maintain Libtool? --akim. + export ac_cv_exeext + break;; + * ) + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cc_g=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + ''\ + '#include ' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + echo '#include "conftest.h"' > conftest.c + echo 'int i;' > conftest.h + echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=conftest.c object=conftest.o \ + depfile=conftest.Po tmpdepfile=conftest.TPo \ + $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 && + grep conftest.h conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 +CCDEPMODE="depmode=$am_cv_CC_dependencies_compiler_type" + + + +# Check whether --with-gnu-ld or --without-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval="$with_gnu_ld" + test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi; +ac_prog=ld +if test "$ac_cv_c_compiler_gnu" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo "$as_me:$LINENO: checking for ld used by GCC" >&5 +echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6 + ac_prog=`($CC -print-prog-name=ld) 2>&5` + case "$ac_prog" in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + echo "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 +else + echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 +fi +if test "${ac_cv_path_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + ac_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + ac_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$ac_cv_path_LD" +if test -n "$LD"; then + echo "$as_me:$LINENO: result: $LD" >&5 +echo "${ECHO_T}$LD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 +if test "${ac_cv_prog_gnu_ld+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + ac_cv_prog_gnu_ld=yes +else + ac_cv_prog_gnu_ld=no +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_gnu_ld" >&5 +echo "${ECHO_T}$ac_cv_prog_gnu_ld" >&6 + + +echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 +echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6 +if test "${ac_cv_path_NM+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$NM"; then + # Let the user override the test. + ac_cv_path_NM="$NM" +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + ac_cv_path_NM="$ac_dir/nm -B" + break + elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + ac_cv_path_NM="$ac_dir/nm -p" + break + else + ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm +fi +fi + +NM="$ac_cv_path_NM" +echo "$as_me:$LINENO: result: $NM" >&5 +echo "${ECHO_T}$NM" >&6 + +echo "$as_me:$LINENO: checking whether ln -s works" >&5 +echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:$LINENO: result: no, using $LN_S" >&5 +echo "${ECHO_T}no, using $LN_S" >&6 +fi + + + +case "$target" in +NONE) lt_target="$host" ;; +*) lt_target="$target" ;; +esac + +# Check for any special flags to pass to ltconfig. +libtool_flags="--cache-file=$cache_file" +test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared" +test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static" +test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install" +test "$ac_cv_c_compiler_gnu" = yes && libtool_flags="$libtool_flags --with-gcc" +test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld" + + +# Check whether --enable-libtool-lock or --disable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval="$enable_libtool_lock" + +fi; +test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock" +test x"$silent" = xyes && libtool_flags="$libtool_flags --silent" + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case "$lt_target" in +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 3024 "configure"' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 +echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 +if test "${lt_cv_cc_needs_belf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + lt_cv_cc_needs_belf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +lt_cv_cc_needs_belf=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 +echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; + + +esac + + +# Save cache, so that ltconfig can load it +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +# Actually configure libtool. ac_aux_dir is where install-sh is found. +CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \ +LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \ +LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \ +DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \ +${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \ +$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \ +|| { { echo "$as_me:$LINENO: error: libtool configure failed" >&5 +echo "$as_me: error: libtool configure failed" >&2;} + { (exit 1); exit 1; }; } + +# Reload cache, that may have been modified by ltconfig +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + +# Redirect the config.log output again, so that the ltconfig log is not +# clobbered by the next message. +exec 5>>./config.log + + +# Check whether --enable-autoconf or --disable-autoconf was given. +if test "${enable_autoconf+set}" = set; then + enableval="$enable_autoconf" + enable_autoconf=$enableval +else + enable_autoconf=yes + +fi; +# Extract the first word of "autoconf", so it can be a program name with args. +set dummy autoconf; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_AUTOCONF+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $AUTOCONF in + [\\/]* | ?:[\\/]*) + ac_cv_path_AUTOCONF="$AUTOCONF" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_AUTOCONF="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_path_AUTOCONF" && ac_cv_path_AUTOCONF="@echo autoconf not available" + ;; +esac +fi +AUTOCONF=$ac_cv_path_AUTOCONF + +if test -n "$AUTOCONF"; then + echo "$as_me:$LINENO: result: $AUTOCONF" >&5 +echo "${ECHO_T}$AUTOCONF" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +# Extract the first word of "autoheader", so it can be a program name with args. +set dummy autoheader; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_AUTOHEADER+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $AUTOHEADER in + [\\/]* | ?:[\\/]*) + ac_cv_path_AUTOHEADER="$AUTOHEADER" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_AUTOHEADER="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_path_AUTOHEADER" && ac_cv_path_AUTOHEADER="@echo autoheader not available" + ;; +esac +fi +AUTOHEADER=$ac_cv_path_AUTOHEADER + +if test -n "$AUTOHEADER"; then + echo "$as_me:$LINENO: result: $AUTOHEADER" >&5 +echo "${ECHO_T}$AUTOHEADER" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +if test -z "$AUTOCONF"; then enable_autoconf=no ; fi +if test -z "$AUTOHEADER"; then enable_autoconf=no ; fi +if test x$enable_autoconf = xyes; then + CONFIGURE_DEPENDS="configure.in aclocal.m4" +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cc_g=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + ''\ + '#include ' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + echo '#include "conftest.h"' > conftest.c + echo 'int i;' > conftest.h + echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=conftest.c object=conftest.o \ + depfile=conftest.Po tmpdepfile=conftest.TPo \ + $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 && + grep conftest.h conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 +CCDEPMODE="depmode=$am_cv_CC_dependencies_compiler_type" + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6 +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo "$as_me:$LINENO: checking whether ln -s works" >&5 +echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:$LINENO: result: no, using $LN_S" >&5 +echo "${ECHO_T}no, using $LN_S" >&6 +fi + +echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +all: + @echo 'ac_maketemp="$(MAKE)"' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + +for ac_prog in 'bison -y' byacc +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_YACC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$YACC"; then + ac_cv_prog_YACC="$YACC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_YACC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +YACC=$ac_cv_prog_YACC +if test -n "$YACC"; then + echo "$as_me:$LINENO: result: $YACC" >&5 +echo "${ECHO_T}$YACC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$YACC" && break +done +test -n "$YACC" || YACC="yacc" + + +for ac_prog in flex lex +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_LEX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$LEX"; then + ac_cv_prog_LEX="$LEX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LEX="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +LEX=$ac_cv_prog_LEX +if test -n "$LEX"; then + echo "$as_me:$LINENO: result: $LEX" >&5 +echo "${ECHO_T}$LEX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$LEX" && break +done +test -n "$LEX" || LEX="${am_missing_run}flex" + +for ac_prog in flex lex +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_LEX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$LEX"; then + ac_cv_prog_LEX="$LEX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LEX="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +LEX=$ac_cv_prog_LEX +if test -n "$LEX"; then + echo "$as_me:$LINENO: result: $LEX" >&5 +echo "${ECHO_T}$LEX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$LEX" && break +done +test -n "$LEX" || LEX=":" + +if test -z "$LEXLIB" +then + echo "$as_me:$LINENO: checking for yywrap in -lfl" >&5 +echo $ECHO_N "checking for yywrap in -lfl... $ECHO_C" >&6 +if test "${ac_cv_lib_fl_yywrap+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char yywrap (); +int +main () +{ +yywrap (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_fl_yywrap=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_fl_yywrap=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_fl_yywrap" >&5 +echo "${ECHO_T}$ac_cv_lib_fl_yywrap" >&6 +if test $ac_cv_lib_fl_yywrap = yes; then + LEXLIB="-lfl" +else + echo "$as_me:$LINENO: checking for yywrap in -ll" >&5 +echo $ECHO_N "checking for yywrap in -ll... $ECHO_C" >&6 +if test "${ac_cv_lib_l_yywrap+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ll $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char yywrap (); +int +main () +{ +yywrap (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_l_yywrap=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_l_yywrap=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_l_yywrap" >&5 +echo "${ECHO_T}$ac_cv_lib_l_yywrap" >&6 +if test $ac_cv_lib_l_yywrap = yes; then + LEXLIB="-ll" +fi + +fi + +fi + +if test "x$LEX" != "x:"; then + echo "$as_me:$LINENO: checking lex output file root" >&5 +echo $ECHO_N "checking lex output file root... $ECHO_C" >&6 +if test "${ac_cv_prog_lex_root+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # The minimal lex program is just a single line: %%. But some broken lexes +# (Solaris, I think it was) want two %% lines, so accommodate them. +cat >conftest.l <<_ACEOF +%% +%% +_ACEOF +{ (eval echo "$as_me:$LINENO: \"$LEX conftest.l\"") >&5 + (eval $LEX conftest.l) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +if test -f lex.yy.c; then + ac_cv_prog_lex_root=lex.yy +elif test -f lexyy.c; then + ac_cv_prog_lex_root=lexyy +else + { { echo "$as_me:$LINENO: error: cannot find output from $LEX; giving up" >&5 +echo "$as_me: error: cannot find output from $LEX; giving up" >&2;} + { (exit 1); exit 1; }; } +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_lex_root" >&5 +echo "${ECHO_T}$ac_cv_prog_lex_root" >&6 +rm -f conftest.l +LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root + +echo "$as_me:$LINENO: checking whether yytext is a pointer" >&5 +echo $ECHO_N "checking whether yytext is a pointer... $ECHO_C" >&6 +if test "${ac_cv_prog_lex_yytext_pointer+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # POSIX says lex can declare yytext either as a pointer or an array; the +# default is implementation-dependent. Figure out which it is, since +# not all implementations provide the %pointer and %array declarations. +ac_cv_prog_lex_yytext_pointer=no +echo 'extern char *yytext;' >>$LEX_OUTPUT_ROOT.c +ac_save_LIBS=$LIBS +LIBS="$LIBS $LEXLIB" +cat >conftest.$ac_ext <<_ACEOF +`cat $LEX_OUTPUT_ROOT.c` +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_lex_yytext_pointer=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_save_LIBS +rm -f "${LEX_OUTPUT_ROOT}.c" + +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_lex_yytext_pointer" >&5 +echo "${ECHO_T}$ac_cv_prog_lex_yytext_pointer" >&6 +if test $ac_cv_prog_lex_yytext_pointer = yes; then + +cat >>confdefs.h <<\_ACEOF +#define YYTEXT_POINTER 1 +_ACEOF + +fi + +fi +# Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $AR in + [\\/]* | ?:[\\/]*) + ac_cv_path_AR="$AR" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_dummy="$PATH:/usr/ucb:/usr/ccs/bin" +for as_dir in $as_dummy +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_AR="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_path_AR" && ac_cv_path_AR="ar" + ;; +esac +fi +AR=$ac_cv_path_AR + +if test -n "$AR"; then + echo "$as_me:$LINENO: result: $AR" >&5 +echo "${ECHO_T}$AR" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + +case "$build" in +*cygwin*) + case "$target" in + *mingw*) + CC="$CC -mno-cygwin" + esac ;; +esac + +# Check whether --enable-autoconf or --disable-autoconf was given. +if test "${enable_autoconf+set}" = set; then + enableval="$enable_autoconf" + ADD_CFLAGS="-Werror" +fi; + + +case "$GCC" in + yes) + CFLAGS="$CFLAGS -Wall" + CFLAGS="$CFLAGS -Wshadow" + CFLAGS="$CFLAGS -Wcast-qual" + CFLAGS="$CFLAGS -Wcast-align" + CFLAGS="$CFLAGS -Wmissing-prototypes" + CFLAGS="$CFLAGS -Wmissing-declarations" + CFLAGS="$CFLAGS -Wredundant-decls" + CFLAGS="$CFLAGS -Wnested-externs" + ;; +esac + + + +echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_prog_egrep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 +echo "${ECHO_T}$ac_cv_prog_egrep" >&6 + EGREP=$ac_cv_prog_egrep + + +echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + exit(2); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Header=no" +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +for ac_header in errno.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5 +echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6 +if test "${ac_cv_c_bigendian+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # See if sys/param.h defines the BYTE_ORDER macro. +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include + +int +main () +{ +#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN + bogus endian macros +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + # It does; now see whether it defined to BIG_ENDIAN or not. +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include + +int +main () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_bigendian=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_c_bigendian=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +# It does not; compile a test program. +if test "$cross_compiling" = yes; then + # try to guess the endianness by grepping values into an object file + ac_cv_c_bigendian=unknown + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; +short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; +void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; } +short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; +short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; +void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; } +int +main () +{ + _ascii (); _ebcdic (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + if grep BIGenDianSyS conftest.$ac_objext >/dev/null ; then + ac_cv_c_bigendian=yes +fi +if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi +fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +int +main () +{ + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long l; + char c[sizeof (long)]; + } u; + u.l = 1; + exit (u.c[sizeof (long) - 1] == 1); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_bigendian=no +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_c_bigendian=yes +fi +rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5 +echo "${ECHO_T}$ac_cv_c_bigendian" >&6 +case $ac_cv_c_bigendian in + yes) + +cat >>confdefs.h <<\_ACEOF +#define WORDS_BIGENDIAN 1 +_ACEOF + ;; + no) + ;; + *) + { { echo "$as_me:$LINENO: error: unknown endianness +presetting ac_cv_c_bigendian=no (or yes) will help" >&5 +echo "$as_me: error: unknown endianness +presetting ac_cv_c_bigendian=no (or yes) will help" >&2;} + { (exit 1); exit 1; }; } ;; +esac + +echo "$as_me:$LINENO: checking for off_t" >&5 +echo $ECHO_N "checking for off_t... $ECHO_C" >&6 +if test "${ac_cv_type_off_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if ((off_t *) 0) + return 0; +if (sizeof (off_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_off_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_off_t=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5 +echo "${ECHO_T}$ac_cv_type_off_t" >&6 +if test $ac_cv_type_off_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define off_t long +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for size_t" >&5 +echo $ECHO_N "checking for size_t... $ECHO_C" >&6 +if test "${ac_cv_type_size_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if ((size_t *) 0) + return 0; +if (sizeof (size_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_size_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_size_t=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 +echo "${ECHO_T}$ac_cv_type_size_t" >&6 +if test $ac_cv_type_size_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned +_ACEOF + +fi + +echo "$as_me:$LINENO: checking whether struct tm is in sys/time.h or time.h" >&5 +echo $ECHO_N "checking whether struct tm is in sys/time.h or time.h... $ECHO_C" >&6 +if test "${ac_cv_struct_tm+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include + +int +main () +{ +struct tm *tp; tp->tm_sec; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_struct_tm=time.h +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_struct_tm=sys/time.h +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_struct_tm" >&5 +echo "${ECHO_T}$ac_cv_struct_tm" >&6 +if test $ac_cv_struct_tm = sys/time.h; then + +cat >>confdefs.h <<\_ACEOF +#define TM_IN_SYS_TIME 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for intmax_t" >&5 +echo $ECHO_N "checking for intmax_t... $ECHO_C" >&6 +if test "${ac_cv_type_intmax_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if ((intmax_t *) 0) + return 0; +if (sizeof (intmax_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_intmax_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_intmax_t=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_intmax_t" >&5 +echo "${ECHO_T}$ac_cv_type_intmax_t" >&6 +if test $ac_cv_type_intmax_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define intmax_t int64_t +_ACEOF + +fi + + + + +for ac_func in strtoimax strtoll +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + + + + ac_config_headers="$ac_config_headers config.h" + + + ac_config_files="$ac_config_files libasn1compiler/Makefile skeletons/tests/Makefile libasn1parser/Makefile libasn1print/Makefile asn1c/tests/Makefile libasn1fix/Makefile skeletons/Makefile examples/Makefile tests/Makefile asn1c/Makefile doc/Makefile Makefile" +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by $as_me, which was +generated by GNU Autoconf 2.57. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.57, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +INSTALL="$INSTALL" +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_shift=: + ;; + -*) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +# +# INIT-COMMANDS section. +# + +AMDEP_TRUE="$AMDEP_TRUE" +ac_aux_dir="$ac_aux_dir" + +_ACEOF + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "libasn1compiler/Makefile" ) CONFIG_FILES="$CONFIG_FILES libasn1compiler/Makefile" ;; + "skeletons/tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES skeletons/tests/Makefile" ;; + "libasn1parser/Makefile" ) CONFIG_FILES="$CONFIG_FILES libasn1parser/Makefile" ;; + "libasn1print/Makefile" ) CONFIG_FILES="$CONFIG_FILES libasn1print/Makefile" ;; + "asn1c/tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES asn1c/tests/Makefile" ;; + "libasn1fix/Makefile" ) CONFIG_FILES="$CONFIG_FILES libasn1fix/Makefile" ;; + "skeletons/Makefile" ) CONFIG_FILES="$CONFIG_FILES skeletons/Makefile" ;; + "examples/Makefile" ) CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; + "tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; + "asn1c/Makefile" ) CONFIG_FILES="$CONFIG_FILES asn1c/Makefile" ;; + "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; + "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@build@,$build,;t t +s,@build_cpu@,$build_cpu,;t t +s,@build_vendor@,$build_vendor,;t t +s,@build_os@,$build_os,;t t +s,@host@,$host,;t t +s,@host_cpu@,$host_cpu,;t t +s,@host_vendor@,$host_vendor,;t t +s,@host_os@,$host_os,;t t +s,@target@,$target,;t t +s,@target_cpu@,$target_cpu,;t t +s,@target_vendor@,$target_vendor,;t t +s,@target_os@,$target_os,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@PACKAGE@,$PACKAGE,;t t +s,@VERSION@,$VERSION,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@ACLOCAL@,$ACLOCAL,;t t +s,@AUTOCONF@,$AUTOCONF,;t t +s,@AUTOMAKE@,$AUTOMAKE,;t t +s,@AUTOHEADER@,$AUTOHEADER,;t t +s,@MAKEINFO@,$MAKEINFO,;t t +s,@AMTAR@,$AMTAR,;t t +s,@install_sh@,$install_sh,;t t +s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t +s,@AWK@,$AWK,;t t +s,@SET_MAKE@,$SET_MAKE,;t t +s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t +s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t +s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t +s,@DEPDIR@,$DEPDIR,;t t +s,@PATH@,$PATH,;t t +s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t +s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t +s,@MAINT@,$MAINT,;t t +s,@RANLIB@,$RANLIB,;t t +s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@am__include@,$am__include,;t t +s,@am__quote@,$am__quote,;t t +s,@CCDEPMODE@,$CCDEPMODE,;t t +s,@LN_S@,$LN_S,;t t +s,@LIBTOOL@,$LIBTOOL,;t t +s,@CONFIGURE_DEPENDS@,$CONFIGURE_DEPENDS,;t t +s,@CPP@,$CPP,;t t +s,@YACC@,$YACC,;t t +s,@LEX@,$LEX,;t t +s,@LEXLIB@,$LEXLIB,;t t +s,@LEX_OUTPUT_ROOT@,$LEX_OUTPUT_ROOT,;t t +s,@AR@,$AR,;t t +s,@ADD_CFLAGS@,$ADD_CFLAGS,;t t +s,@EGREP@,$EGREP,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@abs_srcdir@,$ac_abs_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t +s,@builddir@,$ac_builddir,;t t +s,@abs_builddir@,$ac_abs_builddir,;t t +s,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + +# +# CONFIG_HEADER section. +# + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='[ ].*$,\1#\2' +ac_dC=' ' +ac_dD=',;t' +# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='$,\1#\2define\3' +ac_uC=' ' +ac_uD=',;t' + +for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } + # Remove the trailing spaces. + sed 's/[ ]*$//' $ac_file_inputs >$tmp/in + +_ACEOF + +# Transform confdefs.h into two sed scripts, `conftest.defines' and +# `conftest.undefs', that substitutes the proper values into +# config.h.in to produce config.h. The first handles `#define' +# templates, and the second `#undef' templates. +# And first: Protect against being on the right side of a sed subst in +# config.status. Protect against being in an unquoted here document +# in config.status. +rm -f conftest.defines conftest.undefs +# Using a here document instead of a string reduces the quoting nightmare. +# Putting comments in sed scripts is not portable. +# +# `end' is used to avoid that the second main sed command (meant for +# 0-ary CPP macros) applies to n-ary macro definitions. +# See the Autoconf documentation for `clear'. +cat >confdef2sed.sed <<\_ACEOF +s/[\\&,]/\\&/g +s,[\\$`],\\&,g +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp +t end +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp +: end +_ACEOF +# If some macros were called several times there might be several times +# the same #defines, which is useless. Nevertheless, we may not want to +# sort them, since we want the *last* AC-DEFINE to be honored. +uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines +sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs +rm -f confdef2sed.sed + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >>conftest.undefs <<\_ACEOF +s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, +_ACEOF + +# Break up conftest.defines because some shells have a limit on the size +# of here documents, and old seds have small limits too (100 cmds). +echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS +echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS +echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS +echo ' :' >>$CONFIG_STATUS +rm -f conftest.tail +while grep . conftest.defines >/dev/null +do + # Write a limited-size here document to $tmp/defines.sed. + echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#define' lines. + echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS + echo 'CEOF + sed -f $tmp/defines.sed $tmp/in >$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in +' >>$CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail + rm -f conftest.defines + mv conftest.tail conftest.defines +done +rm -f conftest.defines +echo ' fi # grep' >>$CONFIG_STATUS +echo >>$CONFIG_STATUS + +# Break up conftest.undefs because some shells have a limit on the size +# of here documents, and old seds have small limits too (100 cmds). +echo ' # Handle all the #undef templates' >>$CONFIG_STATUS +rm -f conftest.tail +while grep . conftest.undefs >/dev/null +do + # Write a limited-size here document to $tmp/undefs.sed. + echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#undef' + echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS + echo 'CEOF + sed -f $tmp/undefs.sed $tmp/in >$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in +' >>$CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail + rm -f conftest.undefs + mv conftest.tail conftest.undefs +done +rm -f conftest.undefs + +cat >>$CONFIG_STATUS <<\_ACEOF + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + echo "/* Generated by configure. */" >$tmp/config.h + else + echo "/* $ac_file. Generated by configure. */" >$tmp/config.h + fi + cat $tmp/in >>$tmp/config.h + rm -f $tmp/in + if test x"$ac_file" != x-; then + if diff $ac_file $tmp/config.h >/dev/null 2>&1; then + { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +echo "$as_me: $ac_file is unchanged" >&6;} + else + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + rm -f $ac_file + mv $tmp/config.h $ac_file + fi + else + cat $tmp/config.h + rm -f $tmp/config.h + fi + # Run the commands associated with the file. + case $ac_file in + config.h ) # update the timestamp +echo timestamp >"./stamp-h1" + ;; + esac +done +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + +# +# CONFIG_COMMANDS section. +# +for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue + ac_dest=`echo "$ac_file" | sed 's,:.*,,'` + ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_dir=`(dirname "$ac_dest") 2>/dev/null || +$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_dest" : 'X\(//\)[^/]' \| \ + X"$ac_dest" : 'X\(//\)$' \| \ + X"$ac_dest" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_dest" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + + { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 +echo "$as_me: executing $ac_dest commands" >&6;} + case $ac_dest in + default-1 ) +test x"$AMDEP_TRUE" != x"" || +for mf in $CONFIG_FILES; do + case "$mf" in + Makefile) dirpart=.;; + */Makefile) dirpart=`echo "$mf" | sed -e 's|/[^/]*$||'`;; + *) continue;; + esac + grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue + # Extract the definition of DEP_FILES from the Makefile without + # running `make'. + DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` + test -z "$DEPDIR" && continue + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n -e '/^U = / s///p' < "$mf"` + test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" + # We invoke sed twice because it is the simplest approach to + # changing $(DEPDIR) to its actual value in the expansion. + for file in `sed -n -e ' + /^DEP_FILES = .*\\\\$/ { + s/^DEP_FILES = // + :loop + s/\\\\$// + p + n + /\\\\$/ b loop + p + } + /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`echo "$file" | sed -e 's|/[^/]*$||'` + $ac_aux_dir/mkinstalldirs "$dirpart/$fdir" > /dev/null 2>&1 + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done + ;; + esac +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi + + diff --git a/configure.in b/configure.in new file mode 100644 index 000000000..a4ad1b062 --- /dev/null +++ b/configure.in @@ -0,0 +1,95 @@ +dnl Process this file with autoconf to produce a configure script. +AC_INIT(libasn1parser/asn1p_y.y) +AC_CANONICAL_SYSTEM +AC_PREREQ(2.53) +AM_INIT_AUTOMAKE(asn1c, 0.8.10) + +AC_SUBST(PATH) + +AM_MAINTAINER_MODE + +AM_PROG_LIBTOOL + +dnl *** Autoconf support *** +AC_ARG_ENABLE(autoconf, + [ --disable-autoconf disable automatic generation of configure script ], + enable_autoconf=$enableval, enable_autoconf=yes +) +AC_PATH_PROG(AUTOCONF, autoconf, @echo autoconf not available) +AC_PATH_PROG(AUTOHEADER, autoheader, @echo autoheader not available) +if test -z "$AUTOCONF"; then enable_autoconf=no ; fi +if test -z "$AUTOHEADER"; then enable_autoconf=no ; fi +if test x$enable_autoconf = xyes; then + CONFIGURE_DEPENDS="configure.in aclocal.m4" +fi +AC_SUBST(CONFIGURE_DEPENDS) + +dnl Checks for programs. +AC_PROG_CC +AC_PROG_CPP +AC_PROG_INSTALL +AC_PROG_LN_S +AC_PROG_MAKE_SET +AC_PROG_YACC +AM_PROG_LEX +AC_PATH_PROG(AR, ar, ar, $PATH:/usr/ucb:/usr/ccs/bin) + +dnl *** Building mingw32 with cygwin compiler *** +case "$build" in +*cygwin*) + case "$target" in + *mingw*) + CC="$CC -mno-cygwin" + esac ;; +esac + +AC_ARG_ENABLE(autoconf, + [ --enable-Werror abort compilation after any C compiler warning], + ADD_CFLAGS="-Werror") +AC_SUBST(ADD_CFLAGS) + +dnl Add these flags if we're using GCC. +case "$GCC" in + yes) + CFLAGS="$CFLAGS -Wall" + CFLAGS="$CFLAGS -Wshadow" + CFLAGS="$CFLAGS -Wcast-qual" + CFLAGS="$CFLAGS -Wcast-align" + CFLAGS="$CFLAGS -Wmissing-prototypes" + CFLAGS="$CFLAGS -Wmissing-declarations" + CFLAGS="$CFLAGS -Wredundant-decls" + CFLAGS="$CFLAGS -Wnested-externs" + ;; +esac + + +dnl Checks for header files. +AC_HEADER_STDC +AC_CHECK_HEADERS(errno.h) + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_BIGENDIAN +AC_TYPE_OFF_T +AC_TYPE_SIZE_T +AC_STRUCT_TM +AC_CHECK_TYPE(intmax_t, int64_t) + +AC_CHECK_FUNCS(strtoimax strtoll) + +AM_CONFIG_HEADER(config.h) + +AC_OUTPUT( \ +libasn1compiler/Makefile \ +skeletons/tests/Makefile \ +libasn1parser/Makefile \ +libasn1print/Makefile \ +asn1c/tests/Makefile \ +libasn1fix/Makefile \ +skeletons/Makefile \ +examples/Makefile \ +tests/Makefile \ +asn1c/Makefile \ +doc/Makefile \ +Makefile \ +) + diff --git a/depcomp b/depcomp new file mode 100755 index 000000000..65899658e --- /dev/null +++ b/depcomp @@ -0,0 +1,411 @@ +#! /bin/sh + +# depcomp - compile a program generating dependencies as side-effects +# Copyright 1999, 2000 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi +# `libtool' can also be set to `yes' or `no'. + +depfile=${depfile-`echo "$object" | sed 's,\([^/]*\)$,.deps/\1,;s/\.\([^.]*\)$/.P\1/'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. + "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> $depfile + echo >> $depfile + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> $depfile + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. This file always lives in the current directory. + # Also, the AIX compiler puts `$object:' at the start of each line; + # $object doesn't have directory information. + stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'` + tmpdepfile="$stripped.u" + outname="$stripped.o" + if test "$libtool" = yes; then + "$@" -Wc,-M + else + "$@" -M + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + + if test -f "$tmpdepfile"; then + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" + sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +tru64) + # The Tru64 AIX compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + + tmpdepfile1="$object.d" + tmpdepfile2=`echo "$object" | sed -e 's/.o$/.d/'` + if test "$libtool" = yes; then + "$@" -Wc,-MD + else + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + if test -f "$tmpdepfile1"; then + tmpdepfile="$tmpdepfile1" + else + tmpdepfile="$tmpdepfile2" + fi + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a space and a tab in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the proprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + test -z "$dashmflag" && dashmflag=-M + ( IFS=" " + case " $* " in + *" --mode=compile "*) # this is libtool, let us make it quiet + for arg + do # cycle over the arguments + case "$arg" in + "--mode=compile") + # insert --quiet before "--mode=compile" + set fnord "$@" --quiet + shift # fnord + ;; + esac + set fnord "$@" "$arg" + shift # fnord + shift # "$arg" + done + ;; + esac + "$@" $dashmflag | sed 's:^[^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + ) & + proc=$! + "$@" + stat=$? + wait "$proc" + if test "$stat" != 0; then exit $stat; fi + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + # X makedepend + ( + shift + cleared=no + for arg in "$@"; do + case $cleared in no) + set ""; shift + cleared=yes + esac + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift;; + -*) + ;; + *) + set fnord "$@" "$arg"; shift;; + esac + done + obj_suffix="`echo $object | sed 's/^.*\././'`" + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} 2>/dev/null -o"$obj_suffix" -f"$tmpdepfile" "$@" + ) & + proc=$! + "$@" + stat=$? + wait "$proc" + if test "$stat" != 0; then exit $stat; fi + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tail +3 "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the proprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + ( IFS=" " + case " $* " in + *" --mode=compile "*) + for arg + do # cycle over the arguments + case $arg in + "--mode=compile") + # insert --quiet before "--mode=compile" + set fnord "$@" --quiet + shift # fnord + ;; + esac + set fnord "$@" "$arg" + shift # fnord + shift # "$arg" + done + ;; + esac + "$@" -E | + sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + ) & + proc=$! + "$@" + stat=$? + wait "$proc" + if test "$stat" != 0; then exit $stat; fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the proprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + ( IFS=" " + case " $* " in + *" --mode=compile "*) + for arg + do # cycle over the arguments + case $arg in + "--mode=compile") + # insert --quiet before "--mode=compile" + set fnord "$@" --quiet + shift # fnord + ;; + esac + set fnord "$@" "$arg" + shift # fnord + shift # "$arg" + done + ;; + esac + "$@" -E | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" + ) & + proc=$! + "$@" + stat=$? + wait "$proc" + if test "$stat" != 0; then exit $stat; fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 000000000..be8cd82c1 --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,3 @@ + +EXTRA_DIST = *.pdf +CLEANFILES = *.*~ diff --git a/doc/Makefile.in b/doc/Makefile.in new file mode 100644 index 000000000..656e87741 --- /dev/null +++ b/doc/Makefile.in @@ -0,0 +1,221 @@ +# Makefile.in generated automatically by automake 1.5 from Makefile.am. + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_alias = @build_alias@ +build_triplet = @build@ +host_alias = @host_alias@ +host_triplet = @host@ +target_alias = @target_alias@ +target_triplet = @target@ +ADD_CFLAGS = @ADD_CFLAGS@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +AWK = @AWK@ +CC = @CC@ +CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPP = @CPP@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +EXEEXT = @EXEEXT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LEX = @LEX@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +MAINT = @MAINT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PATH = @PATH@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ +YACC = @YACC@ +am__include = @am__include@ +am__quote = @am__quote@ +install_sh = @install_sh@ + +EXTRA_DIST = *.pdf +CLEANFILES = *.*~ +subdir = doc +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +DIST_SOURCES = +DIST_COMMON = Makefile.am Makefile.in +all: all-am + +.SUFFIXES: + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu doc/Makefile +Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && \ + CONFIG_HEADERS= CONFIG_LINKS= \ + CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status +uninstall-info-am: +tags: TAGS +TAGS: + + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + $(mkinstalldirs) "$(distdir)/$$dir"; \ + fi; \ + if test -d $$d/$$file; then \ + cp -pR $$d/$$file $(distdir) \ + || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile + +installdirs: + +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + +distclean-am: clean-am distclean-generic distclean-libtool + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +uninstall-am: uninstall-info-am + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/doc/asn1c-usage.pdf b/doc/asn1c-usage.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1d0d28def1788d62836475b5f98ca8e6718ef655 GIT binary patch literal 129406 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 ...\n"; + exit 64; +} + +# Convert arguments into a hash for quicker search. +for(my $i; $i <= $#ARGV; $i++) { + $modules{$ARGV[$i]} = $ARGV[$i].".asn1"; +} + +# Process incoming stream in search for ASN.1 modules. +while() { + chop; + if($inmodule) { + next if(/^$/); + if(/^\\layout /) { + print O "\n"; + next; + } + if(/^\\begin_inset Quotes/) { + print O '"'; + next; + } + next if(/^\\/); + print O; + if(/^END$/) { + $inmodule = 0; + print O "\n"; + } + } else { + next unless $modules{$_}; + open(O, '> '.$modules{$_}); + print O; + $inmodule = 1; + delete $modules{$_}; + } +} + +# Make sure noone's missing. +die "Modules not found: " . join(", ", keys %modules) . "\n" if keys %modules; diff --git a/examples/crfc2asn1.pl b/examples/crfc2asn1.pl new file mode 100755 index 000000000..20e1f9f79 --- /dev/null +++ b/examples/crfc2asn1.pl @@ -0,0 +1,86 @@ +#!/usr/bin/perl + +# +# $Id$ +# $Author$ +# +# Simple tool that fetches the ASN.1 specifications from the +# given set of RFC files. +# + + +my $inasn = 0; # Are we inside ASN.1 grammar? +my $found = 0; + +if(-t STDIN && $#ARGV == -1) { + print STDERR "Rip ASN.1 specification from RFC file\n"; + print STDERR "Usage: $0 ...\n"; + print STDERR "Usage: | $0\n"; + exit(1); +} + +while(<>) { + # + # Strip RFC page delimiters. + # + next if /^[A-Z].*\[Page [0-9]+\]$/; + next if /^ $/; + next if /^RFC [0-9].*[0-9]+$/; + + if($inasn == 0) { + # + # The least correct way to find the start of ASN + # definition. + # + if(/^[ \t]*END[ \t]*$/) { + print STDERR + "Missed an ASN.1 grammar before line ". $. ."?\n"; + exit(1); + } + + my $rfcid = ''; + $rfcid = $1 . '-' if($ARGV =~ /([a-z0-9]+)/i); + + if(/^[ \t]+([A-Za-z0-9-]+).*DEFINITIONS.*::=/) { + my $fname = $rfcid . $1 . ".asn1"; + open(O, "> $fname") or die "Can't open $fname"; + select(O); + $inasn = 1; + } elsif(/^[ \t]*([A-Za-z0-9-]+).*{.*iso/) { + my $fname = $rfcid . $1 . ".asn1"; + my @a = ($_); + my $i; + for($i = 0; $i < 8; $i++) { + $_ = <>; + push(@a, $_); + if(/DEFINITIONS/) { + $_ = join('', @a); + $inasn = 1; + last; + } + } + next unless $inasn; + open(O, "> $fname") or die "Can't open $fname"; + select(O); + } else { + next; + } + + $found++; + print "\n"; + print "-- \n"; + print "-- Grammar found in $ARGV by $0 at " . $. . "\n"; + print "-- \n"; + print "\n"; + } + + print; + + if(/^[ \t]*END[ \t]*$/) { + select(STDOUT); + close(O); + $inasn = 0; + } +} + +die "No ASN.1 specifications found\n" unless $found; diff --git a/install-sh b/install-sh new file mode 100755 index 000000000..e9de23842 --- /dev/null +++ b/install-sh @@ -0,0 +1,251 @@ +#!/bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5 (mit/util/scripts/install.sh). +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + chmodcmd="" + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/libasn1compiler/Makefile.am b/libasn1compiler/Makefile.am new file mode 100644 index 000000000..6b2babdf5 --- /dev/null +++ b/libasn1compiler/Makefile.am @@ -0,0 +1,28 @@ + +AM_CPPFLAGS = \ + -I${top_srcdir}/libasn1parser \ + -I${top_srcdir}/libasn1fix + +noinst_LTLIBRARIES = libasn1compiler.la + +libasn1compiler_la_LDFLAGS = -all-static +libasn1compiler_la_SOURCES = \ + asn1compiler.c asn1compiler.h \ + asn1c_misc.c asn1c_misc.h \ + asn1c_out.c asn1c_out.h \ + asn1c_lang.c asn1c_lang.h \ + asn1c_save.c asn1c_save.h \ + asn1c_C.c asn1c_C.h \ + asn1c_internal.h + +libasn1compiler_la_LIBADD = \ + ${top_builddir}/libasn1parser/libasn1parser.la \ + ${top_builddir}/libasn1fix/libasn1fix.la + +check_PROGRAMS = check_compiler + +TESTS = ${check_PROGRAMS} + +LDADD = ${noinst_LTLIBRARIES} ${libasn1compiler_la_LIBADD} +DEPENDENCIES = ${LDADD} + diff --git a/libasn1compiler/Makefile.in b/libasn1compiler/Makefile.in new file mode 100644 index 000000000..3869df397 --- /dev/null +++ b/libasn1compiler/Makefile.in @@ -0,0 +1,424 @@ +# Makefile.in generated automatically by automake 1.5 from Makefile.am. + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_alias = @build_alias@ +build_triplet = @build@ +host_alias = @host_alias@ +host_triplet = @host@ +target_alias = @target_alias@ +target_triplet = @target@ +ADD_CFLAGS = @ADD_CFLAGS@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +AWK = @AWK@ +CC = @CC@ +CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPP = @CPP@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +EXEEXT = @EXEEXT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LEX = @LEX@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +MAINT = @MAINT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PATH = @PATH@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ +YACC = @YACC@ +am__include = @am__include@ +am__quote = @am__quote@ +install_sh = @install_sh@ + +AM_CPPFLAGS = \ + -I${top_srcdir}/libasn1parser \ + -I${top_srcdir}/libasn1fix + + +noinst_LTLIBRARIES = libasn1compiler.la + +libasn1compiler_la_LDFLAGS = -all-static +libasn1compiler_la_SOURCES = \ + asn1compiler.c asn1compiler.h \ + asn1c_misc.c asn1c_misc.h \ + asn1c_out.c asn1c_out.h \ + asn1c_lang.c asn1c_lang.h \ + asn1c_save.c asn1c_save.h \ + asn1c_C.c asn1c_C.h \ + asn1c_internal.h + + +libasn1compiler_la_LIBADD = \ + ${top_builddir}/libasn1parser/libasn1parser.la \ + ${top_builddir}/libasn1fix/libasn1fix.la + + +check_PROGRAMS = check_compiler + +TESTS = ${check_PROGRAMS} + +LDADD = ${noinst_LTLIBRARIES} ${libasn1compiler_la_LIBADD} +DEPENDENCIES = ${LDADD} +subdir = libasn1compiler +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) + +libasn1compiler_la_DEPENDENCIES = \ + ${top_builddir}/libasn1parser/libasn1parser.la \ + ${top_builddir}/libasn1fix/libasn1fix.la +am_libasn1compiler_la_OBJECTS = asn1compiler.lo asn1c_misc.lo \ + asn1c_out.lo asn1c_lang.lo asn1c_save.lo asn1c_C.lo +libasn1compiler_la_OBJECTS = $(am_libasn1compiler_la_OBJECTS) +check_PROGRAMS = check_compiler$(EXEEXT) +check_compiler_SOURCES = check_compiler.c +check_compiler_OBJECTS = check_compiler.$(OBJEXT) +check_compiler_LDADD = $(LDADD) +check_compiler_DEPENDENCIES = libasn1compiler.la \ + ${top_builddir}/libasn1parser/libasn1parser.la \ + ${top_builddir}/libasn1fix/libasn1fix.la +check_compiler_LDFLAGS = + +DEFS = @DEFS@ +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/asn1c_C.Plo $(DEPDIR)/asn1c_lang.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1c_misc.Plo $(DEPDIR)/asn1c_out.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1c_save.Plo $(DEPDIR)/asn1compiler.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/check_compiler.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ + $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +CFLAGS = @CFLAGS@ +DIST_SOURCES = $(libasn1compiler_la_SOURCES) check_compiler.c +DIST_COMMON = Makefile.am Makefile.in +SOURCES = $(libasn1compiler_la_SOURCES) check_compiler.c + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu libasn1compiler/Makefile +Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && \ + CONFIG_HEADERS= CONFIG_LINKS= \ + CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) +libasn1compiler.la: $(libasn1compiler_la_OBJECTS) $(libasn1compiler_la_DEPENDENCIES) + $(LINK) $(libasn1compiler_la_LDFLAGS) $(libasn1compiler_la_OBJECTS) $(libasn1compiler_la_LIBADD) $(LIBS) + +clean-checkPROGRAMS: + -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) +check_compiler$(EXEEXT): $(check_compiler_OBJECTS) $(check_compiler_DEPENDENCIES) + @rm -f check_compiler$(EXEEXT) + $(LINK) $(check_compiler_LDFLAGS) $(check_compiler_OBJECTS) $(check_compiler_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) core *.core + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1c_C.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1c_lang.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1c_misc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1c_out.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1c_save.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1compiler.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/check_compiler.Po@am__quote@ + +distclean-depend: + -rm -rf $(DEPDIR) + +.c.o: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< + +.c.obj: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `cygpath -w $<` + +.c.lo: +@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< +CCDEPMODE = @CCDEPMODE@ +uninstall-info-am: + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique $(LISP) + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) + +GTAGS: + here=`CDPATH=: && cd $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; \ + srcdir=$(srcdir); export srcdir; \ + list='$(TESTS)'; \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *" $$tst "*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ + ;; \ + *) \ + echo "PASS: $$tst"; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *" $$tst "*) \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ + ;; \ + esac; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all tests failed"; \ + else \ + banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ + fi; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0; \ + fi + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + $(mkinstalldirs) "$(distdir)/$$dir"; \ + fi; \ + if test -d $$d/$$file; then \ + cp -pR $$d/$$file $(distdir) \ + || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile $(LTLIBRARIES) + +installdirs: + +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + +distclean-am: clean-am distclean-compile distclean-depend \ + distclean-generic distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +uninstall-am: uninstall-info-am + +.PHONY: GTAGS all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool \ + clean-noinstLTLIBRARIES distclean distclean-compile \ + distclean-depend distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + tags uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c new file mode 100644 index 000000000..8ec476c6a --- /dev/null +++ b/libasn1compiler/asn1c_C.c @@ -0,0 +1,2021 @@ +/* + * Don't look into this file. First, because it's a mess, and second, because + * it's a brain of the compiler, and you don't wanna mess with brains do you? ;) + */ +#include "asn1c_internal.h" +#include "asn1c_C.h" +#include /* exportable stuff from libasn1fix */ + +static int asn1c_lang_C_type_SEQUENCE_def(arg_t *arg); +static int asn1c_lang_C_type_SET_def(arg_t *arg); +static int asn1c_lang_C_type_CHOICE_def(arg_t *arg); +static int asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of); +static int _print_tag(arg_t *arg, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag_p); +static int emit_constraint_checking_code(arg_t *arg); +static int emit_single_constraint_check(arg_t *arg, asn1p_constraint_t *ct, int mode); +static int emit_alphabet_tables(arg_t *arg, asn1p_constraint_t *ct, int *table); +static int emit_alphabet_check_cycle(arg_t *arg); +static int check_constraint_type_presence(asn1p_constraint_t *ct, enum asn1p_constraint_type_e type); +static asn1p_expr_type_e _find_terminal_type(arg_t *arg); +static int emit_value_determination_code(arg_t *arg); +static int emit_size_determination_code(arg_t *arg); +static long compute_min_size(arg_t *arg); +static long compute_max_size(arg_t *arg); +static long compute_xxx_size(arg_t *arg, int _max); + +typedef struct tag2el_s { + struct asn1p_type_tag_s el_tag; + int el_no; + asn1p_expr_t *from_expr; +} tag2el_t; + +static int _fill_tag2el_map(arg_t *arg, tag2el_t **tag2el, int *count, int el_no); +static int _add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no); + +#define C99_MODE (arg->flags & A1C_NO_C99) +#define UNNAMED_UNIONS (arg->flags & A1C_UNNAMED_UNIONS) + +#define PCTX_DEF INDENTED( \ + OUT("\n"); \ + OUT("/* Context for parsing across buffer boundaries */\n"); \ + OUT("ber_dec_ctx_t _ber_dec_ctx;\n")); + +#define DEPENDENCIES do { \ + int saved_target = arg->target->target; \ + int saved_indent = arg->indent_level; \ + int comment_printed = 0; \ + REDIR(OT_DEPS); \ + arg->indent_level = 0; \ + TQ_FOR(v, &(expr->members), next) { \ + if((!(v->expr_type & ASN_CONSTR_MASK) \ + && v->expr_type > ASN_CONSTR_MASK) \ + || v->meta_type == AMT_TYPEREF) { \ + if(!comment_printed++) \ + OUT("/* Dependencies for %s */\n", \ + asn1c_type_name(arg, expr, TNF_UNMODIFIED)); \ + OUT("#include <%s.h>\n", \ + asn1c_type_name(arg, v, TNF_INCLUDE)); \ + } \ + } \ + if(expr->expr_type == ASN_CONSTR_SET_OF) \ + OUT("#include \n"); \ + if(expr->expr_type == ASN_CONSTR_SEQUENCE_OF) \ + OUT("#include \n"); \ + OUT("\n"); \ + REDIR(saved_target); \ + INDENT(saved_indent); \ + } while(0) + +#define MKID(id) asn1c_make_identifier(0, (id), 0) + +int +asn1c_lang_C_type_ENUMERATED(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *v; + + REDIR(OT_DEPS); + + OUT("typedef enum %s {\n", MKID(expr->Identifier)); + TQ_FOR(v, &(expr->members), next) { + switch(v->expr_type) { + case A1TC_UNIVERVAL: + OUT("\t%s\t= %lld,\n", + asn1c_make_identifier(0, + expr->Identifier, + v->Identifier, 0), + v->value->value.v_integer); + break; + case A1TC_EXTENSIBLE: + OUT("\t/*\n"); + OUT("\t * Enumeration is extensible\n"); + OUT("\t */\n"); + break; + default: + return -1; + } + } + OUT("} %s_e;\n", MKID(expr->Identifier)); + + return asn1c_lang_C_type_SIMPLE_TYPE(arg); +} + + +int +asn1c_lang_C_type_INTEGER(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *v; + + REDIR(OT_DEPS); + + if(TQ_FIRST(&(expr->members))) { + OUT("typedef enum %s {\n", MKID(expr->Identifier)); + TQ_FOR(v, &(expr->members), next) { + switch(v->expr_type) { + case A1TC_UNIVERVAL: + OUT("\t%s\t= %lld,\n", + asn1c_make_identifier(0, + expr->Identifier, + v->Identifier, 0), + v->value->value.v_integer); + break; + default: + return -1; + } + } + OUT("} %s_e;\n", MKID(expr->Identifier)); + } + + return asn1c_lang_C_type_SIMPLE_TYPE(arg); +} + +int +asn1c_lang_C_type_SEQUENCE(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *v; + int comp_mode = 0; /* {root,ext=1,root,root,...} */ + + DEPENDENCIES; + + if(arg->embed) { + OUT("struct %s {\n", + MKID(expr->Identifier)); + } else { + OUT("typedef struct %s {\n", + MKID(expr->Identifier)); + } + + TQ_FOR(v, &(expr->members), next) { + if(v->expr_type == A1TC_EXTENSIBLE) { + if(comp_mode < 3) comp_mode++; + } + if(comp_mode == 1 && !v->marker) + v->marker = EM_OPTIONAL; + EMBED(v); + } + + PCTX_DEF; + OUT("} %s%s", expr->marker?"*":"", + MKID(expr->Identifier)); + if(arg->embed) OUT(";\n"); else OUT("_t;\n"); + + return asn1c_lang_C_type_SEQUENCE_def(arg); +} + +static int +asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *v; + int elements; /* Number of elements */ + int tags_impl_skip = 0; + int comp_mode = 0; /* {root,ext=1,root,root,...} */ + int ext_start = -1; + int ext_stop = -1; + char *p; + + REDIR(OT_STAT_DEFS); + + OUT("#include \n"); + OUT("\n"); + + /* + * Print out the table according to which the parsing is performed. + */ + p = MKID(expr->Identifier); + OUT("static asn1_SEQUENCE_element_t asn1_DEF_%s_elements[] = {\n", p); + + elements = 0; + INDENTED(TQ_FOR(v, &(expr->members), next) { + if(v->expr_type == A1TC_EXTENSIBLE) { + if((++comp_mode) == 1) + ext_start = elements - 1; + else + ext_stop = elements - 1; + continue; + } + OUT("{ "); + elements++; + OUT("offsetof(struct %s, ", MKID(expr->Identifier)); + OUT("%s), ", MKID(v->Identifier)); + if(v->marker) { + asn1p_expr_t *tv; + int opts = 0; + for(tv = v; tv && tv->marker; + tv = TQ_NEXT(tv, next), opts++) { + if(tv->expr_type == A1TC_EXTENSIBLE) + opts--; + } + OUT("%d,", opts); + } else { + OUT("0,"); + } + OUT("\n"); + INDENT(+1); + if(C99_MODE) OUT(".tag = "); + _print_tag(arg, v, NULL); + OUT(",\n"); + if(C99_MODE) OUT(".tag_mode = "); + if(v->tag.tag_class) { + if(v->tag.tag_mode == TM_IMPLICIT) + OUT("-1,\t/* IMPLICIT tag at current level */\n"); + else + OUT("+1,\t/* EXPLICIT tag at current level */\n"); + } else { + OUT("0,\n"); + } + if(C99_MODE) OUT(".type = "); + OUT("(void *)&asn1_DEF_%s,\n", + asn1c_type_name(arg, v, TNF_SAFE)); + if(C99_MODE) OUT(".name = "); + OUT("\"%s\"\n", v->Identifier); + OUT("},\n"); + INDENT(-1); + }); + OUT("};\n"); + + p = MKID(expr->Identifier); + OUT("static ber_tlv_tag_t asn1_DEF_%s_tags[] = {\n", p); + INDENTED( + if(expr->tag.tag_class) { + _print_tag(arg, expr, &expr->tag); + if(expr->tag.tag_mode != TM_EXPLICIT) + tags_impl_skip++; + } + if(!expr->tag.tag_class + || (expr->meta_type == AMT_TYPE + && expr->tag.tag_mode == TM_EXPLICIT)) { + struct asn1p_type_tag_s tag; + if(expr->tag.tag_class) + OUT(",\n"); + tag.tag_class = TC_UNIVERSAL; + tag.tag_mode = TM_IMPLICIT; + tag.tag_value = expr_type2uclass_value[expr->expr_type]; + _print_tag(arg, expr, &tag); + } + OUT("\n"); + ); + OUT("};\n"); + + OUT("static asn1_SEQUENCE_specifics_t asn1_DEF_%s_specs = {\n", p); + INDENTED( + OUT("sizeof(struct %s),\n", p); + OUT("offsetof(struct %s, _ber_dec_ctx),\n", p); + OUT("asn1_DEF_%s_elements,\n", p); + OUT("%d,\t/* Elements count */\n", elements); + OUT("%d,\t/* Start extensions */\n", + ext_start); + OUT("%d\t/* Stop extensions */\n", + (ext_stopIdentifier); + OUT("SEQUENCE_constraint,\n"); + OUT("SEQUENCE_decode_ber,\n"); + OUT("SEQUENCE_encode_der,\n"); + OUT("SEQUENCE_print,\n"); + OUT("SEQUENCE_free,\n"); + OUT("0,\t/* Use generic outmost tag fetcher */\n"); + OUT("asn1_DEF_%s_tags,\n", p); + OUT("sizeof(asn1_DEF_%s_tags)\n", p); + OUT("\t/sizeof(asn1_DEF_%s_tags[0]),\n", p); + OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); + OUT("%d,\t/* Whether CONSTRUCTED */\n", 1); + OUT("&asn1_DEF_%s_specs\t/* Additional specs */\n", p); + ); + OUT("};\n"); + OUT("\n"); + + REDIR(OT_DEPS); + OUT("#include \n"); + OUT("\n"); + if(!arg->embed) + OUT("extern asn1_TYPE_descriptor_t asn1_DEF_%s;\n", p); + REDIR(OT_TYPE_DECLS); + + return 0; +} + +int +asn1c_lang_C_type_SEQUENCE_OF(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *v; + + DEPENDENCIES; + + if(arg->embed) { + OUT("struct %s {\n", MKID(expr->Identifier)); + } else { + OUT("typedef struct %s {\n", MKID(expr->Identifier)); + } + + TQ_FOR(v, &(expr->members), next) { + INDENTED(OUT("A_SEQUENCE_OF(%s) list;\n", + asn1c_type_name(arg, v, TNF_RSAFE))); + } + + PCTX_DEF; + OUT("} %s%s", expr->marker?"*":"", MKID(expr->Identifier)); + if(arg->embed) OUT(";\n"); else OUT("_t;\n"); + + /* + * SET OF/SEQUENCE OF definition, SEQUENCE OF mode. + */ + return asn1c_lang_C_type_SEx_OF_def(arg, 1); +} + +int +asn1c_lang_C_type_SET(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *v; + long mcount; + char *id; + int comp_mode = 0; /* {root,ext=1,root,root,...} */ + + DEPENDENCIES; + + REDIR(OT_DEPS); + + OUT("\n"); + OUT("/*\n"); + OUT(" * Method of determining the components presence\n"); + OUT(" */\n"); + mcount = 0; + OUT("enum %s_PR_e {\n", MKID(expr->Identifier)); + TQ_FOR(v, &(expr->members), next) { + if(v->expr_type == A1TC_EXTENSIBLE) continue; + INDENTED( + id = MKID(expr->Identifier); + OUT("%s_PR_", id); + id = MKID(v->Identifier); + OUT("%s,\t/* Member %s is present */\n", + id, id) + ); + mcount++; + } + OUT("};\n"); + + REDIR(OT_TYPE_DECLS); + + if(arg->embed) { + OUT("struct %s {\n", MKID(expr->Identifier)); + } else { + OUT("typedef struct %s {\n", MKID(expr->Identifier)); + } + + TQ_FOR(v, &(expr->members), next) { + if(v->expr_type == A1TC_EXTENSIBLE) { + if(comp_mode < 3) comp_mode++; + } + if(comp_mode == 1 && !v->marker) + v->marker = EM_OPTIONAL; + EMBED(v); + } + + INDENTED( + id = MKID(expr->Identifier); + OUT("\n"); + OUT("/* Presence bitmask: ASN_SET_ISPRESENT(p%s, %s_PR_x) */\n", + id, id); + OUT("unsigned int _presence_map\n"); + OUT("\t[((%ld+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))];\n", mcount); + ); + + PCTX_DEF; + OUT("} %s%s", expr->marker?"*":"", MKID(expr->Identifier)); + if(arg->embed) OUT(";\n"); else OUT("_t;\n"); + + return asn1c_lang_C_type_SET_def(arg); +} + +/* + * Compare tags according to their canonical order. + * Canonical order: [UNIVERSAL] [APPLICATION] [] [PRIVATE] + * As you see, the class is encoded using the two lowest bits. + */ +static arg_t *_ctc_arg; +static int _canonical_tags_cmp(const void *ap, const void *bp) + __attribute__ ((unused)); +static int +_canonical_tags_cmp(const void *ap, const void *bp) { + asn1p_expr_t *a, *b; + struct asn1p_type_tag_s ta, tb; + + (const asn1p_expr_t *)a = *(const asn1p_expr_t * const *)ap; + (const asn1p_expr_t *)b = *(const asn1p_expr_t * const *)bp; + + if(asn1f_fetch_tag(_ctc_arg->asn, _ctc_arg->mod, a, &ta) + || asn1f_fetch_tag(_ctc_arg->asn, _ctc_arg->mod, b, &tb)) + return 0; + + if(ta.tag_class == tb.tag_class) { + if(ta.tag_value == tb.tag_value) + return 0; + else if(ta.tag_value < tb.tag_value) + return -1; + else + return 1; + } else if(ta.tag_class < tb.tag_class) { + return -1; + } else { + return 1; + } +} + +static int +_tag2el_cmp(const void *ap, const void *bp) { + const tag2el_t *a = ap; + const tag2el_t *b = bp; + const struct asn1p_type_tag_s *ta = &a->el_tag; + const struct asn1p_type_tag_s *tb = &b->el_tag; + + if(ta->tag_class == tb->tag_class) { + if(ta->tag_value == tb->tag_value) + return 0; + else if(ta->tag_value < tb->tag_value) + return -1; + else + return 1; + } else if(ta->tag_class < tb->tag_class) { + return -1; + } else { + return 1; + } +} + +static int +asn1c_lang_C_type_SET_def(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *v; + int elements; + int tags_impl_skip = 0; + int comp_mode = 0; /* {root,ext=1,root,root,...} */ + int extensible = 0; + tag2el_t *tag2el = NULL; + int tag2el_count = 0; + char *p; + + /* + * Fetch every inner tag from the tag to elements map. + */ + if(_fill_tag2el_map(arg, &tag2el, &tag2el_count, -1)) { + if(tag2el) free(tag2el); + return -1; + } else { + /* + * Sort the map according to canonical order of their tags. + */ + _ctc_arg = arg; + qsort(tag2el, tag2el_count, sizeof(*tag2el), _tag2el_cmp); + } + + + REDIR(OT_STAT_DEFS); + + OUT("#include \n"); + OUT("\n"); + + /* + * Print out the table according to which the parsing is performed. + */ + p = MKID(expr->Identifier); + OUT("static asn1_SET_element_t asn1_DEF_%s_elements[] = {\n", p); + + elements = 0; + INDENTED(TQ_FOR(v, &(expr->members), next) { + if(v->expr_type != A1TC_EXTENSIBLE) { + if(comp_mode == 1) + v->marker = EM_OPTIONAL; + elements++; + } else { + if(comp_mode < 3) comp_mode++; + continue; + } + OUT("{ "); + p = MKID(expr->Identifier); + OUT("offsetof(struct %s, ", p); + p = MKID(v->Identifier); + OUT("%s), ", p); + if(v->marker) { + OUT("1, /* Optional element */\n"); + } else { + OUT("0,\n"); + } + INDENT(+1); + if(C99_MODE) OUT(".tag = "); + _print_tag(arg, v, NULL); + OUT(",\n"); + if(C99_MODE) OUT(".tag_mode = "); + if(v->tag.tag_class) { + if(v->tag.tag_mode == TM_IMPLICIT) + OUT("-1,\t/* IMPLICIT tag at current level */\n"); + else + OUT("+1,\t/* EXPLICIT tag at current level */\n"); + } else { + OUT("0,\n"); + } + if(C99_MODE) OUT(".type = "); + OUT("(void *)&asn1_DEF_%s,\n", + asn1c_type_name(arg, v, TNF_SAFE)); + if(C99_MODE) OUT(".name = "); + OUT("\"%s\"\n", v->Identifier); + OUT("},\n"); + INDENT(-1); + }); + OUT("};\n"); + + p = MKID(expr->Identifier); + OUT("static ber_tlv_tag_t asn1_DEF_%s_tags[] = {\n", p); + INDENTED( + if(expr->tag.tag_class) { + _print_tag(arg, expr, &expr->tag); + if(expr->tag.tag_mode != TM_EXPLICIT) + tags_impl_skip++; + } + if(!expr->tag.tag_class + || (expr->meta_type == AMT_TYPE + && expr->tag.tag_mode == TM_EXPLICIT)) { + struct asn1p_type_tag_s tag; + if(expr->tag.tag_class) + OUT(",\n"); + tag.tag_class = TC_UNIVERSAL; + tag.tag_mode = TM_IMPLICIT; + tag.tag_value = expr_type2uclass_value[expr->expr_type]; + _print_tag(arg, expr, &tag); + } + OUT("\n"); + ); + OUT("};\n"); + + /* + * Tags to elements map. + */ + p = MKID(expr->Identifier); + OUT("static asn1_SET_tag2member_t asn1_DEF_%s_tag2el[] = {\n", p); + if(tag2el_count) { + int i; + for(i = 0; i < tag2el_count; i++) { + OUT(" { "); + _print_tag(arg, expr, &tag2el[i].el_tag); + OUT(", "); + OUT("%d ", tag2el[i].el_no); + OUT("}, /* %s at %d */\n", + tag2el[i].from_expr->Identifier, + tag2el[i].from_expr->_lineno + ); + } + } + OUT("};\n"); + + /* + * Emit a map of mandatory elements. + */ + OUT("static uint8_t asn1_DEF_%s_mmap", p); + OUT("[(%d + (8 * sizeof(unsigned int)) - 1) / 8]", elements); + OUT(" = {\n", p); + INDENTED( + if(elements) { + int delimit = 0; + int el = 0; + TQ_FOR(v, &(expr->members), next) { + if(v->expr_type == A1TC_EXTENSIBLE) continue; + if(delimit) { + OUT(",\n"); + delimit = 0; + } else if(el) { + OUT(" | "); + } + OUT("(%d << %d)", v->marker?0:1, 7 - (el % 8)); + if(el && (el % 8) == 0) + delimit = 1; + el++; + } + } else { + OUT("0"); + } + ); + OUT("\n"); + OUT("};\n"); + + OUT("static asn1_SET_specifics_t asn1_DEF_%s_specs = {\n", p); + INDENTED( + OUT("sizeof(struct %s),\n", p); + OUT("offsetof(struct %s, _ber_dec_ctx),\n", p); + OUT("offsetof(struct %s, _presence_map),\n", p); + OUT("asn1_DEF_%s_elements,\n", p); + OUT("%d,\t/* Elements count */\n", elements); + OUT("asn1_DEF_%s_tag2el,\n", p); + OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); + OUT("%d,\t/* Whether extensible */\n", extensible); + OUT("(unsigned int *)asn1_DEF_%s_mmap\t/* Mandatory elements map */\n", p); + ); + OUT("};\n"); + OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p); + INDENTED( + OUT("\"%s\",\n", expr->Identifier); + OUT("SET_constraint,\n"); + OUT("SET_decode_ber,\n"); + OUT("SET_encode_der,\n"); + OUT("SET_print,\n"); + OUT("SET_free,\n"); + OUT("0,\t/* Use generic outmost tag fetcher */\n"); + OUT("asn1_DEF_%s_tags,\n", p); + OUT("sizeof(asn1_DEF_%s_tags)\n", p); + OUT("\t/sizeof(asn1_DEF_%s_tags[0]),\n", p); + OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); + OUT("%d,\t/* Whether CONSTRUCTED */\n", 1); + OUT("&asn1_DEF_%s_specs\t/* Additional specs */\n", p); + ); + OUT("};\n"); + OUT("\n"); + + REDIR(OT_DEPS); + OUT("#include \n"); + OUT("\n"); + if(!arg->embed) + OUT("extern asn1_TYPE_descriptor_t asn1_DEF_%s;\n", p); + REDIR(OT_TYPE_DECLS); + + return 0; +} + +int +asn1c_lang_C_type_SET_OF(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *v; + + DEPENDENCIES; + + if(arg->embed) { + OUT("struct %s {\n", MKID(expr->Identifier)); + } else { + OUT("typedef struct %s {\n", + MKID(expr->Identifier)); + } + + TQ_FOR(v, &(expr->members), next) { + INDENTED(OUT("A_SET_OF(%s) list;\n", + asn1c_type_name(arg, v, TNF_RSAFE))); + } + + PCTX_DEF; + OUT("} %s%s", expr->marker?"*":"", MKID(expr->Identifier)); + if(arg->embed) OUT(";\n"); else OUT("_t;\n"); + + /* + * SET OF/SEQUENCE OF definition, SET OF mode. + */ + return asn1c_lang_C_type_SEx_OF_def(arg, 0); +} + +static int +asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { + asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *v; + int tags_impl_skip = 0; + char *p; + + REDIR(OT_DEPS); + + if(seq_of) { + OUT("#include \n"); + } else { + OUT("#include \n"); + OUT("\n"); + } + + REDIR(OT_STAT_DEFS); + + /* + * Print out the table according to which the parsing is performed. + */ + p = MKID(expr->Identifier); + OUT("static asn1_SET_OF_element_t asn1_DEF_%s_elements[] = {\n", p); + + INDENTED(OUT("{ "); + v = TQ_FIRST(&(expr->members)); + INDENT(+1); + if(C99_MODE) OUT(".tag = "); + _print_tag(arg, v, NULL); + OUT(",\n"); + if(C99_MODE) OUT(".type = "); + OUT("(void *)&asn1_DEF_%s", + asn1c_type_name(arg, v, TNF_SAFE)); + OUT(" "); + OUT("},\n"); + INDENT(-1); + ); + OUT("};\n"); + + p = MKID(expr->Identifier); + OUT("static ber_tlv_tag_t asn1_DEF_%s_tags[] = {\n", p); + INDENTED( + if(expr->tag.tag_class) { + _print_tag(arg, expr, &expr->tag); + if(expr->tag.tag_mode != TM_EXPLICIT) + tags_impl_skip++; + } + if(!expr->tag.tag_class + || (expr->meta_type == AMT_TYPE + && expr->tag.tag_mode == TM_EXPLICIT)) { + struct asn1p_type_tag_s tag; + if(expr->tag.tag_class) + OUT(",\n"); + tag.tag_class = TC_UNIVERSAL; + tag.tag_mode = TM_IMPLICIT; + tag.tag_value = expr_type2uclass_value[expr->expr_type]; + _print_tag(arg, expr, &tag); + } + OUT("\n"); + ); + OUT("};\n"); + + OUT("static asn1_SET_OF_specifics_t asn1_DEF_%s_specs = {\n", p); + INDENTED( + OUT("sizeof(struct %s),\n", p); + OUT("offsetof(struct %s, _ber_dec_ctx),\n", p); + OUT("asn1_DEF_%s_elements\n", p); + ); + OUT("};\n"); + OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p); + INDENTED( + OUT("\"%s\",\n", expr->Identifier); + if(seq_of) { + OUT("SEQUENCE_OF_constraint,\n"); + OUT("SEQUENCE_OF_decode_ber,\n"); + OUT("SEQUENCE_OF_encode_der,\n"); + OUT("SEQUENCE_OF_print,\n"); + OUT("SEQUENCE_OF_free,\n"); + } else { + OUT("SET_OF_constraint,\n"); + OUT("SET_OF_decode_ber,\n"); + OUT("SET_OF_encode_der,\n"); + OUT("SET_OF_print,\n"); + OUT("SET_OF_free,\n"); + } + OUT("0,\t/* Use generic outmost tag fetcher */\n"); + OUT("asn1_DEF_%s_tags,\n", p); + OUT("sizeof(asn1_DEF_%s_tags)\n", p); + OUT("\t/sizeof(asn1_DEF_%s_tags[0]),\n", p); + OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); + OUT("%d,\t/* Whether CONSTRUCTED */\n", 1); + OUT("&asn1_DEF_%s_specs\t/* Additional specs */\n", p); + ); + OUT("};\n"); + OUT("\n"); + + REDIR(OT_DEPS); + if(!arg->embed) + OUT("extern asn1_TYPE_descriptor_t asn1_DEF_%s;\n", p); + REDIR(OT_TYPE_DECLS); + + return 0; +} + +int +asn1c_lang_C_type_CHOICE(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *v; + char *p; + + DEPENDENCIES; + + p = MKID(expr->Identifier); + + if(arg->embed) { + OUT("struct %s {\n", p); + } else { + OUT("typedef struct %s {\n", p); + } + + INDENTED( + OUT("enum {\n"); + INDENTED( + OUT("%s_PR_NOTHING,\t" + "/* No components present */\n", p); + TQ_FOR(v, &(expr->members), next) { + if(v->expr_type == A1TC_EXTENSIBLE) continue; + p = MKID(expr->Identifier); + OUT("%s_PR_", p); + p = MKID(v->Identifier); + OUT("%s,\n", p, p); + } + ); + OUT("} present;\n"); + + OUT("union {\n", p); + TQ_FOR(v, &(expr->members), next) { + EMBED(v); + } + if(UNNAMED_UNIONS) OUT("};\n"); + else OUT("} choice;\n"); + ); + + PCTX_DEF; + OUT("} %s%s", expr->marker?"*":"", MKID(expr->Identifier)); + if(arg->embed) OUT(";\n"); else OUT("_t;\n"); + + return asn1c_lang_C_type_CHOICE_def(arg); +} + +static int +asn1c_lang_C_type_CHOICE_def(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *v; + int elements; /* Number of elements */ + int tags_impl_skip = 0; + int comp_mode = 0; /* {root,ext=1,root,root,...} */ + int extensible = 0; + tag2el_t *tag2el = NULL; + int tag2el_count = 0; + char *p; + + /* + * Fetch every inner tag from the tag to elements map. + */ + if(_fill_tag2el_map(arg, &tag2el, &tag2el_count, -1)) { + if(tag2el) free(tag2el); + return -1; + } else { + /* + * Sort the map according to canonical order of their tags. + */ + _ctc_arg = arg; + qsort(tag2el, tag2el_count, sizeof(*tag2el), _tag2el_cmp); + } + + REDIR(OT_STAT_DEFS); + + OUT("#include \n"); + OUT("\n"); + + /* + * Print out the table according to which the parsing is performed. + */ + p = MKID(expr->Identifier); + OUT("static asn1_CHOICE_element_t asn1_DEF_%s_elements[] = {\n", p); + + elements = 0; + INDENTED(TQ_FOR(v, &(expr->members), next) { + if(v->expr_type != A1TC_EXTENSIBLE) { + if(comp_mode == 1) + v->marker = EM_OPTIONAL; + elements++; + } else { + if(comp_mode < 3) comp_mode++; + continue; + } + OUT("{ "); + p = MKID(expr->Identifier); + OUT("offsetof(struct %s, ", p); + p = MKID(v->Identifier); + if(!UNNAMED_UNIONS) OUT("choice."); + OUT("%s), ", p); + if(v->marker) { + OUT("1, /* Optional element */\n"); + } else { + OUT("0,\n"); + } + INDENT(+1); + if(C99_MODE) OUT(".tag = "); + _print_tag(arg, v, NULL); + OUT(",\n"); + if(C99_MODE) OUT(".tag_mode = "); + if(v->tag.tag_class) { + if(v->tag.tag_mode == TM_IMPLICIT) + OUT("-1,\t/* IMPLICIT tag at current level */\n"); + else + OUT("+1,\t/* EXPLICIT tag at current level */\n"); + } else { + OUT("0,\n"); + } + if(C99_MODE) OUT(".type = "); + OUT("(void *)&asn1_DEF_%s,\n", + asn1c_type_name(arg, v, TNF_SAFE)); + if(C99_MODE) OUT(".name = "); + OUT("\"%s\"\n", v->Identifier); + OUT("},\n"); + INDENT(-1); + }); + OUT("};\n"); + + p = MKID(expr->Identifier); + OUT("static ber_tlv_tag_t asn1_DEF_%s_tags[] = {\n", p); + if(arg->embed) { + /* + * Our parent structure has already taken this into account. + */ + } else { + INDENTED( + if(expr->tag.tag_class) { + _print_tag(arg, expr, &expr->tag); + if(expr->tag.tag_mode != TM_EXPLICIT) + tags_impl_skip++; + } + OUT("\n"); + ); + } + OUT("};\n"); + + /* + * Tags to elements map. + */ + p = MKID(expr->Identifier); + OUT("static asn1_CHOICE_tag2member_t asn1_DEF_%s_tag2el[] = {\n", p); + if(tag2el_count) { + int i; + for(i = 0; i < tag2el_count; i++) { + OUT(" { "); + _print_tag(arg, expr, &tag2el[i].el_tag); + OUT(", "); + OUT("%d ", tag2el[i].el_no); + OUT("}, /* %s at %d */\n", + tag2el[i].from_expr->Identifier, + tag2el[i].from_expr->_lineno + ); + } + } + OUT("};\n"); + + OUT("static asn1_CHOICE_specifics_t asn1_DEF_%s_specs = {\n", p); + INDENTED( + OUT("sizeof(struct %s),\n", p); + OUT("offsetof(struct %s, _ber_dec_ctx),\n", p); + OUT("offsetof(struct %s, present),\n", p); + OUT("sizeof(((struct %s *)0)->present),\n", p); + OUT("asn1_DEF_%s_elements,\n", p); + OUT("%d,\t/* Elements count */\n", elements); + OUT("asn1_DEF_%s_tag2el,\n", p); + OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); + OUT("%d\t/* Whether extensible */\n", extensible); + ); + OUT("};\n"); + OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p); + INDENTED( + OUT("\"%s\",\n", expr->Identifier); + OUT("CHOICE_constraint,\n"); + OUT("CHOICE_decode_ber,\n"); + OUT("CHOICE_encode_der,\n"); + OUT("CHOICE_print,\n"); + OUT("CHOICE_free,\n"); + OUT("CHOICE_outmost_tag,\n"); + OUT("asn1_DEF_%s_tags,\n", p); + OUT("sizeof(asn1_DEF_%s_tags)\n", p); + OUT("\t/sizeof(asn1_DEF_%s_tags[0]),\n", p); + OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); + OUT("%d,\t/* Whether CONSTRUCTED */\n", 1); + OUT("&asn1_DEF_%s_specs\t/* Additional specs */\n", p); + ); + OUT("};\n"); + OUT("\n"); + + REDIR(OT_DEPS); + if(!arg->embed) + OUT("extern asn1_TYPE_descriptor_t asn1_DEF_%s;\n", p); + REDIR(OT_TYPE_DECLS); + + return 0; +} + +int +asn1c_lang_C_type_REFERENCE(arg_t *arg) { + asn1p_ref_t *ref; + + ref = arg->expr->reference; + if(ref->components[ref->comp_count-1].name[0] == '&') { + asn1p_module_t *mod; + asn1p_expr_t *extract; + arg_t tmp; + int ret; + + extract = asn1f_class_access_ex(arg->asn, arg->mod, arg->expr, + ref, &mod); + if(extract == NULL) + return -1; + + extract = asn1p_expr_clone(extract); + if(extract) { + if(extract->Identifier) + free(extract->Identifier); + extract->Identifier = strdup(arg->expr->Identifier); + if(extract->Identifier == NULL) { + asn1p_expr_free(extract); + return -1; + } + } else { + return -1; + } + + tmp = *arg; + tmp.asn = arg->asn; + tmp.mod = mod; + tmp.expr = extract; + + ret = arg->default_cb(&tmp); + + asn1p_expr_free(extract); + + return ret; + } + + + return asn1c_lang_C_type_SIMPLE_TYPE(arg); +} + +int +asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + int tags_impl_skip = 0; + char *p; + + if(arg->embed) { + REDIR(OT_TYPE_DECLS); + + OUT("%s\t", asn1c_type_name(arg, arg->expr, + expr->marker?TNF_RSAFE:TNF_CTYPE)); + OUT("%s", expr->marker?"*":" "); + OUT("%s;", MKID(expr->Identifier)); + if(expr->marker) OUT("\t/* %s */", + (expr->marker==EM_OPTIONAL)?"OPTIONAL":"DEFAULT"); + OUT("\n"); + return 0; + } + + REDIR(OT_DEPS); + + OUT("#include <%s.h>\n", asn1c_type_name(arg, expr, TNF_INCLUDE)); + + REDIR(OT_TYPE_DECLS); + + OUT("typedef %s\t", asn1c_type_name(arg, arg->expr, TNF_CTYPE)); + OUT("%s", expr->marker?"*":" "); + OUT("%s_t;\n", MKID(expr->Identifier)); + OUT("\n"); + + REDIR(OT_STAT_DEFS); + + p = MKID(expr->Identifier); + OUT("static ber_tlv_tag_t asn1_DEF_%s_tags[] = {\n", p); + INDENTED( + if(expr->tag.tag_class) { + _print_tag(arg, expr, &expr->tag); + if(expr->tag.tag_mode != TM_EXPLICIT) + tags_impl_skip++; + } + if(!expr->tag.tag_class + || (expr->meta_type == AMT_TYPE + && expr->tag.tag_mode == TM_EXPLICIT)) { + struct asn1p_type_tag_s tag; + if(expr->tag.tag_class) + OUT(",\n"); + tag.tag_class = TC_UNIVERSAL; + tag.tag_mode = TM_IMPLICIT; + tag.tag_value = expr_type2uclass_value[expr->expr_type]; + _print_tag(arg, expr, &tag); + } + OUT("\n"); + ); + OUT("};\n"); + + OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p); + INDENTED( + OUT("\"%s\",\n", expr->Identifier); + OUT("%s_constraint,\n", p); + OUT("%s_decode_ber,\n", p); + OUT("%s_encode_der,\n", p); + OUT("%s_print,\n", p); + OUT("%s_free,\n", p); + OUT("0,\t/* Use generic outmost tag fetcher */\n"); + OUT("asn1_DEF_%s_tags,\n", p); + OUT("sizeof(asn1_DEF_%s_tags)\n", p); + OUT("\t/sizeof(asn1_DEF_%s_tags[0]),\n", p); + OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); + OUT("-0\t/* Unknown yet */\n"); + ); + OUT("};\n"); + OUT("\n"); + + /* + * Constraint checking. + */ + if(expr->constraints) /* Emit tables with FROM() constraints */ + emit_alphabet_tables(arg, expr->constraints, 0); + p = MKID(expr->Identifier); + OUT("int\n"); + OUT("%s_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,\n", p); + INDENTED( + OUT("\t\tasn_app_consume_bytes_f *app_errlog, void *app_key) {\n"); + OUT("\n"); + if(expr->constraints) { + + emit_constraint_checking_code(arg); + + OUT("/* Check the constraints of the underlying type */\n"); + OUT("return asn1_DEF_%s.check_constraints\n", + asn1c_type_name(arg, expr, TNF_SAFE)); + OUT("\t(td, sptr, app_errlog, app_key);\n"); + } else { + OUT("/* Make the underlying type checker permanent */\n"); + OUT("td->check_constraints = asn1_DEF_%s.check_constraints;\n", + asn1c_type_name(arg, expr, TNF_SAFE)); + OUT("return td->check_constraints\n"); + OUT("\t(td, sptr, app_errlog, app_key);\n"); + } + ); + OUT("}\n"); + OUT("\n"); + + /* + * Emit suicidal functions. + */ + + { + /* + * This function replaces certain fields from the definition + * of a type with the corresponding fields from the basic type + * (from which the current type is inherited). + */ + char *type_name = asn1c_type_name(arg, expr, TNF_SAFE); + OUT("/*\n"); + OUT(" * This type is implemented using %s,\n", type_name); + OUT(" * so adjust the DEF appropriately.\n"); + OUT(" */\n"); + OUT("static void\n"); + OUT("inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) {\n"); + INDENT(+1); + OUT("td->ber_decoder = asn1_DEF_%s.ber_decoder;\n", type_name); + OUT("td->der_encoder = asn1_DEF_%s.der_encoder;\n", type_name); + OUT("td->free_struct = asn1_DEF_%s.free_struct;\n", type_name); + OUT("td->print_struct = asn1_DEF_%s.print_struct;\n", type_name); + OUT("td->last_tag_form = asn1_DEF_%s.last_tag_form;\n", type_name); + OUT("td->specifics = asn1_DEF_%s.specifics;\n", type_name); + INDENT(-1); + OUT("}\n"); + OUT("\n"); + } + + p = MKID(expr->Identifier); + OUT("ber_dec_rval_t\n"); + OUT("%s_decode_ber(asn1_TYPE_descriptor_t *td,\n", p); + INDENTED( + OUT("\tvoid **structure, void *bufptr, size_t size, int tag_mode) {\n"); + OUT("inherit_TYPE_descriptor(td);\n"); + OUT("return td->ber_decoder(td, structure,\n"); + OUT("\tbufptr, size, tag_mode);\n"); + ); + OUT("}\n"); + OUT("\n"); + + p = MKID(expr->Identifier); + OUT("der_enc_rval_t\n"); + OUT("%s_encode_der(asn1_TYPE_descriptor_t *td,\n", p); + INDENTED( + OUT("\tvoid *structure, int tag_mode, ber_tlv_tag_t tag,\n"); + OUT("\tasn_app_consume_bytes_f *cb, void *app_key) {\n"); + OUT("inherit_TYPE_descriptor(td);\n"); + OUT("return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);\n"); + ); + OUT("}\n"); + OUT("\n"); + + p = MKID(expr->Identifier); + OUT("int\n"); + OUT("%s_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr,\n", p); + INDENTED( + OUT("\tint ilevel, asn_app_consume_bytes_f *cb, void *app_key) {\n"); + OUT("inherit_TYPE_descriptor(td);\n"); + OUT("return td->print_struct(td, struct_ptr, ilevel, cb, app_key);\n"); + ); + OUT("}\n"); + OUT("\n"); + + p = MKID(expr->Identifier); + OUT("void\n"); + OUT("%s_free(asn1_TYPE_descriptor_t *td,\n", p); + INDENTED( + OUT("\tvoid *struct_ptr, int contents_only) {\n"); + OUT("inherit_TYPE_descriptor(td);\n"); + OUT("td->free_struct(td, struct_ptr, contents_only);\n"); + ); + OUT("}\n"); + OUT("\n"); + + REDIR(OT_FUNC_DECLS); + + p = MKID(expr->Identifier); + OUT("extern asn1_TYPE_descriptor_t asn1_DEF_%s;\n", p); + OUT("asn_constr_check_f %s_constraint;\n", p); + OUT("ber_type_decoder_f %s_decode_ber;\n", p); + OUT("der_type_encoder_f %s_encode_der;\n", p); + OUT("asn_struct_print_f %s_print;\n", p); + OUT("asn_struct_free_f %s_free;\n", p); + + return 0; +} + +int +asn1c_lang_C_type_EXTENSIBLE(arg_t *arg) { + + OUT("/*\n"); + OUT(" * This type is extensible,\n"); + OUT(" * possible extensions are below.\n"); + OUT(" */\n"); + + return 0; +} + +static int +_print_tag(arg_t *arg, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag_p) { + struct asn1p_type_tag_s tag; + + if(tag_p) { + tag = *tag_p; + } else { + if(asn1f_fetch_tag(arg->asn, arg->mod, expr, &tag)) { + OUT("-1 /* Ambiguous tag (CHOICE?) */"); + return 0; + } + } + + OUT("("); + switch(tag.tag_class) { + case TC_UNIVERSAL: OUT("ASN_TAG_CLASS_UNIVERSAL"); break; + case TC_APPLICATION: OUT("ASN_TAG_CLASS_APPLICATION"); break; + case TC_CONTEXT_SPECIFIC: OUT("ASN_TAG_CLASS_CONTEXT"); break; + case TC_PRIVATE: OUT("ASN_TAG_CLASS_PRIVATE"); break; + case TC_NOCLASS: + break; + } + OUT(" | (%lld << 2))", tag.tag_value); + + return 0; +} + +/* + * For constructed types, number of external tags may be greater than + * number of elements in the type because of CHOICE type. + * T ::= SET { -- Three possible tags: + * a INTEGER, -- One tag is here... + * b Choice1 -- ... and two more tags are there. + * } + * Choice1 ::= CHOICE { + * s1 IA5String, + * s2 ObjectDescriptor + * } + */ +static int +_fill_tag2el_map(arg_t *arg, tag2el_t **tag2el, int *count, int el_no) { + asn1p_expr_t *expr = arg->expr; + arg_t tmparg = *arg; + asn1p_expr_t *v; + int element = 0; + + TQ_FOR(v, &(expr->members), next) { + if(v->expr_type == A1TC_EXTENSIBLE) + continue; + + tmparg.expr = v; + + if(_add_tag2el_member(&tmparg, tag2el, count, + (el_no==-1)?element:el_no)) { + return -1; + } + + element++; + } + + return 0; +} + +static int +_add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no) { + struct asn1p_type_tag_s tag; + int ret; + + assert(el_no >= 0); + + ret = asn1f_fetch_tag(arg->asn, arg->mod, arg->expr, &tag); + if(ret == 0) { + void *p; + p = realloc(*tag2el, sizeof(tag2el_t) * ((*count) + 1)); + if(p) *tag2el = p; + else return -1; + + DEBUG("Found tag for %s: %ld", + arg->expr->Identifier, + (long)tag.tag_value); + + (*tag2el)[*count].el_tag = tag; + (*tag2el)[*count].el_no = el_no; + (*tag2el)[*count].from_expr = arg->expr; + (*count)++; + return 0; + } + + DEBUG("Searching tag in complex expression %s:%x at line %d", + arg->expr->Identifier, + arg->expr->expr_type, + arg->expr->_lineno); + + /* + * Iterate over members of CHOICE type. + */ + if(arg->expr->expr_type == ASN_CONSTR_CHOICE) { + return _fill_tag2el_map(arg, tag2el, count, el_no); + } + + if(arg->expr->expr_type == A1TC_REFERENCE) { + arg_t tmp = *arg; + asn1p_expr_t *expr; + expr = asn1f_lookup_symbol_ex(tmp.asn, &tmp.mod, tmp.expr, + arg->expr->reference); + if(expr) { + tmp.expr = expr; + return _add_tag2el_member(&tmp, tag2el, count, el_no); + } else { + FATAL("Cannot dereference %s at line %d", + arg->expr->Identifier, + arg->expr->_lineno); + return -1; + } + } + + DEBUG("No tag for %s at line %d", + arg->expr->Identifier, + arg->expr->_lineno); + + return -1; +} + +static int +emit_constraint_checking_code(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + asn1p_expr_type_e etype; + int size_present, value_present; + + if(expr->constraints == NULL) + return 0; /* No constraints defined */ + + etype = _find_terminal_type(arg); + + size_present = check_constraint_type_presence(expr->constraints, + ACT_CT_SIZE); + value_present = check_constraint_type_presence(expr->constraints, + ACT_EL_VALUE); + + if(size_present || value_present) { + OUT("%s_t *st = sptr;\n", MKID(arg->expr->Identifier)); + if(size_present) { + OUT("size_t size;\n"); + OUT("size_t min_size __attribute__ ((unused)) = %ld;\n", + compute_min_size(arg)); + OUT("size_t max_size __attribute__ ((unused)) = %ld;\n", + compute_max_size(arg)); + } + if(value_present) + switch(etype) { + case ASN_BASIC_INTEGER: + case ASN_BASIC_ENUMERATED: + OUT("long value;\n"); + break; + case ASN_BASIC_BOOLEAN: + OUT("int value;\n"); + break; + default: + break; + } + OUT("\n"); + } + + OUT("if(!sptr) {\n"); + INDENT(+1); + OUT("_ASN_ERRLOG(\"%%s: value not given\", td->name);\n"); + OUT("return -1;\n"); + INDENT(-1); + OUT("}\n"); + OUT("\n"); + + if(size_present) + emit_size_determination_code(arg); + if(value_present) + emit_value_determination_code(arg); + + OUT("\n"); + OUT("if(\n"); + emit_single_constraint_check(arg, expr->constraints, 0); + OUT(") {\n"); + INDENTED(OUT("/* Constraint check succeeded */\n")); + OUT("} else {\n"); + INDENT(+1); + OUT("_ASN_ERRLOG(\"%%s: constraint failed\", td->name);\n"); + OUT("return -1;\n"); + INDENT(-1); + OUT("}\n"); + + return 0; +} + +static int +emit_single_constraint_check(arg_t *arg, asn1p_constraint_t *ct, int mode) { + char *s_v; + int el; + + assert(arg && ct); + + switch(ct->type) { + case ACT_INVALID: + assert(ct->type != ACT_INVALID); + OUT("-1 /* Invalid constraint at line %d */\n", ct->_lineno); + break; + case ACT_EL_VALUE: + OUT("("); + if(mode == ACT_CT_SIZE) s_v = "size"; + else s_v = "value"; + OUT("%s", s_v); + if(ct->value->type != ATV_TRUE) + OUT(" == "); + switch(ct->value->type) { + case ATV_INTEGER: OUT("%lld", + (long long)ct->value->value.v_integer); break; + case ATV_MIN: OUT("min_%s", s_v); break; + case ATV_MAX: OUT("max_%s", s_v); break; + case ATV_FALSE: OUT("0"); break; + case ATV_TRUE: break; + default: + break; + } + OUT(")\n"); + break; + case ACT_EL_RANGE: + case ACT_EL_LLRANGE: + case ACT_EL_RLRANGE: + case ACT_EL_ULRANGE: + if(mode == ACT_CT_SIZE) { + s_v = "size"; + } else { + s_v = "value"; + } + OUT("((%s", s_v); + switch(ct->type) { + case ACT_EL_RANGE: + case ACT_EL_RLRANGE: + OUT(" >= "); break; + case ACT_EL_LLRANGE: + case ACT_EL_ULRANGE: + OUT(" > "); break; + default: break; + } + switch(ct->range_start->type) { + case ATV_INTEGER: OUT("%lld", + (long long)ct->range_start->value.v_integer); break; + case ATV_MIN: OUT("min_%s", s_v); break; + case ATV_MAX: OUT("max_%s", s_v); break; + case ATV_FALSE: OUT("0"); break; + case ATV_TRUE: break; + default: + break; + } + OUT(") && (%s", s_v); + switch(ct->type) { + case ACT_EL_RANGE: + case ACT_EL_LLRANGE: + OUT(" <= "); break; + case ACT_EL_RLRANGE: + case ACT_EL_ULRANGE: + OUT(" < "); break; + default: break; + } + switch(ct->range_stop->type) { + case ATV_INTEGER: OUT("%lld", + (long long)ct->range_stop->value.v_integer); break; + case ATV_MIN: OUT("min_%s", s_v); break; + case ATV_MAX: OUT("max_%s", s_v); break; + case ATV_FALSE: OUT("0"); break; + case ATV_TRUE: break; + default: + break; + } + OUT("))\n"); + break; + case ACT_EL_EXT: + OUT("0 /* Extensible (...), but not defined herein */\n"); + break; + case ACT_CT_SIZE: + if(mode) { + OUT("0 /* Invalid constraint at line %d */\n", + ct->_lineno); + return -1; + } + assert(ct->el_count == 1); + return emit_single_constraint_check(arg, + ct->elements[0], ACT_CT_SIZE); + case ACT_CT_FROM: + if(mode) { + OUT("0 /* Invalid constraint at line %d */\n", + ct->_lineno); + return -1; + } + OUT("check_alphabet_%x(sptr)\n", ct); + break; + case ACT_CT_WCOMP: + case ACT_CT_WCOMPS: + OUT("%d /* Unsupported constraint at line %d */\n", + ct->type, ct->_lineno); + return -1; + break; + case ACT_CA_SET: + OUT("(\n"); + INDENT(+1); + for(el = 0; el < ct->el_count; el++) { + if(el) OUT("&& "); + emit_single_constraint_check(arg, + ct->elements[el], mode); + } + INDENT(-1); + OUT(")\n"); + break; + case ACT_CA_CSV: + OUT("(\n"); + INDENT(+1); + for(el = 0; el < ct->el_count; el++) { + if(el) OUT("|| "); + emit_single_constraint_check(arg, + ct->elements[el], mode); + } + INDENT(-1); + OUT(")\n"); + break; + case ACT_CA_UNI: + OUT("(\n"); + INDENT(+1); + for(el = 0; el < ct->el_count; el++) { + if(el) OUT("|| "); + emit_single_constraint_check(arg, + ct->elements[el], mode); + } + INDENT(-1); + OUT(")\n"); + break; + case ACT_CA_INT: + OUT("(\n"); + INDENT(+1); + for(el = 0; el < ct->el_count; el++) { + if(el) OUT("&& "); + emit_single_constraint_check(arg, + ct->elements[el], mode); + } + INDENT(-1); + OUT(")\n"); + break; + case ACT_CA_CRC: + WARNING("Unsupported component relation constraint at line %d", + ct->_lineno); + OUT("%d /* Unsupported component relation constraint " + "at line %d */\n", + ct->type, ct->_lineno); + return -1; + case ACT_CA_EXC: + WARNING("Unsupported EXCEPT constraint at line %d", + ct->_lineno); + OUT("%d /* Unsupported EXCEPT constraint at line %d */\n", + ct->type, ct->_lineno); + return -1; + } + + return 0; +} + +static int +check_constraint_type_presence(asn1p_constraint_t *ct, enum asn1p_constraint_type_e type) { + int el; + + if(ct == NULL) return 0; + + if(ct->type == type) return 1; + + if(type == ACT_EL_VALUE) { + if(ct->type >= ACT_CT_SIZE + && ct->type <= ACT_CT_WCOMPS) + /* Values defined further + * are not really value's values */ + return 0; + if(ct->type > ACT_EL_VALUE && ct->type < ACT_CT_SIZE) + return 1; /* Also values */ + } + + for(el = 0; el < ct->el_count; el++) { + if(check_constraint_type_presence(ct->elements[el], type)) + return 1; + } + + return 0; +} + +static int +emit_alphabet_tables(arg_t *arg, asn1p_constraint_t *ct, int *table) { + int ch = 0; + int ch_start = 0; + int ch_stop = 0; + int el = 0; + + assert(arg && ct); + + switch(ct->type) { + case ACT_INVALID: + break; + case ACT_EL_VALUE: + if(!table) break; + + switch(ct->value->type) { + case ATV_INTEGER: + if(ct->value->value.v_integer < 0 + || ct->value->value.v_integer > 255) { + OUT("\n"); + OUT("#error Value %lld out of range " + "for alphabet character at line %d\n", + (long long)ct->value->value.v_integer, + ct->_lineno); + break; + } else { + ch = ct->value->value.v_integer; + table[ch] = 1; + } + break; + case ATV_STRING: + for(ch = 0; ch < ct->value->value.string.size; ch++) + table[ct->value->value.string.buf[ch]] = 1; + break; + default: + OUT("\n"); + WARNING("Invalid alphabet character specification " + "at line %d", ct->_lineno); + OUT("#error Invalid alphabet character specification " + "at line %d\n", ct->_lineno); + break; + } + break; + case ACT_EL_RANGE: + case ACT_EL_LLRANGE: + case ACT_EL_RLRANGE: + case ACT_EL_ULRANGE: + if(!table) break; + + ch_start = 0; + ch_stop = 255; + + switch(ct->range_start->type) { + case ATV_INTEGER: + ch_start = ct->range_start->value.v_integer; break; + case ATV_MIN: ch_start = 0; break; + case ATV_MAX: ch_start = 255; break; + case ATV_STRING: + if(ct->range_start->value.string.size == 1) { + ch_start = ct->range_start->value.string.buf[0]; + break; + } + /* Fall through */ + default: + OUT("\n"); + FATAL("Invalid alphabet range constraint " + "at line %d\n", ct->_lineno); + OUT("#error Invalid alphabet range constraint " + "at line %d\n", ct->_lineno); + return -1; + } + + switch(ct->range_stop->type) { + case ATV_INTEGER: + ch_stop = ct->range_stop->value.v_integer; break; + case ATV_MIN: ch_stop = 0; break; + case ATV_MAX: ch_stop = 255; break; + case ATV_STRING: + if(ct->range_stop->value.string.size == 1) { + ch_stop = ct->range_stop->value.string.buf[0]; + break; + } + /* Fall through */ + default: + OUT("\n"); + FATAL("Invalid alphabet range constraint " + "at line %d\n", ct->_lineno); + OUT("#error Invalid alphabet range constraint " + "at line %d\n", ct->_lineno); + break; + } + + switch(ct->type) { + case ACT_EL_RANGE: break; + case ACT_EL_RLRANGE: ch_stop--; break; + case ACT_EL_LLRANGE: ch_start++; break; + case ACT_EL_ULRANGE: ch_start++; ch_stop--; break; + default: break; + } + + if(ch_start > ch_stop) { + WARNING("Empty character range " + "alphabet constraint at line %d", ct->_lineno); + OUT("#warning Empty character range " + "alphabet constraint at line %d\n", ct->_lineno); + break; + } + + for(ch = ch_start; ch <= ch_stop; ch++) { + if(ch < 0 || ch > 255) continue; + table[ch] = 1; + } + + break; + case ACT_EL_EXT: + break; + case ACT_CT_SIZE: + break; + case ACT_CT_FROM: + if(table) { + OUT("#error Nested FROM in subtype constraints\n"); + return -1; + } else { + table = alloca(256 * sizeof(table[0])); + memset(table, 0, 256 * sizeof(table[0])); + + for(el = 0; el < ct->el_count; el++) { + emit_alphabet_tables(arg, ct->elements[el], + table); + } + OUT("static int alphabet_table_%x[256] = {\n", ct); + for(ch = 0; ch < 256; ch++) { + OUT("%d,", table[ch]?1:0); + if(!((ch+1) % 16)) { + if(ch) { + int c; + OUT("\t/* "); + for(c = ch - 16; c < ch; c++) { + if(table[c]) { + if(c > 0x20 + && c < 0x80) + OUT("%c", c); + else + OUT(".", c); + } else { + OUT(" "); + } + } + OUT(" */"); + } + OUT("\n"); + } + } + OUT("};\n"); + OUT("static int check_alphabet_%x(void *sptr) {\n", ct); + INDENT(+1); + OUT("int *table = alphabet_table_%x;\n", ct); + emit_alphabet_check_cycle(arg); + OUT("return 1;\n"); + INDENT(-1); + OUT("};\n"); + } + break; + case ACT_CT_WCOMP: + case ACT_CT_WCOMPS: + break; + case ACT_CA_CRC: + break; + case ACT_CA_SET: + case ACT_CA_CSV: + case ACT_CA_UNI: + for(el = 0; el < ct->el_count; el++) + emit_alphabet_tables(arg, ct->elements[el], table); + break; + case ACT_CA_INT: + if(table) { + int table2[256]; + + assert(ct->el_count >= 1); + emit_alphabet_tables(arg, ct->elements[0], table); + for(el = 1; el < ct->el_count; el++) { + memset(table2, 0, sizeof(table2)); + emit_alphabet_tables(arg, + ct->elements[el], table2); + /* Intersection */ + for(ch = 0; ch < 256; ch++) { + if(table2[ch] == 0) + table[ch] = 0; + } + } + } else { + for(el = 0; el < ct->el_count; el++) + emit_alphabet_tables(arg, ct->elements[el], 0); + } + + break; + case ACT_CA_EXC: + OUT("EXC\n"); + if(table) { + int table2[256]; + + assert(ct->el_count >= 1); + emit_alphabet_tables(arg, ct->elements[0], table); + for(el = 1; el < ct->el_count; el++) { + memset(table2, 0, sizeof(table2)); + emit_alphabet_tables(arg, + ct->elements[el], table2); + /* Exclusion */ + for(ch = 0; ch < 256; ch++) { + if(table2[ch]) + table[ch] = 0; + } + } + } else { + for(el = 0; el < ct->el_count; el++) + emit_alphabet_tables(arg, ct->elements[el], 0); + } + break; + } + + return 0; +} + +static int +emit_alphabet_check_cycle(arg_t *arg) { + asn1p_expr_type_e etype; + + etype = _find_terminal_type(arg); + if(!(etype & ASN_STRING_MASK) + && !(etype == ASN_BASIC_OCTET_STRING)) { + OUT("#error Cannot apply FROM constraint to ASN.1 type %s\n", + ASN_EXPR_TYPE2STR(etype)); + return -1; + } + + OUT("/* The underlying type is %s */\n", + ASN_EXPR_TYPE2STR(etype)); + OUT("%s_t *st = sptr;\n", MKID(arg->expr->Identifier)); + + switch(etype) { + case ASN_STRING_UTF8String: + OUT("uint8_t *ch = st->buf;\n"); + OUT("uint8_t *end = ch + st->size;\n"); + OUT("\n"); + OUT("for(; ch < end; ch++) {\n"); + INDENT(+1); + OUT("if(*ch >= 0x80 || !table[*ch]) return 0;\n"); + INDENT(-1); + OUT("}\n"); + break; + case ASN_STRING_UniversalString: + OUT("uint32_t *ch = st->buf;\n"); + OUT("uint32_t *end = ch + st->size;\n"); + OUT("\n"); + OUT("for(; ch < end; ch++) {\n"); + INDENT(+1); + OUT("uint32_t wc = (((uint8_t *)ch)[0] << 24)\n"); + OUT("\t\t| (((uint8_t *)ch)[1] << 16)\n"); + OUT("\t\t| (((uint8_t *)ch)[2] << 8)\n"); + OUT("\t\t| ((uint8_t *)ch)[3]\n"); + OUT("if(wc > 255 || !table[wc]) return 0;\n"); + INDENT(-1); + OUT("}\n"); + OUT("if(ch != end) return 0; /* (size%4)! */\n"); + break; + case ASN_STRING_BMPString: + OUT("uint16_t *ch = st->buf;\n"); + OUT("uint16_t *end = ch + st->size;\n"); + OUT("\n"); + OUT("for(; ch < end; ch++) {\n"); + INDENT(+1); + OUT("uint16_t wc = (((uint8_t *)ch)[0] << 8)\n"); + OUT("\t\t| ((uint8_t *)ch)[1];\n"); + OUT("if(wc > 255 || !table[wc]) return 0;\n"); + INDENT(-1); + OUT("}\n"); + OUT("if(ch != end) return 0; /* (size%2)! */\n"); + break; + case ASN_BASIC_OCTET_STRING: + default: + OUT("uint8_t *ch = st->buf;\n"); + OUT("uint8_t *end = ch + st->size;\n"); + OUT("\n"); + OUT("for(; ch < end; ch++) {\n"); + INDENT(+1); + OUT("if(!table[*ch]) return 0;\n"); + INDENT(-1); + OUT("}\n"); + break; + } + + return 0; +} + +static int +emit_size_determination_code(arg_t *arg) { + asn1p_expr_type_e etype = _find_terminal_type(arg); + + switch(etype) { + case ASN_BASIC_BIT_STRING: + OUT("if(st->size > 0) {\n"); + OUT("\t/* Size in bits */\n"); + OUT("\tsize = (st->size - 1) - (st->buf[0] & 0x7);\n"); + OUT("} else {\n"); + OUT("\tsize = 0;\n"); + OUT("}\n"); + break; + case ASN_STRING_UniversalString: + OUT("size = st->size >> 2;\t/* 4 byte per character */\n"); + break; + case ASN_STRING_BMPString: + OUT("size = st->size >> 1;\t/* 2 byte per character */\n"); + break; + case ASN_STRING_UTF8String: + OUT("size = UTF8String_length(st, td->name, app_errlog, app_key);\n"); + OUT("if(size == (size_t)-1) return -1;\n"); + break; + default: + if((etype & ASN_STRING_MASK) + || etype == ASN_BASIC_OCTET_STRING) { + OUT("size = st->size;\n"); + break; + } else { + WARNING("Size operation is not defined for %s", + ASN_EXPR_TYPE2STR(etype)); + OUT("#warning Size operation not defined!\n"); + OUT("size = st->size;\n"); + } + return -1; + } + + return 0; +} + +static int +emit_value_determination_code(arg_t *arg) { + asn1p_expr_type_e etype = _find_terminal_type(arg); + + switch(etype) { + case ASN_BASIC_INTEGER: + case ASN_BASIC_ENUMERATED: + OUT("if(asn1_INTEGER2long(st, &value)) {\n"); + INDENT(+1); + OUT("_ASN_ERRLOG(\"%%s: value too large\", td->name);\n"); + OUT("return -1;\n"); + INDENT(-1); + OUT("}\n"); + break; + case ASN_BASIC_BOOLEAN: + OUT("value = st->value;\n"); + break; + default: + WARNING("Value cannot be determined " + "for constraint check for %s at line %d\n", + arg->expr->Identifier, arg->expr->_lineno); + OUT("#error Value cannot be determined for %s at %d\n", + arg->expr->Identifier, arg->expr->_lineno); + break; + } + + return 0; +} + +static long compute_min_size(arg_t *arg) { return compute_xxx_size(arg, 0); } +static long compute_max_size(arg_t *arg) { return compute_xxx_size(arg, 1); } + +static long compute_xxx_size(arg_t *arg, int _max) { + asn1p_expr_type_e etype; + long basic_max = 0x7fffffff; + long basic_min = 0x80000000; + long svalue = 0; + + etype = _find_terminal_type(arg); + switch(etype) { + case ASN_BASIC_BIT_STRING: + svalue = _max?basic_max/8:0; + break; + case ASN_STRING_UTF8String: + svalue = _max?basic_max/6:0; + break; + case ASN_STRING_UniversalString: + svalue = _max?basic_max/4:0; + break; + case ASN_STRING_BMPString: + svalue = _max?basic_max/2:0; + break; + case ASN_BASIC_OCTET_STRING: + svalue = _max?basic_max:0; + break; + default: + if((etype & ASN_STRING_MASK)) { + svalue = _max?basic_max:0; + break; + } + svalue = _max?basic_max:basic_min; + break; + } + + return svalue; +} + +static asn1p_expr_type_e +_find_terminal_type(arg_t *arg) { + asn1p_expr_t *expr; + expr = asn1f_find_terminal_type_ex(arg->asn, arg->mod, arg->expr, NULL); + assert(expr); + return expr->expr_type; +} diff --git a/libasn1compiler/asn1c_C.h b/libasn1compiler/asn1c_C.h new file mode 100644 index 000000000..643d62935 --- /dev/null +++ b/libasn1compiler/asn1c_C.h @@ -0,0 +1,69 @@ +#ifndef ASN1_COMPILER_LANGUAGE_C_H +#define ASN1_COMPILER_LANGUAGE_C_H + +#include "asn1c_lang.h" + +int asn1c_lang_C_type_REFERENCE(arg_t *); +int asn1c_lang_C_type_EXTENSIBLE(arg_t *); + +int asn1c_lang_C_type_SEQUENCE(arg_t *); +int asn1c_lang_C_type_SEQUENCE_OF(arg_t *); +int asn1c_lang_C_type_SET(arg_t *); +int asn1c_lang_C_type_SET_OF(arg_t *); +int asn1c_lang_C_type_CHOICE(arg_t *); + +int asn1c_lang_C_type_INTEGER(arg_t *); +int asn1c_lang_C_type_ENUMERATED(arg_t *); +int asn1c_lang_C_type_SIMPLE_TYPE(arg_t *); + +static asn1_language_map_t asn1_lang_C[] __attribute__ ((unused)) = { + { AMT_TYPE, A1TC_REFERENCE, asn1c_lang_C_type_REFERENCE }, + { AMT_TYPEREF, A1TC_REFERENCE, asn1c_lang_C_type_REFERENCE }, + { AMT_TYPE, A1TC_EXTENSIBLE, asn1c_lang_C_type_EXTENSIBLE }, + /* + * Constructed types + */ + { AMT_TYPE, ASN_CONSTR_SEQUENCE, asn1c_lang_C_type_SEQUENCE }, + { AMT_TYPE, ASN_CONSTR_SEQUENCE_OF, asn1c_lang_C_type_SEQUENCE_OF }, + { AMT_TYPEREF, ASN_CONSTR_SEQUENCE_OF, asn1c_lang_C_type_SEQUENCE_OF }, + { AMT_TYPE, ASN_CONSTR_SET, asn1c_lang_C_type_SET }, + { AMT_TYPE, ASN_CONSTR_SET_OF, asn1c_lang_C_type_SET_OF }, + { AMT_TYPEREF, ASN_CONSTR_SET_OF, asn1c_lang_C_type_SET_OF }, + { AMT_TYPE, ASN_CONSTR_CHOICE, asn1c_lang_C_type_CHOICE }, + /* + * Basic types + */ + { AMT_TYPE, ASN_BASIC_BOOLEAN, asn1c_lang_C_type_SIMPLE_TYPE }, + { AMT_TYPE, ASN_BASIC_NULL, asn1c_lang_C_type_SIMPLE_TYPE }, + { AMT_TYPE, ASN_BASIC_INTEGER, asn1c_lang_C_type_INTEGER }, + /* [Skipped REAL] */ + { AMT_TYPE, ASN_BASIC_ENUMERATED, asn1c_lang_C_type_ENUMERATED }, + { AMT_TYPE, ASN_BASIC_BIT_STRING, asn1c_lang_C_type_SIMPLE_TYPE }, + { AMT_TYPE, ASN_BASIC_OCTET_STRING, asn1c_lang_C_type_SIMPLE_TYPE }, + { AMT_TYPE, ASN_BASIC_OBJECT_IDENTIFIER,asn1c_lang_C_type_SIMPLE_TYPE }, + { AMT_TYPE, ASN_BASIC_RELATIVE_OID, asn1c_lang_C_type_SIMPLE_TYPE }, + { AMT_TYPE, ASN_BASIC_CHARACTER_STRING, asn1c_lang_C_type_SIMPLE_TYPE }, + { AMT_TYPE, ASN_BASIC_UTCTime, asn1c_lang_C_type_SIMPLE_TYPE }, + { AMT_TYPE, ASN_BASIC_GeneralizedTime, asn1c_lang_C_type_SIMPLE_TYPE }, + /* + * String types + */ + { AMT_TYPE, ASN_STRING_BMPString, asn1c_lang_C_type_SIMPLE_TYPE }, + { AMT_TYPE, ASN_STRING_GeneralString, asn1c_lang_C_type_SIMPLE_TYPE }, + { AMT_TYPE, ASN_STRING_GraphicString, asn1c_lang_C_type_SIMPLE_TYPE }, + { AMT_TYPE, ASN_STRING_IA5String, asn1c_lang_C_type_SIMPLE_TYPE }, + { AMT_TYPE, ASN_STRING_ISO646String, asn1c_lang_C_type_SIMPLE_TYPE }, + { AMT_TYPE, ASN_STRING_NumericString, asn1c_lang_C_type_SIMPLE_TYPE }, + { AMT_TYPE, ASN_STRING_PrintableString,asn1c_lang_C_type_SIMPLE_TYPE }, + { AMT_TYPE, ASN_STRING_TeletexString, asn1c_lang_C_type_SIMPLE_TYPE }, + { AMT_TYPE, ASN_STRING_T61String, asn1c_lang_C_type_SIMPLE_TYPE }, + { AMT_TYPE, ASN_STRING_UniversalString,asn1c_lang_C_type_SIMPLE_TYPE }, + { AMT_TYPE, ASN_STRING_UTF8String, asn1c_lang_C_type_SIMPLE_TYPE }, + { AMT_TYPE, ASN_STRING_VideotexString,asn1c_lang_C_type_SIMPLE_TYPE }, + { AMT_TYPE, ASN_STRING_VisibleString, asn1c_lang_C_type_SIMPLE_TYPE }, + { AMT_TYPE, ASN_STRING_ObjectDescriptor,asn1c_lang_C_type_SIMPLE_TYPE }, + { 0, 0, 0 } +}; + + +#endif /* ASN1_COMPILER_LANGUAGE_C_H */ diff --git a/libasn1compiler/asn1c_internal.h b/libasn1compiler/asn1c_internal.h new file mode 100644 index 000000000..91772cdcb --- /dev/null +++ b/libasn1compiler/asn1c_internal.h @@ -0,0 +1,81 @@ +#ifndef _ASN1_COMPILER_INTERNAL_H_ +#define _ASN1_COMPILER_INTERNAL_H_ + +#include +#include +#include /* for fstat(2) */ +#include /* for unlink(2) */ +#include /* for open(2) */ +#include /* for glob(3) */ +#include /* for basename(3) */ +#include +#include /* for isalnum(3) */ +#include +#include +#include + +#include "asn1compiler.h" + +typedef struct arg_s { + + enum asn1c_flags flags; + + void (*logger_cb)(int _severity, const char *fmt, ...); + + int (*default_cb)(struct arg_s *); + + struct compiler_streams *target; + + asn1p_t *asn; + asn1p_module_t *mod; + asn1p_expr_t *expr; + + int indent_level; + int indented; + int embed; +} arg_t; + +#include "asn1c_lang.h" /* Target language initialization */ +#include "asn1c_misc.h" /* Miscellaneous functions */ +#include "asn1c_out.h" /* Handle output during compilation */ +#include "asn1c_save.h" /* Save compiled output */ + +#define INDENT(val) arg->indent_level += (val) +#define INDENTED(code) do { \ + INDENT(+1); \ + do { code; } while(0); \ + INDENT(-1); \ + } while(0) +#define FLAT(code) do { \ + int _il = arg->indent_level; \ + arg->indent_level = 0; \ + do { code; } while(0); \ + arg->indent_level = _il; \ + } while(0) +#define EMBED(ev) do { \ + REDIR(OT_TYPE_DECLS); \ + arg->embed++; \ + INDENTED(arg_t _tmp = *arg; \ + _tmp.expr = ev; \ + _tmp.default_cb(&_tmp); \ + ); \ + arg->embed--; \ + } while(0) +#define OUT(fmt, args...) asn1c_compiled_output(arg, fmt, ##args) + +#define REDIR(foo) do { arg->target->target = foo; } while(0) + +/* + * Logging. + */ +#define LOG(ll, fmt, args...) do { \ + arg->logger_cb(ll, fmt, ##args); \ + } while(0) +#define DEBUG(fmt, args...) do { \ + if(arg->flags & A1C_DEBUG) \ + LOG(-1, fmt, ##args); \ + } while(0) +#define WARNING(fmt, args...) LOG(0, fmt, ##args); +#define FATAL(fmt, args...) LOG(1, fmt, ##args); + +#endif /* _ASN1_COMPILER_INTERNAL_H_ */ diff --git a/libasn1compiler/asn1c_lang.c b/libasn1compiler/asn1c_lang.c new file mode 100644 index 000000000..fa07540a0 --- /dev/null +++ b/libasn1compiler/asn1c_lang.c @@ -0,0 +1,32 @@ +#include "asn1c_internal.h" +#include "asn1c_C.h" + +asn1_language_map_t asn1_lang_map[AMT_EXPR_META_MAX][ASN_EXPR_TYPE_MAX]; + +int +asn1c_with_language(asn1c_target_language_e lang) { + asn1_language_map_t *lptr; + int lsize; + if(lang != ASN1C_LANGUAGE_C) { + errno = EINVAL; + return -1; + } + + lptr = asn1_lang_C; + lsize = sizeof(asn1_lang_C)/sizeof(asn1_lang_C[0]); + + memset(asn1_lang_map, 0, sizeof(asn1_lang_map)); + + for(; lsize && lptr->expr_match; lsize--, lptr++) { + assert(lptr->meta_match > 0); + assert(lptr->meta_match < AMT_EXPR_META_MAX); + assert(lptr->expr_match > 0); + assert(lptr->expr_match < ASN_EXPR_TYPE_MAX); + + asn1_lang_map[lptr->meta_match][lptr->expr_match] + = *lptr; + } + + return 0; +} + diff --git a/libasn1compiler/asn1c_lang.h b/libasn1compiler/asn1c_lang.h new file mode 100644 index 000000000..8c9a6ea70 --- /dev/null +++ b/libasn1compiler/asn1c_lang.h @@ -0,0 +1,28 @@ +#ifndef ASN1_COMPILER_LANGUAGE_H +#define ASN1_COMPILER_LANGUAGE_H + +struct arg_s; + +typedef struct asn1_language_map_s { + asn1p_expr_meta_e meta_match; /* meta_type */ + asn1p_expr_type_e expr_match; /* expr_type */ + /* + * A callback that would create a language-specific type declaration. + */ + int (*type_cb)(struct arg_s *arg); +} asn1_language_map_t; + + +extern asn1_language_map_t asn1_lang_map[AMT_EXPR_META_MAX][ASN_EXPR_TYPE_MAX]; + + +typedef enum asn1c_target_language { + ASN1C_LANGUAGE_C, +} asn1c_target_language_e; + +/* + * Initialize the compiler to generate specified target language. + */ +int asn1c_with_language(asn1c_target_language_e lang); + +#endif /* ASN1_COMPILER_LANGUAGE_H */ diff --git a/libasn1compiler/asn1c_misc.c b/libasn1compiler/asn1c_misc.c new file mode 100644 index 000000000..b464b64cd --- /dev/null +++ b/libasn1compiler/asn1c_misc.c @@ -0,0 +1,232 @@ +#include "asn1c_internal.h" +#include + +#ifndef DEFFILEMODE /* Normally in */ +#define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) +#endif + +/* + * Construct identifier from multiple parts. + * Convert unsafe characters to underscores. + */ +char * +asn1c_make_identifier(int unsafe_only_spaces, char *arg1, ...) { + static char *storage; + static int storage_size; + int nodelimiter = 0; + va_list ap; + char *str; + int size; + char *p; + + if(arg1 == NULL) + return NULL; + + /* + * Estimate the necessary storage size + */ + size = strlen(arg1); + va_start(ap, arg1); + while((str = va_arg(ap, char *))) + size += 1 + strlen(str); + va_end(ap); + + /* + * Make sure we have this amount of storage. + */ + if(storage_size <= size) { + if(storage) free(storage); + storage = malloc(size + 1); + if(storage) { + storage_size = size; + } else { + storage_size = 0; + return NULL; + } + } + + /* + * Fill-in the storage. + */ + va_start(ap, arg1); + str = arg1; + p = storage; + for(str = arg1; str; str = va_arg(ap, char *)) { + int subst_made = 0; + + if(str[0] == ' ' && str[1] == '\0') { + *p++ = ' '; + nodelimiter = 1; /* No delimiter */ + continue; + } + + if(str != arg1 && !nodelimiter) + *p++ = '_'; /* Delimiter between tokens */ + nodelimiter = 0; + + for(; *str; str++) { + if(isalnum(*str)) { + *p++ = *str; + subst_made = 0; + } else if(!subst_made++) { + if(unsafe_only_spaces && !isspace(*str)) { + *p ++ = *str; + } else { + *p++ = '_'; + } + } + } + } + va_end(ap); + *p = '\0'; + + assert((p - storage) <= storage_size); + + return storage; +} + +FILE * +asn1c_open_file(arg_t *arg, const char *name, const char *ext) { + int created = 1; + struct stat sb; + char *fname; + int len; + FILE *fp; + int fd; + + /* + * Compute filenames. + */ + len = strlen(name) + strlen(ext) + 1; + fname = alloca(len); + snprintf(fname, len, "%s%s", name, ext); + + /* + * Create files. + */ + fd = open(fname, O_CREAT | O_EXCL | O_WRONLY, DEFFILEMODE); + if(fd == -1 && errno == EEXIST) { + fd = open(fname, O_WRONLY, DEFFILEMODE); + created = 0; + } + if(fd == -1) { + perror(fname); + return NULL; + } + + /* + * Check sanity. + */ + if(fstat(fd, &sb) || !S_ISREG(sb.st_mode)) { + fprintf(stderr, "%s: Not a regular file\n", fname); + if(created) unlink(fname); + close(fd); + return NULL; + } + + (void)ftruncate(fd, 0); + + /* + * Convert file descriptor into file pointer. + */ + fp = fdopen(fd, "w"); + if(fp == NULL) { + if(created) unlink(fname); + close(fd); + } + return fp; +} + +char * +asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { + char *typename; + + switch(expr->expr_type) { + case A1TC_REFERENCE: + typename = expr->reference->components[ + expr->reference->comp_count-1].name; + if(typename[0] == '&') { + arg_t tmp = *arg; + + /* + * This is a reference to a type defined in a class. + * Resolve it and use instead. + */ + tmp.expr = asn1f_class_access_ex(arg->asn, arg->mod, + arg->expr, expr->reference, &tmp.mod); + if(tmp.expr) return NULL; + + return asn1c_type_name(&tmp, tmp.expr, _format); + } else if(_format == TNF_RSAFE) { + /* + * The recursion-safe format is requested. + * The problem here is that only constructed types + * might be referenced with "struct". + * Change RSAFE to CTYPE if the terminal type + * is primitive. + */ + asn1p_expr_t *terminal; + terminal = asn1f_find_terminal_type_ex( + arg->asn, arg->mod, arg->expr, NULL); + if(terminal + && (terminal->expr_type + & (ASN_BASIC_MASK | ASN_STRING_MASK))) + _format = TNF_CTYPE; + } + break; + case ASN_CONSTR_SEQUENCE_OF: + case ASN_CONSTR_SET_OF: + if(expr->Identifier) { + typename = expr->Identifier; + } else { + asn1p_expr_t *child; + child = TQ_FIRST(&(expr->members)); + typename = asn1c_type_name(arg, child, _format); + if(typename) + return typename; + _format = TNF_SAFE; + typename = child->Identifier; + } + break; + case ASN_BASIC_INTEGER: + case ASN_BASIC_ENUMERATED: + if((arg->flags & A1C_USE_NATIVE_INTEGERS)) { + switch(_format) { + case TNF_CTYPE: + case TNF_RSAFE: + return "int"; + default: + if(expr->expr_type == ASN_BASIC_INTEGER) + return "NativeInteger"; + else + return "NativeEnumerated"; + } + } + /* Fall through */ + default: + if(expr->expr_type & (ASN_BASIC_MASK | ASN_STRING_MASK)) { + if(_format == TNF_RSAFE) + _format = TNF_CTYPE; + typename = ASN_EXPR_TYPE2STR(expr->expr_type); + } else { + _format = TNF_SAFE; + typename = expr->Identifier; + } + } + + switch(_format) { + case TNF_UNMODIFIED: + case TNF_INCLUDE: + return asn1c_make_identifier(1, typename, 0); + case TNF_SAFE: + return asn1c_make_identifier(0, typename, 0); + case TNF_CTYPE: + return asn1c_make_identifier(0, typename, "t", 0); + case TNF_RSAFE: + return asn1c_make_identifier(0, "struct", " ", typename, 0); + } + + assert("!unreachable"); + return typename; +} + diff --git a/libasn1compiler/asn1c_misc.h b/libasn1compiler/asn1c_misc.h new file mode 100644 index 000000000..2f82b0b65 --- /dev/null +++ b/libasn1compiler/asn1c_misc.h @@ -0,0 +1,28 @@ +#ifndef _ASN1_COMPILER_MISC_H_ +#define _ASN1_COMPILER_MISC_H_ + +/* + * Make the target language identifier out of one or more names. + * The function will concatenate the names and replace unsafe characters + * with safe ones. + */ +char *asn1c_make_identifier(int unsafe_only_spaces, char *arg1, ...); + +/* + * Return the type name of the specified expression. + */ +enum tnfmt { + TNF_UNMODIFIED, /* Return unmodified type name */ + TNF_INCLUDE, /* Format for #include <> */ + TNF_CTYPE, /* Format as normal C-ish type (append "_t") */ + TNF_SAFE, /* Replace unsafe characters with _ */ + TNF_RSAFE, /* Recursion-safe C type format */ +}; +char *asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format); + +/* + * Open the arbitrary file by its base name and extension. + */ +FILE *asn1c_open_file(arg_t *arg, const char *base_part, const char *extension); + +#endif /* _ASN1_COMPILER_MISC_H_ */ diff --git a/libasn1compiler/asn1c_out.c b/libasn1compiler/asn1c_out.c new file mode 100644 index 000000000..a6432418e --- /dev/null +++ b/libasn1compiler/asn1c_out.c @@ -0,0 +1,75 @@ +#include "asn1c_internal.h" + +/* + * Add an elementary chunk of target language text + * into appropriate output stream. + */ +int +asn1c_compiled_output(arg_t *arg, const char *fmt, ...) { + const char *p; + int lf_found; + va_list ap; + out_chunk_t *m; + char *buf; + int ret; + + /* + * Make sure the output has a single LF and only at the end. + */ + for(lf_found = 0, p = fmt; *p; p++) { + if(*p == '\n') { + lf_found++; + assert(p[1] == '\0'); + } + } + assert(lf_found <= 1); + + /* + * Print out the indentation. + */ + if(arg->indented == 0) { + int i = arg->indent_level; + arg->indented = 1; + while(i--) { + ret = asn1c_compiled_output(arg, "\t"); + if(ret == -1) return -1; + } + } + + /* + * Estimate necessary size. + */ + buf = ""; + va_start(ap, fmt); + ret = vsnprintf(buf, 0, fmt, ap); + va_end(ap); + assert(ret >= 0); + + /* + * Allocate buffer. + */ + m = calloc(1, sizeof(out_chunk_t)); + if(m == NULL) return -1; + m->len = ret + 1; + m->buf = malloc(ret + 1); + if(m->buf == NULL) { + free(m); + return -1; + } + + /* + * Fill the buffer. + */ + va_start(ap, fmt); + ret = vsnprintf(m->buf, m->len, fmt, ap); + assert(ret < m->len); + m->len = ret; + va_end(ap); + + TQ_ADD(&(arg->target->targets[arg->target->target]), m, next); + + if(lf_found) + arg->indented = 0; + + return 0; +} diff --git a/libasn1compiler/asn1c_out.h b/libasn1compiler/asn1c_out.h new file mode 100644 index 000000000..2267d5dbe --- /dev/null +++ b/libasn1compiler/asn1c_out.h @@ -0,0 +1,31 @@ +#ifndef _ASN1_COMPILED_OUTPUT_H_ +#define _ASN1_COMPILED_OUTPUT_H_ + +/* + * An elementary chunk of target language text. + */ +typedef struct out_chunk { + char *buf; + int len; + + TQ_ENTRY(struct out_chunk) next; +} out_chunk_t; + +typedef struct compiler_streams { + enum { + OT_DEPS, /* Dependencies */ + OT_TYPE_DECLS, /* Type declarations */ + OT_FUNC_DECLS, /* Function declarations */ + OT_STAT_DEFS, /* Static definitions */ + OT_CODE, /* Some code */ + OT_MAX + } target; + TQ_HEAD(out_chunk_t) targets[OT_MAX]; +} compiler_streams_t; + +static char *_compiler_stream2str[] __attribute__ ((unused)) + = { "DEPS", "TYPE-DECLS", "FUNC-DECLS", "STAT-DEFS", "CODE" }; + +int asn1c_compiled_output(arg_t *arg, const char *fmt, ...); + +#endif /* _ASN1_COMPILED_OUTPUT_H_ */ diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c new file mode 100644 index 000000000..0e5b0fbc5 --- /dev/null +++ b/libasn1compiler/asn1c_save.c @@ -0,0 +1,225 @@ +#include "asn1c_internal.h" + +static int asn1c_dump_streams(arg_t *arg); +static int asn1c_print_streams(arg_t *arg); +static int asn1c_save_streams(arg_t *arg); +static int asn1c_copy_over(arg_t *arg, char *path); + +int +asn1c_save_compiled_output(arg_t *arg, const char *datadir) { + + (void)datadir; + + TQ_FOR(arg->mod, &(arg->asn->modules), mod_next) { + TQ_FOR(arg->expr, &(arg->mod->members), next) { + if(asn1_lang_map[arg->expr->meta_type] + [arg->expr->expr_type].type_cb) { + if(asn1c_dump_streams(arg)) + return -1; + } + } + } + + /* + * Dump out the Makefile template and the rest of the support code. + */ + if((arg->flags & A1C_PRINT_COMPILED) == 0 + && (arg->flags & A1C_OMIT_SUPPORT_CODE) == 0) { + glob_t pg; + FILE *mkf; + char *p; + int i; + + i = strlen(datadir) + sizeof("/*.[ch]"); + p = alloca(i); + snprintf(p, i, "%s/*.[ch]", datadir); + + memset(&pg, 0, sizeof(pg)); + if(glob(p, GLOB_ERR +#ifdef GLOB_TILDE + | GLOB_TILDE +#endif /* GLOB_TILDE */ + , NULL, &pg)) { + fprintf(stderr, + "Bad skeletons directory (-S) %s: %s\n", + datadir, strerror(errno)); + return -1; + } + + mkf = asn1c_open_file(arg, "Makefile.am", ".sample"); + if(mkf == NULL) { + globfree(&pg); + perror("Makefile.am.sample"); + return -1; + } + + fprintf(mkf, "ASN_SRCS="); + TQ_FOR(arg->mod, &(arg->asn->modules), mod_next) { + TQ_FOR(arg->expr, &(arg->mod->members), next) { + if(asn1_lang_map[arg->expr->meta_type] + [arg->expr->expr_type].type_cb) { + fprintf(mkf, "\t\\\n\t%s.c %s.h", + arg->expr->Identifier, + arg->expr->Identifier); + } + } + } + + for(i = 0; i < pg.gl_pathc; i++) { + if(asn1c_copy_over(arg, pg.gl_pathv[i])) { + fprintf(mkf, ">>>ABORTED<<<"); + fclose(mkf); + globfree(&pg); + return -1; + } else { + fprintf(mkf, "\t\\\n\t%s", + basename(pg.gl_pathv[i])); + } + } + + fprintf(mkf, "\n\n"); + fprintf(mkf, "lib_LTLIBRARIES=libsomething.la\n"); + fprintf(mkf, "libsomething_la_SOURCES=${ASN_SRCS}\n"); + fclose(mkf); + fprintf(stderr, "Generated Makefile.am.sample\n"); + globfree(&pg); + } + + return 0; +} + +/* + * Dump the streams. + */ +static int +asn1c_dump_streams(arg_t *arg) { + if(arg->flags & A1C_PRINT_COMPILED) { + return asn1c_print_streams(arg); + } else { + return asn1c_save_streams(arg); + } +} + +static int +asn1c_print_streams(arg_t *arg) { + compiler_streams_t *cs = arg->expr->data; + asn1p_expr_t *expr = arg->expr; + int i; + + for(i = 0; i < OT_MAX; i++) { + out_chunk_t *ot; + if(TQ_FIRST(&cs->targets[i]) == NULL) + continue; + + printf("\n/*** <<< %s [%s] >>> ***/\n\n", + _compiler_stream2str[i], + expr->Identifier); + + TQ_FOR(ot, &(cs->targets[i]), next) { + fwrite(ot->buf, ot->len, 1, stdout); + } + } + + return 0; +} + +static int +asn1c_save_streams(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + compiler_streams_t *cs = expr->data; + out_chunk_t *ot; + FILE *fp_c, *fp_h; + char *header_id; + + if(cs == NULL) { + fprintf(stderr, "Cannot compile %s at line %d\n", + expr->Identifier, expr->_lineno); + return -1; + } + + fp_c = asn1c_open_file(arg, expr->Identifier, ".c"); + fp_h = asn1c_open_file(arg, expr->Identifier, ".h"); + if(fp_c == NULL || fp_h == NULL) { + if(fp_c) fclose(fp_c); /* lacks unlink() */ + if(fp_h) fclose(fp_h); /* lacks unlink() */ + return -1; + } + + header_id = alloca(strlen(expr->Identifier) + 1); + if(1) { + char *src, *dst; + for(src = expr->Identifier, dst = header_id; + (*dst=*src); src++, dst++) + if(!isalnum(*src)) *dst = '_'; + *dst = '\0'; + } + + fprintf(fp_h, + "#ifndef\t_%s_H_\n" + "#define\t_%s_H_\n" + "\n", header_id, header_id); + + fprintf(fp_h, "#include \n\n"); + + TQ_FOR(ot, &(cs->targets[OT_DEPS]), next) + fwrite(ot->buf, ot->len, 1, fp_h); + fprintf(fp_h, "\n"); + TQ_FOR(ot, &(cs->targets[OT_TYPE_DECLS]), next) + fwrite(ot->buf, ot->len, 1, fp_h); + fprintf(fp_h, "\n"); + TQ_FOR(ot, &(cs->targets[OT_FUNC_DECLS]), next) + fwrite(ot->buf, ot->len, 1, fp_h); + + fprintf(fp_c, "#include <%s.h>\n\n", expr->Identifier); + TQ_FOR(ot, &(cs->targets[OT_STAT_DEFS]), next) + fwrite(ot->buf, ot->len, 1, fp_c); + TQ_FOR(ot, &(cs->targets[OT_CODE]), next) + fwrite(ot->buf, ot->len, 1, fp_c); + + assert(OT_MAX == 5); + + fprintf(fp_h, "\n#endif\t/* _%s_H_ */\n", header_id); + + fclose(fp_c); + fclose(fp_h); + fprintf(stderr, "Compiled %s.c\n", expr->Identifier); + fprintf(stderr, "Compiled %s.h\n", expr->Identifier); + return 0; +} + +static int +asn1c_copy_over(arg_t *arg, char *path) { + char *fname = basename(path); + + if(symlink(path, fname)) { + if(errno == EEXIST) { + struct stat sb1, sb2; + if(stat(path, &sb1) == 0 + && stat(fname, &sb2) == 0 + && sb1.st_dev == sb2.st_dev + && sb1.st_ino == sb2.st_ino) { + /* + * Nothing to do. + */ + fprintf(stderr, + "File %s is already here as %s\n", + path, fname); + return 0; + } else { + fprintf(stderr, + "Retaining local %s (%s suggested)\n", + fname, path); + return 0; + } + } else { + fprintf(stderr, "Symlink %s -> %s failed: %s\n", + path, fname, strerror(errno)); + return -1; + } + } + + fprintf(stderr, "Symlinked %s\t-> %s\n", path, fname); + + return 0; +} + diff --git a/libasn1compiler/asn1c_save.h b/libasn1compiler/asn1c_save.h new file mode 100644 index 000000000..487e625b0 --- /dev/null +++ b/libasn1compiler/asn1c_save.h @@ -0,0 +1,6 @@ +#ifndef _ASN1_SAVE_H_ +#define _ASN1_SAVE_H_ + +int asn1c_save_compiled_output(arg_t *arg, const char *datadir); + +#endif /* _ASN1_SAVE_H_ */ diff --git a/libasn1compiler/asn1compiler.c b/libasn1compiler/asn1compiler.c new file mode 100644 index 000000000..d647c05b6 --- /dev/null +++ b/libasn1compiler/asn1compiler.c @@ -0,0 +1,160 @@ +#include "asn1c_internal.h" + +static void default_logger_cb(int, const char *fmt, ...); +static int asn1c_compile_expr(arg_t *arg); +static int asn1c_attach_streams(asn1p_expr_t *expr); + +int +asn1_compile(asn1p_t *asn, const char *datadir, enum asn1c_flags flags) { + arg_t arg_s; + arg_t *arg = &arg_s; + int ret; + + /* + * Initialize target language. + */ + ret = asn1c_with_language(ASN1C_LANGUAGE_C); + assert(ret == 0); + + memset(arg, 0, sizeof(*arg)); + arg->default_cb = asn1c_compile_expr; + arg->logger_cb = default_logger_cb; + arg->flags = flags; + arg->asn = asn; + + /* + * Compile each individual top level structure. + */ + TQ_FOR(arg->mod, &(asn->modules), mod_next) { + TQ_FOR(arg->expr, &(arg->mod->members), next) { + compiler_streams_t *cs = NULL; + + if(asn1c_attach_streams(arg->expr)) + return -1; + + cs = arg->expr->data; + cs->target = OT_TYPE_DECLS; + arg->target = cs; + + ret = asn1c_compile_expr(arg); + if(ret) { + FATAL("Cannot compile %s (%x:%x) at line %d", + arg->expr->Identifier, + arg->expr->expr_type, + arg->expr->meta_type, + arg->expr->_lineno); + return ret; + } + } + } + + DEBUG("Saving compiled data"); + + /* + * Save or print out the compiled result. + */ + if(asn1c_save_compiled_output(arg, datadir)) + return -1; + + return 0; +} + +static int +asn1c_compile_expr(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + int (*type_cb)(arg_t *); + int ret; + + assert(expr->meta_type >= AMT_INVALID); + assert(expr->meta_type < AMT_EXPR_META_MAX); + assert(expr->expr_type >= A1TC_INVALID); + assert(expr->expr_type < ASN_EXPR_TYPE_MAX); + + type_cb = asn1_lang_map[expr->meta_type][expr->expr_type].type_cb; + if(type_cb) { + + if(arg->indent_level == 0) + OUT("\n"); + + DEBUG("Compiling %s at line %d", + expr->Identifier, + expr->_lineno); + + ret = type_cb(arg); + } else { + ret = -1; + /* + * Even if the target language compiler does not know + * how to compile the given expression, we know that + * certain expressions need not to be compiled at all. + */ + switch(expr->meta_type) { + case AMT_PARAMTYPE: + case AMT_OBJECT: + case AMT_OBJECTSET: + case AMT_VALUE: + case AMT_VALUESET: + ret = 0; + break; + default: + break; + } + + switch(expr->expr_type) { + case A1TC_TYPEID: + ret = 0; /* TYPE-IDENTIFIER is a CLASS */ + default: + break; + } + } + + if(ret == -1) { + OUT("#error Cannot compile \"%s\" (%x/%x) at line %d\n", + arg->expr->Identifier, + arg->expr->meta_type, + arg->expr->expr_type, + arg->expr->_lineno + ); + } + + return ret; +} + +static int +asn1c_attach_streams(asn1p_expr_t *expr) { + compiler_streams_t *cs; + int i; + + if(expr->data) + return 0; /* Already attached? */ + + expr->data = calloc(1, sizeof(compiler_streams_t)); + if(expr->data == NULL) + return -1; + + cs = expr->data; + for(i = 0; i < OT_MAX; i++) { + TQ_INIT(&(cs->targets[i])); + } + + return 0; +} + +static void +default_logger_cb(int _severity, const char *fmt, ...) { + va_list ap; + char *pfx = ""; + + switch(_severity) { + case -1: pfx = "DEBUG: "; break; + case 0: pfx = "WARNING: "; break; + case 1: pfx = "FATAL: "; break; + } + + fprintf(stderr, "%s", pfx); + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + fprintf(stderr, "\n"); +} + diff --git a/libasn1compiler/asn1compiler.h b/libasn1compiler/asn1compiler.h new file mode 100644 index 000000000..d104dc9aa --- /dev/null +++ b/libasn1compiler/asn1compiler.h @@ -0,0 +1,41 @@ +#ifndef ASN1_COMPILER_H +#define ASN1_COMPILER_H + +#include + +enum asn1c_flags { + A1C_NOFLAGS, + /* + * Debug the compiler. + */ + A1C_DEBUG = 0x0001, + /* + * Do not split the target output in several files, just print it. + * (Note: the output is not likely to be compilable in this case). + */ + A1C_PRINT_COMPILED = 0x0002, + /* + * Generate only the tables for ASN.1 types, + * do not emit ASN.1 parsing support code. + */ + A1C_OMIT_SUPPORT_CODE = 0x0004, + /* + * Use native integers instead of INTEGER_t and ENUMERATED_t types. + */ + A1C_USE_NATIVE_INTEGERS = 0x0008, + /* + * Do not use C99 extensions. + */ + A1C_NO_C99 = 0x0010, + /* + * Enable use of unnamed unions (non-portable feature). + */ + A1C_UNNAMED_UNIONS = 0x0020, +}; + +/* + * Compile the ASN.1 specification. + */ +int asn1_compile(asn1p_t *asn, const char *datadir, enum asn1c_flags); + +#endif /* ASN1_COMPILER_H */ diff --git a/libasn1compiler/check_compiler.c b/libasn1compiler/check_compiler.c new file mode 100644 index 000000000..1da6902f3 --- /dev/null +++ b/libasn1compiler/check_compiler.c @@ -0,0 +1,7 @@ +#include "asn1compiler.h" + +int +main(int ac, char **av) { + return 0; +} + diff --git a/libasn1fix/Makefile.am b/libasn1fix/Makefile.am new file mode 100644 index 000000000..0e52b4f39 --- /dev/null +++ b/libasn1fix/Makefile.am @@ -0,0 +1,36 @@ + + +AM_CFLAGS = @ADD_CFLAGS@ +AM_CPPFLAGS = -I${top_srcdir}/libasn1parser + +noinst_LTLIBRARIES = libasn1fix.la + +libasn1fix_la_LDFLAGS = -all-static +libasn1fix_la_SOURCES = \ + asn1fix.c asn1fix.h \ + asn1fix_internal.h \ + asn1fix_misc.c asn1fix_misc.h \ + asn1fix_value.c asn1fix_value.h \ + asn1fix_compat.c asn1fix_compat.h \ + asn1fix_constr.c asn1fix_constr.h \ + asn1fix_cstring.c asn1fix_cstring.h \ + asn1fix_retrieve.c asn1fix_retrieve.h \ + asn1fix_bitstring.c asn1fix_bitstring.h \ + asn1fix_integer.c asn1fix_integer.h \ + asn1fix_dereft.c asn1fix_dereft.h \ + asn1fix_derefv.c asn1fix_derefv.h \ + asn1fix_export.c asn1fix_export.h \ + asn1fix_param.c asn1fix_param.h \ + asn1fix_class.c asn1fix_class.h \ + asn1fix_tags.c asn1fix_tags.h \ + asn1fix_enum.c asn1fix_enum.h +libasn1fix_la_LIBADD = ${top_builddir}/libasn1parser/libasn1parser.la + +check_PROGRAMS = check_fixer + +LDADD = ${noinst_LTLIBRARIES} ${libasn1fix_la_LIBADD} +DEPENDENCIES = ${LDADD} + +TESTS_ENVIRONMENT= ./check_fixer +TESTS = ${top_srcdir}/tests/*.asn1 +## TESTS = ${check_PROGRAMS} # This is an alternate form of testing diff --git a/libasn1fix/Makefile.in b/libasn1fix/Makefile.in new file mode 100644 index 000000000..8d919c20c --- /dev/null +++ b/libasn1fix/Makefile.in @@ -0,0 +1,454 @@ +# Makefile.in generated automatically by automake 1.5 from Makefile.am. + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_alias = @build_alias@ +build_triplet = @build@ +host_alias = @host_alias@ +host_triplet = @host@ +target_alias = @target_alias@ +target_triplet = @target@ +ADD_CFLAGS = @ADD_CFLAGS@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +AWK = @AWK@ +CC = @CC@ +CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPP = @CPP@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +EXEEXT = @EXEEXT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LEX = @LEX@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +MAINT = @MAINT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PATH = @PATH@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ +YACC = @YACC@ +am__include = @am__include@ +am__quote = @am__quote@ +install_sh = @install_sh@ + +AM_CFLAGS = @ADD_CFLAGS@ +AM_CPPFLAGS = -I${top_srcdir}/libasn1parser + +noinst_LTLIBRARIES = libasn1fix.la + +libasn1fix_la_LDFLAGS = -all-static +libasn1fix_la_SOURCES = \ + asn1fix.c asn1fix.h \ + asn1fix_internal.h \ + asn1fix_misc.c asn1fix_misc.h \ + asn1fix_value.c asn1fix_value.h \ + asn1fix_compat.c asn1fix_compat.h \ + asn1fix_constr.c asn1fix_constr.h \ + asn1fix_cstring.c asn1fix_cstring.h \ + asn1fix_retrieve.c asn1fix_retrieve.h \ + asn1fix_bitstring.c asn1fix_bitstring.h \ + asn1fix_integer.c asn1fix_integer.h \ + asn1fix_dereft.c asn1fix_dereft.h \ + asn1fix_derefv.c asn1fix_derefv.h \ + asn1fix_export.c asn1fix_export.h \ + asn1fix_param.c asn1fix_param.h \ + asn1fix_class.c asn1fix_class.h \ + asn1fix_tags.c asn1fix_tags.h \ + asn1fix_enum.c asn1fix_enum.h + +libasn1fix_la_LIBADD = ${top_builddir}/libasn1parser/libasn1parser.la + +check_PROGRAMS = check_fixer + +LDADD = ${noinst_LTLIBRARIES} ${libasn1fix_la_LIBADD} +DEPENDENCIES = ${LDADD} + +TESTS_ENVIRONMENT = ./check_fixer +TESTS = ${top_srcdir}/tests/*.asn1 +subdir = libasn1fix +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) + +libasn1fix_la_DEPENDENCIES = \ + ${top_builddir}/libasn1parser/libasn1parser.la +am_libasn1fix_la_OBJECTS = asn1fix.lo asn1fix_misc.lo asn1fix_value.lo \ + asn1fix_compat.lo asn1fix_constr.lo asn1fix_cstring.lo \ + asn1fix_retrieve.lo asn1fix_bitstring.lo asn1fix_integer.lo \ + asn1fix_dereft.lo asn1fix_derefv.lo asn1fix_export.lo \ + asn1fix_param.lo asn1fix_class.lo asn1fix_tags.lo \ + asn1fix_enum.lo +libasn1fix_la_OBJECTS = $(am_libasn1fix_la_OBJECTS) +check_PROGRAMS = check_fixer$(EXEEXT) +check_fixer_SOURCES = check_fixer.c +check_fixer_OBJECTS = check_fixer.$(OBJEXT) +check_fixer_LDADD = $(LDADD) +check_fixer_DEPENDENCIES = libasn1fix.la \ + ${top_builddir}/libasn1parser/libasn1parser.la +check_fixer_LDFLAGS = + +DEFS = @DEFS@ +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/asn1fix.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1fix_bitstring.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1fix_class.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1fix_compat.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1fix_constr.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1fix_cstring.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1fix_dereft.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1fix_derefv.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1fix_enum.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1fix_export.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1fix_integer.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1fix_misc.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1fix_param.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1fix_retrieve.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1fix_tags.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1fix_value.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/check_fixer.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ + $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +CFLAGS = @CFLAGS@ +DIST_SOURCES = $(libasn1fix_la_SOURCES) check_fixer.c +DIST_COMMON = Makefile.am Makefile.in +SOURCES = $(libasn1fix_la_SOURCES) check_fixer.c + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu libasn1fix/Makefile +Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && \ + CONFIG_HEADERS= CONFIG_LINKS= \ + CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) +libasn1fix.la: $(libasn1fix_la_OBJECTS) $(libasn1fix_la_DEPENDENCIES) + $(LINK) $(libasn1fix_la_LDFLAGS) $(libasn1fix_la_OBJECTS) $(libasn1fix_la_LIBADD) $(LIBS) + +clean-checkPROGRAMS: + -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) +check_fixer$(EXEEXT): $(check_fixer_OBJECTS) $(check_fixer_DEPENDENCIES) + @rm -f check_fixer$(EXEEXT) + $(LINK) $(check_fixer_LDFLAGS) $(check_fixer_OBJECTS) $(check_fixer_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) core *.core + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_bitstring.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_compat.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_constr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_cstring.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_dereft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_derefv.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_enum.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_export.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_integer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_misc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_param.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_retrieve.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_tags.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_value.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/check_fixer.Po@am__quote@ + +distclean-depend: + -rm -rf $(DEPDIR) + +.c.o: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< + +.c.obj: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `cygpath -w $<` + +.c.lo: +@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< +CCDEPMODE = @CCDEPMODE@ +uninstall-info-am: + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique $(LISP) + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) + +GTAGS: + here=`CDPATH=: && cd $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; \ + srcdir=$(srcdir); export srcdir; \ + list='$(TESTS)'; \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *" $$tst "*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ + ;; \ + *) \ + echo "PASS: $$tst"; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *" $$tst "*) \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ + ;; \ + esac; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all tests failed"; \ + else \ + banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ + fi; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0; \ + fi + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + $(mkinstalldirs) "$(distdir)/$$dir"; \ + fi; \ + if test -d $$d/$$file; then \ + cp -pR $$d/$$file $(distdir) \ + || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile $(LTLIBRARIES) + +installdirs: + +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + +distclean-am: clean-am distclean-compile distclean-depend \ + distclean-generic distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +uninstall-am: uninstall-info-am + +.PHONY: GTAGS all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool \ + clean-noinstLTLIBRARIES distclean distclean-compile \ + distclean-depend distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + tags uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libasn1fix/asn1fix.c b/libasn1fix/asn1fix.c new file mode 100644 index 000000000..af1109993 --- /dev/null +++ b/libasn1fix/asn1fix.c @@ -0,0 +1,354 @@ +#include +#include +#include +#include + +#include "asn1fix.h" +#include "asn1fix_internal.h" + +/* Print everything to stderr */ +static void _default_error_logger(int _severity, const char *fmt, ...); + +/* + * Internal check functions. + */ +static int asn1f_fix_module(arg_t *arg); +static int asn1f_fix_simple(arg_t *arg); /* For INTEGER/ENUMERATED */ +static int asn1f_fix_constructed(arg_t *arg); /* For SEQUENCE/SET/CHOICE */ +static int asn1f_fix_constraints(arg_t *arg); /* For subtype constraints */ + + +/* + * Scan every module defined here in search for inconsistences. + */ +int +asn1f_process(asn1p_t *asn, enum asn1f_flags flags, + error_logger_f error_logger) { + arg_t arg; + int fatals = 0; + int warnings = 0; + + /* + * Check validity of arguments. + */ + if(asn == NULL) { + errno = EINVAL; + return -1; + } + + /* + * If errors handler is not specified, default to internal one. + */ + if(error_logger == 0) { + error_logger = _default_error_logger; + } + + memset(&arg, 0, sizeof(arg)); + arg.asn = asn; + arg.eh = error_logger; + + if(flags & A1F_DEBUG) { + arg.debug = arg.eh; + arg.debug(-1, "Called %s() with flags %d", __func__, flags); + flags &= ~A1F_DEBUG; + } + + /* + * Check that we haven't missed an unknown flag. + */ + if(flags) { + errno = EINVAL; + return -1; + } + + /* + * Process each module in the list. + */ + TQ_FOR(arg.mod, &(asn->modules), mod_next) { + int ret = asn1f_fix_module(&arg); + /* + * These lines are used for illustration purposes. + * RET2RVAL() is used everywhere else. + */ + if(ret == -1) fatals++; + if(ret == 1) warnings++; + } + + /* + * Compute a return value. + */ + return fatals?-1:warnings?1:0; +} + +/* + * Check the internals of a single module. + */ +static int +asn1f_fix_module(arg_t *arg) { + asn1p_expr_t *expr; + int rvalue = 0; + + switch((arg->mod->module_flags + & (MSF_EXPLICIT_TAGS | MSF_IMPLICIT_TAGS | MSF_AUTOMATIC_TAGS))) { + case MSF_NOFLAGS: + case MSF_EXPLICIT_TAGS: + case MSF_IMPLICIT_TAGS: + case MSF_AUTOMATIC_TAGS: + break; + default: + FATAL("Module %s defined with ambiguous global tagging mode", + arg->mod->Identifier); + RET2RVAL(-1, rvalue); + } + + /* + * Do various non-recursive transformations. + * Order is not important. + */ + TQ_FOR(expr, &(arg->mod->members), next) { + int ret; + arg->expr = expr; + + if(expr->meta_type == AMT_PARAMTYPE) + /* Do not process the parametrized type just yet */ + continue; + + DEBUG("=== Now processing \"%s\" at line %d ===", + expr->Identifier, expr->_lineno); + assert(expr->meta_type != AMT_INVALID); + + /* + * 2.1 Pre-process simple types (ENUMERATED, INTEGER, etc). + */ + ret = asn1f_recurse_expr(arg, asn1f_fix_simple); + RET2RVAL(ret, rvalue); + + /* + * 2.[234] Process SEQUENCE/SET/CHOICE types. + */ + ret = asn1f_recurse_expr(arg, asn1f_fix_constructed); + RET2RVAL(ret, rvalue); + + /* + * 2.5.4 + */ + ret = asn1f_recurse_expr(arg, asn1f_fix_dereference_types); + RET2RVAL(ret, rvalue); + + /* + * 2.5.5 + */ + ret = asn1f_recurse_expr(arg, asn1f_fix_dereference_values); + RET2RVAL(ret, rvalue); + + /* + * Resolve references in constraints. + */ + ret = asn1f_recurse_expr(arg, asn1f_fix_constraints); + RET2RVAL(ret, rvalue); + + /* + * 6. INTEGER value processed at 2.5.4. + */ + + /* + * Make sure everybody's behaving well. + */ + assert(arg->expr == expr); + } + + /* + * 5. Automatic tagging + */ + TQ_FOR(expr, &(arg->mod->members), next) { + int ret; + + arg->expr = expr; + + ret = asn1f_recurse_expr(arg, asn1f_fix_constr_autotag); + RET2RVAL(ret, rvalue); + + assert(arg->expr == expr); + } + + /* + * 8. fix BIT STRING + * 9. fix spaces in cstrings + */ + TQ_FOR(expr, &(arg->mod->members), next) { + int ret; + arg->expr = expr; + + ret = asn1f_recurse_expr(arg, asn1f_fix_bit_string); + RET2RVAL(ret, rvalue); + + ret = asn1f_recurse_expr(arg, asn1f_fix_cstring); + RET2RVAL(ret, rvalue); + + assert(arg->expr == expr); + } + + /* + * ... Check for tags distinctness. + */ + TQ_FOR(expr, &(arg->mod->members), next) { + int ret; + arg->expr = expr; + + ret = asn1f_recurse_expr(arg, asn1f_check_constr_tags_distinct); + RET2RVAL(ret, rvalue); + + assert(arg->expr == expr); + } + + return rvalue; +} + + +static int +asn1f_fix_simple(arg_t *arg) { + int rvalue = 0; + int ret; + + ret = asn1f_fix_enum(arg); + RET2RVAL(ret, rvalue); + + ret = asn1f_fix_integer(arg); + RET2RVAL(ret, rvalue); + + return rvalue; +} + +static int +asn1f_fix_constructed(arg_t *arg) { + int rvalue = 0; + int ret; + + switch(arg->expr->expr_type) { + case ASN_CONSTR_SEQUENCE: + case ASN_CONSTR_SET: + case ASN_CONSTR_CHOICE: + break; + default: + return 0; + } + + /* Check identifier distinctness */ + ret = asn1f_check_unique_expr(arg, NULL); + RET2RVAL(ret, rvalue); + + /* Fix extensibility */ + ret = asn1f_fix_constr_ext(arg); + RET2RVAL(ret, rvalue); + + /* Fix tagging */ + ret = asn1f_fix_constr_tag(arg); + RET2RVAL(ret, rvalue); + + return rvalue; +} + +static int +_constraint_value_resolve(arg_t *arg, asn1p_value_t **value) { + asn1p_expr_t expr; + asn1p_expr_t *tmp_expr; + asn1p_module_t *tmp_mod; + asn1p_module_t *mod_r = NULL; + int rvalue = 0; + int ret; + + tmp_expr = asn1f_lookup_symbol(arg, (*value)->value.reference, &mod_r); + if(tmp_expr == NULL) { + FATAL("Cannot find symbol %s " + "used in %s subtype constraint at line %d", + asn1f_printable_reference((*value)->value.reference), + arg->expr->Identifier, arg->expr->_lineno); + assert((*value)->type == ATV_REFERENCED); + return -1; + } + + memset(&expr, 0, sizeof(expr)); + expr.meta_type = tmp_expr->meta_type; + expr.expr_type = tmp_expr->expr_type; + expr.Identifier = tmp_expr->Identifier; + expr.value = *value; + tmp_expr = arg->expr; + tmp_mod = arg->mod; + arg->expr = &expr; + arg->mod = mod_r; + ret = asn1f_fix_dereference_values(arg); + RET2RVAL(ret, rvalue); + arg->expr = tmp_expr; + arg->mod = tmp_mod; + assert(expr.value); + *value = expr.value; + + return rvalue; +} + +static int +_resolve_constraints(arg_t *arg, asn1p_constraint_t *ct) { + int rvalue = 0; + int ret; + int el; + + /* Don't touch information object classes */ + if(ct->type == ACT_CT_WCOMP + || ct->type == ACT_CT_WCOMPS + || ct->type == ACT_CA_CRC) + return 0; + + if(ct->value && ct->value->type == ATV_REFERENCED) { + ret = _constraint_value_resolve(arg, &ct->value); + RET2RVAL(ret, rvalue); + } + if(ct->range_start && ct->range_start->type == ATV_REFERENCED) { + ret = _constraint_value_resolve(arg, &ct->range_start); + RET2RVAL(ret, rvalue); + } + if(ct->range_stop && ct->range_stop->type == ATV_REFERENCED) { + ret = _constraint_value_resolve(arg, &ct->range_stop); + RET2RVAL(ret, rvalue); + } + + for(el = 0; el < ct->el_count; el++) { + ret = _resolve_constraints(arg, ct->elements[el]); + RET2RVAL(ret, rvalue); + } + + return rvalue; +} + +static int +asn1f_fix_constraints(arg_t *arg) { + int rvalue = 0; + int ret; + + if(arg->expr->constraints) { + ret = _resolve_constraints(arg, arg->expr->constraints); + RET2RVAL(ret, rvalue); + } + + return rvalue; +} + +/* + * Print everything to stderr + */ +static void +_default_error_logger(int _severity, const char *fmt, ...) { + va_list ap; + char *pfx = ""; + + switch(_severity) { + case -1: pfx = "DEBUG: "; break; + case 0: pfx = "WARNING: "; break; + case 1: pfx = "FATAL: "; break; + } + + fprintf(stderr, "%s", pfx); + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + fprintf(stderr, "\n"); +} diff --git a/libasn1fix/asn1fix.h b/libasn1fix/asn1fix.h new file mode 100644 index 000000000..4847330a5 --- /dev/null +++ b/libasn1fix/asn1fix.h @@ -0,0 +1,30 @@ +/* + * This is the public interface for the processor (fixer) of the ASN.1 tree + * produced by the libasn1parser. + */ +#ifndef ASN1FIX_H +#define ASN1FIX_H + +#include + +/* + * Operation flags for the function below. + */ +enum asn1f_flags { + A1F_NOFLAGS, + A1F_DEBUG, /* Print debugging output using (_is_fatal = -1) */ +}; + +/* + * Perform a set of semantics checks, transformations and small fixes + * on the given tree. + * RETURN VALUES: + * -1: Some fatal problems were encountered. + * 0: No inconsistencies were found. + * 1: Some warnings were issued, but no fatal problems encountered. + */ +int asn1f_process(asn1p_t *_asn, + enum asn1f_flags, + void (*error_log_callback)(int _severity, const char *fmt, ...)); + +#endif /* ASN1FIX_H */ diff --git a/libasn1fix/asn1fix_bitstring.c b/libasn1fix/asn1fix_bitstring.c new file mode 100644 index 000000000..0d3961d43 --- /dev/null +++ b/libasn1fix/asn1fix_bitstring.c @@ -0,0 +1,230 @@ +#include "asn1fix_internal.h" + +int asn1f_fix_bit_string_value(arg_t *arg, asn1p_expr_t *ttype); +static void asn1f_BS_remove_trailing_zero_bits(asn1p_value_t *value); +static int asn1f_BS_unparsed_convert(arg_t *arg, asn1p_value_t *value, asn1p_expr_t *ttype); + +int +asn1f_fix_bit_string(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + int r_value = 0; + int ret; + + if(expr->meta_type == AMT_VALUE) { + asn1p_expr_t *ttype; + + DEBUG("%s(%s) for line %d", __func__, + expr->Identifier, expr->_lineno); + + ttype = asn1f_find_terminal_type(arg, expr, 0); + if(ttype && ttype->expr_type == ASN_BASIC_BIT_STRING) { + ret = asn1f_fix_bit_string_value(arg, ttype); + RET2RVAL(ret, r_value); + } + } + + return r_value; +} + +int +asn1f_fix_bit_string_value(arg_t *arg, asn1p_expr_t *ttype) { + asn1p_expr_t *expr = arg->expr; + int r_value = 0; + + DEBUG("%s(%s) for line %d", __func__, + expr->Identifier, expr->_lineno); + + switch(expr->value->type) { + case ATV_UNPARSED: + /* + * Most definitely we have something like + * value BitStringType1 ::= { a, b, c } + * which could not be parsed by the LALR parser, mostly + * because it requires knowledge about BitStringType1 + * during the parsing. So, here's a little hack: we create + * a buffer containing the full specification of a module, + * which contains some pre-defined INTEGER type with the + * opaque definition "{ a, b, c }" from the bit string. + */ + if(asn1f_BS_unparsed_convert(arg, expr->value, ttype)) { + r_value = -1; + break; + } + /* Fall through: remove trailing zero bits */ + case ATV_BITVECTOR: + asn1f_BS_remove_trailing_zero_bits(expr->value); + break; + default: + break; + } + + return r_value; +} + +static void +asn1f_BS_remove_trailing_zero_bits(asn1p_value_t *value) { + int lmfb = -1; /* Last meaningful byte position */ + int bits; /* Number of bits in the BIT STRING value */ + int b; + + assert(value->type == ATV_BITVECTOR); + + bits = value->value.binary_vector.size_in_bits; + /* + * Figure out the rightmost meaningful byte. + */ + for(b = 0; b < ((bits + 7) >> 3); b++) { + uint8_t uc = value->value.binary_vector.bits[b]; + if(uc && b > lmfb) + lmfb = b; + } + if(lmfb == -1) { + bits = 0; + } else { + uint8_t uc; + uc = value->value.binary_vector.bits[lmfb]; + bits = (lmfb+1) * 8; + /* + * Squeeze the bit string width until the rightmost + * bit is set. + */ + for(; uc && (uc & 1) == 0; uc >>= 1) + bits--; + if(uc == 0) { + bits = lmfb * 8; + } + } + value->value.binary_vector.size_in_bits = bits; +} + +static int +asn1f_BS_unparsed_convert(arg_t *arg, asn1p_value_t *value, asn1p_expr_t *ttype) { + asn1p_t *asn; + asn1p_module_t *mod; + asn1p_expr_t *V; + asn1p_expr_t *bit; + asn1_integer_t aI; + uint8_t *bitbuf; + int bits; + int psize; + char *p; + int ret; + int r_value = 0; + + assert(value->type == ATV_UNPARSED); + + psize = value->value.string.size + 64; + p = malloc(psize); + if(p == NULL) + return -1; + + ret = snprintf(p, psize, + "M DEFINITIONS ::=\nBEGIN\n" + "V ::= INTEGER %s\n" + "END\n", + value->value.string.buf + ); + assert(ret < psize); + psize = ret; + + asn = asn1p_parse_buffer(p, psize, A1P_NOFLAGS); + free(p); + if(asn == NULL) { + FATAL("Cannot parse BIT STRING value %s " + "defined as %s at line %d", + arg->expr->Identifier, + value->value.string.buf, + arg->expr->_lineno + ); + return -1; + } + + mod = TQ_FIRST(&(asn->modules)); + assert(mod); + V = TQ_FIRST(&(mod->members)); + assert(V); + assert(strcmp(V->Identifier, "V") == 0); + assert(TQ_FIRST(&(V->members))); + + /* + * Simple loop just to fetch the maximal bit position + * out of the BIT STRING value defined as NamedBitList. + */ + aI = -1; + TQ_FOR(bit, &(V->members), next) { + asn1p_expr_t *bitdef; + bitdef = asn1f_lookup_child(ttype, bit->Identifier); + if(bitdef && bitdef->value + && bitdef->value->type == ATV_INTEGER) { + if(bitdef->value->value.v_integer > aI) + aI = bitdef->value->value.v_integer; + } + } + + if(aI > 1024 * 1024 * 8) { /* One megabyte */ + FATAL("Unsupportedly large BIT STRING value \"%s\" " + "defined at line %d " + "(larger than 1MByte)", + arg->expr->Identifier, + arg->expr->_lineno + ); + asn1p_free(asn); + return -1; + } + + bits = aI + 1; /* Number of bits is more than a last bit position */ + bitbuf = calloc(1, 1 + ((bits + 7) / 8)); + if(bitbuf == NULL) { + asn1p_free(asn); + return -1; + } + + TQ_FOR(bit, &(V->members), next) { + asn1p_expr_t *bitdef; + int set_bit_pos; + + if(bit->value) { + WARNING("Identifier \"%s\" at line %d " + "must not have a value", + bit->Identifier, bit->_lineno); + RET2RVAL(1, r_value); + } + bitdef = asn1f_lookup_child(ttype, bit->Identifier); + if(bitdef == NULL) { + FATAL("Identifier \"%s\" at line %d is not defined " + "in the \"%s\" type definition at line %d", + bit->Identifier, + bit->_lineno, + ttype->Identifier, + ttype->_lineno + ); + RET2RVAL(-1, r_value); + continue; + } + if(bitdef->value == NULL + || bitdef->value->type != ATV_INTEGER) { + FATAL("Broken identifier " + "\"%s\" at line %d " + "referenced by \"%s\" at line %d", + bitdef->Identifier, + bitdef->_lineno, + arg->expr->Identifier, + arg->expr->_lineno + ); + RET2RVAL(-1, r_value); + continue; + } + + assert(bitdef->value->value.v_integer < bits); + set_bit_pos = bitdef->value->value.v_integer; + bitbuf[set_bit_pos>>3] |= 1 << (7-(set_bit_pos % 8)); + } + + asn1p_free(asn); + free(value->value.string.buf); + value->type = ATV_BITVECTOR; + value->value.binary_vector.bits = bitbuf; + value->value.binary_vector.size_in_bits = bits; + + return r_value; +} diff --git a/libasn1fix/asn1fix_bitstring.h b/libasn1fix/asn1fix_bitstring.h new file mode 100644 index 000000000..1230856f0 --- /dev/null +++ b/libasn1fix/asn1fix_bitstring.h @@ -0,0 +1,6 @@ +#ifndef _ASN1FIX_BIT_STRING_H_ +#define _ASN1FIX_BIT_STRING_H_ + +int asn1f_fix_bit_string(arg_t *); + +#endif /* _ASN1FIX_BIT_STRING_H_ */ diff --git a/libasn1fix/asn1fix_class.c b/libasn1fix/asn1fix_class.c new file mode 100644 index 000000000..c541fd62c --- /dev/null +++ b/libasn1fix/asn1fix_class.c @@ -0,0 +1,237 @@ +#include "asn1fix_internal.h" + +typedef enum field_category { + OFC_INVALID, /* Invalid object field category */ + OFC_TYPE, + OFC_FIXED_TYPE_VALUE, + OFC_VARIABLE_TYPE_VALUE, + OFC_FIXED_TYPE_VALUE_SET, + OFC_VARIABLE_TYPE_VALUE_SET, + OFC_INFORMATION_OBJECT, + OFC_INFORMATION_OBJECT_SET, +} field_category_e; + +typedef enum object_category { + OC_INVALID, + OC_OBJECT, + OC_OBJECTSET, +} object_category_e; + +static field_category_e asn1f_class_field_category(asn1p_expr_t *ofield); +static object_category_e asn1f_class_object_category(asn1p_expr_t *expr); +static asn1p_expr_t * +asn1f_class_dot_lookup(arg_t *arg, asn1p_expr_t *obj, asn1p_ref_t *ref); + +asn1p_expr_t * +asn1f_class_access(arg_t *arg, asn1p_ref_t *ref, asn1p_module_t **mod_r) { + asn1p_expr_t *obj; /* Information Object or Object Set */ + object_category_e obj_cat; /* Object category */ + //field_category_e field_cat; /* Field category */ + asn1p_expr_t *result; + asn1p_ref_t tmpref; + + assert(ref->comp_count > 1); + + DEBUG("%s(%s) for line %d", __func__, + asn1f_printable_reference(ref), + ref->_lineno); + + /* + * Fetch the first part of the reference (OBJECT or ObjectSet). + * OBJECT.&... + * ObjectSet.&... + */ + assert(isupper(ref->components[0].name[0])); + + tmpref = *ref; + tmpref.comp_count = 1; + obj = asn1f_lookup_symbol(arg, &tmpref, 0); + if(obj == NULL) { + errno = ESRCH; + return NULL; + } + + /* + * Make sure the symbol lexical property (upper-case, lower-case) + * corresponds to the type of the expression returned by + * lookup_symbol(). + */ + obj_cat = asn1f_class_object_category(obj); + switch(obj_cat) { + case OC_OBJECT: + case OC_OBJECTSET: + if(ref->components[0].lex_type + == (obj_cat==OC_OBJECT) + ? RLT_CAPITALS + : RLT_Uppercase) + break; + /* Fall through */ + case OC_INVALID: + WARNING("Symbol \"%s\" is not compatible " + "with referenced expression \"%s\" at line %d", + ref->components[0].name, + obj->Identifier, obj->_lineno); + errno = EPERM; + return NULL; + } + + /* + * Find the specified field within the object. + */ + result = asn1f_class_dot_lookup(arg, obj, ref); + if(result == NULL) { + return NULL; + } + + //field_cat = asn1f_class_field_category(result); + + DEBUG("FILLME: %s", result->Identifier); + + return result; +} + +static object_category_e +asn1f_class_object_category(asn1p_expr_t *expr) { + + switch(expr->meta_type) { + case AMT_OBJECT: + return OC_OBJECT; + case AMT_OBJECTSET: + return OC_OBJECTSET; + case AMT_VALUESET: + if(expr->expr_type == A1TC_REFERENCE + && expr->reference + && expr->reference->comp_count == 1 + && expr->reference->components[0].lex_type == RLT_CAPITALS) + { + /* FIXME: use find_terminal_type instead! */ + return OC_OBJECTSET; + } + break; + default: + break; + } + + return OC_INVALID; +} + +static field_category_e +asn1f_class_field_category(asn1p_expr_t *ofield) { + if(ofield->Identifier[0] != '&') { + assert(ofield->Identifier[0] == '&'); + return OFC_INVALID; + } + + if(isupper(ofield->Identifier[1])) { + if(ofield->reference) { + enum asn1p_ref_lex_type_e lex_type + = ofield->reference->components[0].lex_type; + + switch(lex_type) { + case RLT_CAPITALS: + return OFC_INFORMATION_OBJECT_SET; + case RLT_Uppercase: + return OFC_FIXED_TYPE_VALUE_SET; + case RLT_AmpUppercase: + return OFC_VARIABLE_TYPE_VALUE_SET; + default: + break; + } + } else { + if(ofield->expr_type == A1TC_CLASSFIELD) + return OFC_TYPE; + + switch(ofield->meta_type) { + case AMT_TYPE: + case AMT_TYPEREF: + return OFC_FIXED_TYPE_VALUE_SET; + default: + break; + } + + } + } else { + if(ofield->reference) { + enum asn1p_ref_lex_type_e lex_type + = ofield->reference->components[0].lex_type; + + switch(lex_type) { + case RLT_CAPITALS: + return OFC_INFORMATION_OBJECT; + case RLT_Uppercase: + return OFC_FIXED_TYPE_VALUE; + case RLT_AmpUppercase: + return OFC_VARIABLE_TYPE_VALUE; + default: + break; + } + } else { + switch(ofield->meta_type) { + case AMT_TYPE: + case AMT_TYPEREF: + return OFC_FIXED_TYPE_VALUE; + default: + break; + } + } + } + + return OFC_INVALID; +} + + +static asn1p_expr_t * +asn1f_class_dot_lookup(arg_t *arg, asn1p_expr_t *obj, asn1p_ref_t *ref) { + asn1p_expr_t *ofield = NULL; /* Information Object's Field */ + field_category_e field_cat; /* Field category */ + int comp; + + assert(ref->comp_count >= 2); + + for(comp = 1 /* sic! */; comp < ref->comp_count; comp++) { + int is_last_component = (comp + 1 == ref->comp_count); + char *comp_name = ref->components[comp].name; + + ofield = asn1f_lookup_child(obj, comp_name); + if(ofield == NULL) { + DEBUG("Cannot find field \"%s\" in \"%s\" at line %d", + ref->components[1].name, + obj->Identifier, + obj->_lineno); + } + + /* + * Compute the category of the field of + * the information object class. + */ + field_cat = asn1f_class_field_category(ofield); + + switch(field_cat) { + case OFC_INVALID: + WARNING("Invalid field category of \"%s\" at line %d", + ofield->Identifier, ofield->_lineno); + errno = EPERM; + return NULL; + case OFC_TYPE: + case OFC_FIXED_TYPE_VALUE: + case OFC_VARIABLE_TYPE_VALUE: + case OFC_FIXED_TYPE_VALUE_SET: + case OFC_VARIABLE_TYPE_VALUE_SET: + if(!is_last_component) { + FATAL("Field name component \"%s\" at line %d " + "specifies non-dereferenceable thing", + comp_name, ref->_lineno); + errno = EPERM; + return NULL; + } + break; + case OFC_INFORMATION_OBJECT: + case OFC_INFORMATION_OBJECT_SET: + obj = ofield; + break; + } + } + + assert(ofield); + return ofield; +} diff --git a/libasn1fix/asn1fix_class.h b/libasn1fix/asn1fix_class.h new file mode 100644 index 000000000..c849b2b38 --- /dev/null +++ b/libasn1fix/asn1fix_class.h @@ -0,0 +1,16 @@ +#ifndef _ASN1FIX_CLASS_H_ +#define _ASN1FIX_CLASS_H_ + +/* + * Fetch the element from the class-related stuff (thing) by its reference. + */ +asn1p_expr_t * +asn1f_class_access(arg_t *, asn1p_ref_t *, asn1p_module_t **mod_r); + +/* + * Externally accessible version of above function. + */ +asn1p_expr_t *asn1f_class_access2(asn1p_t *asn, asn1p_module_t *mod, + asn1p_expr_t *expr, asn1p_ref_t *, asn1p_module_t **mod_r); + +#endif /* _ASN1FIX_CLASS_H_ */ diff --git a/libasn1fix/asn1fix_compat.c b/libasn1fix/asn1fix_compat.c new file mode 100644 index 000000000..aef26c0b2 --- /dev/null +++ b/libasn1fix/asn1fix_compat.c @@ -0,0 +1,132 @@ +#include "asn1fix_internal.h" + +static int asn1f_check_same_children(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b); + +/* + * Check that the expressions given are compatible in their type. + * ORDER DOES MATTER! (See .h). + */ +int +asn1f_check_type_compatibility(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b) { + asn1p_expr_type_e atype, btype; + + atype = a->expr_type; + btype = b->expr_type; + + DEBUG("%s(%s:%x@%d, %s:%x@%d)", __func__, + a->Identifier, atype, a->_lineno, + b->Identifier, btype, b->_lineno); + + /* + * Expected terminal type! + */ + assert(atype != A1TC_REFERENCE); + assert(btype != A1TC_REFERENCE); + + if(atype != btype) { + /* + * Limited compatibility. + */ + if((atype == A1TC_UNIVERVAL && btype == ASN_BASIC_INTEGER) + || (atype == A1TC_UNIVERVAL && btype == ASN_BASIC_ENUMERATED) + ) + return 0; + DEBUG("\t%s and %s are not compatible", + a->Identifier, b->Identifier); + return -1; /* Fairly obviously */ + } + + if(a == b) + return 0; /* Fairly obviously */ + + switch(atype) { + case ASN_BASIC_INTEGER: + /* All integers are compatible */ + return 0; + case ASN_BASIC_ENUMERATED: + /* + * Enumerations are not compatible + * unless their definitions are the same. + */ + if(asn1f_check_same_children(arg, a, b)) { + DEBUG("\tEnumerations are different %s and %s", + a->Identifier, b->Identifier); + return -1; + } + return 0; + default: + /* Compatibility is not defined yet */ + DEBUG("\tCompatibility rule is not defined for %s and %s", + a->Identifier, b->Identifier); + return -1; + } + + return 0; +} + +/* + * Check that the children are exactly same. + */ +static int +asn1f_check_same_children(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b) { + asn1p_expr_t *achild; + asn1p_expr_t *bchild; + + achild = TQ_FIRST(&(a->members)); + bchild = TQ_FIRST(&(b->members)); + + while(1) { + if(achild->expr_type != bchild->expr_type) + return -1; + + if(achild->Identifier && bchild->Identifier) { + if(strcmp(achild->Identifier, bchild->Identifier)) + return -1; + } else if(!(!achild->Identifier && !bchild->Identifier)) { + return -1; + } + + if(achild->value && bchild->value) { + if(achild->value->type != bchild->value->type) + return -1; + switch(achild->value->type) { + case ATV_INTEGER: + if(achild->value->value.v_integer + != bchild->value->value.v_integer) + return -1; + break; + case ATV_REFERENCED: + default: + DEBUG("Value %s at lines %d and " + "%d cannot be used in " + "semantical equality check", + asn1f_printable_value(achild->value), + achild->value->value.reference->_lineno, + bchild->value->value.reference->_lineno + ); + return -1; + } + } else if(!(!achild->value && !bchild->value)) { + /* One of values is defined, and another is not */ + return -1; + } + + achild = TQ_NEXT(achild, next); + bchild = TQ_NEXT(bchild, next); + + if(achild && bchild) + continue; + else if(!achild && !bchild) + break; + else + return -1; + } + + DEBUG("\t%s:%x@%d and %s:%x@%d are semantically equivalent", + a->Identifier, a->expr_type, a->_lineno, + b->Identifier, b->expr_type, b->_lineno); + + return 0; +} + + diff --git a/libasn1fix/asn1fix_compat.h b/libasn1fix/asn1fix_compat.h new file mode 100644 index 000000000..429e7dd89 --- /dev/null +++ b/libasn1fix/asn1fix_compat.h @@ -0,0 +1,14 @@ +#ifndef _ASN1FIX_COMPAT_H_ +#define _ASN1FIX_COMPAT_H_ + +/* + * Check that the expressions given are compatible in their type. + * ORDER DOES MATTER! + * The compatibility is being checked as if the value of b were used + * to assign it to type a. + */ +int asn1f_check_type_compatibility(arg_t *arg, + asn1p_expr_t *a, + asn1p_expr_t *b); + +#endif /* _ASN1FIX_COMPAT_H_ */ diff --git a/libasn1fix/asn1fix_constr.c b/libasn1fix/asn1fix_constr.c new file mode 100644 index 000000000..2aa798271 --- /dev/null +++ b/libasn1fix/asn1fix_constr.c @@ -0,0 +1,364 @@ +#include "asn1fix_internal.h" + +static int _asn1f_check_if_tag_must_be_explicit(arg_t *arg, asn1p_expr_t *v); +static int _asn1f_compare_tags(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b); + + +int +asn1f_fix_constr_ext(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *v; + TQ_HEAD(asn1p_expr_t) root_list; + TQ_HEAD(asn1p_expr_t) ext_list; + TQ_HEAD(asn1p_expr_t) *cur_list; + int r_value = 0; + int ext_count = 0; + + switch(expr->expr_type) { + case ASN_CONSTR_SEQUENCE: + case ASN_CONSTR_SET: + case ASN_CONSTR_CHOICE: + break; + default: + return 0; + } + + DEBUG("%s(%s) for line %d", __func__, + expr->Identifier, expr->_lineno); + + TQ_INIT(&root_list); + TQ_INIT(&ext_list); + cur_list = (void *)&root_list; + + while((v = TQ_REMOVE(&(expr->members), next))) { + if(v->expr_type == A1TC_EXTENSIBLE) { + ext_count++; + switch(ext_count) { + case 1: cur_list = (void *)&ext_list; break; + case 2: + cur_list = (void *)&root_list; + if(v->value) { + FATAL("Optional extension marker " + "must not contain " + "an exception mark " + "at line %d", v->_lineno); + r_value = -1; + } + asn1p_expr_free(v); + continue; + case 3: + FATAL("Third extension marker " + "is not allowed at line %d", v->_lineno); + default: + r_value = -1; + } + } + + TQ_ADD(cur_list, v, next); + } + + /* + * Copy the root list and extension list back into the main list. + */ + TQ_HEAD_COPY(&(expr->members), &root_list); + while((v = TQ_REMOVE(&ext_list, next))) + TQ_ADD(&(expr->members), v, next); + + if(arg->mod->module_flags & MSF_EXTENSIBILITY_IMPLIED + && ext_count < 1) { + v = asn1p_expr_new(0); + if(v) { + v->Identifier = strdup("..."); + v->expr_type = A1TC_EXTENSIBLE; + v->meta_type = AMT_TYPE; + if(v->Identifier == NULL) { + asn1p_expr_free(v); + r_value = -1; + } else { + TQ_ADD(&(expr->members), v, next); + } + } else { + r_value = -1; + } + } + + return r_value; +} + + +int +asn1f_fix_constr_tag(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *v; + int fl_impl_tags = 0; + int fl_auto_tags = 0; + int root_tagged = 0; /* The root component is manually tagged */ + int ext_tagged = 0; /* The extensions are manually tagged */ + int component_number = 0; + int r_value = 0; + + switch(expr->expr_type) { + case ASN_CONSTR_SEQUENCE: + case ASN_CONSTR_SET: + case ASN_CONSTR_CHOICE: + break; + default: + return 0; + } + + fl_impl_tags = (arg->mod->module_flags & MSF_IMPLICIT_TAGS); + fl_auto_tags = (arg->mod->module_flags & MSF_AUTOMATIC_TAGS); + + DEBUG("%s(%s) {%d, %d} for line %d", __func__, + expr->Identifier, fl_impl_tags, fl_auto_tags, expr->_lineno); + + TQ_FOR(v, &(expr->members), next) { + int must_explicit = 0; + + if(v->expr_type == A1TC_EXTENSIBLE) { + component_number++; + continue; + } + + if(v->tag.tag_class == TC_NOCLASS) { + continue; + } else { + switch(component_number) { + case 0: case 2: + root_tagged = 1; break; + default: + ext_tagged = 1; break; + } + } + + must_explicit = _asn1f_check_if_tag_must_be_explicit(arg, v); + + if(fl_impl_tags) { + if(v->tag.tag_mode != TM_EXPLICIT) { + if(must_explicit) + v->tag.tag_mode = TM_EXPLICIT; + else + v->tag.tag_mode = TM_IMPLICIT; + } + } else { + if(v->tag.tag_mode == TM_DEFAULT) { + v->tag.tag_mode = TM_EXPLICIT; + } + } + + /* + * Perform a final sanity check. + */ + if(must_explicit) { + if(v->tag.tag_mode == TM_IMPLICIT) { + FATAL("%s tagged in IMPLICIT mode " + "but must be EXPLICIT at line %d", + v->Identifier, v->_lineno); + r_value = -1; + } else { + v->tag.tag_mode = TM_EXPLICIT; + } + } + } + + if(ext_tagged && !root_tagged) { + FATAL("In %s at line %d: " + "extensions are tagged " + "but root components are not", + expr->Identifier, expr->_lineno); + r_value = -1; + } else if(!root_tagged && !ext_tagged && fl_auto_tags) { + expr->auto_tags_OK = 1; + } + + return r_value; +} + +int +asn1f_fix_constr_autotag(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *v; + asn1_integer_t tag_value = 0; + int r_value = 0; + + switch(expr->expr_type) { + case ASN_CONSTR_SEQUENCE: + case ASN_CONSTR_SET: + case ASN_CONSTR_CHOICE: + if(expr->auto_tags_OK) + break; + /* Automatic tagging is not applicable */ + /* Fall through */ + default: + return 0; + } + + DEBUG("%s(%s) for line %d", __func__, + expr->Identifier, expr->_lineno); + + TQ_FOR(v, &(expr->members), next) { + int must_explicit; + + if(v->expr_type == A1TC_EXTENSIBLE) + break; + + assert(v->tag.tag_class == TC_NOCLASS); + + must_explicit = _asn1f_check_if_tag_must_be_explicit(arg, v); + + v->tag.tag_class = TC_CONTEXT_SPECIFIC; + v->tag.tag_mode = must_explicit ? TM_EXPLICIT : TM_IMPLICIT; + v->tag.tag_value = tag_value++; + } + + return r_value; +} + +/* + * Check that tags are distinct. + */ +int +asn1f_check_constr_tags_distinct(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *v; + int r_value = 0; + + switch(expr->expr_type) { + case ASN_CONSTR_SEQUENCE: + case ASN_CONSTR_SET: + case ASN_CONSTR_CHOICE: + break; + default: + return 0; + } + + TQ_FOR(v, &(expr->members), next) { + /* + * In every series of non-mandatory components, + * the tags must be distinct from each other AND the + * tag of the following mandatory component. + * For SET and CHOICE treat everything as a big set of + * non-mandatory components. + */ + if(expr->expr_type != ASN_CONSTR_SEQUENCE || v->marker) { + asn1p_expr_t *nv; + for(nv = v; (nv = TQ_NEXT(nv, next));) { + if(_asn1f_compare_tags(arg, v, nv)) + r_value = -1; + if(expr->expr_type == ASN_CONSTR_SEQUENCE + && !nv->marker) break; + } + } + } + + return r_value; +} + +static int +_asn1f_check_if_tag_must_be_explicit(arg_t *arg, asn1p_expr_t *v) { + asn1p_expr_t *reft; + + reft = asn1f_find_terminal_type(arg, v, 0); + if(reft) { + switch(reft->expr_type) { + case ASN_CONSTR_CHOICE: + return 1; + default: + return 0; + } + } + + return 0; +} + +/* + * Check that the tags are distinct. + */ +static int +_asn1f_compare_tags(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b) { + struct asn1p_type_tag_s ta, tb; + int ra, rb; + int ret; + + ra = asn1f_fetch_tag(arg->asn, arg->mod, a, &ta); + rb = asn1f_fetch_tag(arg->asn, arg->mod, b, &tb); + + /* + * If both tags are explicitly or implicitly given, use them. + */ + if(ra == 0 && rb == 0) { + /* + * Simple case: fetched both tags. + */ + if(ta.tag_value == tb.tag_value + && ta.tag_class == tb.tag_class) { + char *p = (a->expr_type == A1TC_EXTENSIBLE) + ?"potentially ":""; + FATAL("Component \"%s\" at line %d %shas the same tag " + "with component \"%s\" at line %d", + a->Identifier, + a->_lineno, + p, + b->Identifier, + b->_lineno + ); + return -1; + } else { + /* Tags are distinct */ + return 0; + } + } + + /********************************************************** + * Now we must perform some very funny recursion to check + * multiple components of CHOICE type, etc. + */ + + DEBUG("Comparing tags %s:%x <-> %s:%x", + a->Identifier, a->expr_type, + b->Identifier, b->expr_type); + + if(a->meta_type == AMT_TYPEREF) { + asn1p_module_t *mod; + + DEBUG(" %s is a type reference", a->Identifier); + + a = asn1f_lookup_symbol(arg, a->reference, &mod); + if(!a) return 0; /* Already FATAL()'ed somewhere else */ + WITH_MODULE(mod, ret = _asn1f_compare_tags(arg, a, b)); + return ret; + } + + if(a->expr_type == ASN_CONSTR_CHOICE) { + asn1p_expr_t *v; + + DEBUG(" %s is a choice type (%d)", a->Identifier, a->_mark); + + /* + * Iterate over members of CHOICE. + */ + //if(a->_mark & TM_RECURSION) return 0; + TQ_FOR(v, &(a->members), next) { + //a->_mark |= TM_RECURSION; + ret = _asn1f_compare_tags(arg, v, b); + //a->_mark &= ~TM_RECURSION; + if(ret) return ret; + } + return 0; + } + + if(b->expr_type == ASN_CONSTR_CHOICE) { + return _asn1f_compare_tags(arg, b, a); + } + + if(a->_mark & TM_RECURSION) return 0; + if(b->_mark & TM_RECURSION) return 0; + a->_mark |= TM_RECURSION; + b->_mark |= TM_RECURSION; + ret = _asn1f_compare_tags(arg, b, a); + a->_mark &= ~TM_RECURSION; + b->_mark &= ~TM_RECURSION; + + return ret; +} + diff --git a/libasn1fix/asn1fix_constr.h b/libasn1fix/asn1fix_constr.h new file mode 100644 index 000000000..aeb05c0a8 --- /dev/null +++ b/libasn1fix/asn1fix_constr.h @@ -0,0 +1,24 @@ +#ifndef _ASN1FIX_CONSTRUCTED_H_ +#define _ASN1FIX_CONSTRUCTED_H_ + +/* + * Fix extensions in constructed types. + */ +int asn1f_fix_constr_ext(arg_t *); + +/* + * Fix tagging in constructed types. + */ +int asn1f_fix_constr_tag(arg_t *); + +/* + * Check distinctive tagging in constructed types. + */ +int asn1f_check_constr_tags_distinct(arg_t *); + +/* + * Perform automatic tagging. + */ +int asn1f_fix_constr_autotag(arg_t *); + +#endif /* _ASN1FIX_CONSTRUCTED_H_ */ diff --git a/libasn1fix/asn1fix_cstring.c b/libasn1fix/asn1fix_cstring.c new file mode 100644 index 000000000..b8a38833b --- /dev/null +++ b/libasn1fix/asn1fix_cstring.c @@ -0,0 +1,73 @@ +#include "asn1fix_internal.h" + +struct _cstring_pattern { + char *start; + int length; +}; +static int _asn1f_cstring_find_line_pattern(char *s, struct _cstring_pattern *); + +int +asn1f_fix_cstring(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + int r_value = 0; + + if(expr->value && expr->value->type == ATV_STRING) { + struct _cstring_pattern cp; + char *buf = expr->value->value.string.buf; + int buflen = expr->value->value.string.size; + int start = 0; + + DEBUG("%s(%s) for line %d", __func__, + expr->Identifier, expr->_lineno); + + while(_asn1f_cstring_find_line_pattern(buf + start, &cp)) { + assert(cp.length); + memmove(cp.start, cp.start + cp.length, + buflen - ((cp.start + cp.length) - buf)); + buflen -= cp.length; + start = cp.start - buf; + buf[buflen] = '\0'; + } + } + + return r_value; +} + +/* + * If a string has a newline, the tabulation and spaces before and + * after it must be eliminated. + */ +static int +_asn1f_cstring_find_line_pattern(char *s, struct _cstring_pattern *cp) { + int newline_found = 0; + + cp->start = NULL; + + for(;;s++) { + switch(*s) { + case '\r': case '\n': + newline_found = 1; + /* Fall through */ + case ' ': case '\t': + if(cp->start == NULL) + cp->start = s; + continue; + case '\0': + default: + if(newline_found) { + cp->length = s - cp->start; + return 1; + } + + cp->start = NULL; + if(*s == '\0') + break; + continue; + } + break; + } + + return 0; +} + + diff --git a/libasn1fix/asn1fix_cstring.h b/libasn1fix/asn1fix_cstring.h new file mode 100644 index 000000000..bd647abe9 --- /dev/null +++ b/libasn1fix/asn1fix_cstring.h @@ -0,0 +1,6 @@ +#ifndef _ASN1FIX_CSTRING_H_ +#define _ASN1FIX_CSTRING_H_ + +int asn1f_fix_cstring(arg_t *); + +#endif /* _ASN1FIX_CSTRING_H_ */ diff --git a/libasn1fix/asn1fix_dereft.c b/libasn1fix/asn1fix_dereft.c new file mode 100644 index 000000000..f0ec9a6ce --- /dev/null +++ b/libasn1fix/asn1fix_dereft.c @@ -0,0 +1,68 @@ +#include "asn1fix_internal.h" + +int +asn1f_fix_dereference_types(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *type_expr; + int r_value = 0; + + if(expr->expr_type == A1TC_PARAMETRIZED) + return asn1f_fix_parametrized_assignment(arg); + + if(expr->expr_type != A1TC_REFERENCE + || expr->meta_type != AMT_TYPEREF) { + //assert(expr->reference == 0); + return 0; /* Just ignore it */ + } + + DEBUG("%s(\"%s\":%x ::= \"%s\") for line %d", + __func__, expr->Identifier, expr->expr_type, + asn1f_printable_value(expr->value), + expr->_lineno); + + assert(TQ_FIRST(&(expr->members)) == 0); + assert(expr->reference); + + /* + * Follow the reference. + */ + type_expr = asn1f_find_terminal_type(arg, expr, 0); + if(type_expr == NULL) { + FATAL("Unknown type \"%s\" referenced by \"%s\" at line %d", + asn1f_printable_reference(expr->reference), + expr->Identifier, expr->_lineno); + return -1; + } + + /* + * Copying members of the source expression + * into the current expression. + */ + if(0) { + asn1p_expr_t *tmp_clone; + + tmp_clone = asn1p_expr_clone(type_expr); + if(tmp_clone == NULL) { + FATAL("Could not clone \"%s\" at line %d", + type_expr->Identifier, type_expr->_lineno); + return -1; + } + + /* + * Replace the referenced type with its definition. + */ + DEBUG("\tChanging type of \"%s\":%x to %x for line %d", + expr->Identifier, + expr->expr_type, + type_expr->expr_type, + expr->_lineno + ); + expr->expr_type = type_expr->expr_type; + expr->members = tmp_clone->members; + memset(&tmp_clone->members, 0, sizeof(tmp_clone->members)); + asn1p_expr_free(tmp_clone); + } + + return r_value; +} + diff --git a/libasn1fix/asn1fix_dereft.h b/libasn1fix/asn1fix_dereft.h new file mode 100644 index 000000000..bee8151a7 --- /dev/null +++ b/libasn1fix/asn1fix_dereft.h @@ -0,0 +1,6 @@ +#ifndef _ASN1FIX_DEREFT_H_ +#define _ASN1FIX_DEREFT_H_ + +int asn1f_fix_dereference_types(arg_t *); + +#endif /* _ASN1FIX_DEREFT_H_ */ diff --git a/libasn1fix/asn1fix_derefv.c b/libasn1fix/asn1fix_derefv.c new file mode 100644 index 000000000..7be9d6d2d --- /dev/null +++ b/libasn1fix/asn1fix_derefv.c @@ -0,0 +1,56 @@ +#include "asn1fix_internal.h" + +/* + * Dereference DefinedValues: + */ +int +asn1f_fix_dereference_values(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + int r_value = 0; + + if(expr->meta_type != AMT_VALUE) + return 0; /* Just ignore it */ + + if(expr->value == NULL) + return 0; /* Just ignore it */ + + if(expr->value && expr->value->type != ATV_REFERENCED) + return 0; /* Not a reference */ + + DEBUG("%s(%s %x ::= %s) for line %d", __func__, + expr->Identifier, expr->expr_type, + asn1f_printable_value(expr->value), expr->_lineno); + + /* + * If this integer has a value, check that this value + * is an integer. If it is a reference, resolve it. + */ + if(expr->value) { + + if(asn1f_value_resolve(arg, expr)) { + /* This function will emit messages */ + r_value = -1; + } + + if(expr->value->type != ATV_INTEGER) { + FATAL( + "INTEGER value %s at line %d: " + "Incompatible value specified: %s", + expr->Identifier, + expr->_lineno, + asn1f_printable_value(expr->value) + ); + r_value = -1; + } + } else { + FATAL("Value of \"%s\" at line %d: " + "Incompatible value specified", + expr->Identifier, + expr->_lineno + ); + r_value = -1; + } + + return r_value; +} + diff --git a/libasn1fix/asn1fix_derefv.h b/libasn1fix/asn1fix_derefv.h new file mode 100644 index 000000000..931538513 --- /dev/null +++ b/libasn1fix/asn1fix_derefv.h @@ -0,0 +1,6 @@ +#ifndef _ASN1FIX_DEREFV_H_ +#define _ASN1FIX_DEREFV_H_ + +int asn1f_fix_dereference_values(arg_t *); + +#endif /* _ASN1FIX_DEREFV_H_ */ diff --git a/libasn1fix/asn1fix_enum.c b/libasn1fix/asn1fix_enum.c new file mode 100644 index 000000000..8a90a435d --- /dev/null +++ b/libasn1fix/asn1fix_enum.c @@ -0,0 +1,136 @@ +#include "asn1fix_internal.h" + +/* + * Check the validity of an enumeration. + */ +int +asn1f_fix_enum(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *ev; + asn1_integer_t max_value = -1; + int rvalue = 0; + asn1p_expr_t *ext_marker = NULL; /* "..." position */ + int ret; + + if(expr->expr_type != ASN_BASIC_ENUMERATED) + return 0; /* Just ignore it */ + + DEBUG("%s(%s)", __func__, expr->Identifier); + + /* + * 1. Scan the enumeration values in search for inconsistencies. + */ + TQ_FOR(ev, &(expr->members), next) { + asn1_integer_t eval; + + if(ev->value) + DEBUG("\tItem %s(%s)", ev->Identifier, + asn1f_printable_value(ev->value)); + else + DEBUG("\tItem %s", ev->Identifier); + + /* + * 1.1 Found an extension mark "...", check correctness. + */ + if(ev->expr_type == A1TC_EXTENSIBLE) { + if(ext_marker) { + arg->eh(1, + "Enumeration %s at line %d: " + "Second extension marker is not allowed", + expr->Identifier, + ev->_lineno); + rvalue = -1; + } else { + /* + * Remember the marker's position. + */ + ext_marker = ev; + } + continue; + } else if(ev->Identifier == NULL + || ev->expr_type != A1TC_UNIVERVAL) { + FATAL( + "Enumeration %s at line %d: " + "Unsupported enumeration element %s", + expr->Identifier, + ev->_lineno, + ev->Identifier?ev->Identifier:""); + rvalue = -1; + continue; + } + + /* + * 1.2 Compute the value of the enumeration element. + */ + if(ev->value) { + switch(ev->value->type) { + case ATV_INTEGER: + eval = ev->value->value.v_integer; + break; + case ATV_REFERENCED: + FATAL("HERE HERE HERE", 1); + rvalue = -1; + continue; + break; + default: + FATAL("ENUMERATED type %s at line %d " + "contain element %s(%s) at line %d", + expr->Identifier, expr->_lineno, + ev->Identifier, + asn1f_printable_value(ev->value), + ev->_lineno); + rvalue = -1; + continue; + } + } else { + eval = max_value + 1; + ev->value = asn1p_value_fromint(eval); + if(ev->value == NULL) { + rvalue = -1; + continue; + } + } + + /* + * 1.3 Check the applicability of this value. + */ + if(eval <= max_value) { + if(ext_marker) { + /* + * Enumeration is allowed to be unordered + * before the first marker. + */ + FATAL( + "Enumeration %s at line %d: " + "Explicit value \"%s(%lld)\" " + "is not greater " + "than previous values (max %lld)", + expr->Identifier, + ev->_lineno, + ev->Identifier, + eval, + max_value); + rvalue = -1; + } + } else if(eval > max_value) { + max_value = eval; + } + + /* + * 1.4 Check that all identifiers before the current one + * differs from it. + */ + ret = asn1f_check_unique_expr_child(arg, ev, NULL); + RET2RVAL(ret, rvalue); + } + + + /* + * 2. Reorder the first half (before optional "...") of the + * identifiers alphabetically. + */ + // TODO + + return rvalue; +} + diff --git a/libasn1fix/asn1fix_enum.h b/libasn1fix/asn1fix_enum.h new file mode 100644 index 000000000..14c6fb527 --- /dev/null +++ b/libasn1fix/asn1fix_enum.h @@ -0,0 +1,6 @@ +#ifndef _ASN1FIX_ENUM_H_ +#define _ASN1FIX_ENUM_H_ + +int asn1f_fix_enum(arg_t *); /* Enumeration ::= ENUMERATED { a(1), b(2) } */ + +#endif /* _ASN1FIX_ENUM_H_ */ diff --git a/libasn1fix/asn1fix_export.c b/libasn1fix/asn1fix_export.c new file mode 100644 index 000000000..d6bb37b4a --- /dev/null +++ b/libasn1fix/asn1fix_export.c @@ -0,0 +1,48 @@ +#include "asn1fix_internal.h" +#include "asn1fix_export.h" + +asn1p_expr_t * +asn1f_lookup_symbol_ex( + asn1p_t *asn, + asn1p_module_t **module_rw, + asn1p_expr_t *expr, + asn1p_ref_t *ref) { + arg_t arg; + + memset(&arg, 0, sizeof(arg)); + + arg.asn = asn; + arg.mod = *module_rw; + arg.expr = expr; + + return asn1f_lookup_symbol(&arg, ref, module_rw); +} + +asn1p_expr_t * +asn1f_class_access_ex(asn1p_t *asn, + asn1p_module_t *mod, + asn1p_expr_t *expr, + asn1p_ref_t *ref, + asn1p_module_t **mod_r) { + static arg_t arg; + + arg.asn = asn; + arg.mod = mod; + arg.expr = expr; + + return asn1f_class_access(&arg, ref, mod_r); +} + +asn1p_expr_t * +asn1f_find_terminal_type_ex(asn1p_t *asn, + asn1p_module_t *mod, + asn1p_expr_t *expr, + asn1p_module_t **mod_r) { + static arg_t arg; + + arg.asn = asn; + arg.mod = mod; + arg.expr = expr; + + return asn1f_find_terminal_type(&arg, expr, mod_r); +} diff --git a/libasn1fix/asn1fix_export.h b/libasn1fix/asn1fix_export.h new file mode 100644 index 000000000..2ade0c9af --- /dev/null +++ b/libasn1fix/asn1fix_export.h @@ -0,0 +1,32 @@ +/* + * This header exports fixer procedures that are common enough to be used + * in other modules. + */ +#ifndef _ASN1FIX_EXPORT_H_ +#define _ASN1FIX_EXPORT_H_ + +#include + +/* + * Exportable version of an asn1f_lookup_symbol(). + */ +asn1p_expr_t *asn1f_lookup_symbol_ex( + asn1p_t *asn, + asn1p_module_t **module_rw, + asn1p_expr_t *expr, + asn1p_ref_t *ref); + +/* + * Exportable version of an asn1f_class_access(). + */ +asn1p_expr_t *asn1f_class_access_ex(asn1p_t *asn, asn1p_module_t *mod, + asn1p_expr_t *expr, asn1p_ref_t *, asn1p_module_t **mod_r); + +/* + * Exportable version of asn1f_find_terminal_type(). + */ +asn1p_expr_t *asn1f_find_terminal_type_ex(asn1p_t *asn, asn1p_module_t *mod, + asn1p_expr_t *tc, asn1p_module_t **opt_module_r); + +#endif /* _ASN1FIX_EXPORT_H_ */ + diff --git a/libasn1fix/asn1fix_integer.c b/libasn1fix/asn1fix_integer.c new file mode 100644 index 000000000..514ab70e7 --- /dev/null +++ b/libasn1fix/asn1fix_integer.c @@ -0,0 +1,161 @@ +#include "asn1fix_internal.h" + +static int _compare_value(asn1p_expr_t *expr1, asn1p_expr_t *expr2) { + if(expr2->value->type == ATV_INTEGER + && expr1->value->type == ATV_INTEGER) { + return expr2->value->value.v_integer + - expr1->value->value.v_integer; + } else { + return -1; + } +} + +/* + * Check the validity of an INTEGER type. + */ +int +asn1f_fix_integer(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *iv; + int rvalue = 0; + int ret; + + if(expr->expr_type != ASN_BASIC_INTEGER) + return 0; /* Just ignore it */ + + DEBUG("%s(\"%s\", %x) for line %d", __func__, + expr->Identifier, expr->expr_type, expr->_lineno); + + /* + * Scan the integer values in search for inconsistencies. + */ + TQ_FOR(iv, &(expr->members), next) { + + DEBUG("\tItem %s(%s)", iv->Identifier, + asn1f_printable_value(iv->value)); + + /* + * Found "...", check correctness. + */ + if(iv->expr_type == A1TC_EXTENSIBLE) { + arg->eh(1, + "INTEGER %s at line %d: " + "Extension marker is not allowed", + expr->Identifier, + iv->_lineno + ); + rvalue = -1; + continue; + } + + if(iv->Identifier == NULL + || iv->expr_type != A1TC_UNIVERVAL) { + arg->eh(1, + "INTEGER %s at line %d: " + "Unsupported enumeration element %s", + expr->Identifier, + iv->_lineno, + iv->Identifier?iv->Identifier:"" + ); + rvalue = -1; + continue; + } + + if(iv->value == NULL) { + arg->eh(1, + "INTEGER %s at line %d: " + "Value for the identifier %s " + "must be set explicitly", + expr->Identifier, + iv->_lineno, + iv->Identifier + ); + rvalue = -1; + continue; + } else if(iv->value->type == ATV_REFERENCED) { + /* + * Resolve the value, once and for all. + */ + if(asn1f_value_resolve(arg, iv)) { + /* This function will emit messages */ + rvalue = -1; + continue; + } + } + + if(iv->value->type != ATV_INTEGER) { + arg->eh(1, + "INTEGER %s at line %d: " + "Value for the identifier %s " + "is not compatible with INTEGER type", + expr->Identifier, + iv->_lineno); + rvalue = -1; + continue; + } + + /* + * Check that all identifiers are distinct. + */ + ret = asn1f_check_unique_expr_child(arg, iv, NULL); + RET2RVAL(ret, rvalue); + /* + * Check that all values are distinct. + */ + ret = asn1f_check_unique_expr_child(arg, iv, _compare_value); + RET2RVAL(ret, rvalue); + } + + + return rvalue; +} + +static int +_asn1f_make_sure_type_is(arg_t *arg, asn1p_expr_t *expr, asn1p_expr_type_e type) { + asn1p_module_t *mod = NULL; + asn1p_expr_t *next_expr; + int expr_type; + int ret; + + expr_type = expr->expr_type; + + /* + * Here we're trying to make sure that the type of the given + * expression is really what is expected. + * This is ensured in two ways. + * First, if the immediate type matches the provided one, + * this is a clear hit. + */ + if(expr_type == type) + return 0; + + /* + * Otherwise, it must be either a reference or a different type. + */ + if(expr_type != A1TC_REFERENCE) { + errno = EPERM; + return -1; + } + + assert(expr_type == A1TC_REFERENCE); + assert(expr->reference); + + /* + * Then, it is a reference. For a reference, try to resolve type + * and try again. + */ + next_expr = asn1f_lookup_symbol(arg, expr->reference, &mod); + if(next_expr == NULL) { + errno = ESRCH; + return -1; + } + + /* + * If symbol is here, recursively check that it conforms to the type. + */ + WITH_MODULE(mod, ret = _asn1f_make_sure_type_is(arg, next_expr, type)); + + return ret; +} + + diff --git a/libasn1fix/asn1fix_integer.h b/libasn1fix/asn1fix_integer.h new file mode 100644 index 000000000..d306fc03d --- /dev/null +++ b/libasn1fix/asn1fix_integer.h @@ -0,0 +1,6 @@ +#ifndef _ASN1FIX_INTEGER_H_ +#define _ASN1FIX_INTEGER_H_ + +int asn1f_fix_integer(arg_t *); /* Type1 ::= INTEGER { a(1), b(2) } */ + +#endif /* _ASN1FIX_INTEGER_H_ */ diff --git a/libasn1fix/asn1fix_internal.h b/libasn1fix/asn1fix_internal.h new file mode 100644 index 000000000..ff3b4e96d --- /dev/null +++ b/libasn1fix/asn1fix_internal.h @@ -0,0 +1,106 @@ +#ifndef _ASN1FIX_INTERNAL_H_ +#define _ASN1FIX_INTERNAL_H_ + +/* + * System headers required in various modules. + */ +#include +#include +#include +#include /* isupper() */ +#include +#include + +#include /* Our lovely ASN.1 parser module */ + +/* + * A definition of a function that will log error messages. + */ +typedef void (*error_logger_f)(int _is_fatal, const char *fmt, ...); + +/* + * Universal argument. + */ +typedef struct arg_s { + asn1p_t *asn; + asn1p_module_t *mod; + asn1p_expr_t *expr; + error_logger_f eh; + error_logger_f debug; + void *key; /* The next level key */ +} arg_t; + +/* + * Functions performing normalization of various types. + */ +#include "asn1fix_misc.h" /* Support functions */ +#include "asn1fix_value.h" /* Value processing */ +#include "asn1fix_cstring.h" /* Fix cstring values */ +#include "asn1fix_compat.h" /* Data compatibility */ +#include "asn1fix_constr.h" /* Constructed types */ +#include "asn1fix_class.h" /* CLASS support */ +#include "asn1fix_param.h" /* Parametrization */ +#include "asn1fix_retrieve.h" /* Data retrieval */ +#include "asn1fix_enum.h" /* Process ENUMERATED */ +#include "asn1fix_integer.h" /* Process INTEGER */ +#include "asn1fix_bitstring.h" /* Process BIT STRING */ +#include "asn1fix_dereft.h" /* Dereference types */ +#include "asn1fix_derefv.h" /* Dereference values */ +#include "asn1fix_tags.h" /* Tags-related stuff */ + + +/* + * Merge the return value of the called function with the already + * partially computed return value of the current function. + */ +#define RET2RVAL(ret,rv) do { \ + int __ret = ret; \ + switch(__ret) { \ + case 0: break; \ + case 1: if(rv) break; \ + case -1: rv = __ret; break; \ + default: \ + assert(__ret >= -1 && __ret <= 1); \ + rv = -1; \ + } \ + } while(0) + +/* + * Temporary substitute module for the purposes of evaluating expression. + */ +#define WITH_MODULE(tmp_mod, expr) do { \ + void *_saved_mod = arg->mod; \ + arg->mod = tmp_mod; \ + do { expr; } while(0); \ + arg->mod = _saved_mod; \ + } while(0) + +#define LOG(code, fmt, args...) do { \ + int _save_errno = errno; \ + if(code < 0) { \ + if(arg->debug) \ + arg->debug(code, fmt, ##args); \ + } else { \ + arg->eh(code, fmt " in %s", ##args, \ + arg->mod->source_file_name); \ + } \ + errno = _save_errno; \ + } while(0) + +#define DEBUG(fmt, args...) LOG(-1, fmt, ##args) +#define FATAL(fmt, args...) LOG( 1, fmt, ##args) +#define WARNING(fmt, args...) LOG( 0, fmt, ##args) + + +/* + * Define the symbol corresponding to the name of the current function. + */ +#if __STDC_VERSION__ < 199901 +#if !(__GNUC__ == 2 && __GNUC_MINOR__ >= 7 || __GNUC__ >= 3) +#define __func__ (char *)0 /* Name of the current function */ +#endif /* GNUC */ +/* __func__ is supposed to be defined */ +#endif + + +#endif /* _ASN1FIX_INTERNAL_H_ */ diff --git a/libasn1fix/asn1fix_misc.c b/libasn1fix/asn1fix_misc.c new file mode 100644 index 000000000..5fe69034f --- /dev/null +++ b/libasn1fix/asn1fix_misc.c @@ -0,0 +1,276 @@ +#include "asn1fix_internal.h" + + +char const * +asn1f_printable_reference(asn1p_ref_t *ref) { + if(ref) { + asn1p_value_t v; + + v.type = ATV_REFERENCED; + v.value.reference = ref; + + return asn1f_printable_value(&v); + } else { + return ""; + } +} + +char const * +asn1f_printable_value(asn1p_value_t *v) { + static char buf[128]; + static char *managedptr; + static int managedptr_len; + int ret; + +#define ENSURE(len) do { \ + if(len >= managedptr_len) { \ + if(managedptr) \ + free(managedptr); \ + managedptr = malloc(len + 1); \ + if(managedptr) { \ + managedptr_len = len; \ + } else { \ + managedptr_len = 0; \ + return ""; \ + } \ + } \ + } while(0) + + if(v == NULL) + return ""; + + switch(v->type) { + case ATV_NOVALUE: + return ""; + case ATV_REFERENCED: + { + asn1p_ref_t *ref; + char reflen; + char *ptr; + int i; + + assert(v->value.reference); + ref = v->value.reference; + reflen = ref->comp_count; /* Number of dots */ + for(i = 0; i < ref->comp_count; i++) + reflen += strlen(ref->components[i].name); + /* + * Make sure we have a buffer of this size. + */ + ENSURE(reflen); + + /* + * Fill-up the buffer. + */ + ptr = managedptr; + for(i = 0; i < ref->comp_count; i++) { + char *nc; + if(i) *ptr++ = '.'; + for(nc = ref->components[i].name; *nc; nc++) + *ptr++ = *nc; + } + *ptr++ = '\0'; + assert(reflen == (ptr - managedptr)); + return managedptr; + } + case ATV_REAL: + ret = snprintf(buf, sizeof(buf), "%f", v->value.v_double); + if(ret >= sizeof(buf)) + memcpy(buf + sizeof(buf) - 4, "...", 4); + return buf; + case ATV_INTEGER: + ret = snprintf(buf, sizeof(buf), "%lld", + (long long)v->value.v_integer); + if(ret >= sizeof(buf)) + memcpy(buf + sizeof(buf) - 4, "...", 4); + return buf; + case ATV_MIN: return "MIN"; + case ATV_MAX: return "MAX"; + case ATV_FALSE: return "FALSE"; + case ATV_TRUE: return "TRUE"; + case ATV_STRING: + case ATV_UNPARSED: + /* Buffer is guaranteed to be null-terminated */ + assert(v->value.string.buf[v->value.string.size] == '\0'); + return v->value.string.buf; + case ATV_BITVECTOR: + { + uint8_t *bitvector; + char *ptr; + int len; + int i; + /* + * Compute number of bytes necessary + * to represend the binary value. + */ + int bits = v->value.binary_vector.size_in_bits; + len = ((bits%8)?bits:(bits >> 2)) + sizeof("''H"); + /* + * Reallocate managed buffer + */ + ENSURE(len); + + /* + * Fill the buffer. + */ + ptr = managedptr; + bitvector = v->value.binary_vector.bits; + *ptr++ = '\''; + if(bits%8) { + /* + * Dump bit by bit. + */ + for(i = 0; i < bits; i++) { + uint8_t uc; + uc = bitvector[i>>3]; + *ptr++ = ((uc >> (7-(i%8)))&1)?'1':'0'; + } + } else { + char hextable[16] = "0123456789ABCDEF"; + /* + * Dump byte by byte. + */ + for(i = 0; i < (bits >> 3); i++) { + *ptr++ = hextable[bitvector[i] >> 4]; + *ptr++ = hextable[bitvector[i] & 0x0f]; + } + } + *ptr++ = '\''; + *ptr++ = (bits%8)?'B':'H'; + *ptr++ = 'H'; + assert((ptr - managedptr) == len); + return managedptr; + } + } + + return ""; +} + + +/* + * Recursively invoke a given function over the given expr and all its + * children. + */ +int +asn1f_recurse_expr(arg_t *arg, int (*callback)(arg_t *arg)) { + asn1p_expr_t *expr = arg->expr; + int rvalue = 0; + int ret; + + assert(expr); + + /* + * Invoke the callback at this very level. + */ + ret = callback(arg); + RET2RVAL(ret, rvalue); + + /* + * Recursively invoke myself + * to iterate over each element in the tree. + */ + TQ_FOR(arg->expr, &(expr->members), next) { + assert(arg->expr->expr_type != A1TC_INVALID); + ret = asn1f_recurse_expr(arg, callback); + RET2RVAL(ret, rvalue); + } + + arg->expr = expr; /* Restore original position */ + + return rvalue; +} + + +/* + * Check that every child of a given expr has unique name or does not have any. + */ +int +asn1f_check_unique_expr(arg_t *arg, + int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b)) { + asn1p_expr_t *expr; + int rvalue = 0; + + TQ_FOR(expr, &(arg->expr->members), next) { + if(expr->Identifier) { + int ret = asn1f_check_unique_expr_child(arg, expr, + opt_compare); + if(ret) rvalue = -1; + } else { + /* + * No point of comparing this child with any other: + * this one does not have a name. + */ + } + } + + return rvalue; +} + +/* + * Check that every preceeding child of the given expr is not + * having the name of the given one. + */ +int +asn1f_check_unique_expr_child(arg_t *arg, asn1p_expr_t *child, + int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b)) { + asn1p_expr_t *expr; + int rvalue = 0; + + assert(child); + assert(opt_compare || child->Identifier); + + TQ_FOR(expr, &(arg->expr->members), next) { + int ret; + + if(expr == child) + break; + + /* + * Compare according to the custom rule or default + * names comparisons. + */ + if(opt_compare) { + ret = opt_compare(expr, child); + } else { + if(expr->Identifier == NULL + || expr->expr_type == A1TC_EXTENSIBLE) + continue; + ret = strcasecmp(expr->Identifier, child->Identifier); + } + + if(ret == 0) { + char *msg; + msg = opt_compare + ?"Expressions clash" + :"Identifiers name clash"; + arg->eh(1, + "%s: " + "\"%s\" at line %d has similar %s with " + "\"%s\" at line %d", + msg, + expr->Identifier, + expr->_lineno, + opt_compare?"property":"name", + child->Identifier, + child->_lineno + ); + + rvalue = -1; + } + } + + return rvalue; +} + +int +asn1f_count_children(asn1p_expr_t *expr) { + asn1p_expr_t *child; + int count = 0; + + TQ_FOR(child, &(expr->members), next) { + count++; + } + + return count; +} + diff --git a/libasn1fix/asn1fix_misc.h b/libasn1fix/asn1fix_misc.h new file mode 100644 index 000000000..e88e43229 --- /dev/null +++ b/libasn1fix/asn1fix_misc.h @@ -0,0 +1,47 @@ +/* + * Miscellaneous functions necessary for several other modules. + */ +#ifndef _ASN1FIX_MISC_H_ +#define _ASN1FIX_MISC_H_ + +/* + * Return a pointer to the locally held string with human-readable + * definition of the value. + */ +char const *asn1f_printable_value(asn1p_value_t *); + +/* + * Return a pointer to the locally held string with human-readable + * definition of the reference. + */ +char const *asn1f_printable_reference(asn1p_ref_t *); + +/* + * Recursively invoke a given function over the given expr and all its + * children. + */ +int asn1f_recurse_expr(arg_t *arg, int (*f)(arg_t *arg)); + +/* + * Check that every child of a given expr has unique name or does not have any. + * If opt_compare == NULL, the default comparison of the argument's + * names (identifiers) will be performed. + */ +int asn1f_check_unique_expr(arg_t *arg, + int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b)); + +/* + * Check that every preceeding child of the given expr is not + * having the name of the given one. + * If opt_compare == NULL, the default comparison of the argument's + * names (identifiers) will be performed. + */ +int asn1f_check_unique_expr_child(arg_t *arg, asn1p_expr_t *child, + int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b)); + +/* + * Return number of children. + */ +int asn1f_count_children(asn1p_expr_t *parent); + +#endif /* _ASN1FIX_MISC_H_ */ diff --git a/libasn1fix/asn1fix_param.c b/libasn1fix/asn1fix_param.c new file mode 100644 index 000000000..0c838cc59 --- /dev/null +++ b/libasn1fix/asn1fix_param.c @@ -0,0 +1,165 @@ +#include "asn1fix_internal.h" + +static int asn1f_parametrize(arg_t *arg, asn1p_expr_t *ex, asn1p_expr_t *ptype); +static int asn1f_param_process_recursive(arg_t *arg, asn1p_expr_t *expr, asn1p_expr_t *ptype, asn1p_expr_t *actargs); +static asn1p_expr_t *_referenced_argument(asn1p_ref_t *ref, asn1p_expr_t *ptype, asn1p_expr_t *actargs); + +int +asn1f_fix_parametrized_assignment(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *ptype; + + assert(expr->expr_type == A1TC_PARAMETRIZED); + assert(expr->reference); + + DEBUG("%s(\"%s\" ::= \"%s\" { %s }) for line %d", + __func__, expr->Identifier, + asn1f_printable_reference(expr->reference), + asn1f_printable_value(expr->value), + expr->_lineno); + + /* + * Find the corresponding parametrized type definition. + */ + DEBUG("Looking for parametrized type definition \"%s\"", + asn1f_printable_reference(expr->reference)); + ptype = asn1f_lookup_symbol(arg, expr->reference, 0); + if(ptype == NULL) { + DEBUG("%s: missing parametrized type declaration", + asn1f_printable_reference(expr->reference)); + return -1; + } + + /* + * Check that the number of arguments which are expected by + * the parametrized type declaration is consistent with the + * number of arguments supplied by the parametrized assignment. + */ + if(asn1f_count_children(expr) != ptype->params->params_count) { + FATAL("Number of actual arguments %d in %s at line %d " + "is not equal to number of expected arguments " + "%d in %s at line %d", + asn1f_count_children(expr), + asn1f_printable_reference(expr->reference), + expr->_lineno, + ptype->params->params_count, + ptype->Identifier, + ptype->_lineno + ); + return -1; + } + + /* + * Perform an expansion of a parametrized assignment. + */ + return asn1f_parametrize(arg, expr, ptype); +} + +#define SUBSTITUTE(to, from) do { \ + asn1p_expr_t tmp; \ + tmp = *(to); \ + *(to) = *(from); \ + *(from) = tmp; \ + (to)->next = tmp.next; \ + memset(&((from)->next), 0, \ + sizeof((from)->next)); \ + asn1p_expr_free(from); \ + } while(0) + +static int +asn1f_parametrize(arg_t *arg, asn1p_expr_t *expr, asn1p_expr_t *ptype) { + asn1p_expr_t *nex; + void *p; + int ret; + + /* + * The algorithm goes like that: + * 1. Replace the expression's type with parametrized type. + * 2. For every child in the parametrized type, import it + * as a child of the expression, replacing all occurences of + * symbols which are defined as parametrized type arguments + * with the actual values. + */ + + nex = asn1p_expr_clone(ptype); + if(nex == NULL) return -1; + + /* + * Cleanup the new expression so there is no ptype-related + * stuff hanging around. + */ + p = strdup(expr->Identifier); + if(p) { + free(nex->Identifier); + nex->Identifier = p; + } else { + asn1p_expr_free(nex); + return -1; + } + asn1p_paramlist_free(nex->params); + nex->params = NULL; + nex->meta_type = expr->meta_type; + + ret = asn1f_param_process_recursive(arg, nex, ptype, expr); + if(ret != 0) { + asn1p_expr_free(nex); + return ret; + } + + SUBSTITUTE(expr, nex); + + return ret; +} + +static int +asn1f_param_process_recursive(arg_t *arg, asn1p_expr_t *expr, asn1p_expr_t *ptype, asn1p_expr_t *actargs) { + asn1p_expr_t *child; + + TQ_FOR(child, &(expr->members), next) { + asn1p_expr_t *ra; + asn1p_expr_t *ne; + + ra = _referenced_argument(child->reference, ptype, actargs); + if(ra == NULL) continue; + + DEBUG("Substituting parameter for %s %s at line %d", + child->Identifier, + asn1f_printable_reference(child->reference), + child->_lineno + ); + + assert(child->meta_type == AMT_TYPEREF); + assert(child->expr_type == A1TC_REFERENCE); + + ne = asn1p_expr_clone(ra); + if(ne == NULL) return -1; + assert(ne->Identifier == 0); + ne->Identifier = strdup(child->Identifier); + if(ne->Identifier == 0) { + asn1p_expr_free(ne); + return -1; + } + SUBSTITUTE(child, ne); + } + + return 0; +} + +static asn1p_expr_t * +_referenced_argument(asn1p_ref_t *ref, asn1p_expr_t *ptype, asn1p_expr_t *actargs) { + asn1p_expr_t *aa; + int i; + + if(ref == NULL || ref->comp_count != 1) + return NULL; + + aa = TQ_FIRST(&(actargs->members)); + for(i = 0; i < ptype->params->params_count; + i++, aa = TQ_NEXT(aa, next)) { + if(strcmp(ref->components[0].name, + ptype->params->params[i].argument) == 0) + return aa; + } + + return NULL; +} diff --git a/libasn1fix/asn1fix_param.h b/libasn1fix/asn1fix_param.h new file mode 100644 index 000000000..062ad8bd5 --- /dev/null +++ b/libasn1fix/asn1fix_param.h @@ -0,0 +1,6 @@ +#ifndef _ASN1FIX_PARAMETRIZATION_H_ +#define _ASN1FIX_PARAMETRIZATION_H_ + +int asn1f_fix_parametrized_assignment(arg_t *arg); + +#endif /* _ASN1FIX_PARAMETRIZATION_H_ */ diff --git a/libasn1fix/asn1fix_retrieve.c b/libasn1fix/asn1fix_retrieve.c new file mode 100644 index 000000000..0dfcce405 --- /dev/null +++ b/libasn1fix/asn1fix_retrieve.c @@ -0,0 +1,366 @@ +#include "asn1fix_internal.h" + +static asn1p_expr_t *asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, asn1p_module_t **optm, int type_or_value); +static int asn1f_compatible_with_exports(arg_t *arg, asn1p_module_t *mod, const char *name); + + +/* + * Lookup a child by its name. + */ +asn1p_expr_t * +asn1f_lookup_child(asn1p_expr_t *tc, const char *name) { + asn1p_expr_t *child_tc; + + TQ_FOR(child_tc, &(tc->members), next) { + if(child_tc->Identifier + && strcmp(child_tc->Identifier, name) == 0) { + return child_tc; + } + } + + errno = ESRCH; + return NULL; +} + +asn1p_module_t * +asn1f_lookup_in_imports(arg_t *arg, const char *name) { + asn1p_module_t *mod; + asn1p_xports_t *xp; + asn1p_expr_t *tc; + + /* + * Search in which exactly module this name is defined. + */ + TQ_FOR(xp, &(arg->mod->imports), xp_next) { + TQ_FOR(tc, &(xp->members), next) { + if(strcmp(name, tc->Identifier) == 0) + break; + } + if(tc) break; + } + if(xp == NULL) { + errno = ESRCH; + return NULL; + } + + /* + * Okay, right now we have a module name and, hopefully, an OID. + * Search the arg->asn for the specified module. + */ + mod = asn1f_lookup_module(arg, xp->from, xp->from_oid); + if(mod == NULL) { + /* ENOENT/ETOOMANYREFS */ + return NULL; + } + + /* + * Check that the EXPORTS section of this module contains + * the symbol we care about, or it is EXPORTS ALL. + */ + if(asn1f_compatible_with_exports(arg, mod, name)) { + errno = EPERM; + return NULL; + } + + return mod; +} + +asn1p_module_t * +asn1f_lookup_module(arg_t *arg, const char *module_name, asn1p_oid_t *oid) { + asn1p_module_t *mod; + + assert(module_name); + + /* + * If OID is given, the module_name is unused. + * If OID is not given, the module_name may mean + * either the real module's name, or the symbol which is the + * result of renaming. Check this first. + */ + if(oid == 0) { + asn1p_xports_t *xp; + /* + * Check inside the IMPORTS section for possible renaming. + * Renaming practically means that a module_name is mentioned + * somewhere in the IMPORTS section AND OID is given. + */ + TQ_FOR(xp, &(arg->mod->imports), xp_next) { + if(strcmp(module_name, xp->from)) + continue; + if(oid) { + FATAL("Ambiguous reference: " + "%s " + "matches several modules", + module_name); + errno = ETOOMANYREFS; + return NULL; + } + /* + * Yes, there is a renaming. + * Make lookup use OID instead. + */ + oid = xp->from_oid; + } + } + + /* + * Perform lookup using OID or module_name. + */ + TQ_FOR(mod, &(arg->asn->modules), mod_next) { + if(oid) { + if(mod->module_oid) { + if(asn1p_oid_compare(oid, + mod->module_oid)) { + continue; + } else { + /* Match! Even if name doesn't. */ + return mod; + } + } else { + /* Not match, even if name is the same. */ + continue; + } + } + + if(strcmp(module_name, mod->Identifier) == 0) + return mod; + } + + DEBUG("\tModule \"%s\" not found", module_name); + + errno = ENOENT; + return NULL; +} + + + +asn1p_expr_t * +asn1f_lookup_symbol(arg_t *arg, asn1p_ref_t *ref, asn1p_module_t **module_r) { + asn1p_expr_t *ref_tc; /* Referenced tc */ + asn1p_module_t *src_mod; + char *modulename; + char *identifier; + + /* + * First of all, a reference to a symbol may be specified + * using several possible forms: + * a) simple identifier + * v INTEGER ::= value + * b) external reference + * v INTEGER ::= Module1.value + * c) class-related stuff (the most complex stuff) + * v ::= <[A-Z][A-Z0-9a-z-]*>.&<[A-Z0-9a-z-]+>. + * All other forms are not implemented at this moment. + */ + + DEBUG("%s(%s) in %s for line %d", __func__, + asn1f_printable_reference(ref), + arg->mod->Identifier, + ref->_lineno); + + if(ref->comp_count == 1) { + modulename = NULL; + identifier = ref->components[0].name; + } else if(ref->comp_count == 2 + && ref->components[1].name[0] != '&') { + modulename = ref->components[0].name; + identifier = ref->components[1].name; + } else if(ref->comp_count > 1 + && isupper(ref->components[0].name[0]) + && ref->components[1].name[0] == '&') { + asn1p_expr_t *extract; + /* + * This is a reference to a CLASS-related stuff. + * Employ a separate function for that. + */ + extract = asn1f_class_access(arg, ref, module_r); + + return extract; + } else { + DEBUG("\tToo many components: %d", ref->comp_count); + errno = EINVAL; + return NULL; + } + + /* + * If module name is specified explicitly + * OR the current module's IMPORTS clause contains the identifier, + * fetch that module. + */ + if(modulename) { + src_mod = asn1f_lookup_module(arg, modulename, 0); + if(src_mod == NULL) { + FATAL("Module \"%s\" " + "mentioned at line %d is not found", + modulename, ref->_lineno); + return NULL; + } + + /* + * Check that the EXPORTS section of this module contains + * the symbol we care about, or it is EXPORTS ALL. + */ + if(asn1f_compatible_with_exports(arg, src_mod, identifier)) { + errno = EPERM; + return NULL; + } + } else { + src_mod = asn1f_lookup_in_imports(arg, identifier); + if(src_mod == NULL && errno != ESRCH) { + /* + * Return only of the name was not found. + * If module was not found or more serious error + * encountered, just return preserving the errno. + */ + return NULL; + } + } + + if(src_mod == 0) src_mod = arg->mod; + + /* + * Now we know where to search for a value. + */ + TQ_FOR(ref_tc, &(src_mod->members), next) { + if(ref_tc->Identifier) + if(strcmp(ref_tc->Identifier, identifier) == 0) + break; + } + if(ref_tc == NULL) { + DEBUG("Module \"%s\" does not contain \"%s\" " + "mentioned at line %d", + src_mod->Identifier, + identifier, + ref->_lineno + ); + errno = ESRCH; + return NULL; + } + + if(module_r) + *module_r = src_mod; + + return ref_tc; +} + + +asn1p_expr_t * +asn1f_find_terminal_type(arg_t *arg, asn1p_expr_t *expr, + asn1p_module_t **optm) { + return asn1f_find_terminal_thing(arg, expr, optm, 0); +} + +asn1p_expr_t * +asn1f_find_terminal_value(arg_t *arg, asn1p_expr_t *expr, + asn1p_module_t **optm) { + return asn1f_find_terminal_thing(arg, expr, optm, 1); +} + +static asn1p_expr_t * +asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, + asn1p_module_t **optm, int type_or_value) { + asn1p_module_t *mod; + asn1p_ref_t *ref; + asn1p_expr_t *tc; + + if(type_or_value) { + /* VALUE */ + assert(expr->meta_type == AMT_VALUE); + assert(expr->value); + if(expr->value->type != ATV_REFERENCED) { + /* Expression is a terminal value itself */ + if(optm) *optm = arg->mod; + return expr; + } + ref = expr->value->value.reference; + } else { + /* TYPE */ + if(expr->expr_type != A1TC_REFERENCE) { + /* Expression is a terminal type itself */ + if(optm) *optm = arg->mod; + return expr; + } + ref = expr->reference; + } + + DEBUG("%s:%s(%s->%s) for line %d", + __func__, type_or_value?"VALUE":"TYPE", + expr->Identifier, asn1f_printable_reference(ref), + expr->_lineno); + + assert(ref); + + /* + * Lookup inside the type itself (ENUMERATED, INTEGER, etc). + */ + if(type_or_value) { + asn1p_expr_t *val_type_tc; + val_type_tc = asn1f_find_terminal_type(arg, expr, 0); + if(val_type_tc + && asn1f_look_value_in_type(arg, val_type_tc, expr)) + return NULL; + if(expr->value->type != ATV_REFERENCED) { + if(optm) *optm = arg->mod; + return expr; + } + assert(ref == expr->value->value.reference); + ref = expr->value->value.reference; + } + + /* + * Lookup inside the default module. + */ + tc = asn1f_lookup_symbol(arg, ref, &mod); + if(tc == NULL) { + DEBUG("\tSymbol \"%s\" not found", + asn1f_printable_reference(ref)); + return NULL; + } + + /* + * Recursive loops detection. + */ + if(tc->_mark & TM_RECURSION) { + DEBUG("Recursion loop detected for %s at line %d", + asn1f_printable_reference(ref), ref->_lineno); + errno = EPERM; + return NULL; + } + + tc->_mark |= TM_RECURSION; + WITH_MODULE(mod, + expr = asn1f_find_terminal_thing(arg, tc, optm, type_or_value)); + tc->_mark &= ~TM_RECURSION; + + return expr; +} + +/* + * Make sure that the specified name is present or otherwise does + * not contradict with the EXPORTS clause of the specified module. + */ +static int +asn1f_compatible_with_exports(arg_t *arg, asn1p_module_t *mod, const char *name) { + asn1p_xports_t *exports; + asn1p_expr_t *item; + + assert(mod); + assert(name); + + exports = TQ_FIRST(&(mod->exports)); + if(exports == NULL) { + /* No EXPORTS section or EXPORTS ALL; */ + return 0; + } + + TQ_FOR(item, &(exports->members), next) { + if(strcmp(item->Identifier, name) == 0) + return 0; + } + + DEBUG("Symbol \"%s\" contradicts with EXPORTS of module %s", + name, mod->Identifier); + + errno = ESRCH; + return -1; +} diff --git a/libasn1fix/asn1fix_retrieve.h b/libasn1fix/asn1fix_retrieve.h new file mode 100644 index 000000000..47aa0a5b6 --- /dev/null +++ b/libasn1fix/asn1fix_retrieve.h @@ -0,0 +1,73 @@ +/* + * Miscellaneous functions necessary for several other modules. + */ +#ifndef _ASN1FIX_RETRIEVE_H_ +#define _ASN1FIX_RETRIEVE_H_ + +/* + * Simple search for the label in the descendants of the given node. + * ERRORS: + * NULL/ESRCH + */ +asn1p_expr_t *asn1f_lookup_child(asn1p_expr_t *tc, const char *name); + +/* + * Return a module which contain a specified name, as stated in appropriate + * IMPORTS section of the current module (arg->mod). + * + * RETURN VALUES: + * NULL/ESRCH: The name was not found in IMPORTS section. + * NULL/EPERM: The name was not found in EXPORTS section of the source module. + * Also, NULL with errno values defined by asn1f_lookup_module(). + */ +asn1p_module_t *asn1f_lookup_in_imports(arg_t *arg, const char *name); + +/* + * Return a module by its name or optional OID. + * + * RETURN VALUES: + * NULL/ENOENT: No module was found by the specified name and oid + * NULL/ETOOMANYREFS: Several modules are matching the specified name and oid + */ +asn1p_module_t *asn1f_lookup_module(arg_t *arg, + const char *module_name, + asn1p_oid_t *module_oid); + +/* + * Return the reference to a destination of the given reference, + * symbol lookup. Not a recursive function. + * Optional module reference may be assigned a module in which the + * particular expr was found. + */ +asn1p_expr_t *asn1f_lookup_symbol(arg_t *arg, asn1p_ref_t *ref, + asn1p_module_t **opt_module_r); + +/* + * Recursively find the original type for the given expression. + * i.e.: + * If the original specification defines + * v Type1 ::= 5 + * Type1 ::= Type2 (1..5) + * Type3 ::= Type4 (2..7) + * Type4 ::= INTEGER (1..10) + * Then this function, given the the first expression as an argument, + * would return an expression for Type4. + * WARNING: No attempts are made to honor constraints at this moment. + */ +asn1p_expr_t *asn1f_find_terminal_type(arg_t *arg, asn1p_expr_t *tc, + asn1p_module_t **opt_module_r); + +/* + * Recursively find the original value for the given expression. + * i.e.: + * If the original specification defines + * v Type1 ::= value + * value Type2 ::= value2 + * value2 Type3 ::= 3 + * Then this function will return the expression for value2 if given + * the v as an argment. + */ +asn1p_expr_t *asn1f_find_terminal_value(arg_t *arg, asn1p_expr_t *tc, + asn1p_module_t **opt_module_r); + +#endif /* _ASN1FIX_RETRIEVE_H_ */ diff --git a/libasn1fix/asn1fix_tags.c b/libasn1fix/asn1fix_tags.c new file mode 100644 index 000000000..ed8c19f28 --- /dev/null +++ b/libasn1fix/asn1fix_tags.c @@ -0,0 +1,47 @@ +#include "asn1fix_internal.h" + +int +asn1f_fetch_tag(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag) { + int ret; + + if(expr->tag.tag_class != TC_NOCLASS) { + *tag = expr->tag; + return 0; + } + + if(expr->expr_type == A1TC_EXTENSIBLE) { + memset(tag, 0, sizeof(*tag)); + tag->tag_class = -1; + return 0; + } + + if(expr->meta_type == AMT_TYPE) { + memset(tag, 0, sizeof(*tag)); + tag->tag_class = TC_UNIVERSAL; + tag->tag_value = expr_type2uclass_value[expr->expr_type]; + return (tag->tag_value == 0) ? -1 : 0; + } + + if(expr->meta_type == AMT_TYPEREF) { + arg_t arg; + + memset(&arg, 0, sizeof(arg)); + arg.asn = asn; + arg.mod = mod; + arg.expr = expr; + + expr = asn1f_lookup_symbol(&arg, expr->reference, &mod); + if(expr == NULL) return -1; + + if(expr->_mark & TM_RECURSION) + return -1; + + expr->_mark |= TM_RECURSION; + ret = asn1f_fetch_tag(asn, mod, expr, tag); + expr->_mark &= ~TM_RECURSION; + return ret; + } + + return -1; +} + diff --git a/libasn1fix/asn1fix_tags.h b/libasn1fix/asn1fix_tags.h new file mode 100644 index 000000000..9d3595b9f --- /dev/null +++ b/libasn1fix/asn1fix_tags.h @@ -0,0 +1,6 @@ +#ifndef _ASN1FIX_TAGS_H_ +#define _ASN1FIX_TAGS_H_ + +int asn1f_fetch_tag(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag); + +#endif /* _ASN1FIX_TAGS_H_ */ diff --git a/libasn1fix/asn1fix_value.c b/libasn1fix/asn1fix_value.c new file mode 100644 index 000000000..a22fd3dc0 --- /dev/null +++ b/libasn1fix/asn1fix_value.c @@ -0,0 +1,159 @@ +#include "asn1fix_internal.h" + +static int _asn1f_copy_value(arg_t *arg, asn1p_expr_t *to,asn1p_expr_t *from); + +int +asn1f_value_resolve(arg_t *arg, asn1p_expr_t *expr) { + asn1p_module_t *val_mod; + asn1p_expr_t *val_type_expr; + asn1p_expr_t *value_expr; + asn1p_expr_t *type_expr; + int ret; + + /* Make sure this IS a value assignment */ + assert(expr->meta_type == AMT_VALUE); + assert(expr->value); + + DEBUG("%s(=\"%s\", %x)", __func__, + asn1f_printable_value(expr->value), expr->expr_type); + + /* + * 1. Find the terminal type for this assignment. + */ + type_expr = asn1f_find_terminal_type(arg, expr, 0); + if(type_expr == 0) { + DEBUG("\tTerminal type for %s not found", expr->Identifier); + return -1; + } + + if(asn1f_look_value_in_type(arg, type_expr, expr) == -1) + return -1; + + /* + * 2. Find the terminal value also. + */ + value_expr = asn1f_find_terminal_value(arg, expr, &val_mod); + if(value_expr) { + DEBUG("\tTerminal value for %s->%s is %s at line %d", + expr->Identifier, asn1f_printable_value(expr->value), + value_expr->Identifier, value_expr->_lineno); + } else { + DEBUG("\tTerminal value for %s->%s not found", + expr->Identifier, asn1f_printable_value(expr->value)); + return -1; + } + + /* + * 3. Find the _type_ of a _terminal value_. + */ + WITH_MODULE(val_mod, + val_type_expr = asn1f_find_terminal_type(arg, value_expr, 0)); + if(val_type_expr) { + DEBUG("\tTerminal type of value %s->%s is %s at line %d", + expr->Identifier, asn1f_printable_value(expr->value), + val_type_expr->Identifier, val_type_expr->_lineno); + } else { + DEBUG("\tTerminal type of value %s->%s not found", + expr->Identifier, asn1f_printable_value(expr->value)); + return -1; + } + + /* + * 4. Check compatibility between the type of the current expression + * and the type of the discovered value. + */ + ret = asn1f_check_type_compatibility(arg, type_expr, val_type_expr); + if(ret == -1) { + DEBUG("\tIncompatible type of %s at %d with %s at %d", + type_expr->Identifier, type_expr->_lineno, + val_type_expr->Identifier, val_type_expr->_lineno); + return -1; + } + + if(asn1f_look_value_in_type(arg, val_type_expr, expr) == -1) + return -1; + + /* + * 5. Copy value from the terminal value into the current expression. + */ + ret = _asn1f_copy_value(arg, expr, value_expr); + if(ret == -1) { + DEBUG("\tValue %s cannot be copied from line %d to line %d", + asn1f_printable_value(value_expr->value), + value_expr->_lineno, expr->_lineno); + return -1; + } + + DEBUG("\tFinal value for \"%s\" at line %d is %s", + expr->Identifier, expr->_lineno, + asn1f_printable_value(expr->value)); + + return 0; +} + +static int +_asn1f_copy_value(arg_t *arg, asn1p_expr_t *to, asn1p_expr_t *from) { + asn1p_value_t *v; + + v = asn1p_value_clone(from->value); + if(v) { + asn1p_value_free(to->value); + to->value = v; + DEBUG("Copied value %s from \"%s\" on line %d " + "to \"%s\" on line %d", + asn1f_printable_value(v), + from->Identifier, + from->_lineno, + to->Identifier, + to->_lineno + ); + return 0; + } else { + return -1; + } +} + +int +asn1f_look_value_in_type(arg_t *arg, + asn1p_expr_t *type_expr, + asn1p_expr_t *value_expr) { + asn1p_expr_t *child_expr; + char *identifier; + + if(value_expr->value->type != ATV_REFERENCED + || value_expr->value->value.reference->comp_count != 1) + return 0; + if(type_expr->expr_type != ASN_BASIC_INTEGER + && type_expr->expr_type != ASN_BASIC_ENUMERATED) + return 0; + + DEBUG("%s(for %s in %s %x) for line %d", __func__, + asn1f_printable_value(value_expr->value), + type_expr->Identifier, + type_expr->expr_type, + value_expr->_lineno); + + /* + * Look into the definitions of the type itself: + * Type1 ::= INTEGER { a(1), b(2) } + * value Type1 = b -- will assign 2 + */ + identifier = value_expr->value->value.reference->components[0].name; + + child_expr = asn1f_lookup_child(type_expr, identifier); + DEBUG("\tLooking into a type %s at line %d for %s at line %d: %s", + type_expr->Identifier, type_expr->_lineno, + identifier, value_expr->_lineno, + child_expr + ? asn1f_printable_value(child_expr->value) + : "" + ); + + if(child_expr && child_expr->value) { + if(_asn1f_copy_value(arg, value_expr, child_expr)) + return -1; + /* Fall through */ + } + + return 0; +} diff --git a/libasn1fix/asn1fix_value.h b/libasn1fix/asn1fix_value.h new file mode 100644 index 000000000..7234035e5 --- /dev/null +++ b/libasn1fix/asn1fix_value.h @@ -0,0 +1,28 @@ +/* + * Functions related with processing values. + */ +#ifndef _ASN1FIX_VALUE_H_ +#define _ASN1FIX_VALUE_H_ + +/* + * Resolve the value given by reference. + * This function also takes a parameter which specifies the desired + * value's type. + * + * RETURN VALUES: + * 0: Value resolved successfully. + * -1/EPERM: Recursive looping detected. + * -1/EEXIST: Reference is not compatible with the desired type. + * -1/ESRCH: Cannot find the terminal reference. + */ +int asn1f_value_resolve(arg_t *arg, asn1p_expr_t *tc); + +/* + * Check if a value in value_expr refers to the enumeration or integer element + * within the type provided. If yes, it will replace referenced value with + * the appropriate inline value. + */ +int asn1f_look_value_in_type(arg_t *arg, + asn1p_expr_t *type_expr, asn1p_expr_t *value_expr); + +#endif /* _ASN1FIX_VALUE_H_ */ diff --git a/libasn1fix/check_fixer.c b/libasn1fix/check_fixer.c new file mode 100644 index 000000000..21c5b12f4 --- /dev/null +++ b/libasn1fix/check_fixer.c @@ -0,0 +1,313 @@ +#undef NDEBUG +#include +#include +#include +#include +#include +#include +#include +#include + +#include "asn1fix.h" +#include "asn1fix_internal.h" + +static int check(const char *fname, + enum asn1p_flags parser_flags, + enum asn1f_flags fixer_flags); +static int post_fix_check(asn1p_t *asn); +static int post_fix_check_element(asn1p_module_t *mod, asn1p_expr_t *expr); + +int +main(int ac, char **av) { + struct dirent *dp; + DIR *dir; + int failed = 0; + int completed = 0; + enum asn1p_flags parser_flags = A1P_NOFLAGS; + enum asn1f_flags fixer_flags = A1F_NOFLAGS; + int ret; + + /* + * Just in case when one decides that some flags better be + * enabled during `ASN1_FIXER_FLAGS=1 make check` or some + * similar usage. + */ + if(getenv("ASN1_PARSER_FLAGS")) + parser_flags = atoi(getenv("ASN1_PARSER_FLAGS")); + if(getenv("ASN1_FIXER_FLAGS")) + fixer_flags = atoi(getenv("ASN1_FIXER_FLAGS")); + + /* + * Go into a directory with tests. + */ + if(ac <= 1) { + fprintf(stderr, "Testing in ./tests...\n"); + ret = chdir("../tests"); + assert(ret == 0); + dir = opendir("."); + assert(dir); + } else { + dir = 0; + } + + /* + * Scan every *.asn1 file and try to parse and fix it. + */ + if(dir) { + while((dp = readdir(dir))) { + int len = strlen(dp->d_name); + if(len && strcmp(dp->d_name + len - 5, ".asn1") == 0) { + ret = check(dp->d_name, + parser_flags, fixer_flags); + if(ret) { + fprintf(stderr, + "FAILED: %s\n", + dp->d_name); + failed++; + } + completed++; + } + } + closedir(dir); + + fprintf(stderr, + "Tests COMPLETED: %d\n" + "Tests FAILED: %d\n" + , + completed, failed + ); + } else { + int i; + for(i = 1; i < ac; i++) { + ret = check(av[i], parser_flags, fixer_flags); + if(ret) { + fprintf(stderr, "FAILED: %s\n", av[i]); + failed++; + } + completed++; + } + } + + if(completed == 0) { + fprintf(stderr, "No tests defined?!\n"); + exit(EX_NOINPUT); + } + + if(failed) + exit(EX_DATAERR); + return 0; +} + +static int +check(const char *fname, + enum asn1p_flags parser_flags, + enum asn1f_flags fixer_flags) { + asn1p_t *asn; + int expected_parseable; /* Is it expected to be parseable? */ + int expected_fix_code; /* What code a fixer must return */ + int r_value = 0; + + /* + * Figure out how the processing should go by inferring + * expectations from the file name. + */ + if(strstr(fname, "-OK.")) { + expected_parseable = 1; + expected_fix_code = 0; + } else if(strstr(fname, "-NP.")) { + expected_parseable = 0; + expected_fix_code = 123; /* Does not matter */ + } else if(strstr(fname, "-SE.")) { + expected_parseable = 1; + expected_fix_code = -1; /* Semantically incorrect */ + } else if(strstr(fname, "-SW.")) { + expected_parseable = 1; + expected_fix_code = 1; /* Semantically suspicious */ + } else { + fprintf(stderr, "%s: Invalid file name format\n", fname); + return -1; + } + + fprintf(stderr, "[=> %s]\n", fname); + + /* + * Perform low-level parsing. + */ + if(!expected_parseable) + fprintf(stderr, "Expecting error...\n"); + asn = asn1p_parse_file(fname, parser_flags); + if(asn == NULL) { + if(expected_parseable) { + fprintf(stderr, "Cannot parse file \"%s\"\n", fname); + r_value = -1; + } else { + fprintf(stderr, + "Previous error is EXPECTED, no worry\n"); + } + } else if(!expected_parseable) { + fprintf(stderr, + "The file \"%s\" is not expected to be parseable, " + "yet parsing was successfull!\n", fname); + r_value = -1; + } + + /* + * Perform semantical checks and fixes. + */ + if(asn && r_value == 0) { + int ret; + + if(expected_fix_code) + fprintf(stderr, "Expecting some problems...\n"); + + ret = asn1f_process(asn, fixer_flags, 0); + if(ret) { + if(ret == expected_fix_code) { + fprintf(stderr, + "Previous error is EXPECTED, " + "no worry\n"); + } else { + fprintf(stderr, + "Cannot process file \"%s\": %d\n", + fname, ret); + r_value = -1; + } + } else if(ret != expected_fix_code) { + fprintf(stderr, + "File \"%s\" is expected " + "to be semantically incorrect, " + "yet processing was successful!\n", + fname); + r_value = -1; + } + } + + /* + * Check validity of some values, if grammar has special + * instructions for that. + */ + if(asn && r_value == 0) { + if(post_fix_check(asn)) + r_value = -1; + } + + /* + * TODO: destroy the asn. + */ + + return r_value; +} + + +static int +post_fix_check(asn1p_t *asn) { + asn1p_module_t *mod; + asn1p_expr_t *expr; + int r_value = 0; + + TQ_FOR(mod, &(asn->modules), mod_next) { + TQ_FOR(expr, &(mod->members), next) { + assert(expr->Identifier); + if(strncmp(expr->Identifier, "check-", 6) == 0) { + if(post_fix_check_element(mod, expr)) + r_value = -1; + } + } + } + + return r_value; +} + + +static int +post_fix_check_element(asn1p_module_t *mod, asn1p_expr_t *check_expr) { + asn1p_expr_t *expr = NULL; + char *name; + asn1p_value_t *value; + + if(check_expr->expr_type != ASN_BASIC_INTEGER + || check_expr->meta_type != AMT_VALUE) { + fprintf(stderr, + "CHECKER: Unsupported type of \"%s\" value: " + "%d at line %d of %s\n", + check_expr->Identifier, + check_expr->expr_type, + check_expr->_lineno, + mod->source_file_name + ); + return -1; + } + + assert(check_expr->meta_type == AMT_VALUE); + + value = check_expr->value; + if(value == NULL || value->type != ATV_INTEGER) { + fprintf(stderr, + "CHECKER: Unsupported value type of \"%s\": " + "%d at line %d of %s\n", + check_expr->Identifier, + value?value->type:-1, + expr->_lineno, + mod->source_file_name + ); + return -1; + } + + name = check_expr->Identifier + sizeof("check-") - 1; + + /* + * Scan in search for the original. + */ + TQ_FOR(expr, &(mod->members), next) { + if(strcmp(expr->Identifier, name) == 0) + break; + } + + if(expr == NULL) { + fprintf(stderr, + "CHECKER: Value \"%s\" requested by " + "\"check-%s\" at line %d of %s is not found!\n", + name, name, check_expr->_lineno, + mod->source_file_name + ); + return -1; + } + + if(0 && expr->expr_type != check_expr->expr_type) { + fprintf(stderr, + "CHECKER: Value type of \"%s\" (=%d) at line %d " + "does not have desired type %d as requested by " + "\"check-%s\" in %s\n", + expr->Identifier, + expr->expr_type, + expr->_lineno, + check_expr->expr_type, + name, + mod->source_file_name + ); + return -1; + } + + if(expr->value == NULL + || expr->value->type != value->type) { + fprintf(stderr, + "CHECKER: Value of \"%s\" (\"%s\", type=%d) at line %d " + "does not have desired type %d as requested by " + "\"check-%s\" in %s\n", + expr->Identifier, + asn1f_printable_value(expr->value), + expr->value->type, + expr->_lineno, + value->type, + name, + mod->source_file_name + ); + return -1; + } + + assert(value->type = ATV_INTEGER); + + return 0; +} + + diff --git a/libasn1parser/Makefile.am b/libasn1parser/Makefile.am new file mode 100644 index 000000000..0f9ff1611 --- /dev/null +++ b/libasn1parser/Makefile.am @@ -0,0 +1,35 @@ + +AM_CFLAGS = @ADD_CFLAGS@ +AM_YFLAGS = -p asn1p_ -d +AM_LFLAGS = -sp -Cem -Pasn1p_ -olex.yy.c + +noinst_LTLIBRARIES = libasn1parser.la + +libasn1parser_la_LDFLAGS = -all-static +libasn1parser_la_SOURCES = \ + asn1parser.c asn1parser.h \ + asn1p_y.y asn1p_l.l \ + asn1p_module.c asn1p_module.h \ + asn1p_oid.c asn1p_oid.h \ + asn1p_value.c asn1p_value.h \ + asn1p_expr.c asn1p_expr.h \ + asn1p_expr_str.h \ + asn1p_expr2uclass.h \ + asn1p_xports.c asn1p_xports.h \ + asn1p_constr.c asn1p_constr.h \ + asn1p_param.c asn1p_param.h \ + asn1p_class.c asn1p_class.h \ + asn1p_ref.c asn1p_ref.h \ + asn1p_list.h + +asn1p_expr_str.h: expr-h.pl asn1p_expr.h + ./expr-h.pl asn1p_expr.h > $@ + +EXTRA_DIST = expr-h.pl + +check_PROGRAMS = check_parser + +LDADD = ${noinst_LTLIBRARIES} +DEPENDENCIES = ${noinst_LTLIBRARIES} + +TESTS = ${check_PROGRAMS} diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in new file mode 100644 index 000000000..7c4bd5f88 --- /dev/null +++ b/libasn1parser/Makefile.in @@ -0,0 +1,459 @@ +# Makefile.in generated automatically by automake 1.5 from Makefile.am. + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_alias = @build_alias@ +build_triplet = @build@ +host_alias = @host_alias@ +host_triplet = @host@ +target_alias = @target_alias@ +target_triplet = @target@ +ADD_CFLAGS = @ADD_CFLAGS@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +AWK = @AWK@ +CC = @CC@ +CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPP = @CPP@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +EXEEXT = @EXEEXT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LEX = @LEX@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +MAINT = @MAINT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PATH = @PATH@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ +YACC = @YACC@ +am__include = @am__include@ +am__quote = @am__quote@ +install_sh = @install_sh@ + +AM_CFLAGS = @ADD_CFLAGS@ +AM_YFLAGS = -p asn1p_ -d +AM_LFLAGS = -sp -Cem -Pasn1p_ -olex.yy.c + +noinst_LTLIBRARIES = libasn1parser.la + +libasn1parser_la_LDFLAGS = -all-static +libasn1parser_la_SOURCES = \ + asn1parser.c asn1parser.h \ + asn1p_y.y asn1p_l.l \ + asn1p_module.c asn1p_module.h \ + asn1p_oid.c asn1p_oid.h \ + asn1p_value.c asn1p_value.h \ + asn1p_expr.c asn1p_expr.h \ + asn1p_expr_str.h \ + asn1p_expr2uclass.h \ + asn1p_xports.c asn1p_xports.h \ + asn1p_constr.c asn1p_constr.h \ + asn1p_param.c asn1p_param.h \ + asn1p_class.c asn1p_class.h \ + asn1p_ref.c asn1p_ref.h \ + asn1p_list.h + + +EXTRA_DIST = expr-h.pl + +check_PROGRAMS = check_parser + +LDADD = ${noinst_LTLIBRARIES} +DEPENDENCIES = ${noinst_LTLIBRARIES} + +TESTS = ${check_PROGRAMS} +subdir = libasn1parser +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) + +libasn1parser_la_LIBADD = +am_libasn1parser_la_OBJECTS = asn1parser.lo asn1p_y.lo asn1p_l.lo \ + asn1p_module.lo asn1p_oid.lo asn1p_value.lo asn1p_expr.lo \ + asn1p_xports.lo asn1p_constr.lo asn1p_param.lo asn1p_class.lo \ + asn1p_ref.lo +libasn1parser_la_OBJECTS = $(am_libasn1parser_la_OBJECTS) +check_PROGRAMS = check_parser$(EXEEXT) +check_parser_SOURCES = check_parser.c +check_parser_OBJECTS = check_parser.$(OBJEXT) +check_parser_LDADD = $(LDADD) +check_parser_DEPENDENCIES = libasn1parser.la +check_parser_LDFLAGS = + +DEFS = @DEFS@ +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/asn1p_class.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1p_constr.Plo $(DEPDIR)/asn1p_expr.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1p_l.Plo $(DEPDIR)/asn1p_module.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1p_oid.Plo $(DEPDIR)/asn1p_param.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1p_ref.Plo $(DEPDIR)/asn1p_value.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1p_xports.Plo $(DEPDIR)/asn1p_y.Plo \ +@AMDEP_TRUE@ $(DEPDIR)/asn1parser.Plo $(DEPDIR)/check_parser.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ + $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +CFLAGS = @CFLAGS@ +LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) +LTLEXCOMPILE = $(LIBTOOL) --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) +YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) +LTYACCCOMPILE = $(LIBTOOL) --mode=compile $(YACC) $(YFLAGS) $(AM_YFLAGS) +DIST_SOURCES = $(libasn1parser_la_SOURCES) check_parser.c +DIST_COMMON = Makefile.am Makefile.in asn1p_l.c asn1p_y.c asn1p_y.h +SOURCES = $(libasn1parser_la_SOURCES) check_parser.c + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .l .lo .o .obj .y + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu libasn1parser/Makefile +Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && \ + CONFIG_HEADERS= CONFIG_LINKS= \ + CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) +asn1p_y.h: asn1p_y.c +libasn1parser.la: $(libasn1parser_la_OBJECTS) $(libasn1parser_la_DEPENDENCIES) + $(LINK) $(libasn1parser_la_LDFLAGS) $(libasn1parser_la_OBJECTS) $(libasn1parser_la_LIBADD) $(LIBS) + +clean-checkPROGRAMS: + -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) +check_parser$(EXEEXT): $(check_parser_OBJECTS) $(check_parser_DEPENDENCIES) + @rm -f check_parser$(EXEEXT) + $(LINK) $(check_parser_LDFLAGS) $(check_parser_OBJECTS) $(check_parser_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) core *.core + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1p_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1p_constr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1p_expr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1p_l.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1p_module.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1p_oid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1p_param.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1p_ref.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1p_value.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1p_xports.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1p_y.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1parser.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/check_parser.Po@am__quote@ + +distclean-depend: + -rm -rf $(DEPDIR) + +.c.o: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< + +.c.obj: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `cygpath -w $<` + +.c.lo: +@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< +CCDEPMODE = @CCDEPMODE@ + +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LEXLIB = @LEXLIB@ + +.l.c: + $(LEXCOMPILE) $< && mv $(LEX_OUTPUT_ROOT).c $@ + +.y.c: + $(YACCCOMPILE) $< && mv y.tab.c $@ + if test -f y.tab.h; then \ + if cmp -s y.tab.h $*.h; then \ + rm -f y.tab.h; \ + else \ + mv y.tab.h $*.h; \ + fi; \ + fi +uninstall-info-am: + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique $(LISP) + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) + +GTAGS: + here=`CDPATH=: && cd $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; \ + srcdir=$(srcdir); export srcdir; \ + list='$(TESTS)'; \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *" $$tst "*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ + ;; \ + *) \ + echo "PASS: $$tst"; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *" $$tst "*) \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ + ;; \ + esac; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all tests failed"; \ + else \ + banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ + fi; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0; \ + fi + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + $(mkinstalldirs) "$(distdir)/$$dir"; \ + fi; \ + if test -d $$d/$$file; then \ + cp -pR $$d/$$file $(distdir) \ + || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile $(LTLIBRARIES) + +installdirs: + +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "asn1p_y.h" || rm -f asn1p_y.h +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + +distclean-am: clean-am distclean-compile distclean-depend \ + distclean-generic distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +uninstall-am: uninstall-info-am + +.PHONY: GTAGS all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool \ + clean-noinstLTLIBRARIES distclean distclean-compile \ + distclean-depend distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + tags uninstall uninstall-am uninstall-info-am + + +asn1p_expr_str.h: expr-h.pl asn1p_expr.h + ./expr-h.pl asn1p_expr.h > $@ +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libasn1parser/asn1p_class.c b/libasn1parser/asn1p_class.c new file mode 100644 index 000000000..cd0e385a9 --- /dev/null +++ b/libasn1parser/asn1p_class.c @@ -0,0 +1,135 @@ +#include +#include +#include +#include +#include + +#include "asn1parser.h" + +asn1p_wsyntx_chunk_t * +asn1p_wsyntx_chunk_new() { + asn1p_wsyntx_chunk_t *wc; + + wc = calloc(1, sizeof(*wc)); + + return wc; +} + +void +asn1p_wsyntx_chunk_free(asn1p_wsyntx_chunk_t *wc) { + if(wc) { + if(wc->ref) + asn1p_ref_free(wc->ref); + if(wc->buf) + free(wc->buf); + free(wc); + } +} + +asn1p_wsyntx_chunk_t * +asn1p_wsyntx_chunk_clone(asn1p_wsyntx_chunk_t *wc) { + asn1p_wsyntx_chunk_t *nc; + + nc = asn1p_wsyntx_chunk_new(); + if(nc) { + if(wc->buf) { + nc->buf = malloc(wc->len + 1); + if(nc->buf) { + nc->len = wc->len; + memcpy(nc->buf, wc->buf, wc->len); + nc->buf[nc->len] = '\0'; + } + } + if(wc->ref) { + nc->ref = asn1p_ref_clone(wc->ref); + } + + if(!nc->ref && !nc->buf) { + asn1p_wsyntx_chunk_free(nc); + return NULL; + } + } + + return nc; +} + +asn1p_wsyntx_t * +asn1p_wsyntx_new() { + asn1p_wsyntx_t *wx; + + wx = calloc(1, sizeof(*wx)); + if(wx) { + TQ_INIT(&(wx->chunks)); + } + + return wx; +} + +void +asn1p_wsyntx_free(asn1p_wsyntx_t *wx) { + if(wx) { + asn1p_wsyntx_chunk_t *wc; + while((wc = TQ_REMOVE(&(wx->chunks), next))) + asn1p_wsyntx_chunk_free(wc); + free(wx); + } +} + +asn1p_wsyntx_t * +asn1p_wsyntx_clone(asn1p_wsyntx_t *wx) { + asn1p_wsyntx_t *nw; + + nw = asn1p_wsyntx_new(); + if(nw) { + asn1p_wsyntx_chunk_t *wc; + asn1p_wsyntx_chunk_t *nc; + TQ_FOR(wc, &(wx->chunks), next) { + nc = asn1p_wsyntx_chunk_clone(wc); + if(nc) { + TQ_ADD(&(nw->chunks), nc, next); + } else { + asn1p_wsyntx_free(nw); + return NULL; + } + } + } + + return nw; +} + +asn1p_wsyntx_chunk_t * +asn1p_wsyntx_chunk_fromref(asn1p_ref_t *ref, int do_copy) { + asn1p_wsyntx_chunk_t *wc; + + if(do_copy) { + static asn1p_wsyntx_chunk_t tmp; + tmp.ref = ref; + wc = asn1p_wsyntx_chunk_clone(&tmp); + } else { + wc = asn1p_wsyntx_chunk_new(); + if(wc) wc->ref = ref; + } + + return wc; +} + +asn1p_wsyntx_chunk_t * +asn1p_wsyntx_chunk_frombuf(char *buf, int len, int do_copy) { + asn1p_wsyntx_chunk_t *wc; + + if(do_copy) { + static asn1p_wsyntx_chunk_t tmp; + tmp.buf = buf; + tmp.len = len; + wc = asn1p_wsyntx_chunk_clone(&tmp); + } else { + wc = asn1p_wsyntx_chunk_new(); + if(wc) { + wc->buf = buf; + wc->len = len; + } + } + + return wc; +} + diff --git a/libasn1parser/asn1p_class.h b/libasn1parser/asn1p_class.h new file mode 100644 index 000000000..4a0f19e19 --- /dev/null +++ b/libasn1parser/asn1p_class.h @@ -0,0 +1,53 @@ +/* + * CLASS-related stuff. + */ +#ifndef ASN1_PARSER_CLASS_H +#define ASN1_PARSER_CLASS_H + +#include + +/* + * WITH SYNTAX free-form chunks. + */ +typedef struct asn1p_wsyntx_chunk_s { + /* + * It could be the union, but the story is: + * if ref is here, the ref is used. + * Otherwise, buf/len is used. + */ + asn1p_ref_t *ref; + + char *buf; + int len; + + TQ_ENTRY(struct asn1p_wsyntx_chunk_s) next; +} asn1p_wsyntx_chunk_t; + +typedef struct asn1p_wsyntx_s { + + TQ_HEAD(struct asn1p_wsyntx_chunk_s) chunks; + +} asn1p_wsyntx_t; + + +/* + * Constructor, destructor and cloning function. + */ +asn1p_wsyntx_chunk_t *asn1p_wsyntx_chunk_new(void); +void asn1p_wsyntx_chunk_free(asn1p_wsyntx_chunk_t *); +asn1p_wsyntx_chunk_t *asn1p_wsyntx_chunk_clone(asn1p_wsyntx_chunk_t *); + +asn1p_wsyntx_t *asn1p_wsyntx_new(void); +void asn1p_wsyntx_free(asn1p_wsyntx_t *); +asn1p_wsyntx_t *asn1p_wsyntx_clone(asn1p_wsyntx_t *); + +/* + * RETURN VALUES: + * 0: Component has been added + * -1: Failure to add component (refer to errno) + */ +asn1p_wsyntx_chunk_t *asn1p_wsyntx_chunk_fromref(asn1p_ref_t *ref, int do_copy); +asn1p_wsyntx_chunk_t *asn1p_wsyntx_chunk_frombuf(char *buf, int len, int do_copy); + + +#endif /* ASN1_PARSER_CLASS_H */ diff --git a/libasn1parser/asn1p_constr.c b/libasn1parser/asn1p_constr.c new file mode 100644 index 000000000..6e1988921 --- /dev/null +++ b/libasn1parser/asn1p_constr.c @@ -0,0 +1,91 @@ +#include +#include +#include +#include + +#include "asn1parser.h" + +asn1p_constraint_t * +asn1p_constraint_new(int _lineno) { + asn1p_constraint_t *ct; + + ct = calloc(1, sizeof(*ct)); + if(ct) { + ct->_lineno = _lineno; + } + + return ct; +} + + +void +asn1p_constraint_free(asn1p_constraint_t *ct) { + if(ct) { + + if(ct->value) + asn1p_value_free(ct->value); + if(ct->range_start) + asn1p_value_free(ct->range_start); + if(ct->range_stop) + asn1p_value_free(ct->range_stop); + + if(ct->elements) { + while(ct->el_count--) { + asn1p_constraint_free( + ct->elements[ct->el_count]); + } + free(ct->elements); + } + + free(ct); + } +} + +asn1p_constraint_t * +asn1p_constraint_clone(asn1p_constraint_t *src) { + asn1p_constraint_t *clone; + +#define CLONE(field, func) do { if(src->field) { \ + clone->field = func(src->field); \ + if(clone->field == NULL) { \ + asn1p_constraint_free(clone); \ + return NULL; \ + } \ + } } while(0) + + clone = asn1p_constraint_new(src->_lineno); + if(clone) { + clone->type = src->type; + CLONE(value, asn1p_value_clone); + CLONE(range_start, asn1p_value_clone); + CLONE(range_stop, asn1p_value_clone); + } + + return clone; +} + +int +asn1p_constraint_insert(asn1p_constraint_t *into, asn1p_constraint_t *what) { + assert(into); + assert(what); + + /* + * Make sure there's enough space to add an element. + */ + if(into->el_count == into->el_size) { + int newsize = into->el_size?into->el_size<<2:4; + void *p; + p = realloc(into->elements, + newsize * sizeof(into->elements[0])); + if(p) { + into->elements = p; + into->el_size = newsize; + } else { + return -1; + } + } + + into->elements[into->el_count++] = what; + + return 0; +} diff --git a/libasn1parser/asn1p_constr.h b/libasn1parser/asn1p_constr.h new file mode 100644 index 000000000..19099b2fe --- /dev/null +++ b/libasn1parser/asn1p_constr.h @@ -0,0 +1,79 @@ +/* + * Type constraints. + */ +#ifndef ASN1_PARSER_CONSTRAINT_H +#define ASN1_PARSER_CONSTRAINT_H + +typedef struct asn1p_constraint_s { + + enum asn1p_constraint_type_e { + ACT_INVALID, /* for assertions */ + /* + * Constraint elements. + */ + ACT_EL_VALUE, /* 123, "A", T (elementary value) */ + ACT_EL_RANGE, /* 1..2 (elementary range) */ + ACT_EL_LLRANGE, /* 1<..2 (elementary range) */ + ACT_EL_RLRANGE, /* 1..<2 (elementary range) */ + ACT_EL_ULRANGE, /* 1<..<2 (elementary range) */ + ACT_EL_EXT, /* ... (extensibility mark) */ + /* + * Constraint types. + */ + ACT_CT_SIZE, /* SIZE constraint type */ + ACT_CT_FROM, /* FROM constraint type */ + ACT_CT_WCOMP, /* WITH COMPONENT */ + ACT_CT_WCOMPS, /* WITH COMPONENTS */ + /* + * Arrays of constraints. + */ + ACT_CA_SET, /* A set of constraints: (c1)(c2) */ + ACT_CA_CRC, /* Comp. relation c-t: ({a})({@b}) */ + ACT_CA_CSV, /* Comma-separated constraints array */ + ACT_CA_UNI, /* UNION (|) */ + ACT_CA_INT, /* INTERSECTION (^) */ + ACT_CA_EXC, /* EXCEPT */ + } type; + + enum asn1p_constr_pres_e { + ACPRES_DEFAULT, + ACPRES_PRESENT, + ACPRES_ABSENT, + ACPRES_OPTIONAL, + } presence; + + /* + * A single values. + */ + asn1p_value_t *value; + asn1p_value_t *range_start; + asn1p_value_t *range_stop; + + /* + * A collection of constraint elements. + */ + struct asn1p_constraint_s **elements; + int el_count; /* Number of meaningful elements */ + int el_size; /* Size of the allocated (elements) */ + + int _lineno; /* Position in a source file */ +} asn1p_constraint_t; + + +/* + * Constructors and a recursive destructor. + */ +asn1p_constraint_t *asn1p_constraint_new(int _lineno); +void asn1p_constraint_free(asn1p_constraint_t *); + +/* + * Clone the constraint and all its children. + */ +asn1p_constraint_t *asn1p_constraint_clone(asn1p_constraint_t *source_to_clone); + +/* + * Insert additional element into the element array of a (to) constraint. + */ +int asn1p_constraint_insert(asn1p_constraint_t *into, asn1p_constraint_t *what); + +#endif /* ASN1_PARSER_CONSTRAINT_H */ diff --git a/libasn1parser/asn1p_expr.c b/libasn1parser/asn1p_expr.c new file mode 100644 index 000000000..23ab4cb36 --- /dev/null +++ b/libasn1parser/asn1p_expr.c @@ -0,0 +1,112 @@ +#include +#include +#include +#include +#include + +#include "asn1parser.h" + +/* + * Construct a new empty types collection. + */ +asn1p_expr_t * +asn1p_expr_new(int _lineno) { + asn1p_expr_t *expr; + + expr = calloc(1, sizeof *expr); + if(expr) { + TQ_INIT(&(expr->members)); + expr->_lineno = _lineno; + } + + return expr; +} + +asn1p_expr_t * +asn1p_expr_clone(asn1p_expr_t *expr) { + asn1p_expr_t *clone; + asn1p_expr_t *tcmemb; /* Child of tc */ + + clone = asn1p_expr_new(expr->_lineno); + if(clone == NULL) return NULL; + +#define CLCOPY(field) do { clone->field = expr->field; } while(0) +#define CLCLONE(field, func) do { if(expr->field) { \ + clone->field = func(expr->field); \ + if(clone->field == NULL) { \ + asn1p_expr_free(clone); \ + return NULL; \ + } \ + } } while(0) + + /* + * Copy simple fields. + */ + CLCOPY(meta_type); + CLCOPY(expr_type); + CLCOPY(tag); + CLCOPY(marker); + CLCOPY(_mark); + + clone->data = 0; /* Do not clone this */ + clone->data_free = 0; /* Do not clone this */ + + /* + * Clone complex fields. + */ + CLCLONE(Identifier, strdup); + CLCLONE(reference, asn1p_ref_clone); + CLCLONE(constraints, asn1p_constraint_clone); + CLCLONE(params, asn1p_paramlist_clone); + CLCLONE(value, asn1p_value_clone); + CLCLONE(with_syntax, asn1p_wsyntx_clone); + + /* + * Copy all the children of this expr. + */ + TQ_FOR(tcmemb, &(expr->members), next) { + asn1p_expr_t *cmemb = asn1p_expr_clone(tcmemb); + if(cmemb == NULL) { + asn1p_expr_free(clone); + return NULL; + } + TQ_ADD(&(clone->members), cmemb, next); + } + + return clone; +} + +/* + * Destruct the types collection structure. + */ +void +asn1p_expr_free(asn1p_expr_t *expr) { + if(expr) { + asn1p_expr_t *tm; + + if(expr->Identifier) + free(expr->Identifier); + if(expr->reference) + asn1p_ref_free(expr->reference); + if(expr->constraints) + asn1p_constraint_free(expr->constraints); + if(expr->params) + asn1p_paramlist_free(expr->params); + if(expr->value) + asn1p_value_free(expr->value); + if(expr->with_syntax) + asn1p_wsyntx_free(expr->with_syntax); + + /* Remove all children */ + while((tm = TQ_REMOVE(&(expr->members), next))) { + asn1p_expr_free(tm); + } + + if(expr->data && expr->data_free) + expr->data_free(expr->data); + + memset(expr, 0, sizeof(*expr)); + free(expr); + } +} + diff --git a/libasn1parser/asn1p_expr.h b/libasn1parser/asn1p_expr.h new file mode 100644 index 000000000..331285c71 --- /dev/null +++ b/libasn1parser/asn1p_expr.h @@ -0,0 +1,214 @@ +/* + * A collection of data members of unspecified types. + */ +#ifndef ASN1_PARSER_EXPR_H +#define ASN1_PARSER_EXPR_H + +/* + * Meta type of the ASN expression. + */ +typedef enum asn1p_expr_meta { + AMT_INVALID, + AMT_TYPE, /* Type1 ::= INTEGER */ + AMT_TYPEREF, /* Type2 ::= Type1 */ + AMT_PARAMTYPE, /* Type3{Parameter} ::= SET { ... } */ + AMT_VALUE, /* value1 Type1 ::= 1 */ + AMT_VALUESET, /* ValueSet Type1 ::= { value1 } */ + AMT_OBJECT, /* FUNCTION ::= CLASS {...} */ + AMT_OBJECTSET, /* Functions FUNCTION ::= {...} */ + AMT_OBJECTFIELD, /* ... */ + AMT_EXPR_META_MAX +} asn1p_expr_meta_e; + +/* + * ASN type of the expression. + */ +typedef enum asn1p_expr_type { + /* + * Internal types. + */ + A1TC_INVALID, /* Invalid type */ + A1TC_REFERENCE, /* Reference to the type defined elsewhere */ + A1TC_EXPORTVAR, /* We're exporting this definition */ + A1TC_UNIVERVAL, /* A value of an ENUMERATED, INTEGER or BS */ + A1TC_BOOLBITPOS, /* A bit position in a BIT STRING */ + A1TC_BITVECTOR, /* A plain collection of bits */ + A1TC_OPAQUE, /* Opaque data encoded as a bitvector */ + A1TC_EXTENSIBLE, /* An extension marker "..." */ + A1TC_PARAMETRIZED, /* A parametrized type declaration */ + A1TC_VALUESET, /* Value set definition */ + A1TC_CLASSDEF, /* Information Object Class */ + A1TC_CLASSFIELD, /* Information Object Class field */ + A1TC_INSTANCE, /* Instance of Object Class */ + A1TC_TYPEID, /* Type identifier */ + /* + * ASN.1 Constructed types + */ +#define ASN_CONSTR_MASK 0x10 /* Every constructed type */ + ASN_CONSTR_SEQUENCE = ASN_CONSTR_MASK, /* SEQUENCE */ + ASN_CONSTR_CHOICE, /* CHOICE */ + ASN_CONSTR_SET, /* SET */ + ASN_CONSTR_SEQUENCE_OF, /* SEQUENCE OF */ + ASN_CONSTR_SET_OF, /* SET OF */ + ASN_CONSTR_ANY, /* ANY (deprecated) */ + /* + * ASN.1 Basic types + */ +#define ASN_BASIC_MASK 0x20 /* Every basic type */ + ASN_BASIC_BOOLEAN = ASN_BASIC_MASK, + ASN_BASIC_NULL, + ASN_BASIC_INTEGER, + ASN_BASIC_REAL, + ASN_BASIC_ENUMERATED, + ASN_BASIC_BIT_STRING, + ASN_BASIC_OCTET_STRING, + ASN_BASIC_OBJECT_IDENTIFIER, + ASN_BASIC_RELATIVE_OID, + ASN_BASIC_EXTERNAL, + ASN_BASIC_EMBEDDED_PDV, + ASN_BASIC_CHARACTER_STRING, + ASN_BASIC_UTCTime, + ASN_BASIC_GeneralizedTime, + /* + * ASN.1 String types + */ +#define ASN_STRING_MASK 0x40 /* Every string type */ + ASN_STRING_BMPString = ASN_STRING_MASK, + ASN_STRING_GeneralString, + ASN_STRING_GraphicString, + ASN_STRING_IA5String, + ASN_STRING_ISO646String, + ASN_STRING_NumericString, + ASN_STRING_PrintableString, + ASN_STRING_TeletexString, + ASN_STRING_T61String, + ASN_STRING_UniversalString, + ASN_STRING_UTF8String, + ASN_STRING_VideotexString, + ASN_STRING_VisibleString, + ASN_STRING_ObjectDescriptor, + ASN_EXPR_TYPE_MAX +} asn1p_expr_type_e; + +#include "asn1p_expr_str.h" +#include "asn1p_expr2uclass.h" + +/* + * A named collection of types. + */ +typedef struct asn1p_expr_s { + + /* + * Human readable name. + */ + char *Identifier; + + /* + * Meta type of the expression (type, value, value set, etc). + */ + asn1p_expr_meta_e meta_type; + + /* + * ASN type of the expression. + */ + asn1p_expr_type_e expr_type; + + /* + * Referenced type, if defined elsewhere. + * (If expr_type == A1TC_REFERENCE) + */ + asn1p_ref_t *reference; + + /* + * Constraints for the type. + */ + asn1p_constraint_t *constraints; + + /* + * A list of parameters for parametrized type declaration + * (AMT_PARAMTYPE). + */ + asn1p_paramlist_t *params; + + /* + * The actual value (DefinedValue or inlined value). + */ + asn1p_value_t *value; + + /* + * The WITH SYHTAX clause. + */ + asn1p_wsyntx_t *with_syntax; + + /* + * A tag. + */ + struct asn1p_type_tag_s { + enum { + TC_NOCLASS, + TC_UNIVERSAL, + TC_APPLICATION, + TC_CONTEXT_SPECIFIC, + TC_PRIVATE, + } tag_class; + enum { + TM_DEFAULT, + TM_IMPLICIT, + TM_EXPLICIT, + } tag_mode; + asn1_integer_t tag_value; + } tag; + + /* + * Whether automatic tagging is applicable for subtypes. + */ + int auto_tags_OK; + + enum asn1p_expr_marker_e { + EM_NOMARK, + EM_OPTIONAL, + EM_DEFAULT, /* FIXME: store the value somewhere. */ + } marker; + int unique; /* UNIQUE */ + + /* + * Members of the constructed type. + */ + TQ_HEAD(struct asn1p_expr_s) members; + + /* + * Next expression in the list. + */ + TQ_ENTRY(struct asn1p_expr_s) next; + + /* + * Line number where this structure is defined in the original + * grammar source. + */ + int _lineno; + /* + * Marks are used for various purposes. + * Here are some predefined ones. + */ + enum { + TM_NOMARK, + TM_RECURSION, /* Used to break recursion */ + } _mark; + + /* + * Opaque data may be attached to this structure, + * probably by compiler. + */ + void *data; + void (*data_free)(void *data); +} asn1p_expr_t; + + +/* + * Constructor and destructor. + */ +asn1p_expr_t *asn1p_expr_new(int _lineno); +asn1p_expr_t *asn1p_expr_clone(asn1p_expr_t *); +void asn1p_expr_free(asn1p_expr_t *expr); + +#endif /* ASN1_PARSER_EXPR_H */ diff --git a/libasn1parser/asn1p_expr2uclass.h b/libasn1parser/asn1p_expr2uclass.h new file mode 100644 index 000000000..416c9f72e --- /dev/null +++ b/libasn1parser/asn1p_expr2uclass.h @@ -0,0 +1,41 @@ +#ifndef ASN1_PARSER_EXPR2UCLASS_H +#define ASN1_PARSER_EXPR2UCLASS_H + +static int +expr_type2uclass_value[ASN_EXPR_TYPE_MAX] + __attribute__ ((unused)) = { + [ ASN_BASIC_BOOLEAN ] = 1, + [ ASN_BASIC_INTEGER ] = 2, + [ ASN_BASIC_BIT_STRING ] = 3, + [ ASN_BASIC_OCTET_STRING ] = 4, + [ ASN_BASIC_NULL ] = 5, + [ ASN_BASIC_OBJECT_IDENTIFIER ] = 6, + [ ASN_BASIC_EXTERNAL ] = 7, + [ ASN_STRING_ObjectDescriptor ] = 7, + [ ASN_BASIC_REAL ] = 9, + [ ASN_BASIC_ENUMERATED ] = 10, + [ ASN_BASIC_EMBEDDED_PDV ] = 11, + [ ASN_STRING_UTF8String ] = 12, + [ ASN_BASIC_RELATIVE_OID ] = 13, + [ ASN_CONSTR_SEQUENCE ] = 16, + [ ASN_CONSTR_SEQUENCE_OF ] = 16, + [ ASN_CONSTR_SET ] = 17, + [ ASN_CONSTR_SET_OF ] = 17, + [ ASN_STRING_NumericString ] = 18, + [ ASN_STRING_PrintableString ] = 19, + [ ASN_STRING_TeletexString ] = 20, + [ ASN_STRING_T61String ] = 20, + [ ASN_STRING_VideotexString ] = 21, + [ ASN_STRING_IA5String ] = 22, + [ ASN_BASIC_UTCTime ] = 23, + [ ASN_BASIC_GeneralizedTime ] = 24, + [ ASN_STRING_GraphicString ] = 25, + [ ASN_STRING_VisibleString ] = 26, + [ ASN_STRING_ISO646String ] = 26, + [ ASN_STRING_GeneralString ] = 27, + [ ASN_STRING_UniversalString ] = 28, + [ ASN_BASIC_CHARACTER_STRING ] = 29, + [ ASN_STRING_BMPString ] = 30, +}; + +#endif /* ASN1_PARSER_EXPR2UCLASS_H */ diff --git a/libasn1parser/asn1p_expr_str.h b/libasn1parser/asn1p_expr_str.h new file mode 100644 index 000000000..02de131bd --- /dev/null +++ b/libasn1parser/asn1p_expr_str.h @@ -0,0 +1,57 @@ +/* + * This file is automatically generated by ./expr-h.pl + * DO NOT EDIT MANUALLY, fix the ./expr-h.pl instead if necessary. + */ +#ifndef ASN1_PARSER_EXPR_STR_H +#define ASN1_PARSER_EXPR_STR_H + +static char *asn1p_expr_type2str[] __attribute__ ((unused)) = { + [ ASN_CONSTR_SEQUENCE ] = "SEQUENCE", + [ ASN_CONSTR_CHOICE ] = "CHOICE", + [ ASN_CONSTR_SET ] = "SET", + [ ASN_CONSTR_SEQUENCE_OF ] = "SEQUENCE OF", + [ ASN_CONSTR_SET_OF ] = "SET OF", + [ ASN_CONSTR_ANY ] = "ANY", + [ ASN_BASIC_BOOLEAN ] = "BOOLEAN", + [ ASN_BASIC_NULL ] = "NULL", + [ ASN_BASIC_INTEGER ] = "INTEGER", + [ ASN_BASIC_REAL ] = "REAL", + [ ASN_BASIC_ENUMERATED ] = "ENUMERATED", + [ ASN_BASIC_BIT_STRING ] = "BIT STRING", + [ ASN_BASIC_OCTET_STRING ] = "OCTET STRING", + [ ASN_BASIC_OBJECT_IDENTIFIER ] = "OBJECT IDENTIFIER", + [ ASN_BASIC_RELATIVE_OID ] = "RELATIVE-OID", + [ ASN_BASIC_EXTERNAL ] = "EXTERNAL", + [ ASN_BASIC_EMBEDDED_PDV ] = "EMBEDDED PDV", + [ ASN_BASIC_CHARACTER_STRING ] = "CHARACTER STRING", + [ ASN_BASIC_UTCTime ] = "UTCTime", + [ ASN_BASIC_GeneralizedTime ] = "GeneralizedTime", + [ ASN_STRING_BMPString ] = "BMPString", + [ ASN_STRING_GeneralString ] = "GeneralString", + [ ASN_STRING_GraphicString ] = "GraphicString", + [ ASN_STRING_IA5String ] = "IA5String", + [ ASN_STRING_ISO646String ] = "ISO646String", + [ ASN_STRING_NumericString ] = "NumericString", + [ ASN_STRING_PrintableString ] = "PrintableString", + [ ASN_STRING_TeletexString ] = "TeletexString", + [ ASN_STRING_T61String ] = "T61String", + [ ASN_STRING_UniversalString ] = "UniversalString", + [ ASN_STRING_UTF8String ] = "UTF8String", + [ ASN_STRING_VideotexString ] = "VideotexString", + [ ASN_STRING_VisibleString ] = "VisibleString", + [ ASN_STRING_ObjectDescriptor ] = "ObjectDescriptor", +}; + +/* + * Convert the ASN.1 expression type back into the string representation. + */ +#define ASN_EXPR_TYPE2STR(type) \ + ( \ + ((type) < 0 \ + || (type) >= sizeof(asn1p_expr_type2str) \ + / sizeof(asn1p_expr_type2str[0])) \ + ? (char *)0 \ + : asn1p_expr_type2str[(type)] \ + ) + +#endif /* ASN1_PARSER_EXPR_STR_H */ diff --git a/libasn1parser/asn1p_l.c b/libasn1parser/asn1p_l.c new file mode 100644 index 000000000..6a6eb4468 --- /dev/null +++ b/libasn1parser/asn1p_l.c @@ -0,0 +1,3861 @@ +#define yy_create_buffer asn1p__create_buffer +#define yy_delete_buffer asn1p__delete_buffer +#define yy_scan_buffer asn1p__scan_buffer +#define yy_scan_string asn1p__scan_string +#define yy_scan_bytes asn1p__scan_bytes +#define yy_flex_debug asn1p__flex_debug +#define yy_init_buffer asn1p__init_buffer +#define yy_flush_buffer asn1p__flush_buffer +#define yy_load_buffer_state asn1p__load_buffer_state +#define yy_switch_to_buffer asn1p__switch_to_buffer +#define yyin asn1p_in +#define yyleng asn1p_leng +#define yylex asn1p_lex +#define yyout asn1p_out +#define yyrestart asn1p_restart +#define yytext asn1p_text +#define yylineno asn1p_lineno + +#line 20 "lex.yy.c" +/* A lexical scanner generated by flex */ + +/* Scanner skeleton version: + * $Header$ + */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 + +#include + + +/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ +#ifdef c_plusplus +#ifndef __cplusplus +#define __cplusplus +#endif +#endif + + +#ifdef __cplusplus + +#include +#include + +/* Use prototypes in function declarations. */ +#define YY_USE_PROTOS + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_PROTOS +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use +#include +#include +#define YY_USE_CONST +#define YY_USE_PROTOS +#endif + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + + +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#define YY_BUF_SIZE 16384 + +typedef struct yy_buffer_state *YY_BUFFER_STATE; + +extern int yyleng; +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + +/* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + +/* Return all but the first 'n' matched characters back to the input stream. */ + +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + *yy_cp = yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yytext_ptr ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ +typedef unsigned int yy_size_t; + + +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + }; + +static YY_BUFFER_STATE yy_current_buffer = 0; + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + */ +#define YY_CURRENT_BUFFER yy_current_buffer + + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; + +static int yy_n_chars; /* number of characters read into yy_ch_buf */ + + +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart YY_PROTO(( FILE *input_file )); + +void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); +void yy_load_buffer_state YY_PROTO(( void )); +YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); +void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); +void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); +void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); +#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) + +YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); +YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); +YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); + +static void *yy_flex_alloc YY_PROTO(( yy_size_t )); +static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); +static void yy_flex_free YY_PROTO(( void * )); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) + + +#define YY_USES_REJECT + +#define yywrap() 1 +#define YY_SKIP_YYWRAP + +#define FLEX_DEBUG +typedef unsigned char YY_CHAR; +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +typedef int yy_state_type; + +#define FLEX_DEBUG +extern int yylineno; +int yylineno = 1; +extern char *yytext; +#define yytext_ptr yytext + +static yy_state_type yy_get_previous_state YY_PROTO(( void )); +static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); +static int yy_get_next_buffer YY_PROTO(( void )); +static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 123 +#define YY_END_OF_BUFFER 124 +static yyconst short int yy_acclist[1196] = + { 0, + 124, 122, 123, 117, 122, 123, 117, 123, 116, 122, + 123, 15, 122, 123, 116, 122, 123, 122, 123, 116, + 122, 123, 122, 123, 116, 122, 123, 122, 123, 23, + 122, 123, 22, 122, 123, 116, 122, 123, 122, 123, + 111, 112, 122, 123, 111, 112, 122, 123, 111, 112, + 122, 123, 111, 112, 122, 123, 111, 112, 122, 123, + 111, 112, 122, 123, 111, 112, 122, 123, 111, 112, + 122, 123, 111, 112, 122, 123, 111, 112, 122, 123, + 111, 112, 122, 123, 111, 112, 122, 123, 111, 112, + 122, 123, 111, 112, 122, 123, 111, 112, 122, 123, + + 111, 112, 122, 123, 111, 112, 122, 123, 111, 112, + 122, 123, 111, 112, 122, 123, 116, 122, 123, 110, + 122, 123, 5, 122, 123, 2, 123, 2, 122, 123, + 4, 122, 123, 7, 9, 122, 123, 7, 123, 9, + 122, 123, 9, 122, 123, 17, 122, 123, 17, 123, + 18, 122, 123, 12, 122, 123, 12, 123, 14, 122, + 123, 14, 122, 123, 10, 122, 123, 11, 122, 123, + 119, 122, 123, 120, 122, 123, 120, 123, 122, 123, + 121, 122, 123, 117, 15, 15, 108, 109, 1, 21, + 115, 6, 22, 111, 112, 111, 112, 111, 112, 111, + + 112, 111, 112, 111, 112, 112, 111, 112, 111, 112, + 111, 112, 111, 112, 36, 111, 112, 111, 112, 111, + 112, 111, 112, 111, 112, 111, 112, 111, 112, 111, + 112, 111, 112, 111, 112, 112, 112, 111, 112, 111, + 112, 111, 112, 111, 112, 111, 112, 111, 112, 111, + 112, 111, 112, 112, 111, 112, 111, 112, 79, 111, + 112, 111, 112, 112, 111, 112, 111, 112, 111, 112, + 111, 112, 112, 111, 112, 111, 112, 111, 112, 111, + 112, 111, 112, 111, 112, 111, 112, 111, 112, 111, + 112, 112, 111, 112, 111, 112, 112, 112, 111, 112, + + 110, 5, 3, 8, 17, 16, 12, 119, 120, 118, + 108, 109, 21, 114, 113, 111, 112, 28, 111, 112, + 29, 111, 112, 111, 112, 111, 112, 111, 112, 33, + 111, 112, 111, 112, 111, 112, 111, 112, 111, 112, + 111, 112, 111, 112, 111, 112, 111, 112, 111, 112, + 111, 112, 49, 111, 112, 111, 112, 111, 112, 111, + 112, 111, 112, 111, 112, 111, 112, 112, 112, 111, + 112, 111, 112, 111, 112, 111, 112, 111, 112, 111, + 112, 111, 112, 71, 111, 112, 72, 111, 112, 111, + 112, 112, 111, 112, 111, 112, 111, 112, 112, 111, + + 112, 82, 111, 112, 111, 112, 111, 112, 111, 112, + 112, 111, 112, 111, 112, 111, 112, 90, 111, 112, + 111, 112, 111, 112, 111, 112, 111, 112, 111, 112, + 111, 112, 111, 112, 112, 111, 112, 111, 112, 111, + 112, 112, 112, 112, 111, 112, 24, 13, 20, 19, + 111, 112, 111, 112, 111, 112, 111, 112, 111, 112, + 111, 112, 111, 112, 111, 112, 111, 112, 111, 112, + 111, 112, 111, 112, 111, 112, 111, 112, 111, 112, + 111, 112, 111, 112, 111, 112, 111, 112, 111, 112, + 111, 112, 111, 112, 111, 112, 57, 111, 112, 112, + + 112, 111, 112, 111, 112, 111, 112, 111, 112, 111, + 112, 111, 112, 111, 112, 111, 112, 111, 112, 74, + 111, 112, 112, 111, 112, 111, 112, 111, 112, 112, + 111, 112, 111, 112, 111, 112, 111, 112, 112, 87, + 111, 112, 111, 112, 111, 112, 91, 111, 112, 111, + 112, 111, 112, 111, 112, 95, 111, 112, 97, 111, + 112, 111, 112, 112, 111, 112, 111, 112, 111, 112, + 111, 112, 111, 112, 112, 112, 112, 107, 111, 112, + 111, 112, 111, 112, 111, 112, 111, 112, 32, 111, + 112, 112, 111, 112, 111, 112, 111, 112, 39, 111, + + 112, 111, 112, 111, 112, 111, 112, 111, 112, 111, + 112, 111, 112, 111, 112, 111, 112, 111, 112, 111, + 112, 111, 112, 111, 112, 111, 112, 56, 111, 112, + 112, 112, 112, 111, 112, 111, 112, 111, 112, 111, + 112, 111, 112, 111, 112, 111, 112, 111, 112, 111, + 112, 112, 111, 112, 78, 111, 112, 111, 112, 112, + 111, 112, 111, 112, 111, 112, 111, 112, 112, 111, + 112, 111, 112, 111, 112, 111, 112, 112, 111, 112, + 112, 99, 111, 112, 111, 112, 111, 112, 112, 111, + 112, 112, 112, 112, 25, 26, 111, 112, 111, 112, + + 111, 112, 111, 112, 112, 111, 112, 111, 112, 38, + 111, 112, 111, 112, 111, 112, 111, 112, 111, 112, + 111, 112, 111, 112, 111, 112, 111, 112, 111, 112, + 51, 111, 112, 111, 112, 111, 112, 111, 112, 111, + 112, 112, 112, 112, 111, 112, 111, 112, 111, 112, + 111, 112, 111, 112, 111, 112, 111, 112, 111, 112, + 111, 112, 111, 112, 112, 76, 111, 112, 111, 112, + 112, 111, 112, 111, 112, 111, 112, 111, 112, 112, + 111, 112, 111, 112, 92, 111, 112, 93, 111, 112, + 112, 111, 112, 112, 100, 111, 112, 111, 112, 112, + + 112, 112, 112, 112, 111, 112, 111, 112, 111, 112, + 112, 35, 111, 112, 111, 112, 111, 112, 111, 112, + 111, 112, 44, 111, 112, 45, 111, 112, 111, 112, + 111, 112, 48, 111, 112, 111, 112, 111, 112, 53, + 111, 112, 111, 112, 111, 112, 112, 112, 112, 111, + 112, 111, 112, 64, 111, 112, 65, 111, 112, 111, + 112, 111, 112, 68, 111, 112, 111, 112, 111, 112, + 111, 112, 112, 111, 112, 112, 81, 111, 112, 111, + 112, 84, 111, 112, 86, 111, 112, 112, 111, 112, + 111, 112, 112, 111, 112, 112, 111, 112, 103, 112, + + 112, 112, 112, 112, 111, 112, 111, 112, 111, 112, + 112, 111, 112, 111, 112, 111, 112, 111, 112, 111, + 112, 47, 111, 112, 111, 112, 52, 111, 112, 111, + 112, 55, 111, 112, 112, 112, 112, 112, 111, 112, + 63, 111, 112, 66, 111, 112, 67, 111, 112, 111, + 112, 112, 111, 112, 112, 80, 111, 112, 112, 111, + 112, 112, 111, 112, 89, 111, 112, 112, 111, 112, + 112, 111, 112, 112, 112, 112, 112, 111, 112, 111, + 112, 31, 111, 112, 34, 112, 37, 111, 112, 40, + 111, 112, 111, 112, 111, 112, 111, 112, 111, 112, + + 111, 112, 112, 112, 112, 61, 112, 111, 112, 111, + 112, 112, 111, 112, 112, 112, 111, 112, 112, 111, + 112, 94, 112, 111, 112, 112, 101, 111, 112, 112, + 112, 112, 112, 111, 112, 111, 112, 41, 111, 112, + 42, 111, 112, 43, 111, 112, 111, 112, 50, 111, + 112, 111, 112, 112, 112, 112, 62, 111, 112, 111, + 112, 112, 111, 112, 112, 112, 111, 112, 112, 111, + 112, 111, 112, 112, 104, 112, 112, 112, 112, 111, + 112, 30, 111, 112, 46, 111, 112, 111, 112, 112, + 112, 112, 111, 112, 112, 111, 112, 112, 112, 111, + + 112, 112, 111, 112, 111, 112, 112, 112, 112, 112, + 24, 25, 111, 112, 111, 112, 112, 112, 112, 69, + 111, 112, 70, 112, 111, 112, 112, 112, 111, 112, + 112, 88, 111, 112, 111, 112, 112, 112, 112, 112, + 111, 112, 54, 111, 112, 59, 112, 112, 60, 112, + 111, 112, 75, 112, 112, 83, 111, 112, 112, 111, + 112, 96, 112, 112, 112, 106, 112, 111, 112, 112, + 73, 111, 112, 112, 112, 111, 112, 112, 105, 112, + 27, 111, 112, 58, 112, 112, 85, 112, 98, 111, + 112, 102, 112, 77, 112 + + } ; + +static yyconst short int yy_accept[676] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 4, 7, 9, 12, 15, 18, + 20, 23, 25, 28, 30, 33, 36, 39, 41, 45, + 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, + 89, 93, 97, 101, 105, 109, 113, 117, 120, 123, + 126, 128, 131, 134, 138, 140, 143, 146, 149, 151, + 154, 157, 159, 162, 165, 168, 171, 174, 177, 179, + 181, 184, 184, 185, 186, 187, 187, 188, 188, 189, + 189, 189, 190, 191, 192, 193, 194, 194, 196, 198, + 200, 202, 204, 206, 207, 209, 211, 213, 215, 218, + + 220, 222, 224, 226, 228, 230, 232, 234, 236, 237, + 238, 240, 242, 244, 246, 248, 250, 252, 254, 255, + 257, 259, 262, 264, 265, 267, 269, 271, 273, 274, + 276, 278, 280, 282, 284, 286, 288, 290, 292, 293, + 295, 297, 298, 299, 301, 301, 301, 301, 301, 301, + 302, 303, 304, 305, 306, 307, 308, 308, 309, 310, + 311, 311, 312, 313, 313, 313, 314, 315, 316, 318, + 321, 324, 326, 328, 330, 333, 335, 337, 339, 341, + 343, 345, 347, 349, 351, 353, 356, 358, 360, 362, + 364, 366, 368, 369, 370, 372, 374, 376, 378, 380, + + 382, 384, 387, 390, 392, 393, 395, 397, 399, 400, + 402, 405, 407, 409, 411, 412, 414, 416, 418, 421, + 423, 425, 427, 429, 431, 433, 435, 436, 438, 440, + 442, 443, 444, 445, 447, 448, 448, 448, 448, 448, + 449, 449, 450, 451, 453, 455, 457, 459, 461, 463, + 465, 467, 469, 471, 473, 475, 477, 479, 481, 483, + 485, 487, 489, 491, 493, 495, 497, 500, 501, 502, + 504, 506, 508, 510, 512, 514, 516, 518, 520, 523, + 524, 526, 528, 530, 531, 533, 535, 537, 539, 540, + 543, 545, 547, 550, 552, 554, 556, 559, 562, 564, + + 565, 567, 569, 571, 573, 575, 576, 577, 578, 581, + 581, 581, 581, 581, 583, 585, 587, 589, 592, 593, + 595, 597, 599, 602, 604, 606, 608, 610, 612, 614, + 616, 618, 620, 622, 624, 626, 628, 631, 632, 633, + 634, 636, 638, 640, 642, 644, 646, 648, 650, 652, + 653, 655, 658, 660, 661, 663, 665, 667, 669, 670, + 672, 674, 676, 678, 679, 681, 682, 685, 687, 689, + 690, 692, 693, 694, 695, 696, 696, 696, 696, 699, + 701, 703, 705, 706, 708, 710, 713, 715, 717, 719, + 721, 723, 725, 727, 729, 731, 734, 736, 738, 740, + + 742, 743, 744, 745, 747, 749, 751, 753, 755, 757, + 759, 761, 763, 765, 766, 769, 771, 772, 774, 776, + 778, 780, 781, 783, 785, 788, 791, 792, 794, 795, + 798, 800, 801, 802, 803, 804, 805, 805, 805, 805, + 807, 809, 811, 812, 815, 817, 819, 821, 823, 826, + 829, 831, 833, 836, 838, 840, 843, 845, 847, 848, + 849, 850, 852, 854, 857, 860, 862, 864, 867, 869, + 871, 873, 874, 876, 877, 880, 882, 885, 888, 889, + 891, 893, 894, 896, 897, 899, 901, 902, 903, 904, + 905, 905, 905, 905, 907, 909, 911, 912, 914, 916, + + 918, 920, 922, 925, 927, 930, 932, 935, 936, 937, + 938, 939, 941, 944, 947, 950, 952, 953, 955, 956, + 959, 960, 962, 963, 965, 968, 969, 971, 972, 974, + 975, 976, 977, 978, 978, 978, 978, 980, 982, 985, + 987, 990, 993, 995, 997, 999, 1001, 1003, 1004, 1005, + 1006, 1008, 1010, 1012, 1013, 1015, 1016, 1017, 1019, 1020, + 1022, 1024, 1026, 1027, 1030, 1031, 1032, 1033, 1034, 1034, + 1034, 1034, 1036, 1038, 1041, 1044, 1047, 1049, 1052, 1054, + 1055, 1056, 1057, 1060, 1062, 1063, 1065, 1066, 1067, 1069, + 1070, 1072, 1074, 1075, 1077, 1078, 1079, 1080, 1080, 1080, + + 1080, 1082, 1085, 1088, 1090, 1091, 1092, 1093, 1095, 1096, + 1098, 1099, 1100, 1102, 1103, 1105, 1107, 1108, 1109, 1110, + 1111, 1111, 1113, 1113, 1115, 1117, 1118, 1119, 1120, 1123, + 1125, 1127, 1128, 1129, 1131, 1132, 1135, 1137, 1138, 1139, + 1140, 1141, 1141, 1143, 1146, 1148, 1149, 1151, 1153, 1155, + 1156, 1159, 1160, 1162, 1164, 1165, 1166, 1168, 1168, 1170, + 1171, 1174, 1175, 1176, 1178, 1179, 1181, 1184, 1186, 1187, + 1189, 1192, 1194, 1196, 1196 + } ; + +static yyconst int yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 5, 6, 1, 1, 1, 7, 8, 9, + 9, 10, 1, 9, 11, 12, 13, 14, 15, 16, + 16, 17, 18, 19, 16, 20, 16, 21, 22, 23, + 24, 1, 1, 9, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 1, 52, 53, 1, 1, 54, 55, 56, 57, + + 58, 59, 60, 61, 62, 63, 59, 64, 65, 66, + 67, 68, 59, 69, 70, 71, 72, 73, 59, 74, + 59, 75, 76, 77, 78, 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, 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, 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, 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, 1, 1 + } ; + +static yyconst int yy_meta[79] = + { 0, + 1, 2, 3, 3, 1, 4, 5, 6, 1, 1, + 7, 1, 1, 8, 8, 8, 8, 8, 8, 8, + 9, 1, 1, 9, 8, 8, 8, 8, 8, 8, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 1, 1, 1, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 12, 1, 12 + } ; + +static yyconst short int yy_base[691] = + { 0, + 0, 0, 76, 78, 80, 81, 82, 89, 83, 93, + 96, 106, 844, 833, 116, 119, 822, 821, 177, 126, + 4166, 127, 816, 123, 4166, 134, 805, 4166, 242, 292, + 141, 298, 152, 314, 322, 130, 338, 359, 360, 376, + 382, 397, 410, 437, 440, 462, 463, 495, 0, 0, + 4166, 4166, 811, 4166, 4166, 807, 807, 0, 0, 809, + 0, 0, 787, 4166, 4166, 4166, 0, 160, 191, 104, + 4166, 800, 261, 0, 798, 797, 0, 79, 0, 426, + 793, 4166, 511, 787, 4166, 527, 771, 512, 513, 528, + 529, 544, 550, 0, 561, 567, 578, 589, 595, 611, + + 617, 628, 641, 644, 664, 661, 672, 685, 727, 737, + 696, 702, 713, 719, 730, 741, 747, 758, 725, 771, + 774, 787, 795, 725, 798, 811, 822, 835, 720, 851, + 857, 868, 874, 885, 900, 901, 916, 917, 716, 932, + 933, 716, 45, 948, 980, 987, 736, 97, 120, 0, + 0, 4166, 4166, 0, 4166, 0, 750, 0, 291, 4166, + 761, 0, 0, 79, 739, 994, 4166, 4166, 990, 1003, + 1011, 1014, 1027, 1035, 1038, 1051, 1059, 1067, 1075, 1088, + 1096, 1099, 1120, 1121, 1136, 1142, 1153, 1159, 1170, 1176, + 1187, 1198, 707, 693, 1211, 1219, 1222, 1237, 1240, 1243, + + 1267, 1261, 1264, 1282, 702, 1285, 1300, 1306, 696, 1317, + 1328, 1334, 1345, 1356, 686, 1367, 1373, 1384, 1390, 1405, + 1406, 1421, 1432, 1438, 1453, 1459, 692, 1470, 1481, 1492, + 675, 686, 681, 1503, 4166, 1542, 697, 143, 158, 4166, + 683, 4166, 4166, 1527, 1528, 1543, 1549, 1564, 1565, 1582, + 1581, 1597, 1603, 1614, 1625, 1643, 1640, 1646, 1661, 1664, + 1667, 1682, 1688, 1699, 1710, 1725, 1731, 664, 668, 1742, + 1748, 1763, 1764, 1779, 1785, 1796, 1809, 1817, 1825, 658, + 1840, 1843, 1856, 670, 1864, 1880, 1879, 1896, 649, 1897, + 1912, 1925, 1933, 1936, 1954, 1951, 1957, 1972, 1975, 648, + + 1978, 1993, 1999, 2010, 2016, 660, 649, 660, 2031, 2063, + 283, 280, 305, 2048, 2064, 2072, 2080, 2088, 644, 2096, + 2104, 2117, 2125, 2128, 2146, 2143, 2149, 2164, 2170, 2185, + 2186, 2201, 2216, 2222, 2233, 2239, 2254, 653, 641, 627, + 2255, 2275, 2272, 2293, 2292, 2310, 2309, 2325, 2331, 633, + 2342, 2353, 2359, 623, 2370, 2381, 2387, 2398, 639, 2411, + 2414, 2422, 2435, 616, 2446, 625, 2452, 2467, 2468, 613, + 2483, 607, 604, 610, 4166, 302, 321, 96, 2489, 2504, + 2507, 2515, 610, 2530, 2536, 2547, 2553, 2564, 2570, 2581, + 2592, 2598, 2615, 2621, 2637, 2638, 2653, 2654, 2669, 2675, + + 605, 607, 599, 2686, 2692, 2707, 2708, 2728, 2729, 2744, + 2752, 2765, 2773, 604, 2776, 2794, 631, 2791, 2797, 2812, + 2815, 603, 2823, 2838, 2841, 2844, 590, 2859, 574, 2862, + 2865, 588, 576, 574, 583, 581, 317, 309, 328, 2880, + 2883, 2896, 572, 2904, 2917, 2925, 2928, 2941, 2949, 2952, + 2965, 2976, 2973, 2989, 3000, 3011, 3017, 3028, 54, 589, + 564, 3034, 3045, 3056, 3062, 3073, 3079, 3094, 3095, 3110, + 3111, 583, 3126, 566, 3127, 3144, 3147, 3150, 558, 3165, + 3171, 554, 3186, 576, 3192, 0, 555, 559, 536, 566, + 347, 226, 339, 3203, 3209, 3224, 548, 3230, 3241, 3254, + + 3262, 3265, 3280, 3283, 3291, 3304, 3307, 531, 525, 525, + 531, 3322, 3328, 3339, 3345, 3356, 516, 3367, 512, 3373, + 511, 3384, 521, 3395, 3401, 517, 3412, 504, 3418, 506, + 507, 520, 466, 325, 465, 348, 3429, 3440, 3451, 0, + 3457, 3468, 3479, 3490, 3496, 3511, 3512, 467, 476, 464, + 0, 3527, 3528, 470, 3544, 450, 462, 3545, 474, 3560, + 0, 3566, 447, 3577, 444, 454, 423, 424, 361, 3616, + 353, 3601, 3602, 3617, 3618, 3633, 3634, 3649, 3650, 430, + 434, 428, 3665, 3673, 421, 3681, 421, 412, 3689, 403, + 3697, 3705, 410, 0, 400, 401, 403, 189, 3737, 519, + + 3722, 3723, 3738, 3746, 398, 417, 394, 3759, 398, 3767, + 391, 391, 3770, 383, 3783, 3794, 383, 378, 383, 378, + 371, 4166, 3833, 3818, 3819, 378, 363, 359, 3834, 0, + 3840, 357, 347, 3851, 351, 3857, 3868, 330, 315, 305, + 295, 558, 3884, 3881, 0, 282, 0, 3892, 0, 262, + 3907, 256, 3910, 0, 188, 141, 0, 3954, 3939, 138, + 3940, 120, 105, 3955, 95, 0, 3956, 0, 37, 0, + 3972, 0, 0, 4166, 4017, 4029, 4041, 4053, 4065, 4077, + 4088, 4089, 4093, 4104, 4116, 4128, 4139, 4144, 4149, 4154 + } ; + +static yyconst short int yy_def[691] = + { 0, + 674, 1, 675, 675, 676, 676, 677, 677, 678, 678, + 679, 679, 674, 674, 674, 674, 674, 680, 674, 681, + 674, 674, 674, 674, 674, 674, 674, 674, 674, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 682, 683, 684, + 674, 674, 674, 674, 674, 674, 674, 685, 685, 674, + 686, 686, 674, 674, 674, 674, 687, 674, 674, 19, + 674, 674, 674, 680, 680, 674, 688, 674, 689, 681, + 681, 674, 674, 674, 674, 674, 674, 29, 29, 29, + 29, 29, 29, 690, 29, 29, 29, 29, 29, 29, + + 29, 29, 29, 29, 29, 29, 29, 29, 690, 690, + 29, 29, 29, 29, 29, 29, 29, 29, 690, 29, + 29, 29, 29, 690, 29, 29, 29, 29, 690, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 690, 29, + 29, 690, 690, 29, 674, 682, 146, 146, 146, 683, + 684, 674, 674, 685, 674, 686, 674, 687, 674, 674, + 674, 688, 689, 674, 674, 674, 674, 674, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 690, 690, 29, 29, 29, 29, 29, 29, + + 29, 29, 29, 29, 690, 29, 29, 29, 690, 29, + 29, 29, 29, 29, 690, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 690, 29, 29, 29, + 690, 690, 690, 29, 674, 674, 146, 146, 146, 674, + 674, 674, 674, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 690, 690, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 690, + 29, 29, 29, 690, 29, 29, 29, 29, 690, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 690, + + 29, 29, 29, 29, 29, 690, 690, 690, 29, 674, + 146, 146, 146, 29, 29, 29, 29, 29, 690, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 690, 690, 690, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 690, + 29, 29, 29, 690, 29, 29, 29, 29, 690, 29, + 29, 29, 29, 690, 29, 690, 29, 29, 29, 690, + 29, 690, 690, 690, 674, 146, 146, 146, 29, 29, + 29, 29, 690, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + + 690, 690, 690, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 690, 29, 29, 690, 29, 29, 29, + 29, 690, 29, 29, 29, 29, 690, 29, 690, 29, + 29, 690, 690, 690, 690, 690, 146, 146, 146, 29, + 29, 29, 690, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 690, 690, + 690, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 690, 29, 690, 29, 29, 29, 29, 690, 29, + 29, 690, 29, 690, 29, 690, 690, 690, 690, 690, + 146, 146, 146, 29, 29, 29, 690, 29, 29, 29, + + 29, 29, 29, 29, 29, 29, 29, 690, 690, 690, + 690, 29, 29, 29, 29, 29, 690, 29, 690, 29, + 690, 29, 690, 29, 29, 690, 29, 690, 29, 690, + 690, 690, 690, 146, 146, 146, 29, 29, 29, 690, + 29, 29, 29, 29, 29, 29, 29, 690, 690, 690, + 690, 29, 29, 690, 29, 690, 690, 29, 690, 29, + 690, 29, 690, 29, 690, 690, 690, 690, 146, 674, + 146, 29, 29, 29, 29, 29, 29, 29, 29, 690, + 690, 690, 29, 29, 690, 29, 690, 690, 29, 690, + 29, 29, 690, 690, 690, 690, 690, 146, 674, 146, + + 29, 29, 29, 29, 690, 690, 690, 29, 690, 29, + 690, 690, 29, 690, 29, 29, 690, 690, 690, 690, + 146, 674, 674, 29, 29, 690, 690, 690, 29, 690, + 29, 690, 690, 29, 690, 29, 29, 690, 690, 690, + 690, 146, 29, 29, 690, 690, 690, 29, 690, 690, + 29, 690, 29, 690, 690, 690, 690, 674, 29, 690, + 29, 690, 690, 29, 690, 690, 29, 690, 690, 690, + 29, 690, 690, 0, 674, 674, 674, 674, 674, 674, + 674, 674, 674, 674, 674, 674, 674, 674, 674, 674 + } ; + +static yyconst short int yy_nxt[4245] = + { 0, + 14, 15, 16, 15, 17, 18, 19, 20, 21, 14, + 22, 23, 24, 25, 26, 26, 26, 26, 26, 26, + 27, 17, 28, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 36, 36, 36, 38, 39, 40, 41, + 36, 42, 43, 44, 45, 46, 47, 36, 36, 36, + 48, 17, 14, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 21, 17, 21, 51, 52, + 51, 52, 55, 55, 59, 62, 53, 60, 53, 56, + 56, 59, 57, 57, 60, 62, 508, 68, 69, 68, + + 76, 232, 70, 63, 242, 673, 64, 68, 69, 68, + 243, 674, 70, 63, 233, 509, 64, 73, 73, 73, + 73, 73, 73, 72, 439, 674, 72, 80, 80, 80, + 72, 78, 85, 72, 72, 147, 147, 82, 238, 80, + 80, 83, 83, 83, 83, 83, 83, 86, 86, 86, + 86, 86, 86, 86, 672, 88, 674, 239, 65, 147, + 66, 159, 159, 159, 670, 88, 88, 88, 65, 88, + 66, 28, 100, 71, 88, 312, 101, 88, 88, 102, + 88, 28, 147, 71, 72, 88, 669, 88, 104, 105, + 313, 88, 159, 159, 159, 668, 88, 147, 76, 106, + + 666, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 621, 147, 78, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 88, 665, 535, 88, 88, 88, 88, 88, + 88, 88, 73, 73, 73, 147, 88, 89, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 90, 88, 91, + 88, 92, 88, 88, 88, 88, 93, 88, 88, 88, + 88, 88, 159, 159, 159, 94, 94, 94, 94, 94, + + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 88, 376, 147, + 95, 663, 147, 88, 96, 377, 103, 88, 97, 88, + 98, 88, 662, 88, 437, 88, 88, 88, 107, 88, + 99, 147, 88, 491, 147, 438, 660, 88, 147, 88, + 378, 88, 492, 88, 657, 108, 147, 88, 88, 88, + 147, 88, 111, 88, 147, 112, 88, 147, 569, 493, + 656, 534, 571, 88, 113, 114, 655, 88, 147, 109, + 115, 536, 88, 116, 88, 88, 147, 147, 600, 654, + 110, 117, 147, 598, 88, 88, 88, 88, 88, 88, + + 147, 120, 121, 88, 118, 122, 125, 88, 642, 126, + 147, 88, 652, 88, 650, 123, 649, 127, 647, 88, + 88, 88, 88, 128, 646, 130, 88, 80, 80, 80, + 124, 119, 88, 164, 88, 88, 88, 645, 131, 80, + 80, 88, 132, 641, 640, 88, 639, 88, 638, 88, + 129, 635, 633, 133, 88, 135, 632, 630, 134, 628, + 627, 136, 88, 626, 620, 88, 570, 570, 570, 619, + 618, 617, 88, 614, 88, 88, 88, 140, 137, 88, + 612, 88, 611, 141, 88, 138, 609, 88, 88, 607, + 606, 605, 597, 596, 139, 144, 595, 88, 88, 88, + + 88, 88, 88, 594, 147, 142, 88, 88, 145, 145, + 145, 145, 145, 145, 145, 593, 590, 588, 587, 146, + 623, 623, 623, 143, 166, 166, 166, 166, 166, 166, + 166, 585, 582, 581, 148, 580, 568, 88, 88, 149, + 86, 86, 86, 86, 86, 86, 86, 88, 88, 88, + 88, 88, 88, 88, 88, 169, 88, 88, 147, 658, + 658, 658, 567, 170, 88, 88, 88, 88, 88, 88, + 566, 565, 88, 88, 563, 88, 561, 171, 559, 88, + 557, 88, 556, 172, 554, 88, 88, 88, 88, 88, + 551, 174, 88, 173, 88, 550, 88, 147, 88, 549, + + 88, 548, 88, 88, 88, 88, 88, 540, 533, 532, + 175, 88, 531, 88, 88, 88, 530, 176, 528, 526, + 88, 523, 88, 521, 88, 519, 88, 177, 88, 511, + 88, 510, 88, 88, 88, 178, 88, 497, 490, 88, + 489, 180, 88, 488, 487, 486, 88, 484, 88, 179, + 88, 482, 88, 88, 88, 88, 88, 479, 474, 472, + 461, 88, 460, 88, 181, 182, 88, 88, 459, 184, + 183, 443, 88, 436, 435, 434, 88, 432, 88, 88, + 88, 88, 429, 88, 427, 88, 88, 188, 88, 88, + 185, 186, 422, 417, 414, 403, 88, 88, 88, 88, + + 189, 88, 402, 88, 190, 88, 401, 191, 187, 88, + 88, 88, 383, 195, 374, 373, 88, 372, 366, 359, + 88, 88, 88, 192, 88, 354, 350, 88, 339, 88, + 196, 88, 338, 88, 160, 88, 311, 88, 88, 88, + 88, 88, 308, 307, 88, 198, 88, 306, 88, 300, + 88, 289, 197, 284, 88, 88, 88, 88, 88, 280, + 269, 199, 200, 88, 268, 88, 88, 88, 201, 88, + 243, 241, 88, 240, 88, 147, 88, 231, 88, 227, + 88, 215, 88, 88, 203, 88, 88, 209, 202, 205, + 194, 88, 193, 204, 168, 88, 88, 88, 167, 88, + + 165, 161, 88, 160, 206, 160, 88, 157, 88, 88, + 88, 88, 88, 88, 155, 88, 85, 207, 88, 153, + 88, 152, 88, 88, 88, 87, 88, 84, 75, 72, + 88, 88, 88, 88, 88, 88, 88, 88, 208, 88, + 72, 210, 88, 674, 674, 674, 88, 88, 88, 674, + 88, 674, 674, 674, 674, 88, 211, 88, 674, 88, + 88, 88, 674, 213, 674, 674, 212, 214, 674, 674, + 88, 674, 88, 674, 88, 216, 88, 674, 674, 88, + 674, 674, 88, 674, 674, 674, 217, 674, 88, 674, + 88, 674, 88, 88, 88, 88, 88, 218, 674, 88, + + 219, 88, 674, 88, 674, 88, 674, 88, 674, 88, + 88, 88, 88, 88, 223, 221, 674, 220, 88, 674, + 88, 674, 222, 674, 88, 88, 88, 674, 674, 88, + 674, 224, 674, 674, 674, 88, 88, 88, 88, 88, + 88, 88, 88, 674, 88, 88, 674, 674, 674, 674, + 674, 88, 88, 88, 88, 88, 226, 88, 88, 229, + 225, 88, 230, 674, 228, 674, 674, 88, 88, 88, + 88, 88, 88, 88, 674, 674, 88, 88, 674, 674, + 674, 674, 674, 88, 674, 88, 674, 88, 236, 236, + 236, 234, 88, 145, 145, 145, 145, 145, 145, 145, + + 674, 674, 674, 674, 674, 674, 674, 166, 166, 166, + 166, 166, 166, 166, 674, 88, 674, 674, 244, 674, + 674, 674, 674, 674, 674, 88, 237, 88, 88, 88, + 674, 235, 674, 245, 88, 674, 88, 674, 88, 88, + 88, 674, 88, 674, 674, 674, 88, 88, 88, 246, + 88, 88, 88, 88, 674, 88, 674, 674, 88, 674, + 88, 674, 88, 88, 88, 247, 88, 248, 674, 674, + 88, 88, 88, 88, 88, 88, 88, 88, 674, 88, + 674, 674, 88, 674, 88, 674, 88, 674, 88, 674, + 88, 674, 88, 249, 250, 88, 88, 674, 88, 674, + + 88, 674, 88, 88, 88, 674, 88, 252, 251, 674, + 88, 88, 88, 88, 88, 674, 674, 674, 674, 88, + 674, 88, 674, 88, 88, 88, 674, 88, 674, 674, + 253, 88, 88, 88, 88, 254, 88, 674, 88, 674, + 88, 255, 256, 88, 257, 88, 88, 674, 674, 259, + 674, 674, 258, 674, 674, 88, 88, 88, 88, 88, + 88, 88, 674, 674, 88, 88, 674, 88, 674, 674, + 674, 88, 674, 88, 260, 88, 674, 88, 88, 88, + 88, 88, 674, 674, 88, 674, 88, 262, 88, 261, + 88, 674, 88, 674, 88, 88, 88, 88, 88, 674, + + 674, 88, 674, 88, 265, 263, 674, 88, 264, 88, + 674, 88, 88, 88, 88, 88, 674, 674, 674, 674, + 88, 674, 88, 88, 88, 674, 88, 674, 674, 266, + 674, 88, 674, 88, 267, 88, 88, 88, 674, 674, + 674, 674, 88, 674, 88, 674, 88, 88, 88, 674, + 88, 674, 674, 270, 88, 88, 271, 272, 88, 88, + 273, 88, 88, 88, 674, 88, 88, 674, 88, 674, + 674, 276, 274, 674, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 275, 88, 277, 88, 88, 674, 88, + 674, 674, 88, 674, 674, 674, 88, 674, 88, 88, + + 88, 88, 88, 88, 88, 88, 88, 88, 278, 674, + 88, 88, 674, 281, 674, 674, 674, 279, 674, 88, + 88, 88, 88, 674, 88, 88, 88, 674, 282, 88, + 674, 88, 674, 674, 674, 88, 674, 88, 283, 88, + 674, 88, 88, 88, 88, 88, 674, 674, 674, 674, + 88, 674, 88, 88, 88, 674, 88, 674, 674, 88, + 285, 88, 674, 88, 674, 88, 674, 88, 674, 88, + 88, 88, 88, 88, 674, 674, 286, 674, 88, 674, + 88, 88, 88, 674, 88, 674, 674, 287, 674, 88, + 674, 88, 88, 88, 674, 88, 674, 291, 88, 674, + + 88, 288, 290, 674, 88, 674, 88, 674, 88, 88, + 88, 88, 88, 674, 674, 88, 674, 88, 674, 88, + 674, 88, 674, 88, 674, 88, 674, 88, 292, 88, + 88, 88, 674, 293, 88, 674, 674, 674, 294, 674, + 88, 88, 88, 88, 88, 88, 88, 674, 674, 88, + 88, 674, 674, 674, 674, 674, 88, 88, 88, 674, + 88, 674, 674, 88, 295, 88, 674, 88, 674, 88, + 674, 88, 674, 88, 296, 88, 88, 88, 88, 674, + 297, 298, 88, 674, 88, 674, 674, 299, 88, 674, + 88, 674, 88, 674, 88, 88, 88, 88, 88, 674, + + 674, 674, 674, 88, 674, 88, 88, 88, 301, 88, + 302, 305, 674, 674, 88, 303, 88, 88, 88, 674, + 88, 674, 674, 674, 304, 88, 674, 88, 88, 88, + 674, 88, 674, 674, 309, 674, 88, 674, 88, 674, + 88, 674, 88, 236, 236, 236, 674, 88, 674, 674, + 674, 674, 88, 88, 674, 310, 310, 310, 310, 310, + 310, 310, 88, 88, 314, 88, 88, 88, 88, 315, + 674, 88, 88, 674, 88, 316, 674, 674, 88, 674, + 88, 674, 88, 674, 88, 317, 88, 88, 88, 88, + 88, 674, 674, 88, 674, 674, 674, 674, 674, 88, + + 88, 318, 88, 88, 88, 321, 88, 88, 88, 88, + 320, 674, 674, 674, 674, 674, 88, 88, 88, 88, + 88, 88, 88, 322, 674, 88, 88, 674, 88, 674, + 674, 674, 88, 674, 88, 319, 88, 674, 88, 88, + 88, 88, 88, 674, 674, 323, 674, 88, 674, 88, + 88, 88, 324, 88, 674, 674, 674, 674, 88, 674, + 88, 674, 88, 674, 88, 88, 325, 326, 88, 88, + 674, 88, 674, 674, 674, 88, 674, 88, 88, 88, + 88, 88, 88, 328, 327, 88, 88, 88, 329, 88, + 88, 330, 88, 674, 674, 331, 88, 674, 88, 88, + + 88, 88, 88, 88, 88, 88, 88, 88, 88, 674, + 674, 88, 674, 88, 674, 674, 674, 88, 674, 88, + 333, 332, 674, 88, 88, 88, 88, 88, 674, 674, + 674, 674, 88, 674, 88, 88, 88, 674, 88, 674, + 334, 674, 674, 88, 674, 88, 674, 335, 674, 88, + 88, 336, 674, 337, 88, 674, 88, 674, 674, 674, + 88, 674, 88, 674, 88, 674, 88, 88, 88, 88, + 88, 674, 674, 88, 674, 88, 674, 88, 674, 88, + 674, 88, 674, 88, 674, 88, 88, 88, 88, 88, + 674, 341, 88, 674, 674, 342, 674, 674, 88, 88, + + 88, 88, 88, 88, 88, 343, 674, 88, 88, 345, + 88, 674, 340, 674, 88, 674, 88, 674, 88, 674, + 88, 88, 88, 344, 88, 348, 346, 674, 674, 88, + 674, 88, 674, 88, 88, 88, 674, 347, 674, 674, + 88, 674, 88, 674, 88, 674, 88, 674, 88, 674, + 88, 674, 88, 88, 88, 674, 88, 674, 674, 349, + 88, 88, 88, 674, 88, 88, 351, 674, 88, 88, + 674, 674, 674, 674, 674, 88, 674, 88, 88, 88, + 88, 88, 88, 674, 88, 674, 352, 88, 674, 88, + 356, 88, 355, 88, 353, 88, 674, 674, 674, 88, + + 88, 88, 674, 88, 88, 88, 674, 357, 88, 674, + 674, 674, 674, 674, 88, 88, 88, 88, 88, 88, + 358, 88, 88, 88, 88, 674, 674, 674, 674, 674, + 674, 88, 88, 88, 88, 88, 88, 88, 674, 674, + 88, 88, 674, 674, 674, 674, 674, 88, 674, 88, + 88, 88, 674, 361, 674, 360, 88, 674, 88, 674, + 88, 88, 88, 674, 88, 674, 674, 674, 88, 88, + 88, 88, 88, 362, 674, 88, 88, 88, 363, 88, + 88, 674, 88, 674, 674, 365, 88, 674, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 674, + + 88, 88, 674, 88, 674, 674, 674, 88, 674, 88, + 88, 88, 88, 88, 88, 367, 88, 88, 88, 88, + 674, 364, 88, 674, 88, 674, 674, 369, 88, 674, + 88, 674, 88, 674, 88, 88, 88, 368, 88, 674, + 674, 88, 674, 88, 674, 88, 674, 88, 674, 88, + 674, 88, 674, 88, 88, 88, 88, 674, 371, 674, + 88, 674, 674, 674, 674, 674, 88, 674, 88, 674, + 88, 370, 674, 88, 674, 88, 310, 310, 310, 310, + 310, 310, 310, 88, 674, 88, 674, 88, 380, 88, + 674, 379, 88, 674, 674, 674, 674, 88, 381, 88, + + 674, 88, 674, 88, 382, 88, 674, 88, 88, 88, + 674, 88, 674, 88, 375, 88, 88, 88, 674, 88, + 384, 88, 674, 88, 88, 88, 674, 88, 674, 88, + 385, 88, 88, 88, 674, 88, 674, 674, 674, 88, + 88, 88, 88, 88, 674, 386, 674, 674, 88, 674, + 88, 674, 88, 88, 88, 674, 88, 674, 674, 674, + 88, 88, 88, 88, 88, 387, 674, 88, 88, 88, + 388, 88, 88, 674, 88, 389, 674, 674, 88, 674, + 88, 88, 88, 88, 390, 88, 88, 88, 88, 88, + 88, 674, 391, 88, 674, 88, 392, 393, 674, 88, + + 674, 88, 674, 88, 674, 88, 674, 88, 88, 88, + 88, 88, 674, 394, 88, 674, 674, 674, 674, 674, + 88, 88, 88, 88, 88, 88, 88, 395, 674, 88, + 88, 674, 674, 674, 674, 674, 88, 674, 88, 674, + 88, 88, 397, 674, 396, 88, 674, 88, 674, 674, + 674, 88, 674, 88, 674, 88, 674, 88, 88, 88, + 88, 88, 674, 674, 88, 398, 88, 674, 88, 674, + 88, 674, 88, 674, 88, 399, 400, 88, 88, 88, + 88, 674, 674, 88, 674, 674, 674, 404, 674, 88, + 88, 88, 88, 88, 88, 674, 674, 88, 88, 88, + + 88, 405, 674, 406, 674, 674, 674, 88, 674, 88, + 88, 88, 88, 674, 88, 407, 88, 88, 88, 88, + 408, 674, 674, 674, 674, 674, 674, 88, 88, 409, + 88, 88, 88, 674, 88, 88, 88, 88, 410, 674, + 674, 413, 674, 412, 88, 88, 88, 88, 88, 88, + 88, 411, 674, 88, 88, 674, 88, 674, 674, 674, + 88, 674, 88, 674, 88, 674, 88, 88, 88, 88, + 88, 674, 674, 674, 674, 88, 674, 88, 88, 88, + 674, 88, 674, 674, 88, 415, 88, 674, 88, 674, + 88, 674, 88, 674, 88, 88, 416, 88, 88, 674, + + 674, 674, 674, 88, 674, 88, 88, 88, 674, 88, + 674, 418, 88, 419, 88, 674, 88, 674, 88, 674, + 88, 674, 88, 88, 420, 88, 88, 674, 674, 674, + 674, 88, 674, 88, 674, 88, 88, 88, 674, 88, + 674, 421, 88, 423, 674, 674, 88, 88, 88, 88, + 88, 424, 425, 88, 674, 88, 674, 88, 88, 88, + 88, 88, 674, 674, 674, 674, 88, 674, 674, 674, + 88, 88, 88, 674, 88, 674, 674, 88, 428, 88, + 674, 88, 426, 88, 674, 88, 674, 88, 674, 88, + 88, 88, 88, 88, 674, 430, 88, 674, 674, 674, + + 674, 674, 88, 88, 88, 88, 88, 88, 88, 431, + 674, 88, 88, 674, 88, 674, 674, 674, 88, 674, + 88, 674, 88, 674, 88, 674, 88, 88, 88, 88, + 440, 441, 88, 88, 674, 674, 674, 674, 674, 88, + 88, 88, 88, 88, 88, 674, 88, 674, 88, 674, + 88, 88, 88, 433, 88, 88, 674, 674, 442, 88, + 674, 88, 674, 674, 674, 88, 674, 444, 674, 88, + 674, 88, 88, 88, 88, 88, 674, 674, 88, 445, + 88, 446, 88, 674, 88, 674, 88, 674, 88, 88, + 88, 88, 88, 674, 674, 88, 447, 88, 674, 88, + + 674, 88, 674, 88, 674, 88, 88, 448, 88, 88, + 674, 674, 674, 674, 88, 674, 88, 88, 88, 450, + 88, 674, 674, 88, 449, 88, 674, 88, 674, 88, + 674, 88, 674, 88, 674, 88, 88, 88, 674, 674, + 88, 451, 88, 452, 674, 674, 88, 674, 453, 674, + 88, 674, 88, 674, 88, 674, 88, 674, 88, 88, + 88, 454, 88, 88, 674, 88, 674, 674, 674, 674, + 674, 674, 88, 88, 88, 88, 88, 88, 88, 88, + 674, 88, 88, 674, 674, 455, 674, 674, 88, 88, + 88, 88, 88, 88, 88, 674, 456, 88, 88, 458, + + 88, 457, 674, 674, 88, 674, 88, 674, 88, 674, + 88, 88, 88, 88, 88, 462, 674, 88, 674, 88, + 674, 88, 674, 88, 463, 88, 674, 88, 674, 88, + 88, 88, 88, 88, 464, 674, 88, 674, 674, 674, + 674, 674, 88, 88, 88, 88, 88, 88, 674, 674, + 465, 88, 88, 88, 88, 467, 466, 674, 674, 674, + 674, 674, 674, 88, 88, 88, 88, 88, 88, 88, + 674, 674, 88, 88, 674, 674, 674, 88, 674, 88, + 469, 88, 674, 88, 674, 468, 674, 88, 88, 88, + 88, 88, 674, 674, 674, 674, 88, 674, 88, 674, + + 88, 88, 88, 674, 88, 471, 674, 470, 88, 88, + 88, 88, 88, 88, 674, 88, 88, 88, 473, 88, + 88, 674, 88, 674, 674, 674, 88, 674, 475, 88, + 88, 88, 88, 88, 476, 88, 88, 88, 88, 674, + 88, 88, 674, 478, 674, 674, 674, 88, 88, 88, + 88, 88, 88, 674, 88, 477, 88, 674, 88, 88, + 88, 674, 88, 88, 481, 674, 88, 88, 480, 88, + 674, 674, 674, 88, 674, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 483, 88, 88, 674, + 88, 674, 674, 674, 88, 674, 88, 88, 88, 88, + + 88, 88, 88, 88, 88, 88, 88, 485, 88, 88, + 674, 674, 674, 674, 674, 88, 674, 88, 88, 88, + 88, 88, 88, 494, 88, 674, 495, 88, 496, 88, + 674, 88, 674, 88, 674, 88, 674, 674, 674, 88, + 88, 88, 88, 88, 674, 498, 674, 674, 88, 674, + 88, 674, 88, 88, 88, 674, 88, 674, 674, 674, + 88, 88, 499, 88, 88, 500, 88, 88, 674, 88, + 674, 674, 88, 501, 88, 674, 88, 88, 88, 674, + 88, 674, 674, 674, 88, 88, 88, 88, 88, 88, + 88, 88, 674, 88, 674, 674, 88, 502, 88, 674, + + 88, 88, 88, 503, 88, 674, 674, 674, 88, 88, + 88, 88, 88, 88, 88, 88, 674, 88, 674, 674, + 88, 674, 674, 674, 88, 88, 88, 674, 88, 674, + 674, 674, 504, 88, 674, 88, 88, 88, 674, 88, + 674, 674, 506, 505, 88, 674, 88, 674, 88, 674, + 88, 674, 88, 88, 88, 88, 88, 674, 674, 88, + 674, 88, 674, 507, 674, 88, 512, 88, 674, 88, + 88, 88, 88, 88, 674, 674, 674, 674, 88, 674, + 88, 88, 88, 674, 88, 674, 674, 88, 513, 88, + 674, 88, 674, 88, 674, 88, 674, 88, 88, 88, + + 88, 88, 674, 674, 88, 674, 88, 515, 88, 674, + 88, 674, 88, 674, 88, 514, 88, 88, 88, 88, + 88, 516, 674, 88, 674, 674, 674, 674, 674, 88, + 88, 88, 88, 88, 88, 88, 88, 674, 88, 88, + 674, 674, 674, 674, 674, 88, 88, 88, 518, 88, + 88, 88, 88, 674, 88, 88, 674, 674, 674, 674, + 674, 520, 88, 88, 88, 88, 88, 674, 674, 88, + 88, 88, 88, 522, 674, 88, 674, 674, 674, 88, + 517, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 674, 524, 88, 674, 88, 674, 674, 525, + + 88, 674, 88, 674, 88, 674, 88, 674, 88, 88, + 88, 88, 674, 537, 527, 88, 529, 88, 674, 674, + 674, 88, 674, 88, 674, 88, 674, 88, 88, 88, + 88, 88, 674, 674, 88, 674, 88, 674, 88, 674, + 88, 538, 88, 674, 88, 674, 88, 88, 88, 88, + 539, 674, 674, 88, 674, 88, 674, 674, 674, 88, + 674, 88, 674, 88, 674, 88, 88, 88, 88, 88, + 674, 541, 674, 674, 88, 674, 88, 674, 88, 88, + 88, 674, 543, 674, 542, 88, 674, 88, 674, 88, + 88, 88, 674, 88, 674, 674, 674, 88, 88, 544, + + 88, 88, 88, 545, 88, 88, 88, 674, 88, 88, + 674, 546, 674, 674, 674, 88, 88, 88, 88, 88, + 88, 674, 88, 674, 88, 674, 88, 88, 88, 88, + 88, 674, 88, 674, 674, 88, 547, 674, 674, 88, + 674, 88, 88, 88, 88, 674, 88, 88, 88, 674, + 552, 88, 674, 88, 674, 674, 674, 88, 674, 88, + 674, 88, 674, 88, 88, 88, 88, 88, 674, 674, + 88, 674, 88, 674, 88, 674, 88, 674, 88, 674, + 88, 88, 88, 88, 88, 674, 674, 674, 674, 88, + 674, 88, 88, 88, 674, 88, 555, 674, 88, 553, + + 88, 674, 88, 674, 88, 560, 88, 674, 88, 88, + 88, 88, 88, 674, 674, 674, 558, 88, 674, 88, + 88, 88, 674, 88, 674, 674, 88, 674, 88, 674, + 88, 674, 88, 674, 88, 674, 88, 88, 88, 88, + 88, 674, 674, 88, 674, 88, 674, 88, 674, 562, + 674, 88, 674, 564, 88, 88, 88, 88, 674, 674, + 674, 674, 88, 674, 88, 88, 88, 674, 88, 674, + 674, 572, 674, 88, 674, 88, 88, 88, 573, 88, + 674, 674, 88, 674, 88, 674, 88, 674, 88, 674, + 88, 674, 88, 88, 88, 88, 88, 674, 674, 674, + + 674, 88, 674, 88, 88, 88, 575, 88, 674, 674, + 574, 674, 88, 674, 88, 88, 88, 674, 88, 674, + 576, 88, 674, 88, 674, 88, 674, 88, 674, 88, + 674, 88, 674, 577, 88, 88, 88, 88, 578, 674, + 88, 674, 674, 674, 674, 674, 88, 579, 88, 88, + 88, 88, 88, 88, 674, 88, 88, 674, 674, 674, + 584, 674, 88, 88, 88, 88, 88, 88, 583, 88, + 88, 88, 88, 674, 674, 674, 586, 674, 674, 88, + 88, 88, 589, 88, 88, 88, 674, 674, 88, 88, + 674, 88, 674, 674, 674, 88, 674, 88, 591, 88, + + 674, 88, 88, 88, 88, 88, 674, 674, 674, 592, + 88, 674, 88, 674, 88, 674, 88, 570, 570, 570, + 674, 88, 674, 674, 674, 674, 88, 88, 674, 599, + 599, 599, 599, 599, 599, 599, 88, 88, 88, 602, + 88, 88, 88, 88, 674, 88, 88, 674, 674, 601, + 674, 674, 88, 88, 88, 88, 88, 88, 88, 88, + 674, 88, 88, 674, 674, 674, 674, 674, 88, 88, + 88, 88, 88, 88, 88, 88, 603, 88, 88, 674, + 674, 674, 604, 674, 88, 88, 88, 88, 88, 88, + 88, 674, 674, 88, 88, 674, 674, 674, 88, 674, + + 88, 674, 88, 674, 88, 674, 88, 674, 88, 88, + 88, 608, 88, 674, 88, 674, 88, 88, 610, 674, + 88, 613, 88, 674, 88, 88, 88, 674, 88, 615, + 88, 674, 88, 88, 88, 674, 88, 616, 674, 674, + 88, 88, 88, 674, 88, 674, 674, 88, 88, 88, + 599, 599, 599, 599, 599, 599, 599, 88, 88, 624, + 88, 88, 88, 88, 674, 674, 88, 88, 674, 674, + 674, 88, 674, 88, 674, 88, 674, 88, 674, 674, + 674, 88, 88, 88, 88, 88, 674, 674, 622, 625, + 88, 674, 88, 674, 88, 88, 629, 674, 88, 631, + + 674, 674, 88, 88, 88, 88, 88, 88, 88, 88, + 636, 88, 674, 634, 88, 674, 674, 674, 88, 88, + 88, 674, 88, 637, 674, 674, 674, 88, 674, 88, + 674, 88, 674, 88, 623, 623, 623, 674, 88, 674, + 674, 674, 674, 88, 88, 674, 599, 599, 599, 599, + 599, 599, 599, 88, 88, 88, 88, 88, 88, 88, + 674, 643, 88, 88, 674, 88, 674, 644, 674, 88, + 674, 88, 674, 88, 674, 88, 88, 88, 88, 88, + 674, 674, 88, 648, 88, 674, 88, 674, 88, 674, + 88, 674, 88, 88, 88, 88, 88, 674, 674, 651, + + 653, 88, 674, 88, 674, 88, 88, 88, 659, 88, + 674, 674, 88, 674, 674, 674, 88, 88, 88, 88, + 88, 88, 674, 88, 674, 88, 674, 88, 88, 88, + 674, 88, 88, 674, 674, 88, 88, 674, 664, 674, + 661, 674, 88, 674, 88, 88, 88, 88, 674, 88, + 674, 88, 674, 674, 88, 658, 658, 658, 674, 674, + 674, 674, 674, 674, 88, 88, 674, 599, 599, 599, + 599, 599, 599, 599, 88, 88, 88, 88, 88, 88, + 88, 88, 674, 88, 88, 674, 667, 674, 674, 674, + 88, 88, 88, 88, 88, 88, 671, 88, 674, 88, + + 88, 674, 674, 674, 674, 674, 674, 88, 674, 88, + 674, 88, 674, 674, 674, 674, 88, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 74, 74, 74, + 674, 74, 74, 74, 74, 74, 74, 74, 74, 81, + 81, 674, 674, 81, 674, 81, 147, 674, 147, 150, + + 150, 674, 150, 150, 151, 151, 674, 151, 151, 151, + 674, 151, 151, 151, 151, 151, 154, 154, 154, 674, + 154, 154, 154, 154, 154, 154, 154, 154, 156, 156, + 156, 156, 156, 156, 156, 156, 674, 156, 156, 158, + 674, 674, 158, 674, 158, 158, 158, 158, 158, 158, + 162, 162, 674, 162, 162, 163, 163, 674, 163, 163, + 94, 94, 674, 94, 94, 13, 674, 674, 674, 674, + 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, + 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, + 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, + + 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, + 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, + 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, + 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, + 674, 674, 674, 674 + } ; + +static yyconst short int yy_chk[4245] = + { 0, + 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, 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, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, + 4, 4, 5, 6, 7, 9, 3, 7, 4, 5, + 6, 8, 5, 6, 8, 10, 459, 11, 11, 11, + + 78, 143, 11, 9, 164, 669, 9, 12, 12, 12, + 164, 70, 12, 10, 143, 459, 10, 15, 15, 15, + 16, 16, 16, 15, 378, 70, 16, 20, 20, 20, + 24, 78, 24, 20, 22, 378, 148, 22, 148, 20, + 20, 22, 22, 22, 22, 22, 22, 26, 26, 26, + 26, 26, 26, 26, 665, 36, 70, 149, 9, 149, + 9, 68, 68, 68, 663, 36, 31, 36, 10, 36, + 10, 11, 31, 11, 36, 238, 31, 33, 31, 31, + 31, 12, 238, 12, 19, 31, 662, 33, 33, 33, + 239, 33, 69, 69, 69, 660, 33, 239, 19, 33, + + 656, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 598, 598, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 29, 655, 492, 29, 29, 29, 29, 29, + 29, 29, 73, 73, 73, 492, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 159, 159, 159, 29, 29, 29, 29, 29, + + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 30, 311, 312, + 30, 652, 311, 32, 30, 312, 32, 30, 30, 30, + 30, 30, 650, 32, 376, 32, 30, 32, 34, 34, + 30, 376, 32, 437, 313, 377, 646, 35, 438, 34, + 313, 34, 438, 34, 641, 34, 437, 35, 34, 35, + 377, 35, 37, 37, 534, 37, 35, 439, 534, 439, + 640, 491, 536, 37, 37, 37, 639, 37, 493, 35, + 37, 493, 37, 38, 38, 39, 491, 536, 571, 638, + 35, 38, 571, 569, 38, 39, 38, 39, 38, 39, + + 569, 40, 40, 38, 39, 40, 41, 41, 621, 41, + 621, 40, 635, 40, 633, 40, 632, 41, 628, 41, + 40, 41, 42, 41, 627, 42, 41, 80, 80, 80, + 40, 39, 42, 80, 42, 43, 42, 626, 43, 80, + 80, 42, 43, 620, 619, 43, 618, 43, 617, 43, + 41, 614, 612, 43, 43, 44, 611, 609, 43, 607, + 606, 44, 44, 605, 597, 45, 535, 535, 535, 596, + 595, 593, 44, 590, 44, 45, 44, 45, 44, 45, + 588, 44, 587, 45, 45, 44, 585, 46, 47, 582, + 581, 580, 568, 567, 44, 47, 566, 46, 47, 46, + + 47, 46, 47, 565, 535, 45, 46, 47, 48, 48, + 48, 48, 48, 48, 48, 563, 559, 557, 556, 48, + 600, 600, 600, 46, 83, 83, 83, 83, 83, 83, + 83, 554, 550, 549, 48, 548, 533, 88, 89, 48, + 86, 86, 86, 86, 86, 86, 86, 88, 89, 88, + 89, 88, 89, 90, 91, 89, 88, 89, 600, 642, + 642, 642, 532, 90, 91, 90, 91, 90, 91, 92, + 531, 530, 90, 91, 528, 93, 526, 91, 523, 92, + 521, 92, 519, 92, 517, 93, 95, 93, 92, 93, + 511, 95, 96, 93, 93, 510, 95, 642, 95, 509, + + 95, 508, 96, 97, 96, 95, 96, 497, 490, 489, + 96, 96, 488, 97, 98, 97, 487, 97, 484, 482, + 99, 479, 97, 474, 98, 472, 98, 98, 98, 461, + 99, 460, 99, 98, 99, 100, 100, 443, 436, 99, + 435, 101, 101, 434, 433, 432, 100, 429, 100, 100, + 100, 427, 101, 102, 101, 100, 101, 422, 417, 414, + 403, 101, 402, 102, 102, 102, 103, 102, 401, 104, + 103, 383, 102, 374, 373, 372, 103, 370, 103, 104, + 103, 104, 366, 104, 364, 103, 106, 106, 104, 105, + 105, 105, 359, 354, 350, 340, 106, 107, 106, 105, + + 106, 105, 339, 105, 106, 106, 338, 107, 105, 107, + 108, 107, 319, 111, 308, 307, 107, 306, 300, 289, + 108, 111, 108, 108, 108, 284, 280, 112, 269, 108, + 112, 111, 268, 111, 241, 111, 237, 112, 113, 112, + 111, 112, 233, 232, 114, 114, 112, 231, 113, 227, + 113, 215, 113, 209, 114, 115, 114, 113, 114, 205, + 194, 114, 114, 114, 193, 115, 116, 115, 115, 115, + 165, 161, 117, 157, 115, 147, 116, 142, 116, 139, + 116, 129, 117, 118, 117, 116, 117, 124, 116, 119, + 110, 117, 109, 118, 87, 118, 120, 118, 84, 121, + + 81, 76, 118, 75, 120, 72, 120, 63, 120, 121, + 120, 121, 122, 121, 60, 120, 57, 121, 121, 56, + 123, 53, 122, 125, 122, 27, 122, 23, 18, 17, + 123, 122, 123, 125, 123, 125, 126, 125, 123, 123, + 14, 125, 125, 13, 0, 0, 126, 127, 126, 0, + 126, 0, 0, 0, 0, 126, 126, 127, 0, 127, + 128, 127, 0, 128, 0, 0, 127, 128, 0, 0, + 128, 0, 128, 0, 128, 130, 130, 0, 0, 128, + 0, 0, 131, 0, 0, 0, 130, 0, 130, 0, + 130, 0, 131, 132, 131, 130, 131, 131, 0, 133, + + 131, 131, 0, 132, 0, 132, 0, 132, 0, 133, + 134, 133, 132, 133, 135, 133, 0, 132, 133, 0, + 134, 0, 134, 0, 134, 135, 136, 0, 0, 134, + 0, 136, 0, 0, 0, 135, 136, 135, 136, 135, + 136, 137, 138, 0, 135, 136, 0, 0, 0, 0, + 0, 137, 138, 137, 138, 137, 138, 140, 141, 141, + 137, 138, 141, 0, 140, 0, 0, 140, 141, 140, + 141, 140, 141, 144, 0, 0, 140, 141, 0, 0, + 0, 0, 0, 144, 0, 144, 0, 144, 146, 146, + 146, 144, 144, 145, 145, 145, 145, 145, 145, 145, + + 146, 146, 146, 146, 146, 146, 146, 166, 166, 166, + 166, 166, 166, 166, 0, 169, 0, 0, 169, 0, + 0, 0, 0, 0, 0, 169, 146, 169, 170, 169, + 0, 145, 0, 169, 169, 0, 171, 0, 170, 172, + 170, 0, 170, 0, 0, 0, 171, 170, 171, 172, + 171, 172, 173, 172, 0, 171, 0, 0, 172, 0, + 174, 0, 173, 175, 173, 173, 173, 174, 0, 0, + 174, 173, 174, 175, 174, 175, 176, 175, 0, 174, + 0, 0, 175, 0, 177, 0, 176, 0, 176, 0, + 176, 0, 178, 176, 177, 176, 177, 0, 177, 0, + + 179, 0, 178, 177, 178, 0, 178, 179, 178, 0, + 179, 178, 179, 180, 179, 0, 0, 0, 0, 179, + 0, 181, 0, 180, 182, 180, 0, 180, 0, 0, + 180, 181, 180, 181, 182, 181, 182, 0, 182, 0, + 181, 182, 182, 182, 183, 183, 184, 0, 0, 184, + 0, 0, 183, 0, 0, 183, 184, 183, 184, 183, + 184, 185, 0, 0, 183, 184, 0, 186, 0, 0, + 0, 185, 0, 185, 185, 185, 0, 186, 187, 186, + 185, 186, 0, 0, 188, 0, 186, 188, 187, 187, + 187, 0, 187, 0, 188, 189, 188, 187, 188, 0, + + 0, 190, 0, 188, 190, 189, 0, 189, 189, 189, + 0, 190, 191, 190, 189, 190, 0, 0, 0, 0, + 190, 0, 191, 192, 191, 0, 191, 0, 0, 191, + 0, 191, 0, 192, 192, 192, 195, 192, 0, 0, + 0, 0, 192, 0, 196, 0, 195, 197, 195, 0, + 195, 0, 0, 195, 196, 195, 196, 197, 196, 197, + 197, 197, 198, 196, 0, 199, 197, 0, 200, 0, + 0, 200, 198, 0, 198, 199, 198, 199, 200, 199, + 200, 198, 200, 199, 199, 201, 202, 200, 0, 203, + 0, 0, 201, 0, 0, 0, 202, 0, 202, 203, + + 202, 203, 201, 203, 201, 202, 201, 204, 203, 0, + 206, 201, 0, 206, 0, 0, 0, 204, 0, 204, + 206, 204, 206, 0, 206, 207, 204, 0, 207, 206, + 0, 208, 0, 0, 0, 207, 0, 207, 208, 207, + 0, 208, 210, 208, 207, 208, 0, 0, 0, 0, + 208, 0, 210, 211, 210, 0, 210, 0, 0, 212, + 210, 210, 0, 211, 0, 211, 0, 211, 0, 212, + 213, 212, 211, 212, 0, 0, 212, 0, 212, 0, + 213, 214, 213, 0, 213, 0, 0, 213, 0, 213, + 0, 214, 216, 214, 0, 214, 0, 217, 217, 0, + + 214, 214, 216, 0, 216, 0, 216, 0, 217, 218, + 217, 216, 217, 0, 0, 219, 0, 217, 0, 218, + 0, 218, 0, 218, 0, 219, 0, 219, 218, 219, + 220, 221, 0, 220, 219, 0, 0, 0, 221, 0, + 220, 221, 220, 221, 220, 221, 222, 0, 0, 220, + 221, 0, 0, 0, 0, 0, 222, 223, 222, 0, + 222, 0, 0, 224, 222, 222, 0, 223, 0, 223, + 0, 223, 0, 224, 223, 224, 223, 224, 225, 0, + 224, 225, 224, 0, 226, 0, 0, 226, 225, 0, + 225, 0, 225, 0, 226, 228, 226, 225, 226, 0, + + 0, 0, 0, 226, 0, 228, 229, 228, 228, 228, + 228, 230, 0, 0, 228, 228, 229, 230, 229, 0, + 229, 0, 0, 0, 229, 229, 0, 230, 234, 230, + 0, 230, 0, 0, 234, 0, 230, 0, 234, 0, + 234, 0, 234, 236, 236, 236, 0, 234, 0, 0, + 0, 0, 244, 245, 0, 236, 236, 236, 236, 236, + 236, 236, 244, 245, 244, 245, 244, 245, 246, 245, + 0, 244, 245, 0, 247, 246, 0, 0, 246, 0, + 246, 0, 246, 0, 247, 247, 247, 246, 247, 248, + 249, 0, 0, 247, 0, 0, 0, 0, 0, 248, + + 249, 248, 249, 248, 249, 251, 251, 250, 248, 249, + 250, 0, 0, 0, 0, 0, 251, 250, 251, 250, + 251, 250, 252, 252, 0, 251, 250, 0, 253, 0, + 0, 0, 252, 0, 252, 249, 252, 0, 253, 254, + 253, 252, 253, 0, 0, 253, 0, 253, 0, 254, + 255, 254, 254, 254, 0, 0, 0, 0, 254, 0, + 255, 0, 255, 0, 255, 257, 255, 256, 256, 255, + 0, 258, 0, 0, 0, 257, 0, 257, 256, 257, + 256, 258, 256, 258, 257, 258, 259, 256, 259, 260, + 258, 260, 261, 0, 0, 261, 259, 0, 259, 260, + + 259, 260, 261, 260, 261, 259, 261, 262, 260, 0, + 0, 261, 0, 263, 0, 0, 0, 262, 0, 262, + 263, 262, 0, 263, 264, 263, 262, 263, 0, 0, + 0, 0, 263, 0, 264, 265, 264, 0, 264, 0, + 264, 0, 0, 264, 0, 265, 0, 265, 0, 265, + 266, 265, 0, 266, 265, 0, 267, 0, 0, 0, + 266, 0, 266, 0, 266, 0, 267, 270, 267, 266, + 267, 0, 0, 271, 0, 267, 0, 270, 0, 270, + 0, 270, 0, 271, 0, 271, 270, 271, 272, 273, + 0, 271, 271, 0, 0, 272, 0, 0, 272, 273, + + 272, 273, 272, 273, 274, 273, 0, 272, 273, 275, + 275, 0, 270, 0, 274, 0, 274, 0, 274, 0, + 275, 276, 275, 274, 275, 277, 276, 0, 0, 275, + 0, 276, 0, 276, 277, 276, 0, 276, 0, 0, + 276, 0, 278, 0, 277, 0, 277, 0, 277, 0, + 279, 0, 278, 277, 278, 0, 278, 0, 0, 278, + 279, 278, 279, 0, 279, 281, 281, 0, 282, 279, + 0, 0, 0, 0, 0, 281, 0, 281, 282, 281, + 282, 283, 282, 0, 281, 0, 282, 282, 0, 285, + 286, 283, 285, 283, 283, 283, 0, 0, 0, 285, + + 283, 285, 0, 285, 287, 286, 0, 287, 285, 0, + 0, 0, 0, 0, 287, 286, 287, 286, 287, 286, + 288, 288, 290, 287, 286, 0, 0, 0, 0, 0, + 0, 288, 290, 288, 290, 288, 290, 291, 0, 0, + 288, 290, 0, 0, 0, 0, 0, 291, 0, 291, + 292, 291, 0, 292, 0, 291, 291, 0, 293, 0, + 292, 294, 292, 0, 292, 0, 0, 0, 293, 292, + 293, 294, 293, 294, 0, 294, 296, 293, 295, 295, + 294, 0, 297, 0, 0, 299, 296, 0, 296, 295, + 296, 295, 297, 295, 297, 296, 297, 298, 295, 0, + + 299, 297, 0, 301, 0, 0, 0, 298, 0, 298, + 299, 298, 299, 301, 299, 301, 298, 301, 302, 299, + 0, 296, 301, 0, 303, 0, 0, 303, 302, 0, + 302, 0, 302, 0, 303, 304, 303, 302, 303, 0, + 0, 305, 0, 303, 0, 304, 0, 304, 0, 304, + 0, 305, 0, 305, 304, 305, 309, 0, 305, 0, + 305, 0, 0, 0, 0, 0, 309, 0, 309, 0, + 309, 304, 0, 314, 0, 309, 310, 310, 310, 310, + 310, 310, 310, 314, 0, 314, 0, 314, 315, 315, + 0, 314, 314, 0, 0, 0, 0, 316, 316, 315, + + 0, 315, 0, 315, 317, 317, 0, 316, 315, 316, + 0, 316, 0, 318, 310, 317, 316, 317, 0, 317, + 320, 320, 0, 318, 317, 318, 0, 318, 0, 321, + 321, 320, 318, 320, 0, 320, 0, 0, 0, 321, + 320, 321, 322, 321, 0, 322, 0, 0, 321, 0, + 323, 0, 322, 324, 322, 0, 322, 0, 0, 0, + 323, 322, 323, 324, 323, 324, 0, 324, 326, 323, + 325, 325, 324, 0, 327, 326, 0, 0, 326, 0, + 326, 325, 326, 325, 327, 325, 327, 326, 327, 328, + 325, 0, 328, 327, 0, 329, 328, 329, 0, 328, + + 0, 328, 0, 328, 0, 329, 0, 329, 328, 329, + 330, 331, 0, 330, 329, 0, 0, 0, 0, 0, + 330, 331, 330, 331, 330, 331, 332, 331, 0, 330, + 331, 0, 0, 0, 0, 0, 332, 0, 332, 0, + 332, 333, 333, 0, 332, 332, 0, 334, 0, 0, + 0, 333, 0, 333, 0, 333, 0, 334, 335, 334, + 333, 334, 0, 0, 336, 334, 334, 0, 335, 0, + 335, 0, 335, 0, 336, 335, 336, 335, 336, 337, + 341, 0, 0, 336, 0, 0, 0, 341, 0, 337, + 341, 337, 341, 337, 341, 0, 0, 343, 337, 341, + + 342, 342, 0, 342, 0, 0, 0, 343, 0, 343, + 342, 343, 342, 0, 342, 343, 343, 345, 344, 342, + 344, 0, 0, 0, 0, 0, 0, 345, 344, 345, + 344, 345, 344, 0, 347, 346, 345, 344, 346, 0, + 0, 349, 0, 348, 347, 346, 347, 346, 347, 346, + 348, 347, 0, 347, 346, 0, 349, 0, 0, 0, + 348, 0, 348, 0, 348, 0, 349, 351, 349, 348, + 349, 0, 0, 0, 0, 349, 0, 351, 352, 351, + 0, 351, 0, 0, 353, 351, 351, 0, 352, 0, + 352, 0, 352, 0, 353, 355, 353, 352, 353, 0, + + 0, 0, 0, 353, 0, 355, 356, 355, 0, 355, + 0, 355, 357, 356, 355, 0, 356, 0, 356, 0, + 356, 0, 357, 358, 357, 356, 357, 0, 0, 0, + 0, 357, 0, 358, 0, 358, 360, 358, 0, 361, + 0, 358, 358, 360, 0, 0, 360, 362, 360, 361, + 360, 361, 362, 361, 0, 360, 0, 362, 361, 362, + 363, 362, 0, 0, 0, 0, 362, 0, 0, 0, + 363, 365, 363, 0, 363, 0, 0, 367, 365, 363, + 0, 365, 363, 365, 0, 365, 0, 367, 0, 367, + 365, 367, 368, 369, 0, 368, 367, 0, 0, 0, + + 0, 0, 368, 369, 368, 369, 368, 369, 371, 369, + 0, 368, 369, 0, 379, 0, 0, 0, 371, 0, + 371, 0, 371, 0, 379, 0, 379, 371, 379, 380, + 380, 381, 381, 379, 0, 0, 0, 0, 0, 380, + 382, 380, 381, 380, 381, 0, 381, 0, 380, 0, + 382, 381, 382, 371, 382, 384, 0, 0, 382, 382, + 0, 385, 0, 0, 0, 384, 0, 384, 0, 384, + 0, 385, 386, 385, 384, 385, 0, 0, 387, 385, + 385, 387, 386, 0, 386, 0, 386, 0, 387, 388, + 387, 386, 387, 0, 0, 389, 388, 387, 0, 388, + + 0, 388, 0, 388, 0, 389, 390, 389, 388, 389, + 0, 0, 0, 0, 389, 0, 390, 391, 390, 391, + 390, 0, 0, 392, 390, 390, 0, 391, 0, 391, + 0, 391, 0, 392, 0, 392, 391, 392, 0, 0, + 393, 392, 392, 393, 0, 0, 394, 0, 394, 0, + 393, 0, 393, 0, 393, 0, 394, 0, 394, 393, + 394, 395, 395, 396, 0, 394, 0, 0, 0, 0, + 0, 0, 395, 396, 395, 396, 395, 396, 397, 398, + 0, 395, 396, 0, 0, 397, 0, 0, 397, 398, + 397, 398, 397, 398, 399, 0, 398, 397, 398, 400, + + 400, 399, 0, 0, 399, 0, 399, 0, 399, 0, + 400, 404, 400, 399, 400, 404, 0, 405, 0, 400, + 0, 404, 0, 404, 405, 404, 0, 405, 0, 405, + 404, 405, 406, 407, 406, 0, 405, 0, 0, 0, + 0, 0, 406, 407, 406, 407, 406, 407, 0, 0, + 407, 406, 407, 408, 409, 409, 408, 0, 0, 0, + 0, 0, 0, 408, 409, 408, 409, 408, 409, 410, + 0, 0, 408, 409, 0, 0, 0, 411, 0, 410, + 411, 410, 0, 410, 0, 410, 0, 411, 410, 411, + 412, 411, 0, 0, 0, 0, 411, 0, 413, 0, + + 412, 415, 412, 0, 412, 413, 0, 412, 413, 412, + 413, 415, 413, 415, 0, 415, 418, 413, 416, 416, + 415, 0, 419, 0, 0, 0, 418, 0, 418, 416, + 418, 416, 419, 416, 419, 418, 419, 420, 416, 0, + 421, 419, 0, 421, 0, 0, 0, 420, 423, 420, + 421, 420, 421, 0, 421, 420, 420, 0, 423, 421, + 423, 0, 423, 424, 424, 0, 425, 423, 423, 426, + 0, 0, 0, 424, 0, 424, 425, 424, 425, 426, + 425, 426, 424, 426, 428, 425, 428, 430, 426, 0, + 431, 0, 0, 0, 428, 0, 428, 430, 428, 430, + + 431, 430, 431, 428, 431, 440, 430, 431, 441, 431, + 0, 0, 0, 0, 0, 440, 0, 440, 441, 440, + 441, 442, 441, 440, 440, 0, 441, 441, 442, 444, + 0, 442, 0, 442, 0, 442, 0, 0, 0, 444, + 442, 444, 445, 444, 0, 445, 0, 0, 444, 0, + 446, 0, 445, 447, 445, 0, 445, 0, 0, 0, + 446, 445, 446, 447, 446, 447, 448, 447, 0, 446, + 0, 0, 447, 448, 449, 0, 448, 450, 448, 0, + 448, 0, 0, 0, 449, 448, 449, 450, 449, 450, + 451, 450, 0, 449, 0, 0, 450, 451, 453, 0, + + 451, 452, 451, 452, 451, 0, 0, 0, 453, 451, + 453, 452, 453, 452, 454, 452, 0, 453, 0, 0, + 452, 0, 0, 0, 454, 455, 454, 0, 454, 0, + 0, 0, 454, 454, 0, 455, 456, 455, 0, 455, + 0, 0, 457, 455, 455, 0, 456, 0, 456, 0, + 456, 0, 457, 458, 457, 456, 457, 0, 0, 462, + 0, 457, 0, 458, 0, 458, 462, 458, 0, 462, + 463, 462, 458, 462, 0, 0, 0, 0, 462, 0, + 463, 464, 463, 0, 463, 0, 0, 465, 463, 463, + 0, 464, 0, 464, 0, 464, 0, 465, 466, 465, + + 464, 465, 0, 0, 467, 0, 465, 467, 466, 0, + 466, 0, 466, 0, 467, 466, 467, 466, 467, 468, + 469, 469, 0, 467, 0, 0, 0, 0, 0, 468, + 469, 468, 469, 468, 469, 470, 471, 0, 468, 469, + 0, 0, 0, 0, 0, 470, 471, 470, 471, 470, + 471, 473, 475, 0, 470, 471, 0, 0, 0, 0, + 0, 473, 475, 473, 475, 473, 475, 0, 0, 476, + 473, 475, 477, 476, 0, 478, 0, 0, 0, 476, + 470, 476, 477, 476, 477, 478, 477, 478, 476, 478, + 480, 477, 0, 480, 478, 0, 481, 0, 0, 481, + + 480, 0, 480, 0, 480, 0, 481, 0, 481, 480, + 481, 483, 0, 494, 483, 481, 485, 485, 0, 0, + 0, 483, 0, 483, 0, 483, 0, 485, 494, 485, + 483, 485, 0, 0, 495, 0, 485, 0, 494, 0, + 494, 495, 494, 0, 495, 0, 495, 494, 495, 496, + 496, 0, 0, 495, 0, 498, 0, 0, 0, 496, + 0, 496, 0, 496, 0, 498, 499, 498, 496, 498, + 0, 498, 0, 0, 498, 0, 499, 0, 499, 500, + 499, 0, 500, 0, 499, 499, 0, 501, 0, 500, + 502, 500, 0, 500, 0, 0, 0, 501, 500, 501, + + 502, 501, 502, 502, 502, 503, 501, 0, 504, 502, + 0, 504, 0, 0, 0, 503, 505, 503, 504, 503, + 504, 0, 504, 0, 503, 0, 505, 504, 505, 506, + 505, 0, 507, 0, 0, 505, 506, 0, 0, 506, + 0, 506, 507, 506, 507, 0, 507, 512, 506, 0, + 512, 507, 0, 513, 0, 0, 0, 512, 0, 512, + 0, 512, 0, 513, 514, 513, 512, 513, 0, 0, + 515, 0, 513, 0, 514, 0, 514, 0, 514, 0, + 515, 516, 515, 514, 515, 0, 0, 0, 0, 515, + 0, 516, 518, 516, 0, 516, 518, 0, 520, 516, + + 516, 0, 518, 0, 518, 524, 518, 0, 520, 522, + 520, 518, 520, 0, 0, 0, 522, 520, 0, 522, + 524, 522, 0, 522, 0, 0, 525, 0, 522, 0, + 524, 0, 524, 0, 524, 0, 525, 527, 525, 524, + 525, 0, 0, 529, 0, 525, 0, 527, 0, 527, + 0, 527, 0, 529, 537, 529, 527, 529, 0, 0, + 0, 0, 529, 0, 537, 538, 537, 0, 537, 0, + 0, 537, 0, 537, 0, 538, 539, 538, 538, 538, + 0, 0, 541, 0, 538, 0, 539, 0, 539, 0, + 539, 0, 541, 542, 541, 539, 541, 0, 0, 0, + + 0, 541, 0, 542, 543, 542, 543, 542, 0, 0, + 542, 0, 542, 0, 543, 544, 543, 0, 543, 0, + 544, 545, 0, 543, 0, 544, 0, 544, 0, 544, + 0, 545, 0, 545, 544, 545, 546, 547, 546, 0, + 545, 0, 0, 0, 0, 0, 546, 547, 546, 547, + 546, 547, 552, 553, 0, 546, 547, 0, 0, 0, + 553, 0, 552, 553, 552, 553, 552, 553, 552, 555, + 558, 552, 553, 0, 0, 0, 555, 0, 0, 555, + 558, 555, 558, 555, 558, 560, 0, 0, 555, 558, + 0, 562, 0, 0, 0, 560, 0, 560, 560, 560, + + 0, 562, 564, 562, 560, 562, 0, 0, 0, 562, + 562, 0, 564, 0, 564, 0, 564, 570, 570, 570, + 0, 564, 0, 0, 0, 0, 572, 573, 0, 570, + 570, 570, 570, 570, 570, 570, 572, 573, 572, 573, + 572, 573, 574, 575, 0, 572, 573, 0, 0, 572, + 0, 0, 574, 575, 574, 575, 574, 575, 576, 577, + 0, 574, 575, 0, 0, 0, 0, 0, 576, 577, + 576, 577, 576, 577, 578, 579, 577, 576, 577, 0, + 0, 0, 579, 0, 578, 579, 578, 579, 578, 579, + 583, 0, 0, 578, 579, 0, 0, 0, 584, 0, + + 583, 0, 583, 0, 583, 0, 586, 0, 584, 583, + 584, 584, 584, 0, 589, 0, 586, 584, 586, 0, + 586, 589, 591, 0, 589, 586, 589, 0, 589, 591, + 592, 0, 591, 589, 591, 0, 591, 592, 0, 0, + 592, 591, 592, 0, 592, 0, 0, 601, 602, 592, + 599, 599, 599, 599, 599, 599, 599, 601, 602, 601, + 602, 601, 602, 603, 0, 0, 601, 602, 0, 0, + 0, 604, 0, 603, 0, 603, 0, 603, 0, 0, + 0, 604, 603, 604, 608, 604, 0, 0, 599, 604, + 604, 0, 610, 0, 608, 613, 608, 0, 608, 610, + + 0, 0, 610, 608, 610, 613, 610, 613, 615, 613, + 615, 610, 0, 613, 613, 0, 0, 0, 615, 616, + 615, 0, 615, 616, 0, 0, 0, 615, 0, 616, + 0, 616, 0, 616, 623, 623, 623, 0, 616, 0, + 0, 0, 0, 624, 625, 0, 623, 623, 623, 623, + 623, 623, 623, 624, 625, 624, 625, 624, 625, 629, + 0, 624, 624, 625, 0, 631, 0, 625, 0, 629, + 0, 629, 0, 629, 0, 631, 634, 631, 629, 631, + 0, 0, 636, 631, 631, 0, 634, 0, 634, 0, + 634, 0, 636, 637, 636, 634, 636, 0, 0, 634, + + 637, 636, 0, 637, 0, 637, 644, 637, 643, 643, + 0, 0, 637, 0, 0, 0, 644, 648, 644, 643, + 644, 643, 0, 643, 0, 644, 0, 648, 643, 648, + 0, 648, 651, 0, 0, 653, 648, 0, 653, 0, + 648, 0, 651, 0, 651, 653, 651, 653, 0, 653, + 0, 651, 0, 0, 653, 658, 658, 658, 0, 0, + 0, 0, 0, 0, 659, 661, 0, 658, 658, 658, + 658, 658, 658, 658, 659, 661, 659, 661, 659, 661, + 664, 667, 0, 659, 661, 0, 659, 0, 0, 0, + 664, 667, 664, 667, 664, 667, 664, 671, 0, 664, + + 667, 0, 0, 0, 0, 0, 0, 671, 0, 671, + 0, 671, 0, 0, 0, 0, 671, 675, 675, 675, + 675, 675, 675, 675, 675, 675, 675, 675, 675, 676, + 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, + 676, 677, 677, 677, 677, 677, 677, 677, 677, 677, + 677, 677, 677, 678, 678, 678, 678, 678, 678, 678, + 678, 678, 678, 678, 678, 679, 679, 679, 679, 679, + 679, 679, 679, 679, 679, 679, 679, 680, 680, 680, + 0, 680, 680, 680, 680, 680, 680, 680, 680, 681, + 681, 0, 0, 681, 0, 681, 682, 0, 682, 683, + + 683, 0, 683, 683, 684, 684, 0, 684, 684, 684, + 0, 684, 684, 684, 684, 684, 685, 685, 685, 0, + 685, 685, 685, 685, 685, 685, 685, 685, 686, 686, + 686, 686, 686, 686, 686, 686, 0, 686, 686, 687, + 0, 0, 687, 0, 687, 687, 687, 687, 687, 687, + 688, 688, 0, 688, 688, 689, 689, 0, 689, 689, + 690, 690, 0, 690, 690, 674, 674, 674, 674, 674, + 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, + 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, + 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, + + 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, + 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, + 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, + 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, + 674, 674, 674, 674 + } ; + +extern int yy_flex_debug; +int yy_flex_debug = 1; + +static yyconst short int yy_rule_linenum[123] = + { 0, + 101, 104, 106, 107, 108, 111, 113, 114, 115, 127, + 134, 141, 147, 156, 164, 172, 173, 175, 194, 200, + 207, 214, 221, 231, 265, 272, 273, 274, 275, 283, + 284, 285, 286, 287, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + + 366, 367, 372, 373, 378, 379, 380, 383, 389, 396, + 405, 416, 422, 424, 425, 427, 429, 431, 444, 450, + 456, 464 + } ; + +static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; +static char *yy_full_match; +static int yy_lp; +#define REJECT \ +{ \ +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \ +yy_cp = yy_full_match; /* restore poss. backed-over text */ \ +++yy_lp; \ +goto find_rule; \ +} +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "asn1p_l.l" +#define INITIAL 0 +#line 2 "asn1p_l.l" + +#include +#include +#include + +#include "asn1parser.h" +#include "asn1p_y.h" + +int asn1p_lex(void); +void asn1p_lexer_hack_push_opaque_state(void); /* Used in .y */ +void asn1p_lexer_hack_enable_with_syntax(void); /* Used in .y */ + +#define YY_FATAL_ERROR(msg) do { \ + fprintf(stderr, \ + "lexer error at line %d, " \ + "text \"%s\"\n", \ + yylineno, yytext); \ + exit(1); \ + } while(0) + +int asn1p_lexer_pedantic_1990 = 0; +int asn1p_lexer_types_year = 0; +int asn1p_lexer_constructs_year = 0; +static int _check_dashes(char *ptr); +static asn1_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */ + +/* + * Check that the type is defined in the year of the standard choosen. + */ +#define TYPE_LIFETIME(fyr, lyr) \ + (!asn1p_lexer_types_year \ + || (fyr && fyr <= asn1p_lexer_types_year) \ + || (lyr && lyr > asn1p_lexer_types_year)) + +/* + * Check the the construction (or concept, i.e. CLASS) is defined in + * a given year. + */ +#define CONSTRUCT_LIFETIME(fyr, lyr) \ + (!asn1p_lexer_constructs_year \ + || (fyr && fyr <= asn1p_lexer_constructs_year) \ + || (lyr && lyr > asn1p_lexer_constructs_year)) + +/* + * Make sure that the label is compliant with the naming rules. + */ +#define CHECK_DASHES do { \ + if(_check_dashes(yytext)) { \ + fprintf(stderr, \ + "%s: Identifier format invalid: " \ + "Improper dash location\n", yytext); \ + return -1; \ + } } while(0) + +/* + * Append quoted string. + */ +#define QAPPEND(text, tlen) do { \ + char *prev_text = asn1p_lval.tv_opaque.buf; \ + int prev_len = asn1p_lval.tv_opaque.len; \ + char *p; \ + \ + p = malloc((tlen) + prev_len + 1); \ + if(p == NULL) return -1; \ + \ + if(prev_text) memcpy(p, prev_text, prev_len); \ + memcpy(p + prev_len, text, tlen); \ + p[prev_len + (tlen)] = '\0'; \ + \ + free(asn1p_lval.tv_opaque.buf); \ + asn1p_lval.tv_opaque.buf = p; \ + asn1p_lval.tv_opaque.len = (tlen) + prev_len; \ + } while(0) + +#define YY_NEVER_INTERACTIVE 1 +#define YY_NO_INPUT 1 +#define YY_NO_UNPUT 1 +#define YY_STACK_USED 1 +/* Performance penalty is OK */ +/* Controlled from within application */ +#define dash_comment 1 + +#define cpp_comment 2 + +#define quoted 3 + +#define opaque 4 + +#define with_syntax 5 + +/* Newline */ +/* White-space */ +#line 1806 "lex.yy.c" + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap YY_PROTO(( void )); +#else +extern int yywrap YY_PROTO(( void )); +#endif +#endif + +#ifndef YY_NO_UNPUT +static void yyunput YY_PROTO(( int c, char *buf_ptr )); +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen YY_PROTO(( yyconst char * )); +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput YY_PROTO(( void )); +#else +static int input YY_PROTO(( void )); +#endif +#endif + +#if YY_STACK_USED +static int yy_start_stack_ptr = 0; +static int yy_start_stack_depth = 0; +static int *yy_start_stack = 0; +#ifndef YY_NO_PUSH_STATE +static void yy_push_state YY_PROTO(( int new_state )); +#endif +#ifndef YY_NO_POP_STATE +static void yy_pop_state YY_PROTO(( void )); +#endif +#ifndef YY_NO_TOP_STATE +static int yy_top_state YY_PROTO(( void )); +#endif + +#else +#define YY_NO_PUSH_STATE 1 +#define YY_NO_POP_STATE 1 +#define YY_NO_TOP_STATE 1 +#endif + +#ifdef YY_MALLOC_DECL +YY_MALLOC_DECL +#else +#if __STDC__ +#ifndef __cplusplus +#include +#endif +#else +/* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ +#endif +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ + +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL int yylex YY_PROTO(( void )) +#endif + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +YY_DECL + { + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 99 "asn1p_l.l" + + +#line 1960 "lex.yy.c" + + if ( yy_init ) + { + yy_init = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yy_start ) + yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_load_buffer_state(); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yy_start; + yy_state_ptr = yy_state_buf; + *yy_state_ptr++ = yy_current_state; +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 675 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *yy_state_ptr++ = yy_current_state; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 4166 ); + +yy_find_action: + yy_current_state = *--yy_state_ptr; + yy_lp = yy_accept[yy_current_state]; +find_rule: /* we branch to this label when backing up */ + for ( ; ; ) /* until we find what rule we matched */ + { + if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] ) + { + yy_act = yy_acclist[yy_lp]; + { + yy_full_match = yy_cp; + break; + } + } + --yy_cp; + yy_current_state = *--yy_state_ptr; + yy_lp = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + if ( yy_act != YY_END_OF_BUFFER ) + { + int yyl; + for ( yyl = 0; yyl < yyleng; ++yyl ) + if ( yytext[yyl] == '\n' ) + ++yylineno; + } + +do_action: /* This label is used only to access EOF actions. */ + + if ( yy_flex_debug ) + { + if ( yy_act == 0 ) + fprintf( stderr, "--scanner backing up\n" ); + else if ( yy_act < 123 ) + fprintf( stderr, "--accepting rule at line %d (\"%s\")\n", + yy_rule_linenum[yy_act], yytext ); + else if ( yy_act == 123 ) + fprintf( stderr, "--accepting default rule (\"%s\")\n", + yytext ); + else if ( yy_act == 124 ) + fprintf( stderr, "--(end of buffer or a NUL)\n" ); + else + fprintf( stderr, "--EOF (start condition %d)\n", YY_START ); + } + + switch ( yy_act ) + { /* beginning of action switch */ +case 1: +YY_RULE_SETUP +#line 101 "asn1p_l.l" +yy_push_state(dash_comment); + YY_BREAK + +case 2: +YY_RULE_SETUP +#line 104 "asn1p_l.l" +yy_pop_state(); + YY_BREAK +case 3: +YY_RULE_SETUP +#line 106 "asn1p_l.l" +yy_pop_state(); /* End of comment */ + YY_BREAK +case 4: +YY_RULE_SETUP +#line 107 "asn1p_l.l" +/* Eat single dash */ + YY_BREAK +case 5: +YY_RULE_SETUP +#line 108 "asn1p_l.l" +/* Eat */ + YY_BREAK + +case 6: +YY_RULE_SETUP +#line 111 "asn1p_l.l" +yy_push_state(cpp_comment); + YY_BREAK + +case 7: +YY_RULE_SETUP +#line 113 "asn1p_l.l" +/* Eat */ + YY_BREAK +case 8: +YY_RULE_SETUP +#line 114 "asn1p_l.l" +yy_pop_state(); + YY_BREAK +case 9: +YY_RULE_SETUP +#line 115 "asn1p_l.l" +/* Eat */ + YY_BREAK + +/* + * This is state is being set from corresponding .y module when + * higher-level data is necessary to make proper parsing of the + * underlying data. Thus, we enter the state and save + * everything for later processing. + */ + +case 10: +YY_RULE_SETUP +#line 127 "asn1p_l.l" +{ + yy_push_state(opaque); + asn1p_lval.tv_opaque.buf = strdup(yytext); + asn1p_lval.tv_opaque.len = yyleng; + return TOK_opaque; + } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 134 "asn1p_l.l" +{ + yy_pop_state(); + asn1p_lval.tv_opaque.buf = strdup(yytext); + asn1p_lval.tv_opaque.len = yyleng; + return TOK_opaque; + } + YY_BREAK +case 12: +YY_RULE_SETUP +#line 141 "asn1p_l.l" +{ + asn1p_lval.tv_opaque.buf = strdup(yytext); + asn1p_lval.tv_opaque.len = yyleng; + return TOK_opaque; + } + YY_BREAK +case 13: +YY_RULE_SETUP +#line 147 "asn1p_l.l" +{ + fprintf(stderr, + "ASN.1 Parser syncronization failure: " + "\"%s\" at line %d must not appear " + "inside value definition\n", + yytext, yylineno); + return -1; + } + YY_BREAK +case 14: +YY_RULE_SETUP +#line 156 "asn1p_l.l" +{ + asn1p_lval.tv_opaque.buf = strdup(yytext); + asn1p_lval.tv_opaque.len = yyleng; + return TOK_opaque; + } + YY_BREAK + +case 15: +YY_RULE_SETUP +#line 164 "asn1p_l.l" +{ + asn1p_lval.tv_opaque.buf = 0; + asn1p_lval.tv_opaque.len = 0; + QAPPEND(yytext+1, yyleng-1); + yy_push_state(quoted); + } + YY_BREAK + +case 16: +YY_RULE_SETUP +#line 172 "asn1p_l.l" +{ QAPPEND(yytext, yyleng-1); } /* Add a single quote */ + YY_BREAK +case 17: +YY_RULE_SETUP +#line 173 "asn1p_l.l" +{ QAPPEND(yytext, yyleng); } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 175 "asn1p_l.l" +{ + yy_pop_state(); + /* Do not append last quote: + // QAPPEND(yytext, yyleng); */ + + if(asn1p_lexer_pedantic_1990 + && strchr(yytext, '\n')) { + fprintf(stderr, "%s: " + "Newlines are prohibited by ASN.1:1990\n", + asn1p_lval.tv_opaque.buf); + return -1; + } + + return TOK_cstring; + } + YY_BREAK + +case 19: +YY_RULE_SETUP +#line 194 "asn1p_l.l" +{ + /* " \t\r\n" weren't allowed in ASN.1:1990. */ + asn1p_lval.tv_str = yytext; + return TOK_hstring; + } + YY_BREAK +case 20: +YY_RULE_SETUP +#line 200 "asn1p_l.l" +{ + /* " \t\r\n" weren't allowed in ASN.1:1990. */ + asn1p_lval.tv_str = strdup(yytext); + return TOK_bstring; + } + YY_BREAK +case 21: +YY_RULE_SETUP +#line 207 "asn1p_l.l" +{ + asn1p_lval.a_int = asn1p_atoi(yytext); + if(errno == ERANGE) + return -1; + return TOK_number_negative; + } + YY_BREAK +case 22: +YY_RULE_SETUP +#line 214 "asn1p_l.l" +{ + asn1p_lval.a_int = asn1p_atoi(yytext); + if(errno == ERANGE) + return -1; + return TOK_number; + } + YY_BREAK +case 23: +YY_RULE_SETUP +#line 221 "asn1p_l.l" +{ + asn1p_lval.a_int = asn1p_atoi(yytext); + if(errno == ERANGE) + return -1; + return TOK_number; + } + YY_BREAK +/* + * Tags + */ +case 24: +YY_RULE_SETUP +#line 231 "asn1p_l.l" +{ + char *p; + memset(&asn1p_lval.a_tag, 0, sizeof(asn1p_lval.a_tag)); + switch(yytext[1]) { + case 'U': + asn1p_lval.a_tag.tag_class = TC_UNIVERSAL; + p = yytext + sizeof("UNIVERSAL") + 1; + break; + case 'A': + asn1p_lval.a_tag.tag_class = TC_APPLICATION; + p = yytext + sizeof("APPLICATION") + 1; + break; + case 'P': + asn1p_lval.a_tag.tag_class = TC_PRIVATE; + p = yytext + sizeof("PRIVATE") + 1; + break; + default: + assert(yytext[1] >= '0' && yytext[1] <= '9'); + asn1p_lval.a_tag.tag_class = TC_CONTEXT_SPECIFIC; + p = yytext + 1; + break; + } + asn1p_lval.a_tag.tag_value = asn1p_atoi(p); + if(*p == '0' && asn1p_lval.a_tag.tag_value) { + fprintf(stderr, + "Tag value at line %d " + "cannot start with zero " + "and have multiple digits: \"%s\"\n", + yylineno, yytext); + return -1; + } + return TOK_tag; + } + YY_BREAK +case 25: +YY_RULE_SETUP +#line 265 "asn1p_l.l" +{ + fprintf(stderr, + "Unsupported tag syntax at line %d: \"%s\"\n", + yylineno, yytext); + return -1; + } + YY_BREAK +case 26: +YY_RULE_SETUP +#line 272 "asn1p_l.l" +return TOK_ABSENT; + YY_BREAK +case 27: +YY_RULE_SETUP +#line 273 "asn1p_l.l" +return TOK_ABSTRACT_SYNTAX; + YY_BREAK +case 28: +YY_RULE_SETUP +#line 274 "asn1p_l.l" +return TOK_ALL; + YY_BREAK +case 29: +YY_RULE_SETUP +#line 275 "asn1p_l.l" +{ + /* Appeared in 1990, removed in 1997 */ + if(TYPE_LIFETIME(1990, 1997)) + return TOK_ANY; + fprintf(stderr, "Keyword \"%s\" at line %d " + "is obsolete\n", yytext, yylineno); + REJECT; + } + YY_BREAK +case 30: +YY_RULE_SETUP +#line 283 "asn1p_l.l" +return TOK_APPLICATION; + YY_BREAK +case 31: +YY_RULE_SETUP +#line 284 "asn1p_l.l" +return TOK_AUTOMATIC; + YY_BREAK +case 32: +YY_RULE_SETUP +#line 285 "asn1p_l.l" +return TOK_BEGIN; + YY_BREAK +case 33: +YY_RULE_SETUP +#line 286 "asn1p_l.l" +return TOK_BIT; + YY_BREAK +case 34: +YY_RULE_SETUP +#line 287 "asn1p_l.l" +{ + if(TYPE_LIFETIME(1994, 0)) + return TOK_BMPString; + REJECT; + } + YY_BREAK +case 35: +YY_RULE_SETUP +#line 292 "asn1p_l.l" +return TOK_BOOLEAN; + YY_BREAK +case 36: +YY_RULE_SETUP +#line 293 "asn1p_l.l" +return TOK_BY; + YY_BREAK +case 37: +YY_RULE_SETUP +#line 294 "asn1p_l.l" +return TOK_CHARACTER; + YY_BREAK +case 38: +YY_RULE_SETUP +#line 295 "asn1p_l.l" +return TOK_CHOICE; + YY_BREAK +case 39: +YY_RULE_SETUP +#line 296 "asn1p_l.l" +return TOK_CLASS; + YY_BREAK +case 40: +YY_RULE_SETUP +#line 297 "asn1p_l.l" +return TOK_COMPONENT; + YY_BREAK +case 41: +YY_RULE_SETUP +#line 298 "asn1p_l.l" +return TOK_COMPONENTS; + YY_BREAK +case 42: +YY_RULE_SETUP +#line 299 "asn1p_l.l" +return TOK_CONSTRAINED; + YY_BREAK +case 43: +YY_RULE_SETUP +#line 300 "asn1p_l.l" +return TOK_CONTAINING; + YY_BREAK +case 44: +YY_RULE_SETUP +#line 301 "asn1p_l.l" +return TOK_DEFAULT; + YY_BREAK +case 45: +YY_RULE_SETUP +#line 302 "asn1p_l.l" +{ + /* Appeared in 1990, removed in 1997 */ + if(TYPE_LIFETIME(1990, 1997)) + return TOK_DEFINED; + fprintf(stderr, "Keyword \"%s\" at line %d " + "is obsolete\n", yytext, yylineno); + /* Deprecated since */ + REJECT; + } + YY_BREAK +case 46: +YY_RULE_SETUP +#line 311 "asn1p_l.l" +return TOK_DEFINITIONS; + YY_BREAK +case 47: +YY_RULE_SETUP +#line 312 "asn1p_l.l" +return TOK_EMBEDDED; + YY_BREAK +case 48: +YY_RULE_SETUP +#line 313 "asn1p_l.l" +return TOK_ENCODED; + YY_BREAK +case 49: +YY_RULE_SETUP +#line 314 "asn1p_l.l" +return TOK_END; + YY_BREAK +case 50: +YY_RULE_SETUP +#line 315 "asn1p_l.l" +return TOK_ENUMERATED; + YY_BREAK +case 51: +YY_RULE_SETUP +#line 316 "asn1p_l.l" +return TOK_EXCEPT; + YY_BREAK +case 52: +YY_RULE_SETUP +#line 317 "asn1p_l.l" +return TOK_EXPLICIT; + YY_BREAK +case 53: +YY_RULE_SETUP +#line 318 "asn1p_l.l" +return TOK_EXPORTS; + YY_BREAK +case 54: +YY_RULE_SETUP +#line 319 "asn1p_l.l" +return TOK_EXTENSIBILITY; + YY_BREAK +case 55: +YY_RULE_SETUP +#line 320 "asn1p_l.l" +return TOK_EXTERNAL; + YY_BREAK +case 56: +YY_RULE_SETUP +#line 321 "asn1p_l.l" +return TOK_FALSE; + YY_BREAK +case 57: +YY_RULE_SETUP +#line 322 "asn1p_l.l" +return TOK_FROM; + YY_BREAK +case 58: +YY_RULE_SETUP +#line 323 "asn1p_l.l" +return TOK_GeneralizedTime; + YY_BREAK +case 59: +YY_RULE_SETUP +#line 324 "asn1p_l.l" +return TOK_GeneralString; + YY_BREAK +case 60: +YY_RULE_SETUP +#line 325 "asn1p_l.l" +return TOK_GraphicString; + YY_BREAK +case 61: +YY_RULE_SETUP +#line 326 "asn1p_l.l" +return TOK_IA5String; + YY_BREAK +case 62: +YY_RULE_SETUP +#line 327 "asn1p_l.l" +return TOK_IDENTIFIER; + YY_BREAK +case 63: +YY_RULE_SETUP +#line 328 "asn1p_l.l" +return TOK_IMPLICIT; + YY_BREAK +case 64: +YY_RULE_SETUP +#line 329 "asn1p_l.l" +return TOK_IMPLIED; + YY_BREAK +case 65: +YY_RULE_SETUP +#line 330 "asn1p_l.l" +return TOK_IMPORTS; + YY_BREAK +case 66: +YY_RULE_SETUP +#line 331 "asn1p_l.l" +return TOK_INCLUDES; + YY_BREAK +case 67: +YY_RULE_SETUP +#line 332 "asn1p_l.l" +return TOK_INSTANCE; + YY_BREAK +case 68: +YY_RULE_SETUP +#line 333 "asn1p_l.l" +return TOK_INTEGER; + YY_BREAK +case 69: +YY_RULE_SETUP +#line 334 "asn1p_l.l" +return TOK_INTERSECTION; + YY_BREAK +case 70: +YY_RULE_SETUP +#line 335 "asn1p_l.l" +return TOK_ISO646String; + YY_BREAK +case 71: +YY_RULE_SETUP +#line 336 "asn1p_l.l" +return TOK_MAX; + YY_BREAK +case 72: +YY_RULE_SETUP +#line 337 "asn1p_l.l" +return TOK_MIN; + YY_BREAK +case 73: +YY_RULE_SETUP +#line 338 "asn1p_l.l" +return TOK_MINUS_INFINITY; + YY_BREAK +case 74: +YY_RULE_SETUP +#line 339 "asn1p_l.l" +return TOK_NULL; + YY_BREAK +case 75: +YY_RULE_SETUP +#line 340 "asn1p_l.l" +return TOK_NumericString; + YY_BREAK +case 76: +YY_RULE_SETUP +#line 341 "asn1p_l.l" +return TOK_OBJECT; + YY_BREAK +case 77: +YY_RULE_SETUP +#line 342 "asn1p_l.l" +return TOK_ObjectDescriptor; + YY_BREAK +case 78: +YY_RULE_SETUP +#line 343 "asn1p_l.l" +return TOK_OCTET; + YY_BREAK +case 79: +YY_RULE_SETUP +#line 344 "asn1p_l.l" +return TOK_OF; + YY_BREAK +case 80: +YY_RULE_SETUP +#line 345 "asn1p_l.l" +return TOK_OPTIONAL; + YY_BREAK +case 81: +YY_RULE_SETUP +#line 346 "asn1p_l.l" +return TOK_PATTERN; + YY_BREAK +case 82: +YY_RULE_SETUP +#line 347 "asn1p_l.l" +return TOK_PDV; + YY_BREAK +case 83: +YY_RULE_SETUP +#line 348 "asn1p_l.l" +return TOK_PLUS_INFINITY; + YY_BREAK +case 84: +YY_RULE_SETUP +#line 349 "asn1p_l.l" +return TOK_PRESENT; + YY_BREAK +case 85: +YY_RULE_SETUP +#line 350 "asn1p_l.l" +return TOK_PrintableString; + YY_BREAK +case 86: +YY_RULE_SETUP +#line 351 "asn1p_l.l" +return TOK_PRIVATE; + YY_BREAK +case 87: +YY_RULE_SETUP +#line 352 "asn1p_l.l" +return TOK_REAL; + YY_BREAK +case 88: +YY_RULE_SETUP +#line 353 "asn1p_l.l" +return TOK_RELATIVE_OID; + YY_BREAK +case 89: +YY_RULE_SETUP +#line 354 "asn1p_l.l" +return TOK_SEQUENCE; + YY_BREAK +case 90: +YY_RULE_SETUP +#line 355 "asn1p_l.l" +return TOK_SET; + YY_BREAK +case 91: +YY_RULE_SETUP +#line 356 "asn1p_l.l" +return TOK_SIZE; + YY_BREAK +case 92: +YY_RULE_SETUP +#line 357 "asn1p_l.l" +return TOK_STRING; + YY_BREAK +case 93: +YY_RULE_SETUP +#line 358 "asn1p_l.l" +return TOK_SYNTAX; + YY_BREAK +case 94: +YY_RULE_SETUP +#line 359 "asn1p_l.l" +return TOK_T61String; + YY_BREAK +case 95: +YY_RULE_SETUP +#line 360 "asn1p_l.l" +return TOK_TAGS; + YY_BREAK +case 96: +YY_RULE_SETUP +#line 361 "asn1p_l.l" +return TOK_TeletexString; + YY_BREAK +case 97: +YY_RULE_SETUP +#line 362 "asn1p_l.l" +return TOK_TRUE; + YY_BREAK +case 98: +YY_RULE_SETUP +#line 363 "asn1p_l.l" +return TOK_TYPE_IDENTIFIER; + YY_BREAK +case 99: +YY_RULE_SETUP +#line 364 "asn1p_l.l" +return TOK_UNION; + YY_BREAK +case 100: +YY_RULE_SETUP +#line 365 "asn1p_l.l" +return TOK_UNIQUE; + YY_BREAK +case 101: +YY_RULE_SETUP +#line 366 "asn1p_l.l" +return TOK_UNIVERSAL; + YY_BREAK +case 102: +YY_RULE_SETUP +#line 367 "asn1p_l.l" +{ + if(TYPE_LIFETIME(1994, 0)) + return TOK_UniversalString; + REJECT; + } + YY_BREAK +case 103: +YY_RULE_SETUP +#line 372 "asn1p_l.l" +return TOK_UTCTime; + YY_BREAK +case 104: +YY_RULE_SETUP +#line 373 "asn1p_l.l" +{ + if(TYPE_LIFETIME(1994, 0)) + return TOK_UTF8String; + REJECT; + } + YY_BREAK +case 105: +YY_RULE_SETUP +#line 378 "asn1p_l.l" +return TOK_VideotexString; + YY_BREAK +case 106: +YY_RULE_SETUP +#line 379 "asn1p_l.l" +return TOK_VisibleString; + YY_BREAK +case 107: +YY_RULE_SETUP +#line 380 "asn1p_l.l" +return TOK_WITH; + YY_BREAK +case 108: +YY_RULE_SETUP +#line 383 "asn1p_l.l" +{ + CHECK_DASHES; + asn1p_lval.tv_str = strdup(yytext); + return TOK_typefieldreference; + } + YY_BREAK +case 109: +YY_RULE_SETUP +#line 389 "asn1p_l.l" +{ + CHECK_DASHES; + asn1p_lval.tv_str = strdup(yytext); + return TOK_valuefieldreference; + } + YY_BREAK +case 110: +YY_RULE_SETUP +#line 396 "asn1p_l.l" +{ + CHECK_DASHES; + asn1p_lval.tv_str = strdup(yytext); + return TOK_identifier; + } + YY_BREAK +/* + * objectclassreference + */ +case 111: +YY_RULE_SETUP +#line 405 "asn1p_l.l" +{ + CHECK_DASHES; + asn1p_lval.tv_str = strdup(yytext); + return TOK_objectclassreference; + } + YY_BREAK +/* + * typereference, modulereference + * NOTE: TOK_objectclassreference must be combined + * with this token to produce true typereference. + */ +case 112: +YY_RULE_SETUP +#line 416 "asn1p_l.l" +{ + CHECK_DASHES; + asn1p_lval.tv_str = strdup(yytext); + return TOK_typereference; + } + YY_BREAK +case 113: +YY_RULE_SETUP +#line 422 "asn1p_l.l" +return TOK_PPEQ; + YY_BREAK +case 114: +YY_RULE_SETUP +#line 424 "asn1p_l.l" +return TOK_ThreeDots; + YY_BREAK +case 115: +YY_RULE_SETUP +#line 425 "asn1p_l.l" +return TOK_TwoDots; + YY_BREAK +case 116: +YY_RULE_SETUP +#line 427 "asn1p_l.l" +return yytext[0]; + YY_BREAK +case 117: +YY_RULE_SETUP +#line 429 "asn1p_l.l" +/* Ignore whitespace */ + YY_BREAK +case 118: +YY_RULE_SETUP +#line 431 "asn1p_l.l" +{ + if(TYPE_LIFETIME(1994, 0)) + fprintf(stderr, "ERROR: "); + fprintf(stderr, + "Symbol '%c' at line %d is prohibited " + "by ASN.1:1994 and ASN.1:1997\n", + yytext[0], yylineno); + if(TYPE_LIFETIME(1994, 0)) + return -1; + } + YY_BREAK + +case 119: +YY_RULE_SETUP +#line 444 "asn1p_l.l" +{ + asn1p_lval.tv_opaque.buf = strdup(yytext); + asn1p_lval.tv_opaque.len = yyleng; + return TOK_opaque; + } + YY_BREAK +case 120: +YY_RULE_SETUP +#line 450 "asn1p_l.l" +{ + asn1p_lval.tv_opaque.buf = strdup(yytext); + asn1p_lval.tv_opaque.len = yyleng; + return TOK_opaque; + } + YY_BREAK +case 121: +YY_RULE_SETUP +#line 456 "asn1p_l.l" +{ + yy_pop_state(); + return '}'; + } + YY_BREAK + +case 122: +YY_RULE_SETUP +#line 464 "asn1p_l.l" +{ + fprintf(stderr, + "Unexpected token at line %d: \"%s\"\n", + yylineno, yytext); + while(YYSTATE != INITIAL) + yy_pop_state(); + yy_top_state(); /* Just to use this function. */ + yyterminate(); + yy_fatal_error("Unexpected token"); + return -1; +} + YY_BREAK +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(dash_comment): +case YY_STATE_EOF(cpp_comment): +case YY_STATE_EOF(quoted): +case YY_STATE_EOF(opaque): +case YY_STATE_EOF(with_syntax): +#line 476 "asn1p_l.l" +{ + while(YYSTATE != INITIAL) + yy_pop_state(); + yyterminate(); + } + YY_BREAK +case 123: +YY_RULE_SETUP +#line 483 "asn1p_l.l" +YY_FATAL_ERROR( "flex scanner jammed" ); + YY_BREAK +#line 2902 "lex.yy.c" + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yy_c_buf_p; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer() ) + { + case EOB_ACT_END_OF_FILE: + { + yy_did_buffer_switch_on_eof = 0; + + if ( yywrap() ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = + yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yy_c_buf_p = + &yy_current_buffer->yy_ch_buf[yy_n_chars]; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of yylex */ + + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + +static int yy_get_next_buffer() + { + register char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( yy_current_buffer->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + yy_current_buffer->yy_n_chars = yy_n_chars = 0; + + else + { + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ +#ifdef YY_USES_REJECT + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +#else + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = yy_current_buffer; + + int yy_c_buf_p_offset = + (int) (yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = yy_current_buffer->yy_buf_size - + number_to_move - 1; +#endif + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); + + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + if ( yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + yy_current_buffer->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + yy_n_chars += number_to_move; + yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; + yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + + return ret_val; + } + + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state() + { + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = yy_start; + yy_state_ptr = yy_state_buf; + *yy_state_ptr++ = yy_current_state; + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 675 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *yy_state_ptr++ = yy_current_state; + } + + return yy_current_state; + } + + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + +#ifdef YY_USE_PROTOS +static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) +#else +static yy_state_type yy_try_NUL_trans( yy_current_state ) +yy_state_type yy_current_state; +#endif + { + register int yy_is_jam; + + register YY_CHAR yy_c = 1; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 675 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 674); + if ( ! yy_is_jam ) + *yy_state_ptr++ = yy_current_state; + + return yy_is_jam ? 0 : yy_current_state; + } + + +#ifndef YY_NO_UNPUT +#ifdef YY_USE_PROTOS +static void yyunput( int c, register char *yy_bp ) +#else +static void yyunput( c, yy_bp ) +int c; +register char *yy_bp; +#endif + { + register char *yy_cp = yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yy_hold_char; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_current_buffer->yy_n_chars = + yy_n_chars = yy_current_buffer->yy_buf_size; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + if ( c == '\n' ) + --yylineno; + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } +#endif /* ifndef YY_NO_UNPUT */ + + +#ifdef __cplusplus +static int yyinput() +#else +static int input() +#endif + { + int c; + + *yy_c_buf_p = yy_hold_char; + + if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + /* This was really a NUL. */ + *yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yy_c_buf_p - yytext_ptr; + ++yy_c_buf_p; + + switch ( yy_get_next_buffer() ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /* fall through */ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap() ) + return EOF; + + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + yy_hold_char = *++yy_c_buf_p; + + if ( c == '\n' ) + ++yylineno; + + return c; + } + + +#ifdef YY_USE_PROTOS +void yyrestart( FILE *input_file ) +#else +void yyrestart( input_file ) +FILE *input_file; +#endif + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_init_buffer( yy_current_buffer, input_file ); + yy_load_buffer_state(); + } + + +#ifdef YY_USE_PROTOS +void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) +#else +void yy_switch_to_buffer( new_buffer ) +YY_BUFFER_STATE new_buffer; +#endif + { + if ( yy_current_buffer == new_buffer ) + return; + + if ( yy_current_buffer ) + { + /* Flush out information for old buffer. */ + *yy_c_buf_p = yy_hold_char; + yy_current_buffer->yy_buf_pos = yy_c_buf_p; + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + yy_current_buffer = new_buffer; + yy_load_buffer_state(); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yy_did_buffer_switch_on_eof = 1; + } + + +#ifdef YY_USE_PROTOS +void yy_load_buffer_state( void ) +#else +void yy_load_buffer_state() +#endif + { + yy_n_chars = yy_current_buffer->yy_n_chars; + yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; + yyin = yy_current_buffer->yy_input_file; + yy_hold_char = *yy_c_buf_p; + } + + +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) +#else +YY_BUFFER_STATE yy_create_buffer( file, size ) +FILE *file; +int size; +#endif + { + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; + } + + +#ifdef YY_USE_PROTOS +void yy_delete_buffer( YY_BUFFER_STATE b ) +#else +void yy_delete_buffer( b ) +YY_BUFFER_STATE b; +#endif + { + if ( ! b ) + return; + + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yy_flex_free( (void *) b->yy_ch_buf ); + + yy_flex_free( (void *) b ); + } + + +#ifndef YY_ALWAYS_INTERACTIVE +#ifndef YY_NEVER_INTERACTIVE +extern int isatty YY_PROTO(( int )); +#endif +#endif + +#ifdef YY_USE_PROTOS +void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) +#else +void yy_init_buffer( b, file ) +YY_BUFFER_STATE b; +FILE *file; +#endif + + + { + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + +#if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; +#else +#if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; +#else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +#endif +#endif + } + + +#ifdef YY_USE_PROTOS +void yy_flush_buffer( YY_BUFFER_STATE b ) +#else +void yy_flush_buffer( b ) +YY_BUFFER_STATE b; +#endif + + { + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer ) + yy_load_buffer_state(); + } + + +#ifndef YY_NO_SCAN_BUFFER +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) +#else +YY_BUFFER_STATE yy_scan_buffer( base, size ) +char *base; +yy_size_t size; +#endif + { + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; + } +#endif + + +#ifndef YY_NO_SCAN_STRING +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) +#else +YY_BUFFER_STATE yy_scan_string( yy_str ) +yyconst char *yy_str; +#endif + { + int len; + for ( len = 0; yy_str[len]; ++len ) + ; + + return yy_scan_bytes( yy_str, len ); + } +#endif + + +#ifndef YY_NO_SCAN_BYTES +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) +#else +YY_BUFFER_STATE yy_scan_bytes( bytes, len ) +yyconst char *bytes; +int len; +#endif + { + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yy_flex_alloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; + } +#endif + + +#ifndef YY_NO_PUSH_STATE +#ifdef YY_USE_PROTOS +static void yy_push_state( int new_state ) +#else +static void yy_push_state( new_state ) +int new_state; +#endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } +#endif + + +#ifndef YY_NO_POP_STATE +static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } +#endif + + +#ifndef YY_NO_TOP_STATE +static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } +#endif + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +#ifdef YY_USE_PROTOS +static void yy_fatal_error( yyconst char msg[] ) +#else +static void yy_fatal_error( msg ) +char msg[]; +#endif + { + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); + } + + + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + yytext[yyleng] = yy_hold_char; \ + yy_c_buf_p = yytext + n; \ + yy_hold_char = *yy_c_buf_p; \ + *yy_c_buf_p = '\0'; \ + yyleng = n; \ + } \ + while ( 0 ) + + +/* Internal utility routines. */ + +#ifndef yytext_ptr +#ifdef YY_USE_PROTOS +static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) +#else +static void yy_flex_strncpy( s1, s2, n ) +char *s1; +yyconst char *s2; +int n; +#endif + { + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; + } +#endif + +#ifdef YY_NEED_STRLEN +#ifdef YY_USE_PROTOS +static int yy_flex_strlen( yyconst char *s ) +#else +static int yy_flex_strlen( s ) +yyconst char *s; +#endif + { + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; + } +#endif + + +#ifdef YY_USE_PROTOS +static void *yy_flex_alloc( yy_size_t size ) +#else +static void *yy_flex_alloc( size ) +yy_size_t size; +#endif + { + return (void *) malloc( size ); + } + +#ifdef YY_USE_PROTOS +static void *yy_flex_realloc( void *ptr, yy_size_t size ) +#else +static void *yy_flex_realloc( ptr, size ) +void *ptr; +yy_size_t size; +#endif + { + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); + } + +#ifdef YY_USE_PROTOS +static void yy_flex_free( void *ptr ) +#else +static void yy_flex_free( ptr ) +void *ptr; +#endif + { + free( ptr ); + } + +#if YY_MAIN +int main() + { + yylex(); + return 0; + } +#endif +#line 483 "asn1p_l.l" + + +/* + * Very dirty but wonderful hack allowing to rule states from within .y file. + */ +void +asn1p_lexer_hack_push_opaque_state() { + yy_push_state(opaque); +} + +/* + * Another hack which disables recognizing some tokens when inside WITH SYNTAX. + */ +void +asn1p_lexer_hack_enable_with_syntax() { + yy_push_state(with_syntax); +} + +/* + * Check that a token does not end with dash and does not contain + * several dashes in succession. + * "Name", "Type-Id", "T-y-p-e-i-d" are OK + * "end-", "vustom--value" are INVALID + */ +static int +_check_dashes(char *ptr) { + int prev_dash = 0; + + assert(*ptr != '-'); + + for(;; ptr++) { + switch(*ptr) { + case '-': + if(prev_dash++) /* No double dashes */ + return -1; + continue; + case '\0': + if(prev_dash) /* No dashes at the end */ + return -1; + break; + default: + prev_dash = 0; + continue; + } + break; + } + + return 0; +} + +static asn1_integer_t +asn1p_atoi(char *ptr) { + asn1_integer_t value; + errno = 0; /* Clear the error code */ + + if(sizeof(value) <= sizeof(int)) { + value = strtol(ptr, 0, 10); + } else { +#ifdef HAVE_STRTOIMAX + value = strtoimax(ptr, 0, 10); +#elif HAVE_STRTOLL + value = strtoll(ptr, 0, 10); +#else + value = strtol(ptr, 0, 10); +#endif + } + + if(errno == ERANGE) { + fprintf(stderr, + "Value \"%s\" at line %d is too large " + "for this compiler! Please contact the vendor.", + ptr, yylineno); + errno = ERANGE; /* Restore potentially clobbered errno */ + } + + return value; +} + diff --git a/libasn1parser/asn1p_l.l b/libasn1parser/asn1p_l.l new file mode 100644 index 000000000..0d86cb749 --- /dev/null +++ b/libasn1parser/asn1p_l.l @@ -0,0 +1,560 @@ +%{ + +#include +#include +#include + +#include "asn1parser.h" +#include "asn1p_y.h" + +int asn1p_lex(void); +void asn1p_lexer_hack_push_opaque_state(void); /* Used in .y */ +void asn1p_lexer_hack_enable_with_syntax(void); /* Used in .y */ + +#define YY_FATAL_ERROR(msg) do { \ + fprintf(stderr, \ + "lexer error at line %d, " \ + "text \"%s\"\n", \ + yylineno, yytext); \ + exit(1); \ + } while(0) + +int asn1p_lexer_pedantic_1990 = 0; +int asn1p_lexer_types_year = 0; +int asn1p_lexer_constructs_year = 0; +static int _check_dashes(char *ptr); +static asn1_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */ + +/* + * Check that the type is defined in the year of the standard choosen. + */ +#define TYPE_LIFETIME(fyr, lyr) \ + (!asn1p_lexer_types_year \ + || (fyr && fyr <= asn1p_lexer_types_year) \ + || (lyr && lyr > asn1p_lexer_types_year)) + +/* + * Check the the construction (or concept, i.e. CLASS) is defined in + * a given year. + */ +#define CONSTRUCT_LIFETIME(fyr, lyr) \ + (!asn1p_lexer_constructs_year \ + || (fyr && fyr <= asn1p_lexer_constructs_year) \ + || (lyr && lyr > asn1p_lexer_constructs_year)) + +/* + * Make sure that the label is compliant with the naming rules. + */ +#define CHECK_DASHES do { \ + if(_check_dashes(yytext)) { \ + fprintf(stderr, \ + "%s: Identifier format invalid: " \ + "Improper dash location\n", yytext); \ + return -1; \ + } } while(0) + +/* + * Append quoted string. + */ +#define QAPPEND(text, tlen) do { \ + char *prev_text = asn1p_lval.tv_opaque.buf; \ + int prev_len = asn1p_lval.tv_opaque.len; \ + char *p; \ + \ + p = malloc((tlen) + prev_len + 1); \ + if(p == NULL) return -1; \ + \ + if(prev_text) memcpy(p, prev_text, prev_len); \ + memcpy(p + prev_len, text, tlen); \ + p[prev_len + (tlen)] = '\0'; \ + \ + free(asn1p_lval.tv_opaque.buf); \ + asn1p_lval.tv_opaque.buf = p; \ + asn1p_lval.tv_opaque.len = (tlen) + prev_len; \ + } while(0) + +%} + +%option never-interactive +%option noinput nounput +%option noyywrap stack +/* Performance penalty is OK */ +%option yylineno +/* Controlled from within application */ +%option debug + +%pointer + +%x dash_comment +%x cpp_comment +%x quoted +%x opaque +%x with_syntax + +/* Newline */ +NL [\r\v\f\n] +/* White-space */ +WSP [\t\r\v\f\n ] + +%% + +"--" yy_push_state(dash_comment); +{ + + {NL} yy_pop_state(); + + -- yy_pop_state(); /* End of comment */ + - /* Eat single dash */ + [^\r\v\f\n-]+ /* Eat */ + +} +"/*" yy_push_state(cpp_comment); +{ + [^*/] /* Eat */ + "*/" yy_pop_state(); + . /* Eat */ +} + + + /* + * This is state is being set from corresponding .y module when + * higher-level data is necessary to make proper parsing of the + * underlying data. Thus, we enter the state and save + * everything for later processing. + */ +{ + + "{" { + yy_push_state(opaque); + asn1p_lval.tv_opaque.buf = strdup(yytext); + asn1p_lval.tv_opaque.len = yyleng; + return TOK_opaque; + } + + "}" { + yy_pop_state(); + asn1p_lval.tv_opaque.buf = strdup(yytext); + asn1p_lval.tv_opaque.len = yyleng; + return TOK_opaque; + } + + [^{}:=]+ { + asn1p_lval.tv_opaque.buf = strdup(yytext); + asn1p_lval.tv_opaque.len = yyleng; + return TOK_opaque; + } + + "::=" { + fprintf(stderr, + "ASN.1 Parser syncronization failure: " + "\"%s\" at line %d must not appear " + "inside value definition\n", + yytext, yylineno); + return -1; + } + + [:=] { + asn1p_lval.tv_opaque.buf = strdup(yytext); + asn1p_lval.tv_opaque.len = yyleng; + return TOK_opaque; + } + + } + +\"[^\"]* { + asn1p_lval.tv_opaque.buf = 0; + asn1p_lval.tv_opaque.len = 0; + QAPPEND(yytext+1, yyleng-1); + yy_push_state(quoted); + } +{ + + \"\" { QAPPEND(yytext, yyleng-1); } /* Add a single quote */ + [^\"]+ { QAPPEND(yytext, yyleng); } + + \" { + yy_pop_state(); + /* Do not append last quote: + // QAPPEND(yytext, yyleng); */ + + if(asn1p_lexer_pedantic_1990 + && strchr(yytext, '\n')) { + fprintf(stderr, "%s: " + "Newlines are prohibited by ASN.1:1990\n", + asn1p_lval.tv_opaque.buf); + return -1; + } + + return TOK_cstring; + } + + } + + +'[0-9A-F \t\r\v\f\n]+'H { + /* " \t\r\n" weren't allowed in ASN.1:1990. */ + asn1p_lval.tv_str = yytext; + return TOK_hstring; + } + +'[01 \t\r\v\f\n]+'B { + /* " \t\r\n" weren't allowed in ASN.1:1990. */ + asn1p_lval.tv_str = strdup(yytext); + return TOK_bstring; + } + + +-[1-9][0-9]* { + asn1p_lval.a_int = asn1p_atoi(yytext); + if(errno == ERANGE) + return -1; + return TOK_number_negative; + } + +[1-9][0-9]* { + asn1p_lval.a_int = asn1p_atoi(yytext); + if(errno == ERANGE) + return -1; + return TOK_number; + } + +"0" { + asn1p_lval.a_int = asn1p_atoi(yytext); + if(errno == ERANGE) + return -1; + return TOK_number; + } + + /* + * Tags + */ +\[(UNIVERSAL[ \t\r\v\f\n]+|APPLICATION[ \t\r\v\f\n]+|PRIVATE[ \t\r\v\f\n]+)?[0-9]+\] { + char *p; + memset(&asn1p_lval.a_tag, 0, sizeof(asn1p_lval.a_tag)); + switch(yytext[1]) { + case 'U': + asn1p_lval.a_tag.tag_class = TC_UNIVERSAL; + p = yytext + sizeof("UNIVERSAL") + 1; + break; + case 'A': + asn1p_lval.a_tag.tag_class = TC_APPLICATION; + p = yytext + sizeof("APPLICATION") + 1; + break; + case 'P': + asn1p_lval.a_tag.tag_class = TC_PRIVATE; + p = yytext + sizeof("PRIVATE") + 1; + break; + default: + assert(yytext[1] >= '0' && yytext[1] <= '9'); + asn1p_lval.a_tag.tag_class = TC_CONTEXT_SPECIFIC; + p = yytext + 1; + break; + } + asn1p_lval.a_tag.tag_value = asn1p_atoi(p); + if(*p == '0' && asn1p_lval.a_tag.tag_value) { + fprintf(stderr, + "Tag value at line %d " + "cannot start with zero " + "and have multiple digits: \"%s\"\n", + yylineno, yytext); + return -1; + } + return TOK_tag; + } + +\[[A-Z]+[ \t\r\v\f\n]+[0-9]+\] { + fprintf(stderr, + "Unsupported tag syntax at line %d: \"%s\"\n", + yylineno, yytext); + return -1; + } + +ABSENT return TOK_ABSENT; +ABSTRACT-SYNTAX return TOK_ABSTRACT_SYNTAX; +ALL return TOK_ALL; +ANY { + /* Appeared in 1990, removed in 1997 */ + if(TYPE_LIFETIME(1990, 1997)) + return TOK_ANY; + fprintf(stderr, "Keyword \"%s\" at line %d " + "is obsolete\n", yytext, yylineno); + REJECT; + } +APPLICATION return TOK_APPLICATION; +AUTOMATIC return TOK_AUTOMATIC; +BEGIN return TOK_BEGIN; +BIT return TOK_BIT; +BMPString { + if(TYPE_LIFETIME(1994, 0)) + return TOK_BMPString; + REJECT; + } +BOOLEAN return TOK_BOOLEAN; +BY return TOK_BY; +CHARACTER return TOK_CHARACTER; +CHOICE return TOK_CHOICE; +CLASS return TOK_CLASS; +COMPONENT return TOK_COMPONENT; +COMPONENTS return TOK_COMPONENTS; +CONSRAINED return TOK_CONSTRAINED; +CONTAINING return TOK_CONTAINING; +DEFAULT return TOK_DEFAULT; +DEFINED { + /* Appeared in 1990, removed in 1997 */ + if(TYPE_LIFETIME(1990, 1997)) + return TOK_DEFINED; + fprintf(stderr, "Keyword \"%s\" at line %d " + "is obsolete\n", yytext, yylineno); + /* Deprecated since */ + REJECT; + } +DEFINITIONS return TOK_DEFINITIONS; +EMBEDDED return TOK_EMBEDDED; +ENCODED return TOK_ENCODED; +END return TOK_END; +ENUMERATED return TOK_ENUMERATED; +EXCEPT return TOK_EXCEPT; +EXPLICIT return TOK_EXPLICIT; +EXPORTS return TOK_EXPORTS; +EXTENSIBILITY return TOK_EXTENSIBILITY; +EXTERNAL return TOK_EXTERNAL; +FALSE return TOK_FALSE; +FROM return TOK_FROM; +GeneralizedTime return TOK_GeneralizedTime; +GeneralString return TOK_GeneralString; +GraphicString return TOK_GraphicString; +IA5String return TOK_IA5String; +IDENTIFIER return TOK_IDENTIFIER; +IMPLICIT return TOK_IMPLICIT; +IMPLIED return TOK_IMPLIED; +IMPORTS return TOK_IMPORTS; +INCLUDES return TOK_INCLUDES; +INSTANCE return TOK_INSTANCE; +INTEGER return TOK_INTEGER; +INTERSECTION return TOK_INTERSECTION; +ISO646String return TOK_ISO646String; +MAX return TOK_MAX; +MIN return TOK_MIN; +MINUS-INFINITY return TOK_MINUS_INFINITY; +NULL return TOK_NULL; +NumericString return TOK_NumericString; +OBJECT return TOK_OBJECT; +ObjectDescriptor return TOK_ObjectDescriptor; +OCTET return TOK_OCTET; +OF return TOK_OF; +OPTIONAL return TOK_OPTIONAL; +PATTERN return TOK_PATTERN; +PDV return TOK_PDV; +PLUS-INFINITY return TOK_PLUS_INFINITY; +PRESENT return TOK_PRESENT; +PrintableString return TOK_PrintableString; +PRIVATE return TOK_PRIVATE; +REAL return TOK_REAL; +RELATIVE-OID return TOK_RELATIVE_OID; +SEQUENCE return TOK_SEQUENCE; +SET return TOK_SET; +SIZE return TOK_SIZE; +STRING return TOK_STRING; +SYNTAX return TOK_SYNTAX; +T61String return TOK_T61String; +TAGS return TOK_TAGS; +TeletexString return TOK_TeletexString; +TRUE return TOK_TRUE; +TYPE-IDENTIFIER return TOK_TYPE_IDENTIFIER; +UNION return TOK_UNION; +UNIQUE return TOK_UNIQUE; +UNIVERSAL return TOK_UNIVERSAL; +UniversalString { + if(TYPE_LIFETIME(1994, 0)) + return TOK_UniversalString; + REJECT; + } +UTCTime return TOK_UTCTime; +UTF8String { + if(TYPE_LIFETIME(1994, 0)) + return TOK_UTF8String; + REJECT; + } +VideotexString return TOK_VideotexString; +VisibleString return TOK_VisibleString; +WITH return TOK_WITH; + + +&[A-Z][A-Za-z0-9-]* { + CHECK_DASHES; + asn1p_lval.tv_str = strdup(yytext); + return TOK_typefieldreference; + } + +&[a-z][a-zA-Z0-9-]* { + CHECK_DASHES; + asn1p_lval.tv_str = strdup(yytext); + return TOK_valuefieldreference; + } + + +[a-z][a-zA-Z0-9-]* { + CHECK_DASHES; + asn1p_lval.tv_str = strdup(yytext); + return TOK_identifier; + } + + /* + * objectclassreference + */ +[A-Z][A-Z0-9-]* { + CHECK_DASHES; + asn1p_lval.tv_str = strdup(yytext); + return TOK_objectclassreference; + } + + /* + * typereference, modulereference + * NOTE: TOK_objectclassreference must be combined + * with this token to produce true typereference. + */ +[A-Z][A-Za-z0-9-]* { + CHECK_DASHES; + asn1p_lval.tv_str = strdup(yytext); + return TOK_typereference; + } + +"::=" return TOK_PPEQ; + +"..." return TOK_ThreeDots; +".." return TOK_TwoDots; + +[(){},;:|!.&@\[\]] return yytext[0]; + +{WSP}+ /* Ignore whitespace */ + +[^A-Za-z0-9:=,{}<.@()[]'\"|&^*;!-] { + if(TYPE_LIFETIME(1994, 0)) + fprintf(stderr, "ERROR: "); + fprintf(stderr, + "Symbol '%c' at line %d is prohibited " + "by ASN.1:1994 and ASN.1:1997\n", + yytext[0], yylineno); + if(TYPE_LIFETIME(1994, 0)) + return -1; + } + +{ + + [^&{} \t\r\v\f\n]+ { + asn1p_lval.tv_opaque.buf = strdup(yytext); + asn1p_lval.tv_opaque.len = yyleng; + return TOK_opaque; + } + + {WSP}+ { + asn1p_lval.tv_opaque.buf = strdup(yytext); + asn1p_lval.tv_opaque.len = yyleng; + return TOK_opaque; + } + + "}" { + yy_pop_state(); + return '}'; + } + +} + + +<*>. { + fprintf(stderr, + "Unexpected token at line %d: \"%s\"\n", + yylineno, yytext); + while(YYSTATE != INITIAL) + yy_pop_state(); + yy_top_state(); /* Just to use this function. */ + yyterminate(); + yy_fatal_error("Unexpected token"); + return -1; +} + +<*><> { + while(YYSTATE != INITIAL) + yy_pop_state(); + yyterminate(); + } + + +%% + +/* + * Very dirty but wonderful hack allowing to rule states from within .y file. + */ +void +asn1p_lexer_hack_push_opaque_state() { + yy_push_state(opaque); +} + +/* + * Another hack which disables recognizing some tokens when inside WITH SYNTAX. + */ +void +asn1p_lexer_hack_enable_with_syntax() { + yy_push_state(with_syntax); +} + +/* + * Check that a token does not end with dash and does not contain + * several dashes in succession. + * "Name", "Type-Id", "T-y-p-e-i-d" are OK + * "end-", "vustom--value" are INVALID + */ +static int +_check_dashes(char *ptr) { + int prev_dash = 0; + + assert(*ptr != '-'); + + for(;; ptr++) { + switch(*ptr) { + case '-': + if(prev_dash++) /* No double dashes */ + return -1; + continue; + case '\0': + if(prev_dash) /* No dashes at the end */ + return -1; + break; + default: + prev_dash = 0; + continue; + } + break; + } + + return 0; +} + +static asn1_integer_t +asn1p_atoi(char *ptr) { + asn1_integer_t value; + errno = 0; /* Clear the error code */ + + if(sizeof(value) <= sizeof(int)) { + value = strtol(ptr, 0, 10); + } else { +#ifdef HAVE_STRTOIMAX + value = strtoimax(ptr, 0, 10); +#elif HAVE_STRTOLL + value = strtoll(ptr, 0, 10); +#else + value = strtol(ptr, 0, 10); +#endif + } + + if(errno == ERANGE) { + fprintf(stderr, + "Value \"%s\" at line %d is too large " + "for this compiler! Please contact the vendor.", + ptr, yylineno); + errno = ERANGE; /* Restore potentially clobbered errno */ + } + + return value; +} + diff --git a/libasn1parser/asn1p_list.h b/libasn1parser/asn1p_list.h new file mode 100644 index 000000000..1f8087808 --- /dev/null +++ b/libasn1parser/asn1p_list.h @@ -0,0 +1,57 @@ +/* + * Singly linked tail queue support. + */ +#ifndef ASN1_PARSER_LIST_H +#define ASN1_PARSER_LIST_H + +#define TQ_HEAD(type) \ + struct { \ + type *tq_head; \ + type**tq_tail; \ + } + +#define TQ_HEAD_COPY(to, from) \ + do { (to)->tq_head = (from)->tq_head; \ + (to)->tq_tail = (from)->tq_tail; } while(0) + +#define TQ_ENTRY(type) \ + struct { \ + type *tq_next; \ + } + +#define TQ_FIRST(headp) ((headp)->tq_head) +#define TQ_NEXT(el, field) ((el)->field.tq_next) + +#define TQ_INIT(head) do { \ + TQ_FIRST((head)) = 0; \ + (head)->tq_tail = &TQ_FIRST((head)); \ + } while(0) + +#define TQ_FOR(var, head, field) \ + for((var) = TQ_FIRST((head)); \ + (var); (var) = TQ_NEXT((var), field)) + +#define TQ_ADD(head, xel, field) do { \ + typeof(xel) __el = xel; \ + assert(TQ_NEXT((__el), field) == 0); \ + *(head)->tq_tail = (__el); \ + (head)->tq_tail = &TQ_NEXT((__el), field); \ + } while(0) + +/* + * Remove the first element and return it. + */ +#define TQ_REMOVE(head, field) ({ \ + typeof(TQ_FIRST((head))) __fel; \ + __fel = TQ_FIRST((head)); \ + if(__fel == 0 \ + || (TQ_FIRST((head)) = TQ_NEXT(__fel, field)) \ + == 0) { \ + (head)->tq_tail = &TQ_FIRST((head)); \ + } else { \ + TQ_NEXT(__fel, field) = 0; \ + } \ + __fel; }) + + +#endif /* ASN1_PARSER_LIST_H */ diff --git a/libasn1parser/asn1p_module.c b/libasn1parser/asn1p_module.c new file mode 100644 index 000000000..d430844e0 --- /dev/null +++ b/libasn1parser/asn1p_module.c @@ -0,0 +1,62 @@ +#include +#include + +#include "asn1parser.h" + +/* + * Construct a new empty module. + */ +asn1p_module_t * +asn1p_module_new() { + asn1p_module_t *mod; + + mod = calloc(1, sizeof *mod); + if(mod) { + TQ_INIT(&(mod->imports)); + TQ_INIT(&(mod->exports)); + TQ_INIT(&(mod->members)); + } + return mod; +} + +/* + * Destroy the module. + */ +void +asn1p_module_free(asn1p_module_t *mod) { + if(mod) { + asn1p_expr_t *expr; + + if(mod->Identifier) + free(mod->Identifier); + + if(mod->module_oid) + asn1p_oid_free(mod->module_oid); + + while((expr = TQ_REMOVE(&(mod->members), next))) + asn1p_expr_free(expr); + + free(mod); + } +} + +asn1p_t * +asn1p_new() { + asn1p_t *asn; + asn = calloc(1, sizeof(*asn)); + if(asn) { + TQ_INIT(&(asn->modules)); + } + return asn; +} + + +void +asn1p_free(asn1p_t *asn) { + if(asn) { + asn1p_module_t *mod; + while((mod = TQ_REMOVE(&(asn->modules), mod_next))) + asn1p_module_free(mod); + free(asn); + } +} diff --git a/libasn1parser/asn1p_module.h b/libasn1parser/asn1p_module.h new file mode 100644 index 000000000..906c784a7 --- /dev/null +++ b/libasn1parser/asn1p_module.h @@ -0,0 +1,88 @@ +/* + * A Module definition structure used by the ASN.1 parser. + */ +#ifndef ASN1_PARSER_MODULE_H +#define ASN1_PARSER_MODULE_H + +/* + * Flags specific to a module. + */ +typedef enum asn1p_module_flags { + MSF_NOFLAGS, + MSF_EXPLICIT_TAGS = 0x1, + MSF_IMPLICIT_TAGS = 0x2, + MSF_AUTOMATIC_TAGS = 0x4, + MSF_EXTENSIBILITY_IMPLIED = 0x8, +} asn1p_module_flags_e; + +/* + * === EXAMPLE === + * MySyntax DEFINITIONS AUTOMATIC TAGS ::= + * BEGIN + * ... + * END + * === EOF === + */ +typedef struct asn1p_module_s { + + /* + * Name of the source file. + */ + char *source_file_name; + + /* + * Human-readable module identifier. + */ + char *Identifier; /* Module name */ + + /* + * Unique module identifier, OID. + */ + asn1p_oid_t *module_oid; /* Optional OID of the module */ + + /* + * Module flags. + */ + asn1p_module_flags_e module_flags; /* AUTOMATIC TAGS? */ + + /* + * List of everything that this module IMPORTS. + */ + TQ_HEAD(struct asn1p_xports_s) imports; + + /* + * List of everything that this module EXPORTS. + */ + TQ_HEAD(struct asn1p_xports_s) exports; + + /* + * List of everything that this module defines itself. + */ + TQ_HEAD(struct asn1p_expr_s) members; + + /* + * Next module in the list. + */ + TQ_ENTRY(struct asn1p_module_s) + mod_next; + +} asn1p_module_t; + +/* + * Constructor and destructor. + */ +asn1p_module_t *asn1p_module_new(void); +void asn1p_module_free(asn1p_module_t *mod); + +/* + * No more than a container for several modules. + */ +typedef struct asn1p_s { + TQ_HEAD(struct asn1p_module_s) modules; +} asn1p_t; + +asn1p_t *asn1p_new(void); +void asn1p_free(asn1p_t *asn); + + +#endif /* ASN1_PARSER_MODULE_H */ diff --git a/libasn1parser/asn1p_oid.c b/libasn1parser/asn1p_oid.c new file mode 100644 index 000000000..2c22b0fd9 --- /dev/null +++ b/libasn1parser/asn1p_oid.c @@ -0,0 +1,95 @@ +#include +#include +#include + +#include "asn1parser.h" + +asn1p_oid_t * +asn1p_oid_new() { + return calloc(1, sizeof(asn1p_oid_t)); +} + +int +asn1p_oid_add_arc(asn1p_oid_t *oid, asn1p_oid_arc_t *template) { + void *p; + p = realloc(oid->arcs, (oid->arcs_count + 1) * sizeof(oid->arcs[0])); + if(p) { + oid->arcs = p; + oid->arcs[oid->arcs_count].name + = template->name?strdup(template->name):0; + oid->arcs[oid->arcs_count].number = template->number; + oid->arcs_count++; + return 0; + } else { + return -1; + } +} + +void +asn1p_oid_free(asn1p_oid_t *oid) { + if(oid) { + if(oid->arcs) { + while(oid->arcs_count--) { + if(oid->arcs[oid->arcs_count].name) + free(oid->arcs[oid->arcs_count].name); + } + } + free(oid); + } +} + +asn1p_oid_arc_t * +asn1p_oid_arc_new(const char *optName, asn1_integer_t optNumber /* = -1 */) { + asn1p_oid_arc_t *arc; + + arc = calloc(1, sizeof *arc); + if(arc) { + if(optName) + arc->name = strdup(optName); + arc->number = optNumber; + } + + return arc; +} + +void +asn1p_oid_arc_free(asn1p_oid_arc_t *arc) { + if(arc) { + if(arc->name) + free(arc->name); + free(arc); + } +} + +int +asn1p_oid_compare(asn1p_oid_t *a, asn1p_oid_t *b) { + int i; + + for(i = 0; ; i++) { + asn1_integer_t cmp; + + if(b->arcs_count > i) { + if(a->arcs_count <= i) + return -1; + } else if(a->arcs_count > i) { + if(b->arcs_count <= i) + return 1; + } else if(b->arcs_count <= i && a->arcs_count <= i) { + cmp = b->arcs_count - a->arcs_count; + if(cmp < 0) + return -1; + else if(cmp > 0) + return 1; + return 0; + } + + cmp = b->arcs[i].number - a->arcs[i].number; + if(cmp < 0) + return -1; + else if(cmp > 0) + return 1; + } + +} + + diff --git a/libasn1parser/asn1p_oid.h b/libasn1parser/asn1p_oid.h new file mode 100644 index 000000000..cbb6b0799 --- /dev/null +++ b/libasn1parser/asn1p_oid.h @@ -0,0 +1,66 @@ +/* + * Object Identifier definition. + */ +#ifndef ASN1_PARSER_OID_H +#define ASN1_PARSER_OID_H + +/******************************** + * Single Object Identifier Arc * + ********************************/ + +/* + * Object identifier arc (one number in the hierarchy). + */ +typedef struct asn1p_oid_arc_s { + asn1_integer_t number; /* -1 if not yet defined */ + char *name; /* 0 if not defined */ +} asn1p_oid_arc_t; + + +/* + * Arc constructor. + */ +asn1p_oid_arc_t *asn1p_oid_arc_new( + const char *optName, asn1_integer_t optNumber /* = -1 */); +/* + * Arc destructor. + */ +void asn1p_oid_arc_free(asn1p_oid_arc_t *); + + +/************************************************** + * Object Identifier itself, a collection of arcs * + **************************************************/ + +/* + * Object Identifier as a collection of arcs. + */ +typedef struct asn1p_oid_s { + asn1p_oid_arc_t *arcs; + int arcs_count; +} asn1p_oid_t; + +/* + * OID constructor. + */ +asn1p_oid_t *asn1p_oid_new(void); + +/* + * Add another arc using given one as a template + */ +int asn1p_oid_add_arc(asn1p_oid_t *, asn1p_oid_arc_t *template); + +/* + * OID destructor. + */ +void asn1p_oid_free(asn1p_oid_t *); + +/* + * RETURN VALUES: + * 0: The specified OIDs are equal. + * -1 or 1 otherwise. + */ +int asn1p_oid_compare(asn1p_oid_t *a, asn1p_oid_t *b); + + +#endif /* ASN1_PARSER_OID_H */ diff --git a/libasn1parser/asn1p_param.c b/libasn1parser/asn1p_param.c new file mode 100644 index 000000000..f7082241b --- /dev/null +++ b/libasn1parser/asn1p_param.c @@ -0,0 +1,111 @@ +#include +#include +#include +#include +#include + +#include "asn1parser.h" + +/* + * Construct a new empty parameters list. + */ +asn1p_paramlist_t * +asn1p_paramlist_new(int _lineno) { + asn1p_paramlist_t *pl; + + pl = calloc(1, sizeof *pl); + if(pl) { + pl->_lineno = _lineno; + } + + return pl; +} + +void +asn1p_paramlist_free(asn1p_paramlist_t *pl) { + if(pl) { + if(pl->params) { + int i = pl->params_count; + while(i--) { + if(pl->params[i].governor) + asn1p_ref_free(pl->params[i].governor); + if(pl->params[i].argument) + free(pl->params[i].argument); + pl->params[i].governor = 0; + pl->params[i].argument = 0; + } + free(pl->params); + pl->params = 0; + } + + free(pl); + } +} + +int +asn1p_paramlist_add_param(asn1p_paramlist_t *pl, asn1p_ref_t *gov, char *arg) { + + if(!pl || !arg) { + errno = EINVAL; + return -1; + } + + /* + * Make sure there's enough space to insert a new element. + */ + if(pl->params_count == pl->params_size) { + int newsize = pl->params_size?pl->params_size<<2:4; + void *p; + p = realloc(pl->params, + newsize * sizeof(pl->params[0])); + if(p) { + pl->params = p; + pl->params_size = newsize; + } else { + return -1; + } + + } + + if(gov) { + pl->params[pl->params_count].governor = asn1p_ref_clone(gov); + if(pl->params[pl->params_count].governor == NULL) { + return -1; + } + } else { + pl->params[pl->params_count].governor = 0; + } + + pl->params[pl->params_count].argument = strdup(arg); + if(pl->params[pl->params_count].argument) { + pl->params_count++; + return 0; + } else { + if(pl->params[pl->params_count].governor) + asn1p_ref_free(pl->params[pl->params_count].governor); + return -1; + } +} + +asn1p_paramlist_t * +asn1p_paramlist_clone(asn1p_paramlist_t *pl) { + asn1p_paramlist_t *newpl; + + newpl = asn1p_paramlist_new(pl->_lineno); + if(newpl) { + int i; + for(i = 0; i < pl->params_count; i++) { + if(asn1p_paramlist_add_param(newpl, + pl->params[i].governor, + pl->params[i].argument + )) { + asn1p_paramlist_free(newpl); + newpl = NULL; + break; + } + } + } + + return newpl; +} + diff --git a/libasn1parser/asn1p_param.h b/libasn1parser/asn1p_param.h new file mode 100644 index 000000000..c9c20c23e --- /dev/null +++ b/libasn1parser/asn1p_param.h @@ -0,0 +1,30 @@ +/* + * Structures and prototypes related to parametrization + */ +#ifndef ASN1_PARSER_PARAMETRIZATION_H +#define ASN1_PARSER_PARAMETRIZATION_H + +typedef struct asn1p_paramlist_s { + struct asn1p_param_s { + asn1p_ref_t *governor; + char *argument; + } *params; + int params_count; + int params_size; + + int _lineno; +} asn1p_paramlist_t; + +/* + * Constructor and destructor. + */ +asn1p_paramlist_t *asn1p_paramlist_new(int _lineno); +void asn1p_paramlist_free(asn1p_paramlist_t *); + +asn1p_paramlist_t *asn1p_paramlist_clone(asn1p_paramlist_t *ref); + +int asn1p_paramlist_add_param(asn1p_paramlist_t *, + asn1p_ref_t *opt_gov, char *arg); + + +#endif /* ASN1_PARSER_PARAMETRIZATION_H */ diff --git a/libasn1parser/asn1p_ref.c b/libasn1parser/asn1p_ref.c new file mode 100644 index 000000000..4ac2b32d7 --- /dev/null +++ b/libasn1parser/asn1p_ref.c @@ -0,0 +1,137 @@ +#include +#include +#include +#include +#include + +#include "asn1parser.h" + +/* + * Construct a new empty reference. + */ +asn1p_ref_t * +asn1p_ref_new(int _lineno) { + asn1p_ref_t *ref; + + ref = calloc(1, sizeof *ref); + if(ref) { + ref->_lineno = _lineno; + } + + return ref; +} + +void +asn1p_ref_free(asn1p_ref_t *ref) { + if(ref) { + if(ref->components) { + int i = ref->comp_count; + while(i--) { + if(ref->components[i].name) + free(ref->components[i].name); + ref->components[i].name = 0; + } + free(ref->components); + ref->components = 0; + } + + free(ref); + } +} + +static enum asn1p_ref_lex_type_e +asn1p_ref_name2lextype(char *name) { + enum asn1p_ref_lex_type_e lex_type; + int has_lowercase = 0; + + if(*name == '&') { + if(name[1] >= 'A' && name[1] <= 'Z') { + lex_type = RLT_AmpUppercase; + } else { + lex_type = RLT_Amplowercase; + } + } else if(*name >= 'A' && *name <= 'Z') { + char *p; + + for(p = name; *p; p++) { + if(*p >= 'a' && *p <= 'z') { + has_lowercase = 1; + break; + } + } + + if(has_lowercase) { + lex_type = RLT_Uppercase; + } else { + lex_type = RLT_CAPITALS; + } + } else if(*name == '@') { + if(name[1] == '.') + lex_type = RLT_AtDotlowercase; + else + lex_type = RLT_Atlowercase; + } else { + lex_type = RLT_lowercase; + } + + return lex_type; +} + +int +asn1p_ref_add_component(asn1p_ref_t *ref, char *name, enum asn1p_ref_lex_type_e lex_type) { + + if(!ref || !name || lex_type < RLT_UNKNOWN || lex_type >= RLT_MAX) { + errno = EINVAL; + return -1; + } + + if(ref->comp_count == ref->comp_size) { + int newsize = ref->comp_size?(ref->comp_size<<2):4; + void *p = realloc(ref->components, + newsize * sizeof(ref->components[0])); + if(p) { + ref->components = p; + ref->comp_size = newsize; + } else { + return -1; + } + + } + + if(lex_type == RLT_UNKNOWN) { + lex_type = asn1p_ref_name2lextype(name); + } else { + assert(lex_type == asn1p_ref_name2lextype(name)); + } + + ref->components[ref->comp_count].name = strdup(name); + ref->components[ref->comp_count].lex_type = lex_type; + if(ref->components[ref->comp_count].name) { + ref->comp_count++; + return 0; + } else { + return -1; + } +} + +asn1p_ref_t * +asn1p_ref_clone(asn1p_ref_t *ref) { + asn1p_ref_t *newref; + + newref = asn1p_ref_new(ref->_lineno); + if(newref) { + int i; + for(i = 0; i < ref->comp_count; i++) { + if(asn1p_ref_add_component(newref, + ref->components[i].name, + ref->components[i].lex_type + )) { + asn1p_ref_free(newref); + newref = NULL; + break; + } + } + } + + return newref; +} diff --git a/libasn1parser/asn1p_ref.h b/libasn1parser/asn1p_ref.h new file mode 100644 index 000000000..dc7a7165e --- /dev/null +++ b/libasn1parser/asn1p_ref.h @@ -0,0 +1,62 @@ +/* + * Generic reference to the yet unknown type defined elsewhere. + */ +#ifndef ASN1_PARSER_REFERENCE_H +#define ASN1_PARSER_REFERENCE_H + +typedef struct asn1p_ref_s { + + /* + * A set of reference name components. + * A reference name consists of several components separated by dots: + * "OBJECT-CLASS.&Algorithm.&id" + */ + struct asn1p_ref_component_s { + enum asn1p_ref_lex_type_e { + RLT_UNKNOWN, /* Invalid? */ + /* + * Object class reference "OCLASS1", + * type reference "Type1", + * value reference "id", + * type field reference "&Type1", + * value field reference "&id", + * "OBJECT-CLASS" + */ + RLT_CAPITALS, + RLT_Uppercase, + RLT_lowercase, + RLT_AmpUppercase, + RLT_Amplowercase, + RLT_Atlowercase, + RLT_AtDotlowercase, + RLT_MAX + } lex_type; /* Inferred lexical type of the identifier */ + char *name; /* An identifier */ + } *components; + + int comp_count; /* Number of the components in the reference name. */ + int comp_size; /* Number of allocated structures */ + + int _lineno; /* Number of line in the file */ +} asn1p_ref_t; + +/* + * Constructor and destructor. + */ +asn1p_ref_t *asn1p_ref_new(int _lineno); +void asn1p_ref_free(asn1p_ref_t *); + +asn1p_ref_t *asn1p_ref_clone(asn1p_ref_t *ref); + +/* + * Add a new reference component to the existing reference structure. + * + * RETURN VALUES: + * 0: All clear. + * -1/EINVAL: Invalid arguments + * -1/ENOMEM: Memory allocation failed + */ +int asn1p_ref_add_component(asn1p_ref_t *, + char *name, enum asn1p_ref_lex_type_e); + +#endif /* ASN1_PARSER_REFERENCE_H */ diff --git a/libasn1parser/asn1p_value.c b/libasn1parser/asn1p_value.c new file mode 100644 index 000000000..fb3a9453f --- /dev/null +++ b/libasn1parser/asn1p_value.c @@ -0,0 +1,178 @@ +#include +#include +#include +#include + +#include "asn1parser.h" + + +asn1p_value_t * +asn1p_value_fromref(asn1p_ref_t *ref, int do_copy) { + if(ref) { + asn1p_value_t *v = calloc(1, sizeof *v); + if(v) { + if(do_copy) { + v->value.reference = asn1p_ref_clone(ref); + if(v->value.reference == NULL) { + free(v); + return NULL; + } + } else { + v->value.reference = ref; + } + v->type = ATV_REFERENCED; + } + return v; + } else { + errno = EINVAL; + return NULL; + } +} + +asn1p_value_t * +asn1p_value_frombits(uint8_t *bits, int size_in_bits, int do_copy) { + if(bits) { + asn1p_value_t *v = calloc(1, sizeof *v); + assert(size_in_bits >= 0); + if(v) { + if(do_copy) { + int size = ((size_in_bits + 7) >> 3); + void *p; + p = malloc(size + 1); + if(p) { + memcpy(p, bits, size); + ((char *)p)[size] = '\0'; /* JIC */ + } else { + free(v); + return NULL; + } + v->value.binary_vector.bits = p; + } else { + v->value.binary_vector.bits = (void *)bits; + } + v->value.binary_vector.size_in_bits = size_in_bits; + v->type = ATV_BITVECTOR; + } + return v; + } else { + errno = EINVAL; + return NULL; + } +} +asn1p_value_t * +asn1p_value_frombuf(char *buffer, int size, int do_copy) { + if(buffer) { + asn1p_value_t *v = calloc(1, sizeof *v); + assert(size >= 0); + if(v) { + if(do_copy) { + void *p = malloc(size + 1); + if(p) { + memcpy(p, buffer, size); + ((char *)p)[size] = '\0'; /* JIC */ + } else { + free(v); + return NULL; + } + v->value.string.buf = p; + } else { + v->value.string.buf = buffer; + } + v->value.string.size = size; + v->type = ATV_STRING; + } + return v; + } else { + errno = EINVAL; + return NULL; + } +} + +asn1p_value_t * +asn1p_value_fromdouble(double d) { + asn1p_value_t *v = calloc(1, sizeof *v); + if(v) { + v->value.v_double = d; + v->type = ATV_REAL; + } + return v; +} + +asn1p_value_t * +asn1p_value_fromint(asn1_integer_t i) { + asn1p_value_t *v = calloc(1, sizeof *v); + if(v) { + v->value.v_integer = i; + v->type = ATV_INTEGER; + } + return v; +} + +asn1p_value_t * +asn1p_value_clone(asn1p_value_t *v) { + asn1p_value_t *clone; + if(v) { + switch(v->type) { + case ATV_NOVALUE: + return calloc(1, sizeof(*v)); + case ATV_REFERENCED: + return asn1p_value_fromref(v->value.reference, 1); + case ATV_REAL: + return asn1p_value_fromdouble(v->value.v_double); + case ATV_INTEGER: + case ATV_MIN: + case ATV_MAX: + case ATV_FALSE: + case ATV_TRUE: + clone = asn1p_value_fromint(v->value.v_integer); + if(clone) clone->type = v->type; + return clone; + case ATV_STRING: + clone = asn1p_value_frombuf(v->value.string.buf, + v->value.string.size, 1); + if(clone) clone->type = v->type; + return clone; + case ATV_UNPARSED: + clone = asn1p_value_frombuf(v->value.string.buf, + v->value.string.size, 1); + if(clone) clone->type = ATV_UNPARSED; + return clone; + case ATV_BITVECTOR: + return asn1p_value_frombuf(v->value.binary_vector.bits, + v->value.binary_vector.size_in_bits, 1); + } + } + return v; +} + +void +asn1p_value_free(asn1p_value_t *v) { + if(v) { + switch(v->type) { + case ATV_NOVALUE: + break; + case ATV_REFERENCED: + asn1p_ref_free(v->value.reference); + break; + case ATV_INTEGER: + case ATV_MIN: + case ATV_MAX: + case ATV_FALSE: + case ATV_TRUE: + case ATV_REAL: + /* No freeing necessary */ + break; + case ATV_STRING: + case ATV_UNPARSED: + assert(v->value.string.buf); + free(v->value.string.buf); + break; + case ATV_BITVECTOR: + assert(v->value.binary_vector.bits); + free(v->value.binary_vector.bits); + break; + } + free(v); + } +} + diff --git a/libasn1parser/asn1p_value.h b/libasn1parser/asn1p_value.h new file mode 100644 index 000000000..c9dabfcde --- /dev/null +++ b/libasn1parser/asn1p_value.h @@ -0,0 +1,60 @@ +/* + * A generic value of different syntaxes. + */ +#ifndef ASN1_PARSER_VALUE_H +#define ASN1_PARSER_VALUE_H + +/* + * A wrapper around various kinds of values. + */ +typedef struct asn1p_value_s { + /* + * The value of the element. + */ + enum { + ATV_NOVALUE, + ATV_REFERENCED, + ATV_REAL, + ATV_INTEGER, + ATV_MIN, + ATV_MAX, + ATV_FALSE, + ATV_TRUE, + ATV_STRING, + ATV_UNPARSED, + ATV_BITVECTOR, + } type; /* Value type and location */ + + union { + asn1p_ref_t *reference; + asn1_integer_t v_integer; + double v_double; + /* + * Binary bits vector. + */ + struct { + uint8_t *buf; + int size; + } string; + struct { + uint8_t *bits; + int size_in_bits; + } binary_vector; + } value; +} asn1p_value_t; + +/* + * Constructors and destructor for value. + * If ref, bits or buffer are omitted, the corresponding function returns + * (asn1p_value_t *)0 with errno = EINVAL. + * Allocated value (where applicable) is guaranteed to be NUL-terminated. + */ +asn1p_value_t *asn1p_value_fromref(asn1p_ref_t *ref, int do_copy); +asn1p_value_t *asn1p_value_frombits(uint8_t *bits, int size_in_bits, int dc); +asn1p_value_t *asn1p_value_frombuf(char *buffer, int size, int do_copy); +asn1p_value_t *asn1p_value_fromdouble(double); +asn1p_value_t *asn1p_value_fromint(asn1_integer_t); +asn1p_value_t *asn1p_value_clone(asn1p_value_t *); +void asn1p_value_free(asn1p_value_t *); + +#endif /* ASN1_PARSER_VALUE_H */ diff --git a/libasn1parser/asn1p_xports.c b/libasn1parser/asn1p_xports.c new file mode 100644 index 000000000..cfc9fa4fa --- /dev/null +++ b/libasn1parser/asn1p_xports.c @@ -0,0 +1,34 @@ +#include +#include + +#include "asn1parser.h" + +/* + * Construct a new structure that would hold the EXPORTS or IMPORTS + * clause data. + */ +asn1p_xports_t * +asn1p_xports_new() { + asn1p_xports_t *xp; + + xp = calloc(1, sizeof *xp); + if(xp) { + TQ_INIT(&(xp->members)); + } + + return xp; +} + +/* + * Destroy the xports structure. + */ +void +asn1p_xports_free(asn1p_xports_t *xp) { + if(xp) { + if(xp->from) + free(xp->from); + if(xp->from_oid) + asn1p_oid_free(xp->from_oid); + free(xp); + } +} diff --git a/libasn1parser/asn1p_xports.h b/libasn1parser/asn1p_xports.h new file mode 100644 index 000000000..8f4fade33 --- /dev/null +++ b/libasn1parser/asn1p_xports.h @@ -0,0 +1,40 @@ +/* + * Imports and exports structure. + */ +#ifndef ASN1_PARSE_XPORTS_H +#define ASN1_PARSE_XPORTS_H + + +typedef struct asn1p_xports_s { + /* + * Type of the xports structure. + */ + enum asn1p_xports { + XPT_IMPORTS, + XPT_EXPORTS, + } xports_type; + + /* + * Module name and optional OID, occur after FROM. + */ + char *from; /* Name of the module */ + asn1p_oid_t *from_oid; /* Optional OID of the module */ + + /* + * Number of entities to import. + */ + TQ_HEAD(struct asn1p_expr_s) members; + + /* + * Pointer to the next xports structure in whatever list. + */ + TQ_ENTRY(struct asn1p_xports_s) xp_next; +} asn1p_xports_t; + +/* + * Constructor and destructor. + */ +asn1p_xports_t *asn1p_xports_new(void); +void asn1p_xports_free(asn1p_xports_t *); + +#endif /* ASN1_PARSE_XPORTS_H */ diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c new file mode 100644 index 000000000..095c9041f --- /dev/null +++ b/libasn1parser/asn1p_y.c @@ -0,0 +1,3484 @@ + +/* A Bison parser, made from asn1p_y.y + by GNU Bison version 1.28 */ + +#define YYBISON 1 /* Identify Bison output. */ + +#define yyparse asn1p_parse +#define yylex asn1p_lex +#define yyerror asn1p_error +#define yylval asn1p_lval +#define yychar asn1p_char +#define yydebug asn1p_debug +#define yynerrs asn1p_nerrs +#define TOK_PPEQ 257 +#define TOK_opaque 258 +#define TOK_bstring 259 +#define TOK_cstring 260 +#define TOK_hstring 261 +#define TOK_identifier 262 +#define TOK_number 263 +#define TOK_number_negative 264 +#define TOK_typereference 265 +#define TOK_objectclassreference 266 +#define TOK_typefieldreference 267 +#define TOK_valuefieldreference 268 +#define TOK_ABSENT 269 +#define TOK_ABSTRACT_SYNTAX 270 +#define TOK_ALL 271 +#define TOK_ANY 272 +#define TOK_APPLICATION 273 +#define TOK_AUTOMATIC 274 +#define TOK_BEGIN 275 +#define TOK_BIT 276 +#define TOK_BMPString 277 +#define TOK_BOOLEAN 278 +#define TOK_BY 279 +#define TOK_CHARACTER 280 +#define TOK_CHOICE 281 +#define TOK_CLASS 282 +#define TOK_COMPONENT 283 +#define TOK_COMPONENTS 284 +#define TOK_CONSTRAINED 285 +#define TOK_CONTAINING 286 +#define TOK_DEFAULT 287 +#define TOK_DEFINITIONS 288 +#define TOK_DEFINED 289 +#define TOK_EMBEDDED 290 +#define TOK_ENCODED 291 +#define TOK_END 292 +#define TOK_ENUMERATED 293 +#define TOK_EXPLICIT 294 +#define TOK_EXPORTS 295 +#define TOK_EXTENSIBILITY 296 +#define TOK_EXTERNAL 297 +#define TOK_FALSE 298 +#define TOK_FROM 299 +#define TOK_GeneralizedTime 300 +#define TOK_GeneralString 301 +#define TOK_GraphicString 302 +#define TOK_IA5String 303 +#define TOK_IDENTIFIER 304 +#define TOK_IMPLICIT 305 +#define TOK_IMPLIED 306 +#define TOK_IMPORTS 307 +#define TOK_INCLUDES 308 +#define TOK_INSTANCE 309 +#define TOK_INTEGER 310 +#define TOK_ISO646String 311 +#define TOK_MAX 312 +#define TOK_MIN 313 +#define TOK_MINUS_INFINITY 314 +#define TOK_NULL 315 +#define TOK_NumericString 316 +#define TOK_OBJECT 317 +#define TOK_ObjectDescriptor 318 +#define TOK_OCTET 319 +#define TOK_OF 320 +#define TOK_OPTIONAL 321 +#define TOK_PATTERN 322 +#define TOK_PDV 323 +#define TOK_PLUS_INFINITY 324 +#define TOK_PRESENT 325 +#define TOK_PrintableString 326 +#define TOK_PRIVATE 327 +#define TOK_REAL 328 +#define TOK_RELATIVE_OID 329 +#define TOK_SEQUENCE 330 +#define TOK_SET 331 +#define TOK_SIZE 332 +#define TOK_STRING 333 +#define TOK_SYNTAX 334 +#define TOK_T61String 335 +#define TOK_TAGS 336 +#define TOK_TeletexString 337 +#define TOK_TRUE 338 +#define TOK_TYPE_IDENTIFIER 339 +#define TOK_UNIQUE 340 +#define TOK_UNIVERSAL 341 +#define TOK_UniversalString 342 +#define TOK_UTCTime 343 +#define TOK_UTF8String 344 +#define TOK_VideotexString 345 +#define TOK_VisibleString 346 +#define TOK_WITH 347 +#define TOK_UNION 348 +#define TOK_INTERSECTION 349 +#define TOK_EXCEPT 350 +#define TOK_TwoDots 351 +#define TOK_ThreeDots 352 +#define TOK_tag 353 + +#line 1 "asn1p_y.y" + + +#include +#include +#include +#include +#include + +#include "asn1parser.h" + +#define YYPARSE_PARAM param +#define YYERROR_VERBOSE + +int yylex(void); +int yyerror(const char *msg); +void asn1p_lexer_hack_push_opaque_state(void); +void asn1p_lexer_hack_enable_with_syntax(void); +#define yylineno asn1p_lineno +extern int asn1p_lineno; + + +static asn1p_value_t * + _convert_bitstring2binary(char *str, int base); + +#define checkmem(ptr) do { \ + if(!(ptr)) \ + return yyerror("Memory failure"); \ + } while(0) + +#define CONSTRAINT_INSERT(root, constr_type, arg1, arg2) do { \ + if(arg1->type != constr_type) { \ + int __ret; \ + root = asn1p_constraint_new(yylineno); \ + checkmem(root); \ + root->type = constr_type; \ + __ret = asn1p_constraint_insert(root, \ + arg1); \ + checkmem(__ret == 0); \ + } else { \ + root = arg1; \ + } \ + if(arg2) { \ + int __ret \ + = asn1p_constraint_insert(root, arg2); \ + checkmem(__ret == 0); \ + } \ + } while(0) + + +#line 57 "asn1p_y.y" +typedef union { + asn1p_t *a_grammar; + asn1p_module_flags_e a_module_flags; + asn1p_module_t *a_module; + asn1p_expr_type_e a_type; /* ASN.1 Type */ + asn1p_expr_t *a_expr; /* Constructed collection */ + asn1p_constraint_t *a_constr; /* Constraint */ + enum asn1p_constraint_type_e a_ctype;/* Constraint type */ + asn1p_xports_t *a_xports; /* IMports/EXports */ + asn1p_oid_t *a_oid; /* Object Identifier */ + asn1p_oid_arc_t a_oid_arc; /* Single OID's arc */ + struct asn1p_type_tag_s a_tag; /* A tag */ + asn1p_ref_t *a_ref; /* Reference to custom type */ + asn1p_wsyntx_t *a_wsynt; /* WITH SYNTAX contents */ + asn1p_wsyntx_chunk_t *a_wchunk; /* WITH SYNTAX chunk */ + struct asn1p_ref_component_s a_refcomp; /* Component of a reference */ + asn1p_value_t *a_value; /* Number, DefinedValue, etc */ + struct asn1p_param_s a_parg; /* A parameter argument */ + asn1p_paramlist_t *a_plist; /* A pargs list */ + enum asn1p_expr_marker_e a_marker; /* OPTIONAL/DEFAULT */ + enum asn1p_constr_pres_e a_pres; /* PRESENT/ABSENT/OPTIONAL */ + asn1_integer_t a_int; + char *tv_str; + struct { + char *buf; + int len; + } tv_opaque; + struct { + char *name; + struct asn1p_type_tag_s tag; + } tv_nametag; +} YYSTYPE; +#include + +#ifndef __cplusplus +#ifndef __STDC__ +#define const +#endif +#endif + + + +#define YYFINAL 375 +#define YYFLAG -32768 +#define YYNTBASE 113 + +#define YYTRANSLATE(x) ((unsigned)(x) <= 353 ? yytranslate[x] : 211) + +static const char yytranslate[] = { 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 109, 2, 2, 2, 2, 2, 2, 104, + 105, 2, 2, 107, 2, 110, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 108, 106, 111, + 2, 2, 2, 112, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 96, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 102, 94, 103, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 95, 97, 98, + 99, 100, 101 +}; + +#if YYDEBUG != 0 +static const short yyprhs[] = { 0, + 0, 2, 4, 7, 16, 17, 19, 23, 26, 28, + 31, 33, 38, 40, 41, 43, 45, 48, 51, 54, + 57, 60, 61, 63, 65, 68, 70, 72, 74, 76, + 78, 80, 84, 87, 89, 92, 97, 99, 103, 105, + 107, 111, 115, 118, 120, 124, 126, 128, 135, 137, + 139, 140, 142, 147, 152, 156, 163, 165, 169, 171, + 175, 179, 181, 185, 187, 189, 191, 195, 201, 202, + 204, 206, 210, 213, 217, 222, 223, 225, 226, 233, + 235, 238, 240, 242, 245, 247, 251, 253, 257, 261, + 263, 265, 267, 272, 274, 278, 280, 284, 288, 290, + 294, 296, 300, 302, 304, 306, 308, 313, 314, 318, + 320, 322, 324, 326, 328, 330, 334, 336, 339, 341, + 343, 345, 347, 350, 353, 355, 357, 360, 363, 365, + 367, 369, 371, 374, 376, 379, 381, 383, 385, 387, + 389, 391, 393, 395, 397, 399, 401, 403, 405, 407, + 412, 417, 422, 427, 432, 434, 439, 440, 442, 444, + 446, 448, 450, 452, 457, 459, 462, 466, 468, 472, + 478, 480, 484, 486, 488, 492, 494, 498, 500, 504, + 506, 510, 515, 517, 519, 521, 524, 527, 531, 533, + 535, 537, 539, 541, 543, 545, 547, 549, 555, 557, + 561, 563, 567, 568, 570, 572, 574, 576, 578, 580, + 584, 589, 591, 595, 598, 602, 604, 608, 609, 611, + 613, 616, 618, 620, 621, 625, 628, 632, 634, 638, + 640, 645, 650, 652, 654, 656, 658, 659, 661, 663, + 666, 669, 671, 673, 675, 677, 679 +}; + +static const short yyrhs[] = { 114, + 0, 115, 0, 114, 115, 0, 207, 116, 34, 120, + 3, 21, 123, 38, 0, 0, 117, 0, 102, 118, + 103, 0, 102, 103, 0, 119, 0, 118, 119, 0, + 209, 0, 209, 104, 9, 105, 0, 9, 0, 0, + 121, 0, 122, 0, 121, 122, 0, 40, 82, 0, + 51, 82, 0, 20, 82, 0, 42, 52, 0, 0, + 124, 0, 125, 0, 124, 125, 0, 126, 0, 131, + 0, 137, 0, 161, 0, 134, 0, 169, 0, 53, + 127, 106, 0, 53, 45, 0, 128, 0, 127, 128, + 0, 129, 45, 207, 116, 0, 130, 0, 129, 107, + 130, 0, 207, 0, 209, 0, 41, 132, 106, 0, + 41, 17, 106, 0, 41, 106, 0, 133, 0, 132, + 107, 133, 0, 207, 0, 209, 0, 207, 135, 3, + 102, 136, 103, 0, 156, 0, 166, 0, 0, 177, + 0, 207, 3, 205, 85, 0, 207, 3, 205, 153, + 0, 207, 3, 143, 0, 207, 102, 138, 103, 3, + 153, 0, 139, 0, 138, 107, 139, 0, 207, 0, + 207, 108, 209, 0, 166, 108, 209, 0, 141, 0, + 140, 107, 141, 0, 155, 0, 209, 0, 152, 0, + 142, 107, 152, 0, 28, 102, 145, 103, 147, 0, + 0, 86, 0, 146, 0, 145, 107, 146, 0, 159, + 197, 0, 159, 153, 144, 0, 159, 159, 197, 144, + 0, 0, 148, 0, 0, 93, 80, 102, 149, 150, + 103, 0, 151, 0, 150, 151, 0, 4, 0, 159, + 0, 210, 153, 0, 154, 0, 155, 171, 197, 0, + 100, 0, 100, 109, 164, 0, 100, 109, 204, 0, + 168, 0, 169, 0, 170, 0, 207, 102, 140, 103, + 0, 156, 0, 55, 66, 156, 0, 11, 0, 11, + 110, 207, 0, 11, 110, 209, 0, 208, 0, 208, + 110, 157, 0, 158, 0, 157, 110, 158, 0, 160, + 0, 160, 0, 13, 0, 14, 0, 209, 135, 3, + 162, 0, 0, 102, 163, 165, 0, 5, 0, 7, + 0, 6, 0, 204, 0, 164, 0, 209, 0, 207, + 110, 209, 0, 4, 0, 165, 4, 0, 24, 0, + 61, 0, 74, 0, 167, 0, 65, 79, 0, 63, + 50, 0, 75, 0, 43, 0, 36, 69, 0, 26, + 79, 0, 89, 0, 46, 0, 56, 0, 39, 0, + 22, 79, 0, 166, 0, 167, 201, 0, 23, 0, + 47, 0, 48, 0, 49, 0, 57, 0, 62, 0, + 72, 0, 81, 0, 83, 0, 88, 0, 90, 0, + 91, 0, 92, 0, 64, 0, 27, 102, 142, 103, + 0, 76, 102, 142, 103, 0, 77, 102, 142, 103, + 0, 76, 171, 66, 155, 0, 77, 171, 66, 155, + 0, 18, 0, 18, 35, 25, 209, 0, 0, 175, + 0, 94, 0, 95, 0, 96, 0, 97, 0, 98, + 0, 78, 104, 177, 105, 0, 176, 0, 175, 176, + 0, 104, 177, 105, 0, 178, 0, 178, 107, 100, + 0, 178, 107, 100, 107, 178, 0, 100, 0, 100, + 107, 178, 0, 179, 0, 180, 0, 179, 172, 180, + 0, 181, 0, 180, 173, 181, 0, 182, 0, 181, + 174, 182, 0, 185, 0, 185, 183, 185, 0, 184, + 104, 177, 105, 0, 191, 0, 186, 0, 99, 0, + 99, 111, 0, 111, 99, 0, 111, 99, 111, 0, + 78, 0, 45, 0, 204, 0, 209, 0, 6, 0, + 59, 0, 58, 0, 44, 0, 84, 0, 93, 30, + 102, 187, 103, 0, 188, 0, 187, 107, 188, 0, + 100, 0, 209, 171, 189, 0, 0, 190, 0, 71, + 0, 15, 0, 67, 0, 192, 0, 193, 0, 102, + 207, 103, 0, 192, 102, 194, 103, 0, 195, 0, + 194, 107, 195, 0, 112, 196, 0, 112, 110, 196, + 0, 209, 0, 196, 110, 209, 0, 0, 198, 0, + 67, 0, 33, 199, 0, 185, 0, 166, 0, 0, + 102, 200, 165, 0, 102, 103, 0, 102, 202, 103, + 0, 203, 0, 202, 107, 203, 0, 209, 0, 209, + 104, 204, 105, 0, 209, 104, 164, 105, 0, 204, + 0, 100, 0, 9, 0, 10, 0, 0, 206, 0, + 101, 0, 101, 51, 0, 101, 40, 0, 11, 0, + 12, 0, 12, 0, 8, 0, 209, 0, 209, 206, + 0 +}; + +#endif + +#if YYDEBUG != 0 +static const short yyrline[] = { 0, + 297, 303, 309, 325, 350, 352, 355, 359, 364, 371, + 379, 384, 388, 397, 399, 407, 411, 419, 423, 426, + 429, 437, 439, 448, 452, 477, 481, 490, 497, 510, + 521, 534, 541, 546, 552, 558, 567, 573, 579, 586, + 594, 598, 601, 608, 614, 620, 627, 636, 646, 654, + 662, 664, 676, 688, 695, 711, 721, 731, 741, 746, + 753, 763, 769, 775, 779, 791, 797, 803, 813, 815, + 818, 826, 832, 841, 846, 863, 865, 870, 874, 879, + 884, 890, 894, 919, 926, 931, 939, 948, 957, 968, + 972, 978, 986, 1010, 1017, 1031, 1040, 1050, 1060, 1068, + 1089, 1098, 1107, 1108, 1110, 1117, 1129, 1139, 1141, 1146, + 1150, 1154, 1158, 1161, 1166, 1178, 1194, 1205, 1219, 1221, + 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, + 1237, 1239, 1240, 1243, 1250, 1262, 1264, 1268, 1272, 1273, + 1274, 1275, 1276, 1280, 1281, 1282, 1283, 1287, 1288, 1291, + 1298, 1304, 1310, 1318, 1326, 1332, 1348, 1350, 1353, 1353, + 1354, 1354, 1355, 1357, 1370, 1373, 1378, 1384, 1388, 1395, + 1403, 1408, 1417, 1419, 1421, 1426, 1428, 1434, 1436, 1441, + 1448, 1455, 1463, 1466, 1471, 1473, 1474, 1475, 1478, 1482, + 1487, 1491, 1502, 1506, 1511, 1516, 1521, 1528, 1534, 1538, + 1543, 1549, 1561, 1563, 1566, 1570, 1573, 1578, 1582, 1590, + 1605, 1611, 1618, 1631, 1643, 1658, 1662, 1679, 1681, 1684, + 1688, 1694, 1697, 1699, 1699, 1719, 1724, 1729, 1735, 1741, + 1749, 1757, 1765, 1772, 1782, 1787, 1817, 1819, 1822, 1827, + 1831, 1837, 1842, 1848, 1855, 1862, 1867 +}; +#endif + + +#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) + +static const char * const yytname[] = { "$","error","$undefined.","TOK_PPEQ", +"TOK_opaque","TOK_bstring","TOK_cstring","TOK_hstring","TOK_identifier","TOK_number", +"TOK_number_negative","TOK_typereference","TOK_objectclassreference","TOK_typefieldreference", +"TOK_valuefieldreference","TOK_ABSENT","TOK_ABSTRACT_SYNTAX","TOK_ALL","TOK_ANY", +"TOK_APPLICATION","TOK_AUTOMATIC","TOK_BEGIN","TOK_BIT","TOK_BMPString","TOK_BOOLEAN", +"TOK_BY","TOK_CHARACTER","TOK_CHOICE","TOK_CLASS","TOK_COMPONENT","TOK_COMPONENTS", +"TOK_CONSTRAINED","TOK_CONTAINING","TOK_DEFAULT","TOK_DEFINITIONS","TOK_DEFINED", +"TOK_EMBEDDED","TOK_ENCODED","TOK_END","TOK_ENUMERATED","TOK_EXPLICIT","TOK_EXPORTS", +"TOK_EXTENSIBILITY","TOK_EXTERNAL","TOK_FALSE","TOK_FROM","TOK_GeneralizedTime", +"TOK_GeneralString","TOK_GraphicString","TOK_IA5String","TOK_IDENTIFIER","TOK_IMPLICIT", +"TOK_IMPLIED","TOK_IMPORTS","TOK_INCLUDES","TOK_INSTANCE","TOK_INTEGER","TOK_ISO646String", +"TOK_MAX","TOK_MIN","TOK_MINUS_INFINITY","TOK_NULL","TOK_NumericString","TOK_OBJECT", +"TOK_ObjectDescriptor","TOK_OCTET","TOK_OF","TOK_OPTIONAL","TOK_PATTERN","TOK_PDV", +"TOK_PLUS_INFINITY","TOK_PRESENT","TOK_PrintableString","TOK_PRIVATE","TOK_REAL", +"TOK_RELATIVE_OID","TOK_SEQUENCE","TOK_SET","TOK_SIZE","TOK_STRING","TOK_SYNTAX", +"TOK_T61String","TOK_TAGS","TOK_TeletexString","TOK_TRUE","TOK_TYPE_IDENTIFIER", +"TOK_UNIQUE","TOK_UNIVERSAL","TOK_UniversalString","TOK_UTCTime","TOK_UTF8String", +"TOK_VideotexString","TOK_VisibleString","TOK_WITH","'|'","TOK_UNION","'^'", +"TOK_INTERSECTION","TOK_EXCEPT","TOK_TwoDots","TOK_ThreeDots","TOK_tag","'{'", +"'}'","'('","')'","';'","','","':'","'!'","'.'","'<'","'@'","ParsedGrammar", +"ModuleList","ModuleSpecification","optObjectIdentifier","ObjectIdentifier", +"ObjectIdentifierBody","ObjectIdentifierElement","optModuleSpecificationFlags", +"ModuleSpecificationFlags","ModuleSpecificationFlag","optModuleSpecificationBody", +"ModuleSpecificationBody","ModuleSpecificationElement","ImportsDefinition","ImportsBundleSet", +"ImportsBundle","ImportsList","ImportsElement","ExportsDefinition","ExportsBody", +"ExportsElement","ValueSetDefinition","DefinedTypeRef","optValueSetBody","DataTypeReference", +"ParameterArgumentList","ParameterArgumentName","ActualParameterList","ActualParameter", +"ConstructedDataTypeDefinition","ClassDeclaration","optUnique","ClassFieldList", +"ClassField","optWithSyntax","WithSyntax","@1","WithSyntaxFormat","WithSyntaxFormatToken", +"DataTypeMember","ConstrainedTypeDeclaration","ExtensionAndException","TypeDeclaration", +"ComplexTypeReference","ComplexTypeReferenceAmpList","ComplexTypeReferenceElement", +"ClassFieldIdentifier","ClassFieldName","ValueDefinition","InlineOrDefinedValue", +"@2","DefinedValue","Opaque","BasicTypeId","BasicTypeId_UniverationCompatible", +"BasicType","BasicString","ConstructedType","optConstraints","Union","Intersection", +"Except","Constraints","SingleConstraint","ConstraintElementSet","ConstraintElement", +"ConstraintElementUnion","ConstraintElementIntersection","ConstraintElementException", +"ConstraintSubtypeElement","ConstraintRangeSpec","ConstraintSpec","ConstraintValue", +"WithComponents","WithComponentsList","WithComponentsElement","optPresenceConstraint", +"PresenceConstraint","TableConstraint","SimpleTableConstraint","ComponentRelationConstraint", +"AtNotationList","AtNotationElement","ComponentIdList","optMarker","Marker", +"DefaultValue","@3","UniverationDefinition","UniverationList","UniverationElement", +"SignedNumber","optTag","Tag","TypeRefName","ObjectClassReference","Identifier", +"TaggedIdentifier", NULL +}; +#endif + +static const short yyr1[] = { 0, + 113, 114, 114, 115, 116, 116, 117, 117, 118, 118, + 119, 119, 119, 120, 120, 121, 121, 122, 122, 122, + 122, 123, 123, 124, 124, 125, 125, 125, 125, 125, + 125, 126, 126, 127, 127, 128, 129, 129, 130, 130, + 131, 131, 131, 132, 132, 133, 133, 134, 135, 135, + 136, 136, 137, 137, 137, 137, 138, 138, 139, 139, + 139, 140, 140, 141, 141, 142, 142, 143, 144, 144, + 145, 145, 146, 146, 146, 147, 147, 149, 148, 150, + 150, 151, 151, 152, 152, 153, 154, 154, 154, 155, + 155, 155, 155, 155, 155, 156, 156, 156, 156, 156, + 157, 157, 158, 159, 160, 160, 161, 163, 162, 162, + 162, 162, 162, 162, 164, 164, 165, 165, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, + 167, 167, 167, 168, 168, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 170, + 170, 170, 170, 170, 170, 170, 171, 171, 172, 172, + 173, 173, 174, 175, 175, 175, 176, 177, 177, 177, + 177, 177, 178, 179, 179, 180, 180, 181, 181, 182, + 182, 182, 182, 182, 183, 183, 183, 183, 184, 184, + 185, 185, 185, 185, 185, 185, 185, 186, 187, 187, + 188, 188, 189, 189, 190, 190, 190, 191, 191, 192, + 193, 194, 194, 195, 195, 196, 196, 197, 197, 198, + 198, 199, 199, 200, 199, 201, 201, 202, 202, 203, + 203, 203, 203, 203, 204, 204, 205, 205, 206, 206, + 206, 207, 207, 208, 209, 210, 210 +}; + +static const short yyr2[] = { 0, + 1, 1, 2, 8, 0, 1, 3, 2, 1, 2, + 1, 4, 1, 0, 1, 1, 2, 2, 2, 2, + 2, 0, 1, 1, 2, 1, 1, 1, 1, 1, + 1, 3, 2, 1, 2, 4, 1, 3, 1, 1, + 3, 3, 2, 1, 3, 1, 1, 6, 1, 1, + 0, 1, 4, 4, 3, 6, 1, 3, 1, 3, + 3, 1, 3, 1, 1, 1, 3, 5, 0, 1, + 1, 3, 2, 3, 4, 0, 1, 0, 6, 1, + 2, 1, 1, 2, 1, 3, 1, 3, 3, 1, + 1, 1, 4, 1, 3, 1, 3, 3, 1, 3, + 1, 3, 1, 1, 1, 1, 4, 0, 3, 1, + 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, + 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, + 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, + 4, 4, 4, 4, 1, 4, 0, 1, 1, 1, + 1, 1, 1, 4, 1, 2, 3, 1, 3, 5, + 1, 3, 1, 1, 3, 1, 3, 1, 3, 1, + 3, 4, 1, 1, 1, 2, 2, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 5, 1, 3, + 1, 3, 0, 1, 1, 1, 1, 1, 1, 3, + 4, 1, 3, 2, 3, 1, 3, 0, 1, 1, + 2, 1, 1, 0, 3, 2, 3, 1, 3, 1, + 4, 4, 1, 1, 1, 1, 0, 1, 1, 2, + 2, 1, 1, 1, 1, 1, 2 +}; + +static const short yydefact[] = { 0, + 242, 243, 1, 2, 5, 3, 0, 0, 6, 245, + 13, 8, 0, 9, 11, 14, 7, 10, 0, 0, + 0, 0, 0, 0, 15, 16, 0, 20, 18, 21, + 19, 0, 17, 12, 22, 136, 0, 137, 138, 139, + 0, 140, 141, 149, 142, 143, 144, 145, 146, 147, + 148, 0, 23, 24, 26, 27, 30, 28, 29, 31, + 0, 0, 0, 43, 0, 44, 46, 47, 33, 0, + 34, 0, 37, 39, 40, 4, 25, 237, 96, 244, + 0, 119, 0, 0, 132, 126, 130, 131, 120, 0, + 0, 121, 125, 129, 0, 0, 49, 50, 122, 99, + 0, 42, 41, 0, 32, 35, 0, 0, 0, 239, + 55, 0, 238, 0, 133, 128, 127, 124, 123, 0, + 57, 0, 59, 0, 0, 0, 45, 5, 38, 0, + 241, 240, 96, 244, 155, 0, 0, 157, 157, 53, + 54, 157, 94, 134, 122, 90, 91, 92, 0, 97, + 98, 0, 0, 0, 0, 51, 105, 106, 100, 101, + 103, 110, 112, 111, 235, 236, 108, 107, 114, 113, + 0, 115, 36, 0, 71, 218, 104, 0, 0, 0, + 0, 0, 0, 0, 158, 165, 0, 0, 218, 0, + 135, 0, 0, 58, 61, 60, 193, 196, 190, 195, + 194, 189, 197, 0, 171, 0, 0, 52, 168, 173, + 174, 176, 178, 0, 180, 184, 183, 208, 209, 191, + 192, 0, 0, 0, 76, 0, 0, 220, 69, 218, + 73, 219, 0, 87, 0, 66, 85, 246, 0, 95, + 0, 0, 0, 0, 166, 0, 0, 86, 234, 226, + 0, 228, 233, 230, 0, 62, 64, 65, 56, 0, + 0, 0, 48, 0, 159, 160, 0, 161, 162, 0, + 163, 0, 0, 185, 0, 0, 0, 102, 117, 109, + 116, 0, 68, 77, 72, 224, 223, 222, 221, 70, + 74, 69, 156, 0, 150, 0, 247, 84, 0, 151, + 167, 153, 152, 154, 227, 0, 0, 93, 0, 0, + 172, 210, 169, 175, 177, 179, 0, 186, 187, 181, + 0, 0, 212, 118, 0, 0, 75, 88, 89, 67, + 164, 229, 0, 0, 63, 201, 0, 199, 157, 0, + 182, 188, 0, 214, 216, 211, 0, 78, 225, 232, + 231, 198, 0, 203, 170, 215, 0, 213, 0, 200, + 206, 207, 205, 202, 204, 217, 82, 0, 80, 83, + 79, 81, 0, 0, 0 +}; + +static const short yydefgoto[] = { 373, + 3, 4, 8, 9, 13, 14, 24, 25, 26, 52, + 53, 54, 55, 70, 71, 72, 73, 56, 65, 66, + 57, 96, 207, 58, 120, 121, 255, 256, 235, 111, + 291, 174, 175, 283, 284, 359, 368, 369, 236, 141, + 237, 142, 143, 159, 160, 176, 177, 59, 168, 223, + 169, 280, 144, 145, 146, 147, 148, 184, 267, 270, + 272, 185, 186, 208, 209, 210, 211, 212, 213, 276, + 214, 215, 216, 337, 338, 364, 365, 217, 218, 219, + 322, 323, 344, 231, 232, 289, 326, 191, 251, 252, + 220, 112, 113, 149, 100, 221, 239 +}; + +static const short yypact[] = { 81, +-32768,-32768, 81,-32768, -45,-32768, 23, 70,-32768,-32768, +-32768,-32768, 47,-32768, 31, 190,-32768,-32768, 132, 61, + 69, 108, 86, 176, 190,-32768, 76,-32768,-32768,-32768, +-32768, 166,-32768,-32768, 442,-32768, 32,-32768,-32768,-32768, + 121,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768, 168, 442,-32768,-32768,-32768,-32768,-32768,-32768,-32768, + 179, 732, 103,-32768, 52,-32768,-32768,-32768,-32768, 39, +-32768, 16,-32768,-32768,-32768,-32768,-32768, -11, 111,-32768, + 150,-32768, 152, 142,-32768,-32768,-32768,-32768,-32768, 184, + 159,-32768,-32768,-32768, 748, 240,-32768,-32768,-32768, 135, + 243,-32768,-32768, 141,-32768,-32768, 81, 141, 145, 60, +-32768, 599,-32768, 141,-32768,-32768,-32768,-32768,-32768, -1, +-32768, 143, 144, 147, 206, 68,-32768, -45,-32768, 206, +-32768,-32768, -42, 148, 221, 161, 198, 40, 53,-32768, +-32768, -37,-32768,-32768, 163,-32768,-32768,-32768, 164,-32768, +-32768, 264, 748, 261, 261, 155,-32768,-32768, 160,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, + 162,-32768,-32768, 64,-32768, 524,-32768, 246, 21, 212, + 169, 21, 155, 208, 171,-32768, 21, 210, 2, 17, +-32768, 383, 674,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 247, 172, 81, 175,-32768, 173, 133, + 140, 185,-32768, 178, 35,-32768,-32768, 182,-32768,-32768, +-32768, 206, 281, 261, 193, 206, 301,-32768, 202, 2, +-32768,-32768, 261, 181, 66,-32768,-32768, 191, 674,-32768, + 155, 71, 186, 674,-32768, 89, 674,-32768,-32768,-32768, + 90,-32768,-32768, 189, 91,-32768,-32768,-32768,-32768, 192, + 309, 194,-32768, 196,-32768,-32768, 309,-32768,-32768, 309, +-32768, 309, 155, 187, 205, 78, 200,-32768,-32768, 297, +-32768, 225,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768, 202,-32768, 250,-32768, 21,-32768,-32768, 201,-32768, +-32768,-32768,-32768,-32768,-32768, 56, 250,-32768, 383, 25, +-32768,-32768, 209, 140, 185,-32768, 215,-32768, 211,-32768, + 6, 101,-32768,-32768, 219, 281,-32768,-32768,-32768,-32768, +-32768,-32768, 223, 224,-32768,-32768, 109,-32768, -37, 309, +-32768,-32768, 261, 203,-32768,-32768, 200,-32768, 297,-32768, +-32768,-32768, 25, 24,-32768, 203, 261,-32768, 126,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768, 9,-32768,-32768, +-32768,-32768, 324, 326,-32768 +}; + +static const short yypgoto[] = {-32768, +-32768, 327, 204,-32768,-32768, 318,-32768,-32768, 308,-32768, +-32768, 282,-32768,-32768, 268,-32768, 226,-32768,-32768, 235, +-32768, 279,-32768,-32768,-32768, 195,-32768, 33, -129,-32768, + 51,-32768, 123,-32768,-32768,-32768,-32768, -17, 59, -156, +-32768, -185, -52,-32768, 130, -173, -109,-32768,-32768,-32768, + -209, 30, -50, -43,-32768, 46,-32768, -137,-32768,-32768, +-32768,-32768, 180, -159, -246,-32768, 94, 88, 97,-32768, +-32768, -206,-32768,-32768, 10,-32768,-32768,-32768,-32768,-32768, +-32768, 26, 27, -141,-32768,-32768,-32768,-32768,-32768, 65, + -118,-32768, 134, 1,-32768, -7,-32768 +}; + + +#define YYLAST 837 + + +static const short yytable[] = { 15, + 5, 188, 230, 5, 189, 15, 257, 170, 97, 97, + 98, 98, 367, 10, 311, 161, 109, 99, 99, 229, + 288, 157, 158, 243, 10, 165, 166, 62, 10, 68, + 10, 11, 10, 75, 227, 61, 259, 67, 361, 10, + 181, 74, 1, 2, 122, 62, 10, 248, 63, 1, + 2, 99, 242, 61, 10, 11, 7, 246, 302, -242, + 107, 304, 75, 10, 165, 166, 183, 114, 228, 320, + 74, 253, 162, 163, 164, 10, 165, 166, 1, 2, + 60, 299, 298, 197, 328, 10, 165, 166, 292, 110, + 362, 1, 2, 355, 363, 123, 68, 333, 60, 131, + 75, 152, 122, 16, 67, 153, 151, 128, 74, 99, + 132, 371, 161, 317, 150, 343, 249, 181, 172, 250, + 234, 198, 108, 257, 336, 12, 171, 240, 10, 367, + 181, 1, 2, 274, 19, 200, 201, 64, 157, 158, + 27, 182, 28, 183, 105, 275, 195, 196, 10, 17, + 29, 1, 2, 123, 187, 249, 183, 103, 104, 30, + 197, 203, 10, 165, 166, 69, 225, 31, 295, 167, + 226, 238, 296, 300, 238, 329, 287, 296, 32, 238, + 34, 78, 254, 99, 258, 370, 35, 253, 334, 79, + 80, 303, 305, 308, 370, 296, 306, 309, 198, 199, + 81, 354, 82, 346, 83, 76, 262, 347, 102, 20, + 117, 352, 200, 201, 84, 353, 281, 85, 157, 158, + 114, 86, 79, 80, 87, 293, 265, 266, 115, 21, + 116, 22, 202, 118, 88, 268, 269, 119, 203, 89, + 23, 90, 124, 91, 125, 126, 130, 204, 156, -243, + 154, 155, 92, 93, 205, 178, 206, 10, 165, 166, + 1, 2, 179, 180, 190, 192, 193, 94, 10, 222, + 233, 224, 241, 244, 183, 247, 260, 263, 261, 264, + 95, 273, 271, 277, 279, 282, 172, 290, 238, 294, + 301, 110, 307, 310, 171, 313, 312, 318, 254, 172, + 324, 258, 339, 319, 325, 331, 197, 171, 10, 165, + 166, 321, 357, 345, 197, 340, 10, 165, 166, 341, + 348, 342, 81, 374, 82, 375, 83, 350, 351, 6, + 18, 173, 33, 129, 77, 345, 84, 106, 127, 85, + 101, 335, 327, 86, 198, 339, 87, 194, 285, 366, + 372, 278, 198, 199, 330, 349, 88, 315, 200, 201, + 314, 89, 360, 90, 245, 91, 200, 201, 316, 356, + 332, 297, 358, 0, 92, 93, 0, 0, 0, 0, + 0, 0, 0, 0, 203, 0, 202, 0, 0, 94, + 10, 0, 203, 133, 134, 0, 0, 0, 0, 0, + 135, 204, 286, 0, 81, 36, 82, 0, 83, 136, + 206, 0, 0, 0, 0, 0, 0, 0, 84, 0, + 0, 85, 0, 0, 0, 86, 0, 0, 87, 38, + 39, 40, 0, 0, 0, 0, 0, 137, 88, 42, + 0, 0, 0, 89, 43, 90, 44, 91, 0, 10, + 0, 0, 1, 2, 45, 0, 92, 93, 138, 139, + 0, 0, 0, 46, 36, 47, 0, 0, 0, 0, + 48, 94, 49, 50, 51, 0, 0, 0, 0, 0, + 0, 0, 37, 0, 0, 0, 0, 0, 38, 39, + 40, 0, 0, 0, 41, 0, 0, 0, 42, 0, + 0, 0, 0, 43, 0, 44, 0, 0, 0, 0, + 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, + 0, 0, 46, 0, 47, 0, 0, 0, 0, 48, + 0, 49, 50, 51, 133, 134, 157, 158, 0, 0, + 0, 135, 0, 0, 0, 81, 36, 82, 0, 83, + 136, 0, 0, 0, 0, 0, 227, 0, 0, 84, + 0, 0, 85, 0, 0, 0, 86, 0, 0, 87, + 38, 39, 40, 0, 0, 0, 0, 0, 137, 88, + 42, 0, 0, 0, 89, 43, 90, 44, 91, 0, + 228, 0, 0, 0, 0, 45, 0, 92, 93, 138, + 139, 0, 0, 0, 46, 0, 47, 0, 0, 133, + 134, 48, 94, 49, 50, 51, 135, 0, 0, 0, + 81, 36, 82, 0, 83, 136, 0, 0, 0, 0, + 0, 0, 0, 0, 84, 0, 0, 85, 0, 0, + 0, 86, 0, 0, 87, 38, 39, 40, 0, 0, + 0, 0, 0, 137, 88, 42, 0, 0, 0, 89, + 43, 90, 44, 91, 0, 0, 0, 0, 0, 0, + 45, 0, 92, 93, 138, 139, 0, 0, 0, 46, + 0, 47, 0, 140, 133, 134, 48, 94, 49, 50, + 51, 135, 0, 0, 0, 81, 36, 82, 0, 83, + 136, 0, 0, 0, 0, 0, 0, 0, 0, 84, + 0, 0, 85, 0, 0, 0, 86, 0, 0, 87, + 38, 39, 40, 0, 0, 0, 0, 0, 137, 88, + 42, 0, 0, 0, 89, 43, 90, 44, 91, 0, + 0, 0, 79, 80, 0, 45, 0, 92, 93, 138, + 139, 0, 0, 81, 46, 82, 47, 83, 1, 2, + 0, 48, 94, 49, 50, 51, 0, 84, 0, 81, + 85, 82, 0, 83, 86, 0, 0, 87, 0, 0, + 0, 0, 0, 84, 0, 0, 85, 88, 0, 0, + 86, 0, 89, 87, 90, 0, 91, 0, 0, 0, + 0, 0, 0, 88, 0, 92, 93, 0, 89, 0, + 90, 0, 91, 0, 0, 0, 0, 0, 0, 0, + 94, 92, 93, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 94 +}; + +static const short yycheck[] = { 7, + 0, 139, 176, 3, 142, 13, 192, 126, 61, 62, + 61, 62, 4, 8, 261, 125, 28, 61, 62, 176, + 227, 13, 14, 183, 8, 9, 10, 35, 8, 37, + 8, 9, 8, 41, 33, 35, 193, 37, 15, 8, + 78, 41, 11, 12, 95, 53, 8, 189, 17, 11, + 12, 95, 182, 53, 8, 9, 102, 187, 244, 102, + 45, 247, 70, 8, 9, 10, 104, 110, 67, 276, + 70, 190, 5, 6, 7, 8, 9, 10, 11, 12, + 35, 241, 239, 6, 294, 8, 9, 10, 230, 101, + 67, 11, 12, 340, 71, 95, 104, 307, 53, 40, + 108, 103, 153, 34, 104, 107, 114, 107, 108, 153, + 51, 103, 222, 273, 114, 110, 100, 78, 126, 103, + 100, 44, 107, 309, 100, 103, 126, 180, 8, 4, + 78, 11, 12, 99, 104, 58, 59, 106, 13, 14, + 9, 102, 82, 104, 106, 111, 154, 155, 8, 103, + 82, 11, 12, 153, 102, 100, 104, 106, 107, 52, + 6, 84, 8, 9, 10, 45, 103, 82, 103, 102, + 107, 179, 107, 103, 182, 294, 227, 107, 3, 187, + 105, 3, 190, 227, 192, 359, 21, 306, 307, 11, + 12, 103, 103, 103, 368, 107, 107, 107, 44, 45, + 22, 339, 24, 103, 26, 38, 206, 107, 106, 20, + 69, 103, 58, 59, 36, 107, 224, 39, 13, 14, + 110, 43, 11, 12, 46, 233, 94, 95, 79, 40, + 79, 42, 78, 50, 56, 96, 97, 79, 84, 61, + 51, 63, 3, 65, 110, 3, 102, 93, 102, 102, + 108, 108, 74, 75, 100, 35, 102, 8, 9, 10, + 11, 12, 102, 66, 102, 102, 3, 89, 8, 110, + 25, 110, 104, 66, 104, 66, 30, 103, 107, 107, + 102, 104, 98, 102, 4, 93, 294, 86, 296, 109, + 105, 101, 104, 102, 294, 100, 103, 111, 306, 307, + 4, 309, 310, 99, 80, 105, 6, 307, 8, 9, + 10, 112, 110, 321, 6, 107, 8, 9, 10, 105, + 102, 111, 22, 0, 24, 0, 26, 105, 105, 3, + 13, 128, 25, 108, 53, 343, 36, 70, 104, 39, + 62, 309, 292, 43, 44, 353, 46, 153, 226, 357, + 368, 222, 44, 45, 296, 326, 56, 270, 58, 59, + 267, 61, 353, 63, 185, 65, 58, 59, 272, 343, + 306, 238, 347, -1, 74, 75, -1, -1, -1, -1, + -1, -1, -1, -1, 84, -1, 78, -1, -1, 89, + 8, -1, 84, 11, 12, -1, -1, -1, -1, -1, + 18, 93, 102, -1, 22, 23, 24, -1, 26, 27, + 102, -1, -1, -1, -1, -1, -1, -1, 36, -1, + -1, 39, -1, -1, -1, 43, -1, -1, 46, 47, + 48, 49, -1, -1, -1, -1, -1, 55, 56, 57, + -1, -1, -1, 61, 62, 63, 64, 65, -1, 8, + -1, -1, 11, 12, 72, -1, 74, 75, 76, 77, + -1, -1, -1, 81, 23, 83, -1, -1, -1, -1, + 88, 89, 90, 91, 92, -1, -1, -1, -1, -1, + -1, -1, 41, -1, -1, -1, -1, -1, 47, 48, + 49, -1, -1, -1, 53, -1, -1, -1, 57, -1, + -1, -1, -1, 62, -1, 64, -1, -1, -1, -1, + -1, -1, -1, 72, -1, -1, -1, -1, -1, -1, + -1, -1, 81, -1, 83, -1, -1, -1, -1, 88, + -1, 90, 91, 92, 11, 12, 13, 14, -1, -1, + -1, 18, -1, -1, -1, 22, 23, 24, -1, 26, + 27, -1, -1, -1, -1, -1, 33, -1, -1, 36, + -1, -1, 39, -1, -1, -1, 43, -1, -1, 46, + 47, 48, 49, -1, -1, -1, -1, -1, 55, 56, + 57, -1, -1, -1, 61, 62, 63, 64, 65, -1, + 67, -1, -1, -1, -1, 72, -1, 74, 75, 76, + 77, -1, -1, -1, 81, -1, 83, -1, -1, 11, + 12, 88, 89, 90, 91, 92, 18, -1, -1, -1, + 22, 23, 24, -1, 26, 27, -1, -1, -1, -1, + -1, -1, -1, -1, 36, -1, -1, 39, -1, -1, + -1, 43, -1, -1, 46, 47, 48, 49, -1, -1, + -1, -1, -1, 55, 56, 57, -1, -1, -1, 61, + 62, 63, 64, 65, -1, -1, -1, -1, -1, -1, + 72, -1, 74, 75, 76, 77, -1, -1, -1, 81, + -1, 83, -1, 85, 11, 12, 88, 89, 90, 91, + 92, 18, -1, -1, -1, 22, 23, 24, -1, 26, + 27, -1, -1, -1, -1, -1, -1, -1, -1, 36, + -1, -1, 39, -1, -1, -1, 43, -1, -1, 46, + 47, 48, 49, -1, -1, -1, -1, -1, 55, 56, + 57, -1, -1, -1, 61, 62, 63, 64, 65, -1, + -1, -1, 11, 12, -1, 72, -1, 74, 75, 76, + 77, -1, -1, 22, 81, 24, 83, 26, 11, 12, + -1, 88, 89, 90, 91, 92, -1, 36, -1, 22, + 39, 24, -1, 26, 43, -1, -1, 46, -1, -1, + -1, -1, -1, 36, -1, -1, 39, 56, -1, -1, + 43, -1, 61, 46, 63, -1, 65, -1, -1, -1, + -1, -1, -1, 56, -1, 74, 75, -1, 61, -1, + 63, -1, 65, -1, -1, -1, -1, -1, -1, -1, + 89, 74, 75, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 89 +}; +/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ +#line 3 "/usr/share/bison.simple" +/* This file comes from bison-1.28. */ + +/* Skeleton output parser for bison, + Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* This is the parser code that is written into each bison parser + when the %semantic_parser declaration is not specified in the grammar. + It was written by Richard Stallman by simplifying the hairy parser + used when %semantic_parser is specified. */ + +#ifndef YYSTACK_USE_ALLOCA +#ifdef alloca +#define YYSTACK_USE_ALLOCA +#else /* alloca not defined */ +#ifdef __GNUC__ +#define YYSTACK_USE_ALLOCA +#define alloca __builtin_alloca +#else /* not GNU C. */ +#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) +#define YYSTACK_USE_ALLOCA +#include +#else /* not sparc */ +/* We think this test detects Watcom and Microsoft C. */ +/* This used to test MSDOS, but that is a bad idea + since that symbol is in the user namespace. */ +#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) +#if 0 /* No need for malloc.h, which pollutes the namespace; + instead, just don't use alloca. */ +#include +#endif +#else /* not MSDOS, or __TURBOC__ */ +#if defined(_AIX) +/* I don't know what this was needed for, but it pollutes the namespace. + So I turned it off. rms, 2 May 1997. */ +/* #include */ + #pragma alloca +#define YYSTACK_USE_ALLOCA +#else /* not MSDOS, or __TURBOC__, or _AIX */ +#if 0 +#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up, + and on HPUX 10. Eventually we can turn this on. */ +#define YYSTACK_USE_ALLOCA +#define alloca __builtin_alloca +#endif /* __hpux */ +#endif +#endif /* not _AIX */ +#endif /* not MSDOS, or __TURBOC__ */ +#endif /* not sparc */ +#endif /* not GNU C */ +#endif /* alloca not defined */ +#endif /* YYSTACK_USE_ALLOCA not defined */ + +#ifdef YYSTACK_USE_ALLOCA +#define YYSTACK_ALLOC alloca +#else +#define YYSTACK_ALLOC malloc +#endif + +/* Note: there must be only one dollar sign in this file. + It is replaced by the list of actions, each action + as one case of the switch. */ + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY -2 +#define YYEOF 0 +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrlab1 +/* Like YYERROR except do call yyerror. + This remains here temporarily to ease the + transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ +#define YYFAIL goto yyerrlab +#define YYRECOVERING() (!!yyerrstatus) +#define YYBACKUP(token, value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { yychar = (token), yylval = (value); \ + yychar1 = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { yyerror ("syntax error: cannot back up"); YYERROR; } \ +while (0) + +#define YYTERROR 1 +#define YYERRCODE 256 + +#ifndef YYPURE +#define YYLEX yylex() +#endif + +#ifdef YYPURE +#ifdef YYLSP_NEEDED +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval, &yylloc) +#endif +#else /* not YYLSP_NEEDED */ +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval) +#endif +#endif /* not YYLSP_NEEDED */ +#endif + +/* If nonreentrant, generate the variables here */ + +#ifndef YYPURE + +int yychar; /* the lookahead symbol */ +YYSTYPE yylval; /* the semantic value of the */ + /* lookahead symbol */ + +#ifdef YYLSP_NEEDED +YYLTYPE yylloc; /* location data for the lookahead */ + /* symbol */ +#endif + +int yynerrs; /* number of parse errors so far */ +#endif /* not YYPURE */ + +#if YYDEBUG != 0 +int yydebug; /* nonzero means print parse trace */ +/* Since this is uninitialized, it does not stop multiple parsers + from coexisting. */ +#endif + +/* YYINITDEPTH indicates the initial size of the parser's stacks */ + +#ifndef YYINITDEPTH +#define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH is the maximum size the stacks can grow to + (effective only if the built-in stack extension method is used). */ + +#if YYMAXDEPTH == 0 +#undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +#define YYMAXDEPTH 10000 +#endif + +/* Define __yy_memcpy. Note that the size argument + should be passed with type unsigned int, because that is what the non-GCC + definitions require. With GCC, __builtin_memcpy takes an arg + of type size_t, but it can handle unsigned int. */ + +#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ +#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) +#else /* not GNU C or C++ */ +#ifndef __cplusplus + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (to, from, count) + char *to; + char *from; + unsigned int count; +{ + register char *f = from; + register char *t = to; + register int i = count; + + while (i-- > 0) + *t++ = *f++; +} + +#else /* __cplusplus */ + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (char *to, char *from, unsigned int count) +{ + register char *t = to; + register char *f = from; + register int i = count; + + while (i-- > 0) + *t++ = *f++; +} + +#endif +#endif + +#line 217 "/usr/share/bison.simple" + +/* The user can define YYPARSE_PARAM as the name of an argument to be passed + into yyparse. The argument should have type void *. + It should actually point to an object. + Grammar actions can access the variable by casting it + to the proper pointer type. */ + +#ifdef YYPARSE_PARAM +#ifdef __cplusplus +#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM +#define YYPARSE_PARAM_DECL +#else /* not __cplusplus */ +#define YYPARSE_PARAM_ARG YYPARSE_PARAM +#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; +#endif /* not __cplusplus */ +#else /* not YYPARSE_PARAM */ +#define YYPARSE_PARAM_ARG +#define YYPARSE_PARAM_DECL +#endif /* not YYPARSE_PARAM */ + +/* Prevent warning if -Wstrict-prototypes. */ +#ifdef __GNUC__ +#ifdef YYPARSE_PARAM +int yyparse (void *); +#else +int yyparse (void); +#endif +#endif + +int +yyparse(YYPARSE_PARAM_ARG) + YYPARSE_PARAM_DECL +{ + register int yystate; + register int yyn; + register short *yyssp; + register YYSTYPE *yyvsp; + int yyerrstatus; /* number of tokens to shift before error messages enabled */ + int yychar1 = 0; /* lookahead token as an internal (translated) token number */ + + short yyssa[YYINITDEPTH]; /* the state stack */ + YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ + + short *yyss = yyssa; /* refer to the stacks thru separate pointers */ + YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ + +#ifdef YYLSP_NEEDED + YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ + YYLTYPE *yyls = yylsa; + YYLTYPE *yylsp; + +#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) +#else +#define YYPOPSTACK (yyvsp--, yyssp--) +#endif + + int yystacksize = YYINITDEPTH; + int yyfree_stacks = 0; + +#ifdef YYPURE + int yychar; + YYSTYPE yylval; + int yynerrs; +#ifdef YYLSP_NEEDED + YYLTYPE yylloc; +#endif +#endif + + YYSTYPE yyval; /* the variable used to return */ + /* semantic values from the action */ + /* routines */ + + int yylen; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Starting parse\n"); +#endif + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss - 1; + yyvsp = yyvs; +#ifdef YYLSP_NEEDED + yylsp = yyls; +#endif + +/* Push a new state, which is found in yystate . */ +/* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. */ +yynewstate: + + *++yyssp = yystate; + + if (yyssp >= yyss + yystacksize - 1) + { + /* Give user a chance to reallocate the stack */ + /* Use copies of these so that the &'s don't force the real ones into memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; +#ifdef YYLSP_NEEDED + YYLTYPE *yyls1 = yyls; +#endif + + /* Get the current used size of the three stacks, in elements. */ + int size = yyssp - yyss + 1; + +#ifdef yyoverflow + /* Each stack pointer address is followed by the size of + the data in use in that stack, in bytes. */ +#ifdef YYLSP_NEEDED + /* This used to be a conditional around just the two extra args, + but that might be undefined if yyoverflow is a macro. */ + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yyls1, size * sizeof (*yylsp), + &yystacksize); +#else + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yystacksize); +#endif + + yyss = yyss1; yyvs = yyvs1; +#ifdef YYLSP_NEEDED + yyls = yyls1; +#endif +#else /* no yyoverflow */ + /* Extend the stack our own way. */ + if (yystacksize >= YYMAXDEPTH) + { + yyerror("parser stack overflow"); + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); +#endif + } + return 2; + } + yystacksize *= 2; + if (yystacksize > YYMAXDEPTH) + yystacksize = YYMAXDEPTH; +#ifndef YYSTACK_USE_ALLOCA + yyfree_stacks = 1; +#endif + yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); + __yy_memcpy ((char *)yyss, (char *)yyss1, + size * (unsigned int) sizeof (*yyssp)); + yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); + __yy_memcpy ((char *)yyvs, (char *)yyvs1, + size * (unsigned int) sizeof (*yyvsp)); +#ifdef YYLSP_NEEDED + yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); + __yy_memcpy ((char *)yyls, (char *)yyls1, + size * (unsigned int) sizeof (*yylsp)); +#endif +#endif /* no yyoverflow */ + + yyssp = yyss + size - 1; + yyvsp = yyvs + size - 1; +#ifdef YYLSP_NEEDED + yylsp = yyls + size - 1; +#endif + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Stack size increased to %d\n", yystacksize); +#endif + + if (yyssp >= yyss + yystacksize - 1) + YYABORT; + } + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Entering state %d\n", yystate); +#endif + + goto yybackup; + yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* yychar is either YYEMPTY or YYEOF + or a valid token in external form. */ + + if (yychar == YYEMPTY) + { +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Reading a token: "); +#endif + yychar = YYLEX; + } + + /* Convert token to internal form (in yychar1) for indexing tables with */ + + if (yychar <= 0) /* This means end of input. */ + { + yychar1 = 0; + yychar = YYEOF; /* Don't call YYLEX any more */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Now at end of input.\n"); +#endif + } + else + { + yychar1 = YYTRANSLATE(yychar); + +#if YYDEBUG != 0 + if (yydebug) + { + fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); + /* Give the individual parser a way to print the precise meaning + of a token, for further debugging info. */ +#ifdef YYPRINT + YYPRINT (stderr, yychar, yylval); +#endif + fprintf (stderr, ")\n"); + } +#endif + } + + yyn += yychar1; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) + goto yydefault; + + yyn = yytable[yyn]; + + /* yyn is what to do for this token type in this state. + Negative => reduce, -yyn is rule number. + Positive => shift, yyn is new state. + New state is final state => don't bother to shift, + just return success. + 0, or most negative number => error. */ + + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrlab; + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); +#endif + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif + + /* count tokens shifted since error; after three, turn off error status. */ + if (yyerrstatus) yyerrstatus--; + + yystate = yyn; + goto yynewstate; + +/* Do the default action for the current state. */ +yydefault: + + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + +/* Do a reduction. yyn is the number of a rule to reduce with. */ +yyreduce: + yylen = yyr2[yyn]; + if (yylen > 0) + yyval = yyvsp[1-yylen]; /* implement default value of the action */ + +#if YYDEBUG != 0 + if (yydebug) + { + int i; + + fprintf (stderr, "Reducing via rule %d (line %d), ", + yyn, yyrline[yyn]); + + /* Print the symbols being reduced, and their result. */ + for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) + fprintf (stderr, "%s ", yytname[yyrhs[i]]); + fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); + } +#endif + + + switch (yyn) { + +case 1: +#line 298 "asn1p_y.y" +{ + *(void **)param = yyvsp[0].a_grammar; + ; + break;} +case 2: +#line 304 "asn1p_y.y" +{ + yyval.a_grammar = asn1p_new(); + checkmem(yyval.a_grammar); + TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); + ; + break;} +case 3: +#line 309 "asn1p_y.y" +{ + yyval.a_grammar = yyvsp[-1].a_grammar; + TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); + ; + break;} +case 4: +#line 330 "asn1p_y.y" +{ + + if(yyvsp[-1].a_module) { + yyval.a_module = yyvsp[-1].a_module; + } else { + /* There's a chance that a module is just plain empty */ + yyval.a_module = asn1p_module_new(); + } + checkmem(yyval.a_module); + + yyval.a_module->Identifier = yyvsp[-7].tv_str; + yyval.a_module->module_oid = yyvsp[-6].a_oid; + yyval.a_module->module_flags = yyvsp[-4].a_module_flags; + ; + break;} +case 5: +#line 351 "asn1p_y.y" +{ yyval.a_oid = 0; ; + break;} +case 6: +#line 352 "asn1p_y.y" +{ yyval.a_oid = yyvsp[0].a_oid; ; + break;} +case 7: +#line 356 "asn1p_y.y" +{ + yyval.a_oid = yyvsp[-1].a_oid; + ; + break;} +case 8: +#line 359 "asn1p_y.y" +{ + yyval.a_oid = 0; + ; + break;} +case 9: +#line 365 "asn1p_y.y" +{ + yyval.a_oid = asn1p_oid_new(); + asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); + if(yyvsp[0].a_oid_arc.name) + free(yyvsp[0].a_oid_arc.name); + ; + break;} +case 10: +#line 371 "asn1p_y.y" +{ + yyval.a_oid = yyvsp[-1].a_oid; + asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); + if(yyvsp[0].a_oid_arc.name) + free(yyvsp[0].a_oid_arc.name); + ; + break;} +case 11: +#line 380 "asn1p_y.y" +{ /* iso */ + yyval.a_oid_arc.name = yyvsp[0].tv_str; + yyval.a_oid_arc.number = -1; + ; + break;} +case 12: +#line 384 "asn1p_y.y" +{ /* iso(1) */ + yyval.a_oid_arc.name = yyvsp[-3].tv_str; + yyval.a_oid_arc.number = yyvsp[-1].a_int; + ; + break;} +case 13: +#line 388 "asn1p_y.y" +{ /* 1 */ + yyval.a_oid_arc.name = 0; + yyval.a_oid_arc.number = yyvsp[0].a_int; + ; + break;} +case 14: +#line 398 "asn1p_y.y" +{ yyval.a_module_flags = MSF_NOFLAGS; ; + break;} +case 15: +#line 399 "asn1p_y.y" +{ + yyval.a_module_flags = yyvsp[0].a_module_flags; + ; + break;} +case 16: +#line 408 "asn1p_y.y" +{ + yyval.a_module_flags = yyvsp[0].a_module_flags; + ; + break;} +case 17: +#line 411 "asn1p_y.y" +{ + yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags; + ; + break;} +case 18: +#line 420 "asn1p_y.y" +{ + yyval.a_module_flags = MSF_EXPLICIT_TAGS; + ; + break;} +case 19: +#line 423 "asn1p_y.y" +{ + yyval.a_module_flags = MSF_IMPLICIT_TAGS; + ; + break;} +case 20: +#line 426 "asn1p_y.y" +{ + yyval.a_module_flags = MSF_AUTOMATIC_TAGS; + ; + break;} +case 21: +#line 429 "asn1p_y.y" +{ + yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED; + ; + break;} +case 22: +#line 438 "asn1p_y.y" +{ yyval.a_module = 0; ; + break;} +case 23: +#line 439 "asn1p_y.y" +{ + assert(yyvsp[0].a_module); + yyval.a_module = yyvsp[0].a_module; + ; + break;} +case 24: +#line 449 "asn1p_y.y" +{ + yyval.a_module = yyvsp[0].a_module; + ; + break;} +case 25: +#line 452 "asn1p_y.y" +{ + yyval.a_module = yyvsp[-1].a_module; + +#ifdef MY_IMPORT +#error MY_IMPORT DEFINED ELSEWHERE! +#endif +#define MY_IMPORT(foo,field) do { \ + if(TQ_FIRST(&(yyvsp[0].a_module->foo))) { \ + TQ_ADD(&(yyval.a_module->foo), \ + TQ_REMOVE(&(yyvsp[0].a_module->foo), field), \ + field); \ + assert(TQ_FIRST(&(yyvsp[0].a_module->foo)) == 0); \ + } } while(0) + + MY_IMPORT(imports, xp_next); + MY_IMPORT(exports, xp_next); + MY_IMPORT(members, next); +#undef MY_IMPORT + + ; + break;} +case 26: +#line 478 "asn1p_y.y" +{ + yyval.a_module = yyvsp[0].a_module; + ; + break;} +case 27: +#line 481 "asn1p_y.y" +{ + yyval.a_module = asn1p_module_new(); + checkmem(yyval.a_module); + if(yyvsp[0].a_xports) { + TQ_ADD(&(yyval.a_module->exports), yyvsp[0].a_xports, xp_next); + } else { + /* "EXPORTS ALL;" ? */ + } + ; + break;} +case 28: +#line 490 "asn1p_y.y" +{ + yyval.a_module = asn1p_module_new(); + checkmem(yyval.a_module); + assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID); + assert(yyvsp[0].a_expr->meta_type != AMT_INVALID); + TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); + ; + break;} +case 29: +#line 497 "asn1p_y.y" +{ + yyval.a_module = asn1p_module_new(); + checkmem(yyval.a_module); + assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID); + assert(yyvsp[0].a_expr->meta_type != AMT_INVALID); + TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); + ; + break;} +case 30: +#line 510 "asn1p_y.y" +{ + yyval.a_module = asn1p_module_new(); + checkmem(yyval.a_module); + assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID); + assert(yyvsp[0].a_expr->meta_type != AMT_INVALID); + TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); + ; + break;} +case 31: +#line 521 "asn1p_y.y" +{ + return yyerror( + "Attempt to redefine a standard basic type, " + "use -ftypesXY to switch back " + "to older version of ASN.1 standard"); + ; + break;} +case 32: +#line 535 "asn1p_y.y" +{ + yyval.a_module = yyvsp[-1].a_module; + ; + break;} +case 33: +#line 541 "asn1p_y.y" +{ + return yyerror("Empty IMPORTS list"); + ; + break;} +case 34: +#line 547 "asn1p_y.y" +{ + yyval.a_module = asn1p_module_new(); + checkmem(yyval.a_module); + TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); + ; + break;} +case 35: +#line 552 "asn1p_y.y" +{ + yyval.a_module = yyvsp[-1].a_module; + TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); + ; + break;} +case 36: +#line 559 "asn1p_y.y" +{ + yyval.a_xports = yyvsp[-3].a_xports; + yyval.a_xports->from = yyvsp[-1].tv_str; + yyval.a_xports->from_oid = yyvsp[0].a_oid; + checkmem(yyval.a_xports); + ; + break;} +case 37: +#line 568 "asn1p_y.y" +{ + yyval.a_xports = asn1p_xports_new(); + checkmem(yyval.a_xports); + TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); + ; + break;} +case 38: +#line 573 "asn1p_y.y" +{ + yyval.a_xports = yyvsp[-2].a_xports; + TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); + ; + break;} +case 39: +#line 580 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); + checkmem(yyval.a_expr); + yyval.a_expr->Identifier = yyvsp[0].tv_str; + yyval.a_expr->expr_type = A1TC_REFERENCE; + ; + break;} +case 40: +#line 586 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); + checkmem(yyval.a_expr); + yyval.a_expr->Identifier = yyvsp[0].tv_str; + yyval.a_expr->expr_type = A1TC_REFERENCE; + ; + break;} +case 41: +#line 595 "asn1p_y.y" +{ + yyval.a_xports = yyvsp[-1].a_xports; + ; + break;} +case 42: +#line 598 "asn1p_y.y" +{ + yyval.a_xports = 0; + ; + break;} +case 43: +#line 601 "asn1p_y.y" +{ + /* Empty EXPORTS clause effectively prohibits export. */ + yyval.a_xports = asn1p_xports_new(); + checkmem(yyval.a_xports); + ; + break;} +case 44: +#line 609 "asn1p_y.y" +{ + yyval.a_xports = asn1p_xports_new(); + assert(yyval.a_xports); + TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); + ; + break;} +case 45: +#line 614 "asn1p_y.y" +{ + yyval.a_xports = yyvsp[-2].a_xports; + TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); + ; + break;} +case 46: +#line 621 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); + checkmem(yyval.a_expr); + yyval.a_expr->Identifier = yyvsp[0].tv_str; + yyval.a_expr->expr_type = A1TC_EXPORTVAR; + ; + break;} +case 47: +#line 627 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); + checkmem(yyval.a_expr); + yyval.a_expr->Identifier = yyvsp[0].tv_str; + yyval.a_expr->expr_type = A1TC_EXPORTVAR; + ; + break;} +case 48: +#line 637 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[-4].a_expr; + assert(yyval.a_expr->Identifier == 0); + yyval.a_expr->Identifier = yyvsp[-5].tv_str; + yyval.a_expr->meta_type = AMT_VALUESET; + // take care of optValueSetBody + ; + break;} +case 49: +#line 647 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); + checkmem(yyval.a_expr); + yyval.a_expr->reference = yyvsp[0].a_ref; + yyval.a_expr->expr_type = A1TC_REFERENCE; + yyval.a_expr->meta_type = AMT_TYPEREF; + ; + break;} +case 50: +#line 654 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); + checkmem(yyval.a_expr); + yyval.a_expr->expr_type = yyvsp[0].a_type; + yyval.a_expr->meta_type = AMT_TYPE; + ; + break;} +case 51: +#line 663 "asn1p_y.y" +{ ; + break;} +case 52: +#line 664 "asn1p_y.y" +{ + ; + break;} +case 53: +#line 680 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); + checkmem(yyval.a_expr); + yyval.a_expr->Identifier = yyvsp[-3].tv_str; + yyval.a_expr->tag = yyvsp[-1].a_tag; + yyval.a_expr->expr_type = A1TC_TYPEID; + yyval.a_expr->meta_type = AMT_TYPE; + ; + break;} +case 54: +#line 688 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[0].a_expr; + yyval.a_expr->Identifier = yyvsp[-3].tv_str; + yyval.a_expr->tag = yyvsp[-1].a_tag; + assert(yyval.a_expr->expr_type); + assert(yyval.a_expr->meta_type); + ; + break;} +case 55: +#line 695 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[0].a_expr; + yyval.a_expr->Identifier = yyvsp[-2].tv_str; + assert(yyval.a_expr->expr_type == A1TC_CLASSDEF); + assert(yyval.a_expr->meta_type == AMT_OBJECT); + ; + break;} +case 56: +#line 712 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[0].a_expr; + assert(yyval.a_expr->Identifier == 0); + yyval.a_expr->Identifier = yyvsp[-5].tv_str; + yyval.a_expr->params = yyvsp[-3].a_plist; + yyval.a_expr->meta_type = AMT_PARAMTYPE; + ; + break;} +case 57: +#line 722 "asn1p_y.y" +{ + int ret; + yyval.a_plist = asn1p_paramlist_new(yylineno); + checkmem(yyval.a_plist); + ret = asn1p_paramlist_add_param(yyval.a_plist, yyvsp[0].a_parg.governor, yyvsp[0].a_parg.argument); + checkmem(ret == 0); + if(yyvsp[0].a_parg.governor) asn1p_ref_free(yyvsp[0].a_parg.governor); + if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument); + ; + break;} +case 58: +#line 731 "asn1p_y.y" +{ + int ret; + yyval.a_plist = yyvsp[-2].a_plist; + ret = asn1p_paramlist_add_param(yyval.a_plist, yyvsp[0].a_parg.governor, yyvsp[0].a_parg.argument); + checkmem(ret == 0); + if(yyvsp[0].a_parg.governor) asn1p_ref_free(yyvsp[0].a_parg.governor); + if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument); + ; + break;} +case 59: +#line 742 "asn1p_y.y" +{ + yyval.a_parg.governor = NULL; + yyval.a_parg.argument = yyvsp[0].tv_str; + ; + break;} +case 60: +#line 746 "asn1p_y.y" +{ + int ret; + yyval.a_parg.governor = asn1p_ref_new(yylineno); + ret = asn1p_ref_add_component(yyval.a_parg.governor, yyvsp[-2].tv_str, 0); + checkmem(ret == 0); + yyval.a_parg.argument = yyvsp[0].tv_str; + ; + break;} +case 61: +#line 753 "asn1p_y.y" +{ + int ret; + yyval.a_parg.governor = asn1p_ref_new(yylineno); + ret = asn1p_ref_add_component(yyval.a_parg.governor, + ASN_EXPR_TYPE2STR(yyvsp[-2].a_type), 1); + checkmem(ret == 0); + yyval.a_parg.argument = yyvsp[0].tv_str; + ; + break;} +case 62: +#line 764 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); + checkmem(yyval.a_expr); + TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); + ; + break;} +case 63: +#line 769 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[-2].a_expr; + TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); + ; + break;} +case 64: +#line 776 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[0].a_expr; + ; + break;} +case 65: +#line 779 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); + checkmem(yyval.a_expr); + yyval.a_expr->Identifier = yyvsp[0].tv_str; + yyval.a_expr->expr_type = A1TC_REFERENCE; + yyval.a_expr->meta_type = AMT_VALUE; + ; + break;} +case 66: +#line 792 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); + checkmem(yyval.a_expr); + TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); + ; + break;} +case 67: +#line 797 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[-2].a_expr; + TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); + ; + break;} +case 68: +#line 804 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[-2].a_expr; + checkmem(yyval.a_expr); + yyval.a_expr->with_syntax = yyvsp[0].a_wsynt; + assert(yyval.a_expr->expr_type == A1TC_CLASSDEF); + assert(yyval.a_expr->meta_type == AMT_OBJECT); + ; + break;} +case 69: +#line 814 "asn1p_y.y" +{ yyval.a_int = 0; ; + break;} +case 70: +#line 815 "asn1p_y.y" +{ yyval.a_int = 1; ; + break;} +case 71: +#line 819 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); + checkmem(yyval.a_expr); + yyval.a_expr->expr_type = A1TC_CLASSDEF; + yyval.a_expr->meta_type = AMT_OBJECT; + TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); + ; + break;} +case 72: +#line 826 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[-2].a_expr; + TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); + ; + break;} +case 73: +#line 833 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); + checkmem(yyval.a_expr); + yyval.a_expr->Identifier = yyvsp[-1].a_refcomp.name; + yyval.a_expr->expr_type = A1TC_CLASSFIELD; + yyval.a_expr->meta_type = AMT_OBJECTFIELD; + yyval.a_expr->marker = yyvsp[0].a_marker; + ; + break;} +case 74: +#line 841 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[-1].a_expr; + yyval.a_expr->Identifier = yyvsp[-2].a_refcomp.name; + yyval.a_expr->unique = yyvsp[0].a_int; + ; + break;} +case 75: +#line 846 "asn1p_y.y" +{ + int ret; + yyval.a_expr = asn1p_expr_new(yylineno); + checkmem(yyval.a_expr); + yyval.a_expr->Identifier = yyvsp[-3].a_refcomp.name; + yyval.a_expr->reference = asn1p_ref_new(yylineno); + checkmem(yyval.a_expr->reference); + ret = asn1p_ref_add_component(yyval.a_expr->reference, + yyvsp[-2].a_refcomp.name, yyvsp[-2].a_refcomp.lex_type); + checkmem(ret == 0); + yyval.a_expr->expr_type = A1TC_CLASSFIELD; + yyval.a_expr->meta_type = AMT_OBJECTFIELD; + yyval.a_expr->marker = yyvsp[-1].a_marker; + yyval.a_expr->unique = yyvsp[0].a_int; + ; + break;} +case 76: +#line 864 "asn1p_y.y" +{ yyval.a_wsynt = 0; ; + break;} +case 77: +#line 865 "asn1p_y.y" +{ + yyval.a_wsynt = yyvsp[0].a_wsynt; + ; + break;} +case 78: +#line 872 "asn1p_y.y" +{ asn1p_lexer_hack_enable_with_syntax(); ; + break;} +case 79: +#line 874 "asn1p_y.y" +{ + yyval.a_wsynt = yyvsp[-1].a_wsynt; + ; + break;} +case 80: +#line 880 "asn1p_y.y" +{ + yyval.a_wsynt = asn1p_wsyntx_new(); + TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); + ; + break;} +case 81: +#line 884 "asn1p_y.y" +{ + yyval.a_wsynt = yyvsp[-1].a_wsynt; + TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); + ; + break;} +case 82: +#line 891 "asn1p_y.y" +{ + yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); + ; + break;} +case 83: +#line 894 "asn1p_y.y" +{ + asn1p_ref_t *ref; + int ret; + ref = asn1p_ref_new(yylineno); + checkmem(ref); + ret = asn1p_ref_add_component(ref, yyvsp[0].a_refcomp.name, yyvsp[0].a_refcomp.lex_type); + checkmem(ret == 0); + yyval.a_wchunk = asn1p_wsyntx_chunk_fromref(ref, 0); + ; + break;} +case 84: +#line 920 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[0].a_expr; + assert(yyval.a_expr->Identifier == 0); + yyval.a_expr->Identifier = yyvsp[-1].tv_nametag.name; + yyval.a_expr->tag = yyvsp[-1].tv_nametag.tag; + ; + break;} +case 85: +#line 926 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[0].a_expr; + ; + break;} +case 86: +#line 932 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[-2].a_expr; + yyval.a_expr->constraints = yyvsp[-1].a_constr; + yyval.a_expr->marker = yyvsp[0].a_marker; + ; + break;} +case 87: +#line 940 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(asn1p_lineno); + checkmem(yyval.a_expr); + yyval.a_expr->Identifier = strdup("..."); + checkmem(yyval.a_expr->Identifier); + yyval.a_expr->expr_type = A1TC_EXTENSIBLE; + yyval.a_expr->meta_type = AMT_TYPE; + ; + break;} +case 88: +#line 948 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(asn1p_lineno); + checkmem(yyval.a_expr); + yyval.a_expr->Identifier = strdup("..."); + checkmem(yyval.a_expr->Identifier); + yyval.a_expr->value = yyvsp[0].a_value; + yyval.a_expr->expr_type = A1TC_EXTENSIBLE; + yyval.a_expr->meta_type = AMT_TYPE; + ; + break;} +case 89: +#line 957 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(asn1p_lineno); + checkmem(yyval.a_expr); + yyval.a_expr->Identifier = strdup("..."); + yyval.a_expr->value = yyvsp[0].a_value; + checkmem(yyval.a_expr->Identifier); + yyval.a_expr->expr_type = A1TC_EXTENSIBLE; + yyval.a_expr->meta_type = AMT_TYPE; + ; + break;} +case 90: +#line 969 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[0].a_expr; + ; + break;} +case 91: +#line 972 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); + checkmem(yyval.a_expr); + yyval.a_expr->expr_type = yyvsp[0].a_type; + yyval.a_expr->meta_type = AMT_TYPE; + ; + break;} +case 92: +#line 978 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[0].a_expr; + checkmem(yyval.a_expr); + assert(yyval.a_expr->meta_type); + ; + break;} +case 93: +#line 986 "asn1p_y.y" +{ + int ret; + yyval.a_expr = yyvsp[-1].a_expr; + assert(yyval.a_expr->expr_type == 0); + assert(yyval.a_expr->meta_type == 0); + assert(yyval.a_expr->reference == 0); + yyval.a_expr->reference = asn1p_ref_new(yylineno); + checkmem(yyval.a_expr->reference); + ret = asn1p_ref_add_component(yyval.a_expr->reference, yyvsp[-3].tv_str, RLT_UNKNOWN); + checkmem(ret == 0); + free(yyvsp[-3].tv_str); + yyval.a_expr->expr_type = A1TC_PARAMETRIZED; + yyval.a_expr->meta_type = AMT_TYPE; + ; + break;} +case 94: +#line 1010 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); + checkmem(yyval.a_expr); + yyval.a_expr->reference = yyvsp[0].a_ref; + yyval.a_expr->expr_type = A1TC_REFERENCE; + yyval.a_expr->meta_type = AMT_TYPEREF; + ; + break;} +case 95: +#line 1017 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); + checkmem(yyval.a_expr); + yyval.a_expr->reference = yyvsp[0].a_ref; + yyval.a_expr->expr_type = A1TC_INSTANCE; + yyval.a_expr->meta_type = AMT_TYPE; + ; + break;} +case 96: +#line 1032 "asn1p_y.y" +{ + int ret; + yyval.a_ref = asn1p_ref_new(yylineno); + checkmem(yyval.a_ref); + ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_UNKNOWN); + checkmem(ret == 0); + free(yyvsp[0].tv_str); + ; + break;} +case 97: +#line 1040 "asn1p_y.y" +{ + int ret; + yyval.a_ref = asn1p_ref_new(yylineno); + checkmem(yyval.a_ref); + ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[-2].tv_str, RLT_UNKNOWN); + checkmem(ret == 0); + ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_UNKNOWN); + checkmem(ret == 0); + free(yyvsp[-2].tv_str); + ; + break;} +case 98: +#line 1050 "asn1p_y.y" +{ + int ret; + yyval.a_ref = asn1p_ref_new(yylineno); + checkmem(yyval.a_ref); + ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[-2].tv_str, RLT_UNKNOWN); + checkmem(ret == 0); + ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_lowercase); + checkmem(ret == 0); + free(yyvsp[-2].tv_str); + ; + break;} +case 99: +#line 1060 "asn1p_y.y" +{ + int ret; + yyval.a_ref = asn1p_ref_new(yylineno); + checkmem(yyval.a_ref); + ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_CAPITALS); + free(yyvsp[0].tv_str); + checkmem(ret == 0); + ; + break;} +case 100: +#line 1068 "asn1p_y.y" +{ + int ret; + yyval.a_ref = yyvsp[0].a_ref; + ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[-2].tv_str, RLT_CAPITALS); + free(yyvsp[-2].tv_str); + checkmem(ret == 0); + /* + * Move the last element infront. + */ + { + struct asn1p_ref_component_s tmp_comp; + tmp_comp = yyval.a_ref->components[yyval.a_ref->comp_count-1]; + memmove(&yyval.a_ref->components[1], + &yyval.a_ref->components[0], + sizeof(yyval.a_ref->components[0]) + * (yyval.a_ref->comp_count - 1)); + yyval.a_ref->components[0] = tmp_comp; + } + ; + break;} +case 101: +#line 1090 "asn1p_y.y" +{ + int ret; + yyval.a_ref = asn1p_ref_new(yylineno); + checkmem(yyval.a_ref); + ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].a_refcomp.name, yyvsp[0].a_refcomp.lex_type); + free(yyvsp[0].a_refcomp.name); + checkmem(ret == 0); + ; + break;} +case 102: +#line 1098 "asn1p_y.y" +{ + int ret; + yyval.a_ref = yyvsp[-2].a_ref; + ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].a_refcomp.name, yyvsp[0].a_refcomp.lex_type); + free(yyvsp[0].a_refcomp.name); + checkmem(ret == 0); + ; + break;} +case 105: +#line 1112 "asn1p_y.y" +{ + yyval.a_refcomp.lex_type = RLT_AmpUppercase; + yyval.a_refcomp.name = yyvsp[0].tv_str; + ; + break;} +case 106: +#line 1117 "asn1p_y.y" +{ + yyval.a_refcomp.lex_type = RLT_Amplowercase; + yyval.a_refcomp.name = yyvsp[0].tv_str; + ; + break;} +case 107: +#line 1130 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[-2].a_expr; + assert(yyval.a_expr->Identifier == NULL); + yyval.a_expr->Identifier = yyvsp[-3].tv_str; + yyval.a_expr->meta_type = AMT_VALUE; + yyval.a_expr->value = yyvsp[0].a_value; + ; + break;} +case 108: +#line 1140 "asn1p_y.y" +{ asn1p_lexer_hack_push_opaque_state(); ; + break;} +case 109: +#line 1141 "asn1p_y.y" +{ + yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); + checkmem(yyval.a_value); + yyval.a_value->type = ATV_UNPARSED; + ; + break;} +case 110: +#line 1146 "asn1p_y.y" +{ + yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); + checkmem(yyval.a_value); + ; + break;} +case 111: +#line 1150 "asn1p_y.y" +{ + yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); + checkmem(yyval.a_value); + ; + break;} +case 112: +#line 1154 "asn1p_y.y" +{ + yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); + checkmem(yyval.a_value); + ; + break;} +case 113: +#line 1158 "asn1p_y.y" +{ + yyval.a_value = yyvsp[0].a_value; + ; + break;} +case 114: +#line 1161 "asn1p_y.y" +{ + yyval.a_value = yyvsp[0].a_value; + ; + break;} +case 115: +#line 1167 "asn1p_y.y" +{ + asn1p_ref_t *ref; + int ret; + ref = asn1p_ref_new(yylineno); + checkmem(ref); + ret = asn1p_ref_add_component(ref, yyvsp[0].tv_str, RLT_lowercase); + checkmem(ret == 0); + yyval.a_value = asn1p_value_fromref(ref, 0); + checkmem(yyval.a_value); + free(yyvsp[0].tv_str); + ; + break;} +case 116: +#line 1178 "asn1p_y.y" +{ + asn1p_ref_t *ref; + int ret; + ref = asn1p_ref_new(yylineno); + checkmem(ref); + ret = asn1p_ref_add_component(ref, yyvsp[-2].tv_str, RLT_UNKNOWN); + checkmem(ret == 0); + ret = asn1p_ref_add_component(ref, yyvsp[0].tv_str, RLT_lowercase); + checkmem(ret == 0); + yyval.a_value = asn1p_value_fromref(ref, 0); + checkmem(yyval.a_value); + free(yyvsp[-2].tv_str); + free(yyvsp[0].tv_str); + ; + break;} +case 117: +#line 1195 "asn1p_y.y" +{ + yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 2; + yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); + checkmem(yyval.tv_opaque.buf); + yyval.tv_opaque.buf[0] = '{'; + yyval.tv_opaque.buf[1] = ' '; + memcpy(yyval.tv_opaque.buf + 2, yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len); + yyval.tv_opaque.buf[yyval.tv_opaque.len] = '\0'; + free(yyvsp[0].tv_opaque.buf); + ; + break;} +case 118: +#line 1205 "asn1p_y.y" +{ + int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; + char *p = malloc(newsize + 1); + checkmem(p); + memcpy(p , yyvsp[-1].tv_opaque.buf, yyvsp[-1].tv_opaque.len); + memcpy(p + yyvsp[-1].tv_opaque.len, yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len); + p[newsize] = '\0'; + free(yyvsp[-1].tv_opaque.buf); + free(yyvsp[0].tv_opaque.buf); + yyval.tv_opaque.buf = p; + yyval.tv_opaque.len = newsize; + ; + break;} +case 119: +#line 1220 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_BOOLEAN; ; + break;} +case 120: +#line 1221 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_NULL; ; + break;} +case 121: +#line 1222 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_REAL; ; + break;} +case 122: +#line 1223 "asn1p_y.y" +{ yyval.a_type = yyvsp[0].a_type; ; + break;} +case 123: +#line 1224 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_OCTET_STRING; ; + break;} +case 124: +#line 1225 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; + break;} +case 125: +#line 1226 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_RELATIVE_OID; ; + break;} +case 126: +#line 1227 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_EXTERNAL; ; + break;} +case 127: +#line 1228 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; + break;} +case 128: +#line 1229 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; + break;} +case 129: +#line 1230 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_UTCTime; ; + break;} +case 130: +#line 1231 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_GeneralizedTime; ; + break;} +case 131: +#line 1238 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_INTEGER; ; + break;} +case 132: +#line 1239 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_ENUMERATED; ; + break;} +case 133: +#line 1240 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_BIT_STRING; ; + break;} +case 134: +#line 1244 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(asn1p_lineno); + checkmem(yyval.a_expr); + yyval.a_expr->expr_type = yyvsp[0].a_type; + yyval.a_expr->meta_type = AMT_TYPE; + ; + break;} +case 135: +#line 1250 "asn1p_y.y" +{ + if(yyvsp[0].a_expr) { + yyval.a_expr = yyvsp[0].a_expr; + } else { + yyval.a_expr = asn1p_expr_new(asn1p_lineno); + checkmem(yyval.a_expr); + } + yyval.a_expr->expr_type = yyvsp[-1].a_type; + yyval.a_expr->meta_type = AMT_TYPE; + ; + break;} +case 136: +#line 1263 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_BMPString; ; + break;} +case 137: +#line 1264 "asn1p_y.y" +{ + yyval.a_type = ASN_STRING_GeneralString; + return yyerror("GeneralString is not supported"); + ; + break;} +case 138: +#line 1268 "asn1p_y.y" +{ + yyval.a_type = ASN_STRING_GraphicString; + return yyerror("GraphicString is not supported"); + ; + break;} +case 139: +#line 1272 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_IA5String; ; + break;} +case 140: +#line 1273 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_ISO646String; ; + break;} +case 141: +#line 1274 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_NumericString; ; + break;} +case 142: +#line 1275 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_PrintableString; ; + break;} +case 143: +#line 1276 "asn1p_y.y" +{ + yyval.a_type = ASN_STRING_T61String; + return yyerror("T61String not implemented yet"); + ; + break;} +case 144: +#line 1280 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_TeletexString; ; + break;} +case 145: +#line 1281 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_UniversalString; ; + break;} +case 146: +#line 1282 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_UTF8String; ; + break;} +case 147: +#line 1283 "asn1p_y.y" +{ + yyval.a_type = ASN_STRING_VideotexString; + return yyerror("VideotexString is no longer supported"); + ; + break;} +case 148: +#line 1287 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_VisibleString; ; + break;} +case 149: +#line 1288 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_ObjectDescriptor; ; + break;} +case 150: +#line 1292 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[-1].a_expr; + assert(yyval.a_expr->expr_type == A1TC_INVALID); + yyval.a_expr->expr_type = ASN_CONSTR_CHOICE; + yyval.a_expr->meta_type = AMT_TYPE; + ; + break;} +case 151: +#line 1298 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[-1].a_expr; + assert(yyval.a_expr->expr_type == A1TC_INVALID); + yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE; + yyval.a_expr->meta_type = AMT_TYPE; + ; + break;} +case 152: +#line 1304 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[-1].a_expr; + assert(yyval.a_expr->expr_type == A1TC_INVALID); + yyval.a_expr->expr_type = ASN_CONSTR_SET; + yyval.a_expr->meta_type = AMT_TYPE; + ; + break;} +case 153: +#line 1310 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(asn1p_lineno); + checkmem(yyval.a_expr); + yyval.a_expr->constraints = yyvsp[-2].a_constr; + yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE_OF; + yyval.a_expr->meta_type = AMT_TYPE; + TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); + ; + break;} +case 154: +#line 1318 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(asn1p_lineno); + checkmem(yyval.a_expr); + yyval.a_expr->constraints = yyvsp[-2].a_constr; + yyval.a_expr->expr_type = ASN_CONSTR_SET_OF; + yyval.a_expr->meta_type = AMT_TYPE; + TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); + ; + break;} +case 155: +#line 1326 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(asn1p_lineno); + checkmem(yyval.a_expr); + yyval.a_expr->expr_type = ASN_CONSTR_ANY; + yyval.a_expr->meta_type = AMT_TYPE; + ; + break;} +case 156: +#line 1332 "asn1p_y.y" +{ + int ret; + yyval.a_expr = asn1p_expr_new(asn1p_lineno); + checkmem(yyval.a_expr); + yyval.a_expr->reference = asn1p_ref_new(yylineno); + ret = asn1p_ref_add_component(yyval.a_expr->reference, + yyvsp[0].tv_str, RLT_lowercase); + checkmem(ret == 0); + yyval.a_expr->expr_type = ASN_CONSTR_ANY; + yyval.a_expr->meta_type = AMT_TYPE; + ; + break;} +case 157: +#line 1349 "asn1p_y.y" +{ yyval.a_constr = 0; ; + break;} +case 158: +#line 1350 "asn1p_y.y" +{ yyval.a_constr = yyvsp[0].a_constr; ; + break;} +case 164: +#line 1358 "asn1p_y.y" +{ + /* + * This is a special case, for compatibility purposes. + * It goes without parenthesis. + */ + int ret; + yyval.a_constr = asn1p_constraint_new(yylineno); + checkmem(yyval.a_constr); + yyval.a_constr->type = ACT_CT_SIZE; + ret = asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr); + checkmem(ret == 0); + ; + break;} +case 165: +#line 1370 "asn1p_y.y" +{ + CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); + ; + break;} +case 166: +#line 1373 "asn1p_y.y" +{ + CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-1].a_constr, yyvsp[0].a_constr); + ; + break;} +case 167: +#line 1379 "asn1p_y.y" +{ + yyval.a_constr = yyvsp[-1].a_constr; + ; + break;} +case 168: +#line 1385 "asn1p_y.y" +{ + yyval.a_constr = yyvsp[0].a_constr; + ; + break;} +case 169: +#line 1388 "asn1p_y.y" +{ + asn1p_constraint_t *ct; + ct = asn1p_constraint_new(yylineno); + checkmem(ct); + ct->type = ACT_EL_EXT; + CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); + ; + break;} +case 170: +#line 1395 "asn1p_y.y" +{ + asn1p_constraint_t *ct; + ct = asn1p_constraint_new(yylineno); + checkmem(ct); + ct->type = ACT_EL_EXT; + CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-4].a_constr, ct); + CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-4].a_constr, yyvsp[0].a_constr); + ; + break;} +case 171: +#line 1403 "asn1p_y.y" +{ + yyval.a_constr = asn1p_constraint_new(yylineno); + checkmem(yyval.a_constr); + yyval.a_constr->type = ACT_EL_EXT; + ; + break;} +case 172: +#line 1408 "asn1p_y.y" +{ + asn1p_constraint_t *ct; + ct = asn1p_constraint_new(yylineno); + checkmem(ct); + ct->type = ACT_EL_EXT; + CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, ct, yyvsp[0].a_constr); + ; + break;} +case 173: +#line 1417 "asn1p_y.y" +{ yyval.a_constr = yyvsp[0].a_constr; ; + break;} +case 174: +#line 1420 "asn1p_y.y" +{ yyval.a_constr = yyvsp[0].a_constr; ; + break;} +case 175: +#line 1421 "asn1p_y.y" +{ + CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); + ; + break;} +case 176: +#line 1427 "asn1p_y.y" +{ yyval.a_constr = yyvsp[0].a_constr; ; + break;} +case 177: +#line 1429 "asn1p_y.y" +{ + CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); + ; + break;} +case 178: +#line 1435 "asn1p_y.y" +{ yyval.a_constr = yyvsp[0].a_constr; ; + break;} +case 179: +#line 1436 "asn1p_y.y" +{ + CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); + ; + break;} +case 180: +#line 1442 "asn1p_y.y" +{ + yyval.a_constr = asn1p_constraint_new(yylineno); + checkmem(yyval.a_constr); + yyval.a_constr->type = ACT_EL_VALUE; + yyval.a_constr->value = yyvsp[0].a_value; + ; + break;} +case 181: +#line 1448 "asn1p_y.y" +{ + yyval.a_constr = asn1p_constraint_new(yylineno); + checkmem(yyval.a_constr); + yyval.a_constr->type = yyvsp[-1].a_ctype; + yyval.a_constr->range_start = yyvsp[-2].a_value; + yyval.a_constr->range_stop = yyvsp[0].a_value; + ; + break;} +case 182: +#line 1455 "asn1p_y.y" +{ + int ret; + yyval.a_constr = asn1p_constraint_new(yylineno); + checkmem(yyval.a_constr); + yyval.a_constr->type = yyvsp[-3].a_ctype; + ret = asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr); + checkmem(ret == 0); + ; + break;} +case 183: +#line 1463 "asn1p_y.y" +{ + yyval.a_constr = yyvsp[0].a_constr; + ; + break;} +case 184: +#line 1466 "asn1p_y.y" +{ + yyval.a_constr = yyvsp[0].a_constr; + ; + break;} +case 185: +#line 1472 "asn1p_y.y" +{ yyval.a_ctype = ACT_EL_RANGE; ; + break;} +case 186: +#line 1473 "asn1p_y.y" +{ yyval.a_ctype = ACT_EL_RLRANGE; ; + break;} +case 187: +#line 1474 "asn1p_y.y" +{ yyval.a_ctype = ACT_EL_LLRANGE; ; + break;} +case 188: +#line 1475 "asn1p_y.y" +{ yyval.a_ctype = ACT_EL_ULRANGE; ; + break;} +case 189: +#line 1479 "asn1p_y.y" +{ + yyval.a_ctype = ACT_CT_SIZE; + ; + break;} +case 190: +#line 1482 "asn1p_y.y" +{ + yyval.a_ctype = ACT_CT_FROM; + ; + break;} +case 191: +#line 1488 "asn1p_y.y" +{ + yyval.a_value = yyvsp[0].a_value; + ; + break;} +case 192: +#line 1491 "asn1p_y.y" +{ + asn1p_ref_t *ref; + int ret; + ref = asn1p_ref_new(yylineno); + checkmem(ref); + ret = asn1p_ref_add_component(ref, yyvsp[0].tv_str, RLT_lowercase); + checkmem(ret == 0); + yyval.a_value = asn1p_value_fromref(ref, 0); + checkmem(yyval.a_value); + free(yyvsp[0].tv_str); + ; + break;} +case 193: +#line 1502 "asn1p_y.y" +{ + yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); + checkmem(yyval.a_value); + ; + break;} +case 194: +#line 1506 "asn1p_y.y" +{ + yyval.a_value = asn1p_value_fromint(123); + checkmem(yyval.a_value); + yyval.a_value->type = ATV_MIN; + ; + break;} +case 195: +#line 1511 "asn1p_y.y" +{ + yyval.a_value = asn1p_value_fromint(321); + checkmem(yyval.a_value); + yyval.a_value->type = ATV_MAX; + ; + break;} +case 196: +#line 1516 "asn1p_y.y" +{ + yyval.a_value = asn1p_value_fromint(0); + checkmem(yyval.a_value); + yyval.a_value->type = ATV_FALSE; + ; + break;} +case 197: +#line 1521 "asn1p_y.y" +{ + yyval.a_value = asn1p_value_fromint(1); + checkmem(yyval.a_value); + yyval.a_value->type = ATV_TRUE; + ; + break;} +case 198: +#line 1529 "asn1p_y.y" +{ + CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); + ; + break;} +case 199: +#line 1535 "asn1p_y.y" +{ + yyval.a_constr = yyvsp[0].a_constr; + ; + break;} +case 200: +#line 1538 "asn1p_y.y" +{ + CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); + ; + break;} +case 201: +#line 1544 "asn1p_y.y" +{ + yyval.a_constr = asn1p_constraint_new(yylineno); + checkmem(yyval.a_constr); + yyval.a_constr->type = ACT_EL_EXT; + ; + break;} +case 202: +#line 1549 "asn1p_y.y" +{ + yyval.a_constr = asn1p_constraint_new(yylineno); + checkmem(yyval.a_constr); + yyval.a_constr->type = ACT_EL_VALUE; + yyval.a_constr->value = asn1p_value_frombuf(yyvsp[-2].tv_str, strlen(yyvsp[-2].tv_str), 0); + yyval.a_constr->presence = yyvsp[0].a_pres; + ; + break;} +case 203: +#line 1562 "asn1p_y.y" +{ yyval.a_pres = ACPRES_DEFAULT; ; + break;} +case 204: +#line 1563 "asn1p_y.y" +{ yyval.a_pres = yyvsp[0].a_pres; ; + break;} +case 205: +#line 1567 "asn1p_y.y" +{ + yyval.a_pres = ACPRES_PRESENT; + ; + break;} +case 206: +#line 1570 "asn1p_y.y" +{ + yyval.a_pres = ACPRES_ABSENT; + ; + break;} +case 207: +#line 1573 "asn1p_y.y" +{ + yyval.a_pres = ACPRES_OPTIONAL; + ; + break;} +case 208: +#line 1579 "asn1p_y.y" +{ + yyval.a_constr = yyvsp[0].a_constr; + ; + break;} +case 209: +#line 1582 "asn1p_y.y" +{ + yyval.a_constr = yyvsp[0].a_constr; + ; + break;} +case 210: +#line 1591 "asn1p_y.y" +{ + asn1p_ref_t *ref = asn1p_ref_new(yylineno); + asn1p_constraint_t *ct; + int ret; + ret = asn1p_ref_add_component(ref, yyvsp[-1].tv_str, 0); + checkmem(ret == 0); + ct = asn1p_constraint_new(yylineno); + checkmem(yyval.a_constr); + ct->type = ACT_EL_VALUE; + ct->value = asn1p_value_fromref(ref, 0); + CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, ct, 0); + ; + break;} +case 211: +#line 1606 "asn1p_y.y" +{ + CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); + ; + break;} +case 212: +#line 1612 "asn1p_y.y" +{ + yyval.a_constr = asn1p_constraint_new(yylineno); + checkmem(yyval.a_constr); + yyval.a_constr->type = ACT_EL_VALUE; + yyval.a_constr->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); + ; + break;} +case 213: +#line 1618 "asn1p_y.y" +{ + asn1p_constraint_t *ct; + ct = asn1p_constraint_new(yylineno); + checkmem(ct); + ct->type = ACT_EL_VALUE; + ct->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); + CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); + ; + break;} +case 214: +#line 1632 "asn1p_y.y" +{ + char *p = malloc(strlen(yyvsp[0].tv_str) + 2); + int ret; + *p = '@'; + strcpy(p + 1, yyvsp[0].tv_str); + yyval.a_ref = asn1p_ref_new(yylineno); + ret = asn1p_ref_add_component(yyval.a_ref, p, 0); + checkmem(ret == 0); + free(p); + free(yyvsp[0].tv_str); + ; + break;} +case 215: +#line 1643 "asn1p_y.y" +{ + char *p = malloc(strlen(yyvsp[0].tv_str) + 3); + int ret; + p[0] = '@'; + p[1] = '.'; + strcpy(p + 2, yyvsp[0].tv_str); + yyval.a_ref = asn1p_ref_new(yylineno); + ret = asn1p_ref_add_component(yyval.a_ref, p, 0); + checkmem(ret == 0); + free(p); + free(yyvsp[0].tv_str); + ; + break;} +case 216: +#line 1659 "asn1p_y.y" +{ + yyval.tv_str = yyvsp[0].tv_str; + ; + break;} +case 217: +#line 1662 "asn1p_y.y" +{ + int l1 = strlen(yyvsp[-2].tv_str); + int l3 = strlen(yyvsp[0].tv_str); + yyval.tv_str = malloc(l1 + 1 + l3 + 1); + memcpy(yyval.tv_str, yyvsp[-2].tv_str, l1); + yyval.tv_str[l1] = '.'; + memcpy(yyval.tv_str + l1 + 1, yyvsp[0].tv_str, l3); + yyval.tv_str[l1 + 1 + l3] = '\0'; + ; + break;} +case 218: +#line 1680 "asn1p_y.y" +{ yyval.a_marker = EM_NOMARK; ; + break;} +case 219: +#line 1681 "asn1p_y.y" +{ yyval.a_marker = yyvsp[0].a_marker; ; + break;} +case 220: +#line 1685 "asn1p_y.y" +{ + yyval.a_marker = EM_OPTIONAL; + ; + break;} +case 221: +#line 1688 "asn1p_y.y" +{ + yyval.a_marker = EM_DEFAULT; + /* FIXME: store DefaultValue somewhere */ + ; + break;} +case 222: +#line 1695 "asn1p_y.y" +{ + ; + break;} +case 223: +#line 1697 "asn1p_y.y" +{ + ; + break;} +case 224: +#line 1699 "asn1p_y.y" +{ asn1p_lexer_hack_push_opaque_state(); ; + break;} +case 225: +#line 1699 "asn1p_y.y" +{ + ; + break;} +case 226: +#line 1720 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(asn1p_lineno); + checkmem(yyval.a_expr); + ; + break;} +case 227: +#line 1724 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[-1].a_expr; + ; + break;} +case 228: +#line 1730 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(asn1p_lineno); + checkmem(yyval.a_expr); + TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); + ; + break;} +case 229: +#line 1735 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[-2].a_expr; + TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); + ; + break;} +case 230: +#line 1742 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(asn1p_lineno); + checkmem(yyval.a_expr); + yyval.a_expr->expr_type = A1TC_UNIVERVAL; + yyval.a_expr->meta_type = AMT_VALUE; + yyval.a_expr->Identifier = yyvsp[0].tv_str; + ; + break;} +case 231: +#line 1749 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(asn1p_lineno); + checkmem(yyval.a_expr); + yyval.a_expr->expr_type = A1TC_UNIVERVAL; + yyval.a_expr->meta_type = AMT_VALUE; + yyval.a_expr->Identifier = yyvsp[-3].tv_str; + yyval.a_expr->value = yyvsp[-1].a_value; + ; + break;} +case 232: +#line 1757 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(asn1p_lineno); + checkmem(yyval.a_expr); + yyval.a_expr->expr_type = A1TC_UNIVERVAL; + yyval.a_expr->meta_type = AMT_VALUE; + yyval.a_expr->Identifier = yyvsp[-3].tv_str; + yyval.a_expr->value = yyvsp[-1].a_value; + ; + break;} +case 233: +#line 1765 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(asn1p_lineno); + checkmem(yyval.a_expr); + yyval.a_expr->expr_type = A1TC_UNIVERVAL; + yyval.a_expr->meta_type = AMT_VALUE; + yyval.a_expr->value = yyvsp[0].a_value; + ; + break;} +case 234: +#line 1772 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(asn1p_lineno); + checkmem(yyval.a_expr); + yyval.a_expr->Identifier = strdup("..."); + checkmem(yyval.a_expr->Identifier); + yyval.a_expr->expr_type = A1TC_EXTENSIBLE; + yyval.a_expr->meta_type = AMT_VALUE; + ; + break;} +case 235: +#line 1783 "asn1p_y.y" +{ + yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); + checkmem(yyval.a_value); + ; + break;} +case 236: +#line 1787 "asn1p_y.y" +{ + yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); + checkmem(yyval.a_value); + ; + break;} +case 237: +#line 1818 "asn1p_y.y" +{ memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; + break;} +case 238: +#line 1819 "asn1p_y.y" +{ yyval.a_tag = yyvsp[0].a_tag; ; + break;} +case 239: +#line 1823 "asn1p_y.y" +{ + yyval.a_tag = yyvsp[0].a_tag; + yyval.a_tag.tag_mode = TM_DEFAULT; + ; + break;} +case 240: +#line 1827 "asn1p_y.y" +{ + yyval.a_tag = yyvsp[-1].a_tag; + yyval.a_tag.tag_mode = TM_IMPLICIT; + ; + break;} +case 241: +#line 1831 "asn1p_y.y" +{ + yyval.a_tag = yyvsp[-1].a_tag; + yyval.a_tag.tag_mode = TM_EXPLICIT; + ; + break;} +case 242: +#line 1838 "asn1p_y.y" +{ + checkmem(yyvsp[0].tv_str); + yyval.tv_str = yyvsp[0].tv_str; + ; + break;} +case 243: +#line 1842 "asn1p_y.y" +{ + checkmem(yyvsp[0].tv_str); + yyval.tv_str = yyvsp[0].tv_str; + ; + break;} +case 244: +#line 1849 "asn1p_y.y" +{ + checkmem(yyvsp[0].tv_str); + yyval.tv_str = yyvsp[0].tv_str; + ; + break;} +case 245: +#line 1856 "asn1p_y.y" +{ + checkmem(yyvsp[0].tv_str); + yyval.tv_str = yyvsp[0].tv_str; + ; + break;} +case 246: +#line 1863 "asn1p_y.y" +{ + memset(&yyval.tv_nametag, 0, sizeof(yyval.tv_nametag)); + yyval.tv_nametag.name = yyvsp[0].tv_str; + ; + break;} +case 247: +#line 1867 "asn1p_y.y" +{ + yyval.tv_nametag.name = yyvsp[-1].tv_str; + yyval.tv_nametag.tag = yyvsp[0].a_tag; + ; + break;} +} + /* the action file gets copied in in place of this dollarsign */ +#line 543 "/usr/share/bison.simple" + + yyvsp -= yylen; + yyssp -= yylen; +#ifdef YYLSP_NEEDED + yylsp -= yylen; +#endif + +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif + + *++yyvsp = yyval; + +#ifdef YYLSP_NEEDED + yylsp++; + if (yylen == 0) + { + yylsp->first_line = yylloc.first_line; + yylsp->first_column = yylloc.first_column; + yylsp->last_line = (yylsp-1)->last_line; + yylsp->last_column = (yylsp-1)->last_column; + yylsp->text = 0; + } + else + { + yylsp->last_line = (yylsp+yylen-1)->last_line; + yylsp->last_column = (yylsp+yylen-1)->last_column; + } +#endif + + /* Now "shift" the result of the reduction. + Determine what state that goes to, + based on the state we popped back to + and the rule number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTBASE] + *yyssp; + if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTBASE]; + + goto yynewstate; + +yyerrlab: /* here on detecting error */ + + if (! yyerrstatus) + /* If not already recovering from an error, report this error. */ + { + ++yynerrs; + +#ifdef YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (yyn > YYFLAG && yyn < YYLAST) + { + int size = 0; + char *msg; + int x, count; + + count = 0; + /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + size += strlen(yytname[x]) + 15, count++; + msg = (char *) malloc(size + 15); + if (msg != 0) + { + strcpy(msg, "parse error"); + + if (count < 5) + { + count = 0; + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + { + strcat(msg, count == 0 ? ", expecting `" : " or `"); + strcat(msg, yytname[x]); + strcat(msg, "'"); + count++; + } + } + yyerror(msg); + free(msg); + } + else + yyerror ("parse error; also virtual memory exceeded"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror("parse error"); + } + + goto yyerrlab1; +yyerrlab1: /* here on error raised explicitly by an action */ + + if (yyerrstatus == 3) + { + /* if just tried and failed to reuse lookahead token after an error, discard it. */ + + /* return failure if at end of input */ + if (yychar == YYEOF) + YYABORT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); +#endif + + yychar = YYEMPTY; + } + + /* Else will try to reuse lookahead token + after shifting the error token. */ + + yyerrstatus = 3; /* Each real token shifted decrements this */ + + goto yyerrhandle; + +yyerrdefault: /* current state does not do anything special for the error token. */ + +#if 0 + /* This is wrong; only states that explicitly want error tokens + should shift them. */ + yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ + if (yyn) goto yydefault; +#endif + +yyerrpop: /* pop the current state because it cannot handle the error token */ + + if (yyssp == yyss) YYABORT; + yyvsp--; + yystate = *--yyssp; +#ifdef YYLSP_NEEDED + yylsp--; +#endif + +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "Error: state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif + +yyerrhandle: + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yyerrdefault; + + yyn += YYTERROR; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) + goto yyerrdefault; + + yyn = yytable[yyn]; + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrpop; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrpop; + + if (yyn == YYFINAL) + YYACCEPT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting error token, "); +#endif + + *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif + + yystate = yyn; + goto yynewstate; + + yyacceptlab: + /* YYACCEPT comes here. */ + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); +#endif + } + return 0; + + yyabortlab: + /* YYABORT comes here. */ + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); +#endif + } + return 1; +} +#line 1874 "asn1p_y.y" + + + +/* + * Convert Xstring ('0101'B or '5'H) to the binary vector. + */ +static asn1p_value_t * +_convert_bitstring2binary(char *str, int base) { + asn1p_value_t *val; + int slen; + int memlen; + int baselen; + int bits; + uint8_t *binary_vector; + uint8_t *bv_ptr; + uint8_t cur_val; + + assert(str); + assert(str[0] == '\''); + + switch(base) { + case 'B': + baselen = 1; + break; + case 'H': + baselen = 4; + break; + default: + assert(base == 'B' || base == 'H'); + errno = EINVAL; + return NULL; + } + + slen = strlen(str); + assert(str[slen - 1] == base); + assert(str[slen - 2] == '\''); + + memlen = slen / (8 / baselen); /* Conservative estimate */ + + bv_ptr = binary_vector = malloc(memlen + 1); + if(bv_ptr == NULL) + /* ENOMEM */ + return NULL; + + cur_val = 0; + bits = 0; + while(*(++str) != '\'') { + switch(baselen) { + case 1: + switch(*str) { + case '1': + cur_val |= 1 << (7 - (bits % 8)); + case '0': + break; + default: + assert(!"_y UNREACH1"); + case ' ': case '\r': case '\n': + continue; + } + break; + case 4: + switch(*str) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + cur_val |= (*str - '0') << (4 - (bits % 8)); + break; + case 'A': case 'B': case 'C': + case 'D': case 'E': case 'F': + cur_val |= ((*str - 'A') + 10) + << (4 - (bits % 8)); + break; + default: + assert(!"_y UNREACH2"); + case ' ': case '\r': case '\n': + continue; + } + break; + } + + bits += baselen; + if((bits % 8) == 0) { + *bv_ptr++ = cur_val; + cur_val = 0; + } + } + + *bv_ptr = cur_val; + assert((bv_ptr - binary_vector) <= memlen); + + val = asn1p_value_frombits(binary_vector, bits, 0); + if(val == NULL) { + free(binary_vector); + } + + return val; +} + +extern char *asn1p_text; + +int +yyerror(const char *msg) { + fprintf(stderr, + "ASN.1 grammar parse error " + "near line %d (token \"%s\"): %s\n", + asn1p_lineno, asn1p_text, msg); + return -1; +} + + diff --git a/libasn1parser/asn1p_y.h b/libasn1parser/asn1p_y.h new file mode 100644 index 000000000..61679e3da --- /dev/null +++ b/libasn1parser/asn1p_y.h @@ -0,0 +1,132 @@ +typedef union { + asn1p_t *a_grammar; + asn1p_module_flags_e a_module_flags; + asn1p_module_t *a_module; + asn1p_expr_type_e a_type; /* ASN.1 Type */ + asn1p_expr_t *a_expr; /* Constructed collection */ + asn1p_constraint_t *a_constr; /* Constraint */ + enum asn1p_constraint_type_e a_ctype;/* Constraint type */ + asn1p_xports_t *a_xports; /* IMports/EXports */ + asn1p_oid_t *a_oid; /* Object Identifier */ + asn1p_oid_arc_t a_oid_arc; /* Single OID's arc */ + struct asn1p_type_tag_s a_tag; /* A tag */ + asn1p_ref_t *a_ref; /* Reference to custom type */ + asn1p_wsyntx_t *a_wsynt; /* WITH SYNTAX contents */ + asn1p_wsyntx_chunk_t *a_wchunk; /* WITH SYNTAX chunk */ + struct asn1p_ref_component_s a_refcomp; /* Component of a reference */ + asn1p_value_t *a_value; /* Number, DefinedValue, etc */ + struct asn1p_param_s a_parg; /* A parameter argument */ + asn1p_paramlist_t *a_plist; /* A pargs list */ + enum asn1p_expr_marker_e a_marker; /* OPTIONAL/DEFAULT */ + enum asn1p_constr_pres_e a_pres; /* PRESENT/ABSENT/OPTIONAL */ + asn1_integer_t a_int; + char *tv_str; + struct { + char *buf; + int len; + } tv_opaque; + struct { + char *name; + struct asn1p_type_tag_s tag; + } tv_nametag; +} YYSTYPE; +#define TOK_PPEQ 257 +#define TOK_opaque 258 +#define TOK_bstring 259 +#define TOK_cstring 260 +#define TOK_hstring 261 +#define TOK_identifier 262 +#define TOK_number 263 +#define TOK_number_negative 264 +#define TOK_typereference 265 +#define TOK_objectclassreference 266 +#define TOK_typefieldreference 267 +#define TOK_valuefieldreference 268 +#define TOK_ABSENT 269 +#define TOK_ABSTRACT_SYNTAX 270 +#define TOK_ALL 271 +#define TOK_ANY 272 +#define TOK_APPLICATION 273 +#define TOK_AUTOMATIC 274 +#define TOK_BEGIN 275 +#define TOK_BIT 276 +#define TOK_BMPString 277 +#define TOK_BOOLEAN 278 +#define TOK_BY 279 +#define TOK_CHARACTER 280 +#define TOK_CHOICE 281 +#define TOK_CLASS 282 +#define TOK_COMPONENT 283 +#define TOK_COMPONENTS 284 +#define TOK_CONSTRAINED 285 +#define TOK_CONTAINING 286 +#define TOK_DEFAULT 287 +#define TOK_DEFINITIONS 288 +#define TOK_DEFINED 289 +#define TOK_EMBEDDED 290 +#define TOK_ENCODED 291 +#define TOK_END 292 +#define TOK_ENUMERATED 293 +#define TOK_EXPLICIT 294 +#define TOK_EXPORTS 295 +#define TOK_EXTENSIBILITY 296 +#define TOK_EXTERNAL 297 +#define TOK_FALSE 298 +#define TOK_FROM 299 +#define TOK_GeneralizedTime 300 +#define TOK_GeneralString 301 +#define TOK_GraphicString 302 +#define TOK_IA5String 303 +#define TOK_IDENTIFIER 304 +#define TOK_IMPLICIT 305 +#define TOK_IMPLIED 306 +#define TOK_IMPORTS 307 +#define TOK_INCLUDES 308 +#define TOK_INSTANCE 309 +#define TOK_INTEGER 310 +#define TOK_ISO646String 311 +#define TOK_MAX 312 +#define TOK_MIN 313 +#define TOK_MINUS_INFINITY 314 +#define TOK_NULL 315 +#define TOK_NumericString 316 +#define TOK_OBJECT 317 +#define TOK_ObjectDescriptor 318 +#define TOK_OCTET 319 +#define TOK_OF 320 +#define TOK_OPTIONAL 321 +#define TOK_PATTERN 322 +#define TOK_PDV 323 +#define TOK_PLUS_INFINITY 324 +#define TOK_PRESENT 325 +#define TOK_PrintableString 326 +#define TOK_PRIVATE 327 +#define TOK_REAL 328 +#define TOK_RELATIVE_OID 329 +#define TOK_SEQUENCE 330 +#define TOK_SET 331 +#define TOK_SIZE 332 +#define TOK_STRING 333 +#define TOK_SYNTAX 334 +#define TOK_T61String 335 +#define TOK_TAGS 336 +#define TOK_TeletexString 337 +#define TOK_TRUE 338 +#define TOK_TYPE_IDENTIFIER 339 +#define TOK_UNIQUE 340 +#define TOK_UNIVERSAL 341 +#define TOK_UniversalString 342 +#define TOK_UTCTime 343 +#define TOK_UTF8String 344 +#define TOK_VideotexString 345 +#define TOK_VisibleString 346 +#define TOK_WITH 347 +#define TOK_UNION 348 +#define TOK_INTERSECTION 349 +#define TOK_EXCEPT 350 +#define TOK_TwoDots 351 +#define TOK_ThreeDots 352 +#define TOK_tag 353 + + +extern YYSTYPE asn1p_lval; diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y new file mode 100644 index 000000000..822a8efb0 --- /dev/null +++ b/libasn1parser/asn1p_y.y @@ -0,0 +1,1982 @@ +%{ + +#include +#include +#include +#include +#include + +#include "asn1parser.h" + +#define YYPARSE_PARAM param +#define YYERROR_VERBOSE + +int yylex(void); +int yyerror(const char *msg); +void asn1p_lexer_hack_push_opaque_state(void); +void asn1p_lexer_hack_enable_with_syntax(void); +#define yylineno asn1p_lineno +extern int asn1p_lineno; + + +static asn1p_value_t * + _convert_bitstring2binary(char *str, int base); + +#define checkmem(ptr) do { \ + if(!(ptr)) \ + return yyerror("Memory failure"); \ + } while(0) + +#define CONSTRAINT_INSERT(root, constr_type, arg1, arg2) do { \ + if(arg1->type != constr_type) { \ + int __ret; \ + root = asn1p_constraint_new(yylineno); \ + checkmem(root); \ + root->type = constr_type; \ + __ret = asn1p_constraint_insert(root, \ + arg1); \ + checkmem(__ret == 0); \ + } else { \ + root = arg1; \ + } \ + if(arg2) { \ + int __ret \ + = asn1p_constraint_insert(root, arg2); \ + checkmem(__ret == 0); \ + } \ + } while(0) + +%} + + +/* + * Token value definition. + * a_*: ASN-specific types. + * tv_*: Locally meaningful types. + */ +%union { + asn1p_t *a_grammar; + asn1p_module_flags_e a_module_flags; + asn1p_module_t *a_module; + asn1p_expr_type_e a_type; /* ASN.1 Type */ + asn1p_expr_t *a_expr; /* Constructed collection */ + asn1p_constraint_t *a_constr; /* Constraint */ + enum asn1p_constraint_type_e a_ctype;/* Constraint type */ + asn1p_xports_t *a_xports; /* IMports/EXports */ + asn1p_oid_t *a_oid; /* Object Identifier */ + asn1p_oid_arc_t a_oid_arc; /* Single OID's arc */ + struct asn1p_type_tag_s a_tag; /* A tag */ + asn1p_ref_t *a_ref; /* Reference to custom type */ + asn1p_wsyntx_t *a_wsynt; /* WITH SYNTAX contents */ + asn1p_wsyntx_chunk_t *a_wchunk; /* WITH SYNTAX chunk */ + struct asn1p_ref_component_s a_refcomp; /* Component of a reference */ + asn1p_value_t *a_value; /* Number, DefinedValue, etc */ + struct asn1p_param_s a_parg; /* A parameter argument */ + asn1p_paramlist_t *a_plist; /* A pargs list */ + enum asn1p_expr_marker_e a_marker; /* OPTIONAL/DEFAULT */ + enum asn1p_constr_pres_e a_pres; /* PRESENT/ABSENT/OPTIONAL */ + asn1_integer_t a_int; + char *tv_str; + struct { + char *buf; + int len; + } tv_opaque; + struct { + char *name; + struct asn1p_type_tag_s tag; + } tv_nametag; +}; + +/* + * Token types returned by scanner. + */ +%token TOK_PPEQ /* "::=", Pseudo Pascal EQuality */ +%token TOK_opaque /* opaque data (driven from .y) */ +%token TOK_bstring +%token TOK_cstring +%token TOK_hstring +%token TOK_identifier +%token TOK_number +%token TOK_number_negative +%token TOK_typereference +%token TOK_objectclassreference /* "CLASS1" */ +%token TOK_typefieldreference /* "&Pork" */ +%token TOK_valuefieldreference /* "&id" */ + +/* + * Token types representing ASN.1 standard keywords. + */ +%token TOK_ABSENT +%token TOK_ABSTRACT_SYNTAX +%token TOK_ALL +%token TOK_ANY +%token TOK_APPLICATION +%token TOK_AUTOMATIC +%token TOK_BEGIN +%token TOK_BIT +%token TOK_BMPString +%token TOK_BOOLEAN +%token TOK_BY +%token TOK_CHARACTER +%token TOK_CHOICE +%token TOK_CLASS +%token TOK_COMPONENT +%token TOK_COMPONENTS +%token TOK_CONSTRAINED +%token TOK_CONTAINING +%token TOK_DEFAULT +%token TOK_DEFINITIONS +%token TOK_DEFINED +%token TOK_EMBEDDED +%token TOK_ENCODED +%token TOK_END +%token TOK_ENUMERATED +%token TOK_EXPLICIT +%token TOK_EXPORTS +%token TOK_EXTENSIBILITY +%token TOK_EXTERNAL +%token TOK_FALSE +%token TOK_FROM +%token TOK_GeneralizedTime +%token TOK_GeneralString +%token TOK_GraphicString +%token TOK_IA5String +%token TOK_IDENTIFIER +%token TOK_IMPLICIT +%token TOK_IMPLIED +%token TOK_IMPORTS +%token TOK_INCLUDES +%token TOK_INSTANCE +%token TOK_INTEGER +%token TOK_ISO646String +%token TOK_MAX +%token TOK_MIN +%token TOK_MINUS_INFINITY +%token TOK_NULL +%token TOK_NumericString +%token TOK_OBJECT +%token TOK_ObjectDescriptor +%token TOK_OCTET +%token TOK_OF +%token TOK_OPTIONAL +%token TOK_PATTERN +%token TOK_PDV +%token TOK_PLUS_INFINITY +%token TOK_PRESENT +%token TOK_PrintableString +%token TOK_PRIVATE +%token TOK_REAL +%token TOK_RELATIVE_OID +%token TOK_SEQUENCE +%token TOK_SET +%token TOK_SIZE +%token TOK_STRING +%token TOK_SYNTAX +%token TOK_T61String +%token TOK_TAGS +%token TOK_TeletexString +%token TOK_TRUE +%token TOK_TYPE_IDENTIFIER +%token TOK_UNIQUE +%token TOK_UNIVERSAL +%token TOK_UniversalString +%token TOK_UTCTime +%token TOK_UTF8String +%token TOK_VideotexString +%token TOK_VisibleString +%token TOK_WITH + +%left '|' TOK_UNION +%left '^' TOK_INTERSECTION +%left TOK_EXCEPT + +/* Misc tags */ +%token TOK_TwoDots /* .. */ +%token TOK_ThreeDots /* ... */ +%token TOK_tag /* [0] */ + + +/* + * Types defined herein. + */ +%type ModuleList +%type ModuleSpecification +%type ModuleSpecificationBody +%type ModuleSpecificationElement +%type optModuleSpecificationBody /* Optional */ +%type optModuleSpecificationFlags +%type ModuleSpecificationFlags /* Set of FL */ +%type ModuleSpecificationFlag /* Single FL */ +%type ImportsDefinition +%type ImportsBundleSet +%type ImportsBundle +%type ImportsList +%type ExportsDefinition +%type ExportsBody +%type ImportsElement +%type ExportsElement +%type DataTypeMember +%type ExtensionAndException +%type TypeDeclaration +%type ComplexTypeReference +%type ComplexTypeReferenceAmpList +%type ComplexTypeReferenceElement +%type ClassFieldIdentifier +%type ClassFieldName +%type ClassFieldList +%type ClassField +%type ClassDeclaration +%type ConstrainedTypeDeclaration +%type DataTypeReference /* Type1 ::= Type2 */ +%type DefinedTypeRef +%type ValueSetDefinition /* Val INTEGER ::= {1|2} */ +%type ValueDefinition /* val INTEGER ::= 1*/ +%type optValueSetBody +%type InlineOrDefinedValue +%type DefinedValue +%type SignedNumber +%type ConstructedType +%type ConstructedDataTypeDefinition +//%type optUniverationDefinition +%type UniverationDefinition +%type UniverationList +%type UniverationElement +%type TypeRefName +%type ObjectClassReference +%type TaggedIdentifier +%type Identifier +%type ParameterArgumentName +%type ParameterArgumentList +%type ActualParameter +%type ActualParameterList +%type ObjectIdentifier /* OID */ +%type optObjectIdentifier /* Optional OID */ +%type ObjectIdentifierBody +%type ObjectIdentifierElement +%type BasicType +%type BasicTypeId +%type BasicTypeId_UniverationCompatible +%type BasicString +%type Opaque +//%type StringValue +%type Tag /* [UNIVERSAL 0] IMPLICIT */ +%type optTag /* [UNIVERSAL 0] IMPLICIT */ +%type optConstraints +%type Constraints +%type SingleConstraint /* (SIZE(2)) */ +%type ConstraintElementSet /* 1..2,...,3 */ +%type ConstraintSubtypeElement /* 1..2 */ +%type ConstraintElementIntersection +%type ConstraintElementException +%type ConstraintElementUnion +%type ConstraintElement +%type SimpleTableConstraint +%type TableConstraint +%type WithComponents +%type WithComponentsList +%type WithComponentsElement +%type ComponentRelationConstraint +%type AtNotationList +%type AtNotationElement +%type ConstraintValue +%type ConstraintSpec +%type ConstraintRangeSpec +%type optWithSyntax +%type WithSyntax +%type WithSyntaxFormat +%type WithSyntaxFormatToken +%type optMarker Marker +%type optUnique +%type optPresenceConstraint PresenceConstraint +%type ComponentIdList + + +%% + + +ParsedGrammar: + ModuleList { + *(void **)param = $1; + } + ; + +ModuleList: + ModuleSpecification { + $$ = asn1p_new(); + checkmem($$); + TQ_ADD(&($$->modules), $1, mod_next); + } + | ModuleList ModuleSpecification { + $$ = $1; + TQ_ADD(&($$->modules), $2, mod_next); + } + ; + +/* + * ASN module definition. + * === EXAMPLE === + * MySyntax DEFINITIONS AUTOMATIC TAGS ::= + * BEGIN + * ... + * END + * === EOF === + */ + +ModuleSpecification: + TypeRefName optObjectIdentifier TOK_DEFINITIONS + optModuleSpecificationFlags + TOK_PPEQ TOK_BEGIN + optModuleSpecificationBody + TOK_END { + + if($7) { + $$ = $7; + } else { + /* There's a chance that a module is just plain empty */ + $$ = asn1p_module_new(); + } + checkmem($$); + + $$->Identifier = $1; + $$->module_oid = $2; + $$->module_flags = $4; + } + ; + +/* + * Object Identifier Definition + * { iso member-body(2) 3 } + */ +optObjectIdentifier: + { $$ = 0; } + | ObjectIdentifier { $$ = $1; } + ; + +ObjectIdentifier: + '{' ObjectIdentifierBody '}' { + $$ = $2; + } + | '{' '}' { + $$ = 0; + } + ; + +ObjectIdentifierBody: + ObjectIdentifierElement { + $$ = asn1p_oid_new(); + asn1p_oid_add_arc($$, &$1); + if($1.name) + free($1.name); + } + | ObjectIdentifierBody ObjectIdentifierElement { + $$ = $1; + asn1p_oid_add_arc($$, &$2); + if($2.name) + free($2.name); + } + ; + +ObjectIdentifierElement: + Identifier { /* iso */ + $$.name = $1; + $$.number = -1; + } + | Identifier '(' TOK_number ')' { /* iso(1) */ + $$.name = $1; + $$.number = $3; + } + | TOK_number { /* 1 */ + $$.name = 0; + $$.number = $1; + } + ; + +/* + * Optional module flags. + */ +optModuleSpecificationFlags: + { $$ = MSF_NOFLAGS; } + | ModuleSpecificationFlags { + $$ = $1; + } + ; + +/* + * Module flags. + */ +ModuleSpecificationFlags: + ModuleSpecificationFlag { + $$ = $1; + } + | ModuleSpecificationFlags ModuleSpecificationFlag { + $$ = $1 | $2; + } + ; + +/* + * Single module flag. + */ +ModuleSpecificationFlag: + TOK_EXPLICIT TOK_TAGS { + $$ = MSF_EXPLICIT_TAGS; + } + | TOK_IMPLICIT TOK_TAGS { + $$ = MSF_IMPLICIT_TAGS; + } + | TOK_AUTOMATIC TOK_TAGS { + $$ = MSF_AUTOMATIC_TAGS; + } + | TOK_EXTENSIBILITY TOK_IMPLIED { + $$ = MSF_EXTENSIBILITY_IMPLIED; + } + ; + +/* + * Optional module body. + */ +optModuleSpecificationBody: + { $$ = 0; } + | ModuleSpecificationBody { + assert($1); + $$ = $1; + } + ; + +/* + * ASN.1 Module body. + */ +ModuleSpecificationBody: + ModuleSpecificationElement { + $$ = $1; + } + | ModuleSpecificationBody ModuleSpecificationElement { + $$ = $1; + +#ifdef MY_IMPORT +#error MY_IMPORT DEFINED ELSEWHERE! +#endif +#define MY_IMPORT(foo,field) do { \ + if(TQ_FIRST(&($2->foo))) { \ + TQ_ADD(&($$->foo), \ + TQ_REMOVE(&($2->foo), field), \ + field); \ + assert(TQ_FIRST(&($2->foo)) == 0); \ + } } while(0) + + MY_IMPORT(imports, xp_next); + MY_IMPORT(exports, xp_next); + MY_IMPORT(members, next); +#undef MY_IMPORT + + } + ; + +/* + * One of the elements of ASN.1 module specification. + */ +ModuleSpecificationElement: + ImportsDefinition { + $$ = $1; + } + | ExportsDefinition { + $$ = asn1p_module_new(); + checkmem($$); + if($1) { + TQ_ADD(&($$->exports), $1, xp_next); + } else { + /* "EXPORTS ALL;" ? */ + } + } + | DataTypeReference { + $$ = asn1p_module_new(); + checkmem($$); + assert($1->expr_type != A1TC_INVALID); + assert($1->meta_type != AMT_INVALID); + TQ_ADD(&($$->members), $1, next); + } + | ValueDefinition { + $$ = asn1p_module_new(); + checkmem($$); + assert($1->expr_type != A1TC_INVALID); + assert($1->meta_type != AMT_INVALID); + TQ_ADD(&($$->members), $1, next); + } + /* + * Value set definition + * === EXAMPLE === + * EvenNumbers INTEGER ::= { 2 | 4 | 6 | 8 } + * === EOF === + */ + | ValueSetDefinition { + $$ = asn1p_module_new(); + checkmem($$); + assert($1->expr_type != A1TC_INVALID); + assert($1->meta_type != AMT_INVALID); + TQ_ADD(&($$->members), $1, next); + } + + /* + * Erroneous attemps + */ + | BasicString { + return yyerror( + "Attempt to redefine a standard basic type, " + "use -ftypesXY to switch back " + "to older version of ASN.1 standard"); + } + ; + +/* + * === EXAMPLE === + * IMPORTS Type1, value FROM Module { iso standard(0) } ; + * === EOF === + */ +ImportsDefinition: + TOK_IMPORTS ImportsBundleSet ';' { + $$ = $2; + } + /* + * Some error cases. + */ + | TOK_IMPORTS TOK_FROM /* ... */ { + return yyerror("Empty IMPORTS list"); + } + ; + +ImportsBundleSet: + ImportsBundle { + $$ = asn1p_module_new(); + checkmem($$); + TQ_ADD(&($$->imports), $1, xp_next); + } + | ImportsBundleSet ImportsBundle { + $$ = $1; + TQ_ADD(&($$->imports), $2, xp_next); + } + ; + +ImportsBundle: + ImportsList TOK_FROM TypeRefName optObjectIdentifier { + $$ = $1; + $$->from = $3; + $$->from_oid = $4; + checkmem($$); + } + ; + +ImportsList: + ImportsElement { + $$ = asn1p_xports_new(); + checkmem($$); + TQ_ADD(&($$->members), $1, next); + } + | ImportsList ',' ImportsElement { + $$ = $1; + TQ_ADD(&($$->members), $3, next); + } + ; + +ImportsElement: + TypeRefName { + $$ = asn1p_expr_new(yylineno); + checkmem($$); + $$->Identifier = $1; + $$->expr_type = A1TC_REFERENCE; + } + | Identifier { + $$ = asn1p_expr_new(yylineno); + checkmem($$); + $$->Identifier = $1; + $$->expr_type = A1TC_REFERENCE; + } + ; + +ExportsDefinition: + TOK_EXPORTS ExportsBody ';' { + $$ = $2; + } + | TOK_EXPORTS TOK_ALL ';' { + $$ = 0; + } + | TOK_EXPORTS ';' { + /* Empty EXPORTS clause effectively prohibits export. */ + $$ = asn1p_xports_new(); + checkmem($$); + } + ; + +ExportsBody: + ExportsElement { + $$ = asn1p_xports_new(); + assert($$); + TQ_ADD(&($$->members), $1, next); + } + | ExportsBody ',' ExportsElement { + $$ = $1; + TQ_ADD(&($$->members), $3, next); + } + ; + +ExportsElement: + TypeRefName { + $$ = asn1p_expr_new(yylineno); + checkmem($$); + $$->Identifier = $1; + $$->expr_type = A1TC_EXPORTVAR; + } + | Identifier { + $$ = asn1p_expr_new(yylineno); + checkmem($$); + $$->Identifier = $1; + $$->expr_type = A1TC_EXPORTVAR; + } + ; + + +ValueSetDefinition: + TypeRefName DefinedTypeRef TOK_PPEQ '{' optValueSetBody '}' { + $$ = $2; + assert($$->Identifier == 0); + $$->Identifier = $1; + $$->meta_type = AMT_VALUESET; + // take care of optValueSetBody + } + ; + +DefinedTypeRef: + ComplexTypeReference { + $$ = asn1p_expr_new(yylineno); + checkmem($$); + $$->reference = $1; + $$->expr_type = A1TC_REFERENCE; + $$->meta_type = AMT_TYPEREF; + } + | BasicTypeId { + $$ = asn1p_expr_new(yylineno); + checkmem($$); + $$->expr_type = $1; + $$->meta_type = AMT_TYPE; + } + ; + +optValueSetBody: + { } + | ConstraintElementSet { + } + ; + + +/* + * Data Type Reference. + * === EXAMPLE === + * Type3 ::= CHOICE { a Type1, b Type 2 } + * === EOF === + */ + +DataTypeReference: + /* + * Optionally tagged type definition. + */ + TypeRefName TOK_PPEQ optTag TOK_TYPE_IDENTIFIER { + $$ = asn1p_expr_new(yylineno); + checkmem($$); + $$->Identifier = $1; + $$->tag = $3; + $$->expr_type = A1TC_TYPEID; + $$->meta_type = AMT_TYPE; + } + | TypeRefName TOK_PPEQ optTag ConstrainedTypeDeclaration { + $$ = $4; + $$->Identifier = $1; + $$->tag = $3; + assert($$->expr_type); + assert($$->meta_type); + } + | TypeRefName TOK_PPEQ ClassDeclaration { + $$ = $3; + $$->Identifier = $1; + assert($$->expr_type == A1TC_CLASSDEF); + assert($$->meta_type == AMT_OBJECT); + } + /* + * Parametrized declaration: + * === EXAMPLE === + * SIGNED { ToBeSigned } ::= SEQUENCE { + * toBeSigned ToBeSigned, + * algorithm AlgorithmIdentifier, + * signature BIT STRING + * } + * === EOF === + */ + | TypeRefName '{' ParameterArgumentList '}' + TOK_PPEQ ConstrainedTypeDeclaration { + $$ = $6; + assert($$->Identifier == 0); + $$->Identifier = $1; + $$->params = $3; + $$->meta_type = AMT_PARAMTYPE; + } + ; + +ParameterArgumentList: + ParameterArgumentName { + int ret; + $$ = asn1p_paramlist_new(yylineno); + checkmem($$); + ret = asn1p_paramlist_add_param($$, $1.governor, $1.argument); + checkmem(ret == 0); + if($1.governor) asn1p_ref_free($1.governor); + if($1.argument) free($1.argument); + } + | ParameterArgumentList ',' ParameterArgumentName { + int ret; + $$ = $1; + ret = asn1p_paramlist_add_param($$, $3.governor, $3.argument); + checkmem(ret == 0); + if($3.governor) asn1p_ref_free($3.governor); + if($3.argument) free($3.argument); + } + ; + +ParameterArgumentName: + TypeRefName { + $$.governor = NULL; + $$.argument = $1; + } + | TypeRefName ':' Identifier { + int ret; + $$.governor = asn1p_ref_new(yylineno); + ret = asn1p_ref_add_component($$.governor, $1, 0); + checkmem(ret == 0); + $$.argument = $3; + } + | BasicTypeId ':' Identifier { + int ret; + $$.governor = asn1p_ref_new(yylineno); + ret = asn1p_ref_add_component($$.governor, + ASN_EXPR_TYPE2STR($1), 1); + checkmem(ret == 0); + $$.argument = $3; + } + ; + +ActualParameterList: + ActualParameter { + $$ = asn1p_expr_new(yylineno); + checkmem($$); + TQ_ADD(&($$->members), $1, next); + } + | ActualParameterList ',' ActualParameter { + $$ = $1; + TQ_ADD(&($$->members), $3, next); + } + ; + +ActualParameter: + TypeDeclaration { + $$ = $1; + } + | Identifier { + $$ = asn1p_expr_new(yylineno); + checkmem($$); + $$->Identifier = $1; + $$->expr_type = A1TC_REFERENCE; + $$->meta_type = AMT_VALUE; + } + ; + +/* + * A collection of constructed data type members. + */ +ConstructedDataTypeDefinition: + DataTypeMember { + $$ = asn1p_expr_new(yylineno); + checkmem($$); + TQ_ADD(&($$->members), $1, next); + } + | ConstructedDataTypeDefinition ',' DataTypeMember { + $$ = $1; + TQ_ADD(&($$->members), $3, next); + } + ; + +ClassDeclaration: + TOK_CLASS '{' ClassFieldList '}' optWithSyntax { + $$ = $3; + checkmem($$); + $$->with_syntax = $5; + assert($$->expr_type == A1TC_CLASSDEF); + assert($$->meta_type == AMT_OBJECT); + } + ; + +optUnique: + { $$ = 0; } + | TOK_UNIQUE { $$ = 1; } + ; + +ClassFieldList: + ClassField { + $$ = asn1p_expr_new(yylineno); + checkmem($$); + $$->expr_type = A1TC_CLASSDEF; + $$->meta_type = AMT_OBJECT; + TQ_ADD(&($$->members), $1, next); + } + | ClassFieldList ',' ClassField { + $$ = $1; + TQ_ADD(&($$->members), $3, next); + } + ; + +ClassField: + ClassFieldIdentifier optMarker { + $$ = asn1p_expr_new(yylineno); + checkmem($$); + $$->Identifier = $1.name; + $$->expr_type = A1TC_CLASSFIELD; + $$->meta_type = AMT_OBJECTFIELD; + $$->marker = $2; + } + | ClassFieldIdentifier ConstrainedTypeDeclaration optUnique { + $$ = $2; + $$->Identifier = $1.name; + $$->unique = $3; + } + | ClassFieldIdentifier ClassFieldIdentifier optMarker optUnique { + int ret; + $$ = asn1p_expr_new(yylineno); + checkmem($$); + $$->Identifier = $1.name; + $$->reference = asn1p_ref_new(yylineno); + checkmem($$->reference); + ret = asn1p_ref_add_component($$->reference, + $2.name, $2.lex_type); + checkmem(ret == 0); + $$->expr_type = A1TC_CLASSFIELD; + $$->meta_type = AMT_OBJECTFIELD; + $$->marker = $3; + $$->unique = $4; + } + ; + +optWithSyntax: + { $$ = 0; } + | WithSyntax { + $$ = $1; + } + ; + +WithSyntax: + TOK_WITH TOK_SYNTAX '{' + { asn1p_lexer_hack_enable_with_syntax(); } + WithSyntaxFormat + '}' { + $$ = $5; + } + ; + +WithSyntaxFormat: + WithSyntaxFormatToken { + $$ = asn1p_wsyntx_new(); + TQ_ADD(&($$->chunks), $1, next); + } + | WithSyntaxFormat WithSyntaxFormatToken { + $$ = $1; + TQ_ADD(&($$->chunks), $2, next); + } + ; + +WithSyntaxFormatToken: + TOK_opaque { + $$ = asn1p_wsyntx_chunk_frombuf($1.buf, $1.len, 0); + } + | ClassFieldIdentifier { + asn1p_ref_t *ref; + int ret; + ref = asn1p_ref_new(yylineno); + checkmem(ref); + ret = asn1p_ref_add_component(ref, $1.name, $1.lex_type); + checkmem(ret == 0); + $$ = asn1p_wsyntx_chunk_fromref(ref, 0); + } + ; + +/* + * A data type member goes like this + * === + * memb1 [0] Type1 { a(1), b(2) } (2) + * === + * Therefore, we propose a split. + * ^^^^^^^^^ ^^^^^^^^^^ + * ^TaggedIdentifier ^TypeDeclaration + * ^ConstrainedTypeDeclaration + */ + +/* + * A member of a constructed data type ("a" or "b" in above example). + */ +DataTypeMember: + TaggedIdentifier ConstrainedTypeDeclaration { + $$ = $2; + assert($$->Identifier == 0); + $$->Identifier = $1.name; + $$->tag = $1.tag; + } + | ExtensionAndException { + $$ = $1; + } + ; + +ConstrainedTypeDeclaration: + TypeDeclaration optConstraints optMarker { + $$ = $1; + $$->constraints = $2; + $$->marker = $3; + } + ; + +ExtensionAndException: + TOK_ThreeDots { + $$ = asn1p_expr_new(asn1p_lineno); + checkmem($$); + $$->Identifier = strdup("..."); + checkmem($$->Identifier); + $$->expr_type = A1TC_EXTENSIBLE; + $$->meta_type = AMT_TYPE; + } + | TOK_ThreeDots '!' DefinedValue { + $$ = asn1p_expr_new(asn1p_lineno); + checkmem($$); + $$->Identifier = strdup("..."); + checkmem($$->Identifier); + $$->value = $3; + $$->expr_type = A1TC_EXTENSIBLE; + $$->meta_type = AMT_TYPE; + } + | TOK_ThreeDots '!' SignedNumber { + $$ = asn1p_expr_new(asn1p_lineno); + checkmem($$); + $$->Identifier = strdup("..."); + $$->value = $3; + checkmem($$->Identifier); + $$->expr_type = A1TC_EXTENSIBLE; + $$->meta_type = AMT_TYPE; + } + ; + +TypeDeclaration: + BasicType { + $$ = $1; + } + | BasicString { + $$ = asn1p_expr_new(yylineno); + checkmem($$); + $$->expr_type = $1; + $$->meta_type = AMT_TYPE; + } + | ConstructedType { + $$ = $1; + checkmem($$); + assert($$->meta_type); + } + /* + * A parametrized assignment. + */ + | TypeRefName '{' ActualParameterList '}' { + int ret; + $$ = $3; + assert($$->expr_type == 0); + assert($$->meta_type == 0); + assert($$->reference == 0); + $$->reference = asn1p_ref_new(yylineno); + checkmem($$->reference); + ret = asn1p_ref_add_component($$->reference, $1, RLT_UNKNOWN); + checkmem(ret == 0); + free($1); + $$->expr_type = A1TC_PARAMETRIZED; + $$->meta_type = AMT_TYPE; + } + /* + * A DefinedType reference. + * "CLASS1.&id.&id2" + * or + * "Module.Type" + * or + * "Module.identifier" + * or + * "Type" + */ + | ComplexTypeReference { + $$ = asn1p_expr_new(yylineno); + checkmem($$); + $$->reference = $1; + $$->expr_type = A1TC_REFERENCE; + $$->meta_type = AMT_TYPEREF; + } + | TOK_INSTANCE TOK_OF ComplexTypeReference { + $$ = asn1p_expr_new(yylineno); + checkmem($$); + $$->reference = $3; + $$->expr_type = A1TC_INSTANCE; + $$->meta_type = AMT_TYPE; + } + ; + +/* + * A type name consisting of several components. + * === EXAMPLE === + * === EOF === + */ +ComplexTypeReference: + TOK_typereference { + int ret; + $$ = asn1p_ref_new(yylineno); + checkmem($$); + ret = asn1p_ref_add_component($$, $1, RLT_UNKNOWN); + checkmem(ret == 0); + free($1); + } + | TOK_typereference '.' TypeRefName { + int ret; + $$ = asn1p_ref_new(yylineno); + checkmem($$); + ret = asn1p_ref_add_component($$, $1, RLT_UNKNOWN); + checkmem(ret == 0); + ret = asn1p_ref_add_component($$, $3, RLT_UNKNOWN); + checkmem(ret == 0); + free($1); + } + | TOK_typereference '.' Identifier { + int ret; + $$ = asn1p_ref_new(yylineno); + checkmem($$); + ret = asn1p_ref_add_component($$, $1, RLT_UNKNOWN); + checkmem(ret == 0); + ret = asn1p_ref_add_component($$, $3, RLT_lowercase); + checkmem(ret == 0); + free($1); + } + | ObjectClassReference { + int ret; + $$ = asn1p_ref_new(yylineno); + checkmem($$); + ret = asn1p_ref_add_component($$, $1, RLT_CAPITALS); + free($1); + checkmem(ret == 0); + } + | ObjectClassReference '.' ComplexTypeReferenceAmpList { + int ret; + $$ = $3; + ret = asn1p_ref_add_component($$, $1, RLT_CAPITALS); + free($1); + checkmem(ret == 0); + /* + * Move the last element infront. + */ + { + struct asn1p_ref_component_s tmp_comp; + tmp_comp = $$->components[$$->comp_count-1]; + memmove(&$$->components[1], + &$$->components[0], + sizeof($$->components[0]) + * ($$->comp_count - 1)); + $$->components[0] = tmp_comp; + } + } + ; + +ComplexTypeReferenceAmpList: + ComplexTypeReferenceElement { + int ret; + $$ = asn1p_ref_new(yylineno); + checkmem($$); + ret = asn1p_ref_add_component($$, $1.name, $1.lex_type); + free($1.name); + checkmem(ret == 0); + } + | ComplexTypeReferenceAmpList '.' ComplexTypeReferenceElement { + int ret; + $$ = $1; + ret = asn1p_ref_add_component($$, $3.name, $3.lex_type); + free($3.name); + checkmem(ret == 0); + } + ; + +ComplexTypeReferenceElement: ClassFieldName; +ClassFieldIdentifier: ClassFieldName; + +ClassFieldName: + /* "&Type1" */ + TOK_typefieldreference { + $$.lex_type = RLT_AmpUppercase; + $$.name = $1; + } + /* "&id" */ + | TOK_valuefieldreference { + $$.lex_type = RLT_Amplowercase; + $$.name = $1; + } + ; + + +/* + * === EXAMPLE === + * value INTEGER ::= 1 + * === EOF === + */ +ValueDefinition: + Identifier DefinedTypeRef TOK_PPEQ InlineOrDefinedValue { + $$ = $2; + assert($$->Identifier == NULL); + $$->Identifier = $1; + $$->meta_type = AMT_VALUE; + $$->value = $4; + } + ; + +InlineOrDefinedValue: + '{' { asn1p_lexer_hack_push_opaque_state(); } + Opaque /* '}' */ { + $$ = asn1p_value_frombuf($3.buf, $3.len, 0); + checkmem($$); + $$->type = ATV_UNPARSED; + } + | TOK_bstring { + $$ = _convert_bitstring2binary($1, 'B'); + checkmem($$); + } + | TOK_hstring { + $$ = _convert_bitstring2binary($1, 'H'); + checkmem($$); + } + | TOK_cstring { + $$ = asn1p_value_frombuf($1.buf, $1.len, 0); + checkmem($$); + } + | SignedNumber { + $$ = $1; + } + | DefinedValue { + $$ = $1; + } + ; + +DefinedValue: + Identifier { + asn1p_ref_t *ref; + int ret; + ref = asn1p_ref_new(yylineno); + checkmem(ref); + ret = asn1p_ref_add_component(ref, $1, RLT_lowercase); + checkmem(ret == 0); + $$ = asn1p_value_fromref(ref, 0); + checkmem($$); + free($1); + } + | TypeRefName '.' Identifier { + asn1p_ref_t *ref; + int ret; + ref = asn1p_ref_new(yylineno); + checkmem(ref); + ret = asn1p_ref_add_component(ref, $1, RLT_UNKNOWN); + checkmem(ret == 0); + ret = asn1p_ref_add_component(ref, $3, RLT_lowercase); + checkmem(ret == 0); + $$ = asn1p_value_fromref(ref, 0); + checkmem($$); + free($1); + free($3); + } + ; + +Opaque: + TOK_opaque { + $$.len = $1.len + 2; + $$.buf = malloc($$.len + 1); + checkmem($$.buf); + $$.buf[0] = '{'; + $$.buf[1] = ' '; + memcpy($$.buf + 2, $1.buf, $1.len); + $$.buf[$$.len] = '\0'; + free($1.buf); + } + | Opaque TOK_opaque { + int newsize = $1.len + $2.len; + char *p = malloc(newsize + 1); + checkmem(p); + memcpy(p , $1.buf, $1.len); + memcpy(p + $1.len, $2.buf, $2.len); + p[newsize] = '\0'; + free($1.buf); + free($2.buf); + $$.buf = p; + $$.len = newsize; + } + ; + +BasicTypeId: + TOK_BOOLEAN { $$ = ASN_BASIC_BOOLEAN; } + | TOK_NULL { $$ = ASN_BASIC_NULL; } + | TOK_REAL { $$ = ASN_BASIC_REAL; } + | BasicTypeId_UniverationCompatible { $$ = $1; } + | TOK_OCTET TOK_STRING { $$ = ASN_BASIC_OCTET_STRING; } + | TOK_OBJECT TOK_IDENTIFIER { $$ = ASN_BASIC_OBJECT_IDENTIFIER; } + | TOK_RELATIVE_OID { $$ = ASN_BASIC_RELATIVE_OID; } + | TOK_EXTERNAL { $$ = ASN_BASIC_EXTERNAL; } + | TOK_EMBEDDED TOK_PDV { $$ = ASN_BASIC_EMBEDDED_PDV; } + | TOK_CHARACTER TOK_STRING { $$ = ASN_BASIC_CHARACTER_STRING; } + | TOK_UTCTime { $$ = ASN_BASIC_UTCTime; } + | TOK_GeneralizedTime { $$ = ASN_BASIC_GeneralizedTime; } + ; + +/* + * A type identifier which may be used with "{ a(1), b(2) }" clause. + */ +BasicTypeId_UniverationCompatible: + TOK_INTEGER { $$ = ASN_BASIC_INTEGER; } + | TOK_ENUMERATED { $$ = ASN_BASIC_ENUMERATED; } + | TOK_BIT TOK_STRING { $$ = ASN_BASIC_BIT_STRING; } + ; + +BasicType: + BasicTypeId { + $$ = asn1p_expr_new(asn1p_lineno); + checkmem($$); + $$->expr_type = $1; + $$->meta_type = AMT_TYPE; + } + | BasicTypeId_UniverationCompatible UniverationDefinition { + if($2) { + $$ = $2; + } else { + $$ = asn1p_expr_new(asn1p_lineno); + checkmem($$); + } + $$->expr_type = $1; + $$->meta_type = AMT_TYPE; + } + ; + +BasicString: + TOK_BMPString { $$ = ASN_STRING_BMPString; } + | TOK_GeneralString { + $$ = ASN_STRING_GeneralString; + return yyerror("GeneralString is not supported"); + } + | TOK_GraphicString { + $$ = ASN_STRING_GraphicString; + return yyerror("GraphicString is not supported"); + } + | TOK_IA5String { $$ = ASN_STRING_IA5String; } + | TOK_ISO646String { $$ = ASN_STRING_ISO646String; } + | TOK_NumericString { $$ = ASN_STRING_NumericString; } + | TOK_PrintableString { $$ = ASN_STRING_PrintableString; } + | TOK_T61String { + $$ = ASN_STRING_T61String; + return yyerror("T61String not implemented yet"); + } + | TOK_TeletexString { $$ = ASN_STRING_TeletexString; } + | TOK_UniversalString { $$ = ASN_STRING_UniversalString; } + | TOK_UTF8String { $$ = ASN_STRING_UTF8String; } + | TOK_VideotexString { + $$ = ASN_STRING_VideotexString; + return yyerror("VideotexString is no longer supported"); + } + | TOK_VisibleString { $$ = ASN_STRING_VisibleString; } + | TOK_ObjectDescriptor { $$ = ASN_STRING_ObjectDescriptor; } + ; + +ConstructedType: + TOK_CHOICE '{' ConstructedDataTypeDefinition '}' { + $$ = $3; + assert($$->expr_type == A1TC_INVALID); + $$->expr_type = ASN_CONSTR_CHOICE; + $$->meta_type = AMT_TYPE; + } + | TOK_SEQUENCE '{' ConstructedDataTypeDefinition '}' { + $$ = $3; + assert($$->expr_type == A1TC_INVALID); + $$->expr_type = ASN_CONSTR_SEQUENCE; + $$->meta_type = AMT_TYPE; + } + | TOK_SET '{' ConstructedDataTypeDefinition '}' { + $$ = $3; + assert($$->expr_type == A1TC_INVALID); + $$->expr_type = ASN_CONSTR_SET; + $$->meta_type = AMT_TYPE; + } + | TOK_SEQUENCE optConstraints TOK_OF TypeDeclaration { + $$ = asn1p_expr_new(asn1p_lineno); + checkmem($$); + $$->constraints = $2; + $$->expr_type = ASN_CONSTR_SEQUENCE_OF; + $$->meta_type = AMT_TYPE; + TQ_ADD(&($$->members), $4, next); + } + | TOK_SET optConstraints TOK_OF TypeDeclaration { + $$ = asn1p_expr_new(asn1p_lineno); + checkmem($$); + $$->constraints = $2; + $$->expr_type = ASN_CONSTR_SET_OF; + $$->meta_type = AMT_TYPE; + TQ_ADD(&($$->members), $4, next); + } + | TOK_ANY { + $$ = asn1p_expr_new(asn1p_lineno); + checkmem($$); + $$->expr_type = ASN_CONSTR_ANY; + $$->meta_type = AMT_TYPE; + } + | TOK_ANY TOK_DEFINED TOK_BY Identifier { + int ret; + $$ = asn1p_expr_new(asn1p_lineno); + checkmem($$); + $$->reference = asn1p_ref_new(yylineno); + ret = asn1p_ref_add_component($$->reference, + $4, RLT_lowercase); + checkmem(ret == 0); + $$->expr_type = ASN_CONSTR_ANY; + $$->meta_type = AMT_TYPE; + } + ; + +/* + * Data type constraints. + */ +optConstraints: + { $$ = 0; } + | Constraints { $$ = $1; } + ; + +Union: '|' | TOK_UNION; +Intersection: '^' | TOK_INTERSECTION; +Except: TOK_EXCEPT; + +Constraints: + TOK_SIZE '(' ConstraintElementSet ')' { + /* + * This is a special case, for compatibility purposes. + * It goes without parenthesis. + */ + int ret; + $$ = asn1p_constraint_new(yylineno); + checkmem($$); + $$->type = ACT_CT_SIZE; + ret = asn1p_constraint_insert($$, $3); + checkmem(ret == 0); + } + | SingleConstraint { + CONSTRAINT_INSERT($$, ACT_CA_SET, $1, 0); + } + | Constraints SingleConstraint { + CONSTRAINT_INSERT($$, ACT_CA_SET, $1, $2); + } + ; + +SingleConstraint: + '(' ConstraintElementSet ')' { + $$ = $2; + } + ; + +ConstraintElementSet: + ConstraintElement { + $$ = $1; + } + | ConstraintElement ',' TOK_ThreeDots { + asn1p_constraint_t *ct; + ct = asn1p_constraint_new(yylineno); + checkmem(ct); + ct->type = ACT_EL_EXT; + CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct); + } + | ConstraintElement ',' TOK_ThreeDots ',' ConstraintElement { + asn1p_constraint_t *ct; + ct = asn1p_constraint_new(yylineno); + checkmem(ct); + ct->type = ACT_EL_EXT; + CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct); + CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, $5); + } + | TOK_ThreeDots { + $$ = asn1p_constraint_new(yylineno); + checkmem($$); + $$->type = ACT_EL_EXT; + } + | TOK_ThreeDots ',' ConstraintElement { + asn1p_constraint_t *ct; + ct = asn1p_constraint_new(yylineno); + checkmem(ct); + ct->type = ACT_EL_EXT; + CONSTRAINT_INSERT($$, ACT_CA_CSV, ct, $3); + } + ; + +ConstraintElement: ConstraintElementUnion { $$ = $1; } ; + +ConstraintElementUnion: + ConstraintElementIntersection { $$ = $1; } + | ConstraintElementUnion Union ConstraintElementIntersection { + CONSTRAINT_INSERT($$, ACT_CA_UNI, $1, $3); + } + ; + +ConstraintElementIntersection: + ConstraintElementException { $$ = $1; } + | ConstraintElementIntersection Intersection + ConstraintElementException { + CONSTRAINT_INSERT($$, ACT_CA_INT, $1, $3); + } + ; + +ConstraintElementException: + ConstraintSubtypeElement { $$ = $1; } + | ConstraintElementException Except ConstraintSubtypeElement { + CONSTRAINT_INSERT($$, ACT_CA_EXC, $1, $3); + } + ; + +ConstraintSubtypeElement: + ConstraintValue { + $$ = asn1p_constraint_new(yylineno); + checkmem($$); + $$->type = ACT_EL_VALUE; + $$->value = $1; + } + | ConstraintValue ConstraintRangeSpec ConstraintValue { + $$ = asn1p_constraint_new(yylineno); + checkmem($$); + $$->type = $2; + $$->range_start = $1; + $$->range_stop = $3; + } + | ConstraintSpec '(' ConstraintElementSet ')' { + int ret; + $$ = asn1p_constraint_new(yylineno); + checkmem($$); + $$->type = $1; + ret = asn1p_constraint_insert($$, $3); + checkmem(ret == 0); + } + | TableConstraint { + $$ = $1; + } + | WithComponents { + $$ = $1; + } + ; + +ConstraintRangeSpec: + TOK_TwoDots { $$ = ACT_EL_RANGE; } + | TOK_TwoDots '<' { $$ = ACT_EL_RLRANGE; } + | '<' TOK_TwoDots { $$ = ACT_EL_LLRANGE; } + | '<' TOK_TwoDots '<' { $$ = ACT_EL_ULRANGE; } + ; + +ConstraintSpec: + TOK_SIZE { + $$ = ACT_CT_SIZE; + } + | TOK_FROM { + $$ = ACT_CT_FROM; + } + ; + +ConstraintValue: + SignedNumber { + $$ = $1; + } + | Identifier { + asn1p_ref_t *ref; + int ret; + ref = asn1p_ref_new(yylineno); + checkmem(ref); + ret = asn1p_ref_add_component(ref, $1, RLT_lowercase); + checkmem(ret == 0); + $$ = asn1p_value_fromref(ref, 0); + checkmem($$); + free($1); + } + | TOK_cstring { + $$ = asn1p_value_frombuf($1.buf, $1.len, 0); + checkmem($$); + } + | TOK_MIN { + $$ = asn1p_value_fromint(123); + checkmem($$); + $$->type = ATV_MIN; + } + | TOK_MAX { + $$ = asn1p_value_fromint(321); + checkmem($$); + $$->type = ATV_MAX; + } + | TOK_FALSE { + $$ = asn1p_value_fromint(0); + checkmem($$); + $$->type = ATV_FALSE; + } + | TOK_TRUE { + $$ = asn1p_value_fromint(1); + checkmem($$); + $$->type = ATV_TRUE; + } + ; + +WithComponents: + TOK_WITH TOK_COMPONENTS '{' WithComponentsList '}' { + CONSTRAINT_INSERT($$, ACT_CT_WCOMPS, $4, 0); + } + ; + +WithComponentsList: + WithComponentsElement { + $$ = $1; + } + | WithComponentsList ',' WithComponentsElement { + CONSTRAINT_INSERT($$, ACT_CT_WCOMPS, $1, $3); + } + ; + +WithComponentsElement: + TOK_ThreeDots { + $$ = asn1p_constraint_new(yylineno); + checkmem($$); + $$->type = ACT_EL_EXT; + } + | Identifier optConstraints optPresenceConstraint { + $$ = asn1p_constraint_new(yylineno); + checkmem($$); + $$->type = ACT_EL_VALUE; + $$->value = asn1p_value_frombuf($1, strlen($1), 0); + $$->presence = $3; + } + ; + +/* + * presence constraint for WithComponents + */ +optPresenceConstraint: + { $$ = ACPRES_DEFAULT; } + | PresenceConstraint { $$ = $1; } + ; + +PresenceConstraint: + TOK_PRESENT { + $$ = ACPRES_PRESENT; + } + | TOK_ABSENT { + $$ = ACPRES_ABSENT; + } + | TOK_OPTIONAL { + $$ = ACPRES_OPTIONAL; + } + ; + +TableConstraint: + SimpleTableConstraint { + $$ = $1; + } + | ComponentRelationConstraint { + $$ = $1; + } + ; + +/* + * "{ExtensionSet}" + */ +SimpleTableConstraint: + '{' TypeRefName '}' { + asn1p_ref_t *ref = asn1p_ref_new(yylineno); + asn1p_constraint_t *ct; + int ret; + ret = asn1p_ref_add_component(ref, $2, 0); + checkmem(ret == 0); + ct = asn1p_constraint_new(yylineno); + checkmem($$); + ct->type = ACT_EL_VALUE; + ct->value = asn1p_value_fromref(ref, 0); + CONSTRAINT_INSERT($$, ACT_CA_CRC, ct, 0); + } + ; + +ComponentRelationConstraint: + SimpleTableConstraint '{' AtNotationList '}' { + CONSTRAINT_INSERT($$, ACT_CA_CRC, $1, $3); + } + ; + +AtNotationList: + AtNotationElement { + $$ = asn1p_constraint_new(yylineno); + checkmem($$); + $$->type = ACT_EL_VALUE; + $$->value = asn1p_value_fromref($1, 0); + } + | AtNotationList ',' AtNotationElement { + asn1p_constraint_t *ct; + ct = asn1p_constraint_new(yylineno); + checkmem(ct); + ct->type = ACT_EL_VALUE; + ct->value = asn1p_value_fromref($3, 0); + CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct); + } + ; + +/* + * @blah + */ +AtNotationElement: + '@' ComponentIdList { + char *p = malloc(strlen($2) + 2); + int ret; + *p = '@'; + strcpy(p + 1, $2); + $$ = asn1p_ref_new(yylineno); + ret = asn1p_ref_add_component($$, p, 0); + checkmem(ret == 0); + free(p); + free($2); + } + | '@' '.' ComponentIdList { + char *p = malloc(strlen($3) + 3); + int ret; + p[0] = '@'; + p[1] = '.'; + strcpy(p + 2, $3); + $$ = asn1p_ref_new(yylineno); + ret = asn1p_ref_add_component($$, p, 0); + checkmem(ret == 0); + free(p); + free($3); + } + ; + +/* identifier "." ... */ +ComponentIdList: + Identifier { + $$ = $1; + } + | ComponentIdList '.' Identifier { + int l1 = strlen($1); + int l3 = strlen($3); + $$ = malloc(l1 + 1 + l3 + 1); + memcpy($$, $1, l1); + $$[l1] = '.'; + memcpy($$ + l1 + 1, $3, l3); + $$[l1 + 1 + l3] = '\0'; + } + ; + + + +/* + * MARKERS + */ + +optMarker: + { $$ = EM_NOMARK; } + | Marker { $$ = $1; } + ; + +Marker: + TOK_OPTIONAL { + $$ = EM_OPTIONAL; + } + | TOK_DEFAULT DefaultValue { + $$ = EM_DEFAULT; + /* FIXME: store DefaultValue somewhere */ + } + ; + +DefaultValue: + ConstraintValue { + } + | BasicTypeId { + } + | '{' { asn1p_lexer_hack_push_opaque_state(); } Opaque /* '}' */ { + } + ; + +/* + * Universal enumeration definition to use in INTEGER and ENUMERATED. + * === EXAMPLE === + * Gender ::= ENUMERATED { unknown(0), male(1), female(2) } + * Temperature ::= INTEGER { absolute-zero(-273), freezing(0), boiling(100) } + * === EOF === + */ +/* +optUniverationDefinition: + { $$ = 0; } + | UniverationDefinition { + $$ = $1; + } + ; +*/ + +UniverationDefinition: + '{' '}' { + $$ = asn1p_expr_new(asn1p_lineno); + checkmem($$); + } + | '{' UniverationList '}' { + $$ = $2; + } + ; + +UniverationList: + UniverationElement { + $$ = asn1p_expr_new(asn1p_lineno); + checkmem($$); + TQ_ADD(&($$->members), $1, next); + } + | UniverationList ',' UniverationElement { + $$ = $1; + TQ_ADD(&($$->members), $3, next); + } + ; + +UniverationElement: + Identifier { + $$ = asn1p_expr_new(asn1p_lineno); + checkmem($$); + $$->expr_type = A1TC_UNIVERVAL; + $$->meta_type = AMT_VALUE; + $$->Identifier = $1; + } + | Identifier '(' SignedNumber ')' { + $$ = asn1p_expr_new(asn1p_lineno); + checkmem($$); + $$->expr_type = A1TC_UNIVERVAL; + $$->meta_type = AMT_VALUE; + $$->Identifier = $1; + $$->value = $3; + } + | Identifier '(' DefinedValue ')' { + $$ = asn1p_expr_new(asn1p_lineno); + checkmem($$); + $$->expr_type = A1TC_UNIVERVAL; + $$->meta_type = AMT_VALUE; + $$->Identifier = $1; + $$->value = $3; + } + | SignedNumber { + $$ = asn1p_expr_new(asn1p_lineno); + checkmem($$); + $$->expr_type = A1TC_UNIVERVAL; + $$->meta_type = AMT_VALUE; + $$->value = $1; + } + | TOK_ThreeDots { + $$ = asn1p_expr_new(asn1p_lineno); + checkmem($$); + $$->Identifier = strdup("..."); + checkmem($$->Identifier); + $$->expr_type = A1TC_EXTENSIBLE; + $$->meta_type = AMT_VALUE; + } + ; + +SignedNumber: + TOK_number { + $$ = asn1p_value_fromint($1); + checkmem($$); + } + | TOK_number_negative { + $$ = asn1p_value_fromint($1); + checkmem($$); + } + ; + +/* + * SEQUENCE definition. + * === EXAMPLE === + * Struct1 ::= SEQUENCE { + * memb1 Struct2, + * memb2 SEQUENCE OF { + * memb2-1 Struct 3 + * } + * } + * === EOF === + */ + + + +/* + * SET definition. + * === EXAMPLE === + * Person ::= SET { + * name [0] PrintableString (SIZE(1..20)), + * country [1] PrintableString (SIZE(1..20)) DEFAULT default-country, + * } + * === EOF === + */ + +optTag: + { memset(&$$, 0, sizeof($$)); } + | Tag { $$ = $1; } + ; + +Tag: + TOK_tag { + $$ = $1; + $$.tag_mode = TM_DEFAULT; + } + | TOK_tag TOK_IMPLICIT { + $$ = $1; + $$.tag_mode = TM_IMPLICIT; + } + | TOK_tag TOK_EXPLICIT { + $$ = $1; + $$.tag_mode = TM_EXPLICIT; + } + ; + +TypeRefName: + TOK_typereference { + checkmem($1); + $$ = $1; + } + | TOK_objectclassreference { + checkmem($1); + $$ = $1; + } + ; + +ObjectClassReference: + TOK_objectclassreference { + checkmem($1); + $$ = $1; + } + ; + +Identifier: + TOK_identifier { + checkmem($1); + $$ = $1; + } + ; + +TaggedIdentifier: + Identifier { + memset(&$$, 0, sizeof($$)); + $$.name = $1; + } + | Identifier Tag { + $$.name = $1; + $$.tag = $2; + } + ; + + +%% + + +/* + * Convert Xstring ('0101'B or '5'H) to the binary vector. + */ +static asn1p_value_t * +_convert_bitstring2binary(char *str, int base) { + asn1p_value_t *val; + int slen; + int memlen; + int baselen; + int bits; + uint8_t *binary_vector; + uint8_t *bv_ptr; + uint8_t cur_val; + + assert(str); + assert(str[0] == '\''); + + switch(base) { + case 'B': + baselen = 1; + break; + case 'H': + baselen = 4; + break; + default: + assert(base == 'B' || base == 'H'); + errno = EINVAL; + return NULL; + } + + slen = strlen(str); + assert(str[slen - 1] == base); + assert(str[slen - 2] == '\''); + + memlen = slen / (8 / baselen); /* Conservative estimate */ + + bv_ptr = binary_vector = malloc(memlen + 1); + if(bv_ptr == NULL) + /* ENOMEM */ + return NULL; + + cur_val = 0; + bits = 0; + while(*(++str) != '\'') { + switch(baselen) { + case 1: + switch(*str) { + case '1': + cur_val |= 1 << (7 - (bits % 8)); + case '0': + break; + default: + assert(!"_y UNREACH1"); + case ' ': case '\r': case '\n': + continue; + } + break; + case 4: + switch(*str) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + cur_val |= (*str - '0') << (4 - (bits % 8)); + break; + case 'A': case 'B': case 'C': + case 'D': case 'E': case 'F': + cur_val |= ((*str - 'A') + 10) + << (4 - (bits % 8)); + break; + default: + assert(!"_y UNREACH2"); + case ' ': case '\r': case '\n': + continue; + } + break; + } + + bits += baselen; + if((bits % 8) == 0) { + *bv_ptr++ = cur_val; + cur_val = 0; + } + } + + *bv_ptr = cur_val; + assert((bv_ptr - binary_vector) <= memlen); + + val = asn1p_value_frombits(binary_vector, bits, 0); + if(val == NULL) { + free(binary_vector); + } + + return val; +} + +extern char *asn1p_text; + +int +yyerror(const char *msg) { + fprintf(stderr, + "ASN.1 grammar parse error " + "near line %d (token \"%s\"): %s\n", + asn1p_lineno, asn1p_text, msg); + return -1; +} + + diff --git a/libasn1parser/asn1parser.c b/libasn1parser/asn1parser.c new file mode 100644 index 000000000..b5d9e1e49 --- /dev/null +++ b/libasn1parser/asn1parser.c @@ -0,0 +1,171 @@ +#include +#include +#include +#include +#include +#include + +#include "asn1parser.h" +#include "asn1p_list.h" + +int asn1p_parse(void **param); + +void *asn1p__scan_bytes(const char *, int len); +void *asn1p__delete_buffer(void *); +void *asn1p_restart(FILE *); + +extern int asn1p_lineno; + +static int _asn1p_set_flags(enum asn1p_flags flags); +static int _asn1p_assign_filename(asn1p_t *a, const char *fname); + +/* + * Parse the given buffer. + */ +asn1p_t * +asn1p_parse_buffer(const char *buffer, int size /* = -1 */, enum asn1p_flags flags) { + asn1p_t *a = 0; + void *ap; + void *ybuf; + int ret; + + if(_asn1p_set_flags(flags)) { + /* EINVAL */ + return 0; + } + + if(size < 0) + size = strlen(buffer); + + ybuf = asn1p__scan_bytes(buffer, size); + if(!ybuf) { + assert(ybuf); + return 0; + } + + asn1p_lineno = 1; + + ap = (void *)&a; + ret = asn1p_parse(ap); + + asn1p__delete_buffer(ybuf); + + if(ret == 0) { + assert(a); + if(_asn1p_assign_filename(a, "-")) + return NULL; /* FIXME: destroy (a) */ + } else { + assert(a == NULL); + } + + return a; +} + + +/* + * Parse the file identified by its name. + */ +asn1p_t * +asn1p_parse_file(const char *filename, enum asn1p_flags flags) { + struct stat sb; + asn1p_t *a = 0; + void *ap; + FILE *fp; + int ret; + + if(_asn1p_set_flags(flags)) { + /* EINVAL */ + return 0; + } + + fp = fopen(filename, "r"); + if(fp == NULL) { + perror(filename); + return NULL; + } + + if(fstat(fileno(fp), &sb) + || !S_ISREG(sb.st_mode)) { + fclose(fp); + fprintf(stderr, "%s file not recognized: Bad file format\n", + filename); + errno = EINVAL; + return NULL; + } + + asn1p_lineno = 1; + + asn1p_restart(fp); + + ap = (void *)&a; + ret = asn1p_parse(ap); + + fclose(fp); + + if(ret == 0) { + assert(a); + if(_asn1p_assign_filename(a, filename)) + return NULL; /* FIXME: destroy (a) */ + } else { + assert(a == NULL); + } + + return a; +} + +extern int asn1p_lexer_types_year; +extern int asn1p_lexer_constructs_year; +extern int asn1p__flex_debug; + +static int +_asn1p_set_flags(enum asn1p_flags flags) { + + asn1p_lexer_types_year = 0; + asn1p_lexer_constructs_year = 0; + asn1p__flex_debug = 0; + + /* + * Enable debugging in lexer. + */ + if(flags & A1P_LEXER_DEBUG) { + flags &= ~A1P_LEXER_DEBUG; + asn1p__flex_debug = 1; + } + + /* + * Restrict embedded types to ASN.1:1988 version of standard. + */ + if(flags & A1P_TYPES_RESTRICT_TO_1988) { + flags &= ~A1P_TYPES_RESTRICT_TO_1988; + asn1p_lexer_types_year = 1988; + } + + /* + * Restrict embedded types to ASN.1:1988 version of standard. + */ + if(flags & A1P_TYPES_RESTRICT_TO_1988) { + flags &= ~A1P_TYPES_RESTRICT_TO_1988; + asn1p_lexer_types_year = 1988; + } + + /* + * Check that we haven't missed an unknown flag. + */ + if(flags) { + errno = EINVAL; + return -1; + } + + return 0; +} + +static int +_asn1p_assign_filename(asn1p_t *a, const char *fname) { + asn1p_module_t *mod; + TQ_FOR(mod, &(a->modules), mod_next) { + mod->source_file_name = strdup(fname); + if(mod->source_file_name == NULL) + return -1; + } + return 0; +} diff --git a/libasn1parser/asn1parser.h b/libasn1parser/asn1parser.h new file mode 100644 index 000000000..b4c72f8b2 --- /dev/null +++ b/libasn1parser/asn1parser.h @@ -0,0 +1,73 @@ +/* + * This is a parser of the ASN.1 grammar. + */ +#ifndef ASN1PARSER_H +#define ASN1PARSER_H + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif /* HAVE_CONFIG_H */ + +#ifdef HAVE_SYS_TYPES_H +#include +#endif /* HAVE_SYS_TYPES_H */ +#ifdef HAVE_INTTYPES_H +#include /* POSIX 1003.1-2001, C99 */ +#else /* HAVE_INTTYPES_H */ +#ifdef HAVE_STDINT_H +#include /* SUSv2+ */ +#endif /* HAVE_STDINT_H */ +#endif /* HAVE_INTTYPES_H */ + +/* + * Basic integer type used in numerous places. + * ASN.1 does not define any limits on this number, so it must be sufficiently + * large to accomodate typical inputs. It does not have to be a dynamically + * allocated type with potentially unlimited width: consider the width of + * an integer defined here as one of the "compiler limitations". + * NOTE: this is NOT a type for ASN.1 "INTEGER" type representation, this + * type is used by the compiler itself to handle large integer values + * specified inside ASN.1 grammar. + */ +typedef intmax_t asn1_integer_t; + +#include +#include /* Object identifiers (OIDs) */ +#include /* References to custom types */ +#include /* Value definition */ +#include /* Parametrization */ +#include /* Type Constraints */ +#include /* IMports/EXports */ +#include /* ASN.1 definition module */ +#include /* CLASS-related stuff */ +#include /* A single ASN.1 expression */ + +/* + * Parser flags. + */ +enum asn1p_flags { + A1P_NOFLAGS, + /* + * Enable verbose debugging output from lexer. + */ + A1P_LEXER_DEBUG = 0x0001, + /* + * Embedded types restricted to ASN.1:1988 + */ + A1P_TYPES_RESTRICT_TO_1988 = 0x0010, + /* + * Embedded constructs (concepts) restricted to ASN.1:1990 + */ + A1P_CONSTRUCTS_RESTRICT_TO_1990 = 0x0020, +}; + +/* + * Perform low-level parsing of ASN.1 module[s] + * and return a list of module trees. + */ +asn1p_t *asn1p_parse_file(const char *filename, + enum asn1p_flags); +asn1p_t *asn1p_parse_buffer(const char *buffer, int size /* = -1 */, + enum asn1p_flags); + +#endif /* ASN1PARSER_H */ diff --git a/libasn1parser/expr-h.pl b/libasn1parser/expr-h.pl new file mode 100755 index 000000000..c00128a0a --- /dev/null +++ b/libasn1parser/expr-h.pl @@ -0,0 +1,49 @@ +#!/usr/bin/perl + + +print<) { + chomp; + next if(/TYPE_MAX/); + next unless(/^[ \t]+(ASN_[A-Z]+_([A-Za-z0-9_]+))/); + + print "\t[ $1 ]\t = "; + + $_ = $2; + if($_ eq "RELATIVE_OID") { + print '"RELATIVE-OID"'; + } else { + s/_/ /; + print '"'.$_.'"'; + } + + print ",\n"; +} + +print<= sizeof(asn1p_expr_type2str) \\ + / sizeof(asn1p_expr_type2str[0])) \\ + ? (char *)0 \\ + : asn1p_expr_type2str[(type)] \\ + ) + +#endif /* ASN1_PARSER_EXPR_STR_H */ +EOM diff --git a/libasn1print/Makefile.am b/libasn1print/Makefile.am new file mode 100644 index 000000000..fb4861a47 --- /dev/null +++ b/libasn1print/Makefile.am @@ -0,0 +1,14 @@ + +AM_CFLAGS = @ADD_CFLAGS@ +AM_CPPFLAGS = -I${top_srcdir}/libasn1parser + +noinst_LTLIBRARIES = libasn1print.la + +libasn1print_la_LDFLAGS = -all-static +libasn1print_la_SOURCES = \ + asn1print.c asn1print.h + +LDADD = ${noinst_LTLIBRARIES} ${libasn1fix_la_LIBADD} +DEPENDENCIES = ${LDADD} + +TESTS = ${check_PROGRAMS} diff --git a/libasn1print/Makefile.in b/libasn1print/Makefile.in new file mode 100644 index 000000000..e1e876e54 --- /dev/null +++ b/libasn1print/Makefile.in @@ -0,0 +1,382 @@ +# Makefile.in generated automatically by automake 1.5 from Makefile.am. + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_alias = @build_alias@ +build_triplet = @build@ +host_alias = @host_alias@ +host_triplet = @host@ +target_alias = @target_alias@ +target_triplet = @target@ +ADD_CFLAGS = @ADD_CFLAGS@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +AWK = @AWK@ +CC = @CC@ +CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPP = @CPP@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +EXEEXT = @EXEEXT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LEX = @LEX@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +MAINT = @MAINT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PATH = @PATH@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ +YACC = @YACC@ +am__include = @am__include@ +am__quote = @am__quote@ +install_sh = @install_sh@ + +AM_CFLAGS = @ADD_CFLAGS@ +AM_CPPFLAGS = -I${top_srcdir}/libasn1parser + +noinst_LTLIBRARIES = libasn1print.la + +libasn1print_la_LDFLAGS = -all-static +libasn1print_la_SOURCES = \ + asn1print.c asn1print.h + + +LDADD = ${noinst_LTLIBRARIES} ${libasn1fix_la_LIBADD} +DEPENDENCIES = ${LDADD} + +TESTS = ${check_PROGRAMS} +subdir = libasn1print +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) + +libasn1print_la_LIBADD = +am_libasn1print_la_OBJECTS = asn1print.lo +libasn1print_la_OBJECTS = $(am_libasn1print_la_OBJECTS) + +DEFS = @DEFS@ +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/asn1print.Plo +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ + $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +CFLAGS = @CFLAGS@ +DIST_SOURCES = $(libasn1print_la_SOURCES) +DIST_COMMON = README Makefile.am Makefile.in +SOURCES = $(libasn1print_la_SOURCES) + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu libasn1print/Makefile +Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && \ + CONFIG_HEADERS= CONFIG_LINKS= \ + CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) +libasn1print.la: $(libasn1print_la_OBJECTS) $(libasn1print_la_DEPENDENCIES) + $(LINK) $(libasn1print_la_LDFLAGS) $(libasn1print_la_OBJECTS) $(libasn1print_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) core *.core + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1print.Plo@am__quote@ + +distclean-depend: + -rm -rf $(DEPDIR) + +.c.o: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< + +.c.obj: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `cygpath -w $<` + +.c.lo: +@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< +CCDEPMODE = @CCDEPMODE@ +uninstall-info-am: + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique $(LISP) + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) + +GTAGS: + here=`CDPATH=: && cd $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; \ + srcdir=$(srcdir); export srcdir; \ + list='$(TESTS)'; \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *" $$tst "*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ + ;; \ + *) \ + echo "PASS: $$tst"; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *" $$tst "*) \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ + ;; \ + esac; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all tests failed"; \ + else \ + banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ + fi; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0; \ + fi + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + $(mkinstalldirs) "$(distdir)/$$dir"; \ + fi; \ + if test -d $$d/$$file; then \ + cp -pR $$d/$$file $(distdir) \ + || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile $(LTLIBRARIES) + +installdirs: + +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + +distclean-am: clean-am distclean-compile distclean-depend \ + distclean-generic distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +uninstall-am: uninstall-info-am + +.PHONY: GTAGS all all-am check check-TESTS check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES distclean \ + distclean-compile distclean-depend distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am info \ + info-am install install-am install-data install-data-am \ + install-exec install-exec-am install-info install-info-am \ + install-man install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool tags uninstall uninstall-am \ + uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libasn1print/README b/libasn1print/README new file mode 100644 index 000000000..5c1071cf1 --- /dev/null +++ b/libasn1print/README @@ -0,0 +1,4 @@ + +Ad hoc ASN tree printing procedures. Use for debugging purposes, this library +isn't thought through enough to be universally useful or even accurate. + diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c new file mode 100644 index 000000000..992dcfa04 --- /dev/null +++ b/libasn1print/asn1print.c @@ -0,0 +1,456 @@ +#include +#include +#include +#include + +#include + +#include "asn1print.h" + +#define INDENT(fmt, args...) do { \ + int __i = level; while(__i--) putchar(' '); \ + printf(fmt, ##args); \ + } while(0) + +static int asn1print_module(asn1p_module_t *mod, enum asn1print_flags_e flags); +static int asn1print_oid(asn1p_oid_t *oid, enum asn1print_flags_e flags); +static int asn1print_ref(asn1p_ref_t *ref, enum asn1print_flags_e flags); +static int asn1print_tag(asn1p_expr_t *tc, enum asn1print_flags_e flags); +static int asn1print_params(asn1p_paramlist_t *pl,enum asn1print_flags_e flags); +static int asn1print_with_syntax(asn1p_wsyntx_t *wx, enum asn1print_flags_e flags); +static int asn1print_constraint(asn1p_constraint_t *, enum asn1print_flags_e); +static int asn1print_value(asn1p_value_t *val, enum asn1print_flags_e flags); +static int asn1print_expr(asn1p_expr_t *tc, enum asn1print_flags_e flags, + int level); + +/* + * Print the contents of the parsed ASN tree. + */ +int +asn1print(asn1p_t *asn, enum asn1print_flags_e flags) { + asn1p_module_t *mod; + + if(asn == NULL) { + errno = EINVAL; + return -1; + } + + TQ_FOR(mod, &(asn->modules), mod_next) { + asn1print_module(mod, flags); + } + + return 0; +} + +static int +asn1print_module(asn1p_module_t *mod, enum asn1print_flags_e flags) { + asn1p_expr_t *tc; + + if(!(flags & APF_NO_SOURCE_COMMENTS)) + printf("\n-- Contents of \"%s\"\n", mod->source_file_name); + + printf("\n%s ", mod->Identifier); + if(mod->module_oid) { + asn1print_oid(mod->module_oid, flags); + printf("\n"); + } + + printf("DEFINITIONS"); + + if(mod->module_flags & MSF_EXPLICIT_TAGS) + printf(" EXPLICIT TAGS"); + if(mod->module_flags & MSF_IMPLICIT_TAGS) + printf(" IMPLICIT TAGS"); + if(mod->module_flags & MSF_AUTOMATIC_TAGS) + printf(" AUTOMATIC TAGS"); + if(mod->module_flags & MSF_EXTENSIBILITY_IMPLIED) + printf(" EXTENSIBILITY IMPLIED"); + + printf(" ::=\n"); + printf("BEGIN\n\n"); + + TQ_FOR(tc, &(mod->members), next) { + asn1print_expr(tc, flags, 0); + printf("\n\n"); + } + + printf("END\n"); + + return 0; +} + +static int +asn1print_oid(asn1p_oid_t *oid, enum asn1print_flags_e flags) { + int ac; + int accum = 0; + + printf("{"); + for(ac = 0; ac < oid->arcs_count; ac++) { + if(accum + strlen(oid->arcs[ac].name?:"") > 50) { + printf("\n\t"); + accum = 0; + } else if(ac) printf(" "); + + if(oid->arcs[ac].name) { + printf("%s(%d)", + oid->arcs[ac].name, + (int)oid->arcs[ac].number); + accum += strlen(oid->arcs[ac].name); + } else { + printf("%d", + (int)oid->arcs[ac].number); + } + accum += 4; + } + printf(" }"); + + return 0; +} + +static int +asn1print_ref(asn1p_ref_t *ref, enum asn1print_flags_e flags) { + int cc; + + for(cc = 0; cc < ref->comp_count; cc++) { + if(cc) printf("."); + printf("%s", ref->components[cc].name); + } + + return 0; +} + +static int +asn1print_tag(asn1p_expr_t *tc, enum asn1print_flags_e flags) { + struct asn1p_type_tag_s *tag = &tc->tag; + + if(tag->tag_class == TC_NOCLASS) + return 0; + + printf("["); + switch(tag->tag_class) { + case TC_NOCLASS: + assert(tag->tag_class != TC_NOCLASS); + break; + case TC_UNIVERSAL: printf("UNIVERSAL "); break; + case TC_PRIVATE: printf("PRIVATE "); break; + case TC_APPLICATION: printf("APPLICATION "); break; + case TC_CONTEXT_SPECIFIC: + break; + } + printf("%lld]", (long long)tag->tag_value); + + switch(tag->tag_mode) { + case TM_DEFAULT: break; + case TM_IMPLICIT: printf(" IMPLICIT"); break; + case TM_EXPLICIT: printf(" EXPLICIT"); break; + } + + return 0; +} + +static int +asn1print_value(asn1p_value_t *val, enum asn1print_flags_e flags) { + + if(val == NULL) + return 0; + + switch(val->type) { + case ATV_NOVALUE: + break; + case ATV_REFERENCED: + return asn1print_ref(val->value.reference, flags); + case ATV_INTEGER: + printf("%lld", (long long)val->value.v_integer); + return 0; + case ATV_MIN: printf("MIN"); return 0; + case ATV_MAX: printf("MAX"); return 0; + case ATV_FALSE: printf("FALSE"); return 0; + case ATV_TRUE: printf("TRUE"); return 0; + case ATV_REAL: + printf("%f", val->value.v_double); + return 0; + case ATV_STRING: + { + char *p = val->value.string.buf; + putchar('"'); + if(strchr(p, '"')) { + /* Mask quotes */ + for(; *p; p++) { + if(*p == '"') + putchar(*p); + putchar(*p); + } + } else { + fputs(p, stdout); + } + putchar('"'); + } + return 0; + case ATV_UNPARSED: + fputs(val->value.string.buf, stdout); + return 0; + case ATV_BITVECTOR: + { + uint8_t *bitvector; + int bits; + int i; + + bitvector = val->value.binary_vector.bits; + bits = val->value.binary_vector.size_in_bits; + + printf("'"); + if(bits%8) { + for(i = 0; i < bits; i++) { + uint8_t uc; + uc = bitvector[i>>3]; + putchar(((uc >> (7-(i%8)))&1)?'1':'0'); + } + printf("'B"); + } else { + char hextable[16] = "0123456789ABCDEF"; + for(i = 0; i < (bits>>3); i++) { + putchar(hextable[bitvector[i] >> 4]); + putchar(hextable[bitvector[i] & 0x0f]); + } + printf("'H"); + } + } + } + + assert(val->type || !"Unknown"); + + return 0; +} + +static int +asn1print_constraint(asn1p_constraint_t *ct, enum asn1print_flags_e flags) { + int symno = 0; + + if(ct == 0) return 0; + + if(ct->type == ACT_CA_SET) + printf("("); + + switch(ct->type) { + case ACT_EL_VALUE: + asn1print_value(ct->value, flags); + break; + case ACT_EL_RANGE: + case ACT_EL_LLRANGE: + case ACT_EL_RLRANGE: + case ACT_EL_ULRANGE: + asn1print_value(ct->range_start, flags); + switch(ct->type) { + case ACT_EL_RANGE: printf(".."); break; + case ACT_EL_LLRANGE: printf("<.."); break; + case ACT_EL_RLRANGE: printf("..<"); break; + case ACT_EL_ULRANGE: printf("<..<"); break; + default: printf("?..?"); break; + } + asn1print_value(ct->range_stop, flags); + break; + case ACT_EL_EXT: + printf("..."); + break; + case ACT_CT_SIZE: + case ACT_CT_FROM: + switch(ct->type) { + case ACT_CT_SIZE: printf("SIZE ("); break; + case ACT_CT_FROM: printf("FROM ("); break; + default: printf("??? ("); break; + } + assert(ct->el_count != 0); + assert(ct->el_count == 1); + asn1print_constraint(ct->elements[0], flags); + printf(")"); + break; + case ACT_CT_WCOMP: + case ACT_CT_WCOMPS: + printf("???"); + break; + case ACT_CA_SET: symno++; + case ACT_CA_CRC: symno++; + case ACT_CA_CSV: symno++; + case ACT_CA_UNI: symno++; + case ACT_CA_INT: symno++; + case ACT_CA_EXC: + { + char *symtable[] = { " EXCEPT ", "^", "|", ",", + "", "(" }; + int i; + for(i = 0; i < ct->el_count; i++) { + enum asn1print_flags_e nflags = flags; + if(i) fputs(symtable[symno], stdout); + if(ct->type == ACT_CA_CRC) fputs("{", stdout); + asn1print_constraint(ct->elements[i], nflags); + if(ct->type == ACT_CA_CRC) fputs("}", stdout); + if(i+1 < ct->el_count + && ct->type == ACT_CA_SET) + fputs(")", stdout); + } + } + break; + case ACT_INVALID: + assert(ct->type != ACT_INVALID); + break; + } + + if(ct->type == ACT_CA_SET) + printf(")"); + + return 0; +} + +static int +asn1print_params(asn1p_paramlist_t *pl, enum asn1print_flags_e flags) { + if(pl) { + int i; + printf("{"); + for(i = 0; i < pl->params_count; i++) { + if(i) printf(", "); + if(pl->params[i].governor) { + asn1print_ref(pl->params[i].governor, flags); + printf(":"); + } + printf("%s", pl->params[i].argument); + } + printf("}"); + } + + return 0; +} + +static int +asn1print_with_syntax(asn1p_wsyntx_t *wx, enum asn1print_flags_e flags) { + if(wx) { + asn1p_wsyntx_chunk_t *wc; + printf(" WITH SYNTAX {"); + TQ_FOR(wc, &(wx->chunks), next) { + if(wc->ref) { + asn1print_ref(wc->ref, flags); + } else { + fwrite(wc->buf, 1, wc->len, stdout); + } + } + printf("}\n"); + } + + return 0; +} + +static int +asn1print_expr(asn1p_expr_t *tc, enum asn1print_flags_e flags, int level) { + + if(flags & APF_LINE_COMMENTS) + INDENT("-- #line %d\n", tc->_lineno); + if(tc->Identifier) + INDENT("%s", tc->Identifier); + + if(tc->params) { + asn1print_params(tc->params, flags); + } + + if(tc->meta_type != AMT_VALUE + && tc->expr_type != A1TC_EXTENSIBLE) { + if(level) { + if(tc->Identifier) + printf("\t"); + } else { + printf(" ::="); + } + } + + if(tc->tag.tag_class) { + printf(" "); + asn1print_tag(tc, flags); + } + + switch(tc->expr_type) { + case A1TC_EXTENSIBLE: + if(tc->value) { + printf("!"); + asn1print_value(tc->value, flags); + } + break; + case A1TC_REFERENCE: + case A1TC_UNIVERVAL: + case A1TC_PARAMETRIZED: + break; + case A1TC_CLASSDEF: + printf(" CLASS"); + break; + case A1TC_CLASSFIELD: + /* Nothing to print here */ + break; + default: + { + char *p = ASN_EXPR_TYPE2STR(tc->expr_type); + printf(" %s", p?p:""); + } + break; + } + + if(tc->reference) { + printf(" "); + asn1print_ref(tc->reference, flags); + } + + /* + * Display the descendants (children) of the current type. + */ + if(TQ_FIRST(&(tc->members))) { + asn1p_expr_t *se; /* SubExpression */ + + if((tc->expr_type != ASN_CONSTR_SEQUENCE_OF + && tc->expr_type != ASN_CONSTR_SET_OF) + || TQ_FIRST(&(tc->members))->expr_type & ASN_CONSTR_MASK) + printf(" {\n"); + + TQ_FOR(se, &(tc->members), next) { + /* + * Print the expression as it were stand-alone type. + */ + asn1print_expr(se, flags, level + 4); + switch(se->marker) { + case EM_NOMARK: break; + case EM_OPTIONAL: printf(" OPTIONAL"); break; + case EM_DEFAULT: printf(" DEFAULT "); break; + } + if(TQ_NEXT(se, next)) { + printf(","); + INDENT("\n"); + } + } + + if((tc->expr_type != ASN_CONSTR_SEQUENCE_OF + && tc->expr_type != ASN_CONSTR_SET_OF) + || TQ_FIRST(&(tc->members))->expr_type & ASN_CONSTR_MASK) { + printf("\n"); + INDENT("}"); + } + } + + if(tc->with_syntax) + asn1print_with_syntax(tc->with_syntax, flags); + + if(tc->constraints) { + printf(" "); + asn1print_constraint(tc->constraints, flags); + } + if(tc->unique) { + printf(" UNIQUE"); + } + + if(tc->meta_type == AMT_VALUE + && tc->expr_type != A1TC_EXTENSIBLE) { + if(tc->expr_type == A1TC_UNIVERVAL) + printf("("); + else + printf(" ::= "); + asn1print_value(tc->value, flags); + if(tc->expr_type == A1TC_UNIVERVAL) + printf(")"); + } + + return 0; +} diff --git a/libasn1print/asn1print.h b/libasn1print/asn1print.h new file mode 100644 index 000000000..73875fb1c --- /dev/null +++ b/libasn1print/asn1print.h @@ -0,0 +1,16 @@ +#ifndef _ASN1PRINT_H_ +#define _ASN1PRINT_H_ + +enum asn1print_flags_e { + APF_NOFLAGS = 0x00, + APF_LINE_COMMENTS = 0x01, + APF_NO_SOURCE_COMMENTS = 0x02, +}; + +/* + * Print the contents of the parsed ASN.1 syntax tree. + */ +int asn1print(asn1p_t *asn, enum asn1print_flags_e flags); + + +#endif /* _ASN1PRINT_H_ */ diff --git a/ltconfig b/ltconfig new file mode 100755 index 000000000..bad848d61 --- /dev/null +++ b/ltconfig @@ -0,0 +1,3096 @@ +#! /bin/sh + +# ltconfig - Create a system-specific libtool. +# Copyright (C) 1996-1999 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program 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 +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A lot of this script is taken from autoconf-2.10. + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} +echo=echo +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec "$SHELL" "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null`} + case X$UNAME in + *-DOS) PATH_SEPARATOR=';' ;; + *) PATH_SEPARATOR=':' ;; + esac +fi + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string="`eval $cmd`") 2>/dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null; then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" != 'X\t' || + test "X`($echo "$echo_test_string") 2>/dev/null`" != X"$echo_test_string"; then + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for dir in $PATH /usr/ucb; do + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + test "X`($dir/echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + test "X`(print -r "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running ltconfig again with it. + ORIGINAL_CONFIG_SHELL="${CONFIG_SHELL-/bin/sh}" + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + echo='printf "%s\n"' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + test "X`($echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + # Cool, printf works + : + elif test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' && + test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + CONFIG_SHELL="$ORIGINAL_CONFIG_SHELL" + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL $0 --fallback-echo" + elif test "X`("$CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' && + test "X`("$CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + echo="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null; then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec "${ORIGINAL_CONFIG_SHELL}" "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# The name of this program. +progname=`$echo "X$0" | $Xsed -e 's%^.*/%%'` + +# Constants: +PROGRAM=ltconfig +PACKAGE=libtool +VERSION=1.3.4-freebsd-ports +TIMESTAMP=" (1.385.2.196 1999/12/07 21:47:57)" +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +rm="rm -f" + +help="Try \`$progname --help' for more information." + +# Global variables: +default_ofile=libtool +can_build_shared=yes +enable_shared=yes +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +enable_static=yes +enable_fast_install=yes +install_ltlibs=yes +release_suffix=yes +enable_dlopen=unknown +enable_win32_dll=no +ltmain= +silent= +srcdir= +ac_config_guess= +ac_config_sub= +host= +nonopt= +ofile="$default_ofile" +verify_host=yes +with_gcc=no +with_gnu_ld=no +need_locks=yes +ac_ext=c +objext=o +libext=a +exeext= +cache_file= + +old_AR="$AR" +old_CC="$CC" +old_CFLAGS="$CFLAGS" +old_CPPFLAGS="$CPPFLAGS" +old_LDFLAGS="$LDFLAGS" +old_LD="$LD" +old_LN_S="$LN_S" +old_LIBS="$LIBS" +old_NM="$NM" +old_RANLIB="$RANLIB" +old_DLLTOOL="$DLLTOOL" +old_OBJDUMP="$OBJDUMP" +old_AS="$AS" + +# Parse the command line options. +args= +prev= +for option +do + case "$option" in + -*=*) optarg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + eval "$prev=\$option" + prev= + continue + fi + + case "$option" in + --help) cat <&2 + echo "$help" 1>&2 + exit 1 + ;; + + *) + if test -z "$ltmain"; then + ltmain="$option" + elif test -z "$host"; then +# This generates an unnecessary warning for sparc-sun-solaris4.1.3_U1 +# if test -n "`echo $option| sed 's/[-a-z0-9.]//g'`"; then +# echo "$progname: warning \`$option' is not a valid host type" 1>&2 +# fi + host="$option" + else + echo "$progname: too many arguments" 1>&2 + echo "$help" 1>&2 + exit 1 + fi ;; + esac +done + +if test -z "$ltmain"; then + echo "$progname: you must specify a LTMAIN file" 1>&2 + echo "$help" 1>&2 + exit 1 +fi + +if test ! -f "$ltmain"; then + echo "$progname: \`$ltmain' does not exist" 1>&2 + echo "$help" 1>&2 + exit 1 +fi + +# Quote any args containing shell metacharacters. +ltconfig_args= +for arg +do + case "$arg" in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ltconfig_args="$ltconfig_args '$arg'" ;; + *) ltconfig_args="$ltconfig_args $arg" ;; + esac +done + +# A relevant subset of AC_INIT. + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 5 compiler messages saved in config.log +# 6 checking for... messages and results +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>>./config.log + +# NLS nuisances. +# Only set LANG and LC_ALL to C if already set. +# These must not be set unconditionally because not all systems understand +# e.g. LANG=C (notably SCO). +if test "X${LC_ALL+set}" = Xset; then LC_ALL=C; export LC_ALL; fi +if test "X${LANG+set}" = Xset; then LANG=C; export LANG; fi + +if test -n "$cache_file" && test -r "$cache_file"; then + echo "loading cache $cache_file within ltconfig" + . $cache_file +fi + +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + +if test -z "$srcdir"; then + # Assume the source directory is the same one as the path to LTMAIN. + srcdir=`$echo "X$ltmain" | $Xsed -e 's%/[^/]*$%%'` + test "$srcdir" = "$ltmain" && srcdir=. +fi + +trap "$rm conftest*; exit 1" 1 2 15 +if test "$verify_host" = yes; then + # Check for config.guess and config.sub. + ac_aux_dir= + for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/config.guess; then + ac_aux_dir=$ac_dir + break + fi + done + if test -z "$ac_aux_dir"; then + echo "$progname: cannot find config.guess in $srcdir $srcdir/.. $srcdir/../.." 1>&2 + echo "$help" 1>&2 + exit 1 + fi + ac_config_guess=$ac_aux_dir/config.guess + ac_config_sub=$ac_aux_dir/config.sub + + # Make sure we can run config.sub. + if $SHELL $ac_config_sub sun4 >/dev/null 2>&1; then : + else + echo "$progname: cannot run $ac_config_sub" 1>&2 + echo "$help" 1>&2 + exit 1 + fi + + echo $ac_n "checking host system type""... $ac_c" 1>&6 + + host_alias=$host + case "$host_alias" in + "") + if host_alias=`$SHELL $ac_config_guess`; then : + else + echo "$progname: cannot guess host type; you must specify one" 1>&2 + echo "$help" 1>&2 + exit 1 + fi ;; + esac + host=`$SHELL $ac_config_sub $host_alias` + echo "$ac_t$host" 1>&6 + + # Make sure the host verified. + test -z "$host" && exit 1 + +elif test -z "$host"; then + echo "$progname: you must specify a host type if you use \`--no-verify'" 1>&2 + echo "$help" 1>&2 + exit 1 +else + host_alias=$host +fi + +# Transform linux* to *-*-linux-gnu*, to support old configure scripts. +case "$host_os" in +linux-gnu*) ;; +linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` +esac + +host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +case "$host_os" in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR cru $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +# Set a sane default for `AR'. +test -z "$AR" && AR=ar + +# Set a sane default for `OBJDUMP'. +test -z "$OBJDUMP" && OBJDUMP=objdump + +# If RANLIB is not set, then run the test. +if test "${RANLIB+set}" != "set"; then + result=no + + echo $ac_n "checking for ranlib... $ac_c" 1>&6 + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/ranlib || test -f $dir/ranlib$ac_exeext; then + RANLIB="ranlib" + result="ranlib" + break + fi + done + IFS="$save_ifs" + + echo "$ac_t$result" 1>&6 +fi + +if test -n "$RANLIB"; then + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" +fi + +# Set sane defaults for `DLLTOOL', `OBJDUMP', and `AS', used on cygwin. +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$AS" && AS=as + +# Check to see if we are using GCC. +if test "$with_gcc" != yes || test -z "$CC"; then + # If CC is not set, then try to find GCC or a usable CC. + if test -z "$CC"; then + echo $ac_n "checking for gcc... $ac_c" 1>&6 + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/gcc || test -f $dir/gcc$ac_exeext; then + CC="gcc" + break + fi + done + IFS="$save_ifs" + + if test -n "$CC"; then + echo "$ac_t$CC" 1>&6 + else + echo "$ac_t"no 1>&6 + fi + fi + + # Not "gcc", so try "cc", rejecting "/usr/ucb/cc". + if test -z "$CC"; then + echo $ac_n "checking for cc... $ac_c" 1>&6 + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + cc_rejected=no + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/cc || test -f $dir/cc$ac_exeext; then + if test "$dir/cc" = "/usr/ucb/cc"; then + cc_rejected=yes + continue + fi + CC="cc" + break + fi + done + IFS="$save_ifs" + if test $cc_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same name, so the bogon will be chosen + # first if we set CC to just the name; use the full file name. + shift + set dummy "$dir/cc" "$@" + shift + CC="$@" + fi + fi + + if test -n "$CC"; then + echo "$ac_t$CC" 1>&6 + else + echo "$ac_t"no 1>&6 + fi + + if test -z "$CC"; then + echo "$progname: error: no acceptable cc found in \$PATH" 1>&2 + exit 1 + fi + fi + + # Now see if the compiler is really GCC. + with_gcc=no + echo $ac_n "checking whether we are using GNU C... $ac_c" 1>&6 + echo "$progname:581: checking whether we are using GNU C" >&5 + + $rm conftest.c + cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + with_gcc=yes + fi + $rm conftest.c + echo "$ac_t$with_gcc" 1>&6 +fi + +# Allow CC to be a program name with arguments. +set dummy $CC +compiler="$2" + +echo $ac_n "checking for object suffix... $ac_c" 1>&6 +$rm conftest* +echo 'int i = 1;' > conftest.c +echo "$progname:603: checking for object suffix" >& 5 +if { (eval echo $progname:604: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; }; then + # Append any warnings to the config.log. + cat conftest.err 1>&5 + + for ac_file in conftest.*; do + case $ac_file in + *.c) ;; + *) objext=`echo $ac_file | sed -e s/conftest.//` ;; + esac + done +else + cat conftest.err 1>&5 + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 +fi +$rm conftest* +echo "$ac_t$objext" 1>&6 + +echo $ac_n "checking for executable suffix... $ac_c" 1>&6 +if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_cv_exeext="no" + $rm conftest* + echo 'main () { return 0; }' > conftest.c + echo "$progname:629: checking for executable suffix" >& 5 + if { (eval echo $progname:630: \"$ac_link\") 1>&5; (eval $ac_link) 2>conftest.err; }; then + # Append any warnings to the config.log. + cat conftest.err 1>&5 + + for ac_file in conftest.*; do + case $ac_file in + *.c | *.err | *.$objext ) ;; + *) ac_cv_exeext=.`echo $ac_file | sed -e s/conftest.//` ;; + esac + done + else + cat conftest.err 1>&5 + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 + fi + $rm conftest* +fi +if test "X$ac_cv_exeext" = Xno; then + exeext="" +else + exeext="$ac_cv_exeext" +fi +echo "$ac_t$ac_cv_exeext" 1>&6 + +echo $ac_n "checking for $compiler option to produce PIC... $ac_c" 1>&6 +pic_flag= +special_shlib_compile_flags= +wl= +link_static_flag= +no_builtin_flag= + +if test "$with_gcc" = yes; then + wl='-Wl,' + link_static_flag='-static' + + case "$host_os" in + beos* | irix5* | irix6* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + aix*) + # Below there is a dirty hack to force normal static linking with -ldl + # The problem is because libdl dynamically linked with both libc and + # libC (AIX C++ library), which obviously doesn't included in libraries + # list by gcc. This cause undefined symbols with -static flags. + # This hack allows C programs to be linked with "-static -ldl", but + # we not sure about C++ programs. + link_static_flag="$link_static_flag ${wl}-lC" + ;; + cygwin* | mingw* | os2*) + # We can build DLLs from non-PIC. + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + pic_flag='-m68020 -resident32 -malways-restore-a4' + ;; + sysv4*MP*) + if test -d /usr/nec; then + pic_flag=-Kconform_pic + fi + ;; + *) + pic_flag='-fPIC' + ;; + esac +else + # PORTME Check for PIC flags for the system compiler. + case "$host_os" in + aix3* | aix4*) + # All AIX code is PIC. + link_static_flag='-bnso -bI:/lib/syscalls.exp' + ;; + + hpux9* | hpux10* | hpux11*) + # Is there a better link_static_flag that works with the bundled CC? + wl='-Wl,' + link_static_flag="${wl}-a ${wl}archive" + pic_flag='+Z' + ;; + + irix5* | irix6*) + wl='-Wl,' + link_static_flag='-non_shared' + # PIC (with -KPIC) is the default. + ;; + + cygwin* | mingw* | os2*) + # We can build DLLs from non-PIC. + ;; + + osf3* | osf4* | osf5*) + # All OSF/1 code is PIC. + wl='-Wl,' + link_static_flag='-non_shared' + ;; + + sco3.2v5*) + pic_flag='-Kpic' + link_static_flag='-dn' + special_shlib_compile_flags='-belf' + ;; + + solaris*) + pic_flag='-KPIC' + link_static_flag='-Bstatic' + wl='-Wl,' + ;; + + sunos4*) + pic_flag='-PIC' + link_static_flag='-Bstatic' + wl='-Qoption ld ' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + pic_flag='-KPIC' + link_static_flag='-Bstatic' + wl='-Wl,' + ;; + + uts4*) + pic_flag='-pic' + link_static_flag='-Bstatic' + ;; + sysv4*MP*) + if test -d /usr/nec ;then + pic_flag='-Kconform_pic' + link_static_flag='-Bstatic' + fi + ;; + *) + can_build_shared=no + ;; + esac +fi + +if test -n "$pic_flag"; then + echo "$ac_t$pic_flag" 1>&6 + + # Check to make sure the pic_flag actually works. + echo $ac_n "checking if $compiler PIC flag $pic_flag works... $ac_c" 1>&6 + $rm conftest* + echo "int some_variable = 0;" > conftest.c + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $pic_flag -DPIC" + echo "$progname:776: checking if $compiler PIC flag $pic_flag works" >&5 + if { (eval echo $progname:777: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.$objext; then + # Append any warnings to the config.log. + cat conftest.err 1>&5 + + case "$host_os" in + hpux9* | hpux10* | hpux11*) + # On HP-UX, both CC and GCC only warn that PIC is supported... then they + # create non-PIC objects. So, if there were any warnings, we assume that + # PIC is not supported. + if test -s conftest.err; then + echo "$ac_t"no 1>&6 + can_build_shared=no + pic_flag= + else + echo "$ac_t"yes 1>&6 + pic_flag=" $pic_flag" + fi + ;; + *) + echo "$ac_t"yes 1>&6 + pic_flag=" $pic_flag" + ;; + esac + else + # Append any errors to the config.log. + cat conftest.err 1>&5 + can_build_shared=no + pic_flag= + echo "$ac_t"no 1>&6 + fi + CFLAGS="$save_CFLAGS" + $rm conftest* +else + echo "$ac_t"none 1>&6 +fi + +# Check to see if options -o and -c are simultaneously supported by compiler +echo $ac_n "checking if $compiler supports -c -o file.o... $ac_c" 1>&6 +$rm -r conftest 2>/dev/null +mkdir conftest +cd conftest +$rm conftest* +echo "int some_variable = 0;" > conftest.c +mkdir out +# According to Tom Tromey, Ian Lance Taylor reported there are C compilers +# that will create temporary files in the current directory regardless of +# the output directory. Thus, making CWD read-only will cause this test +# to fail, enabling locking or at least warning the user not to do parallel +# builds. +chmod -w . +save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -o out/conftest2.o" +echo "$progname:829: checking if $compiler supports -c -o file.o" >&5 +if { (eval echo $progname:830: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.o; then + + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s out/conftest.err; then + echo "$ac_t"no 1>&6 + compiler_c_o=no + else + echo "$ac_t"yes 1>&6 + compiler_c_o=yes + fi +else + # Append any errors to the config.log. + cat out/conftest.err 1>&5 + compiler_c_o=no + echo "$ac_t"no 1>&6 +fi +CFLAGS="$save_CFLAGS" +chmod u+w . +$rm conftest* out/* +rmdir out +cd .. +rmdir conftest +$rm -r conftest 2>/dev/null + +if test x"$compiler_c_o" = x"yes"; then + # Check to see if we can write to a .lo + echo $ac_n "checking if $compiler supports -c -o file.lo... $ac_c" 1>&6 + $rm conftest* + echo "int some_variable = 0;" > conftest.c + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -c -o conftest.lo" + echo "$progname:862: checking if $compiler supports -c -o file.lo" >&5 +if { (eval echo $progname:863: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.lo; then + + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + echo "$ac_t"no 1>&6 + compiler_o_lo=no + else + echo "$ac_t"yes 1>&6 + compiler_o_lo=yes + fi + else + # Append any errors to the config.log. + cat conftest.err 1>&5 + compiler_o_lo=no + echo "$ac_t"no 1>&6 + fi + CFLAGS="$save_CFLAGS" + $rm conftest* +else + compiler_o_lo=no +fi + +# Check to see if we can do hard links to lock some files if needed +hard_links="nottested" +if test "$compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo $ac_n "checking if we can lock with hard links... $ac_c" 1>&6 + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + echo "$ac_t$hard_links" 1>&6 + $rm conftest* + if test "$hard_links" = no; then + echo "*** WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2 + need_locks=warn + fi +else + need_locks=no +fi + +if test "$with_gcc" = yes; then + # Check to see if options -fno-rtti -fno-exceptions are supported by compiler + echo $ac_n "checking if $compiler supports -fno-rtti -fno-exceptions ... $ac_c" 1>&6 + $rm conftest* + echo "int some_variable = 0;" > conftest.c + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.c" + echo "$progname:914: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 + if { (eval echo $progname:915: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.o; then + + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + echo "$ac_t"no 1>&6 + compiler_rtti_exceptions=no + else + echo "$ac_t"yes 1>&6 + compiler_rtti_exceptions=yes + fi + else + # Append any errors to the config.log. + cat conftest.err 1>&5 + compiler_rtti_exceptions=no + echo "$ac_t"no 1>&6 + fi + CFLAGS="$save_CFLAGS" + $rm conftest* + + if test "$compiler_rtti_exceptions" = "yes"; then + no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' + else + no_builtin_flag=' -fno-builtin' + fi + +fi + +# Check for any special shared library compilation flags. +if test -n "$special_shlib_compile_flags"; then + echo "$progname: warning: \`$CC' requires \`$special_shlib_compile_flags' to build shared libraries" 1>&2 + if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$special_shlib_compile_flags[ ]" >/dev/null; then : + else + echo "$progname: add \`$special_shlib_compile_flags' to the CC or CFLAGS env variable and reconfigure" 1>&2 + can_build_shared=no + fi +fi + +echo $ac_n "checking if $compiler static flag $link_static_flag works... $ac_c" 1>&6 +$rm conftest* +echo 'main(){return(0);}' > conftest.c +save_LDFLAGS="$LDFLAGS" +LDFLAGS="$LDFLAGS $link_static_flag" +echo "$progname:958: checking if $compiler static flag $link_static_flag works" >&5 +if { (eval echo $progname:959: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + echo "$ac_t$link_static_flag" 1>&6 +else + echo "$ac_t"none 1>&6 + link_static_flag= +fi +LDFLAGS="$save_LDFLAGS" +$rm conftest* + +if test -z "$LN_S"; then + # Check to see if we can use ln -s, or we need hard links. + echo $ac_n "checking whether ln -s works... $ac_c" 1>&6 + $rm conftest.dat + if ln -s X conftest.dat 2>/dev/null; then + $rm conftest.dat + LN_S="ln -sf" + else + LN_S=ln + fi + if test "$LN_S" = "ln -sf"; then + echo "$ac_t"yes 1>&6 + else + echo "$ac_t"no 1>&6 + fi +fi + +# Make sure LD is an absolute path. +if test -z "$LD"; then + ac_prog=ld + if test "$with_gcc" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo $ac_n "checking for ld used by GCC... $ac_c" 1>&6 + echo "$progname:991: checking for ld used by GCC" >&5 + ac_prog=`($CC -print-prog-name=ld) 2>&5` + case "$ac_prog" in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we are not using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac + elif test "$with_gnu_ld" = yes; then + echo $ac_n "checking for GNU ld... $ac_c" 1>&6 + echo "$progname:1015: checking for GNU ld" >&5 + else + echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 + echo "$progname:1018: checking for non-GNU ld" >&5 + fi + + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" + fi + + if test -n "$LD"; then + echo "$ac_t$LD" 1>&6 + else + echo "$ac_t"no 1>&6 + fi + + if test -z "$LD"; then + echo "$progname: error: no acceptable ld found in \$PATH" 1>&2 + exit 1 + fi +fi + +# Check to see if it really is or is not GNU ld. +echo $ac_n "checking if the linker ($LD) is GNU ld... $ac_c" 1>&6 +# I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + with_gnu_ld=yes +else + with_gnu_ld=no +fi +echo "$ac_t$with_gnu_ld" 1>&6 + +# See if the linker supports building shared libraries. +echo $ac_n "checking whether the linker ($LD) supports shared libraries... $ac_c" 1>&6 + +allow_undefined_flag= +no_undefined_flag= +need_lib_prefix=unknown +need_version=unknown +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +archive_cmds= +archive_expsym_cmds= +old_archive_from_new_cmds= +export_dynamic_flag_spec= +whole_archive_flag_spec= +thread_safe_flag_spec= +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no +hardcode_shlibpath_var=unsupported +runpath_var= +always_export_symbols=no +export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' +# include_expsyms should be a list of space-separated symbols to be *always* +# included in the symbol list +include_expsyms= +# exclude_expsyms can be an egrep regular expression of symbols to exclude +# it will be wrapped by ` (' and `)$', so one must not match beginning or +# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', +# as well as any symbol that contains `d'. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_" +# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out +# platforms (ab)use it in PIC code, but their linkers get confused if +# the symbol is explicitly referenced. Since portable code cannot +# rely on this symbol name, it's probably fine to never include it in +# preloaded symbol tables. + +case "$host_os" in +cygwin* | mingw*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$with_gcc" != yes; then + with_gnu_ld=no + fi + ;; + +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case "$host_os" in + aix3* | aix4*) + # On AIX, the GNU linker is very broken + ld_shlibs=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + ;; + + amigaos*) + archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can use + # them. + ld_shlibs=no + ;; + + beos*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=yes + + # Extract the symbol export list from an `--export-all' def file, + # then regenerate the def file from the symbol export list, so that + # the compiled dll only exports the symbol export list. + export_symbols_cmds='test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~ + test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~ + $DLLTOOL --export-all --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --output-def $objdir/$soname-def $objdir/$soname-ltdll.$objext $libobjs $convenience~ + sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]* ; *//" < $objdir/$soname-def > $export_symbols' + + archive_expsym_cmds='echo EXPORTS > $objdir/$soname-def~ + _lt_hint=1; + for symbol in `cat $export_symbols`; do + echo " \$symbol @ \$_lt_hint ; " >> $objdir/$soname-def; + _lt_hint=`expr 1 + \$_lt_hint`; + done~ + test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~ + test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~ + $CC -Wl,--base-file,$objdir/$soname-base -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~ + $CC -Wl,--base-file,$objdir/$soname-base $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~ + $CC $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts' + + old_archive_from_new_cmds='$DLLTOOL --as=$AS --dllname $soname --def $objdir/$soname-def --output-lib $objdir/$libname.a' + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + archive_cmds='$LD -Bshareable $libobjs $deplibs $linkopts -o $lib' + # can we support soname and/or expsyms with a.out? -oliva + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linkopts' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $compile_rpath $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $compile_rpath $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + case $host_os in + cygwin* | mingw*) + # dlltool doesn't understand --whole-archive et. al. + whole_archive_flag_spec= + ;; + *) + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + ;; + esac + fi +else + # PORTME fill in a description of your system's linker (not GNU ld) + case "$host_os" in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $objdir/$soname $libobjs $deplibs $linkopts -bE:$export_symbols -T512 -H512 -bM:SRE~$AR cru $lib $objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$with_gcc" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix4*) + hardcode_libdir_flag_spec='${wl}-b ${wl}nolibpath ${wl}-b ${wl}libpath:$libdir:/usr/lib:/lib' + hardcode_libdir_separator=':' + if test "$with_gcc" = yes; then + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + shared_flag='-shared' + else + shared_flag='${wl}-bM:SRE' + hardcode_direct=yes + fi + allow_undefined_flag=' ${wl}-berok' + archive_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bexpall ${wl}-bnoentry${allow_undefined_flag}' + archive_expsym_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}' + case "$host_os" in aix4.[01]|aix4.[01].*) + # According to Greg Wooledge, -bexpall is only supported from AIX 4.2 on + always_export_symbols=yes ;; + esac + ;; + + amigaos*) + archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + cygwin* | mingw*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $linkopts `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib /OUT:$oldlib$oldobjs' + fix_srcfile_path='`cygpath -w $srcfile`' + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + hpux9* | hpux10* | hpux11*) + case "$host_os" in + hpux9*) archive_cmds='$rm $objdir/$soname~$LD -b +b $install_libdir -o $objdir/$soname $libobjs $deplibs $linkopts~test $objdir/$soname = $lib || mv $objdir/$soname $lib' ;; + *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linkopts' ;; + esac + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_minus_L=yes # Not in the search PATH, but as the default + # location of the library. + export_dynamic_flag_spec='${wl}-E' + ;; + + irix5* | irix6*) + if test "$with_gcc" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + archive_cmds='$LD -shared $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linkopts' # ELF + fi + hardcode_libdir_flag_spec='${wl}-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + openbsd*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $objdir/$libname.def~$echo DATA >> $objdir/$libname.def~$echo " SINGLE NONSHARED" >> $objdir/$libname.def~$echo EXPORTS >> $objdir/$libname.def~emxexp $libobjs >> $objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $linkopts $objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $objdir/$libname.a $objdir/$libname.def' + ;; + + osf3*) + if test "$with_gcc" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # As osf3* with the addition of the -msym flag + if test "$with_gcc" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + sco3.2v5*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case "$host_os" in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv5*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp' + hardcode_libdir_flag_spec= + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linkopts' + hardcode_direct=yes + hardcode_minus_L=no + hardcode_shlibpath_var=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + unixware7*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac +fi +echo "$ac_t$ld_shlibs" 1>&6 +test "$ld_shlibs" = no && can_build_shared=no + +if test -z "$NM"; then + echo $ac_n "checking for BSD-compatible nm... $ac_c" 1>&6 + case "$NM" in + [\\/]* | [A-Za-z]:[\\/]*) ;; # Let the user override the test with a path. + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for ac_dir in $PATH /usr/ucb /usr/ccs/bin /bin; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + NM="$ac_dir/nm -B" + break + elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + NM="$ac_dir/nm -p" + break + else + NM=${NM="$ac_dir/nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + fi + fi + done + IFS="$ac_save_ifs" + test -z "$NM" && NM=nm + ;; + esac + echo "$ac_t$NM" 1>&6 +fi + +# Check for command to grab the raw symbol name followed by C symbol from nm. +echo $ac_n "checking command to parse $NM output... $ac_c" 1>&6 + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" + +# Define system-specific variables. +case "$host_os" in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw*) + symcode='[ABCDGISTW]' + ;; +hpux*) # Its linker distinguishes data from code symbols + global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'" + ;; +irix*) + symcode='[BCDEGRST]' + ;; +solaris*) + symcode='[BDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then + symcode='[ABCDGISTW]' +fi + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode\)[ ][ ]*\($ac_symprfx\)$sympat$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + $rm conftest* + cat > conftest.c <&5 + if { (eval echo $progname:1636: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.$objext; then + # Now try to grab the symbols. + nlist=conftest.nm + if { echo "$progname:1639: eval \"$NM conftest.$objext | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.$objext | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then + + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if egrep ' nm_test_var$' "$nlist" >/dev/null; then + if egrep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.c +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$global_symbol_to_cdecl"' < "$nlist" >> conftest.c' + + cat <> conftest.c +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{ +EOF + sed 's/^. \(.*\) \(.*\)$/ {"\2", (lt_ptr_t) \&\2},/' < "$nlist" >> conftest.c + cat <<\EOF >> conftest.c + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$objext conftstm.$objext + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="conftstm.$objext" + CFLAGS="$CFLAGS$no_builtin_flag" + if { (eval echo $progname:1691: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + pipe_works=yes + else + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 + fi + LIBS="$save_LIBS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 + fi + $rm conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + global_symbol_pipe= + fi +done +if test "$pipe_works" = yes; then + echo "${ac_t}ok" 1>&6 +else + echo "${ac_t}failed" 1>&6 +fi + +if test -z "$global_symbol_pipe"; then + global_symbol_to_cdecl= +fi + +# Check hardcoding attributes. +echo $ac_n "checking how to hardcode library paths into programs... $ac_c" 1>&6 +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var"; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$hardcode_shlibpath_var" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +echo "$ac_t$hardcode_action" 1>&6 + + +reload_flag= +reload_cmds='$LD$reload_flag -o $output$reload_objs' +echo $ac_n "checking for $LD option to reload object files... $ac_c" 1>&6 +# PORTME Some linkers may need a different reload flag. +reload_flag='-r' +echo "$ac_t$reload_flag" 1>&6 +test -n "$reload_flag" && reload_flag=" $reload_flag" + +# PORTME Fill in your ld.so characteristics +library_names_spec= +libname_spec='lib$name' +soname_spec= +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +sys_lib_search_path_spec="/lib /usr/lib" +file_magic_cmd= +file_magic_test_file= +deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [regex]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given egrep regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. +echo $ac_n "checking dynamic linker characteristics... $ac_c" 1>&6 +case "$host_os" in +aix3*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}.so$major' + ;; + +aix4*) + version_type=linux + # AIX has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + # We preserve .a as extension for shared libraries though AIX4.2 + # and later linker supports .so + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.a' + shlibpath_var=LIBPATH + deplibs_check_method=pass_all + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}.so' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + deplibs_check_method=pass_all + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + file_magic_cmd=/usr/bin/file + file_magic_test_file=/shlib/libc.so + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + export_dynamic_flag_spec=-rdynamic + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw*) + version_type=windows + need_version=no + need_lib_prefix=no + if test "$with_gcc" = yes; then + library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.a' + else + library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib' + fi + dynamic_linker='Win32 ld.exe' + deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + file_magic_cmd='${OBJDUMP} -f' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case "$version_type" in + freebsd-elf*) + deplibs_check_method='file_magic (ELF [0-9][0-9]*-bit [LM]SB shared object|current ar archive)' + ;; + freebsd-*) + deplibs_check_method='file_magic FreeBSD.* shared library' + ;; + esac + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /usr/lib/libc.so.*` + if test "$release_suffix" = all; then + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so' + else + library_names_spec='${libname}${release}.so$versuffix ${libname}.so' + fi + need_version=no + need_lib_prefix=no + finish_cmds='/usr/bin/env OBJFORMAT="'"$objformat"'" /sbin/ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + case "$host_os" in + freebsd2* | freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + dynamic_linker="$host_os dld.sl" + version_type=sunos + need_lib_prefix=no + need_version=no + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' + soname_spec='${libname}${release}.sl$major' + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6*) + version_type=irix + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}.so.$major' + library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major ${libname}${release}.so $libname.so' + case "$host_os" in + irix5*) + libsuff= shlibsuff= + # this will be overridden with pass_all, but let us keep it just in case + deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" + ;; + *) + case "$LD" in # libtool.m4 will add one of these switches to LD + *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /lib${libsuff}/libc.so*` + deplibs_check_method='pass_all' + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux-gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + + if test -f /lib/ld.so.1; then + dynamic_linker='GNU ld.so' + else + # Only the GNU ld.so supports shared libraries on MkLinux. + case "$host_cpu" in + powerpc*) dynamic_linker=no ;; + *) dynamic_linker='Linux ld.so' ;; + esac + fi + ;; + +netbsd*) + version_type=sunos + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' + soname_spec='${libname}${release}.so$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + ;; + +openbsd*) + version_type=sunos + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + need_version=no + fi + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + ;; + +os2*) + libname_spec='$name' + need_lib_prefix=no + library_names_spec='$libname.dll $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_version=no + soname_spec='${libname}${release}.so' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + shlibpath_var=LD_LIBRARY_PATH + # this will be overridden with pass_all, but let us keep it just in case + deplibs_check_method='file_magic COFF format alpha shared library' + file_magic_cmd=/usr/bin/file + file_magic_test_file=/shlib/libc.so + deplibs_check_method='pass_all' + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + deplibs_check_method="file_magic ELF [0-9][0-9]-bit [LM]SB dynamic lib" + file_magic_cmd=/usr/bin/file + file_magic_test_file=/lib/libc.so + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + case "$host_vendor" in + ncr) + deplibs_check_method='pass_all' + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + esac + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' + soname_spec='$libname.so.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +*) + dynamic_linker=no + ;; +esac +echo "$ac_t$dynamic_linker" 1>&6 +test "$dynamic_linker" = no && can_build_shared=no + +# Report the final consequences. +echo "checking if libtool supports shared libraries... $can_build_shared" 1>&6 + +# Only try to build win32 dlls if AC_LIBTOOL_WIN32_DLL was used in +# configure.in, otherwise build static only libraries. +case "$host_os" in +cygwin* | mingw* | os2*) + if test x$can_build_shared = xyes; then + test x$enable_win32_dll = xno && can_build_shared=no + echo "checking if package supports dlls... $can_build_shared" 1>&6 + fi +;; +esac + +if test -n "$file_magic_test_file" && test -n "$file_magic_cmd"; then + case "$deplibs_check_method" in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + egrep "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac +fi + +echo $ac_n "checking whether to build shared libraries... $ac_c" 1>&6 +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4*) + test "$enable_shared" = yes && enable_static=no + ;; +esac + +echo "$ac_t$enable_shared" 1>&6 + +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes + +echo "checking whether to build static libraries... $enable_static" 1>&6 + +if test "$hardcode_action" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +echo $ac_n "checking for objdir... $ac_c" 1>&6 +rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + objdir=_libs +fi +rmdir .libs 2>/dev/null +echo "$ac_t$objdir" 1>&6 + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else +if eval "test \"`echo '$''{'lt_cv_dlopen'+set}'`\" != set"; then + lt_cv_dlopen=no lt_cv_dlopen_libs= +echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 +echo "$progname:2212: checking for dlopen in -ldl" >&5 +ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldl $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for dlopen""... $ac_c" 1>&6 +echo "$progname:2252: checking for dlopen" >&5 +if eval "test \"`echo '$''{'ac_cv_func_dlopen'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_dlopen) || defined (__stub___dlopen) +choke me +#else +dlopen(); +#endif + +; return 0; } +EOF +if { (eval echo $progname:2282: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_dlopen=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_dlopen=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_func_'dlopen`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="dlopen" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for dld_link in -ldld""... $ac_c" 1>&6 +echo "$progname:2299: checking for dld_link in -ldld" >&5 +ac_lib_var=`echo dld'_'dld_link | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldld $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for shl_load""... $ac_c" 1>&6 +echo "$progname:2339: checking for shl_load" >&5 +if eval "test \"`echo '$''{'ac_cv_func_shl_load'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_shl_load) || defined (__stub___shl_load) +choke me +#else +shl_load(); +#endif + +; return 0; } +EOF +if { (eval echo $progname:2369: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_shl_load=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_shl_load=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'shl_load`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="shl_load" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6 +echo "$progname:2387: checking for shl_load in -ldld" >&5 +ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldld $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + echo "$ac_t""no" 1>&6 +fi + + +fi + + +fi + + +fi + + +fi + +fi + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + fi + + case "$lt_cv_dlopen" in + dlopen) +for ac_hdr in dlfcn.h; do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "$progname:2452: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +int fnord = 0; +EOF +ac_try="$ac_compile >/dev/null 2>conftest.out" +{ (eval echo $progname:2462: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi +done + + if test "x$ac_cv_header_dlfcn_h" = xyes; then + CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + fi + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + LIBS="$lt_cv_dlopen_libs $LIBS" + + echo $ac_n "checking whether a program can dlopen itself""... $ac_c" 1>&6 +echo "$progname:2490: checking whether a program can dlopen itself" >&5 +if test "${lt_cv_dlopen_self+set}" = set; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + lt_cv_dlopen_self=cross + else + cat > conftest.c < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LTDL_GLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LTDL_GLOBAL DL_GLOBAL +# else +# define LTDL_GLOBAL 0 +# endif +#endif + +/* We may have to define LTDL_LAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LTDL_LAZY_OR_NOW +# ifdef RTLD_LAZY +# define LTDL_LAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LTDL_LAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LTDL_LAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LTDL_LAZY_OR_NOW DL_NOW +# else +# define LTDL_LAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +fnord() { int i=42;} +main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW); + if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); + if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } + +EOF +if { (eval echo $progname:2544: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +then + lt_cv_dlopen_self=yes +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + lt_cv_dlopen_self=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$lt_cv_dlopen_self" 1>&6 + + if test "$lt_cv_dlopen_self" = yes; then + LDFLAGS="$LDFLAGS $link_static_flag" + echo $ac_n "checking whether a statically linked program can dlopen itself""... $ac_c" 1>&6 +echo "$progname:2563: checking whether a statically linked program can dlopen itself" >&5 +if test "${lt_cv_dlopen_self_static+set}" = set; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + lt_cv_dlopen_self_static=cross + else + cat > conftest.c < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LTDL_GLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LTDL_GLOBAL DL_GLOBAL +# else +# define LTDL_GLOBAL 0 +# endif +#endif + +/* We may have to define LTDL_LAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LTDL_LAZY_OR_NOW +# ifdef RTLD_LAZY +# define LTDL_LAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LTDL_LAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LTDL_LAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LTDL_LAZY_OR_NOW DL_NOW +# else +# define LTDL_LAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +fnord() { int i=42;} +main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW); + if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); + if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } + +EOF +if { (eval echo $progname:2617: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +then + lt_cv_dlopen_self_static=yes +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + lt_cv_dlopen_self_static=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$lt_cv_dlopen_self_static" 1>&6 +fi + ;; + esac + + case "$lt_cv_dlopen_self" in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case "$lt_cv_dlopen_self_static" in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + +# Copy echo and quote the copy, instead of the original, because it is +# used later. +ltecho="$echo" +if test "X$ltecho" = "X$CONFIG_SHELL $0 --fallback-echo"; then + ltecho="$CONFIG_SHELL \$0 --fallback-echo" +fi +LTSHELL="$SHELL" + +LTCONFIG_VERSION="$VERSION" + +# Only quote variables if we're using ltmain.sh. +case "$ltmain" in +*.sh) + # Now quote all the things that may contain metacharacters. + for var in ltecho old_CC old_CFLAGS old_CPPFLAGS \ + old_LD old_LDFLAGS old_LIBS \ + old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS \ + AR CC LD LN_S NM LTSHELL LTCONFIG_VERSION \ + reload_flag reload_cmds wl \ + pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \ + thread_safe_flag_spec whole_archive_flag_spec libname_spec \ + library_names_spec soname_spec \ + RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \ + old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds postuninstall_cmds \ + file_magic_cmd export_symbols_cmds deplibs_check_method allow_undefined_flag no_undefined_flag \ + finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \ + hardcode_libdir_flag_spec hardcode_libdir_separator \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do + + case "$var" in + reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + export_symbols_cmds | archive_cmds | archive_expsym_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case "$ltecho" in + *'\$0 --fallback-echo"') + ltecho=`$echo "X$ltecho" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + + trap "$rm \"$ofile\"; exit 1" 1 2 15 + echo "creating $ofile" + $rm "$ofile" + cat < "$ofile" +#! $SHELL + +# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltconfig or ltmain.sh. +# +# Copyright (C) 1996-1999 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program 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 +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="sed -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +### BEGIN LIBTOOL CONFIG +EOF + cfgfile="$ofile" + ;; + +*) + # Double-quote the variables that need it (for aesthetics). + for var in old_CC old_CFLAGS old_CPPFLAGS \ + old_LD old_LDFLAGS old_LIBS \ + old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS; do + eval "$var=\\\"\$var\\\"" + done + + # Just create a config file. + cfgfile="$ofile.cfg" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + echo "creating $cfgfile" + $rm "$cfgfile" + cat < "$cfgfile" +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Libtool configuration file. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +EOF + ;; +esac + +cat <> "$cfgfile" +# Libtool was configured as follows, on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# +# CC=$old_CC CFLAGS=$old_CFLAGS CPPFLAGS=$old_CPPFLAGS \\ +# LD=$old_LD LDFLAGS=$old_LDFLAGS LIBS=$old_LIBS \\ +# NM=$old_NM RANLIB=$old_RANLIB LN_S=$old_LN_S \\ +# DLLTOOL=$old_DLLTOOL OBJDUMP=$old_OBJDUMP AS=$old_AS \\ +# $0$ltconfig_args +# +# Compiler and other test output produced by $progname, useful for +# debugging $progname, is in ./config.log if it exists. + +# The version of $progname that generated this script. +LTCONFIG_VERSION=$LTCONFIG_VERSION + +# Shell to use when invoking shell scripts. +SHELL=$LTSHELL + +# Whether to waste disk space. +install_ltlibs=$install_ltlibs + +# What to do with -release. +# yes - only for shared archive +# no - ingnore +# all - for all archives +release_suffix=$release_suffix + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$ltecho + +# The archiver. +AR=$AR + +# The default C compiler. +CC=$CC + +# The linker used to build libraries. +LD=$LD + +# Whether we need hard or soft links. +LN_S=$LN_S + +# A BSD-compatible nm program. +NM=$NM + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$reload_flag +reload_cmds=$reload_cmds + +# How to pass a linker flag through the compiler. +wl=$wl + +# Object file suffix (normally "o"). +objext="$objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$pic_flag + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$compiler_c_o + +# Can we write directly to a .lo ? +compiler_o_lo=$compiler_o_lo + +# Must we lock files when doing compilation ? +need_locks=$need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$link_static_flag + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$no_builtin_flag + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$whole_archive_flag_spec + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$thread_safe_flag_spec + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$RANLIB +old_archive_cmds=$old_archive_cmds +old_postinstall_cmds=$old_postinstall_cmds +old_postuninstall_cmds=$old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$old_archive_from_new_cmds + +# Commands used to build and install a shared archive. +archive_cmds=$archive_cmds +archive_expsym_cmds=$archive_expsym_cmds +postinstall_cmds=$postinstall_cmds +postuninstall_cmds=$postuninstall_cmds + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$allow_undefined_flag + +# Flag that forces no undefined symbols. +no_undefined_flag=$no_undefined_flag + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$global_symbol_to_cdecl + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$hardcode_libdir_flag_spec + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$hardcode_libdir_separator + +# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$include_expsyms + +EOF + +case "$ltmain" in +*.sh) + echo '### END LIBTOOL CONFIG' >> "$ofile" + echo >> "$ofile" + case "$host_os" in + aix3*) + cat <<\EOF >> "$ofile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # Append the ltmain.sh script. + sed '$q' "$ltmain" >> "$ofile" || (rm -f "$ofile"; exit 1) + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + + chmod +x "$ofile" + ;; + +*) + # Compile the libtool program. + echo "FIXME: would compile $ltmain" + ;; +esac + +test -n "$cache_file" || exit 0 + +# AC_CACHE_SAVE +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +exit 0 + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/ltmain.sh b/ltmain.sh new file mode 100644 index 000000000..ebeb20d2d --- /dev/null +++ b/ltmain.sh @@ -0,0 +1,4122 @@ +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun ltconfig. +# +# Copyright (C) 1996-1999 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program 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 +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +EXPR_COMPAT=1 +export EXPR_COMPAT + +# Check that we have a working $echo. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 +fi + +if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + echo "$modename: not configured to build any kind of library" 1>&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" + +# Parse our command line options once, thoroughly. +while test $# -gt 0 +do + arg="$1" + shift + + case "$arg" in + -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case "$prev" in + execute_dlfiles) + eval "$prev=\"\$$prev \$arg\"" + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case "$arg" in + --help) + show_help=yes + ;; + + --version) + echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" + exit 0 + ;; + + --config) + sed -e '1,/^### BEGIN LIBTOOL CONFIG/d' -e '/^### END LIBTOOL CONFIG/,$d' $0 + exit 0 + ;; + + --debug) + echo "$progname: enabling shell trace mode" + set -x + ;; + + --dry-run | -n) + run=: + ;; + + --features) + echo "host: $host" + if test "$build_libtool_libs" = yes; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + exit 0 + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --quiet | --silent) + show=: + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 +fi + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + case "$nonopt" in + *cc | *++ | gcc* | *-gcc*) + mode=link + for arg + do + case "$arg" in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + mode=execute + ;; + *install*|cp|mv) + mode=install + ;; + *rm) + mode=uninstall + ;; + *) + # If we have no mode, but dlfiles were specified, then do execute mode. + test -n "$execute_dlfiles" && mode=execute + + # Just use the default operation mode. + if test -z "$mode"; then + if test -n "$nonopt"; then + $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 + else + $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 + fi + fi + ;; + esac + fi + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." + + # These modes are in order of execution frequency so that they run quickly. + case "$mode" in + # libtool compile mode + compile) + modename="$modename: compile" + # Get the compilation command and the source file. + base_compile= + lastarg= + srcfile="$nonopt" + suppress_output= + + user_target=no + for arg + do + # Accept any command-line options. + case "$arg" in + -o) + if test "$user_target" != "no"; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit 1 + fi + user_target=next + ;; + + -static) + build_old_libs=yes + continue + ;; + esac + + case "$user_target" in + next) + # The next one is the -o target name + user_target=yes + continue + ;; + yes) + # We got the output file + user_target=set + libobj="$arg" + continue + ;; + esac + + # Accept the current argument as the source file. + lastarg="$srcfile" + srcfile="$arg" + + # Aesthetically quote the previous argument. + + # Backslashify any backslashes, double quotes, and dollar signs. + # These are the only characters that are still specially + # interpreted inside of double-quoted scrings. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly in scan + # sets, so we specify it separately. + case "$lastarg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + lastarg="\"$lastarg\"" + ;; + esac + + # Add the previous argument to base_compile. + if test -z "$base_compile"; then + base_compile="$lastarg" + else + base_compile="$base_compile $lastarg" + fi + done + + case "$user_target" in + set) + ;; + no) + # Get the name of the library object. + libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + *) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit 1 + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSfmso]' + case "$libobj" in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.f90) xform=f90 ;; + *.for) xform=for ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case "$libobj" in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit 1 + ;; + esac + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $libobj" + else + removelist="$libobj" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit 1" 1 2 15 + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\..*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit 1" 1 2 15 + else + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until ln "$0" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + echo "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit 1 + fi + echo $srcfile > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + # All platforms use -DPIC, to notify preprocessed assembler code. + command="$base_compile $srcfile $pic_flag -DPIC" + if test "$build_old_libs" = yes; then + lo_libobj="$libobj" + dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$libobj"; then + dir="$objdir" + else + dir="$dir/$objdir" + fi + libobj="$dir/"`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` + + if test -d "$dir"; then + $show "$rm $libobj" + $run $rm $libobj + else + $show "$mkdir $dir" + $run $mkdir $dir + status=$? + if test $status -ne 0 && test ! -d $dir; then + exit $status + fi + fi + fi + if test "$compiler_o_lo" = yes; then + output_obj="$libobj" + command="$command -o $output_obj" + elif test "$compiler_c_o" = yes; then + output_obj="$obj" + command="$command -o $output_obj" + fi + + $run $rm "$output_obj" + $show "$command" + if $run eval "$command"; then : + else + test -n "$output_obj" && $run $rm $removelist + exit 1 + fi + + if test "$need_locks" = warn && + test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then + echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit 1 + fi + + # Just move the object if needed, then go on to compile the next one + if test x"$output_obj" != x"$libobj"; then + $show "$mv $output_obj $libobj" + if $run $mv $output_obj $libobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # If we have no pic_flag, then copy the object into place and finish. + if test -z "$pic_flag" && test "$build_old_libs" = yes; then + # Rename the .lo from within objdir to obj + if test -f $obj; then + $show $rm $obj + $run $rm $obj + fi + + $show "$mv $libobj $obj" + if $run $mv $libobj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir="." + else + xdir="$xdir" + fi + baseobj=`$echo "X$obj" | $Xsed -e "s%.*/%%"` + libobj=`$echo "X$baseobj" | $Xsed -e "$o2lo"` + # Now arrange that obj and lo_libobj become the same file + $show "(cd $xdir && $LN_S $baseobj $libobj)" + if $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then + exit 0 + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Allow error messages only from the first compilation. + suppress_output=' >/dev/null 2>&1' + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + command="$base_compile $srcfile" + if test "$compiler_c_o" = yes; then + command="$command -o $obj" + output_obj="$obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + command="$command$suppress_output" + $run $rm "$output_obj" + $show "$command" + if $run eval "$command"; then : + else + $run $rm $removelist + exit 1 + fi + + if test "$need_locks" = warn && + test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then + echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit 1 + fi + + # Just move the object if needed + if test x"$output_obj" != x"$obj"; then + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Create an invalid libtool object if no PIC, so that we do not + # accidentally link it into a program. + if test "$build_libtool_libs" != yes; then + $show "echo timestamp > $libobj" + $run eval "echo timestamp > \$libobj" || exit $? + else + # Move the .lo from within objdir + $show "$mv $libobj $lo_libobj" + if $run $mv $libobj $lo_libobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + fi + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + $rm "$lockfile" + fi + + exit 0 + ;; + + # libtool link mode + link) + modename="$modename: link" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invokation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + + # This is a source program that is used to create dlls on Windows + # Don't remove nor modify the starting and closing comments +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ + # This is a source program that is used to create import libraries + # on Windows for dlls which lack them. Don't remove nor modify the + # starting and closing comments +# /* impgen.c starts here */ +# /* Copyright (C) 1999 Free Software Foundation, Inc. +# +# This file is part of GNU libtool. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# */ +# +# #include /* for printf() */ +# #include /* for open(), lseek(), read() */ +# #include /* for O_RDONLY, O_BINARY */ +# #include /* for strdup() */ +# +# static unsigned int +# pe_get16 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[2]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 2); +# return b[0] + (b[1]<<8); +# } +# +# static unsigned int +# pe_get32 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[4]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 4); +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# static unsigned int +# pe_as32 (ptr) +# void *ptr; +# { +# unsigned char *b = ptr; +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# int +# main (argc, argv) +# int argc; +# char *argv[]; +# { +# int dll; +# unsigned long pe_header_offset, opthdr_ofs, num_entries, i; +# unsigned long export_rva, export_size, nsections, secptr, expptr; +# unsigned long name_rvas, nexp; +# unsigned char *expdata, *erva; +# char *filename, *dll_name; +# +# filename = argv[1]; +# +# dll = open(filename, O_RDONLY|O_BINARY); +# if (!dll) +# return 1; +# +# dll_name = filename; +# +# for (i=0; filename[i]; i++) +# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') +# dll_name = filename + i +1; +# +# pe_header_offset = pe_get32 (dll, 0x3c); +# opthdr_ofs = pe_header_offset + 4 + 20; +# num_entries = pe_get32 (dll, opthdr_ofs + 92); +# +# if (num_entries < 1) /* no exports */ +# return 1; +# +# export_rva = pe_get32 (dll, opthdr_ofs + 96); +# export_size = pe_get32 (dll, opthdr_ofs + 100); +# nsections = pe_get16 (dll, pe_header_offset + 4 +2); +# secptr = (pe_header_offset + 4 + 20 + +# pe_get16 (dll, pe_header_offset + 4 + 16)); +# +# expptr = 0; +# for (i = 0; i < nsections; i++) +# { +# char sname[8]; +# unsigned long secptr1 = secptr + 40 * i; +# unsigned long vaddr = pe_get32 (dll, secptr1 + 12); +# unsigned long vsize = pe_get32 (dll, secptr1 + 16); +# unsigned long fptr = pe_get32 (dll, secptr1 + 20); +# lseek(dll, secptr1, SEEK_SET); +# read(dll, sname, 8); +# if (vaddr <= export_rva && vaddr+vsize > export_rva) +# { +# expptr = fptr + (export_rva - vaddr); +# if (export_rva + export_size > vaddr + vsize) +# export_size = vsize - (export_rva - vaddr); +# break; +# } +# } +# +# expdata = (unsigned char*)malloc(export_size); +# lseek (dll, expptr, SEEK_SET); +# read (dll, expdata, export_size); +# erva = expdata - export_rva; +# +# nexp = pe_as32 (expdata+24); +# name_rvas = pe_as32 (expdata+32); +# +# printf ("EXPORTS\n"); +# for (i = 0; i&2 + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + else + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + fi + build_libtool_libs=no + build_old_libs=yes + prefer_static_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test $# -gt 0; do + arg="$1" + shift + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case "$prev" in + output) + compile_command="$compile_command @OUTPUT@" + finalize_command="$finalize_command @OUTPUT@" + ;; + esac + + case "$prev" in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" + preload=yes + fi + case "$arg" in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + ;; + esac + ;; + expsyms) + export_symbols="$arg" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit 1 + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + release) + if test "$release_suffix" = all; then + release="$arg" + elif test "$release_suffix" = yes; then + release="-$arg" + fi + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case "$arg" in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit 1 + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi + + prevarg="$arg" + + case "$arg" in + -all-static) + if test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -avoid-version) + build_old_libs=no + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: not more than one -exported-symbols argument allowed" + exit 1 + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -L*) + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` + # We need an absolute path. + case "$dir" in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + absdir="$dir" + fi + dir="$absdir" + ;; + esac + case " $deplibs " in + *" $arg "*) ;; + *) deplibs="$deplibs $arg";; + esac + case " $lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir";; + esac + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2*) + dllsearchdir=`cd "$dir" && pwd || echo "$dir"` + case ":$dllsearchpath:" in + ::) dllsearchpath="$dllsearchdir";; + *":$dllsearchdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dllsearchdir";; + esac + ;; + esac + ;; + + -l*) + if test "$arg" = "-lc"; then + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*) + # These systems don't actually have c library (as such) + continue + ;; + esac + elif test "$arg" = "-lm"; then + case "$host" in + *-*-cygwin* | *-*-beos*) + # These systems don't actually have math library (as such) + continue + ;; + esac + fi + deplibs="$deplibs $arg" + ;; + + -?thread) + deplibs="$deplibs $arg" + ;; + + -module) + module=yes + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -o) prev=output ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` + # We need an absolute path. + case "$dir" in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit 1 + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -static) + # If we have no pic_flag, then this is the same as -all-static. + if test -z "$pic_flag" && test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + ;; + + *.o | *.obj | *.a | *.lib) + # A standard object. + libobjs="$libobjs $arg" + ;; + + *.lo) + # A library object. + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + if test "$build_libtool_libs" = yes && test "$dlopen" = yes; then + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"` + prev= + fi + libobjs="$libobjs $arg" + ;; + + *.la) + # A libtool-controlled library. + + dlname= + libdir= + library_names= + old_library= + + # Check to see that this really is a libtool archive. + if (sed -e '2q' $arg | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$arg' is not a valid libtool archive" 1>&2 + exit 1 + fi + + # If the library was installed with an old release of libtool, + # it will not redefine variable installed. + installed=yes + + # Read the .la file + # If there is no directory component, then add one. + case "$arg" in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$arg'" 1>&2 + exit 1 + fi + + # Find the relevant object directory and library name. + name=`$echo "X$arg" | $Xsed -e 's%^.*/%%' -e 's/\.la$//' -e 's/^lib//'` + + if test "X$installed" = Xyes; then + dir="$libdir" + else + dir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$arg"; then + dir="$objdir" + else + dir="$dir/$objdir" + fi + fi + + if test -n "$dependency_libs"; then + # Extract -R and -L from dependency_libs + temp_deplibs= + for deplib in $dependency_libs; do + case "$deplib" in + -R*) temp_xrpath=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + case " $rpath $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + -L*) case "$compile_command $temp_deplibs " in + *" $deplib "*) ;; + *) temp_deplibs="$temp_deplibs $deplib";; + esac + temp_dir=`$echo "X$deplib" | $Xsed -e 's/^-L//'` + case " $lib_search_path " in + *" $temp_dir "*) ;; + *) lib_search_path="$lib_search_path $temp_dir";; + esac + ;; + *) temp_deplibs="$temp_deplibs $deplib";; + esac + done + dependency_libs="$temp_deplibs" + fi + + if test -z "$libdir"; then + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $dir/$old_library" + old_convenience="$old_convenience $dir/$old_library" + deplibs="$deplibs$dependency_libs" + compile_command="$compile_command $dir/$old_library$dependency_libs" + finalize_command="$finalize_command $dir/$old_library$dependency_libs" + continue + fi + + # This library was specified with -dlopen. + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + if test -z "$dlname" || test "$dlopen" != yes || test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking statically, + # we need to preload. + prev=dlprefiles + else + # We should not create a dependency on this library, but we + # may need any libraries it requires. + compile_command="$compile_command$dependency_libs" + finalize_command="$finalize_command$dependency_libs" + prev= + continue + fi + fi + + # The library was specified with -dlpreopen. + if test "$prev" = dlprefiles; then + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + dlprefiles="$dlprefiles $dir/$old_library" + else + dlprefiles="$dlprefiles $dir/$linklib" + fi + prev= + fi + + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + link_against_libtool_libs="$link_against_libtool_libs $arg" + if test -n "$shlibpath_var"; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *) temp_rpath="$temp_rpath $dir" ;; + esac + fi + + # We need an absolute path. + case "$dir" in + [\\/] | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + absdir="$dir" + fi + ;; + esac + + # This is the magic to use -rpath. + # Skip directories that are in the system default run-time + # search path, unless they have been requested with -R. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + + lib_linked=yes + case "$hardcode_action" in + immediate | unsupported) + if test "$hardcode_direct" = no; then + compile_command="$compile_command $dir/$linklib" + deplibs="$deplibs $dir/$linklib" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2*) + dllsearchdir=`cd "$dir" && pwd || echo "$dir"` + if test -n "$dllsearchpath"; then + dllsearchpath="$dllsearchpath:$dllsearchdir" + else + dllsearchpath="$dllsearchdir" + fi + ;; + esac + elif test "$hardcode_minus_L" = no; then + case "$host" in + *-*-sunos*) + compile_shlibpath="$compile_shlibpath$dir:" + ;; + esac + case "$compile_command " in + *" -L$dir "*) ;; + *) compile_command="$compile_command -L$dir";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -L$dir -l$name" + elif test "$hardcode_shlibpath_var" = no; then + case ":$compile_shlibpath:" in + *":$dir:"*) ;; + *) compile_shlibpath="$compile_shlibpath$dir:";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -l$name" + else + lib_linked=no + fi + ;; + + relink) + if test "$hardcode_direct" = yes; then + compile_command="$compile_command $absdir/$linklib" + deplibs="$deplibs $absdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + case "$compile_command " in + *" -L$absdir "*) ;; + *) compile_command="$compile_command -L$absdir";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -L$absdir -l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case ":$compile_shlibpath:" in + *":$absdir:"*) ;; + *) compile_shlibpath="$compile_shlibpath$absdir:";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -l$name" + else + lib_linked=no + fi + ;; + + *) + lib_linked=no + ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit 1 + fi + + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + finalize_command="$finalize_command $libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + case "$finalize_command " in + *" -L$libdir "*) ;; + *) finalize_command="$finalize_command -L$libdir";; + esac + finalize_command="$finalize_command -l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case ":$finalize_shlibpath:" in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:";; + esac + finalize_command="$finalize_command -l$name" + else + # We cannot seem to hardcode it, guess we'll fake it. + case "$finalize_command " in + *" -L$dir "*) ;; + *) finalize_command="$finalize_command -L$libdir";; + esac + finalize_command="$finalize_command -l$name" + fi + else + # Transform directly to old archives if we don't build new libraries. + if test -n "$pic_flag" && test -z "$old_library"; then + $echo "$modename: cannot find static library for \`$arg'" 1>&2 + exit 1 + fi + + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_command="$compile_command $dir/$linklib" + finalize_command="$finalize_command $dir/$linklib" + else + case "$compile_command " in + *" -L$dir "*) ;; + *) compile_command="$compile_command -L$dir";; + esac + compile_command="$compile_command -l$name" + case "$finalize_command " in + *" -L$dir "*) ;; + *) finalize_command="$finalize_command -L$dir";; + esac + finalize_command="$finalize_command -l$name" + fi + fi + + # Add in any libraries that this one depends upon. + compile_command="$compile_command$dependency_libs" + finalize_command="$finalize_command$dependency_libs" + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + ;; + esac + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + case "$output" in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + + *.a | *.lib) + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link libtool libraries into archives" 1>&2 + exit 1 + fi + + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + ;; + + *.la) + # Make sure we only generate libraries of the form `libNAME.la'. + case "$outputname" in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + fi + ;; + esac + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + + if test -n "$objs"; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects:$objs" 2>&1 + exit 1 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for libtool libraries" 1>&2 + fi + + set dummy $rpath + if test $# -gt 2; then + $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 + fi + install_libdir="$2" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + libext=al + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + dependency_libs="$deplibs" + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi + else + + # Parse the version information argument. + IFS="${IFS= }"; save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + IFS="$save_ifs" + + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + current="$2" + revision="$3" + age="$4" + + # Check that each of the things are valid numbers. + case "$current" in + 0 | [1-9] | [1-9][0-9]*) ;; + *) + $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case "$revision" in + 0 | [1-9] | [1-9][0-9]*) ;; + *) + $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case "$age" in + 0 | [1-9] | [1-9][0-9]*) ;; + *) + $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + if test $age -gt $current; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case "$version_type" in + none) ;; + + irix) + major=`expr $current - $age + 1` + versuffix="$major.$revision" + verstring="sgi$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test $loop != 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` + verstring="sgi$major.$iface:$verstring" + done + ;; + + linux) + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + ;; + + osf) + major=`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test $loop != 0; do + iface=`expr $current - $loop` + loop=`expr $loop - 1` + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + windows) + # Like Linux, but with '-' rather than '.', since we only + # want one extension on Windows 95. + major=`expr $current - $age` + versuffix="-$major-$age-$revision" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + verstring="0.0" + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + dependency_libs="$deplibs" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *-*-freebsd*) + # FreeBSD doesn't need this... + ;; + *) + # Add libc to deplibs on all other systems. + deplibs="$deplibs -lc" + ;; + esac + fi + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$compile_rpath " in + *" $libdir "*) ;; + *) compile_rpath="$compile_rpath $libdir" ;; + esac + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + # Create the output directory, or remove our outputs if we need to. + if test -d $output_objdir; then + $show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*" + $run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.* + else + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + status=$? + if test $status -ne 0 && test ! -d $output_objdir; then + exit $status + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + if test "$release_suffix" = all; then + oldlibs="$oldlibs $output_objdir/$libname$release.$libext" + else + oldlibs="$oldlibs $output_objdir/$libname.$libext" + fi + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + if test "$build_libtool_libs" = yes; then + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case "$deplibs_check_method" in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behaviour. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $rm conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | sed 's/.* -> //'` + case "$potliblink" in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | sed 10q \ + | egrep "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + echo "*** Warning: This library needs some functionality provided by $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g' -e 's/[ ]//g' | + grep . >/dev/null; then + echo + if test "X$deplibs_check_method" = "Xnone"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + echo "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + if test "$release_suffix" = all; then + oldlibs="$output_objdir/$libname$release.$libext" + else + oldlibs="$output_objdir/$libname.$libext" + fi + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + # Get the real and link names of the library. + eval library_names=\"$library_names_spec\" + set dummy $library_names + realname="$2" + shift; shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + lib="$output_objdir/$realname" + for link + do + linknames="$linknames $link" + done + + # Ensure that we have .o objects for linkers which dislike .lo + # (e.g. aix) in case we are running --disable-static + for obj in $libobjs; do + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir="." + else + xdir="$xdir" + fi + baseobj=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` + if test ! -f $xdir/$oldobj; then + $show "(cd $xdir && ${LN_S} $baseobj $oldobj)" + $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $? + fi + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + eval cmds=\"$export_symbols_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + if test -n "$export_symbols_regex"; then + $show "egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval 'egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test $status -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + for xlib in $convenience; do + # Extract the objects. + case "$xlib" in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test $status -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` + done + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linkopts="$linkopts $flag" + fi + + # Do each of the archive commands. + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval cmds=\"$archive_expsym_cmds\" + else + eval cmds=\"$archive_cmds\" + fi + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + *.lo | *.o | *.obj) + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link libtool libraries into objects" 1>&2 + exit 1 + fi + + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi + + case "$output" in + *.lo) + if test -n "$objs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit 1 + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $run $rm $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${obj}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test $status -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + for xlib in $convenience; do + # Extract the objects. + case "$xlib" in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test $status -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` + done + fi + fi + + # Create the old-style object. + reload_objs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" + + output="$obj" + eval cmds=\"$reload_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit 0 + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + $show "echo timestamp > $libobj" + $run eval "echo timestamp > $libobj" || exit $? + exit 0 + fi + + if test -n "$pic_flag"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + eval cmds=\"$reload_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + else + # Just create a symlink. + $show $rm $libobj + $run $rm $libobj + xdir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$libobj"; then + xdir="." + else + xdir="$xdir" + fi + baseobj=`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` + oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` + $show "(cd $xdir && $LN_S $oldobj $baseobj)" + $run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $? + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit 0 + ;; + + # Anything else should be a program. + *) + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi + + if test "$preload" = yes; then + if test "$dlopen" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$compile_rpath " in + *" $libdir "*) ;; + *) compile_rpath="$compile_rpath $libdir" ;; + esac + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + + # Create the binary in the object directory, then wrap it. + if test ! -d $output_objdir; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + status=$? + if test $status -ne 0 && test ! -d $output_objdir; then + exit $status + fi + fi + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi + fi + + if test -n "$dlsyms"; then + case "$dlsyms" in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ +/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ +/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* Prevent the only kind of declaration conflicts we can make. */ +#define lt_preloaded_symbols some_other_symbol + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$output.exp" + $run $rm $export_symbols + $run eval "sed -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + else + $run eval "sed -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' + $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`echo "$arg" | sed -e 's%^.*/%%'` + $run eval 'echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if grep -v "^: " < "$nlist" | sort +2 | uniq > "$nlist"S; then + : + else + grep -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + +#undef lt_preloaded_symbols + +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{\ +" + + sed -n -e 's/^: \([^ ]*\) $/ {\"\1\", (lt_ptr_t) 0},/p' \ + -e 's/^. \([^ ]*\) \([^ ]*\)$/ {"\2", (lt_ptr_t) \&\2},/p' \ + < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr_t) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + fi + + pic_flag_for_symtable= + case "$host" in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DPIC";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit 1 + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` + fi + + if test -z "$link_against_libtool_libs" || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + + exit $status + fi + + if test -n "$shlibpath_var"; then + # We should set the shlibpath_var + rpath= + for dir in $temp_rpath; do + case "$dir" in + [\\/]* | [A-Za-z]:[\\/]*) + # Absolute path. + rpath="$rpath$dir:" + ;; + *) + # Relative path: add a thisdir entry. + rpath="$rpath\$thisdir/$dir:" + ;; + esac + done + temp_rpath="$rpath" + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname + + $show "$link_command" + $run eval "$link_command" || exit $? + + # Now create the wrapper script. + $show "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $0 --fallback-echo"; then + case "$0" in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";; + *) qecho="$SHELL `pwd`/$0 --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) output=`echo $output|sed 's,.exe$,,'` ;; + esac + $rm $output + trap "$rm $output; exit 1" 1 2 15 + + $echo > $output "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variable: + link_against_libtool_libs='$link_against_libtool_libs' +else + # When we are sourced in execute mode, \$file and \$echo are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $echo >> $output "\ + + # Find the directory that this script lives in. + thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | sed -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\/]* | [A-Za-z]:[\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | sed -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + echo >> $output "\ + program=lt-'$outputname' + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || \\ + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | sed 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $mkdir \"\$progdir\" + else + $rm \"\$progdir/\$file\" + fi" + + echo >> $output "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if (cd \"\$thisdir\" && eval \$relink_command); then : + else + $rm \"\$progdir/\$file\" + exit 1 + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + echo >> $output "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $echo >> $output "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + *-*-cygwin* | *-*-mingw | *-*-os2*) + # win32 systems need to use the prog path for dll + # lookup to work + $echo >> $output "\ + exec \$progdir\\\\\$program \${1+\"\$@\"} +" + ;; + *) + $echo >> $output "\ + # Export the path to the program. + PATH=\"\$progdir:\$PATH\" + export PATH + + exec \$program \${1+\"\$@\"} +" + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" + exit 1 + fi + else + # The program doesn't exist. + \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 + \$echo \"This script is just a wrapper for \$program.\" 1>&2 + echo \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" + chmod +x $output + fi + exit 0 + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$objs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP` + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test $status -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + # Add in members from convenience archives. + for xlib in $addlibs; do + # Extract the objects. + case "$xlib" in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test $status -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP` + done + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + eval cmds=\"$old_archive_from_new_cmds\" + else + # Ensure that we have .o objects in place in case we decided + # not to build a shared library, and have fallen back to building + # static libs even though --disable-static was passed! + for oldobj in $oldobjs; do + if test ! -f $oldobj; then + xdir=`$echo "X$oldobj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$oldobj"; then + xdir="." + else + xdir="$xdir" + fi + baseobj=`$echo "X$oldobj" | $Xsed -e 's%^.*/%%'` + obj=`$echo "X$baseobj" | $Xsed -e "$o2lo"` + $show "(cd $xdir && ${LN_S} $obj $baseobj)" + $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $? + fi + done + + eval cmds=\"$old_archive_cmds\" + fi + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi + + # Now create the libtool archive. + case "$output" in + *.la) + old_library= + if test "$release_suffix" = all; then + test "$build_old_libs" = yes && old_library="$libname$release.$libext" + else + test "$build_old_libs" = yes && old_library="$libname.$libext" + fi + $show "creating $output" + + if test -n "$xrpath"; then + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + done + dependency_libs="$temp_xrpath $dependency_libs" + fi + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + fi + $rm $output + $echo > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$dlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Directory that this library needs to be installed in: +libdir='$install_libdir'\ +" + done + fi + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" || exit $? + ;; + esac + exit 0 + ;; + + # libtool install mode + install) + modename="$modename: install" + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$arg " + arg="$1" + shift + else + install_prog= + arg="$nonopt" + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog$arg" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest="$arg" + continue + fi + + case "$arg" in + -d) isdir=yes ;; + -f) prev="-f" ;; + -g) prev="-g" ;; + -m) prev="-m" ;; + -o) prev="-o" ;; + -s) + stripme=" -s" + continue + ;; + -*) ;; + + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest="$arg" + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit 1 + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` + test "X$destdir" = "X$dest" && destdir=. + destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` + + # Not a directory, so check to see that there is only one file specified. + set dummy $files + if test $# -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + fi + case "$destdir" in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case "$file" in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case "$file" in + *.a | *.lib) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + library_names= + old_library= + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir="`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/" + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$realname $destdir/$realname" + $run eval "$install_prog $dir/$realname $destdir/$realname" || exit $? + + if test $# -gt 0; then + # Delete the old symlinks, and create new ones. + for linkname + do + if test "$linkname" != "$realname"; then + $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + eval cmds=\"$postinstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + if test "$install_ltlibs" = yes; then + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $destdir/$name" || exit $? + fi + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case "$destfile" in + *.lo) + staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` + ;; + *.o | *.obj) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $file $destfile" + $run eval "$install_prog $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi + exit 0 + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Do a test to see if this is really a libtool program. + if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + link_against_libtool_libs= + relink_command= + + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Check the variables that should have been set. + if test -z "$link_against_libtool_libs"; then + $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2 + exit 1 + fi + + finalize=yes + for lib in $link_against_libtool_libs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case "$lib" in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/`$echo "X$lib" | $Xsed -e 's%^.*/%%g'`" + if test -n "$libdir" && test ! -f "$libfile"; then + finalize=no + fi + done + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir="/tmp" + test -n "$TMPDIR" && tmpdir="$TMPDIR" + tmpdir="$tmpdir/libtool-$$" + if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then : + else + $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 + continue + fi + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + esac + done + + for file in $staticlibs; do + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + + # Do each command in the postinstall commands. + eval cmds=\"$old_postinstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec $SHELL $0 --finish$current_libdirs + exit 1 + fi + + exit 0 + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + eval cmds=\"$finish_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = : && exit 0 + + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + echo " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use \`-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the \`$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + echo " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + echo " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + echo + echo "See any operating system documentation about shared libraries for" + echo "more information, such as the ld(1) and ld.so(8) manual pages." + echo "----------------------------------------------------------------------" + exit 0 + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit 1 + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + dir= + case "$file" in + *.la) + # Check to see that this really is a libtool archive. + if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit 1 + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case "$file" in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` + args="$args \"$file\"" + done + + if test -z "$run"; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved enviroment variables + if test "${save_LC_ALL+set}" = set; then + LC_ALL="$save_LC_ALL"; export LC_ALL + fi + if test "${save_LANG+set}" = set; then + LANG="$save_LANG"; export LANG + fi + + # Now actually exec the command. + eval "exec \$cmd$args" + + $echo "$modename: cannot exec \$cmd$args" + exit 1 + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + fi + $echo "$cmd$args" + exit 0 + fi + ;; + + # libtool uninstall mode + uninstall) + modename="$modename: uninstall" + rm="$nonopt" + files= + + for arg + do + case "$arg" in + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + rmfiles="$file" + + case "$name" in + *.la) + # Possibly a libtool archive, so verify it. + if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $dir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $dir/$old_library" + + $show "$rm $rmfiles" + $run $rm $rmfiles + + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + eval cmds=\"$postuninstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + eval cmds=\"$old_postuninstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" + done + IFS="$save_ifs" + fi + + # FIXME: should reinstall the best remaining shared library. + fi + ;; + + *.lo) + if test "$build_old_libs" = yes; then + oldobj=`$echo "X$name" | $Xsed -e "$lo2o"` + rmfiles="$rmfiles $dir/$oldobj" + fi + $show "$rm $rmfiles" + $run $rm $rmfiles + ;; + + *) + $show "$rm $rmfiles" + $run $rm $rmfiles + ;; + esac + done + exit 0 + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 + ;; + esac + + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 +fi # test -z "$show_help" + +# We need to display help for each of the modes. +case "$mode" in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... + +Provide generalized library-building support services. + + --config show all configuration variables + --debug enable verbose shell tracing +-n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --finish same as \`--mode=finish' + --help display this help message and exit + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages + --version print version information + +MODE must be one of the following: + + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE." + exit 0 + ;; + +compile) + $echo \ +"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -static always build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + +execute) + $echo \ +"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + +finish) + $echo \ +"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + +install) + $echo \ +"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + +link) + $echo \ +"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -static do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + +uninstall) + $echo \ +"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + +*) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; +esac + +echo +$echo "Try \`$modename --help' for more information about other modes." + +exit 0 + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/missing b/missing new file mode 100755 index 000000000..0a7fb5a2a --- /dev/null +++ b/missing @@ -0,0 +1,283 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. +# Copyright 1996, 1997, 1999, 2000 Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +case "$1" in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case "$1" in + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch]" + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing 0.3 - GNU automake" + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + + aclocal) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case "$f" in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if [ ! -f y.tab.h ]; then + echo >y.tab.h + fi + if [ ! -f y.tab.c ]; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if [ ! -f lex.yy.c ]; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` + fi + if [ -f "$file" ]; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit 1 + fi + ;; + + makeinfo) + if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then + # We have makeinfo, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` + fi + touch $file + ;; + + tar) + shift + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + fi + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar ${1+"$@"} && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar ${1+"$@"} && exit 0 + fi + firstarg="$1" + if shift; then + case "$firstarg" in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" ${1+"$@"} && exit 0 + ;; + esac + case "$firstarg" in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" ${1+"$@"} && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequirements for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 diff --git a/mkinstalldirs b/mkinstalldirs new file mode 100755 index 000000000..6b3b5fc5d --- /dev/null +++ b/mkinstalldirs @@ -0,0 +1,40 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +# $Id$ + +errstatus=0 + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# mkinstalldirs ends here diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c new file mode 100644 index 000000000..19b6ff2e3 --- /dev/null +++ b/skeletons/BIT_STRING.c @@ -0,0 +1,96 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include + +/* + * BIT STRING basic type description. + */ +static ber_tlv_tag_t asn1_DEF_BIT_STRING_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_BIT_STRING = { + "BIT STRING", + BIT_STRING_constraint, + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + BIT_STRING_print, + OCTET_STRING_free, /* Implemented in terms of OCTET STRING */ + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_BIT_STRING_tags, + sizeof(asn1_DEF_BIT_STRING_tags) + / sizeof(asn1_DEF_BIT_STRING_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + -1, /* Both ways are fine */ + (void *)-1 /* Special indicator that this is a BIT STRING */ +}; + +/* + * BIT STRING generic constraint. + */ +int +BIT_STRING_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const BIT_STRING_t *st = sptr; + + if(st && st->buf) { + if(st->size) { + if(st->size == 1 && st->buf[0] != 0) { + _ASN_ERRLOG("%s: invalid padding byte", + td->name); + return -1; + } + } else { + _ASN_ERRLOG("%s: no padding byte", td->name); + return -1; + } + } else { + _ASN_ERRLOG("%s: value not given", td->name); + return -1; + } + + return 0; +} + +/* + * BIT STRING specific contents printer. + */ +int +BIT_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + static char h2c[16] = "0123456789ABCDEF"; + char scratch[64]; + const BIT_STRING_t *st = sptr; + uint8_t *buf; + uint8_t *end; + char *p = scratch; + + if(!st || !st->buf) return cb("", 8, app_key); + + ilevel += 4; + buf = st->buf; + end = buf + st->size; + + /* + * Hexadecimal dump. + */ + for(buf++; buf < end; buf++) { + if(((buf - st->buf) - 1) % 16 == 0) { + int i; + /* Indentation */ + if(cb("\n", 1, app_key)) return -1; + for(i = 0; i < ilevel; i++) cb(" ", 1, app_key); + /* Dump the string */ + if(cb(scratch, p - scratch, app_key)) return -1; + p = scratch; + } + *p++ = h2c[*buf >> 4]; + *p++ = h2c[*buf & 0x0F]; + *p++ = 0x20; + } + + /* Dump the incomplete 16-bytes row */ + return cb(scratch, p - scratch, app_key); +} + diff --git a/skeletons/BIT_STRING.h b/skeletons/BIT_STRING.h new file mode 100644 index 000000000..1def8bb22 --- /dev/null +++ b/skeletons/BIT_STRING.h @@ -0,0 +1,18 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _BIT_STRING_H_ +#define _BIT_STRING_H_ + +#include +#include + +typedef OCTET_STRING_t BIT_STRING_t; /* Implemented in terms of OCTET STRING */ + +extern asn1_TYPE_descriptor_t asn1_DEF_BIT_STRING; + +asn_struct_print_f BIT_STRING_print; /* Human-readable output */ +asn_constr_check_f BIT_STRING_constraint; + +#endif /* _BIT_STRING_H_ */ diff --git a/skeletons/BMPString.c b/skeletons/BMPString.c new file mode 100644 index 000000000..596974eaf --- /dev/null +++ b/skeletons/BMPString.c @@ -0,0 +1,65 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include + +/* + * BMPString basic type description. + */ +static ber_tlv_tag_t asn1_DEF_BMPString_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (30 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_BMPString = { + "BMPString", + asn_generic_no_constraint, /* No constraint by default */ + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + BMPString_print, + OCTET_STRING_free, /* -//- */ + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_BMPString_tags, + sizeof(asn1_DEF_BMPString_tags) + / sizeof(asn1_DEF_BMPString_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + -1, /* Both ways are fine */ +}; + +/* + * BMPString specific contents printer. + */ +int +BMPString_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const BMPString_t *st = sptr; + uint16_t *wchar; + uint16_t *wend; + char scratch[128]; /* Scratchpad buffer */ + char *p; + + if(!st || !st->buf) return cb("", 8, app_key); + + wchar = (uint16_t *)st->buf; + wend = (uint16_t *)(st->buf + st->size); + for(p = scratch; wchar < wend; wchar++) { + uint16_t wc = (((uint8_t *)wchar)[0] << 8) + | ((uint8_t *)wchar)[1]; /* 2 bytes */ + if(sizeof(scratch) - (p - scratch) < 3) { + if(cb(scratch, p - scratch, app_key)) + return -1; + p = scratch; + } + if(wc < 0x80) { + *p++ = (char)wc; + } else if(wc < 0x800) { + *p++ = 0xc0 | ((wc >> 6)); + *p++ = 0x80 | ((wc & 0x3f)); + } else { + *p++ = 0xe0 | ((wc >> 12)); + *p++ = 0x80 | ((wc >> 6) & 0x3f); + *p++ = 0x80 | ((wc & 0x3f)); + } + } + + return cb(scratch, p - scratch, app_key); +} diff --git a/skeletons/BMPString.h b/skeletons/BMPString.h new file mode 100644 index 000000000..e3957ca03 --- /dev/null +++ b/skeletons/BMPString.h @@ -0,0 +1,17 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _BMPString_H_ +#define _BMPString_H_ + +#include +#include + +typedef OCTET_STRING_t BMPString_t; /* Implemented in terms of OCTET STRING */ + +extern asn1_TYPE_descriptor_t asn1_DEF_BMPString; + +asn_struct_print_f BMPString_print; /* Human-readable output */ + +#endif /* _BMPString_H_ */ diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c new file mode 100644 index 000000000..705d37e0f --- /dev/null +++ b/skeletons/BOOLEAN.c @@ -0,0 +1,147 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include + +/* + * BOOLEAN basic type description. + */ +static ber_tlv_tag_t asn1_DEF_BOOLEAN_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_BOOLEAN = { + "BOOLEAN", + asn_generic_no_constraint, + BOOLEAN_decode_ber, + BOOLEAN_encode_der, + BOOLEAN_print, + BOOLEAN_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_BOOLEAN_tags, + sizeof(asn1_DEF_BOOLEAN_tags)/sizeof(asn1_DEF_BOOLEAN_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + 0 /* Always in primitive form */ +}; + +/* + * Decode BOOLEAN type. + */ +ber_dec_rval_t +BOOLEAN_decode_ber(asn1_TYPE_descriptor_t *td, + void **bool_structure, void *buf_ptr, size_t size, + int tag_mode) { + BOOLEAN_t *st = *bool_structure; + ber_dec_rval_t rval; + ber_dec_ctx_t ctx = { 0 }; + ber_tlv_len_t length; + ber_tlv_len_t lidx; + + if(st == NULL) { + st = *bool_structure = CALLOC(1, sizeof(*st)); + if(st == NULL) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + } + + ASN_DEBUG("Decoding %s as BOOLEAN (tm=%d)", + td->name, tag_mode); + + /* + * Check tags. + */ + rval = ber_check_tags(td, &ctx, + buf_ptr, size, tag_mode, &length, 0); + if(rval.code != RC_OK) + return rval; + + ASN_DEBUG("Boolean length is %d bytes", (int)length); + + buf_ptr += rval.consumed; + size -= rval.consumed; + if(length > size) { + rval.code = RC_WMORE; + rval.consumed = 0; + return rval; + } + + /* + * Compute boolean value. + */ + for(st->value = 0, lidx = 0; + (lidx < length) && st->value == 0; lidx++) { + /* + * Very simple approach: read bytes until the end or + * value is already TRUE. + * BOOLEAN is not supposed to contain meaningful data anyway. + */ + st->value |= ((uint8_t *)buf_ptr)[lidx]; + } + + rval.code = RC_OK; + rval.consumed += length; + + ASN_DEBUG("Took %ld/%ld bytes to encode %s, value=%ld", + (long)rval.consumed, (long)length, + td->name, (long)st->value); + + return rval; +} + +der_enc_rval_t +BOOLEAN_encode_der(asn1_TYPE_descriptor_t *td, void *sptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + der_enc_rval_t erval; + BOOLEAN_t *st = sptr; + + erval.encoded = der_write_tags(td, 1, tag_mode, tag, cb, app_key); + if(erval.encoded == -1) { + erval.failed_type = td; + erval.structure_ptr = sptr; + return erval; + } + + if(cb) { + uint8_t bool_value; + ssize_t ret; + + bool_value = st->value?0xff:0; /* 0xff mandated by DER */ + ret = cb(&bool_value, 1, app_key); + if(ret == -1) { + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = sptr; + return erval; + } + } + + erval.encoded += 1; + + return erval; +} + +int +BOOLEAN_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const BOOLEAN_t *st = sptr; + + if(st) { + if(st->value) + return cb("TRUE", 4, app_key); + else + return cb("FALSE", 5, app_key); + } else { + return cb("", 8, app_key); + } +} + +void +BOOLEAN_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { + if(td && ptr && !contents_only) { + FREEMEM(ptr); + } +} + diff --git a/skeletons/BOOLEAN.h b/skeletons/BOOLEAN.h new file mode 100644 index 000000000..234e9f8e7 --- /dev/null +++ b/skeletons/BOOLEAN.h @@ -0,0 +1,21 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _BOOLEAN_H_ +#define _BOOLEAN_H_ + +#include + +typedef struct BOOLEAN { + int value; +} BOOLEAN_t; + +extern asn1_TYPE_descriptor_t asn1_DEF_BOOLEAN; + +ber_type_decoder_f BOOLEAN_decode_ber; +der_type_encoder_f BOOLEAN_encode_der; +asn_struct_print_f BOOLEAN_print; +asn_struct_free_f BOOLEAN_free; + +#endif /* _BOOLEAN_H_ */ diff --git a/skeletons/ENUMERATED.c b/skeletons/ENUMERATED.c new file mode 100644 index 000000000..1f1ae8961 --- /dev/null +++ b/skeletons/ENUMERATED.c @@ -0,0 +1,26 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include + +/* + * ENUMERATED basic type description. + */ +static ber_tlv_tag_t asn1_DEF_ENUMERATED_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_ENUMERATED = { + "ENUMERATED", + asn_generic_no_constraint, + INTEGER_decode_ber, /* Implemented in terms of INTEGER */ + INTEGER_encode_der, /* Implemented in terms of INTEGER */ + INTEGER_print, /* Implemented in terms of INTEGER */ + INTEGER_free, /* Implemented in terms of INTEGER */ + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_ENUMERATED_tags, + sizeof(asn1_DEF_ENUMERATED_tags)/sizeof(asn1_DEF_ENUMERATED_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + 0 /* Primitive */ +}; + diff --git a/skeletons/ENUMERATED.h b/skeletons/ENUMERATED.h new file mode 100644 index 000000000..a0948ed06 --- /dev/null +++ b/skeletons/ENUMERATED.h @@ -0,0 +1,15 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _ENUMERATED_H_ +#define _ENUMERATED_H_ + +#include +#include + +typedef INTEGER_t ENUMERATED_t; /* Implemented in terms of INTEGER */ + +extern asn1_TYPE_descriptor_t asn1_DEF_ENUMERATED; + +#endif /* _ENUMERATED_H_ */ diff --git a/skeletons/GeneralString.c b/skeletons/GeneralString.c new file mode 100644 index 000000000..d69c5f16f --- /dev/null +++ b/skeletons/GeneralString.c @@ -0,0 +1,27 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include + +/* + * GeneralString basic type description. + */ +static ber_tlv_tag_t asn1_DEF_GeneralString_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (27 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_GeneralString = { + "GeneralString", + asn_generic_unknown_constraint, + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_print, /* non-ascii string */ + OCTET_STRING_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_GeneralString_tags, + sizeof(asn1_DEF_GeneralString_tags) + / sizeof(asn1_DEF_GeneralString_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + -1, /* Both ways are fine */ +}; + diff --git a/skeletons/GeneralString.h b/skeletons/GeneralString.h new file mode 100644 index 000000000..6d5bfdf67 --- /dev/null +++ b/skeletons/GeneralString.h @@ -0,0 +1,15 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _GeneralString_H_ +#define _GeneralString_H_ + +#include +#include + +typedef OCTET_STRING_t GeneralString_t; /* Implemented in terms of OCTET STRING */ + +extern asn1_TYPE_descriptor_t asn1_DEF_GeneralString; + +#endif /* _GeneralString_H_ */ diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c new file mode 100644 index 000000000..01d7a736e --- /dev/null +++ b/skeletons/GeneralizedTime.c @@ -0,0 +1,302 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#ifndef __NO_ASSERT_H__ +#include +#endif /* __NO_ASSERT_H__ */ + +#ifndef __NO_ASN_TABLE__ + +/* + * GeneralizedTime basic type description. + */ +static ber_tlv_tag_t asn1_DEF_GeneralizedTime_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (24 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_GeneralizedTime = { + "GeneralizedTime", + GeneralizedTime_constraint, /* Check validity of time */ + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + GeneralizedTime_print, + OCTET_STRING_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_GeneralizedTime_tags, + sizeof(asn1_DEF_GeneralizedTime_tags) + / sizeof(asn1_DEF_GeneralizedTime_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + -1, /* Both ways are fine */ +}; + +#endif /* __NO_ASN_TABLE__ */ + +/* + * Check that the time looks like the time. + */ +int +GeneralizedTime_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const GeneralizedTime_t *st = sptr; + time_t tloc; + + errno = EPERM; /* Just an unlikely error code */ + tloc = asn_GT2time(st, 0); + if(tloc == -1 && errno != EPERM) { + _ASN_ERRLOG("%s: Invalid time format: %s", + td->name, strerror(errno)); + return -1; + } + + return 0; +} + +int +GeneralizedTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const GeneralizedTime_t *st = sptr; + + if(st && st->buf) { + char buf[32]; + struct tm tm; + int ret; + + errno = EPERM; + if(asn_GT2time(st, &tm) == -1 && errno != EPERM) + return cb("", 11, app_key); + + ret = snprintf(buf, sizeof(buf), + "%04d-%02d-%02d %02d:%02d%02d", + tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, + tm.tm_hour, tm.tm_min, tm.tm_sec); + assert(ret > 0 && ret < sizeof(buf)); + return cb(buf, ret, app_key); + } else { + return cb("", 8, app_key); + } +} + +/* + * Where to look for offset from GMT, Phase I. + * Several platforms are known. + */ +#if defined(__FreeBSD__) || (defined(__GNUC__) && defined(__APPLE_CC__)) +#undef HAVE_TM_ZONE +#define HAVE_TM_ZONE +#endif /* BSDs */ + +/* + * Where to look for offset from GMT, Phase II. + */ +#ifdef HAVE_TM_ZONE +#define GMTOFF (tm_s.tm_gmtoff) +#else /* HAVE_TM_ZONE */ +#define GMTOFF (-timezone) +#endif /* HAVE_TM_ZONE */ + +time_t +asn_GT2time(const GeneralizedTime_t *st, struct tm *_tm) { + struct tm tm_s; + uint8_t *buf; + uint8_t *end; + int tm_gmtoff_h = 0; + int tm_gmtoff_m = 0; + int tm_gmtoff = 0; /* h + m */ + int offset_specified = 0; + time_t tloc; + + if(!st || !st->buf) { + errno = EINVAL; + return -1; + } else { + buf = st->buf; + end = buf + st->size; + } + + if(st->size < 10) { + errno = EINVAL; + return -1; + } + + /* + * Decode first 10 bytes: "AAAAMMJJhh" + */ + memset(&tm_s, 0, sizeof(tm_s)); +#undef B2F +#undef B2T +#define B2F(var) do { \ + unsigned ch = *buf; \ + if(ch < 0x30 && ch > 0x39) { \ + errno = EINVAL; \ + return -1; \ + } else { \ + var = var * 10 + (ch - 0x30); \ + buf++; \ + } \ + } while(0) +#define B2T(var) B2F(tm_s.var) + + B2T(tm_year); /* 1: A */ + B2T(tm_year); /* 2: A */ + B2T(tm_year); /* 3: A */ + B2T(tm_year); /* 4: A */ + B2T(tm_mon); /* 5: M */ + B2T(tm_mon); /* 6: M */ + B2T(tm_mday); /* 7: J */ + B2T(tm_mday); /* 8: J */ + B2T(tm_hour); /* 9: h */ + B2T(tm_hour); /* 0: h */ + + if(buf == end) goto local_finish; + + /* + * Parse [mm[ss[(.|,)ffff]]] + * ^^ + */ + switch(*buf) { + case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: + case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: + tm_s.tm_min = (*buf++) - 0x30; + if(buf == end) { errno = EINVAL; return -1; } + B2T(tm_min); + break; + case 0x2B: case 0x2D: /* +, - */ + goto offset; + case 0x5A: /* Z */ + goto utc_finish; + default: + errno = EINVAL; + return -1; + } + + if(buf == end) goto local_finish; + + /* + * Parse [mm[ss[(.|,)ffff]]] + * ^^ + */ + switch(*buf) { + case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: + case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: + tm_s.tm_sec = (*buf++) - 0x30; + if(buf == end) { errno = EINVAL; return -1; } + B2T(tm_sec); + break; + case 0x2B: case 0x2D: /* +, - */ + goto offset; + case 0x5A: /* Z */ + goto utc_finish; + default: + errno = EINVAL; + return -1; + } + + if(buf == end) goto local_finish; + + /* + * Parse [mm[ss[(.|,)ffff]]] + * ^ ^ + */ + switch(*buf) { + case 0x2C: case 0x2E: /* (.|,) */ + /* Fractions of seconds are not supported + * by time_t or struct tm. Skip them */ + for(buf++; buf < end; buf++) { + switch(*buf) { + case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: + case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: + continue; + default: + break; + } + break; + } + } + + if(buf == end) goto local_finish; + + switch(*buf) { + case 0x2B: case 0x2D: /* +, - */ + goto offset; + case 0x5A: /* Z */ + goto utc_finish; + default: + errno = EINVAL; + return -1; + } + + +offset: + + if(end - buf < 3) { + errno = EINVAL; + return -1; + } + buf++; + B2F(tm_gmtoff_h); + B2F(tm_gmtoff_h); + if(buf[-3] == 0x2D) /* Negative */ + tm_gmtoff = -1; + else + tm_gmtoff = 1; + + if((end - buf) == 2) { + B2F(tm_gmtoff_m); + B2F(tm_gmtoff_m); + } else if(end != buf) { + errno = EINVAL; + return -1; + } + + tm_gmtoff = tm_gmtoff * (3600 * tm_gmtoff_h + 60 * tm_gmtoff_m); + + /* Fall through */ +utc_finish: + + offset_specified = 1; + + /* Fall through */ +local_finish: + + /* + * Validation. + */ + if((tm_s.tm_mon > 12 || tm_s.tm_mon < 1) + || (tm_s.tm_mday > 31 || tm_s.tm_mday < 1) + || (tm_s.tm_hour > 23) + || (tm_s.tm_sec > 60) + ) { + errno = EINVAL; + return -1; + } + + /* Canonicalize */ + tm_s.tm_mon -= 1; /* 0 - 11 */ + tm_s.tm_year -= 1900; + tm_s.tm_isdst = -1; + + tloc = mktime(&tm_s); + if(tloc == -1) { + errno = EINVAL; + return -1; + } + + if(offset_specified) { + /* + * Offset from GMT is specified in the time expression. + */ + tloc += GMTOFF - tm_gmtoff; + if(_tm && (localtime_r(&tloc, &tm_s) == NULL)) { + /* Could not reconstruct the time */ + return -1; + } + } + + if(_tm) memcpy(_tm, &tm_s, sizeof(struct tm)); + + return tloc; +} + diff --git a/skeletons/GeneralizedTime.h b/skeletons/GeneralizedTime.h new file mode 100644 index 000000000..d8176be08 --- /dev/null +++ b/skeletons/GeneralizedTime.h @@ -0,0 +1,26 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _GeneralizedTime_H_ +#define _GeneralizedTime_H_ + +#include +#include + +typedef OCTET_STRING_t GeneralizedTime_t; /* Implemented using OCTET STRING */ + +extern asn1_TYPE_descriptor_t asn1_DEF_GeneralizedTime; + +asn_constr_check_f GeneralizedTime_constraint; +asn_struct_print_f GeneralizedTime_print; + +/*********************** + * Some handy helpers. * + ***********************/ + +/* On error returns -1 and errno set to EINVAL */ +struct tm; /* */ +time_t asn_GT2time(const GeneralizedTime_t *, struct tm *_optional_tm4fill); + +#endif /* _GeneralizedTime_H_ */ diff --git a/skeletons/GraphicString.c b/skeletons/GraphicString.c new file mode 100644 index 000000000..5c89685ef --- /dev/null +++ b/skeletons/GraphicString.c @@ -0,0 +1,27 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include + +/* + * GraphicString basic type description. + */ +static ber_tlv_tag_t asn1_DEF_GraphicString_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (25 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_GraphicString = { + "GraphicString", + asn_generic_unknown_constraint, + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_print, /* non-ascii string */ + OCTET_STRING_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_GraphicString_tags, + sizeof(asn1_DEF_GraphicString_tags) + / sizeof(asn1_DEF_GraphicString_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + -1, /* Both ways are fine */ +}; + diff --git a/skeletons/GraphicString.h b/skeletons/GraphicString.h new file mode 100644 index 000000000..b37b2c7e0 --- /dev/null +++ b/skeletons/GraphicString.h @@ -0,0 +1,15 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _GraphicString_H_ +#define _GraphicString_H_ + +#include +#include + +typedef OCTET_STRING_t GraphicString_t; /* Implemented in terms of OCTET STRING */ + +extern asn1_TYPE_descriptor_t asn1_DEF_GraphicString; + +#endif /* _GraphicString_H_ */ diff --git a/skeletons/IA5String.c b/skeletons/IA5String.c new file mode 100644 index 000000000..c4afcb00d --- /dev/null +++ b/skeletons/IA5String.c @@ -0,0 +1,57 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include + +/* + * IA5String basic type description. + */ +static ber_tlv_tag_t asn1_DEF_IA5String_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_IA5String = { + "IA5String", + IA5String_constraint, /* Constraint on the alphabet */ + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_print_ascii, /* ASCII subset */ + OCTET_STRING_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_IA5String_tags, + sizeof(asn1_DEF_IA5String_tags) + / sizeof(asn1_DEF_IA5String_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + -1, /* Both ways are fine */ +}; + +int +IA5String_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const IA5String_t *st = sptr; + + if(st && st->buf) { + uint8_t *buf = st->buf; + uint8_t *end = buf + st->size; + /* + * IA5String is generally equivalent to 7bit ASCII. + * ISO/ITU-T T.50, 1963. + */ + for(; buf < end; buf++) { + if(*buf > 0x7F) { + _ASN_ERRLOG("%s: value byte %d out of range: " + "%d > 127", + td->name, + (buf - st->buf) + 1, + *buf + ); + return -1; + } + } + } else { + _ASN_ERRLOG("%s: value not given", td->name); + return -1; + } + + return 0; +} diff --git a/skeletons/IA5String.h b/skeletons/IA5String.h new file mode 100644 index 000000000..a80004e8c --- /dev/null +++ b/skeletons/IA5String.h @@ -0,0 +1,20 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _IA5String_H_ +#define _IA5String_H_ + +#include +#include + +typedef OCTET_STRING_t IA5String_t; /* Implemented in terms of OCTET STRING */ + +/* + * IA5String ASN.1 type definition. + */ +extern asn1_TYPE_descriptor_t asn1_DEF_IA5String; + +asn_constr_check_f IA5String_constraint; + +#endif /* _IA5String_H_ */ diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c new file mode 100644 index 000000000..b1a8c29b9 --- /dev/null +++ b/skeletons/INTEGER.c @@ -0,0 +1,305 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * INTEGER basic type description. + */ +static ber_tlv_tag_t asn1_DEF_INTEGER_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_INTEGER = { + "INTEGER", + asn_generic_no_constraint, + INTEGER_decode_ber, + INTEGER_encode_der, + INTEGER_print, + INTEGER_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_INTEGER_tags, + sizeof(asn1_DEF_INTEGER_tags)/sizeof(asn1_DEF_INTEGER_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + 0 /* Always in primitive form */ +}; + +/* + * Decode INTEGER type. + */ +ber_dec_rval_t +INTEGER_decode_ber(asn1_TYPE_descriptor_t *td, + void **int_structure, void *buf_ptr, size_t size, int tag_mode) { + INTEGER_t *st = *int_structure; + ber_dec_rval_t rval; + ber_dec_ctx_t ctx = { 0 }; + ber_tlv_len_t length; + + /* + * If the structure is not there, allocate it. + */ + if(st == NULL) { + st = *int_structure = CALLOC(1, sizeof(*st)); + if(st == NULL) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + } + + ASN_DEBUG("Decoding %s as INTEGER (tm=%d)", + td->name, tag_mode); + + /* + * Check tags. + */ + rval = ber_check_tags(td, &ctx, + buf_ptr, size, tag_mode, &length, 0); + if(rval.code != RC_OK) + return rval; + + ASN_DEBUG("%s length is %d bytes", td->name, (int)length); + + /* + * Make sure we have this length. + */ + buf_ptr += rval.consumed; + size -= rval.consumed; + if(length > size) { + rval.code = RC_WMORE; + rval.consumed = 0; + return rval; + } + + st->buf = MALLOC(length); + if(st->buf) { + st->size = length; + } else { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + + memcpy(st->buf, buf_ptr, st->size); + + rval.code = RC_OK; + rval.consumed += length; + + ASN_DEBUG("Took %ld/%ld bytes to encode %s", + (long)rval.consumed, + (long)length, td->name); + + return rval; +} + +/* + * Encode INTEGER type using DER. + */ +der_enc_rval_t +INTEGER_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + der_enc_rval_t erval; + INTEGER_t *st = ptr; + + ASN_DEBUG("%s %s as INTEGER (tm=%d)", + cb?"Encoding":"Estimating", sd->name, tag_mode); + + /* + * Canonicalize integer in the buffer. + * (Remove too long sign extension, remove some first 0x00 bytes) + */ + if(st->buf) { + uint8_t *buf = st->buf; + uint8_t *end1 = buf + st->size - 1; + int shift; + + /* Compute the number of superfluous leading bytes */ + for(; buf < end1; buf++) { + /* + * If the contents octets of an integer value encoding + * consist of more than one octet, then the bits of the + * first octet and bit 8 of the second octet: + * a) shall not all be ones; and + * b) shall not all be zero. + */ + switch(*buf) { + case 0x00: if((buf[1] & 0x80) == 0) + continue; + break; + case 0xff: if((buf[1] & 0x80)) + continue; + break; + } + break; + } + + /* Remove leading superfluous bytes from the integer */ + shift = buf - st->buf; + if(shift) { + uint8_t *nb = st->buf; + uint8_t *end; + + st->size -= shift; /* New size, minus bad bytes */ + end = nb + st->size; + + for(; nb < end; nb++, buf++) + *nb = *buf; + } + + } /* if(1) */ + + erval.encoded = der_write_tags(sd, st->size, tag_mode, tag, + cb, app_key); + ASN_DEBUG("INTEGER %s wrote tags %d", sd->name, (int)erval.encoded); + if(erval.encoded == -1) { + erval.failed_type = sd; + erval.structure_ptr = ptr; + return erval; + } + + if(cb && st->buf) { + ssize_t ret; + + ret = cb(st->buf, st->size, app_key); + if(ret == -1) { + erval.encoded = -1; + erval.failed_type = sd; + erval.structure_ptr = ptr; + return erval; + } + } else { + assert(st->buf || st->size == 0); + } + + erval.encoded += st->size; + + return erval; +} + +/* + * INTEGER specific human-readable output. + */ +int +INTEGER_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const INTEGER_t *st = sptr; + char scratch[32]; + uint8_t *buf = st->buf; + uint8_t *buf_end = st->buf + st->size; + signed long accum; + char *p; + int ret; + + if(!st && !st->buf) return cb("", 8, app_key); + + if(st->size == 0) + return cb("0", 1, app_key); + + /* Simple case: the integer size is small */ + if(st->size < sizeof(accum) || (st->buf[0] & 0x80)) { + accum = (st->buf[0] & 0x80) ? -1 : 0; + for(; buf < buf_end; buf++) + accum = (accum << 8) | *buf; + ret = snprintf(scratch, sizeof(scratch), "%ld", accum); + assert(ret > 0 && ret < sizeof(scratch)); + return cb(scratch, ret, app_key); + } + + /* Output in the long xx:yy:zz... format */ + for(p = scratch; buf < buf_end; buf++) { + static char h2c[16] = "0123456789ABCDEF"; + if((p - scratch) >= (sizeof(scratch) / 2)) { + /* Flush buffer */ + if(cb(scratch, p - scratch, app_key)) + return -1; + p = scratch; + } + *p++ = h2c[*buf >> 4]; + *p++ = h2c[*buf & 0x0F]; + *p++ = ':'; + } + + return cb(scratch, p - scratch, app_key); +} + +void +INTEGER_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { + INTEGER_t *st = ptr; + + if(!td || !st) + return; + + ASN_DEBUG("Freeing %s as INTEGER (%d, %p, %p)", + td->name, contents_only, st, st->buf); + + if(st->buf) { + FREEMEM(st->buf); + } + + if(!contents_only) { + FREEMEM(st); + } +} + +int +asn1_INTEGER2long(const INTEGER_t *iptr, long *lptr) { + uint8_t *b, *end; + size_t size; + long l; + + /* Sanity checking */ + if(!iptr || !iptr->buf || !lptr) { + errno = EINVAL; + return -1; + } + + /* Cache the begin/end of the buffer */ + b = iptr->buf; /* Start of the INTEGER buffer */ + size = iptr->size; + end = b + size; /* Where to stop */ + + if(size > sizeof(long)) { + uint8_t *end1 = end - 1; + /* + * Slightly more advanced processing, + * able to >sizeof(long) bytes, + * when the actual value is small + * (0x0000000000abcdef would yield a fine 0x00abcdef) + */ + /* Skip out the insignificant leading bytes */ + for(; b < end1; b++) { + switch(*b) { + case 0x00: if((b[1] & 0x80) == 0) continue; break; + case 0xff: if((b[1] & 0x80) != 0) continue; break; + } + break; + } + + size = end - b; + if(size > sizeof(long)) { + /* Still cannot fit the long */ + errno = ERANGE; + return -1; + } + } + + /* Shortcut processing of a corner case */ + if(end == b) { + *lptr = 0; + return 0; + } + + /* Perform the sign initialization */ + /* Actually l = -(*b >> 7); gains nothing, yet unreadable! */ + if((*b >> 7)) l = -1; else l = 0; + + /* Conversion engine */ + for(; b < end; b++) + l = (l << 8) | *b; + + *lptr = l; + return 0; +} diff --git a/skeletons/INTEGER.h b/skeletons/INTEGER.h new file mode 100644 index 000000000..ef4d3f252 --- /dev/null +++ b/skeletons/INTEGER.h @@ -0,0 +1,33 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _INTEGER_H_ +#define _INTEGER_H_ + +#include + +typedef struct INTEGER { + uint8_t *buf; /* Buffer with consecutive INTEGER bits (big-endian) */ + int size; /* Size of the buffer */ +} INTEGER_t; + +extern asn1_TYPE_descriptor_t asn1_DEF_INTEGER; + +ber_type_decoder_f INTEGER_decode_ber; +der_type_encoder_f INTEGER_encode_der; +asn_struct_print_f INTEGER_print; +asn_struct_free_f INTEGER_free; + +/*********************************** + * Some handy conversion routines. * + ***********************************/ + +/* + * Returns 0 if it was possible to convert, -1 otherwise. + * -1/EINVAL: Mandatory argument missing + * -1/ERANGE: Value encoded is out of range for long representation + */ +int asn1_INTEGER2long(const INTEGER_t *i, long *l); + +#endif /* _INTEGER_H_ */ diff --git a/skeletons/ISO646String.c b/skeletons/ISO646String.c new file mode 100644 index 000000000..08b316987 --- /dev/null +++ b/skeletons/ISO646String.c @@ -0,0 +1,27 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include + +/* + * ISO646String basic type description. + */ +static ber_tlv_tag_t asn1_DEF_ISO646String_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_ISO646String = { + "ISO646String", + VisibleString_constraint, + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_print_ascii, /* ASCII subset */ + OCTET_STRING_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_ISO646String_tags, + sizeof(asn1_DEF_ISO646String_tags) + / sizeof(asn1_DEF_ISO646String_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + -1, /* Both ways are fine */ +}; + diff --git a/skeletons/ISO646String.h b/skeletons/ISO646String.h new file mode 100644 index 000000000..566ce3bea --- /dev/null +++ b/skeletons/ISO646String.h @@ -0,0 +1,15 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _ISO646String_H_ +#define _ISO646String_H_ + +#include +#include + +typedef VisibleString_t ISO646String_t; /* Implemented using VisibleString */ + +extern asn1_TYPE_descriptor_t asn1_DEF_ISO646String; + +#endif /* _ISO646String_H_ */ diff --git a/skeletons/Makefile.am b/skeletons/Makefile.am new file mode 100644 index 000000000..4a01bf3d2 --- /dev/null +++ b/skeletons/Makefile.am @@ -0,0 +1,7 @@ + +SUBDIRS = tests + +dist_pkgdata_DATA = *.[ch] +uninstall-local: + -@echo -n " " + -rm -f -r $(DESTDIR)$(pkgdatadir) diff --git a/skeletons/Makefile.in b/skeletons/Makefile.in new file mode 100644 index 000000000..e8f42241d --- /dev/null +++ b/skeletons/Makefile.in @@ -0,0 +1,364 @@ +# Makefile.in generated automatically by automake 1.5 from Makefile.am. + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_alias = @build_alias@ +build_triplet = @build@ +host_alias = @host_alias@ +host_triplet = @host@ +target_alias = @target_alias@ +target_triplet = @target@ +ADD_CFLAGS = @ADD_CFLAGS@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +AWK = @AWK@ +CC = @CC@ +CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPP = @CPP@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +EXEEXT = @EXEEXT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LEX = @LEX@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +MAINT = @MAINT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PATH = @PATH@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ +YACC = @YACC@ +am__include = @am__include@ +am__quote = @am__quote@ +install_sh = @install_sh@ + +SUBDIRS = tests + +dist_pkgdata_DATA = *.[ch] +subdir = skeletons +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +DIST_SOURCES = +DATA = $(dist_pkgdata_DATA) + + +RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \ + uninstall-info-recursive all-recursive install-data-recursive \ + install-exec-recursive installdirs-recursive install-recursive \ + uninstall-recursive check-recursive installcheck-recursive +DIST_COMMON = README $(dist_pkgdata_DATA) Makefile.am Makefile.in +DIST_SUBDIRS = $(SUBDIRS) +all: all-recursive + +.SUFFIXES: + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu skeletons/Makefile +Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && \ + CONFIG_HEADERS= CONFIG_LINKS= \ + CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status +uninstall-info-am: +install-dist_pkgdataDATA: $(dist_pkgdata_DATA) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(pkgdatadir) + @list='$(dist_pkgdata_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(pkgdatadir)/$$f"; \ + $(INSTALL_DATA) $$d$$p $(DESTDIR)$(pkgdatadir)/$$f; \ + done + +uninstall-dist_pkgdataDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_pkgdata_DATA)'; for p in $$list; do \ + f="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " rm -f $(DESTDIR)$(pkgdatadir)/$$f"; \ + rm -f $(DESTDIR)$(pkgdatadir)/$$f; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique $(LISP) + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) + +GTAGS: + here=`CDPATH=: && cd $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + $(mkinstalldirs) "$(distdir)/$$dir"; \ + fi; \ + if test -d $$d/$$file; then \ + cp -pR $$d/$$file $(distdir) \ + || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + for subdir in $(SUBDIRS); do \ + if test "$$subdir" = .; then :; else \ + test -d $(distdir)/$$subdir \ + || mkdir $(distdir)/$$subdir \ + || exit 1; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" \ + distdir=../$(distdir)/$$subdir \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(DATA) +installdirs: installdirs-recursive +installdirs-am: + $(mkinstalldirs) $(DESTDIR)$(pkgdatadir) + +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + +distclean-am: clean-am distclean-generic distclean-libtool \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +info: info-recursive + +info-am: + +install-data-am: install-dist_pkgdataDATA + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +uninstall-am: uninstall-dist_pkgdataDATA uninstall-info-am \ + uninstall-local + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \ + clean-generic clean-libtool clean-recursive distclean \ + distclean-generic distclean-libtool distclean-recursive \ + distclean-tags distdir dvi dvi-am dvi-recursive info info-am \ + info-recursive install install-am install-data install-data-am \ + install-data-recursive install-dist_pkgdataDATA install-exec \ + install-exec-am install-exec-recursive install-info \ + install-info-am install-info-recursive install-man \ + install-recursive install-strip installcheck installcheck-am \ + installdirs installdirs-am installdirs-recursive \ + maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-generic \ + mostlyclean-libtool mostlyclean-recursive tags tags-recursive \ + uninstall uninstall-am uninstall-dist_pkgdataDATA \ + uninstall-info-am uninstall-info-recursive uninstall-local \ + uninstall-recursive + +uninstall-local: + -@echo -n " " + -rm -f -r $(DESTDIR)$(pkgdatadir) +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/skeletons/NULL.c b/skeletons/NULL.c new file mode 100644 index 000000000..9027e2c1d --- /dev/null +++ b/skeletons/NULL.c @@ -0,0 +1,51 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include /* Implemented in terms of BOOLEAN type */ + +/* + * NULL basic type description. + */ +static ber_tlv_tag_t asn1_DEF_NULL_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_NULL = { + "NULL", + asn_generic_no_constraint, + BOOLEAN_decode_ber, /* Implemented in terms of BOOLEAN */ + NULL_encode_der, /* Special handling of DER encoding */ + NULL_print, + BOOLEAN_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_NULL_tags, + sizeof(asn1_DEF_NULL_tags)/sizeof(asn1_DEF_NULL_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + 0 /* Always in primitive form */ +}; + +der_enc_rval_t +NULL_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + der_enc_rval_t erval; + + erval.encoded = der_write_tags(sd, 0, tag_mode, tag, cb, app_key); + if(erval.encoded == -1) { + erval.failed_type = sd; + erval.structure_ptr = ptr; + } + + return erval; +} + +int +NULL_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + if(sptr) { + return cb("", 9, app_key); + } else { + return cb("", 8, app_key); + } +} diff --git a/skeletons/NULL.h b/skeletons/NULL.h new file mode 100644 index 000000000..14f5ffab7 --- /dev/null +++ b/skeletons/NULL.h @@ -0,0 +1,19 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _NULL_H_ +#define _NULL_H_ + +#include + +typedef struct NULL_s { + int value; +} NULL_t; + +extern asn1_TYPE_descriptor_t asn1_DEF_NULL; + +der_type_encoder_f NULL_encode_der; +asn_struct_print_f NULL_print; + +#endif /* _NULL_H_ */ diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c new file mode 100644 index 000000000..b6d21ed25 --- /dev/null +++ b/skeletons/NativeEnumerated.c @@ -0,0 +1,32 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * Please read the NativeInteger.h for the explanation wrt. differences between + * INTEGER and NativeInteger. + * Basically, both are decoders and encoders of ASN.1 INTEGER type, but this + * implementation deals with the standard (machine-specific) representation + * of them instead of using the platform-independent buffer. + */ +#include + +/* + * NativeEnumerated basic type description. + */ +static ber_tlv_tag_t asn1_DEF_NativeEnumerated_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_NativeEnumerated = { + "ENUMERATED", /* The ASN.1 type is still ENUMERATED */ + asn_generic_no_constraint, + NativeInteger_decode_ber, + NativeInteger_encode_der, + NativeInteger_print, + NativeInteger_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_NativeEnumerated_tags, + sizeof(asn1_DEF_NativeEnumerated_tags)/sizeof(asn1_DEF_NativeEnumerated_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + 0 /* Always in primitive form */ +}; diff --git a/skeletons/NativeEnumerated.h b/skeletons/NativeEnumerated.h new file mode 100644 index 000000000..681147c1c --- /dev/null +++ b/skeletons/NativeEnumerated.h @@ -0,0 +1,19 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * This type differs from the standard ENUMERATED in that it is modelled using + * the fixed machine type (long, int, short), so it can hold only values of + * limited length. There is no type (i.e., NativeEnumerated_t, any integer type + * will do). + * This type may be used when integer range is limited by subtype constraints. + */ +#ifndef _NativeEnumerated_H_ +#define _NativeEnumerated_H_ + +#include + +extern asn1_TYPE_descriptor_t asn1_DEF_NativeEnumerated; + +#endif /* _NativeEnumerated_H_ */ diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c new file mode 100644 index 000000000..d42540efb --- /dev/null +++ b/skeletons/NativeInteger.c @@ -0,0 +1,193 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * Please read the NativeInteger.h for the explanation wrt. differences between + * INTEGER and NativeInteger. + * Basically, both are decoders and encoders of ASN.1 INTEGER type, but this + * implementation deals with the standard (machine-specific) representation + * of them instead of using the platform-independent buffer. + */ +#include +#include +#include + +/* + * NativeInteger basic type description. + */ +static ber_tlv_tag_t asn1_DEF_NativeInteger_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_NativeInteger = { + "INTEGER", /* The ASN.1 type is still INTEGER */ + asn_generic_no_constraint, + NativeInteger_decode_ber, + NativeInteger_encode_der, + NativeInteger_print, + NativeInteger_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_NativeInteger_tags, + sizeof(asn1_DEF_NativeInteger_tags)/sizeof(asn1_DEF_NativeInteger_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + 0 /* Always in primitive form */ +}; + +/* + * Decode INTEGER type. + */ +ber_dec_rval_t +NativeInteger_decode_ber(asn1_TYPE_descriptor_t *td, + void **int_ptr, void *buf_ptr, size_t size, int tag_mode) { + int *Int = *int_ptr; + ber_dec_rval_t rval; + ber_dec_ctx_t ctx = { 0 }; + ber_tlv_len_t length; + + /* + * If the structure is not there, allocate it. + */ + if(Int == NULL) { + Int = *int_ptr = CALLOC(1, sizeof(*Int)); + if(Int == NULL) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + } + + ASN_DEBUG("Decoding %s as INTEGER (tm=%d)", + td->name, tag_mode); + + /* + * Check tags. + */ + rval = ber_check_tags(td, &ctx, + buf_ptr, size, tag_mode, &length, 0); + if(rval.code != RC_OK) + return rval; + + ASN_DEBUG("%s length is %d bytes", td->name, (int)length); + + /* + * Make sure we have this length. + */ + buf_ptr += rval.consumed; + size -= rval.consumed; + if(length > size) { + rval.code = RC_WMORE; + rval.consumed = 0; + return rval; + } + + /* + * ASN.1 encoded INTEGER: buf_ptr, length + * Fill the Int, at the same time checking for overflow. + * If overflow occured, return with RC_FAIL. + */ + { + INTEGER_t tmp; + long l; + tmp.buf = buf_ptr; + tmp.size = length; + + if(asn1_INTEGER2long(&tmp, &l)) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + + *Int = l; + + /* + * Note that int might be shorter than long. + * This expression hopefully will be optimized away + * by compiler. + */ + if(sizeof(int) != sizeof(long) && (*Int != l)) { + *Int = 0; /* Safe value */ + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + } + + rval.code = RC_OK; + rval.consumed += length; + + ASN_DEBUG("Took %ld/%ld bytes to encode %s (%d)", + (long)rval.consumed, (long)length, td->name, *Int); + + return rval; +} + +/* + * Encode the NativeInteger using the standard INTEGER type DER encoder. + */ +der_enc_rval_t +NativeInteger_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + unsigned int Int = *(unsigned int *)ptr; /* Disable sign ext. */ + der_enc_rval_t erval; + INTEGER_t tmp; + +#ifdef WORDS_BIGENDIAN /* Opportunistic optimization */ + + tmp.buf = ∬ + tmp.size = sizeof(Int); + +#else /* Works even if WORDS_BIGENDIAN is not set where should've been */ + uint8_t buf[sizeof(int)]; + uint8_t *p; + + /* Prepare fake INTEGER */ + for(p = buf + sizeof(buf) - 1; p >= buf; p--, Int >>= 8) + *p = Int & 0xff; + + tmp.buf = buf; + tmp.size = sizeof(buf); +#endif /* WORDS_BIGENDIAN */ + + /* Encode fake INTEGER */ + erval = INTEGER_encode_der(sd, &tmp, tag_mode, tag, cb, app_key); + if(erval.encoded == -1) { + assert(erval.structure_ptr == &tmp); + erval.structure_ptr = ptr; + } + return erval; +} + +/* + * INTEGER specific human-readable output. + */ +int +NativeInteger_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const int *Int = sptr; + char scratch[32]; + int ret; + + if(Int) { + ret = snprintf(scratch, sizeof(scratch), "%d", *Int); + assert(ret > 0 && ret < sizeof(scratch)); + return cb(scratch, ret, app_key); + } else { + return cb("", 8, app_key); + } +} + +void +NativeInteger_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { + + if(!td || !ptr) + return; + + ASN_DEBUG("Freeing %s as INTEGER (%d, %p, Native)", + td->name, contents_only, ptr); + + if(!contents_only) { + FREEMEM(ptr); + } +} + diff --git a/skeletons/NativeInteger.h b/skeletons/NativeInteger.h new file mode 100644 index 000000000..e0f26c784 --- /dev/null +++ b/skeletons/NativeInteger.h @@ -0,0 +1,24 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * This type differs from the standard INTEGER in that it is modelled using + * the fixed machine type (long, int, short), so it can hold only values of + * limited length. There is no type (i.e., NativeInteger_t, any integer type + * will do). + * This type may be used when integer range is limited by subtype constraints. + */ +#ifndef _NativeInteger_H_ +#define _NativeInteger_H_ + +#include + +extern asn1_TYPE_descriptor_t asn1_DEF_NativeInteger; + +ber_type_decoder_f NativeInteger_decode_ber; +der_type_encoder_f NativeInteger_encode_der; +asn_struct_print_f NativeInteger_print; +asn_struct_free_f NativeInteger_free; + +#endif /* _NativeInteger_H_ */ diff --git a/skeletons/NumericString.c b/skeletons/NumericString.c new file mode 100644 index 000000000..a007496cc --- /dev/null +++ b/skeletons/NumericString.c @@ -0,0 +1,62 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include + +/* + * NumericString basic type description. + */ +static ber_tlv_tag_t asn1_DEF_NumericString_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (18 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_NumericString = { + "NumericString", + NumericString_constraint, + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_print_ascii, /* ASCII subset */ + OCTET_STRING_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_NumericString_tags, + sizeof(asn1_DEF_NumericString_tags) + / sizeof(asn1_DEF_NumericString_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + -1, /* Both ways are fine */ +}; + +int +NumericString_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const NumericString_t *st = sptr; + + if(st && st->buf) { + uint8_t *buf = st->buf; + uint8_t *end = buf + st->size; + + /* + * Check the alphabet of the NumericString. + * ASN.1:1984 (X.409) + */ + for(; buf < end; buf++) { + switch(*buf) { + case 0x20: + case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: + case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: + continue; + } + _ASN_ERRLOG("%s: value byte %d " + "not in NumericString alphabet (%d)", + td->name, + (buf - st->buf) + 1, + *buf + ); + return -1; + } + } else { + _ASN_ERRLOG("%s: value not given", td->name); + return -1; + } + + return 0; +} diff --git a/skeletons/NumericString.h b/skeletons/NumericString.h new file mode 100644 index 000000000..71f72c769 --- /dev/null +++ b/skeletons/NumericString.h @@ -0,0 +1,17 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _NumericString_H_ +#define _NumericString_H_ + +#include +#include + +typedef OCTET_STRING_t NumericString_t; /* Implemented in terms of OCTET STRING */ + +extern asn1_TYPE_descriptor_t asn1_DEF_NumericString; + +asn_constr_check_f NumericString_constraint; + +#endif /* _NumericString_H_ */ diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c new file mode 100644 index 000000000..bcbcdcafa --- /dev/null +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -0,0 +1,356 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * OBJECT IDENTIFIER basic type description. + */ +static ber_tlv_tag_t asn1_DEF_OBJECT_IDENTIFIER_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_OBJECT_IDENTIFIER = { + "OBJECT IDENTIFIER", + OBJECT_IDENTIFIER_constraint, + INTEGER_decode_ber, /* Implemented in terms of INTEGER type */ + OBJECT_IDENTIFIER_encode_der, + OBJECT_IDENTIFIER_print, + INTEGER_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_OBJECT_IDENTIFIER_tags, + sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags) + / sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + 0 /* Always in primitive form */ +}; + + +/* + * Encode OBJECT IDENTIFIER type using DER. + */ +der_enc_rval_t +OBJECT_IDENTIFIER_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + der_enc_rval_t erval; + OBJECT_IDENTIFIER_t *st = ptr; + + ASN_DEBUG("%s %s as OBJECT IDENTIFIER (tm=%d)", + cb?"Encoding":"Estimating", sd->name, tag_mode); + + erval.encoded = der_write_tags(sd, st->size, tag_mode, tag, + cb, app_key); + ASN_DEBUG("OBJECT IDENTIFIER %s wrote tags %d", + sd->name, (int)erval.encoded); + if(erval.encoded == -1) { + erval.failed_type = sd; + erval.structure_ptr = ptr; + return erval; + } + + if(cb && st->buf) { + ssize_t ret; + + ret = cb(st->buf, st->size, app_key); + if(ret == -1) { + erval.encoded = -1; + erval.failed_type = sd; + erval.structure_ptr = ptr; + return erval; + } + } else { + assert(st->buf || st->size == 0); + } + + erval.encoded += st->size; + + return erval; +} + +int +OBJECT_IDENTIFIER_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const OBJECT_IDENTIFIER_t *st = sptr; + + if(st && st->buf) { + if(st->size < 1) { + _ASN_ERRLOG("%s: at least one numerical value expected", + td->name); + return -1; + } + } else { + _ASN_ERRLOG("%s: value not given", td->name); + return -1; + } + + return 0; +} + +int +OBJECT_IDENTIFIER_get_arc_l(uint8_t *arcbuf, int arclen, int add, unsigned long *rvalue) { + unsigned long accum; + uint8_t *arcend = arcbuf + arclen; + + if(arclen * 7 > 8 * sizeof(accum)) { + if(arclen * 7 <= 8 * (sizeof(accum) + 1)) { + if((*arcbuf & ~0x8f)) { + errno = ERANGE; /* Overflow */ + return -1; + } + } else { + errno = ERANGE; /* Overflow */ + return -1; + } + } + + /* Gather all bits into the accumulator */ + for(accum = 0; arcbuf < arcend; arcbuf++) + accum = (accum << 7) | (*arcbuf & ~0x80); + + accum += add; /* Actually, a negative value */ + assert(accum >= 0); + + *rvalue = accum; + + return 0; +} + +int +OBJECT_IDENTIFIER_print_arc(uint8_t *arcbuf, int arclen, int add, + asn_app_consume_bytes_f *cb, void *app_key) { + char scratch[64]; /* Conservative estimate */ + unsigned long accum; /* Bits accumulator */ + char *p; /* Position in the scratch buffer */ + + if(OBJECT_IDENTIFIER_get_arc_l(arcbuf, arclen, add, &accum)) + return -1; + + /* Fill the scratch buffer in reverse. */ + p = scratch + sizeof(scratch); + for(; accum; accum /= 10) + *(--p) = (accum % 10) + 0x30; + + return cb(p, sizeof(scratch) - (p - scratch), app_key); +} + +int +OBJECT_IDENTIFIER_print(asn1_TYPE_descriptor_t *td, const void *sptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + const OBJECT_IDENTIFIER_t *st = sptr; + int startn; + int add = 0; + int i; + + if(!st || !st->buf) + return cb("", 8, app_key); + + /* Dump preamble */ + if(cb("{ ", 2, app_key)) + return -1; + + for(i = 0, startn = 0; i < st->size; i++) { + uint8_t b = st->buf[i]; + if((b & 0x80)) /* Continuation expected */ + continue; + + if(startn == 0) { + /* + * First two arcs are encoded through the backdoor. + */ + if(i) { + add = -80; + if(cb("2", 1, app_key)) return -1; + } else if(b <= 39) { + add = 0; + if(cb("0", 1, app_key)) return -1; + } else if(b < 79) { + add = -40; + if(cb("1", 1, app_key)) return -1; + } else { + add = -80; + if(cb("2", 1, app_key)) return -1; + } + } + + if(cb(" ", 1, app_key)) /* Separate arcs */ + return -1; + + if(OBJECT_IDENTIFIER_print_arc(&st->buf[startn], + i - startn + 1, add, + cb, app_key)) + return -1; + startn = i + 1; + add = 0; + } + + return cb(" }", 2, app_key); +} + +int +OBJECT_IDENTIFIER_get_arcs_l(OBJECT_IDENTIFIER_t *oid, + unsigned long *arcs, int arcs_slots) { + unsigned long arc_value; + int cur_arc = 0; + int startn = 0; + int add = 0; + int i; + + if(!oid || !oid->buf) { + errno = EINVAL; + return -1; + } + + for(i = 0; i < oid->size; i++) { + uint8_t b = oid->buf[i]; + if((b & 0x80)) /* Continuation expected */ + continue; + + if(startn == 0) { + /* + * First two arcs are encoded through the backdoor. + */ + if(i) { + add = -80; + if(cur_arc < arcs_slots) arcs[cur_arc] = 2; + cur_arc++; + } else if(b <= 39) { + add = 0; + if(cur_arc < arcs_slots) arcs[cur_arc] = 0; + cur_arc++; + } else if(b < 79) { + add = -40; + if(cur_arc < arcs_slots) arcs[cur_arc] = 1; + cur_arc++; + } else { + add = -80; + if(cur_arc < arcs_slots) arcs[cur_arc] = 2; + cur_arc++; + } + } + + /* Do not fill */ + if(cur_arc >= arcs_slots) { + startn = i + 1; + continue; + } + + if(OBJECT_IDENTIFIER_get_arc_l(&oid->buf[startn], + i - startn + 1, + add, &arc_value)) + return -1; + arcs[cur_arc++] = arc_value; + startn = i + 1; + add = 0; + } + + return cur_arc; +} + +int +OBJECT_IDENTIFIER_set_arcs_l(OBJECT_IDENTIFIER_t *oid, unsigned long *arcs, int arcs_slots) { + uint8_t *buf; + uint8_t *bp; + unsigned long long first_value; + int size; + int i; + + if(oid == NULL || arcs == NULL || arcs_slots < 2) { + errno = EINVAL; + return -1; + } + + if(arcs[0] <= 1) { + if(arcs[1] >= 39) { + /* 8.19.4: At most 39 subsequent values (including 0) */ + errno = ERANGE; + return -1; + } + } else if(arcs[0] > 2) { + /* 8.19.4: Only three values are allocated from the root node */ + errno = ERANGE; + return -1; + } + + first_value = arcs[0] * 40 + arcs[1]; + + /* + * Roughly estimate the maximum size necessary to encode these arcs. + */ + size = ((sizeof(arcs[0]) + 1) * 8 / 7) * arcs_slots; + bp = buf = MALLOC(size + 1); + if(!buf) { + /* ENOMEM */ + return -1; + } + + /* + * Encode the arcs and refine the encoding size. + */ + size = 0; + + { + uint8_t tbuf[sizeof(first_value) * 2]; + uint8_t *tp = tbuf; + int arc_len = 0; + int add = 0; + + for(; first_value; first_value >>= 7) { + unsigned int b7 = first_value & 0x7f; + *tp++ = 0x80 | b7; + add++; + if(b7) { arc_len += add; add = 0; } + } + + if(arc_len) { + tp = &tbuf[arc_len - 1]; + /* The last octet does not have bit 8 set. */ + *tbuf &= 0x7f; + for(; tp >= tbuf; tp--) + *bp++ = *tp; + size += arc_len; + } else { + *bp++ = 0; + size++; + } + } + + for(i = 2; i < arcs_slots; i++) { + unsigned long value = arcs[i]; + uint8_t tbuf[sizeof(value) * 2]; /* Conservatively sized */ + uint8_t *tp = tbuf; + int arc_len = 0; + int add = 0; + + for(; value; value >>= 7) { + unsigned int b7 = value & 0x7F; + *tp++ = 0x80 | b7; + add++; + if(b7) { arc_len += add; add = 0; } + } + + if(arc_len) { + tp = &tbuf[arc_len - 1]; + /* The last octet does not have bit 8 set. */ + *tbuf &= 0x7f; + for(; tp >= tbuf; tp--) + *bp++ = *tp; + size += arc_len; + } else { + *bp++ = 0; + size++; + } + } + + /* + * Replace buffer. + */ + oid->size = size; + bp = oid->buf; + oid->buf = buf; + if(bp) FREEMEM(bp); + + return 0; +} diff --git a/skeletons/OBJECT_IDENTIFIER.h b/skeletons/OBJECT_IDENTIFIER.h new file mode 100644 index 000000000..3e71f3168 --- /dev/null +++ b/skeletons/OBJECT_IDENTIFIER.h @@ -0,0 +1,95 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _OBJECT_IDENTIFIER_H_ +#define _OBJECT_IDENTIFIER_H_ + +#include +#include + +typedef INTEGER_t OBJECT_IDENTIFIER_t; /* Implemented in terms of INTEGER */ + +extern asn1_TYPE_descriptor_t asn1_DEF_OBJECT_IDENTIFIER; + +der_type_encoder_f OBJECT_IDENTIFIER_encode_der; +asn_constr_check_f OBJECT_IDENTIFIER_constraint; +asn_struct_print_f OBJECT_IDENTIFIER_print; + +/********************************** + * Some handy conversion routines * + **********************************/ + +/* + * Print the specified OBJECT IDENTIFIER arc. + */ +int OBJECT_IDENTIFIER_print_arc(uint8_t *arcbuf, int arclen, + int add, /* Arbitrary offset, required to process the first two arcs */ + asn_app_consume_bytes_f *cb, void *app_key); + +/* + * This function fills an (_arcs) array with OBJECT IDENTIFIER arcs + * up to specified (_arcs_slots) elements. + * The function always returns the real number of arcs, even if there is no + * sufficient (_arcs_slots) provided. + * + * EXAMPLE: + * void print_arcs(OBJECT_IDENTIFIER_t *oid) { + * unsigned long fixed_arcs[10]; // Try with fixed space first + * unsigned long *arcs = fixed_arcs; + * int arcs_slots = sizeof(fixed_arcs)/sizeof(fixed_arcs[0]); // 10 + * int count; // Real number of arcs. + * int i; + * + * count = OBJECT_IDENTIFIER_get_arcs_l(oid, arcs, arcs_slots); + * // If necessary, reallocate arcs array and try again. + * if(count > arcs_slots) { + * arcs_slots = count; + * arcs = malloc(arcs_slots * sizeof(arcs[0])); + * if(!arcs) return; + * count = OBJECT_IDENTIFIER_get_arcs_l(oid, + * arcs, arcs_slots); + * assert(count == arcs_slots); + * } + * + * // Print the contents of the arcs array. + * for(i = 0; i < count; i++) + * printf("%d\n", arcs[i]); + * + * // Avoid memory leak. + * if(arcs != fixed_arcs) free(arcs); + * } + * + * RETURN VALUES: + * -1/EINVAL: Invalid arguments (oid is missing) + * -1/ERANGE: One or more arcs have value out of array cell type range. + * >=0: Number of arcs contained in the OBJECT IDENTIFIER + */ +int OBJECT_IDENTIFIER_get_arcs_l(OBJECT_IDENTIFIER_t *_oid, + unsigned long *_arcs, int _arcs_slots); +/* +int OBJECT_IDENTIFIER_get_arcs_im(OBJECT_IDENTIFIER_t *_oid, + uintmax_t *_arcs, int _arcs_slots); + */ + + +/* + * This functions initializes the OBJECT IDENTIFIER object with + * the given set of arcs. + * The minimum of two arcs must be present; some restrictions apply. + * RETURN VALUES: + * -1/EINVAL: Invalid arguments + * -1/ERANGE: The first two arcs do not conform to ASN.1 restrictions. + * -1/ENOMEM: Memory allocation failed + * 0: The object was initialized with new arcs. + */ +int OBJECT_IDENTIFIER_set_arcs_l(OBJECT_IDENTIFIER_t *_oid, + unsigned long *arcs, int arcs_slots); + +/* + * Internal functions. + */ +int OBJECT_IDENTIFIER_get_arc_l(uint8_t *arcbuf, int arclen, + int add, unsigned long *value); + +#endif /* _OBJECT_IDENTIFIER_H_ */ diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c new file mode 100644 index 000000000..fc5c532c5 --- /dev/null +++ b/skeletons/OCTET_STRING.c @@ -0,0 +1,588 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * OCTET STRING basic type description. + */ +static ber_tlv_tag_t asn1_DEF_OCTET_STRING_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { + "OCTET STRING", + asn_generic_no_constraint, + OCTET_STRING_decode_ber, + OCTET_STRING_encode_der, + OCTET_STRING_print, /* non-ascii stuff, generally */ + OCTET_STRING_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_OCTET_STRING_tags, + sizeof(asn1_DEF_OCTET_STRING_tags) + / sizeof(asn1_DEF_OCTET_STRING_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + -1, /* Both ways are fine (primitive and constructed) */ +}; + +#define _CH_PHASE(ctx, inc) do { \ + if(ctx->phase == 0) \ + ctx->step = 0; \ + ctx->phase += inc; \ + } while(0) +#define NEXT_PHASE(ctx) _CH_PHASE(ctx, +1) +#define PREV_PHASE(ctx) _CH_PHASE(ctx, -1) + +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + buf_ptr += num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +#define APPEND(bufptr, bufsize) do { \ + int _ns = ctx->step; /* Allocated */ \ + if(_ns <= (st->size + bufsize)) { \ + void *ptr; \ + do { _ns = _ns ? _ns<<2 : 16; } \ + while(_ns <= (st->size + bufsize)); \ + ptr = REALLOC(st->buf, _ns); \ + if(ptr) { \ + st->buf = ptr; \ + ctx->step = _ns; \ + } else { \ + RETURN(RC_FAIL); \ + } \ + } \ + memcpy(st->buf + st->size, bufptr, bufsize); \ + st->size += bufsize; \ + if(st->size < 0) \ + /* Why even care?.. JIC */ \ + RETURN(RC_FAIL); \ + /* Convenient nul-termination */ \ + st->buf[st->size] = '\0'; \ + } while(0) + +/* + * The main reason why ASN.1 is still alive is that too much time and effort + * is necessary for learning it more or less adequately, thus creating a gut + * necessity to demonstrate that aquired skill everywhere afterwards. + * No, I am not going to explain what the following stuff is. + */ +struct _stack_el { + ber_tlv_len_t left; /* What's left to read */ + int want_nulls; /* Want null "end of content" octets? */ + int bits_chopped; /* Flag in BIT STRING mode */ + struct _stack_el *prev; + struct _stack_el *next; +}; +struct _stack { + struct _stack_el *tail; + struct _stack_el *cur_ptr; +}; + +static struct _stack_el * +_add_stack_el(struct _stack *st) { + struct _stack_el *nel; + + if(st->cur_ptr && st->cur_ptr->next) { + nel = st->cur_ptr->next; + nel->left = 0; + nel->want_nulls = 0; + nel->bits_chopped = 0; + } else { + nel = CALLOC(1, sizeof(struct _stack_el)); + if(nel == NULL) + return NULL; + + if(st->tail) { + st->tail->next = nel; + } + nel->prev = st->tail; + st->tail = nel; + } + + st->cur_ptr = nel; + + return nel; +} + +static struct _stack * +_new_stack() { + struct _stack *st; + st = CALLOC(1, sizeof(struct _stack)); + if(st == NULL) + return NULL; + + st->cur_ptr = _add_stack_el(st); + if(st->cur_ptr == NULL) { + FREEMEM(st); + return NULL; + } + + return st; +} + +/* + * Decode OCTET STRING type. + */ +ber_dec_rval_t +OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, + void **os_structure, void *buf_ptr, size_t size, int tag_mode) { + OCTET_STRING_t *st = *os_structure; + ber_dec_rval_t rval; + ber_dec_ctx_t *ctx; + ssize_t consumed_myself = 0; + struct _stack *stck; /* A stack structure */ + struct _stack_el *sel; /* Stack element */ + int tlv_constr; + /* + * This is a some sort of a hack. + * The OCTET STRING decoder is being used in BIT STRING mode. + */ + int is_bit_str = td->specifics?1:0; + + ASN_DEBUG("Decoding %s as %s (%ld)", + td->name, + is_bit_str ? "BIT STRING" : "OCTET STRING", + (long)size); + + /* + * Create the string if does not exist. + */ + if(st == NULL) { + st = *os_structure = CALLOC(1, sizeof(*st)); + if(st == NULL) + RETURN(RC_FAIL); + } + + /* Restore parsing context */ + ctx = &st->_ber_dec_ctx; + + switch(ctx->phase) { + case 0: + /* + * Check tags. + */ + rval = ber_check_tags(td, ctx, + buf_ptr, size, tag_mode, + &ctx->left, &tlv_constr); + if(rval.code != RC_OK) { + RETURN(rval.code); + } + + ASN_DEBUG("OS length is %d bytes, form %d", + (int)ctx->left, tlv_constr); + + if(tlv_constr) { + /* + * Complex operation, requires stack of expectations. + */ + ctx->ptr = _new_stack(); + if(ctx->ptr) { + stck = ctx->ptr; + if(ctx->left < 0) { + stck->cur_ptr->want_nulls = -ctx->left; + stck->cur_ptr->left = -1; + } else { + stck->cur_ptr->want_nulls = 0; + stck->cur_ptr->left = ctx->left; + } + ASN_DEBUG("Expectation left=%d wn=%d added", + stck->cur_ptr->left, + stck->cur_ptr->want_nulls); + if(is_bit_str) { + APPEND("\0", 1); + } + } else { + RETURN(RC_FAIL); + } + } else { + /* + * Jump into stackless primitive decoding. + */ + _CH_PHASE(ctx, 3); + ADVANCE(rval.consumed); + goto phase3; + } + + ADVANCE(rval.consumed); + NEXT_PHASE(ctx); + /* Fall through */ + case 1: + phase1: + /* + * Fill the stack with expectations. + */ + stck = ctx->ptr; + sel = stck->cur_ptr; + do { + ber_tlv_tag_t tlv_tag; + ber_tlv_len_t tlv_len; + ssize_t tl, ll; + + tl = ber_fetch_tag(buf_ptr, size, &tlv_tag); + switch(tl) { + case -1: RETURN(RC_FAIL); + case 0: RETURN(RC_WMORE); + } + + tlv_constr = BER_TLV_CONSTRUCTED(buf_ptr); + + ll = ber_fetch_length(tlv_constr, + buf_ptr + tl, size - tl, &tlv_len); + ASN_DEBUG("Got tag=%s, tl=%d, len=%d, ll=%d, {%d, %d}", + ber_tlv_tag_string(tlv_tag), tl, tlv_len, ll, + ((uint8_t *)buf_ptr)[0], + ((uint8_t *)buf_ptr)[1]); + switch(ll) { + case -1: RETURN(RC_FAIL); + case 0: RETURN(RC_WMORE); + } + + if(sel->want_nulls + && ((uint8_t *)buf_ptr)[0] == 0 + && ((uint8_t *)buf_ptr)[1] == 0) + { + sel->want_nulls--; + if(sel->want_nulls == 0) { + /* Move to the next expectation */ + sel = stck->cur_ptr = sel->prev; + if(sel == NULL) { + ADVANCE(2); + break; + } + } + if(sel->want_nulls) { + /* + * Simulate while(TRUE) for this loop. + * This is necessary to fetch the next + * "end of content" expectation. + */ + ADVANCE(2); + tlv_constr = 1; + continue; + } + } else if(tlv_tag != td->tags[td->tags_count-1]) { + char buf[2][32]; + ber_tlv_tag_snprint(tlv_tag, + buf[0], sizeof(buf[0])); + ber_tlv_tag_snprint(td->tags[td->tags_count-1], + buf[1], sizeof(buf[1])); + ASN_DEBUG("Tag does not match expectation: %s != %s", + buf[0], buf[1]); + RETURN(RC_FAIL); + } + + /* + * Append a new expectation. + */ + sel = _add_stack_el(stck); + if(sel) { + sel->want_nulls = (tlv_len==-1); + sel->left = tlv_len; + ASN_DEBUG("Expectation %d %d added", + sel->left, sel->want_nulls); + } else { + RETURN(RC_FAIL); + } + + ADVANCE(tl+ll); + } while(tlv_constr); + if(sel == NULL) { + /* Finished operation, "phase out" */ + _CH_PHASE(ctx, +3); + break; + } + + NEXT_PHASE(ctx); + /* Fall through */ + case 2: + stck = ctx->ptr; + sel = stck->cur_ptr; + ASN_DEBUG("Phase 2: Need %ld bytes, size=%ld", + (long)sel->left, (long)size); + { + ber_tlv_len_t len; + + assert(sel->left >= 0); + + len = (size < sel->left) ? size : sel->left; + if(len > 0) { + if(is_bit_str && sel->bits_chopped == 0) { + /* + * Finalize the previous chunk: + * strip down unused bits. + */ + st->buf[st->size-1] &= 0xff << st->buf[0]; + + APPEND((buf_ptr+1), (len - 1)); + st->buf[0] = *(uint8_t *)buf_ptr; + sel->bits_chopped = 1; + } else { + APPEND(buf_ptr, len); + } + ADVANCE(len); + sel->left -= len; + } + + if(sel->left) { + RETURN(RC_WMORE); + } else { + sel->left = 0; + if(sel->prev) + sel = stck->cur_ptr = sel->prev; + PREV_PHASE(ctx); + goto phase1; + } + } + break; + case 3: + phase3: + /* + * Primitive form, no stack required. + */ + if(size < ctx->left) { + APPEND(buf_ptr, size); + ctx->left -= size; + ADVANCE(size); + RETURN(RC_WMORE); + } else { + APPEND(buf_ptr, ctx->left); + ADVANCE(ctx->left); + ctx->left = 0; + + NEXT_PHASE(ctx); + } + break; + } + + /* + * BIT STRING-specific processing. + */ + if(is_bit_str && st->size >= 2) { + /* Finalize BIT STRING: zero out unused bits. */ + st->buf[st->size-1] &= 0xff << st->buf[0]; + } + + ASN_DEBUG("Took %d bytes to encode %s: [%s]:%d", + consumed_myself, td->name, st->buf, st->size); + + rval.code = RC_OK; + rval.consumed = consumed_myself; + + return rval; +} + +/* + * Encode OCTET STRING type using DER. + */ +der_enc_rval_t +OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + der_enc_rval_t erval; + OCTET_STRING_t *st = ptr; + int add_byte = 0; + + ASN_DEBUG("%s %s as OCTET STRING", + cb?"Estimating":"Encoding", sd->name); + + /* + * Canonicalize BIT STRING. + */ + if(sd->specifics && st->buf) { + switch(st->size) { + case 0: add_byte = 1; break; + case 1: st->buf[0] = 0; break; + default: + /* Finalize BIT STRING: zero out unused bits. */ + st->buf[st->size-1] &= 0xff << st->buf[0]; + } + } + + erval.encoded = der_write_tags(sd, st->size + add_byte, tag_mode, tag, + cb, app_key); + if(erval.encoded == -1) { + erval.failed_type = sd; + erval.structure_ptr = ptr; + return erval; + } + + if(cb) { + uint8_t zero; + uint8_t *buf; + int size; + ssize_t ret; + + /* BIT STRING-aware handling */ + if(add_byte) { + zero = 0; + buf = &zero; + size = 1; + } else if(st->buf) { + buf = st->buf; + size = st->size; + } else { + assert(st->size == 0); + buf = 0; /* Not used */ + size = 0; + } + + if(size) { + ret = cb(buf, size, app_key); + if(ret == -1) { + erval.encoded = -1; + erval.failed_type = sd; + erval.structure_ptr = ptr; + return erval; + } + } + } + + erval.encoded += st->size + add_byte; + + return erval; +} + +int +OCTET_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + static char h2c[16] = "0123456789ABCDEF"; + const OCTET_STRING_t *st = sptr; + char scratch[16 * 3 + 4]; + char *p = scratch; + uint8_t *buf; + uint8_t *end; + size_t i; + int ret; + + if(!st || !st->buf) return cb("", 8, app_key); + + /* + * Dump the contents of the buffer in hexadecimal. + */ + buf = st->buf; + end = buf + st->size; + for(i = 0; buf < end; buf++, i++) { + if(!(i % 16) && (i || st->size > 16)) { + if(cb(scratch, p - scratch, app_key) + || cb("\n", 1, app_key)) + return -1; + for(ret = 0; ret < ilevel; ret++) + cb(" ", 1, app_key); + p = scratch; + } + *p++ = h2c[(*buf >> 4) & 0x0F]; + *p++ = h2c[*buf & 0x0F]; + *p++ = ' '; + } + + return cb(scratch, p - scratch, app_key); +} + +int +OCTET_STRING_print_ascii(asn1_TYPE_descriptor_t *td, const void *sptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + const OCTET_STRING_t *st = sptr; + + if(st && st->buf) { + return cb(st->buf, st->size, app_key); + } else { + return cb("", 8, app_key); + } +} + +void +OCTET_STRING_free(asn1_TYPE_descriptor_t *td, void *sptr, int contents_only) { + OCTET_STRING_t *st = sptr; + struct _stack *stck = st->_ber_dec_ctx.ptr; + + if(!td || !st) + return; + + ASN_DEBUG("Freeing %s as OCTET STRING", td->name); + + if(st->buf) { + FREEMEM(st->buf); + } + + /* + * Remove decode-time stack. + */ + if(stck) { + while(stck->tail) { + struct _stack_el *sel = stck->tail; + stck->tail = sel->prev; + FREEMEM(sel); + } + FREEMEM(stck); + } + + if(!contents_only) { + FREEMEM(st); + } +} + +/* + * Conversion routines. + */ +int +OCTET_STRING_fromBuf(OCTET_STRING_t *st, const char *str, int len) { + void *buf; + + if(st == 0 || (str == 0 && len)) { + errno = EINVAL; + return -1; + } + + /* + * Clear the OCTET STRING. + */ + if(str == NULL) { + if(st->buf) + FREEMEM(st->buf); + st->size = 0; + return 0; + } + + /* Determine the original string size, if not explicitly given */ + if(len < 0) + len = strlen(str); + + /* Allocate and fill the memory */ + buf = MALLOC(len + 1); + if(buf == NULL) { + return -1; + } else { + st->buf = buf; + st->size = len; + } + + memcpy(buf, str, len); + st->buf[st->size] = '\0'; /* Couldn't use memcpy(len+1)! */ + + return 0; +} + +OCTET_STRING_t * +OCTET_STRING_new_fromBuf(const char *str, int len) { + OCTET_STRING_t *st; + + st = CALLOC(1, sizeof(*st)); + if(st && str && OCTET_STRING_fromBuf(st, str, len)) { + free(st); + st = NULL; + } + + return st; +} + diff --git a/skeletons/OCTET_STRING.h b/skeletons/OCTET_STRING.h new file mode 100644 index 000000000..1aed9a353 --- /dev/null +++ b/skeletons/OCTET_STRING.h @@ -0,0 +1,51 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _OCTET_STRING_H_ +#define _OCTET_STRING_H_ + +#include + +typedef struct OCTET_STRING { + uint8_t *buf; /* Buffer with consecutive OCTET_STRING bits */ + int size; /* Size of the buffer */ + + ber_dec_ctx_t _ber_dec_ctx; /* Parsing across buffer boundaries */ +} OCTET_STRING_t; + +extern asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING; + +ber_type_decoder_f OCTET_STRING_decode_ber; +der_type_encoder_f OCTET_STRING_encode_der; +asn_struct_print_f OCTET_STRING_print; +asn_struct_print_f OCTET_STRING_print_ascii; +asn_struct_free_f OCTET_STRING_free; + +/*********************************** + * Some handy conversion routines. * + ***********************************/ + +/* + * This function clears the previous value of the OCTET STRING (if any) + * and then allocates a new memory and makes s point to the newly allocated + * memory. If size = -1, the size of the original string will be determined + * using strlen(str). + * If str equals to NULL, the function will silently clear the + * current contents of the OCTET STRING. + * Returns 0 if it was possible to perform operation, -1 otherwise. + */ +int OCTET_STRING_fromBuf(OCTET_STRING_t *s, const char *str, int size); + +/* + * Allocate and fill the new OCTET STRING and return a pointer to the newly + * allocated object. NULL is permitted in str: the function will just allocate + * empty OCTET STRING. + */ +OCTET_STRING_t *OCTET_STRING_new_fromBuf(const char *str, int size); + +/* Handy conversion from the C string into the OCTET STRING. */ +#define OCTET_STRING_fromString(s, str) OCTET_STRING_fromBuf(s, str, -1); +#define OCTET_STRING_fromString(s, str) OCTET_STRING_fromBuf(s, str, -1); + +#endif /* _OCTET_STRING_H_ */ diff --git a/skeletons/ObjectDescriptor.c b/skeletons/ObjectDescriptor.c new file mode 100644 index 000000000..5a39380c4 --- /dev/null +++ b/skeletons/ObjectDescriptor.c @@ -0,0 +1,27 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include + +/* + * ObjectDescriptor basic type description. + */ +static ber_tlv_tag_t asn1_DEF_ObjectDescriptor_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (7 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_ObjectDescriptor = { + "ObjectDescriptor", + asn_generic_unknown_constraint, + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_print_ascii, /* Treat as ASCII subset (it's not) */ + OCTET_STRING_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_ObjectDescriptor_tags, + sizeof(asn1_DEF_ObjectDescriptor_tags) + / sizeof(asn1_DEF_ObjectDescriptor_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + -1, /* Both ways are fine */ +}; + diff --git a/skeletons/ObjectDescriptor.h b/skeletons/ObjectDescriptor.h new file mode 100644 index 000000000..67addf243 --- /dev/null +++ b/skeletons/ObjectDescriptor.h @@ -0,0 +1,15 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _ObjectDescriptor_H_ +#define _ObjectDescriptor_H_ + +#include +#include + +typedef GraphicString_t ObjectDescriptor_t; /* Implemented in terms of. */ + +extern asn1_TYPE_descriptor_t asn1_DEF_ObjectDescriptor; + +#endif /* _ObjectDescriptor_H_ */ diff --git a/skeletons/PrintableString.c b/skeletons/PrintableString.c new file mode 100644 index 000000000..32ee7da54 --- /dev/null +++ b/skeletons/PrintableString.c @@ -0,0 +1,81 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include + +/* + * PrintableString basic type description. + */ +static ber_tlv_tag_t asn1_DEF_PrintableString_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (19 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_PrintableString = { + "PrintableString", + PrintableString_constraint, + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_print_ascii, /* ASCII subset */ + OCTET_STRING_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_PrintableString_tags, + sizeof(asn1_DEF_PrintableString_tags) + / sizeof(asn1_DEF_PrintableString_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + -1, /* Both ways are fine */ +}; + + +/* + * ASN.1:1984 (X.409) + */ +static int _PrintableString_alphabet[256] = { +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, /* ' */ +0x41, 0x42, 0x00, 0x43, 0x44, 0x45, 0x46, 0x47, /* ( ) + , - . / */ +0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, /* 0 1 2 3 4 5 6 7 */ +0x3d, 0x3e, 0x48, 0x00, 0x00, 0x49, 0x00, 0x4a, /* 8 9 : = ? */ +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* A B C D E F G */ +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* H I J K L M N O */ +0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* P Q R S T U V W */ +0x18, 0x19, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, /* X Y Z */ +0x00, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, /* a b c d e f g */ +0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, /* h i j k l m n o */ +0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, /* p q r s t u v w */ +0x32, 0x33, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, /* x y z */ +}; + +int +PrintableString_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const PrintableString_t *st = sptr; + + if(st && st->buf) { + uint8_t *buf = st->buf; + uint8_t *end = buf + st->size; + + /* + * Check the alphabet of the PrintableString. + * ASN.1:1984 (X.409) + */ + for(; buf < end; buf++) { + if(!_PrintableString_alphabet[*buf]) { + _ASN_ERRLOG("%s: value byte %d " + "not in PrintableString alphabet (%d)", + td->name, + (buf - st->buf) + 1, + *buf + ); + return -1; + } + } + } else { + _ASN_ERRLOG("%s: value not given", td->name); + return -1; + } + + return 0; +} diff --git a/skeletons/PrintableString.h b/skeletons/PrintableString.h new file mode 100644 index 000000000..b44a61ec3 --- /dev/null +++ b/skeletons/PrintableString.h @@ -0,0 +1,17 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _PrintableString_H_ +#define _PrintableString_H_ + +#include +#include + +typedef OCTET_STRING_t PrintableString_t; /* Implemented in terms of OCTET STRING */ + +extern asn1_TYPE_descriptor_t asn1_DEF_PrintableString; + +asn_constr_check_f PrintableString_constraint; + +#endif /* _PrintableString_H_ */ diff --git a/skeletons/README b/skeletons/README new file mode 100644 index 000000000..29dbae634 --- /dev/null +++ b/skeletons/README @@ -0,0 +1,6 @@ + +Here are the canonical encoder/decoder algorithms that work with the tables +constructed by the compiler. The compiler itself does not generate code, +it just creates those tables and then copies (links) over these files +which contain generic algorithms. + diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c new file mode 100644 index 000000000..f6572105b --- /dev/null +++ b/skeletons/RELATIVE-OID.c @@ -0,0 +1,155 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * RELATIVE-OID basic type description. + */ +static ber_tlv_tag_t asn1_DEF_RELATIVE_OID_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (13 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_RELATIVE_OID = { + "RELATIVE-OID", + asn_generic_no_constraint, + INTEGER_decode_ber, /* Implemented in terms of INTEGER type */ + OBJECT_IDENTIFIER_encode_der, + RELATIVE_OID_print, + INTEGER_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_RELATIVE_OID_tags, + sizeof(asn1_DEF_RELATIVE_OID_tags) + / sizeof(asn1_DEF_RELATIVE_OID_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + 0 /* Always in primitive form */ +}; + +int +RELATIVE_OID_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const RELATIVE_OID_t *st = sptr; + int startn; + int i; + + if(!st || !st->buf) + return cb("", 8, app_key); + + /* Dump preamble */ + if(cb("{ ", 2, app_key)) + return -1; + + for(i = 0, startn = 0; i < st->size; i++) { + uint8_t b = st->buf[i]; + if((b & 0x80)) /* Continuation expected */ + continue; + if(startn && cb(" ", 1, app_key)) /* Separate arcs */ + return -1; + if(OBJECT_IDENTIFIER_print_arc(&st->buf[startn], + i - startn + 1, 0, cb, app_key)) + return -1; + startn = i + 1; + } + + return cb(" }", 2, app_key); +} + + +int +RELATIVE_OID_get_arcs_l(RELATIVE_OID_t *roid, + unsigned long *arcs, int arcs_slots) { + unsigned long arc_value; + int cur_arc = 0; + int startn = 0; + int i; + + if(!roid || !roid->buf) { + errno = EINVAL; + return -1; + } + + for(i = 0; i < roid->size; i++) { + uint8_t b = roid->buf[i]; + if((b & 0x80)) /* Continuation expected */ + continue; + + if(cur_arc < arcs_slots) { + if(OBJECT_IDENTIFIER_get_arc_l(&roid->buf[startn], + i - startn + 1, 0, &arc_value)) + return -1; + arcs[cur_arc++] = arc_value; + } + + startn = i + 1; + } + + return cur_arc; +} + +int +RELATIVE_OID_set_arcs_l(RELATIVE_OID_t *roid, unsigned long *arcs, int arcs_slots) { + uint8_t *buf; + uint8_t *bp; + int size; + int i; + + if(roid == NULL || arcs == NULL || arcs_slots < 0) { + errno = EINVAL; + return -1; + } + + /* + * Roughly estimate the maximum size necessary to encode these arcs. + */ + size = ((sizeof(arcs[0]) + 1) * 8 / 7) * arcs_slots; + bp = buf = MALLOC(size + 1); + if(!buf) { + /* ENOMEM */ + return -1; + } + + /* + * Encode the arcs and refine the encoding size. + */ + size = 0; + for(i = 0; i < arcs_slots; i++) { + unsigned long value = arcs[i]; + uint8_t tbuf[sizeof(value) * 2]; /* Conservatively sized */ + uint8_t *tp = tbuf; + int arc_len = 0; + int add; + + for(add = 1; value; value >>= 7, add++) { + unsigned int b7 = value & 0x7F; + *tp++ = 0x80 | b7; + if(b7) { + arc_len += add; + add = 0; + } + } + + if(arc_len) { + tp = &tbuf[arc_len - 1]; + /* The last octet does not have bit 8 set. */ + *tbuf &= 0x7f; + for(; tp >= tbuf; tp--) + *bp++ = *tp; + size += arc_len; + } else { + *bp++ = 0; + size++; + } + } + + /* + * Replace buffer. + */ + roid->size = size; + bp = roid->buf; + roid->buf = buf; + if(bp) FREEMEM(bp); + + return 0; +} diff --git a/skeletons/RELATIVE-OID.h b/skeletons/RELATIVE-OID.h new file mode 100644 index 000000000..c0bc680e1 --- /dev/null +++ b/skeletons/RELATIVE-OID.h @@ -0,0 +1,30 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _RELATIVE_OID_H_ +#define _RELATIVE_OID_H_ + +#include +#include + +/* Implemented in terms of OBJECT IDENTIFIER */ +typedef OBJECT_IDENTIFIER_t RELATIVE_OID_t; + +extern asn1_TYPE_descriptor_t asn1_DEF_RELATIVE_OID; + +asn_struct_print_f RELATIVE_OID_print; + +/********************************** + * Some handy conversion routines * + **********************************/ + +/* See OBJECT_IDENTIFIER_set_arcs_l() function in OBJECT_IDENTIFIER.h */ +int RELATIVE_OID_set_arcs_l(RELATIVE_OID_t *_roid, + unsigned long *arcs, int arcs_slots); + +/* See OBJECT_IDENTIFIER_get_arcs_l() function in OBJECT_IDENTIFIER.h */ +int RELATIVE_OID_get_arcs_l(RELATIVE_OID_t *_roid, + unsigned long *arcs, int arcs_slots); + +#endif /* _RELATIVE_OID_H_ */ diff --git a/skeletons/T61String.c b/skeletons/T61String.c new file mode 100644 index 000000000..e6dceb78d --- /dev/null +++ b/skeletons/T61String.c @@ -0,0 +1,27 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include + +/* + * T61String basic type description. + */ +static ber_tlv_tag_t asn1_DEF_T61String_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (20 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_T61String = { + "T61String", + asn_generic_unknown_constraint, + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_print, /* non-ascii string */ + OCTET_STRING_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T61String_tags, + sizeof(asn1_DEF_T61String_tags) + / sizeof(asn1_DEF_T61String_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + -1, /* Both ways are fine */ +}; + diff --git a/skeletons/T61String.h b/skeletons/T61String.h new file mode 100644 index 000000000..1485577ef --- /dev/null +++ b/skeletons/T61String.h @@ -0,0 +1,15 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _T61String_H_ +#define _T61String_H_ + +#include +#include + +typedef OCTET_STRING_t T61String_t; /* Implemented in terms of OCTET STRING */ + +extern asn1_TYPE_descriptor_t asn1_DEF_T61String; + +#endif /* _T61String_H_ */ diff --git a/skeletons/TeletexString.c b/skeletons/TeletexString.c new file mode 100644 index 000000000..1076c8af5 --- /dev/null +++ b/skeletons/TeletexString.c @@ -0,0 +1,27 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include + +/* + * TeletexString basic type description. + */ +static ber_tlv_tag_t asn1_DEF_TeletexString_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (20 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_TeletexString = { + "TeletexString", + asn_generic_unknown_constraint, + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_print, /* non-ascii string */ + OCTET_STRING_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_TeletexString_tags, + sizeof(asn1_DEF_TeletexString_tags) + / sizeof(asn1_DEF_TeletexString_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + -1, /* Both ways are fine */ +}; + diff --git a/skeletons/TeletexString.h b/skeletons/TeletexString.h new file mode 100644 index 000000000..6f513581a --- /dev/null +++ b/skeletons/TeletexString.h @@ -0,0 +1,15 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _TeletexString_H_ +#define _TeletexString_H_ + +#include +#include + +typedef OCTET_STRING_t TeletexString_t; /* Implemented in terms of OCTET STRING */ + +extern asn1_TYPE_descriptor_t asn1_DEF_TeletexString; + +#endif /* _TeletexString_H_ */ diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c new file mode 100644 index 000000000..e2f758ecf --- /dev/null +++ b/skeletons/UTCTime.c @@ -0,0 +1,105 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include +#include + +#ifndef __NO_ASN_TABLE__ + +/* + * UTCTime basic type description. + */ +static ber_tlv_tag_t asn1_DEF_UTCTime_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (23 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_UTCTime = { + "UTCTime", + UTCTime_constraint, + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + UTCTime_print, + OCTET_STRING_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_UTCTime_tags, + sizeof(asn1_DEF_UTCTime_tags) + / sizeof(asn1_DEF_UTCTime_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + -1, /* Both ways are fine */ +}; + +#endif /* __NO_ASN_TABLE__ */ + +/* + * Check that the time looks like the time. + */ +int +UTCTime_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const UTCTime_t *st = sptr; + time_t tloc; + + errno = EPERM; /* Just an unlikely error code */ + tloc = asn_UT2time(st, 0); + if(tloc == -1 && errno != EPERM) { + _ASN_ERRLOG("%s: Invalid time format: %s", + td->name, strerror(errno)); + return -1; + } + + return 0; +} + +int +UTCTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const UTCTime_t *st = sptr; + + if(st && st->buf) { + char buf[32]; + struct tm tm; + int ret; + + errno = EPERM; + if(asn_UT2time(st, &tm) == -1 && errno != EPERM) + return cb("", 11, app_key); + + ret = snprintf(buf, sizeof(buf), + "%04d-%02d-%02d %02d:%02d%02d", + tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, + tm.tm_hour, tm.tm_min, tm.tm_sec); + assert(ret > 0 && ret < sizeof(buf)); + return cb(buf, ret, app_key); + } else { + return cb("", 8, app_key); + } +} + +time_t +asn_UT2time(const UTCTime_t *st, struct tm *_tm) { + char buf[17+2]; /* "AAMMJJhhmmss+hhmm" = 17, + 2 = 19 */ + GeneralizedTime_t gt; + + if(!st || !st->buf || st->size < 11 || st->size > (sizeof(buf) - 2)) { + errno = EINVAL; + return -1; + } + + gt.buf = buf; + gt.size = st->size + 2; + memcpy(gt.buf + 2, st->buf, st->size); + if(st->buf[0] > 0x35) { + /* 19xx */ + gt.buf[0] = 0x31; + gt.buf[1] = 0x39; + } else { + /* 20xx */ + gt.buf[0] = 0x32; + gt.buf[1] = 0x30; + } + + return asn_GT2time(>, _tm); +} diff --git a/skeletons/UTCTime.h b/skeletons/UTCTime.h new file mode 100644 index 000000000..1e52388ed --- /dev/null +++ b/skeletons/UTCTime.h @@ -0,0 +1,26 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _UTCTime_H_ +#define _UTCTime_H_ + +#include +#include + +typedef OCTET_STRING_t UTCTime_t; /* Implemented using OCTET STRING */ + +extern asn1_TYPE_descriptor_t asn1_DEF_UTCTime; + +asn_constr_check_f UTCTime_constraint; +asn_struct_print_f UTCTime_print; + +/*********************** + * Some handy helpers. * + ***********************/ + +/* On error returns -1 and errno set to EINVAL */ +struct tm; /* */ +time_t asn_UT2time(const UTCTime_t *, struct tm *_optional_tm4fill); + +#endif /* _UTCTime_H_ */ diff --git a/skeletons/UTF8String.c b/skeletons/UTF8String.c new file mode 100644 index 000000000..fdd13d871 --- /dev/null +++ b/skeletons/UTF8String.c @@ -0,0 +1,112 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include + +/* + * UTF8String basic type description. + */ +static ber_tlv_tag_t asn1_DEF_UTF8String_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_UTF8String = { + "UTF8String", + UTF8String_constraint, /* Check for invalid codes, etc. */ + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + UTF8String_print, + OCTET_STRING_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_UTF8String_tags, + sizeof(asn1_DEF_UTF8String_tags) + / sizeof(asn1_DEF_UTF8String_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + -1, /* Both ways are fine */ +}; + +static int _UTF8String_h1[16] = { + 1, 1, 1, 1, 1, 1, 1, 1, /* 0x0 ... 0x7 */ + 0, 0, 0, 0, 2, 2, 3, -1 +}; +static int _UTF8String_h2[16] = { + 4, 4, 4, 4, 4, 4, 4, 4, /* 0xF0 .. 0xF7 */ + 5, 5, 5, 5, 6, 6, -1, -1 +}; + +int +UTF8String_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + ssize_t len; + len = UTF8String_length(sptr, td->name, app_errlog, app_key); + if(len > 0) len = 0; + return len; +} + +ssize_t +UTF8String_length(const UTF8String_t *st, const char *opt_type_name, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + if(st && st->buf) { + size_t length = 0; + uint8_t *buf = st->buf; + uint8_t *end = buf + st->size; + int want; /* Number of bytes wanted */ + + for(want = 0; buf < end; buf++) { + uint8_t ch = *buf; + int w = _UTF8String_h1[ch >> 4]; + if(want) { /* Continuation expected */ + if(w) { + _ASN_ERRLOG("%s: UTF-8 expectation " + "failed at byte %d", + opt_type_name, + (buf - st->buf) + 1); + return -1; + } + want--; + } else { + switch(w) { + case -1: /* Long UTF-8 */ + w = _UTF8String_h2[ch & 0xF0]; + if(w != -1) + break; + /* Fall through */ + case 0: + _ASN_ERRLOG( + "%s: UTF-8 expectation" + "failed at byte %d", + opt_type_name, + (buf - st->buf) + 1); + return -1; + } + want = w - 1; /* Expect this much */ + } + if(!want) length++; + } + + /* If still want something, then something is wrong */ + if(want) { + _ASN_ERRLOG("%s: truncated UTF-8 sequence", + opt_type_name); + return -1; + } + + return length; + } else { + _ASN_ERRLOG("%s: value not given", opt_type_name); + return -1; + } +} + +int +UTF8String_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const UTF8String_t *st = sptr; + + if(st && st->buf) { + return cb(st->buf, st->size, app_key); + } else { + return cb("", 8, app_key); + } +} diff --git a/skeletons/UTF8String.h b/skeletons/UTF8String.h new file mode 100644 index 000000000..f18bf7030 --- /dev/null +++ b/skeletons/UTF8String.h @@ -0,0 +1,22 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _UTF8String_H_ +#define _UTF8String_H_ + +#include +#include + +typedef OCTET_STRING_t UTF8String_t; /* Implemented in terms of OCTET STRING */ + +extern asn1_TYPE_descriptor_t asn1_DEF_UTF8String; + +asn_constr_check_f UTF8String_constraint; +asn_struct_print_f UTF8String_print; + +/* Returns length of UTF-8 string in characters or -1 if error. */ +ssize_t UTF8String_length(const UTF8String_t *st, const char *opt_type_name, + asn_app_consume_bytes_f *app_errlog, void *app_key); + +#endif /* _UTF8String_H_ */ diff --git a/skeletons/UniversalString.c b/skeletons/UniversalString.c new file mode 100644 index 000000000..7d75e079b --- /dev/null +++ b/skeletons/UniversalString.c @@ -0,0 +1,83 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include + +/* + * UniversalString basic type description. + */ +static ber_tlv_tag_t asn1_DEF_UniversalString_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (28 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_UniversalString = { + "UniversalString", + asn_generic_no_constraint, + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + UniversalString_print, /* Convert into UTF8 and print */ + OCTET_STRING_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_UniversalString_tags, + sizeof(asn1_DEF_UniversalString_tags) + / sizeof(asn1_DEF_UniversalString_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + -1, /* Both ways are fine */ +}; + + +int +UniversalString_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const UniversalString_t *st = sptr; + uint32_t *wchar; + uint32_t *wend; + char scratch[128]; /* Scratchpad buffer */ + char *p; + + if(!st || !st->buf) return cb("", 8, app_key); + + wchar = (uint32_t *)st->buf; + wend = (uint32_t *)(st->buf + st->size); + for(p = scratch; wchar < wend; wchar++) { + uint32_t wc = (((uint8_t *)wchar)[0] << 24) + | (((uint8_t *)wchar)[1] << 16) + | (((uint8_t *)wchar)[2] << 8) + | ((uint8_t *)wchar)[3]; /* 4 bytes */ + if(sizeof(scratch) - (p - scratch) < 6) { + if(cb(scratch, p - scratch, app_key)) + return -1; + p = scratch; + } + if(wc < 0x80) { + *p++ = (char)wc; + } else if(wc < 0x800) { + *p++ = 0xc0 | ((wc >> 6)); + *p++ = 0x80 | ((wc & 0x3f)); + } else if(wc < 0x10000) { + *p++ = 0xe0 | ((wc >> 12)); + *p++ = 0x80 | ((wc >> 6) & 0x3f); + *p++ = 0x80 | ((wc & 0x3f)); + } else if(wc < 0x200000) { + *p++ = 0xf0 | ((wc >> 18)); + *p++ = 0x80 | ((wc >> 12) & 0x3f); + *p++ = 0x80 | ((wc >> 6) & 0x3f); + *p++ = 0x80 | ((wc & 0x3f)); + } else if(wc < 0x4000000) { + *p++ = 0xf8 | ((wc >> 24)); + *p++ = 0x80 | ((wc >> 18) & 0x3f); + *p++ = 0x80 | ((wc >> 12) & 0x3f); + *p++ = 0x80 | ((wc >> 6) & 0x3f); + *p++ = 0x80 | ((wc & 0x3f)); + } else { + *p++ = 0xfc | ((wc >> 30) & 0x1); + *p++ = 0x80 | ((wc >> 24) & 0x3f); + *p++ = 0x80 | ((wc >> 18) & 0x3f); + *p++ = 0x80 | ((wc >> 12) & 0x3f); + *p++ = 0x80 | ((wc >> 6) & 0x3f); + *p++ = 0x80 | ((wc & 0x3f)); + } + } + + return cb(scratch, p - scratch, app_key); +} diff --git a/skeletons/UniversalString.h b/skeletons/UniversalString.h new file mode 100644 index 000000000..cafbc80cc --- /dev/null +++ b/skeletons/UniversalString.h @@ -0,0 +1,17 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _UniversalString_H_ +#define _UniversalString_H_ + +#include +#include + +typedef OCTET_STRING_t UniversalString_t; /* Implemented in terms of OCTET STRING */ + +extern asn1_TYPE_descriptor_t asn1_DEF_UniversalString; + +asn_struct_print_f UniversalString_print; /* Human-readable output */ + +#endif /* _UniversalString_H_ */ diff --git a/skeletons/VideotexString.c b/skeletons/VideotexString.c new file mode 100644 index 000000000..ab92ebd99 --- /dev/null +++ b/skeletons/VideotexString.c @@ -0,0 +1,27 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include + +/* + * VideotexString basic type description. + */ +static ber_tlv_tag_t asn1_DEF_VideotexString_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (21 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_VideotexString = { + "VideotexString", + asn_generic_unknown_constraint, + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_print, /* non-ascii string */ + OCTET_STRING_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_VideotexString_tags, + sizeof(asn1_DEF_VideotexString_tags) + / sizeof(asn1_DEF_VideotexString_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + -1, /* Both ways are fine */ +}; + diff --git a/skeletons/VideotexString.h b/skeletons/VideotexString.h new file mode 100644 index 000000000..4dd7c8e7b --- /dev/null +++ b/skeletons/VideotexString.h @@ -0,0 +1,15 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _VideotexString_H_ +#define _VideotexString_H_ + +#include +#include + +typedef OCTET_STRING_t VideotexString_t; /* Implemented in terms of OCTET STRING */ + +extern asn1_TYPE_descriptor_t asn1_DEF_VideotexString; + +#endif /* _VideotexString_H_ */ diff --git a/skeletons/VisibleString.c b/skeletons/VisibleString.c new file mode 100644 index 000000000..af9525f80 --- /dev/null +++ b/skeletons/VisibleString.c @@ -0,0 +1,81 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include + +/* + * VisibleString basic type description. + */ +static ber_tlv_tag_t asn1_DEF_VisibleString_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_VisibleString = { + "VisibleString", + VisibleString_constraint, + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_print_ascii, /* ASCII subset */ + OCTET_STRING_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_VisibleString_tags, + sizeof(asn1_DEF_VisibleString_tags) + / sizeof(asn1_DEF_VisibleString_tags[0]), + 1, /* Single UNIVERSAL tag may be implicitly overriden */ + -1, /* Both ways are fine */ +}; + + +/* + * ISO646, ISOReg#6 + */ +static int _VisibleString_alphabet[256] = { +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, /* ! " # $ % & ' */ +0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, /* ( ) * + , - . / */ +0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, /* 0 1 2 3 4 5 6 7 */ +0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, /* 8 9 : ; < = > ? */ +0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, /* @ A B C D E F G */ +0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, /* H I J K L M N O */ +0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* P Q R S T U V W */ +0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, /* X Y Z [ \ ] ^ _ */ +0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, /* ` a b c d e f g */ +0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, /* h i j k l m n o */ +0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, /* p q r s t u v w */ +0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x00, /* x y z { | } ~ */ +}; + +int +VisibleString_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const VisibleString_t *st = sptr; + + if(st && st->buf) { + uint8_t *buf = st->buf; + uint8_t *end = buf + st->size; + + /* + * Check the alphabet of the VisibleString. + * ISO646, ISOReg#6 + */ + for(; buf < end; buf++) { + if(!_VisibleString_alphabet[*buf]) { + _ASN_ERRLOG("%s: value byte %d " + "not in VisibleString alphabet (%d)", + td->name, + (buf - st->buf) + 1, + *buf + ); + return -1; + } + } + } else { + _ASN_ERRLOG("%s: value not given", td->name); + return -1; + } + + return 0; +} diff --git a/skeletons/VisibleString.h b/skeletons/VisibleString.h new file mode 100644 index 000000000..3c1df420a --- /dev/null +++ b/skeletons/VisibleString.h @@ -0,0 +1,17 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _VisibleString_H_ +#define _VisibleString_H_ + +#include +#include + +typedef OCTET_STRING_t VisibleString_t; /* Implemented in terms of OCTET STRING */ + +extern asn1_TYPE_descriptor_t asn1_DEF_VisibleString; + +asn_constr_check_f VisibleString_constraint; + +#endif /* _VisibleString_H_ */ diff --git a/skeletons/asn_SEQUENCE_OF.c b/skeletons/asn_SEQUENCE_OF.c new file mode 100644 index 000000000..71f6f0cd0 --- /dev/null +++ b/skeletons/asn_SEQUENCE_OF.c @@ -0,0 +1,41 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include /* for MALLOC/REALLOC/FREEMEM */ +#include + +typedef A_SEQUENCE_OF(void) asn_sequence; + +void +asn_sequence_del(void *asn_sequence_of_x, int number, int _do_free) { + asn_sequence *as = asn_sequence_of_x; + + if(as) { + void *ptr; + int n; + + if(number < 0 || number >= as->count) + return; /* Nothing to delete */ + + if(_do_free && as->free) { + ptr = as->array[number]; + } else { + ptr = 0; + } + + /* + * Shift all elements to the left to hide the gap. + */ + --as->count; + for(n = number; n < as->count; n++) + as->array[n] = as->array[n+1]; + + /* + * Invoke the third-party function only when the state + * of the parent structure is consistent. + */ + if(ptr) as->free(ptr); + } +} + diff --git a/skeletons/asn_SEQUENCE_OF.h b/skeletons/asn_SEQUENCE_OF.h new file mode 100644 index 000000000..e99673403 --- /dev/null +++ b/skeletons/asn_SEQUENCE_OF.h @@ -0,0 +1,36 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_SEQUENCE_OF_H +#define ASN_SEQUENCE_OF_H + +#include + +/* + * SEQUENCE OF is the same as SET OF with a tiny difference: + * the delete operation preserves the initial order of elements + * and thus MAY operate in non-constant time. + */ +#define A_SEQUENCE_OF(type) A_SET_OF(type) + +#define ASN_SEQUENCE_ADD(headptr, ptr) \ + asn_sequence_add((headptr), (ptr)) + +/*********************************************** + * Implementation of the SEQUENCE OF structure. + */ + +#define asn_sequence_add asn_set_add +#define asn_sequence_empty asn_set_empty + +/* + * Delete the element from the set by its number (base 0). + * This is NOT a constant-time operation. + * The order of elements is preserved. + * If _do_free is given AND the (*free) is initialized, the element + * will be freed using the custom (*free) function as well. + */ +void asn_sequence_del(void *asn_sequence_of_x, int number, int _do_free); + +#endif /* ASN_SEQUENCE_OF_H */ diff --git a/skeletons/asn_SET_OF.c b/skeletons/asn_SET_OF.c new file mode 100644 index 000000000..dfa990679 --- /dev/null +++ b/skeletons/asn_SET_OF.c @@ -0,0 +1,89 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include /* for MALLOC/REALLOC/FREEMEM */ +#include +#include + +typedef A_SET_OF(void) asn_set; + +/* + * Add another element into the set. + */ +int +asn_set_add(void *asn_set_of_x, void *ptr) { + asn_set *as = asn_set_of_x; + + if(as == 0 || ptr == 0) { + errno = EINVAL; /* Invalid arguments */ + return -1; + } + + /* + * Make sure there's enough space to insert an element. + */ + if(as->count == as->size) { + int _newsize = as->size ? (as->size << 1) : 4; + void *_new_arr; + _new_arr = REALLOC(as->array, _newsize * sizeof(as->array[0])); + if(_new_arr) { + as->array = _new_arr; + as->size = _newsize; + } else { + /* ENOMEM */ + return -1; + } + } + + as->array[as->count++] = ptr; + + return 0; +} + +void +asn_set_del(void *asn_set_of_x, int number, int _do_free) { + asn_set *as = asn_set_of_x; + + if(as) { + void *ptr; + if(number < 0 || number >= as->count) + return; + + if(_do_free && as->free) { + ptr = as->array[number]; + } else { + ptr = 0; + } + + as->array[number] = as->array[--as->count]; + + /* + * Invoke the third-party function only when the state + * of the parent structure is consistent. + */ + if(ptr) as->free(ptr); + } +} + +/* + * Free the contents of the set, do not free the set itself. + */ +void +asn_set_empty(void *asn_set_of_x) { + asn_set *as = asn_set_of_x; + + if(as) { + if(as->array) { + if(as->free) { + while(as->count--) + as->free(as->array[as->count]); + } + free(as->array); + } + as->count = 0; + as->size = 0; + } + +} + diff --git a/skeletons/asn_SET_OF.h b/skeletons/asn_SET_OF.h new file mode 100644 index 000000000..1443a7b81 --- /dev/null +++ b/skeletons/asn_SET_OF.h @@ -0,0 +1,46 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_SET_OF_H +#define ASN_SET_OF_H + +#define A_SET_OF(type) \ + struct { \ + type **array; \ + int count; /* Meaningful size */ \ + int size; /* Allocated size */ \ + void (*free)(type *); \ + } + +#define ASN_SET_ADD(headptr, ptr) \ + asn_set_add((headptr), (ptr)) + +/******************************************* + * Implementation of the SET OF structure. + */ + +/* + * Add another structure into the set by its pointer. + * RETURN VALUES: + * 0 for success and -1/errno for failure. + */ +int asn_set_add(void *asn_set_of_x, void *ptr); + +/* + * Delete the element from the set by its number (base 0). + * This is a constant-time operation. The order of elements before the + * deleted ones is guaranteed, the order of elements after the deleted + * one is NOT guaranteed. + * If _do_free is given AND the (*free) is initialized, the element + * will be freed using the custom (*free) function as well. + */ +void asn_set_del(void *asn_set_of_x, int number, int _do_free); + +/* + * Empty the contents of the set. Will free the elements, if (*free) is given. + * Will NOT free the set itself. + */ +void asn_set_empty(void *asn_set_of_x); + +#endif /* ASN_SET_OF_H */ diff --git a/skeletons/asn_types.h b/skeletons/asn_types.h new file mode 100644 index 000000000..6d426673c --- /dev/null +++ b/skeletons/asn_types.h @@ -0,0 +1,63 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * Miscellaneous system-dependent types. + */ +#ifndef _ASN_TYPES_H_ +#define _ASN_TYPES_H_ + +#include /* For fprintf() */ +#include /* For *alloc(3) */ +#include /* For memcpy(3) */ +#include /* For size_t */ +#include /* For va_start */ +#include /* C99 Standard specifies this file, for uintXX_t */ +#include /* for offsetof and ptrdiff_t */ + +#ifndef offsetof +#define offsetof(s, m) ((ptrdiff_t)&(((s *)0)->m) - (ptrdiff_t)((s *)0)) +#endif /* offsetof */ + +#define CALLOC(nmemb, size) calloc(nmemb, size) +#define MALLOC(size) malloc(size) +#define REALLOC(oldptr, size) realloc(oldptr, size) +#define FREEMEM(ptr) free(ptr) + +#ifndef MIN /* Suitable for comparing primitive types (integers) */ +#if defined(__GNUC__) +#define MIN(a,b) ({ __typeof a _a = a; __typeof b _b = b; \ + ((_a)<(_b)?(_a):(_b)); }) +#else /* !__GNUC__ */ +#define MIN(a,b) ((a)<(b)?(a):(b)) /* Unsafe variant */ +#endif /* __GNUC__ */ +#endif /* MIN */ + +/* + * A macro for debugging the ASN.1 internals. + * You may enable or override it. + */ +#ifndef ASN_DEBUG /* If debugging code is not defined elsewhere... */ +#if EMIT_ASN_DEBUG == 1 /* And it was asked to emit this code... */ +#define ASN_DEBUG(fmt, args...) do { \ + fprintf(stderr, fmt, ##args); \ + fprintf(stderr, "\n"); \ + } while(0) +#else /* EMIT_ASN_DEBUG */ +#define ASN_DEBUG(fmt, args...) ((void)0) /* Emit a no-op operator */ +#endif /* EMIT_ASN_DEBUG */ +#endif /* ASN_DEBUG */ + + +/* + * Generic type of an application-defined callback to return various + * types of data to the application. + * EXPECTED RETURN VALUES: + * -1: Failed to consume bytes. Abort the mission. + * Other return values indicate success, and ignored. + */ +typedef int (asn_app_consume_bytes_f)(const void *buffer, size_t size, + void *application_specific_key); + +#endif /* _ASN_TYPES_H_ */ diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c new file mode 100644 index 000000000..135e7910e --- /dev/null +++ b/skeletons/ber_decoder.c @@ -0,0 +1,230 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr += num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) +#define RETURN(_code) do { \ + ber_dec_rval_t rval; \ + rval.code = _code; \ + rval.consumed = consumed_myself; \ + return rval; \ + } while(0) + +/* + * The BER decoder of any type. + */ +ber_dec_rval_t +ber_decode(asn1_TYPE_descriptor_t *type_descriptor, + void **struct_ptr, void *ptr, size_t size) { + + /* + * Invoke type-specific decoder. + */ + return type_descriptor->ber_decoder(type_descriptor, + struct_ptr, /* Pointer to the destination structure */ + ptr, size, /* Buffer and its size */ + 0 /* Default tag mode is 0 */ + ); +} + +/* + * Check the set of >> tags matches the definition. + */ +ber_dec_rval_t +ber_check_tags(asn1_TYPE_descriptor_t *head, ber_dec_ctx_t *ctx, + void *ptr, size_t size, int tag_mode, + ber_tlv_len_t *last_length, int *opt_tlv_form) { + ssize_t consumed_myself = 0; + ssize_t tag_len; + ssize_t len_len; + ber_tlv_tag_t tlv_tag; + ber_tlv_len_t tlv_len; + ber_tlv_len_t limit_len = -1; + int expect_00_terminators = 0; + int tlv_constr = -1; /* If CHOICE, opt_tlv_form is not given */ + int tagno; + + /* + * So what does all this tags_impl_skip stuff mean? + * Imagine two types, + * A ::= [5] IMPLICIT T + * B ::= [2] EXPLICIT T + * Where T is defined as + * T ::= [4] IMPLICIT SEQUENCE { ... } + * + * Let's say, we are starting to decode type A, given the + * following TLV stream: <5> <0>. What does this mean? + * It means that the type A contains type T which is, + * in turn, empty. + * Remember though, that we are still in A. We cannot + * just pass control to the type T decoder. Why? Because + * the type T decoder expects <4> <0>, not <5> <0>. + * So, we must make sure we are going to receive <5> while + * still in A, then pass control to the T decoder, indicating + * that the tag <4> was implicitly skipped. The decoder of T + * hence will be prepared to treat <4> as valid tag, and decode + * it appropriately. + */ + + /* + * We have a list of tags that must occur in the stream: + * {A,B,C} + * However, it may be indicated that the type is + * implicitly tagged in the caller, so it really boils down to the + * {I,B,C} or even {I,C} + * This is because the implicit tag at above structure may replace + * zero or more (or every) tags which follow it. We don't care + * about the precise number, as it is already computed for us + * by the ASN.1 compiler and placed into head->tags_impl_skip. + * So let's suppose the only tag left after implicit tagging is {I}. + * Yet, the table we have is {A,B,C} and head->tags_impl_skip=3. + * We need to check at least one tag in the loop, so the loop range + * is modified so it will be invoked at least one time. + */ + tagno = ctx->step /* Continuing where left previously */ + + (tag_mode==-1?(head->tags_impl_skip-1):0) + + (tag_mode==1?-1:0) + ; + //assert(head->tags_count >= 1); ?May not be the case for CHOICE! + assert(tagno < head->tags_count); /* At least one loop */ + for((void)tagno; tagno < head->tags_count; tagno++, ctx->step++) { + + /* + * Fetch and process T from TLV. + */ + tag_len = ber_fetch_tag(ptr, size, &tlv_tag); + ASN_DEBUG("Fetching tag from {%p,%ld} %02X: " + "len %ld, tag %s", + ptr, (long)size, + *(uint8_t *)ptr, (long)tag_len, + ber_tlv_tag_string(tlv_tag)); + switch(tag_len) { + case -1: RETURN(RC_FAIL); + case 0: RETURN(RC_WMORE); + } + + tlv_constr = BER_TLV_CONSTRUCTED(ptr); + + /* + * If {I}, don't check anything. + * If {I,B,C}, check B and C unless we're at I. + */ + if(tag_mode != 0 && ctx->step == 0) { + /* + * We don't expect tag to match here. + * It's just because we don't know how the tag + * is supposed to look like. + */ + } else { + assert(tagno >= 0); /* Guaranteed by the code above */ + if(tlv_tag != head->tags[tagno]) { + /* + * Unexpected tag. Too bad. + */ + ASN_DEBUG("Expected: %s, expectation failed", + ber_tlv_tag_string(head->tags[tagno])); + RETURN(RC_FAIL); + } + } + + /* + * Attention: if there are more tags expected, + * ensure that the current tag is presented + * in constructed form (it contains other tags!). + * If this one is the last one, check that the tag form + * matches the one given in descriptor. + */ + if(tagno < (head->tags_count - 1)) { + if(tlv_constr == 0) { + RETURN(RC_FAIL); + } + } else { + if(head->last_tag_form != tlv_constr + && head->last_tag_form != -1) { + RETURN(RC_FAIL); + } + } + + /* + * Fetch and process L from TLV. + */ + len_len = ber_fetch_length(tlv_constr, + ptr + tag_len, size - tag_len, &tlv_len); + switch(len_len) { + case -1: RETURN(RC_FAIL); + case 0: RETURN(RC_WMORE); + } + + /* + * FIXME + * As of today, the chain of tags + * must either contain several indefinite length TLVs, + * or several definite length ones. + * No mixing is allowed. + */ + if(tlv_len == -1) { + /* + * Indefinite length. + */ + if(limit_len == -1) { + expect_00_terminators++; + } else { + ASN_DEBUG("Unexpected indefinite length " + "in a chain of definite lengths"); + RETURN(RC_FAIL); + } + ADVANCE(tag_len + len_len); + continue; + } else { + if(expect_00_terminators) { + ASN_DEBUG("Unexpected definite length " + "in a chain of indefinite lengths"); + RETURN(RC_FAIL); + } + } + + /* + * Check that multiple TLVs specify ever decreasing length, + * which is consistent. + */ + if(limit_len == -1) { + limit_len = tlv_len + tag_len + len_len; + } else if(limit_len != tlv_len + tag_len + len_len) { + /* + * Inner TLV specifies length which is inconsistent + * with the outer TLV's length value. + */ + ASN_DEBUG("Outer TLV is %d and inner is %d", + limit_len, tlv_len); + RETURN(RC_FAIL); + } + + ADVANCE(tag_len + len_len); + + limit_len -= (tag_len + len_len); + if(size > limit_len) { + /* + * Make sure that we won't consume more bytes + * from the large buffer than the inferred limit. + */ + size = limit_len; + } + } + + if(opt_tlv_form) + *opt_tlv_form = tlv_constr; + if(expect_00_terminators) + *last_length = -expect_00_terminators; + else + *last_length = tlv_len; + + RETURN(RC_OK); +} diff --git a/skeletons/ber_decoder.h b/skeletons/ber_decoder.h new file mode 100644 index 000000000..8240270a9 --- /dev/null +++ b/skeletons/ber_decoder.h @@ -0,0 +1,77 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _BER_DECODER_H_ +#define _BER_DECODER_H_ + +#include + +struct asn1_TYPE_descriptor_s; /* Forward declaration */ + +/* + * This structure describes the return value common across the + * various BER decoders. + * + * Please note that the number of consumed bytes is ALWAYS meaningful, + * even if code!=RC_OK. This is so to indicate the number of successfully + * decoded bytes, hence provide a possibility, to fail with more diagnostics + * (i.e., print the offending remainder of the buffer). + */ +typedef struct ber_dec_rval_s { + enum { + RC_OK, /* Decoded successfully */ + RC_WMORE, /* More data expected, call again */ + RC_FAIL, /* Failure to decode data */ + } code; + + size_t consumed; /* Number of bytes consumed */ +} ber_dec_rval_t; + +/* + * A context for decoding BER across buffer boundaries. + */ +typedef struct ber_dec_ctx_s { + int phase; /* Decoding phase */ + int step; /* Elementary step of a phase */ + ber_tlv_len_t left; /* Number of bytes left, -1 for indefinite */ + void *ptr; /* Decoder-specific stuff */ +} ber_dec_ctx_t; + +/* + * The BER decoder of any type. + * This function may be invoked directly from the application. + */ +ber_dec_rval_t ber_decode(struct asn1_TYPE_descriptor_s *type_descriptor, + void **struct_ptr, /* Pointer to a target structure's pointer */ + void *buffer, /* Data to be decoded */ + size_t size /* Size of that buffer */ + ); + +/* + * Type of generic function which decodes the byte stream into the structure. + */ +typedef ber_dec_rval_t (ber_type_decoder_f)( + struct asn1_TYPE_descriptor_s *type_descriptor, + void **type_structure, void *buf_ptr, size_t size, + int tag_mode); + +/******************************* + * INTERNALLY USEFUL FUNCTIONS * + *******************************/ + +/* + * Check that all tags correspond to the type definition (as given in head). + * On return, last_length would contain either a non-negative length of the + * value part of the last TLV, or the negative number of expected + * "end of content" sequences. The number may only be negative if the + * head->last_tag_form is non-zero. + */ +ber_dec_rval_t ber_check_tags(struct asn1_TYPE_descriptor_s *type_dsc, + ber_dec_ctx_t *ctx, /* saved context */ + void *ptr, size_t size, + int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ + ber_tlv_len_t *last_length, + int *opt_tlv_form); + +#endif /* _BER_DECODER_H_ */ diff --git a/skeletons/ber_tlv_length.c b/skeletons/ber_tlv_length.c new file mode 100644 index 000000000..cd08f6ab4 --- /dev/null +++ b/skeletons/ber_tlv_length.c @@ -0,0 +1,159 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +ssize_t +ber_fetch_length(int _is_constructed, void *bufptr, size_t size, + ber_tlv_len_t *len_r) { + uint8_t *buf = bufptr; + unsigned oct; + + if(size == 0) + return 0; /* Want more */ + + oct = *(uint8_t *)buf; + if((oct & 0x80) == 0) { + /* + * Short definite length. + */ + *len_r = (oct & 0x7F); + return 1; + } else { + ber_tlv_len_t len; + ssize_t skipped; + + if(_is_constructed && oct == 0x80) { + *len_r = -1; /* Indefinite length */ + return 1; + } + + if(oct == 0xff) { + /* Reserved in standard for future use. */ + return -1; + } + + oct &= 0x7F; /* Leave only the 7 LS bits */ + for(len = 0, buf++, skipped = 1; + oct && (++skipped < size); buf++, oct--) { + + len = (len << 8) | *buf; + if(len < 0 + || (len >> ((8 * sizeof(len)) - 8) && oct > 1)) { + /* + * Too large length value. + */ + return -1; + } + } + + if(oct == 0) { + *len_r = len; + return skipped; + } + + return 0; /* Want more */ + } + +} + +ssize_t +ber_skip_length(int _is_constructed, void *ptr, size_t size) { + ber_tlv_len_t vlen; /* Length of V in TLV */ + ssize_t tl; /* Length of L in TLV */ + ssize_t ll; /* Length of L in TLV */ + ssize_t skip; + + /* + * Determine the size of L in TLV. + */ + ll = ber_fetch_length(_is_constructed, ptr, size, &vlen); + if(ll <= 0) return ll; + + /* + * Definite length. + */ + if(vlen >= 0) { + skip = ll + vlen; + if(skip > size) + return 0; /* Want more */ + return skip; + } + + /* + * Indefinite length! + */ + ASN_DEBUG("Skipping indefinite length"); + for(skip = ll, ptr += ll, size -= ll;;) { + ber_tlv_tag_t tag; + + /* Fetch the tag */ + tl = ber_fetch_tag(ptr, size, &tag); + if(tl <= 0) return tl; + + ll = ber_skip_length(BER_TLV_CONSTRUCTED(ptr), + ptr + tl, size - tl); + if(ll <= 0) return ll; + + skip += tl + ll; + + /* + * This may be the end of the indefinite length structure, + * two consecutive 0 octets. + * Check if it is true. + */ + if(((uint8_t *)ptr)[0] == 0 + && ((uint8_t *)ptr)[1] == 0) + return skip; + + ptr += tl + ll; + size -= tl + ll; + } + + /* UNREACHABLE */ +} + +ssize_t +der_tlv_length_serialize(ber_tlv_len_t len, void *bufp, size_t size) { + ssize_t computed_size; /* Size of len encoding */ + uint8_t *buf = bufp; + uint8_t *end; + int i; + + if(len <= 127) { + /* Encoded in 1 octet */ + if(size) *buf = len; + return 1; + } + + /* + * Compute the size of the subsequent bytes. + */ + computed_size = sizeof(len); /* assert(sizeof(len)<128), n.p. */ + for(i = (8*(sizeof(len)-1)); i > 0; i -= 8) { + if((len >> i) & 0xFF) break; + computed_size--; + } + + if(size) { + *buf++ = 0x80 | computed_size; /* Length of the encoding */ + size--; + } + + /* + * Produce the len encoding, space permitting. + */ + if(size > computed_size) + end = buf + computed_size; + else + end = buf + size; + for((void)i /* Reuse bits count */; buf < end; i -= 8, buf++) { + *buf = (len >> i) & 0xFF; + } + + return computed_size + 1; +} + diff --git a/skeletons/ber_tlv_length.h b/skeletons/ber_tlv_length.h new file mode 100644 index 000000000..7e5d5f8aa --- /dev/null +++ b/skeletons/ber_tlv_length.h @@ -0,0 +1,40 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _BER_TLV_LENGTH_H_ +#define _BER_TLV_LENGTH_H_ + +typedef ssize_t ber_tlv_len_t; + +/* + * This function tries to fetch the length of the BER TLV value and place it + * in *len_r. + * RETURN VALUES: + * 0: More data expected than bufptr contains. + * -1: Fatal error deciphering length. + * >0: Number of bytes used from bufptr. + * On return with >0, len_r is constrained as -1..MAX, where -1 mean + * that the value is of indefinite length. + */ +ssize_t ber_fetch_length(int _is_constructed, void *bufptr, size_t size, + ber_tlv_len_t *len_r); + +/* + * This function expects bufptr to be positioned over L in TLV. + * It returns number of bytes occupied by L and V together, suitable + * for skipping. The function properly handles indefinite length. + * RETURN VALUES: + * Standard {-1,0,>0} convention. + */ +ssize_t ber_skip_length(int _is_constructed, void *bufptr, size_t size); + +/* + * This function serializes the length (L from TLV) in DER format. + * It always return number of bytes necessary to represent the length, + * it is a caller's responsibility to check the return value + * against the supplied buffer's size. + */ +ssize_t der_tlv_length_serialize(ber_tlv_len_t len, void *bufptr, size_t size); + +#endif /* _BER_TLV_LENGTH_H_ */ diff --git a/skeletons/ber_tlv_tag.c b/skeletons/ber_tlv_tag.c new file mode 100644 index 000000000..50c9e69b6 --- /dev/null +++ b/skeletons/ber_tlv_tag.c @@ -0,0 +1,145 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +ssize_t +ber_fetch_tag(void *ptr, size_t size, ber_tlv_tag_t *tag_r) { + ber_tlv_tag_t val; + ber_tlv_tag_t tclass; + ssize_t skipped; + + if(size == 0) + return 0; + + val = *(uint8_t *)ptr; + tclass = (val >> 6); + if((val &= 31) != 31) { + /* + * Simple form: everything encoded in a single octet. + * Tag Class is encoded using two least significant bits. + */ + *tag_r = (val << 2) | tclass; + return 1; + } + + /* + * Each octet contains 7 bits of useful information. + * The MSB is 0 if it is the last octet of the tag. + */ + for(val = 0, ptr++, skipped = 2; skipped < size; ptr++, skipped++) { + unsigned oct = *(uint8_t *)ptr; + if(oct & 0x80) { + val = (val << 7) | (oct & 0x7F); + /* + * Make sure there are at least 9 bits spare + * at the MS side of a value. + */ + if(val >> ((8 * sizeof(val)) - 9)) { + /* + * We would not be able to accomodate + * any more tag bits. + */ + return -1; + } + } else { + *tag_r = (val << 9) | (oct << 2) | tclass; + return skipped; + } + } + + return 0; /* Want more */ +} + + +ssize_t +ber_tlv_tag_fwrite(ber_tlv_tag_t tag, FILE *f) { + char buf[sizeof("[APPLICATION ]") + 32]; + ssize_t ret; + + ret = ber_tlv_tag_snprint(tag, buf, sizeof(buf)); + if(ret >= sizeof(buf) || ret < 2) { + errno = EPERM; + return -1; + } + + return fwrite(buf, 1, ret, f); +} + +ssize_t +ber_tlv_tag_snprint(ber_tlv_tag_t tag, char *buf, size_t size) { + char *type = 0; + int ret; + + switch(tag & 0x3) { + case ASN_TAG_CLASS_UNIVERSAL: type = "UNIVERSAL "; break; + case ASN_TAG_CLASS_APPLICATION: type = "APPLICATION "; break; + case ASN_TAG_CLASS_CONTEXT: type = ""; break; + case ASN_TAG_CLASS_PRIVATE: type = "PRIVATE "; break; + } + + ret = snprintf(buf, size, "[%s%u]", type, ((unsigned)tag) >> 2); + if(ret <= 0 && size) buf[0] = '\0'; /* against broken libc's */ + + return ret; +} + +char * +ber_tlv_tag_string(ber_tlv_tag_t tag) { + static char buf[sizeof("[APPLICATION ]") + 32]; + + (void)ber_tlv_tag_snprint(tag, buf, sizeof(buf)); + + return buf; +} + + +ssize_t +der_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { + int tclass = BER_TAG_CLASS(tag); + ber_tlv_tag_t tval = BER_TAG_VALUE(tag); + uint8_t *buf = bufp; + uint8_t *end; + ssize_t computed_size; + int i; + + if(tval <= 30) { + /* Encoded in 1 octet */ + if(size) buf[0] = (tclass << 6) | tval; + return 1; + } else if(size) { + *buf++ = (tclass << 6) | 0x1F; + size--; + } + + /* + * Compute the size of the subsequent bytes. + * The routine is written so every floating-point + * operation is done at compile time. + * Note, there is a subtle problem lurking here, + * could you guess where it is? :) + * Hint: what happens when ((8*sizeof(tag))%7) == 0? + */ + computed_size = 1 + 8 * sizeof(tag) / 7; + for(i = (8*sizeof(tag)) - ((8*sizeof(tag))%7); i >= 7; i -= 7) { + if((tval >> i) & 0x7F) break; + computed_size--; + } + + /* + * Fill in the buffer, space permitting. + */ + if(size > computed_size) + end = buf + computed_size; + else + end = buf + size; + for((void)i; buf < end; i -= 7, buf++) { + *buf = 0x80 | ((tval>>i) & 0x7F); + } + + return computed_size + 1; +} + diff --git a/skeletons/ber_tlv_tag.h b/skeletons/ber_tlv_tag.h new file mode 100644 index 000000000..504197029 --- /dev/null +++ b/skeletons/ber_tlv_tag.h @@ -0,0 +1,52 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _BER_TLV_TAG_H_ +#define _BER_TLV_TAG_H_ + +enum asn_tag_class { + ASN_TAG_CLASS_UNIVERSAL = 0, /* 0b00 */ + ASN_TAG_CLASS_APPLICATION = 1, /* 0b01 */ + ASN_TAG_CLASS_CONTEXT = 2, /* 0b10 */ + ASN_TAG_CLASS_PRIVATE = 3, /* 0b11 */ +}; +typedef unsigned ber_tlv_tag_t; /* BER TAG from Tag-Length-Value */ + +/* + * Tag class is encoded together with tag value for optimization purposes. + */ +#define BER_TAG_CLASS(tag) ((tag) & 0x3) +#define BER_TAG_VALUE(tag) ((tag) >> 2) +#define BER_TLV_CONSTRUCTED(tagptr) (((*(uint8_t *)tagptr) & 0x20)?1:0) + +#define BER_TAGS_EQUAL(tag1, tag2) ((tag1) == (tag2)) + +/* + * Several functions for printing the TAG in the canonical form + * (i.e. "[PRIVATE 0]"). + * Return values correspond to their libc counterparts (if any). + */ +ssize_t ber_tlv_tag_snprint(ber_tlv_tag_t tag, char *buf, size_t buflen); +ssize_t ber_tlv_tag_fwrite(ber_tlv_tag_t tag, FILE *); +char *ber_tlv_tag_string(ber_tlv_tag_t tag); + + +/* + * This function tries to fetch the tag from the input stream. + * RETURN VALUES: + * 0: More data expected than bufptr contains. + * -1: Fatal error deciphering tag. + * >0: Number of bytes used from bufptr. tag_r will contain the tag. + */ +ssize_t ber_fetch_tag(void *bufptr, size_t size, ber_tlv_tag_t *tag_r); + +/* + * This function serializes the tag (T from TLV) in DER format. + * It always return number of bytes necessary to represent the tag, + * it is a caller's responsibility to check the return value + * against the supplied buffer's size. + */ +ssize_t der_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufptr, size_t size); + +#endif /* _BER_TLV_TAG_H_ */ diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c new file mode 100644 index 000000000..2cfac3b6f --- /dev/null +++ b/skeletons/constr_CHOICE.c @@ -0,0 +1,627 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include /* for ntohl */ +#include + +/* + * Number of bytes left for this structure. + * (ctx->left) indicates the number of bytes _transferred_ for the structure. + * (size) contains the number of bytes in the buffer passed. + */ +#define LEFT ((sizeleft)?size:ctx->left) + +/* + * If the subprocessor function returns with an indication that it wants + * more data, it may well be a fatal decoding problem, because the + * size is constrained by the 's L, even if the buffer size allows + * reading more data. + * For example, consider the buffer containing the following TLVs: + * ... + * The TLV length clearly indicates that one byte is expected in V, but + * if the V processor returns with "want more data" even if the buffer + * contains way more data than the V processor have seen. + */ +#define SIZE_VIOLATION (ctx->left >= 0 && ctx->left <= size) + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr += num; \ + size -= num; \ + if(ctx->left >= 0) \ + ctx->left -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#define NEXT_PHASE(ctx) do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) + +/* + * Return a standardized complex structure. + */ +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +/* + * See the definitions. + */ +static inline int _fetch_present_idx(const void *struct_ptr, int off, int size); +static inline void _set_present_idx(void *sptr, int offset, int size, int pres); + +/* + * Tags are canonically sorted in the tag to member table. + */ +static int +_search4tag(const void *ap, const void *bp) { + const asn1_CHOICE_tag2member_t *a = ap; + const asn1_CHOICE_tag2member_t *b = bp; + int a_class = BER_TAG_CLASS(a->el_tag); + int b_class = BER_TAG_CLASS(b->el_tag); + + if(a_class == b_class) { + ber_tlv_tag_t a_value = BER_TAG_VALUE(a->el_tag); + ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag); + + if(a_value == b_value) + return 0; + else if(a_value < b_value) + return -1; + else + return 1; + } else if(a_class < b_class) { + return -1; + } else { + return 1; + } +} + +/* + * The decoder of the CHOICE type. + */ +ber_dec_rval_t +CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd, + void **struct_ptr, void *ptr, size_t size, int tag_mode) { + /* + * Bring closer parts of structure description. + */ + asn1_CHOICE_specifics_t *specs = sd->specifics; + asn1_CHOICE_element_t *elements = specs->elements; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + ber_dec_ctx_t *ctx; /* Decoder context */ + + ber_tlv_tag_t tlv_tag; /* T from TLV */ + ssize_t tag_len; /* Length of TLV's T */ + //ber_tlv_len_t tlv_len; /* L from TLV */ + ber_dec_rval_t rval; /* Return code from subparsers */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + + ASN_DEBUG("Decoding %s as CHOICE", sd->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (st + specs->ctx_offset); + + /* + * Start to parse where left previously + */ + switch(ctx->phase) { + case 0: + /* + * PHASE 0. + * Check that the set of tags associated with given structure + * perfectly fits our expectations. + */ + + if(tag_mode || sd->tags_count) { + rval = ber_check_tags(sd, ctx, ptr, size, + tag_mode, &ctx->left, 0); + if(rval.code != RC_OK) { + ASN_DEBUG("%s tagging check failed: %d", + sd->name, rval.code); + consumed_myself += rval.consumed; + RETURN(rval.code); + } + + if(ctx->left >= 0) { + /* ?Substracted below! */ + ctx->left += rval.consumed; + } + ADVANCE(rval.consumed); + } else { + ctx->left = -1; + } + + NEXT_PHASE(ctx); + + ASN_DEBUG("Structure consumes %ld bytes, buffer %ld", + (long)ctx->left, (long)size); + + /* Fall through */ + case 1: + /* + * Fetch the T from TLV. + */ + tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); + ASN_DEBUG("In %s CHOICE tag length %d", sd->name, (int)tag_len); + switch(tag_len) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + do { + asn1_CHOICE_tag2member_t *t2m; + asn1_CHOICE_tag2member_t key; + + key.el_tag = tlv_tag; + t2m = bsearch(&key, specs->tag2el, specs->tag2el_count, + sizeof(specs->tag2el[0]), _search4tag); + if(t2m) { + /* + * Found the element corresponding to the tag. + */ + NEXT_PHASE(ctx); + ctx->step = t2m->el_no; + break; + } else if(specs->extensible == 0) { + ASN_DEBUG("Unexpected tag %s " + "in non-extensible CHOICE %s", + ber_tlv_tag_string(tlv_tag), sd->name); + RETURN(RC_FAIL); + } else { + /* Skip this tag */ + ssize_t skip; + + ASN_DEBUG("Skipping unknown tag %s", + ber_tlv_tag_string(tlv_tag)); + + skip = ber_skip_length( + BER_TLV_CONSTRUCTED(ptr), + ptr + tag_len, LEFT - tag_len); + + switch(skip) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + ADVANCE(skip + tag_len); + RETURN(RC_OK); + } + } while(0); + + case 2: + /* + * PHASE 2. + * Read in the element. + */ + do { + asn1_CHOICE_element_t *elm; /* CHOICE's element */ + void *memb_ptr; /* Pointer to the member */ + void *memb_ptr2; /* Pointer to that pointer */ + + elm = &elements[ctx->step]; + + /* + * Compute the position of the member inside a structure, + * and also a type of containment (it may be contained + * as pointer or using inline inclusion). + */ + if(elm->optional) { + /* Optional member, hereby, a simple pointer */ + memb_ptr2 = (char *)st + elm->memb_offset; + } else { + /* + * A pointer to a pointer + * holding the start of the structure + */ + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + /* + * Invoke the member fetch routine according to member's type + */ + rval = elm->type->ber_decoder( + (void *)elm->type, + memb_ptr2, ptr, LEFT, + elm->tag_mode); + switch(rval.code) { + case RC_OK: + _set_present_idx(st, specs->pres_offset, + specs->pres_size, ctx->step + 1); + break; + case RC_WMORE: /* More data expected */ + if(!SIZE_VIOLATION) { + ADVANCE(rval.consumed); + RETURN(RC_WMORE); + } + RETURN(RC_FAIL); + case RC_FAIL: /* Fatal error */ + RETURN(rval.code); + } /* switch(rval) */ + + ADVANCE(rval.consumed); + } while(0); + + NEXT_PHASE(ctx); + + /* Fall through */ + case 3: + ASN_DEBUG("CHOICE %s Leftover: %ld, size = %ld, tm=%d, tc=%d", + sd->name, (long)ctx->left, (long)size, + tag_mode, sd->tags_count); + + if(ctx->left > 0) { + /* + * The type must be fully decoded + * by the CHOICE member-specific decoder. + */ + RETURN(RC_FAIL); + } + + if(ctx->left == -1 + && !(tag_mode || sd->tags_count)) { + /* + * This is an untagged CHOICE. + * It doesn't contain nothing + * except for the member itself, including all its tags. + * The decoding is completed. + */ + NEXT_PHASE(ctx); + break; + } + + /* + * Read in the "end of data chunks"'s. + */ + while(ctx->left < 0) { + ssize_t tl; + + tl = ber_fetch_tag(ptr, LEFT, &tlv_tag); + switch(tl) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + /* + * Expected <0><0>... + */ + if(((uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((uint8_t *)ptr)[1] == 0) { + /* + * Correctly finished with <0><0>. + */ + continue; + } + } else { + ASN_DEBUG("Unexpected continuation in %s", + sd->name); + RETURN(RC_FAIL); + } + + ADVANCE(2); + ctx->left++; + } + + NEXT_PHASE(ctx); + case 4: + /* No meaningful work here */ + break; + } + + RETURN(RC_OK); +} + +der_enc_rval_t +CHOICE_encode_der(asn1_TYPE_descriptor_t *sd, + void *struct_ptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + asn1_CHOICE_specifics_t *specs = sd->specifics; + asn1_CHOICE_element_t *elm; /* CHOICE element */ + der_enc_rval_t erval; + void *memb_ptr; + size_t computed_size = 0; + int present; + + ASN_DEBUG("%s %s as CHOICE", + cb?"Encoding":"Estimating", sd->name); + + present = _fetch_present_idx(struct_ptr, + specs->pres_offset, specs->pres_size); + + /* + * If the structure was not initialized, it cannot be encoded: + * can't deduce what to encode in the choice type. + */ + if(present <= 0 || present > specs->elements_count) { + if(present == 0 && specs->elements_count == 0) { + /* The CHOICE is empty?! */ + erval.encoded = 0; + return erval; + } + erval.encoded = -1; + erval.failed_type = sd; + erval.structure_ptr = struct_ptr; + return erval; + } + + /* + * Seek over the present member of the structure. + */ + elm = &specs->elements[present-1]; + if(elm->optional) { + memb_ptr = *(void **)((char *)struct_ptr + elm->memb_offset); + if(memb_ptr == 0) { + erval.encoded = 0; + return erval; + } + } else { + memb_ptr = (void *)((char *)struct_ptr + elm->memb_offset); + } + + /* + * If the CHOICE itself is tagged EXPLICIT: + * T ::= [2] EXPLICIT CHOICE { ... } + * Then emit the appropriate tags. + */ + if(tag_mode == 1 || sd->tags_count) { + /* + * For this, we need to pre-compute the member. + */ + ssize_t ret; + + /* Encode member with its tag */ + erval = elm->type->der_encoder(elm->type, memb_ptr, + elm->tag_mode, elm->tag, 0, 0); + if(erval.encoded == -1) + return erval; + + /* Encode CHOICE with parent or my own tag */ + ret = der_write_tags(sd, erval.encoded, tag_mode, tag, + cb, app_key); + if(ret == -1) { + erval.encoded = -1; + erval.failed_type = sd; + erval.structure_ptr = struct_ptr; + return erval; + } + computed_size += ret; + } + + /* + * Encode the single underlying member. + */ + erval = elm->type->der_encoder(elm->type, memb_ptr, + elm->tag_mode, elm->tag, cb, app_key); + if(erval.encoded == -1) + return erval; + + ASN_DEBUG("Encoded CHOICE member in %ld bytes (+%ld)", + (long)erval.encoded, (long)computed_size); + + erval.encoded += computed_size; + + return erval; +} + +ber_tlv_tag_t +CHOICE_outmost_tag(asn1_TYPE_descriptor_t *td, const void *ptr, int tag_mode, ber_tlv_tag_t tag) { + asn1_CHOICE_specifics_t *specs = td->specifics; + int present; + + assert(tag_mode == 0); + assert(tag == 0); + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size); + + if(present > 0 || present <= specs->elements_count) { + asn1_CHOICE_element_t *elm = &specs->elements[present-1]; + void *memb_ptr; + + if(elm->optional) { + memb_ptr = *(void **)((char *)ptr + elm->memb_offset); + } else { + memb_ptr = (void *)((char *)ptr + elm->memb_offset); + } + + return asn1_TYPE_outmost_tag(elm->type, memb_ptr, + elm->tag_mode, elm->tag); + } else { + return -1; + } +} + +int +CHOICE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + asn1_CHOICE_specifics_t *specs = td->specifics; + int present; + + if(!sptr) { + _ASN_ERRLOG("%s: value not given", td->name); + return -1; + } + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); + if(present > 0 && present <= specs->elements_count) { + asn1_CHOICE_element_t *elm = &specs->elements[present-1]; + const void *memb_ptr; + + if(elm->optional) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) return 0; + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + return elm->type->check_constraints(elm->type, memb_ptr, + app_errlog, app_key); + } else { + _ASN_ERRLOG("%s: no CHOICE element given", td->name); + return -1; + } +} + +int +CHOICE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + asn1_CHOICE_specifics_t *specs = td->specifics; + int present; + + if(!sptr) return cb("", 8, app_key); + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); + + /* + * Free that element. + */ + if(present > 0 && present <= specs->elements_count) { + asn1_CHOICE_element_t *elm = &specs->elements[present-1]; + const void *memb_ptr; + + if(elm->optional) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) return cb("", 8, app_key); + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + /* Print member's name and stuff */ + if(cb(elm->name, strlen(elm->name), app_key) + || cb(": ", 2, app_key)) + return -1; + + return elm->type->print_struct(elm->type, memb_ptr, ilevel, + cb, app_key); + } else { + return cb("", 8, app_key); + } +} + +void +CHOICE_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { + asn1_CHOICE_specifics_t *specs = td->specifics; + int present; + + if(!td || !ptr) + return; + + ASN_DEBUG("Freeing %s as CHOICE", td->name); + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size); + + /* + * Free that element. + */ + if(present > 0 && present <= specs->elements_count) { + asn1_CHOICE_element_t *elm = &specs->elements[present-1]; + void *memb_ptr; + + if(elm->optional) { + memb_ptr = *(void **)((char *)ptr + elm->memb_offset); + if(memb_ptr) + elm->type->free_struct(elm->type, memb_ptr, 0); + } else { + memb_ptr = (void *)((char *)ptr + elm->memb_offset); + elm->type->free_struct(elm->type, memb_ptr, 1); + } + } + + if(!contents_only) { + FREEMEM(ptr); + } +} + + +/* + * The following functions functions offer protection against -fshort-enums, + * compatible with little- and big-endian machines. + * If assertion is triggered, either disable -fshort-enums, or add an entry + * here with the ->pres_size of your target stracture. + * Unless the target structure is packed, the ".present" member + * is guaranteed to be aligned properly. ASN.1 compiler itself does not + * produce packed code. + */ +static inline int +_fetch_present_idx(const void *struct_ptr, int pres_offset, int pres_size) { + const void *present_ptr; + int present; + + present_ptr = ((const char *)struct_ptr) + pres_offset; + + switch(pres_size) { + case sizeof(int): present = *(const int *)present_ptr; break; + case sizeof(short): present = *(const short *)present_ptr; break; + case sizeof(char): present = *(const char *)present_ptr; break; + default: + /* ANSI C mandates enum to be equivalent to integer */ + assert(pres_size != sizeof(int)); + return 0; /* If not aborted, pass back safe value */ + } + + return present; +} + +static inline void +_set_present_idx(void *struct_ptr, int pres_offset, int pres_size, int present) { + void *present_ptr; + present_ptr = ((char *)struct_ptr) + pres_offset; + + switch(pres_size) { + case sizeof(int): *(int *)present_ptr = present; break; + case sizeof(short): *(short *)present_ptr = present; break; + case sizeof(char): *(char *)present_ptr = present; break; + default: + /* ANSI C mandates enum to be equivalent to integer */ + assert(pres_size != sizeof(int)); + } +} diff --git a/skeletons/constr_CHOICE.h b/skeletons/constr_CHOICE.h new file mode 100644 index 000000000..70766e9d5 --- /dev/null +++ b/skeletons/constr_CHOICE.h @@ -0,0 +1,65 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _CONSTR_CHOICE_H_ +#define _CONSTR_CHOICE_H_ + +#include + +/* + * A single element of the CHOICE type. + */ +typedef struct asn1_CHOICE_element_s { + int memb_offset; /* Offset of the element */ + int optional; /* Whether the element is optional */ + ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ + int tag_mode; /* IMPLICIT/no/EXPLICIT tag at current level */ + asn1_TYPE_descriptor_t + *type; /* Member type descriptor */ + char *name; /* ASN.1 identifier of the element */ +} asn1_CHOICE_element_t; + +typedef struct asn1_CHOICE_tag2member_s { + ber_tlv_tag_t el_tag; /* Outmost tag of the member */ + int el_no; /* Index of the associated member, base 0 */ +} asn1_CHOICE_tag2member_t; + +typedef struct asn1_CHOICE_specifics_s { + /* + * Target structure description. + */ + int struct_size; /* Size of the target structure. */ + int ctx_offset; /* Offset of the ber_dec_ctx_t member */ + int pres_offset; /* Identifier of the present member */ + int pres_size; /* Size of the identifier (enum) */ + + /* + * Members of the CHOICE structure. + */ + asn1_CHOICE_element_t *elements; + int elements_count; + + /* + * Tags to members mapping table. + */ + asn1_CHOICE_tag2member_t *tag2el; + int tag2el_count; + + /* + * Extensions-related stuff. + */ + int extensible; /* Whether CHOICE is extensible */ +} asn1_CHOICE_specifics_t; + +/* + * A set specialized functions dealing with the CHOICE type. + */ +asn_constr_check_f CHOICE_constraint; +ber_type_decoder_f CHOICE_decode_ber; +der_type_encoder_f CHOICE_encode_der; +asn_outmost_tag_f CHOICE_outmost_tag; +asn_struct_print_f CHOICE_print; +asn_struct_free_f CHOICE_free; + +#endif /* _CONSTR_CHOICE_H_ */ diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c new file mode 100644 index 000000000..6704dd843 --- /dev/null +++ b/skeletons/constr_SEQUENCE.c @@ -0,0 +1,588 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include + +/* + * Number of bytes left for this structure. + * (ctx->left) indicates the number of bytes _transferred_ for the structure. + * (size) contains the number of bytes in the buffer passed. + */ +#define LEFT ((sizeleft)?size:ctx->left) + +/* + * If the subprocessor function returns with an indication that it wants + * more data, it may well be a fatal decoding problem, because the + * size is constrained by the 's L, even if the buffer size allows + * reading more data. + * For example, consider the buffer containing the following TLVs: + * ... + * The TLV length clearly indicates that one byte is expected in V, but + * if the V processor returns with "want more data" even if the buffer + * contains way more data than the V processor have seen. + */ +#define SIZE_VIOLATION (ctx->left >= 0 && ctx->left <= size) + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr += num; \ + size -= num; \ + if(ctx->left >= 0) \ + ctx->left -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#define NEXT_PHASE(ctx) do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) +#define PHASE_OUT(ctx) do { ctx->phase = 10; } while(0) + +/* + * Return a standardized complex structure. + */ +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +/* + * Check whether we are inside the extensions group. + */ +#define IN_EXTENSION_GROUP(specs, memb_idx) \ + ( ((memb_idx) > (specs)->ext_after) \ + &&((memb_idx) < (specs)->ext_before)) + +/* + * The decoder of the SEQUENCE type. + */ +ber_dec_rval_t +SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, + void **struct_ptr, void *ptr, size_t size, int tag_mode) { + /* + * Bring closer parts of structure description. + */ + asn1_SEQUENCE_specifics_t *specs = sd->specifics; + asn1_SEQUENCE_element_t *elements = specs->elements; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + ber_dec_ctx_t *ctx; /* Decoder context */ + + ber_tlv_tag_t tlv_tag; /* T from TLV */ + //ber_tlv_len_t tlv_len; /* L from TLV */ + ber_dec_rval_t rval; /* Return code from subparsers */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + int edx; /* SEQUENCE element's index */ + + ASN_DEBUG("Decoding %s as SEQUENCE", sd->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (st + specs->ctx_offset); + + /* + * Start to parse where left previously + */ + switch(ctx->phase) { + case 0: + /* + * PHASE 0. + * Check that the set of tags associated with given structure + * perfectly fits our expectations. + */ + + rval = ber_check_tags(sd, ctx, ptr, size, + tag_mode, &ctx->left, 0); + if(rval.code != RC_OK) { + ASN_DEBUG("%s tagging check failed: %d", + sd->name, rval.code); + consumed_myself += rval.consumed; + RETURN(rval.code); + } + + if(ctx->left >= 0) + ctx->left += rval.consumed; /* ?Substracted below! */ + ADVANCE(rval.consumed); + + NEXT_PHASE(ctx); + + ASN_DEBUG("Structure consumes %ld bytes, buffer %ld", + (long)ctx->left, (long)size); + + /* Fall through */ + case 1: + /* + * PHASE 1. + * From the place where we've left it previously, + * try to decode the next member from the list of + * this structure's elements. + * (ctx->step) stores the member being processed + * between invocations and the microphase {0,1} of parsing + * that member: + * step = ( * 2 + ). + */ + for(edx = (ctx->step >> 1); edx < specs->elements_count; + edx++, ctx->step = (ctx->step & ~1) + 2) { + void *memb_ptr; /* Pointer to the member */ + void *memb_ptr2; /* Pointer to that pointer */ + ssize_t tag_len; /* Length of TLV's T */ + int opt_edx_end; /* Next non-optional element */ + int n; + + if(ctx->step & 1) + goto microphase2; + + /* + * MICROPHASE 1: Synchronize decoding. + */ + ASN_DEBUG("In %s SEQUENCE left %d, edx=%d opt=%d ec=%d", + sd->name, (int)ctx->left, + edx, elements[edx].optional, specs->elements_count); + + if(ctx->left == 0 /* No more stuff is expected */ + && ( + /* Explicit OPTIONAL specification reaches the end */ + (edx + elements[edx].optional == specs->elements_count) + || + /* All extensions are optional */ + (IN_EXTENSION_GROUP(specs, edx) + && specs->ext_before > specs->elements_count) + ) + ) { + ASN_DEBUG("End of SEQUENCE %s", sd->name); + /* + * Found the legitimate end of the structure. + */ + PHASE_OUT(ctx); + RETURN(RC_OK); + } + + /* + * Fetch the T from TLV. + */ + tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); + ASN_DEBUG("In %s SEQUENCE for %d %s next tag length %d", + sd->name, edx, elements[edx].name, (int)tag_len); + switch(tag_len) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + /* + * Find the next available type with this tag. + */ + opt_edx_end = edx + elements[edx].optional + 1; + if(opt_edx_end > specs->elements_count) + opt_edx_end = specs->elements_count; /* Cap */ + for(n = edx; n < opt_edx_end; n++) { + if(BER_TAGS_EQUAL(tlv_tag, elements[n].tag)) { + /* + * Found element corresponding to the tag + * being looked at. + * Reposition over the right element. + */ + edx = n; + ctx->step = 2 * edx; /* Remember! */ + break; + } + } + if(n == opt_edx_end) { + /* + * If tag is unknown, it may be either + * an unknown (thus, incorrect) tag, + * or an extension (...), + * or an end of the indefinite-length structure. + */ + + if(!IN_EXTENSION_GROUP(specs, edx)) { + ASN_DEBUG("Unexpected tag %s", + ber_tlv_tag_string(tlv_tag)); + ASN_DEBUG("Expected tag %s%s", + ber_tlv_tag_string(elements[edx].tag), + elements[edx].optional + ?" or alternatives":""); + RETURN(RC_FAIL); + } + + if(ctx->left < 0 + && ((uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((uint8_t *)ptr)[1] == 0) { + /* + * Yeah, baby! Found the terminator + * of the indefinite length structure. + */ + /* + * Proceed to the canonical + * finalization function. + * No advancing is necessary. + */ + goto phase3; + } + } else { + /* Skip this tag */ + ssize_t skip; + + skip = ber_skip_length( + BER_TLV_CONSTRUCTED(ptr), + ptr + tag_len, LEFT - tag_len); + ASN_DEBUG("Skip length %d in %s", + (int)skip, sd->name); + switch(skip) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + ADVANCE(skip + tag_len); + ctx->step -= 2; + edx--; + continue; /* Try again with the next tag */ + } + } + + /* + * MICROPHASE 2: Invoke the member-specific decoder. + */ + ctx->step |= 1; /* Confirm entering next microphase */ + microphase2: + ASN_DEBUG("Inside SEQUENCE %s MF2", sd->name); + + /* + * Compute the position of the member inside a structure, + * and also a type of containment (it may be contained + * as pointer or using inline inclusion). + */ + if(elements[edx].optional) { + /* Optional member, hereby, a simple pointer */ + memb_ptr2 = (char *)st + elements[edx].memb_offset; + } else { + /* + * A pointer to a pointer + * holding the start of the structure + */ + memb_ptr = (char *)st + elements[edx].memb_offset; + memb_ptr2 = &memb_ptr; + } + /* + * Invoke the member fetch routine according to member's type + */ + rval = elements[edx].type->ber_decoder( + (void *)elements[edx].type, + memb_ptr2, ptr, LEFT, + elements[edx].tag_mode); + ASN_DEBUG("In %s SEQUENCE decoded %d %s in %d bytes code %d", + sd->name, edx, elements[edx].type->name, + (int)rval.consumed, rval.code); + switch(rval.code) { + case RC_OK: + break; + case RC_WMORE: /* More data expected */ + if(!SIZE_VIOLATION) { + ADVANCE(rval.consumed); + RETURN(RC_WMORE); + } + /* Fall through */ + case RC_FAIL: /* Fatal error */ + RETURN(RC_FAIL); + } /* switch(rval) */ + + ADVANCE(rval.consumed); + } /* for(all structure members) */ + + phase3: + ctx->phase = 3; + case 3: /* 00 and other tags expected */ + case 4: /* only 00's expected */ + + ASN_DEBUG("SEQUENCE %s Leftover: %ld, size = %ld", + sd->name, (long)ctx->left, (long)size); + + /* + * Skip everything until the end of the SEQUENCE. + */ + while(ctx->left) { + ssize_t tl, ll; + + tl = ber_fetch_tag(ptr, LEFT, &tlv_tag); + switch(tl) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + /* + * If expected <0><0>... + */ + if(ctx->left < 0 + && ((uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((uint8_t *)ptr)[1] == 0) { + /* + * Correctly finished with <0><0>. + */ + ADVANCE(2); + ctx->left++; + ctx->phase = 4; + continue; + } + } + + if(!IN_EXTENSION_GROUP(specs, specs->elements_count) + || ctx->phase == 4) { + ASN_DEBUG("Unexpected continuation " + "of a non-extensible type " + "%s (SEQUENCE): %s", + sd->name, + ber_tlv_tag_string(tlv_tag)); + RETURN(RC_FAIL); + } + + ll = ber_skip_length( + BER_TLV_CONSTRUCTED(ptr), + ptr + tl, LEFT - tl); + switch(ll) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + ADVANCE(tl + ll); + } + + PHASE_OUT(ctx); + } + + RETURN(RC_OK); +} + +/* + * The DER encoder of the SEQUENCE type. + */ +der_enc_rval_t +SEQUENCE_encode_der(asn1_TYPE_descriptor_t *sd, + void *ptr, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + asn1_SEQUENCE_specifics_t *specs = sd->specifics; + size_t computed_size = 0; + der_enc_rval_t erval; + ssize_t ret; + int edx; + + ASN_DEBUG("%s %s as SEQUENCE", + cb?"Encoding":"Estimating", sd->name); + + /* + * Gather the length of the underlying members sequence. + */ + for(edx = 0; edx < specs->elements_count; edx++) { + asn1_SEQUENCE_element_t *elm = &specs->elements[edx]; + void *memb_ptr; + if(elm->optional) { + memb_ptr = *(void **)((char *)ptr + elm->memb_offset); + if(!memb_ptr) continue; + } else { + memb_ptr = (void *)((char *)ptr + elm->memb_offset); + } + erval = elm->type->der_encoder(elm->type, memb_ptr, + elm->tag_mode, elm->tag, + 0, 0); + if(erval.encoded == -1) + return erval; + computed_size += erval.encoded; + ASN_DEBUG("Member %d %s estimated %ld bytes", + edx, elm->name, (long)erval.encoded); + } + + /* + * Encode the TLV for the sequence itself. + */ + ret = der_write_tags(sd, computed_size, tag_mode, tag, cb, app_key); + ASN_DEBUG("Wrote tags: %ld (+%ld)", (long)ret, (long)computed_size); + if(ret == -1) { + erval.encoded = -1; + erval.failed_type = sd; + erval.structure_ptr = ptr; + return erval; + } + erval.encoded = computed_size + ret; + + if(!cb) return erval; + + /* + * Encode all members. + */ + for(edx = 0; edx < specs->elements_count; edx++) { + asn1_SEQUENCE_element_t *elm = &specs->elements[edx]; + der_enc_rval_t tmperval; + void *memb_ptr; + + if(elm->optional) { + memb_ptr = *(void **)((char *)ptr + elm->memb_offset); + if(!memb_ptr) continue; + } else { + memb_ptr = (void *)((char *)ptr + elm->memb_offset); + } + tmperval = elm->type->der_encoder(elm->type, memb_ptr, + elm->tag_mode, elm->tag, + cb, app_key); + if(tmperval.encoded == -1) + return tmperval; + computed_size -= tmperval.encoded; + ASN_DEBUG("Member %d %s of SEQUENCE %s encoded in %d bytes", + edx, elm->name, sd->name, tmperval.encoded); + } + + if(computed_size != 0) { + /* + * Encoded size is not equal to the computed size. + */ + erval.encoded = -1; + erval.failed_type = sd; + erval.structure_ptr = ptr; + } + + return erval; +} + +int +SEQUENCE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + asn1_SEQUENCE_specifics_t *specs = td->specifics; + int edx; + int ret; + + if(!sptr) return cb("", 8, app_key); + + /* Dump preamble */ + if(cb(td->name, strlen(td->name), app_key) + || cb(" ::= {\n", 7, app_key)) + return -1; + + for(edx = 0; edx < specs->elements_count; edx++) { + asn1_SEQUENCE_element_t *elm = &specs->elements[edx]; + const void *memb_ptr; + + if(elm->optional) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) continue; + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + /* Indentation */ + for(ret = 0; ret < ilevel; ret++) cb(" ", 1, app_key); + + /* Print the member's name and stuff */ + if(cb(elm->name, strlen(elm->name), app_key) + || cb(": ", 2, app_key)) + return -1; + + /* Print the member itself */ + ret = elm->type->print_struct(elm->type, memb_ptr, ilevel + 4, + cb, app_key); + if(ret) return ret; + + /* Print out the terminator */ + ret = cb("\n", 1, app_key); + if(ret) return ret; + } + + /* Indentation */ + for(ret = 0; ret < ilevel - 4; ret++) cb(" ", 1, app_key); + + return cb("}", 1, app_key); +} + +void +SEQUENCE_free(asn1_TYPE_descriptor_t *td, void *sptr, int contents_only) { + asn1_SEQUENCE_specifics_t *specs = td->specifics; + int edx; + + if(!td || !sptr) + return; + + ASN_DEBUG("Freeing %s as SEQUENCE", td->name); + + for(edx = 0; edx < specs->elements_count; edx++) { + asn1_SEQUENCE_element_t *elm = &specs->elements[edx]; + void *memb_ptr; + if(elm->optional) { + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(memb_ptr) + elm->type->free_struct(elm->type, memb_ptr, 0); + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + elm->type->free_struct(elm->type, memb_ptr, 1); + } + } + + if(!contents_only) { + FREEMEM(sptr); + } +} + +int +SEQUENCE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + asn1_SEQUENCE_specifics_t *specs = td->specifics; + int edx; + + if(!sptr) { + _ASN_ERRLOG("%s: value not given", td->name); + return -1; + } + + /* + * Iterate over structure members and check their validity. + */ + for(edx = 0; edx < specs->elements_count; edx++) { + asn1_SEQUENCE_element_t *elm = &specs->elements[edx]; + const void *memb_ptr; + + if(elm->optional) { + memb_ptr = *(const void **)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) continue; + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + return elm->type->check_constraints(elm->type, memb_ptr, + app_errlog, app_key); + } + + return 0; +} diff --git a/skeletons/constr_SEQUENCE.h b/skeletons/constr_SEQUENCE.h new file mode 100644 index 000000000..c15729ca6 --- /dev/null +++ b/skeletons/constr_SEQUENCE.h @@ -0,0 +1,53 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _CONSTR_SEQUENCE_H_ +#define _CONSTR_SEQUENCE_H_ + +#include + +/* + * A single element of the SEQUENCE type. + */ +typedef struct asn1_SEQUENCE_element_s { + int memb_offset; /* Offset of the element */ + int optional; /* Whether the element is optional */ + ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ + int tag_mode; /* IMPLICIT/no/EXPLICIT tag at current level */ + asn1_TYPE_descriptor_t + *type; /* Member type descriptor */ + char *name; /* ASN.1 identifier of the element */ +} asn1_SEQUENCE_element_t; + +typedef struct asn1_SEQUENCE_specifics_s { + /* + * Target structure description. + */ + int struct_size; /* Size of the target structure. */ + int ctx_offset; /* Offset of the ber_dec_ctx_t member */ + + /* + * Members of the SEQUENCE structure. + */ + asn1_SEQUENCE_element_t *elements; + int elements_count; + + /* + * Description of an extensions group. + */ + int ext_after; /* Extensions start after this member */ + int ext_before; /* Extensions stop before this member */ +} asn1_SEQUENCE_specifics_t; + + +/* + * A set specialized functions dealing with the SEQUENCE type. + */ +asn_constr_check_f SEQUENCE_constraint; +ber_type_decoder_f SEQUENCE_decode_ber; +der_type_encoder_f SEQUENCE_encode_der; +asn_struct_print_f SEQUENCE_print; +asn_struct_free_f SEQUENCE_free; + +#endif /* _CONSTR_SEQUENCE_H_ */ diff --git a/skeletons/constr_SEQUENCE_OF.c b/skeletons/constr_SEQUENCE_OF.c new file mode 100644 index 000000000..cdddf6076 --- /dev/null +++ b/skeletons/constr_SEQUENCE_OF.c @@ -0,0 +1,84 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * The DER encoder of the SEQUENCE OF type. + */ +der_enc_rval_t +SEQUENCE_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + asn1_SET_OF_specifics_t *specs = sd->specifics; + asn1_SET_OF_element_t *elm = specs->element; + A_SEQUENCE_OF(void) *list = ptr; + size_t computed_size = 0; + ssize_t encoding_size = 0; + der_enc_rval_t erval; + int edx; + + ASN_DEBUG("Estimating size of SEQUENCE OF %s", sd->name); + + /* + * Gather the length of the underlying members sequence. + */ + for(edx = 0; edx < list->count; edx++) { + void *memb_ptr = list->array[edx]; + erval = elm->type->der_encoder(elm->type, memb_ptr, + 0, elm->tag, + 0, 0); + if(erval.encoded == -1) + return erval; + computed_size += erval.encoded; + } + + /* + * Encode the TLV for the sequence itself. + */ + encoding_size = der_write_tags(sd, computed_size, tag_mode, tag, + cb, app_key); + if(encoding_size == -1) { + erval.encoded = -1; + erval.failed_type = sd; + erval.structure_ptr = ptr; + return erval; + } + + computed_size += encoding_size; + if(!cb) { + erval.encoded = computed_size; + return erval; + } + + ASN_DEBUG("Encoding members of SEQUENCE OF %s", sd->name); + + /* + * Encode all members. + */ + for(edx = 0; edx < list->count; edx++) { + void *memb_ptr = list->array[edx]; + erval = elm->type->der_encoder(elm->type, memb_ptr, + 0, elm->tag, + cb, app_key); + if(erval.encoded == -1) + return erval; + encoding_size += erval.encoded; + } + + if(computed_size != encoding_size) { + /* + * Encoded size is not equal to the computed size. + */ + erval.encoded = -1; + erval.failed_type = sd; + erval.structure_ptr = ptr; + } else { + erval.encoded = computed_size; + } + + return erval; +} + diff --git a/skeletons/constr_SEQUENCE_OF.h b/skeletons/constr_SEQUENCE_OF.h new file mode 100644 index 000000000..d2560c6a2 --- /dev/null +++ b/skeletons/constr_SEQUENCE_OF.h @@ -0,0 +1,21 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _CONSTR_SEQUENCE_OF_H_ +#define _CONSTR_SEQUENCE_OF_H_ + +#include +#include /* Implemented using SET OF */ + +/* + * A set specialized functions dealing with the SEQUENCE OF type. + * Implemented using SET OF. + */ +#define SEQUENCE_OF_constraint SET_OF_constraint +#define SEQUENCE_OF_decode_ber SET_OF_decode_ber +der_type_encoder_f SEQUENCE_OF_encode_der; +#define SEQUENCE_OF_print SET_OF_print +#define SEQUENCE_OF_free SET_OF_free + +#endif /* _CONSTR_SET_OF_H_ */ diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c new file mode 100644 index 000000000..f1df9c1b3 --- /dev/null +++ b/skeletons/constr_SET.c @@ -0,0 +1,682 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include /* for ntohl() */ +#include /* for assert() */ + +/* + * Number of bytes left for this structure. + * (ctx->left) indicates the number of bytes _transferred_ for the structure. + * (size) contains the number of bytes in the buffer passed. + */ +#define LEFT ((sizeleft)?size:ctx->left) + +/* + * If the subprocessor function returns with an indication that it wants + * more data, it may well be a fatal decoding problem, because the + * size is constrained by the 's L, even if the buffer size allows + * reading more data. + * For example, consider the buffer containing the following TLVs: + * ... + * The TLV length clearly indicates that one byte is expected in V, but + * if the V processor returns with "want more data" even if the buffer + * contains way more data than the V processor have seen. + */ +#define SIZE_VIOLATION (ctx->left >= 0 && ctx->left <= size) + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr += num; \ + size -= num; \ + if(ctx->left >= 0) \ + ctx->left -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#define NEXT_PHASE(ctx) do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) + +/* + * Return a standardized complex structure. + */ +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +/* + * Tags are canonically sorted in the tag2element map. + */ +static int +_t2e_cmp(const void *ap, const void *bp) { + const asn1_SET_tag2member_t *a = ap; + const asn1_SET_tag2member_t *b = bp; + int a_class = BER_TAG_CLASS(a->el_tag); + int b_class = BER_TAG_CLASS(b->el_tag); + + if(a_class == b_class) { + ber_tlv_tag_t a_value = BER_TAG_VALUE(a->el_tag); + ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag); + + if(a_value == b_value) + return 0; + else if(a_value < b_value) + return -1; + else + return 1; + } else if(a_class < b_class) { + return -1; + } else { + return 1; + } +} + +/* + * The decoder of the SET type. + */ +ber_dec_rval_t +SET_decode_ber(asn1_TYPE_descriptor_t *sd, + void **struct_ptr, void *ptr, size_t size, int tag_mode) { + /* + * Bring closer parts of structure description. + */ + asn1_SET_specifics_t *specs = sd->specifics; + asn1_SET_element_t *elements = specs->elements; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + ber_dec_ctx_t *ctx; /* Decoder context */ + + ber_tlv_tag_t tlv_tag; /* T from TLV */ + //ber_tlv_len_t tlv_len; /* L from TLV */ + ber_dec_rval_t rval; /* Return code from subparsers */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + int edx; /* SET element's index */ + + ASN_DEBUG("Decoding %s as SET", sd->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (st + specs->ctx_offset); + + /* + * Start to parse where left previously + */ + switch(ctx->phase) { + case 0: + /* + * PHASE 0. + * Check that the set of tags associated with given structure + * perfectly fits our expectations. + */ + + rval = ber_check_tags(sd, ctx, ptr, size, + tag_mode, &ctx->left, 0); + if(rval.code != RC_OK) { + ASN_DEBUG("%s tagging check failed: %d", + sd->name, rval.code); + consumed_myself += rval.consumed; + RETURN(rval.code); + } + + if(ctx->left >= 0) + ctx->left += rval.consumed; /* ?Substracted below! */ + ADVANCE(rval.consumed); + + NEXT_PHASE(ctx); + + ASN_DEBUG("Structure advertised %ld bytes, " + "buffer contains %ld", (long)ctx->left, (long)size); + + /* Fall through */ + case 1: + /* + * PHASE 1. + * From the place where we've left it previously, + * try to decode the next member from the list of + * this structure's elements. + * (ctx->step) stores the member being processed + * between invocations and the microphase {0,1} of parsing + * that member: + * step = (2 * + ). + * Note, however, that the elements in BER may arrive out of + * order, yet DER mandates that they shall arive in the + * canonical order of their tags. So, there is a room + * for optimization. + */ + for(edx = (ctx->step >> 1); edx < specs->elements_count; + ctx->step = (ctx->step & ~1) + 2, + edx = (ctx->step >> 1)) { + void *memb_ptr; /* Pointer to the member */ + void *memb_ptr2; /* Pointer to that pointer */ + ssize_t tag_len; /* Length of TLV's T */ + + if(ctx->step & 1) + goto microphase2; + + /* + * MICROPHASE 1: Synchronize decoding. + */ + + if(ctx->left == 0) + /* + * No more things to decode. + * Exit out of here and check whether all mandatory + * elements have been received (in the next phase). + */ + break; + + /* + * Fetch the T from TLV. + */ + tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); + switch(tag_len) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + if(ctx->left < 0 && ((uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((uint8_t *)ptr)[1] == 0) { + /* + * Found the terminator of the + * indefinite length structure. + * Invoke the generic finalization function. + */ + goto phase3; + } + } + + if(BER_TAGS_EQUAL(tlv_tag, elements[edx].tag)) { + /* + * The elements seem to go in order. + * This is not particularly strange, + * but is not strongly anticipated either. + */ + } else { + asn1_SET_tag2member_t *t2m; + asn1_SET_tag2member_t key; + + key.el_tag = tlv_tag; + t2m = bsearch(&key, specs->tag2el, specs->tag2el_count, + sizeof(specs->tag2el[0]), _t2e_cmp); + if(t2m) { + /* + * Found the element corresponding to the tag. + */ + edx = t2m->el_no; + ctx->step = 2 * edx; + } else if(specs->extensible == 0) { + ASN_DEBUG("Unexpected tag %s " + "in non-extensible SET %s", + ber_tlv_tag_string(tlv_tag), sd->name); + RETURN(RC_FAIL); + } else { + /* Skip this tag */ + ssize_t skip; + + ASN_DEBUG("Skipping unknown tag %s", + ber_tlv_tag_string(tlv_tag)); + + skip = ber_skip_length( + BER_TLV_CONSTRUCTED(ptr), + ptr + tag_len, LEFT - tag_len); + + switch(skip) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + ADVANCE(skip + tag_len); + ctx->step -= 2; + edx--; + continue; /* Try again with the next tag */ + } + } + + /* + * MICROPHASE 2: Invoke the member-specific decoder. + */ + ctx->step |= 1; /* Confirm entering next microphase */ + microphase2: + + /* + * Check for duplications: must not overwrite + * already decoded elements. + */ + if(ASN_SET_ISPRESENT2(st + specs->pres_offset, edx)) { + ASN_DEBUG("Duplicate element %d", edx); + RETURN(RC_FAIL); + } + + /* + * Compute the position of the member inside a structure, + * and also a type of containment (it may be contained + * as pointer or using inline inclusion). + */ + if(elements[edx].optional) { + /* Optional member, hereby, a simple pointer */ + memb_ptr2 = (char *)st + elements[edx].memb_offset; + } else { + /* + * A pointer to a pointer + * holding the start of the structure + */ + memb_ptr = (char *)st + elements[edx].memb_offset; + memb_ptr2 = &memb_ptr; + } + /* + * Invoke the member fetch routine according to member's type + */ + rval = elements[edx].type->ber_decoder( + (void *)elements[edx].type, + memb_ptr2, ptr, LEFT, + elements[edx].tag_mode); + switch(rval.code) { + case RC_OK: + ASN_SET_MKPRESENT(st + specs->pres_offset, edx); + break; + case RC_WMORE: /* More data expected */ + if(!SIZE_VIOLATION) { + ADVANCE(rval.consumed); + RETURN(RC_WMORE); + } + /* Fail through */ + case RC_FAIL: /* Fatal error */ + RETURN(RC_FAIL); + } /* switch(rval) */ + + ADVANCE(rval.consumed); + } /* for(all structure members) */ + + phase3: + ctx->phase = 3; + /* Fall through */ + case 3: + case 4: /* Only 00 is expected */ + ASN_DEBUG("SET %s Leftover: %ld, size = %ld", + sd->name, (long)ctx->left, (long)size); + + /* + * Skip everything until the end of the SET. + */ + while(ctx->left) { + ssize_t tl, ll; + + tl = ber_fetch_tag(ptr, LEFT, &tlv_tag); + switch(tl) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + /* + * If expected <0><0>... + */ + if(ctx->left < 0 + && ((uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((uint8_t *)ptr)[1] == 0) { + /* + * Correctly finished with <0><0>. + */ + ADVANCE(2); + ctx->left++; + ctx->phase = 4; + continue; + } + } + + if(specs->extensible == 0 || ctx->phase == 4) { + ASN_DEBUG("Unexpected continuation " + "of a non-extensible type %s", + sd->name); + RETURN(RC_FAIL); + } + + ll = ber_skip_length( + BER_TLV_CONSTRUCTED(ptr), + ptr + tl, LEFT - tl); + switch(ll) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + ADVANCE(tl + ll); + } + + ctx->phase = 5; + case 5: + /* + * Check that all mandatory elements are present. + */ + for(edx = 0; edx < specs->elements_count; + edx += (8 * sizeof(specs->_mandatory_elements[0]))) { + unsigned int midx, pres, must; + + midx = edx/(8 * sizeof(specs->_mandatory_elements[0])); + pres = ((unsigned int *)(st+specs->pres_offset))[midx]; + must = ntohl(specs->_mandatory_elements[midx]); + + if((pres & must) == must) { + /* + * Yes, everything seems to be in place. + */ + } else { + ASN_DEBUG("One or more mandatory elements " + "of a SET %s %d (%08x.%08x)=%08x " + "are not present", + sd->name, + midx, + pres, + must, + (~(pres & must) & must) + ); + RETURN(RC_FAIL); + } + } + + NEXT_PHASE(ctx); + } + + RETURN(RC_OK); +} + +/* + * The DER encoder of the SET type. + */ +der_enc_rval_t +SET_encode_der(asn1_TYPE_descriptor_t *sd, + void *ptr, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + asn1_SET_specifics_t *specs = sd->specifics; + size_t computed_size = 0; + der_enc_rval_t my_erval; + int t2m_build_own = (specs->tag2el_count != specs->elements_count); + asn1_SET_tag2member_t *t2m; + int t2m_count; + ssize_t ret; + int edx; + + /* + * Use existing, or build our own tags map. + */ + if(t2m_build_own) { + t2m = alloca(specs->elements_count * sizeof(t2m[0])); + t2m_count = 0; + } else { + /* + * There is no untagged CHOICE in this SET. + * Employ existing table. + */ + t2m = specs->tag2el; + t2m_count = specs->tag2el_count; + } + + /* + * Gather the length of the underlying members sequence. + */ + for(edx = 0; edx < specs->elements_count; edx++) { + asn1_SET_element_t *elm = &specs->elements[edx]; + der_enc_rval_t erval; + void *memb_ptr; + + /* + * Compute the length of the encoding of this member. + */ + if(elm->optional) { + memb_ptr = *(void **)((char *)ptr + elm->memb_offset); + if(!memb_ptr) { + if(t2m_build_own) { + t2m[t2m_count].el_no = edx; + t2m[t2m_count].el_tag = 0; + t2m_count++; + } + continue; + } + } else { + memb_ptr = (void *)((char *)ptr + elm->memb_offset); + } + erval = elm->type->der_encoder(elm->type, memb_ptr, + elm->tag_mode, elm->tag, + 0, 0); + if(erval.encoded == -1) + return erval; + computed_size += erval.encoded; + + /* + * Remember the outmost tag of this member. + */ + if(t2m_build_own) { + t2m[t2m_count].el_no = edx; + t2m[t2m_count].el_tag = asn1_TYPE_outmost_tag( + elm->type, memb_ptr, elm->tag_mode, elm->tag); + t2m_count++; + } else { + /* + * No dynamic sorting is necessary. + */ + } + } + + /* + * Finalize order of the components. + */ + assert(t2m_count == specs->elements_count); + if(t2m_build_own) { + /* + * Sort the underlying members according to their + * canonical tags order. DER encoding mandates it. + */ + qsort(t2m, t2m_count, sizeof(specs->tag2el[0]), _t2e_cmp); + } else { + /* + * Tags are already sorted by the compiler. + */ + } + + /* + * Encode the TLV for the sequence itself. + */ + ret = der_write_tags(sd, computed_size, tag_mode, tag, cb, app_key); + if(ret == -1) { + my_erval.encoded = -1; + my_erval.failed_type = sd; + my_erval.structure_ptr = ptr; + return my_erval; + } + my_erval.encoded = computed_size + ret; + + if(!cb) return my_erval; + + /* + * Encode all members. + */ + for(edx = 0; edx < specs->elements_count; edx++) { + asn1_SET_element_t *elm; + der_enc_rval_t erval; + void *memb_ptr; + + /* Encode according to the tag order */ + elm = &specs->elements[t2m[edx].el_no]; + + if(elm->optional) { + memb_ptr = *(void **)((char *)ptr + elm->memb_offset); + if(!memb_ptr) continue; + } else { + memb_ptr = (void *)((char *)ptr + elm->memb_offset); + } + erval = elm->type->der_encoder(elm->type, memb_ptr, + elm->tag_mode, elm->tag, + cb, app_key); + if(erval.encoded == -1) + return erval; + computed_size -= erval.encoded; + } + + if(computed_size != 0) { + /* + * Encoded size is not equal to the computed size. + */ + my_erval.encoded = -1; + my_erval.failed_type = sd; + my_erval.structure_ptr = ptr; + } + + return my_erval; +} + +int +SET_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + asn1_SET_specifics_t *specs = td->specifics; + int edx; + int ret; + + if(!sptr) return cb("", 8, app_key); + + /* Dump preamble */ + if(cb(td->name, strlen(td->name), app_key) + || cb(" ::= {\n", 7, app_key)) + return -1; + + for(edx = 0; edx < specs->elements_count; edx++) { + asn1_SET_element_t *elm = &specs->elements[edx]; + const void *memb_ptr; + + if(elm->optional) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) continue; + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + /* Indentation */ + for(ret = 0; ret < ilevel; ret++) cb(" ", 1, app_key); + + /* Print the member's name and stuff */ + if(cb(elm->name, strlen(elm->name), app_key) + || cb(": ", 2, app_key)) + return -1; + + /* Print the member itself */ + ret = elm->type->print_struct(elm->type, memb_ptr, ilevel + 4, + cb, app_key); + if(ret) return ret; + + ret = cb("\n", 1, app_key); + if(ret) return ret; + } + + /* Indentation */ + for(ret = 0; ret < ilevel - 4; ret++) cb(" ", 1, app_key); + + return cb("}", 1, app_key); +} + +void +SET_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { + asn1_SET_specifics_t *specs = td->specifics; + int edx; + + if(!td || !ptr) + return; + + ASN_DEBUG("Freeing %s as SET", td->name); + + for(edx = 0; edx < specs->elements_count; edx++) { + asn1_SET_element_t *elm = &specs->elements[edx]; + void *memb_ptr; + if(elm->optional) { + memb_ptr = *(void **)((char *)ptr + elm->memb_offset); + if(memb_ptr) + elm->type->free_struct(elm->type, memb_ptr, 0); + } else { + memb_ptr = (void *)((char *)ptr + elm->memb_offset); + elm->type->free_struct(elm->type, memb_ptr, 1); + } + } + + if(!contents_only) { + FREEMEM(ptr); + } +} + +int +SET_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + asn1_SET_specifics_t *specs = td->specifics; + int edx; + + if(!sptr) { + _ASN_ERRLOG("%s: value not given", td->name); + return -1; + } + + /* + * Iterate over structure members and check their validity. + */ + for(edx = 0; edx < specs->elements_count; edx++) { + asn1_SET_element_t *elm = &specs->elements[edx]; + const void *memb_ptr; + + if(elm->optional) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) { + if(ASN_SET_ISPRESENT2( + &(specs->_mandatory_elements), edx)) { + _ASN_ERRLOG( + "%s: mandatory element " + "%s absent", + td->name, elm->name); + return -1; + } + continue; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + return elm->type->check_constraints(elm->type, memb_ptr, + app_errlog, app_key); + } + + return 0; +} diff --git a/skeletons/constr_SET.h b/skeletons/constr_SET.h new file mode 100644 index 000000000..c0ac07f5c --- /dev/null +++ b/skeletons/constr_SET.h @@ -0,0 +1,90 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _CONSTR_SET_H_ +#define _CONSTR_SET_H_ + +#include + +/* + * Description of a single element of the SET type. + */ +typedef struct asn1_SET_element_s { + int memb_offset; /* Offset of the element */ + int optional; /* Whether the element is optional */ + ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ + int tag_mode; /* IMPLICIT/no/EXPLICIT tag at current level */ + asn1_TYPE_descriptor_t + *type; /* Member type descriptor */ + char *name; /* ASN.1 identifier of the element */ +} asn1_SET_element_t; + +/* + * Map between the outmost tag of the element and the corresponding + * element's index. + */ +typedef struct asn1_SET_tag2member_s { + ber_tlv_tag_t el_tag; /* Outmost tag of the member */ + int el_no; /* Index of the associated member, base 0 */ +} asn1_SET_tag2member_t; + +typedef struct asn1_SET_specifics_s { + /* + * Target structure description. + */ + int struct_size; /* Size of the target structure. */ + int ctx_offset; /* Offset of the ber_dec_ctx_t member */ + int pres_offset; /* Offset of _presence_map member */ + + /* + * Members of the SET structure. + */ + asn1_SET_element_t *elements; + int elements_count; + + /* + * Tags to members mapping table (sorted). + */ + asn1_SET_tag2member_t *tag2el; + int tag2el_count; + + /* + * Extensions-related stuff. + */ + int extensible; /* Whether SET is extensible */ + unsigned int *_mandatory_elements; /* Bitmask of mandatory ones */ +} asn1_SET_specifics_t; + +/* + * A set specialized functions dealing with the SET type. + */ +asn_constr_check_f SET_constraint; +ber_type_decoder_f SET_decode_ber; +der_type_encoder_f SET_encode_der; +asn_struct_print_f SET_print; +asn_struct_free_f SET_free; + +/*********************** + * Some handy helpers. * + ***********************/ + +/* + * Figure out whether the SET member indicated by PR_x has already been decoded. + * It is very simple bitfield test, despite its visual complexity. + */ +#define ASN_SET_ISPRESENT(set_ptr, PR_x) \ + ASN_SET_ISPRESENT2(&((set_ptr)->_presence_map)) +#define ASN_SET_ISPRESENT2(map_ptr, PR_x) \ + (((unsigned int *)(map_ptr)) \ + [(PR_x) / (8 * sizeof(unsigned int))] \ + & (1 << ((8 * sizeof(unsigned int)) - 1 \ + - ((PR_x) % (8 * sizeof(unsigned int)))))) + +#define ASN_SET_MKPRESENT(map_ptr, PR_x) \ + (((unsigned int *)(map_ptr)) \ + [(PR_x) / (8 * sizeof(unsigned int))] \ + |= (1 << ((8 * sizeof(unsigned int)) - 1 \ + - ((PR_x) % (8 * sizeof(unsigned int)))))) + +#endif /* _CONSTR_SET_H_ */ diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c new file mode 100644 index 000000000..9dcf638f9 --- /dev/null +++ b/skeletons/constr_SET_OF.c @@ -0,0 +1,530 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * Number of bytes left for this structure. + * (ctx->left) indicates the number of bytes _transferred_ for the structure. + * (size) contains the number of bytes in the buffer passed. + */ +#define LEFT ((sizeleft)?size:ctx->left) + +/* + * If the subprocessor function returns with an indication that it wants + * more data, it may well be a fatal decoding problem, because the + * size is constrained by the 's L, even if the buffer size allows + * reading more data. + * For example, consider the buffer containing the following TLVs: + * ... + * The TLV length clearly indicates that one byte is expected in V, but + * if the V processor returns with "want more data" even if the buffer + * contains way more data than the V processor have seen. + */ +#define SIZE_VIOLATION (ctx->left != -1 && ctx->left <= size) + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr += num; \ + size -= num; \ + if(ctx->left >= 0) \ + ctx->left -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#define NEXT_PHASE(ctx) do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) +#define PHASE_OUT(ctx) do { ctx->phase = 10; } while(0) + +/* + * Return a standardized complex structure. + */ +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +/* + * The decoder of the SET OF type. + */ +ber_dec_rval_t +SET_OF_decode_ber(asn1_TYPE_descriptor_t *sd, + void **struct_ptr, void *ptr, size_t size, int tag_mode) { + /* + * Bring closer parts of structure description. + */ + asn1_SET_OF_specifics_t *specs = sd->specifics; + asn1_SET_OF_element_t *element = specs->element; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + ber_dec_ctx_t *ctx; /* Decoder context */ + + ber_tlv_tag_t tlv_tag; /* T from TLV */ + //ber_tlv_len_t tlv_len; /* L from TLV */ + ber_dec_rval_t rval; /* Return code from subparsers */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + + ASN_DEBUG("Decoding %s as SET OF", sd->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (st + specs->ctx_offset); + + /* + * Start to parse where left previously + */ + switch(ctx->phase) { + case 0: + /* + * PHASE 0. + * Check that the set of tags associated with given structure + * perfectly fits our expectations. + */ + + rval = ber_check_tags(sd, ctx, ptr, size, + tag_mode, &ctx->left, 0); + if(rval.code != RC_OK) { + ASN_DEBUG("%s tagging check failed: %d", + sd->name, rval.code); + consumed_myself += rval.consumed; + RETURN(rval.code); + } + + if(ctx->left >= 0) + ctx->left += rval.consumed; /* ?Substracted below! */ + ADVANCE(rval.consumed); + + ASN_DEBUG("Structure consumes %ld bytes, " + "buffer %ld", (long)ctx->left, (long)size); + + NEXT_PHASE(ctx); + /* Fall through */ + case 1: + /* + * PHASE 1. + * From the place where we've left it previously, + * try to decode the next item. + */ + for(;; ctx->step = 0) { + ssize_t tag_len; /* Length of TLV's T */ + + if(ctx->step & 1) + goto microphase2; + + /* + * MICROPHASE 1: Synchronize decoding. + */ + + if(ctx->left == 0) { + ASN_DEBUG("End of SET OF %s", sd->name); + /* + * No more things to decode. + * Exit out of here. + */ + PHASE_OUT(ctx); + RETURN(RC_OK); + } + + /* + * Fetch the T from TLV. + */ + tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); + switch(tag_len) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + if(ctx->left < 0 && ((uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((uint8_t *)ptr)[1] == 0) { + /* + * Found the terminator of the + * indefinite length structure. + */ + break; + } + } + + /* Outmost tag may be unknown and cannot be fetched/compared */ + if(element->tag != -1) { + if(BER_TAGS_EQUAL(tlv_tag, element->tag)) { + /* + * The new list member of expected type has arrived. + */ + } else { + ASN_DEBUG("Unexpected tag %s fixed SET OF %s", + ber_tlv_tag_string(tlv_tag), sd->name); + ASN_DEBUG("%s SET OF has tag %s", + sd->name, ber_tlv_tag_string(element->tag)); + RETURN(RC_FAIL); + } + } + + /* + * MICROPHASE 2: Invoke the member-specific decoder. + */ + ctx->step |= 1; /* Confirm entering next microphase */ + microphase2: + + /* + * Invoke the member fetch routine according to member's type + */ + rval = element->type->ber_decoder( + (void *)element->type, + &ctx->ptr, ptr, LEFT, 0); + ASN_DEBUG("In %s SET OF %s code %d consumed %d", + sd->name, element->type->name, + rval.code, (int)rval.consumed); + switch(rval.code) { + case RC_OK: + { + A_SET_OF(void) *list = st; + if(ASN_SET_ADD(list, ctx->ptr) != 0) + RETURN(RC_FAIL); + else + ctx->ptr = 0; + } + break; + case RC_WMORE: /* More data expected */ + if(!SIZE_VIOLATION) { + ADVANCE(rval.consumed); + RETURN(RC_WMORE); + } + /* Fall through */ + case RC_FAIL: /* Fatal error */ + RETURN(RC_FAIL); + } /* switch(rval) */ + + ADVANCE(rval.consumed); + } /* for(all list members) */ + + NEXT_PHASE(ctx); + case 2: + /* + * Read in all "end of content" TLVs. + */ + while(ctx->left < 0) { + if(LEFT < 2) { + if(LEFT > 0 && ((char *)ptr)[0] != 0) { + /* Unexpected tag */ + RETURN(RC_FAIL); + } else { + RETURN(RC_WMORE); + } + } + if(((char *)ptr)[0] == 0 + && ((char *)ptr)[1] == 0) { + ADVANCE(2); + ctx->left++; + } else { + RETURN(RC_FAIL); + } + } + + PHASE_OUT(ctx); + } + + RETURN(RC_OK); +} + +/* + * Internally visible buffer holding a single encoded element. + */ +struct _el_buffer { + uint8_t *buf; + size_t length; + size_t size; +}; +/* Append bytes to the above structure */ +static int _el_addbytes(const void *buffer, size_t size, void *el_buf_ptr) { + struct _el_buffer *el_buf = el_buf_ptr; + + if(el_buf->length + size > el_buf->size) + return -1; + + memcpy(el_buf->buf + el_buf->length, buffer, size); + + el_buf->length += size; + return 0; +} +static int _el_buf_cmp(const void *ap, const void *bp) { + const struct _el_buffer *a = ap; + const struct _el_buffer *b = bp; + int ret; + size_t common_len; + + if(a->length < b->length) + common_len = a->length; + else + common_len = b->length; + + ret = memcmp(a->buf, b->buf, common_len); + if(ret == 0) { + if(a->length < b->length) + ret = -1; + else if(a->length > b->length) + ret = 1; + } + + return ret; +} + +/* + * The DER encoder of the SET OF type. + */ +der_enc_rval_t +SET_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + asn1_SET_OF_specifics_t *specs = sd->specifics; + asn1_SET_OF_element_t *elm = specs->element; + asn1_TYPE_descriptor_t *elm_type = elm->type; + der_type_encoder_f *der_encoder = elm_type->der_encoder; + A_SET_OF(void) *list = ptr; + size_t computed_size = 0; + ssize_t encoding_size = 0; + struct _el_buffer *encoded_els; + size_t max_encoded_len = 1; + der_enc_rval_t erval; + int ret; + int edx; + + ASN_DEBUG("Estimating size for SET OF %s", sd->name); + + /* + * Gather the length of the underlying members sequence. + */ + for(edx = 0; edx < list->count; edx++) { + void *memb_ptr = list->array[edx]; + erval = der_encoder(elm_type, memb_ptr, 0, elm->tag, 0, 0); + if(erval.encoded == -1) + return erval; + computed_size += erval.encoded; + + /* Compute maximum encoding's size */ + if(max_encoded_len < erval.encoded) + max_encoded_len = erval.encoded; + } + + /* + * Encode the TLV for the sequence itself. + */ + encoding_size = der_write_tags(sd, computed_size, tag_mode, tag, + cb, app_key); + if(encoding_size == -1) { + erval.encoded = -1; + erval.failed_type = sd; + erval.structure_ptr = ptr; + return erval; + } + computed_size += encoding_size; + + if(!cb) { + erval.encoded = computed_size; + return erval; + } + + /* + * DER mandates dynamic sorting of the SET OF elements + * according to their encodings. Build an array of the + * encoded elements. + */ + encoded_els = MALLOC(list->count * sizeof(encoded_els[0])); + if(encoded_els == NULL) { + erval.encoded = -1; + erval.failed_type = sd; + erval.structure_ptr = ptr; + return erval; + } + + ASN_DEBUG("Encoding members of %s SET OF", sd->name); + + /* + * Encode all members. + */ + for(edx = 0; edx < list->count; edx++) { + void *memb_ptr = list->array[edx]; + struct _el_buffer *encoded_el = &encoded_els[edx]; + + /* + * Prepare space for encoding. + */ + encoded_el->buf = MALLOC(max_encoded_len); + if(encoded_el->buf) { + encoded_el->length = 0; + encoded_el->size = max_encoded_len; + } else { + for(edx--; edx >= 0; edx--) + FREEMEM(encoded_els[edx].buf); + FREEMEM(encoded_els); + erval.encoded = -1; + erval.failed_type = sd; + erval.structure_ptr = ptr; + return erval; + } + + /* + * Encode the member into the prepared space. + */ + erval = der_encoder(elm_type, memb_ptr, 0, elm->tag, + _el_addbytes, encoded_el); + if(erval.encoded == -1) { + for(; edx >= 0; edx--) + FREEMEM(encoded_els[edx].buf); + FREEMEM(encoded_els); + return erval; + } + encoding_size += erval.encoded; + } + + /* + * Sort the encoded elements according to their encoding. + */ + qsort(encoded_els, list->count, sizeof(encoded_els[0]), _el_buf_cmp); + + /* + * Report encoded elements to the application. + * Dispose of temporary sorted members table. + */ + ret = 0; + for(edx = 0; edx < list->count; edx++) { + struct _el_buffer *encoded_el = &encoded_els[edx]; + /* Report encoded chunks to the application */ + if(ret == 0 + && cb(encoded_el->buf, encoded_el->length, app_key) == -1) + ret = -1; + FREEMEM(encoded_el->buf); + } + FREEMEM(encoded_els); + + if(ret || computed_size != encoding_size) { + /* + * Standard callback failed, or + * encoded size is not equal to the computed size. + */ + erval.encoded = -1; + erval.failed_type = sd; + erval.structure_ptr = ptr; + } else { + erval.encoded = computed_size; + } + + return erval; +} + +int +SET_OF_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + asn1_SET_OF_specifics_t *specs = td->specifics; + asn1_SET_OF_element_t *element = specs->element; + const A_SET_OF(void) *list = sptr; + int ret; + int i; + + if(!sptr) return cb("", 8, app_key); + + /* Dump preamble */ + if(cb(td->name, strlen(td->name), app_key) + || cb(" ::= {\n", 7, app_key)) + return -1; + + for(i = 0; i < list->count; i++) { + const void *memb_ptr = list->array[i]; + if(!memb_ptr) continue; + + /* Indentation */ + for(ret = 0; ret < ilevel; ret++) cb(" ", 1, app_key); + + ret = element->type->print_struct(element->type, memb_ptr, + ilevel + 4, cb, app_key); + if(ret) return ret; + + ret = cb("\n", 1, app_key); + if(ret) return ret; + } + + /* Indentation */ + for(ret = 0; ret < ilevel - 4; ret++) cb(" ", 1, app_key); + + return cb("}", 1, app_key); +} + +void +SET_OF_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { + if(td && ptr) { + asn1_SET_OF_specifics_t *specs = td->specifics; + asn1_SET_OF_element_t *element = specs->element; + A_SET_OF(void) *list = ptr; + int i; + + /* + * Could not use set_of_empty() because of (*free) + * incompatibility. + */ + for(i = 0; i < list->count; i++) { + void *memb_ptr = list->array[i]; + if(memb_ptr) + element->type->free_struct(element->type, memb_ptr, 0); + } + list->count = 0; /* Just in case */ + + if(!contents_only) { + FREEMEM(ptr); + } + } +} + +int +SET_OF_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + asn1_SET_OF_specifics_t *specs = td->specifics; + asn1_SET_OF_element_t *element = specs->element; + const A_SET_OF(void) *list = sptr; + int i; + + if(!sptr) { + _ASN_ERRLOG("%s: value not given", td->name); + return -1; + } + + for(i = 0; i < list->count; i++) { + const void *memb_ptr = list->array[i]; + if(!memb_ptr) continue; + return element->type->check_constraints(element->type, memb_ptr, + app_errlog, app_key); + } + + return 0; +} diff --git a/skeletons/constr_SET_OF.h b/skeletons/constr_SET_OF.h new file mode 100644 index 000000000..814774dcb --- /dev/null +++ b/skeletons/constr_SET_OF.h @@ -0,0 +1,38 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _CONSTR_SET_OF_H_ +#define _CONSTR_SET_OF_H_ + +#include + +typedef struct asn1_SET_OF_element_s { + ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ + asn1_TYPE_descriptor_t + *type; /* Member type descriptor */ +} asn1_SET_OF_element_t; + +typedef struct asn1_SET_OF_specifics_s { + /* + * Target structure description. + */ + int struct_size; /* Size of the target structure. */ + int ctx_offset; /* Offset of the ber_dec_ctx_t member */ + + /* + * Members of the SET OF list. + */ + asn1_SET_OF_element_t *element; +} asn1_SET_OF_specifics_t; + +/* + * A set specialized functions dealing with the SET OF type. + */ +asn_constr_check_f SET_OF_constraint; +ber_type_decoder_f SET_OF_decode_ber; +der_type_encoder_f SET_OF_encode_der; +asn_struct_print_f SET_OF_print; +asn_struct_free_f SET_OF_free; + +#endif /* _CONSTR_SET_OF_H_ */ diff --git a/skeletons/constr_TYPE.c b/skeletons/constr_TYPE.c new file mode 100644 index 000000000..9ab1bdc5a --- /dev/null +++ b/skeletons/constr_TYPE.c @@ -0,0 +1,58 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +static asn_app_consume_bytes_f _print2fp; + +/* + * Return the outmost tag of the type. + */ +ber_tlv_tag_t +asn1_TYPE_outmost_tag(asn1_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, int tag_mode, ber_tlv_tag_t tag) { + + if(tag_mode) + return tag; + + if(type_descriptor->tags_count) + return type_descriptor->tags[0]; + + return type_descriptor->outmost_tag(type_descriptor, struct_ptr, 0, 0); +} + +/* + * Print the target language's structure in human readable form. + */ +int +asn_fprint(FILE *stream, asn1_TYPE_descriptor_t *td, const void *struct_ptr) { + if(!stream) stream = stdout; + if(!td || !struct_ptr) { + errno = EINVAL; + return -1; + } + + /* Invoke type-specific printer */ + if(td->print_struct(td, struct_ptr, 4, _print2fp, stream)) + return -1; + + /* Terminate the output */ + if(_print2fp("\n", 1, stream)) + return -1; + + return fflush(stream); +} + +/* Dump the data into the specified stdio stream */ +static int +_print2fp(const void *buffer, size_t size, void *app_key) { + FILE *stream = app_key; + + if(fwrite(buffer, 1, size, stream) != size) + return -1; + + return 0; +} + diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h new file mode 100644 index 000000000..c7cfb22ba --- /dev/null +++ b/skeletons/constr_TYPE.h @@ -0,0 +1,98 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _CONSTR_TYPE_H_ +#define _CONSTR_TYPE_H_ + +#include /* System-dependent types */ +#include +#include +#include +#include +#include + +struct asn1_TYPE_descriptor_s; /* Forward declaration */ + +/* + * Free the structure according to its specification. + * If (free_contents_only) is set, the wrapper structure itself (struct_ptr) + * will not be freed. (It may be useful in case the structure is allocated + * statically or arranged on the stack, yet its elements are allocated + * dynamically.) + */ +typedef void (asn_struct_free_f)( + struct asn1_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, int free_contents_only); + +/* + * Print the structure according to its specification. + */ +typedef int (asn_struct_print_f)( + struct asn1_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, + int level, /* Indentation level */ + asn_app_consume_bytes_f *callback, void *app_key); + +/* + * Return the outmost tag of the type. + * If the type is untagged CHOICE, the dynamic operation is performed. + * NOTE: This function pointer type is only useful internally. + * Do not use it in your application. + */ +typedef ber_tlv_tag_t (asn_outmost_tag_f)( + struct asn1_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, int tag_mode, ber_tlv_tag_t tag); +/* The instance of the above function type */ +asn_outmost_tag_f asn1_TYPE_outmost_tag; + + +/* + * The definitive description of the destination language's structure. + */ +typedef struct asn1_TYPE_descriptor_s { + char *name; /* A name of the ASN.1 type */ + + /* + * Generalized functions for dealing with the specific type. + * May be directly invoked by applications. + */ + asn_constr_check_f *check_constraints; /* Constraints validator */ + ber_type_decoder_f *ber_decoder; /* Free-form BER decoder */ + der_type_encoder_f *der_encoder; /* Canonical DER encoder */ + asn_struct_print_f *print_struct; /* Human readable output */ + asn_struct_free_f *free_struct; /* Free the structure */ + + /* + * Functions used internally. Should not be used by applications. + */ + asn_outmost_tag_f *outmost_tag; /* */ + + /* + * Tags that are expected, with some of their vital properties. + */ + ber_tlv_tag_t *tags; /* At least one tag must be specified */ + int tags_count; /* Number of tags which are expected */ + int tags_impl_skip; /* Tags to skip in implicit mode */ + int last_tag_form; /* Acceptable form of the tag (prim, constr) */ + + /* + * Additional information describing the type, used by appropriate + * functions above. + */ + void *specifics; +} asn1_TYPE_descriptor_t; + +/* + * This function is a wrapper around (td)->print_struct, which prints out + * the contents of the target language's structure (struct_ptr) into the + * file pointer (stream) in human readable form. + * RETURN VALUES: + * 0: The structure is printed. + * -1: Problem dumping the structure. + */ +int asn_fprint(FILE *stream, /* Destination stream descriptor */ + asn1_TYPE_descriptor_t *td, /* ASN.1 type descriptor */ + const void *struct_ptr); /* Structure to be printed */ + +#endif /* _CONSTR_TYPE_H_ */ diff --git a/skeletons/constraints.c b/skeletons/constraints.c new file mode 100644 index 000000000..13a1b4022 --- /dev/null +++ b/skeletons/constraints.c @@ -0,0 +1,111 @@ +#include +#include + +int +asn_generic_no_constraint(asn1_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, asn_app_consume_bytes_f *cb, void *key) { + /* Nothing to check */ + return 0; +} + +int +asn_generic_unknown_constraint(asn1_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, asn_app_consume_bytes_f *cb, void *key) { + /* Unknown how to check */ + return 0; +} + +struct __fill_errbuf_arg { + char *errbuf; + size_t errlen; + size_t erroff; +}; + +static int +__fill_errbuf(const void *buffer, size_t size, void *app_key) { + struct __fill_errbuf_arg *arg = app_key; + size_t avail = arg->errlen - arg->erroff; + + if(avail > size) + avail = size + 1; + + switch(avail) { + default: + memcpy(arg->errbuf + arg->erroff, buffer, avail - 1); + arg->erroff += avail - 1; + case 1: + arg->errbuf[arg->erroff] = '\0'; + case 0: + return 0; + } + +} + +int +asn_check_constraints(asn1_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, char *errbuf, size_t *errlen) { + + if(errlen) { + struct __fill_errbuf_arg arg; + int ret; + + arg.errbuf = errbuf; + arg.errlen = *errlen; + arg.erroff = 0; + + ret = type_descriptor->check_constraints(type_descriptor, + struct_ptr, __fill_errbuf, &arg); + + if(ret == -1) + *errlen = arg.erroff; + + return ret; + } else { + return type_descriptor->check_constraints(type_descriptor, + struct_ptr, 0, 0); + } +} + +void +_asn_i_log_error(asn_app_consume_bytes_f *cb, void *key, const char *fmt, ...) { + char buf[64]; + char *p; + va_list ap; + ssize_t ret; + size_t len; + + va_start(ap, fmt); + ret = vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + if(ret < 0) { + /* + * The libc on this system is broken. + */ + ret = sizeof("") - 1; + memcpy(buf, "", ret + 1); + /* Fall through */ + } + + if(ret < sizeof(buf)) { + cb(buf, ret, key); + return; + } + + /* + * More space required to hold the message. + */ + len = ret + 1; + p = alloca(len); + if(!p) return; /* Can't be though. */ + + + va_start(ap, fmt); + ret = vsnprintf(buf, len, fmt, ap); + va_end(ap); + if(ret < 0 || ret >= len) { + ret = sizeof("") - 1; + memcpy(buf, "", ret + 1); + } + + cb(buf, ret, key); +} diff --git a/skeletons/constraints.h b/skeletons/constraints.h new file mode 100644 index 000000000..255b6ae2c --- /dev/null +++ b/skeletons/constraints.h @@ -0,0 +1,57 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _ASN1_CONSTRAINTS_VALIDATOR_H_ +#define _ASN1_CONSTRAINTS_VALIDATOR_H_ + +#include /* System-dependent types */ + +struct asn1_TYPE_descriptor_s; /* Forward declaration */ + +/* + * Validate the structure according to the ASN.1 constraints. + * If errbuf and errlen are given, they shall be pointing to the appropriate + * buffer space and its length before calling this function. Alternatively, + * they could be passed as NULL's. If constraints validation fails, + * errlen will contain the actual number of bytes taken from the errbuf + * to encode an error message (properly 0-terminated). + */ +int +asn_check_constraints(struct asn1_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, /* Target language's structure */ + char *errbuf, /* Returned error description */ + size_t *errlen /* Length of the error description */ + ); + +/* + * Generic type for constraint checking callback, + * associated with every type descriptor. + */ +typedef int (asn_constr_check_f)( + struct asn1_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, + asn_app_consume_bytes_f *optional_app_errlog, /* Log the error */ + void *optional_app_key /* Opaque key passed to app_errlog */ + ); + +/******************************* + * INTERNALLY USEFUL FUNCTIONS * + *******************************/ + +asn_constr_check_f asn_generic_no_constraint; /* No constraint whatsoever */ +asn_constr_check_f asn_generic_unknown_constraint; /* Not fully supported */ + +/* + * Invoke the callback with a complete error message. + */ +#define _ASN_ERRLOG(fmt, args...) do { \ + if(app_errlog) \ + _asn_i_log_error(app_errlog, \ + app_key, fmt, ##args); \ + break; \ + } while(0); +void _asn_i_log_error(asn_app_consume_bytes_f *, void *key, + const char *fmt, ...) __attribute__ ((format(printf, 3, 4))); + +#endif /* _ASN1_CONSTRAINTS_VALIDATOR_H_ */ diff --git a/skeletons/der_encoder.c b/skeletons/der_encoder.c new file mode 100644 index 000000000..f275f9c1b --- /dev/null +++ b/skeletons/der_encoder.c @@ -0,0 +1,143 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +static ssize_t der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len, + asn_app_consume_bytes_f *cb, void *app_key, int constructed); + +/* + * The DER encoder of any type. + */ +der_enc_rval_t +der_encode(asn1_TYPE_descriptor_t *type_descriptor, void *struct_ptr, + asn_app_consume_bytes_f *consume_bytes, void *app_key) { + + ASN_DEBUG("DER encoder invoked for %s", + type_descriptor->name); + + /* + * Invoke type-specific encoder. + */ + return type_descriptor->der_encoder(type_descriptor, + struct_ptr, /* Pointer to the destination structure */ + 0, 0, + consume_bytes, app_key); +} + +/* + * Write out leading TL[v] sequence according to the type definition. + */ +ssize_t +der_write_tags(asn1_TYPE_descriptor_t *sd, + size_t struct_length, + int tag_mode, + ber_tlv_tag_t tag, /* EXPLICIT or IMPLICIT tag */ + asn_app_consume_bytes_f *cb, + void *app_key) { + ber_tlv_tag_t *tags; /* Copy of tags stream */ + int tags_count; /* Number of tags */ + size_t overall_length; + ssize_t *lens; + int i; + + if(tag_mode) { + /* + * Instead of doing shaman dance like we do in ber_check_tags(), + * allocate a small array on the stack + * and initialize it appropriately. + */ + tags = alloca((sd->tags_count + (tag_mode?1:0)) + * sizeof(ber_tlv_tag_t)); + if(tags == NULL) return -1; /* Impossible on i386 */ + tags_count = sd->tags_count + + 1 /* EXPLICIT or IMPLICIT tag is given */ + - ((tag_mode==-1)?sd->tags_impl_skip:0); + /* Copy tags over */ + tags[0] = tag; + for(i = 1; i < tags_count; i++) + tags[i] = sd->tags[i - 1 + sd->tags_impl_skip]; + } else { + tags = sd->tags; + tags_count = sd->tags_count; + } + + /* No tags to write */ + if(tags_count == 0) + return 0; + + lens = alloca(tags_count * sizeof(lens[0])); + if(lens == NULL) return -1; + + /* + * Array of tags is initialized. + * Now, compute the size of the TLV pairs, from right to left. + */ + overall_length = struct_length; + for(i = tags_count - 1; i >= 0; --i) { + lens[i] = der_write_TL(tags[i], overall_length, 0, 0, 0); + if(lens[i] == -1) return -1; + overall_length += lens[i]; + lens[i] = overall_length - lens[i]; + } + + if(!cb) return overall_length - struct_length; + + ASN_DEBUG("%s %s TL sequence (%d elements)", + cb?"Encoding":"Estimating", sd->name, tags_count); + + /* + * Encode the TL sequence for real. + */ + for(i = 0; i < tags_count; i++) { + ssize_t len; + int _constr; + + /* If this one happens to be constructed, do it. */ + if(i < (tags_count - 1) || sd->last_tag_form == 1) + _constr = 1; + else _constr = 0; + + len = der_write_TL(tags[i], lens[i], cb, app_key, _constr); + if(len == -1) return -1; + } + + return overall_length - struct_length; +} + +static ssize_t +der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len, + asn_app_consume_bytes_f *cb, void *app_key, + int constructed) { + uint8_t buf[32]; + size_t size = 0; + int buf_size = cb?sizeof(buf):0; + ssize_t tmp; + + /* Serialize tag (T from TLV) into possibly zero-length buffer */ + tmp = der_tlv_tag_serialize(tag, buf, buf_size); + if(tmp == -1 || tmp > sizeof(buf)) return -1; + size += tmp; + + /* Serialize length (L from TLV) into possibly zero-length buffer */ + tmp = der_tlv_length_serialize(len, buf+size, buf_size?buf_size-size:0); + if(tmp == -1) return -1; + size += tmp; + + if(size > sizeof(buf)) + return -1; + + /* + * If callback is specified, invoke it, and check its return value. + */ + if(cb) { + if(constructed) *buf |= 0x20; + if(cb(buf, size, app_key) == -1) { + return -1; + } + } + + return size; +} diff --git a/skeletons/der_encoder.h b/skeletons/der_encoder.h new file mode 100644 index 000000000..052d9f4c2 --- /dev/null +++ b/skeletons/der_encoder.h @@ -0,0 +1,73 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _DER_ENCODER_H_ +#define _DER_ENCODER_H_ + +#include + +struct asn1_TYPE_descriptor_s; /* Forward declaration */ + +/* + * Type of the return value of the der_encode function. + */ +typedef struct der_enc_rval_s { + /* + * Number of bytes encoded. + * -1 indicates failure to encode the structure. + * In this case, the members below this one are meaningful. + */ + ssize_t encoded; + + /* + * Members meaningful when (encoded == -1), for post-mortem analysis. + */ + + /* Type which cannot be encoded */ + struct asn1_TYPE_descriptor_s *failed_type; + + /* Pointer to the structure of that type */ + void *structure_ptr; +} der_enc_rval_t; + + +/* + * The DER encoder of any type. May be invoked by the application. + */ +der_enc_rval_t der_encode(struct asn1_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, /* Structure to be encoded */ + asn_app_consume_bytes_f *consume_bytes_cb, + void *app_key /* Arbitrary callback argument */ + ); + +/* + * Type of the generic DER encoder. + */ +typedef der_enc_rval_t (der_type_encoder_f)( + struct asn1_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, /* Structure to be encoded */ + int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ + ber_tlv_tag_t tag, + asn_app_consume_bytes_f *consume_bytes_cb, /* Callback */ + void *app_key /* Arbitrary callback argument */ + ); + + +/******************************* + * INTERNALLY USEFUL FUNCTIONS * + *******************************/ + +/* + * Write out leading TL[v] sequence according to the type definition. + */ +ssize_t der_write_tags( + struct asn1_TYPE_descriptor_s *type_descriptor, + size_t struct_length, + int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ + ber_tlv_tag_t tag, + asn_app_consume_bytes_f *consume_bytes_cb, + void *app_key + ); + +#endif /* _DER_ENCODER_H_ */ diff --git a/skeletons/tests/Makefile.am b/skeletons/tests/Makefile.am new file mode 100644 index 000000000..e620ade68 --- /dev/null +++ b/skeletons/tests/Makefile.am @@ -0,0 +1,9 @@ +AM_CPPFLAGS = -I${top_srcdir}/skeletons + +check_PROGRAMS = \ + check-GeneralizedTime \ + check-UTCTime \ + check-INTEGER \ + check-OIDs + +TESTS = ${check_PROGRAMS} diff --git a/skeletons/tests/Makefile.in b/skeletons/tests/Makefile.in new file mode 100644 index 000000000..779f93a52 --- /dev/null +++ b/skeletons/tests/Makefile.in @@ -0,0 +1,411 @@ +# Makefile.in generated automatically by automake 1.5 from Makefile.am. + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../.. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_alias = @build_alias@ +build_triplet = @build@ +host_alias = @host_alias@ +host_triplet = @host@ +target_alias = @target_alias@ +target_triplet = @target@ +ADD_CFLAGS = @ADD_CFLAGS@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +AWK = @AWK@ +CC = @CC@ +CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPP = @CPP@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +EXEEXT = @EXEEXT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LEX = @LEX@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +MAINT = @MAINT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PATH = @PATH@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ +YACC = @YACC@ +am__include = @am__include@ +am__quote = @am__quote@ +install_sh = @install_sh@ + +AM_CPPFLAGS = -I${top_srcdir}/skeletons + +check_PROGRAMS = \ + check-GeneralizedTime \ + check-UTCTime \ + check-INTEGER \ + check-OIDs + + +TESTS = ${check_PROGRAMS} +subdir = skeletons/tests +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +check_PROGRAMS = check-GeneralizedTime$(EXEEXT) check-UTCTime$(EXEEXT) \ + check-INTEGER$(EXEEXT) check-OIDs$(EXEEXT) +check_GeneralizedTime_SOURCES = check-GeneralizedTime.c +check_GeneralizedTime_OBJECTS = check-GeneralizedTime.$(OBJEXT) +check_GeneralizedTime_LDADD = $(LDADD) +check_GeneralizedTime_DEPENDENCIES = +check_GeneralizedTime_LDFLAGS = +check_INTEGER_SOURCES = check-INTEGER.c +check_INTEGER_OBJECTS = check-INTEGER.$(OBJEXT) +check_INTEGER_LDADD = $(LDADD) +check_INTEGER_DEPENDENCIES = +check_INTEGER_LDFLAGS = +check_OIDs_SOURCES = check-OIDs.c +check_OIDs_OBJECTS = check-OIDs.$(OBJEXT) +check_OIDs_LDADD = $(LDADD) +check_OIDs_DEPENDENCIES = +check_OIDs_LDFLAGS = +check_UTCTime_SOURCES = check-UTCTime.c +check_UTCTime_OBJECTS = check-UTCTime.$(OBJEXT) +check_UTCTime_LDADD = $(LDADD) +check_UTCTime_DEPENDENCIES = +check_UTCTime_LDFLAGS = + +DEFS = @DEFS@ +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/check-GeneralizedTime.Po \ +@AMDEP_TRUE@ $(DEPDIR)/check-INTEGER.Po $(DEPDIR)/check-OIDs.Po \ +@AMDEP_TRUE@ $(DEPDIR)/check-UTCTime.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ + $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +CFLAGS = @CFLAGS@ +DIST_SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c \ + check-UTCTime.c +DIST_COMMON = Makefile.am Makefile.in +SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c check-UTCTime.c + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu skeletons/tests/Makefile +Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && \ + CONFIG_HEADERS= CONFIG_LINKS= \ + CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status + +clean-checkPROGRAMS: + -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) +check-GeneralizedTime$(EXEEXT): $(check_GeneralizedTime_OBJECTS) $(check_GeneralizedTime_DEPENDENCIES) + @rm -f check-GeneralizedTime$(EXEEXT) + $(LINK) $(check_GeneralizedTime_LDFLAGS) $(check_GeneralizedTime_OBJECTS) $(check_GeneralizedTime_LDADD) $(LIBS) +check-INTEGER$(EXEEXT): $(check_INTEGER_OBJECTS) $(check_INTEGER_DEPENDENCIES) + @rm -f check-INTEGER$(EXEEXT) + $(LINK) $(check_INTEGER_LDFLAGS) $(check_INTEGER_OBJECTS) $(check_INTEGER_LDADD) $(LIBS) +check-OIDs$(EXEEXT): $(check_OIDs_OBJECTS) $(check_OIDs_DEPENDENCIES) + @rm -f check-OIDs$(EXEEXT) + $(LINK) $(check_OIDs_LDFLAGS) $(check_OIDs_OBJECTS) $(check_OIDs_LDADD) $(LIBS) +check-UTCTime$(EXEEXT): $(check_UTCTime_OBJECTS) $(check_UTCTime_DEPENDENCIES) + @rm -f check-UTCTime$(EXEEXT) + $(LINK) $(check_UTCTime_LDFLAGS) $(check_UTCTime_OBJECTS) $(check_UTCTime_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) core *.core + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/check-GeneralizedTime.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/check-INTEGER.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/check-OIDs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/check-UTCTime.Po@am__quote@ + +distclean-depend: + -rm -rf $(DEPDIR) + +.c.o: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< + +.c.obj: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `cygpath -w $<` + +.c.lo: +@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< +CCDEPMODE = @CCDEPMODE@ +uninstall-info-am: + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique $(LISP) + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) + +GTAGS: + here=`CDPATH=: && cd $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; \ + srcdir=$(srcdir); export srcdir; \ + list='$(TESTS)'; \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *" $$tst "*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ + ;; \ + *) \ + echo "PASS: $$tst"; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *" $$tst "*) \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ + ;; \ + esac; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all tests failed"; \ + else \ + banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ + fi; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0; \ + fi + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = ../.. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + $(mkinstalldirs) "$(distdir)/$$dir"; \ + fi; \ + if test -d $$d/$$file; then \ + cp -pR $$d/$$file $(distdir) \ + || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile + +installdirs: + +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + +distclean-am: clean-am distclean-compile distclean-depend \ + distclean-generic distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +uninstall-am: uninstall-info-am + +.PHONY: GTAGS all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool distclean \ + distclean-compile distclean-depend distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am info \ + info-am install install-am install-data install-data-am \ + install-exec install-exec-am install-info install-info-am \ + install-man install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool tags uninstall uninstall-am \ + uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/skeletons/tests/check-GeneralizedTime.c b/skeletons/tests/check-GeneralizedTime.c new file mode 100644 index 000000000..3451cffec --- /dev/null +++ b/skeletons/tests/check-GeneralizedTime.c @@ -0,0 +1,54 @@ +#define __NO_ASN_TABLE__ +#include "../GeneralizedTime.c" +#include "../constraints.c" + +static void +check(char *time_str, time_t sample) { + GeneralizedTime_t gt; + struct tm tm; + time_t tloc; + + gt.buf = time_str; + gt.size = strlen(time_str); + + tloc = asn_GT2time(>, &tm); + printf("[%s] -> %ld == %ld\n", time_str, (long)tloc, (long)sample); + if(tloc != -1) + printf("\t%d-%d-%dT%02d:%02d:%02d %ld\n", + tm.tm_year + 1900, + tm.tm_mon + 1, + tm.tm_mday, + tm.tm_hour, + tm.tm_min, + tm.tm_sec, + tm.tm_gmtoff + ); + assert(tloc == sample); +} + +int +main(int ac, char **av) { + + check("200401250", -1); + check("2004012509300", -1); + check("20040125093000-", -1); + check("20040125093007-0", -1); + check("20040125093007-080", -1); + check("200401250930.01Z", -1); + + check("20040125093007Z", 1075023007); + check("20040125093007+00", 1075023007); + check("20040125093007.01+0000", 1075023007); + check("20040125093007,1+0000", 1075023007); + check("20040125093007-0800", 1075051807); + + if(ac > 1) { + /* These will be valid only inside PST time zone */ + check("20040125093007", 1075051807); + check("200401250930", 1075051800); + check("20040125093000,01", 1075051800); + check("20040125093000,1234", 1075051800); + } + + return 0; +} diff --git a/skeletons/tests/check-INTEGER.c b/skeletons/tests/check-INTEGER.c new file mode 100644 index 000000000..4053075e2 --- /dev/null +++ b/skeletons/tests/check-INTEGER.c @@ -0,0 +1,56 @@ +#include "../INTEGER.c" +#include "../ber_decoder.c" +#include "../ber_tlv_length.c" +#include "../ber_tlv_tag.c" +#include "../der_encoder.c" +#include "../constraints.c" + +static void +check(uint8_t *buf, int size, long check_long, int check_ret) { + INTEGER_t val; + int ret; + long rlong = 123; + + assert(buf); + assert(size >= 0); + + val.buf = buf; + val.size = size; + + + ret = asn1_INTEGER2long(&val, &rlong); + printf("Testing (%ld, %d) vs (%ld, %d)\n", + rlong, ret, check_long, check_ret); + assert(ret == check_ret); + if(ret == -1) return; + assert(rlong == check_long); +} + +int +main(int ac, char **av) { + uint8_t buf1[] = { 1 }; + uint8_t buf2[] = { 0xff }; + uint8_t buf3[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + uint8_t buf4[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0 }; + uint8_t buf5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 }; + uint8_t buf6[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + uint8_t buf7[] = { 0xff, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + uint8_t buf8[] = { 0x7f, 0x7e, 0x7d, 0x7c }; + uint8_t buf9[] = { 0, 0x7f, 0x7e, 0x7d, 0x7c }; + uint8_t buf10[] = { 0, 0, 0, 0, 0, 0, 0x7f, 0x7e, 0x7d, 0x7c }; + +#define CHECK(buf, val, ret) check(buf, sizeof(buf), val, ret) + + CHECK(buf1, 1, 0); + CHECK(buf2, -1, 0); + CHECK(buf3, -1, 0); + CHECK(buf4, -16, 0); + CHECK(buf5, 257, 0); + CHECK(buf6, 123, -1); + CHECK(buf7, 123, -1); + CHECK(buf8, 0x7F7E7D7C, 0); + CHECK(buf9, 0x7F7E7D7C, 0); + CHECK(buf10, 0x7F7E7D7C, 0); + + return 0; +} diff --git a/skeletons/tests/check-OIDs.c b/skeletons/tests/check-OIDs.c new file mode 100644 index 000000000..a97a910a2 --- /dev/null +++ b/skeletons/tests/check-OIDs.c @@ -0,0 +1,228 @@ +#include "../RELATIVE-OID.c" +#include "../OBJECT_IDENTIFIER.c" +#include "../INTEGER.c" +#include "../ber_decoder.c" +#include "../ber_tlv_length.c" +#include "../ber_tlv_tag.c" +#include "../der_encoder.c" +#include "../constraints.c" + +static int +_print(const void *buffer, size_t size, void *app_key) { + fwrite(buffer, size, 1, stdout); + return 0; +} + +static void +check_OID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { + OBJECT_IDENTIFIER_t *oid; + ber_dec_rval_t rval; + unsigned long arcs[10]; + int alen; + int i; + + printf("Checking {"); + for(i = 0; i < len; i++) { printf("%s%02x", i?" ":"", buf[i]); } + printf("} against {"); + for(i = 0; i < ck_len; i++) { printf("%s%d", i?" ":"", ck_buf[i]); } + printf("}\n"); + + oid = NULL; + rval = ber_decode(&asn1_DEF_OBJECT_IDENTIFIER, (void *)&oid, buf, len); + assert(rval.code == RC_OK); + + assert(oid->size == len - 2); + + /* + * Print the contents for visual debugging. + */ + printf("OBJECT_IDENTIFIER_print() => "); + OBJECT_IDENTIFIER_print(&asn1_DEF_OBJECT_IDENTIFIER, oid, 0, _print, 0); + printf("\n"); + + alen = OBJECT_IDENTIFIER_get_arcs_l(oid, + arcs, sizeof(arcs)/sizeof(arcs[0])); + assert(alen > 0); + assert(alen == ck_len); + + /* + * Make sure they are equivalent. + */ + printf("OBJECT_IDENTIFIER_get_arcs() => {"); + for(i = 0; i < alen; i++) { + printf(" %lu", arcs[i]); + assert(arcs[i] == ck_buf[i]); + } + printf(" }\n"); +} + +static void +check_ROID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { + RELATIVE_OID_t *oid; + ber_dec_rval_t rval; + unsigned long arcs[10]; + int alen; + int i; + + printf("Checking {"); + for(i = 0; i < len; i++) { printf("%s%02x", i?" ":"", buf[i]); } + printf("} against {"); + for(i = 0; i < ck_len; i++) { printf("%s%d", i?" ":"", ck_buf[i]); } + printf("}\n"); + + oid = NULL; + rval = ber_decode(&asn1_DEF_RELATIVE_OID, (void *)&oid, buf, len); + assert(rval.code == RC_OK); + + assert(oid->size == len - 2); + + /* + * Print the contents for visual debugging. + */ + printf("RELATIVE_OID_print() => "); + RELATIVE_OID_print(&asn1_DEF_RELATIVE_OID, oid, 0, _print, 0); + printf("\n"); + + alen = RELATIVE_OID_get_arcs_l(oid, + arcs, sizeof(arcs)/sizeof(arcs[0])); + assert(alen > 0); + assert(alen == ck_len); + + /* + * Make sure they are equivalent. + */ + printf("RELATIVE_OID_get_arcs() => {"); + for(i = 0; i < alen; i++) { + printf(" %lu", (unsigned long)arcs[i]); + assert(arcs[i] == ck_buf[i]); + } + printf(" }\n"); +} + +/* + * Encode the specified array of arcs as RELATIVE-OID, decode it and compare. + */ +static void +check_REGEN(int *arcs, int acount) { + static RELATIVE_OID_t oid; + unsigned long tmp_arcs[10]; + int tmp_alen = 10; + int alen; + int ret; + int i; + + printf("Encoding {"); + for(i = 0; i < acount; i++) { + printf(" %u", arcs[i]); + } + printf(" }\n"); + + ret = RELATIVE_OID_set_arcs_l(&oid, (unsigned long *)arcs, acount); + assert(ret == 0); + + alen = RELATIVE_OID_get_arcs_l(&oid, tmp_arcs, tmp_alen); + assert(alen >= 0); + assert(alen < tmp_alen); + + printf("Encoded {"); + for(i = 0; i < alen; i++) { + printf(" %lu", tmp_arcs[i]); + assert(arcs[i] == tmp_arcs[i]); + } + printf(" }\n"); +} + +/* + * Encode the specified array of arcs as OBJECT IDENTIFIER, + * decode it and compare. + */ +static void +check_REGEN_OID(int *arcs, int acount) { + static OBJECT_IDENTIFIER_t oid; + unsigned long tmp_arcs[10]; + int tmp_alen = 10; + int alen; + int ret; + int i; + + printf("Encoding {"); + for(i = 0; i < acount; i++) { + printf(" %u", arcs[i]); + } + printf(" }\n"); + + ret = OBJECT_IDENTIFIER_set_arcs_l(&oid, (unsigned long *)arcs, acount); + assert(ret == 0); + + alen = OBJECT_IDENTIFIER_get_arcs_l(&oid, tmp_arcs, tmp_alen); + assert(alen >= 0); + assert(alen < tmp_alen); + + printf("Encoded {"); + for(i = 0; i < alen; i++) { + printf(" %lu", tmp_arcs[i]); + assert(arcs[i] == tmp_arcs[i]); + } + printf(" }\n"); +} + +#define CHECK_OID(n) check_OID(buf ## n, sizeof(buf ## n), \ + buf ## n ## _check, \ + sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0])) +#define CHECK_ROID(n) check_ROID(buf ## n, sizeof(buf ## n), \ + buf ## n ## _check, \ + sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0])) +#define CHECK_REGEN(n) check_REGEN(buf ## n ## _check, \ + sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0])) +#define CHECK_REGEN_OID(n) check_REGEN_OID(buf ## n ## _check, \ + sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0])) + +int +main(int ac, char **av) { + /* {joint-iso-itu-t 100 3} */ + uint8_t buf1[] = { + 0x06, /* OBJECT IDENTIFIER */ + 0x03, /* Length */ + 0x81, 0x34, 0x03 + }; + int buf1_check[] = { 2, 100, 3 }; + + /* {8571 3 2} */ + uint8_t buf2[] = { + 0x0D, /* RELATIVE-OID */ + 0x04, /* Length */ + 0xC2, 0x7B, 0x03, 0x02 + }; + int buf2_check[] = { 8571, 3, 2 }; + + int buf3_check[] = { 0 }; + int buf4_check[] = { 1 }; + int buf5_check[] = { 80, 40 }; + int buf6_check[] = { 127 }; + int buf7_check[] = { 128 }; + int buf8_check[] = { 65535, 65536 }; + int buf9_check[] = { 100000, 0x20000, 1234, 256, 127, 128 }; + int buf10_check[] = { 0, 0xffffffff, 0xff00ff00, 0 }; + int buf11_check[] = { 0, 1, 2 }; + int buf12_check[] = { 1, 38, 3 }; + int buf13_check[] = { 0, 0, 0xf000 }; + + + CHECK_OID(1); /* buf1, buf1_check */ + CHECK_ROID(2); /* buf2, buf2_check */ + + CHECK_REGEN(3); /* Regenerate RELATIVE-OID */ + CHECK_REGEN(4); + CHECK_REGEN(5); + CHECK_REGEN(6); + CHECK_REGEN(7); + CHECK_REGEN(8); + CHECK_REGEN(9); + CHECK_REGEN(10); + CHECK_REGEN_OID(1); /* Regenerate OBJECT IDENTIFIER */ + CHECK_REGEN_OID(11); + CHECK_REGEN_OID(12); + CHECK_REGEN_OID(13); + + return 0; +} diff --git a/skeletons/tests/check-UTCTime.c b/skeletons/tests/check-UTCTime.c new file mode 100644 index 000000000..7522140ea --- /dev/null +++ b/skeletons/tests/check-UTCTime.c @@ -0,0 +1,54 @@ +#define __NO_ASN_TABLE__ +#include "../UTCTime.c" +#define __NO_ASSERT_H__ +#include "../GeneralizedTime.c" +#include "../constraints.c" + +static void +check(char *time_str, time_t sample) { + UTCTime_t gt; + struct tm tm; + time_t tloc; + + gt.buf = time_str; + gt.size = strlen(time_str); + + tloc = asn_UT2time(>, &tm); + printf("[%s] -> %ld == %ld\n", time_str, (long)tloc, (long)sample); + if(tloc != -1) + printf("\t%d-%d-%dT%02d:%02d:%02d %ld\n", + tm.tm_year + 1900, + tm.tm_mon + 1, + tm.tm_mday, + tm.tm_hour, + tm.tm_min, + tm.tm_sec, + tm.tm_gmtoff + ); + assert(tloc == sample); +} + +int +main(int ac, char **av) { + + check("0401250", -1); + check("0401250930", -1); /* "Z" or "(+|-)hhmm" required */ + check("04012509300", -1); + check("040125093000-", -1); + check("040125093007-0", -1); + check("040125093007-080", -1); + check("0401250930.01Z", -1); + + check("040125093007Z", 1075023007); + check("040125093007+00", 1075023007); + check("040125093007-0800", 1075051807); + + if(ac > 1) { + /* These will be valid only inside PST time zone */ + check("040125093007", 1075051807); + check("040125093000,01", 1075051800); + check("040125093000,1234", 1075051800); + } + + return 0; +} diff --git a/stamp-h.in b/stamp-h.in new file mode 100644 index 000000000..9788f7023 --- /dev/null +++ b/stamp-h.in @@ -0,0 +1 @@ +timestamp diff --git a/tests/00-empty-OK.asn1 b/tests/00-empty-OK.asn1 new file mode 100644 index 000000000..532d4fb06 --- /dev/null +++ b/tests/00-empty-OK.asn1 @@ -0,0 +1 @@ +ModuleTestEmpty DEFINITIONS ::= BEGIN END diff --git a/tests/01-empty-OK.asn1 b/tests/01-empty-OK.asn1 new file mode 100644 index 000000000..04d9ba77e --- /dev/null +++ b/tests/01-empty-OK.asn1 @@ -0,0 +1,14 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .1 + +ModuleTestEmpty + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 1 } + DEFINITIONS ::= +BEGIN + +END diff --git a/tests/02-garbage-NP.asn1 b/tests/02-garbage-NP.asn1 new file mode 100644 index 000000000..410c7bc03 --- /dev/null +++ b/tests/02-garbage-NP.asn1 @@ -0,0 +1,17 @@ + +-- NP: Non-parseable. + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .2 + +ModuleTestGarbage + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 2 } + DEFINITIONS ::= +BEGIN + + -- must fail on the next line -- + some garbage + +END diff --git a/tests/03-enum-OK.asn1 b/tests/03-enum-OK.asn1 new file mode 100644 index 000000000..567df26a1 --- /dev/null +++ b/tests/03-enum-OK.asn1 @@ -0,0 +1,22 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .3 + +ModuleTestEnum1 + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 3 } + DEFINITIONS ::= +BEGIN + + Enum1 ::= ENUMERATED + { red, -- will be 0 -- + green, -- will be 1 -- + blue(4), + alpha, + ... -- extensible -- + } + +END diff --git a/tests/04-enum-SE.asn1 b/tests/04-enum-SE.asn1 new file mode 100644 index 000000000..e9a37c4b3 --- /dev/null +++ b/tests/04-enum-SE.asn1 @@ -0,0 +1,19 @@ + +-- SE: Semantic error + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .4 + +ModuleTestEnum2 + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 4 } + DEFINITIONS ::= +BEGIN + + enum1 Enum1 ::= blue + + Enum1 ::= ENUMERATED { red, green, ..., + blue(1) -- collides with green -- } + +END diff --git a/tests/05-enum-SE.asn1 b/tests/05-enum-SE.asn1 new file mode 100644 index 000000000..083724d2e --- /dev/null +++ b/tests/05-enum-SE.asn1 @@ -0,0 +1,21 @@ + +-- SE: Semantic error + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .5 + +ModuleTestEnum3 + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 5 } + DEFINITIONS ::= +BEGIN + + enum1 Enum1 ::= red + + Enum1 ::= ENUMERATED { red(5), green(4), ..., blue(6), + -- second extension marker is not allowed -- + ..., + white(7) } + +END diff --git a/tests/06-enum-SE.asn1 b/tests/06-enum-SE.asn1 new file mode 100644 index 000000000..ad304af16 --- /dev/null +++ b/tests/06-enum-SE.asn1 @@ -0,0 +1,20 @@ + +-- SE: Semantic error + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .6 + +ModuleTestEnum4 + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 6 } + DEFINITIONS ::= +BEGIN + + enum1 Enum1 ::= red + + Enum1 ::= ENUMERATED { red(5), ..., + green(7), blue(6) -- order is not maintained after ... + } + +END diff --git a/tests/07-int-OK.asn1 b/tests/07-int-OK.asn1 new file mode 100644 index 000000000..bf5962730 --- /dev/null +++ b/tests/07-int-OK.asn1 @@ -0,0 +1,26 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .7 + +ModuleTestInt1 + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 7 } + DEFINITIONS ::= +BEGIN + + int123456 INTEGER ::= 123456 + + Interval ::= INTEGER (1..int123456) + + SameInterval INTEGER ::= { 1 | 2 | 3 | 4 | 5 | 6 } + + Reason ::= INTEGER { + no-reason(0), + negative-reason(-10), + some-large-value(1324324) + } + +END diff --git a/tests/08-int-SE.asn1 b/tests/08-int-SE.asn1 new file mode 100644 index 000000000..8ff97fdfb --- /dev/null +++ b/tests/08-int-SE.asn1 @@ -0,0 +1,19 @@ + +-- OK: Semantic Error + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .8 + +ModuleTestInt2 + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 8 } + DEFINITIONS ::= +BEGIN + + Reason ::= INTEGER { + value1(0), + value1(2) -- identifiers must be distinct -- + } + +END diff --git a/tests/09-int-SE.asn1 b/tests/09-int-SE.asn1 new file mode 100644 index 000000000..c696e19ee --- /dev/null +++ b/tests/09-int-SE.asn1 @@ -0,0 +1,20 @@ + +-- OK: Semantic Error + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .9 + +ModuleTestInt3 + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 9 } + DEFINITIONS ::= +BEGIN + + Reason ::= INTEGER { + value1(1), + value5(5), + value2-1(1) -- integers must be distinct -- + } + +END diff --git a/tests/10-int-OK.asn1 b/tests/10-int-OK.asn1 new file mode 100644 index 000000000..c17265fc7 --- /dev/null +++ b/tests/10-int-OK.asn1 @@ -0,0 +1,29 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .10 + +ModuleTestInt4 + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 10 } + DEFINITIONS ::= +BEGIN + + alpha INTEGER ::= 1 + Type1 ::= INTEGER { alpha(2) } + Type2 ::= INTEGER { alpha(3), beta(alpha) } + gamma Type2 ::= beta -- equals 1 -- + delta Type2 ::= alpha -- equals 3 -- + + /* + * The following are for post-fix checking by the check_fixer. + * It will be able to pick-up these values if the file is parseable, + * even if it contains some semantic errors. + */ + + check-gamma INTEGER ::= 1 -- check "gamma"'s value + check-delta INTEGER ::= 3 -- check "delta"'s value + +END diff --git a/tests/11-int-SE.asn1 b/tests/11-int-SE.asn1 new file mode 100644 index 000000000..57978d7dd --- /dev/null +++ b/tests/11-int-SE.asn1 @@ -0,0 +1,18 @@ + +-- OK: Semantic Error + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .11 + +ModuleTestInt5 + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 11 } + DEFINITIONS ::= +BEGIN + + -- recursive definition loop + alpha INTEGER ::= beta + beta INTEGER ::= alpha + +END diff --git a/tests/12-int-SE.asn1 b/tests/12-int-SE.asn1 new file mode 100644 index 000000000..90939b62b --- /dev/null +++ b/tests/12-int-SE.asn1 @@ -0,0 +1,17 @@ + +-- OK: Semantic Error + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .12 + +ModuleTestInt6 + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 12 } + DEFINITIONS ::= +BEGIN + + -- unresolved reference + alpha INTEGER ::= beta + +END diff --git a/tests/13-resolver-OK.asn1 b/tests/13-resolver-OK.asn1 new file mode 100644 index 000000000..5237b011e --- /dev/null +++ b/tests/13-resolver-OK.asn1 @@ -0,0 +1,47 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .13 1 +-- .13 2 + +ModuleTestResolver1 + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 13 1 } + DEFINITIONS ::= +BEGIN + IMPORTS IntegerType, beta FROM + Renamed + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 13 2 }; + + -- external reference + alpha IntegerType ::= beta + alpha2 Renamed.IntegerType ::= beta + + -- + -- The following are for post-fix checking by the check_fixer. + -- It will be able to pick-up these values if the file is parseable, + -- even if it contains some semantic errors. + -- + + check-alpha INTEGER ::= 123 + check-alpha2 INTEGER ::= 123 + +END + +ModuleTestResolver2 + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 13 2 } + DEFINITIONS ::= +BEGIN + EXPORTS beta, IntegerType ; + + beta HiddenType ::= 123 + + HiddenType ::= INTEGER + + IntegerType ::= INTEGER + +END diff --git a/tests/14-resolver-OK.asn1 b/tests/14-resolver-OK.asn1 new file mode 100644 index 000000000..48fb0cc3c --- /dev/null +++ b/tests/14-resolver-OK.asn1 @@ -0,0 +1,45 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .14 1 +-- .14 2 + +ModuleTestResolver2 + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 14 1 } + DEFINITIONS ::= +BEGIN + IMPORTS Enumeration, beta FROM + OtherModuleRenamed + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 14 2 }; + + -- external reference + alpha Enumeration ::= beta + + -- + -- The following are for post-fix checking by the check_fixer. + -- It will be able to pick-up these values if the file is parseable, + -- even if it contains some semantic errors. + -- + + check-alpha INTEGER ::= 2 + +END + +ModuleTestResolver3 + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 14 2 } + DEFINITIONS ::= +BEGIN + EXPORTS Enumeration, beta ; + + beta HiddenEnum ::= b + + HiddenEnum ::= ENUMERATED { a(1), b(2) } + + Enumeration ::= ENUMERATED { a(1), b(2) } -- the same type -- + +END diff --git a/tests/15-resolver-SE.asn1 b/tests/15-resolver-SE.asn1 new file mode 100644 index 000000000..f4255c890 --- /dev/null +++ b/tests/15-resolver-SE.asn1 @@ -0,0 +1,35 @@ + +-- SE: Semantic error + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .15 1 +-- .15 2 + +ModuleTestResolver4 + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 15 1 } + DEFINITIONS ::= +BEGIN + IMPORTS Enumeration, beta FROM + OtherModuleRenamed + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 15 2 }; + + -- external reference + alpha Enumeration ::= beta + +END + +ModuleTestResolver5 + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 15 2 } + DEFINITIONS ::= +BEGIN + EXPORTS; -- Does not export anything! + + beta Enumeration ::= b + + Enumeration ::= ENUMERATED { a(1), b(2) } + +END diff --git a/tests/16-constraint-OK.asn1 b/tests/16-constraint-OK.asn1 new file mode 100644 index 000000000..5625d7fd7 --- /dev/null +++ b/tests/16-constraint-OK.asn1 @@ -0,0 +1,23 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .16 + +ModuleTestConstraint + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 16 } + DEFINITIONS ::= +BEGIN + + -- external reference + Type1 ::= IA5String (SIZE(1..10,...))(FROM("a".."z"|"#")) + Type2 ::= IA5String (SIZE (MIN..4)|FROM ("abc")) + Type3 ::= BMPString (SIZE(1)) + Type4 ::= INTEGER (1..MAX) + Type5 ::= BOOLEAN (TRUE|FALSE) + + v1 Type1 ::= "#value wi + th ""double quotes""" +END diff --git a/tests/17-tags-OK.asn1 b/tests/17-tags-OK.asn1 new file mode 100644 index 000000000..40f9c07ed --- /dev/null +++ b/tests/17-tags-OK.asn1 @@ -0,0 +1,24 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .17 + +ModuleTestTags + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 17 } + DEFINITIONS ::= +BEGIN + + T3 ::= [3] IMPLICIT T2 + T1 ::= [1] INTEGER + T2 ::= [2] EXPLICIT T1 + + T4 ::= [APPLICATION 1] SET { + t1 [4] IMPLICIT T1, + t2 [5] T2, + t3 [6] T3 + } + +END diff --git a/tests/18-class-OK.asn1 b/tests/18-class-OK.asn1 new file mode 100644 index 000000000..edae8566d --- /dev/null +++ b/tests/18-class-OK.asn1 @@ -0,0 +1,36 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .18 + +ModuleTestClass + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 18 } + DEFINITIONS ::= +BEGIN + + AlphaNumeric ::= IA5String (FROM ("A".."Z"|"a".."z"|"0".."9")) + + FUNCTION ::= CLASS { + &code INTEGER (0..MAX) UNIQUE, + &Alphabet IA5String DEFAULT {AlphaNumeric}, + &ArgType , + &SupportedArguments &ArgType OPTIONAL, + &ResultType DEFAULT NULL, + &result-if-error &ResultType DEFAULT NULL, + &associated-function FUNCTION OPTIONAL + } + + operator-plus FUNCTION ::= { + &ArgType Pair, + &SupportedArguments { PosPair | NegPair } + &ResultType INTEGER, + &result-if-error 0, + &code 1 + } + + FunctionCodeType ::= FUNCTION.&code + +END diff --git a/tests/19-param-OK.asn1 b/tests/19-param-OK.asn1 new file mode 100644 index 000000000..37d7c448e --- /dev/null +++ b/tests/19-param-OK.asn1 @@ -0,0 +1,30 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .19 + +ModuleTestParam + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 19 } + DEFINITIONS ::= +BEGIN + + SIGNED { ToBeSigned } ::= SEQUENCE { + toBeSigned ToBeSigned, + algorithm OBJECT IDENTIFIER, + signature BIT STRING + } + + Certificate ::= SIGNED { SEQUENCE { + version INTEGER, + signature OBJECT IDENTIFIER, + issuer Name + } } + + Name ::= SEQUENCE OF RelativeDistinguishedName + + RelativeDistinguishedName ::= SET SIZE (1..MAX) OF IA5String + +END diff --git a/tests/20-constr-OK.asn1 b/tests/20-constr-OK.asn1 new file mode 100644 index 000000000..f2a97f06f --- /dev/null +++ b/tests/20-constr-OK.asn1 @@ -0,0 +1,30 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .20 + +ModuleTestConstr + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 20 } + DEFINITIONS IMPLICIT TAGS EXTENSIBILITY IMPLIED ::= +BEGIN + + ConstructedType1 ::= SEQUENCE { + a [1] INTEGER, + b [2] INTEGER, + ...!ex1, + c IA5String, + ..., + d UTF8String + } + + ConstructedType2 ::= SET { + a [1] INTEGER, + b [2] INTEGER + } + + ex1 INTEGER ::= 1 + +END diff --git a/tests/21-tags-OK.asn1 b/tests/21-tags-OK.asn1 new file mode 100644 index 000000000..3a46c3257 --- /dev/null +++ b/tests/21-tags-OK.asn1 @@ -0,0 +1,34 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .21 1 +-- .21 2 + +ModuleTestTags1 + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 21 1 } + DEFINITIONS EXPLICIT TAGS ::= +BEGIN + + T1 ::= CHOICE { + first [0] INTEGER, + second [1] INTEGER + } + +END + +ModuleTestTags2 + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 21 2 } + DEFINITIONS IMPLICIT TAGS ::= +BEGIN + IMPORTS T1 FROM ModuleTestTags1; + + T2 ::= SEQUENCE { + one [0] T1, + two [1] IA5String + } + +END diff --git a/tests/22-tags-OK.asn1 b/tests/22-tags-OK.asn1 new file mode 100644 index 000000000..562e14b4d --- /dev/null +++ b/tests/22-tags-OK.asn1 @@ -0,0 +1,23 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .22 + +ModuleTestTags3 + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 22 } + DEFINITIONS AUTOMATIC TAGS ::= +BEGIN + + T1 ::= SEQUENCE { + a INTEGER, + b CHOICE { + i INTEGER, + n IA5String + }, + c UTF8String + } + +END diff --git a/tests/23-bits-OK.asn1 b/tests/23-bits-OK.asn1 new file mode 100644 index 000000000..f41b923d6 --- /dev/null +++ b/tests/23-bits-OK.asn1 @@ -0,0 +1,22 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .23 + +ModuleTestBitString + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 23 } + DEFINITIONS AUTOMATIC TAGS ::= +BEGIN + + v28 INTEGER ::= 28 + + BS1 ::= BIT STRING { first(0), third(2), twenty-eight(v28) } + + one-zero-one BS1 ::= { first, third } -- Equivalent to '101'B + + one0one BS1 ::= '1010000'B -- Equivalent to '101'B + +END diff --git a/tests/24-sequence-OK.asn1 b/tests/24-sequence-OK.asn1 new file mode 100644 index 000000000..851ebf0d2 --- /dev/null +++ b/tests/24-sequence-OK.asn1 @@ -0,0 +1,21 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .24 + +ModuleTestSequence + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 24 } + DEFINITIONS IMPLICIT TAGS ::= +BEGIN + + T ::= [5] EXPLICIT SEQUENCE { + a INTEGER, + b [0] INTEGER OPTIONAL, + c [1] INTEGER DEFAULT 10, + d [5] EXPLICIT INTEGER + } + +END diff --git a/tests/25-misc-OK.asn1 b/tests/25-misc-OK.asn1 new file mode 100644 index 000000000..3a7eb917e --- /dev/null +++ b/tests/25-misc-OK.asn1 @@ -0,0 +1,29 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .25 + +ModuleTestMisc + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 25 } + DEFINITIONS IMPLICIT TAGS ::= +BEGIN + + T ::= SEQUENCE { + a INTEGER, + b [2] BOOLEAN, + c NULL, + ..., + d ENUMERATED { + a(1), b(2) + }, + e OCTET STRING, + f OCTET STRING, + g BIT STRING, + h BIT STRING, + ... + } + +END diff --git a/tests/26-sequence-SE.asn1 b/tests/26-sequence-SE.asn1 new file mode 100644 index 000000000..8c5866ae9 --- /dev/null +++ b/tests/26-sequence-SE.asn1 @@ -0,0 +1,20 @@ + +-- SE: Semantic error + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .26 + +ModuleTestSequenceTagsDistinct + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 26 } + DEFINITIONS IMPLICIT TAGS ::= +BEGIN + + T ::= SEQUENCE { + a INTEGER, + b INTEGER OPTIONAL, + c INTEGER + } + +END diff --git a/tests/27-set-SE.asn1 b/tests/27-set-SE.asn1 new file mode 100644 index 000000000..91e56973e --- /dev/null +++ b/tests/27-set-SE.asn1 @@ -0,0 +1,21 @@ + +-- SE: Semantic error + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .27 + +ModuleTestSetTagsDistinct + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 27 } + DEFINITIONS IMPLICIT TAGS ::= +BEGIN + + T ::= SET { + a INTEGER, + b CHOICE { -- Could we lookup tag past CHOICE?.. + c INTEGER -- Tags must be distinct here. + } + } + +END diff --git a/tests/28-tags-SE.asn1 b/tests/28-tags-SE.asn1 new file mode 100644 index 000000000..b3af0e3e2 --- /dev/null +++ b/tests/28-tags-SE.asn1 @@ -0,0 +1,26 @@ + +-- SE: Semantic error + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .28 + +ModuleTestTagsDistinct + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 28 } + DEFINITIONS IMPLICIT TAGS ::= +BEGIN + + S ::= SET { + a INTEGER, + b CHOICE { + c IA5String, + ... + }, + d CHOICE { + e BOOLEAN, + ... + } + } + +END diff --git a/tests/29-tags-OK.asn1 b/tests/29-tags-OK.asn1 new file mode 100644 index 000000000..440f16c9d --- /dev/null +++ b/tests/29-tags-OK.asn1 @@ -0,0 +1,26 @@ + +-- OK: Everything is fin + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .29 + +ModuleTestTagsDistinct2 + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 29 } + DEFINITIONS AUTOMATIC TAGS ::= +BEGIN + + S ::= SET { + a INTEGER, + b CHOICE { + c IA5String, + ... + }, + d CHOICE { + e BOOLEAN, + ... + } + } + +END diff --git a/tests/30-set-OK.asn1 b/tests/30-set-OK.asn1 new file mode 100644 index 000000000..2cd6a5a42 --- /dev/null +++ b/tests/30-set-OK.asn1 @@ -0,0 +1,21 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .30 + +ModuleTestSetSimple + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 30 } + DEFINITIONS IMPLICIT TAGS ::= +BEGIN + + T ::= SET { + a [APPLICATION 3] INTEGER, + b IA5String, + ..., + c [2] BOOLEAN + } + +END diff --git a/tests/31-set-of-OK.asn1 b/tests/31-set-of-OK.asn1 new file mode 100644 index 000000000..cd108ba0f --- /dev/null +++ b/tests/31-set-of-OK.asn1 @@ -0,0 +1,21 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .31 + +ModuleTestSetOfSimple + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 31 } + DEFINITIONS IMPLICIT TAGS ::= +BEGIN + + Forest ::= SET OF Tree + + Tree ::= SEQUENCE { + height INTEGER, + width INTEGER + } + +END diff --git a/tests/32-sequence-of-OK.asn1 b/tests/32-sequence-of-OK.asn1 new file mode 100644 index 000000000..ced163af9 --- /dev/null +++ b/tests/32-sequence-of-OK.asn1 @@ -0,0 +1,22 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .32 + +ModuleTestSequenceSimple + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 32 } + DEFINITIONS IMPLICIT TAGS ::= +BEGIN + + Programming ::= SEQUENCE OF Fault + + Fault ::= SET OF Error + + Error ::= SEQUENCE { + ... + } + +END diff --git a/tests/33-misc-OK.asn1 b/tests/33-misc-OK.asn1 new file mode 100644 index 000000000..1018a40c7 --- /dev/null +++ b/tests/33-misc-OK.asn1 @@ -0,0 +1,33 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .33 + +ModuleTestMiscComplex + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 33 } + DEFINITIONS IMPLICIT TAGS ::= +BEGIN + + T ::= SEQUENCE { + a [1] INTEGER, + ..., + b [2] EXPLICIT BitString, + c [8] IMPLICIT Label, + d [10] IMPLICIT Int, + e [12] T2 + } + + BitString ::= [8] BIT STRING + + Label ::= [9] EXPLICIT UTF8String + + Label2 ::= [1] Label + + Int ::= [3] IMPLICIT INTEGER { a(1), b(2) } + + T2 ::= SEQUENCE { l Label2 } + +END diff --git a/tests/34-class-OK.asn1 b/tests/34-class-OK.asn1 new file mode 100644 index 000000000..b2d4dffdb --- /dev/null +++ b/tests/34-class-OK.asn1 @@ -0,0 +1,51 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .34 + +ModuleTestClassSimple + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 34 } + DEFINITIONS IMPLICIT TAGS ::= +BEGIN + + -- First CLASS + + EXTENSION ::= CLASS { + &id OBJECT IDENTIFIER UNIQUE, + &ExtnType + } WITH SYNTAX { + SYNTAX &ExtnType + IDENTIFIED BY &id + } + + -- Basic CLASS extraction + Ext1 ::= SEQUENCE { + extnId EXTENSION.&id + } + + -- Second CLASS + + EXTENSION-ATTRIBUTE ::= CLASS { + &id INTEGER (0..ub-extension-attributes) UNIQUE, + &Type + } WITH SYNTAX {&Type IDENTIFIED BY &id} + + terminal-type EXTENSION-ATTRIBUTE ::= {TerminalType IDENTIFIED BY 23} + + -- Advanced CLASS extraction + + ExtensionAttribute ::= SEQUENCE { + extension-attribute-type [0] EXTENSION-ATTRIBUTE.&id + ({ExtensionAttributeTable}), + extension-attribute-value [1] EXTENSION-ATTRIBUTE.&Type + ({ExtensionAttributeTable} {@extension-attribute-type}) + } + + -- Variables referenced by subtype constraints + + ub-extension-attributes INTEGER ::= 256 + +END diff --git a/tests/35-set-choice-OK.asn1 b/tests/35-set-choice-OK.asn1 new file mode 100644 index 000000000..367802130 --- /dev/null +++ b/tests/35-set-choice-OK.asn1 @@ -0,0 +1,36 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .35 + +ModuleTestSetAndUntaggedChoice + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 35 } + DEFINITIONS ::= +BEGIN + + T ::= SET { + a NumericString, + b CHOICE { -- Untagged choice + b1 IA5String, + b2 ObjectDescriptor, + b3 Choice + }, + c BOOLEAN, + ..., + d OID + } + + Choice ::= CHOICE { -- One more level + ch-a OCTET STRING, + ch-b BIT STRING + } + + OID ::= CHOICE { + oid OBJECT IDENTIFIER, + r-oid RELATIVE-OID + } + +END diff --git a/tests/36-indirect-choice-SE.asn1 b/tests/36-indirect-choice-SE.asn1 new file mode 100644 index 000000000..8fcb07b68 --- /dev/null +++ b/tests/36-indirect-choice-SE.asn1 @@ -0,0 +1,25 @@ + +-- SE: Semantic Error + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .36 + +ModuleTestIndirectChoiceError + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 36 } + DEFINITIONS ::= +BEGIN + + T ::= CHOICE { + t-a INTEGER, + t-b OCTET STRING, + t-c Choice + } + + Choice ::= CHOICE { -- One more level + c-a OCTET STRING, + c-b INTEGER + } + +END diff --git a/tests/37-indirect-choice-OK.asn1 b/tests/37-indirect-choice-OK.asn1 new file mode 100644 index 000000000..b0361c464 --- /dev/null +++ b/tests/37-indirect-choice-OK.asn1 @@ -0,0 +1,32 @@ + +-- OK: Everything is Fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .37 + +ModuleTestIndirectChoiceFine + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 37 } + DEFINITIONS ::= +BEGIN + + T ::= CHOICE { + t-a INTEGER, + t-b OCTET STRING, + t-c [1] Choice1, + t-d Choice2 + } + + Choice1 ::= CHOICE { + c-a OCTET STRING, + c-b INTEGER + } + + Choice2 ::= [2] CHOICE { + c-a OCTET STRING, + c-b INTEGER, + c-d [3] Choice1 + } + +END diff --git a/tests/38-comments-OK.asn1 b/tests/38-comments-OK.asn1 new file mode 100644 index 000000000..f2f9aab5f --- /dev/null +++ b/tests/38-comments-OK.asn1 @@ -0,0 +1,33 @@ + +-- OK: Everything is Fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .38 + +ModuleNestedCTypeComments + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 38 } + DEFINITIONS ::= +BEGIN + + T ::= CHOICE { + t-a INTEGER, + t-b OCTET STRING +/* t-c [1] Choice1, t-d Choice2 */ + } + + -- this is a comment too -- This-Is-Not-A-Comment + ::= INTEGER + +/* + ISO/IEC 8824-1 #11.6.4 + + blah blah blah + /* nested comment */ + -- this is an insignificant coment + -- this is a comment too -- and this is a comment + + */ + +END diff --git a/tests/39-sequence-of-OK.asn1 b/tests/39-sequence-of-OK.asn1 new file mode 100644 index 000000000..b8ac3f4ab --- /dev/null +++ b/tests/39-sequence-of-OK.asn1 @@ -0,0 +1,24 @@ + +-- OK: Everything is Fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .39 + +ModuleNestedSequenceOf + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 39 } + DEFINITIONS ::= +BEGIN + + T ::= SEQUENCE { + int INTEGER, + collection SEQUENCE OF T2 + } + + T2 ::= SEQUENCE { + flag BOOLEAN, + str UTF8String + } + +END diff --git a/tests/39-sequence-of-OK.asn1.-P b/tests/39-sequence-of-OK.asn1.-P new file mode 100644 index 000000000..afadff7bd --- /dev/null +++ b/tests/39-sequence-of-OK.asn1.-P @@ -0,0 +1,171 @@ + +/*** <<< DEPS [T] >>> ***/ + +/* Dependencies for T */ +#include + +/* Dependencies for collection */ +#include +#include + + #include +#include + +extern asn1_TYPE_descriptor_t asn1_DEF_T; + +/*** <<< TYPE-DECLS [T] >>> ***/ + + +typedef struct T { + INTEGER_t int; + struct collection { + A_SEQUENCE_OF(struct T2) list; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; + } collection; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} T_t; + +/*** <<< STAT-DEFS [T] >>> ***/ + + static asn1_SET_OF_element_t asn1_DEF_collection_elements[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + (void *)&asn1_DEF_T2 }, + }; + static ber_tlv_tag_t asn1_DEF_collection_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) + }; + static asn1_SET_OF_specifics_t asn1_DEF_collection_specs = { + sizeof(struct collection), + offsetof(struct collection, _ber_dec_ctx), + asn1_DEF_collection_elements + }; + asn1_TYPE_descriptor_t asn1_DEF_collection = { + "collection", + SEQUENCE_OF_constraint, + SEQUENCE_OF_decode_ber, + SEQUENCE_OF_encode_der, + SEQUENCE_OF_print, + SEQUENCE_OF_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_collection_tags, + sizeof(asn1_DEF_collection_tags) + /sizeof(asn1_DEF_collection_tags[0]), + 0, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + &asn1_DEF_collection_specs /* Additional specs */ + }; + +#include + +static asn1_SEQUENCE_element_t asn1_DEF_T_elements[] = { + { offsetof(struct T, int), 0, + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + (void *)&asn1_DEF_INTEGER, + "int" + }, + { offsetof(struct T, collection), 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + (void *)&asn1_DEF_collection, + "collection" + }, +}; +static ber_tlv_tag_t asn1_DEF_T_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_SEQUENCE_specifics_t asn1_DEF_T_specs = { + sizeof(struct T), + offsetof(struct T, _ber_dec_ctx), + asn1_DEF_T_elements, + 2, /* Elements count */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn1_TYPE_descriptor_t asn1_DEF_T = { + "T", + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_print, + SEQUENCE_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T_tags, + sizeof(asn1_DEF_T_tags) + /sizeof(asn1_DEF_T_tags[0]), + 0, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + &asn1_DEF_T_specs /* Additional specs */ +}; + + +/*** <<< DEPS [T2] >>> ***/ + +/* Dependencies for T2 */ +#include +#include + +#include + +extern asn1_TYPE_descriptor_t asn1_DEF_T2; + +/*** <<< TYPE-DECLS [T2] >>> ***/ + + +typedef struct T2 { + BOOLEAN_t flag; + UTF8String_t str; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} T2_t; + +/*** <<< STAT-DEFS [T2] >>> ***/ + +#include + +static asn1_SEQUENCE_element_t asn1_DEF_T2_elements[] = { + { offsetof(struct T2, flag), 0, + (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), + 0, + (void *)&asn1_DEF_BOOLEAN, + "flag" + }, + { offsetof(struct T2, str), 0, + (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), + 0, + (void *)&asn1_DEF_UTF8String, + "str" + }, +}; +static ber_tlv_tag_t asn1_DEF_T2_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_SEQUENCE_specifics_t asn1_DEF_T2_specs = { + sizeof(struct T2), + offsetof(struct T2, _ber_dec_ctx), + asn1_DEF_T2_elements, + 2, /* Elements count */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn1_TYPE_descriptor_t asn1_DEF_T2 = { + "T2", + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_print, + SEQUENCE_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T2_tags, + sizeof(asn1_DEF_T2_tags) + /sizeof(asn1_DEF_T2_tags[0]), + 0, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + &asn1_DEF_T2_specs /* Additional specs */ +}; + diff --git a/tests/40-int-optional-SE.asn1 b/tests/40-int-optional-SE.asn1 new file mode 100644 index 000000000..abe106592 --- /dev/null +++ b/tests/40-int-optional-SE.asn1 @@ -0,0 +1,27 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .40 + +ModuleTestIntOptional + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 40 } + DEFINITIONS ::= +BEGIN + + T ::= CHOICE { + seq SEQUENCE { + string UTF8String, + alpha INTEGER OPTIONAL, + beta INTEGER OPTIONAL + }, + set SET { + string UTF8String, + alpha INTEGER OPTIONAL, + beta INTEGER OPTIONAL + } + } + +END diff --git a/tests/41-int-optional-OK.asn1 b/tests/41-int-optional-OK.asn1 new file mode 100644 index 000000000..3e091d788 --- /dev/null +++ b/tests/41-int-optional-OK.asn1 @@ -0,0 +1,27 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .41 + +ModuleTestIntOptional + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 41 } + DEFINITIONS AUTOMATIC TAGS ::= +BEGIN + + T ::= CHOICE { + seq SEQUENCE { + string UTF8String, + alpha INTEGER OPTIONAL, + beta INTEGER OPTIONAL + }, + set SET { + string UTF8String, + alpha INTEGER OPTIONAL, + beta INTEGER OPTIONAL + } + } + +END diff --git a/tests/42-real-life-OK.asn1 b/tests/42-real-life-OK.asn1 new file mode 100644 index 000000000..33802c211 --- /dev/null +++ b/tests/42-real-life-OK.asn1 @@ -0,0 +1,67 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .42 + +ModuleLAPStorage + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 42 } + DEFINITIONS EXTENSIBILITY IMPLIED ::= +BEGIN + + /* + * A package representing a distinguished log line. + * It contains + * - a digest of that line (actually, a normalized + * form with bells (\007) in place of variable components), + * - one or more sets of variable parts (presumably with different + * acceptability rules). + */ + LogLine ::= SEQUENCE { + line-digest IA5String, -- Log line normal form + varsets SEQUENCE (1..MAX) OF VariablePartSet + } + + /* + * This package contains a set of variable components of a log line. + * Each variable component may contain one or more "value samples", + * or a range between two samples. + */ + VariablePartSet ::= SEQUENCE { + vparts SEQUENCE (0..MAX) OF VariablePart, -- {123,321} + resolution ActionItem + } + + /* + * A description of a single variable part. + */ + VariablePart ::= CHOICE { + -- A set of acceptable values + vset SET (1..MAX) OF VisibleString, + -- A range of acceptable values + vrange SEQUENCE { + from VisibleString, + to VisibleString + } + } + + /* + * What to do with the log line. + */ + ActionItem ::= SEQUENCE { + accept-as ENUMERATED { + unknown, -- Action yet unknown. + safe, -- No action, just move on. + unsafe, -- Unsafe message. Inform NOC. + ... + }, + notify SEQUENCE { -- How to notify NOC. + critical BOOLEAN, -- Emit critical message + email SET OF VisibleString, -- Send emails + ... + } OPTIONAL + } + +END diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR new file mode 100644 index 000000000..bcac56cba --- /dev/null +++ b/tests/42-real-life-OK.asn1.-PR @@ -0,0 +1,569 @@ + +/*** <<< DEPS [LogLine] >>> ***/ + +/* Dependencies for LogLine */ +#include + +/* Dependencies for varsets */ +#include +#include + + #include +#include + +extern asn1_TYPE_descriptor_t asn1_DEF_LogLine; + +/*** <<< TYPE-DECLS [LogLine] >>> ***/ + + +typedef struct LogLine { + IA5String_t line_digest; + struct varsets { + A_SEQUENCE_OF(struct VariablePartSet) list; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; + } varsets; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} LogLine_t; + +/*** <<< STAT-DEFS [LogLine] >>> ***/ + + static asn1_SET_OF_element_t asn1_DEF_varsets_elements[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + (void *)&asn1_DEF_VariablePartSet }, + }; + static ber_tlv_tag_t asn1_DEF_varsets_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) + }; + static asn1_SET_OF_specifics_t asn1_DEF_varsets_specs = { + sizeof(struct varsets), + offsetof(struct varsets, _ber_dec_ctx), + asn1_DEF_varsets_elements + }; + asn1_TYPE_descriptor_t asn1_DEF_varsets = { + "varsets", + SEQUENCE_OF_constraint, + SEQUENCE_OF_decode_ber, + SEQUENCE_OF_encode_der, + SEQUENCE_OF_print, + SEQUENCE_OF_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_varsets_tags, + sizeof(asn1_DEF_varsets_tags) + /sizeof(asn1_DEF_varsets_tags[0]), + 0, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + &asn1_DEF_varsets_specs /* Additional specs */ + }; + +#include + +static asn1_SEQUENCE_element_t asn1_DEF_LogLine_elements[] = { + { offsetof(struct LogLine, line_digest), 0, + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), + 0, + (void *)&asn1_DEF_IA5String, + "line-digest" + }, + { offsetof(struct LogLine, varsets), 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + (void *)&asn1_DEF_varsets, + "varsets" + }, +}; +static ber_tlv_tag_t asn1_DEF_LogLine_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_SEQUENCE_specifics_t asn1_DEF_LogLine_specs = { + sizeof(struct LogLine), + offsetof(struct LogLine, _ber_dec_ctx), + asn1_DEF_LogLine_elements, + 2, /* Elements count */ + 1, /* Start extensions */ + 3 /* Stop extensions */ +}; +asn1_TYPE_descriptor_t asn1_DEF_LogLine = { + "LogLine", + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_print, + SEQUENCE_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_LogLine_tags, + sizeof(asn1_DEF_LogLine_tags) + /sizeof(asn1_DEF_LogLine_tags[0]), + 0, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + &asn1_DEF_LogLine_specs /* Additional specs */ +}; + + +/*** <<< DEPS [VariablePartSet] >>> ***/ + +/* Dependencies for VariablePartSet */ +#include + +/* Dependencies for vparts */ +#include +#include + + #include +#include + +extern asn1_TYPE_descriptor_t asn1_DEF_VariablePartSet; + +/*** <<< TYPE-DECLS [VariablePartSet] >>> ***/ + + +typedef struct VariablePartSet { + struct vparts { + A_SEQUENCE_OF(struct VariablePart) list; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; + } vparts; + ActionItem_t resolution; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} VariablePartSet_t; + +/*** <<< STAT-DEFS [VariablePartSet] >>> ***/ + + static asn1_SET_OF_element_t asn1_DEF_vparts_elements[] = { + { -1 /* Ambiguous tag (CHOICE?) */, + (void *)&asn1_DEF_VariablePart }, + }; + static ber_tlv_tag_t asn1_DEF_vparts_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) + }; + static asn1_SET_OF_specifics_t asn1_DEF_vparts_specs = { + sizeof(struct vparts), + offsetof(struct vparts, _ber_dec_ctx), + asn1_DEF_vparts_elements + }; + asn1_TYPE_descriptor_t asn1_DEF_vparts = { + "vparts", + SEQUENCE_OF_constraint, + SEQUENCE_OF_decode_ber, + SEQUENCE_OF_encode_der, + SEQUENCE_OF_print, + SEQUENCE_OF_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_vparts_tags, + sizeof(asn1_DEF_vparts_tags) + /sizeof(asn1_DEF_vparts_tags[0]), + 0, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + &asn1_DEF_vparts_specs /* Additional specs */ + }; + +#include + +static asn1_SEQUENCE_element_t asn1_DEF_VariablePartSet_elements[] = { + { offsetof(struct VariablePartSet, vparts), 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + (void *)&asn1_DEF_vparts, + "vparts" + }, + { offsetof(struct VariablePartSet, resolution), 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + (void *)&asn1_DEF_ActionItem, + "resolution" + }, +}; +static ber_tlv_tag_t asn1_DEF_VariablePartSet_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_SEQUENCE_specifics_t asn1_DEF_VariablePartSet_specs = { + sizeof(struct VariablePartSet), + offsetof(struct VariablePartSet, _ber_dec_ctx), + asn1_DEF_VariablePartSet_elements, + 2, /* Elements count */ + 1, /* Start extensions */ + 3 /* Stop extensions */ +}; +asn1_TYPE_descriptor_t asn1_DEF_VariablePartSet = { + "VariablePartSet", + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_print, + SEQUENCE_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_VariablePartSet_tags, + sizeof(asn1_DEF_VariablePartSet_tags) + /sizeof(asn1_DEF_VariablePartSet_tags[0]), + 0, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + &asn1_DEF_VariablePartSet_specs /* Additional specs */ +}; + + +/*** <<< DEPS [VariablePart] >>> ***/ + + +/* Dependencies for vset */ +#include +#include + + #include + +/* Dependencies for vrange */ +#include +#include + + #include + +extern asn1_TYPE_descriptor_t asn1_DEF_VariablePart; + +/*** <<< TYPE-DECLS [VariablePart] >>> ***/ + + +typedef struct VariablePart { + enum { + VariablePart_PR_NOTHING, /* No components present */ + VariablePart_PR_vset, + VariablePart_PR_vrange, + } present; + union { + struct vset { + A_SET_OF(VisibleString_t) list; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; + } vset; + struct vrange { + VisibleString_t from; + VisibleString_t to; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; + } vrange; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} VariablePart_t; + +/*** <<< STAT-DEFS [VariablePart] >>> ***/ + + static asn1_SET_OF_element_t asn1_DEF_vset_elements[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), + (void *)&asn1_DEF_VisibleString }, + }; + static ber_tlv_tag_t asn1_DEF_vset_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) + }; + static asn1_SET_OF_specifics_t asn1_DEF_vset_specs = { + sizeof(struct vset), + offsetof(struct vset, _ber_dec_ctx), + asn1_DEF_vset_elements + }; + asn1_TYPE_descriptor_t asn1_DEF_vset = { + "vset", + SET_OF_constraint, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_print, + SET_OF_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_vset_tags, + sizeof(asn1_DEF_vset_tags) + /sizeof(asn1_DEF_vset_tags[0]), + 0, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + &asn1_DEF_vset_specs /* Additional specs */ + }; + + #include + + static asn1_SEQUENCE_element_t asn1_DEF_vrange_elements[] = { + { offsetof(struct vrange, from), 0, + (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), + 0, + (void *)&asn1_DEF_VisibleString, + "from" + }, + { offsetof(struct vrange, to), 0, + (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), + 0, + (void *)&asn1_DEF_VisibleString, + "to" + }, + }; + static ber_tlv_tag_t asn1_DEF_vrange_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) + }; + static asn1_SEQUENCE_specifics_t asn1_DEF_vrange_specs = { + sizeof(struct vrange), + offsetof(struct vrange, _ber_dec_ctx), + asn1_DEF_vrange_elements, + 2, /* Elements count */ + 1, /* Start extensions */ + 3 /* Stop extensions */ + }; + asn1_TYPE_descriptor_t asn1_DEF_vrange = { + "vrange", + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_print, + SEQUENCE_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_vrange_tags, + sizeof(asn1_DEF_vrange_tags) + /sizeof(asn1_DEF_vrange_tags[0]), + 0, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + &asn1_DEF_vrange_specs /* Additional specs */ + }; + +#include + +static asn1_CHOICE_element_t asn1_DEF_VariablePart_elements[] = { + { offsetof(struct VariablePart, choice.vset), 0, + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), + 0, + (void *)&asn1_DEF_vset, + "vset" + }, + { offsetof(struct VariablePart, choice.vrange), 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + (void *)&asn1_DEF_vrange, + "vrange" + }, +}; +static ber_tlv_tag_t asn1_DEF_VariablePart_tags[] = { + +}; +static asn1_CHOICE_tag2member_t asn1_DEF_VariablePart_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1 }, /* vrange at 45 */ + { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0 }, /* vset at 42 */ +}; +static asn1_CHOICE_specifics_t asn1_DEF_VariablePart_specs = { + sizeof(struct VariablePart), + offsetof(struct VariablePart, _ber_dec_ctx), + offsetof(struct VariablePart, present), + sizeof(((struct VariablePart *)0)->present), + asn1_DEF_VariablePart_elements, + 2, /* Elements count */ + asn1_DEF_VariablePart_tag2el, + 2, /* Count of tags in the map */ + 0 /* Whether extensible */ +}; +asn1_TYPE_descriptor_t asn1_DEF_VariablePart = { + "VariablePart", + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_print, + CHOICE_free, + CHOICE_outmost_tag, + asn1_DEF_VariablePart_tags, + sizeof(asn1_DEF_VariablePart_tags) + /sizeof(asn1_DEF_VariablePart_tags[0]), + 0, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + &asn1_DEF_VariablePart_specs /* Additional specs */ +}; + + +/*** <<< DEPS [ActionItem] >>> ***/ + +/* Dependencies for ActionItem */ +#include + + typedef enum accept_as { + accept_as_unknown = 0, + accept_as_safe = 1, + accept_as_unsafe = 2, + /* + * Enumeration is extensible + */ + } accept_as_e; +/* Dependencies for notify */ +#include + +/* Dependencies for email */ +#include +#include + + #include + + #include + +#include + +extern asn1_TYPE_descriptor_t asn1_DEF_ActionItem; + +/*** <<< TYPE-DECLS [ActionItem] >>> ***/ + + +typedef struct ActionItem { + ENUMERATED_t accept_as; + struct notify { + BOOLEAN_t critical; + struct email { + A_SET_OF(VisibleString_t) list; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; + } email; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; + } *notify; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} ActionItem_t; + +/*** <<< STAT-DEFS [ActionItem] >>> ***/ + + static asn1_SET_OF_element_t asn1_DEF_email_elements[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), + (void *)&asn1_DEF_VisibleString }, + }; + static ber_tlv_tag_t asn1_DEF_email_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) + }; + static asn1_SET_OF_specifics_t asn1_DEF_email_specs = { + sizeof(struct email), + offsetof(struct email, _ber_dec_ctx), + asn1_DEF_email_elements + }; + asn1_TYPE_descriptor_t asn1_DEF_email = { + "email", + SET_OF_constraint, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_print, + SET_OF_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_email_tags, + sizeof(asn1_DEF_email_tags) + /sizeof(asn1_DEF_email_tags[0]), + 0, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + &asn1_DEF_email_specs /* Additional specs */ + }; + + #include + + static asn1_SEQUENCE_element_t asn1_DEF_notify_elements[] = { + { offsetof(struct notify, critical), 0, + (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), + 0, + (void *)&asn1_DEF_BOOLEAN, + "critical" + }, + { offsetof(struct notify, email), 0, + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), + 0, + (void *)&asn1_DEF_email, + "email" + }, + }; + static ber_tlv_tag_t asn1_DEF_notify_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) + }; + static asn1_SEQUENCE_specifics_t asn1_DEF_notify_specs = { + sizeof(struct notify), + offsetof(struct notify, _ber_dec_ctx), + asn1_DEF_notify_elements, + 2, /* Elements count */ + 1, /* Start extensions */ + 3 /* Stop extensions */ + }; + asn1_TYPE_descriptor_t asn1_DEF_notify = { + "notify", + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_print, + SEQUENCE_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_notify_tags, + sizeof(asn1_DEF_notify_tags) + /sizeof(asn1_DEF_notify_tags[0]), + 0, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + &asn1_DEF_notify_specs /* Additional specs */ + }; + +#include + +static asn1_SEQUENCE_element_t asn1_DEF_ActionItem_elements[] = { + { offsetof(struct ActionItem, accept_as), 0, + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + (void *)&asn1_DEF_ENUMERATED, + "accept-as" + }, + { offsetof(struct ActionItem, notify), 1, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + (void *)&asn1_DEF_notify, + "notify" + }, +}; +static ber_tlv_tag_t asn1_DEF_ActionItem_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_SEQUENCE_specifics_t asn1_DEF_ActionItem_specs = { + sizeof(struct ActionItem), + offsetof(struct ActionItem, _ber_dec_ctx), + asn1_DEF_ActionItem_elements, + 2, /* Elements count */ + 1, /* Start extensions */ + 3 /* Stop extensions */ +}; +asn1_TYPE_descriptor_t asn1_DEF_ActionItem = { + "ActionItem", + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_print, + SEQUENCE_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_ActionItem_tags, + sizeof(asn1_DEF_ActionItem_tags) + /sizeof(asn1_DEF_ActionItem_tags[0]), + 0, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + &asn1_DEF_ActionItem_specs /* Additional specs */ +}; + diff --git a/tests/43-recursion-OK.asn1 b/tests/43-recursion-OK.asn1 new file mode 100644 index 000000000..185b8ccba --- /dev/null +++ b/tests/43-recursion-OK.asn1 @@ -0,0 +1,26 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .43 + +ModuleRecursion + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 43 } + DEFINITIONS ::= +BEGIN + + Test-structure-1 ::= SEQUENCE { + t-member1 SET OF Test-structure-1, + t-member2 SEQUENCE OF Test-structure-1, + t-member3 Test-structure-1 OPTIONAL + } + + Sets ::= SEQUENCE { + s-member1 SET OF INTEGER, + s-member2 SET OF ENUMERATED { a, b }, + s-member3 SET OF IA5String + } + +END diff --git a/tests/Makefile.am b/tests/Makefile.am new file mode 100644 index 000000000..03dda3b31 --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1,2 @@ + +EXTRA_DIST = *.asn1* diff --git a/tests/Makefile.in b/tests/Makefile.in new file mode 100644 index 000000000..a391a53a3 --- /dev/null +++ b/tests/Makefile.in @@ -0,0 +1,219 @@ +# Makefile.in generated automatically by automake 1.5 from Makefile.am. + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_alias = @build_alias@ +build_triplet = @build@ +host_alias = @host_alias@ +host_triplet = @host@ +target_alias = @target_alias@ +target_triplet = @target@ +ADD_CFLAGS = @ADD_CFLAGS@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +AWK = @AWK@ +CC = @CC@ +CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPP = @CPP@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +EXEEXT = @EXEEXT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LEX = @LEX@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +MAINT = @MAINT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PATH = @PATH@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ +YACC = @YACC@ +am__include = @am__include@ +am__quote = @am__quote@ +install_sh = @install_sh@ + +EXTRA_DIST = *.asn1* +subdir = tests +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +DIST_SOURCES = +DIST_COMMON = README Makefile.am Makefile.in +all: all-am + +.SUFFIXES: + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/Makefile +Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && \ + CONFIG_HEADERS= CONFIG_LINKS= \ + CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status +uninstall-info-am: +tags: TAGS +TAGS: + + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + $(mkinstalldirs) "$(distdir)/$$dir"; \ + fi; \ + if test -d $$d/$$file; then \ + cp -pR $$d/$$file $(distdir) \ + || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile + +installdirs: + +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + +distclean-am: clean-am distclean-generic distclean-libtool + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +uninstall-am: uninstall-info-am + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/tests/README b/tests/README new file mode 100644 index 000000000..abba35024 --- /dev/null +++ b/tests/README @@ -0,0 +1,24 @@ + +This is a collection of various little ASN.1 modules, used independently +by several different testing engines below the main tree (i.e. libasn1fix) +for stressing various aspects of compiler operation. + +The files follow certain naming conventions: + +Source file: + --{OK|SE|NP}.asn1 + +Regenerator test file: + --{OK|SE|NP}.asn1.[] + +Where + is arbitrary number (digits) + is arbitrary string, without dots + OK file syntax and semantics are absolutely correct + SE file semantics is wrong + NP file syntax is incorrect, file not parseable + command-line flags for compiler + +Example: + 07-int-OK.asn1 # Correct ASN.1 file + 07-int-OK.asn1.-EFN # Test of file regeneration with -EFN flags. From e18adea9aee90ffb24240e23a6b6507f677496bd Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 3 Jun 2004 03:49:45 +0000 Subject: [PATCH 0003/1469] docs git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@3 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-usage.lyx | 1958 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1958 insertions(+) create mode 100644 doc/asn1c-usage.lyx diff --git a/doc/asn1c-usage.lyx b/doc/asn1c-usage.lyx new file mode 100644 index 000000000..e4519966a --- /dev/null +++ b/doc/asn1c-usage.lyx @@ -0,0 +1,1958 @@ +#LyX 1.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 221 +\textclass book +\language english +\inputencoding latin1 +\fontscheme ae +\graphics default +\paperfontsize default +\spacing single +\papersize Default +\paperpackage a4 +\use_geometry 0 +\use_amsmath 0 +\use_natbib 0 +\use_numerical_citations 0 +\paperorientation portrait +\secnumdepth 3 +\tocdepth 3 +\paragraph_separation indent +\defskip medskip +\quotes_language swedish +\quotes_times 2 +\papercolumns 1 +\papersides 1 +\paperpagestyle default + +\layout Title + +ASN.1 Compiler: Usage +\layout Author + +Lev Walkin < +\begin_inset LatexCommand \url{vlm@lionet.info} + +\end_inset + +> +\layout Standard + + +\begin_inset LatexCommand \tableofcontents{} + +\end_inset + + +\layout Chapter + +Basics of ASN.1 +\layout Standard + + +\emph on +This chapter defines some basic ASN.1 concepts and describes several most + widely used types. + It is by no means an authoritative or complete reference. + For more complete ASN.1 description, please refer to Olivier Dubuisson's + book +\begin_inset LatexCommand \cite{Dub00} + +\end_inset + + or the ASN.1 standard itself +\begin_inset LatexCommand \cite{ITU-T/ASN.1} + +\end_inset + +. +\layout Standard + +The Abstract Syntax Notation One is used to formally describe the semantics + of data transmitted across the network. + Two communicating parties may have different formats of their native data + types (i.e. + number of bits in the integer type), thus it is important to have a way + to describe the data in a manner which is independent from the particular + machine's representation. + The ASN.1 specifications is used to achieve one or more of the following: +\layout Itemize + +The specification expressed in the ASN.1 notation is a formal and precise + way to communicate the data semantics to human readers; +\layout Itemize + +The ASN.1 specifications may be used as input for automatic compilers which + produce the code for some target language (C, C++, Java, etc) to encode + and decode the data according to some encoding rules (which are also defined + by the ASN.1 standard). +\layout Standard + +Consider the following example: +\layout LyX-Code + +Rectangle ::= SEQUENCE { +\layout LyX-Code + + height INTEGER, +\layout LyX-Code + + width INTEGER +\layout LyX-Code + +} +\layout Standard + +This ASN.1 specification describes a constructed type, +\emph on +Rectangle +\emph default +, containing two integer fields. + This specification may tell the reader that there is this kind of data + structure and that some entity may be prepared to send or receive it. + The question on +\emph on +how +\emph default + that entity is going to send or receive the +\emph on +encoded data +\emph default + is outside the scope of ASN.1. + For example, this data structure may be encoded according to some encoding + rules and sent to the destination using the TCP protocol. + The ASN.1 specifies several ways of encoding (or +\begin_inset Quotes sld +\end_inset + +serializing +\begin_inset Quotes srd +\end_inset + +, or +\begin_inset Quotes sld +\end_inset + +marshaling +\begin_inset Quotes srd +\end_inset + +) the data: BER, CER, DER and XER, some of them which will be described + later. +\layout Standard + +The complete specification must be wrapped in a module, which looks like + this: +\layout LyX-Code + +UsageExampleModule1 +\layout LyX-Code + + { iso org(3) dod(6) internet(1) private(4) +\layout LyX-Code + + enterprise(1) spelio(9363) software(1) +\layout LyX-Code + + asn1c(5) docs(2) usage(1) 1 } +\layout LyX-Code + + AUTOMATIC TAGS DEFINITIONS ::= +\layout LyX-Code + +BEGIN +\layout LyX-Code + + +\layout LyX-Code + +-- This is a comment which describes nothing. +\layout LyX-Code + +Rectangle ::= SEQUENCE { +\layout LyX-Code + + height INTEGER, -- Height of the rectangle +\layout LyX-Code + + width INTEGER, -- Width of the rectangle +\layout LyX-Code + +} +\layout LyX-Code + + +\layout LyX-Code + +END +\layout Standard + +The module header consists of module name (UsageExampleModule1), the module + object identifier ({...}), some flags (AUTOMATIC TAGS) and +\begin_inset Quotes sld +\end_inset + +DEFINITIONS ::= BEGIN +\begin_inset Quotes srd +\end_inset + +. + The module ends with an +\begin_inset Quotes sld +\end_inset + +END +\begin_inset Quotes srd +\end_inset + + statement. +\layout Section + +Some of the ASN.1 Basic Types +\layout Subsection + +The BOOLEAN type +\layout Standard + +The BOOLEAN type models the simple binary TRUE/FALSE, YES/NO, ON/OFF or + a similar kind of two-way choice. +\layout Subsection + +The INTEGER type +\layout Standard + +The INTEGER type is a signed natural number type without any restrictions + on its size. + If the automatic checking on INTEGER value bounds are necessary, the subtype + constraints must be used. +\layout LyX-Code + +SimpleInteger ::= INTEGER +\layout LyX-Code + +-- An integer with a very limited range +\layout LyX-Code + +SmallInt ::= INTEGER (0..127) +\layout LyX-Code + +-- Integer, negative +\layout LyX-Code + +NegativeInt ::= INTEGER (MIN..0) +\layout Subsection + +The ENUMERATED type +\layout Standard + +The ENUMERATED type is semantically equivalent to the INTEGER type with + some integer values explicitly named. +\layout LyX-Code + +FruitId ::= ENUMERATED { apple(1), orange(2) } +\layout LyX-Code + +-- The numbers in braces are optional, +\layout LyX-Code + +-- the enumeration may be performed +\layout LyX-Code + +-- automatically by the compiler +\layout LyX-Code + +ComputerOSType ::= ENUMERATED { +\layout LyX-Code + + FreeBSD, -- will be 0 +\layout LyX-Code + + Windows, -- will be 1 +\layout LyX-Code + + Solaris(5), -- will remain 5 +\layout LyX-Code + + Linux, -- will be 6 +\layout LyX-Code + + MacOS -- will be 7 +\layout LyX-Code + +} +\layout Subsection + +The OCTET STRING type +\layout Standard + +This type models the sequence of 8-bit bytes. + This may be used to transmit some opaque data or data serialized by other + types of encoders (i.e. + video file, photo picture, etc). +\layout Subsection + +The OBJECT IDENTIFIER type +\layout Standard + +The OBJECT IDENTIFIER is used to represent the unique identifier of any + object, starting from the very root of the registration tree. + If your organization needs to uniquely identify something (a router, a + room, a person, a standard, or whatever), you are encouraged to get your + own identification subtree at +\begin_inset LatexCommand \htmlurl{http://www.iana.org/protocols/forms.htm} + +\end_inset + +. +\layout Standard + +For example, the very first ASN.1 module in this document has the following + OBJECT IDENTIFIER: 1 3 6 1 4 1 9363 1 5 2 1 1. +\layout LyX-Code + +ExampleOID ::= OBJECT IDENTIFIER +\layout LyX-Code + +usageExampleModule1-oid ExampleOID +\layout LyX-Code + + ::= { 1 3 6 1 4 1 9363 1 5 2 1 1 } +\layout LyX-Code + +-- An identifier of the Internet. +\layout LyX-Code + +internet-id OBJECT IDENTIFIER +\layout LyX-Code + + ::= { iso(1) identified-organization(3) +\layout LyX-Code + + dod(6) internet(1) } +\layout Standard + +As you see, names are optional. +\layout Subsection + +The RELATIVE-OID type +\layout Standard + +The RELATIVE-OID type has the semantics of a subtree of an OBJECT IDENTIFIER. + There may be no need to repeat the whole sequence of numbers from the root + of the registration tree where the only thing of interest is some of the + tree's subsequence. +\layout LyX-Code + +this-document RELATIVE-OID ::= { docs(2) usage(1) } +\layout LyX-Code + +this-example RELATIVE-OID ::= { +\layout LyX-Code + + this-document assorted-examples(0) this-example(1) } +\layout Section + +Some of the ASN.1 String Types +\layout Subsection + +The IA5String type +\layout Standard + +This is essentially the ASCII, with 128 character codes available (7 lower + bits of 8-bit byte). +\layout Subsection + +The UTF8String type +\layout Standard + +This is the character string which encodes the full Unicode range (4 bytes) + using multibyte character sequences. +\layout Subsection + +The NumericString type +\layout Standard + +This type represents the character string with the alphabet consisting of + numbers ( +\begin_inset Quotes sld +\end_inset + +0 +\begin_inset Quotes srd +\end_inset + + to +\begin_inset Quotes sld +\end_inset + +9 +\begin_inset Quotes srd +\end_inset + +) and a space. +\layout Subsection + +The PrintableString type +\layout Standard + +The character string with the following alphabet: space, +\begin_inset Quotes sld +\end_inset + + +\series bold +' +\series default + +\begin_inset Quotes srd +\end_inset + + (single quote), +\begin_inset Quotes sld +\end_inset + + +\series bold +( +\series default + +\begin_inset Quotes sld +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold +) +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold ++ +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + +, +\begin_inset Quotes srd +\end_inset + + (comma), +\begin_inset Quotes sld +\end_inset + + +\series bold +- +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold +. +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold +/ +\series default + +\begin_inset Quotes srd +\end_inset + +, digits ( +\begin_inset Quotes sld +\end_inset + +0 +\begin_inset Quotes srd +\end_inset + + to +\begin_inset Quotes sld +\end_inset + +9 +\begin_inset Quotes srd +\end_inset + +), +\begin_inset Quotes sld +\end_inset + + +\series bold +: +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold += +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold +? +\series default + +\begin_inset Quotes srd +\end_inset + +, upper-case and lower-case letters ( +\begin_inset Quotes sld +\end_inset + +A +\begin_inset Quotes srd +\end_inset + + to +\begin_inset Quotes sld +\end_inset + +Z +\begin_inset Quotes srd +\end_inset + + and +\begin_inset Quotes sld +\end_inset + +a +\begin_inset Quotes srd +\end_inset + + to +\begin_inset Quotes sld +\end_inset + +z +\begin_inset Quotes srd +\end_inset + +) +\layout Subsection + +The VisibleString type +\layout Standard + +The character string with the alphabet which is more or less a subset of + ASCII between space and +\begin_inset Quotes sld +\end_inset + +~ +\begin_inset Quotes srd +\end_inset + + (tilde). + Alternatively, the alphabet may be represented as the PrintableString alphabet + described earlier, plus the following characters: +\begin_inset Quotes sld +\end_inset + + +\series bold +! +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold + +\begin_inset Quotes srd +\end_inset + + +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold +# +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold +$ +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold +% +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold +& +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold +* +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold +; +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold +< +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold +> +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold +[ +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold + +\backslash + +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold +] +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold +^ +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold +_ +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold +` +\series default + +\begin_inset Quotes srd +\end_inset + + (single left quote), +\begin_inset Quotes sld +\end_inset + + +\series bold +{ +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold +| +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + + +\series bold +} +\series default + +\begin_inset Quotes srd +\end_inset + +, +\begin_inset Quotes sld +\end_inset + +~ +\begin_inset Quotes srd +\end_inset + +. +\layout Section + +ASN.1 Constructed Types +\layout Subsection + +The SEQUENCE type +\layout Standard + +This is an ordered collection of other simple or constructed types. + The SEQUENCE constructed type resembles the C +\begin_inset Quotes sld +\end_inset + +struct +\begin_inset Quotes srd +\end_inset + + statement. +\layout LyX-Code + +Address ::= SEQUENCE { +\layout LyX-Code + + -- The apartment number may be omitted +\layout LyX-Code + + apartmentNumber NumericString OPTIONAL, +\layout LyX-Code + + streetName PrintableString, +\layout LyX-Code + + cityName PrintableString, +\layout LyX-Code + + stateName PrintableString, +\layout LyX-Code + + -- This one may be omitted too +\layout LyX-Code + + zipNo NumericString OPTIONAL +\layout LyX-Code + +} +\layout Subsection + +The SET type +\layout Standard + +This is a collection of other simple or constructed types. + Ordering is not important. + The data may arrive in the order which is different from the order of specifica +tion. + Data is encoded in the order not necessarily corresponding to the order + of specification. +\layout Subsection + +The CHOICE type +\layout Standard + +This type is just a choice between the subtypes specified in it. + The CHOICE type contains at most one of the subtypes specified, and it + is always implicitly known which choice is being decoded or encoded. + This one resembles the C +\begin_inset Quotes sld +\end_inset + +union +\begin_inset Quotes srd +\end_inset + + statement. +\layout Standard + +The following type defines a response code, which may be either an integer + code or a boolean +\begin_inset Quotes sld +\end_inset + +true +\begin_inset Quotes srd +\end_inset + +/ +\begin_inset Quotes srd +\end_inset + +false +\begin_inset Quotes srd +\end_inset + + code. +\layout LyX-Code + +ResponseCode ::= CHOICE { +\layout LyX-Code + + intCode INTEGER, +\layout LyX-Code + + boolCode BOOLEAN +\layout LyX-Code + +} +\layout LyX-Code + +\layout Subsection + +The SEQUENCE OF type +\layout Standard + +This one is the list (array) of simple or constructed types: +\layout LyX-Code + +-- Example 1 +\layout LyX-Code + +ManyIntegers ::= SEQUENCE OF INTEGER +\layout LyX-Code + +-- Example 2 +\layout LyX-Code + +ManyRectangles ::= SEQUENCE OF Rectangle +\layout LyX-Code + +-- More complex example: +\layout LyX-Code + +-- an array of structures defined in place. +\layout LyX-Code + +ManyCircles ::= SEQUENCE OF SEQUENCE { +\layout LyX-Code + + radius INTEGER +\layout LyX-Code + + } +\layout Subsection + +The SET OF type +\layout Standard + +The SET OF type models the bag of structures. + It resembles the SEQUENCE OF type, but the order is not important: i.e. + the elements may arrive in the order which is not necessarily the same + as the in-memory order on the remote machines. +\layout LyX-Code + +-- A set of structures defined elsewhere +\layout LyX-Code + +SetOfApples :: SET OF Apple +\layout LyX-Code + +-- Set of integers encoding the kind of a fruit +\layout LyX-Code + +FruitBag ::= SET OF ENUMERATED { apple, orange } +\layout Chapter + +ASN.1 Compiler Usage +\layout Standard + +The purpose of the ASN.1 compiler, of which this document is part, is to + convert the ASN.1 specifications to some other target language (currently, + only C is supported +\begin_inset Foot +collapsed false + +\layout Standard + +C++ is +\begin_inset Quotes sld +\end_inset + +supported +\begin_inset Quotes srd +\end_inset + + too, as long as an object-oriented approach is not a definitive factor. +\end_inset + +). + The compiler reads the specification and emits a series of target language + structures and surrounding maintenance code. + For example, the C structure which may be created by compiler to represent + the simple +\emph on +Rectangle +\emph default + specification defined earlier in this document, may look like this +\begin_inset Foot +collapsed false + +\layout Standard + + +\emph on +-fnative-integers +\emph default + compiler option is used to produce basic C +\emph on +int +\emph default + types instead of generic INTEGER_t. +\end_inset + +: +\layout LyX-Code + +typedef struct Rectangle_s { +\layout LyX-Code + + int height; +\layout LyX-Code + + int width; +\layout LyX-Code + +} Rectangle_t; +\layout Standard + +This would not be of much value for such a simple specification, so the + compiler goes further and actually produces the code which fills in this + structure by parsing the binary +\begin_inset Foot +collapsed false + +\layout Standard + +BER, CER and DER encodings are binary. + However, the XER encoding is text (XML) based. +\end_inset + + data provided in some buffer. + It also produces the code that takes this structure as an argument and + performs structure serialization by emitting a series of bytes. +\layout Section + +Quick start +\layout Standard + +After building and installing the compiler, the asn1c command may be used + to compile the ASN.1 specification +\begin_inset Foot +collapsed false + +\layout Standard + +This is probably +\series bold +not +\series default + what you want to try out right now -- read through the rest of this chapter + to find out about -P option. +\end_inset + +: +\layout LyX-Code + +asn1c +\emph on + +\layout Standard + +If several specifications contain interdependencies, all of them must be + specified: +\layout LyX-Code + +asn1c +\emph on + ... +\layout Standard + +The compiler -E and -EF options are used for testing the parser and the + semantic fixer, respectively. + These options will instruct the compiler to dump out the parsed (and fixed) + ASN.1 specification as it was "understood" by the compiler. + It might might be useful to check whether a particular syntactic construction + is properly supported by the compiler. +\layout LyX-Code + +asn1c -EF +\emph on + +\layout Standard + +The -P option is used to dump the compiled output on the screen instead + of creating a bunch of .c and .h files on disk in the current directory. + You would probably want to start with -P option instead of creating a mess + in your current directory. +\layout Section + +Slow start +\layout Subsection + +Recognizing compiler output +\layout Standard + +After compiling, the following entities will be created in your current + directory: +\layout Itemize + +A set of .c and .h files, generally a single pair for each type defined in + the ASN.1 specifications. + These files will be named similarly to the ASN.1 types ( +\emph on +Rectangle.c +\emph default + and +\emph on +Rectangle.h +\emph default + for the specification defined in the beginning of this document). +\layout Itemize + +A set of helper .c and .h files which contain generic encoders, decoders and + other useful routines. + There will be many of them, some of them even not necessary +\begin_inset Foot +collapsed false + +\layout Standard + +Soon the compiler will be modified to emit the smallest subset of necessary + files. +\end_inset + +, but the overall amount of code after compiling will be rather small anyway. +\layout Standard + +It is your responsibility to create .c file with the +\emph on + int main() +\emph default + routine and the Makefile (if needed). + Compiler helps you with the latter by creating the Makefile.am.sample, containing + the skeleton definition for the automake, should you want to use autotools. +\layout Standard + +In other words, after compiling the Rectangle module, you have the following + set of files: { Makefile.am.sample, Rectangle.c, Rectangle.h, +\series bold +\SpecialChar \ldots{} + +\series default + }, where +\series bold + +\begin_inset Quotes sld +\end_inset + +\SpecialChar \ldots{} + +\begin_inset Quotes srd +\end_inset + + +\series default + stands for the set of additional +\begin_inset Quotes sld +\end_inset + +helper +\begin_inset Quotes srd +\end_inset + + files created by the compiler. + If you add the simple file with the +\emph on +int main() +\emph default + routine, it would even be possible to compile everything with the single + instruction: +\layout LyX-Code + +cc -o rectangle *.c # It could be +\emph on +that +\emph default + simple +\begin_inset Foot +collapsed false + +\layout Standard + +Provided that you've also created a .c file with the +\emph on +int main() +\emph default + routine. +\end_inset + + +\layout Subsection + +Invoking the ASN.1 helper code from the application +\layout Standard + +First of all, you would want to include one or more header files into your + application. + For the Rectangle module, including the Rectangle.h file is enough: +\layout LyX-Code + +#include +\layout Standard + +The header files defines the C structure corresponding to the ASN.1 definition + of a rectangle and the declaration of the ASN.1 type descriptor, which is + used as an argument to most of the functions provided by the ASN.1 module. + For example, here is the code which frees the Rectangle_t structure: +\layout LyX-Code + +Rectangle_t *rect = ; +\layout LyX-Code + +asn1_DEF_Rectangle->free_struct(&asn1_DEF_Rectangle, +\layout LyX-Code + + rect, 0); +\layout Standard + +This code defines a +\emph on +rect +\emph default + pointer which points to the Rectangle_t structure which needs to be freed. + The second line invokes the generic free_struct routine created specifically + for this Rectangle_t structure. + The +\emph on +asn1_DEF_Rectangle +\emph default + is the type descriptor, which holds a collection of generic routines to + deal with the Rectangle_t structure. +\layout Standard + +There are several generic functions available: +\layout Description + +check_constraints Check that the contents of the target structure are semantical +ly valid and constrained to appropriate implicit or explicit subtype constraints. + Please refer to Section +\begin_inset LatexCommand \vref{sub:Validating-the-target} + +\end_inset + +. +\layout Description + +ber_decoder This is the generic +\emph on +restartable +\begin_inset Foot +collapsed false + +\layout Standard + +Restartable means that if the decoder encounters the end of the buffer, + it will fail, but may later be invoked again with the rest of the buffer + to continue decoding. +\end_inset + + +\emph default +BER decoder (Basic Encoding Rules). + This decoder would create and/or fill the target structure for you. + Please refer to Section +\begin_inset LatexCommand \ref{sub:Decoding-BER} + +\end_inset + +. +\layout Description + +der_encoder This is the generic DER encoder (Distinguished Encoding Rules). + This decoder will take the target structure and encode it into a series + of bytes. + Please refer to Section +\begin_inset LatexCommand \ref{sub:Encoding-DER} + +\end_inset + +. +\layout Description + +print_struct This function convert the contents of the passed target structure + into human readable form. + This form is not formal and cannot be converted back into the structure, + but it may turn out to be useful for debugging or quick-n-dirty printing. + Please refer to Section +\begin_inset LatexCommand \ref{sub:Printing-the-target} + +\end_inset + +. +\layout Description + +free_struct This is a generic disposal which frees the target structure. + Please refer to Section +\begin_inset LatexCommand \ref{sub:Freeing-the-target} + +\end_inset + +. +\layout Standard + +Each of the above function takes the type descriptor ( +\emph on +asn1_DEF_\SpecialChar \ldots{} + +\emph default +) and the target structure ( +\emph on +rect +\emph default +, in the above example). + The target structure is typically created by the generic BER decoder or + by the application itself. +\layout Standard + +Here is how the buffer can be deserialized into the structure: +\layout LyX-Code + +Rectangle_t * +\layout LyX-Code + +simple_deserializer(void *buffer, size_t buf_size) { +\layout LyX-Code + + Rectangle_t *rect = 0; /* Note this 0! */ +\layout LyX-Code + + ber_dec_rval_t rval; +\layout LyX-Code + + +\layout LyX-Code + + rval = asn1_DEF_Rectangle->ber_decoder( +\layout LyX-Code + + &asn1_DEF_Rectangle, +\layout LyX-Code + + (void **)&rect, +\layout LyX-Code + + buffer, buf_size, +\layout LyX-Code + + 0); +\layout LyX-Code + + +\layout LyX-Code + + if(rval +\series bold +.code +\series default + == RC_OK) { +\layout LyX-Code + + return rect; /* Decoding succeeded */ +\layout LyX-Code + + } else { +\layout LyX-Code + + asn1_DEF_Rectangle->free_struct( +\layout LyX-Code + + &asn1_DEF_Rectangle, rect, 0); +\layout LyX-Code + + return 0; +\layout LyX-Code + + } +\layout LyX-Code + +} +\layout Standard + +The code above defines a function, +\emph on +simple_deserializer +\emph default +, which takes a buffer and its length and expected to return a pointer to + the Rectangle_t structure. + Inside, it tries to convert the bytes passed into the target structure + (rect) using the generic BER decoder and returns the rect pointer afterwards. + If the structure cannot be deserialized, it frees the memory which might + be left allocated by the unfinished +\emph on +ber_decoder +\emph default + routine and returns NULL. + +\series bold +This freeing is necessary +\series default + because the ber_decoder is a restartable procedure, and may fail just because + there is more data needs to be provided before decoding could be finalized. + The code above obviously does not take into account the way the +\emph on +ber_decoder +\emph default + failed, so the freeing is necessary because the part of the buffer may + already be decoded into the structure by the time something goes wrong. +\layout Standard + +Restartable decoding is a little bit trickier: you need to provide the old + target structure pointer (which might be already half-decoded) and react + on RC_WMORE return code. + This will be explained later in Section +\begin_inset LatexCommand \vref{sub:Decoding-BER} + +\end_inset + + +\layout Subsubsection + + +\begin_inset LatexCommand \label{sub:Decoding-BER} + +\end_inset + +Decoding BER +\layout Standard + +The Basic Encoding Rules describe the basic way how the structure can be + encoded and decoded. + Several other encoding rules (CER, DER) define a more restrictive versions + of BER, so the generic BER parser is also capable of decoding the data + encoded by CER and DER encoders. + The opposite is not true. +\layout Standard + +The ASN.1 compiler provides the generic BER decoder which is implicitly capable + of decoding BER, CER and DER encoded data. +\layout Standard + +The decoder is restartable (stream-oriented), which means that in case the + buffer has less data than it is expected, the decoder will process whatever + it is available and ask for more data to be provided. + Please note that the decoder may actually process less data than it is + given in the buffer, which means that you should be able to make the next + buffer contain the unprocessed part of the previous buffer. +\layout Standard + +Suppose, you have two buffers of encoded data: 100 bytes and 200 bytes. +\layout Itemize + +You may concatenate these buffers and feed the BER decoder with 300 bytes + of data, or +\layout Itemize + +You may feed it the first buffer of 100 bytes of data, realize that the + ber_decoder consumed only 95 bytes from it and later feed the decoder with + 205 bytes buffer which consists of 5 unprocessed bytes from the first buffer + and the latter 200 bytes from the second buffer. +\layout Standard + +This is not as convenient as it could be (like, the BER encoder would consume + the whole 100 bytes and keep these 5 bytes in some temporary storage), + but in case of stream-based processing it might actually be OK. + Suggestions are welcome. +\layout Standard + +There are two ways to invoke a BER decoder. + The first one is a direct reference of the type-specific decoder. + This way was shown in the previous example of +\emph on +simple_deserializer +\emph default + function. + The second way is to invoke a +\emph on +ber_decode +\emph default + function, which is just a simple wrapper of the former approach into a + less wordy notation: +\layout LyX-Code + +rval = ber_decode(&asn1_DEF_Rectangle, (void **)&rect, +\layout LyX-Code + + buffer, buf_size); +\layout Standard + +Note that the initial (asn1_DEF_Rectangle->ber_decoder) reference is gone, + and also the last argument (0) is no longer necessary. +\layout Standard + +These two ways of invocations are fully equivalent. +\layout Standard + +The BER de +\emph on +coder +\emph default + may fail because ( +\emph on +the following RC_\SpecialChar \ldots{} + codes are defined in ber_decoder.h +\emph default +): +\layout Itemize + +RC_WMORE: There is more data expected than it is provided (stream mode continuat +ion feature); +\layout Itemize + +RC_FAIL: General failure to decode the buffer; +\layout Itemize + +\SpecialChar \ldots{} + other codes may be defined as well. +\layout Standard + +Together with the return code (.code) the ber_dec_rval_t type contains the + number of bytes which is consumed from the buffer. + In the previous hypothetical example of two buffers (of 100 and 200 bytes), + the first call to ber_decode() would return with .code = RC_WMORE and .consumed + = 95. + The .consumed field of the BER decoder return value is +\series bold +always +\series default + valid, even if the decoder succeeds or fails with any other return code. +\layout Standard + +Please look into ber_decoder.h for the precise definition of ber_decode() + and related types. +\layout Subsubsection + + +\begin_inset LatexCommand \label{sub:Encoding-DER} + +\end_inset + +Encoding DER +\layout Standard + +The Distinguished Encoding Rules is the variant of BER encoding rules which + is oriented on representing the structures with length known beforehand. + This is probably exactly how you want to encode: either after a BER decoding + or after a manual fill-up, the target structure contains the data which + size is implicitly known before encoding. + The DER encoding is used, for example, to encode X.509 certificates. +\layout Standard + +As with BER decoder, the DER encoder may be invoked either directly from + the ASN.1 type descriptor (asn1_DEF_Rectangle) or from the stand-alone function, + which is somewhat simpler: +\layout LyX-Code + +/* +\layout LyX-Code + + * This is a custom function which writes the +\layout LyX-Code + + * encoded output into some FILE stream. +\layout LyX-Code + + */ +\layout LyX-Code + +int _write_stream(void *buffer, size_t size, void *app_key) { +\layout LyX-Code + + FILE *ostream = app_key; +\layout LyX-Code + + size_t wrote; +\layout LyX-Code + + +\layout LyX-Code + + wrote = fwrite(buffer, 1, size, ostream); +\layout LyX-Code + + +\layout LyX-Code + + return (wrote == size) ? 0 : -1; +\layout LyX-Code + +} +\layout LyX-Code + + +\layout LyX-Code + +/* +\layout LyX-Code + + * This is the serializer itself, +\layout LyX-Code + + * it supplies the DER encoder with the +\layout LyX-Code + + * pointer to the custom output function. +\layout LyX-Code + + */ +\layout LyX-Code + +ssize_t +\layout LyX-Code + +simple_serializer(FILE *ostream, Rectangle_t *rect) { +\layout LyX-Code + + der_enc_rval_t rval; /* Return value */ +\layout LyX-Code + + +\layout LyX-Code + + rval = der_encode(&asn1_DEF_Rect, rect, +\layout LyX-Code + + _write_stream, ostream); +\layout LyX-Code + + if(rval +\series bold +.encoded +\series default + == -1) { +\layout LyX-Code + + /* +\layout LyX-Code + + * Failure to encode the rectangle data. +\layout LyX-Code + + */ +\layout LyX-Code + + fprintf(stderr, +\begin_inset Quotes sld +\end_inset + +Cannot encode %s: %s +\backslash +n +\begin_inset Quotes srd +\end_inset + +, +\layout LyX-Code + + rval +\series bold +.failed_type +\series default +->name, +\layout LyX-Code + + strerror(errno)); +\layout LyX-Code + + return -1; +\layout LyX-Code + + } else { +\layout LyX-Code + + /* Return the number of bytes */ +\layout LyX-Code + + return rval.encoded; +\layout LyX-Code + + } +\layout LyX-Code + +} +\layout Standard + +As you see, the DER encoder does not write into some sort of buffer or something. + It just invokes the custom function (possible, multiple times) which would + save the data into appropriate storage. + The optional argument +\emph on +app_key +\emph default + is opaque for the DER encoder code and just used by +\emph on +_write_stream() +\emph default + as the pointer to the appropriate output stream to be used. +\layout Standard + +If the custom write function is not given (passed as 0), then the DER encoder + will essentially do the same thing (i.e., encode the data) but no callbacks + will be invoked (so the data goes nowhere). + It may prove useful to determine the size of the structure's encoding before + actually doing the encoding +\begin_inset Foot +collapsed false + +\layout Standard + +It is actually faster too: the encoder might skip over some computations + which aren't important for the size determination. +\end_inset + +. +\layout Standard + +Please look into der_encoder.h for the precise definition of der_encode() + and related types. +\layout Subsubsection + + +\begin_inset LatexCommand \label{sub:Validating-the-target} + +\end_inset + +Validating the target structure +\layout Standard + +Sometimes the target structure needs to be validated. + For example, if the structure was created by the application (as opposed + to being decoded from some external source), some important information + required by the ASN.1 specification might be missing. + On the other hand, the successful decoding of the data from some external + source does not necessarily mean that the data is fully valid either. + It might well be the case that the specification describes some subtype + constraints that were not taken into account during decoding, and it would + actually be useful to perform the last check when the data is ready to + be encoded or when the data has just been decoded to ensure its validity + according to some stricter rules. +\layout Standard + +The asn_check_constraints() function checks the type for various implicit + and explicit constraints. + It is recommended to use asn_check_constraints() function after each decoding + and before each encoding. +\layout Standard + +Please look into constraints.h for the precise definition of asn_check_constraint +s() and related types. +\layout Subsubsection + + +\begin_inset LatexCommand \label{sub:Printing-the-target} + +\end_inset + +Printing the target structure +\layout Standard + +There are two ways to print the target structure: either invoke the print_struct + member of the ASN.1 type descriptor, or using the asn_fprint() function, + which is a simpler wrapper of the former: +\layout LyX-Code + +asn_fprint(stdout, &asn1_DEF_Rectangle, rect); +\layout Standard + +Please look into constr_TYPE.h for the precise definition of asn_fprint() + and related types. +\layout Subsubsection + + +\begin_inset LatexCommand \label{sub:Freeing-the-target} + +\end_inset + +Freeing the target structure +\layout Standard + +Freeing the structure is slightly more complex than it may seem to. + When the ASN.1 structure is freed, all the members of the structure and + their submembers etc etc are recursively freed too. + But it might not be feasible to free the structure itself. + Consider the following case: +\layout LyX-Code + +struct my_figure { /* The custom structure */ +\layout LyX-Code + + int flags; /* */ +\layout LyX-Code + + /* The type is generated by the ASN.1 compiler */ +\layout LyX-Code + + +\emph on +Rectangle_t rect; +\layout LyX-Code + + /* other members of the structure */ +\layout LyX-Code + +}; +\layout Standard + +In this example, the application programmer defined a custom structure with + one ASN.1-derived member (rect). + This member is not a reference to the Rectangle_t, but an in-place inclusion + of the Rectangle_t structure. + If the freeing is necessary, the usual procedure of freeing everything + must not be applied to the &rect pointer itself, because it does not point + to the memory block directly allocated by memory allocation routine, but + instead lies within such a block allocated for my_figure structure. +\layout Standard + +To solve this problem, the free_struct routine has the additional argument + (besides the intuitive type descriptor and target structure pointers), + which is the flag specifying whether the outer pointer itself must be freed + (0, default) or it should be left intact (non-zero value). +\layout LyX-Code + +/* Rectangle_t is defined within my_figure */ +\layout LyX-Code + +struct my_figure *mf = +\series bold +... +\series default +; +\layout LyX-Code + +/* +\layout LyX-Code + + * Freeing the Rectangle_td +\layout LyX-Code + + * without freeing the mf->rect pointer +\layout LyX-Code + + */ +\layout LyX-Code + +asn1_DEF_Rectangle->free_struct( +\layout LyX-Code + + &asn1_DEF_Rectangle, &mf->rect, +\emph on +1 +\emph default + /* !free */); +\layout LyX-Code + + +\layout LyX-Code + +/* Rectangle_t is a stand-alone pointer */ +\layout LyX-Code + +Rectangle_t *rect = +\series bold +... +\series default +; +\layout LyX-Code + +/* +\layout LyX-Code + + * Freeing the Rectangle_t +\layout LyX-Code + + * and freeing the rect pointer +\layout LyX-Code + + */ +\layout LyX-Code + +asn1_DEF_Rectangle->free_struct( +\layout LyX-Code + + &asn1_DEF_Rectangle, rect, +\emph on +0 +\emph default + /* free the pointer too */); +\layout Standard + +It is safe to invoke the +\emph on +free_struct +\emph default + function with the target structure pointer set to 0 (NULL), the function + will do nothing. +\layout Bibliography +\bibitem [Dub00]{Dub00} + +Olivier Dubuisson -- +\emph on +ASN.1 Communication between heterogeneous systems +\emph default + -- Morgan Kaufmann Publishers, 2000. + +\begin_inset LatexCommand \htmlurl{http://asn1.elibel.tm.fr/en/book/} + +\end_inset + +. + ISBN:0-12-6333361-0. +\layout Bibliography +\bibitem [ITU-T/ASN.1]{ITU-T/ASN.1} + +ITU-T Study Group 17 -- Languages for Telecommunication Systems +\begin_inset LatexCommand \url{http://www.itu.int/ITU-T/studygroups/com17/languages/} + +\end_inset + + +\the_end From aaec3eff646ad327b8c90ebdfc383375accc551e Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 3 Jun 2004 04:35:44 +0000 Subject: [PATCH 0004/1469] const git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@4 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 8ec476c6a..0f5cf2bfa 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1364,7 +1364,7 @@ emit_constraint_checking_code(arg_t *arg) { ACT_EL_VALUE); if(size_present || value_present) { - OUT("%s_t *st = sptr;\n", MKID(arg->expr->Identifier)); + OUT("const %s_t *st = sptr;\n", MKID(arg->expr->Identifier)); if(size_present) { OUT("size_t size;\n"); OUT("size_t min_size __attribute__ ((unused)) = %ld;\n", @@ -1848,7 +1848,7 @@ emit_alphabet_check_cycle(arg_t *arg) { OUT("/* The underlying type is %s */\n", ASN_EXPR_TYPE2STR(etype)); - OUT("%s_t *st = sptr;\n", MKID(arg->expr->Identifier)); + OUT("const %s_t *st = sptr;\n", MKID(arg->expr->Identifier)); switch(etype) { case ASN_STRING_UTF8String: From f18d85698e099553546d8373ebb1ea957a4843d9 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 3 Jun 2004 05:06:25 +0000 Subject: [PATCH 0005/1469] output generator info git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@5 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_save.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c index 0e5b0fbc5..8aab8c429 100644 --- a/libasn1compiler/asn1c_save.c +++ b/libasn1compiler/asn1c_save.c @@ -145,6 +145,23 @@ asn1c_save_streams(arg_t *arg) { return -1; } + fprintf(fp_c, + "/*\n" + " * Generated by asn1c-" VERSION " (http://lionet.info/asn1c)\n" + " * From ASN.1 module \"%s\" found in \"%s\"\n" + " */\n\n", + arg->mod->Identifier, + arg->mod->source_file_name + ); + fprintf(fp_h, + "/*\n" + " * Generated by asn1c-" VERSION " (http://lionet.info/asn1c)\n" + " * From ASN.1 module \"%s\" found in \"%s\"\n" + " */\n\n", + arg->mod->Identifier, + arg->mod->source_file_name + ); + header_id = alloca(strlen(expr->Identifier) + 1); if(1) { char *src, *dst; From c2d8e8c15f94ce0521dc7f1cecb4031d74f89ceb Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 3 Jun 2004 05:06:49 +0000 Subject: [PATCH 0006/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@6 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/asn1c.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index afedf6bf0..0dbbac454 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -63,10 +63,10 @@ main(int ac, char **av) { } break; case 'L': - print_arg__flags = APF_LINE_COMMENTS; + print_arg__flags |= APF_LINE_COMMENTS; break; case 'N': - print_arg__flags = APF_NO_SOURCE_COMMENTS; + print_arg__flags |= APF_NO_SOURCE_COMMENTS; break; case 'P': asn1_compiler_flags |= A1C_PRINT_COMPILED; From 827ac18852cd32a2c4f47452b6dae56b1738d75a Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 3 Jun 2004 05:07:41 +0000 Subject: [PATCH 0007/1469] newer versions git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@7 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_l.c | 7 +- libasn1parser/asn1p_y.c | 4751 ++++++++++++++++++++++----------------- libasn1parser/asn1p_y.h | 344 ++- 3 files changed, 2939 insertions(+), 2163 deletions(-) diff --git a/libasn1parser/asn1p_l.c b/libasn1parser/asn1p_l.c index 6a6eb4468..bbddbcc03 100644 --- a/libasn1parser/asn1p_l.c +++ b/libasn1parser/asn1p_l.c @@ -21,6 +21,7 @@ /* Scanner skeleton version: * $Header$ + * $FreeBSD: src/usr.bin/lex/flex.skl,v 1.4 1999/10/27 07:56:44 obrien Exp $ */ #define FLEX_SCANNER @@ -1802,7 +1803,7 @@ static asn1_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */ /* Newline */ /* White-space */ -#line 1806 "lex.yy.c" +#line 1807 "lex.yy.c" /* Macros after this point can all be overridden by user definitions in * section 1. @@ -1956,7 +1957,7 @@ YY_DECL #line 99 "asn1p_l.l" -#line 1960 "lex.yy.c" +#line 1961 "lex.yy.c" if ( yy_init ) { @@ -2898,7 +2899,7 @@ YY_RULE_SETUP #line 483 "asn1p_l.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK -#line 2902 "lex.yy.c" +#line 2903 "lex.yy.c" case YY_END_OF_BUFFER: { diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index 095c9041f..18c744a21 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -1,114 +1,265 @@ +/* A Bison parser, made from asn1p_y.y, by GNU bison 1.75. */ -/* A Bison parser, made from asn1p_y.y - by GNU Bison version 1.28 */ +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. -#define YYBISON 1 /* Identify Bison output. */ + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 +/* If NAME_PREFIX is specified substitute the variables and functions + names. */ #define yyparse asn1p_parse -#define yylex asn1p_lex +#define yylex asn1p_lex #define yyerror asn1p_error -#define yylval asn1p_lval -#define yychar asn1p_char +#define yylval asn1p_lval +#define yychar asn1p_char #define yydebug asn1p_debug #define yynerrs asn1p_nerrs -#define TOK_PPEQ 257 -#define TOK_opaque 258 -#define TOK_bstring 259 -#define TOK_cstring 260 -#define TOK_hstring 261 -#define TOK_identifier 262 -#define TOK_number 263 -#define TOK_number_negative 264 -#define TOK_typereference 265 -#define TOK_objectclassreference 266 -#define TOK_typefieldreference 267 -#define TOK_valuefieldreference 268 -#define TOK_ABSENT 269 -#define TOK_ABSTRACT_SYNTAX 270 -#define TOK_ALL 271 -#define TOK_ANY 272 -#define TOK_APPLICATION 273 -#define TOK_AUTOMATIC 274 -#define TOK_BEGIN 275 -#define TOK_BIT 276 -#define TOK_BMPString 277 -#define TOK_BOOLEAN 278 -#define TOK_BY 279 -#define TOK_CHARACTER 280 -#define TOK_CHOICE 281 -#define TOK_CLASS 282 -#define TOK_COMPONENT 283 -#define TOK_COMPONENTS 284 -#define TOK_CONSTRAINED 285 -#define TOK_CONTAINING 286 -#define TOK_DEFAULT 287 -#define TOK_DEFINITIONS 288 -#define TOK_DEFINED 289 -#define TOK_EMBEDDED 290 -#define TOK_ENCODED 291 -#define TOK_END 292 -#define TOK_ENUMERATED 293 -#define TOK_EXPLICIT 294 -#define TOK_EXPORTS 295 -#define TOK_EXTENSIBILITY 296 -#define TOK_EXTERNAL 297 -#define TOK_FALSE 298 -#define TOK_FROM 299 -#define TOK_GeneralizedTime 300 -#define TOK_GeneralString 301 -#define TOK_GraphicString 302 -#define TOK_IA5String 303 -#define TOK_IDENTIFIER 304 -#define TOK_IMPLICIT 305 -#define TOK_IMPLIED 306 -#define TOK_IMPORTS 307 -#define TOK_INCLUDES 308 -#define TOK_INSTANCE 309 -#define TOK_INTEGER 310 -#define TOK_ISO646String 311 -#define TOK_MAX 312 -#define TOK_MIN 313 -#define TOK_MINUS_INFINITY 314 -#define TOK_NULL 315 -#define TOK_NumericString 316 -#define TOK_OBJECT 317 -#define TOK_ObjectDescriptor 318 -#define TOK_OCTET 319 -#define TOK_OF 320 -#define TOK_OPTIONAL 321 -#define TOK_PATTERN 322 -#define TOK_PDV 323 -#define TOK_PLUS_INFINITY 324 -#define TOK_PRESENT 325 -#define TOK_PrintableString 326 -#define TOK_PRIVATE 327 -#define TOK_REAL 328 -#define TOK_RELATIVE_OID 329 -#define TOK_SEQUENCE 330 -#define TOK_SET 331 -#define TOK_SIZE 332 -#define TOK_STRING 333 -#define TOK_SYNTAX 334 -#define TOK_T61String 335 -#define TOK_TAGS 336 -#define TOK_TeletexString 337 -#define TOK_TRUE 338 -#define TOK_TYPE_IDENTIFIER 339 -#define TOK_UNIQUE 340 -#define TOK_UNIVERSAL 341 -#define TOK_UniversalString 342 -#define TOK_UTCTime 343 -#define TOK_UTF8String 344 -#define TOK_VideotexString 345 -#define TOK_VisibleString 346 -#define TOK_WITH 347 -#define TOK_UNION 348 -#define TOK_INTERSECTION 349 -#define TOK_EXCEPT 350 -#define TOK_TwoDots 351 -#define TOK_ThreeDots 352 -#define TOK_tag 353 + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + TOK_PPEQ = 258, + TOK_opaque = 259, + TOK_bstring = 260, + TOK_cstring = 261, + TOK_hstring = 262, + TOK_identifier = 263, + TOK_number = 264, + TOK_number_negative = 265, + TOK_typereference = 266, + TOK_objectclassreference = 267, + TOK_typefieldreference = 268, + TOK_valuefieldreference = 269, + TOK_ABSENT = 270, + TOK_ABSTRACT_SYNTAX = 271, + TOK_ALL = 272, + TOK_ANY = 273, + TOK_APPLICATION = 274, + TOK_AUTOMATIC = 275, + TOK_BEGIN = 276, + TOK_BIT = 277, + TOK_BMPString = 278, + TOK_BOOLEAN = 279, + TOK_BY = 280, + TOK_CHARACTER = 281, + TOK_CHOICE = 282, + TOK_CLASS = 283, + TOK_COMPONENT = 284, + TOK_COMPONENTS = 285, + TOK_CONSTRAINED = 286, + TOK_CONTAINING = 287, + TOK_DEFAULT = 288, + TOK_DEFINITIONS = 289, + TOK_DEFINED = 290, + TOK_EMBEDDED = 291, + TOK_ENCODED = 292, + TOK_END = 293, + TOK_ENUMERATED = 294, + TOK_EXPLICIT = 295, + TOK_EXPORTS = 296, + TOK_EXTENSIBILITY = 297, + TOK_EXTERNAL = 298, + TOK_FALSE = 299, + TOK_FROM = 300, + TOK_GeneralizedTime = 301, + TOK_GeneralString = 302, + TOK_GraphicString = 303, + TOK_IA5String = 304, + TOK_IDENTIFIER = 305, + TOK_IMPLICIT = 306, + TOK_IMPLIED = 307, + TOK_IMPORTS = 308, + TOK_INCLUDES = 309, + TOK_INSTANCE = 310, + TOK_INTEGER = 311, + TOK_ISO646String = 312, + TOK_MAX = 313, + TOK_MIN = 314, + TOK_MINUS_INFINITY = 315, + TOK_NULL = 316, + TOK_NumericString = 317, + TOK_OBJECT = 318, + TOK_ObjectDescriptor = 319, + TOK_OCTET = 320, + TOK_OF = 321, + TOK_OPTIONAL = 322, + TOK_PATTERN = 323, + TOK_PDV = 324, + TOK_PLUS_INFINITY = 325, + TOK_PRESENT = 326, + TOK_PrintableString = 327, + TOK_PRIVATE = 328, + TOK_REAL = 329, + TOK_RELATIVE_OID = 330, + TOK_SEQUENCE = 331, + TOK_SET = 332, + TOK_SIZE = 333, + TOK_STRING = 334, + TOK_SYNTAX = 335, + TOK_T61String = 336, + TOK_TAGS = 337, + TOK_TeletexString = 338, + TOK_TRUE = 339, + TOK_TYPE_IDENTIFIER = 340, + TOK_UNIQUE = 341, + TOK_UNIVERSAL = 342, + TOK_UniversalString = 343, + TOK_UTCTime = 344, + TOK_UTF8String = 345, + TOK_VideotexString = 346, + TOK_VisibleString = 347, + TOK_WITH = 348, + TOK_UNION = 349, + TOK_INTERSECTION = 350, + TOK_EXCEPT = 351, + TOK_TwoDots = 352, + TOK_ThreeDots = 353, + TOK_tag = 354 + }; +#endif +#define TOK_PPEQ 258 +#define TOK_opaque 259 +#define TOK_bstring 260 +#define TOK_cstring 261 +#define TOK_hstring 262 +#define TOK_identifier 263 +#define TOK_number 264 +#define TOK_number_negative 265 +#define TOK_typereference 266 +#define TOK_objectclassreference 267 +#define TOK_typefieldreference 268 +#define TOK_valuefieldreference 269 +#define TOK_ABSENT 270 +#define TOK_ABSTRACT_SYNTAX 271 +#define TOK_ALL 272 +#define TOK_ANY 273 +#define TOK_APPLICATION 274 +#define TOK_AUTOMATIC 275 +#define TOK_BEGIN 276 +#define TOK_BIT 277 +#define TOK_BMPString 278 +#define TOK_BOOLEAN 279 +#define TOK_BY 280 +#define TOK_CHARACTER 281 +#define TOK_CHOICE 282 +#define TOK_CLASS 283 +#define TOK_COMPONENT 284 +#define TOK_COMPONENTS 285 +#define TOK_CONSTRAINED 286 +#define TOK_CONTAINING 287 +#define TOK_DEFAULT 288 +#define TOK_DEFINITIONS 289 +#define TOK_DEFINED 290 +#define TOK_EMBEDDED 291 +#define TOK_ENCODED 292 +#define TOK_END 293 +#define TOK_ENUMERATED 294 +#define TOK_EXPLICIT 295 +#define TOK_EXPORTS 296 +#define TOK_EXTENSIBILITY 297 +#define TOK_EXTERNAL 298 +#define TOK_FALSE 299 +#define TOK_FROM 300 +#define TOK_GeneralizedTime 301 +#define TOK_GeneralString 302 +#define TOK_GraphicString 303 +#define TOK_IA5String 304 +#define TOK_IDENTIFIER 305 +#define TOK_IMPLICIT 306 +#define TOK_IMPLIED 307 +#define TOK_IMPORTS 308 +#define TOK_INCLUDES 309 +#define TOK_INSTANCE 310 +#define TOK_INTEGER 311 +#define TOK_ISO646String 312 +#define TOK_MAX 313 +#define TOK_MIN 314 +#define TOK_MINUS_INFINITY 315 +#define TOK_NULL 316 +#define TOK_NumericString 317 +#define TOK_OBJECT 318 +#define TOK_ObjectDescriptor 319 +#define TOK_OCTET 320 +#define TOK_OF 321 +#define TOK_OPTIONAL 322 +#define TOK_PATTERN 323 +#define TOK_PDV 324 +#define TOK_PLUS_INFINITY 325 +#define TOK_PRESENT 326 +#define TOK_PrintableString 327 +#define TOK_PRIVATE 328 +#define TOK_REAL 329 +#define TOK_RELATIVE_OID 330 +#define TOK_SEQUENCE 331 +#define TOK_SET 332 +#define TOK_SIZE 333 +#define TOK_STRING 334 +#define TOK_SYNTAX 335 +#define TOK_T61String 336 +#define TOK_TAGS 337 +#define TOK_TeletexString 338 +#define TOK_TRUE 339 +#define TOK_TYPE_IDENTIFIER 340 +#define TOK_UNIQUE 341 +#define TOK_UNIVERSAL 342 +#define TOK_UniversalString 343 +#define TOK_UTCTime 344 +#define TOK_UTF8String 345 +#define TOK_VideotexString 346 +#define TOK_VisibleString 347 +#define TOK_WITH 348 +#define TOK_UNION 349 +#define TOK_INTERSECTION 350 +#define TOK_EXCEPT 351 +#define TOK_TwoDots 352 +#define TOK_ThreeDots 353 +#define TOK_tag 354 + + + + +/* Copy the first part of user declarations. */ #line 1 "asn1p_y.y" @@ -159,6 +310,21 @@ static asn1p_value_t * } while(0) + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +#ifndef YYSTYPE #line 57 "asn1p_y.y" typedef union { asn1p_t *a_grammar; @@ -191,801 +357,1035 @@ typedef union { char *name; struct asn1p_type_tag_s tag; } tv_nametag; -} YYSTYPE; -#include - -#ifndef __cplusplus -#ifndef __STDC__ -#define const +} yystype; +/* Line 193 of /usr/local/share/bison/yacc.c. */ +#line 363 "y.tab.c" +# define YYSTYPE yystype +# define YYSTYPE_IS_TRIVIAL 1 #endif + +#ifndef YYLTYPE +typedef struct yyltype +{ + int first_line; + int first_column; + int last_line; + int last_column; +} yyltype; +# define YYLTYPE yyltype +# define YYLTYPE_IS_TRIVIAL 1 #endif +/* Copy the second part of user declarations. */ + + +/* Line 213 of /usr/local/share/bison/yacc.c. */ +#line 384 "y.tab.c" + +#if ! defined (yyoverflow) || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# if YYSTACK_USE_ALLOCA +# define YYSTACK_ALLOC alloca +# else +# ifndef YYSTACK_USE_ALLOCA +# if defined (alloca) || defined (_ALLOCA_H) +# define YYSTACK_ALLOC alloca +# else +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# else +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +# define YYSTACK_ALLOC malloc +# define YYSTACK_FREE free +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short yyss; + YYSTYPE yyvs; + }; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAX) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + register YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) +#endif -#define YYFINAL 375 -#define YYFLAG -32768 -#define YYNTBASE 113 - -#define YYTRANSLATE(x) ((unsigned)(x) <= 353 ? yytranslate[x] : 211) - -static const char yytranslate[] = { 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 109, 2, 2, 2, 2, 2, 2, 104, - 105, 2, 2, 107, 2, 110, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 108, 106, 111, - 2, 2, 2, 112, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 96, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 102, 94, 103, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 95, 97, 98, - 99, 100, 101 -}; +#if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; +#else + typedef short yysigned_char; +#endif -#if YYDEBUG != 0 -static const short yyprhs[] = { 0, - 0, 2, 4, 7, 16, 17, 19, 23, 26, 28, - 31, 33, 38, 40, 41, 43, 45, 48, 51, 54, - 57, 60, 61, 63, 65, 68, 70, 72, 74, 76, - 78, 80, 84, 87, 89, 92, 97, 99, 103, 105, - 107, 111, 115, 118, 120, 124, 126, 128, 135, 137, - 139, 140, 142, 147, 152, 156, 163, 165, 169, 171, - 175, 179, 181, 185, 187, 189, 191, 195, 201, 202, - 204, 206, 210, 213, 217, 222, 223, 225, 226, 233, - 235, 238, 240, 242, 245, 247, 251, 253, 257, 261, - 263, 265, 267, 272, 274, 278, 280, 284, 288, 290, - 294, 296, 300, 302, 304, 306, 308, 313, 314, 318, - 320, 322, 324, 326, 328, 330, 334, 336, 339, 341, - 343, 345, 347, 350, 353, 355, 357, 360, 363, 365, - 367, 369, 371, 374, 376, 379, 381, 383, 385, 387, - 389, 391, 393, 395, 397, 399, 401, 403, 405, 407, - 412, 417, 422, 427, 432, 434, 439, 440, 442, 444, - 446, 448, 450, 452, 457, 459, 462, 466, 468, 472, - 478, 480, 484, 486, 488, 492, 494, 498, 500, 504, - 506, 510, 515, 517, 519, 521, 524, 527, 531, 533, - 535, 537, 539, 541, 543, 545, 547, 549, 555, 557, - 561, 563, 567, 568, 570, 572, 574, 576, 578, 580, - 584, 589, 591, 595, 598, 602, 604, 608, 609, 611, - 613, 616, 618, 620, 621, 625, 628, 632, 634, 638, - 640, 645, 650, 652, 654, 656, 658, 659, 661, 663, - 666, 669, 671, 673, 675, 677, 679 +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 7 +#define YYLAST 775 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 113 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 99 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 248 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 375 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 354 + +#define YYTRANSLATE(X) \ + ((unsigned)(X) <= YYMAXUTOK ? yytranslate[X] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 109, 2, 2, 2, 2, 2, 2, + 104, 105, 2, 2, 107, 2, 110, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 108, 106, + 111, 2, 2, 2, 112, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 96, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 102, 94, 103, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 95, + 97, 98, 99, 100, 101 }; -static const short yyrhs[] = { 114, - 0, 115, 0, 114, 115, 0, 207, 116, 34, 120, - 3, 21, 123, 38, 0, 0, 117, 0, 102, 118, - 103, 0, 102, 103, 0, 119, 0, 118, 119, 0, - 209, 0, 209, 104, 9, 105, 0, 9, 0, 0, - 121, 0, 122, 0, 121, 122, 0, 40, 82, 0, - 51, 82, 0, 20, 82, 0, 42, 52, 0, 0, - 124, 0, 125, 0, 124, 125, 0, 126, 0, 131, - 0, 137, 0, 161, 0, 134, 0, 169, 0, 53, - 127, 106, 0, 53, 45, 0, 128, 0, 127, 128, - 0, 129, 45, 207, 116, 0, 130, 0, 129, 107, - 130, 0, 207, 0, 209, 0, 41, 132, 106, 0, - 41, 17, 106, 0, 41, 106, 0, 133, 0, 132, - 107, 133, 0, 207, 0, 209, 0, 207, 135, 3, - 102, 136, 103, 0, 156, 0, 166, 0, 0, 177, - 0, 207, 3, 205, 85, 0, 207, 3, 205, 153, - 0, 207, 3, 143, 0, 207, 102, 138, 103, 3, - 153, 0, 139, 0, 138, 107, 139, 0, 207, 0, - 207, 108, 209, 0, 166, 108, 209, 0, 141, 0, - 140, 107, 141, 0, 155, 0, 209, 0, 152, 0, - 142, 107, 152, 0, 28, 102, 145, 103, 147, 0, - 0, 86, 0, 146, 0, 145, 107, 146, 0, 159, - 197, 0, 159, 153, 144, 0, 159, 159, 197, 144, - 0, 0, 148, 0, 0, 93, 80, 102, 149, 150, - 103, 0, 151, 0, 150, 151, 0, 4, 0, 159, - 0, 210, 153, 0, 154, 0, 155, 171, 197, 0, - 100, 0, 100, 109, 164, 0, 100, 109, 204, 0, - 168, 0, 169, 0, 170, 0, 207, 102, 140, 103, - 0, 156, 0, 55, 66, 156, 0, 11, 0, 11, - 110, 207, 0, 11, 110, 209, 0, 208, 0, 208, - 110, 157, 0, 158, 0, 157, 110, 158, 0, 160, - 0, 160, 0, 13, 0, 14, 0, 209, 135, 3, - 162, 0, 0, 102, 163, 165, 0, 5, 0, 7, - 0, 6, 0, 204, 0, 164, 0, 209, 0, 207, - 110, 209, 0, 4, 0, 165, 4, 0, 24, 0, - 61, 0, 74, 0, 167, 0, 65, 79, 0, 63, - 50, 0, 75, 0, 43, 0, 36, 69, 0, 26, - 79, 0, 89, 0, 46, 0, 56, 0, 39, 0, - 22, 79, 0, 166, 0, 167, 201, 0, 23, 0, - 47, 0, 48, 0, 49, 0, 57, 0, 62, 0, - 72, 0, 81, 0, 83, 0, 88, 0, 90, 0, - 91, 0, 92, 0, 64, 0, 27, 102, 142, 103, - 0, 76, 102, 142, 103, 0, 77, 102, 142, 103, - 0, 76, 171, 66, 155, 0, 77, 171, 66, 155, - 0, 18, 0, 18, 35, 25, 209, 0, 0, 175, - 0, 94, 0, 95, 0, 96, 0, 97, 0, 98, - 0, 78, 104, 177, 105, 0, 176, 0, 175, 176, - 0, 104, 177, 105, 0, 178, 0, 178, 107, 100, - 0, 178, 107, 100, 107, 178, 0, 100, 0, 100, - 107, 178, 0, 179, 0, 180, 0, 179, 172, 180, - 0, 181, 0, 180, 173, 181, 0, 182, 0, 181, - 174, 182, 0, 185, 0, 185, 183, 185, 0, 184, - 104, 177, 105, 0, 191, 0, 186, 0, 99, 0, - 99, 111, 0, 111, 99, 0, 111, 99, 111, 0, - 78, 0, 45, 0, 204, 0, 209, 0, 6, 0, - 59, 0, 58, 0, 44, 0, 84, 0, 93, 30, - 102, 187, 103, 0, 188, 0, 187, 107, 188, 0, - 100, 0, 209, 171, 189, 0, 0, 190, 0, 71, - 0, 15, 0, 67, 0, 192, 0, 193, 0, 102, - 207, 103, 0, 192, 102, 194, 103, 0, 195, 0, - 194, 107, 195, 0, 112, 196, 0, 112, 110, 196, - 0, 209, 0, 196, 110, 209, 0, 0, 198, 0, - 67, 0, 33, 199, 0, 185, 0, 166, 0, 0, - 102, 200, 165, 0, 102, 103, 0, 102, 202, 103, - 0, 203, 0, 202, 107, 203, 0, 209, 0, 209, - 104, 204, 105, 0, 209, 104, 164, 105, 0, 204, - 0, 100, 0, 9, 0, 10, 0, 0, 206, 0, - 101, 0, 101, 51, 0, 101, 40, 0, 11, 0, - 12, 0, 12, 0, 8, 0, 209, 0, 209, 206, - 0 +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const unsigned short yyprhs[] = +{ + 0, 0, 3, 5, 7, 10, 19, 20, 22, 26, + 29, 31, 34, 36, 41, 43, 44, 46, 48, 51, + 54, 57, 60, 63, 64, 66, 68, 71, 73, 75, + 77, 79, 81, 83, 87, 90, 92, 95, 100, 102, + 106, 108, 110, 114, 118, 121, 123, 127, 129, 131, + 138, 140, 142, 143, 145, 150, 155, 159, 166, 168, + 172, 174, 178, 182, 184, 188, 190, 192, 194, 198, + 204, 205, 207, 209, 213, 216, 220, 225, 226, 228, + 229, 236, 238, 241, 243, 245, 248, 250, 254, 256, + 260, 264, 266, 268, 270, 275, 277, 281, 283, 287, + 291, 293, 297, 299, 303, 305, 307, 309, 311, 316, + 317, 321, 323, 325, 327, 329, 331, 333, 337, 339, + 342, 344, 346, 348, 350, 353, 356, 358, 360, 363, + 366, 368, 370, 372, 374, 377, 379, 382, 384, 386, + 388, 390, 392, 394, 396, 398, 400, 402, 404, 406, + 408, 410, 415, 420, 425, 430, 435, 437, 442, 443, + 445, 447, 449, 451, 453, 455, 460, 462, 465, 469, + 471, 475, 481, 483, 487, 489, 491, 495, 497, 501, + 503, 507, 509, 513, 518, 520, 522, 524, 527, 530, + 534, 536, 538, 540, 542, 544, 546, 548, 550, 552, + 558, 560, 564, 566, 570, 571, 573, 575, 577, 579, + 581, 583, 587, 592, 594, 598, 601, 605, 607, 611, + 612, 614, 616, 619, 621, 623, 624, 628, 631, 635, + 637, 641, 643, 648, 653, 655, 657, 659, 661, 662, + 664, 666, 669, 672, 674, 676, 678, 680, 682 }; -#endif +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const short yyrhs[] = +{ + 114, 0, -1, 115, -1, 116, -1, 115, 116, -1, + 208, 117, 34, 121, 3, 21, 124, 38, -1, -1, + 118, -1, 102, 119, 103, -1, 102, 103, -1, 120, + -1, 119, 120, -1, 210, -1, 210, 104, 9, 105, + -1, 9, -1, -1, 122, -1, 123, -1, 122, 123, + -1, 40, 82, -1, 51, 82, -1, 20, 82, -1, + 42, 52, -1, -1, 125, -1, 126, -1, 125, 126, + -1, 127, -1, 132, -1, 138, -1, 162, -1, 135, + -1, 170, -1, 53, 128, 106, -1, 53, 45, -1, + 129, -1, 128, 129, -1, 130, 45, 208, 117, -1, + 131, -1, 130, 107, 131, -1, 208, -1, 210, -1, + 41, 133, 106, -1, 41, 17, 106, -1, 41, 106, + -1, 134, -1, 133, 107, 134, -1, 208, -1, 210, + -1, 208, 136, 3, 102, 137, 103, -1, 157, -1, + 167, -1, -1, 178, -1, 208, 3, 206, 85, -1, + 208, 3, 206, 154, -1, 208, 3, 144, -1, 208, + 102, 139, 103, 3, 154, -1, 140, -1, 139, 107, + 140, -1, 208, -1, 208, 108, 210, -1, 167, 108, + 210, -1, 142, -1, 141, 107, 142, -1, 156, -1, + 210, -1, 153, -1, 143, 107, 153, -1, 28, 102, + 146, 103, 148, -1, -1, 86, -1, 147, -1, 146, + 107, 147, -1, 160, 198, -1, 160, 154, 145, -1, + 160, 160, 198, 145, -1, -1, 149, -1, -1, 93, + 80, 102, 150, 151, 103, -1, 152, -1, 151, 152, + -1, 4, -1, 160, -1, 211, 154, -1, 155, -1, + 156, 172, 198, -1, 100, -1, 100, 109, 165, -1, + 100, 109, 205, -1, 169, -1, 170, -1, 171, -1, + 208, 102, 141, 103, -1, 157, -1, 55, 66, 157, + -1, 11, -1, 11, 110, 208, -1, 11, 110, 210, + -1, 209, -1, 209, 110, 158, -1, 159, -1, 158, + 110, 159, -1, 161, -1, 161, -1, 13, -1, 14, + -1, 210, 136, 3, 163, -1, -1, 102, 164, 166, + -1, 5, -1, 7, -1, 6, -1, 205, -1, 165, + -1, 210, -1, 208, 110, 210, -1, 4, -1, 166, + 4, -1, 24, -1, 61, -1, 74, -1, 168, -1, + 65, 79, -1, 63, 50, -1, 75, -1, 43, -1, + 36, 69, -1, 26, 79, -1, 89, -1, 46, -1, + 56, -1, 39, -1, 22, 79, -1, 167, -1, 168, + 202, -1, 23, -1, 47, -1, 48, -1, 49, -1, + 57, -1, 62, -1, 72, -1, 81, -1, 83, -1, + 88, -1, 90, -1, 91, -1, 92, -1, 64, -1, + 27, 102, 143, 103, -1, 76, 102, 143, 103, -1, + 77, 102, 143, 103, -1, 76, 172, 66, 156, -1, + 77, 172, 66, 156, -1, 18, -1, 18, 35, 25, + 210, -1, -1, 176, -1, 94, -1, 95, -1, 96, + -1, 97, -1, 98, -1, 78, 104, 178, 105, -1, + 177, -1, 176, 177, -1, 104, 178, 105, -1, 179, + -1, 179, 107, 100, -1, 179, 107, 100, 107, 179, + -1, 100, -1, 100, 107, 179, -1, 180, -1, 181, + -1, 180, 173, 181, -1, 182, -1, 181, 174, 182, + -1, 183, -1, 182, 175, 183, -1, 186, -1, 186, + 184, 186, -1, 185, 104, 178, 105, -1, 192, -1, + 187, -1, 99, -1, 99, 111, -1, 111, 99, -1, + 111, 99, 111, -1, 78, -1, 45, -1, 205, -1, + 210, -1, 6, -1, 59, -1, 58, -1, 44, -1, + 84, -1, 93, 30, 102, 188, 103, -1, 189, -1, + 188, 107, 189, -1, 100, -1, 210, 172, 190, -1, + -1, 191, -1, 71, -1, 15, -1, 67, -1, 193, + -1, 194, -1, 102, 208, 103, -1, 193, 102, 195, + 103, -1, 196, -1, 195, 107, 196, -1, 112, 197, + -1, 112, 110, 197, -1, 210, -1, 197, 110, 210, + -1, -1, 199, -1, 67, -1, 33, 200, -1, 186, + -1, 167, -1, -1, 102, 201, 166, -1, 102, 103, + -1, 102, 203, 103, -1, 204, -1, 203, 107, 204, + -1, 210, -1, 210, 104, 205, 105, -1, 210, 104, + 165, 105, -1, 205, -1, 100, -1, 9, -1, 10, + -1, -1, 207, -1, 101, -1, 101, 51, -1, 101, + 40, -1, 11, -1, 12, -1, 12, -1, 8, -1, + 210, -1, 210, 207, -1 +}; -#if YYDEBUG != 0 -static const short yyrline[] = { 0, - 297, 303, 309, 325, 350, 352, 355, 359, 364, 371, - 379, 384, 388, 397, 399, 407, 411, 419, 423, 426, - 429, 437, 439, 448, 452, 477, 481, 490, 497, 510, - 521, 534, 541, 546, 552, 558, 567, 573, 579, 586, - 594, 598, 601, 608, 614, 620, 627, 636, 646, 654, - 662, 664, 676, 688, 695, 711, 721, 731, 741, 746, - 753, 763, 769, 775, 779, 791, 797, 803, 813, 815, - 818, 826, 832, 841, 846, 863, 865, 870, 874, 879, - 884, 890, 894, 919, 926, 931, 939, 948, 957, 968, - 972, 978, 986, 1010, 1017, 1031, 1040, 1050, 1060, 1068, - 1089, 1098, 1107, 1108, 1110, 1117, 1129, 1139, 1141, 1146, - 1150, 1154, 1158, 1161, 1166, 1178, 1194, 1205, 1219, 1221, - 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, - 1237, 1239, 1240, 1243, 1250, 1262, 1264, 1268, 1272, 1273, - 1274, 1275, 1276, 1280, 1281, 1282, 1283, 1287, 1288, 1291, - 1298, 1304, 1310, 1318, 1326, 1332, 1348, 1350, 1353, 1353, - 1354, 1354, 1355, 1357, 1370, 1373, 1378, 1384, 1388, 1395, - 1403, 1408, 1417, 1419, 1421, 1426, 1428, 1434, 1436, 1441, - 1448, 1455, 1463, 1466, 1471, 1473, 1474, 1475, 1478, 1482, - 1487, 1491, 1502, 1506, 1511, 1516, 1521, 1528, 1534, 1538, - 1543, 1549, 1561, 1563, 1566, 1570, 1573, 1578, 1582, 1590, - 1605, 1611, 1618, 1631, 1643, 1658, 1662, 1679, 1681, 1684, - 1688, 1694, 1697, 1699, 1699, 1719, 1724, 1729, 1735, 1741, - 1749, 1757, 1765, 1772, 1782, 1787, 1817, 1819, 1822, 1827, - 1831, 1837, 1842, 1848, 1855, 1862, 1867 +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const unsigned short yyrline[] = +{ + 0, 297, 297, 303, 309, 325, 350, 352, 355, 359, + 364, 371, 379, 384, 388, 397, 399, 407, 411, 419, + 423, 426, 429, 437, 439, 448, 452, 477, 481, 490, + 497, 510, 521, 534, 541, 546, 552, 558, 567, 573, + 579, 586, 594, 598, 601, 608, 614, 620, 627, 636, + 646, 654, 662, 664, 676, 688, 695, 711, 721, 731, + 741, 746, 753, 763, 769, 775, 779, 791, 797, 803, + 813, 815, 818, 826, 832, 841, 846, 863, 865, 872, + 870, 879, 884, 890, 894, 919, 926, 931, 939, 948, + 957, 968, 972, 978, 986, 1010, 1017, 1031, 1040, 1050, + 1060, 1068, 1089, 1098, 1107, 1108, 1110, 1117, 1129, 1140, + 1139, 1146, 1150, 1154, 1158, 1161, 1166, 1178, 1194, 1205, + 1219, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, + 1230, 1231, 1237, 1239, 1240, 1243, 1250, 1262, 1264, 1268, + 1272, 1273, 1274, 1275, 1276, 1280, 1281, 1282, 1283, 1287, + 1288, 1291, 1298, 1304, 1310, 1318, 1326, 1332, 1348, 1350, + 1353, 1353, 1354, 1354, 1355, 1357, 1370, 1373, 1378, 1384, + 1388, 1395, 1403, 1408, 1417, 1419, 1421, 1426, 1428, 1434, + 1436, 1441, 1448, 1455, 1463, 1466, 1471, 1473, 1474, 1475, + 1478, 1482, 1487, 1491, 1502, 1506, 1511, 1516, 1521, 1528, + 1534, 1538, 1543, 1549, 1561, 1563, 1566, 1570, 1573, 1578, + 1582, 1590, 1605, 1611, 1618, 1631, 1643, 1658, 1662, 1679, + 1681, 1684, 1688, 1694, 1697, 1699, 1699, 1719, 1724, 1729, + 1735, 1741, 1749, 1757, 1765, 1772, 1782, 1787, 1817, 1819, + 1822, 1827, 1831, 1837, 1842, 1848, 1855, 1862, 1867 }; #endif - -#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) - -static const char * const yytname[] = { "$","error","$undefined.","TOK_PPEQ", -"TOK_opaque","TOK_bstring","TOK_cstring","TOK_hstring","TOK_identifier","TOK_number", -"TOK_number_negative","TOK_typereference","TOK_objectclassreference","TOK_typefieldreference", -"TOK_valuefieldreference","TOK_ABSENT","TOK_ABSTRACT_SYNTAX","TOK_ALL","TOK_ANY", -"TOK_APPLICATION","TOK_AUTOMATIC","TOK_BEGIN","TOK_BIT","TOK_BMPString","TOK_BOOLEAN", -"TOK_BY","TOK_CHARACTER","TOK_CHOICE","TOK_CLASS","TOK_COMPONENT","TOK_COMPONENTS", -"TOK_CONSTRAINED","TOK_CONTAINING","TOK_DEFAULT","TOK_DEFINITIONS","TOK_DEFINED", -"TOK_EMBEDDED","TOK_ENCODED","TOK_END","TOK_ENUMERATED","TOK_EXPLICIT","TOK_EXPORTS", -"TOK_EXTENSIBILITY","TOK_EXTERNAL","TOK_FALSE","TOK_FROM","TOK_GeneralizedTime", -"TOK_GeneralString","TOK_GraphicString","TOK_IA5String","TOK_IDENTIFIER","TOK_IMPLICIT", -"TOK_IMPLIED","TOK_IMPORTS","TOK_INCLUDES","TOK_INSTANCE","TOK_INTEGER","TOK_ISO646String", -"TOK_MAX","TOK_MIN","TOK_MINUS_INFINITY","TOK_NULL","TOK_NumericString","TOK_OBJECT", -"TOK_ObjectDescriptor","TOK_OCTET","TOK_OF","TOK_OPTIONAL","TOK_PATTERN","TOK_PDV", -"TOK_PLUS_INFINITY","TOK_PRESENT","TOK_PrintableString","TOK_PRIVATE","TOK_REAL", -"TOK_RELATIVE_OID","TOK_SEQUENCE","TOK_SET","TOK_SIZE","TOK_STRING","TOK_SYNTAX", -"TOK_T61String","TOK_TAGS","TOK_TeletexString","TOK_TRUE","TOK_TYPE_IDENTIFIER", -"TOK_UNIQUE","TOK_UNIVERSAL","TOK_UniversalString","TOK_UTCTime","TOK_UTF8String", -"TOK_VideotexString","TOK_VisibleString","TOK_WITH","'|'","TOK_UNION","'^'", -"TOK_INTERSECTION","TOK_EXCEPT","TOK_TwoDots","TOK_ThreeDots","TOK_tag","'{'", -"'}'","'('","')'","';'","','","':'","'!'","'.'","'<'","'@'","ParsedGrammar", -"ModuleList","ModuleSpecification","optObjectIdentifier","ObjectIdentifier", -"ObjectIdentifierBody","ObjectIdentifierElement","optModuleSpecificationFlags", -"ModuleSpecificationFlags","ModuleSpecificationFlag","optModuleSpecificationBody", -"ModuleSpecificationBody","ModuleSpecificationElement","ImportsDefinition","ImportsBundleSet", -"ImportsBundle","ImportsList","ImportsElement","ExportsDefinition","ExportsBody", -"ExportsElement","ValueSetDefinition","DefinedTypeRef","optValueSetBody","DataTypeReference", -"ParameterArgumentList","ParameterArgumentName","ActualParameterList","ActualParameter", -"ConstructedDataTypeDefinition","ClassDeclaration","optUnique","ClassFieldList", -"ClassField","optWithSyntax","WithSyntax","@1","WithSyntaxFormat","WithSyntaxFormatToken", -"DataTypeMember","ConstrainedTypeDeclaration","ExtensionAndException","TypeDeclaration", -"ComplexTypeReference","ComplexTypeReferenceAmpList","ComplexTypeReferenceElement", -"ClassFieldIdentifier","ClassFieldName","ValueDefinition","InlineOrDefinedValue", -"@2","DefinedValue","Opaque","BasicTypeId","BasicTypeId_UniverationCompatible", -"BasicType","BasicString","ConstructedType","optConstraints","Union","Intersection", -"Except","Constraints","SingleConstraint","ConstraintElementSet","ConstraintElement", -"ConstraintElementUnion","ConstraintElementIntersection","ConstraintElementException", -"ConstraintSubtypeElement","ConstraintRangeSpec","ConstraintSpec","ConstraintValue", -"WithComponents","WithComponentsList","WithComponentsElement","optPresenceConstraint", -"PresenceConstraint","TableConstraint","SimpleTableConstraint","ComponentRelationConstraint", -"AtNotationList","AtNotationElement","ComponentIdList","optMarker","Marker", -"DefaultValue","@3","UniverationDefinition","UniverationList","UniverationElement", -"SignedNumber","optTag","Tag","TypeRefName","ObjectClassReference","Identifier", -"TaggedIdentifier", NULL +#if YYDEBUG || YYERROR_VERBOSE +/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "TOK_PPEQ", "TOK_opaque", "TOK_bstring", + "TOK_cstring", "TOK_hstring", "TOK_identifier", "TOK_number", + "TOK_number_negative", "TOK_typereference", "TOK_objectclassreference", + "TOK_typefieldreference", "TOK_valuefieldreference", "TOK_ABSENT", + "TOK_ABSTRACT_SYNTAX", "TOK_ALL", "TOK_ANY", "TOK_APPLICATION", + "TOK_AUTOMATIC", "TOK_BEGIN", "TOK_BIT", "TOK_BMPString", "TOK_BOOLEAN", + "TOK_BY", "TOK_CHARACTER", "TOK_CHOICE", "TOK_CLASS", "TOK_COMPONENT", + "TOK_COMPONENTS", "TOK_CONSTRAINED", "TOK_CONTAINING", "TOK_DEFAULT", + "TOK_DEFINITIONS", "TOK_DEFINED", "TOK_EMBEDDED", "TOK_ENCODED", + "TOK_END", "TOK_ENUMERATED", "TOK_EXPLICIT", "TOK_EXPORTS", + "TOK_EXTENSIBILITY", "TOK_EXTERNAL", "TOK_FALSE", "TOK_FROM", + "TOK_GeneralizedTime", "TOK_GeneralString", "TOK_GraphicString", + "TOK_IA5String", "TOK_IDENTIFIER", "TOK_IMPLICIT", "TOK_IMPLIED", + "TOK_IMPORTS", "TOK_INCLUDES", "TOK_INSTANCE", "TOK_INTEGER", + "TOK_ISO646String", "TOK_MAX", "TOK_MIN", "TOK_MINUS_INFINITY", + "TOK_NULL", "TOK_NumericString", "TOK_OBJECT", "TOK_ObjectDescriptor", + "TOK_OCTET", "TOK_OF", "TOK_OPTIONAL", "TOK_PATTERN", "TOK_PDV", + "TOK_PLUS_INFINITY", "TOK_PRESENT", "TOK_PrintableString", + "TOK_PRIVATE", "TOK_REAL", "TOK_RELATIVE_OID", "TOK_SEQUENCE", + "TOK_SET", "TOK_SIZE", "TOK_STRING", "TOK_SYNTAX", "TOK_T61String", + "TOK_TAGS", "TOK_TeletexString", "TOK_TRUE", "TOK_TYPE_IDENTIFIER", + "TOK_UNIQUE", "TOK_UNIVERSAL", "TOK_UniversalString", "TOK_UTCTime", + "TOK_UTF8String", "TOK_VideotexString", "TOK_VisibleString", "TOK_WITH", + "'|'", "TOK_UNION", "'^'", "TOK_INTERSECTION", "TOK_EXCEPT", + "TOK_TwoDots", "TOK_ThreeDots", "TOK_tag", "'{'", "'}'", "'('", "')'", + "';'", "','", "':'", "'!'", "'.'", "'<'", "'@'", "$accept", + "ParsedGrammar", "ModuleList", "ModuleSpecification", + "optObjectIdentifier", "ObjectIdentifier", "ObjectIdentifierBody", + "ObjectIdentifierElement", "optModuleSpecificationFlags", + "ModuleSpecificationFlags", "ModuleSpecificationFlag", + "optModuleSpecificationBody", "ModuleSpecificationBody", + "ModuleSpecificationElement", "ImportsDefinition", "ImportsBundleSet", + "ImportsBundle", "ImportsList", "ImportsElement", "ExportsDefinition", + "ExportsBody", "ExportsElement", "ValueSetDefinition", "DefinedTypeRef", + "optValueSetBody", "DataTypeReference", "ParameterArgumentList", + "ParameterArgumentName", "ActualParameterList", "ActualParameter", + "ConstructedDataTypeDefinition", "ClassDeclaration", "optUnique", + "ClassFieldList", "ClassField", "optWithSyntax", "WithSyntax", "@1", + "WithSyntaxFormat", "WithSyntaxFormatToken", "DataTypeMember", + "ConstrainedTypeDeclaration", "ExtensionAndException", + "TypeDeclaration", "ComplexTypeReference", + "ComplexTypeReferenceAmpList", "ComplexTypeReferenceElement", + "ClassFieldIdentifier", "ClassFieldName", "ValueDefinition", + "InlineOrDefinedValue", "@2", "DefinedValue", "Opaque", "BasicTypeId", + "BasicTypeId_UniverationCompatible", "BasicType", "BasicString", + "ConstructedType", "optConstraints", "Union", "Intersection", "Except", + "Constraints", "SingleConstraint", "ConstraintElementSet", + "ConstraintElement", "ConstraintElementUnion", + "ConstraintElementIntersection", "ConstraintElementException", + "ConstraintSubtypeElement", "ConstraintRangeSpec", "ConstraintSpec", + "ConstraintValue", "WithComponents", "WithComponentsList", + "WithComponentsElement", "optPresenceConstraint", "PresenceConstraint", + "TableConstraint", "SimpleTableConstraint", + "ComponentRelationConstraint", "AtNotationList", "AtNotationElement", + "ComponentIdList", "optMarker", "Marker", "DefaultValue", "@3", + "UniverationDefinition", "UniverationList", "UniverationElement", + "SignedNumber", "optTag", "Tag", "TypeRefName", "ObjectClassReference", + "Identifier", "TaggedIdentifier", 0 }; #endif -static const short yyr1[] = { 0, - 113, 114, 114, 115, 116, 116, 117, 117, 118, 118, - 119, 119, 119, 120, 120, 121, 121, 122, 122, 122, - 122, 123, 123, 124, 124, 125, 125, 125, 125, 125, - 125, 126, 126, 127, 127, 128, 129, 129, 130, 130, - 131, 131, 131, 132, 132, 133, 133, 134, 135, 135, - 136, 136, 137, 137, 137, 137, 138, 138, 139, 139, - 139, 140, 140, 141, 141, 142, 142, 143, 144, 144, - 145, 145, 146, 146, 146, 147, 147, 149, 148, 150, - 150, 151, 151, 152, 152, 153, 154, 154, 154, 155, - 155, 155, 155, 155, 155, 156, 156, 156, 156, 156, - 157, 157, 158, 159, 160, 160, 161, 163, 162, 162, - 162, 162, 162, 162, 164, 164, 165, 165, 166, 166, - 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, - 167, 167, 167, 168, 168, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 170, - 170, 170, 170, 170, 170, 170, 171, 171, 172, 172, - 173, 173, 174, 175, 175, 175, 176, 177, 177, 177, - 177, 177, 178, 179, 179, 180, 180, 181, 181, 182, - 182, 182, 182, 182, 183, 183, 183, 183, 184, 184, - 185, 185, 185, 185, 185, 185, 185, 186, 187, 187, - 188, 188, 189, 189, 190, 190, 190, 191, 191, 192, - 193, 194, 194, 195, 195, 196, 196, 197, 197, 198, - 198, 199, 199, 200, 199, 201, 201, 202, 202, 203, - 203, 203, 203, 203, 204, 204, 205, 205, 206, 206, - 206, 207, 207, 208, 209, 210, 210 +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const unsigned short yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 124, 349, 94, 350, 351, 352, + 353, 354, 123, 125, 40, 41, 59, 44, 58, 33, + 46, 60, 64 }; - -static const short yyr2[] = { 0, - 1, 1, 2, 8, 0, 1, 3, 2, 1, 2, - 1, 4, 1, 0, 1, 1, 2, 2, 2, 2, - 2, 0, 1, 1, 2, 1, 1, 1, 1, 1, - 1, 3, 2, 1, 2, 4, 1, 3, 1, 1, - 3, 3, 2, 1, 3, 1, 1, 6, 1, 1, - 0, 1, 4, 4, 3, 6, 1, 3, 1, 3, - 3, 1, 3, 1, 1, 1, 3, 5, 0, 1, - 1, 3, 2, 3, 4, 0, 1, 0, 6, 1, - 2, 1, 1, 2, 1, 3, 1, 3, 3, 1, - 1, 1, 4, 1, 3, 1, 3, 3, 1, 3, - 1, 3, 1, 1, 1, 1, 4, 0, 3, 1, - 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, - 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, - 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, - 4, 4, 4, 4, 1, 4, 0, 1, 1, 1, - 1, 1, 1, 4, 1, 2, 3, 1, 3, 5, - 1, 3, 1, 1, 3, 1, 3, 1, 3, 1, - 3, 4, 1, 1, 1, 2, 2, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 5, 1, 3, - 1, 3, 0, 1, 1, 1, 1, 1, 1, 3, - 4, 1, 3, 2, 3, 1, 3, 0, 1, 1, - 2, 1, 1, 0, 3, 2, 3, 1, 3, 1, - 4, 4, 1, 1, 1, 1, 0, 1, 1, 2, - 2, 1, 1, 1, 1, 1, 2 +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const unsigned char yyr1[] = +{ + 0, 113, 114, 115, 115, 116, 117, 117, 118, 118, + 119, 119, 120, 120, 120, 121, 121, 122, 122, 123, + 123, 123, 123, 124, 124, 125, 125, 126, 126, 126, + 126, 126, 126, 127, 127, 128, 128, 129, 130, 130, + 131, 131, 132, 132, 132, 133, 133, 134, 134, 135, + 136, 136, 137, 137, 138, 138, 138, 138, 139, 139, + 140, 140, 140, 141, 141, 142, 142, 143, 143, 144, + 145, 145, 146, 146, 147, 147, 147, 148, 148, 150, + 149, 151, 151, 152, 152, 153, 153, 154, 155, 155, + 155, 156, 156, 156, 156, 156, 156, 157, 157, 157, + 157, 157, 158, 158, 159, 160, 161, 161, 162, 164, + 163, 163, 163, 163, 163, 163, 165, 165, 166, 166, + 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, + 167, 167, 168, 168, 168, 169, 169, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 171, 171, 171, 171, 171, 171, 171, 172, 172, + 173, 173, 174, 174, 175, 176, 176, 176, 177, 178, + 178, 178, 178, 178, 179, 180, 180, 181, 181, 182, + 182, 183, 183, 183, 183, 183, 184, 184, 184, 184, + 185, 185, 186, 186, 186, 186, 186, 186, 186, 187, + 188, 188, 189, 189, 190, 190, 191, 191, 191, 192, + 192, 193, 194, 195, 195, 196, 196, 197, 197, 198, + 198, 199, 199, 200, 200, 201, 200, 202, 202, 203, + 203, 204, 204, 204, 204, 204, 205, 205, 206, 206, + 207, 207, 207, 208, 208, 209, 210, 211, 211 }; -static const short yydefact[] = { 0, - 242, 243, 1, 2, 5, 3, 0, 0, 6, 245, - 13, 8, 0, 9, 11, 14, 7, 10, 0, 0, - 0, 0, 0, 0, 15, 16, 0, 20, 18, 21, - 19, 0, 17, 12, 22, 136, 0, 137, 138, 139, - 0, 140, 141, 149, 142, 143, 144, 145, 146, 147, - 148, 0, 23, 24, 26, 27, 30, 28, 29, 31, - 0, 0, 0, 43, 0, 44, 46, 47, 33, 0, - 34, 0, 37, 39, 40, 4, 25, 237, 96, 244, - 0, 119, 0, 0, 132, 126, 130, 131, 120, 0, - 0, 121, 125, 129, 0, 0, 49, 50, 122, 99, - 0, 42, 41, 0, 32, 35, 0, 0, 0, 239, - 55, 0, 238, 0, 133, 128, 127, 124, 123, 0, - 57, 0, 59, 0, 0, 0, 45, 5, 38, 0, - 241, 240, 96, 244, 155, 0, 0, 157, 157, 53, - 54, 157, 94, 134, 122, 90, 91, 92, 0, 97, - 98, 0, 0, 0, 0, 51, 105, 106, 100, 101, - 103, 110, 112, 111, 235, 236, 108, 107, 114, 113, - 0, 115, 36, 0, 71, 218, 104, 0, 0, 0, - 0, 0, 0, 0, 158, 165, 0, 0, 218, 0, - 135, 0, 0, 58, 61, 60, 193, 196, 190, 195, - 194, 189, 197, 0, 171, 0, 0, 52, 168, 173, - 174, 176, 178, 0, 180, 184, 183, 208, 209, 191, - 192, 0, 0, 0, 76, 0, 0, 220, 69, 218, - 73, 219, 0, 87, 0, 66, 85, 246, 0, 95, - 0, 0, 0, 0, 166, 0, 0, 86, 234, 226, - 0, 228, 233, 230, 0, 62, 64, 65, 56, 0, - 0, 0, 48, 0, 159, 160, 0, 161, 162, 0, - 163, 0, 0, 185, 0, 0, 0, 102, 117, 109, - 116, 0, 68, 77, 72, 224, 223, 222, 221, 70, - 74, 69, 156, 0, 150, 0, 247, 84, 0, 151, - 167, 153, 152, 154, 227, 0, 0, 93, 0, 0, - 172, 210, 169, 175, 177, 179, 0, 186, 187, 181, - 0, 0, 212, 118, 0, 0, 75, 88, 89, 67, - 164, 229, 0, 0, 63, 201, 0, 199, 157, 0, - 182, 188, 0, 214, 216, 211, 0, 78, 225, 232, - 231, 198, 0, 203, 170, 215, 0, 213, 0, 200, - 206, 207, 205, 202, 204, 217, 82, 0, 80, 83, - 79, 81, 0, 0, 0 +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const unsigned char yyr2[] = +{ + 0, 2, 1, 1, 2, 8, 0, 1, 3, 2, + 1, 2, 1, 4, 1, 0, 1, 1, 2, 2, + 2, 2, 2, 0, 1, 1, 2, 1, 1, 1, + 1, 1, 1, 3, 2, 1, 2, 4, 1, 3, + 1, 1, 3, 3, 2, 1, 3, 1, 1, 6, + 1, 1, 0, 1, 4, 4, 3, 6, 1, 3, + 1, 3, 3, 1, 3, 1, 1, 1, 3, 5, + 0, 1, 1, 3, 2, 3, 4, 0, 1, 0, + 6, 1, 2, 1, 1, 2, 1, 3, 1, 3, + 3, 1, 1, 1, 4, 1, 3, 1, 3, 3, + 1, 3, 1, 3, 1, 1, 1, 1, 4, 0, + 3, 1, 1, 1, 1, 1, 1, 3, 1, 2, + 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, + 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 4, 4, 4, 4, 4, 1, 4, 0, 1, + 1, 1, 1, 1, 1, 4, 1, 2, 3, 1, + 3, 5, 1, 3, 1, 1, 3, 1, 3, 1, + 3, 1, 3, 4, 1, 1, 1, 2, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, + 1, 3, 1, 3, 0, 1, 1, 1, 1, 1, + 1, 3, 4, 1, 3, 2, 3, 1, 3, 0, + 1, 1, 2, 1, 1, 0, 3, 2, 3, 1, + 3, 1, 4, 4, 1, 1, 1, 1, 0, 1, + 1, 2, 2, 1, 1, 1, 1, 1, 2 }; -static const short yydefgoto[] = { 373, - 3, 4, 8, 9, 13, 14, 24, 25, 26, 52, - 53, 54, 55, 70, 71, 72, 73, 56, 65, 66, - 57, 96, 207, 58, 120, 121, 255, 256, 235, 111, - 291, 174, 175, 283, 284, 359, 368, 369, 236, 141, - 237, 142, 143, 159, 160, 176, 177, 59, 168, 223, - 169, 280, 144, 145, 146, 147, 148, 184, 267, 270, - 272, 185, 186, 208, 209, 210, 211, 212, 213, 276, - 214, 215, 216, 337, 338, 364, 365, 217, 218, 219, - 322, 323, 344, 231, 232, 289, 326, 191, 251, 252, - 220, 112, 113, 149, 100, 221, 239 +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const unsigned char yydefact[] = +{ + 0, 243, 244, 0, 2, 3, 6, 1, 4, 0, + 0, 7, 246, 14, 9, 0, 10, 12, 15, 8, + 11, 0, 0, 0, 0, 0, 0, 16, 17, 0, + 21, 19, 22, 20, 0, 18, 13, 23, 137, 0, + 138, 139, 140, 0, 141, 142, 150, 143, 144, 145, + 146, 147, 148, 149, 0, 24, 25, 27, 28, 31, + 29, 30, 32, 0, 0, 0, 44, 0, 45, 47, + 48, 34, 0, 35, 0, 38, 40, 41, 5, 26, + 238, 97, 245, 0, 120, 0, 0, 133, 127, 131, + 132, 121, 0, 0, 122, 126, 130, 0, 0, 50, + 51, 123, 100, 0, 43, 42, 0, 33, 36, 0, + 0, 0, 240, 56, 0, 239, 0, 134, 129, 128, + 125, 124, 0, 58, 0, 60, 0, 0, 0, 46, + 6, 39, 0, 242, 241, 97, 245, 156, 0, 0, + 158, 158, 54, 55, 158, 95, 135, 123, 91, 92, + 93, 0, 98, 99, 0, 0, 0, 0, 52, 106, + 107, 101, 102, 104, 111, 113, 112, 236, 237, 109, + 108, 115, 114, 0, 116, 37, 0, 72, 219, 105, + 0, 0, 0, 0, 0, 0, 0, 159, 166, 0, + 0, 219, 0, 136, 0, 0, 59, 62, 61, 194, + 197, 191, 196, 195, 190, 198, 0, 172, 0, 0, + 53, 169, 174, 175, 177, 179, 0, 181, 185, 184, + 209, 210, 192, 193, 0, 0, 0, 77, 0, 0, + 221, 70, 219, 74, 220, 0, 88, 0, 67, 86, + 247, 0, 96, 0, 0, 0, 0, 167, 0, 0, + 87, 235, 227, 0, 229, 234, 231, 0, 63, 65, + 66, 57, 0, 0, 0, 49, 0, 160, 161, 0, + 162, 163, 0, 164, 0, 0, 186, 0, 0, 0, + 103, 118, 110, 117, 0, 69, 78, 73, 225, 224, + 223, 222, 71, 75, 70, 157, 0, 151, 0, 248, + 85, 0, 152, 168, 154, 153, 155, 228, 0, 0, + 94, 0, 0, 173, 211, 170, 176, 178, 180, 0, + 187, 188, 182, 0, 0, 213, 119, 0, 0, 76, + 89, 90, 68, 165, 230, 0, 0, 64, 202, 0, + 200, 158, 0, 183, 189, 0, 215, 217, 212, 0, + 79, 226, 233, 232, 199, 0, 204, 171, 216, 0, + 214, 0, 201, 207, 208, 206, 203, 205, 218, 83, + 0, 81, 84, 80, 82 }; -static const short yypact[] = { 81, --32768,-32768, 81,-32768, -45,-32768, 23, 70,-32768,-32768, --32768,-32768, 47,-32768, 31, 190,-32768,-32768, 132, 61, - 69, 108, 86, 176, 190,-32768, 76,-32768,-32768,-32768, --32768, 166,-32768,-32768, 442,-32768, 32,-32768,-32768,-32768, - 121,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768, 168, 442,-32768,-32768,-32768,-32768,-32768,-32768,-32768, - 179, 732, 103,-32768, 52,-32768,-32768,-32768,-32768, 39, --32768, 16,-32768,-32768,-32768,-32768,-32768, -11, 111,-32768, - 150,-32768, 152, 142,-32768,-32768,-32768,-32768,-32768, 184, - 159,-32768,-32768,-32768, 748, 240,-32768,-32768,-32768, 135, - 243,-32768,-32768, 141,-32768,-32768, 81, 141, 145, 60, --32768, 599,-32768, 141,-32768,-32768,-32768,-32768,-32768, -1, --32768, 143, 144, 147, 206, 68,-32768, -45,-32768, 206, --32768,-32768, -42, 148, 221, 161, 198, 40, 53,-32768, --32768, -37,-32768,-32768, 163,-32768,-32768,-32768, 164,-32768, --32768, 264, 748, 261, 261, 155,-32768,-32768, 160,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, - 162,-32768,-32768, 64,-32768, 524,-32768, 246, 21, 212, - 169, 21, 155, 208, 171,-32768, 21, 210, 2, 17, --32768, 383, 674,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 247, 172, 81, 175,-32768, 173, 133, - 140, 185,-32768, 178, 35,-32768,-32768, 182,-32768,-32768, --32768, 206, 281, 261, 193, 206, 301,-32768, 202, 2, --32768,-32768, 261, 181, 66,-32768,-32768, 191, 674,-32768, - 155, 71, 186, 674,-32768, 89, 674,-32768,-32768,-32768, - 90,-32768,-32768, 189, 91,-32768,-32768,-32768,-32768, 192, - 309, 194,-32768, 196,-32768,-32768, 309,-32768,-32768, 309, --32768, 309, 155, 187, 205, 78, 200,-32768,-32768, 297, --32768, 225,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768, 202,-32768, 250,-32768, 21,-32768,-32768, 201,-32768, --32768,-32768,-32768,-32768,-32768, 56, 250,-32768, 383, 25, --32768,-32768, 209, 140, 185,-32768, 215,-32768, 211,-32768, - 6, 101,-32768,-32768, 219, 281,-32768,-32768,-32768,-32768, --32768,-32768, 223, 224,-32768,-32768, 109,-32768, -37, 309, --32768,-32768, 261, 203,-32768,-32768, 200,-32768, 297,-32768, --32768,-32768, 25, 24,-32768, 203, 261,-32768, 126,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768, 9,-32768,-32768, --32768,-32768, 324, 326,-32768 +/* YYDEFGOTO[NTERM-NUM]. */ +static const short yydefgoto[] = +{ + -1, 3, 4, 5, 10, 11, 15, 16, 26, 27, + 28, 54, 55, 56, 57, 72, 73, 74, 75, 58, + 67, 68, 59, 98, 209, 60, 122, 123, 257, 258, + 237, 113, 293, 176, 177, 285, 286, 361, 370, 371, + 238, 143, 239, 144, 145, 161, 162, 178, 179, 61, + 170, 225, 171, 282, 146, 147, 148, 149, 150, 186, + 269, 272, 274, 187, 188, 210, 211, 212, 213, 214, + 215, 278, 216, 217, 218, 339, 340, 366, 367, 219, + 220, 221, 324, 325, 346, 233, 234, 291, 328, 193, + 253, 254, 222, 114, 115, 151, 102, 223, 241 }; -static const short yypgoto[] = {-32768, --32768, 327, 204,-32768,-32768, 318,-32768,-32768, 308,-32768, --32768, 282,-32768,-32768, 268,-32768, 226,-32768,-32768, 235, --32768, 279,-32768,-32768,-32768, 195,-32768, 33, -129,-32768, - 51,-32768, 123,-32768,-32768,-32768,-32768, -17, 59, -156, --32768, -185, -52,-32768, 130, -173, -109,-32768,-32768,-32768, - -209, 30, -50, -43,-32768, 46,-32768, -137,-32768,-32768, --32768,-32768, 180, -159, -246,-32768, 94, 88, 97,-32768, --32768, -206,-32768,-32768, 10,-32768,-32768,-32768,-32768,-32768, --32768, 26, 27, -141,-32768,-32768,-32768,-32768,-32768, 65, - -118,-32768, 134, 1,-32768, -7,-32768 +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -206 +static const short yypact[] = +{ + 227, -206, -206, 27, 227, -206, -38, -206, -206, 13, + 52, -206, -206, -206, -206, 47, -206, -12, 42, -206, + -206, 106, 51, 76, 111, 83, 146, 42, -206, 63, + -206, -206, -206, -206, 152, -206, -206, 380, -206, 12, + -206, -206, -206, 91, -206, -206, -206, -206, -206, -206, + -206, -206, -206, -206, 160, 380, -206, -206, -206, -206, + -206, -206, -206, 131, 670, 107, -206, 147, -206, -206, + -206, -206, 24, -206, -19, -206, -206, -206, -206, -206, + -3, 114, -206, 150, -206, 155, 174, -206, -206, -206, + -206, -206, 201, 184, -206, -206, -206, 686, 258, -206, + -206, -206, 156, 265, -206, -206, 191, -206, -206, 227, + 191, 168, 101, -206, 537, -206, 191, -206, -206, -206, + -206, -206, 75, -206, 164, 166, 183, 242, 33, -206, + -38, -206, 242, -206, -206, 44, 186, 249, 189, 220, + -8, 36, -206, -206, -13, -206, -206, 190, -206, -206, + -206, 192, -206, -206, 290, 686, 293, 293, 238, -206, + -206, 188, -206, -206, -206, -206, -206, -206, -206, -206, + -206, -206, -206, 194, -206, -206, 90, -206, 462, -206, + 280, 23, 246, 202, 23, 238, 243, 208, -206, 23, + 244, 20, 59, -206, 321, 612, -206, -206, -206, -206, + -206, -206, -206, -206, -206, -206, 283, 210, 227, 212, + -206, 211, 165, 182, 221, -206, 217, -40, -206, -206, + 222, -206, -206, -206, 242, 319, 293, 234, 242, 206, + -206, 248, 20, -206, -206, 293, 219, 97, -206, -206, + 229, 612, -206, 238, 115, 230, 612, -206, 118, 612, + -206, -206, -206, 120, -206, -206, 233, 128, -206, -206, + -206, -206, 239, 67, 250, -206, 252, -206, -206, 67, + -206, -206, 67, -206, 67, 238, 231, 255, 267, 237, + -206, -206, 351, -206, 276, -206, -206, -206, -206, -206, + -206, -206, -206, -206, 248, -206, 199, -206, 23, -206, + -206, 253, -206, -206, -206, -206, -206, -206, 71, 199, + -206, 321, 29, -206, -206, 254, 182, 221, -206, 257, + -206, 260, -206, -6, 133, -206, -206, 261, 319, -206, + -206, -206, -206, -206, -206, 268, 269, -206, -206, 134, + -206, -13, 67, -206, -206, 293, 256, -206, -206, 237, + -206, 351, -206, -206, -206, 29, 18, -206, 256, 293, + -206, 177, -206, -206, -206, -206, -206, -206, -206, -206, + 3, -206, -206, -206, -206 }; - -#define YYLAST 837 - - -static const short yytable[] = { 15, - 5, 188, 230, 5, 189, 15, 257, 170, 97, 97, - 98, 98, 367, 10, 311, 161, 109, 99, 99, 229, - 288, 157, 158, 243, 10, 165, 166, 62, 10, 68, - 10, 11, 10, 75, 227, 61, 259, 67, 361, 10, - 181, 74, 1, 2, 122, 62, 10, 248, 63, 1, - 2, 99, 242, 61, 10, 11, 7, 246, 302, -242, - 107, 304, 75, 10, 165, 166, 183, 114, 228, 320, - 74, 253, 162, 163, 164, 10, 165, 166, 1, 2, - 60, 299, 298, 197, 328, 10, 165, 166, 292, 110, - 362, 1, 2, 355, 363, 123, 68, 333, 60, 131, - 75, 152, 122, 16, 67, 153, 151, 128, 74, 99, - 132, 371, 161, 317, 150, 343, 249, 181, 172, 250, - 234, 198, 108, 257, 336, 12, 171, 240, 10, 367, - 181, 1, 2, 274, 19, 200, 201, 64, 157, 158, - 27, 182, 28, 183, 105, 275, 195, 196, 10, 17, - 29, 1, 2, 123, 187, 249, 183, 103, 104, 30, - 197, 203, 10, 165, 166, 69, 225, 31, 295, 167, - 226, 238, 296, 300, 238, 329, 287, 296, 32, 238, - 34, 78, 254, 99, 258, 370, 35, 253, 334, 79, - 80, 303, 305, 308, 370, 296, 306, 309, 198, 199, - 81, 354, 82, 346, 83, 76, 262, 347, 102, 20, - 117, 352, 200, 201, 84, 353, 281, 85, 157, 158, - 114, 86, 79, 80, 87, 293, 265, 266, 115, 21, - 116, 22, 202, 118, 88, 268, 269, 119, 203, 89, - 23, 90, 124, 91, 125, 126, 130, 204, 156, -243, - 154, 155, 92, 93, 205, 178, 206, 10, 165, 166, - 1, 2, 179, 180, 190, 192, 193, 94, 10, 222, - 233, 224, 241, 244, 183, 247, 260, 263, 261, 264, - 95, 273, 271, 277, 279, 282, 172, 290, 238, 294, - 301, 110, 307, 310, 171, 313, 312, 318, 254, 172, - 324, 258, 339, 319, 325, 331, 197, 171, 10, 165, - 166, 321, 357, 345, 197, 340, 10, 165, 166, 341, - 348, 342, 81, 374, 82, 375, 83, 350, 351, 6, - 18, 173, 33, 129, 77, 345, 84, 106, 127, 85, - 101, 335, 327, 86, 198, 339, 87, 194, 285, 366, - 372, 278, 198, 199, 330, 349, 88, 315, 200, 201, - 314, 89, 360, 90, 245, 91, 200, 201, 316, 356, - 332, 297, 358, 0, 92, 93, 0, 0, 0, 0, - 0, 0, 0, 0, 203, 0, 202, 0, 0, 94, - 10, 0, 203, 133, 134, 0, 0, 0, 0, 0, - 135, 204, 286, 0, 81, 36, 82, 0, 83, 136, - 206, 0, 0, 0, 0, 0, 0, 0, 84, 0, - 0, 85, 0, 0, 0, 86, 0, 0, 87, 38, - 39, 40, 0, 0, 0, 0, 0, 137, 88, 42, - 0, 0, 0, 89, 43, 90, 44, 91, 0, 10, - 0, 0, 1, 2, 45, 0, 92, 93, 138, 139, - 0, 0, 0, 46, 36, 47, 0, 0, 0, 0, - 48, 94, 49, 50, 51, 0, 0, 0, 0, 0, - 0, 0, 37, 0, 0, 0, 0, 0, 38, 39, - 40, 0, 0, 0, 41, 0, 0, 0, 42, 0, - 0, 0, 0, 43, 0, 44, 0, 0, 0, 0, - 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, - 0, 0, 46, 0, 47, 0, 0, 0, 0, 48, - 0, 49, 50, 51, 133, 134, 157, 158, 0, 0, - 0, 135, 0, 0, 0, 81, 36, 82, 0, 83, - 136, 0, 0, 0, 0, 0, 227, 0, 0, 84, - 0, 0, 85, 0, 0, 0, 86, 0, 0, 87, - 38, 39, 40, 0, 0, 0, 0, 0, 137, 88, - 42, 0, 0, 0, 89, 43, 90, 44, 91, 0, - 228, 0, 0, 0, 0, 45, 0, 92, 93, 138, - 139, 0, 0, 0, 46, 0, 47, 0, 0, 133, - 134, 48, 94, 49, 50, 51, 135, 0, 0, 0, - 81, 36, 82, 0, 83, 136, 0, 0, 0, 0, - 0, 0, 0, 0, 84, 0, 0, 85, 0, 0, - 0, 86, 0, 0, 87, 38, 39, 40, 0, 0, - 0, 0, 0, 137, 88, 42, 0, 0, 0, 89, - 43, 90, 44, 91, 0, 0, 0, 0, 0, 0, - 45, 0, 92, 93, 138, 139, 0, 0, 0, 46, - 0, 47, 0, 140, 133, 134, 48, 94, 49, 50, - 51, 135, 0, 0, 0, 81, 36, 82, 0, 83, - 136, 0, 0, 0, 0, 0, 0, 0, 0, 84, - 0, 0, 85, 0, 0, 0, 86, 0, 0, 87, - 38, 39, 40, 0, 0, 0, 0, 0, 137, 88, - 42, 0, 0, 0, 89, 43, 90, 44, 91, 0, - 0, 0, 79, 80, 0, 45, 0, 92, 93, 138, - 139, 0, 0, 81, 46, 82, 47, 83, 1, 2, - 0, 48, 94, 49, 50, 51, 0, 84, 0, 81, - 85, 82, 0, 83, 86, 0, 0, 87, 0, 0, - 0, 0, 0, 84, 0, 0, 85, 88, 0, 0, - 86, 0, 89, 87, 90, 0, 91, 0, 0, 0, - 0, 0, 0, 88, 0, 92, 93, 0, 89, 0, - 90, 0, 91, 0, 0, 0, 0, 0, 0, 0, - 94, 92, 93, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 94 +/* YYPGOTO[NTERM-NUM]. */ +static const short yypgoto[] = +{ + -206, -206, -206, 355, 235, -206, -206, 357, -206, -206, + 348, -206, -206, 324, -206, -206, 308, -206, 271, -206, + -206, 281, -206, 325, -206, -206, -206, 245, -206, 79, + -28, -206, 100, -206, 171, -206, -206, -206, -206, 31, + 108, -117, -206, -189, -54, -206, 181, -175, -115, -206, + -206, -206, -165, 80, -50, -45, -206, 58, -206, -140, + -206, -206, -206, -206, 228, -111, -205, -206, 138, 142, + 143, -206, -206, -178, -206, -206, 61, -206, -206, -206, + -206, -206, -206, 69, 74, -142, -206, -206, -206, -206, + -206, 112, -120, -206, 185, 11, -206, -9, -206 }; -static const short yycheck[] = { 7, - 0, 139, 176, 3, 142, 13, 192, 126, 61, 62, - 61, 62, 4, 8, 261, 125, 28, 61, 62, 176, - 227, 13, 14, 183, 8, 9, 10, 35, 8, 37, - 8, 9, 8, 41, 33, 35, 193, 37, 15, 8, - 78, 41, 11, 12, 95, 53, 8, 189, 17, 11, - 12, 95, 182, 53, 8, 9, 102, 187, 244, 102, - 45, 247, 70, 8, 9, 10, 104, 110, 67, 276, - 70, 190, 5, 6, 7, 8, 9, 10, 11, 12, - 35, 241, 239, 6, 294, 8, 9, 10, 230, 101, - 67, 11, 12, 340, 71, 95, 104, 307, 53, 40, - 108, 103, 153, 34, 104, 107, 114, 107, 108, 153, - 51, 103, 222, 273, 114, 110, 100, 78, 126, 103, - 100, 44, 107, 309, 100, 103, 126, 180, 8, 4, - 78, 11, 12, 99, 104, 58, 59, 106, 13, 14, - 9, 102, 82, 104, 106, 111, 154, 155, 8, 103, - 82, 11, 12, 153, 102, 100, 104, 106, 107, 52, - 6, 84, 8, 9, 10, 45, 103, 82, 103, 102, - 107, 179, 107, 103, 182, 294, 227, 107, 3, 187, - 105, 3, 190, 227, 192, 359, 21, 306, 307, 11, - 12, 103, 103, 103, 368, 107, 107, 107, 44, 45, - 22, 339, 24, 103, 26, 38, 206, 107, 106, 20, - 69, 103, 58, 59, 36, 107, 224, 39, 13, 14, - 110, 43, 11, 12, 46, 233, 94, 95, 79, 40, - 79, 42, 78, 50, 56, 96, 97, 79, 84, 61, - 51, 63, 3, 65, 110, 3, 102, 93, 102, 102, - 108, 108, 74, 75, 100, 35, 102, 8, 9, 10, - 11, 12, 102, 66, 102, 102, 3, 89, 8, 110, - 25, 110, 104, 66, 104, 66, 30, 103, 107, 107, - 102, 104, 98, 102, 4, 93, 294, 86, 296, 109, - 105, 101, 104, 102, 294, 100, 103, 111, 306, 307, - 4, 309, 310, 99, 80, 105, 6, 307, 8, 9, - 10, 112, 110, 321, 6, 107, 8, 9, 10, 105, - 102, 111, 22, 0, 24, 0, 26, 105, 105, 3, - 13, 128, 25, 108, 53, 343, 36, 70, 104, 39, - 62, 309, 292, 43, 44, 353, 46, 153, 226, 357, - 368, 222, 44, 45, 296, 326, 56, 270, 58, 59, - 267, 61, 353, 63, 185, 65, 58, 59, 272, 343, - 306, 238, 347, -1, 74, 75, -1, -1, -1, -1, - -1, -1, -1, -1, 84, -1, 78, -1, -1, 89, - 8, -1, 84, 11, 12, -1, -1, -1, -1, -1, - 18, 93, 102, -1, 22, 23, 24, -1, 26, 27, - 102, -1, -1, -1, -1, -1, -1, -1, 36, -1, - -1, 39, -1, -1, -1, 43, -1, -1, 46, 47, - 48, 49, -1, -1, -1, -1, -1, 55, 56, 57, - -1, -1, -1, 61, 62, 63, 64, 65, -1, 8, - -1, -1, 11, 12, 72, -1, 74, 75, 76, 77, - -1, -1, -1, 81, 23, 83, -1, -1, -1, -1, - 88, 89, 90, 91, 92, -1, -1, -1, -1, -1, - -1, -1, 41, -1, -1, -1, -1, -1, 47, 48, - 49, -1, -1, -1, 53, -1, -1, -1, 57, -1, - -1, -1, -1, 62, -1, 64, -1, -1, -1, -1, - -1, -1, -1, 72, -1, -1, -1, -1, -1, -1, - -1, -1, 81, -1, 83, -1, -1, -1, -1, 88, - -1, 90, 91, 92, 11, 12, 13, 14, -1, -1, - -1, 18, -1, -1, -1, 22, 23, 24, -1, 26, - 27, -1, -1, -1, -1, -1, 33, -1, -1, 36, - -1, -1, 39, -1, -1, -1, 43, -1, -1, 46, - 47, 48, 49, -1, -1, -1, -1, -1, 55, 56, - 57, -1, -1, -1, 61, 62, 63, 64, 65, -1, - 67, -1, -1, -1, -1, 72, -1, 74, 75, 76, - 77, -1, -1, -1, 81, -1, 83, -1, -1, 11, - 12, 88, 89, 90, 91, 92, 18, -1, -1, -1, - 22, 23, 24, -1, 26, 27, -1, -1, -1, -1, - -1, -1, -1, -1, 36, -1, -1, 39, -1, -1, - -1, 43, -1, -1, 46, 47, 48, 49, -1, -1, - -1, -1, -1, 55, 56, 57, -1, -1, -1, 61, - 62, 63, 64, 65, -1, -1, -1, -1, -1, -1, - 72, -1, 74, 75, 76, 77, -1, -1, -1, 81, - -1, 83, -1, 85, 11, 12, 88, 89, 90, 91, - 92, 18, -1, -1, -1, 22, 23, 24, -1, 26, - 27, -1, -1, -1, -1, -1, -1, -1, -1, 36, - -1, -1, 39, -1, -1, -1, 43, -1, -1, 46, - 47, 48, 49, -1, -1, -1, -1, -1, 55, 56, - 57, -1, -1, -1, 61, 62, 63, 64, 65, -1, - -1, -1, 11, 12, -1, 72, -1, 74, 75, 76, - 77, -1, -1, 22, 81, 24, 83, 26, 11, 12, - -1, 88, 89, 90, 91, 92, -1, 36, -1, 22, - 39, 24, -1, 26, 43, -1, -1, 46, -1, -1, - -1, -1, -1, 36, -1, -1, 39, 56, -1, -1, - 43, -1, 61, 46, 63, -1, 65, -1, -1, -1, - -1, -1, -1, 56, -1, 74, 75, -1, 61, -1, - 63, -1, 65, -1, -1, -1, -1, -1, -1, -1, - 89, 74, 75, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 89 +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, parse error. */ +#define YYTABLE_NINF -245 +static const short yytable[] = +{ + 17, 190, 12, 232, 191, 259, 17, 369, 172, 99, + 99, 6, 163, 100, 100, 6, 159, 160, 101, 101, + 12, 12, 13, 1, 2, 111, 109, 7, 64, 65, + 70, 12, 12, 363, 77, 1, 2, 12, 164, 165, + 166, 12, 167, 168, 1, 2, 64, 124, 63, 250, + 69, 290, 101, 229, 76, 12, 13, 304, 313, 276, + 306, 231, 22, 77, 9, 183, 63, 12, 167, 168, + 183, 277, 255, 199, 245, 12, 167, 168, 261, 12, + 167, 168, 23, 76, 24, 364, 18, 230, 110, 365, + 294, 185, 21, 25, 184, 62, 185, 70, 112, 12, + 322, 77, 1, 2, 345, 124, 373, 153, 125, 163, + 101, 200, 201, 62, 183, 29, 14, 69, 66, 174, + 130, 76, 259, 236, 300, 202, 203, 152, 242, 338, + 107, 330, 301, 30, 80, 169, 71, 357, 189, 173, + 185, 133, 81, 82, 335, 204, -243, 197, 198, 34, + 19, 205, 134, 83, 116, 84, 244, 85, 31, 251, + 206, 248, 252, 32, 319, 33, 125, 86, 36, 208, + 87, 251, 240, 37, 88, 240, 331, 89, 154, 289, + 240, 369, 155, 256, 101, 260, 372, 90, 255, 336, + 159, 160, 91, 227, 92, 372, 93, 228, 78, 12, + 297, 356, 1, 2, 298, 94, 95, 12, 167, 168, + 1, 2, 199, 104, 12, 167, 168, 283, 302, 264, + 96, 305, 298, 307, 116, 298, 295, 308, 83, 117, + 84, 310, 85, 97, 118, 311, 348, 354, 1, 2, + 349, 355, 86, 119, 199, 87, 12, 167, 168, 88, + 200, 120, 89, 105, 106, 159, 160, 81, 82, 267, + 268, 126, 90, 121, 202, 203, 127, 91, 128, 92, + 132, 93, 156, 199, 157, 12, 167, 168, 270, 271, + 94, 95, 200, 201, 180, 158, 182, 174, -244, 240, + 205, 181, 192, 195, 194, 96, 202, 203, 224, 256, + 174, 12, 260, 341, 226, 235, 243, 173, 288, 246, + 249, 200, 185, 262, 347, 265, 204, 263, 266, 273, + 173, 275, 205, 281, 279, 202, 203, 284, 296, 12, + 112, 206, 135, 136, 292, 303, 347, 309, 207, 137, + 208, 312, 320, 83, 38, 84, 341, 85, 138, 323, + 368, 205, 315, 314, 321, 326, 327, 86, 333, 8, + 87, 342, 343, 350, 88, 175, 359, 89, 40, 41, + 42, 344, 20, 352, 353, 35, 139, 90, 44, 79, + 108, 131, 91, 45, 92, 46, 93, 129, 12, 103, + 337, 1, 2, 47, 329, 94, 95, 140, 141, 287, + 196, 374, 48, 38, 49, 280, 332, 316, 351, 50, + 96, 51, 52, 53, 317, 247, 362, 318, 360, 358, + 334, 39, 0, 0, 0, 299, 0, 40, 41, 42, + 0, 0, 0, 43, 0, 0, 0, 44, 0, 0, + 0, 0, 45, 0, 46, 0, 0, 0, 0, 0, + 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, + 0, 48, 0, 49, 0, 0, 0, 0, 50, 0, + 51, 52, 53, 135, 136, 159, 160, 0, 0, 0, + 137, 0, 0, 0, 83, 38, 84, 0, 85, 138, + 0, 0, 0, 0, 0, 229, 0, 0, 86, 0, + 0, 87, 0, 0, 0, 88, 0, 0, 89, 40, + 41, 42, 0, 0, 0, 0, 0, 139, 90, 44, + 0, 0, 0, 91, 45, 92, 46, 93, 0, 230, + 0, 0, 0, 0, 47, 0, 94, 95, 140, 141, + 0, 0, 0, 48, 0, 49, 0, 0, 135, 136, + 50, 96, 51, 52, 53, 137, 0, 0, 0, 83, + 38, 84, 0, 85, 138, 0, 0, 0, 0, 0, + 0, 0, 0, 86, 0, 0, 87, 0, 0, 0, + 88, 0, 0, 89, 40, 41, 42, 0, 0, 0, + 0, 0, 139, 90, 44, 0, 0, 0, 91, 45, + 92, 46, 93, 0, 0, 0, 0, 0, 0, 47, + 0, 94, 95, 140, 141, 0, 0, 0, 48, 0, + 49, 0, 142, 135, 136, 50, 96, 51, 52, 53, + 137, 0, 0, 0, 83, 38, 84, 0, 85, 138, + 0, 0, 0, 0, 0, 0, 0, 0, 86, 0, + 0, 87, 0, 0, 0, 88, 0, 0, 89, 40, + 41, 42, 0, 0, 0, 0, 0, 139, 90, 44, + 0, 0, 0, 91, 45, 92, 46, 93, 0, 0, + 0, 81, 82, 0, 47, 0, 94, 95, 140, 141, + 0, 0, 83, 48, 84, 49, 85, 1, 2, 0, + 50, 96, 51, 52, 53, 0, 86, 0, 83, 87, + 84, 0, 85, 88, 0, 0, 89, 0, 0, 0, + 0, 0, 86, 0, 0, 87, 90, 0, 0, 88, + 0, 91, 89, 92, 0, 93, 0, 0, 0, 0, + 0, 0, 90, 0, 94, 95, 0, 91, 0, 92, + 0, 93, 0, 0, 0, 0, 0, 0, 0, 96, + 94, 95, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 96 }; -/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "/usr/share/bison.simple" -/* This file comes from bison-1.28. */ - -/* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ +static const short yycheck[] = +{ + 9, 141, 8, 178, 144, 194, 15, 4, 128, 63, + 64, 0, 127, 63, 64, 4, 13, 14, 63, 64, + 8, 8, 9, 11, 12, 28, 45, 0, 37, 17, + 39, 8, 8, 15, 43, 11, 12, 8, 5, 6, + 7, 8, 9, 10, 11, 12, 55, 97, 37, 191, + 39, 229, 97, 33, 43, 8, 9, 246, 263, 99, + 249, 178, 20, 72, 102, 78, 55, 8, 9, 10, + 78, 111, 192, 6, 185, 8, 9, 10, 195, 8, + 9, 10, 40, 72, 42, 67, 34, 67, 107, 71, + 232, 104, 104, 51, 102, 37, 104, 106, 101, 8, + 278, 110, 11, 12, 110, 155, 103, 116, 97, 224, + 155, 44, 45, 55, 78, 9, 103, 106, 106, 128, + 109, 110, 311, 100, 241, 58, 59, 116, 182, 100, + 106, 296, 243, 82, 3, 102, 45, 342, 102, 128, + 104, 40, 11, 12, 309, 78, 102, 156, 157, 3, + 103, 84, 51, 22, 110, 24, 184, 26, 82, 100, + 93, 189, 103, 52, 275, 82, 155, 36, 105, 102, + 39, 100, 181, 21, 43, 184, 296, 46, 103, 229, + 189, 4, 107, 192, 229, 194, 361, 56, 308, 309, + 13, 14, 61, 103, 63, 370, 65, 107, 38, 8, + 103, 341, 11, 12, 107, 74, 75, 8, 9, 10, + 11, 12, 6, 106, 8, 9, 10, 226, 103, 208, + 89, 103, 107, 103, 110, 107, 235, 107, 22, 79, + 24, 103, 26, 102, 79, 107, 103, 103, 11, 12, + 107, 107, 36, 69, 6, 39, 8, 9, 10, 43, + 44, 50, 46, 106, 107, 13, 14, 11, 12, 94, + 95, 3, 56, 79, 58, 59, 110, 61, 3, 63, + 102, 65, 108, 6, 108, 8, 9, 10, 96, 97, + 74, 75, 44, 45, 35, 102, 66, 296, 102, 298, + 84, 102, 102, 3, 102, 89, 58, 59, 110, 308, + 309, 8, 311, 312, 110, 25, 104, 296, 102, 66, + 66, 44, 104, 30, 323, 103, 78, 107, 107, 98, + 309, 104, 84, 4, 102, 58, 59, 93, 109, 8, + 101, 93, 11, 12, 86, 105, 345, 104, 100, 18, + 102, 102, 111, 22, 23, 24, 355, 26, 27, 112, + 359, 84, 100, 103, 99, 4, 80, 36, 105, 4, + 39, 107, 105, 102, 43, 130, 110, 46, 47, 48, + 49, 111, 15, 105, 105, 27, 55, 56, 57, 55, + 72, 110, 61, 62, 63, 64, 65, 106, 8, 64, + 311, 11, 12, 72, 294, 74, 75, 76, 77, 228, + 155, 370, 81, 23, 83, 224, 298, 269, 328, 88, + 89, 90, 91, 92, 272, 187, 355, 274, 349, 345, + 308, 41, -1, -1, -1, 240, -1, 47, 48, 49, + -1, -1, -1, 53, -1, -1, -1, 57, -1, -1, + -1, -1, 62, -1, 64, -1, -1, -1, -1, -1, + -1, -1, 72, -1, -1, -1, -1, -1, -1, -1, + -1, 81, -1, 83, -1, -1, -1, -1, 88, -1, + 90, 91, 92, 11, 12, 13, 14, -1, -1, -1, + 18, -1, -1, -1, 22, 23, 24, -1, 26, 27, + -1, -1, -1, -1, -1, 33, -1, -1, 36, -1, + -1, 39, -1, -1, -1, 43, -1, -1, 46, 47, + 48, 49, -1, -1, -1, -1, -1, 55, 56, 57, + -1, -1, -1, 61, 62, 63, 64, 65, -1, 67, + -1, -1, -1, -1, 72, -1, 74, 75, 76, 77, + -1, -1, -1, 81, -1, 83, -1, -1, 11, 12, + 88, 89, 90, 91, 92, 18, -1, -1, -1, 22, + 23, 24, -1, 26, 27, -1, -1, -1, -1, -1, + -1, -1, -1, 36, -1, -1, 39, -1, -1, -1, + 43, -1, -1, 46, 47, 48, 49, -1, -1, -1, + -1, -1, 55, 56, 57, -1, -1, -1, 61, 62, + 63, 64, 65, -1, -1, -1, -1, -1, -1, 72, + -1, 74, 75, 76, 77, -1, -1, -1, 81, -1, + 83, -1, 85, 11, 12, 88, 89, 90, 91, 92, + 18, -1, -1, -1, 22, 23, 24, -1, 26, 27, + -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, + -1, 39, -1, -1, -1, 43, -1, -1, 46, 47, + 48, 49, -1, -1, -1, -1, -1, 55, 56, 57, + -1, -1, -1, 61, 62, 63, 64, 65, -1, -1, + -1, 11, 12, -1, 72, -1, 74, 75, 76, 77, + -1, -1, 22, 81, 24, 83, 26, 11, 12, -1, + 88, 89, 90, 91, 92, -1, 36, -1, 22, 39, + 24, -1, 26, 43, -1, -1, 46, -1, -1, -1, + -1, -1, 36, -1, -1, 39, 56, -1, -1, 43, + -1, 61, 46, 63, -1, 65, -1, -1, -1, -1, + -1, -1, 56, -1, 74, 75, -1, 61, -1, 63, + -1, 65, -1, -1, -1, -1, -1, -1, -1, 89, + 74, 75, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 89 +}; -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const unsigned char yystos[] = +{ + 0, 11, 12, 114, 115, 116, 208, 0, 116, 102, + 117, 118, 8, 9, 103, 119, 120, 210, 34, 103, + 120, 104, 20, 40, 42, 51, 121, 122, 123, 9, + 82, 82, 52, 82, 3, 123, 105, 21, 23, 41, + 47, 48, 49, 53, 57, 62, 64, 72, 81, 83, + 88, 90, 91, 92, 124, 125, 126, 127, 132, 135, + 138, 162, 170, 208, 210, 17, 106, 133, 134, 208, + 210, 45, 128, 129, 130, 131, 208, 210, 38, 126, + 3, 11, 12, 22, 24, 26, 36, 39, 43, 46, + 56, 61, 63, 65, 74, 75, 89, 102, 136, 157, + 167, 168, 209, 136, 106, 106, 107, 106, 129, 45, + 107, 28, 101, 144, 206, 207, 110, 79, 79, 69, + 50, 79, 139, 140, 167, 208, 3, 110, 3, 134, + 208, 131, 102, 40, 51, 11, 12, 18, 27, 55, + 76, 77, 85, 154, 156, 157, 167, 168, 169, 170, + 171, 208, 208, 210, 103, 107, 108, 108, 102, 13, + 14, 158, 159, 161, 5, 6, 7, 9, 10, 102, + 163, 165, 205, 208, 210, 117, 146, 147, 160, 161, + 35, 102, 66, 78, 102, 104, 172, 176, 177, 102, + 172, 172, 102, 202, 102, 3, 140, 210, 210, 6, + 44, 45, 58, 59, 78, 84, 93, 100, 102, 137, + 178, 179, 180, 181, 182, 183, 185, 186, 187, 192, + 193, 194, 205, 210, 110, 164, 110, 103, 107, 33, + 67, 154, 160, 198, 199, 25, 100, 143, 153, 155, + 210, 211, 157, 104, 143, 178, 66, 177, 143, 66, + 198, 100, 103, 203, 204, 205, 210, 141, 142, 156, + 210, 154, 30, 107, 208, 103, 107, 94, 95, 173, + 96, 97, 174, 98, 175, 104, 99, 111, 184, 102, + 159, 4, 166, 210, 93, 148, 149, 147, 102, 167, + 186, 200, 86, 145, 198, 210, 109, 103, 107, 207, + 154, 178, 103, 105, 156, 103, 156, 103, 107, 104, + 103, 107, 102, 179, 103, 100, 181, 182, 183, 178, + 111, 99, 186, 112, 195, 196, 4, 80, 201, 145, + 165, 205, 153, 105, 204, 165, 205, 142, 100, 188, + 189, 210, 107, 105, 111, 110, 197, 210, 103, 107, + 102, 166, 105, 105, 103, 107, 172, 179, 197, 110, + 196, 150, 189, 15, 67, 71, 190, 191, 210, 4, + 151, 152, 160, 103, 152 +}; -#ifndef YYSTACK_USE_ALLOCA -#ifdef alloca -#define YYSTACK_USE_ALLOCA -#else /* alloca not defined */ -#ifdef __GNUC__ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) -#define YYSTACK_USE_ALLOCA -#include -#else /* not sparc */ -/* We think this test detects Watcom and Microsoft C. */ -/* This used to test MSDOS, but that is a bad idea - since that symbol is in the user namespace. */ -#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) -#if 0 /* No need for malloc.h, which pollutes the namespace; - instead, just don't use alloca. */ -#include +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ #endif -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) -/* I don't know what this was needed for, but it pollutes the namespace. - So I turned it off. rms, 2 May 1997. */ -/* #include */ - #pragma alloca -#define YYSTACK_USE_ALLOCA -#else /* not MSDOS, or __TURBOC__, or _AIX */ -#if 0 -#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up, - and on HPUX 10. Eventually we can turn this on. */ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#endif /* __hpux */ +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t #endif -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc */ -#endif /* not GNU C */ -#endif /* alloca not defined */ -#endif /* YYSTACK_USE_ALLOCA not defined */ - -#ifdef YYSTACK_USE_ALLOCA -#define YYSTACK_ALLOC alloca -#else -#define YYSTACK_ALLOC malloc +#if ! defined (YYSIZE_T) +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int #endif - -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY -2 #define YYEOF 0 + #define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab +#define YYABORT goto yyabortlab #define YYERROR goto yyerrlab1 -/* Like YYERROR except do call yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ + #define YYFAIL goto yyerrlab + #define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(token, value) \ + +#define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ - { yychar = (token), yylval = (value); \ + { \ + yychar = (Token); \ + yylval = (Value); \ yychar1 = YYTRANSLATE (yychar); \ YYPOPSTACK; \ goto yybackup; \ } \ else \ - { yyerror ("syntax error: cannot back up"); YYERROR; } \ + { \ + yyerror ("syntax error: cannot back up"); \ + YYERROR; \ + } \ while (0) #define YYTERROR 1 #define YYERRCODE 256 -#ifndef YYPURE -#define YYLEX yylex() -#endif +/* YYLLOC_DEFAULT -- Compute the default location (before the actions + are run). */ -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval, &yylloc) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + Current.first_line = Rhs[1].first_line; \ + Current.first_column = Rhs[1].first_column; \ + Current.last_line = Rhs[N].last_line; \ + Current.last_column = Rhs[N].last_column; #endif -#else /* not YYLSP_NEEDED */ -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval) -#endif -#endif /* not YYLSP_NEEDED */ + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#define YYLEX yylex () + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) +# define YYDSYMPRINT(Args) \ +do { \ + if (yydebug) \ + yysymprint Args; \ +} while (0) +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YYDSYMPRINT(Args) +#endif /* !YYDEBUG */ + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 #endif -/* If nonreentrant, generate the variables here */ +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). -#ifndef YYPURE + Do not make this value too large; the results are undefined if + SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ -int yychar; /* the lookahead symbol */ -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ +#if YYMAXDEPTH == 0 +# undef YYMAXDEPTH +#endif -#ifdef YYLSP_NEEDED -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 #endif -int yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ + -#if YYDEBUG != 0 -int yydebug; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ -#endif +#if YYERROR_VERBOSE -/* YYINITDEPTH indicates the initial size of the parser's stacks */ +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif +{ + register const char *yys = yystr; -#ifndef YYINITDEPTH -#define YYINITDEPTH 200 -#endif + while (*yys++ != '\0') + continue; -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ + return yys - yystr - 1; +} +# endif +# endif + +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif +{ + register char *yyd = yydest; + register const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif -#if YYMAXDEPTH == 0 -#undef YYMAXDEPTH -#endif +#endif /* !YYERROR_VERBOSE */ -#ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 -#endif -/* Define __yy_memcpy. Note that the size argument - should be passed with type unsigned int, because that is what the non-GCC - definitions require. With GCC, __builtin_memcpy takes an arg - of type size_t, but it can handle unsigned int. */ - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ + +#if YYDEBUG +/*-----------------------------. +| Print this symbol on YYOUT. | +`-----------------------------*/ + static void -__yy_memcpy (to, from, count) - char *to; - char *from; - unsigned int count; +#if defined (__STDC__) || defined (__cplusplus) +yysymprint (FILE* yyout, int yytype, YYSTYPE yyvalue) +#else +yysymprint (yyout, yytype, yyvalue) + FILE* yyout; + int yytype; + YYSTYPE yyvalue; +#endif { - register char *f = from; - register char *t = to; - register int i = count; + /* Pacify ``unused variable'' warnings. */ + (void) yyvalue; + + if (yytype < YYNTOKENS) + { + YYFPRINTF (yyout, "token %s (", yytname[yytype]); +# ifdef YYPRINT + YYPRINT (yyout, yytoknum[yytype], yyvalue); +# endif + } + else + YYFPRINTF (yyout, "nterm %s (", yytname[yytype]); - while (i-- > 0) - *t++ = *f++; + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyout, ")"); } +#endif /* YYDEBUG. */ -#else /* __cplusplus */ -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + static void -__yy_memcpy (char *to, char *from, unsigned int count) +#if defined (__STDC__) || defined (__cplusplus) +yydestruct (int yytype, YYSTYPE yyvalue) +#else +yydestruct (yytype, yyvalue) + int yytype; + YYSTYPE yyvalue; +#endif { - register char *t = to; - register char *f = from; - register int i = count; + /* Pacify ``unused variable'' warnings. */ + (void) yyvalue; - while (i-- > 0) - *t++ = *f++; + switch (yytype) + { + default: + break; + } } -#endif -#endif -#line 217 "/usr/share/bison.simple" /* The user can define YYPARSE_PARAM as the name of an argument to be passed into yyparse. The argument should have type void *. @@ -994,76 +1394,85 @@ __yy_memcpy (char *to, char *from, unsigned int count) to the proper pointer type. */ #ifdef YYPARSE_PARAM -#ifdef __cplusplus -#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#else /* not __cplusplus */ -#define YYPARSE_PARAM_ARG YYPARSE_PARAM -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#endif /* not __cplusplus */ -#else /* not YYPARSE_PARAM */ -#define YYPARSE_PARAM_ARG -#define YYPARSE_PARAM_DECL -#endif /* not YYPARSE_PARAM */ +# if defined (__STDC__) || defined (__cplusplus) +# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM +# define YYPARSE_PARAM_DECL +# else +# define YYPARSE_PARAM_ARG YYPARSE_PARAM +# define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; +# endif +#else /* !YYPARSE_PARAM */ +# define YYPARSE_PARAM_ARG +# define YYPARSE_PARAM_DECL +#endif /* !YYPARSE_PARAM */ /* Prevent warning if -Wstrict-prototypes. */ #ifdef __GNUC__ -#ifdef YYPARSE_PARAM +# ifdef YYPARSE_PARAM int yyparse (void *); -#else +# else int yyparse (void); +# endif #endif -#endif + + +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of parse errors so far. */ +int yynerrs; + int -yyparse(YYPARSE_PARAM_ARG) +yyparse (YYPARSE_PARAM_ARG) YYPARSE_PARAM_DECL { + register int yystate; register int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Lookahead token as an internal (translated) token number. */ + int yychar1 = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short yyssa[YYINITDEPTH]; + short *yyss = yyssa; register short *yyssp; - register YYSTYPE *yyvsp; - int yyerrstatus; /* number of tokens to shift before error messages enabled */ - int yychar1 = 0; /* lookahead token as an internal (translated) token number */ - short yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + register YYSTYPE *yyvsp; - short *yyss = yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ -#ifdef YYLSP_NEEDED - YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp; -#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) -#else #define YYPOPSTACK (yyvsp--, yyssp--) -#endif - int yystacksize = YYINITDEPTH; - int yyfree_stacks = 0; + YYSIZE_T yystacksize = YYINITDEPTH; -#ifdef YYPURE - int yychar; - YYSTYPE yylval; - int yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE yylloc; -#endif -#endif + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; - YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ int yylen; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Starting parse\n"); -#endif + YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; @@ -1075,110 +1484,96 @@ yyparse(YYPARSE_PARAM_ARG) so that they stay on the same level as the state stack. The wasted elements are never initialized. */ - yyssp = yyss - 1; + yyssp = yyss; yyvsp = yyvs; -#ifdef YYLSP_NEEDED - yylsp = yyls; -#endif -/* Push a new state, which is found in yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -yynewstate: + goto yysetstate; - *++yyssp = yystate; +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + + yysetstate: + *yyssp = yystate; if (yyssp >= yyss + yystacksize - 1) { - /* Give user a chance to reallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *yyls1 = yyls; -#endif - /* Get the current used size of the three stacks, in elements. */ - int size = yyssp - yyss + 1; + YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if yyoverflow is a macro. */ - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yyls1, size * sizeof (*yylsp), - &yystacksize); -#else - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yystacksize); -#endif - - yyss = yyss1; yyvs = yyvs1; -#ifdef YYLSP_NEEDED - yyls = yyls1; -#endif + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow ("parser stack overflow", + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } #else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyoverflowlab; +# else /* Extend the stack our own way. */ if (yystacksize >= YYMAXDEPTH) - { - yyerror("parser stack overflow"); - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 2; - } + goto yyoverflowlab; yystacksize *= 2; if (yystacksize > YYMAXDEPTH) yystacksize = YYMAXDEPTH; -#ifndef YYSTACK_USE_ALLOCA - yyfree_stacks = 1; -#endif - yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); - __yy_memcpy ((char *)yyss, (char *)yyss1, - size * (unsigned int) sizeof (*yyssp)); - yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); - __yy_memcpy ((char *)yyvs, (char *)yyvs1, - size * (unsigned int) sizeof (*yyvsp)); -#ifdef YYLSP_NEEDED - yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); - __yy_memcpy ((char *)yyls, (char *)yyls1, - size * (unsigned int) sizeof (*yylsp)); -#endif + + { + short *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyoverflowlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif #endif /* no yyoverflow */ - yyssp = yyss + size - 1; - yyvsp = yyvs + size - 1; -#ifdef YYLSP_NEEDED - yylsp = yyls + size - 1; -#endif + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Stack size increased to %d\n", yystacksize); -#endif + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); if (yyssp >= yyss + yystacksize - 1) YYABORT; } -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Entering state %d\n", yystate); -#endif + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; - yybackup: + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: /* Do appropriate processing given the current state. */ /* Read a lookahead token if we need one and don't already have one. */ @@ -1187,7 +1582,7 @@ yyparse(YYPARSE_PARAM_ARG) /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; - if (yyn == YYFLAG) + if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ @@ -1197,146 +1592,141 @@ yyparse(YYPARSE_PARAM_ARG) if (yychar == YYEMPTY) { -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Reading a token: "); -#endif + YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } - /* Convert token to internal form (in yychar1) for indexing tables with */ + /* Convert token to internal form (in yychar1) for indexing tables with. */ - if (yychar <= 0) /* This means end of input. */ + if (yychar <= 0) /* This means end of input. */ { yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more */ + yychar = YYEOF; /* Don't call YYLEX any more. */ -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif + YYDPRINTF ((stderr, "Now at end of input.\n")); } else { - yychar1 = YYTRANSLATE(yychar); + yychar1 = YYTRANSLATE (yychar); -#if YYDEBUG != 0 - if (yydebug) - { - fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT - YYPRINT (stderr, yychar, yylval); -#endif - fprintf (stderr, ")\n"); - } -#endif + /* We have to keep this `#if YYDEBUG', since we use variables + which are defined only if `YYDEBUG' is set. */ + YYDPRINTF ((stderr, "Next token is ")); + YYDSYMPRINT ((stderr, yychar1, yylval)); + YYDPRINTF ((stderr, "\n")); } + /* If the proper action on seeing token YYCHAR1 is to reduce or to + detect an error, take that action. */ yyn += yychar1; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yychar1) goto yydefault; - yyn = yytable[yyn]; - - /* yyn is what to do for this token type in this state. - Negative => reduce, -yyn is rule number. - Positive => shift, yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (yyn < 0) + if (yyn <= 0) { - if (yyn == YYFLAG) + if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } - else if (yyn == 0) - goto yyerrlab; if (yyn == YYFINAL) YYACCEPT; /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); -#endif + YYDPRINTF ((stderr, "Shifting token %d (%s), ", + yychar, yytname[yychar1])); /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - /* count tokens shifted since error; after three, turn off error status. */ - if (yyerrstatus) yyerrstatus--; + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; yystate = yyn; goto yynewstate; -/* Do the default action for the current state. */ -yydefault: +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; + goto yyreduce; -/* Do a reduction. yyn is the number of a rule to reduce with. */ + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ yyreduce: + /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; - if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ -#if YYDEBUG != 0 + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + +#if YYDEBUG + /* We have to keep this `#if YYDEBUG', since we use variables which + are defined only if `YYDEBUG' is set. */ if (yydebug) { - int i; + int yyi; - fprintf (stderr, "Reducing via rule %d (line %d), ", - yyn, yyrline[yyn]); + YYFPRINTF (stderr, "Reducing via rule %d (line %d), ", + yyn - 1, yyrline[yyn]); /* Print the symbols being reduced, and their result. */ - for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", yytname[yyrhs[i]]); - fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); + for (yyi = yyprhs[yyn]; yyrhs[yyi] >= 0; yyi++) + YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]); + YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]); } #endif - - - switch (yyn) { - -case 1: + switch (yyn) + { + case 2: #line 298 "asn1p_y.y" -{ + { *(void **)param = yyvsp[0].a_grammar; - ; - break;} -case 2: + } + break; + + case 3: #line 304 "asn1p_y.y" -{ + { yyval.a_grammar = asn1p_new(); checkmem(yyval.a_grammar); TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); - ; - break;} -case 3: + } + break; + + case 4: #line 309 "asn1p_y.y" -{ + { yyval.a_grammar = yyvsp[-1].a_grammar; TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); - ; - break;} -case 4: + } + break; + + case 5: #line 330 "asn1p_y.y" -{ + { if(yyvsp[-1].a_module) { yyval.a_module = yyvsp[-1].a_module; @@ -1349,133 +1739,154 @@ case 4: yyval.a_module->Identifier = yyvsp[-7].tv_str; yyval.a_module->module_oid = yyvsp[-6].a_oid; yyval.a_module->module_flags = yyvsp[-4].a_module_flags; - ; - break;} -case 5: + } + break; + + case 6: #line 351 "asn1p_y.y" -{ yyval.a_oid = 0; ; - break;} -case 6: + { yyval.a_oid = 0; } + break; + + case 7: #line 352 "asn1p_y.y" -{ yyval.a_oid = yyvsp[0].a_oid; ; - break;} -case 7: + { yyval.a_oid = yyvsp[0].a_oid; } + break; + + case 8: #line 356 "asn1p_y.y" -{ + { yyval.a_oid = yyvsp[-1].a_oid; - ; - break;} -case 8: + } + break; + + case 9: #line 359 "asn1p_y.y" -{ + { yyval.a_oid = 0; - ; - break;} -case 9: + } + break; + + case 10: #line 365 "asn1p_y.y" -{ + { yyval.a_oid = asn1p_oid_new(); asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); if(yyvsp[0].a_oid_arc.name) free(yyvsp[0].a_oid_arc.name); - ; - break;} -case 10: + } + break; + + case 11: #line 371 "asn1p_y.y" -{ + { yyval.a_oid = yyvsp[-1].a_oid; asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); if(yyvsp[0].a_oid_arc.name) free(yyvsp[0].a_oid_arc.name); - ; - break;} -case 11: + } + break; + + case 12: #line 380 "asn1p_y.y" -{ /* iso */ + { /* iso */ yyval.a_oid_arc.name = yyvsp[0].tv_str; yyval.a_oid_arc.number = -1; - ; - break;} -case 12: + } + break; + + case 13: #line 384 "asn1p_y.y" -{ /* iso(1) */ + { /* iso(1) */ yyval.a_oid_arc.name = yyvsp[-3].tv_str; yyval.a_oid_arc.number = yyvsp[-1].a_int; - ; - break;} -case 13: + } + break; + + case 14: #line 388 "asn1p_y.y" -{ /* 1 */ + { /* 1 */ yyval.a_oid_arc.name = 0; yyval.a_oid_arc.number = yyvsp[0].a_int; - ; - break;} -case 14: + } + break; + + case 15: #line 398 "asn1p_y.y" -{ yyval.a_module_flags = MSF_NOFLAGS; ; - break;} -case 15: + { yyval.a_module_flags = MSF_NOFLAGS; } + break; + + case 16: #line 399 "asn1p_y.y" -{ + { yyval.a_module_flags = yyvsp[0].a_module_flags; - ; - break;} -case 16: + } + break; + + case 17: #line 408 "asn1p_y.y" -{ + { yyval.a_module_flags = yyvsp[0].a_module_flags; - ; - break;} -case 17: + } + break; + + case 18: #line 411 "asn1p_y.y" -{ + { yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags; - ; - break;} -case 18: + } + break; + + case 19: #line 420 "asn1p_y.y" -{ + { yyval.a_module_flags = MSF_EXPLICIT_TAGS; - ; - break;} -case 19: + } + break; + + case 20: #line 423 "asn1p_y.y" -{ + { yyval.a_module_flags = MSF_IMPLICIT_TAGS; - ; - break;} -case 20: + } + break; + + case 21: #line 426 "asn1p_y.y" -{ + { yyval.a_module_flags = MSF_AUTOMATIC_TAGS; - ; - break;} -case 21: + } + break; + + case 22: #line 429 "asn1p_y.y" -{ + { yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED; - ; - break;} -case 22: + } + break; + + case 23: #line 438 "asn1p_y.y" -{ yyval.a_module = 0; ; - break;} -case 23: + { yyval.a_module = 0; } + break; + + case 24: #line 439 "asn1p_y.y" -{ + { assert(yyvsp[0].a_module); yyval.a_module = yyvsp[0].a_module; - ; - break;} -case 24: -#line 449 "asn1p_y.y" -{ + } + break; + + case 25: +#line 449 "asn1p_y.y" + { yyval.a_module = yyvsp[0].a_module; - ; - break;} -case 25: + } + break; + + case 26: #line 452 "asn1p_y.y" -{ + { yyval.a_module = yyvsp[-1].a_module; #ifdef MY_IMPORT @@ -1494,17 +1905,19 @@ case 25: MY_IMPORT(members, next); #undef MY_IMPORT - ; - break;} -case 26: + } + break; + + case 27: #line 478 "asn1p_y.y" -{ + { yyval.a_module = yyvsp[0].a_module; - ; - break;} -case 27: + } + break; + + case 28: #line 481 "asn1p_y.y" -{ + { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); if(yyvsp[0].a_xports) { @@ -1512,250 +1925,280 @@ case 27: } else { /* "EXPORTS ALL;" ? */ } - ; - break;} -case 28: + } + break; + + case 29: #line 490 "asn1p_y.y" -{ + { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID); assert(yyvsp[0].a_expr->meta_type != AMT_INVALID); TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); - ; - break;} -case 29: + } + break; + + case 30: #line 497 "asn1p_y.y" -{ + { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID); assert(yyvsp[0].a_expr->meta_type != AMT_INVALID); TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); - ; - break;} -case 30: + } + break; + + case 31: #line 510 "asn1p_y.y" -{ + { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID); assert(yyvsp[0].a_expr->meta_type != AMT_INVALID); TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); - ; - break;} -case 31: + } + break; + + case 32: #line 521 "asn1p_y.y" -{ + { return yyerror( "Attempt to redefine a standard basic type, " "use -ftypesXY to switch back " "to older version of ASN.1 standard"); - ; - break;} -case 32: + } + break; + + case 33: #line 535 "asn1p_y.y" -{ + { yyval.a_module = yyvsp[-1].a_module; - ; - break;} -case 33: + } + break; + + case 34: #line 541 "asn1p_y.y" -{ + { return yyerror("Empty IMPORTS list"); - ; - break;} -case 34: + } + break; + + case 35: #line 547 "asn1p_y.y" -{ + { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); - ; - break;} -case 35: + } + break; + + case 36: #line 552 "asn1p_y.y" -{ + { yyval.a_module = yyvsp[-1].a_module; TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); - ; - break;} -case 36: + } + break; + + case 37: #line 559 "asn1p_y.y" -{ + { yyval.a_xports = yyvsp[-3].a_xports; yyval.a_xports->from = yyvsp[-1].tv_str; yyval.a_xports->from_oid = yyvsp[0].a_oid; checkmem(yyval.a_xports); - ; - break;} -case 37: + } + break; + + case 38: #line 568 "asn1p_y.y" -{ + { yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - ; - break;} -case 38: + } + break; + + case 39: #line 573 "asn1p_y.y" -{ + { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - ; - break;} -case 39: + } + break; + + case 40: #line 580 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_REFERENCE; - ; - break;} -case 40: + } + break; + + case 41: #line 586 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_REFERENCE; - ; - break;} -case 41: + } + break; + + case 42: #line 595 "asn1p_y.y" -{ + { yyval.a_xports = yyvsp[-1].a_xports; - ; - break;} -case 42: + } + break; + + case 43: #line 598 "asn1p_y.y" -{ + { yyval.a_xports = 0; - ; - break;} -case 43: + } + break; + + case 44: #line 601 "asn1p_y.y" -{ + { /* Empty EXPORTS clause effectively prohibits export. */ yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); - ; - break;} -case 44: + } + break; + + case 45: #line 609 "asn1p_y.y" -{ + { yyval.a_xports = asn1p_xports_new(); assert(yyval.a_xports); TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - ; - break;} -case 45: + } + break; + + case 46: #line 614 "asn1p_y.y" -{ + { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - ; - break;} -case 46: + } + break; + + case 47: #line 621 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_EXPORTVAR; - ; - break;} -case 47: + } + break; + + case 48: #line 627 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_EXPORTVAR; - ; - break;} -case 48: + } + break; + + case 49: #line 637 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-4].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-5].tv_str; yyval.a_expr->meta_type = AMT_VALUESET; // take care of optValueSetBody - ; - break;} -case 49: + } + break; + + case 50: #line 647 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->reference = yyvsp[0].a_ref; yyval.a_expr->expr_type = A1TC_REFERENCE; yyval.a_expr->meta_type = AMT_TYPEREF; - ; - break;} -case 50: + } + break; + + case 51: #line 654 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = yyvsp[0].a_type; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 51: + } + break; + + case 52: #line 663 "asn1p_y.y" -{ ; - break;} -case 52: + { } + break; + + case 53: #line 664 "asn1p_y.y" -{ - ; - break;} -case 53: + { + } + break; + + case 54: #line 680 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->tag = yyvsp[-1].a_tag; yyval.a_expr->expr_type = A1TC_TYPEID; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 54: + } + break; + + case 55: #line 688 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->tag = yyvsp[-1].a_tag; assert(yyval.a_expr->expr_type); assert(yyval.a_expr->meta_type); - ; - break;} -case 55: + } + break; + + case 56: #line 695 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; assert(yyval.a_expr->expr_type == A1TC_CLASSDEF); assert(yyval.a_expr->meta_type == AMT_OBJECT); - ; - break;} -case 56: + } + break; + + case 57: #line 712 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-5].tv_str; yyval.a_expr->params = yyvsp[-3].a_plist; yyval.a_expr->meta_type = AMT_PARAMTYPE; - ; - break;} -case 57: + } + break; + + case 58: #line 722 "asn1p_y.y" -{ + { int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); checkmem(yyval.a_plist); @@ -1763,150 +2206,168 @@ case 57: checkmem(ret == 0); if(yyvsp[0].a_parg.governor) asn1p_ref_free(yyvsp[0].a_parg.governor); if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument); - ; - break;} -case 58: + } + break; + + case 59: #line 731 "asn1p_y.y" -{ + { int ret; yyval.a_plist = yyvsp[-2].a_plist; ret = asn1p_paramlist_add_param(yyval.a_plist, yyvsp[0].a_parg.governor, yyvsp[0].a_parg.argument); checkmem(ret == 0); if(yyvsp[0].a_parg.governor) asn1p_ref_free(yyvsp[0].a_parg.governor); if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument); - ; - break;} -case 59: + } + break; + + case 60: #line 742 "asn1p_y.y" -{ + { yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; - ; - break;} -case 60: + } + break; + + case 61: #line 746 "asn1p_y.y" -{ + { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); ret = asn1p_ref_add_component(yyval.a_parg.governor, yyvsp[-2].tv_str, 0); checkmem(ret == 0); yyval.a_parg.argument = yyvsp[0].tv_str; - ; - break;} -case 61: + } + break; + + case 62: #line 753 "asn1p_y.y" -{ + { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); ret = asn1p_ref_add_component(yyval.a_parg.governor, ASN_EXPR_TYPE2STR(yyvsp[-2].a_type), 1); checkmem(ret == 0); yyval.a_parg.argument = yyvsp[0].tv_str; - ; - break;} -case 62: + } + break; + + case 63: #line 764 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 63: + } + break; + + case 64: #line 769 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 64: + } + break; + + case 65: #line 776 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; - ; - break;} -case 65: + } + break; + + case 66: #line 779 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_REFERENCE; yyval.a_expr->meta_type = AMT_VALUE; - ; - break;} -case 66: + } + break; + + case 67: #line 792 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 67: + } + break; + + case 68: #line 797 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 68: + } + break; + + case 69: #line 804 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); yyval.a_expr->with_syntax = yyvsp[0].a_wsynt; assert(yyval.a_expr->expr_type == A1TC_CLASSDEF); assert(yyval.a_expr->meta_type == AMT_OBJECT); - ; - break;} -case 69: + } + break; + + case 70: #line 814 "asn1p_y.y" -{ yyval.a_int = 0; ; - break;} -case 70: + { yyval.a_int = 0; } + break; + + case 71: #line 815 "asn1p_y.y" -{ yyval.a_int = 1; ; - break;} -case 71: + { yyval.a_int = 1; } + break; + + case 72: #line 819 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_CLASSDEF; yyval.a_expr->meta_type = AMT_OBJECT; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 72: + } + break; + + case 73: #line 826 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 73: + } + break; + + case 74: #line 833 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[-1].a_refcomp.name; yyval.a_expr->expr_type = A1TC_CLASSFIELD; yyval.a_expr->meta_type = AMT_OBJECTFIELD; yyval.a_expr->marker = yyvsp[0].a_marker; - ; - break;} -case 74: + } + break; + + case 75: #line 841 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-1].a_expr; yyval.a_expr->Identifier = yyvsp[-2].a_refcomp.name; yyval.a_expr->unique = yyvsp[0].a_int; - ; - break;} -case 75: + } + break; + + case 76: #line 846 "asn1p_y.y" -{ + { int ret; yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1920,51 +2381,59 @@ case 75: yyval.a_expr->meta_type = AMT_OBJECTFIELD; yyval.a_expr->marker = yyvsp[-1].a_marker; yyval.a_expr->unique = yyvsp[0].a_int; - ; - break;} -case 76: + } + break; + + case 77: #line 864 "asn1p_y.y" -{ yyval.a_wsynt = 0; ; - break;} -case 77: + { yyval.a_wsynt = 0; } + break; + + case 78: #line 865 "asn1p_y.y" -{ + { yyval.a_wsynt = yyvsp[0].a_wsynt; - ; - break;} -case 78: + } + break; + + case 79: #line 872 "asn1p_y.y" -{ asn1p_lexer_hack_enable_with_syntax(); ; - break;} -case 79: + { asn1p_lexer_hack_enable_with_syntax(); } + break; + + case 80: #line 874 "asn1p_y.y" -{ + { yyval.a_wsynt = yyvsp[-1].a_wsynt; - ; - break;} -case 80: + } + break; + + case 81: #line 880 "asn1p_y.y" -{ + { yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); - ; - break;} -case 81: + } + break; + + case 82: #line 884 "asn1p_y.y" -{ + { yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); - ; - break;} -case 82: + } + break; + + case 83: #line 891 "asn1p_y.y" -{ + { yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); - ; - break;} -case 83: + } + break; + + case 84: #line 894 "asn1p_y.y" -{ + { asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -1972,45 +2441,50 @@ case 83: ret = asn1p_ref_add_component(ref, yyvsp[0].a_refcomp.name, yyvsp[0].a_refcomp.lex_type); checkmem(ret == 0); yyval.a_wchunk = asn1p_wsyntx_chunk_fromref(ref, 0); - ; - break;} -case 84: + } + break; + + case 85: #line 920 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-1].tv_nametag.name; yyval.a_expr->tag = yyvsp[-1].tv_nametag.tag; - ; - break;} -case 85: + } + break; + + case 86: #line 926 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; - ; - break;} -case 86: + } + break; + + case 87: #line 932 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-2].a_expr; yyval.a_expr->constraints = yyvsp[-1].a_constr; yyval.a_expr->marker = yyvsp[0].a_marker; - ; - break;} -case 87: + } + break; + + case 88: #line 940 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); checkmem(yyval.a_expr->Identifier); yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 88: + } + break; + + case 89: #line 948 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); @@ -2018,11 +2492,12 @@ case 88: yyval.a_expr->value = yyvsp[0].a_value; yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 89: + } + break; + + case 90: #line 957 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); @@ -2030,34 +2505,38 @@ case 89: checkmem(yyval.a_expr->Identifier); yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 90: + } + break; + + case 91: #line 969 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; - ; - break;} -case 91: + } + break; + + case 92: #line 972 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = yyvsp[0].a_type; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 92: + } + break; + + case 93: #line 978 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; checkmem(yyval.a_expr); assert(yyval.a_expr->meta_type); - ; - break;} -case 93: + } + break; + + case 94: #line 986 "asn1p_y.y" -{ + { int ret; yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == 0); @@ -2070,42 +2549,46 @@ case 93: free(yyvsp[-3].tv_str); yyval.a_expr->expr_type = A1TC_PARAMETRIZED; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 94: + } + break; + + case 95: #line 1010 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->reference = yyvsp[0].a_ref; yyval.a_expr->expr_type = A1TC_REFERENCE; yyval.a_expr->meta_type = AMT_TYPEREF; - ; - break;} -case 95: + } + break; + + case 96: #line 1017 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->reference = yyvsp[0].a_ref; yyval.a_expr->expr_type = A1TC_INSTANCE; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 96: + } + break; + + case 97: #line 1032 "asn1p_y.y" -{ + { int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_UNKNOWN); checkmem(ret == 0); free(yyvsp[0].tv_str); - ; - break;} -case 97: + } + break; + + case 98: #line 1040 "asn1p_y.y" -{ + { int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); @@ -2114,11 +2597,12 @@ case 97: ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_UNKNOWN); checkmem(ret == 0); free(yyvsp[-2].tv_str); - ; - break;} -case 98: + } + break; + + case 99: #line 1050 "asn1p_y.y" -{ + { int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); @@ -2127,22 +2611,24 @@ case 98: ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_lowercase); checkmem(ret == 0); free(yyvsp[-2].tv_str); - ; - break;} -case 99: + } + break; + + case 100: #line 1060 "asn1p_y.y" -{ + { int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_CAPITALS); free(yyvsp[0].tv_str); checkmem(ret == 0); - ; - break;} -case 100: + } + break; + + case 101: #line 1068 "asn1p_y.y" -{ + { int ret; yyval.a_ref = yyvsp[0].a_ref; ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[-2].tv_str, RLT_CAPITALS); @@ -2160,101 +2646,114 @@ case 100: * (yyval.a_ref->comp_count - 1)); yyval.a_ref->components[0] = tmp_comp; } - ; - break;} -case 101: + } + break; + + case 102: #line 1090 "asn1p_y.y" -{ + { int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].a_refcomp.name, yyvsp[0].a_refcomp.lex_type); free(yyvsp[0].a_refcomp.name); checkmem(ret == 0); - ; - break;} -case 102: + } + break; + + case 103: #line 1098 "asn1p_y.y" -{ + { int ret; yyval.a_ref = yyvsp[-2].a_ref; ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].a_refcomp.name, yyvsp[0].a_refcomp.lex_type); free(yyvsp[0].a_refcomp.name); checkmem(ret == 0); - ; - break;} -case 105: + } + break; + + case 106: #line 1112 "asn1p_y.y" -{ + { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; - ; - break;} -case 106: + } + break; + + case 107: #line 1117 "asn1p_y.y" -{ + { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; - ; - break;} -case 107: + } + break; + + case 108: #line 1130 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->value = yyvsp[0].a_value; - ; - break;} -case 108: + } + break; + + case 109: #line 1140 "asn1p_y.y" -{ asn1p_lexer_hack_push_opaque_state(); ; - break;} -case 109: + { asn1p_lexer_hack_push_opaque_state(); } + break; + + case 110: #line 1141 "asn1p_y.y" -{ + { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); yyval.a_value->type = ATV_UNPARSED; - ; - break;} -case 110: + } + break; + + case 111: #line 1146 "asn1p_y.y" -{ + { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); - ; - break;} -case 111: + } + break; + + case 112: #line 1150 "asn1p_y.y" -{ + { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); - ; - break;} -case 112: + } + break; + + case 113: #line 1154 "asn1p_y.y" -{ + { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); - ; - break;} -case 113: + } + break; + + case 114: #line 1158 "asn1p_y.y" -{ + { yyval.a_value = yyvsp[0].a_value; - ; - break;} -case 114: + } + break; + + case 115: #line 1161 "asn1p_y.y" -{ + { yyval.a_value = yyvsp[0].a_value; - ; - break;} -case 115: + } + break; + + case 116: #line 1167 "asn1p_y.y" -{ + { asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -2264,11 +2763,12 @@ case 115: yyval.a_value = asn1p_value_fromref(ref, 0); checkmem(yyval.a_value); free(yyvsp[0].tv_str); - ; - break;} -case 116: + } + break; + + case 117: #line 1178 "asn1p_y.y" -{ + { asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -2281,11 +2781,12 @@ case 116: checkmem(yyval.a_value); free(yyvsp[-2].tv_str); free(yyvsp[0].tv_str); - ; - break;} -case 117: + } + break; + + case 118: #line 1195 "asn1p_y.y" -{ + { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 2; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); checkmem(yyval.tv_opaque.buf); @@ -2294,11 +2795,12 @@ case 117: memcpy(yyval.tv_opaque.buf + 2, yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len); yyval.tv_opaque.buf[yyval.tv_opaque.len] = '\0'; free(yyvsp[0].tv_opaque.buf); - ; - break;} -case 118: + } + break; + + case 119: #line 1205 "asn1p_y.y" -{ + { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); checkmem(p); @@ -2309,80 +2811,97 @@ case 118: free(yyvsp[0].tv_opaque.buf); yyval.tv_opaque.buf = p; yyval.tv_opaque.len = newsize; - ; - break;} -case 119: + } + break; + + case 120: #line 1220 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_BOOLEAN; ; - break;} -case 120: + { yyval.a_type = ASN_BASIC_BOOLEAN; } + break; + + case 121: #line 1221 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_NULL; ; - break;} -case 121: + { yyval.a_type = ASN_BASIC_NULL; } + break; + + case 122: #line 1222 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_REAL; ; - break;} -case 122: + { yyval.a_type = ASN_BASIC_REAL; } + break; + + case 123: #line 1223 "asn1p_y.y" -{ yyval.a_type = yyvsp[0].a_type; ; - break;} -case 123: + { yyval.a_type = yyvsp[0].a_type; } + break; + + case 124: #line 1224 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_OCTET_STRING; ; - break;} -case 124: + { yyval.a_type = ASN_BASIC_OCTET_STRING; } + break; + + case 125: #line 1225 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; - break;} -case 125: + { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; } + break; + + case 126: #line 1226 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_RELATIVE_OID; ; - break;} -case 126: + { yyval.a_type = ASN_BASIC_RELATIVE_OID; } + break; + + case 127: #line 1227 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_EXTERNAL; ; - break;} -case 127: + { yyval.a_type = ASN_BASIC_EXTERNAL; } + break; + + case 128: #line 1228 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; - break;} -case 128: + { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; } + break; + + case 129: #line 1229 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; - break;} -case 129: + { yyval.a_type = ASN_BASIC_CHARACTER_STRING; } + break; + + case 130: #line 1230 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_UTCTime; ; - break;} -case 130: + { yyval.a_type = ASN_BASIC_UTCTime; } + break; + + case 131: #line 1231 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_GeneralizedTime; ; - break;} -case 131: + { yyval.a_type = ASN_BASIC_GeneralizedTime; } + break; + + case 132: #line 1238 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_INTEGER; ; - break;} -case 132: + { yyval.a_type = ASN_BASIC_INTEGER; } + break; + + case 133: #line 1239 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_ENUMERATED; ; - break;} -case 133: + { yyval.a_type = ASN_BASIC_ENUMERATED; } + break; + + case 134: #line 1240 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_BIT_STRING; ; - break;} -case 134: + { yyval.a_type = ASN_BASIC_BIT_STRING; } + break; + + case 135: #line 1244 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = yyvsp[0].a_type; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 135: + } + break; + + case 136: #line 1250 "asn1p_y.y" -{ + { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; } else { @@ -2391,137 +2910,158 @@ case 135: } yyval.a_expr->expr_type = yyvsp[-1].a_type; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 136: + } + break; + + case 137: #line 1263 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_BMPString; ; - break;} -case 137: + { yyval.a_type = ASN_STRING_BMPString; } + break; + + case 138: #line 1264 "asn1p_y.y" -{ + { yyval.a_type = ASN_STRING_GeneralString; return yyerror("GeneralString is not supported"); - ; - break;} -case 138: + } + break; + + case 139: #line 1268 "asn1p_y.y" -{ + { yyval.a_type = ASN_STRING_GraphicString; return yyerror("GraphicString is not supported"); - ; - break;} -case 139: + } + break; + + case 140: #line 1272 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_IA5String; ; - break;} -case 140: + { yyval.a_type = ASN_STRING_IA5String; } + break; + + case 141: #line 1273 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_ISO646String; ; - break;} -case 141: + { yyval.a_type = ASN_STRING_ISO646String; } + break; + + case 142: #line 1274 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_NumericString; ; - break;} -case 142: + { yyval.a_type = ASN_STRING_NumericString; } + break; + + case 143: #line 1275 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_PrintableString; ; - break;} -case 143: + { yyval.a_type = ASN_STRING_PrintableString; } + break; + + case 144: #line 1276 "asn1p_y.y" -{ + { yyval.a_type = ASN_STRING_T61String; return yyerror("T61String not implemented yet"); - ; - break;} -case 144: + } + break; + + case 145: #line 1280 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_TeletexString; ; - break;} -case 145: + { yyval.a_type = ASN_STRING_TeletexString; } + break; + + case 146: #line 1281 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_UniversalString; ; - break;} -case 146: + { yyval.a_type = ASN_STRING_UniversalString; } + break; + + case 147: #line 1282 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_UTF8String; ; - break;} -case 147: + { yyval.a_type = ASN_STRING_UTF8String; } + break; + + case 148: #line 1283 "asn1p_y.y" -{ + { yyval.a_type = ASN_STRING_VideotexString; return yyerror("VideotexString is no longer supported"); - ; - break;} -case 148: + } + break; + + case 149: #line 1287 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_VisibleString; ; - break;} -case 149: + { yyval.a_type = ASN_STRING_VisibleString; } + break; + + case 150: #line 1288 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_ObjectDescriptor; ; - break;} -case 150: + { yyval.a_type = ASN_STRING_ObjectDescriptor; } + break; + + case 151: #line 1292 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); yyval.a_expr->expr_type = ASN_CONSTR_CHOICE; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 151: + } + break; + + case 152: #line 1298 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 152: + } + break; + + case 153: #line 1304 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); yyval.a_expr->expr_type = ASN_CONSTR_SET; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 153: + } + break; + + case 154: #line 1310 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->constraints = yyvsp[-2].a_constr; yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE_OF; yyval.a_expr->meta_type = AMT_TYPE; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 154: + } + break; + + case 155: #line 1318 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->constraints = yyvsp[-2].a_constr; yyval.a_expr->expr_type = ASN_CONSTR_SET_OF; yyval.a_expr->meta_type = AMT_TYPE; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 155: + } + break; + + case 156: #line 1326 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = ASN_CONSTR_ANY; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 156: + } + break; + + case 157: #line 1332 "asn1p_y.y" -{ + { int ret; yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -2531,19 +3071,22 @@ case 156: checkmem(ret == 0); yyval.a_expr->expr_type = ASN_CONSTR_ANY; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 157: + } + break; + + case 158: #line 1349 "asn1p_y.y" -{ yyval.a_constr = 0; ; - break;} -case 158: + { yyval.a_constr = 0; } + break; + + case 159: #line 1350 "asn1p_y.y" -{ yyval.a_constr = yyvsp[0].a_constr; ; - break;} -case 164: + { yyval.a_constr = yyvsp[0].a_constr; } + break; + + case 165: #line 1358 "asn1p_y.y" -{ + { /* * This is a special case, for compatibility purposes. * It goes without parenthesis. @@ -2554,184 +3097,212 @@ case 164: yyval.a_constr->type = ACT_CT_SIZE; ret = asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr); checkmem(ret == 0); - ; - break;} -case 165: + } + break; + + case 166: #line 1370 "asn1p_y.y" -{ + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); - ; - break;} -case 166: + } + break; + + case 167: #line 1373 "asn1p_y.y" -{ + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-1].a_constr, yyvsp[0].a_constr); - ; - break;} -case 167: + } + break; + + case 168: #line 1379 "asn1p_y.y" -{ + { yyval.a_constr = yyvsp[-1].a_constr; - ; - break;} -case 168: + } + break; + + case 169: #line 1385 "asn1p_y.y" -{ + { yyval.a_constr = yyvsp[0].a_constr; - ; - break;} -case 169: + } + break; + + case 170: #line 1388 "asn1p_y.y" -{ + { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); checkmem(ct); ct->type = ACT_EL_EXT; CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); - ; - break;} -case 170: + } + break; + + case 171: #line 1395 "asn1p_y.y" -{ + { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); checkmem(ct); ct->type = ACT_EL_EXT; CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-4].a_constr, ct); CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-4].a_constr, yyvsp[0].a_constr); - ; - break;} -case 171: + } + break; + + case 172: #line 1403 "asn1p_y.y" -{ + { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_EXT; - ; - break;} -case 172: + } + break; + + case 173: #line 1408 "asn1p_y.y" -{ + { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); checkmem(ct); ct->type = ACT_EL_EXT; CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, ct, yyvsp[0].a_constr); - ; - break;} -case 173: + } + break; + + case 174: #line 1417 "asn1p_y.y" -{ yyval.a_constr = yyvsp[0].a_constr; ; - break;} -case 174: + { yyval.a_constr = yyvsp[0].a_constr; } + break; + + case 175: #line 1420 "asn1p_y.y" -{ yyval.a_constr = yyvsp[0].a_constr; ; - break;} -case 175: + { yyval.a_constr = yyvsp[0].a_constr; } + break; + + case 176: #line 1421 "asn1p_y.y" -{ + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); - ; - break;} -case 176: + } + break; + + case 177: #line 1427 "asn1p_y.y" -{ yyval.a_constr = yyvsp[0].a_constr; ; - break;} -case 177: + { yyval.a_constr = yyvsp[0].a_constr; } + break; + + case 178: #line 1429 "asn1p_y.y" -{ + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); - ; - break;} -case 178: + } + break; + + case 179: #line 1435 "asn1p_y.y" -{ yyval.a_constr = yyvsp[0].a_constr; ; - break;} -case 179: + { yyval.a_constr = yyvsp[0].a_constr; } + break; + + case 180: #line 1436 "asn1p_y.y" -{ + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); - ; - break;} -case 180: + } + break; + + case 181: #line 1442 "asn1p_y.y" -{ + { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_VALUE; yyval.a_constr->value = yyvsp[0].a_value; - ; - break;} -case 181: + } + break; + + case 182: #line 1448 "asn1p_y.y" -{ + { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-1].a_ctype; yyval.a_constr->range_start = yyvsp[-2].a_value; yyval.a_constr->range_stop = yyvsp[0].a_value; - ; - break;} -case 182: + } + break; + + case 183: #line 1455 "asn1p_y.y" -{ + { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-3].a_ctype; ret = asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr); checkmem(ret == 0); - ; - break;} -case 183: + } + break; + + case 184: #line 1463 "asn1p_y.y" -{ + { yyval.a_constr = yyvsp[0].a_constr; - ; - break;} -case 184: + } + break; + + case 185: #line 1466 "asn1p_y.y" -{ + { yyval.a_constr = yyvsp[0].a_constr; - ; - break;} -case 185: + } + break; + + case 186: #line 1472 "asn1p_y.y" -{ yyval.a_ctype = ACT_EL_RANGE; ; - break;} -case 186: + { yyval.a_ctype = ACT_EL_RANGE; } + break; + + case 187: #line 1473 "asn1p_y.y" -{ yyval.a_ctype = ACT_EL_RLRANGE; ; - break;} -case 187: + { yyval.a_ctype = ACT_EL_RLRANGE; } + break; + + case 188: #line 1474 "asn1p_y.y" -{ yyval.a_ctype = ACT_EL_LLRANGE; ; - break;} -case 188: + { yyval.a_ctype = ACT_EL_LLRANGE; } + break; + + case 189: #line 1475 "asn1p_y.y" -{ yyval.a_ctype = ACT_EL_ULRANGE; ; - break;} -case 189: + { yyval.a_ctype = ACT_EL_ULRANGE; } + break; + + case 190: #line 1479 "asn1p_y.y" -{ + { yyval.a_ctype = ACT_CT_SIZE; - ; - break;} -case 190: + } + break; + + case 191: #line 1482 "asn1p_y.y" -{ + { yyval.a_ctype = ACT_CT_FROM; - ; - break;} -case 191: + } + break; + + case 192: #line 1488 "asn1p_y.y" -{ + { yyval.a_value = yyvsp[0].a_value; - ; - break;} -case 192: + } + break; + + case 193: #line 1491 "asn1p_y.y" -{ + { asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -2741,124 +3312,142 @@ case 192: yyval.a_value = asn1p_value_fromref(ref, 0); checkmem(yyval.a_value); free(yyvsp[0].tv_str); - ; - break;} -case 193: + } + break; + + case 194: #line 1502 "asn1p_y.y" -{ + { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); - ; - break;} -case 194: + } + break; + + case 195: #line 1506 "asn1p_y.y" -{ + { yyval.a_value = asn1p_value_fromint(123); checkmem(yyval.a_value); yyval.a_value->type = ATV_MIN; - ; - break;} -case 195: + } + break; + + case 196: #line 1511 "asn1p_y.y" -{ + { yyval.a_value = asn1p_value_fromint(321); checkmem(yyval.a_value); yyval.a_value->type = ATV_MAX; - ; - break;} -case 196: + } + break; + + case 197: #line 1516 "asn1p_y.y" -{ + { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_FALSE; - ; - break;} -case 197: + } + break; + + case 198: #line 1521 "asn1p_y.y" -{ + { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); yyval.a_value->type = ATV_TRUE; - ; - break;} -case 198: + } + break; + + case 199: #line 1529 "asn1p_y.y" -{ + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); - ; - break;} -case 199: + } + break; + + case 200: #line 1535 "asn1p_y.y" -{ + { yyval.a_constr = yyvsp[0].a_constr; - ; - break;} -case 200: + } + break; + + case 201: #line 1538 "asn1p_y.y" -{ + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); - ; - break;} -case 201: + } + break; + + case 202: #line 1544 "asn1p_y.y" -{ + { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_EXT; - ; - break;} -case 202: + } + break; + + case 203: #line 1549 "asn1p_y.y" -{ + { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_VALUE; yyval.a_constr->value = asn1p_value_frombuf(yyvsp[-2].tv_str, strlen(yyvsp[-2].tv_str), 0); yyval.a_constr->presence = yyvsp[0].a_pres; - ; - break;} -case 203: + } + break; + + case 204: #line 1562 "asn1p_y.y" -{ yyval.a_pres = ACPRES_DEFAULT; ; - break;} -case 204: + { yyval.a_pres = ACPRES_DEFAULT; } + break; + + case 205: #line 1563 "asn1p_y.y" -{ yyval.a_pres = yyvsp[0].a_pres; ; - break;} -case 205: + { yyval.a_pres = yyvsp[0].a_pres; } + break; + + case 206: #line 1567 "asn1p_y.y" -{ + { yyval.a_pres = ACPRES_PRESENT; - ; - break;} -case 206: + } + break; + + case 207: #line 1570 "asn1p_y.y" -{ + { yyval.a_pres = ACPRES_ABSENT; - ; - break;} -case 207: + } + break; + + case 208: #line 1573 "asn1p_y.y" -{ + { yyval.a_pres = ACPRES_OPTIONAL; - ; - break;} -case 208: + } + break; + + case 209: #line 1579 "asn1p_y.y" -{ + { yyval.a_constr = yyvsp[0].a_constr; - ; - break;} -case 209: + } + break; + + case 210: #line 1582 "asn1p_y.y" -{ + { yyval.a_constr = yyvsp[0].a_constr; - ; - break;} -case 210: + } + break; + + case 211: #line 1591 "asn1p_y.y" -{ + { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; int ret; @@ -2869,37 +3458,41 @@ case 210: ct->type = ACT_EL_VALUE; ct->value = asn1p_value_fromref(ref, 0); CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, ct, 0); - ; - break;} -case 211: + } + break; + + case 212: #line 1606 "asn1p_y.y" -{ + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); - ; - break;} -case 212: + } + break; + + case 213: #line 1612 "asn1p_y.y" -{ + { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_VALUE; yyval.a_constr->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); - ; - break;} -case 213: + } + break; + + case 214: #line 1618 "asn1p_y.y" -{ + { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); checkmem(ct); ct->type = ACT_EL_VALUE; ct->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); - ; - break;} -case 214: + } + break; + + case 215: #line 1632 "asn1p_y.y" -{ + { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; *p = '@'; @@ -2909,11 +3502,12 @@ case 214: checkmem(ret == 0); free(p); free(yyvsp[0].tv_str); - ; - break;} -case 215: + } + break; + + case 216: #line 1643 "asn1p_y.y" -{ + { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; p[0] = '@'; @@ -2924,17 +3518,19 @@ case 215: checkmem(ret == 0); free(p); free(yyvsp[0].tv_str); - ; - break;} -case 216: + } + break; + + case 217: #line 1659 "asn1p_y.y" -{ + { yyval.tv_str = yyvsp[0].tv_str; - ; - break;} -case 217: + } + break; + + case 218: #line 1662 "asn1p_y.y" -{ + { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); yyval.tv_str = malloc(l1 + 1 + l3 + 1); @@ -2942,436 +3538,468 @@ case 217: yyval.tv_str[l1] = '.'; memcpy(yyval.tv_str + l1 + 1, yyvsp[0].tv_str, l3); yyval.tv_str[l1 + 1 + l3] = '\0'; - ; - break;} -case 218: + } + break; + + case 219: #line 1680 "asn1p_y.y" -{ yyval.a_marker = EM_NOMARK; ; - break;} -case 219: + { yyval.a_marker = EM_NOMARK; } + break; + + case 220: #line 1681 "asn1p_y.y" -{ yyval.a_marker = yyvsp[0].a_marker; ; - break;} -case 220: + { yyval.a_marker = yyvsp[0].a_marker; } + break; + + case 221: #line 1685 "asn1p_y.y" -{ + { yyval.a_marker = EM_OPTIONAL; - ; - break;} -case 221: + } + break; + + case 222: #line 1688 "asn1p_y.y" -{ + { yyval.a_marker = EM_DEFAULT; /* FIXME: store DefaultValue somewhere */ - ; - break;} -case 222: + } + break; + + case 223: #line 1695 "asn1p_y.y" -{ - ; - break;} -case 223: + { + } + break; + + case 224: #line 1697 "asn1p_y.y" -{ - ; - break;} -case 224: + { + } + break; + + case 225: #line 1699 "asn1p_y.y" -{ asn1p_lexer_hack_push_opaque_state(); ; - break;} -case 225: + { asn1p_lexer_hack_push_opaque_state(); } + break; + + case 226: #line 1699 "asn1p_y.y" -{ - ; - break;} -case 226: + { + } + break; + + case 227: #line 1720 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); - ; - break;} -case 227: + } + break; + + case 228: #line 1724 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-1].a_expr; - ; - break;} -case 228: + } + break; + + case 229: #line 1730 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 229: + } + break; + + case 230: #line 1735 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 230: + } + break; + + case 231: #line 1742 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->Identifier = yyvsp[0].tv_str; - ; - break;} -case 231: + } + break; + + case 232: #line 1749 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->value = yyvsp[-1].a_value; - ; - break;} -case 232: + } + break; + + case 233: #line 1757 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->value = yyvsp[-1].a_value; - ; - break;} -case 233: + } + break; + + case 234: #line 1765 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->value = yyvsp[0].a_value; - ; - break;} -case 234: + } + break; + + case 235: #line 1772 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); checkmem(yyval.a_expr->Identifier); yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_VALUE; - ; - break;} -case 235: + } + break; + + case 236: #line 1783 "asn1p_y.y" -{ + { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); - ; - break;} -case 236: + } + break; + + case 237: #line 1787 "asn1p_y.y" -{ + { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); - ; - break;} -case 237: + } + break; + + case 238: #line 1818 "asn1p_y.y" -{ memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; - break;} -case 238: + { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); } + break; + + case 239: #line 1819 "asn1p_y.y" -{ yyval.a_tag = yyvsp[0].a_tag; ; - break;} -case 239: + { yyval.a_tag = yyvsp[0].a_tag; } + break; + + case 240: #line 1823 "asn1p_y.y" -{ + { yyval.a_tag = yyvsp[0].a_tag; yyval.a_tag.tag_mode = TM_DEFAULT; - ; - break;} -case 240: + } + break; + + case 241: #line 1827 "asn1p_y.y" -{ + { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_IMPLICIT; - ; - break;} -case 241: + } + break; + + case 242: #line 1831 "asn1p_y.y" -{ + { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_EXPLICIT; - ; - break;} -case 242: + } + break; + + case 243: #line 1838 "asn1p_y.y" -{ + { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - ; - break;} -case 243: + } + break; + + case 244: #line 1842 "asn1p_y.y" -{ + { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - ; - break;} -case 244: + } + break; + + case 245: #line 1849 "asn1p_y.y" -{ + { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - ; - break;} -case 245: + } + break; + + case 246: #line 1856 "asn1p_y.y" -{ + { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - ; - break;} -case 246: + } + break; + + case 247: #line 1863 "asn1p_y.y" -{ + { memset(&yyval.tv_nametag, 0, sizeof(yyval.tv_nametag)); yyval.tv_nametag.name = yyvsp[0].tv_str; - ; - break;} -case 247: + } + break; + + case 248: #line 1867 "asn1p_y.y" -{ + { yyval.tv_nametag.name = yyvsp[-1].tv_str; yyval.tv_nametag.tag = yyvsp[0].a_tag; - ; - break;} -} - /* the action file gets copied in in place of this dollarsign */ -#line 543 "/usr/share/bison.simple" + } + break; + + + } + +/* Line 1016 of /usr/local/share/bison/yacc.c. */ +#line 3785 "y.tab.c" yyvsp -= yylen; yyssp -= yylen; -#ifdef YYLSP_NEEDED - yylsp -= yylen; -#endif -#if YYDEBUG != 0 + +#if YYDEBUG if (yydebug) { - short *ssp1 = yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); + short *yyssp1 = yyss - 1; + YYFPRINTF (stderr, "state stack now"); + while (yyssp1 != yyssp) + YYFPRINTF (stderr, " %d", *++yyssp1); + YYFPRINTF (stderr, "\n"); } #endif *++yyvsp = yyval; -#ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } -#endif - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ yyn = yyr1[yyn]; - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else - yystate = yydefgoto[yyn - YYNTBASE]; + yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; -yyerrlab: /* here on detecting error */ - if (! yyerrstatus) - /* If not already recovering from an error, report this error. */ +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) { ++yynerrs; - -#ifdef YYERROR_VERBOSE +#if YYERROR_VERBOSE yyn = yypact[yystate]; - if (yyn > YYFLAG && yyn < YYLAST) + if (YYPACT_NINF < yyn && yyn < YYLAST) { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - size += strlen(yytname[x]) + 15, count++; - msg = (char *) malloc(size + 15); - if (msg != 0) + YYSIZE_T yysize = 0; + int yytype = YYTRANSLATE (yychar); + char *yymsg; + int yyx, yycount; + + yycount = 0; + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + for (yyx = yyn < 0 ? -yyn : 0; + yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + yysize += yystrlen (yytname[yyx]) + 15, yycount++; + yysize += yystrlen ("parse error, unexpected ") + 1; + yysize += yystrlen (yytname[yytype]); + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg != 0) { - strcpy(msg, "parse error"); + char *yyp = yystpcpy (yymsg, "parse error, unexpected "); + yyp = yystpcpy (yyp, yytname[yytype]); - if (count < 5) + if (yycount < 5) { - count = 0; - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) + yycount = 0; + for (yyx = yyn < 0 ? -yyn : 0; + yyx < (int) (sizeof (yytname) / sizeof (char *)); + yyx++) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); - count++; + const char *yyq = ! yycount ? ", expecting " : " or "; + yyp = yystpcpy (yyp, yyq); + yyp = yystpcpy (yyp, yytname[yyx]); + yycount++; } } - yyerror(msg); - free(msg); + yyerror (yymsg); + YYSTACK_FREE (yymsg); } else - yyerror ("parse error; also virtual memory exceeded"); + yyerror ("parse error; also virtual memory exhausted"); } else #endif /* YYERROR_VERBOSE */ - yyerror("parse error"); + yyerror ("parse error"); } - goto yyerrlab1; -yyerrlab1: /* here on error raised explicitly by an action */ + +/*----------------------------------------------------. +| yyerrlab1 -- error raised explicitly by an action. | +`----------------------------------------------------*/ +yyerrlab1: if (yyerrstatus == 3) { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ - /* return failure if at end of input */ + /* Return failure if at end of input. */ if (yychar == YYEOF) - YYABORT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); -#endif + { + /* Pop the error token. */ + YYPOPSTACK; + /* Pop the rest of the stack. */ + while (yyssp > yyss) + { + YYDPRINTF ((stderr, "Error: popping ")); + YYDSYMPRINT ((stderr, + yystos[*yyssp], + *yyvsp)); + YYDPRINTF ((stderr, "\n")); + yydestruct (yystos[*yyssp], *yyvsp); + YYPOPSTACK; + } + YYABORT; + } + YYDPRINTF ((stderr, "Discarding token %d (%s).\n", + yychar, yytname[yychar1])); + yydestruct (yychar1, yylval); yychar = YYEMPTY; } - /* Else will try to reuse lookahead token - after shifting the error token. */ + /* Else will try to reuse lookahead token after shifting the error + token. */ - yyerrstatus = 3; /* Each real token shifted decrements this */ + yyerrstatus = 3; /* Each real token shifted decrements this. */ - goto yyerrhandle; + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } -yyerrdefault: /* current state does not do anything special for the error token. */ + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (yyn) goto yydefault; -#endif + YYDPRINTF ((stderr, "Error: popping ")); + YYDSYMPRINT ((stderr, + yystos[*yyssp], *yyvsp)); + YYDPRINTF ((stderr, "\n")); -yyerrpop: /* pop the current state because it cannot handle the error token */ + yydestruct (yystos[yystate], *yyvsp); + yyvsp--; + yystate = *--yyssp; - if (yyssp == yyss) YYABORT; - yyvsp--; - yystate = *--yyssp; -#ifdef YYLSP_NEEDED - yylsp--; -#endif -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } +#if YYDEBUG + if (yydebug) + { + short *yyssp1 = yyss - 1; + YYFPRINTF (stderr, "Error: state stack now"); + while (yyssp1 != yyssp) + YYFPRINTF (stderr, " %d", *++yyssp1); + YYFPRINTF (stderr, "\n"); + } #endif - -yyerrhandle: - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yyerrdefault; - - yyn += YYTERROR; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) - goto yyerrdefault; - - yyn = yytable[yyn]; - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrpop; - yyn = -yyn; - goto yyreduce; } - else if (yyn == 0) - goto yyerrpop; if (yyn == YYFINAL) YYACCEPT; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting error token, "); -#endif + YYDPRINTF ((stderr, "Shifting error token, ")); *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif + yystate = yyn; goto yynewstate; - yyacceptlab: - /* YYACCEPT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*----------------------------------------------. +| yyoverflowlab -- parser overflow comes here. | +`----------------------------------------------*/ +yyoverflowlab: + yyerror ("parser stack overflow"); + yyresult = 2; + /* Fall through. */ #endif - } - return 0; - yyabortlab: - /* YYABORT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); +yyreturn: +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); #endif - } - return 1; + return yyresult; } + + #line 1874 "asn1p_y.y" @@ -3482,3 +4110,4 @@ yyerror(const char *msg) { } + diff --git a/libasn1parser/asn1p_y.h b/libasn1parser/asn1p_y.h index 61679e3da..09ace7815 100644 --- a/libasn1parser/asn1p_y.h +++ b/libasn1parser/asn1p_y.h @@ -1,3 +1,239 @@ +/* A Bison parser, made from asn1p_y.y, by GNU bison 1.75. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +#ifndef BISON_Y_TAB_H +# define BISON_Y_TAB_H + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + TOK_PPEQ = 258, + TOK_opaque = 259, + TOK_bstring = 260, + TOK_cstring = 261, + TOK_hstring = 262, + TOK_identifier = 263, + TOK_number = 264, + TOK_number_negative = 265, + TOK_typereference = 266, + TOK_objectclassreference = 267, + TOK_typefieldreference = 268, + TOK_valuefieldreference = 269, + TOK_ABSENT = 270, + TOK_ABSTRACT_SYNTAX = 271, + TOK_ALL = 272, + TOK_ANY = 273, + TOK_APPLICATION = 274, + TOK_AUTOMATIC = 275, + TOK_BEGIN = 276, + TOK_BIT = 277, + TOK_BMPString = 278, + TOK_BOOLEAN = 279, + TOK_BY = 280, + TOK_CHARACTER = 281, + TOK_CHOICE = 282, + TOK_CLASS = 283, + TOK_COMPONENT = 284, + TOK_COMPONENTS = 285, + TOK_CONSTRAINED = 286, + TOK_CONTAINING = 287, + TOK_DEFAULT = 288, + TOK_DEFINITIONS = 289, + TOK_DEFINED = 290, + TOK_EMBEDDED = 291, + TOK_ENCODED = 292, + TOK_END = 293, + TOK_ENUMERATED = 294, + TOK_EXPLICIT = 295, + TOK_EXPORTS = 296, + TOK_EXTENSIBILITY = 297, + TOK_EXTERNAL = 298, + TOK_FALSE = 299, + TOK_FROM = 300, + TOK_GeneralizedTime = 301, + TOK_GeneralString = 302, + TOK_GraphicString = 303, + TOK_IA5String = 304, + TOK_IDENTIFIER = 305, + TOK_IMPLICIT = 306, + TOK_IMPLIED = 307, + TOK_IMPORTS = 308, + TOK_INCLUDES = 309, + TOK_INSTANCE = 310, + TOK_INTEGER = 311, + TOK_ISO646String = 312, + TOK_MAX = 313, + TOK_MIN = 314, + TOK_MINUS_INFINITY = 315, + TOK_NULL = 316, + TOK_NumericString = 317, + TOK_OBJECT = 318, + TOK_ObjectDescriptor = 319, + TOK_OCTET = 320, + TOK_OF = 321, + TOK_OPTIONAL = 322, + TOK_PATTERN = 323, + TOK_PDV = 324, + TOK_PLUS_INFINITY = 325, + TOK_PRESENT = 326, + TOK_PrintableString = 327, + TOK_PRIVATE = 328, + TOK_REAL = 329, + TOK_RELATIVE_OID = 330, + TOK_SEQUENCE = 331, + TOK_SET = 332, + TOK_SIZE = 333, + TOK_STRING = 334, + TOK_SYNTAX = 335, + TOK_T61String = 336, + TOK_TAGS = 337, + TOK_TeletexString = 338, + TOK_TRUE = 339, + TOK_TYPE_IDENTIFIER = 340, + TOK_UNIQUE = 341, + TOK_UNIVERSAL = 342, + TOK_UniversalString = 343, + TOK_UTCTime = 344, + TOK_UTF8String = 345, + TOK_VideotexString = 346, + TOK_VisibleString = 347, + TOK_WITH = 348, + TOK_UNION = 349, + TOK_INTERSECTION = 350, + TOK_EXCEPT = 351, + TOK_TwoDots = 352, + TOK_ThreeDots = 353, + TOK_tag = 354 + }; +#endif +#define TOK_PPEQ 258 +#define TOK_opaque 259 +#define TOK_bstring 260 +#define TOK_cstring 261 +#define TOK_hstring 262 +#define TOK_identifier 263 +#define TOK_number 264 +#define TOK_number_negative 265 +#define TOK_typereference 266 +#define TOK_objectclassreference 267 +#define TOK_typefieldreference 268 +#define TOK_valuefieldreference 269 +#define TOK_ABSENT 270 +#define TOK_ABSTRACT_SYNTAX 271 +#define TOK_ALL 272 +#define TOK_ANY 273 +#define TOK_APPLICATION 274 +#define TOK_AUTOMATIC 275 +#define TOK_BEGIN 276 +#define TOK_BIT 277 +#define TOK_BMPString 278 +#define TOK_BOOLEAN 279 +#define TOK_BY 280 +#define TOK_CHARACTER 281 +#define TOK_CHOICE 282 +#define TOK_CLASS 283 +#define TOK_COMPONENT 284 +#define TOK_COMPONENTS 285 +#define TOK_CONSTRAINED 286 +#define TOK_CONTAINING 287 +#define TOK_DEFAULT 288 +#define TOK_DEFINITIONS 289 +#define TOK_DEFINED 290 +#define TOK_EMBEDDED 291 +#define TOK_ENCODED 292 +#define TOK_END 293 +#define TOK_ENUMERATED 294 +#define TOK_EXPLICIT 295 +#define TOK_EXPORTS 296 +#define TOK_EXTENSIBILITY 297 +#define TOK_EXTERNAL 298 +#define TOK_FALSE 299 +#define TOK_FROM 300 +#define TOK_GeneralizedTime 301 +#define TOK_GeneralString 302 +#define TOK_GraphicString 303 +#define TOK_IA5String 304 +#define TOK_IDENTIFIER 305 +#define TOK_IMPLICIT 306 +#define TOK_IMPLIED 307 +#define TOK_IMPORTS 308 +#define TOK_INCLUDES 309 +#define TOK_INSTANCE 310 +#define TOK_INTEGER 311 +#define TOK_ISO646String 312 +#define TOK_MAX 313 +#define TOK_MIN 314 +#define TOK_MINUS_INFINITY 315 +#define TOK_NULL 316 +#define TOK_NumericString 317 +#define TOK_OBJECT 318 +#define TOK_ObjectDescriptor 319 +#define TOK_OCTET 320 +#define TOK_OF 321 +#define TOK_OPTIONAL 322 +#define TOK_PATTERN 323 +#define TOK_PDV 324 +#define TOK_PLUS_INFINITY 325 +#define TOK_PRESENT 326 +#define TOK_PrintableString 327 +#define TOK_PRIVATE 328 +#define TOK_REAL 329 +#define TOK_RELATIVE_OID 330 +#define TOK_SEQUENCE 331 +#define TOK_SET 332 +#define TOK_SIZE 333 +#define TOK_STRING 334 +#define TOK_SYNTAX 335 +#define TOK_T61String 336 +#define TOK_TAGS 337 +#define TOK_TeletexString 338 +#define TOK_TRUE 339 +#define TOK_TYPE_IDENTIFIER 340 +#define TOK_UNIQUE 341 +#define TOK_UNIVERSAL 342 +#define TOK_UniversalString 343 +#define TOK_UTCTime 344 +#define TOK_UTF8String 345 +#define TOK_VideotexString 346 +#define TOK_VisibleString 347 +#define TOK_WITH 348 +#define TOK_UNION 349 +#define TOK_INTERSECTION 350 +#define TOK_EXCEPT 351 +#define TOK_TwoDots 352 +#define TOK_ThreeDots 353 +#define TOK_tag 354 + + + + +#ifndef YYSTYPE +#line 57 "asn1p_y.y" typedef union { asn1p_t *a_grammar; asn1p_module_flags_e a_module_flags; @@ -29,104 +265,14 @@ typedef union { char *name; struct asn1p_type_tag_s tag; } tv_nametag; -} YYSTYPE; -#define TOK_PPEQ 257 -#define TOK_opaque 258 -#define TOK_bstring 259 -#define TOK_cstring 260 -#define TOK_hstring 261 -#define TOK_identifier 262 -#define TOK_number 263 -#define TOK_number_negative 264 -#define TOK_typereference 265 -#define TOK_objectclassreference 266 -#define TOK_typefieldreference 267 -#define TOK_valuefieldreference 268 -#define TOK_ABSENT 269 -#define TOK_ABSTRACT_SYNTAX 270 -#define TOK_ALL 271 -#define TOK_ANY 272 -#define TOK_APPLICATION 273 -#define TOK_AUTOMATIC 274 -#define TOK_BEGIN 275 -#define TOK_BIT 276 -#define TOK_BMPString 277 -#define TOK_BOOLEAN 278 -#define TOK_BY 279 -#define TOK_CHARACTER 280 -#define TOK_CHOICE 281 -#define TOK_CLASS 282 -#define TOK_COMPONENT 283 -#define TOK_COMPONENTS 284 -#define TOK_CONSTRAINED 285 -#define TOK_CONTAINING 286 -#define TOK_DEFAULT 287 -#define TOK_DEFINITIONS 288 -#define TOK_DEFINED 289 -#define TOK_EMBEDDED 290 -#define TOK_ENCODED 291 -#define TOK_END 292 -#define TOK_ENUMERATED 293 -#define TOK_EXPLICIT 294 -#define TOK_EXPORTS 295 -#define TOK_EXTENSIBILITY 296 -#define TOK_EXTERNAL 297 -#define TOK_FALSE 298 -#define TOK_FROM 299 -#define TOK_GeneralizedTime 300 -#define TOK_GeneralString 301 -#define TOK_GraphicString 302 -#define TOK_IA5String 303 -#define TOK_IDENTIFIER 304 -#define TOK_IMPLICIT 305 -#define TOK_IMPLIED 306 -#define TOK_IMPORTS 307 -#define TOK_INCLUDES 308 -#define TOK_INSTANCE 309 -#define TOK_INTEGER 310 -#define TOK_ISO646String 311 -#define TOK_MAX 312 -#define TOK_MIN 313 -#define TOK_MINUS_INFINITY 314 -#define TOK_NULL 315 -#define TOK_NumericString 316 -#define TOK_OBJECT 317 -#define TOK_ObjectDescriptor 318 -#define TOK_OCTET 319 -#define TOK_OF 320 -#define TOK_OPTIONAL 321 -#define TOK_PATTERN 322 -#define TOK_PDV 323 -#define TOK_PLUS_INFINITY 324 -#define TOK_PRESENT 325 -#define TOK_PrintableString 326 -#define TOK_PRIVATE 327 -#define TOK_REAL 328 -#define TOK_RELATIVE_OID 329 -#define TOK_SEQUENCE 330 -#define TOK_SET 331 -#define TOK_SIZE 332 -#define TOK_STRING 333 -#define TOK_SYNTAX 334 -#define TOK_T61String 335 -#define TOK_TAGS 336 -#define TOK_TeletexString 337 -#define TOK_TRUE 338 -#define TOK_TYPE_IDENTIFIER 339 -#define TOK_UNIQUE 340 -#define TOK_UNIVERSAL 341 -#define TOK_UniversalString 342 -#define TOK_UTCTime 343 -#define TOK_UTF8String 344 -#define TOK_VideotexString 345 -#define TOK_VisibleString 346 -#define TOK_WITH 347 -#define TOK_UNION 348 -#define TOK_INTERSECTION 349 -#define TOK_EXCEPT 350 -#define TOK_TwoDots 351 -#define TOK_ThreeDots 352 -#define TOK_tag 353 - +} yystype; +/* Line 1281 of /usr/local/share/bison/yacc.c. */ +#line 271 "y.tab.h" +# define YYSTYPE yystype +#endif extern YYSTYPE asn1p_lval; + + +#endif /* not BISON_Y_TAB_H */ + From 27c7df0a7319e6afb82fef877f632509942159e4 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 3 Jun 2004 05:18:55 +0000 Subject: [PATCH 0008/1469] added const git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@8 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 0f5cf2bfa..0dd0a70f4 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1765,7 +1765,7 @@ emit_alphabet_tables(arg_t *arg, asn1p_constraint_t *ct, int *table) { } } OUT("};\n"); - OUT("static int check_alphabet_%x(void *sptr) {\n", ct); + OUT("static int check_alphabet_%x(const void *sptr) {\n", ct); INDENT(+1); OUT("int *table = alphabet_table_%x;\n", ct); emit_alphabet_check_cycle(arg); From 4d951ef0f420f0806a9d6a24706c5e960210662c Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 5 Jun 2004 01:45:48 +0000 Subject: [PATCH 0009/1469] added consts git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@9 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_CHOICE.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 2cfac3b6f..e6d08ba25 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -456,12 +456,14 @@ CHOICE_outmost_tag(asn1_TYPE_descriptor_t *td, const void *ptr, int tag_mode, be if(present > 0 || present <= specs->elements_count) { asn1_CHOICE_element_t *elm = &specs->elements[present-1]; - void *memb_ptr; + const void *memb_ptr; if(elm->optional) { - memb_ptr = *(void **)((char *)ptr + elm->memb_offset); + memb_ptr = *(const void * const *) + ((const char *)ptr + elm->memb_offset); } else { - memb_ptr = (void *)((char *)ptr + elm->memb_offset); + memb_ptr = (const void *) + ((const char *)ptr + elm->memb_offset); } return asn1_TYPE_outmost_tag(elm->type, memb_ptr, From b42843adeb68eab8020f4bc2345c677edd32025f Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 5 Jun 2004 08:17:50 +0000 Subject: [PATCH 0010/1469] enforsed compilation with -W -Werror git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@10 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-22.c | 14 ++++++--- asn1c/tests/check-24.c | 5 +++- asn1c/tests/check-25.c | 15 ++++++---- asn1c/tests/check-30.c | 5 +++- asn1c/tests/check-31.c | 5 +++- asn1c/tests/check-32.c | 3 ++ asn1c/tests/check-33.c | 3 ++ asn1c/tests/check-35.c | 5 +++- asn1c/tests/check-41.c | 5 +++- asn1c/tests/check-43.c | 3 ++ libasn1compiler/asn1c_misc.c | 2 ++ libasn1compiler/asn1c_save.c | 2 ++ libasn1compiler/asn1compiler.c | 4 +-- libasn1fix/asn1fix_class.c | 2 ++ libasn1fix/asn1fix_integer.c | 2 +- libasn1fix/asn1fix_misc.c | 6 ++-- libasn1parser/asn1p_expr_str.h | 14 ++++----- libasn1parser/asn1p_ref.c | 3 +- libasn1print/asn1print.c | 6 ++++ skeletons/BIT_STRING.c | 2 ++ skeletons/BMPString.c | 4 +++ skeletons/BOOLEAN.c | 10 +++++-- skeletons/ENUMERATED.c | 3 +- skeletons/GeneralString.c | 1 + skeletons/GeneralizedTime.c | 6 +++- skeletons/GraphicString.c | 1 + skeletons/IA5String.c | 1 + skeletons/INTEGER.c | 16 +++++++---- skeletons/ISO646String.c | 1 + skeletons/NULL.c | 7 ++++- skeletons/NativeEnumerated.c | 3 +- skeletons/NativeInteger.c | 12 +++++--- skeletons/NumericString.c | 1 + skeletons/OBJECT_IDENTIFIER.c | 12 +++++--- skeletons/OCTET_STRING.c | 52 +++++++++++++++++++--------------- skeletons/ObjectDescriptor.c | 1 + skeletons/PrintableString.c | 1 + skeletons/RELATIVE-OID.c | 6 +++- skeletons/T61String.c | 1 + skeletons/TeletexString.c | 1 + skeletons/UTCTime.c | 9 ++++-- skeletons/UTF8String.c | 4 +++ skeletons/UniversalString.c | 4 +++ skeletons/VideotexString.c | 1 + skeletons/VisibleString.c | 1 + skeletons/ber_decoder.c | 2 +- skeletons/ber_tlv_length.c | 6 ++-- skeletons/ber_tlv_tag.c | 6 ++-- skeletons/constr_CHOICE.c | 4 +-- skeletons/constr_SEQUENCE.c | 4 +-- skeletons/constr_SEQUENCE_OF.c | 2 +- skeletons/constr_SET.c | 4 +-- skeletons/constr_SET_OF.c | 10 +++---- skeletons/constraints.c | 16 +++++++++-- skeletons/der_encoder.c | 2 +- 55 files changed, 223 insertions(+), 98 deletions(-) diff --git a/asn1c/tests/check-22.c b/asn1c/tests/check-22.c index c80f98810..022278220 100644 --- a/asn1c/tests/check-22.c +++ b/asn1c/tests/check-22.c @@ -32,6 +32,9 @@ int buf2_pos; static int buf2_fill(const void *buffer, size_t size, void *app_key) { + + (void)app_key; + if(buf2_pos + size > sizeof(buf2)) return -1; @@ -42,7 +45,7 @@ buf2_fill(const void *buffer, size_t size, void *app_key) { } static void -check(int is_ok, uint8_t *buf, int size, int consumed) { +check(int is_ok, uint8_t *buf, int size, size_t consumed) { T1_t t, *tp; ber_dec_rval_t rval; der_enc_rval_t erval; @@ -57,7 +60,7 @@ check(int is_ok, uint8_t *buf, int size, int consumed) { if(is_ok) { assert(rval.code == RC_OK); - assert(rval.consumed == consumed); + assert(rval.consumed == (size_t)consumed); assert(t.a.size == 2); assert(t.b.present == b_PR_n); assert(t.b.choice.n.size == 1); @@ -73,7 +76,7 @@ check(int is_ok, uint8_t *buf, int size, int consumed) { || t.c.size != 1 ); } - assert(rval.consumed <= consumed); + assert(rval.consumed <= (size_t)consumed); return; } @@ -89,7 +92,7 @@ check(int is_ok, uint8_t *buf, int size, int consumed) { printf("%d != %d\n", (int)erval.encoded, (int)sizeof(buf1)); } assert(erval.encoded == sizeof(buf1)); - for(i = 0; i < sizeof(buf1); i++) { + for(i = 0; i < (ssize_t)sizeof(buf1); i++) { if(buf1[i] != buf2[i]) { fprintf(stderr, "Recreated buffer content mismatch:\n"); fprintf(stderr, "Byte %d, %x != %x (%d != %d)\n", @@ -133,6 +136,9 @@ try_corrupt(uint8_t *buf, int size) { int main(int ac, char **av) { + (void)ac; /* Unused argument */ + (void)av; /* Unused argument */ + check(1, buf1, sizeof(buf1), sizeof(buf1)); try_corrupt(buf1, sizeof(buf1)); check(1, buf1, sizeof(buf1) + 10, sizeof(buf1)); diff --git a/asn1c/tests/check-24.c b/asn1c/tests/check-24.c index b74ca1659..79de91156 100644 --- a/asn1c/tests/check-24.c +++ b/asn1c/tests/check-24.c @@ -34,7 +34,7 @@ uint8_t buf1[] = { }; static void -check(int is_ok, uint8_t *buf, int size, int consumed) { +check(int is_ok, uint8_t *buf, int size, size_t consumed) { T_t t, *tp; ber_dec_rval_t rval; @@ -87,6 +87,9 @@ try_corrupt(uint8_t *buf, int size) { int main(int ac, char **av) { + (void)ac; /* Unused argument */ + (void)av; /* Unused argument */ + check(1, buf1, sizeof(buf1), sizeof(buf1)); try_corrupt(buf1, sizeof(buf1)); diff --git a/asn1c/tests/check-25.c b/asn1c/tests/check-25.c index bd803da3a..dad12ae10 100644 --- a/asn1c/tests/check-25.c +++ b/asn1c/tests/check-25.c @@ -82,7 +82,7 @@ uint8_t buf1[] = { }; static void -check(int is_ok, uint8_t *buf, int size, int consumed) { +check(int is_ok, uint8_t *buf, int size, size_t consumed) { T_t t, *tp; ber_dec_rval_t rval; @@ -164,10 +164,10 @@ try_corrupt(uint8_t *buf, int size, int allow_consume) { } static void -partial_read(uint8_t *buf, int size) { +partial_read(uint8_t *buf, size_t size) { T_t t, *tp; ber_dec_rval_t rval; - int i1, i2; + size_t i1, i2; uint8_t *buf1 = alloca(size); uint8_t *buf2 = alloca(size); uint8_t *buf3 = alloca(size); @@ -183,11 +183,11 @@ partial_read(uint8_t *buf, int size) { for(i1 = 0; i1 < size; i1++) { for(i2 = i1; i2 < size; i2++) { uint8_t *chunk1 = buf; - int size1 = i1; + size_t size1 = i1; uint8_t *chunk2 = buf + size1; - int size2 = i2 - i1; + size_t size2 = i2 - i1; uint8_t *chunk3 = buf + size1 + size2; - int size3 = size - size1 - size2; + size_t size3 = size - size1 - size2; fprintf(stderr, "\n%d:{%d, %d, %d}...\n", size, size1, size2, size3); @@ -239,6 +239,9 @@ partial_read(uint8_t *buf, int size) { int main(int ac, char **av) { + (void)ac; /* Unused argument */ + (void)av; /* Unused argument */ + /* Check that the full buffer may be decoded normally */ check(1, buf1, sizeof(buf1), sizeof(buf1) - 3); diff --git a/asn1c/tests/check-30.c b/asn1c/tests/check-30.c index 9e5adf22d..4ac52120e 100644 --- a/asn1c/tests/check-30.c +++ b/asn1c/tests/check-30.c @@ -43,7 +43,7 @@ uint8_t buf2[] = { }; static void -check(int is_ok, uint8_t *buf, int size, int consumed) { +check(int is_ok, uint8_t *buf, int size, size_t consumed) { T_t t, *tp; ber_dec_rval_t rval; @@ -103,6 +103,9 @@ try_corrupt(uint8_t *buf, int size) { int main(int ac, char **av) { + (void)ac; /* Unused argument */ + (void)av; /* Unused argument */ + fprintf(stderr, "Must succeed:\n"); check(1, buf1, sizeof(buf1) + 20, sizeof(buf1)); diff --git a/asn1c/tests/check-31.c b/asn1c/tests/check-31.c index 53a90cbaf..cfebedcd9 100644 --- a/asn1c/tests/check-31.c +++ b/asn1c/tests/check-31.c @@ -92,7 +92,7 @@ int bytes_compare(const void *bufferp, size_t size, void *key) { } static void -check(int is_ok, uint8_t *buf, int size, int consumed) { +check(int is_ok, uint8_t *buf, int size, size_t consumed) { Forest_t t, *tp; ber_dec_rval_t rval; @@ -167,6 +167,9 @@ try_corrupt(uint8_t *buf, int size) { int main(int ac, char **av) { + (void)ac; /* Unused argument */ + (void)av; /* Unused argument */ + check(1, buf1, sizeof(buf1), sizeof(buf1)); try_corrupt(buf1, sizeof(buf1)); check(1, buf1, sizeof(buf1) + 20, sizeof(buf1)); diff --git a/asn1c/tests/check-32.c b/asn1c/tests/check-32.c index 3cb0fdac9..49ad2d603 100644 --- a/asn1c/tests/check-32.c +++ b/asn1c/tests/check-32.c @@ -11,6 +11,9 @@ int main(int ac, char **av) { Programming_t p; + (void)ac; /* Unused argument */ + (void)av; /* Unused argument */ + memset(&p, 0, sizeof(p)); /* diff --git a/asn1c/tests/check-33.c b/asn1c/tests/check-33.c index 14f5377a5..616387135 100644 --- a/asn1c/tests/check-33.c +++ b/asn1c/tests/check-33.c @@ -11,6 +11,9 @@ int main(int ac, char **av) { T_t t; + (void)ac; /* Unused argument */ + (void)av; /* Unused argument */ + memset(&t, 0, sizeof(t)); /* diff --git a/asn1c/tests/check-35.c b/asn1c/tests/check-35.c index 6b6c04d65..f29d877cc 100644 --- a/asn1c/tests/check-35.c +++ b/asn1c/tests/check-35.c @@ -115,7 +115,7 @@ uint8_t buf2_reconstr[] = { }; static void -check(T_t *tp, uint8_t *buf, int size, int consumed) { +check(T_t *tp, uint8_t *buf, int size, size_t consumed) { ber_dec_rval_t rval; tp = memset(tp, 0, sizeof(*tp)); @@ -260,6 +260,9 @@ int main(int ac, char **av) { T_t t; + (void)ac; /* Unused argument */ + (void)av; /* Unused argument */ + check(&t, buf1, sizeof(buf1) + 10, sizeof(buf1)); compare(&t, buf1_reconstr, sizeof(buf1_reconstr)); asn_fprint(stderr, &asn1_DEF_T, &t); diff --git a/asn1c/tests/check-41.c b/asn1c/tests/check-41.c index c2238cf5a..09a9d62a3 100644 --- a/asn1c/tests/check-41.c +++ b/asn1c/tests/check-41.c @@ -130,7 +130,7 @@ uint8_t buf2_reconstr[] = { static void -check(T_t *tp, uint8_t *buf, int size, int consumed) { +check(T_t *tp, uint8_t *buf, int size, size_t consumed) { ber_dec_rval_t rval; tp = memset(tp, 0, sizeof(*tp)); @@ -278,6 +278,9 @@ int main(int ac, char **av) { T_t t; + (void)ac; /* Unused argument */ + (void)av; /* Unused argument */ + /* Check exact buf0 */ check(&t, buf0, sizeof(buf0), sizeof(buf0)); compare(&t, buf0_reconstr, sizeof(buf0_reconstr)); diff --git a/asn1c/tests/check-43.c b/asn1c/tests/check-43.c index e44218d84..c906f64dc 100644 --- a/asn1c/tests/check-43.c +++ b/asn1c/tests/check-43.c @@ -13,6 +13,9 @@ main(int ac, char **av) { Test_structure_1_t ts1; Sets_t s1; + (void)ac; /* Unused argument */ + (void)av; /* Unused argument */ + memset(&ts1, 0, sizeof(ts1)); memset(&s1, 0, sizeof(s1)); diff --git a/libasn1compiler/asn1c_misc.c b/libasn1compiler/asn1c_misc.c index b464b64cd..257e02c5c 100644 --- a/libasn1compiler/asn1c_misc.c +++ b/libasn1compiler/asn1c_misc.c @@ -94,6 +94,8 @@ asn1c_open_file(arg_t *arg, const char *name, const char *ext) { FILE *fp; int fd; + (void)arg; /* Unused argument */ + /* * Compute filenames. */ diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c index 8aab8c429..5e425d65f 100644 --- a/libasn1compiler/asn1c_save.c +++ b/libasn1compiler/asn1c_save.c @@ -208,6 +208,8 @@ static int asn1c_copy_over(arg_t *arg, char *path) { char *fname = basename(path); + (void)arg; /* Unused argument */ + if(symlink(path, fname)) { if(errno == EEXIST) { struct stat sb1, sb2; diff --git a/libasn1compiler/asn1compiler.c b/libasn1compiler/asn1compiler.c index d647c05b6..24e539a08 100644 --- a/libasn1compiler/asn1compiler.c +++ b/libasn1compiler/asn1compiler.c @@ -65,9 +65,9 @@ asn1c_compile_expr(arg_t *arg) { int (*type_cb)(arg_t *); int ret; - assert(expr->meta_type >= AMT_INVALID); + assert((int)expr->meta_type >= AMT_INVALID); assert(expr->meta_type < AMT_EXPR_META_MAX); - assert(expr->expr_type >= A1TC_INVALID); + assert((int)expr->expr_type >= A1TC_INVALID); assert(expr->expr_type < ASN_EXPR_TYPE_MAX); type_cb = asn1_lang_map[expr->meta_type][expr->expr_type].type_cb; diff --git a/libasn1fix/asn1fix_class.c b/libasn1fix/asn1fix_class.c index c541fd62c..f617c3180 100644 --- a/libasn1fix/asn1fix_class.c +++ b/libasn1fix/asn1fix_class.c @@ -30,6 +30,8 @@ asn1f_class_access(arg_t *arg, asn1p_ref_t *ref, asn1p_module_t **mod_r) { asn1p_expr_t *result; asn1p_ref_t tmpref; + (void)mod_r; /* Unused argument */ + assert(ref->comp_count > 1); DEBUG("%s(%s) for line %d", __func__, diff --git a/libasn1fix/asn1fix_integer.c b/libasn1fix/asn1fix_integer.c index 514ab70e7..c3a2a7b00 100644 --- a/libasn1fix/asn1fix_integer.c +++ b/libasn1fix/asn1fix_integer.c @@ -114,7 +114,7 @@ static int _asn1f_make_sure_type_is(arg_t *arg, asn1p_expr_t *expr, asn1p_expr_type_e type) { asn1p_module_t *mod = NULL; asn1p_expr_t *next_expr; - int expr_type; + asn1p_expr_type_e expr_type; int ret; expr_type = expr->expr_type; diff --git a/libasn1fix/asn1fix_misc.c b/libasn1fix/asn1fix_misc.c index 5fe69034f..a9a5378b8 100644 --- a/libasn1fix/asn1fix_misc.c +++ b/libasn1fix/asn1fix_misc.c @@ -75,13 +75,13 @@ asn1f_printable_value(asn1p_value_t *v) { } case ATV_REAL: ret = snprintf(buf, sizeof(buf), "%f", v->value.v_double); - if(ret >= sizeof(buf)) + if(ret >= (ssize_t)sizeof(buf)) memcpy(buf + sizeof(buf) - 4, "...", 4); return buf; case ATV_INTEGER: ret = snprintf(buf, sizeof(buf), "%lld", (long long)v->value.v_integer); - if(ret >= sizeof(buf)) + if(ret >= (ssize_t)sizeof(buf)) memcpy(buf + sizeof(buf) - 4, "...", 4); return buf; case ATV_MIN: return "MIN"; @@ -126,7 +126,7 @@ asn1f_printable_value(asn1p_value_t *v) { *ptr++ = ((uc >> (7-(i%8)))&1)?'1':'0'; } } else { - char hextable[16] = "0123456789ABCDEF"; + static const char *hextable="0123456789ABCDEF"; /* * Dump byte by byte. */ diff --git a/libasn1parser/asn1p_expr_str.h b/libasn1parser/asn1p_expr_str.h index 02de131bd..7d98a55c8 100644 --- a/libasn1parser/asn1p_expr_str.h +++ b/libasn1parser/asn1p_expr_str.h @@ -45,13 +45,13 @@ static char *asn1p_expr_type2str[] __attribute__ ((unused)) = { /* * Convert the ASN.1 expression type back into the string representation. */ -#define ASN_EXPR_TYPE2STR(type) \ - ( \ - ((type) < 0 \ - || (type) >= sizeof(asn1p_expr_type2str) \ - / sizeof(asn1p_expr_type2str[0])) \ - ? (char *)0 \ - : asn1p_expr_type2str[(type)] \ +#define ASN_EXPR_TYPE2STR(type) \ + ( \ + (((ssize_t)type) < 0 \ + || ((size_t)type) >= sizeof(asn1p_expr_type2str) \ + / sizeof(asn1p_expr_type2str[0])) \ + ? (char *)0 \ + : asn1p_expr_type2str[(type)] \ ) #endif /* ASN1_PARSER_EXPR_STR_H */ diff --git a/libasn1parser/asn1p_ref.c b/libasn1parser/asn1p_ref.c index 4ac2b32d7..af6f6bb26 100644 --- a/libasn1parser/asn1p_ref.c +++ b/libasn1parser/asn1p_ref.c @@ -80,7 +80,8 @@ asn1p_ref_name2lextype(char *name) { int asn1p_ref_add_component(asn1p_ref_t *ref, char *name, enum asn1p_ref_lex_type_e lex_type) { - if(!ref || !name || lex_type < RLT_UNKNOWN || lex_type >= RLT_MAX) { + if(!ref || !name + || (int)lex_type < RLT_UNKNOWN || lex_type >= RLT_MAX) { errno = EINVAL; return -1; } diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index 992dcfa04..8e8049dc8 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -84,6 +84,8 @@ asn1print_oid(asn1p_oid_t *oid, enum asn1print_flags_e flags) { int ac; int accum = 0; + (void)flags; /* Unused argument */ + printf("{"); for(ac = 0; ac < oid->arcs_count; ac++) { if(accum + strlen(oid->arcs[ac].name?:"") > 50) { @@ -111,6 +113,8 @@ static int asn1print_ref(asn1p_ref_t *ref, enum asn1print_flags_e flags) { int cc; + (void)flags; /* Unused argument */ + for(cc = 0; cc < ref->comp_count; cc++) { if(cc) printf("."); printf("%s", ref->components[cc].name); @@ -123,6 +127,8 @@ static int asn1print_tag(asn1p_expr_t *tc, enum asn1print_flags_e flags) { struct asn1p_type_tag_s *tag = &tc->tag; + (void)flags; /* Unused argument */ + if(tag->tag_class == TC_NOCLASS) return 0; diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index 19b6ff2e3..4914b2074 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -66,6 +66,8 @@ BIT_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, uint8_t *end; char *p = scratch; + (void)td; /* Unused argument */ + if(!st || !st->buf) return cb("", 8, app_key); ilevel += 4; diff --git a/skeletons/BMPString.c b/skeletons/BMPString.c index 596974eaf..93584c8e0 100644 --- a/skeletons/BMPString.c +++ b/skeletons/BMPString.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_BMPString = { / sizeof(asn1_DEF_BMPString_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0 /* No specifics */ }; /* @@ -37,6 +38,9 @@ BMPString_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, char scratch[128]; /* Scratchpad buffer */ char *p; + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + if(!st || !st->buf) return cb("", 8, app_key); wchar = (uint16_t *)st->buf; diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c index 705d37e0f..939131688 100644 --- a/skeletons/BOOLEAN.c +++ b/skeletons/BOOLEAN.c @@ -21,7 +21,8 @@ asn1_TYPE_descriptor_t asn1_DEF_BOOLEAN = { asn1_DEF_BOOLEAN_tags, sizeof(asn1_DEF_BOOLEAN_tags)/sizeof(asn1_DEF_BOOLEAN_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ - 0 /* Always in primitive form */ + 0, /* Always in primitive form */ + 0 /* No specifics */ }; /* @@ -33,7 +34,7 @@ BOOLEAN_decode_ber(asn1_TYPE_descriptor_t *td, int tag_mode) { BOOLEAN_t *st = *bool_structure; ber_dec_rval_t rval; - ber_dec_ctx_t ctx = { 0 }; + ber_dec_ctx_t ctx = { 0, 0, 0, 0 }; ber_tlv_len_t length; ber_tlv_len_t lidx; @@ -61,7 +62,7 @@ BOOLEAN_decode_ber(asn1_TYPE_descriptor_t *td, buf_ptr += rval.consumed; size -= rval.consumed; - if(length > size) { + if(length > (ber_tlv_len_t)size) { rval.code = RC_WMORE; rval.consumed = 0; return rval; @@ -128,6 +129,9 @@ BOOLEAN_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const BOOLEAN_t *st = sptr; + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + if(st) { if(st->value) return cb("TRUE", 4, app_key); diff --git a/skeletons/ENUMERATED.c b/skeletons/ENUMERATED.c index 1f1ae8961..3fff36829 100644 --- a/skeletons/ENUMERATED.c +++ b/skeletons/ENUMERATED.c @@ -21,6 +21,7 @@ asn1_TYPE_descriptor_t asn1_DEF_ENUMERATED = { asn1_DEF_ENUMERATED_tags, sizeof(asn1_DEF_ENUMERATED_tags)/sizeof(asn1_DEF_ENUMERATED_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ - 0 /* Primitive */ + 0, /* Primitive */ + 0 /* No specifics */ }; diff --git a/skeletons/GeneralString.c b/skeletons/GeneralString.c index d69c5f16f..6bc7e4782 100644 --- a/skeletons/GeneralString.c +++ b/skeletons/GeneralString.c @@ -23,5 +23,6 @@ asn1_TYPE_descriptor_t asn1_DEF_GeneralString = { / sizeof(asn1_DEF_GeneralString_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0 /* No specifics */ }; diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 01d7a736e..1dadb92de 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -30,6 +30,7 @@ asn1_TYPE_descriptor_t asn1_DEF_GeneralizedTime = { / sizeof(asn1_DEF_GeneralizedTime_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0 /* No specifics */ }; #endif /* __NO_ASN_TABLE__ */ @@ -59,6 +60,9 @@ GeneralizedTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const GeneralizedTime_t *st = sptr; + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + if(st && st->buf) { char buf[32]; struct tm tm; @@ -72,7 +76,7 @@ GeneralizedTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, "%04d-%02d-%02d %02d:%02d%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); - assert(ret > 0 && ret < sizeof(buf)); + assert(ret > 0 && ret < (int)sizeof(buf)); return cb(buf, ret, app_key); } else { return cb("", 8, app_key); diff --git a/skeletons/GraphicString.c b/skeletons/GraphicString.c index 5c89685ef..412f3c740 100644 --- a/skeletons/GraphicString.c +++ b/skeletons/GraphicString.c @@ -23,5 +23,6 @@ asn1_TYPE_descriptor_t asn1_DEF_GraphicString = { / sizeof(asn1_DEF_GraphicString_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0 /* No specifics */ }; diff --git a/skeletons/IA5String.c b/skeletons/IA5String.c index c4afcb00d..902de8556 100644 --- a/skeletons/IA5String.c +++ b/skeletons/IA5String.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_IA5String = { / sizeof(asn1_DEF_IA5String_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0 /* No specifics */ }; int diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index b1a8c29b9..d20379fb5 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -23,7 +23,8 @@ asn1_TYPE_descriptor_t asn1_DEF_INTEGER = { asn1_DEF_INTEGER_tags, sizeof(asn1_DEF_INTEGER_tags)/sizeof(asn1_DEF_INTEGER_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ - 0 /* Always in primitive form */ + 0, /* Always in primitive form */ + 0 /* No specifics */ }; /* @@ -34,7 +35,7 @@ INTEGER_decode_ber(asn1_TYPE_descriptor_t *td, void **int_structure, void *buf_ptr, size_t size, int tag_mode) { INTEGER_t *st = *int_structure; ber_dec_rval_t rval; - ber_dec_ctx_t ctx = { 0 }; + ber_dec_ctx_t ctx = { 0, 0, 0, 0 }; ber_tlv_len_t length; /* @@ -67,7 +68,7 @@ INTEGER_decode_ber(asn1_TYPE_descriptor_t *td, */ buf_ptr += rval.consumed; size -= rval.consumed; - if(length > size) { + if(length > (ber_tlv_len_t)size) { rval.code = RC_WMORE; rval.consumed = 0; return rval; @@ -193,25 +194,28 @@ INTEGER_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, char *p; int ret; + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + if(!st && !st->buf) return cb("", 8, app_key); if(st->size == 0) return cb("0", 1, app_key); /* Simple case: the integer size is small */ - if(st->size < sizeof(accum) || (st->buf[0] & 0x80)) { + if((size_t)st->size < sizeof(accum) || (st->buf[0] & 0x80)) { accum = (st->buf[0] & 0x80) ? -1 : 0; for(; buf < buf_end; buf++) accum = (accum << 8) | *buf; ret = snprintf(scratch, sizeof(scratch), "%ld", accum); - assert(ret > 0 && ret < sizeof(scratch)); + assert(ret > 0 && ret < (int)sizeof(scratch)); return cb(scratch, ret, app_key); } /* Output in the long xx:yy:zz... format */ for(p = scratch; buf < buf_end; buf++) { static char h2c[16] = "0123456789ABCDEF"; - if((p - scratch) >= (sizeof(scratch) / 2)) { + if((p - scratch) >= (ssize_t)(sizeof(scratch) / 2)) { /* Flush buffer */ if(cb(scratch, p - scratch, app_key)) return -1; diff --git a/skeletons/ISO646String.c b/skeletons/ISO646String.c index 08b316987..2df623cfa 100644 --- a/skeletons/ISO646String.c +++ b/skeletons/ISO646String.c @@ -23,5 +23,6 @@ asn1_TYPE_descriptor_t asn1_DEF_ISO646String = { / sizeof(asn1_DEF_ISO646String_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0 /* No specifics */ }; diff --git a/skeletons/NULL.c b/skeletons/NULL.c index 9027e2c1d..4ea066934 100644 --- a/skeletons/NULL.c +++ b/skeletons/NULL.c @@ -22,7 +22,8 @@ asn1_TYPE_descriptor_t asn1_DEF_NULL = { asn1_DEF_NULL_tags, sizeof(asn1_DEF_NULL_tags)/sizeof(asn1_DEF_NULL_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ - 0 /* Always in primitive form */ + 0, /* Always in primitive form */ + 0 /* No specifics */ }; der_enc_rval_t @@ -43,6 +44,10 @@ NULL_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, int NULL_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + if(sptr) { return cb("", 9, app_key); } else { diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c index b6d21ed25..bfb2bff1a 100644 --- a/skeletons/NativeEnumerated.c +++ b/skeletons/NativeEnumerated.c @@ -28,5 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_NativeEnumerated = { asn1_DEF_NativeEnumerated_tags, sizeof(asn1_DEF_NativeEnumerated_tags)/sizeof(asn1_DEF_NativeEnumerated_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ - 0 /* Always in primitive form */ + 0, /* Always in primitive form */ + 0 /* No specifics */ }; diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index d42540efb..8203695cc 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -30,7 +30,8 @@ asn1_TYPE_descriptor_t asn1_DEF_NativeInteger = { asn1_DEF_NativeInteger_tags, sizeof(asn1_DEF_NativeInteger_tags)/sizeof(asn1_DEF_NativeInteger_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ - 0 /* Always in primitive form */ + 0, /* Always in primitive form */ + 0 /* No specifics */ }; /* @@ -41,7 +42,7 @@ NativeInteger_decode_ber(asn1_TYPE_descriptor_t *td, void **int_ptr, void *buf_ptr, size_t size, int tag_mode) { int *Int = *int_ptr; ber_dec_rval_t rval; - ber_dec_ctx_t ctx = { 0 }; + ber_dec_ctx_t ctx = { 0, 0, 0, 0 }; ber_tlv_len_t length; /* @@ -74,7 +75,7 @@ NativeInteger_decode_ber(asn1_TYPE_descriptor_t *td, */ buf_ptr += rval.consumed; size -= rval.consumed; - if(length > size) { + if(length > (ber_tlv_len_t)size) { rval.code = RC_WMORE; rval.consumed = 0; return rval; @@ -168,9 +169,12 @@ NativeInteger_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, char scratch[32]; int ret; + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + if(Int) { ret = snprintf(scratch, sizeof(scratch), "%d", *Int); - assert(ret > 0 && ret < sizeof(scratch)); + assert(ret > 0 && ret < (int)sizeof(scratch)); return cb(scratch, ret, app_key); } else { return cb("", 8, app_key); diff --git a/skeletons/NumericString.c b/skeletons/NumericString.c index a007496cc..ba5892391 100644 --- a/skeletons/NumericString.c +++ b/skeletons/NumericString.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_NumericString = { / sizeof(asn1_DEF_NumericString_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0 /* No specifics */ }; int diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index bcbcdcafa..0a27c8cac 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -24,7 +24,8 @@ asn1_TYPE_descriptor_t asn1_DEF_OBJECT_IDENTIFIER = { sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags) / sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ - 0 /* Always in primitive form */ + 0, /* Always in primitive form */ + 0 /* No specifics */ }; @@ -94,8 +95,8 @@ OBJECT_IDENTIFIER_get_arc_l(uint8_t *arcbuf, int arclen, int add, unsigned long unsigned long accum; uint8_t *arcend = arcbuf + arclen; - if(arclen * 7 > 8 * sizeof(accum)) { - if(arclen * 7 <= 8 * (sizeof(accum) + 1)) { + if((size_t)arclen * 7 > 8 * sizeof(accum)) { + if((size_t)arclen * 7 <= 8 * (sizeof(accum) + 1)) { if((*arcbuf & ~0x8f)) { errno = ERANGE; /* Overflow */ return -1; @@ -110,8 +111,8 @@ OBJECT_IDENTIFIER_get_arc_l(uint8_t *arcbuf, int arclen, int add, unsigned long for(accum = 0; arcbuf < arcend; arcbuf++) accum = (accum << 7) | (*arcbuf & ~0x80); + assert(accum >= (unsigned long)-add); accum += add; /* Actually, a negative value */ - assert(accum >= 0); *rvalue = accum; @@ -144,6 +145,9 @@ OBJECT_IDENTIFIER_print(asn1_TYPE_descriptor_t *td, const void *sptr, int add = 0; int i; + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + if(!st || !st->buf) return cb("", 8, app_key); diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index fc5c532c5..53a1a0d15 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -25,6 +25,7 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { / sizeof(asn1_DEF_OCTET_STRING_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine (primitive and constructed) */ + 0 /* No specifics */ }; #define _CH_PHASE(ctx, inc) do { \ @@ -48,27 +49,27 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { return rval; \ } while(0) -#define APPEND(bufptr, bufsize) do { \ - int _ns = ctx->step; /* Allocated */ \ - if(_ns <= (st->size + bufsize)) { \ - void *ptr; \ - do { _ns = _ns ? _ns<<2 : 16; } \ - while(_ns <= (st->size + bufsize)); \ - ptr = REALLOC(st->buf, _ns); \ - if(ptr) { \ - st->buf = ptr; \ - ctx->step = _ns; \ - } else { \ - RETURN(RC_FAIL); \ - } \ - } \ - memcpy(st->buf + st->size, bufptr, bufsize); \ - st->size += bufsize; \ - if(st->size < 0) \ - /* Why even care?.. JIC */ \ - RETURN(RC_FAIL); \ - /* Convenient nul-termination */ \ - st->buf[st->size] = '\0'; \ +#define APPEND(bufptr, bufsize) do { \ + size_t _ns = ctx->step; /* Allocated */ \ + if(_ns <= (size_t)(st->size + bufsize)) { \ + void *ptr; \ + do { _ns = _ns ? _ns<<2 : 16; } \ + while(_ns <= (size_t)(st->size + bufsize)); \ + ptr = REALLOC(st->buf, _ns); \ + if(ptr) { \ + st->buf = ptr; \ + ctx->step = _ns; \ + } else { \ + RETURN(RC_FAIL); \ + } \ + } \ + memcpy(st->buf + st->size, bufptr, bufsize); \ + st->size += bufsize; \ + if(st->size < 0) \ + /* Why even care?.. JIC */ \ + RETURN(RC_FAIL); \ + /* Convenient nul-termination */ \ + st->buf[st->size] = '\0'; \ } while(0) /* @@ -315,7 +316,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, assert(sel->left >= 0); - len = (size < sel->left) ? size : sel->left; + len = ((ber_tlv_len_t)size < sel->left) ? size : sel->left; if(len > 0) { if(is_bit_str && sel->bits_chopped == 0) { /* @@ -350,7 +351,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, /* * Primitive form, no stack required. */ - if(size < ctx->left) { + if(size < (size_t)ctx->left) { APPEND(buf_ptr, size); ctx->left -= size; ADVANCE(size); @@ -465,6 +466,8 @@ OCTET_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, size_t i; int ret; + (void)td; /* Unused argument */ + if(!st || !st->buf) return cb("", 8, app_key); /* @@ -494,6 +497,9 @@ OCTET_STRING_print_ascii(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const OCTET_STRING_t *st = sptr; + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + if(st && st->buf) { return cb(st->buf, st->size, app_key); } else { diff --git a/skeletons/ObjectDescriptor.c b/skeletons/ObjectDescriptor.c index 5a39380c4..db699ca02 100644 --- a/skeletons/ObjectDescriptor.c +++ b/skeletons/ObjectDescriptor.c @@ -23,5 +23,6 @@ asn1_TYPE_descriptor_t asn1_DEF_ObjectDescriptor = { / sizeof(asn1_DEF_ObjectDescriptor_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0 /* No specifics */ }; diff --git a/skeletons/PrintableString.c b/skeletons/PrintableString.c index 32ee7da54..8589bd225 100644 --- a/skeletons/PrintableString.c +++ b/skeletons/PrintableString.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_PrintableString = { / sizeof(asn1_DEF_PrintableString_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0 /* No specifics */ }; diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index f6572105b..4fdad3d26 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -24,7 +24,8 @@ asn1_TYPE_descriptor_t asn1_DEF_RELATIVE_OID = { sizeof(asn1_DEF_RELATIVE_OID_tags) / sizeof(asn1_DEF_RELATIVE_OID_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ - 0 /* Always in primitive form */ + 0, /* Always in primitive form */ + 0 /* No specifics */ }; int @@ -34,6 +35,9 @@ RELATIVE_OID_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, int startn; int i; + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + if(!st || !st->buf) return cb("", 8, app_key); diff --git a/skeletons/T61String.c b/skeletons/T61String.c index e6dceb78d..2ba5d324f 100644 --- a/skeletons/T61String.c +++ b/skeletons/T61String.c @@ -23,5 +23,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T61String = { / sizeof(asn1_DEF_T61String_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0 /* No specifics */ }; diff --git a/skeletons/TeletexString.c b/skeletons/TeletexString.c index 1076c8af5..dafbd5852 100644 --- a/skeletons/TeletexString.c +++ b/skeletons/TeletexString.c @@ -23,5 +23,6 @@ asn1_TYPE_descriptor_t asn1_DEF_TeletexString = { / sizeof(asn1_DEF_TeletexString_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0 /* No specifics */ }; diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c index e2f758ecf..5ce2708b4 100644 --- a/skeletons/UTCTime.c +++ b/skeletons/UTCTime.c @@ -29,6 +29,7 @@ asn1_TYPE_descriptor_t asn1_DEF_UTCTime = { / sizeof(asn1_DEF_UTCTime_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0 /* No specifics */ }; #endif /* __NO_ASN_TABLE__ */ @@ -58,6 +59,9 @@ UTCTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const UTCTime_t *st = sptr; + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + if(st && st->buf) { char buf[32]; struct tm tm; @@ -71,7 +75,7 @@ UTCTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, "%04d-%02d-%02d %02d:%02d%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); - assert(ret > 0 && ret < sizeof(buf)); + assert(ret > 0 && ret < (int)sizeof(buf)); return cb(buf, ret, app_key); } else { return cb("", 8, app_key); @@ -83,7 +87,8 @@ asn_UT2time(const UTCTime_t *st, struct tm *_tm) { char buf[17+2]; /* "AAMMJJhhmmss+hhmm" = 17, + 2 = 19 */ GeneralizedTime_t gt; - if(!st || !st->buf || st->size < 11 || st->size > (sizeof(buf) - 2)) { + if(!st || !st->buf + || st->size < 11 || st->size > ((int)sizeof(buf) - 2)) { errno = EINVAL; return -1; } diff --git a/skeletons/UTF8String.c b/skeletons/UTF8String.c index fdd13d871..4ec15b826 100644 --- a/skeletons/UTF8String.c +++ b/skeletons/UTF8String.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_UTF8String = { / sizeof(asn1_DEF_UTF8String_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0 /* No specifics */ }; static int _UTF8String_h1[16] = { @@ -104,6 +105,9 @@ UTF8String_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const UTF8String_t *st = sptr; + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + if(st && st->buf) { return cb(st->buf, st->size, app_key); } else { diff --git a/skeletons/UniversalString.c b/skeletons/UniversalString.c index 7d75e079b..1e3444eef 100644 --- a/skeletons/UniversalString.c +++ b/skeletons/UniversalString.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_UniversalString = { / sizeof(asn1_DEF_UniversalString_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0 /* No specifics */ }; @@ -35,6 +36,9 @@ UniversalString_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, char scratch[128]; /* Scratchpad buffer */ char *p; + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + if(!st || !st->buf) return cb("", 8, app_key); wchar = (uint32_t *)st->buf; diff --git a/skeletons/VideotexString.c b/skeletons/VideotexString.c index ab92ebd99..d9293beb8 100644 --- a/skeletons/VideotexString.c +++ b/skeletons/VideotexString.c @@ -23,5 +23,6 @@ asn1_TYPE_descriptor_t asn1_DEF_VideotexString = { / sizeof(asn1_DEF_VideotexString_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0 /* No specifics */ }; diff --git a/skeletons/VisibleString.c b/skeletons/VisibleString.c index af9525f80..4a335a3a1 100644 --- a/skeletons/VisibleString.c +++ b/skeletons/VisibleString.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_VisibleString = { / sizeof(asn1_DEF_VisibleString_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0 /* No specifics */ }; diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c index 135e7910e..ab8d671c7 100644 --- a/skeletons/ber_decoder.c +++ b/skeletons/ber_decoder.c @@ -210,7 +210,7 @@ ber_check_tags(asn1_TYPE_descriptor_t *head, ber_dec_ctx_t *ctx, ADVANCE(tag_len + len_len); limit_len -= (tag_len + len_len); - if(size > limit_len) { + if((ssize_t)size > limit_len) { /* * Make sure that we won't consume more bytes * from the large buffer than the inferred limit. diff --git a/skeletons/ber_tlv_length.c b/skeletons/ber_tlv_length.c index cd08f6ab4..71850f09e 100644 --- a/skeletons/ber_tlv_length.c +++ b/skeletons/ber_tlv_length.c @@ -24,7 +24,7 @@ ber_fetch_length(int _is_constructed, void *bufptr, size_t size, return 1; } else { ber_tlv_len_t len; - ssize_t skipped; + size_t skipped; if(_is_constructed && oct == 0x80) { *len_r = -1; /* Indefinite length */ @@ -65,7 +65,7 @@ ber_skip_length(int _is_constructed, void *ptr, size_t size) { ber_tlv_len_t vlen; /* Length of V in TLV */ ssize_t tl; /* Length of L in TLV */ ssize_t ll; /* Length of L in TLV */ - ssize_t skip; + size_t skip; /* * Determine the size of L in TLV. @@ -118,7 +118,7 @@ ber_skip_length(int _is_constructed, void *ptr, size_t size) { ssize_t der_tlv_length_serialize(ber_tlv_len_t len, void *bufp, size_t size) { - ssize_t computed_size; /* Size of len encoding */ + size_t computed_size; /* Size of len encoding */ uint8_t *buf = bufp; uint8_t *end; int i; diff --git a/skeletons/ber_tlv_tag.c b/skeletons/ber_tlv_tag.c index 50c9e69b6..a6cccec84 100644 --- a/skeletons/ber_tlv_tag.c +++ b/skeletons/ber_tlv_tag.c @@ -10,7 +10,7 @@ ssize_t ber_fetch_tag(void *ptr, size_t size, ber_tlv_tag_t *tag_r) { ber_tlv_tag_t val; ber_tlv_tag_t tclass; - ssize_t skipped; + size_t skipped; if(size == 0) return 0; @@ -61,7 +61,7 @@ ber_tlv_tag_fwrite(ber_tlv_tag_t tag, FILE *f) { ssize_t ret; ret = ber_tlv_tag_snprint(tag, buf, sizeof(buf)); - if(ret >= sizeof(buf) || ret < 2) { + if(ret >= (ssize_t)sizeof(buf) || ret < 2) { errno = EPERM; return -1; } @@ -103,7 +103,7 @@ der_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { ber_tlv_tag_t tval = BER_TAG_VALUE(tag); uint8_t *buf = bufp; uint8_t *end; - ssize_t computed_size; + size_t computed_size; int i; if(tval <= 30) { diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index e6d08ba25..1ecbbce79 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -11,7 +11,7 @@ * (ctx->left) indicates the number of bytes _transferred_ for the structure. * (size) contains the number of bytes in the buffer passed. */ -#define LEFT ((sizeleft)?size:ctx->left) +#define LEFT ((size<(size_t)ctx->left)?size:ctx->left) /* * If the subprocessor function returns with an indication that it wants @@ -24,7 +24,7 @@ * if the V processor returns with "want more data" even if the buffer * contains way more data than the V processor have seen. */ -#define SIZE_VIOLATION (ctx->left >= 0 && ctx->left <= size) +#define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) /* * This macro "eats" the part of the buffer which is definitely "consumed", diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 6704dd843..71689674a 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -9,7 +9,7 @@ * (ctx->left) indicates the number of bytes _transferred_ for the structure. * (size) contains the number of bytes in the buffer passed. */ -#define LEFT ((sizeleft)?size:ctx->left) +#define LEFT ((size<(size_t)ctx->left)?size:ctx->left) /* * If the subprocessor function returns with an indication that it wants @@ -22,7 +22,7 @@ * if the V processor returns with "want more data" even if the buffer * contains way more data than the V processor have seen. */ -#define SIZE_VIOLATION (ctx->left >= 0 && ctx->left <= size) +#define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) /* * This macro "eats" the part of the buffer which is definitely "consumed", diff --git a/skeletons/constr_SEQUENCE_OF.c b/skeletons/constr_SEQUENCE_OF.c index cdddf6076..a839949de 100644 --- a/skeletons/constr_SEQUENCE_OF.c +++ b/skeletons/constr_SEQUENCE_OF.c @@ -68,7 +68,7 @@ SEQUENCE_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, encoding_size += erval.encoded; } - if(computed_size != encoding_size) { + if(computed_size != (size_t)encoding_size) { /* * Encoded size is not equal to the computed size. */ diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index f1df9c1b3..d0cac1d0f 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -11,7 +11,7 @@ * (ctx->left) indicates the number of bytes _transferred_ for the structure. * (size) contains the number of bytes in the buffer passed. */ -#define LEFT ((sizeleft)?size:ctx->left) +#define LEFT ((size<(size_t)ctx->left)?size:ctx->left) /* * If the subprocessor function returns with an indication that it wants @@ -24,7 +24,7 @@ * if the V processor returns with "want more data" even if the buffer * contains way more data than the V processor have seen. */ -#define SIZE_VIOLATION (ctx->left >= 0 && ctx->left <= size) +#define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) /* * This macro "eats" the part of the buffer which is definitely "consumed", diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index 9dcf638f9..e398db8be 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -10,7 +10,7 @@ * (ctx->left) indicates the number of bytes _transferred_ for the structure. * (size) contains the number of bytes in the buffer passed. */ -#define LEFT ((sizeleft)?size:ctx->left) +#define LEFT ((size<(size_t)ctx->left)?size:ctx->left) /* * If the subprocessor function returns with an indication that it wants @@ -23,7 +23,7 @@ * if the V processor returns with "want more data" even if the buffer * contains way more data than the V processor have seen. */ -#define SIZE_VIOLATION (ctx->left != -1 && ctx->left <= size) +#define SIZE_VIOLATION (ctx->left != -1 && (size_t)ctx->left <= size) /* * This macro "eats" the part of the buffer which is definitely "consumed", @@ -178,7 +178,7 @@ SET_OF_decode_ber(asn1_TYPE_descriptor_t *sd, } /* Outmost tag may be unknown and cannot be fetched/compared */ - if(element->tag != -1) { + if(element->tag != (ber_tlv_tag_t)-1) { if(BER_TAGS_EQUAL(tlv_tag, element->tag)) { /* * The new list member of expected type has arrived. @@ -334,7 +334,7 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, computed_size += erval.encoded; /* Compute maximum encoding's size */ - if(max_encoded_len < erval.encoded) + if(max_encoded_len < (size_t)erval.encoded) max_encoded_len = erval.encoded; } @@ -429,7 +429,7 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, } FREEMEM(encoded_els); - if(ret || computed_size != encoding_size) { + if(ret || computed_size != (size_t)encoding_size) { /* * Standard callback failed, or * encoded size is not equal to the computed size. diff --git a/skeletons/constraints.c b/skeletons/constraints.c index 13a1b4022..cf3170613 100644 --- a/skeletons/constraints.c +++ b/skeletons/constraints.c @@ -4,6 +4,12 @@ int asn_generic_no_constraint(asn1_TYPE_descriptor_t *type_descriptor, const void *struct_ptr, asn_app_consume_bytes_f *cb, void *key) { + + (void)type_descriptor; /* Unused argument */ + (void)struct_ptr; /* Unused argument */ + (void)cb; /* Unused argument */ + (void)key; /* Unused argument */ + /* Nothing to check */ return 0; } @@ -11,6 +17,12 @@ asn_generic_no_constraint(asn1_TYPE_descriptor_t *type_descriptor, int asn_generic_unknown_constraint(asn1_TYPE_descriptor_t *type_descriptor, const void *struct_ptr, asn_app_consume_bytes_f *cb, void *key) { + + (void)type_descriptor; /* Unused argument */ + (void)struct_ptr; /* Unused argument */ + (void)cb; /* Unused argument */ + (void)key; /* Unused argument */ + /* Unknown how to check */ return 0; } @@ -86,7 +98,7 @@ _asn_i_log_error(asn_app_consume_bytes_f *cb, void *key, const char *fmt, ...) { /* Fall through */ } - if(ret < sizeof(buf)) { + if(ret < (ssize_t)sizeof(buf)) { cb(buf, ret, key); return; } @@ -102,7 +114,7 @@ _asn_i_log_error(asn_app_consume_bytes_f *cb, void *key, const char *fmt, ...) { va_start(ap, fmt); ret = vsnprintf(buf, len, fmt, ap); va_end(ap); - if(ret < 0 || ret >= len) { + if(ret < 0 || ret >= (ssize_t)len) { ret = sizeof("") - 1; memcpy(buf, "", ret + 1); } diff --git a/skeletons/der_encoder.c b/skeletons/der_encoder.c index f275f9c1b..72a33ebcd 100644 --- a/skeletons/der_encoder.c +++ b/skeletons/der_encoder.c @@ -118,7 +118,7 @@ der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len, /* Serialize tag (T from TLV) into possibly zero-length buffer */ tmp = der_tlv_tag_serialize(tag, buf, buf_size); - if(tmp == -1 || tmp > sizeof(buf)) return -1; + if(tmp == -1 || tmp > (ssize_t)sizeof(buf)) return -1; size += tmp; /* Serialize length (L from TLV) into possibly zero-length buffer */ From 94faa935185e3698c3f7369908a80620cb1863c4 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 5 Jun 2004 08:46:50 +0000 Subject: [PATCH 0011/1469] compile-in specifics git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@11 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 0dd0a70f4..9fb4f23c9 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1090,7 +1090,8 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("sizeof(asn1_DEF_%s_tags)\n", p); OUT("\t/sizeof(asn1_DEF_%s_tags[0]),\n", p); OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); - OUT("-0\t/* Unknown yet */\n"); + OUT("-0,\t/* Unknown yet */\n"); + OUT("0\t/* No specifics */\n"); ); OUT("};\n"); OUT("\n"); From 97986e45bbe79ef0a1ab6bb3dae332ea70b6d1c4 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 5 Jun 2004 08:47:18 +0000 Subject: [PATCH 0012/1469] enforsed compilation with -W -Werror git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@12 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 4 ++++ asn1c/tests/check-31.c | 2 ++ asn1c/tests/check-35.c | 16 +++++++++------- asn1c/tests/check-41.c | 16 +++++++++------- configure | 4 ++-- configure.in | 4 ++-- 6 files changed, 28 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index 45a11c82a..cdf80f09f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,8 @@ +0.8.11: 2004-Jun-05 + + * Enforsed stricter conformance with C standards. + 0.8.10: 2004-Jun-02 * Added const qualifier where necessary. diff --git a/asn1c/tests/check-31.c b/asn1c/tests/check-31.c index cfebedcd9..05380815e 100644 --- a/asn1c/tests/check-31.c +++ b/asn1c/tests/check-31.c @@ -74,6 +74,8 @@ int bytes_compare(const void *bufferp, size_t size, void *key) { const uint8_t *buffer = bufferp; assert(buf_pos + size <= sizeof(buf1_reconstr)); + (void)key; /* Unused argument */ + fprintf(stderr, " writing %d (%d)\n", (int)size, buf_pos + (int)size); for(; size; buf_pos++, size--, buffer++) { diff --git a/asn1c/tests/check-35.c b/asn1c/tests/check-35.c index f29d877cc..8fdaced0c 100644 --- a/asn1c/tests/check-35.c +++ b/asn1c/tests/check-35.c @@ -133,13 +133,15 @@ check(T_t *tp, uint8_t *buf, int size, size_t consumed) { && strcmp(tp->b.choice.b2.buf, "z") == 0); } -int buf_pos; -int buf_size; +size_t buf_pos; +size_t buf_size; uint8_t *buf; static int buf_fill(const void *buffer, size_t size, void *app_key) { + (void)app_key; + if(buf_pos + size > buf_size) { fprintf(stderr, "%d + %d > %d\n", buf_pos, (int)size, buf_size); return -1; @@ -184,10 +186,10 @@ compare(T_t *tp, uint8_t *cmp_buf, int cmp_buf_size) { } static void -partial_read(uint8_t *buf, int size) { +partial_read(uint8_t *buf, size_t size) { T_t t, *tp; ber_dec_rval_t rval; - int i1, i2; + size_t i1, i2; uint8_t *buf1 = alloca(size); uint8_t *buf2 = alloca(size); uint8_t *buf3 = alloca(size); @@ -203,11 +205,11 @@ partial_read(uint8_t *buf, int size) { for(i1 = 0; i1 < size; i1++) { for(i2 = i1; i2 < size; i2++) { uint8_t *chunk1 = buf; - int size1 = i1; + size_t size1 = i1; uint8_t *chunk2 = buf + size1; - int size2 = i2 - i1; + size_t size2 = i2 - i1; uint8_t *chunk3 = buf + size1 + size2; - int size3 = size - size1 - size2; + size_t size3 = size - size1 - size2; fprintf(stderr, "\n%d:{%d, %d, %d}...\n", size, size1, size2, size3); diff --git a/asn1c/tests/check-41.c b/asn1c/tests/check-41.c index 09a9d62a3..d36ad1ec0 100644 --- a/asn1c/tests/check-41.c +++ b/asn1c/tests/check-41.c @@ -151,13 +151,15 @@ check(T_t *tp, uint8_t *buf, int size, size_t consumed) { */ } -int buf_pos; -int buf_size; +size_t buf_pos; +size_t buf_size; uint8_t *buf; static int buf_fill(const void *buffer, size_t size, void *app_key) { + (void)app_key; /* Unused argument */ + if(buf_pos + size > buf_size) { fprintf(stderr, "%d + %d > %d\n", buf_pos, (int)size, buf_size); return -1; @@ -202,10 +204,10 @@ compare(T_t *tp, uint8_t *cmp_buf, int cmp_buf_size) { } static void -partial_read(uint8_t *buf, int size) { +partial_read(uint8_t *buf, size_t size) { T_t t, *tp; ber_dec_rval_t rval; - int i1, i2; + size_t i1, i2; uint8_t *buf1 = alloca(size); uint8_t *buf2 = alloca(size); uint8_t *buf3 = alloca(size); @@ -221,11 +223,11 @@ partial_read(uint8_t *buf, int size) { for(i1 = 0; i1 < size; i1++) { for(i2 = i1; i2 < size; i2++) { uint8_t *chunk1 = buf; - int size1 = i1; + size_t size1 = i1; uint8_t *chunk2 = buf + size1; - int size2 = i2 - i1; + size_t size2 = i2 - i1; uint8_t *chunk3 = buf + size1 + size2; - int size3 = size - size1 - size2; + size_t size3 = size - size1 - size2; fprintf(stderr, "\n%d:{%d, %d, %d}...\n", size, size1, size2, size3); diff --git a/configure b/configure index b7be21105..f7468dc54 100755 --- a/configure +++ b/configure @@ -1650,7 +1650,7 @@ fi # Define the identity of the package. PACKAGE=asn1c -VERSION=0.8.10 +VERSION=0.8.11 cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" @@ -4756,7 +4756,7 @@ esac # Check whether --enable-autoconf or --disable-autoconf was given. if test "${enable_autoconf+set}" = set; then enableval="$enable_autoconf" - ADD_CFLAGS="-Werror" + ADD_CFLAGS="-Werror -W" fi; diff --git a/configure.in b/configure.in index a4ad1b062..ea31dbbf9 100644 --- a/configure.in +++ b/configure.in @@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_SYSTEM AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.8.10) +AM_INIT_AUTOMAKE(asn1c, 0.8.11) AC_SUBST(PATH) @@ -45,7 +45,7 @@ esac AC_ARG_ENABLE(autoconf, [ --enable-Werror abort compilation after any C compiler warning], - ADD_CFLAGS="-Werror") + ADD_CFLAGS="-Werror -W") AC_SUBST(ADD_CFLAGS) dnl Add these flags if we're using GCC. From 95fff2f19fc24057a8112a0035a0e8d5cac878af Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 5 Jun 2004 08:57:10 +0000 Subject: [PATCH 0013/1469] signed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@13 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/check_fixer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libasn1fix/check_fixer.c b/libasn1fix/check_fixer.c index 21c5b12f4..7129a5631 100644 --- a/libasn1fix/check_fixer.c +++ b/libasn1fix/check_fixer.c @@ -246,7 +246,7 @@ post_fix_check_element(asn1p_module_t *mod, asn1p_expr_t *check_expr) { "CHECKER: Unsupported value type of \"%s\": " "%d at line %d of %s\n", check_expr->Identifier, - value?value->type:-1, + value?(signed)value->type:-1, expr->_lineno, mod->source_file_name ); From 3147308f9563fcf8532a683527b3e720c28f4cef Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 6 Jun 2004 07:20:02 +0000 Subject: [PATCH 0014/1469] tag2member git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@14 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ber_decoder.c | 2 +- skeletons/constr_CHOICE.c | 8 ++-- skeletons/constr_CHOICE.h | 10 +---- skeletons/constr_SEQUENCE.c | 74 +++++++++++++++++++++++++++++++++++-- skeletons/constr_SEQUENCE.h | 9 ++++- skeletons/constr_SET.c | 10 ++--- skeletons/constr_SET.h | 13 +------ skeletons/constr_SET_OF.h | 3 +- skeletons/constr_TYPE.h | 10 +++++ 9 files changed, 103 insertions(+), 36 deletions(-) diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c index ab8d671c7..09211edc1 100644 --- a/skeletons/ber_decoder.c +++ b/skeletons/ber_decoder.c @@ -54,7 +54,7 @@ ber_check_tags(asn1_TYPE_descriptor_t *head, ber_dec_ctx_t *ctx, /* * So what does all this tags_impl_skip stuff mean? - * Imagine two types, + * Imagine the two types, * A ::= [5] IMPLICIT T * B ::= [2] EXPLICIT T * Where T is defined as diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 1ecbbce79..d1beff42e 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -67,8 +67,8 @@ static inline void _set_present_idx(void *sptr, int offset, int size, int pres); */ static int _search4tag(const void *ap, const void *bp) { - const asn1_CHOICE_tag2member_t *a = ap; - const asn1_CHOICE_tag2member_t *b = bp; + const asn1_TYPE_tag2member_t *a = ap; + const asn1_TYPE_tag2member_t *b = bp; int a_class = BER_TAG_CLASS(a->el_tag); int b_class = BER_TAG_CLASS(b->el_tag); @@ -180,8 +180,8 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd, } do { - asn1_CHOICE_tag2member_t *t2m; - asn1_CHOICE_tag2member_t key; + asn1_TYPE_tag2member_t *t2m; + asn1_TYPE_tag2member_t key; key.el_tag = tlv_tag; t2m = bsearch(&key, specs->tag2el, specs->tag2el_count, diff --git a/skeletons/constr_CHOICE.h b/skeletons/constr_CHOICE.h index 70766e9d5..1308bd4ac 100644 --- a/skeletons/constr_CHOICE.h +++ b/skeletons/constr_CHOICE.h @@ -15,16 +15,10 @@ typedef struct asn1_CHOICE_element_s { int optional; /* Whether the element is optional */ ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ int tag_mode; /* IMPLICIT/no/EXPLICIT tag at current level */ - asn1_TYPE_descriptor_t - *type; /* Member type descriptor */ + asn1_TYPE_descriptor_t *type; /* Member type descriptor */ char *name; /* ASN.1 identifier of the element */ } asn1_CHOICE_element_t; -typedef struct asn1_CHOICE_tag2member_s { - ber_tlv_tag_t el_tag; /* Outmost tag of the member */ - int el_no; /* Index of the associated member, base 0 */ -} asn1_CHOICE_tag2member_t; - typedef struct asn1_CHOICE_specifics_s { /* * Target structure description. @@ -43,7 +37,7 @@ typedef struct asn1_CHOICE_specifics_s { /* * Tags to members mapping table. */ - asn1_CHOICE_tag2member_t *tag2el; + asn1_TYPE_tag2member_t *tag2el; int tag2el_count; /* diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 71689674a..5c47df090 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -3,6 +3,7 @@ * Redistribution and modifications are permitted subject to BSD license. */ #include +#include /* * Number of bytes left for this structure. @@ -62,6 +63,35 @@ ( ((memb_idx) > (specs)->ext_after) \ &&((memb_idx) < (specs)->ext_before)) + +/* + * Tags are canonically sorted in the tag2element map. + */ +static int +_t2e_cmp(const void *ap, const void *bp) { + const asn1_TYPE_tag2member_t *a = ap; + const asn1_TYPE_tag2member_t *b = bp; + int a_class = BER_TAG_CLASS(a->el_tag); + int b_class = BER_TAG_CLASS(b->el_tag); + + if(a_class == b_class) { + ber_tlv_tag_t a_value = BER_TAG_VALUE(a->el_tag); + ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag); + + if(a_value == b_value) + return 0; + else if(a_value < b_value) + return -1; + else + return 1; + } else if(a_class < b_class) { + return -1; + } else { + return 1; + } +} + + /* * The decoder of the SEQUENCE type. */ @@ -151,6 +181,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, void *memb_ptr2; /* Pointer to that pointer */ ssize_t tag_len; /* Length of TLV's T */ int opt_edx_end; /* Next non-optional element */ + int use_bsearch; int n; if(ctx->step & 1) @@ -196,9 +227,15 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, /* * Find the next available type with this tag. */ + use_bsearch = 0; opt_edx_end = edx + elements[edx].optional + 1; if(opt_edx_end > specs->elements_count) opt_edx_end = specs->elements_count; /* Cap */ + else if(opt_edx_end - edx > 5) { + /* Limit the scope of linear search */ + opt_edx_end = edx + 5; + use_bsearch = 1; + } for(n = edx; n < opt_edx_end; n++) { if(BER_TAGS_EQUAL(tlv_tag, elements[n].tag)) { /* @@ -207,10 +244,39 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, * Reposition over the right element. */ edx = n; - ctx->step = 2 * edx; /* Remember! */ + ctx->step = 1 + 2 * edx; /* Remember! */ + goto microphase2; + } else if(elements[n].tag == (ber_tlv_tag_t)-1) { + use_bsearch = 1; break; } } + if(use_bsearch) { + /* + * Resorch to a binary search over + * sorted array of tags. + */ + asn1_TYPE_tag2member_t *t2m; + asn1_TYPE_tag2member_t key; + key.el_tag = tlv_tag; + t2m = bsearch(&key, specs->tag2el, specs->tag2el_count, + sizeof(specs->tag2el[0]), _t2e_cmp); + if(t2m && t2m->el_no >= edx) { + /* + * Rewind to the first element with that tag, + * `cause bsearch() does not guarantee order. + */ + while(t2m > specs->tag2el + && BER_TAGS_EQUAL(tlv_tag, + t2m[-1].el_tag) + && t2m[-1].el_no >= edx) + t2m++; + edx = t2m->el_no; + ctx->step = 1 + 2 * edx; + goto microphase2; + } + n = opt_edx_end; + } if(n == opt_edx_end) { /* * If tag is unknown, it may be either @@ -222,8 +288,9 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, if(!IN_EXTENSION_GROUP(specs, edx)) { ASN_DEBUG("Unexpected tag %s", ber_tlv_tag_string(tlv_tag)); - ASN_DEBUG("Expected tag %s%s", + ASN_DEBUG("Expected tag %s (%s)%s", ber_tlv_tag_string(elements[edx].tag), + elements[edx].name, elements[edx].optional ?" or alternatives":""); RETURN(RC_FAIL); @@ -389,6 +456,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, RETURN(RC_OK); } + /* * The DER encoder of the SEQUENCE type. */ @@ -574,7 +642,7 @@ SEQUENCE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, const void *memb_ptr; if(elm->optional) { - memb_ptr = *(const void **)((const char *)sptr + elm->memb_offset); + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); if(!memb_ptr) continue; } else { memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); diff --git a/skeletons/constr_SEQUENCE.h b/skeletons/constr_SEQUENCE.h index c15729ca6..17754bb57 100644 --- a/skeletons/constr_SEQUENCE.h +++ b/skeletons/constr_SEQUENCE.h @@ -15,8 +15,7 @@ typedef struct asn1_SEQUENCE_element_s { int optional; /* Whether the element is optional */ ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ int tag_mode; /* IMPLICIT/no/EXPLICIT tag at current level */ - asn1_TYPE_descriptor_t - *type; /* Member type descriptor */ + asn1_TYPE_descriptor_t *type; /* Member type descriptor */ char *name; /* ASN.1 identifier of the element */ } asn1_SEQUENCE_element_t; @@ -33,6 +32,12 @@ typedef struct asn1_SEQUENCE_specifics_s { asn1_SEQUENCE_element_t *elements; int elements_count; + /* + * Tags to members mapping table (sorted). + */ + asn1_TYPE_tag2member_t *tag2el; + int tag2el_count; + /* * Description of an extensions group. */ diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index d0cac1d0f..0385722c5 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -61,8 +61,8 @@ */ static int _t2e_cmp(const void *ap, const void *bp) { - const asn1_SET_tag2member_t *a = ap; - const asn1_SET_tag2member_t *b = bp; + const asn1_TYPE_tag2member_t *a = ap; + const asn1_TYPE_tag2member_t *b = bp; int a_class = BER_TAG_CLASS(a->el_tag); int b_class = BER_TAG_CLASS(b->el_tag); @@ -225,8 +225,8 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, * but is not strongly anticipated either. */ } else { - asn1_SET_tag2member_t *t2m; - asn1_SET_tag2member_t key; + asn1_TYPE_tag2member_t *t2m; + asn1_TYPE_tag2member_t key; key.el_tag = tlv_tag; t2m = bsearch(&key, specs->tag2el, specs->tag2el_count, @@ -430,7 +430,7 @@ SET_encode_der(asn1_TYPE_descriptor_t *sd, size_t computed_size = 0; der_enc_rval_t my_erval; int t2m_build_own = (specs->tag2el_count != specs->elements_count); - asn1_SET_tag2member_t *t2m; + asn1_TYPE_tag2member_t *t2m; int t2m_count; ssize_t ret; int edx; diff --git a/skeletons/constr_SET.h b/skeletons/constr_SET.h index c0ac07f5c..8cb3fa8d3 100644 --- a/skeletons/constr_SET.h +++ b/skeletons/constr_SET.h @@ -15,19 +15,10 @@ typedef struct asn1_SET_element_s { int optional; /* Whether the element is optional */ ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ int tag_mode; /* IMPLICIT/no/EXPLICIT tag at current level */ - asn1_TYPE_descriptor_t - *type; /* Member type descriptor */ + asn1_TYPE_descriptor_t *type; /* Member type descriptor */ char *name; /* ASN.1 identifier of the element */ } asn1_SET_element_t; -/* - * Map between the outmost tag of the element and the corresponding - * element's index. - */ -typedef struct asn1_SET_tag2member_s { - ber_tlv_tag_t el_tag; /* Outmost tag of the member */ - int el_no; /* Index of the associated member, base 0 */ -} asn1_SET_tag2member_t; typedef struct asn1_SET_specifics_s { /* @@ -46,7 +37,7 @@ typedef struct asn1_SET_specifics_s { /* * Tags to members mapping table (sorted). */ - asn1_SET_tag2member_t *tag2el; + asn1_TYPE_tag2member_t *tag2el; int tag2el_count; /* diff --git a/skeletons/constr_SET_OF.h b/skeletons/constr_SET_OF.h index 814774dcb..e2c6d8fd0 100644 --- a/skeletons/constr_SET_OF.h +++ b/skeletons/constr_SET_OF.h @@ -9,8 +9,7 @@ typedef struct asn1_SET_OF_element_s { ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ - asn1_TYPE_descriptor_t - *type; /* Member type descriptor */ + asn1_TYPE_descriptor_t *type; /* Member type descriptor */ } asn1_SET_OF_element_t; typedef struct asn1_SET_OF_specifics_s { diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index c7cfb22ba..5c001049b 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -83,6 +83,16 @@ typedef struct asn1_TYPE_descriptor_s { void *specifics; } asn1_TYPE_descriptor_t; +/* + * BER tag to element number mapping. + */ +typedef struct asn1_TYPE_tag2member_s { + ber_tlv_tag_t el_tag; /* Outmost tag of the member */ + int el_no; /* Index of the associated member, base 0 */ +} asn1_TYPE_tag2member_t; + + + /* * This function is a wrapper around (td)->print_struct, which prints out * the contents of the target language's structure (struct_ptr) into the From 4e03ce2310064f02a9d9a9df3e3c47f42e447a3b Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 6 Jun 2004 07:20:17 +0000 Subject: [PATCH 0015/1469] tag2member map required for SEQUENCE git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@15 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 195 +++++++++++++++++--------------------- 1 file changed, 87 insertions(+), 108 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 9fb4f23c9..54bd847ee 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -6,11 +6,21 @@ #include "asn1c_C.h" #include /* exportable stuff from libasn1fix */ +typedef struct tag2el_s { + struct asn1p_type_tag_s el_tag; + int el_no; + asn1p_expr_t *from_expr; +} tag2el_t; + +static int _fill_tag2el_map(arg_t *arg, tag2el_t **tag2el, int *count, int el_no); +static int _add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no); + static int asn1c_lang_C_type_SEQUENCE_def(arg_t *arg); static int asn1c_lang_C_type_SET_def(arg_t *arg); static int asn1c_lang_C_type_CHOICE_def(arg_t *arg); static int asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of); static int _print_tag(arg_t *arg, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag_p); +static int emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count); static int emit_constraint_checking_code(arg_t *arg); static int emit_single_constraint_check(arg_t *arg, asn1p_constraint_t *ct, int mode); static int emit_alphabet_tables(arg_t *arg, asn1p_constraint_t *ct, int *table); @@ -23,15 +33,6 @@ static long compute_min_size(arg_t *arg); static long compute_max_size(arg_t *arg); static long compute_xxx_size(arg_t *arg, int _max); -typedef struct tag2el_s { - struct asn1p_type_tag_s el_tag; - int el_no; - asn1p_expr_t *from_expr; -} tag2el_t; - -static int _fill_tag2el_map(arg_t *arg, tag2el_t **tag2el, int *count, int el_no); -static int _add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no); - #define C99_MODE (arg->flags & A1C_NO_C99) #define UNNAMED_UNIONS (arg->flags & A1C_UNNAMED_UNIONS) @@ -170,8 +171,18 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { int comp_mode = 0; /* {root,ext=1,root,root,...} */ int ext_start = -1; int ext_stop = -1; + tag2el_t *tag2el = NULL; + int tag2el_count = 0; char *p; + /* + * Fetch every inner tag from the tag to elements map. + */ + if(_fill_tag2el_map(arg, &tag2el, &tag2el_count, -1)) { + if(tag2el) free(tag2el); + return -1; + } + REDIR(OT_STAT_DEFS); OUT("#include \n"); @@ -255,12 +266,19 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { ); OUT("};\n"); + /* + * Tags to elements map. + */ + emit_tag2member_map(arg, tag2el, tag2el_count); + OUT("static asn1_SEQUENCE_specifics_t asn1_DEF_%s_specs = {\n", p); INDENTED( OUT("sizeof(struct %s),\n", p); OUT("offsetof(struct %s, _ber_dec_ctx),\n", p); OUT("asn1_DEF_%s_elements,\n", p); OUT("%d,\t/* Elements count */\n", elements); + OUT("asn1_DEF_%s_tag2el,\n", p); + OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); OUT("%d,\t/* Start extensions */\n", ext_start); OUT("%d\t/* Stop extensions */\n", @@ -388,61 +406,6 @@ asn1c_lang_C_type_SET(arg_t *arg) { return asn1c_lang_C_type_SET_def(arg); } -/* - * Compare tags according to their canonical order. - * Canonical order: [UNIVERSAL] [APPLICATION] [] [PRIVATE] - * As you see, the class is encoded using the two lowest bits. - */ -static arg_t *_ctc_arg; -static int _canonical_tags_cmp(const void *ap, const void *bp) - __attribute__ ((unused)); -static int -_canonical_tags_cmp(const void *ap, const void *bp) { - asn1p_expr_t *a, *b; - struct asn1p_type_tag_s ta, tb; - - (const asn1p_expr_t *)a = *(const asn1p_expr_t * const *)ap; - (const asn1p_expr_t *)b = *(const asn1p_expr_t * const *)bp; - - if(asn1f_fetch_tag(_ctc_arg->asn, _ctc_arg->mod, a, &ta) - || asn1f_fetch_tag(_ctc_arg->asn, _ctc_arg->mod, b, &tb)) - return 0; - - if(ta.tag_class == tb.tag_class) { - if(ta.tag_value == tb.tag_value) - return 0; - else if(ta.tag_value < tb.tag_value) - return -1; - else - return 1; - } else if(ta.tag_class < tb.tag_class) { - return -1; - } else { - return 1; - } -} - -static int -_tag2el_cmp(const void *ap, const void *bp) { - const tag2el_t *a = ap; - const tag2el_t *b = bp; - const struct asn1p_type_tag_s *ta = &a->el_tag; - const struct asn1p_type_tag_s *tb = &b->el_tag; - - if(ta->tag_class == tb->tag_class) { - if(ta->tag_value == tb->tag_value) - return 0; - else if(ta->tag_value < tb->tag_value) - return -1; - else - return 1; - } else if(ta->tag_class < tb->tag_class) { - return -1; - } else { - return 1; - } -} - static int asn1c_lang_C_type_SET_def(arg_t *arg) { asn1p_expr_t *expr = arg->expr; @@ -461,12 +424,6 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { if(_fill_tag2el_map(arg, &tag2el, &tag2el_count, -1)) { if(tag2el) free(tag2el); return -1; - } else { - /* - * Sort the map according to canonical order of their tags. - */ - _ctc_arg = arg; - qsort(tag2el, tag2el_count, sizeof(*tag2el), _tag2el_cmp); } @@ -550,22 +507,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { /* * Tags to elements map. */ - p = MKID(expr->Identifier); - OUT("static asn1_SET_tag2member_t asn1_DEF_%s_tag2el[] = {\n", p); - if(tag2el_count) { - int i; - for(i = 0; i < tag2el_count; i++) { - OUT(" { "); - _print_tag(arg, expr, &tag2el[i].el_tag); - OUT(", "); - OUT("%d ", tag2el[i].el_no); - OUT("}, /* %s at %d */\n", - tag2el[i].from_expr->Identifier, - tag2el[i].from_expr->_lineno - ); - } - } - OUT("};\n"); + emit_tag2member_map(arg, tag2el, tag2el_count); /* * Emit a map of mandatory elements. @@ -836,12 +778,6 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { if(_fill_tag2el_map(arg, &tag2el, &tag2el_count, -1)) { if(tag2el) free(tag2el); return -1; - } else { - /* - * Sort the map according to canonical order of their tags. - */ - _ctc_arg = arg; - qsort(tag2el, tag2el_count, sizeof(*tag2el), _tag2el_cmp); } REDIR(OT_STAT_DEFS); @@ -920,22 +856,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { /* * Tags to elements map. */ - p = MKID(expr->Identifier); - OUT("static asn1_CHOICE_tag2member_t asn1_DEF_%s_tag2el[] = {\n", p); - if(tag2el_count) { - int i; - for(i = 0; i < tag2el_count; i++) { - OUT(" { "); - _print_tag(arg, expr, &tag2el[i].el_tag); - OUT(", "); - OUT("%d ", tag2el[i].el_no); - OUT("}, /* %s at %d */\n", - tag2el[i].from_expr->Identifier, - tag2el[i].from_expr->_lineno - ); - } - } - OUT("};\n"); + emit_tag2member_map(arg, tag2el, tag2el_count); OUT("static asn1_CHOICE_specifics_t asn1_DEF_%s_specs = {\n", p); INDENTED( @@ -1252,6 +1173,35 @@ _print_tag(arg_t *arg, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag_p) { return 0; } + +static int +_tag2el_cmp(const void *ap, const void *bp) { + const tag2el_t *a = ap; + const tag2el_t *b = bp; + const struct asn1p_type_tag_s *ta = &a->el_tag; + const struct asn1p_type_tag_s *tb = &b->el_tag; + + if(ta->tag_class == tb->tag_class) { + if(ta->tag_value == tb->tag_value) { + /* + * Sort by their respective positions. + */ + if(a->el_no < b->el_no) + return -1; + else if(a->el_no > b->el_no) + return 1; + return 0; + } else if(ta->tag_value < tb->tag_value) + return -1; + else + return 1; + } else if(ta->tag_class < tb->tag_class) { + return -1; + } else { + return 1; + } +} + /* * For constructed types, number of external tags may be greater than * number of elements in the type because of CHOICE type. @@ -1285,6 +1235,11 @@ _fill_tag2el_map(arg_t *arg, tag2el_t **tag2el, int *count, int el_no) { element++; } + /* + * Sort the map according to canonical order of their tags. + */ + qsort(*tag2el, *count, sizeof(**tag2el), _tag2el_cmp); + return 0; } @@ -1348,6 +1303,30 @@ _add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no) { return -1; } +static int +emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count) { + asn1p_expr_t *expr = arg->expr; + + OUT("static asn1_TYPE_tag2member_t asn1_DEF_%s_tag2el[] = {\n", + MKID(expr->Identifier)); + if(tag2el_count) { + int i; + for(i = 0; i < tag2el_count; i++) { + OUT(" { "); + _print_tag(arg, expr, &tag2el[i].el_tag); + OUT(", "); + OUT("%d ", tag2el[i].el_no); + OUT("}, /* %s at %d */\n", + tag2el[i].from_expr->Identifier, + tag2el[i].from_expr->_lineno + ); + } + } + OUT("};\n"); + + return 0;; +} + static int emit_constraint_checking_code(arg_t *arg) { asn1p_expr_t *expr = arg->expr; From 45191f5751fd97f3afbfc0a388b3d80604aa7fd3 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 6 Jun 2004 07:20:37 +0000 Subject: [PATCH 0016/1469] sorted tag2map for SEQUENCE git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@16 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ChangeLog b/ChangeLog index cdf80f09f..91d20b09c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,8 @@ 0.8.11: 2004-Jun-05 * Enforsed stricter conformance with C standards. + * SEQUENCE decoder is now equipped with the sorted map + in case of complex CHOICE descendants. Test case 44 created. 0.8.10: 2004-Jun-02 From 35efd1b3a0def5dbe48e4b2679cd317c0e2ee4f1 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 6 Jun 2004 07:20:52 +0000 Subject: [PATCH 0017/1469] recompiled git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@17 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/39-sequence-of-OK.asn1.-P | 12 ++++++++++++ tests/42-real-life-OK.asn1.-PR | 32 +++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/tests/39-sequence-of-OK.asn1.-P b/tests/39-sequence-of-OK.asn1.-P index afadff7bd..b427ae5a6 100644 --- a/tests/39-sequence-of-OK.asn1.-P +++ b/tests/39-sequence-of-OK.asn1.-P @@ -78,11 +78,17 @@ static asn1_SEQUENCE_element_t asn1_DEF_T_elements[] = { static ber_tlv_tag_t asn1_DEF_T_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; +static asn1_TYPE_tag2member_t asn1_DEF_T_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0 }, /* int at 15 */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1 }, /* collection at 17 */ +}; static asn1_SEQUENCE_specifics_t asn1_DEF_T_specs = { sizeof(struct T), offsetof(struct T, _ber_dec_ctx), asn1_DEF_T_elements, 2, /* Elements count */ + asn1_DEF_T_tag2el, + 2, /* Count of tags in the map */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -145,11 +151,17 @@ static asn1_SEQUENCE_element_t asn1_DEF_T2_elements[] = { static ber_tlv_tag_t asn1_DEF_T2_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; +static asn1_TYPE_tag2member_t asn1_DEF_T2_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 0 }, /* flag at 20 */ + { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), 1 }, /* str at 21 */ +}; static asn1_SEQUENCE_specifics_t asn1_DEF_T2_specs = { sizeof(struct T2), offsetof(struct T2, _ber_dec_ctx), asn1_DEF_T2_elements, 2, /* Elements count */ + asn1_DEF_T2_tag2el, + 2, /* Count of tags in the map */ -1, /* Start extensions */ -1 /* Stop extensions */ }; diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index bcac56cba..d7a65078c 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -82,11 +82,17 @@ static asn1_SEQUENCE_element_t asn1_DEF_LogLine_elements[] = { static ber_tlv_tag_t asn1_DEF_LogLine_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; +static asn1_TYPE_tag2member_t asn1_DEF_LogLine_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1 }, /* varsets at 25 */ + { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), 0 }, /* line-digest at 23 */ +}; static asn1_SEQUENCE_specifics_t asn1_DEF_LogLine_specs = { sizeof(struct LogLine), offsetof(struct LogLine, _ber_dec_ctx), asn1_DEF_LogLine_elements, 2, /* Elements count */ + asn1_DEF_LogLine_tag2el, + 2, /* Count of tags in the map */ 1, /* Start extensions */ 3 /* Stop extensions */ }; @@ -190,11 +196,17 @@ static asn1_SEQUENCE_element_t asn1_DEF_VariablePartSet_elements[] = { static ber_tlv_tag_t asn1_DEF_VariablePartSet_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; +static asn1_TYPE_tag2member_t asn1_DEF_VariablePartSet_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0 }, /* vparts at 33 */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1 }, /* resolution at 35 */ +}; static asn1_SEQUENCE_specifics_t asn1_DEF_VariablePartSet_specs = { sizeof(struct VariablePartSet), offsetof(struct VariablePartSet, _ber_dec_ctx), asn1_DEF_VariablePartSet_elements, 2, /* Elements count */ + asn1_DEF_VariablePartSet_tag2el, + 2, /* Count of tags in the map */ 1, /* Start extensions */ 3 /* Stop extensions */ }; @@ -318,11 +330,17 @@ typedef struct VariablePart { static ber_tlv_tag_t asn1_DEF_vrange_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; + static asn1_TYPE_tag2member_t asn1_DEF_vrange_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), 0 }, /* from at 45 */ + { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), 1 }, /* to at 46 */ + }; static asn1_SEQUENCE_specifics_t asn1_DEF_vrange_specs = { sizeof(struct vrange), offsetof(struct vrange, _ber_dec_ctx), asn1_DEF_vrange_elements, 2, /* Elements count */ + asn1_DEF_vrange_tag2el, + 2, /* Count of tags in the map */ 1, /* Start extensions */ 3 /* Stop extensions */ }; @@ -361,7 +379,7 @@ static asn1_CHOICE_element_t asn1_DEF_VariablePart_elements[] = { static ber_tlv_tag_t asn1_DEF_VariablePart_tags[] = { }; -static asn1_CHOICE_tag2member_t asn1_DEF_VariablePart_tag2el[] = { +static asn1_TYPE_tag2member_t asn1_DEF_VariablePart_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1 }, /* vrange at 45 */ { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0 }, /* vset at 42 */ }; @@ -500,11 +518,17 @@ typedef struct ActionItem { static ber_tlv_tag_t asn1_DEF_notify_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; + static asn1_TYPE_tag2member_t asn1_DEF_notify_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 0 }, /* critical at 61 */ + { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 1 }, /* email at 62 */ + }; static asn1_SEQUENCE_specifics_t asn1_DEF_notify_specs = { sizeof(struct notify), offsetof(struct notify, _ber_dec_ctx), asn1_DEF_notify_elements, 2, /* Elements count */ + asn1_DEF_notify_tag2el, + 2, /* Count of tags in the map */ 1, /* Start extensions */ 3 /* Stop extensions */ }; @@ -543,11 +567,17 @@ static asn1_SEQUENCE_element_t asn1_DEF_ActionItem_elements[] = { static ber_tlv_tag_t asn1_DEF_ActionItem_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; +static asn1_TYPE_tag2member_t asn1_DEF_ActionItem_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0 }, /* accept-as at 55 */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1 }, /* notify at 61 */ +}; static asn1_SEQUENCE_specifics_t asn1_DEF_ActionItem_specs = { sizeof(struct ActionItem), offsetof(struct ActionItem, _ber_dec_ctx), asn1_DEF_ActionItem_elements, 2, /* Elements count */ + asn1_DEF_ActionItem_tag2el, + 2, /* Count of tags in the map */ 1, /* Start extensions */ 3 /* Stop extensions */ }; From 6a19fa5dc96f343f4d458bb5e44a323df93f25a3 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 6 Jun 2004 07:21:11 +0000 Subject: [PATCH 0018/1469] complex optionals, requires tag2map implementation for SEQUENCE git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@18 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/44-choice-in-sequence-OK.asn1 | 30 +++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 tests/44-choice-in-sequence-OK.asn1 diff --git a/tests/44-choice-in-sequence-OK.asn1 b/tests/44-choice-in-sequence-OK.asn1 new file mode 100644 index 000000000..ef375f676 --- /dev/null +++ b/tests/44-choice-in-sequence-OK.asn1 @@ -0,0 +1,30 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .44 + +ModuleChoiceInSequence + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 44 } + DEFINITIONS IMPLICIT TAGS ::= +BEGIN + + T ::= [PRIVATE 1] SEQUENCE { + a [PRIVATE 2] NULL, + b CHOICE { + c [PRIVATE 5] NULL, + d [PRIVATE 6] NULL, + e CHOICE { + f [PRIVATE 7] NULL, + g [PRIVATE 8] NULL + }, + h [PRIVATE 9] CHOICE { -- EXPLICIT! + i [PRIVATE 1] NULL, + j [PRIVATE 2] NULL + } + } + } + +END From 8c321c5ab27d78fc7cc842dbeeedce978948a820 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 6 Jun 2004 07:22:03 +0000 Subject: [PATCH 0019/1469] test case for tag2map functionality for SEQUENCE git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@19 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-44.c | 66 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 asn1c/tests/check-44.c diff --git a/asn1c/tests/check-44.c b/asn1c/tests/check-44.c new file mode 100644 index 000000000..a705ef51e --- /dev/null +++ b/asn1c/tests/check-44.c @@ -0,0 +1,66 @@ +#undef NDEBUG +#include +#include +#include +#include +#include + +#include + +uint8_t buf1[] = { + 32 | ((3 << 6) + 1), /* [PRIVATE 1], constructed */ + 4, /* L */ + ((3 << 6) + 2), /* [PRIVATE 2], primitive */ + 0, /* L */ + ((3 << 6) + 5), /* [PRIVATE 5], primitive */ + 0, /* L */ +}; + +uint8_t buf2[] = { + 32 | ((3 << 6) + 1), /* [PRIVATE 1], constructed */ + 6, /* L */ + ((3 << 6) + 2), /* [PRIVATE 2], primitive */ + 0, /* L */ + 32 | ((3 << 6) + 9), /* [PRIVATE 9], constructed */ + 2, + ((3 << 6) + 1), /* [PRIVATE 1], primitive */ + 0, /* L */ +}; + +static void +check(int is_ok, uint8_t *buf, int size, size_t consumed) { + T_t t, *tp; + ber_dec_rval_t rval; + + tp = memset(&t, 0, sizeof(t)); + + fprintf(stderr, "Buf %p\n", buf); + rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf, size); + fprintf(stderr, "Returned code %d, consumed %d\n", + (int)rval.code, (int)rval.consumed); + + if(is_ok) { + assert(rval.code == RC_OK); + assert(rval.consumed == consumed); + } else { + if(rval.code == RC_OK) { + } + assert(rval.consumed <= consumed); + } +} + +int +main(int ac, char **av) { + + (void)ac; /* Unused argument */ + (void)av; /* Unused argument */ + + check(1, buf1, sizeof(buf1), sizeof(buf1)); + check(0, buf1, sizeof(buf1) - 1, sizeof(buf1) - 1); + check(0, buf1, sizeof(buf1) - 2, sizeof(buf1) - 2); + + check(1, buf2, sizeof(buf2), sizeof(buf2)); + check(0, buf2, sizeof(buf2) - 1, sizeof(buf2)); + + return 0; +} From 9bb9a250dc5845323fb6862a493ce13f663f7ace Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 6 Jun 2004 07:59:35 +0000 Subject: [PATCH 0020/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@20 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ber_decoder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c index 09211edc1..ab8d671c7 100644 --- a/skeletons/ber_decoder.c +++ b/skeletons/ber_decoder.c @@ -54,7 +54,7 @@ ber_check_tags(asn1_TYPE_descriptor_t *head, ber_dec_ctx_t *ctx, /* * So what does all this tags_impl_skip stuff mean? - * Imagine the two types, + * Imagine two types, * A ::= [5] IMPLICIT T * B ::= [2] EXPLICIT T * Where T is defined as From 2e3dd3bb61a8356be5676f5a551ecf8e91ade2b9 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 14 Jun 2004 07:24:36 +0000 Subject: [PATCH 0021/1469] universal get_arcs() for all interger type sizes git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@21 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OBJECT_IDENTIFIER.c | 175 +++++++++++++++++++++++----------- skeletons/OBJECT_IDENTIFIER.h | 39 ++++---- skeletons/RELATIVE-OID.c | 21 ++-- skeletons/RELATIVE-OID.h | 6 +- skeletons/tests/check-OIDs.c | 65 +++++++++++-- 5 files changed, 210 insertions(+), 96 deletions(-) diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index 0a27c8cac..c4176160b 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -3,6 +3,7 @@ * Redistribution and modifications are permitted subject to BSD license. */ #include +#include /* for CHAR_BIT */ #include #include @@ -91,34 +92,100 @@ OBJECT_IDENTIFIER_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } int -OBJECT_IDENTIFIER_get_arc_l(uint8_t *arcbuf, int arclen, int add, unsigned long *rvalue) { - unsigned long accum; - uint8_t *arcend = arcbuf + arclen; +OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed int add, void *rvbuf, unsigned int rvsize) { + unsigned LE = 1; /* Little endian (x86) */ + uint8_t *arcend = arcbuf + arclen; /* End of arc */ + void *rvstart = rvbuf; /* Original start of the value buffer */ + unsigned int cache = 0; /* No more than 14 significant bits */ + int inc; /* Return value growth direction */ - if((size_t)arclen * 7 > 8 * sizeof(accum)) { - if((size_t)arclen * 7 <= 8 * (sizeof(accum) + 1)) { - if((*arcbuf & ~0x8f)) { + rvsize *= CHAR_BIT; /* bytes to bits */ + arclen *= 7; /* bytes to bits */ + + /* + * The arc has the number of bits + * cannot be represented using supplied return value type. + */ + if(arclen > rvsize) { + if(arclen > (rvsize + CHAR_BIT)) { + errno = ERANGE; /* Overflow */ + return -1; + } else { + /* + * Even if the number of bits in the arc representation + * is higher than the width of supplied * return value + * type, there is still possible to fit it when there + * are few unused high bits in the arc value + * representaion. + */ + uint8_t mask = (0xff << (7-(arclen - rvsize))) & 0x7f; + if((*arcbuf & mask)) { errno = ERANGE; /* Overflow */ return -1; } - } else { - errno = ERANGE; /* Overflow */ - return -1; + /* Fool the routine computing unused bits */ + arclen -= 7; + cache = *arcbuf & 0x7f; + arcbuf++; } } - /* Gather all bits into the accumulator */ - for(accum = 0; arcbuf < arcend; arcbuf++) - accum = (accum << 7) | (*arcbuf & ~0x80); - - assert(accum >= (unsigned long)-add); - accum += add; /* Actually, a negative value */ +#ifndef WORDS_BIGENDIAN + if(*(unsigned char *)&LE) { /* Little endian (x86) */ + /* "Convert" to big endian */ + rvbuf += rvsize / CHAR_BIT; + inc = -1; /* Descending */ + } else { + inc = +1; /* Ascending */ + } +#endif /* !WORDS_BIGENDIAN */ + + { /* Native big endian (Sparc, PPC) */ + unsigned int bits; /* typically no more than 3-4 bits */ + /* Clear the high unused bits */ + for(bits = rvsize - arclen; + bits > CHAR_BIT; + rvbuf += inc, bits -= CHAR_BIT) + *(unsigned char *)rvbuf = 0; + /* Fill the body of a value */ + for(; arcbuf < arcend; arcbuf++) { + cache = (cache << 7) | (*arcbuf & 0x7f); + bits += 7; + if(bits >= CHAR_BIT) { + bits -= CHAR_BIT; + *(unsigned char *)rvbuf = (cache >> bits); + rvbuf += inc; + } + } + if(bits) { + *(unsigned char *)rvbuf = cache; + rvbuf += inc; + } + } - *rvalue = accum; + if(add) { + for(rvbuf -= inc; rvbuf != rvstart; rvbuf -= inc) { + int v = add + *(unsigned char *)rvbuf; + if(v & (-1 << CHAR_BIT)) { + *(unsigned char *)rvbuf + = v + (1 << CHAR_BIT); + add = -1; + } else { + *(unsigned char *)rvbuf = v; + break; + } + } + if(rvbuf == rvstart) { + /* No space to carry over */ + errno = ERANGE; /* Overflow */ + return -1; + } + } return 0; } + int OBJECT_IDENTIFIER_print_arc(uint8_t *arcbuf, int arclen, int add, asn_app_consume_bytes_f *cb, void *app_key) { @@ -126,7 +193,8 @@ OBJECT_IDENTIFIER_print_arc(uint8_t *arcbuf, int arclen, int add, unsigned long accum; /* Bits accumulator */ char *p; /* Position in the scratch buffer */ - if(OBJECT_IDENTIFIER_get_arc_l(arcbuf, arclen, add, &accum)) + if(OBJECT_IDENTIFIER_get_single_arc(arcbuf, arclen, add, + &accum, sizeof(accum))) return -1; /* Fill the scratch buffer in reverse. */ @@ -194,10 +262,10 @@ OBJECT_IDENTIFIER_print(asn1_TYPE_descriptor_t *td, const void *sptr, } int -OBJECT_IDENTIFIER_get_arcs_l(OBJECT_IDENTIFIER_t *oid, - unsigned long *arcs, int arcs_slots) { - unsigned long arc_value; - int cur_arc = 0; +OBJECT_IDENTIFIER_get_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, + unsigned int arc_type_size, unsigned int arc_slots) { + void *arcs_end = arcs + (arc_type_size * arc_slots); + int num_arcs = 0; int startn = 0; int add = 0; int i; @@ -212,56 +280,53 @@ OBJECT_IDENTIFIER_get_arcs_l(OBJECT_IDENTIFIER_t *oid, if((b & 0x80)) /* Continuation expected */ continue; - if(startn == 0) { + if(num_arcs == 0) { /* * First two arcs are encoded through the backdoor. */ - if(i) { - add = -80; - if(cur_arc < arcs_slots) arcs[cur_arc] = 2; - cur_arc++; - } else if(b <= 39) { - add = 0; - if(cur_arc < arcs_slots) arcs[cur_arc] = 0; - cur_arc++; - } else if(b < 79) { - add = -40; - if(cur_arc < arcs_slots) arcs[cur_arc] = 1; - cur_arc++; - } else { - add = -80; - if(cur_arc < arcs_slots) arcs[cur_arc] = 2; - cur_arc++; - } + unsigned LE = 1; /* Little endian */ + int first_arc; + num_arcs++; + if(!arc_slots) { num_arcs++; continue; } + + if(i) first_arc = 2; + else if(b <= 39) first_arc = 0; + else if(b < 79) first_arc = 1; + else first_arc = 2; + + add = -40 * first_arc; + memset(arcs, 0, arc_type_size); + *(unsigned char *)(arcs + + ((*(char *)&LE)?0:(arc_type_size - 1))) + = first_arc; + arcs += arc_type_size; } - /* Do not fill */ - if(cur_arc >= arcs_slots) { + /* Decode, if has space */ + if(arcs < arcs_end) { + if(OBJECT_IDENTIFIER_get_single_arc(&oid->buf[startn], + i - startn + 1, add, + arcs, arc_type_size)) + return -1; startn = i + 1; - continue; + arcs += arc_type_size; + add = 0; } - - if(OBJECT_IDENTIFIER_get_arc_l(&oid->buf[startn], - i - startn + 1, - add, &arc_value)) - return -1; - arcs[cur_arc++] = arc_value; - startn = i + 1; - add = 0; + num_arcs++; } - return cur_arc; + return num_arcs; } int -OBJECT_IDENTIFIER_set_arcs_l(OBJECT_IDENTIFIER_t *oid, unsigned long *arcs, int arcs_slots) { +OBJECT_IDENTIFIER_set_arcs_l(OBJECT_IDENTIFIER_t *oid, unsigned long *arcs, unsigned int arc_slots) { uint8_t *buf; uint8_t *bp; unsigned long long first_value; int size; int i; - if(oid == NULL || arcs == NULL || arcs_slots < 2) { + if(oid == NULL || arcs == NULL || arc_slots < 2) { errno = EINVAL; return -1; } @@ -283,7 +348,7 @@ OBJECT_IDENTIFIER_set_arcs_l(OBJECT_IDENTIFIER_t *oid, unsigned long *arcs, int /* * Roughly estimate the maximum size necessary to encode these arcs. */ - size = ((sizeof(arcs[0]) + 1) * 8 / 7) * arcs_slots; + size = ((sizeof(arcs[0]) + 1) * 8 / 7) * arc_slots; bp = buf = MALLOC(size + 1); if(!buf) { /* ENOMEM */ @@ -321,7 +386,7 @@ OBJECT_IDENTIFIER_set_arcs_l(OBJECT_IDENTIFIER_t *oid, unsigned long *arcs, int } } - for(i = 2; i < arcs_slots; i++) { + for(i = 2; i < arc_slots; i++) { unsigned long value = arcs[i]; uint8_t tbuf[sizeof(value) * 2]; /* Conservatively sized */ uint8_t *tp = tbuf; diff --git a/skeletons/OBJECT_IDENTIFIER.h b/skeletons/OBJECT_IDENTIFIER.h index 3e71f3168..77b07def1 100644 --- a/skeletons/OBJECT_IDENTIFIER.h +++ b/skeletons/OBJECT_IDENTIFIER.h @@ -29,27 +29,29 @@ int OBJECT_IDENTIFIER_print_arc(uint8_t *arcbuf, int arclen, /* * This function fills an (_arcs) array with OBJECT IDENTIFIER arcs - * up to specified (_arcs_slots) elements. + * up to specified (_arc_slots) elements. * The function always returns the real number of arcs, even if there is no - * sufficient (_arcs_slots) provided. + * sufficient (_arc_slots) provided. * * EXAMPLE: * void print_arcs(OBJECT_IDENTIFIER_t *oid) { * unsigned long fixed_arcs[10]; // Try with fixed space first * unsigned long *arcs = fixed_arcs; - * int arcs_slots = sizeof(fixed_arcs)/sizeof(fixed_arcs[0]); // 10 + * int arc_type_size = sizeof(fixed_arcs[0]); // sizeof(long) + * int arc_slots = sizeof(fixed_arcs)/sizeof(fixed_arcs[0]); // 10 * int count; // Real number of arcs. * int i; * - * count = OBJECT_IDENTIFIER_get_arcs_l(oid, arcs, arcs_slots); + * count = OBJECT_IDENTIFIER_get_arcs(oid, arcs, + * arc_type_size, arc_slots); * // If necessary, reallocate arcs array and try again. - * if(count > arcs_slots) { - * arcs_slots = count; - * arcs = malloc(arcs_slots * sizeof(arcs[0])); + * if(count > arc_slots) { + * arc_slots = count; + * arcs = malloc(arc_type_size * arc_slots); * if(!arcs) return; - * count = OBJECT_IDENTIFIER_get_arcs_l(oid, - * arcs, arcs_slots); - * assert(count == arcs_slots); + * count = OBJECT_IDENTIFIER_get_arcs(oid, arcs, + * arc_type_size, arc_slots); + * assert(count == arc_slots); * } * * // Print the contents of the arcs array. @@ -65,13 +67,8 @@ int OBJECT_IDENTIFIER_print_arc(uint8_t *arcbuf, int arclen, * -1/ERANGE: One or more arcs have value out of array cell type range. * >=0: Number of arcs contained in the OBJECT IDENTIFIER */ -int OBJECT_IDENTIFIER_get_arcs_l(OBJECT_IDENTIFIER_t *_oid, - unsigned long *_arcs, int _arcs_slots); -/* -int OBJECT_IDENTIFIER_get_arcs_im(OBJECT_IDENTIFIER_t *_oid, - uintmax_t *_arcs, int _arcs_slots); - */ - +int OBJECT_IDENTIFIER_get_arcs(OBJECT_IDENTIFIER_t *_oid, + void *_arcs, unsigned int _arc_type_size, unsigned int _arc_slots); /* * This functions initializes the OBJECT IDENTIFIER object with @@ -84,12 +81,14 @@ int OBJECT_IDENTIFIER_get_arcs_im(OBJECT_IDENTIFIER_t *_oid, * 0: The object was initialized with new arcs. */ int OBJECT_IDENTIFIER_set_arcs_l(OBJECT_IDENTIFIER_t *_oid, - unsigned long *arcs, int arcs_slots); + unsigned long *_arcs, unsigned int _arc_slots); /* * Internal functions. */ -int OBJECT_IDENTIFIER_get_arc_l(uint8_t *arcbuf, int arclen, - int add, unsigned long *value); +int OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, + signed int add, void *value, unsigned int value_size); +int OBJECT_IDENTIFIER_get_single_arc_l(uint8_t *arcbuf, unsigned int arclen, + signed int add, unsigned long *value); #endif /* _OBJECT_IDENTIFIER_H_ */ diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index 4fdad3d26..37f557d78 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -62,10 +62,10 @@ RELATIVE_OID_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, int -RELATIVE_OID_get_arcs_l(RELATIVE_OID_t *roid, - unsigned long *arcs, int arcs_slots) { - unsigned long arc_value; - int cur_arc = 0; +RELATIVE_OID_get_arcs(RELATIVE_OID_t *roid, + void *arcs, unsigned int arc_type_size, unsigned int arc_slots) { + void *arcs_end = arcs + (arc_slots * arc_type_size); + int num_arcs = 0; int startn = 0; int i; @@ -79,17 +79,20 @@ RELATIVE_OID_get_arcs_l(RELATIVE_OID_t *roid, if((b & 0x80)) /* Continuation expected */ continue; - if(cur_arc < arcs_slots) { - if(OBJECT_IDENTIFIER_get_arc_l(&roid->buf[startn], - i - startn + 1, 0, &arc_value)) + if(arcs < arcs_end) { + if(OBJECT_IDENTIFIER_get_single_arc( + &roid->buf[startn], + i - startn + 1, 0, + arcs, arc_type_size)) return -1; - arcs[cur_arc++] = arc_value; + arcs += arc_type_size; + num_arcs++; } startn = i + 1; } - return cur_arc; + return num_arcs; } int diff --git a/skeletons/RELATIVE-OID.h b/skeletons/RELATIVE-OID.h index c0bc680e1..926aca3ab 100644 --- a/skeletons/RELATIVE-OID.h +++ b/skeletons/RELATIVE-OID.h @@ -23,8 +23,8 @@ asn_struct_print_f RELATIVE_OID_print; int RELATIVE_OID_set_arcs_l(RELATIVE_OID_t *_roid, unsigned long *arcs, int arcs_slots); -/* See OBJECT_IDENTIFIER_get_arcs_l() function in OBJECT_IDENTIFIER.h */ -int RELATIVE_OID_get_arcs_l(RELATIVE_OID_t *_roid, - unsigned long *arcs, int arcs_slots); +/* See OBJECT_IDENTIFIER_get_arcs() function in OBJECT_IDENTIFIER.h */ +int RELATIVE_OID_get_arcs(RELATIVE_OID_t *_roid, + void *arcs, unsigned int arc_type_size, unsigned int arc_slots); #endif /* _RELATIVE_OID_H_ */ diff --git a/skeletons/tests/check-OIDs.c b/skeletons/tests/check-OIDs.c index a97a910a2..e7105f763 100644 --- a/skeletons/tests/check-OIDs.c +++ b/skeletons/tests/check-OIDs.c @@ -6,6 +6,7 @@ #include "../ber_tlv_tag.c" #include "../der_encoder.c" #include "../constraints.c" +#include static int _print(const void *buffer, size_t size, void *app_key) { @@ -40,8 +41,8 @@ check_OID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { OBJECT_IDENTIFIER_print(&asn1_DEF_OBJECT_IDENTIFIER, oid, 0, _print, 0); printf("\n"); - alen = OBJECT_IDENTIFIER_get_arcs_l(oid, - arcs, sizeof(arcs)/sizeof(arcs[0])); + alen = OBJECT_IDENTIFIER_get_arcs(oid, + arcs, sizeof(arcs[0]), sizeof(arcs)/sizeof(arcs[0])); assert(alen > 0); assert(alen == ck_len); @@ -83,8 +84,8 @@ check_ROID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { RELATIVE_OID_print(&asn1_DEF_RELATIVE_OID, oid, 0, _print, 0); printf("\n"); - alen = RELATIVE_OID_get_arcs_l(oid, - arcs, sizeof(arcs)/sizeof(arcs[0])); + alen = RELATIVE_OID_get_arcs(oid, + arcs, sizeof(arcs[0]), sizeof(arcs)/sizeof(arcs[0])); assert(alen > 0); assert(alen == ck_len); @@ -120,7 +121,8 @@ check_REGEN(int *arcs, int acount) { ret = RELATIVE_OID_set_arcs_l(&oid, (unsigned long *)arcs, acount); assert(ret == 0); - alen = RELATIVE_OID_get_arcs_l(&oid, tmp_arcs, tmp_alen); + alen = RELATIVE_OID_get_arcs(&oid, tmp_arcs, + sizeof(tmp_arcs[0]), tmp_alen); assert(alen >= 0); assert(alen < tmp_alen); @@ -154,7 +156,8 @@ check_REGEN_OID(int *arcs, int acount) { ret = OBJECT_IDENTIFIER_set_arcs_l(&oid, (unsigned long *)arcs, acount); assert(ret == 0); - alen = OBJECT_IDENTIFIER_get_arcs_l(&oid, tmp_arcs, tmp_alen); + alen = OBJECT_IDENTIFIER_get_arcs(&oid, + tmp_arcs, sizeof(tmp_arcs[0]), tmp_alen); assert(alen >= 0); assert(alen < tmp_alen); @@ -166,6 +169,48 @@ check_REGEN_OID(int *arcs, int acount) { printf(" }\n"); } +static int +check_speed() { + uint8_t buf[] = { 0x80 | 7, 0x80 | 2, 0x80 | 3, 0x80 | 4, 13 }; + int ret = 0; + int cycles = 100000000; + double a, b, c; + struct timeval tv; + unsigned long value; + int i; + + ret = OBJECT_IDENTIFIER_get_single_arc(buf, sizeof(buf), 0, + &value, sizeof(value)); + assert(ret == 0); + assert(value == 0x7040c20d); + + gettimeofday(&tv, 0); + a = tv.tv_sec + tv.tv_usec / 1000000.0; + for(i = 0; i < cycles; i++) { + ret = OBJECT_IDENTIFIER_get_single_arc(buf, sizeof(buf), 0, + &value, sizeof(value)); + } + assert(ret == 0); + assert(value == 0x7040c20d); + gettimeofday(&tv, 0); + b = tv.tv_sec + tv.tv_usec / 1000000.0; + for(i = 0; i < cycles; i++) { + ret = OBJECT_IDENTIFIER_get_single_arc(buf, sizeof(buf), 0, + &value, sizeof(value)); + } + assert(ret == 0); + assert(value == 0x7040c20d); + gettimeofday(&tv, 0); + c = tv.tv_sec + tv.tv_usec / 1000000.0; + + a = b - a; + b = c - b; + printf("Time for single_arc(): %f\n", a); + printf("Time for get_arc_l(): %f\n", b); + + return 0; +} + #define CHECK_OID(n) check_OID(buf ## n, sizeof(buf ## n), \ buf ## n ## _check, \ sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0])) @@ -179,13 +224,13 @@ check_REGEN_OID(int *arcs, int acount) { int main(int ac, char **av) { - /* {joint-iso-itu-t 100 3} */ + /* {joint-iso-itu-t 230 3} */ uint8_t buf1[] = { 0x06, /* OBJECT IDENTIFIER */ 0x03, /* Length */ - 0x81, 0x34, 0x03 + 0x82, 0x36, 0x03 }; - int buf1_check[] = { 2, 100, 3 }; + int buf1_check[] = { 2, 230, 3 }; /* {8571 3 2} */ uint8_t buf2[] = { @@ -224,5 +269,7 @@ main(int ac, char **av) { CHECK_REGEN_OID(12); CHECK_REGEN_OID(13); + check_speed(); + return 0; } From a97e22486edd98d587d8075b6afa9c6f0c76ec73 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 14 Jun 2004 07:40:17 +0000 Subject: [PATCH 0022/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@22 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/check-OIDs.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/skeletons/tests/check-OIDs.c b/skeletons/tests/check-OIDs.c index e7105f763..472e55363 100644 --- a/skeletons/tests/check-OIDs.c +++ b/skeletons/tests/check-OIDs.c @@ -10,6 +10,7 @@ static int _print(const void *buffer, size_t size, void *app_key) { + (void)app_key; fwrite(buffer, size, 1, stdout); return 0; } @@ -23,7 +24,7 @@ check_OID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { int i; printf("Checking {"); - for(i = 0; i < len; i++) { printf("%s%02x", i?" ":"", buf[i]); } + for(i = 0; i < (int)len; i++) { printf("%s%02x", i?" ":"", buf[i]); } printf("} against {"); for(i = 0; i < ck_len; i++) { printf("%s%d", i?" ":"", ck_buf[i]); } printf("}\n"); @@ -32,7 +33,7 @@ check_OID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { rval = ber_decode(&asn1_DEF_OBJECT_IDENTIFIER, (void *)&oid, buf, len); assert(rval.code == RC_OK); - assert(oid->size == len - 2); + assert(oid->size == (ssize_t)len - 2); /* * Print the contents for visual debugging. @@ -52,7 +53,7 @@ check_OID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { printf("OBJECT_IDENTIFIER_get_arcs() => {"); for(i = 0; i < alen; i++) { printf(" %lu", arcs[i]); - assert(arcs[i] == ck_buf[i]); + assert(arcs[i] == (unsigned long)ck_buf[i]); } printf(" }\n"); } @@ -66,7 +67,7 @@ check_ROID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { int i; printf("Checking {"); - for(i = 0; i < len; i++) { printf("%s%02x", i?" ":"", buf[i]); } + for(i = 0; i < (ssize_t)len; i++) { printf("%s%02x", i?" ":"", buf[i]); } printf("} against {"); for(i = 0; i < ck_len; i++) { printf("%s%d", i?" ":"", ck_buf[i]); } printf("}\n"); @@ -75,7 +76,7 @@ check_ROID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { rval = ber_decode(&asn1_DEF_RELATIVE_OID, (void *)&oid, buf, len); assert(rval.code == RC_OK); - assert(oid->size == len - 2); + assert(oid->size == (ssize_t)len - 2); /* * Print the contents for visual debugging. @@ -95,7 +96,7 @@ check_ROID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { printf("RELATIVE_OID_get_arcs() => {"); for(i = 0; i < alen; i++) { printf(" %lu", (unsigned long)arcs[i]); - assert(arcs[i] == ck_buf[i]); + assert(arcs[i] == (unsigned long)ck_buf[i]); } printf(" }\n"); } @@ -129,7 +130,7 @@ check_REGEN(int *arcs, int acount) { printf("Encoded {"); for(i = 0; i < alen; i++) { printf(" %lu", tmp_arcs[i]); - assert(arcs[i] == tmp_arcs[i]); + assert((unsigned long)arcs[i] == tmp_arcs[i]); } printf(" }\n"); } @@ -164,7 +165,7 @@ check_REGEN_OID(int *arcs, int acount) { printf("Encoded {"); for(i = 0; i < alen; i++) { printf(" %lu", tmp_arcs[i]); - assert(arcs[i] == tmp_arcs[i]); + assert((unsigned long)arcs[i] == tmp_arcs[i]); } printf(" }\n"); } @@ -179,8 +180,7 @@ check_speed() { unsigned long value; int i; - ret = OBJECT_IDENTIFIER_get_single_arc(buf, sizeof(buf), 0, - &value, sizeof(value)); + ret = OBJECT_IDENTIFIER_get_single_arc(buf, sizeof(buf), 0, &value, sizeof(value)); assert(ret == 0); assert(value == 0x7040c20d); @@ -223,7 +223,7 @@ check_speed() { sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0])) int -main(int ac, char **av) { +main() { /* {joint-iso-itu-t 230 3} */ uint8_t buf1[] = { 0x06, /* OBJECT IDENTIFIER */ From 3717fb38065bafbbe5d4396a75445902d6a116b0 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 14 Jun 2004 08:17:27 +0000 Subject: [PATCH 0023/1469] faster path for common size git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@23 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OBJECT_IDENTIFIER.c | 30 ++++++++++++++++++++++++------ skeletons/tests/check-OIDs.c | 5 ++++- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index c4176160b..a156d0602 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -91,6 +91,7 @@ OBJECT_IDENTIFIER_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } + int OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed int add, void *rvbuf, unsigned int rvsize) { unsigned LE = 1; /* Little endian (x86) */ @@ -130,23 +131,39 @@ OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed in } } + /* Faster path for common size */ + if(rvsize == (CHAR_BIT * sizeof(unsigned long))) { + unsigned long accum; + /* Gather all bits into the accumulator */ + for(accum = cache; arcbuf < arcend; arcbuf++) + accum = (accum << 7) | (*arcbuf & ~0x80); + if(accum < (unsigned)-add) { + errno = ERANGE; /* Overflow */ + return -1; + } + *(unsigned long *)rvbuf = accum + add; + return 0; + } + #ifndef WORDS_BIGENDIAN if(*(unsigned char *)&LE) { /* Little endian (x86) */ /* "Convert" to big endian */ - rvbuf += rvsize / CHAR_BIT; + rvbuf += rvsize / CHAR_BIT - 1; + ((unsigned char *)rvstart)--; inc = -1; /* Descending */ - } else { - inc = +1; /* Ascending */ - } + } else #endif /* !WORDS_BIGENDIAN */ + inc = +1; /* Big endian is known [at compile time] */ - { /* Native big endian (Sparc, PPC) */ + { unsigned int bits; /* typically no more than 3-4 bits */ + /* Clear the high unused bits */ for(bits = rvsize - arclen; bits > CHAR_BIT; rvbuf += inc, bits -= CHAR_BIT) *(unsigned char *)rvbuf = 0; + /* Fill the body of a value */ for(; arcbuf < arcend; arcbuf++) { cache = (cache << 7) | (*arcbuf & 0x7f); @@ -323,8 +340,8 @@ OBJECT_IDENTIFIER_set_arcs_l(OBJECT_IDENTIFIER_t *oid, unsigned long *arcs, unsi uint8_t *buf; uint8_t *bp; unsigned long long first_value; + unsigned i; int size; - int i; if(oid == NULL || arcs == NULL || arc_slots < 2) { errno = EINVAL; @@ -423,3 +440,4 @@ OBJECT_IDENTIFIER_set_arcs_l(OBJECT_IDENTIFIER_t *oid, unsigned long *arcs, unsi return 0; } + diff --git a/skeletons/tests/check-OIDs.c b/skeletons/tests/check-OIDs.c index 472e55363..cea630e0d 100644 --- a/skeletons/tests/check-OIDs.c +++ b/skeletons/tests/check-OIDs.c @@ -269,7 +269,10 @@ main() { CHECK_REGEN_OID(12); CHECK_REGEN_OID(13); - check_speed(); + if(getenv("CHECK_SPEED")) { + /* Useful for developers only */ + check_speed(); + } return 0; } From d0055c61585af791bd367acb6eb4419f7180880c Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 14 Jun 2004 13:07:09 +0000 Subject: [PATCH 0024/1469] unified diff for more info git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@24 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/check-parsing.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asn1c/check-parsing.sh b/asn1c/check-parsing.sh index 9a7bfde72..a0533263b 100755 --- a/asn1c/check-parsing.sh +++ b/asn1c/check-parsing.sh @@ -10,7 +10,7 @@ for ref in ../tests/*.asn1.-*; do echo "Checking $src against $ref" ./asn1c "-$flags" "$src" > "$tmpfile" || ec=$? if [ $? = 0 ]; then - diff "$ref" "$tmpfile" || ec=$? + diff -u "$ref" "$tmpfile" || ec=$? fi rm -f "$tmpfile" done From c8aeab446259e49b967967a27e314df23668ed00 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 14 Jun 2004 13:09:45 +0000 Subject: [PATCH 0025/1469] hints for run-time parser git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@25 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 32 ++++++++++++++++++++++++++++++-- skeletons/constr_TYPE.h | 3 ++- tests/39-sequence-of-OK.asn1.-P | 8 ++++---- tests/42-real-life-OK.asn1.-PR | 24 ++++++++++++------------ 4 files changed, 48 insertions(+), 19 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 54bd847ee..4643ae2d1 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -9,6 +9,8 @@ typedef struct tag2el_s { struct asn1p_type_tag_s el_tag; int el_no; + int toff_first; + int toff_last; asn1p_expr_t *from_expr; } tag2el_t; @@ -1236,10 +1238,34 @@ _fill_tag2el_map(arg_t *arg, tag2el_t **tag2el, int *count, int el_no) { } /* - * Sort the map according to canonical order of their tags. + * Sort the map according to canonical order of their tags + * and element numbers. */ qsort(*tag2el, *count, sizeof(**tag2el), _tag2el_cmp); + /* + * Initialize .toff_{first|last} members. + */ + if(*count) { + struct asn1p_type_tag_s *cur_tag = 0; + tag2el_t *cur = *tag2el; + tag2el_t *end = cur + *count; + int occur, i; + for(occur = 0; cur < end; cur++) { + if(cur_tag == 0 + || cur_tag->tag_value != cur->el_tag.tag_value + || cur_tag->tag_class != cur->el_tag.tag_class) { + cur_tag = &cur->el_tag; + occur = 0; + } else { + occur++; + } + cur->toff_first = -occur; + for(i = 0; i >= -occur; i--) + cur[i].toff_last = -i; + } + } + return 0; } @@ -1315,7 +1341,9 @@ emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count) { OUT(" { "); _print_tag(arg, expr, &tag2el[i].el_tag); OUT(", "); - OUT("%d ", tag2el[i].el_no); + OUT("%d, ", tag2el[i].el_no); + OUT("%d, ", tag2el[i].toff_first); + OUT("%d ", tag2el[i].toff_last); OUT("}, /* %s at %d */\n", tag2el[i].from_expr->Identifier, tag2el[i].from_expr->_lineno diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index 5c001049b..da3a2db7f 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -89,10 +89,11 @@ typedef struct asn1_TYPE_descriptor_s { typedef struct asn1_TYPE_tag2member_s { ber_tlv_tag_t el_tag; /* Outmost tag of the member */ int el_no; /* Index of the associated member, base 0 */ + int toff_first; /* First occurence of the el_tag, relative */ + int toff_last; /* Last occurence of the el_tag, relatvie */ } asn1_TYPE_tag2member_t; - /* * This function is a wrapper around (td)->print_struct, which prints out * the contents of the target language's structure (struct_ptr) into the diff --git a/tests/39-sequence-of-OK.asn1.-P b/tests/39-sequence-of-OK.asn1.-P index b427ae5a6..d073e49f2 100644 --- a/tests/39-sequence-of-OK.asn1.-P +++ b/tests/39-sequence-of-OK.asn1.-P @@ -79,8 +79,8 @@ static ber_tlv_tag_t asn1_DEF_T_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn1_TYPE_tag2member_t asn1_DEF_T_tag2el[] = { - { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0 }, /* int at 15 */ - { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1 }, /* collection at 17 */ + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* int at 15 */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* collection at 17 */ }; static asn1_SEQUENCE_specifics_t asn1_DEF_T_specs = { sizeof(struct T), @@ -152,8 +152,8 @@ static ber_tlv_tag_t asn1_DEF_T2_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn1_TYPE_tag2member_t asn1_DEF_T2_tag2el[] = { - { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 0 }, /* flag at 20 */ - { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), 1 }, /* str at 21 */ + { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 0, 0, 0 }, /* flag at 20 */ + { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), 1, 0, 0 }, /* str at 21 */ }; static asn1_SEQUENCE_specifics_t asn1_DEF_T2_specs = { sizeof(struct T2), diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index d7a65078c..0cf1be943 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -83,8 +83,8 @@ static ber_tlv_tag_t asn1_DEF_LogLine_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn1_TYPE_tag2member_t asn1_DEF_LogLine_tag2el[] = { - { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1 }, /* varsets at 25 */ - { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), 0 }, /* line-digest at 23 */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* varsets at 25 */ + { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), 0, 0, 0 }, /* line-digest at 23 */ }; static asn1_SEQUENCE_specifics_t asn1_DEF_LogLine_specs = { sizeof(struct LogLine), @@ -197,8 +197,8 @@ static ber_tlv_tag_t asn1_DEF_VariablePartSet_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn1_TYPE_tag2member_t asn1_DEF_VariablePartSet_tag2el[] = { - { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0 }, /* vparts at 33 */ - { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1 }, /* resolution at 35 */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* vparts at 33 */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 0 }, /* resolution at 35 */ }; static asn1_SEQUENCE_specifics_t asn1_DEF_VariablePartSet_specs = { sizeof(struct VariablePartSet), @@ -331,8 +331,8 @@ typedef struct VariablePart { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn1_TYPE_tag2member_t asn1_DEF_vrange_tag2el[] = { - { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), 0 }, /* from at 45 */ - { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), 1 }, /* to at 46 */ + { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), 0, 0, 1 }, /* from at 45 */ + { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), 1, -1, 0 }, /* to at 46 */ }; static asn1_SEQUENCE_specifics_t asn1_DEF_vrange_specs = { sizeof(struct vrange), @@ -380,8 +380,8 @@ static ber_tlv_tag_t asn1_DEF_VariablePart_tags[] = { }; static asn1_TYPE_tag2member_t asn1_DEF_VariablePart_tag2el[] = { - { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1 }, /* vrange at 45 */ - { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0 }, /* vset at 42 */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* vrange at 45 */ + { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0, 0, 0 }, /* vset at 42 */ }; static asn1_CHOICE_specifics_t asn1_DEF_VariablePart_specs = { sizeof(struct VariablePart), @@ -519,8 +519,8 @@ typedef struct ActionItem { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn1_TYPE_tag2member_t asn1_DEF_notify_tag2el[] = { - { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 0 }, /* critical at 61 */ - { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 1 }, /* email at 62 */ + { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 0, 0, 0 }, /* critical at 61 */ + { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 1, 0, 0 }, /* email at 62 */ }; static asn1_SEQUENCE_specifics_t asn1_DEF_notify_specs = { sizeof(struct notify), @@ -568,8 +568,8 @@ static ber_tlv_tag_t asn1_DEF_ActionItem_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn1_TYPE_tag2member_t asn1_DEF_ActionItem_tag2el[] = { - { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0 }, /* accept-as at 55 */ - { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1 }, /* notify at 61 */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, 0, 0 }, /* accept-as at 55 */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* notify at 61 */ }; static asn1_SEQUENCE_specifics_t asn1_DEF_ActionItem_specs = { sizeof(struct ActionItem), From 1692da0e9e4957f73cf19e65c61296635df6636e Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 14 Jun 2004 13:42:23 +0000 Subject: [PATCH 0026/1469] proper way of handling duplicate tags when bsearching git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@26 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SEQUENCE.c | 39 +++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 5c47df090..d9efb86c5 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -78,9 +78,15 @@ _t2e_cmp(const void *ap, const void *bp) { ber_tlv_tag_t a_value = BER_TAG_VALUE(a->el_tag); ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag); - if(a_value == b_value) + if(a_value == b_value) { + if(a->el_no < b->el_no) + return -1; + /* + * Important: we do not check + * for a->el_no being greater than b->el_no! + */ return 0; - else if(a_value < b_value) + } else if(a_value < b_value) return -1; else return 1; @@ -232,9 +238,10 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, if(opt_edx_end > specs->elements_count) opt_edx_end = specs->elements_count; /* Cap */ else if(opt_edx_end - edx > 5) { - /* Limit the scope of linear search */ + /* Limit the scope of linear search... */ opt_edx_end = edx + 5; use_bsearch = 1; + /* ... and resort to bsearch() */ } for(n = edx; n < opt_edx_end; n++) { if(BER_TAGS_EQUAL(tlv_tag, elements[n].tag)) { @@ -259,21 +266,29 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, asn1_TYPE_tag2member_t *t2m; asn1_TYPE_tag2member_t key; key.el_tag = tlv_tag; + key.el_no = edx; t2m = bsearch(&key, specs->tag2el, specs->tag2el_count, sizeof(specs->tag2el[0]), _t2e_cmp); - if(t2m && t2m->el_no >= edx) { + if(t2m) { + asn1_TYPE_tag2member_t *best = 0; + asn1_TYPE_tag2member_t *t2m_f, *t2m_l; + int edx_max = edx + elements[edx].optional; /* * Rewind to the first element with that tag, * `cause bsearch() does not guarantee order. */ - while(t2m > specs->tag2el - && BER_TAGS_EQUAL(tlv_tag, - t2m[-1].el_tag) - && t2m[-1].el_no >= edx) - t2m++; - edx = t2m->el_no; - ctx->step = 1 + 2 * edx; - goto microphase2; + t2m_f = t2m + t2m->toff_first; + t2m_l = t2m + t2m->toff_last; + for(t2m = t2m_f; t2m <= t2m_l; t2m++) { + if(t2m->el_no > edx_max) break; + if(t2m->el_no < edx) continue; + best = t2m; + } + if(best) { + edx = best->el_no; + ctx->step = 1 + 2 * edx; + goto microphase2; + } } n = opt_edx_end; } From e511d3e7abe12b86519082b3a7a79dfeade8236b Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 14 Jun 2004 13:53:32 +0000 Subject: [PATCH 0027/1469] fixes git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@27 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 91d20b09c..1ce2caf2b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,15 @@ +0.8.12: 2004-Jun-14 + + * RELATIVE-OID and OBJECT IDENTIFIER decoders are not bound + anymore to an integer type of specific size (unsigned long). + * SEQUENCE BER decoder fixed again for complex CHOICE case + (Test case 44). + 0.8.11: 2004-Jun-05 * Enforsed stricter conformance with C standards. - * SEQUENCE decoder is now equipped with the sorted map + * SEQUENCE BER decoder is now equipped with the sorted map in case of complex CHOICE descendants. Test case 44 created. 0.8.10: 2004-Jun-02 From 23ea2c7ffb7106ac4e974deb23da28d476501e22 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 14 Jun 2004 13:54:21 +0000 Subject: [PATCH 0028/1469] added bug properties git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@28 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 1ce2caf2b..15631bea9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,7 +4,7 @@ * RELATIVE-OID and OBJECT IDENTIFIER decoders are not bound anymore to an integer type of specific size (unsigned long). * SEQUENCE BER decoder fixed again for complex CHOICE case - (Test case 44). + (Test case 44) (Severity: medium, Security impact: low). 0.8.11: 2004-Jun-05 From e4ee6ee72b9548b444167d23fd4a12c88daf9fc9 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 14 Jun 2004 14:11:14 +0000 Subject: [PATCH 0029/1469] oops git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@29 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SEQUENCE.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index d9efb86c5..9aab0d812 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -79,11 +79,11 @@ _t2e_cmp(const void *ap, const void *bp) { ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag); if(a_value == b_value) { - if(a->el_no < b->el_no) - return -1; + if(a->el_no > b->el_no) + return 1; /* * Important: we do not check - * for a->el_no being greater than b->el_no! + * for a->el_no <= b->el_no! */ return 0; } else if(a_value < b_value) @@ -267,8 +267,10 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, asn1_TYPE_tag2member_t key; key.el_tag = tlv_tag; key.el_no = edx; + printf("key = %p\n", &key); t2m = bsearch(&key, specs->tag2el, specs->tag2el_count, sizeof(specs->tag2el[0]), _t2e_cmp); + printf("t2m = %p\n", t2m); if(t2m) { asn1_TYPE_tag2member_t *best = 0; asn1_TYPE_tag2member_t *t2m_f, *t2m_l; From 36c14b266ce14ae06598e24cc1da41dd430b794a Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 14 Jun 2004 14:11:28 +0000 Subject: [PATCH 0030/1469] oops git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@30 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SEQUENCE.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 9aab0d812..c9bc646d2 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -267,10 +267,8 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, asn1_TYPE_tag2member_t key; key.el_tag = tlv_tag; key.el_no = edx; - printf("key = %p\n", &key); t2m = bsearch(&key, specs->tag2el, specs->tag2el_count, sizeof(specs->tag2el[0]), _t2e_cmp); - printf("t2m = %p\n", t2m); if(t2m) { asn1_TYPE_tag2member_t *best = 0; asn1_TYPE_tag2member_t *t2m_f, *t2m_l; From 8f3eb997c9275b7613fb942a69f688160dfb40c1 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 17 Jun 2004 23:42:48 +0000 Subject: [PATCH 0031/1469] upgraded autotools git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@31 59561ff5-6e30-0410-9f3c-9617f08c8826 --- Makefile.in | 519 +- aclocal.m4 | 7615 ++++++++++++-- asn1c/Makefile.in | 542 +- asn1c/tests/Makefile.in | 291 +- config.guess | 599 +- config.sub | 353 +- configure | 18068 ++++++++++++++++++++++++++++++++-- configure.in | 2 +- doc/Makefile.in | 243 +- examples/Makefile.in | 295 +- libasn1compiler/Makefile.in | 484 +- libasn1fix/Makefile.in | 529 +- libasn1parser/Makefile.in | 541 +- libasn1print/Makefile.in | 435 +- ltmain.sh | 5018 +++++++--- skeletons/Makefile.in | 354 +- skeletons/tests/Makefile.in | 484 +- tests/Makefile.in | 243 +- 18 files changed, 31462 insertions(+), 5153 deletions(-) diff --git a/Makefile.in b/Makefile.in index 1ce7ad4c0..9ac9a7895 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,7 +1,8 @@ -# Makefile.in generated automatically by automake 1.5 from Makefile.am. +# Makefile.in generated by automake 1.8.4 from Makefile.am. +# @configure_input@ -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -12,159 +13,244 @@ # PARTICULAR PURPOSE. @SET_MAKE@ - -SHELL = @SHELL@ - srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) -transform = @program_transform_name@ +transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_alias = @build_alias@ build_triplet = @build@ -host_alias = @host_alias@ host_triplet = @host@ -target_alias = @target_alias@ target_triplet = @target@ +DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/config.h.in \ + $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ + TODO config.guess config.sub depcomp install-sh ltconfig \ + ltmain.sh missing mkinstalldirs +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno configure.status.lineno +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d $(distdir) \ + || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr $(distdir); }; } +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ ADD_CFLAGS = @ADD_CFLAGS@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ -AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ -OBJDUMP = @OBJDUMP@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ PATH = @PATH@ +PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ +am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ install_sh = @install_sh@ - +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ SUBDIRS = \ libasn1parser libasn1print \ libasn1fix libasn1compiler \ skeletons examples tests \ doc asn1c - EXTRA_DIST = BUGS MANIFEST -subdir = . -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = config.h -CONFIG_CLEAN_FILES = -DIST_SOURCES = - -RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \ - uninstall-info-recursive all-recursive install-data-recursive \ - install-exec-recursive installdirs-recursive install-recursive \ - uninstall-recursive check-recursive installcheck-recursive -DIST_COMMON = README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \ - Makefile.am Makefile.in NEWS TODO aclocal.m4 config.guess \ - config.h.in config.sub configure configure.in depcomp \ - install-sh ltconfig ltmain.sh missing mkinstalldirs -DIST_SUBDIRS = $(SUBDIRS) all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) +am--refresh: + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \ + cd $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile -Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) && \ - CONFIG_HEADERS= CONFIG_LINKS= \ - CONFIG_FILES=$@ $(SHELL) ./config.status - -$(top_builddir)/config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck -$(srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) - cd $(srcdir) && $(AUTOCONF) -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.in +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) -config.h: stamp-h - @if test ! -f $@; then \ - rm -f stamp-h; \ - $(MAKE) stamp-h; \ - else :; fi -stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status - @rm -f stamp-h stamp-hT - @echo timestamp > stamp-hT 2> /dev/null - cd $(top_builddir) \ - && CONFIG_FILES= CONFIG_HEADERS=config.h \ - $(SHELL) ./config.status - @mv stamp-hT stamp-h -$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/./stamp-h.in + +config.h: stamp-h1 @if test ! -f $@; then \ - rm -f $(srcdir)/./stamp-h.in; \ - $(MAKE) $(srcdir)/./stamp-h.in; \ + rm -f stamp-h1; \ + $(MAKE) stamp-h1; \ else :; fi -$(srcdir)/./stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) - @rm -f $(srcdir)/./stamp-h.in $(srcdir)/./stamp-h.inT - @echo timestamp > $(srcdir)/./stamp-h.inT 2> /dev/null + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_srcdir) && $(AUTOHEADER) - @mv $(srcdir)/./stamp-h.inT $(srcdir)/./stamp-h.in + rm -f stamp-h1 + touch $@ distclean-hdr: - -rm -f config.h + -rm -f config.h stamp-h1 + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd @@ -174,7 +260,7 @@ uninstall-info-am: # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): - @set fnord $(MAKEFLAGS); amf=$$2; \ + @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ @@ -194,7 +280,7 @@ $(RECURSIVE_TARGETS): mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: - @set fnord $(MAKEFLAGS); amf=$$2; \ + @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ @@ -221,79 +307,110 @@ tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done - -tags: TAGS +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - mkid -fID $$unique $(LISP) + mkid -fID $$unique +tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ + test -f $$subdir/TAGS && \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \ - || etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -z "$$unique" && unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique GTAGS: - here=`CDPATH=: && cd $(top_builddir) && pwd` \ + here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH - -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -top_distdir = . -# Avoid unsightly `./'. -distdir = $(PACKAGE)-$(VERSION) - -GZIP_ENV = --best + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - -chmod -R a+w $(distdir) >/dev/null 2>&1; rm -rf $(distdir) + $(am__remove_distdir) mkdir $(distdir) - @for file in $(DISTFILES); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - $(mkinstalldirs) "$(distdir)/$$dir"; \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ fi; \ if test -d $$d/$$file; then \ - cp -pR $$d/$$file $(distdir) \ - || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done - for subdir in $(SUBDIRS); do \ + list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -d $(distdir)/$$subdir \ - || mkdir $(distdir)/$$subdir \ + test -d "$(distdir)/$$subdir" \ + || mkdir "$(distdir)/$$subdir" \ || exit 1; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" \ - distdir=../$(distdir)/$$subdir \ + top_distdir="../$(top_distdir)" \ + distdir="../$(distdir)/$$subdir" \ distdir) \ || exit 1; \ fi; \ @@ -303,47 +420,103 @@ distdir: $(DISTFILES) ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) -dist: distdir +dist-gzip: distdir + $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +dist-bzip2: distdir + $(AMTAR) chof - $(distdir) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-tarZ: distdir + $(AMTAR) chof - $(distdir) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - -chmod -R a+w $(distdir) >/dev/null 2>&1; rm -rf $(distdir) + $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist - -chmod -R a+w $(distdir) > /dev/null 2>&1; rm -rf $(distdir) - GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf - + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf - ;;\ + *.tar.bz2*) \ + bunzip2 -c $(distdir).tar.bz2 | $(AMTAR) xf - ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(AMTAR) xf - ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac chmod -R a-w $(distdir); chmod a+w $(distdir) - mkdir $(distdir)/=build - mkdir $(distdir)/=inst + mkdir $(distdir)/_build + mkdir $(distdir)/_inst chmod a-w $(distdir) - dc_install_base=`CDPATH=: && cd $(distdir)/=inst && pwd` \ - && cd $(distdir)/=build \ - && ../configure --srcdir=.. --prefix=$$dc_install_base \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && cd $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ - && (test `find $$dc_install_base -type f -print | wc -l` -le 1 \ - || (echo "Error: files left after uninstall" 1>&2; \ - exit 1) ) \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ - && $(MAKE) $(AM_MAKEFLAGS) distclean \ - && rm -f $(distdir).tar.gz \ - && (test `find . -type f -print | wc -l` -eq 0 \ - || (echo "Error: files left after distclean" 1>&2; \ - exit 1) ) - -chmod -R a+w $(distdir) > /dev/null 2>&1; rm -rf $(distdir) - @echo "$(distdir).tar.gz is ready for distribution" | \ - sed 'h;s/./=/g;p;x;p;x' + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' +distuninstallcheck: + @cd $(distuninstallcheck_dir) \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile config.h installdirs: installdirs-recursive installdirs-am: - install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive @@ -355,6 +528,7 @@ install-am: all-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: @@ -362,7 +536,7 @@ mostlyclean-generic: clean-generic: distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + -rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -371,18 +545,18 @@ clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am -dist-all: distdir - $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - -chmod -R a+w $(distdir) >/dev/null 2>&1; rm -rf $(distdir) distclean: distclean-recursive - -rm -f config.status config.cache config.log -distclean-am: clean-am distclean-generic distclean-hdr distclean-libtool \ - distclean-tags + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-hdr \ + distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: +html: html-recursive + info: info-recursive info-am: @@ -398,32 +572,41 @@ install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive - + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive -.PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \ - clean-generic clean-libtool clean-recursive dist dist-all \ - distcheck distclean distclean-generic distclean-hdr \ - distclean-libtool distclean-recursive distclean-tags distdir \ - dvi dvi-am dvi-recursive info info-am info-recursive install \ - install-am install-data install-data-am install-data-recursive \ - install-exec install-exec-am install-exec-recursive \ - install-info install-info-am install-info-recursive install-man \ - install-recursive install-strip installcheck installcheck-am \ - installdirs installdirs-am installdirs-recursive \ - maintainer-clean maintainer-clean-generic \ +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ + check-am clean clean-generic clean-libtool clean-recursive \ + ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ + dist-shar dist-tarZ dist-zip distcheck distclean \ + distclean-generic distclean-hdr distclean-libtool \ + distclean-recursive distclean-tags distcleancheck distdir \ + distuninstallcheck dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ maintainer-clean-recursive mostlyclean mostlyclean-generic \ - mostlyclean-libtool mostlyclean-recursive tags tags-recursive \ - uninstall uninstall-am uninstall-info-am \ - uninstall-info-recursive uninstall-recursive + mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \ + tags tags-recursive uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/aclocal.m4 b/aclocal.m4 index f71fa03eb..bd2fce950 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,6 +1,6 @@ -# aclocal.m4 generated automatically by aclocal 1.5 +# generated automatically by aclocal 1.8.4 -*- Autoconf -*- -# Copyright 1996, 1997, 1998, 1999, 2000, 2001 +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 # Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -11,581 +11,461 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. -# Do all the work for Automake. This macro actually does too much -- -# some checks are only needed if your package does certain things. -# But this isn't really a big deal. +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- -# serial 5 - -# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be -# written in clear, in which case automake, when reading aclocal.m4, -# will think it sees a *use*, and therefore will trigger all it's -# C support machinery. Also note that it means that autoscan, seeing -# CC etc. in the Makefile, will ask for an AC_PROG_CC use... +# serial 47 AC_PROG_LIBTOOL -# We require 2.13 because we rely on SHELL being computed by configure. -AC_PREREQ([2.13]) - # AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) # ----------------------------------------------------------- -# If MACRO-NAME is provided do IF-PROVIDED, else IF-NOT-PROVIDED. -# The purpose of this macro is to provide the user with a means to -# check macros which are provided without letting her know how the -# information is coded. # If this macro is not defined by Autoconf, define it here. -ifdef([AC_PROVIDE_IFELSE], - [], - [define([AC_PROVIDE_IFELSE], - [ifdef([AC_PROVIDE_$1], - [$2], [$3])])]) +m4_ifdef([AC_PROVIDE_IFELSE], + [], + [m4_define([AC_PROVIDE_IFELSE], + [m4_ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) -# AM_INIT_AUTOMAKE(PACKAGE,VERSION, [NO-DEFINE]) -# ---------------------------------------------- -AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_REQUIRE([AC_PROG_INSTALL])dnl -# test to see if srcdir already configured -if test "`CDPATH=:; cd $srcdir && pwd`" != "`pwd`" && - test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run \"make distclean\" there first]) -fi +# AC_PROG_LIBTOOL +# --------------- +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl +dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX +dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. + AC_PROVIDE_IFELSE([AC_PROG_CXX], + [AC_LIBTOOL_CXX], + [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX + ])]) +dnl And a similar setup for Fortran 77 support + AC_PROVIDE_IFELSE([AC_PROG_F77], + [AC_LIBTOOL_F77], + [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 +])]) -# Define the identity of the package. -PACKAGE=$1 -AC_SUBST(PACKAGE)dnl -VERSION=$2 -AC_SUBST(VERSION)dnl -ifelse([$3],, -[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) -AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])]) - -# Autoconf 2.50 wants to disallow AM_ names. We explicitly allow -# the ones we care about. -ifdef([m4_pattern_allow], - [m4_pattern_allow([^AM_[A-Z]+FLAGS])])dnl - -# Autoconf 2.50 always computes EXEEXT. However we need to be -# compatible with 2.13, for now. So we always define EXEEXT, but we -# don't compute it. -AC_SUBST(EXEEXT) -# Similar for OBJEXT -- only we only use OBJEXT if the user actually -# requests that it be used. This is a bit dumb. -: ${OBJEXT=o} -AC_SUBST(OBJEXT) +dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. +dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run +dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. + AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [ifdef([AC_PROG_GCJ], + [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([A][M_PROG_GCJ], + [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([LT_AC_PROG_GCJ], + [define([LT_AC_PROG_GCJ], + defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) +])])# AC_PROG_LIBTOOL -# Some tools Automake needs. -AC_REQUIRE([AM_SANITY_CHECK])dnl -AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG(ACLOCAL, aclocal) -AM_MISSING_PROG(AUTOCONF, autoconf) -AM_MISSING_PROG(AUTOMAKE, automake) -AM_MISSING_PROG(AUTOHEADER, autoheader) -AM_MISSING_PROG(MAKEINFO, makeinfo) -AM_MISSING_PROG(AMTAR, tar) -AM_PROG_INSTALL_SH -AM_PROG_INSTALL_STRIP -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([AC_PROG_MAKE_SET])dnl -AC_REQUIRE([AM_DEP_TRACK])dnl -AC_REQUIRE([AM_SET_DEPDIR])dnl -AC_PROVIDE_IFELSE([AC_PROG_][CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_][CC], - defn([AC_PROG_][CC])[_AM_DEPENDENCIES(CC)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_][CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_][CXX], - defn([AC_PROG_][CXX])[_AM_DEPENDENCIES(CXX)])])dnl -]) -# -# Check to make sure that the build environment is sane. -# +# _AC_PROG_LIBTOOL +# ---------------- +AC_DEFUN([_AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl +AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl +AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl +AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl -# serial 3 +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" -# AM_SANITY_CHECK -# --------------- -AC_DEFUN([AM_SANITY_CHECK], -[AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftest.file -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftest.file` - fi - rm -f conftest.file - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +])# _AC_PROG_LIBTOOL - test "$[2]" = conftest.file - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -AC_MSG_RESULT(yes)]) +# AC_LIBTOOL_SETUP +# ---------------- +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.50)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl -# serial 2 +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl -# AM_MISSING_PROG(NAME, PROGRAM) -# ------------------------------ -AC_DEFUN([AM_MISSING_PROG], -[AC_REQUIRE([AM_MISSING_HAS_RUN]) -$1=${$1-"${am_missing_run}$2"} -AC_SUBST($1)]) +AC_LIBTOOL_SYS_MAX_CMD_LEN +AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +AC_LIBTOOL_OBJDIR +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +_LT_AC_PROG_ECHO_BACKSLASH -# AM_MISSING_HAS_RUN -# ------------------ -# Define MISSING if not defined so far and test if it supports --run. -# If it does, set am_missing_run to use it, otherwise, to nothing. -AC_DEFUN([AM_MISSING_HAS_RUN], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - am_backtick='`' - AC_MSG_WARN([${am_backtick}missing' script is too old or missing]) -fi -]) +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac -# AM_AUX_DIR_EXPAND +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] -# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets -# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to -# `$srcdir', `$srcdir/..', or `$srcdir/../..'. -# -# Of course, Automake must honor this variable whenever it calls a -# tool from the auxiliary directory. The problem is that $srcdir (and -# therefore $ac_aux_dir as well) can be either absolute or relative, -# depending on how configure is run. This is pretty annoying, since -# it makes $ac_aux_dir quite unusable in subdirectories: in the top -# source directory, any form will work fine, but in subdirectories a -# relative path needs to be adjusted first. -# -# $ac_aux_dir/missing -# fails when called from a subdirectory if $ac_aux_dir is relative -# $top_srcdir/$ac_aux_dir/missing -# fails if $ac_aux_dir is absolute, -# fails when called from a subdirectory in a VPATH build with -# a relative $ac_aux_dir -# -# The reason of the latter failure is that $top_srcdir and $ac_aux_dir -# are both prefixed by $srcdir. In an in-source build this is usually -# harmless because $srcdir is `.', but things will broke when you -# start a VPATH build or use an absolute $srcdir. -# -# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, -# iff we strip the leading $srcdir from $ac_aux_dir. That would be: -# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` -# and then we would define $MISSING as -# MISSING="\${SHELL} $am_aux_dir/missing" -# This will work as long as MISSING is not called from configure, because -# unfortunately $(top_srcdir) has no meaning in configure. -# However there are other variables, like CC, which are often used in -# configure, and could therefore not use this "fixed" $ac_aux_dir. -# -# Another solution, used here, is to always expand $ac_aux_dir to an -# absolute PATH. The drawback is that using absolute paths prevent a -# configured tree to be moved without reconfiguration. +# Same as above, but do not quote variable references. +[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] -AC_DEFUN([AM_AUX_DIR_EXPAND], [ -# expand $ac_aux_dir to an absolute path -am_aux_dir=`CDPATH=:; cd $ac_aux_dir && pwd` -]) +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' -# AM_PROG_INSTALL_SH -# ------------------ -# Define $install_sh. -AC_DEFUN([AM_PROG_INSTALL_SH], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -install_sh=${install_sh-"$am_aux_dir/install-sh"} -AC_SUBST(install_sh)]) +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' -# One issue with vendor `install' (even GNU) is that you can't -# specify the program used to strip binaries. This is especially -# annoying in cross-compiling environments, where the build's strip -# is unlikely to handle the host's binaries. -# Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in `make install-strip', and initialize -# STRIPPROG with the value of the STRIP variable (set by the user). -AC_DEFUN([AM_PROG_INSTALL_STRIP], -[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" -AC_SUBST([INSTALL_STRIP_PROGRAM])]) +# Constants: +rm="rm -f" -# serial 4 -*- Autoconf -*- +# Global variables: +default_ofile=libtool +can_build_shared=yes +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" +AC_CHECK_TOOL(AR, ar, false) +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) -# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be -# written in clear, in which case automake, when reading aclocal.m4, -# will think it sees a *use*, and therefore will trigger all it's -# C support machinery. Also note that it means that autoscan, seeing -# CC etc. in the Makefile, will ask for an AC_PROG_CC use... +old_CC="$CC" +old_CFLAGS="$CFLAGS" +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= -# _AM_DEPENDENCIES(NAME) -# --------------------- -# See how the compiler implements dependency checking. -# NAME is "CC", "CXX" or "OBJC". -# We try a few techniques and use that to set a single cache variable. -# -# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was -# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular -# dependency, and given that the user is not expected to run this macro, -# just rely on AC_PROG_CC. -AC_DEFUN([_AM_DEPENDENCIES], -[AC_REQUIRE([AM_SET_DEPDIR])dnl -AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl -AC_REQUIRE([AM_MAKE_INCLUDE])dnl -AC_REQUIRE([AM_DEP_TRACK])dnl +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi -ifelse([$1], CC, [depcc="$CC" am_compiler_list=], - [$1], CXX, [depcc="$CXX" am_compiler_list=], - [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'] - [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; +esac -AC_CACHE_CHECK([dependency style of $depcc], - [am_cv_$1_dependencies_compiler_type], -[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir +AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) - am_cv_$1_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` - fi - for depmode in $am_compiler_list; do - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - echo '#include "conftest.h"' > conftest.c - echo 'int i;' > conftest.h - echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf +AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - case $depmode in - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - none) break ;; - esac - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. - if depmode=$depmode \ - source=conftest.c object=conftest.o \ - depfile=conftest.Po tmpdepfile=conftest.TPo \ - $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 && - grep conftest.h conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - am_cv_$1_dependencies_compiler_type=$depmode - break - fi - done +AC_ARG_WITH([pic], + [AC_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) +test -z "$pic_mode" && pic_mode=default - cd .. - rm -rf conftest.dir -else - am_cv_$1_dependencies_compiler_type=none -fi -]) -$1DEPMODE="depmode=$am_cv_$1_dependencies_compiler_type" -AC_SUBST([$1DEPMODE]) -]) +# Use C for the default configuration in the libtool script +tagname= +AC_LIBTOOL_LANG_C_CONFIG +_LT_AC_TAGCONFIG +])# AC_LIBTOOL_SETUP -# AM_SET_DEPDIR -# ------------- -# Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES -AC_DEFUN([AM_SET_DEPDIR], -[rm -f .deps 2>/dev/null -mkdir .deps 2>/dev/null -if test -d .deps; then - DEPDIR=.deps -else - # MS-DOS does not allow filenames that begin with a dot. - DEPDIR=_deps -fi -rmdir .deps 2>/dev/null -AC_SUBST(DEPDIR) -]) +# _LT_AC_SYS_COMPILER +# ------------------- +AC_DEFUN([_LT_AC_SYS_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} -# AM_DEP_TRACK -# ------------ -AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE(dependency-tracking, -[ --disable-dependency-tracking Speeds up one-time builds - --enable-dependency-tracking Do not reject slow dependency extractors]) -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' -fi -AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -pushdef([subst], defn([AC_SUBST])) -subst(AMDEPBACKSLASH) -popdef([subst]) -]) +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_AC_SYS_COMPILER -# Generate code to set up dependency tracking. -# This macro should only be invoked once -- use via AC_REQUIRE. -# Usage: -# AM_OUTPUT_DEPENDENCY_COMMANDS -# -# This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each `.P' file that we will -# need in order to bootstrap the dependency handling code. -AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],[ -AC_OUTPUT_COMMANDS([ -test x"$AMDEP_TRUE" != x"" || -for mf in $CONFIG_FILES; do - case "$mf" in - Makefile) dirpart=.;; - */Makefile) dirpart=`echo "$mf" | sed -e 's|/[^/]*$||'`;; - *) continue;; - esac - grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue - # Extract the definition of DEP_FILES from the Makefile without - # running `make'. - DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` - test -z "$DEPDIR" && continue - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n -e '/^U = / s///p' < "$mf"` - test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" - # We invoke sed twice because it is the simplest approach to - # changing $(DEPDIR) to its actual value in the expansion. - for file in `sed -n -e ' - /^DEP_FILES = .*\\\\$/ { - s/^DEP_FILES = // - :loop - s/\\\\$// - p - n - /\\\\$/ b loop - p - } - /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`echo "$file" | sed -e 's|/[^/]*$||'` - $ac_aux_dir/mkinstalldirs "$dirpart/$fdir" > /dev/null 2>&1 - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done -done -], [AMDEP_TRUE="$AMDEP_TRUE" -ac_aux_dir="$ac_aux_dir"])]) +# _LT_AC_SYS_LIBPATH_AIX +# ---------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], +[AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_AC_SYS_LIBPATH_AIX -# AM_MAKE_INCLUDE() -# ----------------- -# Check to see how make treats includes. -AC_DEFUN([AM_MAKE_INCLUDE], -[am_make=${MAKE-make} -cat > confinc << 'END' -doit: - @echo done -END -# If we don't find an include directive, just comment out the code. -AC_MSG_CHECKING([for style of include used by $am_make]) -am__include='#' -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# We grep out `Entering directory' and `Leaving directory' -# messages which can occur if `w' ends up in MAKEFLAGS. -# In particular we don't look at `^make:' because GNU make might -# be invoked under some other name (usually "gmake"), in which -# case it prints its new name instead of `make'. -if test "`$am_make -s -f confmf 2> /dev/null | fgrep -v 'ing directory'`" = "done"; then - am__include=include - am__quote= - _am_result=GNU -fi -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then - am__include=.include - am__quote='"' - _am_result=BSD - fi -fi -AC_SUBST(am__include) -AC_SUBST(am__quote) -AC_MSG_RESULT($_am_result) -rm -f confinc confmf -]) -# serial 3 +# _LT_AC_SHELL_INIT(ARG) +# ---------------------- +AC_DEFUN([_LT_AC_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_AC_SHELL_INIT -# AM_CONDITIONAL(NAME, SHELL-CONDITION) -# ------------------------------------- -# Define a conditional. -# -# FIXME: Once using 2.50, use this: -# m4_match([$1], [^TRUE\|FALSE$], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_DEFUN([AM_CONDITIONAL], -[ifelse([$1], [TRUE], - [errprint(__file__:__line__: [$0: invalid condition: $1 -])dnl -m4exit(1)])dnl -ifelse([$1], [FALSE], - [errprint(__file__:__line__: [$0: invalid condition: $1 -])dnl -m4exit(1)])dnl -AC_SUBST([$1_TRUE]) -AC_SUBST([$1_FALSE]) -if $2; then - $1_TRUE= - $1_FALSE='#' -else - $1_TRUE='#' - $1_FALSE= -fi]) -# Add --enable-maintainer-mode option to configure. -# From Jim Meyering +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[_LT_AC_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} -# serial 1 +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac -AC_DEFUN([AM_MAINTAINER_MODE], -[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) - dnl maintainer-mode is disabled by default - AC_ARG_ENABLE(maintainer-mode, -[ --enable-maintainer-mode enable make rules and dependencies not useful - (and sometimes confusing) to the casual installer], - USE_MAINTAINER_MODE=$enableval, - USE_MAINTAINER_MODE=no) - AC_MSG_RESULT([$USE_MAINTAINER_MODE]) - AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes]) - MAINT=$MAINTAINER_MODE_TRUE - AC_SUBST(MAINT)dnl -] -) +echo=${ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi -# Actually configure libtool. ac_aux_dir is where install-sh is found. -CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \ -LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \ -LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \ -DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \ -${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \ -$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \ -|| AC_MSG_ERROR([libtool configure failed]) +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. -# Reload cache, that may have been modified by ltconfig -AC_CACHE_LOAD + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh" + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' -AC_SUBST(LIBTOOL)dnl + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done -# Redirect the config.log output again, so that the ltconfig log is not -# clobbered by the next message. -exec 5>>./config.log -]) + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi -AC_DEFUN(AC_LIBTOOL_SETUP, -[AC_PREREQ(2.13)dnl -AC_REQUIRE([AC_ENABLE_SHARED])dnl -AC_REQUIRE([AC_ENABLE_STATIC])dnl -AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -AC_REQUIRE([AC_PROG_RANLIB])dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_PROG_LD])dnl -AC_REQUIRE([AC_PROG_NM])dnl -AC_REQUIRE([AC_PROG_LN_S])dnl -dnl +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(ECHO) +])])# _LT_AC_PROG_ECHO_BACKSLASH -case "$target" in -NONE) lt_target="$host" ;; -*) lt_target="$target" ;; -esac -# Check for any special flags to pass to ltconfig. -libtool_flags="--cache-file=$cache_file" -test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared" -test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static" -test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install" -test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc" -test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld" -ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], -[libtool_flags="$libtool_flags --enable-dlopen"]) -ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], -[libtool_flags="$libtool_flags --enable-win32-dll"]) -AC_ARG_ENABLE(libtool-lock, - [ --disable-libtool-lock avoid locking (might break parallel builds)]) -test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock" -test x"$silent" = xyes && libtool_flags="$libtool_flags --silent" +# _LT_AC_LOCK +# ----------- +AC_DEFUN([_LT_AC_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. -case "$lt_target" in +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line __oline__ "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then - case "`/usr/bin/file conftest.o`" in + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; @@ -596,6 +476,49 @@ case "$lt_target" in LD="${LD-ld} -64" ;; esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac fi rm -rf conftest* ;; @@ -605,394 +528,6386 @@ case "$lt_target" in SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, - [AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])]) + [AC_LANG_PUSH(C) + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; - -ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], -[*-*-cygwin* | *-*-mingw*) +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; -]) + ]) esac -]) -# AC_LIBTOOL_DLOPEN - enable checks for dlopen support -AC_DEFUN(AC_LIBTOOL_DLOPEN, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])]) - -# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's -AC_DEFUN(AC_LIBTOOL_WIN32_DLL, [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])]) - -# AC_ENABLE_SHARED - implement the --enable-shared flag -# Usage: AC_ENABLE_SHARED[(DEFAULT)] -# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to -# `yes'. -AC_DEFUN(AC_ENABLE_SHARED, [dnl -define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE(shared, -changequote(<<, >>)dnl -<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT], -changequote([, ])dnl -[p=${PACKAGE-default} -case "$enableval" in -yes) enable_shared=yes ;; -no) enable_shared=no ;; -*) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac], -enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl -]) +need_locks="$enable_libtool_lock" -# AC_DISABLE_SHARED - set the default shared flag to --disable-shared -AC_DEFUN(AC_DISABLE_SHARED, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_SHARED(no)]) - -# AC_ENABLE_STATIC - implement the --enable-static flag -# Usage: AC_ENABLE_STATIC[(DEFAULT)] -# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to -# `yes'. -AC_DEFUN(AC_ENABLE_STATIC, [dnl -define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE(static, -changequote(<<, >>)dnl -<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT], -changequote([, ])dnl -[p=${PACKAGE-default} -case "$enableval" in -yes) enable_static=yes ;; -no) enable_static=no ;; -*) - enable_static=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac], -enable_static=AC_ENABLE_STATIC_DEFAULT)dnl +])# _LT_AC_LOCK + + +# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], +[AC_REQUIRE([LT_AC_PROG_SED]) +AC_CACHE_CHECK([$1], [$2], + [$2=no + ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + $2=yes + fi + fi + $rm conftest* ]) -# AC_DISABLE_STATIC - set the default static flag to --disable-static -AC_DEFUN(AC_DISABLE_STATIC, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_STATIC(no)]) - - -# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag -# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)] -# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to -# `yes'. -AC_DEFUN(AC_ENABLE_FAST_INSTALL, [dnl -define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE(fast-install, -changequote(<<, >>)dnl -<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT], -changequote([, ])dnl -[p=${PACKAGE-default} -case "$enableval" in -yes) enable_fast_install=yes ;; -no) enable_fast_install=no ;; -*) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac], -enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl +if test x"[$]$2" = xyes; then + ifelse([$5], , :, [$5]) +else + ifelse([$6], , :, [$6]) +fi +])# AC_LIBTOOL_COMPILER_OPTION + + +# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ------------------------------------------------------------ +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], +[AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + else + $2=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" ]) -# AC_ENABLE_FAST_INSTALL - set the default to --disable-fast-install -AC_DEFUN(AC_DISABLE_FAST_INSTALL, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_FAST_INSTALL(no)]) +if test x"[$]$2" = xyes; then + ifelse([$4], , :, [$4]) +else + ifelse([$5], , :, [$5]) +fi +])# AC_LIBTOOL_LINKER_OPTION -# AC_PROG_LD - find the path to the GNU or non-GNU linker -AC_DEFUN(AC_PROG_LD, -[AC_ARG_WITH(gnu-ld, -[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], -test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -ac_prog=ld -if test "$ac_cv_prog_gcc" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by GCC]) - ac_prog=`($CC -print-prog-name=ld) 2>&5` - case "$ac_prog" in - # Accept absolute paths. -changequote(,)dnl - [\\/]* | [A-Za-z]:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' -changequote([,])dnl - # Canonicalize the path of ld - ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld + +# AC_LIBTOOL_SYS_MAX_CMD_LEN +# -------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], +[# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while (test "X"`$CONFIG_SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` ;; esac -elif test "$with_gnu_ld" = yes; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL(ac_cv_path_LD, -[if test -z "$LD"; then - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - ac_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then - test "$with_gnu_ld" != no && break - else - test "$with_gnu_ld" != yes && break - fi - fi - done - IFS="$ac_save_ifs" -else - ac_cv_path_LD="$LD" # Let the user override the test with a path. -fi]) -LD="$ac_cv_path_LD" -if test -n "$LD"; then - AC_MSG_RESULT($LD) +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else - AC_MSG_RESULT(no) + AC_MSG_RESULT(none) fi -test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) -AC_PROG_LD_GNU -]) +])# AC_LIBTOOL_SYS_MAX_CMD_LEN -AC_DEFUN(AC_PROG_LD_GNU, -[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld, -[# I'd rather use --version here, but apparently some GNU ld's only accept -v. -if $LD -v 2>&1 &5; then - ac_cv_prog_gnu_ld=yes -else - ac_cv_prog_gnu_ld=no -fi]) + +# _LT_AC_CHECK_DLFCN +# -------------------- +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h)dnl +])# _LT_AC_CHECK_DLFCN + + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ------------------------------------------------------------------ +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_unknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_AC_TRY_DLOPEN_SELF + + +# AC_LIBTOOL_DLOPEN_SELF +# ------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +])# AC_LIBTOOL_DLOPEN_SELF + + +# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) +# --------------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler +AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* ]) +])# AC_LIBTOOL_PROG_CC_C_O -# AC_PROG_NM - find the path to a BSD-compatible name lister -AC_DEFUN(AC_PROG_NM, -[AC_MSG_CHECKING([for BSD-compatible nm]) -AC_CACHE_VAL(ac_cv_path_NM, -[if test -n "$NM"; then - # Let the user override the test. - ac_cv_path_NM="$NM" + +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) +# ----------------------------------------- +# Check to see if we can do hard links to lock some files if needed +AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], +[AC_REQUIRE([_LT_AC_LOCK])dnl + +hard_links="nottested" +if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" - for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - ac_cv_path_NM="$ac_dir/nm -B" - break - elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - ac_cv_path_NM="$ac_dir/nm -p" - break + need_locks=no +fi +])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS + + +# AC_LIBTOOL_OBJDIR +# ----------------- +AC_DEFUN([AC_LIBTOOL_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +])# AC_LIBTOOL_OBJDIR + + +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) +# ---------------------------------------------- +# Check hardcoding attributes. +AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_AC_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ + test -n "$_LT_AC_TAGVAR(runpath_var $1)" || \ + test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)"="Xyes" ; then + + # We can hardcode non-existant directories. + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_AC_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_AC_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_AC_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + + +# AC_LIBTOOL_SYS_LIB_STRIP +# ------------------------ +AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], +[striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) +fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +])# AC_LIBTOOL_SYS_LIB_STRIP + + +# AC_LIBTOOL_SYS_DYNAMIC_LINKER +# ----------------------------- +# PORTME Fill in your ld.so characteristics +AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], +[AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : else - ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags + can_build_shared=no fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm -fi]) -NM="$ac_cv_path_NM" -AC_MSG_RESULT([$NM]) -]) + shlibpath_var=LIBPATH + fi + ;; -# AC_CHECK_LIBM - check for math library -AC_DEFUN(AC_CHECK_LIBM, -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -LIBM= -case "$lt_target" in -*-*-beos* | *-*-cygwin*) - # These system don't have libm +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; -*-ncr-sysv4.3*) - AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") - AC_CHECK_LIB(m, main, LIBM="$LIBM -lm") + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH ;; -*) - AC_CHECK_LIB(m, main, LIBM="-lm") + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs ;; -esac -]) -# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for -# the libltdl convenience library, adds --enable-ltdl-convenience to -# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor -# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed -# to be `${top_builddir}/libltdl'. Make sure you start DIR with -# '${top_builddir}/' (note the single quotes!) if your package is not -# flat, and, if you're not using automake, define top_builddir as -# appropriate in the Makefiles. -AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl - case "$enable_ltdl_convenience" in - no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; - "") enable_ltdl_convenience=yes - ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; esac - LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdlc.la - INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl']) -]) + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; -# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for -# the libltdl installable library, and adds --enable-ltdl-install to -# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor -# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed -# to be `${top_builddir}/libltdl'. Make sure you start DIR with -# '${top_builddir}/' (note the single quotes!) if your package is not -# flat, and, if you're not using automake, define top_builddir as -# appropriate in the Makefiles. -# In the future, this macro may have to be called after AC_PROG_LIBTOOL. -AC_DEFUN(AC_LIBLTDL_INSTALLABLE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl - AC_CHECK_LIB(ltdl, main, - [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], - [if test x"$enable_ltdl_install" = xno; then - AC_MSG_WARN([libltdl not installed, but installation disabled]) - else - enable_ltdl_install=yes - fi - ]) - if test x"$enable_ltdl_install" = x"yes"; then - ac_configure_args="$ac_configure_args --enable-ltdl-install" - LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdl.la - INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl']) +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else - ac_configure_args="$ac_configure_args --enable-ltdl-install=no" - LIBLTDL="-lltdl" - INCLTDL= + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi -]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; -dnl old names -AC_DEFUN(AM_PROG_LIBTOOL, [indir([AC_PROG_LIBTOOL])])dnl -AC_DEFUN(AM_ENABLE_SHARED, [indir([AC_ENABLE_SHARED], $@)])dnl -AC_DEFUN(AM_ENABLE_STATIC, [indir([AC_ENABLE_STATIC], $@)])dnl -AC_DEFUN(AM_DISABLE_SHARED, [indir([AC_DISABLE_SHARED], $@)])dnl -AC_DEFUN(AM_DISABLE_STATIC, [indir([AC_DISABLE_STATIC], $@)])dnl -AC_DEFUN(AM_PROG_LD, [indir([AC_PROG_LD])])dnl -AC_DEFUN(AM_PROG_NM, [indir([AC_PROG_NM])])dnl +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; -dnl This is just to silence aclocal about the macro not being used -ifelse([AC_DISABLE_FAST_INSTALL])dnl +freebsd1*) + dynamic_linker=no + ;; -# Like AC_CONFIG_HEADER, but automatically create stamp file. +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; -# serial 3 +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; -# When config.status generates a header, we must update the stamp-h file. -# This file resides in the same directory as the config header -# that is generated. We must strip everything past the first ":", -# and everything past the last "/". - -AC_PREREQ([2.12]) - -AC_DEFUN([AM_CONFIG_HEADER], -[ifdef([AC_FOREACH],dnl - [dnl init our file count if it isn't already - m4_ifndef([_AM_Config_Header_Index], m4_define([_AM_Config_Header_Index], [0])) - dnl prepare to store our destination file list for use in config.status - AC_FOREACH([_AM_File], [$1], - [m4_pushdef([_AM_Dest], m4_patsubst(_AM_File, [:.*])) - m4_define([_AM_Config_Header_Index], m4_incr(_AM_Config_Header_Index)) - dnl and add it to the list of files AC keeps track of, along - dnl with our hook - AC_CONFIG_HEADERS(_AM_File, -dnl COMMANDS, [, INIT-CMDS] -[# update the timestamp -echo timestamp >"AS_ESCAPE(_AM_DIRNAME(]_AM_Dest[))/stamp-h]_AM_Config_Header_Index[" -][$2]m4_ifval([$3], [, [$3]]))dnl AC_CONFIG_HEADERS - m4_popdef([_AM_Dest])])],dnl -[AC_CONFIG_HEADER([$1]) - AC_OUTPUT_COMMANDS( - ifelse(patsubst([$1], [[^ ]], []), - [], - [test -z "$CONFIG_HEADERS" || echo timestamp >dnl - patsubst([$1], [^\([^:]*/\)?.*], [\1])stamp-h]),dnl -[am_indx=1 -for am_file in $1; do - case " \$CONFIG_HEADERS " in - *" \$am_file "*) - am_dir=\`echo \$am_file |sed 's%:.*%%;s%[^/]*\$%%'\` - if test -n "\$am_dir"; then - am_tmpdir=\`echo \$am_dir |sed 's%^\(/*\).*\$%\1%'\` - for am_subdir in \`echo \$am_dir |sed 's%/% %'\`; do - am_tmpdir=\$am_tmpdir\$am_subdir/ - if test ! -d \$am_tmpdir; then - mkdir \$am_tmpdir - fi - done +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi - echo timestamp > "\$am_dir"stamp-h\$am_indx + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac ;; esac - am_indx=\`expr \$am_indx + 1\` -done]) -])]) # AM_CONFIG_HEADER + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=yes + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no +])# AC_LIBTOOL_SYS_DYNAMIC_LINKER + + +# _LT_AC_TAGCONFIG +# ---------------- +AC_DEFUN([_LT_AC_TAGCONFIG], +[AC_ARG_WITH([tags], + [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], + [include additional configurations @<:@automatic@:>@])], + [tagnames="$withval"]) + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in + "") ;; + *) AC_MSG_ERROR([invalid tag name: $tagname]) + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && test "X$CXX" != "Xno"; then + AC_LIBTOOL_LANG_CXX_CONFIG + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + AC_LIBTOOL_LANG_F77_CONFIG + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + AC_LIBTOOL_LANG_GCJ_CONFIG + else + tagname="" + fi + ;; + + RC) + AC_LIBTOOL_LANG_RC_CONFIG + ;; + + *) + AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi +fi +])# _LT_AC_TAGCONFIG + -# _AM_DIRNAME(PATH) +# AC_LIBTOOL_DLOPEN # ----------------- -# Like AS_DIRNAME, only do it during macro expansion -AC_DEFUN([_AM_DIRNAME], - [m4_if(m4_regexp([$1], [^.*[^/]//*[^/][^/]*/*$]), -1, - m4_if(m4_regexp([$1], [^//\([^/]\|$\)]), -1, - m4_if(m4_regexp([$1], [^/.*]), -1, - [.], - m4_patsubst([$1], [^\(/\).*], [\1])), - m4_patsubst([$1], [^\(//\)\([^/].*\|$\)], [\1])), - m4_patsubst([$1], [^\(.*[^/]\)//*[^/][^/]*/*$], [\1]))[]dnl -]) # _AM_DIRNAME +# enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_DLOPEN -# AM_PROG_LEX -# Look for flex, lex or missing, then run AC_PROG_LEX and AC_DECL_YYTEXT -AC_DEFUN([AM_PROG_LEX], -[AC_REQUIRE([AM_MISSING_HAS_RUN]) -AC_CHECK_PROGS(LEX, flex lex, [${am_missing_run}flex]) -dnl AC_PROG_LEX -AC_DECL_YYTEXT]) +# AC_LIBTOOL_WIN32_DLL +# -------------------- +# declare package support for building win32 dll's +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_WIN32_DLL + + +# AC_ENABLE_SHARED([DEFAULT]) +# --------------------------- +# implement the --enable-shared flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([shared], + [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]AC_ENABLE_SHARED_DEFAULT) +])# AC_ENABLE_SHARED + + +# AC_DISABLE_SHARED +# ----------------- +#- set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no) +])# AC_DISABLE_SHARED + + +# AC_ENABLE_STATIC([DEFAULT]) +# --------------------------- +# implement the --enable-static flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([static], + [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]AC_ENABLE_STATIC_DEFAULT) +])# AC_ENABLE_STATIC + + +# AC_DISABLE_STATIC +# ----------------- +# set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no) +])# AC_DISABLE_STATIC + + +# AC_ENABLE_FAST_INSTALL([DEFAULT]) +# --------------------------------- +# implement the --enable-fast-install flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([fast-install], + [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) +])# AC_ENABLE_FAST_INSTALL + + +# AC_DISABLE_FAST_INSTALL +# ----------------------- +# set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no) +])# AC_DISABLE_FAST_INSTALL + + +# AC_LIBTOOL_PICMODE([MODE]) +# -------------------------- +# implement the --with-pic flag +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default) +])# AC_LIBTOOL_PICMODE + + +# AC_PROG_EGREP +# ------------- +# This is predefined starting with Autoconf 2.54, so this conditional +# definition can be removed once we require Autoconf 2.54 or later. +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], +[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], + [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi]) + EGREP=$ac_cv_prog_egrep + AC_SUBST([EGREP]) +])]) + + +# AC_PATH_TOOL_PREFIX +# ------------------- +# find a file program which can recognise shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +])# AC_PATH_TOOL_PREFIX + + +# AC_PATH_MAGIC +# ------------- +# find a file program which can recognise a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# AC_PATH_MAGIC + + +# AC_PROG_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH([gnu-ld], + [AC_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no]) +AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case "$host_cpu" in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux*) + case $host_cpu in + alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' + else + lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown +])# AC_DEPLIBS_CHECK_METHOD + + +# AC_PROG_NM +# ---------- +# find the pathname to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/${ac_tool_prefix}nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + esac + fi + done + IFS="$lt_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +])# AC_PROG_NM + + +# AC_CHECK_LIBM +# ------------- +# check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +])# AC_CHECK_LIBM + + +# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will +# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_CONVENIENCE + + +# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl installable library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided and an installed libltdl is not found, it is +# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' +# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single +# quotes!). If your package is not flat and you're not using automake, +# define top_builddir and top_srcdir appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, lt_dlinit, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_INSTALLABLE + + +# AC_LIBTOOL_CXX +# -------------- +# enable support for C++ libraries +AC_DEFUN([AC_LIBTOOL_CXX], +[AC_REQUIRE([_LT_AC_LANG_CXX]) +])# AC_LIBTOOL_CXX + + +# _LT_AC_LANG_CXX +# --------------- +AC_DEFUN([_LT_AC_LANG_CXX], +[AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) +])# _LT_AC_LANG_CXX + + +# AC_LIBTOOL_F77 +# -------------- +# enable support for Fortran 77 libraries +AC_DEFUN([AC_LIBTOOL_F77], +[AC_REQUIRE([_LT_AC_LANG_F77]) +])# AC_LIBTOOL_F77 + + +# _LT_AC_LANG_F77 +# --------------- +AC_DEFUN([_LT_AC_LANG_F77], +[AC_REQUIRE([AC_PROG_F77]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) +])# _LT_AC_LANG_F77 + + +# AC_LIBTOOL_GCJ +# -------------- +# enable support for GCJ libraries +AC_DEFUN([AC_LIBTOOL_GCJ], +[AC_REQUIRE([_LT_AC_LANG_GCJ]) +])# AC_LIBTOOL_GCJ + + +# _LT_AC_LANG_GCJ +# --------------- +AC_DEFUN([_LT_AC_LANG_GCJ], +[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], + [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], + [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], + [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) +])# _LT_AC_LANG_GCJ + + +# AC_LIBTOOL_RC +# -------------- +# enable support for Windows resource files +AC_DEFUN([AC_LIBTOOL_RC], +[AC_REQUIRE([LT_AC_PROG_RC]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) +])# AC_LIBTOOL_RC + + +# AC_LIBTOOL_LANG_C_CONFIG +# ------------------------ +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) +AC_DEFUN([_LT_AC_LANG_C_CONFIG], +[lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}\n' + +_LT_AC_SYS_COMPILER + +# +# Check for any special shared library compilation flags. +# +_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= +if test "$GCC" = no; then + case $host_os in + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' + ;; + esac +fi +if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then + AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) + if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[ ]]" >/dev/null; then : + else + AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) + _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no + fi +fi + + +# +# Check to make sure the static flag actually works. +# +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), + $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) + + +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) + +# Report which librarie types wil actually be built +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4* | aix5*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + darwin* | rhapsody*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_C_CONFIG + + +# AC_LIBTOOL_LANG_CXX_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) +AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], +[AC_LANG_PUSH(C++) +AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Dependencies to place before and after the object being linked: +_LT_AC_TAGVAR(predep_objects, $1)= +_LT_AC_TAGVAR(postdep_objects, $1)= +_LT_AC_TAGVAR(predeps, $1)= +_LT_AC_TAGVAR(postdeps, $1)= +_LT_AC_TAGVAR(compiler_lib_search_path, $1)= + +# Source file extension for C++ test sources. +ac_ext=cc + +# Object file extension for compiled C++ test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +else + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + AC_PROG_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +_LT_AC_TAGVAR(ld_shlibs, $1)=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + dgux*) + case $cc_basename in + ec++) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + ;; + gnu*) + ;; + hpux9*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case "$host_cpu" in + ia64*|hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + irix5* | irix6*) + case $cc_basename in + CC) + # SGI C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + linux*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc) + # Intel C++ + with_gnu_ld=yes + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + cxx) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + m88k*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + mvs*) + case $cc_basename in + cxx) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + osf3*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + sco*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + lcc) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +esac +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_AC_TAGVAR(GCC, $1)="$GXX" +_LT_AC_TAGVAR(LD, $1)="$LD" + +AC_LIBTOOL_POSTDEP_PREDEP($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +])# AC_LIBTOOL_LANG_CXX_CONFIG + +# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) +# ------------------------ +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile" +ifelse([$1], [], +[#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program 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 +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG], +[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + +# Is the compiler the GNU C compiler? +with_gcc=$_LT_AC_TAGVAR(GCC, $1) + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_[]_LT_AC_TAGVAR(LD, $1) + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) + +# Commands used to build and install a shared archive. +archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) +archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) +module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" + +# Set to yes if exported symbols are required. +always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) + +# The commands to list exported symbols. +export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) + +# Symbols that must always be exported. +include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) + +ifelse([$1],[], +[# ### END LIBTOOL CONFIG], +[# ### END LIBTOOL TAG CONFIG: $tagname]) + +__EOF__ + +ifelse([$1],[], [ + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +]) +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi +])# AC_LIBTOOL_CONFIG + + +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + +_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI + + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris* | sysv5*) + symcode='[[BDRT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[[]] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + + +# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) +# --------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], +[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) + ifelse([$1],[CXX],[ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC) + # KAI C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + icpc) + # Intel C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + cxx) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC) + # Rational C++ 2.4.1 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx) + # Digital/Compaq C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + sco*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + *) + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc) + # Lucid + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + unixware*) + ;; + vxworks*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + newsos6) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + ccc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' + ;; + + solaris*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sunos4*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + uts4*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then + AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), + [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" + ;; +esac +]) + + +# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) +# ------------------------------------ +# See if the linker supports building shared libraries. +AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], +[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +ifelse([$1],[CXX],[ + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +],[ + runpath_var= + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)= + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(hardcode_automatic, $1)=no + _LT_AC_TAGVAR(module_cmds, $1)= + _LT_AC_TAGVAR(module_expsym_cmds, $1)= + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_AC_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sunos4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="$tmp_archive_cmds" + fi + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + # see comment about different semantics on the GNU ld section + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + bsdi4*) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes ; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + dgux*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + openbsd*) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4.2uw2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv5*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_AC_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac +])# AC_LIBTOOL_PROG_LD_SHLIBS + + +# _LT_AC_FILE_LTDLL_C +# ------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ +])# _LT_AC_FILE_LTDLL_C + + +# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) +# --------------------------------- +AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) + + +# old names +AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) +AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) +AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) + +# This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL]) + +AC_DEFUN([LT_AC_PROG_GCJ], +[AC_CHECK_TOOL(GCJ, gcj, no) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS) +]) + +AC_DEFUN([LT_AC_PROG_RC], +[AC_CHECK_TOOL(RC, windres, no) +]) + +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +# LT_AC_PROG_SED +# -------------- +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +AC_DEFUN([LT_AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && break + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +SED=$lt_cv_path_SED +]) +AC_MSG_RESULT([$SED]) +]) + +# -*- Autoconf -*- +# Copyright (C) 2002, 2003 Free Software Foundation, Inc. +# Generated from amversion.in; do not edit by hand. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.8"]) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION so it can be traced. +# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], + [AM_AUTOMAKE_VERSION([1.8.4])]) + +# AM_AUX_DIR_EXPAND + +# Copyright (C) 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 6 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE]) +AC_SUBST([$1_FALSE]) +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]) +fi])]) + +# serial 7 -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH]) +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +#serial 2 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + grep '^DEP_FILES *= *[[^ @%:@]]' < "$mf" > /dev/null || continue + # Extract the definition of DEP_FILES from the Makefile without + # running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" + # We invoke sed twice because it is the simplest approach to + # changing $(DEPDIR) to its actual value in the expansion. + for file in `sed -n ' + /^DEP_FILES = .*\\\\$/ { + s/^DEP_FILES = // + :loop + s/\\\\$// + p + n + /\\\\$/ b loop + p + } + /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Like AC_CONFIG_HEADER, but automatically create stamp file. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 7 + +# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. +AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) + +# Do all the work for Automake. -*- Autoconf -*- + +# This macro actually does too much some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 11 + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.58])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_MISSING_PROG(AMTAR, tar) +AM_PROG_INSTALL_SH +AM_PROG_INSTALL_STRIP +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl + +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +]) +]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $1 | $1:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. + +# Copyright (C) 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +install_sh=${install_sh-"$am_aux_dir/install-sh"} +AC_SUBST(install_sh)]) + +# -*- Autoconf -*- +# Copyright (C) 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 1 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + + +# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 4 + +# AM_PROG_LEX +# ----------- +# Autoconf leaves LEX=: if lex or flex can't be found. Change that to a +# "missing" invocation, for better error output. +AC_DEFUN([AM_PROG_LEX], +[AC_PREREQ(2.50)dnl +AC_REQUIRE([AM_MISSING_HAS_RUN])dnl +AC_REQUIRE([AC_PROG_LEX])dnl +if test "$LEX" = :; then + LEX=${am_missing_run}flex +fi]) + +# Add --enable-maintainer-mode option to configure. +# From Jim Meyering + +# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +AC_DEFUN([AM_MAINTAINER_MODE], +[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode is disabled by default + AC_ARG_ENABLE(maintainer-mode, +[ --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer], + USE_MAINTAINER_MODE=$enableval, + USE_MAINTAINER_MODE=no) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST(MAINT)dnl +] +) + +AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 2 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# -*- Autoconf -*- + + +# Copyright (C) 1997, 1999, 2000, 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# AM_PROG_MKDIR_P +# --------------- +# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. + +# Copyright (C) 2003, 2004 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories +# created by `make install' are always world readable, even if the +# installer happens to have an overly restrictive umask (e.g. 077). +# This was a mistake. There are at least two reasons why we must not +# use `-m 0755': +# - it causes special bits like SGID to be ignored, +# - it may be too restrictive (some setups expect 775 directories). +# +# Do not use -m 0755 and let people choose whatever they expect by +# setting umask. +# +# We cannot accept any implementation of `mkdir' that recognizes `-p'. +# Some implementations (such as Solaris 8's) are not thread-safe: if a +# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' +# concurrently, both version can detect that a/ is missing, but only +# one can create it and the other will error out. Consequently we +# restrict ourselves to GNU make (using the --version option ensures +# this.) +AC_DEFUN([AM_PROG_MKDIR_P], +[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + # Keeping the `.' argument allows $(mkdir_p) to be used without + # argument. Indeed, we sometimes output rules like + # $(mkdir_p) $(somedir) + # where $(somedir) is conditionally defined. + # (`test -n '$(somedir)' && $(mkdir_p) $(somedir)' is a more + # expensive solution, as it forces Make to start a sub-shell.) + mkdir_p='mkdir -p -- .' +else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + for d in ./-p ./--version; + do + test -d $d && rmdir $d + done + # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. + if test -f "$ac_aux_dir/mkinstalldirs"; then + mkdir_p='$(mkinstalldirs)' + else + mkdir_p='$(install_sh) -d' + fi +fi +AC_SUBST([mkdir_p])]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 2 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# +# Check to make sure that the build environment is sane. +# + +# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# AM_PROG_INSTALL_STRIP + +# Copyright (C) 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) diff --git a/asn1c/Makefile.in b/asn1c/Makefile.in index 6b7805bc0..bd958e644 100644 --- a/asn1c/Makefile.in +++ b/asn1c/Makefile.in @@ -1,7 +1,8 @@ -# Makefile.in generated automatically by automake 1.5 from Makefile.am. +# Makefile.in generated by automake 1.8.4 from Makefile.am. +# @configure_input@ -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -13,83 +14,188 @@ @SET_MAKE@ -SHELL = @SHELL@ +SOURCES = asn1c.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) -transform = @program_transform_name@ +transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_alias = @build_alias@ build_triplet = @build@ -host_alias = @host_alias@ host_triplet = @host@ -target_alias = @target_alias@ target_triplet = @target@ +bin_PROGRAMS = asn1c$(EXEEXT) +subdir = asn1c +DIST_COMMON = README $(dist_man1_MANS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +PROGRAMS = $(bin_PROGRAMS) +asn1c_SOURCES = asn1c.c +asn1c_OBJECTS = asn1c.$(OBJEXT) +asn1c_LDADD = $(LDADD) +asn1c_DEPENDENCIES = ${top_builddir}/libasn1parser/libasn1parser.la \ + ${top_builddir}/libasn1fix/libasn1fix.la \ + ${top_builddir}/libasn1print/libasn1print.la \ + ${top_builddir}/libasn1compiler/libasn1compiler.la +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/asn1c.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = asn1c.c +DIST_SOURCES = asn1c.c +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(dist_man1_MANS) +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ ADD_CFLAGS = @ADD_CFLAGS@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ -AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ -OBJDUMP = @OBJDUMP@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ PATH = @PATH@ +PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ +am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ install_sh = @install_sh@ - +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ SUBDIRS = . tests - AM_CFLAGS = @ADD_CFLAGS@ AM_CPPFLAGS = \ -I${top_srcdir}/libasn1compiler \ @@ -98,149 +204,126 @@ AM_CPPFLAGS = \ -I${top_srcdir}/libasn1fix \ -DDATADIR=\"${pkgdatadir}\" - LDADD = \ ${top_builddir}/libasn1parser/libasn1parser.la \ ${top_builddir}/libasn1fix/libasn1fix.la \ ${top_builddir}/libasn1print/libasn1print.la \ ${top_builddir}/libasn1compiler/libasn1compiler.la - -bin_PROGRAMS = asn1c - dist_man1_MANS = asn1c.1 - check_SCRIPTS = check-parsing.sh TESTS = check-parsing.sh EXTRA_DIST = check-parsing.sh CLEANFILES = .check-parsing.*.tmp -subdir = asn1c -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -bin_PROGRAMS = asn1c$(EXEEXT) -PROGRAMS = $(bin_PROGRAMS) - -asn1c_SOURCES = asn1c.c -asn1c_OBJECTS = asn1c.$(OBJEXT) -asn1c_LDADD = $(LDADD) -asn1c_DEPENDENCIES = ${top_builddir}/libasn1parser/libasn1parser.la \ - ${top_builddir}/libasn1fix/libasn1fix.la \ - ${top_builddir}/libasn1print/libasn1print.la \ - ${top_builddir}/libasn1compiler/libasn1compiler.la -asn1c_LDFLAGS = - -DEFS = @DEFS@ -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/asn1c.Po -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ - $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -CFLAGS = @CFLAGS@ -DIST_SOURCES = asn1c.c - -NROFF = nroff -MANS = $(dist_man1_MANS) - -RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \ - uninstall-info-recursive all-recursive install-data-recursive \ - install-exec-recursive installdirs-recursive install-recursive \ - uninstall-recursive check-recursive installcheck-recursive -DIST_COMMON = README $(dist_man1_MANS) Makefile.am Makefile.in -DIST_SUBDIRS = $(SUBDIRS) -SOURCES = asn1c.c - all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu asn1c/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu asn1c/Makefile -Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) && \ - CONFIG_HEADERS= CONFIG_LINKS= \ - CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - $(mkinstalldirs) $(DESTDIR)$(bindir) + test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ || test -f $$p1 \ ; then \ - f=`echo $$p1|sed '$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$f"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$f; \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f $(DESTDIR)$(bindir)/$$f"; \ - rm -f $(DESTDIR)$(bindir)/$$f; \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ + rm -f "$(DESTDIR)$(bindir)/$$f"; \ done clean-binPROGRAMS: - -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done asn1c$(EXEEXT): $(asn1c_OBJECTS) $(asn1c_DEPENDENCIES) @rm -f asn1c$(EXEEXT) $(LINK) $(asn1c_LDFLAGS) $(asn1c_OBJECTS) $(asn1c_LDADD) $(LIBS) mostlyclean-compile: - -rm -f *.$(OBJEXT) core *.core + -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1c.Po@am__quote@ - -distclean-depend: - -rm -rf $(DEPDIR) +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c.Po@am__quote@ .c.o: -@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: -@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(COMPILE) -c `cygpath -w $<` +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: -@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< -CCDEPMODE = @CCDEPMODE@ -uninstall-info-am: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< -man1dir = $(mandir)/man1 +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) - $(mkinstalldirs) $(DESTDIR)$(man1dir) + test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ @@ -252,11 +335,15 @@ install-man1: $(man1_MANS) $(man_MANS) if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 1*) ;; \ + *) ext='1' ;; \ + esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \ - $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ done uninstall-man1: @$(NORMAL_UNINSTALL) @@ -269,11 +356,15 @@ uninstall-man1: done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 1*) ;; \ + *) ext='1' ;; \ + esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \ - rm -f $(DESTDIR)$(man1dir)/$$inst; \ + echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ + rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ done # This directory's subdirectories are mostly independent; you can cd @@ -283,7 +374,7 @@ uninstall-man1: # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): - @set fnord $(MAKEFLAGS); amf=$$2; \ + @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ @@ -303,7 +394,7 @@ $(RECURSIVE_TARGETS): mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: - @set fnord $(MAKEFLAGS); amf=$$2; \ + @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ @@ -330,46 +421,74 @@ tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done - -tags: TAGS +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - mkid -fID $$unique $(LISP) + mkid -fID $$unique +tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ + test -f $$subdir/TAGS && \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ - || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -z "$$unique" && unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique GTAGS: - here=`CDPATH=: && cd $(top_builddir) && pwd` \ + here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; \ + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ @@ -381,26 +500,29 @@ check-TESTS: $(TESTS) all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - echo "XPASS: $$tst"; \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ ;; \ *) \ - echo "PASS: $$tst"; \ + echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ - xfail=`expr $$xfail + 1`; \ - echo "XFAIL: $$tst"; \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ ;; \ *) \ - failed=`expr $$failed + 1`; \ - echo "FAIL: $$tst"; \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ ;; \ esac; \ + else \ + skip=`expr $$skip + 1`; \ + echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ @@ -416,43 +538,64 @@ check-TESTS: $(TESTS) banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + skipped="($$skip tests were not run)"; \ + test `echo "$$skipped" | wc -c` -gt `echo "$$banner" | wc -c` && \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -gt `echo "$$banner" | wc -c` && \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ + test -n "$$skipped" && echo "$$skipped"; \ + test -n "$$report" && echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ - fi - -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -top_distdir = .. -distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + else :; fi distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - $(mkinstalldirs) "$(distdir)/$$dir"; \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ fi; \ if test -d $$d/$$file; then \ - cp -pR $$d/$$file $(distdir) \ - || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done - for subdir in $(SUBDIRS); do \ + list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -d $(distdir)/$$subdir \ - || mkdir $(distdir)/$$subdir \ + test -d "$(distdir)/$$subdir" \ + || mkdir "$(distdir)/$$subdir" \ || exit 1; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" \ - distdir=../$(distdir)/$$subdir \ + top_distdir="../$(top_distdir)" \ + distdir="../$(distdir)/$$subdir" \ distdir) \ || exit 1; \ fi; \ @@ -464,8 +607,9 @@ check: check-recursive all-am: Makefile $(PROGRAMS) $(MANS) installdirs: installdirs-recursive installdirs-am: - $(mkinstalldirs) $(DESTDIR)$(bindir) $(DESTDIR)$(man1dir) - + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive @@ -477,6 +621,7 @@ install-am: all-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: @@ -485,7 +630,7 @@ clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + -rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -495,14 +640,17 @@ clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive - -distclean-am: clean-am distclean-compile distclean-depend \ - distclean-generic distclean-libtool distclean-tags + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: +html: html-recursive + info: info-recursive info-am: @@ -518,7 +666,8 @@ install-man: install-man1 installcheck-am: maintainer-clean: maintainer-clean-recursive - + -rm -rf ./$(DEPDIR) + -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive @@ -526,30 +675,35 @@ mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + uninstall-am: uninstall-binPROGRAMS uninstall-info-am uninstall-man uninstall-info: uninstall-info-recursive uninstall-man: uninstall-man1 -.PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-TESTS check-am \ - clean clean-binPROGRAMS clean-generic clean-libtool \ - clean-recursive distclean distclean-compile distclean-depend \ - distclean-generic distclean-libtool distclean-recursive \ - distclean-tags distdir dvi dvi-am dvi-recursive info info-am \ - info-recursive install install-am install-binPROGRAMS \ - install-data install-data-am install-data-recursive \ - install-exec install-exec-am install-exec-recursive \ - install-info install-info-am install-info-recursive install-man \ - install-man1 install-recursive install-strip installcheck \ - installcheck-am installdirs installdirs-am \ - installdirs-recursive maintainer-clean maintainer-clean-generic \ +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-TESTS \ + check-am clean clean-binPROGRAMS clean-generic clean-libtool \ + clean-recursive ctags ctags-recursive distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-recursive distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-exec install-exec-am \ + install-info install-info-am install-man install-man1 \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ maintainer-clean-recursive mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool mostlyclean-recursive \ - tags tags-recursive uninstall uninstall-am \ - uninstall-binPROGRAMS uninstall-info-am \ - uninstall-info-recursive uninstall-man uninstall-man1 \ - uninstall-recursive + pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-info-am uninstall-man \ + uninstall-man1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/asn1c/tests/Makefile.in b/asn1c/tests/Makefile.in index 6689049c8..fe884ca15 100644 --- a/asn1c/tests/Makefile.in +++ b/asn1c/tests/Makefile.in @@ -1,7 +1,8 @@ -# Makefile.in generated automatically by automake 1.5 from Makefile.am. +# Makefile.in generated by automake 1.8.4 from Makefile.am. +# @configure_input@ -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -12,97 +13,185 @@ # PARTICULAR PURPOSE. @SET_MAKE@ - -SHELL = @SHELL@ - srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) -transform = @program_transform_name@ +transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_alias = @build_alias@ build_triplet = @build@ -host_alias = @host_alias@ host_triplet = @host@ -target_alias = @target_alias@ target_triplet = @target@ +subdir = asn1c/tests +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ ADD_CFLAGS = @ADD_CFLAGS@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ -AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ -OBJDUMP = @OBJDUMP@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ PATH = @PATH@ +PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ +am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ install_sh = @install_sh@ - +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ check_SCRIPTS = ./check-assembly.sh - TESTS_ENVIRONMENT = ./check-assembly.sh TESTS = check-*.c - EXTRA_DIST = ${check_SCRIPTS} check-*.c -subdir = asn1c/tests -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -DIST_SOURCES = -DIST_COMMON = README Makefile.am Makefile.in all: all-am .SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu asn1c/tests/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu asn1c/tests/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo @@ -112,20 +201,16 @@ clean-libtool: distclean-libtool: -rm -f libtool -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu asn1c/tests/Makefile -Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) && \ - CONFIG_HEADERS= CONFIG_LINKS= \ - CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: tags: TAGS TAGS: +ctags: CTAGS +CTAGS: + check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; \ + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ @@ -137,26 +222,29 @@ check-TESTS: $(TESTS) all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - echo "XPASS: $$tst"; \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ ;; \ *) \ - echo "PASS: $$tst"; \ + echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ - xfail=`expr $$xfail + 1`; \ - echo "XFAIL: $$tst"; \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ ;; \ *) \ - failed=`expr $$failed + 1`; \ - echo "FAIL: $$tst"; \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ ;; \ esac; \ + else \ + skip=`expr $$skip + 1`; \ + echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ @@ -172,28 +260,49 @@ check-TESTS: $(TESTS) banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + skipped="($$skip tests were not run)"; \ + test `echo "$$skipped" | wc -c` -gt `echo "$$banner" | wc -c` && \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -gt `echo "$$banner" | wc -c` && \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ + test -n "$$skipped" && echo "$$skipped"; \ + test -n "$$report" && echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ - fi - -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -top_distdir = ../.. -distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + else :; fi distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - $(mkinstalldirs) "$(distdir)/$$dir"; \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ fi; \ if test -d $$d/$$file; then \ - cp -pR $$d/$$file $(distdir) \ - || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ @@ -205,9 +314,7 @@ check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile - installdirs: - install: install-am install-exec: install-exec-am install-data: install-data-am @@ -219,6 +326,7 @@ install-am: all-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: @@ -226,23 +334,23 @@ mostlyclean-generic: clean-generic: distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + -rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am - + -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool dvi: dvi-am dvi-am: +html: html-am + info: info-am info-am: @@ -258,23 +366,32 @@ install-man: installcheck-am: maintainer-clean: maintainer-clean-am - + -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + uninstall-am: uninstall-info-am .PHONY: all all-am check check-TESTS check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ - distdir dvi dvi-am info info-am install install-am install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-man install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool uninstall uninstall-am uninstall-info-am + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + uninstall uninstall-am uninstall-info-am clean: diff --git a/config.guess b/config.guess index cd430f6d1..51fab4770 100755 --- a/config.guess +++ b/config.guess @@ -1,9 +1,9 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003 Free Software Foundation, Inc. -timestamp='2001-08-21' +timestamp='2004-03-12' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -24,8 +24,9 @@ timestamp='2001-08-21' # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. -# Written by Per Bothner . -# Please send patches to . +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and @@ -87,30 +88,42 @@ if test $# != 0; then exit 1 fi +trap 'exit 1' 1 2 15 -dummy=dummy-$$ -trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15 +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. -# CC_FOR_BUILD -- compiler used by this script. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. -set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int dummy(){}" > $dummy.c ; - for c in cc gcc c89 ; do - ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ; - if test $? = 0 ; then +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; - rm -f $dummy.c $dummy.o $dummy.rel ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac' +esac ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) @@ -127,29 +140,30 @@ UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) - # Netbsd (nbsd) targets should (where applicable) match one or + # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. - # Determine the machine/vendor (is the vendor relevant). - case "${UNAME_MACHINE}" in - amiga) machine=m68k-unknown ;; - arm32) machine=arm-unknown ;; - atari*) machine=m68k-atari ;; - sun3*) machine=m68k-sun ;; - mac68k) machine=m68k-apple ;; - macppc) machine=powerpc-apple ;; - hp3[0-9][05]) machine=m68k-hp ;; - ibmrt|romp-ibm) machine=romp-ibm ;; - *) machine=${UNAME_MACHINE}-unknown ;; + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. - case "${UNAME_MACHINE}" in - i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k) + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null @@ -166,74 +180,135 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ;; esac # The OS release - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit 0 ;; + amd64:OpenBSD:*:*) + echo x86_64-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + cats:OpenBSD:*:*) + echo arm-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + macppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvmeppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pegasos:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mipseb-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit 0 ;; + macppc:MirBSD:*:*) + echo powerppc-unknown-mirbsd${UNAME_RELEASE} + exit 0 ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit 0 ;; alpha:OSF1:*:*) - if test $UNAME_RELEASE = "V4.0"; then + case $UNAME_RELEASE in + *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - fi + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - cat <$dummy.s - .data -\$Lformat: - .byte 37,100,45,37,120,10,0 # "%d-%x\n" - - .text - .globl main - .align 4 - .ent main -main: - .frame \$30,16,\$26,0 - ldgp \$29,0(\$27) - .prologue 1 - .long 0x47e03d80 # implver \$0 - lda \$2,-1 - .long 0x47e20c21 # amask \$2,\$1 - lda \$16,\$Lformat - mov \$0,\$17 - not \$1,\$18 - jsr \$26,printf - ldgp \$29,0(\$26) - mov 0,\$16 - jsr \$26,exit - .end main -EOF - eval $set_cc_for_build - $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null - if test "$?" = 0 ; then - case `./$dummy` in - 0-0) - UNAME_MACHINE="alpha" - ;; - 1-0) - UNAME_MACHINE="alphaev5" - ;; - 1-1) - UNAME_MACHINE="alphaev56" - ;; - 1-101) - UNAME_MACHINE="alphapca56" - ;; - 2-303) - UNAME_MACHINE="alphaev6" - ;; - 2-307) - UNAME_MACHINE="alphaev67" - ;; - 2-1307) - UNAME_MACHINE="alphaev68" - ;; - esac - fi - rm -f $dummy.s $dummy - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha*:OpenVMS:*:*) + echo alpha-hp-vms exit 0 ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? @@ -247,33 +322,18 @@ EOF Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit 0;; - amiga:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit 0 ;; - arc64:OpenBSD:*:*) - echo mips64el-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - arc:OpenBSD:*:*) - echo mipsel-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - hkmips:OpenBSD:*:*) - echo mips-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - pmax:OpenBSD:*:*) - echo mipsel-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - sgi:OpenBSD:*:*) - echo mips-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - wgrisc:OpenBSD:*:*) - echo mipsel-unknown-openbsd${UNAME_RELEASE} + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; @@ -291,6 +351,13 @@ EOF NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit 0 ;; + DRS?6000:UNIX_SV:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7 && exit 0 ;; + esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; @@ -319,7 +386,7 @@ EOF echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; sun*:*:4.2BSD:*) - UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) @@ -333,12 +400,6 @@ EOF aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; - sparc*:NetBSD:*) - echo `uname -p`-unknown-netbsd${UNAME_RELEASE} - exit 0 ;; - atari*:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor @@ -365,17 +426,8 @@ EOF *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; - sun3*:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - mac68k:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - mvme68k:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - mvme88k:OpenBSD:*:*) - echo m88k-unknown-openbsd${UNAME_RELEASE} + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} @@ -393,6 +445,7 @@ EOF echo clipper-intergraph-clix${UNAME_RELEASE} exit 0 ;; mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ @@ -414,16 +467,20 @@ EOF exit (-1); } EOF - eval $set_cc_for_build - $CC_FOR_BUILD $dummy.c -o $dummy \ - && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ - && rm -f $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy + $CC_FOR_BUILD -o $dummy $dummy.c \ + && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && exit 0 echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit 0 ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; @@ -484,6 +541,7 @@ EOF exit 0 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include @@ -495,9 +553,7 @@ EOF exit(0); } EOF - eval $set_cc_for_build - $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo rs6000-ibm-aix3.2.5 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 @@ -506,7 +562,7 @@ EOF fi exit 0 ;; *:AIX:*:[45]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'` + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else @@ -546,10 +602,8 @@ EOF 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) - case "${HPUX_REV}" in - 11.[0-9][0-9]) - if [ -x /usr/bin/getconf ]; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 @@ -558,12 +612,13 @@ EOF case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac - fi ;; - esac - if [ "${HP_ARCH}" = "" ]; then - sed 's/^ //' << EOF >$dummy.c + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include @@ -596,12 +651,21 @@ EOF exit (0); } EOF - eval $set_cc_for_build - (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` - if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi - rm -f $dummy.c $dummy - fi ;; + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + # avoid double evaluation of $set_cc_for_build + test -n "$CC_FOR_BUILD" || eval $set_cc_for_build + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; ia64:HP-UX:*:*) @@ -609,6 +673,7 @@ EOF echo ia64-hp-hpux${HPUX_REV} exit 0 ;; 3050*:HI-UX:*:*) + eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int @@ -634,9 +699,7 @@ EOF exit (0); } EOF - eval $set_cc_for_build - $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) @@ -664,9 +727,6 @@ EOF parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; - hppa*:OpenBSD:*:*) - echo hppa-unknown-openbsd - exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; @@ -685,9 +745,6 @@ EOF C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; - CRAY*X-MP:*:*:*) - echo xmp-cray-unicos - exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; @@ -700,26 +757,25 @@ EOF CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; - CRAY*T3D:*:*:*) - echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; - CRAY-2:*:*:*) - echo cray2-cray-unicos - exit 0 ;; + *:UNICOS/mp:*:*) + echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; - hp300:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} @@ -731,10 +787,21 @@ EOF echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*) - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit 0 ;; - *:OpenBSD:*:*) - echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + # Determine whether the default compiler uses glibc. + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #if __GLIBC__ >= 2 + LIBC=gnu + #else + LIBC= + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + # GNU/KFreeBSD systems have a "k" prefix to indicate we are using + # FreeBSD's kernel, but not the complete OS. + case ${LIBC} in gnu) kernel_only='k' ;; esac + echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin @@ -745,11 +812,17 @@ EOF i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit 0 ;; + x86:Interix*:[34]*) + echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' + exit 0 ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit 0 ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? - echo i386-pc-interix + echo i586-pc-interix exit 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin @@ -761,25 +834,68 @@ EOF echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) + # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit 0 ;; ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; mips:Linux:*:*) - case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in - big) echo mips-unknown-linux-gnu && exit 0 ;; - little) echo mipsel-unknown-linux-gnu && exit 0 ;; - esac + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu @@ -815,6 +931,9 @@ EOF s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit 0 ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; @@ -828,7 +947,8 @@ EOF # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. - ld_supported_targets=`cd /; ld --help 2>&1 \ + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// @@ -840,7 +960,7 @@ EOF ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" - exit 0 ;; + exit 0 ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit 0 ;; @@ -851,33 +971,32 @@ EOF exit 0 ;; esac # Determine whether the default compiler is a.out or elf - cat >$dummy.c < -#ifdef __cplusplus -#include /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif -#ifdef __ELF__ -# ifdef __GLIBC__ -# if __GLIBC__ >= 2 - printf ("%s-pc-linux-gnu\n", argv[1]); -# else - printf ("%s-pc-linux-gnulibc1\n", argv[1]); -# endif -# else - printf ("%s-pc-linux-gnulibc1\n", argv[1]); -# endif -#else - printf ("%s-pc-linux-gnuaout\n", argv[1]); -#endif - return 0; -} -EOF eval $set_cc_for_build - $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #ifdef __INTEL_COMPILER + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; i*86:DYNIX/ptx:4*:*) @@ -894,6 +1013,26 @@ EOF # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit 0 ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit 0 ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit 0 ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit 0 ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit 0 ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then @@ -915,22 +1054,19 @@ EOF UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` - (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 - (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 - (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit 0 ;; - i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit 0 ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about @@ -954,9 +1090,15 @@ EOF # "miniframe" echo m68010-convergent-sysv exit 0 ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit 0 ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit 0 ;; M68*:*:R3V[567]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; - 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` @@ -973,9 +1115,6 @@ EOF mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; @@ -1047,6 +1186,9 @@ EOF SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit 0 ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit 0 ;; @@ -1054,18 +1196,24 @@ EOF echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Darwin:*:*) - echo `uname -p`-apple-darwin${UNAME_RELEASE} + case `uname -p` in + *86) UNAME_PROCESSOR=i686 ;; + powerpc) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit 0 ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) - if test "${UNAME_MACHINE}" = "x86pc"; then + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi - echo `uname -p`-${UNAME_MACHINE}-nto-qnx + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit 0 ;; *:QNX:*:4*) echo i386-pc-qnx exit 0 ;; - NSR-[KW]:NONSTOP_KERNEL:*:*) + NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit 0 ;; *:NonStop-UX:*:*) @@ -1088,11 +1236,6 @@ EOF fi echo ${UNAME_MACHINE}-unknown-plan9 exit 0 ;; - i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility - # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx - exit 0 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit 0 ;; @@ -1111,14 +1254,18 @@ EOF *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; - i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit 0 ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 +eval $set_cc_for_build cat >$dummy.c < @@ -1233,9 +1380,7 @@ main () } EOF -eval $set_cc_for_build -$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0 -rm -f $dummy.c $dummy +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 # Apollos put the system type in the environment. diff --git a/config.sub b/config.sub index 12ebc7875..ba331039b 100755 --- a/config.sub +++ b/config.sub @@ -1,9 +1,9 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003 Free Software Foundation, Inc. -timestamp='2001-08-13' +timestamp='2004-03-12' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software @@ -29,7 +29,8 @@ timestamp='2001-08-13' # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. -# Please send patches to . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. @@ -117,7 +118,8 @@ esac # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in - nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*) + nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ + kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; @@ -226,31 +228,46 @@ case $basic_machine in 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | c4x | clipper \ - | d10v | d30v | dsp16xx \ - | fr30 \ + | d10v | d30v | dlx | dsp16xx \ + | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ - | m32r | m68000 | m68k | m88k | mcore \ - | mips16 | mips64 | mips64el | mips64orion | mips64orionel \ - | mips64vr4100 | mips64vr4100el | mips64vr4300 \ - | mips64vr4300el | mips64vr5000 | mips64vr5000el \ - | mipsbe | mipsel | mipsle | mipstx39 | mipstx39el \ + | ip2k | iq2000 \ + | m32r | m32rle | m68000 | m68k | m88k | mcore \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ + | msp430 \ | ns16k | ns32k \ - | openrisc \ + | openrisc | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ - | s390 | s390x \ - | sh | sh[34] | sh[34]eb | shbe | shle \ - | sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \ + | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \ | strongarm \ - | tahoe | thumb | tic80 | tron \ - | v850 \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ | we32k \ - | x86 | xscale \ + | x86 | xscale | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; @@ -277,38 +294,56 @@ case $basic_machine in 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alphapca5[67]-* | arc-* \ - | arm-* | armbe-* | armle-* | armv*-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* \ | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c54x-* \ - | clipper-* | cray2-* | cydra-* \ - | d10v-* | d30v-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ | elxsi-* \ - | f30[01]-* | f700-* | fr30-* | fx80-* \ + | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ - | m32r-* \ - | m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \ + | ip2k-* | iq2000-* \ + | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | mcore-* \ - | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \ - | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipsel-* \ - | mipsle-* | mipstx39-* | mipstx39el-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | msp430-* \ + | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ - | s390-* | s390x-* \ - | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \ - | sparc-* | sparc64-* | sparc86x-* | sparclite-* \ - | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* \ - | t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \ - | v850-* | vax-* \ + | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ | we32k-* \ - | x86-* | x86_64-* | xmp-* | xps100-* | xscale-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ + | xtensa-* \ | ymp-* \ | z8k-*) ;; @@ -328,6 +363,9 @@ case $basic_machine in basic_machine=a29k-amd os=-udi ;; + abacus) + basic_machine=abacus-unknown + ;; adobe68k) basic_machine=m68010-adobe os=-scout @@ -342,6 +380,12 @@ case $basic_machine in basic_machine=a29k-none os=-bsd ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; amdahl) basic_machine=580-amdahl os=-sysv @@ -373,6 +417,10 @@ case $basic_machine in basic_machine=ns32k-sequent os=-dynix ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; convex-c1) basic_machine=c1-convex os=-bsd @@ -393,17 +441,13 @@ case $basic_machine in basic_machine=c38-convex os=-bsd ;; - cray | ymp) - basic_machine=ymp-cray - os=-unicos - ;; - cray2) - basic_machine=cray2-cray + cray | j90) + basic_machine=j90-cray os=-unicos ;; - [cjt]90) - basic_machine=${basic_machine}-cray - os=-unicos + cr16c) + basic_machine=cr16c-unknown + os=-elf ;; crds | unos) basic_machine=m68k-crds @@ -411,12 +455,24 @@ case $basic_machine in cris | cris-* | etrax*) basic_machine=cris-axis ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola @@ -597,14 +653,6 @@ case $basic_machine in basic_machine=m68k-atari os=-mint ;; - mipsel*-linux*) - basic_machine=mipsel-unknown - os=-linux-gnu - ;; - mips*-linux*) - basic_machine=mips-unknown - os=-linux-gnu - ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; @@ -619,6 +667,10 @@ case $basic_machine in basic_machine=m68k-rom68k os=-coff ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; msdos) basic_machine=i386-pc os=-msdos @@ -691,6 +743,10 @@ case $basic_machine in np1) basic_machine=np1-gould ;; + nv1) + basic_machine=nv1-cray + os=-unicosmp + ;; nsr-tandem) basic_machine=nsr-tandem ;; @@ -698,6 +754,14 @@ case $basic_machine in basic_machine=hppa1.1-oki os=-proelf ;; + or32 | or32-*) + basic_machine=or32-unknown + os=-coff + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose @@ -720,49 +784,55 @@ case $basic_machine in pbb) basic_machine=m68k-tti ;; - pc532 | pc532-*) + pc532 | pc532-*) basic_machine=ns32k-pc532 ;; - pentium | p5 | k5 | k6 | nexgen) + pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; - pentiumpro | p6 | 6x86 | athlon) + pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; - pentiumii | pentium2) + pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-*) + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; - pentiumii-* | pentium2-*) + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown - ;; + ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown - ;; + ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown - ;; + ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown - ;; + ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; @@ -783,10 +853,26 @@ case $basic_machine in rtpc | rtpc-*) basic_machine=romp-ibm ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; sa29200) basic_machine=a29k-amd os=-udi ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; sequent) basic_machine=i386-sequent ;; @@ -794,7 +880,10 @@ case $basic_machine in basic_machine=sh-hitachi os=-hms ;; - sparclite-wrs) + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; @@ -861,22 +950,42 @@ case $basic_machine in os=-dynix ;; t3e) - basic_machine=t3e-cray + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; tower | tower-32) basic_machine=m68k-ncr ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; udi29k) basic_machine=a29k-amd os=-udi @@ -898,8 +1007,8 @@ case $basic_machine in os=-vms ;; vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; + basic_machine=f301-fujitsu + ;; vxworks960) basic_machine=i960-wrs os=-vxworks @@ -920,17 +1029,13 @@ case $basic_machine in basic_machine=hppa1.1-winbond os=-proelf ;; - windows32) - basic_machine=i386-pc - os=-windows32-msvcrt + xps | xps100) + basic_machine=xps100-honeywell ;; - xmp) - basic_machine=xmp-cray + ymp) + basic_machine=ymp-cray os=-unicos ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim @@ -951,13 +1056,6 @@ case $basic_machine in op60c) basic_machine=hppa1.1-oki ;; - mips) - if [ x$os = x-linux-gnu ]; then - basic_machine=mips-unknown - else - basic_machine=mips-mips - fi - ;; romp) basic_machine=romp-ibm ;; @@ -977,13 +1075,16 @@ case $basic_machine in we32k) basic_machine=we32k-att ;; - sh3 | sh4 | sh3eb | sh4eb) + sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; - sparc | sparcv9 | sparcv9b) + sh64) + basic_machine=sh64-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; - cydra) + cydra) basic_machine=cydra-cydrome ;; orion) @@ -998,10 +1099,6 @@ case $basic_machine in pmac | pmac-mpw) basic_machine=powerpc-apple ;; - c4x*) - basic_machine=c4x-none - os=-coff - ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; @@ -1057,17 +1154,20 @@ case $os in | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ - | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ - | -os2* | -vos*) + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1079,8 +1179,10 @@ case $os in ;; esac ;; + -nto-qnx*) + ;; -nto*) - os=-nto-qnx + os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ @@ -1089,6 +1191,9 @@ case $os in -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; @@ -1101,6 +1206,9 @@ case $os in -opened*) os=-openedition ;; + -os400*) + os=-os400 + ;; -wince*) os=-wince ;; @@ -1119,14 +1227,23 @@ case $os in -acis*) os=-aos ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; + -nova*) + os=-rtmk-nova + ;; -ns2 ) - os=-nextstep2 + os=-nextstep2 ;; -nsk*) os=-nsk @@ -1138,6 +1255,9 @@ case $os in -sinix*) os=-sysv4 ;; + -tpf*) + os=-tpf + ;; -triton*) os=-sysv3 ;; @@ -1165,8 +1285,14 @@ case $os in -xenix) os=-xenix ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - os=-mint + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos ;; -none) ;; @@ -1199,10 +1325,14 @@ case $basic_machine in arm*-semi) os=-aout ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; - pdp11-*) + pdp11-*) os=-none ;; *-dec | vax-*) @@ -1229,6 +1359,9 @@ case $basic_machine in mips*-*) os=-elf ;; + or32-*) + os=-coff + ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; @@ -1292,19 +1425,19 @@ case $basic_machine in *-next) os=-nextstep3 ;; - *-gould) + *-gould) os=-sysv ;; - *-highlevel) + *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; - *-sgi) + *-sgi) os=-irix ;; - *-siemens) + *-siemens) os=-sysv4 ;; *-masscomp) @@ -1373,10 +1506,16 @@ case $basic_machine in -mvs* | -opened*) vendor=ibm ;; + -os400*) + vendor=ibm + ;; -ptx*) vendor=sequent ;; - -vxsim* | -vxworks*) + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) diff --git a/configure b/configure index f7468dc54..c2ad1e68e 100755 --- a/configure +++ b/configure @@ -1,9 +1,8 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.57. +# Generated by GNU Autoconf 2.59. # -# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 -# Free Software Foundation, Inc. +# Copyright (C) 2003 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## @@ -20,9 +19,10 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi +DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. -if (FOO=FOO; unset FOO) >/dev/null 2>&1; then +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false @@ -41,7 +41,7 @@ for as_var in \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do - if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var @@ -218,16 +218,17 @@ rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else + test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. -as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. -as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS @@ -240,6 +241,160 @@ IFS=" $as_nl" $as_unset CDPATH + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` + ;; +esac + +echo=${ECHO-echo} +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL $0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" +fi + + + + +tagnames=${tagnames+${tagnames},}CXX + +tagnames=${tagnames+${tagnames},}F77 + # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. @@ -308,7 +463,7 @@ ac_includes_default="\ # include #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA PACKAGE VERSION EXEEXT OBJEXT ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO AMTAR install_sh INSTALL_STRIP_PROGRAM AWK SET_MAKE AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH DEPDIR PATH MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT RANLIB ac_ct_RANLIB CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC am__include am__quote CCDEPMODE LN_S LIBTOOL CONFIGURE_DEPENDS CPP YACC LEX LEXLIB LEX_OUTPUT_ROOT AR ADD_CFLAGS EGREP LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO AMTAR install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot PATH MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CPP CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL CONFIGURE_DEPENDS YACC LEX LEXLIB LEX_OUTPUT_ROOT ADD_CFLAGS LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. @@ -667,7 +822,7 @@ done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ - localstatedir libdir includedir oldincludedir infodir mandir + localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in @@ -707,10 +862,10 @@ if test -z "$srcdir"; then # Try the directory containing this script, then its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$0" : 'X\(//\)[^/]' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } @@ -769,6 +924,26 @@ ac_env_CPP_set=${CPP+set} ac_env_CPP_value=$CPP ac_cv_env_CPP_set=${CPP+set} ac_cv_env_CPP_value=$CPP +ac_env_CXX_set=${CXX+set} +ac_env_CXX_value=$CXX +ac_cv_env_CXX_set=${CXX+set} +ac_cv_env_CXX_value=$CXX +ac_env_CXXFLAGS_set=${CXXFLAGS+set} +ac_env_CXXFLAGS_value=$CXXFLAGS +ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} +ac_cv_env_CXXFLAGS_value=$CXXFLAGS +ac_env_CXXCPP_set=${CXXCPP+set} +ac_env_CXXCPP_value=$CXXCPP +ac_cv_env_CXXCPP_set=${CXXCPP+set} +ac_cv_env_CXXCPP_value=$CXXCPP +ac_env_F77_set=${F77+set} +ac_env_F77_value=$F77 +ac_cv_env_F77_set=${F77+set} +ac_cv_env_F77_value=$F77 +ac_env_FFLAGS_set=${FFLAGS+set} +ac_env_FFLAGS_value=$FFLAGS +ac_cv_env_FFLAGS_set=${FFLAGS+set} +ac_cv_env_FFLAGS_value=$FFLAGS # # Report the --help message. @@ -802,9 +977,9 @@ _ACEOF cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] + [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] + [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify @@ -849,13 +1024,16 @@ if test -n "$ac_init_help"; then Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --disable-dependency-tracking Speeds up one-time builds - --enable-dependency-tracking Do not reject slow dependency extractors - --enable-maintainer-mode enable make rules and dependencies not useful - (and sometimes confusing) to the casual installer - --enable-shared=PKGS build shared libraries default=yes - --enable-static=PKGS build static libraries default=yes - --enable-fast-install=PKGS optimize for fast installation default=yes + --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer + --enable-shared[=PKGS] + build shared libraries [default=yes] + --enable-static[=PKGS] + build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors --disable-libtool-lock avoid locking (might break parallel builds) --disable-autoconf disable automatic generation of configure script --enable-Werror abort compilation after any C compiler warning @@ -863,7 +1041,11 @@ Optional Features: Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-gnu-ld assume the C compiler uses GNU ld default=no + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-pic try to use only PIC/non-PIC objects [default=use + both] + --with-tags[=TAGS] + include additional configurations [automatic] Some influential environment variables: CC C compiler command @@ -873,6 +1055,11 @@ Some influential environment variables: CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CXXCPP C++ preprocessor + F77 Fortran 77 compiler command + FFLAGS Fortran 77 compiler flags Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -910,12 +1097,45 @@ case $srcdir in ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac -# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be -# absolute. -ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` -ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` -ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` -ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. @@ -926,7 +1146,7 @@ ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` echo $SHELL $ac_srcdir/configure --help=recursive elif test -f $ac_srcdir/configure.ac || - test -f $ac_srcdir/configure.in; then + test -f $ac_srcdir/configure.in; then echo $ac_configure --help else @@ -940,8 +1160,7 @@ test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF -Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 -Free Software Foundation, Inc. +Copyright (C) 2003 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -953,7 +1172,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was -generated by GNU Autoconf 2.57. Invocation command line was +generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ @@ -1030,19 +1249,19 @@ do 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. + ac_must_keep_next=false # Got value, back to normal. else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac fi ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" # Get rid of the leading space. @@ -1076,12 +1295,12 @@ _ASBOX case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ - "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } @@ -1110,7 +1329,7 @@ _ASBOX for ac_var in $ac_subst_files do eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" + echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo fi @@ -1129,7 +1348,7 @@ _ASBOX echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 - rm -f core core.* *.core && + rm -f core *.core && rm -rf conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 @@ -1209,7 +1428,7 @@ fi # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | - sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" @@ -1226,13 +1445,13 @@ echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then - { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} - { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} - ac_cache_corrupted=: + ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. @@ -1388,6 +1607,7 @@ test -n "$target_alias" && NONENONEs,x,x, && program_prefix=${target_alias}- +am__api_version="1.8" # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: @@ -1399,6 +1619,7 @@ test -n "$target_alias" && # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 @@ -1415,6 +1636,7 @@ do case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. @@ -1422,20 +1644,20 @@ case $as_dir/ in # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi done done ;; @@ -1523,9 +1745,8 @@ _ACEOF program_transform_name=`echo $program_transform_name | sed -f conftest.sed` rm conftest.sed - # expand $ac_aux_dir to an absolute path -am_aux_dir=`CDPATH=:; cd $ac_aux_dir && pwd` +am_aux_dir=`cd $ac_aux_dir && pwd` test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL @@ -1533,9 +1754,33 @@ if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= - am_backtick='`' - { echo "$as_me:$LINENO: WARNING: ${am_backtick}missing' script is too old or missing" >&5 -echo "$as_me: WARNING: ${am_backtick}missing' script is too old or missing" >&2;} + { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 +echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + # Keeping the `.' argument allows $(mkdir_p) to be used without + # argument. Indeed, we sometimes output rules like + # $(mkdir_p) $(somedir) + # where $(somedir) is conditionally defined. + # (`test -n '$(somedir)' && $(mkdir_p) $(somedir)' is a more + # expensive solution, as it forces Make to start a sub-shell.) + mkdir_p='mkdir -p -- .' +else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + for d in ./-p ./--version; + do + test -d $d && rmdir $d + done + # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. + if test -f "$ac_aux_dir/mkinstalldirs"; then + mkdir_p='$(mkinstalldirs)' + else + mkdir_p='$(install_sh) -d' + fi fi for ac_prog in gawk mawk nawk awk @@ -1580,7 +1825,7 @@ done echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'` +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -1607,50 +1852,37 @@ echo "${ECHO_T}no" >&6 SET_MAKE="MAKE=${MAKE-make}" fi -# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then - enableval="$enable_dependency_tracking" - -fi; -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' -fi - - -if test "x$enable_dependency_tracking" != xno; then - AMDEP_TRUE= - AMDEP_FALSE='#' -else - AMDEP_TRUE='#' - AMDEP_FALSE= -fi - - - - -rm -f .deps 2>/dev/null -mkdir .deps 2>/dev/null -if test -d .deps; then - DEPDIR=.deps +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. else - # MS-DOS does not allow filenames that begin with a dot. - DEPDIR=_deps + am__leading_dot=_ fi -rmdir .deps 2>/dev/null - +rmdir .tst 2>/dev/null # test to see if srcdir already configured -if test "`CDPATH=:; cd $srcdir && pwd`" != "`pwd`" && +if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } fi +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + # Define the identity of the package. -PACKAGE=asn1c -VERSION=0.8.11 + PACKAGE=asn1c + VERSION=0.8.12 + cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" @@ -1661,28 +1893,15 @@ cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF - -# Autoconf 2.50 wants to disallow AM_ names. We explicitly allow -# the ones we care about. - -# Autoconf 2.50 always computes EXEEXT. However we need to be -# compatible with 2.13, for now. So we always define EXEEXT, but we -# don't compute it. - -# Similar for OBJEXT -- only we only use OBJEXT if the user actually -# requests that it be used. This is a bit dumb. -: ${OBJEXT=o} - - # Some tools Automake needs. -ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal"} +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} -AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake"} +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} @@ -1695,114 +1914,21 @@ AMTAR=${AMTAR-"${am_missing_run}tar"} install_sh=${install_sh-"$am_aux_dir/install-sh"} -INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" - -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. - - - - -echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 -echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6 - # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. -if test "${enable_maintainer_mode+set}" = set; then - enableval="$enable_maintainer_mode" - USE_MAINTAINER_MODE=$enableval -else - USE_MAINTAINER_MODE=no -fi; - echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 -echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6 - - -if test $USE_MAINTAINER_MODE = yes; then - MAINTAINER_MODE_TRUE= - MAINTAINER_MODE_FALSE='#' -else - MAINTAINER_MODE_TRUE='#' - MAINTAINER_MODE_FALSE= -fi - MAINT=$MAINTAINER_MODE_TRUE - - - -# Check whether --enable-shared or --disable-shared was given. -if test "${enable_shared+set}" = set; then - enableval="$enable_shared" - p=${PACKAGE-default} -case "$enableval" in -yes) enable_shared=yes ;; -no) enable_shared=no ;; -*) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac -else - enable_shared=yes -fi; -# Check whether --enable-static or --disable-static was given. -if test "${enable_static+set}" = set; then - enableval="$enable_static" - p=${PACKAGE-default} -case "$enableval" in -yes) enable_static=yes ;; -no) enable_static=no ;; -*) - enable_static=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac -else - enable_static=yes -fi; -# Check whether --enable-fast-install or --disable-fast-install was given. -if test "${enable_fast_install+set}" = set; then - enableval="$enable_fast_install" - p=${PACKAGE-default} -case "$enableval" in -yes) enable_fast_install=yes ;; -no) enable_fast_install=no ;; -*) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac -else - enable_fast_install=yes -fi; -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_RANLIB+set}" = set; then +if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -1811,7 +1937,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -1820,27 +1946,27 @@ done fi fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - echo "$as_me:$LINENO: result: $RANLIB" >&5 -echo "${ECHO_T}$RANLIB" >&6 +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -1849,91 +1975,223 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_RANLIB="ranlib" + ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done - test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" + test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 -echo "${ECHO_T}$ac_ct_RANLIB" >&6 +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +echo "${ECHO_T}$ac_ct_STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi - RANLIB=$ac_ct_RANLIB + STRIP=$ac_ct_STRIP else - RANLIB="$ac_cv_prog_RANLIB" + STRIP="$ac_cv_prog_STRIP" fi +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" - ac_config_commands="$ac_config_commands default-1" +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. -am_make=${MAKE-make} -cat > confinc << 'END' -doit: - @echo done -END -# If we don't find an include directive, just comment out the code. -echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 -echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 -am__include='#' -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# We grep out `Entering directory' and `Leaving directory' -# messages which can occur if `w' ends up in MAKEFLAGS. -# In particular we don't look at `^make:' because GNU make might -# be invoked under some other name (usually "gmake"), in which -# case it prints its new name instead of `make'. -if test "`$am_make -s -f confmf 2> /dev/null | fgrep -v 'ing directory'`" = "done"; then - am__include=include - am__quote= - _am_result=GNU -fi -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then - am__include=.include - am__quote='"' - _am_result=BSD - fi -fi -echo "$as_me:$LINENO: result: $_am_result" >&5 -echo "${ECHO_T}$_am_result" >&6 -rm -f confinc confmf -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. + + +echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 +echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6 + # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then + enableval="$enable_maintainer_mode" + USE_MAINTAINER_MODE=$enableval else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS + USE_MAINTAINER_MODE=no +fi; + echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 +echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6 + + +if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + + +# Check whether --enable-shared or --disable-shared was given. +if test "${enable_shared+set}" = set; then + enableval="$enable_shared" + p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi; + +# Check whether --enable-static or --disable-static was given. +if test "${enable_static+set}" = set; then + enableval="$enable_static" + p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi; + +# Check whether --enable-fast-install or --disable-fast-install was given. +if test "${enable_fast_install+set}" = set; then + enableval="$enable_fast_install" + p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi; + +DEPDIR="${am__leading_dot}deps" + + ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi + + +echo "$as_me:$LINENO: result: $_am_result" >&5 +echo "${ECHO_T}$_am_result" >&6 +rm -f confinc confmf + +# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then + enableval="$enable_dependency_tracking" + +fi; +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + + +if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then @@ -2250,7 +2508,6 @@ ac_compiler=`set X $ac_compile; echo $2` (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -2270,8 +2527,8 @@ ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -echo "$as_me:$LINENO: checking for C compiler default output" >&5 -echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6 +echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 @@ -2291,23 +2548,23 @@ do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) - ;; + ;; conftest.$ac_ext ) - # This is the source file. - ;; + # This is the source file. + ;; [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; + # We found the default executable, but exeext='' is most + # certainly right. + break;; *.* ) - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - # FIXME: I believe we export ac_cv_exeext for Libtool, - # but it would be cool to find out if it's true. Does anybody - # maintain Libtool? --akim. - export ac_cv_exeext - break;; + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool, + # but it would be cool to find out if it's true. Does anybody + # maintain Libtool? --akim. + export ac_cv_exeext + break;; * ) - break;; + break;; esac done else @@ -2381,8 +2638,8 @@ for ac_file in conftest.exe conftest conftest.*; do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - export ac_cv_exeext - break;; + export ac_cv_exeext + break;; * ) break;; esac done @@ -2407,7 +2664,6 @@ if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -2458,7 +2714,6 @@ if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -2478,11 +2733,21 @@ main () _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2495,7 +2760,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi @@ -2511,7 +2776,6 @@ if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -2528,11 +2792,21 @@ main () _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2545,7 +2819,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cc_g=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 @@ -2572,7 +2846,6 @@ else ac_cv_prog_cc_stdc=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -2600,6 +2873,16 @@ static char *f (char * (*g) (char **, int), char **p, ...) va_end (v); return s; } + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std1 is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std1. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; @@ -2626,11 +2909,21 @@ do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2643,7 +2936,7 @@ else sed 's/^/| /' conftest.$ac_ext >&5 fi -rm -f conftest.$ac_objext +rm -f conftest.err conftest.$ac_objext done rm -f conftest.$ac_ext conftest.$ac_objext CC=$ac_save_CC @@ -2671,19 +2964,28 @@ cat >conftest.$ac_ext <<_ACEOF _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then for ac_declaration in \ - ''\ - '#include ' \ + '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ @@ -2691,14 +2993,13 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -#include $ac_declaration +#include int main () { @@ -2709,11 +3010,21 @@ exit (42); _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2726,9 +3037,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 continue fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -2745,11 +3055,21 @@ exit (42); _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2761,7 +3081,7 @@ else sed 's/^/| /' conftest.$ac_ext >&5 fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then @@ -2775,7 +3095,7 @@ else sed 's/^/| /' conftest.$ac_ext >&5 fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -2800,18 +3120,34 @@ else # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. - echo '#include "conftest.h"' > conftest.c - echo 'int i;' > conftest.h - echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) @@ -2829,13 +3165,25 @@ else # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ - source=conftest.c object=conftest.o \ - depfile=conftest.Po tmpdepfile=conftest.TPo \ - $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 && - grep conftest.h conftest.Po > /dev/null 2>&1 && + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - am_cv_CC_dependencies_compiler_type=$depmode - break + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi fi done @@ -2848,7 +3196,91 @@ fi fi echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 -CCDEPMODE="depmode=$am_cv_CC_dependencies_compiler_type" +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 +echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6 +if test "${lt_cv_path_SED+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && break + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +SED=$lt_cv_path_SED + +fi + +echo "$as_me:$LINENO: result: $SED" >&5 +echo "${ECHO_T}$SED" >&6 + +echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_prog_egrep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 +echo "${ECHO_T}$ac_cv_prog_egrep" >&6 + EGREP=$ac_cv_prog_egrep @@ -2860,19 +3292,25 @@ else with_gnu_ld=no fi; ac_prog=ld -if test "$ac_cv_c_compiler_gnu" = yes; then +if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. - echo "$as_me:$LINENO: checking for ld used by GCC" >&5 -echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6 - ac_prog=`($CC -print-prog-name=ld) 2>&5` - case "$ac_prog" in + echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in # Accept absolute paths. - [\\/]* | [A-Za-z]:[\\/]*) + [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the path of ld - ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; @@ -2892,32 +3330,36 @@ else echo "$as_me:$LINENO: checking for non-GNU ld" >&5 echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 fi -if test "${ac_cv_path_LD+set}" = set; then +if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$LD"; then - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do + IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - ac_cv_path_LD="$ac_dir/$ac_prog" + lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. - if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + case `"$lt_cv_path_LD" -v 2>&1 &5 echo "${ECHO_T}$LD" >&6 @@ -2930,56 +3372,85 @@ echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 -if test "${ac_cv_prog_gnu_ld+set}" = set; then +if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. -if $LD -v 2>&1 &5; then - ac_cv_prog_gnu_ld=yes -else - ac_cv_prog_gnu_ld=no -fi +case `$LD -v 2>&1 &5 -echo "${ECHO_T}$ac_cv_prog_gnu_ld" >&6 +echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5 +echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 +with_gnu_ld=$lt_cv_prog_gnu_ld + +echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 +echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6 +if test "${lt_cv_ld_reload_flag+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_ld_reload_flag='-r' +fi +echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 +echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6 +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6 -if test "${ac_cv_path_NM+set}" = set; then +if test "${lt_cv_path_NM+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$NM"; then # Let the user override the test. - ac_cv_path_NM="$NM" + lt_cv_path_NM="$NM" else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then + tmp_nm="$ac_dir/${ac_tool_prefix}nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored - if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - ac_cv_path_NM="$ac_dir/nm -B" - break - elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - ac_cv_path_NM="$ac_dir/nm -p" + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" break - else - ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - fi + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + esac fi done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm + IFS="$lt_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi fi - -NM="$ac_cv_path_NM" -echo "$as_me:$LINENO: result: $NM" >&5 -echo "${ECHO_T}$NM" >&6 +echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 +echo "${ECHO_T}$lt_cv_path_NM" >&6 +NM="$lt_cv_path_NM" echo "$as_me:$LINENO: checking whether ln -s works" >&5 echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 @@ -2992,20 +3463,203 @@ else echo "${ECHO_T}no, using $LN_S" >&6 fi +echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5 +echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6 +if test "${lt_cv_deplibs_check_method+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix4* | aix5*) + lt_cv_deplibs_check_method=pass_all + ;; +beos*) + lt_cv_deplibs_check_method=pass_all + ;; -case "$target" in -NONE) lt_target="$host" ;; -*) lt_target="$target" ;; -esac +bsdi4*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump'. + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | kfreebsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case "$host_cpu" in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux*) + case $host_cpu in + alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object' + else + lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 +echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6 +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} -# Check for any special flags to pass to ltconfig. -libtool_flags="--cache-file=$cache_file" -test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared" -test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static" -test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install" -test "$ac_cv_c_compiler_gnu" = yes && libtool_flags="$libtool_flags --with-gcc" -test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld" +# Allow CC to be a program name with arguments. +compiler=$CC # Check whether --enable-libtool-lock or --disable-libtool-lock was given. @@ -3013,21 +3667,52 @@ if test "${enable_libtool_lock+set}" = set; then enableval="$enable_libtool_lock" fi; -test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock" -test x"$silent" = xyes && libtool_flags="$libtool_flags --silent" +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. -case "$lt_target" in +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 3024 "configure"' > conftest.$ac_ext + echo '#line 3696 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then - case "`/usr/bin/file conftest.o`" in + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; @@ -3038,6 +3723,53 @@ case "$lt_target" in LD="${LD-ld} -64" ;; esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac fi rm -rf conftest* ;; @@ -3051,8 +3783,13 @@ echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 if test "${lt_cv_cc_needs_belf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -3069,11 +3806,21 @@ main () _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3086,7 +3833,14 @@ sed 's/^/| /' conftest.$ac_ext >&5 lt_cv_cc_needs_belf=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + fi echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 @@ -3096,105 +3850,15237 @@ echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 fi ;; - esac +need_locks="$enable_libtool_lock" -# Save cache, so that ltconfig can load it -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ _ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -{ - (set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" - ;; - esac; -} | - sed ' - t clear - : clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - : end' >>confcache -if diff $cache_file confcache >/dev/null 2>&1; then :; else - if test -w $cache_file; then - test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" - cat confcache >$cache_file +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else - echo "not updating unwritable cache $cache_file" + ac_cpp_err= fi +else + ac_cpp_err=yes fi -rm -f confcache +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 -# Actually configure libtool. ac_aux_dir is where install-sh is found. -CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \ -LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \ -LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \ -DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \ -${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \ -$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \ -|| { { echo "$as_me:$LINENO: error: libtool configure failed" >&5 -echo "$as_me: error: libtool configure failed" >&2;} - { (exit 1); exit 1; }; } + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext -# Reload cache, that may have been modified by ltconfig -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special - # files actually), so we avoid doing that. - if test -f "$cache_file"; then - { echo "$as_me:$LINENO: loading cache $cache_file" >&5 -echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . $cache_file;; - *) . ./$cache_file;; - esac + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6 +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + exit(2); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +for ac_header in dlfcn.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + echo "$as_me:$LINENO: result: $CXX" >&5 +echo "${ECHO_T}$CXX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 +echo "${ECHO_T}$ac_ct_CXX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CXX" && break +done +test -n "$ac_ct_CXX" || ac_ct_CXX="g++" + + CXX=$ac_ct_CXX +fi + + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C++ compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 +GXX=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +CXXFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 +echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cxx_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cxx_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cxx_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +depcc="$CXX" am_compiler_list= + +echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6 +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 +echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 +if test -z "$CXXCPP"; then + if test "${ac_cv_prog_CXXCPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +echo "$as_me:$LINENO: result: $CXXCPP" >&5 +echo "${ECHO_T}$CXXCPP" >&6 +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$F77"; then + ac_cv_prog_F77="$F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_F77="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +F77=$ac_cv_prog_F77 +if test -n "$F77"; then + echo "$as_me:$LINENO: result: $F77" >&5 +echo "${ECHO_T}$F77" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$F77" && break + done +fi +if test -z "$F77"; then + ac_ct_F77=$F77 + for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_F77"; then + ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_F77="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_F77=$ac_cv_prog_ac_ct_F77 +if test -n "$ac_ct_F77"; then + echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 +echo "${ECHO_T}$ac_ct_F77" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_F77" && break +done + + F77=$ac_ct_F77 +fi + + +# Provide some information about the compiler. +echo "$as_me:5268:" \ + "checking for Fortran 77 compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +rm -f a.out + +# If we don't use `.F' as extension, the preprocessor is not run on the +# input file. (Note that this only needs to work for GNU compilers.) +ac_save_ext=$ac_ext +ac_ext=F +echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6 +if test "${ac_cv_f77_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF + program main +#ifndef __GNUC__ + choke me +#endif + + end +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_f77_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_f77_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6 +ac_ext=$ac_save_ext +ac_test_FFLAGS=${FFLAGS+set} +ac_save_FFLAGS=$FFLAGS +FFLAGS= +echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 +echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_f77_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + FFLAGS=-g +cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_f77_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_f77_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_f77_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 +echo "${ECHO_T}$ac_cv_prog_f77_g" >&6 +if test "$ac_test_FFLAGS" = set; then + FFLAGS=$ac_save_FFLAGS +elif test $ac_cv_prog_f77_g = yes; then + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-g -O2" + else + FFLAGS="-g" + fi +else + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-O2" + else + FFLAGS= + fi +fi + +G77=`test $ac_compiler_gnu = yes && echo yes` +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! + +# find the maximum length of command line arguments +echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 +echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6 +if test "${lt_cv_sys_max_cmd_len+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while (test "X"`$CONFIG_SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 +echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6 +else + echo "$as_me:$LINENO: result: none" >&5 +echo "${ECHO_T}none" >&6 +fi + + + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 +echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6 +if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32*) + symcode='[ABCDGISTW]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris* | sysv5*) + symcode='[BDRT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 + (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + echo "$as_me:$LINENO: result: failed" >&5 +echo "${ECHO_T}failed" >&6 +else + echo "$as_me:$LINENO: result: ok" >&5 +echo "${ECHO_T}ok" >&6 +fi + +echo "$as_me:$LINENO: checking for objdir" >&5 +echo $ECHO_N "checking for objdir... $ECHO_C" >&6 +if test "${lt_cv_objdir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 +echo "${ECHO_T}$lt_cv_objdir" >&6 +objdir=$lt_cv_objdir + + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + echo "$as_me:$LINENO: result: $AR" >&5 +echo "${ECHO_T}$AR" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="ar" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false" +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 +echo "${ECHO_T}$ac_ct_AR" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + AR=$ac_ct_AR +else + AR="$ac_cv_prog_AR" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + RANLIB=$ac_ct_RANLIB +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +echo "${ECHO_T}$ac_ct_STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + STRIP=$ac_ct_STRIP +else + STRIP="$ac_cv_prog_STRIP" +fi + + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 +echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +echo "${ECHO_T}$MAGIC_CMD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + echo "$as_me:$LINENO: checking for file" >&5 +echo $ECHO_N "checking for file... $ECHO_C" >&6 +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +echo "${ECHO_T}$MAGIC_CMD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +enable_dlopen=no +enable_win32_dll=no + +# Check whether --enable-libtool-lock or --disable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval="$enable_libtool_lock" + +fi; +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + + +# Check whether --with-pic or --without-pic was given. +if test "${with_pic+set}" = set; then + withval="$with_pic" + pic_mode="$withval" +else + pic_mode=default +fi; +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}\n' + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# +# Check for any special shared library compilation flags. +# +lt_prog_cc_shlib= +if test "$GCC" = no; then + case $host_os in + sco3.2v5*) + lt_prog_cc_shlib='-belf' + ;; + esac +fi +if test -n "$lt_prog_cc_shlib"; then + { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&5 +echo "$as_me: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&2;} + if echo "$old_CC $old_CFLAGS " | grep "[ ]$lt_prog_cc_shlib[ ]" >/dev/null; then : + else + { echo "$as_me:$LINENO: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 +echo "$as_me: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} + lt_cv_prog_cc_can_build_shared=no + fi +fi + + +# +# Check to make sure the static flag actually works. +# +echo "$as_me:$LINENO: checking if $compiler static flag $lt_prog_compiler_static works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_prog_compiler_static works... $ECHO_C" >&6 +if test "${lt_prog_compiler_static_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_prog_compiler_static" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + else + lt_prog_compiler_static_works=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" + +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 +echo "${ECHO_T}$lt_prog_compiler_static_works" >&6 + +if test x"$lt_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag=' -fno-builtin' + + +echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:6302: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:6306: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + +lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + +echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + sco3.2v5*) + lt_prog_compiler_pic='-Kpic' + lt_prog_compiler_static='-dn' + ;; + + solaris*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic" >&6 + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + +echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6 +if test "${lt_prog_compiler_pic_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:6535: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:6539: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6 + +if test x"$lt_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_c_o+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:6595: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:6599: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6 + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6 + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 + + runpath_var= + allow_undefined_flag= + enable_shared_with_static_runtimes=no + archive_cmds= + archive_expsym_cmds= + old_archive_From_new_cmds= + old_archive_from_expsyms_cmds= + export_dynamic_flag_spec= + whole_archive_flag_spec= + thread_safe_flag_spec= + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld= + hardcode_libdir_separator= + hardcode_direct=no + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + link_all_deplibs=unknown + hardcode_automatic=no + module_cmds= + module_expsym_cmds= + always_export_symbols=no + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + archive_expsym_cmds="$tmp_archive_cmds" + fi + else + ld_shlibs=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + + if test "$GCC" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec=' ' + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + bsdi4*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes=yes + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes ; then + archive_cmds_need_lc=no + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag='-flat_namespace -undefined suppress' + ;; + 10.*) + allow_undefined_flag='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_cmds='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + archive_cmds='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + module_cmds='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + whole_archive_flag_spec='-all_load $convenience' + link_all_deplibs=yes + else + ld_shlibs=no + fi + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld='+b $libdir' + hardcode_libdir_separator=: + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + ia64*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=no + hardcode_shlibpath_var=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + *) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld='-rpath $libdir' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + openbsd*) + hardcode_direct=yes + hardcode_shlibpath_var=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + + sco3.2v5*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag=' -z text' + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=no + hardcode_shlibpath_var=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + no_undefined_flag='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv5*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec= + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $ld_shlibs" >&5 +echo "${ECHO_T}$ld_shlibs" >&6 +test "$ld_shlibs" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc=no + else + archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 +echo "${ECHO_T}$archive_cmds_need_lc" >&6 + ;; + esac + fi + ;; +esac + +echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=yes + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6 +test "$dynamic_linker" = no && can_build_shared=no + +echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var " || \ + test "X$hardcode_automatic"="Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +echo "$as_me:$LINENO: result: $hardcode_action" >&5 +echo "${ECHO_T}$hardcode_action" >&6 + +if test "$hardcode_action" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + ;; + *) + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + ;; + esac +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + echo "$as_me:$LINENO: checking for shl_load" >&5 +echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 +if test "${ac_cv_func_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define shl_load to an innocuous variant, in case declares shl_load. + For example, HP-UX 11i declares gettimeofday. */ +#define shl_load innocuous_shl_load + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shl_load (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shl_load + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_shl_load) || defined (__stub___shl_load) +choke me +#else +char (*f) () = shl_load; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != shl_load; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_shl_load=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +echo "${ECHO_T}$ac_cv_func_shl_load" >&6 +if test $ac_cv_func_shl_load = yes; then + lt_cv_dlopen="shl_load" +else + echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +int +main () +{ +shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_shl_load=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 +if test $ac_cv_lib_dld_shl_load = yes; then + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +else + echo "$as_me:$LINENO: checking for dlopen" >&5 +echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 +if test "${ac_cv_func_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define dlopen to an innocuous variant, in case declares dlopen. + For example, HP-UX 11i declares gettimeofday. */ +#define dlopen innocuous_dlopen + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef dlopen + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_dlopen) || defined (__stub___dlopen) +choke me +#else +char (*f) () = dlopen; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != dlopen; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +echo "${ECHO_T}$ac_cv_func_dlopen" >&6 +if test $ac_cv_func_dlopen = yes; then + lt_cv_dlopen="dlopen" +else + echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 +if test "${ac_cv_lib_svld_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_svld_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_svld_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 +if test $ac_cv_lib_svld_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_dld_link+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dld_link (); +int +main () +{ +dld_link (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_dld_link=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_dld_link=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 +if test $ac_cv_lib_dld_dld_link = yes; then + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 +if test "${lt_cv_dlopen_self+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self" >&6 + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 +if test "${lt_cv_dlopen_self_static+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +# Report which librarie types wil actually be built +echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $can_build_shared" >&5 +echo "${ECHO_T}$can_build_shared" >&6 + +echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4* | aix5*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + darwin* | rhapsody*) + if test "$GCC" = yes; then + archive_cmds_need_lc=no + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag='-flat_namespace -undefined suppress' + ;; + 10.*) + allow_undefined_flag='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + output_verbose_link_cmd='echo' + archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring' + module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + whole_archive_flag_spec='-all_load $convenience' + link_all_deplibs=yes + else + ld_shlibs=no + fi + ;; +esac +echo "$as_me:$LINENO: result: $enable_shared" >&5 +echo "${ECHO_T}$enable_shared" >&6 + +echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +echo "$as_me:$LINENO: result: $enable_static" >&5 +echo "${ECHO_T}$enable_static" >&6 + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler \ + CC \ + LD \ + lt_prog_compiler_wl \ + lt_prog_compiler_pic \ + lt_prog_compiler_static \ + lt_prog_compiler_no_builtin_flag \ + export_dynamic_flag_spec \ + thread_safe_flag_spec \ + whole_archive_flag_spec \ + enable_shared_with_static_runtimes \ + old_archive_cmds \ + old_archive_from_new_cmds \ + predep_objects \ + postdep_objects \ + predeps \ + postdeps \ + compiler_lib_search_path \ + archive_cmds \ + archive_expsym_cmds \ + postinstall_cmds \ + postuninstall_cmds \ + old_archive_from_expsyms_cmds \ + allow_undefined_flag \ + no_undefined_flag \ + export_symbols_cmds \ + hardcode_libdir_flag_spec \ + hardcode_libdir_flag_spec_ld \ + hardcode_libdir_separator \ + hardcode_automatic \ + module_cmds \ + module_expsym_cmds \ + lt_cv_prog_compiler_c_o \ + exclude_expsyms \ + include_expsyms; do + + case $var in + old_archive_cmds | \ + old_archive_from_new_cmds | \ + archive_cmds | \ + archive_expsym_cmds | \ + module_cmds | \ + module_expsym_cmds | \ + old_archive_from_expsyms_cmds | \ + export_symbols_cmds | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="${ofile}T" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + $rm -f "$cfgfile" + { echo "$as_me:$LINENO: creating $ofile" >&5 +echo "$as_me: creating $ofile" >&6;} + + cat <<__EOF__ >> "$cfgfile" +#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program 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 +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU C compiler? +with_gcc=$GCC + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# ### END LIBTOOL CONFIG + +__EOF__ + + + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + +# Check whether --with-tags or --without-tags was given. +if test "${with_tags+set}" = set; then + withval="$with_tags" + tagnames="$withval" +fi; + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 +echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 +echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} + else + { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 +echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} + fi + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in + "") ;; + *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 +echo "$as_me: error: invalid tag name: $tagname" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 +echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} + { (exit 1); exit 1; }; } + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && test "X$CXX" != "Xno"; then + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_flag_spec_ld_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_automatic_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +# Source file extension for C++ test sources. +ac_ext=cc + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *) { return(0); }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +compiler_CXX=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' +else + lt_prog_compiler_no_builtin_flag_CXX= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + +# Check whether --with-gnu-ld or --without-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval="$with_gnu_ld" + test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi; +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + echo "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 +else + echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 +fi +if test "${lt_cv_path_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +echo "${ECHO_T}$LD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 +if test "${lt_cv_prog_gnu_ld+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 &5 +echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 +ld_shlibs_CXX=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + + if test "$GXX" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_CXX=yes + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols_CXX=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX=' ' + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs_CXX=no + fi + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes; then + archive_cmds_need_lc_CXX=no + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag_CXX='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_CXX='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_CXX='-flat_namespace -undefined suppress' + ;; + 10.*) + allow_undefined_flag_CXX='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + archive_cmds_CXX='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + module_cmds_CXX='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + whole_archive_flag_spec_CXX='-all_load $convenience' + link_all_deplibs_CXX=yes + else + ld_shlibs_CXX=no + fi + ;; + + dgux*) + case $cc_basename in + ec++) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + freebsd12*) + # C++ shared libraries reported to be fairly broken before switch to ELF + ld_shlibs_CXX=no + ;; + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + gnu*) + ;; + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC) + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld_CXX='+b $libdir' + hardcode_libdir_separator_CXX=: + ;; + ia64*) + hardcode_libdir_flag_spec_CXX='-L$libdir' + ;; + *) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case "$host_cpu" in + hppa*64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + *) + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC) + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case "$host_cpu" in + ia64*|hppa*64*) + archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + irix5* | irix6*) + case $cc_basename in + CC) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + ;; + linux*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc) + # Intel C++ + with_gnu_ld=yes + archive_cmds_need_lc_CXX=no + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + cxx) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + mvs*) + case $cc_basename in + cxx) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + osf3*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ + $rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + sco*) + archive_cmds_need_lc_CXX=no + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.0-5 | solaris2.0-5.*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[LR]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + archive_cmds_need_lc_CXX=no + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; +esac +echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +echo "${ECHO_T}$ld_shlibs_CXX" >&6 +test "$ld_shlibs_CXX" = no && can_build_shared=no + +GCC_CXX="$GXX" +LD_CXX="$LD" + + +cat > conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + # The `*' in the case matches for architectures that use `case' in + # $output_verbose_cmd can trigger glob expansion during the loop + # eval without this substitution. + output_verbose_link_cmd="`$echo \"X$output_verbose_link_cmd\" | $Xsed -e \"$no_glob_subst\"`" + + for p in `eval $output_verbose_link_cmd`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" \ + || test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$rm -f confest.$objext + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + +lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + +echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + icpc) + # Intel C++ + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + cxx) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + sco*) + case $cc_basename in + CC) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + *) + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + unixware*) + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6 + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + +echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6 +if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:11056: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:11060: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works_CXX=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6 + +if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:11116: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:11120: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6 + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6 + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw*) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +echo "${ECHO_T}$ld_shlibs_CXX" >&6 +test "$ld_shlibs_CXX" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_CXX=no + else + archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 +echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6 + ;; + esac + fi + ;; +esac + +echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=yes + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6 +test "$dynamic_linker" = no && can_build_shared=no + +echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || \ + test -n "$runpath_var CXX" || \ + test "X$hardcode_automatic_CXX"="Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 +echo "${ECHO_T}$hardcode_action_CXX" >&6 + +if test "$hardcode_action_CXX" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + ;; + *) + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + ;; + esac +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + echo "$as_me:$LINENO: checking for shl_load" >&5 +echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 +if test "${ac_cv_func_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define shl_load to an innocuous variant, in case declares shl_load. + For example, HP-UX 11i declares gettimeofday. */ +#define shl_load innocuous_shl_load + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shl_load (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shl_load + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_shl_load) || defined (__stub___shl_load) +choke me +#else +char (*f) () = shl_load; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != shl_load; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_shl_load=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +echo "${ECHO_T}$ac_cv_func_shl_load" >&6 +if test $ac_cv_func_shl_load = yes; then + lt_cv_dlopen="shl_load" +else + echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +int +main () +{ +shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_shl_load=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 +if test $ac_cv_lib_dld_shl_load = yes; then + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +else + echo "$as_me:$LINENO: checking for dlopen" >&5 +echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 +if test "${ac_cv_func_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define dlopen to an innocuous variant, in case declares dlopen. + For example, HP-UX 11i declares gettimeofday. */ +#define dlopen innocuous_dlopen + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef dlopen + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_dlopen) || defined (__stub___dlopen) +choke me +#else +char (*f) () = dlopen; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != dlopen; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +echo "${ECHO_T}$ac_cv_func_dlopen" >&6 +if test $ac_cv_func_dlopen = yes; then + lt_cv_dlopen="dlopen" +else + echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 +if test "${ac_cv_lib_svld_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_svld_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_svld_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 +if test $ac_cv_lib_svld_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_dld_link+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dld_link (); +int +main () +{ +dld_link (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_dld_link=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_dld_link=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 +if test $ac_cv_lib_dld_dld_link = yes; then + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 +if test "${lt_cv_dlopen_self+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self" >&6 + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 +if test "${lt_cv_dlopen_self_static+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_CXX \ + CC_CXX \ + LD_CXX \ + lt_prog_compiler_wl_CXX \ + lt_prog_compiler_pic_CXX \ + lt_prog_compiler_static_CXX \ + lt_prog_compiler_no_builtin_flag_CXX \ + export_dynamic_flag_spec_CXX \ + thread_safe_flag_spec_CXX \ + whole_archive_flag_spec_CXX \ + enable_shared_with_static_runtimes_CXX \ + old_archive_cmds_CXX \ + old_archive_from_new_cmds_CXX \ + predep_objects_CXX \ + postdep_objects_CXX \ + predeps_CXX \ + postdeps_CXX \ + compiler_lib_search_path_CXX \ + archive_cmds_CXX \ + archive_expsym_cmds_CXX \ + postinstall_cmds_CXX \ + postuninstall_cmds_CXX \ + old_archive_from_expsyms_cmds_CXX \ + allow_undefined_flag_CXX \ + no_undefined_flag_CXX \ + export_symbols_cmds_CXX \ + hardcode_libdir_flag_spec_CXX \ + hardcode_libdir_flag_spec_ld_CXX \ + hardcode_libdir_separator_CXX \ + hardcode_automatic_CXX \ + module_cmds_CXX \ + module_expsym_cmds_CXX \ + lt_cv_prog_compiler_c_o_CXX \ + exclude_expsyms_CXX \ + include_expsyms_CXX; do + + case $var in + old_archive_cmds_CXX | \ + old_archive_from_new_cmds_CXX | \ + archive_cmds_CXX | \ + archive_expsym_cmds_CXX | \ + module_cmds_CXX | \ + module_expsym_cmds_CXX | \ + old_archive_from_expsyms_cmds_CXX | \ + export_symbols_cmds_CXX | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_CXX + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_CXX +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_CXX + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_CXX + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_CXX + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_CXX" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld + + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + + +archive_cmds_need_lc_F77=no +allow_undefined_flag_F77= +always_export_symbols_F77=no +archive_expsym_cmds_F77= +export_dynamic_flag_spec_F77= +hardcode_direct_F77=no +hardcode_libdir_flag_spec_F77= +hardcode_libdir_flag_spec_ld_F77= +hardcode_libdir_separator_F77= +hardcode_minus_L_F77=no +hardcode_automatic_F77=no +module_cmds_F77= +module_expsym_cmds_F77= +link_all_deplibs_F77=unknown +old_archive_cmds_F77=$old_archive_cmds +no_undefined_flag_F77= +whole_archive_flag_spec_F77= +enable_shared_with_static_runtimes_F77=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +objext_F77=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code=" subroutine t\n return\n end\n" + +# Code to be used in simple link tests +lt_simple_link_test_code=" program t\n end\n" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${F77-"f77"} +compiler=$CC +compiler_F77=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $can_build_shared" >&5 +echo "${ECHO_T}$can_build_shared" >&6 + +echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; +aix4* | aix5*) + test "$enable_shared" = yes && enable_static=no + ;; +esac +echo "$as_me:$LINENO: result: $enable_shared" >&5 +echo "${ECHO_T}$enable_shared" >&6 + +echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +echo "$as_me:$LINENO: result: $enable_static" >&5 +echo "${ECHO_T}$enable_static" >&6 + +test "$ld_shlibs_F77" = no && can_build_shared=no + +GCC_F77="$G77" +LD_F77="$LD" + +lt_prog_compiler_wl_F77= +lt_prog_compiler_pic_F77= +lt_prog_compiler_static_F77= + +echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 + + if test "$GCC" = yes; then + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_static_F77='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_F77='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_F77=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_F77=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_F77='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + else + lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_F77='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_F77='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-static' + ;; + ccc*) + lt_prog_compiler_wl_F77='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_F77='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + + sco3.2v5*) + lt_prog_compiler_pic_F77='-Kpic' + lt_prog_compiler_static_F77='-dn' + ;; + + solaris*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sunos4*) + lt_prog_compiler_wl_F77='-Qoption ld ' + lt_prog_compiler_pic_F77='-PIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_F77='-Kconform_pic' + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + uts4*) + lt_prog_compiler_pic_F77='-pic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_F77=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6 + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_F77"; then + +echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6 +if test "${lt_prog_compiler_pic_works_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works_F77=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_F77" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:13402: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:13406: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works_F77=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6 + +if test x"$lt_prog_compiler_pic_works_F77" = xyes; then + case $lt_prog_compiler_pic_F77 in + "" | " "*) ;; + *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; + esac +else + lt_prog_compiler_pic_F77= + lt_prog_compiler_can_build_shared_F77=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_F77= + ;; + *) + lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" + ;; +esac + +echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o_F77=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:13462: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:13466: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o_F77=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6 + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6 + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 + + runpath_var= + allow_undefined_flag_F77= + enable_shared_with_static_runtimes_F77=no + archive_cmds_F77= + archive_expsym_cmds_F77= + old_archive_From_new_cmds_F77= + old_archive_from_expsyms_cmds_F77= + export_dynamic_flag_spec_F77= + whole_archive_flag_spec_F77= + thread_safe_flag_spec_F77= + hardcode_libdir_flag_spec_F77= + hardcode_libdir_flag_spec_ld_F77= + hardcode_libdir_separator_F77= + hardcode_direct_F77=no + hardcode_minus_L_F77=no + hardcode_shlibpath_var_F77=unsupported + link_all_deplibs_F77=unknown + hardcode_automatic_F77=no + module_cmds_F77= + module_expsym_cmds_F77= + always_export_symbols_F77=no + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_F77= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_F77=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_F77=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs_F77=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_F77=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_F77='-L$libdir' + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=no + enable_shared_with_static_runtimes_F77=yes + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_F77=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + sunos4*) + archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds_F77="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + archive_expsym_cmds_F77="$tmp_archive_cmds" + fi + else + ld_shlibs_F77=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + + if test "$ld_shlibs_F77" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_F77='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_F77= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=yes + archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_F77=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_F77=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_F77='' + hardcode_direct_F77=yes + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + + if test "$GCC" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_F77=yes + else + # We have old collect2 + hardcode_direct_F77=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_F77=yes + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_libdir_separator_F77= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_F77=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_F77='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_f77_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_F77="-z nodefs" + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_f77_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_F77=' ${wl}-bernotok' + allow_undefined_flag_F77=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols_F77=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_F77=' ' + archive_cmds_need_lc_F77=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + # see comment about different semantics on the GNU ld section + ld_shlibs_F77=no + ;; + + bsdi4*) + export_dynamic_flag_spec_F77=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_F77=' ' + allow_undefined_flag_F77=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds_F77='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_F77=yes + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes ; then + archive_cmds_need_lc_F77=no + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag_F77='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_F77='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_F77='-flat_namespace -undefined suppress' + ;; + 10.*) + allow_undefined_flag_F77='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_cmds_F77='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + archive_cmds_F77='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + module_cmds_F77='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + hardcode_direct_F77=no + hardcode_automatic_F77=yes + hardcode_shlibpath_var_F77=unsupported + whole_archive_flag_spec_F77='-all_load $convenience' + link_all_deplibs_F77=yes + else + ld_shlibs_F77=no + fi + ;; + + dgux*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + freebsd1*) + ld_shlibs_F77=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_F77='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld_F77='+b $libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + ;; + ia64*) + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + ;; + *) + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' + fi + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + link_all_deplibs_F77=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + newsos6) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_shlibpath_var_F77=no + ;; + + openbsd*) + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + export_dynamic_flag_spec_F77='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + ;; + *) + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + allow_undefined_flag_F77=unsupported + archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_F77='-rpath $libdir' + fi + hardcode_libdir_separator_F77=: + ;; + + sco3.2v5*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + export_dynamic_flag_spec_F77='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag_F77=' -z text' + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_shlibpath_var_F77=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs_F77=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_F77='$CC -r -o $output$reload_objs' + hardcode_direct_F77=no + ;; + motorola) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_F77=no + ;; + + sysv4.3*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + export_dynamic_flag_spec_F77='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_F77=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_minus_L_F77=no + hardcode_shlibpath_var_F77=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + no_undefined_flag_F77='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_F77=no + ;; + + sysv5*) + no_undefined_flag_F77=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec_F77= + hardcode_shlibpath_var_F77=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + *) + ld_shlibs_F77=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 +echo "${ECHO_T}$ld_shlibs_F77" >&6 +test "$ld_shlibs_F77" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_F77" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_F77=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_F77 in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_F77 + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_F77 + allow_undefined_flag_F77= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_F77=no + else + archive_cmds_need_lc_F77=yes + fi + allow_undefined_flag_F77=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 +echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6 + ;; + esac + fi + ;; +esac + +echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=yes + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6 +test "$dynamic_linker" = no && can_build_shared=no + +echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +hardcode_action_F77= +if test -n "$hardcode_libdir_flag_spec_F77" || \ + test -n "$runpath_var F77" || \ + test "X$hardcode_automatic_F77"="Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_F77" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && + test "$hardcode_minus_L_F77" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_F77=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_F77=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_F77=unsupported +fi +echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 +echo "${ECHO_T}$hardcode_action_F77" >&6 + +if test "$hardcode_action_F77" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + ;; + *) + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + ;; + esac +fi + + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_F77 \ + CC_F77 \ + LD_F77 \ + lt_prog_compiler_wl_F77 \ + lt_prog_compiler_pic_F77 \ + lt_prog_compiler_static_F77 \ + lt_prog_compiler_no_builtin_flag_F77 \ + export_dynamic_flag_spec_F77 \ + thread_safe_flag_spec_F77 \ + whole_archive_flag_spec_F77 \ + enable_shared_with_static_runtimes_F77 \ + old_archive_cmds_F77 \ + old_archive_from_new_cmds_F77 \ + predep_objects_F77 \ + postdep_objects_F77 \ + predeps_F77 \ + postdeps_F77 \ + compiler_lib_search_path_F77 \ + archive_cmds_F77 \ + archive_expsym_cmds_F77 \ + postinstall_cmds_F77 \ + postuninstall_cmds_F77 \ + old_archive_from_expsyms_cmds_F77 \ + allow_undefined_flag_F77 \ + no_undefined_flag_F77 \ + export_symbols_cmds_F77 \ + hardcode_libdir_flag_spec_F77 \ + hardcode_libdir_flag_spec_ld_F77 \ + hardcode_libdir_separator_F77 \ + hardcode_automatic_F77 \ + module_cmds_F77 \ + module_expsym_cmds_F77 \ + lt_cv_prog_compiler_c_o_F77 \ + exclude_expsyms_F77 \ + include_expsyms_F77; do + + case $var in + old_archive_cmds_F77 | \ + old_archive_from_new_cmds_F77 | \ + archive_cmds_F77 | \ + archive_expsym_cmds_F77 | \ + module_cmds_F77 | \ + module_expsym_cmds_F77 | \ + old_archive_from_expsyms_cmds_F77 | \ + export_symbols_cmds_F77 | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_F77 + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_F77 + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_F77 + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_F77 + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_F77 + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_F77 +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_F77 + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_F77 +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_F77 +archive_expsym_cmds=$lt_archive_expsym_cmds_F77 +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_F77 +module_expsym_cmds=$lt_module_expsym_cmds_F77 + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_F77 + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_F77 + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_F77 + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_F77 + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_F77 + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_F77 + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_F77 + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_F77 + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_F77 + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_F77 + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_F77 + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_F77 + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_F77" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_F77 + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_F77 + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_F77 + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_F77 + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + + + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +objext_GCJ=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String argv) {}; }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${GCJ-"gcj"} +compiler=$CC +compiler_GCJ=$CC + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +archive_cmds_need_lc_GCJ=no + + +lt_prog_compiler_no_builtin_flag_GCJ= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' + + +echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:15496: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:15500: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" +else + : +fi + +fi + +lt_prog_compiler_wl_GCJ= +lt_prog_compiler_pic_GCJ= +lt_prog_compiler_static_GCJ= + +echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 + + if test "$GCC" = yes; then + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_static_GCJ='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_GCJ='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_GCJ=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_GCJ=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_GCJ='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_GCJ='-Bstatic' + else + lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_GCJ='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-static' + ;; + ccc*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + sco3.2v5*) + lt_prog_compiler_pic_GCJ='-Kpic' + lt_prog_compiler_static_GCJ='-dn' + ;; + + solaris*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sunos4*) + lt_prog_compiler_wl_GCJ='-Qoption ld ' + lt_prog_compiler_pic_GCJ='-PIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_GCJ='-Kconform_pic' + lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + + uts4*) + lt_prog_compiler_pic_GCJ='-pic' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_GCJ=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6 + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_GCJ"; then + +echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6 +if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works_GCJ=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_GCJ" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:15729: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:15733: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works_GCJ=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6 + +if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then + case $lt_prog_compiler_pic_GCJ in + "" | " "*) ;; + *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; + esac +else + lt_prog_compiler_pic_GCJ= + lt_prog_compiler_can_build_shared_GCJ=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_GCJ= + ;; + *) + lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" + ;; +esac + +echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o_GCJ=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:15789: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:15793: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o_GCJ=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6 + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6 + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 + + runpath_var= + allow_undefined_flag_GCJ= + enable_shared_with_static_runtimes_GCJ=no + archive_cmds_GCJ= + archive_expsym_cmds_GCJ= + old_archive_From_new_cmds_GCJ= + old_archive_from_expsyms_cmds_GCJ= + export_dynamic_flag_spec_GCJ= + whole_archive_flag_spec_GCJ= + thread_safe_flag_spec_GCJ= + hardcode_libdir_flag_spec_GCJ= + hardcode_libdir_flag_spec_ld_GCJ= + hardcode_libdir_separator_GCJ= + hardcode_direct_GCJ=no + hardcode_minus_L_GCJ=no + hardcode_shlibpath_var_GCJ=unsupported + link_all_deplibs_GCJ=unknown + hardcode_automatic_GCJ=no + module_cmds_GCJ= + module_expsym_cmds_GCJ= + always_export_symbols_GCJ=no + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_GCJ= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_GCJ=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_GCJ=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs_GCJ=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_GCJ=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_GCJ='-L$libdir' + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=no + enable_shared_with_static_runtimes_GCJ=yes + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_GCJ=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + sunos4*) + archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds_GCJ="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + archive_expsym_cmds_GCJ="$tmp_archive_cmds" + fi + else + ld_shlibs_GCJ=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + esac + + if test "$ld_shlibs_GCJ" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_GCJ= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=yes + archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_GCJ=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_GCJ=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_GCJ='' + hardcode_direct_GCJ=yes + hardcode_libdir_separator_GCJ=':' + link_all_deplibs_GCJ=yes + + if test "$GCC" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_GCJ=yes + else + # We have old collect2 + hardcode_direct_GCJ=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_GCJ=yes + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_libdir_separator_GCJ= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_GCJ=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_GCJ='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_GCJ="-z nodefs" + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_GCJ=' ${wl}-bernotok' + allow_undefined_flag_GCJ=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols_GCJ=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_GCJ=' ' + archive_cmds_need_lc_GCJ=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + # see comment about different semantics on the GNU ld section + ld_shlibs_GCJ=no + ;; + + bsdi4*) + export_dynamic_flag_spec_GCJ=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_GCJ=' ' + allow_undefined_flag_GCJ=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds_GCJ='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_GCJ=yes + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes ; then + archive_cmds_need_lc_GCJ=no + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag_GCJ='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_GCJ='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_GCJ='-flat_namespace -undefined suppress' + ;; + 10.*) + allow_undefined_flag_GCJ='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_cmds_GCJ='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + archive_cmds_GCJ='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + module_cmds_GCJ='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + hardcode_direct_GCJ=no + hardcode_automatic_GCJ=yes + hardcode_shlibpath_var_GCJ=unsupported + whole_archive_flag_spec_GCJ='-all_load $convenience' + link_all_deplibs_GCJ=yes + else + ld_shlibs_GCJ=no + fi + ;; + + dgux*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_shlibpath_var_GCJ=no + ;; + + freebsd1*) + ld_shlibs_GCJ=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_GCJ='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + ;; + ia64*) + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + ;; + *) + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' + fi + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + link_all_deplibs_GCJ=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + newsos6) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_shlibpath_var_GCJ=no + ;; + + openbsd*) + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + export_dynamic_flag_spec_GCJ='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + ;; + *) + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + allow_undefined_flag_GCJ=unsupported + archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_GCJ='-rpath $libdir' + fi + hardcode_libdir_separator_GCJ=: + ;; + + sco3.2v5*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + export_dynamic_flag_spec_GCJ='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag_GCJ=' -z text' + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_shlibpath_var_GCJ=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs_GCJ=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_GCJ='$CC -r -o $output$reload_objs' + hardcode_direct_GCJ=no + ;; + motorola) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_GCJ=no + ;; + + sysv4.3*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + export_dynamic_flag_spec_GCJ='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_GCJ=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=no + hardcode_shlibpath_var_GCJ=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + no_undefined_flag_GCJ='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_GCJ=no + ;; + + sysv5*) + no_undefined_flag_GCJ=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec_GCJ= + hardcode_shlibpath_var_GCJ=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_shlibpath_var_GCJ=no + ;; + + *) + ld_shlibs_GCJ=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 +echo "${ECHO_T}$ld_shlibs_GCJ" >&6 +test "$ld_shlibs_GCJ" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_GCJ" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_GCJ=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_GCJ in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_GCJ + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ + allow_undefined_flag_GCJ= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_GCJ=no + else + archive_cmds_need_lc_GCJ=yes + fi + allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 +echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6 + ;; + esac + fi + ;; +esac + +echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=yes + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6 +test "$dynamic_linker" = no && can_build_shared=no + +echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +hardcode_action_GCJ= +if test -n "$hardcode_libdir_flag_spec_GCJ" || \ + test -n "$runpath_var GCJ" || \ + test "X$hardcode_automatic_GCJ"="Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_GCJ" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && + test "$hardcode_minus_L_GCJ" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_GCJ=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_GCJ=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_GCJ=unsupported +fi +echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 +echo "${ECHO_T}$hardcode_action_GCJ" >&6 + +if test "$hardcode_action_GCJ" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + ;; + *) + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + ;; + esac +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + echo "$as_me:$LINENO: checking for shl_load" >&5 +echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 +if test "${ac_cv_func_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define shl_load to an innocuous variant, in case declares shl_load. + For example, HP-UX 11i declares gettimeofday. */ +#define shl_load innocuous_shl_load + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shl_load (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shl_load + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_shl_load) || defined (__stub___shl_load) +choke me +#else +char (*f) () = shl_load; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != shl_load; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_shl_load=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +echo "${ECHO_T}$ac_cv_func_shl_load" >&6 +if test $ac_cv_func_shl_load = yes; then + lt_cv_dlopen="shl_load" +else + echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +int +main () +{ +shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_shl_load=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 +if test $ac_cv_lib_dld_shl_load = yes; then + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +else + echo "$as_me:$LINENO: checking for dlopen" >&5 +echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 +if test "${ac_cv_func_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define dlopen to an innocuous variant, in case declares dlopen. + For example, HP-UX 11i declares gettimeofday. */ +#define dlopen innocuous_dlopen + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef dlopen + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_dlopen) || defined (__stub___dlopen) +choke me +#else +char (*f) () = dlopen; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != dlopen; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +echo "${ECHO_T}$ac_cv_func_dlopen" >&6 +if test $ac_cv_func_dlopen = yes; then + lt_cv_dlopen="dlopen" +else + echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 +if test "${ac_cv_lib_svld_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_svld_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_svld_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 +if test $ac_cv_lib_svld_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_dld_link+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dld_link (); +int +main () +{ +dld_link (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_dld_link=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_dld_link=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 +if test $ac_cv_lib_dld_dld_link = yes; then + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 +if test "${lt_cv_dlopen_self+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self" >&6 + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 +if test "${lt_cv_dlopen_self_static+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_GCJ \ + CC_GCJ \ + LD_GCJ \ + lt_prog_compiler_wl_GCJ \ + lt_prog_compiler_pic_GCJ \ + lt_prog_compiler_static_GCJ \ + lt_prog_compiler_no_builtin_flag_GCJ \ + export_dynamic_flag_spec_GCJ \ + thread_safe_flag_spec_GCJ \ + whole_archive_flag_spec_GCJ \ + enable_shared_with_static_runtimes_GCJ \ + old_archive_cmds_GCJ \ + old_archive_from_new_cmds_GCJ \ + predep_objects_GCJ \ + postdep_objects_GCJ \ + predeps_GCJ \ + postdeps_GCJ \ + compiler_lib_search_path_GCJ \ + archive_cmds_GCJ \ + archive_expsym_cmds_GCJ \ + postinstall_cmds_GCJ \ + postuninstall_cmds_GCJ \ + old_archive_from_expsyms_cmds_GCJ \ + allow_undefined_flag_GCJ \ + no_undefined_flag_GCJ \ + export_symbols_cmds_GCJ \ + hardcode_libdir_flag_spec_GCJ \ + hardcode_libdir_flag_spec_ld_GCJ \ + hardcode_libdir_separator_GCJ \ + hardcode_automatic_GCJ \ + module_cmds_GCJ \ + module_expsym_cmds_GCJ \ + lt_cv_prog_compiler_c_o_GCJ \ + exclude_expsyms_GCJ \ + include_expsyms_GCJ; do + + case $var in + old_archive_cmds_GCJ | \ + old_archive_from_new_cmds_GCJ | \ + archive_cmds_GCJ | \ + archive_expsym_cmds_GCJ | \ + module_cmds_GCJ | \ + module_expsym_cmds_GCJ | \ + old_archive_from_expsyms_cmds_GCJ | \ + export_symbols_cmds_GCJ | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_GCJ + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_GCJ + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_GCJ + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_GCJ + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_GCJ + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_GCJ +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_GCJ + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_GCJ +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_GCJ +archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_GCJ +module_expsym_cmds=$lt_module_expsym_cmds_GCJ + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_GCJ + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_GCJ + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_GCJ + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_GCJ + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_GCJ + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_GCJ + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_GCJ + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_GCJ + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_GCJ + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_GCJ + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_GCJ + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_GCJ" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_GCJ + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_GCJ + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_GCJ + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_GCJ + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + else + tagname="" + fi + ;; + + RC) + + + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +objext_RC=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${RC-"windres"} +compiler=$CC +compiler_RC=$CC +lt_cv_prog_compiler_c_o_RC=yes + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_RC \ + CC_RC \ + LD_RC \ + lt_prog_compiler_wl_RC \ + lt_prog_compiler_pic_RC \ + lt_prog_compiler_static_RC \ + lt_prog_compiler_no_builtin_flag_RC \ + export_dynamic_flag_spec_RC \ + thread_safe_flag_spec_RC \ + whole_archive_flag_spec_RC \ + enable_shared_with_static_runtimes_RC \ + old_archive_cmds_RC \ + old_archive_from_new_cmds_RC \ + predep_objects_RC \ + postdep_objects_RC \ + predeps_RC \ + postdeps_RC \ + compiler_lib_search_path_RC \ + archive_cmds_RC \ + archive_expsym_cmds_RC \ + postinstall_cmds_RC \ + postuninstall_cmds_RC \ + old_archive_from_expsyms_cmds_RC \ + allow_undefined_flag_RC \ + no_undefined_flag_RC \ + export_symbols_cmds_RC \ + hardcode_libdir_flag_spec_RC \ + hardcode_libdir_flag_spec_ld_RC \ + hardcode_libdir_separator_RC \ + hardcode_automatic_RC \ + module_cmds_RC \ + module_expsym_cmds_RC \ + lt_cv_prog_compiler_c_o_RC \ + exclude_expsyms_RC \ + include_expsyms_RC; do + + case $var in + old_archive_cmds_RC | \ + old_archive_from_new_cmds_RC | \ + archive_cmds_RC | \ + archive_expsym_cmds_RC | \ + module_cmds_RC | \ + module_expsym_cmds_RC | \ + old_archive_from_expsyms_cmds_RC | \ + export_symbols_cmds_RC | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_RC + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_RC + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_RC + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_RC + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_RC + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_RC +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_RC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_RC +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_RC +archive_expsym_cmds=$lt_archive_expsym_cmds_RC +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_RC +module_expsym_cmds=$lt_module_expsym_cmds_RC + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_RC + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_RC + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_RC + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_RC + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_RC + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_RC + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_RC + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_RC + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_RC + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_RC + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_RC + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_RC + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_RC + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_RC" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_RC + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_RC + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_RC + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_RC + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + ;; + + *) + { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 +echo "$as_me: error: Unsupported tag name: $tagname" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 +echo "$as_me: error: unable to update list of available tagged configurations." >&2;} + { (exit 1); exit 1; }; } fi -else - { echo "$as_me:$LINENO: creating cache $cache_file" >&5 -echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file fi + # This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh" +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' -# Redirect the config.log output again, so that the ltconfig log is not -# clobbered by the next message. -exec 5>>./config.log +# Prevent multiple expansion + + + + + + + + + + + + + + + + + + + # Check whether --enable-autoconf or --disable-autoconf was given. @@ -3633,7 +19519,6 @@ if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -3653,11 +19538,21 @@ main () _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3670,7 +19565,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi @@ -3686,7 +19581,6 @@ if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -3703,11 +19597,21 @@ main () _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3720,7 +19624,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cc_g=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 @@ -3747,7 +19651,6 @@ else ac_cv_prog_cc_stdc=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -3775,6 +19678,16 @@ static char *f (char * (*g) (char **, int), char **p, ...) va_end (v); return s; } + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std1 is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std1. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; @@ -3801,11 +19714,21 @@ do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3818,7 +19741,7 @@ else sed 's/^/| /' conftest.$ac_ext >&5 fi -rm -f conftest.$ac_objext +rm -f conftest.err conftest.$ac_objext done rm -f conftest.$ac_ext conftest.$ac_objext CC=$ac_save_CC @@ -3846,19 +19769,28 @@ cat >conftest.$ac_ext <<_ACEOF _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then for ac_declaration in \ - ''\ - '#include ' \ + '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ @@ -3866,14 +19798,13 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -#include $ac_declaration +#include int main () { @@ -3884,11 +19815,21 @@ exit (42); _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3901,9 +19842,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 continue fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -3920,11 +19860,21 @@ exit (42); _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3936,7 +19886,7 @@ else sed 's/^/| /' conftest.$ac_ext >&5 fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then @@ -3950,7 +19900,7 @@ else sed 's/^/| /' conftest.$ac_ext >&5 fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -3975,18 +19925,34 @@ else # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. - echo '#include "conftest.h"' > conftest.c - echo 'int i;' > conftest.h - echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) @@ -4004,13 +19970,25 @@ else # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ - source=conftest.c object=conftest.o \ - depfile=conftest.Po tmpdepfile=conftest.TPo \ - $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 && - grep conftest.h conftest.Po > /dev/null 2>&1 && + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - am_cv_CC_dependencies_compiler_type=$depmode - break + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi fi done @@ -4023,7 +20001,19 @@ fi fi echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 -CCDEPMODE="depmode=$am_cv_CC_dependencies_compiler_type" +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi ac_ext=c @@ -4054,7 +20044,6 @@ do # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -4065,7 +20054,7 @@ cat >>conftest.$ac_ext <<_ACEOF #else # include #endif - Syntax error + Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 @@ -4077,6 +20066,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -4097,7 +20087,6 @@ rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -4115,6 +20104,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -4161,7 +20151,6 @@ do # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -4172,7 +20161,7 @@ cat >>conftest.$ac_ext <<_ACEOF #else # include #endif - Syntax error + Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 @@ -4184,6 +20173,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -4204,7 +20194,6 @@ rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -4222,6 +20211,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -4271,6 +20261,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 @@ -4287,6 +20278,7 @@ do case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. @@ -4294,20 +20286,20 @@ case $as_dir/ in # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi done done ;; @@ -4350,7 +20342,7 @@ fi echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'` +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -4418,48 +20410,6 @@ fi done test -n "$YACC" || YACC="yacc" - -for ac_prog in flex lex -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_LEX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$LEX"; then - ac_cv_prog_LEX="$LEX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_LEX="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -LEX=$ac_cv_prog_LEX -if test -n "$LEX"; then - echo "$as_me:$LINENO: result: $LEX" >&5 -echo "${ECHO_T}$LEX" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - test -n "$LEX" && break -done -test -n "$LEX" || LEX="${am_missing_run}flex" - for ac_prog in flex lex do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -4511,7 +20461,6 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-lfl $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -4535,11 +20484,21 @@ yywrap (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4552,7 +20511,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_fl_yywrap=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_fl_yywrap" >&5 @@ -4568,7 +20528,6 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-ll $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -4592,11 +20551,21 @@ yywrap (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4609,7 +20578,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_l_yywrap=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_l_yywrap" >&5 @@ -4671,11 +20641,21 @@ cat >conftest.$ac_ext <<_ACEOF _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4687,7 +20667,8 @@ else sed 's/^/| /' conftest.$ac_ext >&5 fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS rm -f "${LEX_OUTPUT_ROOT}.c" @@ -4702,6 +20683,9 @@ _ACEOF fi +fi +if test "$LEX" = :; then + LEX=${am_missing_run}flex fi # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 @@ -4774,29 +20758,12 @@ case "$GCC" in esac - -echo "$as_me:$LINENO: checking for egrep" >&5 -echo $ECHO_N "checking for egrep... $ECHO_C" >&6 -if test "${ac_cv_prog_egrep+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if echo a | (grep -E '(a|b)') >/dev/null 2>&1 - then ac_cv_prog_egrep='grep -E' - else ac_cv_prog_egrep='egrep' - fi -fi -echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 -echo "${ECHO_T}$ac_cv_prog_egrep" >&6 - EGREP=$ac_cv_prog_egrep - - echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -4817,11 +20784,21 @@ main () _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4834,12 +20811,11 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -4861,7 +20837,6 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -4886,132 +20861,68 @@ if test $ac_cv_header_stdc = yes; then : else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - exit(2); - exit (0); -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_header_stdc=no -fi -rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -echo "${ECHO_T}$ac_cv_header_stdc" >&6 -if test $ac_cv_header_stdc = yes; then - -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. - - - - - - - - - -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -$ac_includes_default +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif -#include <$ac_header> +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + exit(2); + exit (0); +} _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then - eval "$as_ac_Header=yes" + : else - echo "$as_me: failed program was:" >&5 + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_Header=no" +( exit $ac_status ) +ac_cv_header_stdc=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then -done +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF +fi for ac_header in errno.h @@ -5030,7 +20941,6 @@ else echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -5041,11 +20951,21 @@ $ac_includes_default _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5058,7 +20978,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 @@ -5066,7 +20986,6 @@ echo "${ECHO_T}$ac_header_compiler" >&6 echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -5084,6 +21003,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -5103,33 +21023,32 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------ ## -## Report this to bug-autoconf@gnu.org. ## -## ------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes ;; - no:yes ) + no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX -## ------------------------------------ ## -## Report this to bug-autoconf@gnu.org. ## -## ------------------------------------ ## +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 @@ -5140,7 +21059,7 @@ echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - eval "$as_ac_Header=$ac_header_preproc" + eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 @@ -5163,7 +21082,6 @@ if test "${ac_cv_c_bigendian+set}" = set; then else # See if sys/param.h defines the BYTE_ORDER macro. cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -5185,11 +21103,21 @@ main () _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5197,7 +21125,6 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (exit $ac_status); }; }; then # It does; now see whether it defined to BIG_ENDIAN or not. cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -5219,11 +21146,21 @@ main () _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5236,7 +21173,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_bigendian=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 @@ -5246,7 +21183,6 @@ if test "$cross_compiling" = yes; then # try to guess the endianness by grepping values into an object file ac_cv_c_bigendian=unknown cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -5268,11 +21204,21 @@ main () _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5294,10 +21240,9 @@ else sed 's/^/| /' conftest.$ac_ext >&5 fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -5336,10 +21281,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_c_bigendian=yes fi -rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5 echo "${ECHO_T}$ac_cv_c_bigendian" >&6 @@ -5366,7 +21311,6 @@ if test "${ac_cv_type_off_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -5386,11 +21330,21 @@ if (sizeof (off_t)) _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5403,7 +21357,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_off_t=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5 echo "${ECHO_T}$ac_cv_type_off_t" >&6 @@ -5423,7 +21377,6 @@ if test "${ac_cv_type_size_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -5443,11 +21396,21 @@ if (sizeof (size_t)) _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5460,7 +21423,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_size_t=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 echo "${ECHO_T}$ac_cv_type_size_t" >&6 @@ -5480,7 +21443,6 @@ if test "${ac_cv_struct_tm+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -5499,11 +21461,21 @@ struct tm *tp; tp->tm_sec; _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5516,7 +21488,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_struct_tm=sys/time.h fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_struct_tm" >&5 echo "${ECHO_T}$ac_cv_struct_tm" >&6 @@ -5534,7 +21506,6 @@ if test "${ac_cv_type_intmax_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -5554,11 +21525,21 @@ if (sizeof (intmax_t)) _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5571,7 +21552,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_intmax_t=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_intmax_t" >&5 echo "${ECHO_T}$ac_cv_type_intmax_t" >&6 @@ -5597,21 +21578,28 @@ if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ + #ifdef __STDC__ # include #else # include #endif + +#undef $ac_func + /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" @@ -5642,11 +21630,21 @@ return f != $ac_func; _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5659,7 +21657,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 @@ -5672,10 +21671,7 @@ fi done - - - - ac_config_headers="$ac_config_headers config.h" + ac_config_headers="$ac_config_headers config.h" ac_config_files="$ac_config_files libasn1compiler/Makefile skeletons/tests/Makefile libasn1parser/Makefile libasn1print/Makefile asn1c/tests/Makefile libasn1fix/Makefile skeletons/Makefile examples/Makefile tests/Makefile asn1c/Makefile doc/Makefile Makefile" @@ -5707,13 +21703,13 @@ _ACEOF # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | @@ -5743,13 +21739,13 @@ test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ + ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; -s/^\([^=]*=[ ]*\):*/\1/; +s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; -s/^[^=]*=[ ]*$//; +s/^[^=]*=[ ]*$//; }' fi @@ -5760,7 +21756,7 @@ ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_i=`echo "$ac_i" | - sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' @@ -5770,6 +21766,41 @@ LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files @@ -5804,9 +21835,10 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi +DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. -if (FOO=FOO; unset FOO) >/dev/null 2>&1; then +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false @@ -5825,7 +21857,7 @@ for as_var in \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do - if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var @@ -6004,16 +22036,17 @@ rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else + test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. -as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. -as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS @@ -6040,7 +22073,7 @@ _ASBOX cat >&5 <<_CSEOF This file was extended by $as_me, which was -generated by GNU Autoconf 2.57. Invocation command line was +generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -6084,9 +22117,9 @@ Usage: $0 [OPTIONS] [FILE]... -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] - instantiate the configuration file FILE + instantiate the configuration file FILE --header=FILE[:TEMPLATE] - instantiate the configuration header FILE + instantiate the configuration header FILE Configuration files: $config_files @@ -6103,11 +22136,10 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status -configured by $0, generated by GNU Autoconf 2.57, +configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" -Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 -Free Software Foundation, Inc. +Copyright (C) 2003 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir @@ -6202,8 +22234,7 @@ cat >>$CONFIG_STATUS <<_ACEOF # INIT-COMMANDS section. # -AMDEP_TRUE="$AMDEP_TRUE" -ac_aux_dir="$ac_aux_dir" +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF @@ -6226,7 +22257,7 @@ do "asn1c/Makefile" ) CONFIG_FILES="$CONFIG_FILES asn1c/Makefile" ;; "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; + "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} @@ -6328,10 +22359,9 @@ s,@target_os@,$target_os,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@CYGPATH_W@,$CYGPATH_W,;t t s,@PACKAGE@,$PACKAGE,;t t s,@VERSION@,$VERSION,;t t -s,@EXEEXT@,$EXEEXT,;t t -s,@OBJEXT@,$OBJEXT,;t t s,@ACLOCAL@,$ACLOCAL,;t t s,@AUTOCONF@,$AUTOCONF,;t t s,@AUTOMAKE@,$AUTOMAKE,;t t @@ -6339,38 +22369,58 @@ s,@AUTOHEADER@,$AUTOHEADER,;t t s,@MAKEINFO@,$MAKEINFO,;t t s,@AMTAR@,$AMTAR,;t t s,@install_sh@,$install_sh,;t t +s,@STRIP@,$STRIP,;t t +s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t +s,@mkdir_p@,$mkdir_p,;t t s,@AWK@,$AWK,;t t s,@SET_MAKE@,$SET_MAKE,;t t -s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t -s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t -s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t -s,@DEPDIR@,$DEPDIR,;t t +s,@am__leading_dot@,$am__leading_dot,;t t s,@PATH@,$PATH,;t t s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t s,@MAINT@,$MAINT,;t t -s,@RANLIB@,$RANLIB,;t t -s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t s,@CC@,$CC,;t t s,@CFLAGS@,$CFLAGS,;t t s,@LDFLAGS@,$LDFLAGS,;t t s,@CPPFLAGS@,$CPPFLAGS,;t t s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@DEPDIR@,$DEPDIR,;t t s,@am__include@,$am__include,;t t s,@am__quote@,$am__quote,;t t +s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t +s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t +s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t s,@CCDEPMODE@,$CCDEPMODE,;t t +s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t +s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t +s,@EGREP@,$EGREP,;t t s,@LN_S@,$LN_S,;t t +s,@ECHO@,$ECHO,;t t +s,@AR@,$AR,;t t +s,@ac_ct_AR@,$ac_ct_AR,;t t +s,@RANLIB@,$RANLIB,;t t +s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t +s,@CPP@,$CPP,;t t +s,@CXX@,$CXX,;t t +s,@CXXFLAGS@,$CXXFLAGS,;t t +s,@ac_ct_CXX@,$ac_ct_CXX,;t t +s,@CXXDEPMODE@,$CXXDEPMODE,;t t +s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t +s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t +s,@CXXCPP@,$CXXCPP,;t t +s,@F77@,$F77,;t t +s,@FFLAGS@,$FFLAGS,;t t +s,@ac_ct_F77@,$ac_ct_F77,;t t s,@LIBTOOL@,$LIBTOOL,;t t s,@CONFIGURE_DEPENDS@,$CONFIGURE_DEPENDS,;t t -s,@CPP@,$CPP,;t t s,@YACC@,$YACC,;t t s,@LEX@,$LEX,;t t s,@LEXLIB@,$LEXLIB,;t t s,@LEX_OUTPUT_ROOT@,$LEX_OUTPUT_ROOT,;t t -s,@AR@,$AR,;t t s,@ADD_CFLAGS@,$ADD_CFLAGS,;t t -s,@EGREP@,$EGREP,;t t s,@LIBOBJS@,$LIBOBJS,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t CEOF @@ -6402,9 +22452,9 @@ _ACEOF (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else - ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end @@ -6422,21 +22472,21 @@ for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } @@ -6452,10 +22502,10 @@ echo X"$ac_file" | as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } @@ -6493,12 +22543,45 @@ case $srcdir in ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac -# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be -# absolute. -ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` -ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` -ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` -ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac case $INSTALL in @@ -6520,7 +22603,7 @@ echo "$as_me: creating $ac_file" >&6;} configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | - sed 's,.*/,,'` by configure." + sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. @@ -6529,24 +22612,24 @@ echo "$as_me: creating $ac_file" >&6;} case $f in -) echo $tmp/stdin ;; [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } - echo $f;; + echo "$f";; *) # Relative - if test -f "$f"; then - # Build tree - echo $f - elif test -f "$srcdir/$f"; then - # Source tree - echo $srcdir/$f - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } - fi;; + fi;; esac done` || { (exit 1); exit 1; } _ACEOF @@ -6588,12 +22671,12 @@ cat >>$CONFIG_STATUS <<\_ACEOF # NAME is the cpp macro being defined and VALUE is the value it is being given. # # ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='[ ].*$,\1#\2' +ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='[ ].*$,\1#\2' ac_dC=' ' ac_dD=',;t' # ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_uB='$,\1#\2define\3' ac_uC=' ' ac_uD=',;t' @@ -6602,11 +22685,11 @@ for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac @@ -6620,28 +22703,29 @@ echo "$as_me: creating $ac_file" >&6;} case $f in -) echo $tmp/stdin ;; [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } - echo $f;; + # Do quote $f, to prevent DOS paths from being IFS'd. + echo "$f";; *) # Relative - if test -f "$f"; then - # Build tree - echo $f - elif test -f "$srcdir/$f"; then - # Source tree - echo $srcdir/$f - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } - fi;; + fi;; esac done` || { (exit 1); exit 1; } # Remove the trailing spaces. - sed 's/[ ]*$//' $ac_file_inputs >$tmp/in + sed 's/[ ]*$//' $ac_file_inputs >$tmp/in _ACEOF @@ -6664,9 +22748,9 @@ s/[\\&,]/\\&/g s,[\\$`],\\&,g t clear : clear -s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp t end -s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp : end _ACEOF # If some macros were called several times there might be several times @@ -6680,13 +22764,13 @@ rm -f confdef2sed.sed # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. cat >>conftest.undefs <<\_ACEOF -s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, +s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, _ACEOF # Break up conftest.defines because some shells have a limit on the size # of here documents, and old seds have small limits too (100 cmds). echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS -echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS +echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS echo ' :' >>$CONFIG_STATUS rm -f conftest.tail @@ -6695,7 +22779,7 @@ do # Write a limited-size here document to $tmp/defines.sed. echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS # Speed up: don't consider the non `#define' lines. - echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS + echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS # Work around the forget-to-reset-the-flag bug. echo 't clr' >>$CONFIG_STATUS echo ': clr' >>$CONFIG_STATUS @@ -6722,7 +22806,7 @@ do # Write a limited-size here document to $tmp/undefs.sed. echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS # Speed up: don't consider the non `#undef' - echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS + echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS # Work around the forget-to-reset-the-flag bug. echo 't clr' >>$CONFIG_STATUS echo ': clr' >>$CONFIG_STATUS @@ -6756,10 +22840,10 @@ echo "$as_me: $ac_file is unchanged" >&6;} else ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } @@ -6775,10 +22859,10 @@ echo X"$ac_file" | as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } @@ -6798,13 +22882,29 @@ echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} cat $tmp/config.h rm -f $tmp/config.h fi - # Run the commands associated with the file. - case $ac_file in - config.h ) # update the timestamp -echo timestamp >"./stamp-h1" - ;; +# Compute $ac_file's index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $ac_file | $ac_file:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done +echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null || +$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X$ac_file : 'X\(//\)[^/]' \| \ + X$ac_file : 'X\(//\)$' \| \ + X$ac_file : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X$ac_file | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'`/stamp-h$_am_stamp_count +done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF @@ -6816,16 +22916,41 @@ for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_dir=`(dirname "$ac_dest") 2>/dev/null || $as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_dest" : 'X\(//\)[^/]' \| \ - X"$ac_dest" : 'X\(//\)$' \| \ - X"$ac_dest" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$ac_dest" : 'X\(//\)[^/]' \| \ + X"$ac_dest" : 'X\(//\)$' \| \ + X"$ac_dest" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$ac_dest" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + ac_builddir=. if test "$ac_dir" != .; then @@ -6851,36 +22976,86 @@ case $srcdir in ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac -# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be -# absolute. -ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` -ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` -ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` -ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 echo "$as_me: executing $ac_dest commands" >&6;} case $ac_dest in - default-1 ) -test x"$AMDEP_TRUE" != x"" || -for mf in $CONFIG_FILES; do - case "$mf" in - Makefile) dirpart=.;; - */Makefile) dirpart=`echo "$mf" | sed -e 's|/[^/]*$||'`;; - *) continue;; - esac + depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`(dirname "$mf") 2>/dev/null || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + else + continue + fi grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue # Extract the definition of DEP_FILES from the Makefile without # running `make'. - DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n -e '/^U = / s///p' < "$mf"` + U=`sed -n 's/^U = //p' < "$mf"` test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" # We invoke sed twice because it is the simplest approach to # changing $(DEPDIR) to its actual value in the expansion. - for file in `sed -n -e ' + for file in `sed -n ' /^DEP_FILES = .*\\\\$/ { s/^DEP_FILES = // :loop @@ -6894,8 +23069,43 @@ for mf in $CONFIG_FILES; do sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue - fdir=`echo "$file" | sed -e 's|/[^/]*$||'` - $ac_aux_dir/mkinstalldirs "$dirpart/$fdir" > /dev/null 2>&1 + fdir=`(dirname "$file") 2>/dev/null || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p $dirpart/$fdir + else + as_dir=$dirpart/$fdir + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 +echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} + { (exit 1); exit 1; }; }; } + # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done diff --git a/configure.in b/configure.in index ea31dbbf9..5ad2b02f8 100644 --- a/configure.in +++ b/configure.in @@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_SYSTEM AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.8.11) +AM_INIT_AUTOMAKE(asn1c, 0.8.12) AC_SUBST(PATH) diff --git a/doc/Makefile.in b/doc/Makefile.in index 656e87741..cf2e85e95 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -1,7 +1,8 @@ -# Makefile.in generated automatically by automake 1.5 from Makefile.am. +# Makefile.in generated by automake 1.8.4 from Makefile.am. +# @configure_input@ -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -12,93 +13,183 @@ # PARTICULAR PURPOSE. @SET_MAKE@ - -SHELL = @SHELL@ - srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) -transform = @program_transform_name@ +transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_alias = @build_alias@ build_triplet = @build@ -host_alias = @host_alias@ host_triplet = @host@ -target_alias = @target_alias@ target_triplet = @target@ +subdir = doc +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ ADD_CFLAGS = @ADD_CFLAGS@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ -AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ -OBJDUMP = @OBJDUMP@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ PATH = @PATH@ +PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ +am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ install_sh = @install_sh@ - +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ EXTRA_DIST = *.pdf CLEANFILES = *.*~ -subdir = doc -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -DIST_SOURCES = -DIST_COMMON = Makefile.am Makefile.in all: all-am .SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu doc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo @@ -108,33 +199,35 @@ clean-libtool: distclean-libtool: -rm -f libtool -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu doc/Makefile -Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) && \ - CONFIG_HEADERS= CONFIG_LINKS= \ - CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: tags: TAGS TAGS: +ctags: CTAGS +CTAGS: -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -top_distdir = .. -distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - $(mkinstalldirs) "$(distdir)/$$dir"; \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ fi; \ if test -d $$d/$$file; then \ - cp -pR $$d/$$file $(distdir) \ - || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ @@ -144,9 +237,7 @@ distdir: $(DISTFILES) check-am: all-am check: check-am all-am: Makefile - installdirs: - install: install-am install-exec: install-exec-am install-data: install-data-am @@ -158,6 +249,7 @@ install-am: all-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: @@ -166,7 +258,7 @@ clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + -rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -176,13 +268,15 @@ clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am - + -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool dvi: dvi-am dvi-am: +html: html-am + info: info-am info-am: @@ -198,23 +292,32 @@ install-man: installcheck-am: maintainer-clean: maintainer-clean-am - + -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + uninstall-am: uninstall-info-am .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am info info-am install install-am install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-man install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool uninstall uninstall-am uninstall-info-am + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ + uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/examples/Makefile.in b/examples/Makefile.in index 468ae0654..fcc052a0c 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -1,7 +1,8 @@ -# Makefile.in generated automatically by automake 1.5 from Makefile.am. +# Makefile.in generated by automake 1.8.4 from Makefile.am. +# @configure_input@ -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -13,152 +14,244 @@ @SET_MAKE@ -SHELL = @SHELL@ - srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) -transform = @program_transform_name@ +transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_alias = @build_alias@ build_triplet = @build@ -host_alias = @host_alias@ host_triplet = @host@ -target_alias = @target_alias@ target_triplet = @target@ +subdir = examples +DIST_COMMON = README $(dist_bin_SCRIPTS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +dist_binSCRIPT_INSTALL = $(INSTALL_SCRIPT) +SCRIPTS = $(dist_bin_SCRIPTS) +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ ADD_CFLAGS = @ADD_CFLAGS@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ -AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ -OBJDUMP = @OBJDUMP@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ PATH = @PATH@ +PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ +am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ install_sh = @install_sh@ - +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ dist_bin_SCRIPTS = crfc2asn1.pl clyx2asn1.pl - EXTRA_DIST = *.asn1 rfc*.txt -subdir = examples -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -SCRIPTS = $(dist_bin_SCRIPTS) - -DIST_SOURCES = -DIST_COMMON = README $(dist_bin_SCRIPTS) Makefile.am Makefile.in all: all-am .SUFFIXES: - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu examples/Makefile -Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) && \ - CONFIG_HEADERS= CONFIG_LINKS= \ - CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-dist_binSCRIPTS: $(dist_bin_SCRIPTS) @$(NORMAL_INSTALL) - $(mkinstalldirs) $(DESTDIR)$(bindir) + test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" @list='$(dist_bin_SCRIPTS)'; for p in $$list; do \ - f="`echo $$p|sed '$(transform)'`"; \ - if test -f $$p; then \ - echo " $(INSTALL_SCRIPT) $$p $(DESTDIR)$(bindir)/$$f"; \ - $(INSTALL_SCRIPT) $$p $(DESTDIR)$(bindir)/$$f; \ - elif test -f $(srcdir)/$$p; then \ - echo " $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(bindir)/$$f"; \ - $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(bindir)/$$f; \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f $$d$$p; then \ + f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ + echo " $(dist_binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \ + $(dist_binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \ else :; fi; \ done uninstall-dist_binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(dist_bin_SCRIPTS)'; for p in $$list; do \ - f="`echo $$p|sed '$(transform)'`"; \ - echo " rm -f $(DESTDIR)$(bindir)/$$f"; \ - rm -f $(DESTDIR)$(bindir)/$$f; \ + f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ + echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ + rm -f "$(DESTDIR)$(bindir)/$$f"; \ done + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool uninstall-info-am: tags: TAGS TAGS: +ctags: CTAGS +CTAGS: -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -top_distdir = .. -distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - $(mkinstalldirs) "$(distdir)/$$dir"; \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ fi; \ if test -d $$d/$$file; then \ - cp -pR $$d/$$file $(distdir) \ - || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ @@ -168,10 +261,10 @@ distdir: $(DISTFILES) check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) - installdirs: - $(mkinstalldirs) $(DESTDIR)$(bindir) - + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done install: install-am install-exec: install-exec-am install-data: install-data-am @@ -183,6 +276,7 @@ install-am: all-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: @@ -190,7 +284,7 @@ mostlyclean-generic: clean-generic: distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + -rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -200,20 +294,22 @@ clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am - + -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool dvi: dvi-am dvi-am: +html: html-am + info: info-am info-am: -install-data-am: install-dist_binSCRIPTS +install-data-am: -install-exec-am: +install-exec-am: install-dist_binSCRIPTS install-info: install-info-am @@ -222,24 +318,33 @@ install-man: installcheck-am: maintainer-clean: maintainer-clean-am - + -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + uninstall-am: uninstall-dist_binSCRIPTS uninstall-info-am .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am info info-am install install-am install-data \ - install-data-am install-dist_binSCRIPTS install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic mostlyclean-libtool uninstall uninstall-am \ - uninstall-dist_binSCRIPTS uninstall-info-am + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dist_binSCRIPTS \ + install-exec install-exec-am install-info install-info-am \ + install-man install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am uninstall uninstall-am uninstall-dist_binSCRIPTS \ + uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/libasn1compiler/Makefile.in b/libasn1compiler/Makefile.in index 3869df397..032a8292a 100644 --- a/libasn1compiler/Makefile.in +++ b/libasn1compiler/Makefile.in @@ -1,7 +1,8 @@ -# Makefile.in generated automatically by automake 1.5 from Makefile.am. +# Makefile.in generated by automake 1.8.4 from Makefile.am. +# @configure_input@ -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -13,88 +14,192 @@ @SET_MAKE@ -SHELL = @SHELL@ +SOURCES = $(libasn1compiler_la_SOURCES) check_compiler.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) -transform = @program_transform_name@ +transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_alias = @build_alias@ build_triplet = @build@ -host_alias = @host_alias@ host_triplet = @host@ -target_alias = @target_alias@ target_triplet = @target@ +check_PROGRAMS = check_compiler$(EXEEXT) +subdir = libasn1compiler +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libasn1compiler_la_DEPENDENCIES = \ + ${top_builddir}/libasn1parser/libasn1parser.la \ + ${top_builddir}/libasn1fix/libasn1fix.la +am_libasn1compiler_la_OBJECTS = asn1compiler.lo asn1c_misc.lo \ + asn1c_out.lo asn1c_lang.lo asn1c_save.lo asn1c_C.lo +libasn1compiler_la_OBJECTS = $(am_libasn1compiler_la_OBJECTS) +check_compiler_SOURCES = check_compiler.c +check_compiler_OBJECTS = check_compiler.$(OBJEXT) +check_compiler_LDADD = $(LDADD) +am__DEPENDENCIES_1 = libasn1compiler.la +am__DEPENDENCIES_2 = ${top_builddir}/libasn1parser/libasn1parser.la \ + ${top_builddir}/libasn1fix/libasn1fix.la +check_compiler_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_2) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/asn1c_C.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1c_lang.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1c_misc.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1c_out.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1c_save.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1compiler.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/check_compiler.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(libasn1compiler_la_SOURCES) check_compiler.c +DIST_SOURCES = $(libasn1compiler_la_SOURCES) check_compiler.c +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ ADD_CFLAGS = @ADD_CFLAGS@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ -AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ -OBJDUMP = @OBJDUMP@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ PATH = @PATH@ +PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ +am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ install_sh = @install_sh@ - +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ AM_CPPFLAGS = \ -I${top_srcdir}/libasn1parser \ -I${top_srcdir}/libasn1fix - noinst_LTLIBRARIES = libasn1compiler.la - libasn1compiler_la_LDFLAGS = -all-static libasn1compiler_la_SOURCES = \ asn1compiler.c asn1compiler.h \ @@ -105,164 +210,166 @@ libasn1compiler_la_SOURCES = \ asn1c_C.c asn1c_C.h \ asn1c_internal.h - libasn1compiler_la_LIBADD = \ ${top_builddir}/libasn1parser/libasn1parser.la \ ${top_builddir}/libasn1fix/libasn1fix.la - -check_PROGRAMS = check_compiler - TESTS = ${check_PROGRAMS} - LDADD = ${noinst_LTLIBRARIES} ${libasn1compiler_la_LIBADD} DEPENDENCIES = ${LDADD} -subdir = libasn1compiler -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -LTLIBRARIES = $(noinst_LTLIBRARIES) - -libasn1compiler_la_DEPENDENCIES = \ - ${top_builddir}/libasn1parser/libasn1parser.la \ - ${top_builddir}/libasn1fix/libasn1fix.la -am_libasn1compiler_la_OBJECTS = asn1compiler.lo asn1c_misc.lo \ - asn1c_out.lo asn1c_lang.lo asn1c_save.lo asn1c_C.lo -libasn1compiler_la_OBJECTS = $(am_libasn1compiler_la_OBJECTS) -check_PROGRAMS = check_compiler$(EXEEXT) -check_compiler_SOURCES = check_compiler.c -check_compiler_OBJECTS = check_compiler.$(OBJEXT) -check_compiler_LDADD = $(LDADD) -check_compiler_DEPENDENCIES = libasn1compiler.la \ - ${top_builddir}/libasn1parser/libasn1parser.la \ - ${top_builddir}/libasn1fix/libasn1fix.la -check_compiler_LDFLAGS = - -DEFS = @DEFS@ -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/asn1c_C.Plo $(DEPDIR)/asn1c_lang.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1c_misc.Plo $(DEPDIR)/asn1c_out.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1c_save.Plo $(DEPDIR)/asn1compiler.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/check_compiler.Po -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ - $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -CFLAGS = @CFLAGS@ -DIST_SOURCES = $(libasn1compiler_la_SOURCES) check_compiler.c -DIST_COMMON = Makefile.am Makefile.in -SOURCES = $(libasn1compiler_la_SOURCES) check_compiler.c - all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libasn1compiler/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu libasn1compiler/Makefile -Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) && \ - CONFIG_HEADERS= CONFIG_LINKS= \ - CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" = "$$p" && dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done libasn1compiler.la: $(libasn1compiler_la_OBJECTS) $(libasn1compiler_la_DEPENDENCIES) $(LINK) $(libasn1compiler_la_LDFLAGS) $(libasn1compiler_la_OBJECTS) $(libasn1compiler_la_LIBADD) $(LIBS) clean-checkPROGRAMS: - -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) + @list='$(check_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done check_compiler$(EXEEXT): $(check_compiler_OBJECTS) $(check_compiler_DEPENDENCIES) @rm -f check_compiler$(EXEEXT) $(LINK) $(check_compiler_LDFLAGS) $(check_compiler_OBJECTS) $(check_compiler_LDADD) $(LIBS) mostlyclean-compile: - -rm -f *.$(OBJEXT) core *.core + -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1c_C.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1c_lang.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1c_misc.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1c_out.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1c_save.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1compiler.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/check_compiler.Po@am__quote@ - -distclean-depend: - -rm -rf $(DEPDIR) +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c_C.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c_lang.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c_misc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c_out.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c_save.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1compiler.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_compiler.Po@am__quote@ .c.o: -@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: -@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(COMPILE) -c `cygpath -w $<` +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: -@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< -CCDEPMODE = @CCDEPMODE@ -uninstall-info-am: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< -tags: TAGS +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - mkid -fID $$unique $(LISP) + mkid -fID $$unique +tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ - || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -z "$$unique" && unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique GTAGS: - here=`CDPATH=: && cd $(top_builddir) && pwd` \ + here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; \ + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ @@ -274,26 +381,29 @@ check-TESTS: $(TESTS) all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - echo "XPASS: $$tst"; \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ ;; \ *) \ - echo "PASS: $$tst"; \ + echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ - xfail=`expr $$xfail + 1`; \ - echo "XFAIL: $$tst"; \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ ;; \ *) \ - failed=`expr $$failed + 1`; \ - echo "FAIL: $$tst"; \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ ;; \ esac; \ + else \ + skip=`expr $$skip + 1`; \ + echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ @@ -309,28 +419,49 @@ check-TESTS: $(TESTS) banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + skipped="($$skip tests were not run)"; \ + test `echo "$$skipped" | wc -c` -gt `echo "$$banner" | wc -c` && \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -gt `echo "$$banner" | wc -c` && \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ + test -n "$$skipped" && echo "$$skipped"; \ + test -n "$$report" && echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ - fi - -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -top_distdir = .. -distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + else :; fi distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - $(mkinstalldirs) "$(distdir)/$$dir"; \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ fi; \ if test -d $$d/$$file; then \ - cp -pR $$d/$$file $(distdir) \ - || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ @@ -342,9 +473,7 @@ check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) - installdirs: - install: install-am install-exec: install-exec-am install-data: install-data-am @@ -356,6 +485,7 @@ install-am: all-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: @@ -363,7 +493,7 @@ mostlyclean-generic: clean-generic: distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + -rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -374,14 +504,17 @@ clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am - -distclean-am: clean-am distclean-compile distclean-depend \ - distclean-generic distclean-libtool distclean-tags + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags dvi: dvi-am dvi-am: +html: html-am + info: info-am info-am: @@ -397,7 +530,8 @@ install-man: installcheck-am: maintainer-clean: maintainer-clean-am - + -rm -rf ./$(DEPDIR) + -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am @@ -405,18 +539,26 @@ mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + uninstall-am: uninstall-info-am -.PHONY: GTAGS all all-am check check-TESTS check-am clean \ +.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ - clean-noinstLTLIBRARIES distclean distclean-compile \ - distclean-depend distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am info info-am install \ - install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/libasn1fix/Makefile.in b/libasn1fix/Makefile.in index 8d919c20c..b64912306 100644 --- a/libasn1fix/Makefile.in +++ b/libasn1fix/Makefile.in @@ -1,7 +1,8 @@ -# Makefile.in generated automatically by automake 1.5 from Makefile.am. +# Makefile.in generated by automake 1.8.4 from Makefile.am. +# @configure_input@ -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -13,86 +14,201 @@ @SET_MAKE@ -SHELL = @SHELL@ +SOURCES = $(libasn1fix_la_SOURCES) check_fixer.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) -transform = @program_transform_name@ +transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_alias = @build_alias@ build_triplet = @build@ -host_alias = @host_alias@ host_triplet = @host@ -target_alias = @target_alias@ target_triplet = @target@ +check_PROGRAMS = check_fixer$(EXEEXT) +subdir = libasn1fix +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libasn1fix_la_DEPENDENCIES = \ + ${top_builddir}/libasn1parser/libasn1parser.la +am_libasn1fix_la_OBJECTS = asn1fix.lo asn1fix_misc.lo asn1fix_value.lo \ + asn1fix_compat.lo asn1fix_constr.lo asn1fix_cstring.lo \ + asn1fix_retrieve.lo asn1fix_bitstring.lo asn1fix_integer.lo \ + asn1fix_dereft.lo asn1fix_derefv.lo asn1fix_export.lo \ + asn1fix_param.lo asn1fix_class.lo asn1fix_tags.lo \ + asn1fix_enum.lo +libasn1fix_la_OBJECTS = $(am_libasn1fix_la_OBJECTS) +check_fixer_SOURCES = check_fixer.c +check_fixer_OBJECTS = check_fixer.$(OBJEXT) +check_fixer_LDADD = $(LDADD) +am__DEPENDENCIES_1 = libasn1fix.la +am__DEPENDENCIES_2 = ${top_builddir}/libasn1parser/libasn1parser.la +check_fixer_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/asn1fix.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_bitstring.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_class.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_compat.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_constr.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_cstring.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_dereft.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_derefv.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_enum.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_export.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_integer.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_misc.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_param.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_retrieve.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_tags.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_value.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/check_fixer.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(libasn1fix_la_SOURCES) check_fixer.c +DIST_SOURCES = $(libasn1fix_la_SOURCES) check_fixer.c +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ ADD_CFLAGS = @ADD_CFLAGS@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ -AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ -OBJDUMP = @OBJDUMP@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ PATH = @PATH@ +PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ +am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ install_sh = @install_sh@ - +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ AM_CFLAGS = @ADD_CFLAGS@ AM_CPPFLAGS = -I${top_srcdir}/libasn1parser - noinst_LTLIBRARIES = libasn1fix.la - libasn1fix_la_LDFLAGS = -all-static libasn1fix_la_SOURCES = \ asn1fix.c asn1fix.h \ @@ -114,185 +230,173 @@ libasn1fix_la_SOURCES = \ asn1fix_enum.c asn1fix_enum.h libasn1fix_la_LIBADD = ${top_builddir}/libasn1parser/libasn1parser.la - -check_PROGRAMS = check_fixer - LDADD = ${noinst_LTLIBRARIES} ${libasn1fix_la_LIBADD} DEPENDENCIES = ${LDADD} - TESTS_ENVIRONMENT = ./check_fixer TESTS = ${top_srcdir}/tests/*.asn1 -subdir = libasn1fix -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -LTLIBRARIES = $(noinst_LTLIBRARIES) - -libasn1fix_la_DEPENDENCIES = \ - ${top_builddir}/libasn1parser/libasn1parser.la -am_libasn1fix_la_OBJECTS = asn1fix.lo asn1fix_misc.lo asn1fix_value.lo \ - asn1fix_compat.lo asn1fix_constr.lo asn1fix_cstring.lo \ - asn1fix_retrieve.lo asn1fix_bitstring.lo asn1fix_integer.lo \ - asn1fix_dereft.lo asn1fix_derefv.lo asn1fix_export.lo \ - asn1fix_param.lo asn1fix_class.lo asn1fix_tags.lo \ - asn1fix_enum.lo -libasn1fix_la_OBJECTS = $(am_libasn1fix_la_OBJECTS) -check_PROGRAMS = check_fixer$(EXEEXT) -check_fixer_SOURCES = check_fixer.c -check_fixer_OBJECTS = check_fixer.$(OBJEXT) -check_fixer_LDADD = $(LDADD) -check_fixer_DEPENDENCIES = libasn1fix.la \ - ${top_builddir}/libasn1parser/libasn1parser.la -check_fixer_LDFLAGS = - -DEFS = @DEFS@ -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/asn1fix.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1fix_bitstring.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1fix_class.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1fix_compat.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1fix_constr.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1fix_cstring.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1fix_dereft.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1fix_derefv.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1fix_enum.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1fix_export.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1fix_integer.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1fix_misc.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1fix_param.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1fix_retrieve.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1fix_tags.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1fix_value.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/check_fixer.Po -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ - $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -CFLAGS = @CFLAGS@ -DIST_SOURCES = $(libasn1fix_la_SOURCES) check_fixer.c -DIST_COMMON = Makefile.am Makefile.in -SOURCES = $(libasn1fix_la_SOURCES) check_fixer.c - all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libasn1fix/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu libasn1fix/Makefile -Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) && \ - CONFIG_HEADERS= CONFIG_LINKS= \ - CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" = "$$p" && dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done libasn1fix.la: $(libasn1fix_la_OBJECTS) $(libasn1fix_la_DEPENDENCIES) $(LINK) $(libasn1fix_la_LDFLAGS) $(libasn1fix_la_OBJECTS) $(libasn1fix_la_LIBADD) $(LIBS) clean-checkPROGRAMS: - -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) + @list='$(check_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done check_fixer$(EXEEXT): $(check_fixer_OBJECTS) $(check_fixer_DEPENDENCIES) @rm -f check_fixer$(EXEEXT) $(LINK) $(check_fixer_LDFLAGS) $(check_fixer_OBJECTS) $(check_fixer_LDADD) $(LIBS) mostlyclean-compile: - -rm -f *.$(OBJEXT) core *.core + -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_bitstring.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_class.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_compat.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_constr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_cstring.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_dereft.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_derefv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_enum.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_export.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_integer.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_misc.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_param.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_retrieve.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_tags.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1fix_value.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/check_fixer.Po@am__quote@ - -distclean-depend: - -rm -rf $(DEPDIR) +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_bitstring.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_compat.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_constr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_cstring.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_dereft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_derefv.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_enum.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_export.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_integer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_misc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_param.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_retrieve.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_tags.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_value.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_fixer.Po@am__quote@ .c.o: -@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: -@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(COMPILE) -c `cygpath -w $<` +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: -@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< -CCDEPMODE = @CCDEPMODE@ -uninstall-info-am: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< -tags: TAGS +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - mkid -fID $$unique $(LISP) + mkid -fID $$unique +tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -z "$$unique" && unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ - || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique GTAGS: - here=`CDPATH=: && cd $(top_builddir) && pwd` \ + here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; \ + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ @@ -304,26 +408,29 @@ check-TESTS: $(TESTS) all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - echo "XPASS: $$tst"; \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ ;; \ *) \ - echo "PASS: $$tst"; \ + echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ - xfail=`expr $$xfail + 1`; \ - echo "XFAIL: $$tst"; \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ ;; \ *) \ - failed=`expr $$failed + 1`; \ - echo "FAIL: $$tst"; \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ ;; \ esac; \ + else \ + skip=`expr $$skip + 1`; \ + echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ @@ -339,28 +446,49 @@ check-TESTS: $(TESTS) banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + skipped="($$skip tests were not run)"; \ + test `echo "$$skipped" | wc -c` -gt `echo "$$banner" | wc -c` && \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -gt `echo "$$banner" | wc -c` && \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ + test -n "$$skipped" && echo "$$skipped"; \ + test -n "$$report" && echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ - fi - -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -top_distdir = .. -distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + else :; fi distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - $(mkinstalldirs) "$(distdir)/$$dir"; \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ fi; \ if test -d $$d/$$file; then \ - cp -pR $$d/$$file $(distdir) \ - || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ @@ -372,9 +500,7 @@ check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) - installdirs: - install: install-am install-exec: install-exec-am install-data: install-data-am @@ -386,6 +512,7 @@ install-am: all-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: @@ -393,7 +520,7 @@ mostlyclean-generic: clean-generic: distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + -rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -404,14 +531,17 @@ clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am - -distclean-am: clean-am distclean-compile distclean-depend \ - distclean-generic distclean-libtool distclean-tags + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags dvi: dvi-am dvi-am: +html: html-am + info: info-am info-am: @@ -427,7 +557,8 @@ install-man: installcheck-am: maintainer-clean: maintainer-clean-am - + -rm -rf ./$(DEPDIR) + -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am @@ -435,18 +566,26 @@ mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + uninstall-am: uninstall-info-am -.PHONY: GTAGS all all-am check check-TESTS check-am clean \ +.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ - clean-noinstLTLIBRARIES distclean distclean-compile \ - distclean-depend distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am info info-am install \ - install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index 7c4bd5f88..f405e604e 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -1,7 +1,8 @@ -# Makefile.in generated automatically by automake 1.5 from Makefile.am. +# Makefile.in generated by automake 1.8.4 from Makefile.am. +# @configure_input@ -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -13,87 +14,198 @@ @SET_MAKE@ -SHELL = @SHELL@ +SOURCES = $(libasn1parser_la_SOURCES) check_parser.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) -transform = @program_transform_name@ +transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_alias = @build_alias@ build_triplet = @build@ -host_alias = @host_alias@ host_triplet = @host@ -target_alias = @target_alias@ target_triplet = @target@ +check_PROGRAMS = check_parser$(EXEEXT) +subdir = libasn1parser +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in asn1p_l.c \ + asn1p_y.c asn1p_y.h +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libasn1parser_la_LIBADD = +am_libasn1parser_la_OBJECTS = asn1parser.lo asn1p_y.lo asn1p_l.lo \ + asn1p_module.lo asn1p_oid.lo asn1p_value.lo asn1p_expr.lo \ + asn1p_xports.lo asn1p_constr.lo asn1p_param.lo asn1p_class.lo \ + asn1p_ref.lo +libasn1parser_la_OBJECTS = $(am_libasn1parser_la_OBJECTS) +check_parser_SOURCES = check_parser.c +check_parser_OBJECTS = check_parser.$(OBJEXT) +check_parser_LDADD = $(LDADD) +am__DEPENDENCIES_1 = libasn1parser.la +check_parser_DEPENDENCIES = $(am__DEPENDENCIES_1) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/asn1p_class.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1p_constr.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1p_expr.Plo ./$(DEPDIR)/asn1p_l.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1p_module.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1p_oid.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1p_param.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1p_ref.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1p_value.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1p_xports.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1p_y.Plo ./$(DEPDIR)/asn1parser.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/check_parser.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) +LTLEXCOMPILE = $(LIBTOOL) --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) +YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) +LTYACCCOMPILE = $(LIBTOOL) --mode=compile $(YACC) $(YFLAGS) \ + $(AM_YFLAGS) +SOURCES = $(libasn1parser_la_SOURCES) check_parser.c +DIST_SOURCES = $(libasn1parser_la_SOURCES) check_parser.c +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ ADD_CFLAGS = @ADD_CFLAGS@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ -AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ -OBJDUMP = @OBJDUMP@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ PATH = @PATH@ +PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ +am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ install_sh = @install_sh@ - +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ AM_CFLAGS = @ADD_CFLAGS@ AM_YFLAGS = -p asn1p_ -d AM_LFLAGS = -sp -Cem -Pasn1p_ -olex.yy.c - noinst_LTLIBRARIES = libasn1parser.la - libasn1parser_la_LDFLAGS = -all-static libasn1parser_la_SOURCES = \ asn1parser.c asn1parser.h \ @@ -111,189 +223,199 @@ libasn1parser_la_SOURCES = \ asn1p_ref.c asn1p_ref.h \ asn1p_list.h - EXTRA_DIST = expr-h.pl - -check_PROGRAMS = check_parser - LDADD = ${noinst_LTLIBRARIES} DEPENDENCIES = ${noinst_LTLIBRARIES} - TESTS = ${check_PROGRAMS} -subdir = libasn1parser -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -LTLIBRARIES = $(noinst_LTLIBRARIES) - -libasn1parser_la_LIBADD = -am_libasn1parser_la_OBJECTS = asn1parser.lo asn1p_y.lo asn1p_l.lo \ - asn1p_module.lo asn1p_oid.lo asn1p_value.lo asn1p_expr.lo \ - asn1p_xports.lo asn1p_constr.lo asn1p_param.lo asn1p_class.lo \ - asn1p_ref.lo -libasn1parser_la_OBJECTS = $(am_libasn1parser_la_OBJECTS) -check_PROGRAMS = check_parser$(EXEEXT) -check_parser_SOURCES = check_parser.c -check_parser_OBJECTS = check_parser.$(OBJEXT) -check_parser_LDADD = $(LDADD) -check_parser_DEPENDENCIES = libasn1parser.la -check_parser_LDFLAGS = - -DEFS = @DEFS@ -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/asn1p_class.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1p_constr.Plo $(DEPDIR)/asn1p_expr.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1p_l.Plo $(DEPDIR)/asn1p_module.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1p_oid.Plo $(DEPDIR)/asn1p_param.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1p_ref.Plo $(DEPDIR)/asn1p_value.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1p_xports.Plo $(DEPDIR)/asn1p_y.Plo \ -@AMDEP_TRUE@ $(DEPDIR)/asn1parser.Plo $(DEPDIR)/check_parser.Po -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ - $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -CFLAGS = @CFLAGS@ -LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) -LTLEXCOMPILE = $(LIBTOOL) --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) -YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) -LTYACCCOMPILE = $(LIBTOOL) --mode=compile $(YACC) $(YFLAGS) $(AM_YFLAGS) -DIST_SOURCES = $(libasn1parser_la_SOURCES) check_parser.c -DIST_COMMON = Makefile.am Makefile.in asn1p_l.c asn1p_y.c asn1p_y.h -SOURCES = $(libasn1parser_la_SOURCES) check_parser.c - all: all-am .SUFFIXES: .SUFFIXES: .c .l .lo .o .obj .y - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libasn1parser/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu libasn1parser/Makefile -Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) && \ - CONFIG_HEADERS= CONFIG_LINKS= \ - CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" = "$$p" && dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done asn1p_y.h: asn1p_y.c + @if test ! -f $@; then \ + rm -f asn1p_y.c; \ + $(MAKE) asn1p_y.c; \ + else :; fi libasn1parser.la: $(libasn1parser_la_OBJECTS) $(libasn1parser_la_DEPENDENCIES) $(LINK) $(libasn1parser_la_LDFLAGS) $(libasn1parser_la_OBJECTS) $(libasn1parser_la_LIBADD) $(LIBS) clean-checkPROGRAMS: - -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) + @list='$(check_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done check_parser$(EXEEXT): $(check_parser_OBJECTS) $(check_parser_DEPENDENCIES) @rm -f check_parser$(EXEEXT) $(LINK) $(check_parser_LDFLAGS) $(check_parser_OBJECTS) $(check_parser_LDADD) $(LIBS) mostlyclean-compile: - -rm -f *.$(OBJEXT) core *.core + -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1p_class.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1p_constr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1p_expr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1p_l.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1p_module.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1p_oid.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1p_param.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1p_ref.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1p_value.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1p_xports.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1p_y.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1parser.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/check_parser.Po@am__quote@ - -distclean-depend: - -rm -rf $(DEPDIR) +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1p_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1p_constr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1p_expr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1p_l.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1p_module.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1p_oid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1p_param.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1p_ref.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1p_value.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1p_xports.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1p_y.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1parser.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_parser.Po@am__quote@ .c.o: -@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: -@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(COMPILE) -c `cygpath -w $<` +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: -@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< -CCDEPMODE = @CCDEPMODE@ - -LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -LEXLIB = @LEXLIB@ +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< .l.c: - $(LEXCOMPILE) $< && mv $(LEX_OUTPUT_ROOT).c $@ + $(LEXCOMPILE) $< + sed '/^#/ s|$(LEX_OUTPUT_ROOT)\.c|$@|' $(LEX_OUTPUT_ROOT).c >$@ + rm -f $(LEX_OUTPUT_ROOT).c .y.c: - $(YACCCOMPILE) $< && mv y.tab.c $@ + $(YACCCOMPILE) $< if test -f y.tab.h; then \ - if cmp -s y.tab.h $*.h; then \ - rm -f y.tab.h; \ + to=`echo "$*_H" | sed \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ + -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`; \ + sed "/^#/ s/Y_TAB_H/$$to/g" y.tab.h >$*.ht; \ + rm -f y.tab.h; \ + if cmp -s $*.ht $*.h; then \ + rm -f $*.ht ;\ else \ - mv y.tab.h $*.h; \ + mv $*.ht $*.h; \ fi; \ fi -uninstall-info-am: + if test -f y.output; then \ + mv y.output $*.output; \ + fi + sed '/^#/ s|y\.tab\.c|$@|' y.tab.c >$@t && mv $@t $@ + rm -f y.tab.c -tags: TAGS +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - mkid -fID $$unique $(LISP) + mkid -fID $$unique +tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -z "$$unique" && unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ - || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique GTAGS: - here=`CDPATH=: && cd $(top_builddir) && pwd` \ + here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; \ + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ @@ -305,26 +427,29 @@ check-TESTS: $(TESTS) all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - echo "XPASS: $$tst"; \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ ;; \ *) \ - echo "PASS: $$tst"; \ + echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ - xfail=`expr $$xfail + 1`; \ - echo "XFAIL: $$tst"; \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ ;; \ *) \ - failed=`expr $$failed + 1`; \ - echo "FAIL: $$tst"; \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ ;; \ esac; \ + else \ + skip=`expr $$skip + 1`; \ + echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ @@ -340,28 +465,49 @@ check-TESTS: $(TESTS) banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + skipped="($$skip tests were not run)"; \ + test `echo "$$skipped" | wc -c` -gt `echo "$$banner" | wc -c` && \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -gt `echo "$$banner" | wc -c` && \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ + test -n "$$skipped" && echo "$$skipped"; \ + test -n "$$report" && echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ - fi - -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -top_distdir = .. -distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + else :; fi distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - $(mkinstalldirs) "$(distdir)/$$dir"; \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ fi; \ if test -d $$d/$$file; then \ - cp -pR $$d/$$file $(distdir) \ - || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ @@ -373,9 +519,7 @@ check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) - installdirs: - install: install-am install-exec: install-exec-am install-data: install-data-am @@ -387,6 +531,7 @@ install-am: all-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: @@ -394,26 +539,31 @@ mostlyclean-generic: clean-generic: distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + -rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." - -test -z "asn1p_y.h" || rm -f asn1p_y.h + -rm -f asn1p_y.h + -rm -f asn1p_l.c + -rm -f asn1p_y.c clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am - -distclean-am: clean-am distclean-compile distclean-depend \ - distclean-generic distclean-libtool distclean-tags + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags dvi: dvi-am dvi-am: +html: html-am + info: info-am info-am: @@ -429,7 +579,8 @@ install-man: installcheck-am: maintainer-clean: maintainer-clean-am - + -rm -rf ./$(DEPDIR) + -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am @@ -437,18 +588,26 @@ mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + uninstall-am: uninstall-info-am -.PHONY: GTAGS all all-am check check-TESTS check-am clean \ +.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ - clean-noinstLTLIBRARIES distclean distclean-compile \ - distclean-depend distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am info info-am install \ - install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am diff --git a/libasn1print/Makefile.in b/libasn1print/Makefile.in index e1e876e54..316d55470 100644 --- a/libasn1print/Makefile.in +++ b/libasn1print/Makefile.in @@ -1,7 +1,8 @@ -# Makefile.in generated automatically by automake 1.5 from Makefile.am. +# Makefile.in generated by automake 1.8.4 from Makefile.am. +# @configure_input@ -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -13,215 +14,316 @@ @SET_MAKE@ -SHELL = @SHELL@ +SOURCES = $(libasn1print_la_SOURCES) srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) -transform = @program_transform_name@ +transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_alias = @build_alias@ build_triplet = @build@ -host_alias = @host_alias@ host_triplet = @host@ -target_alias = @target_alias@ target_triplet = @target@ +subdir = libasn1print +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libasn1print_la_LIBADD = +am_libasn1print_la_OBJECTS = asn1print.lo +libasn1print_la_OBJECTS = $(am_libasn1print_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/asn1print.Plo +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(libasn1print_la_SOURCES) +DIST_SOURCES = $(libasn1print_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ ADD_CFLAGS = @ADD_CFLAGS@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ -AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ -OBJDUMP = @OBJDUMP@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ PATH = @PATH@ +PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ +am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ install_sh = @install_sh@ - +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ AM_CFLAGS = @ADD_CFLAGS@ AM_CPPFLAGS = -I${top_srcdir}/libasn1parser - noinst_LTLIBRARIES = libasn1print.la - libasn1print_la_LDFLAGS = -all-static libasn1print_la_SOURCES = \ asn1print.c asn1print.h - LDADD = ${noinst_LTLIBRARIES} ${libasn1fix_la_LIBADD} DEPENDENCIES = ${LDADD} - TESTS = ${check_PROGRAMS} -subdir = libasn1print -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -LTLIBRARIES = $(noinst_LTLIBRARIES) - -libasn1print_la_LIBADD = -am_libasn1print_la_OBJECTS = asn1print.lo -libasn1print_la_OBJECTS = $(am_libasn1print_la_OBJECTS) - -DEFS = @DEFS@ -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/asn1print.Plo -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ - $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -CFLAGS = @CFLAGS@ -DIST_SOURCES = $(libasn1print_la_SOURCES) -DIST_COMMON = README Makefile.am Makefile.in -SOURCES = $(libasn1print_la_SOURCES) - all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libasn1print/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu libasn1print/Makefile -Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) && \ - CONFIG_HEADERS= CONFIG_LINKS= \ - CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" = "$$p" && dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done libasn1print.la: $(libasn1print_la_OBJECTS) $(libasn1print_la_DEPENDENCIES) $(LINK) $(libasn1print_la_LDFLAGS) $(libasn1print_la_OBJECTS) $(libasn1print_la_LIBADD) $(LIBS) mostlyclean-compile: - -rm -f *.$(OBJEXT) core *.core + -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/asn1print.Plo@am__quote@ - -distclean-depend: - -rm -rf $(DEPDIR) +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1print.Plo@am__quote@ .c.o: -@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: -@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(COMPILE) -c `cygpath -w $<` +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: -@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< -CCDEPMODE = @CCDEPMODE@ -uninstall-info-am: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< -tags: TAGS +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - mkid -fID $$unique $(LISP) + mkid -fID $$unique +tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -z "$$unique" && unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ - || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique GTAGS: - here=`CDPATH=: && cd $(top_builddir) && pwd` \ + here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; \ + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ @@ -233,26 +335,29 @@ check-TESTS: $(TESTS) all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - echo "XPASS: $$tst"; \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ ;; \ *) \ - echo "PASS: $$tst"; \ + echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ - xfail=`expr $$xfail + 1`; \ - echo "XFAIL: $$tst"; \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ ;; \ *) \ - failed=`expr $$failed + 1`; \ - echo "FAIL: $$tst"; \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ ;; \ esac; \ + else \ + skip=`expr $$skip + 1`; \ + echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ @@ -268,28 +373,49 @@ check-TESTS: $(TESTS) banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + skipped="($$skip tests were not run)"; \ + test `echo "$$skipped" | wc -c` -gt `echo "$$banner" | wc -c` && \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -gt `echo "$$banner" | wc -c` && \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ + test -n "$$skipped" && echo "$$skipped"; \ + test -n "$$report" && echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ - fi - -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -top_distdir = .. -distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + else :; fi distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - $(mkinstalldirs) "$(distdir)/$$dir"; \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ fi; \ if test -d $$d/$$file; then \ - cp -pR $$d/$$file $(distdir) \ - || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ @@ -300,9 +426,7 @@ check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) - installdirs: - install: install-am install-exec: install-exec-am install-data: install-data-am @@ -314,6 +438,7 @@ install-am: all-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: @@ -321,7 +446,7 @@ mostlyclean-generic: clean-generic: distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + -rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -332,14 +457,17 @@ clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am - -distclean-am: clean-am distclean-compile distclean-depend \ - distclean-generic distclean-libtool distclean-tags + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags dvi: dvi-am dvi-am: +html: html-am + info: info-am info-am: @@ -355,7 +483,8 @@ install-man: installcheck-am: maintainer-clean: maintainer-clean-am - + -rm -rf ./$(DEPDIR) + -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am @@ -363,19 +492,27 @@ mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + uninstall-am: uninstall-info-am -.PHONY: GTAGS all all-am check check-TESTS check-am clean clean-generic \ - clean-libtool clean-noinstLTLIBRARIES distclean \ - distclean-compile distclean-depend distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am info \ - info-am install install-am install-data install-data-am \ - install-exec install-exec-am install-info install-info-am \ - install-man install-strip installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool tags uninstall uninstall-am \ - uninstall-info-am +.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ + clean-generic clean-libtool clean-noinstLTLIBRARIES ctags \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/ltmain.sh b/ltmain.sh index ebeb20d2d..70f0b2d03 100644 --- a/ltmain.sh +++ b/ltmain.sh @@ -1,7 +1,8 @@ # ltmain.sh - Provide generalized library-building support services. -# NOTE: Changing this file will not affect anything until you rerun ltconfig. +# NOTE: Changing this file will not affect anything until you rerun configure. # -# Copyright (C) 1996-1999 Free Software Foundation, Inc. +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004 +# Free Software Foundation, Inc. # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify @@ -23,8 +24,28 @@ # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. -EXPR_COMPAT=1 -export EXPR_COMPAT +basename="s,^.*/,,g" + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + +# The name of this program: +progname=`echo "$progpath" | $SED $basename` +modename="$progname" + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION=1.5.6 +TIMESTAMP=" (1.1220.2.94 2004/04/10 16:27:27)" + # Check that we have a working $echo. if test "X$1" = X--no-reexec; then @@ -38,7 +59,7 @@ elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then : else # Restart under the correct shell, and then maybe $echo will work. - exec $SHELL "$0" --no-reexec ${1+"$@"} + exec $SHELL "$progpath" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then @@ -47,19 +68,9 @@ if test "X$1" = X--fallback-echo; then cat <&2 - echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 - exit 1 -fi +# Make sure IFS has a sensible default +: ${IFS=" +"} if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then - echo "$modename: not configured to build any kind of library" 1>&2 - echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 - exit 1 + $echo "$modename: not configured to build any kind of library" 1>&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE fi # Global variables. @@ -110,22 +128,163 @@ execute_dlfiles= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" +##################################### +# Shell function definitions: +# This seems to be the best place for them + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +func_win32_libid () { + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ + $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | \ + sed -n -e '1,100{/ I /{x;/import/!{s/^/import/;h;p;};x;};}'` + if test "X$win32_nmres" = "Ximport" ; then + win32_libid_type="x86 archive import" + else + win32_libid_type="x86 archive static" + fi + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $echo $win32_libid_type +} + + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () { + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case "$@ " in + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + $echo "$modename: unable to infer tagged configuration" + $echo "$modename: specify a tag with \`--tag'" 1>&2 + exit $EXIT_FAILURE +# else +# $echo "$modename: using $tagname tagged configuration" + fi + ;; + esac + fi +} +# End of Shell function definitions +##################################### + +# Darwin sucks +eval std_shrext=\"$shrext_cmds\" + # Parse our command line options once, thoroughly. -while test $# -gt 0 +while test "$#" -gt 0 do arg="$1" shift - case "$arg" in + case $arg in -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; *) optarg= ;; esac # If the previous option needs an argument, assign it. if test -n "$prev"; then - case "$prev" in + case $prev in execute_dlfiles) - eval "$prev=\"\$$prev \$arg\"" + execute_dlfiles="$execute_dlfiles $arg" + ;; + tag) + tagname="$arg" + preserve_args="${preserve_args}=$arg" + + # Check whether tagname contains only valid characters + case $tagname in + *[!-_A-Za-z0-9,/]*) + $echo "$progname: invalid tag name: $tagname" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $tagname in + CC) + # Don't test for the "default" C tag, as we know, it's there, but + # not specially marked. + ;; + *) + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then + taglist="$taglist $tagname" + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" + else + $echo "$progname: ignoring unknown tag $tagname" 1>&2 + fi + ;; + esac ;; *) eval "$prev=\$arg" @@ -138,24 +297,33 @@ do fi # Have we seen a non-optional argument yet? - case "$arg" in + case $arg in --help) show_help=yes ;; --version) - echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" - exit 0 + $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" + $echo + $echo "Copyright (C) 2003 Free Software Foundation, Inc." + $echo "This is free software; see the source for copying conditions. There is NO" + $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + exit $EXIT_SUCCESS ;; --config) - sed -e '1,/^### BEGIN LIBTOOL CONFIG/d' -e '/^### END LIBTOOL CONFIG/,$d' $0 - exit 0 + ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath + # Now print the configurations for the tags. + for tagname in $taglist; do + ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" + done + exit $EXIT_SUCCESS ;; --debug) - echo "$progname: enabling shell trace mode" + $echo "$progname: enabling shell trace mode" set -x + preserve_args="$preserve_args $arg" ;; --dry-run | -n) @@ -163,18 +331,18 @@ do ;; --features) - echo "host: $host" + $echo "host: $host" if test "$build_libtool_libs" = yes; then - echo "enable shared libraries" + $echo "enable shared libraries" else - echo "disable shared libraries" + $echo "disable shared libraries" fi if test "$build_old_libs" = yes; then - echo "enable static libraries" + $echo "enable static libraries" else - echo "disable static libraries" + $echo "disable static libraries" fi - exit 0 + exit $EXIT_SUCCESS ;; --finish) mode="finish" ;; @@ -182,8 +350,19 @@ do --mode) prevopt="--mode" prev=mode ;; --mode=*) mode="$optarg" ;; + --preserve-dup-deps) duplicate_deps="yes" ;; + --quiet | --silent) show=: + preserve_args="$preserve_args $arg" + ;; + + --tag) prevopt="--tag" prev=tag ;; + --tag=*) + set tag "$optarg" ${1+"$@"} + shift + prev=tag + preserve_args="$preserve_args --tag" ;; -dlopen) @@ -194,7 +373,7 @@ do -*) $echo "$modename: unrecognized option \`$arg'" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; *) @@ -207,19 +386,26 @@ done if test -n "$prevopt"; then $echo "$modename: option \`$prevopt' requires an argument" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + if test -z "$show_help"; then # Infer the operation mode. if test -z "$mode"; then - case "$nonopt" in - *cc | *++ | gcc* | *-gcc*) + $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 + $echo "*** Future versions of Libtool will require -mode=MODE be specified." 1>&2 + case $nonopt in + *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) mode=link for arg do - case "$arg" in + case $arg in -c) mode=compile break @@ -256,7 +442,7 @@ if test -z "$show_help"; then if test -n "$execute_dlfiles" && test "$mode" != execute; then $echo "$modename: unrecognized option \`-dlopen'" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. @@ -264,140 +450,222 @@ if test -z "$show_help"; then help="Try \`$modename --help --mode=$mode' for more information." # These modes are in order of execution frequency so that they run quickly. - case "$mode" in + case $mode in # libtool compile mode compile) modename="$modename: compile" # Get the compilation command and the source file. base_compile= - lastarg= - srcfile="$nonopt" + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes suppress_output= + arg_mode=normal + libobj= + later= - user_target=no for arg do - # Accept any command-line options. - case "$arg" in - -o) - if test "$user_target" != "no"; then - $echo "$modename: you cannot specify \`-o' more than once" 1>&2 - exit 1 - fi - user_target=next - ;; - - -static) - build_old_libs=yes - continue + case "$arg_mode" in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal ;; - esac - case "$user_target" in - next) - # The next one is the -o target name - user_target=yes - continue - ;; - yes) - # We got the output file - user_target=set + target ) libobj="$arg" + arg_mode=normal continue ;; - esac - # Accept the current argument as the source file. - lastarg="$srcfile" - srcfile="$arg" + normal ) + # Accept any command-line options. + case $arg in + -o) + if test -n "$libobj" ; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit $EXIT_FAILURE + fi + arg_mode=target + continue + ;; - # Aesthetically quote the previous argument. + -static | -prefer-pic | -prefer-non-pic) + later="$later $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + lastarg="$lastarg $arg" + done + IFS="$save_ifs" + lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` + + # Add the arguments to base_compile. + base_compile="$base_compile $lastarg" + continue + ;; + + * ) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode - # Backslashify any backslashes, double quotes, and dollar signs. - # These are the only characters that are still specially - # interpreted inside of double-quoted scrings. + # Aesthetically quote the previous argument. lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + case $lastarg in # Double-quote args containing other shell metacharacters. - # Many Bourne shells cannot handle close brackets correctly in scan - # sets, so we specify it separately. - case "$lastarg" in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") lastarg="\"$lastarg\"" ;; esac - # Add the previous argument to base_compile. - if test -z "$base_compile"; then - base_compile="$lastarg" - else - base_compile="$base_compile $lastarg" - fi - done + base_compile="$base_compile $lastarg" + done # for arg - case "$user_target" in - set) + case $arg_mode in + arg) + $echo "$modename: you must specify an argument for -Xcompile" + exit $EXIT_FAILURE ;; - no) - # Get the name of the library object. - libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + target) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit $EXIT_FAILURE ;; *) - $echo "$modename: you must specify a target with \`-o'" 1>&2 - exit 1 + # Get the name of the library object. + [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo - xform='[cCFSfmso]' - case "$libobj" in + xform='[cCFSifmso]' + case $libobj in *.ada) xform=ada ;; *.adb) xform=adb ;; *.ads) xform=ads ;; *.asm) xform=asm ;; *.c++) xform=c++ ;; *.cc) xform=cc ;; + *.ii) xform=ii ;; + *.class) xform=class ;; *.cpp) xform=cpp ;; *.cxx) xform=cxx ;; *.f90) xform=f90 ;; *.for) xform=for ;; + *.java) xform=java ;; esac libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` - case "$libobj" in + case $libobj in *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; *) $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; esac + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -static) + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir= + else + xdir=$xdir/ + fi + lobj=${xdir}$objdir/$objname + if test -z "$base_compile"; then $echo "$modename: you must specify a compilation command" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi # Delete any leftover library objects. if test "$build_old_libs" = yes; then - removelist="$obj $libobj" + removelist="$obj $lobj $libobj ${libobj}T" else - removelist="$libobj" + removelist="$lobj $libobj ${libobj}T" fi $run $rm $removelist - trap "$run $rm $removelist; exit 1" 1 2 15 + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then - output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\..*$%%'`.${objext} + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" removelist="$removelist $output_obj $lockfile" - trap "$run $rm $removelist; exit 1" 1 2 15 + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 else + output_obj= need_locks=no lockfile= fi @@ -405,13 +673,13 @@ if test -z "$show_help"; then # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then - until ln "$0" "$lockfile" 2>/dev/null; do + until $run ln "$progpath" "$lockfile" 2>/dev/null; do $show "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then - echo "\ + $echo "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` @@ -423,63 +691,67 @@ avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist - exit 1 + exit $EXIT_FAILURE fi - echo $srcfile > "$lockfile" + $echo $srcfile > "$lockfile" fi if test -n "$fix_srcfile_path"; then eval srcfile=\"$fix_srcfile_path\" fi + $run $rm "$libobj" "${libobj}T" + + # Create a libtool object file (analogous to a ".la" file), + # but don't create it if we're doing a dry run. + test -z "$run" && cat > ${libobj}T </dev/null`" != x"$srcfile"; then - echo "\ + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` @@ -494,13 +766,13 @@ avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist - exit 1 + exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one - if test x"$output_obj" != x"$libobj"; then - $show "$mv $output_obj $libobj" - if $run $mv $output_obj $libobj; then : + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + $show "$mv $output_obj $lobj" + if $run $mv $output_obj $lobj; then : else error=$? $run $rm $removelist @@ -508,66 +780,50 @@ compiler." fi fi - # If we have no pic_flag, then copy the object into place and finish. - if test -z "$pic_flag" && test "$build_old_libs" = yes; then - # Rename the .lo from within objdir to obj - if test -f $obj; then - $show $rm $obj - $run $rm $obj - fi + # Append the name of the PIC object to the libtool object file. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != x"$srcfile"; then - echo "\ + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` @@ -582,11 +838,11 @@ avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist - exit 1 + exit $EXIT_FAILURE fi # Just move the object if needed - if test x"$output_obj" != x"$obj"; then + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then $show "$mv $output_obj $obj" if $run $mv $output_obj $obj; then : else @@ -596,40 +852,42 @@ compiler." fi fi - # Create an invalid libtool object if no PIC, so that we do not - # accidentally link it into a program. - if test "$build_libtool_libs" != yes; then - $show "echo timestamp > $libobj" - $run eval "echo timestamp > \$libobj" || exit $? - else - # Move the .lo from within objdir - $show "$mv $libobj $lo_libobj" - if $run $mv $libobj $lo_libobj; then : - else - error=$? - $run $rm $removelist - exit $error - fi - fi + # Append the name of the non-PIC object the libtool object file. + # Only append if the libtool object file exists. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T < -# #undef WIN32_LEAN_AND_MEAN -# #include -# -# #ifndef __CYGWIN__ -# # ifdef __CYGWIN32__ -# # define __CYGWIN__ __CYGWIN32__ -# # endif -# #endif -# -# #ifdef __cplusplus -# extern "C" { -# #endif -# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); -# #ifdef __cplusplus -# } -# #endif -# -# #ifdef __CYGWIN__ -# #include -# DECLARE_CYGWIN_DLL( DllMain ); -# #endif -# HINSTANCE __hDllInstance_base; -# -# BOOL APIENTRY -# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) -# { -# __hDllInstance_base = hInst; -# return TRUE; -# } -# /* ltdll.c ends here */ - # This is a source program that is used to create import libraries - # on Windows for dlls which lack them. Don't remove nor modify the - # starting and closing comments -# /* impgen.c starts here */ -# /* Copyright (C) 1999 Free Software Foundation, Inc. -# -# This file is part of GNU libtool. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# */ -# -# #include /* for printf() */ -# #include /* for open(), lseek(), read() */ -# #include /* for O_RDONLY, O_BINARY */ -# #include /* for strdup() */ -# -# static unsigned int -# pe_get16 (fd, offset) -# int fd; -# int offset; -# { -# unsigned char b[2]; -# lseek (fd, offset, SEEK_SET); -# read (fd, b, 2); -# return b[0] + (b[1]<<8); -# } -# -# static unsigned int -# pe_get32 (fd, offset) -# int fd; -# int offset; -# { -# unsigned char b[4]; -# lseek (fd, offset, SEEK_SET); -# read (fd, b, 4); -# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); -# } -# -# static unsigned int -# pe_as32 (ptr) -# void *ptr; -# { -# unsigned char *b = ptr; -# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); -# } -# -# int -# main (argc, argv) -# int argc; -# char *argv[]; -# { -# int dll; -# unsigned long pe_header_offset, opthdr_ofs, num_entries, i; -# unsigned long export_rva, export_size, nsections, secptr, expptr; -# unsigned long name_rvas, nexp; -# unsigned char *expdata, *erva; -# char *filename, *dll_name; -# -# filename = argv[1]; -# -# dll = open(filename, O_RDONLY|O_BINARY); -# if (!dll) -# return 1; -# -# dll_name = filename; -# -# for (i=0; filename[i]; i++) -# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') -# dll_name = filename + i +1; -# -# pe_header_offset = pe_get32 (dll, 0x3c); -# opthdr_ofs = pe_header_offset + 4 + 20; -# num_entries = pe_get32 (dll, opthdr_ofs + 92); -# -# if (num_entries < 1) /* no exports */ -# return 1; -# -# export_rva = pe_get32 (dll, opthdr_ofs + 96); -# export_size = pe_get32 (dll, opthdr_ofs + 100); -# nsections = pe_get16 (dll, pe_header_offset + 4 +2); -# secptr = (pe_header_offset + 4 + 20 + -# pe_get16 (dll, pe_header_offset + 4 + 16)); -# -# expptr = 0; -# for (i = 0; i < nsections; i++) -# { -# char sname[8]; -# unsigned long secptr1 = secptr + 40 * i; -# unsigned long vaddr = pe_get32 (dll, secptr1 + 12); -# unsigned long vsize = pe_get32 (dll, secptr1 + 16); -# unsigned long fptr = pe_get32 (dll, secptr1 + 20); -# lseek(dll, secptr1, SEEK_SET); -# read(dll, sname, 8); -# if (vaddr <= export_rva && vaddr+vsize > export_rva) -# { -# expptr = fptr + (export_rva - vaddr); -# if (export_rva + export_size > vaddr + vsize) -# export_size = vsize - (export_rva - vaddr); -# break; -# } -# } -# -# expdata = (unsigned char*)malloc(export_size); -# lseek (dll, expptr, SEEK_SET); -# read (dll, expdata, export_size); -# erva = expdata - export_rva; -# -# nexp = pe_as32 (expdata+24); -# name_rvas = pe_as32 (expdata+32); -# -# printf ("EXPORTS\n"); -# for (i = 0; i\?\'\ \ ]*|*]*|"") + qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test + ;; + *) qarg=$arg ;; + esac + libtool_args="$libtool_args $qarg" # If the previous option needs an argument, assign it. if test -n "$prev"; then - case "$prev" in + case $prev in output) compile_command="$compile_command @OUTPUT@" finalize_command="$finalize_command @OUTPUT@" ;; esac - case "$prev" in + case $prev in dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. @@ -908,7 +1007,7 @@ compiler." finalize_command="$finalize_command @SYMFILE@" preload=yes fi - case "$arg" in + case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then @@ -937,6 +1036,7 @@ compiler." dlprefiles="$dlprefiles $arg" fi prev= + continue ;; esac ;; @@ -944,7 +1044,7 @@ compiler." export_symbols="$arg" if test ! -f "$arg"; then $echo "$modename: symbol file \`$arg' does not exist" - exit 1 + exit $EXIT_FAILURE fi prev= continue @@ -954,22 +1054,135 @@ compiler." prev= continue ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; release) - if test "$release_suffix" = all; then - release="$arg" - elif test "$release_suffix" = yes; then - release="-$arg" + release="-$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat $save_arg` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + done + else + $echo "$modename: link input file \`$save_arg' does not exist" + exit $EXIT_FAILURE fi + arg=$save_arg prev= continue ;; rpath | xrpath) # We need an absolute path. - case "$arg" in + case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) $echo "$modename: only absolute run-paths are allowed" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; esac if test "$prev" = rpath; then @@ -986,17 +1199,45 @@ compiler." prev= continue ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + compile_command="$compile_command $wl$qarg" + finalize_command="$finalize_command $wl$qarg" + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac - fi + fi # test -n "$prev" prevarg="$arg" - case "$arg" in + case $arg in -all-static) if test -n "$link_static_flag"; then compile_command="$compile_command $link_static_flag" @@ -1012,7 +1253,6 @@ compiler." ;; -avoid-version) - build_old_libs=no avoid_version=yes continue ;; @@ -1034,8 +1274,8 @@ compiler." -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then - $echo "$modename: not more than one -exported-symbols argument allowed" - exit 1 + $echo "$modename: more than one -exported-symbols argument is not allowed" + exit $EXIT_FAILURE fi if test "X$arg" = "X-export-symbols"; then prev=expsyms @@ -1045,62 +1285,90 @@ compiler." continue ;; + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + ;; + esac + continue + ;; + -L*) dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` # We need an absolute path. - case "$dir" in + case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then - $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 - $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 - absdir="$dir" + $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 + exit $EXIT_FAILURE fi dir="$absdir" ;; esac - case " $deplibs " in - *" $arg "*) ;; - *) deplibs="$deplibs $arg";; - esac - case " $lib_search_path " in - *" $dir "*) ;; - *) lib_search_path="$lib_search_path $dir";; + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; esac - case "$host" in - *-*-cygwin* | *-*-mingw* | *-*-os2*) - dllsearchdir=`cd "$dir" && pwd || echo "$dir"` - case ":$dllsearchpath:" in - ::) dllsearchpath="$dllsearchdir";; - *":$dllsearchdir:"*) ;; - *) dllsearchpath="$dllsearchpath:$dllsearchdir";; + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + case :$dllsearchpath: in + *":$dir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dir";; esac ;; esac + continue ;; -l*) - if test "$arg" = "-lc"; then - case "$host" in - *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*) - # These systems don't actually have c library (as such) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-pw32* | *-*-beos*) + # These systems don't actually have a C or math library (as such) continue ;; - esac - elif test "$arg" = "-lm"; then - case "$host" in - *-*-cygwin* | *-*-beos*) - # These systems don't actually have math library (as such) - continue + *-*-mingw* | *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs -framework System" + continue esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac fi deplibs="$deplibs $arg" + continue ;; - -?thread) + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) deplibs="$deplibs $arg" + continue ;; -module) @@ -1108,13 +1376,70 @@ compiler." continue ;; + # gcc -m* arguments should be passed to the linker via $compiler_flags + # in order to pass architecture information to the linker + # (e.g. 32 vs 64-bit). This may also be accomplished via -Wl,-mfoo + # but this is not reliable with gcc because gcc may use -mfoo to + # select a different linker, different libraries, etc, while + # -Wl,-mfoo simply passes -mfoo to the linker. + -m*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + if test "$with_gcc" = "yes" ; then + compiler_flags="$compiler_flags $arg" + fi + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + # The PATH hackery in wrapper scripts is required on Windows + # in order for the loader to find any dlls it needs. + $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 + $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + -no-undefined) allow_undefined=no continue ;; + -objectlist) + prev=objectlist + continue + ;; + -o) prev=output ;; + -precious-files-regex) + prev=precious_regex + continue + ;; + -release) prev=release continue @@ -1133,11 +1458,11 @@ compiler." -R*) dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` # We need an absolute path. - case "$dir" in + case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) $echo "$modename: only absolute run-paths are allowed" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; esac case "$xrpath " in @@ -1148,11 +1473,11 @@ compiler." ;; -static) - # If we have no pic_flag, then this is the same as -all-static. - if test -z "$pic_flag" && test -n "$link_static_flag"; then - compile_command="$compile_command $link_static_flag" - finalize_command="$finalize_command $link_static_flag" - fi + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. continue ;; @@ -1165,388 +1490,1301 @@ compiler." prev=vinfo continue ;; + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Wl,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $wl$flag" + linker_flags="$linker_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; # Some other compiler flag. -* | +*) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case "$arg" in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac ;; - *.o | *.obj | *.a | *.lib) + *.$objext) # A standard object. - libobjs="$libobjs $arg" + objs="$objs $arg" ;; *.lo) - # A library object. - if test "$prev" = dlfiles; then - dlfiles="$dlfiles $arg" - if test "$build_libtool_libs" = yes && test "$dlopen" = yes; then - prev= - continue + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" fi fi + ;; - if test "$prev" = dlprefiles; then - # Preload the old-style object. - dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"` - prev= - fi - libobjs="$libobjs $arg" + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue ;; *.la) # A libtool-controlled library. - dlname= - libdir= - library_names= - old_library= + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done # argument parsing loop + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + # Create the object directory. + if test ! -d "$output_objdir"; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + status=$? + if test "$status" -ne 0 && test ! -d "$output_objdir"; then + exit $status + fi + fi + + # Determine the type of output + case $output in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + case $host in + *cygwin* | *mingw* | *pw32*) + # don't eliminate duplications in $postdeps and $predeps + duplicate_compiler_generated_deps=yes + ;; + *) + duplicate_compiler_generated_deps=$duplicate_deps + ;; + esac + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if test "X$duplicate_deps" = "Xyes" ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$pre_post_deps $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + case $linkmode in + lib) + passes="conv link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + for pass in $passes; do + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 + continue + fi + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` + for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if (${SED} -e '2q' $lib | + grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + library_names= + old_library= + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + *) + $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + if test "$deplibs_check_method" != pass_all; then + $echo + $echo "*** Warning: Trying to link with static lib archive $deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because the file extensions .$libext of this argument makes me believe" + $echo "*** that it is just a static archive that I should not used here." + else + $echo + $echo "*** Warning: Linking the shared library $output against the" + $echo "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + if test "$found" = yes || test -f "$lib"; then : + else + $echo "$modename: cannot find the library \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi # Check to see that this really is a libtool archive. - if (sed -e '2q' $arg | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else - $echo "$modename: \`$arg' is not a valid libtool archive" 1>&2 - exit 1 + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE fi + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= # If the library was installed with an old release of libtool, - # it will not redefine variable installed. + # it will not redefine variables installed, or shouldnotlink installed=yes + shouldnotlink=no # Read the .la file - # If there is no directory component, then add one. - case "$arg" in - */* | *\\*) . $arg ;; - *) . ./$arg ;; + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; esac + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + $echo "$modename: \`$lib' is not a convenience library" 1>&2 + exit $EXIT_FAILURE + fi + continue + fi # $pass = conv + + # Get the name of the library we link against. linklib= for l in $old_library $library_names; do linklib="$l" done + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$newdlfiles $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + abs_ladir="$ladir" + fi + ;; + esac + laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + $echo "$modename: warning: library \`$lib' was moved." 1>&2 + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi # $installed = yes + name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen - if test -z "$linklib"; then - $echo "$modename: cannot find name of link library for \`$arg'" 1>&2 - exit 1 + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue fi - # Find the relevant object directory and library name. - name=`$echo "X$arg" | $Xsed -e 's%^.*/%%' -e 's/\.la$//' -e 's/^lib//'` - if test "X$installed" = Xyes; then - dir="$libdir" - else - dir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` - if test "X$dir" = "X$arg"; then - dir="$objdir" - else - dir="$dir/$objdir" + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes fi - fi - if test -n "$dependency_libs"; then - # Extract -R and -L from dependency_libs - temp_deplibs= + tmp_libs= for deplib in $dependency_libs; do - case "$deplib" in - -R*) temp_xrpath=`$echo "X$deplib" | $Xsed -e 's/^-R//'` - case " $rpath $xrpath " in - *" $temp_xrpath "*) ;; - *) xrpath="$xrpath $temp_xrpath";; - esac;; - -L*) case "$compile_command $temp_deplibs " in - *" $deplib "*) ;; - *) temp_deplibs="$temp_deplibs $deplib";; - esac - temp_dir=`$echo "X$deplib" | $Xsed -e 's/^-L//'` - case " $lib_search_path " in - *" $temp_dir "*) ;; - *) lib_search_path="$lib_search_path $temp_dir";; - esac - ;; - *) temp_deplibs="$temp_deplibs $deplib";; + case $deplib in + -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test esac - done - dependency_libs="$temp_deplibs" - fi - - if test -z "$libdir"; then - # It is a libtool convenience library, so add in its objects. - convenience="$convenience $dir/$old_library" - old_convenience="$old_convenience $dir/$old_library" - deplibs="$deplibs$dependency_libs" - compile_command="$compile_command $dir/$old_library$dependency_libs" - finalize_command="$finalize_command $dir/$old_library$dependency_libs" + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib continue - fi + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var"; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$temp_rpath $dir" ;; + esac + fi - # This library was specified with -dlopen. - if test "$prev" = dlfiles; then - dlfiles="$dlfiles $arg" - if test -z "$dlname" || test "$dlopen" != yes || test "$build_libtool_libs" = no; then - # If there is no dlname, no dlopen support or we're linking statically, - # we need to preload. - prev=dlprefiles - else - # We should not create a dependency on this library, but we - # may need any libraries it requires. - compile_command="$compile_command$dependency_libs" - finalize_command="$finalize_command$dependency_libs" - prev= - continue - fi - fi + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... - # The library was specified with -dlpreopen. - if test "$prev" = dlprefiles; then - # Prefer using a static library (so that no silly _DYNAMIC symbols - # are required to link). - if test -n "$old_library"; then - dlprefiles="$dlprefiles $dir/$old_library" - else - dlprefiles="$dlprefiles $dir/$linklib" + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue fi - prev= fi + link_static=no # Whether the deplib will be linked statically if test -n "$library_names" && { test "$prefer_static_libs" = no || test -z "$old_library"; }; then - link_against_libtool_libs="$link_against_libtool_libs $arg" - if test -n "$shlibpath_var"; then - # Make sure the rpath contains only unique directories. - case "$temp_rpath " in - *" $dir "*) ;; - *) temp_rpath="$temp_rpath $dir" ;; - esac + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes fi - - # We need an absolute path. - case "$dir" in - [\\/] | [A-Za-z]:[\\/]*) absdir="$dir" ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 - $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 - absdir="$dir" + # This is a shared library + + # Warn about portability, can't link against -module's on + # some systems (darwin) + if test "$shouldnotlink" = yes && test "$pass" = link ; then + $echo + if test "$linkmode" = prog; then + $echo "*** Warning: Linking the executable $output against the loadable module" + else + $echo "*** Warning: Linking the shared library $output against the loadable module" fi - ;; - esac - - # This is the magic to use -rpath. - # Skip directories that are in the system default run-time - # search path, unless they have been requested with -R. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in + $echo "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; - *) compile_rpath="$compile_rpath $absdir" + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; esac - ;; - esac - - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in + case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; esac - ;; - esac + fi - lib_linked=yes - case "$hardcode_action" in - immediate | unsupported) - if test "$hardcode_direct" = no; then - compile_command="$compile_command $dir/$linklib" - deplibs="$deplibs $dir/$linklib" - case "$host" in - *-*-cygwin* | *-*-mingw* | *-*-os2*) - dllsearchdir=`cd "$dir" && pwd || echo "$dir"` - if test -n "$dllsearchpath"; then - dllsearchpath="$dllsearchpath:$dllsearchdir" - else - dllsearchpath="$dllsearchdir" - fi + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + realname="$2" + shift; shift + libname=`eval \\$echo \"$libname_spec\"` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw*) + major=`expr $current - $age` + versuffix="-$major" ;; esac - elif test "$hardcode_minus_L" = no; then - case "$host" in - *-*-sunos*) - compile_shlibpath="$compile_shlibpath$dir:" - ;; - esac - case "$compile_command " in - *" -L$dir "*) ;; - *) compile_command="$compile_command -L$dir";; - esac - compile_command="$compile_command -l$name" - deplibs="$deplibs -L$dir -l$name" - elif test "$hardcode_shlibpath_var" = no; then - case ":$compile_shlibpath:" in - *":$dir:"*) ;; - *) compile_shlibpath="$compile_shlibpath$dir:";; + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + soname=`$echo $soroot | ${SED} -e 's/^.*\///'` + newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + $show "extracting exported symbol list from \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$extract_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + $show "generating import library for \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$old_archive_from_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5* ) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a module then we can not link against + # it, someone is ignoring the new warnings I added + if /usr/bin/file -L $add 2> /dev/null | $EGREP "bundle" >/dev/null ; then + $echo "** Warning, lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $echo + $echo "** And there doesn't seem to be a static archive available" + $echo "** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case "$libdir" in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit $EXIT_FAILURE + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; esac - compile_command="$compile_command -l$name" - deplibs="$deplibs -l$name" + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" else - lib_linked=no + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && \ + test "$hardcode_minus_L" != yes && \ + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi fi - ;; + fi - relink) + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes; then - compile_command="$compile_command $absdir/$linklib" - deplibs="$deplibs $absdir/$linklib" + add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then - case "$compile_command " in - *" -L$absdir "*) ;; - *) compile_command="$compile_command -L$absdir";; - esac - compile_command="$compile_command -l$name" - deplibs="$deplibs -L$absdir -l$name" + add_dir="-L$libdir" + add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then - case ":$compile_shlibpath:" in - *":$absdir:"*) ;; - *) compile_shlibpath="$compile_shlibpath$absdir:";; + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac - compile_command="$compile_command -l$name" - deplibs="$deplibs -l$name" + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi else - lib_linked=no + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case "$libdir" in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" fi - ;; - - *) - lib_linked=no - ;; - esac - - if test "$lib_linked" != yes; then - $echo "$modename: configuration error: unsupported hardcode properties" - exit 1 - fi - # Finalize command for both is simple: just hardcode it. - if test "$hardcode_direct" = yes; then - finalize_command="$finalize_command $libdir/$linklib" - elif test "$hardcode_minus_L" = yes; then - case "$finalize_command " in - *" -L$libdir "*) ;; - *) finalize_command="$finalize_command -L$libdir";; - esac - finalize_command="$finalize_command -l$name" - elif test "$hardcode_shlibpath_var" = yes; then - case ":$finalize_shlibpath:" in - *":$libdir:"*) ;; - *) finalize_shlibpath="$finalize_shlibpath$libdir:";; - esac - finalize_command="$finalize_command -l$name" - else - # We cannot seem to hardcode it, guess we'll fake it. - case "$finalize_command " in - *" -L$dir "*) ;; - *) finalize_command="$finalize_command -L$libdir";; - esac - finalize_command="$finalize_command -l$name" - fi - else - # Transform directly to old archives if we don't build new libraries. - if test -n "$pic_flag" && test -z "$old_library"; then - $echo "$modename: cannot find static library for \`$arg'" 1>&2 - exit 1 + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi fi - + elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" - compile_command="$compile_command $dir/$linklib" - finalize_command="$finalize_command $dir/$linklib" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" else - case "$compile_command " in - *" -L$dir "*) ;; - *) compile_command="$compile_command -L$dir";; - esac - compile_command="$compile_command -l$name" - case "$finalize_command " in - *" -L$dir "*) ;; - *) finalize_command="$finalize_command -L$dir";; - esac - finalize_command="$finalize_command -l$name" + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + $echo + $echo "*** Warning: This system can not link to static lib archive $lib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $echo "*** But as you try to build a module library, libtool will still create " + $echo "*** a static module, that should work as long as the dlopening application" + $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + convenience="$convenience $dir/$old_library" + old_convenience="$old_convenience $dir/$old_library" + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" fi - fi - - # Add in any libraries that this one depends upon. - compile_command="$compile_command$dependency_libs" - finalize_command="$finalize_command$dependency_libs" - continue - ;; - # Some other compiler argument. - *) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case "$arg" in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) - arg="\"$arg\"" - ;; - esac - ;; - esac + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done - # Now actually substitute the argument into the commands. - if test -n "$arg"; then - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$deplib" && dir="." + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + fi + ;; + esac + if grep "^installed=no" $deplib > /dev/null; then + path="$absdir/$objdir" + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + if test "$absdir" != "$libdir"; then + $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 + fi + path="$absdir" + fi + depdepl= + case $host in + *-*-darwin*) + # we do not want to link against static libs, + # but need to link against shared + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$path/$depdepl" ; then + depdepl="$path/$depdepl" + fi + # do not add paths which are already there + case " $newlib_search_path " in + *" $path "*) ;; + *) newlib_search_path="$newlib_search_path $path";; + esac + fi + path="" + ;; + *) + path="-L$path" + ;; + esac + ;; + -l*) + case $host in + *-*-darwin*) + # Again, we only want to link against shared libraries + eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` + for tmp in $newlib_search_path ; do + if test -f "$tmp/lib$tmp_libs.dylib" ; then + eval depdepl="$tmp/lib$tmp_libs.dylib" + break + fi + done + path="" + ;; + *) continue ;; + esac + ;; + *) continue ;; + esac + case " $deplibs " in + *" $depdepl "*) ;; + *) deplibs="$depdepl $deplibs" ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$deplibs $path" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done fi - done - - if test -n "$prev"; then - $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then - eval arg=\"$export_dynamic_flag_spec\" - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - fi - - oldlibs= - # calculate the name of the file, without its directory - outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` - libobjs_save="$libobjs" - - case "$output" in - "") - $echo "$modename: you must specify an output file" 1>&2 - $echo "$help" 1>&2 - exit 1 - ;; + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi - *.a | *.lib) - if test -n "$link_against_libtool_libs"; then - $echo "$modename: error: cannot link libtool libraries into archives" 1>&2 - exit 1 + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + dlprefiles="$newdlprefiles" + fi + case $linkmode in + oldlib) if test -n "$deplibs"; then $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 fi @@ -1564,7 +2802,7 @@ compiler." fi if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2 + $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 fi if test -n "$release"; then @@ -1578,24 +2816,27 @@ compiler." # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" + objs="$objs$old_deplibs" ;; - *.la) + lib) # Make sure we only generate libraries of the form `libNAME.la'. - case "$outputname" in + case $outputname in lib*) name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) if test "$module" = no; then $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` @@ -1603,24 +2844,24 @@ compiler." ;; esac - output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` - if test "X$output_objdir" = "X$output"; then - output_objdir="$objdir" - else - output_objdir="$output_objdir/$objdir" - fi - if test -n "$objs"; then - $echo "$modename: cannot build libtool library \`$output' from non-libtool objects:$objs" 2>&1 - exit 1 + if test "$deplibs_check_method" != pass_all; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 + exit $EXIT_FAILURE + else + $echo + $echo "*** Warning: Linking the shared library $output against the non-libtool" + $echo "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi fi - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - $echo "$modename: warning: \`-dlopen' is ignored for libtool libraries" 1>&2 + if test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 fi set dummy $rpath - if test $# -gt 2; then + if test "$#" -gt 2; then $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 fi install_libdir="$2" @@ -1629,15 +2870,16 @@ compiler." if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. - libext=al + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi - dependency_libs="$deplibs" if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2 + $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 fi if test -n "$release"; then @@ -1646,73 +2888,138 @@ compiler." else # Parse the version information argument. - IFS="${IFS= }"; save_ifs="$IFS"; IFS=':' + save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 IFS="$save_ifs" if test -n "$8"; then $echo "$modename: too many parameters to \`-version-info'" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi - current="$2" - revision="$3" - age="$4" + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$2" + number_minor="$3" + number_revision="$4" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + current=`expr $number_major + $number_minor - 1` + age="$number_minor" + revision="$number_minor" + ;; + esac + ;; + no) + current="$2" + revision="$3" + age="$4" + ;; + esac # Check that each of the things are valid numbers. - case "$current" in - 0 | [1-9] | [1-9][0-9]*) ;; + case $current in + 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; *) $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; esac - case "$revision" in - 0 | [1-9] | [1-9][0-9]*) ;; + case $revision in + 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; *) $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; esac - case "$age" in - 0 | [1-9] | [1-9][0-9]*) ;; + case $age in + 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; *) $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; esac - if test $age -gt $current; then + if test "$age" -gt "$current"; then $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit 1 + exit $EXIT_FAILURE fi # Calculate the version variables. major= versuffix= verstring= - case "$version_type" in + case $version_type in none) ;; - irix) + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + minor_current=`expr $current + 1` + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + irix | nonstopux) major=`expr $current - $age + 1` - versuffix="$major.$revision" - verstring="sgi$major.$revision" + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision - while test $loop != 0; do + while test "$loop" -ne 0; do iface=`expr $revision - $loop` loop=`expr $loop - 1` - verstring="sgi$major.$iface:$verstring" + verstring="$verstring_prefix$major.$iface:$verstring" done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" ;; linux) @@ -1721,13 +3028,13 @@ compiler." ;; osf) - major=`expr $current - $age` + major=.`expr $current - $age` versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age - while test $loop != 0; do + while test "$loop" -ne 0; do iface=`expr $current - $loop` loop=`expr $loop - 1` verstring="$verstring:${iface}.0" @@ -1742,34 +3049,33 @@ compiler." versuffix=".$current.$revision" ;; - freebsd-aout) - major=".$current" - versuffix=".$current.$revision"; - ;; - - freebsd-elf) - major=".$current" - versuffix=".$current"; - ;; - windows) - # Like Linux, but with '-' rather than '.', since we only - # want one extension on Windows 95. + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. major=`expr $current - $age` - versuffix="-$major-$age-$revision" + versuffix="-$major" ;; *) $echo "$modename: unknown library version type \`$version_type'" 1>&2 - echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 - exit 1 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= - verstring="0.0" + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac if test "$need_version" = no; then versuffix= else @@ -1783,7 +3089,7 @@ compiler." versuffix= verstring="" fi - + # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then @@ -1795,136 +3101,111 @@ compiler." # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi + fi - dependency_libs="$deplibs" - case "$host" in - *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*) - # these systems don't actually have a c library (as such)! - ;; - *-*-freebsd*) - # FreeBSD doesn't need this... - ;; - *) - # Add libc to deplibs on all other systems. - deplibs="$deplibs -lc" - ;; - esac + if test "$mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$echo "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + if test -n "$removelist"; then + $show "${rm}r $removelist" + $run ${rm}r $removelist + fi fi - if test -n "$rpath$xrpath"; then + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + for path in $notinst_path; do + lib_search_path=`$echo "$lib_search_path " | ${SED} -e 's% $path % %g'` + deplibs=`$echo "$deplibs " | ${SED} -e 's% -L$path % %g'` + dependency_libs=`$echo "$dependency_libs " | ${SED} -e 's% -L$path % %g'` + done + + if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. - for libdir in $rpath $xrpath; do - # This is the magic to use -rpath. - case "$compile_rpath " in - *" $libdir "*) ;; - *) compile_rpath="$compile_rpath $libdir" ;; - esac + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done - fi - - # Now hardcode the library paths - rpath= - hardcode_libdirs= - for libdir in $compile_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - rpath="$rpath $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) perm_rpath="$perm_rpath $libdir" ;; - esac + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=\" $hardcode_libdir_flag_spec\" fi - compile_rpath="$rpath" - rpath= - hardcode_libdirs= - for libdir in $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - rpath="$rpath $flag" - fi - elif test -n "$runpath_var"; then - case "$finalize_perm_rpath " in - *" $libdir "*) ;; - *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; - esac - fi + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles="$dlfiles $lib" ;; + esac done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - finalize_rpath="$rpath" - # Create the output directory, or remove our outputs if we need to. - if test -d $output_objdir; then - $show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*" - $run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.* - else - $show "$mkdir $output_objdir" - $run $mkdir $output_objdir - status=$? - if test $status -ne 0 && test ! -d $output_objdir; then - exit $status - fi - fi + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done - # Now set the variables for building old libraries. - if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then - if test "$release_suffix" = all; then - oldlibs="$oldlibs $output_objdir/$libname$release.$libext" - else - oldlibs="$oldlibs $output_objdir/$libname.$libext" + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs -framework System" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + deplibs="$deplibs -lc" + fi + ;; + esac fi - # Transform .lo files to .o files. - oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` - fi - - if test "$build_libtool_libs" = yes; then # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname @@ -1939,13 +3220,13 @@ compiler." major="" newdeplibs= droppeddeps=no - case "$deplibs_check_method" in + case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just - # implementing what was already the behaviour. + # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) @@ -1958,64 +3239,88 @@ compiler." int main() { return 0; } EOF $rm conftest - $CC -o conftest conftest.c $deplibs - if test $? -eq 0 ; then + $LTCC -o conftest conftest.c $deplibs + if test "$?" -eq 0 ; then ldd_output=`ldd conftest` for i in $deplibs; do name="`expr $i : '-l\(.*\)'`" # If $name is empty we are operating on a -L argument. - if test "$name" != "" ; then - libname=`eval \\$echo \"$libname_spec\"` - deplib_matches=`eval \\$echo \"$library_names_spec\"` - set dummy $deplib_matches - deplib_match=$2 - if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then - newdeplibs="$newdeplibs $i" - else - droppeddeps=yes - echo - echo "*** Warning: This library needs some functionality provided by $i." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." + if test "$name" != "" && test "$name" -ne "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $i "*) + newdeplibs="$newdeplibs $i" + i="" + ;; + esac + fi + if test -n "$i" ; then + libname=`eval \\$echo \"$libname_spec\"` + deplib_matches=`eval \\$echo \"$library_names_spec\"` + set dummy $deplib_matches + deplib_match=$2 + if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then + newdeplibs="$newdeplibs $i" + else + droppeddeps=yes + $echo + $echo "*** Warning: dynamic linker does not accept needed library $i." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which I believe you do not have" + $echo "*** because a test_compile did reveal that the linker did not use it for" + $echo "*** its dynamic dependency list that programs get resolved with at runtime." + fi fi else newdeplibs="$newdeplibs $i" fi done else - # Error occured in the first compile. Let's try to salvage the situation: - # Compile a seperate program for each library. + # Error occurred in the first compile. Let's try to salvage + # the situation: Compile a separate program for each library. for i in $deplibs; do name="`expr $i : '-l\(.*\)'`" - # If $name is empty we are operating on a -L argument. - if test "$name" != "" ; then + # If $name is empty we are operating on a -L argument. + if test "$name" != "" && test "$name" != "0"; then $rm conftest - $CC -o conftest conftest.c $i + $LTCC -o conftest conftest.c $i # Did it work? - if test $? -eq 0 ; then + if test "$?" -eq 0 ; then ldd_output=`ldd conftest` - libname=`eval \\$echo \"$libname_spec\"` - deplib_matches=`eval \\$echo \"$library_names_spec\"` - set dummy $deplib_matches - deplib_match=$2 - if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then - newdeplibs="$newdeplibs $i" - else - droppeddeps=yes - echo - echo "*** Warning: This library needs some functionality provided by $i." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $i "*) + newdeplibs="$newdeplibs $i" + i="" + ;; + esac + fi + if test -n "$i" ; then + libname=`eval \\$echo \"$libname_spec\"` + deplib_matches=`eval \\$echo \"$library_names_spec\"` + set dummy $deplib_matches + deplib_match=$2 + if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then + newdeplibs="$newdeplibs $i" + else + droppeddeps=yes + $echo + $echo "*** Warning: dynamic linker does not accept needed library $i." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because a test_compile did reveal that the linker did not use this one" + $echo "*** as a dynamic dependency that programs can get resolved with at runtime." + fi fi else droppeddeps=yes - echo - echo "*** Warning! Library $i is needed by this library but I was not able to" - echo "*** make it link in! You will probably need to install it or some" - echo "*** library that it depends on before this library will be fully" - echo "*** functional. Installing it before continuing would be even better." + $echo + $echo "*** Warning! Library $i is needed by this library but I was not able to" + $echo "*** make it link in! You will probably need to install it or some" + $echo "*** library that it depends on before this library will be fully" + $echo "*** functional. Installing it before continuing would be even better." fi else newdeplibs="$newdeplibs $i" @@ -2025,19 +3330,28 @@ EOF ;; file_magic*) set dummy $deplibs_check_method - file_magic_regex="`expr \"$deplibs_check_method\" : \"$2 \(.*\)\"`" + file_magic_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` for a_deplib in $deplibs; do name="`expr $a_deplib : '-l\(.*\)'`" # If $name is empty we are operating on a -L argument. - if test "$name" != "" ; then - libname=`eval \\$echo \"$libname_spec\"` - for i in $lib_search_path; do - potential_libs=`ls $i/$libname[.-]* 2>/dev/null` - for potent_lib in $potential_libs; do + if test "$name" != "" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval \\$echo \"$libname_spec\"` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null \ | grep " -> " >/dev/null; then - continue + continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. @@ -2046,28 +3360,88 @@ EOF # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do - potliblink=`ls -ld $potlib | sed 's/.* -> //'` - case "$potliblink" in + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ - | sed 10q \ - | egrep "$file_magic_regex" > /dev/null; then + | ${SED} 10q \ + | $EGREP "$file_magic_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi - done - done + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for file magic test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a file magic. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + for a_deplib in $deplibs; do + name="`expr $a_deplib : '-l\(.*\)'`" + # If $name is empty we are operating on a -L argument. + if test -n "$name" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval \\$echo \"$libname_spec\"` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval $echo \"$potent_lib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi if test -n "$a_deplib" ; then droppeddeps=yes - echo - echo "*** Warning: This library needs some functionality provided by $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a regex pattern. Last file checked: $potlib" + fi fi else # Add a -L argument. @@ -2077,16 +3451,23 @@ EOF ;; none | unknown | *) newdeplibs="" - if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ - -e 's/ -[LR][^ ]*//g' -e 's/[ ]//g' | - grep . >/dev/null; then - echo + tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` + done + fi + if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ + | grep . >/dev/null; then + $echo if test "X$deplibs_check_method" = "Xnone"; then - echo "*** Warning: inter-library dependencies are not supported in this platform." + $echo "*** Warning: inter-library dependencies are not supported in this platform." else - echo "*** Warning: inter-library dependencies are not known to be supported." + $echo "*** Warning: inter-library dependencies are not known to be supported." fi - echo "*** All declared inter-library dependencies are being dropped." + $echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes fi ;; @@ -2097,35 +3478,53 @@ EOF libname=$libname_save name=$name_save + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + if test "$droppeddeps" = yes; then if test "$module" = yes; then - echo - echo "*** Warning: libtool could not satisfy all declared inter-library" - echo "*** dependencies of module $libname. Therefore, libtool will create" - echo "*** a static module, that should work as long as the dlopening" - echo "*** application is linked with the -dlopen flag." + $echo + $echo "*** Warning: libtool could not satisfy all declared inter-library" + $echo "*** dependencies of module $libname. Therefore, libtool will create" + $echo "*** a static module, that should work as long as the dlopening" + $echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** \`nm' from GNU binutils and a full rebuild may help." + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then - if test "$release_suffix" = all; then - oldlibs="$output_objdir/$libname$release.$libext" - else - oldlibs="$output_objdir/$libname.$libext" - fi + oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else - echo "*** The inter-library dependencies that have been dropped here will be" - echo "*** automatically added whenever a program is linked with this library" - echo "*** or is declared to -dlopen it." + $echo "*** The inter-library dependencies that have been dropped here will be" + $echo "*** automatically added whenever a program is linked with this library" + $echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + $echo + $echo "*** Since this library must not contain undefined symbols," + $echo "*** because either the platform does not support them or" + $echo "*** it was explicitly requested with -no-undefined," + $echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi fi fi # Done checking deplibs! @@ -2136,10 +3535,70 @@ EOF library_names= old_library= dlname= - + # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names realname="$2" @@ -2150,6 +3609,9 @@ EOF else soname="$realname" fi + if test -z "$dlname"; then + dlname=$soname + fi lib="$output_objdir/$realname" for link @@ -2157,23 +3619,6 @@ EOF linknames="$linknames $link" done - # Ensure that we have .o objects for linkers which dislike .lo - # (e.g. aix) in case we are running --disable-static - for obj in $libobjs; do - xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$obj"; then - xdir="." - else - xdir="$xdir" - fi - baseobj=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` - oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` - if test ! -f $xdir/$oldobj; then - $show "(cd $xdir && ${LN_S} $baseobj $oldobj)" - $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $? - fi - done - # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` @@ -2183,17 +3628,26 @@ EOF $show "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $run $rm $export_symbols - eval cmds=\"$export_symbols_cmds\" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? + eval cmd=\"$cmd\" + if len=`expr "X$cmd" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + $show "$cmd" + $run eval "$cmd" || exit $? + skipped_export=false + else + # The command line is too long to execute in one step. + $show "using reloadable object file for export list..." + skipped_export=: + fi done IFS="$save_ifs" if test -n "$export_symbols_regex"; then - $show "egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" - $run eval 'egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' $show "$mv \"${export_symbols}T\" \"$export_symbols\"" $run eval '$mv "${export_symbols}T" "$export_symbols"' fi @@ -2204,24 +3658,36 @@ EOF $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' fi + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" else gentop="$output_objdir/${outputname}x" $show "${rm}r $gentop" $run ${rm}r "$gentop" - $show "mkdir $gentop" - $run mkdir "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" status=$? - if test $status -ne 0 && test ! -d "$gentop"; then + if test "$status" -ne 0 && test ! -d "$gentop"; then exit $status fi generated="$generated $gentop" for xlib in $convenience; do # Extract the objects. - case "$xlib" in + case $xlib in [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; *) xabs=`pwd`"/$xlib" ;; esac @@ -2230,39 +3696,209 @@ EOF $show "${rm}r $xdir" $run ${rm}r "$xdir" - $show "mkdir $xdir" - $run mkdir "$xdir" + $show "$mkdir $xdir" + $run $mkdir "$xdir" status=$? - if test $status -ne 0 && test ! -d "$xdir"; then + if test "$status" -ne 0 && test ! -d "$xdir"; then exit $status fi + # We will extract separately just the conflicting names and we will no + # longer touch any unique names. It is faster to leave these extract + # automatically by $AR in one run. $show "(cd $xdir && $AR x $xabs)" $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 + $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 + $AR t "$xabs" | sort | uniq -cd | while read -r count name + do + i=1 + while test "$i" -le "$count" + do + # Put our $i before any first dot (extension) + # Never overwrite any file + name_to="$name" + while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" + do + name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` + done + $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" + $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? + i=`expr $i + 1` + done + done + fi - libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` + libobjs="$libobjs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` done fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" - linkopts="$linkopts $flag" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? fi # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - eval cmds=\"$archive_expsym_cmds\" + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && len=`expr "X$test_cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : else - eval cmds=\"$archive_cmds\" + # The command line is too long to link in one step, link piecewise. + $echo "creating reloadable object files..." + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + delfiles= + last_robj= + k=1 + output=$output_objdir/$save_output-${k}.$objext + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + eval test_cmds=\"$reload_cmds $objlist $last_robj\" + if test "X$objlist" = X || + { len=`expr "X$test_cmds" : ".*"` && + test "$len" -le "$max_cmd_len"; }; then + objlist="$objlist $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" + fi + last_robj=$output_objdir/$save_output-${k}.$objext + k=`expr $k + 1` + output=$output_objdir/$save_output-${k}.$objext + objlist=$obj + len=1 + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + + if ${skipped_export-false}; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + libobjs=$output + # Append the command to create the export file. + eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" + fi + + # Set up a command to remove the reloadale object files + # after they are used. + i=0 + while test "$i" -lt "$k" + do + i=`expr $i + 1` + delfiles="$delfiles $output_objdir/$save_output-${i}.$objext" + done + + $echo "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + + # Append the command to remove the reloadable object files + # to the just-reset $cmds. + eval cmds=\"\$cmds~\$rm $delfiles\" fi - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? + exit $EXIT_SUCCESS + fi + # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then @@ -2279,12 +3915,7 @@ EOF fi ;; - *.lo | *.o | *.obj) - if test -n "$link_against_libtool_libs"; then - $echo "$modename: error: cannot link libtool libraries into objects" 1>&2 - exit 1 - fi - + obj) if test -n "$deplibs"; then $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 fi @@ -2309,11 +3940,11 @@ EOF $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 fi - case "$output" in + case $output in *.lo) - if test -n "$objs"; then + if test -n "$objs$old_deplibs"; then $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 - exit 1 + exit $EXIT_FAILURE fi libobj="$output" obj=`$echo "X$output" | $Xsed -e "$lo2o"` @@ -2335,7 +3966,7 @@ EOF gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec - wl= + wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then @@ -2344,17 +3975,17 @@ EOF gentop="$output_objdir/${obj}x" $show "${rm}r $gentop" $run ${rm}r "$gentop" - $show "mkdir $gentop" - $run mkdir "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" status=$? - if test $status -ne 0 && test ! -d "$gentop"; then + if test "$status" -ne 0 && test ! -d "$gentop"; then exit $status fi generated="$generated $gentop" for xlib in $convenience; do # Extract the objects. - case "$xlib" in + case $xlib in [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; *) xabs=`pwd`"/$xlib" ;; esac @@ -2363,28 +3994,55 @@ EOF $show "${rm}r $xdir" $run ${rm}r "$xdir" - $show "mkdir $xdir" - $run mkdir "$xdir" + $show "$mkdir $xdir" + $run $mkdir "$xdir" status=$? - if test $status -ne 0 && test ! -d "$xdir"; then + if test "$status" -ne 0 && test ! -d "$xdir"; then exit $status fi + # We will extract separately just the conflicting names and we will no + # longer touch any unique names. It is faster to leave these extract + # automatically by $AR in one run. $show "(cd $xdir && $AR x $xabs)" $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 + $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 + $AR t "$xabs" | sort | uniq -cd | while read -r count name + do + i=1 + while test "$i" -le "$count" + do + # Put our $i before any first dot (extension) + # Never overwrite any file + name_to="$name" + while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" + do + name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` + done + $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" + $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? + i=`expr $i + 1` + done + done + fi - reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` + reload_conv_objs="$reload_objs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` done fi fi # Create the old-style object. - reload_objs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" + reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" - eval cmds=\"$reload_cmds\" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done @@ -2397,7 +4055,7 @@ EOF $run ${rm}r $gentop fi - exit 0 + exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then @@ -2408,37 +4066,24 @@ EOF # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. - $show "echo timestamp > $libobj" - $run eval "echo timestamp > $libobj" || exit $? - exit 0 + # $show "echo timestamp > $libobj" + # $run eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS fi - if test -n "$pic_flag"; then + if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" - eval cmds=\"$reload_cmds\" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" - else - # Just create a symlink. - $show $rm $libobj - $run $rm $libobj - xdir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$libobj"; then - xdir="." - else - xdir="$xdir" - fi - baseobj=`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` - oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` - $show "(cd $xdir && $LN_S $oldobj $baseobj)" - $run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $? fi if test -n "$gentop"; then @@ -2446,11 +4091,13 @@ EOF $run ${rm}r $gentop fi - exit 0 + exit $EXIT_SUCCESS ;; - # Anything else should be a program. - *) + prog) + case $host in + *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; + esac if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 fi @@ -2460,20 +4107,37 @@ EOF fi if test "$preload" = yes; then - if test "$dlopen" = unknown && test "$dlopen_self" = unknown && + if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && test "$dlopen_self_static" = unknown; then $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." - fi + fi fi - + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + case $host in + *darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + if test "$tagname" = CXX ; then + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + fi + ;; + esac + + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" + if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. - case "$compile_rpath " in - *" $libdir "*) ;; - *) compile_rpath="$compile_rpath $libdir" ;; - esac case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; @@ -2491,7 +4155,7 @@ EOF hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. - case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) @@ -2509,6 +4173,14 @@ EOF *) perm_rpath="$perm_rpath $libdir" ;; esac fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + case :$dllsearchpath: in + *":$libdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + ;; + esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && @@ -2527,7 +4199,7 @@ EOF hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. - case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) @@ -2554,23 +4226,6 @@ EOF fi finalize_rpath="$rpath" - output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` - if test "X$output_objdir" = "X$output"; then - output_objdir="$objdir" - else - output_objdir="$output_objdir/$objdir" - fi - - # Create the binary in the object directory, then wrap it. - if test ! -d $output_objdir; then - $show "$mkdir $output_objdir" - $run $mkdir $output_objdir - status=$? - if test $status -ne 0 && test ! -d $output_objdir; then - exit $status - fi - fi - if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` @@ -2587,7 +4242,7 @@ EOF fi if test -n "$dlsyms"; then - case "$dlsyms" in + case $dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. @@ -2619,19 +4274,19 @@ extern \"C\" { test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. - progfiles=`$echo "X$objs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` for arg in $progfiles; do $show "extracting global C symbols from \`$arg'" $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then - $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi - + if test -n "$export_symbols_regex"; then - $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi @@ -2639,9 +4294,9 @@ extern \"C\" { if test -z "$export_symbols"; then export_symbols="$output_objdir/$output.exp" $run $rm $export_symbols - $run eval "sed -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + $run eval "${SED} -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' else - $run eval "sed -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' + $run eval "${SED} -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' $run eval 'mv "$nlist"T "$nlist"' fi @@ -2649,8 +4304,8 @@ extern \"C\" { for arg in $dlprefiles; do $show "extracting global C symbols from \`$arg'" - name=`echo "$arg" | sed -e 's%^.*/%%'` - $run eval 'echo ": $name " >> "$nlist"' + name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` + $run eval '$echo ": $name " >> "$nlist"' $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" done @@ -2659,12 +4314,18 @@ extern \"C\" { test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then - egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $mv "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. - if grep -v "^: " < "$nlist" | sort +2 | uniq > "$nlist"S; then + if grep -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then : else grep -v "^: " < "$nlist" > "$nlist"S @@ -2673,7 +4334,7 @@ extern \"C\" { if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' else - echo '/* NONE */' >> "$output_objdir/$dlsyms" + $echo '/* NONE */' >> "$output_objdir/$dlsyms" fi $echo >> "$output_objdir/$dlsyms" "\ @@ -2681,27 +4342,25 @@ extern \"C\" { #undef lt_preloaded_symbols #if defined (__STDC__) && __STDC__ -# define lt_ptr_t void * +# define lt_ptr void * #else -# define lt_ptr_t char * +# define lt_ptr char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; - lt_ptr_t address; + lt_ptr address; } lt_preloaded_symbols[] = {\ " - sed -n -e 's/^: \([^ ]*\) $/ {\"\1\", (lt_ptr_t) 0},/p' \ - -e 's/^. \([^ ]*\) \([^ ]*\)$/ {"\2", (lt_ptr_t) \&\2},/p' \ - < "$nlist" >> "$output_objdir/$dlsyms" + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" $echo >> "$output_objdir/$dlsyms" "\ - {0, (lt_ptr_t) 0} + {0, (lt_ptr) 0} }; /* This works around a problem in FreeBSD linker */ @@ -2718,7 +4377,7 @@ static const void *lt_preloaded_setup() { fi pic_flag_for_symtable= - case "$host" in + case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use @@ -2727,18 +4386,18 @@ static const void *lt_preloaded_setup() { *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) case "$compile_command " in *" -static "*) ;; - *) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";; + *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; esac;; *-*-hpux*) case "$compile_command " in *" -static "*) ;; - *) pic_flag_for_symtable=" $pic_flag -DPIC";; + *) pic_flag_for_symtable=" $pic_flag";; esac esac # Now compile the dynamic symbol file. - $show "(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" - $run eval '(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + $show "(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? # Clean up the generated files. $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" @@ -2750,7 +4409,7 @@ static const void *lt_preloaded_setup() { ;; *) $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; esac else @@ -2763,7 +4422,7 @@ static const void *lt_preloaded_setup() { finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` fi - if test -z "$link_against_libtool_libs" || test "$build_libtool_libs" != yes; then + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then # Replace the output file specification. compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" @@ -2772,7 +4431,7 @@ static const void *lt_preloaded_setup() { $show "$link_command" $run eval "$link_command" status=$? - + # Delete the generated files. if test -n "$dlsyms"; then $show "$rm $output_objdir/${outputname}S.${objext}" @@ -2786,7 +4445,7 @@ static const void *lt_preloaded_setup() { # We should set the shlibpath_var rpath= for dir in $temp_rpath; do - case "$dir" in + case $dir in [\\/]* | [A-Za-z]:[\\/]*) # Absolute path. rpath="$rpath$dir:" @@ -2828,11 +4487,24 @@ static const void *lt_preloaded_setup() { fi fi + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $run $rm $output + # Link the executable and exit + $show "$link_command" + $run eval "$link_command" || exit $? + exit $EXIT_SUCCESS + fi + if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" - + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 $echo "$modename: \`$output' will be relinked during installation" 1>&2 else @@ -2852,7 +4524,7 @@ static const void *lt_preloaded_setup() { # Replace the output file specification. link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` - + # Delete the old output files. $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname @@ -2864,14 +4536,26 @@ static const void *lt_preloaded_setup() { # Quote the relink command for shipping. if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` fi # Quote $echo for shipping. - if test "X$echo" = "X$SHELL $0 --fallback-echo"; then - case "$0" in - [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";; - *) qecho="$SHELL `pwd`/$0 --fallback-echo";; + if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; esac qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` else @@ -2883,10 +4567,230 @@ static const void *lt_preloaded_setup() { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in - *.exe) output=`echo $output|sed 's,.exe$,,'` ;; + *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + cwrappersource=`$echo ${objdir}/lt-${output}.c` + cwrapper=`$echo ${output}.exe` + $rm $cwrappersource $cwrapper + trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + cat > $cwrappersource <> $cwrappersource<<"EOF" +#include +#include +#include +#include +#include +#include + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef DIR_SEPARATOR +#define DIR_SEPARATOR '/' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +#define HAVE_DOS_BASED_FILE_SYSTEM +#ifndef DIR_SEPARATOR_2 +#define DIR_SEPARATOR_2 '\\' +#endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +const char *program_name = NULL; + +void * xmalloc (size_t num); +char * xstrdup (const char *string); +char * basename (const char *name); +char * fnqualify(const char *path); +char * strendzap(char *str, const char *pat); +void lt_fatal (const char *message, ...); + +int +main (int argc, char *argv[]) +{ + char **newargz; + int i; + + program_name = (char *) xstrdup ((char *) basename (argv[0])); + newargz = XMALLOC(char *, argc+2); +EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" + newargz[1] = fnqualify(argv[0]); + /* we know the script has the same name, without the .exe */ + /* so make sure newargz[1] doesn't end in .exe */ + strendzap(newargz[1],".exe"); + for (i = 1; i < argc; i++) + newargz[i+1] = xstrdup(argv[i]); + newargz[argc+1] = NULL; +EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" +} + +void * +xmalloc (size_t num) +{ + void * p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL +; +} + +char * +basename (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha (name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return (char *) base; +} + +char * +fnqualify(const char *path) +{ + size_t size; + char *p; + char tmp[LT_PATHMAX + 1]; + + assert(path != NULL); + + /* Is it qualified already? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha (path[0]) && path[1] == ':') + return xstrdup (path); +#endif + if (IS_DIR_SEPARATOR (path[0])) + return xstrdup (path); + + /* prepend the current directory */ + /* doesn't handle '~' */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + size = strlen(tmp) + 1 + strlen(path) + 1; /* +2 for '/' and '\0' */ + p = XMALLOC(char, size); + sprintf(p, "%s%c%s", tmp, DIR_SEPARATOR, path); + return p; +} + +char * +strendzap(char *str, const char *pat) +{ + size_t len, patlen; + + assert(str != NULL); + assert(pat != NULL); + + len = strlen(str); + patlen = strlen(pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp(str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char * mode, + const char * message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} +EOF + # we should really use a build-platform specific compiler + # here, but OTOH, the wrappers (shell script and this C one) + # are only useful if you want to execute the "real" binary. + # Since the "real" binary is built for $host, then this + # wrapper might as well be built for $host, too. + $run $LTCC -s -o $cwrapper $cwrappersource + ;; esac $rm $output - trap "$rm $output; exit 1" 1 2 15 + trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 $echo > $output "\ #! $SHELL @@ -2902,7 +4806,7 @@ static const void *lt_preloaded_setup() { # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. -Xsed='sed -e 1s/^X//' +Xsed='${SED} -e 1s/^X//' sed_quote_subst='$sed_quote_subst' # The HP-UX ksh and POSIX shell print the target directory to stdout @@ -2914,7 +4818,7 @@ relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variable: - link_against_libtool_libs='$link_against_libtool_libs' + notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$echo are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then @@ -2940,20 +4844,20 @@ else test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. - file=\`ls -ld \"\$file\" | sed -n 's/.*-> //p'\` + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in - [\\/]* | [A-Za-z]:[\\/]*) thisdir=\"\$destdir\" ;; + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` - file=\`ls -ld \"\$thisdir/\$file\" | sed -n 's/.*-> //p'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` done # Try to get the absolute directory name. @@ -2962,12 +4866,12 @@ else " if test "$fast_install" = yes; then - echo >> $output "\ - program=lt-'$outputname' + $echo >> $output "\ + program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" - + if test ! -f \"\$progdir/\$program\" || \\ - { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | sed 1q\`; \\ + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" @@ -2978,14 +4882,15 @@ else $rm \"\$progdir/\$file\" fi" - echo >> $output "\ + $echo >> $output "\ # relink executable if necessary if test -n \"\$relink_command\"; then - if (cd \"\$thisdir\" && eval \$relink_command); then : + if relink_command_output=\`eval \$relink_command 2>&1\`; then : else + $echo \"\$relink_command_output\" >&2 $rm \"\$progdir/\$file\" - exit 1 + exit $EXIT_FAILURE fi fi @@ -2995,13 +4900,13 @@ else $rm \"\$progdir/\$file\" fi" else - echo >> $output "\ + $echo >> $output "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi - echo >> $output "\ + $echo >> $output "\ if test -f \"\$progdir/\$program\"; then" @@ -3032,39 +4937,35 @@ else # Run the actual program with our arguments. " case $host in - *-*-cygwin* | *-*-mingw | *-*-os2*) - # win32 systems need to use the prog path for dll - # lookup to work + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) $echo >> $output "\ exec \$progdir\\\\\$program \${1+\"\$@\"} " ;; + *) $echo >> $output "\ - # Export the path to the program. - PATH=\"\$progdir:\$PATH\" - export PATH - - exec \$program \${1+\"\$@\"} + exec \$progdir/\$program \${1+\"\$@\"} " ;; esac $echo >> $output "\ \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" - exit 1 + exit $EXIT_FAILURE fi else # The program doesn't exist. \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 \$echo \"This script is just a wrapper for \$program.\" 1>&2 - echo \"See the $PACKAGE documentation for more information.\" 1>&2 - exit 1 + $echo \"See the $PACKAGE documentation for more information.\" 1>&2 + exit $EXIT_FAILURE fi fi\ " chmod +x $output fi - exit 0 + exit $EXIT_SUCCESS ;; esac @@ -3080,7 +4981,7 @@ fi\ oldobjs="$libobjs_save" build_libtool_libs=no else - oldobjs="$objs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP` + oldobjs="$old_deplibs $non_pic_objects" fi addlibs="$old_convenience" fi @@ -3089,18 +4990,18 @@ fi\ gentop="$output_objdir/${outputname}x" $show "${rm}r $gentop" $run ${rm}r "$gentop" - $show "mkdir $gentop" - $run mkdir "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" status=$? - if test $status -ne 0 && test ! -d "$gentop"; then + if test "$status" -ne 0 && test ! -d "$gentop"; then exit $status fi generated="$generated $gentop" - + # Add in members from convenience archives. for xlib in $addlibs; do # Extract the objects. - case "$xlib" in + case $xlib in [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; *) xabs=`pwd`"/$xlib" ;; esac @@ -3109,14 +5010,40 @@ fi\ $show "${rm}r $xdir" $run ${rm}r "$xdir" - $show "mkdir $xdir" - $run mkdir "$xdir" + $show "$mkdir $xdir" + $run $mkdir "$xdir" status=$? - if test $status -ne 0 && test ! -d "$xdir"; then + if test "$status" -ne 0 && test ! -d "$xdir"; then exit $status fi + # We will extract separately just the conflicting names and we will no + # longer touch any unique names. It is faster to leave these extract + # automatically by $AR in one run. $show "(cd $xdir && $AR x $xabs)" $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 + $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 + $AR t "$xabs" | sort | uniq -cd | while read -r count name + do + i=1 + while test "$i" -le "$count" + do + # Put our $i before any first dot (extension) + # Never overwrite any file + name_to="$name" + while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" + do + name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` + done + $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" + $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? + i=`expr $i + 1` + done + done + fi oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP` done @@ -3124,30 +5051,71 @@ fi\ # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then - eval cmds=\"$old_archive_from_new_cmds\" + cmds=$old_archive_from_new_cmds else - # Ensure that we have .o objects in place in case we decided - # not to build a shared library, and have fallen back to building - # static libs even though --disable-static was passed! - for oldobj in $oldobjs; do - if test ! -f $oldobj; then - xdir=`$echo "X$oldobj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$oldobj"; then - xdir="." + eval cmds=\"$old_archive_cmds\" + + if len=`expr "X$cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + $echo "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + # GNU ar 2.10+ was changed to match POSIX; thus no paths are + # encoded into archives. This makes 'ar r' malfunction in + # this piecewise linking case whenever conflicting object + # names appear in distinct ar calls; check, warn and compensate. + if (for obj in $save_oldobjs + do + $echo "X$obj" | $Xsed -e 's%^.*/%%' + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: warning: object name conflicts; overriding AR_FLAGS to 'cq'" 1>&2 + $echo "$modename: warning: to ensure that POSIX-compatible ar will work" 1>&2 + AR_FLAGS=cq + fi + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + for obj in $save_oldobjs + do + oldobjs="$objlist $obj" + objlist="$objlist $obj" + eval test_cmds=\"$old_archive_cmds\" + if len=`expr "X$test_cmds" : ".*"` && + test "$len" -le "$max_cmd_len"; then + : else - xdir="$xdir" + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= fi - baseobj=`$echo "X$oldobj" | $Xsed -e 's%^.*/%%'` - obj=`$echo "X$baseobj" | $Xsed -e "$o2lo"` - $show "(cd $xdir && ${LN_S} $obj $baseobj)" - $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $? + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi - done - - eval cmds=\"$old_archive_cmds\" + fi fi - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + save_ifs="$IFS"; IFS='~' for cmd in $cmds; do + eval cmd=\"$cmd\" IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? @@ -3161,24 +5129,31 @@ fi\ fi # Now create the libtool archive. - case "$output" in + case $output in *.la) old_library= - if test "$release_suffix" = all; then - test "$build_old_libs" = yes && old_library="$libname$release.$libext" - else - test "$build_old_libs" = yes && old_library="$libname.$libext" - fi + test "$build_old_libs" = yes && old_library="$libname.$libext" $show "creating $output" - if test -n "$xrpath"; then - temp_xrpath= - for libdir in $xrpath; do - temp_xrpath="$temp_xrpath -R$libdir" - done - dependency_libs="$temp_xrpath $dependency_libs" + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= fi + # Only create the output if not a dry run. if test -z "$run"; then for installed in no yes; do @@ -3187,8 +5162,71 @@ fi\ break fi output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + for lib in $dlfiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlfiles="$newdlfiles $libdir/$name" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlprefiles="$newdlprefiles $libdir/$name" + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" fi $rm $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac $echo > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP @@ -3197,7 +5235,7 @@ fi\ # It is necessary for linking the library. # The name that we can dlopen(3). -dlname='$dlname' +dlname='$tdlname' # Names of this library. library_names='$library_names' @@ -3216,19 +5254,29 @@ revision=$revision # Is this an already installed library? installed=$installed +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + # Directory that this library needs to be installed in: -libdir='$install_libdir'\ -" +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $echo >> $output "\ +relink_command=\"$relink_command\"" + fi done fi # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" - $run eval "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" || exit $? + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? ;; esac - exit 0 + exit $EXIT_SUCCESS ;; # libtool install mode @@ -3237,10 +5285,12 @@ libdir='$install_libdir'\ # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). - if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh; then + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $echo "X$nonopt" | $Xsed | grep shtool > /dev/null; then # Aesthetically quote it. arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` - case "$arg" in + case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) arg="\"$arg\"" ;; @@ -3256,7 +5306,7 @@ libdir='$install_libdir'\ # The real first argument should be the name of the installation program. # Aesthetically quote it. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case "$arg" in + case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) arg="\"$arg\"" ;; @@ -3279,7 +5329,7 @@ libdir='$install_libdir'\ continue fi - case "$arg" in + case $arg in -d) isdir=yes ;; -f) prev="-f" ;; -g) prev="-g" ;; @@ -3304,7 +5354,7 @@ libdir='$install_libdir'\ # Aesthetically quote the argument. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case "$arg" in + case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) arg="\"$arg\"" ;; @@ -3315,13 +5365,13 @@ libdir='$install_libdir'\ if test -z "$install_prog"; then $echo "$modename: you must specify an install program" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi if test -n "$prev"; then $echo "$modename: the \`$prev' option requires an argument" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi if test -z "$files"; then @@ -3331,7 +5381,7 @@ libdir='$install_libdir'\ $echo "$modename: you must specify a destination" 1>&2 fi $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi # Strip any trailing slash from the destination. @@ -3349,22 +5399,22 @@ libdir='$install_libdir'\ # Not a directory, so check to see that there is only one file specified. set dummy $files - if test $# -gt 2; then + if test "$#" -gt 2; then $echo "$modename: \`$dest' is not a directory" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi fi - case "$destdir" in + case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do - case "$file" in + case $file in *.lo) ;; *) $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; esac done @@ -3381,25 +5431,26 @@ libdir='$install_libdir'\ for file in $files; do # Do each installation. - case "$file" in - *.a | *.lib) + case $file in + *.$libext) # Do the static libraries later. staticlibs="$staticlibs $file" ;; *.la) # Check to see that this really is a libtool archive. - if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi library_names= old_library= + relink_command= # If there is no directory component, then add one. - case "$file" in + case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac @@ -3418,10 +5469,41 @@ libdir='$install_libdir'\ esac fi - dir="`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/" + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ test "X$dir" = "X$file/" && dir= dir="$dir$objdir" + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + $echo "$modename: warning: relinking \`$file'" 1>&2 + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + exit $EXIT_FAILURE + fi + fi + # See the names of the shared library. set dummy $library_names if test -n "$2"; then @@ -3429,11 +5511,18 @@ libdir='$install_libdir'\ shift shift + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + # Install the shared library and build the symlinks. - $show "$install_prog $dir/$realname $destdir/$realname" - $run eval "$install_prog $dir/$realname $destdir/$realname" || exit $? + $show "$install_prog $dir/$srcname $destdir/$realname" + $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? + if test -n "$stripme" && test -n "$striplib"; then + $show "$striplib $destdir/$realname" + $run eval "$striplib $destdir/$realname" || exit $? + fi - if test $# -gt 0; then + if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. for linkname do @@ -3446,10 +5535,11 @@ libdir='$install_libdir'\ # Do each command in the postinstall commands. lib="$destdir/$realname" - eval cmds=\"$postinstall_cmds\" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + cmds=$postinstall_cmds + save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done @@ -3457,12 +5547,10 @@ libdir='$install_libdir'\ fi # Install the pseudo-library for information purposes. - if test "$install_ltlibs" = yes; then - name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - instname="$dir/$name"i - $show "$install_prog $instname $destdir/$name" - $run eval "$install_prog $instname $destdir/$name" || exit $? - fi + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $destdir/$name" || exit $? # Maybe install the static library, too. test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" @@ -3480,18 +5568,18 @@ libdir='$install_libdir'\ fi # Deduce the name of the destination old-style object file. - case "$destfile" in + case $destfile in *.lo) staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` ;; - *.o | *.obj) + *.$objext) staticdest="$destfile" destfile= ;; *) $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; esac @@ -3509,7 +5597,7 @@ libdir='$install_libdir'\ $show "$install_prog $staticobj $staticdest" $run eval "$install_prog \$staticobj \$staticdest" || exit $? fi - exit 0 + exit $EXIT_SUCCESS ;; *) @@ -3521,51 +5609,99 @@ libdir='$install_libdir'\ destfile="$destdir/$destfile" fi + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + file=`$echo $file|${SED} 's,.exe$,,'` + stripped_ext=".exe" + fi + ;; + esac + # Do a test to see if this is really a libtool program. - if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - link_against_libtool_libs= + case $host in + *cygwin*|*mingw*) + wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` + ;; + *) + wrapper=$file + ;; + esac + if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then + notinst_deplibs= relink_command= + # To insure that "foo" is sourced, and not "foo.exe", + # finese the cygwin/MSYS system by explicitly sourcing "foo." + # which disallows the automatic-append-.exe behavior. + case $build in + *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; + *) wrapperdot=${wrapper} ;; + esac # If there is no directory component, then add one. - case "$file" in - */* | *\\*) . $file ;; - *) . ./$file ;; + case $file in + */* | *\\*) . ${wrapperdot} ;; + *) . ./${wrapperdot} ;; esac # Check the variables that should have been set. - if test -z "$link_against_libtool_libs"; then - $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2 - exit 1 + if test -z "$notinst_deplibs"; then + $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 + exit $EXIT_FAILURE fi finalize=yes - for lib in $link_against_libtool_libs; do + for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then # If there is no directory component, then add one. - case "$lib" in + case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac fi - libfile="$libdir/`$echo "X$lib" | $Xsed -e 's%^.*/%%g'`" + libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 finalize=no fi done + relink_command= + # To insure that "foo" is sourced, and not "foo.exe", + # finese the cygwin/MSYS system by explicitly sourcing "foo." + # which disallows the automatic-append-.exe behavior. + case $build in + *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; + *) wrapperdot=${wrapper} ;; + esac + # If there is no directory component, then add one. + case $file in + */* | *\\*) . ${wrapperdot} ;; + *) . ./${wrapperdot} ;; + esac + outputname= if test "$fast_install" = no && test -n "$relink_command"; then if test "$finalize" = yes && test -z "$run"; then tmpdir="/tmp" test -n "$TMPDIR" && tmpdir="$TMPDIR" tmpdir="$tmpdir/libtool-$$" - if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then : + save_umask=`umask` + umask 0077 + if $mkdir "$tmpdir"; then + umask $save_umask else + umask $save_umask $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 continue fi + file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` @@ -3583,10 +5719,27 @@ libdir='$install_libdir'\ fi else # Install the binary that we compiled earlier. - file=`$echo "X$file" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` fi fi + # remove .exe since cygwin /usr/bin/install will append another + # one anyways + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` + ;; + esac + ;; + esac $show "$install_prog$stripme $file $destfile" $run eval "$install_prog\$stripme \$file \$destfile" || exit $? test -n "$outputname" && ${rm}r "$tmpdir" @@ -3603,11 +5756,17 @@ libdir='$install_libdir'\ $show "$install_prog $file $oldlib" $run eval "$install_prog \$file \$oldlib" || exit $? + if test -n "$stripme" && test -n "$old_striplib"; then + $show "$old_striplib $oldlib" + $run eval "$old_striplib $oldlib" || exit $? + fi + # Do each command in the postinstall commands. - eval cmds=\"$old_postinstall_cmds\" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + cmds=$old_postinstall_cmds + save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done @@ -3621,11 +5780,10 @@ libdir='$install_libdir'\ if test -n "$current_libdirs"; then # Maybe just do a dry run. test -n "$run" && current_libdirs=" -n$current_libdirs" - exec $SHELL $0 --finish$current_libdirs - exit 1 + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS fi - - exit 0 ;; # libtool finish mode @@ -3643,10 +5801,11 @@ libdir='$install_libdir'\ for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. - eval cmds=\"$finish_cmds\" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + cmds=$finish_cmds + save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || admincmds="$admincmds $cmd" @@ -3663,43 +5822,43 @@ libdir='$install_libdir'\ fi # Exit here if they wanted silent mode. - test "$show" = : && exit 0 + test "$show" = : && exit $EXIT_SUCCESS - echo "----------------------------------------------------------------------" - echo "Libraries have been installed in:" + $echo "----------------------------------------------------------------------" + $echo "Libraries have been installed in:" for libdir in $libdirs; do - echo " $libdir" + $echo " $libdir" done - echo - echo "If you ever happen to want to link against installed libraries" - echo "in a given directory, LIBDIR, you must either use libtool, and" - echo "specify the full pathname of the library, or use \`-LLIBDIR'" - echo "flag during linking and do at least one of the following:" + $echo + $echo "If you ever happen to want to link against installed libraries" + $echo "in a given directory, LIBDIR, you must either use libtool, and" + $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + $echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then - echo " - add LIBDIR to the \`$shlibpath_var' environment variable" - echo " during execution" + $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + $echo " during execution" fi if test -n "$runpath_var"; then - echo " - add LIBDIR to the \`$runpath_var' environment variable" - echo " during linking" + $echo " - add LIBDIR to the \`$runpath_var' environment variable" + $echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" - echo " - use the \`$flag' linker flag" + $echo " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then - echo " - have your system administrator run these commands:$admincmds" + $echo " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then - echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi - echo - echo "See any operating system documentation about shared libraries for" - echo "more information, such as the ld(1) and ld.so(8) manual pages." - echo "----------------------------------------------------------------------" - exit 0 + $echo + $echo "See any operating system documentation about shared libraries for" + $echo "more information, such as the ld(1) and ld.so(8) manual pages." + $echo "----------------------------------------------------------------------" + exit $EXIT_SUCCESS ;; # libtool execute mode @@ -3711,7 +5870,7 @@ libdir='$install_libdir'\ if test -z "$cmd"; then $echo "$modename: you must specify a COMMAND" 1>&2 $echo "$help" - exit 1 + exit $EXIT_FAILURE fi # Handle -dlopen flags immediately. @@ -3719,18 +5878,18 @@ libdir='$install_libdir'\ if test ! -f "$file"; then $echo "$modename: \`$file' is not a file" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi dir= - case "$file" in + case $file in *.la) # Check to see that this really is a libtool archive. - if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi # Read the libtool library. @@ -3738,7 +5897,7 @@ libdir='$install_libdir'\ library_names= # If there is no directory component, then add one. - case "$file" in + case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac @@ -3757,7 +5916,7 @@ libdir='$install_libdir'\ dir="$dir/$objdir" else $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 - exit 1 + exit $EXIT_FAILURE fi ;; @@ -3793,13 +5952,13 @@ libdir='$install_libdir'\ args= for file do - case "$file" in + case $file in -*) ;; *) # Do a test to see if this is really a libtool program. - if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then # If there is no directory component, then add one. - case "$file" in + case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac @@ -3816,11 +5975,11 @@ libdir='$install_libdir'\ if test -z "$run"; then if test -n "$shlibpath_var"; then - # Export the shlibpath_var. - eval "export $shlibpath_var" + # Export the shlibpath_var. + eval "export $shlibpath_var" fi - # Restore saved enviroment variables + # Restore saved environment variables if test "${save_LC_ALL+set}" = set; then LC_ALL="$save_LC_ALL"; export LC_ALL fi @@ -3828,31 +5987,35 @@ libdir='$install_libdir'\ LANG="$save_LANG"; export LANG fi - # Now actually exec the command. - eval "exec \$cmd$args" - - $echo "$modename: cannot exec \$cmd$args" - exit 1 + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then - eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" - $echo "export $shlibpath_var" + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" fi $echo "$cmd$args" - exit 0 + exit $EXIT_SUCCESS fi ;; - # libtool uninstall mode - uninstall) - modename="$modename: uninstall" + # libtool clean and uninstall mode + clean | uninstall) + modename="$modename: $mode" rm="$nonopt" files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" for arg do - case "$arg" in + case $arg in + -f) rm="$rm $arg"; rmforce=yes ;; -*) rm="$rm $arg" ;; *) files="$files $arg" ;; esac @@ -3861,91 +6024,183 @@ libdir='$install_libdir'\ if test -z "$rm"; then $echo "$modename: you must specify an RM program" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi + rmdirs= + + origobjdir="$objdir" for file in $files; do dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` - test "X$dir" = "X$file" && dir=. + if test "X$dir" = "X$file"; then + dir=. + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if (test -L "$file") >/dev/null 2>&1 \ + || (test -h "$file") >/dev/null 2>&1 \ + || test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi rmfiles="$file" - case "$name" in + case $name in *.la) # Possibly a libtool archive, so verify it. - if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then . $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do - rmfiles="$rmfiles $dir/$n" + rmfiles="$rmfiles $objdir/$n" done - test -n "$old_library" && rmfiles="$rmfiles $dir/$old_library" - - $show "$rm $rmfiles" - $run $rm $rmfiles - - if test -n "$library_names"; then - # Do each command in the postuninstall commands. - eval cmds=\"$postuninstall_cmds\" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + test "$mode" = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + + if test "$mode" = uninstall; then + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + cmds=$postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" - done - IFS="$save_ifs" - fi + fi - if test -n "$old_library"; then - # Do each command in the old_postuninstall commands. - eval cmds=\"$old_postuninstall_cmds\" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + cmds=$old_postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" - done - IFS="$save_ifs" + fi + # FIXME: should reinstall the best remaining shared library. fi - - # FIXME: should reinstall the best remaining shared library. fi ;; *.lo) - if test "$build_old_libs" = yes; then - oldobj=`$echo "X$name" | $Xsed -e "$lo2o"` - rmfiles="$rmfiles $dir/$oldobj" + # Possibly a libtool object, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + + # Read the .lo file + . $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" \ + && test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" \ + && test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi fi - $show "$rm $rmfiles" - $run $rm $rmfiles ;; *) - $show "$rm $rmfiles" - $run $rm $rmfiles + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + file=`$echo $file|${SED} 's,.exe$,,'` + noexename=`$echo $name|${SED} 's,.exe$,,'` + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$noexename + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi ;; esac + $show "$rm $rmfiles" + $run $rm $rmfiles || exit_status=1 + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + $show "rmdir $dir" + $run rmdir $dir >/dev/null 2>&1 + fi done - exit 0 + + exit $exit_status ;; "") $echo "$modename: you must specify a MODE" 1>&2 $echo "$generic_help" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; esac - $echo "$modename: invalid operation mode \`$mode'" 1>&2 - $echo "$generic_help" 1>&2 - exit 1 + if test -z "$exec_cmd"; then + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + fi fi # test -z "$show_help" +if test -n "$exec_cmd"; then + eval exec $exec_cmd + exit $EXIT_FAILURE +fi + # We need to display help for each of the modes. -case "$mode" in +case $mode in "") $echo \ "Usage: $modename [OPTION]... [MODE-ARG]... @@ -3960,10 +6215,12 @@ Provide generalized library-building support services. --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] --quiet same as \`--silent' --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG --version print version information MODE must be one of the following: + clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries @@ -3972,8 +6229,24 @@ MODE must be one of the following: uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for -a more detailed description of MODE." - exit 0 +a more detailed description of MODE. + +Report bugs to ." + exit $EXIT_SUCCESS + ;; + +clean) + $echo \ +"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) @@ -3985,6 +6258,8 @@ Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only -static always build a \`.o' file suitable for static linking COMPILE-COMMAND is a command to be used in creating a \`standard' object file @@ -4064,8 +6339,13 @@ The following components of LINK-COMMAND are treated specially: -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries @@ -4107,14 +6387,34 @@ Otherwise, only FILE itself is deleted using RM." *) $echo "$modename: invalid operation mode \`$mode'" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; esac -echo +$echo $echo "Try \`$modename --help' for more information about other modes." -exit 0 +exit $EXIT_SUCCESS + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) $echo no;; *) $echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script diff --git a/skeletons/Makefile.in b/skeletons/Makefile.in index e8f42241d..a8586536b 100644 --- a/skeletons/Makefile.in +++ b/skeletons/Makefile.in @@ -1,7 +1,8 @@ -# Makefile.in generated automatically by automake 1.5 from Makefile.am. +# Makefile.in generated by automake 1.8.4 from Makefile.am. +# @configure_input@ -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -13,101 +14,196 @@ @SET_MAKE@ -SHELL = @SHELL@ - srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) -transform = @program_transform_name@ +transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_alias = @build_alias@ build_triplet = @build@ -host_alias = @host_alias@ host_triplet = @host@ -target_alias = @target_alias@ target_triplet = @target@ +subdir = skeletons +DIST_COMMON = README $(dist_pkgdata_DATA) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +am__installdirs = "$(DESTDIR)$(pkgdatadir)" +dist_pkgdataDATA_INSTALL = $(INSTALL_DATA) +DATA = $(dist_pkgdata_DATA) +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ ADD_CFLAGS = @ADD_CFLAGS@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ -AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ -OBJDUMP = @OBJDUMP@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ PATH = @PATH@ +PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ +am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ install_sh = @install_sh@ - +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ SUBDIRS = tests - dist_pkgdata_DATA = *.[ch] -subdir = skeletons -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -DIST_SOURCES = -DATA = $(dist_pkgdata_DATA) - - -RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \ - uninstall-info-recursive all-recursive install-data-recursive \ - install-exec-recursive installdirs-recursive install-recursive \ - uninstall-recursive check-recursive installcheck-recursive -DIST_COMMON = README $(dist_pkgdata_DATA) Makefile.am Makefile.in -DIST_SUBDIRS = $(SUBDIRS) all: all-recursive .SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu skeletons/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu skeletons/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo @@ -117,30 +213,23 @@ clean-libtool: distclean-libtool: -rm -f libtool -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu skeletons/Makefile -Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) && \ - CONFIG_HEADERS= CONFIG_LINKS= \ - CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: install-dist_pkgdataDATA: $(dist_pkgdata_DATA) @$(NORMAL_INSTALL) - $(mkinstalldirs) $(DESTDIR)$(pkgdatadir) + test -z "$(pkgdatadir)" || $(mkdir_p) "$(DESTDIR)$(pkgdatadir)" @list='$(dist_pkgdata_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(pkgdatadir)/$$f"; \ - $(INSTALL_DATA) $$d$$p $(DESTDIR)$(pkgdatadir)/$$f; \ + echo " $(dist_pkgdataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgdatadir)/$$f'"; \ + $(dist_pkgdataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgdatadir)/$$f"; \ done uninstall-dist_pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(dist_pkgdata_DATA)'; for p in $$list; do \ f="`echo $$p | sed -e 's|^.*/||'`"; \ - echo " rm -f $(DESTDIR)$(pkgdatadir)/$$f"; \ - rm -f $(DESTDIR)$(pkgdatadir)/$$f; \ + echo " rm -f '$(DESTDIR)$(pkgdatadir)/$$f'"; \ + rm -f "$(DESTDIR)$(pkgdatadir)/$$f"; \ done # This directory's subdirectories are mostly independent; you can cd @@ -150,7 +239,7 @@ uninstall-dist_pkgdataDATA: # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): - @set fnord $(MAKEFLAGS); amf=$$2; \ + @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ @@ -170,7 +259,7 @@ $(RECURSIVE_TARGETS): mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: - @set fnord $(MAKEFLAGS); amf=$$2; \ + @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ @@ -197,74 +286,108 @@ tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done - -tags: TAGS +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - mkid -fID $$unique $(LISP) + mkid -fID $$unique +tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ + test -f $$subdir/TAGS && \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ - || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -z "$$unique" && unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique GTAGS: - here=`CDPATH=: && cd $(top_builddir) && pwd` \ + here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH - -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -top_distdir = .. -distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - $(mkinstalldirs) "$(distdir)/$$dir"; \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ fi; \ if test -d $$d/$$file; then \ - cp -pR $$d/$$file $(distdir) \ - || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done - for subdir in $(SUBDIRS); do \ + list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -d $(distdir)/$$subdir \ - || mkdir $(distdir)/$$subdir \ + test -d "$(distdir)/$$subdir" \ + || mkdir "$(distdir)/$$subdir" \ || exit 1; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" \ - distdir=../$(distdir)/$$subdir \ + top_distdir="../$(top_distdir)" \ + distdir="../$(distdir)/$$subdir" \ distdir) \ || exit 1; \ fi; \ @@ -274,8 +397,9 @@ check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: - $(mkinstalldirs) $(DESTDIR)$(pkgdatadir) - + for dir in "$(DESTDIR)$(pkgdatadir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive @@ -287,6 +411,7 @@ install-am: all-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: @@ -294,7 +419,7 @@ mostlyclean-generic: clean-generic: distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + -rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -304,7 +429,7 @@ clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive - + -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ distclean-tags @@ -312,6 +437,8 @@ dvi: dvi-recursive dvi-am: +html: html-recursive + info: info-recursive info-am: @@ -327,34 +454,39 @@ install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive - + -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + uninstall-am: uninstall-dist_pkgdataDATA uninstall-info-am \ uninstall-local uninstall-info: uninstall-info-recursive -.PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \ - clean-generic clean-libtool clean-recursive distclean \ - distclean-generic distclean-libtool distclean-recursive \ - distclean-tags distdir dvi dvi-am dvi-recursive info info-am \ - info-recursive install install-am install-data install-data-am \ - install-data-recursive install-dist_pkgdataDATA install-exec \ - install-exec-am install-exec-recursive install-info \ - install-info-am install-info-recursive install-man \ - install-recursive install-strip installcheck installcheck-am \ - installdirs installdirs-am installdirs-recursive \ - maintainer-clean maintainer-clean-generic \ +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-libtool clean-recursive ctags \ + ctags-recursive distclean distclean-generic distclean-libtool \ + distclean-recursive distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dist_pkgdataDATA install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ maintainer-clean-recursive mostlyclean mostlyclean-generic \ - mostlyclean-libtool mostlyclean-recursive tags tags-recursive \ - uninstall uninstall-am uninstall-dist_pkgdataDATA \ - uninstall-info-am uninstall-info-recursive uninstall-local \ - uninstall-recursive + mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \ + tags tags-recursive uninstall uninstall-am \ + uninstall-dist_pkgdataDATA uninstall-info-am uninstall-local uninstall-local: -@echo -n " " diff --git a/skeletons/tests/Makefile.in b/skeletons/tests/Makefile.in index 779f93a52..582a3f5c1 100644 --- a/skeletons/tests/Makefile.in +++ b/skeletons/tests/Makefile.in @@ -1,7 +1,8 @@ -# Makefile.in generated automatically by automake 1.5 from Makefile.am. +# Makefile.in generated by automake 1.8.4 from Makefile.am. +# @configure_input@ -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -12,164 +13,226 @@ # PARTICULAR PURPOSE. @SET_MAKE@ - -SHELL = @SHELL@ +SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c check-UTCTime.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) -transform = @program_transform_name@ +transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_alias = @build_alias@ build_triplet = @build@ -host_alias = @host_alias@ host_triplet = @host@ -target_alias = @target_alias@ target_triplet = @target@ +check_PROGRAMS = check-OIDs$(EXEEXT) check-GeneralizedTime$(EXEEXT) \ + check-UTCTime$(EXEEXT) check-INTEGER$(EXEEXT) +subdir = skeletons/tests +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +check_GeneralizedTime_SOURCES = check-GeneralizedTime.c +check_GeneralizedTime_OBJECTS = check-GeneralizedTime.$(OBJEXT) +check_GeneralizedTime_LDADD = $(LDADD) +check_INTEGER_SOURCES = check-INTEGER.c +check_INTEGER_OBJECTS = check-INTEGER.$(OBJEXT) +check_INTEGER_LDADD = $(LDADD) +check_OIDs_SOURCES = check-OIDs.c +check_OIDs_OBJECTS = check-OIDs.$(OBJEXT) +check_OIDs_LDADD = $(LDADD) +check_UTCTime_SOURCES = check-UTCTime.c +check_UTCTime_OBJECTS = check-UTCTime.$(OBJEXT) +check_UTCTime_LDADD = $(LDADD) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/check-GeneralizedTime.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/check-INTEGER.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/check-OIDs.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/check-UTCTime.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c \ + check-UTCTime.c +DIST_SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c \ + check-UTCTime.c +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ ADD_CFLAGS = @ADD_CFLAGS@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ -AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ -OBJDUMP = @OBJDUMP@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ PATH = @PATH@ +PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ +am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ install_sh = @install_sh@ - +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ AM_CPPFLAGS = -I${top_srcdir}/skeletons - -check_PROGRAMS = \ - check-GeneralizedTime \ - check-UTCTime \ - check-INTEGER \ - check-OIDs - - TESTS = ${check_PROGRAMS} -subdir = skeletons/tests -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -check_PROGRAMS = check-GeneralizedTime$(EXEEXT) check-UTCTime$(EXEEXT) \ - check-INTEGER$(EXEEXT) check-OIDs$(EXEEXT) -check_GeneralizedTime_SOURCES = check-GeneralizedTime.c -check_GeneralizedTime_OBJECTS = check-GeneralizedTime.$(OBJEXT) -check_GeneralizedTime_LDADD = $(LDADD) -check_GeneralizedTime_DEPENDENCIES = -check_GeneralizedTime_LDFLAGS = -check_INTEGER_SOURCES = check-INTEGER.c -check_INTEGER_OBJECTS = check-INTEGER.$(OBJEXT) -check_INTEGER_LDADD = $(LDADD) -check_INTEGER_DEPENDENCIES = -check_INTEGER_LDFLAGS = -check_OIDs_SOURCES = check-OIDs.c -check_OIDs_OBJECTS = check-OIDs.$(OBJEXT) -check_OIDs_LDADD = $(LDADD) -check_OIDs_DEPENDENCIES = -check_OIDs_LDFLAGS = -check_UTCTime_SOURCES = check-UTCTime.c -check_UTCTime_OBJECTS = check-UTCTime.$(OBJEXT) -check_UTCTime_LDADD = $(LDADD) -check_UTCTime_DEPENDENCIES = -check_UTCTime_LDFLAGS = - -DEFS = @DEFS@ -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/check-GeneralizedTime.Po \ -@AMDEP_TRUE@ $(DEPDIR)/check-INTEGER.Po $(DEPDIR)/check-OIDs.Po \ -@AMDEP_TRUE@ $(DEPDIR)/check-UTCTime.Po -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ - $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -CFLAGS = @CFLAGS@ -DIST_SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c \ - check-UTCTime.c -DIST_COMMON = Makefile.am Makefile.in -SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c check-UTCTime.c - all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu skeletons/tests/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu skeletons/tests/Makefile -Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) && \ - CONFIG_HEADERS= CONFIG_LINKS= \ - CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-checkPROGRAMS: - -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) + @list='$(check_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done check-GeneralizedTime$(EXEEXT): $(check_GeneralizedTime_OBJECTS) $(check_GeneralizedTime_DEPENDENCIES) @rm -f check-GeneralizedTime$(EXEEXT) $(LINK) $(check_GeneralizedTime_LDFLAGS) $(check_GeneralizedTime_OBJECTS) $(check_GeneralizedTime_LDADD) $(LIBS) @@ -184,73 +247,100 @@ check-UTCTime$(EXEEXT): $(check_UTCTime_OBJECTS) $(check_UTCTime_DEPENDENCIES) $(LINK) $(check_UTCTime_LDFLAGS) $(check_UTCTime_OBJECTS) $(check_UTCTime_LDADD) $(LIBS) mostlyclean-compile: - -rm -f *.$(OBJEXT) core *.core + -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/check-GeneralizedTime.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/check-INTEGER.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/check-OIDs.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/check-UTCTime.Po@am__quote@ - -distclean-depend: - -rm -rf $(DEPDIR) +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-GeneralizedTime.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-INTEGER.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-OIDs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-UTCTime.Po@am__quote@ .c.o: -@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: -@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(COMPILE) -c `cygpath -w $<` +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: -@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< -CCDEPMODE = @CCDEPMODE@ -uninstall-info-am: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< -tags: TAGS +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - mkid -fID $$unique $(LISP) + mkid -fID $$unique +tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ - || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -z "$$unique" && unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique GTAGS: - here=`CDPATH=: && cd $(top_builddir) && pwd` \ + here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; \ + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ @@ -262,26 +352,29 @@ check-TESTS: $(TESTS) all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - echo "XPASS: $$tst"; \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ ;; \ *) \ - echo "PASS: $$tst"; \ + echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ - xfail=`expr $$xfail + 1`; \ - echo "XFAIL: $$tst"; \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ ;; \ *) \ - failed=`expr $$failed + 1`; \ - echo "FAIL: $$tst"; \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ ;; \ esac; \ + else \ + skip=`expr $$skip + 1`; \ + echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ @@ -297,28 +390,49 @@ check-TESTS: $(TESTS) banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + skipped="($$skip tests were not run)"; \ + test `echo "$$skipped" | wc -c` -gt `echo "$$banner" | wc -c` && \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -gt `echo "$$banner" | wc -c` && \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ + test -n "$$skipped" && echo "$$skipped"; \ + test -n "$$report" && echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ - fi - -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -top_distdir = ../.. -distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + else :; fi distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - $(mkinstalldirs) "$(distdir)/$$dir"; \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ fi; \ if test -d $$d/$$file; then \ - cp -pR $$d/$$file $(distdir) \ - || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ @@ -330,9 +444,7 @@ check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile - installdirs: - install: install-am install-exec: install-exec-am install-data: install-data-am @@ -344,6 +456,7 @@ install-am: all-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: @@ -351,24 +464,28 @@ mostlyclean-generic: clean-generic: distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + -rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am -clean-am: clean-checkPROGRAMS clean-generic clean-libtool mostlyclean-am +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + mostlyclean-am distclean: distclean-am - -distclean-am: clean-am distclean-compile distclean-depend \ - distclean-generic distclean-libtool distclean-tags + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags dvi: dvi-am dvi-am: +html: html-am + info: info-am info-am: @@ -384,7 +501,8 @@ install-man: installcheck-am: maintainer-clean: maintainer-clean-am - + -rm -rf ./$(DEPDIR) + -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am @@ -392,19 +510,27 @@ mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + uninstall-am: uninstall-info-am -.PHONY: GTAGS all all-am check check-TESTS check-am clean \ - clean-checkPROGRAMS clean-generic clean-libtool distclean \ - distclean-compile distclean-depend distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am info \ - info-am install install-am install-data install-data-am \ - install-exec install-exec-am install-info install-info-am \ - install-man install-strip installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool tags uninstall uninstall-am \ - uninstall-info-am +.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool ctags \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/tests/Makefile.in b/tests/Makefile.in index a391a53a3..2bfb20e92 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -1,7 +1,8 @@ -# Makefile.in generated automatically by automake 1.5 from Makefile.am. +# Makefile.in generated by automake 1.8.4 from Makefile.am. +# @configure_input@ -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -12,92 +13,182 @@ # PARTICULAR PURPOSE. @SET_MAKE@ - -SHELL = @SHELL@ - srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) -transform = @program_transform_name@ +transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_alias = @build_alias@ build_triplet = @build@ -host_alias = @host_alias@ host_triplet = @host@ -target_alias = @target_alias@ target_triplet = @target@ +subdir = tests +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ ADD_CFLAGS = @ADD_CFLAGS@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ -AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ -OBJDUMP = @OBJDUMP@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ PATH = @PATH@ +PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ +am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ install_sh = @install_sh@ - +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ EXTRA_DIST = *.asn1* -subdir = tests -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -DIST_SOURCES = -DIST_COMMON = README Makefile.am Makefile.in all: all-am .SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo @@ -107,33 +198,35 @@ clean-libtool: distclean-libtool: -rm -f libtool -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu tests/Makefile -Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) && \ - CONFIG_HEADERS= CONFIG_LINKS= \ - CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: tags: TAGS TAGS: +ctags: CTAGS +CTAGS: -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -top_distdir = .. -distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - $(mkinstalldirs) "$(distdir)/$$dir"; \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ fi; \ if test -d $$d/$$file; then \ - cp -pR $$d/$$file $(distdir) \ - || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ @@ -143,9 +236,7 @@ distdir: $(DISTFILES) check-am: all-am check: check-am all-am: Makefile - installdirs: - install: install-am install-exec: install-exec-am install-data: install-data-am @@ -157,6 +248,7 @@ install-am: all-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: @@ -164,7 +256,7 @@ mostlyclean-generic: clean-generic: distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + -rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -174,13 +266,15 @@ clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am - + -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool dvi: dvi-am dvi-am: +html: html-am + info: info-am info-am: @@ -196,23 +290,32 @@ install-man: installcheck-am: maintainer-clean: maintainer-clean-am - + -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + uninstall-am: uninstall-info-am .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am info info-am install install-am install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-man install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool uninstall uninstall-am uninstall-info-am + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ + uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. From 9373b4d6c1cdc89f4c55e59bf117129f57049213 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 17 Jun 2004 23:43:12 +0000 Subject: [PATCH 0032/1469] moved git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@32 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/Makefile.am | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/skeletons/tests/Makefile.am b/skeletons/tests/Makefile.am index e620ade68..4efbcec44 100644 --- a/skeletons/tests/Makefile.am +++ b/skeletons/tests/Makefile.am @@ -1,9 +1,9 @@ AM_CPPFLAGS = -I${top_srcdir}/skeletons check_PROGRAMS = \ + check-OIDs \ check-GeneralizedTime \ check-UTCTime \ - check-INTEGER \ - check-OIDs + check-INTEGER TESTS = ${check_PROGRAMS} From 1255771807d9c8c5c621011a1feffcffe10e56da Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 17 Jun 2004 23:43:39 +0000 Subject: [PATCH 0033/1469] _set_arcs_l() replaced by _set_arcs() fror OBJECT IDENTIFIER and RELATIVE-OID git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@33 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OBJECT_IDENTIFIER.c | 244 +++++++++++++++++++++++++--------- skeletons/OBJECT_IDENTIFIER.h | 15 ++- skeletons/RELATIVE-OID.c | 45 ++----- skeletons/RELATIVE-OID.h | 8 +- skeletons/tests/check-OIDs.c | 103 ++++++++++---- 5 files changed, 284 insertions(+), 131 deletions(-) diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index a156d0602..5bb045ae1 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -118,6 +118,12 @@ OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed in * type, there is still possible to fit it when there * are few unused high bits in the arc value * representaion. + * + * Moreover, there is a possibility that the + * number could actually fit the arc space, given + * that add is negative, but we don't handle + * such "temporary lack of precision" situation here. + * May be considered as a bug. */ uint8_t mask = (0xff << (7-(arclen - rvsize))) & 0x7f; if((*arcbuf & mask)) { @@ -156,7 +162,7 @@ OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed in inc = +1; /* Big endian is known [at compile time] */ { - unsigned int bits; /* typically no more than 3-4 bits */ + int bits; /* typically no more than 3-4 bits */ /* Clear the high unused bits */ for(bits = rvsize - arclen; @@ -287,7 +293,7 @@ OBJECT_IDENTIFIER_get_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, int add = 0; int i; - if(!oid || !oid->buf) { + if(!oid || !oid->buf || (arc_slots && arc_type_size <= 1)) { errno = EINVAL; return -1; } @@ -335,37 +341,158 @@ OBJECT_IDENTIFIER_get_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, return num_arcs; } + +/* + * Save the single value as an object identifier arc. + */ +inline int +OBJECT_IDENTIFIER_set_single_arc(uint8_t *arcbuf, void *arcval, unsigned int arcval_size, int prepared_order) { + /* + * The following conditions must hold: + * assert(arcval); + * assert(arcval_size > 0); + * assert(arcbuf); + */ +#ifdef WORDS_BIGENDIAN + const unsigned isLittleEndian = 0; +#else + unsigned LE = 1; + unsigned isLittleEndian = *(char *)&LE; +#endif + uint8_t buffer[arcval_size]; + uint8_t *tp, *tend; + unsigned int cache; + uint8_t *bp = arcbuf; + int bits; + + if(isLittleEndian && !prepared_order) { + uint8_t *a = arcval + arcval_size - 1; + uint8_t *aend = arcval; + uint8_t *msb = buffer + arcval_size - 1; + for(tp = buffer; a >= aend; tp++, a--) + if((*tp = *a) && (tp < msb)) + msb = tp; + tend = &buffer[arcval_size]; + tp = msb; /* Most significant non-zero byte */ + } else { + /* Look for most significant non-zero byte */ + tend = arcval + arcval_size; + for(tp = arcval; tp < tend - 1; tp++) + if(*tp) break; + } + + /* + * Split the value in 7-bits chunks. + */ + bits = ((tend - tp) * CHAR_BIT) % 7; + if(bits) { + cache = *tp >> (CHAR_BIT - bits); + if(cache) { + *bp++ = cache | 0x80; + cache = *tp++; + bits = CHAR_BIT - bits; + } else { + bits = -bits; + } + } else { + cache = 0; + } + for(; tp < tend; tp++) { + cache = (cache << CHAR_BIT) + *tp; + bits += CHAR_BIT; + while(bits >= 7) { + bits -= 7; + *bp++ = 0x80 | (cache >> bits); + } + } + if(bits) *bp++ = cache; + bp[-1] &= 0x7f; /* Clear the last bit */ + + return bp - arcbuf; +} + int -OBJECT_IDENTIFIER_set_arcs_l(OBJECT_IDENTIFIER_t *oid, unsigned long *arcs, unsigned int arc_slots) { +OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, unsigned int arc_type_size, unsigned int arc_slots) { uint8_t *buf; uint8_t *bp; - unsigned long long first_value; + unsigned LE = 1; /* Little endian (x86) */ + unsigned isLittleEndian = *((char *)&LE); + unsigned int arc0; + unsigned int arc1; + unsigned size; unsigned i; - int size; - if(oid == NULL || arcs == NULL || arc_slots < 2) { + if(!oid || !arcs || arc_type_size < 1 || arc_slots < 2) { errno = EINVAL; return -1; } - if(arcs[0] <= 1) { - if(arcs[1] >= 39) { + switch(arc_type_size) { + case sizeof(char): + arc0 = ((unsigned char *)arcs)[0]; + arc1 = ((unsigned char *)arcs)[1]; + break; + case sizeof(short): + arc0 = ((unsigned short *)arcs)[0]; + arc1 = ((unsigned short *)arcs)[1]; + break; + case sizeof(int): + arc0 = ((unsigned int *)arcs)[0]; + arc1 = ((unsigned int *)arcs)[1]; + break; + default: + arc1 = arc0 = 0; + if(isLittleEndian) { /* Little endian (x86) */ + unsigned char *ps, *pe; + /* If more significant bytes are present, + * make them > 255 quick */ + for(ps = arcs + 1, pe = ps+arc_type_size; ps < pe; ps++) + arc0 |= *ps, arc1 |= *(ps + arc_type_size); + arc0 <<= CHAR_BIT, arc1 <<= CHAR_BIT; + arc0 = *((unsigned char *)arcs + 0); + arc1 = *((unsigned char *)arcs + arc_type_size); + } else { + unsigned char *ps, *pe; + /* If more significant bytes are present, + * make them > 255 quick */ + for(ps = arcs, pe = ps+arc_type_size - 1; ps < pe; ps++) + arc0 |= *ps, arc1 |= *(ps + arc_type_size); + arc0 = *((unsigned char *)arcs + arc_type_size - 1); + arc1 = *((unsigned char *)arcs +(arc_type_size<< 1)-1); + } + } + + /* + * The previous chapter left us with the first and the second arcs. + * The values are not precise (that is, they are valid only if + * they're less than 255), but OK for the purposes of making + * the sanity test below. + */ + if(arc0 <= 1) { + if(arc1 >= 39) { /* 8.19.4: At most 39 subsequent values (including 0) */ errno = ERANGE; return -1; } - } else if(arcs[0] > 2) { + } else if(arc0 > 2) { /* 8.19.4: Only three values are allocated from the root node */ errno = ERANGE; return -1; } - - first_value = arcs[0] * 40 + arcs[1]; + /* + * After above tests it is known that the value of arc0 is completely + * trustworthy (0..2). However, the arc1's value is still meaningless. + */ /* * Roughly estimate the maximum size necessary to encode these arcs. + * This estimation implicitly takes in account the following facts, + * that cancel each other: + * * the first two arcs are encoded in a single value. + * * the first value may require more space (+1 byte) + * * the value of the first arc which is in range (0..2) */ - size = ((sizeof(arcs[0]) + 1) * 8 / 7) * arc_slots; + size = ((arc_type_size * CHAR_BIT + 6) / 7) * arc_slots; bp = buf = MALLOC(size + 1); if(!buf) { /* ENOMEM */ @@ -373,67 +500,60 @@ OBJECT_IDENTIFIER_set_arcs_l(OBJECT_IDENTIFIER_t *oid, unsigned long *arcs, unsi } /* - * Encode the arcs and refine the encoding size. + * Encode the first two arcs. + * These require special treatment. */ - size = 0; - { - uint8_t tbuf[sizeof(first_value) * 2]; - uint8_t *tp = tbuf; - int arc_len = 0; - int add = 0; - - for(; first_value; first_value >>= 7) { - unsigned int b7 = first_value & 0x7f; - *tp++ = 0x80 | b7; - add++; - if(b7) { arc_len += add; add = 0; } - } - - if(arc_len) { - tp = &tbuf[arc_len - 1]; - /* The last octet does not have bit 8 set. */ - *tbuf &= 0x7f; - for(; tp >= tbuf; tp--) - *bp++ = *tp; - size += arc_len; + uint8_t first_value[1 + arc_type_size]; /* of two arcs */ + uint8_t *fv = first_value; + uint8_t *tp; + + /* + * Simulate first_value = arc0 * 40 + arc1; + */ + /* Copy the second (1'st) arcs[1] into the first_value */ + *fv++ = 0; + (char *)arcs += arc_type_size; + if(isLittleEndian) { + uint8_t *aend = arcs - 1; + uint8_t *a1 = arcs + arc_type_size - 1; + for(; a1 > aend; fv++, a1--) *fv = *a1; } else { - *bp++ = 0; - size++; + uint8_t *a1 = arcs; + uint8_t *aend = a1 + arc_type_size; + for(; a1 < aend; fv++, a1++) *fv = *a1; } - } - - for(i = 2; i < arc_slots; i++) { - unsigned long value = arcs[i]; - uint8_t tbuf[sizeof(value) * 2]; /* Conservatively sized */ - uint8_t *tp = tbuf; - int arc_len = 0; - int add = 0; - - for(; value; value >>= 7) { - unsigned int b7 = value & 0x7F; - *tp++ = 0x80 | b7; - add++; - if(b7) { arc_len += add; add = 0; } + /* Increase the first_value by arc0 */ + arc0 *= 40; /* (0..80) */ + for(tp = first_value + arc_type_size; tp >= first_value; tp--) { + unsigned int v = *tp; + v += arc0; + *tp = v; + if(v >= (1 << CHAR_BIT)) arc0 = v >> CHAR_BIT; + else break; } - if(arc_len) { - tp = &tbuf[arc_len - 1]; - /* The last octet does not have bit 8 set. */ - *tbuf &= 0x7f; - for(; tp >= tbuf; tp--) - *bp++ = *tp; - size += arc_len; - } else { - *bp++ = 0; - size++; - } + assert(tp >= first_value); + + bp += OBJECT_IDENTIFIER_set_single_arc(bp, first_value, + fv - first_value, 1); + } + + /* + * Save the rest of arcs. + */ + for((char *)arcs += arc_type_size, i = 2; + i < arc_slots; i++, (char *)arcs += arc_type_size) { + bp += OBJECT_IDENTIFIER_set_single_arc(bp, + arcs, arc_type_size, 0); } + assert((bp - buf) <= size); + /* * Replace buffer. */ - oid->size = size; + oid->size = bp - buf; bp = oid->buf; oid->buf = buf; if(bp) FREEMEM(bp); diff --git a/skeletons/OBJECT_IDENTIFIER.h b/skeletons/OBJECT_IDENTIFIER.h index 77b07def1..8d43c9970 100644 --- a/skeletons/OBJECT_IDENTIFIER.h +++ b/skeletons/OBJECT_IDENTIFIER.h @@ -68,7 +68,9 @@ int OBJECT_IDENTIFIER_print_arc(uint8_t *arcbuf, int arclen, * >=0: Number of arcs contained in the OBJECT IDENTIFIER */ int OBJECT_IDENTIFIER_get_arcs(OBJECT_IDENTIFIER_t *_oid, - void *_arcs, unsigned int _arc_type_size, unsigned int _arc_slots); + void *_arcs, /* i.e., unsigned int arcs[N] */ + unsigned int _arc_type_size, /* i.e., sizeof(arcs[0]) */ + unsigned int _arc_slots /* i.e., N */); /* * This functions initializes the OBJECT IDENTIFIER object with @@ -80,15 +82,18 @@ int OBJECT_IDENTIFIER_get_arcs(OBJECT_IDENTIFIER_t *_oid, * -1/ENOMEM: Memory allocation failed * 0: The object was initialized with new arcs. */ -int OBJECT_IDENTIFIER_set_arcs_l(OBJECT_IDENTIFIER_t *_oid, - unsigned long *_arcs, unsigned int _arc_slots); +int OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *_oid, + void *_arcs, /* i.e., unsigned int arcs[N] */ + unsigned int _arc_type_size, /* i.e., sizeof(arcs[0]) */ + unsigned int _arc_slots /* i.e., N */); /* * Internal functions. + * Used by RELATIVE-OID implementation in particular. */ int OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed int add, void *value, unsigned int value_size); -int OBJECT_IDENTIFIER_get_single_arc_l(uint8_t *arcbuf, unsigned int arclen, - signed int add, unsigned long *value); +int OBJECT_IDENTIFIER_set_single_arc(uint8_t *arcbuf, + void *arcval, unsigned int arcval_size, int _prepared_order); #endif /* _OBJECT_IDENTIFIER_H_ */ diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index 37f557d78..b5c346a52 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -3,6 +3,7 @@ * Redistribution and modifications are permitted subject to BSD license. */ #include +#include /* for CHAR_BIT */ #include #include @@ -96,13 +97,13 @@ RELATIVE_OID_get_arcs(RELATIVE_OID_t *roid, } int -RELATIVE_OID_set_arcs_l(RELATIVE_OID_t *roid, unsigned long *arcs, int arcs_slots) { +RELATIVE_OID_set_arcs(RELATIVE_OID_t *roid, void *arcs, unsigned int arc_type_size, unsigned int arcs_slots) { uint8_t *buf; uint8_t *bp; int size; int i; - if(roid == NULL || arcs == NULL || arcs_slots < 0) { + if(roid == NULL || arcs == NULL || arc_type_size < 1) { errno = EINVAL; return -1; } @@ -110,7 +111,7 @@ RELATIVE_OID_set_arcs_l(RELATIVE_OID_t *roid, unsigned long *arcs, int arcs_slot /* * Roughly estimate the maximum size necessary to encode these arcs. */ - size = ((sizeof(arcs[0]) + 1) * 8 / 7) * arcs_slots; + size = ((arc_type_size * CHAR_BIT + 6) / 7) * arcs_slots; bp = buf = MALLOC(size + 1); if(!buf) { /* ENOMEM */ @@ -118,45 +119,23 @@ RELATIVE_OID_set_arcs_l(RELATIVE_OID_t *roid, unsigned long *arcs, int arcs_slot } /* - * Encode the arcs and refine the encoding size. + * Encode the arcs. */ - size = 0; - for(i = 0; i < arcs_slots; i++) { - unsigned long value = arcs[i]; - uint8_t tbuf[sizeof(value) * 2]; /* Conservatively sized */ - uint8_t *tp = tbuf; - int arc_len = 0; - int add; - - for(add = 1; value; value >>= 7, add++) { - unsigned int b7 = value & 0x7F; - *tp++ = 0x80 | b7; - if(b7) { - arc_len += add; - add = 0; - } - } - - if(arc_len) { - tp = &tbuf[arc_len - 1]; - /* The last octet does not have bit 8 set. */ - *tbuf &= 0x7f; - for(; tp >= tbuf; tp--) - *bp++ = *tp; - size += arc_len; - } else { - *bp++ = 0; - size++; - } + for(i = 0; i < arcs_slots; i++, (char *)arcs += arc_type_size) { + bp += OBJECT_IDENTIFIER_set_single_arc(bp, + arcs, arc_type_size, 0); } + assert((bp - buf) <= size); + /* * Replace buffer. */ - roid->size = size; + roid->size = bp - buf; bp = roid->buf; roid->buf = buf; if(bp) FREEMEM(bp); return 0; } + diff --git a/skeletons/RELATIVE-OID.h b/skeletons/RELATIVE-OID.h index 926aca3ab..1dafb62d5 100644 --- a/skeletons/RELATIVE-OID.h +++ b/skeletons/RELATIVE-OID.h @@ -19,12 +19,12 @@ asn_struct_print_f RELATIVE_OID_print; * Some handy conversion routines * **********************************/ -/* See OBJECT_IDENTIFIER_set_arcs_l() function in OBJECT_IDENTIFIER.h */ -int RELATIVE_OID_set_arcs_l(RELATIVE_OID_t *_roid, - unsigned long *arcs, int arcs_slots); - /* See OBJECT_IDENTIFIER_get_arcs() function in OBJECT_IDENTIFIER.h */ int RELATIVE_OID_get_arcs(RELATIVE_OID_t *_roid, void *arcs, unsigned int arc_type_size, unsigned int arc_slots); +/* See OBJECT_IDENTIFIER_set_arcs() function in OBJECT_IDENTIFIER.h */ +int RELATIVE_OID_set_arcs(RELATIVE_OID_t *_roid, + void *arcs, unsigned int arc_type_size, unsigned int arcs_slots); + #endif /* _RELATIVE_OID_H_ */ diff --git a/skeletons/tests/check-OIDs.c b/skeletons/tests/check-OIDs.c index cea630e0d..97ed33ff1 100644 --- a/skeletons/tests/check-OIDs.c +++ b/skeletons/tests/check-OIDs.c @@ -1,5 +1,5 @@ -#include "../RELATIVE-OID.c" #include "../OBJECT_IDENTIFIER.c" +#include "../RELATIVE-OID.c" #include "../INTEGER.c" #include "../ber_decoder.c" #include "../ber_tlv_length.c" @@ -42,6 +42,7 @@ check_OID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { OBJECT_IDENTIFIER_print(&asn1_DEF_OBJECT_IDENTIFIER, oid, 0, _print, 0); printf("\n"); + memset(arcs, 'A', sizeof(arcs)); alen = OBJECT_IDENTIFIER_get_arcs(oid, arcs, sizeof(arcs[0]), sizeof(arcs)/sizeof(arcs[0])); assert(alen > 0); @@ -85,6 +86,7 @@ check_ROID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { RELATIVE_OID_print(&asn1_DEF_RELATIVE_OID, oid, 0, _print, 0); printf("\n"); + memset(arcs, 'A', sizeof(arcs)); alen = RELATIVE_OID_get_arcs(oid, arcs, sizeof(arcs[0]), sizeof(arcs)/sizeof(arcs[0])); assert(alen > 0); @@ -113,21 +115,23 @@ check_REGEN(int *arcs, int acount) { int ret; int i; - printf("Encoding {"); + printf("Encoding (R) {"); for(i = 0; i < acount; i++) { printf(" %u", arcs[i]); } printf(" }\n"); - ret = RELATIVE_OID_set_arcs_l(&oid, (unsigned long *)arcs, acount); + ret = RELATIVE_OID_set_arcs(&oid, arcs, sizeof(arcs[0]), acount); assert(ret == 0); + memset(tmp_arcs, 'A', sizeof(tmp_arcs)); alen = RELATIVE_OID_get_arcs(&oid, tmp_arcs, sizeof(tmp_arcs[0]), tmp_alen); assert(alen >= 0); - assert(alen < tmp_alen); + assert(alen <= tmp_alen); + assert(alen == acount); - printf("Encoded {"); + printf("Encoded (R) {"); for(i = 0; i < alen; i++) { printf(" %lu", tmp_arcs[i]); assert((unsigned long)arcs[i] == tmp_arcs[i]); @@ -148,26 +152,28 @@ check_REGEN_OID(int *arcs, int acount) { int ret; int i; - printf("Encoding {"); + printf("Encoding (O) {"); for(i = 0; i < acount; i++) { printf(" %u", arcs[i]); } printf(" }\n"); - ret = OBJECT_IDENTIFIER_set_arcs_l(&oid, (unsigned long *)arcs, acount); + ret = OBJECT_IDENTIFIER_set_arcs(&oid, arcs, sizeof(arcs[0]), acount); assert(ret == 0); + memset(tmp_arcs, 'A', sizeof(tmp_arcs)); alen = OBJECT_IDENTIFIER_get_arcs(&oid, tmp_arcs, sizeof(tmp_arcs[0]), tmp_alen); assert(alen >= 0); - assert(alen < tmp_alen); + assert(alen <= tmp_alen); + assert(alen == acount); - printf("Encoded {"); + printf("Encoded (O) { "); for(i = 0; i < alen; i++) { - printf(" %lu", tmp_arcs[i]); + printf("%lu ", tmp_arcs[i]); fflush(stdout); assert((unsigned long)arcs[i] == tmp_arcs[i]); } - printf(" }\n"); + printf("}\n"); } static int @@ -224,6 +230,8 @@ check_speed() { int main() { + int i; + /* {joint-iso-itu-t 230 3} */ uint8_t buf1[] = { 0x06, /* OBJECT IDENTIFIER */ @@ -240,34 +248,75 @@ main() { }; int buf2_check[] = { 8571, 3, 2 }; - int buf3_check[] = { 0 }; - int buf4_check[] = { 1 }; - int buf5_check[] = { 80, 40 }; - int buf6_check[] = { 127 }; - int buf7_check[] = { 128 }; - int buf8_check[] = { 65535, 65536 }; - int buf9_check[] = { 100000, 0x20000, 1234, 256, 127, 128 }; - int buf10_check[] = { 0, 0xffffffff, 0xff00ff00, 0 }; - int buf11_check[] = { 0, 1, 2 }; - int buf12_check[] = { 1, 38, 3 }; - int buf13_check[] = { 0, 0, 0xf000 }; + /* {joint-iso-itu-t 42 } */ + uint8_t buf3[] = { + 0x06, /* OBJECT IDENTIFIER */ + 0x01, /* Length */ + 0x7A + }; + int buf3_check[] = { 2, 42 }; + + /* {joint-iso-itu-t 25957 } */ + uint8_t buf4[] = { + 0x06, /* OBJECT IDENTIFIER */ + 0x03, /* Length */ + 0x81, 0x80 + 0x4B, 0x35 + }; + int buf4_check[] = { 2, 25957 }; + + int buf5_check[] = { 0 }; + int buf6_check[] = { 1 }; + int buf7_check[] = { 80, 40 }; + int buf8_check[] = { 127 }; + int buf9_check[] = { 128 }; + int buf10_check[] = { 65535, 65536 }; + int buf11_check[] = { 100000, 0x20000, 1234, 256, 127, 128 }; + int buf12_check[] = { 0, 0xffffffff, 0xff00ff00, 0 }; + int buf13_check[] = { 0, 1, 2 }; + int buf14_check[] = { 1, 38, 3 }; + int buf15_check[] = { 0, 0, 0xf000 }; + int buf16_check[] = { 0, 0, 0, 1, 0 }; + int buf17_check[] = { 2, 0xffffffAf, 0xff00ff00, 0 }; CHECK_OID(1); /* buf1, buf1_check */ CHECK_ROID(2); /* buf2, buf2_check */ + CHECK_OID(3); /* buf3, buf3_check */ + CHECK_OID(4); /* buf4, buf4_check */ - CHECK_REGEN(3); /* Regenerate RELATIVE-OID */ - CHECK_REGEN(4); - CHECK_REGEN(5); + CHECK_REGEN(5); /* Regenerate RELATIVE-OID */ CHECK_REGEN(6); CHECK_REGEN(7); CHECK_REGEN(8); CHECK_REGEN(9); CHECK_REGEN(10); + CHECK_REGEN(11); + CHECK_REGEN(12); + CHECK_REGEN(13); + CHECK_REGEN(14); + CHECK_REGEN(15); + CHECK_REGEN(16); + CHECK_REGEN(17); CHECK_REGEN_OID(1); /* Regenerate OBJECT IDENTIFIER */ - CHECK_REGEN_OID(11); - CHECK_REGEN_OID(12); + CHECK_REGEN_OID(3); /* Regenerate OBJECT IDENTIFIER */ + CHECK_REGEN_OID(4); /* Regenerate OBJECT IDENTIFIER */ CHECK_REGEN_OID(13); + CHECK_REGEN_OID(14); + CHECK_REGEN_OID(15); + CHECK_REGEN_OID(16); + CHECK_REGEN_OID(17); + + for(i = 0; i < 100000; i++) { + int bufA_check[3] = { 2, i, rand() }; + int bufB_check[2] = { rand(), i * 121 }; + CHECK_REGEN(A); + CHECK_REGEN_OID(A); + CHECK_REGEN(B); + if(i > 100) i++; + if(i > 500) i++; + if(i > 1000) i += 3; + if(i > 5000) i += 151; + } if(getenv("CHECK_SPEED")) { /* Useful for developers only */ From a63e029d951a82f219ba9f3e8a6cf89cb9417c2a Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 17 Jun 2004 23:46:45 +0000 Subject: [PATCH 0034/1469] signedness fixed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@34 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OBJECT_IDENTIFIER.c | 2 +- skeletons/RELATIVE-OID.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index 5bb045ae1..c910a8cc8 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -548,7 +548,7 @@ OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, unsigned int ar arcs, arc_type_size, 0); } - assert((bp - buf) <= size); + assert((unsigned)(bp - buf) <= size); /* * Replace buffer. diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index b5c346a52..ab4c36671 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -100,8 +100,8 @@ int RELATIVE_OID_set_arcs(RELATIVE_OID_t *roid, void *arcs, unsigned int arc_type_size, unsigned int arcs_slots) { uint8_t *buf; uint8_t *bp; - int size; - int i; + unsigned int size; + unsigned int i; if(roid == NULL || arcs == NULL || arc_type_size < 1) { errno = EINVAL; @@ -126,7 +126,7 @@ RELATIVE_OID_set_arcs(RELATIVE_OID_t *roid, void *arcs, unsigned int arc_type_si arcs, arc_type_size, 0); } - assert((bp - buf) <= size); + assert((unsigned)(bp - buf) <= size); /* * Replace buffer. From d315be55669cfeb1c6de071bffd26eae669ae7ac Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 18 Jun 2004 00:03:54 +0000 Subject: [PATCH 0035/1469] better comment git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@35 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 15631bea9..55d97bab0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,10 @@ -0.8.12: 2004-Jun-14 +0.8.12: 2004-Jun-17 - * RELATIVE-OID and OBJECT IDENTIFIER decoders are not bound - anymore to an integer type of specific size (unsigned long). + * RELATIVE-OID and OBJECT IDENTIFIER encoders/decoders are not bound + anymore to an integer type of specific size (unsigned long). The + size of an integer must be provided explicitly. + See {OBJECT_IDENTIFIER|RELATIVE_OID}_{get|set}_arcs(). * SEQUENCE BER decoder fixed again for complex CHOICE case (Test case 44) (Severity: medium, Security impact: low). From 3df796640acc97d4bb312b089d93079d8290fc5d Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Jun 2004 21:13:22 +0000 Subject: [PATCH 0036/1469] removed -N command-line argument git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@36 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/07-int-OK.asn1.-EF | 20 ++ tests/16-constraint-OK.asn1.-EF | 20 ++ tests/20-constr-OK.asn1.-EF | 24 ++ tests/21-tags-OK.asn1.-EF | 26 ++ tests/22-tags-OK.asn1.-EF | 17 + tests/23-bits-OK.asn1.-EF | 20 ++ tests/24-sequence-OK.asn1.-EF | 15 + tests/34-class-OK.asn1.-EF | 36 +++ tests/39-sequence-of-OK.asn1.-P | 6 +- tests/42-real-life-OK.asn1.-EF | 45 +++ tests/42-real-life-OK.asn1.-PR | 18 +- tests/44-choice-in-sequence-OK.asn1.-P | 293 ++++++++++++++++++ tests/45-undefined-type-SE.asn1 | 16 + ...ype-SE.asn1.-EFfknown-extern-type=KnownExt | 10 + tests/46-redefine-OK.asn1 | 22 ++ tests/46-redefine-OK.asn1.-PR | 254 +++++++++++++++ 16 files changed, 830 insertions(+), 12 deletions(-) create mode 100644 tests/07-int-OK.asn1.-EF create mode 100644 tests/16-constraint-OK.asn1.-EF create mode 100644 tests/20-constr-OK.asn1.-EF create mode 100644 tests/21-tags-OK.asn1.-EF create mode 100644 tests/22-tags-OK.asn1.-EF create mode 100644 tests/23-bits-OK.asn1.-EF create mode 100644 tests/24-sequence-OK.asn1.-EF create mode 100644 tests/34-class-OK.asn1.-EF create mode 100644 tests/42-real-life-OK.asn1.-EF create mode 100644 tests/44-choice-in-sequence-OK.asn1.-P create mode 100644 tests/45-undefined-type-SE.asn1 create mode 100644 tests/45-undefined-type-SE.asn1.-EFfknown-extern-type=KnownExt create mode 100644 tests/46-redefine-OK.asn1 create mode 100644 tests/46-redefine-OK.asn1.-PR diff --git a/tests/07-int-OK.asn1.-EF b/tests/07-int-OK.asn1.-EF new file mode 100644 index 000000000..b3d6a0c32 --- /dev/null +++ b/tests/07-int-OK.asn1.-EF @@ -0,0 +1,20 @@ + +ModuleTestInt1 {iso(-1) org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 7 } +DEFINITIONS ::= +BEGIN + +int123456 INTEGER ::= 123456 + +Interval ::= INTEGER (1..123456) + +SameInterval ::= INTEGER + +Reason ::= INTEGER { + no-reason(0), + negative-reason(-10), + some-large-value(1324324) +} + +END diff --git a/tests/16-constraint-OK.asn1.-EF b/tests/16-constraint-OK.asn1.-EF new file mode 100644 index 000000000..e039e0971 --- /dev/null +++ b/tests/16-constraint-OK.asn1.-EF @@ -0,0 +1,20 @@ + +ModuleTestConstraint {iso(-1) org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 16 } +DEFINITIONS ::= +BEGIN + +Type1 ::= IA5String (SIZE (1..10,...))(FROM ("a".."z"|"#")) + +Type2 ::= IA5String (SIZE (MIN..4)|FROM ("abc")) + +Type3 ::= BMPString (SIZE (1)) + +Type4 ::= INTEGER (1..MAX) + +Type5 ::= BOOLEAN (TRUE|FALSE) + +v1 Type1 ::= "#value with ""double quotes""" + +END diff --git a/tests/20-constr-OK.asn1.-EF b/tests/20-constr-OK.asn1.-EF new file mode 100644 index 000000000..bf4e39604 --- /dev/null +++ b/tests/20-constr-OK.asn1.-EF @@ -0,0 +1,24 @@ + +ModuleTestConstr {iso(-1) org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 20 } +DEFINITIONS IMPLICIT TAGS EXTENSIBILITY IMPLIED ::= +BEGIN + +ConstructedType1 ::= SEQUENCE { + a [1] IMPLICIT INTEGER, + b [2] IMPLICIT INTEGER, + d UTF8String, + ...!ex1, + c IA5String +} + +ConstructedType2 ::= SET { + a [1] IMPLICIT INTEGER, + b [2] IMPLICIT INTEGER, + ... +} + +ex1 INTEGER ::= 1 + +END diff --git a/tests/21-tags-OK.asn1.-EF b/tests/21-tags-OK.asn1.-EF new file mode 100644 index 000000000..bf468d40e --- /dev/null +++ b/tests/21-tags-OK.asn1.-EF @@ -0,0 +1,26 @@ + +ModuleTestTags1 {iso(-1) org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 21 1 } +DEFINITIONS EXPLICIT TAGS ::= +BEGIN + +T1 ::= CHOICE { + first [0] EXPLICIT INTEGER, + second [1] EXPLICIT INTEGER +} + +END + +ModuleTestTags2 {iso(-1) org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 21 2 } +DEFINITIONS IMPLICIT TAGS ::= +BEGIN + +T2 ::= SEQUENCE { + one [0] EXPLICIT T1, + two [1] IMPLICIT IA5String +} + +END diff --git a/tests/22-tags-OK.asn1.-EF b/tests/22-tags-OK.asn1.-EF new file mode 100644 index 000000000..3edad655b --- /dev/null +++ b/tests/22-tags-OK.asn1.-EF @@ -0,0 +1,17 @@ + +ModuleTestTags3 {iso(-1) org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 22 } +DEFINITIONS AUTOMATIC TAGS ::= +BEGIN + +T1 ::= SEQUENCE { + a [0] IMPLICIT INTEGER, + b [1] EXPLICIT CHOICE { + i [0] IMPLICIT INTEGER, + n [1] IMPLICIT IA5String + }, + c [2] IMPLICIT UTF8String +} + +END diff --git a/tests/23-bits-OK.asn1.-EF b/tests/23-bits-OK.asn1.-EF new file mode 100644 index 000000000..a3e15a5a9 --- /dev/null +++ b/tests/23-bits-OK.asn1.-EF @@ -0,0 +1,20 @@ + +ModuleTestBitString {iso(-1) org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 23 } +DEFINITIONS AUTOMATIC TAGS ::= +BEGIN + +v28 INTEGER ::= 28 + +BS1 ::= BIT STRING { + first(0), + third(2), + twenty-eight(28) +} + +one-zero-one BS1 ::= '101'B + +one0one BS1 ::= '101'B + +END diff --git a/tests/24-sequence-OK.asn1.-EF b/tests/24-sequence-OK.asn1.-EF new file mode 100644 index 000000000..d1380d2c9 --- /dev/null +++ b/tests/24-sequence-OK.asn1.-EF @@ -0,0 +1,15 @@ + +ModuleTestSequence {iso(-1) org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 24 } +DEFINITIONS IMPLICIT TAGS ::= +BEGIN + +T ::= [5] EXPLICIT SEQUENCE { + a INTEGER, + b [0] IMPLICIT INTEGER OPTIONAL, + c [1] IMPLICIT INTEGER DEFAULT , + d [5] EXPLICIT INTEGER +} + +END diff --git a/tests/34-class-OK.asn1.-EF b/tests/34-class-OK.asn1.-EF new file mode 100644 index 000000000..e9f76b592 --- /dev/null +++ b/tests/34-class-OK.asn1.-EF @@ -0,0 +1,36 @@ + +ModuleTestClassSimple {iso(-1) org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 34 } +DEFINITIONS IMPLICIT TAGS ::= +BEGIN + +EXTENSION ::= CLASS { + &id OBJECT IDENTIFIER UNIQUE, + &ExtnType +} WITH SYNTAX { + SYNTAX &ExtnType + IDENTIFIED BY &id + } + + +Ext1 ::= SEQUENCE { + extnId EXTENSION.&id +} + +EXTENSION-ATTRIBUTE ::= CLASS { + &id INTEGER (0..256) UNIQUE, + &Type +} WITH SYNTAX {&Type IDENTIFIED BY &id} + + +terminal-type EXTENSION-ATTRIBUTE ::= { TerminalType IDENTIFIED BY 23} + +ExtensionAttribute ::= SEQUENCE { + extension-attribute-type [0] IMPLICIT EXTENSION-ATTRIBUTE.&id ({ExtensionAttributeTable}), + extension-attribute-value [1] IMPLICIT EXTENSION-ATTRIBUTE.&Type ({ExtensionAttributeTable}{@extension-attribute-type}) +} + +ub-extension-attributes INTEGER ::= 256 + +END diff --git a/tests/39-sequence-of-OK.asn1.-P b/tests/39-sequence-of-OK.asn1.-P index d073e49f2..7536fcaef 100644 --- a/tests/39-sequence-of-OK.asn1.-P +++ b/tests/39-sequence-of-OK.asn1.-P @@ -54,7 +54,7 @@ typedef struct T { asn1_DEF_collection_tags, sizeof(asn1_DEF_collection_tags) /sizeof(asn1_DEF_collection_tags[0]), - 0, /* Tags to skip */ + 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_collection_specs /* Additional specs */ }; @@ -103,7 +103,7 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { asn1_DEF_T_tags, sizeof(asn1_DEF_T_tags) /sizeof(asn1_DEF_T_tags[0]), - 0, /* Tags to skip */ + 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_T_specs /* Additional specs */ }; @@ -176,7 +176,7 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { asn1_DEF_T2_tags, sizeof(asn1_DEF_T2_tags) /sizeof(asn1_DEF_T2_tags[0]), - 0, /* Tags to skip */ + 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_T2_specs /* Additional specs */ }; diff --git a/tests/42-real-life-OK.asn1.-EF b/tests/42-real-life-OK.asn1.-EF new file mode 100644 index 000000000..7b3a89da0 --- /dev/null +++ b/tests/42-real-life-OK.asn1.-EF @@ -0,0 +1,45 @@ + +ModuleLAPStorage {iso(-1) org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 42 } +DEFINITIONS EXTENSIBILITY IMPLIED ::= +BEGIN + +LogLine ::= SEQUENCE { + line-digest IA5String, + varsets SEQUENCE OF VariablePartSet, + ... +} + +VariablePartSet ::= SEQUENCE { + vparts SEQUENCE OF VariablePart, + resolution ActionItem, + ... +} + +VariablePart ::= CHOICE { + vset SET OF VisibleString, + vrange SEQUENCE { + from VisibleString, + to VisibleString, + ... + }, + ... +} + +ActionItem ::= SEQUENCE { + accept-as ENUMERATED { + unknown(0), + safe(1), + unsafe(2), + ... + }, + notify SEQUENCE { + critical BOOLEAN, + email SET OF VisibleString, + ... + } OPTIONAL, + ... +} + +END diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index 0cf1be943..990e2c2e9 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -58,7 +58,7 @@ typedef struct LogLine { asn1_DEF_varsets_tags, sizeof(asn1_DEF_varsets_tags) /sizeof(asn1_DEF_varsets_tags[0]), - 0, /* Tags to skip */ + 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_varsets_specs /* Additional specs */ }; @@ -107,7 +107,7 @@ asn1_TYPE_descriptor_t asn1_DEF_LogLine = { asn1_DEF_LogLine_tags, sizeof(asn1_DEF_LogLine_tags) /sizeof(asn1_DEF_LogLine_tags[0]), - 0, /* Tags to skip */ + 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_LogLine_specs /* Additional specs */ }; @@ -172,7 +172,7 @@ typedef struct VariablePartSet { asn1_DEF_vparts_tags, sizeof(asn1_DEF_vparts_tags) /sizeof(asn1_DEF_vparts_tags[0]), - 0, /* Tags to skip */ + 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_vparts_specs /* Additional specs */ }; @@ -221,7 +221,7 @@ asn1_TYPE_descriptor_t asn1_DEF_VariablePartSet = { asn1_DEF_VariablePartSet_tags, sizeof(asn1_DEF_VariablePartSet_tags) /sizeof(asn1_DEF_VariablePartSet_tags[0]), - 0, /* Tags to skip */ + 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_VariablePartSet_specs /* Additional specs */ }; @@ -306,7 +306,7 @@ typedef struct VariablePart { asn1_DEF_vset_tags, sizeof(asn1_DEF_vset_tags) /sizeof(asn1_DEF_vset_tags[0]), - 0, /* Tags to skip */ + 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_vset_specs /* Additional specs */ }; @@ -355,7 +355,7 @@ typedef struct VariablePart { asn1_DEF_vrange_tags, sizeof(asn1_DEF_vrange_tags) /sizeof(asn1_DEF_vrange_tags[0]), - 0, /* Tags to skip */ + 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_vrange_specs /* Additional specs */ }; @@ -494,7 +494,7 @@ typedef struct ActionItem { asn1_DEF_email_tags, sizeof(asn1_DEF_email_tags) /sizeof(asn1_DEF_email_tags[0]), - 0, /* Tags to skip */ + 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_email_specs /* Additional specs */ }; @@ -543,7 +543,7 @@ typedef struct ActionItem { asn1_DEF_notify_tags, sizeof(asn1_DEF_notify_tags) /sizeof(asn1_DEF_notify_tags[0]), - 0, /* Tags to skip */ + 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_notify_specs /* Additional specs */ }; @@ -592,7 +592,7 @@ asn1_TYPE_descriptor_t asn1_DEF_ActionItem = { asn1_DEF_ActionItem_tags, sizeof(asn1_DEF_ActionItem_tags) /sizeof(asn1_DEF_ActionItem_tags[0]), - 0, /* Tags to skip */ + 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_ActionItem_specs /* Additional specs */ }; diff --git a/tests/44-choice-in-sequence-OK.asn1.-P b/tests/44-choice-in-sequence-OK.asn1.-P new file mode 100644 index 000000000..6cab701cf --- /dev/null +++ b/tests/44-choice-in-sequence-OK.asn1.-P @@ -0,0 +1,293 @@ + +/*** <<< DEPS [T] >>> ***/ + +/* Dependencies for T */ +#include + +/* Dependencies for b */ +#include +#include + +/* Dependencies for e */ +#include +#include + +/* Dependencies for h */ +#include +#include + +#include + +extern asn1_TYPE_descriptor_t asn1_DEF_T; + +/*** <<< TYPE-DECLS [T] >>> ***/ + + +typedef struct T { + NULL_t a; + struct b { + enum { + b_PR_NOTHING, /* No components present */ + b_PR_c, + b_PR_d, + b_PR_e, + b_PR_h, + } present; + union { + NULL_t c; + NULL_t d; + struct e { + enum { + e_PR_NOTHING, /* No components present */ + e_PR_f, + e_PR_g, + } present; + union { + NULL_t f; + NULL_t g; + } choice; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; + } e; + struct h { + enum { + h_PR_NOTHING, /* No components present */ + h_PR_i, + h_PR_j, + } present; + union { + NULL_t i; + NULL_t j; + } choice; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; + } h; + } choice; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; + } b; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} T_t; + +/*** <<< STAT-DEFS [T] >>> ***/ + + #include + + static asn1_CHOICE_element_t asn1_DEF_e_elements[] = { + { offsetof(struct e, choice.f), 0, + (ASN_TAG_CLASS_PRIVATE | (7 << 2)), + -1, /* IMPLICIT tag at current level */ + (void *)&asn1_DEF_NULL, + "f" + }, + { offsetof(struct e, choice.g), 0, + (ASN_TAG_CLASS_PRIVATE | (8 << 2)), + -1, /* IMPLICIT tag at current level */ + (void *)&asn1_DEF_NULL, + "g" + }, + }; + static ber_tlv_tag_t asn1_DEF_e_tags[] = { + }; + static asn1_TYPE_tag2member_t asn1_DEF_e_tag2el[] = { + { (ASN_TAG_CLASS_PRIVATE | (7 << 2)), 0, 0, 0 }, /* f at 20 */ + { (ASN_TAG_CLASS_PRIVATE | (8 << 2)), 1, 0, 0 }, /* g at 21 */ + }; + static asn1_CHOICE_specifics_t asn1_DEF_e_specs = { + sizeof(struct e), + offsetof(struct e, _ber_dec_ctx), + offsetof(struct e, present), + sizeof(((struct e *)0)->present), + asn1_DEF_e_elements, + 2, /* Elements count */ + asn1_DEF_e_tag2el, + 2, /* Count of tags in the map */ + 0 /* Whether extensible */ + }; + asn1_TYPE_descriptor_t asn1_DEF_e = { + "e", + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_print, + CHOICE_free, + CHOICE_outmost_tag, + asn1_DEF_e_tags, + sizeof(asn1_DEF_e_tags) + /sizeof(asn1_DEF_e_tags[0]), + 0, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + &asn1_DEF_e_specs /* Additional specs */ + }; + + #include + + static asn1_CHOICE_element_t asn1_DEF_h_elements[] = { + { offsetof(struct h, choice.i), 0, + (ASN_TAG_CLASS_PRIVATE | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + (void *)&asn1_DEF_NULL, + "i" + }, + { offsetof(struct h, choice.j), 0, + (ASN_TAG_CLASS_PRIVATE | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + (void *)&asn1_DEF_NULL, + "j" + }, + }; + static ber_tlv_tag_t asn1_DEF_h_tags[] = { + }; + static asn1_TYPE_tag2member_t asn1_DEF_h_tag2el[] = { + { (ASN_TAG_CLASS_PRIVATE | (1 << 2)), 0, 0, 0 }, /* i at 24 */ + { (ASN_TAG_CLASS_PRIVATE | (2 << 2)), 1, 0, 0 }, /* j at 25 */ + }; + static asn1_CHOICE_specifics_t asn1_DEF_h_specs = { + sizeof(struct h), + offsetof(struct h, _ber_dec_ctx), + offsetof(struct h, present), + sizeof(((struct h *)0)->present), + asn1_DEF_h_elements, + 2, /* Elements count */ + asn1_DEF_h_tag2el, + 2, /* Count of tags in the map */ + 0 /* Whether extensible */ + }; + asn1_TYPE_descriptor_t asn1_DEF_h = { + "h", + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_print, + CHOICE_free, + CHOICE_outmost_tag, + asn1_DEF_h_tags, + sizeof(asn1_DEF_h_tags) + /sizeof(asn1_DEF_h_tags[0]), + 0, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + &asn1_DEF_h_specs /* Additional specs */ + }; + + #include + + static asn1_CHOICE_element_t asn1_DEF_b_elements[] = { + { offsetof(struct b, choice.c), 0, + (ASN_TAG_CLASS_PRIVATE | (5 << 2)), + -1, /* IMPLICIT tag at current level */ + (void *)&asn1_DEF_NULL, + "c" + }, + { offsetof(struct b, choice.d), 0, + (ASN_TAG_CLASS_PRIVATE | (6 << 2)), + -1, /* IMPLICIT tag at current level */ + (void *)&asn1_DEF_NULL, + "d" + }, + { offsetof(struct b, choice.e), 0, + -1 /* Ambiguous tag (CHOICE?) */, + 0, + (void *)&asn1_DEF_e, + "e" + }, + { offsetof(struct b, choice.h), 0, + (ASN_TAG_CLASS_PRIVATE | (9 << 2)), + +1, /* EXPLICIT tag at current level */ + (void *)&asn1_DEF_h, + "h" + }, + }; + static ber_tlv_tag_t asn1_DEF_b_tags[] = { + }; + static asn1_TYPE_tag2member_t asn1_DEF_b_tag2el[] = { + { (ASN_TAG_CLASS_PRIVATE | (5 << 2)), 0, 0, 0 }, /* c at 17 */ + { (ASN_TAG_CLASS_PRIVATE | (6 << 2)), 1, 0, 0 }, /* d at 18 */ + { (ASN_TAG_CLASS_PRIVATE | (7 << 2)), 2, 0, 0 }, /* f at 20 */ + { (ASN_TAG_CLASS_PRIVATE | (8 << 2)), 2, 0, 0 }, /* g at 21 */ + { (ASN_TAG_CLASS_PRIVATE | (9 << 2)), 3, 0, 0 }, /* h at 24 */ + }; + static asn1_CHOICE_specifics_t asn1_DEF_b_specs = { + sizeof(struct b), + offsetof(struct b, _ber_dec_ctx), + offsetof(struct b, present), + sizeof(((struct b *)0)->present), + asn1_DEF_b_elements, + 4, /* Elements count */ + asn1_DEF_b_tag2el, + 5, /* Count of tags in the map */ + 0 /* Whether extensible */ + }; + asn1_TYPE_descriptor_t asn1_DEF_b = { + "b", + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_print, + CHOICE_free, + CHOICE_outmost_tag, + asn1_DEF_b_tags, + sizeof(asn1_DEF_b_tags) + /sizeof(asn1_DEF_b_tags[0]), + 0, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + &asn1_DEF_b_specs /* Additional specs */ + }; + +#include + +static asn1_SEQUENCE_element_t asn1_DEF_T_elements[] = { + { offsetof(struct T, a), 0, + (ASN_TAG_CLASS_PRIVATE | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + (void *)&asn1_DEF_NULL, + "a" + }, + { offsetof(struct T, b), 0, + -1 /* Ambiguous tag (CHOICE?) */, + 0, + (void *)&asn1_DEF_b, + "b" + }, +}; +static ber_tlv_tag_t asn1_DEF_T_tags[] = { + (ASN_TAG_CLASS_PRIVATE | (1 << 2)) +}; +static asn1_TYPE_tag2member_t asn1_DEF_T_tag2el[] = { + { (ASN_TAG_CLASS_PRIVATE | (2 << 2)), 0, 0, 0 }, /* a at 15 */ + { (ASN_TAG_CLASS_PRIVATE | (5 << 2)), 1, 0, 0 }, /* c at 17 */ + { (ASN_TAG_CLASS_PRIVATE | (6 << 2)), 1, 0, 0 }, /* d at 18 */ + { (ASN_TAG_CLASS_PRIVATE | (7 << 2)), 1, 0, 0 }, /* f at 20 */ + { (ASN_TAG_CLASS_PRIVATE | (8 << 2)), 1, 0, 0 }, /* g at 21 */ + { (ASN_TAG_CLASS_PRIVATE | (9 << 2)), 1, 0, 0 }, /* h at 24 */ +}; +static asn1_SEQUENCE_specifics_t asn1_DEF_T_specs = { + sizeof(struct T), + offsetof(struct T, _ber_dec_ctx), + asn1_DEF_T_elements, + 2, /* Elements count */ + asn1_DEF_T_tag2el, + 6, /* Count of tags in the map */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn1_TYPE_descriptor_t asn1_DEF_T = { + "T", + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_print, + SEQUENCE_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T_tags, + sizeof(asn1_DEF_T_tags) + /sizeof(asn1_DEF_T_tags[0]), + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + &asn1_DEF_T_specs /* Additional specs */ +}; + diff --git a/tests/45-undefined-type-SE.asn1 b/tests/45-undefined-type-SE.asn1 new file mode 100644 index 000000000..0450e877d --- /dev/null +++ b/tests/45-undefined-type-SE.asn1 @@ -0,0 +1,16 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .45 + +ModuleKnownExternType + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 45 } + DEFINITIONS ::= +BEGIN + + Type ::= KnownExt -- KnownExt is known to be external. + +END diff --git a/tests/45-undefined-type-SE.asn1.-EFfknown-extern-type=KnownExt b/tests/45-undefined-type-SE.asn1.-EFfknown-extern-type=KnownExt new file mode 100644 index 000000000..423b32b79 --- /dev/null +++ b/tests/45-undefined-type-SE.asn1.-EFfknown-extern-type=KnownExt @@ -0,0 +1,10 @@ + +ModuleKnownExternType {iso(-1) org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 45 } +DEFINITIONS ::= +BEGIN + +Type ::= KnownExt + +END diff --git a/tests/46-redefine-OK.asn1 b/tests/46-redefine-OK.asn1 new file mode 100644 index 000000000..7890363ca --- /dev/null +++ b/tests/46-redefine-OK.asn1 @@ -0,0 +1,22 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .46 + +ModuleChoiceInSequence + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 46 } + DEFINITIONS IMPLICIT TAGS ::= +BEGIN + + PrimitiveType ::= OCTET STRING + + ConstructedType ::= SEQUENCE { + field [5] PrimitiveType + } + + T ::= [3] ConstructedType + +END diff --git a/tests/46-redefine-OK.asn1.-PR b/tests/46-redefine-OK.asn1.-PR new file mode 100644 index 000000000..2fc1e4dd3 --- /dev/null +++ b/tests/46-redefine-OK.asn1.-PR @@ -0,0 +1,254 @@ + +/*** <<< DEPS [PrimitiveType] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [PrimitiveType] >>> ***/ + + +typedef OCTET_STRING_t PrimitiveType_t; + + +/*** <<< FUNC-DECLS [PrimitiveType] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_PrimitiveType; +asn_constr_check_f PrimitiveType_constraint; +ber_type_decoder_f PrimitiveType_decode_ber; +der_type_encoder_f PrimitiveType_encode_der; +asn_struct_print_f PrimitiveType_print; +asn_struct_free_f PrimitiveType_free; + +/*** <<< STAT-DEFS [PrimitiveType] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_PrimitiveType_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_PrimitiveType = { + "PrimitiveType", + PrimitiveType_constraint, + PrimitiveType_decode_ber, + PrimitiveType_encode_der, + PrimitiveType_print, + PrimitiveType_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_PrimitiveType_tags, + sizeof(asn1_DEF_PrimitiveType_tags) + /sizeof(asn1_DEF_PrimitiveType_tags[0]), + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0 /* No specifics */ +}; + +int +PrimitiveType_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_OCTET_STRING.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using OCTET_STRING, + * so adjust the DEF appropriately. + */ +static void +inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_OCTET_STRING.ber_decoder; + td->der_encoder = asn1_DEF_OCTET_STRING.der_encoder; + td->free_struct = asn1_DEF_OCTET_STRING.free_struct; + td->print_struct = asn1_DEF_OCTET_STRING.print_struct; + td->last_tag_form = asn1_DEF_OCTET_STRING.last_tag_form; + td->specifics = asn1_DEF_OCTET_STRING.specifics; +} + +ber_dec_rval_t +PrimitiveType_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +PrimitiveType_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +PrimitiveType_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +PrimitiveType_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< DEPS [ConstructedType] >>> ***/ + +/* Dependencies for ConstructedType */ +#include + +#include + +extern asn1_TYPE_descriptor_t asn1_DEF_ConstructedType; + +/*** <<< TYPE-DECLS [ConstructedType] >>> ***/ + + +typedef struct ConstructedType { + PrimitiveType_t field; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} ConstructedType_t; + +/*** <<< STAT-DEFS [ConstructedType] >>> ***/ + +#include + +static asn1_SEQUENCE_element_t asn1_DEF_ConstructedType_elements[] = { + { offsetof(struct ConstructedType, field), 0, + (ASN_TAG_CLASS_CONTEXT | (5 << 2)), + -1, /* IMPLICIT tag at current level */ + (void *)&asn1_DEF_PrimitiveType, + "field" + }, +}; +static ber_tlv_tag_t asn1_DEF_ConstructedType_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_TYPE_tag2member_t asn1_DEF_ConstructedType_tag2el[] = { + { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 0, 0, 0 }, /* field at 18 */ +}; +static asn1_SEQUENCE_specifics_t asn1_DEF_ConstructedType_specs = { + sizeof(struct ConstructedType), + offsetof(struct ConstructedType, _ber_dec_ctx), + asn1_DEF_ConstructedType_elements, + 1, /* Elements count */ + asn1_DEF_ConstructedType_tag2el, + 1, /* Count of tags in the map */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn1_TYPE_descriptor_t asn1_DEF_ConstructedType = { + "ConstructedType", + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_print, + SEQUENCE_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_ConstructedType_tags, + sizeof(asn1_DEF_ConstructedType_tags) + /sizeof(asn1_DEF_ConstructedType_tags[0]), + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + &asn1_DEF_ConstructedType_specs /* Additional specs */ +}; + + +/*** <<< DEPS [T] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [T] >>> ***/ + + +typedef ConstructedType_t T_t; + + +/*** <<< FUNC-DECLS [T] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_T; +asn_constr_check_f T_constraint; +ber_type_decoder_f T_decode_ber; +der_type_encoder_f T_encode_der; +asn_struct_print_f T_print; +asn_struct_free_f T_free; + +/*** <<< STAT-DEFS [T] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_T_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (3 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_T = { + "T", + T_constraint, + T_decode_ber, + T_encode_der, + T_print, + T_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T_tags, + sizeof(asn1_DEF_T_tags) + /sizeof(asn1_DEF_T_tags[0]), + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0 /* No specifics */ +}; + +int +T_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_ConstructedType.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using ConstructedType, + * so adjust the DEF appropriately. + */ +static void +inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_ConstructedType.ber_decoder; + td->der_encoder = asn1_DEF_ConstructedType.der_encoder; + td->free_struct = asn1_DEF_ConstructedType.free_struct; + td->print_struct = asn1_DEF_ConstructedType.print_struct; + td->last_tag_form = asn1_DEF_ConstructedType.last_tag_form; + td->specifics = asn1_DEF_ConstructedType.specifics; +} + +ber_dec_rval_t +T_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +T_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +T_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +T_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + From 4a3f582a824f556eb476ac6e10eea1c796b5d024 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Jun 2004 21:13:46 +0000 Subject: [PATCH 0037/1469] fixes git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@37 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 157 +++++++++++++------------------ libasn1compiler/asn1c_internal.h | 6 ++ 2 files changed, 69 insertions(+), 94 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 4643ae2d1..bf66fe4c2 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -22,6 +22,7 @@ static int asn1c_lang_C_type_SET_def(arg_t *arg); static int asn1c_lang_C_type_CHOICE_def(arg_t *arg); static int asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of); static int _print_tag(arg_t *arg, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag_p); +static int emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int*tags_impl_skip); static int emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count); static int emit_constraint_checking_code(arg_t *arg); static int emit_single_constraint_check(arg_t *arg, asn1p_constraint_t *ct, int mode); @@ -245,34 +246,17 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { }); OUT("};\n"); - p = MKID(expr->Identifier); - OUT("static ber_tlv_tag_t asn1_DEF_%s_tags[] = {\n", p); - INDENTED( - if(expr->tag.tag_class) { - _print_tag(arg, expr, &expr->tag); - if(expr->tag.tag_mode != TM_EXPLICIT) - tags_impl_skip++; - } - if(!expr->tag.tag_class - || (expr->meta_type == AMT_TYPE - && expr->tag.tag_mode == TM_EXPLICIT)) { - struct asn1p_type_tag_s tag; - if(expr->tag.tag_class) - OUT(",\n"); - tag.tag_class = TC_UNIVERSAL; - tag.tag_mode = TM_IMPLICIT; - tag.tag_value = expr_type2uclass_value[expr->expr_type]; - _print_tag(arg, expr, &tag); - } - OUT("\n"); - ); - OUT("};\n"); + /* + * Print out asn1_DEF__tags[] vector. + */ + emit_tags_vector(arg, expr, &tags_impl_skip); /* * Tags to elements map. */ emit_tag2member_map(arg, tag2el, tag2el_count); + p = MKID(expr->Identifier); OUT("static asn1_SEQUENCE_specifics_t asn1_DEF_%s_specs = {\n", p); INDENTED( OUT("sizeof(struct %s),\n", p); @@ -306,6 +290,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { OUT("};\n"); OUT("\n"); + p = MKID(expr->Identifier); REDIR(OT_DEPS); OUT("#include \n"); OUT("\n"); @@ -483,28 +468,10 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { }); OUT("};\n"); - p = MKID(expr->Identifier); - OUT("static ber_tlv_tag_t asn1_DEF_%s_tags[] = {\n", p); - INDENTED( - if(expr->tag.tag_class) { - _print_tag(arg, expr, &expr->tag); - if(expr->tag.tag_mode != TM_EXPLICIT) - tags_impl_skip++; - } - if(!expr->tag.tag_class - || (expr->meta_type == AMT_TYPE - && expr->tag.tag_mode == TM_EXPLICIT)) { - struct asn1p_type_tag_s tag; - if(expr->tag.tag_class) - OUT(",\n"); - tag.tag_class = TC_UNIVERSAL; - tag.tag_mode = TM_IMPLICIT; - tag.tag_value = expr_type2uclass_value[expr->expr_type]; - _print_tag(arg, expr, &tag); - } - OUT("\n"); - ); - OUT("};\n"); + /* + * Print out asn1_DEF__tags[] vector. + */ + emit_tags_vector(arg, expr, &tags_impl_skip); /* * Tags to elements map. @@ -514,6 +481,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { /* * Emit a map of mandatory elements. */ + p = MKID(expr->Identifier); OUT("static uint8_t asn1_DEF_%s_mmap", p); OUT("[(%d + (8 * sizeof(unsigned int)) - 1) / 8]", elements); OUT(" = {\n", p); @@ -651,29 +619,12 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { ); OUT("};\n"); - p = MKID(expr->Identifier); - OUT("static ber_tlv_tag_t asn1_DEF_%s_tags[] = {\n", p); - INDENTED( - if(expr->tag.tag_class) { - _print_tag(arg, expr, &expr->tag); - if(expr->tag.tag_mode != TM_EXPLICIT) - tags_impl_skip++; - } - if(!expr->tag.tag_class - || (expr->meta_type == AMT_TYPE - && expr->tag.tag_mode == TM_EXPLICIT)) { - struct asn1p_type_tag_s tag; - if(expr->tag.tag_class) - OUT(",\n"); - tag.tag_class = TC_UNIVERSAL; - tag.tag_mode = TM_IMPLICIT; - tag.tag_value = expr_type2uclass_value[expr->expr_type]; - _print_tag(arg, expr, &tag); - } - OUT("\n"); - ); - OUT("};\n"); + /* + * Print out asn1_DEF__tags[] vector. + */ + emit_tags_vector(arg, expr, &tags_impl_skip); + p = MKID(expr->Identifier); OUT("static asn1_SET_OF_specifics_t asn1_DEF_%s_specs = {\n", p); INDENTED( OUT("sizeof(struct %s),\n", p); @@ -977,29 +928,12 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { REDIR(OT_STAT_DEFS); - p = MKID(expr->Identifier); - OUT("static ber_tlv_tag_t asn1_DEF_%s_tags[] = {\n", p); - INDENTED( - if(expr->tag.tag_class) { - _print_tag(arg, expr, &expr->tag); - if(expr->tag.tag_mode != TM_EXPLICIT) - tags_impl_skip++; - } - if(!expr->tag.tag_class - || (expr->meta_type == AMT_TYPE - && expr->tag.tag_mode == TM_EXPLICIT)) { - struct asn1p_type_tag_s tag; - if(expr->tag.tag_class) - OUT(",\n"); - tag.tag_class = TC_UNIVERSAL; - tag.tag_mode = TM_IMPLICIT; - tag.tag_value = expr_type2uclass_value[expr->expr_type]; - _print_tag(arg, expr, &tag); - } - OUT("\n"); - ); - OUT("};\n"); + /* + * Print out asn1_DEF__tags[] vector. + */ + emit_tags_vector(arg, expr, &tags_impl_skip); + p = MKID(expr->Identifier); OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p); INDENTED( OUT("\"%s\",\n", expr->Identifier); @@ -1355,6 +1289,38 @@ emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count) { return 0;; } +static int +emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int *tags_impl_skip) { + char *p; + + p = MKID(expr->Identifier); + OUT("static ber_tlv_tag_t asn1_DEF_%s_tags[] = {\n", p); + INDENTED( + if(expr->tag.tag_class) { + _print_tag(arg, expr, &expr->tag); + if(expr->tag.tag_mode != TM_EXPLICIT) + (*tags_impl_skip)++; + } else { + (*tags_impl_skip)++; + } + if(!expr->tag.tag_class + || (expr->meta_type == AMT_TYPE + && expr->tag.tag_mode == TM_EXPLICIT)) { + struct asn1p_type_tag_s tag; + if(expr->tag.tag_class) + OUT(",\n"); + tag.tag_class = TC_UNIVERSAL; + tag.tag_mode = TM_IMPLICIT; + tag.tag_value = expr_type2uclass_value[expr->expr_type]; + _print_tag(arg, expr, &tag); + } + OUT("\n"); + ); + OUT("};\n"); + + return 0; +} + static int emit_constraint_checking_code(arg_t *arg) { asn1p_expr_t *expr = arg->expr; @@ -1722,7 +1688,7 @@ emit_alphabet_tables(arg_t *arg, asn1p_constraint_t *ct, int *table) { if(ch_start > ch_stop) { WARNING("Empty character range " "alphabet constraint at line %d", ct->_lineno); - OUT("#warning Empty character range " + OUT_NOINDENT("#warning Empty character range " "alphabet constraint at line %d\n", ct->_lineno); break; } @@ -1942,9 +1908,12 @@ emit_size_determination_code(arg_t *arg) { OUT("size = st->size;\n"); break; } else { - WARNING("Size operation is not defined for %s", - ASN_EXPR_TYPE2STR(etype)); - OUT("#warning Size operation not defined!\n"); + const char *type_name = ASN_EXPR_TYPE2STR(etype); + if(!type_name) type_name = arg->expr->Identifier; + WARNING("SIZE constraint is not defined for %s", + type_name); + OUT_NOINDENT("#warning SIZE constraint " + "not defined for %s!\n", type_name); OUT("size = st->size;\n"); } return -1; @@ -2024,6 +1993,6 @@ static asn1p_expr_type_e _find_terminal_type(arg_t *arg) { asn1p_expr_t *expr; expr = asn1f_find_terminal_type_ex(arg->asn, arg->mod, arg->expr, NULL); - assert(expr); - return expr->expr_type; + if(expr) return expr->expr_type; + return A1TC_INVALID; } diff --git a/libasn1compiler/asn1c_internal.h b/libasn1compiler/asn1c_internal.h index 91772cdcb..31bf69773 100644 --- a/libasn1compiler/asn1c_internal.h +++ b/libasn1compiler/asn1c_internal.h @@ -62,6 +62,12 @@ typedef struct arg_s { arg->embed--; \ } while(0) #define OUT(fmt, args...) asn1c_compiled_output(arg, fmt, ##args) +#define OUT_NOINDENT(fmt, args...) do { \ + int _saved_indent = arg->indent_level; \ + arg->indent_level = 0; \ + asn1c_compiled_output(arg, fmt, ##args);\ + arg->indent_level = _saved_indent; \ +} while(0) #define REDIR(foo) do { arg->target->target = foo; } while(0) From bacb731f2b22f8bfc1bc409fedf7497a08f94c8d Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Jun 2004 21:20:50 +0000 Subject: [PATCH 0038/1469] comparison with sign git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@38 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_expr_str.h | 4 ++-- libasn1parser/expr-h.pl | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/libasn1parser/asn1p_expr_str.h b/libasn1parser/asn1p_expr_str.h index 7d98a55c8..93567f88c 100644 --- a/libasn1parser/asn1p_expr_str.h +++ b/libasn1parser/asn1p_expr_str.h @@ -47,8 +47,8 @@ static char *asn1p_expr_type2str[] __attribute__ ((unused)) = { */ #define ASN_EXPR_TYPE2STR(type) \ ( \ - (((ssize_t)type) < 0 \ - || ((size_t)type) >= sizeof(asn1p_expr_type2str) \ + (((ssize_t)(type)) < 0 \ + || ((size_t)(type)) >= sizeof(asn1p_expr_type2str) \ / sizeof(asn1p_expr_type2str[0])) \ ? (char *)0 \ : asn1p_expr_type2str[(type)] \ diff --git a/libasn1parser/expr-h.pl b/libasn1parser/expr-h.pl index c00128a0a..64f68921d 100755 --- a/libasn1parser/expr-h.pl +++ b/libasn1parser/expr-h.pl @@ -36,13 +36,13 @@ /* * Convert the ASN.1 expression type back into the string representation. */ -#define ASN_EXPR_TYPE2STR(type) \\ - ( \\ - ((type) < 0 \\ - || (type) >= sizeof(asn1p_expr_type2str) \\ - / sizeof(asn1p_expr_type2str[0])) \\ - ? (char *)0 \\ - : asn1p_expr_type2str[(type)] \\ +#define ASN_EXPR_TYPE2STR(type) \\ + ( \\ + (((ssize_t)(type)) < 0 \\ + || ((size_t)(type)) >= sizeof(asn1p_expr_type2str) \\ + / sizeof(asn1p_expr_type2str[0])) \\ + ? (char *)0 \\ + : asn1p_expr_type2str[(type)] \\ ) #endif /* ASN1_PARSER_EXPR_STR_H */ From 2d62e8adaefb3fab68af48722993035c94054713 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Jun 2004 21:21:04 +0000 Subject: [PATCH 0039/1469] got rid of -N argument git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@39 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1print/asn1print.c | 3 --- libasn1print/asn1print.h | 1 - 2 files changed, 4 deletions(-) diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index 8e8049dc8..9c2fed70e 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -46,9 +46,6 @@ static int asn1print_module(asn1p_module_t *mod, enum asn1print_flags_e flags) { asn1p_expr_t *tc; - if(!(flags & APF_NO_SOURCE_COMMENTS)) - printf("\n-- Contents of \"%s\"\n", mod->source_file_name); - printf("\n%s ", mod->Identifier); if(mod->module_oid) { asn1print_oid(mod->module_oid, flags); diff --git a/libasn1print/asn1print.h b/libasn1print/asn1print.h index 73875fb1c..115e186cf 100644 --- a/libasn1print/asn1print.h +++ b/libasn1print/asn1print.h @@ -4,7 +4,6 @@ enum asn1print_flags_e { APF_NOFLAGS = 0x00, APF_LINE_COMMENTS = 0x01, - APF_NO_SOURCE_COMMENTS = 0x02, }; /* From d9cd3f921c09ffb95114fac680b35212863989bc Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Jun 2004 21:21:24 +0000 Subject: [PATCH 0040/1469] -fknown-extern-type support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@40 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix.h | 6 ++++ libasn1fix/asn1fix_dereft.c | 14 +++++++-- libasn1fix/asn1fix_internal.h | 4 +++ libasn1fix/asn1fix_misc.c | 58 ++++++++++++++++++++++++++++++++++- libasn1fix/asn1fix_misc.h | 5 +++ libasn1fix/asn1fix_retrieve.c | 16 +++++++--- 6 files changed, 95 insertions(+), 8 deletions(-) diff --git a/libasn1fix/asn1fix.h b/libasn1fix/asn1fix.h index 4847330a5..58ca537c5 100644 --- a/libasn1fix/asn1fix.h +++ b/libasn1fix/asn1fix.h @@ -27,4 +27,10 @@ int asn1f_process(asn1p_t *_asn, enum asn1f_flags, void (*error_log_callback)(int _severity, const char *fmt, ...)); + +/* + * Explicitly mark type as known. + */ +int asn1f_make_known_external_type(const char *); + #endif /* ASN1FIX_H */ diff --git a/libasn1fix/asn1fix_dereft.c b/libasn1fix/asn1fix_dereft.c index f0ec9a6ce..1f9b5bf4f 100644 --- a/libasn1fix/asn1fix_dereft.c +++ b/libasn1fix/asn1fix_dereft.c @@ -28,9 +28,19 @@ asn1f_fix_dereference_types(arg_t *arg) { */ type_expr = asn1f_find_terminal_type(arg, expr, 0); if(type_expr == NULL) { + const char *type_name; + + if(errno == EEXIST) { + /* Ignore missing type + * if known to be defined externally: + * -fknown-extern-type= + */ + return 0; + } + + type_name = asn1f_printable_reference(expr->reference); FATAL("Unknown type \"%s\" referenced by \"%s\" at line %d", - asn1f_printable_reference(expr->reference), - expr->Identifier, expr->_lineno); + type_name, expr->Identifier, expr->_lineno); return -1; } diff --git a/libasn1fix/asn1fix_internal.h b/libasn1fix/asn1fix_internal.h index ff3b4e96d..ac543cbb5 100644 --- a/libasn1fix/asn1fix_internal.h +++ b/libasn1fix/asn1fix_internal.h @@ -1,6 +1,10 @@ #ifndef _ASN1FIX_INTERNAL_H_ #define _ASN1FIX_INTERNAL_H_ +#ifdef HAVE_CONFIG_H +#include +#endif + /* * System headers required in various modules. */ diff --git a/libasn1fix/asn1fix_misc.c b/libasn1fix/asn1fix_misc.c index a9a5378b8..4ea94950a 100644 --- a/libasn1fix/asn1fix_misc.c +++ b/libasn1fix/asn1fix_misc.c @@ -1,5 +1,5 @@ #include "asn1fix_internal.h" - +#include "asn1fix.h" char const * asn1f_printable_reference(asn1p_ref_t *ref) { @@ -274,3 +274,59 @@ asn1f_count_children(asn1p_expr_t *expr) { return count; } + +static char **known_types; +static int known_types_count; +static int known_types_size; + +static int _known_types_cmp(const void *ap, const void *bp) { + const char *a = *(const char * const *)ap; + const char *b = *(const char * const *)bp; + return strcmp(a, b); +} + +int +asn1f_make_known_external_type(const char *type_name) { + char *tname; + + /* Check for duplicates */ + if(asn1f_check_known_external_type(type_name) == 0) { + errno = EEXIST; + return -1; + } + + /* Ensure enough space */ + if(known_types_count <= known_types_size) { + int n = known_types_size ? known_types_size << 1 : 4; + void *p; + p = realloc(known_types, n * sizeof(known_types[0])); + if(!p) return -1; + known_types = p; + known_types_size = n; + } + + tname = strdup(type_name); + if(!tname) return -1; + + known_types[known_types_count++] = tname; + +#ifdef HAVE_MERGESORT + mergesort +#else + qsort +#endif + (known_types, known_types_count, sizeof(known_types[0]), + _known_types_cmp); + + return 0; +} + +int +asn1f_check_known_external_type(const char *type_name) { + void *p = bsearch(&type_name, known_types, known_types_count, + sizeof(known_types[0]), _known_types_cmp); + if(p) return 0; + errno = ESRCH; + return -1; +} + diff --git a/libasn1fix/asn1fix_misc.h b/libasn1fix/asn1fix_misc.h index e88e43229..a586faa88 100644 --- a/libasn1fix/asn1fix_misc.h +++ b/libasn1fix/asn1fix_misc.h @@ -44,4 +44,9 @@ int asn1f_check_unique_expr_child(arg_t *arg, asn1p_expr_t *child, */ int asn1f_count_children(asn1p_expr_t *parent); +/* + * Check if type is explicitly known. + */ +int asn1f_check_known_external_type(const char *); + #endif /* _ASN1FIX_MISC_H_ */ diff --git a/libasn1fix/asn1fix_retrieve.c b/libasn1fix/asn1fix_retrieve.c index 0dfcce405..f2f91d5c9 100644 --- a/libasn1fix/asn1fix_retrieve.c +++ b/libasn1fix/asn1fix_retrieve.c @@ -228,12 +228,17 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_ref_t *ref, asn1p_module_t **module_r) { } if(ref_tc == NULL) { DEBUG("Module \"%s\" does not contain \"%s\" " - "mentioned at line %d", + "mentioned at line %d: %s", src_mod->Identifier, identifier, - ref->_lineno + ref->_lineno, + strerror(errno) ); - errno = ESRCH; + if(asn1f_check_known_external_type(identifier) == 0) { + errno = EEXIST; /* Exists somewhere */ + } else { + errno = ESRCH; + } return NULL; } @@ -312,8 +317,9 @@ asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, */ tc = asn1f_lookup_symbol(arg, ref, &mod); if(tc == NULL) { - DEBUG("\tSymbol \"%s\" not found", - asn1f_printable_reference(ref)); + DEBUG("\tSymbol \"%s\" not found: %s", + asn1f_printable_reference(ref), + strerror(errno)); return NULL; } From fac17d131586db900426fb26ef91d1249429ca8e Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Jun 2004 21:21:45 +0000 Subject: [PATCH 0041/1469] -fknown-extern-type support got rid of -N git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@41 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/asn1c.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index 0dbbac454..086b4caf3 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -25,9 +25,9 @@ main(int ac, char **av) { enum asn1p_flags asn1_parser_flags = A1P_NOFLAGS; enum asn1f_flags asn1_fixer_flags = A1F_NOFLAGS; enum asn1c_flags asn1_compiler_flags = A1C_NOFLAGS; + enum asn1print_flags_e print_arg__flags = APF_NOFLAGS; int print_arg__print_out = 0; /* Don't compile, just print parsed */ int print_arg__fix_n_print = 0; /* Fix and print */ - enum asn1print_flags_e print_arg__flags = APF_NOFLAGS; int warnings_as_errors = 0; /* Treat warnings as errors */ char *skeletons_dir = NULL; /* Directory with supplementary stuff */ asn1p_t *asn = 0; /* An ASN.1 parsed tree */ @@ -38,7 +38,7 @@ main(int ac, char **av) { /* * Process command-line options. */ - while((ch = getopt(ac, av, "EFf:LNPRS:W:")) != -1) + while((ch = getopt(ac, av, "EFf:LPRS:W:")) != -1) switch(ch) { case 'E': print_arg__print_out = 1; @@ -57,6 +57,10 @@ main(int ac, char **av) { asn1_compiler_flags |= A1C_NO_C99; } else if(strcmp(optarg, "unnamed-unions") == 0) { asn1_compiler_flags |= A1C_UNNAMED_UNIONS; + } else if(strncmp(optarg, "known-extern-type=", 18) == 0) { + char *known_type = optarg + 18; + ret = asn1f_make_known_external_type(known_type); + assert(ret == 0 || errno == EEXIST); } else { fprintf(stderr, "-f%s: Invalid argument\n", optarg); exit(EX_USAGE); @@ -65,9 +69,6 @@ main(int ac, char **av) { case 'L': print_arg__flags |= APF_LINE_COMMENTS; break; - case 'N': - print_arg__flags |= APF_NO_SOURCE_COMMENTS; - break; case 'P': asn1_compiler_flags |= A1C_PRINT_COMPILED; break; @@ -240,7 +241,6 @@ usage(char *av0) { "\t-E\tRun only the ASN.1 parser and print out the tree\n" "\t-F\tDuring -E operation, also perform tree fixing\n" "\t-L\tGenerate \"-- #line\" comments in -E output\n" - "\t-N\tDo not generate certain type of comments in -E output\n" "\n" "\t-P \tConcatenate and print the compiled text\n" "\t-S \tDirectory with support (skeleton?) files\n" @@ -251,7 +251,8 @@ usage(char *av0) { /* "\t-fconstr90\tUse only ASN.1:1990 constructs (not available)\n" */ - "\t-fnative-integers\tUse native integers where possible\n" + "\t-fknown-extern-type=\tPretend this type is known\n" + "\t-fnative-integers\tUse int instead of INTEGER_t whenever possible\n" "\t-fno-c99\tDisable C99 extensions\n" "\t-funnamed-unions\tEnable unnamed unions in structures\n" "\n" From 65328a88627f38f52b2a7ee118435e98ce3e2388 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Jun 2004 21:22:20 +0000 Subject: [PATCH 0042/1469] -fknown-extern-type support; got rid of -N; fixed an IMPLICIT-related bug git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@42 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ChangeLog b/ChangeLog index 55d97bab0..e5d2dba19 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,13 @@ +0.8.13: 2004-Jun-29 + + * Fixed compiler: the skip values for IMPLICIT tagging were broken + in some complex cases where one type is defined using another. + (Test case 46) (Severity: medium, Security impact: low). + * Added -fknown-extern-type command line parameter to asn1c. + * Removed -N command line flag and underlying functionality + to honor KISS principle. + 0.8.12: 2004-Jun-17 * RELATIVE-OID and OBJECT IDENTIFIER encoders/decoders are not bound From b1d783b95b4599bc344bee9b3afce7d708af7c1f Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Jun 2004 21:22:35 +0000 Subject: [PATCH 0043/1469] version bump up git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@43 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++- configure.in | 3 +- 2 files changed, 105 insertions(+), 2 deletions(-) diff --git a/configure b/configure index c2ad1e68e..c76a71a62 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.8.12 + VERSION=0.8.13 cat >>confdefs.h <<_ACEOF @@ -21667,6 +21667,108 @@ if test `eval echo '${'$as_ac_var'}'` = yes; then #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF +fi +done + + +for ac_func in mergesort +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + fi done diff --git a/configure.in b/configure.in index 5ad2b02f8..982e9d6ff 100644 --- a/configure.in +++ b/configure.in @@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_SYSTEM AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.8.12) +AM_INIT_AUTOMAKE(asn1c, 0.8.13) AC_SUBST(PATH) @@ -75,6 +75,7 @@ AC_STRUCT_TM AC_CHECK_TYPE(intmax_t, int64_t) AC_CHECK_FUNCS(strtoimax strtoll) +AC_CHECK_FUNCS(mergesort) AM_CONFIG_HEADER(config.h) From b4cbe3d43cd1a3b6c18c2ef86ce14cfc8301181b Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Jun 2004 21:25:09 +0000 Subject: [PATCH 0044/1469] typo git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@44 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asn1c/tests/Makefile.am b/asn1c/tests/Makefile.am index 91dc54d37..7c9bcb8fc 100644 --- a/asn1c/tests/Makefile.am +++ b/asn1c/tests/Makefile.am @@ -1,5 +1,5 @@ -check_SCRIPTS = ./check-assembly.sh +check_SCRIPTS = check-assembly.sh TESTS_ENVIRONMENT= ./check-assembly.sh TESTS = check-*.c From 2ad2acf3bce67aac69cc69b1a061abce4a7a5dea Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Jun 2004 21:25:18 +0000 Subject: [PATCH 0045/1469] 46 test case git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@45 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-46.c | 46 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 asn1c/tests/check-46.c diff --git a/asn1c/tests/check-46.c b/asn1c/tests/check-46.c new file mode 100644 index 000000000..d2183d3ca --- /dev/null +++ b/asn1c/tests/check-46.c @@ -0,0 +1,46 @@ +#undef NDEBUG +#include +#include +#include +#include +#include + +#include + +uint8_t buf1[] = { + 32 | ((2 << 6) + 3), /* [3], constructed */ + 5, + ((2 << 6) + 5), /* [5], primitive */ + 3, /* L */ + 'a', + 'b', + 'c', +}; + +static void +check(uint8_t *buf, int size, size_t consumed) { + T_t t, *tp; + ber_dec_rval_t rval; + + tp = memset(&t, 0, sizeof(t)); + + fprintf(stderr, "Buf %p\n", buf); + rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf, size); + fprintf(stderr, "Returned code %d, consumed %d\n", + (int)rval.code, (int)rval.consumed); + + assert(rval.code == RC_OK); + assert(rval.consumed == consumed); +} + +int +main(int ac, char **av) { + + (void)ac; /* Unused argument */ + (void)av; /* Unused argument */ + + check(buf1, sizeof(buf1), sizeof(buf1)); + + return 0; +} + From 3d0f2f404933da00772efbcde47a938e7525e072 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Jun 2004 21:28:15 +0000 Subject: [PATCH 0046/1469] allow for numbers and other characters git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@46 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/check-parsing.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asn1c/check-parsing.sh b/asn1c/check-parsing.sh index a0533263b..dc20acaab 100755 --- a/asn1c/check-parsing.sh +++ b/asn1c/check-parsing.sh @@ -5,7 +5,7 @@ tmpfile=".check-parsing.$$.tmp" ec=0 for ref in ../tests/*.asn1.-*; do - src=`echo "$ref" | sed -e 's/\.-[a-zA-Z]*$//'` + src=`echo "$ref" | sed -e 's/\.-[-a-zA-Z0-9=]*$//'` flags=`echo "$ref" | sed -e 's/.*\.-//'` echo "Checking $src against $ref" ./asn1c "-$flags" "$src" > "$tmpfile" || ec=$? From e26690f3a6af5e90777e87f40447342c8d2f904e Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 1 Jul 2004 00:47:16 +0000 Subject: [PATCH 0047/1469] more logging git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@47 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SET.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index 0385722c5..a01b80448 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -277,7 +277,8 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, * already decoded elements. */ if(ASN_SET_ISPRESENT2(st + specs->pres_offset, edx)) { - ASN_DEBUG("Duplicate element %d", edx); + ASN_DEBUG("SET %s: Duplicate element %s (%d)", + sd->name, elements[edx].name, edx); RETURN(RC_FAIL); } From 5d219bfdeec079c90d51fdb5e06c8aef002ed191 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 1 Jul 2004 00:48:04 +0000 Subject: [PATCH 0048/1469] slightly more adequate constant git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@48 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SEQUENCE.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index c9bc646d2..2a5bbd455 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -237,9 +237,9 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, opt_edx_end = edx + elements[edx].optional + 1; if(opt_edx_end > specs->elements_count) opt_edx_end = specs->elements_count; /* Cap */ - else if(opt_edx_end - edx > 5) { + else if(opt_edx_end - edx > 8) { /* Limit the scope of linear search... */ - opt_edx_end = edx + 5; + opt_edx_end = edx + 8; use_bsearch = 1; /* ... and resort to bsearch() */ } From 3395ac25b938d552a1a27215ff5ea8b5e2242276 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 1 Jul 2004 00:49:49 +0000 Subject: [PATCH 0049/1469] right name git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@49 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/46-redefine-OK.asn1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/46-redefine-OK.asn1 b/tests/46-redefine-OK.asn1 index 7890363ca..058540422 100644 --- a/tests/46-redefine-OK.asn1 +++ b/tests/46-redefine-OK.asn1 @@ -5,7 +5,7 @@ -- .spelio.software.asn1c.test (9363.1.5.1) -- .46 -ModuleChoiceInSequence +ModuleRedefineType { iso org(3) dod(6) internet (1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 46 } DEFINITIONS IMPLICIT TAGS ::= From 27ee5284689b1098d7e0532cffa9bb64a9fad976 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 1 Jul 2004 00:49:55 +0000 Subject: [PATCH 0050/1469] fixed compiler git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@50 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/42-real-life-OK.asn1.-PR | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index 990e2c2e9..ca84dcb7b 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -392,7 +392,7 @@ static asn1_CHOICE_specifics_t asn1_DEF_VariablePart_specs = { 2, /* Elements count */ asn1_DEF_VariablePart_tag2el, 2, /* Count of tags in the map */ - 0 /* Whether extensible */ + 1 /* Whether extensible */ }; asn1_TYPE_descriptor_t asn1_DEF_VariablePart = { "VariablePart", From 4f4f56d7f638d885fb07e57fe6f7c37271e7bfb8 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 1 Jul 2004 00:51:31 +0000 Subject: [PATCH 0051/1469] proper logging git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@51 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_constr.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libasn1fix/asn1fix_constr.c b/libasn1fix/asn1fix_constr.c index 2aa798271..4db233f6e 100644 --- a/libasn1fix/asn1fix_constr.c +++ b/libasn1fix/asn1fix_constr.c @@ -71,6 +71,7 @@ asn1f_fix_constr_ext(arg_t *arg) { v->Identifier = strdup("..."); v->expr_type = A1TC_EXTENSIBLE; v->meta_type = AMT_TYPE; + v->_lineno = expr->_lineno; /* The best we can do */ if(v->Identifier == NULL) { asn1p_expr_free(v); r_value = -1; @@ -302,6 +303,15 @@ _asn1f_compare_tags(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b) { b->Identifier, b->_lineno ); + if((arg->mod->module_flags & MSF_EXTENSIBILITY_IMPLIED) + && (a->expr_type == A1TC_EXTENSIBLE) + && (b->expr_type == A1TC_EXTENSIBLE)) { + FATAL("The previous error is due to " + "improper use of " + "EXTENSIBILITY IMPLIED flag " + "of module %s", + arg->mod->Identifier); + } return -1; } else { /* Tags are distinct */ From 79b08d5af5a0b39b5f9dd78e821916ee5a7e9a61 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 1 Jul 2004 00:52:50 +0000 Subject: [PATCH 0052/1469] extensibility check git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@52 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 6 + configure | 2 +- configure.in | 2 +- libasn1compiler/asn1c_C.c | 18 ++- tests/47-set-ext-OK.asn1 | 19 +++ tests/47-set-ext-OK.asn1.-P | 312 ++++++++++++++++++++++++++++++++++++ 6 files changed, 353 insertions(+), 6 deletions(-) create mode 100644 tests/47-set-ext-OK.asn1 create mode 100644 tests/47-set-ext-OK.asn1.-P diff --git a/ChangeLog b/ChangeLog index e5d2dba19..e9013d387 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,10 @@ +0.8.14: 2004-Jun-30 + + * Fixed compiler: extensibility of CHOICE and SET type has not been + taken into account during table construction. + (Test case 47) (Severity: high, Security impact: low) + 0.8.13: 2004-Jun-29 * Fixed compiler: the skip values for IMPLICIT tagging were broken diff --git a/configure b/configure index c76a71a62..25923f162 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.8.13 + VERSION=0.8.14 cat >>confdefs.h <<_ACEOF diff --git a/configure.in b/configure.in index 982e9d6ff..925750a62 100644 --- a/configure.in +++ b/configure.in @@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_SYSTEM AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.8.13) +AM_INIT_AUTOMAKE(asn1c, 0.8.14) AC_SUBST(PATH) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index bf66fe4c2..d561e029f 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -22,6 +22,7 @@ static int asn1c_lang_C_type_SET_def(arg_t *arg); static int asn1c_lang_C_type_CHOICE_def(arg_t *arg); static int asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of); static int _print_tag(arg_t *arg, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag_p); +static int check_if_extensible(asn1p_expr_t *expr); static int emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int*tags_impl_skip); static int emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count); static int emit_constraint_checking_code(arg_t *arg); @@ -400,7 +401,6 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { int elements; int tags_impl_skip = 0; int comp_mode = 0; /* {root,ext=1,root,root,...} */ - int extensible = 0; tag2el_t *tag2el = NULL; int tag2el_count = 0; char *p; @@ -518,7 +518,8 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { OUT("%d,\t/* Elements count */\n", elements); OUT("asn1_DEF_%s_tag2el,\n", p); OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); - OUT("%d,\t/* Whether extensible */\n", extensible); + OUT("%d,\t/* Whether extensible */\n", + check_if_extensible(expr)); OUT("(unsigned int *)asn1_DEF_%s_mmap\t/* Mandatory elements map */\n", p); ); OUT("};\n"); @@ -720,7 +721,6 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { int elements; /* Number of elements */ int tags_impl_skip = 0; int comp_mode = 0; /* {root,ext=1,root,root,...} */ - int extensible = 0; tag2el_t *tag2el = NULL; int tag2el_count = 0; char *p; @@ -821,7 +821,8 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { OUT("%d,\t/* Elements count */\n", elements); OUT("asn1_DEF_%s_tag2el,\n", p); OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); - OUT("%d\t/* Whether extensible */\n", extensible); + OUT("%d\t/* Whether extensible */\n", + check_if_extensible(expr)); ); OUT("};\n"); OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p); @@ -1082,6 +1083,14 @@ asn1c_lang_C_type_EXTENSIBLE(arg_t *arg) { return 0; } +static int check_if_extensible(asn1p_expr_t *expr) { + asn1p_expr_t *v; + TQ_FOR(v, &(expr->members), next) { + if(v->expr_type == A1TC_EXTENSIBLE) return 1; + } + return 0; +} + static int _print_tag(arg_t *arg, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag_p) { struct asn1p_type_tag_s tag; @@ -1996,3 +2005,4 @@ _find_terminal_type(arg_t *arg) { if(expr) return expr->expr_type; return A1TC_INVALID; } + diff --git a/tests/47-set-ext-OK.asn1 b/tests/47-set-ext-OK.asn1 new file mode 100644 index 000000000..52afef11a --- /dev/null +++ b/tests/47-set-ext-OK.asn1 @@ -0,0 +1,19 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .47 + +ModuleSetChoiceExtensibility + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 47 } + DEFINITIONS IMPLICIT TAGS EXTENSIBILITY IMPLIED ::= +BEGIN + + T1 ::= SET { i INTEGER } + T2 ::= SET { i INTEGER, ... } + T3 ::= CHOICE { i INTEGER } + T4 ::= CHOICE { i INTEGER, ... } + +END diff --git a/tests/47-set-ext-OK.asn1.-P b/tests/47-set-ext-OK.asn1.-P new file mode 100644 index 000000000..69a7dedbe --- /dev/null +++ b/tests/47-set-ext-OK.asn1.-P @@ -0,0 +1,312 @@ + +/*** <<< DEPS [T1] >>> ***/ + +/* Dependencies for T1 */ +#include + + +/* + * Method of determining the components presence + */ +enum T1_PR_e { + T1_PR_i, /* Member i is present */ +}; +#include + +extern asn1_TYPE_descriptor_t asn1_DEF_T1; + +/*** <<< TYPE-DECLS [T1] >>> ***/ + + +typedef struct T1 { + INTEGER_t i; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Presence bitmask: ASN_SET_ISPRESENT(pT1, T1_PR_x) */ + unsigned int _presence_map + [((1+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))]; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} T1_t; + +/*** <<< STAT-DEFS [T1] >>> ***/ + +#include + +static asn1_SET_element_t asn1_DEF_T1_elements[] = { + { offsetof(struct T1, i), 0, + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + (void *)&asn1_DEF_INTEGER, + "i" + }, +}; +static ber_tlv_tag_t asn1_DEF_T1_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) +}; +static asn1_TYPE_tag2member_t asn1_DEF_T1_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 14 */ +}; +static uint8_t asn1_DEF_T1_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { + (1 << 7) +}; +static asn1_SET_specifics_t asn1_DEF_T1_specs = { + sizeof(struct T1), + offsetof(struct T1, _ber_dec_ctx), + offsetof(struct T1, _presence_map), + asn1_DEF_T1_elements, + 1, /* Elements count */ + asn1_DEF_T1_tag2el, + 1, /* Count of tags in the map */ + 1, /* Whether extensible */ + (unsigned int *)asn1_DEF_T1_mmap /* Mandatory elements map */ +}; +asn1_TYPE_descriptor_t asn1_DEF_T1 = { + "T1", + SET_constraint, + SET_decode_ber, + SET_encode_der, + SET_print, + SET_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T1_tags, + sizeof(asn1_DEF_T1_tags) + /sizeof(asn1_DEF_T1_tags[0]), + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + &asn1_DEF_T1_specs /* Additional specs */ +}; + + +/*** <<< DEPS [T2] >>> ***/ + +/* Dependencies for T2 */ +#include + + +/* + * Method of determining the components presence + */ +enum T2_PR_e { + T2_PR_i, /* Member i is present */ +}; +#include + +extern asn1_TYPE_descriptor_t asn1_DEF_T2; + +/*** <<< TYPE-DECLS [T2] >>> ***/ + + +typedef struct T2 { + INTEGER_t i; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Presence bitmask: ASN_SET_ISPRESENT(pT2, T2_PR_x) */ + unsigned int _presence_map + [((1+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))]; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} T2_t; + +/*** <<< STAT-DEFS [T2] >>> ***/ + +#include + +static asn1_SET_element_t asn1_DEF_T2_elements[] = { + { offsetof(struct T2, i), 0, + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + (void *)&asn1_DEF_INTEGER, + "i" + }, +}; +static ber_tlv_tag_t asn1_DEF_T2_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) +}; +static asn1_TYPE_tag2member_t asn1_DEF_T2_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 15 */ +}; +static uint8_t asn1_DEF_T2_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { + (1 << 7) +}; +static asn1_SET_specifics_t asn1_DEF_T2_specs = { + sizeof(struct T2), + offsetof(struct T2, _ber_dec_ctx), + offsetof(struct T2, _presence_map), + asn1_DEF_T2_elements, + 1, /* Elements count */ + asn1_DEF_T2_tag2el, + 1, /* Count of tags in the map */ + 1, /* Whether extensible */ + (unsigned int *)asn1_DEF_T2_mmap /* Mandatory elements map */ +}; +asn1_TYPE_descriptor_t asn1_DEF_T2 = { + "T2", + SET_constraint, + SET_decode_ber, + SET_encode_der, + SET_print, + SET_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T2_tags, + sizeof(asn1_DEF_T2_tags) + /sizeof(asn1_DEF_T2_tags[0]), + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + &asn1_DEF_T2_specs /* Additional specs */ +}; + + +/*** <<< DEPS [T3] >>> ***/ + +/* Dependencies for T3 */ +#include + +extern asn1_TYPE_descriptor_t asn1_DEF_T3; + +/*** <<< TYPE-DECLS [T3] >>> ***/ + + +typedef struct T3 { + enum { + T3_PR_NOTHING, /* No components present */ + T3_PR_i, + } present; + union { + INTEGER_t i; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} T3_t; + +/*** <<< STAT-DEFS [T3] >>> ***/ + +#include + +static asn1_CHOICE_element_t asn1_DEF_T3_elements[] = { + { offsetof(struct T3, choice.i), 0, + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + (void *)&asn1_DEF_INTEGER, + "i" + }, +}; +static ber_tlv_tag_t asn1_DEF_T3_tags[] = { + +}; +static asn1_TYPE_tag2member_t asn1_DEF_T3_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 16 */ +}; +static asn1_CHOICE_specifics_t asn1_DEF_T3_specs = { + sizeof(struct T3), + offsetof(struct T3, _ber_dec_ctx), + offsetof(struct T3, present), + sizeof(((struct T3 *)0)->present), + asn1_DEF_T3_elements, + 1, /* Elements count */ + asn1_DEF_T3_tag2el, + 1, /* Count of tags in the map */ + 1 /* Whether extensible */ +}; +asn1_TYPE_descriptor_t asn1_DEF_T3 = { + "T3", + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_print, + CHOICE_free, + CHOICE_outmost_tag, + asn1_DEF_T3_tags, + sizeof(asn1_DEF_T3_tags) + /sizeof(asn1_DEF_T3_tags[0]), + 0, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + &asn1_DEF_T3_specs /* Additional specs */ +}; + + +/*** <<< DEPS [T4] >>> ***/ + +/* Dependencies for T4 */ +#include + +extern asn1_TYPE_descriptor_t asn1_DEF_T4; + +/*** <<< TYPE-DECLS [T4] >>> ***/ + + +typedef struct T4 { + enum { + T4_PR_NOTHING, /* No components present */ + T4_PR_i, + } present; + union { + INTEGER_t i; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} T4_t; + +/*** <<< STAT-DEFS [T4] >>> ***/ + +#include + +static asn1_CHOICE_element_t asn1_DEF_T4_elements[] = { + { offsetof(struct T4, choice.i), 0, + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + (void *)&asn1_DEF_INTEGER, + "i" + }, +}; +static ber_tlv_tag_t asn1_DEF_T4_tags[] = { + +}; +static asn1_TYPE_tag2member_t asn1_DEF_T4_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 17 */ +}; +static asn1_CHOICE_specifics_t asn1_DEF_T4_specs = { + sizeof(struct T4), + offsetof(struct T4, _ber_dec_ctx), + offsetof(struct T4, present), + sizeof(((struct T4 *)0)->present), + asn1_DEF_T4_elements, + 1, /* Elements count */ + asn1_DEF_T4_tag2el, + 1, /* Count of tags in the map */ + 1 /* Whether extensible */ +}; +asn1_TYPE_descriptor_t asn1_DEF_T4 = { + "T4", + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_print, + CHOICE_free, + CHOICE_outmost_tag, + asn1_DEF_T4_tags, + sizeof(asn1_DEF_T4_tags) + /sizeof(asn1_DEF_T4_tags[0]), + 0, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + &asn1_DEF_T4_specs /* Additional specs */ +}; + From 7ebd67ce33bf7b09a322195363fff0f6afc77717 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 15 Jul 2004 10:51:26 +0000 Subject: [PATCH 0053/1469] proper free() git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@53 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SET_OF.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index e398db8be..ff628d215 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -498,7 +498,9 @@ SET_OF_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { if(memb_ptr) element->type->free_struct(element->type, memb_ptr, 0); } - list->count = 0; /* Just in case */ + list->count = 0; /* No meaningful elements left */ + + asn_set_empty(list); /* Remove (list->array) */ if(!contents_only) { FREEMEM(ptr); From f0769b419ed9f01ff87c86cfcf7cfb2175698c66 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 15 Jul 2004 10:52:58 +0000 Subject: [PATCH 0054/1469] fixed free_struct git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@54 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ChangeLog b/ChangeLog index e9013d387..fbb2510ed 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,9 @@ +0.8.15: 2004-Jul-15 + + * Fixed parser: memory leak in free_struct code for SET OF/SEQUENCE OF. + (Severity: high, Security impact: medium) + 0.8.14: 2004-Jun-30 * Fixed compiler: extensibility of CHOICE and SET type has not been From 7d278c491d8424bc687d2940ccafd5786f3c5b01 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 19 Jul 2004 17:30:25 +0000 Subject: [PATCH 0055/1469] improved INTEGER printing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@55 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 1 + skeletons/INTEGER.c | 26 ++++++++++++++++++---- skeletons/NativeInteger.c | 2 +- skeletons/tests/check-INTEGER.c | 39 +++++++++++++++++++++++++++++++-- 4 files changed, 61 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index fbb2510ed..cb6b9d4b1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,7 @@ * Fixed parser: memory leak in free_struct code for SET OF/SEQUENCE OF. (Severity: high, Security impact: medium) + * Improved INTEGER type printing. 0.8.14: 2004-Jun-30 diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index d20379fb5..120b94fe8 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -186,8 +186,8 @@ INTEGER_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, int INTEGER_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + char scratch[32]; /* Enough for 64-bit integer */ const INTEGER_t *st = sptr; - char scratch[32]; uint8_t *buf = st->buf; uint8_t *buf_end = st->buf + st->size; signed long accum; @@ -202,9 +202,24 @@ INTEGER_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, if(st->size == 0) return cb("0", 1, app_key); + /* + * Advance buf pointer until the start of the value's body. + * This will make us able to process large integers using simple case, + * when the actual value is small + * (0x0000000000abcdef would yield a fine 0x00abcdef) + */ + /* Skip the insignificant leading bytes */ + for(; buf < buf_end-1; buf++) { + switch(*buf) { + case 0x00: if((buf[1] & 0x80) == 0) continue; break; + case 0xff: if((buf[1] & 0x80) != 0) continue; break; + } + break; + } + /* Simple case: the integer size is small */ - if((size_t)st->size < sizeof(accum) || (st->buf[0] & 0x80)) { - accum = (st->buf[0] & 0x80) ? -1 : 0; + if((size_t)(buf_end - buf) <= sizeof(accum)) { + accum = (*buf & 0x80) ? -1 : 0; for(; buf < buf_end; buf++) accum = (accum << 8) | *buf; ret = snprintf(scratch, sizeof(scratch), "%ld", accum); @@ -213,9 +228,10 @@ INTEGER_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, } /* Output in the long xx:yy:zz... format */ + /* TODO: replace with generic algorithm (Knuth TAOCP Vol 2, 4.3.1) */ for(p = scratch; buf < buf_end; buf++) { static char h2c[16] = "0123456789ABCDEF"; - if((p - scratch) >= (ssize_t)(sizeof(scratch) / 2)) { + if((p - scratch) >= (ssize_t)(sizeof(scratch) - 4)) { /* Flush buffer */ if(cb(scratch, p - scratch, app_key)) return -1; @@ -225,6 +241,8 @@ INTEGER_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, *p++ = h2c[*buf & 0x0F]; *p++ = ':'; } + if(p != scratch) + p--; /* Remove the last ':' */ return cb(scratch, p - scratch, app_key); } diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index 8203695cc..8f13a5913 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -166,7 +166,7 @@ int NativeInteger_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const int *Int = sptr; - char scratch[32]; + char scratch[32]; /* Enough for 64-bit int */ int ret; (void)td; /* Unused argument */ diff --git a/skeletons/tests/check-INTEGER.c b/skeletons/tests/check-INTEGER.c index 4053075e2..5aa400d54 100644 --- a/skeletons/tests/check-INTEGER.c +++ b/skeletons/tests/check-INTEGER.c @@ -5,9 +5,22 @@ #include "../der_encoder.c" #include "../constraints.c" +static char *shared_scratch_start; + +static int _print2buf(const void *buf, size_t size, void *key) { + (void)key; + memcpy(shared_scratch_start, buf, size); + shared_scratch_start += size; + *shared_scratch_start = '\0'; /* 0-termination */ + return 0; +} + static void check(uint8_t *buf, int size, long check_long, int check_ret) { + char scratch[128]; + char verify[32]; INTEGER_t val; + uint8_t *buf_end = buf + size; int ret; long rlong = 123; @@ -17,13 +30,35 @@ check(uint8_t *buf, int size, long check_long, int check_ret) { val.buf = buf; val.size = size; + printf("Testing: ["); + for(; buf < buf_end; buf++) { + if(buf != val.buf) printf(":"); + printf("%02x", *buf); + } + printf("]: "); ret = asn1_INTEGER2long(&val, &rlong); - printf("Testing (%ld, %d) vs (%ld, %d)\n", + printf(" (%ld, %d) vs (%ld, %d)\n", rlong, ret, check_long, check_ret); assert(ret == check_ret); - if(ret == -1) return; assert(rlong == check_long); + + shared_scratch_start = scratch; + ret = INTEGER_print(&asn1_DEF_INTEGER, &val, 0, _print2buf, scratch); + assert(shared_scratch_start < scratch + sizeof(scratch)); + assert(ret == 0); + ret = snprintf(verify, sizeof(verify), "%ld", check_long); + assert(ret < sizeof(verify)); + ret = strcmp(scratch, verify); + printf(" [%s] vs [%s]: %d%s\n", + scratch, verify, ret, + (check_ret == -1)?" (expected to fail)":"" + ); + if(check_ret == -1) { + assert(strcmp(scratch, verify)); + } else { + assert(strcmp(scratch, verify) == 0); + } } int From 796c1da2cb73f8304876d0819a5f2619c5d917d8 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 21 Jul 2004 03:55:44 +0000 Subject: [PATCH 0056/1469] invalid memory reference fix and test case git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@56 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 14 +++++- asn1c/tests/check-48.c | 96 ++++++++++++++++++++++++++++++++++++++ skeletons/ber_decoder.c | 33 +++++++------ skeletons/der_encoder.c | 16 +++++-- tests/48-real-life-OK.asn1 | 21 +++++++++ 5 files changed, 162 insertions(+), 18 deletions(-) create mode 100644 asn1c/tests/check-48.c create mode 100644 tests/48-real-life-OK.asn1 diff --git a/ChangeLog b/ChangeLog index cb6b9d4b1..3a654a54f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,20 @@ -0.8.15: 2004-Jul-15 +0.8.15: 2004-Jul-20 * Fixed parser: memory leak in free_struct code for SET OF/SEQUENCE OF. (Severity: high, Security impact: medium) + * Fixed parser: invalid memory reference in CHECK. + (Test case 48) (Severity: high, Security impact: medium) + When encoding data for certain ASN.1 specifications containing + explicit tags, the tag is always written incorrectly due to + incorrect memory reference. The encoding will almost always produce + unparseable data and might well reference unmapped region so program + would produce segmentation violation. Fortunately, memory is + read, not written, so remote exploits cannot execute arbitrary + code and triggering unmapped memory reference is highly unlikely + even it attacker knows the code (basically, the compiler should place + asn1_DEF_... right before the end of the mapped memory region, which + is extremely rare). * Improved INTEGER type printing. 0.8.14: 2004-Jun-30 diff --git a/asn1c/tests/check-48.c b/asn1c/tests/check-48.c new file mode 100644 index 000000000..8c4f395f1 --- /dev/null +++ b/asn1c/tests/check-48.c @@ -0,0 +1,96 @@ +#undef NDEBUG +#include +#include +#include +#include +#include +#include + +#include + +static unsigned char buf[4096]; +static int buf_offset; + +static int +_buf_writer(const void *buffer, size_t size, void *app_key) { + unsigned char *b, *bend; + (void)app_key; + assert(buf_offset + size < sizeof(buf)); + memcpy(buf + buf_offset, buffer, size); + b = buf + buf_offset; + bend = b + size; + printf("=> ["); + for(; b < bend; b++) + printf(" %02X", *b); + printf("]:%ld\n", (long)size); + buf_offset += size; + return 0; +} + +static int +save_object(void *bs, asn1_TYPE_descriptor_t *td) { + der_enc_rval_t rval; /* Return value */ + int i; + + rval = der_encode(td, bs, _buf_writer, 0); + if (rval.encoded == -1) { + fprintf(stderr, + "Cannot encode %s: %s\n", + rval.failed_type->name, strerror(errno)); + assert(rval.encoded != -1); + return -1; /* JIC */ + } + + buf[buf_offset++] = 123; /* Finalize with garbage */ + + asn_fprint(stderr, td, bs); + + printf("OUT: ["); + for(i = 0; i < buf_offset; i++) + printf(" %02x", buf[i]); + printf("]\n"); + + return 0; +} + +static int +load_object(void *bs, asn1_TYPE_descriptor_t *td) { + ber_dec_rval_t rval; + + fprintf(stderr, "\nLOADING OBJECT OF SIZE %d\n", buf_offset); + + rval = ber_decode(td, (void **)&bs, buf, buf_offset); + assert(rval.code == RC_OK); + + asn_fprint(stderr, td, bs); + + return (rval.code == RC_OK)?0:-1; +} + +int +main() { + asn1_TYPE_descriptor_t *td = &asn1_DEF_UserIdentifier; + UserIdentifier_t user; + UserIdentifier_t user_new; + int ret; + + memset(&user, 0, sizeof user); + memset(&user_new, 0, sizeof user_new); + + user.present = UserIdentifier_PR_phoneNumber; + OCTET_STRING_fromBuf( + &user.choice.phoneNumber, + "0123456789", -1); + + /* Save->Load must succeed */ + save_object(&user, td); + ret = load_object(&user_new, td); + + assert(user_new.present == UserIdentifier_PR_phoneNumber); + + assert(ret == 0); + + printf("OK\n"); + + return ret; +} diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c index ab8d671c7..0d57f82c7 100644 --- a/skeletons/ber_decoder.c +++ b/skeletons/ber_decoder.c @@ -39,7 +39,7 @@ ber_decode(asn1_TYPE_descriptor_t *type_descriptor, * Check the set of >> tags matches the definition. */ ber_dec_rval_t -ber_check_tags(asn1_TYPE_descriptor_t *head, ber_dec_ctx_t *ctx, +ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *ctx, void *ptr, size_t size, int tag_mode, ber_tlv_len_t *last_length, int *opt_tlv_form) { ssize_t consumed_myself = 0; @@ -83,28 +83,33 @@ ber_check_tags(asn1_TYPE_descriptor_t *head, ber_dec_ctx_t *ctx, * This is because the implicit tag at above structure may replace * zero or more (or every) tags which follow it. We don't care * about the precise number, as it is already computed for us - * by the ASN.1 compiler and placed into head->tags_impl_skip. + * by the ASN.1 compiler and placed into td->tags_impl_skip. * So let's suppose the only tag left after implicit tagging is {I}. - * Yet, the table we have is {A,B,C} and head->tags_impl_skip=3. + * Yet, the table we have is {A,B,C} and td->tags_impl_skip=3. * We need to check at least one tag in the loop, so the loop range * is modified so it will be invoked at least one time. */ tagno = ctx->step /* Continuing where left previously */ - + (tag_mode==-1?(head->tags_impl_skip-1):0) + + (tag_mode==-1?(td->tags_impl_skip-1):0) + (tag_mode==1?-1:0) ; - //assert(head->tags_count >= 1); ?May not be the case for CHOICE! - assert(tagno < head->tags_count); /* At least one loop */ - for((void)tagno; tagno < head->tags_count; tagno++, ctx->step++) { + ASN_DEBUG("ber_check_tags(%s, size=%ld, tm=%d, step=%d, tagno=%d)", + td->name, (long)size, tag_mode, ctx->step, tagno); + //assert(td->tags_count >= 1); ?May not be the case for CHOICE! + assert(tagno < td->tags_count); /* At least one loop */ + for((void)tagno; tagno < td->tags_count; tagno++, ctx->step++) { /* * Fetch and process T from TLV. */ tag_len = ber_fetch_tag(ptr, size, &tlv_tag); - ASN_DEBUG("Fetching tag from {%p,%ld} %02X: " + ASN_DEBUG("Fetching tag from {%p,%ld} %02X..%02X: " "len %ld, tag %s", ptr, (long)size, - *(uint8_t *)ptr, (long)tag_len, + size?*(uint8_t *)ptr:0, + (tag_len0) + ?*((uint8_t *)ptr + tag_len):0, + (long)tag_len, ber_tlv_tag_string(tlv_tag)); switch(tag_len) { case -1: RETURN(RC_FAIL); @@ -125,12 +130,12 @@ ber_check_tags(asn1_TYPE_descriptor_t *head, ber_dec_ctx_t *ctx, */ } else { assert(tagno >= 0); /* Guaranteed by the code above */ - if(tlv_tag != head->tags[tagno]) { + if(tlv_tag != td->tags[tagno]) { /* * Unexpected tag. Too bad. */ ASN_DEBUG("Expected: %s, expectation failed", - ber_tlv_tag_string(head->tags[tagno])); + ber_tlv_tag_string(td->tags[tagno])); RETURN(RC_FAIL); } } @@ -142,13 +147,13 @@ ber_check_tags(asn1_TYPE_descriptor_t *head, ber_dec_ctx_t *ctx, * If this one is the last one, check that the tag form * matches the one given in descriptor. */ - if(tagno < (head->tags_count - 1)) { + if(tagno < (td->tags_count - 1)) { if(tlv_constr == 0) { RETURN(RC_FAIL); } } else { - if(head->last_tag_form != tlv_constr - && head->last_tag_form != -1) { + if(td->last_tag_form != tlv_constr + && td->last_tag_form != -1) { RETURN(RC_FAIL); } } diff --git a/skeletons/der_encoder.c b/skeletons/der_encoder.c index 72a33ebcd..919350c5e 100644 --- a/skeletons/der_encoder.c +++ b/skeletons/der_encoder.c @@ -43,22 +43,32 @@ der_write_tags(asn1_TYPE_descriptor_t *sd, ssize_t *lens; int i; + ASN_DEBUG("Writing tags (%s, tm=%d, tc=%d, iskip=%d, tag=%s, mtc=%d)", + sd->name, tag_mode, sd->tags_count, sd->tags_impl_skip, + ber_tlv_tag_string(tag), + tag_mode + ?(sd->tags_count+1 + -((tag_mode==-1)?sd->tags_impl_skip:0)) + :sd->tags_count + ); + if(tag_mode) { /* * Instead of doing shaman dance like we do in ber_check_tags(), * allocate a small array on the stack * and initialize it appropriately. */ - tags = alloca((sd->tags_count + (tag_mode?1:0)) - * sizeof(ber_tlv_tag_t)); + int stag_offset; + tags = alloca((sd->tags_count + 1) * sizeof(ber_tlv_tag_t)); if(tags == NULL) return -1; /* Impossible on i386 */ tags_count = sd->tags_count + 1 /* EXPLICIT or IMPLICIT tag is given */ - ((tag_mode==-1)?sd->tags_impl_skip:0); /* Copy tags over */ tags[0] = tag; + stag_offset = -1 + ((tag_mode==-1)?sd->tags_impl_skip:0); for(i = 1; i < tags_count; i++) - tags[i] = sd->tags[i - 1 + sd->tags_impl_skip]; + tags[i] = sd->tags[i + stag_offset]; } else { tags = sd->tags; tags_count = sd->tags_count; diff --git a/tests/48-real-life-OK.asn1 b/tests/48-real-life-OK.asn1 new file mode 100644 index 000000000..71736761c --- /dev/null +++ b/tests/48-real-life-OK.asn1 @@ -0,0 +1,21 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .48 + +ModuleSetChoiceExtensibility + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 48 } + DEFINITIONS ::= +BEGIN + + /* + * 0.8.14 had problem saving/reloading this object + */ + UserIdentifier ::= CHOICE { + phoneNumber [3] EXPLICIT IA5String + } + +END From 1e9e0b92ae1bf80f481df64db5d4f5ade7e8ab41 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 21 Jul 2004 04:03:14 +0000 Subject: [PATCH 0057/1469] compiler compatibility git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@57 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ber_decoder.c | 2 +- skeletons/constr_SET.c | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c index 0d57f82c7..3ae678ec0 100644 --- a/skeletons/ber_decoder.c +++ b/skeletons/ber_decoder.c @@ -107,7 +107,7 @@ ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *ctx, "len %ld, tag %s", ptr, (long)size, size?*(uint8_t *)ptr:0, - (tag_len0) + ((size_t)tag_len0) ?*((uint8_t *)ptr + tag_len):0, (long)tag_len, ber_tlv_tag_string(tlv_tag)); diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index a01b80448..4fd211b08 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -201,6 +201,10 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, /* Fall through */ case -1: RETURN(RC_FAIL); } + printf("size = %ld, ctx->left = %ld\n", + (long)size, (long)ctx->left); + printf("tag_len = %ld, LEFT = %d, %ld\n", + (long)tag_len, LEFT, (long)tlv_tag); if(ctx->left < 0 && ((uint8_t *)ptr)[0] == 0) { if(LEFT < 2) { From 0cbda64adf972de8c542e2a2c571771ec35ef2bc Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 21 Jul 2004 04:08:07 +0000 Subject: [PATCH 0058/1469] oops git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@58 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SET.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index 4fd211b08..a01b80448 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -201,10 +201,6 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, /* Fall through */ case -1: RETURN(RC_FAIL); } - printf("size = %ld, ctx->left = %ld\n", - (long)size, (long)ctx->left); - printf("tag_len = %ld, LEFT = %d, %ld\n", - (long)tag_len, LEFT, (long)tlv_tag); if(ctx->left < 0 && ((uint8_t *)ptr)[0] == 0) { if(LEFT < 2) { From de1d8f7f3fcf45fc202ca19121dd5a79c39675e0 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 21 Jul 2004 04:15:24 +0000 Subject: [PATCH 0059/1469] typo git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@59 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 2 +- asn1c/tests/check-assembly.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3a654a54f..ccc6c83a8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,7 +3,7 @@ * Fixed parser: memory leak in free_struct code for SET OF/SEQUENCE OF. (Severity: high, Security impact: medium) - * Fixed parser: invalid memory reference in CHECK. + * Fixed parser: invalid memory reference in code constructing tags. (Test case 48) (Severity: high, Security impact: medium) When encoding data for certain ASN.1 specifications containing explicit tags, the tag is always written incorrectly due to diff --git a/asn1c/tests/check-assembly.sh b/asn1c/tests/check-assembly.sh index a1756b4d6..836c5e802 100755 --- a/asn1c/tests/check-assembly.sh +++ b/asn1c/tests/check-assembly.sh @@ -33,7 +33,7 @@ set +x # Create a Makefile for the project. cat > Makefile < Date: Wed, 21 Jul 2004 04:20:55 +0000 Subject: [PATCH 0060/1469] oops git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@60 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-assembly.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asn1c/tests/check-assembly.sh b/asn1c/tests/check-assembly.sh index 836c5e802..a1756b4d6 100755 --- a/asn1c/tests/check-assembly.sh +++ b/asn1c/tests/check-assembly.sh @@ -33,7 +33,7 @@ set +x # Create a Makefile for the project. cat > Makefile < Date: Wed, 21 Jul 2004 04:28:32 +0000 Subject: [PATCH 0061/1469] typo git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@61 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index ccc6c83a8..fc28113d5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -43,7 +43,7 @@ 0.8.11: 2004-Jun-05 - * Enforsed stricter conformance with C standards. + * Enforced stricter conformance with C standards. * SEQUENCE BER decoder is now equipped with the sorted map in case of complex CHOICE descendants. Test case 44 created. From 96e886b5c9b1efb1ef6aa0a146f28b57fa950285 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 21 Jul 2004 04:34:18 +0000 Subject: [PATCH 0062/1469] version bump-up git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@62 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure | 2 +- configure.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 25923f162..a8c1abc25 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.8.14 + VERSION=0.8.15 cat >>confdefs.h <<_ACEOF diff --git a/configure.in b/configure.in index 925750a62..359e31f92 100644 --- a/configure.in +++ b/configure.in @@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_SYSTEM AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.8.14) +AM_INIT_AUTOMAKE(asn1c, 0.8.15) AC_SUBST(PATH) From 2236663258be6f52ba8d8955b7a115922e4272dd Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 22 Jul 2004 12:17:10 +0000 Subject: [PATCH 0063/1469] array pointer cleanup git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@63 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_SET_OF.c | 1 + 1 file changed, 1 insertion(+) diff --git a/skeletons/asn_SET_OF.c b/skeletons/asn_SET_OF.c index dfa990679..d89b357f6 100644 --- a/skeletons/asn_SET_OF.c +++ b/skeletons/asn_SET_OF.c @@ -80,6 +80,7 @@ asn_set_empty(void *asn_set_of_x) { as->free(as->array[as->count]); } free(as->array); + as->array = 0; } as->count = 0; as->size = 0; From 972a538670e667d40aa6edf16c64af289b876863 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 22 Jul 2004 12:19:42 +0000 Subject: [PATCH 0064/1469] array cleanup git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@64 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ChangeLog b/ChangeLog index fc28113d5..d1371bf56 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,9 @@ +0.8.16: 2004-Jul-22 + + * Fixed application-level problem in SET OF/SEQUENCE OF array cleanup. + (Severity: medium, Security impact: low) + 0.8.15: 2004-Jul-20 * Fixed parser: memory leak in free_struct code for SET OF/SEQUENCE OF. From 6d8518c7be259da8bcff1924202a66e903e32389 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 22 Jul 2004 16:23:33 +0000 Subject: [PATCH 0065/1469] only do it in case of short strings git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@65 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/BIT_STRING.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index 4914b2074..7727d78cb 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -78,7 +78,7 @@ BIT_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, * Hexadecimal dump. */ for(buf++; buf < end; buf++) { - if(((buf - st->buf) - 1) % 16 == 0) { + if(((buf - st->buf) - 1) % 16 == 0 && (st->size > 16)) { int i; /* Indentation */ if(cb("\n", 1, app_key)) return -1; From ed63d558bc02bfc86984dff3f10fc5f4b00c1890 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 26 Jul 2004 14:10:42 +0000 Subject: [PATCH 0066/1469] removed double define git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@66 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OCTET_STRING.h | 1 - 1 file changed, 1 deletion(-) diff --git a/skeletons/OCTET_STRING.h b/skeletons/OCTET_STRING.h index 1aed9a353..223e1da5b 100644 --- a/skeletons/OCTET_STRING.h +++ b/skeletons/OCTET_STRING.h @@ -46,6 +46,5 @@ OCTET_STRING_t *OCTET_STRING_new_fromBuf(const char *str, int size); /* Handy conversion from the C string into the OCTET STRING. */ #define OCTET_STRING_fromString(s, str) OCTET_STRING_fromBuf(s, str, -1); -#define OCTET_STRING_fromString(s, str) OCTET_STRING_fromBuf(s, str, -1); #endif /* _OCTET_STRING_H_ */ From d0c608e53e6b1055e913fb46260fd37c7a9f3254 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 7 Aug 2004 03:51:43 +0000 Subject: [PATCH 0067/1469] added asn_time2UT() function git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@67 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/UTCTime.c | 25 ++++++++++++++---- skeletons/UTCTime.h | 8 ++++-- skeletons/tests/check-UTCTime.c | 45 ++++++++++++++++++++++----------- 3 files changed, 56 insertions(+), 22 deletions(-) diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c index 5ce2708b4..2ebf43375 100644 --- a/skeletons/UTCTime.c +++ b/skeletons/UTCTime.c @@ -44,7 +44,7 @@ UTCTime_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, time_t tloc; errno = EPERM; /* Just an unlikely error code */ - tloc = asn_UT2time(st, 0); + tloc = asn_UT2time(st, 0, 0); if(tloc == -1 && errno != EPERM) { _ASN_ERRLOG("%s: Invalid time format: %s", td->name, strerror(errno)); @@ -68,11 +68,11 @@ UTCTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, int ret; errno = EPERM; - if(asn_UT2time(st, &tm) == -1 && errno != EPERM) + if(asn_UT2time(st, &tm, 1) == -1 && errno != EPERM) return cb("", 11, app_key); ret = snprintf(buf, sizeof(buf), - "%04d-%02d-%02d %02d:%02d%02d", + "%04d-%02d-%02d %02d:%02d%02d (GMT)", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); assert(ret > 0 && ret < (int)sizeof(buf)); @@ -83,7 +83,7 @@ UTCTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, } time_t -asn_UT2time(const UTCTime_t *st, struct tm *_tm) { +asn_UT2time(const UTCTime_t *st, struct tm *_tm, int as_gmt) { char buf[17+2]; /* "AAMMJJhhmmss+hhmm" = 17, + 2 = 19 */ GeneralizedTime_t gt; @@ -106,5 +106,20 @@ asn_UT2time(const UTCTime_t *st, struct tm *_tm) { gt.buf[1] = 0x30; } - return asn_GT2time(>, _tm); + return asn_GT2time(>, _tm, as_gmt); } + +UTCTime_t * +asn_time2UT(UTCTime_t *opt_ut, const struct tm *tm, int force_gmt) { + GeneralizedTime_t *gt = (GeneralizedTime_t *)opt_ut; + + gt = asn_time2GT(gt, tm, force_gmt); + if(gt == 0) return 0; + + assert(gt->size >= 2); + gt->size -= 2; + memmove(gt->buf, gt->buf + 2, gt->size + 1); + + return (UTCTime_t *)gt; +} + diff --git a/skeletons/UTCTime.h b/skeletons/UTCTime.h index 1e52388ed..d00dafb51 100644 --- a/skeletons/UTCTime.h +++ b/skeletons/UTCTime.h @@ -19,8 +19,12 @@ asn_struct_print_f UTCTime_print; * Some handy helpers. * ***********************/ -/* On error returns -1 and errno set to EINVAL */ struct tm; /* */ -time_t asn_UT2time(const UTCTime_t *, struct tm *_optional_tm4fill); + +/* See asn_GT2time() in GeneralizedTime.h */ +time_t asn_UT2time(const UTCTime_t *, struct tm *_optional_tm4fill, int as_gmt); + +/* See asn_time2GT() in GeneralizedTime.h */ +UTCTime_t *asn_time2UT(UTCTime_t *__opt_ut, const struct tm *, int force_gmt); #endif /* _UTCTime_H_ */ diff --git a/skeletons/tests/check-UTCTime.c b/skeletons/tests/check-UTCTime.c index 7522140ea..99ea4feb1 100644 --- a/skeletons/tests/check-UTCTime.c +++ b/skeletons/tests/check-UTCTime.c @@ -5,7 +5,7 @@ #include "../constraints.c" static void -check(char *time_str, time_t sample) { +check(char *time_str, time_t sample, int as_gmt) { UTCTime_t gt; struct tm tm; time_t tloc; @@ -13,7 +13,7 @@ check(char *time_str, time_t sample) { gt.buf = time_str; gt.size = strlen(time_str); - tloc = asn_UT2time(>, &tm); + tloc = asn_UT2time(>, &tm, as_gmt); printf("[%s] -> %ld == %ld\n", time_str, (long)tloc, (long)sample); if(tloc != -1) printf("\t%d-%d-%dT%02d:%02d:%02d %ld\n", @@ -26,29 +26,44 @@ check(char *time_str, time_t sample) { tm.tm_gmtoff ); assert(tloc == sample); + + assert(tloc == -1 || as_gmt == 0 || tm.tm_gmtoff == 0); + + if(as_gmt) check(time_str, sample, as_gmt); } int main(int ac, char **av) { - check("0401250", -1); - check("0401250930", -1); /* "Z" or "(+|-)hhmm" required */ - check("04012509300", -1); - check("040125093000-", -1); - check("040125093007-0", -1); - check("040125093007-080", -1); - check("0401250930.01Z", -1); + check("0401250", -1, 0); + check("0401250930", -1, 0); /* "Z" or "(+|-)hhmm" required */ + check("04012509300", -1, 0); + check("040125093000-", -1, 0); + check("040125093007-0", -1, 0); + check("040125093007-080", -1, 0); + check("0401250930.01Z", -1, 0); - check("040125093007Z", 1075023007); - check("040125093007+00", 1075023007); - check("040125093007-0800", 1075051807); + check("040125093007Z", 1075023007, 0); + check("040125093007+00", 1075023007, 0); + check("040125093007-0800", 1075051807, 0); if(ac > 1) { /* These will be valid only inside PST time zone */ - check("040125093007", 1075051807); - check("040125093000,01", 1075051800); - check("040125093000,1234", 1075051800); + check("040125093007", 1075051807, 0); + check("040125093000,01", 1075051800, 0); + check("040125093000,1234", 1075051800, 0); } return 0; } + + +/* + * Dummy function. + */ + +der_enc_rval_t +OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { + der_enc_rval_t erval; + return erval; +} From 81057a88004219b5ff7a7fff9bfcaa437723b814 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 7 Aug 2004 03:52:26 +0000 Subject: [PATCH 0068/1469] improved asn_GT2time() and added asn_time2GT() function git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@68 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 1 + skeletons/GeneralizedTime.c | 182 ++++++++++++++++++++---- skeletons/GeneralizedTime.h | 23 ++- skeletons/tests/check-GeneralizedTime.c | 89 +++++++++--- 4 files changed, 244 insertions(+), 51 deletions(-) diff --git a/ChangeLog b/ChangeLog index d1371bf56..6af592e0d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,7 @@ * Fixed application-level problem in SET OF/SEQUENCE OF array cleanup. (Severity: medium, Security impact: low) + * Improved asn_GT2time() and added asn_time2{GT,UT}() functions. 0.8.15: 2004-Jul-20 diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 1dadb92de..5a3120d18 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -21,7 +21,7 @@ asn1_TYPE_descriptor_t asn1_DEF_GeneralizedTime = { "GeneralizedTime", GeneralizedTime_constraint, /* Check validity of time */ OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + GeneralizedTime_encode_der, /* Implemented in terms of OCTET STRING */ GeneralizedTime_print, OCTET_STRING_free, 0, /* Use generic outmost tag fetcher */ @@ -45,7 +45,7 @@ GeneralizedTime_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, time_t tloc; errno = EPERM; /* Just an unlikely error code */ - tloc = asn_GT2time(st, 0); + tloc = asn_GT2time(st, 0, 0); if(tloc == -1 && errno != EPERM) { _ASN_ERRLOG("%s: Invalid time format: %s", td->name, strerror(errno)); @@ -55,6 +55,47 @@ GeneralizedTime_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } +der_enc_rval_t +GeneralizedTime_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + GeneralizedTime_t *st = ptr; + der_enc_rval_t erval; + + /* If not canonical DER, re-encode into canonical DER. */ + if(st->size && st->buf[st->size-1] != 'Z') { + struct tm tm; + time_t tloc; + + errno = EPERM; + tloc = asn_GT2time(st, &tm, 1); /* Recognize time */ + if(tloc == -1 && errno != EPERM) { + /* Failed to recognize time. Fail completely. */ + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = ptr; + return erval; + } + st = asn_time2GT(0, &tm, 1); /* Save time canonically */ + if(!st) { + /* Memory allocation failure. */ + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = ptr; + return erval; + } + } + + erval = OCTET_STRING_encode_der(td, st, tag_mode, tag, cb, app_key); + + if(st != ptr) { + FREEMEM(st->buf); + FREEMEM(st); + } + + return erval; +} + int GeneralizedTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { @@ -69,11 +110,11 @@ GeneralizedTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, int ret; errno = EPERM; - if(asn_GT2time(st, &tm) == -1 && errno != EPERM) + if(asn_GT2time(st, &tm, 1) == -1 && errno != EPERM) return cb("", 11, app_key); ret = snprintf(buf, sizeof(buf), - "%04d-%02d-%02d %02d:%02d%02d", + "%04d-%02d-%02d %02d:%02d%02d (GMT)", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); assert(ret > 0 && ret < (int)sizeof(buf)); @@ -96,19 +137,19 @@ GeneralizedTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, * Where to look for offset from GMT, Phase II. */ #ifdef HAVE_TM_ZONE -#define GMTOFF (tm_s.tm_gmtoff) +#define GMTOFF(tm) ((tm).tm_gmtoff) #else /* HAVE_TM_ZONE */ -#define GMTOFF (-timezone) +#define GMTOFF(tm) (-timezone) #endif /* HAVE_TM_ZONE */ time_t -asn_GT2time(const GeneralizedTime_t *st, struct tm *_tm) { +asn_GT2time(const GeneralizedTime_t *st, struct tm *ret_tm, int as_gmt) { struct tm tm_s; uint8_t *buf; uint8_t *end; - int tm_gmtoff_h = 0; - int tm_gmtoff_m = 0; - int tm_gmtoff = 0; /* h + m */ + int gmtoff_h = 0; + int gmtoff_m = 0; + int gmtoff = 0; /* h + m */ int offset_specified = 0; time_t tloc; @@ -240,22 +281,22 @@ asn_GT2time(const GeneralizedTime_t *st, struct tm *_tm) { return -1; } buf++; - B2F(tm_gmtoff_h); - B2F(tm_gmtoff_h); + B2F(gmtoff_h); + B2F(gmtoff_h); if(buf[-3] == 0x2D) /* Negative */ - tm_gmtoff = -1; + gmtoff = -1; else - tm_gmtoff = 1; + gmtoff = 1; if((end - buf) == 2) { - B2F(tm_gmtoff_m); - B2F(tm_gmtoff_m); + B2F(gmtoff_m); + B2F(gmtoff_m); } else if(end != buf) { errno = EINVAL; return -1; } - tm_gmtoff = tm_gmtoff * (3600 * tm_gmtoff_h + 60 * tm_gmtoff_m); + gmtoff = gmtoff * (3600 * gmtoff_h + 60 * gmtoff_m); /* Fall through */ utc_finish: @@ -282,25 +323,110 @@ asn_GT2time(const GeneralizedTime_t *st, struct tm *_tm) { tm_s.tm_year -= 1900; tm_s.tm_isdst = -1; - tloc = mktime(&tm_s); + tm_s.tm_sec -= gmtoff; + + /*** AT THIS POINT tm_s is either GMT or local (unknown) ****/ + + if(offset_specified) + tloc = timegm(&tm_s); + else { + /* + * Without an offset (or 'Z'), + * we can only guess that it is a local zone. + * Interpret it in this fashion. + */ + tloc = mktime(&tm_s); + } if(tloc == -1) { errno = EINVAL; return -1; } - if(offset_specified) { - /* - * Offset from GMT is specified in the time expression. - */ - tloc += GMTOFF - tm_gmtoff; - if(_tm && (localtime_r(&tloc, &tm_s) == NULL)) { - /* Could not reconstruct the time */ - return -1; + if(ret_tm) { + if(as_gmt) { + if(offset_specified) { + *ret_tm = tm_s; + } else { + if(gmtime_r(&tloc, ret_tm) == 0) { + errno = EINVAL; + return -1; + } + } + } else { + if(localtime_r(&tloc, ret_tm) == 0) { + errno = EINVAL; + return -1; + } } } - if(_tm) memcpy(_tm, &tm_s, sizeof(struct tm)); - return tloc; } + +GeneralizedTime_t * +asn_time2GT(GeneralizedTime_t *opt_gt, const struct tm *tm, int force_gmt) { + struct tm tm_s; + long gmtoff; + const unsigned int buf_size = 24; /* 4+2+2 +2+2+2 +4 + cushion */ + char *buf; + char *p; + int size; + + /* Check arguments */ + if(!tm) { + errno = EINVAL; + return 0; + } + + /* Pre-allocate a buffer of sufficient yet small length */ + buf = MALLOC(buf_size); + if(!buf) return 0; + + gmtoff = GMTOFF(*tm); + + if(force_gmt && gmtoff) { + tm_s = *tm; + tm_s.tm_sec -= gmtoff; + timegm(&tm_s); /* Fix the time */ + assert(!GMTOFF(tm_s)); + tm = &tm_s; + } + + size = snprintf(buf, buf_size, "%04d%02d%02d%02d%02d%02d", + tm->tm_year + 1900, + tm->tm_mon + 1, + tm->tm_mday, + tm->tm_hour, + tm->tm_min, + tm->tm_sec + ); + assert(size == 14); + + p = buf + size; + if(force_gmt) { + *p++ = 0x5a; /* 'Z' */ + *p++ = 0; + size++; + } else { + int ret = snprintf(p, buf_size - size, "%+03ld%02ld", + gmtoff / 3600, gmtoff % 3600); + assert(ret >= 5 && ret <= 7); + size += ret; + } + + if(opt_gt) { + if(opt_gt->buf) + FREEMEM(opt_gt->buf); + } else { + opt_gt = CALLOC(1, sizeof *opt_gt); + if(!opt_gt) { free(buf); return 0; } + } + + opt_gt->buf = buf; + opt_gt->size = size; + + return opt_gt; +} + + diff --git a/skeletons/GeneralizedTime.h b/skeletons/GeneralizedTime.h index d8176be08..a7a8a4a2d 100644 --- a/skeletons/GeneralizedTime.h +++ b/skeletons/GeneralizedTime.h @@ -13,14 +13,33 @@ typedef OCTET_STRING_t GeneralizedTime_t; /* Implemented using OCTET STRING */ extern asn1_TYPE_descriptor_t asn1_DEF_GeneralizedTime; asn_constr_check_f GeneralizedTime_constraint; +der_type_encoder_f GeneralizedTime_encode_der; asn_struct_print_f GeneralizedTime_print; /*********************** * Some handy helpers. * ***********************/ -/* On error returns -1 and errno set to EINVAL */ struct tm; /* */ -time_t asn_GT2time(const GeneralizedTime_t *, struct tm *_optional_tm4fill); + +/* + * Convert a GeneralizedTime structure into time_t + * and optionally into struct tm. + * If as_gmt is given, the resulting _optional_tm4fill will have a GMT zone, + * instead of default local one. + * On error returns -1 and errno set to EINVAL + */ +time_t asn_GT2time(const GeneralizedTime_t *, struct tm *_optional_tm4fill, + int as_gmt); + +/* + * Convert a struct tm into GeneralizedTime. + * If __opt_gt is not given, this function will try to allocate one. + * If force_gmt is given, the resulting GeneralizedTime will be forced + * into a GMT time zone (encoding ends with 'Z'). + * On error, this function returns 0 and sets errno. + */ +GeneralizedTime_t *asn_time2GT(GeneralizedTime_t *__opt_gt, const struct tm *, + int force_gmt); #endif /* _GeneralizedTime_H_ */ diff --git a/skeletons/tests/check-GeneralizedTime.c b/skeletons/tests/check-GeneralizedTime.c index 3451cffec..5a6cb0b25 100644 --- a/skeletons/tests/check-GeneralizedTime.c +++ b/skeletons/tests/check-GeneralizedTime.c @@ -3,7 +3,7 @@ #include "../constraints.c" static void -check(char *time_str, time_t sample) { +check(char *time_str, time_t expect, int as_gmt) { GeneralizedTime_t gt; struct tm tm; time_t tloc; @@ -11,44 +11,91 @@ check(char *time_str, time_t sample) { gt.buf = time_str; gt.size = strlen(time_str); - tloc = asn_GT2time(>, &tm); - printf("[%s] -> %ld == %ld\n", time_str, (long)tloc, (long)sample); + tloc = asn_GT2time(>, &tm, as_gmt); + printf("%s: [%s] -> %ld == %ld\n", + as_gmt?"GMT":"ofs", time_str, (long)tloc, (long)expect); if(tloc != -1) - printf("\t%d-%d-%dT%02d:%02d:%02d %ld\n", + printf("\t%04d-%02d-%02dT%02d:%02d:%02d%+03ld%02ld\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, - tm.tm_gmtoff + (tm.tm_gmtoff / 3600), + labs(tm.tm_gmtoff % 3600) ); - assert(tloc == sample); + assert(tloc == expect); + + assert(tloc == -1 || as_gmt == 0 || tm.tm_gmtoff == 0); + + if(!as_gmt) check(time_str, expect, 1); +} + +static void +rcheck(time_t tloc, const char *expect, int force_gmt) { + GeneralizedTime_t *gt; + struct tm tm, *tmp; + + tmp = localtime_r(&tloc, &tm); + assert(tmp); + + gt = asn_time2GT(0, &tm, force_gmt); + if(gt) { + assert(expect); + printf("[%s] vs [%s] (%d)\n", + gt->buf, expect, force_gmt); + assert(gt->size == strlen(gt->buf)); + assert(!strcmp(gt->buf, expect)); + } else { + assert(!expect); + } } int main(int ac, char **av) { - check("200401250", -1); - check("2004012509300", -1); - check("20040125093000-", -1); - check("20040125093007-0", -1); - check("20040125093007-080", -1); - check("200401250930.01Z", -1); + check("200401250", -1, 0); + check("2004012509300", -1, 0); + check("20040125093000-", -1, 0); + check("20040125093007-0", -1, 0); + check("20040125093007-080", -1, 0); + check("200401250930.01Z", -1, 0); + + /* These six are from X.690:11.7.5 */ + check("19920520240000Z", -1, 0); /* midnight represented incorrectly */ + //check("19920622123421.0Z", -1, 0); /* spurious trailing zeros */ + //check("19920722132100.30Z", -1, 0); /* spurious trailing zeros */ + check("19920521000000Z", 706406400, 0); + check("19920622123421Z", 709216461, 0); + check("19920722132100.3Z", 711811260, 0); - check("20040125093007Z", 1075023007); - check("20040125093007+00", 1075023007); - check("20040125093007.01+0000", 1075023007); - check("20040125093007,1+0000", 1075023007); - check("20040125093007-0800", 1075051807); + check("20040125093007Z", 1075023007, 0); + check("20040125093007+00", 1075023007, 0); + check("20040125093007.01+0000", 1075023007, 0); + check("20040125093007,1+0000", 1075023007, 0); + check("20040125093007-0800", 1075051807, 0); if(ac > 1) { /* These will be valid only inside PST time zone */ - check("20040125093007", 1075051807); - check("200401250930", 1075051800); - check("20040125093000,01", 1075051800); - check("20040125093000,1234", 1075051800); + check("20040125093007", 1075051807, 0); + check("200401250930", 1075051800, 0); + check("20040125093000,01", 1075051800, 0); + check("20040125093000,1234", 1075051800, 0); } + rcheck(1075023007, "20040125013007-0800", 0); + rcheck(1075023007, "20040125093007Z", 1); + return 0; } + +/* + * Dummy function. + */ + +der_enc_rval_t +OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { + der_enc_rval_t erval; + return erval; +} From ea4ec1db8bf0df2a0f61132a52b36e4ac3a5f410 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 7 Aug 2004 03:59:39 +0000 Subject: [PATCH 0069/1469] version git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@69 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/Makefile.in | 2 +- configure | 2 +- configure.in | 2 +- libasn1parser/Makefile.in | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/asn1c/tests/Makefile.in b/asn1c/tests/Makefile.in index fe884ca15..6f26e1abf 100644 --- a/asn1c/tests/Makefile.in +++ b/asn1c/tests/Makefile.in @@ -156,7 +156,7 @@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ -check_SCRIPTS = ./check-assembly.sh +check_SCRIPTS = check-assembly.sh TESTS_ENVIRONMENT = ./check-assembly.sh TESTS = check-*.c EXTRA_DIST = ${check_SCRIPTS} check-*.c diff --git a/configure b/configure index a8c1abc25..19ecc56dd 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.8.15 + VERSION=0.8.16 cat >>confdefs.h <<_ACEOF diff --git a/configure.in b/configure.in index 359e31f92..176d6695d 100644 --- a/configure.in +++ b/configure.in @@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_SYSTEM AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.8.15) +AM_INIT_AUTOMAKE(asn1c, 0.8.16) AC_SUBST(PATH) diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index f405e604e..77a02d476 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -544,8 +544,8 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." - -rm -f asn1p_y.h -rm -f asn1p_l.c + -rm -f asn1p_y.h -rm -f asn1p_y.c clean: clean-am From 0f8e5c1b25de03cccd9b64a1f0d60cb63a5acbd8 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 7 Aug 2004 04:16:42 +0000 Subject: [PATCH 0070/1469] time zone-dependent stuff moved under an if git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@70 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/check-GeneralizedTime.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/skeletons/tests/check-GeneralizedTime.c b/skeletons/tests/check-GeneralizedTime.c index 5a6cb0b25..65882d45a 100644 --- a/skeletons/tests/check-GeneralizedTime.c +++ b/skeletons/tests/check-GeneralizedTime.c @@ -76,16 +76,17 @@ main(int ac, char **av) { check("20040125093007,1+0000", 1075023007, 0); check("20040125093007-0800", 1075051807, 0); + rcheck(1075023007, "20040125093007Z", 1); + if(ac > 1) { /* These will be valid only inside PST time zone */ check("20040125093007", 1075051807, 0); check("200401250930", 1075051800, 0); check("20040125093000,01", 1075051800, 0); check("20040125093000,1234", 1075051800, 0); - } - rcheck(1075023007, "20040125013007-0800", 0); - rcheck(1075023007, "20040125093007Z", 1); + rcheck(1075023007, "20040125013007-0800", 0); + } return 0; } From caba97b7087fdb606f8cc502e46cdfc8513d7985 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 7 Aug 2004 05:00:07 +0000 Subject: [PATCH 0071/1469] catchy wording git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@71 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-usage.lyx | 14 ++++++++++---- doc/asn1c-usage.pdf | Bin 129406 -> 188026 bytes 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/doc/asn1c-usage.lyx b/doc/asn1c-usage.lyx index e4519966a..03b1fc9e7 100644 --- a/doc/asn1c-usage.lyx +++ b/doc/asn1c-usage.lyx @@ -26,7 +26,7 @@ \layout Title -ASN.1 Compiler: Usage +Using the Free ASN.1 Compiler \layout Author Lev Walkin < @@ -43,9 +43,12 @@ Lev Walkin < \end_inset +\layout Part + +ASN.1 Basics \layout Chapter -Basics of ASN.1 +Abstract Syntax Notation: ASN.1 \layout Standard @@ -59,7 +62,7 @@ This chapter defines some basic ASN.1 concepts and describes several most \end_inset - or the ASN.1 standard itself + or the ASN.1 body of standards itself \begin_inset LatexCommand \cite{ITU-T/ASN.1} \end_inset @@ -991,9 +994,12 @@ SetOfApples :: SET OF Apple \layout LyX-Code FruitBag ::= SET OF ENUMERATED { apple, orange } +\layout Part + +Using the ASN.1 Compiler \layout Chapter -ASN.1 Compiler Usage +Introduction to the ASN.1 Compiler \layout Standard The purpose of the ASN.1 compiler, of which this document is part, is to diff --git a/doc/asn1c-usage.pdf b/doc/asn1c-usage.pdf index 1d0d28def1788d62836475b5f98ca8e6718ef655..5601cd2e490afdea96c30c66c128dd37e17cefc3 100644 GIT binary patch literal 188026 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 KZUuEk$o~LGv)M}k literal 129406 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 Date: Sat, 7 Aug 2004 05:01:45 +0000 Subject: [PATCH 0072/1469] BIT STRING pretty-printing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@72 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index 6af592e0d..da492e2e2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,7 @@ * Fixed application-level problem in SET OF/SEQUENCE OF array cleanup. (Severity: medium, Security impact: low) * Improved asn_GT2time() and added asn_time2{GT,UT}() functions. + * BIT STRING pretty-printing. 0.8.15: 2004-Jul-20 From 9ca15049a5f5da748dbe8da3eb36142475c8616b Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 7 Aug 2004 06:03:15 +0000 Subject: [PATCH 0073/1469] .html version git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@73 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/Makefile.am | 2 +- doc/asn1c-usage.html | 1172 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1173 insertions(+), 1 deletion(-) create mode 100644 doc/asn1c-usage.html diff --git a/doc/Makefile.am b/doc/Makefile.am index be8cd82c1..993ff95a1 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -1,3 +1,3 @@ -EXTRA_DIST = *.pdf +EXTRA_DIST = *.pdf *.html CLEANFILES = *.*~ diff --git a/doc/asn1c-usage.html b/doc/asn1c-usage.html new file mode 100644 index 000000000..8aeafae17 --- /dev/null +++ b/doc/asn1c-usage.html @@ -0,0 +1,1172 @@ + + + + + +Using the Free ASN.1 Compiler + + + + + + + + + + + +

+ +

+ +

+

Using the Free ASN.1 Compiler

+ +

Lev Walkin <vlm@lionet.info>

+
+
+ +
+ + + + + +

+ +

+ASN.1 Basics +

+ +

+ +

+Abstract Syntax Notation: ASN.1 +

+ +

+This chapter defines some basic ASN.1 concepts and describes +several most widely used types. It is by no means an authoritative +or complete reference. For more complete ASN.1 description, please +refer to Olivier Dubuisson's book [Dub00] or the ASN.1 body +of standards itself [ITU-T/ASN.1]. + +

+The Abstract Syntax Notation One is used to formally describe the +semantics of data transmitted across the network. Two communicating +parties may have different formats of their native data types (i.e. +number of bits in the integer type), thus it is important to have +a way to describe the data in a manner which is independent from the +particular machine's representation. The ASN.1 specifications is used +to achieve one or more of the following: + +

+ +

    +
  • The specification expressed in the ASN.1 notation is a formal and +precise way to communicate the data semantics to human readers; +
  • +
  • The ASN.1 specifications may be used as input for automatic compilers +which produce the code for some target language (C, C++, Java, etc) +to encode and decode the data according to some encoding rules (which +are also defined by the ASN.1 standard). +
  • +
+Consider the following example: + +

+ +

+
+Rectangle ::= SEQUENCE {
+    height  INTEGER,
+    width   INTEGER
+}
+
+
+
+This ASN.1 specification describes a constructed type, Rectangle, +containing two integer fields. This specification may tell the reader +that there is this kind of data structure and that some entity may +be prepared to send or receive it. The question on how that +entity is going to send or receive the encoded data is outside +the scope of ASN.1. For example, this data structure may be encoded +according to some encoding rules and sent to the destination using +the TCP protocol. The ASN.1 specifies several ways of encoding (or +''serializing'', or ''marshaling'') the data: BER, CER, DER and +XER, some of them which will be described later. + +

+The complete specification must be wrapped in a module, which looks +like this: + +

+ +

+
+UsageExampleModule1
+    { iso org(3) dod(6) internet(1) private(4)
+      enterprise(1) spelio(9363) software(1)
+      asn1c(5) docs(2) usage(1) 1 } 
+    AUTOMATIC TAGS DEFINITIONS ::=
+BEGIN
+ 
+-- This is a comment which describes nothing.
+Rectangle ::= SEQUENCE {
+    height  INTEGER,        -- Height of the rectangle
+    width   INTEGER,        -- Width of the rectangle
+}
+ 
+END
+
+
+
+The module header consists of module name (UsageExampleModule1), the +module object identifier ({...}), some flags (AUTOMATIC TAGS) and +''DEFINITIONS ::= BEGIN''. The module ends with an ''END'' statement. + +

+ +

+Some of the ASN.1 Basic Types +

+ +

+ +

+The BOOLEAN type +

+ +

+The BOOLEAN type models the simple binary TRUE/FALSE, YES/NO, ON/OFF +or a similar kind of two-way choice. + +

+ +

+The INTEGER type +

+ +

+The INTEGER type is a signed natural number type without any restrictions +on its size. If the automatic checking on INTEGER value bounds are +necessary, the subtype constraints must be used. + +

+ +

+
+SimpleInteger ::= INTEGER
+-- An integer with a very limited range
+SmallInt ::= INTEGER (0..127)
+-- Integer, negative
+NegativeInt ::= INTEGER (MIN..0)
+
+
+
+ +

+ +

+The ENUMERATED type +

+ +

+The ENUMERATED type is semantically equivalent to the INTEGER type +with some integer values explicitly named. + +

+ +

+
+FruitId ::= ENUMERATED { apple(1), orange(2) }
+-- The numbers in braces are optional,
+-- the enumeration may be performed
+-- automatically by the compiler
+ComputerOSType ::= ENUMERATED {
+    FreeBSD,          -- will be 0
+    Windows,          -- will be 1
+    Solaris(5),       -- will remain 5
+    Linux,            -- will be 6
+    MacOS             -- will be 7
+}
+
+
+
+ +

+ +

+The OCTET STRING type +

+ +

+This type models the sequence of 8-bit bytes. This may be used to +transmit some opaque data or data serialized by other types of encoders +(i.e. video file, photo picture, etc). + +

+ +

+The OBJECT IDENTIFIER type +

+ +

+The OBJECT IDENTIFIER is used to represent the unique identifier of +any object, starting from the very root of the registration tree. +If your organization needs to uniquely identify something (a router, +a room, a person, a standard, or whatever), you are encouraged to +get your own identification subtree at http://www.iana.org/protocols/forms.htm. + +

+For example, the very first ASN.1 module in this document has the +following OBJECT IDENTIFIER: 1 3 6 1 4 1 9363 1 5 2 1 1. + +

+ +

+
+ExampleOID ::= OBJECT IDENTIFIER
+usageExampleModule1-oid ExampleOID
+  ::= { 1 3 6 1 4 1 9363 1 5 2 1 1 }
+-- An identifier of the Internet.
+internet-id OBJECT IDENTIFIER
+  ::= { iso(1) identified-organization(3)
+        dod(6) internet(1) }
+
+
+
+As you see, names are optional. + +

+ +

+The RELATIVE-OID type +

+ +

+The RELATIVE-OID type has the semantics of a subtree of an OBJECT +IDENTIFIER. There may be no need to repeat the whole sequence of numbers +from the root of the registration tree where the only thing of interest +is some of the tree's subsequence. + +

+ +

+
+this-document RELATIVE-OID ::= { docs(2) usage(1) }
+this-example RELATIVE-OID ::= {
+    this-document assorted-examples(0) this-example(1) }
+
+
+
+ +

+ +

+Some of the ASN.1 String Types +

+ +

+ +

+The IA5String type +

+ +

+This is essentially the ASCII, with 128 character codes available +(7 lower bits of 8-bit byte). + +

+ +

+The UTF8String type +

+ +

+This is the character string which encodes the full Unicode range +(4 bytes) using multibyte character sequences. + +

+ +

+The NumericString type +

+ +

+This type represents the character string with the alphabet consisting +of numbers (''0'' to ''9'') and a space. + +

+ +

+The PrintableString type +

+ +

+The character string with the following alphabet: space, ''''' +(single quote), ''('', '')'', ''+'', +'','' (comma), ''-'', ''.'', ''/'', +digits (''0'' to ''9''), '':'', ''='', ''?'', +upper-case and lower-case letters (''A'' to ''Z'' and ''a'' +to ''z'') + +

+ +

+The VisibleString type +

+ +

+The character string with the alphabet which is more or less a subset +of ASCII between space and ''~'' (tilde). Alternatively, +the alphabet may be represented as the PrintableString alphabet described +earlier, plus the following characters: ''!'', '''''', +''#'', ''$'', ''%'', ''&'', +''*'', '';'', ''<'', ''>'', +''['', ''\'', '']'', +''^'', ''_'', ''`'' +(single left quote), ''{'', ''|'', ''}'', +''~''. + +

+ +

+ASN.1 Constructed Types +

+ +

+ +

+The SEQUENCE type +

+ +

+This is an ordered collection of other simple or constructed types. +The SEQUENCE constructed type resembles the C ''struct'' statement. + +

+ +

+
+Address ::= SEQUENCE {
+    -- The apartment number may be omitted
+    apartmentNumber     NumericString OPTIONAL,
+    streetName           PrintableString,
+    cityName             PrintableString,
+    stateName            PrintableString,
+    -- This one may be omitted too
+    zipNo                NumericString OPTIONAL
+}
+
+
+
+ +

+ +

+The SET type +

+ +

+This is a collection of other simple or constructed types. Ordering +is not important. The data may arrive in the order which is different +from the order of specification. Data is encoded in the order not +necessarily corresponding to the order of specification. + +

+ +

+The CHOICE type +

+ +

+This type is just a choice between the subtypes specified in it. The +CHOICE type contains at most one of the subtypes specified, and it +is always implicitly known which choice is being decoded or encoded. +This one resembles the C ''union'' statement. + +

+The following type defines a response code, which may be either an +integer code or a boolean ''true''/''false'' code. + +

+ +

+
+ResponseCode ::= CHOICE {
+    intCode    INTEGER,
+    boolCode   BOOLEAN
+}
+
+
+
+ +

+ +

+The SEQUENCE OF type +

+ +

+This one is the list (array) of simple or constructed types: + +

+ +

+
+-- Example 1
+ManyIntegers ::= SEQUENCE OF INTEGER
+-- Example 2
+ManyRectangles ::= SEQUENCE OF Rectangle
+-- More complex example:
+-- an array of structures defined in place.
+ManyCircles ::= SEQUENCE OF SEQUENCE {
+                            radius INTEGER
+                            }
+
+
+
+ +

+ +

+The SET OF type +

+ +

+The SET OF type models the bag of structures. It resembles the SEQUENCE +OF type, but the order is not important: i.e. the elements may arrive +in the order which is not necessarily the same as the in-memory order +on the remote machines. + +

+ +

+
+-- A set of structures defined elsewhere
+SetOfApples :: SET OF Apple
+-- Set of integers encoding the kind of a fruit
+FruitBag ::= SET OF ENUMERATED { apple, orange }
+
+
+
+ +

+ +

+Using the ASN.1 Compiler +

+ +

+ +

+Introduction to the ASN.1 Compiler +

+ +

+The purpose of the ASN.1 compiler, of which this document is part, +is to convert the ASN.1 specifications to some other target language +(currently, only C is supported2.1). The compiler reads the specification and emits a series of target +language structures and surrounding maintenance code. For example, +the C structure which may be created by compiler to represent the +simple Rectangle specification defined earlier in this document, +may look like this2.2: + +

+ +

+
+typedef struct Rectangle_s {
+    int height;
+    int width;
+} Rectangle_t;
+
+
+
+This would not be of much value for such a simple specification, so +the compiler goes further and actually produces the code which fills +in this structure by parsing the binary2.3 data provided in some buffer. It also produces the code that takes +this structure as an argument and performs structure serialization +by emitting a series of bytes. + +

+ +

+Quick start +

+ +

+After building and installing the compiler, the asn1c command may +be used to compile the ASN.1 specification2.4: + +

+ +

+
+asn1c <spec.asn1>
+
+
+
+If several specifications contain interdependencies, all of them must +be specified: + +

+ +

+
+asn1c <spec1.asn1> <spec2.asn1> ...
+
+
+
+The compiler -E and -EF options are used for testing the parser and +the semantic fixer, respectively. These options will instruct the +compiler to dump out the parsed (and fixed) ASN.1 specification as +it was "understood" by the compiler. It might might +be useful to check whether a particular syntactic construction is +properly supported by the compiler. + +

+ +

+
+asn1c -EF <spec-to-test.asn1>
+
+
+
+The -P option is used to dump the compiled output on the screen instead +of creating a bunch of .c and .h files on disk in the current directory. +You would probably want to start with -P option instead of creating +a mess in your current directory. + +

+ +

+Slow start +

+ +

+ +

+Recognizing compiler output +

+ +

+After compiling, the following entities will be created in your current +directory: + +

+ +

    +
  • A set of .c and .h files, generally a single pair for each type defined +in the ASN.1 specifications. These files will be named similarly to +the ASN.1 types (Rectangle.c and Rectangle.h for the +specification defined in the beginning of this document). +
  • +
  • A set of helper .c and .h files which contain generic encoders, decoders +and other useful routines. There will be many of them, some of them +even not necessary2.5, but the overall amount of code after compiling will be rather small +anyway. +
  • +
+It is your responsibility to create .c file with the int main() +routine and the Makefile (if needed). Compiler helps you with the +latter by creating the Makefile.am.sample, containing the skeleton +definition for the automake, should you want to use autotools. + +

+In other words, after compiling the Rectangle module, you have the +following set of files: { Makefile.am.sample, Rectangle.c, Rectangle.h, +... }, where ''...'' stands for the +set of additional ''helper'' files created by the compiler. If you +add the simple file with the int main() routine, it would even +be possible to compile everything with the single instruction: + +

+ +

+
+cc -o rectangle *.c   # It could be that simple2.6
+
+
+
+ +

+ +

+Invoking the ASN.1 helper code from the application +

+ +

+First of all, you would want to include one or more header files into +your application. For the Rectangle module, including the Rectangle.h +file is enough: + +

+ +

+
+#include <Rectangle.h>
+
+
+
+The header files defines the C structure corresponding to the ASN.1 +definition of a rectangle and the declaration of the ASN.1 type descriptor, +which is used as an argument to most of the functions provided by +the ASN.1 module. For example, here is the code which frees the Rectangle_t +structure: + +

+ +

+
+Rectangle_t *rect = ;
+asn1_DEF_Rectangle->free_struct(&asn1_DEF_Rectangle,
+    rect, 0);
+
+
+
+This code defines a rect pointer which points to the Rectangle_t +structure which needs to be freed. The second line invokes the generic +free_struct routine created specifically for this Rectangle_t structure. +The asn1_DEF_Rectangle is the type descriptor, which holds +a collection of generic routines to deal with the Rectangle_t structure. + +

+There are several generic functions available: + +

+

+
check_constraints
+
Check that the contents of the target structure +are semantically valid and constrained to appropriate implicit or +explicit subtype constraints. Please refer to Section sub:Validating-the-target. +
+
ber_decoder
+
This is the generic restartable2.7 BER decoder (Basic Encoding Rules). This decoder would create +and/or fill the target structure for you. Please refer to Section +[Decoding-BER]. +
+
der_encoder
+
This is the generic DER encoder (Distinguished Encoding +Rules). This decoder will take the target structure and encode it +into a series of bytes. Please refer to Section [Encoding-DER]. +
+
print_struct
+
This function convert the contents of the passed target +structure into human readable form. This form is not formal and cannot +be converted back into the structure, but it may turn out to be useful +for debugging or quick-n-dirty printing. Please refer to Section [Printing-the-target]. +
+
free_struct
+
This is a generic disposal which frees the target structure. +Please refer to Section [Freeing-the-target]. +
+
+Each of the above function takes the type descriptor (asn1_DEF_...) +and the target structure (rect, in the above example). The +target structure is typically created by the generic BER decoder or +by the application itself. + +

+Here is how the buffer can be deserialized into the structure: + +

+ +

+
+Rectangle_t *
+simple_deserializer(void *buffer, size_t buf_size) {
+    Rectangle_t *rect = 0;    /* Note this 0! */
+    ber_dec_rval_t rval;
+ 
+    rval = asn1_DEF_Rectangle->ber_decoder(
+          &asn1_DEF_Rectangle,
+          (void **)&rect,
+          buffer, buf_size,
+          0);
+ 
+    if(rval.code == RC_OK) {
+        return rect;          /* Decoding succeeded */
+    } else {
+        asn1_DEF_Rectangle->free_struct(
+            &asn1_DEF_Rectangle, rect, 0);
+        return 0;
+    }
+}
+
+
+
+The code above defines a function, simple_deserializer, which +takes a buffer and its length and expected to return a pointer to +the Rectangle_t structure. Inside, it tries to convert the bytes +passed into the target structure (rect) using the generic BER decoder +and returns the rect pointer afterwards. If the structure cannot be +deserialized, it frees the memory which might be left allocated by +the unfinished ber_decoder routine and returns NULL. This +freeing is necessary because the ber_decoder is a restartable procedure, +and may fail just because there is more data needs to be provided +before decoding could be finalized. The code above obviously does +not take into account the way the ber_decoder failed, so the +freeing is necessary because the part of the buffer may already be +decoded into the structure by the time something goes wrong. + +

+Restartable decoding is a little bit trickier: you need to provide +the old target structure pointer (which might be already half-decoded) +and react on RC_WMORE return code. This will be explained later in +Section sub:Decoding-BER + +

+ +


+Decoding BER +

+ +

+The Basic Encoding Rules describe the basic way how the structure +can be encoded and decoded. Several other encoding rules (CER, DER) +define a more restrictive versions of BER, so the generic BER parser +is also capable of decoding the data encoded by CER and DER encoders. +The opposite is not true. + +

+The ASN.1 compiler provides the generic BER decoder which is implicitly +capable of decoding BER, CER and DER encoded data. + +

+The decoder is restartable (stream-oriented), which means that in +case the buffer has less data than it is expected, the decoder will +process whatever it is available and ask for more data to be provided. +Please note that the decoder may actually process less data than it +is given in the buffer, which means that you should be able to make +the next buffer contain the unprocessed part of the previous buffer. + +

+Suppose, you have two buffers of encoded data: 100 bytes and 200 bytes. + +

+ +

    +
  • You may concatenate these buffers and feed the BER decoder with 300 +bytes of data, or +
  • +
  • You may feed it the first buffer of 100 bytes of data, realize that +the ber_decoder consumed only 95 bytes from it and later feed the +decoder with 205 bytes buffer which consists of 5 unprocessed bytes +from the first buffer and the latter 200 bytes from the second buffer. +
  • +
+This is not as convenient as it could be (like, the BER encoder would +consume the whole 100 bytes and keep these 5 bytes in some temporary +storage), but in case of stream-based processing it might actually +be OK. Suggestions are welcome. + +

+There are two ways to invoke a BER decoder. The first one is a direct +reference of the type-specific decoder. This way was shown in the +previous example of simple_deserializer function. The second +way is to invoke a ber_decode function, which is just a simple +wrapper of the former approach into a less wordy notation: + +

+ +

+
+rval = ber_decode(&asn1_DEF_Rectangle, (void **)&rect,
+    buffer, buf_size);
+
+
+
+Note that the initial (asn1_DEF_Rectangle->ber_decoder) reference +is gone, and also the last argument (0) is no longer necessary. + +

+These two ways of invocations are fully equivalent. + +

+The BER decoder may fail because (the following RC_... +codes are defined in ber_decoder.h): + +

+ +

    +
  • RC_WMORE: There is more data expected than it is provided (stream +mode continuation feature); +
  • +
  • RC_FAIL: General failure to decode the buffer; +
  • +
  • ... other codes may be defined as well. +
  • +
+Together with the return code (.code) the ber_dec_rval_t type contains +the number of bytes which is consumed from the buffer. In the previous +hypothetical example of two buffers (of 100 and 200 bytes), the first +call to ber_decode() would return with .code = RC_WMORE and .consumed += 95. The .consumed field of the BER decoder return value is always +valid, even if the decoder succeeds or fails with any other return +code. + +

+Please look into ber_decoder.h for the precise definition of ber_decode() +and related types. + +

+ +


+Encoding DER +

+ +

+The Distinguished Encoding Rules is the variant of BER encoding rules +which is oriented on representing the structures with length known +beforehand. This is probably exactly how you want to encode: either +after a BER decoding or after a manual fill-up, the target structure +contains the data which size is implicitly known before encoding. +The DER encoding is used, for example, to encode X.509 certificates. + +

+As with BER decoder, the DER encoder may be invoked either directly +from the ASN.1 type descriptor (asn1_DEF_Rectangle) or from the +stand-alone function, which is somewhat simpler: + +

+ +

+
+/*
+ * This is a custom function which writes the
+ * encoded output into some FILE stream.
+ */
+int _write_stream(void *buffer, size_t size, void *app_key) {
+    FILE *ostream = app_key;
+    size_t wrote;
+ 
+    wrote = fwrite(buffer, 1, size, ostream);
+ 
+    return (wrote == size) ? 0 : -1;
+}
+ 
+/*
+ * This is the serializer itself,
+ * it supplies the DER encoder with the
+ * pointer to the custom output function.
+ */
+ssize_t
+simple_serializer(FILE *ostream, Rectangle_t *rect) {
+    der_enc_rval_t rval;  /* Return value */
+ 
+    rval = der_encode(&asn1_DEF_Rect, rect,
+        _write_stream, ostream);
+    if(rval.encoded == -1) {
+        /*
+         * Failure to encode the rectangle data.
+         */
+        fprintf(stderr, ''Cannot encode %s: %s\n'',
+            rval.failed_type->name,
+            strerror(errno));
+        return -1;
+    } else {
+        /* Return the number of bytes */
+        return rval.encoded;
+    }
+}
+
+
+
+As you see, the DER encoder does not write into some sort of buffer +or something. It just invokes the custom function (possible, multiple +times) which would save the data into appropriate storage. The optional +argument app_key is opaque for the DER encoder code and just +used by _write_stream() as the pointer to the appropriate +output stream to be used. + +

+If the custom write function is not given (passed as 0), then the +DER encoder will essentially do the same thing (i.e., encode the data) +but no callbacks will be invoked (so the data goes nowhere). It may +prove useful to determine the size of the structure's encoding before +actually doing the encoding2.8. + +

+Please look into der_encoder.h for the precise definition of der_encode() +and related types. + +

+ +


+Validating the target structure +

+ +

+Sometimes the target structure needs to be validated. For example, +if the structure was created by the application (as opposed to being +decoded from some external source), some important information required +by the ASN.1 specification might be missing. On the other hand, the +successful decoding of the data from some external source does not +necessarily mean that the data is fully valid either. It might well +be the case that the specification describes some subtype constraints +that were not taken into account during decoding, and it would actually +be useful to perform the last check when the data is ready to be encoded +or when the data has just been decoded to ensure its validity according +to some stricter rules. + +

+The asn_check_constraints() function checks the type for various +implicit and explicit constraints. It is recommended to use asn_check_constraints() +function after each decoding and before each encoding. + +

+Please look into constraints.h for the precise definition of asn_check_constraints() +and related types. + +

+ +


+Printing the target structure +

+ +

+There are two ways to print the target structure: either invoke the +print_struct member of the ASN.1 type descriptor, or using the asn_fprint() +function, which is a simpler wrapper of the former: + +

+ +

+
+asn_fprint(stdout, &asn1_DEF_Rectangle, rect);
+
+
+
+Please look into constr_TYPE.h for the precise definition of asn_fprint() +and related types. + +

+ +


+Freeing the target structure +

+ +

+Freeing the structure is slightly more complex than it may seem to. +When the ASN.1 structure is freed, all the members of the structure +and their submembers etc etc are recursively freed too. But it might +not be feasible to free the structure itself. Consider the following +case: + +

+ +

+
+struct my_figure {       /* The custom structure */
+    int flags;           /* <some custom member> */
+    /* The type is generated by the ASN.1 compiler */
+    Rectangle_t rect;
+    /* other members of the structure */
+};
+
+
+
+In this example, the application programmer defined a custom structure +with one ASN.1-derived member (rect). This member is not a reference +to the Rectangle_t, but an in-place inclusion of the Rectangle_t +structure. If the freeing is necessary, the usual procedure of freeing +everything must not be applied to the &rect pointer itself, because +it does not point to the memory block directly allocated by memory +allocation routine, but instead lies within such a block allocated +for my_figure structure. + +

+To solve this problem, the free_struct routine has the additional +argument (besides the intuitive type descriptor and target structure +pointers), which is the flag specifying whether the outer pointer +itself must be freed (0, default) or it should be left intact (non-zero +value). + +

+ +

+
+/* Rectangle_t is defined within my_figure */
+struct my_figure *mf = ...;
+/*
+ * Freeing the Rectangle_td
+ * without freeing the mf->rect pointer
+ */
+asn1_DEF_Rectangle->free_struct(
+    &asn1_DEF_Rectangle, &mf->rect, 1 /* !free */);
+ 
+/* Rectangle_t is a stand-alone pointer */
+Rectangle_t *rect = ...;
+/*
+ * Freeing the Rectangle_t
+ * and freeing the rect pointer
+ */
+asn1_DEF_Rectangle->free_struct(
+    &asn1_DEF_Rectangle, rect, 0 /* free the pointer too */);
+
+
+
+It is safe to invoke the free_struct function with the target +structure pointer set to 0 (NULL), the function will do nothing. + +

+ +

+Bibliography +

Dub00 +
Olivier Dubuisson - ASN.1 Communication between heterogeneous +systems - Morgan Kaufmann Publishers, 2000. http://asn1.elibel.tm.fr/en/book/. +ISBN:0-12-6333361-0. +

ITU-T/ASN.1 +
ITU-T Study Group 17 - Languages for Telecommunication Systems http://www.itu.int/ITU-T/studygroups/com17/languages/
+ +

+


Footnotes

+
+
... supported2.1
+
C++ is ''supported'' too, as long as an object-oriented approach +is not a definitive factor. + +
+
... this2.2
+
-fnative-integers compiler option is used to produce basic +C int types instead of generic INTEGER_t. + +
+
... binary2.3
+
BER, CER and DER encodings are binary. However, the XER encoding is +text (XML) based. + +
+
... specification2.4
+
This is probably not what you want to try out right now - +read through the rest of this chapter to find out about -P option. + +
+
... necessary2.5
+
Soon the compiler will be modified to emit the smallest subset of +necessary files. + +
+
...that simple2.6
+
Provided that you've also created a .c file with the int main() +routine. + +
+
...restartable2.7
+
Restartable means that if the decoder encounters the end of the buffer, +it will fail, but may later be invoked again with the rest of the +buffer to continue decoding. + +
+
... encoding2.8
+
It is actually faster too: the encoder might skip over some computations +which aren't important for the size determination. + +
+


+
+Lev Walkin +2004-08-06 +
+ + From d49461f21951e13111476f24b2cb51ac5209e623 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 7 Aug 2004 06:13:03 +0000 Subject: [PATCH 0074/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@74 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/Makefile.in | 2 +- libasn1parser/Makefile.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/Makefile.in b/doc/Makefile.in index cf2e85e95..e34bd9d87 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -156,7 +156,7 @@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ -EXTRA_DIST = *.pdf +EXTRA_DIST = *.pdf *.html CLEANFILES = *.*~ all: all-am diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index 77a02d476..f405e604e 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -544,8 +544,8 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." - -rm -f asn1p_l.c -rm -f asn1p_y.h + -rm -f asn1p_l.c -rm -f asn1p_y.c clean: clean-am From e1f5ff13af81e2b6d2f7cfc56095ad8ca6a629be Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 7 Aug 2004 06:26:40 +0000 Subject: [PATCH 0075/1469] installing docs git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@75 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/Makefile.am | 5 +++++ doc/Makefile.in | 44 +++++++++++++++++++++++++++++++-------- libasn1parser/Makefile.in | 4 ++-- 3 files changed, 42 insertions(+), 11 deletions(-) diff --git a/doc/Makefile.am b/doc/Makefile.am index 993ff95a1..644f2ae48 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -1,3 +1,8 @@ +docsdir = $(datadir)/doc/asn1c + +docs_DATA = *.pdf *.html + EXTRA_DIST = *.pdf *.html + CLEANFILES = *.*~ diff --git a/doc/Makefile.in b/doc/Makefile.in index e34bd9d87..614f8ae11 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -13,6 +13,7 @@ # PARTICULAR PURPOSE. @SET_MAKE@ + srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ @@ -47,6 +48,9 @@ CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = +am__installdirs = "$(DESTDIR)$(docsdir)" +docsDATA_INSTALL = $(INSTALL_DATA) +DATA = $(docs_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_CFLAGS = @ADD_CFLAGS@ @@ -156,6 +160,8 @@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ +docsdir = $(datadir)/doc/asn1c +docs_DATA = *.pdf *.html EXTRA_DIST = *.pdf *.html CLEANFILES = *.*~ all: all-am @@ -200,6 +206,23 @@ clean-libtool: distclean-libtool: -rm -f libtool uninstall-info-am: +install-docsDATA: $(docs_DATA) + @$(NORMAL_INSTALL) + test -z "$(docsdir)" || $(mkdir_p) "$(DESTDIR)$(docsdir)" + @list='$(docs_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " $(docsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(docsdir)/$$f'"; \ + $(docsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(docsdir)/$$f"; \ + done + +uninstall-docsDATA: + @$(NORMAL_UNINSTALL) + @list='$(docs_DATA)'; for p in $$list; do \ + f="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " rm -f '$(DESTDIR)$(docsdir)/$$f'"; \ + rm -f "$(DESTDIR)$(docsdir)/$$f"; \ + done tags: TAGS TAGS: @@ -236,8 +259,11 @@ distdir: $(DISTFILES) done check-am: all-am check: check-am -all-am: Makefile +all-am: Makefile $(DATA) installdirs: + for dir in "$(DESTDIR)$(docsdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done install: install-am install-exec: install-exec-am install-data: install-data-am @@ -281,7 +307,7 @@ info: info-am info-am: -install-data-am: +install-data-am: install-docsDATA install-exec-am: @@ -307,17 +333,17 @@ ps: ps-am ps-am: -uninstall-am: uninstall-info-am +uninstall-am: uninstall-docsDATA uninstall-info-am .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-exec install-exec-am \ - install-info install-info-am install-man install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ - uninstall-info-am + install-data install-data-am install-docsDATA install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + uninstall uninstall-am uninstall-docsDATA uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index f405e604e..cae3f81a3 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -544,9 +544,9 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." - -rm -f asn1p_y.h - -rm -f asn1p_l.c -rm -f asn1p_y.c + -rm -f asn1p_l.c + -rm -f asn1p_y.h clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ From 8098252ba2e49e3bcabbb573aedf4a0b7f430636 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 10 Aug 2004 01:14:29 +0000 Subject: [PATCH 0076/1469] C++ compat git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@76 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_save.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c index 5e425d65f..3d806bc02 100644 --- a/libasn1compiler/asn1c_save.c +++ b/libasn1compiler/asn1c_save.c @@ -176,6 +176,8 @@ asn1c_save_streams(arg_t *arg) { "#define\t_%s_H_\n" "\n", header_id, header_id); + fprintf(fp_h, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n"); + fprintf(fp_h, "#include \n\n"); TQ_FOR(ot, &(cs->targets[OT_DEPS]), next) @@ -195,7 +197,9 @@ asn1c_save_streams(arg_t *arg) { assert(OT_MAX == 5); - fprintf(fp_h, "\n#endif\t/* _%s_H_ */\n", header_id); + fprintf(fp_h, "\n#ifdef __cplusplus\n}\n#endif\n\n" + "#endif\t/* _%s_H_ */\n", + header_id); fclose(fp_c); fclose(fp_h); From 33a4ff13f4e1798546d0fad6cd08add7a6021f9b Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 11 Aug 2004 05:21:32 +0000 Subject: [PATCH 0077/1469] removed duplicate includes; moved CHOICE enumeration to higher level git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@77 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/Makefile.in | 2 + libasn1compiler/asn1c_C.c | 129 ++++++++++++++----------------- libasn1compiler/asn1c_internal.h | 31 -------- libasn1compiler/asn1c_out.c | 20 ++++- libasn1compiler/asn1c_out.h | 67 +++++++++++++++- libasn1compiler/asn1c_save.c | 15 ++-- 6 files changed, 150 insertions(+), 114 deletions(-) diff --git a/libasn1compiler/Makefile.in b/libasn1compiler/Makefile.in index 032a8292a..74f98934e 100644 --- a/libasn1compiler/Makefile.in +++ b/libasn1compiler/Makefile.in @@ -101,6 +101,8 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ +CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index d561e029f..34594df77 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -45,31 +45,19 @@ static long compute_xxx_size(arg_t *arg, int _max); OUT("/* Context for parsing across buffer boundaries */\n"); \ OUT("ber_dec_ctx_t _ber_dec_ctx;\n")); -#define DEPENDENCIES do { \ - int saved_target = arg->target->target; \ - int saved_indent = arg->indent_level; \ - int comment_printed = 0; \ - REDIR(OT_DEPS); \ - arg->indent_level = 0; \ - TQ_FOR(v, &(expr->members), next) { \ - if((!(v->expr_type & ASN_CONSTR_MASK) \ - && v->expr_type > ASN_CONSTR_MASK) \ - || v->meta_type == AMT_TYPEREF) { \ - if(!comment_printed++) \ - OUT("/* Dependencies for %s */\n", \ - asn1c_type_name(arg, expr, TNF_UNMODIFIED)); \ - OUT("#include <%s.h>\n", \ - asn1c_type_name(arg, v, TNF_INCLUDE)); \ - } \ - } \ - if(expr->expr_type == ASN_CONSTR_SET_OF) \ - OUT("#include \n"); \ - if(expr->expr_type == ASN_CONSTR_SEQUENCE_OF) \ - OUT("#include \n"); \ - OUT("\n"); \ - REDIR(saved_target); \ - INDENT(saved_indent); \ - } while(0) +#define DEPENDENCIES do { \ + TQ_FOR(v, &(expr->members), next) { \ + if((!(v->expr_type & ASN_CONSTR_MASK) \ + && v->expr_type > ASN_CONSTR_MASK) \ + || v->meta_type == AMT_TYPEREF) { \ + GEN_INCLUDE(asn1c_type_name(arg, v, TNF_INCLUDE));\ + } \ + } \ + if(expr->expr_type == ASN_CONSTR_SET_OF) \ + GEN_INCLUDE("asn_SET_OF"); \ + if(expr->expr_type == ASN_CONSTR_SEQUENCE_OF) \ + GEN_INCLUDE("asn_SEQUENCE_OF"); \ +} while(0) #define MKID(id) asn1c_make_identifier(0, (id), 0) @@ -187,10 +175,11 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { return -1; } - REDIR(OT_STAT_DEFS); + GEN_INCLUDE("constr_SEQUENCE"); + if(!arg->embed) + GEN_DECLARE(expr); /* asn1_DEF_xxx */ - OUT("#include \n"); - OUT("\n"); + REDIR(OT_STAT_DEFS); /* * Print out the table according to which the parsing is performed. @@ -291,12 +280,6 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { OUT("};\n"); OUT("\n"); - p = MKID(expr->Identifier); - REDIR(OT_DEPS); - OUT("#include \n"); - OUT("\n"); - if(!arg->embed) - OUT("extern asn1_TYPE_descriptor_t asn1_DEF_%s;\n", p); REDIR(OT_TYPE_DECLS); return 0; @@ -413,12 +396,12 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { return -1; } + GEN_INCLUDE("constr_SET"); + if(!arg->embed) + GEN_DECLARE(expr); /* asn1_DEF_xxx */ REDIR(OT_STAT_DEFS); - OUT("#include \n"); - OUT("\n"); - /* * Print out the table according to which the parsing is performed. */ @@ -542,11 +525,6 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { OUT("};\n"); OUT("\n"); - REDIR(OT_DEPS); - OUT("#include \n"); - OUT("\n"); - if(!arg->embed) - OUT("extern asn1_TYPE_descriptor_t asn1_DEF_%s;\n", p); REDIR(OT_TYPE_DECLS); return 0; @@ -588,14 +566,16 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { int tags_impl_skip = 0; char *p; - REDIR(OT_DEPS); - + /* + * Print out the table according to which the parsing is performed. + */ if(seq_of) { - OUT("#include \n"); + GEN_INCLUDE("constr_SEQUENCE_OF"); } else { - OUT("#include \n"); - OUT("\n"); + GEN_INCLUDE("constr_SET_OF"); } + if(!arg->embed) + GEN_DECLARE(expr); /* asn1_DEF_xxx */ REDIR(OT_STAT_DEFS); @@ -660,9 +640,6 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { OUT("};\n"); OUT("\n"); - REDIR(OT_DEPS); - if(!arg->embed) - OUT("extern asn1_TYPE_descriptor_t asn1_DEF_%s;\n", p); REDIR(OT_TYPE_DECLS); return 0; @@ -676,7 +653,29 @@ asn1c_lang_C_type_CHOICE(arg_t *arg) { DEPENDENCIES; + REDIR(OT_DEPS); + p = MKID(expr->Identifier); + OUT("typedef enum %s_PR {\n", p); + INDENTED( + p = MKID(expr->Identifier); + OUT("%s_PR_NOTHING,\t" + "/* No components present */\n", p); + TQ_FOR(v, &(expr->members), next) { + if(v->expr_type == A1TC_EXTENSIBLE) { + OUT("/* Extensions may appear below */\n"); + continue; + } + p = MKID(expr->Identifier); + OUT("%s_PR_", p); + p = MKID(v->Identifier); + OUT("%s,\n", p, p); + } + ); + p = MKID(expr->Identifier); + OUT("} %s_PR_e;\n", p); + + REDIR(OT_TYPE_DECLS); if(arg->embed) { OUT("struct %s {\n", p); @@ -685,20 +684,7 @@ asn1c_lang_C_type_CHOICE(arg_t *arg) { } INDENTED( - OUT("enum {\n"); - INDENTED( - OUT("%s_PR_NOTHING,\t" - "/* No components present */\n", p); - TQ_FOR(v, &(expr->members), next) { - if(v->expr_type == A1TC_EXTENSIBLE) continue; - p = MKID(expr->Identifier); - OUT("%s_PR_", p); - p = MKID(v->Identifier); - OUT("%s,\n", p, p); - } - ); - OUT("} present;\n"); - + OUT("%s_PR_e present;\n", p); OUT("union {\n", p); TQ_FOR(v, &(expr->members), next) { EMBED(v); @@ -733,10 +719,11 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { return -1; } - REDIR(OT_STAT_DEFS); + GEN_INCLUDE("constr_CHOICE"); + if(!arg->embed) + GEN_DECLARE(expr); /* asn1_DEF_xxx */ - OUT("#include \n"); - OUT("\n"); + REDIR(OT_STAT_DEFS); /* * Print out the table according to which the parsing is performed. @@ -844,9 +831,6 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { OUT("};\n"); OUT("\n"); - REDIR(OT_DEPS); - if(!arg->embed) - OUT("extern asn1_TYPE_descriptor_t asn1_DEF_%s;\n", p); REDIR(OT_TYPE_DECLS); return 0; @@ -916,9 +900,8 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { return 0; } - REDIR(OT_DEPS); - OUT("#include <%s.h>\n", asn1c_type_name(arg, expr, TNF_INCLUDE)); + GEN_INCLUDE(asn1c_type_name(arg, expr, TNF_INCLUDE)); REDIR(OT_TYPE_DECLS); @@ -1069,6 +1052,8 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("asn_struct_print_f %s_print;\n", p); OUT("asn_struct_free_f %s_free;\n", p); + REDIR(OT_TYPE_DECLS); + return 0; } diff --git a/libasn1compiler/asn1c_internal.h b/libasn1compiler/asn1c_internal.h index 31bf69773..6192650c0 100644 --- a/libasn1compiler/asn1c_internal.h +++ b/libasn1compiler/asn1c_internal.h @@ -40,37 +40,6 @@ typedef struct arg_s { #include "asn1c_out.h" /* Handle output during compilation */ #include "asn1c_save.h" /* Save compiled output */ -#define INDENT(val) arg->indent_level += (val) -#define INDENTED(code) do { \ - INDENT(+1); \ - do { code; } while(0); \ - INDENT(-1); \ - } while(0) -#define FLAT(code) do { \ - int _il = arg->indent_level; \ - arg->indent_level = 0; \ - do { code; } while(0); \ - arg->indent_level = _il; \ - } while(0) -#define EMBED(ev) do { \ - REDIR(OT_TYPE_DECLS); \ - arg->embed++; \ - INDENTED(arg_t _tmp = *arg; \ - _tmp.expr = ev; \ - _tmp.default_cb(&_tmp); \ - ); \ - arg->embed--; \ - } while(0) -#define OUT(fmt, args...) asn1c_compiled_output(arg, fmt, ##args) -#define OUT_NOINDENT(fmt, args...) do { \ - int _saved_indent = arg->indent_level; \ - arg->indent_level = 0; \ - asn1c_compiled_output(arg, fmt, ##args);\ - arg->indent_level = _saved_indent; \ -} while(0) - -#define REDIR(foo) do { arg->target->target = foo; } while(0) - /* * Logging. */ diff --git a/libasn1compiler/asn1c_out.c b/libasn1compiler/asn1c_out.c index a6432418e..2f7c5732c 100644 --- a/libasn1compiler/asn1c_out.c +++ b/libasn1compiler/asn1c_out.c @@ -35,6 +35,8 @@ asn1c_compiled_output(arg_t *arg, const char *fmt, ...) { if(ret == -1) return -1; } } + if(lf_found) + arg->indented = 0; /* * Estimate necessary size. @@ -66,10 +68,22 @@ asn1c_compiled_output(arg_t *arg, const char *fmt, ...) { m->len = ret; va_end(ap); - TQ_ADD(&(arg->target->targets[arg->target->target]), m, next); + if(arg->target->target == OT_INCLUDES) { + out_chunk_t *v; + TQ_FOR(v, &(arg->target->targets[OT_INCLUDES]), next) { + if(m->len == v->len + && !memcmp(m->buf, v->buf, m->len)) + break; + } + if(v) { + /* Entry is already present. Skip it. */ + free(m->buf); + free(m); + return 0; + } + } - if(lf_found) - arg->indented = 0; + TQ_ADD(&(arg->target->targets[arg->target->target]), m, next); return 0; } diff --git a/libasn1compiler/asn1c_out.h b/libasn1compiler/asn1c_out.h index 2267d5dbe..e989f445b 100644 --- a/libasn1compiler/asn1c_out.h +++ b/libasn1compiler/asn1c_out.h @@ -13,7 +13,8 @@ typedef struct out_chunk { typedef struct compiler_streams { enum { - OT_DEPS, /* Dependencies */ + OT_INCLUDES, /* #include files */ + OT_DEPS, /* Dependencies (other than #includes) */ OT_TYPE_DECLS, /* Type declarations */ OT_FUNC_DECLS, /* Function declarations */ OT_STAT_DEFS, /* Static definitions */ @@ -24,8 +25,70 @@ typedef struct compiler_streams { } compiler_streams_t; static char *_compiler_stream2str[] __attribute__ ((unused)) - = { "DEPS", "TYPE-DECLS", "FUNC-DECLS", "STAT-DEFS", "CODE" }; + = { "INCLUDES", "DEPS", "TYPE-DECLS", "FUNC-DECLS", "STAT-DEFS", "CODE" }; int asn1c_compiled_output(arg_t *arg, const char *fmt, ...); + +/***************************************************************** + * Useful macros for invoking asn1c_compiled_output() and friends. + */ + +/* Redirect output to a different stream. */ +#define REDIR(foo) do { arg->target->target = foo; } while(0) + +#define INDENT(val) arg->indent_level += (val) +#define INDENTED(code) do { \ + INDENT(+1); \ + do { code; } while(0); \ + INDENT(-1); \ + } while(0) + +#define FLAT(code) do { \ + int _il = arg->indent_level; \ + arg->indent_level = 0; \ + do { code; } while(0); \ + arg->indent_level = _il; \ + } while(0) + +#define EMBED(ev) do { \ + int saved_target = arg->target->target; \ + REDIR(OT_TYPE_DECLS); \ + arg->embed++; \ + INDENTED(arg_t _tmp = *arg; \ + _tmp.expr = ev; \ + _tmp.default_cb(&_tmp); \ + ); \ + arg->embed--; \ + assert(arg->target->target == OT_TYPE_DECLS); \ + REDIR(saved_target); \ + } while(0) + +/* Output a piece of text into a default stream */ +#define OUT(fmt, args...) asn1c_compiled_output(arg, fmt, ##args) +#define OUT_NOINDENT(fmt, args...) do { \ + int _saved_indent = arg->indent_level; \ + arg->indent_level = 0; \ + OUT(fmt, ##args); \ + arg->indent_level = _saved_indent; \ +} while(0) + +/* Generate #include line */ +#define GEN_INCLUDE(filename) do { \ + int saved_target = arg->target->target; \ + REDIR(OT_INCLUDES); \ + OUT_NOINDENT("#include <%s.h>\n", filename); \ + REDIR(saved_target); \ +} while(0) + +/* Generate ASN.1 type declaration */ +#define GEN_DECLARE(expr) do { \ + int saved_target = arg->target->target; \ + REDIR(OT_DEPS); \ + OUT_NOINDENT("extern asn1_TYPE_descriptor_t " \ + "asn1_DEF_%s;\n", \ + MKID(expr->Identifier)); \ + REDIR(saved_target); \ +} while(0) + #endif /* _ASN1_COMPILED_OUTPUT_H_ */ diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c index 3d806bc02..5a8d3b6e9 100644 --- a/libasn1compiler/asn1c_save.c +++ b/libasn1compiler/asn1c_save.c @@ -180,6 +180,9 @@ asn1c_save_streams(arg_t *arg) { fprintf(fp_h, "#include \n\n"); + TQ_FOR(ot, &(cs->targets[OT_INCLUDES]), next) + fwrite(ot->buf, ot->len, 1, fp_h); + fprintf(fp_h, "\n"); TQ_FOR(ot, &(cs->targets[OT_DEPS]), next) fwrite(ot->buf, ot->len, 1, fp_h); fprintf(fp_h, "\n"); @@ -189,17 +192,17 @@ asn1c_save_streams(arg_t *arg) { TQ_FOR(ot, &(cs->targets[OT_FUNC_DECLS]), next) fwrite(ot->buf, ot->len, 1, fp_h); - fprintf(fp_c, "#include <%s.h>\n\n", expr->Identifier); + fprintf(fp_h, "\n#ifdef __cplusplus\n}\n#endif\n\n" + "#endif\t/* _%s_H_ */\n", + header_id); + + fprintf(fp_c, "#include <%s.h>\n\n", expr->Identifier); /* Myself */ TQ_FOR(ot, &(cs->targets[OT_STAT_DEFS]), next) fwrite(ot->buf, ot->len, 1, fp_c); TQ_FOR(ot, &(cs->targets[OT_CODE]), next) fwrite(ot->buf, ot->len, 1, fp_c); - assert(OT_MAX == 5); - - fprintf(fp_h, "\n#ifdef __cplusplus\n}\n#endif\n\n" - "#endif\t/* _%s_H_ */\n", - header_id); + assert(OT_MAX == 6); fclose(fp_c); fclose(fp_h); From eb2157b0f2b997587ff77ada8913303443e846b3 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 11 Aug 2004 05:22:22 +0000 Subject: [PATCH 0078/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@78 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/39-sequence-of-OK.asn1.-P | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/tests/39-sequence-of-OK.asn1.-P b/tests/39-sequence-of-OK.asn1.-P index 7536fcaef..560406df2 100644 --- a/tests/39-sequence-of-OK.asn1.-P +++ b/tests/39-sequence-of-OK.asn1.-P @@ -1,16 +1,14 @@ -/*** <<< DEPS [T] >>> ***/ +/*** <<< INCLUDES [T] >>> ***/ -/* Dependencies for T */ #include - -/* Dependencies for collection */ #include #include - - #include +#include #include +/*** <<< DEPS [T] >>> ***/ + extern asn1_TYPE_descriptor_t asn1_DEF_T; /*** <<< TYPE-DECLS [T] >>> ***/ @@ -59,8 +57,6 @@ typedef struct T { &asn1_DEF_collection_specs /* Additional specs */ }; -#include - static asn1_SEQUENCE_element_t asn1_DEF_T_elements[] = { { offsetof(struct T, int), 0, (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), @@ -109,14 +105,14 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { }; -/*** <<< DEPS [T2] >>> ***/ +/*** <<< INCLUDES [T2] >>> ***/ -/* Dependencies for T2 */ #include #include - #include +/*** <<< DEPS [T2] >>> ***/ + extern asn1_TYPE_descriptor_t asn1_DEF_T2; /*** <<< TYPE-DECLS [T2] >>> ***/ @@ -132,8 +128,6 @@ typedef struct T2 { /*** <<< STAT-DEFS [T2] >>> ***/ -#include - static asn1_SEQUENCE_element_t asn1_DEF_T2_elements[] = { { offsetof(struct T2, flag), 0, (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), From 6e1b13e6f5df695063ded31403464431fa51653f Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 11 Aug 2004 05:25:47 +0000 Subject: [PATCH 0079/1469] new compiler output format git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@79 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/42-real-life-OK.asn1.-PR | 82 +++++++++----------------- tests/44-choice-in-sequence-OK.asn1.-P | 64 ++++++++------------ tests/46-redefine-OK.asn1.-PR | 12 ++-- tests/47-set-ext-OK.asn1.-P | 56 +++++++++--------- 4 files changed, 85 insertions(+), 129 deletions(-) diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index ca84dcb7b..3fc023ad0 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -1,16 +1,14 @@ -/*** <<< DEPS [LogLine] >>> ***/ +/*** <<< INCLUDES [LogLine] >>> ***/ -/* Dependencies for LogLine */ #include - -/* Dependencies for varsets */ #include #include - - #include +#include #include +/*** <<< DEPS [LogLine] >>> ***/ + extern asn1_TYPE_descriptor_t asn1_DEF_LogLine; /*** <<< TYPE-DECLS [LogLine] >>> ***/ @@ -63,8 +61,6 @@ typedef struct LogLine { &asn1_DEF_varsets_specs /* Additional specs */ }; -#include - static asn1_SEQUENCE_element_t asn1_DEF_LogLine_elements[] = { { offsetof(struct LogLine, line_digest), 0, (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), @@ -113,18 +109,16 @@ asn1_TYPE_descriptor_t asn1_DEF_LogLine = { }; -/*** <<< DEPS [VariablePartSet] >>> ***/ +/*** <<< INCLUDES [VariablePartSet] >>> ***/ -/* Dependencies for VariablePartSet */ #include - -/* Dependencies for vparts */ #include #include - - #include +#include #include +/*** <<< DEPS [VariablePartSet] >>> ***/ + extern asn1_TYPE_descriptor_t asn1_DEF_VariablePartSet; /*** <<< TYPE-DECLS [VariablePartSet] >>> ***/ @@ -177,8 +171,6 @@ typedef struct VariablePartSet { &asn1_DEF_vparts_specs /* Additional specs */ }; -#include - static asn1_SEQUENCE_element_t asn1_DEF_VariablePartSet_elements[] = { { offsetof(struct VariablePartSet, vparts), 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), @@ -227,32 +219,29 @@ asn1_TYPE_descriptor_t asn1_DEF_VariablePartSet = { }; -/*** <<< DEPS [VariablePart] >>> ***/ - +/*** <<< INCLUDES [VariablePart] >>> ***/ -/* Dependencies for vset */ #include #include +#include +#include +#include - #include - -/* Dependencies for vrange */ -#include -#include +/*** <<< DEPS [VariablePart] >>> ***/ - #include - +typedef enum VariablePart_PR { + VariablePart_PR_NOTHING, /* No components present */ + VariablePart_PR_vset, + VariablePart_PR_vrange, + /* Extensions may appear below */ +} VariablePart_PR_e; extern asn1_TYPE_descriptor_t asn1_DEF_VariablePart; /*** <<< TYPE-DECLS [VariablePart] >>> ***/ typedef struct VariablePart { - enum { - VariablePart_PR_NOTHING, /* No components present */ - VariablePart_PR_vset, - VariablePart_PR_vrange, - } present; + VariablePart_PR_e present; union { struct vset { A_SET_OF(VisibleString_t) list; @@ -311,8 +300,6 @@ typedef struct VariablePart { &asn1_DEF_vset_specs /* Additional specs */ }; - #include - static asn1_SEQUENCE_element_t asn1_DEF_vrange_elements[] = { { offsetof(struct vrange, from), 0, (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), @@ -360,8 +347,6 @@ typedef struct VariablePart { &asn1_DEF_vrange_specs /* Additional specs */ }; -#include - static asn1_CHOICE_element_t asn1_DEF_VariablePart_elements[] = { { offsetof(struct VariablePart, choice.vset), 0, (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), @@ -411,10 +396,16 @@ asn1_TYPE_descriptor_t asn1_DEF_VariablePart = { }; -/*** <<< DEPS [ActionItem] >>> ***/ +/*** <<< INCLUDES [ActionItem] >>> ***/ -/* Dependencies for ActionItem */ #include +#include +#include +#include +#include +#include + +/*** <<< DEPS [ActionItem] >>> ***/ typedef enum accept_as { accept_as_unknown = 0, @@ -424,19 +415,6 @@ asn1_TYPE_descriptor_t asn1_DEF_VariablePart = { * Enumeration is extensible */ } accept_as_e; -/* Dependencies for notify */ -#include - -/* Dependencies for email */ -#include -#include - - #include - - #include - -#include - extern asn1_TYPE_descriptor_t asn1_DEF_ActionItem; /*** <<< TYPE-DECLS [ActionItem] >>> ***/ @@ -499,8 +477,6 @@ typedef struct ActionItem { &asn1_DEF_email_specs /* Additional specs */ }; - #include - static asn1_SEQUENCE_element_t asn1_DEF_notify_elements[] = { { offsetof(struct notify, critical), 0, (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), @@ -548,8 +524,6 @@ typedef struct ActionItem { &asn1_DEF_notify_specs /* Additional specs */ }; -#include - static asn1_SEQUENCE_element_t asn1_DEF_ActionItem_elements[] = { { offsetof(struct ActionItem, accept_as), 0, (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), diff --git a/tests/44-choice-in-sequence-OK.asn1.-P b/tests/44-choice-in-sequence-OK.asn1.-P index 6cab701cf..03f46ee64 100644 --- a/tests/44-choice-in-sequence-OK.asn1.-P +++ b/tests/44-choice-in-sequence-OK.asn1.-P @@ -1,23 +1,29 @@ -/*** <<< DEPS [T] >>> ***/ - -/* Dependencies for T */ -#include - -/* Dependencies for b */ -#include -#include - -/* Dependencies for e */ -#include -#include +/*** <<< INCLUDES [T] >>> ***/ -/* Dependencies for h */ #include -#include - +#include #include +/*** <<< DEPS [T] >>> ***/ + + typedef enum b_PR { + b_PR_NOTHING, /* No components present */ + b_PR_c, + b_PR_d, + b_PR_e, + b_PR_h, + } b_PR_e; + typedef enum e_PR { + e_PR_NOTHING, /* No components present */ + e_PR_f, + e_PR_g, + } e_PR_e; + typedef enum h_PR { + h_PR_NOTHING, /* No components present */ + h_PR_i, + h_PR_j, + } h_PR_e; extern asn1_TYPE_descriptor_t asn1_DEF_T; /*** <<< TYPE-DECLS [T] >>> ***/ @@ -26,22 +32,12 @@ extern asn1_TYPE_descriptor_t asn1_DEF_T; typedef struct T { NULL_t a; struct b { - enum { - b_PR_NOTHING, /* No components present */ - b_PR_c, - b_PR_d, - b_PR_e, - b_PR_h, - } present; + b_PR_e present; union { NULL_t c; NULL_t d; struct e { - enum { - e_PR_NOTHING, /* No components present */ - e_PR_f, - e_PR_g, - } present; + e_PR_e present; union { NULL_t f; NULL_t g; @@ -51,11 +47,7 @@ typedef struct T { ber_dec_ctx_t _ber_dec_ctx; } e; struct h { - enum { - h_PR_NOTHING, /* No components present */ - h_PR_i, - h_PR_j, - } present; + h_PR_e present; union { NULL_t i; NULL_t j; @@ -76,8 +68,6 @@ typedef struct T { /*** <<< STAT-DEFS [T] >>> ***/ - #include - static asn1_CHOICE_element_t asn1_DEF_e_elements[] = { { offsetof(struct e, choice.f), 0, (ASN_TAG_CLASS_PRIVATE | (7 << 2)), @@ -125,8 +115,6 @@ typedef struct T { &asn1_DEF_e_specs /* Additional specs */ }; - #include - static asn1_CHOICE_element_t asn1_DEF_h_elements[] = { { offsetof(struct h, choice.i), 0, (ASN_TAG_CLASS_PRIVATE | (1 << 2)), @@ -174,8 +162,6 @@ typedef struct T { &asn1_DEF_h_specs /* Additional specs */ }; - #include - static asn1_CHOICE_element_t asn1_DEF_b_elements[] = { { offsetof(struct b, choice.c), 0, (ASN_TAG_CLASS_PRIVATE | (5 << 2)), @@ -238,8 +224,6 @@ typedef struct T { &asn1_DEF_b_specs /* Additional specs */ }; -#include - static asn1_SEQUENCE_element_t asn1_DEF_T_elements[] = { { offsetof(struct T, a), 0, (ASN_TAG_CLASS_PRIVATE | (2 << 2)), diff --git a/tests/46-redefine-OK.asn1.-PR b/tests/46-redefine-OK.asn1.-PR index 2fc1e4dd3..31f6a8ec4 100644 --- a/tests/46-redefine-OK.asn1.-PR +++ b/tests/46-redefine-OK.asn1.-PR @@ -1,5 +1,5 @@ -/*** <<< DEPS [PrimitiveType] >>> ***/ +/*** <<< INCLUDES [PrimitiveType] >>> ***/ #include @@ -94,13 +94,13 @@ PrimitiveType_free(asn1_TYPE_descriptor_t *td, } -/*** <<< DEPS [ConstructedType] >>> ***/ +/*** <<< INCLUDES [ConstructedType] >>> ***/ -/* Dependencies for ConstructedType */ #include - #include +/*** <<< DEPS [ConstructedType] >>> ***/ + extern asn1_TYPE_descriptor_t asn1_DEF_ConstructedType; /*** <<< TYPE-DECLS [ConstructedType] >>> ***/ @@ -115,8 +115,6 @@ typedef struct ConstructedType { /*** <<< STAT-DEFS [ConstructedType] >>> ***/ -#include - static asn1_SEQUENCE_element_t asn1_DEF_ConstructedType_elements[] = { { offsetof(struct ConstructedType, field), 0, (ASN_TAG_CLASS_CONTEXT | (5 << 2)), @@ -158,7 +156,7 @@ asn1_TYPE_descriptor_t asn1_DEF_ConstructedType = { }; -/*** <<< DEPS [T] >>> ***/ +/*** <<< INCLUDES [T] >>> ***/ #include diff --git a/tests/47-set-ext-OK.asn1.-P b/tests/47-set-ext-OK.asn1.-P index 69a7dedbe..a3d1096e4 100644 --- a/tests/47-set-ext-OK.asn1.-P +++ b/tests/47-set-ext-OK.asn1.-P @@ -1,8 +1,10 @@ -/*** <<< DEPS [T1] >>> ***/ +/*** <<< INCLUDES [T1] >>> ***/ -/* Dependencies for T1 */ #include +#include + +/*** <<< DEPS [T1] >>> ***/ /* @@ -11,8 +13,6 @@ enum T1_PR_e { T1_PR_i, /* Member i is present */ }; -#include - extern asn1_TYPE_descriptor_t asn1_DEF_T1; /*** <<< TYPE-DECLS [T1] >>> ***/ @@ -35,8 +35,6 @@ typedef struct T1 { /*** <<< STAT-DEFS [T1] >>> ***/ -#include - static asn1_SET_element_t asn1_DEF_T1_elements[] = { { offsetof(struct T1, i), 0, (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), @@ -82,10 +80,12 @@ asn1_TYPE_descriptor_t asn1_DEF_T1 = { }; -/*** <<< DEPS [T2] >>> ***/ +/*** <<< INCLUDES [T2] >>> ***/ -/* Dependencies for T2 */ #include +#include + +/*** <<< DEPS [T2] >>> ***/ /* @@ -94,8 +94,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T1 = { enum T2_PR_e { T2_PR_i, /* Member i is present */ }; -#include - extern asn1_TYPE_descriptor_t asn1_DEF_T2; /*** <<< TYPE-DECLS [T2] >>> ***/ @@ -118,8 +116,6 @@ typedef struct T2 { /*** <<< STAT-DEFS [T2] >>> ***/ -#include - static asn1_SET_element_t asn1_DEF_T2_elements[] = { { offsetof(struct T2, i), 0, (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), @@ -165,21 +161,25 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { }; -/*** <<< DEPS [T3] >>> ***/ +/*** <<< INCLUDES [T3] >>> ***/ -/* Dependencies for T3 */ #include +#include +/*** <<< DEPS [T3] >>> ***/ + +typedef enum T3_PR { + T3_PR_NOTHING, /* No components present */ + T3_PR_i, + /* Extensions may appear below */ +} T3_PR_e; extern asn1_TYPE_descriptor_t asn1_DEF_T3; /*** <<< TYPE-DECLS [T3] >>> ***/ typedef struct T3 { - enum { - T3_PR_NOTHING, /* No components present */ - T3_PR_i, - } present; + T3_PR_e present; union { INTEGER_t i; /* @@ -194,8 +194,6 @@ typedef struct T3 { /*** <<< STAT-DEFS [T3] >>> ***/ -#include - static asn1_CHOICE_element_t asn1_DEF_T3_elements[] = { { offsetof(struct T3, choice.i), 0, (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), @@ -238,21 +236,25 @@ asn1_TYPE_descriptor_t asn1_DEF_T3 = { }; -/*** <<< DEPS [T4] >>> ***/ +/*** <<< INCLUDES [T4] >>> ***/ -/* Dependencies for T4 */ #include +#include +/*** <<< DEPS [T4] >>> ***/ + +typedef enum T4_PR { + T4_PR_NOTHING, /* No components present */ + T4_PR_i, + /* Extensions may appear below */ +} T4_PR_e; extern asn1_TYPE_descriptor_t asn1_DEF_T4; /*** <<< TYPE-DECLS [T4] >>> ***/ typedef struct T4 { - enum { - T4_PR_NOTHING, /* No components present */ - T4_PR_i, - } present; + T4_PR_e present; union { INTEGER_t i; /* @@ -267,8 +269,6 @@ typedef struct T4 { /*** <<< STAT-DEFS [T4] >>> ***/ -#include - static asn1_CHOICE_element_t asn1_DEF_T4_elements[] = { { offsetof(struct T4, choice.i), 0, (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), From 1977da6c39ea98ef5fa6b243ffe0532f930f4fb4 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 11 Aug 2004 05:26:29 +0000 Subject: [PATCH 0080/1469] C++ testing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@80 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/Makefile.am | 7 ++++++- asn1c/tests/Makefile.in | 6 ++++-- asn1c/tests/check-assembly.sh | 15 ++++++++++----- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/asn1c/tests/Makefile.am b/asn1c/tests/Makefile.am index 7c9bcb8fc..78cf68e39 100644 --- a/asn1c/tests/Makefile.am +++ b/asn1c/tests/Makefile.am @@ -2,9 +2,14 @@ check_SCRIPTS = check-assembly.sh TESTS_ENVIRONMENT= ./check-assembly.sh + +if CPLUSPLUS_FOUND +TESTS = check-*.c check-*.cc ## Include C++ test filed (.cc) +else TESTS = check-*.c +endif -EXTRA_DIST = ${check_SCRIPTS} check-*.c +EXTRA_DIST = ${check_SCRIPTS} check-*.c* clean: for t in test-*; do rm -rf $$t; done diff --git a/asn1c/tests/Makefile.in b/asn1c/tests/Makefile.in index 6f26e1abf..a64bc54ff 100644 --- a/asn1c/tests/Makefile.in +++ b/asn1c/tests/Makefile.in @@ -62,6 +62,8 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ +CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ @@ -158,8 +160,8 @@ target_os = @target_os@ target_vendor = @target_vendor@ check_SCRIPTS = check-assembly.sh TESTS_ENVIRONMENT = ./check-assembly.sh -TESTS = check-*.c -EXTRA_DIST = ${check_SCRIPTS} check-*.c +TESTS = check-*.c* +EXTRA_DIST = ${check_SCRIPTS} check-*.c* all: all-am .SUFFIXES: diff --git a/asn1c/tests/check-assembly.sh b/asn1c/tests/check-assembly.sh index a1756b4d6..5a67ab668 100755 --- a/asn1c/tests/check-assembly.sh +++ b/asn1c/tests/check-assembly.sh @@ -9,7 +9,7 @@ source=$(echo "$1" | sed -e 's/.*\///') testno=`echo "$source" | cut -f2 -d'-' | cut -f1 -d'.'` -args=$(echo "$source" | sed -e 's/\.c$//') +args=$(echo "$source" | sed -e 's/\.c[c]*$//') testdir=test-${args} OFS=$IFS @@ -33,15 +33,20 @@ set +x # Create a Makefile for the project. cat > Makefile < Date: Wed, 11 Aug 2004 05:26:33 +0000 Subject: [PATCH 0081/1469] comment git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@81 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/README | 8 ++++---- asn1c/tests/check-42.cc | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 asn1c/tests/check-42.cc diff --git a/asn1c/tests/README b/asn1c/tests/README index b7fb56054..99c45e44c 100644 --- a/asn1c/tests/README +++ b/asn1c/tests/README @@ -1,6 +1,6 @@ -This is a very funny test automation. The name of the check-*.c file is used -as a pointer to the file in ../..//tests/*-*.asn1. This file is compiled -using the asn1c from above directory. Then, everything is build together -in a temporary directory with a check-*.c used as a testing engine. +This is a very funny test automation. The name of the check-N.c file is used +as a pointer to the file in ../../tests/N-*.asn1. This file is compiled +using the asn1c compiler from above directory. Then, everything is build +together in a temporary directory with a check-N.c used as a testing engine. diff --git a/asn1c/tests/check-42.cc b/asn1c/tests/check-42.cc new file mode 100644 index 000000000..c2ec29ba0 --- /dev/null +++ b/asn1c/tests/check-42.cc @@ -0,0 +1,20 @@ +/* + * This file checks that the output may be compiled by the C++ compiler. + */ +#undef NDEBUG +#include +#include +#include +#include +#include + +#include + +int +main() { + VariablePart_t t; + + t.present = VariablePart_PR_vrange; + + return 0; +} From 8ed2f6f7aefcf5a7a8c4f5c869eb2e6894225621 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 11 Aug 2004 05:35:51 +0000 Subject: [PATCH 0082/1469] version bump-up git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@82 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 4 + Makefile.in | 2 + asn1c/Makefile.in | 2 + configure | 765 ++++++++++++++++++++++++++++++++++-- configure.in | 6 +- doc/Makefile.in | 2 + examples/Makefile.in | 2 + libasn1fix/Makefile.in | 2 + libasn1parser/Makefile.in | 4 +- libasn1print/Makefile.in | 2 + skeletons/Makefile.in | 2 + skeletons/tests/Makefile.in | 2 + tests/Makefile.in | 2 + 13 files changed, 751 insertions(+), 46 deletions(-) diff --git a/ChangeLog b/ChangeLog index da492e2e2..d605eaf19 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,8 @@ +0.8.17: 2004-Aug-10 + + * Improved compiler output: duplicate #includes eliminated. + 0.8.16: 2004-Jul-22 * Fixed application-level problem in SET OF/SEQUENCE OF array cleanup. diff --git a/Makefile.in b/Makefile.in index 9ac9a7895..2d797dc24 100644 --- a/Makefile.in +++ b/Makefile.in @@ -87,6 +87,8 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ +CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ diff --git a/asn1c/Makefile.in b/asn1c/Makefile.in index bd958e644..6369a4a39 100644 --- a/asn1c/Makefile.in +++ b/asn1c/Makefile.in @@ -101,6 +101,8 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ +CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ diff --git a/configure b/configure index 19ecc56dd..27896355b 100755 --- a/configure +++ b/configure @@ -463,7 +463,7 @@ ac_includes_default="\ # include #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO AMTAR install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot PATH MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CPP CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL CONFIGURE_DEPENDS YACC LEX LEXLIB LEX_OUTPUT_ROOT ADD_CFLAGS LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO AMTAR install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot PATH MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CPP CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL CONFIGURE_DEPENDS CPLUSPLUS_FOUND_TRUE CPLUSPLUS_FOUND_FALSE YACC LEX LEXLIB LEX_OUTPUT_ROOT ADD_CFLAGS LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.8.16 + VERSION=0.8.17 cat >>confdefs.h <<_ACEOF @@ -20250,6 +20250,710 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + echo "$as_me:$LINENO: result: $CXX" >&5 +echo "${ECHO_T}$CXX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 +echo "${ECHO_T}$ac_ct_CXX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CXX" && break +done +test -n "$ac_ct_CXX" || ac_ct_CXX="g++" + + CXX=$ac_ct_CXX +fi + + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C++ compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 +GXX=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +CXXFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 +echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cxx_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cxx_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cxx_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6 +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 +echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 +if test -z "$CXXCPP"; then + if test "${ac_cv_prog_CXXCPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +echo "$as_me:$LINENO: result: $CXXCPP" >&5 +echo "${ECHO_T}$CXXCPP" >&6 +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +if test -n "$ac_ct_CXX"; then + CPLUSPLUS_FOUND_TRUE= + CPLUSPLUS_FOUND_FALSE='#' +else + CPLUSPLUS_FOUND_TRUE='#' + CPLUSPLUS_FOUND_FALSE= +fi + # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: @@ -20687,47 +21391,6 @@ fi if test "$LEX" = :; then LEX=${am_missing_run}flex fi -# Extract the first word of "ar", so it can be a program name with args. -set dummy ar; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_path_AR+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - case $AR in - [\\/]* | ?:[\\/]*) - ac_cv_path_AR="$AR" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_dummy="$PATH:/usr/ucb:/usr/ccs/bin" -for as_dir in $as_dummy -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_AR="$as_dir/$ac_word$ac_exec_ext" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - - test -z "$ac_cv_path_AR" && ac_cv_path_AR="ar" - ;; -esac -fi -AR=$ac_cv_path_AR - -if test -n "$AR"; then - echo "$as_me:$LINENO: result: $AR" >&5 -echo "${ECHO_T}$AR" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - case "$build" in *cygwin*) @@ -21903,6 +22566,20 @@ echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${CPLUSPLUS_FOUND_TRUE}" && test -z "${CPLUSPLUS_FOUND_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"CPLUSPLUS_FOUND\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"CPLUSPLUS_FOUND\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files @@ -22518,6 +23195,8 @@ s,@FFLAGS@,$FFLAGS,;t t s,@ac_ct_F77@,$ac_ct_F77,;t t s,@LIBTOOL@,$LIBTOOL,;t t s,@CONFIGURE_DEPENDS@,$CONFIGURE_DEPENDS,;t t +s,@CPLUSPLUS_FOUND_TRUE@,$CPLUSPLUS_FOUND_TRUE,;t t +s,@CPLUSPLUS_FOUND_FALSE@,$CPLUSPLUS_FOUND_FALSE,;t t s,@YACC@,$YACC,;t t s,@LEX@,$LEX,;t t s,@LEXLIB@,$LEXLIB,;t t diff --git a/configure.in b/configure.in index 176d6695d..232205147 100644 --- a/configure.in +++ b/configure.in @@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_SYSTEM AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.8.16) +AM_INIT_AUTOMAKE(asn1c, 0.8.17) AC_SUBST(PATH) @@ -27,12 +27,14 @@ AC_SUBST(CONFIGURE_DEPENDS) dnl Checks for programs. AC_PROG_CC AC_PROG_CPP +AC_PROG_CXX +AC_PROG_CXXCPP +AM_CONDITIONAL(CPLUSPLUS_FOUND, test -n "$ac_ct_CXX") AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_MAKE_SET AC_PROG_YACC AM_PROG_LEX -AC_PATH_PROG(AR, ar, ar, $PATH:/usr/ucb:/usr/ccs/bin) dnl *** Building mingw32 with cygwin compiler *** case "$build" in diff --git a/doc/Makefile.in b/doc/Makefile.in index 614f8ae11..93105837c 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -66,6 +66,8 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ +CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ diff --git a/examples/Makefile.in b/examples/Makefile.in index fcc052a0c..09bae06a3 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -67,6 +67,8 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ +CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ diff --git a/libasn1fix/Makefile.in b/libasn1fix/Makefile.in index b64912306..91b9428fb 100644 --- a/libasn1fix/Makefile.in +++ b/libasn1fix/Makefile.in @@ -112,6 +112,8 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ +CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index cae3f81a3..759122ef3 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -108,6 +108,8 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ +CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ @@ -545,8 +547,8 @@ maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -rm -f asn1p_y.c - -rm -f asn1p_l.c -rm -f asn1p_y.h + -rm -f asn1p_l.c clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ diff --git a/libasn1print/Makefile.in b/libasn1print/Makefile.in index 316d55470..c24ddf336 100644 --- a/libasn1print/Makefile.in +++ b/libasn1print/Makefile.in @@ -83,6 +83,8 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ +CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ diff --git a/skeletons/Makefile.in b/skeletons/Makefile.in index a8586536b..53ddc1022 100644 --- a/skeletons/Makefile.in +++ b/skeletons/Makefile.in @@ -76,6 +76,8 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ +CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ diff --git a/skeletons/tests/Makefile.in b/skeletons/tests/Makefile.in index 582a3f5c1..dbac6f7c3 100644 --- a/skeletons/tests/Makefile.in +++ b/skeletons/tests/Makefile.in @@ -97,6 +97,8 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ +CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ diff --git a/tests/Makefile.in b/tests/Makefile.in index 2bfb20e92..17232e715 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -62,6 +62,8 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ +CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ From c519ffd3383c18c99e49740fe31b0b300433ec17 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 11 Aug 2004 05:48:02 +0000 Subject: [PATCH 0083/1469] passing environment down the script git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@83 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/Makefile.am | 2 +- asn1c/tests/Makefile.in | 5 +++-- asn1c/tests/check-assembly.sh | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/asn1c/tests/Makefile.am b/asn1c/tests/Makefile.am index 78cf68e39..45cdd03ab 100644 --- a/asn1c/tests/Makefile.am +++ b/asn1c/tests/Makefile.am @@ -1,7 +1,7 @@ check_SCRIPTS = check-assembly.sh -TESTS_ENVIRONMENT= ./check-assembly.sh +TESTS_ENVIRONMENT= CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" ./check-assembly.sh if CPLUSPLUS_FOUND TESTS = check-*.c check-*.cc ## Include C++ test filed (.cc) diff --git a/asn1c/tests/Makefile.in b/asn1c/tests/Makefile.in index a64bc54ff..17cc553a7 100644 --- a/asn1c/tests/Makefile.in +++ b/asn1c/tests/Makefile.in @@ -159,8 +159,9 @@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ check_SCRIPTS = check-assembly.sh -TESTS_ENVIRONMENT = ./check-assembly.sh -TESTS = check-*.c* +TESTS_ENVIRONMENT = CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" ./check-assembly.sh +@CPLUSPLUS_FOUND_FALSE@TESTS = check-*.c +@CPLUSPLUS_FOUND_TRUE@TESTS = check-*.c check-*.cc ## Include C++ test filed (.cc) EXTRA_DIST = ${check_SCRIPTS} check-*.c* all: all-am diff --git a/asn1c/tests/check-assembly.sh b/asn1c/tests/check-assembly.sh index 5a67ab668..d9f4afed9 100755 --- a/asn1c/tests/check-assembly.sh +++ b/asn1c/tests/check-assembly.sh @@ -33,7 +33,7 @@ set +x # Create a Makefile for the project. cat > Makefile < Date: Wed, 11 Aug 2004 05:58:52 +0000 Subject: [PATCH 0084/1469] win32 compat git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@84 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_CHOICE.c | 1 - skeletons/constr_SET.c | 7 ++++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index d1beff42e..7870a4cfc 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -3,7 +3,6 @@ * Redistribution and modifications are permitted subject to BSD license. */ #include -#include /* for ntohl */ #include /* diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index a01b80448..2fd0ac9be 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -3,9 +3,14 @@ * Redistribution and modifications are permitted subject to BSD license. */ #include -#include /* for ntohl() */ #include /* for assert() */ +#ifndef WIN32 +#include /* for ntohl() */ +#else +#include /* for ntohl() */ +#endif + /* * Number of bytes left for this structure. * (ctx->left) indicates the number of bytes _transferred_ for the structure. From 6e73a0491205fd3dc13f849a4cb8630b1d81c191 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 11 Aug 2004 07:17:22 +0000 Subject: [PATCH 0085/1469] Win32 portability fixes git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@85 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 3 +- libasn1compiler/asn1c_C.c | 168 ++++++++++++++++--------- libasn1compiler/asn1c_out.c | 10 ++ libasn1compiler/asn1c_out.h | 4 +- libasn1compiler/asn1c_save.c | 4 +- skeletons/GeneralizedTime.c | 7 ++ skeletons/OBJECT_IDENTIFIER.c | 6 +- skeletons/asn_types.h | 23 +++- tests/39-sequence-of-OK.asn1.-P | 6 +- tests/42-real-life-OK.asn1.-PR | 30 ++--- tests/44-choice-in-sequence-OK.asn1.-P | 35 ++---- tests/46-redefine-OK.asn1.-PR | 6 +- tests/47-set-ext-OK.asn1.-P | 36 +++--- 13 files changed, 208 insertions(+), 130 deletions(-) diff --git a/ChangeLog b/ChangeLog index d605eaf19..59196e436 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,8 @@ -0.8.17: 2004-Aug-10 +0.8.17: 2004-Aug-11 * Improved compiler output: duplicate #includes eliminated. + * Win32 portability fixes. 0.8.16: 2004-Jul-22 diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 34594df77..5b9bf7c9d 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -23,7 +23,7 @@ static int asn1c_lang_C_type_CHOICE_def(arg_t *arg); static int asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of); static int _print_tag(arg_t *arg, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag_p); static int check_if_extensible(asn1p_expr_t *expr); -static int emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int*tags_impl_skip); +static int emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int *tags_impl_skip, int choice_mode); static int emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count); static int emit_constraint_checking_code(arg_t *arg); static int emit_single_constraint_check(arg_t *arg, asn1p_constraint_t *ct, int mode); @@ -165,6 +165,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { int ext_stop = -1; tag2el_t *tag2el = NULL; int tag2el_count = 0; + int tags_count; char *p; /* @@ -239,7 +240,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { /* * Print out asn1_DEF__tags[] vector. */ - emit_tags_vector(arg, expr, &tags_impl_skip); + tags_count = emit_tags_vector(arg, expr, &tags_impl_skip, 0); /* * Tags to elements map. @@ -270,9 +271,15 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { OUT("SEQUENCE_print,\n"); OUT("SEQUENCE_free,\n"); OUT("0,\t/* Use generic outmost tag fetcher */\n"); - OUT("asn1_DEF_%s_tags,\n", p); - OUT("sizeof(asn1_DEF_%s_tags)\n", p); - OUT("\t/sizeof(asn1_DEF_%s_tags[0]),\n", p); + if(tags_count) { + OUT("asn1_DEF_%s_tags,\n", p); + OUT("sizeof(asn1_DEF_%s_tags)\n", p); + OUT("\t/sizeof(asn1_DEF_%s_tags[0]), /* %d */\n", + p, tags_count); + } else { + OUT("0,\t/* No explicit tags (pointer) */\n"); + OUT("0,\t/* No explicit tags (count) */\n"); + } OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); OUT("%d,\t/* Whether CONSTRUCTED */\n", 1); OUT("&asn1_DEF_%s_specs\t/* Additional specs */\n", p); @@ -330,7 +337,7 @@ asn1c_lang_C_type_SET(arg_t *arg) { OUT(" * Method of determining the components presence\n"); OUT(" */\n"); mcount = 0; - OUT("enum %s_PR_e {\n", MKID(expr->Identifier)); + OUT("typedef enum %s_PR {\n", MKID(expr->Identifier)); TQ_FOR(v, &(expr->members), next) { if(v->expr_type == A1TC_EXTENSIBLE) continue; INDENTED( @@ -342,14 +349,15 @@ asn1c_lang_C_type_SET(arg_t *arg) { ); mcount++; } - OUT("};\n"); + id = MKID(expr->Identifier); + OUT("} %s_PR;\n", id); REDIR(OT_TYPE_DECLS); if(arg->embed) { - OUT("struct %s {\n", MKID(expr->Identifier)); + OUT("struct %s {\n", id); } else { - OUT("typedef struct %s {\n", MKID(expr->Identifier)); + OUT("typedef struct %s {\n", id); } TQ_FOR(v, &(expr->members), next) { @@ -386,6 +394,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { int comp_mode = 0; /* {root,ext=1,root,root,...} */ tag2el_t *tag2el = NULL; int tag2el_count = 0; + int tags_count; char *p; /* @@ -454,7 +463,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { /* * Print out asn1_DEF__tags[] vector. */ - emit_tags_vector(arg, expr, &tags_impl_skip); + tags_count = emit_tags_vector(arg, expr, &tags_impl_skip, 0); /* * Tags to elements map. @@ -515,9 +524,15 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { OUT("SET_print,\n"); OUT("SET_free,\n"); OUT("0,\t/* Use generic outmost tag fetcher */\n"); - OUT("asn1_DEF_%s_tags,\n", p); - OUT("sizeof(asn1_DEF_%s_tags)\n", p); - OUT("\t/sizeof(asn1_DEF_%s_tags[0]),\n", p); + if(tags_count) { + OUT("asn1_DEF_%s_tags,\n", p); + OUT("sizeof(asn1_DEF_%s_tags)\n", p); + OUT("\t/sizeof(asn1_DEF_%s_tags[0]), /* %d */\n", + p, tags_count); + } else { + OUT("0,\t/* No explicit tags (pointer) */\n"); + OUT("0,\t/* No explicit tags (count) */\n"); + } OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); OUT("%d,\t/* Whether CONSTRUCTED */\n", 1); OUT("&asn1_DEF_%s_specs\t/* Additional specs */\n", p); @@ -564,6 +579,7 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *v; int tags_impl_skip = 0; + int tags_count; char *p; /* @@ -603,7 +619,7 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { /* * Print out asn1_DEF__tags[] vector. */ - emit_tags_vector(arg, expr, &tags_impl_skip); + tags_count = emit_tags_vector(arg, expr, &tags_impl_skip, 0); p = MKID(expr->Identifier); OUT("static asn1_SET_OF_specifics_t asn1_DEF_%s_specs = {\n", p); @@ -630,9 +646,15 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { OUT("SET_OF_free,\n"); } OUT("0,\t/* Use generic outmost tag fetcher */\n"); - OUT("asn1_DEF_%s_tags,\n", p); - OUT("sizeof(asn1_DEF_%s_tags)\n", p); - OUT("\t/sizeof(asn1_DEF_%s_tags[0]),\n", p); + if(tags_count) { + OUT("asn1_DEF_%s_tags,\n", p); + OUT("sizeof(asn1_DEF_%s_tags)\n", p); + OUT("\t/sizeof(asn1_DEF_%s_tags[0]), /* %d */\n", + p, tags_count); + } else { + OUT("0,\t/* No explicit tags (pointer) */\n"); + OUT("0,\t/* No explicit tags (count) */\n"); + } OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); OUT("%d,\t/* Whether CONSTRUCTED */\n", 1); OUT("&asn1_DEF_%s_specs\t/* Additional specs */\n", p); @@ -673,7 +695,7 @@ asn1c_lang_C_type_CHOICE(arg_t *arg) { } ); p = MKID(expr->Identifier); - OUT("} %s_PR_e;\n", p); + OUT("} %s_PR;\n", p); REDIR(OT_TYPE_DECLS); @@ -684,7 +706,7 @@ asn1c_lang_C_type_CHOICE(arg_t *arg) { } INDENTED( - OUT("%s_PR_e present;\n", p); + OUT("%s_PR present;\n", p); OUT("union {\n", p); TQ_FOR(v, &(expr->members), next) { EMBED(v); @@ -709,6 +731,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { int comp_mode = 0; /* {root,ext=1,root,root,...} */ tag2el_t *tag2el = NULL; int tag2el_count = 0; + int tags_count; char *p; /* @@ -775,29 +798,22 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { }); OUT("};\n"); - p = MKID(expr->Identifier); - OUT("static ber_tlv_tag_t asn1_DEF_%s_tags[] = {\n", p); + if(arg->embed) { /* * Our parent structure has already taken this into account. */ + tags_count = 0; } else { - INDENTED( - if(expr->tag.tag_class) { - _print_tag(arg, expr, &expr->tag); - if(expr->tag.tag_mode != TM_EXPLICIT) - tags_impl_skip++; - } - OUT("\n"); - ); + tags_count = emit_tags_vector(arg, expr, &tags_impl_skip, 1); } - OUT("};\n"); /* * Tags to elements map. */ emit_tag2member_map(arg, tag2el, tag2el_count); + p = MKID(expr->Identifier); OUT("static asn1_CHOICE_specifics_t asn1_DEF_%s_specs = {\n", p); INDENTED( OUT("sizeof(struct %s),\n", p); @@ -821,9 +837,15 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { OUT("CHOICE_print,\n"); OUT("CHOICE_free,\n"); OUT("CHOICE_outmost_tag,\n"); - OUT("asn1_DEF_%s_tags,\n", p); - OUT("sizeof(asn1_DEF_%s_tags)\n", p); - OUT("\t/sizeof(asn1_DEF_%s_tags[0]),\n", p); + if(tags_count) { + OUT("asn1_DEF_%s_tags,\n", p); + OUT("sizeof(asn1_DEF_%s_tags)\n", p); + OUT("\t/sizeof(asn1_DEF_%s_tags[0]), /* %d */\n", + p, tags_count); + } else { + OUT("0,\t/* No explicit tags (pointer) */\n"); + OUT("0,\t/* No explicit tags (count) */\n"); + } OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); OUT("%d,\t/* Whether CONSTRUCTED */\n", 1); OUT("&asn1_DEF_%s_specs\t/* Additional specs */\n", p); @@ -885,6 +907,7 @@ int asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { asn1p_expr_t *expr = arg->expr; int tags_impl_skip = 0; + int tags_count; char *p; if(arg->embed) { @@ -915,7 +938,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { /* * Print out asn1_DEF__tags[] vector. */ - emit_tags_vector(arg, expr, &tags_impl_skip); + tags_count = emit_tags_vector(arg, expr, &tags_impl_skip, 0); p = MKID(expr->Identifier); OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p); @@ -927,9 +950,15 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("%s_print,\n", p); OUT("%s_free,\n", p); OUT("0,\t/* Use generic outmost tag fetcher */\n"); - OUT("asn1_DEF_%s_tags,\n", p); - OUT("sizeof(asn1_DEF_%s_tags)\n", p); - OUT("\t/sizeof(asn1_DEF_%s_tags[0]),\n", p); + if(tags_count) { + OUT("asn1_DEF_%s_tags,\n", p); + OUT("sizeof(asn1_DEF_%s_tags)\n", p); + OUT("\t/sizeof(asn1_DEF_%s_tags[0]), /* %d */\n", + p, tags_count); + } else { + OUT("0,\t/* No explicit tags (pointer) */\n"); + OUT("0,\t/* No explicit tags (count) */\n"); + } OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); OUT("-0,\t/* Unknown yet */\n"); OUT("0\t/* No specifics */\n"); @@ -1284,35 +1313,57 @@ emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count) { } static int -emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int *tags_impl_skip) { +emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int *tags_impl_skip, int choice_mode) { + int tags_count = 0; + int save_target = arg->target->target; char *p; + if(save_target != OT_IGNORE) { + int save_impl_skip = *tags_impl_skip; + REDIR(OT_IGNORE); + tags_count = emit_tags_vector(arg, expr, + tags_impl_skip, choice_mode); + REDIR(save_target); + if(tags_count) { + *tags_impl_skip = save_impl_skip; + tags_count = 0; + } else { + return 0; + } + } + + p = MKID(expr->Identifier); OUT("static ber_tlv_tag_t asn1_DEF_%s_tags[] = {\n", p); INDENTED( if(expr->tag.tag_class) { + tags_count++; _print_tag(arg, expr, &expr->tag); if(expr->tag.tag_mode != TM_EXPLICIT) (*tags_impl_skip)++; } else { - (*tags_impl_skip)++; + if(!choice_mode) + (*tags_impl_skip)++; } - if(!expr->tag.tag_class - || (expr->meta_type == AMT_TYPE - && expr->tag.tag_mode == TM_EXPLICIT)) { - struct asn1p_type_tag_s tag; - if(expr->tag.tag_class) - OUT(",\n"); - tag.tag_class = TC_UNIVERSAL; - tag.tag_mode = TM_IMPLICIT; - tag.tag_value = expr_type2uclass_value[expr->expr_type]; - _print_tag(arg, expr, &tag); + if(!choice_mode) { + if(!expr->tag.tag_class + || (expr->meta_type == AMT_TYPE + && expr->tag.tag_mode == TM_EXPLICIT)) { + struct asn1p_type_tag_s tag; + if(expr->tag.tag_class) + OUT(",\n"); + tag.tag_class = TC_UNIVERSAL; + tag.tag_mode = TM_IMPLICIT; + tag.tag_value = expr_type2uclass_value[expr->expr_type]; + _print_tag(arg, expr, &tag); + tags_count++; + } } OUT("\n"); ); OUT("};\n"); - return 0; + return tags_count; } static int @@ -1923,12 +1974,17 @@ emit_value_determination_code(arg_t *arg) { switch(etype) { case ASN_BASIC_INTEGER: case ASN_BASIC_ENUMERATED: - OUT("if(asn1_INTEGER2long(st, &value)) {\n"); - INDENT(+1); - OUT("_ASN_ERRLOG(\"%%s: value too large\", td->name);\n"); - OUT("return -1;\n"); - INDENT(-1); - OUT("}\n"); + if(arg->flags & A1C_USE_NATIVE_INTEGERS) { + OUT("value = *(int *)st;\n"); + } else { + OUT("if(asn1_INTEGER2long(st, &value)) {\n"); + INDENT(+1); + OUT("_ASN_ERRLOG(\"%%s: value too large\", " + "td->name);\n"); + OUT("return -1;\n"); + INDENT(-1); + OUT("}\n"); + } break; case ASN_BASIC_BOOLEAN: OUT("value = st->value;\n"); diff --git a/libasn1compiler/asn1c_out.c b/libasn1compiler/asn1c_out.c index 2f7c5732c..3954916da 100644 --- a/libasn1compiler/asn1c_out.c +++ b/libasn1compiler/asn1c_out.c @@ -13,6 +13,16 @@ asn1c_compiled_output(arg_t *arg, const char *fmt, ...) { char *buf; int ret; + switch(arg->target->target) { + case OT_IGNORE: + return 0; + case OT_ASSERT: + assert(arg->target->target != OT_ASSERT); + return -1; + default: + break; + } + /* * Make sure the output has a single LF and only at the end. */ diff --git a/libasn1compiler/asn1c_out.h b/libasn1compiler/asn1c_out.h index e989f445b..51582d4c6 100644 --- a/libasn1compiler/asn1c_out.h +++ b/libasn1compiler/asn1c_out.h @@ -13,6 +13,8 @@ typedef struct out_chunk { typedef struct compiler_streams { enum { + OT_IGNORE = -1, + OT_ASSERT = 0, OT_INCLUDES, /* #include files */ OT_DEPS, /* Dependencies (other than #includes) */ OT_TYPE_DECLS, /* Type declarations */ @@ -25,7 +27,7 @@ typedef struct compiler_streams { } compiler_streams_t; static char *_compiler_stream2str[] __attribute__ ((unused)) - = { "INCLUDES", "DEPS", "TYPE-DECLS", "FUNC-DECLS", "STAT-DEFS", "CODE" }; + = { "ASSERT", "INCLUDES", "DEPS", "TYPE-DECLS", "FUNC-DECLS", "STAT-DEFS", "CODE" }; int asn1c_compiled_output(arg_t *arg, const char *fmt, ...); diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c index 5a8d3b6e9..fd1356b71 100644 --- a/libasn1compiler/asn1c_save.c +++ b/libasn1compiler/asn1c_save.c @@ -106,7 +106,7 @@ asn1c_print_streams(arg_t *arg) { asn1p_expr_t *expr = arg->expr; int i; - for(i = 0; i < OT_MAX; i++) { + for(i = 1; i < OT_MAX; i++) { out_chunk_t *ot; if(TQ_FIRST(&cs->targets[i]) == NULL) continue; @@ -202,7 +202,7 @@ asn1c_save_streams(arg_t *arg) { TQ_FOR(ot, &(cs->targets[OT_CODE]), next) fwrite(ot->buf, ot->len, 1, fp_c); - assert(OT_MAX == 6); + assert(OT_MAX == 7); fclose(fp_c); fclose(fp_h); diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 5a3120d18..9e8375e5c 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -9,6 +9,13 @@ #include #endif /* __NO_ASSERT_H__ */ +#ifdef WIN32 +#define localtime_r(tlocp, tmp) (*tmp = localtime(&tlocp)) +#warning PLEASE STOP AND READ! +#warning localtime_r is implemented via localtime(), which is not thread-safe. You must fix the code to insert appropriate locking if you want to use asn_GT2time() or asn_UT2time(). +#warning PLEASE STOP AND READ! +#endif + #ifndef __NO_ASN_TABLE__ /* diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index c910a8cc8..1e4fe5947 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -359,11 +359,15 @@ OBJECT_IDENTIFIER_set_single_arc(uint8_t *arcbuf, void *arcval, unsigned int arc unsigned LE = 1; unsigned isLittleEndian = *(char *)&LE; #endif - uint8_t buffer[arcval_size]; uint8_t *tp, *tend; unsigned int cache; uint8_t *bp = arcbuf; int bits; +#ifdef __GNUC__ + uint8_t buffer[arcval_size]; +#else + uint8_t *buffer = alloca(arcval_size); +#endif if(isLittleEndian && !prepared_order) { uint8_t *a = arcval + arcval_size - 1; diff --git a/skeletons/asn_types.h b/skeletons/asn_types.h index 6d426673c..d2633f6f2 100644 --- a/skeletons/asn_types.h +++ b/skeletons/asn_types.h @@ -13,10 +13,29 @@ #include /* For memcpy(3) */ #include /* For size_t */ #include /* For va_start */ -#include /* C99 Standard specifies this file, for uintXX_t */ #include /* for offsetof and ptrdiff_t */ +#if __STDC_VERSION__ < 199901L +#include /* C99 Standard specifies this file, for uintXX_t */ +#else +typedef unsigned char uint8_t; +typedef unsigned short int uint16_t; +typedef unsigned int uint32_t; +typedef int ssize_t; +#endif + +#ifdef WIN32 +#define snprintf(str, size, format, args...) \ + _snprintf(str, size, format, ##args) +#define vsnprintf(str, size, format, ap) \ + _vsnprintf(str, size, format, ap) +#define alloca(size) _alloca(size) +#endif + +#ifndef __GNUC__ +#define __attribute__(ignore) +#endif -#ifndef offsetof +#ifndef offsetof /* If not defined by */ #define offsetof(s, m) ((ptrdiff_t)&(((s *)0)->m) - (ptrdiff_t)((s *)0)) #endif /* offsetof */ diff --git a/tests/39-sequence-of-OK.asn1.-P b/tests/39-sequence-of-OK.asn1.-P index 560406df2..383cafc4b 100644 --- a/tests/39-sequence-of-OK.asn1.-P +++ b/tests/39-sequence-of-OK.asn1.-P @@ -51,7 +51,7 @@ typedef struct T { 0, /* Use generic outmost tag fetcher */ asn1_DEF_collection_tags, sizeof(asn1_DEF_collection_tags) - /sizeof(asn1_DEF_collection_tags[0]), + /sizeof(asn1_DEF_collection_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_collection_specs /* Additional specs */ @@ -98,7 +98,7 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_T_tags, sizeof(asn1_DEF_T_tags) - /sizeof(asn1_DEF_T_tags[0]), + /sizeof(asn1_DEF_T_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_T_specs /* Additional specs */ @@ -169,7 +169,7 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_T2_tags, sizeof(asn1_DEF_T2_tags) - /sizeof(asn1_DEF_T2_tags[0]), + /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_T2_specs /* Additional specs */ diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index 3fc023ad0..ece1127a3 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -55,7 +55,7 @@ typedef struct LogLine { 0, /* Use generic outmost tag fetcher */ asn1_DEF_varsets_tags, sizeof(asn1_DEF_varsets_tags) - /sizeof(asn1_DEF_varsets_tags[0]), + /sizeof(asn1_DEF_varsets_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_varsets_specs /* Additional specs */ @@ -102,7 +102,7 @@ asn1_TYPE_descriptor_t asn1_DEF_LogLine = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_LogLine_tags, sizeof(asn1_DEF_LogLine_tags) - /sizeof(asn1_DEF_LogLine_tags[0]), + /sizeof(asn1_DEF_LogLine_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_LogLine_specs /* Additional specs */ @@ -165,7 +165,7 @@ typedef struct VariablePartSet { 0, /* Use generic outmost tag fetcher */ asn1_DEF_vparts_tags, sizeof(asn1_DEF_vparts_tags) - /sizeof(asn1_DEF_vparts_tags[0]), + /sizeof(asn1_DEF_vparts_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_vparts_specs /* Additional specs */ @@ -212,7 +212,7 @@ asn1_TYPE_descriptor_t asn1_DEF_VariablePartSet = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_VariablePartSet_tags, sizeof(asn1_DEF_VariablePartSet_tags) - /sizeof(asn1_DEF_VariablePartSet_tags[0]), + /sizeof(asn1_DEF_VariablePartSet_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_VariablePartSet_specs /* Additional specs */ @@ -234,14 +234,14 @@ typedef enum VariablePart_PR { VariablePart_PR_vset, VariablePart_PR_vrange, /* Extensions may appear below */ -} VariablePart_PR_e; +} VariablePart_PR; extern asn1_TYPE_descriptor_t asn1_DEF_VariablePart; /*** <<< TYPE-DECLS [VariablePart] >>> ***/ typedef struct VariablePart { - VariablePart_PR_e present; + VariablePart_PR present; union { struct vset { A_SET_OF(VisibleString_t) list; @@ -294,7 +294,7 @@ typedef struct VariablePart { 0, /* Use generic outmost tag fetcher */ asn1_DEF_vset_tags, sizeof(asn1_DEF_vset_tags) - /sizeof(asn1_DEF_vset_tags[0]), + /sizeof(asn1_DEF_vset_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_vset_specs /* Additional specs */ @@ -341,7 +341,7 @@ typedef struct VariablePart { 0, /* Use generic outmost tag fetcher */ asn1_DEF_vrange_tags, sizeof(asn1_DEF_vrange_tags) - /sizeof(asn1_DEF_vrange_tags[0]), + /sizeof(asn1_DEF_vrange_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_vrange_specs /* Additional specs */ @@ -360,9 +360,6 @@ static asn1_CHOICE_element_t asn1_DEF_VariablePart_elements[] = { (void *)&asn1_DEF_vrange, "vrange" }, -}; -static ber_tlv_tag_t asn1_DEF_VariablePart_tags[] = { - }; static asn1_TYPE_tag2member_t asn1_DEF_VariablePart_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* vrange at 45 */ @@ -387,9 +384,8 @@ asn1_TYPE_descriptor_t asn1_DEF_VariablePart = { CHOICE_print, CHOICE_free, CHOICE_outmost_tag, - asn1_DEF_VariablePart_tags, - sizeof(asn1_DEF_VariablePart_tags) - /sizeof(asn1_DEF_VariablePart_tags[0]), + 0, /* No explicit tags (pointer) */ + 0, /* No explicit tags (count) */ 0, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_VariablePart_specs /* Additional specs */ @@ -471,7 +467,7 @@ typedef struct ActionItem { 0, /* Use generic outmost tag fetcher */ asn1_DEF_email_tags, sizeof(asn1_DEF_email_tags) - /sizeof(asn1_DEF_email_tags[0]), + /sizeof(asn1_DEF_email_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_email_specs /* Additional specs */ @@ -518,7 +514,7 @@ typedef struct ActionItem { 0, /* Use generic outmost tag fetcher */ asn1_DEF_notify_tags, sizeof(asn1_DEF_notify_tags) - /sizeof(asn1_DEF_notify_tags[0]), + /sizeof(asn1_DEF_notify_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_notify_specs /* Additional specs */ @@ -565,7 +561,7 @@ asn1_TYPE_descriptor_t asn1_DEF_ActionItem = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_ActionItem_tags, sizeof(asn1_DEF_ActionItem_tags) - /sizeof(asn1_DEF_ActionItem_tags[0]), + /sizeof(asn1_DEF_ActionItem_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_ActionItem_specs /* Additional specs */ diff --git a/tests/44-choice-in-sequence-OK.asn1.-P b/tests/44-choice-in-sequence-OK.asn1.-P index 03f46ee64..0c65871f5 100644 --- a/tests/44-choice-in-sequence-OK.asn1.-P +++ b/tests/44-choice-in-sequence-OK.asn1.-P @@ -13,17 +13,17 @@ b_PR_d, b_PR_e, b_PR_h, - } b_PR_e; + } b_PR; typedef enum e_PR { e_PR_NOTHING, /* No components present */ e_PR_f, e_PR_g, - } e_PR_e; + } e_PR; typedef enum h_PR { h_PR_NOTHING, /* No components present */ h_PR_i, h_PR_j, - } h_PR_e; + } h_PR; extern asn1_TYPE_descriptor_t asn1_DEF_T; /*** <<< TYPE-DECLS [T] >>> ***/ @@ -32,12 +32,12 @@ extern asn1_TYPE_descriptor_t asn1_DEF_T; typedef struct T { NULL_t a; struct b { - b_PR_e present; + b_PR present; union { NULL_t c; NULL_t d; struct e { - e_PR_e present; + e_PR present; union { NULL_t f; NULL_t g; @@ -47,7 +47,7 @@ typedef struct T { ber_dec_ctx_t _ber_dec_ctx; } e; struct h { - h_PR_e present; + h_PR present; union { NULL_t i; NULL_t j; @@ -82,8 +82,6 @@ typedef struct T { "g" }, }; - static ber_tlv_tag_t asn1_DEF_e_tags[] = { - }; static asn1_TYPE_tag2member_t asn1_DEF_e_tag2el[] = { { (ASN_TAG_CLASS_PRIVATE | (7 << 2)), 0, 0, 0 }, /* f at 20 */ { (ASN_TAG_CLASS_PRIVATE | (8 << 2)), 1, 0, 0 }, /* g at 21 */ @@ -107,9 +105,8 @@ typedef struct T { CHOICE_print, CHOICE_free, CHOICE_outmost_tag, - asn1_DEF_e_tags, - sizeof(asn1_DEF_e_tags) - /sizeof(asn1_DEF_e_tags[0]), + 0, /* No explicit tags (pointer) */ + 0, /* No explicit tags (count) */ 0, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_e_specs /* Additional specs */ @@ -129,8 +126,6 @@ typedef struct T { "j" }, }; - static ber_tlv_tag_t asn1_DEF_h_tags[] = { - }; static asn1_TYPE_tag2member_t asn1_DEF_h_tag2el[] = { { (ASN_TAG_CLASS_PRIVATE | (1 << 2)), 0, 0, 0 }, /* i at 24 */ { (ASN_TAG_CLASS_PRIVATE | (2 << 2)), 1, 0, 0 }, /* j at 25 */ @@ -154,9 +149,8 @@ typedef struct T { CHOICE_print, CHOICE_free, CHOICE_outmost_tag, - asn1_DEF_h_tags, - sizeof(asn1_DEF_h_tags) - /sizeof(asn1_DEF_h_tags[0]), + 0, /* No explicit tags (pointer) */ + 0, /* No explicit tags (count) */ 0, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_h_specs /* Additional specs */ @@ -188,8 +182,6 @@ typedef struct T { "h" }, }; - static ber_tlv_tag_t asn1_DEF_b_tags[] = { - }; static asn1_TYPE_tag2member_t asn1_DEF_b_tag2el[] = { { (ASN_TAG_CLASS_PRIVATE | (5 << 2)), 0, 0, 0 }, /* c at 17 */ { (ASN_TAG_CLASS_PRIVATE | (6 << 2)), 1, 0, 0 }, /* d at 18 */ @@ -216,9 +208,8 @@ typedef struct T { CHOICE_print, CHOICE_free, CHOICE_outmost_tag, - asn1_DEF_b_tags, - sizeof(asn1_DEF_b_tags) - /sizeof(asn1_DEF_b_tags[0]), + 0, /* No explicit tags (pointer) */ + 0, /* No explicit tags (count) */ 0, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_b_specs /* Additional specs */ @@ -269,7 +260,7 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_T_tags, sizeof(asn1_DEF_T_tags) - /sizeof(asn1_DEF_T_tags[0]), + /sizeof(asn1_DEF_T_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_T_specs /* Additional specs */ diff --git a/tests/46-redefine-OK.asn1.-PR b/tests/46-redefine-OK.asn1.-PR index 31f6a8ec4..639ded028 100644 --- a/tests/46-redefine-OK.asn1.-PR +++ b/tests/46-redefine-OK.asn1.-PR @@ -33,7 +33,7 @@ asn1_TYPE_descriptor_t asn1_DEF_PrimitiveType = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_PrimitiveType_tags, sizeof(asn1_DEF_PrimitiveType_tags) - /sizeof(asn1_DEF_PrimitiveType_tags[0]), + /sizeof(asn1_DEF_PrimitiveType_tags[0]), /* 1 */ 1, /* Tags to skip */ -0, /* Unknown yet */ 0 /* No specifics */ @@ -149,7 +149,7 @@ asn1_TYPE_descriptor_t asn1_DEF_ConstructedType = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_ConstructedType_tags, sizeof(asn1_DEF_ConstructedType_tags) - /sizeof(asn1_DEF_ConstructedType_tags[0]), + /sizeof(asn1_DEF_ConstructedType_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_ConstructedType_specs /* Additional specs */ @@ -190,7 +190,7 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_T_tags, sizeof(asn1_DEF_T_tags) - /sizeof(asn1_DEF_T_tags[0]), + /sizeof(asn1_DEF_T_tags[0]), /* 1 */ 1, /* Tags to skip */ -0, /* Unknown yet */ 0 /* No specifics */ diff --git a/tests/47-set-ext-OK.asn1.-P b/tests/47-set-ext-OK.asn1.-P index a3d1096e4..e945ccfec 100644 --- a/tests/47-set-ext-OK.asn1.-P +++ b/tests/47-set-ext-OK.asn1.-P @@ -10,9 +10,9 @@ /* * Method of determining the components presence */ -enum T1_PR_e { +typedef enum T1_PR { T1_PR_i, /* Member i is present */ -}; +} T1_PR; extern asn1_TYPE_descriptor_t asn1_DEF_T1; /*** <<< TYPE-DECLS [T1] >>> ***/ @@ -73,7 +73,7 @@ asn1_TYPE_descriptor_t asn1_DEF_T1 = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_T1_tags, sizeof(asn1_DEF_T1_tags) - /sizeof(asn1_DEF_T1_tags[0]), + /sizeof(asn1_DEF_T1_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_T1_specs /* Additional specs */ @@ -91,9 +91,9 @@ asn1_TYPE_descriptor_t asn1_DEF_T1 = { /* * Method of determining the components presence */ -enum T2_PR_e { +typedef enum T2_PR { T2_PR_i, /* Member i is present */ -}; +} T2_PR; extern asn1_TYPE_descriptor_t asn1_DEF_T2; /*** <<< TYPE-DECLS [T2] >>> ***/ @@ -154,7 +154,7 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_T2_tags, sizeof(asn1_DEF_T2_tags) - /sizeof(asn1_DEF_T2_tags[0]), + /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_T2_specs /* Additional specs */ @@ -172,14 +172,14 @@ typedef enum T3_PR { T3_PR_NOTHING, /* No components present */ T3_PR_i, /* Extensions may appear below */ -} T3_PR_e; +} T3_PR; extern asn1_TYPE_descriptor_t asn1_DEF_T3; /*** <<< TYPE-DECLS [T3] >>> ***/ typedef struct T3 { - T3_PR_e present; + T3_PR present; union { INTEGER_t i; /* @@ -201,9 +201,6 @@ static asn1_CHOICE_element_t asn1_DEF_T3_elements[] = { (void *)&asn1_DEF_INTEGER, "i" }, -}; -static ber_tlv_tag_t asn1_DEF_T3_tags[] = { - }; static asn1_TYPE_tag2member_t asn1_DEF_T3_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 16 */ @@ -227,9 +224,8 @@ asn1_TYPE_descriptor_t asn1_DEF_T3 = { CHOICE_print, CHOICE_free, CHOICE_outmost_tag, - asn1_DEF_T3_tags, - sizeof(asn1_DEF_T3_tags) - /sizeof(asn1_DEF_T3_tags[0]), + 0, /* No explicit tags (pointer) */ + 0, /* No explicit tags (count) */ 0, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_T3_specs /* Additional specs */ @@ -247,14 +243,14 @@ typedef enum T4_PR { T4_PR_NOTHING, /* No components present */ T4_PR_i, /* Extensions may appear below */ -} T4_PR_e; +} T4_PR; extern asn1_TYPE_descriptor_t asn1_DEF_T4; /*** <<< TYPE-DECLS [T4] >>> ***/ typedef struct T4 { - T4_PR_e present; + T4_PR present; union { INTEGER_t i; /* @@ -276,9 +272,6 @@ static asn1_CHOICE_element_t asn1_DEF_T4_elements[] = { (void *)&asn1_DEF_INTEGER, "i" }, -}; -static ber_tlv_tag_t asn1_DEF_T4_tags[] = { - }; static asn1_TYPE_tag2member_t asn1_DEF_T4_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 17 */ @@ -302,9 +295,8 @@ asn1_TYPE_descriptor_t asn1_DEF_T4 = { CHOICE_print, CHOICE_free, CHOICE_outmost_tag, - asn1_DEF_T4_tags, - sizeof(asn1_DEF_T4_tags) - /sizeof(asn1_DEF_T4_tags[0]), + 0, /* No explicit tags (pointer) */ + 0, /* No explicit tags (count) */ 0, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ &asn1_DEF_T4_specs /* Additional specs */ From 65efbd034885447bb2d30397ab880ab505d1f719 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 11 Aug 2004 07:35:08 +0000 Subject: [PATCH 0086/1469] portability git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@86 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/GeneralizedTime.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 9e8375e5c..5e3b9b018 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -2,6 +2,7 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#define __USE_BSD /* To enable tm_gmtoff in glibc */ #include #include #include @@ -135,19 +136,21 @@ GeneralizedTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, * Where to look for offset from GMT, Phase I. * Several platforms are known. */ -#if defined(__FreeBSD__) || (defined(__GNUC__) && defined(__APPLE_CC__)) -#undef HAVE_TM_ZONE -#define HAVE_TM_ZONE -#endif /* BSDs */ +#if defined(__FreeBSD__) \ + || (defined(__GNUC__) && defined(__APPLE_CC__)) \ + || (defined __GLIBC__ && __GLIBC__ >= 2) +#undef HAVE_TM_GMTOFF +#define HAVE_TM_GMTOFF +#endif /* BSDs and newer glibc */ /* * Where to look for offset from GMT, Phase II. */ -#ifdef HAVE_TM_ZONE +#ifdef HAVE_TM_GMTOFF #define GMTOFF(tm) ((tm).tm_gmtoff) -#else /* HAVE_TM_ZONE */ +#else /* HAVE_TM_GMTOFF */ #define GMTOFF(tm) (-timezone) -#endif /* HAVE_TM_ZONE */ +#endif /* HAVE_TM_GMTOFF */ time_t asn_GT2time(const GeneralizedTime_t *st, struct tm *ret_tm, int as_gmt) { @@ -396,8 +399,12 @@ asn_time2GT(GeneralizedTime_t *opt_gt, const struct tm *tm, int force_gmt) { tm_s = *tm; tm_s.tm_sec -= gmtoff; timegm(&tm_s); /* Fix the time */ - assert(!GMTOFF(tm_s)); tm = &tm_s; +#ifdef HAVE_TM_GMTOFF + assert(!GMTOFF(tm_s)); /* Will fix itself */ +#else + gmtoff = 0; /* Intervention required */ +#endif } size = snprintf(buf, buf_size, "%04d%02d%02d%02d%02d%02d", From 7a6a60eb4254536ad2ceb562897b5a1d5bf9a69a Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 11 Aug 2004 07:41:45 +0000 Subject: [PATCH 0087/1469] portability git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@87 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OBJECT_IDENTIFIER.c | 1 + skeletons/constr_SET.c | 6 ++++++ skeletons/constraints.c | 2 +- skeletons/der_encoder.c | 10 ++++++++-- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index 1e4fe5947..0f7130715 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -367,6 +367,7 @@ OBJECT_IDENTIFIER_set_single_arc(uint8_t *arcbuf, void *arcval, unsigned int arc uint8_t buffer[arcval_size]; #else uint8_t *buffer = alloca(arcval_size); + if(!buffer) { errno = ENOMEM; return -1; } #endif if(isLittleEndian && !prepared_order) { diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index 2fd0ac9be..dc699f5bd 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -447,6 +447,12 @@ SET_encode_der(asn1_TYPE_descriptor_t *sd, if(t2m_build_own) { t2m = alloca(specs->elements_count * sizeof(t2m[0])); t2m_count = 0; + if(!t2m) { /* There are such platforms */ + my_erval.encoded = -1; + my_erval.failed_type = sd; + my_erval.structure_ptr = ptr; + return my_erval; + } } else { /* * There is no untagged CHOICE in this SET. diff --git a/skeletons/constraints.c b/skeletons/constraints.c index cf3170613..5f01cc73e 100644 --- a/skeletons/constraints.c +++ b/skeletons/constraints.c @@ -108,7 +108,7 @@ _asn_i_log_error(asn_app_consume_bytes_f *cb, void *key, const char *fmt, ...) { */ len = ret + 1; p = alloca(len); - if(!p) return; /* Can't be though. */ + if(!p) return; /* Can fail on !x86. */ va_start(ap, fmt); diff --git a/skeletons/der_encoder.c b/skeletons/der_encoder.c index 919350c5e..dc547a2cb 100644 --- a/skeletons/der_encoder.c +++ b/skeletons/der_encoder.c @@ -60,7 +60,10 @@ der_write_tags(asn1_TYPE_descriptor_t *sd, */ int stag_offset; tags = alloca((sd->tags_count + 1) * sizeof(ber_tlv_tag_t)); - if(tags == NULL) return -1; /* Impossible on i386 */ + if(!tags) { /* Can fail on !x86 */ + errno = ENOMEM; + return -1; + } tags_count = sd->tags_count + 1 /* EXPLICIT or IMPLICIT tag is given */ - ((tag_mode==-1)?sd->tags_impl_skip:0); @@ -79,7 +82,10 @@ der_write_tags(asn1_TYPE_descriptor_t *sd, return 0; lens = alloca(tags_count * sizeof(lens[0])); - if(lens == NULL) return -1; + if(!lens) { + errno = ENOMEM; + return -1; + } /* * Array of tags is initialized. From a51f7ce777bb191b1e00cf97461b74345e9bc85b Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 11 Aug 2004 07:48:19 +0000 Subject: [PATCH 0088/1469] portability git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@88 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OBJECT_IDENTIFIER.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index 0f7130715..216aed832 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -509,9 +509,13 @@ OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, unsigned int ar * These require special treatment. */ { + uint8_t *tp; +#ifdef __GNUC__ uint8_t first_value[1 + arc_type_size]; /* of two arcs */ +#else + uint8_t *first_value = alloca(1 + arc_type_size); +#endif uint8_t *fv = first_value; - uint8_t *tp; /* * Simulate first_value = arc0 * 40 + arc1; From 1ff928d1d7c58653f097efba7254529743323825 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 11 Aug 2004 08:10:13 +0000 Subject: [PATCH 0089/1469] portability git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@89 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/BIT_STRING.c | 2 +- skeletons/BOOLEAN.c | 2 +- skeletons/GeneralizedTime.c | 2 +- skeletons/INTEGER.c | 4 ++-- skeletons/NativeInteger.c | 2 +- skeletons/OBJECT_IDENTIFIER.c | 36 ++++++++++++++++++++--------------- skeletons/OCTET_STRING.c | 8 ++++---- skeletons/RELATIVE-OID.c | 4 ++-- skeletons/UTCTime.c | 2 +- skeletons/ber_decoder.c | 4 ++-- skeletons/ber_decoder.h | 14 +++++++------- skeletons/ber_tlv_length.c | 6 +++--- skeletons/ber_tlv_tag.c | 3 ++- skeletons/constr_CHOICE.c | 8 ++++---- skeletons/constr_SEQUENCE.c | 8 ++++---- skeletons/constr_SET.c | 14 +++++++------- skeletons/constr_SET_OF.c | 4 ++-- skeletons/der_encoder.c | 1 + 18 files changed, 66 insertions(+), 58 deletions(-) diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index 7727d78cb..164692947 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -59,7 +59,7 @@ BIT_STRING_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, int BIT_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - static char h2c[16] = "0123456789ABCDEF"; + static const char *h2c = "0123456789ABCDEF"; char scratch[64]; const BIT_STRING_t *st = sptr; uint8_t *buf; diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c index 939131688..209235d72 100644 --- a/skeletons/BOOLEAN.c +++ b/skeletons/BOOLEAN.c @@ -60,7 +60,7 @@ BOOLEAN_decode_ber(asn1_TYPE_descriptor_t *td, ASN_DEBUG("Boolean length is %d bytes", (int)length); - buf_ptr += rval.consumed; + (char *)buf_ptr += rval.consumed; size -= rval.consumed; if(length > (ber_tlv_len_t)size) { rval.code = RC_WMORE; diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 5e3b9b018..99f2e7208 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -437,7 +437,7 @@ asn_time2GT(GeneralizedTime_t *opt_gt, const struct tm *tm, int force_gmt) { if(!opt_gt) { free(buf); return 0; } } - opt_gt->buf = buf; + opt_gt->buf = (unsigned char *)buf; opt_gt->size = size; return opt_gt; diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 120b94fe8..1af06c7c4 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -66,7 +66,7 @@ INTEGER_decode_ber(asn1_TYPE_descriptor_t *td, /* * Make sure we have this length. */ - buf_ptr += rval.consumed; + (char *)buf_ptr += rval.consumed; size -= rval.consumed; if(length > (ber_tlv_len_t)size) { rval.code = RC_WMORE; @@ -230,7 +230,7 @@ INTEGER_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, /* Output in the long xx:yy:zz... format */ /* TODO: replace with generic algorithm (Knuth TAOCP Vol 2, 4.3.1) */ for(p = scratch; buf < buf_end; buf++) { - static char h2c[16] = "0123456789ABCDEF"; + static const char *h2c = "0123456789ABCDEF"; if((p - scratch) >= (ssize_t)(sizeof(scratch) - 4)) { /* Flush buffer */ if(cb(scratch, p - scratch, app_key)) diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index 8f13a5913..3dce02f05 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -73,7 +73,7 @@ NativeInteger_decode_ber(asn1_TYPE_descriptor_t *td, /* * Make sure we have this length. */ - buf_ptr += rval.consumed; + (char *)buf_ptr += rval.consumed; size -= rval.consumed; if(length > (ber_tlv_len_t)size) { rval.code = RC_WMORE; diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index 216aed832..20de2f6cb 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -154,7 +154,7 @@ OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed in #ifndef WORDS_BIGENDIAN if(*(unsigned char *)&LE) { /* Little endian (x86) */ /* "Convert" to big endian */ - rvbuf += rvsize / CHAR_BIT - 1; + (unsigned char *)rvbuf += rvsize / CHAR_BIT - 1; ((unsigned char *)rvstart)--; inc = -1; /* Descending */ } else @@ -167,7 +167,7 @@ OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed in /* Clear the high unused bits */ for(bits = rvsize - arclen; bits > CHAR_BIT; - rvbuf += inc, bits -= CHAR_BIT) + (unsigned char *)rvbuf += inc, bits -= CHAR_BIT) *(unsigned char *)rvbuf = 0; /* Fill the body of a value */ @@ -177,17 +177,17 @@ OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed in if(bits >= CHAR_BIT) { bits -= CHAR_BIT; *(unsigned char *)rvbuf = (cache >> bits); - rvbuf += inc; + (unsigned char *)rvbuf += inc; } } if(bits) { *(unsigned char *)rvbuf = cache; - rvbuf += inc; + (unsigned char *)rvbuf += inc; } } if(add) { - for(rvbuf -= inc; rvbuf != rvstart; rvbuf -= inc) { + for((unsigned char *)rvbuf -= inc; rvbuf != rvstart; (unsigned char *)rvbuf -= inc) { int v = add + *(unsigned char *)rvbuf; if(v & (-1 << CHAR_BIT)) { *(unsigned char *)rvbuf @@ -287,7 +287,7 @@ OBJECT_IDENTIFIER_print(asn1_TYPE_descriptor_t *td, const void *sptr, int OBJECT_IDENTIFIER_get_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, unsigned int arc_type_size, unsigned int arc_slots) { - void *arcs_end = arcs + (arc_type_size * arc_slots); + void *arcs_end = (char *)arcs + (arc_type_size * arc_slots); int num_arcs = 0; int startn = 0; int add = 0; @@ -319,10 +319,10 @@ OBJECT_IDENTIFIER_get_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, add = -40 * first_arc; memset(arcs, 0, arc_type_size); - *(unsigned char *)(arcs + *(unsigned char *)((char *)arcs + ((*(char *)&LE)?0:(arc_type_size - 1))) = first_arc; - arcs += arc_type_size; + (char *)arcs += arc_type_size; } /* Decode, if has space */ @@ -332,7 +332,7 @@ OBJECT_IDENTIFIER_get_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, arcs, arc_type_size)) return -1; startn = i + 1; - arcs += arc_type_size; + (char *)arcs += arc_type_size; add = 0; } num_arcs++; @@ -371,7 +371,7 @@ OBJECT_IDENTIFIER_set_single_arc(uint8_t *arcbuf, void *arcval, unsigned int arc #endif if(isLittleEndian && !prepared_order) { - uint8_t *a = arcval + arcval_size - 1; + uint8_t *a = (unsigned char *)arcval + arcval_size - 1; uint8_t *aend = arcval; uint8_t *msb = buffer + arcval_size - 1; for(tp = buffer; a >= aend; tp++, a--) @@ -381,7 +381,7 @@ OBJECT_IDENTIFIER_set_single_arc(uint8_t *arcbuf, void *arcval, unsigned int arc tp = msb; /* Most significant non-zero byte */ } else { /* Look for most significant non-zero byte */ - tend = arcval + arcval_size; + tend = (unsigned char *)arcval + arcval_size; for(tp = arcval; tp < tend - 1; tp++) if(*tp) break; } @@ -451,7 +451,8 @@ OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, unsigned int ar unsigned char *ps, *pe; /* If more significant bytes are present, * make them > 255 quick */ - for(ps = arcs + 1, pe = ps+arc_type_size; ps < pe; ps++) + for(ps = (unsigned char *)arcs + 1, pe = ps+arc_type_size; + ps < pe; ps++) arc0 |= *ps, arc1 |= *(ps + arc_type_size); arc0 <<= CHAR_BIT, arc1 <<= CHAR_BIT; arc0 = *((unsigned char *)arcs + 0); @@ -512,10 +513,15 @@ OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, unsigned int ar uint8_t *tp; #ifdef __GNUC__ uint8_t first_value[1 + arc_type_size]; /* of two arcs */ + uint8_t *fv = first_value; #else uint8_t *first_value = alloca(1 + arc_type_size); -#endif uint8_t *fv = first_value; + if(!first_value) { + errno = ENOMEM; + return -1; + } +#endif /* * Simulate first_value = arc0 * 40 + arc1; @@ -524,8 +530,8 @@ OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, unsigned int ar *fv++ = 0; (char *)arcs += arc_type_size; if(isLittleEndian) { - uint8_t *aend = arcs - 1; - uint8_t *a1 = arcs + arc_type_size - 1; + uint8_t *aend = (unsigned char *)arcs - 1; + uint8_t *a1 = (unsigned char *)arcs + arc_type_size - 1; for(; a1 > aend; fv++, a1--) *fv = *a1; } else { uint8_t *a1 = arcs; diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 53a1a0d15..d5b28c30e 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -38,7 +38,7 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ - buf_ptr += num; \ + (char *)buf_ptr += num; \ size -= num; \ consumed_myself += num; \ } while(0) @@ -239,7 +239,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, tlv_constr = BER_TLV_CONSTRUCTED(buf_ptr); ll = ber_fetch_length(tlv_constr, - buf_ptr + tl, size - tl, &tlv_len); + (char *)buf_ptr + tl, size - tl, &tlv_len); ASN_DEBUG("Got tag=%s, tl=%d, len=%d, ll=%d, {%d, %d}", ber_tlv_tag_string(tlv_tag), tl, tlv_len, ll, ((uint8_t *)buf_ptr)[0], @@ -325,7 +325,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, */ st->buf[st->size-1] &= 0xff << st->buf[0]; - APPEND((buf_ptr+1), (len - 1)); + APPEND(((char *)buf_ptr+1), (len - 1)); st->buf[0] = *(uint8_t *)buf_ptr; sel->bits_chopped = 1; } else { @@ -457,7 +457,7 @@ OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, int OCTET_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - static char h2c[16] = "0123456789ABCDEF"; + static const char *h2c = "0123456789ABCDEF"; const OCTET_STRING_t *st = sptr; char scratch[16 * 3 + 4]; char *p = scratch; diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index ab4c36671..de0a7c37a 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -65,7 +65,7 @@ RELATIVE_OID_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, int RELATIVE_OID_get_arcs(RELATIVE_OID_t *roid, void *arcs, unsigned int arc_type_size, unsigned int arc_slots) { - void *arcs_end = arcs + (arc_slots * arc_type_size); + void *arcs_end = (char *)arcs + (arc_slots * arc_type_size); int num_arcs = 0; int startn = 0; int i; @@ -86,7 +86,7 @@ RELATIVE_OID_get_arcs(RELATIVE_OID_t *roid, i - startn + 1, 0, arcs, arc_type_size)) return -1; - arcs += arc_type_size; + (char *)arcs += arc_type_size; num_arcs++; } diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c index 2ebf43375..c02e9f712 100644 --- a/skeletons/UTCTime.c +++ b/skeletons/UTCTime.c @@ -93,7 +93,7 @@ asn_UT2time(const UTCTime_t *st, struct tm *_tm, int as_gmt) { return -1; } - gt.buf = buf; + gt.buf = (unsigned char *)buf; gt.size = st->size + 2; memcpy(gt.buf + 2, st->buf, st->size); if(st->buf[0] > 0x35) { diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c index 3ae678ec0..0fd9b2623 100644 --- a/skeletons/ber_decoder.c +++ b/skeletons/ber_decoder.c @@ -7,7 +7,7 @@ #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ - ptr += num; \ + (char *)ptr += num; \ size -= num; \ consumed_myself += num; \ } while(0) @@ -162,7 +162,7 @@ ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *ctx, * Fetch and process L from TLV. */ len_len = ber_fetch_length(tlv_constr, - ptr + tag_len, size - tag_len, &tlv_len); + (char *)ptr + tag_len, size - tag_len, &tlv_len); switch(len_len) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); diff --git a/skeletons/ber_decoder.h b/skeletons/ber_decoder.h index 8240270a9..4842adb53 100644 --- a/skeletons/ber_decoder.h +++ b/skeletons/ber_decoder.h @@ -18,14 +18,14 @@ struct asn1_TYPE_descriptor_s; /* Forward declaration */ * decoded bytes, hence provide a possibility, to fail with more diagnostics * (i.e., print the offending remainder of the buffer). */ +enum ber_dec_rval_code_e { + RC_OK, /* Decoded successfully */ + RC_WMORE, /* More data expected, call again */ + RC_FAIL, /* Failure to decode data */ +}; typedef struct ber_dec_rval_s { - enum { - RC_OK, /* Decoded successfully */ - RC_WMORE, /* More data expected, call again */ - RC_FAIL, /* Failure to decode data */ - } code; - - size_t consumed; /* Number of bytes consumed */ + enum ber_dec_rval_code_e code; /* Result code */ + size_t consumed; /* Number of bytes consumed */ } ber_dec_rval_t; /* diff --git a/skeletons/ber_tlv_length.c b/skeletons/ber_tlv_length.c index 71850f09e..af872366f 100644 --- a/skeletons/ber_tlv_length.c +++ b/skeletons/ber_tlv_length.c @@ -87,7 +87,7 @@ ber_skip_length(int _is_constructed, void *ptr, size_t size) { * Indefinite length! */ ASN_DEBUG("Skipping indefinite length"); - for(skip = ll, ptr += ll, size -= ll;;) { + for(skip = ll, (char *)ptr += ll, size -= ll;;) { ber_tlv_tag_t tag; /* Fetch the tag */ @@ -95,7 +95,7 @@ ber_skip_length(int _is_constructed, void *ptr, size_t size) { if(tl <= 0) return tl; ll = ber_skip_length(BER_TLV_CONSTRUCTED(ptr), - ptr + tl, size - tl); + (char *)ptr + tl, size - tl); if(ll <= 0) return ll; skip += tl + ll; @@ -109,7 +109,7 @@ ber_skip_length(int _is_constructed, void *ptr, size_t size) { && ((uint8_t *)ptr)[1] == 0) return skip; - ptr += tl + ll; + (char *)ptr += tl + ll; size -= tl + ll; } diff --git a/skeletons/ber_tlv_tag.c b/skeletons/ber_tlv_tag.c index a6cccec84..26d712222 100644 --- a/skeletons/ber_tlv_tag.c +++ b/skeletons/ber_tlv_tag.c @@ -30,7 +30,8 @@ ber_fetch_tag(void *ptr, size_t size, ber_tlv_tag_t *tag_r) { * Each octet contains 7 bits of useful information. * The MSB is 0 if it is the last octet of the tag. */ - for(val = 0, ptr++, skipped = 2; skipped < size; ptr++, skipped++) { + for(val = 0, ((char *)ptr)++, skipped = 2; + skipped < size; ((char *)ptr)++, skipped++) { unsigned oct = *(uint8_t *)ptr; if(oct & 0x80) { val = (val << 7) | (oct & 0x7F); diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 7870a4cfc..a620b0ceb 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -31,7 +31,7 @@ */ #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ - ptr += num; \ + (char *)ptr += num; \ size -= num; \ if(ctx->left >= 0) \ ctx->left -= num; \ @@ -128,7 +128,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd, /* * Restore parsing context. */ - ctx = (st + specs->ctx_offset); + ctx = (ber_dec_ctx_t *)((char *)st + specs->ctx_offset); /* * Start to parse where left previously @@ -206,7 +206,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd, skip = ber_skip_length( BER_TLV_CONSTRUCTED(ptr), - ptr + tag_len, LEFT - tag_len); + (char *)ptr + tag_len, LEFT - tag_len); switch(skip) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); @@ -468,7 +468,7 @@ CHOICE_outmost_tag(asn1_TYPE_descriptor_t *td, const void *ptr, int tag_mode, be return asn1_TYPE_outmost_tag(elm->type, memb_ptr, elm->tag_mode, elm->tag); } else { - return -1; + return (ber_tlv_tag_t)-1; } } diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 2a5bbd455..f27368119 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -31,7 +31,7 @@ */ #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ - ptr += num; \ + (char *)ptr += num; \ size -= num; \ if(ctx->left >= 0) \ ctx->left -= num; \ @@ -138,7 +138,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, /* * Restore parsing context. */ - ctx = (st + specs->ctx_offset); + ctx = (ber_dec_ctx_t *)((char *)st + specs->ctx_offset); /* * Start to parse where left previously @@ -336,7 +336,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, skip = ber_skip_length( BER_TLV_CONSTRUCTED(ptr), - ptr + tag_len, LEFT - tag_len); + (char *)ptr + tag_len, LEFT - tag_len); ASN_DEBUG("Skip length %d in %s", (int)skip, sd->name); switch(skip) { @@ -455,7 +455,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, ll = ber_skip_length( BER_TLV_CONSTRUCTED(ptr), - ptr + tl, LEFT - tl); + (char *)ptr + tl, LEFT - tl); switch(ll) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index dc699f5bd..2477a3819 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -37,7 +37,7 @@ */ #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ - ptr += num; \ + (char *)ptr += num; \ size -= num; \ if(ctx->left >= 0) \ ctx->left -= num; \ @@ -128,7 +128,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, /* * Restore parsing context. */ - ctx = (st + specs->ctx_offset); + ctx = (ber_dec_ctx_t *)((char *)st + specs->ctx_offset); /* * Start to parse where left previously @@ -256,7 +256,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, skip = ber_skip_length( BER_TLV_CONSTRUCTED(ptr), - ptr + tag_len, LEFT - tag_len); + (char *)ptr + tag_len, LEFT - tag_len); switch(skip) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); @@ -281,7 +281,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, * Check for duplications: must not overwrite * already decoded elements. */ - if(ASN_SET_ISPRESENT2(st + specs->pres_offset, edx)) { + if(ASN_SET_ISPRESENT2((char *)st + specs->pres_offset, edx)) { ASN_DEBUG("SET %s: Duplicate element %s (%d)", sd->name, elements[edx].name, edx); RETURN(RC_FAIL); @@ -312,7 +312,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, elements[edx].tag_mode); switch(rval.code) { case RC_OK: - ASN_SET_MKPRESENT(st + specs->pres_offset, edx); + ASN_SET_MKPRESENT((char *)st + specs->pres_offset, edx); break; case RC_WMORE: /* More data expected */ if(!SIZE_VIOLATION) { @@ -378,7 +378,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, ll = ber_skip_length( BER_TLV_CONSTRUCTED(ptr), - ptr + tl, LEFT - tl); + (char *)ptr + tl, LEFT - tl); switch(ll) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ @@ -398,7 +398,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, unsigned int midx, pres, must; midx = edx/(8 * sizeof(specs->_mandatory_elements[0])); - pres = ((unsigned int *)(st+specs->pres_offset))[midx]; + pres = ((unsigned int *)((char *)st+specs->pres_offset))[midx]; must = ntohl(specs->_mandatory_elements[midx]); if((pres & must) == must) { diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index ff628d215..84fb895a8 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -31,7 +31,7 @@ */ #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ - ptr += num; \ + (char *)ptr += num; \ size -= num; \ if(ctx->left >= 0) \ ctx->left -= num; \ @@ -95,7 +95,7 @@ SET_OF_decode_ber(asn1_TYPE_descriptor_t *sd, /* * Restore parsing context. */ - ctx = (st + specs->ctx_offset); + ctx = (ber_dec_ctx_t *)((char *)st + specs->ctx_offset); /* * Start to parse where left previously diff --git a/skeletons/der_encoder.c b/skeletons/der_encoder.c index dc547a2cb..9ed91cee9 100644 --- a/skeletons/der_encoder.c +++ b/skeletons/der_encoder.c @@ -4,6 +4,7 @@ */ #include #include +#include static ssize_t der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len, asn_app_consume_bytes_f *cb, void *app_key, int constructed); From e167bf7c024650e611a2918ea5466d2d386ecfea Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 11 Aug 2004 08:11:50 +0000 Subject: [PATCH 0090/1469] compatibility git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@90 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index 59196e436..936f02c61 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,7 @@ * Improved compiler output: duplicate #includes eliminated. * Win32 portability fixes. + * More compatibility with C++ or non-GCC compilers. 0.8.16: 2004-Jul-22 From f5202a5df63b805a19fa3fa033662d1f18bb7ef5 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 11 Aug 2004 08:32:04 +0000 Subject: [PATCH 0091/1469] portability git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@91 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_types.h | 11 +++++++---- skeletons/constr_TYPE.c | 12 ++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/skeletons/asn_types.h b/skeletons/asn_types.h index d2633f6f2..4785f9681 100644 --- a/skeletons/asn_types.h +++ b/skeletons/asn_types.h @@ -24,10 +24,8 @@ typedef int ssize_t; #endif #ifdef WIN32 -#define snprintf(str, size, format, args...) \ - _snprintf(str, size, format, ##args) -#define vsnprintf(str, size, format, ap) \ - _vsnprintf(str, size, format, ap) +#define snprintf _snprintf +#define vsnprintf _vsnprintf #define alloca(size) _alloca(size) #endif @@ -59,10 +57,15 @@ typedef int ssize_t; */ #ifndef ASN_DEBUG /* If debugging code is not defined elsewhere... */ #if EMIT_ASN_DEBUG == 1 /* And it was asked to emit this code... */ +#ifdef __GNUC__ #define ASN_DEBUG(fmt, args...) do { \ fprintf(stderr, fmt, ##args); \ fprintf(stderr, "\n"); \ } while(0) +#else /* !__GNUC__ */ +extern void ASN_DEBUG_f(const char *fmt, ...); +#define ASN_DEBUG ASN_DEBUG_f +#endif /* __GNUC__ */ #else /* EMIT_ASN_DEBUG */ #define ASN_DEBUG(fmt, args...) ((void)0) /* Emit a no-op operator */ #endif /* EMIT_ASN_DEBUG */ diff --git a/skeletons/constr_TYPE.c b/skeletons/constr_TYPE.c index 9ab1bdc5a..2a19bc986 100644 --- a/skeletons/constr_TYPE.c +++ b/skeletons/constr_TYPE.c @@ -56,3 +56,15 @@ _print2fp(const void *buffer, size_t size, void *app_key) { return 0; } + +/* + * Some compilers do not support variable args macros. + * This function is a replacement of ASN_DEBUG() macro. + */ +void ASN_DEBUG_f(const char *fmt, ...) { + va_list ap; + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); +} From da6746826902cb81a338d867bae88274b52ff36e Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 11 Aug 2004 09:07:36 +0000 Subject: [PATCH 0092/1469] C++ compatibility git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@92 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/BIT_STRING.c | 4 ++-- skeletons/BMPString.c | 2 +- skeletons/BOOLEAN.c | 8 +++---- skeletons/GeneralizedTime.c | 10 ++++----- skeletons/IA5String.c | 2 +- skeletons/INTEGER.c | 12 +++++------ skeletons/NativeInteger.c | 8 +++---- skeletons/NumericString.c | 2 +- skeletons/OBJECT_IDENTIFIER.c | 16 +++++++------- skeletons/OCTET_STRING.c | 30 +++++++++++++------------- skeletons/PrintableString.c | 2 +- skeletons/RELATIVE-OID.c | 4 ++-- skeletons/UTCTime.c | 4 ++-- skeletons/UTF8String.c | 5 +++-- skeletons/UniversalString.c | 2 +- skeletons/VisibleString.c | 2 +- skeletons/asn_SEQUENCE_OF.c | 2 +- skeletons/asn_SET_OF.c | 8 +++---- skeletons/ber_tlv_length.c | 4 ++-- skeletons/ber_tlv_tag.c | 2 +- skeletons/constr_CHOICE.c | 27 +++++++++++------------ skeletons/constr_SEQUENCE.c | 24 +++++++++++---------- skeletons/constr_SEQUENCE_OF.c | 5 +++-- skeletons/constr_SET.c | 28 ++++++++++++------------ skeletons/constr_SET_OF.c | 39 +++++++++++++++++++--------------- skeletons/constr_TYPE.c | 2 +- skeletons/constraints.c | 4 ++-- skeletons/der_encoder.c | 4 ++-- 28 files changed, 137 insertions(+), 125 deletions(-) diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index 164692947..ef5bd0a2c 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -32,7 +32,7 @@ asn1_TYPE_descriptor_t asn1_DEF_BIT_STRING = { int BIT_STRING_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const BIT_STRING_t *st = sptr; + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; if(st && st->buf) { if(st->size) { @@ -61,7 +61,7 @@ BIT_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { static const char *h2c = "0123456789ABCDEF"; char scratch[64]; - const BIT_STRING_t *st = sptr; + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; uint8_t *buf; uint8_t *end; char *p = scratch; diff --git a/skeletons/BMPString.c b/skeletons/BMPString.c index 93584c8e0..d91416820 100644 --- a/skeletons/BMPString.c +++ b/skeletons/BMPString.c @@ -32,7 +32,7 @@ asn1_TYPE_descriptor_t asn1_DEF_BMPString = { int BMPString_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - const BMPString_t *st = sptr; + const BMPString_t *st = (const BMPString_t *)sptr; uint16_t *wchar; uint16_t *wend; char scratch[128]; /* Scratchpad buffer */ diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c index 209235d72..eb89c9c26 100644 --- a/skeletons/BOOLEAN.c +++ b/skeletons/BOOLEAN.c @@ -32,14 +32,14 @@ ber_dec_rval_t BOOLEAN_decode_ber(asn1_TYPE_descriptor_t *td, void **bool_structure, void *buf_ptr, size_t size, int tag_mode) { - BOOLEAN_t *st = *bool_structure; + BOOLEAN_t *st = (BOOLEAN_t *)*bool_structure; ber_dec_rval_t rval; ber_dec_ctx_t ctx = { 0, 0, 0, 0 }; ber_tlv_len_t length; ber_tlv_len_t lidx; if(st == NULL) { - st = *bool_structure = CALLOC(1, sizeof(*st)); + (void *)st = *bool_structure = CALLOC(1, sizeof(*st)); if(st == NULL) { rval.code = RC_FAIL; rval.consumed = 0; @@ -96,7 +96,7 @@ BOOLEAN_encode_der(asn1_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { der_enc_rval_t erval; - BOOLEAN_t *st = sptr; + BOOLEAN_t *st = (BOOLEAN_t *)sptr; erval.encoded = der_write_tags(td, 1, tag_mode, tag, cb, app_key); if(erval.encoded == -1) { @@ -127,7 +127,7 @@ BOOLEAN_encode_der(asn1_TYPE_descriptor_t *td, void *sptr, int BOOLEAN_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - const BOOLEAN_t *st = sptr; + const BOOLEAN_t *st = (const BOOLEAN_t *)sptr; (void)td; /* Unused argument */ (void)ilevel; /* Unused argument */ diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 99f2e7208..c65d2960e 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -49,7 +49,7 @@ asn1_TYPE_descriptor_t asn1_DEF_GeneralizedTime = { int GeneralizedTime_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const GeneralizedTime_t *st = sptr; + const GeneralizedTime_t *st = (const GeneralizedTime_t *)sptr; time_t tloc; errno = EPERM; /* Just an unlikely error code */ @@ -67,7 +67,7 @@ der_enc_rval_t GeneralizedTime_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - GeneralizedTime_t *st = ptr; + GeneralizedTime_t *st = (GeneralizedTime_t *)ptr; der_enc_rval_t erval; /* If not canonical DER, re-encode into canonical DER. */ @@ -107,7 +107,7 @@ GeneralizedTime_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int GeneralizedTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - const GeneralizedTime_t *st = sptr; + const GeneralizedTime_t *st = (const GeneralizedTime_t *)sptr; (void)td; /* Unused argument */ (void)ilevel; /* Unused argument */ @@ -390,7 +390,7 @@ asn_time2GT(GeneralizedTime_t *opt_gt, const struct tm *tm, int force_gmt) { } /* Pre-allocate a buffer of sufficient yet small length */ - buf = MALLOC(buf_size); + (void *)buf = MALLOC(buf_size); if(!buf) return 0; gmtoff = GMTOFF(*tm); @@ -433,7 +433,7 @@ asn_time2GT(GeneralizedTime_t *opt_gt, const struct tm *tm, int force_gmt) { if(opt_gt->buf) FREEMEM(opt_gt->buf); } else { - opt_gt = CALLOC(1, sizeof *opt_gt); + (void *)opt_gt = CALLOC(1, sizeof *opt_gt); if(!opt_gt) { free(buf); return 0; } } diff --git a/skeletons/IA5String.c b/skeletons/IA5String.c index 902de8556..7fcb194d3 100644 --- a/skeletons/IA5String.c +++ b/skeletons/IA5String.c @@ -29,7 +29,7 @@ asn1_TYPE_descriptor_t asn1_DEF_IA5String = { int IA5String_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const IA5String_t *st = sptr; + const IA5String_t *st = (const IA5String_t *)sptr; if(st && st->buf) { uint8_t *buf = st->buf; diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 1af06c7c4..9cf146e5e 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -33,7 +33,7 @@ asn1_TYPE_descriptor_t asn1_DEF_INTEGER = { ber_dec_rval_t INTEGER_decode_ber(asn1_TYPE_descriptor_t *td, void **int_structure, void *buf_ptr, size_t size, int tag_mode) { - INTEGER_t *st = *int_structure; + INTEGER_t *st = (INTEGER_t *)*int_structure; ber_dec_rval_t rval; ber_dec_ctx_t ctx = { 0, 0, 0, 0 }; ber_tlv_len_t length; @@ -42,7 +42,7 @@ INTEGER_decode_ber(asn1_TYPE_descriptor_t *td, * If the structure is not there, allocate it. */ if(st == NULL) { - st = *int_structure = CALLOC(1, sizeof(*st)); + (void *)st = *int_structure = CALLOC(1, sizeof(*st)); if(st == NULL) { rval.code = RC_FAIL; rval.consumed = 0; @@ -74,7 +74,7 @@ INTEGER_decode_ber(asn1_TYPE_descriptor_t *td, return rval; } - st->buf = MALLOC(length); + st->buf = (uint8_t *)MALLOC(length); if(st->buf) { st->size = length; } else { @@ -103,7 +103,7 @@ INTEGER_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { der_enc_rval_t erval; - INTEGER_t *st = ptr; + INTEGER_t *st = (INTEGER_t *)ptr; ASN_DEBUG("%s %s as INTEGER (tm=%d)", cb?"Encoding":"Estimating", sd->name, tag_mode); @@ -187,7 +187,7 @@ int INTEGER_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { char scratch[32]; /* Enough for 64-bit integer */ - const INTEGER_t *st = sptr; + const INTEGER_t *st = (const INTEGER_t *)sptr; uint8_t *buf = st->buf; uint8_t *buf_end = st->buf + st->size; signed long accum; @@ -249,7 +249,7 @@ INTEGER_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, void INTEGER_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { - INTEGER_t *st = ptr; + INTEGER_t *st = (INTEGER_t *)ptr; if(!td || !st) return; diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index 3dce02f05..ca29049b7 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -40,7 +40,7 @@ asn1_TYPE_descriptor_t asn1_DEF_NativeInteger = { ber_dec_rval_t NativeInteger_decode_ber(asn1_TYPE_descriptor_t *td, void **int_ptr, void *buf_ptr, size_t size, int tag_mode) { - int *Int = *int_ptr; + int *Int = (int *)*int_ptr; ber_dec_rval_t rval; ber_dec_ctx_t ctx = { 0, 0, 0, 0 }; ber_tlv_len_t length; @@ -49,7 +49,7 @@ NativeInteger_decode_ber(asn1_TYPE_descriptor_t *td, * If the structure is not there, allocate it. */ if(Int == NULL) { - Int = *int_ptr = CALLOC(1, sizeof(*Int)); + (void *)Int = *int_ptr = CALLOC(1, sizeof(*Int)); if(Int == NULL) { rval.code = RC_FAIL; rval.consumed = 0; @@ -89,7 +89,7 @@ NativeInteger_decode_ber(asn1_TYPE_descriptor_t *td, { INTEGER_t tmp; long l; - tmp.buf = buf_ptr; + tmp.buf = (uint8_t *)buf_ptr; tmp.size = length; if(asn1_INTEGER2long(&tmp, &l)) { @@ -165,7 +165,7 @@ NativeInteger_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, int NativeInteger_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - const int *Int = sptr; + const int *Int = (const int *)sptr; char scratch[32]; /* Enough for 64-bit int */ int ret; diff --git a/skeletons/NumericString.c b/skeletons/NumericString.c index ba5892391..0bb86db9f 100644 --- a/skeletons/NumericString.c +++ b/skeletons/NumericString.c @@ -29,7 +29,7 @@ asn1_TYPE_descriptor_t asn1_DEF_NumericString = { int NumericString_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const NumericString_t *st = sptr; + const NumericString_t *st = (const NumericString_t *)sptr; if(st && st->buf) { uint8_t *buf = st->buf; diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index 20de2f6cb..b428acad3 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -38,7 +38,7 @@ OBJECT_IDENTIFIER_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { der_enc_rval_t erval; - OBJECT_IDENTIFIER_t *st = ptr; + OBJECT_IDENTIFIER_t *st = (OBJECT_IDENTIFIER_t *)ptr; ASN_DEBUG("%s %s as OBJECT IDENTIFIER (tm=%d)", cb?"Encoding":"Estimating", sd->name, tag_mode); @@ -75,7 +75,7 @@ OBJECT_IDENTIFIER_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, int OBJECT_IDENTIFIER_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const OBJECT_IDENTIFIER_t *st = sptr; + const OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr; if(st && st->buf) { if(st->size < 1) { @@ -231,7 +231,7 @@ OBJECT_IDENTIFIER_print_arc(uint8_t *arcbuf, int arclen, int add, int OBJECT_IDENTIFIER_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - const OBJECT_IDENTIFIER_t *st = sptr; + const OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr; int startn; int add = 0; int i; @@ -372,7 +372,7 @@ OBJECT_IDENTIFIER_set_single_arc(uint8_t *arcbuf, void *arcval, unsigned int arc if(isLittleEndian && !prepared_order) { uint8_t *a = (unsigned char *)arcval + arcval_size - 1; - uint8_t *aend = arcval; + uint8_t *aend = (uint8_t *)arcval; uint8_t *msb = buffer + arcval_size - 1; for(tp = buffer; a >= aend; tp++, a--) if((*tp = *a) && (tp < msb)) @@ -382,7 +382,7 @@ OBJECT_IDENTIFIER_set_single_arc(uint8_t *arcbuf, void *arcval, unsigned int arc } else { /* Look for most significant non-zero byte */ tend = (unsigned char *)arcval + arcval_size; - for(tp = arcval; tp < tend - 1; tp++) + for(tp = (uint8_t *)arcval; tp < tend - 1; tp++) if(*tp) break; } @@ -461,7 +461,7 @@ OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, unsigned int ar unsigned char *ps, *pe; /* If more significant bytes are present, * make them > 255 quick */ - for(ps = arcs, pe = ps+arc_type_size - 1; ps < pe; ps++) + for(ps = (unsigned char *)arcs, pe = ps+arc_type_size - 1; ps < pe; ps++) arc0 |= *ps, arc1 |= *(ps + arc_type_size); arc0 = *((unsigned char *)arcs + arc_type_size - 1); arc1 = *((unsigned char *)arcs +(arc_type_size<< 1)-1); @@ -499,7 +499,7 @@ OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, unsigned int ar * * the value of the first arc which is in range (0..2) */ size = ((arc_type_size * CHAR_BIT + 6) / 7) * arc_slots; - bp = buf = MALLOC(size + 1); + bp = buf = (uint8_t *)MALLOC(size + 1); if(!buf) { /* ENOMEM */ return -1; @@ -534,7 +534,7 @@ OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, unsigned int ar uint8_t *a1 = (unsigned char *)arcs + arc_type_size - 1; for(; a1 > aend; fv++, a1--) *fv = *a1; } else { - uint8_t *a1 = arcs; + uint8_t *a1 = (uint8_t *)arcs; uint8_t *aend = a1 + arc_type_size; for(; a1 < aend; fv++, a1++) *fv = *a1; } diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index d5b28c30e..e246314ec 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -57,7 +57,7 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { while(_ns <= (size_t)(st->size + bufsize)); \ ptr = REALLOC(st->buf, _ns); \ if(ptr) { \ - st->buf = ptr; \ + st->buf = (uint8_t *)ptr; \ ctx->step = _ns; \ } else { \ RETURN(RC_FAIL); \ @@ -100,7 +100,7 @@ _add_stack_el(struct _stack *st) { nel->want_nulls = 0; nel->bits_chopped = 0; } else { - nel = CALLOC(1, sizeof(struct _stack_el)); + (void *)nel = CALLOC(1, sizeof(struct _stack_el)); if(nel == NULL) return NULL; @@ -119,7 +119,7 @@ _add_stack_el(struct _stack *st) { static struct _stack * _new_stack() { struct _stack *st; - st = CALLOC(1, sizeof(struct _stack)); + (void *)st = CALLOC(1, sizeof(struct _stack)); if(st == NULL) return NULL; @@ -138,7 +138,7 @@ _new_stack() { ber_dec_rval_t OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, void **os_structure, void *buf_ptr, size_t size, int tag_mode) { - OCTET_STRING_t *st = *os_structure; + OCTET_STRING_t *st = (OCTET_STRING_t *)*os_structure; ber_dec_rval_t rval; ber_dec_ctx_t *ctx; ssize_t consumed_myself = 0; @@ -160,7 +160,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, * Create the string if does not exist. */ if(st == NULL) { - st = *os_structure = CALLOC(1, sizeof(*st)); + (void *)st = *os_structure = CALLOC(1, sizeof(*st)); if(st == NULL) RETURN(RC_FAIL); } @@ -189,7 +189,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, */ ctx->ptr = _new_stack(); if(ctx->ptr) { - stck = ctx->ptr; + (void *)stck = ctx->ptr; if(ctx->left < 0) { stck->cur_ptr->want_nulls = -ctx->left; stck->cur_ptr->left = -1; @@ -223,7 +223,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, /* * Fill the stack with expectations. */ - stck = ctx->ptr; + (void *)stck = ctx->ptr; sel = stck->cur_ptr; do { ber_tlv_tag_t tlv_tag; @@ -307,7 +307,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, NEXT_PHASE(ctx); /* Fall through */ case 2: - stck = ctx->ptr; + (void *)stck = ctx->ptr; sel = stck->cur_ptr; ASN_DEBUG("Phase 2: Need %ld bytes, size=%ld", (long)sel->left, (long)size); @@ -391,7 +391,7 @@ OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { der_enc_rval_t erval; - OCTET_STRING_t *st = ptr; + OCTET_STRING_t *st = (OCTET_STRING_t *)ptr; int add_byte = 0; ASN_DEBUG("%s %s as OCTET STRING", @@ -458,7 +458,7 @@ int OCTET_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { static const char *h2c = "0123456789ABCDEF"; - const OCTET_STRING_t *st = sptr; + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; char scratch[16 * 3 + 4]; char *p = scratch; uint8_t *buf; @@ -495,7 +495,7 @@ OCTET_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, int OCTET_STRING_print_ascii(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - const OCTET_STRING_t *st = sptr; + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; (void)td; /* Unused argument */ (void)ilevel; /* Unused argument */ @@ -509,8 +509,8 @@ OCTET_STRING_print_ascii(asn1_TYPE_descriptor_t *td, const void *sptr, void OCTET_STRING_free(asn1_TYPE_descriptor_t *td, void *sptr, int contents_only) { - OCTET_STRING_t *st = sptr; - struct _stack *stck = st->_ber_dec_ctx.ptr; + OCTET_STRING_t *st = (OCTET_STRING_t *)sptr; + struct _stack *stck = (struct _stack *)st->_ber_dec_ctx.ptr; if(!td || !st) return; @@ -569,7 +569,7 @@ OCTET_STRING_fromBuf(OCTET_STRING_t *st, const char *str, int len) { if(buf == NULL) { return -1; } else { - st->buf = buf; + st->buf = (uint8_t *)buf; st->size = len; } @@ -583,7 +583,7 @@ OCTET_STRING_t * OCTET_STRING_new_fromBuf(const char *str, int len) { OCTET_STRING_t *st; - st = CALLOC(1, sizeof(*st)); + (void *)st = CALLOC(1, sizeof(*st)); if(st && str && OCTET_STRING_fromBuf(st, str, len)) { free(st); st = NULL; diff --git a/skeletons/PrintableString.c b/skeletons/PrintableString.c index 8589bd225..5c9a1fb58 100644 --- a/skeletons/PrintableString.c +++ b/skeletons/PrintableString.c @@ -52,7 +52,7 @@ static int _PrintableString_alphabet[256] = { int PrintableString_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const PrintableString_t *st = sptr; + const PrintableString_t *st = (const PrintableString_t *)sptr; if(st && st->buf) { uint8_t *buf = st->buf; diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index de0a7c37a..eaf98b171 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -32,7 +32,7 @@ asn1_TYPE_descriptor_t asn1_DEF_RELATIVE_OID = { int RELATIVE_OID_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - const RELATIVE_OID_t *st = sptr; + const RELATIVE_OID_t *st = (const RELATIVE_OID_t *)sptr; int startn; int i; @@ -112,7 +112,7 @@ RELATIVE_OID_set_arcs(RELATIVE_OID_t *roid, void *arcs, unsigned int arc_type_si * Roughly estimate the maximum size necessary to encode these arcs. */ size = ((arc_type_size * CHAR_BIT + 6) / 7) * arcs_slots; - bp = buf = MALLOC(size + 1); + bp = buf = (uint8_t *)MALLOC(size + 1); if(!buf) { /* ENOMEM */ return -1; diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c index c02e9f712..e15cca91c 100644 --- a/skeletons/UTCTime.c +++ b/skeletons/UTCTime.c @@ -40,7 +40,7 @@ asn1_TYPE_descriptor_t asn1_DEF_UTCTime = { int UTCTime_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const UTCTime_t *st = sptr; + const UTCTime_t *st = (const UTCTime_t *)sptr; time_t tloc; errno = EPERM; /* Just an unlikely error code */ @@ -57,7 +57,7 @@ UTCTime_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, int UTCTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - const UTCTime_t *st = sptr; + const UTCTime_t *st = (const UTCTime_t *)sptr; (void)td; /* Unused argument */ (void)ilevel; /* Unused argument */ diff --git a/skeletons/UTF8String.c b/skeletons/UTF8String.c index 4ec15b826..6b40b25c7 100644 --- a/skeletons/UTF8String.c +++ b/skeletons/UTF8String.c @@ -39,7 +39,8 @@ int UTF8String_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { ssize_t len; - len = UTF8String_length(sptr, td->name, app_errlog, app_key); + len = UTF8String_length((const UTF8String_t *)sptr, td->name, + app_errlog, app_key); if(len > 0) len = 0; return len; } @@ -103,7 +104,7 @@ UTF8String_length(const UTF8String_t *st, const char *opt_type_name, int UTF8String_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - const UTF8String_t *st = sptr; + const UTF8String_t *st = (const UTF8String_t *)sptr; (void)td; /* Unused argument */ (void)ilevel; /* Unused argument */ diff --git a/skeletons/UniversalString.c b/skeletons/UniversalString.c index 1e3444eef..241fe673c 100644 --- a/skeletons/UniversalString.c +++ b/skeletons/UniversalString.c @@ -30,7 +30,7 @@ asn1_TYPE_descriptor_t asn1_DEF_UniversalString = { int UniversalString_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - const UniversalString_t *st = sptr; + const UniversalString_t *st = (const UniversalString_t *)sptr; uint32_t *wchar; uint32_t *wend; char scratch[128]; /* Scratchpad buffer */ diff --git a/skeletons/VisibleString.c b/skeletons/VisibleString.c index 4a335a3a1..ad0426eb2 100644 --- a/skeletons/VisibleString.c +++ b/skeletons/VisibleString.c @@ -52,7 +52,7 @@ static int _VisibleString_alphabet[256] = { int VisibleString_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const VisibleString_t *st = sptr; + const VisibleString_t *st = (const VisibleString_t *)sptr; if(st && st->buf) { uint8_t *buf = st->buf; diff --git a/skeletons/asn_SEQUENCE_OF.c b/skeletons/asn_SEQUENCE_OF.c index 71f6f0cd0..7cfd45f3a 100644 --- a/skeletons/asn_SEQUENCE_OF.c +++ b/skeletons/asn_SEQUENCE_OF.c @@ -9,7 +9,7 @@ typedef A_SEQUENCE_OF(void) asn_sequence; void asn_sequence_del(void *asn_sequence_of_x, int number, int _do_free) { - asn_sequence *as = asn_sequence_of_x; + asn_sequence *as = (asn_sequence *)asn_sequence_of_x; if(as) { void *ptr; diff --git a/skeletons/asn_SET_OF.c b/skeletons/asn_SET_OF.c index d89b357f6..c6afc30f8 100644 --- a/skeletons/asn_SET_OF.c +++ b/skeletons/asn_SET_OF.c @@ -13,7 +13,7 @@ typedef A_SET_OF(void) asn_set; */ int asn_set_add(void *asn_set_of_x, void *ptr) { - asn_set *as = asn_set_of_x; + asn_set *as = (asn_set *)asn_set_of_x; if(as == 0 || ptr == 0) { errno = EINVAL; /* Invalid arguments */ @@ -28,7 +28,7 @@ asn_set_add(void *asn_set_of_x, void *ptr) { void *_new_arr; _new_arr = REALLOC(as->array, _newsize * sizeof(as->array[0])); if(_new_arr) { - as->array = _new_arr; + as->array = (void **)_new_arr; as->size = _newsize; } else { /* ENOMEM */ @@ -43,7 +43,7 @@ asn_set_add(void *asn_set_of_x, void *ptr) { void asn_set_del(void *asn_set_of_x, int number, int _do_free) { - asn_set *as = asn_set_of_x; + asn_set *as = (asn_set *)asn_set_of_x; if(as) { void *ptr; @@ -71,7 +71,7 @@ asn_set_del(void *asn_set_of_x, int number, int _do_free) { */ void asn_set_empty(void *asn_set_of_x) { - asn_set *as = asn_set_of_x; + asn_set *as = (asn_set *)asn_set_of_x; if(as) { if(as->array) { diff --git a/skeletons/ber_tlv_length.c b/skeletons/ber_tlv_length.c index af872366f..3ce5a6b70 100644 --- a/skeletons/ber_tlv_length.c +++ b/skeletons/ber_tlv_length.c @@ -9,7 +9,7 @@ ssize_t ber_fetch_length(int _is_constructed, void *bufptr, size_t size, ber_tlv_len_t *len_r) { - uint8_t *buf = bufptr; + uint8_t *buf = (uint8_t *)bufptr; unsigned oct; if(size == 0) @@ -119,7 +119,7 @@ ber_skip_length(int _is_constructed, void *ptr, size_t size) { ssize_t der_tlv_length_serialize(ber_tlv_len_t len, void *bufp, size_t size) { size_t computed_size; /* Size of len encoding */ - uint8_t *buf = bufp; + uint8_t *buf = (uint8_t *)bufp; uint8_t *end; int i; diff --git a/skeletons/ber_tlv_tag.c b/skeletons/ber_tlv_tag.c index 26d712222..2664b9061 100644 --- a/skeletons/ber_tlv_tag.c +++ b/skeletons/ber_tlv_tag.c @@ -102,7 +102,7 @@ ssize_t der_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { int tclass = BER_TAG_CLASS(tag); ber_tlv_tag_t tval = BER_TAG_VALUE(tag); - uint8_t *buf = bufp; + uint8_t *buf = (uint8_t *)bufp; uint8_t *end; size_t computed_size; int i; diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index a620b0ceb..7bcf5c5f6 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -66,8 +66,9 @@ static inline void _set_present_idx(void *sptr, int offset, int size, int pres); */ static int _search4tag(const void *ap, const void *bp) { - const asn1_TYPE_tag2member_t *a = ap; - const asn1_TYPE_tag2member_t *b = bp; + const asn1_TYPE_tag2member_t *a = (const asn1_TYPE_tag2member_t *)ap; + const asn1_TYPE_tag2member_t *b = (const asn1_TYPE_tag2member_t *)bp; + int a_class = BER_TAG_CLASS(a->el_tag); int b_class = BER_TAG_CLASS(b->el_tag); @@ -97,7 +98,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd, /* * Bring closer parts of structure description. */ - asn1_CHOICE_specifics_t *specs = sd->specifics; + asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)sd->specifics; asn1_CHOICE_element_t *elements = specs->elements; /* @@ -183,7 +184,8 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd, asn1_TYPE_tag2member_t key; key.el_tag = tlv_tag; - t2m = bsearch(&key, specs->tag2el, specs->tag2el_count, + (void *)t2m = bsearch(&key, + specs->tag2el, specs->tag2el_count, sizeof(specs->tag2el[0]), _search4tag); if(t2m) { /* @@ -227,7 +229,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd, do { asn1_CHOICE_element_t *elm; /* CHOICE's element */ void *memb_ptr; /* Pointer to the member */ - void *memb_ptr2; /* Pointer to that pointer */ + void **memb_ptr2; /* Pointer to that pointer */ elm = &elements[ctx->step]; @@ -238,7 +240,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd, */ if(elm->optional) { /* Optional member, hereby, a simple pointer */ - memb_ptr2 = (char *)st + elm->memb_offset; + memb_ptr2 = (void **)((char *)st + elm->memb_offset); } else { /* * A pointer to a pointer @@ -250,8 +252,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd, /* * Invoke the member fetch routine according to member's type */ - rval = elm->type->ber_decoder( - (void *)elm->type, + rval = elm->type->ber_decoder(elm->type, memb_ptr2, ptr, LEFT, elm->tag_mode); switch(rval.code) { @@ -352,7 +353,7 @@ CHOICE_encode_der(asn1_TYPE_descriptor_t *sd, void *struct_ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_CHOICE_specifics_t *specs = sd->specifics; + asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)sd->specifics; asn1_CHOICE_element_t *elm; /* CHOICE element */ der_enc_rval_t erval; void *memb_ptr; @@ -442,7 +443,7 @@ CHOICE_encode_der(asn1_TYPE_descriptor_t *sd, ber_tlv_tag_t CHOICE_outmost_tag(asn1_TYPE_descriptor_t *td, const void *ptr, int tag_mode, ber_tlv_tag_t tag) { - asn1_CHOICE_specifics_t *specs = td->specifics; + asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)td->specifics; int present; assert(tag_mode == 0); @@ -475,7 +476,7 @@ CHOICE_outmost_tag(asn1_TYPE_descriptor_t *td, const void *ptr, int tag_mode, be int CHOICE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - asn1_CHOICE_specifics_t *specs = td->specifics; + asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)td->specifics; int present; if(!sptr) { @@ -509,7 +510,7 @@ CHOICE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, int CHOICE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_CHOICE_specifics_t *specs = td->specifics; + asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)td->specifics; int present; if(!sptr) return cb("", 8, app_key); @@ -547,7 +548,7 @@ CHOICE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, void CHOICE_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { - asn1_CHOICE_specifics_t *specs = td->specifics; + asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)td->specifics; int present; if(!td || !ptr) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index f27368119..db36f9016 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -69,8 +69,9 @@ */ static int _t2e_cmp(const void *ap, const void *bp) { - const asn1_TYPE_tag2member_t *a = ap; - const asn1_TYPE_tag2member_t *b = bp; + const asn1_TYPE_tag2member_t *a = (const asn1_TYPE_tag2member_t *)ap; + const asn1_TYPE_tag2member_t *b = (const asn1_TYPE_tag2member_t *)bp; + int a_class = BER_TAG_CLASS(a->el_tag); int b_class = BER_TAG_CLASS(b->el_tag); @@ -107,7 +108,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, /* * Bring closer parts of structure description. */ - asn1_SEQUENCE_specifics_t *specs = sd->specifics; + asn1_SEQUENCE_specifics_t *specs = (asn1_SEQUENCE_specifics_t *)sd->specifics; asn1_SEQUENCE_element_t *elements = specs->elements; /* @@ -184,7 +185,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, for(edx = (ctx->step >> 1); edx < specs->elements_count; edx++, ctx->step = (ctx->step & ~1) + 2) { void *memb_ptr; /* Pointer to the member */ - void *memb_ptr2; /* Pointer to that pointer */ + void **memb_ptr2; /* Pointer to that pointer */ ssize_t tag_len; /* Length of TLV's T */ int opt_edx_end; /* Next non-optional element */ int use_bsearch; @@ -267,7 +268,8 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, asn1_TYPE_tag2member_t key; key.el_tag = tlv_tag; key.el_no = edx; - t2m = bsearch(&key, specs->tag2el, specs->tag2el_count, + (void *)t2m = bsearch(&key, + specs->tag2el, specs->tag2el_count, sizeof(specs->tag2el[0]), _t2e_cmp); if(t2m) { asn1_TYPE_tag2member_t *best = 0; @@ -366,7 +368,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, */ if(elements[edx].optional) { /* Optional member, hereby, a simple pointer */ - memb_ptr2 = (char *)st + elements[edx].memb_offset; + memb_ptr2 = (void **)((char *)st + elements[edx].memb_offset); } else { /* * A pointer to a pointer @@ -379,7 +381,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, * Invoke the member fetch routine according to member's type */ rval = elements[edx].type->ber_decoder( - (void *)elements[edx].type, + elements[edx].type, memb_ptr2, ptr, LEFT, elements[edx].tag_mode); ASN_DEBUG("In %s SEQUENCE decoded %d %s in %d bytes code %d", @@ -479,7 +481,7 @@ der_enc_rval_t SEQUENCE_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_SEQUENCE_specifics_t *specs = sd->specifics; + asn1_SEQUENCE_specifics_t *specs = (asn1_SEQUENCE_specifics_t *)sd->specifics; size_t computed_size = 0; der_enc_rval_t erval; ssize_t ret; @@ -564,7 +566,7 @@ SEQUENCE_encode_der(asn1_TYPE_descriptor_t *sd, int SEQUENCE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_SEQUENCE_specifics_t *specs = td->specifics; + asn1_SEQUENCE_specifics_t *specs = (asn1_SEQUENCE_specifics_t *)td->specifics; int edx; int ret; @@ -612,7 +614,7 @@ SEQUENCE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, void SEQUENCE_free(asn1_TYPE_descriptor_t *td, void *sptr, int contents_only) { - asn1_SEQUENCE_specifics_t *specs = td->specifics; + asn1_SEQUENCE_specifics_t *specs = (asn1_SEQUENCE_specifics_t *)td->specifics; int edx; if(!td || !sptr) @@ -641,7 +643,7 @@ SEQUENCE_free(asn1_TYPE_descriptor_t *td, void *sptr, int contents_only) { int SEQUENCE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - asn1_SEQUENCE_specifics_t *specs = td->specifics; + asn1_SEQUENCE_specifics_t *specs = (asn1_SEQUENCE_specifics_t *)td->specifics; int edx; if(!sptr) { diff --git a/skeletons/constr_SEQUENCE_OF.c b/skeletons/constr_SEQUENCE_OF.c index a839949de..0370a2d91 100644 --- a/skeletons/constr_SEQUENCE_OF.c +++ b/skeletons/constr_SEQUENCE_OF.c @@ -12,9 +12,9 @@ der_enc_rval_t SEQUENCE_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_SET_OF_specifics_t *specs = sd->specifics; + asn1_SET_OF_specifics_t *specs = (asn1_SET_OF_specifics_t *)sd->specifics; asn1_SET_OF_element_t *elm = specs->element; - A_SEQUENCE_OF(void) *list = ptr; + A_SEQUENCE_OF(void) *list; size_t computed_size = 0; ssize_t encoding_size = 0; der_enc_rval_t erval; @@ -25,6 +25,7 @@ SEQUENCE_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, /* * Gather the length of the underlying members sequence. */ + (void *)list = ptr; for(edx = 0; edx < list->count; edx++) { void *memb_ptr = list->array[edx]; erval = elm->type->der_encoder(elm->type, memb_ptr, diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index 2477a3819..ec9caf0e3 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -66,8 +66,9 @@ */ static int _t2e_cmp(const void *ap, const void *bp) { - const asn1_TYPE_tag2member_t *a = ap; - const asn1_TYPE_tag2member_t *b = bp; + const asn1_TYPE_tag2member_t *a = (const asn1_TYPE_tag2member_t *)ap; + const asn1_TYPE_tag2member_t *b = (const asn1_TYPE_tag2member_t *)bp; + int a_class = BER_TAG_CLASS(a->el_tag); int b_class = BER_TAG_CLASS(b->el_tag); @@ -97,7 +98,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, /* * Bring closer parts of structure description. */ - asn1_SET_specifics_t *specs = sd->specifics; + asn1_SET_specifics_t *specs = (asn1_SET_specifics_t *)sd->specifics; asn1_SET_element_t *elements = specs->elements; /* @@ -179,7 +180,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, ctx->step = (ctx->step & ~1) + 2, edx = (ctx->step >> 1)) { void *memb_ptr; /* Pointer to the member */ - void *memb_ptr2; /* Pointer to that pointer */ + void **memb_ptr2; /* Pointer to that pointer */ ssize_t tag_len; /* Length of TLV's T */ if(ctx->step & 1) @@ -234,7 +235,8 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, asn1_TYPE_tag2member_t key; key.el_tag = tlv_tag; - t2m = bsearch(&key, specs->tag2el, specs->tag2el_count, + (void *)t2m = bsearch(&key, + specs->tag2el, specs->tag2el_count, sizeof(specs->tag2el[0]), _t2e_cmp); if(t2m) { /* @@ -294,7 +296,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, */ if(elements[edx].optional) { /* Optional member, hereby, a simple pointer */ - memb_ptr2 = (char *)st + elements[edx].memb_offset; + memb_ptr2 = (void **)((char *)st + elements[edx].memb_offset); } else { /* * A pointer to a pointer @@ -307,7 +309,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, * Invoke the member fetch routine according to member's type */ rval = elements[edx].type->ber_decoder( - (void *)elements[edx].type, + elements[edx].type, memb_ptr2, ptr, LEFT, elements[edx].tag_mode); switch(rval.code) { @@ -432,7 +434,7 @@ der_enc_rval_t SET_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_SET_specifics_t *specs = sd->specifics; + asn1_SET_specifics_t *specs = (asn1_SET_specifics_t *)sd->specifics; size_t computed_size = 0; der_enc_rval_t my_erval; int t2m_build_own = (specs->tag2el_count != specs->elements_count); @@ -445,14 +447,14 @@ SET_encode_der(asn1_TYPE_descriptor_t *sd, * Use existing, or build our own tags map. */ if(t2m_build_own) { - t2m = alloca(specs->elements_count * sizeof(t2m[0])); - t2m_count = 0; + (void *)t2m = alloca(specs->elements_count * sizeof(t2m[0])); if(!t2m) { /* There are such platforms */ my_erval.encoded = -1; my_erval.failed_type = sd; my_erval.structure_ptr = ptr; return my_erval; } + t2m_count = 0; } else { /* * There is no untagged CHOICE in this SET. @@ -578,7 +580,7 @@ SET_encode_der(asn1_TYPE_descriptor_t *sd, int SET_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_SET_specifics_t *specs = td->specifics; + asn1_SET_specifics_t *specs = (asn1_SET_specifics_t *)td->specifics; int edx; int ret; @@ -625,7 +627,7 @@ SET_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, void SET_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { - asn1_SET_specifics_t *specs = td->specifics; + asn1_SET_specifics_t *specs = (asn1_SET_specifics_t *)td->specifics; int edx; if(!td || !ptr) @@ -654,7 +656,7 @@ SET_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { int SET_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - asn1_SET_specifics_t *specs = td->specifics; + asn1_SET_specifics_t *specs = (asn1_SET_specifics_t *)td->specifics; int edx; if(!sptr) { diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index 84fb895a8..3bebf7d14 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -65,7 +65,7 @@ SET_OF_decode_ber(asn1_TYPE_descriptor_t *sd, /* * Bring closer parts of structure description. */ - asn1_SET_OF_specifics_t *specs = sd->specifics; + asn1_SET_OF_specifics_t *specs = (asn1_SET_OF_specifics_t *)sd->specifics; asn1_SET_OF_element_t *element = specs->element; /* @@ -201,8 +201,7 @@ SET_OF_decode_ber(asn1_TYPE_descriptor_t *sd, /* * Invoke the member fetch routine according to member's type */ - rval = element->type->ber_decoder( - (void *)element->type, + rval = element->type->ber_decoder(element->type, &ctx->ptr, ptr, LEFT, 0); ASN_DEBUG("In %s SET OF %s code %d consumed %d", sd->name, element->type->name, @@ -210,7 +209,8 @@ SET_OF_decode_ber(asn1_TYPE_descriptor_t *sd, switch(rval.code) { case RC_OK: { - A_SET_OF(void) *list = st; + A_SET_OF(void) *list; + (void *)list = st; if(ASN_SET_ADD(list, ctx->ptr) != 0) RETURN(RC_FAIL); else @@ -269,7 +269,7 @@ struct _el_buffer { }; /* Append bytes to the above structure */ static int _el_addbytes(const void *buffer, size_t size, void *el_buf_ptr) { - struct _el_buffer *el_buf = el_buf_ptr; + struct _el_buffer *el_buf = (struct _el_buffer *)el_buf_ptr; if(el_buf->length + size > el_buf->size) return -1; @@ -280,8 +280,8 @@ static int _el_addbytes(const void *buffer, size_t size, void *el_buf_ptr) { return 0; } static int _el_buf_cmp(const void *ap, const void *bp) { - const struct _el_buffer *a = ap; - const struct _el_buffer *b = bp; + const struct _el_buffer *a = (const struct _el_buffer *)ap; + const struct _el_buffer *b = (const struct _el_buffer *)bp; int ret; size_t common_len; @@ -308,11 +308,11 @@ der_enc_rval_t SET_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_SET_OF_specifics_t *specs = sd->specifics; + asn1_SET_OF_specifics_t *specs = (asn1_SET_OF_specifics_t *)sd->specifics; asn1_SET_OF_element_t *elm = specs->element; asn1_TYPE_descriptor_t *elm_type = elm->type; der_type_encoder_f *der_encoder = elm_type->der_encoder; - A_SET_OF(void) *list = ptr; + A_SET_OF(void) *list; size_t computed_size = 0; ssize_t encoding_size = 0; struct _el_buffer *encoded_els; @@ -326,6 +326,7 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, /* * Gather the length of the underlying members sequence. */ + (void *)list = ptr; for(edx = 0; edx < list->count; edx++) { void *memb_ptr = list->array[edx]; erval = der_encoder(elm_type, memb_ptr, 0, elm->tag, 0, 0); @@ -361,7 +362,7 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, * according to their encodings. Build an array of the * encoded elements. */ - encoded_els = MALLOC(list->count * sizeof(encoded_els[0])); + (void *)encoded_els = MALLOC(list->count * sizeof(encoded_els[0])); if(encoded_els == NULL) { erval.encoded = -1; erval.failed_type = sd; @@ -381,7 +382,7 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, /* * Prepare space for encoding. */ - encoded_el->buf = MALLOC(max_encoded_len); + encoded_el->buf = (uint8_t *)MALLOC(max_encoded_len); if(encoded_el->buf) { encoded_el->length = 0; encoded_el->size = max_encoded_len; @@ -447,9 +448,9 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, int SET_OF_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_SET_OF_specifics_t *specs = td->specifics; + asn1_SET_OF_specifics_t *specs = (asn1_SET_OF_specifics_t *)td->specifics; asn1_SET_OF_element_t *element = specs->element; - const A_SET_OF(void) *list = sptr; + const A_SET_OF(void) *list; int ret; int i; @@ -460,6 +461,7 @@ SET_OF_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, || cb(" ::= {\n", 7, app_key)) return -1; + (void *)list = sptr; for(i = 0; i < list->count; i++) { const void *memb_ptr = list->array[i]; if(!memb_ptr) continue; @@ -484,15 +486,16 @@ SET_OF_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, void SET_OF_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { if(td && ptr) { - asn1_SET_OF_specifics_t *specs = td->specifics; + asn1_SET_OF_specifics_t *specs = (asn1_SET_OF_specifics_t *)td->specifics; asn1_SET_OF_element_t *element = specs->element; - A_SET_OF(void) *list = ptr; + A_SET_OF(void) *list; int i; /* * Could not use set_of_empty() because of (*free) * incompatibility. */ + (void *)list = ptr; for(i = 0; i < list->count; i++) { void *memb_ptr = list->array[i]; if(memb_ptr) @@ -511,9 +514,9 @@ SET_OF_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { int SET_OF_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - asn1_SET_OF_specifics_t *specs = td->specifics; + asn1_SET_OF_specifics_t *specs = (asn1_SET_OF_specifics_t *)td->specifics; asn1_SET_OF_element_t *element = specs->element; - const A_SET_OF(void) *list = sptr; + const A_SET_OF(void) *list; int i; if(!sptr) { @@ -521,6 +524,8 @@ SET_OF_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return -1; } + (void *)list = sptr; + for(i = 0; i < list->count; i++) { const void *memb_ptr = list->array[i]; if(!memb_ptr) continue; diff --git a/skeletons/constr_TYPE.c b/skeletons/constr_TYPE.c index 2a19bc986..e19f8d96b 100644 --- a/skeletons/constr_TYPE.c +++ b/skeletons/constr_TYPE.c @@ -48,7 +48,7 @@ asn_fprint(FILE *stream, asn1_TYPE_descriptor_t *td, const void *struct_ptr) { /* Dump the data into the specified stdio stream */ static int _print2fp(const void *buffer, size_t size, void *app_key) { - FILE *stream = app_key; + FILE *stream = (FILE *)app_key; if(fwrite(buffer, 1, size, stream) != size) return -1; diff --git a/skeletons/constraints.c b/skeletons/constraints.c index 5f01cc73e..a7dce959a 100644 --- a/skeletons/constraints.c +++ b/skeletons/constraints.c @@ -35,7 +35,7 @@ struct __fill_errbuf_arg { static int __fill_errbuf(const void *buffer, size_t size, void *app_key) { - struct __fill_errbuf_arg *arg = app_key; + struct __fill_errbuf_arg *arg = (struct __fill_errbuf_arg *)app_key; size_t avail = arg->errlen - arg->erroff; if(avail > size) @@ -107,7 +107,7 @@ _asn_i_log_error(asn_app_consume_bytes_f *cb, void *key, const char *fmt, ...) { * More space required to hold the message. */ len = ret + 1; - p = alloca(len); + p = (char *)alloca(len); if(!p) return; /* Can fail on !x86. */ diff --git a/skeletons/der_encoder.c b/skeletons/der_encoder.c index 9ed91cee9..ddd0bf86b 100644 --- a/skeletons/der_encoder.c +++ b/skeletons/der_encoder.c @@ -60,7 +60,7 @@ der_write_tags(asn1_TYPE_descriptor_t *sd, * and initialize it appropriately. */ int stag_offset; - tags = alloca((sd->tags_count + 1) * sizeof(ber_tlv_tag_t)); + tags = (ber_tlv_tag_t *)alloca((sd->tags_count + 1) * sizeof(ber_tlv_tag_t)); if(!tags) { /* Can fail on !x86 */ errno = ENOMEM; return -1; @@ -82,7 +82,7 @@ der_write_tags(asn1_TYPE_descriptor_t *sd, if(tags_count == 0) return 0; - lens = alloca(tags_count * sizeof(lens[0])); + lens = (ssize_t *)alloca(tags_count * sizeof(lens[0])); if(!lens) { errno = ENOMEM; return -1; From e55716a5dd45b033368239dc469b213a729478a0 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 11 Aug 2004 09:10:59 +0000 Subject: [PATCH 0093/1469] portability git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@93 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OBJECT_IDENTIFIER.c | 2 +- skeletons/asn_types.h | 2 +- skeletons/constr_CHOICE.c | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index b428acad3..baf3e4236 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -345,7 +345,7 @@ OBJECT_IDENTIFIER_get_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, /* * Save the single value as an object identifier arc. */ -inline int +int OBJECT_IDENTIFIER_set_single_arc(uint8_t *arcbuf, void *arcval, unsigned int arcval_size, int prepared_order) { /* * The following conditions must hold: diff --git a/skeletons/asn_types.h b/skeletons/asn_types.h index 4785f9681..fb0f7eb9f 100644 --- a/skeletons/asn_types.h +++ b/skeletons/asn_types.h @@ -14,7 +14,7 @@ #include /* For size_t */ #include /* For va_start */ #include /* for offsetof and ptrdiff_t */ -#if __STDC_VERSION__ < 199901L +#ifndef WIN32 #include /* C99 Standard specifies this file, for uintXX_t */ #else typedef unsigned char uint8_t; diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 7bcf5c5f6..23303f12f 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -58,8 +58,8 @@ /* * See the definitions. */ -static inline int _fetch_present_idx(const void *struct_ptr, int off, int size); -static inline void _set_present_idx(void *sptr, int offset, int size, int pres); +static int _fetch_present_idx(const void *struct_ptr, int off, int size); +static void _set_present_idx(void *sptr, int offset, int size, int pres); /* * Tags are canonically sorted in the tag to member table. @@ -593,7 +593,7 @@ CHOICE_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { * is guaranteed to be aligned properly. ASN.1 compiler itself does not * produce packed code. */ -static inline int +static int _fetch_present_idx(const void *struct_ptr, int pres_offset, int pres_size) { const void *present_ptr; int present; @@ -613,7 +613,7 @@ _fetch_present_idx(const void *struct_ptr, int pres_offset, int pres_size) { return present; } -static inline void +static void _set_present_idx(void *struct_ptr, int pres_offset, int pres_size, int present) { void *present_ptr; present_ptr = ((char *)struct_ptr) + pres_offset; From 754284a705409ac07bec094bfd71dfceb6032e37 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 11 Aug 2004 09:17:15 +0000 Subject: [PATCH 0094/1469] portability git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@94 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/GeneralizedTime.c | 1 - skeletons/OBJECT_IDENTIFIER.c | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index c65d2960e..9b8c1aa19 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -2,7 +2,6 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ -#define __USE_BSD /* To enable tm_gmtoff in glibc */ #include #include #include diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index baf3e4236..7579349f8 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -191,7 +191,7 @@ OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed in int v = add + *(unsigned char *)rvbuf; if(v & (-1 << CHAR_BIT)) { *(unsigned char *)rvbuf - = v + (1 << CHAR_BIT); + = (unsigned char)(v + (1 << CHAR_BIT)); add = -1; } else { *(unsigned char *)rvbuf = v; @@ -223,7 +223,7 @@ OBJECT_IDENTIFIER_print_arc(uint8_t *arcbuf, int arclen, int add, /* Fill the scratch buffer in reverse. */ p = scratch + sizeof(scratch); for(; accum; accum /= 10) - *(--p) = (accum % 10) + 0x30; + *(--p) = (char)(accum % 10) + 0x30; return cb(p, sizeof(scratch) - (p - scratch), app_key); } From cd02fd9302263e012edae2d907ee2686a64c1ee4 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 11 Aug 2004 09:25:09 +0000 Subject: [PATCH 0095/1469] portability git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@95 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constraints.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/skeletons/constraints.h b/skeletons/constraints.h index 255b6ae2c..d299e735d 100644 --- a/skeletons/constraints.h +++ b/skeletons/constraints.h @@ -45,13 +45,17 @@ asn_constr_check_f asn_generic_unknown_constraint; /* Not fully supported */ /* * Invoke the callback with a complete error message. */ +#ifdef __GNUC__ #define _ASN_ERRLOG(fmt, args...) do { \ if(app_errlog) \ _asn_i_log_error(app_errlog, \ app_key, fmt, ##args); \ - break; \ - } while(0); -void _asn_i_log_error(asn_app_consume_bytes_f *, void *key, +} while(0); +#else /* Preprocessor does not support variable args macros */ +#define _ASN_ERRLOG if(app_errlog) _asn_i_log_error +#endif + +extern void _asn_i_log_error(asn_app_consume_bytes_f *, void *key, const char *fmt, ...) __attribute__ ((format(printf, 3, 4))); #endif /* _ASN1_CONSTRAINTS_VALIDATOR_H_ */ From e517408193235afaf1ac7f7f9e8293d66e3da82f Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 11 Aug 2004 09:34:42 +0000 Subject: [PATCH 0096/1469] portability git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@96 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_types.h | 4 ++++ skeletons/constr_SET_OF.c | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/skeletons/asn_types.h b/skeletons/asn_types.h index fb0f7eb9f..7cbeaf4ee 100644 --- a/skeletons/asn_types.h +++ b/skeletons/asn_types.h @@ -67,7 +67,11 @@ extern void ASN_DEBUG_f(const char *fmt, ...); #define ASN_DEBUG ASN_DEBUG_f #endif /* __GNUC__ */ #else /* EMIT_ASN_DEBUG */ +#ifdef __GNUC__ #define ASN_DEBUG(fmt, args...) ((void)0) /* Emit a no-op operator */ +#else /* __GNUC__ */ +static void ASN_DEBUG(const char *fmt, ...) { (void)fmt; }; +#endif /* __GNUC__ */ #endif /* EMIT_ASN_DEBUG */ #endif /* ASN_DEBUG */ diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index 3bebf7d14..b3428bf18 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -461,7 +461,7 @@ SET_OF_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, || cb(" ::= {\n", 7, app_key)) return -1; - (void *)list = sptr; + (const void *)list = sptr; for(i = 0; i < list->count; i++) { const void *memb_ptr = list->array[i]; if(!memb_ptr) continue; @@ -524,7 +524,7 @@ SET_OF_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return -1; } - (void *)list = sptr; + (const void *)list = sptr; for(i = 0; i < list->count; i++) { const void *memb_ptr = list->array[i]; From e3f0f2834faf4ce86ac89da7ddfb5f51569c477e Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 11 Aug 2004 09:44:13 +0000 Subject: [PATCH 0097/1469] portability git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@97 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/BIT_STRING.c | 9 ++++++--- skeletons/GeneralizedTime.c | 3 ++- skeletons/IA5String.c | 6 ++++-- skeletons/NumericString.c | 6 ++++-- skeletons/OBJECT_IDENTIFIER.c | 6 ++++-- skeletons/PrintableString.c | 6 ++++-- skeletons/UTCTime.c | 3 ++- skeletons/UTF8String.c | 11 +++++++---- skeletons/VisibleString.c | 6 ++++-- skeletons/constr_CHOICE.c | 6 ++++-- skeletons/constr_SEQUENCE.c | 3 ++- skeletons/constr_SET.c | 5 +++-- skeletons/constr_SET_OF.c | 3 ++- skeletons/constraints.h | 8 ++++---- 14 files changed, 52 insertions(+), 29 deletions(-) diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index ef5bd0a2c..7e576a1e8 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -37,16 +37,19 @@ BIT_STRING_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(st && st->buf) { if(st->size) { if(st->size == 1 && st->buf[0] != 0) { - _ASN_ERRLOG("%s: invalid padding byte", + _ASN_ERRLOG(app_errlog, app_key, + "%s: invalid padding byte", td->name); return -1; } } else { - _ASN_ERRLOG("%s: no padding byte", td->name); + _ASN_ERRLOG(app_errlog, app_key, + "%s: no padding byte", td->name); return -1; } } else { - _ASN_ERRLOG("%s: value not given", td->name); + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); return -1; } diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 9b8c1aa19..586fb4aa4 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -54,7 +54,8 @@ GeneralizedTime_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, errno = EPERM; /* Just an unlikely error code */ tloc = asn_GT2time(st, 0, 0); if(tloc == -1 && errno != EPERM) { - _ASN_ERRLOG("%s: Invalid time format: %s", + _ASN_ERRLOG(app_errlog, app_key, + "%s: Invalid time format: %s", td->name, strerror(errno)); return -1; } diff --git a/skeletons/IA5String.c b/skeletons/IA5String.c index 7fcb194d3..c520bb295 100644 --- a/skeletons/IA5String.c +++ b/skeletons/IA5String.c @@ -40,7 +40,8 @@ IA5String_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ for(; buf < end; buf++) { if(*buf > 0x7F) { - _ASN_ERRLOG("%s: value byte %d out of range: " + _ASN_ERRLOG(app_errlog, app_key, + "%s: value byte %d out of range: " "%d > 127", td->name, (buf - st->buf) + 1, @@ -50,7 +51,8 @@ IA5String_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } } } else { - _ASN_ERRLOG("%s: value not given", td->name); + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); return -1; } diff --git a/skeletons/NumericString.c b/skeletons/NumericString.c index 0bb86db9f..a8d4ed8c7 100644 --- a/skeletons/NumericString.c +++ b/skeletons/NumericString.c @@ -46,7 +46,8 @@ NumericString_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: continue; } - _ASN_ERRLOG("%s: value byte %d " + _ASN_ERRLOG(app_errlog, app_key, + "%s: value byte %d " "not in NumericString alphabet (%d)", td->name, (buf - st->buf) + 1, @@ -55,7 +56,8 @@ NumericString_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return -1; } } else { - _ASN_ERRLOG("%s: value not given", td->name); + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); return -1; } diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index 7579349f8..89e2e327c 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -79,12 +79,14 @@ OBJECT_IDENTIFIER_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(st && st->buf) { if(st->size < 1) { - _ASN_ERRLOG("%s: at least one numerical value expected", + _ASN_ERRLOG(app_errlog, app_key, + "%s: at least one numerical value expected", td->name); return -1; } } else { - _ASN_ERRLOG("%s: value not given", td->name); + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); return -1; } diff --git a/skeletons/PrintableString.c b/skeletons/PrintableString.c index 5c9a1fb58..f894d82e4 100644 --- a/skeletons/PrintableString.c +++ b/skeletons/PrintableString.c @@ -64,7 +64,8 @@ PrintableString_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ for(; buf < end; buf++) { if(!_PrintableString_alphabet[*buf]) { - _ASN_ERRLOG("%s: value byte %d " + _ASN_ERRLOG(app_errlog, app_key, + "%s: value byte %d " "not in PrintableString alphabet (%d)", td->name, (buf - st->buf) + 1, @@ -74,7 +75,8 @@ PrintableString_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } } } else { - _ASN_ERRLOG("%s: value not given", td->name); + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); return -1; } diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c index e15cca91c..7d9711732 100644 --- a/skeletons/UTCTime.c +++ b/skeletons/UTCTime.c @@ -46,7 +46,8 @@ UTCTime_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, errno = EPERM; /* Just an unlikely error code */ tloc = asn_UT2time(st, 0, 0); if(tloc == -1 && errno != EPERM) { - _ASN_ERRLOG("%s: Invalid time format: %s", + _ASN_ERRLOG(app_errlog, app_key, + "%s: Invalid time format: %s", td->name, strerror(errno)); return -1; } diff --git a/skeletons/UTF8String.c b/skeletons/UTF8String.c index 6b40b25c7..06e1559e8 100644 --- a/skeletons/UTF8String.c +++ b/skeletons/UTF8String.c @@ -60,7 +60,8 @@ UTF8String_length(const UTF8String_t *st, const char *opt_type_name, int w = _UTF8String_h1[ch >> 4]; if(want) { /* Continuation expected */ if(w) { - _ASN_ERRLOG("%s: UTF-8 expectation " + _ASN_ERRLOG(app_errlog, app_key, + "%s: UTF-8 expectation " "failed at byte %d", opt_type_name, (buf - st->buf) + 1); @@ -75,7 +76,7 @@ UTF8String_length(const UTF8String_t *st, const char *opt_type_name, break; /* Fall through */ case 0: - _ASN_ERRLOG( + _ASN_ERRLOG(app_errlog, app_key, "%s: UTF-8 expectation" "failed at byte %d", opt_type_name, @@ -89,14 +90,16 @@ UTF8String_length(const UTF8String_t *st, const char *opt_type_name, /* If still want something, then something is wrong */ if(want) { - _ASN_ERRLOG("%s: truncated UTF-8 sequence", + _ASN_ERRLOG(app_errlog, app_key, + "%s: truncated UTF-8 sequence", opt_type_name); return -1; } return length; } else { - _ASN_ERRLOG("%s: value not given", opt_type_name); + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", opt_type_name); return -1; } } diff --git a/skeletons/VisibleString.c b/skeletons/VisibleString.c index ad0426eb2..4033a177d 100644 --- a/skeletons/VisibleString.c +++ b/skeletons/VisibleString.c @@ -64,7 +64,8 @@ VisibleString_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ for(; buf < end; buf++) { if(!_VisibleString_alphabet[*buf]) { - _ASN_ERRLOG("%s: value byte %d " + _ASN_ERRLOG(app_errlog, app_key, + "%s: value byte %d " "not in VisibleString alphabet (%d)", td->name, (buf - st->buf) + 1, @@ -74,7 +75,8 @@ VisibleString_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } } } else { - _ASN_ERRLOG("%s: value not given", td->name); + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); return -1; } diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 23303f12f..a63d6fbaf 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -480,7 +480,8 @@ CHOICE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, int present; if(!sptr) { - _ASN_ERRLOG("%s: value not given", td->name); + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); return -1; } @@ -502,7 +503,8 @@ CHOICE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return elm->type->check_constraints(elm->type, memb_ptr, app_errlog, app_key); } else { - _ASN_ERRLOG("%s: no CHOICE element given", td->name); + _ASN_ERRLOG(app_errlog, app_key, + "%s: no CHOICE element given", td->name); return -1; } } diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index db36f9016..fd0f59a14 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -647,7 +647,8 @@ SEQUENCE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, int edx; if(!sptr) { - _ASN_ERRLOG("%s: value not given", td->name); + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); return -1; } diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index ec9caf0e3..2602b8028 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -660,7 +660,8 @@ SET_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, int edx; if(!sptr) { - _ASN_ERRLOG("%s: value not given", td->name); + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); return -1; } @@ -676,7 +677,7 @@ SET_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!memb_ptr) { if(ASN_SET_ISPRESENT2( &(specs->_mandatory_elements), edx)) { - _ASN_ERRLOG( + _ASN_ERRLOG(app_errlog, app_key, "%s: mandatory element " "%s absent", td->name, elm->name); diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index b3428bf18..53877f3d0 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -520,7 +520,8 @@ SET_OF_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, int i; if(!sptr) { - _ASN_ERRLOG("%s: value not given", td->name); + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); return -1; } diff --git a/skeletons/constraints.h b/skeletons/constraints.h index d299e735d..dfc0759f7 100644 --- a/skeletons/constraints.h +++ b/skeletons/constraints.h @@ -46,10 +46,10 @@ asn_constr_check_f asn_generic_unknown_constraint; /* Not fully supported */ * Invoke the callback with a complete error message. */ #ifdef __GNUC__ -#define _ASN_ERRLOG(fmt, args...) do { \ - if(app_errlog) \ - _asn_i_log_error(app_errlog, \ - app_key, fmt, ##args); \ +#define _ASN_ERRLOG(app_errlog, app_key, fmt, args...) do { \ + if(app_errlog) \ + _asn_i_log_error(app_errlog, \ + app_key, fmt, ##args); \ } while(0); #else /* Preprocessor does not support variable args macros */ #define _ASN_ERRLOG if(app_errlog) _asn_i_log_error From f091c176f510f50c6f2eebf758b6805e40589f09 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 11 Aug 2004 09:45:04 +0000 Subject: [PATCH 0098/1469] portability git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@98 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SET_OF.c | 1 - 1 file changed, 1 deletion(-) diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index 53877f3d0..4b2ae3a49 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -526,7 +526,6 @@ SET_OF_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } (const void *)list = sptr; - for(i = 0; i < list->count; i++) { const void *memb_ptr = list->array[i]; if(!memb_ptr) continue; From 7d8db86d6ec8e848acd73687d582d4e38b3d5cd8 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 11 Aug 2004 10:09:03 +0000 Subject: [PATCH 0099/1469] comment git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@99 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_types.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/asn_types.h b/skeletons/asn_types.h index 7cbeaf4ee..a8bfb6d49 100644 --- a/skeletons/asn_types.h +++ b/skeletons/asn_types.h @@ -66,7 +66,7 @@ typedef int ssize_t; extern void ASN_DEBUG_f(const char *fmt, ...); #define ASN_DEBUG ASN_DEBUG_f #endif /* __GNUC__ */ -#else /* EMIT_ASN_DEBUG */ +#else /* EMIT_ASN_DEBUG != 1 */ #ifdef __GNUC__ #define ASN_DEBUG(fmt, args...) ((void)0) /* Emit a no-op operator */ #else /* __GNUC__ */ From cd8575c79b6ecc9f2d8c7dc1e0425c2a58f9d4b7 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 11 Aug 2004 11:51:15 +0000 Subject: [PATCH 0100/1469] portability git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@100 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_TYPE.c | 1 + 1 file changed, 1 insertion(+) diff --git a/skeletons/constr_TYPE.c b/skeletons/constr_TYPE.c index e19f8d96b..68cc50fa8 100644 --- a/skeletons/constr_TYPE.c +++ b/skeletons/constr_TYPE.c @@ -61,6 +61,7 @@ _print2fp(const void *buffer, size_t size, void *app_key) { * Some compilers do not support variable args macros. * This function is a replacement of ASN_DEBUG() macro. */ +void ASN_DEBUG_f(const char *fmt, ...); void ASN_DEBUG_f(const char *fmt, ...) { va_list ap; va_start(ap, fmt); From c329a7e945cccc268afedfb4cd0ed5db6cf31c29 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 12 Aug 2004 02:35:53 +0000 Subject: [PATCH 0101/1469] portability git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@101 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/GeneralizedTime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 586fb4aa4..5d53e638b 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -10,7 +10,7 @@ #endif /* __NO_ASSERT_H__ */ #ifdef WIN32 -#define localtime_r(tlocp, tmp) (*tmp = localtime(&tlocp)) +#define localtime_r(tlocp, tmp) (*tmp = localtime(tlocp)) #warning PLEASE STOP AND READ! #warning localtime_r is implemented via localtime(), which is not thread-safe. You must fix the code to insert appropriate locking if you want to use asn_GT2time() or asn_UT2time(). #warning PLEASE STOP AND READ! From c48f21386e92a0420615eb2ec9c569d25c7fe058 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 12 Aug 2004 03:52:53 +0000 Subject: [PATCH 0102/1469] portability git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@102 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/GeneralizedTime.c | 39 ++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 5d53e638b..c9b05de54 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -10,11 +10,40 @@ #endif /* __NO_ASSERT_H__ */ #ifdef WIN32 -#define localtime_r(tlocp, tmp) (*tmp = localtime(tlocp)) #warning PLEASE STOP AND READ! -#warning localtime_r is implemented via localtime(), which is not thread-safe. You must fix the code to insert appropriate locking if you want to use asn_GT2time() or asn_UT2time(). +#warning localtime_r is implemented via localtime(), which is not thread-safe. +#warning gmtime_r is implemented via gmtime(), which is not thread-safe. +#warning +#warning You must fix the code by inserting appropriate locking +#warning if you want to use asn_GT2time() or asn_UT2time(). #warning PLEASE STOP AND READ! -#endif + +static struct tm *localtime_r(time_t *tloc, struct tm *result) { + struct tm *tm; + if((tm = localtime(tloc))) + return memcpy(result, tm, sizeof(struct tm)); + return 0; +} + +static struct tm *gmtime_r(time_t *tloc, struct tm *result) { + struct tm *tm; + if((tm = gmtime(tloc))) + return memcpy(result, tm, sizeof(struct tm)); + return 0; +} + +/* vlm: I am not sure about validity of this algorithm. */ +static time_t timegm(struct tm *tm) { + struct tm tmp; + time_t tloc = mktime(tm); + localtime_r(&tloc, &tmp); /* Figure out our GMT offset */ + tloc += tmp.tm_gmtoff; + tm->tm_zone = "GMT"; + tm->tm_gmtoff = 0; /* Simulate GMT */ + return tloc; +} + +#endif /* WIN32 */ #ifndef __NO_ASN_TABLE__ @@ -337,9 +366,9 @@ asn_GT2time(const GeneralizedTime_t *st, struct tm *ret_tm, int as_gmt) { /*** AT THIS POINT tm_s is either GMT or local (unknown) ****/ - if(offset_specified) + if(offset_specified) { tloc = timegm(&tm_s); - else { + } else { /* * Without an offset (or 'Z'), * we can only guess that it is a local zone. From 348a37ad8774b356f121a52c78c2e08085bb1791 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 12 Aug 2004 03:58:25 +0000 Subject: [PATCH 0103/1469] portability git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@103 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/GeneralizedTime.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index c9b05de54..f17b43934 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -32,6 +32,24 @@ static struct tm *gmtime_r(time_t *tloc, struct tm *result) { return 0; } +#define tzset() _tzset() +static time_t timegm(struct tm *tm) { + time_t tloc; + char *tz; + + tz = getenv("TZ"); + setenv("TZ", "", 1); + tzset(); + tloc = mktime(tm); + if (tz) + setenv("TZ", tz, 1); + else + unsetenv("TZ"); + tzset(); + return tloc; +} + +#if 0 /* Alternate version */ /* vlm: I am not sure about validity of this algorithm. */ static time_t timegm(struct tm *tm) { struct tm tmp; @@ -42,7 +60,7 @@ static time_t timegm(struct tm *tm) { tm->tm_gmtoff = 0; /* Simulate GMT */ return tloc; } - +#endif #endif /* WIN32 */ #ifndef __NO_ASN_TABLE__ From d36922829e023ba658caf575026c2e77bb45e58d Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 12 Aug 2004 07:47:03 +0000 Subject: [PATCH 0104/1469] portability git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@104 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/GeneralizedTime.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index f17b43934..4d1b3908d 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -36,15 +36,19 @@ static struct tm *gmtime_r(time_t *tloc, struct tm *result) { static time_t timegm(struct tm *tm) { time_t tloc; char *tz; + char *buf; tz = getenv("TZ"); - setenv("TZ", "", 1); + _putenv("TZ=UTC"); tzset(); tloc = mktime(tm); - if (tz) - setenv("TZ", tz, 1); - else - unsetenv("TZ"); + if (tz) { + buf = alloca(strlen(tz) + 4); + sprintf(buf, "TZ=%s", tz); + } else { + buf = "TZ="; + } + _putenv(buf); tzset(); return tloc; } From 1b247eee220534878e6dacac8816cc128be4a644 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 12 Aug 2004 07:56:02 +0000 Subject: [PATCH 0105/1469] ASN_ERRLOG api changed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@105 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 5b9bf7c9d..197ce1f93 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1408,7 +1408,8 @@ emit_constraint_checking_code(arg_t *arg) { OUT("if(!sptr) {\n"); INDENT(+1); - OUT("_ASN_ERRLOG(\"%%s: value not given\", td->name);\n"); + OUT("_ASN_ERRLOG(app_errlog, app_key,\n"); + OUT("\t\"%%s: value not given\", td->name);\n"); OUT("return -1;\n"); INDENT(-1); OUT("}\n"); @@ -1426,7 +1427,8 @@ emit_constraint_checking_code(arg_t *arg) { INDENTED(OUT("/* Constraint check succeeded */\n")); OUT("} else {\n"); INDENT(+1); - OUT("_ASN_ERRLOG(\"%%s: constraint failed\", td->name);\n"); + OUT("_ASN_ERRLOG(app_errlog, app_key,\n"); + OUT("\t\"%%s: constraint failed\", td->name);\n"); OUT("return -1;\n"); INDENT(-1); OUT("}\n"); @@ -1979,8 +1981,8 @@ emit_value_determination_code(arg_t *arg) { } else { OUT("if(asn1_INTEGER2long(st, &value)) {\n"); INDENT(+1); - OUT("_ASN_ERRLOG(\"%%s: value too large\", " - "td->name);\n"); + OUT("_ASN_ERRLOG(app_errlog, app_key,\n"); + OUT("\t\"%%s: value too large\", td->name);\n"); OUT("return -1;\n"); INDENT(-1); OUT("}\n"); From 97ed715cc5b59bcadbba6a1506f285d16b7f1917 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 13 Aug 2004 12:31:09 +0000 Subject: [PATCH 0106/1469] fixed multiple imports problem git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@106 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_y.c | 491 ++++++++++++++++++++-------------------- libasn1parser/asn1p_y.h | 6 +- libasn1parser/asn1p_y.y | 7 +- 3 files changed, 253 insertions(+), 251 deletions(-) diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index 18c744a21..5e56d4356 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -359,7 +359,7 @@ typedef union { } tv_nametag; } yystype; /* Line 193 of /usr/local/share/bison/yacc.c. */ -#line 363 "y.tab.c" +#line 363 "asn1p_y.c" # define YYSTYPE yystype # define YYSTYPE_IS_TRIVIAL 1 #endif @@ -380,7 +380,7 @@ typedef struct yyltype /* Line 213 of /usr/local/share/bison/yacc.c. */ -#line 384 "y.tab.c" +#line 384 "asn1p_y.c" #if ! defined (yyoverflow) || YYERROR_VERBOSE @@ -648,29 +648,29 @@ static const unsigned short yyrline[] = { 0, 297, 297, 303, 309, 325, 350, 352, 355, 359, 364, 371, 379, 384, 388, 397, 399, 407, 411, 419, - 423, 426, 429, 437, 439, 448, 452, 477, 481, 490, - 497, 510, 521, 534, 541, 546, 552, 558, 567, 573, - 579, 586, 594, 598, 601, 608, 614, 620, 627, 636, - 646, 654, 662, 664, 676, 688, 695, 711, 721, 731, - 741, 746, 753, 763, 769, 775, 779, 791, 797, 803, - 813, 815, 818, 826, 832, 841, 846, 863, 865, 872, - 870, 879, 884, 890, 894, 919, 926, 931, 939, 948, - 957, 968, 972, 978, 986, 1010, 1017, 1031, 1040, 1050, - 1060, 1068, 1089, 1098, 1107, 1108, 1110, 1117, 1129, 1140, - 1139, 1146, 1150, 1154, 1158, 1161, 1166, 1178, 1194, 1205, - 1219, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, - 1230, 1231, 1237, 1239, 1240, 1243, 1250, 1262, 1264, 1268, - 1272, 1273, 1274, 1275, 1276, 1280, 1281, 1282, 1283, 1287, - 1288, 1291, 1298, 1304, 1310, 1318, 1326, 1332, 1348, 1350, - 1353, 1353, 1354, 1354, 1355, 1357, 1370, 1373, 1378, 1384, - 1388, 1395, 1403, 1408, 1417, 1419, 1421, 1426, 1428, 1434, - 1436, 1441, 1448, 1455, 1463, 1466, 1471, 1473, 1474, 1475, - 1478, 1482, 1487, 1491, 1502, 1506, 1511, 1516, 1521, 1528, - 1534, 1538, 1543, 1549, 1561, 1563, 1566, 1570, 1573, 1578, - 1582, 1590, 1605, 1611, 1618, 1631, 1643, 1658, 1662, 1679, - 1681, 1684, 1688, 1694, 1697, 1699, 1699, 1719, 1724, 1729, - 1735, 1741, 1749, 1757, 1765, 1772, 1782, 1787, 1817, 1819, - 1822, 1827, 1831, 1837, 1842, 1848, 1855, 1862, 1867 + 423, 426, 429, 437, 439, 448, 452, 478, 482, 491, + 498, 511, 522, 535, 542, 547, 553, 559, 568, 574, + 580, 587, 595, 599, 602, 609, 615, 621, 628, 637, + 647, 655, 663, 665, 677, 689, 696, 712, 722, 732, + 742, 747, 754, 764, 770, 776, 780, 792, 798, 804, + 814, 816, 819, 827, 833, 842, 847, 864, 866, 873, + 871, 880, 885, 891, 895, 920, 927, 932, 940, 949, + 958, 969, 973, 979, 987, 1011, 1018, 1032, 1041, 1051, + 1061, 1069, 1090, 1099, 1108, 1109, 1111, 1118, 1130, 1141, + 1140, 1147, 1151, 1155, 1159, 1162, 1167, 1179, 1195, 1206, + 1220, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, + 1231, 1232, 1238, 1240, 1241, 1244, 1251, 1263, 1265, 1269, + 1273, 1274, 1275, 1276, 1277, 1281, 1282, 1283, 1284, 1288, + 1289, 1292, 1299, 1305, 1311, 1319, 1327, 1333, 1349, 1351, + 1354, 1354, 1355, 1355, 1356, 1358, 1371, 1374, 1379, 1385, + 1389, 1396, 1404, 1409, 1418, 1420, 1422, 1427, 1429, 1435, + 1437, 1442, 1449, 1456, 1464, 1467, 1472, 1474, 1475, 1476, + 1479, 1483, 1488, 1492, 1503, 1507, 1512, 1517, 1522, 1529, + 1535, 1539, 1544, 1550, 1562, 1564, 1567, 1571, 1574, 1579, + 1583, 1591, 1606, 1612, 1619, 1632, 1644, 1659, 1663, 1680, + 1682, 1685, 1689, 1695, 1698, 1700, 1700, 1720, 1725, 1730, + 1736, 1742, 1750, 1758, 1766, 1773, 1783, 1788, 1818, 1820, + 1823, 1828, 1832, 1838, 1843, 1849, 1856, 1863, 1868 }; #endif @@ -1893,12 +1893,13 @@ yyparse (YYPARSE_PARAM_ARG) #error MY_IMPORT DEFINED ELSEWHERE! #endif #define MY_IMPORT(foo,field) do { \ - if(TQ_FIRST(&(yyvsp[0].a_module->foo))) { \ + while(TQ_FIRST(&(yyvsp[0].a_module->foo))) { \ TQ_ADD(&(yyval.a_module->foo), \ TQ_REMOVE(&(yyvsp[0].a_module->foo), field), \ field); \ - assert(TQ_FIRST(&(yyvsp[0].a_module->foo)) == 0); \ - } } while(0) + } \ + assert(TQ_FIRST(&(yyvsp[0].a_module->foo)) == 0); \ + } while(0) MY_IMPORT(imports, xp_next); MY_IMPORT(exports, xp_next); @@ -1909,14 +1910,14 @@ yyparse (YYPARSE_PARAM_ARG) break; case 27: -#line 478 "asn1p_y.y" +#line 479 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; } break; case 28: -#line 481 "asn1p_y.y" +#line 482 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1929,7 +1930,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 29: -#line 490 "asn1p_y.y" +#line 491 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1940,7 +1941,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 30: -#line 497 "asn1p_y.y" +#line 498 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1951,7 +1952,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 31: -#line 510 "asn1p_y.y" +#line 511 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1962,7 +1963,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 32: -#line 521 "asn1p_y.y" +#line 522 "asn1p_y.y" { return yyerror( "Attempt to redefine a standard basic type, " @@ -1972,21 +1973,21 @@ yyparse (YYPARSE_PARAM_ARG) break; case 33: -#line 535 "asn1p_y.y" +#line 536 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; } break; case 34: -#line 541 "asn1p_y.y" +#line 542 "asn1p_y.y" { return yyerror("Empty IMPORTS list"); } break; case 35: -#line 547 "asn1p_y.y" +#line 548 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1995,7 +1996,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 36: -#line 552 "asn1p_y.y" +#line 553 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); @@ -2003,7 +2004,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 37: -#line 559 "asn1p_y.y" +#line 560 "asn1p_y.y" { yyval.a_xports = yyvsp[-3].a_xports; yyval.a_xports->from = yyvsp[-1].tv_str; @@ -2013,7 +2014,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 38: -#line 568 "asn1p_y.y" +#line 569 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); @@ -2022,7 +2023,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 39: -#line 573 "asn1p_y.y" +#line 574 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); @@ -2030,7 +2031,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 40: -#line 580 "asn1p_y.y" +#line 581 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2040,7 +2041,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 41: -#line 586 "asn1p_y.y" +#line 587 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2050,21 +2051,21 @@ yyparse (YYPARSE_PARAM_ARG) break; case 42: -#line 595 "asn1p_y.y" +#line 596 "asn1p_y.y" { yyval.a_xports = yyvsp[-1].a_xports; } break; case 43: -#line 598 "asn1p_y.y" +#line 599 "asn1p_y.y" { yyval.a_xports = 0; } break; case 44: -#line 601 "asn1p_y.y" +#line 602 "asn1p_y.y" { /* Empty EXPORTS clause effectively prohibits export. */ yyval.a_xports = asn1p_xports_new(); @@ -2073,7 +2074,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 45: -#line 609 "asn1p_y.y" +#line 610 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); assert(yyval.a_xports); @@ -2082,7 +2083,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 46: -#line 614 "asn1p_y.y" +#line 615 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); @@ -2090,7 +2091,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 47: -#line 621 "asn1p_y.y" +#line 622 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2100,7 +2101,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 48: -#line 627 "asn1p_y.y" +#line 628 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2110,7 +2111,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 49: -#line 637 "asn1p_y.y" +#line 638 "asn1p_y.y" { yyval.a_expr = yyvsp[-4].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -2121,7 +2122,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 50: -#line 647 "asn1p_y.y" +#line 648 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2132,7 +2133,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 51: -#line 654 "asn1p_y.y" +#line 655 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2142,18 +2143,18 @@ yyparse (YYPARSE_PARAM_ARG) break; case 52: -#line 663 "asn1p_y.y" +#line 664 "asn1p_y.y" { } break; case 53: -#line 664 "asn1p_y.y" +#line 665 "asn1p_y.y" { } break; case 54: -#line 680 "asn1p_y.y" +#line 681 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2165,7 +2166,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 55: -#line 688 "asn1p_y.y" +#line 689 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-3].tv_str; @@ -2176,7 +2177,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 56: -#line 695 "asn1p_y.y" +#line 696 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -2186,7 +2187,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 57: -#line 712 "asn1p_y.y" +#line 713 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -2197,7 +2198,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 58: -#line 722 "asn1p_y.y" +#line 723 "asn1p_y.y" { int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); @@ -2210,7 +2211,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 59: -#line 731 "asn1p_y.y" +#line 732 "asn1p_y.y" { int ret; yyval.a_plist = yyvsp[-2].a_plist; @@ -2222,7 +2223,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 60: -#line 742 "asn1p_y.y" +#line 743 "asn1p_y.y" { yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; @@ -2230,7 +2231,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 61: -#line 746 "asn1p_y.y" +#line 747 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -2241,7 +2242,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 62: -#line 753 "asn1p_y.y" +#line 754 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -2253,7 +2254,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 63: -#line 764 "asn1p_y.y" +#line 765 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2262,7 +2263,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 64: -#line 769 "asn1p_y.y" +#line 770 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); @@ -2270,14 +2271,14 @@ yyparse (YYPARSE_PARAM_ARG) break; case 65: -#line 776 "asn1p_y.y" +#line 777 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; } break; case 66: -#line 779 "asn1p_y.y" +#line 780 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2288,7 +2289,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 67: -#line 792 "asn1p_y.y" +#line 793 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2297,7 +2298,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 68: -#line 797 "asn1p_y.y" +#line 798 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); @@ -2305,7 +2306,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 69: -#line 804 "asn1p_y.y" +#line 805 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); @@ -2316,17 +2317,17 @@ yyparse (YYPARSE_PARAM_ARG) break; case 70: -#line 814 "asn1p_y.y" +#line 815 "asn1p_y.y" { yyval.a_int = 0; } break; case 71: -#line 815 "asn1p_y.y" +#line 816 "asn1p_y.y" { yyval.a_int = 1; } break; case 72: -#line 819 "asn1p_y.y" +#line 820 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2337,7 +2338,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 73: -#line 826 "asn1p_y.y" +#line 827 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); @@ -2345,7 +2346,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 74: -#line 833 "asn1p_y.y" +#line 834 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2357,7 +2358,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 75: -#line 841 "asn1p_y.y" +#line 842 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; yyval.a_expr->Identifier = yyvsp[-2].a_refcomp.name; @@ -2366,7 +2367,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 76: -#line 846 "asn1p_y.y" +#line 847 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2385,31 +2386,31 @@ yyparse (YYPARSE_PARAM_ARG) break; case 77: -#line 864 "asn1p_y.y" +#line 865 "asn1p_y.y" { yyval.a_wsynt = 0; } break; case 78: -#line 865 "asn1p_y.y" +#line 866 "asn1p_y.y" { yyval.a_wsynt = yyvsp[0].a_wsynt; } break; case 79: -#line 872 "asn1p_y.y" +#line 873 "asn1p_y.y" { asn1p_lexer_hack_enable_with_syntax(); } break; case 80: -#line 874 "asn1p_y.y" +#line 875 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; } break; case 81: -#line 880 "asn1p_y.y" +#line 881 "asn1p_y.y" { yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); @@ -2417,7 +2418,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 82: -#line 884 "asn1p_y.y" +#line 885 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); @@ -2425,14 +2426,14 @@ yyparse (YYPARSE_PARAM_ARG) break; case 83: -#line 891 "asn1p_y.y" +#line 892 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); } break; case 84: -#line 894 "asn1p_y.y" +#line 895 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2445,7 +2446,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 85: -#line 920 "asn1p_y.y" +#line 921 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -2455,14 +2456,14 @@ yyparse (YYPARSE_PARAM_ARG) break; case 86: -#line 926 "asn1p_y.y" +#line 927 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; } break; case 87: -#line 932 "asn1p_y.y" +#line 933 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; yyval.a_expr->constraints = yyvsp[-1].a_constr; @@ -2471,7 +2472,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 88: -#line 940 "asn1p_y.y" +#line 941 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -2483,7 +2484,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 89: -#line 948 "asn1p_y.y" +#line 949 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -2496,7 +2497,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 90: -#line 957 "asn1p_y.y" +#line 958 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -2509,14 +2510,14 @@ yyparse (YYPARSE_PARAM_ARG) break; case 91: -#line 969 "asn1p_y.y" +#line 970 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; } break; case 92: -#line 972 "asn1p_y.y" +#line 973 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2526,7 +2527,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 93: -#line 978 "asn1p_y.y" +#line 979 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; checkmem(yyval.a_expr); @@ -2535,7 +2536,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 94: -#line 986 "asn1p_y.y" +#line 987 "asn1p_y.y" { int ret; yyval.a_expr = yyvsp[-1].a_expr; @@ -2553,7 +2554,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 95: -#line 1010 "asn1p_y.y" +#line 1011 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2564,7 +2565,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 96: -#line 1017 "asn1p_y.y" +#line 1018 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2575,7 +2576,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 97: -#line 1032 "asn1p_y.y" +#line 1033 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2587,7 +2588,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 98: -#line 1040 "asn1p_y.y" +#line 1041 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2601,7 +2602,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 99: -#line 1050 "asn1p_y.y" +#line 1051 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2615,7 +2616,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 100: -#line 1060 "asn1p_y.y" +#line 1061 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2627,7 +2628,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 101: -#line 1068 "asn1p_y.y" +#line 1069 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[0].a_ref; @@ -2650,7 +2651,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 102: -#line 1090 "asn1p_y.y" +#line 1091 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2662,7 +2663,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 103: -#line 1098 "asn1p_y.y" +#line 1099 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[-2].a_ref; @@ -2673,7 +2674,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 106: -#line 1112 "asn1p_y.y" +#line 1113 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; @@ -2681,7 +2682,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 107: -#line 1117 "asn1p_y.y" +#line 1118 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; @@ -2689,7 +2690,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 108: -#line 1130 "asn1p_y.y" +#line 1131 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); @@ -2700,12 +2701,12 @@ yyparse (YYPARSE_PARAM_ARG) break; case 109: -#line 1140 "asn1p_y.y" +#line 1141 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); } break; case 110: -#line 1141 "asn1p_y.y" +#line 1142 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); @@ -2714,7 +2715,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 111: -#line 1146 "asn1p_y.y" +#line 1147 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); @@ -2722,7 +2723,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 112: -#line 1150 "asn1p_y.y" +#line 1151 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); @@ -2730,7 +2731,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 113: -#line 1154 "asn1p_y.y" +#line 1155 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); @@ -2738,21 +2739,21 @@ yyparse (YYPARSE_PARAM_ARG) break; case 114: -#line 1158 "asn1p_y.y" +#line 1159 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; } break; case 115: -#line 1161 "asn1p_y.y" +#line 1162 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; } break; case 116: -#line 1167 "asn1p_y.y" +#line 1168 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2767,7 +2768,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 117: -#line 1178 "asn1p_y.y" +#line 1179 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2785,7 +2786,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 118: -#line 1195 "asn1p_y.y" +#line 1196 "asn1p_y.y" { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 2; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); @@ -2799,7 +2800,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 119: -#line 1205 "asn1p_y.y" +#line 1206 "asn1p_y.y" { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); @@ -2815,82 +2816,82 @@ yyparse (YYPARSE_PARAM_ARG) break; case 120: -#line 1220 "asn1p_y.y" +#line 1221 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BOOLEAN; } break; case 121: -#line 1221 "asn1p_y.y" +#line 1222 "asn1p_y.y" { yyval.a_type = ASN_BASIC_NULL; } break; case 122: -#line 1222 "asn1p_y.y" +#line 1223 "asn1p_y.y" { yyval.a_type = ASN_BASIC_REAL; } break; case 123: -#line 1223 "asn1p_y.y" +#line 1224 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; } break; case 124: -#line 1224 "asn1p_y.y" +#line 1225 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OCTET_STRING; } break; case 125: -#line 1225 "asn1p_y.y" +#line 1226 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; } break; case 126: -#line 1226 "asn1p_y.y" +#line 1227 "asn1p_y.y" { yyval.a_type = ASN_BASIC_RELATIVE_OID; } break; case 127: -#line 1227 "asn1p_y.y" +#line 1228 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EXTERNAL; } break; case 128: -#line 1228 "asn1p_y.y" +#line 1229 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; } break; case 129: -#line 1229 "asn1p_y.y" +#line 1230 "asn1p_y.y" { yyval.a_type = ASN_BASIC_CHARACTER_STRING; } break; case 130: -#line 1230 "asn1p_y.y" +#line 1231 "asn1p_y.y" { yyval.a_type = ASN_BASIC_UTCTime; } break; case 131: -#line 1231 "asn1p_y.y" +#line 1232 "asn1p_y.y" { yyval.a_type = ASN_BASIC_GeneralizedTime; } break; case 132: -#line 1238 "asn1p_y.y" +#line 1239 "asn1p_y.y" { yyval.a_type = ASN_BASIC_INTEGER; } break; case 133: -#line 1239 "asn1p_y.y" +#line 1240 "asn1p_y.y" { yyval.a_type = ASN_BASIC_ENUMERATED; } break; case 134: -#line 1240 "asn1p_y.y" +#line 1241 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BIT_STRING; } break; case 135: -#line 1244 "asn1p_y.y" +#line 1245 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -2900,7 +2901,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 136: -#line 1250 "asn1p_y.y" +#line 1251 "asn1p_y.y" { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; @@ -2914,12 +2915,12 @@ yyparse (YYPARSE_PARAM_ARG) break; case 137: -#line 1263 "asn1p_y.y" +#line 1264 "asn1p_y.y" { yyval.a_type = ASN_STRING_BMPString; } break; case 138: -#line 1264 "asn1p_y.y" +#line 1265 "asn1p_y.y" { yyval.a_type = ASN_STRING_GeneralString; return yyerror("GeneralString is not supported"); @@ -2927,7 +2928,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 139: -#line 1268 "asn1p_y.y" +#line 1269 "asn1p_y.y" { yyval.a_type = ASN_STRING_GraphicString; return yyerror("GraphicString is not supported"); @@ -2935,27 +2936,27 @@ yyparse (YYPARSE_PARAM_ARG) break; case 140: -#line 1272 "asn1p_y.y" +#line 1273 "asn1p_y.y" { yyval.a_type = ASN_STRING_IA5String; } break; case 141: -#line 1273 "asn1p_y.y" +#line 1274 "asn1p_y.y" { yyval.a_type = ASN_STRING_ISO646String; } break; case 142: -#line 1274 "asn1p_y.y" +#line 1275 "asn1p_y.y" { yyval.a_type = ASN_STRING_NumericString; } break; case 143: -#line 1275 "asn1p_y.y" +#line 1276 "asn1p_y.y" { yyval.a_type = ASN_STRING_PrintableString; } break; case 144: -#line 1276 "asn1p_y.y" +#line 1277 "asn1p_y.y" { yyval.a_type = ASN_STRING_T61String; return yyerror("T61String not implemented yet"); @@ -2963,22 +2964,22 @@ yyparse (YYPARSE_PARAM_ARG) break; case 145: -#line 1280 "asn1p_y.y" +#line 1281 "asn1p_y.y" { yyval.a_type = ASN_STRING_TeletexString; } break; case 146: -#line 1281 "asn1p_y.y" +#line 1282 "asn1p_y.y" { yyval.a_type = ASN_STRING_UniversalString; } break; case 147: -#line 1282 "asn1p_y.y" +#line 1283 "asn1p_y.y" { yyval.a_type = ASN_STRING_UTF8String; } break; case 148: -#line 1283 "asn1p_y.y" +#line 1284 "asn1p_y.y" { yyval.a_type = ASN_STRING_VideotexString; return yyerror("VideotexString is no longer supported"); @@ -2986,17 +2987,17 @@ yyparse (YYPARSE_PARAM_ARG) break; case 149: -#line 1287 "asn1p_y.y" +#line 1288 "asn1p_y.y" { yyval.a_type = ASN_STRING_VisibleString; } break; case 150: -#line 1288 "asn1p_y.y" +#line 1289 "asn1p_y.y" { yyval.a_type = ASN_STRING_ObjectDescriptor; } break; case 151: -#line 1292 "asn1p_y.y" +#line 1293 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -3006,7 +3007,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 152: -#line 1298 "asn1p_y.y" +#line 1299 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -3016,7 +3017,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 153: -#line 1304 "asn1p_y.y" +#line 1305 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -3026,7 +3027,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 154: -#line 1310 "asn1p_y.y" +#line 1311 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3038,7 +3039,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 155: -#line 1318 "asn1p_y.y" +#line 1319 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3050,7 +3051,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 156: -#line 1326 "asn1p_y.y" +#line 1327 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3060,7 +3061,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 157: -#line 1332 "asn1p_y.y" +#line 1333 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(asn1p_lineno); @@ -3075,17 +3076,17 @@ yyparse (YYPARSE_PARAM_ARG) break; case 158: -#line 1349 "asn1p_y.y" +#line 1350 "asn1p_y.y" { yyval.a_constr = 0; } break; case 159: -#line 1350 "asn1p_y.y" +#line 1351 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; case 165: -#line 1358 "asn1p_y.y" +#line 1359 "asn1p_y.y" { /* * This is a special case, for compatibility purposes. @@ -3101,35 +3102,35 @@ yyparse (YYPARSE_PARAM_ARG) break; case 166: -#line 1370 "asn1p_y.y" +#line 1371 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); } break; case 167: -#line 1373 "asn1p_y.y" +#line 1374 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-1].a_constr, yyvsp[0].a_constr); } break; case 168: -#line 1379 "asn1p_y.y" +#line 1380 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; } break; case 169: -#line 1385 "asn1p_y.y" +#line 1386 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; case 170: -#line 1388 "asn1p_y.y" +#line 1389 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3140,7 +3141,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 171: -#line 1395 "asn1p_y.y" +#line 1396 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3152,7 +3153,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 172: -#line 1403 "asn1p_y.y" +#line 1404 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3161,7 +3162,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 173: -#line 1408 "asn1p_y.y" +#line 1409 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3172,48 +3173,48 @@ yyparse (YYPARSE_PARAM_ARG) break; case 174: -#line 1417 "asn1p_y.y" +#line 1418 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; case 175: -#line 1420 "asn1p_y.y" +#line 1421 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; case 176: -#line 1421 "asn1p_y.y" +#line 1422 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); } break; case 177: -#line 1427 "asn1p_y.y" +#line 1428 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; case 178: -#line 1429 "asn1p_y.y" +#line 1430 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); } break; case 179: -#line 1435 "asn1p_y.y" +#line 1436 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; case 180: -#line 1436 "asn1p_y.y" +#line 1437 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); } break; case 181: -#line 1442 "asn1p_y.y" +#line 1443 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3223,7 +3224,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 182: -#line 1448 "asn1p_y.y" +#line 1449 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3234,7 +3235,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 183: -#line 1455 "asn1p_y.y" +#line 1456 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -3246,62 +3247,62 @@ yyparse (YYPARSE_PARAM_ARG) break; case 184: -#line 1463 "asn1p_y.y" +#line 1464 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; case 185: -#line 1466 "asn1p_y.y" +#line 1467 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; case 186: -#line 1472 "asn1p_y.y" +#line 1473 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RANGE; } break; case 187: -#line 1473 "asn1p_y.y" +#line 1474 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RLRANGE; } break; case 188: -#line 1474 "asn1p_y.y" +#line 1475 "asn1p_y.y" { yyval.a_ctype = ACT_EL_LLRANGE; } break; case 189: -#line 1475 "asn1p_y.y" +#line 1476 "asn1p_y.y" { yyval.a_ctype = ACT_EL_ULRANGE; } break; case 190: -#line 1479 "asn1p_y.y" +#line 1480 "asn1p_y.y" { yyval.a_ctype = ACT_CT_SIZE; } break; case 191: -#line 1482 "asn1p_y.y" +#line 1483 "asn1p_y.y" { yyval.a_ctype = ACT_CT_FROM; } break; case 192: -#line 1488 "asn1p_y.y" +#line 1489 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; } break; case 193: -#line 1491 "asn1p_y.y" +#line 1492 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3316,7 +3317,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 194: -#line 1502 "asn1p_y.y" +#line 1503 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); @@ -3324,7 +3325,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 195: -#line 1506 "asn1p_y.y" +#line 1507 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(123); checkmem(yyval.a_value); @@ -3333,7 +3334,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 196: -#line 1511 "asn1p_y.y" +#line 1512 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(321); checkmem(yyval.a_value); @@ -3342,7 +3343,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 197: -#line 1516 "asn1p_y.y" +#line 1517 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -3351,7 +3352,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 198: -#line 1521 "asn1p_y.y" +#line 1522 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); @@ -3360,28 +3361,28 @@ yyparse (YYPARSE_PARAM_ARG) break; case 199: -#line 1529 "asn1p_y.y" +#line 1530 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); } break; case 200: -#line 1535 "asn1p_y.y" +#line 1536 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; case 201: -#line 1538 "asn1p_y.y" +#line 1539 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); } break; case 202: -#line 1544 "asn1p_y.y" +#line 1545 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3390,7 +3391,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 203: -#line 1549 "asn1p_y.y" +#line 1550 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3401,52 +3402,52 @@ yyparse (YYPARSE_PARAM_ARG) break; case 204: -#line 1562 "asn1p_y.y" +#line 1563 "asn1p_y.y" { yyval.a_pres = ACPRES_DEFAULT; } break; case 205: -#line 1563 "asn1p_y.y" +#line 1564 "asn1p_y.y" { yyval.a_pres = yyvsp[0].a_pres; } break; case 206: -#line 1567 "asn1p_y.y" +#line 1568 "asn1p_y.y" { yyval.a_pres = ACPRES_PRESENT; } break; case 207: -#line 1570 "asn1p_y.y" +#line 1571 "asn1p_y.y" { yyval.a_pres = ACPRES_ABSENT; } break; case 208: -#line 1573 "asn1p_y.y" +#line 1574 "asn1p_y.y" { yyval.a_pres = ACPRES_OPTIONAL; } break; case 209: -#line 1579 "asn1p_y.y" +#line 1580 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; case 210: -#line 1582 "asn1p_y.y" +#line 1583 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; case 211: -#line 1591 "asn1p_y.y" +#line 1592 "asn1p_y.y" { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; @@ -3462,14 +3463,14 @@ yyparse (YYPARSE_PARAM_ARG) break; case 212: -#line 1606 "asn1p_y.y" +#line 1607 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); } break; case 213: -#line 1612 "asn1p_y.y" +#line 1613 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3479,7 +3480,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 214: -#line 1618 "asn1p_y.y" +#line 1619 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3491,7 +3492,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 215: -#line 1632 "asn1p_y.y" +#line 1633 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; @@ -3506,7 +3507,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 216: -#line 1643 "asn1p_y.y" +#line 1644 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; @@ -3522,14 +3523,14 @@ yyparse (YYPARSE_PARAM_ARG) break; case 217: -#line 1659 "asn1p_y.y" +#line 1660 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; } break; case 218: -#line 1662 "asn1p_y.y" +#line 1663 "asn1p_y.y" { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); @@ -3542,24 +3543,24 @@ yyparse (YYPARSE_PARAM_ARG) break; case 219: -#line 1680 "asn1p_y.y" +#line 1681 "asn1p_y.y" { yyval.a_marker = EM_NOMARK; } break; case 220: -#line 1681 "asn1p_y.y" +#line 1682 "asn1p_y.y" { yyval.a_marker = yyvsp[0].a_marker; } break; case 221: -#line 1685 "asn1p_y.y" +#line 1686 "asn1p_y.y" { yyval.a_marker = EM_OPTIONAL; } break; case 222: -#line 1688 "asn1p_y.y" +#line 1689 "asn1p_y.y" { yyval.a_marker = EM_DEFAULT; /* FIXME: store DefaultValue somewhere */ @@ -3567,30 +3568,30 @@ yyparse (YYPARSE_PARAM_ARG) break; case 223: -#line 1695 "asn1p_y.y" +#line 1696 "asn1p_y.y" { } break; case 224: -#line 1697 "asn1p_y.y" +#line 1698 "asn1p_y.y" { } break; case 225: -#line 1699 "asn1p_y.y" +#line 1700 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); } break; case 226: -#line 1699 "asn1p_y.y" +#line 1700 "asn1p_y.y" { } break; case 227: -#line 1720 "asn1p_y.y" +#line 1721 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3598,14 +3599,14 @@ yyparse (YYPARSE_PARAM_ARG) break; case 228: -#line 1724 "asn1p_y.y" +#line 1725 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; } break; case 229: -#line 1730 "asn1p_y.y" +#line 1731 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3614,7 +3615,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 230: -#line 1735 "asn1p_y.y" +#line 1736 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); @@ -3622,7 +3623,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 231: -#line 1742 "asn1p_y.y" +#line 1743 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3633,7 +3634,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 232: -#line 1749 "asn1p_y.y" +#line 1750 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3645,7 +3646,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 233: -#line 1757 "asn1p_y.y" +#line 1758 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3657,7 +3658,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 234: -#line 1765 "asn1p_y.y" +#line 1766 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3668,7 +3669,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 235: -#line 1772 "asn1p_y.y" +#line 1773 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3680,7 +3681,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 236: -#line 1783 "asn1p_y.y" +#line 1784 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); @@ -3688,7 +3689,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 237: -#line 1787 "asn1p_y.y" +#line 1788 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); @@ -3696,17 +3697,17 @@ yyparse (YYPARSE_PARAM_ARG) break; case 238: -#line 1818 "asn1p_y.y" +#line 1819 "asn1p_y.y" { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); } break; case 239: -#line 1819 "asn1p_y.y" +#line 1820 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; } break; case 240: -#line 1823 "asn1p_y.y" +#line 1824 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; yyval.a_tag.tag_mode = TM_DEFAULT; @@ -3714,7 +3715,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 241: -#line 1827 "asn1p_y.y" +#line 1828 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_IMPLICIT; @@ -3722,7 +3723,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 242: -#line 1831 "asn1p_y.y" +#line 1832 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_EXPLICIT; @@ -3730,7 +3731,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 243: -#line 1838 "asn1p_y.y" +#line 1839 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; @@ -3738,7 +3739,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 244: -#line 1842 "asn1p_y.y" +#line 1843 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; @@ -3746,7 +3747,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 245: -#line 1849 "asn1p_y.y" +#line 1850 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; @@ -3754,7 +3755,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 246: -#line 1856 "asn1p_y.y" +#line 1857 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; @@ -3762,7 +3763,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 247: -#line 1863 "asn1p_y.y" +#line 1864 "asn1p_y.y" { memset(&yyval.tv_nametag, 0, sizeof(yyval.tv_nametag)); yyval.tv_nametag.name = yyvsp[0].tv_str; @@ -3770,7 +3771,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 248: -#line 1867 "asn1p_y.y" +#line 1868 "asn1p_y.y" { yyval.tv_nametag.name = yyvsp[-1].tv_str; yyval.tv_nametag.tag = yyvsp[0].a_tag; @@ -3781,7 +3782,7 @@ yyparse (YYPARSE_PARAM_ARG) } /* Line 1016 of /usr/local/share/bison/yacc.c. */ -#line 3785 "y.tab.c" +#line 3786 "asn1p_y.c" yyvsp -= yylen; yyssp -= yylen; @@ -4000,7 +4001,7 @@ yyparse (YYPARSE_PARAM_ARG) } -#line 1874 "asn1p_y.y" +#line 1875 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.h b/libasn1parser/asn1p_y.h index 09ace7815..49ab05ab9 100644 --- a/libasn1parser/asn1p_y.h +++ b/libasn1parser/asn1p_y.h @@ -23,8 +23,8 @@ This special exception was added by the Free Software Foundation in version 1.24 of Bison. */ -#ifndef BISON_Y_TAB_H -# define BISON_Y_TAB_H +#ifndef BISON_ASN_P_Y_H +# define BISON_ASN_P_Y_H /* Tokens. */ #ifndef YYTOKENTYPE @@ -274,5 +274,5 @@ typedef union { extern YYSTYPE asn1p_lval; -#endif /* not BISON_Y_TAB_H */ +#endif /* not BISON_ASN_P_Y_H */ diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index 822a8efb0..3b9af314e 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -456,12 +456,13 @@ ModuleSpecificationBody: #error MY_IMPORT DEFINED ELSEWHERE! #endif #define MY_IMPORT(foo,field) do { \ - if(TQ_FIRST(&($2->foo))) { \ + while(TQ_FIRST(&($2->foo))) { \ TQ_ADD(&($$->foo), \ TQ_REMOVE(&($2->foo), field), \ field); \ - assert(TQ_FIRST(&($2->foo)) == 0); \ - } } while(0) + } \ + assert(TQ_FIRST(&($2->foo)) == 0); \ + } while(0) MY_IMPORT(imports, xp_next); MY_IMPORT(exports, xp_next); From 6f5eb0b3c01204afb884860d3b2c0c84cd4f0697 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 13 Aug 2004 12:35:09 +0000 Subject: [PATCH 0107/1469] proper constraint insertion git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@107 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_y.c | 4892 +++++++++++++++++---------------------- libasn1parser/asn1p_y.h | 344 +-- libasn1parser/asn1p_y.y | 3 +- 3 files changed, 2233 insertions(+), 3006 deletions(-) diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index 5e56d4356..68a94fea1 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -1,265 +1,114 @@ -/* A Bison parser, made from asn1p_y.y, by GNU bison 1.75. */ -/* Skeleton parser for Yacc-like parsing with Bison, - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. +/* A Bison parser, made from asn1p_y.y + by GNU Bison version 1.28 */ - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -/* Written by Richard Stallman by simplifying the original so called - ``semantic'' parser. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ - -/* Identify Bison output. */ -#define YYBISON 1 - -/* Pure parsers. */ -#define YYPURE 0 - -/* Using locations. */ -#define YYLSP_NEEDED 0 +#define YYBISON 1 /* Identify Bison output. */ -/* If NAME_PREFIX is specified substitute the variables and functions - names. */ #define yyparse asn1p_parse -#define yylex asn1p_lex +#define yylex asn1p_lex #define yyerror asn1p_error -#define yylval asn1p_lval -#define yychar asn1p_char +#define yylval asn1p_lval +#define yychar asn1p_char #define yydebug asn1p_debug #define yynerrs asn1p_nerrs +#define TOK_PPEQ 257 +#define TOK_opaque 258 +#define TOK_bstring 259 +#define TOK_cstring 260 +#define TOK_hstring 261 +#define TOK_identifier 262 +#define TOK_number 263 +#define TOK_number_negative 264 +#define TOK_typereference 265 +#define TOK_objectclassreference 266 +#define TOK_typefieldreference 267 +#define TOK_valuefieldreference 268 +#define TOK_ABSENT 269 +#define TOK_ABSTRACT_SYNTAX 270 +#define TOK_ALL 271 +#define TOK_ANY 272 +#define TOK_APPLICATION 273 +#define TOK_AUTOMATIC 274 +#define TOK_BEGIN 275 +#define TOK_BIT 276 +#define TOK_BMPString 277 +#define TOK_BOOLEAN 278 +#define TOK_BY 279 +#define TOK_CHARACTER 280 +#define TOK_CHOICE 281 +#define TOK_CLASS 282 +#define TOK_COMPONENT 283 +#define TOK_COMPONENTS 284 +#define TOK_CONSTRAINED 285 +#define TOK_CONTAINING 286 +#define TOK_DEFAULT 287 +#define TOK_DEFINITIONS 288 +#define TOK_DEFINED 289 +#define TOK_EMBEDDED 290 +#define TOK_ENCODED 291 +#define TOK_END 292 +#define TOK_ENUMERATED 293 +#define TOK_EXPLICIT 294 +#define TOK_EXPORTS 295 +#define TOK_EXTENSIBILITY 296 +#define TOK_EXTERNAL 297 +#define TOK_FALSE 298 +#define TOK_FROM 299 +#define TOK_GeneralizedTime 300 +#define TOK_GeneralString 301 +#define TOK_GraphicString 302 +#define TOK_IA5String 303 +#define TOK_IDENTIFIER 304 +#define TOK_IMPLICIT 305 +#define TOK_IMPLIED 306 +#define TOK_IMPORTS 307 +#define TOK_INCLUDES 308 +#define TOK_INSTANCE 309 +#define TOK_INTEGER 310 +#define TOK_ISO646String 311 +#define TOK_MAX 312 +#define TOK_MIN 313 +#define TOK_MINUS_INFINITY 314 +#define TOK_NULL 315 +#define TOK_NumericString 316 +#define TOK_OBJECT 317 +#define TOK_ObjectDescriptor 318 +#define TOK_OCTET 319 +#define TOK_OF 320 +#define TOK_OPTIONAL 321 +#define TOK_PATTERN 322 +#define TOK_PDV 323 +#define TOK_PLUS_INFINITY 324 +#define TOK_PRESENT 325 +#define TOK_PrintableString 326 +#define TOK_PRIVATE 327 +#define TOK_REAL 328 +#define TOK_RELATIVE_OID 329 +#define TOK_SEQUENCE 330 +#define TOK_SET 331 +#define TOK_SIZE 332 +#define TOK_STRING 333 +#define TOK_SYNTAX 334 +#define TOK_T61String 335 +#define TOK_TAGS 336 +#define TOK_TeletexString 337 +#define TOK_TRUE 338 +#define TOK_TYPE_IDENTIFIER 339 +#define TOK_UNIQUE 340 +#define TOK_UNIVERSAL 341 +#define TOK_UniversalString 342 +#define TOK_UTCTime 343 +#define TOK_UTF8String 344 +#define TOK_VideotexString 345 +#define TOK_VisibleString 346 +#define TOK_WITH 347 +#define TOK_UNION 348 +#define TOK_INTERSECTION 349 +#define TOK_EXCEPT 350 +#define TOK_TwoDots 351 +#define TOK_ThreeDots 352 +#define TOK_tag 353 - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - TOK_PPEQ = 258, - TOK_opaque = 259, - TOK_bstring = 260, - TOK_cstring = 261, - TOK_hstring = 262, - TOK_identifier = 263, - TOK_number = 264, - TOK_number_negative = 265, - TOK_typereference = 266, - TOK_objectclassreference = 267, - TOK_typefieldreference = 268, - TOK_valuefieldreference = 269, - TOK_ABSENT = 270, - TOK_ABSTRACT_SYNTAX = 271, - TOK_ALL = 272, - TOK_ANY = 273, - TOK_APPLICATION = 274, - TOK_AUTOMATIC = 275, - TOK_BEGIN = 276, - TOK_BIT = 277, - TOK_BMPString = 278, - TOK_BOOLEAN = 279, - TOK_BY = 280, - TOK_CHARACTER = 281, - TOK_CHOICE = 282, - TOK_CLASS = 283, - TOK_COMPONENT = 284, - TOK_COMPONENTS = 285, - TOK_CONSTRAINED = 286, - TOK_CONTAINING = 287, - TOK_DEFAULT = 288, - TOK_DEFINITIONS = 289, - TOK_DEFINED = 290, - TOK_EMBEDDED = 291, - TOK_ENCODED = 292, - TOK_END = 293, - TOK_ENUMERATED = 294, - TOK_EXPLICIT = 295, - TOK_EXPORTS = 296, - TOK_EXTENSIBILITY = 297, - TOK_EXTERNAL = 298, - TOK_FALSE = 299, - TOK_FROM = 300, - TOK_GeneralizedTime = 301, - TOK_GeneralString = 302, - TOK_GraphicString = 303, - TOK_IA5String = 304, - TOK_IDENTIFIER = 305, - TOK_IMPLICIT = 306, - TOK_IMPLIED = 307, - TOK_IMPORTS = 308, - TOK_INCLUDES = 309, - TOK_INSTANCE = 310, - TOK_INTEGER = 311, - TOK_ISO646String = 312, - TOK_MAX = 313, - TOK_MIN = 314, - TOK_MINUS_INFINITY = 315, - TOK_NULL = 316, - TOK_NumericString = 317, - TOK_OBJECT = 318, - TOK_ObjectDescriptor = 319, - TOK_OCTET = 320, - TOK_OF = 321, - TOK_OPTIONAL = 322, - TOK_PATTERN = 323, - TOK_PDV = 324, - TOK_PLUS_INFINITY = 325, - TOK_PRESENT = 326, - TOK_PrintableString = 327, - TOK_PRIVATE = 328, - TOK_REAL = 329, - TOK_RELATIVE_OID = 330, - TOK_SEQUENCE = 331, - TOK_SET = 332, - TOK_SIZE = 333, - TOK_STRING = 334, - TOK_SYNTAX = 335, - TOK_T61String = 336, - TOK_TAGS = 337, - TOK_TeletexString = 338, - TOK_TRUE = 339, - TOK_TYPE_IDENTIFIER = 340, - TOK_UNIQUE = 341, - TOK_UNIVERSAL = 342, - TOK_UniversalString = 343, - TOK_UTCTime = 344, - TOK_UTF8String = 345, - TOK_VideotexString = 346, - TOK_VisibleString = 347, - TOK_WITH = 348, - TOK_UNION = 349, - TOK_INTERSECTION = 350, - TOK_EXCEPT = 351, - TOK_TwoDots = 352, - TOK_ThreeDots = 353, - TOK_tag = 354 - }; -#endif -#define TOK_PPEQ 258 -#define TOK_opaque 259 -#define TOK_bstring 260 -#define TOK_cstring 261 -#define TOK_hstring 262 -#define TOK_identifier 263 -#define TOK_number 264 -#define TOK_number_negative 265 -#define TOK_typereference 266 -#define TOK_objectclassreference 267 -#define TOK_typefieldreference 268 -#define TOK_valuefieldreference 269 -#define TOK_ABSENT 270 -#define TOK_ABSTRACT_SYNTAX 271 -#define TOK_ALL 272 -#define TOK_ANY 273 -#define TOK_APPLICATION 274 -#define TOK_AUTOMATIC 275 -#define TOK_BEGIN 276 -#define TOK_BIT 277 -#define TOK_BMPString 278 -#define TOK_BOOLEAN 279 -#define TOK_BY 280 -#define TOK_CHARACTER 281 -#define TOK_CHOICE 282 -#define TOK_CLASS 283 -#define TOK_COMPONENT 284 -#define TOK_COMPONENTS 285 -#define TOK_CONSTRAINED 286 -#define TOK_CONTAINING 287 -#define TOK_DEFAULT 288 -#define TOK_DEFINITIONS 289 -#define TOK_DEFINED 290 -#define TOK_EMBEDDED 291 -#define TOK_ENCODED 292 -#define TOK_END 293 -#define TOK_ENUMERATED 294 -#define TOK_EXPLICIT 295 -#define TOK_EXPORTS 296 -#define TOK_EXTENSIBILITY 297 -#define TOK_EXTERNAL 298 -#define TOK_FALSE 299 -#define TOK_FROM 300 -#define TOK_GeneralizedTime 301 -#define TOK_GeneralString 302 -#define TOK_GraphicString 303 -#define TOK_IA5String 304 -#define TOK_IDENTIFIER 305 -#define TOK_IMPLICIT 306 -#define TOK_IMPLIED 307 -#define TOK_IMPORTS 308 -#define TOK_INCLUDES 309 -#define TOK_INSTANCE 310 -#define TOK_INTEGER 311 -#define TOK_ISO646String 312 -#define TOK_MAX 313 -#define TOK_MIN 314 -#define TOK_MINUS_INFINITY 315 -#define TOK_NULL 316 -#define TOK_NumericString 317 -#define TOK_OBJECT 318 -#define TOK_ObjectDescriptor 319 -#define TOK_OCTET 320 -#define TOK_OF 321 -#define TOK_OPTIONAL 322 -#define TOK_PATTERN 323 -#define TOK_PDV 324 -#define TOK_PLUS_INFINITY 325 -#define TOK_PRESENT 326 -#define TOK_PrintableString 327 -#define TOK_PRIVATE 328 -#define TOK_REAL 329 -#define TOK_RELATIVE_OID 330 -#define TOK_SEQUENCE 331 -#define TOK_SET 332 -#define TOK_SIZE 333 -#define TOK_STRING 334 -#define TOK_SYNTAX 335 -#define TOK_T61String 336 -#define TOK_TAGS 337 -#define TOK_TeletexString 338 -#define TOK_TRUE 339 -#define TOK_TYPE_IDENTIFIER 340 -#define TOK_UNIQUE 341 -#define TOK_UNIVERSAL 342 -#define TOK_UniversalString 343 -#define TOK_UTCTime 344 -#define TOK_UTF8String 345 -#define TOK_VideotexString 346 -#define TOK_VisibleString 347 -#define TOK_WITH 348 -#define TOK_UNION 349 -#define TOK_INTERSECTION 350 -#define TOK_EXCEPT 351 -#define TOK_TwoDots 352 -#define TOK_ThreeDots 353 -#define TOK_tag 354 - - - - -/* Copy the first part of user declarations. */ #line 1 "asn1p_y.y" @@ -310,21 +159,6 @@ static asn1p_value_t * } while(0) - -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 -#endif - -#ifndef YYSTYPE #line 57 "asn1p_y.y" typedef union { asn1p_t *a_grammar; @@ -357,1035 +191,801 @@ typedef union { char *name; struct asn1p_type_tag_s tag; } tv_nametag; -} yystype; -/* Line 193 of /usr/local/share/bison/yacc.c. */ -#line 363 "asn1p_y.c" -# define YYSTYPE yystype -# define YYSTYPE_IS_TRIVIAL 1 -#endif +} YYSTYPE; +#include -#ifndef YYLTYPE -typedef struct yyltype -{ - int first_line; - int first_column; - int last_line; - int last_column; -} yyltype; -# define YYLTYPE yyltype -# define YYLTYPE_IS_TRIVIAL 1 +#ifndef __cplusplus +#ifndef __STDC__ +#define const #endif - -/* Copy the second part of user declarations. */ - - -/* Line 213 of /usr/local/share/bison/yacc.c. */ -#line 384 "asn1p_y.c" - -#if ! defined (yyoverflow) || YYERROR_VERBOSE - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# if YYSTACK_USE_ALLOCA -# define YYSTACK_ALLOC alloca -# else -# ifndef YYSTACK_USE_ALLOCA -# if defined (alloca) || defined (_ALLOCA_H) -# define YYSTACK_ALLOC alloca -# else -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) -# else -# if defined (__STDC__) || defined (__cplusplus) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# endif -# define YYSTACK_ALLOC malloc -# define YYSTACK_FREE free -# endif -#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ - - -#if (! defined (yyoverflow) \ - && (! defined (__cplusplus) \ - || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) - -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - short yyss; - YYSTYPE yyvs; - }; - -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1) - -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -# define YYSTACK_BYTES(N) \ - ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ - + YYSTACK_GAP_MAX) - -/* Copy COUNT objects from FROM to TO. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if 1 < __GNUC__ -# define YYCOPY(To, From, Count) \ - __builtin_memcpy (To, From, (Count) * sizeof (*(From))) -# else -# define YYCOPY(To, From, Count) \ - do \ - { \ - register YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (To)[yyi] = (From)[yyi]; \ - } \ - while (0) -# endif -# endif - -/* Relocate STACK from its old location to the new one. The - local variables YYSIZE and YYSTACKSIZE give the old and new number of - elements in the stack, and YYPTR gives the new location of the - stack. Advance YYPTR to a properly aligned location for the next - stack. */ -# define YYSTACK_RELOCATE(Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack, Stack, yysize); \ - Stack = &yyptr->Stack; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (0) - #endif -#if defined (__STDC__) || defined (__cplusplus) - typedef signed char yysigned_char; -#else - typedef short yysigned_char; -#endif -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 7 -#define YYLAST 775 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 113 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 99 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 248 -/* YYNRULES -- Number of states. */ -#define YYNSTATES 375 - -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -#define YYUNDEFTOK 2 -#define YYMAXUTOK 354 - -#define YYTRANSLATE(X) \ - ((unsigned)(X) <= YYMAXUTOK ? yytranslate[X] : YYUNDEFTOK) - -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ -static const unsigned char yytranslate[] = -{ - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 109, 2, 2, 2, 2, 2, 2, - 104, 105, 2, 2, 107, 2, 110, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 108, 106, - 111, 2, 2, 2, 112, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 96, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 102, 94, 103, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 95, - 97, 98, 99, 100, 101 -}; -#if YYDEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const unsigned short yyprhs[] = -{ - 0, 0, 3, 5, 7, 10, 19, 20, 22, 26, - 29, 31, 34, 36, 41, 43, 44, 46, 48, 51, - 54, 57, 60, 63, 64, 66, 68, 71, 73, 75, - 77, 79, 81, 83, 87, 90, 92, 95, 100, 102, - 106, 108, 110, 114, 118, 121, 123, 127, 129, 131, - 138, 140, 142, 143, 145, 150, 155, 159, 166, 168, - 172, 174, 178, 182, 184, 188, 190, 192, 194, 198, - 204, 205, 207, 209, 213, 216, 220, 225, 226, 228, - 229, 236, 238, 241, 243, 245, 248, 250, 254, 256, - 260, 264, 266, 268, 270, 275, 277, 281, 283, 287, - 291, 293, 297, 299, 303, 305, 307, 309, 311, 316, - 317, 321, 323, 325, 327, 329, 331, 333, 337, 339, - 342, 344, 346, 348, 350, 353, 356, 358, 360, 363, - 366, 368, 370, 372, 374, 377, 379, 382, 384, 386, - 388, 390, 392, 394, 396, 398, 400, 402, 404, 406, - 408, 410, 415, 420, 425, 430, 435, 437, 442, 443, - 445, 447, 449, 451, 453, 455, 460, 462, 465, 469, - 471, 475, 481, 483, 487, 489, 491, 495, 497, 501, - 503, 507, 509, 513, 518, 520, 522, 524, 527, 530, - 534, 536, 538, 540, 542, 544, 546, 548, 550, 552, - 558, 560, 564, 566, 570, 571, 573, 575, 577, 579, - 581, 583, 587, 592, 594, 598, 601, 605, 607, 611, - 612, 614, 616, 619, 621, 623, 624, 628, 631, 635, - 637, 641, 643, 648, 653, 655, 657, 659, 661, 662, - 664, 666, 669, 672, 674, 676, 678, 680, 682 +#define YYFINAL 375 +#define YYFLAG -32768 +#define YYNTBASE 113 + +#define YYTRANSLATE(x) ((unsigned)(x) <= 353 ? yytranslate[x] : 211) + +static const char yytranslate[] = { 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 109, 2, 2, 2, 2, 2, 2, 104, + 105, 2, 2, 107, 2, 110, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 108, 106, 111, + 2, 2, 2, 112, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 96, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 102, 94, 103, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 95, 97, 98, + 99, 100, 101 }; -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const short yyrhs[] = -{ - 114, 0, -1, 115, -1, 116, -1, 115, 116, -1, - 208, 117, 34, 121, 3, 21, 124, 38, -1, -1, - 118, -1, 102, 119, 103, -1, 102, 103, -1, 120, - -1, 119, 120, -1, 210, -1, 210, 104, 9, 105, - -1, 9, -1, -1, 122, -1, 123, -1, 122, 123, - -1, 40, 82, -1, 51, 82, -1, 20, 82, -1, - 42, 52, -1, -1, 125, -1, 126, -1, 125, 126, - -1, 127, -1, 132, -1, 138, -1, 162, -1, 135, - -1, 170, -1, 53, 128, 106, -1, 53, 45, -1, - 129, -1, 128, 129, -1, 130, 45, 208, 117, -1, - 131, -1, 130, 107, 131, -1, 208, -1, 210, -1, - 41, 133, 106, -1, 41, 17, 106, -1, 41, 106, - -1, 134, -1, 133, 107, 134, -1, 208, -1, 210, - -1, 208, 136, 3, 102, 137, 103, -1, 157, -1, - 167, -1, -1, 178, -1, 208, 3, 206, 85, -1, - 208, 3, 206, 154, -1, 208, 3, 144, -1, 208, - 102, 139, 103, 3, 154, -1, 140, -1, 139, 107, - 140, -1, 208, -1, 208, 108, 210, -1, 167, 108, - 210, -1, 142, -1, 141, 107, 142, -1, 156, -1, - 210, -1, 153, -1, 143, 107, 153, -1, 28, 102, - 146, 103, 148, -1, -1, 86, -1, 147, -1, 146, - 107, 147, -1, 160, 198, -1, 160, 154, 145, -1, - 160, 160, 198, 145, -1, -1, 149, -1, -1, 93, - 80, 102, 150, 151, 103, -1, 152, -1, 151, 152, - -1, 4, -1, 160, -1, 211, 154, -1, 155, -1, - 156, 172, 198, -1, 100, -1, 100, 109, 165, -1, - 100, 109, 205, -1, 169, -1, 170, -1, 171, -1, - 208, 102, 141, 103, -1, 157, -1, 55, 66, 157, - -1, 11, -1, 11, 110, 208, -1, 11, 110, 210, - -1, 209, -1, 209, 110, 158, -1, 159, -1, 158, - 110, 159, -1, 161, -1, 161, -1, 13, -1, 14, - -1, 210, 136, 3, 163, -1, -1, 102, 164, 166, - -1, 5, -1, 7, -1, 6, -1, 205, -1, 165, - -1, 210, -1, 208, 110, 210, -1, 4, -1, 166, - 4, -1, 24, -1, 61, -1, 74, -1, 168, -1, - 65, 79, -1, 63, 50, -1, 75, -1, 43, -1, - 36, 69, -1, 26, 79, -1, 89, -1, 46, -1, - 56, -1, 39, -1, 22, 79, -1, 167, -1, 168, - 202, -1, 23, -1, 47, -1, 48, -1, 49, -1, - 57, -1, 62, -1, 72, -1, 81, -1, 83, -1, - 88, -1, 90, -1, 91, -1, 92, -1, 64, -1, - 27, 102, 143, 103, -1, 76, 102, 143, 103, -1, - 77, 102, 143, 103, -1, 76, 172, 66, 156, -1, - 77, 172, 66, 156, -1, 18, -1, 18, 35, 25, - 210, -1, -1, 176, -1, 94, -1, 95, -1, 96, - -1, 97, -1, 98, -1, 78, 104, 178, 105, -1, - 177, -1, 176, 177, -1, 104, 178, 105, -1, 179, - -1, 179, 107, 100, -1, 179, 107, 100, 107, 179, - -1, 100, -1, 100, 107, 179, -1, 180, -1, 181, - -1, 180, 173, 181, -1, 182, -1, 181, 174, 182, - -1, 183, -1, 182, 175, 183, -1, 186, -1, 186, - 184, 186, -1, 185, 104, 178, 105, -1, 192, -1, - 187, -1, 99, -1, 99, 111, -1, 111, 99, -1, - 111, 99, 111, -1, 78, -1, 45, -1, 205, -1, - 210, -1, 6, -1, 59, -1, 58, -1, 44, -1, - 84, -1, 93, 30, 102, 188, 103, -1, 189, -1, - 188, 107, 189, -1, 100, -1, 210, 172, 190, -1, - -1, 191, -1, 71, -1, 15, -1, 67, -1, 193, - -1, 194, -1, 102, 208, 103, -1, 193, 102, 195, - 103, -1, 196, -1, 195, 107, 196, -1, 112, 197, - -1, 112, 110, 197, -1, 210, -1, 197, 110, 210, - -1, -1, 199, -1, 67, -1, 33, 200, -1, 186, - -1, 167, -1, -1, 102, 201, 166, -1, 102, 103, - -1, 102, 203, 103, -1, 204, -1, 203, 107, 204, - -1, 210, -1, 210, 104, 205, 105, -1, 210, 104, - 165, 105, -1, 205, -1, 100, -1, 9, -1, 10, - -1, -1, 207, -1, 101, -1, 101, 51, -1, 101, - 40, -1, 11, -1, 12, -1, 12, -1, 8, -1, - 210, -1, 210, 207, -1 +#if YYDEBUG != 0 +static const short yyprhs[] = { 0, + 0, 2, 4, 7, 16, 17, 19, 23, 26, 28, + 31, 33, 38, 40, 41, 43, 45, 48, 51, 54, + 57, 60, 61, 63, 65, 68, 70, 72, 74, 76, + 78, 80, 84, 87, 89, 92, 97, 99, 103, 105, + 107, 111, 115, 118, 120, 124, 126, 128, 135, 137, + 139, 140, 142, 147, 152, 156, 163, 165, 169, 171, + 175, 179, 181, 185, 187, 189, 191, 195, 201, 202, + 204, 206, 210, 213, 217, 222, 223, 225, 226, 233, + 235, 238, 240, 242, 245, 247, 251, 253, 257, 261, + 263, 265, 267, 272, 274, 278, 280, 284, 288, 290, + 294, 296, 300, 302, 304, 306, 308, 313, 314, 318, + 320, 322, 324, 326, 328, 330, 334, 336, 339, 341, + 343, 345, 347, 350, 353, 355, 357, 360, 363, 365, + 367, 369, 371, 374, 376, 379, 381, 383, 385, 387, + 389, 391, 393, 395, 397, 399, 401, 403, 405, 407, + 412, 417, 422, 427, 432, 434, 439, 440, 442, 444, + 446, 448, 450, 452, 457, 459, 462, 466, 468, 472, + 478, 480, 484, 486, 488, 492, 494, 498, 500, 504, + 506, 510, 515, 517, 519, 521, 524, 527, 531, 533, + 535, 537, 539, 541, 543, 545, 547, 549, 555, 557, + 561, 563, 567, 568, 570, 572, 574, 576, 578, 580, + 584, 589, 591, 595, 598, 602, 604, 608, 609, 611, + 613, 616, 618, 620, 621, 625, 628, 632, 634, 638, + 640, 645, 650, 652, 654, 656, 658, 659, 661, 663, + 666, 669, 671, 673, 675, 677, 679 }; -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const unsigned short yyrline[] = -{ - 0, 297, 297, 303, 309, 325, 350, 352, 355, 359, - 364, 371, 379, 384, 388, 397, 399, 407, 411, 419, - 423, 426, 429, 437, 439, 448, 452, 478, 482, 491, - 498, 511, 522, 535, 542, 547, 553, 559, 568, 574, - 580, 587, 595, 599, 602, 609, 615, 621, 628, 637, - 647, 655, 663, 665, 677, 689, 696, 712, 722, 732, - 742, 747, 754, 764, 770, 776, 780, 792, 798, 804, - 814, 816, 819, 827, 833, 842, 847, 864, 866, 873, - 871, 880, 885, 891, 895, 920, 927, 932, 940, 949, - 958, 969, 973, 979, 987, 1011, 1018, 1032, 1041, 1051, - 1061, 1069, 1090, 1099, 1108, 1109, 1111, 1118, 1130, 1141, - 1140, 1147, 1151, 1155, 1159, 1162, 1167, 1179, 1195, 1206, - 1220, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, - 1231, 1232, 1238, 1240, 1241, 1244, 1251, 1263, 1265, 1269, - 1273, 1274, 1275, 1276, 1277, 1281, 1282, 1283, 1284, 1288, - 1289, 1292, 1299, 1305, 1311, 1319, 1327, 1333, 1349, 1351, - 1354, 1354, 1355, 1355, 1356, 1358, 1371, 1374, 1379, 1385, - 1389, 1396, 1404, 1409, 1418, 1420, 1422, 1427, 1429, 1435, - 1437, 1442, 1449, 1456, 1464, 1467, 1472, 1474, 1475, 1476, - 1479, 1483, 1488, 1492, 1503, 1507, 1512, 1517, 1522, 1529, - 1535, 1539, 1544, 1550, 1562, 1564, 1567, 1571, 1574, 1579, - 1583, 1591, 1606, 1612, 1619, 1632, 1644, 1659, 1663, 1680, - 1682, 1685, 1689, 1695, 1698, 1700, 1700, 1720, 1725, 1730, - 1736, 1742, 1750, 1758, 1766, 1773, 1783, 1788, 1818, 1820, - 1823, 1828, 1832, 1838, 1843, 1849, 1856, 1863, 1868 +static const short yyrhs[] = { 114, + 0, 115, 0, 114, 115, 0, 207, 116, 34, 120, + 3, 21, 123, 38, 0, 0, 117, 0, 102, 118, + 103, 0, 102, 103, 0, 119, 0, 118, 119, 0, + 209, 0, 209, 104, 9, 105, 0, 9, 0, 0, + 121, 0, 122, 0, 121, 122, 0, 40, 82, 0, + 51, 82, 0, 20, 82, 0, 42, 52, 0, 0, + 124, 0, 125, 0, 124, 125, 0, 126, 0, 131, + 0, 137, 0, 161, 0, 134, 0, 169, 0, 53, + 127, 106, 0, 53, 45, 0, 128, 0, 127, 128, + 0, 129, 45, 207, 116, 0, 130, 0, 129, 107, + 130, 0, 207, 0, 209, 0, 41, 132, 106, 0, + 41, 17, 106, 0, 41, 106, 0, 133, 0, 132, + 107, 133, 0, 207, 0, 209, 0, 207, 135, 3, + 102, 136, 103, 0, 156, 0, 166, 0, 0, 177, + 0, 207, 3, 205, 85, 0, 207, 3, 205, 153, + 0, 207, 3, 143, 0, 207, 102, 138, 103, 3, + 153, 0, 139, 0, 138, 107, 139, 0, 207, 0, + 207, 108, 209, 0, 166, 108, 209, 0, 141, 0, + 140, 107, 141, 0, 155, 0, 209, 0, 152, 0, + 142, 107, 152, 0, 28, 102, 145, 103, 147, 0, + 0, 86, 0, 146, 0, 145, 107, 146, 0, 159, + 197, 0, 159, 153, 144, 0, 159, 159, 197, 144, + 0, 0, 148, 0, 0, 93, 80, 102, 149, 150, + 103, 0, 151, 0, 150, 151, 0, 4, 0, 159, + 0, 210, 153, 0, 154, 0, 155, 171, 197, 0, + 100, 0, 100, 109, 164, 0, 100, 109, 204, 0, + 168, 0, 169, 0, 170, 0, 207, 102, 140, 103, + 0, 156, 0, 55, 66, 156, 0, 11, 0, 11, + 110, 207, 0, 11, 110, 209, 0, 208, 0, 208, + 110, 157, 0, 158, 0, 157, 110, 158, 0, 160, + 0, 160, 0, 13, 0, 14, 0, 209, 135, 3, + 162, 0, 0, 102, 163, 165, 0, 5, 0, 7, + 0, 6, 0, 204, 0, 164, 0, 209, 0, 207, + 110, 209, 0, 4, 0, 165, 4, 0, 24, 0, + 61, 0, 74, 0, 167, 0, 65, 79, 0, 63, + 50, 0, 75, 0, 43, 0, 36, 69, 0, 26, + 79, 0, 89, 0, 46, 0, 56, 0, 39, 0, + 22, 79, 0, 166, 0, 167, 201, 0, 23, 0, + 47, 0, 48, 0, 49, 0, 57, 0, 62, 0, + 72, 0, 81, 0, 83, 0, 88, 0, 90, 0, + 91, 0, 92, 0, 64, 0, 27, 102, 142, 103, + 0, 76, 102, 142, 103, 0, 77, 102, 142, 103, + 0, 76, 171, 66, 155, 0, 77, 171, 66, 155, + 0, 18, 0, 18, 35, 25, 209, 0, 0, 175, + 0, 94, 0, 95, 0, 96, 0, 97, 0, 98, + 0, 78, 104, 177, 105, 0, 176, 0, 175, 176, + 0, 104, 177, 105, 0, 178, 0, 178, 107, 100, + 0, 178, 107, 100, 107, 178, 0, 100, 0, 100, + 107, 178, 0, 179, 0, 180, 0, 179, 172, 180, + 0, 181, 0, 180, 173, 181, 0, 182, 0, 181, + 174, 182, 0, 185, 0, 185, 183, 185, 0, 184, + 104, 177, 105, 0, 191, 0, 186, 0, 99, 0, + 99, 111, 0, 111, 99, 0, 111, 99, 111, 0, + 78, 0, 45, 0, 204, 0, 209, 0, 6, 0, + 59, 0, 58, 0, 44, 0, 84, 0, 93, 30, + 102, 187, 103, 0, 188, 0, 187, 107, 188, 0, + 100, 0, 209, 171, 189, 0, 0, 190, 0, 71, + 0, 15, 0, 67, 0, 192, 0, 193, 0, 102, + 207, 103, 0, 192, 102, 194, 103, 0, 195, 0, + 194, 107, 195, 0, 112, 196, 0, 112, 110, 196, + 0, 209, 0, 196, 110, 209, 0, 0, 198, 0, + 67, 0, 33, 199, 0, 185, 0, 166, 0, 0, + 102, 200, 165, 0, 102, 103, 0, 102, 202, 103, + 0, 203, 0, 202, 107, 203, 0, 209, 0, 209, + 104, 204, 105, 0, 209, 104, 164, 105, 0, 204, + 0, 100, 0, 9, 0, 10, 0, 0, 206, 0, + 101, 0, 101, 51, 0, 101, 40, 0, 11, 0, + 12, 0, 12, 0, 8, 0, 209, 0, 209, 206, + 0 }; + #endif -#if YYDEBUG || YYERROR_VERBOSE -/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[] = -{ - "$end", "error", "$undefined", "TOK_PPEQ", "TOK_opaque", "TOK_bstring", - "TOK_cstring", "TOK_hstring", "TOK_identifier", "TOK_number", - "TOK_number_negative", "TOK_typereference", "TOK_objectclassreference", - "TOK_typefieldreference", "TOK_valuefieldreference", "TOK_ABSENT", - "TOK_ABSTRACT_SYNTAX", "TOK_ALL", "TOK_ANY", "TOK_APPLICATION", - "TOK_AUTOMATIC", "TOK_BEGIN", "TOK_BIT", "TOK_BMPString", "TOK_BOOLEAN", - "TOK_BY", "TOK_CHARACTER", "TOK_CHOICE", "TOK_CLASS", "TOK_COMPONENT", - "TOK_COMPONENTS", "TOK_CONSTRAINED", "TOK_CONTAINING", "TOK_DEFAULT", - "TOK_DEFINITIONS", "TOK_DEFINED", "TOK_EMBEDDED", "TOK_ENCODED", - "TOK_END", "TOK_ENUMERATED", "TOK_EXPLICIT", "TOK_EXPORTS", - "TOK_EXTENSIBILITY", "TOK_EXTERNAL", "TOK_FALSE", "TOK_FROM", - "TOK_GeneralizedTime", "TOK_GeneralString", "TOK_GraphicString", - "TOK_IA5String", "TOK_IDENTIFIER", "TOK_IMPLICIT", "TOK_IMPLIED", - "TOK_IMPORTS", "TOK_INCLUDES", "TOK_INSTANCE", "TOK_INTEGER", - "TOK_ISO646String", "TOK_MAX", "TOK_MIN", "TOK_MINUS_INFINITY", - "TOK_NULL", "TOK_NumericString", "TOK_OBJECT", "TOK_ObjectDescriptor", - "TOK_OCTET", "TOK_OF", "TOK_OPTIONAL", "TOK_PATTERN", "TOK_PDV", - "TOK_PLUS_INFINITY", "TOK_PRESENT", "TOK_PrintableString", - "TOK_PRIVATE", "TOK_REAL", "TOK_RELATIVE_OID", "TOK_SEQUENCE", - "TOK_SET", "TOK_SIZE", "TOK_STRING", "TOK_SYNTAX", "TOK_T61String", - "TOK_TAGS", "TOK_TeletexString", "TOK_TRUE", "TOK_TYPE_IDENTIFIER", - "TOK_UNIQUE", "TOK_UNIVERSAL", "TOK_UniversalString", "TOK_UTCTime", - "TOK_UTF8String", "TOK_VideotexString", "TOK_VisibleString", "TOK_WITH", - "'|'", "TOK_UNION", "'^'", "TOK_INTERSECTION", "TOK_EXCEPT", - "TOK_TwoDots", "TOK_ThreeDots", "TOK_tag", "'{'", "'}'", "'('", "')'", - "';'", "','", "':'", "'!'", "'.'", "'<'", "'@'", "$accept", - "ParsedGrammar", "ModuleList", "ModuleSpecification", - "optObjectIdentifier", "ObjectIdentifier", "ObjectIdentifierBody", - "ObjectIdentifierElement", "optModuleSpecificationFlags", - "ModuleSpecificationFlags", "ModuleSpecificationFlag", - "optModuleSpecificationBody", "ModuleSpecificationBody", - "ModuleSpecificationElement", "ImportsDefinition", "ImportsBundleSet", - "ImportsBundle", "ImportsList", "ImportsElement", "ExportsDefinition", - "ExportsBody", "ExportsElement", "ValueSetDefinition", "DefinedTypeRef", - "optValueSetBody", "DataTypeReference", "ParameterArgumentList", - "ParameterArgumentName", "ActualParameterList", "ActualParameter", - "ConstructedDataTypeDefinition", "ClassDeclaration", "optUnique", - "ClassFieldList", "ClassField", "optWithSyntax", "WithSyntax", "@1", - "WithSyntaxFormat", "WithSyntaxFormatToken", "DataTypeMember", - "ConstrainedTypeDeclaration", "ExtensionAndException", - "TypeDeclaration", "ComplexTypeReference", - "ComplexTypeReferenceAmpList", "ComplexTypeReferenceElement", - "ClassFieldIdentifier", "ClassFieldName", "ValueDefinition", - "InlineOrDefinedValue", "@2", "DefinedValue", "Opaque", "BasicTypeId", - "BasicTypeId_UniverationCompatible", "BasicType", "BasicString", - "ConstructedType", "optConstraints", "Union", "Intersection", "Except", - "Constraints", "SingleConstraint", "ConstraintElementSet", - "ConstraintElement", "ConstraintElementUnion", - "ConstraintElementIntersection", "ConstraintElementException", - "ConstraintSubtypeElement", "ConstraintRangeSpec", "ConstraintSpec", - "ConstraintValue", "WithComponents", "WithComponentsList", - "WithComponentsElement", "optPresenceConstraint", "PresenceConstraint", - "TableConstraint", "SimpleTableConstraint", - "ComponentRelationConstraint", "AtNotationList", "AtNotationElement", - "ComponentIdList", "optMarker", "Marker", "DefaultValue", "@3", - "UniverationDefinition", "UniverationList", "UniverationElement", - "SignedNumber", "optTag", "Tag", "TypeRefName", "ObjectClassReference", - "Identifier", "TaggedIdentifier", 0 +#if YYDEBUG != 0 +static const short yyrline[] = { 0, + 297, 303, 309, 325, 350, 352, 355, 359, 364, 371, + 379, 384, 388, 397, 399, 407, 411, 419, 423, 426, + 429, 437, 439, 448, 452, 478, 482, 491, 498, 511, + 522, 535, 542, 547, 553, 559, 568, 574, 580, 587, + 595, 599, 602, 609, 615, 621, 628, 637, 647, 655, + 663, 665, 677, 689, 696, 712, 722, 732, 742, 747, + 754, 764, 770, 776, 780, 792, 798, 804, 814, 816, + 819, 827, 833, 842, 847, 864, 866, 871, 875, 880, + 885, 891, 895, 920, 927, 932, 940, 949, 958, 969, + 973, 979, 987, 1011, 1018, 1032, 1041, 1051, 1061, 1069, + 1090, 1099, 1108, 1109, 1111, 1118, 1130, 1140, 1142, 1147, + 1151, 1155, 1159, 1162, 1167, 1179, 1195, 1206, 1220, 1222, + 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, + 1238, 1240, 1241, 1244, 1251, 1263, 1265, 1269, 1273, 1274, + 1275, 1276, 1277, 1281, 1282, 1283, 1284, 1288, 1289, 1292, + 1299, 1305, 1311, 1319, 1327, 1333, 1349, 1351, 1354, 1354, + 1355, 1355, 1356, 1358, 1371, 1374, 1379, 1385, 1389, 1396, + 1405, 1410, 1419, 1421, 1423, 1428, 1430, 1436, 1438, 1443, + 1450, 1457, 1465, 1468, 1473, 1475, 1476, 1477, 1480, 1484, + 1489, 1493, 1504, 1508, 1513, 1518, 1523, 1530, 1536, 1540, + 1545, 1551, 1563, 1565, 1568, 1572, 1575, 1580, 1584, 1592, + 1607, 1613, 1620, 1633, 1645, 1660, 1664, 1681, 1683, 1686, + 1690, 1696, 1699, 1701, 1701, 1721, 1726, 1731, 1737, 1743, + 1751, 1759, 1767, 1774, 1784, 1789, 1819, 1821, 1824, 1829, + 1833, 1839, 1844, 1850, 1857, 1864, 1869 }; #endif -# ifdef YYPRINT -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to - token YYLEX-NUM. */ -static const unsigned short yytoknum[] = -{ - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 124, 349, 94, 350, 351, 352, - 353, 354, 123, 125, 40, 41, 59, 44, 58, 33, - 46, 60, 64 -}; -# endif - -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const unsigned char yyr1[] = -{ - 0, 113, 114, 115, 115, 116, 117, 117, 118, 118, - 119, 119, 120, 120, 120, 121, 121, 122, 122, 123, - 123, 123, 123, 124, 124, 125, 125, 126, 126, 126, - 126, 126, 126, 127, 127, 128, 128, 129, 130, 130, - 131, 131, 132, 132, 132, 133, 133, 134, 134, 135, - 136, 136, 137, 137, 138, 138, 138, 138, 139, 139, - 140, 140, 140, 141, 141, 142, 142, 143, 143, 144, - 145, 145, 146, 146, 147, 147, 147, 148, 148, 150, - 149, 151, 151, 152, 152, 153, 153, 154, 155, 155, - 155, 156, 156, 156, 156, 156, 156, 157, 157, 157, - 157, 157, 158, 158, 159, 160, 161, 161, 162, 164, - 163, 163, 163, 163, 163, 163, 165, 165, 166, 166, - 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, - 167, 167, 168, 168, 168, 169, 169, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 171, 171, 171, 171, 171, 171, 171, 172, 172, - 173, 173, 174, 174, 175, 176, 176, 176, 177, 178, - 178, 178, 178, 178, 179, 180, 180, 181, 181, 182, - 182, 183, 183, 183, 183, 183, 184, 184, 184, 184, - 185, 185, 186, 186, 186, 186, 186, 186, 186, 187, - 188, 188, 189, 189, 190, 190, 191, 191, 191, 192, - 192, 193, 194, 195, 195, 196, 196, 197, 197, 198, - 198, 199, 199, 200, 200, 201, 200, 202, 202, 203, - 203, 204, 204, 204, 204, 204, 205, 205, 206, 206, - 207, 207, 207, 208, 208, 209, 210, 211, 211 + +#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) + +static const char * const yytname[] = { "$","error","$undefined.","TOK_PPEQ", +"TOK_opaque","TOK_bstring","TOK_cstring","TOK_hstring","TOK_identifier","TOK_number", +"TOK_number_negative","TOK_typereference","TOK_objectclassreference","TOK_typefieldreference", +"TOK_valuefieldreference","TOK_ABSENT","TOK_ABSTRACT_SYNTAX","TOK_ALL","TOK_ANY", +"TOK_APPLICATION","TOK_AUTOMATIC","TOK_BEGIN","TOK_BIT","TOK_BMPString","TOK_BOOLEAN", +"TOK_BY","TOK_CHARACTER","TOK_CHOICE","TOK_CLASS","TOK_COMPONENT","TOK_COMPONENTS", +"TOK_CONSTRAINED","TOK_CONTAINING","TOK_DEFAULT","TOK_DEFINITIONS","TOK_DEFINED", +"TOK_EMBEDDED","TOK_ENCODED","TOK_END","TOK_ENUMERATED","TOK_EXPLICIT","TOK_EXPORTS", +"TOK_EXTENSIBILITY","TOK_EXTERNAL","TOK_FALSE","TOK_FROM","TOK_GeneralizedTime", +"TOK_GeneralString","TOK_GraphicString","TOK_IA5String","TOK_IDENTIFIER","TOK_IMPLICIT", +"TOK_IMPLIED","TOK_IMPORTS","TOK_INCLUDES","TOK_INSTANCE","TOK_INTEGER","TOK_ISO646String", +"TOK_MAX","TOK_MIN","TOK_MINUS_INFINITY","TOK_NULL","TOK_NumericString","TOK_OBJECT", +"TOK_ObjectDescriptor","TOK_OCTET","TOK_OF","TOK_OPTIONAL","TOK_PATTERN","TOK_PDV", +"TOK_PLUS_INFINITY","TOK_PRESENT","TOK_PrintableString","TOK_PRIVATE","TOK_REAL", +"TOK_RELATIVE_OID","TOK_SEQUENCE","TOK_SET","TOK_SIZE","TOK_STRING","TOK_SYNTAX", +"TOK_T61String","TOK_TAGS","TOK_TeletexString","TOK_TRUE","TOK_TYPE_IDENTIFIER", +"TOK_UNIQUE","TOK_UNIVERSAL","TOK_UniversalString","TOK_UTCTime","TOK_UTF8String", +"TOK_VideotexString","TOK_VisibleString","TOK_WITH","'|'","TOK_UNION","'^'", +"TOK_INTERSECTION","TOK_EXCEPT","TOK_TwoDots","TOK_ThreeDots","TOK_tag","'{'", +"'}'","'('","')'","';'","','","':'","'!'","'.'","'<'","'@'","ParsedGrammar", +"ModuleList","ModuleSpecification","optObjectIdentifier","ObjectIdentifier", +"ObjectIdentifierBody","ObjectIdentifierElement","optModuleSpecificationFlags", +"ModuleSpecificationFlags","ModuleSpecificationFlag","optModuleSpecificationBody", +"ModuleSpecificationBody","ModuleSpecificationElement","ImportsDefinition","ImportsBundleSet", +"ImportsBundle","ImportsList","ImportsElement","ExportsDefinition","ExportsBody", +"ExportsElement","ValueSetDefinition","DefinedTypeRef","optValueSetBody","DataTypeReference", +"ParameterArgumentList","ParameterArgumentName","ActualParameterList","ActualParameter", +"ConstructedDataTypeDefinition","ClassDeclaration","optUnique","ClassFieldList", +"ClassField","optWithSyntax","WithSyntax","@1","WithSyntaxFormat","WithSyntaxFormatToken", +"DataTypeMember","ConstrainedTypeDeclaration","ExtensionAndException","TypeDeclaration", +"ComplexTypeReference","ComplexTypeReferenceAmpList","ComplexTypeReferenceElement", +"ClassFieldIdentifier","ClassFieldName","ValueDefinition","InlineOrDefinedValue", +"@2","DefinedValue","Opaque","BasicTypeId","BasicTypeId_UniverationCompatible", +"BasicType","BasicString","ConstructedType","optConstraints","Union","Intersection", +"Except","Constraints","SingleConstraint","ConstraintElementSet","ConstraintElement", +"ConstraintElementUnion","ConstraintElementIntersection","ConstraintElementException", +"ConstraintSubtypeElement","ConstraintRangeSpec","ConstraintSpec","ConstraintValue", +"WithComponents","WithComponentsList","WithComponentsElement","optPresenceConstraint", +"PresenceConstraint","TableConstraint","SimpleTableConstraint","ComponentRelationConstraint", +"AtNotationList","AtNotationElement","ComponentIdList","optMarker","Marker", +"DefaultValue","@3","UniverationDefinition","UniverationList","UniverationElement", +"SignedNumber","optTag","Tag","TypeRefName","ObjectClassReference","Identifier", +"TaggedIdentifier", NULL }; +#endif -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const unsigned char yyr2[] = -{ - 0, 2, 1, 1, 2, 8, 0, 1, 3, 2, - 1, 2, 1, 4, 1, 0, 1, 1, 2, 2, - 2, 2, 2, 0, 1, 1, 2, 1, 1, 1, - 1, 1, 1, 3, 2, 1, 2, 4, 1, 3, - 1, 1, 3, 3, 2, 1, 3, 1, 1, 6, - 1, 1, 0, 1, 4, 4, 3, 6, 1, 3, - 1, 3, 3, 1, 3, 1, 1, 1, 3, 5, - 0, 1, 1, 3, 2, 3, 4, 0, 1, 0, - 6, 1, 2, 1, 1, 2, 1, 3, 1, 3, - 3, 1, 1, 1, 4, 1, 3, 1, 3, 3, - 1, 3, 1, 3, 1, 1, 1, 1, 4, 0, - 3, 1, 1, 1, 1, 1, 1, 3, 1, 2, - 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, - 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 4, 4, 4, 4, 4, 1, 4, 0, 1, - 1, 1, 1, 1, 1, 4, 1, 2, 3, 1, - 3, 5, 1, 3, 1, 1, 3, 1, 3, 1, - 3, 1, 3, 4, 1, 1, 1, 2, 2, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, - 1, 3, 1, 3, 0, 1, 1, 1, 1, 1, - 1, 3, 4, 1, 3, 2, 3, 1, 3, 0, - 1, 1, 2, 1, 1, 0, 3, 2, 3, 1, - 3, 1, 4, 4, 1, 1, 1, 1, 0, 1, - 1, 2, 2, 1, 1, 1, 1, 1, 2 +static const short yyr1[] = { 0, + 113, 114, 114, 115, 116, 116, 117, 117, 118, 118, + 119, 119, 119, 120, 120, 121, 121, 122, 122, 122, + 122, 123, 123, 124, 124, 125, 125, 125, 125, 125, + 125, 126, 126, 127, 127, 128, 129, 129, 130, 130, + 131, 131, 131, 132, 132, 133, 133, 134, 135, 135, + 136, 136, 137, 137, 137, 137, 138, 138, 139, 139, + 139, 140, 140, 141, 141, 142, 142, 143, 144, 144, + 145, 145, 146, 146, 146, 147, 147, 149, 148, 150, + 150, 151, 151, 152, 152, 153, 154, 154, 154, 155, + 155, 155, 155, 155, 155, 156, 156, 156, 156, 156, + 157, 157, 158, 159, 160, 160, 161, 163, 162, 162, + 162, 162, 162, 162, 164, 164, 165, 165, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, + 167, 167, 167, 168, 168, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 170, + 170, 170, 170, 170, 170, 170, 171, 171, 172, 172, + 173, 173, 174, 175, 175, 175, 176, 177, 177, 177, + 177, 177, 178, 179, 179, 180, 180, 181, 181, 182, + 182, 182, 182, 182, 183, 183, 183, 183, 184, 184, + 185, 185, 185, 185, 185, 185, 185, 186, 187, 187, + 188, 188, 189, 189, 190, 190, 190, 191, 191, 192, + 193, 194, 194, 195, 195, 196, 196, 197, 197, 198, + 198, 199, 199, 200, 199, 201, 201, 202, 202, 203, + 203, 203, 203, 203, 204, 204, 205, 205, 206, 206, + 206, 207, 207, 208, 209, 210, 210 }; -/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state - STATE-NUM when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ -static const unsigned char yydefact[] = -{ - 0, 243, 244, 0, 2, 3, 6, 1, 4, 0, - 0, 7, 246, 14, 9, 0, 10, 12, 15, 8, - 11, 0, 0, 0, 0, 0, 0, 16, 17, 0, - 21, 19, 22, 20, 0, 18, 13, 23, 137, 0, - 138, 139, 140, 0, 141, 142, 150, 143, 144, 145, - 146, 147, 148, 149, 0, 24, 25, 27, 28, 31, - 29, 30, 32, 0, 0, 0, 44, 0, 45, 47, - 48, 34, 0, 35, 0, 38, 40, 41, 5, 26, - 238, 97, 245, 0, 120, 0, 0, 133, 127, 131, - 132, 121, 0, 0, 122, 126, 130, 0, 0, 50, - 51, 123, 100, 0, 43, 42, 0, 33, 36, 0, - 0, 0, 240, 56, 0, 239, 0, 134, 129, 128, - 125, 124, 0, 58, 0, 60, 0, 0, 0, 46, - 6, 39, 0, 242, 241, 97, 245, 156, 0, 0, - 158, 158, 54, 55, 158, 95, 135, 123, 91, 92, - 93, 0, 98, 99, 0, 0, 0, 0, 52, 106, - 107, 101, 102, 104, 111, 113, 112, 236, 237, 109, - 108, 115, 114, 0, 116, 37, 0, 72, 219, 105, - 0, 0, 0, 0, 0, 0, 0, 159, 166, 0, - 0, 219, 0, 136, 0, 0, 59, 62, 61, 194, - 197, 191, 196, 195, 190, 198, 0, 172, 0, 0, - 53, 169, 174, 175, 177, 179, 0, 181, 185, 184, - 209, 210, 192, 193, 0, 0, 0, 77, 0, 0, - 221, 70, 219, 74, 220, 0, 88, 0, 67, 86, - 247, 0, 96, 0, 0, 0, 0, 167, 0, 0, - 87, 235, 227, 0, 229, 234, 231, 0, 63, 65, - 66, 57, 0, 0, 0, 49, 0, 160, 161, 0, - 162, 163, 0, 164, 0, 0, 186, 0, 0, 0, - 103, 118, 110, 117, 0, 69, 78, 73, 225, 224, - 223, 222, 71, 75, 70, 157, 0, 151, 0, 248, - 85, 0, 152, 168, 154, 153, 155, 228, 0, 0, - 94, 0, 0, 173, 211, 170, 176, 178, 180, 0, - 187, 188, 182, 0, 0, 213, 119, 0, 0, 76, - 89, 90, 68, 165, 230, 0, 0, 64, 202, 0, - 200, 158, 0, 183, 189, 0, 215, 217, 212, 0, - 79, 226, 233, 232, 199, 0, 204, 171, 216, 0, - 214, 0, 201, 207, 208, 206, 203, 205, 218, 83, - 0, 81, 84, 80, 82 +static const short yyr2[] = { 0, + 1, 1, 2, 8, 0, 1, 3, 2, 1, 2, + 1, 4, 1, 0, 1, 1, 2, 2, 2, 2, + 2, 0, 1, 1, 2, 1, 1, 1, 1, 1, + 1, 3, 2, 1, 2, 4, 1, 3, 1, 1, + 3, 3, 2, 1, 3, 1, 1, 6, 1, 1, + 0, 1, 4, 4, 3, 6, 1, 3, 1, 3, + 3, 1, 3, 1, 1, 1, 3, 5, 0, 1, + 1, 3, 2, 3, 4, 0, 1, 0, 6, 1, + 2, 1, 1, 2, 1, 3, 1, 3, 3, 1, + 1, 1, 4, 1, 3, 1, 3, 3, 1, 3, + 1, 3, 1, 1, 1, 1, 4, 0, 3, 1, + 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, + 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, + 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, + 4, 4, 4, 4, 1, 4, 0, 1, 1, 1, + 1, 1, 1, 4, 1, 2, 3, 1, 3, 5, + 1, 3, 1, 1, 3, 1, 3, 1, 3, 1, + 3, 4, 1, 1, 1, 2, 2, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 5, 1, 3, + 1, 3, 0, 1, 1, 1, 1, 1, 1, 3, + 4, 1, 3, 2, 3, 1, 3, 0, 1, 1, + 2, 1, 1, 0, 3, 2, 3, 1, 3, 1, + 4, 4, 1, 1, 1, 1, 0, 1, 1, 2, + 2, 1, 1, 1, 1, 1, 2 }; -/* YYDEFGOTO[NTERM-NUM]. */ -static const short yydefgoto[] = -{ - -1, 3, 4, 5, 10, 11, 15, 16, 26, 27, - 28, 54, 55, 56, 57, 72, 73, 74, 75, 58, - 67, 68, 59, 98, 209, 60, 122, 123, 257, 258, - 237, 113, 293, 176, 177, 285, 286, 361, 370, 371, - 238, 143, 239, 144, 145, 161, 162, 178, 179, 61, - 170, 225, 171, 282, 146, 147, 148, 149, 150, 186, - 269, 272, 274, 187, 188, 210, 211, 212, 213, 214, - 215, 278, 216, 217, 218, 339, 340, 366, 367, 219, - 220, 221, 324, 325, 346, 233, 234, 291, 328, 193, - 253, 254, 222, 114, 115, 151, 102, 223, 241 +static const short yydefact[] = { 0, + 242, 243, 1, 2, 5, 3, 0, 0, 6, 245, + 13, 8, 0, 9, 11, 14, 7, 10, 0, 0, + 0, 0, 0, 0, 15, 16, 0, 20, 18, 21, + 19, 0, 17, 12, 22, 136, 0, 137, 138, 139, + 0, 140, 141, 149, 142, 143, 144, 145, 146, 147, + 148, 0, 23, 24, 26, 27, 30, 28, 29, 31, + 0, 0, 0, 43, 0, 44, 46, 47, 33, 0, + 34, 0, 37, 39, 40, 4, 25, 237, 96, 244, + 0, 119, 0, 0, 132, 126, 130, 131, 120, 0, + 0, 121, 125, 129, 0, 0, 49, 50, 122, 99, + 0, 42, 41, 0, 32, 35, 0, 0, 0, 239, + 55, 0, 238, 0, 133, 128, 127, 124, 123, 0, + 57, 0, 59, 0, 0, 0, 45, 5, 38, 0, + 241, 240, 96, 244, 155, 0, 0, 157, 157, 53, + 54, 157, 94, 134, 122, 90, 91, 92, 0, 97, + 98, 0, 0, 0, 0, 51, 105, 106, 100, 101, + 103, 110, 112, 111, 235, 236, 108, 107, 114, 113, + 0, 115, 36, 0, 71, 218, 104, 0, 0, 0, + 0, 0, 0, 0, 158, 165, 0, 0, 218, 0, + 135, 0, 0, 58, 61, 60, 193, 196, 190, 195, + 194, 189, 197, 0, 171, 0, 0, 52, 168, 173, + 174, 176, 178, 0, 180, 184, 183, 208, 209, 191, + 192, 0, 0, 0, 76, 0, 0, 220, 69, 218, + 73, 219, 0, 87, 0, 66, 85, 246, 0, 95, + 0, 0, 0, 0, 166, 0, 0, 86, 234, 226, + 0, 228, 233, 230, 0, 62, 64, 65, 56, 0, + 0, 0, 48, 0, 159, 160, 0, 161, 162, 0, + 163, 0, 0, 185, 0, 0, 0, 102, 117, 109, + 116, 0, 68, 77, 72, 224, 223, 222, 221, 70, + 74, 69, 156, 0, 150, 0, 247, 84, 0, 151, + 167, 153, 152, 154, 227, 0, 0, 93, 0, 0, + 172, 210, 169, 175, 177, 179, 0, 186, 187, 181, + 0, 0, 212, 118, 0, 0, 75, 88, 89, 67, + 164, 229, 0, 0, 63, 201, 0, 199, 157, 0, + 182, 188, 0, 214, 216, 211, 0, 78, 225, 232, + 231, 198, 0, 203, 170, 215, 0, 213, 0, 200, + 206, 207, 205, 202, 204, 217, 82, 0, 80, 83, + 79, 81, 0, 0, 0 }; -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -#define YYPACT_NINF -206 -static const short yypact[] = -{ - 227, -206, -206, 27, 227, -206, -38, -206, -206, 13, - 52, -206, -206, -206, -206, 47, -206, -12, 42, -206, - -206, 106, 51, 76, 111, 83, 146, 42, -206, 63, - -206, -206, -206, -206, 152, -206, -206, 380, -206, 12, - -206, -206, -206, 91, -206, -206, -206, -206, -206, -206, - -206, -206, -206, -206, 160, 380, -206, -206, -206, -206, - -206, -206, -206, 131, 670, 107, -206, 147, -206, -206, - -206, -206, 24, -206, -19, -206, -206, -206, -206, -206, - -3, 114, -206, 150, -206, 155, 174, -206, -206, -206, - -206, -206, 201, 184, -206, -206, -206, 686, 258, -206, - -206, -206, 156, 265, -206, -206, 191, -206, -206, 227, - 191, 168, 101, -206, 537, -206, 191, -206, -206, -206, - -206, -206, 75, -206, 164, 166, 183, 242, 33, -206, - -38, -206, 242, -206, -206, 44, 186, 249, 189, 220, - -8, 36, -206, -206, -13, -206, -206, 190, -206, -206, - -206, 192, -206, -206, 290, 686, 293, 293, 238, -206, - -206, 188, -206, -206, -206, -206, -206, -206, -206, -206, - -206, -206, -206, 194, -206, -206, 90, -206, 462, -206, - 280, 23, 246, 202, 23, 238, 243, 208, -206, 23, - 244, 20, 59, -206, 321, 612, -206, -206, -206, -206, - -206, -206, -206, -206, -206, -206, 283, 210, 227, 212, - -206, 211, 165, 182, 221, -206, 217, -40, -206, -206, - 222, -206, -206, -206, 242, 319, 293, 234, 242, 206, - -206, 248, 20, -206, -206, 293, 219, 97, -206, -206, - 229, 612, -206, 238, 115, 230, 612, -206, 118, 612, - -206, -206, -206, 120, -206, -206, 233, 128, -206, -206, - -206, -206, 239, 67, 250, -206, 252, -206, -206, 67, - -206, -206, 67, -206, 67, 238, 231, 255, 267, 237, - -206, -206, 351, -206, 276, -206, -206, -206, -206, -206, - -206, -206, -206, -206, 248, -206, 199, -206, 23, -206, - -206, 253, -206, -206, -206, -206, -206, -206, 71, 199, - -206, 321, 29, -206, -206, 254, 182, 221, -206, 257, - -206, 260, -206, -6, 133, -206, -206, 261, 319, -206, - -206, -206, -206, -206, -206, 268, 269, -206, -206, 134, - -206, -13, 67, -206, -206, 293, 256, -206, -206, 237, - -206, 351, -206, -206, -206, 29, 18, -206, 256, 293, - -206, 177, -206, -206, -206, -206, -206, -206, -206, -206, - 3, -206, -206, -206, -206 +static const short yydefgoto[] = { 373, + 3, 4, 8, 9, 13, 14, 24, 25, 26, 52, + 53, 54, 55, 70, 71, 72, 73, 56, 65, 66, + 57, 96, 207, 58, 120, 121, 255, 256, 235, 111, + 291, 174, 175, 283, 284, 359, 368, 369, 236, 141, + 237, 142, 143, 159, 160, 176, 177, 59, 168, 223, + 169, 280, 144, 145, 146, 147, 148, 184, 267, 270, + 272, 185, 186, 208, 209, 210, 211, 212, 213, 276, + 214, 215, 216, 337, 338, 364, 365, 217, 218, 219, + 322, 323, 344, 231, 232, 289, 326, 191, 251, 252, + 220, 112, 113, 149, 100, 221, 239 }; -/* YYPGOTO[NTERM-NUM]. */ -static const short yypgoto[] = -{ - -206, -206, -206, 355, 235, -206, -206, 357, -206, -206, - 348, -206, -206, 324, -206, -206, 308, -206, 271, -206, - -206, 281, -206, 325, -206, -206, -206, 245, -206, 79, - -28, -206, 100, -206, 171, -206, -206, -206, -206, 31, - 108, -117, -206, -189, -54, -206, 181, -175, -115, -206, - -206, -206, -165, 80, -50, -45, -206, 58, -206, -140, - -206, -206, -206, -206, 228, -111, -205, -206, 138, 142, - 143, -206, -206, -178, -206, -206, 61, -206, -206, -206, - -206, -206, -206, 69, 74, -142, -206, -206, -206, -206, - -206, 112, -120, -206, 185, 11, -206, -9, -206 +static const short yypact[] = { 81, +-32768,-32768, 81,-32768, -45,-32768, 23, 70,-32768,-32768, +-32768,-32768, 47,-32768, 31, 190,-32768,-32768, 132, 61, + 69, 108, 86, 176, 190,-32768, 76,-32768,-32768,-32768, +-32768, 166,-32768,-32768, 442,-32768, 32,-32768,-32768,-32768, + 121,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768, 168, 442,-32768,-32768,-32768,-32768,-32768,-32768,-32768, + 179, 732, 103,-32768, 52,-32768,-32768,-32768,-32768, 39, +-32768, 16,-32768,-32768,-32768,-32768,-32768, -11, 111,-32768, + 150,-32768, 152, 142,-32768,-32768,-32768,-32768,-32768, 184, + 159,-32768,-32768,-32768, 748, 240,-32768,-32768,-32768, 135, + 243,-32768,-32768, 141,-32768,-32768, 81, 141, 145, 60, +-32768, 599,-32768, 141,-32768,-32768,-32768,-32768,-32768, -1, +-32768, 143, 144, 147, 206, 68,-32768, -45,-32768, 206, +-32768,-32768, -42, 148, 221, 161, 198, 40, 53,-32768, +-32768, -37,-32768,-32768, 163,-32768,-32768,-32768, 164,-32768, +-32768, 264, 748, 261, 261, 155,-32768,-32768, 160,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, + 162,-32768,-32768, 64,-32768, 524,-32768, 246, 21, 212, + 169, 21, 155, 208, 171,-32768, 21, 210, 2, 17, +-32768, 383, 674,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 247, 172, 81, 175,-32768, 173, 133, + 140, 185,-32768, 178, 35,-32768,-32768, 182,-32768,-32768, +-32768, 206, 281, 261, 193, 206, 301,-32768, 202, 2, +-32768,-32768, 261, 181, 66,-32768,-32768, 191, 674,-32768, + 155, 71, 186, 674,-32768, 89, 674,-32768,-32768,-32768, + 90,-32768,-32768, 189, 91,-32768,-32768,-32768,-32768, 192, + 309, 194,-32768, 196,-32768,-32768, 309,-32768,-32768, 309, +-32768, 309, 155, 187, 205, 78, 200,-32768,-32768, 297, +-32768, 225,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768, 202,-32768, 250,-32768, 21,-32768,-32768, 201,-32768, +-32768,-32768,-32768,-32768,-32768, 56, 250,-32768, 383, 25, +-32768,-32768, 209, 140, 185,-32768, 215,-32768, 211,-32768, + 6, 101,-32768,-32768, 219, 281,-32768,-32768,-32768,-32768, +-32768,-32768, 223, 224,-32768,-32768, 109,-32768, -37, 309, +-32768,-32768, 261, 203,-32768,-32768, 200,-32768, 297,-32768, +-32768,-32768, 25, 24,-32768, 203, 261,-32768, 126,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768, 9,-32768,-32768, +-32768,-32768, 324, 326,-32768 }; -/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If zero, do what YYDEFACT says. - If YYTABLE_NINF, parse error. */ -#define YYTABLE_NINF -245 -static const short yytable[] = -{ - 17, 190, 12, 232, 191, 259, 17, 369, 172, 99, - 99, 6, 163, 100, 100, 6, 159, 160, 101, 101, - 12, 12, 13, 1, 2, 111, 109, 7, 64, 65, - 70, 12, 12, 363, 77, 1, 2, 12, 164, 165, - 166, 12, 167, 168, 1, 2, 64, 124, 63, 250, - 69, 290, 101, 229, 76, 12, 13, 304, 313, 276, - 306, 231, 22, 77, 9, 183, 63, 12, 167, 168, - 183, 277, 255, 199, 245, 12, 167, 168, 261, 12, - 167, 168, 23, 76, 24, 364, 18, 230, 110, 365, - 294, 185, 21, 25, 184, 62, 185, 70, 112, 12, - 322, 77, 1, 2, 345, 124, 373, 153, 125, 163, - 101, 200, 201, 62, 183, 29, 14, 69, 66, 174, - 130, 76, 259, 236, 300, 202, 203, 152, 242, 338, - 107, 330, 301, 30, 80, 169, 71, 357, 189, 173, - 185, 133, 81, 82, 335, 204, -243, 197, 198, 34, - 19, 205, 134, 83, 116, 84, 244, 85, 31, 251, - 206, 248, 252, 32, 319, 33, 125, 86, 36, 208, - 87, 251, 240, 37, 88, 240, 331, 89, 154, 289, - 240, 369, 155, 256, 101, 260, 372, 90, 255, 336, - 159, 160, 91, 227, 92, 372, 93, 228, 78, 12, - 297, 356, 1, 2, 298, 94, 95, 12, 167, 168, - 1, 2, 199, 104, 12, 167, 168, 283, 302, 264, - 96, 305, 298, 307, 116, 298, 295, 308, 83, 117, - 84, 310, 85, 97, 118, 311, 348, 354, 1, 2, - 349, 355, 86, 119, 199, 87, 12, 167, 168, 88, - 200, 120, 89, 105, 106, 159, 160, 81, 82, 267, - 268, 126, 90, 121, 202, 203, 127, 91, 128, 92, - 132, 93, 156, 199, 157, 12, 167, 168, 270, 271, - 94, 95, 200, 201, 180, 158, 182, 174, -244, 240, - 205, 181, 192, 195, 194, 96, 202, 203, 224, 256, - 174, 12, 260, 341, 226, 235, 243, 173, 288, 246, - 249, 200, 185, 262, 347, 265, 204, 263, 266, 273, - 173, 275, 205, 281, 279, 202, 203, 284, 296, 12, - 112, 206, 135, 136, 292, 303, 347, 309, 207, 137, - 208, 312, 320, 83, 38, 84, 341, 85, 138, 323, - 368, 205, 315, 314, 321, 326, 327, 86, 333, 8, - 87, 342, 343, 350, 88, 175, 359, 89, 40, 41, - 42, 344, 20, 352, 353, 35, 139, 90, 44, 79, - 108, 131, 91, 45, 92, 46, 93, 129, 12, 103, - 337, 1, 2, 47, 329, 94, 95, 140, 141, 287, - 196, 374, 48, 38, 49, 280, 332, 316, 351, 50, - 96, 51, 52, 53, 317, 247, 362, 318, 360, 358, - 334, 39, 0, 0, 0, 299, 0, 40, 41, 42, - 0, 0, 0, 43, 0, 0, 0, 44, 0, 0, - 0, 0, 45, 0, 46, 0, 0, 0, 0, 0, - 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, - 0, 48, 0, 49, 0, 0, 0, 0, 50, 0, - 51, 52, 53, 135, 136, 159, 160, 0, 0, 0, - 137, 0, 0, 0, 83, 38, 84, 0, 85, 138, - 0, 0, 0, 0, 0, 229, 0, 0, 86, 0, - 0, 87, 0, 0, 0, 88, 0, 0, 89, 40, - 41, 42, 0, 0, 0, 0, 0, 139, 90, 44, - 0, 0, 0, 91, 45, 92, 46, 93, 0, 230, - 0, 0, 0, 0, 47, 0, 94, 95, 140, 141, - 0, 0, 0, 48, 0, 49, 0, 0, 135, 136, - 50, 96, 51, 52, 53, 137, 0, 0, 0, 83, - 38, 84, 0, 85, 138, 0, 0, 0, 0, 0, - 0, 0, 0, 86, 0, 0, 87, 0, 0, 0, - 88, 0, 0, 89, 40, 41, 42, 0, 0, 0, - 0, 0, 139, 90, 44, 0, 0, 0, 91, 45, - 92, 46, 93, 0, 0, 0, 0, 0, 0, 47, - 0, 94, 95, 140, 141, 0, 0, 0, 48, 0, - 49, 0, 142, 135, 136, 50, 96, 51, 52, 53, - 137, 0, 0, 0, 83, 38, 84, 0, 85, 138, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 0, - 0, 87, 0, 0, 0, 88, 0, 0, 89, 40, - 41, 42, 0, 0, 0, 0, 0, 139, 90, 44, - 0, 0, 0, 91, 45, 92, 46, 93, 0, 0, - 0, 81, 82, 0, 47, 0, 94, 95, 140, 141, - 0, 0, 83, 48, 84, 49, 85, 1, 2, 0, - 50, 96, 51, 52, 53, 0, 86, 0, 83, 87, - 84, 0, 85, 88, 0, 0, 89, 0, 0, 0, - 0, 0, 86, 0, 0, 87, 90, 0, 0, 88, - 0, 91, 89, 92, 0, 93, 0, 0, 0, 0, - 0, 0, 90, 0, 94, 95, 0, 91, 0, 92, - 0, 93, 0, 0, 0, 0, 0, 0, 0, 96, - 94, 95, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 96 +static const short yypgoto[] = {-32768, +-32768, 327, 204,-32768,-32768, 318,-32768,-32768, 308,-32768, +-32768, 282,-32768,-32768, 268,-32768, 226,-32768,-32768, 235, +-32768, 279,-32768,-32768,-32768, 195,-32768, 33, -129,-32768, + 51,-32768, 123,-32768,-32768,-32768,-32768, -17, 59, -156, +-32768, -185, -52,-32768, 130, -173, -109,-32768,-32768,-32768, + -209, 30, -50, -43,-32768, 46,-32768, -137,-32768,-32768, +-32768,-32768, 180, -159, -246,-32768, 94, 88, 97,-32768, +-32768, -206,-32768,-32768, 10,-32768,-32768,-32768,-32768,-32768, +-32768, 26, 27, -141,-32768,-32768,-32768,-32768,-32768, 65, + -118,-32768, 134, 1,-32768, -7,-32768 }; -static const short yycheck[] = -{ - 9, 141, 8, 178, 144, 194, 15, 4, 128, 63, - 64, 0, 127, 63, 64, 4, 13, 14, 63, 64, - 8, 8, 9, 11, 12, 28, 45, 0, 37, 17, - 39, 8, 8, 15, 43, 11, 12, 8, 5, 6, - 7, 8, 9, 10, 11, 12, 55, 97, 37, 191, - 39, 229, 97, 33, 43, 8, 9, 246, 263, 99, - 249, 178, 20, 72, 102, 78, 55, 8, 9, 10, - 78, 111, 192, 6, 185, 8, 9, 10, 195, 8, - 9, 10, 40, 72, 42, 67, 34, 67, 107, 71, - 232, 104, 104, 51, 102, 37, 104, 106, 101, 8, - 278, 110, 11, 12, 110, 155, 103, 116, 97, 224, - 155, 44, 45, 55, 78, 9, 103, 106, 106, 128, - 109, 110, 311, 100, 241, 58, 59, 116, 182, 100, - 106, 296, 243, 82, 3, 102, 45, 342, 102, 128, - 104, 40, 11, 12, 309, 78, 102, 156, 157, 3, - 103, 84, 51, 22, 110, 24, 184, 26, 82, 100, - 93, 189, 103, 52, 275, 82, 155, 36, 105, 102, - 39, 100, 181, 21, 43, 184, 296, 46, 103, 229, - 189, 4, 107, 192, 229, 194, 361, 56, 308, 309, - 13, 14, 61, 103, 63, 370, 65, 107, 38, 8, - 103, 341, 11, 12, 107, 74, 75, 8, 9, 10, - 11, 12, 6, 106, 8, 9, 10, 226, 103, 208, - 89, 103, 107, 103, 110, 107, 235, 107, 22, 79, - 24, 103, 26, 102, 79, 107, 103, 103, 11, 12, - 107, 107, 36, 69, 6, 39, 8, 9, 10, 43, - 44, 50, 46, 106, 107, 13, 14, 11, 12, 94, - 95, 3, 56, 79, 58, 59, 110, 61, 3, 63, - 102, 65, 108, 6, 108, 8, 9, 10, 96, 97, - 74, 75, 44, 45, 35, 102, 66, 296, 102, 298, - 84, 102, 102, 3, 102, 89, 58, 59, 110, 308, - 309, 8, 311, 312, 110, 25, 104, 296, 102, 66, - 66, 44, 104, 30, 323, 103, 78, 107, 107, 98, - 309, 104, 84, 4, 102, 58, 59, 93, 109, 8, - 101, 93, 11, 12, 86, 105, 345, 104, 100, 18, - 102, 102, 111, 22, 23, 24, 355, 26, 27, 112, - 359, 84, 100, 103, 99, 4, 80, 36, 105, 4, - 39, 107, 105, 102, 43, 130, 110, 46, 47, 48, - 49, 111, 15, 105, 105, 27, 55, 56, 57, 55, - 72, 110, 61, 62, 63, 64, 65, 106, 8, 64, - 311, 11, 12, 72, 294, 74, 75, 76, 77, 228, - 155, 370, 81, 23, 83, 224, 298, 269, 328, 88, - 89, 90, 91, 92, 272, 187, 355, 274, 349, 345, - 308, 41, -1, -1, -1, 240, -1, 47, 48, 49, - -1, -1, -1, 53, -1, -1, -1, 57, -1, -1, - -1, -1, 62, -1, 64, -1, -1, -1, -1, -1, - -1, -1, 72, -1, -1, -1, -1, -1, -1, -1, - -1, 81, -1, 83, -1, -1, -1, -1, 88, -1, - 90, 91, 92, 11, 12, 13, 14, -1, -1, -1, - 18, -1, -1, -1, 22, 23, 24, -1, 26, 27, - -1, -1, -1, -1, -1, 33, -1, -1, 36, -1, - -1, 39, -1, -1, -1, 43, -1, -1, 46, 47, - 48, 49, -1, -1, -1, -1, -1, 55, 56, 57, - -1, -1, -1, 61, 62, 63, 64, 65, -1, 67, - -1, -1, -1, -1, 72, -1, 74, 75, 76, 77, - -1, -1, -1, 81, -1, 83, -1, -1, 11, 12, - 88, 89, 90, 91, 92, 18, -1, -1, -1, 22, - 23, 24, -1, 26, 27, -1, -1, -1, -1, -1, - -1, -1, -1, 36, -1, -1, 39, -1, -1, -1, - 43, -1, -1, 46, 47, 48, 49, -1, -1, -1, - -1, -1, 55, 56, 57, -1, -1, -1, 61, 62, - 63, 64, 65, -1, -1, -1, -1, -1, -1, 72, - -1, 74, 75, 76, 77, -1, -1, -1, 81, -1, - 83, -1, 85, 11, 12, 88, 89, 90, 91, 92, - 18, -1, -1, -1, 22, 23, 24, -1, 26, 27, - -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, - -1, 39, -1, -1, -1, 43, -1, -1, 46, 47, - 48, 49, -1, -1, -1, -1, -1, 55, 56, 57, - -1, -1, -1, 61, 62, 63, 64, 65, -1, -1, - -1, 11, 12, -1, 72, -1, 74, 75, 76, 77, - -1, -1, 22, 81, 24, 83, 26, 11, 12, -1, - 88, 89, 90, 91, 92, -1, 36, -1, 22, 39, - 24, -1, 26, 43, -1, -1, 46, -1, -1, -1, - -1, -1, 36, -1, -1, 39, 56, -1, -1, 43, - -1, 61, 46, 63, -1, 65, -1, -1, -1, -1, - -1, -1, 56, -1, 74, 75, -1, 61, -1, 63, - -1, 65, -1, -1, -1, -1, -1, -1, -1, 89, - 74, 75, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 89 + +#define YYLAST 837 + + +static const short yytable[] = { 15, + 5, 188, 230, 5, 189, 15, 257, 170, 97, 97, + 98, 98, 367, 10, 311, 161, 109, 99, 99, 229, + 288, 157, 158, 243, 10, 165, 166, 62, 10, 68, + 10, 11, 10, 75, 227, 61, 259, 67, 361, 10, + 181, 74, 1, 2, 122, 62, 10, 248, 63, 1, + 2, 99, 242, 61, 10, 11, 7, 246, 302, -242, + 107, 304, 75, 10, 165, 166, 183, 114, 228, 320, + 74, 253, 162, 163, 164, 10, 165, 166, 1, 2, + 60, 299, 298, 197, 328, 10, 165, 166, 292, 110, + 362, 1, 2, 355, 363, 123, 68, 333, 60, 131, + 75, 152, 122, 16, 67, 153, 151, 128, 74, 99, + 132, 371, 161, 317, 150, 343, 249, 181, 172, 250, + 234, 198, 108, 257, 336, 12, 171, 240, 10, 367, + 181, 1, 2, 274, 19, 200, 201, 64, 157, 158, + 27, 182, 28, 183, 105, 275, 195, 196, 10, 17, + 29, 1, 2, 123, 187, 249, 183, 103, 104, 30, + 197, 203, 10, 165, 166, 69, 225, 31, 295, 167, + 226, 238, 296, 300, 238, 329, 287, 296, 32, 238, + 34, 78, 254, 99, 258, 370, 35, 253, 334, 79, + 80, 303, 305, 308, 370, 296, 306, 309, 198, 199, + 81, 354, 82, 346, 83, 76, 262, 347, 102, 20, + 117, 352, 200, 201, 84, 353, 281, 85, 157, 158, + 114, 86, 79, 80, 87, 293, 265, 266, 115, 21, + 116, 22, 202, 118, 88, 268, 269, 119, 203, 89, + 23, 90, 124, 91, 125, 126, 130, 204, 156, -243, + 154, 155, 92, 93, 205, 178, 206, 10, 165, 166, + 1, 2, 179, 180, 190, 192, 193, 94, 10, 222, + 233, 224, 241, 244, 183, 247, 260, 263, 261, 264, + 95, 273, 271, 277, 279, 282, 172, 290, 238, 294, + 301, 110, 307, 310, 171, 313, 312, 318, 254, 172, + 324, 258, 339, 319, 325, 331, 197, 171, 10, 165, + 166, 321, 357, 345, 197, 340, 10, 165, 166, 341, + 348, 342, 81, 374, 82, 375, 83, 350, 351, 6, + 18, 173, 33, 129, 77, 345, 84, 106, 127, 85, + 101, 335, 327, 86, 198, 339, 87, 194, 285, 366, + 372, 278, 198, 199, 330, 349, 88, 315, 200, 201, + 314, 89, 360, 90, 245, 91, 200, 201, 316, 356, + 332, 297, 358, 0, 92, 93, 0, 0, 0, 0, + 0, 0, 0, 0, 203, 0, 202, 0, 0, 94, + 10, 0, 203, 133, 134, 0, 0, 0, 0, 0, + 135, 204, 286, 0, 81, 36, 82, 0, 83, 136, + 206, 0, 0, 0, 0, 0, 0, 0, 84, 0, + 0, 85, 0, 0, 0, 86, 0, 0, 87, 38, + 39, 40, 0, 0, 0, 0, 0, 137, 88, 42, + 0, 0, 0, 89, 43, 90, 44, 91, 0, 10, + 0, 0, 1, 2, 45, 0, 92, 93, 138, 139, + 0, 0, 0, 46, 36, 47, 0, 0, 0, 0, + 48, 94, 49, 50, 51, 0, 0, 0, 0, 0, + 0, 0, 37, 0, 0, 0, 0, 0, 38, 39, + 40, 0, 0, 0, 41, 0, 0, 0, 42, 0, + 0, 0, 0, 43, 0, 44, 0, 0, 0, 0, + 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, + 0, 0, 46, 0, 47, 0, 0, 0, 0, 48, + 0, 49, 50, 51, 133, 134, 157, 158, 0, 0, + 0, 135, 0, 0, 0, 81, 36, 82, 0, 83, + 136, 0, 0, 0, 0, 0, 227, 0, 0, 84, + 0, 0, 85, 0, 0, 0, 86, 0, 0, 87, + 38, 39, 40, 0, 0, 0, 0, 0, 137, 88, + 42, 0, 0, 0, 89, 43, 90, 44, 91, 0, + 228, 0, 0, 0, 0, 45, 0, 92, 93, 138, + 139, 0, 0, 0, 46, 0, 47, 0, 0, 133, + 134, 48, 94, 49, 50, 51, 135, 0, 0, 0, + 81, 36, 82, 0, 83, 136, 0, 0, 0, 0, + 0, 0, 0, 0, 84, 0, 0, 85, 0, 0, + 0, 86, 0, 0, 87, 38, 39, 40, 0, 0, + 0, 0, 0, 137, 88, 42, 0, 0, 0, 89, + 43, 90, 44, 91, 0, 0, 0, 0, 0, 0, + 45, 0, 92, 93, 138, 139, 0, 0, 0, 46, + 0, 47, 0, 140, 133, 134, 48, 94, 49, 50, + 51, 135, 0, 0, 0, 81, 36, 82, 0, 83, + 136, 0, 0, 0, 0, 0, 0, 0, 0, 84, + 0, 0, 85, 0, 0, 0, 86, 0, 0, 87, + 38, 39, 40, 0, 0, 0, 0, 0, 137, 88, + 42, 0, 0, 0, 89, 43, 90, 44, 91, 0, + 0, 0, 79, 80, 0, 45, 0, 92, 93, 138, + 139, 0, 0, 81, 46, 82, 47, 83, 1, 2, + 0, 48, 94, 49, 50, 51, 0, 84, 0, 81, + 85, 82, 0, 83, 86, 0, 0, 87, 0, 0, + 0, 0, 0, 84, 0, 0, 85, 88, 0, 0, + 86, 0, 89, 87, 90, 0, 91, 0, 0, 0, + 0, 0, 0, 88, 0, 92, 93, 0, 89, 0, + 90, 0, 91, 0, 0, 0, 0, 0, 0, 0, + 94, 92, 93, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 94 }; -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const unsigned char yystos[] = -{ - 0, 11, 12, 114, 115, 116, 208, 0, 116, 102, - 117, 118, 8, 9, 103, 119, 120, 210, 34, 103, - 120, 104, 20, 40, 42, 51, 121, 122, 123, 9, - 82, 82, 52, 82, 3, 123, 105, 21, 23, 41, - 47, 48, 49, 53, 57, 62, 64, 72, 81, 83, - 88, 90, 91, 92, 124, 125, 126, 127, 132, 135, - 138, 162, 170, 208, 210, 17, 106, 133, 134, 208, - 210, 45, 128, 129, 130, 131, 208, 210, 38, 126, - 3, 11, 12, 22, 24, 26, 36, 39, 43, 46, - 56, 61, 63, 65, 74, 75, 89, 102, 136, 157, - 167, 168, 209, 136, 106, 106, 107, 106, 129, 45, - 107, 28, 101, 144, 206, 207, 110, 79, 79, 69, - 50, 79, 139, 140, 167, 208, 3, 110, 3, 134, - 208, 131, 102, 40, 51, 11, 12, 18, 27, 55, - 76, 77, 85, 154, 156, 157, 167, 168, 169, 170, - 171, 208, 208, 210, 103, 107, 108, 108, 102, 13, - 14, 158, 159, 161, 5, 6, 7, 9, 10, 102, - 163, 165, 205, 208, 210, 117, 146, 147, 160, 161, - 35, 102, 66, 78, 102, 104, 172, 176, 177, 102, - 172, 172, 102, 202, 102, 3, 140, 210, 210, 6, - 44, 45, 58, 59, 78, 84, 93, 100, 102, 137, - 178, 179, 180, 181, 182, 183, 185, 186, 187, 192, - 193, 194, 205, 210, 110, 164, 110, 103, 107, 33, - 67, 154, 160, 198, 199, 25, 100, 143, 153, 155, - 210, 211, 157, 104, 143, 178, 66, 177, 143, 66, - 198, 100, 103, 203, 204, 205, 210, 141, 142, 156, - 210, 154, 30, 107, 208, 103, 107, 94, 95, 173, - 96, 97, 174, 98, 175, 104, 99, 111, 184, 102, - 159, 4, 166, 210, 93, 148, 149, 147, 102, 167, - 186, 200, 86, 145, 198, 210, 109, 103, 107, 207, - 154, 178, 103, 105, 156, 103, 156, 103, 107, 104, - 103, 107, 102, 179, 103, 100, 181, 182, 183, 178, - 111, 99, 186, 112, 195, 196, 4, 80, 201, 145, - 165, 205, 153, 105, 204, 165, 205, 142, 100, 188, - 189, 210, 107, 105, 111, 110, 197, 210, 103, 107, - 102, 166, 105, 105, 103, 107, 172, 179, 197, 110, - 196, 150, 189, 15, 67, 71, 190, 191, 210, 4, - 151, 152, 160, 103, 152 +static const short yycheck[] = { 7, + 0, 139, 176, 3, 142, 13, 192, 126, 61, 62, + 61, 62, 4, 8, 261, 125, 28, 61, 62, 176, + 227, 13, 14, 183, 8, 9, 10, 35, 8, 37, + 8, 9, 8, 41, 33, 35, 193, 37, 15, 8, + 78, 41, 11, 12, 95, 53, 8, 189, 17, 11, + 12, 95, 182, 53, 8, 9, 102, 187, 244, 102, + 45, 247, 70, 8, 9, 10, 104, 110, 67, 276, + 70, 190, 5, 6, 7, 8, 9, 10, 11, 12, + 35, 241, 239, 6, 294, 8, 9, 10, 230, 101, + 67, 11, 12, 340, 71, 95, 104, 307, 53, 40, + 108, 103, 153, 34, 104, 107, 114, 107, 108, 153, + 51, 103, 222, 273, 114, 110, 100, 78, 126, 103, + 100, 44, 107, 309, 100, 103, 126, 180, 8, 4, + 78, 11, 12, 99, 104, 58, 59, 106, 13, 14, + 9, 102, 82, 104, 106, 111, 154, 155, 8, 103, + 82, 11, 12, 153, 102, 100, 104, 106, 107, 52, + 6, 84, 8, 9, 10, 45, 103, 82, 103, 102, + 107, 179, 107, 103, 182, 294, 227, 107, 3, 187, + 105, 3, 190, 227, 192, 359, 21, 306, 307, 11, + 12, 103, 103, 103, 368, 107, 107, 107, 44, 45, + 22, 339, 24, 103, 26, 38, 206, 107, 106, 20, + 69, 103, 58, 59, 36, 107, 224, 39, 13, 14, + 110, 43, 11, 12, 46, 233, 94, 95, 79, 40, + 79, 42, 78, 50, 56, 96, 97, 79, 84, 61, + 51, 63, 3, 65, 110, 3, 102, 93, 102, 102, + 108, 108, 74, 75, 100, 35, 102, 8, 9, 10, + 11, 12, 102, 66, 102, 102, 3, 89, 8, 110, + 25, 110, 104, 66, 104, 66, 30, 103, 107, 107, + 102, 104, 98, 102, 4, 93, 294, 86, 296, 109, + 105, 101, 104, 102, 294, 100, 103, 111, 306, 307, + 4, 309, 310, 99, 80, 105, 6, 307, 8, 9, + 10, 112, 110, 321, 6, 107, 8, 9, 10, 105, + 102, 111, 22, 0, 24, 0, 26, 105, 105, 3, + 13, 128, 25, 108, 53, 343, 36, 70, 104, 39, + 62, 309, 292, 43, 44, 353, 46, 153, 226, 357, + 368, 222, 44, 45, 296, 326, 56, 270, 58, 59, + 267, 61, 353, 63, 185, 65, 58, 59, 272, 343, + 306, 238, 347, -1, 74, 75, -1, -1, -1, -1, + -1, -1, -1, -1, 84, -1, 78, -1, -1, 89, + 8, -1, 84, 11, 12, -1, -1, -1, -1, -1, + 18, 93, 102, -1, 22, 23, 24, -1, 26, 27, + 102, -1, -1, -1, -1, -1, -1, -1, 36, -1, + -1, 39, -1, -1, -1, 43, -1, -1, 46, 47, + 48, 49, -1, -1, -1, -1, -1, 55, 56, 57, + -1, -1, -1, 61, 62, 63, 64, 65, -1, 8, + -1, -1, 11, 12, 72, -1, 74, 75, 76, 77, + -1, -1, -1, 81, 23, 83, -1, -1, -1, -1, + 88, 89, 90, 91, 92, -1, -1, -1, -1, -1, + -1, -1, 41, -1, -1, -1, -1, -1, 47, 48, + 49, -1, -1, -1, 53, -1, -1, -1, 57, -1, + -1, -1, -1, 62, -1, 64, -1, -1, -1, -1, + -1, -1, -1, 72, -1, -1, -1, -1, -1, -1, + -1, -1, 81, -1, 83, -1, -1, -1, -1, 88, + -1, 90, 91, 92, 11, 12, 13, 14, -1, -1, + -1, 18, -1, -1, -1, 22, 23, 24, -1, 26, + 27, -1, -1, -1, -1, -1, 33, -1, -1, 36, + -1, -1, 39, -1, -1, -1, 43, -1, -1, 46, + 47, 48, 49, -1, -1, -1, -1, -1, 55, 56, + 57, -1, -1, -1, 61, 62, 63, 64, 65, -1, + 67, -1, -1, -1, -1, 72, -1, 74, 75, 76, + 77, -1, -1, -1, 81, -1, 83, -1, -1, 11, + 12, 88, 89, 90, 91, 92, 18, -1, -1, -1, + 22, 23, 24, -1, 26, 27, -1, -1, -1, -1, + -1, -1, -1, -1, 36, -1, -1, 39, -1, -1, + -1, 43, -1, -1, 46, 47, 48, 49, -1, -1, + -1, -1, -1, 55, 56, 57, -1, -1, -1, 61, + 62, 63, 64, 65, -1, -1, -1, -1, -1, -1, + 72, -1, 74, 75, 76, 77, -1, -1, -1, 81, + -1, 83, -1, 85, 11, 12, 88, 89, 90, 91, + 92, 18, -1, -1, -1, 22, 23, 24, -1, 26, + 27, -1, -1, -1, -1, -1, -1, -1, -1, 36, + -1, -1, 39, -1, -1, -1, 43, -1, -1, 46, + 47, 48, 49, -1, -1, -1, -1, -1, 55, 56, + 57, -1, -1, -1, 61, 62, 63, 64, 65, -1, + -1, -1, 11, 12, -1, 72, -1, 74, 75, 76, + 77, -1, -1, 22, 81, 24, 83, 26, 11, 12, + -1, 88, 89, 90, 91, 92, -1, 36, -1, 22, + 39, 24, -1, 26, 43, -1, -1, 46, -1, -1, + -1, -1, -1, 36, -1, -1, 39, 56, -1, -1, + 43, -1, 61, 46, 63, -1, 65, -1, -1, -1, + -1, -1, -1, 56, -1, 74, 75, -1, 61, -1, + 63, -1, 65, -1, -1, -1, -1, -1, -1, -1, + 89, 74, 75, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 89 }; +/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ +#line 3 "/usr/share/bison.simple" +/* This file comes from bison-1.28. */ -#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) -# define YYSIZE_T __SIZE_TYPE__ -#endif -#if ! defined (YYSIZE_T) && defined (size_t) -# define YYSIZE_T size_t +/* Skeleton output parser for bison, + Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* This is the parser code that is written into each bison parser + when the %semantic_parser declaration is not specified in the grammar. + It was written by Richard Stallman by simplifying the hairy parser + used when %semantic_parser is specified. */ + +#ifndef YYSTACK_USE_ALLOCA +#ifdef alloca +#define YYSTACK_USE_ALLOCA +#else /* alloca not defined */ +#ifdef __GNUC__ +#define YYSTACK_USE_ALLOCA +#define alloca __builtin_alloca +#else /* not GNU C. */ +#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) +#define YYSTACK_USE_ALLOCA +#include +#else /* not sparc */ +/* We think this test detects Watcom and Microsoft C. */ +/* This used to test MSDOS, but that is a bad idea + since that symbol is in the user namespace. */ +#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) +#if 0 /* No need for malloc.h, which pollutes the namespace; + instead, just don't use alloca. */ +#include #endif -#if ! defined (YYSIZE_T) -# if defined (__STDC__) || defined (__cplusplus) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# endif +#else /* not MSDOS, or __TURBOC__ */ +#if defined(_AIX) +/* I don't know what this was needed for, but it pollutes the namespace. + So I turned it off. rms, 2 May 1997. */ +/* #include */ + #pragma alloca +#define YYSTACK_USE_ALLOCA +#else /* not MSDOS, or __TURBOC__, or _AIX */ +#if 0 +#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up, + and on HPUX 10. Eventually we can turn this on. */ +#define YYSTACK_USE_ALLOCA +#define alloca __builtin_alloca +#endif /* __hpux */ #endif -#if ! defined (YYSIZE_T) -# define YYSIZE_T unsigned int +#endif /* not _AIX */ +#endif /* not MSDOS, or __TURBOC__ */ +#endif /* not sparc */ +#endif /* not GNU C */ +#endif /* alloca not defined */ +#endif /* YYSTACK_USE_ALLOCA not defined */ + +#ifdef YYSTACK_USE_ALLOCA +#define YYSTACK_ALLOC alloca +#else +#define YYSTACK_ALLOC malloc #endif +/* Note: there must be only one dollar sign in this file. + It is replaced by the list of actions, each action + as one case of the switch. */ + #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY -2 #define YYEOF 0 - #define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab +#define YYABORT goto yyabortlab #define YYERROR goto yyerrlab1 - -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. +/* Like YYERROR except do call yyerror. + This remains here temporarily to ease the + transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ - #define YYFAIL goto yyerrlab - #define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ +#define YYBACKUP(token, value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ - { \ - yychar = (Token); \ - yylval = (Value); \ + { yychar = (token), yylval = (value); \ yychar1 = YYTRANSLATE (yychar); \ YYPOPSTACK; \ goto yybackup; \ } \ else \ - { \ - yyerror ("syntax error: cannot back up"); \ - YYERROR; \ - } \ + { yyerror ("syntax error: cannot back up"); YYERROR; } \ while (0) #define YYTERROR 1 #define YYERRCODE 256 -/* YYLLOC_DEFAULT -- Compute the default location (before the actions - are run). */ - -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - Current.first_line = Rhs[1].first_line; \ - Current.first_column = Rhs[1].first_column; \ - Current.last_line = Rhs[N].last_line; \ - Current.last_column = Rhs[N].last_column; +#ifndef YYPURE +#define YYLEX yylex() #endif -/* YYLEX -- calling `yylex' with the right arguments. */ - -#define YYLEX yylex () - -/* Enable debugging if requested. */ -#if YYDEBUG - -# ifndef YYFPRINTF -# include /* INFRINGES ON USER NAME SPACE */ -# define YYFPRINTF fprintf -# endif - -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (0) -# define YYDSYMPRINT(Args) \ -do { \ - if (yydebug) \ - yysymprint Args; \ -} while (0) -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YYDSYMPRINT(Args) -#endif /* !YYDEBUG */ - -/* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH -# define YYINITDEPTH 200 +#ifdef YYPURE +#ifdef YYLSP_NEEDED +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval, &yylloc) +#endif +#else /* not YYLSP_NEEDED */ +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval) +#endif +#endif /* not YYLSP_NEEDED */ #endif -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). +/* If nonreentrant, generate the variables here */ - Do not make this value too large; the results are undefined if - SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ +#ifndef YYPURE -#if YYMAXDEPTH == 0 -# undef YYMAXDEPTH -#endif +int yychar; /* the lookahead symbol */ +YYSTYPE yylval; /* the semantic value of the */ + /* lookahead symbol */ -#ifndef YYMAXDEPTH -# define YYMAXDEPTH 10000 +#ifdef YYLSP_NEEDED +YYLTYPE yylloc; /* location data for the lookahead */ + /* symbol */ #endif - +int yynerrs; /* number of parse errors so far */ +#endif /* not YYPURE */ -#if YYERROR_VERBOSE +#if YYDEBUG != 0 +int yydebug; /* nonzero means print parse trace */ +/* Since this is uninitialized, it does not stop multiple parsers + from coexisting. */ +#endif -# ifndef yystrlen -# if defined (__GLIBC__) && defined (_STRING_H) -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -static YYSIZE_T -# if defined (__STDC__) || defined (__cplusplus) -yystrlen (const char *yystr) -# else -yystrlen (yystr) - const char *yystr; -# endif -{ - register const char *yys = yystr; +/* YYINITDEPTH indicates the initial size of the parser's stacks */ - while (*yys++ != '\0') - continue; +#ifndef YYINITDEPTH +#define YYINITDEPTH 200 +#endif - return yys - yystr - 1; -} -# endif -# endif - -# ifndef yystpcpy -# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -static char * -# if defined (__STDC__) || defined (__cplusplus) -yystpcpy (char *yydest, const char *yysrc) -# else -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; -# endif -{ - register char *yyd = yydest; - register const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif +/* YYMAXDEPTH is the maximum size the stacks can grow to + (effective only if the built-in stack extension method is used). */ -#endif /* !YYERROR_VERBOSE */ +#if YYMAXDEPTH == 0 +#undef YYMAXDEPTH +#endif +#ifndef YYMAXDEPTH +#define YYMAXDEPTH 10000 +#endif - -#if YYDEBUG -/*-----------------------------. -| Print this symbol on YYOUT. | -`-----------------------------*/ - +/* Define __yy_memcpy. Note that the size argument + should be passed with type unsigned int, because that is what the non-GCC + definitions require. With GCC, __builtin_memcpy takes an arg + of type size_t, but it can handle unsigned int. */ + +#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ +#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) +#else /* not GNU C or C++ */ +#ifndef __cplusplus + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ static void -#if defined (__STDC__) || defined (__cplusplus) -yysymprint (FILE* yyout, int yytype, YYSTYPE yyvalue) -#else -yysymprint (yyout, yytype, yyvalue) - FILE* yyout; - int yytype; - YYSTYPE yyvalue; -#endif +__yy_memcpy (to, from, count) + char *to; + char *from; + unsigned int count; { - /* Pacify ``unused variable'' warnings. */ - (void) yyvalue; - - if (yytype < YYNTOKENS) - { - YYFPRINTF (yyout, "token %s (", yytname[yytype]); -# ifdef YYPRINT - YYPRINT (yyout, yytoknum[yytype], yyvalue); -# endif - } - else - YYFPRINTF (yyout, "nterm %s (", yytname[yytype]); + register char *f = from; + register char *t = to; + register int i = count; - switch (yytype) - { - default: - break; - } - YYFPRINTF (yyout, ")"); + while (i-- > 0) + *t++ = *f++; } -#endif /* YYDEBUG. */ +#else /* __cplusplus */ -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ static void -#if defined (__STDC__) || defined (__cplusplus) -yydestruct (int yytype, YYSTYPE yyvalue) -#else -yydestruct (yytype, yyvalue) - int yytype; - YYSTYPE yyvalue; -#endif +__yy_memcpy (char *to, char *from, unsigned int count) { - /* Pacify ``unused variable'' warnings. */ - (void) yyvalue; + register char *t = to; + register char *f = from; + register int i = count; - switch (yytype) - { - default: - break; - } + while (i-- > 0) + *t++ = *f++; } +#endif +#endif +#line 217 "/usr/share/bison.simple" /* The user can define YYPARSE_PARAM as the name of an argument to be passed into yyparse. The argument should have type void *. @@ -1394,85 +994,76 @@ yydestruct (yytype, yyvalue) to the proper pointer type. */ #ifdef YYPARSE_PARAM -# if defined (__STDC__) || defined (__cplusplus) -# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM -# define YYPARSE_PARAM_DECL -# else -# define YYPARSE_PARAM_ARG YYPARSE_PARAM -# define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -# endif -#else /* !YYPARSE_PARAM */ -# define YYPARSE_PARAM_ARG -# define YYPARSE_PARAM_DECL -#endif /* !YYPARSE_PARAM */ +#ifdef __cplusplus +#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM +#define YYPARSE_PARAM_DECL +#else /* not __cplusplus */ +#define YYPARSE_PARAM_ARG YYPARSE_PARAM +#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; +#endif /* not __cplusplus */ +#else /* not YYPARSE_PARAM */ +#define YYPARSE_PARAM_ARG +#define YYPARSE_PARAM_DECL +#endif /* not YYPARSE_PARAM */ /* Prevent warning if -Wstrict-prototypes. */ #ifdef __GNUC__ -# ifdef YYPARSE_PARAM +#ifdef YYPARSE_PARAM int yyparse (void *); -# else +#else int yyparse (void); -# endif #endif - - -/* The lookahead symbol. */ -int yychar; - -/* The semantic value of the lookahead symbol. */ -YYSTYPE yylval; - -/* Number of parse errors so far. */ -int yynerrs; - +#endif int -yyparse (YYPARSE_PARAM_ARG) +yyparse(YYPARSE_PARAM_ARG) YYPARSE_PARAM_DECL { - register int yystate; register int yyn; - int yyresult; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - /* Lookahead token as an internal (translated) token number. */ - int yychar1 = 0; - - /* Three stacks and their tools: - `yyss': related to states, - `yyvs': related to semantic values, - `yyls': related to locations. - - Refer to the stacks thru separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - short yyssa[YYINITDEPTH]; - short *yyss = yyssa; register short *yyssp; - - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs = yyvsa; register YYSTYPE *yyvsp; + int yyerrstatus; /* number of tokens to shift before error messages enabled */ + int yychar1 = 0; /* lookahead token as an internal (translated) token number */ + short yyssa[YYINITDEPTH]; /* the state stack */ + YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ + short *yyss = yyssa; /* refer to the stacks thru separate pointers */ + YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ +#ifdef YYLSP_NEEDED + YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ + YYLTYPE *yyls = yylsa; + YYLTYPE *yylsp; + +#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) +#else #define YYPOPSTACK (yyvsp--, yyssp--) +#endif - YYSIZE_T yystacksize = YYINITDEPTH; + int yystacksize = YYINITDEPTH; + int yyfree_stacks = 0; - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; +#ifdef YYPURE + int yychar; + YYSTYPE yylval; + int yynerrs; +#ifdef YYLSP_NEEDED + YYLTYPE yylloc; +#endif +#endif + YYSTYPE yyval; /* the variable used to return */ + /* semantic values from the action */ + /* routines */ - /* When reducing, the number of symbols on the RHS of the reduced - rule. */ int yylen; - YYDPRINTF ((stderr, "Starting parse\n")); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Starting parse\n"); +#endif yystate = 0; yyerrstatus = 0; @@ -1484,96 +1075,110 @@ yyparse (YYPARSE_PARAM_ARG) so that they stay on the same level as the state stack. The wasted elements are never initialized. */ - yyssp = yyss; + yyssp = yyss - 1; yyvsp = yyvs; +#ifdef YYLSP_NEEDED + yylsp = yyls; +#endif - goto yysetstate; - -/*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | -`------------------------------------------------------------*/ - yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. - */ - yyssp++; +/* Push a new state, which is found in yystate . */ +/* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. */ +yynewstate: - yysetstate: - *yyssp = yystate; + *++yyssp = yystate; if (yyssp >= yyss + yystacksize - 1) { + /* Give user a chance to reallocate the stack */ + /* Use copies of these so that the &'s don't force the real ones into memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; +#ifdef YYLSP_NEEDED + YYLTYPE *yyls1 = yyls; +#endif + /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; + int size = yyssp - yyss + 1; #ifdef yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; - - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow ("parser stack overflow", - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; - } + /* Each stack pointer address is followed by the size of + the data in use in that stack, in bytes. */ +#ifdef YYLSP_NEEDED + /* This used to be a conditional around just the two extra args, + but that might be undefined if yyoverflow is a macro. */ + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yyls1, size * sizeof (*yylsp), + &yystacksize); +#else + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yystacksize); +#endif + + yyss = yyss1; yyvs = yyvs1; +#ifdef YYLSP_NEEDED + yyls = yyls1; +#endif #else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyoverflowlab; -# else /* Extend the stack our own way. */ if (yystacksize >= YYMAXDEPTH) - goto yyoverflowlab; + { + yyerror("parser stack overflow"); + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); +#endif + } + return 2; + } yystacksize *= 2; if (yystacksize > YYMAXDEPTH) yystacksize = YYMAXDEPTH; - - { - short *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyoverflowlab; - YYSTACK_RELOCATE (yyss); - YYSTACK_RELOCATE (yyvs); - -# undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } -# endif +#ifndef YYSTACK_USE_ALLOCA + yyfree_stacks = 1; +#endif + yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); + __yy_memcpy ((char *)yyss, (char *)yyss1, + size * (unsigned int) sizeof (*yyssp)); + yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); + __yy_memcpy ((char *)yyvs, (char *)yyvs1, + size * (unsigned int) sizeof (*yyvsp)); +#ifdef YYLSP_NEEDED + yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); + __yy_memcpy ((char *)yyls, (char *)yyls1, + size * (unsigned int) sizeof (*yylsp)); +#endif #endif /* no yyoverflow */ - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; - + yyssp = yyss + size - 1; + yyvsp = yyvs + size - 1; +#ifdef YYLSP_NEEDED + yylsp = yyls + size - 1; +#endif - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Stack size increased to %d\n", yystacksize); +#endif if (yyssp >= yyss + yystacksize - 1) YYABORT; } - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Entering state %d\n", yystate); +#endif goto yybackup; - -/*-----------. -| yybackup. | -`-----------*/ -yybackup: + yybackup: /* Do appropriate processing given the current state. */ /* Read a lookahead token if we need one and don't already have one. */ @@ -1582,7 +1187,7 @@ yyparse (YYPARSE_PARAM_ARG) /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; - if (yyn == YYPACT_NINF) + if (yyn == YYFLAG) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ @@ -1592,141 +1197,146 @@ yyparse (YYPARSE_PARAM_ARG) if (yychar == YYEMPTY) { - YYDPRINTF ((stderr, "Reading a token: ")); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Reading a token: "); +#endif yychar = YYLEX; } - /* Convert token to internal form (in yychar1) for indexing tables with. */ + /* Convert token to internal form (in yychar1) for indexing tables with */ - if (yychar <= 0) /* This means end of input. */ + if (yychar <= 0) /* This means end of input. */ { yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more. */ + yychar = YYEOF; /* Don't call YYLEX any more */ - YYDPRINTF ((stderr, "Now at end of input.\n")); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Now at end of input.\n"); +#endif } else { - yychar1 = YYTRANSLATE (yychar); + yychar1 = YYTRANSLATE(yychar); - /* We have to keep this `#if YYDEBUG', since we use variables - which are defined only if `YYDEBUG' is set. */ - YYDPRINTF ((stderr, "Next token is ")); - YYDSYMPRINT ((stderr, yychar1, yylval)); - YYDPRINTF ((stderr, "\n")); +#if YYDEBUG != 0 + if (yydebug) + { + fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); + /* Give the individual parser a way to print the precise meaning + of a token, for further debugging info. */ +#ifdef YYPRINT + YYPRINT (stderr, yychar, yylval); +#endif + fprintf (stderr, ")\n"); + } +#endif } - /* If the proper action on seeing token YYCHAR1 is to reduce or to - detect an error, take that action. */ yyn += yychar1; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yychar1) + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) goto yydefault; + yyn = yytable[yyn]; - if (yyn <= 0) + + /* yyn is what to do for this token type in this state. + Negative => reduce, -yyn is rule number. + Positive => shift, yyn is new state. + New state is final state => don't bother to shift, + just return success. + 0, or most negative number => error. */ + + if (yyn < 0) { - if (yyn == 0 || yyn == YYTABLE_NINF) + if (yyn == YYFLAG) goto yyerrlab; yyn = -yyn; goto yyreduce; } + else if (yyn == 0) + goto yyerrlab; if (yyn == YYFINAL) YYACCEPT; /* Shift the lookahead token. */ - YYDPRINTF ((stderr, "Shifting token %d (%s), ", - yychar, yytname[yychar1])); + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); +#endif /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; + /* count tokens shifted since error; after three, turn off error status. */ + if (yyerrstatus) yyerrstatus--; yystate = yyn; goto yynewstate; - -/*-----------------------------------------------------------. -| yydefault -- do the default action for the current state. | -`-----------------------------------------------------------*/ +/* Do the default action for the current state. */ yydefault: + yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; - goto yyreduce; - -/*-----------------------------. -| yyreduce -- Do a reduction. | -`-----------------------------*/ +/* Do a reduction. yyn is the number of a rule to reduce with. */ yyreduce: - /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; + if (yylen > 0) + yyval = yyvsp[1-yylen]; /* implement default value of the action */ - /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. - - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval = yyvsp[1-yylen]; - - - -#if YYDEBUG - /* We have to keep this `#if YYDEBUG', since we use variables which - are defined only if `YYDEBUG' is set. */ +#if YYDEBUG != 0 if (yydebug) { - int yyi; + int i; - YYFPRINTF (stderr, "Reducing via rule %d (line %d), ", - yyn - 1, yyrline[yyn]); + fprintf (stderr, "Reducing via rule %d (line %d), ", + yyn, yyrline[yyn]); /* Print the symbols being reduced, and their result. */ - for (yyi = yyprhs[yyn]; yyrhs[yyi] >= 0; yyi++) - YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]); - YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]); + for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) + fprintf (stderr, "%s ", yytname[yyrhs[i]]); + fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); } #endif - switch (yyn) - { - case 2: + + + switch (yyn) { + +case 1: #line 298 "asn1p_y.y" - { +{ *(void **)param = yyvsp[0].a_grammar; - } - break; - - case 3: + ; + break;} +case 2: #line 304 "asn1p_y.y" - { +{ yyval.a_grammar = asn1p_new(); checkmem(yyval.a_grammar); TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); - } - break; - - case 4: + ; + break;} +case 3: #line 309 "asn1p_y.y" - { +{ yyval.a_grammar = yyvsp[-1].a_grammar; TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); - } - break; - - case 5: + ; + break;} +case 4: #line 330 "asn1p_y.y" - { +{ if(yyvsp[-1].a_module) { yyval.a_module = yyvsp[-1].a_module; @@ -1739,154 +1349,133 @@ yyparse (YYPARSE_PARAM_ARG) yyval.a_module->Identifier = yyvsp[-7].tv_str; yyval.a_module->module_oid = yyvsp[-6].a_oid; yyval.a_module->module_flags = yyvsp[-4].a_module_flags; - } - break; - - case 6: + ; + break;} +case 5: #line 351 "asn1p_y.y" - { yyval.a_oid = 0; } - break; - - case 7: +{ yyval.a_oid = 0; ; + break;} +case 6: #line 352 "asn1p_y.y" - { yyval.a_oid = yyvsp[0].a_oid; } - break; - - case 8: +{ yyval.a_oid = yyvsp[0].a_oid; ; + break;} +case 7: #line 356 "asn1p_y.y" - { +{ yyval.a_oid = yyvsp[-1].a_oid; - } - break; - - case 9: + ; + break;} +case 8: #line 359 "asn1p_y.y" - { +{ yyval.a_oid = 0; - } - break; - - case 10: + ; + break;} +case 9: #line 365 "asn1p_y.y" - { +{ yyval.a_oid = asn1p_oid_new(); asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); if(yyvsp[0].a_oid_arc.name) free(yyvsp[0].a_oid_arc.name); - } - break; - - case 11: + ; + break;} +case 10: #line 371 "asn1p_y.y" - { +{ yyval.a_oid = yyvsp[-1].a_oid; asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); if(yyvsp[0].a_oid_arc.name) free(yyvsp[0].a_oid_arc.name); - } - break; - - case 12: + ; + break;} +case 11: #line 380 "asn1p_y.y" - { /* iso */ +{ /* iso */ yyval.a_oid_arc.name = yyvsp[0].tv_str; yyval.a_oid_arc.number = -1; - } - break; - - case 13: + ; + break;} +case 12: #line 384 "asn1p_y.y" - { /* iso(1) */ +{ /* iso(1) */ yyval.a_oid_arc.name = yyvsp[-3].tv_str; yyval.a_oid_arc.number = yyvsp[-1].a_int; - } - break; - - case 14: + ; + break;} +case 13: #line 388 "asn1p_y.y" - { /* 1 */ +{ /* 1 */ yyval.a_oid_arc.name = 0; yyval.a_oid_arc.number = yyvsp[0].a_int; - } - break; - - case 15: + ; + break;} +case 14: #line 398 "asn1p_y.y" - { yyval.a_module_flags = MSF_NOFLAGS; } - break; - - case 16: +{ yyval.a_module_flags = MSF_NOFLAGS; ; + break;} +case 15: #line 399 "asn1p_y.y" - { +{ yyval.a_module_flags = yyvsp[0].a_module_flags; - } - break; - - case 17: + ; + break;} +case 16: #line 408 "asn1p_y.y" - { +{ yyval.a_module_flags = yyvsp[0].a_module_flags; - } - break; - - case 18: + ; + break;} +case 17: #line 411 "asn1p_y.y" - { +{ yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags; - } - break; - - case 19: + ; + break;} +case 18: #line 420 "asn1p_y.y" - { +{ yyval.a_module_flags = MSF_EXPLICIT_TAGS; - } - break; - - case 20: + ; + break;} +case 19: #line 423 "asn1p_y.y" - { +{ yyval.a_module_flags = MSF_IMPLICIT_TAGS; - } - break; - - case 21: + ; + break;} +case 20: #line 426 "asn1p_y.y" - { +{ yyval.a_module_flags = MSF_AUTOMATIC_TAGS; - } - break; - - case 22: + ; + break;} +case 21: #line 429 "asn1p_y.y" - { +{ yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED; - } - break; - - case 23: + ; + break;} +case 22: #line 438 "asn1p_y.y" - { yyval.a_module = 0; } - break; - - case 24: +{ yyval.a_module = 0; ; + break;} +case 23: #line 439 "asn1p_y.y" - { +{ assert(yyvsp[0].a_module); yyval.a_module = yyvsp[0].a_module; - } - break; - - case 25: + ; + break;} +case 24: #line 449 "asn1p_y.y" - { +{ yyval.a_module = yyvsp[0].a_module; - } - break; - - case 26: + ; + break;} +case 25: #line 452 "asn1p_y.y" - { +{ yyval.a_module = yyvsp[-1].a_module; #ifdef MY_IMPORT @@ -1906,19 +1495,17 @@ yyparse (YYPARSE_PARAM_ARG) MY_IMPORT(members, next); #undef MY_IMPORT - } - break; - - case 27: + ; + break;} +case 26: #line 479 "asn1p_y.y" - { +{ yyval.a_module = yyvsp[0].a_module; - } - break; - - case 28: + ; + break;} +case 27: #line 482 "asn1p_y.y" - { +{ yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); if(yyvsp[0].a_xports) { @@ -1926,280 +1513,250 @@ yyparse (YYPARSE_PARAM_ARG) } else { /* "EXPORTS ALL;" ? */ } - } - break; - - case 29: + ; + break;} +case 28: #line 491 "asn1p_y.y" - { +{ yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID); assert(yyvsp[0].a_expr->meta_type != AMT_INVALID); TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); - } - break; - - case 30: + ; + break;} +case 29: #line 498 "asn1p_y.y" - { +{ yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID); assert(yyvsp[0].a_expr->meta_type != AMT_INVALID); TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); - } - break; - - case 31: + ; + break;} +case 30: #line 511 "asn1p_y.y" - { +{ yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID); assert(yyvsp[0].a_expr->meta_type != AMT_INVALID); TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); - } - break; - - case 32: + ; + break;} +case 31: #line 522 "asn1p_y.y" - { +{ return yyerror( "Attempt to redefine a standard basic type, " "use -ftypesXY to switch back " "to older version of ASN.1 standard"); - } - break; - - case 33: + ; + break;} +case 32: #line 536 "asn1p_y.y" - { +{ yyval.a_module = yyvsp[-1].a_module; - } - break; - - case 34: + ; + break;} +case 33: #line 542 "asn1p_y.y" - { +{ return yyerror("Empty IMPORTS list"); - } - break; - - case 35: + ; + break;} +case 34: #line 548 "asn1p_y.y" - { +{ yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); - } - break; - - case 36: + ; + break;} +case 35: #line 553 "asn1p_y.y" - { +{ yyval.a_module = yyvsp[-1].a_module; TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); - } - break; - - case 37: + ; + break;} +case 36: #line 560 "asn1p_y.y" - { +{ yyval.a_xports = yyvsp[-3].a_xports; yyval.a_xports->from = yyvsp[-1].tv_str; yyval.a_xports->from_oid = yyvsp[0].a_oid; checkmem(yyval.a_xports); - } - break; - - case 38: + ; + break;} +case 37: #line 569 "asn1p_y.y" - { +{ yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - } - break; - - case 39: + ; + break;} +case 38: #line 574 "asn1p_y.y" - { +{ yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - } - break; - - case 40: + ; + break;} +case 39: #line 581 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_REFERENCE; - } - break; - - case 41: + ; + break;} +case 40: #line 587 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_REFERENCE; - } - break; - - case 42: + ; + break;} +case 41: #line 596 "asn1p_y.y" - { +{ yyval.a_xports = yyvsp[-1].a_xports; - } - break; - - case 43: + ; + break;} +case 42: #line 599 "asn1p_y.y" - { +{ yyval.a_xports = 0; - } - break; - - case 44: + ; + break;} +case 43: #line 602 "asn1p_y.y" - { +{ /* Empty EXPORTS clause effectively prohibits export. */ yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); - } - break; - - case 45: + ; + break;} +case 44: #line 610 "asn1p_y.y" - { +{ yyval.a_xports = asn1p_xports_new(); assert(yyval.a_xports); TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - } - break; - - case 46: + ; + break;} +case 45: #line 615 "asn1p_y.y" - { +{ yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - } - break; - - case 47: + ; + break;} +case 46: #line 622 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_EXPORTVAR; - } - break; - - case 48: + ; + break;} +case 47: #line 628 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_EXPORTVAR; - } - break; - - case 49: + ; + break;} +case 48: #line 638 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-4].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-5].tv_str; yyval.a_expr->meta_type = AMT_VALUESET; // take care of optValueSetBody - } - break; - - case 50: + ; + break;} +case 49: #line 648 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->reference = yyvsp[0].a_ref; yyval.a_expr->expr_type = A1TC_REFERENCE; yyval.a_expr->meta_type = AMT_TYPEREF; - } - break; - - case 51: + ; + break;} +case 50: #line 655 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = yyvsp[0].a_type; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 52: + ; + break;} +case 51: #line 664 "asn1p_y.y" - { } - break; - - case 53: +{ ; + break;} +case 52: #line 665 "asn1p_y.y" - { - } - break; - - case 54: +{ + ; + break;} +case 53: #line 681 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->tag = yyvsp[-1].a_tag; yyval.a_expr->expr_type = A1TC_TYPEID; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 55: + ; + break;} +case 54: #line 689 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->tag = yyvsp[-1].a_tag; assert(yyval.a_expr->expr_type); assert(yyval.a_expr->meta_type); - } - break; - - case 56: + ; + break;} +case 55: #line 696 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; assert(yyval.a_expr->expr_type == A1TC_CLASSDEF); assert(yyval.a_expr->meta_type == AMT_OBJECT); - } - break; - - case 57: + ; + break;} +case 56: #line 713 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-5].tv_str; yyval.a_expr->params = yyvsp[-3].a_plist; yyval.a_expr->meta_type = AMT_PARAMTYPE; - } - break; - - case 58: + ; + break;} +case 57: #line 723 "asn1p_y.y" - { +{ int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); checkmem(yyval.a_plist); @@ -2207,168 +1764,150 @@ yyparse (YYPARSE_PARAM_ARG) checkmem(ret == 0); if(yyvsp[0].a_parg.governor) asn1p_ref_free(yyvsp[0].a_parg.governor); if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument); - } - break; - - case 59: + ; + break;} +case 58: #line 732 "asn1p_y.y" - { +{ int ret; yyval.a_plist = yyvsp[-2].a_plist; ret = asn1p_paramlist_add_param(yyval.a_plist, yyvsp[0].a_parg.governor, yyvsp[0].a_parg.argument); checkmem(ret == 0); if(yyvsp[0].a_parg.governor) asn1p_ref_free(yyvsp[0].a_parg.governor); if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument); - } - break; - - case 60: + ; + break;} +case 59: #line 743 "asn1p_y.y" - { +{ yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; - } - break; - - case 61: + ; + break;} +case 60: #line 747 "asn1p_y.y" - { +{ int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); ret = asn1p_ref_add_component(yyval.a_parg.governor, yyvsp[-2].tv_str, 0); checkmem(ret == 0); yyval.a_parg.argument = yyvsp[0].tv_str; - } - break; - - case 62: + ; + break;} +case 61: #line 754 "asn1p_y.y" - { +{ int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); ret = asn1p_ref_add_component(yyval.a_parg.governor, ASN_EXPR_TYPE2STR(yyvsp[-2].a_type), 1); checkmem(ret == 0); yyval.a_parg.argument = yyvsp[0].tv_str; - } - break; - - case 63: + ; + break;} +case 62: #line 765 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 64: + ; + break;} +case 63: #line 770 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 65: + ; + break;} +case 64: #line 777 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[0].a_expr; - } - break; - - case 66: + ; + break;} +case 65: #line 780 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_REFERENCE; yyval.a_expr->meta_type = AMT_VALUE; - } - break; - - case 67: + ; + break;} +case 66: #line 793 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 68: + ; + break;} +case 67: #line 798 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 69: + ; + break;} +case 68: #line 805 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); yyval.a_expr->with_syntax = yyvsp[0].a_wsynt; assert(yyval.a_expr->expr_type == A1TC_CLASSDEF); assert(yyval.a_expr->meta_type == AMT_OBJECT); - } - break; - - case 70: + ; + break;} +case 69: #line 815 "asn1p_y.y" - { yyval.a_int = 0; } - break; - - case 71: +{ yyval.a_int = 0; ; + break;} +case 70: #line 816 "asn1p_y.y" - { yyval.a_int = 1; } - break; - - case 72: +{ yyval.a_int = 1; ; + break;} +case 71: #line 820 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_CLASSDEF; yyval.a_expr->meta_type = AMT_OBJECT; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 73: + ; + break;} +case 72: #line 827 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 74: + ; + break;} +case 73: #line 834 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[-1].a_refcomp.name; yyval.a_expr->expr_type = A1TC_CLASSFIELD; yyval.a_expr->meta_type = AMT_OBJECTFIELD; yyval.a_expr->marker = yyvsp[0].a_marker; - } - break; - - case 75: + ; + break;} +case 74: #line 842 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-1].a_expr; yyval.a_expr->Identifier = yyvsp[-2].a_refcomp.name; yyval.a_expr->unique = yyvsp[0].a_int; - } - break; - - case 76: + ; + break;} +case 75: #line 847 "asn1p_y.y" - { +{ int ret; yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2382,59 +1921,51 @@ yyparse (YYPARSE_PARAM_ARG) yyval.a_expr->meta_type = AMT_OBJECTFIELD; yyval.a_expr->marker = yyvsp[-1].a_marker; yyval.a_expr->unique = yyvsp[0].a_int; - } - break; - - case 77: + ; + break;} +case 76: #line 865 "asn1p_y.y" - { yyval.a_wsynt = 0; } - break; - - case 78: +{ yyval.a_wsynt = 0; ; + break;} +case 77: #line 866 "asn1p_y.y" - { +{ yyval.a_wsynt = yyvsp[0].a_wsynt; - } - break; - - case 79: + ; + break;} +case 78: #line 873 "asn1p_y.y" - { asn1p_lexer_hack_enable_with_syntax(); } - break; - - case 80: +{ asn1p_lexer_hack_enable_with_syntax(); ; + break;} +case 79: #line 875 "asn1p_y.y" - { +{ yyval.a_wsynt = yyvsp[-1].a_wsynt; - } - break; - - case 81: + ; + break;} +case 80: #line 881 "asn1p_y.y" - { +{ yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); - } - break; - - case 82: + ; + break;} +case 81: #line 885 "asn1p_y.y" - { +{ yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); - } - break; - - case 83: + ; + break;} +case 82: #line 892 "asn1p_y.y" - { +{ yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); - } - break; - - case 84: + ; + break;} +case 83: #line 895 "asn1p_y.y" - { +{ asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -2442,50 +1973,45 @@ yyparse (YYPARSE_PARAM_ARG) ret = asn1p_ref_add_component(ref, yyvsp[0].a_refcomp.name, yyvsp[0].a_refcomp.lex_type); checkmem(ret == 0); yyval.a_wchunk = asn1p_wsyntx_chunk_fromref(ref, 0); - } - break; - - case 85: + ; + break;} +case 84: #line 921 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-1].tv_nametag.name; yyval.a_expr->tag = yyvsp[-1].tv_nametag.tag; - } - break; - - case 86: + ; + break;} +case 85: #line 927 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[0].a_expr; - } - break; - - case 87: + ; + break;} +case 86: #line 933 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-2].a_expr; yyval.a_expr->constraints = yyvsp[-1].a_constr; yyval.a_expr->marker = yyvsp[0].a_marker; - } - break; - - case 88: + ; + break;} +case 87: #line 941 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); checkmem(yyval.a_expr->Identifier); yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 89: + ; + break;} +case 88: #line 949 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); @@ -2493,12 +2019,11 @@ yyparse (YYPARSE_PARAM_ARG) yyval.a_expr->value = yyvsp[0].a_value; yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 90: + ; + break;} +case 89: #line 958 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); @@ -2506,38 +2031,34 @@ yyparse (YYPARSE_PARAM_ARG) checkmem(yyval.a_expr->Identifier); yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 91: + ; + break;} +case 90: #line 970 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[0].a_expr; - } - break; - - case 92: + ; + break;} +case 91: #line 973 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = yyvsp[0].a_type; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 93: + ; + break;} +case 92: #line 979 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[0].a_expr; checkmem(yyval.a_expr); assert(yyval.a_expr->meta_type); - } - break; - - case 94: + ; + break;} +case 93: #line 987 "asn1p_y.y" - { +{ int ret; yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == 0); @@ -2550,46 +2071,42 @@ yyparse (YYPARSE_PARAM_ARG) free(yyvsp[-3].tv_str); yyval.a_expr->expr_type = A1TC_PARAMETRIZED; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 95: + ; + break;} +case 94: #line 1011 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->reference = yyvsp[0].a_ref; yyval.a_expr->expr_type = A1TC_REFERENCE; yyval.a_expr->meta_type = AMT_TYPEREF; - } - break; - - case 96: + ; + break;} +case 95: #line 1018 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->reference = yyvsp[0].a_ref; yyval.a_expr->expr_type = A1TC_INSTANCE; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 97: + ; + break;} +case 96: #line 1033 "asn1p_y.y" - { +{ int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_UNKNOWN); checkmem(ret == 0); free(yyvsp[0].tv_str); - } - break; - - case 98: + ; + break;} +case 97: #line 1041 "asn1p_y.y" - { +{ int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); @@ -2598,12 +2115,11 @@ yyparse (YYPARSE_PARAM_ARG) ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_UNKNOWN); checkmem(ret == 0); free(yyvsp[-2].tv_str); - } - break; - - case 99: + ; + break;} +case 98: #line 1051 "asn1p_y.y" - { +{ int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); @@ -2612,24 +2128,22 @@ yyparse (YYPARSE_PARAM_ARG) ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_lowercase); checkmem(ret == 0); free(yyvsp[-2].tv_str); - } - break; - - case 100: + ; + break;} +case 99: #line 1061 "asn1p_y.y" - { +{ int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_CAPITALS); free(yyvsp[0].tv_str); checkmem(ret == 0); - } - break; - - case 101: + ; + break;} +case 100: #line 1069 "asn1p_y.y" - { +{ int ret; yyval.a_ref = yyvsp[0].a_ref; ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[-2].tv_str, RLT_CAPITALS); @@ -2647,114 +2161,101 @@ yyparse (YYPARSE_PARAM_ARG) * (yyval.a_ref->comp_count - 1)); yyval.a_ref->components[0] = tmp_comp; } - } - break; - - case 102: + ; + break;} +case 101: #line 1091 "asn1p_y.y" - { +{ int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].a_refcomp.name, yyvsp[0].a_refcomp.lex_type); free(yyvsp[0].a_refcomp.name); checkmem(ret == 0); - } - break; - - case 103: + ; + break;} +case 102: #line 1099 "asn1p_y.y" - { +{ int ret; yyval.a_ref = yyvsp[-2].a_ref; ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].a_refcomp.name, yyvsp[0].a_refcomp.lex_type); free(yyvsp[0].a_refcomp.name); checkmem(ret == 0); - } - break; - - case 106: + ; + break;} +case 105: #line 1113 "asn1p_y.y" - { +{ yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; - } - break; - - case 107: + ; + break;} +case 106: #line 1118 "asn1p_y.y" - { +{ yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; - } - break; - - case 108: + ; + break;} +case 107: #line 1131 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->value = yyvsp[0].a_value; - } - break; - - case 109: + ; + break;} +case 108: #line 1141 "asn1p_y.y" - { asn1p_lexer_hack_push_opaque_state(); } - break; - - case 110: +{ asn1p_lexer_hack_push_opaque_state(); ; + break;} +case 109: #line 1142 "asn1p_y.y" - { +{ yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); yyval.a_value->type = ATV_UNPARSED; - } - break; - - case 111: + ; + break;} +case 110: #line 1147 "asn1p_y.y" - { +{ yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); - } - break; - - case 112: + ; + break;} +case 111: #line 1151 "asn1p_y.y" - { +{ yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); - } - break; - - case 113: + ; + break;} +case 112: #line 1155 "asn1p_y.y" - { +{ yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); - } - break; - - case 114: + ; + break;} +case 113: #line 1159 "asn1p_y.y" - { +{ yyval.a_value = yyvsp[0].a_value; - } - break; - - case 115: + ; + break;} +case 114: #line 1162 "asn1p_y.y" - { +{ yyval.a_value = yyvsp[0].a_value; - } - break; - - case 116: + ; + break;} +case 115: #line 1168 "asn1p_y.y" - { +{ asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -2764,12 +2265,11 @@ yyparse (YYPARSE_PARAM_ARG) yyval.a_value = asn1p_value_fromref(ref, 0); checkmem(yyval.a_value); free(yyvsp[0].tv_str); - } - break; - - case 117: + ; + break;} +case 116: #line 1179 "asn1p_y.y" - { +{ asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -2782,12 +2282,11 @@ yyparse (YYPARSE_PARAM_ARG) checkmem(yyval.a_value); free(yyvsp[-2].tv_str); free(yyvsp[0].tv_str); - } - break; - - case 118: + ; + break;} +case 117: #line 1196 "asn1p_y.y" - { +{ yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 2; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); checkmem(yyval.tv_opaque.buf); @@ -2796,12 +2295,11 @@ yyparse (YYPARSE_PARAM_ARG) memcpy(yyval.tv_opaque.buf + 2, yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len); yyval.tv_opaque.buf[yyval.tv_opaque.len] = '\0'; free(yyvsp[0].tv_opaque.buf); - } - break; - - case 119: + ; + break;} +case 118: #line 1206 "asn1p_y.y" - { +{ int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); checkmem(p); @@ -2812,97 +2310,80 @@ yyparse (YYPARSE_PARAM_ARG) free(yyvsp[0].tv_opaque.buf); yyval.tv_opaque.buf = p; yyval.tv_opaque.len = newsize; - } - break; - - case 120: + ; + break;} +case 119: #line 1221 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_BOOLEAN; } - break; - - case 121: +{ yyval.a_type = ASN_BASIC_BOOLEAN; ; + break;} +case 120: #line 1222 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_NULL; } - break; - - case 122: +{ yyval.a_type = ASN_BASIC_NULL; ; + break;} +case 121: #line 1223 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_REAL; } - break; - - case 123: +{ yyval.a_type = ASN_BASIC_REAL; ; + break;} +case 122: #line 1224 "asn1p_y.y" - { yyval.a_type = yyvsp[0].a_type; } - break; - - case 124: +{ yyval.a_type = yyvsp[0].a_type; ; + break;} +case 123: #line 1225 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_OCTET_STRING; } - break; - - case 125: +{ yyval.a_type = ASN_BASIC_OCTET_STRING; ; + break;} +case 124: #line 1226 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; } - break; - - case 126: +{ yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; + break;} +case 125: #line 1227 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_RELATIVE_OID; } - break; - - case 127: +{ yyval.a_type = ASN_BASIC_RELATIVE_OID; ; + break;} +case 126: #line 1228 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_EXTERNAL; } - break; - - case 128: +{ yyval.a_type = ASN_BASIC_EXTERNAL; ; + break;} +case 127: #line 1229 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; } - break; - - case 129: +{ yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; + break;} +case 128: #line 1230 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_CHARACTER_STRING; } - break; - - case 130: +{ yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; + break;} +case 129: #line 1231 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_UTCTime; } - break; - - case 131: +{ yyval.a_type = ASN_BASIC_UTCTime; ; + break;} +case 130: #line 1232 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_GeneralizedTime; } - break; - - case 132: +{ yyval.a_type = ASN_BASIC_GeneralizedTime; ; + break;} +case 131: #line 1239 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_INTEGER; } - break; - - case 133: +{ yyval.a_type = ASN_BASIC_INTEGER; ; + break;} +case 132: #line 1240 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_ENUMERATED; } - break; - - case 134: +{ yyval.a_type = ASN_BASIC_ENUMERATED; ; + break;} +case 133: #line 1241 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_BIT_STRING; } - break; - - case 135: +{ yyval.a_type = ASN_BASIC_BIT_STRING; ; + break;} +case 134: #line 1245 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = yyvsp[0].a_type; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 136: + ; + break;} +case 135: #line 1251 "asn1p_y.y" - { +{ if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; } else { @@ -2911,158 +2392,137 @@ yyparse (YYPARSE_PARAM_ARG) } yyval.a_expr->expr_type = yyvsp[-1].a_type; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 137: + ; + break;} +case 136: #line 1264 "asn1p_y.y" - { yyval.a_type = ASN_STRING_BMPString; } - break; - - case 138: +{ yyval.a_type = ASN_STRING_BMPString; ; + break;} +case 137: #line 1265 "asn1p_y.y" - { +{ yyval.a_type = ASN_STRING_GeneralString; return yyerror("GeneralString is not supported"); - } - break; - - case 139: + ; + break;} +case 138: #line 1269 "asn1p_y.y" - { +{ yyval.a_type = ASN_STRING_GraphicString; return yyerror("GraphicString is not supported"); - } - break; - - case 140: + ; + break;} +case 139: #line 1273 "asn1p_y.y" - { yyval.a_type = ASN_STRING_IA5String; } - break; - - case 141: +{ yyval.a_type = ASN_STRING_IA5String; ; + break;} +case 140: #line 1274 "asn1p_y.y" - { yyval.a_type = ASN_STRING_ISO646String; } - break; - - case 142: +{ yyval.a_type = ASN_STRING_ISO646String; ; + break;} +case 141: #line 1275 "asn1p_y.y" - { yyval.a_type = ASN_STRING_NumericString; } - break; - - case 143: +{ yyval.a_type = ASN_STRING_NumericString; ; + break;} +case 142: #line 1276 "asn1p_y.y" - { yyval.a_type = ASN_STRING_PrintableString; } - break; - - case 144: +{ yyval.a_type = ASN_STRING_PrintableString; ; + break;} +case 143: #line 1277 "asn1p_y.y" - { +{ yyval.a_type = ASN_STRING_T61String; return yyerror("T61String not implemented yet"); - } - break; - - case 145: + ; + break;} +case 144: #line 1281 "asn1p_y.y" - { yyval.a_type = ASN_STRING_TeletexString; } - break; - - case 146: +{ yyval.a_type = ASN_STRING_TeletexString; ; + break;} +case 145: #line 1282 "asn1p_y.y" - { yyval.a_type = ASN_STRING_UniversalString; } - break; - - case 147: +{ yyval.a_type = ASN_STRING_UniversalString; ; + break;} +case 146: #line 1283 "asn1p_y.y" - { yyval.a_type = ASN_STRING_UTF8String; } - break; - - case 148: +{ yyval.a_type = ASN_STRING_UTF8String; ; + break;} +case 147: #line 1284 "asn1p_y.y" - { +{ yyval.a_type = ASN_STRING_VideotexString; return yyerror("VideotexString is no longer supported"); - } - break; - - case 149: + ; + break;} +case 148: #line 1288 "asn1p_y.y" - { yyval.a_type = ASN_STRING_VisibleString; } - break; - - case 150: +{ yyval.a_type = ASN_STRING_VisibleString; ; + break;} +case 149: #line 1289 "asn1p_y.y" - { yyval.a_type = ASN_STRING_ObjectDescriptor; } - break; - - case 151: +{ yyval.a_type = ASN_STRING_ObjectDescriptor; ; + break;} +case 150: #line 1293 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); yyval.a_expr->expr_type = ASN_CONSTR_CHOICE; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 152: + ; + break;} +case 151: #line 1299 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 153: + ; + break;} +case 152: #line 1305 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); yyval.a_expr->expr_type = ASN_CONSTR_SET; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 154: + ; + break;} +case 153: #line 1311 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->constraints = yyvsp[-2].a_constr; yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE_OF; yyval.a_expr->meta_type = AMT_TYPE; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 155: + ; + break;} +case 154: #line 1319 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->constraints = yyvsp[-2].a_constr; yyval.a_expr->expr_type = ASN_CONSTR_SET_OF; yyval.a_expr->meta_type = AMT_TYPE; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 156: + ; + break;} +case 155: #line 1327 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = ASN_CONSTR_ANY; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 157: + ; + break;} +case 156: #line 1333 "asn1p_y.y" - { +{ int ret; yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3072,22 +2532,19 @@ yyparse (YYPARSE_PARAM_ARG) checkmem(ret == 0); yyval.a_expr->expr_type = ASN_CONSTR_ANY; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 158: + ; + break;} +case 157: #line 1350 "asn1p_y.y" - { yyval.a_constr = 0; } - break; - - case 159: +{ yyval.a_constr = 0; ; + break;} +case 158: #line 1351 "asn1p_y.y" - { yyval.a_constr = yyvsp[0].a_constr; } - break; - - case 165: +{ yyval.a_constr = yyvsp[0].a_constr; ; + break;} +case 164: #line 1359 "asn1p_y.y" - { +{ /* * This is a special case, for compatibility purposes. * It goes without parenthesis. @@ -3098,212 +2555,185 @@ yyparse (YYPARSE_PARAM_ARG) yyval.a_constr->type = ACT_CT_SIZE; ret = asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr); checkmem(ret == 0); - } - break; - - case 166: + ; + break;} +case 165: #line 1371 "asn1p_y.y" - { +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); - } - break; - - case 167: + ; + break;} +case 166: #line 1374 "asn1p_y.y" - { +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-1].a_constr, yyvsp[0].a_constr); - } - break; - - case 168: + ; + break;} +case 167: #line 1380 "asn1p_y.y" - { +{ yyval.a_constr = yyvsp[-1].a_constr; - } - break; - - case 169: + ; + break;} +case 168: #line 1386 "asn1p_y.y" - { +{ yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 170: + ; + break;} +case 169: #line 1389 "asn1p_y.y" - { +{ asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); checkmem(ct); ct->type = ACT_EL_EXT; CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); - } - break; - - case 171: + ; + break;} +case 170: #line 1396 "asn1p_y.y" - { +{ asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); checkmem(ct); ct->type = ACT_EL_EXT; CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-4].a_constr, ct); - CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-4].a_constr, yyvsp[0].a_constr); - } - break; - - case 172: -#line 1404 "asn1p_y.y" - { + ct = yyval.a_constr; + CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, ct, yyvsp[0].a_constr); + ; + break;} +case 171: +#line 1405 "asn1p_y.y" +{ yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_EXT; - } - break; - - case 173: -#line 1409 "asn1p_y.y" - { + ; + break;} +case 172: +#line 1410 "asn1p_y.y" +{ asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); checkmem(ct); ct->type = ACT_EL_EXT; CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, ct, yyvsp[0].a_constr); - } - break; - - case 174: -#line 1418 "asn1p_y.y" - { yyval.a_constr = yyvsp[0].a_constr; } - break; - - case 175: -#line 1421 "asn1p_y.y" - { yyval.a_constr = yyvsp[0].a_constr; } - break; - - case 176: + ; + break;} +case 173: +#line 1419 "asn1p_y.y" +{ yyval.a_constr = yyvsp[0].a_constr; ; + break;} +case 174: #line 1422 "asn1p_y.y" - { +{ yyval.a_constr = yyvsp[0].a_constr; ; + break;} +case 175: +#line 1423 "asn1p_y.y" +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); - } - break; - - case 177: -#line 1428 "asn1p_y.y" - { yyval.a_constr = yyvsp[0].a_constr; } - break; - - case 178: -#line 1430 "asn1p_y.y" - { + ; + break;} +case 176: +#line 1429 "asn1p_y.y" +{ yyval.a_constr = yyvsp[0].a_constr; ; + break;} +case 177: +#line 1431 "asn1p_y.y" +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); - } - break; - - case 179: -#line 1436 "asn1p_y.y" - { yyval.a_constr = yyvsp[0].a_constr; } - break; - - case 180: + ; + break;} +case 178: #line 1437 "asn1p_y.y" - { +{ yyval.a_constr = yyvsp[0].a_constr; ; + break;} +case 179: +#line 1438 "asn1p_y.y" +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); - } - break; - - case 181: -#line 1443 "asn1p_y.y" - { + ; + break;} +case 180: +#line 1444 "asn1p_y.y" +{ yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_VALUE; yyval.a_constr->value = yyvsp[0].a_value; - } - break; - - case 182: -#line 1449 "asn1p_y.y" - { + ; + break;} +case 181: +#line 1450 "asn1p_y.y" +{ yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-1].a_ctype; yyval.a_constr->range_start = yyvsp[-2].a_value; yyval.a_constr->range_stop = yyvsp[0].a_value; - } - break; - - case 183: -#line 1456 "asn1p_y.y" - { + ; + break;} +case 182: +#line 1457 "asn1p_y.y" +{ int ret; yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-3].a_ctype; ret = asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr); checkmem(ret == 0); - } - break; - - case 184: -#line 1464 "asn1p_y.y" - { + ; + break;} +case 183: +#line 1465 "asn1p_y.y" +{ yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 185: -#line 1467 "asn1p_y.y" - { + ; + break;} +case 184: +#line 1468 "asn1p_y.y" +{ yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 186: -#line 1473 "asn1p_y.y" - { yyval.a_ctype = ACT_EL_RANGE; } - break; - - case 187: + ; + break;} +case 185: #line 1474 "asn1p_y.y" - { yyval.a_ctype = ACT_EL_RLRANGE; } - break; - - case 188: +{ yyval.a_ctype = ACT_EL_RANGE; ; + break;} +case 186: #line 1475 "asn1p_y.y" - { yyval.a_ctype = ACT_EL_LLRANGE; } - break; - - case 189: +{ yyval.a_ctype = ACT_EL_RLRANGE; ; + break;} +case 187: #line 1476 "asn1p_y.y" - { yyval.a_ctype = ACT_EL_ULRANGE; } - break; - - case 190: -#line 1480 "asn1p_y.y" - { +{ yyval.a_ctype = ACT_EL_LLRANGE; ; + break;} +case 188: +#line 1477 "asn1p_y.y" +{ yyval.a_ctype = ACT_EL_ULRANGE; ; + break;} +case 189: +#line 1481 "asn1p_y.y" +{ yyval.a_ctype = ACT_CT_SIZE; - } - break; - - case 191: -#line 1483 "asn1p_y.y" - { + ; + break;} +case 190: +#line 1484 "asn1p_y.y" +{ yyval.a_ctype = ACT_CT_FROM; - } - break; - - case 192: -#line 1489 "asn1p_y.y" - { + ; + break;} +case 191: +#line 1490 "asn1p_y.y" +{ yyval.a_value = yyvsp[0].a_value; - } - break; - - case 193: -#line 1492 "asn1p_y.y" - { + ; + break;} +case 192: +#line 1493 "asn1p_y.y" +{ asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -3313,142 +2743,124 @@ yyparse (YYPARSE_PARAM_ARG) yyval.a_value = asn1p_value_fromref(ref, 0); checkmem(yyval.a_value); free(yyvsp[0].tv_str); - } - break; - - case 194: -#line 1503 "asn1p_y.y" - { + ; + break;} +case 193: +#line 1504 "asn1p_y.y" +{ yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); - } - break; - - case 195: -#line 1507 "asn1p_y.y" - { + ; + break;} +case 194: +#line 1508 "asn1p_y.y" +{ yyval.a_value = asn1p_value_fromint(123); checkmem(yyval.a_value); yyval.a_value->type = ATV_MIN; - } - break; - - case 196: -#line 1512 "asn1p_y.y" - { + ; + break;} +case 195: +#line 1513 "asn1p_y.y" +{ yyval.a_value = asn1p_value_fromint(321); checkmem(yyval.a_value); yyval.a_value->type = ATV_MAX; - } - break; - - case 197: -#line 1517 "asn1p_y.y" - { + ; + break;} +case 196: +#line 1518 "asn1p_y.y" +{ yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_FALSE; - } - break; - - case 198: -#line 1522 "asn1p_y.y" - { + ; + break;} +case 197: +#line 1523 "asn1p_y.y" +{ yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); yyval.a_value->type = ATV_TRUE; - } - break; - - case 199: -#line 1530 "asn1p_y.y" - { + ; + break;} +case 198: +#line 1531 "asn1p_y.y" +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); - } - break; - - case 200: -#line 1536 "asn1p_y.y" - { + ; + break;} +case 199: +#line 1537 "asn1p_y.y" +{ yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 201: -#line 1539 "asn1p_y.y" - { + ; + break;} +case 200: +#line 1540 "asn1p_y.y" +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); - } - break; - - case 202: -#line 1545 "asn1p_y.y" - { + ; + break;} +case 201: +#line 1546 "asn1p_y.y" +{ yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_EXT; - } - break; - - case 203: -#line 1550 "asn1p_y.y" - { + ; + break;} +case 202: +#line 1551 "asn1p_y.y" +{ yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_VALUE; yyval.a_constr->value = asn1p_value_frombuf(yyvsp[-2].tv_str, strlen(yyvsp[-2].tv_str), 0); yyval.a_constr->presence = yyvsp[0].a_pres; - } - break; - - case 204: -#line 1563 "asn1p_y.y" - { yyval.a_pres = ACPRES_DEFAULT; } - break; - - case 205: + ; + break;} +case 203: #line 1564 "asn1p_y.y" - { yyval.a_pres = yyvsp[0].a_pres; } - break; - - case 206: -#line 1568 "asn1p_y.y" - { +{ yyval.a_pres = ACPRES_DEFAULT; ; + break;} +case 204: +#line 1565 "asn1p_y.y" +{ yyval.a_pres = yyvsp[0].a_pres; ; + break;} +case 205: +#line 1569 "asn1p_y.y" +{ yyval.a_pres = ACPRES_PRESENT; - } - break; - - case 207: -#line 1571 "asn1p_y.y" - { + ; + break;} +case 206: +#line 1572 "asn1p_y.y" +{ yyval.a_pres = ACPRES_ABSENT; - } - break; - - case 208: -#line 1574 "asn1p_y.y" - { + ; + break;} +case 207: +#line 1575 "asn1p_y.y" +{ yyval.a_pres = ACPRES_OPTIONAL; - } - break; - - case 209: -#line 1580 "asn1p_y.y" - { + ; + break;} +case 208: +#line 1581 "asn1p_y.y" +{ yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 210: -#line 1583 "asn1p_y.y" - { + ; + break;} +case 209: +#line 1584 "asn1p_y.y" +{ yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 211: -#line 1592 "asn1p_y.y" - { + ; + break;} +case 210: +#line 1593 "asn1p_y.y" +{ asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; int ret; @@ -3459,41 +2871,37 @@ yyparse (YYPARSE_PARAM_ARG) ct->type = ACT_EL_VALUE; ct->value = asn1p_value_fromref(ref, 0); CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, ct, 0); - } - break; - - case 212: -#line 1607 "asn1p_y.y" - { + ; + break;} +case 211: +#line 1608 "asn1p_y.y" +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); - } - break; - - case 213: -#line 1613 "asn1p_y.y" - { + ; + break;} +case 212: +#line 1614 "asn1p_y.y" +{ yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_VALUE; yyval.a_constr->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); - } - break; - - case 214: -#line 1619 "asn1p_y.y" - { + ; + break;} +case 213: +#line 1620 "asn1p_y.y" +{ asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); checkmem(ct); ct->type = ACT_EL_VALUE; ct->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); - } - break; - - case 215: -#line 1633 "asn1p_y.y" - { + ; + break;} +case 214: +#line 1634 "asn1p_y.y" +{ char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; *p = '@'; @@ -3503,12 +2911,11 @@ yyparse (YYPARSE_PARAM_ARG) checkmem(ret == 0); free(p); free(yyvsp[0].tv_str); - } - break; - - case 216: -#line 1644 "asn1p_y.y" - { + ; + break;} +case 215: +#line 1645 "asn1p_y.y" +{ char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; p[0] = '@'; @@ -3519,19 +2926,17 @@ yyparse (YYPARSE_PARAM_ARG) checkmem(ret == 0); free(p); free(yyvsp[0].tv_str); - } - break; - - case 217: -#line 1660 "asn1p_y.y" - { + ; + break;} +case 216: +#line 1661 "asn1p_y.y" +{ yyval.tv_str = yyvsp[0].tv_str; - } - break; - - case 218: -#line 1663 "asn1p_y.y" - { + ; + break;} +case 217: +#line 1664 "asn1p_y.y" +{ int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); yyval.tv_str = malloc(l1 + 1 + l3 + 1); @@ -3539,469 +2944,437 @@ yyparse (YYPARSE_PARAM_ARG) yyval.tv_str[l1] = '.'; memcpy(yyval.tv_str + l1 + 1, yyvsp[0].tv_str, l3); yyval.tv_str[l1 + 1 + l3] = '\0'; - } - break; - - case 219: -#line 1681 "asn1p_y.y" - { yyval.a_marker = EM_NOMARK; } - break; - - case 220: + ; + break;} +case 218: #line 1682 "asn1p_y.y" - { yyval.a_marker = yyvsp[0].a_marker; } - break; - - case 221: -#line 1686 "asn1p_y.y" - { +{ yyval.a_marker = EM_NOMARK; ; + break;} +case 219: +#line 1683 "asn1p_y.y" +{ yyval.a_marker = yyvsp[0].a_marker; ; + break;} +case 220: +#line 1687 "asn1p_y.y" +{ yyval.a_marker = EM_OPTIONAL; - } - break; - - case 222: -#line 1689 "asn1p_y.y" - { + ; + break;} +case 221: +#line 1690 "asn1p_y.y" +{ yyval.a_marker = EM_DEFAULT; /* FIXME: store DefaultValue somewhere */ - } - break; - - case 223: -#line 1696 "asn1p_y.y" - { - } - break; - - case 224: -#line 1698 "asn1p_y.y" - { - } - break; - - case 225: -#line 1700 "asn1p_y.y" - { asn1p_lexer_hack_push_opaque_state(); } - break; - - case 226: -#line 1700 "asn1p_y.y" - { - } - break; - - case 227: -#line 1721 "asn1p_y.y" - { + ; + break;} +case 222: +#line 1697 "asn1p_y.y" +{ + ; + break;} +case 223: +#line 1699 "asn1p_y.y" +{ + ; + break;} +case 224: +#line 1701 "asn1p_y.y" +{ asn1p_lexer_hack_push_opaque_state(); ; + break;} +case 225: +#line 1701 "asn1p_y.y" +{ + ; + break;} +case 226: +#line 1722 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); - } - break; - - case 228: -#line 1725 "asn1p_y.y" - { + ; + break;} +case 227: +#line 1726 "asn1p_y.y" +{ yyval.a_expr = yyvsp[-1].a_expr; - } - break; - - case 229: -#line 1731 "asn1p_y.y" - { + ; + break;} +case 228: +#line 1732 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 230: -#line 1736 "asn1p_y.y" - { + ; + break;} +case 229: +#line 1737 "asn1p_y.y" +{ yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 231: -#line 1743 "asn1p_y.y" - { + ; + break;} +case 230: +#line 1744 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->Identifier = yyvsp[0].tv_str; - } - break; - - case 232: -#line 1750 "asn1p_y.y" - { + ; + break;} +case 231: +#line 1751 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->value = yyvsp[-1].a_value; - } - break; - - case 233: -#line 1758 "asn1p_y.y" - { + ; + break;} +case 232: +#line 1759 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->value = yyvsp[-1].a_value; - } - break; - - case 234: -#line 1766 "asn1p_y.y" - { + ; + break;} +case 233: +#line 1767 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->value = yyvsp[0].a_value; - } - break; - - case 235: -#line 1773 "asn1p_y.y" - { + ; + break;} +case 234: +#line 1774 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); checkmem(yyval.a_expr->Identifier); yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_VALUE; - } - break; - - case 236: -#line 1784 "asn1p_y.y" - { + ; + break;} +case 235: +#line 1785 "asn1p_y.y" +{ yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); - } - break; - - case 237: -#line 1788 "asn1p_y.y" - { + ; + break;} +case 236: +#line 1789 "asn1p_y.y" +{ yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); - } - break; - - case 238: -#line 1819 "asn1p_y.y" - { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); } - break; - - case 239: + ; + break;} +case 237: #line 1820 "asn1p_y.y" - { yyval.a_tag = yyvsp[0].a_tag; } - break; - - case 240: -#line 1824 "asn1p_y.y" - { +{ memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; + break;} +case 238: +#line 1821 "asn1p_y.y" +{ yyval.a_tag = yyvsp[0].a_tag; ; + break;} +case 239: +#line 1825 "asn1p_y.y" +{ yyval.a_tag = yyvsp[0].a_tag; yyval.a_tag.tag_mode = TM_DEFAULT; - } - break; - - case 241: -#line 1828 "asn1p_y.y" - { + ; + break;} +case 240: +#line 1829 "asn1p_y.y" +{ yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_IMPLICIT; - } - break; - - case 242: -#line 1832 "asn1p_y.y" - { + ; + break;} +case 241: +#line 1833 "asn1p_y.y" +{ yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_EXPLICIT; - } - break; - - case 243: -#line 1839 "asn1p_y.y" - { + ; + break;} +case 242: +#line 1840 "asn1p_y.y" +{ checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - } - break; - - case 244: -#line 1843 "asn1p_y.y" - { + ; + break;} +case 243: +#line 1844 "asn1p_y.y" +{ checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - } - break; - - case 245: -#line 1850 "asn1p_y.y" - { + ; + break;} +case 244: +#line 1851 "asn1p_y.y" +{ checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - } - break; - - case 246: -#line 1857 "asn1p_y.y" - { + ; + break;} +case 245: +#line 1858 "asn1p_y.y" +{ checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - } - break; - - case 247: -#line 1864 "asn1p_y.y" - { + ; + break;} +case 246: +#line 1865 "asn1p_y.y" +{ memset(&yyval.tv_nametag, 0, sizeof(yyval.tv_nametag)); yyval.tv_nametag.name = yyvsp[0].tv_str; - } - break; - - case 248: -#line 1868 "asn1p_y.y" - { + ; + break;} +case 247: +#line 1869 "asn1p_y.y" +{ yyval.tv_nametag.name = yyvsp[-1].tv_str; yyval.tv_nametag.tag = yyvsp[0].a_tag; - } - break; - - - } - -/* Line 1016 of /usr/local/share/bison/yacc.c. */ -#line 3786 "asn1p_y.c" + ; + break;} +} + /* the action file gets copied in in place of this dollarsign */ +#line 543 "/usr/share/bison.simple" yyvsp -= yylen; yyssp -= yylen; +#ifdef YYLSP_NEEDED + yylsp -= yylen; +#endif - -#if YYDEBUG +#if YYDEBUG != 0 if (yydebug) { - short *yyssp1 = yyss - 1; - YYFPRINTF (stderr, "state stack now"); - while (yyssp1 != yyssp) - YYFPRINTF (stderr, " %d", *++yyssp1); - YYFPRINTF (stderr, "\n"); + short *ssp1 = yyss - 1; + fprintf (stderr, "state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); } #endif *++yyvsp = yyval; +#ifdef YYLSP_NEEDED + yylsp++; + if (yylen == 0) + { + yylsp->first_line = yylloc.first_line; + yylsp->first_column = yylloc.first_column; + yylsp->last_line = (yylsp-1)->last_line; + yylsp->last_column = (yylsp-1)->last_column; + yylsp->text = 0; + } + else + { + yylsp->last_line = (yylsp+yylen-1)->last_line; + yylsp->last_column = (yylsp+yylen-1)->last_column; + } +#endif - /* Now `shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ + /* Now "shift" the result of the reduction. + Determine what state that goes to, + based on the state we popped back to + and the rule number reduced by. */ yyn = yyr1[yyn]; - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yypgoto[yyn - YYNTBASE] + *yyssp; + if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else - yystate = yydefgoto[yyn - YYNTOKENS]; + yystate = yydefgoto[yyn - YYNTBASE]; goto yynewstate; +yyerrlab: /* here on detecting error */ -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ -yyerrlab: - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) + if (! yyerrstatus) + /* If not already recovering from an error, report this error. */ { ++yynerrs; -#if YYERROR_VERBOSE + +#ifdef YYERROR_VERBOSE yyn = yypact[yystate]; - if (YYPACT_NINF < yyn && yyn < YYLAST) + if (yyn > YYFLAG && yyn < YYLAST) { - YYSIZE_T yysize = 0; - int yytype = YYTRANSLATE (yychar); - char *yymsg; - int yyx, yycount; - - yycount = 0; - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ - for (yyx = yyn < 0 ? -yyn : 0; - yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - yysize += yystrlen (yytname[yyx]) + 15, yycount++; - yysize += yystrlen ("parse error, unexpected ") + 1; - yysize += yystrlen (yytname[yytype]); - yymsg = (char *) YYSTACK_ALLOC (yysize); - if (yymsg != 0) + int size = 0; + char *msg; + int x, count; + + count = 0; + /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ + for (x = (yyn < 0 ? -yyn : 0); + x < (ssize_t)(sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + size += strlen(yytname[x]) + 15, count++; + msg = (char *) malloc(size + 15); + if (msg != 0) { - char *yyp = yystpcpy (yymsg, "parse error, unexpected "); - yyp = yystpcpy (yyp, yytname[yytype]); + strcpy(msg, "parse error"); - if (yycount < 5) + if (count < 5) { - yycount = 0; - for (yyx = yyn < 0 ? -yyn : 0; - yyx < (int) (sizeof (yytname) / sizeof (char *)); - yyx++) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + count = 0; + for (x = (yyn < 0 ? -yyn : 0); + x < (ssize_t)(sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) { - const char *yyq = ! yycount ? ", expecting " : " or "; - yyp = yystpcpy (yyp, yyq); - yyp = yystpcpy (yyp, yytname[yyx]); - yycount++; + strcat(msg, count == 0 ? ", expecting `" : " or `"); + strcat(msg, yytname[x]); + strcat(msg, "'"); + count++; } } - yyerror (yymsg); - YYSTACK_FREE (yymsg); + yyerror(msg); + free(msg); } else - yyerror ("parse error; also virtual memory exhausted"); + yyerror ("parse error; also virtual memory exceeded"); } else #endif /* YYERROR_VERBOSE */ - yyerror ("parse error"); + yyerror("parse error"); } - goto yyerrlab1; + goto yyerrlab1; +yyerrlab1: /* here on error raised explicitly by an action */ -/*----------------------------------------------------. -| yyerrlab1 -- error raised explicitly by an action. | -`----------------------------------------------------*/ -yyerrlab1: if (yyerrstatus == 3) { - /* If just tried and failed to reuse lookahead token after an - error, discard it. */ + /* if just tried and failed to reuse lookahead token after an error, discard it. */ - /* Return failure if at end of input. */ + /* return failure if at end of input */ if (yychar == YYEOF) - { - /* Pop the error token. */ - YYPOPSTACK; - /* Pop the rest of the stack. */ - while (yyssp > yyss) - { - YYDPRINTF ((stderr, "Error: popping ")); - YYDSYMPRINT ((stderr, - yystos[*yyssp], - *yyvsp)); - YYDPRINTF ((stderr, "\n")); - yydestruct (yystos[*yyssp], *yyvsp); - YYPOPSTACK; - } - YYABORT; - } + YYABORT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); +#endif - YYDPRINTF ((stderr, "Discarding token %d (%s).\n", - yychar, yytname[yychar1])); - yydestruct (yychar1, yylval); yychar = YYEMPTY; } - /* Else will try to reuse lookahead token after shifting the error - token. */ + /* Else will try to reuse lookahead token + after shifting the error token. */ - yyerrstatus = 3; /* Each real token shifted decrements this. */ + yyerrstatus = 3; /* Each real token shifted decrements this */ - for (;;) - { - yyn = yypact[yystate]; - if (yyn != YYPACT_NINF) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } + goto yyerrhandle; - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) - YYABORT; +yyerrdefault: /* current state does not do anything special for the error token. */ - YYDPRINTF ((stderr, "Error: popping ")); - YYDSYMPRINT ((stderr, - yystos[*yyssp], *yyvsp)); - YYDPRINTF ((stderr, "\n")); +#if 0 + /* This is wrong; only states that explicitly want error tokens + should shift them. */ + yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ + if (yyn) goto yydefault; +#endif - yydestruct (yystos[yystate], *yyvsp); - yyvsp--; - yystate = *--yyssp; +yyerrpop: /* pop the current state because it cannot handle the error token */ + if (yyssp == yyss) YYABORT; + yyvsp--; + yystate = *--yyssp; +#ifdef YYLSP_NEEDED + yylsp--; +#endif -#if YYDEBUG - if (yydebug) - { - short *yyssp1 = yyss - 1; - YYFPRINTF (stderr, "Error: state stack now"); - while (yyssp1 != yyssp) - YYFPRINTF (stderr, " %d", *++yyssp1); - YYFPRINTF (stderr, "\n"); - } +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "Error: state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } #endif + +yyerrhandle: + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yyerrdefault; + + yyn += YYTERROR; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) + goto yyerrdefault; + + yyn = yytable[yyn]; + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrpop; + yyn = -yyn; + goto yyreduce; } + else if (yyn == 0) + goto yyerrpop; if (yyn == YYFINAL) YYACCEPT; - YYDPRINTF ((stderr, "Shifting error token, ")); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting error token, "); +#endif *++yyvsp = yylval; - +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif yystate = yyn; goto yynewstate; - -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; - -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; - -#ifndef yyoverflow -/*----------------------------------------------. -| yyoverflowlab -- parser overflow comes here. | -`----------------------------------------------*/ -yyoverflowlab: - yyerror ("parser stack overflow"); - yyresult = 2; - /* Fall through. */ + yyacceptlab: + /* YYACCEPT comes here. */ + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); #endif + } + return 0; -yyreturn: -#ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); + yyabortlab: + /* YYABORT comes here. */ + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); #endif - return yyresult; + } + return 1; } - - -#line 1875 "asn1p_y.y" +#line 1876 "asn1p_y.y" @@ -4111,4 +3484,3 @@ yyerror(const char *msg) { } - diff --git a/libasn1parser/asn1p_y.h b/libasn1parser/asn1p_y.h index 49ab05ab9..61679e3da 100644 --- a/libasn1parser/asn1p_y.h +++ b/libasn1parser/asn1p_y.h @@ -1,239 +1,3 @@ -/* A Bison parser, made from asn1p_y.y, by GNU bison 1.75. */ - -/* Skeleton parser for Yacc-like parsing with Bison, - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -#ifndef BISON_ASN_P_Y_H -# define BISON_ASN_P_Y_H - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - TOK_PPEQ = 258, - TOK_opaque = 259, - TOK_bstring = 260, - TOK_cstring = 261, - TOK_hstring = 262, - TOK_identifier = 263, - TOK_number = 264, - TOK_number_negative = 265, - TOK_typereference = 266, - TOK_objectclassreference = 267, - TOK_typefieldreference = 268, - TOK_valuefieldreference = 269, - TOK_ABSENT = 270, - TOK_ABSTRACT_SYNTAX = 271, - TOK_ALL = 272, - TOK_ANY = 273, - TOK_APPLICATION = 274, - TOK_AUTOMATIC = 275, - TOK_BEGIN = 276, - TOK_BIT = 277, - TOK_BMPString = 278, - TOK_BOOLEAN = 279, - TOK_BY = 280, - TOK_CHARACTER = 281, - TOK_CHOICE = 282, - TOK_CLASS = 283, - TOK_COMPONENT = 284, - TOK_COMPONENTS = 285, - TOK_CONSTRAINED = 286, - TOK_CONTAINING = 287, - TOK_DEFAULT = 288, - TOK_DEFINITIONS = 289, - TOK_DEFINED = 290, - TOK_EMBEDDED = 291, - TOK_ENCODED = 292, - TOK_END = 293, - TOK_ENUMERATED = 294, - TOK_EXPLICIT = 295, - TOK_EXPORTS = 296, - TOK_EXTENSIBILITY = 297, - TOK_EXTERNAL = 298, - TOK_FALSE = 299, - TOK_FROM = 300, - TOK_GeneralizedTime = 301, - TOK_GeneralString = 302, - TOK_GraphicString = 303, - TOK_IA5String = 304, - TOK_IDENTIFIER = 305, - TOK_IMPLICIT = 306, - TOK_IMPLIED = 307, - TOK_IMPORTS = 308, - TOK_INCLUDES = 309, - TOK_INSTANCE = 310, - TOK_INTEGER = 311, - TOK_ISO646String = 312, - TOK_MAX = 313, - TOK_MIN = 314, - TOK_MINUS_INFINITY = 315, - TOK_NULL = 316, - TOK_NumericString = 317, - TOK_OBJECT = 318, - TOK_ObjectDescriptor = 319, - TOK_OCTET = 320, - TOK_OF = 321, - TOK_OPTIONAL = 322, - TOK_PATTERN = 323, - TOK_PDV = 324, - TOK_PLUS_INFINITY = 325, - TOK_PRESENT = 326, - TOK_PrintableString = 327, - TOK_PRIVATE = 328, - TOK_REAL = 329, - TOK_RELATIVE_OID = 330, - TOK_SEQUENCE = 331, - TOK_SET = 332, - TOK_SIZE = 333, - TOK_STRING = 334, - TOK_SYNTAX = 335, - TOK_T61String = 336, - TOK_TAGS = 337, - TOK_TeletexString = 338, - TOK_TRUE = 339, - TOK_TYPE_IDENTIFIER = 340, - TOK_UNIQUE = 341, - TOK_UNIVERSAL = 342, - TOK_UniversalString = 343, - TOK_UTCTime = 344, - TOK_UTF8String = 345, - TOK_VideotexString = 346, - TOK_VisibleString = 347, - TOK_WITH = 348, - TOK_UNION = 349, - TOK_INTERSECTION = 350, - TOK_EXCEPT = 351, - TOK_TwoDots = 352, - TOK_ThreeDots = 353, - TOK_tag = 354 - }; -#endif -#define TOK_PPEQ 258 -#define TOK_opaque 259 -#define TOK_bstring 260 -#define TOK_cstring 261 -#define TOK_hstring 262 -#define TOK_identifier 263 -#define TOK_number 264 -#define TOK_number_negative 265 -#define TOK_typereference 266 -#define TOK_objectclassreference 267 -#define TOK_typefieldreference 268 -#define TOK_valuefieldreference 269 -#define TOK_ABSENT 270 -#define TOK_ABSTRACT_SYNTAX 271 -#define TOK_ALL 272 -#define TOK_ANY 273 -#define TOK_APPLICATION 274 -#define TOK_AUTOMATIC 275 -#define TOK_BEGIN 276 -#define TOK_BIT 277 -#define TOK_BMPString 278 -#define TOK_BOOLEAN 279 -#define TOK_BY 280 -#define TOK_CHARACTER 281 -#define TOK_CHOICE 282 -#define TOK_CLASS 283 -#define TOK_COMPONENT 284 -#define TOK_COMPONENTS 285 -#define TOK_CONSTRAINED 286 -#define TOK_CONTAINING 287 -#define TOK_DEFAULT 288 -#define TOK_DEFINITIONS 289 -#define TOK_DEFINED 290 -#define TOK_EMBEDDED 291 -#define TOK_ENCODED 292 -#define TOK_END 293 -#define TOK_ENUMERATED 294 -#define TOK_EXPLICIT 295 -#define TOK_EXPORTS 296 -#define TOK_EXTENSIBILITY 297 -#define TOK_EXTERNAL 298 -#define TOK_FALSE 299 -#define TOK_FROM 300 -#define TOK_GeneralizedTime 301 -#define TOK_GeneralString 302 -#define TOK_GraphicString 303 -#define TOK_IA5String 304 -#define TOK_IDENTIFIER 305 -#define TOK_IMPLICIT 306 -#define TOK_IMPLIED 307 -#define TOK_IMPORTS 308 -#define TOK_INCLUDES 309 -#define TOK_INSTANCE 310 -#define TOK_INTEGER 311 -#define TOK_ISO646String 312 -#define TOK_MAX 313 -#define TOK_MIN 314 -#define TOK_MINUS_INFINITY 315 -#define TOK_NULL 316 -#define TOK_NumericString 317 -#define TOK_OBJECT 318 -#define TOK_ObjectDescriptor 319 -#define TOK_OCTET 320 -#define TOK_OF 321 -#define TOK_OPTIONAL 322 -#define TOK_PATTERN 323 -#define TOK_PDV 324 -#define TOK_PLUS_INFINITY 325 -#define TOK_PRESENT 326 -#define TOK_PrintableString 327 -#define TOK_PRIVATE 328 -#define TOK_REAL 329 -#define TOK_RELATIVE_OID 330 -#define TOK_SEQUENCE 331 -#define TOK_SET 332 -#define TOK_SIZE 333 -#define TOK_STRING 334 -#define TOK_SYNTAX 335 -#define TOK_T61String 336 -#define TOK_TAGS 337 -#define TOK_TeletexString 338 -#define TOK_TRUE 339 -#define TOK_TYPE_IDENTIFIER 340 -#define TOK_UNIQUE 341 -#define TOK_UNIVERSAL 342 -#define TOK_UniversalString 343 -#define TOK_UTCTime 344 -#define TOK_UTF8String 345 -#define TOK_VideotexString 346 -#define TOK_VisibleString 347 -#define TOK_WITH 348 -#define TOK_UNION 349 -#define TOK_INTERSECTION 350 -#define TOK_EXCEPT 351 -#define TOK_TwoDots 352 -#define TOK_ThreeDots 353 -#define TOK_tag 354 - - - - -#ifndef YYSTYPE -#line 57 "asn1p_y.y" typedef union { asn1p_t *a_grammar; asn1p_module_flags_e a_module_flags; @@ -265,14 +29,104 @@ typedef union { char *name; struct asn1p_type_tag_s tag; } tv_nametag; -} yystype; -/* Line 1281 of /usr/local/share/bison/yacc.c. */ -#line 271 "y.tab.h" -# define YYSTYPE yystype -#endif +} YYSTYPE; +#define TOK_PPEQ 257 +#define TOK_opaque 258 +#define TOK_bstring 259 +#define TOK_cstring 260 +#define TOK_hstring 261 +#define TOK_identifier 262 +#define TOK_number 263 +#define TOK_number_negative 264 +#define TOK_typereference 265 +#define TOK_objectclassreference 266 +#define TOK_typefieldreference 267 +#define TOK_valuefieldreference 268 +#define TOK_ABSENT 269 +#define TOK_ABSTRACT_SYNTAX 270 +#define TOK_ALL 271 +#define TOK_ANY 272 +#define TOK_APPLICATION 273 +#define TOK_AUTOMATIC 274 +#define TOK_BEGIN 275 +#define TOK_BIT 276 +#define TOK_BMPString 277 +#define TOK_BOOLEAN 278 +#define TOK_BY 279 +#define TOK_CHARACTER 280 +#define TOK_CHOICE 281 +#define TOK_CLASS 282 +#define TOK_COMPONENT 283 +#define TOK_COMPONENTS 284 +#define TOK_CONSTRAINED 285 +#define TOK_CONTAINING 286 +#define TOK_DEFAULT 287 +#define TOK_DEFINITIONS 288 +#define TOK_DEFINED 289 +#define TOK_EMBEDDED 290 +#define TOK_ENCODED 291 +#define TOK_END 292 +#define TOK_ENUMERATED 293 +#define TOK_EXPLICIT 294 +#define TOK_EXPORTS 295 +#define TOK_EXTENSIBILITY 296 +#define TOK_EXTERNAL 297 +#define TOK_FALSE 298 +#define TOK_FROM 299 +#define TOK_GeneralizedTime 300 +#define TOK_GeneralString 301 +#define TOK_GraphicString 302 +#define TOK_IA5String 303 +#define TOK_IDENTIFIER 304 +#define TOK_IMPLICIT 305 +#define TOK_IMPLIED 306 +#define TOK_IMPORTS 307 +#define TOK_INCLUDES 308 +#define TOK_INSTANCE 309 +#define TOK_INTEGER 310 +#define TOK_ISO646String 311 +#define TOK_MAX 312 +#define TOK_MIN 313 +#define TOK_MINUS_INFINITY 314 +#define TOK_NULL 315 +#define TOK_NumericString 316 +#define TOK_OBJECT 317 +#define TOK_ObjectDescriptor 318 +#define TOK_OCTET 319 +#define TOK_OF 320 +#define TOK_OPTIONAL 321 +#define TOK_PATTERN 322 +#define TOK_PDV 323 +#define TOK_PLUS_INFINITY 324 +#define TOK_PRESENT 325 +#define TOK_PrintableString 326 +#define TOK_PRIVATE 327 +#define TOK_REAL 328 +#define TOK_RELATIVE_OID 329 +#define TOK_SEQUENCE 330 +#define TOK_SET 331 +#define TOK_SIZE 332 +#define TOK_STRING 333 +#define TOK_SYNTAX 334 +#define TOK_T61String 335 +#define TOK_TAGS 336 +#define TOK_TeletexString 337 +#define TOK_TRUE 338 +#define TOK_TYPE_IDENTIFIER 339 +#define TOK_UNIQUE 340 +#define TOK_UNIVERSAL 341 +#define TOK_UniversalString 342 +#define TOK_UTCTime 343 +#define TOK_UTF8String 344 +#define TOK_VideotexString 345 +#define TOK_VisibleString 346 +#define TOK_WITH 347 +#define TOK_UNION 348 +#define TOK_INTERSECTION 349 +#define TOK_EXCEPT 350 +#define TOK_TwoDots 351 +#define TOK_ThreeDots 352 +#define TOK_tag 353 -extern YYSTYPE asn1p_lval; - - -#endif /* not BISON_ASN_P_Y_H */ +extern YYSTYPE asn1p_lval; diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index 3b9af314e..7b2c13668 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -1399,7 +1399,8 @@ ConstraintElementSet: checkmem(ct); ct->type = ACT_EL_EXT; CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct); - CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, $5); + ct = $$; + CONSTRAINT_INSERT($$, ACT_CA_CSV, ct, $5); } | TOK_ThreeDots { $$ = asn1p_constraint_new(yylineno); From 3b4ff46d902b2c27e07acda81b00e7caa5ccf43e Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 13 Aug 2004 12:35:29 +0000 Subject: [PATCH 0108/1469] proper cloning git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@108 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_constr.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/libasn1parser/asn1p_constr.c b/libasn1parser/asn1p_constr.c index 6e1988921..faec6f2e7 100644 --- a/libasn1parser/asn1p_constr.c +++ b/libasn1parser/asn1p_constr.c @@ -55,10 +55,29 @@ asn1p_constraint_clone(asn1p_constraint_t *src) { clone = asn1p_constraint_new(src->_lineno); if(clone) { + int i; + clone->type = src->type; + clone->presence = src->presence; CLONE(value, asn1p_value_clone); CLONE(range_start, asn1p_value_clone); CLONE(range_stop, asn1p_value_clone); + + for(i = 0; i < src->el_count; i++) { + asn1p_constraint_t *t; + t = asn1p_constraint_clone(src->elements[i]); + if(!t) { + asn1p_constraint_free(clone); + return NULL; + } + if(asn1p_constraint_insert(clone, t)) { + asn1p_constraint_free(clone); + asn1p_constraint_free(t); + return NULL; + } + } + assert(clone->el_count == src->el_count); + clone->_lineno = src->_lineno; } return clone; From f91f95ece36d20cf91f54b92d155e05a1337381d Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 13 Aug 2004 12:37:32 +0000 Subject: [PATCH 0109/1469] multiple IMPORTS fix check git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@109 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/49-real-life-OK.asn1 | 22 ++++++++++++++++++++++ tests/49-real-life-OK.asn1.-E | 8 ++++++++ 2 files changed, 30 insertions(+) create mode 100644 tests/49-real-life-OK.asn1 create mode 100644 tests/49-real-life-OK.asn1.-E diff --git a/tests/49-real-life-OK.asn1 b/tests/49-real-life-OK.asn1 new file mode 100644 index 000000000..ef633fcb7 --- /dev/null +++ b/tests/49-real-life-OK.asn1 @@ -0,0 +1,22 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .49 + +ModuleSetChoiceExtensibility + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 49 } + DEFINITIONS ::= +BEGIN + /* + * 0.8.17 had problem parsing this module + */ + + EXPORTS TypeA ; + + IMPORTS TypeB FROM ModuleB + TypeC FROM ModuleC ; + +END diff --git a/tests/49-real-life-OK.asn1.-E b/tests/49-real-life-OK.asn1.-E new file mode 100644 index 000000000..268da5e55 --- /dev/null +++ b/tests/49-real-life-OK.asn1.-E @@ -0,0 +1,8 @@ + +ModuleSetChoiceExtensibility {iso(-1) org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 49 } +DEFINITIONS ::= +BEGIN + +END From 07ddc23c9b12b6962c159991c20283dae34cdd6b Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 13 Aug 2004 12:38:42 +0000 Subject: [PATCH 0110/1469] indefinite length check git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@110 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-30.c | 119 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 113 insertions(+), 6 deletions(-) diff --git a/asn1c/tests/check-30.c b/asn1c/tests/check-30.c index 4ac52120e..20dc007da 100644 --- a/asn1c/tests/check-30.c +++ b/asn1c/tests/check-30.c @@ -7,6 +7,10 @@ #include + +/* + * Test that the optional member (c) is really optional. + */ uint8_t buf1[] = { 32 | 17, /* [UNIVERSAL 17], constructed */ 8, /* L */ @@ -42,17 +46,114 @@ uint8_t buf2[] = { 97, }; +/* + * This buffer checks that an unexpected member may be properly ignored. + */ +uint8_t buf3[] = { + 32 | 17, /* [UNIVERSAL 17], constructed */ + 14, /* L */ + + /* a INTEGER */ + 64 | 3, /* [APPLICATION 3] */ + 1, /* L */ + 96, + + /* b IA5String */ + 22, /* [UNIVERSAL 22] */ + 3, /* L */ + 'x', + 'y', + 'z', + + /* unexpected INTEGER */ + 64 | 4, /* [APPLICATION 4] */ + 1, /* L */ + 96, + + /* c [2] BOOLEAN */ + ((2 << 6) + 2), /* [2] */ + 1, /* L */ + 0xff +}; + +/* + * This buffer checks that an unexpected member may be properly ignored. + * This time, with indefinite length encoding. + */ +uint8_t buf4[] = { + 32 | 17, /* [UNIVERSAL 17], constructed */ + 16, /* L */ + + /* a INTEGER */ + 64 | 3, /* [APPLICATION 3] */ + 1, /* L */ + 96, + + /* b IA5String */ + 22, /* [UNIVERSAL 22] */ + 3, /* L */ + 'x', + 'y', + 'z', + + /* unexpected data structure */ + 32 | 64 | 4, /* [APPLICATION 4] */ + 0x80, /* indefinite L */ + 64 | 1, /* [APPLICATION 1] */ + 2, /* L */ + 'a', 'b', + + 0x00, + 0x00 +}; + +/* + * This buffer checks that an unexpected member may be properly ignored. + * This time, with indefinite length encoding at the outer level too. + */ +uint8_t buf5[] = { + 32 | 17, /* [UNIVERSAL 17], constructed */ + 0x80, /* indefinite L */ + + /* a INTEGER */ + 64 | 3, /* [APPLICATION 3] */ + 1, /* L */ + 96, + + /* b IA5String */ + 22, /* [UNIVERSAL 22] */ + 3, /* L */ + 'x', + 'y', + 'z', + + /* unexpected data structure */ + 32 | 64 | 4, /* [APPLICATION 4] */ + 0x80, /* indefinite L */ + 64 | 1, /* [APPLICATION 1] */ + 2, /* L */ + 'a', 'b', + + 0x00, + 0x00, + + 0x00, + 0x00 +}; + static void check(int is_ok, uint8_t *buf, int size, size_t consumed) { T_t t, *tp; ber_dec_rval_t rval; + fprintf(stderr, "\nMust %s:\n", is_ok?"suceed":"fail"); + tp = memset(&t, 0, sizeof(t)); fprintf(stderr, "Buf %p\n", buf); rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf, size); - fprintf(stderr, "Returned code %d, consumed %d\n", - (int)rval.code, (int)rval.consumed); + fprintf(stderr, "Returned code %d, consumed %d (out of %d)\n", + (int)rval.code, (int)rval.consumed, size); if(is_ok) { assert(rval.code == RC_OK); @@ -61,8 +162,12 @@ check(int is_ok, uint8_t *buf, int size, size_t consumed) { assert(t.a.size == 1); assert(t.a.buf[0] == 96); assert(t.b.size == 3); - assert(t.c == 0); assert(strcmp(t.b.buf, "xyz") == 0); + if(buf == buf3) { + assert(t.c->value); + } else { + assert(t.c == 0); + } } else { if(rval.code == RC_OK) { assert(t.a.size != 1 @@ -106,11 +211,13 @@ main(int ac, char **av) { (void)ac; /* Unused argument */ (void)av; /* Unused argument */ - fprintf(stderr, "Must succeed:\n"); check(1, buf1, sizeof(buf1) + 20, sizeof(buf1)); - - fprintf(stderr, "\nMust fail:\n"); check(0, buf2, sizeof(buf2) + 1, 5); + check(1, buf3, sizeof(buf3) + 1, sizeof(buf3)); + check(1, buf4, sizeof(buf4), sizeof(buf4)); + check(1, buf5, sizeof(buf5), sizeof(buf5)); + check(1, buf5, sizeof(buf5) + 1, sizeof(buf5)); + check(0, buf5, sizeof(buf5) - 1, sizeof(buf5)); fprintf(stderr, "\nPseudo-random buffer corruptions must fail\n"); try_corrupt(buf1, sizeof(buf1)); From 2273649d5573565f8588f57b15ad50049659ca60 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 13 Aug 2004 12:39:17 +0000 Subject: [PATCH 0111/1469] parser fixes git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@111 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ChangeLog b/ChangeLog index 936f02c61..ef2d3fbe7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,9 @@ +0.8.18: 2004-Aug-12 + + * Parser: fixed multiple IMPORTS problem (incorrect assertion). + * Parser: constraints extensibility parsing fix. + 0.8.17: 2004-Aug-11 * Improved compiler output: duplicate #includes eliminated. From 5197ea6f52032bc95ce3fdd541dbd749283b0099 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 13 Aug 2004 12:42:37 +0000 Subject: [PATCH 0112/1469] version bump-up git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@112 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.in b/configure.in index 232205147..05d03ca26 100644 --- a/configure.in +++ b/configure.in @@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_SYSTEM AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.8.17) +AM_INIT_AUTOMAKE(asn1c, 0.8.18) AC_SUBST(PATH) From 2c403fe938583edb2645b3a1214a1d1f2607c553 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 13 Aug 2004 12:47:39 +0000 Subject: [PATCH 0113/1469] configured git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@113 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index 27896355b..373ae218b 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.8.17 + VERSION=0.8.18 cat >>confdefs.h <<_ACEOF From 1f1d8cb956c24a0f76b09019a2971eebb5fc3d52 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 13 Aug 2004 16:58:19 +0000 Subject: [PATCH 0114/1469] custom basename(3) and dirname(3) git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@114 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/asn1c.c | 9 +-- configure | 2 +- configure.in | 2 +- libasn1compiler/Makefile.am | 1 + libasn1compiler/Makefile.in | 6 +- libasn1compiler/asn1c_compat.c | 94 ++++++++++++++++++++++++++++++++ libasn1compiler/asn1c_compat.h | 11 ++++ libasn1compiler/asn1c_internal.h | 5 +- libasn1compiler/asn1c_save.c | 8 ++- libasn1parser/Makefile.in | 2 +- 10 files changed, 128 insertions(+), 12 deletions(-) create mode 100644 libasn1compiler/asn1c_compat.c create mode 100644 libasn1compiler/asn1c_compat.h diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index 086b4caf3..0fd40dbce 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -8,7 +8,6 @@ #include #include /* for stat(2) */ #include -#include /* for basename(3) */ #include /* for EX_USAGE */ #include #include @@ -18,6 +17,8 @@ #include /* Print the ASN.1 tree */ #include /* Compile the ASN.1 tree */ +#include /* Portable basename(3) and dirname(3) */ + static void usage(char *av0); /* Print the Usage screen and exit(EX_USAGE) */ int @@ -118,7 +119,7 @@ main(int ac, char **av) { av += optind; } else { fprintf(stderr, "%s: No input files specified\n", - basename(av[0])); + a1c_basename(av[0])); exit(1); } @@ -201,7 +202,7 @@ main(int ac, char **av) { char *p; int len; - p = dirname(av[-optind]); + p = a1c_dirname(av[-optind]); len = strlen(p) + sizeof("/../skeletons"); skeletons_dir = alloca(len); @@ -261,7 +262,7 @@ usage(char *av0) { "\t-Wdebug-fixer\tDebug ASN.1 semantics processor\n" "\t-Wdebug-compiler\tDebug ASN.1 compiler\n" , - basename(av0), DATADIR + a1c_basename(av0), DATADIR ); exit(EX_USAGE); } diff --git a/configure b/configure index 373ae218b..793e98679 100755 --- a/configure +++ b/configure @@ -21588,7 +21588,7 @@ _ACEOF fi -for ac_header in errno.h +for ac_header in sys/param.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then diff --git a/configure.in b/configure.in index 05d03ca26..7585cedef 100644 --- a/configure.in +++ b/configure.in @@ -67,7 +67,7 @@ esac dnl Checks for header files. AC_HEADER_STDC -AC_CHECK_HEADERS(errno.h) +AC_CHECK_HEADERS(sys/param.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_BIGENDIAN diff --git a/libasn1compiler/Makefile.am b/libasn1compiler/Makefile.am index 6b2babdf5..301bbaa53 100644 --- a/libasn1compiler/Makefile.am +++ b/libasn1compiler/Makefile.am @@ -13,6 +13,7 @@ libasn1compiler_la_SOURCES = \ asn1c_lang.c asn1c_lang.h \ asn1c_save.c asn1c_save.h \ asn1c_C.c asn1c_C.h \ + asn1c_compat.c asn1c_compat.h \ asn1c_internal.h libasn1compiler_la_LIBADD = \ diff --git a/libasn1compiler/Makefile.in b/libasn1compiler/Makefile.in index 74f98934e..64c003770 100644 --- a/libasn1compiler/Makefile.in +++ b/libasn1compiler/Makefile.in @@ -54,7 +54,8 @@ libasn1compiler_la_DEPENDENCIES = \ ${top_builddir}/libasn1parser/libasn1parser.la \ ${top_builddir}/libasn1fix/libasn1fix.la am_libasn1compiler_la_OBJECTS = asn1compiler.lo asn1c_misc.lo \ - asn1c_out.lo asn1c_lang.lo asn1c_save.lo asn1c_C.lo + asn1c_out.lo asn1c_lang.lo asn1c_save.lo asn1c_C.lo \ + asn1c_compat.lo libasn1compiler_la_OBJECTS = $(am_libasn1compiler_la_OBJECTS) check_compiler_SOURCES = check_compiler.c check_compiler_OBJECTS = check_compiler.$(OBJEXT) @@ -68,6 +69,7 @@ DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/asn1c_C.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1c_compat.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/asn1c_lang.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/asn1c_misc.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/asn1c_out.Plo \ @@ -210,6 +212,7 @@ libasn1compiler_la_SOURCES = \ asn1c_lang.c asn1c_lang.h \ asn1c_save.c asn1c_save.h \ asn1c_C.c asn1c_C.h \ + asn1c_compat.c asn1c_compat.h \ asn1c_internal.h libasn1compiler_la_LIBADD = \ @@ -281,6 +284,7 @@ distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c_C.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c_compat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c_lang.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c_misc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c_out.Plo@am__quote@ diff --git a/libasn1compiler/asn1c_compat.c b/libasn1compiler/asn1c_compat.c new file mode 100644 index 000000000..3d8280a03 --- /dev/null +++ b/libasn1compiler/asn1c_compat.c @@ -0,0 +1,94 @@ +#include + +#include +#include + +#ifdef HAVE_SYS_PARAM_H +#include /* For MAXPATHLEN */ +#endif + +#ifndef MAXPATHLEN +#define MAXPATHLEN 1024 +#endif + +char * +a1c_basename(const char *path) { + static char strbuf[MAXPATHLEN]; + const char *pend; + const char *name; + + pend = path + strlen(path); + if(pend == path) { + strcpy(strbuf, "."); + return strbuf; + } + + /* Skip tailing slashes */ + for(pend--; pend > path && *pend == '/'; pend--); + + if(pend == path && *path == '/') { + strcpy(strbuf, "/"); + return strbuf; + } + + for(name = pend; name > path && name[-1] != '/'; name--); + + if((pend - name) >= sizeof(strbuf) - 1) { + errno = ENAMETOOLONG; + return 0; + } + + memcpy(strbuf, name, pend - name + 1); + strbuf[pend - name + 1] = '\0'; + + return strbuf; +} + + +char * +a1c_dirname(const char *path) { + static char strbuf[MAXPATHLEN]; + const char *pend; + const char *last = 0; + int in_slash = 0; + + /* One-pass determination of the last char of the pathname */ + for(pend = path; ; pend++) { + printf("-%c", *pend); + switch(*pend) { + case '\0': break; + case '/': + if(!in_slash) { + last = pend; + in_slash = 1; + } + continue; + default: + if(in_slash) in_slash = 0; + continue; + } + break; + } + printf("\n"); + + if(last <= path) { + strcpy(strbuf, *path == '/' ? "/" : "."); + return strbuf; + } + + if(!last) { + strcpy(strbuf, "/"); + return strbuf; + } + + if((last - path) >= sizeof(strbuf)) { + errno = ENAMETOOLONG; + return 0; + } + + memcpy(strbuf, path, last - path); + strbuf[last - path] = '\0'; + + return strbuf; +} + diff --git a/libasn1compiler/asn1c_compat.h b/libasn1compiler/asn1c_compat.h new file mode 100644 index 000000000..9461b781e --- /dev/null +++ b/libasn1compiler/asn1c_compat.h @@ -0,0 +1,11 @@ +#ifndef ASN1C_COMPAT_H +#define ASN1C_COMPAT_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +char *a1c_basename(const char *path); +char *a1c_dirname(const char *path); + +#endif /* ASN1C_COMPAT_H */ diff --git a/libasn1compiler/asn1c_internal.h b/libasn1compiler/asn1c_internal.h index 6192650c0..08a490fb7 100644 --- a/libasn1compiler/asn1c_internal.h +++ b/libasn1compiler/asn1c_internal.h @@ -1,13 +1,16 @@ #ifndef _ASN1_COMPILER_INTERNAL_H_ #define _ASN1_COMPILER_INTERNAL_H_ +#ifdef HAVE_CONFIG_H +#include +#endif + #include #include #include /* for fstat(2) */ #include /* for unlink(2) */ #include /* for open(2) */ #include /* for glob(3) */ -#include /* for basename(3) */ #include #include /* for isalnum(3) */ #include diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c index fd1356b71..15d1b676d 100644 --- a/libasn1compiler/asn1c_save.c +++ b/libasn1compiler/asn1c_save.c @@ -1,4 +1,5 @@ #include "asn1c_internal.h" +#include "asn1c_compat.h" static int asn1c_dump_streams(arg_t *arg); static int asn1c_print_streams(arg_t *arg); @@ -73,7 +74,7 @@ asn1c_save_compiled_output(arg_t *arg, const char *datadir) { return -1; } else { fprintf(mkf, "\t\\\n\t%s", - basename(pg.gl_pathv[i])); + a1c_basename(pg.gl_pathv[i])); } } @@ -213,11 +214,12 @@ asn1c_save_streams(arg_t *arg) { static int asn1c_copy_over(arg_t *arg, char *path) { - char *fname = basename(path); + char *fname; (void)arg; /* Unused argument */ - if(symlink(path, fname)) { + fname = a1c_basename(path); + if(!fname || symlink(path, fname)) { if(errno == EEXIST) { struct stat sb1, sb2; if(stat(path, &sb1) == 0 diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index 759122ef3..375d37e2b 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -546,8 +546,8 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." - -rm -f asn1p_y.c -rm -f asn1p_y.h + -rm -f asn1p_y.c -rm -f asn1p_l.c clean: clean-am From 4d5e6f3e0bd64c8cbb24a43a43bc51741615e70b Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 16 Aug 2004 07:01:54 +0000 Subject: [PATCH 0115/1469] removed debugging git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@115 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_compat.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/libasn1compiler/asn1c_compat.c b/libasn1compiler/asn1c_compat.c index 3d8280a03..44ba3e60d 100644 --- a/libasn1compiler/asn1c_compat.c +++ b/libasn1compiler/asn1c_compat.c @@ -54,7 +54,6 @@ a1c_dirname(const char *path) { /* One-pass determination of the last char of the pathname */ for(pend = path; ; pend++) { - printf("-%c", *pend); switch(*pend) { case '\0': break; case '/': @@ -69,7 +68,6 @@ a1c_dirname(const char *path) { } break; } - printf("\n"); if(last <= path) { strcpy(strbuf, *path == '/' ? "/" : "."); From 18965691f343e7574d2431364023cd4aa02b7359 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 16 Aug 2004 07:02:39 +0000 Subject: [PATCH 0116/1469] thorough compilation git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@116 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/Makefile.am | 2 ++ asn1c/tests/Makefile.in | 1 + asn1c/tests/check-25.c | 40 ++++++++++++++++++++-------------------- asn1c/tests/check-31.c | 2 +- asn1c/tests/check-35.c | 15 ++++++++------- 5 files changed, 32 insertions(+), 28 deletions(-) diff --git a/asn1c/tests/Makefile.am b/asn1c/tests/Makefile.am index 45cdd03ab..11f9b2583 100644 --- a/asn1c/tests/Makefile.am +++ b/asn1c/tests/Makefile.am @@ -1,4 +1,6 @@ +AM_CFLAGS = @ADD_CFLAGS@ + check_SCRIPTS = check-assembly.sh TESTS_ENVIRONMENT= CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" ./check-assembly.sh diff --git a/asn1c/tests/Makefile.in b/asn1c/tests/Makefile.in index 17cc553a7..b60721abe 100644 --- a/asn1c/tests/Makefile.in +++ b/asn1c/tests/Makefile.in @@ -158,6 +158,7 @@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ +AM_CFLAGS = @ADD_CFLAGS@ check_SCRIPTS = check-assembly.sh TESTS_ENVIRONMENT = CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" ./check-assembly.sh @CPLUSPLUS_FOUND_FALSE@TESTS = check-*.c diff --git a/asn1c/tests/check-25.c b/asn1c/tests/check-25.c index dad12ae10..5660d0564 100644 --- a/asn1c/tests/check-25.c +++ b/asn1c/tests/check-25.c @@ -168,9 +168,9 @@ partial_read(uint8_t *buf, size_t size) { T_t t, *tp; ber_dec_rval_t rval; size_t i1, i2; - uint8_t *buf1 = alloca(size); - uint8_t *buf2 = alloca(size); - uint8_t *buf3 = alloca(size); + uint8_t *tbuf1 = alloca(size); + uint8_t *tbuf2 = alloca(size); + uint8_t *tbuf3 = alloca(size); fprintf(stderr, "\nPartial read sequence...\n"); @@ -190,44 +190,44 @@ partial_read(uint8_t *buf, size_t size) { size_t size3 = size - size1 - size2; fprintf(stderr, "\n%d:{%d, %d, %d}...\n", - size, size1, size2, size3); + (int)size, (int)size1, (int)size2, (int)size3); - memset(buf1, 0, size); - memset(buf2, 0, size); - memset(buf3, 0, size); - memcpy(buf1, chunk1, size1); - memcpy(buf2, chunk2, size2); - memcpy(buf3, chunk3, size3); + memset(tbuf1, 0, size); + memset(tbuf2, 0, size); + memset(tbuf3, 0, size); + memcpy(tbuf1, chunk1, size1); + memcpy(tbuf2, chunk2, size2); + memcpy(tbuf3, chunk3, size3); tp = memset(&t, 0, sizeof(t)); - fprintf(stderr, "=> Chunk 1 (%d):\n", size1); + fprintf(stderr, "=> Chunk 1 (%d):\n", (int)size1); rval = ber_decode(&asn1_DEF_T, (void **)&tp, - buf1, size1); + tbuf1, size1); assert(rval.code == RC_WMORE); assert(rval.consumed <= size1); if(rval.consumed < size1) { int leftover = size1 - rval.consumed; - memcpy(buf2, buf1 + rval.consumed, leftover); - memcpy(buf2 + leftover, chunk2, size2); + memcpy(tbuf2, tbuf1 + rval.consumed, leftover); + memcpy(tbuf2 + leftover, chunk2, size2); size2 += leftover; } - fprintf(stderr, "=> Chunk 2 (%d):\n", size2); + fprintf(stderr, "=> Chunk 2 (%d):\n", (int)size2); rval = ber_decode(&asn1_DEF_T, (void **)&tp, - buf2, size2); + tbuf2, size2); assert(rval.code == RC_WMORE); assert(rval.consumed <= size2); if(rval.consumed < size2) { int leftover = size2 - rval.consumed; - memcpy(buf3, buf2 + rval.consumed, leftover); - memcpy(buf3 + leftover, chunk3, size3); + memcpy(tbuf3, tbuf2 + rval.consumed, leftover); + memcpy(tbuf3 + leftover, chunk3, size3); size3 += leftover; } - fprintf(stderr, "=> Chunk 3 (%d):\n", size3); + fprintf(stderr, "=> Chunk 3 (%d):\n", (int)size3); rval = ber_decode(&asn1_DEF_T, (void **)&tp, - buf3, size3); + tbuf3, size3); assert(rval.code == RC_OK); assert(rval.consumed == size3); diff --git a/asn1c/tests/check-31.c b/asn1c/tests/check-31.c index 05380815e..4b13f080d 100644 --- a/asn1c/tests/check-31.c +++ b/asn1c/tests/check-31.c @@ -70,7 +70,7 @@ uint8_t buf1_reconstr[] = { }; int buf_pos; -int bytes_compare(const void *bufferp, size_t size, void *key) { +static int bytes_compare(const void *bufferp, size_t size, void *key) { const uint8_t *buffer = bufferp; assert(buf_pos + size <= sizeof(buf1_reconstr)); diff --git a/asn1c/tests/check-35.c b/asn1c/tests/check-35.c index 8fdaced0c..423549472 100644 --- a/asn1c/tests/check-35.c +++ b/asn1c/tests/check-35.c @@ -120,7 +120,7 @@ check(T_t *tp, uint8_t *buf, int size, size_t consumed) { tp = memset(tp, 0, sizeof(*tp)); - fprintf(stderr, "Buf %p (%d)\n", buf, size); + fprintf(stderr, "Buf %p (%d)\n", buf, (int)size); rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf, size); fprintf(stderr, "Returned code %d, consumed %d\n", (int)rval.code, (int)rval.consumed); @@ -143,13 +143,14 @@ buf_fill(const void *buffer, size_t size, void *app_key) { (void)app_key; if(buf_pos + size > buf_size) { - fprintf(stderr, "%d + %d > %d\n", buf_pos, (int)size, buf_size); + fprintf(stderr, "%d + %d > %d\n", + (int)buf_pos, (int)size, (int)buf_size); return -1; } memcpy(buf + buf_pos, buffer, size); buf_pos += size; - fprintf(stderr, " written %d (%d)\n", (int)size, buf_pos); + fprintf(stderr, " written %d (%d)\n", (int)size, (int)buf_pos); return 0; } @@ -212,7 +213,7 @@ partial_read(uint8_t *buf, size_t size) { size_t size3 = size - size1 - size2; fprintf(stderr, "\n%d:{%d, %d, %d}...\n", - size, size1, size2, size3); + (int)size, (int)size1, (int)size2, (int)size3); memset(buf1, 0, size); memset(buf2, 0, size); @@ -223,7 +224,7 @@ partial_read(uint8_t *buf, size_t size) { tp = memset(&t, 0, sizeof(t)); - fprintf(stderr, "=> Chunk 1 (%d):\n", size1); + fprintf(stderr, "=> Chunk 1 (%d):\n", (int)size1); rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf1, size1); assert(rval.code == RC_WMORE); @@ -235,7 +236,7 @@ partial_read(uint8_t *buf, size_t size) { size2 += leftover; } - fprintf(stderr, "=> Chunk 2 (%d):\n", size2); + fprintf(stderr, "=> Chunk 2 (%d):\n", (int)size2); rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf2, size2); assert(rval.code == RC_WMORE); @@ -247,7 +248,7 @@ partial_read(uint8_t *buf, size_t size) { size3 += leftover; } - fprintf(stderr, "=> Chunk 3 (%d):\n", size3); + fprintf(stderr, "=> Chunk 3 (%d):\n", (int)size3); rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf3, size3); assert(rval.code == RC_OK); From 020d42ba746a3489c6643384f08fe34a6aa72269 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 16 Aug 2004 11:38:13 +0000 Subject: [PATCH 0117/1469] -t option and minor changes git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@117 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/Makefile.am | 3 +++ asn1c/Makefile.in | 15 +++++++++------ asn1c/asn1c.c | 29 ++++++++++++++++++++--------- 3 files changed, 32 insertions(+), 15 deletions(-) diff --git a/asn1c/Makefile.am b/asn1c/Makefile.am index 2363c1898..b9128ae8b 100644 --- a/asn1c/Makefile.am +++ b/asn1c/Makefile.am @@ -7,6 +7,7 @@ AM_CPPFLAGS = \ -I${top_srcdir}/libasn1parser \ -I${top_srcdir}/libasn1print \ -I${top_srcdir}/libasn1fix \ + -I${top_srcdir}/skeletons \ -DDATADIR=\"${pkgdatadir}\" LDADD = \ @@ -15,6 +16,8 @@ LDADD = \ ${top_builddir}/libasn1print/libasn1print.la \ ${top_builddir}/libasn1compiler/libasn1compiler.la +asn1c_SOURCES = asn1c.c decoder.c decoder.h + bin_PROGRAMS = asn1c dist_man1_MANS = asn1c.1 diff --git a/asn1c/Makefile.in b/asn1c/Makefile.in index 6369a4a39..b07dc6f01 100644 --- a/asn1c/Makefile.in +++ b/asn1c/Makefile.in @@ -14,7 +14,7 @@ @SET_MAKE@ -SOURCES = asn1c.c +SOURCES = $(asn1c_SOURCES) srcdir = @srcdir@ top_srcdir = @top_srcdir@ @@ -53,8 +53,8 @@ CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) -asn1c_SOURCES = asn1c.c -asn1c_OBJECTS = asn1c.$(OBJEXT) +am_asn1c_OBJECTS = asn1c.$(OBJEXT) decoder.$(OBJEXT) +asn1c_OBJECTS = $(am_asn1c_OBJECTS) asn1c_LDADD = $(LDADD) asn1c_DEPENDENCIES = ${top_builddir}/libasn1parser/libasn1parser.la \ ${top_builddir}/libasn1fix/libasn1fix.la \ @@ -63,7 +63,7 @@ asn1c_DEPENDENCIES = ${top_builddir}/libasn1parser/libasn1parser.la \ DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles -@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/asn1c.Po +@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/asn1c.Po ./$(DEPDIR)/decoder.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ @@ -72,8 +72,8 @@ LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ CCLD = $(CC) LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = asn1c.c -DIST_SOURCES = asn1c.c +SOURCES = $(asn1c_SOURCES) +DIST_SOURCES = $(asn1c_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ @@ -204,6 +204,7 @@ AM_CPPFLAGS = \ -I${top_srcdir}/libasn1parser \ -I${top_srcdir}/libasn1print \ -I${top_srcdir}/libasn1fix \ + -I${top_srcdir}/skeletons \ -DDATADIR=\"${pkgdatadir}\" LDADD = \ @@ -212,6 +213,7 @@ LDADD = \ ${top_builddir}/libasn1print/libasn1print.la \ ${top_builddir}/libasn1compiler/libasn1compiler.la +asn1c_SOURCES = asn1c.c decoder.c decoder.h dist_man1_MANS = asn1c.1 check_SCRIPTS = check-parsing.sh TESTS = check-parsing.sh @@ -289,6 +291,7 @@ distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/decoder.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index 0fd40dbce..6ebebe0d7 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -19,14 +19,16 @@ #include /* Portable basename(3) and dirname(3) */ +#include "decoder.h" /* -t: decode TL[V?] string */ + static void usage(char *av0); /* Print the Usage screen and exit(EX_USAGE) */ int main(int ac, char **av) { - enum asn1p_flags asn1_parser_flags = A1P_NOFLAGS; - enum asn1f_flags asn1_fixer_flags = A1F_NOFLAGS; - enum asn1c_flags asn1_compiler_flags = A1C_NOFLAGS; - enum asn1print_flags_e print_arg__flags = APF_NOFLAGS; + enum asn1p_flags asn1_parser_flags = A1P_NOFLAGS; + enum asn1f_flags asn1_fixer_flags = A1F_NOFLAGS; + enum asn1c_flags asn1_compiler_flags= A1C_NOFLAGS; + enum asn1print_flags asn1_print_flags = APF_NOFLAGS; int print_arg__print_out = 0; /* Don't compile, just print parsed */ int print_arg__fix_n_print = 0; /* Fix and print */ int warnings_as_errors = 0; /* Treat warnings as errors */ @@ -39,7 +41,7 @@ main(int ac, char **av) { /* * Process command-line options. */ - while((ch = getopt(ac, av, "EFf:LPRS:W:")) != -1) + while((ch = getopt(ac, av, "EFf:LPRS:t:W:")) != -1) switch(ch) { case 'E': print_arg__print_out = 1; @@ -62,13 +64,16 @@ main(int ac, char **av) { char *known_type = optarg + 18; ret = asn1f_make_known_external_type(known_type); assert(ret == 0 || errno == EEXIST); + } else if(strcmp(optarg, "undoc") == 0) { + /* Enable undocumented operation */ + asn1_print_flags |= APF_FULL_CONSTRAINTS; } else { fprintf(stderr, "-f%s: Invalid argument\n", optarg); exit(EX_USAGE); } break; case 'L': - print_arg__flags |= APF_LINE_COMMENTS; + asn1_print_flags |= APF_LINE_COMMENTS; break; case 'P': asn1_compiler_flags |= A1C_PRINT_COMPILED; @@ -79,6 +84,10 @@ main(int ac, char **av) { case 'S': skeletons_dir = optarg; break; + case 't': + if(decode_tlv_from_string(optarg)) + exit(EX_DATAERR); + exit(0); case 'W': if(strcmp(optarg, "error") == 0) { warnings_as_errors = 1; @@ -151,10 +160,10 @@ main(int ac, char **av) { } /* - * Dump the parsed ASN.1 tree if -E specified and -F is not given. + * Dump the parsed ASN.1 tree if -E specified and -F is NOT given. */ if(print_arg__print_out && !print_arg__fix_n_print) { - if(asn1print(asn, print_arg__flags)) + if(asn1print(asn, asn1_print_flags)) exit(EX_SOFTWARE); return 0; } @@ -181,7 +190,7 @@ main(int ac, char **av) { * Dump the parsed ASN.1 tree if -E specified and -F is given. */ if(print_arg__print_out && print_arg__fix_n_print) { - if(asn1print(asn, print_arg__flags)) + if(asn1print(asn, asn1_print_flags)) exit(EX_SOFTWARE); return 0; } @@ -248,6 +257,8 @@ usage(char *av0) { "\t \t(Default is \"%s\")\n" "\t-R \tRestrict output (tables only, no support code)\n" "\n" + "\t-t \tDecode the given tag[/length] sequence\n" + "\n" "\t-ftypes88\tUse only ASN.1:1988 embedded types\n" /* "\t-fconstr90\tUse only ASN.1:1990 constructs (not available)\n" From e3eb5703116d44c9cc5fd6cd268dec15007bc855 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 16 Aug 2004 11:40:12 +0000 Subject: [PATCH 0118/1469] tlv decoder git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@118 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/Makefile.am | 3 ++- asn1c/Makefile.in | 11 +++++++---- asn1c/asn1c.c | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/asn1c/Makefile.am b/asn1c/Makefile.am index b9128ae8b..b883f6225 100644 --- a/asn1c/Makefile.am +++ b/asn1c/Makefile.am @@ -16,7 +16,8 @@ LDADD = \ ${top_builddir}/libasn1print/libasn1print.la \ ${top_builddir}/libasn1compiler/libasn1compiler.la -asn1c_SOURCES = asn1c.c decoder.c decoder.h +asn1c_SOURCES = asn1c.c \ + tlv_decoder.c tlv_decoder.h bin_PROGRAMS = asn1c diff --git a/asn1c/Makefile.in b/asn1c/Makefile.in index b07dc6f01..311957cf5 100644 --- a/asn1c/Makefile.in +++ b/asn1c/Makefile.in @@ -53,7 +53,7 @@ CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) -am_asn1c_OBJECTS = asn1c.$(OBJEXT) decoder.$(OBJEXT) +am_asn1c_OBJECTS = asn1c.$(OBJEXT) tlv_decoder.$(OBJEXT) asn1c_OBJECTS = $(am_asn1c_OBJECTS) asn1c_LDADD = $(LDADD) asn1c_DEPENDENCIES = ${top_builddir}/libasn1parser/libasn1parser.la \ @@ -63,7 +63,8 @@ asn1c_DEPENDENCIES = ${top_builddir}/libasn1parser/libasn1parser.la \ DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles -@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/asn1c.Po ./$(DEPDIR)/decoder.Po +@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/asn1c.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/tlv_decoder.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ @@ -213,7 +214,9 @@ LDADD = \ ${top_builddir}/libasn1print/libasn1print.la \ ${top_builddir}/libasn1compiler/libasn1compiler.la -asn1c_SOURCES = asn1c.c decoder.c decoder.h +asn1c_SOURCES = asn1c.c \ + tlv_decoder.c tlv_decoder.h + dist_man1_MANS = asn1c.1 check_SCRIPTS = check-parsing.sh TESTS = check-parsing.sh @@ -291,7 +294,7 @@ distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/decoder.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlv_decoder.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index 6ebebe0d7..dc55f8558 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -19,7 +19,7 @@ #include /* Portable basename(3) and dirname(3) */ -#include "decoder.h" /* -t: decode TL[V?] string */ +#include "tlv_decoder.h" /* -t: decode TL[V?] string */ static void usage(char *av0); /* Print the Usage screen and exit(EX_USAGE) */ From 863b393fb0ee9d4fe1b30bfaf45ddfdad57e6fa0 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 16 Aug 2004 11:42:33 +0000 Subject: [PATCH 0119/1469] backward-compatible git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@119 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/asn1c.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index dc55f8558..1fc9e559b 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -28,7 +28,7 @@ main(int ac, char **av) { enum asn1p_flags asn1_parser_flags = A1P_NOFLAGS; enum asn1f_flags asn1_fixer_flags = A1F_NOFLAGS; enum asn1c_flags asn1_compiler_flags= A1C_NOFLAGS; - enum asn1print_flags asn1_print_flags = APF_NOFLAGS; + enum asn1print_flags_e asn1_print_flags = APF_NOFLAGS; int print_arg__print_out = 0; /* Don't compile, just print parsed */ int print_arg__fix_n_print = 0; /* Fix and print */ int warnings_as_errors = 0; /* Treat warnings as errors */ @@ -64,9 +64,6 @@ main(int ac, char **av) { char *known_type = optarg + 18; ret = asn1f_make_known_external_type(known_type); assert(ret == 0 || errno == EEXIST); - } else if(strcmp(optarg, "undoc") == 0) { - /* Enable undocumented operation */ - asn1_print_flags |= APF_FULL_CONSTRAINTS; } else { fprintf(stderr, "-f%s: Invalid argument\n", optarg); exit(EX_USAGE); From 9656e3044dbfeee5ac9f86de3703a9a7891852e1 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 17 Aug 2004 06:48:25 +0000 Subject: [PATCH 0120/1469] EXTERNAL has tag 8 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@120 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_expr2uclass.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libasn1parser/asn1p_expr2uclass.h b/libasn1parser/asn1p_expr2uclass.h index 416c9f72e..20f37003d 100644 --- a/libasn1parser/asn1p_expr2uclass.h +++ b/libasn1parser/asn1p_expr2uclass.h @@ -10,8 +10,8 @@ expr_type2uclass_value[ASN_EXPR_TYPE_MAX] [ ASN_BASIC_OCTET_STRING ] = 4, [ ASN_BASIC_NULL ] = 5, [ ASN_BASIC_OBJECT_IDENTIFIER ] = 6, - [ ASN_BASIC_EXTERNAL ] = 7, [ ASN_STRING_ObjectDescriptor ] = 7, + [ ASN_BASIC_EXTERNAL ] = 8, [ ASN_BASIC_REAL ] = 9, [ ASN_BASIC_ENUMERATED ] = 10, [ ASN_BASIC_EMBEDDED_PDV ] = 11, From af9201ade1e7ca221e4e5bb71faeb617df2dc3ca Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 18 Aug 2004 04:43:24 +0000 Subject: [PATCH 0121/1469] print output format changed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@121 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/16-constraint-OK.asn1.-EF | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/16-constraint-OK.asn1.-EF b/tests/16-constraint-OK.asn1.-EF index e039e0971..a0053bbac 100644 --- a/tests/16-constraint-OK.asn1.-EF +++ b/tests/16-constraint-OK.asn1.-EF @@ -5,15 +5,15 @@ ModuleTestConstraint {iso(-1) org(3) dod(6) internet(1) private(4) DEFINITIONS ::= BEGIN -Type1 ::= IA5String (SIZE (1..10,...))(FROM ("a".."z"|"#")) +Type1 ::= IA5String (SIZE(1..10,...))(FROM("a".."z" | "#")) -Type2 ::= IA5String (SIZE (MIN..4)|FROM ("abc")) +Type2 ::= IA5String (SIZE(MIN..4) | FROM("abc")) -Type3 ::= BMPString (SIZE (1)) +Type3 ::= BMPString (SIZE(1)) Type4 ::= INTEGER (1..MAX) -Type5 ::= BOOLEAN (TRUE|FALSE) +Type5 ::= BOOLEAN (TRUE | FALSE) v1 Type1 ::= "#value with ""double quotes""" From b2a5e2c50feefe178bbd0e42bf856a5352a02b27 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 18 Aug 2004 04:45:17 +0000 Subject: [PATCH 0122/1469] order changed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@122 59561ff5-6e30-0410-9f3c-9617f08c8826 --- Makefile.am | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.am b/Makefile.am index da7f6821c..ddb7a4b8d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,7 +1,7 @@ SUBDIRS = \ - libasn1parser libasn1print \ - libasn1fix libasn1compiler \ + libasn1parser libasn1fix \ + libasn1print libasn1compiler \ skeletons examples tests \ doc asn1c From 57a34aca49ae38a0833e2d7447895668aafe6630 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 18 Aug 2004 04:47:49 +0000 Subject: [PATCH 0123/1469] rearranged deps git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@123 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/Makefile.am | 12 ++++-------- libasn1compiler/Makefile.in | 22 +++++++++------------- 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/libasn1compiler/Makefile.am b/libasn1compiler/Makefile.am index 301bbaa53..ef96aef91 100644 --- a/libasn1compiler/Makefile.am +++ b/libasn1compiler/Makefile.am @@ -16,14 +16,10 @@ libasn1compiler_la_SOURCES = \ asn1c_compat.c asn1c_compat.h \ asn1c_internal.h -libasn1compiler_la_LIBADD = \ - ${top_builddir}/libasn1parser/libasn1parser.la \ - ${top_builddir}/libasn1fix/libasn1fix.la +TESTS = $(check_PROGRAMS) check_PROGRAMS = check_compiler -TESTS = ${check_PROGRAMS} - -LDADD = ${noinst_LTLIBRARIES} ${libasn1compiler_la_LIBADD} -DEPENDENCIES = ${LDADD} - +check_compiler_LDADD = $(noinst_LTLIBRARIES) \ + $(top_builddir)/libasn1parser/libasn1parser.la \ + $(top_builddir)/libasn1fix/libasn1fix.la diff --git a/libasn1compiler/Makefile.in b/libasn1compiler/Makefile.in index 64c003770..d50f04acb 100644 --- a/libasn1compiler/Makefile.in +++ b/libasn1compiler/Makefile.in @@ -50,21 +50,18 @@ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) -libasn1compiler_la_DEPENDENCIES = \ - ${top_builddir}/libasn1parser/libasn1parser.la \ - ${top_builddir}/libasn1fix/libasn1fix.la +libasn1compiler_la_LIBADD = am_libasn1compiler_la_OBJECTS = asn1compiler.lo asn1c_misc.lo \ asn1c_out.lo asn1c_lang.lo asn1c_save.lo asn1c_C.lo \ asn1c_compat.lo libasn1compiler_la_OBJECTS = $(am_libasn1compiler_la_OBJECTS) check_compiler_SOURCES = check_compiler.c check_compiler_OBJECTS = check_compiler.$(OBJEXT) -check_compiler_LDADD = $(LDADD) am__DEPENDENCIES_1 = libasn1compiler.la -am__DEPENDENCIES_2 = ${top_builddir}/libasn1parser/libasn1parser.la \ - ${top_builddir}/libasn1fix/libasn1fix.la check_compiler_DEPENDENCIES = $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_2) + $(top_builddir)/libasn1parser/libasn1parser.la \ + $(top_builddir)/libasn1cnst/libasn1cnst.la \ + $(top_builddir)/libasn1fix/libasn1fix.la DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @@ -215,13 +212,12 @@ libasn1compiler_la_SOURCES = \ asn1c_compat.c asn1c_compat.h \ asn1c_internal.h -libasn1compiler_la_LIBADD = \ - ${top_builddir}/libasn1parser/libasn1parser.la \ - ${top_builddir}/libasn1fix/libasn1fix.la +TESTS = $(check_PROGRAMS) +check_compiler_LDADD = $(noinst_LTLIBRARIES) \ + $(top_builddir)/libasn1parser/libasn1parser.la \ + $(top_builddir)/libasn1cnst/libasn1cnst.la \ + $(top_builddir)/libasn1fix/libasn1fix.la -TESTS = ${check_PROGRAMS} -LDADD = ${noinst_LTLIBRARIES} ${libasn1compiler_la_LIBADD} -DEPENDENCIES = ${LDADD} all: all-am .SUFFIXES: From 4808c70cf5425c12cf8e959927e49dc777f746e1 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 18 Aug 2004 04:50:37 +0000 Subject: [PATCH 0124/1469] debug constraints git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@124 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1print/Makefile.am | 8 +-- libasn1print/Makefile.in | 104 ++++------------------------ libasn1print/asn1print.c | 146 ++++++++++++++++++++++++++++++++------- libasn1print/asn1print.h | 9 +-- 4 files changed, 143 insertions(+), 124 deletions(-) diff --git a/libasn1print/Makefile.am b/libasn1print/Makefile.am index fb4861a47..e88dac3f8 100644 --- a/libasn1print/Makefile.am +++ b/libasn1print/Makefile.am @@ -1,6 +1,8 @@ AM_CFLAGS = @ADD_CFLAGS@ -AM_CPPFLAGS = -I${top_srcdir}/libasn1parser +AM_CPPFLAGS = \ + -I$(top_srcdir)/libasn1parser \ + -I$(top_srcdir)/libasn1fix noinst_LTLIBRARIES = libasn1print.la @@ -8,7 +10,3 @@ libasn1print_la_LDFLAGS = -all-static libasn1print_la_SOURCES = \ asn1print.c asn1print.h -LDADD = ${noinst_LTLIBRARIES} ${libasn1fix_la_LIBADD} -DEPENDENCIES = ${LDADD} - -TESTS = ${check_PROGRAMS} diff --git a/libasn1print/Makefile.in b/libasn1print/Makefile.in index c24ddf336..fce602b45 100644 --- a/libasn1print/Makefile.in +++ b/libasn1print/Makefile.in @@ -180,15 +180,15 @@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ AM_CFLAGS = @ADD_CFLAGS@ -AM_CPPFLAGS = -I${top_srcdir}/libasn1parser +AM_CPPFLAGS = \ + -I$(top_srcdir)/libasn1parser \ + -I$(top_srcdir)/libasn1fix + noinst_LTLIBRARIES = libasn1print.la libasn1print_la_LDFLAGS = -all-static libasn1print_la_SOURCES = \ asn1print.c asn1print.h -LDADD = ${noinst_LTLIBRARIES} ${libasn1fix_la_LIBADD} -DEPENDENCIES = ${LDADD} -TESTS = ${check_PROGRAMS} all: all-am .SUFFIXES: @@ -324,79 +324,6 @@ GTAGS: distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; skip=0; \ - srcdir=$(srcdir); export srcdir; \ - list='$(TESTS)'; \ - if test -n "$$list"; then \ - for tst in $$list; do \ - if test -f ./$$tst; then dir=./; \ - elif test -f $$tst; then dir=; \ - else dir="$(srcdir)/"; fi; \ - if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *" $$tst "*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - echo "XPASS: $$tst"; \ - ;; \ - *) \ - echo "PASS: $$tst"; \ - ;; \ - esac; \ - elif test $$? -ne 77; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *" $$tst "*) \ - xfail=`expr $$xfail + 1`; \ - echo "XFAIL: $$tst"; \ - ;; \ - *) \ - failed=`expr $$failed + 1`; \ - echo "FAIL: $$tst"; \ - ;; \ - esac; \ - else \ - skip=`expr $$skip + 1`; \ - echo "SKIP: $$tst"; \ - fi; \ - done; \ - if test "$$failed" -eq 0; then \ - if test "$$xfail" -eq 0; then \ - banner="All $$all tests passed"; \ - else \ - banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ - fi; \ - else \ - if test "$$xpass" -eq 0; then \ - banner="$$failed of $$all tests failed"; \ - else \ - banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ - fi; \ - fi; \ - dashes="$$banner"; \ - skipped=""; \ - if test "$$skip" -ne 0; then \ - skipped="($$skip tests were not run)"; \ - test `echo "$$skipped" | wc -c` -gt `echo "$$banner" | wc -c` && \ - dashes="$$skipped"; \ - fi; \ - report=""; \ - if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ - report="Please report to $(PACKAGE_BUGREPORT)"; \ - test `echo "$$report" | wc -c` -gt `echo "$$banner" | wc -c` && \ - dashes="$$report"; \ - fi; \ - dashes=`echo "$$dashes" | sed s/./=/g`; \ - echo "$$dashes"; \ - echo "$$banner"; \ - test -n "$$skipped" && echo "$$skipped"; \ - test -n "$$report" && echo "$$report"; \ - echo "$$dashes"; \ - test "$$failed" -eq 0; \ - else :; fi - distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ @@ -425,7 +352,6 @@ distdir: $(DISTFILES) fi; \ done check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: @@ -504,17 +430,17 @@ ps-am: uninstall-am: uninstall-info-am -.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ - clean-generic clean-libtool clean-noinstLTLIBRARIES ctags \ - distclean distclean-compile distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-man install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags uninstall uninstall-am uninstall-info-am +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index 9c2fed70e..58ce284e7 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -4,6 +4,7 @@ #include #include +#include #include "asn1print.h" @@ -12,22 +13,22 @@ printf(fmt, ##args); \ } while(0) -static int asn1print_module(asn1p_module_t *mod, enum asn1print_flags_e flags); -static int asn1print_oid(asn1p_oid_t *oid, enum asn1print_flags_e flags); -static int asn1print_ref(asn1p_ref_t *ref, enum asn1print_flags_e flags); -static int asn1print_tag(asn1p_expr_t *tc, enum asn1print_flags_e flags); -static int asn1print_params(asn1p_paramlist_t *pl,enum asn1print_flags_e flags); -static int asn1print_with_syntax(asn1p_wsyntx_t *wx, enum asn1print_flags_e flags); -static int asn1print_constraint(asn1p_constraint_t *, enum asn1print_flags_e); -static int asn1print_value(asn1p_value_t *val, enum asn1print_flags_e flags); -static int asn1print_expr(asn1p_expr_t *tc, enum asn1print_flags_e flags, +static int asn1print_module(asn1p_t *asn, asn1p_module_t *mod, enum asn1print_flags flags); +static int asn1print_oid(asn1p_oid_t *oid, enum asn1print_flags flags); +static int asn1print_ref(asn1p_ref_t *ref, enum asn1print_flags flags); +static int asn1print_tag(asn1p_expr_t *tc, enum asn1print_flags flags); +static int asn1print_params(asn1p_paramlist_t *pl,enum asn1print_flags flags); +static int asn1print_with_syntax(asn1p_wsyntx_t *wx, enum asn1print_flags flags); +static int asn1print_constraint(asn1p_constraint_t *, enum asn1print_flags); +static int asn1print_value(asn1p_value_t *val, enum asn1print_flags flags); +static int asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1print_flags flags, int level); /* * Print the contents of the parsed ASN tree. */ int -asn1print(asn1p_t *asn, enum asn1print_flags_e flags) { +asn1print(asn1p_t *asn, enum asn1print_flags flags) { asn1p_module_t *mod; if(asn == NULL) { @@ -36,14 +37,14 @@ asn1print(asn1p_t *asn, enum asn1print_flags_e flags) { } TQ_FOR(mod, &(asn->modules), mod_next) { - asn1print_module(mod, flags); + asn1print_module(asn, mod, flags); } return 0; } static int -asn1print_module(asn1p_module_t *mod, enum asn1print_flags_e flags) { +asn1print_module(asn1p_t *asn, asn1p_module_t *mod, enum asn1print_flags flags) { asn1p_expr_t *tc; printf("\n%s ", mod->Identifier); @@ -54,6 +55,10 @@ asn1print_module(asn1p_module_t *mod, enum asn1print_flags_e flags) { printf("DEFINITIONS"); + if(mod->module_flags & MSF_TAG_INSTRUCTIONS) + printf(" TAG INSTRUCTIONS"); + if(mod->module_flags & MSF_XER_INSTRUCTIONS) + printf(" XER INSTRUCTIONS"); if(mod->module_flags & MSF_EXPLICIT_TAGS) printf(" EXPLICIT TAGS"); if(mod->module_flags & MSF_IMPLICIT_TAGS) @@ -67,7 +72,7 @@ asn1print_module(asn1p_module_t *mod, enum asn1print_flags_e flags) { printf("BEGIN\n\n"); TQ_FOR(tc, &(mod->members), next) { - asn1print_expr(tc, flags, 0); + asn1print_expr(asn, mod, tc, flags, 0); printf("\n\n"); } @@ -77,7 +82,7 @@ asn1print_module(asn1p_module_t *mod, enum asn1print_flags_e flags) { } static int -asn1print_oid(asn1p_oid_t *oid, enum asn1print_flags_e flags) { +asn1print_oid(asn1p_oid_t *oid, enum asn1print_flags flags) { int ac; int accum = 0; @@ -107,7 +112,7 @@ asn1print_oid(asn1p_oid_t *oid, enum asn1print_flags_e flags) { } static int -asn1print_ref(asn1p_ref_t *ref, enum asn1print_flags_e flags) { +asn1print_ref(asn1p_ref_t *ref, enum asn1print_flags flags) { int cc; (void)flags; /* Unused argument */ @@ -121,7 +126,7 @@ asn1print_ref(asn1p_ref_t *ref, enum asn1print_flags_e flags) { } static int -asn1print_tag(asn1p_expr_t *tc, enum asn1print_flags_e flags) { +asn1print_tag(asn1p_expr_t *tc, enum asn1print_flags flags) { struct asn1p_type_tag_s *tag = &tc->tag; (void)flags; /* Unused argument */ @@ -152,7 +157,7 @@ asn1print_tag(asn1p_expr_t *tc, enum asn1print_flags_e flags) { } static int -asn1print_value(asn1p_value_t *val, enum asn1print_flags_e flags) { +asn1print_value(asn1p_value_t *val, enum asn1print_flags flags) { if(val == NULL) return 0; @@ -226,7 +231,7 @@ asn1print_value(asn1p_value_t *val, enum asn1print_flags_e flags) { } static int -asn1print_constraint(asn1p_constraint_t *ct, enum asn1print_flags_e flags) { +asn1print_constraint(asn1p_constraint_t *ct, enum asn1print_flags flags) { int symno = 0; if(ct == 0) return 0; @@ -258,8 +263,8 @@ asn1print_constraint(asn1p_constraint_t *ct, enum asn1print_flags_e flags) { case ACT_CT_SIZE: case ACT_CT_FROM: switch(ct->type) { - case ACT_CT_SIZE: printf("SIZE ("); break; - case ACT_CT_FROM: printf("FROM ("); break; + case ACT_CT_SIZE: printf("SIZE("); break; + case ACT_CT_FROM: printf("FROM("); break; default: printf("??? ("); break; } assert(ct->el_count != 0); @@ -278,11 +283,11 @@ asn1print_constraint(asn1p_constraint_t *ct, enum asn1print_flags_e flags) { case ACT_CA_INT: symno++; case ACT_CA_EXC: { - char *symtable[] = { " EXCEPT ", "^", "|", ",", + char *symtable[] = { " EXCEPT ", " ^ ", " | ", ",", "", "(" }; int i; for(i = 0; i < ct->el_count; i++) { - enum asn1print_flags_e nflags = flags; + enum asn1print_flags nflags = flags; if(i) fputs(symtable[symno], stdout); if(ct->type == ACT_CA_CRC) fputs("{", stdout); asn1print_constraint(ct->elements[i], nflags); @@ -305,7 +310,7 @@ asn1print_constraint(asn1p_constraint_t *ct, enum asn1print_flags_e flags) { } static int -asn1print_params(asn1p_paramlist_t *pl, enum asn1print_flags_e flags) { +asn1print_params(asn1p_paramlist_t *pl, enum asn1print_flags flags) { if(pl) { int i; printf("{"); @@ -324,7 +329,7 @@ asn1print_params(asn1p_paramlist_t *pl, enum asn1print_flags_e flags) { } static int -asn1print_with_syntax(asn1p_wsyntx_t *wx, enum asn1print_flags_e flags) { +asn1print_with_syntax(asn1p_wsyntx_t *wx, enum asn1print_flags flags) { if(wx) { asn1p_wsyntx_chunk_t *wc; printf(" WITH SYNTAX {"); @@ -342,7 +347,78 @@ asn1print_with_syntax(asn1p_wsyntx_t *wx, enum asn1print_flags_e flags) { } static int -asn1print_expr(asn1p_expr_t *tc, enum asn1print_flags_e flags, int level) { +asn1print_crange_value(asn1cnst_edge_t *edge, int as_char) { + switch(edge->type) { + case ARE_MIN: printf("MIN"); break; + case ARE_MAX: printf("MAX"); break; + case ARE_VALUE: + if(as_char) { + printf("\"%c\"", (unsigned char)edge->value); + } else { + printf("%lld", (long long)edge->value); + } + } + return 0; +} + +static int +asn1print_constraint_explain_type(asn1p_expr_type_e expr_type, asn1p_constraint_t *ct, enum asn1p_constraint_type_e type) { + asn1cnst_range_t *range; + int as_char = (type==ACT_CT_FROM); + int i; + + range = asn1constraint_compute_PER_range(expr_type, ct, type, 0, 0); + if(!range) return -1; + + switch(type) { + case ACT_CT_FROM: printf("(FROM("); break; + case ACT_CT_SIZE: printf("(SIZE("); break; + default: printf("("); break; + } + for(i = -1; i < range->el_count; i++) { + asn1cnst_range_t *r; + if(i == -1) { + if(range->el_count) continue; + r = range; + } else { + r = range->elements[i]; + } + if(i > 0) { + printf(" | "); + } + asn1print_crange_value(&r->left, as_char); + if(r->left.type != r->right.type + || r->left.value != r->right.value) { + printf(".."); + asn1print_crange_value(&r->right, as_char); + } + } + if(range->extensible) + printf(",..."); + printf(type==ACT_EL_RANGE?")":"))"); + + if(range->empty_constraint) + printf(":Empty!"); + + asn1constraint_range_free(range); + return 0; +} + +static int +asn1print_constraint_explain(asn1p_expr_type_e expr_type, + asn1p_constraint_t *ct) { + + asn1print_constraint_explain_type(expr_type, ct, ACT_EL_RANGE); + printf(" "); + asn1print_constraint_explain_type(expr_type, ct, ACT_CT_SIZE); + printf(" "); + asn1print_constraint_explain_type(expr_type, ct, ACT_CT_FROM); + + return 0; +} + +static int +asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1print_flags flags, int level) { if(flags & APF_LINE_COMMENTS) INDENT("-- #line %d\n", tc->_lineno); @@ -413,7 +489,7 @@ asn1print_expr(asn1p_expr_t *tc, enum asn1print_flags_e flags, int level) { /* * Print the expression as it were stand-alone type. */ - asn1print_expr(se, flags, level + 4); + asn1print_expr(asn, mod, se, flags, level + 4); switch(se->marker) { case EM_NOMARK: break; case EM_OPTIONAL: printf(" OPTIONAL"); break; @@ -440,6 +516,7 @@ asn1print_expr(asn1p_expr_t *tc, enum asn1print_flags_e flags, int level) { printf(" "); asn1print_constraint(tc->constraints, flags); } + if(tc->unique) { printf(" UNIQUE"); } @@ -455,5 +532,22 @@ asn1print_expr(asn1p_expr_t *tc, enum asn1print_flags_e flags, int level) { printf(")"); } + if(flags & APF_DEBUG_CONSTRAINTS) { + asn1p_expr_t *top_parent; + + if(tc->combined_constraints) { + printf("\n-- Combined constraints: "); + asn1print_constraint(tc->combined_constraints, flags); + } + + top_parent = asn1f_find_terminal_type_ex(asn, mod, tc, NULL); + if(top_parent) { + printf("\n-- PER-visible constraints: "); + asn1print_constraint_explain(top_parent->expr_type, + tc->combined_constraints); + } + } + return 0; } + diff --git a/libasn1print/asn1print.h b/libasn1print/asn1print.h index 115e186cf..c24e58e87 100644 --- a/libasn1print/asn1print.h +++ b/libasn1print/asn1print.h @@ -1,15 +1,16 @@ #ifndef _ASN1PRINT_H_ #define _ASN1PRINT_H_ -enum asn1print_flags_e { - APF_NOFLAGS = 0x00, - APF_LINE_COMMENTS = 0x01, +enum asn1print_flags { + APF_NOFLAGS, + APF_LINE_COMMENTS = 0x01, /* Include line comments */ + APF_DEBUG_CONSTRAINTS = 0x02, /* Explain constraints */ }; /* * Print the contents of the parsed ASN.1 syntax tree. */ -int asn1print(asn1p_t *asn, enum asn1print_flags_e flags); +int asn1print(asn1p_t *asn, enum asn1print_flags flags); #endif /* _ASN1PRINT_H_ */ From 95a9b053e423b5e001100b3f7c6a930290ed26a3 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 18 Aug 2004 04:51:56 +0000 Subject: [PATCH 0125/1469] prettyfying git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@125 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/Makefile.am | 10 +++++----- asn1c/Makefile.in | 20 +++++++++++--------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/asn1c/Makefile.am b/asn1c/Makefile.am index b883f6225..21da616d3 100644 --- a/asn1c/Makefile.am +++ b/asn1c/Makefile.am @@ -8,13 +8,13 @@ AM_CPPFLAGS = \ -I${top_srcdir}/libasn1print \ -I${top_srcdir}/libasn1fix \ -I${top_srcdir}/skeletons \ - -DDATADIR=\"${pkgdatadir}\" + -DDATADIR=\"$(pkgdatadir)\" LDADD = \ - ${top_builddir}/libasn1parser/libasn1parser.la \ - ${top_builddir}/libasn1fix/libasn1fix.la \ - ${top_builddir}/libasn1print/libasn1print.la \ - ${top_builddir}/libasn1compiler/libasn1compiler.la + $(top_builddir)/libasn1parser/libasn1parser.la \ + $(top_builddir)/libasn1print/libasn1print.la \ + $(top_builddir)/libasn1fix/libasn1fix.la \ + $(top_builddir)/libasn1compiler/libasn1compiler.la asn1c_SOURCES = asn1c.c \ tlv_decoder.c tlv_decoder.h diff --git a/asn1c/Makefile.in b/asn1c/Makefile.in index 311957cf5..5267aa3a1 100644 --- a/asn1c/Makefile.in +++ b/asn1c/Makefile.in @@ -56,10 +56,11 @@ PROGRAMS = $(bin_PROGRAMS) am_asn1c_OBJECTS = asn1c.$(OBJEXT) tlv_decoder.$(OBJEXT) asn1c_OBJECTS = $(am_asn1c_OBJECTS) asn1c_LDADD = $(LDADD) -asn1c_DEPENDENCIES = ${top_builddir}/libasn1parser/libasn1parser.la \ - ${top_builddir}/libasn1fix/libasn1fix.la \ - ${top_builddir}/libasn1print/libasn1print.la \ - ${top_builddir}/libasn1compiler/libasn1compiler.la +asn1c_DEPENDENCIES = $(top_builddir)/libasn1parser/libasn1parser.la \ + $(top_builddir)/libasn1print/libasn1print.la \ + $(top_builddir)/libasn1fix/libasn1fix.la \ + $(top_builddir)/libasn1cnst/libasn1cnst.la \ + $(top_builddir)/libasn1compiler/libasn1compiler.la DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @@ -206,13 +207,14 @@ AM_CPPFLAGS = \ -I${top_srcdir}/libasn1print \ -I${top_srcdir}/libasn1fix \ -I${top_srcdir}/skeletons \ - -DDATADIR=\"${pkgdatadir}\" + -DDATADIR=\"$(pkgdatadir)\" LDADD = \ - ${top_builddir}/libasn1parser/libasn1parser.la \ - ${top_builddir}/libasn1fix/libasn1fix.la \ - ${top_builddir}/libasn1print/libasn1print.la \ - ${top_builddir}/libasn1compiler/libasn1compiler.la + $(top_builddir)/libasn1parser/libasn1parser.la \ + $(top_builddir)/libasn1print/libasn1print.la \ + $(top_builddir)/libasn1fix/libasn1fix.la \ + $(top_builddir)/libasn1cnst/libasn1cnst.la \ + $(top_builddir)/libasn1compiler/libasn1compiler.la asn1c_SOURCES = asn1c.c \ tlv_decoder.c tlv_decoder.h From 7ddf016f71b6bf4814e2b301398bf1e1ddeb1458 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 18 Aug 2004 04:52:12 +0000 Subject: [PATCH 0126/1469] treat embedded zeroes well git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@126 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/check-parsing.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asn1c/check-parsing.sh b/asn1c/check-parsing.sh index dc20acaab..ca00c5f0f 100755 --- a/asn1c/check-parsing.sh +++ b/asn1c/check-parsing.sh @@ -10,7 +10,7 @@ for ref in ../tests/*.asn1.-*; do echo "Checking $src against $ref" ./asn1c "-$flags" "$src" > "$tmpfile" || ec=$? if [ $? = 0 ]; then - diff -u "$ref" "$tmpfile" || ec=$? + diff -a -u "$ref" "$tmpfile" || ec=$? fi rm -f "$tmpfile" done From 8657d0369aa197e2ea57b0fda81995f95131a6c7 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 18 Aug 2004 04:52:48 +0000 Subject: [PATCH 0127/1469] -print-constraints git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@127 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/asn1c.c | 82 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 33 deletions(-) diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index 1fc9e559b..c8a58272d 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -28,7 +28,7 @@ main(int ac, char **av) { enum asn1p_flags asn1_parser_flags = A1P_NOFLAGS; enum asn1f_flags asn1_fixer_flags = A1F_NOFLAGS; enum asn1c_flags asn1_compiler_flags= A1C_NOFLAGS; - enum asn1print_flags_e asn1_print_flags = APF_NOFLAGS; + enum asn1print_flags asn1_printer_flags = APF_NOFLAGS; int print_arg__print_out = 0; /* Don't compile, just print parsed */ int print_arg__fix_n_print = 0; /* Fix and print */ int warnings_as_errors = 0; /* Treat warnings as errors */ @@ -41,7 +41,7 @@ main(int ac, char **av) { /* * Process command-line options. */ - while((ch = getopt(ac, av, "EFf:LPRS:t:W:")) != -1) + while((ch = getopt(ac, av, "EFf:LPp:RS:t:W:")) != -1) switch(ch) { case 'E': print_arg__print_out = 1; @@ -70,11 +70,19 @@ main(int ac, char **av) { } break; case 'L': - asn1_print_flags |= APF_LINE_COMMENTS; + asn1_printer_flags |= APF_LINE_COMMENTS; break; case 'P': asn1_compiler_flags |= A1C_PRINT_COMPILED; break; + case 'p': + if(strcmp(optarg, "rint-constraints") == 0) { + asn1_printer_flags |= APF_DEBUG_CONSTRAINTS; + } else { + fprintf(stderr, "-p%s: Invalid argument\n", optarg); + exit(EX_USAGE); + } + break; case 'R': asn1_compiler_flags |= A1C_OMIT_SUPPORT_CODE; break; @@ -115,6 +123,12 @@ main(int ac, char **av) { fprintf(stderr, "Error: -F requires -E\n"); exit(EX_USAGE); } + if(asn1_printer_flags) { + fprintf(stderr, "Error: " + "-L and -print-constraints " + "require -E\n"); + exit(EX_USAGE); + } } /* @@ -160,7 +174,7 @@ main(int ac, char **av) { * Dump the parsed ASN.1 tree if -E specified and -F is NOT given. */ if(print_arg__print_out && !print_arg__fix_n_print) { - if(asn1print(asn, asn1_print_flags)) + if(asn1print(asn, asn1_printer_flags)) exit(EX_SOFTWARE); return 0; } @@ -187,7 +201,7 @@ main(int ac, char **av) { * Dump the parsed ASN.1 tree if -E specified and -F is given. */ if(print_arg__print_out && print_arg__fix_n_print) { - if(asn1print(asn, asn1_print_flags)) + if(asn1print(asn, asn1_printer_flags)) exit(EX_SOFTWARE); return 0; } @@ -241,36 +255,38 @@ main(int ac, char **av) { static void usage(char *av0) { fprintf(stderr, - "ASN.1 Compiler, v" VERSION "\n" - "Copyright (c) 2003, 2004 Lev Walkin \n" - "Usage: %s [options] ...\n" - "Where [options] are:\n" - "\t-E\tRun only the ASN.1 parser and print out the tree\n" - "\t-F\tDuring -E operation, also perform tree fixing\n" - "\t-L\tGenerate \"-- #line\" comments in -E output\n" - "\n" - "\t-P \tConcatenate and print the compiled text\n" - "\t-S

+Contents +

\tDirectory with support (skeleton?) files\n" - "\t \t(Default is \"%s\")\n" - "\t-R \tRestrict output (tables only, no support code)\n" - "\n" - "\t-t \tDecode the given tag[/length] sequence\n" - "\n" - "\t-ftypes88\tUse only ASN.1:1988 embedded types\n" + "ASN.1 Compiler, v" VERSION "\n" + "Copyright (c) 2003, 2004 Lev Walkin \n" + "Usage: %s [options] ...\n" + "Where [options] are:\n" + "\t-E\tRun only the ASN.1 parser and print out the tree\n" + "\t-F\tDuring -E operation, also perform tree fixing\n" + "\t-L\tGenerate \"-- #line\" comments in -E output\n" + "\n" + "\t-P \tConcatenate and print the compiled text\n" + "\t-S \tDirectory with support (skeleton?) files\n" + "\t \t(Default is \"%s\")\n" + "\t-R \tRestrict output (tables only, no support code)\n" + "\n" + "\t-t \tDecode the given tag[/length] sequence\n" + "\n" + "\t-ftypes88\tUse only ASN.1:1988 embedded types\n" /* - "\t-fconstr90\tUse only ASN.1:1990 constructs (not available)\n" + "\t-fconstr90\tUse only ASN.1:1990 constructs (not available)\n" */ - "\t-fknown-extern-type=\tPretend this type is known\n" - "\t-fnative-integers\tUse int instead of INTEGER_t whenever possible\n" - "\t-fno-c99\tDisable C99 extensions\n" - "\t-funnamed-unions\tEnable unnamed unions in structures\n" - "\n" - "\t-Werror \tTreat warnings as errors; abort if any warning\n" - "\t-Wdebug-lexer\tEnable verbose debugging output from lexer\n" - "\t-Wdebug-fixer\tDebug ASN.1 semantics processor\n" - "\t-Wdebug-compiler\tDebug ASN.1 compiler\n" - , - a1c_basename(av0), DATADIR + "\t-fknown-extern-type=\tPretend this type is known\n" + "\t-fnative-integers\tUse int instead of INTEGER_t whenever possible\n" + "\t-fno-c99\tDisable C99 extensions\n" + "\t-funnamed-unions\tEnable unnamed unions in structures\n" + "\n" + "\t-print-constraints\tExplain subtype constraints (debug)\n" + "\n" + "\t-Werror \tTreat warnings as errors; abort if any warning\n" + "\t-Wdebug-lexer\tEnable verbose debugging output from lexer\n" + "\t-Wdebug-fixer\tDebug ASN.1 semantics processor\n" + "\t-Wdebug-compiler\tDebug ASN.1 compiler\n" + , + a1c_basename(av0), DATADIR ); exit(EX_USAGE); } From c519061d8440a39c41f22c167dfc80419efacbfb Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 18 Aug 2004 04:53:32 +0000 Subject: [PATCH 0128/1469] anti-warnings git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@128 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OCTET_STRING.c | 3 ++- skeletons/constr_CHOICE.c | 2 +- skeletons/constr_SEQUENCE.c | 2 +- skeletons/constr_SET.c | 2 +- skeletons/constr_SET_OF.c | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index e246314ec..e0a7bb284 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -316,7 +316,8 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, assert(sel->left >= 0); - len = ((ber_tlv_len_t)size < sel->left) ? size : sel->left; + len = ((ber_tlv_len_t)size < sel->left) + ? (ber_tlv_len_t)size : sel->left; if(len > 0) { if(is_bit_str && sel->bits_chopped == 0) { /* diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index a63d6fbaf..4aaad2391 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -10,7 +10,7 @@ * (ctx->left) indicates the number of bytes _transferred_ for the structure. * (size) contains the number of bytes in the buffer passed. */ -#define LEFT ((size<(size_t)ctx->left)?size:ctx->left) +#define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) /* * If the subprocessor function returns with an indication that it wants diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index fd0f59a14..6e1747cfa 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -10,7 +10,7 @@ * (ctx->left) indicates the number of bytes _transferred_ for the structure. * (size) contains the number of bytes in the buffer passed. */ -#define LEFT ((size<(size_t)ctx->left)?size:ctx->left) +#define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) /* * If the subprocessor function returns with an indication that it wants diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index 2602b8028..d1036c94f 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -16,7 +16,7 @@ * (ctx->left) indicates the number of bytes _transferred_ for the structure. * (size) contains the number of bytes in the buffer passed. */ -#define LEFT ((size<(size_t)ctx->left)?size:ctx->left) +#define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) /* * If the subprocessor function returns with an indication that it wants diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index 4b2ae3a49..511207d2a 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -10,7 +10,7 @@ * (ctx->left) indicates the number of bytes _transferred_ for the structure. * (size) contains the number of bytes in the buffer passed. */ -#define LEFT ((size<(size_t)ctx->left)?size:ctx->left) +#define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) /* * If the subprocessor function returns with an indication that it wants From ffa901e164b1af366a116d61b2036809fde4735f Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 18 Aug 2004 04:54:10 +0000 Subject: [PATCH 0129/1469] new files for testing subtype constraints support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@129 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/50-constraint-OK.asn1 | 42 ++++++++++++++++++ ...50-constraint-OK.asn1.-EFprint-constraints | Bin 0 -> 2967 bytes tests/51-constraint-SE.asn1 | 16 +++++++ tests/52-constraint-SE.asn1 | 16 +++++++ tests/53-constraint-SE.asn1 | 16 +++++++ tests/54-constraint-SE.asn1 | 17 +++++++ 6 files changed, 107 insertions(+) create mode 100644 tests/50-constraint-OK.asn1 create mode 100644 tests/50-constraint-OK.asn1.-EFprint-constraints create mode 100644 tests/51-constraint-SE.asn1 create mode 100644 tests/52-constraint-SE.asn1 create mode 100644 tests/53-constraint-SE.asn1 create mode 100644 tests/54-constraint-SE.asn1 diff --git a/tests/50-constraint-OK.asn1 b/tests/50-constraint-OK.asn1 new file mode 100644 index 000000000..27af95d19 --- /dev/null +++ b/tests/50-constraint-OK.asn1 @@ -0,0 +1,42 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .50 + +ModuleNestedConstraintsCheck + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 50 } + DEFINITIONS ::= +BEGIN + + Int1 ::= INTEGER + Int2 ::= Int1 (0..MAX) -- X.680-0207::41.4.4 + Int3 ::= Int2 (MIN..ten) -- Means (0..10) + Int4 ::= Int3 (5..MAX,...,1..4) -- Means (5..10,...,1..4) + Int5 ::= Int4 (MIN..5) -- Means (5) + + ten Int1 ::= other-ten + other-ten Int2 ::= 10 + + -- G.4.3.4 + ExtensibleExtensions ::= INTEGER ((1..256,...) INTERSECTION (1..256)) + + Str1 ::= IA5String + Str2 ::= Str1 (SIZE(MIN..20 | 25..30)) + -- Means (SIZE(0..20 | 25..30)) + Str3 ::= Str2 (SIZE(10..27))(FROM("ABC"|"def")) + -- (SIZE(10..20,25..27))(FROM("ABCdef")) + + PER-Visible ::= IA5String (FROM("A".."F")) + PER-Visible-2 ::= PER-Visible (FROM("E".."F")) -- Means (FROM("EF")) + -- The following maintain parent permitted alphabet constraint + Not-PER-Visible-1 ::= PER-Visible (FROM("AB") | SIZE(1..2)) + Not-PER-Visible-2 ::= PER-Visible (FROM("AB",...)) + Not-PER-Visible-3 ::= PER-Visible (FROM("AB"),...) + SIZE-but-not-FROM ::= PER-Visible (SIZE(1..4) ^ FROM("ABCD",...)) + SIZE-and-FROM ::= PER-Visible (SIZE(1..4) ^ FROM("ABCD")) + Neither-SIZE-nor-FROM ::= PER-Visible (SIZE(1..4) | FROM("ABCD",...)) + +END diff --git a/tests/50-constraint-OK.asn1.-EFprint-constraints b/tests/50-constraint-OK.asn1.-EFprint-constraints new file mode 100644 index 0000000000000000000000000000000000000000..694f7766fb54b2625813f6029830feb4134e110e GIT binary patch literal 2967 zcmb_e%Wj)M6zw+i6(d$NQb2%>t6J*94-&C3sqCn#x`PBqyQw81>!eM((Cv#o&(o~U*fs@lvnv`L*RNRdI-@h zNj+~i`i3Et&`?1|4&DCW zF!dmcq?L2e^Ued$}66C>({4e{-xHGyTM8P1#qo2od7t52Jx9&<)f-aa&2+Aofz!d3a40tkhdE ziuiL*@4A)+Et2oC*#!*I#r$f9oDYuYIsY6kT%=Z|k{l{ru2ty6XBhI)>-nt)B|$U7 z?r*oaTY-Cg%|g}oNyQ2l@a+sgVytbA#uJB&b~17+yxF(JqPb(z?zW^pQ%51x_!@}@ zXtCl^>IEY4SAEgRJJ57{4|dV+O?6ljn8@ye^=-GWQ>LklbJfJu zHX%*zGAA2p^p-NvqcuWVRr&o#)4scrDB z>UYRDi`J=L30K=|slNoZY^+r{-Xh;kxEKU?^~hYxCrA*>kHDUAGb?=zZ=lvTo=lH# zz~MyQZOQ)zO{*&nEopY7nWOf=W<(` Date: Wed, 18 Aug 2004 04:59:12 +0000 Subject: [PATCH 0130/1469] new style constraints implementation support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@130 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/Makefile.in | 4 +- libasn1parser/asn1p_constr.c | 39 + libasn1parser/asn1p_constr.h | 2 + libasn1parser/asn1p_expr.c | 3 + libasn1parser/asn1p_expr.h | 6 + libasn1parser/asn1p_l.c | 3259 ++++++++++++++++++---------------- libasn1parser/asn1p_l.l | 35 +- libasn1parser/asn1p_module.h | 13 +- libasn1parser/asn1p_y.c | 2098 +++++++++++----------- libasn1parser/asn1p_y.h | 126 +- libasn1parser/asn1p_y.y | 188 +- 11 files changed, 3028 insertions(+), 2745 deletions(-) diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index 375d37e2b..4af09101c 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -546,9 +546,9 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." - -rm -f asn1p_y.h - -rm -f asn1p_y.c -rm -f asn1p_l.c + -rm -f asn1p_y.c + -rm -f asn1p_y.h clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ diff --git a/libasn1parser/asn1p_constr.c b/libasn1parser/asn1p_constr.c index faec6f2e7..26f920f4d 100644 --- a/libasn1parser/asn1p_constr.c +++ b/libasn1parser/asn1p_constr.c @@ -108,3 +108,42 @@ asn1p_constraint_insert(asn1p_constraint_t *into, asn1p_constraint_t *what) { return 0; } + + +char * +asn1p_constraint_type2str(enum asn1p_constraint_type_e type) { + switch(type) { + case ACT_INVALID: + return "INVALID"; + case ACT_EL_VALUE: + return "SingleValue"; + case ACT_EL_RANGE: + case ACT_EL_LLRANGE: + case ACT_EL_RLRANGE: + case ACT_EL_ULRANGE: + return "ValueRange"; + case ACT_EL_EXT: + return "..."; + case ACT_CT_SIZE: + return "SizeConstraint"; + case ACT_CT_FROM: + return "PermittedAlphabet"; + case ACT_CT_WCOMP: + return "SingleTypeConstraint"; + case ACT_CT_WCOMPS: + return "MultipleTypeConstraints"; + case ACT_CA_SET: + return "SET"; + case ACT_CA_CRC: + return "ComponentRelationConstraint"; + case ACT_CA_CSV: + return "CSV"; + case ACT_CA_UNI: + return "UNION"; + case ACT_CA_INT: + return "INTERSECTION"; + case ACT_CA_EXC: + return "EXCEPT"; + } + return "UNKNOWN"; +} diff --git a/libasn1parser/asn1p_constr.h b/libasn1parser/asn1p_constr.h index 19099b2fe..d3756780b 100644 --- a/libasn1parser/asn1p_constr.h +++ b/libasn1parser/asn1p_constr.h @@ -59,6 +59,8 @@ typedef struct asn1p_constraint_s { int _lineno; /* Position in a source file */ } asn1p_constraint_t; +/* Human-readable constraint type description */ +char *asn1p_constraint_type2str(enum asn1p_constraint_type_e); /* * Constructors and a recursive destructor. diff --git a/libasn1parser/asn1p_expr.c b/libasn1parser/asn1p_expr.c index 23ab4cb36..be9da7734 100644 --- a/libasn1parser/asn1p_expr.c +++ b/libasn1parser/asn1p_expr.c @@ -57,6 +57,7 @@ asn1p_expr_clone(asn1p_expr_t *expr) { CLCLONE(Identifier, strdup); CLCLONE(reference, asn1p_ref_clone); CLCLONE(constraints, asn1p_constraint_clone); + CLCLONE(combined_constraints, asn1p_constraint_clone); CLCLONE(params, asn1p_paramlist_clone); CLCLONE(value, asn1p_value_clone); CLCLONE(with_syntax, asn1p_wsyntx_clone); @@ -90,6 +91,8 @@ asn1p_expr_free(asn1p_expr_t *expr) { asn1p_ref_free(expr->reference); if(expr->constraints) asn1p_constraint_free(expr->constraints); + if(expr->combined_constraints) + asn1p_constraint_free(expr->combined_constraints); if(expr->params) asn1p_paramlist_free(expr->params); if(expr->value) diff --git a/libasn1parser/asn1p_expr.h b/libasn1parser/asn1p_expr.h index 331285c71..ef1941b7f 100644 --- a/libasn1parser/asn1p_expr.h +++ b/libasn1parser/asn1p_expr.h @@ -124,6 +124,12 @@ typedef struct asn1p_expr_s { */ asn1p_constraint_t *constraints; + /* + * This field is holding the transformed constraints, with all the + * parent constraints taken into account. + */ + asn1p_constraint_t *combined_constraints; + /* * A list of parameters for parametrized type declaration * (AMT_PARAMTYPE). diff --git a/libasn1parser/asn1p_l.c b/libasn1parser/asn1p_l.c index bbddbcc03..f40f7a384 100644 --- a/libasn1parser/asn1p_l.c +++ b/libasn1parser/asn1p_l.c @@ -16,12 +16,11 @@ #define yytext asn1p_text #define yylineno asn1p_lineno -#line 20 "lex.yy.c" +#line 20 "asn1p_l.c" /* A lexical scanner generated by flex */ /* Scanner skeleton version: * $Header$ - * $FreeBSD: src/usr.bin/lex/flex.skl,v 1.4 1999/10/27 07:56:44 obrien Exp $ */ #define FLEX_SCANNER @@ -313,220 +312,235 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 123 -#define YY_END_OF_BUFFER 124 -static yyconst short int yy_acclist[1196] = +#define YY_NUM_RULES 132 +#define YY_END_OF_BUFFER 133 +static yyconst short int yy_acclist[1291] = { 0, - 124, 122, 123, 117, 122, 123, 117, 123, 116, 122, - 123, 15, 122, 123, 116, 122, 123, 122, 123, 116, - 122, 123, 122, 123, 116, 122, 123, 122, 123, 23, - 122, 123, 22, 122, 123, 116, 122, 123, 122, 123, - 111, 112, 122, 123, 111, 112, 122, 123, 111, 112, - 122, 123, 111, 112, 122, 123, 111, 112, 122, 123, - 111, 112, 122, 123, 111, 112, 122, 123, 111, 112, - 122, 123, 111, 112, 122, 123, 111, 112, 122, 123, - 111, 112, 122, 123, 111, 112, 122, 123, 111, 112, - 122, 123, 111, 112, 122, 123, 111, 112, 122, 123, - - 111, 112, 122, 123, 111, 112, 122, 123, 111, 112, - 122, 123, 111, 112, 122, 123, 116, 122, 123, 110, - 122, 123, 5, 122, 123, 2, 123, 2, 122, 123, - 4, 122, 123, 7, 9, 122, 123, 7, 123, 9, - 122, 123, 9, 122, 123, 17, 122, 123, 17, 123, - 18, 122, 123, 12, 122, 123, 12, 123, 14, 122, - 123, 14, 122, 123, 10, 122, 123, 11, 122, 123, - 119, 122, 123, 120, 122, 123, 120, 123, 122, 123, - 121, 122, 123, 117, 15, 15, 108, 109, 1, 21, - 115, 6, 22, 111, 112, 111, 112, 111, 112, 111, - - 112, 111, 112, 111, 112, 112, 111, 112, 111, 112, - 111, 112, 111, 112, 36, 111, 112, 111, 112, 111, - 112, 111, 112, 111, 112, 111, 112, 111, 112, 111, - 112, 111, 112, 111, 112, 112, 112, 111, 112, 111, - 112, 111, 112, 111, 112, 111, 112, 111, 112, 111, - 112, 111, 112, 112, 111, 112, 111, 112, 79, 111, - 112, 111, 112, 112, 111, 112, 111, 112, 111, 112, - 111, 112, 112, 111, 112, 111, 112, 111, 112, 111, - 112, 111, 112, 111, 112, 111, 112, 111, 112, 111, - 112, 112, 111, 112, 111, 112, 112, 112, 111, 112, - - 110, 5, 3, 8, 17, 16, 12, 119, 120, 118, - 108, 109, 21, 114, 113, 111, 112, 28, 111, 112, - 29, 111, 112, 111, 112, 111, 112, 111, 112, 33, - 111, 112, 111, 112, 111, 112, 111, 112, 111, 112, - 111, 112, 111, 112, 111, 112, 111, 112, 111, 112, - 111, 112, 49, 111, 112, 111, 112, 111, 112, 111, - 112, 111, 112, 111, 112, 111, 112, 112, 112, 111, - 112, 111, 112, 111, 112, 111, 112, 111, 112, 111, - 112, 111, 112, 71, 111, 112, 72, 111, 112, 111, - 112, 112, 111, 112, 111, 112, 111, 112, 112, 111, - - 112, 82, 111, 112, 111, 112, 111, 112, 111, 112, - 112, 111, 112, 111, 112, 111, 112, 90, 111, 112, - 111, 112, 111, 112, 111, 112, 111, 112, 111, 112, - 111, 112, 111, 112, 112, 111, 112, 111, 112, 111, - 112, 112, 112, 112, 111, 112, 24, 13, 20, 19, - 111, 112, 111, 112, 111, 112, 111, 112, 111, 112, - 111, 112, 111, 112, 111, 112, 111, 112, 111, 112, - 111, 112, 111, 112, 111, 112, 111, 112, 111, 112, - 111, 112, 111, 112, 111, 112, 111, 112, 111, 112, - 111, 112, 111, 112, 111, 112, 57, 111, 112, 112, - - 112, 111, 112, 111, 112, 111, 112, 111, 112, 111, - 112, 111, 112, 111, 112, 111, 112, 111, 112, 74, - 111, 112, 112, 111, 112, 111, 112, 111, 112, 112, - 111, 112, 111, 112, 111, 112, 111, 112, 112, 87, - 111, 112, 111, 112, 111, 112, 91, 111, 112, 111, - 112, 111, 112, 111, 112, 95, 111, 112, 97, 111, - 112, 111, 112, 112, 111, 112, 111, 112, 111, 112, - 111, 112, 111, 112, 112, 112, 112, 107, 111, 112, - 111, 112, 111, 112, 111, 112, 111, 112, 32, 111, - 112, 112, 111, 112, 111, 112, 111, 112, 39, 111, - - 112, 111, 112, 111, 112, 111, 112, 111, 112, 111, - 112, 111, 112, 111, 112, 111, 112, 111, 112, 111, - 112, 111, 112, 111, 112, 111, 112, 56, 111, 112, - 112, 112, 112, 111, 112, 111, 112, 111, 112, 111, - 112, 111, 112, 111, 112, 111, 112, 111, 112, 111, - 112, 112, 111, 112, 78, 111, 112, 111, 112, 112, - 111, 112, 111, 112, 111, 112, 111, 112, 112, 111, - 112, 111, 112, 111, 112, 111, 112, 112, 111, 112, - 112, 99, 111, 112, 111, 112, 111, 112, 112, 111, - 112, 112, 112, 112, 25, 26, 111, 112, 111, 112, - - 111, 112, 111, 112, 112, 111, 112, 111, 112, 38, - 111, 112, 111, 112, 111, 112, 111, 112, 111, 112, - 111, 112, 111, 112, 111, 112, 111, 112, 111, 112, - 51, 111, 112, 111, 112, 111, 112, 111, 112, 111, - 112, 112, 112, 112, 111, 112, 111, 112, 111, 112, - 111, 112, 111, 112, 111, 112, 111, 112, 111, 112, - 111, 112, 111, 112, 112, 76, 111, 112, 111, 112, - 112, 111, 112, 111, 112, 111, 112, 111, 112, 112, - 111, 112, 111, 112, 92, 111, 112, 93, 111, 112, - 112, 111, 112, 112, 100, 111, 112, 111, 112, 112, - - 112, 112, 112, 112, 111, 112, 111, 112, 111, 112, - 112, 35, 111, 112, 111, 112, 111, 112, 111, 112, - 111, 112, 44, 111, 112, 45, 111, 112, 111, 112, - 111, 112, 48, 111, 112, 111, 112, 111, 112, 53, - 111, 112, 111, 112, 111, 112, 112, 112, 112, 111, - 112, 111, 112, 64, 111, 112, 65, 111, 112, 111, - 112, 111, 112, 68, 111, 112, 111, 112, 111, 112, - 111, 112, 112, 111, 112, 112, 81, 111, 112, 111, - 112, 84, 111, 112, 86, 111, 112, 112, 111, 112, - 111, 112, 112, 111, 112, 112, 111, 112, 103, 112, - - 112, 112, 112, 112, 111, 112, 111, 112, 111, 112, - 112, 111, 112, 111, 112, 111, 112, 111, 112, 111, - 112, 47, 111, 112, 111, 112, 52, 111, 112, 111, - 112, 55, 111, 112, 112, 112, 112, 112, 111, 112, - 63, 111, 112, 66, 111, 112, 67, 111, 112, 111, - 112, 112, 111, 112, 112, 80, 111, 112, 112, 111, - 112, 112, 111, 112, 89, 111, 112, 112, 111, 112, - 112, 111, 112, 112, 112, 112, 112, 111, 112, 111, - 112, 31, 111, 112, 34, 112, 37, 111, 112, 40, - 111, 112, 111, 112, 111, 112, 111, 112, 111, 112, - - 111, 112, 112, 112, 112, 61, 112, 111, 112, 111, - 112, 112, 111, 112, 112, 112, 111, 112, 112, 111, - 112, 94, 112, 111, 112, 112, 101, 111, 112, 112, - 112, 112, 112, 111, 112, 111, 112, 41, 111, 112, - 42, 111, 112, 43, 111, 112, 111, 112, 50, 111, - 112, 111, 112, 112, 112, 112, 62, 111, 112, 111, - 112, 112, 111, 112, 112, 112, 111, 112, 112, 111, - 112, 111, 112, 112, 104, 112, 112, 112, 112, 111, - 112, 30, 111, 112, 46, 111, 112, 111, 112, 112, - 112, 112, 111, 112, 112, 111, 112, 112, 112, 111, - - 112, 112, 111, 112, 111, 112, 112, 112, 112, 112, - 24, 25, 111, 112, 111, 112, 112, 112, 112, 69, - 111, 112, 70, 112, 111, 112, 112, 112, 111, 112, - 112, 88, 111, 112, 111, 112, 112, 112, 112, 112, - 111, 112, 54, 111, 112, 59, 112, 112, 60, 112, - 111, 112, 75, 112, 112, 83, 111, 112, 112, 111, - 112, 96, 112, 112, 112, 106, 112, 111, 112, 112, - 73, 111, 112, 112, 112, 111, 112, 112, 105, 112, - 27, 111, 112, 58, 112, 112, 85, 112, 98, 111, - 112, 102, 112, 77, 112 - + 133, 131, 132, 125, 131, 132, 125, 132, 124, 131, + 132, 15, 131, 132, 124, 131, 132, 131, 132, 124, + 131, 132, 131, 132, 124, 131, 132, 131, 132, 29, + 131, 132, 28, 131, 132, 124, 131, 132, 131, 132, + 119, 120, 131, 132, 119, 120, 131, 132, 119, 120, + 131, 132, 119, 120, 131, 132, 119, 120, 131, 132, + 119, 120, 131, 132, 119, 120, 131, 132, 119, 120, + 131, 132, 119, 120, 131, 132, 119, 120, 131, 132, + 119, 120, 131, 132, 119, 120, 131, 132, 119, 120, + 131, 132, 119, 120, 131, 132, 119, 120, 131, 132, + + 119, 120, 131, 132, 119, 120, 131, 132, 119, 120, + 131, 132, 119, 120, 131, 132, 124, 131, 132, 130, + 131, 132, 118, 131, 132, 124, 130, 131, 132, 5, + 131, 132, 2, 132, 2, 131, 132, 4, 131, 132, + 7, 9, 131, 132, 7, 132, 9, 131, 132, 9, + 131, 132, 17, 131, 132, 17, 132, 18, 131, 132, + 12, 131, 132, 12, 132, 14, 131, 132, 14, 131, + 132, 10, 131, 132, 11, 131, 132, 21, 23, 131, + 132, 23, 131, 132, 24, 132, 21, 22, 23, 131, + 132, 21, 22, 23, 131, 132, 127, 131, 132, 128, + + 131, 132, 128, 132, 131, 132, 129, 131, 132, 125, + 15, 15, 116, 117, 1, 27, 123, 6, 28, 119, + 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 120, 119, 120, 119, 120, 119, 120, 119, 120, + 42, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 120, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 119, 120, 119, 120, 120, + 119, 120, 119, 120, 87, 119, 120, 119, 120, 120, + 119, 120, 119, 120, 119, 120, 119, 120, 120, 119, + + 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 119, 120, 120, 119, 120, + 119, 120, 120, 120, 119, 120, 118, 5, 3, 8, + 17, 16, 12, 21, 21, 22, 21, 22, 127, 128, + 126, 116, 117, 27, 122, 121, 119, 120, 34, 119, + 120, 35, 119, 120, 119, 120, 119, 120, 119, 120, + 39, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 56, 119, 120, 119, 120, 119, 120, + 119, 120, 119, 120, 119, 120, 119, 120, 120, 120, + + 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, + 119, 120, 119, 120, 79, 119, 120, 80, 119, 120, + 119, 120, 120, 119, 120, 119, 120, 119, 120, 120, + 119, 120, 90, 119, 120, 119, 120, 119, 120, 119, + 120, 120, 119, 120, 119, 120, 119, 120, 98, 119, + 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 120, 119, 120, 119, 120, + 119, 120, 120, 120, 120, 119, 120, 30, 13, 21, + 22, 20, 21, 22, 26, 25, 119, 120, 119, 120, + 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, + + 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, + 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, + 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, + 119, 120, 64, 119, 120, 120, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 82, 119, 120, 120, 119, + 120, 119, 120, 119, 120, 120, 119, 120, 119, 120, + 119, 120, 119, 120, 120, 95, 119, 120, 119, 120, + 119, 120, 99, 119, 120, 119, 120, 119, 120, 119, + 120, 103, 119, 120, 105, 119, 120, 119, 120, 120, + + 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, + 120, 120, 120, 115, 119, 120, 21, 22, 119, 120, + 119, 120, 119, 120, 119, 120, 38, 119, 120, 120, + 119, 120, 119, 120, 119, 120, 45, 119, 120, 119, + 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 63, 119, 120, 120, 120, + 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 120, 119, 120, 86, 119, 120, 119, 120, 120, + + 119, 120, 119, 120, 119, 120, 119, 120, 120, 119, + 120, 119, 120, 119, 120, 119, 120, 120, 119, 120, + 120, 107, 119, 120, 119, 120, 119, 120, 120, 119, + 120, 120, 120, 120, 31, 21, 22, 32, 119, 120, + 119, 120, 119, 120, 119, 120, 120, 119, 120, 119, + 120, 44, 119, 120, 119, 120, 119, 120, 119, 120, + 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, + 119, 120, 119, 120, 58, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 120, 120, 120, 119, 120, + 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, + + 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, + 120, 84, 119, 120, 119, 120, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 120, 119, 120, 119, 120, + 100, 119, 120, 101, 119, 120, 120, 119, 120, 120, + 108, 119, 120, 119, 120, 120, 120, 120, 120, 120, + 21, 22, 119, 120, 119, 120, 119, 120, 120, 41, + 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, + 50, 119, 120, 51, 119, 120, 119, 120, 119, 120, + 54, 119, 120, 119, 120, 119, 120, 119, 120, 60, + 119, 120, 119, 120, 119, 120, 120, 120, 120, 119, + + 120, 119, 120, 71, 119, 120, 72, 119, 120, 119, + 120, 119, 120, 119, 120, 76, 119, 120, 119, 120, + 119, 120, 119, 120, 120, 119, 120, 120, 89, 119, + 120, 119, 120, 92, 119, 120, 94, 119, 120, 120, + 119, 120, 119, 120, 120, 119, 120, 120, 119, 120, + 111, 120, 120, 120, 120, 120, 21, 22, 119, 120, + 119, 120, 119, 120, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 53, 119, 120, 119, 120, + 119, 120, 59, 119, 120, 119, 120, 62, 119, 120, + 120, 120, 120, 120, 119, 120, 70, 119, 120, 73, + + 119, 120, 74, 119, 120, 119, 120, 119, 120, 120, + 119, 120, 120, 88, 119, 120, 120, 119, 120, 120, + 119, 120, 97, 119, 120, 120, 119, 120, 120, 119, + 120, 120, 120, 120, 120, 21, 22, 119, 120, 119, + 120, 37, 119, 120, 40, 120, 43, 119, 120, 46, + 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, + 119, 120, 119, 120, 120, 120, 120, 68, 120, 119, + 120, 119, 120, 119, 120, 120, 119, 120, 120, 120, + 119, 120, 120, 119, 120, 102, 120, 119, 120, 120, + 109, 119, 120, 120, 120, 120, 120, 21, 119, 120, + + 119, 120, 47, 119, 120, 48, 119, 120, 49, 119, + 120, 119, 120, 119, 120, 57, 119, 120, 119, 120, + 120, 120, 120, 69, 119, 120, 119, 120, 119, 120, + 120, 119, 120, 120, 120, 119, 120, 120, 119, 120, + 119, 120, 120, 112, 120, 120, 120, 120, 21, 119, + 120, 36, 119, 120, 52, 119, 120, 119, 120, 119, + 120, 120, 120, 120, 119, 120, 119, 120, 120, 119, + 120, 120, 120, 119, 120, 120, 119, 120, 119, 120, + 120, 120, 120, 120, 30, 31, 21, 119, 120, 119, + 120, 119, 120, 120, 120, 120, 75, 119, 120, 77, + + 119, 120, 78, 120, 119, 120, 120, 120, 119, 120, + 120, 96, 119, 120, 119, 120, 120, 120, 120, 120, + 21, 119, 120, 119, 120, 61, 119, 120, 66, 120, + 120, 67, 120, 119, 120, 83, 120, 120, 91, 119, + 120, 120, 119, 120, 104, 120, 120, 120, 114, 120, + 21, 119, 120, 119, 120, 120, 81, 119, 120, 120, + 120, 119, 120, 120, 113, 120, 21, 33, 119, 120, + 119, 120, 65, 120, 120, 93, 120, 106, 119, 120, + 110, 120, 21, 55, 119, 120, 85, 120, 19, 21 } ; -static yyconst short int yy_accept[676] = +static yyconst short int yy_accept[722] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 2, 4, 7, 9, 12, 15, 18, - 20, 23, 25, 28, 30, 33, 36, 39, 41, 45, - 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, - 89, 93, 97, 101, 105, 109, 113, 117, 120, 123, - 126, 128, 131, 134, 138, 140, 143, 146, 149, 151, - 154, 157, 159, 162, 165, 168, 171, 174, 177, 179, - 181, 184, 184, 185, 186, 187, 187, 188, 188, 189, - 189, 189, 190, 191, 192, 193, 194, 194, 196, 198, - 200, 202, 204, 206, 207, 209, 211, 213, 215, 218, - - 220, 222, 224, 226, 228, 230, 232, 234, 236, 237, - 238, 240, 242, 244, 246, 248, 250, 252, 254, 255, - 257, 259, 262, 264, 265, 267, 269, 271, 273, 274, - 276, 278, 280, 282, 284, 286, 288, 290, 292, 293, - 295, 297, 298, 299, 301, 301, 301, 301, 301, 301, - 302, 303, 304, 305, 306, 307, 308, 308, 309, 310, - 311, 311, 312, 313, 313, 313, 314, 315, 316, 318, - 321, 324, 326, 328, 330, 333, 335, 337, 339, 341, - 343, 345, 347, 349, 351, 353, 356, 358, 360, 362, - 364, 366, 368, 369, 370, 372, 374, 376, 378, 380, - - 382, 384, 387, 390, 392, 393, 395, 397, 399, 400, - 402, 405, 407, 409, 411, 412, 414, 416, 418, 421, - 423, 425, 427, 429, 431, 433, 435, 436, 438, 440, - 442, 443, 444, 445, 447, 448, 448, 448, 448, 448, - 449, 449, 450, 451, 453, 455, 457, 459, 461, 463, - 465, 467, 469, 471, 473, 475, 477, 479, 481, 483, - 485, 487, 489, 491, 493, 495, 497, 500, 501, 502, - 504, 506, 508, 510, 512, 514, 516, 518, 520, 523, - 524, 526, 528, 530, 531, 533, 535, 537, 539, 540, - 543, 545, 547, 550, 552, 554, 556, 559, 562, 564, - - 565, 567, 569, 571, 573, 575, 576, 577, 578, 581, - 581, 581, 581, 581, 583, 585, 587, 589, 592, 593, - 595, 597, 599, 602, 604, 606, 608, 610, 612, 614, - 616, 618, 620, 622, 624, 626, 628, 631, 632, 633, - 634, 636, 638, 640, 642, 644, 646, 648, 650, 652, - 653, 655, 658, 660, 661, 663, 665, 667, 669, 670, - 672, 674, 676, 678, 679, 681, 682, 685, 687, 689, - 690, 692, 693, 694, 695, 696, 696, 696, 696, 699, - 701, 703, 705, 706, 708, 710, 713, 715, 717, 719, - 721, 723, 725, 727, 729, 731, 734, 736, 738, 740, - - 742, 743, 744, 745, 747, 749, 751, 753, 755, 757, - 759, 761, 763, 765, 766, 769, 771, 772, 774, 776, - 778, 780, 781, 783, 785, 788, 791, 792, 794, 795, - 798, 800, 801, 802, 803, 804, 805, 805, 805, 805, - 807, 809, 811, 812, 815, 817, 819, 821, 823, 826, - 829, 831, 833, 836, 838, 840, 843, 845, 847, 848, - 849, 850, 852, 854, 857, 860, 862, 864, 867, 869, - 871, 873, 874, 876, 877, 880, 882, 885, 888, 889, - 891, 893, 894, 896, 897, 899, 901, 902, 903, 904, - 905, 905, 905, 905, 907, 909, 911, 912, 914, 916, - - 918, 920, 922, 925, 927, 930, 932, 935, 936, 937, - 938, 939, 941, 944, 947, 950, 952, 953, 955, 956, - 959, 960, 962, 963, 965, 968, 969, 971, 972, 974, - 975, 976, 977, 978, 978, 978, 978, 980, 982, 985, - 987, 990, 993, 995, 997, 999, 1001, 1003, 1004, 1005, - 1006, 1008, 1010, 1012, 1013, 1015, 1016, 1017, 1019, 1020, - 1022, 1024, 1026, 1027, 1030, 1031, 1032, 1033, 1034, 1034, - 1034, 1034, 1036, 1038, 1041, 1044, 1047, 1049, 1052, 1054, - 1055, 1056, 1057, 1060, 1062, 1063, 1065, 1066, 1067, 1069, - 1070, 1072, 1074, 1075, 1077, 1078, 1079, 1080, 1080, 1080, - - 1080, 1082, 1085, 1088, 1090, 1091, 1092, 1093, 1095, 1096, - 1098, 1099, 1100, 1102, 1103, 1105, 1107, 1108, 1109, 1110, - 1111, 1111, 1113, 1113, 1115, 1117, 1118, 1119, 1120, 1123, - 1125, 1127, 1128, 1129, 1131, 1132, 1135, 1137, 1138, 1139, - 1140, 1141, 1141, 1143, 1146, 1148, 1149, 1151, 1153, 1155, - 1156, 1159, 1160, 1162, 1164, 1165, 1166, 1168, 1168, 1170, - 1171, 1174, 1175, 1176, 1178, 1179, 1181, 1184, 1186, 1187, - 1189, 1192, 1194, 1196, 1196 + 1, 1, 1, 1, 1, 2, 4, 7, 9, 12, + 15, 18, 20, 23, 25, 28, 30, 33, 36, 39, + 41, 45, 49, 53, 57, 61, 65, 69, 73, 77, + 81, 85, 89, 93, 97, 101, 105, 109, 113, 117, + 120, 123, 126, 130, 133, 135, 138, 141, 145, 147, + 150, 153, 156, 158, 161, 164, 166, 169, 172, 175, + 178, 182, 185, 187, 192, 197, 200, 203, 205, 207, + 210, 210, 211, 212, 213, 213, 214, 214, 215, 215, + 215, 216, 217, 218, 219, 220, 220, 222, 224, 226, + + 228, 230, 232, 233, 235, 237, 239, 241, 244, 246, + 248, 250, 252, 254, 256, 258, 260, 262, 263, 264, + 266, 268, 270, 272, 274, 276, 278, 280, 281, 283, + 285, 288, 290, 291, 293, 295, 297, 299, 300, 302, + 304, 306, 308, 310, 312, 314, 316, 318, 319, 321, + 323, 324, 325, 327, 327, 327, 327, 327, 327, 328, + 329, 330, 331, 332, 333, 334, 334, 335, 337, 339, + 340, 341, 342, 342, 343, 344, 344, 344, 345, 346, + 347, 349, 352, 355, 357, 359, 361, 364, 366, 368, + 370, 372, 374, 376, 378, 380, 382, 384, 387, 389, + + 391, 393, 395, 397, 399, 400, 401, 403, 405, 407, + 409, 411, 413, 415, 418, 421, 423, 424, 426, 428, + 430, 431, 433, 436, 438, 440, 442, 443, 445, 447, + 449, 452, 454, 456, 458, 460, 462, 464, 466, 467, + 469, 471, 473, 474, 475, 476, 478, 479, 479, 479, + 479, 479, 480, 482, 485, 485, 486, 487, 489, 491, + 493, 495, 497, 499, 501, 503, 505, 507, 509, 511, + 513, 515, 517, 519, 521, 523, 525, 527, 529, 531, + 533, 536, 537, 538, 540, 542, 544, 546, 548, 550, + 552, 554, 556, 559, 560, 562, 564, 566, 567, 569, + + 571, 573, 575, 576, 579, 581, 583, 586, 588, 590, + 592, 595, 598, 600, 601, 603, 605, 607, 609, 611, + 612, 613, 614, 617, 617, 617, 617, 617, 619, 621, + 623, 625, 627, 630, 631, 633, 635, 637, 640, 642, + 644, 646, 648, 650, 652, 654, 656, 658, 660, 662, + 664, 666, 669, 670, 671, 672, 674, 676, 678, 680, + 682, 684, 686, 688, 690, 692, 693, 695, 698, 700, + 701, 703, 705, 707, 709, 710, 712, 714, 716, 718, + 719, 721, 722, 725, 727, 729, 730, 732, 733, 734, + 735, 736, 736, 736, 736, 738, 741, 743, 745, 747, + + 748, 750, 752, 755, 757, 759, 761, 763, 765, 767, + 769, 771, 773, 775, 778, 780, 782, 784, 786, 787, + 788, 789, 791, 793, 795, 797, 799, 801, 803, 805, + 807, 809, 811, 812, 815, 817, 818, 820, 822, 824, + 826, 827, 829, 831, 834, 837, 838, 840, 841, 844, + 846, 847, 848, 849, 850, 851, 851, 851, 851, 853, + 855, 857, 859, 860, 863, 865, 867, 869, 871, 874, + 877, 879, 881, 884, 886, 888, 890, 893, 895, 897, + 898, 899, 900, 902, 904, 907, 910, 912, 914, 916, + 919, 921, 923, 925, 926, 928, 929, 932, 934, 937, + + 940, 941, 943, 945, 946, 948, 949, 951, 953, 954, + 955, 956, 957, 957, 957, 957, 959, 961, 963, 965, + 966, 968, 970, 972, 974, 976, 979, 981, 983, 986, + 988, 991, 992, 993, 994, 995, 997, 1000, 1003, 1006, + 1008, 1010, 1011, 1013, 1014, 1017, 1018, 1020, 1021, 1023, + 1026, 1027, 1029, 1030, 1032, 1033, 1034, 1035, 1036, 1036, + 1036, 1036, 1038, 1040, 1042, 1045, 1047, 1050, 1053, 1055, + 1057, 1059, 1061, 1063, 1065, 1066, 1067, 1068, 1070, 1072, + 1074, 1076, 1077, 1079, 1080, 1081, 1083, 1084, 1086, 1088, + 1090, 1091, 1094, 1095, 1096, 1097, 1098, 1098, 1098, 1098, + + 1099, 1101, 1103, 1106, 1109, 1112, 1114, 1116, 1119, 1121, + 1122, 1123, 1124, 1127, 1129, 1131, 1132, 1134, 1135, 1136, + 1138, 1139, 1141, 1143, 1144, 1146, 1147, 1148, 1149, 1149, + 1149, 1149, 1150, 1152, 1155, 1158, 1160, 1162, 1163, 1164, + 1165, 1167, 1169, 1170, 1172, 1173, 1174, 1176, 1177, 1179, + 1181, 1182, 1183, 1184, 1185, 1185, 1187, 1187, 1188, 1190, + 1192, 1194, 1195, 1196, 1197, 1200, 1203, 1205, 1207, 1208, + 1209, 1211, 1212, 1215, 1217, 1218, 1219, 1220, 1221, 1221, + 1222, 1224, 1226, 1229, 1231, 1232, 1234, 1236, 1238, 1239, + 1242, 1243, 1245, 1247, 1248, 1249, 1251, 1251, 1252, 1254, + + 1256, 1257, 1260, 1261, 1262, 1264, 1265, 1267, 1268, 1271, + 1273, 1275, 1276, 1278, 1281, 1283, 1284, 1287, 1289, 1291, + 1291 } ; static yyconst int yy_ec[256] = @@ -573,636 +587,683 @@ static yyconst int yy_meta[79] = 11, 11, 11, 11, 11, 12, 1, 12 } ; -static yyconst short int yy_base[691] = +static yyconst short int yy_base[740] = { 0, 0, 0, 76, 78, 80, 81, 82, 89, 83, 93, - 96, 106, 844, 833, 116, 119, 822, 821, 177, 126, - 4166, 127, 816, 123, 4166, 134, 805, 4166, 242, 292, - 141, 298, 152, 314, 322, 130, 338, 359, 360, 376, - 382, 397, 410, 437, 440, 462, 463, 495, 0, 0, - 4166, 4166, 811, 4166, 4166, 807, 807, 0, 0, 809, - 0, 0, 787, 4166, 4166, 4166, 0, 160, 191, 104, - 4166, 800, 261, 0, 798, 797, 0, 79, 0, 426, - 793, 4166, 511, 787, 4166, 527, 771, 512, 513, 528, - 529, 544, 550, 0, 561, 567, 578, 589, 595, 611, - - 617, 628, 641, 644, 664, 661, 672, 685, 727, 737, - 696, 702, 713, 719, 730, 741, 747, 758, 725, 771, - 774, 787, 795, 725, 798, 811, 822, 835, 720, 851, - 857, 868, 874, 885, 900, 901, 916, 917, 716, 932, - 933, 716, 45, 948, 980, 987, 736, 97, 120, 0, - 0, 4166, 4166, 0, 4166, 0, 750, 0, 291, 4166, - 761, 0, 0, 79, 739, 994, 4166, 4166, 990, 1003, - 1011, 1014, 1027, 1035, 1038, 1051, 1059, 1067, 1075, 1088, - 1096, 1099, 1120, 1121, 1136, 1142, 1153, 1159, 1170, 1176, - 1187, 1198, 707, 693, 1211, 1219, 1222, 1237, 1240, 1243, - - 1267, 1261, 1264, 1282, 702, 1285, 1300, 1306, 696, 1317, - 1328, 1334, 1345, 1356, 686, 1367, 1373, 1384, 1390, 1405, - 1406, 1421, 1432, 1438, 1453, 1459, 692, 1470, 1481, 1492, - 675, 686, 681, 1503, 4166, 1542, 697, 143, 158, 4166, - 683, 4166, 4166, 1527, 1528, 1543, 1549, 1564, 1565, 1582, - 1581, 1597, 1603, 1614, 1625, 1643, 1640, 1646, 1661, 1664, - 1667, 1682, 1688, 1699, 1710, 1725, 1731, 664, 668, 1742, - 1748, 1763, 1764, 1779, 1785, 1796, 1809, 1817, 1825, 658, - 1840, 1843, 1856, 670, 1864, 1880, 1879, 1896, 649, 1897, - 1912, 1925, 1933, 1936, 1954, 1951, 1957, 1972, 1975, 648, - - 1978, 1993, 1999, 2010, 2016, 660, 649, 660, 2031, 2063, - 283, 280, 305, 2048, 2064, 2072, 2080, 2088, 644, 2096, - 2104, 2117, 2125, 2128, 2146, 2143, 2149, 2164, 2170, 2185, - 2186, 2201, 2216, 2222, 2233, 2239, 2254, 653, 641, 627, - 2255, 2275, 2272, 2293, 2292, 2310, 2309, 2325, 2331, 633, - 2342, 2353, 2359, 623, 2370, 2381, 2387, 2398, 639, 2411, - 2414, 2422, 2435, 616, 2446, 625, 2452, 2467, 2468, 613, - 2483, 607, 604, 610, 4166, 302, 321, 96, 2489, 2504, - 2507, 2515, 610, 2530, 2536, 2547, 2553, 2564, 2570, 2581, - 2592, 2598, 2615, 2621, 2637, 2638, 2653, 2654, 2669, 2675, - - 605, 607, 599, 2686, 2692, 2707, 2708, 2728, 2729, 2744, - 2752, 2765, 2773, 604, 2776, 2794, 631, 2791, 2797, 2812, - 2815, 603, 2823, 2838, 2841, 2844, 590, 2859, 574, 2862, - 2865, 588, 576, 574, 583, 581, 317, 309, 328, 2880, - 2883, 2896, 572, 2904, 2917, 2925, 2928, 2941, 2949, 2952, - 2965, 2976, 2973, 2989, 3000, 3011, 3017, 3028, 54, 589, - 564, 3034, 3045, 3056, 3062, 3073, 3079, 3094, 3095, 3110, - 3111, 583, 3126, 566, 3127, 3144, 3147, 3150, 558, 3165, - 3171, 554, 3186, 576, 3192, 0, 555, 559, 536, 566, - 347, 226, 339, 3203, 3209, 3224, 548, 3230, 3241, 3254, - - 3262, 3265, 3280, 3283, 3291, 3304, 3307, 531, 525, 525, - 531, 3322, 3328, 3339, 3345, 3356, 516, 3367, 512, 3373, - 511, 3384, 521, 3395, 3401, 517, 3412, 504, 3418, 506, - 507, 520, 466, 325, 465, 348, 3429, 3440, 3451, 0, - 3457, 3468, 3479, 3490, 3496, 3511, 3512, 467, 476, 464, - 0, 3527, 3528, 470, 3544, 450, 462, 3545, 474, 3560, - 0, 3566, 447, 3577, 444, 454, 423, 424, 361, 3616, - 353, 3601, 3602, 3617, 3618, 3633, 3634, 3649, 3650, 430, - 434, 428, 3665, 3673, 421, 3681, 421, 412, 3689, 403, - 3697, 3705, 410, 0, 400, 401, 403, 189, 3737, 519, - - 3722, 3723, 3738, 3746, 398, 417, 394, 3759, 398, 3767, - 391, 391, 3770, 383, 3783, 3794, 383, 378, 383, 378, - 371, 4166, 3833, 3818, 3819, 378, 363, 359, 3834, 0, - 3840, 357, 347, 3851, 351, 3857, 3868, 330, 315, 305, - 295, 558, 3884, 3881, 0, 282, 0, 3892, 0, 262, - 3907, 256, 3910, 0, 188, 141, 0, 3954, 3939, 138, - 3940, 120, 105, 3955, 95, 0, 3956, 0, 37, 0, - 3972, 0, 0, 4166, 4017, 4029, 4041, 4053, 4065, 4077, - 4088, 4089, 4093, 4104, 4116, 4128, 4139, 4144, 4149, 4154 + 171, 249, 109, 120, 961, 952, 95, 98, 951, 948, + 320, 117, 4484, 118, 933, 100, 4484, 125, 923, 4484, + 385, 176, 194, 120, 239, 267, 435, 163, 293, 441, + 191, 259, 463, 471, 484, 500, 508, 270, 521, 553, + 935, 0, 933, 0, 4484, 4484, 926, 4484, 4484, 922, + 922, 0, 0, 924, 0, 0, 902, 4484, 4484, 4484, + 0, 4484, 4484, 598, 675, 0, 148, 151, 182, 4484, + 915, 160, 0, 913, 912, 0, 135, 0, 573, 908, + 4484, 226, 902, 4484, 598, 886, 556, 597, 598, 618, + + 619, 634, 0, 664, 667, 680, 693, 704, 720, 728, + 741, 744, 757, 772, 778, 775, 793, 842, 852, 808, + 811, 819, 834, 845, 856, 862, 873, 840, 886, 889, + 902, 910, 840, 913, 926, 937, 950, 835, 966, 972, + 983, 989, 1000, 1015, 1016, 1031, 1032, 831, 1047, 1048, + 831, 48, 1063, 1095, 1102, 851, 88, 128, 0, 0, + 4484, 4484, 0, 4484, 0, 865, 0, 849, 253, 0, + 264, 4484, 875, 0, 0, 83, 848, 611, 4484, 4484, + 1099, 1100, 1115, 1123, 1126, 1141, 1144, 1147, 1162, 1168, + 1179, 1185, 1196, 1207, 1223, 1229, 1240, 1246, 1257, 1263, + + 1274, 1280, 1291, 1302, 818, 807, 1315, 1323, 1326, 1341, + 1344, 1347, 1371, 1365, 1368, 1386, 815, 1389, 1404, 1410, + 811, 1421, 1432, 1438, 1449, 1460, 802, 1471, 1477, 1488, + 1494, 1509, 1510, 1525, 1536, 1542, 1557, 1563, 809, 1574, + 1585, 1596, 793, 807, 801, 1607, 4484, 1646, 822, 178, + 250, 4484, 109, 820, 802, 4484, 4484, 1631, 1632, 1647, + 1653, 1668, 1669, 1686, 1685, 1701, 1707, 1718, 1729, 1747, + 1744, 1750, 1765, 1768, 1771, 1786, 1792, 1803, 1814, 1829, + 1835, 783, 789, 1846, 1852, 1867, 1868, 1883, 1889, 1904, + 1907, 1915, 1928, 774, 1936, 1939, 1952, 786, 1960, 1976, + + 1975, 1992, 770, 1993, 2008, 2021, 2029, 2032, 2050, 2047, + 2053, 2068, 2071, 768, 2074, 2089, 2095, 2106, 2112, 778, + 768, 775, 2127, 2159, 170, 151, 242, 200, 2144, 2160, + 2168, 2176, 2184, 759, 2192, 2200, 2213, 2221, 2224, 2242, + 2239, 2245, 2260, 2266, 2281, 2282, 2297, 2312, 2318, 2329, + 2335, 2350, 773, 763, 755, 2351, 2371, 2368, 2389, 2388, + 2404, 2410, 2421, 2432, 2443, 759, 2449, 2460, 2466, 738, + 2477, 2488, 2494, 2505, 753, 2518, 2521, 2529, 2542, 737, + 2553, 745, 2559, 2574, 2575, 731, 2590, 725, 721, 727, + 4484, 280, 297, 294, 231, 2596, 2611, 2614, 2622, 728, + + 2637, 2643, 2654, 2660, 2671, 2677, 2688, 2699, 2705, 2722, + 2728, 2739, 2745, 2756, 2762, 2773, 2779, 2795, 724, 731, + 723, 2796, 2811, 2817, 2828, 2834, 2849, 2855, 2866, 2881, + 2887, 2898, 720, 2909, 2915, 747, 2926, 2932, 2943, 2956, + 716, 2964, 2979, 2982, 2985, 707, 3000, 689, 3003, 3006, + 704, 692, 687, 697, 693, 271, 295, 301, 712, 3021, + 3024, 3037, 682, 3045, 3058, 3066, 3069, 3082, 3090, 3093, + 3106, 3117, 3114, 3130, 3138, 3141, 3154, 3162, 3165, 124, + 704, 677, 3178, 3186, 3189, 3202, 3210, 3223, 3231, 3234, + 3251, 3254, 3257, 698, 3272, 681, 3275, 3288, 3296, 3304, + + 673, 3317, 3325, 658, 3338, 680, 3346, 0, 660, 667, + 643, 672, 438, 368, 366, 286, 3349, 3362, 3370, 654, + 3378, 3386, 3399, 3407, 3410, 3425, 3431, 3446, 3428, 3452, + 3463, 639, 633, 630, 634, 3469, 3480, 3486, 3497, 3503, + 3514, 623, 3525, 620, 3531, 619, 3542, 619, 3553, 3559, + 613, 3570, 600, 3576, 603, 604, 623, 594, 300, 466, + 447, 360, 3587, 3598, 3609, 0, 3615, 3626, 3637, 3648, + 3654, 3669, 3672, 3675, 593, 603, 584, 0, 3690, 3698, + 3713, 590, 3714, 579, 591, 3729, 603, 3737, 0, 3745, + 572, 3758, 579, 589, 531, 528, 443, 3797, 454, 568, + + 3782, 3783, 3798, 3799, 3814, 3815, 3830, 3836, 3847, 529, + 533, 527, 3853, 3864, 3875, 520, 3881, 523, 515, 3892, + 512, 3898, 3909, 518, 0, 508, 496, 498, 397, 3941, + 560, 517, 3926, 3927, 3942, 3943, 3958, 489, 507, 484, + 3969, 3975, 483, 3990, 475, 477, 3993, 468, 3996, 4013, + 469, 462, 468, 461, 424, 4484, 4052, 485, 4037, 4048, + 4059, 461, 456, 455, 4065, 4076, 0, 4087, 454, 444, + 4098, 440, 4104, 4115, 438, 434, 429, 432, 732, 441, + 4131, 4128, 4139, 0, 419, 0, 4152, 0, 411, 4155, + 399, 4170, 0, 372, 347, 0, 4209, 330, 4194, 4205, + + 258, 4211, 227, 214, 4222, 177, 0, 180, 4233, 4239, + 0, 138, 0, 4250, 0, 134, 4256, 0, 0, 4484, + 4301, 4313, 4325, 4337, 4349, 4361, 4373, 4384, 4385, 4389, + 4400, 4412, 4424, 4435, 4446, 4457, 4462, 4467, 4472 } ; -static yyconst short int yy_def[691] = +static yyconst short int yy_def[740] = { 0, - 674, 1, 675, 675, 676, 676, 677, 677, 678, 678, - 679, 679, 674, 674, 674, 674, 674, 680, 674, 681, - 674, 674, 674, 674, 674, 674, 674, 674, 674, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 682, 683, 684, - 674, 674, 674, 674, 674, 674, 674, 685, 685, 674, - 686, 686, 674, 674, 674, 674, 687, 674, 674, 19, - 674, 674, 674, 680, 680, 674, 688, 674, 689, 681, - 681, 674, 674, 674, 674, 674, 674, 29, 29, 29, - 29, 29, 29, 690, 29, 29, 29, 29, 29, 29, - - 29, 29, 29, 29, 29, 29, 29, 29, 690, 690, - 29, 29, 29, 29, 29, 29, 29, 29, 690, 29, - 29, 29, 29, 690, 29, 29, 29, 29, 690, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 690, 29, - 29, 690, 690, 29, 674, 682, 146, 146, 146, 683, - 684, 674, 674, 685, 674, 686, 674, 687, 674, 674, - 674, 688, 689, 674, 674, 674, 674, 674, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 690, 690, 29, 29, 29, 29, 29, 29, - - 29, 29, 29, 29, 690, 29, 29, 29, 690, 29, - 29, 29, 29, 29, 690, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 690, 29, 29, 29, - 690, 690, 690, 29, 674, 674, 146, 146, 146, 674, - 674, 674, 674, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 690, 690, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 690, - 29, 29, 29, 690, 29, 29, 29, 29, 690, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 690, - - 29, 29, 29, 29, 29, 690, 690, 690, 29, 674, - 146, 146, 146, 29, 29, 29, 29, 29, 690, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 690, 690, 690, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 690, - 29, 29, 29, 690, 29, 29, 29, 29, 690, 29, - 29, 29, 29, 690, 29, 690, 29, 29, 29, 690, - 29, 690, 690, 690, 674, 146, 146, 146, 29, 29, - 29, 29, 690, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - - 690, 690, 690, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 690, 29, 29, 690, 29, 29, 29, - 29, 690, 29, 29, 29, 29, 690, 29, 690, 29, - 29, 690, 690, 690, 690, 690, 146, 146, 146, 29, - 29, 29, 690, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 690, 690, - 690, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 690, 29, 690, 29, 29, 29, 29, 690, 29, - 29, 690, 29, 690, 29, 690, 690, 690, 690, 690, - 146, 146, 146, 29, 29, 29, 690, 29, 29, 29, - - 29, 29, 29, 29, 29, 29, 29, 690, 690, 690, - 690, 29, 29, 29, 29, 29, 690, 29, 690, 29, - 690, 29, 690, 29, 29, 690, 29, 690, 29, 690, - 690, 690, 690, 146, 146, 146, 29, 29, 29, 690, - 29, 29, 29, 29, 29, 29, 29, 690, 690, 690, - 690, 29, 29, 690, 29, 690, 690, 29, 690, 29, - 690, 29, 690, 29, 690, 690, 690, 690, 146, 674, - 146, 29, 29, 29, 29, 29, 29, 29, 29, 690, - 690, 690, 29, 29, 690, 29, 690, 690, 29, 690, - 29, 29, 690, 690, 690, 690, 690, 146, 674, 146, - - 29, 29, 29, 29, 690, 690, 690, 29, 690, 29, - 690, 690, 29, 690, 29, 29, 690, 690, 690, 690, - 146, 674, 674, 29, 29, 690, 690, 690, 29, 690, - 29, 690, 690, 29, 690, 29, 29, 690, 690, 690, - 690, 146, 29, 29, 690, 690, 690, 29, 690, 690, - 29, 690, 29, 690, 690, 690, 690, 674, 29, 690, - 29, 690, 690, 29, 690, 690, 29, 690, 690, 690, - 29, 690, 690, 0, 674, 674, 674, 674, 674, 674, - 674, 674, 674, 674, 674, 674, 674, 674, 674, 674 + 720, 1, 721, 721, 722, 722, 723, 723, 724, 724, + 725, 725, 726, 726, 720, 720, 720, 720, 720, 727, + 720, 728, 720, 720, 720, 720, 720, 720, 720, 720, + 720, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 729, + 720, 730, 720, 731, 720, 720, 720, 720, 720, 720, + 720, 732, 732, 720, 733, 733, 720, 720, 720, 720, + 734, 720, 720, 735, 735, 736, 720, 720, 21, 720, + 720, 720, 727, 727, 720, 737, 720, 738, 728, 728, + 720, 720, 720, 720, 720, 720, 31, 31, 31, 31, + + 31, 31, 739, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 739, 739, 31, + 31, 31, 31, 31, 31, 31, 31, 739, 31, 31, + 31, 31, 739, 31, 31, 31, 31, 739, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 739, 31, 31, + 739, 739, 31, 720, 729, 155, 155, 155, 730, 731, + 720, 720, 732, 720, 733, 720, 734, 75, 75, 736, + 720, 720, 720, 737, 738, 720, 720, 720, 720, 720, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + + 31, 31, 31, 31, 739, 739, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 739, 31, 31, 31, + 739, 31, 31, 31, 31, 31, 739, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 739, 31, + 31, 31, 739, 739, 739, 31, 720, 720, 155, 155, + 155, 720, 75, 75, 720, 720, 720, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 739, 739, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 739, 31, 31, 31, 739, 31, 31, + + 31, 31, 739, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 739, 31, 31, 31, 31, 31, 739, + 739, 739, 31, 720, 155, 155, 155, 75, 31, 31, + 31, 31, 31, 739, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 739, 739, 739, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 739, 31, 31, 31, 739, + 31, 31, 31, 31, 739, 31, 31, 31, 31, 739, + 31, 739, 31, 31, 31, 739, 31, 739, 739, 739, + 720, 155, 155, 155, 75, 31, 31, 31, 31, 739, + + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 739, 739, + 739, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 739, 31, 31, 739, 31, 31, 31, 31, + 739, 31, 31, 31, 31, 739, 31, 739, 31, 31, + 739, 739, 739, 739, 739, 155, 155, 155, 75, 31, + 31, 31, 739, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 739, + 739, 739, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 739, 31, 739, 31, 31, 31, 31, + + 739, 31, 31, 739, 31, 739, 31, 739, 739, 739, + 739, 739, 155, 155, 155, 75, 31, 31, 31, 739, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 739, 739, 739, 739, 31, 31, 31, 31, 31, + 31, 739, 31, 739, 31, 739, 31, 739, 31, 31, + 739, 31, 739, 31, 739, 739, 739, 739, 155, 155, + 155, 75, 31, 31, 31, 739, 31, 31, 31, 31, + 31, 31, 31, 31, 739, 739, 739, 739, 31, 31, + 31, 739, 31, 739, 739, 31, 739, 31, 739, 31, + 739, 31, 739, 739, 739, 739, 155, 720, 155, 734, + + 31, 31, 31, 31, 31, 31, 31, 31, 31, 739, + 739, 739, 31, 31, 31, 739, 31, 739, 739, 31, + 739, 31, 31, 739, 739, 739, 739, 739, 155, 720, + 155, 734, 31, 31, 31, 31, 31, 739, 739, 739, + 31, 31, 739, 31, 739, 739, 31, 739, 31, 31, + 739, 739, 739, 739, 155, 720, 720, 734, 31, 31, + 31, 739, 739, 739, 31, 31, 739, 31, 739, 739, + 31, 739, 31, 31, 739, 739, 739, 739, 155, 734, + 31, 31, 31, 739, 739, 739, 31, 739, 739, 31, + 739, 31, 739, 739, 739, 739, 720, 734, 31, 31, + + 739, 31, 739, 739, 31, 739, 739, 734, 31, 31, + 739, 739, 739, 31, 739, 734, 31, 739, 734, 0, + 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, + 720, 720, 720, 720, 720, 720, 720, 720, 720 } ; -static yyconst short int yy_nxt[4245] = +static yyconst short int yy_nxt[4563] = { 0, - 14, 15, 16, 15, 17, 18, 19, 20, 21, 14, - 22, 23, 24, 25, 26, 26, 26, 26, 26, 26, - 27, 17, 28, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 36, 36, 36, 38, 39, 40, 41, - 36, 42, 43, 44, 45, 46, 47, 36, 36, 36, - 48, 17, 14, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 21, 17, 21, 51, 52, - 51, 52, 55, 55, 59, 62, 53, 60, 53, 56, - 56, 59, 57, 57, 60, 62, 508, 68, 69, 68, - - 76, 232, 70, 63, 242, 673, 64, 68, 69, 68, - 243, 674, 70, 63, 233, 509, 64, 73, 73, 73, - 73, 73, 73, 72, 439, 674, 72, 80, 80, 80, - 72, 78, 85, 72, 72, 147, 147, 82, 238, 80, - 80, 83, 83, 83, 83, 83, 83, 86, 86, 86, - 86, 86, 86, 86, 672, 88, 674, 239, 65, 147, - 66, 159, 159, 159, 670, 88, 88, 88, 65, 88, - 66, 28, 100, 71, 88, 312, 101, 88, 88, 102, - 88, 28, 147, 71, 72, 88, 669, 88, 104, 105, - 313, 88, 159, 159, 159, 668, 88, 147, 76, 106, - - 666, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 621, 147, 78, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 88, 665, 535, 88, 88, 88, 88, 88, - 88, 88, 73, 73, 73, 147, 88, 89, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 90, 88, 91, - 88, 92, 88, 88, 88, 88, 93, 88, 88, 88, - 88, 88, 159, 159, 159, 94, 94, 94, 94, 94, - - 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, - 94, 94, 94, 94, 94, 94, 94, 88, 376, 147, - 95, 663, 147, 88, 96, 377, 103, 88, 97, 88, - 98, 88, 662, 88, 437, 88, 88, 88, 107, 88, - 99, 147, 88, 491, 147, 438, 660, 88, 147, 88, - 378, 88, 492, 88, 657, 108, 147, 88, 88, 88, - 147, 88, 111, 88, 147, 112, 88, 147, 569, 493, - 656, 534, 571, 88, 113, 114, 655, 88, 147, 109, - 115, 536, 88, 116, 88, 88, 147, 147, 600, 654, - 110, 117, 147, 598, 88, 88, 88, 88, 88, 88, - - 147, 120, 121, 88, 118, 122, 125, 88, 642, 126, - 147, 88, 652, 88, 650, 123, 649, 127, 647, 88, - 88, 88, 88, 128, 646, 130, 88, 80, 80, 80, - 124, 119, 88, 164, 88, 88, 88, 645, 131, 80, - 80, 88, 132, 641, 640, 88, 639, 88, 638, 88, - 129, 635, 633, 133, 88, 135, 632, 630, 134, 628, - 627, 136, 88, 626, 620, 88, 570, 570, 570, 619, - 618, 617, 88, 614, 88, 88, 88, 140, 137, 88, - 612, 88, 611, 141, 88, 138, 609, 88, 88, 607, - 606, 605, 597, 596, 139, 144, 595, 88, 88, 88, - - 88, 88, 88, 594, 147, 142, 88, 88, 145, 145, - 145, 145, 145, 145, 145, 593, 590, 588, 587, 146, - 623, 623, 623, 143, 166, 166, 166, 166, 166, 166, - 166, 585, 582, 581, 148, 580, 568, 88, 88, 149, - 86, 86, 86, 86, 86, 86, 86, 88, 88, 88, - 88, 88, 88, 88, 88, 169, 88, 88, 147, 658, - 658, 658, 567, 170, 88, 88, 88, 88, 88, 88, - 566, 565, 88, 88, 563, 88, 561, 171, 559, 88, - 557, 88, 556, 172, 554, 88, 88, 88, 88, 88, - 551, 174, 88, 173, 88, 550, 88, 147, 88, 549, - - 88, 548, 88, 88, 88, 88, 88, 540, 533, 532, - 175, 88, 531, 88, 88, 88, 530, 176, 528, 526, - 88, 523, 88, 521, 88, 519, 88, 177, 88, 511, - 88, 510, 88, 88, 88, 178, 88, 497, 490, 88, - 489, 180, 88, 488, 487, 486, 88, 484, 88, 179, - 88, 482, 88, 88, 88, 88, 88, 479, 474, 472, - 461, 88, 460, 88, 181, 182, 88, 88, 459, 184, - 183, 443, 88, 436, 435, 434, 88, 432, 88, 88, - 88, 88, 429, 88, 427, 88, 88, 188, 88, 88, - 185, 186, 422, 417, 414, 403, 88, 88, 88, 88, - - 189, 88, 402, 88, 190, 88, 401, 191, 187, 88, - 88, 88, 383, 195, 374, 373, 88, 372, 366, 359, - 88, 88, 88, 192, 88, 354, 350, 88, 339, 88, - 196, 88, 338, 88, 160, 88, 311, 88, 88, 88, - 88, 88, 308, 307, 88, 198, 88, 306, 88, 300, - 88, 289, 197, 284, 88, 88, 88, 88, 88, 280, - 269, 199, 200, 88, 268, 88, 88, 88, 201, 88, - 243, 241, 88, 240, 88, 147, 88, 231, 88, 227, - 88, 215, 88, 88, 203, 88, 88, 209, 202, 205, - 194, 88, 193, 204, 168, 88, 88, 88, 167, 88, - - 165, 161, 88, 160, 206, 160, 88, 157, 88, 88, - 88, 88, 88, 88, 155, 88, 85, 207, 88, 153, - 88, 152, 88, 88, 88, 87, 88, 84, 75, 72, - 88, 88, 88, 88, 88, 88, 88, 88, 208, 88, - 72, 210, 88, 674, 674, 674, 88, 88, 88, 674, - 88, 674, 674, 674, 674, 88, 211, 88, 674, 88, - 88, 88, 674, 213, 674, 674, 212, 214, 674, 674, - 88, 674, 88, 674, 88, 216, 88, 674, 674, 88, - 674, 674, 88, 674, 674, 674, 217, 674, 88, 674, - 88, 674, 88, 88, 88, 88, 88, 218, 674, 88, - - 219, 88, 674, 88, 674, 88, 674, 88, 674, 88, - 88, 88, 88, 88, 223, 221, 674, 220, 88, 674, - 88, 674, 222, 674, 88, 88, 88, 674, 674, 88, - 674, 224, 674, 674, 674, 88, 88, 88, 88, 88, - 88, 88, 88, 674, 88, 88, 674, 674, 674, 674, - 674, 88, 88, 88, 88, 88, 226, 88, 88, 229, - 225, 88, 230, 674, 228, 674, 674, 88, 88, 88, - 88, 88, 88, 88, 674, 674, 88, 88, 674, 674, - 674, 674, 674, 88, 674, 88, 674, 88, 236, 236, - 236, 234, 88, 145, 145, 145, 145, 145, 145, 145, - - 674, 674, 674, 674, 674, 674, 674, 166, 166, 166, - 166, 166, 166, 166, 674, 88, 674, 674, 244, 674, - 674, 674, 674, 674, 674, 88, 237, 88, 88, 88, - 674, 235, 674, 245, 88, 674, 88, 674, 88, 88, - 88, 674, 88, 674, 674, 674, 88, 88, 88, 246, - 88, 88, 88, 88, 674, 88, 674, 674, 88, 674, - 88, 674, 88, 88, 88, 247, 88, 248, 674, 674, - 88, 88, 88, 88, 88, 88, 88, 88, 674, 88, - 674, 674, 88, 674, 88, 674, 88, 674, 88, 674, - 88, 674, 88, 249, 250, 88, 88, 674, 88, 674, - - 88, 674, 88, 88, 88, 674, 88, 252, 251, 674, - 88, 88, 88, 88, 88, 674, 674, 674, 674, 88, - 674, 88, 674, 88, 88, 88, 674, 88, 674, 674, - 253, 88, 88, 88, 88, 254, 88, 674, 88, 674, - 88, 255, 256, 88, 257, 88, 88, 674, 674, 259, - 674, 674, 258, 674, 674, 88, 88, 88, 88, 88, - 88, 88, 674, 674, 88, 88, 674, 88, 674, 674, - 674, 88, 674, 88, 260, 88, 674, 88, 88, 88, - 88, 88, 674, 674, 88, 674, 88, 262, 88, 261, - 88, 674, 88, 674, 88, 88, 88, 88, 88, 674, - - 674, 88, 674, 88, 265, 263, 674, 88, 264, 88, - 674, 88, 88, 88, 88, 88, 674, 674, 674, 674, - 88, 674, 88, 88, 88, 674, 88, 674, 674, 266, - 674, 88, 674, 88, 267, 88, 88, 88, 674, 674, - 674, 674, 88, 674, 88, 674, 88, 88, 88, 674, - 88, 674, 674, 270, 88, 88, 271, 272, 88, 88, - 273, 88, 88, 88, 674, 88, 88, 674, 88, 674, - 674, 276, 274, 674, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 275, 88, 277, 88, 88, 674, 88, - 674, 674, 88, 674, 674, 674, 88, 674, 88, 88, - - 88, 88, 88, 88, 88, 88, 88, 88, 278, 674, - 88, 88, 674, 281, 674, 674, 674, 279, 674, 88, - 88, 88, 88, 674, 88, 88, 88, 674, 282, 88, - 674, 88, 674, 674, 674, 88, 674, 88, 283, 88, - 674, 88, 88, 88, 88, 88, 674, 674, 674, 674, - 88, 674, 88, 88, 88, 674, 88, 674, 674, 88, - 285, 88, 674, 88, 674, 88, 674, 88, 674, 88, - 88, 88, 88, 88, 674, 674, 286, 674, 88, 674, - 88, 88, 88, 674, 88, 674, 674, 287, 674, 88, - 674, 88, 88, 88, 674, 88, 674, 291, 88, 674, - - 88, 288, 290, 674, 88, 674, 88, 674, 88, 88, - 88, 88, 88, 674, 674, 88, 674, 88, 674, 88, - 674, 88, 674, 88, 674, 88, 674, 88, 292, 88, - 88, 88, 674, 293, 88, 674, 674, 674, 294, 674, - 88, 88, 88, 88, 88, 88, 88, 674, 674, 88, - 88, 674, 674, 674, 674, 674, 88, 88, 88, 674, - 88, 674, 674, 88, 295, 88, 674, 88, 674, 88, - 674, 88, 674, 88, 296, 88, 88, 88, 88, 674, - 297, 298, 88, 674, 88, 674, 674, 299, 88, 674, - 88, 674, 88, 674, 88, 88, 88, 88, 88, 674, - - 674, 674, 674, 88, 674, 88, 88, 88, 301, 88, - 302, 305, 674, 674, 88, 303, 88, 88, 88, 674, - 88, 674, 674, 674, 304, 88, 674, 88, 88, 88, - 674, 88, 674, 674, 309, 674, 88, 674, 88, 674, - 88, 674, 88, 236, 236, 236, 674, 88, 674, 674, - 674, 674, 88, 88, 674, 310, 310, 310, 310, 310, - 310, 310, 88, 88, 314, 88, 88, 88, 88, 315, - 674, 88, 88, 674, 88, 316, 674, 674, 88, 674, - 88, 674, 88, 674, 88, 317, 88, 88, 88, 88, - 88, 674, 674, 88, 674, 674, 674, 674, 674, 88, - - 88, 318, 88, 88, 88, 321, 88, 88, 88, 88, - 320, 674, 674, 674, 674, 674, 88, 88, 88, 88, - 88, 88, 88, 322, 674, 88, 88, 674, 88, 674, - 674, 674, 88, 674, 88, 319, 88, 674, 88, 88, - 88, 88, 88, 674, 674, 323, 674, 88, 674, 88, - 88, 88, 324, 88, 674, 674, 674, 674, 88, 674, - 88, 674, 88, 674, 88, 88, 325, 326, 88, 88, - 674, 88, 674, 674, 674, 88, 674, 88, 88, 88, - 88, 88, 88, 328, 327, 88, 88, 88, 329, 88, - 88, 330, 88, 674, 674, 331, 88, 674, 88, 88, - - 88, 88, 88, 88, 88, 88, 88, 88, 88, 674, - 674, 88, 674, 88, 674, 674, 674, 88, 674, 88, - 333, 332, 674, 88, 88, 88, 88, 88, 674, 674, - 674, 674, 88, 674, 88, 88, 88, 674, 88, 674, - 334, 674, 674, 88, 674, 88, 674, 335, 674, 88, - 88, 336, 674, 337, 88, 674, 88, 674, 674, 674, - 88, 674, 88, 674, 88, 674, 88, 88, 88, 88, - 88, 674, 674, 88, 674, 88, 674, 88, 674, 88, - 674, 88, 674, 88, 674, 88, 88, 88, 88, 88, - 674, 341, 88, 674, 674, 342, 674, 674, 88, 88, - - 88, 88, 88, 88, 88, 343, 674, 88, 88, 345, - 88, 674, 340, 674, 88, 674, 88, 674, 88, 674, - 88, 88, 88, 344, 88, 348, 346, 674, 674, 88, - 674, 88, 674, 88, 88, 88, 674, 347, 674, 674, - 88, 674, 88, 674, 88, 674, 88, 674, 88, 674, - 88, 674, 88, 88, 88, 674, 88, 674, 674, 349, - 88, 88, 88, 674, 88, 88, 351, 674, 88, 88, - 674, 674, 674, 674, 674, 88, 674, 88, 88, 88, - 88, 88, 88, 674, 88, 674, 352, 88, 674, 88, - 356, 88, 355, 88, 353, 88, 674, 674, 674, 88, - - 88, 88, 674, 88, 88, 88, 674, 357, 88, 674, - 674, 674, 674, 674, 88, 88, 88, 88, 88, 88, - 358, 88, 88, 88, 88, 674, 674, 674, 674, 674, - 674, 88, 88, 88, 88, 88, 88, 88, 674, 674, - 88, 88, 674, 674, 674, 674, 674, 88, 674, 88, - 88, 88, 674, 361, 674, 360, 88, 674, 88, 674, - 88, 88, 88, 674, 88, 674, 674, 674, 88, 88, - 88, 88, 88, 362, 674, 88, 88, 88, 363, 88, - 88, 674, 88, 674, 674, 365, 88, 674, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 674, - - 88, 88, 674, 88, 674, 674, 674, 88, 674, 88, - 88, 88, 88, 88, 88, 367, 88, 88, 88, 88, - 674, 364, 88, 674, 88, 674, 674, 369, 88, 674, - 88, 674, 88, 674, 88, 88, 88, 368, 88, 674, - 674, 88, 674, 88, 674, 88, 674, 88, 674, 88, - 674, 88, 674, 88, 88, 88, 88, 674, 371, 674, - 88, 674, 674, 674, 674, 674, 88, 674, 88, 674, - 88, 370, 674, 88, 674, 88, 310, 310, 310, 310, - 310, 310, 310, 88, 674, 88, 674, 88, 380, 88, - 674, 379, 88, 674, 674, 674, 674, 88, 381, 88, - - 674, 88, 674, 88, 382, 88, 674, 88, 88, 88, - 674, 88, 674, 88, 375, 88, 88, 88, 674, 88, - 384, 88, 674, 88, 88, 88, 674, 88, 674, 88, - 385, 88, 88, 88, 674, 88, 674, 674, 674, 88, - 88, 88, 88, 88, 674, 386, 674, 674, 88, 674, - 88, 674, 88, 88, 88, 674, 88, 674, 674, 674, - 88, 88, 88, 88, 88, 387, 674, 88, 88, 88, - 388, 88, 88, 674, 88, 389, 674, 674, 88, 674, - 88, 88, 88, 88, 390, 88, 88, 88, 88, 88, - 88, 674, 391, 88, 674, 88, 392, 393, 674, 88, - - 674, 88, 674, 88, 674, 88, 674, 88, 88, 88, - 88, 88, 674, 394, 88, 674, 674, 674, 674, 674, - 88, 88, 88, 88, 88, 88, 88, 395, 674, 88, - 88, 674, 674, 674, 674, 674, 88, 674, 88, 674, - 88, 88, 397, 674, 396, 88, 674, 88, 674, 674, - 674, 88, 674, 88, 674, 88, 674, 88, 88, 88, - 88, 88, 674, 674, 88, 398, 88, 674, 88, 674, - 88, 674, 88, 674, 88, 399, 400, 88, 88, 88, - 88, 674, 674, 88, 674, 674, 674, 404, 674, 88, - 88, 88, 88, 88, 88, 674, 674, 88, 88, 88, - - 88, 405, 674, 406, 674, 674, 674, 88, 674, 88, - 88, 88, 88, 674, 88, 407, 88, 88, 88, 88, - 408, 674, 674, 674, 674, 674, 674, 88, 88, 409, - 88, 88, 88, 674, 88, 88, 88, 88, 410, 674, - 674, 413, 674, 412, 88, 88, 88, 88, 88, 88, - 88, 411, 674, 88, 88, 674, 88, 674, 674, 674, - 88, 674, 88, 674, 88, 674, 88, 88, 88, 88, - 88, 674, 674, 674, 674, 88, 674, 88, 88, 88, - 674, 88, 674, 674, 88, 415, 88, 674, 88, 674, - 88, 674, 88, 674, 88, 88, 416, 88, 88, 674, - - 674, 674, 674, 88, 674, 88, 88, 88, 674, 88, - 674, 418, 88, 419, 88, 674, 88, 674, 88, 674, - 88, 674, 88, 88, 420, 88, 88, 674, 674, 674, - 674, 88, 674, 88, 674, 88, 88, 88, 674, 88, - 674, 421, 88, 423, 674, 674, 88, 88, 88, 88, - 88, 424, 425, 88, 674, 88, 674, 88, 88, 88, - 88, 88, 674, 674, 674, 674, 88, 674, 674, 674, - 88, 88, 88, 674, 88, 674, 674, 88, 428, 88, - 674, 88, 426, 88, 674, 88, 674, 88, 674, 88, - 88, 88, 88, 88, 674, 430, 88, 674, 674, 674, - - 674, 674, 88, 88, 88, 88, 88, 88, 88, 431, - 674, 88, 88, 674, 88, 674, 674, 674, 88, 674, - 88, 674, 88, 674, 88, 674, 88, 88, 88, 88, - 440, 441, 88, 88, 674, 674, 674, 674, 674, 88, - 88, 88, 88, 88, 88, 674, 88, 674, 88, 674, - 88, 88, 88, 433, 88, 88, 674, 674, 442, 88, - 674, 88, 674, 674, 674, 88, 674, 444, 674, 88, - 674, 88, 88, 88, 88, 88, 674, 674, 88, 445, - 88, 446, 88, 674, 88, 674, 88, 674, 88, 88, - 88, 88, 88, 674, 674, 88, 447, 88, 674, 88, - - 674, 88, 674, 88, 674, 88, 88, 448, 88, 88, - 674, 674, 674, 674, 88, 674, 88, 88, 88, 450, - 88, 674, 674, 88, 449, 88, 674, 88, 674, 88, - 674, 88, 674, 88, 674, 88, 88, 88, 674, 674, - 88, 451, 88, 452, 674, 674, 88, 674, 453, 674, - 88, 674, 88, 674, 88, 674, 88, 674, 88, 88, - 88, 454, 88, 88, 674, 88, 674, 674, 674, 674, - 674, 674, 88, 88, 88, 88, 88, 88, 88, 88, - 674, 88, 88, 674, 674, 455, 674, 674, 88, 88, - 88, 88, 88, 88, 88, 674, 456, 88, 88, 458, - - 88, 457, 674, 674, 88, 674, 88, 674, 88, 674, - 88, 88, 88, 88, 88, 462, 674, 88, 674, 88, - 674, 88, 674, 88, 463, 88, 674, 88, 674, 88, - 88, 88, 88, 88, 464, 674, 88, 674, 674, 674, - 674, 674, 88, 88, 88, 88, 88, 88, 674, 674, - 465, 88, 88, 88, 88, 467, 466, 674, 674, 674, - 674, 674, 674, 88, 88, 88, 88, 88, 88, 88, - 674, 674, 88, 88, 674, 674, 674, 88, 674, 88, - 469, 88, 674, 88, 674, 468, 674, 88, 88, 88, - 88, 88, 674, 674, 674, 674, 88, 674, 88, 674, - - 88, 88, 88, 674, 88, 471, 674, 470, 88, 88, - 88, 88, 88, 88, 674, 88, 88, 88, 473, 88, - 88, 674, 88, 674, 674, 674, 88, 674, 475, 88, - 88, 88, 88, 88, 476, 88, 88, 88, 88, 674, - 88, 88, 674, 478, 674, 674, 674, 88, 88, 88, - 88, 88, 88, 674, 88, 477, 88, 674, 88, 88, - 88, 674, 88, 88, 481, 674, 88, 88, 480, 88, - 674, 674, 674, 88, 674, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 483, 88, 88, 674, - 88, 674, 674, 674, 88, 674, 88, 88, 88, 88, - - 88, 88, 88, 88, 88, 88, 88, 485, 88, 88, - 674, 674, 674, 674, 674, 88, 674, 88, 88, 88, - 88, 88, 88, 494, 88, 674, 495, 88, 496, 88, - 674, 88, 674, 88, 674, 88, 674, 674, 674, 88, - 88, 88, 88, 88, 674, 498, 674, 674, 88, 674, - 88, 674, 88, 88, 88, 674, 88, 674, 674, 674, - 88, 88, 499, 88, 88, 500, 88, 88, 674, 88, - 674, 674, 88, 501, 88, 674, 88, 88, 88, 674, - 88, 674, 674, 674, 88, 88, 88, 88, 88, 88, - 88, 88, 674, 88, 674, 674, 88, 502, 88, 674, - - 88, 88, 88, 503, 88, 674, 674, 674, 88, 88, - 88, 88, 88, 88, 88, 88, 674, 88, 674, 674, - 88, 674, 674, 674, 88, 88, 88, 674, 88, 674, - 674, 674, 504, 88, 674, 88, 88, 88, 674, 88, - 674, 674, 506, 505, 88, 674, 88, 674, 88, 674, - 88, 674, 88, 88, 88, 88, 88, 674, 674, 88, - 674, 88, 674, 507, 674, 88, 512, 88, 674, 88, - 88, 88, 88, 88, 674, 674, 674, 674, 88, 674, - 88, 88, 88, 674, 88, 674, 674, 88, 513, 88, - 674, 88, 674, 88, 674, 88, 674, 88, 88, 88, - - 88, 88, 674, 674, 88, 674, 88, 515, 88, 674, - 88, 674, 88, 674, 88, 514, 88, 88, 88, 88, - 88, 516, 674, 88, 674, 674, 674, 674, 674, 88, - 88, 88, 88, 88, 88, 88, 88, 674, 88, 88, - 674, 674, 674, 674, 674, 88, 88, 88, 518, 88, - 88, 88, 88, 674, 88, 88, 674, 674, 674, 674, - 674, 520, 88, 88, 88, 88, 88, 674, 674, 88, - 88, 88, 88, 522, 674, 88, 674, 674, 674, 88, - 517, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 674, 524, 88, 674, 88, 674, 674, 525, - - 88, 674, 88, 674, 88, 674, 88, 674, 88, 88, - 88, 88, 674, 537, 527, 88, 529, 88, 674, 674, - 674, 88, 674, 88, 674, 88, 674, 88, 88, 88, - 88, 88, 674, 674, 88, 674, 88, 674, 88, 674, - 88, 538, 88, 674, 88, 674, 88, 88, 88, 88, - 539, 674, 674, 88, 674, 88, 674, 674, 674, 88, - 674, 88, 674, 88, 674, 88, 88, 88, 88, 88, - 674, 541, 674, 674, 88, 674, 88, 674, 88, 88, - 88, 674, 543, 674, 542, 88, 674, 88, 674, 88, - 88, 88, 674, 88, 674, 674, 674, 88, 88, 544, - - 88, 88, 88, 545, 88, 88, 88, 674, 88, 88, - 674, 546, 674, 674, 674, 88, 88, 88, 88, 88, - 88, 674, 88, 674, 88, 674, 88, 88, 88, 88, - 88, 674, 88, 674, 674, 88, 547, 674, 674, 88, - 674, 88, 88, 88, 88, 674, 88, 88, 88, 674, - 552, 88, 674, 88, 674, 674, 674, 88, 674, 88, - 674, 88, 674, 88, 88, 88, 88, 88, 674, 674, - 88, 674, 88, 674, 88, 674, 88, 674, 88, 674, - 88, 88, 88, 88, 88, 674, 674, 674, 674, 88, - 674, 88, 88, 88, 674, 88, 555, 674, 88, 553, - - 88, 674, 88, 674, 88, 560, 88, 674, 88, 88, - 88, 88, 88, 674, 674, 674, 558, 88, 674, 88, - 88, 88, 674, 88, 674, 674, 88, 674, 88, 674, - 88, 674, 88, 674, 88, 674, 88, 88, 88, 88, - 88, 674, 674, 88, 674, 88, 674, 88, 674, 562, - 674, 88, 674, 564, 88, 88, 88, 88, 674, 674, - 674, 674, 88, 674, 88, 88, 88, 674, 88, 674, - 674, 572, 674, 88, 674, 88, 88, 88, 573, 88, - 674, 674, 88, 674, 88, 674, 88, 674, 88, 674, - 88, 674, 88, 88, 88, 88, 88, 674, 674, 674, - - 674, 88, 674, 88, 88, 88, 575, 88, 674, 674, - 574, 674, 88, 674, 88, 88, 88, 674, 88, 674, - 576, 88, 674, 88, 674, 88, 674, 88, 674, 88, - 674, 88, 674, 577, 88, 88, 88, 88, 578, 674, - 88, 674, 674, 674, 674, 674, 88, 579, 88, 88, - 88, 88, 88, 88, 674, 88, 88, 674, 674, 674, - 584, 674, 88, 88, 88, 88, 88, 88, 583, 88, - 88, 88, 88, 674, 674, 674, 586, 674, 674, 88, - 88, 88, 589, 88, 88, 88, 674, 674, 88, 88, - 674, 88, 674, 674, 674, 88, 674, 88, 591, 88, - - 674, 88, 88, 88, 88, 88, 674, 674, 674, 592, - 88, 674, 88, 674, 88, 674, 88, 570, 570, 570, - 674, 88, 674, 674, 674, 674, 88, 88, 674, 599, - 599, 599, 599, 599, 599, 599, 88, 88, 88, 602, - 88, 88, 88, 88, 674, 88, 88, 674, 674, 601, - 674, 674, 88, 88, 88, 88, 88, 88, 88, 88, - 674, 88, 88, 674, 674, 674, 674, 674, 88, 88, - 88, 88, 88, 88, 88, 88, 603, 88, 88, 674, - 674, 674, 604, 674, 88, 88, 88, 88, 88, 88, - 88, 674, 674, 88, 88, 674, 674, 674, 88, 674, - - 88, 674, 88, 674, 88, 674, 88, 674, 88, 88, - 88, 608, 88, 674, 88, 674, 88, 88, 610, 674, - 88, 613, 88, 674, 88, 88, 88, 674, 88, 615, - 88, 674, 88, 88, 88, 674, 88, 616, 674, 674, - 88, 88, 88, 674, 88, 674, 674, 88, 88, 88, - 599, 599, 599, 599, 599, 599, 599, 88, 88, 624, - 88, 88, 88, 88, 674, 674, 88, 88, 674, 674, - 674, 88, 674, 88, 674, 88, 674, 88, 674, 674, - 674, 88, 88, 88, 88, 88, 674, 674, 622, 625, - 88, 674, 88, 674, 88, 88, 629, 674, 88, 631, - - 674, 674, 88, 88, 88, 88, 88, 88, 88, 88, - 636, 88, 674, 634, 88, 674, 674, 674, 88, 88, - 88, 674, 88, 637, 674, 674, 674, 88, 674, 88, - 674, 88, 674, 88, 623, 623, 623, 674, 88, 674, - 674, 674, 674, 88, 88, 674, 599, 599, 599, 599, - 599, 599, 599, 88, 88, 88, 88, 88, 88, 88, - 674, 643, 88, 88, 674, 88, 674, 644, 674, 88, - 674, 88, 674, 88, 674, 88, 88, 88, 88, 88, - 674, 674, 88, 648, 88, 674, 88, 674, 88, 674, - 88, 674, 88, 88, 88, 88, 88, 674, 674, 651, - - 653, 88, 674, 88, 674, 88, 88, 88, 659, 88, - 674, 674, 88, 674, 674, 674, 88, 88, 88, 88, - 88, 88, 674, 88, 674, 88, 674, 88, 88, 88, - 674, 88, 88, 674, 674, 88, 88, 674, 664, 674, - 661, 674, 88, 674, 88, 88, 88, 88, 674, 88, - 674, 88, 674, 674, 88, 658, 658, 658, 674, 674, - 674, 674, 674, 674, 88, 88, 674, 599, 599, 599, - 599, 599, 599, 599, 88, 88, 88, 88, 88, 88, - 88, 88, 674, 88, 88, 674, 667, 674, 674, 674, - 88, 88, 88, 88, 88, 88, 671, 88, 674, 88, - - 88, 674, 674, 674, 674, 674, 674, 88, 674, 88, - 674, 88, 674, 674, 674, 674, 88, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 50, 50, 50, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 61, 61, 61, 61, 61, 61, 61, - 61, 61, 61, 61, 61, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 74, 74, 74, - 674, 74, 74, 74, 74, 74, 74, 74, 74, 81, - 81, 674, 674, 81, 674, 81, 147, 674, 147, 150, - - 150, 674, 150, 150, 151, 151, 674, 151, 151, 151, - 674, 151, 151, 151, 151, 151, 154, 154, 154, 674, - 154, 154, 154, 154, 154, 154, 154, 154, 156, 156, - 156, 156, 156, 156, 156, 156, 674, 156, 156, 158, - 674, 674, 158, 674, 158, 158, 158, 158, 158, 158, - 162, 162, 674, 162, 162, 163, 163, 674, 163, 163, - 94, 94, 674, 94, 94, 13, 674, 674, 674, 674, - 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, - 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, - 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, - - 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, - 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, - 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, - 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, - 674, 674, 674, 674 + 16, 17, 18, 17, 19, 20, 21, 22, 23, 16, + 24, 25, 26, 27, 28, 28, 28, 28, 28, 28, + 29, 19, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 38, 38, 38, 40, 41, 42, 43, + 38, 44, 45, 46, 47, 48, 49, 38, 38, 38, + 50, 19, 51, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 23, 53, 23, 55, 56, + 55, 56, 59, 59, 63, 66, 57, 64, 57, 60, + 60, 63, 61, 61, 64, 66, 82, 82, 82, 82, + + 82, 82, 81, 67, 244, 81, 68, 81, 256, 94, + 77, 78, 77, 67, 257, 79, 68, 245, 89, 89, + 89, 77, 78, 77, 81, 81, 79, 156, 91, 250, + 89, 89, 92, 92, 92, 92, 92, 92, 95, 95, + 95, 95, 95, 95, 95, 97, 168, 328, 112, 171, + 171, 171, 171, 171, 171, 97, 85, 97, 69, 97, + 70, 82, 82, 82, 97, 251, 532, 156, 69, 719, + 70, 71, 72, 73, 72, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 30, 533, 80, 87, 97, 720, + 156, 71, 71, 71, 71, 30, 393, 80, 97, 75, + + 97, 97, 97, 720, 104, 392, 718, 97, 105, 156, + 326, 97, 106, 97, 107, 97, 97, 156, 716, 97, + 97, 71, 71, 71, 108, 109, 97, 395, 97, 110, + 97, 97, 111, 97, 720, 127, 715, 168, 97, 178, + 178, 178, 178, 178, 178, 178, 72, 71, 72, 71, + 72, 73, 72, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 128, 459, 97, 171, 171, 171, 168, 71, + 71, 71, 71, 713, 97, 113, 114, 75, 97, 253, + 254, 156, 327, 97, 129, 130, 115, 394, 131, 156, + 168, 116, 97, 712, 97, 97, 97, 513, 132, 71, + + 71, 71, 97, 97, 97, 97, 97, 97, 117, 97, + 156, 97, 456, 133, 97, 711, 562, 120, 97, 156, + 121, 457, 458, 168, 72, 71, 72, 81, 97, 122, + 123, 152, 97, 156, 156, 124, 156, 97, 514, 156, + 156, 85, 515, 597, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 600, 708, 87, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 97, 560, 168, 97, 97, + + 97, 97, 97, 97, 97, 156, 707, 156, 561, 97, + 98, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 99, 97, 100, 97, 101, 97, 97, 97, 97, 102, + 97, 97, 97, 97, 97, 655, 156, 706, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 97, 679, 559, 156, 704, 125, 97, 598, 598, 598, + 97, 599, 97, 126, 97, 629, 97, 156, 97, 97, + 97, 703, 156, 701, 698, 97, 156, 134, 97, 631, + 135, 696, 118, 156, 695, 694, 97, 693, 136, 139, + + 97, 691, 97, 119, 137, 156, 97, 97, 97, 97, + 97, 689, 140, 688, 686, 97, 141, 685, 144, 97, + 684, 97, 680, 97, 145, 97, 678, 142, 97, 677, + 676, 138, 143, 97, 675, 97, 672, 97, 670, 97, + 669, 146, 667, 97, 97, 149, 97, 97, 147, 664, + 663, 150, 97, 153, 662, 658, 97, 148, 97, 654, + 97, 657, 657, 657, 653, 97, 154, 154, 154, 154, + 154, 154, 154, 151, 89, 89, 89, 155, 652, 651, + 176, 97, 648, 646, 645, 643, 89, 89, 640, 639, + 638, 97, 157, 97, 632, 97, 628, 158, 167, 156, + + 97, 627, 167, 167, 167, 167, 167, 167, 167, 167, + 167, 95, 95, 95, 95, 95, 95, 95, 167, 167, + 167, 167, 97, 97, 178, 178, 178, 178, 178, 178, + 178, 626, 97, 182, 97, 97, 97, 97, 625, 181, + 624, 97, 97, 97, 97, 621, 619, 618, 167, 167, + 167, 616, 612, 97, 97, 97, 97, 97, 184, 97, + 611, 610, 97, 97, 596, 595, 183, 594, 593, 97, + 591, 97, 589, 97, 167, 167, 587, 185, 97, 167, + 167, 167, 167, 167, 167, 167, 167, 167, 585, 97, + 584, 582, 97, 578, 186, 167, 167, 167, 167, 97, + + 577, 97, 97, 97, 97, 97, 97, 576, 97, 575, + 187, 97, 169, 566, 558, 97, 557, 97, 97, 188, + 556, 555, 553, 551, 97, 167, 167, 167, 97, 97, + 97, 189, 97, 697, 697, 697, 548, 97, 546, 97, + 544, 97, 535, 97, 190, 97, 534, 520, 97, 516, + 512, 167, 192, 97, 511, 97, 510, 97, 191, 97, + 509, 508, 506, 97, 97, 97, 97, 97, 504, 97, + 501, 156, 97, 195, 496, 494, 97, 193, 194, 97, + 97, 97, 196, 97, 482, 97, 481, 480, 97, 463, + 455, 454, 97, 453, 97, 451, 97, 97, 197, 198, + + 97, 97, 448, 97, 200, 446, 441, 97, 436, 97, + 203, 97, 97, 97, 97, 97, 199, 201, 97, 97, + 433, 202, 97, 421, 420, 207, 419, 400, 97, 390, + 97, 204, 97, 97, 389, 388, 97, 97, 382, 208, + 375, 370, 366, 97, 97, 97, 97, 97, 97, 354, + 97, 353, 97, 172, 97, 97, 97, 168, 209, 97, + 210, 325, 322, 97, 321, 320, 314, 303, 298, 97, + 97, 97, 294, 97, 283, 282, 211, 212, 97, 257, + 97, 97, 97, 213, 97, 255, 168, 97, 252, 97, + 156, 97, 243, 97, 239, 97, 227, 97, 97, 215, + + 97, 97, 221, 214, 217, 206, 97, 205, 216, 180, + 97, 97, 97, 179, 97, 177, 173, 97, 172, 218, + 172, 97, 166, 97, 97, 97, 97, 97, 97, 164, + 97, 94, 219, 97, 162, 97, 161, 97, 97, 97, + 81, 97, 81, 96, 93, 97, 97, 97, 97, 97, + 97, 97, 97, 220, 97, 84, 222, 97, 81, 81, + 720, 97, 97, 97, 720, 97, 720, 720, 720, 720, + 97, 223, 97, 720, 97, 97, 97, 720, 225, 720, + 720, 224, 226, 720, 720, 97, 720, 97, 720, 97, + 228, 97, 720, 720, 97, 720, 720, 97, 720, 720, + + 720, 229, 720, 97, 720, 97, 720, 97, 97, 97, + 97, 97, 230, 720, 97, 231, 97, 720, 97, 720, + 97, 720, 97, 720, 97, 97, 97, 97, 97, 235, + 233, 720, 232, 97, 720, 97, 720, 234, 720, 97, + 97, 97, 720, 720, 97, 720, 236, 720, 720, 720, + 97, 97, 97, 97, 97, 97, 97, 97, 720, 97, + 97, 720, 720, 720, 720, 720, 97, 97, 97, 97, + 97, 238, 97, 97, 241, 237, 97, 242, 720, 240, + 720, 720, 97, 97, 97, 97, 97, 97, 97, 720, + 720, 97, 97, 720, 720, 720, 720, 720, 97, 720, + + 97, 720, 97, 248, 248, 248, 246, 97, 154, 154, + 154, 154, 154, 154, 154, 720, 720, 720, 720, 720, + 720, 720, 720, 720, 97, 97, 720, 258, 720, 720, + 720, 720, 720, 720, 97, 97, 97, 97, 97, 97, + 97, 249, 259, 97, 97, 720, 247, 720, 97, 720, + 97, 97, 97, 720, 97, 720, 720, 720, 260, 97, + 97, 97, 97, 97, 261, 97, 97, 97, 720, 97, + 97, 720, 97, 262, 720, 720, 97, 720, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 263, + 720, 97, 720, 97, 720, 720, 720, 264, 720, 97, + + 720, 97, 720, 97, 97, 97, 97, 97, 720, 265, + 97, 266, 97, 720, 97, 720, 97, 720, 97, 720, + 97, 97, 97, 97, 97, 720, 720, 267, 720, 97, + 720, 97, 97, 97, 720, 268, 720, 720, 720, 720, + 97, 720, 97, 720, 97, 720, 97, 271, 97, 269, + 270, 97, 720, 720, 97, 272, 720, 273, 97, 720, + 97, 720, 97, 720, 97, 97, 97, 97, 97, 720, + 720, 97, 720, 97, 720, 97, 720, 97, 274, 97, + 720, 97, 97, 97, 97, 97, 720, 720, 97, 720, + 97, 276, 97, 275, 97, 720, 97, 720, 97, 97, + + 97, 97, 97, 720, 720, 97, 720, 97, 279, 277, + 720, 97, 278, 97, 720, 97, 97, 97, 97, 97, + 720, 720, 720, 720, 97, 720, 97, 97, 97, 720, + 97, 720, 720, 280, 720, 97, 720, 97, 281, 97, + 97, 97, 720, 720, 720, 720, 97, 720, 97, 720, + 97, 97, 97, 720, 97, 720, 720, 284, 97, 97, + 285, 286, 97, 97, 287, 97, 97, 97, 720, 97, + 97, 720, 97, 720, 720, 290, 288, 720, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 289, 97, 291, + 97, 97, 720, 97, 720, 720, 97, 720, 720, 720, + + 97, 720, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 292, 720, 97, 97, 720, 295, 720, 720, + 720, 293, 720, 97, 97, 97, 97, 720, 97, 97, + 97, 720, 296, 97, 720, 97, 720, 720, 720, 97, + 720, 97, 297, 97, 720, 97, 97, 97, 97, 97, + 720, 720, 720, 720, 97, 720, 97, 97, 97, 720, + 97, 720, 720, 97, 299, 97, 720, 97, 720, 97, + 720, 97, 720, 97, 97, 97, 97, 97, 720, 720, + 300, 720, 97, 720, 97, 97, 97, 720, 97, 720, + 720, 301, 720, 97, 720, 97, 97, 97, 720, 97, + + 720, 305, 97, 720, 97, 302, 304, 720, 97, 720, + 97, 720, 97, 97, 97, 97, 97, 720, 720, 97, + 720, 97, 720, 97, 720, 97, 720, 97, 720, 97, + 720, 97, 306, 97, 97, 97, 720, 307, 97, 720, + 720, 720, 308, 720, 97, 97, 97, 97, 97, 97, + 97, 720, 720, 97, 97, 720, 720, 720, 720, 720, + 97, 97, 97, 720, 97, 720, 720, 97, 309, 97, + 720, 97, 720, 97, 720, 97, 720, 97, 310, 97, + 97, 97, 97, 720, 311, 312, 97, 720, 97, 720, + 720, 313, 97, 720, 97, 720, 97, 720, 97, 97, + + 97, 97, 97, 720, 720, 720, 720, 97, 720, 97, + 97, 97, 315, 97, 316, 319, 720, 720, 97, 317, + 97, 97, 97, 720, 97, 720, 720, 720, 318, 97, + 720, 97, 97, 97, 720, 97, 720, 720, 323, 720, + 97, 720, 97, 720, 97, 720, 97, 248, 248, 248, + 720, 97, 720, 720, 720, 720, 97, 97, 720, 324, + 324, 324, 324, 324, 324, 324, 97, 97, 329, 97, + 97, 97, 97, 330, 720, 97, 97, 720, 97, 331, + 720, 720, 97, 720, 97, 720, 97, 720, 97, 332, + 97, 97, 97, 97, 97, 720, 720, 97, 720, 720, + + 720, 720, 720, 97, 97, 333, 97, 97, 97, 336, + 97, 97, 97, 97, 335, 720, 720, 720, 720, 720, + 97, 97, 97, 97, 97, 97, 97, 337, 720, 97, + 97, 720, 97, 720, 720, 720, 97, 720, 97, 334, + 97, 720, 97, 97, 97, 97, 97, 720, 720, 338, + 720, 97, 720, 97, 97, 97, 339, 97, 720, 720, + 720, 720, 97, 720, 97, 720, 97, 720, 97, 97, + 340, 341, 97, 97, 720, 97, 720, 720, 720, 97, + 720, 97, 97, 97, 97, 97, 97, 343, 342, 97, + 97, 97, 344, 97, 97, 345, 97, 720, 720, 346, + + 97, 720, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 720, 720, 97, 720, 97, 720, 720, + 720, 97, 720, 97, 348, 347, 720, 97, 97, 97, + 97, 97, 720, 720, 720, 720, 97, 720, 97, 97, + 97, 720, 97, 720, 349, 720, 720, 97, 720, 97, + 720, 350, 720, 97, 97, 351, 720, 352, 97, 720, + 97, 720, 720, 720, 97, 720, 97, 720, 97, 720, + 97, 97, 97, 97, 97, 720, 720, 97, 720, 97, + 720, 97, 720, 97, 720, 97, 720, 97, 720, 97, + 97, 97, 97, 97, 720, 356, 97, 720, 720, 357, + + 720, 720, 97, 97, 97, 97, 97, 97, 97, 358, + 720, 97, 97, 360, 97, 720, 355, 720, 97, 720, + 97, 720, 97, 364, 97, 720, 97, 359, 97, 97, + 361, 720, 97, 97, 362, 720, 720, 720, 720, 97, + 97, 97, 97, 97, 97, 363, 97, 720, 97, 720, + 97, 97, 97, 97, 97, 720, 720, 365, 720, 97, + 720, 97, 367, 97, 97, 97, 720, 97, 720, 720, + 720, 97, 97, 97, 97, 97, 97, 97, 97, 720, + 97, 720, 368, 97, 720, 97, 372, 97, 371, 97, + 369, 97, 720, 720, 720, 97, 97, 97, 720, 97, + + 97, 97, 720, 373, 97, 720, 720, 720, 720, 720, + 97, 97, 97, 97, 97, 97, 374, 97, 97, 97, + 97, 720, 720, 720, 720, 720, 720, 97, 97, 97, + 97, 97, 97, 97, 720, 720, 97, 97, 720, 720, + 720, 720, 720, 97, 720, 97, 97, 97, 720, 377, + 720, 376, 97, 720, 97, 720, 97, 97, 97, 720, + 97, 720, 720, 720, 97, 97, 97, 97, 97, 378, + 720, 97, 97, 97, 379, 97, 97, 720, 97, 720, + 720, 381, 97, 720, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 720, 97, 97, 720, 97, + + 720, 720, 720, 97, 720, 97, 97, 97, 97, 97, + 97, 383, 97, 97, 97, 97, 720, 380, 97, 720, + 97, 720, 720, 385, 97, 720, 97, 720, 97, 720, + 97, 97, 97, 384, 97, 720, 720, 97, 720, 97, + 720, 97, 720, 97, 720, 97, 720, 97, 720, 97, + 97, 97, 97, 720, 387, 720, 97, 720, 720, 720, + 720, 720, 97, 720, 97, 720, 97, 386, 720, 97, + 720, 97, 324, 324, 324, 324, 324, 324, 324, 97, + 720, 97, 720, 97, 397, 97, 720, 396, 97, 720, + 720, 720, 720, 97, 398, 97, 720, 97, 720, 97, + + 399, 97, 720, 97, 97, 97, 720, 97, 720, 97, + 391, 97, 97, 97, 720, 97, 401, 97, 720, 97, + 97, 97, 720, 97, 720, 97, 402, 97, 97, 97, + 720, 97, 720, 720, 720, 97, 97, 97, 97, 97, + 720, 403, 720, 720, 97, 720, 97, 720, 97, 97, + 97, 720, 97, 720, 720, 720, 97, 97, 97, 97, + 97, 404, 720, 97, 97, 97, 405, 97, 97, 720, + 97, 406, 720, 720, 97, 720, 97, 97, 97, 97, + 407, 97, 97, 97, 97, 97, 97, 720, 408, 97, + 720, 97, 409, 410, 720, 97, 720, 97, 720, 97, + + 720, 97, 720, 97, 97, 97, 97, 97, 720, 411, + 97, 720, 720, 412, 720, 720, 97, 97, 97, 97, + 97, 97, 97, 413, 720, 97, 97, 720, 720, 720, + 720, 720, 97, 720, 97, 720, 97, 97, 415, 720, + 414, 97, 720, 97, 720, 720, 720, 97, 720, 97, + 720, 97, 720, 97, 97, 97, 97, 97, 720, 720, + 97, 416, 97, 720, 97, 720, 97, 720, 97, 720, + 97, 417, 418, 97, 97, 97, 97, 720, 720, 97, + 720, 720, 720, 422, 720, 97, 97, 97, 97, 97, + 97, 720, 720, 97, 97, 97, 97, 423, 720, 424, + + 720, 720, 720, 97, 720, 97, 97, 97, 97, 720, + 97, 425, 97, 97, 97, 97, 426, 720, 720, 720, + 720, 720, 720, 97, 97, 427, 97, 97, 97, 97, + 720, 720, 97, 97, 720, 97, 720, 720, 429, 97, + 720, 97, 720, 97, 720, 97, 97, 97, 428, 97, + 431, 720, 720, 432, 97, 720, 97, 97, 97, 720, + 97, 720, 720, 430, 720, 97, 720, 97, 97, 97, + 720, 97, 720, 720, 97, 720, 97, 720, 97, 720, + 97, 720, 97, 720, 97, 97, 97, 97, 97, 720, + 720, 97, 434, 97, 720, 97, 720, 97, 720, 97, + + 720, 97, 97, 435, 97, 97, 720, 720, 720, 720, + 97, 720, 97, 97, 97, 720, 97, 720, 437, 97, + 438, 97, 720, 97, 720, 97, 720, 97, 720, 97, + 97, 439, 97, 97, 720, 720, 720, 720, 97, 720, + 97, 720, 97, 97, 97, 720, 97, 720, 440, 97, + 442, 720, 720, 97, 97, 97, 97, 97, 443, 444, + 97, 720, 97, 720, 97, 97, 97, 97, 97, 720, + 720, 720, 720, 97, 720, 720, 720, 97, 97, 97, + 720, 97, 720, 720, 97, 447, 97, 720, 97, 445, + 97, 720, 97, 720, 97, 720, 97, 97, 97, 97, + + 97, 720, 449, 97, 720, 720, 720, 720, 720, 97, + 97, 97, 97, 97, 97, 97, 450, 720, 97, 97, + 720, 97, 720, 720, 720, 97, 720, 97, 720, 97, + 720, 97, 720, 97, 97, 97, 97, 460, 461, 97, + 97, 720, 720, 720, 720, 720, 97, 97, 97, 97, + 97, 97, 720, 97, 720, 97, 720, 97, 97, 97, + 452, 97, 97, 720, 720, 462, 97, 720, 97, 720, + 720, 720, 97, 720, 464, 720, 97, 720, 97, 97, + 97, 97, 97, 720, 720, 97, 465, 97, 466, 97, + 720, 97, 720, 97, 720, 97, 97, 97, 97, 97, + + 720, 720, 97, 467, 97, 720, 97, 720, 97, 720, + 97, 720, 97, 97, 468, 97, 97, 720, 720, 720, + 720, 97, 720, 97, 97, 97, 470, 97, 720, 720, + 97, 469, 97, 720, 97, 720, 97, 720, 97, 720, + 97, 720, 97, 97, 97, 720, 720, 97, 471, 97, + 472, 720, 720, 97, 720, 473, 720, 97, 720, 97, + 720, 97, 720, 97, 97, 97, 97, 97, 720, 475, + 97, 720, 97, 720, 97, 720, 474, 720, 97, 720, + 97, 97, 97, 97, 97, 720, 720, 97, 720, 97, + 720, 97, 720, 97, 476, 97, 720, 97, 97, 97, + + 97, 97, 720, 720, 97, 720, 97, 720, 97, 720, + 97, 478, 97, 720, 97, 477, 97, 97, 97, 479, + 97, 97, 720, 97, 720, 483, 720, 720, 720, 720, + 97, 97, 97, 97, 97, 97, 97, 720, 720, 97, + 97, 720, 97, 484, 485, 720, 97, 720, 97, 720, + 97, 720, 97, 97, 97, 97, 97, 720, 720, 97, + 720, 97, 487, 97, 720, 97, 720, 97, 720, 97, + 486, 97, 97, 97, 97, 488, 720, 720, 97, 720, + 97, 489, 720, 720, 97, 720, 97, 720, 97, 720, + 97, 97, 97, 97, 97, 720, 720, 720, 720, 97, + + 720, 97, 720, 97, 720, 97, 97, 490, 720, 491, + 97, 720, 97, 720, 720, 720, 97, 720, 97, 720, + 97, 720, 97, 97, 97, 97, 97, 720, 720, 492, + 493, 97, 720, 97, 97, 97, 720, 97, 720, 495, + 97, 720, 97, 720, 97, 720, 97, 720, 97, 720, + 97, 97, 97, 97, 97, 720, 720, 97, 720, 97, + 720, 97, 720, 497, 720, 97, 720, 97, 97, 498, + 97, 97, 720, 720, 720, 720, 97, 720, 97, 720, + 97, 97, 97, 720, 500, 720, 499, 97, 720, 97, + 720, 97, 720, 97, 720, 97, 720, 720, 720, 97, + + 97, 97, 720, 97, 97, 503, 720, 97, 97, 502, + 97, 720, 720, 720, 97, 720, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 505, 97, 97, + 720, 97, 720, 720, 720, 97, 720, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 507, 97, + 97, 720, 720, 720, 720, 720, 97, 720, 97, 97, + 97, 97, 97, 97, 517, 97, 720, 518, 97, 519, + 97, 720, 97, 720, 97, 720, 97, 720, 720, 720, + 97, 97, 97, 97, 97, 720, 521, 720, 720, 97, + 720, 97, 720, 97, 97, 97, 720, 97, 720, 720, + + 720, 97, 97, 522, 97, 97, 523, 97, 97, 720, + 97, 720, 720, 97, 524, 97, 720, 97, 97, 97, + 720, 97, 720, 720, 720, 97, 97, 97, 97, 97, + 97, 97, 97, 720, 97, 720, 720, 97, 525, 97, + 720, 97, 97, 97, 526, 97, 720, 720, 720, 97, + 97, 97, 97, 97, 97, 97, 97, 720, 97, 720, + 527, 97, 720, 97, 720, 97, 97, 97, 720, 97, + 720, 720, 720, 97, 97, 97, 97, 97, 97, 97, + 97, 528, 97, 720, 529, 97, 720, 530, 720, 97, + 97, 97, 720, 97, 720, 720, 720, 97, 97, 97, + + 531, 97, 97, 97, 97, 720, 97, 720, 720, 97, + 536, 97, 720, 97, 97, 97, 720, 97, 720, 720, + 720, 97, 97, 97, 97, 97, 97, 97, 97, 537, + 97, 720, 720, 97, 720, 97, 720, 97, 720, 97, + 720, 97, 720, 720, 720, 97, 97, 97, 97, 97, + 720, 539, 538, 720, 97, 720, 97, 720, 97, 97, + 97, 720, 97, 720, 720, 720, 97, 97, 97, 97, + 97, 97, 720, 97, 540, 97, 97, 541, 97, 97, + 720, 720, 97, 720, 720, 720, 97, 720, 97, 97, + 97, 97, 97, 97, 543, 97, 97, 97, 97, 720, + + 97, 97, 720, 720, 720, 720, 720, 545, 720, 97, + 97, 97, 97, 97, 97, 720, 97, 547, 720, 97, + 720, 97, 720, 97, 542, 97, 720, 97, 720, 97, + 720, 97, 97, 97, 720, 97, 720, 720, 720, 97, + 97, 97, 97, 97, 720, 549, 720, 720, 97, 720, + 97, 720, 97, 550, 97, 720, 97, 720, 720, 563, + 97, 97, 97, 97, 97, 720, 552, 720, 720, 97, + 554, 97, 720, 97, 97, 97, 720, 97, 720, 720, + 720, 97, 97, 97, 97, 97, 97, 97, 97, 720, + 97, 720, 720, 97, 564, 97, 565, 97, 720, 97, + + 720, 97, 720, 97, 720, 97, 97, 97, 720, 97, + 720, 97, 720, 97, 97, 97, 720, 97, 720, 567, + 720, 97, 97, 97, 97, 97, 720, 569, 720, 568, + 97, 720, 97, 720, 97, 97, 97, 720, 97, 720, + 720, 572, 97, 97, 570, 97, 97, 97, 571, 97, + 97, 97, 720, 97, 97, 720, 97, 720, 720, 720, + 97, 720, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 720, 573, 97, 720, 97, 720, 720, + 720, 97, 720, 97, 574, 97, 720, 97, 97, 97, + 97, 97, 720, 720, 97, 720, 97, 579, 97, 720, + + 97, 720, 97, 720, 97, 97, 97, 97, 97, 720, + 720, 97, 720, 97, 720, 97, 720, 97, 720, 97, + 720, 97, 97, 97, 97, 97, 720, 720, 97, 720, + 97, 720, 97, 720, 97, 580, 97, 720, 97, 97, + 97, 97, 97, 720, 720, 720, 720, 97, 720, 97, + 97, 97, 720, 97, 583, 720, 97, 581, 97, 720, + 97, 720, 97, 588, 97, 720, 97, 97, 97, 97, + 97, 720, 720, 720, 586, 97, 720, 97, 97, 97, + 720, 97, 720, 720, 97, 720, 97, 720, 97, 720, + 97, 720, 97, 720, 97, 97, 97, 97, 97, 720, + + 720, 97, 720, 97, 720, 97, 720, 590, 720, 97, + 720, 592, 97, 97, 97, 97, 720, 720, 720, 720, + 97, 720, 97, 97, 97, 720, 97, 720, 720, 601, + 720, 97, 720, 97, 97, 97, 602, 97, 720, 720, + 97, 720, 97, 720, 97, 720, 97, 720, 97, 720, + 97, 97, 97, 97, 97, 720, 720, 720, 720, 97, + 720, 97, 97, 97, 604, 97, 720, 720, 603, 720, + 97, 720, 97, 97, 97, 720, 97, 720, 605, 97, + 720, 97, 720, 97, 720, 97, 720, 97, 720, 97, + 720, 606, 97, 97, 97, 607, 720, 97, 97, 608, + + 97, 720, 720, 720, 97, 720, 97, 97, 97, 97, + 609, 97, 97, 97, 97, 97, 97, 720, 720, 97, + 720, 720, 720, 97, 720, 97, 720, 97, 720, 97, + 720, 613, 720, 97, 97, 97, 614, 97, 97, 97, + 720, 720, 97, 720, 720, 615, 617, 720, 97, 97, + 97, 97, 97, 97, 97, 720, 720, 97, 97, 720, + 720, 720, 97, 720, 97, 720, 620, 720, 97, 720, + 97, 720, 97, 97, 97, 622, 97, 720, 720, 720, + 97, 97, 97, 97, 97, 720, 720, 720, 623, 97, + 720, 720, 720, 97, 720, 97, 720, 97, 598, 598, + + 598, 720, 97, 720, 720, 720, 720, 97, 97, 720, + 630, 630, 630, 630, 630, 630, 630, 97, 97, 97, + 634, 97, 97, 97, 97, 720, 97, 97, 720, 720, + 633, 720, 720, 97, 97, 97, 97, 97, 97, 97, + 97, 720, 97, 97, 720, 720, 720, 720, 720, 97, + 97, 97, 97, 97, 97, 97, 720, 635, 97, 97, + 720, 97, 720, 720, 720, 97, 720, 97, 636, 97, + 720, 97, 97, 97, 97, 97, 720, 720, 97, 637, + 97, 720, 97, 720, 97, 720, 97, 720, 97, 97, + 97, 97, 97, 720, 720, 720, 720, 97, 720, 97, + + 97, 641, 720, 97, 720, 720, 97, 720, 97, 720, + 97, 720, 97, 642, 97, 720, 97, 97, 644, 97, + 97, 720, 720, 97, 647, 97, 720, 97, 720, 97, + 649, 97, 720, 97, 97, 97, 97, 97, 720, 720, + 720, 650, 97, 720, 97, 720, 97, 720, 97, 720, + 720, 97, 97, 97, 630, 630, 630, 630, 630, 630, + 630, 97, 97, 659, 97, 97, 97, 97, 97, 720, + 97, 97, 720, 720, 720, 720, 720, 97, 97, 97, + 660, 97, 97, 97, 720, 720, 97, 97, 720, 720, + 720, 720, 656, 97, 97, 97, 720, 97, 720, 720, + + 97, 661, 97, 720, 97, 720, 97, 720, 97, 720, + 97, 665, 666, 97, 97, 97, 720, 720, 97, 97, + 720, 97, 668, 673, 720, 97, 720, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 671, 97, 97, 720, + 97, 720, 674, 720, 720, 720, 720, 720, 97, 720, + 97, 720, 97, 657, 657, 657, 720, 97, 720, 720, + 720, 720, 97, 720, 720, 630, 630, 630, 630, 630, + 630, 630, 97, 97, 97, 720, 97, 720, 720, 720, + 681, 97, 720, 97, 97, 97, 720, 97, 720, 720, + 97, 682, 97, 720, 97, 720, 97, 720, 97, 720, + + 97, 97, 97, 97, 97, 720, 720, 683, 720, 97, + 720, 97, 97, 97, 720, 97, 720, 720, 720, 720, + 97, 720, 97, 97, 97, 720, 97, 720, 720, 97, + 687, 97, 720, 97, 720, 97, 720, 97, 720, 97, + 97, 97, 97, 97, 720, 720, 690, 692, 97, 720, + 97, 720, 97, 97, 97, 699, 97, 720, 720, 97, + 720, 720, 720, 97, 97, 97, 97, 97, 97, 700, + 97, 720, 97, 720, 97, 97, 97, 97, 97, 720, + 97, 720, 720, 97, 720, 720, 720, 97, 720, 97, + 97, 97, 97, 720, 97, 97, 97, 720, 705, 97, + + 702, 720, 720, 720, 720, 97, 720, 97, 720, 97, + 697, 697, 697, 720, 97, 720, 720, 720, 720, 97, + 720, 720, 630, 630, 630, 630, 630, 630, 630, 97, + 97, 97, 720, 97, 720, 720, 97, 720, 97, 720, + 97, 709, 97, 710, 97, 720, 97, 97, 97, 97, + 97, 720, 720, 720, 720, 97, 720, 97, 97, 97, + 720, 97, 720, 714, 97, 720, 97, 720, 97, 720, + 97, 720, 97, 720, 717, 97, 97, 97, 97, 720, + 720, 97, 720, 97, 720, 97, 720, 97, 720, 97, + 720, 97, 720, 97, 97, 97, 720, 720, 720, 720, + + 97, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 83, 83, 83, 720, 83, 83, 83, + 83, 83, 83, 83, 83, 90, 90, 720, 720, 90, + 720, 90, 156, 720, 156, 159, 159, 720, 159, 159, + + 160, 160, 720, 160, 160, 160, 720, 160, 160, 160, + 160, 160, 163, 163, 163, 720, 163, 163, 163, 163, + 163, 163, 163, 163, 165, 165, 165, 165, 165, 165, + 165, 165, 720, 165, 165, 167, 720, 720, 167, 167, + 167, 167, 167, 167, 167, 167, 168, 720, 720, 168, + 168, 168, 168, 168, 168, 168, 168, 170, 720, 720, + 170, 720, 170, 170, 170, 170, 170, 170, 174, 174, + 720, 174, 174, 175, 175, 720, 175, 175, 103, 103, + 720, 103, 103, 15, 720, 720, 720, 720, 720, 720, + 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, + + 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, + 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, + 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, + 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, + 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, + 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, + 720, 720 } ; -static yyconst short int yy_chk[4245] = +static yyconst short int yy_chk[4563] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -1213,485 +1274,521 @@ static yyconst short int yy_chk[4245] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 4, 4, 5, 6, 7, 9, 3, 7, 4, 5, - 6, 8, 5, 6, 8, 10, 459, 11, 11, 11, - - 78, 143, 11, 9, 164, 669, 9, 12, 12, 12, - 164, 70, 12, 10, 143, 459, 10, 15, 15, 15, - 16, 16, 16, 15, 378, 70, 16, 20, 20, 20, - 24, 78, 24, 20, 22, 378, 148, 22, 148, 20, - 20, 22, 22, 22, 22, 22, 22, 26, 26, 26, - 26, 26, 26, 26, 665, 36, 70, 149, 9, 149, - 9, 68, 68, 68, 663, 36, 31, 36, 10, 36, - 10, 11, 31, 11, 36, 238, 31, 33, 31, 31, - 31, 12, 238, 12, 19, 31, 662, 33, 33, 33, - 239, 33, 69, 69, 69, 660, 33, 239, 19, 33, - - 656, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 598, 598, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 29, 655, 492, 29, 29, 29, 29, 29, - 29, 29, 73, 73, 73, 492, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 159, 159, 159, 29, 29, 29, 29, 29, - - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 30, 311, 312, - 30, 652, 311, 32, 30, 312, 32, 30, 30, 30, - 30, 30, 650, 32, 376, 32, 30, 32, 34, 34, - 30, 376, 32, 437, 313, 377, 646, 35, 438, 34, - 313, 34, 438, 34, 641, 34, 437, 35, 34, 35, - 377, 35, 37, 37, 534, 37, 35, 439, 534, 439, - 640, 491, 536, 37, 37, 37, 639, 37, 493, 35, - 37, 493, 37, 38, 38, 39, 491, 536, 571, 638, - 35, 38, 571, 569, 38, 39, 38, 39, 38, 39, - - 569, 40, 40, 38, 39, 40, 41, 41, 621, 41, - 621, 40, 635, 40, 633, 40, 632, 41, 628, 41, - 40, 41, 42, 41, 627, 42, 41, 80, 80, 80, - 40, 39, 42, 80, 42, 43, 42, 626, 43, 80, - 80, 42, 43, 620, 619, 43, 618, 43, 617, 43, - 41, 614, 612, 43, 43, 44, 611, 609, 43, 607, - 606, 44, 44, 605, 597, 45, 535, 535, 535, 596, - 595, 593, 44, 590, 44, 45, 44, 45, 44, 45, - 588, 44, 587, 45, 45, 44, 585, 46, 47, 582, - 581, 580, 568, 567, 44, 47, 566, 46, 47, 46, - - 47, 46, 47, 565, 535, 45, 46, 47, 48, 48, - 48, 48, 48, 48, 48, 563, 559, 557, 556, 48, - 600, 600, 600, 46, 83, 83, 83, 83, 83, 83, - 83, 554, 550, 549, 48, 548, 533, 88, 89, 48, - 86, 86, 86, 86, 86, 86, 86, 88, 89, 88, - 89, 88, 89, 90, 91, 89, 88, 89, 600, 642, - 642, 642, 532, 90, 91, 90, 91, 90, 91, 92, - 531, 530, 90, 91, 528, 93, 526, 91, 523, 92, - 521, 92, 519, 92, 517, 93, 95, 93, 92, 93, - 511, 95, 96, 93, 93, 510, 95, 642, 95, 509, - - 95, 508, 96, 97, 96, 95, 96, 497, 490, 489, - 96, 96, 488, 97, 98, 97, 487, 97, 484, 482, - 99, 479, 97, 474, 98, 472, 98, 98, 98, 461, - 99, 460, 99, 98, 99, 100, 100, 443, 436, 99, - 435, 101, 101, 434, 433, 432, 100, 429, 100, 100, - 100, 427, 101, 102, 101, 100, 101, 422, 417, 414, - 403, 101, 402, 102, 102, 102, 103, 102, 401, 104, - 103, 383, 102, 374, 373, 372, 103, 370, 103, 104, - 103, 104, 366, 104, 364, 103, 106, 106, 104, 105, - 105, 105, 359, 354, 350, 340, 106, 107, 106, 105, - - 106, 105, 339, 105, 106, 106, 338, 107, 105, 107, - 108, 107, 319, 111, 308, 307, 107, 306, 300, 289, - 108, 111, 108, 108, 108, 284, 280, 112, 269, 108, - 112, 111, 268, 111, 241, 111, 237, 112, 113, 112, - 111, 112, 233, 232, 114, 114, 112, 231, 113, 227, - 113, 215, 113, 209, 114, 115, 114, 113, 114, 205, - 194, 114, 114, 114, 193, 115, 116, 115, 115, 115, - 165, 161, 117, 157, 115, 147, 116, 142, 116, 139, - 116, 129, 117, 118, 117, 116, 117, 124, 116, 119, - 110, 117, 109, 118, 87, 118, 120, 118, 84, 121, - - 81, 76, 118, 75, 120, 72, 120, 63, 120, 121, - 120, 121, 122, 121, 60, 120, 57, 121, 121, 56, - 123, 53, 122, 125, 122, 27, 122, 23, 18, 17, - 123, 122, 123, 125, 123, 125, 126, 125, 123, 123, - 14, 125, 125, 13, 0, 0, 126, 127, 126, 0, - 126, 0, 0, 0, 0, 126, 126, 127, 0, 127, - 128, 127, 0, 128, 0, 0, 127, 128, 0, 0, - 128, 0, 128, 0, 128, 130, 130, 0, 0, 128, - 0, 0, 131, 0, 0, 0, 130, 0, 130, 0, - 130, 0, 131, 132, 131, 130, 131, 131, 0, 133, - - 131, 131, 0, 132, 0, 132, 0, 132, 0, 133, - 134, 133, 132, 133, 135, 133, 0, 132, 133, 0, - 134, 0, 134, 0, 134, 135, 136, 0, 0, 134, - 0, 136, 0, 0, 0, 135, 136, 135, 136, 135, - 136, 137, 138, 0, 135, 136, 0, 0, 0, 0, - 0, 137, 138, 137, 138, 137, 138, 140, 141, 141, - 137, 138, 141, 0, 140, 0, 0, 140, 141, 140, - 141, 140, 141, 144, 0, 0, 140, 141, 0, 0, - 0, 0, 0, 144, 0, 144, 0, 144, 146, 146, - 146, 144, 144, 145, 145, 145, 145, 145, 145, 145, - - 146, 146, 146, 146, 146, 146, 146, 166, 166, 166, - 166, 166, 166, 166, 0, 169, 0, 0, 169, 0, - 0, 0, 0, 0, 0, 169, 146, 169, 170, 169, - 0, 145, 0, 169, 169, 0, 171, 0, 170, 172, - 170, 0, 170, 0, 0, 0, 171, 170, 171, 172, - 171, 172, 173, 172, 0, 171, 0, 0, 172, 0, - 174, 0, 173, 175, 173, 173, 173, 174, 0, 0, - 174, 173, 174, 175, 174, 175, 176, 175, 0, 174, - 0, 0, 175, 0, 177, 0, 176, 0, 176, 0, - 176, 0, 178, 176, 177, 176, 177, 0, 177, 0, - - 179, 0, 178, 177, 178, 0, 178, 179, 178, 0, - 179, 178, 179, 180, 179, 0, 0, 0, 0, 179, - 0, 181, 0, 180, 182, 180, 0, 180, 0, 0, - 180, 181, 180, 181, 182, 181, 182, 0, 182, 0, - 181, 182, 182, 182, 183, 183, 184, 0, 0, 184, - 0, 0, 183, 0, 0, 183, 184, 183, 184, 183, - 184, 185, 0, 0, 183, 184, 0, 186, 0, 0, - 0, 185, 0, 185, 185, 185, 0, 186, 187, 186, - 185, 186, 0, 0, 188, 0, 186, 188, 187, 187, - 187, 0, 187, 0, 188, 189, 188, 187, 188, 0, - - 0, 190, 0, 188, 190, 189, 0, 189, 189, 189, - 0, 190, 191, 190, 189, 190, 0, 0, 0, 0, - 190, 0, 191, 192, 191, 0, 191, 0, 0, 191, - 0, 191, 0, 192, 192, 192, 195, 192, 0, 0, - 0, 0, 192, 0, 196, 0, 195, 197, 195, 0, - 195, 0, 0, 195, 196, 195, 196, 197, 196, 197, - 197, 197, 198, 196, 0, 199, 197, 0, 200, 0, - 0, 200, 198, 0, 198, 199, 198, 199, 200, 199, - 200, 198, 200, 199, 199, 201, 202, 200, 0, 203, - 0, 0, 201, 0, 0, 0, 202, 0, 202, 203, - - 202, 203, 201, 203, 201, 202, 201, 204, 203, 0, - 206, 201, 0, 206, 0, 0, 0, 204, 0, 204, - 206, 204, 206, 0, 206, 207, 204, 0, 207, 206, - 0, 208, 0, 0, 0, 207, 0, 207, 208, 207, - 0, 208, 210, 208, 207, 208, 0, 0, 0, 0, - 208, 0, 210, 211, 210, 0, 210, 0, 0, 212, - 210, 210, 0, 211, 0, 211, 0, 211, 0, 212, - 213, 212, 211, 212, 0, 0, 212, 0, 212, 0, - 213, 214, 213, 0, 213, 0, 0, 213, 0, 213, - 0, 214, 216, 214, 0, 214, 0, 217, 217, 0, - - 214, 214, 216, 0, 216, 0, 216, 0, 217, 218, - 217, 216, 217, 0, 0, 219, 0, 217, 0, 218, - 0, 218, 0, 218, 0, 219, 0, 219, 218, 219, - 220, 221, 0, 220, 219, 0, 0, 0, 221, 0, - 220, 221, 220, 221, 220, 221, 222, 0, 0, 220, - 221, 0, 0, 0, 0, 0, 222, 223, 222, 0, + 6, 8, 5, 6, 8, 10, 17, 17, 17, 18, + + 18, 18, 17, 9, 152, 18, 9, 26, 176, 26, + 13, 13, 13, 10, 176, 13, 10, 152, 22, 22, + 22, 14, 14, 14, 22, 24, 14, 157, 24, 157, + 22, 22, 24, 24, 24, 24, 24, 24, 28, 28, + 28, 28, 28, 28, 28, 34, 253, 253, 34, 77, + 77, 77, 78, 78, 78, 34, 87, 34, 9, 34, + 9, 82, 82, 82, 34, 158, 480, 158, 10, 716, + 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 13, 480, 13, 87, 38, 79, + 326, 11, 11, 11, 11, 14, 326, 14, 38, 11, + + 38, 32, 38, 79, 32, 325, 712, 38, 32, 325, + 250, 32, 32, 32, 32, 32, 41, 250, 708, 33, + 32, 11, 11, 11, 32, 33, 41, 328, 41, 33, + 41, 33, 33, 33, 79, 41, 706, 328, 33, 92, + 92, 92, 92, 92, 92, 92, 11, 11, 11, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 41, 395, 35, 171, 171, 171, 395, 12, + 12, 12, 12, 704, 35, 35, 35, 12, 35, 169, + 169, 327, 251, 35, 42, 42, 35, 327, 42, 251, + 169, 36, 36, 703, 42, 48, 42, 456, 42, 12, + + 12, 12, 36, 42, 36, 48, 36, 48, 36, 48, + 456, 36, 392, 42, 48, 701, 516, 39, 39, 392, + 39, 393, 394, 516, 12, 12, 12, 21, 39, 39, + 39, 48, 39, 394, 457, 39, 393, 39, 457, 559, + 458, 21, 458, 559, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 562, 698, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 31, 514, 562, 31, 31, + + 31, 31, 31, 31, 31, 515, 695, 514, 515, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 629, 629, 694, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 37, 655, 513, 655, 691, 40, 40, 560, 560, 560, + 37, 561, 37, 40, 37, 597, 40, 513, 40, 37, + 40, 689, 597, 685, 680, 40, 561, 43, 43, 599, + 43, 678, 37, 599, 677, 676, 44, 675, 43, 44, + + 43, 672, 43, 37, 43, 560, 44, 43, 44, 45, + 44, 670, 45, 669, 664, 44, 45, 663, 46, 45, + 662, 45, 658, 45, 46, 46, 654, 45, 45, 653, + 652, 43, 45, 47, 651, 46, 648, 46, 646, 46, + 645, 46, 643, 47, 46, 47, 49, 47, 46, 640, + 639, 47, 47, 49, 638, 632, 49, 46, 49, 628, + 49, 631, 631, 631, 627, 49, 50, 50, 50, 50, + 50, 50, 50, 47, 89, 89, 89, 50, 626, 624, + 89, 97, 621, 619, 618, 616, 89, 89, 612, 611, + 610, 97, 50, 97, 600, 97, 596, 50, 74, 631, + + 97, 595, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 95, 95, 95, 95, 95, 95, 95, 74, 74, + 74, 74, 98, 99, 178, 178, 178, 178, 178, 178, + 178, 594, 98, 99, 98, 99, 98, 99, 593, 98, + 591, 98, 99, 100, 101, 587, 585, 584, 74, 74, + 74, 582, 577, 100, 101, 100, 101, 100, 101, 102, + 576, 575, 100, 101, 558, 557, 100, 556, 555, 102, + 553, 102, 551, 102, 74, 75, 548, 102, 102, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 546, 104, + 544, 542, 105, 535, 104, 75, 75, 75, 75, 104, + + 534, 104, 105, 104, 105, 106, 105, 533, 104, 532, + 105, 105, 75, 520, 512, 106, 511, 106, 107, 106, + 510, 509, 506, 504, 106, 75, 75, 75, 107, 108, + 107, 107, 107, 679, 679, 679, 501, 107, 496, 108, + 494, 108, 482, 108, 109, 109, 481, 463, 108, 459, + 455, 75, 110, 110, 454, 109, 453, 109, 109, 109, + 452, 451, 448, 110, 109, 110, 111, 110, 446, 112, + 441, 679, 110, 112, 436, 433, 111, 111, 111, 112, + 111, 112, 113, 112, 421, 111, 420, 419, 112, 400, + 390, 389, 113, 388, 113, 386, 113, 114, 114, 114, + + 116, 113, 382, 115, 115, 380, 375, 114, 370, 114, + 116, 114, 116, 115, 116, 115, 114, 115, 117, 116, + 366, 115, 115, 355, 354, 120, 353, 334, 117, 322, + 117, 117, 117, 120, 321, 320, 121, 117, 314, 121, + 303, 298, 294, 120, 122, 120, 121, 120, 121, 283, + 121, 282, 120, 255, 122, 121, 122, 254, 122, 123, + 123, 249, 245, 122, 244, 243, 239, 227, 221, 123, + 124, 123, 217, 123, 206, 205, 123, 123, 123, 177, + 124, 125, 124, 124, 124, 173, 168, 126, 166, 124, + 156, 125, 151, 125, 148, 125, 138, 126, 127, 126, + + 125, 126, 133, 125, 128, 119, 126, 118, 127, 96, + 127, 129, 127, 93, 130, 90, 85, 127, 84, 129, + 81, 129, 67, 129, 130, 129, 130, 131, 130, 64, + 129, 61, 130, 130, 60, 132, 57, 131, 134, 131, + 53, 131, 51, 29, 25, 132, 131, 132, 134, 132, + 134, 135, 134, 132, 132, 20, 134, 134, 19, 16, + 15, 135, 136, 135, 0, 135, 0, 0, 0, 0, + 135, 135, 136, 0, 136, 137, 136, 0, 137, 0, + 0, 136, 137, 0, 0, 137, 0, 137, 0, 137, + 139, 139, 0, 0, 137, 0, 0, 140, 0, 0, + + 0, 139, 0, 139, 0, 139, 0, 140, 141, 140, + 139, 140, 140, 0, 142, 140, 140, 0, 141, 0, + 141, 0, 141, 0, 142, 143, 142, 141, 142, 144, + 142, 0, 141, 142, 0, 143, 0, 143, 0, 143, + 144, 145, 0, 0, 143, 0, 145, 0, 0, 0, + 144, 145, 144, 145, 144, 145, 146, 147, 0, 144, + 145, 0, 0, 0, 0, 0, 146, 147, 146, 147, + 146, 147, 149, 150, 150, 146, 147, 150, 0, 149, + 0, 0, 149, 150, 149, 150, 149, 150, 153, 0, + 0, 149, 150, 0, 0, 0, 0, 0, 153, 0, + + 153, 0, 153, 155, 155, 155, 153, 153, 154, 154, + 154, 154, 154, 154, 154, 155, 155, 155, 155, 155, + 155, 155, 0, 0, 181, 182, 0, 181, 0, 0, + 0, 0, 0, 0, 181, 182, 181, 182, 181, 182, + 183, 155, 181, 181, 182, 0, 154, 0, 184, 0, + 183, 185, 183, 0, 183, 0, 0, 0, 184, 183, + 184, 185, 184, 185, 185, 185, 186, 184, 0, 187, + 185, 0, 188, 186, 0, 0, 186, 0, 186, 187, + 186, 187, 188, 187, 188, 186, 188, 189, 187, 188, + 0, 188, 0, 190, 0, 0, 0, 189, 0, 189, + + 0, 189, 0, 190, 191, 190, 189, 190, 0, 190, + 192, 191, 190, 0, 191, 0, 191, 0, 191, 0, + 192, 193, 192, 191, 192, 0, 0, 192, 0, 192, + 0, 193, 194, 193, 0, 193, 0, 0, 0, 0, + 193, 0, 194, 0, 194, 0, 194, 195, 195, 194, + 194, 194, 0, 0, 196, 195, 0, 196, 195, 0, + 195, 0, 195, 0, 196, 197, 196, 195, 196, 0, + 0, 198, 0, 196, 0, 197, 0, 197, 197, 197, + 0, 198, 199, 198, 197, 198, 0, 0, 200, 0, + 198, 200, 199, 199, 199, 0, 199, 0, 200, 201, + + 200, 199, 200, 0, 0, 202, 0, 200, 202, 201, + 0, 201, 201, 201, 0, 202, 203, 202, 201, 202, + 0, 0, 0, 0, 202, 0, 203, 204, 203, 0, + 203, 0, 0, 203, 0, 203, 0, 204, 204, 204, + 207, 204, 0, 0, 0, 0, 204, 0, 208, 0, + 207, 209, 207, 0, 207, 0, 0, 207, 208, 207, + 208, 209, 208, 209, 209, 209, 210, 208, 0, 211, + 209, 0, 212, 0, 0, 212, 210, 0, 210, 211, + 210, 211, 212, 211, 212, 210, 212, 211, 211, 213, + 214, 212, 0, 215, 0, 0, 213, 0, 0, 0, + + 214, 0, 214, 215, 214, 215, 213, 215, 213, 214, + 213, 216, 215, 0, 218, 213, 0, 218, 0, 0, + 0, 216, 0, 216, 218, 216, 218, 0, 218, 219, + 216, 0, 219, 218, 0, 220, 0, 0, 0, 219, + 0, 219, 220, 219, 0, 220, 222, 220, 219, 220, + 0, 0, 0, 0, 220, 0, 222, 223, 222, 0, 222, 0, 0, 224, 222, 222, 0, 223, 0, 223, - 0, 223, 0, 224, 223, 224, 223, 224, 225, 0, - 224, 225, 224, 0, 226, 0, 0, 226, 225, 0, - 225, 0, 225, 0, 226, 228, 226, 225, 226, 0, - - 0, 0, 0, 226, 0, 228, 229, 228, 228, 228, - 228, 230, 0, 0, 228, 228, 229, 230, 229, 0, - 229, 0, 0, 0, 229, 229, 0, 230, 234, 230, - 0, 230, 0, 0, 234, 0, 230, 0, 234, 0, - 234, 0, 234, 236, 236, 236, 0, 234, 0, 0, - 0, 0, 244, 245, 0, 236, 236, 236, 236, 236, - 236, 236, 244, 245, 244, 245, 244, 245, 246, 245, - 0, 244, 245, 0, 247, 246, 0, 0, 246, 0, - 246, 0, 246, 0, 247, 247, 247, 246, 247, 248, - 249, 0, 0, 247, 0, 0, 0, 0, 0, 248, - - 249, 248, 249, 248, 249, 251, 251, 250, 248, 249, - 250, 0, 0, 0, 0, 0, 251, 250, 251, 250, - 251, 250, 252, 252, 0, 251, 250, 0, 253, 0, - 0, 0, 252, 0, 252, 249, 252, 0, 253, 254, - 253, 252, 253, 0, 0, 253, 0, 253, 0, 254, - 255, 254, 254, 254, 0, 0, 0, 0, 254, 0, - 255, 0, 255, 0, 255, 257, 255, 256, 256, 255, - 0, 258, 0, 0, 0, 257, 0, 257, 256, 257, - 256, 258, 256, 258, 257, 258, 259, 256, 259, 260, - 258, 260, 261, 0, 0, 261, 259, 0, 259, 260, - - 259, 260, 261, 260, 261, 259, 261, 262, 260, 0, - 0, 261, 0, 263, 0, 0, 0, 262, 0, 262, - 263, 262, 0, 263, 264, 263, 262, 263, 0, 0, - 0, 0, 263, 0, 264, 265, 264, 0, 264, 0, - 264, 0, 0, 264, 0, 265, 0, 265, 0, 265, - 266, 265, 0, 266, 265, 0, 267, 0, 0, 0, - 266, 0, 266, 0, 266, 0, 267, 270, 267, 266, - 267, 0, 0, 271, 0, 267, 0, 270, 0, 270, - 0, 270, 0, 271, 0, 271, 270, 271, 272, 273, - 0, 271, 271, 0, 0, 272, 0, 0, 272, 273, - - 272, 273, 272, 273, 274, 273, 0, 272, 273, 275, - 275, 0, 270, 0, 274, 0, 274, 0, 274, 0, - 275, 276, 275, 274, 275, 277, 276, 0, 0, 275, - 0, 276, 0, 276, 277, 276, 0, 276, 0, 0, - 276, 0, 278, 0, 277, 0, 277, 0, 277, 0, - 279, 0, 278, 277, 278, 0, 278, 0, 0, 278, - 279, 278, 279, 0, 279, 281, 281, 0, 282, 279, - 0, 0, 0, 0, 0, 281, 0, 281, 282, 281, - 282, 283, 282, 0, 281, 0, 282, 282, 0, 285, - 286, 283, 285, 283, 283, 283, 0, 0, 0, 285, - - 283, 285, 0, 285, 287, 286, 0, 287, 285, 0, - 0, 0, 0, 0, 287, 286, 287, 286, 287, 286, - 288, 288, 290, 287, 286, 0, 0, 0, 0, 0, - 0, 288, 290, 288, 290, 288, 290, 291, 0, 0, - 288, 290, 0, 0, 0, 0, 0, 291, 0, 291, - 292, 291, 0, 292, 0, 291, 291, 0, 293, 0, - 292, 294, 292, 0, 292, 0, 0, 0, 293, 292, - 293, 294, 293, 294, 0, 294, 296, 293, 295, 295, - 294, 0, 297, 0, 0, 299, 296, 0, 296, 295, - 296, 295, 297, 295, 297, 296, 297, 298, 295, 0, - - 299, 297, 0, 301, 0, 0, 0, 298, 0, 298, - 299, 298, 299, 301, 299, 301, 298, 301, 302, 299, - 0, 296, 301, 0, 303, 0, 0, 303, 302, 0, - 302, 0, 302, 0, 303, 304, 303, 302, 303, 0, - 0, 305, 0, 303, 0, 304, 0, 304, 0, 304, - 0, 305, 0, 305, 304, 305, 309, 0, 305, 0, - 305, 0, 0, 0, 0, 0, 309, 0, 309, 0, - 309, 304, 0, 314, 0, 309, 310, 310, 310, 310, - 310, 310, 310, 314, 0, 314, 0, 314, 315, 315, - 0, 314, 314, 0, 0, 0, 0, 316, 316, 315, - - 0, 315, 0, 315, 317, 317, 0, 316, 315, 316, - 0, 316, 0, 318, 310, 317, 316, 317, 0, 317, - 320, 320, 0, 318, 317, 318, 0, 318, 0, 321, - 321, 320, 318, 320, 0, 320, 0, 0, 0, 321, - 320, 321, 322, 321, 0, 322, 0, 0, 321, 0, - 323, 0, 322, 324, 322, 0, 322, 0, 0, 0, - 323, 322, 323, 324, 323, 324, 0, 324, 326, 323, - 325, 325, 324, 0, 327, 326, 0, 0, 326, 0, - 326, 325, 326, 325, 327, 325, 327, 326, 327, 328, - 325, 0, 328, 327, 0, 329, 328, 329, 0, 328, - - 0, 328, 0, 328, 0, 329, 0, 329, 328, 329, - 330, 331, 0, 330, 329, 0, 0, 0, 0, 0, - 330, 331, 330, 331, 330, 331, 332, 331, 0, 330, - 331, 0, 0, 0, 0, 0, 332, 0, 332, 0, - 332, 333, 333, 0, 332, 332, 0, 334, 0, 0, - 0, 333, 0, 333, 0, 333, 0, 334, 335, 334, - 333, 334, 0, 0, 336, 334, 334, 0, 335, 0, - 335, 0, 335, 0, 336, 335, 336, 335, 336, 337, - 341, 0, 0, 336, 0, 0, 0, 341, 0, 337, - 341, 337, 341, 337, 341, 0, 0, 343, 337, 341, - - 342, 342, 0, 342, 0, 0, 0, 343, 0, 343, - 342, 343, 342, 0, 342, 343, 343, 345, 344, 342, - 344, 0, 0, 0, 0, 0, 0, 345, 344, 345, - 344, 345, 344, 0, 347, 346, 345, 344, 346, 0, - 0, 349, 0, 348, 347, 346, 347, 346, 347, 346, - 348, 347, 0, 347, 346, 0, 349, 0, 0, 0, - 348, 0, 348, 0, 348, 0, 349, 351, 349, 348, - 349, 0, 0, 0, 0, 349, 0, 351, 352, 351, - 0, 351, 0, 0, 353, 351, 351, 0, 352, 0, - 352, 0, 352, 0, 353, 355, 353, 352, 353, 0, - - 0, 0, 0, 353, 0, 355, 356, 355, 0, 355, - 0, 355, 357, 356, 355, 0, 356, 0, 356, 0, - 356, 0, 357, 358, 357, 356, 357, 0, 0, 0, - 0, 357, 0, 358, 0, 358, 360, 358, 0, 361, - 0, 358, 358, 360, 0, 0, 360, 362, 360, 361, - 360, 361, 362, 361, 0, 360, 0, 362, 361, 362, - 363, 362, 0, 0, 0, 0, 362, 0, 0, 0, - 363, 365, 363, 0, 363, 0, 0, 367, 365, 363, - 0, 365, 363, 365, 0, 365, 0, 367, 0, 367, - 365, 367, 368, 369, 0, 368, 367, 0, 0, 0, - - 0, 0, 368, 369, 368, 369, 368, 369, 371, 369, - 0, 368, 369, 0, 379, 0, 0, 0, 371, 0, - 371, 0, 371, 0, 379, 0, 379, 371, 379, 380, - 380, 381, 381, 379, 0, 0, 0, 0, 0, 380, - 382, 380, 381, 380, 381, 0, 381, 0, 380, 0, - 382, 381, 382, 371, 382, 384, 0, 0, 382, 382, - 0, 385, 0, 0, 0, 384, 0, 384, 0, 384, - 0, 385, 386, 385, 384, 385, 0, 0, 387, 385, - 385, 387, 386, 0, 386, 0, 386, 0, 387, 388, - 387, 386, 387, 0, 0, 389, 388, 387, 0, 388, - - 0, 388, 0, 388, 0, 389, 390, 389, 388, 389, - 0, 0, 0, 0, 389, 0, 390, 391, 390, 391, - 390, 0, 0, 392, 390, 390, 0, 391, 0, 391, - 0, 391, 0, 392, 0, 392, 391, 392, 0, 0, - 393, 392, 392, 393, 0, 0, 394, 0, 394, 0, - 393, 0, 393, 0, 393, 0, 394, 0, 394, 393, - 394, 395, 395, 396, 0, 394, 0, 0, 0, 0, - 0, 0, 395, 396, 395, 396, 395, 396, 397, 398, - 0, 395, 396, 0, 0, 397, 0, 0, 397, 398, - 397, 398, 397, 398, 399, 0, 398, 397, 398, 400, - - 400, 399, 0, 0, 399, 0, 399, 0, 399, 0, - 400, 404, 400, 399, 400, 404, 0, 405, 0, 400, - 0, 404, 0, 404, 405, 404, 0, 405, 0, 405, - 404, 405, 406, 407, 406, 0, 405, 0, 0, 0, - 0, 0, 406, 407, 406, 407, 406, 407, 0, 0, - 407, 406, 407, 408, 409, 409, 408, 0, 0, 0, - 0, 0, 0, 408, 409, 408, 409, 408, 409, 410, - 0, 0, 408, 409, 0, 0, 0, 411, 0, 410, - 411, 410, 0, 410, 0, 410, 0, 411, 410, 411, - 412, 411, 0, 0, 0, 0, 411, 0, 413, 0, - - 412, 415, 412, 0, 412, 413, 0, 412, 413, 412, - 413, 415, 413, 415, 0, 415, 418, 413, 416, 416, - 415, 0, 419, 0, 0, 0, 418, 0, 418, 416, - 418, 416, 419, 416, 419, 418, 419, 420, 416, 0, - 421, 419, 0, 421, 0, 0, 0, 420, 423, 420, - 421, 420, 421, 0, 421, 420, 420, 0, 423, 421, - 423, 0, 423, 424, 424, 0, 425, 423, 423, 426, - 0, 0, 0, 424, 0, 424, 425, 424, 425, 426, - 425, 426, 424, 426, 428, 425, 428, 430, 426, 0, - 431, 0, 0, 0, 428, 0, 428, 430, 428, 430, - - 431, 430, 431, 428, 431, 440, 430, 431, 441, 431, - 0, 0, 0, 0, 0, 440, 0, 440, 441, 440, - 441, 442, 441, 440, 440, 0, 441, 441, 442, 444, - 0, 442, 0, 442, 0, 442, 0, 0, 0, 444, - 442, 444, 445, 444, 0, 445, 0, 0, 444, 0, - 446, 0, 445, 447, 445, 0, 445, 0, 0, 0, - 446, 445, 446, 447, 446, 447, 448, 447, 0, 446, - 0, 0, 447, 448, 449, 0, 448, 450, 448, 0, - 448, 0, 0, 0, 449, 448, 449, 450, 449, 450, - 451, 450, 0, 449, 0, 0, 450, 451, 453, 0, - - 451, 452, 451, 452, 451, 0, 0, 0, 453, 451, - 453, 452, 453, 452, 454, 452, 0, 453, 0, 0, - 452, 0, 0, 0, 454, 455, 454, 0, 454, 0, - 0, 0, 454, 454, 0, 455, 456, 455, 0, 455, - 0, 0, 457, 455, 455, 0, 456, 0, 456, 0, - 456, 0, 457, 458, 457, 456, 457, 0, 0, 462, - 0, 457, 0, 458, 0, 458, 462, 458, 0, 462, - 463, 462, 458, 462, 0, 0, 0, 0, 462, 0, - 463, 464, 463, 0, 463, 0, 0, 465, 463, 463, - 0, 464, 0, 464, 0, 464, 0, 465, 466, 465, - - 464, 465, 0, 0, 467, 0, 465, 467, 466, 0, - 466, 0, 466, 0, 467, 466, 467, 466, 467, 468, - 469, 469, 0, 467, 0, 0, 0, 0, 0, 468, - 469, 468, 469, 468, 469, 470, 471, 0, 468, 469, - 0, 0, 0, 0, 0, 470, 471, 470, 471, 470, - 471, 473, 475, 0, 470, 471, 0, 0, 0, 0, - 0, 473, 475, 473, 475, 473, 475, 0, 0, 476, - 473, 475, 477, 476, 0, 478, 0, 0, 0, 476, - 470, 476, 477, 476, 477, 478, 477, 478, 476, 478, - 480, 477, 0, 480, 478, 0, 481, 0, 0, 481, - - 480, 0, 480, 0, 480, 0, 481, 0, 481, 480, - 481, 483, 0, 494, 483, 481, 485, 485, 0, 0, - 0, 483, 0, 483, 0, 483, 0, 485, 494, 485, - 483, 485, 0, 0, 495, 0, 485, 0, 494, 0, - 494, 495, 494, 0, 495, 0, 495, 494, 495, 496, - 496, 0, 0, 495, 0, 498, 0, 0, 0, 496, - 0, 496, 0, 496, 0, 498, 499, 498, 496, 498, - 0, 498, 0, 0, 498, 0, 499, 0, 499, 500, - 499, 0, 500, 0, 499, 499, 0, 501, 0, 500, - 502, 500, 0, 500, 0, 0, 0, 501, 500, 501, - - 502, 501, 502, 502, 502, 503, 501, 0, 504, 502, - 0, 504, 0, 0, 0, 503, 505, 503, 504, 503, - 504, 0, 504, 0, 503, 0, 505, 504, 505, 506, - 505, 0, 507, 0, 0, 505, 506, 0, 0, 506, - 0, 506, 507, 506, 507, 0, 507, 512, 506, 0, - 512, 507, 0, 513, 0, 0, 0, 512, 0, 512, - 0, 512, 0, 513, 514, 513, 512, 513, 0, 0, - 515, 0, 513, 0, 514, 0, 514, 0, 514, 0, - 515, 516, 515, 514, 515, 0, 0, 0, 0, 515, - 0, 516, 518, 516, 0, 516, 518, 0, 520, 516, - - 516, 0, 518, 0, 518, 524, 518, 0, 520, 522, - 520, 518, 520, 0, 0, 0, 522, 520, 0, 522, - 524, 522, 0, 522, 0, 0, 525, 0, 522, 0, - 524, 0, 524, 0, 524, 0, 525, 527, 525, 524, - 525, 0, 0, 529, 0, 525, 0, 527, 0, 527, - 0, 527, 0, 529, 537, 529, 527, 529, 0, 0, - 0, 0, 529, 0, 537, 538, 537, 0, 537, 0, - 0, 537, 0, 537, 0, 538, 539, 538, 538, 538, - 0, 0, 541, 0, 538, 0, 539, 0, 539, 0, - 539, 0, 541, 542, 541, 539, 541, 0, 0, 0, - - 0, 541, 0, 542, 543, 542, 543, 542, 0, 0, - 542, 0, 542, 0, 543, 544, 543, 0, 543, 0, - 544, 545, 0, 543, 0, 544, 0, 544, 0, 544, - 0, 545, 0, 545, 544, 545, 546, 547, 546, 0, - 545, 0, 0, 0, 0, 0, 546, 547, 546, 547, - 546, 547, 552, 553, 0, 546, 547, 0, 0, 0, - 553, 0, 552, 553, 552, 553, 552, 553, 552, 555, - 558, 552, 553, 0, 0, 0, 555, 0, 0, 555, - 558, 555, 558, 555, 558, 560, 0, 0, 555, 558, - 0, 562, 0, 0, 0, 560, 0, 560, 560, 560, - - 0, 562, 564, 562, 560, 562, 0, 0, 0, 562, - 562, 0, 564, 0, 564, 0, 564, 570, 570, 570, - 0, 564, 0, 0, 0, 0, 572, 573, 0, 570, - 570, 570, 570, 570, 570, 570, 572, 573, 572, 573, - 572, 573, 574, 575, 0, 572, 573, 0, 0, 572, - 0, 0, 574, 575, 574, 575, 574, 575, 576, 577, - 0, 574, 575, 0, 0, 0, 0, 0, 576, 577, - 576, 577, 576, 577, 578, 579, 577, 576, 577, 0, - 0, 0, 579, 0, 578, 579, 578, 579, 578, 579, - 583, 0, 0, 578, 579, 0, 0, 0, 584, 0, - - 583, 0, 583, 0, 583, 0, 586, 0, 584, 583, - 584, 584, 584, 0, 589, 0, 586, 584, 586, 0, - 586, 589, 591, 0, 589, 586, 589, 0, 589, 591, - 592, 0, 591, 589, 591, 0, 591, 592, 0, 0, - 592, 591, 592, 0, 592, 0, 0, 601, 602, 592, - 599, 599, 599, 599, 599, 599, 599, 601, 602, 601, - 602, 601, 602, 603, 0, 0, 601, 602, 0, 0, - 0, 604, 0, 603, 0, 603, 0, 603, 0, 0, - 0, 604, 603, 604, 608, 604, 0, 0, 599, 604, - 604, 0, 610, 0, 608, 613, 608, 0, 608, 610, - - 0, 0, 610, 608, 610, 613, 610, 613, 615, 613, - 615, 610, 0, 613, 613, 0, 0, 0, 615, 616, - 615, 0, 615, 616, 0, 0, 0, 615, 0, 616, - 0, 616, 0, 616, 623, 623, 623, 0, 616, 0, - 0, 0, 0, 624, 625, 0, 623, 623, 623, 623, - 623, 623, 623, 624, 625, 624, 625, 624, 625, 629, - 0, 624, 624, 625, 0, 631, 0, 625, 0, 629, - 0, 629, 0, 629, 0, 631, 634, 631, 629, 631, - 0, 0, 636, 631, 631, 0, 634, 0, 634, 0, - 634, 0, 636, 637, 636, 634, 636, 0, 0, 634, - - 637, 636, 0, 637, 0, 637, 644, 637, 643, 643, - 0, 0, 637, 0, 0, 0, 644, 648, 644, 643, - 644, 643, 0, 643, 0, 644, 0, 648, 643, 648, - 0, 648, 651, 0, 0, 653, 648, 0, 653, 0, - 648, 0, 651, 0, 651, 653, 651, 653, 0, 653, - 0, 651, 0, 0, 653, 658, 658, 658, 0, 0, - 0, 0, 0, 0, 659, 661, 0, 658, 658, 658, - 658, 658, 658, 658, 659, 661, 659, 661, 659, 661, - 664, 667, 0, 659, 661, 0, 659, 0, 0, 0, - 664, 667, 664, 667, 664, 667, 664, 671, 0, 664, - - 667, 0, 0, 0, 0, 0, 0, 671, 0, 671, - 0, 671, 0, 0, 0, 0, 671, 675, 675, 675, - 675, 675, 675, 675, 675, 675, 675, 675, 675, 676, - 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, - 676, 677, 677, 677, 677, 677, 677, 677, 677, 677, - 677, 677, 677, 678, 678, 678, 678, 678, 678, 678, - 678, 678, 678, 678, 678, 679, 679, 679, 679, 679, - 679, 679, 679, 679, 679, 679, 679, 680, 680, 680, - 0, 680, 680, 680, 680, 680, 680, 680, 680, 681, - 681, 0, 0, 681, 0, 681, 682, 0, 682, 683, - - 683, 0, 683, 683, 684, 684, 0, 684, 684, 684, - 0, 684, 684, 684, 684, 684, 685, 685, 685, 0, - 685, 685, 685, 685, 685, 685, 685, 685, 686, 686, - 686, 686, 686, 686, 686, 686, 0, 686, 686, 687, - 0, 0, 687, 0, 687, 687, 687, 687, 687, 687, - 688, 688, 0, 688, 688, 689, 689, 0, 689, 689, - 690, 690, 0, 690, 690, 674, 674, 674, 674, 674, - 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, - 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, - 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, - - 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, - 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, - 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, - 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, - 674, 674, 674, 674 + 0, 223, 0, 224, 225, 224, 223, 224, 0, 0, + 224, 0, 224, 0, 225, 226, 225, 0, 225, 0, + 0, 225, 0, 225, 0, 226, 228, 226, 0, 226, + + 0, 229, 229, 0, 226, 226, 228, 0, 228, 0, + 228, 0, 229, 230, 229, 228, 229, 0, 0, 231, + 0, 229, 0, 230, 0, 230, 0, 230, 0, 231, + 0, 231, 230, 231, 232, 233, 0, 232, 231, 0, + 0, 0, 233, 0, 232, 233, 232, 233, 232, 233, + 234, 0, 0, 232, 233, 0, 0, 0, 0, 0, + 234, 235, 234, 0, 234, 0, 0, 236, 234, 234, + 0, 235, 0, 235, 0, 235, 0, 236, 235, 236, + 235, 236, 237, 0, 236, 237, 236, 0, 238, 0, + 0, 238, 237, 0, 237, 0, 237, 0, 238, 240, + + 238, 237, 238, 0, 0, 0, 0, 238, 0, 240, + 241, 240, 240, 240, 240, 242, 0, 0, 240, 240, + 241, 242, 241, 0, 241, 0, 0, 0, 241, 241, + 0, 242, 246, 242, 0, 242, 0, 0, 246, 0, + 242, 0, 246, 0, 246, 0, 246, 248, 248, 248, + 0, 246, 0, 0, 0, 0, 258, 259, 0, 248, + 248, 248, 248, 248, 248, 248, 258, 259, 258, 259, + 258, 259, 260, 259, 0, 258, 259, 0, 261, 260, + 0, 0, 260, 0, 260, 0, 260, 0, 261, 261, + 261, 260, 261, 262, 263, 0, 0, 261, 0, 0, + + 0, 0, 0, 262, 263, 262, 263, 262, 263, 265, + 265, 264, 262, 263, 264, 0, 0, 0, 0, 0, + 265, 264, 265, 264, 265, 264, 266, 266, 0, 265, + 264, 0, 267, 0, 0, 0, 266, 0, 266, 263, + 266, 0, 267, 268, 267, 266, 267, 0, 0, 267, + 0, 267, 0, 268, 269, 268, 268, 268, 0, 0, + 0, 0, 268, 0, 269, 0, 269, 0, 269, 271, + 269, 270, 270, 269, 0, 272, 0, 0, 0, 271, + 0, 271, 270, 271, 270, 272, 270, 272, 271, 272, + 273, 270, 273, 274, 272, 274, 275, 0, 0, 275, + + 273, 0, 273, 274, 273, 274, 275, 274, 275, 273, + 275, 276, 274, 0, 0, 275, 0, 277, 0, 0, + 0, 276, 0, 276, 277, 276, 0, 277, 278, 277, + 276, 277, 0, 0, 0, 0, 277, 0, 278, 279, + 278, 0, 278, 0, 278, 0, 0, 278, 0, 279, + 0, 279, 0, 279, 280, 279, 0, 280, 279, 0, + 281, 0, 0, 0, 280, 0, 280, 0, 280, 0, + 281, 284, 281, 280, 281, 0, 0, 285, 0, 281, + 0, 284, 0, 284, 0, 284, 0, 285, 0, 285, + 284, 285, 286, 287, 0, 285, 285, 0, 0, 286, + + 0, 0, 286, 287, 286, 287, 286, 287, 288, 287, + 0, 286, 287, 289, 289, 0, 284, 0, 288, 0, + 288, 0, 288, 291, 289, 0, 289, 288, 289, 290, + 289, 0, 291, 289, 290, 0, 0, 0, 0, 290, + 292, 290, 291, 290, 291, 290, 291, 0, 290, 0, + 292, 291, 292, 293, 292, 0, 0, 292, 0, 292, + 0, 295, 295, 293, 296, 293, 0, 293, 0, 0, + 0, 295, 293, 295, 296, 295, 296, 297, 296, 0, + 295, 0, 296, 296, 0, 299, 300, 297, 299, 297, + 297, 297, 0, 0, 0, 299, 297, 299, 0, 299, + + 301, 300, 0, 301, 299, 0, 0, 0, 0, 0, + 301, 300, 301, 300, 301, 300, 302, 302, 304, 301, + 300, 0, 0, 0, 0, 0, 0, 302, 304, 302, + 304, 302, 304, 305, 0, 0, 302, 304, 0, 0, + 0, 0, 0, 305, 0, 305, 306, 305, 0, 306, + 0, 305, 305, 0, 307, 0, 306, 308, 306, 0, + 306, 0, 0, 0, 307, 306, 307, 308, 307, 308, + 0, 308, 310, 307, 309, 309, 308, 0, 311, 0, + 0, 313, 310, 0, 310, 309, 310, 309, 311, 309, + 311, 310, 311, 312, 309, 0, 313, 311, 0, 315, + + 0, 0, 0, 312, 0, 312, 313, 312, 313, 315, + 313, 315, 312, 315, 316, 313, 0, 310, 315, 0, + 317, 0, 0, 317, 316, 0, 316, 0, 316, 0, + 317, 318, 317, 316, 317, 0, 0, 319, 0, 317, + 0, 318, 0, 318, 0, 318, 0, 319, 0, 319, + 318, 319, 323, 0, 319, 0, 319, 0, 0, 0, + 0, 0, 323, 0, 323, 0, 323, 318, 0, 329, + 0, 323, 324, 324, 324, 324, 324, 324, 324, 329, + 0, 329, 0, 329, 330, 330, 0, 329, 329, 0, + 0, 0, 0, 331, 331, 330, 0, 330, 0, 330, + + 332, 332, 0, 331, 330, 331, 0, 331, 0, 333, + 324, 332, 331, 332, 0, 332, 335, 335, 0, 333, + 332, 333, 0, 333, 0, 336, 336, 335, 333, 335, + 0, 335, 0, 0, 0, 336, 335, 336, 337, 336, + 0, 337, 0, 0, 336, 0, 338, 0, 337, 339, + 337, 0, 337, 0, 0, 0, 338, 337, 338, 339, + 338, 339, 0, 339, 341, 338, 340, 340, 339, 0, + 342, 341, 0, 0, 341, 0, 341, 340, 341, 340, + 342, 340, 342, 341, 342, 343, 340, 0, 343, 342, + 0, 344, 343, 344, 0, 343, 0, 343, 0, 343, + + 0, 344, 0, 344, 343, 344, 345, 346, 0, 345, + 344, 0, 0, 345, 0, 0, 345, 346, 345, 346, + 345, 346, 347, 346, 0, 345, 346, 0, 0, 0, + 0, 0, 347, 0, 347, 0, 347, 348, 348, 0, + 347, 347, 0, 349, 0, 0, 0, 348, 0, 348, + 0, 348, 0, 349, 350, 349, 348, 349, 0, 0, + 351, 349, 349, 0, 350, 0, 350, 0, 350, 0, + 351, 350, 351, 350, 351, 352, 356, 0, 0, 351, + 0, 0, 0, 356, 0, 352, 356, 352, 356, 352, + 356, 0, 0, 358, 352, 356, 357, 357, 0, 357, + + 0, 0, 0, 358, 0, 358, 357, 358, 357, 0, + 357, 358, 358, 360, 359, 357, 359, 0, 0, 0, + 0, 0, 0, 360, 359, 360, 359, 360, 359, 361, + 0, 0, 360, 359, 0, 362, 0, 0, 362, 361, + 0, 361, 0, 361, 0, 362, 363, 362, 361, 362, + 364, 0, 0, 365, 362, 0, 363, 364, 363, 0, + 363, 0, 0, 363, 0, 363, 0, 364, 365, 364, + 0, 364, 0, 0, 367, 0, 364, 0, 365, 0, + 365, 0, 365, 0, 367, 368, 367, 365, 367, 0, + 0, 369, 367, 367, 0, 368, 0, 368, 0, 368, + + 0, 369, 371, 369, 368, 369, 0, 0, 0, 0, + 369, 0, 371, 372, 371, 0, 371, 0, 371, 373, + 372, 371, 0, 372, 0, 372, 0, 372, 0, 373, + 374, 373, 372, 373, 0, 0, 0, 0, 373, 0, + 374, 0, 374, 376, 374, 0, 377, 0, 374, 374, + 376, 0, 0, 376, 378, 376, 377, 376, 377, 378, + 377, 0, 376, 0, 378, 377, 378, 379, 378, 0, + 0, 0, 0, 378, 0, 0, 0, 379, 381, 379, + 0, 379, 0, 0, 383, 381, 379, 0, 381, 379, + 381, 0, 381, 0, 383, 0, 383, 381, 383, 384, + + 385, 0, 384, 383, 0, 0, 0, 0, 0, 384, + 385, 384, 385, 384, 385, 387, 385, 0, 384, 385, + 0, 396, 0, 0, 0, 387, 0, 387, 0, 387, + 0, 396, 0, 396, 387, 396, 397, 397, 398, 398, + 396, 0, 0, 0, 0, 0, 397, 399, 397, 398, + 397, 398, 0, 398, 0, 397, 0, 399, 398, 399, + 387, 399, 401, 0, 0, 399, 399, 0, 402, 0, + 0, 0, 401, 0, 401, 0, 401, 0, 402, 403, + 402, 401, 402, 0, 0, 404, 402, 402, 404, 403, + 0, 403, 0, 403, 0, 404, 405, 404, 403, 404, + + 0, 0, 406, 405, 404, 0, 405, 0, 405, 0, + 405, 0, 406, 407, 406, 405, 406, 0, 0, 0, + 0, 406, 0, 407, 408, 407, 408, 407, 0, 0, + 409, 407, 407, 0, 408, 0, 408, 0, 408, 0, + 409, 0, 409, 408, 409, 0, 0, 410, 409, 409, + 410, 0, 0, 411, 0, 411, 0, 410, 0, 410, + 0, 410, 0, 411, 412, 411, 410, 411, 0, 413, + 413, 0, 411, 0, 412, 0, 412, 0, 412, 0, + 413, 414, 413, 412, 413, 0, 0, 415, 0, 413, + 0, 414, 0, 414, 415, 414, 0, 415, 416, 415, + + 414, 415, 0, 0, 417, 0, 415, 0, 416, 0, + 416, 417, 416, 0, 417, 416, 417, 416, 417, 418, + 418, 422, 0, 417, 0, 422, 0, 0, 0, 0, + 418, 422, 418, 422, 418, 422, 423, 0, 0, 418, + 422, 0, 424, 423, 424, 0, 423, 0, 423, 0, + 423, 0, 424, 425, 424, 423, 424, 0, 0, 426, + 0, 424, 426, 425, 0, 425, 0, 425, 0, 426, + 425, 426, 425, 426, 427, 427, 0, 0, 426, 0, + 428, 428, 0, 0, 427, 0, 427, 0, 427, 0, + 428, 429, 428, 427, 428, 0, 0, 0, 0, 428, + + 0, 429, 0, 429, 0, 429, 430, 429, 0, 430, + 429, 0, 431, 0, 0, 0, 430, 0, 430, 0, + 430, 0, 431, 432, 431, 430, 431, 0, 0, 431, + 432, 431, 0, 432, 434, 432, 0, 432, 0, 435, + 435, 0, 432, 0, 434, 0, 434, 0, 434, 0, + 435, 437, 435, 434, 435, 0, 0, 438, 0, 435, + 0, 437, 0, 437, 0, 437, 0, 438, 439, 438, + 437, 438, 0, 0, 0, 0, 438, 0, 439, 0, + 439, 440, 439, 0, 440, 0, 439, 439, 0, 442, + 0, 440, 0, 440, 0, 440, 0, 0, 0, 442, + + 440, 442, 0, 442, 443, 443, 0, 444, 442, 442, + 445, 0, 0, 0, 443, 0, 443, 444, 443, 444, + 445, 444, 445, 443, 445, 447, 444, 447, 449, 445, + 0, 450, 0, 0, 0, 447, 0, 447, 449, 447, + 449, 450, 449, 450, 447, 450, 460, 449, 450, 461, + 450, 0, 0, 0, 0, 0, 460, 0, 460, 461, + 460, 461, 462, 461, 460, 460, 0, 461, 461, 462, + 464, 0, 462, 0, 462, 0, 462, 0, 0, 0, + 464, 462, 464, 465, 464, 0, 465, 0, 0, 464, + 0, 466, 0, 465, 467, 465, 0, 465, 0, 0, + + 0, 466, 465, 466, 467, 466, 467, 468, 467, 0, + 466, 0, 0, 467, 468, 469, 0, 468, 470, 468, + 0, 468, 0, 0, 0, 469, 468, 469, 470, 469, + 470, 471, 470, 0, 469, 0, 0, 470, 471, 473, + 0, 471, 472, 471, 472, 471, 0, 0, 0, 473, + 471, 473, 472, 473, 472, 474, 472, 0, 473, 0, + 474, 472, 0, 475, 0, 474, 476, 474, 0, 474, + 0, 0, 0, 475, 474, 475, 476, 475, 476, 477, + 476, 475, 475, 0, 476, 476, 0, 478, 0, 477, + 479, 477, 0, 477, 0, 0, 0, 478, 477, 478, + + 479, 478, 479, 483, 479, 0, 478, 0, 0, 479, + 483, 484, 0, 483, 485, 483, 0, 483, 0, 0, + 0, 484, 483, 484, 485, 484, 485, 486, 485, 484, + 484, 0, 0, 485, 0, 487, 0, 486, 0, 486, + 0, 486, 0, 0, 0, 487, 486, 487, 488, 487, + 0, 488, 487, 0, 487, 0, 489, 0, 488, 490, + 488, 0, 488, 0, 0, 0, 489, 488, 489, 490, + 489, 490, 0, 490, 489, 489, 491, 491, 490, 492, + 0, 0, 493, 0, 0, 0, 491, 0, 491, 492, + 491, 492, 493, 492, 493, 491, 493, 495, 492, 0, + + 497, 493, 0, 0, 0, 0, 0, 495, 0, 495, + 497, 495, 497, 498, 497, 0, 495, 498, 0, 497, + 0, 499, 0, 498, 492, 498, 0, 498, 0, 500, + 0, 499, 498, 499, 0, 499, 0, 0, 0, 500, + 499, 500, 502, 500, 0, 502, 0, 0, 500, 0, + 503, 0, 502, 503, 502, 0, 502, 0, 0, 517, + 503, 502, 503, 505, 503, 0, 505, 0, 0, 503, + 507, 507, 0, 505, 517, 505, 0, 505, 0, 0, + 0, 507, 505, 507, 517, 507, 517, 518, 517, 0, + 507, 0, 0, 517, 518, 519, 519, 518, 0, 518, + + 0, 518, 0, 521, 0, 519, 518, 519, 0, 519, + 0, 522, 0, 521, 519, 521, 0, 521, 0, 521, + 0, 522, 521, 522, 523, 522, 0, 523, 0, 522, + 522, 0, 524, 0, 523, 525, 523, 0, 523, 0, + 0, 527, 524, 523, 524, 525, 524, 525, 525, 525, + 526, 524, 0, 529, 525, 0, 527, 0, 0, 0, + 526, 0, 526, 529, 526, 529, 527, 529, 527, 526, + 527, 528, 529, 0, 528, 527, 0, 530, 0, 0, + 0, 528, 0, 528, 530, 528, 0, 530, 531, 530, + 528, 530, 0, 0, 536, 0, 530, 536, 531, 0, + + 531, 0, 531, 0, 536, 537, 536, 531, 536, 0, + 0, 538, 0, 536, 0, 537, 0, 537, 0, 537, + 0, 538, 539, 538, 537, 538, 0, 0, 540, 0, + 538, 0, 539, 0, 539, 540, 539, 0, 540, 541, + 540, 539, 540, 0, 0, 0, 0, 540, 0, 541, + 543, 541, 0, 541, 543, 0, 545, 541, 541, 0, + 543, 0, 543, 549, 543, 0, 545, 547, 545, 543, + 545, 0, 0, 0, 547, 545, 0, 547, 549, 547, + 0, 547, 0, 0, 550, 0, 547, 0, 549, 0, + 549, 0, 549, 0, 550, 552, 550, 549, 550, 0, + + 0, 554, 0, 550, 0, 552, 0, 552, 0, 552, + 0, 554, 563, 554, 552, 554, 0, 0, 0, 0, + 554, 0, 563, 564, 563, 0, 563, 0, 0, 563, + 0, 563, 0, 564, 565, 564, 564, 564, 0, 0, + 567, 0, 564, 0, 565, 0, 565, 0, 565, 0, + 567, 568, 567, 565, 567, 0, 0, 0, 0, 567, + 0, 568, 569, 568, 569, 568, 0, 0, 568, 0, + 568, 0, 569, 570, 569, 0, 569, 0, 570, 571, + 0, 569, 0, 570, 0, 570, 0, 570, 0, 571, + 0, 571, 570, 571, 572, 572, 0, 573, 571, 573, + + 574, 0, 0, 0, 572, 0, 572, 573, 572, 573, + 574, 573, 574, 572, 574, 579, 573, 0, 0, 574, + 0, 0, 0, 580, 0, 579, 0, 579, 0, 579, + 0, 579, 0, 580, 579, 580, 580, 580, 581, 583, + 0, 0, 580, 0, 0, 581, 583, 0, 581, 583, + 581, 583, 581, 583, 586, 0, 0, 581, 583, 0, + 0, 0, 588, 0, 586, 0, 586, 0, 586, 0, + 590, 0, 588, 586, 588, 588, 588, 0, 0, 0, + 590, 588, 590, 592, 590, 0, 0, 0, 590, 590, + 0, 0, 0, 592, 0, 592, 0, 592, 598, 598, + + 598, 0, 592, 0, 0, 0, 0, 601, 602, 0, + 598, 598, 598, 598, 598, 598, 598, 601, 602, 601, + 602, 601, 602, 603, 604, 0, 601, 602, 0, 0, + 601, 0, 0, 603, 604, 603, 604, 603, 604, 605, + 606, 0, 603, 604, 0, 0, 0, 0, 0, 605, + 606, 605, 606, 605, 606, 607, 0, 606, 605, 606, + 0, 608, 0, 0, 0, 607, 0, 607, 607, 607, + 0, 608, 609, 608, 607, 608, 0, 0, 613, 609, + 608, 0, 609, 0, 609, 0, 609, 0, 613, 614, + 613, 609, 613, 0, 0, 0, 0, 613, 0, 614, + + 615, 614, 0, 614, 0, 0, 617, 0, 614, 0, + 615, 0, 615, 615, 615, 0, 617, 620, 617, 615, + 617, 0, 0, 622, 620, 617, 0, 620, 0, 620, + 622, 620, 0, 622, 623, 622, 620, 622, 0, 0, + 0, 623, 622, 0, 623, 0, 623, 0, 623, 0, + 0, 633, 634, 623, 630, 630, 630, 630, 630, 630, + 630, 633, 634, 633, 634, 633, 634, 635, 636, 0, + 633, 634, 0, 0, 0, 0, 0, 635, 636, 635, + 636, 635, 636, 637, 0, 0, 635, 636, 0, 0, + 0, 0, 630, 637, 641, 637, 0, 637, 0, 0, + + 642, 637, 637, 0, 641, 0, 641, 0, 641, 0, + 642, 641, 642, 641, 642, 644, 0, 0, 647, 642, + 0, 649, 644, 649, 0, 644, 0, 644, 647, 644, + 647, 649, 647, 649, 644, 649, 647, 647, 650, 0, + 649, 0, 650, 0, 0, 0, 0, 0, 650, 0, + 650, 0, 650, 657, 657, 657, 0, 650, 0, 0, + 0, 0, 659, 0, 0, 657, 657, 657, 657, 657, + 657, 657, 659, 660, 659, 0, 659, 0, 0, 0, + 659, 659, 0, 660, 661, 660, 0, 660, 0, 0, + 665, 660, 660, 0, 661, 0, 661, 0, 661, 0, + + 665, 666, 665, 661, 665, 0, 0, 661, 0, 665, + 0, 666, 668, 666, 0, 666, 0, 0, 0, 0, + 666, 0, 668, 671, 668, 0, 668, 0, 0, 673, + 668, 668, 0, 671, 0, 671, 0, 671, 0, 673, + 674, 673, 671, 673, 0, 0, 671, 674, 673, 0, + 674, 0, 674, 682, 674, 681, 681, 0, 0, 674, + 0, 0, 0, 682, 683, 682, 681, 682, 681, 682, + 681, 0, 682, 0, 683, 681, 683, 687, 683, 0, + 690, 0, 0, 683, 0, 0, 0, 687, 0, 687, + 690, 687, 690, 0, 690, 692, 687, 0, 692, 690, + + 687, 0, 0, 0, 0, 692, 0, 692, 0, 692, + 697, 697, 697, 0, 692, 0, 0, 0, 0, 699, + 0, 0, 697, 697, 697, 697, 697, 697, 697, 699, + 700, 699, 0, 699, 0, 0, 702, 0, 699, 0, + 700, 699, 700, 700, 700, 0, 702, 705, 702, 700, + 702, 0, 0, 0, 0, 702, 0, 705, 709, 705, + 0, 705, 0, 705, 710, 0, 705, 0, 709, 0, + 709, 0, 709, 0, 710, 714, 710, 709, 710, 0, + 0, 717, 0, 710, 0, 714, 0, 714, 0, 714, + 0, 717, 0, 717, 714, 717, 0, 0, 0, 0, + + 717, 721, 721, 721, 721, 721, 721, 721, 721, 721, + 721, 721, 721, 722, 722, 722, 722, 722, 722, 722, + 722, 722, 722, 722, 722, 723, 723, 723, 723, 723, + 723, 723, 723, 723, 723, 723, 723, 724, 724, 724, + 724, 724, 724, 724, 724, 724, 724, 724, 724, 725, + 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, + 725, 726, 726, 726, 726, 726, 726, 726, 726, 726, + 726, 726, 726, 727, 727, 727, 0, 727, 727, 727, + 727, 727, 727, 727, 727, 728, 728, 0, 0, 728, + 0, 728, 729, 0, 729, 730, 730, 0, 730, 730, + + 731, 731, 0, 731, 731, 731, 0, 731, 731, 731, + 731, 731, 732, 732, 732, 0, 732, 732, 732, 732, + 732, 732, 732, 732, 733, 733, 733, 733, 733, 733, + 733, 733, 0, 733, 733, 734, 0, 0, 734, 734, + 734, 734, 734, 734, 734, 734, 735, 0, 0, 735, + 735, 735, 735, 735, 735, 735, 735, 736, 0, 0, + 736, 0, 736, 736, 736, 736, 736, 736, 737, 737, + 0, 737, 737, 738, 738, 0, 738, 738, 739, 739, + 0, 739, 739, 720, 720, 720, 720, 720, 720, 720, + 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, + + 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, + 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, + 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, + 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, + 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, + 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, + 720, 720 } ; extern int yy_flex_debug; int yy_flex_debug = 1; -static yyconst short int yy_rule_linenum[123] = +static yyconst short int yy_rule_linenum[132] = { 0, - 101, 104, 106, 107, 108, 111, 113, 114, 115, 127, - 134, 141, 147, 156, 164, 172, 173, 175, 194, 200, - 207, 214, 221, 231, 265, 272, 273, 274, 275, 283, - 284, 285, 286, 287, 292, 293, 294, 295, 296, 297, - 298, 299, 300, 301, 302, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, - 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, - 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, - - 366, 367, 372, 373, 378, 379, 380, 383, 389, 396, - 405, 416, 422, 424, 425, 427, 429, 431, 444, 450, - 456, 464 + 103, 106, 108, 109, 110, 113, 115, 116, 117, 129, + 136, 143, 149, 158, 166, 174, 175, 177, 196, 202, + 203, 204, 205, 206, 209, 215, 222, 229, 236, 246, + 280, 287, 288, 289, 290, 298, 299, 300, 301, 302, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 389, 390, 395, 396, 397, 400, 406, 413, 422, 433, + 439, 441, 442, 444, 446, 448, 461, 467, 473, 480, + 482 } ; static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; @@ -1722,6 +1819,7 @@ char *yytext; int asn1p_lex(void); void asn1p_lexer_hack_push_opaque_state(void); /* Used in .y */ void asn1p_lexer_hack_enable_with_syntax(void); /* Used in .y */ +void asn1p_lexer_hack_push_encoding_control(void); /* Used in .y */ #define YY_FATAL_ERROR(msg) do { \ fprintf(stderr, \ @@ -1787,7 +1885,6 @@ static asn1_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */ #define YY_NEVER_INTERACTIVE 1 #define YY_NO_INPUT 1 -#define YY_NO_UNPUT 1 #define YY_STACK_USED 1 /* Performance penalty is OK */ /* Controlled from within application */ @@ -1799,11 +1896,13 @@ static asn1_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */ #define opaque 4 -#define with_syntax 5 +#define encoding_control 5 + +#define with_syntax 6 /* Newline */ /* White-space */ -#line 1807 "lex.yy.c" +#line 1906 "asn1p_l.c" /* Macros after this point can all be overridden by user definitions in * section 1. @@ -1954,10 +2053,10 @@ YY_DECL register char *yy_cp, *yy_bp; register int yy_act; -#line 99 "asn1p_l.l" +#line 101 "asn1p_l.l" -#line 1961 "lex.yy.c" +#line 2060 "asn1p_l.c" if ( yy_init ) { @@ -2005,14 +2104,14 @@ YY_DECL while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 675 ) + if ( yy_current_state >= 721 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *yy_state_ptr++ = yy_current_state; ++yy_cp; } - while ( yy_base[yy_current_state] != 4166 ); + while ( yy_base[yy_current_state] != 4484 ); yy_find_action: yy_current_state = *--yy_state_ptr; @@ -2049,13 +2148,13 @@ YY_DECL { if ( yy_act == 0 ) fprintf( stderr, "--scanner backing up\n" ); - else if ( yy_act < 123 ) + else if ( yy_act < 132 ) fprintf( stderr, "--accepting rule at line %d (\"%s\")\n", yy_rule_linenum[yy_act], yytext ); - else if ( yy_act == 123 ) + else if ( yy_act == 132 ) fprintf( stderr, "--accepting default rule (\"%s\")\n", yytext ); - else if ( yy_act == 124 ) + else if ( yy_act == 133 ) fprintf( stderr, "--(end of buffer or a NUL)\n" ); else fprintf( stderr, "--EOF (start condition %d)\n", YY_START ); @@ -2065,50 +2164,50 @@ YY_DECL { /* beginning of action switch */ case 1: YY_RULE_SETUP -#line 101 "asn1p_l.l" +#line 103 "asn1p_l.l" yy_push_state(dash_comment); YY_BREAK case 2: YY_RULE_SETUP -#line 104 "asn1p_l.l" +#line 106 "asn1p_l.l" yy_pop_state(); YY_BREAK case 3: YY_RULE_SETUP -#line 106 "asn1p_l.l" +#line 108 "asn1p_l.l" yy_pop_state(); /* End of comment */ YY_BREAK case 4: YY_RULE_SETUP -#line 107 "asn1p_l.l" +#line 109 "asn1p_l.l" /* Eat single dash */ YY_BREAK case 5: YY_RULE_SETUP -#line 108 "asn1p_l.l" +#line 110 "asn1p_l.l" /* Eat */ YY_BREAK case 6: YY_RULE_SETUP -#line 111 "asn1p_l.l" +#line 113 "asn1p_l.l" yy_push_state(cpp_comment); YY_BREAK case 7: YY_RULE_SETUP -#line 113 "asn1p_l.l" +#line 115 "asn1p_l.l" /* Eat */ YY_BREAK case 8: YY_RULE_SETUP -#line 114 "asn1p_l.l" +#line 116 "asn1p_l.l" yy_pop_state(); YY_BREAK case 9: YY_RULE_SETUP -#line 115 "asn1p_l.l" +#line 117 "asn1p_l.l" /* Eat */ YY_BREAK @@ -2121,7 +2220,7 @@ YY_RULE_SETUP case 10: YY_RULE_SETUP -#line 127 "asn1p_l.l" +#line 129 "asn1p_l.l" { yy_push_state(opaque); asn1p_lval.tv_opaque.buf = strdup(yytext); @@ -2131,7 +2230,7 @@ YY_RULE_SETUP YY_BREAK case 11: YY_RULE_SETUP -#line 134 "asn1p_l.l" +#line 136 "asn1p_l.l" { yy_pop_state(); asn1p_lval.tv_opaque.buf = strdup(yytext); @@ -2141,7 +2240,7 @@ YY_RULE_SETUP YY_BREAK case 12: YY_RULE_SETUP -#line 141 "asn1p_l.l" +#line 143 "asn1p_l.l" { asn1p_lval.tv_opaque.buf = strdup(yytext); asn1p_lval.tv_opaque.len = yyleng; @@ -2150,7 +2249,7 @@ YY_RULE_SETUP YY_BREAK case 13: YY_RULE_SETUP -#line 147 "asn1p_l.l" +#line 149 "asn1p_l.l" { fprintf(stderr, "ASN.1 Parser syncronization failure: " @@ -2162,7 +2261,7 @@ YY_RULE_SETUP YY_BREAK case 14: YY_RULE_SETUP -#line 156 "asn1p_l.l" +#line 158 "asn1p_l.l" { asn1p_lval.tv_opaque.buf = strdup(yytext); asn1p_lval.tv_opaque.len = yyleng; @@ -2172,7 +2271,7 @@ YY_RULE_SETUP case 15: YY_RULE_SETUP -#line 164 "asn1p_l.l" +#line 166 "asn1p_l.l" { asn1p_lval.tv_opaque.buf = 0; asn1p_lval.tv_opaque.len = 0; @@ -2183,17 +2282,17 @@ YY_RULE_SETUP case 16: YY_RULE_SETUP -#line 172 "asn1p_l.l" +#line 174 "asn1p_l.l" { QAPPEND(yytext, yyleng-1); } /* Add a single quote */ YY_BREAK case 17: YY_RULE_SETUP -#line 173 "asn1p_l.l" +#line 175 "asn1p_l.l" { QAPPEND(yytext, yyleng); } YY_BREAK case 18: YY_RULE_SETUP -#line 175 "asn1p_l.l" +#line 177 "asn1p_l.l" { yy_pop_state(); /* Do not append last quote: @@ -2211,27 +2310,64 @@ YY_RULE_SETUP } YY_BREAK + case 19: YY_RULE_SETUP -#line 194 "asn1p_l.l" +#line 196 "asn1p_l.l" +{ + const char *s = "ENCODING-CONTROL"; + const char *p = s + sizeof("ENCODING-CONTROL") - 2; + for(; p >= s; p--) unput(*p); + yy_pop_state(); + } + YY_BREAK +case 20: +YY_RULE_SETUP +#line 202 "asn1p_l.l" +unput('D'); unput('N'); unput('E'); yy_pop_state(); + YY_BREAK +case 21: +YY_RULE_SETUP +#line 203 "asn1p_l.l" + + YY_BREAK +case 22: +YY_RULE_SETUP +#line 204 "asn1p_l.l" + + YY_BREAK +case 23: +YY_RULE_SETUP +#line 205 "asn1p_l.l" +/* Eat everything else */ + YY_BREAK +case 24: +YY_RULE_SETUP +#line 206 "asn1p_l.l" + + YY_BREAK + +case 25: +YY_RULE_SETUP +#line 209 "asn1p_l.l" { /* " \t\r\n" weren't allowed in ASN.1:1990. */ asn1p_lval.tv_str = yytext; return TOK_hstring; } YY_BREAK -case 20: +case 26: YY_RULE_SETUP -#line 200 "asn1p_l.l" +#line 215 "asn1p_l.l" { /* " \t\r\n" weren't allowed in ASN.1:1990. */ asn1p_lval.tv_str = strdup(yytext); return TOK_bstring; } YY_BREAK -case 21: +case 27: YY_RULE_SETUP -#line 207 "asn1p_l.l" +#line 222 "asn1p_l.l" { asn1p_lval.a_int = asn1p_atoi(yytext); if(errno == ERANGE) @@ -2239,9 +2375,9 @@ YY_RULE_SETUP return TOK_number_negative; } YY_BREAK -case 22: +case 28: YY_RULE_SETUP -#line 214 "asn1p_l.l" +#line 229 "asn1p_l.l" { asn1p_lval.a_int = asn1p_atoi(yytext); if(errno == ERANGE) @@ -2249,9 +2385,9 @@ YY_RULE_SETUP return TOK_number; } YY_BREAK -case 23: +case 29: YY_RULE_SETUP -#line 221 "asn1p_l.l" +#line 236 "asn1p_l.l" { asn1p_lval.a_int = asn1p_atoi(yytext); if(errno == ERANGE) @@ -2262,9 +2398,9 @@ YY_RULE_SETUP /* * Tags */ -case 24: +case 30: YY_RULE_SETUP -#line 231 "asn1p_l.l" +#line 246 "asn1p_l.l" { char *p; memset(&asn1p_lval.a_tag, 0, sizeof(asn1p_lval.a_tag)); @@ -2299,9 +2435,9 @@ YY_RULE_SETUP return TOK_tag; } YY_BREAK -case 25: +case 31: YY_RULE_SETUP -#line 265 "asn1p_l.l" +#line 280 "asn1p_l.l" { fprintf(stderr, "Unsupported tag syntax at line %d: \"%s\"\n", @@ -2309,24 +2445,24 @@ YY_RULE_SETUP return -1; } YY_BREAK -case 26: +case 32: YY_RULE_SETUP -#line 272 "asn1p_l.l" +#line 287 "asn1p_l.l" return TOK_ABSENT; YY_BREAK -case 27: +case 33: YY_RULE_SETUP -#line 273 "asn1p_l.l" +#line 288 "asn1p_l.l" return TOK_ABSTRACT_SYNTAX; YY_BREAK -case 28: +case 34: YY_RULE_SETUP -#line 274 "asn1p_l.l" +#line 289 "asn1p_l.l" return TOK_ALL; YY_BREAK -case 29: +case 35: YY_RULE_SETUP -#line 275 "asn1p_l.l" +#line 290 "asn1p_l.l" { /* Appeared in 1990, removed in 1997 */ if(TYPE_LIFETIME(1990, 1997)) @@ -2336,88 +2472,88 @@ YY_RULE_SETUP REJECT; } YY_BREAK -case 30: +case 36: YY_RULE_SETUP -#line 283 "asn1p_l.l" +#line 298 "asn1p_l.l" return TOK_APPLICATION; YY_BREAK -case 31: +case 37: YY_RULE_SETUP -#line 284 "asn1p_l.l" +#line 299 "asn1p_l.l" return TOK_AUTOMATIC; YY_BREAK -case 32: +case 38: YY_RULE_SETUP -#line 285 "asn1p_l.l" +#line 300 "asn1p_l.l" return TOK_BEGIN; YY_BREAK -case 33: +case 39: YY_RULE_SETUP -#line 286 "asn1p_l.l" +#line 301 "asn1p_l.l" return TOK_BIT; YY_BREAK -case 34: +case 40: YY_RULE_SETUP -#line 287 "asn1p_l.l" +#line 302 "asn1p_l.l" { if(TYPE_LIFETIME(1994, 0)) return TOK_BMPString; REJECT; } YY_BREAK -case 35: +case 41: YY_RULE_SETUP -#line 292 "asn1p_l.l" +#line 307 "asn1p_l.l" return TOK_BOOLEAN; YY_BREAK -case 36: +case 42: YY_RULE_SETUP -#line 293 "asn1p_l.l" +#line 308 "asn1p_l.l" return TOK_BY; YY_BREAK -case 37: +case 43: YY_RULE_SETUP -#line 294 "asn1p_l.l" +#line 309 "asn1p_l.l" return TOK_CHARACTER; YY_BREAK -case 38: +case 44: YY_RULE_SETUP -#line 295 "asn1p_l.l" +#line 310 "asn1p_l.l" return TOK_CHOICE; YY_BREAK -case 39: +case 45: YY_RULE_SETUP -#line 296 "asn1p_l.l" +#line 311 "asn1p_l.l" return TOK_CLASS; YY_BREAK -case 40: +case 46: YY_RULE_SETUP -#line 297 "asn1p_l.l" +#line 312 "asn1p_l.l" return TOK_COMPONENT; YY_BREAK -case 41: +case 47: YY_RULE_SETUP -#line 298 "asn1p_l.l" +#line 313 "asn1p_l.l" return TOK_COMPONENTS; YY_BREAK -case 42: +case 48: YY_RULE_SETUP -#line 299 "asn1p_l.l" +#line 314 "asn1p_l.l" return TOK_CONSTRAINED; YY_BREAK -case 43: +case 49: YY_RULE_SETUP -#line 300 "asn1p_l.l" +#line 315 "asn1p_l.l" return TOK_CONTAINING; YY_BREAK -case 44: +case 50: YY_RULE_SETUP -#line 301 "asn1p_l.l" +#line 316 "asn1p_l.l" return TOK_DEFAULT; YY_BREAK -case 45: +case 51: YY_RULE_SETUP -#line 302 "asn1p_l.l" +#line 317 "asn1p_l.l" { /* Appeared in 1990, removed in 1997 */ if(TYPE_LIFETIME(1990, 1997)) @@ -2428,345 +2564,355 @@ YY_RULE_SETUP REJECT; } YY_BREAK -case 46: +case 52: YY_RULE_SETUP -#line 311 "asn1p_l.l" +#line 326 "asn1p_l.l" return TOK_DEFINITIONS; YY_BREAK -case 47: +case 53: YY_RULE_SETUP -#line 312 "asn1p_l.l" +#line 327 "asn1p_l.l" return TOK_EMBEDDED; YY_BREAK -case 48: +case 54: YY_RULE_SETUP -#line 313 "asn1p_l.l" +#line 328 "asn1p_l.l" return TOK_ENCODED; YY_BREAK -case 49: +case 55: YY_RULE_SETUP -#line 314 "asn1p_l.l" +#line 329 "asn1p_l.l" +return TOK_ENCODING_CONTROL; + YY_BREAK +case 56: +YY_RULE_SETUP +#line 330 "asn1p_l.l" return TOK_END; YY_BREAK -case 50: +case 57: YY_RULE_SETUP -#line 315 "asn1p_l.l" +#line 331 "asn1p_l.l" return TOK_ENUMERATED; YY_BREAK -case 51: +case 58: YY_RULE_SETUP -#line 316 "asn1p_l.l" +#line 332 "asn1p_l.l" return TOK_EXCEPT; YY_BREAK -case 52: +case 59: YY_RULE_SETUP -#line 317 "asn1p_l.l" +#line 333 "asn1p_l.l" return TOK_EXPLICIT; YY_BREAK -case 53: +case 60: YY_RULE_SETUP -#line 318 "asn1p_l.l" +#line 334 "asn1p_l.l" return TOK_EXPORTS; YY_BREAK -case 54: +case 61: YY_RULE_SETUP -#line 319 "asn1p_l.l" +#line 335 "asn1p_l.l" return TOK_EXTENSIBILITY; YY_BREAK -case 55: +case 62: YY_RULE_SETUP -#line 320 "asn1p_l.l" +#line 336 "asn1p_l.l" return TOK_EXTERNAL; YY_BREAK -case 56: +case 63: YY_RULE_SETUP -#line 321 "asn1p_l.l" +#line 337 "asn1p_l.l" return TOK_FALSE; YY_BREAK -case 57: +case 64: YY_RULE_SETUP -#line 322 "asn1p_l.l" +#line 338 "asn1p_l.l" return TOK_FROM; YY_BREAK -case 58: +case 65: YY_RULE_SETUP -#line 323 "asn1p_l.l" +#line 339 "asn1p_l.l" return TOK_GeneralizedTime; YY_BREAK -case 59: +case 66: YY_RULE_SETUP -#line 324 "asn1p_l.l" +#line 340 "asn1p_l.l" return TOK_GeneralString; YY_BREAK -case 60: +case 67: YY_RULE_SETUP -#line 325 "asn1p_l.l" +#line 341 "asn1p_l.l" return TOK_GraphicString; YY_BREAK -case 61: +case 68: YY_RULE_SETUP -#line 326 "asn1p_l.l" +#line 342 "asn1p_l.l" return TOK_IA5String; YY_BREAK -case 62: +case 69: YY_RULE_SETUP -#line 327 "asn1p_l.l" +#line 343 "asn1p_l.l" return TOK_IDENTIFIER; YY_BREAK -case 63: +case 70: YY_RULE_SETUP -#line 328 "asn1p_l.l" +#line 344 "asn1p_l.l" return TOK_IMPLICIT; YY_BREAK -case 64: +case 71: YY_RULE_SETUP -#line 329 "asn1p_l.l" +#line 345 "asn1p_l.l" return TOK_IMPLIED; YY_BREAK -case 65: +case 72: YY_RULE_SETUP -#line 330 "asn1p_l.l" +#line 346 "asn1p_l.l" return TOK_IMPORTS; YY_BREAK -case 66: +case 73: YY_RULE_SETUP -#line 331 "asn1p_l.l" +#line 347 "asn1p_l.l" return TOK_INCLUDES; YY_BREAK -case 67: +case 74: YY_RULE_SETUP -#line 332 "asn1p_l.l" +#line 348 "asn1p_l.l" return TOK_INSTANCE; YY_BREAK -case 68: +case 75: YY_RULE_SETUP -#line 333 "asn1p_l.l" +#line 349 "asn1p_l.l" +return TOK_INSTRUCTIONS; + YY_BREAK +case 76: +YY_RULE_SETUP +#line 350 "asn1p_l.l" return TOK_INTEGER; YY_BREAK -case 69: +case 77: YY_RULE_SETUP -#line 334 "asn1p_l.l" +#line 351 "asn1p_l.l" return TOK_INTERSECTION; YY_BREAK -case 70: +case 78: YY_RULE_SETUP -#line 335 "asn1p_l.l" +#line 352 "asn1p_l.l" return TOK_ISO646String; YY_BREAK -case 71: +case 79: YY_RULE_SETUP -#line 336 "asn1p_l.l" +#line 353 "asn1p_l.l" return TOK_MAX; YY_BREAK -case 72: +case 80: YY_RULE_SETUP -#line 337 "asn1p_l.l" +#line 354 "asn1p_l.l" return TOK_MIN; YY_BREAK -case 73: +case 81: YY_RULE_SETUP -#line 338 "asn1p_l.l" +#line 355 "asn1p_l.l" return TOK_MINUS_INFINITY; YY_BREAK -case 74: +case 82: YY_RULE_SETUP -#line 339 "asn1p_l.l" +#line 356 "asn1p_l.l" return TOK_NULL; YY_BREAK -case 75: +case 83: YY_RULE_SETUP -#line 340 "asn1p_l.l" +#line 357 "asn1p_l.l" return TOK_NumericString; YY_BREAK -case 76: +case 84: YY_RULE_SETUP -#line 341 "asn1p_l.l" +#line 358 "asn1p_l.l" return TOK_OBJECT; YY_BREAK -case 77: +case 85: YY_RULE_SETUP -#line 342 "asn1p_l.l" +#line 359 "asn1p_l.l" return TOK_ObjectDescriptor; YY_BREAK -case 78: +case 86: YY_RULE_SETUP -#line 343 "asn1p_l.l" +#line 360 "asn1p_l.l" return TOK_OCTET; YY_BREAK -case 79: +case 87: YY_RULE_SETUP -#line 344 "asn1p_l.l" +#line 361 "asn1p_l.l" return TOK_OF; YY_BREAK -case 80: +case 88: YY_RULE_SETUP -#line 345 "asn1p_l.l" +#line 362 "asn1p_l.l" return TOK_OPTIONAL; YY_BREAK -case 81: +case 89: YY_RULE_SETUP -#line 346 "asn1p_l.l" +#line 363 "asn1p_l.l" return TOK_PATTERN; YY_BREAK -case 82: +case 90: YY_RULE_SETUP -#line 347 "asn1p_l.l" +#line 364 "asn1p_l.l" return TOK_PDV; YY_BREAK -case 83: +case 91: YY_RULE_SETUP -#line 348 "asn1p_l.l" +#line 365 "asn1p_l.l" return TOK_PLUS_INFINITY; YY_BREAK -case 84: +case 92: YY_RULE_SETUP -#line 349 "asn1p_l.l" +#line 366 "asn1p_l.l" return TOK_PRESENT; YY_BREAK -case 85: +case 93: YY_RULE_SETUP -#line 350 "asn1p_l.l" +#line 367 "asn1p_l.l" return TOK_PrintableString; YY_BREAK -case 86: +case 94: YY_RULE_SETUP -#line 351 "asn1p_l.l" +#line 368 "asn1p_l.l" return TOK_PRIVATE; YY_BREAK -case 87: +case 95: YY_RULE_SETUP -#line 352 "asn1p_l.l" +#line 369 "asn1p_l.l" return TOK_REAL; YY_BREAK -case 88: +case 96: YY_RULE_SETUP -#line 353 "asn1p_l.l" +#line 370 "asn1p_l.l" return TOK_RELATIVE_OID; YY_BREAK -case 89: +case 97: YY_RULE_SETUP -#line 354 "asn1p_l.l" +#line 371 "asn1p_l.l" return TOK_SEQUENCE; YY_BREAK -case 90: +case 98: YY_RULE_SETUP -#line 355 "asn1p_l.l" +#line 372 "asn1p_l.l" return TOK_SET; YY_BREAK -case 91: +case 99: YY_RULE_SETUP -#line 356 "asn1p_l.l" +#line 373 "asn1p_l.l" return TOK_SIZE; YY_BREAK -case 92: +case 100: YY_RULE_SETUP -#line 357 "asn1p_l.l" +#line 374 "asn1p_l.l" return TOK_STRING; YY_BREAK -case 93: +case 101: YY_RULE_SETUP -#line 358 "asn1p_l.l" +#line 375 "asn1p_l.l" return TOK_SYNTAX; YY_BREAK -case 94: +case 102: YY_RULE_SETUP -#line 359 "asn1p_l.l" +#line 376 "asn1p_l.l" return TOK_T61String; YY_BREAK -case 95: +case 103: YY_RULE_SETUP -#line 360 "asn1p_l.l" +#line 377 "asn1p_l.l" return TOK_TAGS; YY_BREAK -case 96: +case 104: YY_RULE_SETUP -#line 361 "asn1p_l.l" +#line 378 "asn1p_l.l" return TOK_TeletexString; YY_BREAK -case 97: +case 105: YY_RULE_SETUP -#line 362 "asn1p_l.l" +#line 379 "asn1p_l.l" return TOK_TRUE; YY_BREAK -case 98: +case 106: YY_RULE_SETUP -#line 363 "asn1p_l.l" +#line 380 "asn1p_l.l" return TOK_TYPE_IDENTIFIER; YY_BREAK -case 99: +case 107: YY_RULE_SETUP -#line 364 "asn1p_l.l" +#line 381 "asn1p_l.l" return TOK_UNION; YY_BREAK -case 100: +case 108: YY_RULE_SETUP -#line 365 "asn1p_l.l" +#line 382 "asn1p_l.l" return TOK_UNIQUE; YY_BREAK -case 101: +case 109: YY_RULE_SETUP -#line 366 "asn1p_l.l" +#line 383 "asn1p_l.l" return TOK_UNIVERSAL; YY_BREAK -case 102: +case 110: YY_RULE_SETUP -#line 367 "asn1p_l.l" +#line 384 "asn1p_l.l" { if(TYPE_LIFETIME(1994, 0)) return TOK_UniversalString; REJECT; } YY_BREAK -case 103: +case 111: YY_RULE_SETUP -#line 372 "asn1p_l.l" +#line 389 "asn1p_l.l" return TOK_UTCTime; YY_BREAK -case 104: +case 112: YY_RULE_SETUP -#line 373 "asn1p_l.l" +#line 390 "asn1p_l.l" { if(TYPE_LIFETIME(1994, 0)) return TOK_UTF8String; REJECT; } YY_BREAK -case 105: +case 113: YY_RULE_SETUP -#line 378 "asn1p_l.l" +#line 395 "asn1p_l.l" return TOK_VideotexString; YY_BREAK -case 106: +case 114: YY_RULE_SETUP -#line 379 "asn1p_l.l" +#line 396 "asn1p_l.l" return TOK_VisibleString; YY_BREAK -case 107: +case 115: YY_RULE_SETUP -#line 380 "asn1p_l.l" +#line 397 "asn1p_l.l" return TOK_WITH; YY_BREAK -case 108: +case 116: YY_RULE_SETUP -#line 383 "asn1p_l.l" +#line 400 "asn1p_l.l" { CHECK_DASHES; asn1p_lval.tv_str = strdup(yytext); return TOK_typefieldreference; } YY_BREAK -case 109: +case 117: YY_RULE_SETUP -#line 389 "asn1p_l.l" +#line 406 "asn1p_l.l" { CHECK_DASHES; asn1p_lval.tv_str = strdup(yytext); return TOK_valuefieldreference; } YY_BREAK -case 110: +case 118: YY_RULE_SETUP -#line 396 "asn1p_l.l" +#line 413 "asn1p_l.l" { CHECK_DASHES; asn1p_lval.tv_str = strdup(yytext); @@ -2776,13 +2922,13 @@ YY_RULE_SETUP /* * objectclassreference */ -case 111: +case 119: YY_RULE_SETUP -#line 405 "asn1p_l.l" +#line 422 "asn1p_l.l" { CHECK_DASHES; asn1p_lval.tv_str = strdup(yytext); - return TOK_objectclassreference; + return TOK_capitalreference; } YY_BREAK /* @@ -2790,43 +2936,43 @@ YY_RULE_SETUP * NOTE: TOK_objectclassreference must be combined * with this token to produce true typereference. */ -case 112: +case 120: YY_RULE_SETUP -#line 416 "asn1p_l.l" +#line 433 "asn1p_l.l" { CHECK_DASHES; asn1p_lval.tv_str = strdup(yytext); return TOK_typereference; } YY_BREAK -case 113: +case 121: YY_RULE_SETUP -#line 422 "asn1p_l.l" +#line 439 "asn1p_l.l" return TOK_PPEQ; YY_BREAK -case 114: +case 122: YY_RULE_SETUP -#line 424 "asn1p_l.l" +#line 441 "asn1p_l.l" return TOK_ThreeDots; YY_BREAK -case 115: +case 123: YY_RULE_SETUP -#line 425 "asn1p_l.l" +#line 442 "asn1p_l.l" return TOK_TwoDots; YY_BREAK -case 116: +case 124: YY_RULE_SETUP -#line 427 "asn1p_l.l" +#line 444 "asn1p_l.l" return yytext[0]; YY_BREAK -case 117: +case 125: YY_RULE_SETUP -#line 429 "asn1p_l.l" +#line 446 "asn1p_l.l" /* Ignore whitespace */ YY_BREAK -case 118: +case 126: YY_RULE_SETUP -#line 431 "asn1p_l.l" +#line 448 "asn1p_l.l" { if(TYPE_LIFETIME(1994, 0)) fprintf(stderr, "ERROR: "); @@ -2839,36 +2985,41 @@ YY_RULE_SETUP } YY_BREAK -case 119: +case 127: YY_RULE_SETUP -#line 444 "asn1p_l.l" +#line 461 "asn1p_l.l" { asn1p_lval.tv_opaque.buf = strdup(yytext); asn1p_lval.tv_opaque.len = yyleng; return TOK_opaque; } YY_BREAK -case 120: +case 128: YY_RULE_SETUP -#line 450 "asn1p_l.l" +#line 467 "asn1p_l.l" { asn1p_lval.tv_opaque.buf = strdup(yytext); asn1p_lval.tv_opaque.len = yyleng; return TOK_opaque; } YY_BREAK -case 121: +case 129: YY_RULE_SETUP -#line 456 "asn1p_l.l" +#line 473 "asn1p_l.l" { yy_pop_state(); return '}'; } YY_BREAK -case 122: +case 130: YY_RULE_SETUP -#line 464 "asn1p_l.l" +#line 480 "asn1p_l.l" +return yytext[0]; /* Union, Intersection */ + YY_BREAK +case 131: +YY_RULE_SETUP +#line 482 "asn1p_l.l" { fprintf(stderr, "Unexpected token at line %d: \"%s\"\n", @@ -2886,20 +3037,21 @@ case YY_STATE_EOF(dash_comment): case YY_STATE_EOF(cpp_comment): case YY_STATE_EOF(quoted): case YY_STATE_EOF(opaque): +case YY_STATE_EOF(encoding_control): case YY_STATE_EOF(with_syntax): -#line 476 "asn1p_l.l" +#line 494 "asn1p_l.l" { while(YYSTATE != INITIAL) yy_pop_state(); yyterminate(); } YY_BREAK -case 123: +case 132: YY_RULE_SETUP -#line 483 "asn1p_l.l" +#line 501 "asn1p_l.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK -#line 2903 "lex.yy.c" +#line 3055 "asn1p_l.c" case YY_END_OF_BUFFER: { @@ -3186,7 +3338,7 @@ static yy_state_type yy_get_previous_state() while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 675 ) + if ( yy_current_state >= 721 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -3216,11 +3368,11 @@ yy_state_type yy_current_state; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 675 ) + if ( yy_current_state >= 721 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 674); + yy_is_jam = (yy_current_state == 720); if ( ! yy_is_jam ) *yy_state_ptr++ = yy_current_state; @@ -3781,23 +3933,22 @@ int main() return 0; } #endif -#line 483 "asn1p_l.l" +#line 501 "asn1p_l.l" /* * Very dirty but wonderful hack allowing to rule states from within .y file. */ -void -asn1p_lexer_hack_push_opaque_state() { - yy_push_state(opaque); -} +void asn1p_lexer_hack_push_opaque_state() { yy_push_state(opaque); } /* * Another hack which disables recognizing some tokens when inside WITH SYNTAX. */ -void -asn1p_lexer_hack_enable_with_syntax() { - yy_push_state(with_syntax); +void asn1p_lexer_hack_enable_with_syntax() { yy_push_state(with_syntax); } + +/* Yet another */ +void asn1p_lexer_hack_push_encoding_control() { + yy_push_state(encoding_control); } /* diff --git a/libasn1parser/asn1p_l.l b/libasn1parser/asn1p_l.l index 0d86cb749..6a2a0cc79 100644 --- a/libasn1parser/asn1p_l.l +++ b/libasn1parser/asn1p_l.l @@ -10,6 +10,7 @@ int asn1p_lex(void); void asn1p_lexer_hack_push_opaque_state(void); /* Used in .y */ void asn1p_lexer_hack_enable_with_syntax(void); /* Used in .y */ +void asn1p_lexer_hack_push_encoding_control(void); /* Used in .y */ #define YY_FATAL_ERROR(msg) do { \ fprintf(stderr, \ @@ -76,7 +77,7 @@ static asn1_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */ %} %option never-interactive -%option noinput nounput +%option noinput %option noyywrap stack /* Performance penalty is OK */ %option yylineno @@ -89,6 +90,7 @@ static asn1_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */ %x cpp_comment %x quoted %x opaque +%x encoding_control %x with_syntax /* Newline */ @@ -190,6 +192,19 @@ WSP [\t\r\v\f\n ] } +{ + ENCODING-CONTROL { + const char *s = "ENCODING-CONTROL"; + const char *p = s + sizeof("ENCODING-CONTROL") - 2; + for(; p >= s; p--) unput(*p); + yy_pop_state(); + } + END unput('D'); unput('N'); unput('E'); yy_pop_state(); + [^{} \t\r\v\f\n]+ + [[:alnum:]]+ + . /* Eat everything else */ + "\n" + } '[0-9A-F \t\r\v\f\n]+'H { /* " \t\r\n" weren't allowed in ASN.1:1990. */ @@ -311,6 +326,7 @@ DEFINED { DEFINITIONS return TOK_DEFINITIONS; EMBEDDED return TOK_EMBEDDED; ENCODED return TOK_ENCODED; +ENCODING-CONTROL return TOK_ENCODING_CONTROL; END return TOK_END; ENUMERATED return TOK_ENUMERATED; EXCEPT return TOK_EXCEPT; @@ -330,6 +346,7 @@ IMPLIED return TOK_IMPLIED; IMPORTS return TOK_IMPORTS; INCLUDES return TOK_INCLUDES; INSTANCE return TOK_INSTANCE; +INSTRUCTIONS return TOK_INSTRUCTIONS; INTEGER return TOK_INTEGER; INTERSECTION return TOK_INTERSECTION; ISO646String return TOK_ISO646String; @@ -405,7 +422,7 @@ WITH return TOK_WITH; [A-Z][A-Z0-9-]* { CHECK_DASHES; asn1p_lval.tv_str = strdup(yytext); - return TOK_objectclassreference; + return TOK_capitalreference; } /* @@ -460,6 +477,7 @@ WITH return TOK_WITH; } +[|^] return yytext[0]; /* Union, Intersection */ <*>. { fprintf(stderr, @@ -485,17 +503,16 @@ WITH return TOK_WITH; /* * Very dirty but wonderful hack allowing to rule states from within .y file. */ -void -asn1p_lexer_hack_push_opaque_state() { - yy_push_state(opaque); -} +void asn1p_lexer_hack_push_opaque_state() { yy_push_state(opaque); } /* * Another hack which disables recognizing some tokens when inside WITH SYNTAX. */ -void -asn1p_lexer_hack_enable_with_syntax() { - yy_push_state(with_syntax); +void asn1p_lexer_hack_enable_with_syntax() { yy_push_state(with_syntax); } + +/* Yet another */ +void asn1p_lexer_hack_push_encoding_control() { + yy_push_state(encoding_control); } /* diff --git a/libasn1parser/asn1p_module.h b/libasn1parser/asn1p_module.h index 906c784a7..7d8bcc629 100644 --- a/libasn1parser/asn1p_module.h +++ b/libasn1parser/asn1p_module.h @@ -9,11 +9,16 @@ */ typedef enum asn1p_module_flags { MSF_NOFLAGS, - MSF_EXPLICIT_TAGS = 0x1, - MSF_IMPLICIT_TAGS = 0x2, - MSF_AUTOMATIC_TAGS = 0x4, - MSF_EXTENSIBILITY_IMPLIED = 0x8, + MSF_unk_INSTRUCTIONS = 0x001, + MSF_TAG_INSTRUCTIONS = 0x002, + MSF_XER_INSTRUCTIONS = 0x004, + MSF_EXPLICIT_TAGS = 0x010, + MSF_IMPLICIT_TAGS = 0x020, + MSF_AUTOMATIC_TAGS = 0x040, + MSF_EXTENSIBILITY_IMPLIED = 0x100, } asn1p_module_flags_e; +#define MSF_MASK_INSTRUCTIONS 0x0f +#define MSF_MASK_TAGS 0xf0 /* * === EXAMPLE === diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index 68a94fea1..9aa7e749b 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -20,7 +20,7 @@ #define TOK_number 263 #define TOK_number_negative 264 #define TOK_typereference 265 -#define TOK_objectclassreference 266 +#define TOK_capitalreference 266 #define TOK_typefieldreference 267 #define TOK_valuefieldreference 268 #define TOK_ABSENT 269 @@ -46,68 +46,70 @@ #define TOK_DEFINED 289 #define TOK_EMBEDDED 290 #define TOK_ENCODED 291 -#define TOK_END 292 -#define TOK_ENUMERATED 293 -#define TOK_EXPLICIT 294 -#define TOK_EXPORTS 295 -#define TOK_EXTENSIBILITY 296 -#define TOK_EXTERNAL 297 -#define TOK_FALSE 298 -#define TOK_FROM 299 -#define TOK_GeneralizedTime 300 -#define TOK_GeneralString 301 -#define TOK_GraphicString 302 -#define TOK_IA5String 303 -#define TOK_IDENTIFIER 304 -#define TOK_IMPLICIT 305 -#define TOK_IMPLIED 306 -#define TOK_IMPORTS 307 -#define TOK_INCLUDES 308 -#define TOK_INSTANCE 309 -#define TOK_INTEGER 310 -#define TOK_ISO646String 311 -#define TOK_MAX 312 -#define TOK_MIN 313 -#define TOK_MINUS_INFINITY 314 -#define TOK_NULL 315 -#define TOK_NumericString 316 -#define TOK_OBJECT 317 -#define TOK_ObjectDescriptor 318 -#define TOK_OCTET 319 -#define TOK_OF 320 -#define TOK_OPTIONAL 321 -#define TOK_PATTERN 322 -#define TOK_PDV 323 -#define TOK_PLUS_INFINITY 324 -#define TOK_PRESENT 325 -#define TOK_PrintableString 326 -#define TOK_PRIVATE 327 -#define TOK_REAL 328 -#define TOK_RELATIVE_OID 329 -#define TOK_SEQUENCE 330 -#define TOK_SET 331 -#define TOK_SIZE 332 -#define TOK_STRING 333 -#define TOK_SYNTAX 334 -#define TOK_T61String 335 -#define TOK_TAGS 336 -#define TOK_TeletexString 337 -#define TOK_TRUE 338 -#define TOK_TYPE_IDENTIFIER 339 -#define TOK_UNIQUE 340 -#define TOK_UNIVERSAL 341 -#define TOK_UniversalString 342 -#define TOK_UTCTime 343 -#define TOK_UTF8String 344 -#define TOK_VideotexString 345 -#define TOK_VisibleString 346 -#define TOK_WITH 347 -#define TOK_UNION 348 -#define TOK_INTERSECTION 349 +#define TOK_ENCODING_CONTROL 292 +#define TOK_END 293 +#define TOK_ENUMERATED 294 +#define TOK_EXPLICIT 295 +#define TOK_EXPORTS 296 +#define TOK_EXTENSIBILITY 297 +#define TOK_EXTERNAL 298 +#define TOK_FALSE 299 +#define TOK_FROM 300 +#define TOK_GeneralizedTime 301 +#define TOK_GeneralString 302 +#define TOK_GraphicString 303 +#define TOK_IA5String 304 +#define TOK_IDENTIFIER 305 +#define TOK_IMPLICIT 306 +#define TOK_IMPLIED 307 +#define TOK_IMPORTS 308 +#define TOK_INCLUDES 309 +#define TOK_INSTANCE 310 +#define TOK_INSTRUCTIONS 311 +#define TOK_INTEGER 312 +#define TOK_ISO646String 313 +#define TOK_MAX 314 +#define TOK_MIN 315 +#define TOK_MINUS_INFINITY 316 +#define TOK_NULL 317 +#define TOK_NumericString 318 +#define TOK_OBJECT 319 +#define TOK_ObjectDescriptor 320 +#define TOK_OCTET 321 +#define TOK_OF 322 +#define TOK_OPTIONAL 323 +#define TOK_PATTERN 324 +#define TOK_PDV 325 +#define TOK_PLUS_INFINITY 326 +#define TOK_PRESENT 327 +#define TOK_PrintableString 328 +#define TOK_PRIVATE 329 +#define TOK_REAL 330 +#define TOK_RELATIVE_OID 331 +#define TOK_SEQUENCE 332 +#define TOK_SET 333 +#define TOK_SIZE 334 +#define TOK_STRING 335 +#define TOK_SYNTAX 336 +#define TOK_T61String 337 +#define TOK_TAGS 338 +#define TOK_TeletexString 339 +#define TOK_TRUE 340 +#define TOK_TYPE_IDENTIFIER 341 +#define TOK_UNIQUE 342 +#define TOK_UNIVERSAL 343 +#define TOK_UniversalString 344 +#define TOK_UTCTime 345 +#define TOK_UTF8String 346 +#define TOK_VideotexString 347 +#define TOK_VisibleString 348 +#define TOK_WITH 349 #define TOK_EXCEPT 350 -#define TOK_TwoDots 351 -#define TOK_ThreeDots 352 -#define TOK_tag 353 +#define TOK_INTERSECTION 351 +#define TOK_UNION 352 +#define TOK_TwoDots 353 +#define TOK_ThreeDots 354 +#define TOK_tag 355 #line 1 "asn1p_y.y" @@ -127,6 +129,7 @@ int yylex(void); int yyerror(const char *msg); void asn1p_lexer_hack_push_opaque_state(void); void asn1p_lexer_hack_enable_with_syntax(void); +void asn1p_lexer_hack_push_encoding_control(void); #define yylineno asn1p_lineno extern int asn1p_lineno; @@ -159,7 +162,7 @@ static asn1p_value_t * } while(0) -#line 57 "asn1p_y.y" +#line 58 "asn1p_y.y" typedef union { asn1p_t *a_grammar; asn1p_module_flags_e a_module_flags; @@ -202,26 +205,26 @@ typedef union { -#define YYFINAL 375 +#define YYFINAL 381 #define YYFLAG -32768 -#define YYNTBASE 113 +#define YYNTBASE 115 -#define YYTRANSLATE(x) ((unsigned)(x) <= 353 ? yytranslate[x] : 211) +#define YYTRANSLATE(x) ((unsigned)(x) <= 355 ? yytranslate[x] : 210) static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 109, 2, 2, 2, 2, 2, 2, 104, - 105, 2, 2, 107, 2, 110, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 108, 106, 111, - 2, 2, 2, 112, 2, 2, 2, 2, 2, 2, + 2, 2, 111, 2, 2, 2, 2, 2, 2, 106, + 107, 2, 2, 109, 2, 112, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 110, 108, 113, + 2, 2, 2, 114, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 96, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 97, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 102, 94, 103, 2, 2, 2, 2, 2, + 2, 2, 104, 99, 105, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -243,140 +246,140 @@ static const char yytranslate[] = { 0, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 95, 97, 98, - 99, 100, 101 + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 98, 100, 101, 102, 103 }; #if YYDEBUG != 0 static const short yyprhs[] = { 0, 0, 2, 4, 7, 16, 17, 19, 23, 26, 28, 31, 33, 38, 40, 41, 43, 45, 48, 51, 54, - 57, 60, 61, 63, 65, 68, 70, 72, 74, 76, - 78, 80, 84, 87, 89, 92, 97, 99, 103, 105, - 107, 111, 115, 118, 120, 124, 126, 128, 135, 137, - 139, 140, 142, 147, 152, 156, 163, 165, 169, 171, - 175, 179, 181, 185, 187, 189, 191, 195, 201, 202, - 204, 206, 210, 213, 217, 222, 223, 225, 226, 233, - 235, 238, 240, 242, 245, 247, 251, 253, 257, 261, - 263, 265, 267, 272, 274, 278, 280, 284, 288, 290, - 294, 296, 300, 302, 304, 306, 308, 313, 314, 318, - 320, 322, 324, 326, 328, 330, 334, 336, 339, 341, - 343, 345, 347, 350, 353, 355, 357, 360, 363, 365, - 367, 369, 371, 374, 376, 379, 381, 383, 385, 387, - 389, 391, 393, 395, 397, 399, 401, 403, 405, 407, - 412, 417, 422, 427, 432, 434, 439, 440, 442, 444, - 446, 448, 450, 452, 457, 459, 462, 466, 468, 472, - 478, 480, 484, 486, 488, 492, 494, 498, 500, 504, - 506, 510, 515, 517, 519, 521, 524, 527, 531, 533, - 535, 537, 539, 541, 543, 545, 547, 549, 555, 557, - 561, 563, 567, 568, 570, 572, 574, 576, 578, 580, - 584, 589, 591, 595, 598, 602, 604, 608, 609, 611, - 613, 616, 618, 620, 621, 625, 628, 632, 634, 638, - 640, 645, 650, 652, 654, 656, 658, 659, 661, 663, - 666, 669, 671, 673, 675, 677, 679 + 57, 60, 63, 64, 66, 68, 71, 73, 75, 77, + 79, 81, 82, 86, 88, 92, 95, 97, 100, 105, + 107, 111, 113, 115, 119, 123, 126, 128, 132, 134, + 136, 143, 145, 147, 148, 150, 155, 160, 164, 171, + 173, 177, 179, 183, 187, 189, 193, 195, 197, 199, + 203, 209, 210, 212, 214, 218, 221, 225, 230, 231, + 233, 234, 241, 243, 246, 248, 250, 253, 255, 259, + 261, 265, 269, 271, 273, 275, 280, 282, 286, 288, + 292, 296, 298, 302, 304, 308, 310, 312, 314, 316, + 321, 322, 326, 328, 330, 332, 334, 336, 338, 342, + 344, 347, 349, 351, 353, 355, 358, 361, 363, 365, + 368, 371, 373, 375, 377, 379, 382, 384, 387, 389, + 391, 393, 395, 397, 399, 401, 403, 405, 407, 409, + 411, 413, 415, 420, 425, 430, 435, 440, 442, 447, + 449, 451, 453, 455, 457, 458, 460, 465, 469, 474, + 476, 480, 486, 488, 492, 496, 500, 505, 509, 511, + 515, 519, 523, 527, 529, 531, 533, 536, 539, 543, + 545, 547, 549, 551, 553, 555, 557, 563, 565, 569, + 571, 575, 576, 578, 580, 582, 584, 586, 588, 592, + 597, 599, 603, 606, 610, 612, 616, 617, 619, 621, + 624, 626, 628, 629, 633, 636, 640, 642, 646, 648, + 653, 658, 660, 662, 664, 666, 667, 669, 671, 674, + 677, 679, 681, 683, 685, 687 }; -static const short yyrhs[] = { 114, - 0, 115, 0, 114, 115, 0, 207, 116, 34, 120, - 3, 21, 123, 38, 0, 0, 117, 0, 102, 118, - 103, 0, 102, 103, 0, 119, 0, 118, 119, 0, - 209, 0, 209, 104, 9, 105, 0, 9, 0, 0, - 121, 0, 122, 0, 121, 122, 0, 40, 82, 0, - 51, 82, 0, 20, 82, 0, 42, 52, 0, 0, - 124, 0, 125, 0, 124, 125, 0, 126, 0, 131, - 0, 137, 0, 161, 0, 134, 0, 169, 0, 53, - 127, 106, 0, 53, 45, 0, 128, 0, 127, 128, - 0, 129, 45, 207, 116, 0, 130, 0, 129, 107, - 130, 0, 207, 0, 209, 0, 41, 132, 106, 0, - 41, 17, 106, 0, 41, 106, 0, 133, 0, 132, - 107, 133, 0, 207, 0, 209, 0, 207, 135, 3, - 102, 136, 103, 0, 156, 0, 166, 0, 0, 177, - 0, 207, 3, 205, 85, 0, 207, 3, 205, 153, - 0, 207, 3, 143, 0, 207, 102, 138, 103, 3, - 153, 0, 139, 0, 138, 107, 139, 0, 207, 0, - 207, 108, 209, 0, 166, 108, 209, 0, 141, 0, - 140, 107, 141, 0, 155, 0, 209, 0, 152, 0, - 142, 107, 152, 0, 28, 102, 145, 103, 147, 0, - 0, 86, 0, 146, 0, 145, 107, 146, 0, 159, - 197, 0, 159, 153, 144, 0, 159, 159, 197, 144, - 0, 0, 148, 0, 0, 93, 80, 102, 149, 150, - 103, 0, 151, 0, 150, 151, 0, 4, 0, 159, - 0, 210, 153, 0, 154, 0, 155, 171, 197, 0, - 100, 0, 100, 109, 164, 0, 100, 109, 204, 0, - 168, 0, 169, 0, 170, 0, 207, 102, 140, 103, - 0, 156, 0, 55, 66, 156, 0, 11, 0, 11, - 110, 207, 0, 11, 110, 209, 0, 208, 0, 208, - 110, 157, 0, 158, 0, 157, 110, 158, 0, 160, - 0, 160, 0, 13, 0, 14, 0, 209, 135, 3, - 162, 0, 0, 102, 163, 165, 0, 5, 0, 7, - 0, 6, 0, 204, 0, 164, 0, 209, 0, 207, - 110, 209, 0, 4, 0, 165, 4, 0, 24, 0, - 61, 0, 74, 0, 167, 0, 65, 79, 0, 63, - 50, 0, 75, 0, 43, 0, 36, 69, 0, 26, - 79, 0, 89, 0, 46, 0, 56, 0, 39, 0, - 22, 79, 0, 166, 0, 167, 201, 0, 23, 0, - 47, 0, 48, 0, 49, 0, 57, 0, 62, 0, - 72, 0, 81, 0, 83, 0, 88, 0, 90, 0, - 91, 0, 92, 0, 64, 0, 27, 102, 142, 103, - 0, 76, 102, 142, 103, 0, 77, 102, 142, 103, - 0, 76, 171, 66, 155, 0, 77, 171, 66, 155, - 0, 18, 0, 18, 35, 25, 209, 0, 0, 175, - 0, 94, 0, 95, 0, 96, 0, 97, 0, 98, - 0, 78, 104, 177, 105, 0, 176, 0, 175, 176, - 0, 104, 177, 105, 0, 178, 0, 178, 107, 100, - 0, 178, 107, 100, 107, 178, 0, 100, 0, 100, - 107, 178, 0, 179, 0, 180, 0, 179, 172, 180, - 0, 181, 0, 180, 173, 181, 0, 182, 0, 181, - 174, 182, 0, 185, 0, 185, 183, 185, 0, 184, - 104, 177, 105, 0, 191, 0, 186, 0, 99, 0, - 99, 111, 0, 111, 99, 0, 111, 99, 111, 0, - 78, 0, 45, 0, 204, 0, 209, 0, 6, 0, - 59, 0, 58, 0, 44, 0, 84, 0, 93, 30, - 102, 187, 103, 0, 188, 0, 187, 107, 188, 0, - 100, 0, 209, 171, 189, 0, 0, 190, 0, 71, - 0, 15, 0, 67, 0, 192, 0, 193, 0, 102, - 207, 103, 0, 192, 102, 194, 103, 0, 195, 0, - 194, 107, 195, 0, 112, 196, 0, 112, 110, 196, - 0, 209, 0, 196, 110, 209, 0, 0, 198, 0, - 67, 0, 33, 199, 0, 185, 0, 166, 0, 0, - 102, 200, 165, 0, 102, 103, 0, 102, 202, 103, - 0, 203, 0, 202, 107, 203, 0, 209, 0, 209, - 104, 204, 105, 0, 209, 104, 164, 105, 0, 204, - 0, 100, 0, 9, 0, 10, 0, 0, 206, 0, - 101, 0, 101, 51, 0, 101, 40, 0, 11, 0, - 12, 0, 12, 0, 8, 0, 209, 0, 209, 206, - 0 +static const short yyrhs[] = { 116, + 0, 117, 0, 116, 117, 0, 206, 118, 34, 122, + 3, 21, 125, 39, 0, 0, 119, 0, 104, 120, + 105, 0, 104, 105, 0, 121, 0, 120, 121, 0, + 208, 0, 208, 106, 9, 107, 0, 9, 0, 0, + 123, 0, 124, 0, 123, 124, 0, 41, 84, 0, + 52, 84, 0, 20, 84, 0, 43, 53, 0, 12, + 57, 0, 0, 126, 0, 127, 0, 126, 127, 0, + 129, 0, 134, 0, 140, 0, 164, 0, 137, 0, + 0, 38, 12, 128, 0, 172, 0, 54, 130, 108, + 0, 54, 46, 0, 131, 0, 130, 131, 0, 132, + 46, 206, 118, 0, 133, 0, 132, 109, 133, 0, + 206, 0, 208, 0, 42, 135, 108, 0, 42, 17, + 108, 0, 42, 108, 0, 136, 0, 135, 109, 136, + 0, 206, 0, 208, 0, 206, 138, 3, 104, 139, + 105, 0, 159, 0, 169, 0, 0, 179, 0, 206, + 3, 204, 87, 0, 206, 3, 204, 156, 0, 206, + 3, 146, 0, 206, 104, 141, 105, 3, 156, 0, + 142, 0, 141, 109, 142, 0, 206, 0, 206, 110, + 208, 0, 169, 110, 208, 0, 144, 0, 143, 109, + 144, 0, 158, 0, 208, 0, 155, 0, 145, 109, + 155, 0, 28, 104, 148, 105, 150, 0, 0, 88, + 0, 149, 0, 148, 109, 149, 0, 162, 196, 0, + 162, 156, 147, 0, 162, 162, 196, 147, 0, 0, + 151, 0, 0, 95, 82, 104, 152, 153, 105, 0, + 154, 0, 153, 154, 0, 4, 0, 162, 0, 209, + 156, 0, 157, 0, 158, 177, 196, 0, 102, 0, + 102, 111, 167, 0, 102, 111, 203, 0, 171, 0, + 172, 0, 173, 0, 206, 104, 143, 105, 0, 159, + 0, 56, 68, 159, 0, 11, 0, 11, 112, 206, + 0, 11, 112, 208, 0, 207, 0, 207, 112, 160, + 0, 161, 0, 160, 112, 161, 0, 163, 0, 163, + 0, 13, 0, 14, 0, 208, 138, 3, 165, 0, + 0, 104, 166, 168, 0, 5, 0, 7, 0, 6, + 0, 203, 0, 167, 0, 208, 0, 206, 112, 208, + 0, 4, 0, 168, 4, 0, 24, 0, 63, 0, + 76, 0, 170, 0, 67, 81, 0, 65, 51, 0, + 77, 0, 44, 0, 36, 71, 0, 26, 81, 0, + 91, 0, 47, 0, 58, 0, 40, 0, 22, 81, + 0, 169, 0, 170, 200, 0, 23, 0, 48, 0, + 49, 0, 50, 0, 59, 0, 64, 0, 74, 0, + 83, 0, 85, 0, 90, 0, 92, 0, 93, 0, + 94, 0, 66, 0, 27, 104, 145, 105, 0, 78, + 104, 145, 105, 0, 79, 104, 145, 105, 0, 78, + 177, 68, 158, 0, 79, 177, 68, 158, 0, 18, + 0, 18, 35, 25, 208, 0, 99, 0, 100, 0, + 97, 0, 98, 0, 96, 0, 0, 178, 0, 80, + 106, 179, 107, 0, 106, 179, 107, 0, 178, 106, + 179, 107, 0, 180, 0, 180, 109, 102, 0, 180, + 109, 102, 109, 180, 0, 181, 0, 180, 174, 181, + 0, 180, 175, 181, 0, 181, 176, 181, 0, 183, + 106, 179, 107, 0, 106, 179, 107, 0, 184, 0, + 184, 182, 184, 0, 61, 182, 184, 0, 184, 182, + 60, 0, 61, 182, 60, 0, 190, 0, 185, 0, + 101, 0, 101, 113, 0, 113, 101, 0, 113, 101, + 113, 0, 80, 0, 46, 0, 203, 0, 208, 0, + 6, 0, 45, 0, 86, 0, 95, 30, 104, 186, + 105, 0, 187, 0, 186, 109, 187, 0, 102, 0, + 208, 177, 188, 0, 0, 189, 0, 73, 0, 15, + 0, 69, 0, 191, 0, 192, 0, 104, 206, 105, + 0, 191, 104, 193, 105, 0, 194, 0, 193, 109, + 194, 0, 114, 195, 0, 114, 112, 195, 0, 208, + 0, 195, 112, 208, 0, 0, 197, 0, 69, 0, + 33, 198, 0, 184, 0, 169, 0, 0, 104, 199, + 168, 0, 104, 105, 0, 104, 201, 105, 0, 202, + 0, 201, 109, 202, 0, 208, 0, 208, 106, 203, + 107, 0, 208, 106, 167, 107, 0, 203, 0, 102, + 0, 9, 0, 10, 0, 0, 205, 0, 103, 0, + 103, 52, 0, 103, 41, 0, 11, 0, 12, 0, + 12, 0, 8, 0, 208, 0, 208, 205, 0 }; #endif #if YYDEBUG != 0 static const short yyrline[] = { 0, - 297, 303, 309, 325, 350, 352, 355, 359, 364, 371, - 379, 384, 388, 397, 399, 407, 411, 419, 423, 426, - 429, 437, 439, 448, 452, 478, 482, 491, 498, 511, - 522, 535, 542, 547, 553, 559, 568, 574, 580, 587, - 595, 599, 602, 609, 615, 621, 628, 637, 647, 655, - 663, 665, 677, 689, 696, 712, 722, 732, 742, 747, - 754, 764, 770, 776, 780, 792, 798, 804, 814, 816, - 819, 827, 833, 842, 847, 864, 866, 871, 875, 880, - 885, 891, 895, 920, 927, 932, 940, 949, 958, 969, - 973, 979, 987, 1011, 1018, 1032, 1041, 1051, 1061, 1069, - 1090, 1099, 1108, 1109, 1111, 1118, 1130, 1140, 1142, 1147, - 1151, 1155, 1159, 1162, 1167, 1179, 1195, 1206, 1220, 1222, - 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, - 1238, 1240, 1241, 1244, 1251, 1263, 1265, 1269, 1273, 1274, - 1275, 1276, 1277, 1281, 1282, 1283, 1284, 1288, 1289, 1292, - 1299, 1305, 1311, 1319, 1327, 1333, 1349, 1351, 1354, 1354, - 1355, 1355, 1356, 1358, 1371, 1374, 1379, 1385, 1389, 1396, - 1405, 1410, 1419, 1421, 1423, 1428, 1430, 1436, 1438, 1443, - 1450, 1457, 1465, 1468, 1473, 1475, 1476, 1477, 1480, 1484, - 1489, 1493, 1504, 1508, 1513, 1518, 1523, 1530, 1536, 1540, - 1545, 1551, 1563, 1565, 1568, 1572, 1575, 1580, 1584, 1592, - 1607, 1613, 1620, 1633, 1645, 1660, 1664, 1681, 1683, 1686, - 1690, 1696, 1699, 1701, 1701, 1721, 1726, 1731, 1737, 1743, - 1751, 1759, 1767, 1774, 1784, 1789, 1819, 1821, 1824, 1829, - 1833, 1839, 1844, 1850, 1857, 1864, 1869 + 296, 302, 308, 324, 349, 351, 354, 358, 363, 370, + 378, 383, 387, 396, 398, 406, 410, 418, 422, 425, + 428, 432, 452, 454, 462, 466, 498, 502, 511, 518, + 531, 538, 540, 552, 565, 572, 577, 583, 589, 598, + 604, 610, 617, 625, 629, 632, 639, 645, 651, 658, + 667, 677, 685, 693, 695, 707, 719, 726, 742, 752, + 762, 772, 777, 784, 794, 800, 806, 810, 822, 828, + 834, 844, 846, 849, 857, 863, 872, 877, 894, 896, + 901, 905, 910, 915, 921, 925, 950, 957, 962, 970, + 979, 988, 999, 1003, 1009, 1017, 1041, 1048, 1062, 1071, + 1081, 1091, 1099, 1120, 1129, 1138, 1139, 1141, 1148, 1160, + 1170, 1172, 1177, 1181, 1185, 1189, 1192, 1197, 1209, 1225, + 1236, 1250, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, + 1260, 1261, 1262, 1268, 1270, 1271, 1274, 1281, 1293, 1295, + 1299, 1303, 1304, 1305, 1306, 1307, 1311, 1312, 1313, 1314, + 1318, 1319, 1322, 1329, 1335, 1341, 1349, 1357, 1363, 1379, + 1379, 1380, 1380, 1381, 1383, 1385, 1388, 1402, 1406, 1411, + 1415, 1421, 1431, 1435, 1438, 1441, 1446, 1455, 1463, 1469, + 1476, 1484, 1492, 1501, 1504, 1509, 1511, 1512, 1513, 1516, + 1520, 1525, 1529, 1540, 1545, 1550, 1557, 1563, 1567, 1572, + 1578, 1590, 1592, 1595, 1599, 1602, 1607, 1611, 1619, 1634, + 1640, 1647, 1660, 1672, 1687, 1691, 1708, 1710, 1713, 1717, + 1723, 1726, 1728, 1728, 1748, 1753, 1758, 1764, 1770, 1778, + 1786, 1794, 1801, 1811, 1816, 1846, 1848, 1851, 1856, 1860, + 1866, 1871, 1878, 1885, 1892, 1897 }; #endif @@ -385,390 +388,384 @@ static const short yyrline[] = { 0, static const char * const yytname[] = { "$","error","$undefined.","TOK_PPEQ", "TOK_opaque","TOK_bstring","TOK_cstring","TOK_hstring","TOK_identifier","TOK_number", -"TOK_number_negative","TOK_typereference","TOK_objectclassreference","TOK_typefieldreference", +"TOK_number_negative","TOK_typereference","TOK_capitalreference","TOK_typefieldreference", "TOK_valuefieldreference","TOK_ABSENT","TOK_ABSTRACT_SYNTAX","TOK_ALL","TOK_ANY", "TOK_APPLICATION","TOK_AUTOMATIC","TOK_BEGIN","TOK_BIT","TOK_BMPString","TOK_BOOLEAN", "TOK_BY","TOK_CHARACTER","TOK_CHOICE","TOK_CLASS","TOK_COMPONENT","TOK_COMPONENTS", "TOK_CONSTRAINED","TOK_CONTAINING","TOK_DEFAULT","TOK_DEFINITIONS","TOK_DEFINED", -"TOK_EMBEDDED","TOK_ENCODED","TOK_END","TOK_ENUMERATED","TOK_EXPLICIT","TOK_EXPORTS", -"TOK_EXTENSIBILITY","TOK_EXTERNAL","TOK_FALSE","TOK_FROM","TOK_GeneralizedTime", -"TOK_GeneralString","TOK_GraphicString","TOK_IA5String","TOK_IDENTIFIER","TOK_IMPLICIT", -"TOK_IMPLIED","TOK_IMPORTS","TOK_INCLUDES","TOK_INSTANCE","TOK_INTEGER","TOK_ISO646String", -"TOK_MAX","TOK_MIN","TOK_MINUS_INFINITY","TOK_NULL","TOK_NumericString","TOK_OBJECT", -"TOK_ObjectDescriptor","TOK_OCTET","TOK_OF","TOK_OPTIONAL","TOK_PATTERN","TOK_PDV", -"TOK_PLUS_INFINITY","TOK_PRESENT","TOK_PrintableString","TOK_PRIVATE","TOK_REAL", -"TOK_RELATIVE_OID","TOK_SEQUENCE","TOK_SET","TOK_SIZE","TOK_STRING","TOK_SYNTAX", -"TOK_T61String","TOK_TAGS","TOK_TeletexString","TOK_TRUE","TOK_TYPE_IDENTIFIER", -"TOK_UNIQUE","TOK_UNIVERSAL","TOK_UniversalString","TOK_UTCTime","TOK_UTF8String", -"TOK_VideotexString","TOK_VisibleString","TOK_WITH","'|'","TOK_UNION","'^'", -"TOK_INTERSECTION","TOK_EXCEPT","TOK_TwoDots","TOK_ThreeDots","TOK_tag","'{'", -"'}'","'('","')'","';'","','","':'","'!'","'.'","'<'","'@'","ParsedGrammar", -"ModuleList","ModuleSpecification","optObjectIdentifier","ObjectIdentifier", +"TOK_EMBEDDED","TOK_ENCODED","TOK_ENCODING_CONTROL","TOK_END","TOK_ENUMERATED", +"TOK_EXPLICIT","TOK_EXPORTS","TOK_EXTENSIBILITY","TOK_EXTERNAL","TOK_FALSE", +"TOK_FROM","TOK_GeneralizedTime","TOK_GeneralString","TOK_GraphicString","TOK_IA5String", +"TOK_IDENTIFIER","TOK_IMPLICIT","TOK_IMPLIED","TOK_IMPORTS","TOK_INCLUDES","TOK_INSTANCE", +"TOK_INSTRUCTIONS","TOK_INTEGER","TOK_ISO646String","TOK_MAX","TOK_MIN","TOK_MINUS_INFINITY", +"TOK_NULL","TOK_NumericString","TOK_OBJECT","TOK_ObjectDescriptor","TOK_OCTET", +"TOK_OF","TOK_OPTIONAL","TOK_PATTERN","TOK_PDV","TOK_PLUS_INFINITY","TOK_PRESENT", +"TOK_PrintableString","TOK_PRIVATE","TOK_REAL","TOK_RELATIVE_OID","TOK_SEQUENCE", +"TOK_SET","TOK_SIZE","TOK_STRING","TOK_SYNTAX","TOK_T61String","TOK_TAGS","TOK_TeletexString", +"TOK_TRUE","TOK_TYPE_IDENTIFIER","TOK_UNIQUE","TOK_UNIVERSAL","TOK_UniversalString", +"TOK_UTCTime","TOK_UTF8String","TOK_VideotexString","TOK_VisibleString","TOK_WITH", +"TOK_EXCEPT","'^'","TOK_INTERSECTION","'|'","TOK_UNION","TOK_TwoDots","TOK_ThreeDots", +"TOK_tag","'{'","'}'","'('","')'","';'","','","':'","'!'","'.'","'<'","'@'", +"ParsedGrammar","ModuleList","ModuleSpecification","optObjectIdentifier","ObjectIdentifier", "ObjectIdentifierBody","ObjectIdentifierElement","optModuleSpecificationFlags", "ModuleSpecificationFlags","ModuleSpecificationFlag","optModuleSpecificationBody", -"ModuleSpecificationBody","ModuleSpecificationElement","ImportsDefinition","ImportsBundleSet", -"ImportsBundle","ImportsList","ImportsElement","ExportsDefinition","ExportsBody", -"ExportsElement","ValueSetDefinition","DefinedTypeRef","optValueSetBody","DataTypeReference", -"ParameterArgumentList","ParameterArgumentName","ActualParameterList","ActualParameter", -"ConstructedDataTypeDefinition","ClassDeclaration","optUnique","ClassFieldList", -"ClassField","optWithSyntax","WithSyntax","@1","WithSyntaxFormat","WithSyntaxFormatToken", -"DataTypeMember","ConstrainedTypeDeclaration","ExtensionAndException","TypeDeclaration", -"ComplexTypeReference","ComplexTypeReferenceAmpList","ComplexTypeReferenceElement", +"ModuleSpecificationBody","ModuleSpecificationElement","@1","ImportsDefinition", +"ImportsBundleSet","ImportsBundle","ImportsList","ImportsElement","ExportsDefinition", +"ExportsBody","ExportsElement","ValueSetDefinition","DefinedTypeRef","optValueSetBody", +"DataTypeReference","ParameterArgumentList","ParameterArgumentName","ActualParameterList", +"ActualParameter","ConstructedDataTypeDefinition","ClassDeclaration","optUnique", +"ClassFieldList","ClassField","optWithSyntax","WithSyntax","@2","WithSyntaxFormat", +"WithSyntaxFormatToken","DataTypeMember","ConstrainedTypeDeclaration","ExtensionAndException", +"TypeDeclaration","ComplexTypeReference","ComplexTypeReferenceAmpList","ComplexTypeReferenceElement", "ClassFieldIdentifier","ClassFieldName","ValueDefinition","InlineOrDefinedValue", -"@2","DefinedValue","Opaque","BasicTypeId","BasicTypeId_UniverationCompatible", -"BasicType","BasicString","ConstructedType","optConstraints","Union","Intersection", -"Except","Constraints","SingleConstraint","ConstraintElementSet","ConstraintElement", -"ConstraintElementUnion","ConstraintElementIntersection","ConstraintElementException", -"ConstraintSubtypeElement","ConstraintRangeSpec","ConstraintSpec","ConstraintValue", -"WithComponents","WithComponentsList","WithComponentsElement","optPresenceConstraint", -"PresenceConstraint","TableConstraint","SimpleTableConstraint","ComponentRelationConstraint", -"AtNotationList","AtNotationElement","ComponentIdList","optMarker","Marker", -"DefaultValue","@3","UniverationDefinition","UniverationList","UniverationElement", -"SignedNumber","optTag","Tag","TypeRefName","ObjectClassReference","Identifier", -"TaggedIdentifier", NULL +"@3","DefinedValue","Opaque","BasicTypeId","BasicTypeId_UniverationCompatible", +"BasicType","BasicString","ConstructedType","Union","Intersection","Except", +"optConstraints","SetOfConstraints","ElementSetSpecs","ElementSetSpec","ConstraintSubtypeElement", +"ConstraintRangeSpec","ConstraintSpec","ConstraintValue","WithComponents","WithComponentsList", +"WithComponentsElement","optPresenceConstraint","PresenceConstraint","TableConstraint", +"SimpleTableConstraint","ComponentRelationConstraint","AtNotationList","AtNotationElement", +"ComponentIdList","optMarker","Marker","DefaultValue","@4","UniverationDefinition", +"UniverationList","UniverationElement","SignedNumber","optTag","Tag","TypeRefName", +"ObjectClassReference","Identifier","TaggedIdentifier", NULL }; #endif static const short yyr1[] = { 0, - 113, 114, 114, 115, 116, 116, 117, 117, 118, 118, - 119, 119, 119, 120, 120, 121, 121, 122, 122, 122, - 122, 123, 123, 124, 124, 125, 125, 125, 125, 125, - 125, 126, 126, 127, 127, 128, 129, 129, 130, 130, - 131, 131, 131, 132, 132, 133, 133, 134, 135, 135, - 136, 136, 137, 137, 137, 137, 138, 138, 139, 139, - 139, 140, 140, 141, 141, 142, 142, 143, 144, 144, - 145, 145, 146, 146, 146, 147, 147, 149, 148, 150, - 150, 151, 151, 152, 152, 153, 154, 154, 154, 155, - 155, 155, 155, 155, 155, 156, 156, 156, 156, 156, - 157, 157, 158, 159, 160, 160, 161, 163, 162, 162, - 162, 162, 162, 162, 164, 164, 165, 165, 166, 166, - 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, - 167, 167, 167, 168, 168, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 170, - 170, 170, 170, 170, 170, 170, 171, 171, 172, 172, - 173, 173, 174, 175, 175, 175, 176, 177, 177, 177, - 177, 177, 178, 179, 179, 180, 180, 181, 181, 182, - 182, 182, 182, 182, 183, 183, 183, 183, 184, 184, - 185, 185, 185, 185, 185, 185, 185, 186, 187, 187, - 188, 188, 189, 189, 190, 190, 190, 191, 191, 192, - 193, 194, 194, 195, 195, 196, 196, 197, 197, 198, - 198, 199, 199, 200, 199, 201, 201, 202, 202, 203, - 203, 203, 203, 203, 204, 204, 205, 205, 206, 206, - 206, 207, 207, 208, 209, 210, 210 + 115, 116, 116, 117, 118, 118, 119, 119, 120, 120, + 121, 121, 121, 122, 122, 123, 123, 124, 124, 124, + 124, 124, 125, 125, 126, 126, 127, 127, 127, 127, + 127, 128, 127, 127, 129, 129, 130, 130, 131, 132, + 132, 133, 133, 134, 134, 134, 135, 135, 136, 136, + 137, 138, 138, 139, 139, 140, 140, 140, 140, 141, + 141, 142, 142, 142, 143, 143, 144, 144, 145, 145, + 146, 147, 147, 148, 148, 149, 149, 149, 150, 150, + 152, 151, 153, 153, 154, 154, 155, 155, 156, 157, + 157, 157, 158, 158, 158, 158, 158, 158, 159, 159, + 159, 159, 159, 160, 160, 161, 162, 163, 163, 164, + 166, 165, 165, 165, 165, 165, 165, 167, 167, 168, + 168, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 170, 170, 170, 171, 171, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 173, 173, 173, 173, 173, 173, 173, 174, + 174, 175, 175, 176, 177, 177, 177, 178, 178, 179, + 179, 179, 180, 180, 180, 180, 181, 181, 181, 181, + 181, 181, 181, 181, 181, 182, 182, 182, 182, 183, + 183, 184, 184, 184, 184, 184, 185, 186, 186, 187, + 187, 188, 188, 189, 189, 189, 190, 190, 191, 192, + 193, 193, 194, 194, 195, 195, 196, 196, 197, 197, + 198, 198, 199, 198, 200, 200, 201, 201, 202, 202, + 202, 202, 202, 203, 203, 204, 204, 205, 205, 205, + 206, 206, 207, 208, 209, 209 }; static const short yyr2[] = { 0, 1, 1, 2, 8, 0, 1, 3, 2, 1, 2, 1, 4, 1, 0, 1, 1, 2, 2, 2, 2, - 2, 0, 1, 1, 2, 1, 1, 1, 1, 1, - 1, 3, 2, 1, 2, 4, 1, 3, 1, 1, - 3, 3, 2, 1, 3, 1, 1, 6, 1, 1, - 0, 1, 4, 4, 3, 6, 1, 3, 1, 3, - 3, 1, 3, 1, 1, 1, 3, 5, 0, 1, - 1, 3, 2, 3, 4, 0, 1, 0, 6, 1, - 2, 1, 1, 2, 1, 3, 1, 3, 3, 1, - 1, 1, 4, 1, 3, 1, 3, 3, 1, 3, - 1, 3, 1, 1, 1, 1, 4, 0, 3, 1, - 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, - 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, - 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, - 4, 4, 4, 4, 1, 4, 0, 1, 1, 1, - 1, 1, 1, 4, 1, 2, 3, 1, 3, 5, - 1, 3, 1, 1, 3, 1, 3, 1, 3, 1, - 3, 4, 1, 1, 1, 2, 2, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 5, 1, 3, - 1, 3, 0, 1, 1, 1, 1, 1, 1, 3, - 4, 1, 3, 2, 3, 1, 3, 0, 1, 1, - 2, 1, 1, 0, 3, 2, 3, 1, 3, 1, - 4, 4, 1, 1, 1, 1, 0, 1, 1, 2, - 2, 1, 1, 1, 1, 1, 2 + 2, 2, 0, 1, 1, 2, 1, 1, 1, 1, + 1, 0, 3, 1, 3, 2, 1, 2, 4, 1, + 3, 1, 1, 3, 3, 2, 1, 3, 1, 1, + 6, 1, 1, 0, 1, 4, 4, 3, 6, 1, + 3, 1, 3, 3, 1, 3, 1, 1, 1, 3, + 5, 0, 1, 1, 3, 2, 3, 4, 0, 1, + 0, 6, 1, 2, 1, 1, 2, 1, 3, 1, + 3, 3, 1, 1, 1, 4, 1, 3, 1, 3, + 3, 1, 3, 1, 3, 1, 1, 1, 1, 4, + 0, 3, 1, 1, 1, 1, 1, 1, 3, 1, + 2, 1, 1, 1, 1, 2, 2, 1, 1, 2, + 2, 1, 1, 1, 1, 2, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 4, 4, 4, 4, 4, 1, 4, 1, + 1, 1, 1, 1, 0, 1, 4, 3, 4, 1, + 3, 5, 1, 3, 3, 3, 4, 3, 1, 3, + 3, 3, 3, 1, 1, 1, 2, 2, 3, 1, + 1, 1, 1, 1, 1, 1, 5, 1, 3, 1, + 3, 0, 1, 1, 1, 1, 1, 1, 3, 4, + 1, 3, 2, 3, 1, 3, 0, 1, 1, 2, + 1, 1, 0, 3, 2, 3, 1, 3, 1, 4, + 4, 1, 1, 1, 1, 0, 1, 1, 2, 2, + 1, 1, 1, 1, 1, 2 }; static const short yydefact[] = { 0, - 242, 243, 1, 2, 5, 3, 0, 0, 6, 245, + 241, 242, 1, 2, 5, 3, 0, 0, 6, 244, 13, 8, 0, 9, 11, 14, 7, 10, 0, 0, - 0, 0, 0, 0, 15, 16, 0, 20, 18, 21, - 19, 0, 17, 12, 22, 136, 0, 137, 138, 139, - 0, 140, 141, 149, 142, 143, 144, 145, 146, 147, - 148, 0, 23, 24, 26, 27, 30, 28, 29, 31, - 0, 0, 0, 43, 0, 44, 46, 47, 33, 0, - 34, 0, 37, 39, 40, 4, 25, 237, 96, 244, - 0, 119, 0, 0, 132, 126, 130, 131, 120, 0, - 0, 121, 125, 129, 0, 0, 49, 50, 122, 99, - 0, 42, 41, 0, 32, 35, 0, 0, 0, 239, - 55, 0, 238, 0, 133, 128, 127, 124, 123, 0, - 57, 0, 59, 0, 0, 0, 45, 5, 38, 0, - 241, 240, 96, 244, 155, 0, 0, 157, 157, 53, - 54, 157, 94, 134, 122, 90, 91, 92, 0, 97, - 98, 0, 0, 0, 0, 51, 105, 106, 100, 101, - 103, 110, 112, 111, 235, 236, 108, 107, 114, 113, - 0, 115, 36, 0, 71, 218, 104, 0, 0, 0, - 0, 0, 0, 0, 158, 165, 0, 0, 218, 0, - 135, 0, 0, 58, 61, 60, 193, 196, 190, 195, - 194, 189, 197, 0, 171, 0, 0, 52, 168, 173, - 174, 176, 178, 0, 180, 184, 183, 208, 209, 191, - 192, 0, 0, 0, 76, 0, 0, 220, 69, 218, - 73, 219, 0, 87, 0, 66, 85, 246, 0, 95, - 0, 0, 0, 0, 166, 0, 0, 86, 234, 226, - 0, 228, 233, 230, 0, 62, 64, 65, 56, 0, - 0, 0, 48, 0, 159, 160, 0, 161, 162, 0, - 163, 0, 0, 185, 0, 0, 0, 102, 117, 109, - 116, 0, 68, 77, 72, 224, 223, 222, 221, 70, - 74, 69, 156, 0, 150, 0, 247, 84, 0, 151, - 167, 153, 152, 154, 227, 0, 0, 93, 0, 0, - 172, 210, 169, 175, 177, 179, 0, 186, 187, 181, - 0, 0, 212, 118, 0, 0, 75, 88, 89, 67, - 164, 229, 0, 0, 63, 201, 0, 199, 157, 0, - 182, 188, 0, 214, 216, 211, 0, 78, 225, 232, - 231, 198, 0, 203, 170, 215, 0, 213, 0, 200, - 206, 207, 205, 202, 204, 217, 82, 0, 80, 83, - 79, 81, 0, 0, 0 + 0, 0, 0, 0, 0, 15, 16, 0, 22, 20, + 18, 21, 19, 0, 17, 12, 23, 139, 0, 0, + 140, 141, 142, 0, 143, 144, 152, 145, 146, 147, + 148, 149, 150, 151, 0, 24, 25, 27, 28, 31, + 29, 30, 34, 0, 0, 32, 0, 46, 0, 47, + 49, 50, 36, 0, 37, 0, 40, 42, 43, 4, + 26, 236, 99, 243, 0, 122, 0, 0, 135, 129, + 133, 134, 123, 0, 0, 124, 128, 132, 0, 0, + 52, 53, 125, 102, 0, 33, 45, 44, 0, 35, + 38, 0, 0, 0, 238, 58, 0, 237, 0, 136, + 131, 130, 127, 126, 0, 60, 0, 62, 0, 0, + 0, 48, 5, 41, 0, 240, 239, 99, 243, 158, + 0, 0, 165, 165, 56, 57, 165, 97, 137, 125, + 93, 94, 95, 0, 100, 101, 0, 0, 0, 0, + 54, 108, 109, 103, 104, 106, 113, 115, 114, 234, + 235, 111, 110, 117, 116, 0, 118, 39, 0, 74, + 217, 107, 0, 0, 0, 0, 0, 0, 0, 166, + 0, 0, 217, 0, 138, 0, 0, 61, 64, 63, + 194, 195, 191, 0, 190, 196, 0, 0, 0, 0, + 55, 170, 173, 0, 179, 185, 184, 207, 208, 192, + 193, 0, 0, 0, 79, 0, 0, 219, 72, 217, + 76, 218, 0, 90, 0, 69, 88, 245, 0, 98, + 0, 0, 0, 0, 0, 0, 0, 89, 233, 225, + 0, 227, 232, 229, 0, 65, 67, 68, 59, 186, + 0, 0, 0, 0, 0, 51, 162, 163, 160, 161, + 0, 0, 0, 164, 0, 0, 0, 0, 105, 120, + 112, 119, 0, 71, 80, 75, 223, 222, 221, 220, + 73, 77, 72, 159, 0, 153, 0, 246, 87, 0, + 154, 168, 156, 0, 155, 157, 226, 0, 0, 96, + 0, 187, 188, 183, 181, 0, 209, 178, 171, 174, + 175, 176, 0, 182, 180, 0, 0, 211, 121, 0, + 0, 78, 91, 92, 70, 167, 169, 228, 0, 0, + 66, 189, 200, 0, 198, 165, 0, 177, 0, 213, + 215, 210, 0, 81, 224, 231, 230, 197, 0, 202, + 172, 214, 0, 212, 0, 199, 205, 206, 204, 201, + 203, 216, 85, 0, 83, 86, 82, 84, 0, 0, + 0 }; -static const short yydefgoto[] = { 373, - 3, 4, 8, 9, 13, 14, 24, 25, 26, 52, - 53, 54, 55, 70, 71, 72, 73, 56, 65, 66, - 57, 96, 207, 58, 120, 121, 255, 256, 235, 111, - 291, 174, 175, 283, 284, 359, 368, 369, 236, 141, - 237, 142, 143, 159, 160, 176, 177, 59, 168, 223, - 169, 280, 144, 145, 146, 147, 148, 184, 267, 270, - 272, 185, 186, 208, 209, 210, 211, 212, 213, 276, - 214, 215, 216, 337, 338, 364, 365, 217, 218, 219, - 322, 323, 344, 231, 232, 289, 326, 191, 251, 252, - 220, 112, 113, 149, 100, 221, 239 +static const short yydefgoto[] = { 379, + 3, 4, 8, 9, 13, 14, 25, 26, 27, 55, + 56, 57, 106, 58, 74, 75, 76, 77, 59, 69, + 70, 60, 100, 210, 61, 125, 126, 255, 256, 235, + 116, 292, 179, 180, 284, 285, 365, 374, 375, 236, + 146, 237, 147, 148, 164, 165, 181, 182, 62, 173, + 223, 174, 281, 149, 150, 151, 152, 153, 272, 273, + 275, 189, 190, 211, 212, 213, 262, 214, 215, 216, + 344, 345, 370, 371, 217, 218, 219, 327, 328, 350, + 231, 232, 290, 331, 195, 251, 252, 220, 117, 118, + 154, 104, 221, 239 }; -static const short yypact[] = { 81, --32768,-32768, 81,-32768, -45,-32768, 23, 70,-32768,-32768, --32768,-32768, 47,-32768, 31, 190,-32768,-32768, 132, 61, - 69, 108, 86, 176, 190,-32768, 76,-32768,-32768,-32768, --32768, 166,-32768,-32768, 442,-32768, 32,-32768,-32768,-32768, - 121,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768, 168, 442,-32768,-32768,-32768,-32768,-32768,-32768,-32768, - 179, 732, 103,-32768, 52,-32768,-32768,-32768,-32768, 39, --32768, 16,-32768,-32768,-32768,-32768,-32768, -11, 111,-32768, - 150,-32768, 152, 142,-32768,-32768,-32768,-32768,-32768, 184, - 159,-32768,-32768,-32768, 748, 240,-32768,-32768,-32768, 135, - 243,-32768,-32768, 141,-32768,-32768, 81, 141, 145, 60, --32768, 599,-32768, 141,-32768,-32768,-32768,-32768,-32768, -1, --32768, 143, 144, 147, 206, 68,-32768, -45,-32768, 206, --32768,-32768, -42, 148, 221, 161, 198, 40, 53,-32768, --32768, -37,-32768,-32768, 163,-32768,-32768,-32768, 164,-32768, --32768, 264, 748, 261, 261, 155,-32768,-32768, 160,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, - 162,-32768,-32768, 64,-32768, 524,-32768, 246, 21, 212, - 169, 21, 155, 208, 171,-32768, 21, 210, 2, 17, --32768, 383, 674,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 247, 172, 81, 175,-32768, 173, 133, - 140, 185,-32768, 178, 35,-32768,-32768, 182,-32768,-32768, --32768, 206, 281, 261, 193, 206, 301,-32768, 202, 2, --32768,-32768, 261, 181, 66,-32768,-32768, 191, 674,-32768, - 155, 71, 186, 674,-32768, 89, 674,-32768,-32768,-32768, - 90,-32768,-32768, 189, 91,-32768,-32768,-32768,-32768, 192, - 309, 194,-32768, 196,-32768,-32768, 309,-32768,-32768, 309, --32768, 309, 155, 187, 205, 78, 200,-32768,-32768, 297, --32768, 225,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768, 202,-32768, 250,-32768, 21,-32768,-32768, 201,-32768, --32768,-32768,-32768,-32768,-32768, 56, 250,-32768, 383, 25, --32768,-32768, 209, 140, 185,-32768, 215,-32768, 211,-32768, - 6, 101,-32768,-32768, 219, 281,-32768,-32768,-32768,-32768, --32768,-32768, 223, 224,-32768,-32768, 109,-32768, -37, 309, --32768,-32768, 261, 203,-32768,-32768, 200,-32768, 297,-32768, --32768,-32768, 25, 24,-32768, 203, 261,-32768, 126,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768, 9,-32768,-32768, --32768,-32768, 324, 326,-32768 +static const short yypact[] = { 41, +-32768,-32768, 41,-32768, -62,-32768, 10, 54,-32768,-32768, +-32768,-32768, 20,-32768, -20, 44,-32768,-32768, 95, 78, + 72, 83, 45, 112, 187, 44,-32768, 94,-32768,-32768, +-32768,-32768,-32768, 189,-32768,-32768, 398,-32768, 223, 23, +-32768,-32768,-32768, 57,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 201, 398,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 194, 696,-32768, 140,-32768, 53,-32768, +-32768,-32768,-32768, 47,-32768, -25,-32768,-32768,-32768,-32768, +-32768, -8, 138,-32768, 173,-32768, 185, 196,-32768,-32768, +-32768,-32768,-32768, 209, 188,-32768,-32768,-32768, 713, 265, +-32768,-32768,-32768, 160, 271,-32768,-32768,-32768, 157,-32768, +-32768, 41, 157, 174, 108,-32768, 559,-32768, 157,-32768, +-32768,-32768,-32768,-32768, 90,-32768, 169, 171, 176, 137, + 71,-32768, -62,-32768, 137,-32768,-32768, 59, 178, 248, + 180, 218, 42, 60,-32768,-32768, -33,-32768,-32768, 183, +-32768,-32768,-32768, 190,-32768,-32768, 289, 713, 287, 287, + 133,-32768,-32768, 193,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768, 203,-32768,-32768, 93,-32768, + 482,-32768, 272, 9, 170, 200, 9, 133, 231, 202, + 9, 232, 30, 52,-32768, 337, 636,-32768,-32768,-32768, +-32768,-32768,-32768, -69,-32768,-32768, 283, 41, 133, 211, +-32768, 124, 221, 212, -69,-32768,-32768, 216,-32768,-32768, +-32768, 137, 317, 287, 227, 137, 267,-32768, 235, 30, +-32768,-32768, 287, 213, 98,-32768,-32768, 224, 636,-32768, + 133, 103, 219, 636, 133, 106, 636,-32768,-32768,-32768, + 120,-32768,-32768, 222, 122,-32768,-32768,-32768,-32768, 220, + 228, 84, 233, 226, 229,-32768,-32768,-32768,-32768,-32768, + 236, 133, 133,-32768, 133, 133, 128, 225,-32768,-32768, + 331,-32768, 258,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768, 235,-32768, 234,-32768, 9,-32768,-32768, 239, +-32768,-32768,-32768, 240,-32768,-32768,-32768, 14, 234,-32768, + 337,-32768, 237,-32768,-32768, 19,-32768,-32768, 242,-32768, +-32768,-32768, 247,-32768,-32768, 7, 127,-32768,-32768, 253, + 317,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 255, 259, +-32768,-32768,-32768, 142,-32768, -33, 133,-32768, 287, 256, +-32768,-32768, 225,-32768, 331,-32768,-32768,-32768, 19, 28, + 165, 256, 287,-32768, 179,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 12,-32768,-32768,-32768,-32768, 341, 365, +-32768 }; static const short yypgoto[] = {-32768, --32768, 327, 204,-32768,-32768, 318,-32768,-32768, 308,-32768, --32768, 282,-32768,-32768, 268,-32768, 226,-32768,-32768, 235, --32768, 279,-32768,-32768,-32768, 195,-32768, 33, -129,-32768, - 51,-32768, 123,-32768,-32768,-32768,-32768, -17, 59, -156, --32768, -185, -52,-32768, 130, -173, -109,-32768,-32768,-32768, - -209, 30, -50, -43,-32768, 46,-32768, -137,-32768,-32768, --32768,-32768, 180, -159, -246,-32768, 94, 88, 97,-32768, --32768, -206,-32768,-32768, 10,-32768,-32768,-32768,-32768,-32768, --32768, 26, 27, -141,-32768,-32768,-32768,-32768,-32768, 65, - -118,-32768, 134, 1,-32768, -7,-32768 +-32768, 364, 241,-32768,-32768, 356,-32768,-32768, 344,-32768, +-32768, 316,-32768,-32768,-32768, 301,-32768, 263,-32768,-32768, + 269,-32768, 314,-32768,-32768,-32768, 230,-32768, 69, 62, +-32768, 96,-32768, 156,-32768,-32768,-32768,-32768, 16, 86, + -131,-32768, -193, -55,-32768, 172, -174, -94,-32768,-32768, +-32768, -162, 61, -53, -51,-32768, 89,-32768,-32768,-32768, +-32768, -142,-32768, -118, 50, -17, 184,-32768, -188,-32768, +-32768, 32,-32768,-32768,-32768,-32768,-32768,-32768, 55, 49, + -121,-32768,-32768,-32768,-32768,-32768, 97, -123,-32768, 181, + 1,-32768, -7,-32768 }; -#define YYLAST 837 +#define YYLAST 804 static const short yytable[] = { 15, - 5, 188, 230, 5, 189, 15, 257, 170, 97, 97, - 98, 98, 367, 10, 311, 161, 109, 99, 99, 229, - 288, 157, 158, 243, 10, 165, 166, 62, 10, 68, - 10, 11, 10, 75, 227, 61, 259, 67, 361, 10, - 181, 74, 1, 2, 122, 62, 10, 248, 63, 1, - 2, 99, 242, 61, 10, 11, 7, 246, 302, -242, - 107, 304, 75, 10, 165, 166, 183, 114, 228, 320, - 74, 253, 162, 163, 164, 10, 165, 166, 1, 2, - 60, 299, 298, 197, 328, 10, 165, 166, 292, 110, - 362, 1, 2, 355, 363, 123, 68, 333, 60, 131, - 75, 152, 122, 16, 67, 153, 151, 128, 74, 99, - 132, 371, 161, 317, 150, 343, 249, 181, 172, 250, - 234, 198, 108, 257, 336, 12, 171, 240, 10, 367, - 181, 1, 2, 274, 19, 200, 201, 64, 157, 158, - 27, 182, 28, 183, 105, 275, 195, 196, 10, 17, - 29, 1, 2, 123, 187, 249, 183, 103, 104, 30, - 197, 203, 10, 165, 166, 69, 225, 31, 295, 167, - 226, 238, 296, 300, 238, 329, 287, 296, 32, 238, - 34, 78, 254, 99, 258, 370, 35, 253, 334, 79, - 80, 303, 305, 308, 370, 296, 306, 309, 198, 199, - 81, 354, 82, 346, 83, 76, 262, 347, 102, 20, - 117, 352, 200, 201, 84, 353, 281, 85, 157, 158, - 114, 86, 79, 80, 87, 293, 265, 266, 115, 21, - 116, 22, 202, 118, 88, 268, 269, 119, 203, 89, - 23, 90, 124, 91, 125, 126, 130, 204, 156, -243, - 154, 155, 92, 93, 205, 178, 206, 10, 165, 166, - 1, 2, 179, 180, 190, 192, 193, 94, 10, 222, - 233, 224, 241, 244, 183, 247, 260, 263, 261, 264, - 95, 273, 271, 277, 279, 282, 172, 290, 238, 294, - 301, 110, 307, 310, 171, 313, 312, 318, 254, 172, - 324, 258, 339, 319, 325, 331, 197, 171, 10, 165, - 166, 321, 357, 345, 197, 340, 10, 165, 166, 341, - 348, 342, 81, 374, 82, 375, 83, 350, 351, 6, - 18, 173, 33, 129, 77, 345, 84, 106, 127, 85, - 101, 335, 327, 86, 198, 339, 87, 194, 285, 366, - 372, 278, 198, 199, 330, 349, 88, 315, 200, 201, - 314, 89, 360, 90, 245, 91, 200, 201, 316, 356, - 332, 297, 358, 0, 92, 93, 0, 0, 0, 0, - 0, 0, 0, 0, 203, 0, 202, 0, 0, 94, - 10, 0, 203, 133, 134, 0, 0, 0, 0, 0, - 135, 204, 286, 0, 81, 36, 82, 0, 83, 136, - 206, 0, 0, 0, 0, 0, 0, 0, 84, 0, - 0, 85, 0, 0, 0, 86, 0, 0, 87, 38, - 39, 40, 0, 0, 0, 0, 0, 137, 88, 42, - 0, 0, 0, 89, 43, 90, 44, 91, 0, 10, - 0, 0, 1, 2, 45, 0, 92, 93, 138, 139, - 0, 0, 0, 46, 36, 47, 0, 0, 0, 0, - 48, 94, 49, 50, 51, 0, 0, 0, 0, 0, - 0, 0, 37, 0, 0, 0, 0, 0, 38, 39, - 40, 0, 0, 0, 41, 0, 0, 0, 42, 0, - 0, 0, 0, 43, 0, 44, 0, 0, 0, 0, - 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, - 0, 0, 46, 0, 47, 0, 0, 0, 0, 48, - 0, 49, 50, 51, 133, 134, 157, 158, 0, 0, - 0, 135, 0, 0, 0, 81, 36, 82, 0, 83, - 136, 0, 0, 0, 0, 0, 227, 0, 0, 84, - 0, 0, 85, 0, 0, 0, 86, 0, 0, 87, - 38, 39, 40, 0, 0, 0, 0, 0, 137, 88, - 42, 0, 0, 0, 89, 43, 90, 44, 91, 0, - 228, 0, 0, 0, 0, 45, 0, 92, 93, 138, - 139, 0, 0, 0, 46, 0, 47, 0, 0, 133, - 134, 48, 94, 49, 50, 51, 135, 0, 0, 0, - 81, 36, 82, 0, 83, 136, 0, 0, 0, 0, - 0, 0, 0, 0, 84, 0, 0, 85, 0, 0, - 0, 86, 0, 0, 87, 38, 39, 40, 0, 0, - 0, 0, 0, 137, 88, 42, 0, 0, 0, 89, - 43, 90, 44, 91, 0, 0, 0, 0, 0, 0, - 45, 0, 92, 93, 138, 139, 0, 0, 0, 46, - 0, 47, 0, 140, 133, 134, 48, 94, 49, 50, - 51, 135, 0, 0, 0, 81, 36, 82, 0, 83, - 136, 0, 0, 0, 0, 0, 0, 0, 0, 84, - 0, 0, 85, 0, 0, 0, 86, 0, 0, 87, - 38, 39, 40, 0, 0, 0, 0, 0, 137, 88, - 42, 0, 0, 0, 89, 43, 90, 44, 91, 0, - 0, 0, 79, 80, 0, 45, 0, 92, 93, 138, - 139, 0, 0, 81, 46, 82, 47, 83, 1, 2, - 0, 48, 94, 49, 50, 51, 0, 84, 0, 81, - 85, 82, 0, 83, 86, 0, 0, 87, 0, 0, - 0, 0, 0, 84, 0, 0, 85, 88, 0, 0, - 86, 0, 89, 87, 90, 0, 91, 0, 0, 0, - 0, 0, 0, 88, 0, 92, 93, 0, 89, 0, - 90, 0, 91, 0, 0, 0, 0, 0, 0, 0, - 94, 92, 93, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 94 + 5, 192, 257, 5, 193, 15, 230, 175, 101, 101, + 102, 102, 103, 103, 10, 373, 10, 10, 11, 114, + 112, 10, 170, 171, 162, 163, 10, 10, 11, 65, + 10, 260, 72, 1, 2, 166, 79, 64, 289, 67, + 71, 7, 367, 261, 78, 127, 186, 103, 65, 229, + 303, 1, 2, 306, 10, 20, 64, 1, 2, 10, + 170, 171, 227, 21, 10, 259, 79, 1, 2, 243, + 253, 248, 188, 315, 78, 167, 168, 169, 10, 170, + 171, 1, 2, 113, 22, 19, 23, 16, 325, 201, + 265, 10, 170, 171, 115, 24, 368, 32, 228, 128, + 369, 72, 73, 28, 127, 79, 103, 299, 293, 71, + 234, 156, 133, 78, 12, 249, 377, 257, 349, 155, + 343, 186, 300, 177, 17, 63, 304, 166, 202, 240, + 68, 176, 333, 201, 29, 10, 170, 171, 201, 186, + 10, 170, 171, 314, 63, 187, 339, 188, 136, 162, + 163, 199, 200, 249, 110, 30, 250, 323, 128, 137, + 108, 109, -241, 191, 10, 188, 31, 1, 2, 206, + 119, 334, 202, 288, 172, 103, 238, 202, 203, 238, + 83, 84, 373, 238, 253, 340, 254, 324, 258, 34, + 376, 162, 163, 204, 157, 33, 82, 225, 158, 376, + 36, 226, 296, 360, 83, 84, 297, 301, 264, 37, + 305, 297, 205, 206, 297, 85, 282, 86, 206, 87, + 267, 268, 269, 270, 307, 294, 310, 207, 308, 88, + 311, 352, 271, 89, 66, 353, 208, 90, 209, 80, + 91, 10, 170, 171, 1, 2, 358, 107, 242, 119, + 359, 92, 246, 120, 320, 321, 93, 322, 94, 123, + 95, 267, 268, 269, 270, 121, 122, 129, 124, 96, + 97, 130, 201, 131, 10, 170, 171, 135, 159, 161, + 160, -242, 183, 184, 98, 185, 194, 177, 85, 238, + 86, 197, 87, 196, 10, 176, 233, 99, 244, 247, + 254, 177, 88, 258, 222, 241, 89, 245, 346, 176, + 90, 202, 263, 91, 224, 266, 274, 276, 351, 278, + 280, 283, 291, 295, 92, 302, 115, 309, 313, 93, + 317, 94, 312, 95, 329, 318, 316, 319, 326, 330, + 380, 351, 96, 97, 10, 336, 337, 138, 139, 342, + 347, 346, 206, 348, 140, 372, 354, 98, 85, 38, + 86, 356, 87, 141, 381, 357, 6, 363, 18, 35, + 287, 81, 88, 178, 111, 134, 89, 132, 105, 341, + 90, 286, 335, 91, 41, 42, 43, 198, 332, 378, + 366, 355, 142, 279, 92, 45, 361, 362, 277, 93, + 46, 94, 47, 95, 338, 10, 0, 364, 1, 2, + 48, 0, 96, 97, 143, 144, 0, 0, 298, 49, + 38, 50, 0, 0, 0, 0, 51, 98, 52, 53, + 54, 0, 0, 0, 0, 39, 0, 0, 0, 40, + 0, 0, 0, 0, 0, 41, 42, 43, 0, 0, + 0, 44, 0, 0, 0, 0, 45, 0, 0, 0, + 0, 46, 0, 47, 0, 0, 0, 0, 0, 0, + 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, + 49, 0, 50, 0, 0, 0, 0, 51, 0, 52, + 53, 54, 138, 139, 162, 163, 0, 0, 0, 140, + 0, 0, 0, 85, 38, 86, 0, 87, 141, 0, + 0, 0, 0, 0, 227, 0, 0, 88, 0, 0, + 0, 89, 0, 0, 0, 90, 0, 0, 91, 41, + 42, 43, 0, 0, 0, 0, 0, 142, 0, 92, + 45, 0, 0, 0, 93, 46, 94, 47, 95, 0, + 228, 0, 0, 0, 0, 48, 0, 96, 97, 143, + 144, 0, 0, 0, 49, 0, 50, 0, 0, 138, + 139, 51, 98, 52, 53, 54, 140, 0, 0, 0, + 85, 38, 86, 0, 87, 141, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 0, 0, 0, 89, 0, + 0, 0, 90, 0, 0, 91, 41, 42, 43, 0, + 0, 0, 0, 0, 142, 0, 92, 45, 0, 0, + 0, 93, 46, 94, 47, 95, 0, 0, 0, 0, + 0, 0, 48, 0, 96, 97, 143, 144, 0, 0, + 0, 49, 0, 50, 0, 145, 138, 139, 51, 98, + 52, 53, 54, 140, 0, 0, 0, 85, 38, 86, + 0, 87, 141, 0, 0, 0, 0, 0, 0, 0, + 0, 88, 0, 0, 0, 89, 0, 0, 0, 90, + 0, 0, 91, 41, 42, 43, 0, 0, 0, 0, + 0, 142, 0, 92, 45, 0, 0, 0, 93, 46, + 94, 47, 95, 0, 0, 0, 83, 84, 0, 48, + 0, 96, 97, 143, 144, 0, 0, 85, 49, 86, + 50, 87, 0, 1, 2, 51, 98, 52, 53, 54, + 0, 88, 0, 0, 85, 89, 86, 0, 87, 90, + 0, 0, 91, 0, 0, 0, 0, 0, 88, 0, + 0, 0, 89, 92, 0, 0, 90, 0, 93, 91, + 94, 0, 95, 0, 0, 0, 0, 0, 0, 0, + 92, 96, 97, 0, 0, 93, 0, 94, 0, 95, + 0, 0, 0, 0, 0, 0, 98, 0, 96, 97, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 98 }; static const short yycheck[] = { 7, - 0, 139, 176, 3, 142, 13, 192, 126, 61, 62, - 61, 62, 4, 8, 261, 125, 28, 61, 62, 176, - 227, 13, 14, 183, 8, 9, 10, 35, 8, 37, - 8, 9, 8, 41, 33, 35, 193, 37, 15, 8, - 78, 41, 11, 12, 95, 53, 8, 189, 17, 11, - 12, 95, 182, 53, 8, 9, 102, 187, 244, 102, - 45, 247, 70, 8, 9, 10, 104, 110, 67, 276, - 70, 190, 5, 6, 7, 8, 9, 10, 11, 12, - 35, 241, 239, 6, 294, 8, 9, 10, 230, 101, - 67, 11, 12, 340, 71, 95, 104, 307, 53, 40, - 108, 103, 153, 34, 104, 107, 114, 107, 108, 153, - 51, 103, 222, 273, 114, 110, 100, 78, 126, 103, - 100, 44, 107, 309, 100, 103, 126, 180, 8, 4, - 78, 11, 12, 99, 104, 58, 59, 106, 13, 14, - 9, 102, 82, 104, 106, 111, 154, 155, 8, 103, - 82, 11, 12, 153, 102, 100, 104, 106, 107, 52, - 6, 84, 8, 9, 10, 45, 103, 82, 103, 102, - 107, 179, 107, 103, 182, 294, 227, 107, 3, 187, - 105, 3, 190, 227, 192, 359, 21, 306, 307, 11, - 12, 103, 103, 103, 368, 107, 107, 107, 44, 45, - 22, 339, 24, 103, 26, 38, 206, 107, 106, 20, - 69, 103, 58, 59, 36, 107, 224, 39, 13, 14, - 110, 43, 11, 12, 46, 233, 94, 95, 79, 40, - 79, 42, 78, 50, 56, 96, 97, 79, 84, 61, - 51, 63, 3, 65, 110, 3, 102, 93, 102, 102, - 108, 108, 74, 75, 100, 35, 102, 8, 9, 10, - 11, 12, 102, 66, 102, 102, 3, 89, 8, 110, - 25, 110, 104, 66, 104, 66, 30, 103, 107, 107, - 102, 104, 98, 102, 4, 93, 294, 86, 296, 109, - 105, 101, 104, 102, 294, 100, 103, 111, 306, 307, - 4, 309, 310, 99, 80, 105, 6, 307, 8, 9, - 10, 112, 110, 321, 6, 107, 8, 9, 10, 105, - 102, 111, 22, 0, 24, 0, 26, 105, 105, 3, - 13, 128, 25, 108, 53, 343, 36, 70, 104, 39, - 62, 309, 292, 43, 44, 353, 46, 153, 226, 357, - 368, 222, 44, 45, 296, 326, 56, 270, 58, 59, - 267, 61, 353, 63, 185, 65, 58, 59, 272, 343, - 306, 238, 347, -1, 74, 75, -1, -1, -1, -1, - -1, -1, -1, -1, 84, -1, 78, -1, -1, 89, - 8, -1, 84, 11, 12, -1, -1, -1, -1, -1, - 18, 93, 102, -1, 22, 23, 24, -1, 26, 27, - 102, -1, -1, -1, -1, -1, -1, -1, 36, -1, - -1, 39, -1, -1, -1, 43, -1, -1, 46, 47, - 48, 49, -1, -1, -1, -1, -1, 55, 56, 57, - -1, -1, -1, 61, 62, 63, 64, 65, -1, 8, - -1, -1, 11, 12, 72, -1, 74, 75, 76, 77, - -1, -1, -1, 81, 23, 83, -1, -1, -1, -1, - 88, 89, 90, 91, 92, -1, -1, -1, -1, -1, - -1, -1, 41, -1, -1, -1, -1, -1, 47, 48, - 49, -1, -1, -1, 53, -1, -1, -1, 57, -1, - -1, -1, -1, 62, -1, 64, -1, -1, -1, -1, - -1, -1, -1, 72, -1, -1, -1, -1, -1, -1, - -1, -1, 81, -1, 83, -1, -1, -1, -1, 88, - -1, 90, 91, 92, 11, 12, 13, 14, -1, -1, - -1, 18, -1, -1, -1, 22, 23, 24, -1, 26, - 27, -1, -1, -1, -1, -1, 33, -1, -1, 36, - -1, -1, 39, -1, -1, -1, 43, -1, -1, 46, - 47, 48, 49, -1, -1, -1, -1, -1, 55, 56, - 57, -1, -1, -1, 61, 62, 63, 64, 65, -1, - 67, -1, -1, -1, -1, 72, -1, 74, 75, 76, - 77, -1, -1, -1, 81, -1, 83, -1, -1, 11, - 12, 88, 89, 90, 91, 92, 18, -1, -1, -1, + 0, 144, 196, 3, 147, 13, 181, 131, 64, 65, + 64, 65, 64, 65, 8, 4, 8, 8, 9, 28, + 46, 8, 9, 10, 13, 14, 8, 8, 9, 37, + 8, 101, 40, 11, 12, 130, 44, 37, 227, 17, + 40, 104, 15, 113, 44, 99, 80, 99, 56, 181, + 244, 11, 12, 247, 8, 12, 56, 11, 12, 8, + 9, 10, 33, 20, 8, 197, 74, 11, 12, 188, + 194, 193, 106, 262, 74, 5, 6, 7, 8, 9, + 10, 11, 12, 109, 41, 106, 43, 34, 277, 6, + 209, 8, 9, 10, 103, 52, 69, 53, 69, 99, + 73, 109, 46, 9, 158, 113, 158, 239, 230, 109, + 102, 119, 112, 113, 105, 102, 105, 311, 112, 119, + 102, 80, 241, 131, 105, 37, 245, 222, 45, 185, + 108, 131, 295, 6, 57, 8, 9, 10, 6, 80, + 8, 9, 10, 60, 56, 104, 309, 106, 41, 13, + 14, 159, 160, 102, 108, 84, 105, 276, 158, 52, + 108, 109, 104, 104, 8, 106, 84, 11, 12, 86, + 112, 295, 45, 227, 104, 227, 184, 45, 46, 187, + 11, 12, 4, 191, 308, 309, 194, 60, 196, 3, + 365, 13, 14, 61, 105, 84, 3, 105, 109, 374, + 107, 109, 105, 346, 11, 12, 109, 105, 208, 21, + 105, 109, 80, 86, 109, 22, 224, 24, 86, 26, + 97, 98, 99, 100, 105, 233, 105, 95, 109, 36, + 109, 105, 109, 40, 12, 109, 104, 44, 106, 39, + 47, 8, 9, 10, 11, 12, 105, 108, 187, 112, + 109, 58, 191, 81, 272, 273, 63, 275, 65, 51, + 67, 97, 98, 99, 100, 81, 71, 3, 81, 76, + 77, 112, 6, 3, 8, 9, 10, 104, 110, 104, + 110, 104, 35, 104, 91, 68, 104, 295, 22, 297, + 24, 3, 26, 104, 8, 295, 25, 104, 68, 68, + 308, 309, 36, 311, 112, 106, 40, 106, 316, 309, + 44, 45, 30, 47, 112, 105, 96, 106, 326, 104, + 4, 95, 88, 111, 58, 107, 103, 106, 101, 63, + 105, 65, 113, 67, 4, 107, 104, 102, 114, 82, + 0, 349, 76, 77, 8, 107, 107, 11, 12, 113, + 109, 359, 86, 107, 18, 363, 104, 91, 22, 23, + 24, 107, 26, 27, 0, 107, 3, 112, 13, 26, + 104, 56, 36, 133, 74, 113, 40, 109, 65, 311, + 44, 226, 297, 47, 48, 49, 50, 158, 293, 374, + 359, 331, 56, 222, 58, 59, 347, 349, 215, 63, + 64, 65, 66, 67, 308, 8, -1, 353, 11, 12, + 74, -1, 76, 77, 78, 79, -1, -1, 238, 83, + 23, 85, -1, -1, -1, -1, 90, 91, 92, 93, + 94, -1, -1, -1, -1, 38, -1, -1, -1, 42, + -1, -1, -1, -1, -1, 48, 49, 50, -1, -1, + -1, 54, -1, -1, -1, -1, 59, -1, -1, -1, + -1, 64, -1, 66, -1, -1, -1, -1, -1, -1, + -1, 74, -1, -1, -1, -1, -1, -1, -1, -1, + 83, -1, 85, -1, -1, -1, -1, 90, -1, 92, + 93, 94, 11, 12, 13, 14, -1, -1, -1, 18, + -1, -1, -1, 22, 23, 24, -1, 26, 27, -1, + -1, -1, -1, -1, 33, -1, -1, 36, -1, -1, + -1, 40, -1, -1, -1, 44, -1, -1, 47, 48, + 49, 50, -1, -1, -1, -1, -1, 56, -1, 58, + 59, -1, -1, -1, 63, 64, 65, 66, 67, -1, + 69, -1, -1, -1, -1, 74, -1, 76, 77, 78, + 79, -1, -1, -1, 83, -1, 85, -1, -1, 11, + 12, 90, 91, 92, 93, 94, 18, -1, -1, -1, 22, 23, 24, -1, 26, 27, -1, -1, -1, -1, - -1, -1, -1, -1, 36, -1, -1, 39, -1, -1, - -1, 43, -1, -1, 46, 47, 48, 49, -1, -1, - -1, -1, -1, 55, 56, 57, -1, -1, -1, 61, - 62, 63, 64, 65, -1, -1, -1, -1, -1, -1, - 72, -1, 74, 75, 76, 77, -1, -1, -1, 81, - -1, 83, -1, 85, 11, 12, 88, 89, 90, 91, - 92, 18, -1, -1, -1, 22, 23, 24, -1, 26, - 27, -1, -1, -1, -1, -1, -1, -1, -1, 36, - -1, -1, 39, -1, -1, -1, 43, -1, -1, 46, - 47, 48, 49, -1, -1, -1, -1, -1, 55, 56, - 57, -1, -1, -1, 61, 62, 63, 64, 65, -1, - -1, -1, 11, 12, -1, 72, -1, 74, 75, 76, - 77, -1, -1, 22, 81, 24, 83, 26, 11, 12, - -1, 88, 89, 90, 91, 92, -1, 36, -1, 22, - 39, 24, -1, 26, 43, -1, -1, 46, -1, -1, - -1, -1, -1, 36, -1, -1, 39, 56, -1, -1, - 43, -1, 61, 46, 63, -1, 65, -1, -1, -1, - -1, -1, -1, 56, -1, 74, 75, -1, 61, -1, - 63, -1, 65, -1, -1, -1, -1, -1, -1, -1, - 89, 74, 75, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 89 + -1, -1, -1, -1, 36, -1, -1, -1, 40, -1, + -1, -1, 44, -1, -1, 47, 48, 49, 50, -1, + -1, -1, -1, -1, 56, -1, 58, 59, -1, -1, + -1, 63, 64, 65, 66, 67, -1, -1, -1, -1, + -1, -1, 74, -1, 76, 77, 78, 79, -1, -1, + -1, 83, -1, 85, -1, 87, 11, 12, 90, 91, + 92, 93, 94, 18, -1, -1, -1, 22, 23, 24, + -1, 26, 27, -1, -1, -1, -1, -1, -1, -1, + -1, 36, -1, -1, -1, 40, -1, -1, -1, 44, + -1, -1, 47, 48, 49, 50, -1, -1, -1, -1, + -1, 56, -1, 58, 59, -1, -1, -1, 63, 64, + 65, 66, 67, -1, -1, -1, 11, 12, -1, 74, + -1, 76, 77, 78, 79, -1, -1, 22, 83, 24, + 85, 26, -1, 11, 12, 90, 91, 92, 93, 94, + -1, 36, -1, -1, 22, 40, 24, -1, 26, 44, + -1, -1, 47, -1, -1, -1, -1, -1, 36, -1, + -1, -1, 40, 58, -1, -1, 44, -1, 63, 47, + 65, -1, 67, -1, -1, -1, -1, -1, -1, -1, + 58, 76, 77, -1, -1, 63, -1, 65, -1, 67, + -1, -1, -1, -1, -1, -1, 91, -1, 76, 77, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 91 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/share/bison.simple" @@ -1314,13 +1311,13 @@ yyparse(YYPARSE_PARAM_ARG) switch (yyn) { case 1: -#line 298 "asn1p_y.y" +#line 297 "asn1p_y.y" { *(void **)param = yyvsp[0].a_grammar; ; break;} case 2: -#line 304 "asn1p_y.y" +#line 303 "asn1p_y.y" { yyval.a_grammar = asn1p_new(); checkmem(yyval.a_grammar); @@ -1328,14 +1325,14 @@ case 2: ; break;} case 3: -#line 309 "asn1p_y.y" +#line 308 "asn1p_y.y" { yyval.a_grammar = yyvsp[-1].a_grammar; TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); ; break;} case 4: -#line 330 "asn1p_y.y" +#line 329 "asn1p_y.y" { if(yyvsp[-1].a_module) { @@ -1352,27 +1349,27 @@ case 4: ; break;} case 5: -#line 351 "asn1p_y.y" +#line 350 "asn1p_y.y" { yyval.a_oid = 0; ; break;} case 6: -#line 352 "asn1p_y.y" +#line 351 "asn1p_y.y" { yyval.a_oid = yyvsp[0].a_oid; ; break;} case 7: -#line 356 "asn1p_y.y" +#line 355 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; ; break;} case 8: -#line 359 "asn1p_y.y" +#line 358 "asn1p_y.y" { yyval.a_oid = 0; ; break;} case 9: -#line 365 "asn1p_y.y" +#line 364 "asn1p_y.y" { yyval.a_oid = asn1p_oid_new(); asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1381,7 +1378,7 @@ case 9: ; break;} case 10: -#line 371 "asn1p_y.y" +#line 370 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1390,94 +1387,117 @@ case 10: ; break;} case 11: -#line 380 "asn1p_y.y" +#line 379 "asn1p_y.y" { /* iso */ yyval.a_oid_arc.name = yyvsp[0].tv_str; yyval.a_oid_arc.number = -1; ; break;} case 12: -#line 384 "asn1p_y.y" +#line 383 "asn1p_y.y" { /* iso(1) */ yyval.a_oid_arc.name = yyvsp[-3].tv_str; yyval.a_oid_arc.number = yyvsp[-1].a_int; ; break;} case 13: -#line 388 "asn1p_y.y" +#line 387 "asn1p_y.y" { /* 1 */ yyval.a_oid_arc.name = 0; yyval.a_oid_arc.number = yyvsp[0].a_int; ; break;} case 14: -#line 398 "asn1p_y.y" +#line 397 "asn1p_y.y" { yyval.a_module_flags = MSF_NOFLAGS; ; break;} case 15: -#line 399 "asn1p_y.y" +#line 398 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; ; break;} case 16: -#line 408 "asn1p_y.y" +#line 407 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; ; break;} case 17: -#line 411 "asn1p_y.y" +#line 410 "asn1p_y.y" { yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags; ; break;} case 18: -#line 420 "asn1p_y.y" +#line 419 "asn1p_y.y" { yyval.a_module_flags = MSF_EXPLICIT_TAGS; ; break;} case 19: -#line 423 "asn1p_y.y" +#line 422 "asn1p_y.y" { yyval.a_module_flags = MSF_IMPLICIT_TAGS; ; break;} case 20: -#line 426 "asn1p_y.y" +#line 425 "asn1p_y.y" { yyval.a_module_flags = MSF_AUTOMATIC_TAGS; ; break;} case 21: -#line 429 "asn1p_y.y" +#line 428 "asn1p_y.y" { yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED; ; break;} case 22: -#line 438 "asn1p_y.y" -{ yyval.a_module = 0; ; +#line 432 "asn1p_y.y" +{ + /* X.680Amd1 specifies TAG and XER */ + if(strcmp(yyvsp[-1].tv_str, "TAG") == 0) { + yyval.a_module_flags = MSF_TAG_INSTRUCTIONS; + } else if(strcmp(yyvsp[-1].tv_str, "XER") == 0) { + yyval.a_module_flags = MSF_XER_INSTRUCTIONS; + } else { + fprintf(stderr, + "WARNING: %s INSTRUCTIONS at line %d: " + "Unrecognized encoding reference\n", + yyvsp[-1].tv_str, yylineno); + yyval.a_module_flags = MSF_unk_INSTRUCTIONS; + } + free(yyvsp[-1].tv_str); + ; break;} case 23: -#line 439 "asn1p_y.y" +#line 453 "asn1p_y.y" +{ yyval.a_module = 0; ; + break;} +case 24: +#line 454 "asn1p_y.y" { - assert(yyvsp[0].a_module); yyval.a_module = yyvsp[0].a_module; ; break;} -case 24: -#line 449 "asn1p_y.y" +case 25: +#line 463 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} -case 25: -#line 452 "asn1p_y.y" +case 26: +#line 466 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; + /* Behave well when one of them is skipped. */ + if(!(yyvsp[-1].a_module)) { + if(yyvsp[0].a_module) yyval.a_module = yyvsp[0].a_module; + break; + } + #ifdef MY_IMPORT #error MY_IMPORT DEFINED ELSEWHERE! #endif @@ -1497,14 +1517,14 @@ case 25: ; break;} -case 26: -#line 479 "asn1p_y.y" +case 27: +#line 499 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} -case 27: -#line 482 "asn1p_y.y" +case 28: +#line 502 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1515,8 +1535,8 @@ case 27: } ; break;} -case 28: -#line 491 "asn1p_y.y" +case 29: +#line 511 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1525,8 +1545,8 @@ case 28: TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); ; break;} -case 29: -#line 498 "asn1p_y.y" +case 30: +#line 518 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1535,8 +1555,8 @@ case 29: TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); ; break;} -case 30: -#line 511 "asn1p_y.y" +case 31: +#line 531 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1545,8 +1565,23 @@ case 30: TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); ; break;} -case 31: -#line 522 "asn1p_y.y" +case 32: +#line 539 "asn1p_y.y" +{ asn1p_lexer_hack_push_encoding_control(); ; + break;} +case 33: +#line 540 "asn1p_y.y" +{ + fprintf(stderr, + "WARNING: ENCODING-CONTROL %s " + "specification at line %d ignored\n", + yyvsp[-1].tv_str, yylineno); + free(yyvsp[-1].tv_str); + yyval.a_module = 0; + ; + break;} +case 34: +#line 552 "asn1p_y.y" { return yyerror( "Attempt to redefine a standard basic type, " @@ -1554,35 +1589,35 @@ case 31: "to older version of ASN.1 standard"); ; break;} -case 32: -#line 536 "asn1p_y.y" +case 35: +#line 566 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; ; break;} -case 33: -#line 542 "asn1p_y.y" +case 36: +#line 572 "asn1p_y.y" { return yyerror("Empty IMPORTS list"); ; break;} -case 34: -#line 548 "asn1p_y.y" +case 37: +#line 578 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); ; break;} -case 35: -#line 553 "asn1p_y.y" +case 38: +#line 583 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); ; break;} -case 36: -#line 560 "asn1p_y.y" +case 39: +#line 590 "asn1p_y.y" { yyval.a_xports = yyvsp[-3].a_xports; yyval.a_xports->from = yyvsp[-1].tv_str; @@ -1590,23 +1625,23 @@ case 36: checkmem(yyval.a_xports); ; break;} -case 37: -#line 569 "asn1p_y.y" +case 40: +#line 599 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} -case 38: -#line 574 "asn1p_y.y" +case 41: +#line 604 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} -case 39: -#line 581 "asn1p_y.y" +case 42: +#line 611 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1614,8 +1649,8 @@ case 39: yyval.a_expr->expr_type = A1TC_REFERENCE; ; break;} -case 40: -#line 587 "asn1p_y.y" +case 43: +#line 617 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1623,43 +1658,43 @@ case 40: yyval.a_expr->expr_type = A1TC_REFERENCE; ; break;} -case 41: -#line 596 "asn1p_y.y" +case 44: +#line 626 "asn1p_y.y" { yyval.a_xports = yyvsp[-1].a_xports; ; break;} -case 42: -#line 599 "asn1p_y.y" +case 45: +#line 629 "asn1p_y.y" { yyval.a_xports = 0; ; break;} -case 43: -#line 602 "asn1p_y.y" +case 46: +#line 632 "asn1p_y.y" { /* Empty EXPORTS clause effectively prohibits export. */ yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); ; break;} -case 44: -#line 610 "asn1p_y.y" +case 47: +#line 640 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); assert(yyval.a_xports); TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} -case 45: -#line 615 "asn1p_y.y" +case 48: +#line 645 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} -case 46: -#line 622 "asn1p_y.y" +case 49: +#line 652 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1667,8 +1702,8 @@ case 46: yyval.a_expr->expr_type = A1TC_EXPORTVAR; ; break;} -case 47: -#line 628 "asn1p_y.y" +case 50: +#line 658 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1676,8 +1711,8 @@ case 47: yyval.a_expr->expr_type = A1TC_EXPORTVAR; ; break;} -case 48: -#line 638 "asn1p_y.y" +case 51: +#line 668 "asn1p_y.y" { yyval.a_expr = yyvsp[-4].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1686,8 +1721,8 @@ case 48: // take care of optValueSetBody ; break;} -case 49: -#line 648 "asn1p_y.y" +case 52: +#line 678 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1696,8 +1731,8 @@ case 49: yyval.a_expr->meta_type = AMT_TYPEREF; ; break;} -case 50: -#line 655 "asn1p_y.y" +case 53: +#line 685 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1705,17 +1740,17 @@ case 50: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 51: -#line 664 "asn1p_y.y" +case 54: +#line 694 "asn1p_y.y" { ; break;} -case 52: -#line 665 "asn1p_y.y" +case 55: +#line 695 "asn1p_y.y" { ; break;} -case 53: -#line 681 "asn1p_y.y" +case 56: +#line 711 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1725,8 +1760,8 @@ case 53: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 54: -#line 689 "asn1p_y.y" +case 57: +#line 719 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-3].tv_str; @@ -1735,8 +1770,8 @@ case 54: assert(yyval.a_expr->meta_type); ; break;} -case 55: -#line 696 "asn1p_y.y" +case 58: +#line 726 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -1744,8 +1779,8 @@ case 55: assert(yyval.a_expr->meta_type == AMT_OBJECT); ; break;} -case 56: -#line 713 "asn1p_y.y" +case 59: +#line 743 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1754,8 +1789,8 @@ case 56: yyval.a_expr->meta_type = AMT_PARAMTYPE; ; break;} -case 57: -#line 723 "asn1p_y.y" +case 60: +#line 753 "asn1p_y.y" { int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); @@ -1766,8 +1801,8 @@ case 57: if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument); ; break;} -case 58: -#line 732 "asn1p_y.y" +case 61: +#line 762 "asn1p_y.y" { int ret; yyval.a_plist = yyvsp[-2].a_plist; @@ -1777,15 +1812,15 @@ case 58: if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument); ; break;} -case 59: -#line 743 "asn1p_y.y" +case 62: +#line 773 "asn1p_y.y" { yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} -case 60: -#line 747 "asn1p_y.y" +case 63: +#line 777 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1794,8 +1829,8 @@ case 60: yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} -case 61: -#line 754 "asn1p_y.y" +case 64: +#line 784 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1805,29 +1840,29 @@ case 61: yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} -case 62: -#line 765 "asn1p_y.y" +case 65: +#line 795 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} -case 63: -#line 770 "asn1p_y.y" +case 66: +#line 800 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} -case 64: -#line 777 "asn1p_y.y" +case 67: +#line 807 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} -case 65: -#line 780 "asn1p_y.y" +case 68: +#line 810 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1836,23 +1871,23 @@ case 65: yyval.a_expr->meta_type = AMT_VALUE; ; break;} -case 66: -#line 793 "asn1p_y.y" +case 69: +#line 823 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} -case 67: -#line 798 "asn1p_y.y" +case 70: +#line 828 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} -case 68: -#line 805 "asn1p_y.y" +case 71: +#line 835 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); @@ -1861,16 +1896,16 @@ case 68: assert(yyval.a_expr->meta_type == AMT_OBJECT); ; break;} -case 69: -#line 815 "asn1p_y.y" +case 72: +#line 845 "asn1p_y.y" { yyval.a_int = 0; ; break;} -case 70: -#line 816 "asn1p_y.y" +case 73: +#line 846 "asn1p_y.y" { yyval.a_int = 1; ; break;} -case 71: -#line 820 "asn1p_y.y" +case 74: +#line 850 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1879,15 +1914,15 @@ case 71: TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} -case 72: -#line 827 "asn1p_y.y" +case 75: +#line 857 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} -case 73: -#line 834 "asn1p_y.y" +case 76: +#line 864 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1897,16 +1932,16 @@ case 73: yyval.a_expr->marker = yyvsp[0].a_marker; ; break;} -case 74: -#line 842 "asn1p_y.y" +case 77: +#line 872 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; yyval.a_expr->Identifier = yyvsp[-2].a_refcomp.name; yyval.a_expr->unique = yyvsp[0].a_int; ; break;} -case 75: -#line 847 "asn1p_y.y" +case 78: +#line 877 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -1923,48 +1958,48 @@ case 75: yyval.a_expr->unique = yyvsp[0].a_int; ; break;} -case 76: -#line 865 "asn1p_y.y" +case 79: +#line 895 "asn1p_y.y" { yyval.a_wsynt = 0; ; break;} -case 77: -#line 866 "asn1p_y.y" +case 80: +#line 896 "asn1p_y.y" { yyval.a_wsynt = yyvsp[0].a_wsynt; ; break;} -case 78: -#line 873 "asn1p_y.y" +case 81: +#line 903 "asn1p_y.y" { asn1p_lexer_hack_enable_with_syntax(); ; break;} -case 79: -#line 875 "asn1p_y.y" +case 82: +#line 905 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; ; break;} -case 80: -#line 881 "asn1p_y.y" +case 83: +#line 911 "asn1p_y.y" { yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} -case 81: -#line 885 "asn1p_y.y" +case 84: +#line 915 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} -case 82: -#line 892 "asn1p_y.y" +case 85: +#line 922 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); ; break;} -case 83: -#line 895 "asn1p_y.y" +case 86: +#line 925 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -1975,8 +2010,8 @@ case 83: yyval.a_wchunk = asn1p_wsyntx_chunk_fromref(ref, 0); ; break;} -case 84: -#line 921 "asn1p_y.y" +case 87: +#line 951 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1984,22 +2019,22 @@ case 84: yyval.a_expr->tag = yyvsp[-1].tv_nametag.tag; ; break;} -case 85: -#line 927 "asn1p_y.y" +case 88: +#line 957 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} -case 86: -#line 933 "asn1p_y.y" +case 89: +#line 963 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; yyval.a_expr->constraints = yyvsp[-1].a_constr; yyval.a_expr->marker = yyvsp[0].a_marker; ; break;} -case 87: -#line 941 "asn1p_y.y" +case 90: +#line 971 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -2009,8 +2044,8 @@ case 87: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 88: -#line 949 "asn1p_y.y" +case 91: +#line 979 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -2021,8 +2056,8 @@ case 88: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 89: -#line 958 "asn1p_y.y" +case 92: +#line 988 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -2033,14 +2068,14 @@ case 89: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 90: -#line 970 "asn1p_y.y" +case 93: +#line 1000 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} -case 91: -#line 973 "asn1p_y.y" +case 94: +#line 1003 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2048,16 +2083,16 @@ case 91: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 92: -#line 979 "asn1p_y.y" +case 95: +#line 1009 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; checkmem(yyval.a_expr); assert(yyval.a_expr->meta_type); ; break;} -case 93: -#line 987 "asn1p_y.y" +case 96: +#line 1017 "asn1p_y.y" { int ret; yyval.a_expr = yyvsp[-1].a_expr; @@ -2073,8 +2108,8 @@ case 93: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 94: -#line 1011 "asn1p_y.y" +case 97: +#line 1041 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2083,8 +2118,8 @@ case 94: yyval.a_expr->meta_type = AMT_TYPEREF; ; break;} -case 95: -#line 1018 "asn1p_y.y" +case 98: +#line 1048 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2093,8 +2128,8 @@ case 95: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 96: -#line 1033 "asn1p_y.y" +case 99: +#line 1063 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2104,8 +2139,8 @@ case 96: free(yyvsp[0].tv_str); ; break;} -case 97: -#line 1041 "asn1p_y.y" +case 100: +#line 1071 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2117,8 +2152,8 @@ case 97: free(yyvsp[-2].tv_str); ; break;} -case 98: -#line 1051 "asn1p_y.y" +case 101: +#line 1081 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2130,8 +2165,8 @@ case 98: free(yyvsp[-2].tv_str); ; break;} -case 99: -#line 1061 "asn1p_y.y" +case 102: +#line 1091 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2141,8 +2176,8 @@ case 99: checkmem(ret == 0); ; break;} -case 100: -#line 1069 "asn1p_y.y" +case 103: +#line 1099 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[0].a_ref; @@ -2163,8 +2198,8 @@ case 100: } ; break;} -case 101: -#line 1091 "asn1p_y.y" +case 104: +#line 1121 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2174,8 +2209,8 @@ case 101: checkmem(ret == 0); ; break;} -case 102: -#line 1099 "asn1p_y.y" +case 105: +#line 1129 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[-2].a_ref; @@ -2184,22 +2219,22 @@ case 102: checkmem(ret == 0); ; break;} -case 105: -#line 1113 "asn1p_y.y" +case 108: +#line 1143 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} -case 106: -#line 1118 "asn1p_y.y" +case 109: +#line 1148 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} -case 107: -#line 1131 "asn1p_y.y" +case 110: +#line 1161 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); @@ -2208,53 +2243,53 @@ case 107: yyval.a_expr->value = yyvsp[0].a_value; ; break;} -case 108: -#line 1141 "asn1p_y.y" +case 111: +#line 1171 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} -case 109: -#line 1142 "asn1p_y.y" +case 112: +#line 1172 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); yyval.a_value->type = ATV_UNPARSED; ; break;} -case 110: -#line 1147 "asn1p_y.y" +case 113: +#line 1177 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); ; break;} -case 111: -#line 1151 "asn1p_y.y" +case 114: +#line 1181 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); ; break;} -case 112: -#line 1155 "asn1p_y.y" +case 115: +#line 1185 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} -case 113: -#line 1159 "asn1p_y.y" +case 116: +#line 1189 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 114: -#line 1162 "asn1p_y.y" +case 117: +#line 1192 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 115: -#line 1168 "asn1p_y.y" +case 118: +#line 1198 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2267,8 +2302,8 @@ case 115: free(yyvsp[0].tv_str); ; break;} -case 116: -#line 1179 "asn1p_y.y" +case 119: +#line 1209 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2284,8 +2319,8 @@ case 116: free(yyvsp[0].tv_str); ; break;} -case 117: -#line 1196 "asn1p_y.y" +case 120: +#line 1226 "asn1p_y.y" { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 2; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); @@ -2297,8 +2332,8 @@ case 117: free(yyvsp[0].tv_opaque.buf); ; break;} -case 118: -#line 1206 "asn1p_y.y" +case 121: +#line 1236 "asn1p_y.y" { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); @@ -2312,68 +2347,68 @@ case 118: yyval.tv_opaque.len = newsize; ; break;} -case 119: -#line 1221 "asn1p_y.y" +case 122: +#line 1251 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BOOLEAN; ; break;} -case 120: -#line 1222 "asn1p_y.y" +case 123: +#line 1252 "asn1p_y.y" { yyval.a_type = ASN_BASIC_NULL; ; break;} -case 121: -#line 1223 "asn1p_y.y" +case 124: +#line 1253 "asn1p_y.y" { yyval.a_type = ASN_BASIC_REAL; ; break;} -case 122: -#line 1224 "asn1p_y.y" +case 125: +#line 1254 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} -case 123: -#line 1225 "asn1p_y.y" +case 126: +#line 1255 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OCTET_STRING; ; break;} -case 124: -#line 1226 "asn1p_y.y" +case 127: +#line 1256 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; break;} -case 125: -#line 1227 "asn1p_y.y" +case 128: +#line 1257 "asn1p_y.y" { yyval.a_type = ASN_BASIC_RELATIVE_OID; ; break;} -case 126: -#line 1228 "asn1p_y.y" +case 129: +#line 1258 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EXTERNAL; ; break;} -case 127: -#line 1229 "asn1p_y.y" +case 130: +#line 1259 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; break;} -case 128: -#line 1230 "asn1p_y.y" +case 131: +#line 1260 "asn1p_y.y" { yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; break;} -case 129: -#line 1231 "asn1p_y.y" +case 132: +#line 1261 "asn1p_y.y" { yyval.a_type = ASN_BASIC_UTCTime; ; break;} -case 130: -#line 1232 "asn1p_y.y" +case 133: +#line 1262 "asn1p_y.y" { yyval.a_type = ASN_BASIC_GeneralizedTime; ; break;} -case 131: -#line 1239 "asn1p_y.y" +case 134: +#line 1269 "asn1p_y.y" { yyval.a_type = ASN_BASIC_INTEGER; ; break;} -case 132: -#line 1240 "asn1p_y.y" +case 135: +#line 1270 "asn1p_y.y" { yyval.a_type = ASN_BASIC_ENUMERATED; ; break;} -case 133: -#line 1241 "asn1p_y.y" +case 136: +#line 1271 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BIT_STRING; ; break;} -case 134: -#line 1245 "asn1p_y.y" +case 137: +#line 1275 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -2381,8 +2416,8 @@ case 134: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 135: -#line 1251 "asn1p_y.y" +case 138: +#line 1281 "asn1p_y.y" { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; @@ -2394,76 +2429,76 @@ case 135: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 136: -#line 1264 "asn1p_y.y" +case 139: +#line 1294 "asn1p_y.y" { yyval.a_type = ASN_STRING_BMPString; ; break;} -case 137: -#line 1265 "asn1p_y.y" +case 140: +#line 1295 "asn1p_y.y" { yyval.a_type = ASN_STRING_GeneralString; return yyerror("GeneralString is not supported"); ; break;} -case 138: -#line 1269 "asn1p_y.y" +case 141: +#line 1299 "asn1p_y.y" { yyval.a_type = ASN_STRING_GraphicString; return yyerror("GraphicString is not supported"); ; break;} -case 139: -#line 1273 "asn1p_y.y" +case 142: +#line 1303 "asn1p_y.y" { yyval.a_type = ASN_STRING_IA5String; ; break;} -case 140: -#line 1274 "asn1p_y.y" +case 143: +#line 1304 "asn1p_y.y" { yyval.a_type = ASN_STRING_ISO646String; ; break;} -case 141: -#line 1275 "asn1p_y.y" +case 144: +#line 1305 "asn1p_y.y" { yyval.a_type = ASN_STRING_NumericString; ; break;} -case 142: -#line 1276 "asn1p_y.y" +case 145: +#line 1306 "asn1p_y.y" { yyval.a_type = ASN_STRING_PrintableString; ; break;} -case 143: -#line 1277 "asn1p_y.y" +case 146: +#line 1307 "asn1p_y.y" { yyval.a_type = ASN_STRING_T61String; return yyerror("T61String not implemented yet"); ; break;} -case 144: -#line 1281 "asn1p_y.y" +case 147: +#line 1311 "asn1p_y.y" { yyval.a_type = ASN_STRING_TeletexString; ; break;} -case 145: -#line 1282 "asn1p_y.y" +case 148: +#line 1312 "asn1p_y.y" { yyval.a_type = ASN_STRING_UniversalString; ; break;} -case 146: -#line 1283 "asn1p_y.y" +case 149: +#line 1313 "asn1p_y.y" { yyval.a_type = ASN_STRING_UTF8String; ; break;} -case 147: -#line 1284 "asn1p_y.y" +case 150: +#line 1314 "asn1p_y.y" { yyval.a_type = ASN_STRING_VideotexString; return yyerror("VideotexString is no longer supported"); ; break;} -case 148: -#line 1288 "asn1p_y.y" +case 151: +#line 1318 "asn1p_y.y" { yyval.a_type = ASN_STRING_VisibleString; ; break;} -case 149: -#line 1289 "asn1p_y.y" +case 152: +#line 1319 "asn1p_y.y" { yyval.a_type = ASN_STRING_ObjectDescriptor; ; break;} -case 150: -#line 1293 "asn1p_y.y" +case 153: +#line 1323 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2471,8 +2506,8 @@ case 150: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 151: -#line 1299 "asn1p_y.y" +case 154: +#line 1329 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2480,8 +2515,8 @@ case 151: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 152: -#line 1305 "asn1p_y.y" +case 155: +#line 1335 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2489,8 +2524,8 @@ case 152: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 153: -#line 1311 "asn1p_y.y" +case 156: +#line 1341 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -2500,8 +2535,8 @@ case 153: TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} -case 154: -#line 1319 "asn1p_y.y" +case 157: +#line 1349 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -2511,8 +2546,8 @@ case 154: TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} -case 155: -#line 1327 "asn1p_y.y" +case 158: +#line 1357 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -2520,8 +2555,8 @@ case 155: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 156: -#line 1333 "asn1p_y.y" +case 159: +#line 1363 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(asn1p_lineno); @@ -2534,20 +2569,22 @@ case 156: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 157: -#line 1350 "asn1p_y.y" +case 165: +#line 1384 "asn1p_y.y" { yyval.a_constr = 0; ; break;} -case 158: -#line 1351 "asn1p_y.y" -{ yyval.a_constr = yyvsp[0].a_constr; ; +case 166: +#line 1385 "asn1p_y.y" +{ + CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); + ; break;} -case 164: -#line 1359 "asn1p_y.y" +case 167: +#line 1388 "asn1p_y.y" { /* * This is a special case, for compatibility purposes. - * It goes without parenthesis. + * It goes without parentheses. */ int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2557,182 +2594,191 @@ case 164: checkmem(ret == 0); ; break;} -case 165: -#line 1371 "asn1p_y.y" -{ - CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); - ; - break;} -case 166: -#line 1374 "asn1p_y.y" +case 168: +#line 1403 "asn1p_y.y" { - CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-1].a_constr, yyvsp[0].a_constr); + yyval.a_constr = yyvsp[-1].a_constr; ; break;} -case 167: -#line 1380 "asn1p_y.y" +case 169: +#line 1406 "asn1p_y.y" { - yyval.a_constr = yyvsp[-1].a_constr; + CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} -case 168: -#line 1386 "asn1p_y.y" +case 170: +#line 1412 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 169: -#line 1389 "asn1p_y.y" +case 171: +#line 1415 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); - checkmem(ct); ct->type = ACT_EL_EXT; CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); ; break;} -case 170: -#line 1396 "asn1p_y.y" +case 172: +#line 1421 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); - checkmem(ct); ct->type = ACT_EL_EXT; CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-4].a_constr, ct); ct = yyval.a_constr; CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, ct, yyvsp[0].a_constr); ; break;} -case 171: -#line 1405 "asn1p_y.y" +case 173: +#line 1432 "asn1p_y.y" { - yyval.a_constr = asn1p_constraint_new(yylineno); - checkmem(yyval.a_constr); - yyval.a_constr->type = ACT_EL_EXT; + yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 172: -#line 1410 "asn1p_y.y" +case 174: +#line 1435 "asn1p_y.y" { - asn1p_constraint_t *ct; - ct = asn1p_constraint_new(yylineno); - checkmem(ct); - ct->type = ACT_EL_EXT; - CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, ct, yyvsp[0].a_constr); + CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 173: -#line 1419 "asn1p_y.y" -{ yyval.a_constr = yyvsp[0].a_constr; ; - break;} -case 174: -#line 1422 "asn1p_y.y" -{ yyval.a_constr = yyvsp[0].a_constr; ; - break;} case 175: -#line 1423 "asn1p_y.y" +#line 1438 "asn1p_y.y" { - CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); + CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 176: -#line 1429 "asn1p_y.y" -{ yyval.a_constr = yyvsp[0].a_constr; ; +#line 1441 "asn1p_y.y" +{ + CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); + ; break;} case 177: -#line 1431 "asn1p_y.y" +#line 1447 "asn1p_y.y" { - CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); + int ret; + yyval.a_constr = asn1p_constraint_new(yylineno); + checkmem(yyval.a_constr); + yyval.a_constr->type = yyvsp[-3].a_ctype; + ret = asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr); + checkmem(ret == 0); ; break;} case 178: -#line 1437 "asn1p_y.y" -{ yyval.a_constr = yyvsp[0].a_constr; ; +#line 1455 "asn1p_y.y" +{ + int ret; + yyval.a_constr = asn1p_constraint_new(yylineno); + checkmem(yyval.a_constr); + yyval.a_constr->type = ACT_CA_SET; + ret = asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr); + checkmem(ret == 0); + ; break;} case 179: -#line 1438 "asn1p_y.y" +#line 1463 "asn1p_y.y" { - CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); + yyval.a_constr = asn1p_constraint_new(yylineno); + checkmem(yyval.a_constr); + yyval.a_constr->type = ACT_EL_VALUE; + yyval.a_constr->value = yyvsp[0].a_value; ; break;} case 180: -#line 1444 "asn1p_y.y" +#line 1469 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); - yyval.a_constr->type = ACT_EL_VALUE; - yyval.a_constr->value = yyvsp[0].a_value; + yyval.a_constr->type = yyvsp[-1].a_ctype; + yyval.a_constr->range_start = yyvsp[-2].a_value; + yyval.a_constr->range_stop = yyvsp[0].a_value; ; break;} case 181: -#line 1450 "asn1p_y.y" +#line 1476 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-1].a_ctype; - yyval.a_constr->range_start = yyvsp[-2].a_value; + yyval.a_constr->range_start = asn1p_value_fromint(-123); yyval.a_constr->range_stop = yyvsp[0].a_value; + yyval.a_constr->range_start->type = ATV_MIN; ; break;} case 182: -#line 1457 "asn1p_y.y" +#line 1484 "asn1p_y.y" { - int ret; yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); - yyval.a_constr->type = yyvsp[-3].a_ctype; - ret = asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr); - checkmem(ret == 0); + yyval.a_constr->type = yyvsp[-1].a_ctype; + yyval.a_constr->range_start = yyvsp[-2].a_value; + yyval.a_constr->range_stop = asn1p_value_fromint(321); + yyval.a_constr->range_stop->type = ATV_MAX; ; break;} case 183: -#line 1465 "asn1p_y.y" +#line 1492 "asn1p_y.y" { - yyval.a_constr = yyvsp[0].a_constr; + yyval.a_constr = asn1p_constraint_new(yylineno); + checkmem(yyval.a_constr); + yyval.a_constr->type = yyvsp[-1].a_ctype; + yyval.a_constr->range_start = asn1p_value_fromint(-123); + yyval.a_constr->range_stop = asn1p_value_fromint(321); + yyval.a_constr->range_start->type = ATV_MIN; + yyval.a_constr->range_stop->type = ATV_MAX; ; break;} case 184: -#line 1468 "asn1p_y.y" +#line 1501 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 185: -#line 1474 "asn1p_y.y" -{ yyval.a_ctype = ACT_EL_RANGE; ; +#line 1504 "asn1p_y.y" +{ + yyval.a_constr = yyvsp[0].a_constr; + ; break;} case 186: -#line 1475 "asn1p_y.y" -{ yyval.a_ctype = ACT_EL_RLRANGE; ; +#line 1510 "asn1p_y.y" +{ yyval.a_ctype = ACT_EL_RANGE; ; break;} case 187: -#line 1476 "asn1p_y.y" -{ yyval.a_ctype = ACT_EL_LLRANGE; ; +#line 1511 "asn1p_y.y" +{ yyval.a_ctype = ACT_EL_RLRANGE; ; break;} case 188: -#line 1477 "asn1p_y.y" -{ yyval.a_ctype = ACT_EL_ULRANGE; ; +#line 1512 "asn1p_y.y" +{ yyval.a_ctype = ACT_EL_LLRANGE; ; break;} case 189: -#line 1481 "asn1p_y.y" +#line 1513 "asn1p_y.y" +{ yyval.a_ctype = ACT_EL_ULRANGE; ; + break;} +case 190: +#line 1517 "asn1p_y.y" { yyval.a_ctype = ACT_CT_SIZE; ; break;} -case 190: -#line 1484 "asn1p_y.y" +case 191: +#line 1520 "asn1p_y.y" { yyval.a_ctype = ACT_CT_FROM; ; break;} -case 191: -#line 1490 "asn1p_y.y" +case 192: +#line 1526 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 192: -#line 1493 "asn1p_y.y" +case 193: +#line 1529 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2745,73 +2791,57 @@ case 192: free(yyvsp[0].tv_str); ; break;} -case 193: -#line 1504 "asn1p_y.y" -{ - yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); - checkmem(yyval.a_value); - ; - break;} case 194: -#line 1508 "asn1p_y.y" +#line 1540 "asn1p_y.y" { - yyval.a_value = asn1p_value_fromint(123); + yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); - yyval.a_value->type = ATV_MIN; ; break;} case 195: -#line 1513 "asn1p_y.y" -{ - yyval.a_value = asn1p_value_fromint(321); - checkmem(yyval.a_value); - yyval.a_value->type = ATV_MAX; - ; - break;} -case 196: -#line 1518 "asn1p_y.y" +#line 1545 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_FALSE; ; break;} -case 197: -#line 1523 "asn1p_y.y" +case 196: +#line 1550 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); yyval.a_value->type = ATV_TRUE; ; break;} -case 198: -#line 1531 "asn1p_y.y" +case 197: +#line 1558 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); ; break;} -case 199: -#line 1537 "asn1p_y.y" +case 198: +#line 1564 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 200: -#line 1540 "asn1p_y.y" +case 199: +#line 1567 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 201: -#line 1546 "asn1p_y.y" +case 200: +#line 1573 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_EXT; ; break;} -case 202: -#line 1551 "asn1p_y.y" +case 201: +#line 1578 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2820,46 +2850,46 @@ case 202: yyval.a_constr->presence = yyvsp[0].a_pres; ; break;} -case 203: -#line 1564 "asn1p_y.y" +case 202: +#line 1591 "asn1p_y.y" { yyval.a_pres = ACPRES_DEFAULT; ; break;} -case 204: -#line 1565 "asn1p_y.y" +case 203: +#line 1592 "asn1p_y.y" { yyval.a_pres = yyvsp[0].a_pres; ; break;} -case 205: -#line 1569 "asn1p_y.y" +case 204: +#line 1596 "asn1p_y.y" { yyval.a_pres = ACPRES_PRESENT; ; break;} -case 206: -#line 1572 "asn1p_y.y" +case 205: +#line 1599 "asn1p_y.y" { yyval.a_pres = ACPRES_ABSENT; ; break;} -case 207: -#line 1575 "asn1p_y.y" +case 206: +#line 1602 "asn1p_y.y" { yyval.a_pres = ACPRES_OPTIONAL; ; break;} -case 208: -#line 1581 "asn1p_y.y" +case 207: +#line 1608 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 209: -#line 1584 "asn1p_y.y" +case 208: +#line 1611 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 210: -#line 1593 "asn1p_y.y" +case 209: +#line 1620 "asn1p_y.y" { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; @@ -2873,14 +2903,14 @@ case 210: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, ct, 0); ; break;} -case 211: -#line 1608 "asn1p_y.y" +case 210: +#line 1635 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} -case 212: -#line 1614 "asn1p_y.y" +case 211: +#line 1641 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2888,8 +2918,8 @@ case 212: yyval.a_constr->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); ; break;} -case 213: -#line 1620 "asn1p_y.y" +case 212: +#line 1647 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2899,8 +2929,8 @@ case 213: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); ; break;} -case 214: -#line 1634 "asn1p_y.y" +case 213: +#line 1661 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; @@ -2913,8 +2943,8 @@ case 214: free(yyvsp[0].tv_str); ; break;} -case 215: -#line 1645 "asn1p_y.y" +case 214: +#line 1672 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; @@ -2928,14 +2958,14 @@ case 215: free(yyvsp[0].tv_str); ; break;} -case 216: -#line 1661 "asn1p_y.y" +case 215: +#line 1688 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 217: -#line 1664 "asn1p_y.y" +case 216: +#line 1691 "asn1p_y.y" { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); @@ -2946,76 +2976,76 @@ case 217: yyval.tv_str[l1 + 1 + l3] = '\0'; ; break;} -case 218: -#line 1682 "asn1p_y.y" +case 217: +#line 1709 "asn1p_y.y" { yyval.a_marker = EM_NOMARK; ; break;} -case 219: -#line 1683 "asn1p_y.y" +case 218: +#line 1710 "asn1p_y.y" { yyval.a_marker = yyvsp[0].a_marker; ; break;} -case 220: -#line 1687 "asn1p_y.y" +case 219: +#line 1714 "asn1p_y.y" { yyval.a_marker = EM_OPTIONAL; ; break;} -case 221: -#line 1690 "asn1p_y.y" +case 220: +#line 1717 "asn1p_y.y" { yyval.a_marker = EM_DEFAULT; /* FIXME: store DefaultValue somewhere */ ; break;} -case 222: -#line 1697 "asn1p_y.y" +case 221: +#line 1724 "asn1p_y.y" { ; break;} -case 223: -#line 1699 "asn1p_y.y" +case 222: +#line 1726 "asn1p_y.y" { ; break;} -case 224: -#line 1701 "asn1p_y.y" +case 223: +#line 1728 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} -case 225: -#line 1701 "asn1p_y.y" +case 224: +#line 1728 "asn1p_y.y" { ; break;} -case 226: -#line 1722 "asn1p_y.y" +case 225: +#line 1749 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); ; break;} -case 227: -#line 1726 "asn1p_y.y" +case 226: +#line 1753 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; ; break;} -case 228: -#line 1732 "asn1p_y.y" +case 227: +#line 1759 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} -case 229: -#line 1737 "asn1p_y.y" +case 228: +#line 1764 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} -case 230: -#line 1744 "asn1p_y.y" +case 229: +#line 1771 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3024,8 +3054,8 @@ case 230: yyval.a_expr->Identifier = yyvsp[0].tv_str; ; break;} -case 231: -#line 1751 "asn1p_y.y" +case 230: +#line 1778 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3035,8 +3065,8 @@ case 231: yyval.a_expr->value = yyvsp[-1].a_value; ; break;} -case 232: -#line 1759 "asn1p_y.y" +case 231: +#line 1786 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3046,8 +3076,8 @@ case 232: yyval.a_expr->value = yyvsp[-1].a_value; ; break;} -case 233: -#line 1767 "asn1p_y.y" +case 232: +#line 1794 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3056,8 +3086,8 @@ case 233: yyval.a_expr->value = yyvsp[0].a_value; ; break;} -case 234: -#line 1774 "asn1p_y.y" +case 233: +#line 1801 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3067,86 +3097,86 @@ case 234: yyval.a_expr->meta_type = AMT_VALUE; ; break;} -case 235: -#line 1785 "asn1p_y.y" +case 234: +#line 1812 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} -case 236: -#line 1789 "asn1p_y.y" +case 235: +#line 1816 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} -case 237: -#line 1820 "asn1p_y.y" +case 236: +#line 1847 "asn1p_y.y" { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; break;} -case 238: -#line 1821 "asn1p_y.y" +case 237: +#line 1848 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; ; break;} -case 239: -#line 1825 "asn1p_y.y" +case 238: +#line 1852 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; yyval.a_tag.tag_mode = TM_DEFAULT; ; break;} -case 240: -#line 1829 "asn1p_y.y" +case 239: +#line 1856 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_IMPLICIT; ; break;} -case 241: -#line 1833 "asn1p_y.y" +case 240: +#line 1860 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_EXPLICIT; ; break;} -case 242: -#line 1840 "asn1p_y.y" +case 241: +#line 1867 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 243: -#line 1844 "asn1p_y.y" +case 242: +#line 1871 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 244: -#line 1851 "asn1p_y.y" +case 243: +#line 1879 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 245: -#line 1858 "asn1p_y.y" +case 244: +#line 1886 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 246: -#line 1865 "asn1p_y.y" +case 245: +#line 1893 "asn1p_y.y" { memset(&yyval.tv_nametag, 0, sizeof(yyval.tv_nametag)); yyval.tv_nametag.name = yyvsp[0].tv_str; ; break;} -case 247: -#line 1869 "asn1p_y.y" +case 246: +#line 1897 "asn1p_y.y" { yyval.tv_nametag.name = yyvsp[-1].tv_str; yyval.tv_nametag.tag = yyvsp[0].a_tag; @@ -3374,7 +3404,7 @@ case 247: } return 1; } -#line 1876 "asn1p_y.y" +#line 1904 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.h b/libasn1parser/asn1p_y.h index 61679e3da..375b845fd 100644 --- a/libasn1parser/asn1p_y.h +++ b/libasn1parser/asn1p_y.h @@ -39,7 +39,7 @@ typedef union { #define TOK_number 263 #define TOK_number_negative 264 #define TOK_typereference 265 -#define TOK_objectclassreference 266 +#define TOK_capitalreference 266 #define TOK_typefieldreference 267 #define TOK_valuefieldreference 268 #define TOK_ABSENT 269 @@ -65,68 +65,70 @@ typedef union { #define TOK_DEFINED 289 #define TOK_EMBEDDED 290 #define TOK_ENCODED 291 -#define TOK_END 292 -#define TOK_ENUMERATED 293 -#define TOK_EXPLICIT 294 -#define TOK_EXPORTS 295 -#define TOK_EXTENSIBILITY 296 -#define TOK_EXTERNAL 297 -#define TOK_FALSE 298 -#define TOK_FROM 299 -#define TOK_GeneralizedTime 300 -#define TOK_GeneralString 301 -#define TOK_GraphicString 302 -#define TOK_IA5String 303 -#define TOK_IDENTIFIER 304 -#define TOK_IMPLICIT 305 -#define TOK_IMPLIED 306 -#define TOK_IMPORTS 307 -#define TOK_INCLUDES 308 -#define TOK_INSTANCE 309 -#define TOK_INTEGER 310 -#define TOK_ISO646String 311 -#define TOK_MAX 312 -#define TOK_MIN 313 -#define TOK_MINUS_INFINITY 314 -#define TOK_NULL 315 -#define TOK_NumericString 316 -#define TOK_OBJECT 317 -#define TOK_ObjectDescriptor 318 -#define TOK_OCTET 319 -#define TOK_OF 320 -#define TOK_OPTIONAL 321 -#define TOK_PATTERN 322 -#define TOK_PDV 323 -#define TOK_PLUS_INFINITY 324 -#define TOK_PRESENT 325 -#define TOK_PrintableString 326 -#define TOK_PRIVATE 327 -#define TOK_REAL 328 -#define TOK_RELATIVE_OID 329 -#define TOK_SEQUENCE 330 -#define TOK_SET 331 -#define TOK_SIZE 332 -#define TOK_STRING 333 -#define TOK_SYNTAX 334 -#define TOK_T61String 335 -#define TOK_TAGS 336 -#define TOK_TeletexString 337 -#define TOK_TRUE 338 -#define TOK_TYPE_IDENTIFIER 339 -#define TOK_UNIQUE 340 -#define TOK_UNIVERSAL 341 -#define TOK_UniversalString 342 -#define TOK_UTCTime 343 -#define TOK_UTF8String 344 -#define TOK_VideotexString 345 -#define TOK_VisibleString 346 -#define TOK_WITH 347 -#define TOK_UNION 348 -#define TOK_INTERSECTION 349 +#define TOK_ENCODING_CONTROL 292 +#define TOK_END 293 +#define TOK_ENUMERATED 294 +#define TOK_EXPLICIT 295 +#define TOK_EXPORTS 296 +#define TOK_EXTENSIBILITY 297 +#define TOK_EXTERNAL 298 +#define TOK_FALSE 299 +#define TOK_FROM 300 +#define TOK_GeneralizedTime 301 +#define TOK_GeneralString 302 +#define TOK_GraphicString 303 +#define TOK_IA5String 304 +#define TOK_IDENTIFIER 305 +#define TOK_IMPLICIT 306 +#define TOK_IMPLIED 307 +#define TOK_IMPORTS 308 +#define TOK_INCLUDES 309 +#define TOK_INSTANCE 310 +#define TOK_INSTRUCTIONS 311 +#define TOK_INTEGER 312 +#define TOK_ISO646String 313 +#define TOK_MAX 314 +#define TOK_MIN 315 +#define TOK_MINUS_INFINITY 316 +#define TOK_NULL 317 +#define TOK_NumericString 318 +#define TOK_OBJECT 319 +#define TOK_ObjectDescriptor 320 +#define TOK_OCTET 321 +#define TOK_OF 322 +#define TOK_OPTIONAL 323 +#define TOK_PATTERN 324 +#define TOK_PDV 325 +#define TOK_PLUS_INFINITY 326 +#define TOK_PRESENT 327 +#define TOK_PrintableString 328 +#define TOK_PRIVATE 329 +#define TOK_REAL 330 +#define TOK_RELATIVE_OID 331 +#define TOK_SEQUENCE 332 +#define TOK_SET 333 +#define TOK_SIZE 334 +#define TOK_STRING 335 +#define TOK_SYNTAX 336 +#define TOK_T61String 337 +#define TOK_TAGS 338 +#define TOK_TeletexString 339 +#define TOK_TRUE 340 +#define TOK_TYPE_IDENTIFIER 341 +#define TOK_UNIQUE 342 +#define TOK_UNIVERSAL 343 +#define TOK_UniversalString 344 +#define TOK_UTCTime 345 +#define TOK_UTF8String 346 +#define TOK_VideotexString 347 +#define TOK_VisibleString 348 +#define TOK_WITH 349 #define TOK_EXCEPT 350 -#define TOK_TwoDots 351 -#define TOK_ThreeDots 352 -#define TOK_tag 353 +#define TOK_INTERSECTION 351 +#define TOK_UNION 352 +#define TOK_TwoDots 353 +#define TOK_ThreeDots 354 +#define TOK_tag 355 extern YYSTYPE asn1p_lval; diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index 7b2c13668..452086f56 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -15,6 +15,7 @@ int yylex(void); int yyerror(const char *msg); void asn1p_lexer_hack_push_opaque_state(void); void asn1p_lexer_hack_enable_with_syntax(void); +void asn1p_lexer_hack_push_encoding_control(void); #define yylineno asn1p_lineno extern int asn1p_lineno; @@ -99,7 +100,7 @@ static asn1p_value_t * %token TOK_number %token TOK_number_negative %token TOK_typereference -%token TOK_objectclassreference /* "CLASS1" */ +%token TOK_capitalreference /* "CLASS1" */ %token TOK_typefieldreference /* "&Pork" */ %token TOK_valuefieldreference /* "&id" */ @@ -129,6 +130,7 @@ static asn1p_value_t * %token TOK_DEFINED %token TOK_EMBEDDED %token TOK_ENCODED +%token TOK_ENCODING_CONTROL %token TOK_END %token TOK_ENUMERATED %token TOK_EXPLICIT @@ -147,6 +149,7 @@ static asn1p_value_t * %token TOK_IMPORTS %token TOK_INCLUDES %token TOK_INSTANCE +%token TOK_INSTRUCTIONS %token TOK_INTEGER %token TOK_ISO646String %token TOK_MAX @@ -186,9 +189,9 @@ static asn1p_value_t * %token TOK_VisibleString %token TOK_WITH -%left '|' TOK_UNION -%left '^' TOK_INTERSECTION %left TOK_EXCEPT +%left '^' TOK_INTERSECTION +%left '|' TOK_UNION /* Misc tags */ %token TOK_TwoDots /* .. */ @@ -262,14 +265,10 @@ static asn1p_value_t * %type Tag /* [UNIVERSAL 0] IMPLICIT */ %type optTag /* [UNIVERSAL 0] IMPLICIT */ %type optConstraints -%type Constraints -%type SingleConstraint /* (SIZE(2)) */ -%type ConstraintElementSet /* 1..2,...,3 */ +%type SetOfConstraints +%type ElementSetSpecs /* 1..2,...,3 */ +%type ElementSetSpec /* 1..2,...,3 */ %type ConstraintSubtypeElement /* 1..2 */ -%type ConstraintElementIntersection -%type ConstraintElementException -%type ConstraintElementUnion -%type ConstraintElement %type SimpleTableConstraint %type TableConstraint %type WithComponents @@ -429,6 +428,22 @@ ModuleSpecificationFlag: | TOK_EXTENSIBILITY TOK_IMPLIED { $$ = MSF_EXTENSIBILITY_IMPLIED; } + /* EncodingReferenceDefault */ + | TOK_capitalreference TOK_INSTRUCTIONS { + /* X.680Amd1 specifies TAG and XER */ + if(strcmp($1, "TAG") == 0) { + $$ = MSF_TAG_INSTRUCTIONS; + } else if(strcmp($1, "XER") == 0) { + $$ = MSF_XER_INSTRUCTIONS; + } else { + fprintf(stderr, + "WARNING: %s INSTRUCTIONS at line %d: " + "Unrecognized encoding reference\n", + $1, yylineno); + $$ = MSF_unk_INSTRUCTIONS; + } + free($1); + } ; /* @@ -437,7 +452,6 @@ ModuleSpecificationFlag: optModuleSpecificationBody: { $$ = 0; } | ModuleSpecificationBody { - assert($1); $$ = $1; } ; @@ -452,6 +466,12 @@ ModuleSpecificationBody: | ModuleSpecificationBody ModuleSpecificationElement { $$ = $1; + /* Behave well when one of them is skipped. */ + if(!($1)) { + if($2) $$ = $2; + break; + } + #ifdef MY_IMPORT #error MY_IMPORT DEFINED ELSEWHERE! #endif @@ -515,6 +535,16 @@ ModuleSpecificationElement: assert($1->meta_type != AMT_INVALID); TQ_ADD(&($$->members), $1, next); } + | TOK_ENCODING_CONTROL TOK_capitalreference + { asn1p_lexer_hack_push_encoding_control(); } + { + fprintf(stderr, + "WARNING: ENCODING-CONTROL %s " + "specification at line %d ignored\n", + $2, yylineno); + free($2); + $$ = 0; + } /* * Erroneous attemps @@ -662,7 +692,7 @@ DefinedTypeRef: optValueSetBody: { } - | ConstraintElementSet { + | ElementSetSpecs { } ; @@ -1346,20 +1376,19 @@ ConstructedType: /* * Data type constraints. */ -optConstraints: - { $$ = 0; } - | Constraints { $$ = $1; } - ; - Union: '|' | TOK_UNION; Intersection: '^' | TOK_INTERSECTION; Except: TOK_EXCEPT; -Constraints: - TOK_SIZE '(' ConstraintElementSet ')' { +optConstraints: + { $$ = 0; } + | SetOfConstraints { + CONSTRAINT_INSERT($$, ACT_CA_SET, $1, 0); + } + | TOK_SIZE '(' ElementSetSpecs ')' { /* * This is a special case, for compatibility purposes. - * It goes without parenthesis. + * It goes without parentheses. */ int ret; $$ = asn1p_constraint_new(yylineno); @@ -1368,80 +1397,70 @@ Constraints: ret = asn1p_constraint_insert($$, $3); checkmem(ret == 0); } - | SingleConstraint { - CONSTRAINT_INSERT($$, ACT_CA_SET, $1, 0); - } - | Constraints SingleConstraint { - CONSTRAINT_INSERT($$, ACT_CA_SET, $1, $2); - } ; -SingleConstraint: - '(' ConstraintElementSet ')' { +SetOfConstraints: + '(' ElementSetSpecs ')' { $$ = $2; } + | SetOfConstraints '(' ElementSetSpecs ')' { + CONSTRAINT_INSERT($$, ACT_CA_SET, $1, $3); + } ; -ConstraintElementSet: - ConstraintElement { +ElementSetSpecs: + ElementSetSpec { $$ = $1; } - | ConstraintElement ',' TOK_ThreeDots { + | ElementSetSpec ',' TOK_ThreeDots { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); - checkmem(ct); ct->type = ACT_EL_EXT; CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct); } - | ConstraintElement ',' TOK_ThreeDots ',' ConstraintElement { + | ElementSetSpec ',' TOK_ThreeDots ',' ElementSetSpec { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); - checkmem(ct); ct->type = ACT_EL_EXT; CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct); ct = $$; CONSTRAINT_INSERT($$, ACT_CA_CSV, ct, $5); } - | TOK_ThreeDots { - $$ = asn1p_constraint_new(yylineno); - checkmem($$); - $$->type = ACT_EL_EXT; - } - | TOK_ThreeDots ',' ConstraintElement { - asn1p_constraint_t *ct; - ct = asn1p_constraint_new(yylineno); - checkmem(ct); - ct->type = ACT_EL_EXT; - CONSTRAINT_INSERT($$, ACT_CA_CSV, ct, $3); - } ; -ConstraintElement: ConstraintElementUnion { $$ = $1; } ; - -ConstraintElementUnion: - ConstraintElementIntersection { $$ = $1; } - | ConstraintElementUnion Union ConstraintElementIntersection { +ElementSetSpec: + ConstraintSubtypeElement { + $$ = $1; + } + | ElementSetSpec Union ConstraintSubtypeElement { CONSTRAINT_INSERT($$, ACT_CA_UNI, $1, $3); } - ; - -ConstraintElementIntersection: - ConstraintElementException { $$ = $1; } - | ConstraintElementIntersection Intersection - ConstraintElementException { + | ElementSetSpec Intersection ConstraintSubtypeElement { CONSTRAINT_INSERT($$, ACT_CA_INT, $1, $3); } - ; - -ConstraintElementException: - ConstraintSubtypeElement { $$ = $1; } - | ConstraintElementException Except ConstraintSubtypeElement { + | ConstraintSubtypeElement Except ConstraintSubtypeElement { CONSTRAINT_INSERT($$, ACT_CA_EXC, $1, $3); } ; ConstraintSubtypeElement: - ConstraintValue { + ConstraintSpec '(' ElementSetSpecs ')' { + int ret; + $$ = asn1p_constraint_new(yylineno); + checkmem($$); + $$->type = $1; + ret = asn1p_constraint_insert($$, $3); + checkmem(ret == 0); + } + | '(' ElementSetSpecs ')' { + int ret; + $$ = asn1p_constraint_new(yylineno); + checkmem($$); + $$->type = ACT_CA_SET; + ret = asn1p_constraint_insert($$, $2); + checkmem(ret == 0); + } + | ConstraintValue { $$ = asn1p_constraint_new(yylineno); checkmem($$); $$->type = ACT_EL_VALUE; @@ -1454,13 +1473,30 @@ ConstraintSubtypeElement: $$->range_start = $1; $$->range_stop = $3; } - | ConstraintSpec '(' ConstraintElementSet ')' { - int ret; + | TOK_MIN ConstraintRangeSpec ConstraintValue { $$ = asn1p_constraint_new(yylineno); checkmem($$); - $$->type = $1; - ret = asn1p_constraint_insert($$, $3); - checkmem(ret == 0); + $$->type = $2; + $$->range_start = asn1p_value_fromint(-123); + $$->range_stop = $3; + $$->range_start->type = ATV_MIN; + } + | ConstraintValue ConstraintRangeSpec TOK_MAX { + $$ = asn1p_constraint_new(yylineno); + checkmem($$); + $$->type = $2; + $$->range_start = $1; + $$->range_stop = asn1p_value_fromint(321); + $$->range_stop->type = ATV_MAX; + } + | TOK_MIN ConstraintRangeSpec TOK_MAX { + $$ = asn1p_constraint_new(yylineno); + checkmem($$); + $$->type = $2; + $$->range_start = asn1p_value_fromint(-123); + $$->range_stop = asn1p_value_fromint(321); + $$->range_start->type = ATV_MIN; + $$->range_stop->type = ATV_MAX; } | TableConstraint { $$ = $1; @@ -1505,16 +1541,7 @@ ConstraintValue: $$ = asn1p_value_frombuf($1.buf, $1.len, 0); checkmem($$); } - | TOK_MIN { - $$ = asn1p_value_fromint(123); - checkmem($$); - $$->type = ATV_MIN; - } - | TOK_MAX { - $$ = asn1p_value_fromint(321); - checkmem($$); - $$->type = ATV_MAX; - } + | TOK_FALSE { $$ = asn1p_value_fromint(0); checkmem($$); @@ -1841,14 +1868,15 @@ TypeRefName: checkmem($1); $$ = $1; } - | TOK_objectclassreference { + | TOK_capitalreference { checkmem($1); $$ = $1; } ; + ObjectClassReference: - TOK_objectclassreference { + TOK_capitalreference { checkmem($1); $$ = $1; } From 04a79e6b85fa12b03dfeb3f9a7d4d24757a9afcf Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 18 Aug 2004 05:41:05 +0000 Subject: [PATCH 0131/1469] headers git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@131 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1print/asn1print.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index 58ce284e7..3c411c6bb 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -5,6 +5,7 @@ #include #include +#include #include "asn1print.h" From b5be8c301896e8bf35106f32c20bc114d73be427 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 18 Aug 2004 05:42:05 +0000 Subject: [PATCH 0132/1469] constraint groking code git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@132 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/Makefile.am | 52 +- libasn1fix/Makefile.in | 73 +- libasn1fix/asn1fix.c | 120 ++-- libasn1fix/asn1fix.h | 2 +- libasn1fix/asn1fix_constraint.c | 239 +++++++ libasn1fix/asn1fix_constraint.h | 17 + libasn1fix/asn1fix_constraint_compat.c | 181 +++++ libasn1fix/asn1fix_crange.c | 912 +++++++++++++++++++++++++ libasn1fix/asn1fix_crange.h | 59 ++ libasn1fix/asn1fix_export.c | 35 +- libasn1fix/asn1fix_export.h | 13 +- libasn1fix/asn1fix_internal.h | 5 + libasn1fix/asn1fix_misc.h | 12 - libasn1fix/asn1fix_value.c | 1 + 14 files changed, 1576 insertions(+), 145 deletions(-) create mode 100644 libasn1fix/asn1fix_constraint.c create mode 100644 libasn1fix/asn1fix_constraint.h create mode 100644 libasn1fix/asn1fix_constraint_compat.c create mode 100644 libasn1fix/asn1fix_crange.c create mode 100644 libasn1fix/asn1fix_crange.h diff --git a/libasn1fix/Makefile.am b/libasn1fix/Makefile.am index 0e52b4f39..937325425 100644 --- a/libasn1fix/Makefile.am +++ b/libasn1fix/Makefile.am @@ -1,36 +1,42 @@ - AM_CFLAGS = @ADD_CFLAGS@ -AM_CPPFLAGS = -I${top_srcdir}/libasn1parser +AM_CPPFLAGS = \ + -I$(top_srcdir)/libasn1parser \ + -I$(top_srcdir)/libasn1cnst noinst_LTLIBRARIES = libasn1fix.la libasn1fix_la_LDFLAGS = -all-static -libasn1fix_la_SOURCES = \ - asn1fix.c asn1fix.h \ - asn1fix_internal.h \ - asn1fix_misc.c asn1fix_misc.h \ - asn1fix_value.c asn1fix_value.h \ - asn1fix_compat.c asn1fix_compat.h \ - asn1fix_constr.c asn1fix_constr.h \ - asn1fix_cstring.c asn1fix_cstring.h \ - asn1fix_retrieve.c asn1fix_retrieve.h \ - asn1fix_bitstring.c asn1fix_bitstring.h \ - asn1fix_integer.c asn1fix_integer.h \ - asn1fix_dereft.c asn1fix_dereft.h \ - asn1fix_derefv.c asn1fix_derefv.h \ - asn1fix_export.c asn1fix_export.h \ - asn1fix_param.c asn1fix_param.h \ - asn1fix_class.c asn1fix_class.h \ - asn1fix_tags.c asn1fix_tags.h \ - asn1fix_enum.c asn1fix_enum.h -libasn1fix_la_LIBADD = ${top_builddir}/libasn1parser/libasn1parser.la +libasn1fix_la_SOURCES = \ + asn1fix.c asn1fix.h \ + asn1fix_internal.h \ + asn1fix_misc.c asn1fix_misc.h \ + asn1fix_value.c asn1fix_value.h \ + asn1fix_compat.c asn1fix_compat.h \ + asn1fix_constr.c asn1fix_constr.h \ + asn1fix_cstring.c asn1fix_cstring.h \ + asn1fix_retrieve.c asn1fix_retrieve.h \ + asn1fix_bitstring.c asn1fix_bitstring.h \ + asn1fix_constraint.c asn1fix_constraint.h \ + asn1fix_integer.c asn1fix_integer.h \ + asn1fix_crange.c asn1fix_crange.h \ + asn1fix_dereft.c asn1fix_dereft.h \ + asn1fix_derefv.c asn1fix_derefv.h \ + asn1fix_export.c asn1fix_export.h \ + asn1fix_param.c asn1fix_param.h \ + asn1fix_class.c asn1fix_class.h \ + asn1fix_tags.c asn1fix_tags.h \ + asn1fix_enum.c asn1fix_enum.h \ + asn1fix_constraint_compat.c check_PROGRAMS = check_fixer -LDADD = ${noinst_LTLIBRARIES} ${libasn1fix_la_LIBADD} -DEPENDENCIES = ${LDADD} +check_fixer_LDADD = $(noinst_LTLIBRARIES) \ + $(top_builddir)/libasn1cnst/libasn1cnst.la \ + $(top_builddir)/libasn1parser/libasn1parser.la +check_fixer_DEPENDENCIES = $(check_fixer_LDADD) TESTS_ENVIRONMENT= ./check_fixer TESTS = ${top_srcdir}/tests/*.asn1 ## TESTS = ${check_PROGRAMS} # This is an alternate form of testing + diff --git a/libasn1fix/Makefile.in b/libasn1fix/Makefile.in index 91b9428fb..80a91c0e0 100644 --- a/libasn1fix/Makefile.in +++ b/libasn1fix/Makefile.in @@ -50,21 +50,18 @@ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) -libasn1fix_la_DEPENDENCIES = \ - ${top_builddir}/libasn1parser/libasn1parser.la +libasn1fix_la_LIBADD = am_libasn1fix_la_OBJECTS = asn1fix.lo asn1fix_misc.lo asn1fix_value.lo \ asn1fix_compat.lo asn1fix_constr.lo asn1fix_cstring.lo \ - asn1fix_retrieve.lo asn1fix_bitstring.lo asn1fix_integer.lo \ - asn1fix_dereft.lo asn1fix_derefv.lo asn1fix_export.lo \ - asn1fix_param.lo asn1fix_class.lo asn1fix_tags.lo \ - asn1fix_enum.lo + asn1fix_retrieve.lo asn1fix_bitstring.lo asn1fix_constraint.lo \ + asn1fix_integer.lo asn1fix_crange.lo asn1fix_dereft.lo \ + asn1fix_derefv.lo asn1fix_export.lo asn1fix_param.lo \ + asn1fix_class.lo asn1fix_tags.lo asn1fix_enum.lo \ + asn1fix_constraint_compat.lo libasn1fix_la_OBJECTS = $(am_libasn1fix_la_OBJECTS) check_fixer_SOURCES = check_fixer.c check_fixer_OBJECTS = check_fixer.$(OBJEXT) -check_fixer_LDADD = $(LDADD) am__DEPENDENCIES_1 = libasn1fix.la -am__DEPENDENCIES_2 = ${top_builddir}/libasn1parser/libasn1parser.la -check_fixer_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @@ -73,6 +70,9 @@ am__depfiles_maybe = depfiles @AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_class.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_compat.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_constr.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_constraint.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_constraint_compat.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_crange.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_cstring.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_dereft.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/asn1fix_derefv.Plo \ @@ -209,31 +209,39 @@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ AM_CFLAGS = @ADD_CFLAGS@ -AM_CPPFLAGS = -I${top_srcdir}/libasn1parser +AM_CPPFLAGS = \ + -I$(top_srcdir)/libasn1parser \ + -I$(top_srcdir)/libasn1cnst + noinst_LTLIBRARIES = libasn1fix.la libasn1fix_la_LDFLAGS = -all-static libasn1fix_la_SOURCES = \ - asn1fix.c asn1fix.h \ - asn1fix_internal.h \ - asn1fix_misc.c asn1fix_misc.h \ - asn1fix_value.c asn1fix_value.h \ - asn1fix_compat.c asn1fix_compat.h \ - asn1fix_constr.c asn1fix_constr.h \ - asn1fix_cstring.c asn1fix_cstring.h \ - asn1fix_retrieve.c asn1fix_retrieve.h \ - asn1fix_bitstring.c asn1fix_bitstring.h \ - asn1fix_integer.c asn1fix_integer.h \ - asn1fix_dereft.c asn1fix_dereft.h \ - asn1fix_derefv.c asn1fix_derefv.h \ - asn1fix_export.c asn1fix_export.h \ - asn1fix_param.c asn1fix_param.h \ - asn1fix_class.c asn1fix_class.h \ - asn1fix_tags.c asn1fix_tags.h \ - asn1fix_enum.c asn1fix_enum.h - -libasn1fix_la_LIBADD = ${top_builddir}/libasn1parser/libasn1parser.la -LDADD = ${noinst_LTLIBRARIES} ${libasn1fix_la_LIBADD} -DEPENDENCIES = ${LDADD} + asn1fix.c asn1fix.h \ + asn1fix_internal.h \ + asn1fix_misc.c asn1fix_misc.h \ + asn1fix_value.c asn1fix_value.h \ + asn1fix_compat.c asn1fix_compat.h \ + asn1fix_constr.c asn1fix_constr.h \ + asn1fix_cstring.c asn1fix_cstring.h \ + asn1fix_retrieve.c asn1fix_retrieve.h \ + asn1fix_bitstring.c asn1fix_bitstring.h \ + asn1fix_constraint.c asn1fix_constraint.h \ + asn1fix_integer.c asn1fix_integer.h \ + asn1fix_crange.c asn1fix_crange.h \ + asn1fix_dereft.c asn1fix_dereft.h \ + asn1fix_derefv.c asn1fix_derefv.h \ + asn1fix_export.c asn1fix_export.h \ + asn1fix_param.c asn1fix_param.h \ + asn1fix_class.c asn1fix_class.h \ + asn1fix_tags.c asn1fix_tags.h \ + asn1fix_enum.c asn1fix_enum.h \ + asn1fix_constraint_compat.c + +check_fixer_LDADD = $(noinst_LTLIBRARIES) \ + $(top_builddir)/libasn1cnst/libasn1cnst.la \ + $(top_builddir)/libasn1parser/libasn1parser.la + +check_fixer_DEPENDENCIES = $(check_fixer_LDADD) TESTS_ENVIRONMENT = ./check_fixer TESTS = ${top_srcdir}/tests/*.asn1 all: all-am @@ -302,6 +310,9 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_class.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_compat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_constr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_constraint.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_constraint_compat.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_crange.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_cstring.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_dereft.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_derefv.Plo@am__quote@ diff --git a/libasn1fix/asn1fix.c b/libasn1fix/asn1fix.c index af1109993..dd0d5e73b 100644 --- a/libasn1fix/asn1fix.c +++ b/libasn1fix/asn1fix.c @@ -17,6 +17,7 @@ static int asn1f_fix_simple(arg_t *arg); /* For INTEGER/ENUMERATED */ static int asn1f_fix_constructed(arg_t *arg); /* For SEQUENCE/SET/CHOICE */ static int asn1f_fix_constraints(arg_t *arg); /* For subtype constraints */ +arg_t a1f_replace_me_with_proper_interface_arg; /* * Scan every module defined here in search for inconsistences. @@ -53,6 +54,8 @@ asn1f_process(asn1p_t *asn, enum asn1f_flags flags, flags &= ~A1F_DEBUG; } + a1f_replace_me_with_proper_interface_arg = arg; + /* * Check that we haven't missed an unknown flag. */ @@ -74,6 +77,8 @@ asn1f_process(asn1p_t *asn, enum asn1f_flags flags, if(ret == 1) warnings++; } + memset(&a1f_replace_me_with_proper_interface_arg, 0, sizeof(arg_t)); + /* * Compute a return value. */ @@ -88,8 +93,7 @@ asn1f_fix_module(arg_t *arg) { asn1p_expr_t *expr; int rvalue = 0; - switch((arg->mod->module_flags - & (MSF_EXPLICIT_TAGS | MSF_IMPLICIT_TAGS | MSF_AUTOMATIC_TAGS))) { + switch((arg->mod->module_flags & MSF_MASK_TAGS)) { case MSF_NOFLAGS: case MSF_EXPLICIT_TAGS: case MSF_IMPLICIT_TAGS: @@ -101,6 +105,24 @@ asn1f_fix_module(arg_t *arg) { RET2RVAL(-1, rvalue); } + switch((arg->mod->module_flags & MSF_MASK_INSTRUCTIONS)) { + case MSF_NOFLAGS: + //arg->mod->module_flags |= MSF_TAG_INSTRUCTIONS; + break; + case MSF_unk_INSTRUCTIONS: + WARNING("Module %s defined with unrecognized " + "encoding reference", arg->mod->Identifier); + RET2RVAL(1, rvalue); + /* Fall through */ + case MSF_TAG_INSTRUCTIONS: + case MSF_XER_INSTRUCTIONS: + break; + default: + FATAL("Module %s defined with ambiguous encoding reference", + arg->mod->Identifier); + RET2RVAL(-1, rvalue); + } + /* * Do various non-recursive transformations. * Order is not important. @@ -249,86 +271,34 @@ asn1f_fix_constructed(arg_t *arg) { } static int -_constraint_value_resolve(arg_t *arg, asn1p_value_t **value) { - asn1p_expr_t expr; - asn1p_expr_t *tmp_expr; - asn1p_module_t *tmp_mod; - asn1p_module_t *mod_r = NULL; +asn1f_fix_constraints(arg_t *arg) { + asn1p_expr_t *top_parent; int rvalue = 0; int ret; - tmp_expr = asn1f_lookup_symbol(arg, (*value)->value.reference, &mod_r); - if(tmp_expr == NULL) { - FATAL("Cannot find symbol %s " - "used in %s subtype constraint at line %d", - asn1f_printable_reference((*value)->value.reference), - arg->expr->Identifier, arg->expr->_lineno); - assert((*value)->type == ATV_REFERENCED); - return -1; - } - - memset(&expr, 0, sizeof(expr)); - expr.meta_type = tmp_expr->meta_type; - expr.expr_type = tmp_expr->expr_type; - expr.Identifier = tmp_expr->Identifier; - expr.value = *value; - tmp_expr = arg->expr; - tmp_mod = arg->mod; - arg->expr = &expr; - arg->mod = mod_r; - ret = asn1f_fix_dereference_values(arg); + ret = asn1constraint_resolve(arg, arg->expr->constraints); RET2RVAL(ret, rvalue); - arg->expr = tmp_expr; - arg->mod = tmp_mod; - assert(expr.value); - *value = expr.value; - - return rvalue; -} - -static int -_resolve_constraints(arg_t *arg, asn1p_constraint_t *ct) { - int rvalue = 0; - int ret; - int el; - - /* Don't touch information object classes */ - if(ct->type == ACT_CT_WCOMP - || ct->type == ACT_CT_WCOMPS - || ct->type == ACT_CA_CRC) - return 0; - - if(ct->value && ct->value->type == ATV_REFERENCED) { - ret = _constraint_value_resolve(arg, &ct->value); - RET2RVAL(ret, rvalue); - } - if(ct->range_start && ct->range_start->type == ATV_REFERENCED) { - ret = _constraint_value_resolve(arg, &ct->range_start); - RET2RVAL(ret, rvalue); - } - if(ct->range_stop && ct->range_stop->type == ATV_REFERENCED) { - ret = _constraint_value_resolve(arg, &ct->range_stop); - RET2RVAL(ret, rvalue); - } - - for(el = 0; el < ct->el_count; el++) { - ret = _resolve_constraints(arg, ct->elements[el]); - RET2RVAL(ret, rvalue); - } - return rvalue; -} - -static int -asn1f_fix_constraints(arg_t *arg) { - int rvalue = 0; - int ret; + ret = asn1constraint_pullup(arg); + RET2RVAL(ret, rvalue); - if(arg->expr->constraints) { - ret = _resolve_constraints(arg, arg->expr->constraints); - RET2RVAL(ret, rvalue); + top_parent = asn1f_find_terminal_type(arg, arg->expr, NULL); + if(top_parent) { + static enum asn1p_constraint_type_e test_types[] = { + ACT_EL_RANGE, ACT_CT_SIZE, ACT_CT_FROM }; + unsigned int i; + for(i = 0; i < sizeof(test_types)/sizeof(test_types[0]); i++) { + asn1cnst_range_t *range; + range = asn1constraint_compute_PER_range( + top_parent->expr_type, + arg->expr->combined_constraints, + test_types[i], 0, 0); + if(!range && errno == EPERM) + return -1; + asn1constraint_range_free(range); + } } - + return rvalue; } diff --git a/libasn1fix/asn1fix.h b/libasn1fix/asn1fix.h index 58ca537c5..1bed8581b 100644 --- a/libasn1fix/asn1fix.h +++ b/libasn1fix/asn1fix.h @@ -12,7 +12,7 @@ */ enum asn1f_flags { A1F_NOFLAGS, - A1F_DEBUG, /* Print debugging output using (_is_fatal = -1) */ + A1F_DEBUG = 0x01, /* Print debugging output */ }; /* diff --git a/libasn1fix/asn1fix_constraint.c b/libasn1fix/asn1fix_constraint.c new file mode 100644 index 000000000..b7b66c44a --- /dev/null +++ b/libasn1fix/asn1fix_constraint.c @@ -0,0 +1,239 @@ +#include +#include +#include + +static void _remove_exceptions(arg_t *arg, asn1p_constraint_t *ct); +static int _constraint_value_resolve(arg_t *arg, asn1p_value_t **value); + +int +asn1constraint_pullup(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + asn1p_constraint_t *ct_parent; + asn1p_constraint_t *ct_expr; + int ret; + + if(expr->combined_constraints) + return 0; /* Operation already performed earlier */ + + switch(expr->meta_type) { + case AMT_TYPE: + case AMT_TYPEREF: + break; + default: + return 0; /* Nothing to do */ + } + + if(expr->expr_type == A1TC_REFERENCE) { + asn1p_ref_t *ref = expr->reference; + asn1p_module_t *mod_rw = arg->mod; + asn1p_expr_t *parent_expr; + + assert(ref); + parent_expr = asn1f_lookup_symbol(arg, ref, &mod_rw); + if(!parent_expr) { + if(errno != EEXIST) { + DEBUG("\tWhile fetching parent constraints: " + "type \"%s\" not found: %s", + asn1f_printable_reference(ref), + strerror(errno)); + return -1; + } else { + /* + * -fknown-extern-type is given. + * Assume there are no constraints there. + */ + WARNING("External type \"%s\": " + "assuming no constraints", + asn1f_printable_reference(ref)); + ct_parent = 0; + } + } else { + arg->expr = parent_expr; + ret = asn1constraint_pullup(arg); + arg->expr = expr; + if(ret) return ret; + + ct_parent = parent_expr->combined_constraints; + } + } else { + ct_parent = 0; + } + + ct_expr = expr->constraints; + + if(!ct_parent && !ct_expr) + return 0; /* No constraints to consider */ + + if(ct_parent) { + ct_parent = asn1p_constraint_clone(ct_parent); + assert(ct_parent); + } + + /* + * If the current type does not have constraints, it inherits + * the constraints of a parent. + */ + if(ct_parent && !ct_expr) { + expr->combined_constraints = ct_parent; + return 0; + } + + ct_expr = asn1p_constraint_clone(ct_expr); + assert(ct_expr); + + /* + * Now we have a set of current expression's constraints, + * and an optional set of the parent expression's constraints. + */ + + if(ct_parent) { + /* + * If we have a parent, remove all the extensions (46.4). + */ + _remove_exceptions(arg, ct_parent); + + expr->combined_constraints = ct_parent; + if(ct_expr->type == ACT_CA_SET) { + int i; + for(i = 0; i < ct_expr->el_count; i++) { + if(asn1p_constraint_insert( + expr->combined_constraints, + ct_expr->elements[i])) { + expr->combined_constraints = 0; + asn1p_constraint_free(ct_expr); + asn1p_constraint_free(ct_parent); + return -1; + } else { + ct_expr->elements[i] = 0; + } + } + asn1p_constraint_free(ct_expr); + } else { + asn1p_constraint_insert(expr->combined_constraints, + ct_expr); + } + } else { + expr->combined_constraints = ct_expr; + } + + return 0; +} + +int +asn1constraint_resolve(arg_t *arg, asn1p_constraint_t *ct) { + asn1p_expr_t *top_parent; + int rvalue = 0; + int ret; + int el; + + if(!ct) return 0; + + /* Don't touch information object classes */ + switch(ct->type) { + case ACT_CT_WCOMP: + case ACT_CT_WCOMPS: + case ACT_CA_CRC: + return 0; + default: + break; + } + + top_parent = asn1f_find_terminal_type(arg, arg->expr, 0); + if(top_parent) { + ret = asn1constraint_compatible(top_parent->expr_type, + ct->type); + switch(ret) { + case -1: /* If unknown, assume OK. */ + case 1: + break; + case 0: + default: + FATAL("%s at line %d: " + "Constraint type %s is not applicable to %s", + arg->expr->Identifier, ct->_lineno, + asn1p_constraint_type2str(ct->type), + ASN_EXPR_TYPE2STR(top_parent->expr_type) + ); + rvalue = -1; + break; + } + } else { + WARNING("%s at line %d: " + "Constraints ignored: Unresolved parent type", + arg->expr->Identifier, arg->expr->_lineno); + } + + if(ct->value && ct->value->type == ATV_REFERENCED) { + ret = _constraint_value_resolve(arg, &ct->value); + RET2RVAL(ret, rvalue); + } + if(ct->range_start && ct->range_start->type == ATV_REFERENCED) { + ret = _constraint_value_resolve(arg, &ct->range_start); + RET2RVAL(ret, rvalue); + } + if(ct->range_stop && ct->range_stop->type == ATV_REFERENCED) { + ret = _constraint_value_resolve(arg, &ct->range_stop); + RET2RVAL(ret, rvalue); + } + + for(el = 0; el < ct->el_count; el++) { + ret = asn1constraint_resolve(arg, ct->elements[el]); + RET2RVAL(ret, rvalue); + } + + return rvalue; +} + +static void +_remove_exceptions(arg_t *arg, asn1p_constraint_t *ct) { + int i; + + for(i = 0; i < ct->el_count; i++) { + if(ct->elements[i]->type == ACT_EL_EXT) + break; + _remove_exceptions(arg, ct->elements[i]); + } + + /* Remove the elements at and after the extensibility mark */ + for(; i < ct->el_count; ct->el_count--) { + asn1p_constraint_t *rm; + rm = ct->elements[ct->el_count-1]; + asn1p_constraint_free(rm); + } + + if(i < ct->el_size) + ct->elements[i] = 0; +} + + +static int +_constraint_value_resolve(arg_t *arg, asn1p_value_t **value) { + asn1p_expr_t static_expr; + asn1p_expr_t *tmp_expr; + asn1p_module_t *mod_rw = arg->mod; + arg_t tmp_arg; + int rvalue = 0; + int ret; + + tmp_expr = asn1f_lookup_symbol(arg, (*value)->value.reference, &mod_rw); + if(tmp_expr == NULL) { + FATAL("Cannot find symbol %s " + "used in %s subtype constraint at line %d", + asn1f_printable_reference((*value)->value.reference), + arg->expr->Identifier, arg->expr->_lineno); + assert((*value)->type == ATV_REFERENCED); + return -1; + } + + static_expr = *tmp_expr; + static_expr.value = *value; + tmp_arg = *arg; + tmp_arg.mod = mod_rw; + tmp_arg.expr = &static_expr; + ret = asn1f_fix_dereference_values(&tmp_arg); + RET2RVAL(ret, rvalue); + assert(static_expr.value); + *value = static_expr.value; + + return rvalue; +} diff --git a/libasn1fix/asn1fix_constraint.h b/libasn1fix/asn1fix_constraint.h new file mode 100644 index 000000000..a04e6a507 --- /dev/null +++ b/libasn1fix/asn1fix_constraint.h @@ -0,0 +1,17 @@ +#ifndef _ASN1FIX_CONSTRAINT_H_ +#define _ASN1FIX_CONSTRAINT_H_ + +/* + * Resolve referenced values inside constraints. + */ +int asn1constraint_resolve(arg_t *arg, asn1p_constraint_t *ct); + +/* + * Collect all subtype constraints from all parents of this type and + * the type itself, forming a full constraint structure. + * Honors the constraints extensibility rules (46.8) + * and does other useful transformations. + */ +int asn1constraint_pullup(arg_t *arg); + +#endif /* _ASN1FIX_CONSTRAINT_H_ */ diff --git a/libasn1fix/asn1fix_constraint_compat.c b/libasn1fix/asn1fix_constraint_compat.c new file mode 100644 index 000000000..28ebf92ed --- /dev/null +++ b/libasn1fix/asn1fix_constraint_compat.c @@ -0,0 +1,181 @@ +#include +#include + +/* + * Check that a specific constraint is compatible + * with the given expression type. + */ +int +asn1constraint_compatible(asn1p_expr_type_e expr_type, + enum asn1p_constraint_type_e constr_type) { + + /* + * X.680-0207, Table 9. + */ + + switch(constr_type) { + case ACT_INVALID: + return 0; + case ACT_EL_VALUE: + return 1; + case ACT_EL_RANGE: + case ACT_EL_LLRANGE: + case ACT_EL_RLRANGE: + case ACT_EL_ULRANGE: + switch(expr_type) { + case ASN_BASIC_ENUMERATED: + case ASN_BASIC_BOOLEAN: + /* + * The ValueRange constraint is not formally + * applicable to the above types. However, we + * support it just fine. + */ + /* Fall through */ + case ASN_BASIC_INTEGER: + case ASN_BASIC_REAL: + return 1; + default: + if(expr_type & ASN_STRING_MASK) + return 1; + } + return 0; + case ACT_EL_EXT: + return -1; + case ACT_CT_FROM: + if(expr_type & ASN_STRING_MASK) + return 1; + return 0; + case ACT_CT_SIZE: + switch(expr_type) { + case ASN_BASIC_BIT_STRING: + case ASN_BASIC_OCTET_STRING: + case ASN_BASIC_CHARACTER_STRING: + case ASN_CONSTR_SEQUENCE_OF: + case ASN_CONSTR_SET_OF: + return 1; + default: + if(expr_type & ASN_STRING_MASK) + return 1; + } + return 0; + case ACT_CT_WCOMP: + case ACT_CT_WCOMPS: + switch(expr_type) { + case A1TC_INSTANCE: + case ASN_BASIC_EXTERNAL: + case ASN_BASIC_EMBEDDED_PDV: + case ASN_BASIC_REAL: + case ASN_BASIC_CHARACTER_STRING: + case ASN_CONSTR_CHOICE: + case ASN_CONSTR_SEQUENCE: + case ASN_CONSTR_SEQUENCE_OF: + case ASN_CONSTR_SET: + case ASN_CONSTR_SET_OF: + return 1; + default: break; + } + return 0; + case ACT_CA_SET: + case ACT_CA_CRC: + case ACT_CA_CSV: + case ACT_CA_UNI: + case ACT_CA_INT: + case ACT_CA_EXC: + return 1; + } + + return -1; +} + + +#define DECL(foo, val1, val2) \ + static asn1cnst_range_t range_ ## foo = { \ + { ARE_VALUE, 0, val1 }, \ + { ARE_VALUE, 0, val2 }, \ + 0, 0, 0, 0, 0, 0 }; + +asn1cnst_range_t * +asn1constraint_default_alphabet(asn1p_expr_type_e expr_type) { + DECL(uint7, 0x00, 0x7f); + DECL(uint8, 0x00, 0xff); + DECL(Space, 0x20, 0x20); + DECL(ApostropheAndParens, 0x27, 0x29); + DECL(PlusTillColon, 0x2b, 0x3a); + DECL(Equal, 0x3d, 0x3d); + DECL(QuestionMark, 0x3f, 0x3f); + DECL(Digits, 0x30, 0x39); + DECL(AlphaCap, 0x41, 0x5a); + DECL(AlphaLow, 0x61, 0x7a); + DECL(PlusCommaMinusDot, 0x2b, 0x2e); + DECL(Plus, 0x2b, 0x2b); + DECL(MinusDot, 0x2d, 0x2e); + DECL(Z, 0x5a, 0x5a); + static asn1cnst_range_t *range_NumericString_array[] = { + &range_Space, &range_Digits }; + static asn1cnst_range_t *range_PrintableString_array[] = { + &range_Space, + &range_ApostropheAndParens, + &range_PlusTillColon, + &range_Equal, + &range_QuestionMark, + &range_AlphaCap, + &range_AlphaLow + }; + static asn1cnst_range_t *range_UTCTime_array[] = { + &range_Plus, &range_MinusDot, &range_Digits, &range_Z }; + static asn1cnst_range_t *range_GeneralizedTime_array[] = { + &range_PlusCommaMinusDot, &range_Digits, &range_Z }; + static asn1cnst_range_t range_NumericString = { + { ARE_VALUE, 0, 0x20 }, + { ARE_VALUE, 0, 0x39 }, + range_NumericString_array, + sizeof(range_NumericString_array) + /sizeof(range_NumericString_array[0]), + 0, 0, 0, 0 }; + static asn1cnst_range_t range_PrintableString = { + { ARE_VALUE, 0, 0x20 }, + { ARE_VALUE, 0, 0x7a }, + range_PrintableString_array, + sizeof(range_PrintableString_array) + /sizeof(range_PrintableString_array[0]), + 0, 0, 0, 0 }; + static asn1cnst_range_t range_VisibleString = { + { ARE_VALUE, 0, 0x20 }, + { ARE_VALUE, 0, 0x7e }, + 0, 0, 0, 0, 0, 0 }; + static asn1cnst_range_t range_UTCTime = { + { ARE_VALUE, 0, 0x2b }, + { ARE_VALUE, 0, 0x5a }, + range_UTCTime_array, + sizeof(range_UTCTime_array) + /sizeof(range_UTCTime_array[0]), + 0, 0, 0, 0 }; + static asn1cnst_range_t range_GeneralizedTime = { + { ARE_VALUE, 0, 0x2b }, + { ARE_VALUE, 0, 0x5a }, + range_GeneralizedTime_array, + sizeof(range_GeneralizedTime_array) + /sizeof(range_GeneralizedTime_array[0]), + 0, 0, 0, 0 }; + + switch(expr_type) { + case ASN_STRING_NumericString: + return &range_NumericString; + case ASN_STRING_PrintableString: + return &range_PrintableString; + case ASN_STRING_VisibleString: + return &range_VisibleString; + case ASN_STRING_IA5String: + return &range_uint7; + case ASN_BASIC_OCTET_STRING: + return &range_uint8; + case ASN_BASIC_UTCTime: + return &range_UTCTime; + case ASN_BASIC_GeneralizedTime: + return &range_GeneralizedTime; + default: + break; + } + + return NULL; +} diff --git a/libasn1fix/asn1fix_crange.c b/libasn1fix/asn1fix_crange.c new file mode 100644 index 000000000..17618caf0 --- /dev/null +++ b/libasn1fix/asn1fix_crange.c @@ -0,0 +1,912 @@ +#include +#include +#include + +#undef FATAL +#define FATAL(fmt, args...) do { \ + fprintf(stderr, "FATAL: "); \ + fprintf(stderr, fmt, ##args); \ + fprintf(stderr, "\n"); \ + } while(0) + +void +asn1constraint_range_free(asn1cnst_range_t *cr) { + if(cr) { + int i; + if(cr->elements) { + for(i = 0; i < cr->el_count; i++) + asn1constraint_range_free(cr->elements[i]); + free(cr->elements); + } + free(cr); + } +} +#define _range_free(foo) asn1constraint_range_free(foo) + +static asn1cnst_range_t *_range_new() { + asn1cnst_range_t *r; + r = calloc(1, sizeof(*r)); + if(r) { + r->left.type = ARE_MIN; + r->right.type = ARE_MAX; + } + return r; +} + +static void _range_remove_element(asn1cnst_range_t *range, int idx) { + assert(idx >= 0 && idx < range->el_count); + + assert(!range->elements[idx]->elements); + + _range_free(range->elements[idx]); + + memmove(&range->elements[idx], + &range->elements[idx + 1], + (range->el_count - idx - 1) + * sizeof(range->elements[0]) + ); + range->el_count--; + range->elements[range->el_count] = 0; /* JIC */ + + if(range->el_count == 0) { + range->el_size = 0; + free(range->elements); + range->elements = 0; + } +} + +static int _range_insert(asn1cnst_range_t *into, asn1cnst_range_t *cr) { + + assert(!cr->elements); + + if(into->el_count == into->el_size) { + void *p; + int n = into->el_size?(into->el_size << 1):4; + p = realloc(into->elements, n * sizeof(into->elements[0])); + if(p) { + into->el_size = n; + into->elements = p; + } else { + assert(p); + return -1; + } + } + + into->elements[into->el_count++] = cr; + return 0; +} + +static asn1cnst_range_t *_range_clone(const asn1cnst_range_t *range) { + asn1cnst_range_t *clone; + int i; + + clone = _range_new(); + if(!clone) return NULL; + + *clone = *range; + clone->elements = 0; + clone->el_count = 0; + clone->el_size = 0; + + for(i = 0; i < range->el_count; i++) { + asn1cnst_range_t *r = _range_clone(range->elements[i]); + if(!r || _range_insert(clone, r)) { + _range_free(clone); + _range_free(r); + return NULL; + } + } + + return clone; +} + +static int +_edge_compare(const asn1cnst_edge_t *el, const asn1cnst_edge_t *er) { + + switch(el->type) { + case ARE_MIN: + switch(er->type) { + case ARE_MIN: return 0; + case ARE_MAX: return -1; + case ARE_VALUE: return -1; + } + break; + case ARE_MAX: + switch(er->type) { + case ARE_MIN: return 1; + case ARE_MAX: return 0; + case ARE_VALUE: return 1; + } + break; + case ARE_VALUE: + switch(er->type) { + case ARE_MIN: return 1; + case ARE_MAX: return -1; + case ARE_VALUE: + if(el->value < er->value) + return -1; + if(el->value > er->value) + return 1; + return 0; + } + break; + } + + return 0; +} + +static int +_range_compare(const void *a, const void *b) { + const asn1cnst_range_t *ra = *(const asn1cnst_range_t * const *)a; + const asn1cnst_range_t *rb = *(const asn1cnst_range_t * const *)b; + int ret; + + ret = _edge_compare(&ra->left, &rb->left); + if(!ret) { + ret = _edge_compare(&ra->right, &rb->right); + } + + return ret; +} + +static char * +_edge_value(const asn1cnst_edge_t *edge) { + static char buf[128]; + *buf = '\0'; + switch(edge->type) { + case ARE_MIN: strcpy(buf, "MIN"); break; + case ARE_MAX: strcpy(buf, "MAX"); break; + case ARE_VALUE: + snprintf(buf, sizeof(buf), "%lld", (long long)edge->value); + } + return buf; +} + +static void +_range_print(const asn1cnst_range_t *range) { + + if(_edge_compare(&range->left, &range->right)) { + printf("(%s.", _edge_value(&range->left)); + printf(".%s)", _edge_value(&range->right)); + } else { + printf("(%s)", _edge_value(&range->left)); + } + + if(range->el_count) { + int i; + printf("-=>"); + for(i = 0; i < range->el_count; i++) + _range_print(range->elements[i]); + } + +} + +static int +_edge_is_within(const asn1cnst_range_t *range, const asn1cnst_edge_t *edge) { + int i; + + for(i = -1; i < range->el_count; i++) { + const asn1cnst_range_t *r; + if(i == -1) { + if(range->el_count) continue; + r = range; + } else { + r = range->elements[i]; + } + if(_edge_compare(&r->left, edge) <= 0 + && _edge_compare(&r->right, edge) >= 0) + return 1; + } + + return 0; +} + +static int +_check_edges_within(const asn1cnst_range_t *range, const asn1cnst_range_t *r) { + + if(!_edge_is_within(range, &r->left)) { + FATAL("Constraint value %s at line %d " + "is not within " + "a parent constraint range", + _edge_value(&r->left), + r->left.lineno + ); + return -1; + } + + if(!_edge_is_within(range, &r->right)) { + FATAL("Constraint value %s at line %d " + "is not within " + "a parent constraint range", + _edge_value(&r->right), + r->right.lineno + ); + return -1; + } + + return 0; +} + +static int _range_merge_in(asn1cnst_range_t *into, asn1cnst_range_t *cr) { + asn1cnst_range_t *r; + int prev_count = into->el_count; + int i; + + /* + * Add the element OR all its children "into". + */ + for(i = -1; i < cr->el_count; i++) { + + if(i == -1) { + if(cr->el_count) continue; + r = cr; + } else { + r = cr->elements[i]; + } + + if(_range_insert(into, r)) { + into->el_count = prev_count; /* Undo */ + return -1; + } + } + + if(cr->el_count) { + cr->el_count = 0; + _range_free(cr); + } else { + /* This range is linked into "into". */ + } + + return 0; +} + +static int _range_fill(asn1p_value_t *val, const asn1cnst_range_t *minmax, asn1cnst_edge_t *edge, asn1cnst_range_t *range, enum asn1p_constraint_type_e type, int lineno) { + unsigned char *p, *pend; + + edge->lineno = lineno; + + switch(val->type) { + case ATV_INTEGER: + if(type != ACT_EL_RANGE && type != ACT_CT_SIZE) { + FATAL("Integer %lld value invalid " + "for %s constraint at line %d", + (long long)val->value.v_integer, + asn1p_constraint_type2str(type), lineno); + return -1; + } + edge->type = ARE_VALUE; + edge->value = val->value.v_integer; + return 0; + case ATV_MIN: + if(type != ACT_EL_RANGE && type != ACT_CT_SIZE) { + FATAL("MIN invalid for %s constraint at line %d", + asn1p_constraint_type2str(type), lineno); + return -1; + } + edge->type = ARE_MIN; + if(minmax) *edge = minmax->left; + edge->lineno = lineno; /* Restore lineno */ + return 0; + case ATV_MAX: + if(type != ACT_EL_RANGE && type != ACT_CT_SIZE) { + FATAL("MAX invalid for %s constraint at line %d", + asn1p_constraint_type2str(type), lineno); + return -1; + } + edge->type = ARE_MAX; + if(minmax) *edge = minmax->right; + edge->lineno = lineno; /* Restore lineno */ + return 0; + case ATV_FALSE: + case ATV_TRUE: + if(type != ACT_EL_RANGE) { + FATAL("%s is invalid for %s constraint at line %d", + val->type==ATV_TRUE?"TRUE":"FALSE", + asn1p_constraint_type2str(type), + lineno); + return -1; + } + edge->type = ARE_VALUE; + edge->value = (val->type==ATV_TRUE); + return 0; + case ATV_STRING: + if(type != ACT_CT_FROM) + return 0; + break; + default: + FATAL("Unrecognized constraint element at line %d", + lineno); + return -1; + } + + assert(val->type == ATV_STRING); + + p = val->value.string.buf; + pend = p + val->value.string.size; + if(p == pend) return 0; + + edge->type = ARE_VALUE; + if(val->value.string.size == 1) { + edge->value = *p; + } else { + /* + * Else this is a set: + * (FROM("abcdef")) + * However, (FROM("abc".."def")) is forbidden. + * See also 47.4.4. + */ + asn1_integer_t vmin, vmax; + vmin = vmax = *p; + for(; p < pend; p++) { + asn1cnst_range_t *nr = _range_new(); + int ret; + assert(nr); + + if(*p < vmin) vmin = *p; + if(*p > vmax) vmax = *p; + + ret = _range_insert(range, nr); + assert(ret == 0); + + nr->left.type = ARE_VALUE; + nr->left.value = *p; + nr->left.lineno = lineno; + nr->right = nr->left; + } + edge->value = (edge == &range->right) ? vmin : vmax; + } + + return 0; +} + +/* + * Check if ranges contain common elements. + */ +static int +_range_overlap(const asn1cnst_range_t *ra, const asn1cnst_range_t *rb) { + int lr, rl; + const asn1cnst_edge_t *ra_l = &ra->left; + const asn1cnst_edge_t *ra_r = &ra->right; + const asn1cnst_edge_t *rb_l = &rb->left; + const asn1cnst_edge_t *rb_r = &rb->right; + + assert(_edge_compare(ra_l, ra_r) <= 0); + assert(_edge_compare(rb_l, rb_r) <= 0); + + lr = _edge_compare(ra_l, rb_r); + rl = _edge_compare(ra_r, rb_l); + + /* + * L: |---| + * R: |---| + */ + if(lr > 0) return 0; + + /* + * L: |---| + * R: |---| + */ + if(rl < 0) return 0; + + return 1; +} + +/* + * (MIN..20) x (10..15) = (MIN..9,10..15,16..20) + */ +static asn1cnst_range_t * +_range_split(asn1cnst_range_t *ra, const asn1cnst_range_t *rb) { + asn1cnst_range_t *range, *nr; + int ll, rr; + + assert(ra); + assert(rb); + assert(!ra->el_count); + assert(!rb->el_count); + + if(!_range_overlap(ra, rb)) { + errno = 0; + return 0; + } + + ll = _edge_compare(&ra->left, &rb->left); + rr = _edge_compare(&ra->right, &rb->right); + + /* + * L: |---| + * R: |-------| + */ + if(ll >= 0 && rr <= 0) { + errno = 0; + return 0; + } + + range = _range_new(); + assert(range); + + nr = _range_new(); + assert(nr); + + /* + * L: |---... + * R: |--.. + */ + if(ll < 0) { + nr->left = ra->left; + nr->right = rb->left; + if(nr->right.type == ARE_VALUE) + nr->right.value--; + _range_insert(range, nr); + nr = _range_new(); + assert(nr); + } + + /* + * L: ...---| + * R: ..--| + */ + if(rr > 0) { + nr->left = rb->right; + nr->right = ra->right; + if(nr->left.type == ARE_VALUE) + nr->left.value++; + _range_insert(range, nr); + nr = _range_new(); + assert(nr); + } + + /* + * L: |---| + * R: |-----| + */ + nr->left = ra->left; + nr->right = ra->right; + if(_edge_compare(&ra->left, &rb->left) < 0) + nr->left = rb->left; + if(_edge_compare(&ra->right, &rb->right) > 0) + nr->right = rb->right; + + _range_insert(range, nr); + + return range; +} + +static int +_range_intersection(asn1cnst_range_t *range, const asn1cnst_range_t *with, int strict_edge_check) { + int ret; + int i, j; + + if(with->empty_constraint || range->empty_constraint) { + range->empty_constraint = 1; /* Propagate error */ + return 0; + } + + /* + * This is an AND operation. + */ + + /* If this is the only element, insert it into itself as a child */ + if(range->el_count == 0) { + asn1cnst_range_t *r = _range_new(); + r->left = range->left; + r->right = range->right; + _range_insert(range, r); + assert(range->el_count == 1); + } + + /* + * Make sure we're dealing with sane data. + * G.4.2.3 + */ + if(strict_edge_check) { + for(j = -1; j < with->el_count; j++) { + + if(j == -1) { + if(with->el_count) continue; + if(_check_edges_within(range, with)) + return -1; + } else { + if(_check_edges_within(range, + with->elements[j])) + return -1; + } + } + } + + /* + * Split range in pieces. + */ + + for(i = 0; i < range->el_count; i++) { + for(j = -1; j < with->el_count; j++) { + const asn1cnst_range_t *wel; + asn1cnst_range_t *r; + + if(j == -1) { + if(with->el_count) continue; + wel = with; + } else { + wel = with->elements[j]; + } + + r = _range_split(range->elements[i], wel); + if(r) { + int ec; + /* Substitute the current element with a split */ + _range_remove_element(range, i); + assert(r->el_count); + for(ec = 0; ec < r->el_count; ec++) { + ret = _range_insert(range, r->elements[ec]); + assert(ret == 0); + } + r->el_count = 0; + _range_free(r); + i--; + break; /* Try again from this point */ + } + } + } + + assert(range->el_count); + + /* + * Remove pieces which aren't AND-compatible "with" range. + */ + + for(i = 0; i < range->el_count; i++) { + for(j = -1; j < with->el_count; j++) { + const asn1cnst_range_t *wel; + + if(j == -1) { + if(with->el_count) continue; + wel = with; + } else { + wel = with->elements[j]; + } + + if(_range_overlap(range->elements[i], wel)) + break; + } + if(j == with->el_count) { + _range_remove_element(range, i); + i--; + } + } + + if(range->el_count == 0) + range->empty_constraint = 1; + + return 0; +} + +static int +_range_union(asn1cnst_range_t *range) { + int i; + + qsort(range->elements, range->el_count, sizeof(range->elements[0]), + _range_compare); + + /* + * The range is sorted by the start values. + */ + for(i = 1; i < range->el_count; i++) { + asn1cnst_range_t *ra = range->elements[i - 1]; + asn1cnst_range_t *rb = range->elements[i]; + + if(_range_overlap(ra, rb)) { + if(_edge_compare(&ra->left, &rb->left) < 0) + rb->left = ra->left; + + if(_edge_compare(&ra->right, &rb->right) > 0) + rb->right = ra->right; + } else { + /* + * Still, range may be joined: (1..4)(5..10). + * This logic is valid only for whole numbers + * (i.e., not REAL type, but REAL constraints + * are not PER-visible (X.691, 9.3.12). + */ + if(ra->right.type == ARE_VALUE + && rb->left.type == ARE_VALUE + && (rb->left.value - ra->right.value) == 1) { + /* (1..10) */ + rb->left = ra->left; + } else { + continue; + } + } + + /* + * Squeeze the array by removing the ra. + */ + _range_remove_element(range, i - 1); + + i--; /* Retry from the current point */ + } + + return 0; +} + +static int +_range_canonicalize(asn1cnst_range_t *range) { + + if(range->el_count == 0) { + /* + * Switch left and right edges, make them sorted. + * It might be a mild warning though. + */ + if(_edge_compare(&range->left, &range->right) > 0) { + asn1cnst_edge_t tmp = range->left; + range->left = range->right; + range->right = tmp; + } + + if(range->elements) { + free(range->elements); + range->elements = 0; + } + range->el_size = 0; + return 0; + } + + /* + * Remove duplicates and overlaps by merging them in. + */ + _range_union(range); + + /* Refine the left edge of a parent */ + range->left = range->elements[0]->left; + + /* Refine the right edge of a parent */ + range->right = range->elements[range->el_count - 1]->right; + + /* Remove the child, if it's a single one */ + if(range->el_count == 1) { + _range_remove_element(range, 0); + } + + return 0; +} + +asn1cnst_range_t * +asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constraint_t *ct, enum asn1p_constraint_type_e type, const asn1cnst_range_t *minmax, int *exmet) { + asn1cnst_range_t *range; + asn1cnst_range_t *tmp; + asn1p_value_t *vmin; + asn1p_value_t *vmax; + int expectation_met; + int ret; + int i; + + if(!exmet) { + exmet = &expectation_met; + *exmet = 0; + } + + /* + * Check if the requested constraint is compatible with expression type. + */ + if(asn1constraint_compatible(expr_type, type) != 1) { + errno = EINVAL; + return 0; + } + + /* Check arguments' validity. */ + switch(type) { + case ACT_EL_RANGE: + if(exmet == &expectation_met) + *exmet = 1; + break; + case ACT_CT_FROM: + if(!minmax) { + minmax = asn1constraint_default_alphabet(expr_type); + if(minmax) { + break; + } + } + /* Fall through */ + case ACT_CT_SIZE: + if(!minmax) { + static asn1cnst_range_t mm; + mm.left.type = ARE_VALUE; + mm.left.value = 0; + mm.right.type = ARE_MAX; + minmax = &mm; + } + break; + default: + errno = EINVAL; + return 0; + } + + if(minmax) { + range = _range_clone(minmax); + } else { + range = _range_new(); + } + + if(!ct || range->not_PER_visible) + return range; + + switch(ct->type) { + case ACT_EL_VALUE: + vmin = vmax = ct->value; + break; + case ACT_EL_RANGE: + case ACT_EL_LLRANGE: + case ACT_EL_RLRANGE: + case ACT_EL_ULRANGE: + vmin = ct->range_start; + vmax = ct->range_stop; + break; + case ACT_EL_EXT: + if(!*exmet) { + range->not_PER_visible = 1; + } else { + range->extensible = 1; + } + return range; + case ACT_CT_SIZE: + case ACT_CT_FROM: + if(type == ct->type) { + *exmet = 1; + } else { + range->not_PER_visible = 1; + return range; + } + assert(ct->el_count == 1); + return asn1constraint_compute_PER_range(expr_type, + ct->elements[0], type, minmax, exmet); + case ACT_CA_SET: /* (10..20)(15..17) */ + case ACT_CA_INT: /* SIZE(1..2) ^ FROM("ABCD") */ + + /* AND constraints, one after another. */ + for(i = 0; i < ct->el_count; i++) { + tmp = asn1constraint_compute_PER_range(expr_type, + ct->elements[i], type, + ct->type==ACT_CA_SET?range:minmax, exmet); + if(!tmp) { + _range_free(range); + return NULL; + } + + if(tmp->not_PER_visible) { + if(ct->type == ACT_CA_SET) { + /* + * X.691, #9.3.18: + * Ignore this separate component. + */ + } else { + /* + * X.691, #9.3.19: + * Ignore not PER-visible INTERSECTION + */ + } + _range_free(tmp); + continue; + } + + range->extensible |= tmp->extensible; + + if(tmp->extensible && type == ACT_CT_FROM) { + /* + * X.691, #9.3.10: + * Extensible permitted alphabet constraints + * are not PER-visible. + */ + range->not_PER_visible = 1; + } + + ret = _range_intersection(range, tmp, + ct->type == ACT_CA_SET); + _range_free(tmp); + if(ret) { + _range_free(range); + errno = EPERM; + return NULL; + } + _range_canonicalize(range); + } + + return range; + case ACT_CA_CSV: /* SIZE(1..2, 3..4) */ + case ACT_CA_UNI: /* SIZE(1..2) | FROM("ABCD") */ + + /* Merge everything. Canonicalizator will do union magic */ + for(i = 0; i < ct->el_count; i++) { + tmp = asn1constraint_compute_PER_range(expr_type, + ct->elements[i], type, minmax, exmet); + if(!tmp) { + _range_free(range); + return NULL; + } + + if(tmp->empty_constraint) { + /* Ignore empty constraints */ + _range_free(tmp); + continue; + } + + range->not_PER_visible |= tmp->not_PER_visible; + range->extensible |= tmp->extensible; + + _range_merge_in(range, tmp); + } + + _range_canonicalize(range); + + if(range->not_PER_visible) { + /* + * X.691, #9.3.19: + * If not PER-visible constraint is part of UNION, + * the resulting constraint is not PER-visible. + */ + _range_free(range); + if(minmax) + range = _range_clone(minmax); + else + range = _range_new(); + } + + return range; + case ACT_CA_EXC: /* FROM("ABCD") EXCEPT FROM("AB") */ + /* + * X.691, #9.3.19: + * EXCEPT and the following value set is completely ignored. + */ + assert(ct->el_count >= 1); + _range_free(range); + range = asn1constraint_compute_PER_range(expr_type, + ct->elements[0], type, minmax, exmet); + return range; + default: + range->not_PER_visible = 1; + return range; + } + + + if(!*exmet) { + /* + * Expectation is not met. Return the default range. + */ + range->not_PER_visible = 1; + return range; + } + + _range_free(range); + range = _range_new(); + + ret = _range_fill(vmin, minmax, &range->left, + range, type, ct->_lineno); + ret |= _range_fill(vmax, minmax, &range->right, + range, type, ct->_lineno); + if(ret) { + _range_free(range); + errno = EPERM; + return NULL; + } + + if(minmax) { + asn1cnst_range_t *clone; + + clone = _range_clone(minmax); + + /* Constrain parent type with given data. */ + ret = _range_intersection(clone, range, 1); + _range_free(range); + if(ret) { + _range_free(clone); + errno = EPERM; + return NULL; + } + range = clone; + } + + /* + * Recompute elements's min/max, remove duplicates, etc. + */ + _range_canonicalize(range); + + return range; +} + diff --git a/libasn1fix/asn1fix_crange.h b/libasn1fix/asn1fix_crange.h new file mode 100644 index 000000000..9873e3b20 --- /dev/null +++ b/libasn1fix/asn1fix_crange.h @@ -0,0 +1,59 @@ +#ifndef ASN1FIX_CRANGE_H +#define ASN1FIX_CRANGE_H + +typedef struct asn1cnst_edge_s { + enum asn1cnst_range_edge { + ARE_MIN, + ARE_MAX, + ARE_VALUE, + } type; + int lineno; /* Line where the corresponding token was found */ + asn1_integer_t value; /* Value when type is ARE_VALUE */ +} asn1cnst_edge_t; + +typedef struct asn1cnst_range_s { + asn1cnst_edge_t left; /* MIN from (MIN..10) */ + asn1cnst_edge_t right; /* 10 from (MIN..10) */ + + /* If range is split in parts, these are the parts */ + struct asn1cnst_range_s **elements; + int el_count; + int el_size; + + int empty_constraint; /* If yes, too bad. */ + int extensible; /* Extension marker (...) present. */ + + int not_PER_visible; /* Contains non PER-visible components */ +} asn1cnst_range_t; + +/* + * Compute the PER-visible constraint range. + * + * (expr_type) must have the type of the top-level parent ASN.1 type. + * (required_type) must be one of ACT_EL_RANGE, ACT_CT_SIZE or ACT_CT_FROM. + * (minmax) and (expectation_met) should be 0. + * ERRORS: + * EINVAL: Mandatory arguments missing. + * ENOMEM: Memory allocation failure. + * EPERM: Invalid constraint reference. + */ +asn1cnst_range_t *asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, + const asn1p_constraint_t *ct, + enum asn1p_constraint_type_e required_type, + const asn1cnst_range_t *minmax, + int *expectation_met); +void asn1constraint_range_free(asn1cnst_range_t *); + +/* + * Check that a specific constraint is compatible + * with the given expression type. + */ +int asn1constraint_compatible(asn1p_expr_type_e expr_type, + enum asn1p_constraint_type_e constr_type); + +/* + * Fetch a default alphabet for this type. + */ +asn1cnst_range_t *asn1constraint_default_alphabet(asn1p_expr_type_e expr_type); + +#endif /* ASN1FIX_CRANGE_H */ diff --git a/libasn1fix/asn1fix_export.c b/libasn1fix/asn1fix_export.c index d6bb37b4a..cdae6505f 100644 --- a/libasn1fix/asn1fix_export.c +++ b/libasn1fix/asn1fix_export.c @@ -1,6 +1,9 @@ #include "asn1fix_internal.h" #include "asn1fix_export.h" +extern arg_t a1f_replace_me_with_proper_interface_arg; + + asn1p_expr_t * asn1f_lookup_symbol_ex( asn1p_t *asn, @@ -14,6 +17,9 @@ asn1f_lookup_symbol_ex( arg.asn = asn; arg.mod = *module_rw; arg.expr = expr; + arg.eh = a1f_replace_me_with_proper_interface_arg.eh; + arg.debug = a1f_replace_me_with_proper_interface_arg.debug; + return asn1f_lookup_symbol(&arg, ref, module_rw); } @@ -24,11 +30,15 @@ asn1f_class_access_ex(asn1p_t *asn, asn1p_expr_t *expr, asn1p_ref_t *ref, asn1p_module_t **mod_r) { - static arg_t arg; + arg_t arg; + + memset(&arg, 0, sizeof(arg)); arg.asn = asn; arg.mod = mod; arg.expr = expr; + arg.eh = a1f_replace_me_with_proper_interface_arg.eh; + arg.debug = a1f_replace_me_with_proper_interface_arg.debug; return asn1f_class_access(&arg, ref, mod_r); } @@ -38,11 +48,32 @@ asn1f_find_terminal_type_ex(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, asn1p_module_t **mod_r) { - static arg_t arg; + arg_t arg; + + memset(&arg, 0, sizeof(arg)); arg.asn = asn; arg.mod = mod; arg.expr = expr; + arg.eh = a1f_replace_me_with_proper_interface_arg.eh; + arg.debug = a1f_replace_me_with_proper_interface_arg.debug; return asn1f_find_terminal_type(&arg, expr, mod_r); } + +int +asn1f_fix_dereference_values_ex(asn1p_t *asn, asn1p_module_t *mod, + asn1p_expr_t *expr) { + arg_t arg; + + memset(&arg, 0, sizeof(arg)); + + arg.asn = asn; + arg.mod = mod; + arg.expr = expr; + arg.eh = a1f_replace_me_with_proper_interface_arg.eh; + arg.debug = a1f_replace_me_with_proper_interface_arg.debug; + + return asn1f_fix_dereference_values(&arg); +} + diff --git a/libasn1fix/asn1fix_export.h b/libasn1fix/asn1fix_export.h index 2ade0c9af..7fd9ce113 100644 --- a/libasn1fix/asn1fix_export.h +++ b/libasn1fix/asn1fix_export.h @@ -7,6 +7,12 @@ #include +/* + * Create a human-readable representation of a reference and value. + */ +char const *asn1f_printable_reference(asn1p_ref_t *ref); +char const *asn1f_printable_value(asn1p_value_t *value); + /* * Exportable version of an asn1f_lookup_symbol(). */ @@ -28,5 +34,10 @@ asn1p_expr_t *asn1f_class_access_ex(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *asn1f_find_terminal_type_ex(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, asn1p_module_t **opt_module_r); -#endif /* _ASN1FIX_EXPORT_H_ */ +/* + * Exportable version of asn1f_fix_dereference_values(); + */ +int asn1f_fix_dereference_values_ex(asn1p_t *asn, asn1p_module_t *mod, + asn1p_expr_t *expr); +#endif /* _ASN1FIX_EXPORT_H_ */ diff --git a/libasn1fix/asn1fix_internal.h b/libasn1fix/asn1fix_internal.h index ac543cbb5..c37396339 100644 --- a/libasn1fix/asn1fix_internal.h +++ b/libasn1fix/asn1fix_internal.h @@ -16,6 +16,7 @@ #include #include /* Our lovely ASN.1 parser module */ +#include /* * A definition of a function that will log error messages. @@ -32,6 +33,7 @@ typedef struct arg_s { error_logger_f eh; error_logger_f debug; void *key; /* The next level key */ + enum asn1f_flags flags; } arg_t; /* @@ -51,6 +53,9 @@ typedef struct arg_s { #include "asn1fix_dereft.h" /* Dereference types */ #include "asn1fix_derefv.h" /* Dereference values */ #include "asn1fix_tags.h" /* Tags-related stuff */ +#include "asn1fix_constraint.h" /* Constraint manipulation */ +#include "asn1fix_crange.h" /* Constraint groking, exportable */ +#include "asn1fix_export.h" /* Exported functions */ /* diff --git a/libasn1fix/asn1fix_misc.h b/libasn1fix/asn1fix_misc.h index a586faa88..a90c5bedb 100644 --- a/libasn1fix/asn1fix_misc.h +++ b/libasn1fix/asn1fix_misc.h @@ -4,18 +4,6 @@ #ifndef _ASN1FIX_MISC_H_ #define _ASN1FIX_MISC_H_ -/* - * Return a pointer to the locally held string with human-readable - * definition of the value. - */ -char const *asn1f_printable_value(asn1p_value_t *); - -/* - * Return a pointer to the locally held string with human-readable - * definition of the reference. - */ -char const *asn1f_printable_reference(asn1p_ref_t *); - /* * Recursively invoke a given function over the given expr and all its * children. diff --git a/libasn1fix/asn1fix_value.c b/libasn1fix/asn1fix_value.c index a22fd3dc0..a0560edb9 100644 --- a/libasn1fix/asn1fix_value.c +++ b/libasn1fix/asn1fix_value.c @@ -21,6 +21,7 @@ asn1f_value_resolve(arg_t *arg, asn1p_expr_t *expr) { * 1. Find the terminal type for this assignment. */ type_expr = asn1f_find_terminal_type(arg, expr, 0); + DEBUG("%s(): terminal type %p", __func__, type_expr); if(type_expr == 0) { DEBUG("\tTerminal type for %s not found", expr->Identifier); return -1; From d3d0fbdb12e41145cf72c625b96aaebbd9ba5d74 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 18 Aug 2004 05:43:55 +0000 Subject: [PATCH 0133/1469] last touches git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@133 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 4 ++++ Makefile.in | 4 ++-- asn1c/Makefile.in | 2 -- configure | 1 + configure.in | 1 + libasn1compiler/Makefile.in | 2 -- libasn1fix/Makefile.am | 4 +--- libasn1fix/Makefile.in | 4 +--- libasn1parser/Makefile.in | 2 +- 9 files changed, 11 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index ef2d3fbe7..28f9a7d17 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,8 @@ +0.9: 2004-Aug-12 + + * Reworked subtype constraints handling, aiming at PER-applicability. + 0.8.18: 2004-Aug-12 * Parser: fixed multiple IMPORTS problem (incorrect assertion). diff --git a/Makefile.in b/Makefile.in index 2d797dc24..cce912731 100644 --- a/Makefile.in +++ b/Makefile.in @@ -184,8 +184,8 @@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ SUBDIRS = \ - libasn1parser libasn1print \ - libasn1fix libasn1compiler \ + libasn1parser libasn1fix \ + libasn1print libasn1compiler \ skeletons examples tests \ doc asn1c diff --git a/asn1c/Makefile.in b/asn1c/Makefile.in index 5267aa3a1..244f501e8 100644 --- a/asn1c/Makefile.in +++ b/asn1c/Makefile.in @@ -59,7 +59,6 @@ asn1c_LDADD = $(LDADD) asn1c_DEPENDENCIES = $(top_builddir)/libasn1parser/libasn1parser.la \ $(top_builddir)/libasn1print/libasn1print.la \ $(top_builddir)/libasn1fix/libasn1fix.la \ - $(top_builddir)/libasn1cnst/libasn1cnst.la \ $(top_builddir)/libasn1compiler/libasn1compiler.la DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp @@ -213,7 +212,6 @@ LDADD = \ $(top_builddir)/libasn1parser/libasn1parser.la \ $(top_builddir)/libasn1print/libasn1print.la \ $(top_builddir)/libasn1fix/libasn1fix.la \ - $(top_builddir)/libasn1cnst/libasn1cnst.la \ $(top_builddir)/libasn1compiler/libasn1compiler.la asn1c_SOURCES = asn1c.c \ diff --git a/configure b/configure index 793e98679..096bec4db 100755 --- a/configure +++ b/configure @@ -21409,6 +21409,7 @@ fi; case "$GCC" in yes) + CFLAGS="$CFLAGS -W" CFLAGS="$CFLAGS -Wall" CFLAGS="$CFLAGS -Wshadow" CFLAGS="$CFLAGS -Wcast-qual" diff --git a/configure.in b/configure.in index 7585cedef..d9bfa9f6d 100644 --- a/configure.in +++ b/configure.in @@ -53,6 +53,7 @@ AC_SUBST(ADD_CFLAGS) dnl Add these flags if we're using GCC. case "$GCC" in yes) + CFLAGS="$CFLAGS -W" CFLAGS="$CFLAGS -Wall" CFLAGS="$CFLAGS -Wshadow" CFLAGS="$CFLAGS -Wcast-qual" diff --git a/libasn1compiler/Makefile.in b/libasn1compiler/Makefile.in index d50f04acb..e81539371 100644 --- a/libasn1compiler/Makefile.in +++ b/libasn1compiler/Makefile.in @@ -60,7 +60,6 @@ check_compiler_OBJECTS = check_compiler.$(OBJEXT) am__DEPENDENCIES_1 = libasn1compiler.la check_compiler_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(top_builddir)/libasn1parser/libasn1parser.la \ - $(top_builddir)/libasn1cnst/libasn1cnst.la \ $(top_builddir)/libasn1fix/libasn1fix.la DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp @@ -215,7 +214,6 @@ libasn1compiler_la_SOURCES = \ TESTS = $(check_PROGRAMS) check_compiler_LDADD = $(noinst_LTLIBRARIES) \ $(top_builddir)/libasn1parser/libasn1parser.la \ - $(top_builddir)/libasn1cnst/libasn1cnst.la \ $(top_builddir)/libasn1fix/libasn1fix.la all: all-am diff --git a/libasn1fix/Makefile.am b/libasn1fix/Makefile.am index 937325425..0db2c685f 100644 --- a/libasn1fix/Makefile.am +++ b/libasn1fix/Makefile.am @@ -1,8 +1,7 @@ AM_CFLAGS = @ADD_CFLAGS@ AM_CPPFLAGS = \ - -I$(top_srcdir)/libasn1parser \ - -I$(top_srcdir)/libasn1cnst + -I$(top_srcdir)/libasn1parser noinst_LTLIBRARIES = libasn1fix.la @@ -32,7 +31,6 @@ libasn1fix_la_SOURCES = \ check_PROGRAMS = check_fixer check_fixer_LDADD = $(noinst_LTLIBRARIES) \ - $(top_builddir)/libasn1cnst/libasn1cnst.la \ $(top_builddir)/libasn1parser/libasn1parser.la check_fixer_DEPENDENCIES = $(check_fixer_LDADD) diff --git a/libasn1fix/Makefile.in b/libasn1fix/Makefile.in index 80a91c0e0..3224cd8be 100644 --- a/libasn1fix/Makefile.in +++ b/libasn1fix/Makefile.in @@ -210,8 +210,7 @@ target_os = @target_os@ target_vendor = @target_vendor@ AM_CFLAGS = @ADD_CFLAGS@ AM_CPPFLAGS = \ - -I$(top_srcdir)/libasn1parser \ - -I$(top_srcdir)/libasn1cnst + -I$(top_srcdir)/libasn1parser noinst_LTLIBRARIES = libasn1fix.la libasn1fix_la_LDFLAGS = -all-static @@ -238,7 +237,6 @@ libasn1fix_la_SOURCES = \ asn1fix_constraint_compat.c check_fixer_LDADD = $(noinst_LTLIBRARIES) \ - $(top_builddir)/libasn1cnst/libasn1cnst.la \ $(top_builddir)/libasn1parser/libasn1parser.la check_fixer_DEPENDENCIES = $(check_fixer_LDADD) diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index 4af09101c..93bf68e04 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -546,9 +546,9 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." + -rm -f asn1p_y.h -rm -f asn1p_l.c -rm -f asn1p_y.c - -rm -f asn1p_y.h clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ From 8a3861572f49e19fd79d2feea80427d609694daf Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 18 Aug 2004 05:46:55 +0000 Subject: [PATCH 0134/1469] removed extra semicolon git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@134 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_constraint_compat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libasn1fix/asn1fix_constraint_compat.c b/libasn1fix/asn1fix_constraint_compat.c index 28ebf92ed..10720b5c3 100644 --- a/libasn1fix/asn1fix_constraint_compat.c +++ b/libasn1fix/asn1fix_constraint_compat.c @@ -92,7 +92,7 @@ asn1constraint_compatible(asn1p_expr_type_e expr_type, static asn1cnst_range_t range_ ## foo = { \ { ARE_VALUE, 0, val1 }, \ { ARE_VALUE, 0, val2 }, \ - 0, 0, 0, 0, 0, 0 }; + 0, 0, 0, 0, 0, 0 } asn1cnst_range_t * asn1constraint_default_alphabet(asn1p_expr_type_e expr_type) { From fcf990cb5150f8e01a245ca464747e01253aeffb Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 18 Aug 2004 05:53:22 +0000 Subject: [PATCH 0135/1469] version bump-up git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@135 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 2 +- configure | 2 +- configure.in | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 28f9a7d17..fc8c33b0b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9: 2004-Aug-12 +0.9.1: 2004-Aug-12 * Reworked subtype constraints handling, aiming at PER-applicability. diff --git a/configure b/configure index 096bec4db..c487bd54f 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.8.18 + VERSION=0.9.1 cat >>confdefs.h <<_ACEOF diff --git a/configure.in b/configure.in index d9bfa9f6d..df8d6d889 100644 --- a/configure.in +++ b/configure.in @@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_SYSTEM AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.8.18) +AM_INIT_AUTOMAKE(asn1c, 0.9.1) AC_SUBST(PATH) From 570ec97ea802c4804577e38dce8d6146112ebc41 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 18 Aug 2004 08:23:43 +0000 Subject: [PATCH 0136/1469] proper computations git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@136 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ber_tlv_tag.c | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/skeletons/ber_tlv_tag.c b/skeletons/ber_tlv_tag.c index 2664b9061..f7df191fc 100644 --- a/skeletons/ber_tlv_tag.c +++ b/skeletons/ber_tlv_tag.c @@ -104,7 +104,7 @@ der_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { ber_tlv_tag_t tval = BER_TAG_VALUE(tag); uint8_t *buf = (uint8_t *)bufp; uint8_t *end; - size_t computed_size; + size_t required_size; int i; if(tval <= 30) { @@ -118,29 +118,26 @@ der_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { /* * Compute the size of the subsequent bytes. - * The routine is written so every floating-point - * operation is done at compile time. - * Note, there is a subtle problem lurking here, - * could you guess where it is? :) - * Hint: what happens when ((8*sizeof(tag))%7) == 0? */ - computed_size = 1 + 8 * sizeof(tag) / 7; - for(i = (8*sizeof(tag)) - ((8*sizeof(tag))%7); i >= 7; i -= 7) { - if((tval >> i) & 0x7F) break; - computed_size--; + for(required_size = 1, i = 7; i < 8 * sizeof(tag); i += 7) { + if(tag >> i) + required_size++; + else + break; } + if(size < required_size) + return required_size + 1; + /* * Fill in the buffer, space permitting. */ - if(size > computed_size) - end = buf + computed_size; - else - end = buf + size; - for((void)i; buf < end; i -= 7, buf++) { - *buf = 0x80 | ((tval>>i) & 0x7F); + end = buf + required_size - 1; + for(i -= 7; buf <= end; i -= 7, buf++) { + *buf = 0x80 | ((tval >> i) & 0x7F); } + *end &= 0x7F; /* Clear the last high bit */ - return computed_size + 1; + return required_size + 1; } From 279e1925d668f5aab8b283b479cfbd8521afaf2c Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 18 Aug 2004 09:01:45 +0000 Subject: [PATCH 0137/1469] even better git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@137 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ber_tlv_tag.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/skeletons/ber_tlv_tag.c b/skeletons/ber_tlv_tag.c index f7df191fc..d7630c4dd 100644 --- a/skeletons/ber_tlv_tag.c +++ b/skeletons/ber_tlv_tag.c @@ -17,7 +17,7 @@ ber_fetch_tag(void *ptr, size_t size, ber_tlv_tag_t *tag_r) { val = *(uint8_t *)ptr; tclass = (val >> 6); - if((val &= 31) != 31) { + if((val &= 0x1F) != 0x1F) { /* * Simple form: everything encoded in a single octet. * Tag Class is encoded using two least significant bits. @@ -31,8 +31,8 @@ ber_fetch_tag(void *ptr, size_t size, ber_tlv_tag_t *tag_r) { * The MSB is 0 if it is the last octet of the tag. */ for(val = 0, ((char *)ptr)++, skipped = 2; - skipped < size; ((char *)ptr)++, skipped++) { - unsigned oct = *(uint8_t *)ptr; + skipped <= size; ((char *)ptr)++, skipped++) { + unsigned int oct = *(uint8_t *)ptr; if(oct & 0x80) { val = (val << 7) | (oct & 0x7F); /* @@ -47,7 +47,8 @@ ber_fetch_tag(void *ptr, size_t size, ber_tlv_tag_t *tag_r) { return -1; } } else { - *tag_r = (val << 9) | (oct << 2) | tclass; + val = (val << 7) | oct; + *tag_r = (val << 2) | tclass; return skipped; } } @@ -105,7 +106,7 @@ der_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { uint8_t *buf = (uint8_t *)bufp; uint8_t *end; size_t required_size; - int i; + size_t i; if(tval <= 30) { /* Encoded in 1 octet */ @@ -119,8 +120,8 @@ der_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { /* * Compute the size of the subsequent bytes. */ - for(required_size = 1, i = 7; i < 8 * sizeof(tag); i += 7) { - if(tag >> i) + for(required_size = 1, i = 7; i < 8 * sizeof(tval); i += 7) { + if(tval >> i) required_size++; else break; @@ -133,10 +134,9 @@ der_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { * Fill in the buffer, space permitting. */ end = buf + required_size - 1; - for(i -= 7; buf <= end; i -= 7, buf++) { + for(i -= 7; buf < end; i -= 7, buf++) *buf = 0x80 | ((tval >> i) & 0x7F); - } - *end &= 0x7F; /* Clear the last high bit */ + *buf = (tval & 0x7F); /* Last octet without high bit */ return required_size + 1; } From 19aae985748413058fb33b67d759c0e882f7209f Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 18 Aug 2004 09:05:12 +0000 Subject: [PATCH 0138/1469] sucked back 0.8.19 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@138 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ChangeLog b/ChangeLog index fc8c33b0b..1b9dec454 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,11 @@ * Reworked subtype constraints handling, aiming at PER-applicability. +0.8.19: 2004-Aug-18 + + * Fixed BER encoder (problem encoding large tag values) + (Severity: medium, Security impact: low) + 0.8.18: 2004-Aug-12 * Parser: fixed multiple IMPORTS problem (incorrect assertion). From 221a0b00fa83fc07fa330fd4e0970b9ff04fef53 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 19 Aug 2004 13:24:58 +0000 Subject: [PATCH 0139/1469] updated manual git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@139 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/asn1c.1 | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/asn1c/asn1c.1 b/asn1c/asn1c.1 index 1b58f4df9..1e4a5153c 100644 --- a/asn1c/asn1c.1 +++ b/asn1c/asn1c.1 @@ -17,10 +17,10 @@ and accompanying routines to perform data encoding and decoding. \-E \-F \-L -\-N \-P -.RI "\-S " directory \-R +.RI "\-S " directory +.RI "\-t " data-string .TP .B Language Options .br @@ -29,6 +29,10 @@ and accompanying routines to perform data encoding and decoding. \-fno-c99 \-funnamed-unions .TP +.B Output Options +.br +\-print-constraints +.TP .B Warning Options .br \-Werror @@ -38,7 +42,7 @@ and accompanying routines to perform data encoding and decoding. .SH OVERALL OPTIONS .TP .B \-E -Stop after the parsing stage. The output is reconstructed ASN.1 +Stop after the parsing stage. The output is a reconstructed ASN.1 specification code, which is sent to the standard output. .TP .B \-F @@ -53,21 +57,20 @@ Generate "-- #line" comments in .B -E output. .TP -.B \-N -Do not generate certain type of comments in -.B -E -output. -.TP .B \-P Dump the compiled output to the standard output instead of creating the target language files on disk. .TP -.B \-S directory -Use the specified directory with ASN.1 skeleton files. -.TP .B \-R Restrict the compiler to generate only the ASN.1 tables, omitting the usual support code. +.TP +.B \-S directory +Use the specified directory with ASN.1 skeleton files. +.TP +.B \-t data-string +Interpret the data-string as a sequence of hexadecimal values representing +the start of BER TLV encoding. Print the human readable explanation. .SH LANGUAGE OPTIONS .TP .B \-ftypes88 @@ -82,6 +85,11 @@ Disable use of certain C99 extensions, like designated initializers. .TP .B \-funnamed-unions Enable unnamed unions in structures definitions. +.SH OUTPUT OPTIONS +.TP +.B \-print-constraints +When -EF are also specified, this option forces the compiler to explain +its internal understanding of subtype constraints. .SH WARNING OPTIONS .TP .B \-Werror From 6f2a63bd86272c3363b9c7dd2e00419b0662e98e Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 19 Aug 2004 13:25:16 +0000 Subject: [PATCH 0140/1469] switch places git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@140 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/asn1c.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index c8a58272d..4c8d599f7 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -264,9 +264,9 @@ usage(char *av0) { "\t-L\tGenerate \"-- #line\" comments in -E output\n" "\n" "\t-P \tConcatenate and print the compiled text\n" + "\t-R \tRestrict output (tables only, no support code)\n" "\t-S \tDirectory with support (skeleton?) files\n" "\t \t(Default is \"%s\")\n" - "\t-R \tRestrict output (tables only, no support code)\n" "\n" "\t-t \tDecode the given tag[/length] sequence\n" "\n" From 970f61dee43f8115b5049d028c068fa9c80b8c18 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 19 Aug 2004 13:25:52 +0000 Subject: [PATCH 0141/1469] boolean has change its type git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@141 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-30.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asn1c/tests/check-30.c b/asn1c/tests/check-30.c index 20dc007da..014a9f0ea 100644 --- a/asn1c/tests/check-30.c +++ b/asn1c/tests/check-30.c @@ -164,7 +164,7 @@ check(int is_ok, uint8_t *buf, int size, size_t consumed) { assert(t.b.size == 3); assert(strcmp(t.b.buf, "xyz") == 0); if(buf == buf3) { - assert(t.c->value); + assert(t.c); } else { assert(t.c == 0); } From af9cf13e869be5140af18c346afafb77dec690c7 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 19 Aug 2004 13:26:36 +0000 Subject: [PATCH 0142/1469] BOOLEAN and NULL have changed their types git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@142 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/BOOLEAN.c | 20 ++++++++++---------- skeletons/BOOLEAN.h | 9 ++++++--- skeletons/NULL.h | 14 ++++++++------ 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c index eb89c9c26..4f9b32444 100644 --- a/skeletons/BOOLEAN.c +++ b/skeletons/BOOLEAN.c @@ -30,16 +30,16 @@ asn1_TYPE_descriptor_t asn1_DEF_BOOLEAN = { */ ber_dec_rval_t BOOLEAN_decode_ber(asn1_TYPE_descriptor_t *td, - void **bool_structure, void *buf_ptr, size_t size, + void **bool_value, void *buf_ptr, size_t size, int tag_mode) { - BOOLEAN_t *st = (BOOLEAN_t *)*bool_structure; + BOOLEAN_t *st = (BOOLEAN_t *)*bool_value; ber_dec_rval_t rval; ber_dec_ctx_t ctx = { 0, 0, 0, 0 }; ber_tlv_len_t length; ber_tlv_len_t lidx; if(st == NULL) { - (void *)st = *bool_structure = CALLOC(1, sizeof(*st)); + (void *)st = *bool_value = CALLOC(1, sizeof(*st)); if(st == NULL) { rval.code = RC_FAIL; rval.consumed = 0; @@ -71,22 +71,22 @@ BOOLEAN_decode_ber(asn1_TYPE_descriptor_t *td, /* * Compute boolean value. */ - for(st->value = 0, lidx = 0; - (lidx < length) && st->value == 0; lidx++) { + for(*st = 0, lidx = 0; + (lidx < length) && *st == 0; lidx++) { /* * Very simple approach: read bytes until the end or * value is already TRUE. * BOOLEAN is not supposed to contain meaningful data anyway. */ - st->value |= ((uint8_t *)buf_ptr)[lidx]; + *st |= ((uint8_t *)buf_ptr)[lidx]; } rval.code = RC_OK; rval.consumed += length; - ASN_DEBUG("Took %ld/%ld bytes to encode %s, value=%ld", + ASN_DEBUG("Took %ld/%ld bytes to encode %s, value=%d", (long)rval.consumed, (long)length, - td->name, (long)st->value); + td->name, *st); return rval; } @@ -109,7 +109,7 @@ BOOLEAN_encode_der(asn1_TYPE_descriptor_t *td, void *sptr, uint8_t bool_value; ssize_t ret; - bool_value = st->value?0xff:0; /* 0xff mandated by DER */ + bool_value = *st?0xff:0; /* 0xff mandated by DER */ ret = cb(&bool_value, 1, app_key); if(ret == -1) { erval.encoded = -1; @@ -133,7 +133,7 @@ BOOLEAN_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, (void)ilevel; /* Unused argument */ if(st) { - if(st->value) + if(*st) return cb("TRUE", 4, app_key); else return cb("FALSE", 5, app_key); diff --git a/skeletons/BOOLEAN.h b/skeletons/BOOLEAN.h index 234e9f8e7..6ad69a451 100644 --- a/skeletons/BOOLEAN.h +++ b/skeletons/BOOLEAN.h @@ -7,9 +7,12 @@ #include -typedef struct BOOLEAN { - int value; -} BOOLEAN_t; +/* + * The underlying integer may contain various values, but everything + * non-zero is capped to 0xff by the DER encoder. The BER decoder may + * yield non-zero values different from 1, beware. + */ +typedef int BOOLEAN_t; extern asn1_TYPE_descriptor_t asn1_DEF_BOOLEAN; diff --git a/skeletons/NULL.h b/skeletons/NULL.h index 14f5ffab7..003a5a63d 100644 --- a/skeletons/NULL.h +++ b/skeletons/NULL.h @@ -2,18 +2,20 @@ * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ -#ifndef _NULL_H_ -#define _NULL_H_ +#ifndef ASN_TYPE_NULL_H +#define ASN_TYPE_NULL_H #include -typedef struct NULL_s { - int value; -} NULL_t; +/* + * The value of the NULL type is meaningless: see BOOLEAN if you want to + * carry true/false semantics. + */ +typedef int NULL_t; extern asn1_TYPE_descriptor_t asn1_DEF_NULL; der_type_encoder_f NULL_encode_der; asn_struct_print_f NULL_print; -#endif /* _NULL_H_ */ +#endif /* NULL_H */ From d3da8510e2d617e27cc907452ea3405a73852553 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 19 Aug 2004 13:26:54 +0000 Subject: [PATCH 0143/1469] testing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@143 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/Makefile.am | 5 +++-- skeletons/tests/Makefile.in | 25 +++++++++++++++++-------- skeletons/tests/check-GeneralizedTime.c | 16 +++++++++++++--- skeletons/tests/check-INTEGER.c | 12 ++++++------ skeletons/tests/check-OIDs.c | 17 +++++++++-------- skeletons/tests/check-UTCTime.c | 16 +++++++++++++--- 6 files changed, 61 insertions(+), 30 deletions(-) diff --git a/skeletons/tests/Makefile.am b/skeletons/tests/Makefile.am index 4efbcec44..b186fe049 100644 --- a/skeletons/tests/Makefile.am +++ b/skeletons/tests/Makefile.am @@ -1,9 +1,10 @@ -AM_CPPFLAGS = -I${top_srcdir}/skeletons +AM_CPPFLAGS = -I$(top_srcdir)/skeletons check_PROGRAMS = \ + check-ber_tlv_tag \ check-OIDs \ check-GeneralizedTime \ check-UTCTime \ check-INTEGER -TESTS = ${check_PROGRAMS} +TESTS = $(check_PROGRAMS) diff --git a/skeletons/tests/Makefile.in b/skeletons/tests/Makefile.in index dbac6f7c3..57759e92c 100644 --- a/skeletons/tests/Makefile.in +++ b/skeletons/tests/Makefile.in @@ -13,7 +13,7 @@ # PARTICULAR PURPOSE. @SET_MAKE@ -SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c check-UTCTime.c +SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c check-UTCTime.c check-ber_tlv_tag.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ @@ -38,8 +38,9 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ -check_PROGRAMS = check-OIDs$(EXEEXT) check-GeneralizedTime$(EXEEXT) \ - check-UTCTime$(EXEEXT) check-INTEGER$(EXEEXT) +check_PROGRAMS = check-ber_tlv_tag$(EXEEXT) check-OIDs$(EXEEXT) \ + check-GeneralizedTime$(EXEEXT) check-UTCTime$(EXEEXT) \ + check-INTEGER$(EXEEXT) subdir = skeletons/tests DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -61,13 +62,17 @@ check_OIDs_LDADD = $(LDADD) check_UTCTime_SOURCES = check-UTCTime.c check_UTCTime_OBJECTS = check-UTCTime.$(OBJEXT) check_UTCTime_LDADD = $(LDADD) +check_ber_tlv_tag_SOURCES = check-ber_tlv_tag.c +check_ber_tlv_tag_OBJECTS = check-ber_tlv_tag.$(OBJEXT) +check_ber_tlv_tag_LDADD = $(LDADD) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/check-GeneralizedTime.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-INTEGER.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-OIDs.Po \ -@AMDEP_TRUE@ ./$(DEPDIR)/check-UTCTime.Po +@AMDEP_TRUE@ ./$(DEPDIR)/check-UTCTime.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/check-ber_tlv_tag.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ @@ -77,9 +82,9 @@ CCLD = $(CC) LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c \ - check-UTCTime.c + check-UTCTime.c check-ber_tlv_tag.c DIST_SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c \ - check-UTCTime.c + check-UTCTime.c check-ber_tlv_tag.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -193,8 +198,8 @@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ -AM_CPPFLAGS = -I${top_srcdir}/skeletons -TESTS = ${check_PROGRAMS} +AM_CPPFLAGS = -I$(top_srcdir)/skeletons +TESTS = $(check_PROGRAMS) all: all-am .SUFFIXES: @@ -247,6 +252,9 @@ check-OIDs$(EXEEXT): $(check_OIDs_OBJECTS) $(check_OIDs_DEPENDENCIES) check-UTCTime$(EXEEXT): $(check_UTCTime_OBJECTS) $(check_UTCTime_DEPENDENCIES) @rm -f check-UTCTime$(EXEEXT) $(LINK) $(check_UTCTime_LDFLAGS) $(check_UTCTime_OBJECTS) $(check_UTCTime_LDADD) $(LIBS) +check-ber_tlv_tag$(EXEEXT): $(check_ber_tlv_tag_OBJECTS) $(check_ber_tlv_tag_DEPENDENCIES) + @rm -f check-ber_tlv_tag$(EXEEXT) + $(LINK) $(check_ber_tlv_tag_LDFLAGS) $(check_ber_tlv_tag_OBJECTS) $(check_ber_tlv_tag_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -258,6 +266,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-INTEGER.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-OIDs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-UTCTime.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-ber_tlv_tag.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ diff --git a/skeletons/tests/check-GeneralizedTime.c b/skeletons/tests/check-GeneralizedTime.c index 65882d45a..59474e421 100644 --- a/skeletons/tests/check-GeneralizedTime.c +++ b/skeletons/tests/check-GeneralizedTime.c @@ -1,6 +1,6 @@ #define __NO_ASN_TABLE__ -#include "../GeneralizedTime.c" -#include "../constraints.c" +#include +#include static void check(char *time_str, time_t expect, int as_gmt) { @@ -45,7 +45,7 @@ rcheck(time_t tloc, const char *expect, int force_gmt) { assert(expect); printf("[%s] vs [%s] (%d)\n", gt->buf, expect, force_gmt); - assert(gt->size == strlen(gt->buf)); + assert(gt->size == (int)strlen(gt->buf)); assert(!strcmp(gt->buf, expect)); } else { assert(!expect); @@ -55,6 +55,8 @@ rcheck(time_t tloc, const char *expect, int force_gmt) { int main(int ac, char **av) { + (void)av; + check("200401250", -1, 0); check("2004012509300", -1, 0); check("20040125093000-", -1, 0); @@ -98,5 +100,13 @@ main(int ac, char **av) { der_enc_rval_t OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { der_enc_rval_t erval; + + (void)td; + (void)ptr; + (void)tag_mode; + (void)tag; + (void)cb; + (void)app_key; + return erval; } diff --git a/skeletons/tests/check-INTEGER.c b/skeletons/tests/check-INTEGER.c index 5aa400d54..a7edb73ea 100644 --- a/skeletons/tests/check-INTEGER.c +++ b/skeletons/tests/check-INTEGER.c @@ -1,9 +1,9 @@ -#include "../INTEGER.c" -#include "../ber_decoder.c" -#include "../ber_tlv_length.c" -#include "../ber_tlv_tag.c" -#include "../der_encoder.c" -#include "../constraints.c" +#include +#include +#include +#include +#include +#include static char *shared_scratch_start; diff --git a/skeletons/tests/check-OIDs.c b/skeletons/tests/check-OIDs.c index 97ed33ff1..05d34ee04 100644 --- a/skeletons/tests/check-OIDs.c +++ b/skeletons/tests/check-OIDs.c @@ -1,11 +1,12 @@ -#include "../OBJECT_IDENTIFIER.c" -#include "../RELATIVE-OID.c" -#include "../INTEGER.c" -#include "../ber_decoder.c" -#include "../ber_tlv_length.c" -#include "../ber_tlv_tag.c" -#include "../der_encoder.c" -#include "../constraints.c" +#include +#include +#include +#include +#include +#include +#include +#include + #include static int diff --git a/skeletons/tests/check-UTCTime.c b/skeletons/tests/check-UTCTime.c index 99ea4feb1..1bd49b3c2 100644 --- a/skeletons/tests/check-UTCTime.c +++ b/skeletons/tests/check-UTCTime.c @@ -1,8 +1,8 @@ #define __NO_ASN_TABLE__ -#include "../UTCTime.c" +#include #define __NO_ASSERT_H__ -#include "../GeneralizedTime.c" -#include "../constraints.c" +#include +#include static void check(char *time_str, time_t sample, int as_gmt) { @@ -35,6 +35,8 @@ check(char *time_str, time_t sample, int as_gmt) { int main(int ac, char **av) { + (void)av; + check("0401250", -1, 0); check("0401250930", -1, 0); /* "Z" or "(+|-)hhmm" required */ check("04012509300", -1, 0); @@ -65,5 +67,13 @@ main(int ac, char **av) { der_enc_rval_t OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { der_enc_rval_t erval; + + (void)td; + (void)ptr; + (void)tag_mode; + (void)tag; + (void)cb; + (void)app_key; + return erval; } From 044e8d4e69c05fd679e64139787cdabf1c62fc32 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 19 Aug 2004 13:27:34 +0000 Subject: [PATCH 0144/1469] der->ber git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@144 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ber_tlv_tag.c | 2 +- skeletons/ber_tlv_tag.h | 4 ++-- skeletons/der_encoder.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/skeletons/ber_tlv_tag.c b/skeletons/ber_tlv_tag.c index d7630c4dd..d69ba31b0 100644 --- a/skeletons/ber_tlv_tag.c +++ b/skeletons/ber_tlv_tag.c @@ -100,7 +100,7 @@ ber_tlv_tag_string(ber_tlv_tag_t tag) { ssize_t -der_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { +ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { int tclass = BER_TAG_CLASS(tag); ber_tlv_tag_t tval = BER_TAG_VALUE(tag); uint8_t *buf = (uint8_t *)bufp; diff --git a/skeletons/ber_tlv_tag.h b/skeletons/ber_tlv_tag.h index 504197029..22152ffdc 100644 --- a/skeletons/ber_tlv_tag.h +++ b/skeletons/ber_tlv_tag.h @@ -42,11 +42,11 @@ char *ber_tlv_tag_string(ber_tlv_tag_t tag); ssize_t ber_fetch_tag(void *bufptr, size_t size, ber_tlv_tag_t *tag_r); /* - * This function serializes the tag (T from TLV) in DER format. + * This function serializes the tag (T from TLV) in BER format. * It always return number of bytes necessary to represent the tag, * it is a caller's responsibility to check the return value * against the supplied buffer's size. */ -ssize_t der_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufptr, size_t size); +ssize_t ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufptr, size_t size); #endif /* _BER_TLV_TAG_H_ */ diff --git a/skeletons/der_encoder.c b/skeletons/der_encoder.c index ddd0bf86b..fbdccec4d 100644 --- a/skeletons/der_encoder.c +++ b/skeletons/der_encoder.c @@ -134,7 +134,7 @@ der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len, ssize_t tmp; /* Serialize tag (T from TLV) into possibly zero-length buffer */ - tmp = der_tlv_tag_serialize(tag, buf, buf_size); + tmp = ber_tlv_tag_serialize(tag, buf, buf_size); if(tmp == -1 || tmp > (ssize_t)sizeof(buf)) return -1; size += tmp; From 53cd87bff8497e4c735b1c865ded9efaf4a75a96 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 19 Aug 2004 13:27:57 +0000 Subject: [PATCH 0145/1469] new file git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@145 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/Makefile.am | 2 +- skeletons/Makefile.in | 2 +- skeletons/file-dependencies | 50 ++++++++++ skeletons/tests/check-ber_tlv_tag.c | 146 ++++++++++++++++++++++++++++ 4 files changed, 198 insertions(+), 2 deletions(-) create mode 100644 skeletons/file-dependencies create mode 100644 skeletons/tests/check-ber_tlv_tag.c diff --git a/skeletons/Makefile.am b/skeletons/Makefile.am index 4a01bf3d2..a029345ca 100644 --- a/skeletons/Makefile.am +++ b/skeletons/Makefile.am @@ -1,7 +1,7 @@ SUBDIRS = tests -dist_pkgdata_DATA = *.[ch] +dist_pkgdata_DATA = *.[ch] file-dependencies uninstall-local: -@echo -n " " -rm -f -r $(DESTDIR)$(pkgdatadir) diff --git a/skeletons/Makefile.in b/skeletons/Makefile.in index 53ddc1022..ed4c177a6 100644 --- a/skeletons/Makefile.in +++ b/skeletons/Makefile.in @@ -173,7 +173,7 @@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ SUBDIRS = tests -dist_pkgdata_DATA = *.[ch] +dist_pkgdata_DATA = *.[ch] file-dependencies all: all-recursive .SUFFIXES: diff --git a/skeletons/file-dependencies b/skeletons/file-dependencies new file mode 100644 index 000000000..4c19c7a5f --- /dev/null +++ b/skeletons/file-dependencies @@ -0,0 +1,50 @@ +# This file contains dependency information for the asn1c compiler's skeletons. +# Feel free to edit this file. +# The format is like this: +# ... +# +# $Id$ +# + +BIT_STRING.h BIT_STRING.c +BMPString.h BMPString.c +BOOLEAN.h BOOLEAN.c +ENUMERATED.h ENUMERATED.c INTEGER.h +GeneralString.h GeneralString.c +GeneralizedTime.h GeneralizedTime.c +GraphicString.h GraphicString.c +IA5String.h IA5String.c +INTEGER.h INTEGER.c +ISO646String.h ISO646String.c +NULL.h NULL.c BOOLEAN.h +NativeEnumerated.h NativeEnumerated.c NativeInteger.h +NativeInteger.h NativeInteger.c INTEGER.h +NumericString.h NumericString.c +OBJECT_IDENTIFIER.h OBJECT_IDENTIFIER.c INTEGER.h +ObjectDescriptor.h ObjectDescriptor.c GraphicString.h +PrintableString.h PrintableString.c +RELATIVE-OID.h RELATIVE-OID.c OBJECT-IDENTIFIER.h +T61String.h T61String.c +TeletexString.h TeletexString.c +UTCTime.h UTCTime.c GeneralizedTime.h +UTF8String.h UTF8String.c +UniversalString.h UniversalString.c +VideotexString.h VideotexString.c +VisibleString.h VisibleString.c +asn_SEQUENCE_OF.h asn_SEQUENCE_OF.c asn_SET_OF.h +asn_SET_OF.h asn_SET_OF.c +constr_CHOICE.h constr_CHOICE.c +constr_SEQUENCE.h constr_SEQUENCE.c +constr_SEQUENCE_OF.h constr_SEQUENCE_OF.c asn_SEQUENCE_OF.h +constr_SET.h constr_SET.c +constr_SET_OF.h constr_SET_OF.c asn_SET_OF.h + +COMMON-FILES: # This is a special section +asn_types.h +OCTET_STRING.h OCTET_STRING.c # This one is used too widely +ber_decoder.h ber_decoder.c +ber_tlv_length.h ber_tlv_length.c +ber_tlv_tag.h ber_tlv_tag.c +constr_TYPE.h constr_TYPE.c +constraints.h constraints.c +der_encoder.h der_encoder.c diff --git a/skeletons/tests/check-ber_tlv_tag.c b/skeletons/tests/check-ber_tlv_tag.c new file mode 100644 index 000000000..41184202c --- /dev/null +++ b/skeletons/tests/check-ber_tlv_tag.c @@ -0,0 +1,146 @@ +#include +#include + +#include + +struct tag_control_s { + int taglen; + uint8_t tagbuf[8]; + + int correctly_decodable; + + int tclass; /* Tag class */ + ber_tlv_tag_t tvalue; /* Tag value */ + int constr; /* Is it constructed? */ +} control[] = { + { 1, { 0x2 << 6 }, 1, ASN_TAG_CLASS_CONTEXT, 0, 0 }, + { 1, { 0x2 << 6 | 32 | 1 }, 1, ASN_TAG_CLASS_CONTEXT, 1, 1 }, + { 1, { 0x3 << 6 | 30 }, 1, ASN_TAG_CLASS_PRIVATE, 30, 0 }, + { 1, { 29 }, 1, ASN_TAG_CLASS_UNIVERSAL, 29, 0 }, + { 1, { 0xbf, 31 }, 0, ASN_TAG_CLASS_CONTEXT, 31, 1 }, + { 2, { 0xbf, 31 }, 1, ASN_TAG_CLASS_CONTEXT, 31, 1 }, + { 2, { 0xbf, 127 }, 1, ASN_TAG_CLASS_CONTEXT, 127, 1 }, + { 2, { 0xbf, 129 }, 0, ASN_TAG_CLASS_CONTEXT, 127, 1 }, + { 3, { 0xbf, 129, 0 }, 1, ASN_TAG_CLASS_CONTEXT, 128, 1 }, + { 3, { 0xbf, 129, 1 }, 1, ASN_TAG_CLASS_CONTEXT, 129, 1 }, + { 3, { 0xbf, 130, 0 }, 1, ASN_TAG_CLASS_CONTEXT, 256, 1 }, + { 3, { 0xbf, 130, 1 }, 1, ASN_TAG_CLASS_CONTEXT, 257, 1 }, + { 3, { 0xbf, 130, 0x81 }, 0, 0, 0, 0 }, + { 4, { 0xbf, 130, 0x81, 2 }, 1, ASN_TAG_CLASS_CONTEXT, 32898, 1 }, + { 4, { 0xbf, 130, 0x81, 0x82 }, 0, ASN_TAG_CLASS_CONTEXT, 32898, 1 }, + { 5, { 0x1f, 130, 0x81, 0x82, 1 }, 1, 0, 4210945, 0 }, + { 5, { 0x1f, 130, 0x81, 0x82, 2 }, 1, 0, 4210946, 0 }, + { 5, { 0x1f, 0xff, 0x81, 0x82, 2 }, 1, 0, 266354946, 0 }, + { 6, { 0x1f, 0xff, 0xff, 0x82, 0x80, 1 }, -1, 0, 266354946, 0 }, + { 7, { 0x1f, 0x8E, 0x87, 0xAA, 0x95, 0x99, 3}, -1, 0, 4000000000UL, 0 }, +}; + + +static void check_decode(struct tag_control_s *ctrl); +static void check_encode(struct tag_control_s *ctrl); + +int +main() { + size_t i; + + for(i = 0; i < sizeof(control) / sizeof(control[0]); i++) { + check_decode(&control[i]); + check_encode(&control[i]); + } + + return 0; +} + +static void +check_decode(struct tag_control_s *ctrl) { + ber_tlv_tag_t tag = 123; + ber_tlv_tag_t tag1 = 124; + ber_tlv_tag_t tag2 = 125; + ssize_t size; + + if(ctrl->correctly_decodable < 1) { + size = ber_fetch_tag(ctrl->tagbuf, ctrl->taglen, &tag1); + assert(size == ctrl->correctly_decodable); + return; + } + + printf("Expecting "); + tag = (ctrl->tvalue << 2) | ctrl->tclass; + ber_tlv_tag_fwrite(tag, stdout); + printf(", got "); + + size = ber_fetch_tag(ctrl->tagbuf, 0, &tag1); + assert(size == 0); + + size = ber_fetch_tag(ctrl->tagbuf, ctrl->taglen, &tag1); + assert(size == ctrl->taglen); + + size = ber_fetch_tag(ctrl->tagbuf, ctrl->taglen + 10, &tag2); + assert(size == ctrl->taglen); + + ber_tlv_tag_fwrite(tag1, stdout); + printf("\n"); + + assert(tag1 == tag2); + assert(tag == tag1); + + assert(ctrl->constr == BER_TLV_CONSTRUCTED(ctrl->tagbuf)); +} + + + +static void +check_encode(struct tag_control_s *ctrl) { + uint8_t buf[16]; + ber_tlv_tag_t tag; + int Filler = 0xDA; + ssize_t size; + ssize_t i; + + tag = ctrl->tvalue << 2 | ctrl->tclass; + + /* + * Testing buffer overruns. + */ + for(i = 0; i < (int)sizeof(buf); i++) { + int j; + + memset(buf, Filler, sizeof(buf)); + + size = ber_tlv_tag_serialize(tag, buf, i); + assert(size < (int)sizeof(buf)); + + if(size <= i) { + for(j = 0; j < size; j++) assert(buf[j] != Filler); + } else { + j = i; + } + for(; j < (int)sizeof(buf); j++) assert(buf[j] == Filler); + } + + memset(buf, Filler, sizeof(buf)); + + size = ber_tlv_tag_serialize(tag, buf, sizeof(buf)); + assert(size < (int)sizeof(buf)); + + for(i = 0; i < size; i++) assert(buf[i] != Filler); + for(; i < (int)sizeof(buf); i++) assert(buf[i] == Filler); + + if(ctrl->correctly_decodable == 1) { + assert(size == ctrl->taglen); + } + if(ctrl->constr) *buf |= 0x20; + + ber_tlv_tag_fwrite(tag, stdout); + + printf(":"); + + for(i = 0; i < size; i++) { + printf(" %02x", buf[i]); + if(ctrl->correctly_decodable == 1) { + assert(ctrl->tagbuf[i] == buf[i]); + } + } + printf("\n"); +} + From fef925d79f4fa95545144048d007688c9d9ef17a Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 19 Aug 2004 13:28:31 +0000 Subject: [PATCH 0146/1469] BMP, US and UTF ranges git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@146 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_constraint_compat.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libasn1fix/asn1fix_constraint_compat.c b/libasn1fix/asn1fix_constraint_compat.c index 10720b5c3..f2f47fd1b 100644 --- a/libasn1fix/asn1fix_constraint_compat.c +++ b/libasn1fix/asn1fix_constraint_compat.c @@ -98,6 +98,8 @@ asn1cnst_range_t * asn1constraint_default_alphabet(asn1p_expr_type_e expr_type) { DECL(uint7, 0x00, 0x7f); DECL(uint8, 0x00, 0xff); + DECL(uint16, 0x00, 0xffff); + DECL(uint31, 0x00, 0x7fffffff); DECL(Space, 0x20, 0x20); DECL(ApostropheAndParens, 0x27, 0x29); DECL(PlusTillColon, 0x2b, 0x3a); @@ -169,6 +171,11 @@ asn1constraint_default_alphabet(asn1p_expr_type_e expr_type) { return &range_uint7; case ASN_BASIC_OCTET_STRING: return &range_uint8; + case ASN_STRING_BMPString: + return &range_uint16; + case ASN_STRING_UniversalString: + case ASN_STRING_UTF8String: + return &range_uint31; case ASN_BASIC_UTCTime: return &range_UTCTime; case ASN_BASIC_GeneralizedTime: From bfb3131d058e995842e1095af843a7eaf77693e0 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 19 Aug 2004 13:29:03 +0000 Subject: [PATCH 0147/1469] file dependencies git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@147 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_fdeps.c | 180 ++++++++++++++++++++++++++++++++++ libasn1compiler/asn1c_fdeps.h | 22 +++++ libasn1compiler/asn1c_save.c | 146 +++++++++++++-------------- libasn1compiler/asn1c_save.h | 6 +- 4 files changed, 279 insertions(+), 75 deletions(-) create mode 100644 libasn1compiler/asn1c_fdeps.c create mode 100644 libasn1compiler/asn1c_fdeps.h diff --git a/libasn1compiler/asn1c_fdeps.c b/libasn1compiler/asn1c_fdeps.c new file mode 100644 index 000000000..cb53b3cee --- /dev/null +++ b/libasn1compiler/asn1c_fdeps.c @@ -0,0 +1,180 @@ +#include "asn1c_internal.h" +#include "asn1c_fdeps.h" + +static asn1c_fdeps_t *asn1c_new_dep(const char *filename); +static int asn1c_dep_add(asn1c_fdeps_t *deps, asn1c_fdeps_t *d); + +int +asn1c_activate_dependency(asn1c_fdeps_t *deps, asn1c_fdeps_t *cur, const char *data) { + char *fname; + int i; + + if(!deps || !data || !*data) + return 0; + if(!cur) cur = deps; + + if(cur->used_somewhere) + return 1; /* Already activated */ + + (const char *)fname = data; + if(*data == '#') { + const char *start = data; + const char *end = 0; + + start = strchr(data, '<'); + if(start) { + start++; + end = strchr(start, '>'); + } + if(end) { + fname = alloca((end - start) + 1); + memcpy(fname, start, end - start); + fname[end-start] = '\0'; + } else { + return 0; + } + } + + if(cur->filename && strcmp(cur->filename, fname) == 0) { + cur->used_somewhere = 1; + + /* Activate subdependencies */ + for(i = 0; i < cur->el_count; i++) { + asn1c_activate_dependency(deps, + cur->elements[i], + cur->elements[i]->filename); + } + + /* + * This might be a link to someplace else. + */ + return asn1c_activate_dependency(deps, NULL, fname); + } else { + for(i = 0; i < cur->el_count; i++) { + asn1c_activate_dependency(deps, + cur->elements[i], fname); + } + } + + return 0; +} + +asn1c_fdeps_t * +asn1c_read_file_dependencies(arg_t *arg, const char *datadir) { + asn1c_fdeps_t *deps; + asn1c_fdeps_t *cur; + char buf[4096]; + FILE *f; + int hit_COMMON_FILES = 0; + + (void)arg; + + if(!datadir || strlen(datadir) > sizeof(buf) / 2) { + errno = EINVAL; + return NULL; + } else { + sprintf(buf, "%s/file-dependencies", datadir); + } + + f = fopen(buf, "r"); + if(!f) return NULL; + + deps = asn1c_new_dep(0); + assert(deps); + + while(fgets(buf, sizeof(buf), f)) { + char *p = strchr(buf, '#'); + if(p) *p = '\0'; /* Remove comments */ + + cur = deps; + for(p = strtok(buf, " \t\r\n"); p; + p = strtok(NULL, " \t\r\n")) { + asn1c_fdeps_t *d; + /* + * If hit "COMMON-FILES:", treat everything else + * as a huge dependency. + */ + if(strcmp(p, "COMMON-FILES:") == 0) { + hit_COMMON_FILES = 1; + break; + } + d = asn1c_new_dep(p); + assert(d); + d->used_somewhere = hit_COMMON_FILES; + + if(asn1c_dep_add(cur, d) == 1) + cur = d; + } + } + + fclose(f); + + return deps; +} + +static asn1c_fdeps_t * +asn1c_new_dep(const char *filename) { + asn1c_fdeps_t *d; + + d = calloc(1, sizeof(*d)); + if(filename) { + d->filename = strdup(filename); + if(!d->filename) return NULL; + } + + return d; +} + +static int +asn1c_dep_add(asn1c_fdeps_t *deps, asn1c_fdeps_t *d) { + int n; + + /* Check for duplicates */ + for(n = 0; n < deps->el_count; n++) { + if(strcmp(deps->elements[n]->filename, d->filename) == 0) + return 0; + } + + if(deps->el_count == deps->el_size) { + n = deps->el_size?deps->el_size << 2:16; + void *p = realloc(deps->elements, + n * sizeof(deps->elements[0])); + assert(p); + deps->elements = p; + deps->el_size = n; + } + + deps->elements[deps->el_count++] = d; + return 1; +} + +asn1c_fdeps_t * +asn1c_deps_makelist(asn1c_fdeps_t *deps) { + asn1c_fdeps_t *dlist; + asn1c_fdeps_t *d; + int i; + + if(!deps) { + errno = EINVAL; + return 0; + } + + dlist = asn1c_new_dep(0); + + if(deps->filename && deps->used_somewhere) { + d = asn1c_new_dep(deps->filename); + asn1c_dep_add(dlist, d); + } + + for(i = 0; i < deps->el_count; i++) { + int j; + d = asn1c_deps_makelist(deps->elements[i]); + assert(!d->filename); + for(j = 0; j < d->el_count; j++) { + asn1c_dep_add(dlist, d->elements[j]); + } + } + + return dlist; +} + diff --git a/libasn1compiler/asn1c_fdeps.h b/libasn1compiler/asn1c_fdeps.h new file mode 100644 index 000000000..bb9496f92 --- /dev/null +++ b/libasn1compiler/asn1c_fdeps.h @@ -0,0 +1,22 @@ +#ifndef _ASN1C_FDEPS_H_ +#define _ASN1C_FDEPS_H_ + +typedef struct asn1c_fdeps_s { + char *filename; /* Or 0, if root. */ + + int used_somewhere; /* Somefile refers to it */ + + struct asn1c_fdeps_s **elements; + int el_size; + int el_count; +} asn1c_fdeps_t; + +asn1c_fdeps_t *asn1c_read_file_dependencies(arg_t *arg, const char *datadir); + +/* Data may be a filename or an "#include <>" string. */ +int asn1c_activate_dependency(asn1c_fdeps_t *deps, asn1c_fdeps_t *cur, + const char *data); + +asn1c_fdeps_t *asn1c_deps_makelist(asn1c_fdeps_t *deps); + +#endif /* _ASN1C_FDEPS_H_ */ diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c index 15d1b676d..3c630538d 100644 --- a/libasn1compiler/asn1c_save.c +++ b/libasn1compiler/asn1c_save.c @@ -1,21 +1,29 @@ #include "asn1c_internal.h" #include "asn1c_compat.h" +#include "asn1c_fdeps.h" -static int asn1c_dump_streams(arg_t *arg); +static int asn1c_dump_streams(arg_t *arg, asn1c_fdeps_t *); static int asn1c_print_streams(arg_t *arg); -static int asn1c_save_streams(arg_t *arg); +static int asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *); static int asn1c_copy_over(arg_t *arg, char *path); int asn1c_save_compiled_output(arg_t *arg, const char *datadir) { - - (void)datadir; + asn1c_fdeps_t *deps = 0; + FILE *mkf; + asn1c_fdeps_t *dlist; + + deps = asn1c_read_file_dependencies(arg, datadir); + if(!deps && datadir) { + WARNING("Cannot read file-dependencies information " + "from %s\n", datadir); + } TQ_FOR(arg->mod, &(arg->asn->modules), mod_next) { TQ_FOR(arg->expr, &(arg->mod->members), next) { if(asn1_lang_map[arg->expr->meta_type] [arg->expr->expr_type].type_cb) { - if(asn1c_dump_streams(arg)) + if(asn1c_dump_streams(arg, deps)) return -1; } } @@ -24,68 +32,65 @@ asn1c_save_compiled_output(arg_t *arg, const char *datadir) { /* * Dump out the Makefile template and the rest of the support code. */ - if((arg->flags & A1C_PRINT_COMPILED) == 0 - && (arg->flags & A1C_OMIT_SUPPORT_CODE) == 0) { - glob_t pg; - FILE *mkf; - char *p; - int i; - - i = strlen(datadir) + sizeof("/*.[ch]"); - p = alloca(i); - snprintf(p, i, "%s/*.[ch]", datadir); - - memset(&pg, 0, sizeof(pg)); - if(glob(p, GLOB_ERR -#ifdef GLOB_TILDE - | GLOB_TILDE -#endif /* GLOB_TILDE */ - , NULL, &pg)) { - fprintf(stderr, - "Bad skeletons directory (-S) %s: %s\n", - datadir, strerror(errno)); - return -1; - } + if((arg->flags & A1C_PRINT_COMPILED) + || (arg->flags & A1C_OMIT_SUPPORT_CODE)) { + return 0; /* Finished */ + } - mkf = asn1c_open_file(arg, "Makefile.am", ".sample"); - if(mkf == NULL) { - globfree(&pg); - perror("Makefile.am.sample"); - return -1; - } + mkf = asn1c_open_file("Makefile.am", ".sample"); + if(mkf == NULL) { + perror("Makefile.am.sample"); + return -1; + } - fprintf(mkf, "ASN_SRCS="); - TQ_FOR(arg->mod, &(arg->asn->modules), mod_next) { - TQ_FOR(arg->expr, &(arg->mod->members), next) { - if(asn1_lang_map[arg->expr->meta_type] - [arg->expr->expr_type].type_cb) { - fprintf(mkf, "\t\\\n\t%s.c %s.h", - arg->expr->Identifier, - arg->expr->Identifier); - } + fprintf(mkf, "ASN_MODULE_SOURCES="); + TQ_FOR(arg->mod, &(arg->asn->modules), mod_next) { + TQ_FOR(arg->expr, &(arg->mod->members), next) { + if(asn1_lang_map[arg->expr->meta_type] + [arg->expr->expr_type].type_cb) { + fprintf(mkf, "\t\\\n\t%s.c %s.h", + arg->expr->Identifier, + arg->expr->Identifier); } } + } + + /* + * Move necessary skeleton files and add them to Makefile.am.sample. + */ + dlist = asn1c_deps_makelist(deps); + if(dlist) { + char buf[8129]; + char *dir_end; + int i = strlen(datadir); + + assert(i < (int)(sizeof(buf) / 2 - 2)); + memcpy(buf, datadir, i); + dir_end = buf + i; + *dir_end++ = '/'; + + for(i = 0; i < dlist->el_count; i++) { + char *fname = dlist->elements[i]->filename; + + assert(strlen(fname) < (sizeof(buf) / 2)); + strcpy(dir_end, fname); - for(i = 0; i < pg.gl_pathc; i++) { - if(asn1c_copy_over(arg, pg.gl_pathv[i])) { + if(asn1c_copy_over(arg, buf) == -1) { fprintf(mkf, ">>>ABORTED<<<"); fclose(mkf); - globfree(&pg); return -1; } else { - fprintf(mkf, "\t\\\n\t%s", - a1c_basename(pg.gl_pathv[i])); + fprintf(mkf, "\t\\\n\t%s", fname); } } - - fprintf(mkf, "\n\n"); - fprintf(mkf, "lib_LTLIBRARIES=libsomething.la\n"); - fprintf(mkf, "libsomething_la_SOURCES=${ASN_SRCS}\n"); - fclose(mkf); - fprintf(stderr, "Generated Makefile.am.sample\n"); - globfree(&pg); } + fprintf(mkf, "\n\n"); + fprintf(mkf, "lib_LTLIBRARIES=libsomething.la\n"); + fprintf(mkf, "libsomething_la_SOURCES=$(ASN_MODULE_SOURCES)\n"); + fclose(mkf); + fprintf(stderr, "Generated Makefile.am.sample\n"); + return 0; } @@ -93,11 +98,11 @@ asn1c_save_compiled_output(arg_t *arg, const char *datadir) { * Dump the streams. */ static int -asn1c_dump_streams(arg_t *arg) { +asn1c_dump_streams(arg_t *arg, asn1c_fdeps_t *deps) { if(arg->flags & A1C_PRINT_COMPILED) { return asn1c_print_streams(arg); } else { - return asn1c_save_streams(arg); + return asn1c_save_streams(arg, deps); } } @@ -125,7 +130,7 @@ asn1c_print_streams(arg_t *arg) { } static int -asn1c_save_streams(arg_t *arg) { +asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *deps) { asn1p_expr_t *expr = arg->expr; compiler_streams_t *cs = expr->data; out_chunk_t *ot; @@ -138,8 +143,8 @@ asn1c_save_streams(arg_t *arg) { return -1; } - fp_c = asn1c_open_file(arg, expr->Identifier, ".c"); - fp_h = asn1c_open_file(arg, expr->Identifier, ".h"); + fp_c = asn1c_open_file(expr->Identifier, ".c"); + fp_h = asn1c_open_file(expr->Identifier, ".h"); if(fp_c == NULL || fp_h == NULL) { if(fp_c) fclose(fp_c); /* lacks unlink() */ if(fp_h) fclose(fp_h); /* lacks unlink() */ @@ -163,15 +168,7 @@ asn1c_save_streams(arg_t *arg) { arg->mod->source_file_name ); - header_id = alloca(strlen(expr->Identifier) + 1); - if(1) { - char *src, *dst; - for(src = expr->Identifier, dst = header_id; - (*dst=*src); src++, dst++) - if(!isalnum(*src)) *dst = '_'; - *dst = '\0'; - } - + header_id = asn1c_make_identifier(0, expr->Identifier, NULL); fprintf(fp_h, "#ifndef\t_%s_H_\n" "#define\t_%s_H_\n" @@ -181,8 +178,10 @@ asn1c_save_streams(arg_t *arg) { fprintf(fp_h, "#include \n\n"); - TQ_FOR(ot, &(cs->targets[OT_INCLUDES]), next) + TQ_FOR(ot, &(cs->targets[OT_INCLUDES]), next) { + asn1c_activate_dependency(deps, 0, ot->buf); fwrite(ot->buf, ot->len, 1, fp_h); + } fprintf(fp_h, "\n"); TQ_FOR(ot, &(cs->targets[OT_DEPS]), next) fwrite(ot->buf, ot->len, 1, fp_h); @@ -232,13 +231,16 @@ asn1c_copy_over(arg_t *arg, char *path) { fprintf(stderr, "File %s is already here as %s\n", path, fname); - return 0; + return 1; } else { fprintf(stderr, "Retaining local %s (%s suggested)\n", fname, path); - return 0; + return 1; } + } else if(errno == ENOENT) { + /* Ignore this */ + return 0; } else { fprintf(stderr, "Symlink %s -> %s failed: %s\n", path, fname, strerror(errno)); @@ -248,6 +250,6 @@ asn1c_copy_over(arg_t *arg, char *path) { fprintf(stderr, "Symlinked %s\t-> %s\n", path, fname); - return 0; + return 1; } diff --git a/libasn1compiler/asn1c_save.h b/libasn1compiler/asn1c_save.h index 487e625b0..8d4b1f5e1 100644 --- a/libasn1compiler/asn1c_save.h +++ b/libasn1compiler/asn1c_save.h @@ -1,6 +1,6 @@ -#ifndef _ASN1_SAVE_H_ -#define _ASN1_SAVE_H_ +#ifndef _ASN1C_SAVE_H_ +#define _ASN1C_SAVE_H_ int asn1c_save_compiled_output(arg_t *arg, const char *datadir); -#endif /* _ASN1_SAVE_H_ */ +#endif /* _ASN1C_SAVE_H_ */ From 2248d718ef0ce41fe3a200fd2f90e8b490c3425d Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 19 Aug 2004 13:29:18 +0000 Subject: [PATCH 0148/1469] moved around git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@148 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_compat.c | 65 +++++++++++++++++++++++++++++++--- libasn1compiler/asn1c_compat.h | 9 +++++ libasn1compiler/asn1c_misc.c | 58 ------------------------------ libasn1compiler/asn1c_misc.h | 5 --- 4 files changed, 69 insertions(+), 68 deletions(-) diff --git a/libasn1compiler/asn1c_compat.c b/libasn1compiler/asn1c_compat.c index 44ba3e60d..1a402bf40 100644 --- a/libasn1compiler/asn1c_compat.c +++ b/libasn1compiler/asn1c_compat.c @@ -1,8 +1,6 @@ +#include "asn1c_internal.h" #include -#include -#include - #ifdef HAVE_SYS_PARAM_H #include /* For MAXPATHLEN */ #endif @@ -11,6 +9,63 @@ #define MAXPATHLEN 1024 #endif +#ifndef DEFFILEMODE /* Normally in */ +#define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) +#endif + +FILE * +asn1c_open_file(const char *name, const char *ext) { + int created = 1; + struct stat sb; + char *fname; + int len; + FILE *fp; + int fd; + + /* + * Compute filenames. + */ + len = strlen(name) + strlen(ext) + 1; + fname = alloca(len); + snprintf(fname, len, "%s%s", name, ext); + + /* + * Create files. + */ + fd = open(fname, O_CREAT | O_EXCL | O_WRONLY, DEFFILEMODE); + if(fd == -1 && errno == EEXIST) { + fd = open(fname, O_WRONLY, DEFFILEMODE); + created = 0; + } + if(fd == -1) { + perror(fname); + return NULL; + } + + /* + * Check sanity. + */ + if(fstat(fd, &sb) || !S_ISREG(sb.st_mode)) { + fprintf(stderr, "%s: Not a regular file\n", fname); + if(created) unlink(fname); + close(fd); + return NULL; + } + + (void)ftruncate(fd, 0); + + /* + * Convert file descriptor into file pointer. + */ + fp = fdopen(fd, "w"); + if(fp == NULL) { + if(created) unlink(fname); + close(fd); + } + return fp; +} + + char * a1c_basename(const char *path) { static char strbuf[MAXPATHLEN]; @@ -33,7 +88,7 @@ a1c_basename(const char *path) { for(name = pend; name > path && name[-1] != '/'; name--); - if((pend - name) >= sizeof(strbuf) - 1) { + if((pend - name) >= (int)sizeof(strbuf) - 1) { errno = ENAMETOOLONG; return 0; } @@ -79,7 +134,7 @@ a1c_dirname(const char *path) { return strbuf; } - if((last - path) >= sizeof(strbuf)) { + if((last - path) >= (int)sizeof(strbuf)) { errno = ENAMETOOLONG; return 0; } diff --git a/libasn1compiler/asn1c_compat.h b/libasn1compiler/asn1c_compat.h index 9461b781e..e80e2e77a 100644 --- a/libasn1compiler/asn1c_compat.h +++ b/libasn1compiler/asn1c_compat.h @@ -5,6 +5,15 @@ #include #endif +/* + * Open the arbitrary file by its base name and extension. + */ +FILE *asn1c_open_file(const char *base_part, const char *extension); + +/* + * Obtain base name and directory name of a path. + * Some systems have them in as dirname(3) and basename(3). + */ char *a1c_basename(const char *path); char *a1c_dirname(const char *path); diff --git a/libasn1compiler/asn1c_misc.c b/libasn1compiler/asn1c_misc.c index 257e02c5c..ee4369603 100644 --- a/libasn1compiler/asn1c_misc.c +++ b/libasn1compiler/asn1c_misc.c @@ -1,10 +1,6 @@ #include "asn1c_internal.h" #include -#ifndef DEFFILEMODE /* Normally in */ -#define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) -#endif - /* * Construct identifier from multiple parts. * Convert unsafe characters to underscores. @@ -85,60 +81,6 @@ asn1c_make_identifier(int unsafe_only_spaces, char *arg1, ...) { return storage; } -FILE * -asn1c_open_file(arg_t *arg, const char *name, const char *ext) { - int created = 1; - struct stat sb; - char *fname; - int len; - FILE *fp; - int fd; - - (void)arg; /* Unused argument */ - - /* - * Compute filenames. - */ - len = strlen(name) + strlen(ext) + 1; - fname = alloca(len); - snprintf(fname, len, "%s%s", name, ext); - - /* - * Create files. - */ - fd = open(fname, O_CREAT | O_EXCL | O_WRONLY, DEFFILEMODE); - if(fd == -1 && errno == EEXIST) { - fd = open(fname, O_WRONLY, DEFFILEMODE); - created = 0; - } - if(fd == -1) { - perror(fname); - return NULL; - } - - /* - * Check sanity. - */ - if(fstat(fd, &sb) || !S_ISREG(sb.st_mode)) { - fprintf(stderr, "%s: Not a regular file\n", fname); - if(created) unlink(fname); - close(fd); - return NULL; - } - - (void)ftruncate(fd, 0); - - /* - * Convert file descriptor into file pointer. - */ - fp = fdopen(fd, "w"); - if(fp == NULL) { - if(created) unlink(fname); - close(fd); - } - return fp; -} - char * asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { char *typename; diff --git a/libasn1compiler/asn1c_misc.h b/libasn1compiler/asn1c_misc.h index 2f82b0b65..325892a54 100644 --- a/libasn1compiler/asn1c_misc.h +++ b/libasn1compiler/asn1c_misc.h @@ -20,9 +20,4 @@ enum tnfmt { }; char *asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format); -/* - * Open the arbitrary file by its base name and extension. - */ -FILE *asn1c_open_file(arg_t *arg, const char *base_part, const char *extension); - #endif /* _ASN1_COMPILER_MISC_H_ */ From 1d03669d1bd93034edc8688033550254ca0f90e0 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 19 Aug 2004 13:29:46 +0000 Subject: [PATCH 0149/1469] constraint checking code git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@149 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/Makefile.am | 2 + libasn1compiler/Makefile.in | 8 +- libasn1compiler/asn1c_C.c | 712 +---------------------------- libasn1compiler/asn1c_constraint.c | 482 +++++++++++++++++++ libasn1compiler/asn1c_constraint.h | 7 + libasn1compiler/asn1c_internal.h | 2 +- 6 files changed, 508 insertions(+), 705 deletions(-) create mode 100644 libasn1compiler/asn1c_constraint.c create mode 100644 libasn1compiler/asn1c_constraint.h diff --git a/libasn1compiler/Makefile.am b/libasn1compiler/Makefile.am index ef96aef91..bcfaf93d9 100644 --- a/libasn1compiler/Makefile.am +++ b/libasn1compiler/Makefile.am @@ -13,7 +13,9 @@ libasn1compiler_la_SOURCES = \ asn1c_lang.c asn1c_lang.h \ asn1c_save.c asn1c_save.h \ asn1c_C.c asn1c_C.h \ + asn1c_constraint.c asn1c_constraint.h \ asn1c_compat.c asn1c_compat.h \ + asn1c_fdeps.c asn1c_fdeps.h \ asn1c_internal.h TESTS = $(check_PROGRAMS) diff --git a/libasn1compiler/Makefile.in b/libasn1compiler/Makefile.in index e81539371..b427be97c 100644 --- a/libasn1compiler/Makefile.in +++ b/libasn1compiler/Makefile.in @@ -53,7 +53,7 @@ LTLIBRARIES = $(noinst_LTLIBRARIES) libasn1compiler_la_LIBADD = am_libasn1compiler_la_OBJECTS = asn1compiler.lo asn1c_misc.lo \ asn1c_out.lo asn1c_lang.lo asn1c_save.lo asn1c_C.lo \ - asn1c_compat.lo + asn1c_constraint.lo asn1c_compat.lo asn1c_fdeps.lo libasn1compiler_la_OBJECTS = $(am_libasn1compiler_la_OBJECTS) check_compiler_SOURCES = check_compiler.c check_compiler_OBJECTS = check_compiler.$(OBJEXT) @@ -66,6 +66,8 @@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/asn1c_C.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/asn1c_compat.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1c_constraint.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/asn1c_fdeps.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/asn1c_lang.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/asn1c_misc.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/asn1c_out.Plo \ @@ -208,7 +210,9 @@ libasn1compiler_la_SOURCES = \ asn1c_lang.c asn1c_lang.h \ asn1c_save.c asn1c_save.h \ asn1c_C.c asn1c_C.h \ + asn1c_constraint.c asn1c_constraint.h \ asn1c_compat.c asn1c_compat.h \ + asn1c_fdeps.c asn1c_fdeps.h \ asn1c_internal.h TESTS = $(check_PROGRAMS) @@ -279,6 +283,8 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c_C.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c_compat.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c_constraint.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c_fdeps.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c_lang.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c_misc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c_out.Plo@am__quote@ diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 197ce1f93..ac1387337 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -4,7 +4,8 @@ */ #include "asn1c_internal.h" #include "asn1c_C.h" -#include /* exportable stuff from libasn1fix */ +#include "asn1c_constraint.h" +#include /* Stuff exported by libasn1fix */ typedef struct tag2el_s { struct asn1p_type_tag_s el_tag; @@ -25,17 +26,6 @@ static int _print_tag(arg_t *arg, asn1p_expr_t *expr, struct asn1p_type_tag_s *t static int check_if_extensible(asn1p_expr_t *expr); static int emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int *tags_impl_skip, int choice_mode); static int emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count); -static int emit_constraint_checking_code(arg_t *arg); -static int emit_single_constraint_check(arg_t *arg, asn1p_constraint_t *ct, int mode); -static int emit_alphabet_tables(arg_t *arg, asn1p_constraint_t *ct, int *table); -static int emit_alphabet_check_cycle(arg_t *arg); -static int check_constraint_type_presence(asn1p_constraint_t *ct, enum asn1p_constraint_type_e type); -static asn1p_expr_type_e _find_terminal_type(arg_t *arg); -static int emit_value_determination_code(arg_t *arg); -static int emit_size_determination_code(arg_t *arg); -static long compute_min_size(arg_t *arg); -static long compute_max_size(arg_t *arg); -static long compute_xxx_size(arg_t *arg, int _max); #define C99_MODE (arg->flags & A1C_NO_C99) #define UNNAMED_UNIONS (arg->flags & A1C_UNNAMED_UNIONS) @@ -969,28 +959,28 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { /* * Constraint checking. */ - if(expr->constraints) /* Emit tables with FROM() constraints */ - emit_alphabet_tables(arg, expr->constraints, 0); + /* Emit FROM() tables and others */ + asn1c_emit_constraint_tables(arg, 0); + p = MKID(expr->Identifier); OUT("int\n"); OUT("%s_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,\n", p); INDENTED( OUT("\t\tasn_app_consume_bytes_f *app_errlog, void *app_key) {\n"); OUT("\n"); - if(expr->constraints) { - - emit_constraint_checking_code(arg); - + if(asn1c_emit_constraint_checking_code(arg) == 1) { + if(0) { OUT("/* Check the constraints of the underlying type */\n"); OUT("return asn1_DEF_%s.check_constraints\n", asn1c_type_name(arg, expr, TNF_SAFE)); OUT("\t(td, sptr, app_errlog, app_key);\n"); - } else { + } else { OUT("/* Make the underlying type checker permanent */\n"); OUT("td->check_constraints = asn1_DEF_%s.check_constraints;\n", asn1c_type_name(arg, expr, TNF_SAFE)); OUT("return td->check_constraints\n"); OUT("\t(td, sptr, app_errlog, app_key);\n"); + } } ); OUT("}\n"); @@ -1365,687 +1355,3 @@ emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int *tags_impl_skip, int choice return tags_count; } - -static int -emit_constraint_checking_code(arg_t *arg) { - asn1p_expr_t *expr = arg->expr; - asn1p_expr_type_e etype; - int size_present, value_present; - - if(expr->constraints == NULL) - return 0; /* No constraints defined */ - - etype = _find_terminal_type(arg); - - size_present = check_constraint_type_presence(expr->constraints, - ACT_CT_SIZE); - value_present = check_constraint_type_presence(expr->constraints, - ACT_EL_VALUE); - - if(size_present || value_present) { - OUT("const %s_t *st = sptr;\n", MKID(arg->expr->Identifier)); - if(size_present) { - OUT("size_t size;\n"); - OUT("size_t min_size __attribute__ ((unused)) = %ld;\n", - compute_min_size(arg)); - OUT("size_t max_size __attribute__ ((unused)) = %ld;\n", - compute_max_size(arg)); - } - if(value_present) - switch(etype) { - case ASN_BASIC_INTEGER: - case ASN_BASIC_ENUMERATED: - OUT("long value;\n"); - break; - case ASN_BASIC_BOOLEAN: - OUT("int value;\n"); - break; - default: - break; - } - OUT("\n"); - } - - OUT("if(!sptr) {\n"); - INDENT(+1); - OUT("_ASN_ERRLOG(app_errlog, app_key,\n"); - OUT("\t\"%%s: value not given\", td->name);\n"); - OUT("return -1;\n"); - INDENT(-1); - OUT("}\n"); - OUT("\n"); - - if(size_present) - emit_size_determination_code(arg); - if(value_present) - emit_value_determination_code(arg); - - OUT("\n"); - OUT("if(\n"); - emit_single_constraint_check(arg, expr->constraints, 0); - OUT(") {\n"); - INDENTED(OUT("/* Constraint check succeeded */\n")); - OUT("} else {\n"); - INDENT(+1); - OUT("_ASN_ERRLOG(app_errlog, app_key,\n"); - OUT("\t\"%%s: constraint failed\", td->name);\n"); - OUT("return -1;\n"); - INDENT(-1); - OUT("}\n"); - - return 0; -} - -static int -emit_single_constraint_check(arg_t *arg, asn1p_constraint_t *ct, int mode) { - char *s_v; - int el; - - assert(arg && ct); - - switch(ct->type) { - case ACT_INVALID: - assert(ct->type != ACT_INVALID); - OUT("-1 /* Invalid constraint at line %d */\n", ct->_lineno); - break; - case ACT_EL_VALUE: - OUT("("); - if(mode == ACT_CT_SIZE) s_v = "size"; - else s_v = "value"; - OUT("%s", s_v); - if(ct->value->type != ATV_TRUE) - OUT(" == "); - switch(ct->value->type) { - case ATV_INTEGER: OUT("%lld", - (long long)ct->value->value.v_integer); break; - case ATV_MIN: OUT("min_%s", s_v); break; - case ATV_MAX: OUT("max_%s", s_v); break; - case ATV_FALSE: OUT("0"); break; - case ATV_TRUE: break; - default: - break; - } - OUT(")\n"); - break; - case ACT_EL_RANGE: - case ACT_EL_LLRANGE: - case ACT_EL_RLRANGE: - case ACT_EL_ULRANGE: - if(mode == ACT_CT_SIZE) { - s_v = "size"; - } else { - s_v = "value"; - } - OUT("((%s", s_v); - switch(ct->type) { - case ACT_EL_RANGE: - case ACT_EL_RLRANGE: - OUT(" >= "); break; - case ACT_EL_LLRANGE: - case ACT_EL_ULRANGE: - OUT(" > "); break; - default: break; - } - switch(ct->range_start->type) { - case ATV_INTEGER: OUT("%lld", - (long long)ct->range_start->value.v_integer); break; - case ATV_MIN: OUT("min_%s", s_v); break; - case ATV_MAX: OUT("max_%s", s_v); break; - case ATV_FALSE: OUT("0"); break; - case ATV_TRUE: break; - default: - break; - } - OUT(") && (%s", s_v); - switch(ct->type) { - case ACT_EL_RANGE: - case ACT_EL_LLRANGE: - OUT(" <= "); break; - case ACT_EL_RLRANGE: - case ACT_EL_ULRANGE: - OUT(" < "); break; - default: break; - } - switch(ct->range_stop->type) { - case ATV_INTEGER: OUT("%lld", - (long long)ct->range_stop->value.v_integer); break; - case ATV_MIN: OUT("min_%s", s_v); break; - case ATV_MAX: OUT("max_%s", s_v); break; - case ATV_FALSE: OUT("0"); break; - case ATV_TRUE: break; - default: - break; - } - OUT("))\n"); - break; - case ACT_EL_EXT: - OUT("0 /* Extensible (...), but not defined herein */\n"); - break; - case ACT_CT_SIZE: - if(mode) { - OUT("0 /* Invalid constraint at line %d */\n", - ct->_lineno); - return -1; - } - assert(ct->el_count == 1); - return emit_single_constraint_check(arg, - ct->elements[0], ACT_CT_SIZE); - case ACT_CT_FROM: - if(mode) { - OUT("0 /* Invalid constraint at line %d */\n", - ct->_lineno); - return -1; - } - OUT("check_alphabet_%x(sptr)\n", ct); - break; - case ACT_CT_WCOMP: - case ACT_CT_WCOMPS: - OUT("%d /* Unsupported constraint at line %d */\n", - ct->type, ct->_lineno); - return -1; - break; - case ACT_CA_SET: - OUT("(\n"); - INDENT(+1); - for(el = 0; el < ct->el_count; el++) { - if(el) OUT("&& "); - emit_single_constraint_check(arg, - ct->elements[el], mode); - } - INDENT(-1); - OUT(")\n"); - break; - case ACT_CA_CSV: - OUT("(\n"); - INDENT(+1); - for(el = 0; el < ct->el_count; el++) { - if(el) OUT("|| "); - emit_single_constraint_check(arg, - ct->elements[el], mode); - } - INDENT(-1); - OUT(")\n"); - break; - case ACT_CA_UNI: - OUT("(\n"); - INDENT(+1); - for(el = 0; el < ct->el_count; el++) { - if(el) OUT("|| "); - emit_single_constraint_check(arg, - ct->elements[el], mode); - } - INDENT(-1); - OUT(")\n"); - break; - case ACT_CA_INT: - OUT("(\n"); - INDENT(+1); - for(el = 0; el < ct->el_count; el++) { - if(el) OUT("&& "); - emit_single_constraint_check(arg, - ct->elements[el], mode); - } - INDENT(-1); - OUT(")\n"); - break; - case ACT_CA_CRC: - WARNING("Unsupported component relation constraint at line %d", - ct->_lineno); - OUT("%d /* Unsupported component relation constraint " - "at line %d */\n", - ct->type, ct->_lineno); - return -1; - case ACT_CA_EXC: - WARNING("Unsupported EXCEPT constraint at line %d", - ct->_lineno); - OUT("%d /* Unsupported EXCEPT constraint at line %d */\n", - ct->type, ct->_lineno); - return -1; - } - - return 0; -} - -static int -check_constraint_type_presence(asn1p_constraint_t *ct, enum asn1p_constraint_type_e type) { - int el; - - if(ct == NULL) return 0; - - if(ct->type == type) return 1; - - if(type == ACT_EL_VALUE) { - if(ct->type >= ACT_CT_SIZE - && ct->type <= ACT_CT_WCOMPS) - /* Values defined further - * are not really value's values */ - return 0; - if(ct->type > ACT_EL_VALUE && ct->type < ACT_CT_SIZE) - return 1; /* Also values */ - } - - for(el = 0; el < ct->el_count; el++) { - if(check_constraint_type_presence(ct->elements[el], type)) - return 1; - } - - return 0; -} - -static int -emit_alphabet_tables(arg_t *arg, asn1p_constraint_t *ct, int *table) { - int ch = 0; - int ch_start = 0; - int ch_stop = 0; - int el = 0; - - assert(arg && ct); - - switch(ct->type) { - case ACT_INVALID: - break; - case ACT_EL_VALUE: - if(!table) break; - - switch(ct->value->type) { - case ATV_INTEGER: - if(ct->value->value.v_integer < 0 - || ct->value->value.v_integer > 255) { - OUT("\n"); - OUT("#error Value %lld out of range " - "for alphabet character at line %d\n", - (long long)ct->value->value.v_integer, - ct->_lineno); - break; - } else { - ch = ct->value->value.v_integer; - table[ch] = 1; - } - break; - case ATV_STRING: - for(ch = 0; ch < ct->value->value.string.size; ch++) - table[ct->value->value.string.buf[ch]] = 1; - break; - default: - OUT("\n"); - WARNING("Invalid alphabet character specification " - "at line %d", ct->_lineno); - OUT("#error Invalid alphabet character specification " - "at line %d\n", ct->_lineno); - break; - } - break; - case ACT_EL_RANGE: - case ACT_EL_LLRANGE: - case ACT_EL_RLRANGE: - case ACT_EL_ULRANGE: - if(!table) break; - - ch_start = 0; - ch_stop = 255; - - switch(ct->range_start->type) { - case ATV_INTEGER: - ch_start = ct->range_start->value.v_integer; break; - case ATV_MIN: ch_start = 0; break; - case ATV_MAX: ch_start = 255; break; - case ATV_STRING: - if(ct->range_start->value.string.size == 1) { - ch_start = ct->range_start->value.string.buf[0]; - break; - } - /* Fall through */ - default: - OUT("\n"); - FATAL("Invalid alphabet range constraint " - "at line %d\n", ct->_lineno); - OUT("#error Invalid alphabet range constraint " - "at line %d\n", ct->_lineno); - return -1; - } - - switch(ct->range_stop->type) { - case ATV_INTEGER: - ch_stop = ct->range_stop->value.v_integer; break; - case ATV_MIN: ch_stop = 0; break; - case ATV_MAX: ch_stop = 255; break; - case ATV_STRING: - if(ct->range_stop->value.string.size == 1) { - ch_stop = ct->range_stop->value.string.buf[0]; - break; - } - /* Fall through */ - default: - OUT("\n"); - FATAL("Invalid alphabet range constraint " - "at line %d\n", ct->_lineno); - OUT("#error Invalid alphabet range constraint " - "at line %d\n", ct->_lineno); - break; - } - - switch(ct->type) { - case ACT_EL_RANGE: break; - case ACT_EL_RLRANGE: ch_stop--; break; - case ACT_EL_LLRANGE: ch_start++; break; - case ACT_EL_ULRANGE: ch_start++; ch_stop--; break; - default: break; - } - - if(ch_start > ch_stop) { - WARNING("Empty character range " - "alphabet constraint at line %d", ct->_lineno); - OUT_NOINDENT("#warning Empty character range " - "alphabet constraint at line %d\n", ct->_lineno); - break; - } - - for(ch = ch_start; ch <= ch_stop; ch++) { - if(ch < 0 || ch > 255) continue; - table[ch] = 1; - } - - break; - case ACT_EL_EXT: - break; - case ACT_CT_SIZE: - break; - case ACT_CT_FROM: - if(table) { - OUT("#error Nested FROM in subtype constraints\n"); - return -1; - } else { - table = alloca(256 * sizeof(table[0])); - memset(table, 0, 256 * sizeof(table[0])); - - for(el = 0; el < ct->el_count; el++) { - emit_alphabet_tables(arg, ct->elements[el], - table); - } - OUT("static int alphabet_table_%x[256] = {\n", ct); - for(ch = 0; ch < 256; ch++) { - OUT("%d,", table[ch]?1:0); - if(!((ch+1) % 16)) { - if(ch) { - int c; - OUT("\t/* "); - for(c = ch - 16; c < ch; c++) { - if(table[c]) { - if(c > 0x20 - && c < 0x80) - OUT("%c", c); - else - OUT(".", c); - } else { - OUT(" "); - } - } - OUT(" */"); - } - OUT("\n"); - } - } - OUT("};\n"); - OUT("static int check_alphabet_%x(const void *sptr) {\n", ct); - INDENT(+1); - OUT("int *table = alphabet_table_%x;\n", ct); - emit_alphabet_check_cycle(arg); - OUT("return 1;\n"); - INDENT(-1); - OUT("};\n"); - } - break; - case ACT_CT_WCOMP: - case ACT_CT_WCOMPS: - break; - case ACT_CA_CRC: - break; - case ACT_CA_SET: - case ACT_CA_CSV: - case ACT_CA_UNI: - for(el = 0; el < ct->el_count; el++) - emit_alphabet_tables(arg, ct->elements[el], table); - break; - case ACT_CA_INT: - if(table) { - int table2[256]; - - assert(ct->el_count >= 1); - emit_alphabet_tables(arg, ct->elements[0], table); - for(el = 1; el < ct->el_count; el++) { - memset(table2, 0, sizeof(table2)); - emit_alphabet_tables(arg, - ct->elements[el], table2); - /* Intersection */ - for(ch = 0; ch < 256; ch++) { - if(table2[ch] == 0) - table[ch] = 0; - } - } - } else { - for(el = 0; el < ct->el_count; el++) - emit_alphabet_tables(arg, ct->elements[el], 0); - } - - break; - case ACT_CA_EXC: - OUT("EXC\n"); - if(table) { - int table2[256]; - - assert(ct->el_count >= 1); - emit_alphabet_tables(arg, ct->elements[0], table); - for(el = 1; el < ct->el_count; el++) { - memset(table2, 0, sizeof(table2)); - emit_alphabet_tables(arg, - ct->elements[el], table2); - /* Exclusion */ - for(ch = 0; ch < 256; ch++) { - if(table2[ch]) - table[ch] = 0; - } - } - } else { - for(el = 0; el < ct->el_count; el++) - emit_alphabet_tables(arg, ct->elements[el], 0); - } - break; - } - - return 0; -} - -static int -emit_alphabet_check_cycle(arg_t *arg) { - asn1p_expr_type_e etype; - - etype = _find_terminal_type(arg); - if(!(etype & ASN_STRING_MASK) - && !(etype == ASN_BASIC_OCTET_STRING)) { - OUT("#error Cannot apply FROM constraint to ASN.1 type %s\n", - ASN_EXPR_TYPE2STR(etype)); - return -1; - } - - OUT("/* The underlying type is %s */\n", - ASN_EXPR_TYPE2STR(etype)); - OUT("const %s_t *st = sptr;\n", MKID(arg->expr->Identifier)); - - switch(etype) { - case ASN_STRING_UTF8String: - OUT("uint8_t *ch = st->buf;\n"); - OUT("uint8_t *end = ch + st->size;\n"); - OUT("\n"); - OUT("for(; ch < end; ch++) {\n"); - INDENT(+1); - OUT("if(*ch >= 0x80 || !table[*ch]) return 0;\n"); - INDENT(-1); - OUT("}\n"); - break; - case ASN_STRING_UniversalString: - OUT("uint32_t *ch = st->buf;\n"); - OUT("uint32_t *end = ch + st->size;\n"); - OUT("\n"); - OUT("for(; ch < end; ch++) {\n"); - INDENT(+1); - OUT("uint32_t wc = (((uint8_t *)ch)[0] << 24)\n"); - OUT("\t\t| (((uint8_t *)ch)[1] << 16)\n"); - OUT("\t\t| (((uint8_t *)ch)[2] << 8)\n"); - OUT("\t\t| ((uint8_t *)ch)[3]\n"); - OUT("if(wc > 255 || !table[wc]) return 0;\n"); - INDENT(-1); - OUT("}\n"); - OUT("if(ch != end) return 0; /* (size%4)! */\n"); - break; - case ASN_STRING_BMPString: - OUT("uint16_t *ch = st->buf;\n"); - OUT("uint16_t *end = ch + st->size;\n"); - OUT("\n"); - OUT("for(; ch < end; ch++) {\n"); - INDENT(+1); - OUT("uint16_t wc = (((uint8_t *)ch)[0] << 8)\n"); - OUT("\t\t| ((uint8_t *)ch)[1];\n"); - OUT("if(wc > 255 || !table[wc]) return 0;\n"); - INDENT(-1); - OUT("}\n"); - OUT("if(ch != end) return 0; /* (size%2)! */\n"); - break; - case ASN_BASIC_OCTET_STRING: - default: - OUT("uint8_t *ch = st->buf;\n"); - OUT("uint8_t *end = ch + st->size;\n"); - OUT("\n"); - OUT("for(; ch < end; ch++) {\n"); - INDENT(+1); - OUT("if(!table[*ch]) return 0;\n"); - INDENT(-1); - OUT("}\n"); - break; - } - - return 0; -} - -static int -emit_size_determination_code(arg_t *arg) { - asn1p_expr_type_e etype = _find_terminal_type(arg); - - switch(etype) { - case ASN_BASIC_BIT_STRING: - OUT("if(st->size > 0) {\n"); - OUT("\t/* Size in bits */\n"); - OUT("\tsize = (st->size - 1) - (st->buf[0] & 0x7);\n"); - OUT("} else {\n"); - OUT("\tsize = 0;\n"); - OUT("}\n"); - break; - case ASN_STRING_UniversalString: - OUT("size = st->size >> 2;\t/* 4 byte per character */\n"); - break; - case ASN_STRING_BMPString: - OUT("size = st->size >> 1;\t/* 2 byte per character */\n"); - break; - case ASN_STRING_UTF8String: - OUT("size = UTF8String_length(st, td->name, app_errlog, app_key);\n"); - OUT("if(size == (size_t)-1) return -1;\n"); - break; - default: - if((etype & ASN_STRING_MASK) - || etype == ASN_BASIC_OCTET_STRING) { - OUT("size = st->size;\n"); - break; - } else { - const char *type_name = ASN_EXPR_TYPE2STR(etype); - if(!type_name) type_name = arg->expr->Identifier; - WARNING("SIZE constraint is not defined for %s", - type_name); - OUT_NOINDENT("#warning SIZE constraint " - "not defined for %s!\n", type_name); - OUT("size = st->size;\n"); - } - return -1; - } - - return 0; -} - -static int -emit_value_determination_code(arg_t *arg) { - asn1p_expr_type_e etype = _find_terminal_type(arg); - - switch(etype) { - case ASN_BASIC_INTEGER: - case ASN_BASIC_ENUMERATED: - if(arg->flags & A1C_USE_NATIVE_INTEGERS) { - OUT("value = *(int *)st;\n"); - } else { - OUT("if(asn1_INTEGER2long(st, &value)) {\n"); - INDENT(+1); - OUT("_ASN_ERRLOG(app_errlog, app_key,\n"); - OUT("\t\"%%s: value too large\", td->name);\n"); - OUT("return -1;\n"); - INDENT(-1); - OUT("}\n"); - } - break; - case ASN_BASIC_BOOLEAN: - OUT("value = st->value;\n"); - break; - default: - WARNING("Value cannot be determined " - "for constraint check for %s at line %d\n", - arg->expr->Identifier, arg->expr->_lineno); - OUT("#error Value cannot be determined for %s at %d\n", - arg->expr->Identifier, arg->expr->_lineno); - break; - } - - return 0; -} - -static long compute_min_size(arg_t *arg) { return compute_xxx_size(arg, 0); } -static long compute_max_size(arg_t *arg) { return compute_xxx_size(arg, 1); } - -static long compute_xxx_size(arg_t *arg, int _max) { - asn1p_expr_type_e etype; - long basic_max = 0x7fffffff; - long basic_min = 0x80000000; - long svalue = 0; - - etype = _find_terminal_type(arg); - switch(etype) { - case ASN_BASIC_BIT_STRING: - svalue = _max?basic_max/8:0; - break; - case ASN_STRING_UTF8String: - svalue = _max?basic_max/6:0; - break; - case ASN_STRING_UniversalString: - svalue = _max?basic_max/4:0; - break; - case ASN_STRING_BMPString: - svalue = _max?basic_max/2:0; - break; - case ASN_BASIC_OCTET_STRING: - svalue = _max?basic_max:0; - break; - default: - if((etype & ASN_STRING_MASK)) { - svalue = _max?basic_max:0; - break; - } - svalue = _max?basic_max:basic_min; - break; - } - - return svalue; -} - -static asn1p_expr_type_e -_find_terminal_type(arg_t *arg) { - asn1p_expr_t *expr; - expr = asn1f_find_terminal_type_ex(arg->asn, arg->mod, arg->expr, NULL); - if(expr) return expr->expr_type; - return A1TC_INVALID; -} - diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c new file mode 100644 index 000000000..dd54224da --- /dev/null +++ b/libasn1compiler/asn1c_constraint.c @@ -0,0 +1,482 @@ +#include "asn1c_internal.h" +#include "asn1c_constraint.h" + +#include /* constraint groker from libasn1fix */ +#include /* other exportable stuff from libasn1fix */ + +static int emit_alphabet_check_loop(arg_t *arg, asn1cnst_range_t *range); +static int emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype); +static int emit_size_determination_code(arg_t *arg, asn1p_expr_type_e etype); +static asn1p_expr_type_e _find_terminal_type(arg_t *arg); +static int emit_range_comparison_code(arg_t *arg, asn1cnst_range_t *range, const char *varname, asn1_integer_t natural_start, asn1_integer_t natural_stop); + +#define MKID(id) asn1c_make_identifier(0, (id), 0) + +static int global_compile_mark; + +int +asn1c_emit_constraint_checking_code(arg_t *arg) { + asn1cnst_range_t *r_size; + asn1cnst_range_t *r_value; + asn1p_expr_t *expr = arg->expr; + asn1p_expr_type_e etype; + asn1p_constraint_t *ct; + int got_something = 0; + + ct = expr->combined_constraints; + if(ct == NULL) + return 1; /* No additional constraints defined */ + + etype = _find_terminal_type(arg); + + r_value=asn1constraint_compute_PER_range(etype, ct, ACT_EL_RANGE, 0, 0); + r_size = asn1constraint_compute_PER_range(etype, ct, ACT_CT_SIZE, 0, 0); + if(r_value) { + if(r_value->not_PER_visible + || r_value->extensible + || r_value->empty_constraint + || (r_value->left.type == ARE_MIN + && r_value->right.type == ARE_MAX) + || (etype == ASN_BASIC_BOOLEAN + && r_value->left.value == 0 + && r_value->right.value == 1) + ) { + asn1constraint_range_free(r_value); + r_value = 0; + } + } + if(r_size) { + if(r_size->not_PER_visible + || r_size->extensible + || r_size->empty_constraint + || (r_size->left.value == 0 /* or .type == MIN */ + && r_size->right.type == ARE_MAX) + ) { + asn1constraint_range_free(r_size); + r_size = 0; + } + } + + OUT("const %s_t *st = sptr;\n", MKID(arg->expr->Identifier)); + + if(r_size || r_value) { + if(r_size) { + OUT("size_t size;\n"); + } + if(r_value) + switch(etype) { + case ASN_BASIC_INTEGER: + case ASN_BASIC_ENUMERATED: + OUT("long value;\n"); + break; + case ASN_BASIC_BOOLEAN: + OUT("int value;\n"); + break; + default: + break; + } + } + + OUT("\n"); + + /* + * Protection against null input. + */ + OUT("if(!sptr) {\n"); + INDENT(+1); + OUT("_ASN_ERRLOG(app_errlog, app_key,\n"); + OUT("\t\"%%s: value not given\", td->name);\n"); + OUT("return -1;\n"); + INDENT(-1); + OUT("}\n"); + OUT("\n"); + + if(r_value) + emit_value_determination_code(arg, etype); + if(r_size) + emit_size_determination_code(arg, etype); + + /* + * Here is an if() {} else {} constaint checking code. + */ + OUT("\n"); + OUT("if("); + INDENT(+1); + if(r_size) { + if(got_something++) { OUT("\n"); OUT(" && "); } + OUT("("); + emit_range_comparison_code(arg, r_size, "size", 0, -1); + OUT(")"); + } + if(r_value) { + if(got_something++) { OUT("\n"); OUT(" && "); } + OUT("("); + if(etype == ASN_BASIC_BOOLEAN) + emit_range_comparison_code(arg, r_value, + "value", 0, 1); + else + emit_range_comparison_code(arg, r_value, + "value", -1, -1); + OUT(")"); + } + if(ct->_compile_mark) { + if(got_something++) { OUT("\n"); OUT(" && "); } + OUT("check_permitted_alphabet_%d(sptr)", + ct->_compile_mark); + } + if(!got_something) { + OUT("1 /* No applicable constraints whatsoever */"); + } + INDENT(-1); + OUT(") {\n"); + INDENT(+1); + OUT("/* Constraint check succeeded */\n"); + OUT("return 1;\n"); + INDENT(-1); + OUT("} else {\n"); + INDENT(+1); + OUT("_ASN_ERRLOG(app_errlog, app_key,\n"); + OUT("\t\"%%s: constraint failed\", td->name);\n"); + OUT("return -1;\n"); + INDENT(-1); + OUT("}\n"); + + return 0; +} + +int +asn1c_emit_constraint_tables(arg_t *arg, asn1p_constraint_t *ct) { + asn1_integer_t range_start; + asn1_integer_t range_stop; + asn1p_expr_type_e etype; + asn1cnst_range_t *range; + int table[256]; + int use_table; + + if(!ct) ct = arg->expr->combined_constraints; + if(!ct) return 0; + + etype = _find_terminal_type(arg); + + range = asn1constraint_compute_PER_range(etype, ct, ACT_CT_FROM, 0, 0); + if(!range) return 0; + + if(range->not_PER_visible + || range->extensible + || range->empty_constraint) { + asn1constraint_range_free(range); + return 0; + } + + range_start = range->left.value; + range_stop = range->right.value; + assert(range->left.type == ARE_VALUE); + assert(range->right.type == ARE_VALUE); + assert(range_start <= range_stop); + + range_start = 0; /* Force old behavior */ + + /* + * Check if we need a test table to check the alphabet. + */ + use_table = 1; + if((range_stop - range_start) > 255) + use_table = 0; + if(range->el_count == 0) + use_table = 0; + + if(!ct->_compile_mark) + ct->_compile_mark = ++global_compile_mark; + + if(use_table) { + int i, n = 0; + int untl; + memset(table, 0, sizeof(table)); + for(i = -1; i < range->el_count; i++) { + asn1cnst_range_t *r; + asn1_integer_t v; + if(i == -1) { + if(range->el_count) continue; + r = range; + } else { + r = range->elements[i]; + } + for(v = r->left.value; v <= r->right.value; v++) { + assert((v - range_start) >= 0); + assert((v - range_start) < 256); + table[v - range_start] = ++n; + } + } + + OUT("static int permitted_alphabet_table_%d[256] = {\n", + ct->_compile_mark); + untl = (range_stop - range_start) + 1; + untl += (untl % 16)?16 - (untl % 16):0; + for(n = 0; n < untl; n++) { + OUT("%d,", table[n]?1:0); + if(!((n+1) % 16)) { + int c; + if(!n) { + OUT("\n"); + continue; + } + OUT("\t/* "); + for(c = n - 15; c <= n; c++) { + if(table[c]) { + int a = c + range_start; + if(a > 0x20 && a < 0x80) + OUT("%c", a); + else + OUT("."); + } else { + OUT(" "); + } + } + OUT(" */"); + OUT("\n"); + } + } + OUT("};\n"); + OUT("\n"); + } + + OUT("static int check_permitted_alphabet_%d(const void *sptr) {\n", + ct->_compile_mark); + INDENT(+1); + if(use_table) { + OUT("int *table = permitted_alphabet_table_%d;\n", + ct->_compile_mark); + emit_alphabet_check_loop(arg, 0); + } else { + emit_alphabet_check_loop(arg, range); + } + OUT("return 1;\n"); + INDENT(-1); + OUT("}\n"); + OUT("\n"); + + asn1constraint_range_free(range); + + return 0; +} + +static int +emit_alphabet_check_loop(arg_t *arg, asn1cnst_range_t *range) { + asn1p_expr_type_e etype; + asn1_integer_t natural_stop; + + etype = _find_terminal_type(arg); + + OUT("/* The underlying type is %s */\n", + ASN_EXPR_TYPE2STR(etype)); + OUT("const %s_t *st = sptr;\n", MKID(arg->expr->Identifier)); + + switch(etype) { + case ASN_STRING_UTF8String: + OUT("uint8_t *ch = st->buf;\n"); + OUT("uint8_t *end = ch + st->size;\n"); + OUT("\n"); + OUT("for(; ch < end; ch++) {\n"); + INDENT(+1); + OUT("uint8_t cv = *ch;\n"); + if(!range) OUT("if(cv >= 0x80) return 0;\n"); + natural_stop = 0xffffffffUL; + break; + case ASN_STRING_UniversalString: + OUT("uint32_t *ch = st->buf;\n"); + OUT("uint32_t *end = ch + st->size;\n"); + OUT("\n"); + OUT("if(st->size % 4) return 0; /* (size%4)! */\n"); + OUT("for(; ch < end; ch++) {\n"); + INDENT(+1); + OUT("uint32_t cv = (((uint8_t *)ch)[0] << 24)\n"); + OUT("\t\t| (((uint8_t *)ch)[1] << 16)\n"); + OUT("\t\t| (((uint8_t *)ch)[2] << 8)\n"); + OUT("\t\t| ((uint8_t *)ch)[3]\n"); + if(!range) OUT("if(cv > 255) return 0;\n"); + natural_stop = 0xffffffffUL; + break; + case ASN_STRING_BMPString: + OUT("uint16_t *ch = st->buf;\n"); + OUT("uint16_t *end = ch + st->size;\n"); + OUT("\n"); + OUT("if(st->size % 2) return 0; /* (size%2)! */\n"); + OUT("for(; ch < end; ch++) {\n"); + INDENT(+1); + OUT("uint16_t cv = (((uint8_t *)ch)[0] << 8)\n"); + OUT("\t\t| ((uint8_t *)ch)[1];\n"); + if(!range) OUT("if(cv > 255) return 0;\n"); + natural_stop = 0xffff; + break; + case ASN_BASIC_OCTET_STRING: + default: + OUT("uint8_t *ch = st->buf;\n"); + OUT("uint8_t *end = ch + st->size;\n"); + OUT("\n"); + OUT("for(; ch < end; ch++) {\n"); + INDENT(+1); + OUT("uint8_t cv = *ch;\n"); + natural_stop = 0xff; + break; + } + + if(range) { + OUT("if(!("); + emit_range_comparison_code(arg, range, "cv", 0, natural_stop); + OUT(")) return 0;\n"); + } else { + OUT("if(!table[cv]) return 0;\n"); + } + + INDENT(-1); + OUT("}\n"); + + return 0; +} + +static int +emit_range_comparison_code(arg_t *arg, asn1cnst_range_t *range, const char *varname, asn1_integer_t natural_start, asn1_integer_t natural_stop) { + int ignore_left; + int ignore_right; + int i; + + for(i = -1; i < range->el_count; i++) { + asn1cnst_range_t *r; + if(i == -1) { + if(range->el_count) continue; + r = range; + } else { + if(i) OUT(" || "); + r = range->elements[i]; + } + + if(r != range) OUT("("); + + ignore_left = (r->left.type == ARE_MIN) + || (natural_start != -1 + && r->left.value <= natural_start); + ignore_right = (r->right.type == ARE_MAX) + || (natural_stop != -1 + && r->right.value >= natural_stop); + if(ignore_left && ignore_right) { + OUT("1 /* Constraint matches natural range of %s */", + varname); + continue; + } + + if(ignore_left) { + OUT("%s <= %lld", varname, + (long long)r->right.value); + } else if(ignore_right) { + OUT("%s >= %lld", varname, + (long long)r->left.value); + } else if(r->left.value == r->right.value) { + OUT("%s == %lld", varname, + (long long)r->right.value); + } else { + OUT("%s >= %lld && %s <= %lld", + varname, + (long long)r->left.value, + varname, + (long long)r->right.value); + } + if(r != range) OUT(")"); + } + + return 0; +} + +static int +emit_size_determination_code(arg_t *arg, asn1p_expr_type_e etype) { + + switch(etype) { + case ASN_BASIC_BIT_STRING: + OUT("if(st->size > 0) {\n"); + OUT("\t/* Size in bits */\n"); + OUT("\tsize = (st->size - 1) - (st->buf[0] & 0x7);\n"); + OUT("} else {\n"); + OUT("\tsize = 0;\n"); + OUT("}\n"); + break; + case ASN_STRING_UniversalString: + OUT("size = st->size >> 2;\t/* 4 byte per character */\n"); + break; + case ASN_STRING_BMPString: + OUT("size = st->size >> 1;\t/* 2 byte per character */\n"); + break; + case ASN_STRING_UTF8String: + OUT("size = UTF8String_length(st, td->name, app_errlog, app_key);\n"); + OUT("if(size == (size_t)-1) return -1;\n"); + break; + case ASN_CONSTR_SET_OF: + case ASN_CONSTR_SEQUENCE_OF: + OUT("{ /* Determine the number of elements */\n"); + INDENT(+1); + OUT("A_%s_OF(void) *list;\n", + etype==ASN_CONSTR_SET_OF?"SET":"SEQUENCE"); + OUT("(void *)list = st;\n"); + OUT("size = list->count;\n"); + INDENT(-1); + OUT("}\n"); + break; + default: + if((etype & ASN_STRING_MASK) + || etype == ASN_BASIC_OCTET_STRING) { + OUT("size = st->size;\n"); + break; + } else { + const char *type_name = ASN_EXPR_TYPE2STR(etype); + if(!type_name) type_name = arg->expr->Identifier; + WARNING("SizeConstraint is not defined for %s", + type_name); + OUT_NOINDENT("#warning SizeConstraint " + "is not defined for %s!\n", type_name); + OUT("size = st->size;\n"); + } + return -1; + } + + return 0; +} + +static int +emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype) { + + switch(etype) { + case ASN_BASIC_INTEGER: + case ASN_BASIC_ENUMERATED: + if(arg->flags & A1C_USE_NATIVE_INTEGERS) { + OUT("value = *(int *)st;\n"); + } else { + OUT("if(asn1_INTEGER2long(st, &value)) {\n"); + INDENT(+1); + OUT("_ASN_ERRLOG(app_errlog, app_key,\n"); + OUT("\t\"%%s: value too large\", td->name);\n"); + OUT("return -1;\n"); + INDENT(-1); + OUT("}\n"); + } + break; + case ASN_BASIC_BOOLEAN: + OUT("value = (*(int *)st) ? 1 : 0;\n"); + break; + default: + WARNING("Value cannot be determined " + "for constraint check for %s at line %d\n", + arg->expr->Identifier, arg->expr->_lineno); + OUT("#error Value cannot be determined for %s at %d\n", + arg->expr->Identifier, arg->expr->_lineno); + break; + } + + return 0; +} + +static asn1p_expr_type_e +_find_terminal_type(arg_t *arg) { + asn1p_expr_t *expr; + expr = asn1f_find_terminal_type_ex(arg->asn, arg->mod, arg->expr, NULL); + if(expr) return expr->expr_type; + return A1TC_INVALID; +} + diff --git a/libasn1compiler/asn1c_constraint.h b/libasn1compiler/asn1c_constraint.h new file mode 100644 index 000000000..481c0b342 --- /dev/null +++ b/libasn1compiler/asn1c_constraint.h @@ -0,0 +1,7 @@ +#ifndef _ASN1C_CONSTRAINT_H_ +#define _ASN1C_CONSTRAINT_H_ + +int asn1c_emit_constraint_tables(arg_t *arg, asn1p_constraint_t *ct); +int asn1c_emit_constraint_checking_code(arg_t *arg); + +#endif /* _ASN1C_CONSTRAINT_H_ */ diff --git a/libasn1compiler/asn1c_internal.h b/libasn1compiler/asn1c_internal.h index 08a490fb7..061b93638 100644 --- a/libasn1compiler/asn1c_internal.h +++ b/libasn1compiler/asn1c_internal.h @@ -11,7 +11,7 @@ #include /* for unlink(2) */ #include /* for open(2) */ #include /* for glob(3) */ -#include +#include /* for strlen(3) and memset(3) */ #include /* for isalnum(3) */ #include #include From e0d73f9e5297e8d9ec33e606d0cb5fc419d47046 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 19 Aug 2004 13:31:12 +0000 Subject: [PATCH 0150/1469] obsolete flag removed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@150 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/README b/tests/README index abba35024..b2966e03b 100644 --- a/tests/README +++ b/tests/README @@ -21,4 +21,4 @@ Where Example: 07-int-OK.asn1 # Correct ASN.1 file - 07-int-OK.asn1.-EFN # Test of file regeneration with -EFN flags. + 07-int-OK.asn1.-EF # Test of file regeneration with -E -F flags. From 7f836ed28c893d359ea4e75d1634dd8aacd5f1a9 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 19 Aug 2004 13:31:52 +0000 Subject: [PATCH 0151/1469] TODO updated git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@151 59561ff5-6e30-0410-9f3c-9617f08c8826 --- TODO | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/TODO b/TODO index 1316b857a..21f117b07 100644 --- a/TODO +++ b/TODO @@ -1,18 +1,10 @@ MAJOR: -1. Support for the explicit subtype constraints: - Name ::= IA5String (FROM("A".."Z")) - Status: in progress. +1. Support for PER encoding. Requires advanced subtype constraints support (#1) 2. Support for Information Object Classes. Status: support for parsing IOCs is mostly present. Support for slicing the IOCs to produce "views" is not yet designed. -3. Support for PER encoding. Requires advanced subtype constraints support (#1) - -4. Support for XER encoding. - -MISC: - -1. Make sure asn1_DEF__tags is not an empty structure. +3. Support for XER encoding. From 7498f7ee394e784f3916430817ff6f8a1dc649ca Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 19 Aug 2004 13:32:17 +0000 Subject: [PATCH 0152/1469] new member for compiler git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@152 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_constr.h | 1 + 1 file changed, 1 insertion(+) diff --git a/libasn1parser/asn1p_constr.h b/libasn1parser/asn1p_constr.h index d3756780b..c83d58bd3 100644 --- a/libasn1parser/asn1p_constr.h +++ b/libasn1parser/asn1p_constr.h @@ -57,6 +57,7 @@ typedef struct asn1p_constraint_s { int el_size; /* Size of the allocated (elements) */ int _lineno; /* Position in a source file */ + int _compile_mark; /* Marker used by the compiler */ } asn1p_constraint_t; /* Human-readable constraint type description */ From 46467a9648a69946e479cf85ad82f09d7ad78460 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 19 Aug 2004 13:32:46 +0000 Subject: [PATCH 0153/1469] uclass2str git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@153 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_expr2uclass.h | 36 +++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/libasn1parser/asn1p_expr2uclass.h b/libasn1parser/asn1p_expr2uclass.h index 20f37003d..8812a0be5 100644 --- a/libasn1parser/asn1p_expr2uclass.h +++ b/libasn1parser/asn1p_expr2uclass.h @@ -1,8 +1,7 @@ #ifndef ASN1_PARSER_EXPR2UCLASS_H #define ASN1_PARSER_EXPR2UCLASS_H -static int -expr_type2uclass_value[ASN_EXPR_TYPE_MAX] +static int expr_type2uclass_value[ASN_EXPR_TYPE_MAX] __attribute__ ((unused)) = { [ ASN_BASIC_BOOLEAN ] = 1, [ ASN_BASIC_INTEGER ] = 2, @@ -38,4 +37,37 @@ expr_type2uclass_value[ASN_EXPR_TYPE_MAX] [ ASN_STRING_BMPString ] = 30, }; +static char *expr_uclass2str[32] __attribute__ ((unused)) = { + [ 0 ] = 0, /* If zero length, end-of-content */ + [ 1 ] = "BOOLEAN", + [ 2 ] = "INTEGER", + [ 3 ] = "BIT STRING", + [ 4 ] = "OCTET STRING", + [ 5 ] = "NULL", + [ 6 ] = "OBJECT IDENTIFIER", + [ 7 ] = "ObjectDescriptor", + [ 8 ] = "EXTERNAL", + [ 9 ] = "REAL", + [ 10 ] = "ENUMERATED", + [ 11 ] = "EMBEDDED-PDV", + [ 12 ] = "UTF8String", + [ 13 ] = "RELATIVE-OID", + [ 14 ] = 0, + [ 16 ] = "SEQUENCE", /* Or "SEQUENCE OF" */ + [ 17 ] = "SET", /* Or "SET OF" */ + [ 18 ] = "NumericString", /* " "|"0".."9" */ + [ 19 ] = "PrintableString", + [ 20 ] = "TeletexString", + [ 21 ] = "VideotexString", + [ 22 ] = "IA5String", + [ 23 ] = "UTCTime", + [ 24 ] = "GeneralizedTime", + [ 25 ] = "GraphicString", + [ 26 ] = "VisibleString", + [ 27 ] = "GeneralString", + [ 28 ] = "UniversalString", /* 32-bit UCS-4 */ + [ 29 ] = "CharacterString", + [ 30 ] = "BMPString", /* 16-bit UCS-2 */ +}; + #endif /* ASN1_PARSER_EXPR2UCLASS_H */ From 9acbb12c2f7546a8579fdb3e7725ceb46d1eb27c Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 19 Aug 2004 13:32:59 +0000 Subject: [PATCH 0154/1469] removed checker git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@154 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/Makefile.am | 7 -- libasn1parser/Makefile.in | 134 ++++++-------------------------------- 2 files changed, 19 insertions(+), 122 deletions(-) diff --git a/libasn1parser/Makefile.am b/libasn1parser/Makefile.am index 0f9ff1611..8e4700ff0 100644 --- a/libasn1parser/Makefile.am +++ b/libasn1parser/Makefile.am @@ -26,10 +26,3 @@ asn1p_expr_str.h: expr-h.pl asn1p_expr.h ./expr-h.pl asn1p_expr.h > $@ EXTRA_DIST = expr-h.pl - -check_PROGRAMS = check_parser - -LDADD = ${noinst_LTLIBRARIES} -DEPENDENCIES = ${noinst_LTLIBRARIES} - -TESTS = ${check_PROGRAMS} diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index 93bf68e04..3afcae702 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -14,7 +14,7 @@ @SET_MAKE@ -SOURCES = $(libasn1parser_la_SOURCES) check_parser.c +SOURCES = $(libasn1parser_la_SOURCES) srcdir = @srcdir@ top_srcdir = @top_srcdir@ @@ -39,7 +39,6 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ -check_PROGRAMS = check_parser$(EXEEXT) subdir = libasn1parser DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in asn1p_l.c \ asn1p_y.c asn1p_y.h @@ -57,11 +56,6 @@ am_libasn1parser_la_OBJECTS = asn1parser.lo asn1p_y.lo asn1p_l.lo \ asn1p_xports.lo asn1p_constr.lo asn1p_param.lo asn1p_class.lo \ asn1p_ref.lo libasn1parser_la_OBJECTS = $(am_libasn1parser_la_OBJECTS) -check_parser_SOURCES = check_parser.c -check_parser_OBJECTS = check_parser.$(OBJEXT) -check_parser_LDADD = $(LDADD) -am__DEPENDENCIES_1 = libasn1parser.la -check_parser_DEPENDENCIES = $(am__DEPENDENCIES_1) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @@ -74,8 +68,7 @@ am__depfiles_maybe = depfiles @AMDEP_TRUE@ ./$(DEPDIR)/asn1p_ref.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/asn1p_value.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/asn1p_xports.Plo \ -@AMDEP_TRUE@ ./$(DEPDIR)/asn1p_y.Plo ./$(DEPDIR)/asn1parser.Plo \ -@AMDEP_TRUE@ ./$(DEPDIR)/check_parser.Po +@AMDEP_TRUE@ ./$(DEPDIR)/asn1p_y.Plo ./$(DEPDIR)/asn1parser.Plo COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ @@ -89,8 +82,8 @@ LTLEXCOMPILE = $(LIBTOOL) --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) LTYACCCOMPILE = $(LIBTOOL) --mode=compile $(YACC) $(YFLAGS) \ $(AM_YFLAGS) -SOURCES = $(libasn1parser_la_SOURCES) check_parser.c -DIST_SOURCES = $(libasn1parser_la_SOURCES) check_parser.c +SOURCES = $(libasn1parser_la_SOURCES) +DIST_SOURCES = $(libasn1parser_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -226,9 +219,6 @@ libasn1parser_la_SOURCES = \ asn1p_list.h EXTRA_DIST = expr-h.pl -LDADD = ${noinst_LTLIBRARIES} -DEPENDENCIES = ${noinst_LTLIBRARIES} -TESTS = ${check_PROGRAMS} all: all-am .SUFFIXES: @@ -279,16 +269,6 @@ asn1p_y.h: asn1p_y.c libasn1parser.la: $(libasn1parser_la_OBJECTS) $(libasn1parser_la_DEPENDENCIES) $(LINK) $(libasn1parser_la_LDFLAGS) $(libasn1parser_la_OBJECTS) $(libasn1parser_la_LIBADD) $(LIBS) -clean-checkPROGRAMS: - @list='$(check_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done -check_parser$(EXEEXT): $(check_parser_OBJECTS) $(check_parser_DEPENDENCIES) - @rm -f check_parser$(EXEEXT) - $(LINK) $(check_parser_LDFLAGS) $(check_parser_OBJECTS) $(check_parser_LDADD) $(LIBS) - mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -307,7 +287,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1p_xports.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1p_y.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1parser.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_parser.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @@ -416,79 +395,6 @@ GTAGS: distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; skip=0; \ - srcdir=$(srcdir); export srcdir; \ - list='$(TESTS)'; \ - if test -n "$$list"; then \ - for tst in $$list; do \ - if test -f ./$$tst; then dir=./; \ - elif test -f $$tst; then dir=; \ - else dir="$(srcdir)/"; fi; \ - if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *" $$tst "*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - echo "XPASS: $$tst"; \ - ;; \ - *) \ - echo "PASS: $$tst"; \ - ;; \ - esac; \ - elif test $$? -ne 77; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *" $$tst "*) \ - xfail=`expr $$xfail + 1`; \ - echo "XFAIL: $$tst"; \ - ;; \ - *) \ - failed=`expr $$failed + 1`; \ - echo "FAIL: $$tst"; \ - ;; \ - esac; \ - else \ - skip=`expr $$skip + 1`; \ - echo "SKIP: $$tst"; \ - fi; \ - done; \ - if test "$$failed" -eq 0; then \ - if test "$$xfail" -eq 0; then \ - banner="All $$all tests passed"; \ - else \ - banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ - fi; \ - else \ - if test "$$xpass" -eq 0; then \ - banner="$$failed of $$all tests failed"; \ - else \ - banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ - fi; \ - fi; \ - dashes="$$banner"; \ - skipped=""; \ - if test "$$skip" -ne 0; then \ - skipped="($$skip tests were not run)"; \ - test `echo "$$skipped" | wc -c` -gt `echo "$$banner" | wc -c` && \ - dashes="$$skipped"; \ - fi; \ - report=""; \ - if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ - report="Please report to $(PACKAGE_BUGREPORT)"; \ - test `echo "$$report" | wc -c` -gt `echo "$$banner" | wc -c` && \ - dashes="$$report"; \ - fi; \ - dashes=`echo "$$dashes" | sed s/./=/g`; \ - echo "$$dashes"; \ - echo "$$banner"; \ - test -n "$$skipped" && echo "$$skipped"; \ - test -n "$$report" && echo "$$report"; \ - echo "$$dashes"; \ - test "$$failed" -eq 0; \ - else :; fi - distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ @@ -517,8 +423,6 @@ distdir: $(DISTFILES) fi; \ done check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) - $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: @@ -546,13 +450,13 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." - -rm -f asn1p_y.h - -rm -f asn1p_l.c -rm -f asn1p_y.c + -rm -f asn1p_l.c + -rm -f asn1p_y.h clean: clean-am -clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ - clean-noinstLTLIBRARIES mostlyclean-am +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) @@ -600,17 +504,17 @@ ps-am: uninstall-am: uninstall-info-am -.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ - clean-checkPROGRAMS clean-generic clean-libtool \ - clean-noinstLTLIBRARIES ctags distclean distclean-compile \ - distclean-generic distclean-libtool distclean-tags distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-exec install-exec-am \ - install-info install-info-am install-man install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags uninstall uninstall-am uninstall-info-am +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-info-am asn1p_expr_str.h: expr-h.pl asn1p_expr.h From 7ce9add9f72d4b561360480de1f1f7edc8366997 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 19 Aug 2004 13:35:01 +0000 Subject: [PATCH 0155/1469] versioning git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@155 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 5 ++++- configure | 3 +-- configure.in | 3 +-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1b9dec454..5a6116ca0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,10 @@ -0.9.1: 2004-Aug-12 +0.9: 2004-Aug-19 * Reworked subtype constraints handling, aiming at PER-applicability. + * BOOLEAN and NULL are now implemented in terms of native int type. + * Compiler now links in only necessary skeleton files. + * -t option added to asn1c to ease BER manual decoding. 0.8.19: 2004-Aug-18 diff --git a/configure b/configure index c487bd54f..3b3c8233a 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.9.1 + VERSION=0.9 cat >>confdefs.h <<_ACEOF @@ -21409,7 +21409,6 @@ fi; case "$GCC" in yes) - CFLAGS="$CFLAGS -W" CFLAGS="$CFLAGS -Wall" CFLAGS="$CFLAGS -Wshadow" CFLAGS="$CFLAGS -Wcast-qual" diff --git a/configure.in b/configure.in index df8d6d889..9f74993ca 100644 --- a/configure.in +++ b/configure.in @@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_SYSTEM AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.9.1) +AM_INIT_AUTOMAKE(asn1c, 0.9) AC_SUBST(PATH) @@ -53,7 +53,6 @@ AC_SUBST(ADD_CFLAGS) dnl Add these flags if we're using GCC. case "$GCC" in yes) - CFLAGS="$CFLAGS -W" CFLAGS="$CFLAGS -Wall" CFLAGS="$CFLAGS -Wshadow" CFLAGS="$CFLAGS -Wcast-qual" From 67852f98f7a6389c332f6b4b362a626c6d7a5355 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 19 Aug 2004 13:45:27 +0000 Subject: [PATCH 0156/1469] oops git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@156 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_fdeps.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libasn1compiler/asn1c_fdeps.c b/libasn1compiler/asn1c_fdeps.c index cb53b3cee..68a090da8 100644 --- a/libasn1compiler/asn1c_fdeps.c +++ b/libasn1compiler/asn1c_fdeps.c @@ -136,8 +136,9 @@ asn1c_dep_add(asn1c_fdeps_t *deps, asn1c_fdeps_t *d) { } if(deps->el_count == deps->el_size) { + void *p; n = deps->el_size?deps->el_size << 2:16; - void *p = realloc(deps->elements, + p = realloc(deps->elements, n * sizeof(deps->elements[0])); assert(p); deps->elements = p; From 6a64439af479d742d2c802f2b3523378be8ac2ce Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 19 Aug 2004 14:47:37 +0000 Subject: [PATCH 0157/1469] another one git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@157 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/check-ber_tlv_tag.c | 1 + 1 file changed, 1 insertion(+) diff --git a/skeletons/tests/check-ber_tlv_tag.c b/skeletons/tests/check-ber_tlv_tag.c index 41184202c..98d5c3e37 100644 --- a/skeletons/tests/check-ber_tlv_tag.c +++ b/skeletons/tests/check-ber_tlv_tag.c @@ -19,6 +19,7 @@ struct tag_control_s { { 1, { 29 }, 1, ASN_TAG_CLASS_UNIVERSAL, 29, 0 }, { 1, { 0xbf, 31 }, 0, ASN_TAG_CLASS_CONTEXT, 31, 1 }, { 2, { 0xbf, 31 }, 1, ASN_TAG_CLASS_CONTEXT, 31, 1 }, + { 2, { 0xbf, 83 }, 1, ASN_TAG_CLASS_CONTEXT, 83, 1 }, { 2, { 0xbf, 127 }, 1, ASN_TAG_CLASS_CONTEXT, 127, 1 }, { 2, { 0xbf, 129 }, 0, ASN_TAG_CLASS_CONTEXT, 127, 1 }, { 3, { 0xbf, 129, 0 }, 1, ASN_TAG_CLASS_CONTEXT, 128, 1 }, From 5ee0b9b2ab86226287c4b4f304f2050eb73fe5e6 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 19 Aug 2004 16:42:54 +0000 Subject: [PATCH 0158/1469] new file git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@158 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/Makefile.am | 1 + skeletons/tests/check-length.c | 93 ++++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 skeletons/tests/check-length.c diff --git a/skeletons/tests/Makefile.am b/skeletons/tests/Makefile.am index b186fe049..0c93ef9e5 100644 --- a/skeletons/tests/Makefile.am +++ b/skeletons/tests/Makefile.am @@ -2,6 +2,7 @@ AM_CPPFLAGS = -I$(top_srcdir)/skeletons check_PROGRAMS = \ check-ber_tlv_tag \ + check-length \ check-OIDs \ check-GeneralizedTime \ check-UTCTime \ diff --git a/skeletons/tests/check-length.c b/skeletons/tests/check-length.c new file mode 100644 index 000000000..d0edde37a --- /dev/null +++ b/skeletons/tests/check-length.c @@ -0,0 +1,93 @@ +#include +#include +#include +#include +#include +#undef ADVANCE +#undef RETURN +#undef LEFT +#include + + +uint8_t *buf; +size_t buf_size; +size_t buf_off; + +static int +write_to_buf(const void *buffer, size_t size, void *key) { + (void)key; + + if(buf_off + size > buf_size) { + size_t n = buf_size?:16; + while(n < buf_off + size) n <<= 2; + buf = realloc(buf, n); + assert(buf); + buf_size = n; + } + + memcpy(buf + buf_off, buffer, size); + + buf_off += size; + return 0; +} + + +static void +check(int size) { + OCTET_STRING_t *os; + OCTET_STRING_t *nos = 0; + der_enc_rval_t erval; + ber_dec_rval_t rval; + int i; + + os = OCTET_STRING_new_fromBuf(0, size); + assert(os); + assert(os->size == 0); + + os->buf = malloc(size); + assert(os->buf); + os->size = size; + + for(i = 0; i < size; i++) { + os->buf[i] = i; + } + + buf_off = 0; + erval = der_encode(&asn1_DEF_OCTET_STRING, + os, write_to_buf, 0); + assert(erval.encoded == buf_off); + assert(buf_off > size); + + rval = ber_decode(&asn1_DEF_OCTET_STRING, &nos, buf, buf_off); + assert(rval.code == RC_OK); + assert(rval.consumed == buf_off); + + assert(os->size == nos->size); + + for(i = 0; i < size; i++) { + assert(os->buf[i] == nos->buf[i]); + } + + if(0) { + printf("new(%d):", size); + for(i = 0; i < (buf_off<10?buf_off:10); i++) + printf(" %02x", buf[i]); + printf("\n"); + } + + + asn1_DEF_OCTET_STRING.free_struct(&asn1_DEF_OCTET_STRING, os, 0); + asn1_DEF_OCTET_STRING.free_struct(&asn1_DEF_OCTET_STRING, nos, 0); +} + +int +main() { + int i; + + for(i = 0; i < 66000; i++) { + if(i == 4500) i = 64000; + check(i); + } + + return 0; +} From d81ec372ec36f38ee55d1b034d48c7640885462a Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 19 Aug 2004 16:43:57 +0000 Subject: [PATCH 0159/1469] updated git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@159 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/Makefile.in | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/skeletons/tests/Makefile.in b/skeletons/tests/Makefile.in index 57759e92c..82dc62513 100644 --- a/skeletons/tests/Makefile.in +++ b/skeletons/tests/Makefile.in @@ -13,7 +13,7 @@ # PARTICULAR PURPOSE. @SET_MAKE@ -SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c check-UTCTime.c check-ber_tlv_tag.c +SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c check-UTCTime.c check-ber_tlv_tag.c check-length.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ @@ -38,9 +38,9 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ -check_PROGRAMS = check-ber_tlv_tag$(EXEEXT) check-OIDs$(EXEEXT) \ - check-GeneralizedTime$(EXEEXT) check-UTCTime$(EXEEXT) \ - check-INTEGER$(EXEEXT) +check_PROGRAMS = check-ber_tlv_tag$(EXEEXT) check-length$(EXEEXT) \ + check-OIDs$(EXEEXT) check-GeneralizedTime$(EXEEXT) \ + check-UTCTime$(EXEEXT) check-INTEGER$(EXEEXT) subdir = skeletons/tests DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -65,6 +65,9 @@ check_UTCTime_LDADD = $(LDADD) check_ber_tlv_tag_SOURCES = check-ber_tlv_tag.c check_ber_tlv_tag_OBJECTS = check-ber_tlv_tag.$(OBJEXT) check_ber_tlv_tag_LDADD = $(LDADD) +check_length_SOURCES = check-length.c +check_length_OBJECTS = check-length.$(OBJEXT) +check_length_LDADD = $(LDADD) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @@ -72,7 +75,8 @@ am__depfiles_maybe = depfiles @AMDEP_TRUE@ ./$(DEPDIR)/check-INTEGER.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-OIDs.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-UTCTime.Po \ -@AMDEP_TRUE@ ./$(DEPDIR)/check-ber_tlv_tag.Po +@AMDEP_TRUE@ ./$(DEPDIR)/check-ber_tlv_tag.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/check-length.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ @@ -82,9 +86,9 @@ CCLD = $(CC) LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c \ - check-UTCTime.c check-ber_tlv_tag.c + check-UTCTime.c check-ber_tlv_tag.c check-length.c DIST_SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c \ - check-UTCTime.c check-ber_tlv_tag.c + check-UTCTime.c check-ber_tlv_tag.c check-length.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -255,6 +259,9 @@ check-UTCTime$(EXEEXT): $(check_UTCTime_OBJECTS) $(check_UTCTime_DEPENDENCIES) check-ber_tlv_tag$(EXEEXT): $(check_ber_tlv_tag_OBJECTS) $(check_ber_tlv_tag_DEPENDENCIES) @rm -f check-ber_tlv_tag$(EXEEXT) $(LINK) $(check_ber_tlv_tag_LDFLAGS) $(check_ber_tlv_tag_OBJECTS) $(check_ber_tlv_tag_LDADD) $(LIBS) +check-length$(EXEEXT): $(check_length_OBJECTS) $(check_length_DEPENDENCIES) + @rm -f check-length$(EXEEXT) + $(LINK) $(check_length_LDFLAGS) $(check_length_OBJECTS) $(check_length_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -267,6 +274,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-OIDs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-UTCTime.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-ber_tlv_tag.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-length.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ From 15f28cb2504840a350949bd57a3dc988f5d7bc2d Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 19 Aug 2004 18:10:27 +0000 Subject: [PATCH 0160/1469] better algorithms git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@160 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ber_tlv_length.c | 37 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/skeletons/ber_tlv_length.c b/skeletons/ber_tlv_length.c index 3ce5a6b70..b3c1cebbb 100644 --- a/skeletons/ber_tlv_length.c +++ b/skeletons/ber_tlv_length.c @@ -20,7 +20,7 @@ ber_fetch_length(int _is_constructed, void *bufptr, size_t size, /* * Short definite length. */ - *len_r = (oct & 0x7F); + *len_r = oct; /* & 0x7F */ return 1; } else { ber_tlv_len_t len; @@ -38,7 +38,7 @@ ber_fetch_length(int _is_constructed, void *bufptr, size_t size, oct &= 0x7F; /* Leave only the 7 LS bits */ for(len = 0, buf++, skipped = 1; - oct && (++skipped < size); buf++, oct--) { + oct && (++skipped <= size); buf++, oct--) { len = (len << 8) | *buf; if(len < 0 @@ -118,10 +118,10 @@ ber_skip_length(int _is_constructed, void *ptr, size_t size) { ssize_t der_tlv_length_serialize(ber_tlv_len_t len, void *bufp, size_t size) { - size_t computed_size; /* Size of len encoding */ + size_t required_size; /* Size of len encoding */ uint8_t *buf = (uint8_t *)bufp; uint8_t *end; - int i; + size_t i; if(len <= 127) { /* Encoded in 1 octet */ @@ -132,28 +132,25 @@ der_tlv_length_serialize(ber_tlv_len_t len, void *bufp, size_t size) { /* * Compute the size of the subsequent bytes. */ - computed_size = sizeof(len); /* assert(sizeof(len)<128), n.p. */ - for(i = (8*(sizeof(len)-1)); i > 0; i -= 8) { - if((len >> i) & 0xFF) break; - computed_size--; + for(required_size = 1, i = 8; i < 8 * sizeof(len); i += 8) { + if(len >> i) + required_size++; + else + break; } - if(size) { - *buf++ = 0x80 | computed_size; /* Length of the encoding */ - size--; - } + if(size < required_size) + return required_size + 1; + + *buf++ = 0x80 | required_size; /* Length of the encoding */ /* * Produce the len encoding, space permitting. */ - if(size > computed_size) - end = buf + computed_size; - else - end = buf + size; - for((void)i /* Reuse bits count */; buf < end; i -= 8, buf++) { - *buf = (len >> i) & 0xFF; - } + end = buf + required_size; + for(i -= 8; buf < end; i -= 8, buf++) + *buf = (len >> i); - return computed_size + 1; + return required_size + 1; } From 4a31de292dc865a52cb5aa44e4fb922fe22e02db Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 20 Aug 2004 13:16:42 +0000 Subject: [PATCH 0161/1469] small fixes git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@161 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/Makefile.am | 2 +- asn1c/tests/check-25.c | 1 + asn1c/tests/check-35.c | 2 +- asn1c/tests/check-41.c | 7 ++----- asn1c/tests/check-assembly.sh | 6 +++--- 5 files changed, 8 insertions(+), 10 deletions(-) diff --git a/asn1c/tests/Makefile.am b/asn1c/tests/Makefile.am index 11f9b2583..24d0a38f9 100644 --- a/asn1c/tests/Makefile.am +++ b/asn1c/tests/Makefile.am @@ -11,7 +11,7 @@ else TESTS = check-*.c endif -EXTRA_DIST = ${check_SCRIPTS} check-*.c* +EXTRA_DIST = $(check_SCRIPTS) check-*.c* clean: for t in test-*; do rm -rf $$t; done diff --git a/asn1c/tests/check-25.c b/asn1c/tests/check-25.c index 5660d0564..eba3ddf25 100644 --- a/asn1c/tests/check-25.c +++ b/asn1c/tests/check-25.c @@ -103,6 +103,7 @@ check(int is_ok, uint8_t *buf, int size, size_t consumed) { assert(t.g->size == 3); assert(t.g->buf[0] == 2); assert(t.g->buf[1] == 147); + assert(t.g->buf[2] != 150); assert(t.g->buf[2] == 148); printf("%d\n", t.h->buf[3]); diff --git a/asn1c/tests/check-35.c b/asn1c/tests/check-35.c index 423549472..1d260f080 100644 --- a/asn1c/tests/check-35.c +++ b/asn1c/tests/check-35.c @@ -155,7 +155,7 @@ buf_fill(const void *buffer, size_t size, void *app_key) { return 0; } -void +static void compare(T_t *tp, uint8_t *cmp_buf, int cmp_buf_size) { der_enc_rval_t erval; int i; diff --git a/asn1c/tests/check-41.c b/asn1c/tests/check-41.c index d36ad1ec0..fc2ce66f1 100644 --- a/asn1c/tests/check-41.c +++ b/asn1c/tests/check-41.c @@ -172,7 +172,7 @@ buf_fill(const void *buffer, size_t size, void *app_key) { return 0; } -void +static void compare(T_t *tp, uint8_t *cmp_buf, int cmp_buf_size) { der_enc_rval_t erval; int i; @@ -277,12 +277,9 @@ partial_read(uint8_t *buf, size_t size) { } int -main(int ac, char **av) { +main() { T_t t; - (void)ac; /* Unused argument */ - (void)av; /* Unused argument */ - /* Check exact buf0 */ check(&t, buf0, sizeof(buf0), sizeof(buf0)); compare(&t, buf0_reconstr, sizeof(buf0_reconstr)); diff --git a/asn1c/tests/check-assembly.sh b/asn1c/tests/check-assembly.sh index d9f4afed9..f3461d3b8 100755 --- a/asn1c/tests/check-assembly.sh +++ b/asn1c/tests/check-assembly.sh @@ -40,13 +40,13 @@ SRCS=`echo *.c*` OBJS1=\${SRCS:.c=.o} OBJS=\${OBJS1:.cc=.o} check-executable: \${OBJS} - \${CC} \${CFLAGS} -o check-executable \${OBJS} + \$(CC) \$(CFLAGS) -o check-executable \$(OBJS) .SUFFIXES: .SUFFIXES: .c .cc .o .c.o: - \${CC} \${CFLAGS} -o \$@ -c \$< + \$(CC) \$(CFLAGS) -o \$@ -c \$< .cc.o: - \${CXX} \${CXXFLAGS} -o \$@ -c \$< + \$(CXX) \$(CXXFLAGS) -o \$@ -c \$< check: check-executable ./check-executable clean: From 8496088a27dc4becb68f56b30d5e9026030c0c35 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 20 Aug 2004 13:23:19 +0000 Subject: [PATCH 0162/1469] portability git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@162 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/check-length.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/tests/check-length.c b/skeletons/tests/check-length.c index d0edde37a..7746bcf30 100644 --- a/skeletons/tests/check-length.c +++ b/skeletons/tests/check-length.c @@ -58,7 +58,7 @@ check(int size) { assert(erval.encoded == buf_off); assert(buf_off > size); - rval = ber_decode(&asn1_DEF_OCTET_STRING, &nos, buf, buf_off); + rval = ber_decode(&asn1_DEF_OCTET_STRING, (void **)&nos, buf, buf_off); assert(rval.code == RC_OK); assert(rval.consumed == buf_off); From e413c1224f856188faa4259b80b1149cd2c85ad4 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 20 Aug 2004 13:23:42 +0000 Subject: [PATCH 0163/1469] new constraints model git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@163 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/BIT_STRING.c | 1 + skeletons/BMPString.c | 1 + skeletons/BOOLEAN.c | 1 + skeletons/ENUMERATED.c | 1 + skeletons/GeneralString.c | 1 + skeletons/GeneralizedTime.c | 1 + skeletons/GraphicString.c | 1 + skeletons/IA5String.c | 1 + skeletons/INTEGER.c | 1 + skeletons/ISO646String.c | 1 + skeletons/NULL.c | 1 + skeletons/NativeEnumerated.c | 2 + skeletons/NativeInteger.c | 1 + skeletons/NumericString.c | 1 + skeletons/OBJECT_IDENTIFIER.c | 1 + skeletons/OCTET_STRING.c | 1 + skeletons/ObjectDescriptor.c | 1 + skeletons/PrintableString.c | 1 + skeletons/RELATIVE-OID.c | 1 + skeletons/T61String.c | 1 + skeletons/TeletexString.c | 1 + skeletons/UTCTime.c | 1 + skeletons/UTF8String.c | 1 + skeletons/UniversalString.c | 1 + skeletons/VideotexString.c | 1 + skeletons/VisibleString.c | 1 + skeletons/constr_CHOICE.c | 82 +++++++++++++++++------------ skeletons/constr_CHOICE.h | 18 ------- skeletons/constr_SEQUENCE.c | 94 ++++++++++++++++++---------------- skeletons/constr_SEQUENCE.h | 18 ------- skeletons/constr_SEQUENCE_OF.c | 15 +++--- skeletons/constr_SET.c | 84 +++++++++++++++++------------- skeletons/constr_SET.h | 18 ------- skeletons/constr_SET_OF.c | 71 +++++++++++++++---------- skeletons/constr_SET_OF.h | 10 ---- skeletons/constr_TYPE.h | 22 +++++++- 36 files changed, 244 insertions(+), 215 deletions(-) diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index 7e576a1e8..df11c19cf 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_BIT_STRING = { / sizeof(asn1_DEF_BIT_STRING_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0, 0, /* No members */ (void *)-1 /* Special indicator that this is a BIT STRING */ }; diff --git a/skeletons/BMPString.c b/skeletons/BMPString.c index d91416820..6b3ceeb3c 100644 --- a/skeletons/BMPString.c +++ b/skeletons/BMPString.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_BMPString = { / sizeof(asn1_DEF_BMPString_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c index 4f9b32444..da38772db 100644 --- a/skeletons/BOOLEAN.c +++ b/skeletons/BOOLEAN.c @@ -22,6 +22,7 @@ asn1_TYPE_descriptor_t asn1_DEF_BOOLEAN = { sizeof(asn1_DEF_BOOLEAN_tags)/sizeof(asn1_DEF_BOOLEAN_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ 0, /* Always in primitive form */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/ENUMERATED.c b/skeletons/ENUMERATED.c index 3fff36829..12350ef61 100644 --- a/skeletons/ENUMERATED.c +++ b/skeletons/ENUMERATED.c @@ -22,6 +22,7 @@ asn1_TYPE_descriptor_t asn1_DEF_ENUMERATED = { sizeof(asn1_DEF_ENUMERATED_tags)/sizeof(asn1_DEF_ENUMERATED_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ 0, /* Primitive */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/GeneralString.c b/skeletons/GeneralString.c index 6bc7e4782..db3b87d8d 100644 --- a/skeletons/GeneralString.c +++ b/skeletons/GeneralString.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_GeneralString = { / sizeof(asn1_DEF_GeneralString_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 4d1b3908d..25f2bb6e3 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -88,6 +88,7 @@ asn1_TYPE_descriptor_t asn1_DEF_GeneralizedTime = { / sizeof(asn1_DEF_GeneralizedTime_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/GraphicString.c b/skeletons/GraphicString.c index 412f3c740..bd931467e 100644 --- a/skeletons/GraphicString.c +++ b/skeletons/GraphicString.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_GraphicString = { / sizeof(asn1_DEF_GraphicString_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/IA5String.c b/skeletons/IA5String.c index c520bb295..a44a9d0f8 100644 --- a/skeletons/IA5String.c +++ b/skeletons/IA5String.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_IA5String = { / sizeof(asn1_DEF_IA5String_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 9cf146e5e..0c7a81afb 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -24,6 +24,7 @@ asn1_TYPE_descriptor_t asn1_DEF_INTEGER = { sizeof(asn1_DEF_INTEGER_tags)/sizeof(asn1_DEF_INTEGER_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ 0, /* Always in primitive form */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/ISO646String.c b/skeletons/ISO646String.c index 2df623cfa..a86d0cec3 100644 --- a/skeletons/ISO646String.c +++ b/skeletons/ISO646String.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_ISO646String = { / sizeof(asn1_DEF_ISO646String_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/NULL.c b/skeletons/NULL.c index 4ea066934..d71d90de5 100644 --- a/skeletons/NULL.c +++ b/skeletons/NULL.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_NULL = { sizeof(asn1_DEF_NULL_tags)/sizeof(asn1_DEF_NULL_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ 0, /* Always in primitive form */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c index bfb2bff1a..139a602b8 100644 --- a/skeletons/NativeEnumerated.c +++ b/skeletons/NativeEnumerated.c @@ -29,5 +29,7 @@ asn1_TYPE_descriptor_t asn1_DEF_NativeEnumerated = { sizeof(asn1_DEF_NativeEnumerated_tags)/sizeof(asn1_DEF_NativeEnumerated_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ 0, /* Always in primitive form */ + 0, 0, /* No members */ 0 /* No specifics */ }; + diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index ca29049b7..759fe27e7 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -31,6 +31,7 @@ asn1_TYPE_descriptor_t asn1_DEF_NativeInteger = { sizeof(asn1_DEF_NativeInteger_tags)/sizeof(asn1_DEF_NativeInteger_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ 0, /* Always in primitive form */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/NumericString.c b/skeletons/NumericString.c index a8d4ed8c7..6c8729ff8 100644 --- a/skeletons/NumericString.c +++ b/skeletons/NumericString.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_NumericString = { / sizeof(asn1_DEF_NumericString_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index 89e2e327c..063ae978e 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -26,6 +26,7 @@ asn1_TYPE_descriptor_t asn1_DEF_OBJECT_IDENTIFIER = { / sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ 0, /* Always in primitive form */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index e0a7bb284..8ea360d5f 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -25,6 +25,7 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { / sizeof(asn1_DEF_OCTET_STRING_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine (primitive and constructed) */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/ObjectDescriptor.c b/skeletons/ObjectDescriptor.c index db699ca02..3a03b978a 100644 --- a/skeletons/ObjectDescriptor.c +++ b/skeletons/ObjectDescriptor.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_ObjectDescriptor = { / sizeof(asn1_DEF_ObjectDescriptor_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/PrintableString.c b/skeletons/PrintableString.c index f894d82e4..8f67eddf4 100644 --- a/skeletons/PrintableString.c +++ b/skeletons/PrintableString.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_PrintableString = { / sizeof(asn1_DEF_PrintableString_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index eaf98b171..3273ace5b 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -26,6 +26,7 @@ asn1_TYPE_descriptor_t asn1_DEF_RELATIVE_OID = { / sizeof(asn1_DEF_RELATIVE_OID_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ 0, /* Always in primitive form */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/T61String.c b/skeletons/T61String.c index 2ba5d324f..2815298c2 100644 --- a/skeletons/T61String.c +++ b/skeletons/T61String.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_T61String = { / sizeof(asn1_DEF_T61String_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/TeletexString.c b/skeletons/TeletexString.c index dafbd5852..3c20e2f77 100644 --- a/skeletons/TeletexString.c +++ b/skeletons/TeletexString.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_TeletexString = { / sizeof(asn1_DEF_TeletexString_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c index 7d9711732..8b7972c01 100644 --- a/skeletons/UTCTime.c +++ b/skeletons/UTCTime.c @@ -29,6 +29,7 @@ asn1_TYPE_descriptor_t asn1_DEF_UTCTime = { / sizeof(asn1_DEF_UTCTime_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/UTF8String.c b/skeletons/UTF8String.c index 06e1559e8..aab4a2e95 100644 --- a/skeletons/UTF8String.c +++ b/skeletons/UTF8String.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_UTF8String = { / sizeof(asn1_DEF_UTF8String_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/UniversalString.c b/skeletons/UniversalString.c index 241fe673c..628ed0caa 100644 --- a/skeletons/UniversalString.c +++ b/skeletons/UniversalString.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_UniversalString = { / sizeof(asn1_DEF_UniversalString_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/VideotexString.c b/skeletons/VideotexString.c index d9293beb8..df21b149e 100644 --- a/skeletons/VideotexString.c +++ b/skeletons/VideotexString.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_VideotexString = { / sizeof(asn1_DEF_VideotexString_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/VisibleString.c b/skeletons/VisibleString.c index 4033a177d..aa9c99b18 100644 --- a/skeletons/VisibleString.c +++ b/skeletons/VisibleString.c @@ -23,6 +23,7 @@ asn1_TYPE_descriptor_t asn1_DEF_VisibleString = { / sizeof(asn1_DEF_VisibleString_tags[0]), 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ + 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 4aaad2391..3fbf194ac 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -93,13 +93,13 @@ _search4tag(const void *ap, const void *bp) { * The decoder of the CHOICE type. */ ber_dec_rval_t -CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd, +CHOICE_decode_ber(asn1_TYPE_descriptor_t *td, void **struct_ptr, void *ptr, size_t size, int tag_mode) { /* * Bring closer parts of structure description. */ - asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)sd->specifics; - asn1_CHOICE_element_t *elements = specs->elements; + asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)td->specifics; + asn1_TYPE_member_t *elements = td->elements; /* * Parts of the structure being constructed. @@ -114,7 +114,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd, ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ - ASN_DEBUG("Decoding %s as CHOICE", sd->name); + ASN_DEBUG("Decoding %s as CHOICE", td->name); /* * Create the target structure if it is not present already. @@ -142,12 +142,12 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd, * perfectly fits our expectations. */ - if(tag_mode || sd->tags_count) { - rval = ber_check_tags(sd, ctx, ptr, size, + if(tag_mode || td->tags_count) { + rval = ber_check_tags(td, ctx, ptr, size, tag_mode, &ctx->left, 0); if(rval.code != RC_OK) { ASN_DEBUG("%s tagging check failed: %d", - sd->name, rval.code); + td->name, rval.code); consumed_myself += rval.consumed; RETURN(rval.code); } @@ -172,7 +172,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd, * Fetch the T from TLV. */ tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); - ASN_DEBUG("In %s CHOICE tag length %d", sd->name, (int)tag_len); + ASN_DEBUG("In %s CHOICE tag length %d", td->name, (int)tag_len); switch(tag_len) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ @@ -197,7 +197,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd, } else if(specs->extensible == 0) { ASN_DEBUG("Unexpected tag %s " "in non-extensible CHOICE %s", - ber_tlv_tag_string(tlv_tag), sd->name); + ber_tlv_tag_string(tlv_tag), td->name); RETURN(RC_FAIL); } else { /* Skip this tag */ @@ -227,7 +227,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd, * Read in the element. */ do { - asn1_CHOICE_element_t *elm; /* CHOICE's element */ + asn1_TYPE_member_t *elm;/* CHOICE's element */ void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ @@ -252,6 +252,9 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd, /* * Invoke the member fetch routine according to member's type */ + printf("elm->name = %s\n", elm->name); + printf("elm->td = %p\n", elm->type); + printf("elm->td->name = %s\n", elm->type->name); rval = elm->type->ber_decoder(elm->type, memb_ptr2, ptr, LEFT, elm->tag_mode); @@ -278,8 +281,8 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd, /* Fall through */ case 3: ASN_DEBUG("CHOICE %s Leftover: %ld, size = %ld, tm=%d, tc=%d", - sd->name, (long)ctx->left, (long)size, - tag_mode, sd->tags_count); + td->name, (long)ctx->left, (long)size, + tag_mode, td->tags_count); if(ctx->left > 0) { /* @@ -290,7 +293,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd, } if(ctx->left == -1 - && !(tag_mode || sd->tags_count)) { + && !(tag_mode || td->tags_count)) { /* * This is an untagged CHOICE. * It doesn't contain nothing @@ -331,7 +334,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd, } } else { ASN_DEBUG("Unexpected continuation in %s", - sd->name); + td->name); RETURN(RC_FAIL); } @@ -349,19 +352,19 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd, } der_enc_rval_t -CHOICE_encode_der(asn1_TYPE_descriptor_t *sd, +CHOICE_encode_der(asn1_TYPE_descriptor_t *td, void *struct_ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)sd->specifics; - asn1_CHOICE_element_t *elm; /* CHOICE element */ + asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)td->specifics; + asn1_TYPE_member_t *elm; /* CHOICE element */ der_enc_rval_t erval; void *memb_ptr; size_t computed_size = 0; int present; ASN_DEBUG("%s %s as CHOICE", - cb?"Encoding":"Estimating", sd->name); + cb?"Encoding":"Estimating", td->name); present = _fetch_present_idx(struct_ptr, specs->pres_offset, specs->pres_size); @@ -370,14 +373,14 @@ CHOICE_encode_der(asn1_TYPE_descriptor_t *sd, * If the structure was not initialized, it cannot be encoded: * can't deduce what to encode in the choice type. */ - if(present <= 0 || present > specs->elements_count) { - if(present == 0 && specs->elements_count == 0) { + if(present <= 0 || present > td->elements_count) { + if(present == 0 && td->elements_count == 0) { /* The CHOICE is empty?! */ erval.encoded = 0; return erval; } erval.encoded = -1; - erval.failed_type = sd; + erval.failed_type = td; erval.structure_ptr = struct_ptr; return erval; } @@ -385,7 +388,7 @@ CHOICE_encode_der(asn1_TYPE_descriptor_t *sd, /* * Seek over the present member of the structure. */ - elm = &specs->elements[present-1]; + elm = &td->elements[present-1]; if(elm->optional) { memb_ptr = *(void **)((char *)struct_ptr + elm->memb_offset); if(memb_ptr == 0) { @@ -401,7 +404,7 @@ CHOICE_encode_der(asn1_TYPE_descriptor_t *sd, * T ::= [2] EXPLICIT CHOICE { ... } * Then emit the appropriate tags. */ - if(tag_mode == 1 || sd->tags_count) { + if(tag_mode == 1 || td->tags_count) { /* * For this, we need to pre-compute the member. */ @@ -414,11 +417,11 @@ CHOICE_encode_der(asn1_TYPE_descriptor_t *sd, return erval; /* Encode CHOICE with parent or my own tag */ - ret = der_write_tags(sd, erval.encoded, tag_mode, tag, + ret = der_write_tags(td, erval.encoded, tag_mode, tag, cb, app_key); if(ret == -1) { erval.encoded = -1; - erval.failed_type = sd; + erval.failed_type = td; erval.structure_ptr = struct_ptr; return erval; } @@ -454,8 +457,8 @@ CHOICE_outmost_tag(asn1_TYPE_descriptor_t *td, const void *ptr, int tag_mode, be */ present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size); - if(present > 0 || present <= specs->elements_count) { - asn1_CHOICE_element_t *elm = &specs->elements[present-1]; + if(present > 0 || present <= td->elements_count) { + asn1_TYPE_member_t *elm = &td->elements[present-1]; const void *memb_ptr; if(elm->optional) { @@ -489,8 +492,8 @@ CHOICE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * Figure out which CHOICE element is encoded. */ present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); - if(present > 0 && present <= specs->elements_count) { - asn1_CHOICE_element_t *elm = &specs->elements[present-1]; + if(present > 0 && present <= td->elements_count) { + asn1_TYPE_member_t *elm = &td->elements[present-1]; const void *memb_ptr; if(elm->optional) { @@ -500,8 +503,19 @@ CHOICE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); } - return elm->type->check_constraints(elm->type, memb_ptr, + if(elm->memb_constraints) { + return elm->memb_constraints(elm->type, memb_ptr, app_errlog, app_key); + } else { + int ret = elm->type->check_constraints(elm->type, + memb_ptr, app_errlog, app_key); + /* + * Cannot inherit it eralier: + * need to make sure we get the updated version. + */ + elm->memb_constraints = elm->type->check_constraints; + return ret; + } } else { _ASN_ERRLOG(app_errlog, app_key, "%s: no CHOICE element given", td->name); @@ -525,8 +539,8 @@ CHOICE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, /* * Free that element. */ - if(present > 0 && present <= specs->elements_count) { - asn1_CHOICE_element_t *elm = &specs->elements[present-1]; + if(present > 0 && present <= td->elements_count) { + asn1_TYPE_member_t *elm = &td->elements[present-1]; const void *memb_ptr; if(elm->optional) { @@ -566,8 +580,8 @@ CHOICE_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { /* * Free that element. */ - if(present > 0 && present <= specs->elements_count) { - asn1_CHOICE_element_t *elm = &specs->elements[present-1]; + if(present > 0 && present <= td->elements_count) { + asn1_TYPE_member_t *elm = &td->elements[present-1]; void *memb_ptr; if(elm->optional) { diff --git a/skeletons/constr_CHOICE.h b/skeletons/constr_CHOICE.h index 1308bd4ac..327bae2e4 100644 --- a/skeletons/constr_CHOICE.h +++ b/skeletons/constr_CHOICE.h @@ -7,18 +7,6 @@ #include -/* - * A single element of the CHOICE type. - */ -typedef struct asn1_CHOICE_element_s { - int memb_offset; /* Offset of the element */ - int optional; /* Whether the element is optional */ - ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ - int tag_mode; /* IMPLICIT/no/EXPLICIT tag at current level */ - asn1_TYPE_descriptor_t *type; /* Member type descriptor */ - char *name; /* ASN.1 identifier of the element */ -} asn1_CHOICE_element_t; - typedef struct asn1_CHOICE_specifics_s { /* * Target structure description. @@ -28,12 +16,6 @@ typedef struct asn1_CHOICE_specifics_s { int pres_offset; /* Identifier of the present member */ int pres_size; /* Size of the identifier (enum) */ - /* - * Members of the CHOICE structure. - */ - asn1_CHOICE_element_t *elements; - int elements_count; - /* * Tags to members mapping table. */ diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 6e1747cfa..06ef4e83c 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -103,13 +103,13 @@ _t2e_cmp(const void *ap, const void *bp) { * The decoder of the SEQUENCE type. */ ber_dec_rval_t -SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, +SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, void **struct_ptr, void *ptr, size_t size, int tag_mode) { /* * Bring closer parts of structure description. */ - asn1_SEQUENCE_specifics_t *specs = (asn1_SEQUENCE_specifics_t *)sd->specifics; - asn1_SEQUENCE_element_t *elements = specs->elements; + asn1_SEQUENCE_specifics_t *specs = (asn1_SEQUENCE_specifics_t *)td->specifics; + asn1_TYPE_member_t *elements = td->elements; /* * Parts of the structure being constructed. @@ -124,7 +124,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ int edx; /* SEQUENCE element's index */ - ASN_DEBUG("Decoding %s as SEQUENCE", sd->name); + ASN_DEBUG("Decoding %s as SEQUENCE", td->name); /* * Create the target structure if it is not present already. @@ -152,11 +152,11 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, * perfectly fits our expectations. */ - rval = ber_check_tags(sd, ctx, ptr, size, + rval = ber_check_tags(td, ctx, ptr, size, tag_mode, &ctx->left, 0); if(rval.code != RC_OK) { ASN_DEBUG("%s tagging check failed: %d", - sd->name, rval.code); + td->name, rval.code); consumed_myself += rval.consumed; RETURN(rval.code); } @@ -182,7 +182,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, * that member: * step = ( * 2 + ). */ - for(edx = (ctx->step >> 1); edx < specs->elements_count; + for(edx = (ctx->step >> 1); edx < td->elements_count; edx++, ctx->step = (ctx->step & ~1) + 2) { void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ @@ -198,20 +198,20 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, * MICROPHASE 1: Synchronize decoding. */ ASN_DEBUG("In %s SEQUENCE left %d, edx=%d opt=%d ec=%d", - sd->name, (int)ctx->left, - edx, elements[edx].optional, specs->elements_count); + td->name, (int)ctx->left, + edx, elements[edx].optional, td->elements_count); if(ctx->left == 0 /* No more stuff is expected */ && ( /* Explicit OPTIONAL specification reaches the end */ - (edx + elements[edx].optional == specs->elements_count) + (edx + elements[edx].optional == td->elements_count) || /* All extensions are optional */ (IN_EXTENSION_GROUP(specs, edx) - && specs->ext_before > specs->elements_count) + && specs->ext_before > td->elements_count) ) ) { - ASN_DEBUG("End of SEQUENCE %s", sd->name); + ASN_DEBUG("End of SEQUENCE %s", td->name); /* * Found the legitimate end of the structure. */ @@ -224,7 +224,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, */ tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); ASN_DEBUG("In %s SEQUENCE for %d %s next tag length %d", - sd->name, edx, elements[edx].name, (int)tag_len); + td->name, edx, elements[edx].name, (int)tag_len); switch(tag_len) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ @@ -236,8 +236,8 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, */ use_bsearch = 0; opt_edx_end = edx + elements[edx].optional + 1; - if(opt_edx_end > specs->elements_count) - opt_edx_end = specs->elements_count; /* Cap */ + if(opt_edx_end > td->elements_count) + opt_edx_end = td->elements_count; /* Cap */ else if(opt_edx_end - edx > 8) { /* Limit the scope of linear search... */ opt_edx_end = edx + 8; @@ -340,7 +340,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, BER_TLV_CONSTRUCTED(ptr), (char *)ptr + tag_len, LEFT - tag_len); ASN_DEBUG("Skip length %d in %s", - (int)skip, sd->name); + (int)skip, td->name); switch(skip) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ @@ -359,7 +359,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, */ ctx->step |= 1; /* Confirm entering next microphase */ microphase2: - ASN_DEBUG("Inside SEQUENCE %s MF2", sd->name); + ASN_DEBUG("Inside SEQUENCE %s MF2", td->name); /* * Compute the position of the member inside a structure, @@ -385,7 +385,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, memb_ptr2, ptr, LEFT, elements[edx].tag_mode); ASN_DEBUG("In %s SEQUENCE decoded %d %s in %d bytes code %d", - sd->name, edx, elements[edx].type->name, + td->name, edx, elements[edx].type->name, (int)rval.consumed, rval.code); switch(rval.code) { case RC_OK: @@ -409,7 +409,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, case 4: /* only 00's expected */ ASN_DEBUG("SEQUENCE %s Leftover: %ld, size = %ld", - sd->name, (long)ctx->left, (long)size); + td->name, (long)ctx->left, (long)size); /* * Skip everything until the end of the SEQUENCE. @@ -445,12 +445,12 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, } } - if(!IN_EXTENSION_GROUP(specs, specs->elements_count) + if(!IN_EXTENSION_GROUP(specs, td->elements_count) || ctx->phase == 4) { ASN_DEBUG("Unexpected continuation " "of a non-extensible type " "%s (SEQUENCE): %s", - sd->name, + td->name, ber_tlv_tag_string(tlv_tag)); RETURN(RC_FAIL); } @@ -478,23 +478,22 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *sd, * The DER encoder of the SEQUENCE type. */ der_enc_rval_t -SEQUENCE_encode_der(asn1_TYPE_descriptor_t *sd, +SEQUENCE_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_SEQUENCE_specifics_t *specs = (asn1_SEQUENCE_specifics_t *)sd->specifics; size_t computed_size = 0; der_enc_rval_t erval; ssize_t ret; int edx; ASN_DEBUG("%s %s as SEQUENCE", - cb?"Encoding":"Estimating", sd->name); + cb?"Encoding":"Estimating", td->name); /* * Gather the length of the underlying members sequence. */ - for(edx = 0; edx < specs->elements_count; edx++) { - asn1_SEQUENCE_element_t *elm = &specs->elements[edx]; + for(edx = 0; edx < td->elements_count; edx++) { + asn1_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; if(elm->optional) { memb_ptr = *(void **)((char *)ptr + elm->memb_offset); @@ -515,11 +514,11 @@ SEQUENCE_encode_der(asn1_TYPE_descriptor_t *sd, /* * Encode the TLV for the sequence itself. */ - ret = der_write_tags(sd, computed_size, tag_mode, tag, cb, app_key); + ret = der_write_tags(td, computed_size, tag_mode, tag, cb, app_key); ASN_DEBUG("Wrote tags: %ld (+%ld)", (long)ret, (long)computed_size); if(ret == -1) { erval.encoded = -1; - erval.failed_type = sd; + erval.failed_type = td; erval.structure_ptr = ptr; return erval; } @@ -530,8 +529,8 @@ SEQUENCE_encode_der(asn1_TYPE_descriptor_t *sd, /* * Encode all members. */ - for(edx = 0; edx < specs->elements_count; edx++) { - asn1_SEQUENCE_element_t *elm = &specs->elements[edx]; + for(edx = 0; edx < td->elements_count; edx++) { + asn1_TYPE_member_t *elm = &td->elements[edx]; der_enc_rval_t tmperval; void *memb_ptr; @@ -548,7 +547,7 @@ SEQUENCE_encode_der(asn1_TYPE_descriptor_t *sd, return tmperval; computed_size -= tmperval.encoded; ASN_DEBUG("Member %d %s of SEQUENCE %s encoded in %d bytes", - edx, elm->name, sd->name, tmperval.encoded); + edx, elm->name, td->name, tmperval.encoded); } if(computed_size != 0) { @@ -556,7 +555,7 @@ SEQUENCE_encode_der(asn1_TYPE_descriptor_t *sd, * Encoded size is not equal to the computed size. */ erval.encoded = -1; - erval.failed_type = sd; + erval.failed_type = td; erval.structure_ptr = ptr; } @@ -566,7 +565,6 @@ SEQUENCE_encode_der(asn1_TYPE_descriptor_t *sd, int SEQUENCE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_SEQUENCE_specifics_t *specs = (asn1_SEQUENCE_specifics_t *)td->specifics; int edx; int ret; @@ -577,8 +575,8 @@ SEQUENCE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, || cb(" ::= {\n", 7, app_key)) return -1; - for(edx = 0; edx < specs->elements_count; edx++) { - asn1_SEQUENCE_element_t *elm = &specs->elements[edx]; + for(edx = 0; edx < td->elements_count; edx++) { + asn1_TYPE_member_t *elm = &td->elements[edx]; const void *memb_ptr; if(elm->optional) { @@ -614,7 +612,6 @@ SEQUENCE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, void SEQUENCE_free(asn1_TYPE_descriptor_t *td, void *sptr, int contents_only) { - asn1_SEQUENCE_specifics_t *specs = (asn1_SEQUENCE_specifics_t *)td->specifics; int edx; if(!td || !sptr) @@ -622,8 +619,8 @@ SEQUENCE_free(asn1_TYPE_descriptor_t *td, void *sptr, int contents_only) { ASN_DEBUG("Freeing %s as SEQUENCE", td->name); - for(edx = 0; edx < specs->elements_count; edx++) { - asn1_SEQUENCE_element_t *elm = &specs->elements[edx]; + for(edx = 0; edx < td->elements_count; edx++) { + asn1_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; if(elm->optional) { memb_ptr = *(void **)((char *)sptr + elm->memb_offset); @@ -643,7 +640,6 @@ SEQUENCE_free(asn1_TYPE_descriptor_t *td, void *sptr, int contents_only) { int SEQUENCE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - asn1_SEQUENCE_specifics_t *specs = (asn1_SEQUENCE_specifics_t *)td->specifics; int edx; if(!sptr) { @@ -655,8 +651,8 @@ SEQUENCE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * Iterate over structure members and check their validity. */ - for(edx = 0; edx < specs->elements_count; edx++) { - asn1_SEQUENCE_element_t *elm = &specs->elements[edx]; + for(edx = 0; edx < td->elements_count; edx++) { + asn1_TYPE_member_t *elm = &td->elements[edx]; const void *memb_ptr; if(elm->optional) { @@ -666,8 +662,20 @@ SEQUENCE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); } - return elm->type->check_constraints(elm->type, memb_ptr, - app_errlog, app_key); + if(elm->memb_constraints) { + int ret = elm->memb_constraints(elm->type, memb_ptr, + app_errlog, app_key); + if(ret) return ret; + } else { + int ret = elm->type->check_constraints(elm->type, + memb_ptr, app_errlog, app_key); + if(ret) return ret; + /* + * Cannot inherit it earlier: + * need to make sure we get the updated version. + */ + elm->memb_constraints = elm->type->check_constraints; + } } return 0; diff --git a/skeletons/constr_SEQUENCE.h b/skeletons/constr_SEQUENCE.h index 17754bb57..1e282c2b8 100644 --- a/skeletons/constr_SEQUENCE.h +++ b/skeletons/constr_SEQUENCE.h @@ -7,18 +7,6 @@ #include -/* - * A single element of the SEQUENCE type. - */ -typedef struct asn1_SEQUENCE_element_s { - int memb_offset; /* Offset of the element */ - int optional; /* Whether the element is optional */ - ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ - int tag_mode; /* IMPLICIT/no/EXPLICIT tag at current level */ - asn1_TYPE_descriptor_t *type; /* Member type descriptor */ - char *name; /* ASN.1 identifier of the element */ -} asn1_SEQUENCE_element_t; - typedef struct asn1_SEQUENCE_specifics_s { /* * Target structure description. @@ -26,12 +14,6 @@ typedef struct asn1_SEQUENCE_specifics_s { int struct_size; /* Size of the target structure. */ int ctx_offset; /* Offset of the ber_dec_ctx_t member */ - /* - * Members of the SEQUENCE structure. - */ - asn1_SEQUENCE_element_t *elements; - int elements_count; - /* * Tags to members mapping table (sorted). */ diff --git a/skeletons/constr_SEQUENCE_OF.c b/skeletons/constr_SEQUENCE_OF.c index 0370a2d91..0a58f09a1 100644 --- a/skeletons/constr_SEQUENCE_OF.c +++ b/skeletons/constr_SEQUENCE_OF.c @@ -9,18 +9,17 @@ * The DER encoder of the SEQUENCE OF type. */ der_enc_rval_t -SEQUENCE_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, +SEQUENCE_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_SET_OF_specifics_t *specs = (asn1_SET_OF_specifics_t *)sd->specifics; - asn1_SET_OF_element_t *elm = specs->element; + asn1_TYPE_member_t *elm = td->elements; A_SEQUENCE_OF(void) *list; size_t computed_size = 0; ssize_t encoding_size = 0; der_enc_rval_t erval; int edx; - ASN_DEBUG("Estimating size of SEQUENCE OF %s", sd->name); + ASN_DEBUG("Estimating size of SEQUENCE OF %s", td->name); /* * Gather the length of the underlying members sequence. @@ -39,11 +38,11 @@ SEQUENCE_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, /* * Encode the TLV for the sequence itself. */ - encoding_size = der_write_tags(sd, computed_size, tag_mode, tag, + encoding_size = der_write_tags(td, computed_size, tag_mode, tag, cb, app_key); if(encoding_size == -1) { erval.encoded = -1; - erval.failed_type = sd; + erval.failed_type = td; erval.structure_ptr = ptr; return erval; } @@ -54,7 +53,7 @@ SEQUENCE_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, return erval; } - ASN_DEBUG("Encoding members of SEQUENCE OF %s", sd->name); + ASN_DEBUG("Encoding members of SEQUENCE OF %s", td->name); /* * Encode all members. @@ -74,7 +73,7 @@ SEQUENCE_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, * Encoded size is not equal to the computed size. */ erval.encoded = -1; - erval.failed_type = sd; + erval.failed_type = td; erval.structure_ptr = ptr; } else { erval.encoded = computed_size; diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index d1036c94f..d1a81beba 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -93,13 +93,13 @@ _t2e_cmp(const void *ap, const void *bp) { * The decoder of the SET type. */ ber_dec_rval_t -SET_decode_ber(asn1_TYPE_descriptor_t *sd, +SET_decode_ber(asn1_TYPE_descriptor_t *td, void **struct_ptr, void *ptr, size_t size, int tag_mode) { /* * Bring closer parts of structure description. */ - asn1_SET_specifics_t *specs = (asn1_SET_specifics_t *)sd->specifics; - asn1_SET_element_t *elements = specs->elements; + asn1_SET_specifics_t *specs = (asn1_SET_specifics_t *)td->specifics; + asn1_TYPE_member_t *elements = td->elements; /* * Parts of the structure being constructed. @@ -114,7 +114,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ int edx; /* SET element's index */ - ASN_DEBUG("Decoding %s as SET", sd->name); + ASN_DEBUG("Decoding %s as SET", td->name); /* * Create the target structure if it is not present already. @@ -142,11 +142,11 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, * perfectly fits our expectations. */ - rval = ber_check_tags(sd, ctx, ptr, size, + rval = ber_check_tags(td, ctx, ptr, size, tag_mode, &ctx->left, 0); if(rval.code != RC_OK) { ASN_DEBUG("%s tagging check failed: %d", - sd->name, rval.code); + td->name, rval.code); consumed_myself += rval.consumed; RETURN(rval.code); } @@ -176,7 +176,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, * canonical order of their tags. So, there is a room * for optimization. */ - for(edx = (ctx->step >> 1); edx < specs->elements_count; + for(edx = (ctx->step >> 1); edx < td->elements_count; ctx->step = (ctx->step & ~1) + 2, edx = (ctx->step >> 1)) { void *memb_ptr; /* Pointer to the member */ @@ -247,7 +247,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, } else if(specs->extensible == 0) { ASN_DEBUG("Unexpected tag %s " "in non-extensible SET %s", - ber_tlv_tag_string(tlv_tag), sd->name); + ber_tlv_tag_string(tlv_tag), td->name); RETURN(RC_FAIL); } else { /* Skip this tag */ @@ -285,7 +285,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, */ if(ASN_SET_ISPRESENT2((char *)st + specs->pres_offset, edx)) { ASN_DEBUG("SET %s: Duplicate element %s (%d)", - sd->name, elements[edx].name, edx); + td->name, elements[edx].name, edx); RETURN(RC_FAIL); } @@ -335,7 +335,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, case 3: case 4: /* Only 00 is expected */ ASN_DEBUG("SET %s Leftover: %ld, size = %ld", - sd->name, (long)ctx->left, (long)size); + td->name, (long)ctx->left, (long)size); /* * Skip everything until the end of the SET. @@ -374,7 +374,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, if(specs->extensible == 0 || ctx->phase == 4) { ASN_DEBUG("Unexpected continuation " "of a non-extensible type %s", - sd->name); + td->name); RETURN(RC_FAIL); } @@ -395,7 +395,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, /* * Check that all mandatory elements are present. */ - for(edx = 0; edx < specs->elements_count; + for(edx = 0; edx < td->elements_count; edx += (8 * sizeof(specs->_mandatory_elements[0]))) { unsigned int midx, pres, must; @@ -411,7 +411,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, ASN_DEBUG("One or more mandatory elements " "of a SET %s %d (%08x.%08x)=%08x " "are not present", - sd->name, + td->name, midx, pres, must, @@ -431,13 +431,13 @@ SET_decode_ber(asn1_TYPE_descriptor_t *sd, * The DER encoder of the SET type. */ der_enc_rval_t -SET_encode_der(asn1_TYPE_descriptor_t *sd, +SET_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_SET_specifics_t *specs = (asn1_SET_specifics_t *)sd->specifics; + asn1_SET_specifics_t *specs = (asn1_SET_specifics_t *)td->specifics; size_t computed_size = 0; der_enc_rval_t my_erval; - int t2m_build_own = (specs->tag2el_count != specs->elements_count); + int t2m_build_own = (specs->tag2el_count != td->elements_count); asn1_TYPE_tag2member_t *t2m; int t2m_count; ssize_t ret; @@ -447,10 +447,10 @@ SET_encode_der(asn1_TYPE_descriptor_t *sd, * Use existing, or build our own tags map. */ if(t2m_build_own) { - (void *)t2m = alloca(specs->elements_count * sizeof(t2m[0])); + (void *)t2m = alloca(td->elements_count * sizeof(t2m[0])); if(!t2m) { /* There are such platforms */ my_erval.encoded = -1; - my_erval.failed_type = sd; + my_erval.failed_type = td; my_erval.structure_ptr = ptr; return my_erval; } @@ -467,8 +467,8 @@ SET_encode_der(asn1_TYPE_descriptor_t *sd, /* * Gather the length of the underlying members sequence. */ - for(edx = 0; edx < specs->elements_count; edx++) { - asn1_SET_element_t *elm = &specs->elements[edx]; + for(edx = 0; edx < td->elements_count; edx++) { + asn1_TYPE_member_t *elm = &td->elements[edx]; der_enc_rval_t erval; void *memb_ptr; @@ -513,7 +513,7 @@ SET_encode_der(asn1_TYPE_descriptor_t *sd, /* * Finalize order of the components. */ - assert(t2m_count == specs->elements_count); + assert(t2m_count == td->elements_count); if(t2m_build_own) { /* * Sort the underlying members according to their @@ -529,10 +529,10 @@ SET_encode_der(asn1_TYPE_descriptor_t *sd, /* * Encode the TLV for the sequence itself. */ - ret = der_write_tags(sd, computed_size, tag_mode, tag, cb, app_key); + ret = der_write_tags(td, computed_size, tag_mode, tag, cb, app_key); if(ret == -1) { my_erval.encoded = -1; - my_erval.failed_type = sd; + my_erval.failed_type = td; my_erval.structure_ptr = ptr; return my_erval; } @@ -543,13 +543,13 @@ SET_encode_der(asn1_TYPE_descriptor_t *sd, /* * Encode all members. */ - for(edx = 0; edx < specs->elements_count; edx++) { - asn1_SET_element_t *elm; + for(edx = 0; edx < td->elements_count; edx++) { + asn1_TYPE_member_t *elm; der_enc_rval_t erval; void *memb_ptr; /* Encode according to the tag order */ - elm = &specs->elements[t2m[edx].el_no]; + elm = &td->elements[t2m[edx].el_no]; if(elm->optional) { memb_ptr = *(void **)((char *)ptr + elm->memb_offset); @@ -570,7 +570,7 @@ SET_encode_der(asn1_TYPE_descriptor_t *sd, * Encoded size is not equal to the computed size. */ my_erval.encoded = -1; - my_erval.failed_type = sd; + my_erval.failed_type = td; my_erval.structure_ptr = ptr; } @@ -580,7 +580,6 @@ SET_encode_der(asn1_TYPE_descriptor_t *sd, int SET_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_SET_specifics_t *specs = (asn1_SET_specifics_t *)td->specifics; int edx; int ret; @@ -591,8 +590,8 @@ SET_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, || cb(" ::= {\n", 7, app_key)) return -1; - for(edx = 0; edx < specs->elements_count; edx++) { - asn1_SET_element_t *elm = &specs->elements[edx]; + for(edx = 0; edx < td->elements_count; edx++) { + asn1_TYPE_member_t *elm = &td->elements[edx]; const void *memb_ptr; if(elm->optional) { @@ -627,7 +626,6 @@ SET_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, void SET_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { - asn1_SET_specifics_t *specs = (asn1_SET_specifics_t *)td->specifics; int edx; if(!td || !ptr) @@ -635,8 +633,8 @@ SET_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { ASN_DEBUG("Freeing %s as SET", td->name); - for(edx = 0; edx < specs->elements_count; edx++) { - asn1_SET_element_t *elm = &specs->elements[edx]; + for(edx = 0; edx < td->elements_count; edx++) { + asn1_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; if(elm->optional) { memb_ptr = *(void **)((char *)ptr + elm->memb_offset); @@ -668,8 +666,8 @@ SET_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * Iterate over structure members and check their validity. */ - for(edx = 0; edx < specs->elements_count; edx++) { - asn1_SET_element_t *elm = &specs->elements[edx]; + for(edx = 0; edx < td->elements_count; edx++) { + asn1_TYPE_member_t *elm = &td->elements[edx]; const void *memb_ptr; if(elm->optional) { @@ -689,8 +687,20 @@ SET_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); } - return elm->type->check_constraints(elm->type, memb_ptr, - app_errlog, app_key); + if(elm->memb_constraints) { + int ret = elm->memb_constraints(elm->type, memb_ptr, + app_errlog, app_key); + if(ret) return ret; + } else { + int ret = elm->type->check_constraints(elm->type, + memb_ptr, app_errlog, app_key); + if(ret) return ret; + /* + * Cannot inherit it earlier: + * need to make sure we get the updated version. + */ + elm->memb_constraints = elm->type->check_constraints; + } } return 0; diff --git a/skeletons/constr_SET.h b/skeletons/constr_SET.h index 8cb3fa8d3..eab2c3070 100644 --- a/skeletons/constr_SET.h +++ b/skeletons/constr_SET.h @@ -7,18 +7,6 @@ #include -/* - * Description of a single element of the SET type. - */ -typedef struct asn1_SET_element_s { - int memb_offset; /* Offset of the element */ - int optional; /* Whether the element is optional */ - ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ - int tag_mode; /* IMPLICIT/no/EXPLICIT tag at current level */ - asn1_TYPE_descriptor_t *type; /* Member type descriptor */ - char *name; /* ASN.1 identifier of the element */ -} asn1_SET_element_t; - typedef struct asn1_SET_specifics_s { /* @@ -28,12 +16,6 @@ typedef struct asn1_SET_specifics_s { int ctx_offset; /* Offset of the ber_dec_ctx_t member */ int pres_offset; /* Offset of _presence_map member */ - /* - * Members of the SET structure. - */ - asn1_SET_element_t *elements; - int elements_count; - /* * Tags to members mapping table (sorted). */ diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index 511207d2a..ecf16f02f 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -60,13 +60,13 @@ * The decoder of the SET OF type. */ ber_dec_rval_t -SET_OF_decode_ber(asn1_TYPE_descriptor_t *sd, +SET_OF_decode_ber(asn1_TYPE_descriptor_t *td, void **struct_ptr, void *ptr, size_t size, int tag_mode) { /* * Bring closer parts of structure description. */ - asn1_SET_OF_specifics_t *specs = (asn1_SET_OF_specifics_t *)sd->specifics; - asn1_SET_OF_element_t *element = specs->element; + asn1_SET_OF_specifics_t *specs = (asn1_SET_OF_specifics_t *)td->specifics; + asn1_TYPE_member_t *element = td->elements; /* Single one */ /* * Parts of the structure being constructed. @@ -80,7 +80,7 @@ SET_OF_decode_ber(asn1_TYPE_descriptor_t *sd, ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ - ASN_DEBUG("Decoding %s as SET OF", sd->name); + ASN_DEBUG("Decoding %s as SET OF", td->name); /* * Create the target structure if it is not present already. @@ -108,11 +108,11 @@ SET_OF_decode_ber(asn1_TYPE_descriptor_t *sd, * perfectly fits our expectations. */ - rval = ber_check_tags(sd, ctx, ptr, size, + rval = ber_check_tags(td, ctx, ptr, size, tag_mode, &ctx->left, 0); if(rval.code != RC_OK) { ASN_DEBUG("%s tagging check failed: %d", - sd->name, rval.code); + td->name, rval.code); consumed_myself += rval.consumed; RETURN(rval.code); } @@ -143,7 +143,7 @@ SET_OF_decode_ber(asn1_TYPE_descriptor_t *sd, */ if(ctx->left == 0) { - ASN_DEBUG("End of SET OF %s", sd->name); + ASN_DEBUG("End of SET OF %s", td->name); /* * No more things to decode. * Exit out of here. @@ -185,9 +185,9 @@ SET_OF_decode_ber(asn1_TYPE_descriptor_t *sd, */ } else { ASN_DEBUG("Unexpected tag %s fixed SET OF %s", - ber_tlv_tag_string(tlv_tag), sd->name); + ber_tlv_tag_string(tlv_tag), td->name); ASN_DEBUG("%s SET OF has tag %s", - sd->name, ber_tlv_tag_string(element->tag)); + td->name, ber_tlv_tag_string(element->tag)); RETURN(RC_FAIL); } } @@ -204,7 +204,7 @@ SET_OF_decode_ber(asn1_TYPE_descriptor_t *sd, rval = element->type->ber_decoder(element->type, &ctx->ptr, ptr, LEFT, 0); ASN_DEBUG("In %s SET OF %s code %d consumed %d", - sd->name, element->type->name, + td->name, element->type->name, rval.code, (int)rval.consumed); switch(rval.code) { case RC_OK: @@ -305,11 +305,10 @@ static int _el_buf_cmp(const void *ap, const void *bp) { * The DER encoder of the SET OF type. */ der_enc_rval_t -SET_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, +SET_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_SET_OF_specifics_t *specs = (asn1_SET_OF_specifics_t *)sd->specifics; - asn1_SET_OF_element_t *elm = specs->element; + asn1_TYPE_member_t *elm = td->elements; asn1_TYPE_descriptor_t *elm_type = elm->type; der_type_encoder_f *der_encoder = elm_type->der_encoder; A_SET_OF(void) *list; @@ -321,7 +320,7 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, int ret; int edx; - ASN_DEBUG("Estimating size for SET OF %s", sd->name); + ASN_DEBUG("Estimating size for SET OF %s", td->name); /* * Gather the length of the underlying members sequence. @@ -342,11 +341,11 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, /* * Encode the TLV for the sequence itself. */ - encoding_size = der_write_tags(sd, computed_size, tag_mode, tag, + encoding_size = der_write_tags(td, computed_size, tag_mode, tag, cb, app_key); if(encoding_size == -1) { erval.encoded = -1; - erval.failed_type = sd; + erval.failed_type = td; erval.structure_ptr = ptr; return erval; } @@ -365,12 +364,12 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, (void *)encoded_els = MALLOC(list->count * sizeof(encoded_els[0])); if(encoded_els == NULL) { erval.encoded = -1; - erval.failed_type = sd; + erval.failed_type = td; erval.structure_ptr = ptr; return erval; } - ASN_DEBUG("Encoding members of %s SET OF", sd->name); + ASN_DEBUG("Encoding members of %s SET OF", td->name); /* * Encode all members. @@ -391,7 +390,7 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, FREEMEM(encoded_els[edx].buf); FREEMEM(encoded_els); erval.encoded = -1; - erval.failed_type = sd; + erval.failed_type = td; erval.structure_ptr = ptr; return erval; } @@ -436,7 +435,7 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, * encoded size is not equal to the computed size. */ erval.encoded = -1; - erval.failed_type = sd; + erval.failed_type = td; erval.structure_ptr = ptr; } else { erval.encoded = computed_size; @@ -448,8 +447,7 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, int SET_OF_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_SET_OF_specifics_t *specs = (asn1_SET_OF_specifics_t *)td->specifics; - asn1_SET_OF_element_t *element = specs->element; + asn1_TYPE_member_t *element = td->elements; const A_SET_OF(void) *list; int ret; int i; @@ -486,8 +484,7 @@ SET_OF_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, void SET_OF_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { if(td && ptr) { - asn1_SET_OF_specifics_t *specs = (asn1_SET_OF_specifics_t *)td->specifics; - asn1_SET_OF_element_t *element = specs->element; + asn1_TYPE_member_t *element = td->elements; A_SET_OF(void) *list; int i; @@ -514,8 +511,8 @@ SET_OF_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { int SET_OF_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - asn1_SET_OF_specifics_t *specs = (asn1_SET_OF_specifics_t *)td->specifics; - asn1_SET_OF_element_t *element = specs->element; + asn1_TYPE_member_t *element = td->elements; + asn_constr_check_f *constr; const A_SET_OF(void) *list; int i; @@ -526,12 +523,30 @@ SET_OF_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } (const void *)list = sptr; + + constr = element->memb_constraints; + if(!constr) constr = element->type->check_constraints; + + /* + * Iterate over the members of an array. + * Validate each in turn, until one fails. + */ for(i = 0; i < list->count; i++) { const void *memb_ptr = list->array[i]; + int ret; + if(!memb_ptr) continue; - return element->type->check_constraints(element->type, memb_ptr, - app_errlog, app_key); + + ret = constr(element->type, memb_ptr, app_errlog, app_key); + if(ret) return ret; } + /* + * Cannot inherit it eralier: + * need to make sure we get the updated version. + */ + if(!element->memb_constraints) + element->memb_constraints = element->type->check_constraints; + return 0; } diff --git a/skeletons/constr_SET_OF.h b/skeletons/constr_SET_OF.h index e2c6d8fd0..0dd6040b6 100644 --- a/skeletons/constr_SET_OF.h +++ b/skeletons/constr_SET_OF.h @@ -7,22 +7,12 @@ #include -typedef struct asn1_SET_OF_element_s { - ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ - asn1_TYPE_descriptor_t *type; /* Member type descriptor */ -} asn1_SET_OF_element_t; - typedef struct asn1_SET_OF_specifics_s { /* * Target structure description. */ int struct_size; /* Size of the target structure. */ int ctx_offset; /* Offset of the ber_dec_ctx_t member */ - - /* - * Members of the SET OF list. - */ - asn1_SET_OF_element_t *element; } asn1_SET_OF_specifics_t; /* diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index da3a2db7f..67f9c55ec 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -13,6 +13,7 @@ #include struct asn1_TYPE_descriptor_s; /* Forward declaration */ +struct asn1_TYPE_member_s; /* Forward declaration */ /* * Free the structure according to its specification. @@ -43,7 +44,7 @@ typedef int (asn_struct_print_f)( typedef ber_tlv_tag_t (asn_outmost_tag_f)( struct asn1_TYPE_descriptor_s *type_descriptor, const void *struct_ptr, int tag_mode, ber_tlv_tag_t tag); -/* The instance of the above function type */ +/* The instance of the above function type; used internally. */ asn_outmost_tag_f asn1_TYPE_outmost_tag; @@ -76,6 +77,12 @@ typedef struct asn1_TYPE_descriptor_s { int tags_impl_skip; /* Tags to skip in implicit mode */ int last_tag_form; /* Acceptable form of the tag (prim, constr) */ + /* + * An ASN.1 production type members (members of SEQUENCE, SET, CHOICE). + */ + struct asn1_TYPE_member_s *elements; + int elements_count; + /* * Additional information describing the type, used by appropriate * functions above. @@ -83,6 +90,19 @@ typedef struct asn1_TYPE_descriptor_s { void *specifics; } asn1_TYPE_descriptor_t; +/* + * An element of the constructed type, i.e. SEQUENCE, SET, CHOICE. + */ +typedef struct asn1_TYPE_member_s { + int optional; /* Whether the element is optional */ + int memb_offset; /* Offset of the element */ + ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ + int tag_mode; /* IMPLICIT/no/EXPLICIT tag at current level */ + asn1_TYPE_descriptor_t *type; /* Member type descriptor */ + asn_constr_check_f *memb_constraints; /* Constraints validator */ + char *name; /* ASN.1 identifier of the element */ +} asn1_TYPE_member_t; + /* * BER tag to element number mapping. */ From 3786fac0c77ad49ecd57cab6845ddeebf356203a Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 20 Aug 2004 13:24:01 +0000 Subject: [PATCH 0164/1469] updating documentation git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@164 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/asn1c.1 | 95 ++++++++++++++++++++++++--------------------------- 1 file changed, 44 insertions(+), 51 deletions(-) diff --git a/asn1c/asn1c.1 b/asn1c/asn1c.1 index 1e4a5153c..f8553d049 100644 --- a/asn1c/asn1c.1 +++ b/asn1c/asn1c.1 @@ -6,44 +6,37 @@ asn1c \- ASN.1 Compiler .ND ASN.1 compiler .SH SYNOPSIS -.B asn1c -.RI "[ " option " | " filename " ].\|.\|." +asn1c [\fB\-E\fR [\fB-F\fR] | \fB\-P\fR | \fB\-R\fR | \fB\-t\fR\fIdata-string\fR] + [\fB\-S\fR\fIdir\fR] + [\fB\-W\fR\fIdebug-\fR...] [\fB\-f\fR\fIoption\fR...] [\fB\-p\fR\fIrint-\fR...] + \fIinfile\fR... .SH DESCRIPTION -asn1c is a tool to compile the ASN.1 specifications into C language structures -and accompanying routines to perform data encoding and decoding. +asn1c compiles the ASN.1 specifications into the set of +target language (C/C++) encoders and decoders for BER, DER, +and other encoding standards. .SH OPTIONS .TP -.B Overall Options -\-E -\-F -\-L -\-P -\-R -.RI "\-S " directory -.RI "\-t " data-string +\fIOverall Options\fR +\fB\-E \-F \-P \-R\fR +.BI "\-S " directory +.BI "\-t " data-string .TP -.B Language Options +\fIWarning Options\fR .br -\-ftypes88 -\-fnative-integers -\-fno-c99 -\-funnamed-unions +\fB\-Werror \-Wdebug-lexer \-Wdebug-fixer \-Wdebug-compiler\fR .TP -.B Output Options +\fILanguage Options\fR .br -\-print-constraints +\fB\-fbless-SIZE \-fnative-integers \-funnamed-unions \-ftypes88\fR .TP -.B Warning Options +\fIOutput Options\fR .br -\-Werror -\-Wdebug-lexer -\-Wdebug-fixer -\-Wdebug-compiler +.B \-print-constraints \-print-lines .SH OVERALL OPTIONS .TP .B \-E -Stop after the parsing stage. The output is a reconstructed ASN.1 -specification code, which is sent to the standard output. +Stop after the parsing stage and print the reconstructed ASN.1 +specification code to the standard output. .TP .B \-F Used together with \c @@ -52,11 +45,6 @@ Used together with \c tree fixing stage and dump the reconstructed ASN.1 specification to the standard output. .TP -.B \-L -Generate "-- #line" comments in -.B -E -output. -.TP .B \-P Dump the compiled output to the standard output instead of creating the target language files on disk. @@ -65,43 +53,48 @@ target language files on disk. Restrict the compiler to generate only the ASN.1 tables, omitting the usual support code. .TP -.B \-S directory +\fB\-S\fR \fIdirectory\fR Use the specified directory with ASN.1 skeleton files. .TP -.B \-t data-string +\fB\-t\fR \fIdata-string\fR Interpret the data-string as a sequence of hexadecimal values representing the start of BER TLV encoding. Print the human readable explanation. +.SH WARNING OPTIONS +.TP +.B \-Werror +Treat warnings as errors; abort if any warning is produced. +.TP +.B \-Wdebug-lexer +Enable lexer debugging during the ASN.1 parsing stage. +.TP +.B \-Wdebug-fixer +Enable ASN.1 syntax tree fixer debugging during the fixing stage. +.TP +.B \-Wdebug-compiler +Enable debugging during the actual compile time. .SH LANGUAGE OPTIONS .TP -.B \-ftypes88 -Use only ASN.1:1988 embedded types. +.B \-fbless-SIZE +Allow SIZE() constraint for INTEGER, ENUMERATED, and other types for which this +constraint is normally prohibited by the standard. This is a violation of +an ASN.1 standard and compiler may fail to produce the meaningful code. .TP .B \-fnative-integers Use native machine's integer types whenever possible, instead of the complex ASN.1 INTEGER and ENUMERATED types. .TP -.B \-fno-c99 -Disable use of certain C99 extensions, like designated initializers. -.TP .B \-funnamed-unions -Enable unnamed unions in structures definitions. +Enable unnamed unions in the definitions of target language's structures. +.TP +.B \-ftypes88 +Use only ASN.1:1988 embedded types. .SH OUTPUT OPTIONS .TP .B \-print-constraints When -EF are also specified, this option forces the compiler to explain its internal understanding of subtype constraints. -.SH WARNING OPTIONS -.TP -.B \-Werror -Treat warnings as errors; abort if any warning is produced. .TP -.B \-Wdebug-lexer -Enable lexer debugging during the ASN.1 parsing stage. -.TP -.B \-Wdebug-fixer -Enable ASN.1 syntax tree fixer debugging during the fixing stage. -.TP -.B \-Wdebug-compiler -Enable debugging during the actual compile time. +.B \-print-lines +Generate "-- #line" comments in \fB-E\fR output. .SH AUTHORS Lev Walkin From 00ad2824370f8e61d6ebdd879c81b5870897467a Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 20 Aug 2004 13:24:28 +0000 Subject: [PATCH 0165/1469] pretty-printing of SET OF and SEQUENCE OF git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@165 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1print/asn1print.c | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index 3c411c6bb..15a41c03d 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -74,7 +74,10 @@ asn1print_module(asn1p_t *asn, asn1p_module_t *mod, enum asn1print_flags flags) TQ_FOR(tc, &(mod->members), next) { asn1print_expr(asn, mod, tc, flags, 0); - printf("\n\n"); + if(flags & APF_DEBUG_CONSTRAINTS) + printf("\n"); + else + printf("\n\n"); } printf("END\n"); @@ -420,6 +423,7 @@ asn1print_constraint_explain(asn1p_expr_type_e expr_type, static int asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1print_flags flags, int level) { + int SEQ_OF = 0; if(flags & APF_LINE_COMMENTS) INDENT("-- #line %d\n", tc->_lineno); @@ -462,6 +466,19 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri case A1TC_CLASSFIELD: /* Nothing to print here */ break; + case ASN_CONSTR_SET_OF: + case ASN_CONSTR_SEQUENCE_OF: + SEQ_OF = 1; + if(tc->expr_type == ASN_CONSTR_SET_OF) + printf(" SET"); + else + printf(" SEQUENCE"); + if(tc->constraints) { + printf(" "); + asn1print_constraint(tc->constraints, flags); + } + printf(" OF"); + break; default: { char *p = ASN_EXPR_TYPE2STR(tc->expr_type); @@ -481,8 +498,7 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri if(TQ_FIRST(&(tc->members))) { asn1p_expr_t *se; /* SubExpression */ - if((tc->expr_type != ASN_CONSTR_SEQUENCE_OF - && tc->expr_type != ASN_CONSTR_SET_OF) + if(!SEQ_OF || TQ_FIRST(&(tc->members))->expr_type & ASN_CONSTR_MASK) printf(" {\n"); @@ -502,8 +518,7 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri } } - if((tc->expr_type != ASN_CONSTR_SEQUENCE_OF - && tc->expr_type != ASN_CONSTR_SET_OF) + if(!SEQ_OF || TQ_FIRST(&(tc->members))->expr_type & ASN_CONSTR_MASK) { printf("\n"); INDENT("}"); @@ -513,7 +528,7 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri if(tc->with_syntax) asn1print_with_syntax(tc->with_syntax, flags); - if(tc->constraints) { + if(!SEQ_OF && tc->constraints) { printf(" "); asn1print_constraint(tc->constraints, flags); } @@ -533,7 +548,8 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri printf(")"); } - if(flags & APF_DEBUG_CONSTRAINTS) { + if(flags & APF_DEBUG_CONSTRAINTS + && tc->expr_type != A1TC_EXTENSIBLE) { asn1p_expr_t *top_parent; if(tc->combined_constraints) { @@ -543,10 +559,12 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri top_parent = asn1f_find_terminal_type_ex(asn, mod, tc, NULL); if(top_parent) { - printf("\n-- PER-visible constraints: "); + printf("\n-- PER-visible constraints (%s): ", + top_parent->Identifier); asn1print_constraint_explain(top_parent->expr_type, tc->combined_constraints); } + printf("\n"); } return 0; From 04572b9aef639c1c5bdb7850d62df7cde6daac62 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 20 Aug 2004 13:24:38 +0000 Subject: [PATCH 0166/1469] prettyfying git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@166 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/asn1c.c | 88 ++++++++++++++++++++++++------------------ asn1c/check-parsing.sh | 6 ++- 2 files changed, 56 insertions(+), 38 deletions(-) diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index 4c8d599f7..db0068851 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -23,11 +23,15 @@ static void usage(char *av0); /* Print the Usage screen and exit(EX_USAGE) */ +#undef COPYRIGHT +#define COPYRIGHT \ + "Copyright (c) 2003, 2004 Lev Walkin \n" + int main(int ac, char **av) { enum asn1p_flags asn1_parser_flags = A1P_NOFLAGS; enum asn1f_flags asn1_fixer_flags = A1F_NOFLAGS; - enum asn1c_flags asn1_compiler_flags= A1C_NOFLAGS; + enum asn1c_flags asn1_compiler_flags= A1C_NO_C99; enum asn1print_flags asn1_printer_flags = APF_NOFLAGS; int print_arg__print_out = 0; /* Don't compile, just print parsed */ int print_arg__fix_n_print = 0; /* Fix and print */ @@ -41,7 +45,7 @@ main(int ac, char **av) { /* * Process command-line options. */ - while((ch = getopt(ac, av, "EFf:LPp:RS:t:W:")) != -1) + while((ch = getopt(ac, av, "EFf:hLPp:RS:t:vW:")) != -1) switch(ch) { case 'E': print_arg__print_out = 1; @@ -56,28 +60,30 @@ main(int ac, char **av) { asn1_parser_flags |= A1P_CONSTRUCTS_RESTRICT_TO_1990; } else if(strcmp(optarg, "native-integers") == 0) { asn1_compiler_flags |= A1C_USE_NATIVE_INTEGERS; - } else if(strcmp(optarg, "no-c99") == 0) { - asn1_compiler_flags |= A1C_NO_C99; } else if(strcmp(optarg, "unnamed-unions") == 0) { asn1_compiler_flags |= A1C_UNNAMED_UNIONS; } else if(strncmp(optarg, "known-extern-type=", 18) == 0) { char *known_type = optarg + 18; ret = asn1f_make_known_external_type(known_type); assert(ret == 0 || errno == EEXIST); + } else if(strcmp(optarg, "bless-SIZE") == 0) { + asn1_fixer_flags |= A1F_EXTENDED_SizeConstraint; } else { fprintf(stderr, "-f%s: Invalid argument\n", optarg); exit(EX_USAGE); } break; - case 'L': - asn1_printer_flags |= APF_LINE_COMMENTS; - break; + case 'h': + usage(av[0]); case 'P': asn1_compiler_flags |= A1C_PRINT_COMPILED; + asn1_compiler_flags &= ~A1C_NO_C99; break; case 'p': if(strcmp(optarg, "rint-constraints") == 0) { asn1_printer_flags |= APF_DEBUG_CONSTRAINTS; + } else if(strcmp(optarg, "rint-lines") == 0) { + asn1_printer_flags |= APF_LINE_COMMENTS; } else { fprintf(stderr, "-p%s: Invalid argument\n", optarg); exit(EX_USAGE); @@ -93,6 +99,10 @@ main(int ac, char **av) { if(decode_tlv_from_string(optarg)) exit(EX_DATAERR); exit(0); + case 'v': + fprintf(stderr, "ASN.1 Compiler, v" VERSION "\n" COPYRIGHT); + exit(0); + break; case 'W': if(strcmp(optarg, "error") == 0) { warnings_as_errors = 1; @@ -125,8 +135,7 @@ main(int ac, char **av) { } if(asn1_printer_flags) { fprintf(stderr, "Error: " - "-L and -print-constraints " - "require -E\n"); + "-print-... arguments require -E\n"); exit(EX_USAGE); } } @@ -255,36 +264,41 @@ main(int ac, char **av) { static void usage(char *av0) { fprintf(stderr, - "ASN.1 Compiler, v" VERSION "\n" - "Copyright (c) 2003, 2004 Lev Walkin \n" - "Usage: %s [options] ...\n" - "Where [options] are:\n" - "\t-E\tRun only the ASN.1 parser and print out the tree\n" - "\t-F\tDuring -E operation, also perform tree fixing\n" - "\t-L\tGenerate \"-- #line\" comments in -E output\n" - "\n" - "\t-P \tConcatenate and print the compiled text\n" - "\t-R \tRestrict output (tables only, no support code)\n" - "\t-S \tDirectory with support (skeleton?) files\n" - "\t \t(Default is \"%s\")\n" - "\n" - "\t-t \tDecode the given tag[/length] sequence\n" - "\n" - "\t-ftypes88\tUse only ASN.1:1988 embedded types\n" +"ASN.1 Compiler, v" VERSION "\n" COPYRIGHT +"Usage: %s [options] infile...\n" +"Where [options] are:\n" +" -E Run only the ASN.1 parser and print out the tree\n" +" -F During -E operation, also perform tree fixing\n" +"\n" +" -P Concatenate and print the compiled text\n" +" -R Restrict output (tables only, no support code)\n" +" -S Directory with support (skeleton?) files\n" +" (Default is \"%s\")\n" +"\n" + +" -t Decode the given tag[/length] sequence\n" +" (e.g. -t \"bf 20\")\n" +"\n" + +" -Werror Treat warnings as errors; abort if any warning\n" +" -Wdebug-lexer Enable verbose debugging output from lexer\n" +" -Wdebug-fixer --//-- semantics processor\n" +" -Wdebug-compiler --//-- compiler\n" +"\n" + +" -fbless-SIZE Allow SIZE() constraint for INTEGER etc (non-std.)\n" /* - "\t-fconstr90\tUse only ASN.1:1990 constructs (not available)\n" +" -fconstr90 Use only ASN.1:1990 constructs (not available)\n" */ - "\t-fknown-extern-type=\tPretend this type is known\n" - "\t-fnative-integers\tUse int instead of INTEGER_t whenever possible\n" - "\t-fno-c99\tDisable C99 extensions\n" - "\t-funnamed-unions\tEnable unnamed unions in structures\n" - "\n" - "\t-print-constraints\tExplain subtype constraints (debug)\n" - "\n" - "\t-Werror \tTreat warnings as errors; abort if any warning\n" - "\t-Wdebug-lexer\tEnable verbose debugging output from lexer\n" - "\t-Wdebug-fixer\tDebug ASN.1 semantics processor\n" - "\t-Wdebug-compiler\tDebug ASN.1 compiler\n" +" -fknown-extern-type= Pretend this type is known\n" +" -fnative-integers Use int instead of INTEGER_t whenever possible\n" +" -funnamed-unions Enable unnamed unions in structures\n" +" -ftypes88 Use only ASN.1:1988 embedded types\n" +"\n" + +" -print-constraints Explain subtype constraints (debug)\n" +" -print-lines Generate \"-- #line\" comments in -E output\n" + , a1c_basename(av0), DATADIR ); diff --git a/asn1c/check-parsing.sh b/asn1c/check-parsing.sh index ca00c5f0f..c5c2d6aa6 100755 --- a/asn1c/check-parsing.sh +++ b/asn1c/check-parsing.sh @@ -12,7 +12,11 @@ for ref in ../tests/*.asn1.-*; do if [ $? = 0 ]; then diff -a -u "$ref" "$tmpfile" || ec=$? fi - rm -f "$tmpfile" + if [ "$1" != "regenerate" ]; then + rm -f "$tmpfile" + else + mv "$tmpfile" "$ref" + fi done exit $ec From 5f0128b3b72a8a88f64dcad1581b916cb1dbb69d Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 20 Aug 2004 13:25:29 +0000 Subject: [PATCH 0167/1469] proper support for SET OF and SEQUENCE OF constraints. managed to get it right without shift/reduce errors git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@167 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_y.c | 1596 ++++++++++++++++++++------------------- libasn1parser/asn1p_y.y | 73 +- 2 files changed, 849 insertions(+), 820 deletions(-) diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index 9aa7e749b..fe2d194b8 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -205,11 +205,11 @@ typedef union { -#define YYFINAL 381 +#define YYFINAL 385 #define YYFLAG -32768 #define YYNTBASE 115 -#define YYTRANSLATE(x) ((unsigned)(x) <= 355 ? yytranslate[x] : 210) +#define YYTRANSLATE(x) ((unsigned)(x) <= 355 ? yytranslate[x] : 212) static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -261,125 +261,126 @@ static const short yyprhs[] = { 0, 173, 177, 179, 183, 187, 189, 193, 195, 197, 199, 203, 209, 210, 212, 214, 218, 221, 225, 230, 231, 233, 234, 241, 243, 246, 248, 250, 253, 255, 259, - 261, 265, 269, 271, 273, 275, 280, 282, 286, 288, - 292, 296, 298, 302, 304, 308, 310, 312, 314, 316, - 321, 322, 326, 328, 330, 332, 334, 336, 338, 342, - 344, 347, 349, 351, 353, 355, 358, 361, 363, 365, - 368, 371, 373, 375, 377, 379, 382, 384, 387, 389, + 261, 263, 267, 271, 273, 275, 277, 282, 284, 288, + 290, 294, 298, 300, 304, 306, 310, 312, 314, 316, + 318, 323, 324, 328, 330, 332, 334, 336, 338, 340, + 344, 346, 349, 351, 353, 355, 357, 360, 363, 365, + 367, 370, 373, 375, 377, 379, 381, 384, 386, 389, 391, 393, 395, 397, 399, 401, 403, 405, 407, 409, - 411, 413, 415, 420, 425, 430, 435, 440, 442, 447, - 449, 451, 453, 455, 457, 458, 460, 465, 469, 474, - 476, 480, 486, 488, 492, 496, 500, 505, 509, 511, - 515, 519, 523, 527, 529, 531, 533, 536, 539, 543, - 545, 547, 549, 551, 553, 555, 557, 563, 565, 569, - 571, 575, 576, 578, 580, 582, 584, 586, 588, 592, - 597, 599, 603, 606, 610, 612, 616, 617, 619, 621, - 624, 626, 628, 629, 633, 636, 640, 642, 646, 648, - 653, 658, 660, 662, 664, 666, 667, 669, 671, 674, - 677, 679, 681, 683, 685, 687 + 411, 413, 415, 417, 422, 427, 432, 437, 442, 444, + 449, 451, 453, 455, 457, 459, 460, 462, 464, 469, + 473, 478, 480, 484, 490, 492, 496, 500, 504, 509, + 513, 515, 519, 523, 527, 531, 533, 535, 537, 540, + 543, 547, 549, 551, 553, 555, 557, 559, 561, 567, + 569, 573, 575, 579, 580, 582, 584, 586, 588, 590, + 592, 596, 601, 603, 607, 610, 614, 616, 620, 621, + 623, 625, 628, 630, 632, 633, 637, 640, 644, 646, + 650, 652, 657, 662, 664, 666, 668, 670, 671, 673, + 675, 678, 681, 683, 685, 687, 689, 691 }; static const short yyrhs[] = { 116, - 0, 117, 0, 116, 117, 0, 206, 118, 34, 122, + 0, 117, 0, 116, 117, 0, 208, 118, 34, 122, 3, 21, 125, 39, 0, 0, 119, 0, 104, 120, 105, 0, 104, 105, 0, 121, 0, 120, 121, 0, - 208, 0, 208, 106, 9, 107, 0, 9, 0, 0, + 210, 0, 210, 106, 9, 107, 0, 9, 0, 0, 123, 0, 124, 0, 123, 124, 0, 41, 84, 0, 52, 84, 0, 20, 84, 0, 43, 53, 0, 12, 57, 0, 0, 126, 0, 127, 0, 126, 127, 0, 129, 0, 134, 0, 140, 0, 164, 0, 137, 0, 0, 38, 12, 128, 0, 172, 0, 54, 130, 108, 0, 54, 46, 0, 131, 0, 130, 131, 0, 132, - 46, 206, 118, 0, 133, 0, 132, 109, 133, 0, - 206, 0, 208, 0, 42, 135, 108, 0, 42, 17, + 46, 208, 118, 0, 133, 0, 132, 109, 133, 0, + 208, 0, 210, 0, 42, 135, 108, 0, 42, 17, 108, 0, 42, 108, 0, 136, 0, 135, 109, 136, - 0, 206, 0, 208, 0, 206, 138, 3, 104, 139, - 105, 0, 159, 0, 169, 0, 0, 179, 0, 206, - 3, 204, 87, 0, 206, 3, 204, 156, 0, 206, - 3, 146, 0, 206, 104, 141, 105, 3, 156, 0, - 142, 0, 141, 109, 142, 0, 206, 0, 206, 110, - 208, 0, 169, 110, 208, 0, 144, 0, 143, 109, - 144, 0, 158, 0, 208, 0, 155, 0, 145, 109, + 0, 208, 0, 210, 0, 208, 138, 3, 104, 139, + 105, 0, 159, 0, 169, 0, 0, 181, 0, 208, + 3, 206, 87, 0, 208, 3, 206, 156, 0, 208, + 3, 146, 0, 208, 104, 141, 105, 3, 156, 0, + 142, 0, 141, 109, 142, 0, 208, 0, 208, 110, + 210, 0, 169, 110, 210, 0, 144, 0, 143, 109, + 144, 0, 158, 0, 210, 0, 155, 0, 145, 109, 155, 0, 28, 104, 148, 105, 150, 0, 0, 88, - 0, 149, 0, 148, 109, 149, 0, 162, 196, 0, - 162, 156, 147, 0, 162, 162, 196, 147, 0, 0, + 0, 149, 0, 148, 109, 149, 0, 162, 198, 0, + 162, 156, 147, 0, 162, 162, 198, 147, 0, 0, 151, 0, 0, 95, 82, 104, 152, 153, 105, 0, - 154, 0, 153, 154, 0, 4, 0, 162, 0, 209, - 156, 0, 157, 0, 158, 177, 196, 0, 102, 0, - 102, 111, 167, 0, 102, 111, 203, 0, 171, 0, - 172, 0, 173, 0, 206, 104, 143, 105, 0, 159, - 0, 56, 68, 159, 0, 11, 0, 11, 112, 206, - 0, 11, 112, 208, 0, 207, 0, 207, 112, 160, - 0, 161, 0, 160, 112, 161, 0, 163, 0, 163, - 0, 13, 0, 14, 0, 208, 138, 3, 165, 0, - 0, 104, 166, 168, 0, 5, 0, 7, 0, 6, - 0, 203, 0, 167, 0, 208, 0, 206, 112, 208, - 0, 4, 0, 168, 4, 0, 24, 0, 63, 0, - 76, 0, 170, 0, 67, 81, 0, 65, 51, 0, - 77, 0, 44, 0, 36, 71, 0, 26, 81, 0, - 91, 0, 47, 0, 58, 0, 40, 0, 22, 81, - 0, 169, 0, 170, 200, 0, 23, 0, 48, 0, - 49, 0, 50, 0, 59, 0, 64, 0, 74, 0, - 83, 0, 85, 0, 90, 0, 92, 0, 93, 0, - 94, 0, 66, 0, 27, 104, 145, 105, 0, 78, - 104, 145, 105, 0, 79, 104, 145, 105, 0, 78, - 177, 68, 158, 0, 79, 177, 68, 158, 0, 18, - 0, 18, 35, 25, 208, 0, 99, 0, 100, 0, - 97, 0, 98, 0, 96, 0, 0, 178, 0, 80, - 106, 179, 107, 0, 106, 179, 107, 0, 178, 106, - 179, 107, 0, 180, 0, 180, 109, 102, 0, 180, - 109, 102, 109, 180, 0, 181, 0, 180, 174, 181, - 0, 180, 175, 181, 0, 181, 176, 181, 0, 183, - 106, 179, 107, 0, 106, 179, 107, 0, 184, 0, - 184, 182, 184, 0, 61, 182, 184, 0, 184, 182, - 60, 0, 61, 182, 60, 0, 190, 0, 185, 0, - 101, 0, 101, 113, 0, 113, 101, 0, 113, 101, - 113, 0, 80, 0, 46, 0, 203, 0, 208, 0, - 6, 0, 45, 0, 86, 0, 95, 30, 104, 186, - 105, 0, 187, 0, 186, 109, 187, 0, 102, 0, - 208, 177, 188, 0, 0, 189, 0, 73, 0, 15, - 0, 69, 0, 191, 0, 192, 0, 104, 206, 105, - 0, 191, 104, 193, 105, 0, 194, 0, 193, 109, - 194, 0, 114, 195, 0, 114, 112, 195, 0, 208, - 0, 195, 112, 208, 0, 0, 197, 0, 69, 0, - 33, 198, 0, 184, 0, 169, 0, 0, 104, 199, - 168, 0, 104, 105, 0, 104, 201, 105, 0, 202, - 0, 201, 109, 202, 0, 208, 0, 208, 106, 203, - 107, 0, 208, 106, 167, 107, 0, 203, 0, 102, - 0, 9, 0, 10, 0, 0, 205, 0, 103, 0, - 103, 52, 0, 103, 41, 0, 11, 0, 12, 0, - 12, 0, 8, 0, 208, 0, 208, 205, 0 + 154, 0, 153, 154, 0, 4, 0, 162, 0, 211, + 156, 0, 157, 0, 158, 178, 198, 0, 173, 0, + 102, 0, 102, 111, 167, 0, 102, 111, 205, 0, + 171, 0, 172, 0, 174, 0, 208, 104, 143, 105, + 0, 159, 0, 56, 68, 159, 0, 11, 0, 11, + 112, 208, 0, 11, 112, 210, 0, 209, 0, 209, + 112, 160, 0, 161, 0, 160, 112, 161, 0, 163, + 0, 163, 0, 13, 0, 14, 0, 210, 138, 3, + 165, 0, 0, 104, 166, 168, 0, 5, 0, 7, + 0, 6, 0, 205, 0, 167, 0, 210, 0, 208, + 112, 210, 0, 4, 0, 168, 4, 0, 24, 0, + 63, 0, 76, 0, 170, 0, 67, 81, 0, 65, + 51, 0, 77, 0, 44, 0, 36, 71, 0, 26, + 81, 0, 91, 0, 47, 0, 58, 0, 40, 0, + 22, 81, 0, 169, 0, 170, 202, 0, 23, 0, + 48, 0, 49, 0, 50, 0, 59, 0, 64, 0, + 74, 0, 83, 0, 85, 0, 90, 0, 92, 0, + 93, 0, 94, 0, 66, 0, 78, 178, 68, 156, + 0, 79, 178, 68, 156, 0, 27, 104, 145, 105, + 0, 78, 104, 145, 105, 0, 79, 104, 145, 105, + 0, 18, 0, 18, 35, 25, 210, 0, 99, 0, + 100, 0, 97, 0, 98, 0, 96, 0, 0, 179, + 0, 180, 0, 80, 106, 181, 107, 0, 106, 181, + 107, 0, 180, 106, 181, 107, 0, 182, 0, 182, + 109, 102, 0, 182, 109, 102, 109, 182, 0, 183, + 0, 182, 175, 183, 0, 182, 176, 183, 0, 183, + 177, 183, 0, 185, 106, 181, 107, 0, 106, 181, + 107, 0, 186, 0, 186, 184, 186, 0, 61, 184, + 186, 0, 186, 184, 60, 0, 61, 184, 60, 0, + 192, 0, 187, 0, 101, 0, 101, 113, 0, 113, + 101, 0, 113, 101, 113, 0, 80, 0, 46, 0, + 205, 0, 210, 0, 6, 0, 45, 0, 86, 0, + 95, 30, 104, 188, 105, 0, 189, 0, 188, 109, + 189, 0, 102, 0, 210, 178, 190, 0, 0, 191, + 0, 73, 0, 15, 0, 69, 0, 193, 0, 194, + 0, 104, 208, 105, 0, 193, 104, 195, 105, 0, + 196, 0, 195, 109, 196, 0, 114, 197, 0, 114, + 112, 197, 0, 210, 0, 197, 112, 210, 0, 0, + 199, 0, 69, 0, 33, 200, 0, 186, 0, 169, + 0, 0, 104, 201, 168, 0, 104, 105, 0, 104, + 203, 105, 0, 204, 0, 203, 109, 204, 0, 210, + 0, 210, 106, 205, 107, 0, 210, 106, 167, 107, + 0, 205, 0, 102, 0, 9, 0, 10, 0, 0, + 207, 0, 103, 0, 103, 52, 0, 103, 41, 0, + 11, 0, 12, 0, 12, 0, 8, 0, 210, 0, + 210, 207, 0 }; #endif #if YYDEBUG != 0 static const short yyrline[] = { 0, - 296, 302, 308, 324, 349, 351, 354, 358, 363, 370, - 378, 383, 387, 396, 398, 406, 410, 418, 422, 425, - 428, 432, 452, 454, 462, 466, 498, 502, 511, 518, - 531, 538, 540, 552, 565, 572, 577, 583, 589, 598, - 604, 610, 617, 625, 629, 632, 639, 645, 651, 658, - 667, 677, 685, 693, 695, 707, 719, 726, 742, 752, - 762, 772, 777, 784, 794, 800, 806, 810, 822, 828, - 834, 844, 846, 849, 857, 863, 872, 877, 894, 896, - 901, 905, 910, 915, 921, 925, 950, 957, 962, 970, - 979, 988, 999, 1003, 1009, 1017, 1041, 1048, 1062, 1071, - 1081, 1091, 1099, 1120, 1129, 1138, 1139, 1141, 1148, 1160, - 1170, 1172, 1177, 1181, 1185, 1189, 1192, 1197, 1209, 1225, - 1236, 1250, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, - 1260, 1261, 1262, 1268, 1270, 1271, 1274, 1281, 1293, 1295, - 1299, 1303, 1304, 1305, 1306, 1307, 1311, 1312, 1313, 1314, - 1318, 1319, 1322, 1329, 1335, 1341, 1349, 1357, 1363, 1379, - 1379, 1380, 1380, 1381, 1383, 1385, 1388, 1402, 1406, 1411, - 1415, 1421, 1431, 1435, 1438, 1441, 1446, 1455, 1463, 1469, - 1476, 1484, 1492, 1501, 1504, 1509, 1511, 1512, 1513, 1516, - 1520, 1525, 1529, 1540, 1545, 1550, 1557, 1563, 1567, 1572, - 1578, 1590, 1592, 1595, 1599, 1602, 1607, 1611, 1619, 1634, - 1640, 1647, 1660, 1672, 1687, 1691, 1708, 1710, 1713, 1717, - 1723, 1726, 1728, 1728, 1748, 1753, 1758, 1764, 1770, 1778, - 1786, 1794, 1801, 1811, 1816, 1846, 1848, 1851, 1856, 1860, - 1866, 1871, 1878, 1885, 1892, 1897 + 298, 304, 310, 326, 351, 353, 356, 360, 365, 372, + 380, 385, 389, 398, 400, 408, 412, 420, 424, 427, + 430, 434, 454, 456, 464, 468, 500, 504, 513, 520, + 533, 540, 542, 554, 567, 574, 579, 585, 591, 600, + 606, 612, 619, 627, 631, 634, 641, 647, 653, 660, + 669, 679, 687, 695, 697, 709, 721, 728, 744, 754, + 764, 774, 779, 786, 796, 802, 808, 812, 824, 830, + 836, 846, 848, 851, 859, 865, 874, 879, 896, 898, + 903, 907, 912, 917, 923, 927, 952, 959, 964, 974, + 982, 991, 1000, 1011, 1015, 1021, 1029, 1053, 1060, 1074, + 1083, 1093, 1103, 1111, 1132, 1141, 1150, 1151, 1153, 1160, + 1172, 1182, 1184, 1189, 1193, 1197, 1201, 1204, 1209, 1221, + 1237, 1248, 1262, 1264, 1265, 1266, 1267, 1268, 1269, 1270, + 1271, 1272, 1273, 1274, 1280, 1282, 1283, 1286, 1293, 1305, + 1307, 1311, 1315, 1316, 1317, 1318, 1319, 1323, 1324, 1325, + 1326, 1330, 1331, 1335, 1344, 1354, 1361, 1367, 1373, 1379, + 1395, 1395, 1396, 1396, 1397, 1399, 1401, 1406, 1410, 1419, + 1423, 1428, 1432, 1438, 1448, 1452, 1455, 1458, 1463, 1472, + 1480, 1486, 1493, 1501, 1509, 1518, 1521, 1526, 1528, 1529, + 1530, 1533, 1537, 1542, 1546, 1557, 1562, 1567, 1574, 1580, + 1584, 1589, 1595, 1607, 1609, 1612, 1616, 1619, 1624, 1628, + 1636, 1651, 1657, 1664, 1677, 1689, 1704, 1708, 1725, 1727, + 1730, 1734, 1740, 1743, 1745, 1745, 1765, 1770, 1775, 1781, + 1787, 1795, 1803, 1811, 1818, 1828, 1833, 1863, 1865, 1868, + 1873, 1877, 1883, 1888, 1895, 1902, 1909, 1914 }; #endif @@ -416,17 +417,18 @@ static const char * const yytname[] = { "$","error","$undefined.","TOK_PPEQ", "ActualParameter","ConstructedDataTypeDefinition","ClassDeclaration","optUnique", "ClassFieldList","ClassField","optWithSyntax","WithSyntax","@2","WithSyntaxFormat", "WithSyntaxFormatToken","DataTypeMember","ConstrainedTypeDeclaration","ExtensionAndException", -"TypeDeclaration","ComplexTypeReference","ComplexTypeReferenceAmpList","ComplexTypeReferenceElement", -"ClassFieldIdentifier","ClassFieldName","ValueDefinition","InlineOrDefinedValue", -"@3","DefinedValue","Opaque","BasicTypeId","BasicTypeId_UniverationCompatible", -"BasicType","BasicString","ConstructedType","Union","Intersection","Except", -"optConstraints","SetOfConstraints","ElementSetSpecs","ElementSetSpec","ConstraintSubtypeElement", -"ConstraintRangeSpec","ConstraintSpec","ConstraintValue","WithComponents","WithComponentsList", -"WithComponentsElement","optPresenceConstraint","PresenceConstraint","TableConstraint", -"SimpleTableConstraint","ComponentRelationConstraint","AtNotationList","AtNotationElement", -"ComponentIdList","optMarker","Marker","DefaultValue","@4","UniverationDefinition", -"UniverationList","UniverationElement","SignedNumber","optTag","Tag","TypeRefName", -"ObjectClassReference","Identifier","TaggedIdentifier", NULL +"UnconstrainedTypeDeclaration","ComplexTypeReference","ComplexTypeReferenceAmpList", +"ComplexTypeReferenceElement","ClassFieldIdentifier","ClassFieldName","ValueDefinition", +"InlineOrDefinedValue","@3","DefinedValue","Opaque","BasicTypeId","BasicTypeId_UniverationCompatible", +"BasicType","BasicString","ConstructedTypeConstrained","ConstructedType","Union", +"Intersection","Except","optConstraints","Constraints","SetOfConstraints","ElementSetSpecs", +"ElementSetSpec","ConstraintSubtypeElement","ConstraintRangeSpec","ConstraintSpec", +"ConstraintValue","WithComponents","WithComponentsList","WithComponentsElement", +"optPresenceConstraint","PresenceConstraint","TableConstraint","SimpleTableConstraint", +"ComponentRelationConstraint","AtNotationList","AtNotationElement","ComponentIdList", +"optMarker","Marker","DefaultValue","@4","UniverationDefinition","UniverationList", +"UniverationElement","SignedNumber","optTag","Tag","TypeRefName","ObjectClassReference", +"Identifier","TaggedIdentifier", NULL }; #endif @@ -439,23 +441,23 @@ static const short yyr1[] = { 0, 137, 138, 138, 139, 139, 140, 140, 140, 140, 141, 141, 142, 142, 142, 143, 143, 144, 144, 145, 145, 146, 147, 147, 148, 148, 149, 149, 149, 150, 150, - 152, 151, 153, 153, 154, 154, 155, 155, 156, 157, - 157, 157, 158, 158, 158, 158, 158, 158, 159, 159, - 159, 159, 159, 160, 160, 161, 162, 163, 163, 164, - 166, 165, 165, 165, 165, 165, 165, 167, 167, 168, - 168, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 170, 170, 170, 171, 171, 172, 172, + 152, 151, 153, 153, 154, 154, 155, 155, 156, 156, + 157, 157, 157, 158, 158, 158, 158, 158, 158, 159, + 159, 159, 159, 159, 160, 160, 161, 162, 163, 163, + 164, 166, 165, 165, 165, 165, 165, 165, 167, 167, + 168, 168, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 170, 170, 170, 171, 171, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 173, 173, 173, 173, 173, 173, 173, 174, - 174, 175, 175, 176, 177, 177, 177, 178, 178, 179, - 179, 179, 180, 180, 180, 180, 181, 181, 181, 181, - 181, 181, 181, 181, 181, 182, 182, 182, 182, 183, - 183, 184, 184, 184, 184, 184, 185, 186, 186, 187, - 187, 188, 188, 189, 189, 189, 190, 190, 191, 192, - 193, 193, 194, 194, 195, 195, 196, 196, 197, 197, - 198, 198, 199, 198, 200, 200, 201, 201, 202, 202, - 202, 202, 202, 203, 203, 204, 204, 205, 205, 205, - 206, 206, 207, 208, 209, 209 + 172, 172, 172, 173, 173, 174, 174, 174, 174, 174, + 175, 175, 176, 176, 177, 178, 178, 179, 179, 180, + 180, 181, 181, 181, 182, 182, 182, 182, 183, 183, + 183, 183, 183, 183, 183, 183, 183, 184, 184, 184, + 184, 185, 185, 186, 186, 186, 186, 186, 187, 188, + 188, 189, 189, 190, 190, 191, 191, 191, 192, 192, + 193, 194, 195, 195, 196, 196, 197, 197, 198, 198, + 199, 199, 200, 200, 201, 200, 202, 202, 203, 203, + 204, 204, 204, 204, 204, 205, 205, 206, 206, 207, + 207, 207, 208, 208, 209, 210, 211, 211 }; static const short yyr2[] = { 0, @@ -468,304 +470,300 @@ static const short yyr2[] = { 0, 3, 1, 3, 3, 1, 3, 1, 1, 1, 3, 5, 0, 1, 1, 3, 2, 3, 4, 0, 1, 0, 6, 1, 2, 1, 1, 2, 1, 3, 1, - 3, 3, 1, 1, 1, 4, 1, 3, 1, 3, - 3, 1, 3, 1, 3, 1, 1, 1, 1, 4, - 0, 3, 1, 1, 1, 1, 1, 1, 3, 1, - 2, 1, 1, 1, 1, 2, 2, 1, 1, 2, - 2, 1, 1, 1, 1, 2, 1, 2, 1, 1, + 1, 3, 3, 1, 1, 1, 4, 1, 3, 1, + 3, 3, 1, 3, 1, 3, 1, 1, 1, 1, + 4, 0, 3, 1, 1, 1, 1, 1, 1, 3, + 1, 2, 1, 1, 1, 1, 2, 2, 1, 1, + 2, 2, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 4, 4, 4, 4, 4, 1, 4, 1, - 1, 1, 1, 1, 0, 1, 4, 3, 4, 1, - 3, 5, 1, 3, 3, 3, 4, 3, 1, 3, - 3, 3, 3, 1, 1, 1, 2, 2, 3, 1, - 1, 1, 1, 1, 1, 1, 5, 1, 3, 1, - 3, 0, 1, 1, 1, 1, 1, 1, 3, 4, - 1, 3, 2, 3, 1, 3, 0, 1, 1, 2, - 1, 1, 0, 3, 2, 3, 1, 3, 1, 4, - 4, 1, 1, 1, 1, 0, 1, 1, 2, 2, - 1, 1, 1, 1, 1, 2 + 1, 1, 1, 4, 4, 4, 4, 4, 1, 4, + 1, 1, 1, 1, 1, 0, 1, 1, 4, 3, + 4, 1, 3, 5, 1, 3, 3, 3, 4, 3, + 1, 3, 3, 3, 3, 1, 1, 1, 2, 2, + 3, 1, 1, 1, 1, 1, 1, 1, 5, 1, + 3, 1, 3, 0, 1, 1, 1, 1, 1, 1, + 3, 4, 1, 3, 2, 3, 1, 3, 0, 1, + 1, 2, 1, 1, 0, 3, 2, 3, 1, 3, + 1, 4, 4, 1, 1, 1, 1, 0, 1, 1, + 2, 2, 1, 1, 1, 1, 1, 2 }; static const short yydefact[] = { 0, - 241, 242, 1, 2, 5, 3, 0, 0, 6, 244, + 243, 244, 1, 2, 5, 3, 0, 0, 6, 246, 13, 8, 0, 9, 11, 14, 7, 10, 0, 0, 0, 0, 0, 0, 0, 15, 16, 0, 22, 20, - 18, 21, 19, 0, 17, 12, 23, 139, 0, 0, - 140, 141, 142, 0, 143, 144, 152, 145, 146, 147, - 148, 149, 150, 151, 0, 24, 25, 27, 28, 31, + 18, 21, 19, 0, 17, 12, 23, 140, 0, 0, + 141, 142, 143, 0, 144, 145, 153, 146, 147, 148, + 149, 150, 151, 152, 0, 24, 25, 27, 28, 31, 29, 30, 34, 0, 0, 32, 0, 46, 0, 47, 49, 50, 36, 0, 37, 0, 40, 42, 43, 4, - 26, 236, 99, 243, 0, 122, 0, 0, 135, 129, - 133, 134, 123, 0, 0, 124, 128, 132, 0, 0, - 52, 53, 125, 102, 0, 33, 45, 44, 0, 35, - 38, 0, 0, 0, 238, 58, 0, 237, 0, 136, - 131, 130, 127, 126, 0, 60, 0, 62, 0, 0, - 0, 48, 5, 41, 0, 240, 239, 99, 243, 158, - 0, 0, 165, 165, 56, 57, 165, 97, 137, 125, - 93, 94, 95, 0, 100, 101, 0, 0, 0, 0, - 54, 108, 109, 103, 104, 106, 113, 115, 114, 234, - 235, 111, 110, 117, 116, 0, 118, 39, 0, 74, - 217, 107, 0, 0, 0, 0, 0, 0, 0, 166, - 0, 0, 217, 0, 138, 0, 0, 61, 64, 63, - 194, 195, 191, 0, 190, 196, 0, 0, 0, 0, - 55, 170, 173, 0, 179, 185, 184, 207, 208, 192, - 193, 0, 0, 0, 79, 0, 0, 219, 72, 217, - 76, 218, 0, 90, 0, 69, 88, 245, 0, 98, - 0, 0, 0, 0, 0, 0, 0, 89, 233, 225, - 0, 227, 232, 229, 0, 65, 67, 68, 59, 186, - 0, 0, 0, 0, 0, 51, 162, 163, 160, 161, - 0, 0, 0, 164, 0, 0, 0, 0, 105, 120, - 112, 119, 0, 71, 80, 75, 223, 222, 221, 220, - 73, 77, 72, 159, 0, 153, 0, 246, 87, 0, - 154, 168, 156, 0, 155, 157, 226, 0, 0, 96, - 0, 187, 188, 183, 181, 0, 209, 178, 171, 174, - 175, 176, 0, 182, 180, 0, 0, 211, 121, 0, - 0, 78, 91, 92, 70, 167, 169, 228, 0, 0, - 66, 189, 200, 0, 198, 165, 0, 177, 0, 213, - 215, 210, 0, 81, 224, 231, 230, 197, 0, 202, - 172, 214, 0, 212, 0, 199, 205, 206, 204, 201, - 203, 216, 85, 0, 83, 86, 82, 84, 0, 0, - 0 + 26, 238, 100, 245, 0, 123, 0, 0, 136, 130, + 134, 135, 124, 0, 0, 125, 129, 133, 0, 0, + 52, 53, 126, 103, 0, 33, 45, 44, 0, 35, + 38, 0, 0, 0, 240, 58, 0, 239, 0, 137, + 132, 131, 128, 127, 0, 60, 0, 62, 0, 0, + 0, 48, 5, 41, 0, 242, 241, 100, 245, 159, + 0, 0, 166, 166, 56, 57, 166, 98, 138, 126, + 94, 95, 90, 96, 0, 101, 102, 0, 0, 0, + 0, 54, 109, 110, 104, 105, 107, 114, 116, 115, + 236, 237, 112, 111, 118, 117, 0, 119, 39, 0, + 74, 219, 108, 0, 0, 0, 0, 0, 0, 0, + 167, 168, 0, 0, 219, 0, 139, 0, 0, 61, + 64, 63, 196, 197, 193, 0, 192, 198, 0, 0, + 0, 0, 55, 172, 175, 0, 181, 187, 186, 209, + 210, 194, 195, 0, 0, 0, 79, 0, 0, 221, + 72, 219, 76, 220, 0, 91, 0, 69, 88, 247, + 0, 99, 0, 0, 0, 0, 0, 0, 0, 89, + 235, 227, 0, 229, 234, 231, 0, 0, 0, 65, + 67, 68, 59, 188, 0, 0, 0, 0, 0, 51, + 163, 164, 161, 162, 0, 0, 0, 165, 0, 0, + 0, 0, 106, 121, 113, 120, 0, 71, 80, 75, + 225, 224, 223, 222, 73, 77, 72, 160, 0, 156, + 0, 248, 87, 0, 157, 170, 154, 0, 158, 155, + 228, 0, 0, 97, 0, 189, 190, 185, 183, 0, + 211, 180, 173, 176, 177, 178, 0, 184, 182, 0, + 0, 213, 122, 0, 0, 78, 92, 93, 70, 169, + 171, 230, 0, 0, 66, 191, 202, 0, 200, 166, + 0, 179, 0, 215, 217, 212, 0, 81, 226, 233, + 232, 199, 0, 204, 174, 216, 0, 214, 0, 201, + 207, 208, 206, 203, 205, 218, 85, 0, 83, 86, + 82, 84, 0, 0, 0 }; -static const short yydefgoto[] = { 379, +static const short yydefgoto[] = { 383, 3, 4, 8, 9, 13, 14, 25, 26, 27, 55, 56, 57, 106, 58, 74, 75, 76, 77, 59, 69, - 70, 60, 100, 210, 61, 125, 126, 255, 256, 235, - 116, 292, 179, 180, 284, 285, 365, 374, 375, 236, - 146, 237, 147, 148, 164, 165, 181, 182, 62, 173, - 223, 174, 281, 149, 150, 151, 152, 153, 272, 273, - 275, 189, 190, 211, 212, 213, 262, 214, 215, 216, - 344, 345, 370, 371, 217, 218, 219, 327, 328, 350, - 231, 232, 290, 331, 195, 251, 252, 220, 117, 118, - 154, 104, 221, 239 + 70, 60, 100, 212, 61, 125, 126, 259, 260, 237, + 116, 296, 180, 181, 288, 289, 369, 378, 379, 238, + 146, 239, 147, 148, 165, 166, 182, 183, 62, 174, + 225, 175, 285, 149, 150, 151, 152, 153, 154, 276, + 277, 279, 190, 191, 192, 213, 214, 215, 266, 216, + 217, 218, 348, 349, 374, 375, 219, 220, 221, 331, + 332, 354, 233, 234, 294, 335, 197, 253, 254, 222, + 117, 118, 155, 104, 223, 241 }; -static const short yypact[] = { 41, --32768,-32768, 41,-32768, -62,-32768, 10, 54,-32768,-32768, --32768,-32768, 20,-32768, -20, 44,-32768,-32768, 95, 78, - 72, 83, 45, 112, 187, 44,-32768, 94,-32768,-32768, --32768,-32768,-32768, 189,-32768,-32768, 398,-32768, 223, 23, --32768,-32768,-32768, 57,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 201, 398,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 194, 696,-32768, 140,-32768, 53,-32768, --32768,-32768,-32768, 47,-32768, -25,-32768,-32768,-32768,-32768, --32768, -8, 138,-32768, 173,-32768, 185, 196,-32768,-32768, --32768,-32768,-32768, 209, 188,-32768,-32768,-32768, 713, 265, --32768,-32768,-32768, 160, 271,-32768,-32768,-32768, 157,-32768, --32768, 41, 157, 174, 108,-32768, 559,-32768, 157,-32768, --32768,-32768,-32768,-32768, 90,-32768, 169, 171, 176, 137, - 71,-32768, -62,-32768, 137,-32768,-32768, 59, 178, 248, - 180, 218, 42, 60,-32768,-32768, -33,-32768,-32768, 183, --32768,-32768,-32768, 190,-32768,-32768, 289, 713, 287, 287, - 133,-32768,-32768, 193,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768, 203,-32768,-32768, 93,-32768, - 482,-32768, 272, 9, 170, 200, 9, 133, 231, 202, - 9, 232, 30, 52,-32768, 337, 636,-32768,-32768,-32768, --32768,-32768,-32768, -69,-32768,-32768, 283, 41, 133, 211, --32768, 124, 221, 212, -69,-32768,-32768, 216,-32768,-32768, --32768, 137, 317, 287, 227, 137, 267,-32768, 235, 30, --32768,-32768, 287, 213, 98,-32768,-32768, 224, 636,-32768, - 133, 103, 219, 636, 133, 106, 636,-32768,-32768,-32768, - 120,-32768,-32768, 222, 122,-32768,-32768,-32768,-32768, 220, - 228, 84, 233, 226, 229,-32768,-32768,-32768,-32768,-32768, - 236, 133, 133,-32768, 133, 133, 128, 225,-32768,-32768, - 331,-32768, 258,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768, 235,-32768, 234,-32768, 9,-32768,-32768, 239, --32768,-32768,-32768, 240,-32768,-32768,-32768, 14, 234,-32768, - 337,-32768, 237,-32768,-32768, 19,-32768,-32768, 242,-32768, --32768,-32768, 247,-32768,-32768, 7, 127,-32768,-32768, 253, - 317,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 255, 259, --32768,-32768,-32768, 142,-32768, -33, 133,-32768, 287, 256, --32768,-32768, 225,-32768, 331,-32768,-32768,-32768, 19, 28, - 165, 256, 287,-32768, 179,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 12,-32768,-32768,-32768,-32768, 341, 365, --32768 +static const short yypact[] = { 62, +-32768,-32768, 62,-32768, -36,-32768, 11, 56,-32768,-32768, +-32768,-32768, 26,-32768, -13, 202,-32768,-32768, 87, 52, + 66, 99, 108, 101, 116, 202,-32768, 81,-32768,-32768, +-32768,-32768,-32768, 149,-32768,-32768, 375,-32768, 185, 10, +-32768,-32768,-32768, 58,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 163, 375,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 140, 673,-32768, 96,-32768, 86,-32768, +-32768,-32768,-32768, 20,-32768, -4,-32768,-32768,-32768,-32768, +-32768, -11, 98,-32768, 134,-32768, 137, 156,-32768,-32768, +-32768,-32768,-32768, 187, 139,-32768,-32768,-32768, 690, 269, +-32768,-32768,-32768, 165, 272,-32768,-32768,-32768, 218,-32768, +-32768, 62, 218, 179, 94,-32768, 536,-32768, 218,-32768, +-32768,-32768,-32768,-32768, -65,-32768, 175, 176, 183, 199, + 53,-32768, -36,-32768, 199,-32768,-32768, 70, 184, 255, + 192, 229, 61, 65,-32768,-32768, -27,-32768,-32768, 194, +-32768,-32768,-32768,-32768, 195,-32768,-32768, 301, 690, 299, + 299, 215,-32768,-32768, 197,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768, 203,-32768,-32768, 63, +-32768, 459,-32768, 286, 21, 235, 210, 21, 215, 250, +-32768, 214, 21, 256, 15, 42,-32768, 314, 613,-32768, +-32768,-32768,-32768,-32768,-32768, -12,-32768,-32768, 297, 62, + 215, 223,-32768, 142, 233, 225, -12,-32768,-32768, 230, +-32768,-32768,-32768, 199, 329, 299, 240, 199, 226,-32768, + 251, 15,-32768,-32768, 299, 231, 91,-32768,-32768, 241, + 613,-32768, 215, 128, 236, 613, 215, 144, 613,-32768, +-32768,-32768, 158,-32768,-32768, 239, 243, 244, 159,-32768, +-32768,-32768,-32768, 238, 248, 77, 249, 252, 245,-32768, +-32768,-32768,-32768,-32768, 253, 215, 215,-32768, 215, 215, + 89, 254,-32768,-32768, 355,-32768, 283,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768, 251,-32768, 247,-32768, + 21,-32768,-32768, 259,-32768,-32768,-32768, 260,-32768,-32768, +-32768, 46, 247,-32768, 314,-32768, 258,-32768,-32768, 28, +-32768,-32768, 265,-32768,-32768,-32768, 262,-32768,-32768, -1, + 160,-32768,-32768, 271, 329,-32768,-32768,-32768,-32768,-32768, +-32768,-32768, 275, 277,-32768,-32768,-32768, 169,-32768, -27, + 215,-32768, 299, 264,-32768,-32768, 254,-32768, 355,-32768, +-32768,-32768, 28, 8, 182, 264, 299,-32768, 125,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768, 12,-32768,-32768, +-32768,-32768, 385, 389,-32768 }; static const short yypgoto[] = {-32768, --32768, 364, 241,-32768,-32768, 356,-32768,-32768, 344,-32768, --32768, 316,-32768,-32768,-32768, 301,-32768, 263,-32768,-32768, - 269,-32768, 314,-32768,-32768,-32768, 230,-32768, 69, 62, --32768, 96,-32768, 156,-32768,-32768,-32768,-32768, 16, 86, - -131,-32768, -193, -55,-32768, 172, -174, -94,-32768,-32768, --32768, -162, 61, -53, -51,-32768, 89,-32768,-32768,-32768, --32768, -142,-32768, -118, 50, -17, 184,-32768, -188,-32768, --32768, 32,-32768,-32768,-32768,-32768,-32768,-32768, 55, 49, - -121,-32768,-32768,-32768,-32768,-32768, 97, -123,-32768, 181, - 1,-32768, -7,-32768 +-32768, 391, 263,-32768,-32768, 382,-32768,-32768, 374,-32768, +-32768, 345,-32768,-32768,-32768, 328,-32768, 290,-32768,-32768, + 300,-32768, 346,-32768,-32768,-32768, 257,-32768, 95, -67, +-32768, 115,-32768, 186,-32768,-32768,-32768,-32768, 37, 117, + -40,-32768, -188, -50,-32768, 196, -179, -91,-32768,-32768, +-32768, -219, 84, -56, -52,-32768, 35,-32768,-32768,-32768, +-32768,-32768, -142,-32768,-32768, -165, 71, -121, 204,-32768, + -141,-32768,-32768, 64,-32768,-32768,-32768,-32768,-32768,-32768, + 69, 75, -124,-32768,-32768,-32768,-32768,-32768, 118, -120, +-32768, 191, 1,-32768, -7,-32768 }; -#define YYLAST 804 +#define YYLAST 781 static const short yytable[] = { 15, - 5, 192, 257, 5, 193, 15, 230, 175, 101, 101, - 102, 102, 103, 103, 10, 373, 10, 10, 11, 114, - 112, 10, 170, 171, 162, 163, 10, 10, 11, 65, - 10, 260, 72, 1, 2, 166, 79, 64, 289, 67, - 71, 7, 367, 261, 78, 127, 186, 103, 65, 229, - 303, 1, 2, 306, 10, 20, 64, 1, 2, 10, - 170, 171, 227, 21, 10, 259, 79, 1, 2, 243, - 253, 248, 188, 315, 78, 167, 168, 169, 10, 170, - 171, 1, 2, 113, 22, 19, 23, 16, 325, 201, - 265, 10, 170, 171, 115, 24, 368, 32, 228, 128, - 369, 72, 73, 28, 127, 79, 103, 299, 293, 71, - 234, 156, 133, 78, 12, 249, 377, 257, 349, 155, - 343, 186, 300, 177, 17, 63, 304, 166, 202, 240, - 68, 176, 333, 201, 29, 10, 170, 171, 201, 186, - 10, 170, 171, 314, 63, 187, 339, 188, 136, 162, - 163, 199, 200, 249, 110, 30, 250, 323, 128, 137, - 108, 109, -241, 191, 10, 188, 31, 1, 2, 206, - 119, 334, 202, 288, 172, 103, 238, 202, 203, 238, - 83, 84, 373, 238, 253, 340, 254, 324, 258, 34, - 376, 162, 163, 204, 157, 33, 82, 225, 158, 376, - 36, 226, 296, 360, 83, 84, 297, 301, 264, 37, - 305, 297, 205, 206, 297, 85, 282, 86, 206, 87, - 267, 268, 269, 270, 307, 294, 310, 207, 308, 88, - 311, 352, 271, 89, 66, 353, 208, 90, 209, 80, - 91, 10, 170, 171, 1, 2, 358, 107, 242, 119, - 359, 92, 246, 120, 320, 321, 93, 322, 94, 123, - 95, 267, 268, 269, 270, 121, 122, 129, 124, 96, - 97, 130, 201, 131, 10, 170, 171, 135, 159, 161, - 160, -242, 183, 184, 98, 185, 194, 177, 85, 238, - 86, 197, 87, 196, 10, 176, 233, 99, 244, 247, - 254, 177, 88, 258, 222, 241, 89, 245, 346, 176, - 90, 202, 263, 91, 224, 266, 274, 276, 351, 278, - 280, 283, 291, 295, 92, 302, 115, 309, 313, 93, - 317, 94, 312, 95, 329, 318, 316, 319, 326, 330, - 380, 351, 96, 97, 10, 336, 337, 138, 139, 342, - 347, 346, 206, 348, 140, 372, 354, 98, 85, 38, - 86, 356, 87, 141, 381, 357, 6, 363, 18, 35, - 287, 81, 88, 178, 111, 134, 89, 132, 105, 341, - 90, 286, 335, 91, 41, 42, 43, 198, 332, 378, - 366, 355, 142, 279, 92, 45, 361, 362, 277, 93, - 46, 94, 47, 95, 338, 10, 0, 364, 1, 2, - 48, 0, 96, 97, 143, 144, 0, 0, 298, 49, - 38, 50, 0, 0, 0, 0, 51, 98, 52, 53, - 54, 0, 0, 0, 0, 39, 0, 0, 0, 40, - 0, 0, 0, 0, 0, 41, 42, 43, 0, 0, - 0, 44, 0, 0, 0, 0, 45, 0, 0, 0, - 0, 46, 0, 47, 0, 0, 0, 0, 0, 0, - 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, - 49, 0, 50, 0, 0, 0, 0, 51, 0, 52, - 53, 54, 138, 139, 162, 163, 0, 0, 0, 140, - 0, 0, 0, 85, 38, 86, 0, 87, 141, 0, - 0, 0, 0, 0, 227, 0, 0, 88, 0, 0, - 0, 89, 0, 0, 0, 90, 0, 0, 91, 41, - 42, 43, 0, 0, 0, 0, 0, 142, 0, 92, - 45, 0, 0, 0, 93, 46, 94, 47, 95, 0, - 228, 0, 0, 0, 0, 48, 0, 96, 97, 143, - 144, 0, 0, 0, 49, 0, 50, 0, 0, 138, - 139, 51, 98, 52, 53, 54, 140, 0, 0, 0, + 5, 194, 232, 5, 195, 15, 10, 102, 102, 261, + 176, 103, 103, 101, 101, 377, 114, 10, 10, 11, + 1, 2, 371, 245, 163, 164, 67, 10, 10, 65, + 1, 2, 72, 10, 11, 10, 79, 64, 167, 158, + 71, 112, 127, 159, 78, 269, 103, 229, 65, 10, + 171, 172, 187, 10, 171, 172, 64, 168, 169, 170, + 10, 171, 172, 1, 2, 10, 79, 7, 1, 2, + 250, 63, 1, 2, 78, 255, 372, 304, 189, 337, + 373, 308, 203, 230, 10, 171, 172, 293, 264, 16, + 63, 115, 19, 343, 203, 28, 10, 171, 172, 128, + 265, 72, 127, 73, 113, 79, 103, 297, 29, 71, + 353, 157, 133, 78, 327, 12, 381, 68, 34, 156, + 244, 204, 236, 178, 319, 248, 261, 110, 377, 347, + 17, 177, 167, 204, 136, 242, 318, 163, 164, 329, + 187, 231, 82, 251, 187, 137, 252, 251, 328, 30, + 83, 84, 201, 202, 324, 325, 173, 326, 263, 128, + 32, 85, 208, 86, 188, 87, 189, 227, 193, 37, + 189, 228, 292, -243, 208, 88, 103, 240, 338, 89, + 240, 119, 31, 90, 33, 240, 91, 36, 256, 380, + 262, 255, 344, 108, 109, 300, 66, 92, 380, 301, + 303, 80, 93, 107, 94, 307, 95, 364, 310, 119, + 268, 163, 164, 20, 120, 96, 97, 121, 286, 124, + 203, 21, 10, 171, 172, 10, 122, 298, 1, 2, + 98, 203, 305, 10, 171, 172, 301, 123, 271, 272, + 273, 274, 22, 99, 23, 83, 84, 85, 309, 86, + 275, 87, 301, 24, 10, 171, 172, 1, 2, 204, + 205, 88, 311, 314, 356, 89, 312, 315, 357, 90, + 204, 129, 91, 362, 131, 206, 130, 363, 271, 272, + 273, 274, 135, 92, 160, 161, 162, -244, 93, 184, + 94, 178, 95, 240, 207, 185, 186, 196, 198, 177, + 208, 96, 97, 199, 256, 178, 10, 262, 224, 209, + 235, 208, 350, 177, 226, 243, 98, 246, 210, 247, + 211, 10, 355, 249, 138, 139, 267, 270, 278, 291, + 280, 140, 284, 282, 287, 85, 38, 86, 295, 87, + 141, 299, 306, 115, 313, 355, 188, 193, 317, 88, + 316, 322, 320, 89, 323, 350, 321, 90, 333, 376, + 91, 41, 42, 43, 334, 340, 341, 330, 352, 142, + 346, 92, 45, 351, 358, 367, 93, 46, 94, 47, + 95, 360, 10, 361, 384, 1, 2, 48, 385, 96, + 97, 257, 258, 6, 18, 179, 49, 38, 50, 35, + 81, 111, 134, 51, 98, 52, 53, 54, 132, 345, + 105, 336, 39, 290, 382, 200, 40, 339, 359, 283, + 281, 365, 41, 42, 43, 368, 370, 366, 44, 342, + 302, 0, 0, 45, 0, 0, 0, 0, 46, 0, + 47, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 0, 0, 0, 0, 0, 0, 0, 49, 0, 50, + 0, 0, 0, 0, 51, 0, 52, 53, 54, 138, + 139, 163, 164, 0, 0, 0, 140, 0, 0, 0, 85, 38, 86, 0, 87, 141, 0, 0, 0, 0, - 0, 0, 0, 0, 88, 0, 0, 0, 89, 0, + 0, 229, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 90, 0, 0, 91, 41, 42, 43, 0, 0, 0, 0, 0, 142, 0, 92, 45, 0, 0, - 0, 93, 46, 94, 47, 95, 0, 0, 0, 0, + 0, 93, 46, 94, 47, 95, 0, 230, 0, 0, 0, 0, 48, 0, 96, 97, 143, 144, 0, 0, - 0, 49, 0, 50, 0, 145, 138, 139, 51, 98, + 0, 49, 0, 50, 0, 0, 138, 139, 51, 98, 52, 53, 54, 140, 0, 0, 0, 85, 38, 86, 0, 87, 141, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 90, 0, 0, 91, 41, 42, 43, 0, 0, 0, 0, 0, 142, 0, 92, 45, 0, 0, 0, 93, 46, - 94, 47, 95, 0, 0, 0, 83, 84, 0, 48, - 0, 96, 97, 143, 144, 0, 0, 85, 49, 86, - 50, 87, 0, 1, 2, 51, 98, 52, 53, 54, - 0, 88, 0, 0, 85, 89, 86, 0, 87, 90, - 0, 0, 91, 0, 0, 0, 0, 0, 88, 0, - 0, 0, 89, 92, 0, 0, 90, 0, 93, 91, - 94, 0, 95, 0, 0, 0, 0, 0, 0, 0, - 92, 96, 97, 0, 0, 93, 0, 94, 0, 95, - 0, 0, 0, 0, 0, 0, 98, 0, 96, 97, + 94, 47, 95, 0, 0, 0, 0, 0, 0, 48, + 0, 96, 97, 143, 144, 0, 0, 0, 49, 0, + 50, 0, 145, 138, 139, 51, 98, 52, 53, 54, + 140, 0, 0, 0, 85, 38, 86, 0, 87, 141, + 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, + 0, 0, 89, 0, 0, 0, 90, 0, 0, 91, + 41, 42, 43, 0, 0, 0, 0, 0, 142, 0, + 92, 45, 0, 0, 0, 93, 46, 94, 47, 95, + 0, 0, 0, 83, 84, 0, 48, 0, 96, 97, + 143, 144, 0, 0, 85, 49, 86, 50, 87, 0, + 1, 2, 51, 98, 52, 53, 54, 0, 88, 0, + 0, 85, 89, 86, 0, 87, 90, 0, 0, 91, + 0, 0, 0, 0, 0, 88, 0, 0, 0, 89, + 92, 0, 0, 90, 0, 93, 91, 94, 0, 95, + 0, 0, 0, 0, 0, 0, 0, 92, 96, 97, + 0, 0, 93, 0, 94, 0, 95, 0, 0, 0, + 0, 0, 0, 98, 0, 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 98 + 98 }; static const short yycheck[] = { 7, - 0, 144, 196, 3, 147, 13, 181, 131, 64, 65, - 64, 65, 64, 65, 8, 4, 8, 8, 9, 28, - 46, 8, 9, 10, 13, 14, 8, 8, 9, 37, - 8, 101, 40, 11, 12, 130, 44, 37, 227, 17, - 40, 104, 15, 113, 44, 99, 80, 99, 56, 181, - 244, 11, 12, 247, 8, 12, 56, 11, 12, 8, - 9, 10, 33, 20, 8, 197, 74, 11, 12, 188, - 194, 193, 106, 262, 74, 5, 6, 7, 8, 9, - 10, 11, 12, 109, 41, 106, 43, 34, 277, 6, - 209, 8, 9, 10, 103, 52, 69, 53, 69, 99, - 73, 109, 46, 9, 158, 113, 158, 239, 230, 109, - 102, 119, 112, 113, 105, 102, 105, 311, 112, 119, - 102, 80, 241, 131, 105, 37, 245, 222, 45, 185, - 108, 131, 295, 6, 57, 8, 9, 10, 6, 80, - 8, 9, 10, 60, 56, 104, 309, 106, 41, 13, - 14, 159, 160, 102, 108, 84, 105, 276, 158, 52, - 108, 109, 104, 104, 8, 106, 84, 11, 12, 86, - 112, 295, 45, 227, 104, 227, 184, 45, 46, 187, - 11, 12, 4, 191, 308, 309, 194, 60, 196, 3, - 365, 13, 14, 61, 105, 84, 3, 105, 109, 374, - 107, 109, 105, 346, 11, 12, 109, 105, 208, 21, - 105, 109, 80, 86, 109, 22, 224, 24, 86, 26, - 97, 98, 99, 100, 105, 233, 105, 95, 109, 36, - 109, 105, 109, 40, 12, 109, 104, 44, 106, 39, - 47, 8, 9, 10, 11, 12, 105, 108, 187, 112, - 109, 58, 191, 81, 272, 273, 63, 275, 65, 51, - 67, 97, 98, 99, 100, 81, 71, 3, 81, 76, - 77, 112, 6, 3, 8, 9, 10, 104, 110, 104, - 110, 104, 35, 104, 91, 68, 104, 295, 22, 297, - 24, 3, 26, 104, 8, 295, 25, 104, 68, 68, - 308, 309, 36, 311, 112, 106, 40, 106, 316, 309, - 44, 45, 30, 47, 112, 105, 96, 106, 326, 104, - 4, 95, 88, 111, 58, 107, 103, 106, 101, 63, - 105, 65, 113, 67, 4, 107, 104, 102, 114, 82, - 0, 349, 76, 77, 8, 107, 107, 11, 12, 113, - 109, 359, 86, 107, 18, 363, 104, 91, 22, 23, - 24, 107, 26, 27, 0, 107, 3, 112, 13, 26, - 104, 56, 36, 133, 74, 113, 40, 109, 65, 311, - 44, 226, 297, 47, 48, 49, 50, 158, 293, 374, - 359, 331, 56, 222, 58, 59, 347, 349, 215, 63, - 64, 65, 66, 67, 308, 8, -1, 353, 11, 12, - 74, -1, 76, 77, 78, 79, -1, -1, 238, 83, - 23, 85, -1, -1, -1, -1, 90, 91, 92, 93, - 94, -1, -1, -1, -1, 38, -1, -1, -1, 42, - -1, -1, -1, -1, -1, 48, 49, 50, -1, -1, - -1, 54, -1, -1, -1, -1, 59, -1, -1, -1, - -1, 64, -1, 66, -1, -1, -1, -1, -1, -1, - -1, 74, -1, -1, -1, -1, -1, -1, -1, -1, - 83, -1, 85, -1, -1, -1, -1, 90, -1, 92, - 93, 94, 11, 12, 13, 14, -1, -1, -1, 18, - -1, -1, -1, 22, 23, 24, -1, 26, 27, -1, - -1, -1, -1, -1, 33, -1, -1, 36, -1, -1, - -1, 40, -1, -1, -1, 44, -1, -1, 47, 48, - 49, 50, -1, -1, -1, -1, -1, 56, -1, 58, - 59, -1, -1, -1, 63, 64, 65, 66, 67, -1, - 69, -1, -1, -1, -1, 74, -1, 76, 77, 78, - 79, -1, -1, -1, 83, -1, 85, -1, -1, 11, - 12, 90, 91, 92, 93, 94, 18, -1, -1, -1, + 0, 144, 182, 3, 147, 13, 8, 64, 65, 198, + 131, 64, 65, 64, 65, 4, 28, 8, 8, 9, + 11, 12, 15, 189, 13, 14, 17, 8, 8, 37, + 11, 12, 40, 8, 9, 8, 44, 37, 130, 105, + 40, 46, 99, 109, 44, 211, 99, 33, 56, 8, + 9, 10, 80, 8, 9, 10, 56, 5, 6, 7, + 8, 9, 10, 11, 12, 8, 74, 104, 11, 12, + 195, 37, 11, 12, 74, 196, 69, 243, 106, 299, + 73, 247, 6, 69, 8, 9, 10, 229, 101, 34, + 56, 103, 106, 313, 6, 9, 8, 9, 10, 99, + 113, 109, 159, 46, 109, 113, 159, 232, 57, 109, + 112, 119, 112, 113, 280, 105, 105, 108, 3, 119, + 188, 45, 102, 131, 266, 193, 315, 108, 4, 102, + 105, 131, 224, 45, 41, 186, 60, 13, 14, 281, + 80, 182, 3, 102, 80, 52, 105, 102, 60, 84, + 11, 12, 160, 161, 276, 277, 104, 279, 199, 159, + 53, 22, 86, 24, 104, 26, 106, 105, 104, 21, + 106, 109, 229, 104, 86, 36, 229, 185, 299, 40, + 188, 112, 84, 44, 84, 193, 47, 107, 196, 369, + 198, 312, 313, 108, 109, 105, 12, 58, 378, 109, + 241, 39, 63, 108, 65, 246, 67, 350, 249, 112, + 210, 13, 14, 12, 81, 76, 77, 81, 226, 81, + 6, 20, 8, 9, 10, 8, 71, 235, 11, 12, + 91, 6, 105, 8, 9, 10, 109, 51, 97, 98, + 99, 100, 41, 104, 43, 11, 12, 22, 105, 24, + 109, 26, 109, 52, 8, 9, 10, 11, 12, 45, + 46, 36, 105, 105, 105, 40, 109, 109, 109, 44, + 45, 3, 47, 105, 3, 61, 112, 109, 97, 98, + 99, 100, 104, 58, 110, 110, 104, 104, 63, 35, + 65, 299, 67, 301, 80, 104, 68, 104, 104, 299, + 86, 76, 77, 3, 312, 313, 8, 315, 112, 95, + 25, 86, 320, 313, 112, 106, 91, 68, 104, 106, + 106, 8, 330, 68, 11, 12, 30, 105, 96, 104, + 106, 18, 4, 104, 95, 22, 23, 24, 88, 26, + 27, 111, 107, 103, 106, 353, 104, 104, 101, 36, + 113, 107, 104, 40, 102, 363, 105, 44, 4, 367, + 47, 48, 49, 50, 82, 107, 107, 114, 107, 56, + 113, 58, 59, 109, 104, 112, 63, 64, 65, 66, + 67, 107, 8, 107, 0, 11, 12, 74, 0, 76, + 77, 78, 79, 3, 13, 133, 83, 23, 85, 26, + 56, 74, 113, 90, 91, 92, 93, 94, 109, 315, + 65, 297, 38, 228, 378, 159, 42, 301, 335, 224, + 217, 351, 48, 49, 50, 357, 363, 353, 54, 312, + 240, -1, -1, 59, -1, -1, -1, -1, 64, -1, + 66, -1, -1, -1, -1, -1, -1, -1, 74, -1, + -1, -1, -1, -1, -1, -1, -1, 83, -1, 85, + -1, -1, -1, -1, 90, -1, 92, 93, 94, 11, + 12, 13, 14, -1, -1, -1, 18, -1, -1, -1, 22, 23, 24, -1, 26, 27, -1, -1, -1, -1, - -1, -1, -1, -1, 36, -1, -1, -1, 40, -1, + -1, 33, -1, -1, 36, -1, -1, -1, 40, -1, -1, -1, 44, -1, -1, 47, 48, 49, 50, -1, -1, -1, -1, -1, 56, -1, 58, 59, -1, -1, - -1, 63, 64, 65, 66, 67, -1, -1, -1, -1, + -1, 63, 64, 65, 66, 67, -1, 69, -1, -1, -1, -1, 74, -1, 76, 77, 78, 79, -1, -1, - -1, 83, -1, 85, -1, 87, 11, 12, 90, 91, + -1, 83, -1, 85, -1, -1, 11, 12, 90, 91, 92, 93, 94, 18, -1, -1, -1, 22, 23, 24, -1, 26, 27, -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, 40, -1, -1, -1, 44, -1, -1, 47, 48, 49, 50, -1, -1, -1, -1, -1, 56, -1, 58, 59, -1, -1, -1, 63, 64, - 65, 66, 67, -1, -1, -1, 11, 12, -1, 74, - -1, 76, 77, 78, 79, -1, -1, 22, 83, 24, - 85, 26, -1, 11, 12, 90, 91, 92, 93, 94, - -1, 36, -1, -1, 22, 40, 24, -1, 26, 44, - -1, -1, 47, -1, -1, -1, -1, -1, 36, -1, - -1, -1, 40, 58, -1, -1, 44, -1, 63, 47, - 65, -1, 67, -1, -1, -1, -1, -1, -1, -1, - 58, 76, 77, -1, -1, 63, -1, 65, -1, 67, - -1, -1, -1, -1, -1, -1, 91, -1, 76, 77, + 65, 66, 67, -1, -1, -1, -1, -1, -1, 74, + -1, 76, 77, 78, 79, -1, -1, -1, 83, -1, + 85, -1, 87, 11, 12, 90, 91, 92, 93, 94, + 18, -1, -1, -1, 22, 23, 24, -1, 26, 27, + -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, + -1, -1, 40, -1, -1, -1, 44, -1, -1, 47, + 48, 49, 50, -1, -1, -1, -1, -1, 56, -1, + 58, 59, -1, -1, -1, 63, 64, 65, 66, 67, + -1, -1, -1, 11, 12, -1, 74, -1, 76, 77, + 78, 79, -1, -1, 22, 83, 24, 85, 26, -1, + 11, 12, 90, 91, 92, 93, 94, -1, 36, -1, + -1, 22, 40, 24, -1, 26, 44, -1, -1, 47, + -1, -1, -1, -1, -1, 36, -1, -1, -1, 40, + 58, -1, -1, 44, -1, 63, 47, 65, -1, 67, + -1, -1, -1, -1, -1, -1, -1, 58, 76, 77, + -1, -1, 63, -1, 65, -1, 67, -1, -1, -1, + -1, -1, -1, 91, -1, 76, 77, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 91 + 91 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/share/bison.simple" @@ -1311,13 +1309,13 @@ yyparse(YYPARSE_PARAM_ARG) switch (yyn) { case 1: -#line 297 "asn1p_y.y" +#line 299 "asn1p_y.y" { *(void **)param = yyvsp[0].a_grammar; ; break;} case 2: -#line 303 "asn1p_y.y" +#line 305 "asn1p_y.y" { yyval.a_grammar = asn1p_new(); checkmem(yyval.a_grammar); @@ -1325,14 +1323,14 @@ case 2: ; break;} case 3: -#line 308 "asn1p_y.y" +#line 310 "asn1p_y.y" { yyval.a_grammar = yyvsp[-1].a_grammar; TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); ; break;} case 4: -#line 329 "asn1p_y.y" +#line 331 "asn1p_y.y" { if(yyvsp[-1].a_module) { @@ -1349,27 +1347,27 @@ case 4: ; break;} case 5: -#line 350 "asn1p_y.y" +#line 352 "asn1p_y.y" { yyval.a_oid = 0; ; break;} case 6: -#line 351 "asn1p_y.y" +#line 353 "asn1p_y.y" { yyval.a_oid = yyvsp[0].a_oid; ; break;} case 7: -#line 355 "asn1p_y.y" +#line 357 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; ; break;} case 8: -#line 358 "asn1p_y.y" +#line 360 "asn1p_y.y" { yyval.a_oid = 0; ; break;} case 9: -#line 364 "asn1p_y.y" +#line 366 "asn1p_y.y" { yyval.a_oid = asn1p_oid_new(); asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1378,7 +1376,7 @@ case 9: ; break;} case 10: -#line 370 "asn1p_y.y" +#line 372 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1387,74 +1385,74 @@ case 10: ; break;} case 11: -#line 379 "asn1p_y.y" +#line 381 "asn1p_y.y" { /* iso */ yyval.a_oid_arc.name = yyvsp[0].tv_str; yyval.a_oid_arc.number = -1; ; break;} case 12: -#line 383 "asn1p_y.y" +#line 385 "asn1p_y.y" { /* iso(1) */ yyval.a_oid_arc.name = yyvsp[-3].tv_str; yyval.a_oid_arc.number = yyvsp[-1].a_int; ; break;} case 13: -#line 387 "asn1p_y.y" +#line 389 "asn1p_y.y" { /* 1 */ yyval.a_oid_arc.name = 0; yyval.a_oid_arc.number = yyvsp[0].a_int; ; break;} case 14: -#line 397 "asn1p_y.y" +#line 399 "asn1p_y.y" { yyval.a_module_flags = MSF_NOFLAGS; ; break;} case 15: -#line 398 "asn1p_y.y" +#line 400 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; ; break;} case 16: -#line 407 "asn1p_y.y" +#line 409 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; ; break;} case 17: -#line 410 "asn1p_y.y" +#line 412 "asn1p_y.y" { yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags; ; break;} case 18: -#line 419 "asn1p_y.y" +#line 421 "asn1p_y.y" { yyval.a_module_flags = MSF_EXPLICIT_TAGS; ; break;} case 19: -#line 422 "asn1p_y.y" +#line 424 "asn1p_y.y" { yyval.a_module_flags = MSF_IMPLICIT_TAGS; ; break;} case 20: -#line 425 "asn1p_y.y" +#line 427 "asn1p_y.y" { yyval.a_module_flags = MSF_AUTOMATIC_TAGS; ; break;} case 21: -#line 428 "asn1p_y.y" +#line 430 "asn1p_y.y" { yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED; ; break;} case 22: -#line 432 "asn1p_y.y" +#line 434 "asn1p_y.y" { /* X.680Amd1 specifies TAG and XER */ if(strcmp(yyvsp[-1].tv_str, "TAG") == 0) { @@ -1472,23 +1470,23 @@ case 22: ; break;} case 23: -#line 453 "asn1p_y.y" +#line 455 "asn1p_y.y" { yyval.a_module = 0; ; break;} case 24: -#line 454 "asn1p_y.y" +#line 456 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 25: -#line 463 "asn1p_y.y" +#line 465 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 26: -#line 466 "asn1p_y.y" +#line 468 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; @@ -1518,13 +1516,13 @@ case 26: ; break;} case 27: -#line 499 "asn1p_y.y" +#line 501 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 28: -#line 502 "asn1p_y.y" +#line 504 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1536,7 +1534,7 @@ case 28: ; break;} case 29: -#line 511 "asn1p_y.y" +#line 513 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1546,7 +1544,7 @@ case 29: ; break;} case 30: -#line 518 "asn1p_y.y" +#line 520 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1556,7 +1554,7 @@ case 30: ; break;} case 31: -#line 531 "asn1p_y.y" +#line 533 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1566,11 +1564,11 @@ case 31: ; break;} case 32: -#line 539 "asn1p_y.y" +#line 541 "asn1p_y.y" { asn1p_lexer_hack_push_encoding_control(); ; break;} case 33: -#line 540 "asn1p_y.y" +#line 542 "asn1p_y.y" { fprintf(stderr, "WARNING: ENCODING-CONTROL %s " @@ -1581,7 +1579,7 @@ case 33: ; break;} case 34: -#line 552 "asn1p_y.y" +#line 554 "asn1p_y.y" { return yyerror( "Attempt to redefine a standard basic type, " @@ -1590,19 +1588,19 @@ case 34: ; break;} case 35: -#line 566 "asn1p_y.y" +#line 568 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; ; break;} case 36: -#line 572 "asn1p_y.y" +#line 574 "asn1p_y.y" { return yyerror("Empty IMPORTS list"); ; break;} case 37: -#line 578 "asn1p_y.y" +#line 580 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1610,14 +1608,14 @@ case 37: ; break;} case 38: -#line 583 "asn1p_y.y" +#line 585 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); ; break;} case 39: -#line 590 "asn1p_y.y" +#line 592 "asn1p_y.y" { yyval.a_xports = yyvsp[-3].a_xports; yyval.a_xports->from = yyvsp[-1].tv_str; @@ -1626,7 +1624,7 @@ case 39: ; break;} case 40: -#line 599 "asn1p_y.y" +#line 601 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); @@ -1634,14 +1632,14 @@ case 40: ; break;} case 41: -#line 604 "asn1p_y.y" +#line 606 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} case 42: -#line 611 "asn1p_y.y" +#line 613 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1650,7 +1648,7 @@ case 42: ; break;} case 43: -#line 617 "asn1p_y.y" +#line 619 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1659,19 +1657,19 @@ case 43: ; break;} case 44: -#line 626 "asn1p_y.y" +#line 628 "asn1p_y.y" { yyval.a_xports = yyvsp[-1].a_xports; ; break;} case 45: -#line 629 "asn1p_y.y" +#line 631 "asn1p_y.y" { yyval.a_xports = 0; ; break;} case 46: -#line 632 "asn1p_y.y" +#line 634 "asn1p_y.y" { /* Empty EXPORTS clause effectively prohibits export. */ yyval.a_xports = asn1p_xports_new(); @@ -1679,7 +1677,7 @@ case 46: ; break;} case 47: -#line 640 "asn1p_y.y" +#line 642 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); assert(yyval.a_xports); @@ -1687,14 +1685,14 @@ case 47: ; break;} case 48: -#line 645 "asn1p_y.y" +#line 647 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} case 49: -#line 652 "asn1p_y.y" +#line 654 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1703,7 +1701,7 @@ case 49: ; break;} case 50: -#line 658 "asn1p_y.y" +#line 660 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1712,7 +1710,7 @@ case 50: ; break;} case 51: -#line 668 "asn1p_y.y" +#line 670 "asn1p_y.y" { yyval.a_expr = yyvsp[-4].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1722,7 +1720,7 @@ case 51: ; break;} case 52: -#line 678 "asn1p_y.y" +#line 680 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1732,7 +1730,7 @@ case 52: ; break;} case 53: -#line 685 "asn1p_y.y" +#line 687 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1741,16 +1739,16 @@ case 53: ; break;} case 54: -#line 694 "asn1p_y.y" +#line 696 "asn1p_y.y" { ; break;} case 55: -#line 695 "asn1p_y.y" +#line 697 "asn1p_y.y" { ; break;} case 56: -#line 711 "asn1p_y.y" +#line 713 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1761,7 +1759,7 @@ case 56: ; break;} case 57: -#line 719 "asn1p_y.y" +#line 721 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-3].tv_str; @@ -1771,7 +1769,7 @@ case 57: ; break;} case 58: -#line 726 "asn1p_y.y" +#line 728 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -1780,7 +1778,7 @@ case 58: ; break;} case 59: -#line 743 "asn1p_y.y" +#line 745 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1790,7 +1788,7 @@ case 59: ; break;} case 60: -#line 753 "asn1p_y.y" +#line 755 "asn1p_y.y" { int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); @@ -1802,7 +1800,7 @@ case 60: ; break;} case 61: -#line 762 "asn1p_y.y" +#line 764 "asn1p_y.y" { int ret; yyval.a_plist = yyvsp[-2].a_plist; @@ -1813,14 +1811,14 @@ case 61: ; break;} case 62: -#line 773 "asn1p_y.y" +#line 775 "asn1p_y.y" { yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} case 63: -#line 777 "asn1p_y.y" +#line 779 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1830,7 +1828,7 @@ case 63: ; break;} case 64: -#line 784 "asn1p_y.y" +#line 786 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1841,7 +1839,7 @@ case 64: ; break;} case 65: -#line 795 "asn1p_y.y" +#line 797 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1849,20 +1847,20 @@ case 65: ; break;} case 66: -#line 800 "asn1p_y.y" +#line 802 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} case 67: -#line 807 "asn1p_y.y" +#line 809 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 68: -#line 810 "asn1p_y.y" +#line 812 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1872,7 +1870,7 @@ case 68: ; break;} case 69: -#line 823 "asn1p_y.y" +#line 825 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1880,14 +1878,14 @@ case 69: ; break;} case 70: -#line 828 "asn1p_y.y" +#line 830 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} case 71: -#line 835 "asn1p_y.y" +#line 837 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); @@ -1897,15 +1895,15 @@ case 71: ; break;} case 72: -#line 845 "asn1p_y.y" +#line 847 "asn1p_y.y" { yyval.a_int = 0; ; break;} case 73: -#line 846 "asn1p_y.y" +#line 848 "asn1p_y.y" { yyval.a_int = 1; ; break;} case 74: -#line 850 "asn1p_y.y" +#line 852 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1915,14 +1913,14 @@ case 74: ; break;} case 75: -#line 857 "asn1p_y.y" +#line 859 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} case 76: -#line 864 "asn1p_y.y" +#line 866 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1933,7 +1931,7 @@ case 76: ; break;} case 77: -#line 872 "asn1p_y.y" +#line 874 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; yyval.a_expr->Identifier = yyvsp[-2].a_refcomp.name; @@ -1941,7 +1939,7 @@ case 77: ; break;} case 78: -#line 877 "asn1p_y.y" +#line 879 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -1959,47 +1957,47 @@ case 78: ; break;} case 79: -#line 895 "asn1p_y.y" +#line 897 "asn1p_y.y" { yyval.a_wsynt = 0; ; break;} case 80: -#line 896 "asn1p_y.y" +#line 898 "asn1p_y.y" { yyval.a_wsynt = yyvsp[0].a_wsynt; ; break;} case 81: -#line 903 "asn1p_y.y" +#line 905 "asn1p_y.y" { asn1p_lexer_hack_enable_with_syntax(); ; break;} case 82: -#line 905 "asn1p_y.y" +#line 907 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; ; break;} case 83: -#line 911 "asn1p_y.y" +#line 913 "asn1p_y.y" { yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} case 84: -#line 915 "asn1p_y.y" +#line 917 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} case 85: -#line 922 "asn1p_y.y" +#line 924 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); ; break;} case 86: -#line 925 "asn1p_y.y" +#line 927 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2011,7 +2009,7 @@ case 86: ; break;} case 87: -#line 951 "asn1p_y.y" +#line 953 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -2020,21 +2018,34 @@ case 87: ; break;} case 88: -#line 957 "asn1p_y.y" +#line 959 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 89: -#line 963 "asn1p_y.y" +#line 965 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; - yyval.a_expr->constraints = yyvsp[-1].a_constr; + if(yyval.a_expr->constraints) { + assert(!yyvsp[-1].a_constr); + } else { + yyval.a_expr->constraints = yyvsp[-1].a_constr; + } yyval.a_expr->marker = yyvsp[0].a_marker; ; break;} case 90: -#line 971 "asn1p_y.y" +#line 974 "asn1p_y.y" +{ + /* This type includes constraints on its own */ + yyval.a_expr = yyvsp[0].a_expr; + checkmem(yyval.a_expr); + assert(yyval.a_expr->meta_type); + ; + break;} +case 91: +#line 983 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -2044,8 +2055,8 @@ case 90: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 91: -#line 979 "asn1p_y.y" +case 92: +#line 991 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -2056,8 +2067,8 @@ case 91: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 92: -#line 988 "asn1p_y.y" +case 93: +#line 1000 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -2068,14 +2079,14 @@ case 92: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 93: -#line 1000 "asn1p_y.y" +case 94: +#line 1012 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} -case 94: -#line 1003 "asn1p_y.y" +case 95: +#line 1015 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2083,16 +2094,16 @@ case 94: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 95: -#line 1009 "asn1p_y.y" +case 96: +#line 1021 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; checkmem(yyval.a_expr); assert(yyval.a_expr->meta_type); ; break;} -case 96: -#line 1017 "asn1p_y.y" +case 97: +#line 1029 "asn1p_y.y" { int ret; yyval.a_expr = yyvsp[-1].a_expr; @@ -2108,8 +2119,8 @@ case 96: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 97: -#line 1041 "asn1p_y.y" +case 98: +#line 1053 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2118,8 +2129,8 @@ case 97: yyval.a_expr->meta_type = AMT_TYPEREF; ; break;} -case 98: -#line 1048 "asn1p_y.y" +case 99: +#line 1060 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2128,8 +2139,8 @@ case 98: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 99: -#line 1063 "asn1p_y.y" +case 100: +#line 1075 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2139,8 +2150,8 @@ case 99: free(yyvsp[0].tv_str); ; break;} -case 100: -#line 1071 "asn1p_y.y" +case 101: +#line 1083 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2152,8 +2163,8 @@ case 100: free(yyvsp[-2].tv_str); ; break;} -case 101: -#line 1081 "asn1p_y.y" +case 102: +#line 1093 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2165,8 +2176,8 @@ case 101: free(yyvsp[-2].tv_str); ; break;} -case 102: -#line 1091 "asn1p_y.y" +case 103: +#line 1103 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2176,8 +2187,8 @@ case 102: checkmem(ret == 0); ; break;} -case 103: -#line 1099 "asn1p_y.y" +case 104: +#line 1111 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[0].a_ref; @@ -2198,8 +2209,8 @@ case 103: } ; break;} -case 104: -#line 1121 "asn1p_y.y" +case 105: +#line 1133 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2209,8 +2220,8 @@ case 104: checkmem(ret == 0); ; break;} -case 105: -#line 1129 "asn1p_y.y" +case 106: +#line 1141 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[-2].a_ref; @@ -2219,22 +2230,22 @@ case 105: checkmem(ret == 0); ; break;} -case 108: -#line 1143 "asn1p_y.y" +case 109: +#line 1155 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} -case 109: -#line 1148 "asn1p_y.y" +case 110: +#line 1160 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} -case 110: -#line 1161 "asn1p_y.y" +case 111: +#line 1173 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); @@ -2243,53 +2254,53 @@ case 110: yyval.a_expr->value = yyvsp[0].a_value; ; break;} -case 111: -#line 1171 "asn1p_y.y" +case 112: +#line 1183 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} -case 112: -#line 1172 "asn1p_y.y" +case 113: +#line 1184 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); yyval.a_value->type = ATV_UNPARSED; ; break;} -case 113: -#line 1177 "asn1p_y.y" +case 114: +#line 1189 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); ; break;} -case 114: -#line 1181 "asn1p_y.y" +case 115: +#line 1193 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); ; break;} -case 115: -#line 1185 "asn1p_y.y" +case 116: +#line 1197 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} -case 116: -#line 1189 "asn1p_y.y" +case 117: +#line 1201 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 117: -#line 1192 "asn1p_y.y" +case 118: +#line 1204 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 118: -#line 1198 "asn1p_y.y" +case 119: +#line 1210 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2302,8 +2313,8 @@ case 118: free(yyvsp[0].tv_str); ; break;} -case 119: -#line 1209 "asn1p_y.y" +case 120: +#line 1221 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2319,8 +2330,8 @@ case 119: free(yyvsp[0].tv_str); ; break;} -case 120: -#line 1226 "asn1p_y.y" +case 121: +#line 1238 "asn1p_y.y" { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 2; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); @@ -2332,8 +2343,8 @@ case 120: free(yyvsp[0].tv_opaque.buf); ; break;} -case 121: -#line 1236 "asn1p_y.y" +case 122: +#line 1248 "asn1p_y.y" { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); @@ -2347,68 +2358,68 @@ case 121: yyval.tv_opaque.len = newsize; ; break;} -case 122: -#line 1251 "asn1p_y.y" +case 123: +#line 1263 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BOOLEAN; ; break;} -case 123: -#line 1252 "asn1p_y.y" +case 124: +#line 1264 "asn1p_y.y" { yyval.a_type = ASN_BASIC_NULL; ; break;} -case 124: -#line 1253 "asn1p_y.y" +case 125: +#line 1265 "asn1p_y.y" { yyval.a_type = ASN_BASIC_REAL; ; break;} -case 125: -#line 1254 "asn1p_y.y" +case 126: +#line 1266 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} -case 126: -#line 1255 "asn1p_y.y" +case 127: +#line 1267 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OCTET_STRING; ; break;} -case 127: -#line 1256 "asn1p_y.y" +case 128: +#line 1268 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; break;} -case 128: -#line 1257 "asn1p_y.y" +case 129: +#line 1269 "asn1p_y.y" { yyval.a_type = ASN_BASIC_RELATIVE_OID; ; break;} -case 129: -#line 1258 "asn1p_y.y" +case 130: +#line 1270 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EXTERNAL; ; break;} -case 130: -#line 1259 "asn1p_y.y" +case 131: +#line 1271 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; break;} -case 131: -#line 1260 "asn1p_y.y" +case 132: +#line 1272 "asn1p_y.y" { yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; break;} -case 132: -#line 1261 "asn1p_y.y" +case 133: +#line 1273 "asn1p_y.y" { yyval.a_type = ASN_BASIC_UTCTime; ; break;} -case 133: -#line 1262 "asn1p_y.y" +case 134: +#line 1274 "asn1p_y.y" { yyval.a_type = ASN_BASIC_GeneralizedTime; ; break;} -case 134: -#line 1269 "asn1p_y.y" +case 135: +#line 1281 "asn1p_y.y" { yyval.a_type = ASN_BASIC_INTEGER; ; break;} -case 135: -#line 1270 "asn1p_y.y" +case 136: +#line 1282 "asn1p_y.y" { yyval.a_type = ASN_BASIC_ENUMERATED; ; break;} -case 136: -#line 1271 "asn1p_y.y" +case 137: +#line 1283 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BIT_STRING; ; break;} -case 137: -#line 1275 "asn1p_y.y" +case 138: +#line 1287 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -2416,8 +2427,8 @@ case 137: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 138: -#line 1281 "asn1p_y.y" +case 139: +#line 1293 "asn1p_y.y" { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; @@ -2429,125 +2440,125 @@ case 138: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 139: -#line 1294 "asn1p_y.y" +case 140: +#line 1306 "asn1p_y.y" { yyval.a_type = ASN_STRING_BMPString; ; break;} -case 140: -#line 1295 "asn1p_y.y" +case 141: +#line 1307 "asn1p_y.y" { yyval.a_type = ASN_STRING_GeneralString; return yyerror("GeneralString is not supported"); ; break;} -case 141: -#line 1299 "asn1p_y.y" +case 142: +#line 1311 "asn1p_y.y" { yyval.a_type = ASN_STRING_GraphicString; return yyerror("GraphicString is not supported"); ; break;} -case 142: -#line 1303 "asn1p_y.y" +case 143: +#line 1315 "asn1p_y.y" { yyval.a_type = ASN_STRING_IA5String; ; break;} -case 143: -#line 1304 "asn1p_y.y" +case 144: +#line 1316 "asn1p_y.y" { yyval.a_type = ASN_STRING_ISO646String; ; break;} -case 144: -#line 1305 "asn1p_y.y" +case 145: +#line 1317 "asn1p_y.y" { yyval.a_type = ASN_STRING_NumericString; ; break;} -case 145: -#line 1306 "asn1p_y.y" +case 146: +#line 1318 "asn1p_y.y" { yyval.a_type = ASN_STRING_PrintableString; ; break;} -case 146: -#line 1307 "asn1p_y.y" +case 147: +#line 1319 "asn1p_y.y" { yyval.a_type = ASN_STRING_T61String; return yyerror("T61String not implemented yet"); ; break;} -case 147: -#line 1311 "asn1p_y.y" +case 148: +#line 1323 "asn1p_y.y" { yyval.a_type = ASN_STRING_TeletexString; ; break;} -case 148: -#line 1312 "asn1p_y.y" +case 149: +#line 1324 "asn1p_y.y" { yyval.a_type = ASN_STRING_UniversalString; ; break;} -case 149: -#line 1313 "asn1p_y.y" +case 150: +#line 1325 "asn1p_y.y" { yyval.a_type = ASN_STRING_UTF8String; ; break;} -case 150: -#line 1314 "asn1p_y.y" +case 151: +#line 1326 "asn1p_y.y" { yyval.a_type = ASN_STRING_VideotexString; return yyerror("VideotexString is no longer supported"); ; break;} -case 151: -#line 1318 "asn1p_y.y" +case 152: +#line 1330 "asn1p_y.y" { yyval.a_type = ASN_STRING_VisibleString; ; break;} -case 152: -#line 1319 "asn1p_y.y" +case 153: +#line 1331 "asn1p_y.y" { yyval.a_type = ASN_STRING_ObjectDescriptor; ; break;} -case 153: -#line 1323 "asn1p_y.y" +case 154: +#line 1336 "asn1p_y.y" { - yyval.a_expr = yyvsp[-1].a_expr; - assert(yyval.a_expr->expr_type == A1TC_INVALID); - yyval.a_expr->expr_type = ASN_CONSTR_CHOICE; + yyval.a_expr = asn1p_expr_new(asn1p_lineno); + checkmem(yyval.a_expr); + yyval.a_expr->constraints = yyvsp[-2].a_constr; + yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE_OF; yyval.a_expr->meta_type = AMT_TYPE; + TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} -case 154: -#line 1329 "asn1p_y.y" +case 155: +#line 1344 "asn1p_y.y" { - yyval.a_expr = yyvsp[-1].a_expr; - assert(yyval.a_expr->expr_type == A1TC_INVALID); - yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE; + yyval.a_expr = asn1p_expr_new(asn1p_lineno); + checkmem(yyval.a_expr); + yyval.a_expr->constraints = yyvsp[-2].a_constr; + yyval.a_expr->expr_type = ASN_CONSTR_SET_OF; yyval.a_expr->meta_type = AMT_TYPE; + TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} -case 155: -#line 1335 "asn1p_y.y" +case 156: +#line 1355 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); - yyval.a_expr->expr_type = ASN_CONSTR_SET; + yyval.a_expr->expr_type = ASN_CONSTR_CHOICE; yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 156: -#line 1341 "asn1p_y.y" +case 157: +#line 1361 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(asn1p_lineno); - checkmem(yyval.a_expr); - yyval.a_expr->constraints = yyvsp[-2].a_constr; - yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE_OF; + yyval.a_expr = yyvsp[-1].a_expr; + assert(yyval.a_expr->expr_type == A1TC_INVALID); + yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE; yyval.a_expr->meta_type = AMT_TYPE; - TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} -case 157: -#line 1349 "asn1p_y.y" +case 158: +#line 1367 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(asn1p_lineno); - checkmem(yyval.a_expr); - yyval.a_expr->constraints = yyvsp[-2].a_constr; - yyval.a_expr->expr_type = ASN_CONSTR_SET_OF; + yyval.a_expr = yyvsp[-1].a_expr; + assert(yyval.a_expr->expr_type == A1TC_INVALID); + yyval.a_expr->expr_type = ASN_CONSTR_SET; yyval.a_expr->meta_type = AMT_TYPE; - TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} -case 158: -#line 1357 "asn1p_y.y" +case 159: +#line 1373 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -2555,8 +2566,8 @@ case 158: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 159: -#line 1363 "asn1p_y.y" +case 160: +#line 1379 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(asn1p_lineno); @@ -2569,51 +2580,52 @@ case 159: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 165: -#line 1384 "asn1p_y.y" +case 166: +#line 1400 "asn1p_y.y" { yyval.a_constr = 0; ; break;} -case 166: -#line 1385 "asn1p_y.y" +case 167: +#line 1401 "asn1p_y.y" +{ + yyval.a_constr = yyvsp[0].a_constr; + ; + break;} +case 168: +#line 1407 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); ; break;} -case 167: -#line 1388 "asn1p_y.y" +case 169: +#line 1410 "asn1p_y.y" { /* * This is a special case, for compatibility purposes. * It goes without parentheses. */ - int ret; - yyval.a_constr = asn1p_constraint_new(yylineno); - checkmem(yyval.a_constr); - yyval.a_constr->type = ACT_CT_SIZE; - ret = asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr); - checkmem(ret == 0); + CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_SIZE, yyvsp[-1].a_constr, 0); ; break;} -case 168: -#line 1403 "asn1p_y.y" +case 170: +#line 1420 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; ; break;} -case 169: -#line 1406 "asn1p_y.y" +case 171: +#line 1423 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} -case 170: -#line 1412 "asn1p_y.y" +case 172: +#line 1429 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 171: -#line 1415 "asn1p_y.y" +case 173: +#line 1432 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2621,8 +2633,8 @@ case 171: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); ; break;} -case 172: -#line 1421 "asn1p_y.y" +case 174: +#line 1438 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2632,32 +2644,32 @@ case 172: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, ct, yyvsp[0].a_constr); ; break;} -case 173: -#line 1432 "asn1p_y.y" +case 175: +#line 1449 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 174: -#line 1435 "asn1p_y.y" +case 176: +#line 1452 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 175: -#line 1438 "asn1p_y.y" +case 177: +#line 1455 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 176: -#line 1441 "asn1p_y.y" +case 178: +#line 1458 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 177: -#line 1447 "asn1p_y.y" +case 179: +#line 1464 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2667,8 +2679,8 @@ case 177: checkmem(ret == 0); ; break;} -case 178: -#line 1455 "asn1p_y.y" +case 180: +#line 1472 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2678,8 +2690,8 @@ case 178: checkmem(ret == 0); ; break;} -case 179: -#line 1463 "asn1p_y.y" +case 181: +#line 1480 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2687,8 +2699,8 @@ case 179: yyval.a_constr->value = yyvsp[0].a_value; ; break;} -case 180: -#line 1469 "asn1p_y.y" +case 182: +#line 1486 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2697,8 +2709,8 @@ case 180: yyval.a_constr->range_stop = yyvsp[0].a_value; ; break;} -case 181: -#line 1476 "asn1p_y.y" +case 183: +#line 1493 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2708,8 +2720,8 @@ case 181: yyval.a_constr->range_start->type = ATV_MIN; ; break;} -case 182: -#line 1484 "asn1p_y.y" +case 184: +#line 1501 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2719,8 +2731,8 @@ case 182: yyval.a_constr->range_stop->type = ATV_MAX; ; break;} -case 183: -#line 1492 "asn1p_y.y" +case 185: +#line 1509 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2731,54 +2743,54 @@ case 183: yyval.a_constr->range_stop->type = ATV_MAX; ; break;} -case 184: -#line 1501 "asn1p_y.y" +case 186: +#line 1518 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 185: -#line 1504 "asn1p_y.y" +case 187: +#line 1521 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 186: -#line 1510 "asn1p_y.y" +case 188: +#line 1527 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RANGE; ; break;} -case 187: -#line 1511 "asn1p_y.y" +case 189: +#line 1528 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RLRANGE; ; break;} -case 188: -#line 1512 "asn1p_y.y" +case 190: +#line 1529 "asn1p_y.y" { yyval.a_ctype = ACT_EL_LLRANGE; ; break;} -case 189: -#line 1513 "asn1p_y.y" +case 191: +#line 1530 "asn1p_y.y" { yyval.a_ctype = ACT_EL_ULRANGE; ; break;} -case 190: -#line 1517 "asn1p_y.y" +case 192: +#line 1534 "asn1p_y.y" { yyval.a_ctype = ACT_CT_SIZE; ; break;} -case 191: -#line 1520 "asn1p_y.y" +case 193: +#line 1537 "asn1p_y.y" { yyval.a_ctype = ACT_CT_FROM; ; break;} -case 192: -#line 1526 "asn1p_y.y" +case 194: +#line 1543 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 193: -#line 1529 "asn1p_y.y" +case 195: +#line 1546 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2791,57 +2803,57 @@ case 193: free(yyvsp[0].tv_str); ; break;} -case 194: -#line 1540 "asn1p_y.y" +case 196: +#line 1557 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} -case 195: -#line 1545 "asn1p_y.y" +case 197: +#line 1562 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_FALSE; ; break;} -case 196: -#line 1550 "asn1p_y.y" +case 198: +#line 1567 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); yyval.a_value->type = ATV_TRUE; ; break;} -case 197: -#line 1558 "asn1p_y.y" +case 199: +#line 1575 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); ; break;} -case 198: -#line 1564 "asn1p_y.y" +case 200: +#line 1581 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 199: -#line 1567 "asn1p_y.y" +case 201: +#line 1584 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 200: -#line 1573 "asn1p_y.y" +case 202: +#line 1590 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_EXT; ; break;} -case 201: -#line 1578 "asn1p_y.y" +case 203: +#line 1595 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2850,46 +2862,46 @@ case 201: yyval.a_constr->presence = yyvsp[0].a_pres; ; break;} -case 202: -#line 1591 "asn1p_y.y" +case 204: +#line 1608 "asn1p_y.y" { yyval.a_pres = ACPRES_DEFAULT; ; break;} -case 203: -#line 1592 "asn1p_y.y" +case 205: +#line 1609 "asn1p_y.y" { yyval.a_pres = yyvsp[0].a_pres; ; break;} -case 204: -#line 1596 "asn1p_y.y" +case 206: +#line 1613 "asn1p_y.y" { yyval.a_pres = ACPRES_PRESENT; ; break;} -case 205: -#line 1599 "asn1p_y.y" +case 207: +#line 1616 "asn1p_y.y" { yyval.a_pres = ACPRES_ABSENT; ; break;} -case 206: -#line 1602 "asn1p_y.y" +case 208: +#line 1619 "asn1p_y.y" { yyval.a_pres = ACPRES_OPTIONAL; ; break;} -case 207: -#line 1608 "asn1p_y.y" +case 209: +#line 1625 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 208: -#line 1611 "asn1p_y.y" +case 210: +#line 1628 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 209: -#line 1620 "asn1p_y.y" +case 211: +#line 1637 "asn1p_y.y" { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; @@ -2903,14 +2915,14 @@ case 209: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, ct, 0); ; break;} -case 210: -#line 1635 "asn1p_y.y" +case 212: +#line 1652 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} -case 211: -#line 1641 "asn1p_y.y" +case 213: +#line 1658 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2918,8 +2930,8 @@ case 211: yyval.a_constr->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); ; break;} -case 212: -#line 1647 "asn1p_y.y" +case 214: +#line 1664 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2929,8 +2941,8 @@ case 212: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); ; break;} -case 213: -#line 1661 "asn1p_y.y" +case 215: +#line 1678 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; @@ -2943,8 +2955,8 @@ case 213: free(yyvsp[0].tv_str); ; break;} -case 214: -#line 1672 "asn1p_y.y" +case 216: +#line 1689 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; @@ -2958,14 +2970,14 @@ case 214: free(yyvsp[0].tv_str); ; break;} -case 215: -#line 1688 "asn1p_y.y" +case 217: +#line 1705 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 216: -#line 1691 "asn1p_y.y" +case 218: +#line 1708 "asn1p_y.y" { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); @@ -2976,76 +2988,76 @@ case 216: yyval.tv_str[l1 + 1 + l3] = '\0'; ; break;} -case 217: -#line 1709 "asn1p_y.y" +case 219: +#line 1726 "asn1p_y.y" { yyval.a_marker = EM_NOMARK; ; break;} -case 218: -#line 1710 "asn1p_y.y" +case 220: +#line 1727 "asn1p_y.y" { yyval.a_marker = yyvsp[0].a_marker; ; break;} -case 219: -#line 1714 "asn1p_y.y" +case 221: +#line 1731 "asn1p_y.y" { yyval.a_marker = EM_OPTIONAL; ; break;} -case 220: -#line 1717 "asn1p_y.y" +case 222: +#line 1734 "asn1p_y.y" { yyval.a_marker = EM_DEFAULT; /* FIXME: store DefaultValue somewhere */ ; break;} -case 221: -#line 1724 "asn1p_y.y" +case 223: +#line 1741 "asn1p_y.y" { ; break;} -case 222: -#line 1726 "asn1p_y.y" +case 224: +#line 1743 "asn1p_y.y" { ; break;} -case 223: -#line 1728 "asn1p_y.y" +case 225: +#line 1745 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} -case 224: -#line 1728 "asn1p_y.y" +case 226: +#line 1745 "asn1p_y.y" { ; break;} -case 225: -#line 1749 "asn1p_y.y" +case 227: +#line 1766 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); ; break;} -case 226: -#line 1753 "asn1p_y.y" +case 228: +#line 1770 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; ; break;} -case 227: -#line 1759 "asn1p_y.y" +case 229: +#line 1776 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} -case 228: -#line 1764 "asn1p_y.y" +case 230: +#line 1781 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} -case 229: -#line 1771 "asn1p_y.y" +case 231: +#line 1788 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3054,8 +3066,8 @@ case 229: yyval.a_expr->Identifier = yyvsp[0].tv_str; ; break;} -case 230: -#line 1778 "asn1p_y.y" +case 232: +#line 1795 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3065,8 +3077,8 @@ case 230: yyval.a_expr->value = yyvsp[-1].a_value; ; break;} -case 231: -#line 1786 "asn1p_y.y" +case 233: +#line 1803 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3076,8 +3088,8 @@ case 231: yyval.a_expr->value = yyvsp[-1].a_value; ; break;} -case 232: -#line 1794 "asn1p_y.y" +case 234: +#line 1811 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3086,8 +3098,8 @@ case 232: yyval.a_expr->value = yyvsp[0].a_value; ; break;} -case 233: -#line 1801 "asn1p_y.y" +case 235: +#line 1818 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3097,86 +3109,86 @@ case 233: yyval.a_expr->meta_type = AMT_VALUE; ; break;} -case 234: -#line 1812 "asn1p_y.y" +case 236: +#line 1829 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} -case 235: -#line 1816 "asn1p_y.y" +case 237: +#line 1833 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} -case 236: -#line 1847 "asn1p_y.y" +case 238: +#line 1864 "asn1p_y.y" { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; break;} -case 237: -#line 1848 "asn1p_y.y" +case 239: +#line 1865 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; ; break;} -case 238: -#line 1852 "asn1p_y.y" +case 240: +#line 1869 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; yyval.a_tag.tag_mode = TM_DEFAULT; ; break;} -case 239: -#line 1856 "asn1p_y.y" +case 241: +#line 1873 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_IMPLICIT; ; break;} -case 240: -#line 1860 "asn1p_y.y" +case 242: +#line 1877 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_EXPLICIT; ; break;} -case 241: -#line 1867 "asn1p_y.y" +case 243: +#line 1884 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 242: -#line 1871 "asn1p_y.y" +case 244: +#line 1888 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 243: -#line 1879 "asn1p_y.y" +case 245: +#line 1896 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 244: -#line 1886 "asn1p_y.y" +case 246: +#line 1903 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 245: -#line 1893 "asn1p_y.y" +case 247: +#line 1910 "asn1p_y.y" { memset(&yyval.tv_nametag, 0, sizeof(yyval.tv_nametag)); yyval.tv_nametag.name = yyvsp[0].tv_str; ; break;} -case 246: -#line 1897 "asn1p_y.y" +case 248: +#line 1914 "asn1p_y.y" { yyval.tv_nametag.name = yyvsp[-1].tv_str; yyval.tv_nametag.tag = yyvsp[0].a_tag; @@ -3404,7 +3416,7 @@ case 246: } return 1; } -#line 1904 "asn1p_y.y" +#line 1921 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index 452086f56..a77b5fd62 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -220,7 +220,7 @@ static asn1p_value_t * %type ExportsElement %type DataTypeMember %type ExtensionAndException -%type TypeDeclaration +%type UnconstrainedTypeDeclaration %type ComplexTypeReference %type ComplexTypeReferenceAmpList %type ComplexTypeReferenceElement @@ -239,6 +239,7 @@ static asn1p_value_t * %type DefinedValue %type SignedNumber %type ConstructedType +%type ConstructedTypeConstrained %type ConstructedDataTypeDefinition //%type optUniverationDefinition %type UniverationDefinition @@ -265,6 +266,7 @@ static asn1p_value_t * %type Tag /* [UNIVERSAL 0] IMPLICIT */ %type optTag /* [UNIVERSAL 0] IMPLICIT */ %type optConstraints +%type Constraints %type SetOfConstraints %type ElementSetSpecs /* 1..2,...,3 */ %type ElementSetSpec /* 1..2,...,3 */ @@ -804,7 +806,7 @@ ActualParameterList: ; ActualParameter: - TypeDeclaration { + UnconstrainedTypeDeclaration { $$ = $1; } | Identifier { @@ -960,11 +962,21 @@ DataTypeMember: ; ConstrainedTypeDeclaration: - TypeDeclaration optConstraints optMarker { + UnconstrainedTypeDeclaration optConstraints optMarker { $$ = $1; - $$->constraints = $2; + if($$->constraints) { + assert(!$2); + } else { + $$->constraints = $2; + } $$->marker = $3; } + | ConstructedTypeConstrained { + /* This type includes constraints on its own */ + $$ = $1; + checkmem($$); + assert($$->meta_type); + } ; ExtensionAndException: @@ -996,7 +1008,7 @@ ExtensionAndException: } ; -TypeDeclaration: +UnconstrainedTypeDeclaration: BasicType { $$ = $1; } @@ -1319,6 +1331,26 @@ BasicString: | TOK_ObjectDescriptor { $$ = ASN_STRING_ObjectDescriptor; } ; + +ConstructedTypeConstrained: + TOK_SEQUENCE optConstraints TOK_OF ConstrainedTypeDeclaration { + $$ = asn1p_expr_new(asn1p_lineno); + checkmem($$); + $$->constraints = $2; + $$->expr_type = ASN_CONSTR_SEQUENCE_OF; + $$->meta_type = AMT_TYPE; + TQ_ADD(&($$->members), $4, next); + } + | TOK_SET optConstraints TOK_OF ConstrainedTypeDeclaration { + $$ = asn1p_expr_new(asn1p_lineno); + checkmem($$); + $$->constraints = $2; + $$->expr_type = ASN_CONSTR_SET_OF; + $$->meta_type = AMT_TYPE; + TQ_ADD(&($$->members), $4, next); + } + ; + ConstructedType: TOK_CHOICE '{' ConstructedDataTypeDefinition '}' { $$ = $3; @@ -1338,22 +1370,6 @@ ConstructedType: $$->expr_type = ASN_CONSTR_SET; $$->meta_type = AMT_TYPE; } - | TOK_SEQUENCE optConstraints TOK_OF TypeDeclaration { - $$ = asn1p_expr_new(asn1p_lineno); - checkmem($$); - $$->constraints = $2; - $$->expr_type = ASN_CONSTR_SEQUENCE_OF; - $$->meta_type = AMT_TYPE; - TQ_ADD(&($$->members), $4, next); - } - | TOK_SET optConstraints TOK_OF TypeDeclaration { - $$ = asn1p_expr_new(asn1p_lineno); - checkmem($$); - $$->constraints = $2; - $$->expr_type = ASN_CONSTR_SET_OF; - $$->meta_type = AMT_TYPE; - TQ_ADD(&($$->members), $4, next); - } | TOK_ANY { $$ = asn1p_expr_new(asn1p_lineno); checkmem($$); @@ -1382,7 +1398,13 @@ Except: TOK_EXCEPT; optConstraints: { $$ = 0; } - | SetOfConstraints { + | Constraints { + $$ = $1; + } + ; + +Constraints: + SetOfConstraints { CONSTRAINT_INSERT($$, ACT_CA_SET, $1, 0); } | TOK_SIZE '(' ElementSetSpecs ')' { @@ -1390,12 +1412,7 @@ optConstraints: * This is a special case, for compatibility purposes. * It goes without parentheses. */ - int ret; - $$ = asn1p_constraint_new(yylineno); - checkmem($$); - $$->type = ACT_CT_SIZE; - ret = asn1p_constraint_insert($$, $3); - checkmem(ret == 0); + CONSTRAINT_INSERT($$, ACT_CT_SIZE, $3, 0); } ; From d8d90352700518952d5b535785d7093d07e46a4b Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 20 Aug 2004 13:25:56 +0000 Subject: [PATCH 0168/1469] effective constraint type for walking past SIZE() or FROM() nodes git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@168 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix.c | 19 +++++++++++++-- libasn1fix/asn1fix.h | 3 ++- libasn1fix/asn1fix_constraint.c | 41 +++++++++++++++++++++++++-------- libasn1fix/asn1fix_constraint.h | 4 +++- 4 files changed, 54 insertions(+), 13 deletions(-) diff --git a/libasn1fix/asn1fix.c b/libasn1fix/asn1fix.c index dd0d5e73b..2a78aa131 100644 --- a/libasn1fix/asn1fix.c +++ b/libasn1fix/asn1fix.c @@ -54,6 +54,16 @@ asn1f_process(asn1p_t *asn, enum asn1f_flags flags, flags &= ~A1F_DEBUG; } + /* Allow SIZE() constraint for INTEGER and other types */ + if(flags & A1F_EXTENDED_SizeConstraint) { + arg.flags |= A1F_EXTENDED_SizeConstraint; + flags &= ~A1F_EXTENDED_SizeConstraint; + if(arg.debug) { + arg.debug(-1, + "Extended SizeConstraint support enabled"); + } + } + a1f_replace_me_with_proper_interface_arg = arg; /* @@ -273,16 +283,21 @@ asn1f_fix_constructed(arg_t *arg) { static int asn1f_fix_constraints(arg_t *arg) { asn1p_expr_t *top_parent; + asn1p_expr_type_e etype; int rvalue = 0; int ret; - ret = asn1constraint_resolve(arg, arg->expr->constraints); + top_parent = asn1f_find_terminal_type(arg, arg->expr, NULL); + if(top_parent) + etype = top_parent->expr_type; + else etype = A1TC_INVALID; + + ret = asn1constraint_resolve(arg, arg->expr->constraints, etype, 0); RET2RVAL(ret, rvalue); ret = asn1constraint_pullup(arg); RET2RVAL(ret, rvalue); - top_parent = asn1f_find_terminal_type(arg, arg->expr, NULL); if(top_parent) { static enum asn1p_constraint_type_e test_types[] = { ACT_EL_RANGE, ACT_CT_SIZE, ACT_CT_FROM }; diff --git a/libasn1fix/asn1fix.h b/libasn1fix/asn1fix.h index 1bed8581b..c75c81cf4 100644 --- a/libasn1fix/asn1fix.h +++ b/libasn1fix/asn1fix.h @@ -12,7 +12,8 @@ */ enum asn1f_flags { A1F_NOFLAGS, - A1F_DEBUG = 0x01, /* Print debugging output */ + A1F_DEBUG = 0x01, /* Print debugging output */ + A1F_EXTENDED_SizeConstraint = 0x02, /* Enable constraint gen code */ }; /* diff --git a/libasn1fix/asn1fix_constraint.c b/libasn1fix/asn1fix_constraint.c index b7b66c44a..4620ec52f 100644 --- a/libasn1fix/asn1fix_constraint.c +++ b/libasn1fix/asn1fix_constraint.c @@ -120,8 +120,7 @@ asn1constraint_pullup(arg_t *arg) { } int -asn1constraint_resolve(arg_t *arg, asn1p_constraint_t *ct) { - asn1p_expr_t *top_parent; +asn1constraint_resolve(arg_t *arg, asn1p_constraint_t *ct, asn1p_expr_type_e etype, enum asn1p_constraint_type_e effective_type) { int rvalue = 0; int ret; int el; @@ -130,6 +129,18 @@ asn1constraint_resolve(arg_t *arg, asn1p_constraint_t *ct) { /* Don't touch information object classes */ switch(ct->type) { + case ACT_CT_SIZE: + case ACT_CT_FROM: + if(effective_type && effective_type != ct->type) { + FATAL("%s at line %d: " + "Incompatible nested %s within %s", + arg->expr->Identifier, ct->_lineno, + asn1p_constraint_type2str(ct->type), + asn1p_constraint_type2str(effective_type) + ); + } + effective_type = ct->type; + break; case ACT_CT_WCOMP: case ACT_CT_WCOMPS: case ACT_CA_CRC: @@ -138,21 +149,26 @@ asn1constraint_resolve(arg_t *arg, asn1p_constraint_t *ct) { break; } - top_parent = asn1f_find_terminal_type(arg, arg->expr, 0); - if(top_parent) { - ret = asn1constraint_compatible(top_parent->expr_type, - ct->type); + if(etype != A1TC_INVALID) { + enum asn1p_constraint_type_e check_type; + + check_type = effective_type ? effective_type : ct->type; + + ret = asn1constraint_compatible(etype, check_type); switch(ret) { case -1: /* If unknown, assume OK. */ case 1: break; case 0: + if(effective_type == ACT_CT_SIZE + && (arg->flags & A1F_EXTENDED_SizeConstraint)) + break; default: FATAL("%s at line %d: " "Constraint type %s is not applicable to %s", arg->expr->Identifier, ct->_lineno, - asn1p_constraint_type2str(ct->type), - ASN_EXPR_TYPE2STR(top_parent->expr_type) + asn1p_constraint_type2str(check_type), + ASN_EXPR_TYPE2STR(etype) ); rvalue = -1; break; @@ -163,6 +179,9 @@ asn1constraint_resolve(arg_t *arg, asn1p_constraint_t *ct) { arg->expr->Identifier, arg->expr->_lineno); } + /* + * Resolve all possible references, wherever they occur. + */ if(ct->value && ct->value->type == ATV_REFERENCED) { ret = _constraint_value_resolve(arg, &ct->value); RET2RVAL(ret, rvalue); @@ -176,8 +195,12 @@ asn1constraint_resolve(arg_t *arg, asn1p_constraint_t *ct) { RET2RVAL(ret, rvalue); } + /* + * Proceed recursively. + */ for(el = 0; el < ct->el_count; el++) { - ret = asn1constraint_resolve(arg, ct->elements[el]); + ret = asn1constraint_resolve(arg, ct->elements[el], + etype, effective_type); RET2RVAL(ret, rvalue); } diff --git a/libasn1fix/asn1fix_constraint.h b/libasn1fix/asn1fix_constraint.h index a04e6a507..9e692efab 100644 --- a/libasn1fix/asn1fix_constraint.h +++ b/libasn1fix/asn1fix_constraint.h @@ -4,7 +4,9 @@ /* * Resolve referenced values inside constraints. */ -int asn1constraint_resolve(arg_t *arg, asn1p_constraint_t *ct); +int asn1constraint_resolve(arg_t *arg, asn1p_constraint_t *ct, + asn1p_expr_type_e topmost_parent_expression_type, + enum asn1p_constraint_type_e effective_constraint_type); /* * Collect all subtype constraints from all parents of this type and From 21e4600d0f9943be9969e089de5f637cc5ddfca9 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 20 Aug 2004 13:36:32 +0000 Subject: [PATCH 0169/1469] new meaning of life git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@169 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/19-param-OK.asn1 | 3 +- tests/39-sequence-of-OK.asn1.-P | 118 ++-- tests/42-real-life-OK.asn1 | 6 +- tests/42-real-life-OK.asn1.-EF | 6 +- tests/42-real-life-OK.asn1.-PR | 650 +++++++++++------- tests/44-choice-in-sequence-OK.asn1.-P | 364 +++++----- tests/46-redefine-OK.asn1.-PR | 153 +++-- tests/47-set-ext-OK.asn1.-P | 68 +- tests/50-constraint-OK.asn1 | 4 + ...50-constraint-OK.asn1.-EFprint-constraints | Bin 2967 -> 3624 bytes 10 files changed, 766 insertions(+), 606 deletions(-) diff --git a/tests/19-param-OK.asn1 b/tests/19-param-OK.asn1 index 37d7c448e..cd132d22d 100644 --- a/tests/19-param-OK.asn1 +++ b/tests/19-param-OK.asn1 @@ -25,6 +25,7 @@ BEGIN Name ::= SEQUENCE OF RelativeDistinguishedName - RelativeDistinguishedName ::= SET SIZE (1..MAX) OF IA5String + RelativeDistinguishedName ::= SET SIZE (1..MAX) OF + IA5String (FROM("A".."Z"|"a".."z"|"0-9"|",-.")) END diff --git a/tests/39-sequence-of-OK.asn1.-P b/tests/39-sequence-of-OK.asn1.-P index 383cafc4b..6a8553b9a 100644 --- a/tests/39-sequence-of-OK.asn1.-P +++ b/tests/39-sequence-of-OK.asn1.-P @@ -29,46 +29,54 @@ typedef struct T { /*** <<< STAT-DEFS [T] >>> ***/ - static asn1_SET_OF_element_t asn1_DEF_collection_elements[] = { - { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), - (void *)&asn1_DEF_T2 }, - }; - static ber_tlv_tag_t asn1_DEF_collection_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) - }; - static asn1_SET_OF_specifics_t asn1_DEF_collection_specs = { - sizeof(struct collection), - offsetof(struct collection, _ber_dec_ctx), - asn1_DEF_collection_elements - }; - asn1_TYPE_descriptor_t asn1_DEF_collection = { - "collection", - SEQUENCE_OF_constraint, - SEQUENCE_OF_decode_ber, - SEQUENCE_OF_encode_der, - SEQUENCE_OF_print, - SEQUENCE_OF_free, - 0, /* Use generic outmost tag fetcher */ - asn1_DEF_collection_tags, - sizeof(asn1_DEF_collection_tags) - /sizeof(asn1_DEF_collection_tags[0]), /* 1 */ - 1, /* Tags to skip */ - 1, /* Whether CONSTRUCTED */ - &asn1_DEF_collection_specs /* Additional specs */ - }; - -static asn1_SEQUENCE_element_t asn1_DEF_T_elements[] = { - { offsetof(struct T, int), 0, - (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), - 0, - (void *)&asn1_DEF_INTEGER, - "int" +static asn1_TYPE_member_t asn1_MBR_collection[] = { + { 0, 0, + .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_T2, + .memb_constraints = 0, /* Defer to actual type */ + .name = "" }, - { offsetof(struct T, collection), 0, - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), - 0, - (void *)&asn1_DEF_collection, - "collection" +}; +static ber_tlv_tag_t asn1_DEF_collection_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_SET_OF_specifics_t asn1_DEF_collection_specs = { + sizeof(struct collection), + offsetof(struct collection, _ber_dec_ctx), +}; +asn1_TYPE_descriptor_t asn1_DEF_collection = { + "collection", + SEQUENCE_OF_constraint, + SEQUENCE_OF_decode_ber, + SEQUENCE_OF_encode_der, + SEQUENCE_OF_print, + SEQUENCE_OF_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_collection_tags, + sizeof(asn1_DEF_collection_tags) + /sizeof(asn1_DEF_collection_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_collection, + 1, /* Single element */ + &asn1_DEF_collection_specs /* Additional specs */ +}; + +static asn1_TYPE_member_t asn1_MBR_T[] = { + { 0, offsetof(struct T, int), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_INTEGER, + .memb_constraints = 0, /* Defer to actual type */ + .name = "int" + }, + { 0, offsetof(struct T, collection), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_collection, + .memb_constraints = 0, /* Defer to actual type */ + .name = "collection" }, }; static ber_tlv_tag_t asn1_DEF_T_tags[] = { @@ -81,8 +89,6 @@ static asn1_TYPE_tag2member_t asn1_DEF_T_tag2el[] = { static asn1_SEQUENCE_specifics_t asn1_DEF_T_specs = { sizeof(struct T), offsetof(struct T, _ber_dec_ctx), - asn1_DEF_T_elements, - 2, /* Elements count */ asn1_DEF_T_tag2el, 2, /* Count of tags in the map */ -1, /* Start extensions */ @@ -101,6 +107,8 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { /sizeof(asn1_DEF_T_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ + asn1_MBR_T, + 2, /* Elements count */ &asn1_DEF_T_specs /* Additional specs */ }; @@ -128,18 +136,20 @@ typedef struct T2 { /*** <<< STAT-DEFS [T2] >>> ***/ -static asn1_SEQUENCE_element_t asn1_DEF_T2_elements[] = { - { offsetof(struct T2, flag), 0, - (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), - 0, - (void *)&asn1_DEF_BOOLEAN, - "flag" +static asn1_TYPE_member_t asn1_MBR_T2[] = { + { 0, offsetof(struct T2, flag), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_BOOLEAN, + .memb_constraints = 0, /* Defer to actual type */ + .name = "flag" }, - { offsetof(struct T2, str), 0, - (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), - 0, - (void *)&asn1_DEF_UTF8String, - "str" + { 0, offsetof(struct T2, str), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_UTF8String, + .memb_constraints = 0, /* Defer to actual type */ + .name = "str" }, }; static ber_tlv_tag_t asn1_DEF_T2_tags[] = { @@ -152,8 +162,6 @@ static asn1_TYPE_tag2member_t asn1_DEF_T2_tag2el[] = { static asn1_SEQUENCE_specifics_t asn1_DEF_T2_specs = { sizeof(struct T2), offsetof(struct T2, _ber_dec_ctx), - asn1_DEF_T2_elements, - 2, /* Elements count */ asn1_DEF_T2_tag2el, 2, /* Count of tags in the map */ -1, /* Start extensions */ @@ -172,6 +180,8 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ + asn1_MBR_T2, + 2, /* Elements count */ &asn1_DEF_T2_specs /* Additional specs */ }; diff --git a/tests/42-real-life-OK.asn1 b/tests/42-real-life-OK.asn1 index 33802c211..8c1d59e1c 100644 --- a/tests/42-real-life-OK.asn1 +++ b/tests/42-real-life-OK.asn1 @@ -21,7 +21,7 @@ BEGIN */ LogLine ::= SEQUENCE { line-digest IA5String, -- Log line normal form - varsets SEQUENCE (1..MAX) OF VariablePartSet + varsets SEQUENCE SIZE(1..MAX) OF VariablePartSet } /* @@ -30,7 +30,7 @@ BEGIN * or a range between two samples. */ VariablePartSet ::= SEQUENCE { - vparts SEQUENCE (0..MAX) OF VariablePart, -- {123,321} + vparts SEQUENCE SIZE(0..MAX) OF VariablePart, -- {123,321} resolution ActionItem } @@ -39,7 +39,7 @@ BEGIN */ VariablePart ::= CHOICE { -- A set of acceptable values - vset SET (1..MAX) OF VisibleString, + vset SET SIZE(1..MAX) OF VisibleString, -- A range of acceptable values vrange SEQUENCE { from VisibleString, diff --git a/tests/42-real-life-OK.asn1.-EF b/tests/42-real-life-OK.asn1.-EF index 7b3a89da0..14492fa8d 100644 --- a/tests/42-real-life-OK.asn1.-EF +++ b/tests/42-real-life-OK.asn1.-EF @@ -7,18 +7,18 @@ BEGIN LogLine ::= SEQUENCE { line-digest IA5String, - varsets SEQUENCE OF VariablePartSet, + varsets SEQUENCE SIZE(1..MAX) OF VariablePartSet, ... } VariablePartSet ::= SEQUENCE { - vparts SEQUENCE OF VariablePart, + vparts SEQUENCE SIZE(0..MAX) OF VariablePart, resolution ActionItem, ... } VariablePart ::= CHOICE { - vset SET OF VisibleString, + vset SET SIZE(1..MAX) OF VisibleString, vrange SEQUENCE { from VisibleString, to VisibleString, diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index ece1127a3..2bd4579e7 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -31,48 +31,86 @@ typedef struct LogLine { ber_dec_ctx_t _ber_dec_ctx; } LogLine_t; -/*** <<< STAT-DEFS [LogLine] >>> ***/ +/*** <<< CODE [LogLine] >>> ***/ - static asn1_SET_OF_element_t asn1_DEF_varsets_elements[] = { - { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), - (void *)&asn1_DEF_VariablePartSet }, - }; - static ber_tlv_tag_t asn1_DEF_varsets_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) - }; - static asn1_SET_OF_specifics_t asn1_DEF_varsets_specs = { - sizeof(struct varsets), - offsetof(struct varsets, _ber_dec_ctx), - asn1_DEF_varsets_elements - }; - asn1_TYPE_descriptor_t asn1_DEF_varsets = { - "varsets", - SEQUENCE_OF_constraint, - SEQUENCE_OF_decode_ber, - SEQUENCE_OF_encode_der, - SEQUENCE_OF_print, - SEQUENCE_OF_free, - 0, /* Use generic outmost tag fetcher */ - asn1_DEF_varsets_tags, - sizeof(asn1_DEF_varsets_tags) - /sizeof(asn1_DEF_varsets_tags[0]), /* 1 */ - 1, /* Tags to skip */ - 1, /* Whether CONSTRUCTED */ - &asn1_DEF_varsets_specs /* Additional specs */ - }; +static int +memb_varsets_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + size_t size; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); + return -1; + } -static asn1_SEQUENCE_element_t asn1_DEF_LogLine_elements[] = { - { offsetof(struct LogLine, line_digest), 0, - (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), - 0, - (void *)&asn1_DEF_IA5String, - "line-digest" + { /* Determine the number of elements */ + const A_SEQUENCE_OF(void) *list; + (const void *)list = sptr; + size = list->count; + } + + if((size >= 1)) { + /* Constraint check succeeded */ + return 1; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed", td->name); + return -1; + } +} + + +/*** <<< STAT-DEFS [LogLine] >>> ***/ + +static asn1_TYPE_member_t asn1_MBR_varsets[] = { + { 0, 0, + .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_VariablePartSet, + .memb_constraints = 0, /* Defer to actual type */ + .name = "" + }, +}; +static ber_tlv_tag_t asn1_DEF_varsets_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_SET_OF_specifics_t asn1_DEF_varsets_specs = { + sizeof(struct varsets), + offsetof(struct varsets, _ber_dec_ctx), +}; +asn1_TYPE_descriptor_t asn1_DEF_varsets = { + "varsets", + SEQUENCE_OF_constraint, + SEQUENCE_OF_decode_ber, + SEQUENCE_OF_encode_der, + SEQUENCE_OF_print, + SEQUENCE_OF_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_varsets_tags, + sizeof(asn1_DEF_varsets_tags) + /sizeof(asn1_DEF_varsets_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_varsets, + 1, /* Single element */ + &asn1_DEF_varsets_specs /* Additional specs */ +}; + +static asn1_TYPE_member_t asn1_MBR_LogLine[] = { + { 0, offsetof(struct LogLine, line_digest), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_IA5String, + .memb_constraints = 0, /* Defer to actual type */ + .name = "line-digest" }, - { offsetof(struct LogLine, varsets), 0, - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), - 0, - (void *)&asn1_DEF_varsets, - "varsets" + { 0, offsetof(struct LogLine, varsets), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_varsets, + .memb_constraints = memb_varsets_constraint, + .name = "varsets" }, }; static ber_tlv_tag_t asn1_DEF_LogLine_tags[] = { @@ -85,8 +123,6 @@ static asn1_TYPE_tag2member_t asn1_DEF_LogLine_tag2el[] = { static asn1_SEQUENCE_specifics_t asn1_DEF_LogLine_specs = { sizeof(struct LogLine), offsetof(struct LogLine, _ber_dec_ctx), - asn1_DEF_LogLine_elements, - 2, /* Elements count */ asn1_DEF_LogLine_tag2el, 2, /* Count of tags in the map */ 1, /* Start extensions */ @@ -105,6 +141,8 @@ asn1_TYPE_descriptor_t asn1_DEF_LogLine = { /sizeof(asn1_DEF_LogLine_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ + asn1_MBR_LogLine, + 2, /* Elements count */ &asn1_DEF_LogLine_specs /* Additional specs */ }; @@ -141,48 +179,78 @@ typedef struct VariablePartSet { ber_dec_ctx_t _ber_dec_ctx; } VariablePartSet_t; -/*** <<< STAT-DEFS [VariablePartSet] >>> ***/ +/*** <<< CODE [VariablePartSet] >>> ***/ - static asn1_SET_OF_element_t asn1_DEF_vparts_elements[] = { - { -1 /* Ambiguous tag (CHOICE?) */, - (void *)&asn1_DEF_VariablePart }, - }; - static ber_tlv_tag_t asn1_DEF_vparts_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) - }; - static asn1_SET_OF_specifics_t asn1_DEF_vparts_specs = { - sizeof(struct vparts), - offsetof(struct vparts, _ber_dec_ctx), - asn1_DEF_vparts_elements - }; - asn1_TYPE_descriptor_t asn1_DEF_vparts = { - "vparts", - SEQUENCE_OF_constraint, - SEQUENCE_OF_decode_ber, - SEQUENCE_OF_encode_der, - SEQUENCE_OF_print, - SEQUENCE_OF_free, - 0, /* Use generic outmost tag fetcher */ - asn1_DEF_vparts_tags, - sizeof(asn1_DEF_vparts_tags) - /sizeof(asn1_DEF_vparts_tags[0]), /* 1 */ - 1, /* Tags to skip */ - 1, /* Whether CONSTRUCTED */ - &asn1_DEF_vparts_specs /* Additional specs */ - }; +static int +memb_vparts_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } -static asn1_SEQUENCE_element_t asn1_DEF_VariablePartSet_elements[] = { - { offsetof(struct VariablePartSet, vparts), 0, - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), - 0, - (void *)&asn1_DEF_vparts, - "vparts" + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + + +/*** <<< STAT-DEFS [VariablePartSet] >>> ***/ + +static asn1_TYPE_member_t asn1_MBR_vparts[] = { + { 0, 0, + .tag = -1 /* Ambiguous tag (CHOICE?) */, + .tag_mode = 0, + .type = (void *)&asn1_DEF_VariablePart, + .memb_constraints = 0, /* Defer to actual type */ + .name = "" }, - { offsetof(struct VariablePartSet, resolution), 0, - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), - 0, - (void *)&asn1_DEF_ActionItem, - "resolution" +}; +static ber_tlv_tag_t asn1_DEF_vparts_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_SET_OF_specifics_t asn1_DEF_vparts_specs = { + sizeof(struct vparts), + offsetof(struct vparts, _ber_dec_ctx), +}; +asn1_TYPE_descriptor_t asn1_DEF_vparts = { + "vparts", + SEQUENCE_OF_constraint, + SEQUENCE_OF_decode_ber, + SEQUENCE_OF_encode_der, + SEQUENCE_OF_print, + SEQUENCE_OF_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_vparts_tags, + sizeof(asn1_DEF_vparts_tags) + /sizeof(asn1_DEF_vparts_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_vparts, + 1, /* Single element */ + &asn1_DEF_vparts_specs /* Additional specs */ +}; + +static asn1_TYPE_member_t asn1_MBR_VariablePartSet[] = { + { 0, offsetof(struct VariablePartSet, vparts), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_vparts, + .memb_constraints = memb_vparts_constraint, + .name = "vparts" + }, + { 0, offsetof(struct VariablePartSet, resolution), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_ActionItem, + .memb_constraints = 0, /* Defer to actual type */ + .name = "resolution" }, }; static ber_tlv_tag_t asn1_DEF_VariablePartSet_tags[] = { @@ -195,8 +263,6 @@ static asn1_TYPE_tag2member_t asn1_DEF_VariablePartSet_tag2el[] = { static asn1_SEQUENCE_specifics_t asn1_DEF_VariablePartSet_specs = { sizeof(struct VariablePartSet), offsetof(struct VariablePartSet, _ber_dec_ctx), - asn1_DEF_VariablePartSet_elements, - 2, /* Elements count */ asn1_DEF_VariablePartSet_tag2el, 2, /* Count of tags in the map */ 1, /* Start extensions */ @@ -215,6 +281,8 @@ asn1_TYPE_descriptor_t asn1_DEF_VariablePartSet = { /sizeof(asn1_DEF_VariablePartSet_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ + asn1_MBR_VariablePartSet, + 2, /* Elements count */ &asn1_DEF_VariablePartSet_specs /* Additional specs */ }; @@ -270,95 +338,135 @@ typedef struct VariablePart { ber_dec_ctx_t _ber_dec_ctx; } VariablePart_t; +/*** <<< CODE [VariablePart] >>> ***/ + +static int +memb_vset_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + size_t size; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); + return -1; + } + + { /* Determine the number of elements */ + const A_SET_OF(void) *list; + (const void *)list = sptr; + size = list->count; + } + + if((size >= 1)) { + /* Constraint check succeeded */ + return 1; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed", td->name); + return -1; + } +} + + /*** <<< STAT-DEFS [VariablePart] >>> ***/ - static asn1_SET_OF_element_t asn1_DEF_vset_elements[] = { - { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), - (void *)&asn1_DEF_VisibleString }, - }; - static ber_tlv_tag_t asn1_DEF_vset_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) - }; - static asn1_SET_OF_specifics_t asn1_DEF_vset_specs = { - sizeof(struct vset), - offsetof(struct vset, _ber_dec_ctx), - asn1_DEF_vset_elements - }; - asn1_TYPE_descriptor_t asn1_DEF_vset = { - "vset", - SET_OF_constraint, - SET_OF_decode_ber, - SET_OF_encode_der, - SET_OF_print, - SET_OF_free, - 0, /* Use generic outmost tag fetcher */ - asn1_DEF_vset_tags, - sizeof(asn1_DEF_vset_tags) - /sizeof(asn1_DEF_vset_tags[0]), /* 1 */ - 1, /* Tags to skip */ - 1, /* Whether CONSTRUCTED */ - &asn1_DEF_vset_specs /* Additional specs */ - }; - - static asn1_SEQUENCE_element_t asn1_DEF_vrange_elements[] = { - { offsetof(struct vrange, from), 0, - (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), - 0, - (void *)&asn1_DEF_VisibleString, - "from" - }, - { offsetof(struct vrange, to), 0, - (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), - 0, - (void *)&asn1_DEF_VisibleString, - "to" - }, - }; - static ber_tlv_tag_t asn1_DEF_vrange_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) - }; - static asn1_TYPE_tag2member_t asn1_DEF_vrange_tag2el[] = { - { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), 0, 0, 1 }, /* from at 45 */ - { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), 1, -1, 0 }, /* to at 46 */ - }; - static asn1_SEQUENCE_specifics_t asn1_DEF_vrange_specs = { - sizeof(struct vrange), - offsetof(struct vrange, _ber_dec_ctx), - asn1_DEF_vrange_elements, - 2, /* Elements count */ - asn1_DEF_vrange_tag2el, - 2, /* Count of tags in the map */ - 1, /* Start extensions */ - 3 /* Stop extensions */ - }; - asn1_TYPE_descriptor_t asn1_DEF_vrange = { - "vrange", - SEQUENCE_constraint, - SEQUENCE_decode_ber, - SEQUENCE_encode_der, - SEQUENCE_print, - SEQUENCE_free, - 0, /* Use generic outmost tag fetcher */ - asn1_DEF_vrange_tags, - sizeof(asn1_DEF_vrange_tags) - /sizeof(asn1_DEF_vrange_tags[0]), /* 1 */ - 1, /* Tags to skip */ - 1, /* Whether CONSTRUCTED */ - &asn1_DEF_vrange_specs /* Additional specs */ - }; - -static asn1_CHOICE_element_t asn1_DEF_VariablePart_elements[] = { - { offsetof(struct VariablePart, choice.vset), 0, - (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), - 0, - (void *)&asn1_DEF_vset, - "vset" +static asn1_TYPE_member_t asn1_MBR_vset[] = { + { 0, 0, + .tag = (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_VisibleString, + .memb_constraints = 0, /* Defer to actual type */ + .name = "" + }, +}; +static ber_tlv_tag_t asn1_DEF_vset_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) +}; +static asn1_SET_OF_specifics_t asn1_DEF_vset_specs = { + sizeof(struct vset), + offsetof(struct vset, _ber_dec_ctx), +}; +asn1_TYPE_descriptor_t asn1_DEF_vset = { + "vset", + SET_OF_constraint, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_print, + SET_OF_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_vset_tags, + sizeof(asn1_DEF_vset_tags) + /sizeof(asn1_DEF_vset_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_vset, + 1, /* Single element */ + &asn1_DEF_vset_specs /* Additional specs */ +}; + +static asn1_TYPE_member_t asn1_MBR_vrange[] = { + { 0, offsetof(struct vrange, from), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_VisibleString, + .memb_constraints = 0, /* Defer to actual type */ + .name = "from" }, - { offsetof(struct VariablePart, choice.vrange), 0, - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), - 0, - (void *)&asn1_DEF_vrange, - "vrange" + { 0, offsetof(struct vrange, to), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_VisibleString, + .memb_constraints = 0, /* Defer to actual type */ + .name = "to" + }, +}; +static ber_tlv_tag_t asn1_DEF_vrange_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_TYPE_tag2member_t asn1_DEF_vrange_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), 0, 0, 1 }, /* from at 45 */ + { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), 1, -1, 0 }, /* to at 46 */ +}; +static asn1_SEQUENCE_specifics_t asn1_DEF_vrange_specs = { + sizeof(struct vrange), + offsetof(struct vrange, _ber_dec_ctx), + asn1_DEF_vrange_tag2el, + 2, /* Count of tags in the map */ + 1, /* Start extensions */ + 3 /* Stop extensions */ +}; +asn1_TYPE_descriptor_t asn1_DEF_vrange = { + "vrange", + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_print, + SEQUENCE_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_vrange_tags, + sizeof(asn1_DEF_vrange_tags) + /sizeof(asn1_DEF_vrange_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_vrange, + 2, /* Elements count */ + &asn1_DEF_vrange_specs /* Additional specs */ +}; + +static asn1_TYPE_member_t asn1_MBR_VariablePart[] = { + { 0, offsetof(struct VariablePart, choice.vset), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_vset, + .memb_constraints = memb_vset_constraint, + .name = "vset" + }, + { 0, offsetof(struct VariablePart, choice.vrange), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_vrange, + .memb_constraints = 0, /* Defer to actual type */ + .name = "vrange" }, }; static asn1_TYPE_tag2member_t asn1_DEF_VariablePart_tag2el[] = { @@ -370,8 +478,6 @@ static asn1_CHOICE_specifics_t asn1_DEF_VariablePart_specs = { offsetof(struct VariablePart, _ber_dec_ctx), offsetof(struct VariablePart, present), sizeof(((struct VariablePart *)0)->present), - asn1_DEF_VariablePart_elements, - 2, /* Elements count */ asn1_DEF_VariablePart_tag2el, 2, /* Count of tags in the map */ 1 /* Whether extensible */ @@ -388,6 +494,8 @@ asn1_TYPE_descriptor_t asn1_DEF_VariablePart = { 0, /* No explicit tags (count) */ 0, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ + asn1_MBR_VariablePart, + 2, /* Elements count */ &asn1_DEF_VariablePart_specs /* Additional specs */ }; @@ -403,14 +511,14 @@ asn1_TYPE_descriptor_t asn1_DEF_VariablePart = { /*** <<< DEPS [ActionItem] >>> ***/ - typedef enum accept_as { - accept_as_unknown = 0, - accept_as_safe = 1, - accept_as_unsafe = 2, - /* - * Enumeration is extensible - */ - } accept_as_e; +typedef enum accept_as { + accept_as_unknown = 0, + accept_as_safe = 1, + accept_as_unsafe = 2, + /* + * Enumeration is extensible + */ +} accept_as_e; extern asn1_TYPE_descriptor_t asn1_DEF_ActionItem; /*** <<< TYPE-DECLS [ActionItem] >>> ***/ @@ -445,93 +553,103 @@ typedef struct ActionItem { /*** <<< STAT-DEFS [ActionItem] >>> ***/ - static asn1_SET_OF_element_t asn1_DEF_email_elements[] = { - { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), - (void *)&asn1_DEF_VisibleString }, - }; - static ber_tlv_tag_t asn1_DEF_email_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) - }; - static asn1_SET_OF_specifics_t asn1_DEF_email_specs = { - sizeof(struct email), - offsetof(struct email, _ber_dec_ctx), - asn1_DEF_email_elements - }; - asn1_TYPE_descriptor_t asn1_DEF_email = { - "email", - SET_OF_constraint, - SET_OF_decode_ber, - SET_OF_encode_der, - SET_OF_print, - SET_OF_free, - 0, /* Use generic outmost tag fetcher */ - asn1_DEF_email_tags, - sizeof(asn1_DEF_email_tags) - /sizeof(asn1_DEF_email_tags[0]), /* 1 */ - 1, /* Tags to skip */ - 1, /* Whether CONSTRUCTED */ - &asn1_DEF_email_specs /* Additional specs */ - }; - - static asn1_SEQUENCE_element_t asn1_DEF_notify_elements[] = { - { offsetof(struct notify, critical), 0, - (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), - 0, - (void *)&asn1_DEF_BOOLEAN, - "critical" - }, - { offsetof(struct notify, email), 0, - (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), - 0, - (void *)&asn1_DEF_email, - "email" - }, - }; - static ber_tlv_tag_t asn1_DEF_notify_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) - }; - static asn1_TYPE_tag2member_t asn1_DEF_notify_tag2el[] = { - { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 0, 0, 0 }, /* critical at 61 */ - { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 1, 0, 0 }, /* email at 62 */ - }; - static asn1_SEQUENCE_specifics_t asn1_DEF_notify_specs = { - sizeof(struct notify), - offsetof(struct notify, _ber_dec_ctx), - asn1_DEF_notify_elements, - 2, /* Elements count */ - asn1_DEF_notify_tag2el, - 2, /* Count of tags in the map */ - 1, /* Start extensions */ - 3 /* Stop extensions */ - }; - asn1_TYPE_descriptor_t asn1_DEF_notify = { - "notify", - SEQUENCE_constraint, - SEQUENCE_decode_ber, - SEQUENCE_encode_der, - SEQUENCE_print, - SEQUENCE_free, - 0, /* Use generic outmost tag fetcher */ - asn1_DEF_notify_tags, - sizeof(asn1_DEF_notify_tags) - /sizeof(asn1_DEF_notify_tags[0]), /* 1 */ - 1, /* Tags to skip */ - 1, /* Whether CONSTRUCTED */ - &asn1_DEF_notify_specs /* Additional specs */ - }; - -static asn1_SEQUENCE_element_t asn1_DEF_ActionItem_elements[] = { - { offsetof(struct ActionItem, accept_as), 0, - (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), - 0, - (void *)&asn1_DEF_ENUMERATED, - "accept-as" +static asn1_TYPE_member_t asn1_MBR_email[] = { + { 0, 0, + .tag = (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_VisibleString, + .memb_constraints = 0, /* Defer to actual type */ + .name = "" + }, +}; +static ber_tlv_tag_t asn1_DEF_email_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) +}; +static asn1_SET_OF_specifics_t asn1_DEF_email_specs = { + sizeof(struct email), + offsetof(struct email, _ber_dec_ctx), +}; +asn1_TYPE_descriptor_t asn1_DEF_email = { + "email", + SET_OF_constraint, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_print, + SET_OF_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_email_tags, + sizeof(asn1_DEF_email_tags) + /sizeof(asn1_DEF_email_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_email, + 1, /* Single element */ + &asn1_DEF_email_specs /* Additional specs */ +}; + +static asn1_TYPE_member_t asn1_MBR_notify[] = { + { 0, offsetof(struct notify, critical), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_BOOLEAN, + .memb_constraints = 0, /* Defer to actual type */ + .name = "critical" }, - { offsetof(struct ActionItem, notify), 1, - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), - 0, - (void *)&asn1_DEF_notify, - "notify" + { 0, offsetof(struct notify, email), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_email, + .memb_constraints = 0, /* Defer to actual type */ + .name = "email" + }, +}; +static ber_tlv_tag_t asn1_DEF_notify_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_TYPE_tag2member_t asn1_DEF_notify_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 0, 0, 0 }, /* critical at 61 */ + { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 1, 0, 0 }, /* email at 62 */ +}; +static asn1_SEQUENCE_specifics_t asn1_DEF_notify_specs = { + sizeof(struct notify), + offsetof(struct notify, _ber_dec_ctx), + asn1_DEF_notify_tag2el, + 2, /* Count of tags in the map */ + 1, /* Start extensions */ + 3 /* Stop extensions */ +}; +asn1_TYPE_descriptor_t asn1_DEF_notify = { + "notify", + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_print, + SEQUENCE_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_notify_tags, + sizeof(asn1_DEF_notify_tags) + /sizeof(asn1_DEF_notify_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_notify, + 2, /* Elements count */ + &asn1_DEF_notify_specs /* Additional specs */ +}; + +static asn1_TYPE_member_t asn1_MBR_ActionItem[] = { + { 0, offsetof(struct ActionItem, accept_as), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_ENUMERATED, + .memb_constraints = 0, /* Defer to actual type */ + .name = "accept-as" + }, + { 1, offsetof(struct ActionItem, notify), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_notify, + .memb_constraints = 0, /* Defer to actual type */ + .name = "notify" }, }; static ber_tlv_tag_t asn1_DEF_ActionItem_tags[] = { @@ -544,8 +662,6 @@ static asn1_TYPE_tag2member_t asn1_DEF_ActionItem_tag2el[] = { static asn1_SEQUENCE_specifics_t asn1_DEF_ActionItem_specs = { sizeof(struct ActionItem), offsetof(struct ActionItem, _ber_dec_ctx), - asn1_DEF_ActionItem_elements, - 2, /* Elements count */ asn1_DEF_ActionItem_tag2el, 2, /* Count of tags in the map */ 1, /* Start extensions */ @@ -564,6 +680,8 @@ asn1_TYPE_descriptor_t asn1_DEF_ActionItem = { /sizeof(asn1_DEF_ActionItem_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ + asn1_MBR_ActionItem, + 2, /* Elements count */ &asn1_DEF_ActionItem_specs /* Additional specs */ }; diff --git a/tests/44-choice-in-sequence-OK.asn1.-P b/tests/44-choice-in-sequence-OK.asn1.-P index 0c65871f5..3a12ecfcb 100644 --- a/tests/44-choice-in-sequence-OK.asn1.-P +++ b/tests/44-choice-in-sequence-OK.asn1.-P @@ -7,23 +7,23 @@ /*** <<< DEPS [T] >>> ***/ - typedef enum b_PR { - b_PR_NOTHING, /* No components present */ - b_PR_c, - b_PR_d, - b_PR_e, - b_PR_h, - } b_PR; - typedef enum e_PR { - e_PR_NOTHING, /* No components present */ - e_PR_f, - e_PR_g, - } e_PR; - typedef enum h_PR { - h_PR_NOTHING, /* No components present */ - h_PR_i, - h_PR_j, - } h_PR; +typedef enum b_PR { + b_PR_NOTHING, /* No components present */ + b_PR_c, + b_PR_d, + b_PR_e, + b_PR_h, +} b_PR; +typedef enum e_PR { + e_PR_NOTHING, /* No components present */ + e_PR_f, + e_PR_g, +} e_PR; +typedef enum h_PR { + h_PR_NOTHING, /* No components present */ + h_PR_i, + h_PR_j, +} h_PR; extern asn1_TYPE_descriptor_t asn1_DEF_T; /*** <<< TYPE-DECLS [T] >>> ***/ @@ -68,165 +68,175 @@ typedef struct T { /*** <<< STAT-DEFS [T] >>> ***/ - static asn1_CHOICE_element_t asn1_DEF_e_elements[] = { - { offsetof(struct e, choice.f), 0, - (ASN_TAG_CLASS_PRIVATE | (7 << 2)), - -1, /* IMPLICIT tag at current level */ - (void *)&asn1_DEF_NULL, - "f" - }, - { offsetof(struct e, choice.g), 0, - (ASN_TAG_CLASS_PRIVATE | (8 << 2)), - -1, /* IMPLICIT tag at current level */ - (void *)&asn1_DEF_NULL, - "g" - }, - }; - static asn1_TYPE_tag2member_t asn1_DEF_e_tag2el[] = { - { (ASN_TAG_CLASS_PRIVATE | (7 << 2)), 0, 0, 0 }, /* f at 20 */ - { (ASN_TAG_CLASS_PRIVATE | (8 << 2)), 1, 0, 0 }, /* g at 21 */ - }; - static asn1_CHOICE_specifics_t asn1_DEF_e_specs = { - sizeof(struct e), - offsetof(struct e, _ber_dec_ctx), - offsetof(struct e, present), - sizeof(((struct e *)0)->present), - asn1_DEF_e_elements, - 2, /* Elements count */ - asn1_DEF_e_tag2el, - 2, /* Count of tags in the map */ - 0 /* Whether extensible */ - }; - asn1_TYPE_descriptor_t asn1_DEF_e = { - "e", - CHOICE_constraint, - CHOICE_decode_ber, - CHOICE_encode_der, - CHOICE_print, - CHOICE_free, - CHOICE_outmost_tag, - 0, /* No explicit tags (pointer) */ - 0, /* No explicit tags (count) */ - 0, /* Tags to skip */ - 1, /* Whether CONSTRUCTED */ - &asn1_DEF_e_specs /* Additional specs */ - }; - - static asn1_CHOICE_element_t asn1_DEF_h_elements[] = { - { offsetof(struct h, choice.i), 0, - (ASN_TAG_CLASS_PRIVATE | (1 << 2)), - -1, /* IMPLICIT tag at current level */ - (void *)&asn1_DEF_NULL, - "i" - }, - { offsetof(struct h, choice.j), 0, - (ASN_TAG_CLASS_PRIVATE | (2 << 2)), - -1, /* IMPLICIT tag at current level */ - (void *)&asn1_DEF_NULL, - "j" - }, - }; - static asn1_TYPE_tag2member_t asn1_DEF_h_tag2el[] = { - { (ASN_TAG_CLASS_PRIVATE | (1 << 2)), 0, 0, 0 }, /* i at 24 */ - { (ASN_TAG_CLASS_PRIVATE | (2 << 2)), 1, 0, 0 }, /* j at 25 */ - }; - static asn1_CHOICE_specifics_t asn1_DEF_h_specs = { - sizeof(struct h), - offsetof(struct h, _ber_dec_ctx), - offsetof(struct h, present), - sizeof(((struct h *)0)->present), - asn1_DEF_h_elements, - 2, /* Elements count */ - asn1_DEF_h_tag2el, - 2, /* Count of tags in the map */ - 0 /* Whether extensible */ - }; - asn1_TYPE_descriptor_t asn1_DEF_h = { - "h", - CHOICE_constraint, - CHOICE_decode_ber, - CHOICE_encode_der, - CHOICE_print, - CHOICE_free, - CHOICE_outmost_tag, - 0, /* No explicit tags (pointer) */ - 0, /* No explicit tags (count) */ - 0, /* Tags to skip */ - 1, /* Whether CONSTRUCTED */ - &asn1_DEF_h_specs /* Additional specs */ - }; - - static asn1_CHOICE_element_t asn1_DEF_b_elements[] = { - { offsetof(struct b, choice.c), 0, - (ASN_TAG_CLASS_PRIVATE | (5 << 2)), - -1, /* IMPLICIT tag at current level */ - (void *)&asn1_DEF_NULL, - "c" - }, - { offsetof(struct b, choice.d), 0, - (ASN_TAG_CLASS_PRIVATE | (6 << 2)), - -1, /* IMPLICIT tag at current level */ - (void *)&asn1_DEF_NULL, - "d" - }, - { offsetof(struct b, choice.e), 0, - -1 /* Ambiguous tag (CHOICE?) */, - 0, - (void *)&asn1_DEF_e, - "e" - }, - { offsetof(struct b, choice.h), 0, - (ASN_TAG_CLASS_PRIVATE | (9 << 2)), - +1, /* EXPLICIT tag at current level */ - (void *)&asn1_DEF_h, - "h" - }, - }; - static asn1_TYPE_tag2member_t asn1_DEF_b_tag2el[] = { - { (ASN_TAG_CLASS_PRIVATE | (5 << 2)), 0, 0, 0 }, /* c at 17 */ - { (ASN_TAG_CLASS_PRIVATE | (6 << 2)), 1, 0, 0 }, /* d at 18 */ - { (ASN_TAG_CLASS_PRIVATE | (7 << 2)), 2, 0, 0 }, /* f at 20 */ - { (ASN_TAG_CLASS_PRIVATE | (8 << 2)), 2, 0, 0 }, /* g at 21 */ - { (ASN_TAG_CLASS_PRIVATE | (9 << 2)), 3, 0, 0 }, /* h at 24 */ - }; - static asn1_CHOICE_specifics_t asn1_DEF_b_specs = { - sizeof(struct b), - offsetof(struct b, _ber_dec_ctx), - offsetof(struct b, present), - sizeof(((struct b *)0)->present), - asn1_DEF_b_elements, - 4, /* Elements count */ - asn1_DEF_b_tag2el, - 5, /* Count of tags in the map */ - 0 /* Whether extensible */ - }; - asn1_TYPE_descriptor_t asn1_DEF_b = { - "b", - CHOICE_constraint, - CHOICE_decode_ber, - CHOICE_encode_der, - CHOICE_print, - CHOICE_free, - CHOICE_outmost_tag, - 0, /* No explicit tags (pointer) */ - 0, /* No explicit tags (count) */ - 0, /* Tags to skip */ - 1, /* Whether CONSTRUCTED */ - &asn1_DEF_b_specs /* Additional specs */ - }; - -static asn1_SEQUENCE_element_t asn1_DEF_T_elements[] = { - { offsetof(struct T, a), 0, - (ASN_TAG_CLASS_PRIVATE | (2 << 2)), - -1, /* IMPLICIT tag at current level */ - (void *)&asn1_DEF_NULL, - "a" +static asn1_TYPE_member_t asn1_MBR_e[] = { + { 0, offsetof(struct e, choice.f), + .tag = (ASN_TAG_CLASS_PRIVATE | (7 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn1_DEF_NULL, + .memb_constraints = 0, /* Defer to actual type */ + .name = "f" }, - { offsetof(struct T, b), 0, - -1 /* Ambiguous tag (CHOICE?) */, - 0, - (void *)&asn1_DEF_b, - "b" + { 0, offsetof(struct e, choice.g), + .tag = (ASN_TAG_CLASS_PRIVATE | (8 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn1_DEF_NULL, + .memb_constraints = 0, /* Defer to actual type */ + .name = "g" + }, +}; +static asn1_TYPE_tag2member_t asn1_DEF_e_tag2el[] = { + { (ASN_TAG_CLASS_PRIVATE | (7 << 2)), 0, 0, 0 }, /* f at 20 */ + { (ASN_TAG_CLASS_PRIVATE | (8 << 2)), 1, 0, 0 }, /* g at 21 */ +}; +static asn1_CHOICE_specifics_t asn1_DEF_e_specs = { + sizeof(struct e), + offsetof(struct e, _ber_dec_ctx), + offsetof(struct e, present), + sizeof(((struct e *)0)->present), + asn1_DEF_e_tag2el, + 2, /* Count of tags in the map */ + 0 /* Whether extensible */ +}; +asn1_TYPE_descriptor_t asn1_DEF_e = { + "e", + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_print, + CHOICE_free, + CHOICE_outmost_tag, + 0, /* No explicit tags (pointer) */ + 0, /* No explicit tags (count) */ + 0, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_e, + 2, /* Elements count */ + &asn1_DEF_e_specs /* Additional specs */ +}; + +static asn1_TYPE_member_t asn1_MBR_h[] = { + { 0, offsetof(struct h, choice.i), + .tag = (ASN_TAG_CLASS_PRIVATE | (1 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn1_DEF_NULL, + .memb_constraints = 0, /* Defer to actual type */ + .name = "i" + }, + { 0, offsetof(struct h, choice.j), + .tag = (ASN_TAG_CLASS_PRIVATE | (2 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn1_DEF_NULL, + .memb_constraints = 0, /* Defer to actual type */ + .name = "j" + }, +}; +static asn1_TYPE_tag2member_t asn1_DEF_h_tag2el[] = { + { (ASN_TAG_CLASS_PRIVATE | (1 << 2)), 0, 0, 0 }, /* i at 24 */ + { (ASN_TAG_CLASS_PRIVATE | (2 << 2)), 1, 0, 0 }, /* j at 25 */ +}; +static asn1_CHOICE_specifics_t asn1_DEF_h_specs = { + sizeof(struct h), + offsetof(struct h, _ber_dec_ctx), + offsetof(struct h, present), + sizeof(((struct h *)0)->present), + asn1_DEF_h_tag2el, + 2, /* Count of tags in the map */ + 0 /* Whether extensible */ +}; +asn1_TYPE_descriptor_t asn1_DEF_h = { + "h", + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_print, + CHOICE_free, + CHOICE_outmost_tag, + 0, /* No explicit tags (pointer) */ + 0, /* No explicit tags (count) */ + 0, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_h, + 2, /* Elements count */ + &asn1_DEF_h_specs /* Additional specs */ +}; + +static asn1_TYPE_member_t asn1_MBR_b[] = { + { 0, offsetof(struct b, choice.c), + .tag = (ASN_TAG_CLASS_PRIVATE | (5 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn1_DEF_NULL, + .memb_constraints = 0, /* Defer to actual type */ + .name = "c" + }, + { 0, offsetof(struct b, choice.d), + .tag = (ASN_TAG_CLASS_PRIVATE | (6 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn1_DEF_NULL, + .memb_constraints = 0, /* Defer to actual type */ + .name = "d" + }, + { 0, offsetof(struct b, choice.e), + .tag = -1 /* Ambiguous tag (CHOICE?) */, + .tag_mode = 0, + .type = (void *)&asn1_DEF_e, + .memb_constraints = 0, /* Defer to actual type */ + .name = "e" + }, + { 0, offsetof(struct b, choice.h), + .tag = (ASN_TAG_CLASS_PRIVATE | (9 << 2)), + .tag_mode = +1, /* EXPLICIT tag at current level */ + .type = (void *)&asn1_DEF_h, + .memb_constraints = 0, /* Defer to actual type */ + .name = "h" + }, +}; +static asn1_TYPE_tag2member_t asn1_DEF_b_tag2el[] = { + { (ASN_TAG_CLASS_PRIVATE | (5 << 2)), 0, 0, 0 }, /* c at 17 */ + { (ASN_TAG_CLASS_PRIVATE | (6 << 2)), 1, 0, 0 }, /* d at 18 */ + { (ASN_TAG_CLASS_PRIVATE | (7 << 2)), 2, 0, 0 }, /* f at 20 */ + { (ASN_TAG_CLASS_PRIVATE | (8 << 2)), 2, 0, 0 }, /* g at 21 */ + { (ASN_TAG_CLASS_PRIVATE | (9 << 2)), 3, 0, 0 }, /* h at 24 */ +}; +static asn1_CHOICE_specifics_t asn1_DEF_b_specs = { + sizeof(struct b), + offsetof(struct b, _ber_dec_ctx), + offsetof(struct b, present), + sizeof(((struct b *)0)->present), + asn1_DEF_b_tag2el, + 5, /* Count of tags in the map */ + 0 /* Whether extensible */ +}; +asn1_TYPE_descriptor_t asn1_DEF_b = { + "b", + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_print, + CHOICE_free, + CHOICE_outmost_tag, + 0, /* No explicit tags (pointer) */ + 0, /* No explicit tags (count) */ + 0, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_b, + 4, /* Elements count */ + &asn1_DEF_b_specs /* Additional specs */ +}; + +static asn1_TYPE_member_t asn1_MBR_T[] = { + { 0, offsetof(struct T, a), + .tag = (ASN_TAG_CLASS_PRIVATE | (2 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn1_DEF_NULL, + .memb_constraints = 0, /* Defer to actual type */ + .name = "a" + }, + { 0, offsetof(struct T, b), + .tag = -1 /* Ambiguous tag (CHOICE?) */, + .tag_mode = 0, + .type = (void *)&asn1_DEF_b, + .memb_constraints = 0, /* Defer to actual type */ + .name = "b" }, }; static ber_tlv_tag_t asn1_DEF_T_tags[] = { @@ -243,8 +253,6 @@ static asn1_TYPE_tag2member_t asn1_DEF_T_tag2el[] = { static asn1_SEQUENCE_specifics_t asn1_DEF_T_specs = { sizeof(struct T), offsetof(struct T, _ber_dec_ctx), - asn1_DEF_T_elements, - 2, /* Elements count */ asn1_DEF_T_tag2el, 6, /* Count of tags in the map */ -1, /* Start extensions */ @@ -263,6 +271,8 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { /sizeof(asn1_DEF_T_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ + asn1_MBR_T, + 2, /* Elements count */ &asn1_DEF_T_specs /* Additional specs */ }; diff --git a/tests/46-redefine-OK.asn1.-PR b/tests/46-redefine-OK.asn1.-PR index 639ded028..ee7aceb42 100644 --- a/tests/46-redefine-OK.asn1.-PR +++ b/tests/46-redefine-OK.asn1.-PR @@ -18,26 +18,7 @@ der_type_encoder_f PrimitiveType_encode_der; asn_struct_print_f PrimitiveType_print; asn_struct_free_f PrimitiveType_free; -/*** <<< STAT-DEFS [PrimitiveType] >>> ***/ - -static ber_tlv_tag_t asn1_DEF_PrimitiveType_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) -}; -asn1_TYPE_descriptor_t asn1_DEF_PrimitiveType = { - "PrimitiveType", - PrimitiveType_constraint, - PrimitiveType_decode_ber, - PrimitiveType_encode_der, - PrimitiveType_print, - PrimitiveType_free, - 0, /* Use generic outmost tag fetcher */ - asn1_DEF_PrimitiveType_tags, - sizeof(asn1_DEF_PrimitiveType_tags) - /sizeof(asn1_DEF_PrimitiveType_tags[0]), /* 1 */ - 1, /* Tags to skip */ - -0, /* Unknown yet */ - 0 /* No specifics */ -}; +/*** <<< CODE [PrimitiveType] >>> ***/ int PrimitiveType_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, @@ -54,19 +35,21 @@ PrimitiveType_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so adjust the DEF appropriately. */ static void -inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_OCTET_STRING.ber_decoder; - td->der_encoder = asn1_DEF_OCTET_STRING.der_encoder; - td->free_struct = asn1_DEF_OCTET_STRING.free_struct; - td->print_struct = asn1_DEF_OCTET_STRING.print_struct; - td->last_tag_form = asn1_DEF_OCTET_STRING.last_tag_form; - td->specifics = asn1_DEF_OCTET_STRING.specifics; +PrimitiveType_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_OCTET_STRING.ber_decoder; + td->der_encoder = asn1_DEF_OCTET_STRING.der_encoder; + td->free_struct = asn1_DEF_OCTET_STRING.free_struct; + td->print_struct = asn1_DEF_OCTET_STRING.print_struct; + td->last_tag_form = asn1_DEF_OCTET_STRING.last_tag_form; + td->elements = asn1_DEF_OCTET_STRING.elements; + td->elements_count = asn1_DEF_OCTET_STRING.elements_count; + td->specifics = asn1_DEF_OCTET_STRING.specifics; } ber_dec_rval_t PrimitiveType_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { - inherit_TYPE_descriptor(td); + PrimitiveType_inherit_TYPE_descriptor(td); return td->ber_decoder(td, structure, bufptr, size, tag_mode); } @@ -75,25 +58,48 @@ der_enc_rval_t PrimitiveType_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - inherit_TYPE_descriptor(td); + PrimitiveType_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } int PrimitiveType_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - inherit_TYPE_descriptor(td); + PrimitiveType_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } void PrimitiveType_free(asn1_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { - inherit_TYPE_descriptor(td); + PrimitiveType_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } +/*** <<< STAT-DEFS [PrimitiveType] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_PrimitiveType_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_PrimitiveType = { + "PrimitiveType", + PrimitiveType_constraint, + PrimitiveType_decode_ber, + PrimitiveType_encode_der, + PrimitiveType_print, + PrimitiveType_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_PrimitiveType_tags, + sizeof(asn1_DEF_PrimitiveType_tags) + /sizeof(asn1_DEF_PrimitiveType_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + /*** <<< INCLUDES [ConstructedType] >>> ***/ #include @@ -115,12 +121,13 @@ typedef struct ConstructedType { /*** <<< STAT-DEFS [ConstructedType] >>> ***/ -static asn1_SEQUENCE_element_t asn1_DEF_ConstructedType_elements[] = { - { offsetof(struct ConstructedType, field), 0, - (ASN_TAG_CLASS_CONTEXT | (5 << 2)), - -1, /* IMPLICIT tag at current level */ - (void *)&asn1_DEF_PrimitiveType, - "field" +static asn1_TYPE_member_t asn1_MBR_ConstructedType[] = { + { 0, offsetof(struct ConstructedType, field), + .tag = (ASN_TAG_CLASS_CONTEXT | (5 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn1_DEF_PrimitiveType, + .memb_constraints = 0, /* Defer to actual type */ + .name = "field" }, }; static ber_tlv_tag_t asn1_DEF_ConstructedType_tags[] = { @@ -132,8 +139,6 @@ static asn1_TYPE_tag2member_t asn1_DEF_ConstructedType_tag2el[] = { static asn1_SEQUENCE_specifics_t asn1_DEF_ConstructedType_specs = { sizeof(struct ConstructedType), offsetof(struct ConstructedType, _ber_dec_ctx), - asn1_DEF_ConstructedType_elements, - 1, /* Elements count */ asn1_DEF_ConstructedType_tag2el, 1, /* Count of tags in the map */ -1, /* Start extensions */ @@ -152,6 +157,8 @@ asn1_TYPE_descriptor_t asn1_DEF_ConstructedType = { /sizeof(asn1_DEF_ConstructedType_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ + asn1_MBR_ConstructedType, + 1, /* Elements count */ &asn1_DEF_ConstructedType_specs /* Additional specs */ }; @@ -175,26 +182,7 @@ der_type_encoder_f T_encode_der; asn_struct_print_f T_print; asn_struct_free_f T_free; -/*** <<< STAT-DEFS [T] >>> ***/ - -static ber_tlv_tag_t asn1_DEF_T_tags[] = { - (ASN_TAG_CLASS_CONTEXT | (3 << 2)) -}; -asn1_TYPE_descriptor_t asn1_DEF_T = { - "T", - T_constraint, - T_decode_ber, - T_encode_der, - T_print, - T_free, - 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T_tags, - sizeof(asn1_DEF_T_tags) - /sizeof(asn1_DEF_T_tags[0]), /* 1 */ - 1, /* Tags to skip */ - -0, /* Unknown yet */ - 0 /* No specifics */ -}; +/*** <<< CODE [T] >>> ***/ int T_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, @@ -211,19 +199,21 @@ T_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so adjust the DEF appropriately. */ static void -inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_ConstructedType.ber_decoder; - td->der_encoder = asn1_DEF_ConstructedType.der_encoder; - td->free_struct = asn1_DEF_ConstructedType.free_struct; - td->print_struct = asn1_DEF_ConstructedType.print_struct; - td->last_tag_form = asn1_DEF_ConstructedType.last_tag_form; - td->specifics = asn1_DEF_ConstructedType.specifics; +T_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_ConstructedType.ber_decoder; + td->der_encoder = asn1_DEF_ConstructedType.der_encoder; + td->free_struct = asn1_DEF_ConstructedType.free_struct; + td->print_struct = asn1_DEF_ConstructedType.print_struct; + td->last_tag_form = asn1_DEF_ConstructedType.last_tag_form; + td->elements = asn1_DEF_ConstructedType.elements; + td->elements_count = asn1_DEF_ConstructedType.elements_count; + td->specifics = asn1_DEF_ConstructedType.specifics; } ber_dec_rval_t T_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { - inherit_TYPE_descriptor(td); + T_inherit_TYPE_descriptor(td); return td->ber_decoder(td, structure, bufptr, size, tag_mode); } @@ -232,21 +222,44 @@ der_enc_rval_t T_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - inherit_TYPE_descriptor(td); + T_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } int T_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - inherit_TYPE_descriptor(td); + T_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } void T_free(asn1_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { - inherit_TYPE_descriptor(td); + T_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } + +/*** <<< STAT-DEFS [T] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_T_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (3 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_T = { + "T", + T_constraint, + T_decode_ber, + T_encode_der, + T_print, + T_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T_tags, + sizeof(asn1_DEF_T_tags) + /sizeof(asn1_DEF_T_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* Defined elsewhere */ + 0 /* No specifics */ +}; + diff --git a/tests/47-set-ext-OK.asn1.-P b/tests/47-set-ext-OK.asn1.-P index e945ccfec..9991cf570 100644 --- a/tests/47-set-ext-OK.asn1.-P +++ b/tests/47-set-ext-OK.asn1.-P @@ -35,12 +35,13 @@ typedef struct T1 { /*** <<< STAT-DEFS [T1] >>> ***/ -static asn1_SET_element_t asn1_DEF_T1_elements[] = { - { offsetof(struct T1, i), 0, - (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), - 0, - (void *)&asn1_DEF_INTEGER, - "i" +static asn1_TYPE_member_t asn1_MBR_T1[] = { + { 0, offsetof(struct T1, i), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_INTEGER, + .memb_constraints = 0, /* Defer to actual type */ + .name = "i" }, }; static ber_tlv_tag_t asn1_DEF_T1_tags[] = { @@ -56,8 +57,6 @@ static asn1_SET_specifics_t asn1_DEF_T1_specs = { sizeof(struct T1), offsetof(struct T1, _ber_dec_ctx), offsetof(struct T1, _presence_map), - asn1_DEF_T1_elements, - 1, /* Elements count */ asn1_DEF_T1_tag2el, 1, /* Count of tags in the map */ 1, /* Whether extensible */ @@ -76,6 +75,8 @@ asn1_TYPE_descriptor_t asn1_DEF_T1 = { /sizeof(asn1_DEF_T1_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ + asn1_MBR_T1, + 1, /* Elements count */ &asn1_DEF_T1_specs /* Additional specs */ }; @@ -116,12 +117,13 @@ typedef struct T2 { /*** <<< STAT-DEFS [T2] >>> ***/ -static asn1_SET_element_t asn1_DEF_T2_elements[] = { - { offsetof(struct T2, i), 0, - (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), - 0, - (void *)&asn1_DEF_INTEGER, - "i" +static asn1_TYPE_member_t asn1_MBR_T2[] = { + { 0, offsetof(struct T2, i), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_INTEGER, + .memb_constraints = 0, /* Defer to actual type */ + .name = "i" }, }; static ber_tlv_tag_t asn1_DEF_T2_tags[] = { @@ -137,8 +139,6 @@ static asn1_SET_specifics_t asn1_DEF_T2_specs = { sizeof(struct T2), offsetof(struct T2, _ber_dec_ctx), offsetof(struct T2, _presence_map), - asn1_DEF_T2_elements, - 1, /* Elements count */ asn1_DEF_T2_tag2el, 1, /* Count of tags in the map */ 1, /* Whether extensible */ @@ -157,6 +157,8 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ + asn1_MBR_T2, + 1, /* Elements count */ &asn1_DEF_T2_specs /* Additional specs */ }; @@ -194,12 +196,13 @@ typedef struct T3 { /*** <<< STAT-DEFS [T3] >>> ***/ -static asn1_CHOICE_element_t asn1_DEF_T3_elements[] = { - { offsetof(struct T3, choice.i), 0, - (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), - 0, - (void *)&asn1_DEF_INTEGER, - "i" +static asn1_TYPE_member_t asn1_MBR_T3[] = { + { 0, offsetof(struct T3, choice.i), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_INTEGER, + .memb_constraints = 0, /* Defer to actual type */ + .name = "i" }, }; static asn1_TYPE_tag2member_t asn1_DEF_T3_tag2el[] = { @@ -210,8 +213,6 @@ static asn1_CHOICE_specifics_t asn1_DEF_T3_specs = { offsetof(struct T3, _ber_dec_ctx), offsetof(struct T3, present), sizeof(((struct T3 *)0)->present), - asn1_DEF_T3_elements, - 1, /* Elements count */ asn1_DEF_T3_tag2el, 1, /* Count of tags in the map */ 1 /* Whether extensible */ @@ -228,6 +229,8 @@ asn1_TYPE_descriptor_t asn1_DEF_T3 = { 0, /* No explicit tags (count) */ 0, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ + asn1_MBR_T3, + 1, /* Elements count */ &asn1_DEF_T3_specs /* Additional specs */ }; @@ -265,12 +268,13 @@ typedef struct T4 { /*** <<< STAT-DEFS [T4] >>> ***/ -static asn1_CHOICE_element_t asn1_DEF_T4_elements[] = { - { offsetof(struct T4, choice.i), 0, - (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), - 0, - (void *)&asn1_DEF_INTEGER, - "i" +static asn1_TYPE_member_t asn1_MBR_T4[] = { + { 0, offsetof(struct T4, choice.i), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_INTEGER, + .memb_constraints = 0, /* Defer to actual type */ + .name = "i" }, }; static asn1_TYPE_tag2member_t asn1_DEF_T4_tag2el[] = { @@ -281,8 +285,6 @@ static asn1_CHOICE_specifics_t asn1_DEF_T4_specs = { offsetof(struct T4, _ber_dec_ctx), offsetof(struct T4, present), sizeof(((struct T4 *)0)->present), - asn1_DEF_T4_elements, - 1, /* Elements count */ asn1_DEF_T4_tag2el, 1, /* Count of tags in the map */ 1 /* Whether extensible */ @@ -299,6 +301,8 @@ asn1_TYPE_descriptor_t asn1_DEF_T4 = { 0, /* No explicit tags (count) */ 0, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ + asn1_MBR_T4, + 1, /* Elements count */ &asn1_DEF_T4_specs /* Additional specs */ }; diff --git a/tests/50-constraint-OK.asn1 b/tests/50-constraint-OK.asn1 index 27af95d19..0ae7689cd 100644 --- a/tests/50-constraint-OK.asn1 +++ b/tests/50-constraint-OK.asn1 @@ -39,4 +39,8 @@ BEGIN SIZE-and-FROM ::= PER-Visible (SIZE(1..4) ^ FROM("ABCD")) Neither-SIZE-nor-FROM ::= PER-Visible (SIZE(1..4) | FROM("ABCD",...)) + Utf8-3 ::= Utf8-2 (FROM("A".."Z"|"a".."z")) + Utf8-2 ::= Utf8-1 (SIZE(1..2)) + Utf8-1 ::= UTF8String + END diff --git a/tests/50-constraint-OK.asn1.-EFprint-constraints b/tests/50-constraint-OK.asn1.-EFprint-constraints index 694f7766fb54b2625813f6029830feb4134e110e..11e8d3d304a396a1401cf3f8011c71cf404ce954 100644 GIT binary patch delta 620 zcmbO(zCvcgS#|{t&%6>t&537|Va&+}jM;GZY{q6dTaKv~&YsO=3}>HXa)7h>m}iJ9 zXt-9Cq~;Z8Cgr3;S^0Uznv<6?+XK}FmlPRlPTtR^Jeh-~4v8-|c@E1#IDZ0{$mBxS zxqJ#50j@#1VVPjVAll+M*e7pbXPIon){H5A98*YnGDJr=cByIDh509|aV|xdn!u$t zc^y037q@dvzlrxc~6P@|xf z2x3+#P5#d%s~qeZ<*H$*r)Q+8iA&++g=})13L0SJfFU}8OUwkQ8n?Ncnp|8^yW!3- zRM40#%dR##fn5#NC~YL87(nj&uLRd`2=PXUn*}f~GxO3XH!w;g=>~e6A4!X=p9>cN D_G_GhKYb*@;(@Cs#9aP4-|+oVh($ From b283901f981f24d0dd59af340a63a26b4385cf6d Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 20 Aug 2004 13:37:01 +0000 Subject: [PATCH 0170/1469] new constraints generation method git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@170 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/Makefile.am | 12 +- libasn1compiler/asn1c_C.c | 300 +++++++++++++++-------------- libasn1compiler/asn1c_constraint.c | 121 ++++++++++-- libasn1compiler/asn1c_constraint.h | 1 - libasn1compiler/asn1c_internal.h | 7 - libasn1compiler/asn1c_misc.c | 2 + libasn1compiler/asn1c_out.c | 15 +- libasn1compiler/asn1c_out.h | 45 +++-- libasn1compiler/asn1c_save.c | 24 ++- libasn1compiler/asn1compiler.c | 7 +- 10 files changed, 322 insertions(+), 212 deletions(-) diff --git a/libasn1compiler/Makefile.am b/libasn1compiler/Makefile.am index bcfaf93d9..55c529859 100644 --- a/libasn1compiler/Makefile.am +++ b/libasn1compiler/Makefile.am @@ -1,7 +1,7 @@ AM_CPPFLAGS = \ - -I${top_srcdir}/libasn1parser \ - -I${top_srcdir}/libasn1fix + -I$(top_srcdir)/libasn1parser \ + -I$(top_srcdir)/libasn1fix noinst_LTLIBRARIES = libasn1compiler.la @@ -17,11 +17,3 @@ libasn1compiler_la_SOURCES = \ asn1c_compat.c asn1c_compat.h \ asn1c_fdeps.c asn1c_fdeps.h \ asn1c_internal.h - -TESTS = $(check_PROGRAMS) - -check_PROGRAMS = check_compiler - -check_compiler_LDADD = $(noinst_LTLIBRARIES) \ - $(top_builddir)/libasn1parser/libasn1parser.la \ - $(top_builddir)/libasn1fix/libasn1fix.la diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index ac1387337..f54d2d582 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -5,6 +5,8 @@ #include "asn1c_internal.h" #include "asn1c_C.h" #include "asn1c_constraint.h" +#include "asn1c_out.h" +#include "asn1c_misc.h" #include /* Stuff exported by libasn1fix */ typedef struct tag2el_s { @@ -17,6 +19,8 @@ typedef struct tag2el_s { static int _fill_tag2el_map(arg_t *arg, tag2el_t **tag2el, int *count, int el_no); static int _add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no); +static int _expr_elements_count(arg_t *arg, asn1p_expr_t *expr); +static int _emit_member_table(arg_t *arg, asn1p_expr_t *expr); static int asn1c_lang_C_type_SEQUENCE_def(arg_t *arg); static int asn1c_lang_C_type_SET_def(arg_t *arg); @@ -27,7 +31,7 @@ static int check_if_extensible(asn1p_expr_t *expr); static int emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int *tags_impl_skip, int choice_mode); static int emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count); -#define C99_MODE (arg->flags & A1C_NO_C99) +#define C99_MODE (!(arg->flags & A1C_NO_C99)) #define UNNAMED_UNIONS (arg->flags & A1C_UNNAMED_UNIONS) #define PCTX_DEF INDENTED( \ @@ -176,7 +180,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { * Print out the table according to which the parsing is performed. */ p = MKID(expr->Identifier); - OUT("static asn1_SEQUENCE_element_t asn1_DEF_%s_elements[] = {\n", p); + OUT("static asn1_TYPE_member_t asn1_MBR_%s[] = {\n", p); elements = 0; INDENTED(TQ_FOR(v, &(expr->members), next) { @@ -187,43 +191,8 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { ext_stop = elements - 1; continue; } - OUT("{ "); elements++; - OUT("offsetof(struct %s, ", MKID(expr->Identifier)); - OUT("%s), ", MKID(v->Identifier)); - if(v->marker) { - asn1p_expr_t *tv; - int opts = 0; - for(tv = v; tv && tv->marker; - tv = TQ_NEXT(tv, next), opts++) { - if(tv->expr_type == A1TC_EXTENSIBLE) - opts--; - } - OUT("%d,", opts); - } else { - OUT("0,"); - } - OUT("\n"); - INDENT(+1); - if(C99_MODE) OUT(".tag = "); - _print_tag(arg, v, NULL); - OUT(",\n"); - if(C99_MODE) OUT(".tag_mode = "); - if(v->tag.tag_class) { - if(v->tag.tag_mode == TM_IMPLICIT) - OUT("-1,\t/* IMPLICIT tag at current level */\n"); - else - OUT("+1,\t/* EXPLICIT tag at current level */\n"); - } else { - OUT("0,\n"); - } - if(C99_MODE) OUT(".type = "); - OUT("(void *)&asn1_DEF_%s,\n", - asn1c_type_name(arg, v, TNF_SAFE)); - if(C99_MODE) OUT(".name = "); - OUT("\"%s\"\n", v->Identifier); - OUT("},\n"); - INDENT(-1); + _emit_member_table(arg, v); }); OUT("};\n"); @@ -242,8 +211,6 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { INDENTED( OUT("sizeof(struct %s),\n", p); OUT("offsetof(struct %s, _ber_dec_ctx),\n", p); - OUT("asn1_DEF_%s_elements,\n", p); - OUT("%d,\t/* Elements count */\n", elements); OUT("asn1_DEF_%s_tag2el,\n", p); OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); OUT("%d,\t/* Start extensions */\n", @@ -272,6 +239,8 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { } OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); OUT("%d,\t/* Whether CONSTRUCTED */\n", 1); + OUT("asn1_MBR_%s,\n", p); + OUT("%d,\t/* Elements count */\n", elements); OUT("&asn1_DEF_%s_specs\t/* Additional specs */\n", p); ); OUT("};\n"); @@ -405,48 +374,19 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { * Print out the table according to which the parsing is performed. */ p = MKID(expr->Identifier); - OUT("static asn1_SET_element_t asn1_DEF_%s_elements[] = {\n", p); + OUT("static asn1_TYPE_member_t asn1_MBR_%s[] = {\n", p); elements = 0; INDENTED(TQ_FOR(v, &(expr->members), next) { if(v->expr_type != A1TC_EXTENSIBLE) { if(comp_mode == 1) v->marker = EM_OPTIONAL; - elements++; } else { if(comp_mode < 3) comp_mode++; continue; } - OUT("{ "); - p = MKID(expr->Identifier); - OUT("offsetof(struct %s, ", p); - p = MKID(v->Identifier); - OUT("%s), ", p); - if(v->marker) { - OUT("1, /* Optional element */\n"); - } else { - OUT("0,\n"); - } - INDENT(+1); - if(C99_MODE) OUT(".tag = "); - _print_tag(arg, v, NULL); - OUT(",\n"); - if(C99_MODE) OUT(".tag_mode = "); - if(v->tag.tag_class) { - if(v->tag.tag_mode == TM_IMPLICIT) - OUT("-1,\t/* IMPLICIT tag at current level */\n"); - else - OUT("+1,\t/* EXPLICIT tag at current level */\n"); - } else { - OUT("0,\n"); - } - if(C99_MODE) OUT(".type = "); - OUT("(void *)&asn1_DEF_%s,\n", - asn1c_type_name(arg, v, TNF_SAFE)); - if(C99_MODE) OUT(".name = "); - OUT("\"%s\"\n", v->Identifier); - OUT("},\n"); - INDENT(-1); + elements++; + _emit_member_table(arg, v); }); OUT("};\n"); @@ -496,8 +436,6 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { OUT("sizeof(struct %s),\n", p); OUT("offsetof(struct %s, _ber_dec_ctx),\n", p); OUT("offsetof(struct %s, _presence_map),\n", p); - OUT("asn1_DEF_%s_elements,\n", p); - OUT("%d,\t/* Elements count */\n", elements); OUT("asn1_DEF_%s_tag2el,\n", p); OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); OUT("%d,\t/* Whether extensible */\n", @@ -525,6 +463,8 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { } OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); OUT("%d,\t/* Whether CONSTRUCTED */\n", 1); + OUT("asn1_MBR_%s,\n", p); + OUT("%d,\t/* Elements count */\n", elements); OUT("&asn1_DEF_%s_specs\t/* Additional specs */\n", p); ); OUT("};\n"); @@ -589,20 +529,11 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { * Print out the table according to which the parsing is performed. */ p = MKID(expr->Identifier); - OUT("static asn1_SET_OF_element_t asn1_DEF_%s_elements[] = {\n", p); + OUT("static asn1_TYPE_member_t asn1_MBR_%s[] = {\n", p); - INDENTED(OUT("{ "); + INDENTED( v = TQ_FIRST(&(expr->members)); - INDENT(+1); - if(C99_MODE) OUT(".tag = "); - _print_tag(arg, v, NULL); - OUT(",\n"); - if(C99_MODE) OUT(".type = "); - OUT("(void *)&asn1_DEF_%s", - asn1c_type_name(arg, v, TNF_SAFE)); - OUT(" "); - OUT("},\n"); - INDENT(-1); + _emit_member_table(arg, v); ); OUT("};\n"); @@ -616,7 +547,6 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { INDENTED( OUT("sizeof(struct %s),\n", p); OUT("offsetof(struct %s, _ber_dec_ctx),\n", p); - OUT("asn1_DEF_%s_elements\n", p); ); OUT("};\n"); OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p); @@ -647,6 +577,8 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { } OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); OUT("%d,\t/* Whether CONSTRUCTED */\n", 1); + OUT("asn1_MBR_%s,\n", p); + OUT("1,\t/* Single element */\n"); OUT("&asn1_DEF_%s_specs\t/* Additional specs */\n", p); ); OUT("};\n"); @@ -742,49 +674,19 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { * Print out the table according to which the parsing is performed. */ p = MKID(expr->Identifier); - OUT("static asn1_CHOICE_element_t asn1_DEF_%s_elements[] = {\n", p); + OUT("static asn1_TYPE_member_t asn1_MBR_%s[] = {\n", p); elements = 0; INDENTED(TQ_FOR(v, &(expr->members), next) { if(v->expr_type != A1TC_EXTENSIBLE) { if(comp_mode == 1) v->marker = EM_OPTIONAL; - elements++; } else { if(comp_mode < 3) comp_mode++; continue; } - OUT("{ "); - p = MKID(expr->Identifier); - OUT("offsetof(struct %s, ", p); - p = MKID(v->Identifier); - if(!UNNAMED_UNIONS) OUT("choice."); - OUT("%s), ", p); - if(v->marker) { - OUT("1, /* Optional element */\n"); - } else { - OUT("0,\n"); - } - INDENT(+1); - if(C99_MODE) OUT(".tag = "); - _print_tag(arg, v, NULL); - OUT(",\n"); - if(C99_MODE) OUT(".tag_mode = "); - if(v->tag.tag_class) { - if(v->tag.tag_mode == TM_IMPLICIT) - OUT("-1,\t/* IMPLICIT tag at current level */\n"); - else - OUT("+1,\t/* EXPLICIT tag at current level */\n"); - } else { - OUT("0,\n"); - } - if(C99_MODE) OUT(".type = "); - OUT("(void *)&asn1_DEF_%s,\n", - asn1c_type_name(arg, v, TNF_SAFE)); - if(C99_MODE) OUT(".name = "); - OUT("\"%s\"\n", v->Identifier); - OUT("},\n"); - INDENT(-1); + elements++; + _emit_member_table(arg, v); }); OUT("};\n"); @@ -810,8 +712,6 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { OUT("offsetof(struct %s, _ber_dec_ctx),\n", p); OUT("offsetof(struct %s, present),\n", p); OUT("sizeof(((struct %s *)0)->present),\n", p); - OUT("asn1_DEF_%s_elements,\n", p); - OUT("%d,\t/* Elements count */\n", elements); OUT("asn1_DEF_%s_tag2el,\n", p); OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); OUT("%d\t/* Whether extensible */\n", @@ -838,6 +738,8 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { } OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); OUT("%d,\t/* Whether CONSTRUCTED */\n", 1); + OUT("asn1_MBR_%s,\n", p); + OUT("%d,\t/* Elements count */\n", elements); OUT("&asn1_DEF_%s_specs\t/* Additional specs */\n", p); ); OUT("};\n"); @@ -910,6 +812,8 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { if(expr->marker) OUT("\t/* %s */", (expr->marker==EM_OPTIONAL)?"OPTIONAL":"DEFAULT"); OUT("\n"); + + REDIR(OT_TYPE_DECLS); return 0; } @@ -951,17 +855,20 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { } OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); OUT("-0,\t/* Unknown yet */\n"); + if(_expr_elements_count(arg, expr)) + OUT("0, 0,\t/* Defined elsewhere */\n"); + else + OUT("0, 0,\t/* No members */\n"); OUT("0\t/* No specifics */\n"); ); OUT("};\n"); OUT("\n"); + REDIR(OT_CODE); + /* * Constraint checking. */ - /* Emit FROM() tables and others */ - asn1c_emit_constraint_tables(arg, 0); - p = MKID(expr->Identifier); OUT("int\n"); OUT("%s_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,\n", p); @@ -990,37 +897,41 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { * Emit suicidal functions. */ - { /* * This function replaces certain fields from the definition * of a type with the corresponding fields from the basic type * (from which the current type is inherited). */ - char *type_name = asn1c_type_name(arg, expr, TNF_SAFE); OUT("/*\n"); - OUT(" * This type is implemented using %s,\n", type_name); + OUT(" * This type is implemented using %s,\n", + asn1c_type_name(arg, expr, TNF_SAFE)); OUT(" * so adjust the DEF appropriately.\n"); OUT(" */\n"); OUT("static void\n"); - OUT("inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) {\n"); + p = MKID(expr->Identifier); + OUT("%s_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) {\n", p); INDENT(+1); - OUT("td->ber_decoder = asn1_DEF_%s.ber_decoder;\n", type_name); - OUT("td->der_encoder = asn1_DEF_%s.der_encoder;\n", type_name); - OUT("td->free_struct = asn1_DEF_%s.free_struct;\n", type_name); - OUT("td->print_struct = asn1_DEF_%s.print_struct;\n", type_name); - OUT("td->last_tag_form = asn1_DEF_%s.last_tag_form;\n", type_name); - OUT("td->specifics = asn1_DEF_%s.specifics;\n", type_name); + { + char *type_name = asn1c_type_name(arg, expr, TNF_SAFE); + OUT("td->ber_decoder = asn1_DEF_%s.ber_decoder;\n", type_name); + OUT("td->der_encoder = asn1_DEF_%s.der_encoder;\n", type_name); + OUT("td->free_struct = asn1_DEF_%s.free_struct;\n", type_name); + OUT("td->print_struct = asn1_DEF_%s.print_struct;\n", type_name); + OUT("td->last_tag_form = asn1_DEF_%s.last_tag_form;\n", type_name); + OUT("td->elements = asn1_DEF_%s.elements;\n", type_name); + OUT("td->elements_count = asn1_DEF_%s.elements_count;\n", type_name); + OUT("td->specifics = asn1_DEF_%s.specifics;\n", type_name); + } INDENT(-1); OUT("}\n"); OUT("\n"); - } p = MKID(expr->Identifier); OUT("ber_dec_rval_t\n"); OUT("%s_decode_ber(asn1_TYPE_descriptor_t *td,\n", p); INDENTED( OUT("\tvoid **structure, void *bufptr, size_t size, int tag_mode) {\n"); - OUT("inherit_TYPE_descriptor(td);\n"); + OUT("%s_inherit_TYPE_descriptor(td);\n", p); OUT("return td->ber_decoder(td, structure,\n"); OUT("\tbufptr, size, tag_mode);\n"); ); @@ -1033,7 +944,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { INDENTED( OUT("\tvoid *structure, int tag_mode, ber_tlv_tag_t tag,\n"); OUT("\tasn_app_consume_bytes_f *cb, void *app_key) {\n"); - OUT("inherit_TYPE_descriptor(td);\n"); + OUT("%s_inherit_TYPE_descriptor(td);\n", p); OUT("return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);\n"); ); OUT("}\n"); @@ -1044,7 +955,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("%s_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr,\n", p); INDENTED( OUT("\tint ilevel, asn_app_consume_bytes_f *cb, void *app_key) {\n"); - OUT("inherit_TYPE_descriptor(td);\n"); + OUT("%s_inherit_TYPE_descriptor(td);\n", p); OUT("return td->print_struct(td, struct_ptr, ilevel, cb, app_key);\n"); ); OUT("}\n"); @@ -1055,7 +966,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("%s_free(asn1_TYPE_descriptor_t *td,\n", p); INDENTED( OUT("\tvoid *struct_ptr, int contents_only) {\n"); - OUT("inherit_TYPE_descriptor(td);\n"); + OUT("%s_inherit_TYPE_descriptor(td);\n", p); OUT("td->free_struct(td, struct_ptr, contents_only);\n"); ); OUT("}\n"); @@ -1355,3 +1266,112 @@ emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int *tags_impl_skip, int choice return tags_count; } + +static int +_expr_elements_count(arg_t *arg, asn1p_expr_t *expr) { + asn1p_expr_t *topmost_parent; + asn1p_expr_t *v; + int elements = 0; + + topmost_parent = asn1f_find_terminal_type_ex(arg->asn, + arg->mod, expr, 0); + if(!topmost_parent) return 0; + + if(!(topmost_parent->expr_type & ASN_CONSTR_MASK)) + return 0; + + TQ_FOR(v, &(topmost_parent->members), next) { + if(v->expr_type != A1TC_EXTENSIBLE) + elements++; + } + + return elements; +} + +static int +_emit_member_table(arg_t *arg, asn1p_expr_t *expr) { + int save_target; + arg_t tmp_arg; + char *p; + + OUT("{ "); + if(expr->marker) { + asn1p_expr_t *tv; + int opts = 0; + for(tv = expr; tv && tv->marker; + tv = TQ_NEXT(tv, next), opts++) { + if(tv->expr_type == A1TC_EXTENSIBLE) + opts--; + } + OUT("%d, ", opts); + } else { + OUT("0, "); + } + if(expr->Identifier) { + OUT("offsetof(struct %s, ", MKID(arg->expr->Identifier)); + if(arg->expr->expr_type == ASN_CONSTR_CHOICE + && (!UNNAMED_UNIONS)) OUT("choice."); + OUT("%s),\n", MKID(expr->Identifier)); + } else { + assert(arg->expr->expr_type == ASN_CONSTR_SET_OF + || arg->expr->expr_type == ASN_CONSTR_SEQUENCE_OF); + OUT("0,\n"); + } + INDENT(+1); + if(C99_MODE) OUT(".tag = "); + _print_tag(arg, expr , NULL); + OUT(",\n"); + if(C99_MODE) OUT(".tag_mode = "); + if(expr->tag.tag_class) { + if(expr->tag.tag_mode == TM_IMPLICIT) + OUT("-1,\t/* IMPLICIT tag at current level */\n"); + else + OUT("+1,\t/* EXPLICIT tag at current level */\n"); + } else { + OUT("0,\n"); + } + if(C99_MODE) OUT(".type = "); + OUT("(void *)&asn1_DEF_%s,\n", + asn1c_type_name(arg, expr, TNF_SAFE)); + if(C99_MODE) OUT(".memb_constraints = "); + if(expr->constraints) { + p = MKID(expr->Identifier); + if(!expr->Identifier) + p = asn1c_type_name(arg, expr, TNF_SAFE); + OUT("memb_%s_constraint,\n", p); + } else { + OUT("0,\t/* Defer to actual type */\n"); + } + if(C99_MODE) OUT(".name = "); + OUT("\"%s\"\n", expr->Identifier ? expr->Identifier : ""); + OUT("},\n"); + INDENT(-1); + + if(!expr->constraints) + return 0; + + save_target = arg->target->target; + REDIR(OT_CODE); + + if(expr->Identifier) + p = MKID(expr->Identifier); + else + p = asn1c_type_name(arg, expr, TNF_SAFE); + OUT("static int\n"); + OUT("memb_%s_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,\n", p); + INDENT(+1); + OUT("\t\tasn_app_consume_bytes_f *app_errlog, void *app_key) {\n"); + tmp_arg = *arg; + tmp_arg.expr = expr; + if(asn1c_emit_constraint_checking_code(&tmp_arg) == 1) { + OUT("return td->check_constraints\n"); + OUT("\t(td, sptr, app_errlog, app_key);\n"); + } + INDENT(-1); + OUT("}\n"); + OUT("\n"); + + REDIR(save_target); + + return 0; +} diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index dd54224da..cf5416b0c 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -1,9 +1,12 @@ #include "asn1c_internal.h" #include "asn1c_constraint.h" +#include "asn1c_misc.h" +#include "asn1c_out.h" #include /* constraint groker from libasn1fix */ #include /* other exportable stuff from libasn1fix */ +static int asn1c_emit_constraint_tables(arg_t *arg, int got_size); static int emit_alphabet_check_loop(arg_t *arg, asn1cnst_range_t *range); static int emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype); static int emit_size_determination_code(arg_t *arg, asn1p_expr_type_e etype); @@ -22,6 +25,7 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { asn1p_expr_type_e etype; asn1p_constraint_t *ct; int got_something = 0; + int produce_st = 0; ct = expr->combined_constraints; if(ct == NULL) @@ -57,6 +61,24 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { } } + /* + * Do we really need an "*st = sptr" pointer? + */ + switch(etype) { + case ASN_BASIC_INTEGER: + case ASN_BASIC_ENUMERATED: + if(!(arg->flags & A1C_USE_NATIVE_INTEGERS)) + produce_st = 1; + break; + case ASN_BASIC_OCTET_STRING: + produce_st = 1; + break; + default: + if(etype & ASN_STRING_MASK) + produce_st = 1; + break; + } + if(produce_st) OUT("const %s_t *st = sptr;\n", MKID(arg->expr->Identifier)); if(r_size || r_value) { @@ -96,6 +118,13 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { if(r_size) emit_size_determination_code(arg, etype); + INDENT(-1); + REDIR(OT_CTABLES); + /* Emit FROM() tables */ + asn1c_emit_constraint_tables(arg, r_size?1:0); + REDIR(OT_CODE); + INDENT(+1); + /* * Here is an if() {} else {} constaint checking code. */ @@ -126,6 +155,12 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { } if(!got_something) { OUT("1 /* No applicable constraints whatsoever */"); + OUT(") {\n"); + INDENT(-1); + INDENTED(OUT("/* Nothing is here. See below */\n")); + OUT("}\n"); + OUT("\n"); + return 1; } INDENT(-1); OUT(") {\n"); @@ -144,16 +179,19 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { return 0; } -int -asn1c_emit_constraint_tables(arg_t *arg, asn1p_constraint_t *ct) { +static int +asn1c_emit_constraint_tables(arg_t *arg, int got_size) { asn1_integer_t range_start; asn1_integer_t range_stop; asn1p_expr_type_e etype; asn1cnst_range_t *range; + asn1p_constraint_t *ct; + int utf8_full_alphabet_check = 0; + int max_table_size = 256; int table[256]; int use_table; - if(!ct) ct = arg->expr->combined_constraints; + ct = arg->expr->combined_constraints; if(!ct) return 0; etype = _find_terminal_type(arg); @@ -180,10 +218,21 @@ asn1c_emit_constraint_tables(arg_t *arg, asn1p_constraint_t *ct) { * Check if we need a test table to check the alphabet. */ use_table = 1; - if((range_stop - range_start) > 255) + if(range->el_count == 0) { + /* + * It's better to have a short if() check + * than waste 4k of table space + */ use_table = 0; - if(range->el_count == 0) + } + if((range_stop - range_start) > 255) use_table = 0; + if(etype == ASN_STRING_UTF8String) { + if(range_stop >= 0x80) + use_table = 0; + else + max_table_size = 128; + } if(!ct->_compile_mark) ct->_compile_mark = ++global_compile_mark; @@ -203,15 +252,15 @@ asn1c_emit_constraint_tables(arg_t *arg, asn1p_constraint_t *ct) { } for(v = r->left.value; v <= r->right.value; v++) { assert((v - range_start) >= 0); - assert((v - range_start) < 256); + assert((v - range_start) < max_table_size); table[v - range_start] = ++n; } } - OUT("static int permitted_alphabet_table_%d[256] = {\n", - ct->_compile_mark); untl = (range_stop - range_start) + 1; untl += (untl % 16)?16 - (untl % 16):0; + OUT("static int permitted_alphabet_table_%d[%d] = {\n", + ct->_compile_mark, max_table_size); for(n = 0; n < untl; n++) { OUT("%d,", table[n]?1:0); if(!((n+1) % 16)) { @@ -238,11 +287,42 @@ asn1c_emit_constraint_tables(arg_t *arg, asn1p_constraint_t *ct) { } OUT("};\n"); OUT("\n"); + } else if(etype == ASN_STRING_UTF8String) { + /* + * UTF8String type is a special case in many respects. + */ + assert(range_stop > 255); /* This one's unobvious */ + if(got_size) { + /* + * Size has been already determined. + * The UTF8String length checker also checks + * for the syntax validity, so we don't have + * to repeat this process twice. + */ + ct->_compile_mark = 0; /* Don't generate code */ + asn1constraint_range_free(range); + return 0; + } else { + utf8_full_alphabet_check = 1; + } + } else { + /* + * This permitted alphabet check will be + * expressed using conditional statements + * instead of table lookups. Table would be + * to large or otherwise inappropriate (too sparse?). + */ } OUT("static int check_permitted_alphabet_%d(const void *sptr) {\n", ct->_compile_mark); - INDENT(+1); + INDENT(+1); + if(utf8_full_alphabet_check) { + OUT("if(UTF8String_length((UTF8String_t *)sptr, td->name, \n"); + OUT("\tapp_errlog, app_key) == -1)\n"); + OUT("\t\treturn 0; /* Alphabet (sic!) test failed. */\n"); + OUT("\n"); + } else { if(use_table) { OUT("int *table = permitted_alphabet_table_%d;\n", ct->_compile_mark); @@ -250,8 +330,9 @@ asn1c_emit_constraint_tables(arg_t *arg, asn1p_constraint_t *ct) { } else { emit_alphabet_check_loop(arg, range); } - OUT("return 1;\n"); - INDENT(-1); + } + OUT("return 1;\n"); + INDENT(-1); OUT("}\n"); OUT("\n"); @@ -338,6 +419,7 @@ static int emit_range_comparison_code(arg_t *arg, asn1cnst_range_t *range, const char *varname, asn1_integer_t natural_start, asn1_integer_t natural_stop) { int ignore_left; int ignore_right; + int generated_something = 0; int i; for(i = -1; i < range->el_count; i++) { @@ -381,9 +463,10 @@ emit_range_comparison_code(arg_t *arg, asn1cnst_range_t *range, const char *varn (long long)r->right.value); } if(r != range) OUT(")"); + generated_something = 1; } - return 0; + return generated_something; } static int @@ -412,16 +495,18 @@ emit_size_determination_code(arg_t *arg, asn1p_expr_type_e etype) { case ASN_CONSTR_SEQUENCE_OF: OUT("{ /* Determine the number of elements */\n"); INDENT(+1); - OUT("A_%s_OF(void) *list;\n", + OUT("const A_%s_OF(void) *list;\n", etype==ASN_CONSTR_SET_OF?"SET":"SEQUENCE"); - OUT("(void *)list = st;\n"); + OUT("(const void *)list = sptr;\n"); OUT("size = list->count;\n"); INDENT(-1); OUT("}\n"); break; + case ASN_BASIC_OCTET_STRING: + OUT("size = st->size;\n"); + break; default: - if((etype & ASN_STRING_MASK) - || etype == ASN_BASIC_OCTET_STRING) { + if(etype & ASN_STRING_MASK) { OUT("size = st->size;\n"); break; } else { @@ -446,7 +531,7 @@ emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype) { case ASN_BASIC_INTEGER: case ASN_BASIC_ENUMERATED: if(arg->flags & A1C_USE_NATIVE_INTEGERS) { - OUT("value = *(int *)st;\n"); + OUT("value = *(int *)sptr;\n"); } else { OUT("if(asn1_INTEGER2long(st, &value)) {\n"); INDENT(+1); @@ -458,7 +543,7 @@ emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype) { } break; case ASN_BASIC_BOOLEAN: - OUT("value = (*(int *)st) ? 1 : 0;\n"); + OUT("value = (*(int *)sptr) ? 1 : 0;\n"); break; default: WARNING("Value cannot be determined " diff --git a/libasn1compiler/asn1c_constraint.h b/libasn1compiler/asn1c_constraint.h index 481c0b342..7c2ffa842 100644 --- a/libasn1compiler/asn1c_constraint.h +++ b/libasn1compiler/asn1c_constraint.h @@ -1,7 +1,6 @@ #ifndef _ASN1C_CONSTRAINT_H_ #define _ASN1C_CONSTRAINT_H_ -int asn1c_emit_constraint_tables(arg_t *arg, asn1p_constraint_t *ct); int asn1c_emit_constraint_checking_code(arg_t *arg); #endif /* _ASN1C_CONSTRAINT_H_ */ diff --git a/libasn1compiler/asn1c_internal.h b/libasn1compiler/asn1c_internal.h index 061b93638..e6b185229 100644 --- a/libasn1compiler/asn1c_internal.h +++ b/libasn1compiler/asn1c_internal.h @@ -33,16 +33,9 @@ typedef struct arg_s { asn1p_module_t *mod; asn1p_expr_t *expr; - int indent_level; - int indented; int embed; } arg_t; -#include "asn1c_lang.h" /* Target language initialization */ -#include "asn1c_misc.h" /* Miscellaneous functions */ -#include "asn1c_out.h" /* Handle output during compilation */ -#include "asn1c_save.h" /* Save compiled output */ - /* * Logging. */ diff --git a/libasn1compiler/asn1c_misc.c b/libasn1compiler/asn1c_misc.c index ee4369603..c30174bbf 100644 --- a/libasn1compiler/asn1c_misc.c +++ b/libasn1compiler/asn1c_misc.c @@ -1,4 +1,6 @@ #include "asn1c_internal.h" +#include "asn1c_misc.h" + #include /* diff --git a/libasn1compiler/asn1c_out.c b/libasn1compiler/asn1c_out.c index 3954916da..fb4187115 100644 --- a/libasn1compiler/asn1c_out.c +++ b/libasn1compiler/asn1c_out.c @@ -1,4 +1,5 @@ #include "asn1c_internal.h" +#include "asn1c_out.h" /* * Add an elementary chunk of target language text @@ -6,6 +7,7 @@ */ int asn1c_compiled_output(arg_t *arg, const char *fmt, ...) { + struct compiler_stream_destination_s *dst; const char *p; int lf_found; va_list ap; @@ -20,6 +22,7 @@ asn1c_compiled_output(arg_t *arg, const char *fmt, ...) { assert(arg->target->target != OT_ASSERT); return -1; default: + dst = &arg->target->destination[arg->target->target]; break; } @@ -37,16 +40,16 @@ asn1c_compiled_output(arg_t *arg, const char *fmt, ...) { /* * Print out the indentation. */ - if(arg->indented == 0) { - int i = arg->indent_level; - arg->indented = 1; + if(dst->indented == 0) { + int i = dst->indent_level; + dst->indented = 1; while(i--) { ret = asn1c_compiled_output(arg, "\t"); if(ret == -1) return -1; } } if(lf_found) - arg->indented = 0; + dst->indented = 0; /* * Estimate necessary size. @@ -80,7 +83,7 @@ asn1c_compiled_output(arg_t *arg, const char *fmt, ...) { if(arg->target->target == OT_INCLUDES) { out_chunk_t *v; - TQ_FOR(v, &(arg->target->targets[OT_INCLUDES]), next) { + TQ_FOR(v, &dst->chunks, next) { if(m->len == v->len && !memcmp(m->buf, v->buf, m->len)) break; @@ -93,7 +96,7 @@ asn1c_compiled_output(arg_t *arg, const char *fmt, ...) { } } - TQ_ADD(&(arg->target->targets[arg->target->target]), m, next); + TQ_ADD(&dst->chunks, m, next); return 0; } diff --git a/libasn1compiler/asn1c_out.h b/libasn1compiler/asn1c_out.h index 51582d4c6..f604687b2 100644 --- a/libasn1compiler/asn1c_out.h +++ b/libasn1compiler/asn1c_out.h @@ -19,15 +19,21 @@ typedef struct compiler_streams { OT_DEPS, /* Dependencies (other than #includes) */ OT_TYPE_DECLS, /* Type declarations */ OT_FUNC_DECLS, /* Function declarations */ - OT_STAT_DEFS, /* Static definitions */ + OT_CTABLES, /* Constraint tables */ OT_CODE, /* Some code */ + OT_STAT_DEFS, /* Static definitions */ OT_MAX } target; - TQ_HEAD(out_chunk_t) targets[OT_MAX]; + + struct compiler_stream_destination_s { + TQ_HEAD(out_chunk_t) chunks; + int indent_level; + int indented; + } destination[OT_MAX]; } compiler_streams_t; static char *_compiler_stream2str[] __attribute__ ((unused)) - = { "ASSERT", "INCLUDES", "DEPS", "TYPE-DECLS", "FUNC-DECLS", "STAT-DEFS", "CODE" }; + = { "ASSERT", "INCLUDES", "DEPS", "TYPE-DECLS", "FUNC-DECLS", "CTABLES", "CODE", "STAT-DEFS" }; int asn1c_compiled_output(arg_t *arg, const char *fmt, ...); @@ -38,19 +44,20 @@ int asn1c_compiled_output(arg_t *arg, const char *fmt, ...); /* Redirect output to a different stream. */ #define REDIR(foo) do { arg->target->target = foo; } while(0) - -#define INDENT(val) arg->indent_level += (val) -#define INDENTED(code) do { \ - INDENT(+1); \ - do { code; } while(0); \ - INDENT(-1); \ +#define INDENT_LEVEL \ + arg->target->destination[arg->target->target].indent_level +#define INDENT(val) INDENT_LEVEL += (val) +#define INDENTED(code) do { \ + INDENT(+1); \ + do { code; } while(0); \ + INDENT(-1); \ } while(0) -#define FLAT(code) do { \ - int _il = arg->indent_level; \ - arg->indent_level = 0; \ - do { code; } while(0); \ - arg->indent_level = _il; \ +#define FLAT(code) do { \ + int _il = INDENT_LEVEL; \ + INDENT_LEVEL = 0; \ + do { code; } while(0); \ + INDENT_LEVEL = _il; \ } while(0) #define EMBED(ev) do { \ @@ -68,11 +75,11 @@ int asn1c_compiled_output(arg_t *arg, const char *fmt, ...); /* Output a piece of text into a default stream */ #define OUT(fmt, args...) asn1c_compiled_output(arg, fmt, ##args) -#define OUT_NOINDENT(fmt, args...) do { \ - int _saved_indent = arg->indent_level; \ - arg->indent_level = 0; \ - OUT(fmt, ##args); \ - arg->indent_level = _saved_indent; \ +#define OUT_NOINDENT(fmt, args...) do { \ + int _saved_indent = INDENT_LEVEL; \ + INDENT_LEVEL = 0; \ + OUT(fmt, ##args); \ + INDENT_LEVEL = _saved_indent; \ } while(0) /* Generate #include line */ diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c index 3c630538d..add70e175 100644 --- a/libasn1compiler/asn1c_save.c +++ b/libasn1compiler/asn1c_save.c @@ -1,6 +1,10 @@ #include "asn1c_internal.h" #include "asn1c_compat.h" #include "asn1c_fdeps.h" +#include "asn1c_lang.h" +#include "asn1c_misc.h" +#include "asn1c_save.h" +#include "asn1c_out.h" static int asn1c_dump_streams(arg_t *arg, asn1c_fdeps_t *); static int asn1c_print_streams(arg_t *arg); @@ -114,14 +118,14 @@ asn1c_print_streams(arg_t *arg) { for(i = 1; i < OT_MAX; i++) { out_chunk_t *ot; - if(TQ_FIRST(&cs->targets[i]) == NULL) + if(TQ_FIRST(&cs->destination[i].chunks) == NULL) continue; printf("\n/*** <<< %s [%s] >>> ***/\n\n", _compiler_stream2str[i], expr->Identifier); - TQ_FOR(ot, &(cs->targets[i]), next) { + TQ_FOR(ot, &(cs->destination[i].chunks), next) { fwrite(ot->buf, ot->len, 1, stdout); } } @@ -178,18 +182,18 @@ asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *deps) { fprintf(fp_h, "#include \n\n"); - TQ_FOR(ot, &(cs->targets[OT_INCLUDES]), next) { + TQ_FOR(ot, &(cs->destination[OT_INCLUDES].chunks), next) { asn1c_activate_dependency(deps, 0, ot->buf); fwrite(ot->buf, ot->len, 1, fp_h); } fprintf(fp_h, "\n"); - TQ_FOR(ot, &(cs->targets[OT_DEPS]), next) + TQ_FOR(ot, &(cs->destination[OT_DEPS].chunks), next) fwrite(ot->buf, ot->len, 1, fp_h); fprintf(fp_h, "\n"); - TQ_FOR(ot, &(cs->targets[OT_TYPE_DECLS]), next) + TQ_FOR(ot, &(cs->destination[OT_TYPE_DECLS].chunks), next) fwrite(ot->buf, ot->len, 1, fp_h); fprintf(fp_h, "\n"); - TQ_FOR(ot, &(cs->targets[OT_FUNC_DECLS]), next) + TQ_FOR(ot, &(cs->destination[OT_FUNC_DECLS].chunks), next) fwrite(ot->buf, ot->len, 1, fp_h); fprintf(fp_h, "\n#ifdef __cplusplus\n}\n#endif\n\n" @@ -197,12 +201,14 @@ asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *deps) { header_id); fprintf(fp_c, "#include <%s.h>\n\n", expr->Identifier); /* Myself */ - TQ_FOR(ot, &(cs->targets[OT_STAT_DEFS]), next) + TQ_FOR(ot, &(cs->destination[OT_CTABLES].chunks), next) fwrite(ot->buf, ot->len, 1, fp_c); - TQ_FOR(ot, &(cs->targets[OT_CODE]), next) + TQ_FOR(ot, &(cs->destination[OT_CODE].chunks), next) + fwrite(ot->buf, ot->len, 1, fp_c); + TQ_FOR(ot, &(cs->destination[OT_STAT_DEFS].chunks), next) fwrite(ot->buf, ot->len, 1, fp_c); - assert(OT_MAX == 7); + assert(OT_MAX == 8); fclose(fp_c); fclose(fp_h); diff --git a/libasn1compiler/asn1compiler.c b/libasn1compiler/asn1compiler.c index 24e539a08..dd51156f9 100644 --- a/libasn1compiler/asn1compiler.c +++ b/libasn1compiler/asn1compiler.c @@ -1,4 +1,7 @@ #include "asn1c_internal.h" +#include "asn1c_lang.h" +#include "asn1c_out.h" +#include "asn1c_save.h" static void default_logger_cb(int, const char *fmt, ...); static int asn1c_compile_expr(arg_t *arg); @@ -73,7 +76,7 @@ asn1c_compile_expr(arg_t *arg) { type_cb = asn1_lang_map[expr->meta_type][expr->expr_type].type_cb; if(type_cb) { - if(arg->indent_level == 0) + if(arg->target->destination[OT_TYPE_DECLS].indent_level == 0) OUT("\n"); DEBUG("Compiling %s at line %d", @@ -134,7 +137,7 @@ asn1c_attach_streams(asn1p_expr_t *expr) { cs = expr->data; for(i = 0; i < OT_MAX; i++) { - TQ_INIT(&(cs->targets[i])); + TQ_INIT(&(cs->destination[i].chunks)); } return 0; From 7d576b304749679b9ac35ca0cc03ccc25dc27aff Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 20 Aug 2004 13:37:45 +0000 Subject: [PATCH 0171/1469] new test files git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@171 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/19-param-OK.asn1.-EF | 28 + tests/19-param-OK.asn1.-P | 315 ++++ tests/50-constraint-OK.asn1.-P | 2446 ++++++++++++++++++++++++++++++++ 3 files changed, 2789 insertions(+) create mode 100644 tests/19-param-OK.asn1.-EF create mode 100644 tests/19-param-OK.asn1.-P create mode 100644 tests/50-constraint-OK.asn1.-P diff --git a/tests/19-param-OK.asn1.-EF b/tests/19-param-OK.asn1.-EF new file mode 100644 index 000000000..8ece75cce --- /dev/null +++ b/tests/19-param-OK.asn1.-EF @@ -0,0 +1,28 @@ + +ModuleTestParam {iso(-1) org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 19 } +DEFINITIONS ::= +BEGIN + +SIGNED{ToBeSigned} ::= SEQUENCE { + toBeSigned ToBeSigned, + algorithm OBJECT IDENTIFIER, + signature BIT STRING +} + +Certificate ::= SEQUENCE { + toBeSigned SEQUENCE { + version INTEGER, + signature OBJECT IDENTIFIER, + issuer Name + }, + algorithm OBJECT IDENTIFIER, + signature BIT STRING +} + +Name ::= SEQUENCE OF RelativeDistinguishedName + +RelativeDistinguishedName ::= SET SIZE(1..MAX) OF IA5String (FROM("A".."Z" | "a".."z" | "0-9" | ",-.")) + +END diff --git a/tests/19-param-OK.asn1.-P b/tests/19-param-OK.asn1.-P new file mode 100644 index 000000000..a9f48e732 --- /dev/null +++ b/tests/19-param-OK.asn1.-P @@ -0,0 +1,315 @@ + +/*** <<< INCLUDES [Certificate] >>> ***/ + +#include +#include +#include +#include +#include + +/*** <<< DEPS [Certificate] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Certificate; + +/*** <<< TYPE-DECLS [Certificate] >>> ***/ + + +typedef struct Certificate { + struct toBeSigned { + INTEGER_t version; + OBJECT_IDENTIFIER_t signature; + Name_t issuer; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; + } toBeSigned; + OBJECT_IDENTIFIER_t algorithm; + BIT_STRING_t signature; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} Certificate_t; + +/*** <<< STAT-DEFS [Certificate] >>> ***/ + +static asn1_TYPE_member_t asn1_MBR_toBeSigned[] = { + { 0, offsetof(struct toBeSigned, version), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_INTEGER, + .memb_constraints = 0, /* Defer to actual type */ + .name = "version" + }, + { 0, offsetof(struct toBeSigned, signature), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_OBJECT_IDENTIFIER, + .memb_constraints = 0, /* Defer to actual type */ + .name = "signature" + }, + { 0, offsetof(struct toBeSigned, issuer), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_Name, + .memb_constraints = 0, /* Defer to actual type */ + .name = "issuer" + }, +}; +static ber_tlv_tag_t asn1_DEF_toBeSigned_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_TYPE_tag2member_t asn1_DEF_toBeSigned_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* version at 21 */ + { (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)), 1, 0, 0 }, /* signature at 22 */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, 0, 0 }, /* issuer at 24 */ +}; +static asn1_SEQUENCE_specifics_t asn1_DEF_toBeSigned_specs = { + sizeof(struct toBeSigned), + offsetof(struct toBeSigned, _ber_dec_ctx), + asn1_DEF_toBeSigned_tag2el, + 3, /* Count of tags in the map */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn1_TYPE_descriptor_t asn1_DEF_toBeSigned = { + "toBeSigned", + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_print, + SEQUENCE_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_toBeSigned_tags, + sizeof(asn1_DEF_toBeSigned_tags) + /sizeof(asn1_DEF_toBeSigned_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_toBeSigned, + 3, /* Elements count */ + &asn1_DEF_toBeSigned_specs /* Additional specs */ +}; + +static asn1_TYPE_member_t asn1_MBR_Certificate[] = { + { 0, offsetof(struct Certificate, toBeSigned), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_toBeSigned, + .memb_constraints = 0, /* Defer to actual type */ + .name = "toBeSigned" + }, + { 0, offsetof(struct Certificate, algorithm), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_OBJECT_IDENTIFIER, + .memb_constraints = 0, /* Defer to actual type */ + .name = "algorithm" + }, + { 0, offsetof(struct Certificate, signature), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_BIT_STRING, + .memb_constraints = 0, /* Defer to actual type */ + .name = "signature" + }, +}; +static ber_tlv_tag_t asn1_DEF_Certificate_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_TYPE_tag2member_t asn1_DEF_Certificate_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 2, 0, 0 }, /* signature at 18 */ + { (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)), 1, 0, 0 }, /* algorithm at 16 */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 }, /* toBeSigned at 21 */ +}; +static asn1_SEQUENCE_specifics_t asn1_DEF_Certificate_specs = { + sizeof(struct Certificate), + offsetof(struct Certificate, _ber_dec_ctx), + asn1_DEF_Certificate_tag2el, + 3, /* Count of tags in the map */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn1_TYPE_descriptor_t asn1_DEF_Certificate = { + "Certificate", + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_print, + SEQUENCE_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Certificate_tags, + sizeof(asn1_DEF_Certificate_tags) + /sizeof(asn1_DEF_Certificate_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_Certificate, + 3, /* Elements count */ + &asn1_DEF_Certificate_specs /* Additional specs */ +}; + + +/*** <<< INCLUDES [Name] >>> ***/ + +#include +#include +#include + +/*** <<< DEPS [Name] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Name; + +/*** <<< TYPE-DECLS [Name] >>> ***/ + + +typedef struct Name { + A_SEQUENCE_OF(struct RelativeDistinguishedName) list; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} Name_t; + +/*** <<< STAT-DEFS [Name] >>> ***/ + +static asn1_TYPE_member_t asn1_MBR_Name[] = { + { 0, 0, + .tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_RelativeDistinguishedName, + .memb_constraints = 0, /* Defer to actual type */ + .name = "" + }, +}; +static ber_tlv_tag_t asn1_DEF_Name_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_SET_OF_specifics_t asn1_DEF_Name_specs = { + sizeof(struct Name), + offsetof(struct Name, _ber_dec_ctx), +}; +asn1_TYPE_descriptor_t asn1_DEF_Name = { + "Name", + SEQUENCE_OF_constraint, + SEQUENCE_OF_decode_ber, + SEQUENCE_OF_encode_der, + SEQUENCE_OF_print, + SEQUENCE_OF_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Name_tags, + sizeof(asn1_DEF_Name_tags) + /sizeof(asn1_DEF_Name_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_Name, + 1, /* Single element */ + &asn1_DEF_Name_specs /* Additional specs */ +}; + + +/*** <<< INCLUDES [RelativeDistinguishedName] >>> ***/ + +#include +#include +#include + +/*** <<< DEPS [RelativeDistinguishedName] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_RelativeDistinguishedName; + +/*** <<< TYPE-DECLS [RelativeDistinguishedName] >>> ***/ + + +typedef struct RelativeDistinguishedName { + A_SET_OF(IA5String_t) list; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} RelativeDistinguishedName_t; + +/*** <<< CTABLES [RelativeDistinguishedName] >>> ***/ + +static int permitted_alphabet_table_1[256] = { +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0, /* ,-. */ +1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, /* 0 9 */ +0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ABCDEFGHIJKLMNO */ +1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, /* PQRSTUVWXYZ */ +0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* abcdefghijklmno */ +1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, /* pqrstuvwxyz */ +}; + +static int check_permitted_alphabet_1(const void *sptr) { + int *table = permitted_alphabet_table_1; + /* The underlying type is IA5String */ + const (null)_t *st = sptr; + uint8_t *ch = st->buf; + uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!table[cv]) return 0; + } + return 1; +} + + +/*** <<< CODE [RelativeDistinguishedName] >>> ***/ + +static int +memb_IA5String_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const (null)_t *st = sptr; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); + return -1; + } + + + if(check_permitted_alphabet_1(sptr)) { + /* Constraint check succeeded */ + return 1; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed", td->name); + return -1; + } +} + + +/*** <<< STAT-DEFS [RelativeDistinguishedName] >>> ***/ + +static asn1_TYPE_member_t asn1_MBR_RelativeDistinguishedName[] = { + { 0, 0, + .tag = (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_IA5String, + .memb_constraints = memb_IA5String_constraint, + .name = "" + }, +}; +static ber_tlv_tag_t asn1_DEF_RelativeDistinguishedName_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) +}; +static asn1_SET_OF_specifics_t asn1_DEF_RelativeDistinguishedName_specs = { + sizeof(struct RelativeDistinguishedName), + offsetof(struct RelativeDistinguishedName, _ber_dec_ctx), +}; +asn1_TYPE_descriptor_t asn1_DEF_RelativeDistinguishedName = { + "RelativeDistinguishedName", + SET_OF_constraint, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_print, + SET_OF_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_RelativeDistinguishedName_tags, + sizeof(asn1_DEF_RelativeDistinguishedName_tags) + /sizeof(asn1_DEF_RelativeDistinguishedName_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_RelativeDistinguishedName, + 1, /* Single element */ + &asn1_DEF_RelativeDistinguishedName_specs /* Additional specs */ +}; + diff --git a/tests/50-constraint-OK.asn1.-P b/tests/50-constraint-OK.asn1.-P new file mode 100644 index 000000000..746e8c2b7 --- /dev/null +++ b/tests/50-constraint-OK.asn1.-P @@ -0,0 +1,2446 @@ + +/*** <<< INCLUDES [Int1] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Int1] >>> ***/ + + +typedef INTEGER_t Int1_t; + + +/*** <<< FUNC-DECLS [Int1] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Int1; +asn_constr_check_f Int1_constraint; +ber_type_decoder_f Int1_decode_ber; +der_type_encoder_f Int1_encode_der; +asn_struct_print_f Int1_print; +asn_struct_free_f Int1_free; + +/*** <<< CODE [Int1] >>> ***/ + +int +Int1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_INTEGER.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using INTEGER, + * so adjust the DEF appropriately. + */ +static void +Int1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_INTEGER.ber_decoder; + td->der_encoder = asn1_DEF_INTEGER.der_encoder; + td->free_struct = asn1_DEF_INTEGER.free_struct; + td->print_struct = asn1_DEF_INTEGER.print_struct; + td->last_tag_form = asn1_DEF_INTEGER.last_tag_form; + td->elements = asn1_DEF_INTEGER.elements; + td->elements_count = asn1_DEF_INTEGER.elements_count; + td->specifics = asn1_DEF_INTEGER.specifics; +} + +ber_dec_rval_t +Int1_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + Int1_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +Int1_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Int1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +Int1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Int1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +Int1_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Int1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [Int1] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_Int1_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_Int1 = { + "Int1", + Int1_constraint, + Int1_decode_ber, + Int1_encode_der, + Int1_print, + Int1_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Int1_tags, + sizeof(asn1_DEF_Int1_tags) + /sizeof(asn1_DEF_Int1_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Int2] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Int2] >>> ***/ + + +typedef Int1_t Int2_t; + + +/*** <<< FUNC-DECLS [Int2] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Int2; +asn_constr_check_f Int2_constraint; +ber_type_decoder_f Int2_decode_ber; +der_type_encoder_f Int2_encode_der; +asn_struct_print_f Int2_print; +asn_struct_free_f Int2_free; + +/*** <<< CODE [Int2] >>> ***/ + +int +Int2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + const Int2_t *st = sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); + return -1; + } + + if(asn1_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large", td->name); + return -1; + } + + if((value >= 0)) { + /* Constraint check succeeded */ + return 1; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed", td->name); + return -1; + } +} + +/* + * This type is implemented using Int1, + * so adjust the DEF appropriately. + */ +static void +Int2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_Int1.ber_decoder; + td->der_encoder = asn1_DEF_Int1.der_encoder; + td->free_struct = asn1_DEF_Int1.free_struct; + td->print_struct = asn1_DEF_Int1.print_struct; + td->last_tag_form = asn1_DEF_Int1.last_tag_form; + td->elements = asn1_DEF_Int1.elements; + td->elements_count = asn1_DEF_Int1.elements_count; + td->specifics = asn1_DEF_Int1.specifics; +} + +ber_dec_rval_t +Int2_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + Int2_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +Int2_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Int2_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +Int2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Int2_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +Int2_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Int2_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [Int2] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_Int2_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_Int2 = { + "Int2", + Int2_constraint, + Int2_decode_ber, + Int2_encode_der, + Int2_print, + Int2_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Int2_tags, + sizeof(asn1_DEF_Int2_tags) + /sizeof(asn1_DEF_Int2_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Int3] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Int3] >>> ***/ + + +typedef Int2_t Int3_t; + + +/*** <<< FUNC-DECLS [Int3] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Int3; +asn_constr_check_f Int3_constraint; +ber_type_decoder_f Int3_decode_ber; +der_type_encoder_f Int3_encode_der; +asn_struct_print_f Int3_print; +asn_struct_free_f Int3_free; + +/*** <<< CODE [Int3] >>> ***/ + +int +Int3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + const Int3_t *st = sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); + return -1; + } + + if(asn1_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large", td->name); + return -1; + } + + if((value >= 0 && value <= 10)) { + /* Constraint check succeeded */ + return 1; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed", td->name); + return -1; + } +} + +/* + * This type is implemented using Int2, + * so adjust the DEF appropriately. + */ +static void +Int3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_Int2.ber_decoder; + td->der_encoder = asn1_DEF_Int2.der_encoder; + td->free_struct = asn1_DEF_Int2.free_struct; + td->print_struct = asn1_DEF_Int2.print_struct; + td->last_tag_form = asn1_DEF_Int2.last_tag_form; + td->elements = asn1_DEF_Int2.elements; + td->elements_count = asn1_DEF_Int2.elements_count; + td->specifics = asn1_DEF_Int2.specifics; +} + +ber_dec_rval_t +Int3_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + Int3_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +Int3_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Int3_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +Int3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Int3_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +Int3_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Int3_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [Int3] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_Int3_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_Int3 = { + "Int3", + Int3_constraint, + Int3_decode_ber, + Int3_encode_der, + Int3_print, + Int3_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Int3_tags, + sizeof(asn1_DEF_Int3_tags) + /sizeof(asn1_DEF_Int3_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Int4] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Int4] >>> ***/ + + +typedef Int3_t Int4_t; + + +/*** <<< FUNC-DECLS [Int4] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Int4; +asn_constr_check_f Int4_constraint; +ber_type_decoder_f Int4_decode_ber; +der_type_encoder_f Int4_encode_der; +asn_struct_print_f Int4_print; +asn_struct_free_f Int4_free; + +/*** <<< CODE [Int4] >>> ***/ + +int +Int4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + const Int4_t *st = sptr; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_Int3.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using Int3, + * so adjust the DEF appropriately. + */ +static void +Int4_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_Int3.ber_decoder; + td->der_encoder = asn1_DEF_Int3.der_encoder; + td->free_struct = asn1_DEF_Int3.free_struct; + td->print_struct = asn1_DEF_Int3.print_struct; + td->last_tag_form = asn1_DEF_Int3.last_tag_form; + td->elements = asn1_DEF_Int3.elements; + td->elements_count = asn1_DEF_Int3.elements_count; + td->specifics = asn1_DEF_Int3.specifics; +} + +ber_dec_rval_t +Int4_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + Int4_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +Int4_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Int4_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +Int4_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Int4_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +Int4_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Int4_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [Int4] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_Int4_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_Int4 = { + "Int4", + Int4_constraint, + Int4_decode_ber, + Int4_encode_der, + Int4_print, + Int4_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Int4_tags, + sizeof(asn1_DEF_Int4_tags) + /sizeof(asn1_DEF_Int4_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Int5] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Int5] >>> ***/ + + +typedef Int4_t Int5_t; + + +/*** <<< FUNC-DECLS [Int5] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Int5; +asn_constr_check_f Int5_constraint; +ber_type_decoder_f Int5_decode_ber; +der_type_encoder_f Int5_encode_der; +asn_struct_print_f Int5_print; +asn_struct_free_f Int5_free; + +/*** <<< CODE [Int5] >>> ***/ + +int +Int5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + const Int5_t *st = sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); + return -1; + } + + if(asn1_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large", td->name); + return -1; + } + + if((value == 5)) { + /* Constraint check succeeded */ + return 1; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed", td->name); + return -1; + } +} + +/* + * This type is implemented using Int4, + * so adjust the DEF appropriately. + */ +static void +Int5_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_Int4.ber_decoder; + td->der_encoder = asn1_DEF_Int4.der_encoder; + td->free_struct = asn1_DEF_Int4.free_struct; + td->print_struct = asn1_DEF_Int4.print_struct; + td->last_tag_form = asn1_DEF_Int4.last_tag_form; + td->elements = asn1_DEF_Int4.elements; + td->elements_count = asn1_DEF_Int4.elements_count; + td->specifics = asn1_DEF_Int4.specifics; +} + +ber_dec_rval_t +Int5_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + Int5_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +Int5_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Int5_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +Int5_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Int5_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +Int5_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Int5_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [Int5] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_Int5_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_Int5 = { + "Int5", + Int5_constraint, + Int5_decode_ber, + Int5_encode_der, + Int5_print, + Int5_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Int5_tags, + sizeof(asn1_DEF_Int5_tags) + /sizeof(asn1_DEF_Int5_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [ExtensibleExtensions] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [ExtensibleExtensions] >>> ***/ + + +typedef INTEGER_t ExtensibleExtensions_t; + + +/*** <<< FUNC-DECLS [ExtensibleExtensions] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_ExtensibleExtensions; +asn_constr_check_f ExtensibleExtensions_constraint; +ber_type_decoder_f ExtensibleExtensions_decode_ber; +der_type_encoder_f ExtensibleExtensions_encode_der; +asn_struct_print_f ExtensibleExtensions_print; +asn_struct_free_f ExtensibleExtensions_free; + +/*** <<< CODE [ExtensibleExtensions] >>> ***/ + +int +ExtensibleExtensions_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + const ExtensibleExtensions_t *st = sptr; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_INTEGER.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using INTEGER, + * so adjust the DEF appropriately. + */ +static void +ExtensibleExtensions_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_INTEGER.ber_decoder; + td->der_encoder = asn1_DEF_INTEGER.der_encoder; + td->free_struct = asn1_DEF_INTEGER.free_struct; + td->print_struct = asn1_DEF_INTEGER.print_struct; + td->last_tag_form = asn1_DEF_INTEGER.last_tag_form; + td->elements = asn1_DEF_INTEGER.elements; + td->elements_count = asn1_DEF_INTEGER.elements_count; + td->specifics = asn1_DEF_INTEGER.specifics; +} + +ber_dec_rval_t +ExtensibleExtensions_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + ExtensibleExtensions_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +ExtensibleExtensions_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + ExtensibleExtensions_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +ExtensibleExtensions_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + ExtensibleExtensions_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +ExtensibleExtensions_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + ExtensibleExtensions_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [ExtensibleExtensions] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_ExtensibleExtensions_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_ExtensibleExtensions = { + "ExtensibleExtensions", + ExtensibleExtensions_constraint, + ExtensibleExtensions_decode_ber, + ExtensibleExtensions_encode_der, + ExtensibleExtensions_print, + ExtensibleExtensions_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_ExtensibleExtensions_tags, + sizeof(asn1_DEF_ExtensibleExtensions_tags) + /sizeof(asn1_DEF_ExtensibleExtensions_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Str1] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Str1] >>> ***/ + + +typedef IA5String_t Str1_t; + + +/*** <<< FUNC-DECLS [Str1] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Str1; +asn_constr_check_f Str1_constraint; +ber_type_decoder_f Str1_decode_ber; +der_type_encoder_f Str1_encode_der; +asn_struct_print_f Str1_print; +asn_struct_free_f Str1_free; + +/*** <<< CODE [Str1] >>> ***/ + +int +Str1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_IA5String.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using IA5String, + * so adjust the DEF appropriately. + */ +static void +Str1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_IA5String.ber_decoder; + td->der_encoder = asn1_DEF_IA5String.der_encoder; + td->free_struct = asn1_DEF_IA5String.free_struct; + td->print_struct = asn1_DEF_IA5String.print_struct; + td->last_tag_form = asn1_DEF_IA5String.last_tag_form; + td->elements = asn1_DEF_IA5String.elements; + td->elements_count = asn1_DEF_IA5String.elements_count; + td->specifics = asn1_DEF_IA5String.specifics; +} + +ber_dec_rval_t +Str1_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + Str1_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +Str1_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Str1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +Str1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Str1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +Str1_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Str1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [Str1] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_Str1_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_Str1 = { + "Str1", + Str1_constraint, + Str1_decode_ber, + Str1_encode_der, + Str1_print, + Str1_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Str1_tags, + sizeof(asn1_DEF_Str1_tags) + /sizeof(asn1_DEF_Str1_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Str2] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Str2] >>> ***/ + + +typedef Str1_t Str2_t; + + +/*** <<< FUNC-DECLS [Str2] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Str2; +asn_constr_check_f Str2_constraint; +ber_type_decoder_f Str2_decode_ber; +der_type_encoder_f Str2_encode_der; +asn_struct_print_f Str2_print; +asn_struct_free_f Str2_free; + +/*** <<< CTABLES [Str2] >>> ***/ + +static int check_permitted_alphabet_1(const void *sptr) { + /* The underlying type is IA5String */ + const Str2_t *st = sptr; + uint8_t *ch = st->buf; + uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!(cv <= 127)) return 0; + } + return 1; +} + + +/*** <<< CODE [Str2] >>> ***/ + +int +Str2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + const Str2_t *st = sptr; + size_t size; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); + return -1; + } + + size = st->size; + + if(((size <= 20) || (size >= 25 && size <= 30)) + && check_permitted_alphabet_1(sptr)) { + /* Constraint check succeeded */ + return 1; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed", td->name); + return -1; + } +} + +/* + * This type is implemented using Str1, + * so adjust the DEF appropriately. + */ +static void +Str2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_Str1.ber_decoder; + td->der_encoder = asn1_DEF_Str1.der_encoder; + td->free_struct = asn1_DEF_Str1.free_struct; + td->print_struct = asn1_DEF_Str1.print_struct; + td->last_tag_form = asn1_DEF_Str1.last_tag_form; + td->elements = asn1_DEF_Str1.elements; + td->elements_count = asn1_DEF_Str1.elements_count; + td->specifics = asn1_DEF_Str1.specifics; +} + +ber_dec_rval_t +Str2_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + Str2_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +Str2_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Str2_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +Str2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Str2_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +Str2_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Str2_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [Str2] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_Str2_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_Str2 = { + "Str2", + Str2_constraint, + Str2_decode_ber, + Str2_encode_der, + Str2_print, + Str2_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Str2_tags, + sizeof(asn1_DEF_Str2_tags) + /sizeof(asn1_DEF_Str2_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Str3] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Str3] >>> ***/ + + +typedef Str2_t Str3_t; + + +/*** <<< FUNC-DECLS [Str3] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Str3; +asn_constr_check_f Str3_constraint; +ber_type_decoder_f Str3_decode_ber; +der_type_encoder_f Str3_encode_der; +asn_struct_print_f Str3_print; +asn_struct_free_f Str3_free; + +/*** <<< CTABLES [Str3] >>> ***/ + +static int permitted_alphabet_table_2[256] = { +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, /* ABC */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0, /* def */ +}; + +static int check_permitted_alphabet_2(const void *sptr) { + int *table = permitted_alphabet_table_2; + /* The underlying type is IA5String */ + const Str3_t *st = sptr; + uint8_t *ch = st->buf; + uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!table[cv]) return 0; + } + return 1; +} + + +/*** <<< CODE [Str3] >>> ***/ + +int +Str3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + const Str3_t *st = sptr; + size_t size; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); + return -1; + } + + size = st->size; + + if(((size >= 10 && size <= 20) || (size >= 25 && size <= 27)) + && check_permitted_alphabet_2(sptr)) { + /* Constraint check succeeded */ + return 1; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed", td->name); + return -1; + } +} + +/* + * This type is implemented using Str2, + * so adjust the DEF appropriately. + */ +static void +Str3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_Str2.ber_decoder; + td->der_encoder = asn1_DEF_Str2.der_encoder; + td->free_struct = asn1_DEF_Str2.free_struct; + td->print_struct = asn1_DEF_Str2.print_struct; + td->last_tag_form = asn1_DEF_Str2.last_tag_form; + td->elements = asn1_DEF_Str2.elements; + td->elements_count = asn1_DEF_Str2.elements_count; + td->specifics = asn1_DEF_Str2.specifics; +} + +ber_dec_rval_t +Str3_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + Str3_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +Str3_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Str3_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +Str3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Str3_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +Str3_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Str3_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [Str3] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_Str3_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_Str3 = { + "Str3", + Str3_constraint, + Str3_decode_ber, + Str3_encode_der, + Str3_print, + Str3_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Str3_tags, + sizeof(asn1_DEF_Str3_tags) + /sizeof(asn1_DEF_Str3_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [PER-Visible] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [PER-Visible] >>> ***/ + + +typedef IA5String_t PER_Visible_t; + + +/*** <<< FUNC-DECLS [PER-Visible] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_PER_Visible; +asn_constr_check_f PER_Visible_constraint; +ber_type_decoder_f PER_Visible_decode_ber; +der_type_encoder_f PER_Visible_encode_der; +asn_struct_print_f PER_Visible_print; +asn_struct_free_f PER_Visible_free; + +/*** <<< CTABLES [PER-Visible] >>> ***/ + +static int check_permitted_alphabet_3(const void *sptr) { + /* The underlying type is IA5String */ + const PER_Visible_t *st = sptr; + uint8_t *ch = st->buf; + uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!(cv >= 65 && cv <= 70)) return 0; + } + return 1; +} + + +/*** <<< CODE [PER-Visible] >>> ***/ + +int +PER_Visible_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + const PER_Visible_t *st = sptr; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); + return -1; + } + + + if(check_permitted_alphabet_3(sptr)) { + /* Constraint check succeeded */ + return 1; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed", td->name); + return -1; + } +} + +/* + * This type is implemented using IA5String, + * so adjust the DEF appropriately. + */ +static void +PER_Visible_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_IA5String.ber_decoder; + td->der_encoder = asn1_DEF_IA5String.der_encoder; + td->free_struct = asn1_DEF_IA5String.free_struct; + td->print_struct = asn1_DEF_IA5String.print_struct; + td->last_tag_form = asn1_DEF_IA5String.last_tag_form; + td->elements = asn1_DEF_IA5String.elements; + td->elements_count = asn1_DEF_IA5String.elements_count; + td->specifics = asn1_DEF_IA5String.specifics; +} + +ber_dec_rval_t +PER_Visible_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + PER_Visible_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +PER_Visible_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + PER_Visible_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +PER_Visible_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + PER_Visible_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +PER_Visible_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + PER_Visible_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [PER-Visible] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_PER_Visible_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_PER_Visible = { + "PER-Visible", + PER_Visible_constraint, + PER_Visible_decode_ber, + PER_Visible_encode_der, + PER_Visible_print, + PER_Visible_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_PER_Visible_tags, + sizeof(asn1_DEF_PER_Visible_tags) + /sizeof(asn1_DEF_PER_Visible_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [PER-Visible-2] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [PER-Visible-2] >>> ***/ + + +typedef PER_Visible_t PER_Visible_2_t; + + +/*** <<< FUNC-DECLS [PER-Visible-2] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_PER_Visible_2; +asn_constr_check_f PER_Visible_2_constraint; +ber_type_decoder_f PER_Visible_2_decode_ber; +der_type_encoder_f PER_Visible_2_encode_der; +asn_struct_print_f PER_Visible_2_print; +asn_struct_free_f PER_Visible_2_free; + +/*** <<< CTABLES [PER-Visible-2] >>> ***/ + +static int check_permitted_alphabet_4(const void *sptr) { + /* The underlying type is IA5String */ + const PER_Visible_2_t *st = sptr; + uint8_t *ch = st->buf; + uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!(cv >= 69 && cv <= 70)) return 0; + } + return 1; +} + + +/*** <<< CODE [PER-Visible-2] >>> ***/ + +int +PER_Visible_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + const PER_Visible_2_t *st = sptr; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); + return -1; + } + + + if(check_permitted_alphabet_4(sptr)) { + /* Constraint check succeeded */ + return 1; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed", td->name); + return -1; + } +} + +/* + * This type is implemented using PER_Visible, + * so adjust the DEF appropriately. + */ +static void +PER_Visible_2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn1_DEF_PER_Visible.der_encoder; + td->free_struct = asn1_DEF_PER_Visible.free_struct; + td->print_struct = asn1_DEF_PER_Visible.print_struct; + td->last_tag_form = asn1_DEF_PER_Visible.last_tag_form; + td->elements = asn1_DEF_PER_Visible.elements; + td->elements_count = asn1_DEF_PER_Visible.elements_count; + td->specifics = asn1_DEF_PER_Visible.specifics; +} + +ber_dec_rval_t +PER_Visible_2_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + PER_Visible_2_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +PER_Visible_2_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + PER_Visible_2_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +PER_Visible_2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + PER_Visible_2_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +PER_Visible_2_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + PER_Visible_2_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [PER-Visible-2] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_PER_Visible_2_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_PER_Visible_2 = { + "PER-Visible-2", + PER_Visible_2_constraint, + PER_Visible_2_decode_ber, + PER_Visible_2_encode_der, + PER_Visible_2_print, + PER_Visible_2_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_PER_Visible_2_tags, + sizeof(asn1_DEF_PER_Visible_2_tags) + /sizeof(asn1_DEF_PER_Visible_2_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Not-PER-Visible-1] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Not-PER-Visible-1] >>> ***/ + + +typedef PER_Visible_t Not_PER_Visible_1_t; + + +/*** <<< FUNC-DECLS [Not-PER-Visible-1] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_1; +asn_constr_check_f Not_PER_Visible_1_constraint; +ber_type_decoder_f Not_PER_Visible_1_decode_ber; +der_type_encoder_f Not_PER_Visible_1_encode_der; +asn_struct_print_f Not_PER_Visible_1_print; +asn_struct_free_f Not_PER_Visible_1_free; + +/*** <<< CTABLES [Not-PER-Visible-1] >>> ***/ + +static int check_permitted_alphabet_5(const void *sptr) { + /* The underlying type is IA5String */ + const Not_PER_Visible_1_t *st = sptr; + uint8_t *ch = st->buf; + uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!(cv >= 65 && cv <= 70)) return 0; + } + return 1; +} + + +/*** <<< CODE [Not-PER-Visible-1] >>> ***/ + +int +Not_PER_Visible_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + const Not_PER_Visible_1_t *st = sptr; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); + return -1; + } + + + if(check_permitted_alphabet_5(sptr)) { + /* Constraint check succeeded */ + return 1; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed", td->name); + return -1; + } +} + +/* + * This type is implemented using PER_Visible, + * so adjust the DEF appropriately. + */ +static void +Not_PER_Visible_1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn1_DEF_PER_Visible.der_encoder; + td->free_struct = asn1_DEF_PER_Visible.free_struct; + td->print_struct = asn1_DEF_PER_Visible.print_struct; + td->last_tag_form = asn1_DEF_PER_Visible.last_tag_form; + td->elements = asn1_DEF_PER_Visible.elements; + td->elements_count = asn1_DEF_PER_Visible.elements_count; + td->specifics = asn1_DEF_PER_Visible.specifics; +} + +ber_dec_rval_t +Not_PER_Visible_1_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + Not_PER_Visible_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +Not_PER_Visible_1_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Not_PER_Visible_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +Not_PER_Visible_1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Not_PER_Visible_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +Not_PER_Visible_1_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Not_PER_Visible_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [Not-PER-Visible-1] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_Not_PER_Visible_1_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_1 = { + "Not-PER-Visible-1", + Not_PER_Visible_1_constraint, + Not_PER_Visible_1_decode_ber, + Not_PER_Visible_1_encode_der, + Not_PER_Visible_1_print, + Not_PER_Visible_1_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Not_PER_Visible_1_tags, + sizeof(asn1_DEF_Not_PER_Visible_1_tags) + /sizeof(asn1_DEF_Not_PER_Visible_1_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Not-PER-Visible-2] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Not-PER-Visible-2] >>> ***/ + + +typedef PER_Visible_t Not_PER_Visible_2_t; + + +/*** <<< FUNC-DECLS [Not-PER-Visible-2] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_2; +asn_constr_check_f Not_PER_Visible_2_constraint; +ber_type_decoder_f Not_PER_Visible_2_decode_ber; +der_type_encoder_f Not_PER_Visible_2_encode_der; +asn_struct_print_f Not_PER_Visible_2_print; +asn_struct_free_f Not_PER_Visible_2_free; + +/*** <<< CODE [Not-PER-Visible-2] >>> ***/ + +int +Not_PER_Visible_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + const Not_PER_Visible_2_t *st = sptr; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_PER_Visible.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using PER_Visible, + * so adjust the DEF appropriately. + */ +static void +Not_PER_Visible_2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn1_DEF_PER_Visible.der_encoder; + td->free_struct = asn1_DEF_PER_Visible.free_struct; + td->print_struct = asn1_DEF_PER_Visible.print_struct; + td->last_tag_form = asn1_DEF_PER_Visible.last_tag_form; + td->elements = asn1_DEF_PER_Visible.elements; + td->elements_count = asn1_DEF_PER_Visible.elements_count; + td->specifics = asn1_DEF_PER_Visible.specifics; +} + +ber_dec_rval_t +Not_PER_Visible_2_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + Not_PER_Visible_2_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +Not_PER_Visible_2_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Not_PER_Visible_2_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +Not_PER_Visible_2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Not_PER_Visible_2_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +Not_PER_Visible_2_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Not_PER_Visible_2_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [Not-PER-Visible-2] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_Not_PER_Visible_2_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_2 = { + "Not-PER-Visible-2", + Not_PER_Visible_2_constraint, + Not_PER_Visible_2_decode_ber, + Not_PER_Visible_2_encode_der, + Not_PER_Visible_2_print, + Not_PER_Visible_2_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Not_PER_Visible_2_tags, + sizeof(asn1_DEF_Not_PER_Visible_2_tags) + /sizeof(asn1_DEF_Not_PER_Visible_2_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Not-PER-Visible-3] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Not-PER-Visible-3] >>> ***/ + + +typedef PER_Visible_t Not_PER_Visible_3_t; + + +/*** <<< FUNC-DECLS [Not-PER-Visible-3] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_3; +asn_constr_check_f Not_PER_Visible_3_constraint; +ber_type_decoder_f Not_PER_Visible_3_decode_ber; +der_type_encoder_f Not_PER_Visible_3_encode_der; +asn_struct_print_f Not_PER_Visible_3_print; +asn_struct_free_f Not_PER_Visible_3_free; + +/*** <<< CODE [Not-PER-Visible-3] >>> ***/ + +int +Not_PER_Visible_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + const Not_PER_Visible_3_t *st = sptr; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_PER_Visible.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using PER_Visible, + * so adjust the DEF appropriately. + */ +static void +Not_PER_Visible_3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn1_DEF_PER_Visible.der_encoder; + td->free_struct = asn1_DEF_PER_Visible.free_struct; + td->print_struct = asn1_DEF_PER_Visible.print_struct; + td->last_tag_form = asn1_DEF_PER_Visible.last_tag_form; + td->elements = asn1_DEF_PER_Visible.elements; + td->elements_count = asn1_DEF_PER_Visible.elements_count; + td->specifics = asn1_DEF_PER_Visible.specifics; +} + +ber_dec_rval_t +Not_PER_Visible_3_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + Not_PER_Visible_3_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +Not_PER_Visible_3_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Not_PER_Visible_3_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +Not_PER_Visible_3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Not_PER_Visible_3_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +Not_PER_Visible_3_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Not_PER_Visible_3_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [Not-PER-Visible-3] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_Not_PER_Visible_3_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_3 = { + "Not-PER-Visible-3", + Not_PER_Visible_3_constraint, + Not_PER_Visible_3_decode_ber, + Not_PER_Visible_3_encode_der, + Not_PER_Visible_3_print, + Not_PER_Visible_3_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Not_PER_Visible_3_tags, + sizeof(asn1_DEF_Not_PER_Visible_3_tags) + /sizeof(asn1_DEF_Not_PER_Visible_3_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [SIZE-but-not-FROM] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [SIZE-but-not-FROM] >>> ***/ + + +typedef PER_Visible_t SIZE_but_not_FROM_t; + + +/*** <<< FUNC-DECLS [SIZE-but-not-FROM] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_SIZE_but_not_FROM; +asn_constr_check_f SIZE_but_not_FROM_constraint; +ber_type_decoder_f SIZE_but_not_FROM_decode_ber; +der_type_encoder_f SIZE_but_not_FROM_encode_der; +asn_struct_print_f SIZE_but_not_FROM_print; +asn_struct_free_f SIZE_but_not_FROM_free; + +/*** <<< CTABLES [SIZE-but-not-FROM] >>> ***/ + +static int check_permitted_alphabet_6(const void *sptr) { + /* The underlying type is IA5String */ + const SIZE_but_not_FROM_t *st = sptr; + uint8_t *ch = st->buf; + uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!(cv >= 65 && cv <= 70)) return 0; + } + return 1; +} + + +/*** <<< CODE [SIZE-but-not-FROM] >>> ***/ + +int +SIZE_but_not_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + const SIZE_but_not_FROM_t *st = sptr; + size_t size; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); + return -1; + } + + size = st->size; + + if((size >= 1 && size <= 4) + && check_permitted_alphabet_6(sptr)) { + /* Constraint check succeeded */ + return 1; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed", td->name); + return -1; + } +} + +/* + * This type is implemented using PER_Visible, + * so adjust the DEF appropriately. + */ +static void +SIZE_but_not_FROM_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn1_DEF_PER_Visible.der_encoder; + td->free_struct = asn1_DEF_PER_Visible.free_struct; + td->print_struct = asn1_DEF_PER_Visible.print_struct; + td->last_tag_form = asn1_DEF_PER_Visible.last_tag_form; + td->elements = asn1_DEF_PER_Visible.elements; + td->elements_count = asn1_DEF_PER_Visible.elements_count; + td->specifics = asn1_DEF_PER_Visible.specifics; +} + +ber_dec_rval_t +SIZE_but_not_FROM_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + SIZE_but_not_FROM_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +SIZE_but_not_FROM_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + SIZE_but_not_FROM_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +SIZE_but_not_FROM_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + SIZE_but_not_FROM_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +SIZE_but_not_FROM_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + SIZE_but_not_FROM_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [SIZE-but-not-FROM] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_SIZE_but_not_FROM_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_SIZE_but_not_FROM = { + "SIZE-but-not-FROM", + SIZE_but_not_FROM_constraint, + SIZE_but_not_FROM_decode_ber, + SIZE_but_not_FROM_encode_der, + SIZE_but_not_FROM_print, + SIZE_but_not_FROM_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_SIZE_but_not_FROM_tags, + sizeof(asn1_DEF_SIZE_but_not_FROM_tags) + /sizeof(asn1_DEF_SIZE_but_not_FROM_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [SIZE-and-FROM] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [SIZE-and-FROM] >>> ***/ + + +typedef PER_Visible_t SIZE_and_FROM_t; + + +/*** <<< FUNC-DECLS [SIZE-and-FROM] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_SIZE_and_FROM; +asn_constr_check_f SIZE_and_FROM_constraint; +ber_type_decoder_f SIZE_and_FROM_decode_ber; +der_type_encoder_f SIZE_and_FROM_encode_der; +asn_struct_print_f SIZE_and_FROM_print; +asn_struct_free_f SIZE_and_FROM_free; + +/*** <<< CTABLES [SIZE-and-FROM] >>> ***/ + +static int check_permitted_alphabet_7(const void *sptr) { + /* The underlying type is IA5String */ + const SIZE_and_FROM_t *st = sptr; + uint8_t *ch = st->buf; + uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!(cv >= 65 && cv <= 68)) return 0; + } + return 1; +} + + +/*** <<< CODE [SIZE-and-FROM] >>> ***/ + +int +SIZE_and_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + const SIZE_and_FROM_t *st = sptr; + size_t size; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); + return -1; + } + + size = st->size; + + if((size >= 1 && size <= 4) + && check_permitted_alphabet_7(sptr)) { + /* Constraint check succeeded */ + return 1; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed", td->name); + return -1; + } +} + +/* + * This type is implemented using PER_Visible, + * so adjust the DEF appropriately. + */ +static void +SIZE_and_FROM_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn1_DEF_PER_Visible.der_encoder; + td->free_struct = asn1_DEF_PER_Visible.free_struct; + td->print_struct = asn1_DEF_PER_Visible.print_struct; + td->last_tag_form = asn1_DEF_PER_Visible.last_tag_form; + td->elements = asn1_DEF_PER_Visible.elements; + td->elements_count = asn1_DEF_PER_Visible.elements_count; + td->specifics = asn1_DEF_PER_Visible.specifics; +} + +ber_dec_rval_t +SIZE_and_FROM_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + SIZE_and_FROM_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +SIZE_and_FROM_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + SIZE_and_FROM_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +SIZE_and_FROM_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + SIZE_and_FROM_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +SIZE_and_FROM_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + SIZE_and_FROM_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [SIZE-and-FROM] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_SIZE_and_FROM_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_SIZE_and_FROM = { + "SIZE-and-FROM", + SIZE_and_FROM_constraint, + SIZE_and_FROM_decode_ber, + SIZE_and_FROM_encode_der, + SIZE_and_FROM_print, + SIZE_and_FROM_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_SIZE_and_FROM_tags, + sizeof(asn1_DEF_SIZE_and_FROM_tags) + /sizeof(asn1_DEF_SIZE_and_FROM_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Neither-SIZE-nor-FROM] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Neither-SIZE-nor-FROM] >>> ***/ + + +typedef PER_Visible_t Neither_SIZE_nor_FROM_t; + + +/*** <<< FUNC-DECLS [Neither-SIZE-nor-FROM] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Neither_SIZE_nor_FROM; +asn_constr_check_f Neither_SIZE_nor_FROM_constraint; +ber_type_decoder_f Neither_SIZE_nor_FROM_decode_ber; +der_type_encoder_f Neither_SIZE_nor_FROM_encode_der; +asn_struct_print_f Neither_SIZE_nor_FROM_print; +asn_struct_free_f Neither_SIZE_nor_FROM_free; + +/*** <<< CTABLES [Neither-SIZE-nor-FROM] >>> ***/ + +static int check_permitted_alphabet_8(const void *sptr) { + /* The underlying type is IA5String */ + const Neither_SIZE_nor_FROM_t *st = sptr; + uint8_t *ch = st->buf; + uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!(cv >= 65 && cv <= 70)) return 0; + } + return 1; +} + + +/*** <<< CODE [Neither-SIZE-nor-FROM] >>> ***/ + +int +Neither_SIZE_nor_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + const Neither_SIZE_nor_FROM_t *st = sptr; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); + return -1; + } + + + if(check_permitted_alphabet_8(sptr)) { + /* Constraint check succeeded */ + return 1; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed", td->name); + return -1; + } +} + +/* + * This type is implemented using PER_Visible, + * so adjust the DEF appropriately. + */ +static void +Neither_SIZE_nor_FROM_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn1_DEF_PER_Visible.der_encoder; + td->free_struct = asn1_DEF_PER_Visible.free_struct; + td->print_struct = asn1_DEF_PER_Visible.print_struct; + td->last_tag_form = asn1_DEF_PER_Visible.last_tag_form; + td->elements = asn1_DEF_PER_Visible.elements; + td->elements_count = asn1_DEF_PER_Visible.elements_count; + td->specifics = asn1_DEF_PER_Visible.specifics; +} + +ber_dec_rval_t +Neither_SIZE_nor_FROM_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + Neither_SIZE_nor_FROM_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +Neither_SIZE_nor_FROM_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Neither_SIZE_nor_FROM_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +Neither_SIZE_nor_FROM_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Neither_SIZE_nor_FROM_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +Neither_SIZE_nor_FROM_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Neither_SIZE_nor_FROM_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [Neither-SIZE-nor-FROM] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_Neither_SIZE_nor_FROM_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_Neither_SIZE_nor_FROM = { + "Neither-SIZE-nor-FROM", + Neither_SIZE_nor_FROM_constraint, + Neither_SIZE_nor_FROM_decode_ber, + Neither_SIZE_nor_FROM_encode_der, + Neither_SIZE_nor_FROM_print, + Neither_SIZE_nor_FROM_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Neither_SIZE_nor_FROM_tags, + sizeof(asn1_DEF_Neither_SIZE_nor_FROM_tags) + /sizeof(asn1_DEF_Neither_SIZE_nor_FROM_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Utf8-3] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Utf8-3] >>> ***/ + + +typedef Utf8_2_t Utf8_3_t; + + +/*** <<< FUNC-DECLS [Utf8-3] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Utf8_3; +asn_constr_check_f Utf8_3_constraint; +ber_type_decoder_f Utf8_3_decode_ber; +der_type_encoder_f Utf8_3_encode_der; +asn_struct_print_f Utf8_3_print; +asn_struct_free_f Utf8_3_free; + +/*** <<< CTABLES [Utf8-3] >>> ***/ + +static int permitted_alphabet_table_9[128] = { +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ABCDEFGHIJKLMNO */ +1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, /* PQRSTUVWXYZ */ +0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* abcdefghijklmno */ +1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, /* pqrstuvwxyz */ +}; + +static int check_permitted_alphabet_9(const void *sptr) { + int *table = permitted_alphabet_table_9; + /* The underlying type is UTF8String */ + const Utf8_3_t *st = sptr; + uint8_t *ch = st->buf; + uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(cv >= 0x80) return 0; + if(!table[cv]) return 0; + } + return 1; +} + + +/*** <<< CODE [Utf8-3] >>> ***/ + +int +Utf8_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + const Utf8_3_t *st = sptr; + size_t size; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); + return -1; + } + + size = UTF8String_length(st, td->name, app_errlog, app_key); + if(size == (size_t)-1) return -1; + + if((size >= 1 && size <= 2) + && check_permitted_alphabet_9(sptr)) { + /* Constraint check succeeded */ + return 1; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed", td->name); + return -1; + } +} + +/* + * This type is implemented using Utf8_2, + * so adjust the DEF appropriately. + */ +static void +Utf8_3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_Utf8_2.ber_decoder; + td->der_encoder = asn1_DEF_Utf8_2.der_encoder; + td->free_struct = asn1_DEF_Utf8_2.free_struct; + td->print_struct = asn1_DEF_Utf8_2.print_struct; + td->last_tag_form = asn1_DEF_Utf8_2.last_tag_form; + td->elements = asn1_DEF_Utf8_2.elements; + td->elements_count = asn1_DEF_Utf8_2.elements_count; + td->specifics = asn1_DEF_Utf8_2.specifics; +} + +ber_dec_rval_t +Utf8_3_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + Utf8_3_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +Utf8_3_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_3_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +Utf8_3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_3_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +Utf8_3_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Utf8_3_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [Utf8-3] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_Utf8_3_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_Utf8_3 = { + "Utf8-3", + Utf8_3_constraint, + Utf8_3_decode_ber, + Utf8_3_encode_der, + Utf8_3_print, + Utf8_3_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Utf8_3_tags, + sizeof(asn1_DEF_Utf8_3_tags) + /sizeof(asn1_DEF_Utf8_3_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Utf8-2] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Utf8-2] >>> ***/ + + +typedef Utf8_1_t Utf8_2_t; + + +/*** <<< FUNC-DECLS [Utf8-2] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Utf8_2; +asn_constr_check_f Utf8_2_constraint; +ber_type_decoder_f Utf8_2_decode_ber; +der_type_encoder_f Utf8_2_encode_der; +asn_struct_print_f Utf8_2_print; +asn_struct_free_f Utf8_2_free; + +/*** <<< CODE [Utf8-2] >>> ***/ + +int +Utf8_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + const Utf8_2_t *st = sptr; + size_t size; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); + return -1; + } + + size = UTF8String_length(st, td->name, app_errlog, app_key); + if(size == (size_t)-1) return -1; + + if((size >= 1 && size <= 2)) { + /* Constraint check succeeded */ + return 1; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed", td->name); + return -1; + } +} + +/* + * This type is implemented using Utf8_1, + * so adjust the DEF appropriately. + */ +static void +Utf8_2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_Utf8_1.ber_decoder; + td->der_encoder = asn1_DEF_Utf8_1.der_encoder; + td->free_struct = asn1_DEF_Utf8_1.free_struct; + td->print_struct = asn1_DEF_Utf8_1.print_struct; + td->last_tag_form = asn1_DEF_Utf8_1.last_tag_form; + td->elements = asn1_DEF_Utf8_1.elements; + td->elements_count = asn1_DEF_Utf8_1.elements_count; + td->specifics = asn1_DEF_Utf8_1.specifics; +} + +ber_dec_rval_t +Utf8_2_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + Utf8_2_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +Utf8_2_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_2_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +Utf8_2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_2_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +Utf8_2_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Utf8_2_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [Utf8-2] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_Utf8_2_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_Utf8_2 = { + "Utf8-2", + Utf8_2_constraint, + Utf8_2_decode_ber, + Utf8_2_encode_der, + Utf8_2_print, + Utf8_2_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Utf8_2_tags, + sizeof(asn1_DEF_Utf8_2_tags) + /sizeof(asn1_DEF_Utf8_2_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Utf8-1] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Utf8-1] >>> ***/ + + +typedef UTF8String_t Utf8_1_t; + + +/*** <<< FUNC-DECLS [Utf8-1] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Utf8_1; +asn_constr_check_f Utf8_1_constraint; +ber_type_decoder_f Utf8_1_decode_ber; +der_type_encoder_f Utf8_1_encode_der; +asn_struct_print_f Utf8_1_print; +asn_struct_free_f Utf8_1_free; + +/*** <<< CODE [Utf8-1] >>> ***/ + +int +Utf8_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_UTF8String.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using UTF8String, + * so adjust the DEF appropriately. + */ +static void +Utf8_1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_UTF8String.ber_decoder; + td->der_encoder = asn1_DEF_UTF8String.der_encoder; + td->free_struct = asn1_DEF_UTF8String.free_struct; + td->print_struct = asn1_DEF_UTF8String.print_struct; + td->last_tag_form = asn1_DEF_UTF8String.last_tag_form; + td->elements = asn1_DEF_UTF8String.elements; + td->elements_count = asn1_DEF_UTF8String.elements_count; + td->specifics = asn1_DEF_UTF8String.specifics; +} + +ber_dec_rval_t +Utf8_1_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + Utf8_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +Utf8_1_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +Utf8_1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +Utf8_1_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Utf8_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [Utf8-1] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_Utf8_1_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_Utf8_1 = { + "Utf8-1", + Utf8_1_constraint, + Utf8_1_decode_ber, + Utf8_1_encode_der, + Utf8_1_print, + Utf8_1_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Utf8_1_tags, + sizeof(asn1_DEF_Utf8_1_tags) + /sizeof(asn1_DEF_Utf8_1_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + From cfa6f74681e7ce4312b23d9c449cd1028b1e2f35 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 20 Aug 2004 13:38:07 +0000 Subject: [PATCH 0172/1469] new file git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@172 59561ff5-6e30-0410-9f3c-9617f08c8826 --- FAQ | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 FAQ diff --git a/FAQ b/FAQ new file mode 100644 index 000000000..97b097eb7 --- /dev/null +++ b/FAQ @@ -0,0 +1,14 @@ + +Q: Your compiler supplies a der_encode() procedure. How do I encode BER? +A: + The DER (and CER) are stricter subsets of a more generic BER encoding + method. If you encode data with DER or CER, all BER-conformant decoders + will easily understand that. Hence, to encode data in the BER format, + simply use the DER encoder, der_encode(). + + See also: ISO/IEC 8825-1 / X.690: + "ASN.1 encoding rules: Specification of + Basic Encoding Rules (BER), + Canonical Encoding Rules (CER) and + Distinguished Encoding Rules (DER)" + From f25d281eb013a83458216ba340fc87c6d7bd3b36 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 20 Aug 2004 13:38:25 +0000 Subject: [PATCH 0173/1469] time fix git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@173 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5a6116ca0..6ddf84286 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,10 +1,10 @@ -0.9: 2004-Aug-19 +0.9: 2004-Aug-20 * Reworked subtype constraints handling, aiming at PER-applicability. * BOOLEAN and NULL are now implemented in terms of native int type. * Compiler now links in only necessary skeleton files. - * -t option added to asn1c to ease BER manual decoding. + * -t option added to asn1c to ease manual BER/CER/DER decoding. 0.8.19: 2004-Aug-18 From 4fdaeadddf0e41bbd944a3821702ee9efee75ae6 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 21 Aug 2004 07:34:17 +0000 Subject: [PATCH 0174/1469] proper types git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@174 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/19-param-OK.asn1.-P | 2 +- tests/50-constraint-OK.asn1.-P | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/19-param-OK.asn1.-P b/tests/19-param-OK.asn1.-P index a9f48e732..d52ab07e6 100644 --- a/tests/19-param-OK.asn1.-P +++ b/tests/19-param-OK.asn1.-P @@ -240,7 +240,7 @@ static int permitted_alphabet_table_1[256] = { static int check_permitted_alphabet_1(const void *sptr) { int *table = permitted_alphabet_table_1; /* The underlying type is IA5String */ - const (null)_t *st = sptr; + const IA5String_t *st = sptr; uint8_t *ch = st->buf; uint8_t *end = ch + st->size; diff --git a/tests/50-constraint-OK.asn1.-P b/tests/50-constraint-OK.asn1.-P index 746e8c2b7..9bf780e19 100644 --- a/tests/50-constraint-OK.asn1.-P +++ b/tests/50-constraint-OK.asn1.-P @@ -812,7 +812,7 @@ asn_struct_free_f Str2_free; static int check_permitted_alphabet_1(const void *sptr) { /* The underlying type is IA5String */ - const Str2_t *st = sptr; + const Str1_t *st = sptr; uint8_t *ch = st->buf; uint8_t *end = ch + st->size; @@ -956,7 +956,7 @@ static int permitted_alphabet_table_2[256] = { static int check_permitted_alphabet_2(const void *sptr) { int *table = permitted_alphabet_table_2; /* The underlying type is IA5String */ - const Str3_t *st = sptr; + const Str2_t *st = sptr; uint8_t *ch = st->buf; uint8_t *end = ch + st->size; @@ -1089,7 +1089,7 @@ asn_struct_free_f PER_Visible_free; static int check_permitted_alphabet_3(const void *sptr) { /* The underlying type is IA5String */ - const PER_Visible_t *st = sptr; + const IA5String_t *st = sptr; uint8_t *ch = st->buf; uint8_t *end = ch + st->size; @@ -1219,7 +1219,7 @@ asn_struct_free_f PER_Visible_2_free; static int check_permitted_alphabet_4(const void *sptr) { /* The underlying type is IA5String */ - const PER_Visible_2_t *st = sptr; + const PER_Visible_t *st = sptr; uint8_t *ch = st->buf; uint8_t *end = ch + st->size; @@ -1349,7 +1349,7 @@ asn_struct_free_f Not_PER_Visible_1_free; static int check_permitted_alphabet_5(const void *sptr) { /* The underlying type is IA5String */ - const Not_PER_Visible_1_t *st = sptr; + const PER_Visible_t *st = sptr; uint8_t *ch = st->buf; uint8_t *end = ch + st->size; @@ -1707,7 +1707,7 @@ asn_struct_free_f SIZE_but_not_FROM_free; static int check_permitted_alphabet_6(const void *sptr) { /* The underlying type is IA5String */ - const SIZE_but_not_FROM_t *st = sptr; + const PER_Visible_t *st = sptr; uint8_t *ch = st->buf; uint8_t *end = ch + st->size; @@ -1840,7 +1840,7 @@ asn_struct_free_f SIZE_and_FROM_free; static int check_permitted_alphabet_7(const void *sptr) { /* The underlying type is IA5String */ - const SIZE_and_FROM_t *st = sptr; + const PER_Visible_t *st = sptr; uint8_t *ch = st->buf; uint8_t *end = ch + st->size; @@ -1973,7 +1973,7 @@ asn_struct_free_f Neither_SIZE_nor_FROM_free; static int check_permitted_alphabet_8(const void *sptr) { /* The underlying type is IA5String */ - const Neither_SIZE_nor_FROM_t *st = sptr; + const PER_Visible_t *st = sptr; uint8_t *ch = st->buf; uint8_t *end = ch + st->size; @@ -2115,7 +2115,7 @@ static int permitted_alphabet_table_9[128] = { static int check_permitted_alphabet_9(const void *sptr) { int *table = permitted_alphabet_table_9; /* The underlying type is UTF8String */ - const Utf8_3_t *st = sptr; + const Utf8_2_t *st = sptr; uint8_t *ch = st->buf; uint8_t *end = ch + st->size; From ffa21d20707f0c33f332d84f7c8c3aedecd318fe Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 21 Aug 2004 07:34:58 +0000 Subject: [PATCH 0175/1469] refine git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@175 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_constraint.c | 56 ++++++++++++++++++------------ 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index cf5416b0c..672390ebb 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -70,6 +70,7 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { if(!(arg->flags & A1C_USE_NATIVE_INTEGERS)) produce_st = 1; break; + case ASN_BASIC_BIT_STRING: case ASN_BASIC_OCTET_STRING: produce_st = 1; break; @@ -79,7 +80,8 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { break; } if(produce_st) - OUT("const %s_t *st = sptr;\n", MKID(arg->expr->Identifier)); + OUT("const %s_t *st = sptr;\n", + asn1c_type_name(arg, arg->expr, TNF_SAFE)); if(r_size || r_value) { if(r_size) { @@ -350,12 +352,13 @@ emit_alphabet_check_loop(arg_t *arg, asn1cnst_range_t *range) { OUT("/* The underlying type is %s */\n", ASN_EXPR_TYPE2STR(etype)); - OUT("const %s_t *st = sptr;\n", MKID(arg->expr->Identifier)); + OUT("const %s_t *st = sptr;\n", + asn1c_type_name(arg, arg->expr, TNF_SAFE)); switch(etype) { case ASN_STRING_UTF8String: - OUT("uint8_t *ch = st->buf;\n"); - OUT("uint8_t *end = ch + st->size;\n"); + OUT("const uint8_t *ch = st->buf;\n"); + OUT("const uint8_t *end = ch + st->size;\n"); OUT("\n"); OUT("for(; ch < end; ch++) {\n"); INDENT(+1); @@ -364,35 +367,35 @@ emit_alphabet_check_loop(arg_t *arg, asn1cnst_range_t *range) { natural_stop = 0xffffffffUL; break; case ASN_STRING_UniversalString: - OUT("uint32_t *ch = st->buf;\n"); - OUT("uint32_t *end = ch + st->size;\n"); + OUT("const uint32_t *ch = st->buf;\n"); + OUT("const uint32_t *end = ch + st->size;\n"); OUT("\n"); OUT("if(st->size % 4) return 0; /* (size%4)! */\n"); OUT("for(; ch < end; ch++) {\n"); INDENT(+1); - OUT("uint32_t cv = (((uint8_t *)ch)[0] << 24)\n"); - OUT("\t\t| (((uint8_t *)ch)[1] << 16)\n"); - OUT("\t\t| (((uint8_t *)ch)[2] << 8)\n"); - OUT("\t\t| ((uint8_t *)ch)[3]\n"); + OUT("uint32_t cv = (((const uint8_t *)ch)[0] << 24)\n"); + OUT("\t\t| (((const uint8_t *)ch)[1] << 16)\n"); + OUT("\t\t| (((const uint8_t *)ch)[2] << 8)\n"); + OUT("\t\t| ((const uint8_t *)ch)[3];\n"); if(!range) OUT("if(cv > 255) return 0;\n"); natural_stop = 0xffffffffUL; break; case ASN_STRING_BMPString: - OUT("uint16_t *ch = st->buf;\n"); - OUT("uint16_t *end = ch + st->size;\n"); + OUT("const uint16_t *ch = st->buf;\n"); + OUT("const uint16_t *end = ch + st->size;\n"); OUT("\n"); OUT("if(st->size % 2) return 0; /* (size%2)! */\n"); OUT("for(; ch < end; ch++) {\n"); INDENT(+1); - OUT("uint16_t cv = (((uint8_t *)ch)[0] << 8)\n"); - OUT("\t\t| ((uint8_t *)ch)[1];\n"); + OUT("uint16_t cv = (((const uint8_t *)ch)[0] << 8)\n"); + OUT("\t\t| ((const uint8_t *)ch)[1];\n"); if(!range) OUT("if(cv > 255) return 0;\n"); natural_stop = 0xffff; break; case ASN_BASIC_OCTET_STRING: default: - OUT("uint8_t *ch = st->buf;\n"); - OUT("uint8_t *end = ch + st->size;\n"); + OUT("const uint8_t *ch = st->buf;\n"); + OUT("const uint8_t *end = ch + st->size;\n"); OUT("\n"); OUT("for(; ch < end; ch++) {\n"); INDENT(+1); @@ -531,7 +534,7 @@ emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype) { case ASN_BASIC_INTEGER: case ASN_BASIC_ENUMERATED: if(arg->flags & A1C_USE_NATIVE_INTEGERS) { - OUT("value = *(int *)sptr;\n"); + OUT("value = *(const int *)sptr;\n"); } else { OUT("if(asn1_INTEGER2long(st, &value)) {\n"); INDENT(+1); @@ -543,14 +546,21 @@ emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype) { } break; case ASN_BASIC_BOOLEAN: - OUT("value = (*(int *)sptr) ? 1 : 0;\n"); + OUT("value = (*(const int *)sptr) ? 1 : 0;\n"); break; default: - WARNING("Value cannot be determined " - "for constraint check for %s at line %d\n", - arg->expr->Identifier, arg->expr->_lineno); - OUT("#error Value cannot be determined for %s at %d\n", - arg->expr->Identifier, arg->expr->_lineno); + WARNING("%s:%d: Value cannot be determined " + "for constraint check for %s", + arg->mod->source_file_name, + arg->expr->_lineno, + arg->expr->Identifier + ); + OUT_NOINDENT( + "#error %s:%d: Value of %s cannot be determined\n", + arg->mod->source_file_name, + arg->expr->_lineno, + arg->expr->Identifier + ); break; } From 903a213713979c857b758e86a50b498d868a4cee Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 22 Aug 2004 03:01:37 +0000 Subject: [PATCH 0176/1469] 2 2 1 1 check git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@176 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/check-OIDs.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/skeletons/tests/check-OIDs.c b/skeletons/tests/check-OIDs.c index 05d34ee04..496125083 100644 --- a/skeletons/tests/check-OIDs.c +++ b/skeletons/tests/check-OIDs.c @@ -47,17 +47,20 @@ check_OID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { alen = OBJECT_IDENTIFIER_get_arcs(oid, arcs, sizeof(arcs[0]), sizeof(arcs)/sizeof(arcs[0])); assert(alen > 0); - assert(alen == ck_len); + printf("OBJECT_IDENTIFIER_get_arcs() => {"); /* * Make sure they are equivalent. */ - printf("OBJECT_IDENTIFIER_get_arcs() => {"); for(i = 0; i < alen; i++) { printf(" %lu", arcs[i]); - assert(arcs[i] == (unsigned long)ck_buf[i]); + if(alen == ck_len) { + assert(arcs[i] == (unsigned long)ck_buf[i]); + } } printf(" }\n"); + assert(alen == ck_len); + } static void @@ -278,12 +281,22 @@ main() { int buf15_check[] = { 0, 0, 0xf000 }; int buf16_check[] = { 0, 0, 0, 1, 0 }; int buf17_check[] = { 2, 0xffffffAf, 0xff00ff00, 0 }; + int buf18_check[] = { 2, 2, 1, 1 }; + + /* { joint-iso-itu-t 2 1 1 } */ + uint8_t buf19[] = { + 0x06, /* OBJECT IDENTIFIER */ + 0x03, /* Length */ + 0x52, 0x01, 0x01 + }; + int buf19_check[] = { 2, 2, 1, 1 }; CHECK_OID(1); /* buf1, buf1_check */ CHECK_ROID(2); /* buf2, buf2_check */ CHECK_OID(3); /* buf3, buf3_check */ CHECK_OID(4); /* buf4, buf4_check */ + CHECK_OID(19); /* buf19, buf19_check */ CHECK_REGEN(5); /* Regenerate RELATIVE-OID */ CHECK_REGEN(6); @@ -306,6 +319,7 @@ main() { CHECK_REGEN_OID(15); CHECK_REGEN_OID(16); CHECK_REGEN_OID(17); + CHECK_REGEN_OID(18); for(i = 0; i < 100000; i++) { int bufA_check[3] = { 2, i, rand() }; From 915d6453928c161e2ef7f87cd1435c08fd077bc7 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 22 Aug 2004 03:06:30 +0000 Subject: [PATCH 0177/1469] COMPONENTS OF support testing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@177 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/55-components-of-OK.asn1 | 34 ++++++++++++++++++++++++++ tests/55-components-of-OK.asn1.-EF | 33 ++++++++++++++++++++++++++ tests/56-components-of-SE.asn1 | 20 ++++++++++++++++ tests/57-components-of-OK.asn1 | 38 ++++++++++++++++++++++++++++++ 4 files changed, 125 insertions(+) create mode 100644 tests/55-components-of-OK.asn1 create mode 100644 tests/55-components-of-OK.asn1.-EF create mode 100644 tests/56-components-of-SE.asn1 create mode 100644 tests/57-components-of-OK.asn1 diff --git a/tests/55-components-of-OK.asn1 b/tests/55-components-of-OK.asn1 new file mode 100644 index 000000000..54ecc1f88 --- /dev/null +++ b/tests/55-components-of-OK.asn1 @@ -0,0 +1,34 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .55 + +ModuleTestComponentsOf + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 55 } + DEFINITIONS AUTOMATIC TAGS ::= +BEGIN + + OneType ::= SEQUENCE { + one-1 INTEGER, + one-2 [1] BOOLEAN, + one-3 SEQUENCE { + alpha INTEGER, + beta INTEGER, + ... + }, + ..., + ignored-in-SecondType INTEGER, + ..., + one-4 INTEGER + } + + SecondType ::= SEQUENCE { + a IA5String, + COMPONENTS OF OneType, + b UniversalString + } + +END diff --git a/tests/55-components-of-OK.asn1.-EF b/tests/55-components-of-OK.asn1.-EF new file mode 100644 index 000000000..4d640d0a0 --- /dev/null +++ b/tests/55-components-of-OK.asn1.-EF @@ -0,0 +1,33 @@ + +ModuleTestComponentsOf {iso(-1) org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 55 } +DEFINITIONS AUTOMATIC TAGS ::= +BEGIN + +OneType ::= SEQUENCE { + one-1 INTEGER, + one-2 [1] EXPLICIT BOOLEAN, + one-3 SEQUENCE { + alpha [0] IMPLICIT INTEGER, + beta [1] IMPLICIT INTEGER, + ... + }, + one-4 INTEGER, + ..., + ignored-in-SecondType INTEGER +} + +SecondType ::= SEQUENCE { + a [0] IMPLICIT IA5String, + one-1 [1] IMPLICIT INTEGER, + one-2 [2] IMPLICIT BOOLEAN, + one-3 [3] IMPLICIT SEQUENCE { + alpha [0] IMPLICIT INTEGER, + beta [1] IMPLICIT INTEGER + }, + one-4 [4] IMPLICIT INTEGER, + b [5] IMPLICIT UniversalString +} + +END diff --git a/tests/56-components-of-SE.asn1 b/tests/56-components-of-SE.asn1 new file mode 100644 index 000000000..26e07575b --- /dev/null +++ b/tests/56-components-of-SE.asn1 @@ -0,0 +1,20 @@ + +-- SE: Semantic error + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .56 + +ModuleTestComponentsOfInvalidReference + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 56 } + DEFINITIONS AUTOMATIC TAGS ::= +BEGIN + + OneType ::= SEQUENCE { + a IA5String, + COMPONENTS OF INTEGER, -- Error is here + b UniversalString + } + +END diff --git a/tests/57-components-of-OK.asn1 b/tests/57-components-of-OK.asn1 new file mode 100644 index 000000000..bb2c8bf7c --- /dev/null +++ b/tests/57-components-of-OK.asn1 @@ -0,0 +1,38 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .57 + +ModuleTestComponentsOfCrossModule1 + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 57 1 } + DEFINITIONS AUTOMATIC TAGS ::= +BEGIN + + SecondType ::= SEQUENCE { + a IA5String, + COMPONENTS OF ModuleTestComponentsOfCrossModule2.OneType, + b UniversalString + } + +END + +ModuleTestComponentsOfCrossModule2 + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 57 2 } + DEFINITIONS EXPLICIT TAGS ::= +BEGIN + + OneType ::= SEQUENCE { + x T1, + y T2, + z T3 + } + + T1 ::= INTEGER + T2 ::= INTEGER + T3 ::= INTEGER + +END From 4f07a94e6071b73221072e64b41d35d6c13a92ba Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 22 Aug 2004 03:08:23 +0000 Subject: [PATCH 0178/1469] better dependency tracking git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@178 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-assembly.sh | 74 ++++++++++++++++++++++++----------- 1 file changed, 51 insertions(+), 23 deletions(-) diff --git a/asn1c/tests/check-assembly.sh b/asn1c/tests/check-assembly.sh index f3461d3b8..11571fc59 100755 --- a/asn1c/tests/check-assembly.sh +++ b/asn1c/tests/check-assembly.sh @@ -5,6 +5,11 @@ # test-* directories, do lots of other magic stuff and exit cleanly. # +if [ "x$1" = "x" ]; then + echo "Usage: $0 " + exit +fi + # Compute the .asn1 spec name by the given file name. source=$(echo "$1" | sed -e 's/.*\///') testno=`echo "$source" | cut -f2 -d'-' | cut -f1 -d'.'` @@ -17,45 +22,68 @@ IFS="." set $args shift IFS=$OFS +AFLAGS="$@" + +touch ${testdir}-FAILED # Create this file to ease post mortem analysis if [ ! -d $testdir ]; then mkdir $testdir || exit $? fi cd $testdir || exit $? ln -fs ../$source || exit $? -# Compile the corresponding .asn1 spec. -set -x -../../asn1c \ - -S ../../../skeletons \ - -Wdebug-compiler "$@" \ - ../../../tests/${testno}-*.asn1 || exit $? -set +x + +asn_module=$(echo ../../../tests/${testno}-*.asn1) # Create a Makefile for the project. cat > Makefile < Date: Sun, 22 Aug 2004 03:08:51 +0000 Subject: [PATCH 0179/1469] pretty-printing COMPONENTS OF git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@179 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1print/asn1print.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index 15a41c03d..143cfdb83 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -456,6 +456,10 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri asn1print_value(tc->value, flags); } break; + case A1TC_COMPONENTS_OF: + SEQ_OF = 1; /* Equivalent to SET OF for printint purposes */ + printf(" COMPONENTS OF"); + break; case A1TC_REFERENCE: case A1TC_UNIVERVAL: case A1TC_PARAMETRIZED: @@ -497,14 +501,13 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri */ if(TQ_FIRST(&(tc->members))) { asn1p_expr_t *se; /* SubExpression */ + int put_braces = !SEQ_OF; /* Don't need 'em, if SET OF... */ - if(!SEQ_OF - || TQ_FIRST(&(tc->members))->expr_type & ASN_CONSTR_MASK) - printf(" {\n"); + if(put_braces) printf(" {\n"); TQ_FOR(se, &(tc->members), next) { /* - * Print the expression as it were stand-alone type. + * Print the expression as it were a stand-alone type. */ asn1print_expr(asn, mod, se, flags, level + 4); switch(se->marker) { @@ -518,8 +521,7 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri } } - if(!SEQ_OF - || TQ_FIRST(&(tc->members))->expr_type & ASN_CONSTR_MASK) { + if(put_braces) { printf("\n"); INDENT("}"); } @@ -548,6 +550,9 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri printf(")"); } + /* + * The following section exists entirely for debugging only. + */ if(flags & APF_DEBUG_CONSTRAINTS && tc->expr_type != A1TC_EXTENSIBLE) { asn1p_expr_t *top_parent; @@ -557,7 +562,7 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri asn1print_constraint(tc->combined_constraints, flags); } - top_parent = asn1f_find_terminal_type_ex(asn, mod, tc, NULL); + top_parent = asn1f_find_terminal_type_ex(asn, mod, tc); if(top_parent) { printf("\n-- PER-visible constraints (%s): ", top_parent->Identifier); From f645aff8f41bc4bf3125dbcf7f8f548249347339 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 22 Aug 2004 03:09:24 +0000 Subject: [PATCH 0180/1469] COMPONENTS OF support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@180 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix.c | 13 ++++-- libasn1fix/asn1fix_constr.c | 85 ++++++++++++++++++++++++++++++++++--- libasn1fix/asn1fix_constr.h | 5 +++ 3 files changed, 95 insertions(+), 8 deletions(-) diff --git a/libasn1fix/asn1fix.c b/libasn1fix/asn1fix.c index 2a78aa131..481007918 100644 --- a/libasn1fix/asn1fix.c +++ b/libasn1fix/asn1fix.c @@ -117,7 +117,9 @@ asn1f_fix_module(arg_t *arg) { switch((arg->mod->module_flags & MSF_MASK_INSTRUCTIONS)) { case MSF_NOFLAGS: - //arg->mod->module_flags |= MSF_TAG_INSTRUCTIONS; + /* + * arg->mod->module_flags |= MSF_TAG_INSTRUCTIONS; + */ break; case MSF_unk_INSTRUCTIONS: WARNING("Module %s defined with unrecognized " @@ -277,6 +279,10 @@ asn1f_fix_constructed(arg_t *arg) { ret = asn1f_fix_constr_tag(arg); RET2RVAL(ret, rvalue); + /* Import COMPONENTS OF stuff */ + ret = asn1f_pull_components_of(arg); + RET2RVAL(ret, rvalue); + return rvalue; } @@ -287,12 +293,13 @@ asn1f_fix_constraints(arg_t *arg) { int rvalue = 0; int ret; - top_parent = asn1f_find_terminal_type(arg, arg->expr, NULL); + top_parent = asn1f_find_terminal_type(arg, arg->expr); if(top_parent) etype = top_parent->expr_type; else etype = A1TC_INVALID; - ret = asn1constraint_resolve(arg, arg->expr->constraints, etype, 0); + ret = asn1constraint_resolve(arg, arg->expr->module, + arg->expr->constraints, etype, 0); RET2RVAL(ret, rvalue); ret = asn1constraint_pullup(arg); diff --git a/libasn1fix/asn1fix_constr.c b/libasn1fix/asn1fix_constr.c index 4db233f6e..1574c8147 100644 --- a/libasn1fix/asn1fix_constr.c +++ b/libasn1fix/asn1fix_constr.c @@ -3,6 +3,79 @@ static int _asn1f_check_if_tag_must_be_explicit(arg_t *arg, asn1p_expr_t *v); static int _asn1f_compare_tags(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b); +int +asn1f_pull_components_of(arg_t *arg) { + TQ_HEAD(asn1p_expr_t) list; + asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *memb; + int r_value = 0; + + switch(expr->expr_type) { + case ASN_CONSTR_SEQUENCE: + case ASN_CONSTR_SET: + break; + default: + return 0; + } + + TQ_INIT(&list); + + /* + * Look into + */ + while((memb = TQ_REMOVE(&(expr->members), next))) { + asn1p_expr_t *coft; /* COMPONENTS OF thing itself */ + asn1p_expr_t *terminal; /* Terminal of the referenced type */ + + if(memb->expr_type != A1TC_COMPONENTS_OF) { + TQ_ADD(&list, memb, next); + continue; + } + + coft = TQ_FIRST(&memb->members); + assert(coft); + assert(!TQ_NEXT(coft, next)); + + /* + * Find the referenced type. + */ + terminal = asn1f_find_terminal_type(arg, coft); + if(!terminal || (terminal->expr_type != expr->expr_type)) { + FATAL("COMPONENTS OF at line %d " + "must reference a %s type", + coft->_lineno, + expr->expr_type==ASN_CONSTR_SET + ? "SET" : "SEQUENCE" + ); + TQ_ADD(&list, memb, next); + r_value = -1; + continue; + } + + /* + * Clone the final structure. + */ + + coft = asn1p_expr_clone(terminal, 1 /* Skip extensions */); + if(!coft) return -1; /* ENOMEM */ + + asn1p_expr_free(memb); /* Don't need it anymore*/ + + /* + * Move all components of the cloned structure + * into the current one. + */ + while((memb = TQ_REMOVE(&(coft->members), next))) + TQ_ADD(&list, memb, next); + + asn1p_expr_free(coft); /* Remove wrapper */ + } + + /* Move the stuff back */ + TQ_HEAD_COPY(&(expr->members), &list); + + return r_value; +} int asn1f_fix_constr_ext(arg_t *arg) { @@ -203,7 +276,10 @@ asn1f_fix_constr_autotag(arg_t *arg) { if(v->expr_type == A1TC_EXTENSIBLE) break; - assert(v->tag.tag_class == TC_NOCLASS); + if(0) { + /* This may be not true in case COMPONENTS OF */ + assert(v->tag.tag_class == TC_NOCLASS); + } must_explicit = _asn1f_check_if_tag_must_be_explicit(arg, v); @@ -259,7 +335,7 @@ static int _asn1f_check_if_tag_must_be_explicit(arg_t *arg, asn1p_expr_t *v) { asn1p_expr_t *reft; - reft = asn1f_find_terminal_type(arg, v, 0); + reft = asn1f_find_terminal_type(arg, v); if(reft) { switch(reft->expr_type) { case ASN_CONSTR_CHOICE: @@ -329,13 +405,12 @@ _asn1f_compare_tags(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b) { b->Identifier, b->expr_type); if(a->meta_type == AMT_TYPEREF) { - asn1p_module_t *mod; DEBUG(" %s is a type reference", a->Identifier); - a = asn1f_lookup_symbol(arg, a->reference, &mod); + a = asn1f_lookup_symbol(arg, a->module, a->reference); if(!a) return 0; /* Already FATAL()'ed somewhere else */ - WITH_MODULE(mod, ret = _asn1f_compare_tags(arg, a, b)); + WITH_MODULE(a->module, ret = _asn1f_compare_tags(arg, a, b)); return ret; } diff --git a/libasn1fix/asn1fix_constr.h b/libasn1fix/asn1fix_constr.h index aeb05c0a8..59970adf1 100644 --- a/libasn1fix/asn1fix_constr.h +++ b/libasn1fix/asn1fix_constr.h @@ -1,6 +1,11 @@ #ifndef _ASN1FIX_CONSTRUCTED_H_ #define _ASN1FIX_CONSTRUCTED_H_ +/* + * Pull in COMPONENTS OF. + */ +int asn1f_pull_components_of(arg_t *); + /* * Fix extensions in constructed types. */ From 2e0c19442d4361a2b14d045f147f6658e4c16820 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 22 Aug 2004 03:10:23 +0000 Subject: [PATCH 0181/1469] refactoring git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@181 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_out.h | 2 ++ libasn1compiler/asn1compiler.c | 8 ++++++ libasn1fix/asn1fix_bitstring.c | 2 +- libasn1fix/asn1fix_class.c | 6 ++--- libasn1fix/asn1fix_class.h | 5 ++-- libasn1fix/asn1fix_constraint.c | 22 +++++++-------- libasn1fix/asn1fix_constraint.h | 3 ++- libasn1fix/asn1fix_dereft.c | 31 +-------------------- libasn1fix/asn1fix_export.c | 16 +++++------ libasn1fix/asn1fix_export.h | 6 ++--- libasn1fix/asn1fix_integer.c | 6 ++--- libasn1fix/asn1fix_param.c | 6 ++--- libasn1fix/asn1fix_retrieve.c | 48 +++++++++++++-------------------- libasn1fix/asn1fix_retrieve.h | 13 ++++----- libasn1fix/asn1fix_tags.c | 4 +-- libasn1fix/asn1fix_value.c | 9 +++---- 16 files changed, 73 insertions(+), 114 deletions(-) diff --git a/libasn1compiler/asn1c_out.h b/libasn1compiler/asn1c_out.h index f604687b2..7e2abfd8f 100644 --- a/libasn1compiler/asn1c_out.h +++ b/libasn1compiler/asn1c_out.h @@ -69,6 +69,8 @@ int asn1c_compiled_output(arg_t *arg, const char *fmt, ...); _tmp.default_cb(&_tmp); \ ); \ arg->embed--; \ + if(ev->expr_type != A1TC_EXTENSIBLE) \ + OUT(";\n"); \ assert(arg->target->target == OT_TYPE_DECLS); \ REDIR(saved_target); \ } while(0) diff --git a/libasn1compiler/asn1compiler.c b/libasn1compiler/asn1compiler.c index dd51156f9..0159da15c 100644 --- a/libasn1compiler/asn1compiler.c +++ b/libasn1compiler/asn1compiler.c @@ -84,6 +84,9 @@ asn1c_compile_expr(arg_t *arg) { expr->_lineno); ret = type_cb(arg); + + if(arg->target->destination[OT_TYPE_DECLS].indent_level == 0) + OUT(";\n"); } else { ret = -1; /* @@ -112,6 +115,11 @@ asn1c_compile_expr(arg_t *arg) { } if(ret == -1) { + FATAL("Cannot compile \"%s\" (%x:%x) at line %d", + arg->expr->Identifier, + arg->expr->expr_type, + arg->expr->meta_type, + arg->expr->_lineno); OUT("#error Cannot compile \"%s\" (%x/%x) at line %d\n", arg->expr->Identifier, arg->expr->meta_type, diff --git a/libasn1fix/asn1fix_bitstring.c b/libasn1fix/asn1fix_bitstring.c index 0d3961d43..c9a09761f 100644 --- a/libasn1fix/asn1fix_bitstring.c +++ b/libasn1fix/asn1fix_bitstring.c @@ -16,7 +16,7 @@ asn1f_fix_bit_string(arg_t *arg) { DEBUG("%s(%s) for line %d", __func__, expr->Identifier, expr->_lineno); - ttype = asn1f_find_terminal_type(arg, expr, 0); + ttype = asn1f_find_terminal_type(arg, expr); if(ttype && ttype->expr_type == ASN_BASIC_BIT_STRING) { ret = asn1f_fix_bit_string_value(arg, ttype); RET2RVAL(ret, r_value); diff --git a/libasn1fix/asn1fix_class.c b/libasn1fix/asn1fix_class.c index f617c3180..98d47f445 100644 --- a/libasn1fix/asn1fix_class.c +++ b/libasn1fix/asn1fix_class.c @@ -23,15 +23,13 @@ static asn1p_expr_t * asn1f_class_dot_lookup(arg_t *arg, asn1p_expr_t *obj, asn1p_ref_t *ref); asn1p_expr_t * -asn1f_class_access(arg_t *arg, asn1p_ref_t *ref, asn1p_module_t **mod_r) { +asn1f_class_access(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { asn1p_expr_t *obj; /* Information Object or Object Set */ object_category_e obj_cat; /* Object category */ //field_category_e field_cat; /* Field category */ asn1p_expr_t *result; asn1p_ref_t tmpref; - (void)mod_r; /* Unused argument */ - assert(ref->comp_count > 1); DEBUG("%s(%s) for line %d", __func__, @@ -47,7 +45,7 @@ asn1f_class_access(arg_t *arg, asn1p_ref_t *ref, asn1p_module_t **mod_r) { tmpref = *ref; tmpref.comp_count = 1; - obj = asn1f_lookup_symbol(arg, &tmpref, 0); + obj = asn1f_lookup_symbol(arg, mod, &tmpref); if(obj == NULL) { errno = ESRCH; return NULL; diff --git a/libasn1fix/asn1fix_class.h b/libasn1fix/asn1fix_class.h index c849b2b38..763e48cf0 100644 --- a/libasn1fix/asn1fix_class.h +++ b/libasn1fix/asn1fix_class.h @@ -4,13 +4,12 @@ /* * Fetch the element from the class-related stuff (thing) by its reference. */ -asn1p_expr_t * -asn1f_class_access(arg_t *, asn1p_ref_t *, asn1p_module_t **mod_r); +asn1p_expr_t *asn1f_class_access(arg_t *, asn1p_module_t *mod, asn1p_ref_t *); /* * Externally accessible version of above function. */ asn1p_expr_t *asn1f_class_access2(asn1p_t *asn, asn1p_module_t *mod, - asn1p_expr_t *expr, asn1p_ref_t *, asn1p_module_t **mod_r); + asn1p_expr_t *expr, asn1p_ref_t *); #endif /* _ASN1FIX_CLASS_H_ */ diff --git a/libasn1fix/asn1fix_constraint.c b/libasn1fix/asn1fix_constraint.c index 4620ec52f..4a25faee9 100644 --- a/libasn1fix/asn1fix_constraint.c +++ b/libasn1fix/asn1fix_constraint.c @@ -3,7 +3,7 @@ #include static void _remove_exceptions(arg_t *arg, asn1p_constraint_t *ct); -static int _constraint_value_resolve(arg_t *arg, asn1p_value_t **value); +static int _constraint_value_resolve(arg_t *arg, asn1p_module_t *mod, asn1p_value_t **value); int asn1constraint_pullup(arg_t *arg) { @@ -25,11 +25,10 @@ asn1constraint_pullup(arg_t *arg) { if(expr->expr_type == A1TC_REFERENCE) { asn1p_ref_t *ref = expr->reference; - asn1p_module_t *mod_rw = arg->mod; asn1p_expr_t *parent_expr; assert(ref); - parent_expr = asn1f_lookup_symbol(arg, ref, &mod_rw); + parent_expr = asn1f_lookup_symbol(arg, expr->module, ref); if(!parent_expr) { if(errno != EEXIST) { DEBUG("\tWhile fetching parent constraints: " @@ -120,7 +119,7 @@ asn1constraint_pullup(arg_t *arg) { } int -asn1constraint_resolve(arg_t *arg, asn1p_constraint_t *ct, asn1p_expr_type_e etype, enum asn1p_constraint_type_e effective_type) { +asn1constraint_resolve(arg_t *arg, asn1p_module_t *mod, asn1p_constraint_t *ct, asn1p_expr_type_e etype, enum asn1p_constraint_type_e effective_type) { int rvalue = 0; int ret; int el; @@ -183,15 +182,15 @@ asn1constraint_resolve(arg_t *arg, asn1p_constraint_t *ct, asn1p_expr_type_e ety * Resolve all possible references, wherever they occur. */ if(ct->value && ct->value->type == ATV_REFERENCED) { - ret = _constraint_value_resolve(arg, &ct->value); + ret = _constraint_value_resolve(arg, mod, &ct->value); RET2RVAL(ret, rvalue); } if(ct->range_start && ct->range_start->type == ATV_REFERENCED) { - ret = _constraint_value_resolve(arg, &ct->range_start); + ret = _constraint_value_resolve(arg, mod, &ct->range_start); RET2RVAL(ret, rvalue); } if(ct->range_stop && ct->range_stop->type == ATV_REFERENCED) { - ret = _constraint_value_resolve(arg, &ct->range_stop); + ret = _constraint_value_resolve(arg, mod, &ct->range_stop); RET2RVAL(ret, rvalue); } @@ -199,7 +198,7 @@ asn1constraint_resolve(arg_t *arg, asn1p_constraint_t *ct, asn1p_expr_type_e ety * Proceed recursively. */ for(el = 0; el < ct->el_count; el++) { - ret = asn1constraint_resolve(arg, ct->elements[el], + ret = asn1constraint_resolve(arg, mod, ct->elements[el], etype, effective_type); RET2RVAL(ret, rvalue); } @@ -230,15 +229,14 @@ _remove_exceptions(arg_t *arg, asn1p_constraint_t *ct) { static int -_constraint_value_resolve(arg_t *arg, asn1p_value_t **value) { +_constraint_value_resolve(arg_t *arg, asn1p_module_t *mod, asn1p_value_t **value) { asn1p_expr_t static_expr; asn1p_expr_t *tmp_expr; - asn1p_module_t *mod_rw = arg->mod; arg_t tmp_arg; int rvalue = 0; int ret; - tmp_expr = asn1f_lookup_symbol(arg, (*value)->value.reference, &mod_rw); + tmp_expr = asn1f_lookup_symbol(arg, mod, (*value)->value.reference); if(tmp_expr == NULL) { FATAL("Cannot find symbol %s " "used in %s subtype constraint at line %d", @@ -251,7 +249,7 @@ _constraint_value_resolve(arg_t *arg, asn1p_value_t **value) { static_expr = *tmp_expr; static_expr.value = *value; tmp_arg = *arg; - tmp_arg.mod = mod_rw; + tmp_arg.mod = tmp_expr->module; tmp_arg.expr = &static_expr; ret = asn1f_fix_dereference_values(&tmp_arg); RET2RVAL(ret, rvalue); diff --git a/libasn1fix/asn1fix_constraint.h b/libasn1fix/asn1fix_constraint.h index 9e692efab..cc6621f99 100644 --- a/libasn1fix/asn1fix_constraint.h +++ b/libasn1fix/asn1fix_constraint.h @@ -4,7 +4,8 @@ /* * Resolve referenced values inside constraints. */ -int asn1constraint_resolve(arg_t *arg, asn1p_constraint_t *ct, +int asn1constraint_resolve(arg_t *arg, asn1p_module_t *module, + asn1p_constraint_t *ct, asn1p_expr_type_e topmost_parent_expression_type, enum asn1p_constraint_type_e effective_constraint_type); diff --git a/libasn1fix/asn1fix_dereft.c b/libasn1fix/asn1fix_dereft.c index 1f9b5bf4f..352df7b0c 100644 --- a/libasn1fix/asn1fix_dereft.c +++ b/libasn1fix/asn1fix_dereft.c @@ -26,7 +26,7 @@ asn1f_fix_dereference_types(arg_t *arg) { /* * Follow the reference. */ - type_expr = asn1f_find_terminal_type(arg, expr, 0); + type_expr = asn1f_find_terminal_type(arg, expr); if(type_expr == NULL) { const char *type_name; @@ -44,35 +44,6 @@ asn1f_fix_dereference_types(arg_t *arg) { return -1; } - /* - * Copying members of the source expression - * into the current expression. - */ - if(0) { - asn1p_expr_t *tmp_clone; - - tmp_clone = asn1p_expr_clone(type_expr); - if(tmp_clone == NULL) { - FATAL("Could not clone \"%s\" at line %d", - type_expr->Identifier, type_expr->_lineno); - return -1; - } - - /* - * Replace the referenced type with its definition. - */ - DEBUG("\tChanging type of \"%s\":%x to %x for line %d", - expr->Identifier, - expr->expr_type, - type_expr->expr_type, - expr->_lineno - ); - expr->expr_type = type_expr->expr_type; - expr->members = tmp_clone->members; - memset(&tmp_clone->members, 0, sizeof(tmp_clone->members)); - asn1p_expr_free(tmp_clone); - } - return r_value; } diff --git a/libasn1fix/asn1fix_export.c b/libasn1fix/asn1fix_export.c index cdae6505f..3a18ece0e 100644 --- a/libasn1fix/asn1fix_export.c +++ b/libasn1fix/asn1fix_export.c @@ -7,7 +7,7 @@ extern arg_t a1f_replace_me_with_proper_interface_arg; asn1p_expr_t * asn1f_lookup_symbol_ex( asn1p_t *asn, - asn1p_module_t **module_rw, + asn1p_module_t *mod, asn1p_expr_t *expr, asn1p_ref_t *ref) { arg_t arg; @@ -15,21 +15,20 @@ asn1f_lookup_symbol_ex( memset(&arg, 0, sizeof(arg)); arg.asn = asn; - arg.mod = *module_rw; + arg.mod = mod; arg.expr = expr; arg.eh = a1f_replace_me_with_proper_interface_arg.eh; arg.debug = a1f_replace_me_with_proper_interface_arg.debug; - return asn1f_lookup_symbol(&arg, ref, module_rw); + return asn1f_lookup_symbol(&arg, mod, ref); } asn1p_expr_t * asn1f_class_access_ex(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, - asn1p_ref_t *ref, - asn1p_module_t **mod_r) { + asn1p_ref_t *ref) { arg_t arg; memset(&arg, 0, sizeof(arg)); @@ -40,14 +39,13 @@ asn1f_class_access_ex(asn1p_t *asn, arg.eh = a1f_replace_me_with_proper_interface_arg.eh; arg.debug = a1f_replace_me_with_proper_interface_arg.debug; - return asn1f_class_access(&arg, ref, mod_r); + return asn1f_class_access(&arg, mod, ref); } asn1p_expr_t * asn1f_find_terminal_type_ex(asn1p_t *asn, asn1p_module_t *mod, - asn1p_expr_t *expr, - asn1p_module_t **mod_r) { + asn1p_expr_t *expr) { arg_t arg; memset(&arg, 0, sizeof(arg)); @@ -58,7 +56,7 @@ asn1f_find_terminal_type_ex(asn1p_t *asn, arg.eh = a1f_replace_me_with_proper_interface_arg.eh; arg.debug = a1f_replace_me_with_proper_interface_arg.debug; - return asn1f_find_terminal_type(&arg, expr, mod_r); + return asn1f_find_terminal_type(&arg, expr); } int diff --git a/libasn1fix/asn1fix_export.h b/libasn1fix/asn1fix_export.h index 7fd9ce113..8ebe44875 100644 --- a/libasn1fix/asn1fix_export.h +++ b/libasn1fix/asn1fix_export.h @@ -18,7 +18,7 @@ char const *asn1f_printable_value(asn1p_value_t *value); */ asn1p_expr_t *asn1f_lookup_symbol_ex( asn1p_t *asn, - asn1p_module_t **module_rw, + asn1p_module_t *mod, asn1p_expr_t *expr, asn1p_ref_t *ref); @@ -26,13 +26,13 @@ asn1p_expr_t *asn1f_lookup_symbol_ex( * Exportable version of an asn1f_class_access(). */ asn1p_expr_t *asn1f_class_access_ex(asn1p_t *asn, asn1p_module_t *mod, - asn1p_expr_t *expr, asn1p_ref_t *, asn1p_module_t **mod_r); + asn1p_expr_t *expr, asn1p_ref_t *); /* * Exportable version of asn1f_find_terminal_type(). */ asn1p_expr_t *asn1f_find_terminal_type_ex(asn1p_t *asn, asn1p_module_t *mod, - asn1p_expr_t *tc, asn1p_module_t **opt_module_r); + asn1p_expr_t *tc); /* * Exportable version of asn1f_fix_dereference_values(); diff --git a/libasn1fix/asn1fix_integer.c b/libasn1fix/asn1fix_integer.c index c3a2a7b00..729d1e39d 100644 --- a/libasn1fix/asn1fix_integer.c +++ b/libasn1fix/asn1fix_integer.c @@ -112,7 +112,6 @@ asn1f_fix_integer(arg_t *arg) { static int _asn1f_make_sure_type_is(arg_t *arg, asn1p_expr_t *expr, asn1p_expr_type_e type) { - asn1p_module_t *mod = NULL; asn1p_expr_t *next_expr; asn1p_expr_type_e expr_type; int ret; @@ -144,7 +143,7 @@ _asn1f_make_sure_type_is(arg_t *arg, asn1p_expr_t *expr, asn1p_expr_type_e type) * Then, it is a reference. For a reference, try to resolve type * and try again. */ - next_expr = asn1f_lookup_symbol(arg, expr->reference, &mod); + next_expr = asn1f_lookup_symbol(arg, expr->module, expr->reference); if(next_expr == NULL) { errno = ESRCH; return -1; @@ -153,7 +152,8 @@ _asn1f_make_sure_type_is(arg_t *arg, asn1p_expr_t *expr, asn1p_expr_type_e type) /* * If symbol is here, recursively check that it conforms to the type. */ - WITH_MODULE(mod, ret = _asn1f_make_sure_type_is(arg, next_expr, type)); + WITH_MODULE(next_expr->module, + ret = _asn1f_make_sure_type_is(arg, next_expr, type)); return ret; } diff --git a/libasn1fix/asn1fix_param.c b/libasn1fix/asn1fix_param.c index 0c838cc59..c399ae421 100644 --- a/libasn1fix/asn1fix_param.c +++ b/libasn1fix/asn1fix_param.c @@ -23,7 +23,7 @@ asn1f_fix_parametrized_assignment(arg_t *arg) { */ DEBUG("Looking for parametrized type definition \"%s\"", asn1f_printable_reference(expr->reference)); - ptype = asn1f_lookup_symbol(arg, expr->reference, 0); + ptype = asn1f_lookup_symbol(arg, expr->module, expr->reference); if(ptype == NULL) { DEBUG("%s: missing parametrized type declaration", asn1f_printable_reference(expr->reference)); @@ -81,7 +81,7 @@ asn1f_parametrize(arg_t *arg, asn1p_expr_t *expr, asn1p_expr_t *ptype) { * with the actual values. */ - nex = asn1p_expr_clone(ptype); + nex = asn1p_expr_clone(ptype, 0); if(nex == NULL) return -1; /* @@ -131,7 +131,7 @@ asn1f_param_process_recursive(arg_t *arg, asn1p_expr_t *expr, asn1p_expr_t *ptyp assert(child->meta_type == AMT_TYPEREF); assert(child->expr_type == A1TC_REFERENCE); - ne = asn1p_expr_clone(ra); + ne = asn1p_expr_clone(ra, 0); if(ne == NULL) return -1; assert(ne->Identifier == 0); ne->Identifier = strdup(child->Identifier); diff --git a/libasn1fix/asn1fix_retrieve.c b/libasn1fix/asn1fix_retrieve.c index f2f91d5c9..97e77fed0 100644 --- a/libasn1fix/asn1fix_retrieve.c +++ b/libasn1fix/asn1fix_retrieve.c @@ -1,6 +1,6 @@ #include "asn1fix_internal.h" -static asn1p_expr_t *asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, asn1p_module_t **optm, int type_or_value); +static asn1p_expr_t *asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, int type_or_value); static int asn1f_compatible_with_exports(arg_t *arg, asn1p_module_t *mod, const char *name); @@ -135,7 +135,7 @@ asn1f_lookup_module(arg_t *arg, const char *module_name, asn1p_oid_t *oid) { asn1p_expr_t * -asn1f_lookup_symbol(arg_t *arg, asn1p_ref_t *ref, asn1p_module_t **module_r) { +asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { asn1p_expr_t *ref_tc; /* Referenced tc */ asn1p_module_t *src_mod; char *modulename; @@ -155,7 +155,7 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_ref_t *ref, asn1p_module_t **module_r) { DEBUG("%s(%s) in %s for line %d", __func__, asn1f_printable_reference(ref), - arg->mod->Identifier, + mod->Identifier, ref->_lineno); if(ref->comp_count == 1) { @@ -173,7 +173,7 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_ref_t *ref, asn1p_module_t **module_r) { * This is a reference to a CLASS-related stuff. * Employ a separate function for that. */ - extract = asn1f_class_access(arg, ref, module_r); + extract = asn1f_class_access(arg, mod, ref); return extract; } else { @@ -216,7 +216,7 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_ref_t *ref, asn1p_module_t **module_r) { } } - if(src_mod == 0) src_mod = arg->mod; + if(src_mod == 0) src_mod = mod; /* * Now we know where to search for a value. @@ -242,29 +242,22 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_ref_t *ref, asn1p_module_t **module_r) { return NULL; } - if(module_r) - *module_r = src_mod; - return ref_tc; } asn1p_expr_t * -asn1f_find_terminal_type(arg_t *arg, asn1p_expr_t *expr, - asn1p_module_t **optm) { - return asn1f_find_terminal_thing(arg, expr, optm, 0); +asn1f_find_terminal_type(arg_t *arg, asn1p_expr_t *expr) { + return asn1f_find_terminal_thing(arg, expr, 0); } asn1p_expr_t * -asn1f_find_terminal_value(arg_t *arg, asn1p_expr_t *expr, - asn1p_module_t **optm) { - return asn1f_find_terminal_thing(arg, expr, optm, 1); +asn1f_find_terminal_value(arg_t *arg, asn1p_expr_t *expr) { + return asn1f_find_terminal_thing(arg, expr, 1); } static asn1p_expr_t * -asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, - asn1p_module_t **optm, int type_or_value) { - asn1p_module_t *mod; +asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, int type_or_value) { asn1p_ref_t *ref; asn1p_expr_t *tc; @@ -272,19 +265,15 @@ asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, /* VALUE */ assert(expr->meta_type == AMT_VALUE); assert(expr->value); - if(expr->value->type != ATV_REFERENCED) { - /* Expression is a terminal value itself */ - if(optm) *optm = arg->mod; + /* Expression may be a terminal type itself */ + if(expr->value->type != ATV_REFERENCED) return expr; - } ref = expr->value->value.reference; } else { /* TYPE */ - if(expr->expr_type != A1TC_REFERENCE) { - /* Expression is a terminal type itself */ - if(optm) *optm = arg->mod; + /* Expression may be a terminal type itself */ + if(expr->expr_type != A1TC_REFERENCE) return expr; - } ref = expr->reference; } @@ -300,12 +289,11 @@ asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, */ if(type_or_value) { asn1p_expr_t *val_type_tc; - val_type_tc = asn1f_find_terminal_type(arg, expr, 0); + val_type_tc = asn1f_find_terminal_type(arg, expr); if(val_type_tc && asn1f_look_value_in_type(arg, val_type_tc, expr)) return NULL; if(expr->value->type != ATV_REFERENCED) { - if(optm) *optm = arg->mod; return expr; } assert(ref == expr->value->value.reference); @@ -315,7 +303,7 @@ asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, /* * Lookup inside the default module. */ - tc = asn1f_lookup_symbol(arg, ref, &mod); + tc = asn1f_lookup_symbol(arg, expr->module, ref); if(tc == NULL) { DEBUG("\tSymbol \"%s\" not found: %s", asn1f_printable_reference(ref), @@ -334,8 +322,8 @@ asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, } tc->_mark |= TM_RECURSION; - WITH_MODULE(mod, - expr = asn1f_find_terminal_thing(arg, tc, optm, type_or_value)); + WITH_MODULE(tc->module, + expr = asn1f_find_terminal_thing(arg, tc, type_or_value)); tc->_mark &= ~TM_RECURSION; return expr; diff --git a/libasn1fix/asn1fix_retrieve.h b/libasn1fix/asn1fix_retrieve.h index 47aa0a5b6..7088b4934 100644 --- a/libasn1fix/asn1fix_retrieve.h +++ b/libasn1fix/asn1fix_retrieve.h @@ -36,11 +36,10 @@ asn1p_module_t *asn1f_lookup_module(arg_t *arg, /* * Return the reference to a destination of the given reference, * symbol lookup. Not a recursive function. - * Optional module reference may be assigned a module in which the - * particular expr was found. */ -asn1p_expr_t *asn1f_lookup_symbol(arg_t *arg, asn1p_ref_t *ref, - asn1p_module_t **opt_module_r); +asn1p_expr_t *asn1f_lookup_symbol(arg_t *arg, + asn1p_module_t *mod, + asn1p_ref_t *ref); /* * Recursively find the original type for the given expression. @@ -54,8 +53,7 @@ asn1p_expr_t *asn1f_lookup_symbol(arg_t *arg, asn1p_ref_t *ref, * would return an expression for Type4. * WARNING: No attempts are made to honor constraints at this moment. */ -asn1p_expr_t *asn1f_find_terminal_type(arg_t *arg, asn1p_expr_t *tc, - asn1p_module_t **opt_module_r); +asn1p_expr_t *asn1f_find_terminal_type(arg_t *arg, asn1p_expr_t *tc); /* * Recursively find the original value for the given expression. @@ -67,7 +65,6 @@ asn1p_expr_t *asn1f_find_terminal_type(arg_t *arg, asn1p_expr_t *tc, * Then this function will return the expression for value2 if given * the v as an argment. */ -asn1p_expr_t *asn1f_find_terminal_value(arg_t *arg, asn1p_expr_t *tc, - asn1p_module_t **opt_module_r); +asn1p_expr_t *asn1f_find_terminal_value(arg_t *arg, asn1p_expr_t *tc); #endif /* _ASN1FIX_RETRIEVE_H_ */ diff --git a/libasn1fix/asn1fix_tags.c b/libasn1fix/asn1fix_tags.c index ed8c19f28..de80fad59 100644 --- a/libasn1fix/asn1fix_tags.c +++ b/libasn1fix/asn1fix_tags.c @@ -30,14 +30,14 @@ asn1f_fetch_tag(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, struct as arg.mod = mod; arg.expr = expr; - expr = asn1f_lookup_symbol(&arg, expr->reference, &mod); + expr = asn1f_lookup_symbol(&arg, expr->module, expr->reference); if(expr == NULL) return -1; if(expr->_mark & TM_RECURSION) return -1; expr->_mark |= TM_RECURSION; - ret = asn1f_fetch_tag(asn, mod, expr, tag); + ret = asn1f_fetch_tag(asn, expr->module, expr, tag); expr->_mark &= ~TM_RECURSION; return ret; } diff --git a/libasn1fix/asn1fix_value.c b/libasn1fix/asn1fix_value.c index a0560edb9..33da36618 100644 --- a/libasn1fix/asn1fix_value.c +++ b/libasn1fix/asn1fix_value.c @@ -4,7 +4,6 @@ static int _asn1f_copy_value(arg_t *arg, asn1p_expr_t *to,asn1p_expr_t *from); int asn1f_value_resolve(arg_t *arg, asn1p_expr_t *expr) { - asn1p_module_t *val_mod; asn1p_expr_t *val_type_expr; asn1p_expr_t *value_expr; asn1p_expr_t *type_expr; @@ -20,7 +19,7 @@ asn1f_value_resolve(arg_t *arg, asn1p_expr_t *expr) { /* * 1. Find the terminal type for this assignment. */ - type_expr = asn1f_find_terminal_type(arg, expr, 0); + type_expr = asn1f_find_terminal_type(arg, expr); DEBUG("%s(): terminal type %p", __func__, type_expr); if(type_expr == 0) { DEBUG("\tTerminal type for %s not found", expr->Identifier); @@ -33,7 +32,7 @@ asn1f_value_resolve(arg_t *arg, asn1p_expr_t *expr) { /* * 2. Find the terminal value also. */ - value_expr = asn1f_find_terminal_value(arg, expr, &val_mod); + value_expr = asn1f_find_terminal_value(arg, expr); if(value_expr) { DEBUG("\tTerminal value for %s->%s is %s at line %d", expr->Identifier, asn1f_printable_value(expr->value), @@ -47,8 +46,8 @@ asn1f_value_resolve(arg_t *arg, asn1p_expr_t *expr) { /* * 3. Find the _type_ of a _terminal value_. */ - WITH_MODULE(val_mod, - val_type_expr = asn1f_find_terminal_type(arg, value_expr, 0)); + WITH_MODULE(value_expr->module, + val_type_expr = asn1f_find_terminal_type(arg, value_expr)); if(val_type_expr) { DEBUG("\tTerminal type of value %s->%s is %s at line %d", expr->Identifier, asn1f_printable_value(expr->value), From e8423bcf4b0cb3368816ff09e065af280757a4e1 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 22 Aug 2004 03:10:52 +0000 Subject: [PATCH 0182/1469] api change git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@182 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_constraint.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index 672390ebb..9a37fd226 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -570,7 +570,7 @@ emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype) { static asn1p_expr_type_e _find_terminal_type(arg_t *arg) { asn1p_expr_t *expr; - expr = asn1f_find_terminal_type_ex(arg->asn, arg->mod, arg->expr, NULL); + expr = asn1f_find_terminal_type_ex(arg->asn, arg->mod, arg->expr); if(expr) return expr->expr_type; return A1TC_INVALID; } From 7b9a7688fab374209f4b88efa8a20f401f12706a Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 22 Aug 2004 03:18:17 +0000 Subject: [PATCH 0183/1469] set of/sequence of compile testing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@183 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/31-set-of-OK.asn1 | 13 ++ tests/31-set-of-OK.asn1.-EF | 23 +++ tests/31-set-of-OK.asn1.-P | 349 ++++++++++++++++++++++++++++++++++++ 3 files changed, 385 insertions(+) create mode 100644 tests/31-set-of-OK.asn1.-EF create mode 100644 tests/31-set-of-OK.asn1.-P diff --git a/tests/31-set-of-OK.asn1 b/tests/31-set-of-OK.asn1 index cd108ba0f..6f36c0172 100644 --- a/tests/31-set-of-OK.asn1 +++ b/tests/31-set-of-OK.asn1 @@ -18,4 +18,17 @@ BEGIN width INTEGER } + -- The following clause tests OPTIONAL. + Stuff ::= SET { + trees [0] SET OF Forest OPTIONAL, + anything [1] SET OF + SEQUENCE { + cup-of-coffee BIT STRING, + ... + } OPTIONAL + -- The above OPTIONAL applies to the "anything" + -- member of the outer CHOICE, + -- not to the SET OF's embedded SEQUENCE! + } + END diff --git a/tests/31-set-of-OK.asn1.-EF b/tests/31-set-of-OK.asn1.-EF new file mode 100644 index 000000000..34d340181 --- /dev/null +++ b/tests/31-set-of-OK.asn1.-EF @@ -0,0 +1,23 @@ + +ModuleTestSetOfSimple {iso(-1) org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 31 } +DEFINITIONS IMPLICIT TAGS ::= +BEGIN + +Forest ::= SET OF Tree + +Tree ::= SEQUENCE { + height INTEGER, + width INTEGER +} + +Stuff ::= SET { + trees [0] IMPLICIT SET OF Forest OPTIONAL, + anything [1] IMPLICIT SET OF SEQUENCE { + cup-of-coffee BIT STRING, + ... + } OPTIONAL +} + +END diff --git a/tests/31-set-of-OK.asn1.-P b/tests/31-set-of-OK.asn1.-P new file mode 100644 index 000000000..0178f298d --- /dev/null +++ b/tests/31-set-of-OK.asn1.-P @@ -0,0 +1,349 @@ + +/*** <<< INCLUDES [Forest] >>> ***/ + +#include +#include +#include + +/*** <<< DEPS [Forest] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Forest; + +/*** <<< TYPE-DECLS [Forest] >>> ***/ + + +typedef struct Forest { + A_SET_OF(struct Tree) list; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} Forest_t; + +/*** <<< STAT-DEFS [Forest] >>> ***/ + +static asn1_TYPE_member_t asn1_MBR_Forest[] = { + { 0, 0, + .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_Tree, + .memb_constraints = 0, /* Defer to actual type */ + .name = "" + }, +}; +static ber_tlv_tag_t asn1_DEF_Forest_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) +}; +static asn1_SET_OF_specifics_t asn1_DEF_Forest_specs = { + sizeof(struct Forest), + offsetof(struct Forest, _ber_dec_ctx), +}; +asn1_TYPE_descriptor_t asn1_DEF_Forest = { + "Forest", + SET_OF_constraint, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_print, + SET_OF_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Forest_tags, + sizeof(asn1_DEF_Forest_tags) + /sizeof(asn1_DEF_Forest_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_Forest, + 1, /* Single element */ + &asn1_DEF_Forest_specs /* Additional specs */ +}; + + +/*** <<< INCLUDES [Tree] >>> ***/ + +#include +#include + +/*** <<< DEPS [Tree] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Tree; + +/*** <<< TYPE-DECLS [Tree] >>> ***/ + + +typedef struct Tree { + INTEGER_t height; + INTEGER_t width; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} Tree_t; + +/*** <<< STAT-DEFS [Tree] >>> ***/ + +static asn1_TYPE_member_t asn1_MBR_Tree[] = { + { 0, offsetof(struct Tree, height), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_INTEGER, + .memb_constraints = 0, /* Defer to actual type */ + .name = "height" + }, + { 0, offsetof(struct Tree, width), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_INTEGER, + .memb_constraints = 0, /* Defer to actual type */ + .name = "width" + }, +}; +static ber_tlv_tag_t asn1_DEF_Tree_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_TYPE_tag2member_t asn1_DEF_Tree_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 1 }, /* height at 17 */ + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, -1, 0 }, /* width at 19 */ +}; +static asn1_SEQUENCE_specifics_t asn1_DEF_Tree_specs = { + sizeof(struct Tree), + offsetof(struct Tree, _ber_dec_ctx), + asn1_DEF_Tree_tag2el, + 2, /* Count of tags in the map */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn1_TYPE_descriptor_t asn1_DEF_Tree = { + "Tree", + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_print, + SEQUENCE_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Tree_tags, + sizeof(asn1_DEF_Tree_tags) + /sizeof(asn1_DEF_Tree_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_Tree, + 2, /* Elements count */ + &asn1_DEF_Tree_specs /* Additional specs */ +}; + + +/*** <<< INCLUDES [Stuff] >>> ***/ + +#include +#include +#include +#include +#include +#include + +/*** <<< DEPS [Stuff] >>> ***/ + + +/* + * Method of determining the components presence + */ +typedef enum Stuff_PR { + Stuff_PR_trees, /* Member trees is present */ + Stuff_PR_anything, /* Member anything is present */ +} Stuff_PR; +extern asn1_TYPE_descriptor_t asn1_DEF_Stuff; + +/*** <<< TYPE-DECLS [Stuff] >>> ***/ + + +typedef struct Stuff { + struct trees { + A_SET_OF(struct Forest) list; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; + } *trees; + struct anything { + A_SET_OF(struct anything_member { + BIT_STRING_t cup_of_coffee; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; + } ) list; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; + } *anything; + + /* Presence bitmask: ASN_SET_ISPRESENT(pStuff, Stuff_PR_x) */ + unsigned int _presence_map + [((2+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))]; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} Stuff_t; + +/*** <<< STAT-DEFS [Stuff] >>> ***/ + +static asn1_TYPE_member_t asn1_MBR_trees[] = { + { 0, 0, + .tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_Forest, + .memb_constraints = 0, /* Defer to actual type */ + .name = "" + }, +}; +static ber_tlv_tag_t asn1_DEF_trees_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (0 << 2)) +}; +static asn1_SET_OF_specifics_t asn1_DEF_trees_specs = { + sizeof(struct trees), + offsetof(struct trees, _ber_dec_ctx), +}; +asn1_TYPE_descriptor_t asn1_DEF_trees = { + "trees", + SET_OF_constraint, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_print, + SET_OF_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_trees_tags, + sizeof(asn1_DEF_trees_tags) + /sizeof(asn1_DEF_trees_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_trees, + 1, /* Single element */ + &asn1_DEF_trees_specs /* Additional specs */ +}; + +static asn1_TYPE_member_t asn1_MBR_anything_member[] = { + { 0, offsetof(struct anything_member, cup_of_coffee), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_BIT_STRING, + .memb_constraints = 0, /* Defer to actual type */ + .name = "cup-of-coffee" + }, +}; +static ber_tlv_tag_t asn1_DEF_anything_member_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_TYPE_tag2member_t asn1_DEF_anything_member_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 0, 0, 0 }, /* cup-of-coffee at 26 */ +}; +static asn1_SEQUENCE_specifics_t asn1_DEF_anything_member_specs = { + sizeof(struct anything_member), + offsetof(struct anything_member, _ber_dec_ctx), + asn1_DEF_anything_member_tag2el, + 1, /* Count of tags in the map */ + 0, /* Start extensions */ + 2 /* Stop extensions */ +}; +asn1_TYPE_descriptor_t asn1_DEF_anything_member = { + "", + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_print, + SEQUENCE_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_anything_member_tags, + sizeof(asn1_DEF_anything_member_tags) + /sizeof(asn1_DEF_anything_member_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_anything_member, + 1, /* Elements count */ + &asn1_DEF_anything_member_specs /* Additional specs */ +}; + +static asn1_TYPE_member_t asn1_MBR_anything[] = { + { 0, 0, + .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_anything_member, + .memb_constraints = 0, /* Defer to actual type */ + .name = "" + }, +}; +static ber_tlv_tag_t asn1_DEF_anything_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (1 << 2)) +}; +static asn1_SET_OF_specifics_t asn1_DEF_anything_specs = { + sizeof(struct anything), + offsetof(struct anything, _ber_dec_ctx), +}; +asn1_TYPE_descriptor_t asn1_DEF_anything = { + "anything", + SET_OF_constraint, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_print, + SET_OF_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_anything_tags, + sizeof(asn1_DEF_anything_tags) + /sizeof(asn1_DEF_anything_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_anything, + 1, /* Single element */ + &asn1_DEF_anything_specs /* Additional specs */ +}; + +static asn1_TYPE_member_t asn1_MBR_Stuff[] = { + { 2, offsetof(struct Stuff, trees), + .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn1_DEF_trees, + .memb_constraints = 0, /* Defer to actual type */ + .name = "trees" + }, + { 1, offsetof(struct Stuff, anything), + .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn1_DEF_anything, + .memb_constraints = 0, /* Defer to actual type */ + .name = "anything" + }, +}; +static ber_tlv_tag_t asn1_DEF_Stuff_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) +}; +static asn1_TYPE_tag2member_t asn1_DEF_Stuff_tag2el[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* trees at 23 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* anything at 28 */ +}; +static uint8_t asn1_DEF_Stuff_mmap[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = { + (0 << 7) | (0 << 6) +}; +static asn1_SET_specifics_t asn1_DEF_Stuff_specs = { + sizeof(struct Stuff), + offsetof(struct Stuff, _ber_dec_ctx), + offsetof(struct Stuff, _presence_map), + asn1_DEF_Stuff_tag2el, + 2, /* Count of tags in the map */ + 0, /* Whether extensible */ + (unsigned int *)asn1_DEF_Stuff_mmap /* Mandatory elements map */ +}; +asn1_TYPE_descriptor_t asn1_DEF_Stuff = { + "Stuff", + SET_constraint, + SET_decode_ber, + SET_encode_der, + SET_print, + SET_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Stuff_tags, + sizeof(asn1_DEF_Stuff_tags) + /sizeof(asn1_DEF_Stuff_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_Stuff, + 2, /* Elements count */ + &asn1_DEF_Stuff_specs /* Additional specs */ +}; + From 824aefc22f7848aeb4d7ec81fa823f82e375a124 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 22 Aug 2004 03:19:00 +0000 Subject: [PATCH 0184/1469] updated git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@184 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/19-param-OK.asn1.-P | 10 +++++----- tests/42-real-life-OK.asn1.-PR | 12 ++++++------ tests/46-redefine-OK.asn1.-PR | 2 -- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/tests/19-param-OK.asn1.-P b/tests/19-param-OK.asn1.-P index d52ab07e6..6d3b865fb 100644 --- a/tests/19-param-OK.asn1.-P +++ b/tests/19-param-OK.asn1.-P @@ -241,8 +241,8 @@ static int check_permitted_alphabet_1(const void *sptr) { int *table = permitted_alphabet_table_1; /* The underlying type is IA5String */ const IA5String_t *st = sptr; - uint8_t *ch = st->buf; - uint8_t *end = ch + st->size; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; for(; ch < end; ch++) { uint8_t cv = *ch; @@ -255,9 +255,9 @@ static int check_permitted_alphabet_1(const void *sptr) { /*** <<< CODE [RelativeDistinguishedName] >>> ***/ static int -memb_IA5String_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +memb_IA5String_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const (null)_t *st = sptr; + const IA5String_t *st = sptr; if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, @@ -284,7 +284,7 @@ static asn1_TYPE_member_t asn1_MBR_RelativeDistinguishedName[] = { .tag = (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_IA5String, - .memb_constraints = memb_IA5String_constraint, + .memb_constraints = memb_IA5String_1_constraint, .name = "" }, }; diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index 2bd4579e7..aaa2e9f54 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -34,7 +34,7 @@ typedef struct LogLine { /*** <<< CODE [LogLine] >>> ***/ static int -memb_varsets_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +memb_varsets_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { size_t size; @@ -109,7 +109,7 @@ static asn1_TYPE_member_t asn1_MBR_LogLine[] = { .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_varsets, - .memb_constraints = memb_varsets_constraint, + .memb_constraints = memb_varsets_1_constraint, .name = "varsets" }, }; @@ -182,7 +182,7 @@ typedef struct VariablePartSet { /*** <<< CODE [VariablePartSet] >>> ***/ static int -memb_vparts_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +memb_vparts_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { if(!sptr) { @@ -242,7 +242,7 @@ static asn1_TYPE_member_t asn1_MBR_VariablePartSet[] = { .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_vparts, - .memb_constraints = memb_vparts_constraint, + .memb_constraints = memb_vparts_2_constraint, .name = "vparts" }, { 0, offsetof(struct VariablePartSet, resolution), @@ -341,7 +341,7 @@ typedef struct VariablePart { /*** <<< CODE [VariablePart] >>> ***/ static int -memb_vset_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +memb_vset_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { size_t size; @@ -458,7 +458,7 @@ static asn1_TYPE_member_t asn1_MBR_VariablePart[] = { .tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_vset, - .memb_constraints = memb_vset_constraint, + .memb_constraints = memb_vset_3_constraint, .name = "vset" }, { 0, offsetof(struct VariablePart, choice.vrange), diff --git a/tests/46-redefine-OK.asn1.-PR b/tests/46-redefine-OK.asn1.-PR index ee7aceb42..ad54f8748 100644 --- a/tests/46-redefine-OK.asn1.-PR +++ b/tests/46-redefine-OK.asn1.-PR @@ -8,7 +8,6 @@ typedef OCTET_STRING_t PrimitiveType_t; - /*** <<< FUNC-DECLS [PrimitiveType] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_PrimitiveType; @@ -172,7 +171,6 @@ asn1_TYPE_descriptor_t asn1_DEF_ConstructedType = { typedef ConstructedType_t T_t; - /*** <<< FUNC-DECLS [T] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_T; From ec8f68196ffbad247e0757691973b2ebd8a79499 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 22 Aug 2004 03:19:54 +0000 Subject: [PATCH 0185/1469] COMPONENTS OF support and other enhancements git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@185 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_expr.c | 17 +- libasn1parser/asn1p_expr.h | 12 +- libasn1parser/asn1p_y.c | 1716 ++++++++++++++++++------------------ libasn1parser/asn1p_y.y | 251 +++--- libasn1parser/asn1parser.c | 33 +- 5 files changed, 1066 insertions(+), 963 deletions(-) diff --git a/libasn1parser/asn1p_expr.c b/libasn1parser/asn1p_expr.c index be9da7734..4337981f9 100644 --- a/libasn1parser/asn1p_expr.c +++ b/libasn1parser/asn1p_expr.c @@ -23,9 +23,10 @@ asn1p_expr_new(int _lineno) { } asn1p_expr_t * -asn1p_expr_clone(asn1p_expr_t *expr) { +asn1p_expr_clone(asn1p_expr_t *expr, int skip_extensions) { asn1p_expr_t *clone; asn1p_expr_t *tcmemb; /* Child of tc */ + int hit_ext = 0; clone = asn1p_expr_new(expr->_lineno); if(clone == NULL) return NULL; @@ -45,7 +46,8 @@ asn1p_expr_clone(asn1p_expr_t *expr) { CLCOPY(meta_type); CLCOPY(expr_type); CLCOPY(tag); - CLCOPY(marker); + CLCOPY(marker); /* OPTIONAL/DEFAULT */ + CLCOPY(module); CLCOPY(_mark); clone->data = 0; /* Do not clone this */ @@ -66,7 +68,16 @@ asn1p_expr_clone(asn1p_expr_t *expr) { * Copy all the children of this expr. */ TQ_FOR(tcmemb, &(expr->members), next) { - asn1p_expr_t *cmemb = asn1p_expr_clone(tcmemb); + asn1p_expr_t *cmemb; + + if(skip_extensions + && tcmemb->expr_type == A1TC_EXTENSIBLE) { + hit_ext++; /* Even if hit_ext wraps around, we're OK. */ + continue; + } + if(hit_ext == 1) continue; /* Skip between ...'s */ + + cmemb = asn1p_expr_clone(tcmemb, skip_extensions); if(cmemb == NULL) { asn1p_expr_free(clone); return NULL; diff --git a/libasn1parser/asn1p_expr.h b/libasn1parser/asn1p_expr.h index ef1941b7f..e00e740ca 100644 --- a/libasn1parser/asn1p_expr.h +++ b/libasn1parser/asn1p_expr.h @@ -35,12 +35,14 @@ typedef enum asn1p_expr_type { A1TC_BITVECTOR, /* A plain collection of bits */ A1TC_OPAQUE, /* Opaque data encoded as a bitvector */ A1TC_EXTENSIBLE, /* An extension marker "..." */ + A1TC_COMPONENTS_OF, /* COMPONENTS OF clause */ A1TC_PARAMETRIZED, /* A parametrized type declaration */ A1TC_VALUESET, /* Value set definition */ A1TC_CLASSDEF, /* Information Object Class */ A1TC_CLASSFIELD, /* Information Object Class field */ A1TC_INSTANCE, /* Instance of Object Class */ A1TC_TYPEID, /* Type identifier */ + /* * ASN.1 Constructed types */ @@ -69,6 +71,7 @@ typedef enum asn1p_expr_type { ASN_BASIC_CHARACTER_STRING, ASN_BASIC_UTCTime, ASN_BASIC_GeneralizedTime, + /* * ASN.1 String types */ @@ -93,6 +96,8 @@ typedef enum asn1p_expr_type { #include "asn1p_expr_str.h" #include "asn1p_expr2uclass.h" +struct asn1p_module_s; /* Forward declaration */ + /* * A named collection of types. */ @@ -192,6 +197,9 @@ typedef struct asn1p_expr_s { * grammar source. */ int _lineno; + + struct asn1p_module_s *module; /* Defined in module */ + /* * Marks are used for various purposes. * Here are some predefined ones. @@ -201,6 +209,8 @@ typedef struct asn1p_expr_s { TM_RECURSION, /* Used to break recursion */ } _mark; + int _anonymous_type; /* Used by the compiler */ + /* * Opaque data may be attached to this structure, * probably by compiler. @@ -214,7 +224,7 @@ typedef struct asn1p_expr_s { * Constructor and destructor. */ asn1p_expr_t *asn1p_expr_new(int _lineno); -asn1p_expr_t *asn1p_expr_clone(asn1p_expr_t *); +asn1p_expr_t *asn1p_expr_clone(asn1p_expr_t *, int skip_extensions); void asn1p_expr_free(asn1p_expr_t *expr); #endif /* ASN1_PARSER_EXPR_H */ diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index fe2d194b8..e8cdfb243 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -205,7 +205,7 @@ typedef union { -#define YYFINAL 385 +#define YYFINAL 391 #define YYFLAG -32768 #define YYNTBASE 115 @@ -259,24 +259,25 @@ static const short yyprhs[] = { 0, 107, 111, 113, 115, 119, 123, 126, 128, 132, 134, 136, 143, 145, 147, 148, 150, 155, 160, 164, 171, 173, 177, 179, 183, 187, 189, 193, 195, 197, 199, - 203, 209, 210, 212, 214, 218, 221, 225, 230, 231, - 233, 234, 241, 243, 246, 248, 250, 253, 255, 259, - 261, 263, 267, 271, 273, 275, 277, 282, 284, 288, - 290, 294, 298, 300, 304, 306, 310, 312, 314, 316, - 318, 323, 324, 328, 330, 332, 334, 336, 338, 340, - 344, 346, 349, 351, 353, 355, 357, 360, 363, 365, - 367, 370, 373, 375, 377, 379, 381, 384, 386, 389, - 391, 393, 395, 397, 399, 401, 403, 405, 407, 409, - 411, 413, 415, 417, 422, 427, 432, 437, 442, 444, - 449, 451, 453, 455, 457, 459, 460, 462, 464, 469, - 473, 478, 480, 484, 490, 492, 496, 500, 504, 509, - 513, 515, 519, 523, 527, 531, 533, 535, 537, 540, - 543, 547, 549, 551, 553, 555, 557, 559, 561, 567, - 569, 573, 575, 579, 580, 582, 584, 586, 588, 590, - 592, 596, 601, 603, 607, 610, 614, 616, 620, 621, - 623, 625, 628, 630, 632, 633, 637, 640, 644, 646, - 650, 652, 657, 662, 664, 666, 668, 670, 671, 673, - 675, 678, 681, 683, 685, 687, 689, 691 + 203, 207, 211, 213, 215, 219, 222, 224, 230, 231, + 233, 235, 239, 242, 247, 252, 253, 255, 256, 263, + 265, 268, 270, 272, 274, 278, 282, 285, 287, 289, + 294, 299, 304, 309, 314, 316, 321, 326, 328, 332, + 334, 338, 342, 344, 348, 350, 354, 356, 358, 360, + 362, 367, 368, 372, 374, 376, 378, 380, 382, 384, + 388, 390, 393, 395, 397, 399, 401, 404, 407, 409, + 411, 414, 417, 419, 421, 423, 425, 428, 430, 433, + 435, 437, 439, 441, 443, 445, 447, 449, 451, 453, + 455, 457, 459, 461, 463, 465, 467, 469, 471, 472, + 474, 476, 481, 485, 490, 492, 496, 502, 504, 508, + 512, 516, 521, 525, 527, 531, 535, 539, 543, 545, + 547, 549, 552, 555, 559, 561, 563, 565, 567, 569, + 571, 573, 579, 581, 585, 587, 591, 592, 594, 596, + 598, 600, 602, 604, 608, 613, 615, 619, 622, 626, + 628, 632, 633, 635, 637, 640, 642, 644, 645, 649, + 652, 656, 658, 662, 664, 669, 674, 676, 678, 680, + 682, 683, 685, 687, 690, 693, 695, 697, 699, 701, + 703 }; static const short yyrhs[] = { 116, @@ -287,69 +288,70 @@ static const short yyrhs[] = { 116, 123, 0, 124, 0, 123, 124, 0, 41, 84, 0, 52, 84, 0, 20, 84, 0, 43, 53, 0, 12, 57, 0, 0, 126, 0, 127, 0, 126, 127, 0, - 129, 0, 134, 0, 140, 0, 164, 0, 137, 0, - 0, 38, 12, 128, 0, 172, 0, 54, 130, 108, + 129, 0, 134, 0, 140, 0, 166, 0, 137, 0, + 0, 38, 12, 128, 0, 174, 0, 54, 130, 108, 0, 54, 46, 0, 131, 0, 130, 131, 0, 132, 46, 208, 118, 0, 133, 0, 132, 109, 133, 0, 208, 0, 210, 0, 42, 135, 108, 0, 42, 17, 108, 0, 42, 108, 0, 136, 0, 135, 109, 136, 0, 208, 0, 210, 0, 208, 138, 3, 104, 139, - 105, 0, 159, 0, 169, 0, 0, 181, 0, 208, - 3, 206, 87, 0, 208, 3, 206, 156, 0, 208, - 3, 146, 0, 208, 104, 141, 105, 3, 156, 0, + 105, 0, 161, 0, 171, 0, 0, 181, 0, 208, + 3, 206, 87, 0, 208, 3, 206, 159, 0, 208, + 3, 149, 0, 208, 104, 141, 105, 3, 159, 0, 142, 0, 141, 109, 142, 0, 208, 0, 208, 110, - 210, 0, 169, 110, 210, 0, 144, 0, 143, 109, - 144, 0, 158, 0, 210, 0, 155, 0, 145, 109, - 155, 0, 28, 104, 148, 105, 150, 0, 0, 88, - 0, 149, 0, 148, 109, 149, 0, 162, 198, 0, - 162, 156, 147, 0, 162, 162, 198, 147, 0, 0, - 151, 0, 0, 95, 82, 104, 152, 153, 105, 0, - 154, 0, 153, 154, 0, 4, 0, 162, 0, 211, - 156, 0, 157, 0, 158, 178, 198, 0, 173, 0, - 102, 0, 102, 111, 167, 0, 102, 111, 205, 0, - 171, 0, 172, 0, 174, 0, 208, 104, 143, 105, - 0, 159, 0, 56, 68, 159, 0, 11, 0, 11, - 112, 208, 0, 11, 112, 210, 0, 209, 0, 209, - 112, 160, 0, 161, 0, 160, 112, 161, 0, 163, - 0, 163, 0, 13, 0, 14, 0, 210, 138, 3, - 165, 0, 0, 104, 166, 168, 0, 5, 0, 7, - 0, 6, 0, 205, 0, 167, 0, 210, 0, 208, - 112, 210, 0, 4, 0, 168, 4, 0, 24, 0, - 63, 0, 76, 0, 170, 0, 67, 81, 0, 65, - 51, 0, 77, 0, 44, 0, 36, 71, 0, 26, - 81, 0, 91, 0, 47, 0, 58, 0, 40, 0, - 22, 81, 0, 169, 0, 170, 202, 0, 23, 0, - 48, 0, 49, 0, 50, 0, 59, 0, 64, 0, - 74, 0, 83, 0, 85, 0, 90, 0, 92, 0, - 93, 0, 94, 0, 66, 0, 78, 178, 68, 156, - 0, 79, 178, 68, 156, 0, 27, 104, 145, 105, - 0, 78, 104, 145, 105, 0, 79, 104, 145, 105, - 0, 18, 0, 18, 35, 25, 210, 0, 99, 0, - 100, 0, 97, 0, 98, 0, 96, 0, 0, 179, - 0, 180, 0, 80, 106, 181, 107, 0, 106, 181, - 107, 0, 180, 106, 181, 107, 0, 182, 0, 182, - 109, 102, 0, 182, 109, 102, 109, 182, 0, 183, - 0, 182, 175, 183, 0, 182, 176, 183, 0, 183, - 177, 183, 0, 185, 106, 181, 107, 0, 106, 181, - 107, 0, 186, 0, 186, 184, 186, 0, 61, 184, - 186, 0, 186, 184, 60, 0, 61, 184, 60, 0, - 192, 0, 187, 0, 101, 0, 101, 113, 0, 113, - 101, 0, 113, 101, 113, 0, 80, 0, 46, 0, - 205, 0, 210, 0, 6, 0, 45, 0, 86, 0, - 95, 30, 104, 188, 105, 0, 189, 0, 188, 109, - 189, 0, 102, 0, 210, 178, 190, 0, 0, 191, - 0, 73, 0, 15, 0, 69, 0, 193, 0, 194, - 0, 104, 208, 105, 0, 193, 104, 195, 105, 0, - 196, 0, 195, 109, 196, 0, 114, 197, 0, 114, - 112, 197, 0, 210, 0, 197, 112, 210, 0, 0, - 199, 0, 69, 0, 33, 200, 0, 186, 0, 169, - 0, 0, 104, 201, 168, 0, 104, 105, 0, 104, - 203, 105, 0, 204, 0, 203, 109, 204, 0, 210, - 0, 210, 106, 205, 107, 0, 210, 106, 167, 107, - 0, 205, 0, 102, 0, 9, 0, 10, 0, 0, - 207, 0, 103, 0, 103, 52, 0, 103, 41, 0, - 11, 0, 12, 0, 12, 0, 8, 0, 210, 0, - 210, 207, 0 + 210, 0, 171, 110, 210, 0, 144, 0, 143, 109, + 144, 0, 159, 0, 210, 0, 146, 0, 145, 109, + 146, 0, 211, 159, 198, 0, 30, 68, 159, 0, + 158, 0, 148, 0, 147, 109, 148, 0, 211, 159, + 0, 158, 0, 28, 104, 151, 105, 153, 0, 0, + 88, 0, 152, 0, 151, 109, 152, 0, 164, 198, + 0, 164, 159, 198, 150, 0, 164, 164, 198, 150, + 0, 0, 154, 0, 0, 95, 82, 104, 155, 156, + 105, 0, 157, 0, 156, 157, 0, 4, 0, 164, + 0, 102, 0, 102, 111, 169, 0, 102, 111, 205, + 0, 160, 178, 0, 173, 0, 174, 0, 27, 104, + 147, 105, 0, 78, 104, 145, 105, 0, 79, 104, + 145, 105, 0, 78, 178, 68, 160, 0, 79, 178, + 68, 160, 0, 18, 0, 18, 35, 25, 210, 0, + 208, 104, 143, 105, 0, 161, 0, 56, 68, 161, + 0, 11, 0, 11, 112, 208, 0, 11, 112, 210, + 0, 209, 0, 209, 112, 162, 0, 163, 0, 162, + 112, 163, 0, 165, 0, 165, 0, 13, 0, 14, + 0, 210, 138, 3, 167, 0, 0, 104, 168, 170, + 0, 5, 0, 7, 0, 6, 0, 205, 0, 169, + 0, 210, 0, 208, 112, 210, 0, 4, 0, 170, + 4, 0, 24, 0, 63, 0, 76, 0, 172, 0, + 67, 81, 0, 65, 51, 0, 77, 0, 44, 0, + 36, 71, 0, 26, 81, 0, 91, 0, 47, 0, + 58, 0, 40, 0, 22, 81, 0, 171, 0, 172, + 202, 0, 23, 0, 48, 0, 49, 0, 50, 0, + 59, 0, 64, 0, 74, 0, 83, 0, 85, 0, + 90, 0, 92, 0, 93, 0, 94, 0, 66, 0, + 99, 0, 100, 0, 97, 0, 98, 0, 96, 0, + 0, 179, 0, 180, 0, 80, 106, 181, 107, 0, + 106, 181, 107, 0, 180, 106, 181, 107, 0, 182, + 0, 182, 109, 102, 0, 182, 109, 102, 109, 182, + 0, 183, 0, 182, 175, 183, 0, 182, 176, 183, + 0, 183, 177, 183, 0, 185, 106, 181, 107, 0, + 106, 181, 107, 0, 186, 0, 186, 184, 186, 0, + 61, 184, 186, 0, 186, 184, 60, 0, 61, 184, + 60, 0, 192, 0, 187, 0, 101, 0, 101, 113, + 0, 113, 101, 0, 113, 101, 113, 0, 80, 0, + 46, 0, 205, 0, 210, 0, 6, 0, 45, 0, + 86, 0, 95, 30, 104, 188, 105, 0, 189, 0, + 188, 109, 189, 0, 102, 0, 210, 178, 190, 0, + 0, 191, 0, 73, 0, 15, 0, 69, 0, 193, + 0, 194, 0, 104, 208, 105, 0, 193, 104, 195, + 105, 0, 196, 0, 195, 109, 196, 0, 114, 197, + 0, 114, 112, 197, 0, 210, 0, 197, 112, 210, + 0, 0, 199, 0, 69, 0, 33, 200, 0, 186, + 0, 171, 0, 0, 104, 201, 170, 0, 104, 105, + 0, 104, 203, 105, 0, 204, 0, 203, 109, 204, + 0, 210, 0, 210, 106, 205, 107, 0, 210, 106, + 169, 107, 0, 205, 0, 102, 0, 9, 0, 10, + 0, 0, 207, 0, 103, 0, 103, 52, 0, 103, + 41, 0, 11, 0, 12, 0, 12, 0, 8, 0, + 210, 0, 210, 207, 0 }; #endif @@ -361,26 +363,27 @@ static const short yyrline[] = { 0, 430, 434, 454, 456, 464, 468, 500, 504, 513, 520, 533, 540, 542, 554, 567, 574, 579, 585, 591, 600, 606, 612, 619, 627, 631, 634, 641, 647, 653, 660, - 669, 679, 687, 695, 697, 709, 721, 728, 744, 754, - 764, 774, 779, 786, 796, 802, 808, 812, 824, 830, - 836, 846, 848, 851, 859, 865, 874, 879, 896, 898, - 903, 907, 912, 917, 923, 927, 952, 959, 964, 974, - 982, 991, 1000, 1011, 1015, 1021, 1029, 1053, 1060, 1074, - 1083, 1093, 1103, 1111, 1132, 1141, 1150, 1151, 1153, 1160, - 1172, 1182, 1184, 1189, 1193, 1197, 1201, 1204, 1209, 1221, - 1237, 1248, 1262, 1264, 1265, 1266, 1267, 1268, 1269, 1270, - 1271, 1272, 1273, 1274, 1280, 1282, 1283, 1286, 1293, 1305, - 1307, 1311, 1315, 1316, 1317, 1318, 1319, 1323, 1324, 1325, - 1326, 1330, 1331, 1335, 1344, 1354, 1361, 1367, 1373, 1379, - 1395, 1395, 1396, 1396, 1397, 1399, 1401, 1406, 1410, 1419, - 1423, 1428, 1432, 1438, 1448, 1452, 1455, 1458, 1463, 1472, - 1480, 1486, 1493, 1501, 1509, 1518, 1521, 1526, 1528, 1529, - 1530, 1533, 1537, 1542, 1546, 1557, 1562, 1567, 1574, 1580, - 1584, 1589, 1595, 1607, 1609, 1612, 1616, 1619, 1624, 1628, - 1636, 1651, 1657, 1664, 1677, 1689, 1704, 1708, 1725, 1727, - 1730, 1734, 1740, 1743, 1745, 1745, 1765, 1770, 1775, 1781, - 1787, 1795, 1803, 1811, 1818, 1828, 1833, 1863, 1865, 1868, - 1873, 1877, 1883, 1888, 1895, 1902, 1909, 1914 + 669, 679, 687, 695, 697, 709, 721, 728, 744, 753, + 763, 773, 778, 785, 795, 801, 807, 811, 823, 829, + 835, 843, 850, 855, 861, 867, 874, 879, 889, 891, + 894, 902, 908, 917, 923, 940, 942, 947, 951, 956, + 961, 967, 971, 982, 991, 1000, 1011, 1032, 1036, 1042, + 1048, 1054, 1060, 1068, 1076, 1082, 1097, 1121, 1128, 1142, + 1151, 1161, 1171, 1179, 1200, 1209, 1218, 1219, 1221, 1228, + 1240, 1250, 1252, 1257, 1261, 1265, 1269, 1272, 1277, 1289, + 1305, 1316, 1330, 1332, 1333, 1334, 1335, 1336, 1337, 1338, + 1339, 1340, 1341, 1342, 1348, 1350, 1351, 1354, 1361, 1373, + 1375, 1379, 1383, 1384, 1385, 1386, 1387, 1391, 1392, 1393, + 1394, 1398, 1399, 1406, 1406, 1407, 1407, 1408, 1410, 1412, + 1417, 1421, 1430, 1434, 1439, 1443, 1449, 1459, 1463, 1466, + 1469, 1474, 1483, 1491, 1497, 1504, 1512, 1520, 1529, 1532, + 1537, 1539, 1540, 1541, 1544, 1548, 1553, 1557, 1568, 1573, + 1578, 1585, 1591, 1595, 1600, 1606, 1618, 1620, 1623, 1627, + 1630, 1635, 1639, 1647, 1662, 1668, 1675, 1688, 1700, 1715, + 1719, 1736, 1738, 1741, 1745, 1751, 1754, 1756, 1756, 1776, + 1781, 1786, 1792, 1798, 1806, 1814, 1822, 1829, 1839, 1844, + 1874, 1876, 1879, 1884, 1888, 1894, 1899, 1906, 1913, 1920, + 1925 }; #endif @@ -414,21 +417,20 @@ static const char * const yytname[] = { "$","error","$undefined.","TOK_PPEQ", "ImportsBundleSet","ImportsBundle","ImportsList","ImportsElement","ExportsDefinition", "ExportsBody","ExportsElement","ValueSetDefinition","DefinedTypeRef","optValueSetBody", "DataTypeReference","ParameterArgumentList","ParameterArgumentName","ActualParameterList", -"ActualParameter","ConstructedDataTypeDefinition","ClassDeclaration","optUnique", -"ClassFieldList","ClassField","optWithSyntax","WithSyntax","@2","WithSyntaxFormat", -"WithSyntaxFormatToken","DataTypeMember","ConstrainedTypeDeclaration","ExtensionAndException", -"UnconstrainedTypeDeclaration","ComplexTypeReference","ComplexTypeReferenceAmpList", +"ActualParameter","ComponentTypeLists","ComponentType","AlternativeTypeLists", +"AlternativeType","ClassDeclaration","optUnique","ClassFieldList","ClassField", +"optWithSyntax","WithSyntax","@2","WithSyntaxFormat","WithSyntaxFormatToken", +"ExtensionAndException","Type","TypeDeclaration","ComplexTypeReference","ComplexTypeReferenceAmpList", "ComplexTypeReferenceElement","ClassFieldIdentifier","ClassFieldName","ValueDefinition", "InlineOrDefinedValue","@3","DefinedValue","Opaque","BasicTypeId","BasicTypeId_UniverationCompatible", -"BasicType","BasicString","ConstructedTypeConstrained","ConstructedType","Union", -"Intersection","Except","optConstraints","Constraints","SetOfConstraints","ElementSetSpecs", -"ElementSetSpec","ConstraintSubtypeElement","ConstraintRangeSpec","ConstraintSpec", -"ConstraintValue","WithComponents","WithComponentsList","WithComponentsElement", -"optPresenceConstraint","PresenceConstraint","TableConstraint","SimpleTableConstraint", -"ComponentRelationConstraint","AtNotationList","AtNotationElement","ComponentIdList", -"optMarker","Marker","DefaultValue","@4","UniverationDefinition","UniverationList", -"UniverationElement","SignedNumber","optTag","Tag","TypeRefName","ObjectClassReference", -"Identifier","TaggedIdentifier", NULL +"BasicType","BasicString","Union","Intersection","Except","optConstraints","Constraints", +"SetOfConstraints","ElementSetSpecs","ElementSetSpec","ConstraintSubtypeElement", +"ConstraintRangeSpec","ConstraintSpec","ConstraintValue","WithComponents","WithComponentsList", +"WithComponentsElement","optPresenceConstraint","PresenceConstraint","TableConstraint", +"SimpleTableConstraint","ComponentRelationConstraint","AtNotationList","AtNotationElement", +"ComponentIdList","optMarker","Marker","DefaultValue","@4","UniverationDefinition", +"UniverationList","UniverationElement","SignedNumber","optTag","Tag","TypeRefName", +"ObjectClassReference","Identifier","TaggedIdentifier", NULL }; #endif @@ -440,24 +442,25 @@ static const short yyr1[] = { 0, 132, 133, 133, 134, 134, 134, 135, 135, 136, 136, 137, 138, 138, 139, 139, 140, 140, 140, 140, 141, 141, 142, 142, 142, 143, 143, 144, 144, 145, 145, - 146, 147, 147, 148, 148, 149, 149, 149, 150, 150, - 152, 151, 153, 153, 154, 154, 155, 155, 156, 156, - 157, 157, 157, 158, 158, 158, 158, 158, 158, 159, - 159, 159, 159, 159, 160, 160, 161, 162, 163, 163, - 164, 166, 165, 165, 165, 165, 165, 165, 167, 167, - 168, 168, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 170, 170, 170, 171, 171, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 173, 173, 174, 174, 174, 174, 174, - 175, 175, 176, 176, 177, 178, 178, 179, 179, 180, - 180, 181, 181, 181, 182, 182, 182, 182, 183, 183, - 183, 183, 183, 183, 183, 183, 183, 184, 184, 184, - 184, 185, 185, 186, 186, 186, 186, 186, 187, 188, - 188, 189, 189, 190, 190, 191, 191, 191, 192, 192, - 193, 194, 195, 195, 196, 196, 197, 197, 198, 198, - 199, 199, 200, 200, 201, 200, 202, 202, 203, 203, - 204, 204, 204, 204, 204, 205, 205, 206, 206, 207, - 207, 207, 208, 208, 209, 210, 211, 211 + 146, 146, 146, 147, 147, 148, 148, 149, 150, 150, + 151, 151, 152, 152, 152, 153, 153, 155, 154, 156, + 156, 157, 157, 158, 158, 158, 159, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, 160, 161, + 161, 161, 161, 161, 162, 162, 163, 164, 165, 165, + 166, 168, 167, 167, 167, 167, 167, 167, 169, 169, + 170, 170, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 172, 172, 172, 173, 173, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 175, 175, 176, 176, 177, 178, 178, + 179, 179, 180, 180, 181, 181, 181, 182, 182, 182, + 182, 183, 183, 183, 183, 183, 183, 183, 183, 183, + 184, 184, 184, 184, 185, 185, 186, 186, 186, 186, + 186, 187, 188, 188, 189, 189, 190, 190, 191, 191, + 191, 192, 192, 193, 194, 195, 195, 196, 196, 197, + 197, 198, 198, 199, 199, 200, 200, 201, 200, 202, + 202, 203, 203, 204, 204, 204, 204, 204, 205, 205, + 206, 206, 207, 207, 207, 208, 208, 209, 210, 211, + 211 }; static const short yyr2[] = { 0, @@ -468,302 +471,311 @@ static const short yyr2[] = { 0, 3, 1, 1, 3, 3, 2, 1, 3, 1, 1, 6, 1, 1, 0, 1, 4, 4, 3, 6, 1, 3, 1, 3, 3, 1, 3, 1, 1, 1, 3, - 5, 0, 1, 1, 3, 2, 3, 4, 0, 1, - 0, 6, 1, 2, 1, 1, 2, 1, 3, 1, - 1, 3, 3, 1, 1, 1, 4, 1, 3, 1, + 3, 3, 1, 1, 3, 2, 1, 5, 0, 1, + 1, 3, 2, 4, 4, 0, 1, 0, 6, 1, + 2, 1, 1, 1, 3, 3, 2, 1, 1, 4, + 4, 4, 4, 4, 1, 4, 4, 1, 3, 1, 3, 3, 1, 3, 1, 3, 1, 1, 1, 1, 4, 0, 3, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 4, 4, 4, 4, 4, 1, 4, - 1, 1, 1, 1, 1, 0, 1, 1, 4, 3, - 4, 1, 3, 5, 1, 3, 3, 3, 4, 3, - 1, 3, 3, 3, 3, 1, 1, 1, 2, 2, - 3, 1, 1, 1, 1, 1, 1, 1, 5, 1, - 3, 1, 3, 0, 1, 1, 1, 1, 1, 1, - 3, 4, 1, 3, 2, 3, 1, 3, 0, 1, - 1, 2, 1, 1, 0, 3, 2, 3, 1, 3, - 1, 4, 4, 1, 1, 1, 1, 0, 1, 1, - 2, 2, 1, 1, 1, 1, 1, 2 + 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, + 1, 4, 3, 4, 1, 3, 5, 1, 3, 3, + 3, 4, 3, 1, 3, 3, 3, 3, 1, 1, + 1, 2, 2, 3, 1, 1, 1, 1, 1, 1, + 1, 5, 1, 3, 1, 3, 0, 1, 1, 1, + 1, 1, 1, 3, 4, 1, 3, 2, 3, 1, + 3, 0, 1, 1, 2, 1, 1, 0, 3, 2, + 3, 1, 3, 1, 4, 4, 1, 1, 1, 1, + 0, 1, 1, 2, 2, 1, 1, 1, 1, 1, + 2 }; static const short yydefact[] = { 0, - 243, 244, 1, 2, 5, 3, 0, 0, 6, 246, + 246, 247, 1, 2, 5, 3, 0, 0, 6, 249, 13, 8, 0, 9, 11, 14, 7, 10, 0, 0, 0, 0, 0, 0, 0, 15, 16, 0, 22, 20, - 18, 21, 19, 0, 17, 12, 23, 140, 0, 0, - 141, 142, 143, 0, 144, 145, 153, 146, 147, 148, - 149, 150, 151, 152, 0, 24, 25, 27, 28, 31, + 18, 21, 19, 0, 17, 12, 23, 150, 0, 0, + 151, 152, 153, 0, 154, 155, 163, 156, 157, 158, + 159, 160, 161, 162, 0, 24, 25, 27, 28, 31, 29, 30, 34, 0, 0, 32, 0, 46, 0, 47, 49, 50, 36, 0, 37, 0, 40, 42, 43, 4, - 26, 238, 100, 245, 0, 123, 0, 0, 136, 130, - 134, 135, 124, 0, 0, 125, 129, 133, 0, 0, - 52, 53, 126, 103, 0, 33, 45, 44, 0, 35, - 38, 0, 0, 0, 240, 58, 0, 239, 0, 137, - 132, 131, 128, 127, 0, 60, 0, 62, 0, 0, - 0, 48, 5, 41, 0, 242, 241, 100, 245, 159, - 0, 0, 166, 166, 56, 57, 166, 98, 138, 126, - 94, 95, 90, 96, 0, 101, 102, 0, 0, 0, - 0, 54, 109, 110, 104, 105, 107, 114, 116, 115, - 236, 237, 112, 111, 118, 117, 0, 119, 39, 0, - 74, 219, 108, 0, 0, 0, 0, 0, 0, 0, - 167, 168, 0, 0, 219, 0, 139, 0, 0, 61, - 64, 63, 196, 197, 193, 0, 192, 198, 0, 0, - 0, 0, 55, 172, 175, 0, 181, 187, 186, 209, - 210, 194, 195, 0, 0, 0, 79, 0, 0, 221, - 72, 219, 76, 220, 0, 91, 0, 69, 88, 247, - 0, 99, 0, 0, 0, 0, 0, 0, 0, 89, - 235, 227, 0, 229, 234, 231, 0, 0, 0, 65, - 67, 68, 59, 188, 0, 0, 0, 0, 0, 51, - 163, 164, 161, 162, 0, 0, 0, 165, 0, 0, - 0, 0, 106, 121, 113, 120, 0, 71, 80, 75, - 225, 224, 223, 222, 73, 77, 72, 160, 0, 156, - 0, 248, 87, 0, 157, 170, 154, 0, 158, 155, - 228, 0, 0, 97, 0, 189, 190, 185, 183, 0, - 211, 180, 173, 176, 177, 178, 0, 184, 182, 0, - 0, 213, 122, 0, 0, 78, 92, 93, 70, 169, - 171, 230, 0, 0, 66, 191, 202, 0, 200, 166, - 0, 179, 0, 215, 217, 212, 0, 81, 226, 233, - 232, 199, 0, 204, 174, 216, 0, 214, 0, 201, - 207, 208, 206, 203, 205, 218, 85, 0, 83, 86, - 82, 84, 0, 0, 0 + 26, 241, 110, 248, 0, 133, 0, 0, 146, 140, + 144, 145, 134, 0, 0, 135, 139, 143, 0, 0, + 52, 53, 136, 113, 0, 33, 45, 44, 0, 35, + 38, 0, 0, 0, 243, 58, 0, 242, 0, 147, + 142, 141, 138, 137, 0, 60, 0, 62, 0, 0, + 0, 48, 5, 41, 0, 245, 244, 110, 248, 105, + 0, 0, 169, 169, 56, 57, 169, 108, 148, 136, + 98, 99, 0, 111, 112, 0, 0, 0, 0, 54, + 119, 120, 114, 115, 117, 124, 126, 125, 239, 240, + 122, 121, 128, 127, 0, 129, 39, 0, 81, 222, + 118, 0, 0, 0, 0, 0, 0, 0, 170, 171, + 0, 0, 97, 0, 149, 0, 0, 61, 64, 63, + 199, 200, 196, 0, 195, 201, 0, 0, 0, 0, + 55, 175, 178, 0, 184, 190, 189, 212, 213, 197, + 198, 0, 0, 0, 86, 0, 0, 224, 222, 222, + 83, 223, 0, 94, 0, 74, 77, 250, 0, 109, + 0, 0, 0, 69, 73, 0, 0, 0, 0, 0, + 0, 238, 230, 0, 232, 237, 234, 0, 65, 67, + 68, 59, 191, 0, 0, 0, 0, 0, 51, 166, + 167, 164, 165, 0, 0, 0, 168, 0, 0, 0, + 0, 116, 131, 123, 130, 0, 78, 87, 82, 228, + 227, 226, 225, 79, 79, 106, 0, 100, 0, 251, + 76, 0, 0, 101, 0, 222, 173, 103, 0, 102, + 104, 231, 0, 0, 107, 0, 192, 193, 188, 186, + 0, 214, 183, 176, 179, 180, 181, 0, 187, 185, + 0, 0, 216, 132, 0, 0, 80, 84, 85, 95, + 96, 75, 172, 72, 70, 71, 174, 233, 0, 0, + 66, 194, 205, 0, 203, 169, 0, 182, 0, 218, + 220, 215, 0, 88, 229, 236, 235, 202, 0, 207, + 177, 219, 0, 217, 0, 204, 210, 211, 209, 206, + 208, 221, 92, 0, 90, 93, 89, 91, 0, 0, + 0 }; -static const short yydefgoto[] = { 383, +static const short yydefgoto[] = { 389, 3, 4, 8, 9, 13, 14, 25, 26, 27, 55, 56, 57, 106, 58, 74, 75, 76, 77, 59, 69, - 70, 60, 100, 212, 61, 125, 126, 259, 260, 237, - 116, 296, 180, 181, 288, 289, 369, 378, 379, 238, - 146, 239, 147, 148, 165, 166, 182, 183, 62, 174, - 225, 175, 285, 149, 150, 151, 152, 153, 154, 276, - 277, 279, 190, 191, 192, 213, 214, 215, 266, 216, - 217, 218, 348, 349, 374, 375, 219, 220, 221, 331, - 332, 354, 233, 234, 294, 335, 197, 253, 254, 222, - 117, 118, 155, 104, 223, 241 + 70, 60, 100, 210, 61, 125, 126, 258, 259, 243, + 244, 235, 236, 116, 338, 178, 179, 287, 288, 375, + 384, 385, 245, 260, 147, 148, 163, 164, 180, 181, + 62, 172, 223, 173, 284, 149, 150, 151, 152, 275, + 276, 278, 188, 189, 190, 211, 212, 213, 265, 214, + 215, 216, 354, 355, 380, 381, 217, 218, 219, 332, + 333, 360, 231, 232, 293, 336, 195, 254, 255, 220, + 117, 118, 153, 104, 221, 246 }; -static const short yypact[] = { 62, --32768,-32768, 62,-32768, -36,-32768, 11, 56,-32768,-32768, --32768,-32768, 26,-32768, -13, 202,-32768,-32768, 87, 52, - 66, 99, 108, 101, 116, 202,-32768, 81,-32768,-32768, --32768,-32768,-32768, 149,-32768,-32768, 375,-32768, 185, 10, --32768,-32768,-32768, 58,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 163, 375,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 140, 673,-32768, 96,-32768, 86,-32768, --32768,-32768,-32768, 20,-32768, -4,-32768,-32768,-32768,-32768, --32768, -11, 98,-32768, 134,-32768, 137, 156,-32768,-32768, --32768,-32768,-32768, 187, 139,-32768,-32768,-32768, 690, 269, --32768,-32768,-32768, 165, 272,-32768,-32768,-32768, 218,-32768, --32768, 62, 218, 179, 94,-32768, 536,-32768, 218,-32768, --32768,-32768,-32768,-32768, -65,-32768, 175, 176, 183, 199, - 53,-32768, -36,-32768, 199,-32768,-32768, 70, 184, 255, - 192, 229, 61, 65,-32768,-32768, -27,-32768,-32768, 194, --32768,-32768,-32768,-32768, 195,-32768,-32768, 301, 690, 299, - 299, 215,-32768,-32768, 197,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768, 203,-32768,-32768, 63, --32768, 459,-32768, 286, 21, 235, 210, 21, 215, 250, --32768, 214, 21, 256, 15, 42,-32768, 314, 613,-32768, --32768,-32768,-32768,-32768,-32768, -12,-32768,-32768, 297, 62, - 215, 223,-32768, 142, 233, 225, -12,-32768,-32768, 230, --32768,-32768,-32768, 199, 329, 299, 240, 199, 226,-32768, - 251, 15,-32768,-32768, 299, 231, 91,-32768,-32768, 241, - 613,-32768, 215, 128, 236, 613, 215, 144, 613,-32768, --32768,-32768, 158,-32768,-32768, 239, 243, 244, 159,-32768, --32768,-32768,-32768, 238, 248, 77, 249, 252, 245,-32768, --32768,-32768,-32768,-32768, 253, 215, 215,-32768, 215, 215, - 89, 254,-32768,-32768, 355,-32768, 283,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768, 251,-32768, 247,-32768, - 21,-32768,-32768, 259,-32768,-32768,-32768, 260,-32768,-32768, --32768, 46, 247,-32768, 314,-32768, 258,-32768,-32768, 28, --32768,-32768, 265,-32768,-32768,-32768, 262,-32768,-32768, -1, - 160,-32768,-32768, 271, 329,-32768,-32768,-32768,-32768,-32768, --32768,-32768, 275, 277,-32768,-32768,-32768, 169,-32768, -27, - 215,-32768, 299, 264,-32768,-32768, 254,-32768, 355,-32768, --32768,-32768, 28, 8, 182, 264, 299,-32768, 125,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768, 12,-32768,-32768, --32768,-32768, 385, 389,-32768 +static const short yypact[] = { 174, +-32768,-32768, 174,-32768, -76,-32768, 35, 104,-32768,-32768, +-32768,-32768, 45,-32768, -49, 182,-32768,-32768, 70, 86, + 62, 71, 119, 112, 196, 182,-32768, 115,-32768,-32768, +-32768,-32768,-32768, 188,-32768,-32768, 431,-32768, 207, 23, +-32768,-32768,-32768, 159,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 185, 431,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 192, 209,-32768, 129,-32768, 103,-32768, +-32768,-32768,-32768, 40,-32768, -5,-32768,-32768,-32768,-32768, +-32768, -6, 134,-32768, 146,-32768, 179, 194,-32768,-32768, +-32768,-32768,-32768, 220, 201,-32768,-32768,-32768, 729, 272, +-32768,-32768,-32768, 172, 286,-32768,-32768,-32768, 232,-32768, +-32768, 174, 232, 187, 37,-32768, 592,-32768, 232,-32768, +-32768,-32768,-32768,-32768, 32,-32768, 183, 184, 191, 216, + 54,-32768, -76,-32768, 216,-32768,-32768, -31, 193, 270, + 206, 240, 77, 102,-32768,-32768, 50,-32768,-32768, 208, +-32768,-32768, 217,-32768,-32768, 308, 729, 305, 305, 74, +-32768,-32768, 214,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 215,-32768,-32768, 57,-32768, 515, +-32768, 295, 21, 276, 222, 42, 74, 261,-32768, 224, + 42, 264,-32768, 11,-32768, 370, 669,-32768,-32768,-32768, +-32768,-32768,-32768, -15,-32768,-32768, 304, 174, 74, 231, +-32768, 164, 241, 233, -15,-32768,-32768, 234,-32768,-32768, +-32768, 216, 336, 305, 246, 216, 309,-32768, 5, 5, +-32768,-32768, 305, 235, 83,-32768,-32768, 239, 669,-32768, + 74, 275, 92,-32768,-32768, 669, 237, 669, 74, 133, + 669,-32768,-32768, 142,-32768,-32768, 242, 143,-32768,-32768, +-32768,-32768, 238, 249, 82, 243, 250, 251,-32768,-32768, +-32768,-32768,-32768, 255, 74, 74,-32768, 74, 74, 155, + 245,-32768,-32768, 356,-32768, 279,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 277, 277,-32768, 269,-32768, 21,-32768, +-32768, 256, 669,-32768, 42, 5,-32768,-32768, 257,-32768, +-32768,-32768, 15, 269,-32768, 370,-32768, 258,-32768,-32768, + 24,-32768,-32768, 259,-32768,-32768,-32768, 262,-32768,-32768, + 10, 149,-32768,-32768, 266, 336,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 268, 273, +-32768,-32768,-32768, 161,-32768, 50, 74,-32768, 305, 265, +-32768,-32768, 245,-32768, 356,-32768,-32768,-32768, 24, 80, + 204, 265, 305,-32768, 96,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 13,-32768,-32768,-32768,-32768, 373, 379, +-32768 }; static const short yypgoto[] = {-32768, --32768, 391, 263,-32768,-32768, 382,-32768,-32768, 374,-32768, --32768, 345,-32768,-32768,-32768, 328,-32768, 290,-32768,-32768, - 300,-32768, 346,-32768,-32768,-32768, 257,-32768, 95, -67, --32768, 115,-32768, 186,-32768,-32768,-32768,-32768, 37, 117, - -40,-32768, -188, -50,-32768, 196, -179, -91,-32768,-32768, --32768, -219, 84, -56, -52,-32768, 35,-32768,-32768,-32768, --32768,-32768, -142,-32768,-32768, -165, 71, -121, 204,-32768, - -141,-32768,-32768, 64,-32768,-32768,-32768,-32768,-32768,-32768, - 69, 75, -124,-32768,-32768,-32768,-32768,-32768, 118, -120, --32768, 191, 1,-32768, -7,-32768 +-32768, 380, 254,-32768,-32768, 371,-32768,-32768, 363,-32768, +-32768, 334,-32768,-32768,-32768, 317,-32768, 285,-32768,-32768, + 290,-32768, 337,-32768,-32768,-32768, 244,-32768, 87, 213, + 100,-32768, 108,-32768, 113,-32768, 186,-32768,-32768,-32768, +-32768, 25, -174, -110, -152, -50,-32768, 189, -177, -94, +-32768,-32768,-32768, -220, 79, -54, -52,-32768, 19,-32768, +-32768,-32768, -143,-32768,-32768, -102, 59, 47, 210,-32768, + -172,-32768,-32768, 52,-32768,-32768,-32768,-32768,-32768,-32768, + 60, 63, -161,-32768,-32768,-32768,-32768,-32768, 111, -123, +-32768, 200, 2,-32768, -7, -167 }; -#define YYLAST 781 +#define YYLAST 820 static const short yytable[] = { 15, - 5, 194, 232, 5, 195, 15, 10, 102, 102, 261, - 176, 103, 103, 101, 101, 377, 114, 10, 10, 11, - 1, 2, 371, 245, 163, 164, 67, 10, 10, 65, - 1, 2, 72, 10, 11, 10, 79, 64, 167, 158, - 71, 112, 127, 159, 78, 269, 103, 229, 65, 10, - 171, 172, 187, 10, 171, 172, 64, 168, 169, 170, - 10, 171, 172, 1, 2, 10, 79, 7, 1, 2, - 250, 63, 1, 2, 78, 255, 372, 304, 189, 337, - 373, 308, 203, 230, 10, 171, 172, 293, 264, 16, - 63, 115, 19, 343, 203, 28, 10, 171, 172, 128, - 265, 72, 127, 73, 113, 79, 103, 297, 29, 71, - 353, 157, 133, 78, 327, 12, 381, 68, 34, 156, - 244, 204, 236, 178, 319, 248, 261, 110, 377, 347, - 17, 177, 167, 204, 136, 242, 318, 163, 164, 329, - 187, 231, 82, 251, 187, 137, 252, 251, 328, 30, - 83, 84, 201, 202, 324, 325, 173, 326, 263, 128, - 32, 85, 208, 86, 188, 87, 189, 227, 193, 37, - 189, 228, 292, -243, 208, 88, 103, 240, 338, 89, - 240, 119, 31, 90, 33, 240, 91, 36, 256, 380, - 262, 255, 344, 108, 109, 300, 66, 92, 380, 301, - 303, 80, 93, 107, 94, 307, 95, 364, 310, 119, - 268, 163, 164, 20, 120, 96, 97, 121, 286, 124, - 203, 21, 10, 171, 172, 10, 122, 298, 1, 2, - 98, 203, 305, 10, 171, 172, 301, 123, 271, 272, - 273, 274, 22, 99, 23, 83, 84, 85, 309, 86, - 275, 87, 301, 24, 10, 171, 172, 1, 2, 204, - 205, 88, 311, 314, 356, 89, 312, 315, 357, 90, - 204, 129, 91, 362, 131, 206, 130, 363, 271, 272, - 273, 274, 135, 92, 160, 161, 162, -244, 93, 184, - 94, 178, 95, 240, 207, 185, 186, 196, 198, 177, - 208, 96, 97, 199, 256, 178, 10, 262, 224, 209, - 235, 208, 350, 177, 226, 243, 98, 246, 210, 247, - 211, 10, 355, 249, 138, 139, 267, 270, 278, 291, - 280, 140, 284, 282, 287, 85, 38, 86, 295, 87, - 141, 299, 306, 115, 313, 355, 188, 193, 317, 88, - 316, 322, 320, 89, 323, 350, 321, 90, 333, 376, - 91, 41, 42, 43, 334, 340, 341, 330, 352, 142, - 346, 92, 45, 351, 358, 367, 93, 46, 94, 47, - 95, 360, 10, 361, 384, 1, 2, 48, 385, 96, - 97, 257, 258, 6, 18, 179, 49, 38, 50, 35, - 81, 111, 134, 51, 98, 52, 53, 54, 132, 345, - 105, 336, 39, 290, 382, 200, 40, 339, 359, 283, - 281, 365, 41, 42, 43, 368, 370, 366, 44, 342, - 302, 0, 0, 45, 0, 0, 0, 0, 46, 0, - 47, 0, 0, 0, 0, 0, 0, 0, 48, 0, - 0, 0, 0, 0, 0, 0, 0, 49, 0, 50, - 0, 0, 0, 0, 51, 0, 52, 53, 54, 138, - 139, 163, 164, 0, 0, 0, 140, 0, 0, 0, + 192, 5, 230, 193, 5, 15, 146, 174, 237, 102, + 102, 103, 103, 101, 101, 239, 383, 10, 10, 169, + 170, 114, 10, 169, 170, 161, 162, 7, 10, 65, + 10, 10, 72, 1, 2, 165, 79, 227, 64, 67, + 112, 71, 10, 11, 127, 78, 103, 10, 65, 10, + 1, 2, 10, 11, 292, 63, 19, 64, 166, 167, + 168, 10, 169, 170, 1, 2, 79, 294, 295, 229, + 256, 242, -246, 228, 63, 78, 340, 136, 28, 201, + 119, 10, 169, 170, 247, 263, 262, 201, 137, 10, + 169, 170, 320, 349, 377, 308, 115, 264, 311, 383, + 128, 72, 127, 113, 103, 79, 268, 330, 161, 162, + 71, 155, 252, 133, 78, 253, 252, 387, 202, 203, + 154, 359, 234, 176, 237, 353, 202, 165, 301, 185, + 68, 239, 175, 240, 204, 306, 156, 16, 302, 12, + 157, 319, 29, 234, 346, 30, 309, 110, 378, 17, + 199, 200, 379, 205, 31, 187, 185, 171, 128, 206, + 201, 225, 10, 169, 170, 226, 10, 206, 207, 1, + 2, 32, 291, 341, 103, 238, 328, 208, 238, 209, + 186, 185, 187, 238, 1, 2, 257, 298, 261, 256, + 350, 299, 344, 20, 82, 33, 304, 386, 34, 202, + 305, 21, 83, 84, 73, 191, 386, 187, 37, 267, + 108, 109, 370, 85, 329, 86, 285, 87, 66, 83, + 84, 36, 22, 80, 23, 296, 120, 88, 161, 162, + 85, 89, 86, 24, 87, 90, 107, 310, 91, 10, + 206, 305, 1, 2, 88, 119, 312, 315, 89, 92, + 313, 316, 90, 362, 93, 91, 94, 363, 95, 121, + 270, 271, 272, 273, 122, 368, 92, 96, 97, 369, + 123, 93, 274, 94, 129, 95, 10, 169, 170, 1, + 2, 124, 98, 130, 96, 97, 83, 84, 131, 176, + 135, 238, 158, 159, 160, 99, -247, 238, 175, 98, + 270, 271, 272, 273, 182, 257, 176, 184, 261, 183, + 197, 194, 10, 356, 201, 175, 10, 169, 170, 233, + 196, 325, 326, 361, 327, 222, 224, 241, 248, 249, + 85, 251, 86, 266, 87, 269, 277, 281, 279, 283, + 286, 115, 303, 307, 88, 297, 321, 314, 89, 318, + 317, 361, 90, 202, 322, 91, 324, 323, 331, 334, + 335, 356, 343, 347, 337, 382, 92, 357, 358, 364, + 352, 93, 390, 94, 366, 95, 373, 10, 391, 367, + 138, 139, 6, 18, 96, 97, 177, 140, 35, 81, + 111, 85, 38, 86, 206, 87, 141, 134, 132, 98, + 198, 105, 351, 250, 345, 88, 342, 339, 388, 89, + 282, 289, 290, 90, 365, 371, 91, 41, 42, 43, + 376, 372, 374, 348, 280, 142, 0, 92, 45, 0, + 0, 0, 93, 46, 94, 47, 95, 300, 10, 0, + 0, 1, 2, 48, 0, 96, 97, 143, 144, 0, + 0, 0, 49, 38, 50, 0, 0, 0, 0, 51, + 98, 52, 53, 54, 0, 0, 0, 0, 39, 0, + 0, 0, 40, 0, 0, 0, 0, 0, 41, 42, + 43, 0, 0, 0, 44, 0, 0, 0, 0, 45, + 0, 0, 0, 0, 46, 0, 47, 0, 0, 0, + 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, + 0, 0, 0, 49, 0, 50, 0, 0, 0, 0, + 51, 0, 52, 53, 54, 138, 139, 161, 162, 0, + 0, 0, 140, 0, 0, 0, 85, 38, 86, 0, + 87, 141, 0, 0, 0, 0, 0, 227, 0, 0, + 88, 0, 0, 0, 89, 0, 0, 0, 90, 0, + 0, 91, 41, 42, 43, 0, 0, 0, 0, 0, + 142, 0, 92, 45, 0, 0, 0, 93, 46, 94, + 47, 95, 0, 228, 0, 0, 0, 0, 48, 0, + 96, 97, 143, 144, 0, 0, 0, 49, 0, 50, + 0, 0, 138, 139, 51, 98, 52, 53, 54, 140, + 0, 0, 0, 85, 38, 86, 0, 87, 141, 0, + 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, + 0, 89, 0, 0, 0, 90, 0, 0, 91, 41, + 42, 43, 0, 0, 0, 0, 0, 142, 0, 92, + 45, 0, 0, 0, 93, 46, 94, 47, 95, 0, + 0, 0, 0, 0, 0, 48, 0, 96, 97, 143, + 144, 0, 0, 0, 49, 0, 50, 0, 145, 138, + 139, 51, 98, 52, 53, 54, 140, 0, 0, 0, 85, 38, 86, 0, 87, 141, 0, 0, 0, 0, - 0, 229, 0, 0, 88, 0, 0, 0, 89, 0, + 0, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 90, 0, 0, 91, 41, 42, 43, 0, 0, 0, 0, 0, 142, 0, 92, 45, 0, 0, - 0, 93, 46, 94, 47, 95, 0, 230, 0, 0, - 0, 0, 48, 0, 96, 97, 143, 144, 0, 0, - 0, 49, 0, 50, 0, 0, 138, 139, 51, 98, - 52, 53, 54, 140, 0, 0, 0, 85, 38, 86, - 0, 87, 141, 0, 0, 0, 0, 0, 0, 0, - 0, 88, 0, 0, 0, 89, 0, 0, 0, 90, - 0, 0, 91, 41, 42, 43, 0, 0, 0, 0, - 0, 142, 0, 92, 45, 0, 0, 0, 93, 46, - 94, 47, 95, 0, 0, 0, 0, 0, 0, 48, - 0, 96, 97, 143, 144, 0, 0, 0, 49, 0, - 50, 0, 145, 138, 139, 51, 98, 52, 53, 54, - 140, 0, 0, 0, 85, 38, 86, 0, 87, 141, - 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, - 0, 0, 89, 0, 0, 0, 90, 0, 0, 91, - 41, 42, 43, 0, 0, 0, 0, 0, 142, 0, - 92, 45, 0, 0, 0, 93, 46, 94, 47, 95, - 0, 0, 0, 83, 84, 0, 48, 0, 96, 97, - 143, 144, 0, 0, 85, 49, 86, 50, 87, 0, - 1, 2, 51, 98, 52, 53, 54, 0, 88, 0, - 0, 85, 89, 86, 0, 87, 90, 0, 0, 91, - 0, 0, 0, 0, 0, 88, 0, 0, 0, 89, - 92, 0, 0, 90, 0, 93, 91, 94, 0, 95, - 0, 0, 0, 0, 0, 0, 0, 92, 96, 97, - 0, 0, 93, 0, 94, 0, 95, 0, 0, 0, - 0, 0, 0, 98, 0, 96, 97, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 98 + 0, 93, 46, 94, 47, 95, 0, 0, 0, 1, + 2, 0, 48, 0, 96, 97, 143, 144, 0, 0, + 85, 49, 86, 50, 87, 0, 0, 0, 51, 98, + 52, 53, 54, 0, 88, 0, 0, 0, 89, 0, + 0, 0, 90, 0, 0, 91, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, + 0, 93, 0, 94, 0, 95, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 97, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 98 }; static const short yycheck[] = { 7, - 0, 144, 182, 3, 147, 13, 8, 64, 65, 198, - 131, 64, 65, 64, 65, 4, 28, 8, 8, 9, - 11, 12, 15, 189, 13, 14, 17, 8, 8, 37, - 11, 12, 40, 8, 9, 8, 44, 37, 130, 105, - 40, 46, 99, 109, 44, 211, 99, 33, 56, 8, - 9, 10, 80, 8, 9, 10, 56, 5, 6, 7, - 8, 9, 10, 11, 12, 8, 74, 104, 11, 12, - 195, 37, 11, 12, 74, 196, 69, 243, 106, 299, - 73, 247, 6, 69, 8, 9, 10, 229, 101, 34, - 56, 103, 106, 313, 6, 9, 8, 9, 10, 99, - 113, 109, 159, 46, 109, 113, 159, 232, 57, 109, - 112, 119, 112, 113, 280, 105, 105, 108, 3, 119, - 188, 45, 102, 131, 266, 193, 315, 108, 4, 102, - 105, 131, 224, 45, 41, 186, 60, 13, 14, 281, - 80, 182, 3, 102, 80, 52, 105, 102, 60, 84, - 11, 12, 160, 161, 276, 277, 104, 279, 199, 159, - 53, 22, 86, 24, 104, 26, 106, 105, 104, 21, - 106, 109, 229, 104, 86, 36, 229, 185, 299, 40, - 188, 112, 84, 44, 84, 193, 47, 107, 196, 369, - 198, 312, 313, 108, 109, 105, 12, 58, 378, 109, - 241, 39, 63, 108, 65, 246, 67, 350, 249, 112, - 210, 13, 14, 12, 81, 76, 77, 81, 226, 81, - 6, 20, 8, 9, 10, 8, 71, 235, 11, 12, - 91, 6, 105, 8, 9, 10, 109, 51, 97, 98, - 99, 100, 41, 104, 43, 11, 12, 22, 105, 24, - 109, 26, 109, 52, 8, 9, 10, 11, 12, 45, - 46, 36, 105, 105, 105, 40, 109, 109, 109, 44, - 45, 3, 47, 105, 3, 61, 112, 109, 97, 98, - 99, 100, 104, 58, 110, 110, 104, 104, 63, 35, - 65, 299, 67, 301, 80, 104, 68, 104, 104, 299, - 86, 76, 77, 3, 312, 313, 8, 315, 112, 95, - 25, 86, 320, 313, 112, 106, 91, 68, 104, 106, - 106, 8, 330, 68, 11, 12, 30, 105, 96, 104, - 106, 18, 4, 104, 95, 22, 23, 24, 88, 26, - 27, 111, 107, 103, 106, 353, 104, 104, 101, 36, - 113, 107, 104, 40, 102, 363, 105, 44, 4, 367, - 47, 48, 49, 50, 82, 107, 107, 114, 107, 56, - 113, 58, 59, 109, 104, 112, 63, 64, 65, 66, - 67, 107, 8, 107, 0, 11, 12, 74, 0, 76, - 77, 78, 79, 3, 13, 133, 83, 23, 85, 26, - 56, 74, 113, 90, 91, 92, 93, 94, 109, 315, - 65, 297, 38, 228, 378, 159, 42, 301, 335, 224, - 217, 351, 48, 49, 50, 357, 363, 353, 54, 312, - 240, -1, -1, 59, -1, -1, -1, -1, 64, -1, - 66, -1, -1, -1, -1, -1, -1, -1, 74, -1, - -1, -1, -1, -1, -1, -1, -1, 83, -1, 85, - -1, -1, -1, -1, 90, -1, 92, 93, 94, 11, - 12, 13, 14, -1, -1, -1, 18, -1, -1, -1, + 144, 0, 180, 147, 3, 13, 117, 131, 183, 64, + 65, 64, 65, 64, 65, 183, 4, 8, 8, 9, + 10, 28, 8, 9, 10, 13, 14, 104, 8, 37, + 8, 8, 40, 11, 12, 130, 44, 33, 37, 17, + 46, 40, 8, 9, 99, 44, 99, 8, 56, 8, + 11, 12, 8, 9, 227, 37, 106, 56, 5, 6, + 7, 8, 9, 10, 11, 12, 74, 229, 230, 180, + 194, 30, 104, 69, 56, 74, 297, 41, 9, 6, + 112, 8, 9, 10, 187, 101, 197, 6, 52, 8, + 9, 10, 265, 314, 15, 248, 103, 113, 251, 4, + 99, 109, 157, 109, 157, 113, 209, 280, 13, 14, + 109, 119, 102, 112, 113, 105, 102, 105, 45, 46, + 119, 112, 102, 131, 299, 102, 45, 222, 239, 80, + 108, 299, 131, 184, 61, 246, 105, 34, 241, 105, + 109, 60, 57, 102, 306, 84, 249, 108, 69, 105, + 158, 159, 73, 80, 84, 106, 80, 104, 157, 86, + 6, 105, 8, 9, 10, 109, 8, 86, 95, 11, + 12, 53, 227, 297, 227, 183, 279, 104, 186, 106, + 104, 80, 106, 191, 11, 12, 194, 105, 196, 313, + 314, 109, 303, 12, 3, 84, 105, 375, 3, 45, + 109, 20, 11, 12, 46, 104, 384, 106, 21, 208, + 108, 109, 356, 22, 60, 24, 224, 26, 12, 11, + 12, 107, 41, 39, 43, 233, 81, 36, 13, 14, + 22, 40, 24, 52, 26, 44, 108, 105, 47, 8, + 86, 109, 11, 12, 36, 112, 105, 105, 40, 58, + 109, 109, 44, 105, 63, 47, 65, 109, 67, 81, + 97, 98, 99, 100, 71, 105, 58, 76, 77, 109, + 51, 63, 109, 65, 3, 67, 8, 9, 10, 11, + 12, 81, 91, 112, 76, 77, 11, 12, 3, 297, + 104, 299, 110, 110, 104, 104, 104, 305, 297, 91, + 97, 98, 99, 100, 35, 313, 314, 68, 316, 104, + 3, 104, 8, 321, 6, 314, 8, 9, 10, 25, + 104, 275, 276, 331, 278, 112, 112, 106, 68, 106, + 22, 68, 24, 30, 26, 105, 96, 104, 106, 4, + 95, 103, 68, 107, 36, 111, 104, 106, 40, 101, + 113, 359, 44, 45, 105, 47, 102, 107, 114, 4, + 82, 369, 107, 107, 88, 373, 58, 109, 107, 104, + 113, 63, 0, 65, 107, 67, 112, 8, 0, 107, + 11, 12, 3, 13, 76, 77, 133, 18, 26, 56, + 74, 22, 23, 24, 86, 26, 27, 113, 109, 91, + 157, 65, 316, 191, 305, 36, 299, 295, 384, 40, + 222, 226, 104, 44, 336, 357, 47, 48, 49, 50, + 369, 359, 363, 313, 215, 56, -1, 58, 59, -1, + -1, -1, 63, 64, 65, 66, 67, 238, 8, -1, + -1, 11, 12, 74, -1, 76, 77, 78, 79, -1, + -1, -1, 83, 23, 85, -1, -1, -1, -1, 90, + 91, 92, 93, 94, -1, -1, -1, -1, 38, -1, + -1, -1, 42, -1, -1, -1, -1, -1, 48, 49, + 50, -1, -1, -1, 54, -1, -1, -1, -1, 59, + -1, -1, -1, -1, 64, -1, 66, -1, -1, -1, + -1, -1, -1, -1, 74, -1, -1, -1, -1, -1, + -1, -1, -1, 83, -1, 85, -1, -1, -1, -1, + 90, -1, 92, 93, 94, 11, 12, 13, 14, -1, + -1, -1, 18, -1, -1, -1, 22, 23, 24, -1, + 26, 27, -1, -1, -1, -1, -1, 33, -1, -1, + 36, -1, -1, -1, 40, -1, -1, -1, 44, -1, + -1, 47, 48, 49, 50, -1, -1, -1, -1, -1, + 56, -1, 58, 59, -1, -1, -1, 63, 64, 65, + 66, 67, -1, 69, -1, -1, -1, -1, 74, -1, + 76, 77, 78, 79, -1, -1, -1, 83, -1, 85, + -1, -1, 11, 12, 90, 91, 92, 93, 94, 18, + -1, -1, -1, 22, 23, 24, -1, 26, 27, -1, + -1, -1, -1, -1, -1, -1, -1, 36, -1, -1, + -1, 40, -1, -1, -1, 44, -1, -1, 47, 48, + 49, 50, -1, -1, -1, -1, -1, 56, -1, 58, + 59, -1, -1, -1, 63, 64, 65, 66, 67, -1, + -1, -1, -1, -1, -1, 74, -1, 76, 77, 78, + 79, -1, -1, -1, 83, -1, 85, -1, 87, 11, + 12, 90, 91, 92, 93, 94, 18, -1, -1, -1, 22, 23, 24, -1, 26, 27, -1, -1, -1, -1, - -1, 33, -1, -1, 36, -1, -1, -1, 40, -1, + -1, -1, -1, -1, 36, -1, -1, -1, 40, -1, -1, -1, 44, -1, -1, 47, 48, 49, 50, -1, -1, -1, -1, -1, 56, -1, 58, 59, -1, -1, - -1, 63, 64, 65, 66, 67, -1, 69, -1, -1, - -1, -1, 74, -1, 76, 77, 78, 79, -1, -1, - -1, 83, -1, 85, -1, -1, 11, 12, 90, 91, - 92, 93, 94, 18, -1, -1, -1, 22, 23, 24, - -1, 26, 27, -1, -1, -1, -1, -1, -1, -1, - -1, 36, -1, -1, -1, 40, -1, -1, -1, 44, - -1, -1, 47, 48, 49, 50, -1, -1, -1, -1, - -1, 56, -1, 58, 59, -1, -1, -1, 63, 64, - 65, 66, 67, -1, -1, -1, -1, -1, -1, 74, - -1, 76, 77, 78, 79, -1, -1, -1, 83, -1, - 85, -1, 87, 11, 12, 90, 91, 92, 93, 94, - 18, -1, -1, -1, 22, 23, 24, -1, 26, 27, - -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, - -1, -1, 40, -1, -1, -1, 44, -1, -1, 47, - 48, 49, 50, -1, -1, -1, -1, -1, 56, -1, - 58, 59, -1, -1, -1, 63, 64, 65, 66, 67, - -1, -1, -1, 11, 12, -1, 74, -1, 76, 77, - 78, 79, -1, -1, 22, 83, 24, 85, 26, -1, - 11, 12, 90, 91, 92, 93, 94, -1, 36, -1, - -1, 22, 40, 24, -1, 26, 44, -1, -1, 47, - -1, -1, -1, -1, -1, 36, -1, -1, -1, 40, - 58, -1, -1, 44, -1, 63, 47, 65, -1, 67, - -1, -1, -1, -1, -1, -1, -1, 58, 76, 77, - -1, -1, 63, -1, 65, -1, 67, -1, -1, -1, - -1, -1, -1, 91, -1, 76, 77, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 91 + -1, 63, 64, 65, 66, 67, -1, -1, -1, 11, + 12, -1, 74, -1, 76, 77, 78, 79, -1, -1, + 22, 83, 24, 85, 26, -1, -1, -1, 90, 91, + 92, 93, 94, -1, 36, -1, -1, -1, 40, -1, + -1, -1, 44, -1, -1, 47, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 58, -1, -1, -1, + -1, 63, -1, 65, -1, 67, -1, -1, -1, -1, + -1, -1, -1, -1, 76, 77, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 91 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/share/bison.simple" @@ -1778,7 +1790,7 @@ case 58: ; break;} case 59: -#line 745 "asn1p_y.y" +#line 744 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1788,7 +1800,7 @@ case 59: ; break;} case 60: -#line 755 "asn1p_y.y" +#line 754 "asn1p_y.y" { int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); @@ -1800,7 +1812,7 @@ case 60: ; break;} case 61: -#line 764 "asn1p_y.y" +#line 763 "asn1p_y.y" { int ret; yyval.a_plist = yyvsp[-2].a_plist; @@ -1811,14 +1823,14 @@ case 61: ; break;} case 62: -#line 775 "asn1p_y.y" +#line 774 "asn1p_y.y" { yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} case 63: -#line 779 "asn1p_y.y" +#line 778 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1828,7 +1840,7 @@ case 63: ; break;} case 64: -#line 786 "asn1p_y.y" +#line 785 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1839,7 +1851,7 @@ case 64: ; break;} case 65: -#line 797 "asn1p_y.y" +#line 796 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1847,20 +1859,20 @@ case 65: ; break;} case 66: -#line 802 "asn1p_y.y" +#line 801 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} case 67: -#line 809 "asn1p_y.y" +#line 808 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 68: -#line 812 "asn1p_y.y" +#line 811 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1870,7 +1882,7 @@ case 68: ; break;} case 69: -#line 825 "asn1p_y.y" +#line 824 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1878,14 +1890,70 @@ case 69: ; break;} case 70: -#line 830 "asn1p_y.y" +#line 829 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} case 71: -#line 837 "asn1p_y.y" +#line 836 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[-1].a_expr; + assert(yyval.a_expr->Identifier == 0); + yyval.a_expr->Identifier = yyvsp[-2].tv_nametag.name; + yyval.a_expr->tag = yyvsp[-2].tv_nametag.tag; + yyval.a_expr->marker = yyvsp[0].a_marker; + ; + break;} +case 72: +#line 843 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); + checkmem(yyval.a_expr); + yyval.a_expr->meta_type = yyvsp[0].a_expr->meta_type; + yyval.a_expr->expr_type = A1TC_COMPONENTS_OF; + TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); + ; + break;} +case 73: +#line 850 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[0].a_expr; + ; + break;} +case 74: +#line 856 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); + checkmem(yyval.a_expr); + TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); + ; + break;} +case 75: +#line 861 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[-2].a_expr; + TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); + ; + break;} +case 76: +#line 868 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[0].a_expr; + assert(yyval.a_expr->Identifier == 0); + yyval.a_expr->Identifier = yyvsp[-1].tv_nametag.name; + yyval.a_expr->tag = yyvsp[-1].tv_nametag.tag; + ; + break;} +case 77: +#line 874 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[0].a_expr; + ; + break;} +case 78: +#line 880 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); @@ -1894,16 +1962,16 @@ case 71: assert(yyval.a_expr->meta_type == AMT_OBJECT); ; break;} -case 72: -#line 847 "asn1p_y.y" +case 79: +#line 890 "asn1p_y.y" { yyval.a_int = 0; ; break;} -case 73: -#line 848 "asn1p_y.y" +case 80: +#line 891 "asn1p_y.y" { yyval.a_int = 1; ; break;} -case 74: -#line 852 "asn1p_y.y" +case 81: +#line 895 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1912,15 +1980,15 @@ case 74: TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} -case 75: -#line 859 "asn1p_y.y" +case 82: +#line 902 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} -case 76: -#line 866 "asn1p_y.y" +case 83: +#line 909 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1930,16 +1998,17 @@ case 76: yyval.a_expr->marker = yyvsp[0].a_marker; ; break;} -case 77: -#line 874 "asn1p_y.y" +case 84: +#line 917 "asn1p_y.y" { - yyval.a_expr = yyvsp[-1].a_expr; - yyval.a_expr->Identifier = yyvsp[-2].a_refcomp.name; + yyval.a_expr = yyvsp[-2].a_expr; + yyval.a_expr->Identifier = yyvsp[-3].a_refcomp.name; + yyval.a_expr->marker = yyvsp[-1].a_marker; yyval.a_expr->unique = yyvsp[0].a_int; ; break;} -case 78: -#line 879 "asn1p_y.y" +case 85: +#line 923 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -1956,48 +2025,48 @@ case 78: yyval.a_expr->unique = yyvsp[0].a_int; ; break;} -case 79: -#line 897 "asn1p_y.y" +case 86: +#line 941 "asn1p_y.y" { yyval.a_wsynt = 0; ; break;} -case 80: -#line 898 "asn1p_y.y" +case 87: +#line 942 "asn1p_y.y" { yyval.a_wsynt = yyvsp[0].a_wsynt; ; break;} -case 81: -#line 905 "asn1p_y.y" +case 88: +#line 949 "asn1p_y.y" { asn1p_lexer_hack_enable_with_syntax(); ; break;} -case 82: -#line 907 "asn1p_y.y" +case 89: +#line 951 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; ; break;} -case 83: -#line 913 "asn1p_y.y" +case 90: +#line 957 "asn1p_y.y" { yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} -case 84: -#line 917 "asn1p_y.y" +case 91: +#line 961 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} -case 85: -#line 924 "asn1p_y.y" +case 92: +#line 968 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); ; break;} -case 86: -#line 927 "asn1p_y.y" +case 93: +#line 971 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2008,43 +2077,7 @@ case 86: yyval.a_wchunk = asn1p_wsyntx_chunk_fromref(ref, 0); ; break;} -case 87: -#line 953 "asn1p_y.y" -{ - yyval.a_expr = yyvsp[0].a_expr; - assert(yyval.a_expr->Identifier == 0); - yyval.a_expr->Identifier = yyvsp[-1].tv_nametag.name; - yyval.a_expr->tag = yyvsp[-1].tv_nametag.tag; - ; - break;} -case 88: -#line 959 "asn1p_y.y" -{ - yyval.a_expr = yyvsp[0].a_expr; - ; - break;} -case 89: -#line 965 "asn1p_y.y" -{ - yyval.a_expr = yyvsp[-2].a_expr; - if(yyval.a_expr->constraints) { - assert(!yyvsp[-1].a_constr); - } else { - yyval.a_expr->constraints = yyvsp[-1].a_constr; - } - yyval.a_expr->marker = yyvsp[0].a_marker; - ; - break;} -case 90: -#line 974 "asn1p_y.y" -{ - /* This type includes constraints on its own */ - yyval.a_expr = yyvsp[0].a_expr; - checkmem(yyval.a_expr); - assert(yyval.a_expr->meta_type); - ; - break;} -case 91: +case 94: #line 983 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); @@ -2055,7 +2088,7 @@ case 91: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 92: +case 95: #line 991 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); @@ -2067,7 +2100,7 @@ case 92: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 93: +case 96: #line 1000 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); @@ -2079,14 +2112,35 @@ case 93: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 94: +case 97: #line 1012 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[-1].a_expr; + /* + * Outer constraint for SEQUENCE OF and SET OF applies + * to the inner type. + */ + if(yyval.a_expr->expr_type == ASN_CONSTR_SEQUENCE_OF + || yyval.a_expr->expr_type == ASN_CONSTR_SET_OF) { + assert(!TQ_FIRST(&(yyval.a_expr->members))->constraints); + TQ_FIRST(&(yyval.a_expr->members))->constraints = yyvsp[0].a_constr; + } else { + if(yyval.a_expr->constraints) { + assert(!yyvsp[0].a_constr); + } else { + yyval.a_expr->constraints = yyvsp[0].a_constr; + } + } + ; + break;} +case 98: +#line 1033 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} -case 95: -#line 1015 "asn1p_y.y" +case 99: +#line 1036 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2094,16 +2148,80 @@ case 95: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 96: -#line 1021 "asn1p_y.y" +case 100: +#line 1042 "asn1p_y.y" { - yyval.a_expr = yyvsp[0].a_expr; + yyval.a_expr = yyvsp[-1].a_expr; + assert(yyval.a_expr->expr_type == A1TC_INVALID); + yyval.a_expr->expr_type = ASN_CONSTR_CHOICE; + yyval.a_expr->meta_type = AMT_TYPE; + ; + break;} +case 101: +#line 1048 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[-1].a_expr; + assert(yyval.a_expr->expr_type == A1TC_INVALID); + yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE; + yyval.a_expr->meta_type = AMT_TYPE; + ; + break;} +case 102: +#line 1054 "asn1p_y.y" +{ + yyval.a_expr = yyvsp[-1].a_expr; + assert(yyval.a_expr->expr_type == A1TC_INVALID); + yyval.a_expr->expr_type = ASN_CONSTR_SET; + yyval.a_expr->meta_type = AMT_TYPE; + ; + break;} +case 103: +#line 1060 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); - assert(yyval.a_expr->meta_type); + yyval.a_expr->constraints = yyvsp[-2].a_constr; + yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE_OF; + yyval.a_expr->meta_type = AMT_TYPE; + TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} -case 97: -#line 1029 "asn1p_y.y" +case 104: +#line 1068 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(asn1p_lineno); + checkmem(yyval.a_expr); + yyval.a_expr->constraints = yyvsp[-2].a_constr; + yyval.a_expr->expr_type = ASN_CONSTR_SET_OF; + yyval.a_expr->meta_type = AMT_TYPE; + TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); + ; + break;} +case 105: +#line 1076 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(asn1p_lineno); + checkmem(yyval.a_expr); + yyval.a_expr->expr_type = ASN_CONSTR_ANY; + yyval.a_expr->meta_type = AMT_TYPE; + ; + break;} +case 106: +#line 1082 "asn1p_y.y" +{ + int ret; + yyval.a_expr = asn1p_expr_new(asn1p_lineno); + checkmem(yyval.a_expr); + yyval.a_expr->reference = asn1p_ref_new(yylineno); + ret = asn1p_ref_add_component(yyval.a_expr->reference, + yyvsp[0].tv_str, RLT_lowercase); + checkmem(ret == 0); + yyval.a_expr->expr_type = ASN_CONSTR_ANY; + yyval.a_expr->meta_type = AMT_TYPE; + ; + break;} +case 107: +#line 1097 "asn1p_y.y" { int ret; yyval.a_expr = yyvsp[-1].a_expr; @@ -2119,8 +2237,8 @@ case 97: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 98: -#line 1053 "asn1p_y.y" +case 108: +#line 1121 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2129,8 +2247,8 @@ case 98: yyval.a_expr->meta_type = AMT_TYPEREF; ; break;} -case 99: -#line 1060 "asn1p_y.y" +case 109: +#line 1128 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2139,8 +2257,8 @@ case 99: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 100: -#line 1075 "asn1p_y.y" +case 110: +#line 1143 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2150,8 +2268,8 @@ case 100: free(yyvsp[0].tv_str); ; break;} -case 101: -#line 1083 "asn1p_y.y" +case 111: +#line 1151 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2163,8 +2281,8 @@ case 101: free(yyvsp[-2].tv_str); ; break;} -case 102: -#line 1093 "asn1p_y.y" +case 112: +#line 1161 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2176,8 +2294,8 @@ case 102: free(yyvsp[-2].tv_str); ; break;} -case 103: -#line 1103 "asn1p_y.y" +case 113: +#line 1171 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2187,8 +2305,8 @@ case 103: checkmem(ret == 0); ; break;} -case 104: -#line 1111 "asn1p_y.y" +case 114: +#line 1179 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[0].a_ref; @@ -2209,8 +2327,8 @@ case 104: } ; break;} -case 105: -#line 1133 "asn1p_y.y" +case 115: +#line 1201 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2220,8 +2338,8 @@ case 105: checkmem(ret == 0); ; break;} -case 106: -#line 1141 "asn1p_y.y" +case 116: +#line 1209 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[-2].a_ref; @@ -2230,22 +2348,22 @@ case 106: checkmem(ret == 0); ; break;} -case 109: -#line 1155 "asn1p_y.y" +case 119: +#line 1223 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} -case 110: -#line 1160 "asn1p_y.y" +case 120: +#line 1228 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} -case 111: -#line 1173 "asn1p_y.y" +case 121: +#line 1241 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); @@ -2254,53 +2372,53 @@ case 111: yyval.a_expr->value = yyvsp[0].a_value; ; break;} -case 112: -#line 1183 "asn1p_y.y" +case 122: +#line 1251 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} -case 113: -#line 1184 "asn1p_y.y" +case 123: +#line 1252 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); yyval.a_value->type = ATV_UNPARSED; ; break;} -case 114: -#line 1189 "asn1p_y.y" +case 124: +#line 1257 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); ; break;} -case 115: -#line 1193 "asn1p_y.y" +case 125: +#line 1261 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); ; break;} -case 116: -#line 1197 "asn1p_y.y" +case 126: +#line 1265 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} -case 117: -#line 1201 "asn1p_y.y" +case 127: +#line 1269 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 118: -#line 1204 "asn1p_y.y" +case 128: +#line 1272 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 119: -#line 1210 "asn1p_y.y" +case 129: +#line 1278 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2313,8 +2431,8 @@ case 119: free(yyvsp[0].tv_str); ; break;} -case 120: -#line 1221 "asn1p_y.y" +case 130: +#line 1289 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2330,8 +2448,8 @@ case 120: free(yyvsp[0].tv_str); ; break;} -case 121: -#line 1238 "asn1p_y.y" +case 131: +#line 1306 "asn1p_y.y" { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 2; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); @@ -2343,8 +2461,8 @@ case 121: free(yyvsp[0].tv_opaque.buf); ; break;} -case 122: -#line 1248 "asn1p_y.y" +case 132: +#line 1316 "asn1p_y.y" { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); @@ -2358,68 +2476,68 @@ case 122: yyval.tv_opaque.len = newsize; ; break;} -case 123: -#line 1263 "asn1p_y.y" +case 133: +#line 1331 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BOOLEAN; ; break;} -case 124: -#line 1264 "asn1p_y.y" +case 134: +#line 1332 "asn1p_y.y" { yyval.a_type = ASN_BASIC_NULL; ; break;} -case 125: -#line 1265 "asn1p_y.y" +case 135: +#line 1333 "asn1p_y.y" { yyval.a_type = ASN_BASIC_REAL; ; break;} -case 126: -#line 1266 "asn1p_y.y" +case 136: +#line 1334 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} -case 127: -#line 1267 "asn1p_y.y" +case 137: +#line 1335 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OCTET_STRING; ; break;} -case 128: -#line 1268 "asn1p_y.y" +case 138: +#line 1336 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; break;} -case 129: -#line 1269 "asn1p_y.y" +case 139: +#line 1337 "asn1p_y.y" { yyval.a_type = ASN_BASIC_RELATIVE_OID; ; break;} -case 130: -#line 1270 "asn1p_y.y" +case 140: +#line 1338 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EXTERNAL; ; break;} -case 131: -#line 1271 "asn1p_y.y" +case 141: +#line 1339 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; break;} -case 132: -#line 1272 "asn1p_y.y" +case 142: +#line 1340 "asn1p_y.y" { yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; break;} -case 133: -#line 1273 "asn1p_y.y" +case 143: +#line 1341 "asn1p_y.y" { yyval.a_type = ASN_BASIC_UTCTime; ; break;} -case 134: -#line 1274 "asn1p_y.y" +case 144: +#line 1342 "asn1p_y.y" { yyval.a_type = ASN_BASIC_GeneralizedTime; ; break;} -case 135: -#line 1281 "asn1p_y.y" +case 145: +#line 1349 "asn1p_y.y" { yyval.a_type = ASN_BASIC_INTEGER; ; break;} -case 136: -#line 1282 "asn1p_y.y" +case 146: +#line 1350 "asn1p_y.y" { yyval.a_type = ASN_BASIC_ENUMERATED; ; break;} -case 137: -#line 1283 "asn1p_y.y" +case 147: +#line 1351 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BIT_STRING; ; break;} -case 138: -#line 1287 "asn1p_y.y" +case 148: +#line 1355 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -2427,8 +2545,8 @@ case 138: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 139: -#line 1293 "asn1p_y.y" +case 149: +#line 1361 "asn1p_y.y" { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; @@ -2440,164 +2558,92 @@ case 139: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 140: -#line 1306 "asn1p_y.y" +case 150: +#line 1374 "asn1p_y.y" { yyval.a_type = ASN_STRING_BMPString; ; break;} -case 141: -#line 1307 "asn1p_y.y" +case 151: +#line 1375 "asn1p_y.y" { yyval.a_type = ASN_STRING_GeneralString; return yyerror("GeneralString is not supported"); ; break;} -case 142: -#line 1311 "asn1p_y.y" +case 152: +#line 1379 "asn1p_y.y" { yyval.a_type = ASN_STRING_GraphicString; return yyerror("GraphicString is not supported"); ; break;} -case 143: -#line 1315 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_IA5String; ; - break;} -case 144: -#line 1316 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_ISO646String; ; - break;} -case 145: -#line 1317 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_NumericString; ; - break;} -case 146: -#line 1318 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_PrintableString; ; - break;} -case 147: -#line 1319 "asn1p_y.y" -{ - yyval.a_type = ASN_STRING_T61String; - return yyerror("T61String not implemented yet"); - ; - break;} -case 148: -#line 1323 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_TeletexString; ; - break;} -case 149: -#line 1324 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_UniversalString; ; - break;} -case 150: -#line 1325 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_UTF8String; ; - break;} -case 151: -#line 1326 "asn1p_y.y" -{ - yyval.a_type = ASN_STRING_VideotexString; - return yyerror("VideotexString is no longer supported"); - ; - break;} -case 152: -#line 1330 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_VisibleString; ; - break;} case 153: -#line 1331 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_ObjectDescriptor; ; +#line 1383 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_IA5String; ; break;} case 154: -#line 1336 "asn1p_y.y" -{ - yyval.a_expr = asn1p_expr_new(asn1p_lineno); - checkmem(yyval.a_expr); - yyval.a_expr->constraints = yyvsp[-2].a_constr; - yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE_OF; - yyval.a_expr->meta_type = AMT_TYPE; - TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; +#line 1384 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_ISO646String; ; break;} case 155: -#line 1344 "asn1p_y.y" -{ - yyval.a_expr = asn1p_expr_new(asn1p_lineno); - checkmem(yyval.a_expr); - yyval.a_expr->constraints = yyvsp[-2].a_constr; - yyval.a_expr->expr_type = ASN_CONSTR_SET_OF; - yyval.a_expr->meta_type = AMT_TYPE; - TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; +#line 1385 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_NumericString; ; break;} case 156: -#line 1355 "asn1p_y.y" -{ - yyval.a_expr = yyvsp[-1].a_expr; - assert(yyval.a_expr->expr_type == A1TC_INVALID); - yyval.a_expr->expr_type = ASN_CONSTR_CHOICE; - yyval.a_expr->meta_type = AMT_TYPE; - ; +#line 1386 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_PrintableString; ; break;} case 157: -#line 1361 "asn1p_y.y" +#line 1387 "asn1p_y.y" { - yyval.a_expr = yyvsp[-1].a_expr; - assert(yyval.a_expr->expr_type == A1TC_INVALID); - yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE; - yyval.a_expr->meta_type = AMT_TYPE; + yyval.a_type = ASN_STRING_T61String; + return yyerror("T61String not implemented yet"); ; break;} case 158: -#line 1367 "asn1p_y.y" -{ - yyval.a_expr = yyvsp[-1].a_expr; - assert(yyval.a_expr->expr_type == A1TC_INVALID); - yyval.a_expr->expr_type = ASN_CONSTR_SET; - yyval.a_expr->meta_type = AMT_TYPE; - ; +#line 1391 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_TeletexString; ; break;} case 159: -#line 1373 "asn1p_y.y" -{ - yyval.a_expr = asn1p_expr_new(asn1p_lineno); - checkmem(yyval.a_expr); - yyval.a_expr->expr_type = ASN_CONSTR_ANY; - yyval.a_expr->meta_type = AMT_TYPE; - ; +#line 1392 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_UniversalString; ; break;} case 160: -#line 1379 "asn1p_y.y" +#line 1393 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_UTF8String; ; + break;} +case 161: +#line 1394 "asn1p_y.y" { - int ret; - yyval.a_expr = asn1p_expr_new(asn1p_lineno); - checkmem(yyval.a_expr); - yyval.a_expr->reference = asn1p_ref_new(yylineno); - ret = asn1p_ref_add_component(yyval.a_expr->reference, - yyvsp[0].tv_str, RLT_lowercase); - checkmem(ret == 0); - yyval.a_expr->expr_type = ASN_CONSTR_ANY; - yyval.a_expr->meta_type = AMT_TYPE; + yyval.a_type = ASN_STRING_VideotexString; + return yyerror("VideotexString is no longer supported"); ; break;} -case 166: -#line 1400 "asn1p_y.y" +case 162: +#line 1398 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_VisibleString; ; + break;} +case 163: +#line 1399 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_ObjectDescriptor; ; + break;} +case 169: +#line 1411 "asn1p_y.y" { yyval.a_constr = 0; ; break;} -case 167: -#line 1401 "asn1p_y.y" +case 170: +#line 1412 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 168: -#line 1407 "asn1p_y.y" +case 171: +#line 1418 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); ; break;} -case 169: -#line 1410 "asn1p_y.y" +case 172: +#line 1421 "asn1p_y.y" { /* * This is a special case, for compatibility purposes. @@ -2606,26 +2652,26 @@ case 169: CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_SIZE, yyvsp[-1].a_constr, 0); ; break;} -case 170: -#line 1420 "asn1p_y.y" +case 173: +#line 1431 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; ; break;} -case 171: -#line 1423 "asn1p_y.y" +case 174: +#line 1434 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} -case 172: -#line 1429 "asn1p_y.y" +case 175: +#line 1440 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 173: -#line 1432 "asn1p_y.y" +case 176: +#line 1443 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2633,8 +2679,8 @@ case 173: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); ; break;} -case 174: -#line 1438 "asn1p_y.y" +case 177: +#line 1449 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2644,32 +2690,32 @@ case 174: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, ct, yyvsp[0].a_constr); ; break;} -case 175: -#line 1449 "asn1p_y.y" +case 178: +#line 1460 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 176: -#line 1452 "asn1p_y.y" +case 179: +#line 1463 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 177: -#line 1455 "asn1p_y.y" +case 180: +#line 1466 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 178: -#line 1458 "asn1p_y.y" +case 181: +#line 1469 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 179: -#line 1464 "asn1p_y.y" +case 182: +#line 1475 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2679,8 +2725,8 @@ case 179: checkmem(ret == 0); ; break;} -case 180: -#line 1472 "asn1p_y.y" +case 183: +#line 1483 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2690,8 +2736,8 @@ case 180: checkmem(ret == 0); ; break;} -case 181: -#line 1480 "asn1p_y.y" +case 184: +#line 1491 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2699,8 +2745,8 @@ case 181: yyval.a_constr->value = yyvsp[0].a_value; ; break;} -case 182: -#line 1486 "asn1p_y.y" +case 185: +#line 1497 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2709,8 +2755,8 @@ case 182: yyval.a_constr->range_stop = yyvsp[0].a_value; ; break;} -case 183: -#line 1493 "asn1p_y.y" +case 186: +#line 1504 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2720,8 +2766,8 @@ case 183: yyval.a_constr->range_start->type = ATV_MIN; ; break;} -case 184: -#line 1501 "asn1p_y.y" +case 187: +#line 1512 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2731,8 +2777,8 @@ case 184: yyval.a_constr->range_stop->type = ATV_MAX; ; break;} -case 185: -#line 1509 "asn1p_y.y" +case 188: +#line 1520 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2743,54 +2789,54 @@ case 185: yyval.a_constr->range_stop->type = ATV_MAX; ; break;} -case 186: -#line 1518 "asn1p_y.y" +case 189: +#line 1529 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 187: -#line 1521 "asn1p_y.y" +case 190: +#line 1532 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 188: -#line 1527 "asn1p_y.y" +case 191: +#line 1538 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RANGE; ; break;} -case 189: -#line 1528 "asn1p_y.y" +case 192: +#line 1539 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RLRANGE; ; break;} -case 190: -#line 1529 "asn1p_y.y" +case 193: +#line 1540 "asn1p_y.y" { yyval.a_ctype = ACT_EL_LLRANGE; ; break;} -case 191: -#line 1530 "asn1p_y.y" +case 194: +#line 1541 "asn1p_y.y" { yyval.a_ctype = ACT_EL_ULRANGE; ; break;} -case 192: -#line 1534 "asn1p_y.y" +case 195: +#line 1545 "asn1p_y.y" { yyval.a_ctype = ACT_CT_SIZE; ; break;} -case 193: -#line 1537 "asn1p_y.y" +case 196: +#line 1548 "asn1p_y.y" { yyval.a_ctype = ACT_CT_FROM; ; break;} -case 194: -#line 1543 "asn1p_y.y" +case 197: +#line 1554 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 195: -#line 1546 "asn1p_y.y" +case 198: +#line 1557 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2803,57 +2849,57 @@ case 195: free(yyvsp[0].tv_str); ; break;} -case 196: -#line 1557 "asn1p_y.y" +case 199: +#line 1568 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} -case 197: -#line 1562 "asn1p_y.y" +case 200: +#line 1573 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_FALSE; ; break;} -case 198: -#line 1567 "asn1p_y.y" +case 201: +#line 1578 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); yyval.a_value->type = ATV_TRUE; ; break;} -case 199: -#line 1575 "asn1p_y.y" +case 202: +#line 1586 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); ; break;} -case 200: -#line 1581 "asn1p_y.y" +case 203: +#line 1592 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 201: -#line 1584 "asn1p_y.y" +case 204: +#line 1595 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 202: -#line 1590 "asn1p_y.y" +case 205: +#line 1601 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_EXT; ; break;} -case 203: -#line 1595 "asn1p_y.y" +case 206: +#line 1606 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2862,46 +2908,46 @@ case 203: yyval.a_constr->presence = yyvsp[0].a_pres; ; break;} -case 204: -#line 1608 "asn1p_y.y" +case 207: +#line 1619 "asn1p_y.y" { yyval.a_pres = ACPRES_DEFAULT; ; break;} -case 205: -#line 1609 "asn1p_y.y" +case 208: +#line 1620 "asn1p_y.y" { yyval.a_pres = yyvsp[0].a_pres; ; break;} -case 206: -#line 1613 "asn1p_y.y" +case 209: +#line 1624 "asn1p_y.y" { yyval.a_pres = ACPRES_PRESENT; ; break;} -case 207: -#line 1616 "asn1p_y.y" +case 210: +#line 1627 "asn1p_y.y" { yyval.a_pres = ACPRES_ABSENT; ; break;} -case 208: -#line 1619 "asn1p_y.y" +case 211: +#line 1630 "asn1p_y.y" { yyval.a_pres = ACPRES_OPTIONAL; ; break;} -case 209: -#line 1625 "asn1p_y.y" +case 212: +#line 1636 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 210: -#line 1628 "asn1p_y.y" +case 213: +#line 1639 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 211: -#line 1637 "asn1p_y.y" +case 214: +#line 1648 "asn1p_y.y" { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; @@ -2915,14 +2961,14 @@ case 211: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, ct, 0); ; break;} -case 212: -#line 1652 "asn1p_y.y" +case 215: +#line 1663 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} -case 213: -#line 1658 "asn1p_y.y" +case 216: +#line 1669 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2930,8 +2976,8 @@ case 213: yyval.a_constr->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); ; break;} -case 214: -#line 1664 "asn1p_y.y" +case 217: +#line 1675 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2941,8 +2987,8 @@ case 214: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); ; break;} -case 215: -#line 1678 "asn1p_y.y" +case 218: +#line 1689 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; @@ -2955,8 +3001,8 @@ case 215: free(yyvsp[0].tv_str); ; break;} -case 216: -#line 1689 "asn1p_y.y" +case 219: +#line 1700 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; @@ -2970,14 +3016,14 @@ case 216: free(yyvsp[0].tv_str); ; break;} -case 217: -#line 1705 "asn1p_y.y" +case 220: +#line 1716 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 218: -#line 1708 "asn1p_y.y" +case 221: +#line 1719 "asn1p_y.y" { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); @@ -2988,76 +3034,76 @@ case 218: yyval.tv_str[l1 + 1 + l3] = '\0'; ; break;} -case 219: -#line 1726 "asn1p_y.y" +case 222: +#line 1737 "asn1p_y.y" { yyval.a_marker = EM_NOMARK; ; break;} -case 220: -#line 1727 "asn1p_y.y" +case 223: +#line 1738 "asn1p_y.y" { yyval.a_marker = yyvsp[0].a_marker; ; break;} -case 221: -#line 1731 "asn1p_y.y" +case 224: +#line 1742 "asn1p_y.y" { yyval.a_marker = EM_OPTIONAL; ; break;} -case 222: -#line 1734 "asn1p_y.y" +case 225: +#line 1745 "asn1p_y.y" { yyval.a_marker = EM_DEFAULT; /* FIXME: store DefaultValue somewhere */ ; break;} -case 223: -#line 1741 "asn1p_y.y" +case 226: +#line 1752 "asn1p_y.y" { ; break;} -case 224: -#line 1743 "asn1p_y.y" +case 227: +#line 1754 "asn1p_y.y" { ; break;} -case 225: -#line 1745 "asn1p_y.y" +case 228: +#line 1756 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} -case 226: -#line 1745 "asn1p_y.y" +case 229: +#line 1756 "asn1p_y.y" { ; break;} -case 227: -#line 1766 "asn1p_y.y" +case 230: +#line 1777 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); ; break;} -case 228: -#line 1770 "asn1p_y.y" +case 231: +#line 1781 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; ; break;} -case 229: -#line 1776 "asn1p_y.y" +case 232: +#line 1787 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} -case 230: -#line 1781 "asn1p_y.y" +case 233: +#line 1792 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); ; break;} -case 231: -#line 1788 "asn1p_y.y" +case 234: +#line 1799 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3066,8 +3112,8 @@ case 231: yyval.a_expr->Identifier = yyvsp[0].tv_str; ; break;} -case 232: -#line 1795 "asn1p_y.y" +case 235: +#line 1806 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3077,8 +3123,8 @@ case 232: yyval.a_expr->value = yyvsp[-1].a_value; ; break;} -case 233: -#line 1803 "asn1p_y.y" +case 236: +#line 1814 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3088,8 +3134,8 @@ case 233: yyval.a_expr->value = yyvsp[-1].a_value; ; break;} -case 234: -#line 1811 "asn1p_y.y" +case 237: +#line 1822 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3098,8 +3144,8 @@ case 234: yyval.a_expr->value = yyvsp[0].a_value; ; break;} -case 235: -#line 1818 "asn1p_y.y" +case 238: +#line 1829 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -3109,86 +3155,86 @@ case 235: yyval.a_expr->meta_type = AMT_VALUE; ; break;} -case 236: -#line 1829 "asn1p_y.y" +case 239: +#line 1840 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} -case 237: -#line 1833 "asn1p_y.y" +case 240: +#line 1844 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} -case 238: -#line 1864 "asn1p_y.y" +case 241: +#line 1875 "asn1p_y.y" { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; break;} -case 239: -#line 1865 "asn1p_y.y" +case 242: +#line 1876 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; ; break;} -case 240: -#line 1869 "asn1p_y.y" +case 243: +#line 1880 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; yyval.a_tag.tag_mode = TM_DEFAULT; ; break;} -case 241: -#line 1873 "asn1p_y.y" +case 244: +#line 1884 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_IMPLICIT; ; break;} -case 242: -#line 1877 "asn1p_y.y" +case 245: +#line 1888 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_EXPLICIT; ; break;} -case 243: -#line 1884 "asn1p_y.y" +case 246: +#line 1895 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 244: -#line 1888 "asn1p_y.y" +case 247: +#line 1899 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 245: -#line 1896 "asn1p_y.y" +case 248: +#line 1907 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 246: -#line 1903 "asn1p_y.y" +case 249: +#line 1914 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 247: -#line 1910 "asn1p_y.y" +case 250: +#line 1921 "asn1p_y.y" { memset(&yyval.tv_nametag, 0, sizeof(yyval.tv_nametag)); yyval.tv_nametag.name = yyvsp[0].tv_str; ; break;} -case 248: -#line 1914 "asn1p_y.y" +case 251: +#line 1925 "asn1p_y.y" { yyval.tv_nametag.name = yyvsp[-1].tv_str; yyval.tv_nametag.tag = yyvsp[0].a_tag; @@ -3416,7 +3462,7 @@ case 248: } return 1; } -#line 1921 "asn1p_y.y" +#line 1932 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index a77b5fd62..3e712509e 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -218,9 +218,8 @@ static asn1p_value_t * %type ExportsBody %type ImportsElement %type ExportsElement -%type DataTypeMember %type ExtensionAndException -%type UnconstrainedTypeDeclaration +%type TypeDeclaration %type ComplexTypeReference %type ComplexTypeReferenceAmpList %type ComplexTypeReferenceElement @@ -229,7 +228,7 @@ static asn1p_value_t * %type ClassFieldList %type ClassField %type ClassDeclaration -%type ConstrainedTypeDeclaration +%type Type %type DataTypeReference /* Type1 ::= Type2 */ %type DefinedTypeRef %type ValueSetDefinition /* Val INTEGER ::= {1|2} */ @@ -238,9 +237,10 @@ static asn1p_value_t * %type InlineOrDefinedValue %type DefinedValue %type SignedNumber -%type ConstructedType -%type ConstructedTypeConstrained -%type ConstructedDataTypeDefinition +%type ComponentTypeLists +%type ComponentType +%type AlternativeTypeLists +%type AlternativeType //%type optUniverationDefinition %type UniverationDefinition %type UniverationList @@ -718,7 +718,7 @@ DataTypeReference: $$->expr_type = A1TC_TYPEID; $$->meta_type = AMT_TYPE; } - | TypeRefName TOK_PPEQ optTag ConstrainedTypeDeclaration { + | TypeRefName TOK_PPEQ optTag Type { $$ = $4; $$->Identifier = $1; $$->tag = $3; @@ -741,8 +741,7 @@ DataTypeReference: * } * === EOF === */ - | TypeRefName '{' ParameterArgumentList '}' - TOK_PPEQ ConstrainedTypeDeclaration { + | TypeRefName '{' ParameterArgumentList '}' TOK_PPEQ Type { $$ = $6; assert($$->Identifier == 0); $$->Identifier = $1; @@ -806,7 +805,7 @@ ActualParameterList: ; ActualParameter: - UnconstrainedTypeDeclaration { + Type { $$ = $1; } | Identifier { @@ -821,18 +820,62 @@ ActualParameter: /* * A collection of constructed data type members. */ -ConstructedDataTypeDefinition: - DataTypeMember { +ComponentTypeLists: + ComponentType { $$ = asn1p_expr_new(yylineno); checkmem($$); TQ_ADD(&($$->members), $1, next); } - | ConstructedDataTypeDefinition ',' DataTypeMember { + | ComponentTypeLists ',' ComponentType { $$ = $1; TQ_ADD(&($$->members), $3, next); } ; +ComponentType: + TaggedIdentifier Type optMarker { + $$ = $2; + assert($$->Identifier == 0); + $$->Identifier = $1.name; + $$->tag = $1.tag; + $$->marker = $3; + } + | TOK_COMPONENTS TOK_OF Type { + $$ = asn1p_expr_new(yylineno); + checkmem($$); + $$->meta_type = $3->meta_type; + $$->expr_type = A1TC_COMPONENTS_OF; + TQ_ADD(&($$->members), $3, next); + } + | ExtensionAndException { + $$ = $1; + } + ; + +AlternativeTypeLists: + AlternativeType { + $$ = asn1p_expr_new(yylineno); + checkmem($$); + TQ_ADD(&($$->members), $1, next); + } + | AlternativeTypeLists ',' AlternativeType { + $$ = $1; + TQ_ADD(&($$->members), $3, next); + } + ; + +AlternativeType: + TaggedIdentifier Type { + $$ = $2; + assert($$->Identifier == 0); + $$->Identifier = $1.name; + $$->tag = $1.tag; + } + | ExtensionAndException { + $$ = $1; + } + ; + ClassDeclaration: TOK_CLASS '{' ClassFieldList '}' optWithSyntax { $$ = $3; @@ -871,10 +914,11 @@ ClassField: $$->meta_type = AMT_OBJECTFIELD; $$->marker = $2; } - | ClassFieldIdentifier ConstrainedTypeDeclaration optUnique { + | ClassFieldIdentifier Type optMarker optUnique { $$ = $2; $$->Identifier = $1.name; - $$->unique = $3; + $$->marker = $3; + $$->unique = $4; } | ClassFieldIdentifier ClassFieldIdentifier optMarker optUnique { int ret; @@ -935,50 +979,6 @@ WithSyntaxFormatToken: } ; -/* - * A data type member goes like this - * === - * memb1 [0] Type1 { a(1), b(2) } (2) - * === - * Therefore, we propose a split. - * ^^^^^^^^^ ^^^^^^^^^^ - * ^TaggedIdentifier ^TypeDeclaration - * ^ConstrainedTypeDeclaration - */ - -/* - * A member of a constructed data type ("a" or "b" in above example). - */ -DataTypeMember: - TaggedIdentifier ConstrainedTypeDeclaration { - $$ = $2; - assert($$->Identifier == 0); - $$->Identifier = $1.name; - $$->tag = $1.tag; - } - | ExtensionAndException { - $$ = $1; - } - ; - -ConstrainedTypeDeclaration: - UnconstrainedTypeDeclaration optConstraints optMarker { - $$ = $1; - if($$->constraints) { - assert(!$2); - } else { - $$->constraints = $2; - } - $$->marker = $3; - } - | ConstructedTypeConstrained { - /* This type includes constraints on its own */ - $$ = $1; - checkmem($$); - assert($$->meta_type); - } - ; - ExtensionAndException: TOK_ThreeDots { $$ = asn1p_expr_new(asn1p_lineno); @@ -1008,7 +1008,28 @@ ExtensionAndException: } ; -UnconstrainedTypeDeclaration: +Type: + TypeDeclaration optConstraints { + $$ = $1; + /* + * Outer constraint for SEQUENCE OF and SET OF applies + * to the inner type. + */ + if($$->expr_type == ASN_CONSTR_SEQUENCE_OF + || $$->expr_type == ASN_CONSTR_SET_OF) { + assert(!TQ_FIRST(&($$->members))->constraints); + TQ_FIRST(&($$->members))->constraints = $2; + } else { + if($$->constraints) { + assert(!$2); + } else { + $$->constraints = $2; + } + } + } + ; + +TypeDeclaration: BasicType { $$ = $1; } @@ -1018,11 +1039,58 @@ UnconstrainedTypeDeclaration: $$->expr_type = $1; $$->meta_type = AMT_TYPE; } - | ConstructedType { - $$ = $1; + | TOK_CHOICE '{' AlternativeTypeLists '}' { + $$ = $3; + assert($$->expr_type == A1TC_INVALID); + $$->expr_type = ASN_CONSTR_CHOICE; + $$->meta_type = AMT_TYPE; + } + | TOK_SEQUENCE '{' ComponentTypeLists '}' { + $$ = $3; + assert($$->expr_type == A1TC_INVALID); + $$->expr_type = ASN_CONSTR_SEQUENCE; + $$->meta_type = AMT_TYPE; + } + | TOK_SET '{' ComponentTypeLists '}' { + $$ = $3; + assert($$->expr_type == A1TC_INVALID); + $$->expr_type = ASN_CONSTR_SET; + $$->meta_type = AMT_TYPE; + } + | TOK_SEQUENCE optConstraints TOK_OF TypeDeclaration { + $$ = asn1p_expr_new(asn1p_lineno); checkmem($$); - assert($$->meta_type); + $$->constraints = $2; + $$->expr_type = ASN_CONSTR_SEQUENCE_OF; + $$->meta_type = AMT_TYPE; + TQ_ADD(&($$->members), $4, next); } + | TOK_SET optConstraints TOK_OF TypeDeclaration { + $$ = asn1p_expr_new(asn1p_lineno); + checkmem($$); + $$->constraints = $2; + $$->expr_type = ASN_CONSTR_SET_OF; + $$->meta_type = AMT_TYPE; + TQ_ADD(&($$->members), $4, next); + } + | TOK_ANY { + $$ = asn1p_expr_new(asn1p_lineno); + checkmem($$); + $$->expr_type = ASN_CONSTR_ANY; + $$->meta_type = AMT_TYPE; + } + | TOK_ANY TOK_DEFINED TOK_BY Identifier { + int ret; + $$ = asn1p_expr_new(asn1p_lineno); + checkmem($$); + $$->reference = asn1p_ref_new(yylineno); + ret = asn1p_ref_add_component($$->reference, + $4, RLT_lowercase); + checkmem(ret == 0); + $$->expr_type = ASN_CONSTR_ANY; + $$->meta_type = AMT_TYPE; + } + ; /* * A parametrized assignment. */ @@ -1332,63 +1400,6 @@ BasicString: ; -ConstructedTypeConstrained: - TOK_SEQUENCE optConstraints TOK_OF ConstrainedTypeDeclaration { - $$ = asn1p_expr_new(asn1p_lineno); - checkmem($$); - $$->constraints = $2; - $$->expr_type = ASN_CONSTR_SEQUENCE_OF; - $$->meta_type = AMT_TYPE; - TQ_ADD(&($$->members), $4, next); - } - | TOK_SET optConstraints TOK_OF ConstrainedTypeDeclaration { - $$ = asn1p_expr_new(asn1p_lineno); - checkmem($$); - $$->constraints = $2; - $$->expr_type = ASN_CONSTR_SET_OF; - $$->meta_type = AMT_TYPE; - TQ_ADD(&($$->members), $4, next); - } - ; - -ConstructedType: - TOK_CHOICE '{' ConstructedDataTypeDefinition '}' { - $$ = $3; - assert($$->expr_type == A1TC_INVALID); - $$->expr_type = ASN_CONSTR_CHOICE; - $$->meta_type = AMT_TYPE; - } - | TOK_SEQUENCE '{' ConstructedDataTypeDefinition '}' { - $$ = $3; - assert($$->expr_type == A1TC_INVALID); - $$->expr_type = ASN_CONSTR_SEQUENCE; - $$->meta_type = AMT_TYPE; - } - | TOK_SET '{' ConstructedDataTypeDefinition '}' { - $$ = $3; - assert($$->expr_type == A1TC_INVALID); - $$->expr_type = ASN_CONSTR_SET; - $$->meta_type = AMT_TYPE; - } - | TOK_ANY { - $$ = asn1p_expr_new(asn1p_lineno); - checkmem($$); - $$->expr_type = ASN_CONSTR_ANY; - $$->meta_type = AMT_TYPE; - } - | TOK_ANY TOK_DEFINED TOK_BY Identifier { - int ret; - $$ = asn1p_expr_new(asn1p_lineno); - checkmem($$); - $$->reference = asn1p_ref_new(yylineno); - ret = asn1p_ref_add_component($$->reference, - $4, RLT_lowercase); - checkmem(ret == 0); - $$->expr_type = ASN_CONSTR_ANY; - $$->meta_type = AMT_TYPE; - } - ; - /* * Data type constraints. */ diff --git a/libasn1parser/asn1parser.c b/libasn1parser/asn1parser.c index b5d9e1e49..6a3477d10 100644 --- a/libasn1parser/asn1parser.c +++ b/libasn1parser/asn1parser.c @@ -17,7 +17,7 @@ void *asn1p_restart(FILE *); extern int asn1p_lineno; static int _asn1p_set_flags(enum asn1p_flags flags); -static int _asn1p_assign_filename(asn1p_t *a, const char *fname); +static int _asn1p_fix_modules(asn1p_t *a, const char *fname); /* * Parse the given buffer. @@ -52,7 +52,7 @@ asn1p_parse_buffer(const char *buffer, int size /* = -1 */, enum asn1p_flags fla if(ret == 0) { assert(a); - if(_asn1p_assign_filename(a, "-")) + if(_asn1p_fix_modules(a, "-")) return NULL; /* FIXME: destroy (a) */ } else { assert(a == NULL); @@ -104,7 +104,7 @@ asn1p_parse_file(const char *filename, enum asn1p_flags flags) { if(ret == 0) { assert(a); - if(_asn1p_assign_filename(a, filename)) + if(_asn1p_fix_modules(a, filename)) return NULL; /* FIXME: destroy (a) */ } else { assert(a == NULL); @@ -159,13 +159,38 @@ _asn1p_set_flags(enum asn1p_flags flags) { return 0; } +/* + * Perform last touches. + */ +static void +_asn1p_apply_module2expr(asn1p_expr_t *expr, asn1p_module_t *mod) { + asn1p_expr_t *e; + + expr->module = mod; /* This is a useful thing */ + + /* + * Do it to children also. + */ + TQ_FOR(e, &(expr->members), next) { + _asn1p_apply_module2expr(e, mod); + } +} + static int -_asn1p_assign_filename(asn1p_t *a, const char *fname) { +_asn1p_fix_modules(asn1p_t *a, const char *fname) { asn1p_module_t *mod; TQ_FOR(mod, &(a->modules), mod_next) { + asn1p_expr_t *expr; + mod->source_file_name = strdup(fname); if(mod->source_file_name == NULL) return -1; + + TQ_FOR(expr, &(mod->members), next) { + _asn1p_apply_module2expr(expr, mod); + } } return 0; } + + From 780bb560cab0c1d3a0fff84111ab7eef425fe5ba Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 22 Aug 2004 03:20:15 +0000 Subject: [PATCH 0186/1469] reprioritizing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@186 59561ff5-6e30-0410-9f3c-9617f08c8826 --- TODO | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/TODO b/TODO index 21f117b07..85745a838 100644 --- a/TODO +++ b/TODO @@ -2,9 +2,13 @@ MAJOR: 1. Support for PER encoding. Requires advanced subtype constraints support (#1) -2. Support for Information Object Classes. +2. Support for XER encoding. + +3. Support for Information Object Classes. Status: support for parsing IOCs is mostly present. Support for slicing the IOCs to produce "views" is not yet designed. -3. Support for XER encoding. +MINOR: + +1. Support for ANY, EXTERNAL, EMBEDDED-PDV and CHARACTER STRING types. From b179d31c87b2750983a9d600b5331337d89715b2 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 22 Aug 2004 03:23:15 +0000 Subject: [PATCH 0187/1469] api change reflection git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@187 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_misc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libasn1compiler/asn1c_misc.c b/libasn1compiler/asn1c_misc.c index c30174bbf..be3446a91 100644 --- a/libasn1compiler/asn1c_misc.c +++ b/libasn1compiler/asn1c_misc.c @@ -99,9 +99,10 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { * Resolve it and use instead. */ tmp.expr = asn1f_class_access_ex(arg->asn, arg->mod, - arg->expr, expr->reference, &tmp.mod); + arg->expr, expr->reference); if(tmp.expr) return NULL; + tmp.mod = tmp.expr->module; return asn1c_type_name(&tmp, tmp.expr, _format); } else if(_format == TNF_RSAFE) { /* From ded1e367b6fbc339deae409bdb52cb4b246f31b7 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 22 Aug 2004 03:23:46 +0000 Subject: [PATCH 0188/1469] api change reflection git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@188 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_misc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libasn1compiler/asn1c_misc.c b/libasn1compiler/asn1c_misc.c index be3446a91..28e46920c 100644 --- a/libasn1compiler/asn1c_misc.c +++ b/libasn1compiler/asn1c_misc.c @@ -114,7 +114,7 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { */ asn1p_expr_t *terminal; terminal = asn1f_find_terminal_type_ex( - arg->asn, arg->mod, arg->expr, NULL); + arg->asn, arg->mod, arg->expr); if(terminal && (terminal->expr_type & (ASN_BASIC_MASK | ASN_STRING_MASK))) From dae7f9d56176029abaf6fee8fc0568db016dbef3 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 22 Aug 2004 03:25:24 +0000 Subject: [PATCH 0189/1469] COMPONENTS OF support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@189 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 4 +- libasn1compiler/asn1c_C.c | 182 +++++++++++++++++++------------------- libasn1compiler/asn1c_C.h | 11 ++- 3 files changed, 101 insertions(+), 96 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6ddf84286..6c7e05a3b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,10 +1,12 @@ -0.9: 2004-Aug-20 +0.9: 2004-Aug-21 * Reworked subtype constraints handling, aiming at PER-applicability. * BOOLEAN and NULL are now implemented in terms of native int type. * Compiler now links in only necessary skeleton files. * -t option added to asn1c to ease manual BER/CER/DER decoding. + * Added support COMPONENTS OF construct. + * Numerous parser fixes and enhancements. 0.8.19: 2004-Aug-18 diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index f54d2d582..eaac64423 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -40,11 +40,13 @@ static int emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count); OUT("ber_dec_ctx_t _ber_dec_ctx;\n")); #define DEPENDENCIES do { \ - TQ_FOR(v, &(expr->members), next) { \ - if((!(v->expr_type & ASN_CONSTR_MASK) \ - && v->expr_type > ASN_CONSTR_MASK) \ - || v->meta_type == AMT_TYPEREF) { \ - GEN_INCLUDE(asn1c_type_name(arg, v, TNF_INCLUDE));\ + asn1p_expr_t *__m; \ + TQ_FOR(__m, &(expr->members), next) { \ + if((!(__m->expr_type & ASN_CONSTR_MASK) \ + && __m->expr_type > ASN_CONSTR_MASK) \ + || __m->meta_type == AMT_TYPEREF) { \ + GEN_INCLUDE(asn1c_type_name(arg, \ + __m, TNF_INCLUDE)); \ } \ } \ if(expr->expr_type == ASN_CONSTR_SET_OF) \ @@ -124,8 +126,7 @@ asn1c_lang_C_type_SEQUENCE(arg_t *arg) { DEPENDENCIES; if(arg->embed) { - OUT("struct %s {\n", - MKID(expr->Identifier)); + OUT("struct %s {\n", MKID(expr->Identifier)); } else { OUT("typedef struct %s {\n", MKID(expr->Identifier)); @@ -141,9 +142,9 @@ asn1c_lang_C_type_SEQUENCE(arg_t *arg) { } PCTX_DEF; - OUT("} %s%s", expr->marker?"*":"", - MKID(expr->Identifier)); - if(arg->embed) OUT(";\n"); else OUT("_t;\n"); + OUT("} %s%s%s", expr->marker?"*":"", + expr->_anonymous_type ? "" : MKID(expr->Identifier), + arg->embed ? "" : "_t"); return asn1c_lang_C_type_SEQUENCE_def(arg); } @@ -221,7 +222,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { OUT("};\n"); OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p); INDENTED( - OUT("\"%s\",\n", expr->Identifier); + OUT("\"%s\",\n", expr->_anonymous_type?"":expr->Identifier); OUT("SEQUENCE_constraint,\n"); OUT("SEQUENCE_decode_ber,\n"); OUT("SEQUENCE_encode_der,\n"); @@ -251,34 +252,6 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { return 0; } -int -asn1c_lang_C_type_SEQUENCE_OF(arg_t *arg) { - asn1p_expr_t *expr = arg->expr; - asn1p_expr_t *v; - - DEPENDENCIES; - - if(arg->embed) { - OUT("struct %s {\n", MKID(expr->Identifier)); - } else { - OUT("typedef struct %s {\n", MKID(expr->Identifier)); - } - - TQ_FOR(v, &(expr->members), next) { - INDENTED(OUT("A_SEQUENCE_OF(%s) list;\n", - asn1c_type_name(arg, v, TNF_RSAFE))); - } - - PCTX_DEF; - OUT("} %s%s", expr->marker?"*":"", MKID(expr->Identifier)); - if(arg->embed) OUT(";\n"); else OUT("_t;\n"); - - /* - * SET OF/SEQUENCE OF definition, SEQUENCE OF mode. - */ - return asn1c_lang_C_type_SEx_OF_def(arg, 1); -} - int asn1c_lang_C_type_SET(arg_t *arg) { asn1p_expr_t *expr = arg->expr; @@ -338,8 +311,9 @@ asn1c_lang_C_type_SET(arg_t *arg) { ); PCTX_DEF; - OUT("} %s%s", expr->marker?"*":"", MKID(expr->Identifier)); - if(arg->embed) OUT(";\n"); else OUT("_t;\n"); + OUT("} %s%s%s", expr->marker?"*":"", + expr->_anonymous_type ? "" : MKID(expr->Identifier), + arg->embed ? "" : "_t"); return asn1c_lang_C_type_SET_def(arg); } @@ -445,7 +419,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { OUT("};\n"); OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p); INDENTED( - OUT("\"%s\",\n", expr->Identifier); + OUT("\"%s\",\n", expr->_anonymous_type?"":expr->Identifier); OUT("SET_constraint,\n"); OUT("SET_decode_ber,\n"); OUT("SET_encode_der,\n"); @@ -476,32 +450,56 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { } int -asn1c_lang_C_type_SET_OF(arg_t *arg) { +asn1c_lang_C_type_SEx_OF(arg_t *arg) { asn1p_expr_t *expr = arg->expr; - asn1p_expr_t *v; + asn1p_expr_t *memb; DEPENDENCIES; if(arg->embed) { OUT("struct %s {\n", MKID(expr->Identifier)); } else { - OUT("typedef struct %s {\n", - MKID(expr->Identifier)); + OUT("typedef struct %s {\n", MKID(expr->Identifier)); } - TQ_FOR(v, &(expr->members), next) { - INDENTED(OUT("A_SET_OF(%s) list;\n", - asn1c_type_name(arg, v, TNF_RSAFE))); + memb = TQ_FIRST(&expr->members); + + INDENT(+1); + OUT("A_%s_OF(", + (arg->expr->expr_type == ASN_CONSTR_SET_OF) + ? "SET" : "SEQUENCE"); + if(memb->expr_type & ASN_CONSTR_MASK) { + arg_t tmp; + asn1p_expr_t tmp_memb; + arg->embed++; + tmp = *arg; + tmp.expr = &tmp_memb; + tmp_memb = *memb; + tmp_memb._anonymous_type = 1; + tmp_memb.Identifier = strdup( + asn1c_make_identifier(0, + expr->Identifier, "member", 0)); + assert(tmp_memb.Identifier); + tmp.default_cb(&tmp); + free(tmp_memb.Identifier); + arg->embed--; + assert(arg->target->target == OT_TYPE_DECLS); + } else { + OUT("%s", asn1c_type_name(arg, memb, TNF_RSAFE)); } + OUT(") list;\n"); + INDENT(-1); PCTX_DEF; - OUT("} %s%s", expr->marker?"*":"", MKID(expr->Identifier)); - if(arg->embed) OUT(";\n"); else OUT("_t;\n"); + OUT("} %s%s%s", expr->marker?"*":"", + expr->_anonymous_type ? "" : MKID(expr->Identifier), + arg->embed ? "" : "_t"); /* - * SET OF/SEQUENCE OF definition, SET OF mode. + * SET OF/SEQUENCE OF definition */ - return asn1c_lang_C_type_SEx_OF_def(arg, 0); + return asn1c_lang_C_type_SEx_OF_def(arg, + (arg->expr->expr_type == ASN_CONSTR_SEQUENCE_OF)); } static int @@ -551,7 +549,7 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { OUT("};\n"); OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p); INDENTED( - OUT("\"%s\",\n", expr->Identifier); + OUT("\"%s\",\n", expr->_anonymous_type?"":expr->Identifier); if(seq_of) { OUT("SEQUENCE_OF_constraint,\n"); OUT("SEQUENCE_OF_decode_ber,\n"); @@ -593,43 +591,42 @@ int asn1c_lang_C_type_CHOICE(arg_t *arg) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *v; - char *p; + char *id; DEPENDENCIES; REDIR(OT_DEPS); - p = MKID(expr->Identifier); - OUT("typedef enum %s_PR {\n", p); + id = MKID(expr->Identifier); + OUT("typedef enum %s_PR {\n", id); INDENTED( - p = MKID(expr->Identifier); OUT("%s_PR_NOTHING,\t" - "/* No components present */\n", p); + "/* No components present */\n", id); TQ_FOR(v, &(expr->members), next) { if(v->expr_type == A1TC_EXTENSIBLE) { OUT("/* Extensions may appear below */\n"); continue; } - p = MKID(expr->Identifier); - OUT("%s_PR_", p); - p = MKID(v->Identifier); - OUT("%s,\n", p, p); + id = MKID(expr->Identifier); + OUT("%s_PR_", id); + id = MKID(v->Identifier); + OUT("%s,\n", id, id); } ); - p = MKID(expr->Identifier); - OUT("} %s_PR;\n", p); + id = MKID(expr->Identifier); + OUT("} %s_PR;\n", id); REDIR(OT_TYPE_DECLS); if(arg->embed) { - OUT("struct %s {\n", p); + OUT("struct %s {\n", id); } else { - OUT("typedef struct %s {\n", p); + OUT("typedef struct %s {\n", id); } INDENTED( - OUT("%s_PR present;\n", p); - OUT("union {\n", p); + OUT("%s_PR present;\n", id); + OUT("union {\n", id); TQ_FOR(v, &(expr->members), next) { EMBED(v); } @@ -638,8 +635,9 @@ asn1c_lang_C_type_CHOICE(arg_t *arg) { ); PCTX_DEF; - OUT("} %s%s", expr->marker?"*":"", MKID(expr->Identifier)); - if(arg->embed) OUT(";\n"); else OUT("_t;\n"); + OUT("} %s%s%s", expr->marker?"*":"", + expr->_anonymous_type ? "" : MKID(expr->Identifier), + arg->embed ? "" : "_t"); return asn1c_lang_C_type_CHOICE_def(arg); } @@ -720,7 +718,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { OUT("};\n"); OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p); INDENTED( - OUT("\"%s\",\n", expr->Identifier); + OUT("\"%s\",\n", expr->_anonymous_type?"":expr->Identifier); OUT("CHOICE_constraint,\n"); OUT("CHOICE_decode_ber,\n"); OUT("CHOICE_encode_der,\n"); @@ -756,17 +754,16 @@ asn1c_lang_C_type_REFERENCE(arg_t *arg) { ref = arg->expr->reference; if(ref->components[ref->comp_count-1].name[0] == '&') { - asn1p_module_t *mod; asn1p_expr_t *extract; arg_t tmp; int ret; - extract = asn1f_class_access_ex(arg->asn, arg->mod, arg->expr, - ref, &mod); + extract = asn1f_class_access_ex(arg->asn, arg->mod, + arg->expr, ref); if(extract == NULL) return -1; - extract = asn1p_expr_clone(extract); + extract = asn1p_expr_clone(extract, 0); if(extract) { if(extract->Identifier) free(extract->Identifier); @@ -781,7 +778,7 @@ asn1c_lang_C_type_REFERENCE(arg_t *arg) { tmp = *arg; tmp.asn = arg->asn; - tmp.mod = mod; + tmp.mod = extract->module; tmp.expr = extract; ret = arg->default_cb(&tmp); @@ -808,10 +805,9 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("%s\t", asn1c_type_name(arg, arg->expr, expr->marker?TNF_RSAFE:TNF_CTYPE)); OUT("%s", expr->marker?"*":" "); - OUT("%s;", MKID(expr->Identifier)); + OUT("%s", MKID(expr->Identifier)); if(expr->marker) OUT("\t/* %s */", (expr->marker==EM_OPTIONAL)?"OPTIONAL":"DEFAULT"); - OUT("\n"); REDIR(OT_TYPE_DECLS); return 0; @@ -824,8 +820,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("typedef %s\t", asn1c_type_name(arg, arg->expr, TNF_CTYPE)); OUT("%s", expr->marker?"*":" "); - OUT("%s_t;\n", MKID(expr->Identifier)); - OUT("\n"); + OUT("%s_t", MKID(expr->Identifier)); REDIR(OT_STAT_DEFS); @@ -837,7 +832,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { p = MKID(expr->Identifier); OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p); INDENTED( - OUT("\"%s\",\n", expr->Identifier); + OUT("\"%s\",\n", expr->_anonymous_type?"":expr->Identifier); OUT("%s_constraint,\n", p); OUT("%s_decode_ber,\n", p); OUT("%s_encode_der,\n", p); @@ -1167,9 +1162,10 @@ _add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no) { if(arg->expr->expr_type == A1TC_REFERENCE) { arg_t tmp = *arg; asn1p_expr_t *expr; - expr = asn1f_lookup_symbol_ex(tmp.asn, &tmp.mod, tmp.expr, + expr = asn1f_lookup_symbol_ex(tmp.asn, tmp.mod, tmp.expr, arg->expr->reference); if(expr) { + tmp.mod = expr->module; tmp.expr = expr; return _add_tag2el_member(&tmp, tag2el, count, el_no); } else { @@ -1273,8 +1269,7 @@ _expr_elements_count(arg_t *arg, asn1p_expr_t *expr) { asn1p_expr_t *v; int elements = 0; - topmost_parent = asn1f_find_terminal_type_ex(arg->asn, - arg->mod, expr, 0); + topmost_parent = asn1f_find_terminal_type_ex(arg->asn, arg->mod, expr); if(!topmost_parent) return 0; if(!(topmost_parent->expr_type & ASN_CONSTR_MASK)) @@ -1290,6 +1285,7 @@ _expr_elements_count(arg_t *arg, asn1p_expr_t *expr) { static int _emit_member_table(arg_t *arg, asn1p_expr_t *expr) { + static int global_memb_unique; int save_target; arg_t tmp_arg; char *p; @@ -1331,14 +1327,22 @@ _emit_member_table(arg_t *arg, asn1p_expr_t *expr) { OUT("0,\n"); } if(C99_MODE) OUT(".type = "); - OUT("(void *)&asn1_DEF_%s,\n", - asn1c_type_name(arg, expr, TNF_SAFE)); + if((expr->expr_type & ASN_CONSTR_MASK) + && (arg->expr->expr_type == ASN_CONSTR_SEQUENCE_OF + || arg->expr->expr_type == ASN_CONSTR_SET_OF)) { + OUT("(void *)&asn1_DEF_%s_member,\n", + MKID(arg->expr->Identifier)); + } else { + OUT("(void *)&asn1_DEF_%s,\n", + asn1c_type_name(arg, expr, TNF_SAFE)); + } if(C99_MODE) OUT(".memb_constraints = "); if(expr->constraints) { p = MKID(expr->Identifier); if(!expr->Identifier) p = asn1c_type_name(arg, expr, TNF_SAFE); - OUT("memb_%s_constraint,\n", p); + OUT("memb_%s_%d_constraint,\n", p, + ++global_memb_unique); } else { OUT("0,\t/* Defer to actual type */\n"); } @@ -1358,7 +1362,7 @@ _emit_member_table(arg_t *arg, asn1p_expr_t *expr) { else p = asn1c_type_name(arg, expr, TNF_SAFE); OUT("static int\n"); - OUT("memb_%s_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,\n", p); + OUT("memb_%s_%d_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,\n", p, global_memb_unique); INDENT(+1); OUT("\t\tasn_app_consume_bytes_f *app_errlog, void *app_key) {\n"); tmp_arg = *arg; diff --git a/libasn1compiler/asn1c_C.h b/libasn1compiler/asn1c_C.h index 643d62935..634930638 100644 --- a/libasn1compiler/asn1c_C.h +++ b/libasn1compiler/asn1c_C.h @@ -7,9 +7,8 @@ int asn1c_lang_C_type_REFERENCE(arg_t *); int asn1c_lang_C_type_EXTENSIBLE(arg_t *); int asn1c_lang_C_type_SEQUENCE(arg_t *); -int asn1c_lang_C_type_SEQUENCE_OF(arg_t *); int asn1c_lang_C_type_SET(arg_t *); -int asn1c_lang_C_type_SET_OF(arg_t *); +int asn1c_lang_C_type_SEx_OF(arg_t *); /* SET OF or SEQUENCE OF */ int asn1c_lang_C_type_CHOICE(arg_t *); int asn1c_lang_C_type_INTEGER(arg_t *); @@ -24,11 +23,11 @@ static asn1_language_map_t asn1_lang_C[] __attribute__ ((unused)) = { * Constructed types */ { AMT_TYPE, ASN_CONSTR_SEQUENCE, asn1c_lang_C_type_SEQUENCE }, - { AMT_TYPE, ASN_CONSTR_SEQUENCE_OF, asn1c_lang_C_type_SEQUENCE_OF }, - { AMT_TYPEREF, ASN_CONSTR_SEQUENCE_OF, asn1c_lang_C_type_SEQUENCE_OF }, + { AMT_TYPE, ASN_CONSTR_SEQUENCE_OF, asn1c_lang_C_type_SEx_OF, }, + { AMT_TYPEREF, ASN_CONSTR_SEQUENCE_OF, asn1c_lang_C_type_SEx_OF }, { AMT_TYPE, ASN_CONSTR_SET, asn1c_lang_C_type_SET }, - { AMT_TYPE, ASN_CONSTR_SET_OF, asn1c_lang_C_type_SET_OF }, - { AMT_TYPEREF, ASN_CONSTR_SET_OF, asn1c_lang_C_type_SET_OF }, + { AMT_TYPE, ASN_CONSTR_SET_OF, asn1c_lang_C_type_SEx_OF }, + { AMT_TYPEREF, ASN_CONSTR_SET_OF, asn1c_lang_C_type_SEx_OF }, { AMT_TYPE, ASN_CONSTR_CHOICE, asn1c_lang_C_type_CHOICE }, /* * Basic types From b08de159c60ec64652587dba6ad17060b09512e1 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 22 Aug 2004 03:30:05 +0000 Subject: [PATCH 0190/1469] better support for underlying type git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@190 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_constraint.c | 17 +++-- tests/50-constraint-OK.asn1.-P | 106 ++++++++++++----------------- 2 files changed, 53 insertions(+), 70 deletions(-) diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index 9a37fd226..b7b7581f6 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -345,17 +345,20 @@ asn1c_emit_constraint_tables(arg_t *arg, int got_size) { static int emit_alphabet_check_loop(arg_t *arg, asn1cnst_range_t *range) { - asn1p_expr_type_e etype; asn1_integer_t natural_stop; + asn1p_expr_t *terminal; - etype = _find_terminal_type(arg); - - OUT("/* The underlying type is %s */\n", - ASN_EXPR_TYPE2STR(etype)); + terminal = asn1f_find_terminal_type_ex(arg->asn, arg->mod, arg->expr); + if(terminal) { + OUT("/* The underlying type is %s */\n", + ASN_EXPR_TYPE2STR(terminal->expr_type)); + } else { + terminal = arg->expr; + } OUT("const %s_t *st = sptr;\n", - asn1c_type_name(arg, arg->expr, TNF_SAFE)); + asn1c_type_name(arg, terminal, TNF_SAFE)); - switch(etype) { + switch(terminal->expr_type) { case ASN_STRING_UTF8String: OUT("const uint8_t *ch = st->buf;\n"); OUT("const uint8_t *end = ch + st->size;\n"); diff --git a/tests/50-constraint-OK.asn1.-P b/tests/50-constraint-OK.asn1.-P index 9bf780e19..38416dbe6 100644 --- a/tests/50-constraint-OK.asn1.-P +++ b/tests/50-constraint-OK.asn1.-P @@ -8,7 +8,6 @@ typedef INTEGER_t Int1_t; - /*** <<< FUNC-DECLS [Int1] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Int1; @@ -109,7 +108,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Int1 = { typedef Int1_t Int2_t; - /*** <<< FUNC-DECLS [Int2] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Int2; @@ -125,7 +123,7 @@ int Int2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const Int2_t *st = sptr; + const Int1_t *st = sptr; long value; if(!sptr) { @@ -229,7 +227,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Int2 = { typedef Int2_t Int3_t; - /*** <<< FUNC-DECLS [Int3] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Int3; @@ -245,7 +242,7 @@ int Int3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const Int3_t *st = sptr; + const Int2_t *st = sptr; long value; if(!sptr) { @@ -349,7 +346,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Int3 = { typedef Int3_t Int4_t; - /*** <<< FUNC-DECLS [Int4] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Int4; @@ -365,7 +361,7 @@ int Int4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const Int4_t *st = sptr; + const Int3_t *st = sptr; if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, @@ -463,7 +459,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Int4 = { typedef Int4_t Int5_t; - /*** <<< FUNC-DECLS [Int5] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Int5; @@ -479,7 +474,7 @@ int Int5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const Int5_t *st = sptr; + const Int4_t *st = sptr; long value; if(!sptr) { @@ -583,7 +578,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Int5 = { typedef INTEGER_t ExtensibleExtensions_t; - /*** <<< FUNC-DECLS [ExtensibleExtensions] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_ExtensibleExtensions; @@ -599,7 +593,7 @@ int ExtensibleExtensions_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const ExtensibleExtensions_t *st = sptr; + const INTEGER_t *st = sptr; if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, @@ -697,7 +691,6 @@ asn1_TYPE_descriptor_t asn1_DEF_ExtensibleExtensions = { typedef IA5String_t Str1_t; - /*** <<< FUNC-DECLS [Str1] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Str1; @@ -798,7 +791,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Str1 = { typedef Str1_t Str2_t; - /*** <<< FUNC-DECLS [Str2] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Str2; @@ -812,9 +804,9 @@ asn_struct_free_f Str2_free; static int check_permitted_alphabet_1(const void *sptr) { /* The underlying type is IA5String */ - const Str1_t *st = sptr; - uint8_t *ch = st->buf; - uint8_t *end = ch + st->size; + const IA5String_t *st = sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; for(; ch < end; ch++) { uint8_t cv = *ch; @@ -830,7 +822,7 @@ int Str2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const Str2_t *st = sptr; + const Str1_t *st = sptr; size_t size; if(!sptr) { @@ -931,7 +923,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Str2 = { typedef Str2_t Str3_t; - /*** <<< FUNC-DECLS [Str3] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Str3; @@ -956,9 +947,9 @@ static int permitted_alphabet_table_2[256] = { static int check_permitted_alphabet_2(const void *sptr) { int *table = permitted_alphabet_table_2; /* The underlying type is IA5String */ - const Str2_t *st = sptr; - uint8_t *ch = st->buf; - uint8_t *end = ch + st->size; + const IA5String_t *st = sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; for(; ch < end; ch++) { uint8_t cv = *ch; @@ -974,7 +965,7 @@ int Str3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const Str3_t *st = sptr; + const Str2_t *st = sptr; size_t size; if(!sptr) { @@ -1075,7 +1066,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Str3 = { typedef IA5String_t PER_Visible_t; - /*** <<< FUNC-DECLS [PER-Visible] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_PER_Visible; @@ -1090,8 +1080,8 @@ asn_struct_free_f PER_Visible_free; static int check_permitted_alphabet_3(const void *sptr) { /* The underlying type is IA5String */ const IA5String_t *st = sptr; - uint8_t *ch = st->buf; - uint8_t *end = ch + st->size; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; for(; ch < end; ch++) { uint8_t cv = *ch; @@ -1107,7 +1097,7 @@ int PER_Visible_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const PER_Visible_t *st = sptr; + const IA5String_t *st = sptr; if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, @@ -1205,7 +1195,6 @@ asn1_TYPE_descriptor_t asn1_DEF_PER_Visible = { typedef PER_Visible_t PER_Visible_2_t; - /*** <<< FUNC-DECLS [PER-Visible-2] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_PER_Visible_2; @@ -1219,9 +1208,9 @@ asn_struct_free_f PER_Visible_2_free; static int check_permitted_alphabet_4(const void *sptr) { /* The underlying type is IA5String */ - const PER_Visible_t *st = sptr; - uint8_t *ch = st->buf; - uint8_t *end = ch + st->size; + const IA5String_t *st = sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; for(; ch < end; ch++) { uint8_t cv = *ch; @@ -1237,7 +1226,7 @@ int PER_Visible_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const PER_Visible_2_t *st = sptr; + const PER_Visible_t *st = sptr; if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, @@ -1335,7 +1324,6 @@ asn1_TYPE_descriptor_t asn1_DEF_PER_Visible_2 = { typedef PER_Visible_t Not_PER_Visible_1_t; - /*** <<< FUNC-DECLS [Not-PER-Visible-1] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_1; @@ -1349,9 +1337,9 @@ asn_struct_free_f Not_PER_Visible_1_free; static int check_permitted_alphabet_5(const void *sptr) { /* The underlying type is IA5String */ - const PER_Visible_t *st = sptr; - uint8_t *ch = st->buf; - uint8_t *end = ch + st->size; + const IA5String_t *st = sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; for(; ch < end; ch++) { uint8_t cv = *ch; @@ -1367,7 +1355,7 @@ int Not_PER_Visible_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const Not_PER_Visible_1_t *st = sptr; + const PER_Visible_t *st = sptr; if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, @@ -1465,7 +1453,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_1 = { typedef PER_Visible_t Not_PER_Visible_2_t; - /*** <<< FUNC-DECLS [Not-PER-Visible-2] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_2; @@ -1481,7 +1468,7 @@ int Not_PER_Visible_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const Not_PER_Visible_2_t *st = sptr; + const PER_Visible_t *st = sptr; if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, @@ -1579,7 +1566,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_2 = { typedef PER_Visible_t Not_PER_Visible_3_t; - /*** <<< FUNC-DECLS [Not-PER-Visible-3] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_3; @@ -1595,7 +1581,7 @@ int Not_PER_Visible_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const Not_PER_Visible_3_t *st = sptr; + const PER_Visible_t *st = sptr; if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, @@ -1693,7 +1679,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_3 = { typedef PER_Visible_t SIZE_but_not_FROM_t; - /*** <<< FUNC-DECLS [SIZE-but-not-FROM] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_SIZE_but_not_FROM; @@ -1707,9 +1692,9 @@ asn_struct_free_f SIZE_but_not_FROM_free; static int check_permitted_alphabet_6(const void *sptr) { /* The underlying type is IA5String */ - const PER_Visible_t *st = sptr; - uint8_t *ch = st->buf; - uint8_t *end = ch + st->size; + const IA5String_t *st = sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; for(; ch < end; ch++) { uint8_t cv = *ch; @@ -1725,7 +1710,7 @@ int SIZE_but_not_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const SIZE_but_not_FROM_t *st = sptr; + const PER_Visible_t *st = sptr; size_t size; if(!sptr) { @@ -1826,7 +1811,6 @@ asn1_TYPE_descriptor_t asn1_DEF_SIZE_but_not_FROM = { typedef PER_Visible_t SIZE_and_FROM_t; - /*** <<< FUNC-DECLS [SIZE-and-FROM] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_SIZE_and_FROM; @@ -1840,9 +1824,9 @@ asn_struct_free_f SIZE_and_FROM_free; static int check_permitted_alphabet_7(const void *sptr) { /* The underlying type is IA5String */ - const PER_Visible_t *st = sptr; - uint8_t *ch = st->buf; - uint8_t *end = ch + st->size; + const IA5String_t *st = sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; for(; ch < end; ch++) { uint8_t cv = *ch; @@ -1858,7 +1842,7 @@ int SIZE_and_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const SIZE_and_FROM_t *st = sptr; + const PER_Visible_t *st = sptr; size_t size; if(!sptr) { @@ -1959,7 +1943,6 @@ asn1_TYPE_descriptor_t asn1_DEF_SIZE_and_FROM = { typedef PER_Visible_t Neither_SIZE_nor_FROM_t; - /*** <<< FUNC-DECLS [Neither-SIZE-nor-FROM] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Neither_SIZE_nor_FROM; @@ -1973,9 +1956,9 @@ asn_struct_free_f Neither_SIZE_nor_FROM_free; static int check_permitted_alphabet_8(const void *sptr) { /* The underlying type is IA5String */ - const PER_Visible_t *st = sptr; - uint8_t *ch = st->buf; - uint8_t *end = ch + st->size; + const IA5String_t *st = sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; for(; ch < end; ch++) { uint8_t cv = *ch; @@ -1991,7 +1974,7 @@ int Neither_SIZE_nor_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const Neither_SIZE_nor_FROM_t *st = sptr; + const PER_Visible_t *st = sptr; if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, @@ -2089,7 +2072,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Neither_SIZE_nor_FROM = { typedef Utf8_2_t Utf8_3_t; - /*** <<< FUNC-DECLS [Utf8-3] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Utf8_3; @@ -2115,9 +2097,9 @@ static int permitted_alphabet_table_9[128] = { static int check_permitted_alphabet_9(const void *sptr) { int *table = permitted_alphabet_table_9; /* The underlying type is UTF8String */ - const Utf8_2_t *st = sptr; - uint8_t *ch = st->buf; - uint8_t *end = ch + st->size; + const UTF8String_t *st = sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; for(; ch < end; ch++) { uint8_t cv = *ch; @@ -2134,7 +2116,7 @@ int Utf8_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const Utf8_3_t *st = sptr; + const Utf8_2_t *st = sptr; size_t size; if(!sptr) { @@ -2236,7 +2218,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Utf8_3 = { typedef Utf8_1_t Utf8_2_t; - /*** <<< FUNC-DECLS [Utf8-2] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Utf8_2; @@ -2252,7 +2233,7 @@ int Utf8_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const Utf8_2_t *st = sptr; + const Utf8_1_t *st = sptr; size_t size; if(!sptr) { @@ -2353,7 +2334,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Utf8_2 = { typedef UTF8String_t Utf8_1_t; - /*** <<< FUNC-DECLS [Utf8-1] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Utf8_1; From b3d2ea78d0914df47f631435730f41c7836e637c Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 22 Aug 2004 03:39:01 +0000 Subject: [PATCH 0191/1469] size added git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@191 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/32-sequence-of-OK.asn1 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/32-sequence-of-OK.asn1 b/tests/32-sequence-of-OK.asn1 index ced163af9..cd16118c8 100644 --- a/tests/32-sequence-of-OK.asn1 +++ b/tests/32-sequence-of-OK.asn1 @@ -11,7 +11,7 @@ ModuleTestSequenceSimple DEFINITIONS IMPLICIT TAGS ::= BEGIN - Programming ::= SEQUENCE OF Fault + Programming ::= SEQUENCE SIZE(1..maxSize) OF Fault Fault ::= SET OF Error @@ -19,4 +19,6 @@ BEGIN ... } + maxSize INTEGER ::= 10 + END From c6ccbc65415417a743c64f5a56fa00516097bb22 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 22 Aug 2004 12:20:19 +0000 Subject: [PATCH 0192/1469] removed debugging git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@192 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_CHOICE.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 3fbf194ac..1f863feb4 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -252,9 +252,6 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *td, /* * Invoke the member fetch routine according to member's type */ - printf("elm->name = %s\n", elm->name); - printf("elm->td = %p\n", elm->type); - printf("elm->td->name = %s\n", elm->type->name); rval = elm->type->ber_decoder(elm->type, memb_ptr2, ptr, LEFT, elm->tag_mode); From 22b03117e36852acf2b94bc1f67af3305a02d8b1 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 22 Aug 2004 12:37:35 +0000 Subject: [PATCH 0193/1469] oops git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@193 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_constraint.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index b7b7581f6..22b654319 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -168,7 +168,7 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { OUT(") {\n"); INDENT(+1); OUT("/* Constraint check succeeded */\n"); - OUT("return 1;\n"); + OUT("return 0;\n"); INDENT(-1); OUT("} else {\n"); INDENT(+1); From cdf661bebb700efbad44956ae584b644b2d408d4 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 22 Aug 2004 12:47:03 +0000 Subject: [PATCH 0194/1469] proper constraints return values git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@194 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_constraint.c | 18 ++++----- tests/19-param-OK.asn1.-P | 6 +-- tests/42-real-life-OK.asn1.-PR | 4 +- tests/50-constraint-OK.asn1.-P | 64 +++++++++++++++--------------- 4 files changed, 46 insertions(+), 46 deletions(-) diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index 22b654319..deeba8f73 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -322,7 +322,7 @@ asn1c_emit_constraint_tables(arg_t *arg, int got_size) { if(utf8_full_alphabet_check) { OUT("if(UTF8String_length((UTF8String_t *)sptr, td->name, \n"); OUT("\tapp_errlog, app_key) == -1)\n"); - OUT("\t\treturn 0; /* Alphabet (sic!) test failed. */\n"); + OUT("\t\treturn -1; /* Alphabet (sic!) test failed. */\n"); OUT("\n"); } else { if(use_table) { @@ -333,7 +333,7 @@ asn1c_emit_constraint_tables(arg_t *arg, int got_size) { emit_alphabet_check_loop(arg, range); } } - OUT("return 1;\n"); + OUT("return 0;\n"); INDENT(-1); OUT("}\n"); OUT("\n"); @@ -366,33 +366,33 @@ emit_alphabet_check_loop(arg_t *arg, asn1cnst_range_t *range) { OUT("for(; ch < end; ch++) {\n"); INDENT(+1); OUT("uint8_t cv = *ch;\n"); - if(!range) OUT("if(cv >= 0x80) return 0;\n"); + if(!range) OUT("if(cv >= 0x80) return -1;\n"); natural_stop = 0xffffffffUL; break; case ASN_STRING_UniversalString: OUT("const uint32_t *ch = st->buf;\n"); OUT("const uint32_t *end = ch + st->size;\n"); OUT("\n"); - OUT("if(st->size % 4) return 0; /* (size%4)! */\n"); + OUT("if(st->size % 4) return -1; /* (size%4)! */\n"); OUT("for(; ch < end; ch++) {\n"); INDENT(+1); OUT("uint32_t cv = (((const uint8_t *)ch)[0] << 24)\n"); OUT("\t\t| (((const uint8_t *)ch)[1] << 16)\n"); OUT("\t\t| (((const uint8_t *)ch)[2] << 8)\n"); OUT("\t\t| ((const uint8_t *)ch)[3];\n"); - if(!range) OUT("if(cv > 255) return 0;\n"); + if(!range) OUT("if(cv > 255) return -1;\n"); natural_stop = 0xffffffffUL; break; case ASN_STRING_BMPString: OUT("const uint16_t *ch = st->buf;\n"); OUT("const uint16_t *end = ch + st->size;\n"); OUT("\n"); - OUT("if(st->size % 2) return 0; /* (size%2)! */\n"); + OUT("if(st->size % 2) return -1; /* (size%2)! */\n"); OUT("for(; ch < end; ch++) {\n"); INDENT(+1); OUT("uint16_t cv = (((const uint8_t *)ch)[0] << 8)\n"); OUT("\t\t| ((const uint8_t *)ch)[1];\n"); - if(!range) OUT("if(cv > 255) return 0;\n"); + if(!range) OUT("if(cv > 255) return -1;\n"); natural_stop = 0xffff; break; case ASN_BASIC_OCTET_STRING: @@ -410,9 +410,9 @@ emit_alphabet_check_loop(arg_t *arg, asn1cnst_range_t *range) { if(range) { OUT("if(!("); emit_range_comparison_code(arg, range, "cv", 0, natural_stop); - OUT(")) return 0;\n"); + OUT(")) return -1;\n"); } else { - OUT("if(!table[cv]) return 0;\n"); + OUT("if(!table[cv]) return -1;\n"); } INDENT(-1); diff --git a/tests/19-param-OK.asn1.-P b/tests/19-param-OK.asn1.-P index 6d3b865fb..17066a284 100644 --- a/tests/19-param-OK.asn1.-P +++ b/tests/19-param-OK.asn1.-P @@ -246,9 +246,9 @@ static int check_permitted_alphabet_1(const void *sptr) { for(; ch < end; ch++) { uint8_t cv = *ch; - if(!table[cv]) return 0; + if(!table[cv]) return -1; } - return 1; + return 0; } @@ -268,7 +268,7 @@ memb_IA5String_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(check_permitted_alphabet_1(sptr)) { /* Constraint check succeeded */ - return 1; + return 0; } else { _ASN_ERRLOG(app_errlog, app_key, "%s: constraint failed", td->name); diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index aaa2e9f54..a934fff1b 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -52,7 +52,7 @@ memb_varsets_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if((size >= 1)) { /* Constraint check succeeded */ - return 1; + return 0; } else { _ASN_ERRLOG(app_errlog, app_key, "%s: constraint failed", td->name); @@ -359,7 +359,7 @@ memb_vset_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if((size >= 1)) { /* Constraint check succeeded */ - return 1; + return 0; } else { _ASN_ERRLOG(app_errlog, app_key, "%s: constraint failed", td->name); diff --git a/tests/50-constraint-OK.asn1.-P b/tests/50-constraint-OK.asn1.-P index 38416dbe6..6fca2aad2 100644 --- a/tests/50-constraint-OK.asn1.-P +++ b/tests/50-constraint-OK.asn1.-P @@ -140,7 +140,7 @@ Int2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if((value >= 0)) { /* Constraint check succeeded */ - return 1; + return 0; } else { _ASN_ERRLOG(app_errlog, app_key, "%s: constraint failed", td->name); @@ -259,7 +259,7 @@ Int3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if((value >= 0 && value <= 10)) { /* Constraint check succeeded */ - return 1; + return 0; } else { _ASN_ERRLOG(app_errlog, app_key, "%s: constraint failed", td->name); @@ -491,7 +491,7 @@ Int5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if((value == 5)) { /* Constraint check succeeded */ - return 1; + return 0; } else { _ASN_ERRLOG(app_errlog, app_key, "%s: constraint failed", td->name); @@ -810,9 +810,9 @@ static int check_permitted_alphabet_1(const void *sptr) { for(; ch < end; ch++) { uint8_t cv = *ch; - if(!(cv <= 127)) return 0; + if(!(cv <= 127)) return -1; } - return 1; + return 0; } @@ -836,7 +836,7 @@ Str2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(((size <= 20) || (size >= 25 && size <= 30)) && check_permitted_alphabet_1(sptr)) { /* Constraint check succeeded */ - return 1; + return 0; } else { _ASN_ERRLOG(app_errlog, app_key, "%s: constraint failed", td->name); @@ -953,9 +953,9 @@ static int check_permitted_alphabet_2(const void *sptr) { for(; ch < end; ch++) { uint8_t cv = *ch; - if(!table[cv]) return 0; + if(!table[cv]) return -1; } - return 1; + return 0; } @@ -979,7 +979,7 @@ Str3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(((size >= 10 && size <= 20) || (size >= 25 && size <= 27)) && check_permitted_alphabet_2(sptr)) { /* Constraint check succeeded */ - return 1; + return 0; } else { _ASN_ERRLOG(app_errlog, app_key, "%s: constraint failed", td->name); @@ -1085,9 +1085,9 @@ static int check_permitted_alphabet_3(const void *sptr) { for(; ch < end; ch++) { uint8_t cv = *ch; - if(!(cv >= 65 && cv <= 70)) return 0; + if(!(cv >= 65 && cv <= 70)) return -1; } - return 1; + return 0; } @@ -1108,7 +1108,7 @@ PER_Visible_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(check_permitted_alphabet_3(sptr)) { /* Constraint check succeeded */ - return 1; + return 0; } else { _ASN_ERRLOG(app_errlog, app_key, "%s: constraint failed", td->name); @@ -1214,9 +1214,9 @@ static int check_permitted_alphabet_4(const void *sptr) { for(; ch < end; ch++) { uint8_t cv = *ch; - if(!(cv >= 69 && cv <= 70)) return 0; + if(!(cv >= 69 && cv <= 70)) return -1; } - return 1; + return 0; } @@ -1237,7 +1237,7 @@ PER_Visible_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(check_permitted_alphabet_4(sptr)) { /* Constraint check succeeded */ - return 1; + return 0; } else { _ASN_ERRLOG(app_errlog, app_key, "%s: constraint failed", td->name); @@ -1343,9 +1343,9 @@ static int check_permitted_alphabet_5(const void *sptr) { for(; ch < end; ch++) { uint8_t cv = *ch; - if(!(cv >= 65 && cv <= 70)) return 0; + if(!(cv >= 65 && cv <= 70)) return -1; } - return 1; + return 0; } @@ -1366,7 +1366,7 @@ Not_PER_Visible_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(check_permitted_alphabet_5(sptr)) { /* Constraint check succeeded */ - return 1; + return 0; } else { _ASN_ERRLOG(app_errlog, app_key, "%s: constraint failed", td->name); @@ -1698,9 +1698,9 @@ static int check_permitted_alphabet_6(const void *sptr) { for(; ch < end; ch++) { uint8_t cv = *ch; - if(!(cv >= 65 && cv <= 70)) return 0; + if(!(cv >= 65 && cv <= 70)) return -1; } - return 1; + return 0; } @@ -1724,7 +1724,7 @@ SIZE_but_not_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if((size >= 1 && size <= 4) && check_permitted_alphabet_6(sptr)) { /* Constraint check succeeded */ - return 1; + return 0; } else { _ASN_ERRLOG(app_errlog, app_key, "%s: constraint failed", td->name); @@ -1830,9 +1830,9 @@ static int check_permitted_alphabet_7(const void *sptr) { for(; ch < end; ch++) { uint8_t cv = *ch; - if(!(cv >= 65 && cv <= 68)) return 0; + if(!(cv >= 65 && cv <= 68)) return -1; } - return 1; + return 0; } @@ -1856,7 +1856,7 @@ SIZE_and_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if((size >= 1 && size <= 4) && check_permitted_alphabet_7(sptr)) { /* Constraint check succeeded */ - return 1; + return 0; } else { _ASN_ERRLOG(app_errlog, app_key, "%s: constraint failed", td->name); @@ -1962,9 +1962,9 @@ static int check_permitted_alphabet_8(const void *sptr) { for(; ch < end; ch++) { uint8_t cv = *ch; - if(!(cv >= 65 && cv <= 70)) return 0; + if(!(cv >= 65 && cv <= 70)) return -1; } - return 1; + return 0; } @@ -1985,7 +1985,7 @@ Neither_SIZE_nor_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(check_permitted_alphabet_8(sptr)) { /* Constraint check succeeded */ - return 1; + return 0; } else { _ASN_ERRLOG(app_errlog, app_key, "%s: constraint failed", td->name); @@ -2103,10 +2103,10 @@ static int check_permitted_alphabet_9(const void *sptr) { for(; ch < end; ch++) { uint8_t cv = *ch; - if(cv >= 0x80) return 0; - if(!table[cv]) return 0; + if(cv >= 0x80) return -1; + if(!table[cv]) return -1; } - return 1; + return 0; } @@ -2131,7 +2131,7 @@ Utf8_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if((size >= 1 && size <= 2) && check_permitted_alphabet_9(sptr)) { /* Constraint check succeeded */ - return 1; + return 0; } else { _ASN_ERRLOG(app_errlog, app_key, "%s: constraint failed", td->name); @@ -2247,7 +2247,7 @@ Utf8_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if((size >= 1 && size <= 2)) { /* Constraint check succeeded */ - return 1; + return 0; } else { _ASN_ERRLOG(app_errlog, app_key, "%s: constraint failed", td->name); From 7e20dfc61cc750e4d995eee4e427d0d4b478401e Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 22 Aug 2004 13:11:40 +0000 Subject: [PATCH 0195/1469] useful negation... git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@195 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_constraint.c | 2 +- tests/19-param-OK.asn1.-P | 2 +- tests/50-constraint-OK.asn1.-P | 18 +++++++++--------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index deeba8f73..dcbd50b3d 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -152,7 +152,7 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { } if(ct->_compile_mark) { if(got_something++) { OUT("\n"); OUT(" && "); } - OUT("check_permitted_alphabet_%d(sptr)", + OUT("!check_permitted_alphabet_%d(sptr)", ct->_compile_mark); } if(!got_something) { diff --git a/tests/19-param-OK.asn1.-P b/tests/19-param-OK.asn1.-P index 17066a284..b98d1ed9a 100644 --- a/tests/19-param-OK.asn1.-P +++ b/tests/19-param-OK.asn1.-P @@ -266,7 +266,7 @@ memb_IA5String_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } - if(check_permitted_alphabet_1(sptr)) { + if(!check_permitted_alphabet_1(sptr)) { /* Constraint check succeeded */ return 0; } else { diff --git a/tests/50-constraint-OK.asn1.-P b/tests/50-constraint-OK.asn1.-P index 6fca2aad2..757b1d667 100644 --- a/tests/50-constraint-OK.asn1.-P +++ b/tests/50-constraint-OK.asn1.-P @@ -834,7 +834,7 @@ Str2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, size = st->size; if(((size <= 20) || (size >= 25 && size <= 30)) - && check_permitted_alphabet_1(sptr)) { + && !check_permitted_alphabet_1(sptr)) { /* Constraint check succeeded */ return 0; } else { @@ -977,7 +977,7 @@ Str3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, size = st->size; if(((size >= 10 && size <= 20) || (size >= 25 && size <= 27)) - && check_permitted_alphabet_2(sptr)) { + && !check_permitted_alphabet_2(sptr)) { /* Constraint check succeeded */ return 0; } else { @@ -1106,7 +1106,7 @@ PER_Visible_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } - if(check_permitted_alphabet_3(sptr)) { + if(!check_permitted_alphabet_3(sptr)) { /* Constraint check succeeded */ return 0; } else { @@ -1235,7 +1235,7 @@ PER_Visible_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } - if(check_permitted_alphabet_4(sptr)) { + if(!check_permitted_alphabet_4(sptr)) { /* Constraint check succeeded */ return 0; } else { @@ -1364,7 +1364,7 @@ Not_PER_Visible_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } - if(check_permitted_alphabet_5(sptr)) { + if(!check_permitted_alphabet_5(sptr)) { /* Constraint check succeeded */ return 0; } else { @@ -1722,7 +1722,7 @@ SIZE_but_not_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, size = st->size; if((size >= 1 && size <= 4) - && check_permitted_alphabet_6(sptr)) { + && !check_permitted_alphabet_6(sptr)) { /* Constraint check succeeded */ return 0; } else { @@ -1854,7 +1854,7 @@ SIZE_and_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, size = st->size; if((size >= 1 && size <= 4) - && check_permitted_alphabet_7(sptr)) { + && !check_permitted_alphabet_7(sptr)) { /* Constraint check succeeded */ return 0; } else { @@ -1983,7 +1983,7 @@ Neither_SIZE_nor_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } - if(check_permitted_alphabet_8(sptr)) { + if(!check_permitted_alphabet_8(sptr)) { /* Constraint check succeeded */ return 0; } else { @@ -2129,7 +2129,7 @@ Utf8_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(size == (size_t)-1) return -1; if((size >= 1 && size <= 2) - && check_permitted_alphabet_9(sptr)) { + && !check_permitted_alphabet_9(sptr)) { /* Constraint check succeeded */ return 0; } else { From 758530a066ccc6414b36b7606ebac85c00d3c04c Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 22 Aug 2004 13:47:59 +0000 Subject: [PATCH 0196/1469] better constraint failure reporting git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@196 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 1 + libasn1compiler/asn1c_constraint.c | 9 ++- skeletons/BIT_STRING.c | 10 +-- skeletons/GeneralizedTime.c | 4 +- skeletons/IA5String.c | 9 +-- skeletons/NumericString.c | 11 ++-- skeletons/OBJECT_IDENTIFIER.c | 8 ++- skeletons/PrintableString.c | 10 +-- skeletons/UTCTime.c | 4 +- skeletons/UTF8String.c | 14 +++-- skeletons/VisibleString.c | 11 ++-- skeletons/constr_CHOICE.c | 6 +- skeletons/constr_SEQUENCE.c | 3 +- skeletons/constr_SET.c | 8 ++- skeletons/constr_SET_OF.c | 3 +- tests/19-param-OK.asn1.-P | 6 +- tests/42-real-life-OK.asn1.-PR | 15 +++-- tests/50-constraint-OK.asn1.-P | 99 ++++++++++++++++++++---------- 18 files changed, 146 insertions(+), 85 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6c7e05a3b..0292a9994 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7,6 +7,7 @@ * -t option added to asn1c to ease manual BER/CER/DER decoding. * Added support COMPONENTS OF construct. * Numerous parser fixes and enhancements. + * Better constraint failure reporting. 0.8.19: 2004-Aug-18 diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index dcbd50b3d..36b277586 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -109,7 +109,8 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { OUT("if(!sptr) {\n"); INDENT(+1); OUT("_ASN_ERRLOG(app_errlog, app_key,\n"); - OUT("\t\"%%s: value not given\", td->name);\n"); + OUT("\t\"%%s: value not given (%%s:%%d)\",\n"); + OUT("\ttd->name, __FILE__, __LINE__);\n"); OUT("return -1;\n"); INDENT(-1); OUT("}\n"); @@ -173,7 +174,8 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { OUT("} else {\n"); INDENT(+1); OUT("_ASN_ERRLOG(app_errlog, app_key,\n"); - OUT("\t\"%%s: constraint failed\", td->name);\n"); + OUT("\t\"%%s: constraint failed (%%s:%%d)\",\n"); + OUT("\ttd->name, __FILE__, __LINE__);\n"); OUT("return -1;\n"); INDENT(-1); OUT("}\n"); @@ -542,7 +544,8 @@ emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype) { OUT("if(asn1_INTEGER2long(st, &value)) {\n"); INDENT(+1); OUT("_ASN_ERRLOG(app_errlog, app_key,\n"); - OUT("\t\"%%s: value too large\", td->name);\n"); + OUT("\t\"%%s: value too large (%%s:%%d)\",\n"); + OUT("\ttd->name, __FILE__, __LINE__);\n"); OUT("return -1;\n"); INDENT(-1); OUT("}\n"); diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index df11c19cf..bca34732d 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -39,18 +39,20 @@ BIT_STRING_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(st->size) { if(st->size == 1 && st->buf[0] != 0) { _ASN_ERRLOG(app_errlog, app_key, - "%s: invalid padding byte", - td->name); + "%s: invalid padding byte (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: no padding byte", td->name); + "%s: no padding byte (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 25f2bb6e3..1da113b01 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -107,8 +107,8 @@ GeneralizedTime_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, tloc = asn_GT2time(st, 0, 0); if(tloc == -1 && errno != EPERM) { _ASN_ERRLOG(app_errlog, app_key, - "%s: Invalid time format: %s", - td->name, strerror(errno)); + "%s: Invalid time format: %s (%s:%d)", + td->name, strerror(errno), __FILE__, __LINE__); return -1; } diff --git a/skeletons/IA5String.c b/skeletons/IA5String.c index a44a9d0f8..e3ae82fe2 100644 --- a/skeletons/IA5String.c +++ b/skeletons/IA5String.c @@ -43,17 +43,18 @@ IA5String_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(*buf > 0x7F) { _ASN_ERRLOG(app_errlog, app_key, "%s: value byte %d out of range: " - "%d > 127", + "%d > 127 (%s:%d)", td->name, (buf - st->buf) + 1, - *buf - ); + *buf, + __FILE__, __LINE__); return -1; } } } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } diff --git a/skeletons/NumericString.c b/skeletons/NumericString.c index 6c8729ff8..aba1c72b8 100644 --- a/skeletons/NumericString.c +++ b/skeletons/NumericString.c @@ -48,17 +48,18 @@ NumericString_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, continue; } _ASN_ERRLOG(app_errlog, app_key, - "%s: value byte %d " - "not in NumericString alphabet (%d)", + "%s: value byte %d (%d) " + "not in NumericString alphabet (%s:%d)", td->name, (buf - st->buf) + 1, - *buf - ); + *buf, + __FILE__, __LINE__); return -1; } } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index 063ae978e..46191bc64 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -81,13 +81,15 @@ OBJECT_IDENTIFIER_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(st && st->buf) { if(st->size < 1) { _ASN_ERRLOG(app_errlog, app_key, - "%s: at least one numerical value expected", - td->name); + "%s: at least one numerical value " + "expected (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } diff --git a/skeletons/PrintableString.c b/skeletons/PrintableString.c index 8f67eddf4..17be2aed8 100644 --- a/skeletons/PrintableString.c +++ b/skeletons/PrintableString.c @@ -66,18 +66,20 @@ PrintableString_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, for(; buf < end; buf++) { if(!_PrintableString_alphabet[*buf]) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value byte %d " - "not in PrintableString alphabet (%d)", + "%s: value byte %d (%d) " + "not in PrintableString alphabet " + "(%s:%d)", td->name, (buf - st->buf) + 1, *buf - ); + __FILE__, __LINE__); return -1; } } } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c index 8b7972c01..b2ca1a66f 100644 --- a/skeletons/UTCTime.c +++ b/skeletons/UTCTime.c @@ -48,8 +48,8 @@ UTCTime_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, tloc = asn_UT2time(st, 0, 0); if(tloc == -1 && errno != EPERM) { _ASN_ERRLOG(app_errlog, app_key, - "%s: Invalid time format: %s", - td->name, strerror(errno)); + "%s: Invalid time format: %s (%s:%d)", + td->name, strerror(errno), __FILE__, __LINE__); return -1; } diff --git a/skeletons/UTF8String.c b/skeletons/UTF8String.c index aab4a2e95..c96c71a4e 100644 --- a/skeletons/UTF8String.c +++ b/skeletons/UTF8String.c @@ -63,9 +63,10 @@ UTF8String_length(const UTF8String_t *st, const char *opt_type_name, if(w) { _ASN_ERRLOG(app_errlog, app_key, "%s: UTF-8 expectation " - "failed at byte %d", + "failed at byte %d (%s:%d)", opt_type_name, - (buf - st->buf) + 1); + (buf - st->buf) + 1, + __FILE__, __LINE__); return -1; } want--; @@ -79,9 +80,10 @@ UTF8String_length(const UTF8String_t *st, const char *opt_type_name, case 0: _ASN_ERRLOG(app_errlog, app_key, "%s: UTF-8 expectation" - "failed at byte %d", + "failed at byte %d (%s:%d)", opt_type_name, - (buf - st->buf) + 1); + (buf - st->buf) + 1, + __FILE__, __LINE__); return -1; } want = w - 1; /* Expect this much */ @@ -92,8 +94,8 @@ UTF8String_length(const UTF8String_t *st, const char *opt_type_name, /* If still want something, then something is wrong */ if(want) { _ASN_ERRLOG(app_errlog, app_key, - "%s: truncated UTF-8 sequence", - opt_type_name); + "%s: truncated UTF-8 sequence (%s:%d)", + opt_type_name, __FILE__, __LINE__); return -1; } diff --git a/skeletons/VisibleString.c b/skeletons/VisibleString.c index aa9c99b18..d1a11dbef 100644 --- a/skeletons/VisibleString.c +++ b/skeletons/VisibleString.c @@ -66,18 +66,19 @@ VisibleString_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, for(; buf < end; buf++) { if(!_VisibleString_alphabet[*buf]) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value byte %d " - "not in VisibleString alphabet (%d)", + "%s: value byte %d (%d) " + "not in VisibleString alphabet (%s:%d)", td->name, (buf - st->buf) + 1, - *buf - ); + *buf, + __FILE__, __LINE__); return -1; } } } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 1f863feb4..4ac71a64e 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -481,7 +481,8 @@ CHOICE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -515,7 +516,8 @@ CHOICE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: no CHOICE element given", td->name); + "%s: no CHOICE element given", + td->name, __FILE__, __LINE__); return -1; } } diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 06ef4e83c..87d5ab660 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -644,7 +644,8 @@ SEQUENCE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index d1a81beba..ba42a4ffa 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -659,7 +659,8 @@ SET_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -677,8 +678,9 @@ SET_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, &(specs->_mandatory_elements), edx)) { _ASN_ERRLOG(app_errlog, app_key, "%s: mandatory element " - "%s absent", - td->name, elm->name); + "%s absent (%s:%d)", + td->name, elm->name, + __FILE__, __LINE__); return -1; } continue; diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index ecf16f02f..e0c898da7 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -518,7 +518,8 @@ SET_OF_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } diff --git a/tests/19-param-OK.asn1.-P b/tests/19-param-OK.asn1.-P index b98d1ed9a..c40c439cc 100644 --- a/tests/19-param-OK.asn1.-P +++ b/tests/19-param-OK.asn1.-P @@ -261,7 +261,8 @@ memb_IA5String_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -271,7 +272,8 @@ memb_IA5String_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: constraint failed", td->name); + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } } diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index a934fff1b..ad954aa04 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -40,7 +40,8 @@ memb_varsets_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -55,7 +56,8 @@ memb_varsets_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: constraint failed", td->name); + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } } @@ -187,7 +189,8 @@ memb_vparts_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -347,7 +350,8 @@ memb_vset_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -362,7 +366,8 @@ memb_vset_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: constraint failed", td->name); + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } } diff --git a/tests/50-constraint-OK.asn1.-P b/tests/50-constraint-OK.asn1.-P index 757b1d667..059f64e36 100644 --- a/tests/50-constraint-OK.asn1.-P +++ b/tests/50-constraint-OK.asn1.-P @@ -128,13 +128,15 @@ Int2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } if(asn1_INTEGER2long(st, &value)) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value too large", td->name); + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -143,7 +145,8 @@ Int2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: constraint failed", td->name); + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } } @@ -247,13 +250,15 @@ Int3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } if(asn1_INTEGER2long(st, &value)) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value too large", td->name); + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -262,7 +267,8 @@ Int3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: constraint failed", td->name); + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } } @@ -365,7 +371,8 @@ Int4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -479,13 +486,15 @@ Int5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } if(asn1_INTEGER2long(st, &value)) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value too large", td->name); + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -494,7 +503,8 @@ Int5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: constraint failed", td->name); + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } } @@ -597,7 +607,8 @@ ExtensibleExtensions_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -827,7 +838,8 @@ Str2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -839,7 +851,8 @@ Str2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: constraint failed", td->name); + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } } @@ -970,7 +983,8 @@ Str3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -982,7 +996,8 @@ Str3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: constraint failed", td->name); + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } } @@ -1101,7 +1116,8 @@ PER_Visible_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -1111,7 +1127,8 @@ PER_Visible_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: constraint failed", td->name); + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } } @@ -1230,7 +1247,8 @@ PER_Visible_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -1240,7 +1258,8 @@ PER_Visible_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: constraint failed", td->name); + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } } @@ -1359,7 +1378,8 @@ Not_PER_Visible_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -1369,7 +1389,8 @@ Not_PER_Visible_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: constraint failed", td->name); + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } } @@ -1472,7 +1493,8 @@ Not_PER_Visible_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -1585,7 +1607,8 @@ Not_PER_Visible_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -1715,7 +1738,8 @@ SIZE_but_not_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -1727,7 +1751,8 @@ SIZE_but_not_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: constraint failed", td->name); + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } } @@ -1847,7 +1872,8 @@ SIZE_and_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -1859,7 +1885,8 @@ SIZE_and_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: constraint failed", td->name); + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } } @@ -1978,7 +2005,8 @@ Neither_SIZE_nor_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -1988,7 +2016,8 @@ Neither_SIZE_nor_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: constraint failed", td->name); + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } } @@ -2121,7 +2150,8 @@ Utf8_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -2134,7 +2164,8 @@ Utf8_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: constraint failed", td->name); + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } } @@ -2238,7 +2269,8 @@ Utf8_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", td->name); + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } @@ -2250,7 +2282,8 @@ Utf8_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: constraint failed", td->name); + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); return -1; } } From 63a2ec9e0d3b15130d815399be18187afc631b33 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 22 Aug 2004 13:55:49 +0000 Subject: [PATCH 0197/1469] fixed format git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@197 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_CHOICE.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 4ac71a64e..140e365d9 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -516,7 +516,7 @@ CHOICE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } } else { _ASN_ERRLOG(app_errlog, app_key, - "%s: no CHOICE element given", + "%s: no CHOICE element given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } From 3f84c5dd85191b91627bcfbd5ac804fbe62c0f46 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 23 Aug 2004 08:34:14 +0000 Subject: [PATCH 0198/1469] comma missing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@198 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/PrintableString.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/PrintableString.c b/skeletons/PrintableString.c index 17be2aed8..22d2fbce6 100644 --- a/skeletons/PrintableString.c +++ b/skeletons/PrintableString.c @@ -71,7 +71,7 @@ PrintableString_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, "(%s:%d)", td->name, (buf - st->buf) + 1, - *buf + *buf, __FILE__, __LINE__); return -1; } From 3fff06b8762950e19f544e5d7ee67423ec9f462a Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 23 Aug 2004 09:23:02 +0000 Subject: [PATCH 0199/1469] printing zeroes in arcs git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@199 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OBJECT_IDENTIFIER.c | 15 ++++++++++----- skeletons/tests/check-OIDs.c | 11 +++++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index 46191bc64..4e6270dba 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -225,12 +225,17 @@ OBJECT_IDENTIFIER_print_arc(uint8_t *arcbuf, int arclen, int add, &accum, sizeof(accum))) return -1; - /* Fill the scratch buffer in reverse. */ - p = scratch + sizeof(scratch); - for(; accum; accum /= 10) - *(--p) = (char)(accum % 10) + 0x30; + if(accum) { + /* Fill the scratch buffer in reverse. */ + p = scratch + sizeof(scratch); + for(; accum; accum /= 10) + *(--p) = (char)(accum % 10) + 0x30; - return cb(p, sizeof(scratch) - (p - scratch), app_key); + return cb(p, sizeof(scratch) - (p - scratch), app_key); + } else { + *scratch = 0x30; + return cb(scratch, 1, app_key); + } } int diff --git a/skeletons/tests/check-OIDs.c b/skeletons/tests/check-OIDs.c index 496125083..b99208519 100644 --- a/skeletons/tests/check-OIDs.c +++ b/skeletons/tests/check-OIDs.c @@ -291,12 +291,21 @@ main() { }; int buf19_check[] = { 2, 2, 1, 1 }; + /* { joint-iso-itu-t 2 1 0 1 } */ + uint8_t buf20[] = { + 0x06, /* OBJECT IDENTIFIER */ + 0x04, /* Length */ + 0x52, 0x01, 0x00, 0x01 + }; + int buf20_check[] = { 2, 2, 1, 0, 1 }; + CHECK_OID(1); /* buf1, buf1_check */ CHECK_ROID(2); /* buf2, buf2_check */ CHECK_OID(3); /* buf3, buf3_check */ CHECK_OID(4); /* buf4, buf4_check */ CHECK_OID(19); /* buf19, buf19_check */ + CHECK_OID(20); /* buf20, buf20_check */ CHECK_REGEN(5); /* Regenerate RELATIVE-OID */ CHECK_REGEN(6); @@ -320,6 +329,8 @@ main() { CHECK_REGEN_OID(16); CHECK_REGEN_OID(17); CHECK_REGEN_OID(18); + CHECK_REGEN_OID(19); + CHECK_REGEN_OID(20); for(i = 0; i < 100000; i++) { int bufA_check[3] = { 2, i, rand() }; From 8262070abfc7d533d2fbc853c34dfb9af4839d28 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 23 Aug 2004 09:24:40 +0000 Subject: [PATCH 0200/1469] date git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@200 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 0292a9994..35347bdb8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9: 2004-Aug-21 +0.9: 2004-Aug-23 * Reworked subtype constraints handling, aiming at PER-applicability. * BOOLEAN and NULL are now implemented in terms of native int type. From f23d228680f8a9f18d61fec7de991d924bb1c3e2 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 23 Aug 2004 10:30:53 +0000 Subject: [PATCH 0201/1469] canonical_system replaced git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@201 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/configure.in b/configure.in index 9f74993ca..5c6b99404 100644 --- a/configure.in +++ b/configure.in @@ -1,6 +1,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(libasn1parser/asn1p_y.y) -AC_CANONICAL_SYSTEM +AC_CANONICAL_BUILD +AC_CANONICAL_TARGET AC_PREREQ(2.53) AM_INIT_AUTOMAKE(asn1c, 0.9) From cc0c52b5e121a3e40bdd42cb8b0d836a43a48865 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 23 Aug 2004 10:40:21 +0000 Subject: [PATCH 0202/1469] windows -DWIN32 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@202 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure.in | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/configure.in b/configure.in index 5c6b99404..f2082bac0 100644 --- a/configure.in +++ b/configure.in @@ -38,12 +38,17 @@ AC_PROG_YACC AM_PROG_LEX dnl *** Building mingw32 with cygwin compiler *** -case "$build" in -*cygwin*) - case "$target" in - *mingw*) - CC="$CC -mno-cygwin" - esac ;; +case "$host_os" in +cygwin*) + CFLAGS="$CFLAGS -DWIN32" + case "$target" in + *mingw*) + CC="$CC -mno-cygwin" + esac + ;; +mingw* | p32*) + CFLAGS="$CFLAGS -DWIN32" + ;; esac AC_ARG_ENABLE(autoconf, From dda60c4d4e4951f986e74ac204291efafc7c7fe0 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 23 Aug 2004 10:41:38 +0000 Subject: [PATCH 0203/1469] reconfigured git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@203 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/configure b/configure index 3b3c8233a..99f212cf1 100755 --- a/configure +++ b/configure @@ -21392,12 +21392,17 @@ if test "$LEX" = :; then LEX=${am_missing_run}flex fi -case "$build" in -*cygwin*) - case "$target" in - *mingw*) - CC="$CC -mno-cygwin" - esac ;; +case "$host_os" in +cygwin*) + CFLAGS="$CFLAGS -DWIN32" + case "$target" in + *mingw*) + CC="$CC -mno-cygwin" + esac + ;; +mingw* | p32*) + CFLAGS="$CFLAGS -DWIN32" + ;; esac # Check whether --enable-autoconf or --disable-autoconf was given. From fcec8e589e281463d33d9917bd7f441e3cc9fe1a Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 23 Aug 2004 15:12:04 +0000 Subject: [PATCH 0204/1469] version 0.9 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@204 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-usage.html | 526 +++++++++++++++++------------- doc/asn1c-usage.lyx | 751 +++++++++++++++++++++++++++++++++++++++---- doc/asn1c-usage.pdf | Bin 188026 -> 58284 bytes 3 files changed, 1005 insertions(+), 272 deletions(-) diff --git a/doc/asn1c-usage.html b/doc/asn1c-usage.html index 8aeafae17..d7b22b0f3 100644 --- a/doc/asn1c-usage.html +++ b/doc/asn1c-usage.html @@ -1,4 +1,3 @@ -

+

+

ASN.1 Basics

@@ -157,15 +170,13 @@

-

-
+
 Rectangle ::= SEQUENCE {
     height  INTEGER,
     width   INTEGER
 }
-
 
-
+ This ASN.1 specification describes a constructed type, Rectangle, containing two integer fields. This specification may tell the reader that there is this kind of data structure and that some entity may @@ -183,28 +194,27 @@

-

-
+
 UsageExampleModule1
     { iso org(3) dod(6) internet(1) private(4)
       enterprise(1) spelio(9363) software(1)
       asn1c(5) docs(2) usage(1) 1 } 
-    AUTOMATIC TAGS DEFINITIONS ::=
+    DEFINITIONS AUTOMATIC TAGS ::=
 BEGIN
  
 -- This is a comment which describes nothing.
 Rectangle ::= SEQUENCE {
     height  INTEGER,        -- Height of the rectangle
-    width   INTEGER,        -- Width of the rectangle
+    width   INTEGER         -- Width of the rectangle
 }
  
 END
-
 
-
+ The module header consists of module name (UsageExampleModule1), the -module object identifier ({...}), some flags (AUTOMATIC TAGS) and -''DEFINITIONS ::= BEGIN''. The module ends with an ''END'' statement. +module object identifier ({...}), a keyword ''DEFINITIONS'', a +set of module flags (AUTOMATIC TAGS) and ''::= BEGIN''. The module +ends with an ''END'' statement.

@@ -235,16 +245,16 @@

-

-
+
 SimpleInteger ::= INTEGER
+ 
 -- An integer with a very limited range
 SmallInt ::= INTEGER (0..127)
+ 
 -- Integer, negative
 NegativeInt ::= INTEGER (MIN..0)
-
 
-
+

@@ -258,11 +268,11 @@

-

-
+
 FruitId ::= ENUMERATED { apple(1), orange(2) }
+ 
 -- The numbers in braces are optional,
--- the enumeration may be performed
+-- the enumeration can be performed
 -- automatically by the compiler
 ComputerOSType ::= ENUMERATED {
     FreeBSD,          -- will be 0
@@ -271,9 +281,8 @@ 

    Linux,            -- will be 6     MacOS             -- will be 7 } -

-
+

@@ -305,18 +314,18 @@

-

-
+
 ExampleOID ::= OBJECT IDENTIFIER
+ 
 usageExampleModule1-oid ExampleOID
   ::= { 1 3 6 1 4 1 9363 1 5 2 1 1 }
+ 
 -- An identifier of the Internet.
 internet-id OBJECT IDENTIFIER
   ::= { iso(1) identified-organization(3)
         dod(6) internet(1) }
-
 
-
+ As you see, names are optional.

@@ -333,14 +342,13 @@

-

-
+
 this-document RELATIVE-OID ::= { docs(2) usage(1) }
+ 
 this-example RELATIVE-OID ::= {
     this-document assorted-examples(0) this-example(1) }
-
 
-
+

@@ -356,7 +364,7 @@

This is essentially the ASCII, with 128 character codes available -(7 lower bits of 8-bit byte). +(7 lower bits of an 8-bit byte).

@@ -400,15 +408,15 @@

The character string with the alphabet which is more or less a subset -of ASCII between space and ''~'' (tilde). Alternatively, -the alphabet may be represented as the PrintableString alphabet described -earlier, plus the following characters: ''!'', '''''', -''#'', ''$'', ''%'', ''&'', -''*'', '';'', ''<'', ''>'', -''['', ''\'', '']'', -''^'', ''_'', ''`'' -(single left quote), ''{'', ''|'', ''}'', -''~''. +of ASCII between space and ''~'' (tilde). +Alternatively, the alphabet may be described as the PrintableString +alphabet presented earlier, plus the following characters: ''!'', +'''''', ''#'', ''$'', ''%'', +''&'', ''*'', '';'', ''<'', +''>'', ''['', ''\'', +'']'', ''^'', ''_'', +''`'' (single left quote), ''{'', ''|'', +''}'', ''~''.

@@ -428,8 +436,7 @@

-

-
+
 Address ::= SEQUENCE {
     -- The apartment number may be omitted
     apartmentNumber     NumericString OPTIONAL,
@@ -439,9 +446,8 @@ 

    -- This one may be omitted too     zipNo                NumericString OPTIONAL } -

-
+

@@ -473,15 +479,13 @@

-

-
+
 ResponseCode ::= CHOICE {
     intCode    INTEGER,
     boolCode   BOOLEAN
 }
-
 
-
+

@@ -494,20 +498,20 @@

-

-
+
 -- Example 1
 ManyIntegers ::= SEQUENCE OF INTEGER
+ 
 -- Example 2
 ManyRectangles ::= SEQUENCE OF Rectangle
+ 
 -- More complex example:
 -- an array of structures defined in place.
 ManyCircles ::= SEQUENCE OF SEQUENCE {
                             radius INTEGER
                             }
-
 
-
+

@@ -523,15 +527,14 @@

-

-
+
 -- A set of structures defined elsewhere
 SetOfApples :: SET OF Apple
+ 
 -- Set of integers encoding the kind of a fruit
 FruitBag ::= SET OF ENUMERATED { apple, orange }
-
 
-
+

@@ -549,92 +552,198 @@

The purpose of the ASN.1 compiler, of which this document is part, is to convert the ASN.1 specifications to some other target language (currently, only C is supported2.1). The compiler reads the specification and emits a series of target + HREF="#foot144">2.1). The compiler reads the specification and emits a series of target language structures and surrounding maintenance code. For example, the C structure which may be created by compiler to represent the simple Rectangle specification defined earlier in this document, may look like this2.2: + HREF="#foot379">2.2:

-

-
+
 typedef struct Rectangle_s {
     int height;
     int width;
 } Rectangle_t;
-
 
-
+ This would not be of much value for such a simple specification, so the compiler goes further and actually produces the code which fills -in this structure by parsing the binary2.3 data provided in some buffer. It also produces the code that takes +in this structure by parsing the opaque binary2.3 data provided in some buffer. It also produces the code that takes this structure as an argument and performs structure serialization by emitting a series of bytes.

-

+

Quick start

-After building and installing the compiler, the asn1c command may -be used to compile the ASN.1 specification2.4: +After building and installing the compiler, the asn1c3.1 command may be used to compile the ASN.1 specification3.2:

-

-
+
 asn1c <spec.asn1>
-
 
-
-If several specifications contain interdependencies, all of them must -be specified: + +If several specifications contain interdependencies, all of the files +must be specified altogether:

-

-
+
 asn1c <spec1.asn1> <spec2.asn1> ...
-
 
-
-The compiler -E and -EF options are used for testing the parser and -the semantic fixer, respectively. These options will instruct the -compiler to dump out the parsed (and fixed) ASN.1 specification as -it was "understood" by the compiler. It might might -be useful to check whether a particular syntactic construction is -properly supported by the compiler. + +The compiler -E and -EF options are used for testing +the parser and the semantic fixer, respectively. These options will +instruct the compiler to dump out the parsed (and fixed, if -F +is involved) ASN.1 specification as it was "understood" +by the compiler. It might be useful to check whether a particular +syntactic construction is properly supported by the compiler.

-

+
+asn1c -EF <spec-to-test.asn1>
+
+
+The -P option is used to dump the compiled output on the +screen instead of creating a bunch of .c and .h files on disk in the +current directory. You would probably want to start with -P +option instead of creating a mess in your current directory. Another +option, -R, asks compiler to only generate the files which +need to be generated, and supress linking in the numerous support +files. + +

+Print the compiled output instead of creating multiple source files: -asn1c -EF <spec-to-test.asn1> +

+

+asn1c -P <spec-to-compile-and-print.asn1>
 
-
-The -P option is used to dump the compiled output on the screen instead -of creating a bunch of .c and .h files on disk in the current directory. -You would probably want to start with -P option instead of creating -a mess in your current directory. +

-

-Slow start +

+Using the ASN.1 Compiler

-

+

+Command-line options +

+ +

+The Table 1 summarizes various options affecting +the compiler's behavior. + +

+

+
+ + + +
Table 1: +The list of asn1c command line options
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Overall Options +Description
-E +Stop after the parsing stage and print the reconstructed ASN.1 +specification code to the standard output.
-F +Used together with -E, instructs the compiler to stop after +the ASN.1 syntax tree fixing stage and dump the reconstructed ASN.1 +specification to the standard output.
-P +Dump the compiled output to the standard output instead of +cre- ating the target language files on disk.
-R +Restrict the compiler to generate only the ASN.1 tables, omit- +ting the usual support code.
-S <directory> +Use the specified directory with ASN.1 skeleton files.
-t <data-string> +Interpret the data-string as a sequence of hexadecimal values +representing the start of BER TLV encoding. Print the human readable +explanation.
Warning Options +Description
-Werror +Treat warnings as errors; abort if any warning is produced.
-Wdebug-lexer +Enable lexer debugging during the ASN.1 parsing stage.
-Wdebug-fixer + Enable ASN.1 syntax tree fixer debugging during the + fixing stage.
-Wdebug-compiler +Enable debugging during the actual compile time.
Language Options +Description
-fbless-SIZE +Allow SIZE() constraint for INTEGER, ENUMERATED, and other +types for which this constraint is normally prohibited by the standard. +This is a violation of an ASN.1 standard and compiler may fail to +produce the meaningful code.
-fnative-integers +Use native machine's integer types whenever possible, instead +of the complex ASN.1 INTEGER and ENUMERATED types.
-funnamed-unions +Enable unnamed unions in the definitions of target language's +structures.
-ftypes88 +Use only ASN.1:1988 embedded types.
Output Options +Description
-print-constraints +When -EF are also specified, this option forces the compiler +to explain its internal understanding of subtype constraints.
-print-lines +Generate "- #line" comments in -E output.
+ +

+

+


+ +

+ +

Recognizing compiler output -

+

After compiling, the following entities will be created in your current @@ -649,10 +758,9 @@

specification defined in the beginning of this document).
  • A set of helper .c and .h files which contain generic encoders, decoders -and other useful routines. There will be many of them, some of them -even not necessary2.5, but the overall amount of code after compiling will be rather small -anyway. +and other useful routines. There will be quite a few of them, some +of them even are not always necessary, but the overall amount of code +after compiling will be rather small anyway.
  • It is your responsibility to create .c file with the int main() @@ -670,33 +778,29 @@

    -

    -
    -cc -o rectangle *.c   # It could be that simple2.6
    -
    +
    +cc -o rectangle *.c   # It could be that simple4.1
     
    -
    +

    -

    +

    Invoking the ASN.1 helper code from the application -

    +

    -First of all, you would want to include one or more header files into -your application. For the Rectangle module, including the Rectangle.h +First of all, you should to include one or more header files into +your application. For our Rectangle module, including the Rectangle.h file is enough:

    -

    -
    +
     #include <Rectangle.h>
    -
     
    -
    + The header files defines the C structure corresponding to the ASN.1 definition of a rectangle and the declaration of the ASN.1 type descriptor, which is used as an argument to most of the functions provided by @@ -705,14 +809,13 @@

    -

    -
    -Rectangle_t *rect = ;
    +
    +Rectangle_t *rect = ...;
    + 
     asn1_DEF_Rectangle->free_struct(&asn1_DEF_Rectangle,
         rect, 0);
    -
     
    -
    + This code defines a rect pointer which points to the Rectangle_t structure which needs to be freed. The second line invokes the generic free_struct routine created specifically for this Rectangle_t structure. @@ -730,8 +833,8 @@

    explicit subtype constraints. Please refer to Section sub:Validating-the-target.
    ber_decoder
    -
    This is the generic restartable2.7 BER decoder (Basic Encoding Rules). This decoder would create +
    This is the generic restartable4.2 BER decoder (Basic Encoding Rules). This decoder would create and/or fill the target structure for you. Please refer to Section [Decoding-BER].
    @@ -761,10 +864,9 @@

    -

    -
    +
     Rectangle_t *
    -simple_deserializer(void *buffer, size_t buf_size) {
    +simple_deserializer(const void *buffer, size_t buf_size) {
         Rectangle_t *rect = 0;    /* Note this 0! */
         ber_dec_rval_t rval;
      
    @@ -777,14 +879,14 @@ 

        if(rval.code == RC_OK) {         return rect;          /* Decoding succeeded */     } else { +        /* Free partially decoded rect */         asn1_DEF_Rectangle->free_struct(             &asn1_DEF_Rectangle, rect, 0);         return 0;     } } -

    -
    + The code above defines a function, simple_deserializer, which takes a buffer and its length and expected to return a pointer to the Rectangle_t structure. Inside, it tries to convert the bytes @@ -807,9 +909,9 @@

    -


    +


    Decoding BER -

    +

    The Basic Encoding Rules describe the basic way how the structure @@ -859,13 +961,11 @@


    -
    -
    +
     rval = ber_decode(&asn1_DEF_Rectangle, (void **)&rect,
         buffer, buf_size);
    -
     
    -
    + Note that the initial (asn1_DEF_Rectangle->ber_decoder) reference is gone, and also the last argument (0) is no longer necessary. @@ -901,9 +1001,9 @@


    -


    +


    Encoding DER -

    +

    The Distinguished Encoding Rules is the variant of BER encoding rules @@ -920,13 +1020,13 @@


    -
    -
    +
     /*
      * This is a custom function which writes the
      * encoded output into some FILE stream.
      */
    -int _write_stream(void *buffer, size_t size, void *app_key) {
    +static int
    +write_stream(const void *buffer, size_t size, void *app_key) {
         FILE *ostream = app_key;
         size_t wrote;
      
    @@ -945,7 +1045,7 @@ 


    .encoded == -1) {         /*          * Failure to encode the rectangle data. @@ -959,9 +1059,8 @@


    -

    + As you see, the DER encoder does not write into some sort of buffer or something. It just invokes the custom function (possible, multiple times) which would save the data into appropriate storage. The optional @@ -974,8 +1073,8 @@


    2.8. +actually doing the encoding4.3.

    Please look into der_encoder.h for the precise definition of der_encode() @@ -983,9 +1082,9 @@


    -


    +


    Validating the target structure -

    +

    Sometimes the target structure needs to be validated. For example, @@ -1011,9 +1110,9 @@


    +


    Printing the target structure -

    +

    There are two ways to print the target structure: either invoke the @@ -1022,20 +1121,18 @@

    -

    -
    +
     asn_fprint(stdout, &asn1_DEF_Rectangle, rect);
    -
     
    -
    + Please look into constr_TYPE.h for the precise definition of asn_fprint() and related types.

    -


    +


    Freeing the target structure -

    +

    Freeing the structure is slightly more complex than it may seem to. @@ -1046,17 +1143,15 @@

    <

    -

    -
    +
     struct my_figure {       /* The custom structure */
         int flags;           /* <some custom member> */
         /* The type is generated by the ASN.1 compiler */
         Rectangle_t rect;
         /* other members of the structure */
     };
    -
     
    -
    + In this example, the application programmer defined a custom structure with one ASN.1-derived member (rect). This member is not a reference to the Rectangle_t, but an in-place inclusion of the Rectangle_t @@ -1075,8 +1170,7 @@

    <

    -

    -
    +
     /* Rectangle_t is defined within my_figure */
     struct my_figure *mf = ...;
     /*
    @@ -1094,9 +1188,8 @@ 

    <  */ asn1_DEF_Rectangle->free_struct(     &asn1_DEF_Rectangle, rect, 0 /* free the pointer too */); -

    -
    + It is safe to invoke the free_struct function with the target structure pointer set to 0 (NULL), the function will do nothing. @@ -1104,7 +1197,9 @@

    <

    Bibliography -

    Dub00 +

    ASN1C +
    Free ASN.1 Compiler. http://lionet.info/asn1/ +

    Dub00
    Olivier Dubuisson - ASN.1 Communication between heterogeneous systems - Morgan Kaufmann Publishers, 2000. http://asn1.elibel.tm.fr/en/book/. ISBN:0-12-6333361-0. @@ -1114,51 +1209,52 @@



    Footnotes

    -
    ... supported... supported2.1
    -
    C++ is ''supported'' too, as long as an object-oriented approach -is not a definitive factor. +
    C++ is ''supported'' too, as long as an class-based approach is +not a definitive factor.
    -
    ... this... this2.2
    -fnative-integers compiler option is used to produce basic -C int types instead of generic INTEGER_t. +C int types instead of infinite width INTEGER_t structures. +See Table 1.
    -
    ... binary... binary2.3
    BER, CER and DER encodings are binary. However, the XER encoding is text (XML) based.
    -
    ... specification2.4
    -
    This is probably not what you want to try out right now - -read through the rest of this chapter to find out about -P option. +
    ...asn1c3.1
    +
    The 1 symbol in asn1c is a digit, not an ''ell'' letter.
    -
    ... necessary2.5
    -
    Soon the compiler will be modified to emit the smallest subset of -necessary files. +
    ... specification3.2
    +
    This is probably not what you want to try out right now - +read through the rest of this chapter to find out about -P +and -R options.
    -
    ...that simple2.6
    +
    ...that simple4.1
    Provided that you've also created a .c file with the int main() routine.
    -
    ...restartable2.7
    +
    ...restartable4.2
    Restartable means that if the decoder encounters the end of the buffer, it will fail, but may later be invoked again with the rest of the buffer to continue decoding.
    -
    ... encoding2.8
    +
    ... encoding4.3
    It is actually faster too: the encoder might skip over some computations which aren't important for the size determination. @@ -1166,7 +1262,7 @@



    Lev Walkin -2004-08-06 +2004-08-23
    diff --git a/doc/asn1c-usage.lyx b/doc/asn1c-usage.lyx index 03b1fc9e7..6fc007876 100644 --- a/doc/asn1c-usage.lyx +++ b/doc/asn1c-usage.lyx @@ -1,9 +1,20 @@ #LyX 1.3 created this file. For more info see http://www.lyx.org/ \lyxformat 221 \textclass book +\begin_preamble +%\fancyhf{} +%\renewcommand{\chaptermark}[1]{\markboth{\thechapter.\ #1\ sdf}{}} +%\renewcommand{\sectionmark}[1]{\markright{\MakeUppercase{\thesection.\ #1}}} +%\fancyhead[LE,RO]{\thepage} +%\fancyhead[LO]{\rightmark} +%\fancyhead[RE]]{\leftmark} +\usepackage{extramarks} +\lhead{\firstxmark} +\rfoot{\lastxmark} +\end_preamble \language english \inputencoding latin1 -\fontscheme ae +\fontscheme times \graphics default \paperfontsize default \spacing single @@ -21,8 +32,8 @@ \quotes_language swedish \quotes_times 2 \papercolumns 1 -\papersides 1 -\paperpagestyle default +\papersides 2 +\paperpagestyle fancy \layout Title @@ -38,11 +49,37 @@ Lev Walkin < \layout Standard +\begin_inset ERT +status Open + +\layout Standard + +\backslash +extramarks{Document version 0.9}{} +\end_inset + + +\layout Standard + + \begin_inset LatexCommand \tableofcontents{} \end_inset +\layout Standard + + +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +pagestyle{headings} +\end_inset + + \layout Part ASN.1 Basics @@ -159,7 +196,7 @@ UsageExampleModule1 asn1c(5) docs(2) usage(1) 1 } \layout LyX-Code - AUTOMATIC TAGS DEFINITIONS ::= + DEFINITIONS AUTOMATIC TAGS ::= \layout LyX-Code BEGIN @@ -177,7 +214,7 @@ Rectangle ::= SEQUENCE { height INTEGER, -- Height of the rectangle \layout LyX-Code - width INTEGER, -- Width of the rectangle + width INTEGER -- Width of the rectangle \layout LyX-Code } @@ -190,11 +227,19 @@ END \layout Standard The module header consists of module name (UsageExampleModule1), the module - object identifier ({...}), some flags (AUTOMATIC TAGS) and + object identifier ({...}), a keyword \begin_inset Quotes sld \end_inset -DEFINITIONS ::= BEGIN +DEFINITIONS +\begin_inset Quotes srd +\end_inset + +, a set of module flags (AUTOMATIC TAGS) and +\begin_inset Quotes sld +\end_inset + +::= BEGIN \begin_inset Quotes srd \end_inset @@ -232,12 +277,18 @@ The INTEGER type is a signed natural number type without any restrictions SimpleInteger ::= INTEGER \layout LyX-Code + +\layout LyX-Code + -- An integer with a very limited range \layout LyX-Code SmallInt ::= INTEGER (0..127) \layout LyX-Code + +\layout LyX-Code + -- Integer, negative \layout LyX-Code @@ -254,10 +305,13 @@ The ENUMERATED type is semantically equivalent to the INTEGER type with FruitId ::= ENUMERATED { apple(1), orange(2) } \layout LyX-Code + +\layout LyX-Code + -- The numbers in braces are optional, \layout LyX-Code --- the enumeration may be performed +-- the enumeration can be performed \layout LyX-Code -- automatically by the compiler @@ -315,12 +369,18 @@ For example, the very first ASN.1 module in this document has the following ExampleOID ::= OBJECT IDENTIFIER \layout LyX-Code + +\layout LyX-Code + usageExampleModule1-oid ExampleOID \layout LyX-Code ::= { 1 3 6 1 4 1 9363 1 5 2 1 1 } \layout LyX-Code + +\layout LyX-Code + -- An identifier of the Internet. \layout LyX-Code @@ -348,6 +408,9 @@ The RELATIVE-OID type has the semantics of a subtree of an OBJECT IDENTIFIER. this-document RELATIVE-OID ::= { docs(2) usage(1) } \layout LyX-Code + +\layout LyX-Code + this-example RELATIVE-OID ::= { \layout LyX-Code @@ -361,7 +424,7 @@ The IA5String type \layout Standard This is essentially the ASCII, with 128 character codes available (7 lower - bits of 8-bit byte). + bits of an 8-bit byte). \layout Subsection The UTF8String type @@ -584,13 +647,17 @@ The character string with the alphabet which is more or less a subset of \begin_inset Quotes sld \end_inset + +\series bold ~ +\series default + \begin_inset Quotes srd \end_inset (tilde). - Alternatively, the alphabet may be represented as the PrintableString alphabet - described earlier, plus the following characters: + Alternatively, the alphabet may be described as the PrintableString alphabet + presented earlier, plus the following characters: \begin_inset Quotes sld \end_inset @@ -828,7 +895,11 @@ _ \begin_inset Quotes sld \end_inset + +\series bold ~ +\series default + \begin_inset Quotes srd \end_inset @@ -954,12 +1025,18 @@ This one is the list (array) of simple or constructed types: ManyIntegers ::= SEQUENCE OF INTEGER \layout LyX-Code + +\layout LyX-Code + -- Example 2 \layout LyX-Code ManyRectangles ::= SEQUENCE OF Rectangle \layout LyX-Code + +\layout LyX-Code + -- More complex example: \layout LyX-Code @@ -990,6 +1067,9 @@ The SET OF type models the bag of structures. SetOfApples :: SET OF Apple \layout LyX-Code + +\layout LyX-Code + -- Set of integers encoding the kind of a fruit \layout LyX-Code @@ -1018,7 +1098,7 @@ supported \begin_inset Quotes srd \end_inset - too, as long as an object-oriented approach is not a definitive factor. + too, as long as an class-based approach is not a definitive factor. \end_inset ). @@ -1043,7 +1123,13 @@ collapsed false \emph on int \emph default - types instead of generic INTEGER_t. + types instead of infinite width INTEGER_t structures. + See Table +\begin_inset LatexCommand \vref{cap:asn1c-cmdopts} + +\end_inset + +. \end_inset : @@ -1063,9 +1149,9 @@ typedef struct Rectangle_s { This would not be of much value for such a simple specification, so the compiler goes further and actually produces the code which fills in this - structure by parsing the binary + structure by parsing the opaque binary \begin_inset Foot -collapsed false +collapsed true \layout Standard @@ -1076,13 +1162,37 @@ BER, CER and DER encodings are binary. data provided in some buffer. It also produces the code that takes this structure as an argument and performs structure serialization by emitting a series of bytes. -\layout Section +\layout Chapter Quick start \layout Standard -After building and installing the compiler, the asn1c command may be used - to compile the ASN.1 specification +After building and installing the compiler, the +\emph on +asn1c +\begin_inset Foot +collapsed false + +\layout Standard + +The 1 symbol in asn +\series bold +1 +\series default +c is a digit, not an +\begin_inset Quotes sld +\end_inset + +ell +\begin_inset Quotes srd +\end_inset + + letter. +\end_inset + + +\emph default + command may be used to compile the ASN.1 specification \begin_inset Foot collapsed false @@ -1093,7 +1203,15 @@ This is probably not \series default what you want to try out right now -- read through the rest of this chapter - to find out about -P option. + to find out about +\series bold +-P +\series default + and +\series bold +-R +\series default + options. \end_inset : @@ -1104,8 +1222,8 @@ asn1c \layout Standard -If several specifications contain interdependencies, all of them must be - specified: +If several specifications contain interdependencies, all of the files must + be specified altogether: \layout LyX-Code asn1c @@ -1113,27 +1231,536 @@ asn1c ... \layout Standard -The compiler -E and -EF options are used for testing the parser and the - semantic fixer, respectively. - These options will instruct the compiler to dump out the parsed (and fixed) - ASN.1 specification as it was "understood" by the compiler. - It might might be useful to check whether a particular syntactic construction +The compiler +\series bold +-E +\series default + and +\series bold +-EF +\series default + options are used for testing the parser and the semantic fixer, respectively. + These options will instruct the compiler to dump out the parsed (and fixed, + if +\series bold +-F +\series default + is involved) ASN.1 specification as it was "understood" by the compiler. + It might be useful to check whether a particular syntactic construction is properly supported by the compiler. \layout LyX-Code -asn1c -EF +asn1c +\series bold +-EF +\series default + \emph on \layout Standard -The -P option is used to dump the compiled output on the screen instead - of creating a bunch of .c and .h files on disk in the current directory. - You would probably want to start with -P option instead of creating a mess - in your current directory. +The +\series bold +-P +\series default + option is used to dump the compiled output on the screen instead of creating + a bunch of .c and .h files on disk in the current directory. + You would probably want to start with +\series bold +-P +\series default + option instead of creating a mess in your current directory. + Another option, +\series bold +-R +\series default +, asks compiler to only generate the files which need to be generated, and + supress linking in the numerous support files. +\layout Standard + +Print the compiled output instead of creating multiple source files: +\layout LyX-Code + +asn1c +\series bold +-P +\series default + +\emph on + +\layout LyX-Code + +\layout Chapter + +Using the ASN.1 Compiler \layout Section -Slow start -\layout Subsection +Command-line options +\layout Standard + +The Table +\begin_inset LatexCommand \vref{cap:asn1c-cmdopts} + +\end_inset + + summarizes various options affecting the compiler's behavior. +\layout Standard + + +\begin_inset Float table +wide false +collapsed true + +\layout Standard + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\layout Standard + + +\series bold +Overall Options +\end_inset + + +\begin_inset Text + +\layout Standard + + +\series bold +Description +\end_inset + + + + +\begin_inset Text + +\layout Standard + +-E +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size small +Stop after the parsing stage and print the reconstructed ASN.1 specification + code to the standard output. +\end_inset + + + + +\begin_inset Text + +\layout Standard + +-F +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size small +Used together with -E, instructs the compiler to stop after the ASN.1 syntax + tree fixing stage and dump the reconstructed ASN.1 specification to the + standard output. +\end_inset + + + + +\begin_inset Text + +\layout Standard + +-P +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size small +Dump the compiled output to the standard output instead of cre- ating the + target language files on disk. +\end_inset + + + + +\begin_inset Text + +\layout Standard + +-R +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size small +Restrict the compiler to generate only the ASN.1 tables, omit- ting the usual + support code. +\end_inset + + + + +\begin_inset Text + +\layout Standard + +-S +\emph on + +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size small +Use the specified directory with ASN.1 skeleton files. +\end_inset + + + + +\begin_inset Text + +\layout Standard + +-t +\emph on + +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size small +Interpret the data-string as a sequence of hexadecimal values representing + the start of BER TLV encoding. + Print the human readable explanation. +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\series bold +Warning Options +\end_inset + + +\begin_inset Text + +\layout Standard + + +\series bold +Description +\end_inset + + + + +\begin_inset Text + +\layout Standard + +-Werror +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size small +Treat warnings as errors; abort if any warning is produced. +\end_inset + + + + +\begin_inset Text + +\layout Standard + +-Wdebug-lexer +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size small +Enable lexer debugging during the ASN.1 parsing stage. +\end_inset + + + + +\begin_inset Text + +\layout Standard + +-Wdebug-fixer +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size small + Enable ASN.1 syntax tree fixer debugging during the fixing stage. +\end_inset + + + + +\begin_inset Text + +\layout Standard + +-Wdebug-compiler +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size small +Enable debugging during the actual compile time. +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\series bold +Language Options +\end_inset + + +\begin_inset Text + +\layout Standard + + +\series bold +Description +\end_inset + + + + +\begin_inset Text + +\layout Standard + +-fbless-SIZE +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size small +Allow SIZE() constraint for INTEGER, ENUMERATED, and other types for which + this constraint is normally prohibited by the standard. + This is a violation of an ASN.1 standard and compiler may fail to produce + the meaningful code. +\end_inset + + + + +\begin_inset Text + +\layout Standard + +-fnative-integers +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size small +Use native machine's integer types whenever possible, instead of the complex + ASN.1 INTEGER and ENUMERATED types. + +\end_inset + + + + +\begin_inset Text + +\layout Standard + +-funnamed-unions +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size small +Enable unnamed unions in the definitions of target language's structures. +\end_inset + + + + +\begin_inset Text + +\layout Standard + +-ftypes88 +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size small +Use only ASN.1:1988 embedded types. +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\series bold +Output Options +\end_inset + + +\begin_inset Text + +\layout Standard + + +\series bold +Description +\end_inset + + + + +\begin_inset Text + +\layout Standard + +-print-constraints +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size small +When -EF are also specified, this option forces the compiler to explain + its internal understanding of subtype constraints. +\end_inset + + + + +\begin_inset Text + +\layout Standard + +-print-lines +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size small +Generate "-- #line" comments in -E output. +\end_inset + + + + +\end_inset + + +\layout Caption + + +\begin_inset LatexCommand \label{cap:asn1c-cmdopts} + +\end_inset + +The list of asn1c command line options +\end_inset + + +\layout Section Recognizing compiler output \layout Standard @@ -1157,17 +1784,8 @@ Rectangle.h A set of helper .c and .h files which contain generic encoders, decoders and other useful routines. - There will be many of them, some of them even not necessary -\begin_inset Foot -collapsed false - -\layout Standard - -Soon the compiler will be modified to emit the smallest subset of necessary - files. -\end_inset - -, but the overall amount of code after compiling will be rather small anyway. + There will be quite a few of them, some of them even are not always necessary, + but the overall amount of code after compiling will be rather small anyway. \layout Standard It is your responsibility to create .c file with the @@ -1233,14 +1851,14 @@ int main() \end_inset -\layout Subsection +\layout Section Invoking the ASN.1 helper code from the application \layout Standard -First of all, you would want to include one or more header files into your - application. - For the Rectangle module, including the Rectangle.h file is enough: +First of all, you should to include one or more header files into your applicati +on. + For our Rectangle module, including the Rectangle.h file is enough: \layout LyX-Code #include @@ -1252,7 +1870,10 @@ The header files defines the C structure corresponding to the ASN.1 definition For example, here is the code which frees the Rectangle_t structure: \layout LyX-Code -Rectangle_t *rect = ; +Rectangle_t *rect = ...; +\layout LyX-Code + + \layout LyX-Code asn1_DEF_Rectangle->free_struct(&asn1_DEF_Rectangle, @@ -1366,7 +1987,7 @@ Here is how the buffer can be deserialized into the structure: Rectangle_t * \layout LyX-Code -simple_deserializer(void *buffer, size_t buf_size) { +simple_deserializer(const void *buffer, size_t buf_size) { \layout LyX-Code Rectangle_t *rect = 0; /* Note this 0! */ @@ -1409,6 +2030,9 @@ simple_deserializer(void *buffer, size_t buf_size) { } else { \layout LyX-Code + /* Free partially decoded rect */ +\layout LyX-Code + asn1_DEF_Rectangle->free_struct( \layout LyX-Code @@ -1461,7 +2085,7 @@ Restartable decoding is a little bit trickier: you need to provide the old \end_inset -\layout Subsubsection +\layout Subsection \begin_inset LatexCommand \label{sub:Decoding-BER} @@ -1575,7 +2199,7 @@ always Please look into ber_decoder.h for the precise definition of ber_decode() and related types. -\layout Subsubsection +\layout Subsection \begin_inset LatexCommand \label{sub:Encoding-DER} @@ -1610,7 +2234,10 @@ As with BER decoder, the DER encoder may be invoked either directly from */ \layout LyX-Code -int _write_stream(void *buffer, size_t size, void *app_key) { +static int +\layout LyX-Code + +write_stream(const void *buffer, size_t size, void *app_key) { \layout LyX-Code FILE *ostream = app_key; @@ -1667,7 +2294,7 @@ simple_serializer(FILE *ostream, Rectangle_t *rect) { rval = der_encode(&asn1_DEF_Rect, rect, \layout LyX-Code - _write_stream, ostream); + write_stream, ostream); \layout LyX-Code if(rval @@ -1760,7 +2387,7 @@ It is actually faster too: the encoder might skip over some computations Please look into der_encoder.h for the precise definition of der_encode() and related types. -\layout Subsubsection +\layout Subsection \begin_inset LatexCommand \label{sub:Validating-the-target} @@ -1791,7 +2418,7 @@ The asn_check_constraints() function checks the type for various implicit Please look into constraints.h for the precise definition of asn_check_constraint s() and related types. -\layout Subsubsection +\layout Subsection \begin_inset LatexCommand \label{sub:Printing-the-target} @@ -1811,7 +2438,7 @@ asn_fprint(stdout, &asn1_DEF_Rectangle, rect); Please look into constr_TYPE.h for the precise definition of asn_fprint() and related types. -\layout Subsubsection +\layout Subsection \begin_inset LatexCommand \label{sub:Freeing-the-target} @@ -1937,6 +2564,16 @@ free_struct \emph default function with the target structure pointer set to 0 (NULL), the function will do nothing. +\layout Bibliography +\bibitem [ASN1C]{ASN1C} + +Free ASN.1 Compiler. + +\begin_inset LatexCommand \htmlurl{http://lionet.info/asn1/} + +\end_inset + + \layout Bibliography \bibitem [Dub00]{Dub00} diff --git a/doc/asn1c-usage.pdf b/doc/asn1c-usage.pdf index 5601cd2e490afdea96c30c66c128dd37e17cefc3..a33e9aa071448d8812d2d53d461d3b039355c2ce 100644 GIT binary patch literal 58284 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
    uq>_B5|Vhe}>?pL&ZNi>*KZLGrnzu4n)^ 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 KZUuEk$o~LGv)M}k From c03d90288ccb4a716d96f93e41a4e3a57b623fcc Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 24 Aug 2004 05:21:21 +0000 Subject: [PATCH 0205/1469] revision git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@205 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-usage.lyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/asn1c-usage.lyx b/doc/asn1c-usage.lyx index 6fc007876..a97f3a534 100644 --- a/doc/asn1c-usage.lyx +++ b/doc/asn1c-usage.lyx @@ -55,7 +55,7 @@ status Open \layout Standard \backslash -extramarks{Document version 0.9}{} +extramarks{Document revision $Revision$}{} \end_inset From 40e9a359b09841870960d9f2d480e6e3486bb1af Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 24 Aug 2004 05:22:28 +0000 Subject: [PATCH 0206/1469] revision git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@206 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-usage.lyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/asn1c-usage.lyx b/doc/asn1c-usage.lyx index a97f3a534..438e7b08a 100644 --- a/doc/asn1c-usage.lyx +++ b/doc/asn1c-usage.lyx @@ -55,7 +55,7 @@ status Open \layout Standard \backslash -extramarks{Document revision $Revision$}{} +extramarks{$Revision$}{} \end_inset From 7020328c47c231008fdb4872699792ddac2b2a85 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 24 Aug 2004 05:23:37 +0000 Subject: [PATCH 0207/1469] new revision git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@207 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-usage.pdf | Bin 58284 -> 66895 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/asn1c-usage.pdf b/doc/asn1c-usage.pdf index a33e9aa071448d8812d2d53d461d3b039355c2ce..215d99de6b7de1901d845dc56afb23f1e7a7f3d7 100644 GIT binary patch delta 12659 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 delta 4764 zcmai1YitzP74D87;00sw?t-xiouwGD*unQXb4M5lV=#h%p&^twt_wDpmOyc^&7(w( z3vJSbrl9&%C(chH{U<-VnyevLx-+@n23C??Zk^Oywxd=i5Y*Z-}Ulecb@&jtVj31`I~D` zw;eh7+=)fCtwZfUKEHK%%F@c;AOFU(Pc=S2ZOoG9mY&VKMAItz^K*|FaCyqnm0v7h z^^d_*-~0829Y@zrEqnFTwTCudG*;jFR@>{ZT{-qb>ccPm`Ray`cSW{7MxxNTF9!cI zo`P$YB``dy+Q7^`TX4J}LZPF?jALdZ^PyAK5B{ z*wR`uCc?&urHsMFp;CBu>=gJ+H17Ut?2%%)9_=uw4J*f_#$ih-nRU&~HYtTmEeV5K z&{)R}hTOUFnZ?j}ItF)*vN%Iw^HfOlwJ~aYUomDEKF9GPqw?uGN*Ry4J?H2X{1wm6Sg@ zc7|aQ_f3AMNK!;m%JQM35f>CA~^^7Nx$Qw73%EDpb@9|XiZ%e5FR zD65;8$FtdB-1Z{OPtc|+K|MA*7@J`WciEyF#fGgYZ^mtn^S0uAZL#fD0PY^DfU3G^x>}Om z)igl({}DYT7u84xywe(U7cYOgBwZGvl|^`EiTch|RpD#Raph25-mb?E~5@|at*u5dK``;kt=c3^cYN133! zQ};+;6)Yq6CYPE%Z?`5~d-LHEz?~h+(04oi9{QlAXj~A`{H~d_F5$kneQyzwS#xcUmc0R!zFbnRFIX+)<{pUEDSyli4LJQM69lZ~?48lOnZQZ}#@b|(*jP%8T z)MluSYf)hNMQ&FtA4p0Y(jxqBU#WX$pm>y=nZ!UG9ynY9BZtPrSLT+(M>kDhR0AvJ zg8Ioom3#2;l43X?D|N3OdoEJ^%VII&Y;t%1AXQNK_)9x?K~rqHuVulFlc^@;&+WST z9lc%6-CO$1x`!98XliMyX7XK`J6k8J#T6|v~h&Y_Go5TP#8RkRU+F@&x~OA=;?6$s+3wx$D=#fe zl|B%0zb%jU_Vsjid>Qs%nWK&_9!gC@>CVqZzhc#+t5?Ig%O;!|8eim1Aox*11zZ`T zMVas3jrqjL4@|&~%O})MNeA-Am1=nAW*YBF@b1mI%4hlTiUlY=)*sxszSnH?`GWmX zhkZ_BFDjFGP?^L-xIJ&&%Pn>N)>JrlYs}Q3G3uM4o(Gc=cz<|uq#XuH1^j7S6k3Mk zBB;Q97ue8N3!XV`j}hHsP`cMV97c4F*l@ToH+^?PnJ2y zIaUD$WC#g4KEpB_L(84%{Rlhiq7qcVLaxD(3<*bE?nGw&sj5OJeDr%LIxD zWfJH9kPs> z>^M@56AXq4CsV@gxqga;20ubpCgTjOjMzNvgb_}{1{uaAoCqV-l28YN;hZp~tMJc} z%n~@`I2)m5t3e-7MjVr{K_s}2mXL)C>sk)UOW3Qw#EPjaRltdCJ08vs2`jI5e(5lF zoIHb`5sZbpIfd+TH86rQ((mvvT$l*8^Fs%b6K*R^sa8)+iO>?ENK1tCbaFEPEc}>S zdeoH5`(`K@%4{t_uGbh#dT7Z}Tg~unavuJe+iGBCh3WxwOCu)c_b8JsNfXw!xkfn5 zg_?~4AM#~lc35PXP917F2X;gv)%`@x?|=pt80#{mZhgUXwzp0KGJ=p^FUQgAC7ZxQ zBfmDBGb_wSId5pVHiQK6RS^(G@+q%GNLEIJoNzg)^AhoDLx>}5#)F#0Rrtp_trLHbP$2QaGO&z8#CxLTv zW^3b5bx=4FF1saMI+brCY>;y~{|<~4My3c% Date: Tue, 24 Aug 2004 05:25:57 +0000 Subject: [PATCH 0208/1469] 0.9.1: doc update and oid printing fix git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@208 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ChangeLog b/ChangeLog index 35347bdb8..8ed31aa98 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,10 @@ +0.9.1: 2004-Aug-23 + + * Documentation updated: doc/asn1c-usage.pdf + * Fixed OBJECT IDENTIFIER human-readable printing. + Reported by . + 0.9: 2004-Aug-23 * Reworked subtype constraints handling, aiming at PER-applicability. From 5caa21c177fe7f1d54fd0afe90b3b908cd1b704b Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 24 Aug 2004 05:26:19 +0000 Subject: [PATCH 0209/1469] 0.9.1 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@209 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure | 2 +- configure.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 99f212cf1..5519f21de 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.9 + VERSION=0.9.1 cat >>confdefs.h <<_ACEOF diff --git a/configure.in b/configure.in index f2082bac0..894756ad8 100644 --- a/configure.in +++ b/configure.in @@ -3,7 +3,7 @@ AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_BUILD AC_CANONICAL_TARGET AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.9) +AM_INIT_AUTOMAKE(asn1c, 0.9.1) AC_SUBST(PATH) From b6fd3b26a7a16e7497d493a39cca9b5593b3468a Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 25 Aug 2004 00:42:25 +0000 Subject: [PATCH 0210/1469] fixed constraint code git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@210 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix.c | 67 +++++++++++++++++++++++++------------ libasn1fix/asn1fix_constr.c | 6 ++-- libasn1fix/asn1fix_crange.c | 8 ++++- 3 files changed, 55 insertions(+), 26 deletions(-) diff --git a/libasn1fix/asn1fix.c b/libasn1fix/asn1fix.c index 481007918..d79fd3caa 100644 --- a/libasn1fix/asn1fix.c +++ b/libasn1fix/asn1fix.c @@ -15,7 +15,8 @@ static void _default_error_logger(int _severity, const char *fmt, ...); static int asn1f_fix_module(arg_t *arg); static int asn1f_fix_simple(arg_t *arg); /* For INTEGER/ENUMERATED */ static int asn1f_fix_constructed(arg_t *arg); /* For SEQUENCE/SET/CHOICE */ -static int asn1f_fix_constraints(arg_t *arg); /* For subtype constraints */ +static int asn1f_resolve_constraints(arg_t *arg); /* For subtype constraints */ +static int asn1f_check_constraints(arg_t *arg); /* For subtype constraints */ arg_t a1f_replace_me_with_proper_interface_arg; @@ -102,6 +103,7 @@ static int asn1f_fix_module(arg_t *arg) { asn1p_expr_t *expr; int rvalue = 0; + int ret; switch((arg->mod->module_flags & MSF_MASK_TAGS)) { case MSF_NOFLAGS: @@ -140,7 +142,6 @@ asn1f_fix_module(arg_t *arg) { * Order is not important. */ TQ_FOR(expr, &(arg->mod->members), next) { - int ret; arg->expr = expr; if(expr->meta_type == AMT_PARAMTYPE) @@ -178,7 +179,7 @@ asn1f_fix_module(arg_t *arg) { /* * Resolve references in constraints. */ - ret = asn1f_recurse_expr(arg, asn1f_fix_constraints); + ret = asn1f_recurse_expr(arg, asn1f_resolve_constraints); RET2RVAL(ret, rvalue); /* @@ -195,7 +196,6 @@ asn1f_fix_module(arg_t *arg) { * 5. Automatic tagging */ TQ_FOR(expr, &(arg->mod->members), next) { - int ret; arg->expr = expr; @@ -210,7 +210,6 @@ asn1f_fix_module(arg_t *arg) { * 9. fix spaces in cstrings */ TQ_FOR(expr, &(arg->mod->members), next) { - int ret; arg->expr = expr; ret = asn1f_recurse_expr(arg, asn1f_fix_bit_string); @@ -226,7 +225,6 @@ asn1f_fix_module(arg_t *arg) { * ... Check for tags distinctness. */ TQ_FOR(expr, &(arg->mod->members), next) { - int ret; arg->expr = expr; ret = asn1f_recurse_expr(arg, asn1f_check_constr_tags_distinct); @@ -235,6 +233,18 @@ asn1f_fix_module(arg_t *arg) { assert(arg->expr == expr); } + /* + * Check semantic validity of constraints. + */ + TQ_FOR(expr, &(arg->mod->members), next) { + arg->expr = expr; + + ret = asn1f_recurse_expr(arg, asn1f_check_constraints); + RET2RVAL(ret, rvalue); + + assert(arg->expr == expr); + } + return rvalue; } @@ -287,7 +297,7 @@ asn1f_fix_constructed(arg_t *arg) { } static int -asn1f_fix_constraints(arg_t *arg) { +asn1f_resolve_constraints(arg_t *arg) { asn1p_expr_t *top_parent; asn1p_expr_type_e etype; int rvalue = 0; @@ -302,25 +312,38 @@ asn1f_fix_constraints(arg_t *arg) { arg->expr->constraints, etype, 0); RET2RVAL(ret, rvalue); + return rvalue; +} + +static int +asn1f_check_constraints(arg_t *arg) { + static enum asn1p_constraint_type_e test_types[] = { + ACT_EL_RANGE, ACT_CT_SIZE, ACT_CT_FROM }; + asn1p_expr_t *top_parent; + asn1cnst_range_t *range; + asn1p_expr_type_e etype; + unsigned int i; + int rvalue = 0; + int ret; + + top_parent = asn1f_find_terminal_type(arg, arg->expr); + if(!top_parent) + return 0; + etype = top_parent->expr_type; + ret = asn1constraint_pullup(arg); RET2RVAL(ret, rvalue); - if(top_parent) { - static enum asn1p_constraint_type_e test_types[] = { - ACT_EL_RANGE, ACT_CT_SIZE, ACT_CT_FROM }; - unsigned int i; - for(i = 0; i < sizeof(test_types)/sizeof(test_types[0]); i++) { - asn1cnst_range_t *range; - range = asn1constraint_compute_PER_range( - top_parent->expr_type, - arg->expr->combined_constraints, - test_types[i], 0, 0); - if(!range && errno == EPERM) - return -1; - asn1constraint_range_free(range); - } + for(i = 0; i < sizeof(test_types)/sizeof(test_types[0]); i++) { + range = asn1constraint_compute_PER_range( + top_parent->expr_type, + arg->expr->combined_constraints, + test_types[i], 0, 0); + if(!range && errno == EPERM) + return -1; + asn1constraint_range_free(range); } - + return rvalue; } diff --git a/libasn1fix/asn1fix_constr.c b/libasn1fix/asn1fix_constr.c index 1574c8147..fab78d377 100644 --- a/libasn1fix/asn1fix_constr.c +++ b/libasn1fix/asn1fix_constr.c @@ -72,7 +72,7 @@ asn1f_pull_components_of(arg_t *arg) { } /* Move the stuff back */ - TQ_HEAD_COPY(&(expr->members), &list); + TQ_MOVE(&(expr->members), &list); return r_value; } @@ -133,12 +133,12 @@ asn1f_fix_constr_ext(arg_t *arg) { /* * Copy the root list and extension list back into the main list. */ - TQ_HEAD_COPY(&(expr->members), &root_list); + TQ_MOVE(&(expr->members), &root_list); while((v = TQ_REMOVE(&ext_list, next))) TQ_ADD(&(expr->members), v, next); if(arg->mod->module_flags & MSF_EXTENSIBILITY_IMPLIED - && ext_count < 1) { + && ext_count == 0) { v = asn1p_expr_new(0); if(v) { v->Identifier = strdup("..."); diff --git a/libasn1fix/asn1fix_crange.c b/libasn1fix/asn1fix_crange.c index 17618caf0..3032799b2 100644 --- a/libasn1fix/asn1fix_crange.c +++ b/libasn1fix/asn1fix_crange.c @@ -313,6 +313,11 @@ static int _range_fill(asn1p_value_t *val, const asn1cnst_range_t *minmax, asn1c if(type != ACT_CT_FROM) return 0; break; + case ATV_REFERENCED: + FATAL("Unrecognized constraint element \"%s\" at line %d", + asn1f_printable_reference(val->value.reference), + lineno); + return -1; default: FATAL("Unrecognized constraint element at line %d", lineno); @@ -878,7 +883,8 @@ asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constr ret = _range_fill(vmin, minmax, &range->left, range, type, ct->_lineno); - ret |= _range_fill(vmax, minmax, &range->right, + if(!ret) + ret = _range_fill(vmax, minmax, &range->right, range, type, ct->_lineno); if(ret) { _range_free(range); From a47b5f886f64bb92a09b711db7867bd96552c2f0 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 25 Aug 2004 00:42:44 +0000 Subject: [PATCH 0211/1469] proper way of doing list move git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@211 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_list.h | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/libasn1parser/asn1p_list.h b/libasn1parser/asn1p_list.h index 1f8087808..4a71fdd9a 100644 --- a/libasn1parser/asn1p_list.h +++ b/libasn1parser/asn1p_list.h @@ -4,19 +4,25 @@ #ifndef ASN1_PARSER_LIST_H #define ASN1_PARSER_LIST_H -#define TQ_HEAD(type) \ - struct { \ - type *tq_head; \ - type**tq_tail; \ +#define TQ_HEAD(type) \ + struct { \ + type *tq_head; \ + type**tq_tail; \ } -#define TQ_HEAD_COPY(to, from) \ - do { (to)->tq_head = (from)->tq_head; \ - (to)->tq_tail = (from)->tq_tail; } while(0) +#define TQ_MOVE(to, from) do { \ + if(&(TQ_FIRST(from)) == (from)->tq_tail) { \ + TQ_INIT(to); \ + } else { \ + (to)->tq_head = (from)->tq_head; \ + (to)->tq_tail = (from)->tq_tail; \ + } \ + TQ_INIT(from); \ + } while(0) -#define TQ_ENTRY(type) \ - struct { \ - type *tq_next; \ +#define TQ_ENTRY(type) \ + struct { \ + type *tq_next; \ } #define TQ_FIRST(headp) ((headp)->tq_head) From d86c925233a4524d676f9371a99612684d53917e Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 25 Aug 2004 01:34:11 +0000 Subject: [PATCH 0212/1469] avoided compilation warnings on gcc 3.3.x systems git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@212 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 5 +++++ asn1c/tests/check-assembly.sh | 22 ++-------------------- configure.in | 6 +++--- skeletons/BOOLEAN.c | 2 +- skeletons/INTEGER.c | 2 +- skeletons/NativeInteger.c | 2 +- skeletons/OBJECT_IDENTIFIER.c | 11 ++++++----- skeletons/OCTET_STRING.c | 10 +++++----- skeletons/RELATIVE-OID.c | 4 ++-- skeletons/ber_decoder.c | 2 +- skeletons/ber_tlv_length.c | 6 +++--- skeletons/ber_tlv_tag.c | 4 ++-- skeletons/constr_CHOICE.c | 2 +- skeletons/constr_SEQUENCE.c | 2 +- skeletons/constr_SET.c | 2 +- skeletons/constr_SET_OF.c | 2 +- 16 files changed, 36 insertions(+), 48 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8ed31aa98..d6f4e773b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,9 @@ +0.9.2: 2004-Aug-24 + + * Indirect references in constraints resolver code fixed. + * Avoided compilation warning on gcc 3.3.3 systems. + 0.9.1: 2004-Aug-23 * Documentation updated: doc/asn1c-usage.pdf diff --git a/asn1c/tests/check-assembly.sh b/asn1c/tests/check-assembly.sh index 11571fc59..a0b0fdb12 100755 --- a/asn1c/tests/check-assembly.sh +++ b/asn1c/tests/check-assembly.sh @@ -43,26 +43,8 @@ CFLAGS=\${COMMON_FLAGS} ${CFLAGS} CXXFLAGS=\${COMMON_FLAGS} ${CXXFLAGS} all: check-executable -check-executable: compiled-module object-files - \$(CC) \$(CFLAGS) -o check-executable *.o - -# Cannot track dependencies automatically because files are not known beforehand -object-files: *.c* - @for sfile in *.c; do \\ - ofile=\`echo "\$\$sfile" | sed -e 's/\.c[c]*\$\$/.o/'\`; \\ - if [ "\$\$sfile" -nt "\$\$ofile" ]; then \\ - echo "\$(CC) \$(CFLAGS) -o \$\$ofile -c \$\$sfile"; \\ - \$(CC) \$(CFLAGS) -o \$\$ofile -c \$\$sfile; \\ - fi; \\ - done - @for sfile in *.cc; do \\ - ofile=\`echo "\$\$sfile" | sed -e 's/\.c[c]*\$\$/.o/'\`; \\ - if [ "\$\$sfile" -nt "\$\$ofile" ]; then \\ - echo "\$(CXX) \$(CXXFLAGS) -o \$\$ofile -c \$\$sfile";\\ - \$(CXX) \$(CXXFLAGS) -o \$\$ofile -c \$\$sfile; \\ - fi; \\ - done - @touch object-files +check-executable: compiled-module *.c* + \$(CC) \$(CFLAGS) -o check-executable *.c* # Compile the corresponding .asn1 spec. compiled-module: ${asn_module} ../../asn1c diff --git a/configure.in b/configure.in index 894756ad8..968bc2d90 100644 --- a/configure.in +++ b/configure.in @@ -3,7 +3,7 @@ AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_BUILD AC_CANONICAL_TARGET AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.9.1) +AM_INIT_AUTOMAKE(asn1c, 0.9.2) AC_SUBST(PATH) @@ -40,14 +40,14 @@ AM_PROG_LEX dnl *** Building mingw32 with cygwin compiler *** case "$host_os" in cygwin*) - CFLAGS="$CFLAGS -DWIN32" + dnl CFLAGS="$CFLAGS -DWIN32" case "$target" in *mingw*) CC="$CC -mno-cygwin" esac ;; mingw* | p32*) - CFLAGS="$CFLAGS -DWIN32" + dnl CFLAGS="$CFLAGS -DWIN32" ;; esac diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c index da38772db..b0ae1786c 100644 --- a/skeletons/BOOLEAN.c +++ b/skeletons/BOOLEAN.c @@ -61,7 +61,7 @@ BOOLEAN_decode_ber(asn1_TYPE_descriptor_t *td, ASN_DEBUG("Boolean length is %d bytes", (int)length); - (char *)buf_ptr += rval.consumed; + buf_ptr = ((char *)buf_ptr) + rval.consumed; size -= rval.consumed; if(length > (ber_tlv_len_t)size) { rval.code = RC_WMORE; diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 0c7a81afb..16a6b74d6 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -67,7 +67,7 @@ INTEGER_decode_ber(asn1_TYPE_descriptor_t *td, /* * Make sure we have this length. */ - (char *)buf_ptr += rval.consumed; + buf_ptr = ((char *)buf_ptr) + rval.consumed; size -= rval.consumed; if(length > (ber_tlv_len_t)size) { rval.code = RC_WMORE; diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index 759fe27e7..b0cc3b713 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -74,7 +74,7 @@ NativeInteger_decode_ber(asn1_TYPE_descriptor_t *td, /* * Make sure we have this length. */ - (char *)buf_ptr += rval.consumed; + buf_ptr = ((char *)buf_ptr) + rval.consumed; size -= rval.consumed; if(length > (ber_tlv_len_t)size) { rval.code = RC_WMORE; diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index 4e6270dba..fe209056d 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -332,7 +332,7 @@ OBJECT_IDENTIFIER_get_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, *(unsigned char *)((char *)arcs + ((*(char *)&LE)?0:(arc_type_size - 1))) = first_arc; - (char *)arcs += arc_type_size; + arcs = ((char *)arcs) + arc_type_size; } /* Decode, if has space */ @@ -342,7 +342,7 @@ OBJECT_IDENTIFIER_get_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, arcs, arc_type_size)) return -1; startn = i + 1; - (char *)arcs += arc_type_size; + arcs = ((char *)arcs) + arc_type_size; add = 0; } num_arcs++; @@ -538,7 +538,7 @@ OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, unsigned int ar */ /* Copy the second (1'st) arcs[1] into the first_value */ *fv++ = 0; - (char *)arcs += arc_type_size; + arcs = ((char *)arcs) + arc_type_size; if(isLittleEndian) { uint8_t *aend = (unsigned char *)arcs - 1; uint8_t *a1 = (unsigned char *)arcs + arc_type_size - 1; @@ -567,8 +567,9 @@ OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, unsigned int ar /* * Save the rest of arcs. */ - for((char *)arcs += arc_type_size, i = 2; - i < arc_slots; i++, (char *)arcs += arc_type_size) { + for(arcs = ((char *)arcs) + arc_type_size, i = 2; + i < arc_slots; + i++, arcs = ((char *)arcs) + arc_type_size) { bp += OBJECT_IDENTIFIER_set_single_arc(bp, arcs, arc_type_size, 0); } diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 8ea360d5f..6e0e426df 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -37,11 +37,11 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { #define NEXT_PHASE(ctx) _CH_PHASE(ctx, +1) #define PREV_PHASE(ctx) _CH_PHASE(ctx, -1) -#define ADVANCE(num_bytes) do { \ - size_t num = num_bytes; \ - (char *)buf_ptr += num; \ - size -= num; \ - consumed_myself += num; \ +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + buf_ptr = ((char *)buf_ptr) + num; \ + size -= num; \ + consumed_myself += num; \ } while(0) #define RETURN(_code) do { \ diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index 3273ace5b..252cc3739 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -87,7 +87,7 @@ RELATIVE_OID_get_arcs(RELATIVE_OID_t *roid, i - startn + 1, 0, arcs, arc_type_size)) return -1; - (char *)arcs += arc_type_size; + arcs = ((char *)arcs) + arc_type_size; num_arcs++; } @@ -122,7 +122,7 @@ RELATIVE_OID_set_arcs(RELATIVE_OID_t *roid, void *arcs, unsigned int arc_type_si /* * Encode the arcs. */ - for(i = 0; i < arcs_slots; i++, (char *)arcs += arc_type_size) { + for(i = 0; i < arcs_slots; i++, arcs = ((char *)arcs) + arc_type_size) { bp += OBJECT_IDENTIFIER_set_single_arc(bp, arcs, arc_type_size, 0); } diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c index 0fd9b2623..e56cc6a6a 100644 --- a/skeletons/ber_decoder.c +++ b/skeletons/ber_decoder.c @@ -7,7 +7,7 @@ #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ - (char *)ptr += num; \ + ptr = ((char *)ptr) + num; \ size -= num; \ consumed_myself += num; \ } while(0) diff --git a/skeletons/ber_tlv_length.c b/skeletons/ber_tlv_length.c index b3c1cebbb..508bc39ff 100644 --- a/skeletons/ber_tlv_length.c +++ b/skeletons/ber_tlv_length.c @@ -87,7 +87,7 @@ ber_skip_length(int _is_constructed, void *ptr, size_t size) { * Indefinite length! */ ASN_DEBUG("Skipping indefinite length"); - for(skip = ll, (char *)ptr += ll, size -= ll;;) { + for(skip = ll, ptr = ((char *)ptr) + ll, size -= ll;;) { ber_tlv_tag_t tag; /* Fetch the tag */ @@ -95,7 +95,7 @@ ber_skip_length(int _is_constructed, void *ptr, size_t size) { if(tl <= 0) return tl; ll = ber_skip_length(BER_TLV_CONSTRUCTED(ptr), - (char *)ptr + tl, size - tl); + ((char *)ptr) + tl, size - tl); if(ll <= 0) return ll; skip += tl + ll; @@ -109,7 +109,7 @@ ber_skip_length(int _is_constructed, void *ptr, size_t size) { && ((uint8_t *)ptr)[1] == 0) return skip; - (char *)ptr += tl + ll; + ptr = ((char *)ptr) + tl + ll; size -= tl + ll; } diff --git a/skeletons/ber_tlv_tag.c b/skeletons/ber_tlv_tag.c index d69ba31b0..c0a0d6a67 100644 --- a/skeletons/ber_tlv_tag.c +++ b/skeletons/ber_tlv_tag.c @@ -30,8 +30,8 @@ ber_fetch_tag(void *ptr, size_t size, ber_tlv_tag_t *tag_r) { * Each octet contains 7 bits of useful information. * The MSB is 0 if it is the last octet of the tag. */ - for(val = 0, ((char *)ptr)++, skipped = 2; - skipped <= size; ((char *)ptr)++, skipped++) { + for(val = 0, ptr = ((char *)ptr) + 1, skipped = 2; + skipped <= size; ptr = ((char *)ptr) + 1, skipped++) { unsigned int oct = *(uint8_t *)ptr; if(oct & 0x80) { val = (val << 7) | (oct & 0x7F); diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 140e365d9..cec0b8aad 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -31,7 +31,7 @@ */ #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ - (char *)ptr += num; \ + ptr = ((char *)ptr) + num; \ size -= num; \ if(ctx->left >= 0) \ ctx->left -= num; \ diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 87d5ab660..d1eb0297b 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -31,7 +31,7 @@ */ #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ - (char *)ptr += num; \ + ptr = ((char *)ptr) + num; \ size -= num; \ if(ctx->left >= 0) \ ctx->left -= num; \ diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index ba42a4ffa..67816a773 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -37,7 +37,7 @@ */ #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ - (char *)ptr += num; \ + ptr = ((char *)ptr) + num; \ size -= num; \ if(ctx->left >= 0) \ ctx->left -= num; \ diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index e0c898da7..d8dadf50e 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -31,7 +31,7 @@ */ #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ - (char *)ptr += num; \ + ptr = ((char *)ptr) + num; \ size -= num; \ if(ctx->left >= 0) \ ctx->left -= num; \ From 8f611dc9942ce04dd41529314454a52777b77b21 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 25 Aug 2004 01:58:01 +0000 Subject: [PATCH 0213/1469] version bump-up git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@213 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/configure b/configure index 5519f21de..290e0ec24 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.9.1 + VERSION=0.9.2 cat >>confdefs.h <<_ACEOF @@ -21394,15 +21394,13 @@ fi case "$host_os" in cygwin*) - CFLAGS="$CFLAGS -DWIN32" - case "$target" in + case "$target" in *mingw*) CC="$CC -mno-cygwin" esac ;; mingw* | p32*) - CFLAGS="$CFLAGS -DWIN32" - ;; + ;; esac # Check whether --enable-autoconf or --disable-autoconf was given. From 3ddcc1cae6e82b9910b1ee18b602a144fcdb382a Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 25 Aug 2004 01:58:59 +0000 Subject: [PATCH 0214/1469] separated known multiplier (X.691) strings git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@214 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_expr.h | 21 ++++++++++++--------- libasn1parser/asn1p_expr_str.h | 14 +++++++------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/libasn1parser/asn1p_expr.h b/libasn1parser/asn1p_expr.h index e00e740ca..fd1435066 100644 --- a/libasn1parser/asn1p_expr.h +++ b/libasn1parser/asn1p_expr.h @@ -53,6 +53,7 @@ typedef enum asn1p_expr_type { ASN_CONSTR_SEQUENCE_OF, /* SEQUENCE OF */ ASN_CONSTR_SET_OF, /* SET OF */ ASN_CONSTR_ANY, /* ANY (deprecated) */ + /* * ASN.1 Basic types */ @@ -75,20 +76,22 @@ typedef enum asn1p_expr_type { /* * ASN.1 String types */ -#define ASN_STRING_MASK 0x40 /* Every string type */ - ASN_STRING_BMPString = ASN_STRING_MASK, +#define ASN_STRING_KM_MASK 0x40 /* Known multiplier */ +#define ASN_STRING_NKM_MASK 0x80 /* Not a known multiplier */ +#define ASN_STRING_MASK 0xC0 /* Every restricted string type */ + ASN_STRING_IA5String = ASN_STRING_KM_MASK, + ASN_STRING_PrintableString, + ASN_STRING_VisibleString, + ASN_STRING_ISO646String, /* aka VisibleString */ + ASN_STRING_NumericString, + ASN_STRING_UniversalString, + ASN_STRING_BMPString, + ASN_STRING_UTF8String = ASN_STRING_NKM_MASK, ASN_STRING_GeneralString, ASN_STRING_GraphicString, - ASN_STRING_IA5String, - ASN_STRING_ISO646String, - ASN_STRING_NumericString, - ASN_STRING_PrintableString, ASN_STRING_TeletexString, ASN_STRING_T61String, - ASN_STRING_UniversalString, - ASN_STRING_UTF8String, ASN_STRING_VideotexString, - ASN_STRING_VisibleString, ASN_STRING_ObjectDescriptor, ASN_EXPR_TYPE_MAX } asn1p_expr_type_e; diff --git a/libasn1parser/asn1p_expr_str.h b/libasn1parser/asn1p_expr_str.h index 93567f88c..59899f5ab 100644 --- a/libasn1parser/asn1p_expr_str.h +++ b/libasn1parser/asn1p_expr_str.h @@ -26,19 +26,19 @@ static char *asn1p_expr_type2str[] __attribute__ ((unused)) = { [ ASN_BASIC_CHARACTER_STRING ] = "CHARACTER STRING", [ ASN_BASIC_UTCTime ] = "UTCTime", [ ASN_BASIC_GeneralizedTime ] = "GeneralizedTime", - [ ASN_STRING_BMPString ] = "BMPString", - [ ASN_STRING_GeneralString ] = "GeneralString", - [ ASN_STRING_GraphicString ] = "GraphicString", [ ASN_STRING_IA5String ] = "IA5String", + [ ASN_STRING_PrintableString ] = "PrintableString", + [ ASN_STRING_VisibleString ] = "VisibleString", [ ASN_STRING_ISO646String ] = "ISO646String", [ ASN_STRING_NumericString ] = "NumericString", - [ ASN_STRING_PrintableString ] = "PrintableString", - [ ASN_STRING_TeletexString ] = "TeletexString", - [ ASN_STRING_T61String ] = "T61String", [ ASN_STRING_UniversalString ] = "UniversalString", + [ ASN_STRING_BMPString ] = "BMPString", [ ASN_STRING_UTF8String ] = "UTF8String", + [ ASN_STRING_GeneralString ] = "GeneralString", + [ ASN_STRING_GraphicString ] = "GraphicString", + [ ASN_STRING_TeletexString ] = "TeletexString", + [ ASN_STRING_T61String ] = "T61String", [ ASN_STRING_VideotexString ] = "VideotexString", - [ ASN_STRING_VisibleString ] = "VisibleString", [ ASN_STRING_ObjectDescriptor ] = "ObjectDescriptor", }; From eeca98f2276849d23bd84410a8dce57da1fe4b20 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 25 Aug 2004 02:00:03 +0000 Subject: [PATCH 0215/1469] explain practical constraints too git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@215 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1print/asn1print.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index 143cfdb83..c90e96655 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -366,14 +366,21 @@ asn1print_crange_value(asn1cnst_edge_t *edge, int as_char) { } static int -asn1print_constraint_explain_type(asn1p_expr_type_e expr_type, asn1p_constraint_t *ct, enum asn1p_constraint_type_e type) { +asn1print_constraint_explain_type(asn1p_expr_type_e expr_type, asn1p_constraint_t *ct, enum asn1p_constraint_type_e type, int strict_PER_visible) { asn1cnst_range_t *range; int as_char = (type==ACT_CT_FROM); int i; - range = asn1constraint_compute_PER_range(expr_type, ct, type, 0, 0); + range = asn1constraint_compute_PER_range(expr_type, ct, type, + 0, 0, strict_PER_visible); if(!range) return -1; + if(range->incompatible + || (strict_PER_visible && range->not_PER_visible)) { + asn1constraint_range_free(range); + return 0; + } + switch(type) { case ACT_CT_FROM: printf("(FROM("); break; case ACT_CT_SIZE: printf("(SIZE("); break; @@ -410,13 +417,13 @@ asn1print_constraint_explain_type(asn1p_expr_type_e expr_type, asn1p_constraint_ static int asn1print_constraint_explain(asn1p_expr_type_e expr_type, - asn1p_constraint_t *ct) { + asn1p_constraint_t *ct, int s_PV) { - asn1print_constraint_explain_type(expr_type, ct, ACT_EL_RANGE); + asn1print_constraint_explain_type(expr_type, ct, ACT_EL_RANGE, s_PV); printf(" "); - asn1print_constraint_explain_type(expr_type, ct, ACT_CT_SIZE); + asn1print_constraint_explain_type(expr_type, ct, ACT_CT_SIZE, s_PV); printf(" "); - asn1print_constraint_explain_type(expr_type, ct, ACT_CT_FROM); + asn1print_constraint_explain_type(expr_type, ct, ACT_CT_FROM, s_PV); return 0; } @@ -564,10 +571,14 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri top_parent = asn1f_find_terminal_type_ex(asn, mod, tc); if(top_parent) { + printf("\n-- Practical constraints (%s): ", + top_parent->Identifier); + asn1print_constraint_explain(top_parent->expr_type, + tc->combined_constraints, 0); printf("\n-- PER-visible constraints (%s): ", top_parent->Identifier); asn1print_constraint_explain(top_parent->expr_type, - tc->combined_constraints); + tc->combined_constraints, 1); } printf("\n"); } From 4e55499b660d00f406e3db03496ffabdd3949410 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 25 Aug 2004 02:03:12 +0000 Subject: [PATCH 0216/1469] refactoring git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@216 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 287 ++++++++++++++++++-------------------- 1 file changed, 135 insertions(+), 152 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index eaac64423..4948016ad 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -19,8 +19,6 @@ typedef struct tag2el_s { static int _fill_tag2el_map(arg_t *arg, tag2el_t **tag2el, int *count, int el_no); static int _add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no); -static int _expr_elements_count(arg_t *arg, asn1p_expr_t *expr); -static int _emit_member_table(arg_t *arg, asn1p_expr_t *expr); static int asn1c_lang_C_type_SEQUENCE_def(arg_t *arg); static int asn1c_lang_C_type_SET_def(arg_t *arg); @@ -28,9 +26,23 @@ static int asn1c_lang_C_type_CHOICE_def(arg_t *arg); static int asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of); static int _print_tag(arg_t *arg, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag_p); static int check_if_extensible(asn1p_expr_t *expr); +static int expr_elements_count(arg_t *arg, asn1p_expr_t *expr); +static int emit_member_table(arg_t *arg, asn1p_expr_t *expr); static int emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int *tags_impl_skip, int choice_mode); static int emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count); +enum etd_cp { + ETD_CP_UNKNOWN = -2, + ETD_CP_EITHER = -1, + ETD_CP_PRIMITIVE = 0, + ETD_CP_CONSTRUCTED = 1, +}; +enum etd_spec { + ETD_NO_SPECIFICS, + ETD_HAS_SPECIFICS +}; +static int emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, int tags_count, int tags_impl_skip, int elements_count, enum etd_cp, enum etd_spec); + #define C99_MODE (!(arg->flags & A1C_NO_C99)) #define UNNAMED_UNIONS (arg->flags & A1C_UNNAMED_UNIONS) @@ -193,7 +205,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { continue; } elements++; - _emit_member_table(arg, v); + emit_member_table(arg, v); }); OUT("};\n"); @@ -220,32 +232,12 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { (ext_stop_anonymous_type?"":expr->Identifier); - OUT("SEQUENCE_constraint,\n"); - OUT("SEQUENCE_decode_ber,\n"); - OUT("SEQUENCE_encode_der,\n"); - OUT("SEQUENCE_print,\n"); - OUT("SEQUENCE_free,\n"); - OUT("0,\t/* Use generic outmost tag fetcher */\n"); - if(tags_count) { - OUT("asn1_DEF_%s_tags,\n", p); - OUT("sizeof(asn1_DEF_%s_tags)\n", p); - OUT("\t/sizeof(asn1_DEF_%s_tags[0]), /* %d */\n", - p, tags_count); - } else { - OUT("0,\t/* No explicit tags (pointer) */\n"); - OUT("0,\t/* No explicit tags (count) */\n"); - } - OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); - OUT("%d,\t/* Whether CONSTRUCTED */\n", 1); - OUT("asn1_MBR_%s,\n", p); - OUT("%d,\t/* Elements count */\n", elements); - OUT("&asn1_DEF_%s_specs\t/* Additional specs */\n", p); - ); - OUT("};\n"); - OUT("\n"); + + /* + * Emit asn1_DEF_xxx table. + */ + emit_type_DEF(arg, expr, tags_count, tags_impl_skip, elements, + ETD_CP_CONSTRUCTED, ETD_HAS_SPECIFICS); REDIR(OT_TYPE_DECLS); @@ -360,7 +352,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { continue; } elements++; - _emit_member_table(arg, v); + emit_member_table(arg, v); }); OUT("};\n"); @@ -417,32 +409,12 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { OUT("(unsigned int *)asn1_DEF_%s_mmap\t/* Mandatory elements map */\n", p); ); OUT("};\n"); - OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p); - INDENTED( - OUT("\"%s\",\n", expr->_anonymous_type?"":expr->Identifier); - OUT("SET_constraint,\n"); - OUT("SET_decode_ber,\n"); - OUT("SET_encode_der,\n"); - OUT("SET_print,\n"); - OUT("SET_free,\n"); - OUT("0,\t/* Use generic outmost tag fetcher */\n"); - if(tags_count) { - OUT("asn1_DEF_%s_tags,\n", p); - OUT("sizeof(asn1_DEF_%s_tags)\n", p); - OUT("\t/sizeof(asn1_DEF_%s_tags[0]), /* %d */\n", - p, tags_count); - } else { - OUT("0,\t/* No explicit tags (pointer) */\n"); - OUT("0,\t/* No explicit tags (count) */\n"); - } - OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); - OUT("%d,\t/* Whether CONSTRUCTED */\n", 1); - OUT("asn1_MBR_%s,\n", p); - OUT("%d,\t/* Elements count */\n", elements); - OUT("&asn1_DEF_%s_specs\t/* Additional specs */\n", p); - ); - OUT("};\n"); - OUT("\n"); + + /* + * Emit asn1_DEF_xxx table. + */ + emit_type_DEF(arg, expr, tags_count, tags_impl_skip, elements, + ETD_CP_CONSTRUCTED, ETD_HAS_SPECIFICS); REDIR(OT_TYPE_DECLS); @@ -531,7 +503,7 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { INDENTED( v = TQ_FIRST(&(expr->members)); - _emit_member_table(arg, v); + emit_member_table(arg, v); ); OUT("};\n"); @@ -547,40 +519,12 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { OUT("offsetof(struct %s, _ber_dec_ctx),\n", p); ); OUT("};\n"); - OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p); - INDENTED( - OUT("\"%s\",\n", expr->_anonymous_type?"":expr->Identifier); - if(seq_of) { - OUT("SEQUENCE_OF_constraint,\n"); - OUT("SEQUENCE_OF_decode_ber,\n"); - OUT("SEQUENCE_OF_encode_der,\n"); - OUT("SEQUENCE_OF_print,\n"); - OUT("SEQUENCE_OF_free,\n"); - } else { - OUT("SET_OF_constraint,\n"); - OUT("SET_OF_decode_ber,\n"); - OUT("SET_OF_encode_der,\n"); - OUT("SET_OF_print,\n"); - OUT("SET_OF_free,\n"); - } - OUT("0,\t/* Use generic outmost tag fetcher */\n"); - if(tags_count) { - OUT("asn1_DEF_%s_tags,\n", p); - OUT("sizeof(asn1_DEF_%s_tags)\n", p); - OUT("\t/sizeof(asn1_DEF_%s_tags[0]), /* %d */\n", - p, tags_count); - } else { - OUT("0,\t/* No explicit tags (pointer) */\n"); - OUT("0,\t/* No explicit tags (count) */\n"); - } - OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); - OUT("%d,\t/* Whether CONSTRUCTED */\n", 1); - OUT("asn1_MBR_%s,\n", p); - OUT("1,\t/* Single element */\n"); - OUT("&asn1_DEF_%s_specs\t/* Additional specs */\n", p); - ); - OUT("};\n"); - OUT("\n"); + + /* + * Emit asn1_DEF_xxx table. + */ + emit_type_DEF(arg, expr, tags_count, tags_impl_skip, 1, + ETD_CP_CONSTRUCTED, ETD_HAS_SPECIFICS); REDIR(OT_TYPE_DECLS); @@ -684,7 +628,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { continue; } elements++; - _emit_member_table(arg, v); + emit_member_table(arg, v); }); OUT("};\n"); @@ -716,32 +660,12 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { check_if_extensible(expr)); ); OUT("};\n"); - OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p); - INDENTED( - OUT("\"%s\",\n", expr->_anonymous_type?"":expr->Identifier); - OUT("CHOICE_constraint,\n"); - OUT("CHOICE_decode_ber,\n"); - OUT("CHOICE_encode_der,\n"); - OUT("CHOICE_print,\n"); - OUT("CHOICE_free,\n"); - OUT("CHOICE_outmost_tag,\n"); - if(tags_count) { - OUT("asn1_DEF_%s_tags,\n", p); - OUT("sizeof(asn1_DEF_%s_tags)\n", p); - OUT("\t/sizeof(asn1_DEF_%s_tags[0]), /* %d */\n", - p, tags_count); - } else { - OUT("0,\t/* No explicit tags (pointer) */\n"); - OUT("0,\t/* No explicit tags (count) */\n"); - } - OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); - OUT("%d,\t/* Whether CONSTRUCTED */\n", 1); - OUT("asn1_MBR_%s,\n", p); - OUT("%d,\t/* Elements count */\n", elements); - OUT("&asn1_DEF_%s_specs\t/* Additional specs */\n", p); - ); - OUT("};\n"); - OUT("\n"); + + /* + * Emit asn1_DEF_xxx table. + */ + emit_type_DEF(arg, expr, tags_count, tags_impl_skip, elements, + ETD_CP_CONSTRUCTED /*either?!*/, ETD_HAS_SPECIFICS); REDIR(OT_TYPE_DECLS); @@ -829,35 +753,8 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { */ tags_count = emit_tags_vector(arg, expr, &tags_impl_skip, 0); - p = MKID(expr->Identifier); - OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p); - INDENTED( - OUT("\"%s\",\n", expr->_anonymous_type?"":expr->Identifier); - OUT("%s_constraint,\n", p); - OUT("%s_decode_ber,\n", p); - OUT("%s_encode_der,\n", p); - OUT("%s_print,\n", p); - OUT("%s_free,\n", p); - OUT("0,\t/* Use generic outmost tag fetcher */\n"); - if(tags_count) { - OUT("asn1_DEF_%s_tags,\n", p); - OUT("sizeof(asn1_DEF_%s_tags)\n", p); - OUT("\t/sizeof(asn1_DEF_%s_tags[0]), /* %d */\n", - p, tags_count); - } else { - OUT("0,\t/* No explicit tags (pointer) */\n"); - OUT("0,\t/* No explicit tags (count) */\n"); - } - OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); - OUT("-0,\t/* Unknown yet */\n"); - if(_expr_elements_count(arg, expr)) - OUT("0, 0,\t/* Defined elsewhere */\n"); - else - OUT("0, 0,\t/* No members */\n"); - OUT("0\t/* No specifics */\n"); - ); - OUT("};\n"); - OUT("\n"); + emit_type_DEF(arg, expr, tags_count, tags_impl_skip, 0, + ETD_CP_UNKNOWN, ETD_NO_SPECIFICS); REDIR(OT_CODE); @@ -1264,7 +1161,7 @@ emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int *tags_impl_skip, int choice } static int -_expr_elements_count(arg_t *arg, asn1p_expr_t *expr) { +expr_elements_count(arg_t *arg, asn1p_expr_t *expr) { asn1p_expr_t *topmost_parent; asn1p_expr_t *v; int elements = 0; @@ -1284,7 +1181,7 @@ _expr_elements_count(arg_t *arg, asn1p_expr_t *expr) { } static int -_emit_member_table(arg_t *arg, asn1p_expr_t *expr) { +emit_member_table(arg_t *arg, asn1p_expr_t *expr) { static int global_memb_unique; int save_target; arg_t tmp_arg; @@ -1332,16 +1229,19 @@ _emit_member_table(arg_t *arg, asn1p_expr_t *expr) { || arg->expr->expr_type == ASN_CONSTR_SET_OF)) { OUT("(void *)&asn1_DEF_%s_member,\n", MKID(arg->expr->Identifier)); + } else if(expr->expr_type & ASN_CONSTR_MASK) { + OUT("(void *)&asn1_DEF_%s,\n", + MKID(expr->Identifier)); } else { OUT("(void *)&asn1_DEF_%s,\n", asn1c_type_name(arg, expr, TNF_SAFE)); } if(C99_MODE) OUT(".memb_constraints = "); if(expr->constraints) { - p = MKID(expr->Identifier); + char *id = MKID(expr->Identifier); if(!expr->Identifier) - p = asn1c_type_name(arg, expr, TNF_SAFE); - OUT("memb_%s_%d_constraint,\n", p, + id = asn1c_type_name(arg, expr, TNF_SAFE); + OUT("memb_%s_%d_constraint,\n", id, ++global_memb_unique); } else { OUT("0,\t/* Defer to actual type */\n"); @@ -1379,3 +1279,86 @@ _emit_member_table(arg_t *arg, asn1p_expr_t *expr) { return 0; } + +static int +emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, int tags_count, int tags_impl_skip, int elements_count, enum etd_cp cp, enum etd_spec spec) { + char *p; + + p = MKID(expr->Identifier); + OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p); + INDENTED( + OUT("\"%s\",\n", expr->_anonymous_type?"":expr->Identifier); + + if(expr->expr_type & ASN_CONSTR_MASK) { + p = asn1c_type_name(arg, arg->expr, TNF_SAFE); + } + + OUT("%s_constraint,\n", p); + OUT("%s_decode_ber,\n", p); + OUT("%s_encode_der,\n", p); + OUT("%s_print,\n", p); + OUT("%s_free,\n", p); + + p = MKID(expr->Identifier); + + if(expr->expr_type == ASN_CONSTR_CHOICE) { + OUT("CHOICE_outmost_tag,\n"); + } else { + OUT("0,\t/* Use generic outmost tag fetcher */\n"); + } + + if(tags_count) { + OUT("asn1_DEF_%s_tags,\n", p); + OUT("sizeof(asn1_DEF_%s_tags)\n", p); + OUT("\t/sizeof(asn1_DEF_%s_tags[0]), /* %d */\n", + p, tags_count); + } else { + OUT("0,\t/* No explicit tags (pointer) */\n"); + OUT("0,\t/* No explicit tags (count) */\n"); + } + + OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); + switch(cp) { + case ETD_CP_UNKNOWN: + OUT("-0,\t/* Unknown yet */\n"); + break; + case ETD_CP_EITHER: + OUT("-1,\t/* Primitive or constructed */\n"); + case ETD_CP_PRIMITIVE: + OUT("0,\t/* Primitive */\n"); + break; + case ETD_CP_CONSTRUCTED: + OUT("1,\t/* Whether CONSTRUCTED */\n"); + break; + } + + if(elements_count) { + OUT("asn1_MBR_%s,\n", p); + if(expr->expr_type == ASN_CONSTR_SEQUENCE_OF + || expr->expr_type == ASN_CONSTR_SET_OF) { + OUT("%d,\t/* Single element */\n", + elements_count); + assert(elements_count == 1); + } else { + OUT("%d,\t/* Elements count */\n", + elements_count); + } + } else { + //if(expr->meta_type == AMT_TYPEREF) + if(expr_elements_count(arg, expr)) + OUT("0, 0,\t/* Defined elsewhere */\n"); + else + OUT("0, 0,\t/* No members */\n"); + } + + switch(spec) { + case ETD_NO_SPECIFICS: + OUT("0\t/* No specifics */\n"); + break; + case ETD_HAS_SPECIFICS: + OUT("&asn1_DEF_%s_specs\t/* Additional specs */\n", p); + } + ); + OUT("};\n"); + OUT("\n"); +} From c161f0c3b33de7788872262af5e96af4243f7af4 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 25 Aug 2004 02:03:26 +0000 Subject: [PATCH 0217/1469] slightly different semantics git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@217 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_misc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libasn1compiler/asn1c_misc.c b/libasn1compiler/asn1c_misc.c index 28e46920c..14a3649e1 100644 --- a/libasn1compiler/asn1c_misc.c +++ b/libasn1compiler/asn1c_misc.c @@ -121,6 +121,7 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { _format = TNF_CTYPE; } break; +#if 0 case ASN_CONSTR_SEQUENCE_OF: case ASN_CONSTR_SET_OF: if(expr->Identifier) { @@ -135,6 +136,7 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { typename = child->Identifier; } break; +#endif case ASN_BASIC_INTEGER: case ASN_BASIC_ENUMERATED: if((arg->flags & A1C_USE_NATIVE_INTEGERS)) { @@ -151,7 +153,8 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { } /* Fall through */ default: - if(expr->expr_type & (ASN_BASIC_MASK | ASN_STRING_MASK)) { + if(expr->expr_type + & (ASN_CONSTR_MASK | ASN_BASIC_MASK | ASN_STRING_MASK)) { if(_format == TNF_RSAFE) _format = TNF_CTYPE; typename = ASN_EXPR_TYPE2STR(expr->expr_type); From 5d6d4b8fb88078cebdbdf692238a6757e01e4e16 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 25 Aug 2004 02:03:59 +0000 Subject: [PATCH 0218/1469] better semantics git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@218 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_constraint.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index 36b277586..beb874563 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -33,11 +33,10 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { etype = _find_terminal_type(arg); - r_value=asn1constraint_compute_PER_range(etype, ct, ACT_EL_RANGE, 0, 0); - r_size = asn1constraint_compute_PER_range(etype, ct, ACT_CT_SIZE, 0, 0); + r_value=asn1constraint_compute_PER_range(etype, ct, ACT_EL_RANGE,0,0,0); + r_size = asn1constraint_compute_PER_range(etype, ct, ACT_CT_SIZE,0,0,0); if(r_value) { - if(r_value->not_PER_visible - || r_value->extensible + if(r_value->incompatible || r_value->empty_constraint || (r_value->left.type == ARE_MIN && r_value->right.type == ARE_MAX) @@ -50,8 +49,7 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { } } if(r_size) { - if(r_size->not_PER_visible - || r_size->extensible + if(r_size->incompatible || r_size->empty_constraint || (r_size->left.value == 0 /* or .type == MIN */ && r_size->right.type == ARE_MAX) @@ -200,11 +198,10 @@ asn1c_emit_constraint_tables(arg_t *arg, int got_size) { etype = _find_terminal_type(arg); - range = asn1constraint_compute_PER_range(etype, ct, ACT_CT_FROM, 0, 0); + range = asn1constraint_compute_PER_range(etype, ct, ACT_CT_FROM, 0,0,0); if(!range) return 0; - if(range->not_PER_visible - || range->extensible + if(range->incompatible || range->empty_constraint) { asn1constraint_range_free(range); return 0; From 1b406f589f7d2eba63ba10740546e609161440b1 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 25 Aug 2004 02:04:39 +0000 Subject: [PATCH 0219/1469] api change git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@219 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libasn1fix/asn1fix.c b/libasn1fix/asn1fix.c index d79fd3caa..46a32727b 100644 --- a/libasn1fix/asn1fix.c +++ b/libasn1fix/asn1fix.c @@ -336,9 +336,9 @@ asn1f_check_constraints(arg_t *arg) { for(i = 0; i < sizeof(test_types)/sizeof(test_types[0]); i++) { range = asn1constraint_compute_PER_range( - top_parent->expr_type, + etype, arg->expr->combined_constraints, - test_types[i], 0, 0); + test_types[i], 0, 0, 0); if(!range && errno == EPERM) return -1; asn1constraint_range_free(range); From ee8b06f1b21b5ac7e9774a198def1d3e7806ddb0 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 25 Aug 2004 02:05:28 +0000 Subject: [PATCH 0220/1469] introducing less strict semantics git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@220 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_constraint_compat.c | 60 ++++++-- libasn1fix/asn1fix_crange.c | 189 +++++++++++++++++++------ libasn1fix/asn1fix_crange.h | 10 +- 3 files changed, 200 insertions(+), 59 deletions(-) diff --git a/libasn1fix/asn1fix_constraint_compat.c b/libasn1fix/asn1fix_constraint_compat.c index f2f47fd1b..effa0ad57 100644 --- a/libasn1fix/asn1fix_constraint_compat.c +++ b/libasn1fix/asn1fix_constraint_compat.c @@ -88,17 +88,21 @@ asn1constraint_compatible(asn1p_expr_type_e expr_type, } -#define DECL(foo, val1, val2) \ +#define DECL_RANGE(foo, val1, val2, pv) \ static asn1cnst_range_t range_ ## foo = { \ { ARE_VALUE, 0, val1 }, \ { ARE_VALUE, 0, val2 }, \ - 0, 0, 0, 0, 0, 0 } + 0, 0, 0, 0, 0, 0, pv } + +#define DECL(foo, val1, val2) DECL_RANGE(foo, val1, val2, 0) +#define DECL_notPV(foo, val1, val2) DECL_RANGE(foo, val1, val2, 1) asn1cnst_range_t * asn1constraint_default_alphabet(asn1p_expr_type_e expr_type) { + DECL_notPV(octstr, 0x00, 0xff); /* Not PER-visible */ + DECL_notPV(utf8, 0x00, 0x7fffffff); /* Not PER-visible */ + DECL(bmp, 0x00, 65533); /* 64K-2 cells */ DECL(uint7, 0x00, 0x7f); - DECL(uint8, 0x00, 0xff); - DECL(uint16, 0x00, 0xffff); DECL(uint31, 0x00, 0x7fffffff); DECL(Space, 0x20, 0x20); DECL(ApostropheAndParens, 0x27, 0x29); @@ -127,38 +131,43 @@ asn1constraint_default_alphabet(asn1p_expr_type_e expr_type) { &range_Plus, &range_MinusDot, &range_Digits, &range_Z }; static asn1cnst_range_t *range_GeneralizedTime_array[] = { &range_PlusCommaMinusDot, &range_Digits, &range_Z }; + + static asn1cnst_range_t range_notPERVisible = { + { ARE_MIN, 0, 0 }, + { ARE_MAX, 0, 0 }, + 0, 0, 0, 0, 0, 0, 1 }; static asn1cnst_range_t range_NumericString = { { ARE_VALUE, 0, 0x20 }, { ARE_VALUE, 0, 0x39 }, range_NumericString_array, sizeof(range_NumericString_array) /sizeof(range_NumericString_array[0]), - 0, 0, 0, 0 }; + 0, 0, 0, 0, 0 }; static asn1cnst_range_t range_PrintableString = { { ARE_VALUE, 0, 0x20 }, { ARE_VALUE, 0, 0x7a }, range_PrintableString_array, sizeof(range_PrintableString_array) /sizeof(range_PrintableString_array[0]), - 0, 0, 0, 0 }; + 0, 0, 0, 0, 0 }; static asn1cnst_range_t range_VisibleString = { { ARE_VALUE, 0, 0x20 }, { ARE_VALUE, 0, 0x7e }, - 0, 0, 0, 0, 0, 0 }; + 0, 0, 0, 0, 0, 0, 0 }; static asn1cnst_range_t range_UTCTime = { { ARE_VALUE, 0, 0x2b }, { ARE_VALUE, 0, 0x5a }, range_UTCTime_array, sizeof(range_UTCTime_array) /sizeof(range_UTCTime_array[0]), - 0, 0, 0, 0 }; + 0, 0, 0, 0, 1 }; static asn1cnst_range_t range_GeneralizedTime = { { ARE_VALUE, 0, 0x2b }, { ARE_VALUE, 0, 0x5a }, range_GeneralizedTime_array, sizeof(range_GeneralizedTime_array) /sizeof(range_GeneralizedTime_array[0]), - 0, 0, 0, 0 }; + 0, 0, 0, 0, 1 }; switch(expr_type) { case ASN_STRING_NumericString: @@ -169,19 +178,42 @@ asn1constraint_default_alphabet(asn1p_expr_type_e expr_type) { return &range_VisibleString; case ASN_STRING_IA5String: return &range_uint7; - case ASN_BASIC_OCTET_STRING: - return &range_uint8; case ASN_STRING_BMPString: - return &range_uint16; - case ASN_STRING_UniversalString: + return &range_bmp; case ASN_STRING_UTF8String: + /* + * X.691, #9.3.6 + * Not a known-multipler character string type. + */ + assert(range_utf8.not_PER_visible); + return &range_utf8; + case ASN_STRING_UniversalString: return &range_uint31; case ASN_BASIC_UTCTime: + /* Permitted alphabet constraint is not applicable */ + assert(range_UTCTime.not_PER_visible); return &range_UTCTime; case ASN_BASIC_GeneralizedTime: + /* Permitted alphabet constraint is not applicable */ + assert(range_GeneralizedTime.not_PER_visible); return &range_GeneralizedTime; + case ASN_BASIC_OCTET_STRING: + /* + * Permitted alphabet constraint is not applicable + * to this type. However, we support it, albeit not + * in a strict PER mode. + */ + assert(range_octstr.not_PER_visible); + return &range_octstr; default: - break; + if(!(expr_type & ASN_STRING_MASK)) + break; + assert(expr_type & ASN_STRING_NKM_MASK); + /* + * X.691, 9.3.6 + * Not a known-multiplier character string. + */ + return &range_notPERVisible; } return NULL; diff --git a/libasn1fix/asn1fix_crange.c b/libasn1fix/asn1fix_crange.c index 3032799b2..6ef8c8ac2 100644 --- a/libasn1fix/asn1fix_crange.c +++ b/libasn1fix/asn1fix_crange.c @@ -167,11 +167,20 @@ _range_print(const asn1cnst_range_t *range) { if(_edge_compare(&range->left, &range->right)) { printf("(%s.", _edge_value(&range->left)); - printf(".%s)", _edge_value(&range->right)); + printf(".%s", _edge_value(&range->right)); } else { - printf("(%s)", _edge_value(&range->left)); + printf("(%s", _edge_value(&range->left)); } + if(range->extensible) { + printf(",...)"); + } else { + printf(")"); + } + + if(range->incompatible) printf("/I"); + if(range->not_PER_visible) printf("/!V"); + if(range->el_count) { int i; printf("-=>"); @@ -232,6 +241,9 @@ static int _range_merge_in(asn1cnst_range_t *into, asn1cnst_range_t *cr) { int prev_count = into->el_count; int i; + into->not_PER_visible |= cr->not_PER_visible; + into->extensible |= cr->extensible; + /* * Add the element OR all its children "into". */ @@ -481,8 +493,15 @@ _range_intersection(asn1cnst_range_t *range, const asn1cnst_range_t *with, int s int ret; int i, j; - if(with->empty_constraint || range->empty_constraint) { - range->empty_constraint = 1; /* Propagate error */ + assert(!range->incompatible); + + /* Propagate errors */ + range->extensible |= with->extensible; + range->not_PER_visible |= with->not_PER_visible; + range->empty_constraint |= with->empty_constraint; + + if(range->empty_constraint) { + /* No use in intersecting empty constraints */ return 0; } @@ -609,7 +628,7 @@ _range_union(asn1cnst_range_t *range) { * Still, range may be joined: (1..4)(5..10). * This logic is valid only for whole numbers * (i.e., not REAL type, but REAL constraints - * are not PER-visible (X.691, 9.3.12). + * are not PER-visible (X.691, #9.3.12). */ if(ra->right.type == ARE_VALUE && rb->left.type == ARE_VALUE @@ -674,7 +693,7 @@ _range_canonicalize(asn1cnst_range_t *range) { } asn1cnst_range_t * -asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constraint_t *ct, enum asn1p_constraint_type_e type, const asn1cnst_range_t *minmax, int *exmet) { +asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constraint_t *ct, enum asn1p_constraint_type_e type, const asn1cnst_range_t *minmax, int *exmet, int strict_PV) { asn1cnst_range_t *range; asn1cnst_range_t *tmp; asn1p_value_t *vmin; @@ -689,7 +708,8 @@ asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constr } /* - * Check if the requested constraint is compatible with expression type. + * Check if the requested constraint is theoretically compatible + * with the given expression type. */ if(asn1constraint_compatible(expr_type, type) != 1) { errno = EINVAL; @@ -730,7 +750,15 @@ asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constr range = _range_new(); } - if(!ct || range->not_PER_visible) + /* + * X.691, #9.3.6 + * Constraints on restricter character string types + * which are not known-multiplier are not PER-visible. + */ + if((expr_type & ASN_STRING_NKM_MASK)) + range->not_PER_visible = 1; + + if(!ct || (strict_PV && range->not_PER_visible)) return range; switch(ct->type) { @@ -746,9 +774,11 @@ asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constr break; case ACT_EL_EXT: if(!*exmet) { - range->not_PER_visible = 1; + range->incompatible = 1; } else { - range->extensible = 1; + _range_free(range); + errno = ERANGE; + range = 0; } return range; case ACT_CT_SIZE: @@ -756,12 +786,24 @@ asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constr if(type == ct->type) { *exmet = 1; } else { - range->not_PER_visible = 1; + range->incompatible = 1; return range; } assert(ct->el_count == 1); - return asn1constraint_compute_PER_range(expr_type, - ct->elements[0], type, minmax, exmet); + tmp = asn1constraint_compute_PER_range(expr_type, + ct->elements[0], type, minmax, exmet, strict_PV); + if(tmp) { + _range_free(range); + } else { + if(errno == ERANGE) { + range->empty_constraint = 1; + range->extensible = 1; + tmp = range; + } else { + _range_free(range); + } + } + return tmp; case ACT_CA_SET: /* (10..20)(15..17) */ case ACT_CA_INT: /* SIZE(1..2) ^ FROM("ABCD") */ @@ -769,13 +811,29 @@ asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constr for(i = 0; i < ct->el_count; i++) { tmp = asn1constraint_compute_PER_range(expr_type, ct->elements[i], type, - ct->type==ACT_CA_SET?range:minmax, exmet); + ct->type==ACT_CA_SET?range:minmax, exmet, + strict_PV); if(!tmp) { - _range_free(range); - return NULL; + if(errno == ERANGE) { + continue; + } else { + _range_free(range); + return NULL; + } } - if(tmp->not_PER_visible) { + if(tmp->incompatible) { + /* + * Ignore constraints + * incompatible with arguments: + * SIZE(1..2) ^ FROM("ABCD") + * either SIZE or FROM will be ignored. + */ + _range_free(tmp); + continue; + } + + if(strict_PV && tmp->not_PER_visible) { if(ct->type == ACT_CA_SET) { /* * X.691, #9.3.18: @@ -791,17 +849,6 @@ asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constr continue; } - range->extensible |= tmp->extensible; - - if(tmp->extensible && type == ACT_CT_FROM) { - /* - * X.691, #9.3.10: - * Extensible permitted alphabet constraints - * are not PER-visible. - */ - range->not_PER_visible = 1; - } - ret = _range_intersection(range, tmp, ct->type == ACT_CA_SET); _range_free(tmp); @@ -817,40 +864,100 @@ asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constr case ACT_CA_CSV: /* SIZE(1..2, 3..4) */ case ACT_CA_UNI: /* SIZE(1..2) | FROM("ABCD") */ - /* Merge everything. Canonicalizator will do union magic */ + /* + * Grab the first valid constraint. + */ + tmp = 0; for(i = 0; i < ct->el_count; i++) { tmp = asn1constraint_compute_PER_range(expr_type, - ct->elements[i], type, minmax, exmet); + ct->elements[i], type, minmax, exmet, + strict_PV); if(!tmp) { - _range_free(range); - return NULL; + if(errno == ERANGE) { + range->extensible = 1; + continue; + } else { + _range_free(range); + return NULL; + } + } + if(tmp->incompatible) { + _range_free(tmp); + tmp = 0; + } + break; + } + if(tmp) { + tmp->extensible |= range->extensible; + tmp->empty_constraint |= range->empty_constraint; + _range_free(range); + range = tmp; + } else { + range->incompatible = 1; + return range; + } + + /* + * Merge with the rest of them. + * Canonicalizator will do the union magic. + */ + for(; i < ct->el_count; i++) { + tmp = asn1constraint_compute_PER_range(expr_type, + ct->elements[i], type, minmax, exmet, + strict_PV); + if(!tmp) { + if(errno == ERANGE) { + range->extensible = 1; + continue; + } else { + _range_free(range); + return NULL; + } + } + + if(tmp->incompatible) { + _range_free(tmp); + _range_canonicalize(range); + range->incompatible = 1; + return range; } if(tmp->empty_constraint) { - /* Ignore empty constraints */ + /* + * Ignore empty constraints in OR logic. + */ + range->extensible |= tmp->extensible; _range_free(tmp); continue; } - range->not_PER_visible |= tmp->not_PER_visible; - range->extensible |= tmp->extensible; - _range_merge_in(range, tmp); } _range_canonicalize(range); - if(range->not_PER_visible) { + if(range->extensible && type == ACT_CT_FROM) { + /* + * X.691, #9.3.10: + * Extensible permitted alphabet constraints + * are not PER-visible. + */ + range->not_PER_visible = 1; + } + + if(strict_PV && range->not_PER_visible) { /* * X.691, #9.3.19: * If not PER-visible constraint is part of UNION, - * the resulting constraint is not PER-visible. + * the whole resulting constraint is not PER-visible. */ _range_free(range); if(minmax) range = _range_clone(minmax); else range = _range_new(); + range->not_PER_visible = 1; + range->incompatible = 1; } return range; @@ -862,10 +969,10 @@ asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constr assert(ct->el_count >= 1); _range_free(range); range = asn1constraint_compute_PER_range(expr_type, - ct->elements[0], type, minmax, exmet); + ct->elements[0], type, minmax, exmet, strict_PV); return range; default: - range->not_PER_visible = 1; + range->incompatible = 1; return range; } @@ -874,7 +981,7 @@ asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constr /* * Expectation is not met. Return the default range. */ - range->not_PER_visible = 1; + range->incompatible = 1; return range; } diff --git a/libasn1fix/asn1fix_crange.h b/libasn1fix/asn1fix_crange.h index 9873e3b20..9d4763ace 100644 --- a/libasn1fix/asn1fix_crange.h +++ b/libasn1fix/asn1fix_crange.h @@ -21,13 +21,14 @@ typedef struct asn1cnst_range_s { int el_size; int empty_constraint; /* If yes, too bad. */ - int extensible; /* Extension marker (...) present. */ + int extensible; /* Extension marker (...) is in effect. */ - int not_PER_visible; /* Contains non PER-visible components */ + int incompatible; /* Constraint incompatible with argument */ + int not_PER_visible; /* Contains not PER-visible components */ } asn1cnst_range_t; /* - * Compute the PER-visible constraint range. + * Compute the constraint range with variable PER visibility restrictions. * * (expr_type) must have the type of the top-level parent ASN.1 type. * (required_type) must be one of ACT_EL_RANGE, ACT_CT_SIZE or ACT_CT_FROM. @@ -41,7 +42,8 @@ asn1cnst_range_t *asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constraint_t *ct, enum asn1p_constraint_type_e required_type, const asn1cnst_range_t *minmax, - int *expectation_met); + int *expectation_met, + int strict_PER_visibility); void asn1constraint_range_free(asn1cnst_range_t *); /* From 3231b9f2494dbc534bea0c8a84945d2bf9605655 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 25 Aug 2004 02:06:48 +0000 Subject: [PATCH 0221/1469] relaxed PER visibility git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@221 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ChangeLog b/ChangeLog index d6f4e773b..d0df5743d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,8 @@ 0.9.2: 2004-Aug-24 + * More flexible subtype constraints handling, with relaxed + PER visibility rules for actual constraints checking code generator. * Indirect references in constraints resolver code fixed. * Avoided compilation warning on gcc 3.3.3 systems. From 26afd20a79933bf0f8eaa204b781040d0a70ca53 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 25 Aug 2004 02:08:08 +0000 Subject: [PATCH 0222/1469] practical constraints have relaxed PER visibility rules git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@222 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/50-constraint-OK.asn1 | 1 + ...50-constraint-OK.asn1.-EFprint-constraints | Bin 3624 -> 5033 bytes tests/50-constraint-OK.asn1.-P | 128 ++++++++++++------ 3 files changed, 90 insertions(+), 39 deletions(-) diff --git a/tests/50-constraint-OK.asn1 b/tests/50-constraint-OK.asn1 index 0ae7689cd..210c69dec 100644 --- a/tests/50-constraint-OK.asn1 +++ b/tests/50-constraint-OK.asn1 @@ -35,6 +35,7 @@ BEGIN Not-PER-Visible-1 ::= PER-Visible (FROM("AB") | SIZE(1..2)) Not-PER-Visible-2 ::= PER-Visible (FROM("AB",...)) Not-PER-Visible-3 ::= PER-Visible (FROM("AB"),...) + SIZE-but-not-FROM ::= PER-Visible (SIZE(1..4) ^ FROM("ABCD",...)) SIZE-and-FROM ::= PER-Visible (SIZE(1..4) ^ FROM("ABCD")) Neither-SIZE-nor-FROM ::= PER-Visible (SIZE(1..4) | FROM("ABCD",...)) diff --git a/tests/50-constraint-OK.asn1.-EFprint-constraints b/tests/50-constraint-OK.asn1.-EFprint-constraints index 11e8d3d304a396a1401cf3f8011c71cf404ce954..2c95754874723da42aca6e55507f6112f3108c29 100644 GIT binary patch delta 583 zcmZ1>vr>J+c8;RNlmS_pfEXrO?KjWj>(RU zC<-`$3JeX9BAsfJB2$I*))6+w!VKkg<$CQk$ip3NmJNY1!6p|d&RicwQn6V1` zGZ(>CPd?3T0`kPIqS0hWRO+L%22bGin zvO5rx@oeru3G2xU9MY4Qv*jX7*iMdS=b9|QeiK;`rn(1N&}s5~j_Aqe93qp2I1@1? zj&e>$7Sx^G&m}yWk;er{&%uyjash@BSK#DQ?wQDPFngsZC-4*_Bp&i=OlIX(o_wB1 pl?fQD>b%~la!Yt6!2W*E%L$U-%`1Z}?*x&8Fname, __FILE__, __LINE__); + return -1; } - /* Make the underlying type checker permanent */ - td->check_constraints = asn1_DEF_Int3.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); + if((value >= 1 && value <= 10)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } } /* @@ -604,6 +612,7 @@ ExtensibleExtensions_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const INTEGER_t *st = sptr; + long value; if(!sptr) { _ASN_ERRLOG(app_errlog, app_key, @@ -612,15 +621,22 @@ ExtensibleExtensions_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return -1; } - - if(1 /* No applicable constraints whatsoever */) { - /* Nothing is here. See below */ + if(asn1_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; } - /* Make the underlying type checker permanent */ - td->check_constraints = asn1_DEF_INTEGER.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); + if((value >= 1 && value <= 256)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } } /* @@ -1483,6 +1499,22 @@ der_type_encoder_f Not_PER_Visible_2_encode_der; asn_struct_print_f Not_PER_Visible_2_print; asn_struct_free_f Not_PER_Visible_2_free; +/*** <<< CTABLES [Not-PER-Visible-2] >>> ***/ + +static int check_permitted_alphabet_6(const void *sptr) { + /* The underlying type is IA5String */ + const IA5String_t *st = sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!(cv >= 65 && cv <= 66)) return -1; + } + return 0; +} + + /*** <<< CODE [Not-PER-Visible-2] >>> ***/ int @@ -1499,14 +1531,15 @@ Not_PER_Visible_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } - if(1 /* No applicable constraints whatsoever */) { - /* Nothing is here. See below */ + if(!check_permitted_alphabet_6(sptr)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; } - - /* Make the underlying type checker permanent */ - td->check_constraints = asn1_DEF_PER_Visible.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); } /* @@ -1597,6 +1630,22 @@ der_type_encoder_f Not_PER_Visible_3_encode_der; asn_struct_print_f Not_PER_Visible_3_print; asn_struct_free_f Not_PER_Visible_3_free; +/*** <<< CTABLES [Not-PER-Visible-3] >>> ***/ + +static int check_permitted_alphabet_7(const void *sptr) { + /* The underlying type is IA5String */ + const IA5String_t *st = sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!(cv >= 65 && cv <= 66)) return -1; + } + return 0; +} + + /*** <<< CODE [Not-PER-Visible-3] >>> ***/ int @@ -1613,14 +1662,15 @@ Not_PER_Visible_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } - if(1 /* No applicable constraints whatsoever */) { - /* Nothing is here. See below */ + if(!check_permitted_alphabet_7(sptr)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; } - - /* Make the underlying type checker permanent */ - td->check_constraints = asn1_DEF_PER_Visible.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); } /* @@ -1713,7 +1763,7 @@ asn_struct_free_f SIZE_but_not_FROM_free; /*** <<< CTABLES [SIZE-but-not-FROM] >>> ***/ -static int check_permitted_alphabet_6(const void *sptr) { +static int check_permitted_alphabet_8(const void *sptr) { /* The underlying type is IA5String */ const IA5String_t *st = sptr; const uint8_t *ch = st->buf; @@ -1721,7 +1771,7 @@ static int check_permitted_alphabet_6(const void *sptr) { for(; ch < end; ch++) { uint8_t cv = *ch; - if(!(cv >= 65 && cv <= 70)) return -1; + if(!(cv >= 65 && cv <= 68)) return -1; } return 0; } @@ -1746,7 +1796,7 @@ SIZE_but_not_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, size = st->size; if((size >= 1 && size <= 4) - && !check_permitted_alphabet_6(sptr)) { + && !check_permitted_alphabet_8(sptr)) { /* Constraint check succeeded */ return 0; } else { @@ -1847,7 +1897,7 @@ asn_struct_free_f SIZE_and_FROM_free; /*** <<< CTABLES [SIZE-and-FROM] >>> ***/ -static int check_permitted_alphabet_7(const void *sptr) { +static int check_permitted_alphabet_9(const void *sptr) { /* The underlying type is IA5String */ const IA5String_t *st = sptr; const uint8_t *ch = st->buf; @@ -1880,7 +1930,7 @@ SIZE_and_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, size = st->size; if((size >= 1 && size <= 4) - && !check_permitted_alphabet_7(sptr)) { + && !check_permitted_alphabet_9(sptr)) { /* Constraint check succeeded */ return 0; } else { @@ -1981,7 +2031,7 @@ asn_struct_free_f Neither_SIZE_nor_FROM_free; /*** <<< CTABLES [Neither-SIZE-nor-FROM] >>> ***/ -static int check_permitted_alphabet_8(const void *sptr) { +static int check_permitted_alphabet_10(const void *sptr) { /* The underlying type is IA5String */ const IA5String_t *st = sptr; const uint8_t *ch = st->buf; @@ -2011,7 +2061,7 @@ Neither_SIZE_nor_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } - if(!check_permitted_alphabet_8(sptr)) { + if(!check_permitted_alphabet_10(sptr)) { /* Constraint check succeeded */ return 0; } else { @@ -2112,7 +2162,7 @@ asn_struct_free_f Utf8_3_free; /*** <<< CTABLES [Utf8-3] >>> ***/ -static int permitted_alphabet_table_9[128] = { +static int permitted_alphabet_table_11[128] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ @@ -2123,8 +2173,8 @@ static int permitted_alphabet_table_9[128] = { 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, /* pqrstuvwxyz */ }; -static int check_permitted_alphabet_9(const void *sptr) { - int *table = permitted_alphabet_table_9; +static int check_permitted_alphabet_11(const void *sptr) { + int *table = permitted_alphabet_table_11; /* The underlying type is UTF8String */ const UTF8String_t *st = sptr; const uint8_t *ch = st->buf; @@ -2159,7 +2209,7 @@ Utf8_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(size == (size_t)-1) return -1; if((size >= 1 && size <= 2) - && !check_permitted_alphabet_9(sptr)) { + && !check_permitted_alphabet_11(sptr)) { /* Constraint check succeeded */ return 0; } else { From da4df3f8889408c92e236754517198800738cb34 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 25 Aug 2004 02:27:47 +0000 Subject: [PATCH 0223/1469] better ValueSet printing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@223 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 1 + libasn1print/asn1print.c | 20 +++++++++++++++++--- tests/07-int-OK.asn1.-EF | 2 +- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index d0df5743d..2d0efdba5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,7 @@ PER visibility rules for actual constraints checking code generator. * Indirect references in constraints resolver code fixed. * Avoided compilation warning on gcc 3.3.3 systems. + * Better ValueSet printing. 0.9.1: 2004-Aug-23 diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index c90e96655..a07a894ca 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -442,6 +442,7 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri } if(tc->meta_type != AMT_VALUE + && tc->meta_type != AMT_VALUESET && tc->expr_type != A1TC_EXTENSIBLE) { if(level) { if(tc->Identifier) @@ -503,14 +504,27 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri asn1print_ref(tc->reference, flags); } + if(tc->meta_type == AMT_VALUESET) + printf(" ::="); + /* * Display the descendants (children) of the current type. */ - if(TQ_FIRST(&(tc->members))) { + if(TQ_FIRST(&(tc->members)) + || (tc->expr_type & ASN_CONSTR_MASK) + || tc->meta_type == AMT_VALUESET + || tc->meta_type == AMT_OBJECT + || tc->meta_type == AMT_OBJECTSET + ) { asn1p_expr_t *se; /* SubExpression */ int put_braces = !SEQ_OF; /* Don't need 'em, if SET OF... */ - if(put_braces) printf(" {\n"); + if(put_braces) { + printf(" {"); + if(TQ_FIRST(&tc->members)) + printf("\n"); + else printf(" }"); + } TQ_FOR(se, &(tc->members), next) { /* @@ -528,7 +542,7 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri } } - if(put_braces) { + if(put_braces && TQ_FIRST(&tc->members)) { printf("\n"); INDENT("}"); } diff --git a/tests/07-int-OK.asn1.-EF b/tests/07-int-OK.asn1.-EF index b3d6a0c32..90b234991 100644 --- a/tests/07-int-OK.asn1.-EF +++ b/tests/07-int-OK.asn1.-EF @@ -9,7 +9,7 @@ int123456 INTEGER ::= 123456 Interval ::= INTEGER (1..123456) -SameInterval ::= INTEGER +SameInterval INTEGER ::= { } Reason ::= INTEGER { no-reason(0), From 7a35b6514e39e7ef696e5c21ce1a926ada29a3db Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 26 Aug 2004 06:19:23 +0000 Subject: [PATCH 0224/1469] compiled under cygwin git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@224 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 4 ++++ configure | 2 +- configure.in | 2 +- skeletons/GeneralizedTime.c | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2d0efdba5..7fc666c78 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,8 @@ +0.9.3: 2004-Aug-25 + + * Compiled under cygwin. + 0.9.2: 2004-Aug-24 * More flexible subtype constraints handling, with relaxed diff --git a/configure b/configure index 290e0ec24..39c7cae7d 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.9.2 + VERSION=0.9.3 cat >>confdefs.h <<_ACEOF diff --git a/configure.in b/configure.in index 968bc2d90..fbccad98e 100644 --- a/configure.in +++ b/configure.in @@ -3,7 +3,7 @@ AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_BUILD AC_CANONICAL_TARGET AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.9.2) +AM_INIT_AUTOMAKE(asn1c, 0.9.3) AC_SUBST(PATH) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 1da113b01..adc6d5077 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -9,7 +9,7 @@ #include #endif /* __NO_ASSERT_H__ */ -#ifdef WIN32 +#if defined(WIN32) && !defined(__CYGWIN__) #warning PLEASE STOP AND READ! #warning localtime_r is implemented via localtime(), which is not thread-safe. #warning gmtime_r is implemented via gmtime(), which is not thread-safe. From e2bb4433b0e66a8cad065b92b2bd8e17dec7ecb8 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 26 Aug 2004 06:20:34 +0000 Subject: [PATCH 0225/1469] forgot to add return git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@225 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 4948016ad..ab618fa18 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1361,4 +1361,6 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, int tags_count, int tags_impl_skip ); OUT("};\n"); OUT("\n"); + + return 0; } From bd8b222d8eeecc670e5697b32f5e0dfcaf5904bf Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 26 Aug 2004 06:22:12 +0000 Subject: [PATCH 0226/1469] oops git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@226 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/GeneralizedTime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index adc6d5077..cbb4c7dcb 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -9,7 +9,7 @@ #include #endif /* __NO_ASSERT_H__ */ -#if defined(WIN32) && !defined(__CYGWIN__) +#if defined(WIN32) && defined(__CYGWIN__) #warning PLEASE STOP AND READ! #warning localtime_r is implemented via localtime(), which is not thread-safe. #warning gmtime_r is implemented via gmtime(), which is not thread-safe. From ad17146e021d1d2fc654a2fe4414a8f18f06c44a Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 26 Aug 2004 06:22:36 +0000 Subject: [PATCH 0227/1469] oops git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@227 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/GeneralizedTime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index cbb4c7dcb..687ccd4bd 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -9,7 +9,7 @@ #include #endif /* __NO_ASSERT_H__ */ -#if defined(WIN32) && defined(__CYGWIN__) +#if defined(WIN32) || defined(__CYGWIN__) #warning PLEASE STOP AND READ! #warning localtime_r is implemented via localtime(), which is not thread-safe. #warning gmtime_r is implemented via gmtime(), which is not thread-safe. From 17909e9e746e9f91308ef82bb28b954a1b8acfd4 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 2 Sep 2004 05:20:39 +0000 Subject: [PATCH 0228/1469] const qualifiers git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@228 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/GeneralizedTime.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 687ccd4bd..b31991739 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -18,21 +18,20 @@ #warning if you want to use asn_GT2time() or asn_UT2time(). #warning PLEASE STOP AND READ! -static struct tm *localtime_r(time_t *tloc, struct tm *result) { +static struct tm *localtime_r(const time_t *tloc, struct tm *result) { struct tm *tm; if((tm = localtime(tloc))) return memcpy(result, tm, sizeof(struct tm)); return 0; } -static struct tm *gmtime_r(time_t *tloc, struct tm *result) { +static struct tm *gmtime_r(const time_t *tloc, struct tm *result) { struct tm *tm; if((tm = gmtime(tloc))) return memcpy(result, tm, sizeof(struct tm)); return 0; } -#define tzset() _tzset() static time_t timegm(struct tm *tm) { time_t tloc; char *tz; @@ -40,7 +39,7 @@ static time_t timegm(struct tm *tm) { tz = getenv("TZ"); _putenv("TZ=UTC"); - tzset(); + _tzset(); tloc = mktime(tm); if (tz) { buf = alloca(strlen(tz) + 4); @@ -49,7 +48,7 @@ static time_t timegm(struct tm *tm) { buf = "TZ="; } _putenv(buf); - tzset(); + _tzset(); return tloc; } From 7e66aa838576b50187e92dccdee0051eb4f21344 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 2 Sep 2004 12:11:47 +0000 Subject: [PATCH 0229/1469] preliminary ANY support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@229 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ANY.c | 23 +++++++++++++++++++++++ skeletons/ANY.h | 32 ++++++++++++++++++++++++++++++++ skeletons/OCTET_STRING.c | 22 ++++++++++++++-------- skeletons/OCTET_STRING.h | 4 ++-- skeletons/file-dependencies | 3 ++- 5 files changed, 73 insertions(+), 11 deletions(-) create mode 100644 skeletons/ANY.c create mode 100644 skeletons/ANY.h diff --git a/skeletons/ANY.c b/skeletons/ANY.c new file mode 100644 index 000000000..205712096 --- /dev/null +++ b/skeletons/ANY.c @@ -0,0 +1,23 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +asn1_TYPE_descriptor_t asn1_DEF_ANY = { + "ANY", + asn_generic_no_constraint, + OCTET_STRING_decode_ber, + OCTET_STRING_encode_der, + OCTET_STRING_print, + OCTET_STRING_free, + 0, /* Use generic outmost tag fetcher */ + 0, + 0, + 0, /* No tags may be overridden */ + -1, /* Both ways are fine (primitive and constructed) */ + 0, 0, /* No members */ + (void *)1 /* Special indicator that this is an ANY type */ +}; diff --git a/skeletons/ANY.h b/skeletons/ANY.h new file mode 100644 index 000000000..0f10e1013 --- /dev/null +++ b/skeletons/ANY.h @@ -0,0 +1,32 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_TYPE_ANY_H +#define ASN_TYPE_ANY_H + +#include +#include /* Implemented via OCTET SRING type */ + +typedef struct ANY { + uint8_t *buf; /* BER-encoded ANY contents */ + int size; /* Size of the above buffer */ + + ber_dec_ctx_t _ber_dec_ctx; /* Parsing across buffer boundaries */ +} ANY_t; + +extern asn1_TYPE_descriptor_t asn1_DEF_ANY; + +ber_type_decoder_f ANY_decode_ber; +der_type_encoder_f ANY_encode_der; +asn_struct_print_f ANY_print; +asn_struct_free_f ANY_free; + +/****************************** + * Handy conversion routines. * + ******************************/ + +#define ANY_fromBuf(s, buf, size) OCTET_STRING_fromBuf((s), (buf), (size)) +#define ANY_new_fromBuf(buf, size) OCTET_STRING_new_fromBuf((buf), (size)) + +#endif /* ASN_TYPE_ANY_H */ diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 6e0e426df..147dae707 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -150,7 +150,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, * This is a some sort of a hack. * The OCTET STRING decoder is being used in BIT STRING mode. */ - int is_bit_str = td->specifics?1:0; + int is_bit_str = (td->specifics==(void *)-1)?1:0; ASN_DEBUG("Decoding %s as %s (%ld)", td->name, @@ -395,6 +395,8 @@ OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, der_enc_rval_t erval; OCTET_STRING_t *st = (OCTET_STRING_t *)ptr; int add_byte = 0; + int is_bit_str = (td->specifics == (void *)-1); + int is_ANY_type = (td->specifics == (void *)1; ASN_DEBUG("%s %s as OCTET STRING", cb?"Estimating":"Encoding", sd->name); @@ -402,7 +404,7 @@ OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, /* * Canonicalize BIT STRING. */ - if(sd->specifics && st->buf) { + if(is_bit_str && st->buf) { switch(st->size) { case 0: add_byte = 1; break; case 1: st->buf[0] = 0; break; @@ -412,12 +414,16 @@ OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, } } - erval.encoded = der_write_tags(sd, st->size + add_byte, tag_mode, tag, - cb, app_key); - if(erval.encoded == -1) { - erval.failed_type = sd; - erval.structure_ptr = ptr; - return erval; + if(is_ANY_type) { + erval.encoded = 0; + } else { + erval.encoded = der_write_tags(sd, st->size + add_byte, + tag_mode, tag, cb, app_key); + if(erval.encoded == -1) { + erval.failed_type = sd; + erval.structure_ptr = ptr; + return erval; + } } if(cb) { diff --git a/skeletons/OCTET_STRING.h b/skeletons/OCTET_STRING.h index 223e1da5b..df6ff4f23 100644 --- a/skeletons/OCTET_STRING.h +++ b/skeletons/OCTET_STRING.h @@ -28,8 +28,8 @@ asn_struct_free_f OCTET_STRING_free; /* * This function clears the previous value of the OCTET STRING (if any) - * and then allocates a new memory and makes s point to the newly allocated - * memory. If size = -1, the size of the original string will be determined + * and then allocates a new memory and returns a pointer to it. + * If size = -1, the size of the original string will be determined * using strlen(str). * If str equals to NULL, the function will silently clear the * current contents of the OCTET STRING. diff --git a/skeletons/file-dependencies b/skeletons/file-dependencies index 4c19c7a5f..3dd94e929 100644 --- a/skeletons/file-dependencies +++ b/skeletons/file-dependencies @@ -6,6 +6,7 @@ # $Id$ # +ANY.h ANY.h BIT_STRING.h BIT_STRING.c BMPString.h BMPString.c BOOLEAN.h BOOLEAN.c @@ -25,7 +26,7 @@ ObjectDescriptor.h ObjectDescriptor.c GraphicString.h PrintableString.h PrintableString.c RELATIVE-OID.h RELATIVE-OID.c OBJECT-IDENTIFIER.h T61String.h T61String.c -TeletexString.h TeletexString.c +TeletexString.h TeletexString.c UTCTime.h UTCTime.c GeneralizedTime.h UTF8String.h UTF8String.c UniversalString.h UniversalString.c From cc8724647d28a2212c620dd6349210a5f73a9345 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 2 Sep 2004 12:12:15 +0000 Subject: [PATCH 0230/1469] simplify git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@230 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OCTET_STRING.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 147dae707..8df09876a 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -150,7 +150,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, * This is a some sort of a hack. * The OCTET STRING decoder is being used in BIT STRING mode. */ - int is_bit_str = (td->specifics==(void *)-1)?1:0; + int is_bit_str = (td->specifics==(void *)-1); ASN_DEBUG("Decoding %s as %s (%ld)", td->name, From 0f218e8f71c2790c920e094a1960a73b4551665e Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 2 Sep 2004 12:12:57 +0000 Subject: [PATCH 0231/1469] ANY support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@231 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libasn1compiler/asn1c_C.h b/libasn1compiler/asn1c_C.h index 634930638..39a35fbfe 100644 --- a/libasn1compiler/asn1c_C.h +++ b/libasn1compiler/asn1c_C.h @@ -29,6 +29,10 @@ static asn1_language_map_t asn1_lang_C[] __attribute__ ((unused)) = { { AMT_TYPE, ASN_CONSTR_SET_OF, asn1c_lang_C_type_SEx_OF }, { AMT_TYPEREF, ASN_CONSTR_SET_OF, asn1c_lang_C_type_SEx_OF }, { AMT_TYPE, ASN_CONSTR_CHOICE, asn1c_lang_C_type_CHOICE }, + /* + * ANY type (deprecated) + */ + { AMT_TYPE, ASN_CONSTR_ANY, asn1c_lang_C_type_SIMPLE_TYPE }, /* * Basic types */ From 3e69302fda808ad5f01e9e7f9f7263d5fd71f3c2 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 2 Sep 2004 12:57:25 +0000 Subject: [PATCH 0232/1469] sd->td git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@232 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OCTET_STRING.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 8df09876a..fd25e57e4 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -389,17 +389,17 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, * Encode OCTET STRING type using DER. */ der_enc_rval_t -OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, +OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { der_enc_rval_t erval; OCTET_STRING_t *st = (OCTET_STRING_t *)ptr; int add_byte = 0; int is_bit_str = (td->specifics == (void *)-1); - int is_ANY_type = (td->specifics == (void *)1; + int is_ANY_type = (td->specifics == (void *)1); ASN_DEBUG("%s %s as OCTET STRING", - cb?"Estimating":"Encoding", sd->name); + cb?"Estimating":"Encoding", td->name); /* * Canonicalize BIT STRING. @@ -417,10 +417,10 @@ OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, if(is_ANY_type) { erval.encoded = 0; } else { - erval.encoded = der_write_tags(sd, st->size + add_byte, + erval.encoded = der_write_tags(td, st->size + add_byte, tag_mode, tag, cb, app_key); if(erval.encoded == -1) { - erval.failed_type = sd; + erval.failed_type = td; erval.structure_ptr = ptr; return erval; } @@ -450,7 +450,7 @@ OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, ret = cb(buf, size, app_key); if(ret == -1) { erval.encoded = -1; - erval.failed_type = sd; + erval.failed_type = td; erval.structure_ptr = ptr; return erval; } From 235c3feefb9b076d1bb69d096503346c8f038a87 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 4 Sep 2004 04:41:35 +0000 Subject: [PATCH 0233/1469] tests for ANY type git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@233 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/60-any-OK.asn1 | 24 ++++++++++++++++++++++++ tests/60-any-OK.asn1.-EF | 18 ++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 tests/60-any-OK.asn1 create mode 100644 tests/60-any-OK.asn1.-EF diff --git a/tests/60-any-OK.asn1 b/tests/60-any-OK.asn1 new file mode 100644 index 000000000..ca73358c8 --- /dev/null +++ b/tests/60-any-OK.asn1 @@ -0,0 +1,24 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .60 + +ModuleTestANY + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 60 } + DEFINITIONS ::= +BEGIN + + T1 ::= SEQUENCE { + i INTEGER, + any ANY + } + + T2 ::= SEQUENCE { + i INTEGER, + any [0] EXPLICIT ANY OPTIONAL + } + +END diff --git a/tests/60-any-OK.asn1.-EF b/tests/60-any-OK.asn1.-EF new file mode 100644 index 000000000..81dce5706 --- /dev/null +++ b/tests/60-any-OK.asn1.-EF @@ -0,0 +1,18 @@ + +ModuleTestANY {iso(-1) org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 60 } +DEFINITIONS ::= +BEGIN + +T1 ::= SEQUENCE { + i INTEGER, + any ANY +} + +T2 ::= SEQUENCE { + i INTEGER, + any [0] EXPLICIT ANY OPTIONAL +} + +END From e49e4c0d0b2de874f659058b04685ff64bd98ee4 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 4 Sep 2004 04:42:00 +0000 Subject: [PATCH 0234/1469] any type renamed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@234 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libasn1compiler/asn1c_C.h b/libasn1compiler/asn1c_C.h index 39a35fbfe..e8f56ed91 100644 --- a/libasn1compiler/asn1c_C.h +++ b/libasn1compiler/asn1c_C.h @@ -32,7 +32,7 @@ static asn1_language_map_t asn1_lang_C[] __attribute__ ((unused)) = { /* * ANY type (deprecated) */ - { AMT_TYPE, ASN_CONSTR_ANY, asn1c_lang_C_type_SIMPLE_TYPE }, + { AMT_TYPE, ASN_TYPE_ANY, asn1c_lang_C_type_SIMPLE_TYPE }, /* * Basic types */ From e2070eada01c0729a012aa311b3a62fea235c138 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 4 Sep 2004 04:42:29 +0000 Subject: [PATCH 0235/1469] support for ANY type git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@235 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index ab618fa18..0bf556c1e 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -906,7 +906,7 @@ _print_tag(arg_t *arg, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag_p) { tag = *tag_p; } else { if(asn1f_fetch_tag(arg->asn, arg->mod, expr, &tag)) { - OUT("-1 /* Ambiguous tag (CHOICE?) */"); + OUT("-1 /* Ambiguous tag (CHOICE|ANY?) */"); return 0; } } @@ -1028,8 +1028,11 @@ _add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no) { ret = asn1f_fetch_tag(arg->asn, arg->mod, arg->expr, &tag); if(ret == 0) { + tag2el_t *te; + int new_count = (*count) + 1; void *p; - p = realloc(*tag2el, sizeof(tag2el_t) * ((*count) + 1)); + + p = realloc(*tag2el, new_count * sizeof(tag2el_t)); if(p) *tag2el = p; else return -1; @@ -1037,10 +1040,11 @@ _add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no) { arg->expr->Identifier, (long)tag.tag_value); - (*tag2el)[*count].el_tag = tag; - (*tag2el)[*count].el_no = el_no; - (*tag2el)[*count].from_expr = arg->expr; - (*count)++; + te = &((*tag2el)[*count]); + te->el_tag = tag; + te->el_no = el_no; + te->from_expr = arg->expr; + *count = new_count; return 0; } @@ -1073,6 +1077,18 @@ _add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no) { } } + if(arg->expr->expr_type == ASN_TYPE_ANY + && arg->expr->tag.tag_class == TC_NOCLASS) { + if(arg->expr->marker) { + FATAL("Untagged optional ANY type for %s at line %d", + arg->expr->Identifier, + arg->expr->_lineno); + return -1; + } + /* Allow to proceed without adding a tag */ + return 0; + } + DEBUG("No tag for %s at line %d", arg->expr->Identifier, arg->expr->_lineno); From c12c210644491678bc8188676becd2d51a6bdaa9 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 4 Sep 2004 04:43:28 +0000 Subject: [PATCH 0236/1469] cygwin define is unnecessary git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@236 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/GeneralizedTime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index b31991739..e84650287 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -9,7 +9,7 @@ #include #endif /* __NO_ASSERT_H__ */ -#if defined(WIN32) || defined(__CYGWIN__) +#if defined(WIN32) #warning PLEASE STOP AND READ! #warning localtime_r is implemented via localtime(), which is not thread-safe. #warning gmtime_r is implemented via gmtime(), which is not thread-safe. From bd4b4f2d04001602fbbcc88cb6627e13247fed41 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 4 Sep 2004 04:43:41 +0000 Subject: [PATCH 0237/1469] typo fixed in ANY.c git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@237 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/file-dependencies | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/file-dependencies b/skeletons/file-dependencies index 3dd94e929..128bda230 100644 --- a/skeletons/file-dependencies +++ b/skeletons/file-dependencies @@ -6,7 +6,7 @@ # $Id$ # -ANY.h ANY.h +ANY.h ANY.c BIT_STRING.h BIT_STRING.c BMPString.h BMPString.c BOOLEAN.h BOOLEAN.c From ef16e8c3319cbb4dbacc5dafb5a30107fd6c005e Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 4 Sep 2004 04:44:11 +0000 Subject: [PATCH 0238/1469] ANY type support, and more logging git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@238 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SEQUENCE.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index d1eb0297b..67c916e68 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -303,6 +303,15 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, */ if(!IN_EXTENSION_GROUP(specs, edx)) { + if(elements[edx].tag == (ber_tlv_tag_t)-1 + && elements[edx].optional == 0) { + /* + * This must be the ANY type. + */ + ctx->step |= 1; + goto microphase2; + } + ASN_DEBUG("Unexpected tag %s", ber_tlv_tag_string(tlv_tag)); ASN_DEBUG("Expected tag %s (%s)%s", @@ -384,9 +393,10 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, elements[edx].type, memb_ptr2, ptr, LEFT, elements[edx].tag_mode); - ASN_DEBUG("In %s SEQUENCE decoded %d %s in %d bytes code %d", + ASN_DEBUG("In %s SEQUENCE decoded %d %s of %d " + "in %d bytes rval.code %d", td->name, edx, elements[edx].type->name, - (int)rval.consumed, rval.code); + (int)LEFT, (int)rval.consumed, rval.code); switch(rval.code) { case RC_OK: break; From 463dc5ae2a6c5505e71759aa333db25f7f326ae5 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 4 Sep 2004 04:44:30 +0000 Subject: [PATCH 0239/1469] support for untagged ANY type git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@239 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ber_decoder.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c index e56cc6a6a..b2c08f50e 100644 --- a/skeletons/ber_decoder.c +++ b/skeletons/ber_decoder.c @@ -95,8 +95,29 @@ ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *ctx, ; ASN_DEBUG("ber_check_tags(%s, size=%ld, tm=%d, step=%d, tagno=%d)", td->name, (long)size, tag_mode, ctx->step, tagno); - //assert(td->tags_count >= 1); ?May not be the case for CHOICE! - assert(tagno < td->tags_count); /* At least one loop */ + //assert(td->tags_count >= 1); ?May not be the case for CHOICE or ANY. + + if(tagno == td->tags_count) { + /* + * This must be the _untagged_ ANY type, + * which outermost tag isn't known in advance. + * Fetch the tag and length separately. + */ + tag_len = ber_fetch_tag(ptr, size, &tlv_tag); + switch(tag_len) { + case -1: RETURN(RC_FAIL); + case 0: RETURN(RC_WMORE); + } + tlv_constr = BER_TLV_CONSTRUCTED(ptr); + len_len = ber_fetch_length(tlv_constr, + (char *)ptr + tag_len, size - tag_len, &tlv_len); + switch(len_len) { + case -1: RETURN(RC_FAIL); + case 0: RETURN(RC_WMORE); + } + } else { + assert(tagno < td->tags_count); /* At least one loop */ + } for((void)tagno; tagno < td->tags_count; tagno++, ctx->step++) { /* From cdfdb72031f8761f4d97a48cde4c6522183868bd Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 4 Sep 2004 04:44:50 +0000 Subject: [PATCH 0240/1469] support for ANY type decoding git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@240 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OCTET_STRING.c | 86 +++++++++++++++++++++++++--------------- 1 file changed, 55 insertions(+), 31 deletions(-) diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index fd25e57e4..71d59d3d5 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -51,11 +51,12 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { } while(0) #define APPEND(bufptr, bufsize) do { \ + size_t _bs = (bufsize); \ size_t _ns = ctx->step; /* Allocated */ \ - if(_ns <= (size_t)(st->size + bufsize)) { \ + if(_ns <= (size_t)(st->size + _bs)) { \ void *ptr; \ do { _ns = _ns ? _ns<<2 : 16; } \ - while(_ns <= (size_t)(st->size + bufsize)); \ + while(_ns <= (size_t)(st->size + _bs)); \ ptr = REALLOC(st->buf, _ns); \ if(ptr) { \ st->buf = (uint8_t *)ptr; \ @@ -64,8 +65,8 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { RETURN(RC_FAIL); \ } \ } \ - memcpy(st->buf + st->size, bufptr, bufsize); \ - st->size += bufsize; \ + memcpy(st->buf + st->size, bufptr, _bs); \ + st->size += _bs; \ if(st->size < 0) \ /* Why even care?.. JIC */ \ RETURN(RC_FAIL); \ @@ -124,12 +125,6 @@ _new_stack() { if(st == NULL) return NULL; - st->cur_ptr = _add_stack_el(st); - if(st->cur_ptr == NULL) { - FREEMEM(st); - return NULL; - } - return st; } @@ -142,20 +137,16 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, OCTET_STRING_t *st = (OCTET_STRING_t *)*os_structure; ber_dec_rval_t rval; ber_dec_ctx_t *ctx; + ber_tlv_tag_t terminal_tag; /* Inner tag for constructed types */ ssize_t consumed_myself = 0; struct _stack *stck; /* A stack structure */ struct _stack_el *sel; /* Stack element */ int tlv_constr; - /* - * This is a some sort of a hack. - * The OCTET STRING decoder is being used in BIT STRING mode. - */ - int is_bit_str = (td->specifics==(void *)-1); + int is_bit_str = 0; /* See below under switch(td->specifics) */ + int is_ANY_type = 0; /* See below under switch(td->specifics) */ ASN_DEBUG("Decoding %s as %s (%ld)", - td->name, - is_bit_str ? "BIT STRING" : "OCTET STRING", - (long)size); + td->name, "OCTET STRING", (long)size); /* * Create the string if does not exist. @@ -169,6 +160,25 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, /* Restore parsing context */ ctx = &st->_ber_dec_ctx; + switch((int)td->specifics) { + case 0: + terminal_tag = asn1_DEF_OCTET_STRING_tags[0]; /* [U4] */ + break; + case -1: /* BIT STRING */ + /* + * This is some sort of a hack. + * The OCTET STRING decoder is being used in BIT STRING mode. + */ + is_bit_str = 1; + terminal_tag = ASN_TAG_CLASS_UNIVERSAL | (3 << 2); + break; + default: /* Just in case; fall through */ + case 1: /* ANY type */ + is_ANY_type = 1; + terminal_tag = -1; + break; + } + switch(ctx->phase) { case 0: /* @@ -191,6 +201,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, ctx->ptr = _new_stack(); if(ctx->ptr) { (void *)stck = ctx->ptr; +#if 0 if(ctx->left < 0) { stck->cur_ptr->want_nulls = -ctx->left; stck->cur_ptr->left = -1; @@ -198,10 +209,12 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, stck->cur_ptr->want_nulls = 0; stck->cur_ptr->left = ctx->left; } - ASN_DEBUG("Expectation left=%d wn=%d added", + ASN_DEBUG("+EXPECT1 left=%d wn=%d", stck->cur_ptr->left, stck->cur_ptr->want_nulls); +#endif if(is_bit_str) { + /* Number of meaningless tail bits */ APPEND("\0", 1); } } else { @@ -212,11 +225,11 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, * Jump into stackless primitive decoding. */ _CH_PHASE(ctx, 3); + if(is_ANY_type) APPEND(buf_ptr, rval.consumed); ADVANCE(rval.consumed); goto phase3; } - ADVANCE(rval.consumed); NEXT_PHASE(ctx); /* Fall through */ case 1: @@ -231,6 +244,9 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, ber_tlv_len_t tlv_len; ssize_t tl, ll; + ASN_DEBUG("fetch tag(size=%d), %sstack, left=%d, want0=%d", + (int)size, sel?"":"!", + sel?sel->left:0, sel?sel->want_nulls:0); tl = ber_fetch_tag(buf_ptr, size, &tlv_tag); switch(tl) { case -1: RETURN(RC_FAIL); @@ -241,8 +257,9 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, ll = ber_fetch_length(tlv_constr, (char *)buf_ptr + tl, size - tl, &tlv_len); - ASN_DEBUG("Got tag=%s, tl=%d, len=%d, ll=%d, {%d, %d}", - ber_tlv_tag_string(tlv_tag), tl, tlv_len, ll, + ASN_DEBUG("Got tag=%s, tc=%d, size=%d, tl=%d, len=%d, ll=%d, {%d, %d}", + ber_tlv_tag_string(tlv_tag), tlv_constr, + (int)size, tl, tlv_len, ll, ((uint8_t *)buf_ptr)[0], ((uint8_t *)buf_ptr)[1]); switch(ll) { @@ -250,30 +267,36 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, case 0: RETURN(RC_WMORE); } - if(sel->want_nulls + if(sel && sel->want_nulls && ((uint8_t *)buf_ptr)[0] == 0 && ((uint8_t *)buf_ptr)[1] == 0) { + ADVANCE(2); + if(is_ANY_type) APPEND("\0\0", 2); + + ASN_DEBUG("Eat EOC; wn=%d--", sel->want_nulls); + sel->want_nulls--; if(sel->want_nulls == 0) { /* Move to the next expectation */ sel = stck->cur_ptr = sel->prev; - if(sel == NULL) { - ADVANCE(2); + if(sel == NULL) break; - } } + if(sel->want_nulls) { /* * Simulate while(TRUE) for this loop. * This is necessary to fetch the next - * "end of content" expectation. + * expectation after current "end of content", + * for which tlv_constr is 0. */ - ADVANCE(2); tlv_constr = 1; - continue; } - } else if(tlv_tag != td->tags[td->tags_count-1]) { + + continue; + } else if(tlv_tag != terminal_tag + && terminal_tag != (ber_tlv_tag_t)-1) { char buf[2][32]; ber_tlv_tag_snprint(tlv_tag, buf[0], sizeof(buf[0])); @@ -291,12 +314,13 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, if(sel) { sel->want_nulls = (tlv_len==-1); sel->left = tlv_len; - ASN_DEBUG("Expectation %d %d added", + ASN_DEBUG("+EXPECT2 left=%d wn=%d", sel->left, sel->want_nulls); } else { RETURN(RC_FAIL); } + if(is_ANY_type) APPEND(buf_ptr, tl + ll); ADVANCE(tl+ll); } while(tlv_constr); if(sel == NULL) { From 044f744523ca440476241bf13cac46b2db07bb57 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 4 Sep 2004 04:49:21 +0000 Subject: [PATCH 0241/1469] ANY type renamed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@241 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_expr.h | 4 +- libasn1parser/asn1p_expr_str.h | 2 +- libasn1parser/asn1p_y.c | 5044 ++++++++++++++++++-------------- libasn1parser/asn1p_y.h | 350 ++- libasn1parser/asn1p_y.y | 5 +- 5 files changed, 3101 insertions(+), 2304 deletions(-) diff --git a/libasn1parser/asn1p_expr.h b/libasn1parser/asn1p_expr.h index fd1435066..9accf4c57 100644 --- a/libasn1parser/asn1p_expr.h +++ b/libasn1parser/asn1p_expr.h @@ -52,13 +52,13 @@ typedef enum asn1p_expr_type { ASN_CONSTR_SET, /* SET */ ASN_CONSTR_SEQUENCE_OF, /* SEQUENCE OF */ ASN_CONSTR_SET_OF, /* SET OF */ - ASN_CONSTR_ANY, /* ANY (deprecated) */ /* * ASN.1 Basic types */ #define ASN_BASIC_MASK 0x20 /* Every basic type */ - ASN_BASIC_BOOLEAN = ASN_BASIC_MASK, + ASN_TYPE_ANY = ASN_BASIC_MASK, /* ANY (deprecated) */ + ASN_BASIC_BOOLEAN, ASN_BASIC_NULL, ASN_BASIC_INTEGER, ASN_BASIC_REAL, diff --git a/libasn1parser/asn1p_expr_str.h b/libasn1parser/asn1p_expr_str.h index 59899f5ab..40ddeb608 100644 --- a/libasn1parser/asn1p_expr_str.h +++ b/libasn1parser/asn1p_expr_str.h @@ -11,7 +11,7 @@ static char *asn1p_expr_type2str[] __attribute__ ((unused)) = { [ ASN_CONSTR_SET ] = "SET", [ ASN_CONSTR_SEQUENCE_OF ] = "SEQUENCE OF", [ ASN_CONSTR_SET_OF ] = "SET OF", - [ ASN_CONSTR_ANY ] = "ANY", + [ ASN_TYPE_ANY ] = "ANY", [ ASN_BASIC_BOOLEAN ] = "BOOLEAN", [ ASN_BASIC_NULL ] = "NULL", [ ASN_BASIC_INTEGER ] = "INTEGER", diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index e8cdfb243..520d20d76 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -1,116 +1,269 @@ +/* A Bison parser, made from asn1p_y.y, by GNU bison 1.75. */ -/* A Bison parser, made from asn1p_y.y - by GNU Bison version 1.28 */ +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. -#define YYBISON 1 /* Identify Bison output. */ + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 +/* If NAME_PREFIX is specified substitute the variables and functions + names. */ #define yyparse asn1p_parse -#define yylex asn1p_lex +#define yylex asn1p_lex #define yyerror asn1p_error -#define yylval asn1p_lval -#define yychar asn1p_char +#define yylval asn1p_lval +#define yychar asn1p_char #define yydebug asn1p_debug #define yynerrs asn1p_nerrs -#define TOK_PPEQ 257 -#define TOK_opaque 258 -#define TOK_bstring 259 -#define TOK_cstring 260 -#define TOK_hstring 261 -#define TOK_identifier 262 -#define TOK_number 263 -#define TOK_number_negative 264 -#define TOK_typereference 265 -#define TOK_capitalreference 266 -#define TOK_typefieldreference 267 -#define TOK_valuefieldreference 268 -#define TOK_ABSENT 269 -#define TOK_ABSTRACT_SYNTAX 270 -#define TOK_ALL 271 -#define TOK_ANY 272 -#define TOK_APPLICATION 273 -#define TOK_AUTOMATIC 274 -#define TOK_BEGIN 275 -#define TOK_BIT 276 -#define TOK_BMPString 277 -#define TOK_BOOLEAN 278 -#define TOK_BY 279 -#define TOK_CHARACTER 280 -#define TOK_CHOICE 281 -#define TOK_CLASS 282 -#define TOK_COMPONENT 283 -#define TOK_COMPONENTS 284 -#define TOK_CONSTRAINED 285 -#define TOK_CONTAINING 286 -#define TOK_DEFAULT 287 -#define TOK_DEFINITIONS 288 -#define TOK_DEFINED 289 -#define TOK_EMBEDDED 290 -#define TOK_ENCODED 291 -#define TOK_ENCODING_CONTROL 292 -#define TOK_END 293 -#define TOK_ENUMERATED 294 -#define TOK_EXPLICIT 295 -#define TOK_EXPORTS 296 -#define TOK_EXTENSIBILITY 297 -#define TOK_EXTERNAL 298 -#define TOK_FALSE 299 -#define TOK_FROM 300 -#define TOK_GeneralizedTime 301 -#define TOK_GeneralString 302 -#define TOK_GraphicString 303 -#define TOK_IA5String 304 -#define TOK_IDENTIFIER 305 -#define TOK_IMPLICIT 306 -#define TOK_IMPLIED 307 -#define TOK_IMPORTS 308 -#define TOK_INCLUDES 309 -#define TOK_INSTANCE 310 -#define TOK_INSTRUCTIONS 311 -#define TOK_INTEGER 312 -#define TOK_ISO646String 313 -#define TOK_MAX 314 -#define TOK_MIN 315 -#define TOK_MINUS_INFINITY 316 -#define TOK_NULL 317 -#define TOK_NumericString 318 -#define TOK_OBJECT 319 -#define TOK_ObjectDescriptor 320 -#define TOK_OCTET 321 -#define TOK_OF 322 -#define TOK_OPTIONAL 323 -#define TOK_PATTERN 324 -#define TOK_PDV 325 -#define TOK_PLUS_INFINITY 326 -#define TOK_PRESENT 327 -#define TOK_PrintableString 328 -#define TOK_PRIVATE 329 -#define TOK_REAL 330 -#define TOK_RELATIVE_OID 331 -#define TOK_SEQUENCE 332 -#define TOK_SET 333 -#define TOK_SIZE 334 -#define TOK_STRING 335 -#define TOK_SYNTAX 336 -#define TOK_T61String 337 -#define TOK_TAGS 338 -#define TOK_TeletexString 339 -#define TOK_TRUE 340 -#define TOK_TYPE_IDENTIFIER 341 -#define TOK_UNIQUE 342 -#define TOK_UNIVERSAL 343 -#define TOK_UniversalString 344 -#define TOK_UTCTime 345 -#define TOK_UTF8String 346 -#define TOK_VideotexString 347 -#define TOK_VisibleString 348 -#define TOK_WITH 349 -#define TOK_EXCEPT 350 -#define TOK_INTERSECTION 351 -#define TOK_UNION 352 -#define TOK_TwoDots 353 -#define TOK_ThreeDots 354 -#define TOK_tag 355 + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + TOK_PPEQ = 258, + TOK_opaque = 259, + TOK_bstring = 260, + TOK_cstring = 261, + TOK_hstring = 262, + TOK_identifier = 263, + TOK_number = 264, + TOK_number_negative = 265, + TOK_typereference = 266, + TOK_capitalreference = 267, + TOK_typefieldreference = 268, + TOK_valuefieldreference = 269, + TOK_ABSENT = 270, + TOK_ABSTRACT_SYNTAX = 271, + TOK_ALL = 272, + TOK_ANY = 273, + TOK_APPLICATION = 274, + TOK_AUTOMATIC = 275, + TOK_BEGIN = 276, + TOK_BIT = 277, + TOK_BMPString = 278, + TOK_BOOLEAN = 279, + TOK_BY = 280, + TOK_CHARACTER = 281, + TOK_CHOICE = 282, + TOK_CLASS = 283, + TOK_COMPONENT = 284, + TOK_COMPONENTS = 285, + TOK_CONSTRAINED = 286, + TOK_CONTAINING = 287, + TOK_DEFAULT = 288, + TOK_DEFINITIONS = 289, + TOK_DEFINED = 290, + TOK_EMBEDDED = 291, + TOK_ENCODED = 292, + TOK_ENCODING_CONTROL = 293, + TOK_END = 294, + TOK_ENUMERATED = 295, + TOK_EXPLICIT = 296, + TOK_EXPORTS = 297, + TOK_EXTENSIBILITY = 298, + TOK_EXTERNAL = 299, + TOK_FALSE = 300, + TOK_FROM = 301, + TOK_GeneralizedTime = 302, + TOK_GeneralString = 303, + TOK_GraphicString = 304, + TOK_IA5String = 305, + TOK_IDENTIFIER = 306, + TOK_IMPLICIT = 307, + TOK_IMPLIED = 308, + TOK_IMPORTS = 309, + TOK_INCLUDES = 310, + TOK_INSTANCE = 311, + TOK_INSTRUCTIONS = 312, + TOK_INTEGER = 313, + TOK_ISO646String = 314, + TOK_MAX = 315, + TOK_MIN = 316, + TOK_MINUS_INFINITY = 317, + TOK_NULL = 318, + TOK_NumericString = 319, + TOK_OBJECT = 320, + TOK_ObjectDescriptor = 321, + TOK_OCTET = 322, + TOK_OF = 323, + TOK_OPTIONAL = 324, + TOK_PATTERN = 325, + TOK_PDV = 326, + TOK_PLUS_INFINITY = 327, + TOK_PRESENT = 328, + TOK_PrintableString = 329, + TOK_PRIVATE = 330, + TOK_REAL = 331, + TOK_RELATIVE_OID = 332, + TOK_SEQUENCE = 333, + TOK_SET = 334, + TOK_SIZE = 335, + TOK_STRING = 336, + TOK_SYNTAX = 337, + TOK_T61String = 338, + TOK_TAGS = 339, + TOK_TeletexString = 340, + TOK_TRUE = 341, + TOK_TYPE_IDENTIFIER = 342, + TOK_UNIQUE = 343, + TOK_UNIVERSAL = 344, + TOK_UniversalString = 345, + TOK_UTCTime = 346, + TOK_UTF8String = 347, + TOK_VideotexString = 348, + TOK_VisibleString = 349, + TOK_WITH = 350, + TOK_EXCEPT = 351, + TOK_INTERSECTION = 352, + TOK_UNION = 353, + TOK_TwoDots = 354, + TOK_ThreeDots = 355, + TOK_tag = 356 + }; +#endif +#define TOK_PPEQ 258 +#define TOK_opaque 259 +#define TOK_bstring 260 +#define TOK_cstring 261 +#define TOK_hstring 262 +#define TOK_identifier 263 +#define TOK_number 264 +#define TOK_number_negative 265 +#define TOK_typereference 266 +#define TOK_capitalreference 267 +#define TOK_typefieldreference 268 +#define TOK_valuefieldreference 269 +#define TOK_ABSENT 270 +#define TOK_ABSTRACT_SYNTAX 271 +#define TOK_ALL 272 +#define TOK_ANY 273 +#define TOK_APPLICATION 274 +#define TOK_AUTOMATIC 275 +#define TOK_BEGIN 276 +#define TOK_BIT 277 +#define TOK_BMPString 278 +#define TOK_BOOLEAN 279 +#define TOK_BY 280 +#define TOK_CHARACTER 281 +#define TOK_CHOICE 282 +#define TOK_CLASS 283 +#define TOK_COMPONENT 284 +#define TOK_COMPONENTS 285 +#define TOK_CONSTRAINED 286 +#define TOK_CONTAINING 287 +#define TOK_DEFAULT 288 +#define TOK_DEFINITIONS 289 +#define TOK_DEFINED 290 +#define TOK_EMBEDDED 291 +#define TOK_ENCODED 292 +#define TOK_ENCODING_CONTROL 293 +#define TOK_END 294 +#define TOK_ENUMERATED 295 +#define TOK_EXPLICIT 296 +#define TOK_EXPORTS 297 +#define TOK_EXTENSIBILITY 298 +#define TOK_EXTERNAL 299 +#define TOK_FALSE 300 +#define TOK_FROM 301 +#define TOK_GeneralizedTime 302 +#define TOK_GeneralString 303 +#define TOK_GraphicString 304 +#define TOK_IA5String 305 +#define TOK_IDENTIFIER 306 +#define TOK_IMPLICIT 307 +#define TOK_IMPLIED 308 +#define TOK_IMPORTS 309 +#define TOK_INCLUDES 310 +#define TOK_INSTANCE 311 +#define TOK_INSTRUCTIONS 312 +#define TOK_INTEGER 313 +#define TOK_ISO646String 314 +#define TOK_MAX 315 +#define TOK_MIN 316 +#define TOK_MINUS_INFINITY 317 +#define TOK_NULL 318 +#define TOK_NumericString 319 +#define TOK_OBJECT 320 +#define TOK_ObjectDescriptor 321 +#define TOK_OCTET 322 +#define TOK_OF 323 +#define TOK_OPTIONAL 324 +#define TOK_PATTERN 325 +#define TOK_PDV 326 +#define TOK_PLUS_INFINITY 327 +#define TOK_PRESENT 328 +#define TOK_PrintableString 329 +#define TOK_PRIVATE 330 +#define TOK_REAL 331 +#define TOK_RELATIVE_OID 332 +#define TOK_SEQUENCE 333 +#define TOK_SET 334 +#define TOK_SIZE 335 +#define TOK_STRING 336 +#define TOK_SYNTAX 337 +#define TOK_T61String 338 +#define TOK_TAGS 339 +#define TOK_TeletexString 340 +#define TOK_TRUE 341 +#define TOK_TYPE_IDENTIFIER 342 +#define TOK_UNIQUE 343 +#define TOK_UNIVERSAL 344 +#define TOK_UniversalString 345 +#define TOK_UTCTime 346 +#define TOK_UTF8String 347 +#define TOK_VideotexString 348 +#define TOK_VisibleString 349 +#define TOK_WITH 350 +#define TOK_EXCEPT 351 +#define TOK_INTERSECTION 352 +#define TOK_UNION 353 +#define TOK_TwoDots 354 +#define TOK_ThreeDots 355 +#define TOK_tag 356 + + + + +/* Copy the first part of user declarations. */ #line 1 "asn1p_y.y" @@ -162,6 +315,21 @@ static asn1p_value_t * } while(0) + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +#ifndef YYSTYPE #line 58 "asn1p_y.y" typedef union { asn1p_t *a_grammar; @@ -194,805 +362,1054 @@ typedef union { char *name; struct asn1p_type_tag_s tag; } tv_nametag; -} YYSTYPE; -#include - -#ifndef __cplusplus -#ifndef __STDC__ -#define const +} yystype; +/* Line 193 of /usr/local/share/bison/yacc.c. */ +#line 368 "asn1p_y.c" +# define YYSTYPE yystype +# define YYSTYPE_IS_TRIVIAL 1 #endif + +#ifndef YYLTYPE +typedef struct yyltype +{ + int first_line; + int first_column; + int last_line; + int last_column; +} yyltype; +# define YYLTYPE yyltype +# define YYLTYPE_IS_TRIVIAL 1 #endif +/* Copy the second part of user declarations. */ + + +/* Line 213 of /usr/local/share/bison/yacc.c. */ +#line 389 "asn1p_y.c" + +#if ! defined (yyoverflow) || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# if YYSTACK_USE_ALLOCA +# define YYSTACK_ALLOC alloca +# else +# ifndef YYSTACK_USE_ALLOCA +# if defined (alloca) || defined (_ALLOCA_H) +# define YYSTACK_ALLOC alloca +# else +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# else +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +# define YYSTACK_ALLOC malloc +# define YYSTACK_FREE free +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short yyss; + YYSTYPE yyvs; + }; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAX) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + register YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) +#endif -#define YYFINAL 391 -#define YYFLAG -32768 -#define YYNTBASE 115 - -#define YYTRANSLATE(x) ((unsigned)(x) <= 355 ? yytranslate[x] : 212) - -static const char yytranslate[] = { 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 111, 2, 2, 2, 2, 2, 2, 106, - 107, 2, 2, 109, 2, 112, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 110, 108, 113, - 2, 2, 2, 114, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 97, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 104, 99, 105, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 98, 100, 101, 102, 103 -}; +#if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; +#else + typedef short yysigned_char; +#endif -#if YYDEBUG != 0 -static const short yyprhs[] = { 0, - 0, 2, 4, 7, 16, 17, 19, 23, 26, 28, - 31, 33, 38, 40, 41, 43, 45, 48, 51, 54, - 57, 60, 63, 64, 66, 68, 71, 73, 75, 77, - 79, 81, 82, 86, 88, 92, 95, 97, 100, 105, - 107, 111, 113, 115, 119, 123, 126, 128, 132, 134, - 136, 143, 145, 147, 148, 150, 155, 160, 164, 171, - 173, 177, 179, 183, 187, 189, 193, 195, 197, 199, - 203, 207, 211, 213, 215, 219, 222, 224, 230, 231, - 233, 235, 239, 242, 247, 252, 253, 255, 256, 263, - 265, 268, 270, 272, 274, 278, 282, 285, 287, 289, - 294, 299, 304, 309, 314, 316, 321, 326, 328, 332, - 334, 338, 342, 344, 348, 350, 354, 356, 358, 360, - 362, 367, 368, 372, 374, 376, 378, 380, 382, 384, - 388, 390, 393, 395, 397, 399, 401, 404, 407, 409, - 411, 414, 417, 419, 421, 423, 425, 428, 430, 433, - 435, 437, 439, 441, 443, 445, 447, 449, 451, 453, - 455, 457, 459, 461, 463, 465, 467, 469, 471, 472, - 474, 476, 481, 485, 490, 492, 496, 502, 504, 508, - 512, 516, 521, 525, 527, 531, 535, 539, 543, 545, - 547, 549, 552, 555, 559, 561, 563, 565, 567, 569, - 571, 573, 579, 581, 585, 587, 591, 592, 594, 596, - 598, 600, 602, 604, 608, 613, 615, 619, 622, 626, - 628, 632, 633, 635, 637, 640, 642, 644, 645, 649, - 652, 656, 658, 662, 664, 669, 674, 676, 678, 680, - 682, 683, 685, 687, 690, 693, 695, 697, 699, 701, - 703 +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 7 +#define YYLAST 819 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 115 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 98 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 252 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 391 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 356 + +#define YYTRANSLATE(X) \ + ((unsigned)(X) <= YYMAXUTOK ? yytranslate[X] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 111, 2, 2, 2, 2, 2, 2, + 106, 107, 2, 2, 109, 2, 112, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 110, 108, + 113, 2, 2, 2, 114, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 97, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 104, 99, 105, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 98, 100, 101, 102, 103 }; -static const short yyrhs[] = { 116, - 0, 117, 0, 116, 117, 0, 208, 118, 34, 122, - 3, 21, 125, 39, 0, 0, 119, 0, 104, 120, - 105, 0, 104, 105, 0, 121, 0, 120, 121, 0, - 210, 0, 210, 106, 9, 107, 0, 9, 0, 0, - 123, 0, 124, 0, 123, 124, 0, 41, 84, 0, - 52, 84, 0, 20, 84, 0, 43, 53, 0, 12, - 57, 0, 0, 126, 0, 127, 0, 126, 127, 0, - 129, 0, 134, 0, 140, 0, 166, 0, 137, 0, - 0, 38, 12, 128, 0, 174, 0, 54, 130, 108, - 0, 54, 46, 0, 131, 0, 130, 131, 0, 132, - 46, 208, 118, 0, 133, 0, 132, 109, 133, 0, - 208, 0, 210, 0, 42, 135, 108, 0, 42, 17, - 108, 0, 42, 108, 0, 136, 0, 135, 109, 136, - 0, 208, 0, 210, 0, 208, 138, 3, 104, 139, - 105, 0, 161, 0, 171, 0, 0, 181, 0, 208, - 3, 206, 87, 0, 208, 3, 206, 159, 0, 208, - 3, 149, 0, 208, 104, 141, 105, 3, 159, 0, - 142, 0, 141, 109, 142, 0, 208, 0, 208, 110, - 210, 0, 171, 110, 210, 0, 144, 0, 143, 109, - 144, 0, 159, 0, 210, 0, 146, 0, 145, 109, - 146, 0, 211, 159, 198, 0, 30, 68, 159, 0, - 158, 0, 148, 0, 147, 109, 148, 0, 211, 159, - 0, 158, 0, 28, 104, 151, 105, 153, 0, 0, - 88, 0, 152, 0, 151, 109, 152, 0, 164, 198, - 0, 164, 159, 198, 150, 0, 164, 164, 198, 150, - 0, 0, 154, 0, 0, 95, 82, 104, 155, 156, - 105, 0, 157, 0, 156, 157, 0, 4, 0, 164, - 0, 102, 0, 102, 111, 169, 0, 102, 111, 205, - 0, 160, 178, 0, 173, 0, 174, 0, 27, 104, - 147, 105, 0, 78, 104, 145, 105, 0, 79, 104, - 145, 105, 0, 78, 178, 68, 160, 0, 79, 178, - 68, 160, 0, 18, 0, 18, 35, 25, 210, 0, - 208, 104, 143, 105, 0, 161, 0, 56, 68, 161, - 0, 11, 0, 11, 112, 208, 0, 11, 112, 210, - 0, 209, 0, 209, 112, 162, 0, 163, 0, 162, - 112, 163, 0, 165, 0, 165, 0, 13, 0, 14, - 0, 210, 138, 3, 167, 0, 0, 104, 168, 170, - 0, 5, 0, 7, 0, 6, 0, 205, 0, 169, - 0, 210, 0, 208, 112, 210, 0, 4, 0, 170, - 4, 0, 24, 0, 63, 0, 76, 0, 172, 0, - 67, 81, 0, 65, 51, 0, 77, 0, 44, 0, - 36, 71, 0, 26, 81, 0, 91, 0, 47, 0, - 58, 0, 40, 0, 22, 81, 0, 171, 0, 172, - 202, 0, 23, 0, 48, 0, 49, 0, 50, 0, - 59, 0, 64, 0, 74, 0, 83, 0, 85, 0, - 90, 0, 92, 0, 93, 0, 94, 0, 66, 0, - 99, 0, 100, 0, 97, 0, 98, 0, 96, 0, - 0, 179, 0, 180, 0, 80, 106, 181, 107, 0, - 106, 181, 107, 0, 180, 106, 181, 107, 0, 182, - 0, 182, 109, 102, 0, 182, 109, 102, 109, 182, - 0, 183, 0, 182, 175, 183, 0, 182, 176, 183, - 0, 183, 177, 183, 0, 185, 106, 181, 107, 0, - 106, 181, 107, 0, 186, 0, 186, 184, 186, 0, - 61, 184, 186, 0, 186, 184, 60, 0, 61, 184, - 60, 0, 192, 0, 187, 0, 101, 0, 101, 113, - 0, 113, 101, 0, 113, 101, 113, 0, 80, 0, - 46, 0, 205, 0, 210, 0, 6, 0, 45, 0, - 86, 0, 95, 30, 104, 188, 105, 0, 189, 0, - 188, 109, 189, 0, 102, 0, 210, 178, 190, 0, - 0, 191, 0, 73, 0, 15, 0, 69, 0, 193, - 0, 194, 0, 104, 208, 105, 0, 193, 104, 195, - 105, 0, 196, 0, 195, 109, 196, 0, 114, 197, - 0, 114, 112, 197, 0, 210, 0, 197, 112, 210, - 0, 0, 199, 0, 69, 0, 33, 200, 0, 186, - 0, 171, 0, 0, 104, 201, 170, 0, 104, 105, - 0, 104, 203, 105, 0, 204, 0, 203, 109, 204, - 0, 210, 0, 210, 106, 205, 107, 0, 210, 106, - 169, 107, 0, 205, 0, 102, 0, 9, 0, 10, - 0, 0, 207, 0, 103, 0, 103, 52, 0, 103, - 41, 0, 11, 0, 12, 0, 12, 0, 8, 0, - 210, 0, 210, 207, 0 +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const unsigned short yyprhs[] = +{ + 0, 0, 3, 5, 7, 10, 19, 20, 22, 26, + 29, 31, 34, 36, 41, 43, 44, 46, 48, 51, + 54, 57, 60, 63, 66, 67, 69, 71, 74, 76, + 78, 80, 82, 84, 85, 89, 91, 95, 98, 100, + 103, 108, 110, 114, 116, 118, 122, 126, 129, 131, + 135, 137, 139, 146, 148, 150, 151, 153, 158, 163, + 167, 174, 176, 180, 182, 186, 190, 192, 196, 198, + 200, 202, 206, 210, 214, 216, 218, 222, 225, 227, + 233, 234, 236, 238, 242, 245, 250, 255, 256, 258, + 259, 266, 268, 271, 273, 275, 277, 281, 285, 288, + 290, 292, 297, 302, 307, 312, 317, 319, 324, 329, + 331, 335, 337, 341, 345, 347, 351, 353, 357, 359, + 361, 363, 365, 370, 371, 375, 377, 379, 381, 383, + 385, 387, 391, 393, 396, 398, 400, 402, 404, 407, + 410, 412, 414, 417, 420, 422, 424, 426, 428, 431, + 433, 436, 438, 440, 442, 444, 446, 448, 450, 452, + 454, 456, 458, 460, 462, 464, 466, 468, 470, 472, + 474, 475, 477, 479, 484, 488, 493, 495, 499, 505, + 507, 511, 515, 519, 524, 528, 530, 534, 538, 542, + 546, 548, 550, 552, 555, 558, 562, 564, 566, 568, + 570, 572, 574, 576, 582, 584, 588, 590, 594, 595, + 597, 599, 601, 603, 605, 607, 611, 616, 618, 622, + 625, 629, 631, 635, 636, 638, 640, 643, 645, 647, + 648, 652, 655, 659, 661, 665, 667, 672, 677, 679, + 681, 683, 685, 686, 688, 690, 693, 696, 698, 700, + 702, 704, 706 }; -#endif +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const short yyrhs[] = +{ + 116, 0, -1, 117, -1, 118, -1, 117, 118, -1, + 209, 119, 34, 123, 3, 21, 126, 39, -1, -1, + 120, -1, 104, 121, 105, -1, 104, 105, -1, 122, + -1, 121, 122, -1, 211, -1, 211, 106, 9, 107, + -1, 9, -1, -1, 124, -1, 125, -1, 124, 125, + -1, 41, 84, -1, 52, 84, -1, 20, 84, -1, + 43, 53, -1, 12, 57, -1, -1, 127, -1, 128, + -1, 127, 128, -1, 130, -1, 135, -1, 141, -1, + 167, -1, 138, -1, -1, 38, 12, 129, -1, 175, + -1, 54, 131, 108, -1, 54, 46, -1, 132, -1, + 131, 132, -1, 133, 46, 209, 119, -1, 134, -1, + 133, 109, 134, -1, 209, -1, 211, -1, 42, 136, + 108, -1, 42, 17, 108, -1, 42, 108, -1, 137, + -1, 136, 109, 137, -1, 209, -1, 211, -1, 209, + 139, 3, 104, 140, 105, -1, 162, -1, 172, -1, + -1, 182, -1, 209, 3, 207, 87, -1, 209, 3, + 207, 160, -1, 209, 3, 150, -1, 209, 104, 142, + 105, 3, 160, -1, 143, -1, 142, 109, 143, -1, + 209, -1, 209, 110, 211, -1, 172, 110, 211, -1, + 145, -1, 144, 109, 145, -1, 160, -1, 211, -1, + 147, -1, 146, 109, 147, -1, 212, 160, 199, -1, + 30, 68, 160, -1, 159, -1, 149, -1, 148, 109, + 149, -1, 212, 160, -1, 159, -1, 28, 104, 152, + 105, 154, -1, -1, 88, -1, 153, -1, 152, 109, + 153, -1, 165, 199, -1, 165, 160, 199, 151, -1, + 165, 165, 199, 151, -1, -1, 155, -1, -1, 95, + 82, 104, 156, 157, 105, -1, 158, -1, 157, 158, + -1, 4, -1, 165, -1, 102, -1, 102, 111, 170, + -1, 102, 111, 206, -1, 161, 179, -1, 174, -1, + 175, -1, 27, 104, 148, 105, -1, 78, 104, 146, + 105, -1, 79, 104, 146, 105, -1, 78, 179, 68, + 161, -1, 79, 179, 68, 161, -1, 18, -1, 18, + 35, 25, 211, -1, 209, 104, 144, 105, -1, 162, + -1, 56, 68, 162, -1, 11, -1, 11, 112, 209, + -1, 11, 112, 211, -1, 210, -1, 210, 112, 163, + -1, 164, -1, 163, 112, 164, -1, 166, -1, 166, + -1, 13, -1, 14, -1, 211, 139, 3, 168, -1, + -1, 104, 169, 171, -1, 5, -1, 7, -1, 6, + -1, 206, -1, 170, -1, 211, -1, 209, 112, 211, + -1, 4, -1, 171, 4, -1, 24, -1, 63, -1, + 76, -1, 173, -1, 67, 81, -1, 65, 51, -1, + 77, -1, 44, -1, 36, 71, -1, 26, 81, -1, + 91, -1, 47, -1, 58, -1, 40, -1, 22, 81, + -1, 172, -1, 173, 203, -1, 23, -1, 48, -1, + 49, -1, 50, -1, 59, -1, 64, -1, 74, -1, + 83, -1, 85, -1, 90, -1, 92, -1, 93, -1, + 94, -1, 66, -1, 99, -1, 100, -1, 97, -1, + 98, -1, 96, -1, -1, 180, -1, 181, -1, 80, + 106, 182, 107, -1, 106, 182, 107, -1, 181, 106, + 182, 107, -1, 183, -1, 183, 109, 102, -1, 183, + 109, 102, 109, 183, -1, 184, -1, 183, 176, 184, + -1, 183, 177, 184, -1, 184, 178, 184, -1, 186, + 106, 182, 107, -1, 106, 182, 107, -1, 187, -1, + 187, 185, 187, -1, 61, 185, 187, -1, 187, 185, + 60, -1, 61, 185, 60, -1, 193, -1, 188, -1, + 101, -1, 101, 113, -1, 113, 101, -1, 113, 101, + 113, -1, 80, -1, 46, -1, 206, -1, 211, -1, + 6, -1, 45, -1, 86, -1, 95, 30, 104, 189, + 105, -1, 190, -1, 189, 109, 190, -1, 102, -1, + 211, 179, 191, -1, -1, 192, -1, 73, -1, 15, + -1, 69, -1, 194, -1, 195, -1, 104, 209, 105, + -1, 194, 104, 196, 105, -1, 197, -1, 196, 109, + 197, -1, 114, 198, -1, 114, 112, 198, -1, 211, + -1, 198, 112, 211, -1, -1, 200, -1, 69, -1, + 33, 201, -1, 187, -1, 172, -1, -1, 104, 202, + 171, -1, 104, 105, -1, 104, 204, 105, -1, 205, + -1, 204, 109, 205, -1, 211, -1, 211, 106, 206, + 107, -1, 211, 106, 170, 107, -1, 206, -1, 102, + -1, 9, -1, 10, -1, -1, 208, -1, 103, -1, + 103, 52, -1, 103, 41, -1, 11, -1, 12, -1, + 12, -1, 8, -1, 211, -1, 211, 208, -1 +}; -#if YYDEBUG != 0 -static const short yyrline[] = { 0, - 298, 304, 310, 326, 351, 353, 356, 360, 365, 372, - 380, 385, 389, 398, 400, 408, 412, 420, 424, 427, - 430, 434, 454, 456, 464, 468, 500, 504, 513, 520, - 533, 540, 542, 554, 567, 574, 579, 585, 591, 600, - 606, 612, 619, 627, 631, 634, 641, 647, 653, 660, - 669, 679, 687, 695, 697, 709, 721, 728, 744, 753, - 763, 773, 778, 785, 795, 801, 807, 811, 823, 829, - 835, 843, 850, 855, 861, 867, 874, 879, 889, 891, - 894, 902, 908, 917, 923, 940, 942, 947, 951, 956, - 961, 967, 971, 982, 991, 1000, 1011, 1032, 1036, 1042, - 1048, 1054, 1060, 1068, 1076, 1082, 1097, 1121, 1128, 1142, - 1151, 1161, 1171, 1179, 1200, 1209, 1218, 1219, 1221, 1228, - 1240, 1250, 1252, 1257, 1261, 1265, 1269, 1272, 1277, 1289, - 1305, 1316, 1330, 1332, 1333, 1334, 1335, 1336, 1337, 1338, - 1339, 1340, 1341, 1342, 1348, 1350, 1351, 1354, 1361, 1373, - 1375, 1379, 1383, 1384, 1385, 1386, 1387, 1391, 1392, 1393, - 1394, 1398, 1399, 1406, 1406, 1407, 1407, 1408, 1410, 1412, - 1417, 1421, 1430, 1434, 1439, 1443, 1449, 1459, 1463, 1466, - 1469, 1474, 1483, 1491, 1497, 1504, 1512, 1520, 1529, 1532, - 1537, 1539, 1540, 1541, 1544, 1548, 1553, 1557, 1568, 1573, - 1578, 1585, 1591, 1595, 1600, 1606, 1618, 1620, 1623, 1627, - 1630, 1635, 1639, 1647, 1662, 1668, 1675, 1688, 1700, 1715, - 1719, 1736, 1738, 1741, 1745, 1751, 1754, 1756, 1756, 1776, - 1781, 1786, 1792, 1798, 1806, 1814, 1822, 1829, 1839, 1844, - 1874, 1876, 1879, 1884, 1888, 1894, 1899, 1906, 1913, 1920, - 1925 +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const unsigned short yyrline[] = +{ + 0, 298, 298, 304, 310, 326, 351, 353, 356, 360, + 365, 372, 380, 385, 389, 398, 400, 408, 412, 420, + 424, 427, 430, 434, 454, 456, 464, 468, 500, 504, + 513, 520, 533, 541, 540, 554, 567, 574, 579, 585, + 591, 600, 606, 612, 619, 627, 631, 634, 641, 647, + 653, 660, 669, 679, 687, 695, 697, 709, 721, 728, + 744, 753, 763, 773, 778, 785, 795, 801, 807, 811, + 823, 829, 835, 843, 850, 855, 861, 867, 874, 879, + 889, 891, 894, 902, 908, 917, 923, 940, 942, 949, + 947, 956, 961, 967, 971, 982, 991, 1000, 1011, 1032, + 1036, 1042, 1048, 1054, 1060, 1068, 1076, 1082, 1096, 1120, + 1127, 1141, 1150, 1160, 1170, 1178, 1199, 1208, 1217, 1218, + 1220, 1227, 1239, 1250, 1249, 1256, 1260, 1264, 1268, 1271, + 1276, 1288, 1304, 1315, 1329, 1331, 1332, 1333, 1334, 1335, + 1336, 1337, 1338, 1339, 1340, 1341, 1347, 1349, 1350, 1353, + 1360, 1372, 1374, 1378, 1382, 1383, 1384, 1385, 1386, 1390, + 1391, 1392, 1393, 1397, 1398, 1405, 1405, 1406, 1406, 1407, + 1409, 1411, 1416, 1420, 1429, 1433, 1438, 1442, 1448, 1458, + 1462, 1465, 1468, 1473, 1482, 1490, 1496, 1503, 1511, 1519, + 1528, 1531, 1536, 1538, 1539, 1540, 1543, 1547, 1552, 1556, + 1567, 1572, 1577, 1584, 1590, 1594, 1599, 1605, 1617, 1619, + 1622, 1626, 1629, 1634, 1638, 1646, 1661, 1667, 1674, 1687, + 1699, 1714, 1718, 1735, 1737, 1740, 1744, 1750, 1753, 1755, + 1755, 1775, 1780, 1785, 1791, 1797, 1805, 1813, 1821, 1828, + 1838, 1843, 1873, 1875, 1878, 1883, 1887, 1893, 1898, 1905, + 1912, 1919, 1924 }; #endif - -#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) - -static const char * const yytname[] = { "$","error","$undefined.","TOK_PPEQ", -"TOK_opaque","TOK_bstring","TOK_cstring","TOK_hstring","TOK_identifier","TOK_number", -"TOK_number_negative","TOK_typereference","TOK_capitalreference","TOK_typefieldreference", -"TOK_valuefieldreference","TOK_ABSENT","TOK_ABSTRACT_SYNTAX","TOK_ALL","TOK_ANY", -"TOK_APPLICATION","TOK_AUTOMATIC","TOK_BEGIN","TOK_BIT","TOK_BMPString","TOK_BOOLEAN", -"TOK_BY","TOK_CHARACTER","TOK_CHOICE","TOK_CLASS","TOK_COMPONENT","TOK_COMPONENTS", -"TOK_CONSTRAINED","TOK_CONTAINING","TOK_DEFAULT","TOK_DEFINITIONS","TOK_DEFINED", -"TOK_EMBEDDED","TOK_ENCODED","TOK_ENCODING_CONTROL","TOK_END","TOK_ENUMERATED", -"TOK_EXPLICIT","TOK_EXPORTS","TOK_EXTENSIBILITY","TOK_EXTERNAL","TOK_FALSE", -"TOK_FROM","TOK_GeneralizedTime","TOK_GeneralString","TOK_GraphicString","TOK_IA5String", -"TOK_IDENTIFIER","TOK_IMPLICIT","TOK_IMPLIED","TOK_IMPORTS","TOK_INCLUDES","TOK_INSTANCE", -"TOK_INSTRUCTIONS","TOK_INTEGER","TOK_ISO646String","TOK_MAX","TOK_MIN","TOK_MINUS_INFINITY", -"TOK_NULL","TOK_NumericString","TOK_OBJECT","TOK_ObjectDescriptor","TOK_OCTET", -"TOK_OF","TOK_OPTIONAL","TOK_PATTERN","TOK_PDV","TOK_PLUS_INFINITY","TOK_PRESENT", -"TOK_PrintableString","TOK_PRIVATE","TOK_REAL","TOK_RELATIVE_OID","TOK_SEQUENCE", -"TOK_SET","TOK_SIZE","TOK_STRING","TOK_SYNTAX","TOK_T61String","TOK_TAGS","TOK_TeletexString", -"TOK_TRUE","TOK_TYPE_IDENTIFIER","TOK_UNIQUE","TOK_UNIVERSAL","TOK_UniversalString", -"TOK_UTCTime","TOK_UTF8String","TOK_VideotexString","TOK_VisibleString","TOK_WITH", -"TOK_EXCEPT","'^'","TOK_INTERSECTION","'|'","TOK_UNION","TOK_TwoDots","TOK_ThreeDots", -"TOK_tag","'{'","'}'","'('","')'","';'","','","':'","'!'","'.'","'<'","'@'", -"ParsedGrammar","ModuleList","ModuleSpecification","optObjectIdentifier","ObjectIdentifier", -"ObjectIdentifierBody","ObjectIdentifierElement","optModuleSpecificationFlags", -"ModuleSpecificationFlags","ModuleSpecificationFlag","optModuleSpecificationBody", -"ModuleSpecificationBody","ModuleSpecificationElement","@1","ImportsDefinition", -"ImportsBundleSet","ImportsBundle","ImportsList","ImportsElement","ExportsDefinition", -"ExportsBody","ExportsElement","ValueSetDefinition","DefinedTypeRef","optValueSetBody", -"DataTypeReference","ParameterArgumentList","ParameterArgumentName","ActualParameterList", -"ActualParameter","ComponentTypeLists","ComponentType","AlternativeTypeLists", -"AlternativeType","ClassDeclaration","optUnique","ClassFieldList","ClassField", -"optWithSyntax","WithSyntax","@2","WithSyntaxFormat","WithSyntaxFormatToken", -"ExtensionAndException","Type","TypeDeclaration","ComplexTypeReference","ComplexTypeReferenceAmpList", -"ComplexTypeReferenceElement","ClassFieldIdentifier","ClassFieldName","ValueDefinition", -"InlineOrDefinedValue","@3","DefinedValue","Opaque","BasicTypeId","BasicTypeId_UniverationCompatible", -"BasicType","BasicString","Union","Intersection","Except","optConstraints","Constraints", -"SetOfConstraints","ElementSetSpecs","ElementSetSpec","ConstraintSubtypeElement", -"ConstraintRangeSpec","ConstraintSpec","ConstraintValue","WithComponents","WithComponentsList", -"WithComponentsElement","optPresenceConstraint","PresenceConstraint","TableConstraint", -"SimpleTableConstraint","ComponentRelationConstraint","AtNotationList","AtNotationElement", -"ComponentIdList","optMarker","Marker","DefaultValue","@4","UniverationDefinition", -"UniverationList","UniverationElement","SignedNumber","optTag","Tag","TypeRefName", -"ObjectClassReference","Identifier","TaggedIdentifier", NULL +#if YYDEBUG || YYERROR_VERBOSE +/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "TOK_PPEQ", "TOK_opaque", "TOK_bstring", + "TOK_cstring", "TOK_hstring", "TOK_identifier", "TOK_number", + "TOK_number_negative", "TOK_typereference", "TOK_capitalreference", + "TOK_typefieldreference", "TOK_valuefieldreference", "TOK_ABSENT", + "TOK_ABSTRACT_SYNTAX", "TOK_ALL", "TOK_ANY", "TOK_APPLICATION", + "TOK_AUTOMATIC", "TOK_BEGIN", "TOK_BIT", "TOK_BMPString", "TOK_BOOLEAN", + "TOK_BY", "TOK_CHARACTER", "TOK_CHOICE", "TOK_CLASS", "TOK_COMPONENT", + "TOK_COMPONENTS", "TOK_CONSTRAINED", "TOK_CONTAINING", "TOK_DEFAULT", + "TOK_DEFINITIONS", "TOK_DEFINED", "TOK_EMBEDDED", "TOK_ENCODED", + "TOK_ENCODING_CONTROL", "TOK_END", "TOK_ENUMERATED", "TOK_EXPLICIT", + "TOK_EXPORTS", "TOK_EXTENSIBILITY", "TOK_EXTERNAL", "TOK_FALSE", + "TOK_FROM", "TOK_GeneralizedTime", "TOK_GeneralString", + "TOK_GraphicString", "TOK_IA5String", "TOK_IDENTIFIER", "TOK_IMPLICIT", + "TOK_IMPLIED", "TOK_IMPORTS", "TOK_INCLUDES", "TOK_INSTANCE", + "TOK_INSTRUCTIONS", "TOK_INTEGER", "TOK_ISO646String", "TOK_MAX", + "TOK_MIN", "TOK_MINUS_INFINITY", "TOK_NULL", "TOK_NumericString", + "TOK_OBJECT", "TOK_ObjectDescriptor", "TOK_OCTET", "TOK_OF", + "TOK_OPTIONAL", "TOK_PATTERN", "TOK_PDV", "TOK_PLUS_INFINITY", + "TOK_PRESENT", "TOK_PrintableString", "TOK_PRIVATE", "TOK_REAL", + "TOK_RELATIVE_OID", "TOK_SEQUENCE", "TOK_SET", "TOK_SIZE", "TOK_STRING", + "TOK_SYNTAX", "TOK_T61String", "TOK_TAGS", "TOK_TeletexString", + "TOK_TRUE", "TOK_TYPE_IDENTIFIER", "TOK_UNIQUE", "TOK_UNIVERSAL", + "TOK_UniversalString", "TOK_UTCTime", "TOK_UTF8String", + "TOK_VideotexString", "TOK_VisibleString", "TOK_WITH", "TOK_EXCEPT", + "'^'", "TOK_INTERSECTION", "'|'", "TOK_UNION", "TOK_TwoDots", + "TOK_ThreeDots", "TOK_tag", "'{'", "'}'", "'('", "')'", "';'", "','", + "':'", "'!'", "'.'", "'<'", "'@'", "$accept", "ParsedGrammar", + "ModuleList", "ModuleSpecification", "optObjectIdentifier", + "ObjectIdentifier", "ObjectIdentifierBody", "ObjectIdentifierElement", + "optModuleSpecificationFlags", "ModuleSpecificationFlags", + "ModuleSpecificationFlag", "optModuleSpecificationBody", + "ModuleSpecificationBody", "ModuleSpecificationElement", "@1", + "ImportsDefinition", "ImportsBundleSet", "ImportsBundle", "ImportsList", + "ImportsElement", "ExportsDefinition", "ExportsBody", "ExportsElement", + "ValueSetDefinition", "DefinedTypeRef", "optValueSetBody", + "DataTypeReference", "ParameterArgumentList", "ParameterArgumentName", + "ActualParameterList", "ActualParameter", "ComponentTypeLists", + "ComponentType", "AlternativeTypeLists", "AlternativeType", + "ClassDeclaration", "optUnique", "ClassFieldList", "ClassField", + "optWithSyntax", "WithSyntax", "@2", "WithSyntaxFormat", + "WithSyntaxFormatToken", "ExtensionAndException", "Type", + "TypeDeclaration", "ComplexTypeReference", + "ComplexTypeReferenceAmpList", "ComplexTypeReferenceElement", + "ClassFieldIdentifier", "ClassFieldName", "ValueDefinition", + "InlineOrDefinedValue", "@3", "DefinedValue", "Opaque", "BasicTypeId", + "BasicTypeId_UniverationCompatible", "BasicType", "BasicString", + "Union", "Intersection", "Except", "optConstraints", "Constraints", + "SetOfConstraints", "ElementSetSpecs", "ElementSetSpec", + "ConstraintSubtypeElement", "ConstraintRangeSpec", "ConstraintSpec", + "ConstraintValue", "WithComponents", "WithComponentsList", + "WithComponentsElement", "optPresenceConstraint", "PresenceConstraint", + "TableConstraint", "SimpleTableConstraint", + "ComponentRelationConstraint", "AtNotationList", "AtNotationElement", + "ComponentIdList", "optMarker", "Marker", "DefaultValue", "@4", + "UniverationDefinition", "UniverationList", "UniverationElement", + "SignedNumber", "optTag", "Tag", "TypeRefName", "ObjectClassReference", + "Identifier", "TaggedIdentifier", 0 }; #endif -static const short yyr1[] = { 0, - 115, 116, 116, 117, 118, 118, 119, 119, 120, 120, - 121, 121, 121, 122, 122, 123, 123, 124, 124, 124, - 124, 124, 125, 125, 126, 126, 127, 127, 127, 127, - 127, 128, 127, 127, 129, 129, 130, 130, 131, 132, - 132, 133, 133, 134, 134, 134, 135, 135, 136, 136, - 137, 138, 138, 139, 139, 140, 140, 140, 140, 141, - 141, 142, 142, 142, 143, 143, 144, 144, 145, 145, - 146, 146, 146, 147, 147, 148, 148, 149, 150, 150, - 151, 151, 152, 152, 152, 153, 153, 155, 154, 156, - 156, 157, 157, 158, 158, 158, 159, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, 160, 161, - 161, 161, 161, 161, 162, 162, 163, 164, 165, 165, - 166, 168, 167, 167, 167, 167, 167, 167, 169, 169, - 170, 170, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 172, 172, 172, 173, 173, 174, - 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, - 174, 174, 174, 175, 175, 176, 176, 177, 178, 178, - 179, 179, 180, 180, 181, 181, 181, 182, 182, 182, - 182, 183, 183, 183, 183, 183, 183, 183, 183, 183, - 184, 184, 184, 184, 185, 185, 186, 186, 186, 186, - 186, 187, 188, 188, 189, 189, 190, 190, 191, 191, - 191, 192, 192, 193, 194, 195, 195, 196, 196, 197, - 197, 198, 198, 199, 199, 200, 200, 201, 200, 202, - 202, 203, 203, 204, 204, 204, 204, 204, 205, 205, - 206, 206, 207, 207, 207, 208, 208, 209, 210, 211, - 211 +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const unsigned short yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 94, 352, 124, + 353, 354, 355, 356, 123, 125, 40, 41, 59, 44, + 58, 33, 46, 60, 64 }; - -static const short yyr2[] = { 0, - 1, 1, 2, 8, 0, 1, 3, 2, 1, 2, - 1, 4, 1, 0, 1, 1, 2, 2, 2, 2, - 2, 2, 0, 1, 1, 2, 1, 1, 1, 1, - 1, 0, 3, 1, 3, 2, 1, 2, 4, 1, - 3, 1, 1, 3, 3, 2, 1, 3, 1, 1, - 6, 1, 1, 0, 1, 4, 4, 3, 6, 1, - 3, 1, 3, 3, 1, 3, 1, 1, 1, 3, - 3, 3, 1, 1, 3, 2, 1, 5, 0, 1, - 1, 3, 2, 4, 4, 0, 1, 0, 6, 1, - 2, 1, 1, 1, 3, 3, 2, 1, 1, 4, - 4, 4, 4, 4, 1, 4, 4, 1, 3, 1, - 3, 3, 1, 3, 1, 3, 1, 1, 1, 1, - 4, 0, 3, 1, 1, 1, 1, 1, 1, 3, - 1, 2, 1, 1, 1, 1, 2, 2, 1, 1, - 2, 2, 1, 1, 1, 1, 2, 1, 2, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, - 1, 4, 3, 4, 1, 3, 5, 1, 3, 3, - 3, 4, 3, 1, 3, 3, 3, 3, 1, 1, - 1, 2, 2, 3, 1, 1, 1, 1, 1, 1, - 1, 5, 1, 3, 1, 3, 0, 1, 1, 1, - 1, 1, 1, 3, 4, 1, 3, 2, 3, 1, - 3, 0, 1, 1, 2, 1, 1, 0, 3, 2, - 3, 1, 3, 1, 4, 4, 1, 1, 1, 1, - 0, 1, 1, 2, 2, 1, 1, 1, 1, 1, - 2 +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const unsigned char yyr1[] = +{ + 0, 115, 116, 117, 117, 118, 119, 119, 120, 120, + 121, 121, 122, 122, 122, 123, 123, 124, 124, 125, + 125, 125, 125, 125, 126, 126, 127, 127, 128, 128, + 128, 128, 128, 129, 128, 128, 130, 130, 131, 131, + 132, 133, 133, 134, 134, 135, 135, 135, 136, 136, + 137, 137, 138, 139, 139, 140, 140, 141, 141, 141, + 141, 142, 142, 143, 143, 143, 144, 144, 145, 145, + 146, 146, 147, 147, 147, 148, 148, 149, 149, 150, + 151, 151, 152, 152, 153, 153, 153, 154, 154, 156, + 155, 157, 157, 158, 158, 159, 159, 159, 160, 161, + 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, + 161, 162, 162, 162, 162, 162, 163, 163, 164, 165, + 166, 166, 167, 169, 168, 168, 168, 168, 168, 168, + 170, 170, 171, 171, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 173, 173, 173, 174, + 174, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 176, 176, 177, 177, 178, + 179, 179, 180, 180, 181, 181, 182, 182, 182, 183, + 183, 183, 183, 184, 184, 184, 184, 184, 184, 184, + 184, 184, 185, 185, 185, 185, 186, 186, 187, 187, + 187, 187, 187, 188, 189, 189, 190, 190, 191, 191, + 192, 192, 192, 193, 193, 194, 195, 196, 196, 197, + 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, + 201, 203, 203, 204, 204, 205, 205, 205, 205, 205, + 206, 206, 207, 207, 208, 208, 208, 209, 209, 210, + 211, 212, 212 }; -static const short yydefact[] = { 0, - 246, 247, 1, 2, 5, 3, 0, 0, 6, 249, - 13, 8, 0, 9, 11, 14, 7, 10, 0, 0, - 0, 0, 0, 0, 0, 15, 16, 0, 22, 20, - 18, 21, 19, 0, 17, 12, 23, 150, 0, 0, - 151, 152, 153, 0, 154, 155, 163, 156, 157, 158, - 159, 160, 161, 162, 0, 24, 25, 27, 28, 31, - 29, 30, 34, 0, 0, 32, 0, 46, 0, 47, - 49, 50, 36, 0, 37, 0, 40, 42, 43, 4, - 26, 241, 110, 248, 0, 133, 0, 0, 146, 140, - 144, 145, 134, 0, 0, 135, 139, 143, 0, 0, - 52, 53, 136, 113, 0, 33, 45, 44, 0, 35, - 38, 0, 0, 0, 243, 58, 0, 242, 0, 147, - 142, 141, 138, 137, 0, 60, 0, 62, 0, 0, - 0, 48, 5, 41, 0, 245, 244, 110, 248, 105, - 0, 0, 169, 169, 56, 57, 169, 108, 148, 136, - 98, 99, 0, 111, 112, 0, 0, 0, 0, 54, - 119, 120, 114, 115, 117, 124, 126, 125, 239, 240, - 122, 121, 128, 127, 0, 129, 39, 0, 81, 222, - 118, 0, 0, 0, 0, 0, 0, 0, 170, 171, - 0, 0, 97, 0, 149, 0, 0, 61, 64, 63, - 199, 200, 196, 0, 195, 201, 0, 0, 0, 0, - 55, 175, 178, 0, 184, 190, 189, 212, 213, 197, - 198, 0, 0, 0, 86, 0, 0, 224, 222, 222, - 83, 223, 0, 94, 0, 74, 77, 250, 0, 109, - 0, 0, 0, 69, 73, 0, 0, 0, 0, 0, - 0, 238, 230, 0, 232, 237, 234, 0, 65, 67, - 68, 59, 191, 0, 0, 0, 0, 0, 51, 166, - 167, 164, 165, 0, 0, 0, 168, 0, 0, 0, - 0, 116, 131, 123, 130, 0, 78, 87, 82, 228, - 227, 226, 225, 79, 79, 106, 0, 100, 0, 251, - 76, 0, 0, 101, 0, 222, 173, 103, 0, 102, - 104, 231, 0, 0, 107, 0, 192, 193, 188, 186, - 0, 214, 183, 176, 179, 180, 181, 0, 187, 185, - 0, 0, 216, 132, 0, 0, 80, 84, 85, 95, - 96, 75, 172, 72, 70, 71, 174, 233, 0, 0, - 66, 194, 205, 0, 203, 169, 0, 182, 0, 218, - 220, 215, 0, 88, 229, 236, 235, 202, 0, 207, - 177, 219, 0, 217, 0, 204, 210, 211, 209, 206, - 208, 221, 92, 0, 90, 93, 89, 91, 0, 0, - 0 +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const unsigned char yyr2[] = +{ + 0, 2, 1, 1, 2, 8, 0, 1, 3, 2, + 1, 2, 1, 4, 1, 0, 1, 1, 2, 2, + 2, 2, 2, 2, 0, 1, 1, 2, 1, 1, + 1, 1, 1, 0, 3, 1, 3, 2, 1, 2, + 4, 1, 3, 1, 1, 3, 3, 2, 1, 3, + 1, 1, 6, 1, 1, 0, 1, 4, 4, 3, + 6, 1, 3, 1, 3, 3, 1, 3, 1, 1, + 1, 3, 3, 3, 1, 1, 3, 2, 1, 5, + 0, 1, 1, 3, 2, 4, 4, 0, 1, 0, + 6, 1, 2, 1, 1, 1, 3, 3, 2, 1, + 1, 4, 4, 4, 4, 4, 1, 4, 4, 1, + 3, 1, 3, 3, 1, 3, 1, 3, 1, 1, + 1, 1, 4, 0, 3, 1, 1, 1, 1, 1, + 1, 3, 1, 2, 1, 1, 1, 1, 2, 2, + 1, 1, 2, 2, 1, 1, 1, 1, 2, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 4, 3, 4, 1, 3, 5, 1, + 3, 3, 3, 4, 3, 1, 3, 3, 3, 3, + 1, 1, 1, 2, 2, 3, 1, 1, 1, 1, + 1, 1, 1, 5, 1, 3, 1, 3, 0, 1, + 1, 1, 1, 1, 1, 3, 4, 1, 3, 2, + 3, 1, 3, 0, 1, 1, 2, 1, 1, 0, + 3, 2, 3, 1, 3, 1, 4, 4, 1, 1, + 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, + 1, 1, 2 }; -static const short yydefgoto[] = { 389, - 3, 4, 8, 9, 13, 14, 25, 26, 27, 55, - 56, 57, 106, 58, 74, 75, 76, 77, 59, 69, - 70, 60, 100, 210, 61, 125, 126, 258, 259, 243, - 244, 235, 236, 116, 338, 178, 179, 287, 288, 375, - 384, 385, 245, 260, 147, 148, 163, 164, 180, 181, - 62, 172, 223, 173, 284, 149, 150, 151, 152, 275, - 276, 278, 188, 189, 190, 211, 212, 213, 265, 214, - 215, 216, 354, 355, 380, 381, 217, 218, 219, 332, - 333, 360, 231, 232, 293, 336, 195, 254, 255, 220, - 117, 118, 153, 104, 221, 246 +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const unsigned char yydefact[] = +{ + 0, 247, 248, 0, 2, 3, 6, 1, 4, 0, + 0, 7, 250, 14, 9, 0, 10, 12, 15, 8, + 11, 0, 0, 0, 0, 0, 0, 0, 16, 17, + 0, 23, 21, 19, 22, 20, 0, 18, 13, 24, + 151, 0, 0, 152, 153, 154, 0, 155, 156, 164, + 157, 158, 159, 160, 161, 162, 163, 0, 25, 26, + 28, 29, 32, 30, 31, 35, 0, 0, 33, 0, + 47, 0, 48, 50, 51, 37, 0, 38, 0, 41, + 43, 44, 5, 27, 242, 111, 249, 0, 134, 0, + 0, 147, 141, 145, 146, 135, 0, 0, 136, 140, + 144, 0, 0, 53, 54, 137, 114, 0, 34, 46, + 45, 0, 36, 39, 0, 0, 0, 244, 59, 0, + 243, 0, 148, 143, 142, 139, 138, 0, 61, 0, + 63, 0, 0, 0, 49, 6, 42, 0, 246, 245, + 111, 249, 106, 0, 0, 170, 170, 57, 58, 170, + 109, 149, 137, 99, 100, 0, 112, 113, 0, 0, + 0, 0, 55, 120, 121, 115, 116, 118, 125, 127, + 126, 240, 241, 123, 122, 129, 128, 0, 130, 40, + 0, 82, 223, 119, 0, 0, 0, 0, 0, 0, + 0, 171, 172, 0, 0, 98, 0, 150, 0, 0, + 62, 65, 64, 200, 201, 197, 0, 196, 202, 0, + 0, 0, 0, 56, 176, 179, 0, 185, 191, 190, + 213, 214, 198, 199, 0, 0, 0, 87, 0, 0, + 225, 223, 223, 84, 224, 0, 95, 0, 75, 78, + 251, 0, 110, 0, 0, 0, 70, 74, 0, 0, + 0, 0, 0, 0, 239, 231, 0, 233, 238, 235, + 0, 66, 68, 69, 60, 192, 0, 0, 0, 0, + 0, 52, 167, 168, 165, 166, 0, 0, 0, 169, + 0, 0, 0, 0, 117, 132, 124, 131, 0, 79, + 88, 83, 229, 228, 227, 226, 80, 80, 107, 0, + 101, 0, 252, 77, 0, 0, 102, 0, 223, 174, + 104, 0, 103, 105, 232, 0, 0, 108, 0, 193, + 194, 189, 187, 0, 215, 184, 177, 180, 181, 182, + 0, 188, 186, 0, 0, 217, 133, 0, 0, 81, + 85, 86, 96, 97, 76, 173, 73, 71, 72, 175, + 234, 0, 0, 67, 195, 206, 0, 204, 170, 0, + 183, 0, 219, 221, 216, 0, 89, 230, 237, 236, + 203, 0, 208, 178, 220, 0, 218, 0, 205, 211, + 212, 210, 207, 209, 222, 93, 0, 91, 94, 90, + 92 }; -static const short yypact[] = { 174, --32768,-32768, 174,-32768, -76,-32768, 35, 104,-32768,-32768, --32768,-32768, 45,-32768, -49, 182,-32768,-32768, 70, 86, - 62, 71, 119, 112, 196, 182,-32768, 115,-32768,-32768, --32768,-32768,-32768, 188,-32768,-32768, 431,-32768, 207, 23, --32768,-32768,-32768, 159,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 185, 431,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 192, 209,-32768, 129,-32768, 103,-32768, --32768,-32768,-32768, 40,-32768, -5,-32768,-32768,-32768,-32768, --32768, -6, 134,-32768, 146,-32768, 179, 194,-32768,-32768, --32768,-32768,-32768, 220, 201,-32768,-32768,-32768, 729, 272, --32768,-32768,-32768, 172, 286,-32768,-32768,-32768, 232,-32768, --32768, 174, 232, 187, 37,-32768, 592,-32768, 232,-32768, --32768,-32768,-32768,-32768, 32,-32768, 183, 184, 191, 216, - 54,-32768, -76,-32768, 216,-32768,-32768, -31, 193, 270, - 206, 240, 77, 102,-32768,-32768, 50,-32768,-32768, 208, --32768,-32768, 217,-32768,-32768, 308, 729, 305, 305, 74, --32768,-32768, 214,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 215,-32768,-32768, 57,-32768, 515, --32768, 295, 21, 276, 222, 42, 74, 261,-32768, 224, - 42, 264,-32768, 11,-32768, 370, 669,-32768,-32768,-32768, --32768,-32768,-32768, -15,-32768,-32768, 304, 174, 74, 231, --32768, 164, 241, 233, -15,-32768,-32768, 234,-32768,-32768, --32768, 216, 336, 305, 246, 216, 309,-32768, 5, 5, --32768,-32768, 305, 235, 83,-32768,-32768, 239, 669,-32768, - 74, 275, 92,-32768,-32768, 669, 237, 669, 74, 133, - 669,-32768,-32768, 142,-32768,-32768, 242, 143,-32768,-32768, --32768,-32768, 238, 249, 82, 243, 250, 251,-32768,-32768, --32768,-32768,-32768, 255, 74, 74,-32768, 74, 74, 155, - 245,-32768,-32768, 356,-32768, 279,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 277, 277,-32768, 269,-32768, 21,-32768, --32768, 256, 669,-32768, 42, 5,-32768,-32768, 257,-32768, --32768,-32768, 15, 269,-32768, 370,-32768, 258,-32768,-32768, - 24,-32768,-32768, 259,-32768,-32768,-32768, 262,-32768,-32768, - 10, 149,-32768,-32768, 266, 336,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 268, 273, --32768,-32768,-32768, 161,-32768, 50, 74,-32768, 305, 265, --32768,-32768, 245,-32768, 356,-32768,-32768,-32768, 24, 80, - 204, 265, 305,-32768, 96,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 13,-32768,-32768,-32768,-32768, 373, 379, --32768 +/* YYDEFGOTO[NTERM-NUM]. */ +static const short yydefgoto[] = +{ + -1, 3, 4, 5, 10, 11, 15, 16, 27, 28, + 29, 57, 58, 59, 108, 60, 76, 77, 78, 79, + 61, 71, 72, 62, 102, 212, 63, 127, 128, 260, + 261, 245, 246, 237, 238, 118, 340, 180, 181, 289, + 290, 377, 386, 387, 247, 262, 149, 150, 165, 166, + 182, 183, 64, 174, 225, 175, 286, 151, 152, 153, + 154, 277, 278, 280, 190, 191, 192, 213, 214, 215, + 267, 216, 217, 218, 356, 357, 382, 383, 219, 220, + 221, 334, 335, 362, 233, 234, 295, 338, 197, 256, + 257, 222, 119, 120, 155, 106, 223, 248 }; -static const short yypgoto[] = {-32768, --32768, 380, 254,-32768,-32768, 371,-32768,-32768, 363,-32768, --32768, 334,-32768,-32768,-32768, 317,-32768, 285,-32768,-32768, - 290,-32768, 337,-32768,-32768,-32768, 244,-32768, 87, 213, - 100,-32768, 108,-32768, 113,-32768, 186,-32768,-32768,-32768, --32768, 25, -174, -110, -152, -50,-32768, 189, -177, -94, --32768,-32768,-32768, -220, 79, -54, -52,-32768, 19,-32768, --32768,-32768, -143,-32768,-32768, -102, 59, 47, 210,-32768, - -172,-32768,-32768, 52,-32768,-32768,-32768,-32768,-32768,-32768, - 60, 63, -161,-32768,-32768,-32768,-32768,-32768, 111, -123, --32768, 200, 2,-32768, -7, -167 +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -213 +static const short yypact[] = +{ + 121, -213, -213, 47, 121, -213, -44, -213, -213, 33, + 31, -213, -213, -213, -213, 36, -213, -18, 41, -213, + -213, 81, 97, 77, 91, 55, 146, 164, 41, -213, + 19, -213, -213, -213, -213, -213, 160, -213, -213, 413, + -213, 185, 15, -213, -213, -213, 131, -213, -213, -213, + -213, -213, -213, -213, -213, -213, -213, 161, 413, -213, + -213, -213, -213, -213, -213, -213, 187, 711, -213, 107, + -213, 65, -213, -213, -213, -213, 27, -213, -10, -213, + -213, -213, -213, -213, 6, 129, -213, 167, -213, 170, + 199, -213, -213, -213, -213, -213, 225, 196, -213, -213, + -213, 728, 276, -213, -213, -213, 168, 278, -213, -213, + -213, 136, -213, -213, 121, 136, 178, 45, -213, 574, + -213, 136, -213, -213, -213, -213, -213, 40, -213, 173, + 176, 181, 226, 64, -213, -44, -213, 226, -213, -213, + 24, 183, 253, 190, 221, 66, 132, -213, -213, -58, + -213, -213, 191, -213, -213, 192, -213, -213, 290, 728, + 294, 294, 149, -213, -213, 193, -213, -213, -213, -213, + -213, -213, -213, -213, -213, -213, -213, 200, -213, -213, + 51, -213, 497, -213, 279, -6, 245, 202, 1, 149, + 242, -213, 205, 1, 248, -213, 48, -213, 352, 651, + -213, -213, -213, -213, -213, -213, -12, -213, -213, 288, + 121, 149, 214, -213, 162, 227, 215, -12, -213, -213, + 218, -213, -213, -213, 226, 321, 294, 231, 226, 291, + -213, 26, 26, -213, -213, 294, 217, 73, -213, -213, + 229, 651, -213, 149, 261, 83, -213, -213, 651, 223, + 651, 149, 113, 651, -213, -213, 115, -213, -213, 228, + 116, -213, -213, -213, -213, 220, 236, 156, 235, 237, + 233, -213, -213, -213, -213, -213, 239, 149, 149, -213, + 149, 149, 198, 230, -213, -213, 339, -213, 263, -213, + -213, -213, -213, -213, -213, -213, 258, 258, -213, 257, + -213, -6, -213, -213, 240, 651, -213, 1, 26, -213, + -213, 241, -213, -213, -213, 69, 257, -213, 352, -213, + 238, -213, -213, 20, -213, -213, 244, -213, -213, -213, + 243, -213, -213, 8, 123, -213, -213, 251, 321, -213, + -213, -213, -213, -213, -213, -213, -213, -213, -213, -213, + -213, 250, 252, -213, -213, -213, 128, -213, -58, 149, + -213, 294, 249, -213, -213, 230, -213, 339, -213, -213, + -213, 20, 25, 175, 249, 294, -213, 189, -213, -213, + -213, -213, -213, -213, -213, -213, 11, -213, -213, -213, + -213 }; - -#define YYLAST 820 - - -static const short yytable[] = { 15, - 192, 5, 230, 193, 5, 15, 146, 174, 237, 102, - 102, 103, 103, 101, 101, 239, 383, 10, 10, 169, - 170, 114, 10, 169, 170, 161, 162, 7, 10, 65, - 10, 10, 72, 1, 2, 165, 79, 227, 64, 67, - 112, 71, 10, 11, 127, 78, 103, 10, 65, 10, - 1, 2, 10, 11, 292, 63, 19, 64, 166, 167, - 168, 10, 169, 170, 1, 2, 79, 294, 295, 229, - 256, 242, -246, 228, 63, 78, 340, 136, 28, 201, - 119, 10, 169, 170, 247, 263, 262, 201, 137, 10, - 169, 170, 320, 349, 377, 308, 115, 264, 311, 383, - 128, 72, 127, 113, 103, 79, 268, 330, 161, 162, - 71, 155, 252, 133, 78, 253, 252, 387, 202, 203, - 154, 359, 234, 176, 237, 353, 202, 165, 301, 185, - 68, 239, 175, 240, 204, 306, 156, 16, 302, 12, - 157, 319, 29, 234, 346, 30, 309, 110, 378, 17, - 199, 200, 379, 205, 31, 187, 185, 171, 128, 206, - 201, 225, 10, 169, 170, 226, 10, 206, 207, 1, - 2, 32, 291, 341, 103, 238, 328, 208, 238, 209, - 186, 185, 187, 238, 1, 2, 257, 298, 261, 256, - 350, 299, 344, 20, 82, 33, 304, 386, 34, 202, - 305, 21, 83, 84, 73, 191, 386, 187, 37, 267, - 108, 109, 370, 85, 329, 86, 285, 87, 66, 83, - 84, 36, 22, 80, 23, 296, 120, 88, 161, 162, - 85, 89, 86, 24, 87, 90, 107, 310, 91, 10, - 206, 305, 1, 2, 88, 119, 312, 315, 89, 92, - 313, 316, 90, 362, 93, 91, 94, 363, 95, 121, - 270, 271, 272, 273, 122, 368, 92, 96, 97, 369, - 123, 93, 274, 94, 129, 95, 10, 169, 170, 1, - 2, 124, 98, 130, 96, 97, 83, 84, 131, 176, - 135, 238, 158, 159, 160, 99, -247, 238, 175, 98, - 270, 271, 272, 273, 182, 257, 176, 184, 261, 183, - 197, 194, 10, 356, 201, 175, 10, 169, 170, 233, - 196, 325, 326, 361, 327, 222, 224, 241, 248, 249, - 85, 251, 86, 266, 87, 269, 277, 281, 279, 283, - 286, 115, 303, 307, 88, 297, 321, 314, 89, 318, - 317, 361, 90, 202, 322, 91, 324, 323, 331, 334, - 335, 356, 343, 347, 337, 382, 92, 357, 358, 364, - 352, 93, 390, 94, 366, 95, 373, 10, 391, 367, - 138, 139, 6, 18, 96, 97, 177, 140, 35, 81, - 111, 85, 38, 86, 206, 87, 141, 134, 132, 98, - 198, 105, 351, 250, 345, 88, 342, 339, 388, 89, - 282, 289, 290, 90, 365, 371, 91, 41, 42, 43, - 376, 372, 374, 348, 280, 142, 0, 92, 45, 0, - 0, 0, 93, 46, 94, 47, 95, 300, 10, 0, - 0, 1, 2, 48, 0, 96, 97, 143, 144, 0, - 0, 0, 49, 38, 50, 0, 0, 0, 0, 51, - 98, 52, 53, 54, 0, 0, 0, 0, 39, 0, - 0, 0, 40, 0, 0, 0, 0, 0, 41, 42, - 43, 0, 0, 0, 44, 0, 0, 0, 0, 45, - 0, 0, 0, 0, 46, 0, 47, 0, 0, 0, - 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, - 0, 0, 0, 49, 0, 50, 0, 0, 0, 0, - 51, 0, 52, 53, 54, 138, 139, 161, 162, 0, - 0, 0, 140, 0, 0, 0, 85, 38, 86, 0, - 87, 141, 0, 0, 0, 0, 0, 227, 0, 0, - 88, 0, 0, 0, 89, 0, 0, 0, 90, 0, - 0, 91, 41, 42, 43, 0, 0, 0, 0, 0, - 142, 0, 92, 45, 0, 0, 0, 93, 46, 94, - 47, 95, 0, 228, 0, 0, 0, 0, 48, 0, - 96, 97, 143, 144, 0, 0, 0, 49, 0, 50, - 0, 0, 138, 139, 51, 98, 52, 53, 54, 140, - 0, 0, 0, 85, 38, 86, 0, 87, 141, 0, - 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, - 0, 89, 0, 0, 0, 90, 0, 0, 91, 41, - 42, 43, 0, 0, 0, 0, 0, 142, 0, 92, - 45, 0, 0, 0, 93, 46, 94, 47, 95, 0, - 0, 0, 0, 0, 0, 48, 0, 96, 97, 143, - 144, 0, 0, 0, 49, 0, 50, 0, 145, 138, - 139, 51, 98, 52, 53, 54, 140, 0, 0, 0, - 85, 38, 86, 0, 87, 141, 0, 0, 0, 0, - 0, 0, 0, 0, 88, 0, 0, 0, 89, 0, - 0, 0, 90, 0, 0, 91, 41, 42, 43, 0, - 0, 0, 0, 0, 142, 0, 92, 45, 0, 0, - 0, 93, 46, 94, 47, 95, 0, 0, 0, 1, - 2, 0, 48, 0, 96, 97, 143, 144, 0, 0, - 85, 49, 86, 50, 87, 0, 0, 0, 51, 98, - 52, 53, 54, 0, 88, 0, 0, 0, 89, 0, - 0, 0, 90, 0, 0, 91, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, - 0, 93, 0, 94, 0, 95, 0, 0, 0, 0, - 0, 0, 0, 0, 96, 97, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 98 +/* YYPGOTO[NTERM-NUM]. */ +static const short yypgoto[] = +{ + -213, -213, -213, 361, 234, -213, -213, 356, -213, -213, + 344, -213, -213, 315, -213, -213, -213, 304, -213, 266, + -213, -213, 272, -213, 317, -213, -213, -213, 232, -213, + 67, 194, 79, -213, 88, -213, 93, -213, 165, -213, + -213, -213, -213, 12, -172, -114, -136, -55, -213, 179, + -181, -113, -213, -213, -213, -212, 56, -49, -46, -213, + 42, -213, -213, -213, -139, -213, -213, -160, 38, -31, + 188, -213, -175, -213, -213, 35, -213, -213, -213, -213, + -213, -213, 39, 46, -168, -213, -213, -213, -213, -213, + 94, -130, -213, 172, 4, -213, -9, -171 }; -static const short yycheck[] = { 7, - 144, 0, 180, 147, 3, 13, 117, 131, 183, 64, - 65, 64, 65, 64, 65, 183, 4, 8, 8, 9, - 10, 28, 8, 9, 10, 13, 14, 104, 8, 37, - 8, 8, 40, 11, 12, 130, 44, 33, 37, 17, - 46, 40, 8, 9, 99, 44, 99, 8, 56, 8, - 11, 12, 8, 9, 227, 37, 106, 56, 5, 6, - 7, 8, 9, 10, 11, 12, 74, 229, 230, 180, - 194, 30, 104, 69, 56, 74, 297, 41, 9, 6, - 112, 8, 9, 10, 187, 101, 197, 6, 52, 8, - 9, 10, 265, 314, 15, 248, 103, 113, 251, 4, - 99, 109, 157, 109, 157, 113, 209, 280, 13, 14, - 109, 119, 102, 112, 113, 105, 102, 105, 45, 46, - 119, 112, 102, 131, 299, 102, 45, 222, 239, 80, - 108, 299, 131, 184, 61, 246, 105, 34, 241, 105, - 109, 60, 57, 102, 306, 84, 249, 108, 69, 105, - 158, 159, 73, 80, 84, 106, 80, 104, 157, 86, - 6, 105, 8, 9, 10, 109, 8, 86, 95, 11, - 12, 53, 227, 297, 227, 183, 279, 104, 186, 106, - 104, 80, 106, 191, 11, 12, 194, 105, 196, 313, - 314, 109, 303, 12, 3, 84, 105, 375, 3, 45, - 109, 20, 11, 12, 46, 104, 384, 106, 21, 208, - 108, 109, 356, 22, 60, 24, 224, 26, 12, 11, - 12, 107, 41, 39, 43, 233, 81, 36, 13, 14, - 22, 40, 24, 52, 26, 44, 108, 105, 47, 8, - 86, 109, 11, 12, 36, 112, 105, 105, 40, 58, - 109, 109, 44, 105, 63, 47, 65, 109, 67, 81, - 97, 98, 99, 100, 71, 105, 58, 76, 77, 109, - 51, 63, 109, 65, 3, 67, 8, 9, 10, 11, - 12, 81, 91, 112, 76, 77, 11, 12, 3, 297, - 104, 299, 110, 110, 104, 104, 104, 305, 297, 91, - 97, 98, 99, 100, 35, 313, 314, 68, 316, 104, - 3, 104, 8, 321, 6, 314, 8, 9, 10, 25, - 104, 275, 276, 331, 278, 112, 112, 106, 68, 106, - 22, 68, 24, 30, 26, 105, 96, 104, 106, 4, - 95, 103, 68, 107, 36, 111, 104, 106, 40, 101, - 113, 359, 44, 45, 105, 47, 102, 107, 114, 4, - 82, 369, 107, 107, 88, 373, 58, 109, 107, 104, - 113, 63, 0, 65, 107, 67, 112, 8, 0, 107, - 11, 12, 3, 13, 76, 77, 133, 18, 26, 56, - 74, 22, 23, 24, 86, 26, 27, 113, 109, 91, - 157, 65, 316, 191, 305, 36, 299, 295, 384, 40, - 222, 226, 104, 44, 336, 357, 47, 48, 49, 50, - 369, 359, 363, 313, 215, 56, -1, 58, 59, -1, - -1, -1, 63, 64, 65, 66, 67, 238, 8, -1, - -1, 11, 12, 74, -1, 76, 77, 78, 79, -1, - -1, -1, 83, 23, 85, -1, -1, -1, -1, 90, - 91, 92, 93, 94, -1, -1, -1, -1, 38, -1, - -1, -1, 42, -1, -1, -1, -1, -1, 48, 49, - 50, -1, -1, -1, 54, -1, -1, -1, -1, 59, - -1, -1, -1, -1, 64, -1, 66, -1, -1, -1, - -1, -1, -1, -1, 74, -1, -1, -1, -1, -1, - -1, -1, -1, 83, -1, 85, -1, -1, -1, -1, - 90, -1, 92, 93, 94, 11, 12, 13, 14, -1, - -1, -1, 18, -1, -1, -1, 22, 23, 24, -1, - 26, 27, -1, -1, -1, -1, -1, 33, -1, -1, - 36, -1, -1, -1, 40, -1, -1, -1, 44, -1, - -1, 47, 48, 49, 50, -1, -1, -1, -1, -1, - 56, -1, 58, 59, -1, -1, -1, 63, 64, 65, - 66, 67, -1, 69, -1, -1, -1, -1, 74, -1, - 76, 77, 78, 79, -1, -1, -1, 83, -1, 85, - -1, -1, 11, 12, 90, 91, 92, 93, 94, 18, - -1, -1, -1, 22, 23, 24, -1, 26, 27, -1, - -1, -1, -1, -1, -1, -1, -1, 36, -1, -1, - -1, 40, -1, -1, -1, 44, -1, -1, 47, 48, - 49, 50, -1, -1, -1, -1, -1, 56, -1, 58, - 59, -1, -1, -1, 63, 64, 65, 66, 67, -1, - -1, -1, -1, -1, -1, 74, -1, 76, 77, 78, - 79, -1, -1, -1, 83, -1, 85, -1, 87, 11, - 12, 90, 91, 92, 93, 94, 18, -1, -1, -1, - 22, 23, 24, -1, 26, 27, -1, -1, -1, -1, - -1, -1, -1, -1, 36, -1, -1, -1, 40, -1, - -1, -1, 44, -1, -1, 47, 48, 49, 50, -1, - -1, -1, -1, -1, 56, -1, 58, 59, -1, -1, - -1, 63, 64, 65, 66, 67, -1, -1, -1, 11, - 12, -1, 74, -1, 76, 77, 78, 79, -1, -1, - 22, 83, 24, 85, 26, -1, -1, -1, 90, 91, - 92, 93, 94, -1, 36, -1, -1, -1, 40, -1, - -1, -1, 44, -1, -1, 47, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 58, -1, -1, -1, - -1, 63, -1, 65, -1, 67, -1, -1, -1, -1, - -1, -1, -1, -1, 76, 77, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 91 +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, parse error. */ +#define YYTABLE_NINF -249 +static const short yytable[] = +{ + 17, 232, 12, 176, 6, 148, 17, 194, 6, 12, + 195, 103, 103, 239, 241, 385, 12, 104, 104, 167, + 105, 105, 187, 12, 163, 164, 1, 2, 12, 249, + 67, 244, 69, 74, 116, 12, 114, 81, 1, 2, + 379, 12, 13, 66, 12, 13, 73, 7, 189, 67, + 80, 270, 129, 22, 294, 105, 12, 171, 172, 229, + 9, 23, 66, 296, 297, 18, 258, 81, 231, 168, + 169, 170, 12, 171, 172, 1, 2, 12, 171, 172, + 80, 65, 24, 304, 25, 264, 138, 342, 21, 265, + 30, 311, 322, 26, 380, 230, 236, 139, 381, 115, + 65, 266, 74, 236, 351, 130, 81, 332, 34, 117, + 129, 167, 157, 105, 310, 73, 389, 313, 135, 80, + 361, 330, 355, 70, 178, 156, 38, 303, -247, 239, + 241, 242, 1, 2, 308, 112, 121, 177, 14, 12, + 348, 19, 1, 2, 12, 158, 187, 1, 2, 159, + 254, 201, 202, 255, 31, 203, 227, 12, 171, 172, + 228, 32, 203, 130, 12, 171, 172, 36, 173, 343, + 188, 254, 189, 110, 111, 33, 240, 75, 300, 240, + 293, 39, 301, 105, 240, 258, 352, 259, 306, 263, + 84, 346, 307, 385, 204, 205, 388, 68, 85, 86, + 82, 204, 163, 164, 203, 388, 12, 171, 172, 87, + 206, 88, 187, 89, 269, 109, 321, 287, 312, 372, + 314, 317, 307, 90, 315, 318, 298, 91, 364, 207, + 35, 92, 365, 370, 93, 208, 193, 371, 189, 163, + 164, 121, 208, 204, 209, 94, 327, 328, 122, 329, + 95, 123, 96, 210, 97, 211, 85, 86, 331, 272, + 273, 274, 275, 98, 99, 12, 171, 172, 1, 2, + 124, 276, 272, 273, 274, 275, 125, 126, 100, 131, + 132, 133, 137, 160, 208, 162, 161, -248, 184, 186, + 178, 101, 240, 199, 185, 196, 198, 203, 240, 12, + 171, 172, 12, 177, 235, 224, 259, 178, 243, 263, + 250, 251, 226, 87, 358, 88, 253, 89, 268, 271, + 177, 281, 283, 279, 363, 285, 288, 90, 299, 305, + 309, 91, 117, 319, 316, 92, 204, 320, 93, 323, + 325, 326, 324, 336, 333, 337, 339, 345, 349, 94, + 360, 354, 363, 359, 95, 366, 96, 368, 97, 369, + 12, 375, 358, 140, 141, 8, 384, 98, 99, 179, + 142, 20, 37, 83, 87, 40, 88, 208, 89, 143, + 113, 136, 100, 134, 107, 353, 347, 252, 90, 344, + 341, 200, 91, 291, 367, 292, 92, 373, 390, 93, + 43, 44, 45, 284, 376, 282, 378, 374, 144, 350, + 94, 47, 302, 0, 0, 95, 48, 96, 49, 97, + 0, 12, 0, 0, 1, 2, 50, 0, 98, 99, + 145, 146, 0, 0, 0, 51, 40, 52, 0, 0, + 0, 0, 53, 100, 54, 55, 56, 0, 0, 0, + 0, 41, 0, 0, 0, 42, 0, 0, 0, 0, + 0, 43, 44, 45, 0, 0, 0, 46, 0, 0, + 0, 0, 47, 0, 0, 0, 0, 48, 0, 49, + 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, + 0, 0, 0, 0, 0, 0, 51, 0, 52, 0, + 0, 0, 0, 53, 0, 54, 55, 56, 140, 141, + 163, 164, 0, 0, 0, 142, 0, 0, 0, 87, + 40, 88, 0, 89, 143, 0, 0, 0, 0, 0, + 229, 0, 0, 90, 0, 0, 0, 91, 0, 0, + 0, 92, 0, 0, 93, 43, 44, 45, 0, 0, + 0, 0, 0, 144, 0, 94, 47, 0, 0, 0, + 95, 48, 96, 49, 97, 0, 230, 0, 0, 0, + 0, 50, 0, 98, 99, 145, 146, 0, 0, 0, + 51, 0, 52, 0, 0, 140, 141, 53, 100, 54, + 55, 56, 142, 0, 0, 0, 87, 40, 88, 0, + 89, 143, 0, 0, 0, 0, 0, 0, 0, 0, + 90, 0, 0, 0, 91, 0, 0, 0, 92, 0, + 0, 93, 43, 44, 45, 0, 0, 0, 0, 0, + 144, 0, 94, 47, 0, 0, 0, 95, 48, 96, + 49, 97, 0, 0, 0, 0, 0, 0, 50, 0, + 98, 99, 145, 146, 0, 0, 0, 51, 0, 52, + 0, 147, 140, 141, 53, 100, 54, 55, 56, 142, + 0, 0, 0, 87, 40, 88, 0, 89, 143, 0, + 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, + 0, 91, 0, 0, 0, 92, 0, 0, 93, 43, + 44, 45, 0, 0, 0, 0, 0, 144, 0, 94, + 47, 0, 0, 0, 95, 48, 96, 49, 97, 0, + 0, 0, 85, 86, 0, 50, 0, 98, 99, 145, + 146, 0, 0, 87, 51, 88, 52, 89, 0, 1, + 2, 53, 100, 54, 55, 56, 0, 90, 0, 0, + 87, 91, 88, 0, 89, 92, 0, 0, 93, 0, + 0, 0, 0, 0, 90, 0, 0, 0, 91, 94, + 0, 0, 92, 0, 95, 93, 96, 0, 97, 0, + 0, 0, 0, 0, 0, 0, 94, 98, 99, 0, + 0, 95, 0, 96, 0, 97, 0, 0, 0, 0, + 0, 0, 100, 0, 98, 99, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 100 }; -/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "/usr/share/bison.simple" -/* This file comes from bison-1.28. */ - -/* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ +static const short yycheck[] = +{ + 9, 182, 8, 133, 0, 119, 15, 146, 4, 8, + 149, 66, 67, 185, 185, 4, 8, 66, 67, 132, + 66, 67, 80, 8, 13, 14, 11, 12, 8, 189, + 39, 30, 17, 42, 28, 8, 46, 46, 11, 12, + 15, 8, 9, 39, 8, 9, 42, 0, 106, 58, + 46, 211, 101, 12, 229, 101, 8, 9, 10, 33, + 104, 20, 58, 231, 232, 34, 196, 76, 182, 5, + 6, 7, 8, 9, 10, 11, 12, 8, 9, 10, + 76, 39, 41, 243, 43, 199, 41, 299, 106, 101, + 9, 251, 267, 52, 69, 69, 102, 52, 73, 109, + 58, 113, 111, 102, 316, 101, 115, 282, 53, 103, + 159, 224, 121, 159, 250, 111, 105, 253, 114, 115, + 112, 281, 102, 108, 133, 121, 107, 241, 104, 301, + 301, 186, 11, 12, 248, 108, 112, 133, 105, 8, + 308, 105, 11, 12, 8, 105, 80, 11, 12, 109, + 102, 160, 161, 105, 57, 6, 105, 8, 9, 10, + 109, 84, 6, 159, 8, 9, 10, 3, 104, 299, + 104, 102, 106, 108, 109, 84, 185, 46, 105, 188, + 229, 21, 109, 229, 193, 315, 316, 196, 105, 198, + 3, 305, 109, 4, 45, 46, 377, 12, 11, 12, + 39, 45, 13, 14, 6, 386, 8, 9, 10, 22, + 61, 24, 80, 26, 210, 108, 60, 226, 105, 358, + 105, 105, 109, 36, 109, 109, 235, 40, 105, 80, + 84, 44, 109, 105, 47, 86, 104, 109, 106, 13, + 14, 112, 86, 45, 95, 58, 277, 278, 81, 280, + 63, 81, 65, 104, 67, 106, 11, 12, 60, 97, + 98, 99, 100, 76, 77, 8, 9, 10, 11, 12, + 71, 109, 97, 98, 99, 100, 51, 81, 91, 3, + 112, 3, 104, 110, 86, 104, 110, 104, 35, 68, + 299, 104, 301, 3, 104, 104, 104, 6, 307, 8, + 9, 10, 8, 299, 25, 112, 315, 316, 106, 318, + 68, 106, 112, 22, 323, 24, 68, 26, 30, 105, + 316, 106, 104, 96, 333, 4, 95, 36, 111, 68, + 107, 40, 103, 113, 106, 44, 45, 101, 47, 104, + 107, 102, 105, 4, 114, 82, 88, 107, 107, 58, + 107, 113, 361, 109, 63, 104, 65, 107, 67, 107, + 8, 112, 371, 11, 12, 4, 375, 76, 77, 135, + 18, 15, 28, 58, 22, 23, 24, 86, 26, 27, + 76, 115, 91, 111, 67, 318, 307, 193, 36, 301, + 297, 159, 40, 228, 338, 104, 44, 359, 386, 47, + 48, 49, 50, 224, 365, 217, 371, 361, 56, 315, + 58, 59, 240, -1, -1, 63, 64, 65, 66, 67, + -1, 8, -1, -1, 11, 12, 74, -1, 76, 77, + 78, 79, -1, -1, -1, 83, 23, 85, -1, -1, + -1, -1, 90, 91, 92, 93, 94, -1, -1, -1, + -1, 38, -1, -1, -1, 42, -1, -1, -1, -1, + -1, 48, 49, 50, -1, -1, -1, 54, -1, -1, + -1, -1, 59, -1, -1, -1, -1, 64, -1, 66, + -1, -1, -1, -1, -1, -1, -1, 74, -1, -1, + -1, -1, -1, -1, -1, -1, 83, -1, 85, -1, + -1, -1, -1, 90, -1, 92, 93, 94, 11, 12, + 13, 14, -1, -1, -1, 18, -1, -1, -1, 22, + 23, 24, -1, 26, 27, -1, -1, -1, -1, -1, + 33, -1, -1, 36, -1, -1, -1, 40, -1, -1, + -1, 44, -1, -1, 47, 48, 49, 50, -1, -1, + -1, -1, -1, 56, -1, 58, 59, -1, -1, -1, + 63, 64, 65, 66, 67, -1, 69, -1, -1, -1, + -1, 74, -1, 76, 77, 78, 79, -1, -1, -1, + 83, -1, 85, -1, -1, 11, 12, 90, 91, 92, + 93, 94, 18, -1, -1, -1, 22, 23, 24, -1, + 26, 27, -1, -1, -1, -1, -1, -1, -1, -1, + 36, -1, -1, -1, 40, -1, -1, -1, 44, -1, + -1, 47, 48, 49, 50, -1, -1, -1, -1, -1, + 56, -1, 58, 59, -1, -1, -1, 63, 64, 65, + 66, 67, -1, -1, -1, -1, -1, -1, 74, -1, + 76, 77, 78, 79, -1, -1, -1, 83, -1, 85, + -1, 87, 11, 12, 90, 91, 92, 93, 94, 18, + -1, -1, -1, 22, 23, 24, -1, 26, 27, -1, + -1, -1, -1, -1, -1, -1, -1, 36, -1, -1, + -1, 40, -1, -1, -1, 44, -1, -1, 47, 48, + 49, 50, -1, -1, -1, -1, -1, 56, -1, 58, + 59, -1, -1, -1, 63, 64, 65, 66, 67, -1, + -1, -1, 11, 12, -1, 74, -1, 76, 77, 78, + 79, -1, -1, 22, 83, 24, 85, 26, -1, 11, + 12, 90, 91, 92, 93, 94, -1, 36, -1, -1, + 22, 40, 24, -1, 26, 44, -1, -1, 47, -1, + -1, -1, -1, -1, 36, -1, -1, -1, 40, 58, + -1, -1, 44, -1, 63, 47, 65, -1, 67, -1, + -1, -1, -1, -1, -1, -1, 58, 76, 77, -1, + -1, 63, -1, 65, -1, 67, -1, -1, -1, -1, + -1, -1, 91, -1, 76, 77, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 91 +}; -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const unsigned char yystos[] = +{ + 0, 11, 12, 116, 117, 118, 209, 0, 118, 104, + 119, 120, 8, 9, 105, 121, 122, 211, 34, 105, + 122, 106, 12, 20, 41, 43, 52, 123, 124, 125, + 9, 57, 84, 84, 53, 84, 3, 125, 107, 21, + 23, 38, 42, 48, 49, 50, 54, 59, 64, 66, + 74, 83, 85, 90, 92, 93, 94, 126, 127, 128, + 130, 135, 138, 141, 167, 175, 209, 211, 12, 17, + 108, 136, 137, 209, 211, 46, 131, 132, 133, 134, + 209, 211, 39, 128, 3, 11, 12, 22, 24, 26, + 36, 40, 44, 47, 58, 63, 65, 67, 76, 77, + 91, 104, 139, 162, 172, 173, 210, 139, 129, 108, + 108, 109, 108, 132, 46, 109, 28, 103, 150, 207, + 208, 112, 81, 81, 71, 51, 81, 142, 143, 172, + 209, 3, 112, 3, 137, 209, 134, 104, 41, 52, + 11, 12, 18, 27, 56, 78, 79, 87, 160, 161, + 162, 172, 173, 174, 175, 209, 209, 211, 105, 109, + 110, 110, 104, 13, 14, 163, 164, 166, 5, 6, + 7, 9, 10, 104, 168, 170, 206, 209, 211, 119, + 152, 153, 165, 166, 35, 104, 68, 80, 104, 106, + 179, 180, 181, 104, 179, 179, 104, 203, 104, 3, + 143, 211, 211, 6, 45, 46, 61, 80, 86, 95, + 104, 106, 140, 182, 183, 184, 186, 187, 188, 193, + 194, 195, 206, 211, 112, 169, 112, 105, 109, 33, + 69, 160, 165, 199, 200, 25, 102, 148, 149, 159, + 211, 212, 162, 106, 30, 146, 147, 159, 212, 182, + 68, 106, 146, 68, 102, 105, 204, 205, 206, 211, + 144, 145, 160, 211, 160, 101, 113, 185, 30, 209, + 182, 105, 97, 98, 99, 100, 109, 176, 177, 96, + 178, 106, 185, 104, 164, 4, 171, 211, 95, 154, + 155, 153, 104, 172, 187, 201, 199, 199, 211, 111, + 105, 109, 208, 160, 182, 68, 105, 109, 160, 107, + 161, 182, 105, 161, 105, 109, 106, 105, 109, 113, + 101, 60, 187, 104, 105, 107, 102, 184, 184, 184, + 182, 60, 187, 114, 196, 197, 4, 82, 202, 88, + 151, 151, 170, 206, 149, 107, 160, 147, 199, 107, + 205, 170, 206, 145, 113, 102, 189, 190, 211, 109, + 107, 112, 198, 211, 105, 109, 104, 171, 107, 107, + 105, 109, 179, 183, 198, 112, 197, 156, 190, 15, + 69, 73, 191, 192, 211, 4, 157, 158, 165, 105, + 158 +}; -#ifndef YYSTACK_USE_ALLOCA -#ifdef alloca -#define YYSTACK_USE_ALLOCA -#else /* alloca not defined */ -#ifdef __GNUC__ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) -#define YYSTACK_USE_ALLOCA -#include -#else /* not sparc */ -/* We think this test detects Watcom and Microsoft C. */ -/* This used to test MSDOS, but that is a bad idea - since that symbol is in the user namespace. */ -#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) -#if 0 /* No need for malloc.h, which pollutes the namespace; - instead, just don't use alloca. */ -#include +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ #endif -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) -/* I don't know what this was needed for, but it pollutes the namespace. - So I turned it off. rms, 2 May 1997. */ -/* #include */ - #pragma alloca -#define YYSTACK_USE_ALLOCA -#else /* not MSDOS, or __TURBOC__, or _AIX */ -#if 0 -#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up, - and on HPUX 10. Eventually we can turn this on. */ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#endif /* __hpux */ +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t #endif -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc */ -#endif /* not GNU C */ -#endif /* alloca not defined */ -#endif /* YYSTACK_USE_ALLOCA not defined */ - -#ifdef YYSTACK_USE_ALLOCA -#define YYSTACK_ALLOC alloca -#else -#define YYSTACK_ALLOC malloc +#if ! defined (YYSIZE_T) +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int #endif - -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY -2 #define YYEOF 0 + #define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab +#define YYABORT goto yyabortlab #define YYERROR goto yyerrlab1 -/* Like YYERROR except do call yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ + #define YYFAIL goto yyerrlab + #define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(token, value) \ + +#define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ - { yychar = (token), yylval = (value); \ + { \ + yychar = (Token); \ + yylval = (Value); \ yychar1 = YYTRANSLATE (yychar); \ YYPOPSTACK; \ goto yybackup; \ } \ else \ - { yyerror ("syntax error: cannot back up"); YYERROR; } \ + { \ + yyerror ("syntax error: cannot back up"); \ + YYERROR; \ + } \ while (0) #define YYTERROR 1 #define YYERRCODE 256 -#ifndef YYPURE -#define YYLEX yylex() -#endif +/* YYLLOC_DEFAULT -- Compute the default location (before the actions + are run). */ -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval, &yylloc) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + Current.first_line = Rhs[1].first_line; \ + Current.first_column = Rhs[1].first_column; \ + Current.last_line = Rhs[N].last_line; \ + Current.last_column = Rhs[N].last_column; #endif -#else /* not YYLSP_NEEDED */ -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval) -#endif -#endif /* not YYLSP_NEEDED */ + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#define YYLEX yylex () + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) +# define YYDSYMPRINT(Args) \ +do { \ + if (yydebug) \ + yysymprint Args; \ +} while (0) +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YYDSYMPRINT(Args) +#endif /* !YYDEBUG */ + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 #endif -/* If nonreentrant, generate the variables here */ +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). -#ifndef YYPURE + Do not make this value too large; the results are undefined if + SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ -int yychar; /* the lookahead symbol */ -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ +#if YYMAXDEPTH == 0 +# undef YYMAXDEPTH +#endif -#ifdef YYLSP_NEEDED -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 #endif -int yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ + -#if YYDEBUG != 0 -int yydebug; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ -#endif +#if YYERROR_VERBOSE -/* YYINITDEPTH indicates the initial size of the parser's stacks */ +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif +{ + register const char *yys = yystr; -#ifndef YYINITDEPTH -#define YYINITDEPTH 200 -#endif + while (*yys++ != '\0') + continue; -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ + return yys - yystr - 1; +} +# endif +# endif + +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif +{ + register char *yyd = yydest; + register const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif -#if YYMAXDEPTH == 0 -#undef YYMAXDEPTH -#endif +#endif /* !YYERROR_VERBOSE */ -#ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 -#endif -/* Define __yy_memcpy. Note that the size argument - should be passed with type unsigned int, because that is what the non-GCC - definitions require. With GCC, __builtin_memcpy takes an arg - of type size_t, but it can handle unsigned int. */ - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ + +#if YYDEBUG +/*-----------------------------. +| Print this symbol on YYOUT. | +`-----------------------------*/ + static void -__yy_memcpy (to, from, count) - char *to; - char *from; - unsigned int count; +#if defined (__STDC__) || defined (__cplusplus) +yysymprint (FILE* yyout, int yytype, YYSTYPE yyvalue) +#else +yysymprint (yyout, yytype, yyvalue) + FILE* yyout; + int yytype; + YYSTYPE yyvalue; +#endif { - register char *f = from; - register char *t = to; - register int i = count; + /* Pacify ``unused variable'' warnings. */ + (void) yyvalue; + + if (yytype < YYNTOKENS) + { + YYFPRINTF (yyout, "token %s (", yytname[yytype]); +# ifdef YYPRINT + YYPRINT (yyout, yytoknum[yytype], yyvalue); +# endif + } + else + YYFPRINTF (yyout, "nterm %s (", yytname[yytype]); - while (i-- > 0) - *t++ = *f++; + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyout, ")"); } +#endif /* YYDEBUG. */ -#else /* __cplusplus */ -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + static void -__yy_memcpy (char *to, char *from, unsigned int count) +#if defined (__STDC__) || defined (__cplusplus) +yydestruct (int yytype, YYSTYPE yyvalue) +#else +yydestruct (yytype, yyvalue) + int yytype; + YYSTYPE yyvalue; +#endif { - register char *t = to; - register char *f = from; - register int i = count; + /* Pacify ``unused variable'' warnings. */ + (void) yyvalue; - while (i-- > 0) - *t++ = *f++; + switch (yytype) + { + default: + break; + } } -#endif -#endif -#line 217 "/usr/share/bison.simple" /* The user can define YYPARSE_PARAM as the name of an argument to be passed into yyparse. The argument should have type void *. @@ -1001,76 +1418,85 @@ __yy_memcpy (char *to, char *from, unsigned int count) to the proper pointer type. */ #ifdef YYPARSE_PARAM -#ifdef __cplusplus -#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#else /* not __cplusplus */ -#define YYPARSE_PARAM_ARG YYPARSE_PARAM -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#endif /* not __cplusplus */ -#else /* not YYPARSE_PARAM */ -#define YYPARSE_PARAM_ARG -#define YYPARSE_PARAM_DECL -#endif /* not YYPARSE_PARAM */ +# if defined (__STDC__) || defined (__cplusplus) +# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM +# define YYPARSE_PARAM_DECL +# else +# define YYPARSE_PARAM_ARG YYPARSE_PARAM +# define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; +# endif +#else /* !YYPARSE_PARAM */ +# define YYPARSE_PARAM_ARG +# define YYPARSE_PARAM_DECL +#endif /* !YYPARSE_PARAM */ /* Prevent warning if -Wstrict-prototypes. */ #ifdef __GNUC__ -#ifdef YYPARSE_PARAM +# ifdef YYPARSE_PARAM int yyparse (void *); -#else +# else int yyparse (void); +# endif #endif -#endif + + +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of parse errors so far. */ +int yynerrs; + int -yyparse(YYPARSE_PARAM_ARG) +yyparse (YYPARSE_PARAM_ARG) YYPARSE_PARAM_DECL { + register int yystate; register int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Lookahead token as an internal (translated) token number. */ + int yychar1 = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short yyssa[YYINITDEPTH]; + short *yyss = yyssa; register short *yyssp; - register YYSTYPE *yyvsp; - int yyerrstatus; /* number of tokens to shift before error messages enabled */ - int yychar1 = 0; /* lookahead token as an internal (translated) token number */ - short yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + register YYSTYPE *yyvsp; - short *yyss = yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ -#ifdef YYLSP_NEEDED - YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp; -#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) -#else #define YYPOPSTACK (yyvsp--, yyssp--) -#endif - int yystacksize = YYINITDEPTH; - int yyfree_stacks = 0; + YYSIZE_T yystacksize = YYINITDEPTH; -#ifdef YYPURE - int yychar; - YYSTYPE yylval; - int yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE yylloc; -#endif -#endif + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; - YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ int yylen; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Starting parse\n"); -#endif + YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; @@ -1082,110 +1508,96 @@ yyparse(YYPARSE_PARAM_ARG) so that they stay on the same level as the state stack. The wasted elements are never initialized. */ - yyssp = yyss - 1; + yyssp = yyss; yyvsp = yyvs; -#ifdef YYLSP_NEEDED - yylsp = yyls; -#endif -/* Push a new state, which is found in yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -yynewstate: + goto yysetstate; - *++yyssp = yystate; +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + + yysetstate: + *yyssp = yystate; if (yyssp >= yyss + yystacksize - 1) { - /* Give user a chance to reallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *yyls1 = yyls; -#endif - /* Get the current used size of the three stacks, in elements. */ - int size = yyssp - yyss + 1; + YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if yyoverflow is a macro. */ - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yyls1, size * sizeof (*yylsp), - &yystacksize); -#else - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yystacksize); -#endif - - yyss = yyss1; yyvs = yyvs1; -#ifdef YYLSP_NEEDED - yyls = yyls1; -#endif + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow ("parser stack overflow", + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } #else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyoverflowlab; +# else /* Extend the stack our own way. */ if (yystacksize >= YYMAXDEPTH) - { - yyerror("parser stack overflow"); - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 2; - } + goto yyoverflowlab; yystacksize *= 2; if (yystacksize > YYMAXDEPTH) yystacksize = YYMAXDEPTH; -#ifndef YYSTACK_USE_ALLOCA - yyfree_stacks = 1; -#endif - yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); - __yy_memcpy ((char *)yyss, (char *)yyss1, - size * (unsigned int) sizeof (*yyssp)); - yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); - __yy_memcpy ((char *)yyvs, (char *)yyvs1, - size * (unsigned int) sizeof (*yyvsp)); -#ifdef YYLSP_NEEDED - yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); - __yy_memcpy ((char *)yyls, (char *)yyls1, - size * (unsigned int) sizeof (*yylsp)); -#endif + + { + short *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyoverflowlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif #endif /* no yyoverflow */ - yyssp = yyss + size - 1; - yyvsp = yyvs + size - 1; -#ifdef YYLSP_NEEDED - yylsp = yyls + size - 1; -#endif + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Stack size increased to %d\n", yystacksize); -#endif + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); if (yyssp >= yyss + yystacksize - 1) YYABORT; } -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Entering state %d\n", yystate); -#endif + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; - yybackup: + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: /* Do appropriate processing given the current state. */ /* Read a lookahead token if we need one and don't already have one. */ @@ -1194,7 +1606,7 @@ yyparse(YYPARSE_PARAM_ARG) /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; - if (yyn == YYFLAG) + if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ @@ -1204,146 +1616,141 @@ yyparse(YYPARSE_PARAM_ARG) if (yychar == YYEMPTY) { -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Reading a token: "); -#endif + YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } - /* Convert token to internal form (in yychar1) for indexing tables with */ + /* Convert token to internal form (in yychar1) for indexing tables with. */ - if (yychar <= 0) /* This means end of input. */ + if (yychar <= 0) /* This means end of input. */ { yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more */ + yychar = YYEOF; /* Don't call YYLEX any more. */ -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif + YYDPRINTF ((stderr, "Now at end of input.\n")); } else { - yychar1 = YYTRANSLATE(yychar); + yychar1 = YYTRANSLATE (yychar); -#if YYDEBUG != 0 - if (yydebug) - { - fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT - YYPRINT (stderr, yychar, yylval); -#endif - fprintf (stderr, ")\n"); - } -#endif + /* We have to keep this `#if YYDEBUG', since we use variables + which are defined only if `YYDEBUG' is set. */ + YYDPRINTF ((stderr, "Next token is ")); + YYDSYMPRINT ((stderr, yychar1, yylval)); + YYDPRINTF ((stderr, "\n")); } + /* If the proper action on seeing token YYCHAR1 is to reduce or to + detect an error, take that action. */ yyn += yychar1; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yychar1) goto yydefault; - yyn = yytable[yyn]; - - /* yyn is what to do for this token type in this state. - Negative => reduce, -yyn is rule number. - Positive => shift, yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (yyn < 0) + if (yyn <= 0) { - if (yyn == YYFLAG) + if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } - else if (yyn == 0) - goto yyerrlab; if (yyn == YYFINAL) YYACCEPT; /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); -#endif + YYDPRINTF ((stderr, "Shifting token %d (%s), ", + yychar, yytname[yychar1])); /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - /* count tokens shifted since error; after three, turn off error status. */ - if (yyerrstatus) yyerrstatus--; + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; yystate = yyn; goto yynewstate; -/* Do the default action for the current state. */ -yydefault: +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; + goto yyreduce; -/* Do a reduction. yyn is the number of a rule to reduce with. */ + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ yyreduce: + /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; - if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ -#if YYDEBUG != 0 + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + +#if YYDEBUG + /* We have to keep this `#if YYDEBUG', since we use variables which + are defined only if `YYDEBUG' is set. */ if (yydebug) { - int i; + int yyi; - fprintf (stderr, "Reducing via rule %d (line %d), ", - yyn, yyrline[yyn]); + YYFPRINTF (stderr, "Reducing via rule %d (line %d), ", + yyn - 1, yyrline[yyn]); /* Print the symbols being reduced, and their result. */ - for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", yytname[yyrhs[i]]); - fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); + for (yyi = yyprhs[yyn]; yyrhs[yyi] >= 0; yyi++) + YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]); + YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]); } #endif - - - switch (yyn) { - -case 1: + switch (yyn) + { + case 2: #line 299 "asn1p_y.y" -{ + { *(void **)param = yyvsp[0].a_grammar; - ; - break;} -case 2: + } + break; + + case 3: #line 305 "asn1p_y.y" -{ + { yyval.a_grammar = asn1p_new(); checkmem(yyval.a_grammar); TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); - ; - break;} -case 3: + } + break; + + case 4: #line 310 "asn1p_y.y" -{ + { yyval.a_grammar = yyvsp[-1].a_grammar; TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); - ; - break;} -case 4: + } + break; + + case 5: #line 331 "asn1p_y.y" -{ + { if(yyvsp[-1].a_module) { yyval.a_module = yyvsp[-1].a_module; @@ -1356,116 +1763,134 @@ case 4: yyval.a_module->Identifier = yyvsp[-7].tv_str; yyval.a_module->module_oid = yyvsp[-6].a_oid; yyval.a_module->module_flags = yyvsp[-4].a_module_flags; - ; - break;} -case 5: + } + break; + + case 6: #line 352 "asn1p_y.y" -{ yyval.a_oid = 0; ; - break;} -case 6: + { yyval.a_oid = 0; } + break; + + case 7: #line 353 "asn1p_y.y" -{ yyval.a_oid = yyvsp[0].a_oid; ; - break;} -case 7: + { yyval.a_oid = yyvsp[0].a_oid; } + break; + + case 8: #line 357 "asn1p_y.y" -{ + { yyval.a_oid = yyvsp[-1].a_oid; - ; - break;} -case 8: + } + break; + + case 9: #line 360 "asn1p_y.y" -{ + { yyval.a_oid = 0; - ; - break;} -case 9: + } + break; + + case 10: #line 366 "asn1p_y.y" -{ + { yyval.a_oid = asn1p_oid_new(); asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); if(yyvsp[0].a_oid_arc.name) free(yyvsp[0].a_oid_arc.name); - ; - break;} -case 10: + } + break; + + case 11: #line 372 "asn1p_y.y" -{ + { yyval.a_oid = yyvsp[-1].a_oid; asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); if(yyvsp[0].a_oid_arc.name) free(yyvsp[0].a_oid_arc.name); - ; - break;} -case 11: + } + break; + + case 12: #line 381 "asn1p_y.y" -{ /* iso */ + { /* iso */ yyval.a_oid_arc.name = yyvsp[0].tv_str; yyval.a_oid_arc.number = -1; - ; - break;} -case 12: + } + break; + + case 13: #line 385 "asn1p_y.y" -{ /* iso(1) */ + { /* iso(1) */ yyval.a_oid_arc.name = yyvsp[-3].tv_str; yyval.a_oid_arc.number = yyvsp[-1].a_int; - ; - break;} -case 13: + } + break; + + case 14: #line 389 "asn1p_y.y" -{ /* 1 */ + { /* 1 */ yyval.a_oid_arc.name = 0; yyval.a_oid_arc.number = yyvsp[0].a_int; - ; - break;} -case 14: + } + break; + + case 15: #line 399 "asn1p_y.y" -{ yyval.a_module_flags = MSF_NOFLAGS; ; - break;} -case 15: + { yyval.a_module_flags = MSF_NOFLAGS; } + break; + + case 16: #line 400 "asn1p_y.y" -{ + { yyval.a_module_flags = yyvsp[0].a_module_flags; - ; - break;} -case 16: + } + break; + + case 17: #line 409 "asn1p_y.y" -{ + { yyval.a_module_flags = yyvsp[0].a_module_flags; - ; - break;} -case 17: + } + break; + + case 18: #line 412 "asn1p_y.y" -{ + { yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags; - ; - break;} -case 18: + } + break; + + case 19: #line 421 "asn1p_y.y" -{ + { yyval.a_module_flags = MSF_EXPLICIT_TAGS; - ; - break;} -case 19: + } + break; + + case 20: #line 424 "asn1p_y.y" -{ + { yyval.a_module_flags = MSF_IMPLICIT_TAGS; - ; - break;} -case 20: + } + break; + + case 21: #line 427 "asn1p_y.y" -{ + { yyval.a_module_flags = MSF_AUTOMATIC_TAGS; - ; - break;} -case 21: + } + break; + + case 22: #line 430 "asn1p_y.y" -{ + { yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED; - ; - break;} -case 22: + } + break; + + case 23: #line 434 "asn1p_y.y" -{ + { /* X.680Amd1 specifies TAG and XER */ if(strcmp(yyvsp[-1].tv_str, "TAG") == 0) { yyval.a_module_flags = MSF_TAG_INSTRUCTIONS; @@ -1479,27 +1904,31 @@ case 22: yyval.a_module_flags = MSF_unk_INSTRUCTIONS; } free(yyvsp[-1].tv_str); - ; - break;} -case 23: + } + break; + + case 24: #line 455 "asn1p_y.y" -{ yyval.a_module = 0; ; - break;} -case 24: + { yyval.a_module = 0; } + break; + + case 25: #line 456 "asn1p_y.y" -{ + { yyval.a_module = yyvsp[0].a_module; - ; - break;} -case 25: + } + break; + + case 26: #line 465 "asn1p_y.y" -{ + { yyval.a_module = yyvsp[0].a_module; - ; - break;} -case 26: + } + break; + + case 27: #line 468 "asn1p_y.y" -{ + { yyval.a_module = yyvsp[-1].a_module; /* Behave well when one of them is skipped. */ @@ -1525,17 +1954,19 @@ case 26: MY_IMPORT(members, next); #undef MY_IMPORT - ; - break;} -case 27: + } + break; + + case 28: #line 501 "asn1p_y.y" -{ + { yyval.a_module = yyvsp[0].a_module; - ; - break;} -case 28: + } + break; + + case 29: #line 504 "asn1p_y.y" -{ + { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); if(yyvsp[0].a_xports) { @@ -1543,265 +1974,297 @@ case 28: } else { /* "EXPORTS ALL;" ? */ } - ; - break;} -case 29: + } + break; + + case 30: #line 513 "asn1p_y.y" -{ + { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID); assert(yyvsp[0].a_expr->meta_type != AMT_INVALID); TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); - ; - break;} -case 30: + } + break; + + case 31: #line 520 "asn1p_y.y" -{ + { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID); assert(yyvsp[0].a_expr->meta_type != AMT_INVALID); TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); - ; - break;} -case 31: + } + break; + + case 32: #line 533 "asn1p_y.y" -{ + { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID); assert(yyvsp[0].a_expr->meta_type != AMT_INVALID); TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); - ; - break;} -case 32: + } + break; + + case 33: #line 541 "asn1p_y.y" -{ asn1p_lexer_hack_push_encoding_control(); ; - break;} -case 33: + { asn1p_lexer_hack_push_encoding_control(); } + break; + + case 34: #line 542 "asn1p_y.y" -{ + { fprintf(stderr, "WARNING: ENCODING-CONTROL %s " "specification at line %d ignored\n", yyvsp[-1].tv_str, yylineno); free(yyvsp[-1].tv_str); yyval.a_module = 0; - ; - break;} -case 34: + } + break; + + case 35: #line 554 "asn1p_y.y" -{ + { return yyerror( "Attempt to redefine a standard basic type, " "use -ftypesXY to switch back " "to older version of ASN.1 standard"); - ; - break;} -case 35: + } + break; + + case 36: #line 568 "asn1p_y.y" -{ + { yyval.a_module = yyvsp[-1].a_module; - ; - break;} -case 36: + } + break; + + case 37: #line 574 "asn1p_y.y" -{ + { return yyerror("Empty IMPORTS list"); - ; - break;} -case 37: + } + break; + + case 38: #line 580 "asn1p_y.y" -{ + { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); - ; - break;} -case 38: + } + break; + + case 39: #line 585 "asn1p_y.y" -{ + { yyval.a_module = yyvsp[-1].a_module; TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); - ; - break;} -case 39: + } + break; + + case 40: #line 592 "asn1p_y.y" -{ + { yyval.a_xports = yyvsp[-3].a_xports; yyval.a_xports->from = yyvsp[-1].tv_str; yyval.a_xports->from_oid = yyvsp[0].a_oid; checkmem(yyval.a_xports); - ; - break;} -case 40: + } + break; + + case 41: #line 601 "asn1p_y.y" -{ + { yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - ; - break;} -case 41: + } + break; + + case 42: #line 606 "asn1p_y.y" -{ + { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - ; - break;} -case 42: + } + break; + + case 43: #line 613 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_REFERENCE; - ; - break;} -case 43: + } + break; + + case 44: #line 619 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_REFERENCE; - ; - break;} -case 44: + } + break; + + case 45: #line 628 "asn1p_y.y" -{ + { yyval.a_xports = yyvsp[-1].a_xports; - ; - break;} -case 45: + } + break; + + case 46: #line 631 "asn1p_y.y" -{ + { yyval.a_xports = 0; - ; - break;} -case 46: + } + break; + + case 47: #line 634 "asn1p_y.y" -{ + { /* Empty EXPORTS clause effectively prohibits export. */ yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); - ; - break;} -case 47: + } + break; + + case 48: #line 642 "asn1p_y.y" -{ + { yyval.a_xports = asn1p_xports_new(); assert(yyval.a_xports); TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - ; - break;} -case 48: + } + break; + + case 49: #line 647 "asn1p_y.y" -{ + { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - ; - break;} -case 49: + } + break; + + case 50: #line 654 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_EXPORTVAR; - ; - break;} -case 50: + } + break; + + case 51: #line 660 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_EXPORTVAR; - ; - break;} -case 51: + } + break; + + case 52: #line 670 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-4].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-5].tv_str; yyval.a_expr->meta_type = AMT_VALUESET; // take care of optValueSetBody - ; - break;} -case 52: + } + break; + + case 53: #line 680 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->reference = yyvsp[0].a_ref; yyval.a_expr->expr_type = A1TC_REFERENCE; yyval.a_expr->meta_type = AMT_TYPEREF; - ; - break;} -case 53: + } + break; + + case 54: #line 687 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = yyvsp[0].a_type; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 54: + } + break; + + case 55: #line 696 "asn1p_y.y" -{ ; - break;} -case 55: + { } + break; + + case 56: #line 697 "asn1p_y.y" -{ - ; - break;} -case 56: + { + } + break; + + case 57: #line 713 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->tag = yyvsp[-1].a_tag; yyval.a_expr->expr_type = A1TC_TYPEID; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 57: + } + break; + + case 58: #line 721 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->tag = yyvsp[-1].a_tag; assert(yyval.a_expr->expr_type); assert(yyval.a_expr->meta_type); - ; - break;} -case 58: + } + break; + + case 59: #line 728 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; assert(yyval.a_expr->expr_type == A1TC_CLASSDEF); assert(yyval.a_expr->meta_type == AMT_OBJECT); - ; - break;} -case 59: + } + break; + + case 60: #line 744 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-5].tv_str; yyval.a_expr->params = yyvsp[-3].a_plist; yyval.a_expr->meta_type = AMT_PARAMTYPE; - ; - break;} -case 60: + } + break; + + case 61: #line 754 "asn1p_y.y" -{ + { int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); checkmem(yyval.a_plist); @@ -1809,207 +2272,232 @@ case 60: checkmem(ret == 0); if(yyvsp[0].a_parg.governor) asn1p_ref_free(yyvsp[0].a_parg.governor); if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument); - ; - break;} -case 61: + } + break; + + case 62: #line 763 "asn1p_y.y" -{ + { int ret; yyval.a_plist = yyvsp[-2].a_plist; ret = asn1p_paramlist_add_param(yyval.a_plist, yyvsp[0].a_parg.governor, yyvsp[0].a_parg.argument); checkmem(ret == 0); if(yyvsp[0].a_parg.governor) asn1p_ref_free(yyvsp[0].a_parg.governor); if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument); - ; - break;} -case 62: + } + break; + + case 63: #line 774 "asn1p_y.y" -{ + { yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; - ; - break;} -case 63: + } + break; + + case 64: #line 778 "asn1p_y.y" -{ + { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); ret = asn1p_ref_add_component(yyval.a_parg.governor, yyvsp[-2].tv_str, 0); checkmem(ret == 0); yyval.a_parg.argument = yyvsp[0].tv_str; - ; - break;} -case 64: + } + break; + + case 65: #line 785 "asn1p_y.y" -{ + { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); ret = asn1p_ref_add_component(yyval.a_parg.governor, ASN_EXPR_TYPE2STR(yyvsp[-2].a_type), 1); checkmem(ret == 0); yyval.a_parg.argument = yyvsp[0].tv_str; - ; - break;} -case 65: + } + break; + + case 66: #line 796 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 66: + } + break; + + case 67: #line 801 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 67: + } + break; + + case 68: #line 808 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; - ; - break;} -case 68: + } + break; + + case 69: #line 811 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_REFERENCE; yyval.a_expr->meta_type = AMT_VALUE; - ; - break;} -case 69: + } + break; + + case 70: #line 824 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 70: + } + break; + + case 71: #line 829 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 71: + } + break; + + case 72: #line 836 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-2].tv_nametag.name; yyval.a_expr->tag = yyvsp[-2].tv_nametag.tag; yyval.a_expr->marker = yyvsp[0].a_marker; - ; - break;} -case 72: + } + break; + + case 73: #line 843 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->meta_type = yyvsp[0].a_expr->meta_type; yyval.a_expr->expr_type = A1TC_COMPONENTS_OF; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 73: + } + break; + + case 74: #line 850 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; - ; - break;} -case 74: + } + break; + + case 75: #line 856 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 75: + } + break; + + case 76: #line 861 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 76: + } + break; + + case 77: #line 868 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-1].tv_nametag.name; yyval.a_expr->tag = yyvsp[-1].tv_nametag.tag; - ; - break;} -case 77: + } + break; + + case 78: #line 874 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; - ; - break;} -case 78: + } + break; + + case 79: #line 880 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); yyval.a_expr->with_syntax = yyvsp[0].a_wsynt; assert(yyval.a_expr->expr_type == A1TC_CLASSDEF); assert(yyval.a_expr->meta_type == AMT_OBJECT); - ; - break;} -case 79: + } + break; + + case 80: #line 890 "asn1p_y.y" -{ yyval.a_int = 0; ; - break;} -case 80: + { yyval.a_int = 0; } + break; + + case 81: #line 891 "asn1p_y.y" -{ yyval.a_int = 1; ; - break;} -case 81: + { yyval.a_int = 1; } + break; + + case 82: #line 895 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_CLASSDEF; yyval.a_expr->meta_type = AMT_OBJECT; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 82: + } + break; + + case 83: #line 902 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 83: + } + break; + + case 84: #line 909 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[-1].a_refcomp.name; yyval.a_expr->expr_type = A1TC_CLASSFIELD; yyval.a_expr->meta_type = AMT_OBJECTFIELD; yyval.a_expr->marker = yyvsp[0].a_marker; - ; - break;} -case 84: + } + break; + + case 85: #line 917 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-2].a_expr; yyval.a_expr->Identifier = yyvsp[-3].a_refcomp.name; yyval.a_expr->marker = yyvsp[-1].a_marker; yyval.a_expr->unique = yyvsp[0].a_int; - ; - break;} -case 85: + } + break; + + case 86: #line 923 "asn1p_y.y" -{ + { int ret; yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2023,51 +2511,59 @@ case 85: yyval.a_expr->meta_type = AMT_OBJECTFIELD; yyval.a_expr->marker = yyvsp[-1].a_marker; yyval.a_expr->unique = yyvsp[0].a_int; - ; - break;} -case 86: + } + break; + + case 87: #line 941 "asn1p_y.y" -{ yyval.a_wsynt = 0; ; - break;} -case 87: + { yyval.a_wsynt = 0; } + break; + + case 88: #line 942 "asn1p_y.y" -{ + { yyval.a_wsynt = yyvsp[0].a_wsynt; - ; - break;} -case 88: + } + break; + + case 89: #line 949 "asn1p_y.y" -{ asn1p_lexer_hack_enable_with_syntax(); ; - break;} -case 89: + { asn1p_lexer_hack_enable_with_syntax(); } + break; + + case 90: #line 951 "asn1p_y.y" -{ + { yyval.a_wsynt = yyvsp[-1].a_wsynt; - ; - break;} -case 90: + } + break; + + case 91: #line 957 "asn1p_y.y" -{ + { yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); - ; - break;} -case 91: + } + break; + + case 92: #line 961 "asn1p_y.y" -{ + { yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); - ; - break;} -case 92: + } + break; + + case 93: #line 968 "asn1p_y.y" -{ + { yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); - ; - break;} -case 93: + } + break; + + case 94: #line 971 "asn1p_y.y" -{ + { asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -2075,22 +2571,24 @@ case 93: ret = asn1p_ref_add_component(ref, yyvsp[0].a_refcomp.name, yyvsp[0].a_refcomp.lex_type); checkmem(ret == 0); yyval.a_wchunk = asn1p_wsyntx_chunk_fromref(ref, 0); - ; - break;} -case 94: + } + break; + + case 95: #line 983 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); checkmem(yyval.a_expr->Identifier); yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 95: + } + break; + + case 96: #line 991 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); @@ -2098,11 +2596,12 @@ case 95: yyval.a_expr->value = yyvsp[0].a_value; yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 96: + } + break; + + case 97: #line 1000 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); @@ -2110,11 +2609,12 @@ case 96: checkmem(yyval.a_expr->Identifier); yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 97: + } + break; + + case 98: #line 1012 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-1].a_expr; /* * Outer constraint for SEQUENCE OF and SET OF applies @@ -2131,84 +2631,93 @@ case 97: yyval.a_expr->constraints = yyvsp[0].a_constr; } } - ; - break;} -case 98: + } + break; + + case 99: #line 1033 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; - ; - break;} -case 99: + } + break; + + case 100: #line 1036 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = yyvsp[0].a_type; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 100: + } + break; + + case 101: #line 1042 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); yyval.a_expr->expr_type = ASN_CONSTR_CHOICE; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 101: + } + break; + + case 102: #line 1048 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 102: + } + break; + + case 103: #line 1054 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); yyval.a_expr->expr_type = ASN_CONSTR_SET; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 103: + } + break; + + case 104: #line 1060 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->constraints = yyvsp[-2].a_constr; yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE_OF; yyval.a_expr->meta_type = AMT_TYPE; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 104: + } + break; + + case 105: #line 1068 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->constraints = yyvsp[-2].a_constr; yyval.a_expr->expr_type = ASN_CONSTR_SET_OF; yyval.a_expr->meta_type = AMT_TYPE; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 105: + } + break; + + case 106: #line 1076 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); - yyval.a_expr->expr_type = ASN_CONSTR_ANY; + yyval.a_expr->expr_type = ASN_TYPE_ANY; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 106: + } + break; + + case 107: #line 1082 "asn1p_y.y" -{ + { int ret; yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); @@ -2216,13 +2725,14 @@ case 106: ret = asn1p_ref_add_component(yyval.a_expr->reference, yyvsp[0].tv_str, RLT_lowercase); checkmem(ret == 0); - yyval.a_expr->expr_type = ASN_CONSTR_ANY; + yyval.a_expr->expr_type = ASN_TYPE_ANY; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 107: -#line 1097 "asn1p_y.y" -{ + } + break; + + case 108: +#line 1096 "asn1p_y.y" + { int ret; yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == 0); @@ -2235,42 +2745,46 @@ case 107: free(yyvsp[-3].tv_str); yyval.a_expr->expr_type = A1TC_PARAMETRIZED; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 108: -#line 1121 "asn1p_y.y" -{ + } + break; + + case 109: +#line 1120 "asn1p_y.y" + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->reference = yyvsp[0].a_ref; yyval.a_expr->expr_type = A1TC_REFERENCE; yyval.a_expr->meta_type = AMT_TYPEREF; - ; - break;} -case 109: -#line 1128 "asn1p_y.y" -{ + } + break; + + case 110: +#line 1127 "asn1p_y.y" + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->reference = yyvsp[0].a_ref; yyval.a_expr->expr_type = A1TC_INSTANCE; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 110: -#line 1143 "asn1p_y.y" -{ + } + break; + + case 111: +#line 1142 "asn1p_y.y" + { int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_UNKNOWN); checkmem(ret == 0); free(yyvsp[0].tv_str); - ; - break;} -case 111: -#line 1151 "asn1p_y.y" -{ + } + break; + + case 112: +#line 1150 "asn1p_y.y" + { int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); @@ -2279,11 +2793,12 @@ case 111: ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_UNKNOWN); checkmem(ret == 0); free(yyvsp[-2].tv_str); - ; - break;} -case 112: -#line 1161 "asn1p_y.y" -{ + } + break; + + case 113: +#line 1160 "asn1p_y.y" + { int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); @@ -2292,22 +2807,24 @@ case 112: ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_lowercase); checkmem(ret == 0); free(yyvsp[-2].tv_str); - ; - break;} -case 113: -#line 1171 "asn1p_y.y" -{ + } + break; + + case 114: +#line 1170 "asn1p_y.y" + { int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_CAPITALS); free(yyvsp[0].tv_str); checkmem(ret == 0); - ; - break;} -case 114: -#line 1179 "asn1p_y.y" -{ + } + break; + + case 115: +#line 1178 "asn1p_y.y" + { int ret; yyval.a_ref = yyvsp[0].a_ref; ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[-2].tv_str, RLT_CAPITALS); @@ -2325,101 +2842,114 @@ case 114: * (yyval.a_ref->comp_count - 1)); yyval.a_ref->components[0] = tmp_comp; } - ; - break;} -case 115: -#line 1201 "asn1p_y.y" -{ + } + break; + + case 116: +#line 1200 "asn1p_y.y" + { int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].a_refcomp.name, yyvsp[0].a_refcomp.lex_type); free(yyvsp[0].a_refcomp.name); checkmem(ret == 0); - ; - break;} -case 116: -#line 1209 "asn1p_y.y" -{ + } + break; + + case 117: +#line 1208 "asn1p_y.y" + { int ret; yyval.a_ref = yyvsp[-2].a_ref; ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].a_refcomp.name, yyvsp[0].a_refcomp.lex_type); free(yyvsp[0].a_refcomp.name); checkmem(ret == 0); - ; - break;} -case 119: -#line 1223 "asn1p_y.y" -{ + } + break; + + case 120: +#line 1222 "asn1p_y.y" + { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; - ; - break;} -case 120: -#line 1228 "asn1p_y.y" -{ + } + break; + + case 121: +#line 1227 "asn1p_y.y" + { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; - ; - break;} -case 121: -#line 1241 "asn1p_y.y" -{ + } + break; + + case 122: +#line 1240 "asn1p_y.y" + { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->value = yyvsp[0].a_value; - ; - break;} -case 122: + } + break; + + case 123: +#line 1250 "asn1p_y.y" + { asn1p_lexer_hack_push_opaque_state(); } + break; + + case 124: #line 1251 "asn1p_y.y" -{ asn1p_lexer_hack_push_opaque_state(); ; - break;} -case 123: -#line 1252 "asn1p_y.y" -{ + { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); yyval.a_value->type = ATV_UNPARSED; - ; - break;} -case 124: -#line 1257 "asn1p_y.y" -{ + } + break; + + case 125: +#line 1256 "asn1p_y.y" + { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); - ; - break;} -case 125: -#line 1261 "asn1p_y.y" -{ + } + break; + + case 126: +#line 1260 "asn1p_y.y" + { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); - ; - break;} -case 126: -#line 1265 "asn1p_y.y" -{ + } + break; + + case 127: +#line 1264 "asn1p_y.y" + { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); - ; - break;} -case 127: -#line 1269 "asn1p_y.y" -{ + } + break; + + case 128: +#line 1268 "asn1p_y.y" + { yyval.a_value = yyvsp[0].a_value; - ; - break;} -case 128: -#line 1272 "asn1p_y.y" -{ + } + break; + + case 129: +#line 1271 "asn1p_y.y" + { yyval.a_value = yyvsp[0].a_value; - ; - break;} -case 129: -#line 1278 "asn1p_y.y" -{ + } + break; + + case 130: +#line 1277 "asn1p_y.y" + { asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -2429,11 +2959,12 @@ case 129: yyval.a_value = asn1p_value_fromref(ref, 0); checkmem(yyval.a_value); free(yyvsp[0].tv_str); - ; - break;} -case 130: -#line 1289 "asn1p_y.y" -{ + } + break; + + case 131: +#line 1288 "asn1p_y.y" + { asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -2446,11 +2977,12 @@ case 130: checkmem(yyval.a_value); free(yyvsp[-2].tv_str); free(yyvsp[0].tv_str); - ; - break;} -case 131: -#line 1306 "asn1p_y.y" -{ + } + break; + + case 132: +#line 1305 "asn1p_y.y" + { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 2; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); checkmem(yyval.tv_opaque.buf); @@ -2459,11 +2991,12 @@ case 131: memcpy(yyval.tv_opaque.buf + 2, yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len); yyval.tv_opaque.buf[yyval.tv_opaque.len] = '\0'; free(yyvsp[0].tv_opaque.buf); - ; - break;} -case 132: -#line 1316 "asn1p_y.y" -{ + } + break; + + case 133: +#line 1315 "asn1p_y.y" + { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); checkmem(p); @@ -2474,80 +3007,97 @@ case 132: free(yyvsp[0].tv_opaque.buf); yyval.tv_opaque.buf = p; yyval.tv_opaque.len = newsize; - ; - break;} -case 133: + } + break; + + case 134: +#line 1330 "asn1p_y.y" + { yyval.a_type = ASN_BASIC_BOOLEAN; } + break; + + case 135: #line 1331 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_BOOLEAN; ; - break;} -case 134: + { yyval.a_type = ASN_BASIC_NULL; } + break; + + case 136: #line 1332 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_NULL; ; - break;} -case 135: + { yyval.a_type = ASN_BASIC_REAL; } + break; + + case 137: #line 1333 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_REAL; ; - break;} -case 136: + { yyval.a_type = yyvsp[0].a_type; } + break; + + case 138: #line 1334 "asn1p_y.y" -{ yyval.a_type = yyvsp[0].a_type; ; - break;} -case 137: + { yyval.a_type = ASN_BASIC_OCTET_STRING; } + break; + + case 139: #line 1335 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_OCTET_STRING; ; - break;} -case 138: + { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; } + break; + + case 140: #line 1336 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; - break;} -case 139: + { yyval.a_type = ASN_BASIC_RELATIVE_OID; } + break; + + case 141: #line 1337 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_RELATIVE_OID; ; - break;} -case 140: + { yyval.a_type = ASN_BASIC_EXTERNAL; } + break; + + case 142: #line 1338 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_EXTERNAL; ; - break;} -case 141: + { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; } + break; + + case 143: #line 1339 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; - break;} -case 142: + { yyval.a_type = ASN_BASIC_CHARACTER_STRING; } + break; + + case 144: #line 1340 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; - break;} -case 143: + { yyval.a_type = ASN_BASIC_UTCTime; } + break; + + case 145: #line 1341 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_UTCTime; ; - break;} -case 144: -#line 1342 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_GeneralizedTime; ; - break;} -case 145: + { yyval.a_type = ASN_BASIC_GeneralizedTime; } + break; + + case 146: +#line 1348 "asn1p_y.y" + { yyval.a_type = ASN_BASIC_INTEGER; } + break; + + case 147: #line 1349 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_INTEGER; ; - break;} -case 146: + { yyval.a_type = ASN_BASIC_ENUMERATED; } + break; + + case 148: #line 1350 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_ENUMERATED; ; - break;} -case 147: -#line 1351 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_BIT_STRING; ; - break;} -case 148: -#line 1355 "asn1p_y.y" -{ + { yyval.a_type = ASN_BASIC_BIT_STRING; } + break; + + case 149: +#line 1354 "asn1p_y.y" + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = yyvsp[0].a_type; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 149: -#line 1361 "asn1p_y.y" -{ + } + break; + + case 150: +#line 1360 "asn1p_y.y" + { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; } else { @@ -2556,230 +3106,264 @@ case 149: } yyval.a_expr->expr_type = yyvsp[-1].a_type; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 150: + } + break; + + case 151: +#line 1373 "asn1p_y.y" + { yyval.a_type = ASN_STRING_BMPString; } + break; + + case 152: #line 1374 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_BMPString; ; - break;} -case 151: -#line 1375 "asn1p_y.y" -{ + { yyval.a_type = ASN_STRING_GeneralString; return yyerror("GeneralString is not supported"); - ; - break;} -case 152: -#line 1379 "asn1p_y.y" -{ + } + break; + + case 153: +#line 1378 "asn1p_y.y" + { yyval.a_type = ASN_STRING_GraphicString; return yyerror("GraphicString is not supported"); - ; - break;} -case 153: + } + break; + + case 154: +#line 1382 "asn1p_y.y" + { yyval.a_type = ASN_STRING_IA5String; } + break; + + case 155: #line 1383 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_IA5String; ; - break;} -case 154: + { yyval.a_type = ASN_STRING_ISO646String; } + break; + + case 156: #line 1384 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_ISO646String; ; - break;} -case 155: + { yyval.a_type = ASN_STRING_NumericString; } + break; + + case 157: #line 1385 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_NumericString; ; - break;} -case 156: + { yyval.a_type = ASN_STRING_PrintableString; } + break; + + case 158: #line 1386 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_PrintableString; ; - break;} -case 157: -#line 1387 "asn1p_y.y" -{ + { yyval.a_type = ASN_STRING_T61String; return yyerror("T61String not implemented yet"); - ; - break;} -case 158: + } + break; + + case 159: +#line 1390 "asn1p_y.y" + { yyval.a_type = ASN_STRING_TeletexString; } + break; + + case 160: #line 1391 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_TeletexString; ; - break;} -case 159: + { yyval.a_type = ASN_STRING_UniversalString; } + break; + + case 161: #line 1392 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_UniversalString; ; - break;} -case 160: + { yyval.a_type = ASN_STRING_UTF8String; } + break; + + case 162: #line 1393 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_UTF8String; ; - break;} -case 161: -#line 1394 "asn1p_y.y" -{ + { yyval.a_type = ASN_STRING_VideotexString; return yyerror("VideotexString is no longer supported"); - ; - break;} -case 162: + } + break; + + case 163: +#line 1397 "asn1p_y.y" + { yyval.a_type = ASN_STRING_VisibleString; } + break; + + case 164: #line 1398 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_VisibleString; ; - break;} -case 163: -#line 1399 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_ObjectDescriptor; ; - break;} -case 169: + { yyval.a_type = ASN_STRING_ObjectDescriptor; } + break; + + case 170: +#line 1410 "asn1p_y.y" + { yyval.a_constr = 0; } + break; + + case 171: #line 1411 "asn1p_y.y" -{ yyval.a_constr = 0; ; - break;} -case 170: -#line 1412 "asn1p_y.y" -{ + { yyval.a_constr = yyvsp[0].a_constr; - ; - break;} -case 171: -#line 1418 "asn1p_y.y" -{ + } + break; + + case 172: +#line 1417 "asn1p_y.y" + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); - ; - break;} -case 172: -#line 1421 "asn1p_y.y" -{ + } + break; + + case 173: +#line 1420 "asn1p_y.y" + { /* * This is a special case, for compatibility purposes. * It goes without parentheses. */ CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_SIZE, yyvsp[-1].a_constr, 0); - ; - break;} -case 173: -#line 1431 "asn1p_y.y" -{ + } + break; + + case 174: +#line 1430 "asn1p_y.y" + { yyval.a_constr = yyvsp[-1].a_constr; - ; - break;} -case 174: -#line 1434 "asn1p_y.y" -{ + } + break; + + case 175: +#line 1433 "asn1p_y.y" + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); - ; - break;} -case 175: -#line 1440 "asn1p_y.y" -{ + } + break; + + case 176: +#line 1439 "asn1p_y.y" + { yyval.a_constr = yyvsp[0].a_constr; - ; - break;} -case 176: -#line 1443 "asn1p_y.y" -{ + } + break; + + case 177: +#line 1442 "asn1p_y.y" + { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); ct->type = ACT_EL_EXT; CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); - ; - break;} -case 177: -#line 1449 "asn1p_y.y" -{ + } + break; + + case 178: +#line 1448 "asn1p_y.y" + { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); ct->type = ACT_EL_EXT; CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-4].a_constr, ct); ct = yyval.a_constr; CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, ct, yyvsp[0].a_constr); - ; - break;} -case 178: -#line 1460 "asn1p_y.y" -{ + } + break; + + case 179: +#line 1459 "asn1p_y.y" + { yyval.a_constr = yyvsp[0].a_constr; - ; - break;} -case 179: -#line 1463 "asn1p_y.y" -{ + } + break; + + case 180: +#line 1462 "asn1p_y.y" + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); - ; - break;} -case 180: -#line 1466 "asn1p_y.y" -{ + } + break; + + case 181: +#line 1465 "asn1p_y.y" + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); - ; - break;} -case 181: -#line 1469 "asn1p_y.y" -{ + } + break; + + case 182: +#line 1468 "asn1p_y.y" + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); - ; - break;} -case 182: -#line 1475 "asn1p_y.y" -{ + } + break; + + case 183: +#line 1474 "asn1p_y.y" + { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-3].a_ctype; ret = asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr); checkmem(ret == 0); - ; - break;} -case 183: -#line 1483 "asn1p_y.y" -{ + } + break; + + case 184: +#line 1482 "asn1p_y.y" + { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_CA_SET; ret = asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr); checkmem(ret == 0); - ; - break;} -case 184: -#line 1491 "asn1p_y.y" -{ + } + break; + + case 185: +#line 1490 "asn1p_y.y" + { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_VALUE; yyval.a_constr->value = yyvsp[0].a_value; - ; - break;} -case 185: -#line 1497 "asn1p_y.y" -{ + } + break; + + case 186: +#line 1496 "asn1p_y.y" + { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-1].a_ctype; yyval.a_constr->range_start = yyvsp[-2].a_value; yyval.a_constr->range_stop = yyvsp[0].a_value; - ; - break;} -case 186: -#line 1504 "asn1p_y.y" -{ + } + break; + + case 187: +#line 1503 "asn1p_y.y" + { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-1].a_ctype; yyval.a_constr->range_start = asn1p_value_fromint(-123); yyval.a_constr->range_stop = yyvsp[0].a_value; yyval.a_constr->range_start->type = ATV_MIN; - ; - break;} -case 187: -#line 1512 "asn1p_y.y" -{ + } + break; + + case 188: +#line 1511 "asn1p_y.y" + { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-1].a_ctype; yyval.a_constr->range_start = yyvsp[-2].a_value; yyval.a_constr->range_stop = asn1p_value_fromint(321); yyval.a_constr->range_stop->type = ATV_MAX; - ; - break;} -case 188: -#line 1520 "asn1p_y.y" -{ + } + break; + + case 189: +#line 1519 "asn1p_y.y" + { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-1].a_ctype; @@ -2787,57 +3371,67 @@ case 188: yyval.a_constr->range_stop = asn1p_value_fromint(321); yyval.a_constr->range_start->type = ATV_MIN; yyval.a_constr->range_stop->type = ATV_MAX; - ; - break;} -case 189: -#line 1529 "asn1p_y.y" -{ + } + break; + + case 190: +#line 1528 "asn1p_y.y" + { yyval.a_constr = yyvsp[0].a_constr; - ; - break;} -case 190: -#line 1532 "asn1p_y.y" -{ + } + break; + + case 191: +#line 1531 "asn1p_y.y" + { yyval.a_constr = yyvsp[0].a_constr; - ; - break;} -case 191: + } + break; + + case 192: +#line 1537 "asn1p_y.y" + { yyval.a_ctype = ACT_EL_RANGE; } + break; + + case 193: #line 1538 "asn1p_y.y" -{ yyval.a_ctype = ACT_EL_RANGE; ; - break;} -case 192: + { yyval.a_ctype = ACT_EL_RLRANGE; } + break; + + case 194: #line 1539 "asn1p_y.y" -{ yyval.a_ctype = ACT_EL_RLRANGE; ; - break;} -case 193: + { yyval.a_ctype = ACT_EL_LLRANGE; } + break; + + case 195: #line 1540 "asn1p_y.y" -{ yyval.a_ctype = ACT_EL_LLRANGE; ; - break;} -case 194: -#line 1541 "asn1p_y.y" -{ yyval.a_ctype = ACT_EL_ULRANGE; ; - break;} -case 195: -#line 1545 "asn1p_y.y" -{ + { yyval.a_ctype = ACT_EL_ULRANGE; } + break; + + case 196: +#line 1544 "asn1p_y.y" + { yyval.a_ctype = ACT_CT_SIZE; - ; - break;} -case 196: -#line 1548 "asn1p_y.y" -{ + } + break; + + case 197: +#line 1547 "asn1p_y.y" + { yyval.a_ctype = ACT_CT_FROM; - ; - break;} -case 197: -#line 1554 "asn1p_y.y" -{ + } + break; + + case 198: +#line 1553 "asn1p_y.y" + { yyval.a_value = yyvsp[0].a_value; - ; - break;} -case 198: -#line 1557 "asn1p_y.y" -{ + } + break; + + case 199: +#line 1556 "asn1p_y.y" + { asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -2847,108 +3441,124 @@ case 198: yyval.a_value = asn1p_value_fromref(ref, 0); checkmem(yyval.a_value); free(yyvsp[0].tv_str); - ; - break;} -case 199: -#line 1568 "asn1p_y.y" -{ + } + break; + + case 200: +#line 1567 "asn1p_y.y" + { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); - ; - break;} -case 200: -#line 1573 "asn1p_y.y" -{ + } + break; + + case 201: +#line 1572 "asn1p_y.y" + { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_FALSE; - ; - break;} -case 201: -#line 1578 "asn1p_y.y" -{ + } + break; + + case 202: +#line 1577 "asn1p_y.y" + { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); yyval.a_value->type = ATV_TRUE; - ; - break;} -case 202: -#line 1586 "asn1p_y.y" -{ + } + break; + + case 203: +#line 1585 "asn1p_y.y" + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); - ; - break;} -case 203: -#line 1592 "asn1p_y.y" -{ + } + break; + + case 204: +#line 1591 "asn1p_y.y" + { yyval.a_constr = yyvsp[0].a_constr; - ; - break;} -case 204: -#line 1595 "asn1p_y.y" -{ + } + break; + + case 205: +#line 1594 "asn1p_y.y" + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); - ; - break;} -case 205: -#line 1601 "asn1p_y.y" -{ + } + break; + + case 206: +#line 1600 "asn1p_y.y" + { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_EXT; - ; - break;} -case 206: -#line 1606 "asn1p_y.y" -{ + } + break; + + case 207: +#line 1605 "asn1p_y.y" + { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_VALUE; yyval.a_constr->value = asn1p_value_frombuf(yyvsp[-2].tv_str, strlen(yyvsp[-2].tv_str), 0); yyval.a_constr->presence = yyvsp[0].a_pres; - ; - break;} -case 207: + } + break; + + case 208: +#line 1618 "asn1p_y.y" + { yyval.a_pres = ACPRES_DEFAULT; } + break; + + case 209: #line 1619 "asn1p_y.y" -{ yyval.a_pres = ACPRES_DEFAULT; ; - break;} -case 208: -#line 1620 "asn1p_y.y" -{ yyval.a_pres = yyvsp[0].a_pres; ; - break;} -case 209: -#line 1624 "asn1p_y.y" -{ + { yyval.a_pres = yyvsp[0].a_pres; } + break; + + case 210: +#line 1623 "asn1p_y.y" + { yyval.a_pres = ACPRES_PRESENT; - ; - break;} -case 210: -#line 1627 "asn1p_y.y" -{ + } + break; + + case 211: +#line 1626 "asn1p_y.y" + { yyval.a_pres = ACPRES_ABSENT; - ; - break;} -case 211: -#line 1630 "asn1p_y.y" -{ + } + break; + + case 212: +#line 1629 "asn1p_y.y" + { yyval.a_pres = ACPRES_OPTIONAL; - ; - break;} -case 212: -#line 1636 "asn1p_y.y" -{ + } + break; + + case 213: +#line 1635 "asn1p_y.y" + { yyval.a_constr = yyvsp[0].a_constr; - ; - break;} -case 213: -#line 1639 "asn1p_y.y" -{ + } + break; + + case 214: +#line 1638 "asn1p_y.y" + { yyval.a_constr = yyvsp[0].a_constr; - ; - break;} -case 214: -#line 1648 "asn1p_y.y" -{ + } + break; + + case 215: +#line 1647 "asn1p_y.y" + { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; int ret; @@ -2959,37 +3569,41 @@ case 214: ct->type = ACT_EL_VALUE; ct->value = asn1p_value_fromref(ref, 0); CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, ct, 0); - ; - break;} -case 215: -#line 1663 "asn1p_y.y" -{ + } + break; + + case 216: +#line 1662 "asn1p_y.y" + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); - ; - break;} -case 216: -#line 1669 "asn1p_y.y" -{ + } + break; + + case 217: +#line 1668 "asn1p_y.y" + { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_VALUE; yyval.a_constr->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); - ; - break;} -case 217: -#line 1675 "asn1p_y.y" -{ + } + break; + + case 218: +#line 1674 "asn1p_y.y" + { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); checkmem(ct); ct->type = ACT_EL_VALUE; ct->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); - ; - break;} -case 218: -#line 1689 "asn1p_y.y" -{ + } + break; + + case 219: +#line 1688 "asn1p_y.y" + { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; *p = '@'; @@ -2999,11 +3613,12 @@ case 218: checkmem(ret == 0); free(p); free(yyvsp[0].tv_str); - ; - break;} -case 219: -#line 1700 "asn1p_y.y" -{ + } + break; + + case 220: +#line 1699 "asn1p_y.y" + { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; p[0] = '@'; @@ -3014,17 +3629,19 @@ case 219: checkmem(ret == 0); free(p); free(yyvsp[0].tv_str); - ; - break;} -case 220: -#line 1716 "asn1p_y.y" -{ + } + break; + + case 221: +#line 1715 "asn1p_y.y" + { yyval.tv_str = yyvsp[0].tv_str; - ; - break;} -case 221: -#line 1719 "asn1p_y.y" -{ + } + break; + + case 222: +#line 1718 "asn1p_y.y" + { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); yyval.tv_str = malloc(l1 + 1 + l3 + 1); @@ -3032,437 +3649,469 @@ case 221: yyval.tv_str[l1] = '.'; memcpy(yyval.tv_str + l1 + 1, yyvsp[0].tv_str, l3); yyval.tv_str[l1 + 1 + l3] = '\0'; - ; - break;} -case 222: + } + break; + + case 223: +#line 1736 "asn1p_y.y" + { yyval.a_marker = EM_NOMARK; } + break; + + case 224: #line 1737 "asn1p_y.y" -{ yyval.a_marker = EM_NOMARK; ; - break;} -case 223: -#line 1738 "asn1p_y.y" -{ yyval.a_marker = yyvsp[0].a_marker; ; - break;} -case 224: -#line 1742 "asn1p_y.y" -{ + { yyval.a_marker = yyvsp[0].a_marker; } + break; + + case 225: +#line 1741 "asn1p_y.y" + { yyval.a_marker = EM_OPTIONAL; - ; - break;} -case 225: -#line 1745 "asn1p_y.y" -{ + } + break; + + case 226: +#line 1744 "asn1p_y.y" + { yyval.a_marker = EM_DEFAULT; /* FIXME: store DefaultValue somewhere */ - ; - break;} -case 226: -#line 1752 "asn1p_y.y" -{ - ; - break;} -case 227: -#line 1754 "asn1p_y.y" -{ - ; - break;} -case 228: -#line 1756 "asn1p_y.y" -{ asn1p_lexer_hack_push_opaque_state(); ; - break;} -case 229: -#line 1756 "asn1p_y.y" -{ - ; - break;} -case 230: -#line 1777 "asn1p_y.y" -{ + } + break; + + case 227: +#line 1751 "asn1p_y.y" + { + } + break; + + case 228: +#line 1753 "asn1p_y.y" + { + } + break; + + case 229: +#line 1755 "asn1p_y.y" + { asn1p_lexer_hack_push_opaque_state(); } + break; + + case 230: +#line 1755 "asn1p_y.y" + { + } + break; + + case 231: +#line 1776 "asn1p_y.y" + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); - ; - break;} -case 231: -#line 1781 "asn1p_y.y" -{ + } + break; + + case 232: +#line 1780 "asn1p_y.y" + { yyval.a_expr = yyvsp[-1].a_expr; - ; - break;} -case 232: -#line 1787 "asn1p_y.y" -{ + } + break; + + case 233: +#line 1786 "asn1p_y.y" + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 233: -#line 1792 "asn1p_y.y" -{ + } + break; + + case 234: +#line 1791 "asn1p_y.y" + { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 234: -#line 1799 "asn1p_y.y" -{ + } + break; + + case 235: +#line 1798 "asn1p_y.y" + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->Identifier = yyvsp[0].tv_str; - ; - break;} -case 235: -#line 1806 "asn1p_y.y" -{ + } + break; + + case 236: +#line 1805 "asn1p_y.y" + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->value = yyvsp[-1].a_value; - ; - break;} -case 236: -#line 1814 "asn1p_y.y" -{ + } + break; + + case 237: +#line 1813 "asn1p_y.y" + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->value = yyvsp[-1].a_value; - ; - break;} -case 237: -#line 1822 "asn1p_y.y" -{ + } + break; + + case 238: +#line 1821 "asn1p_y.y" + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->value = yyvsp[0].a_value; - ; - break;} -case 238: -#line 1829 "asn1p_y.y" -{ + } + break; + + case 239: +#line 1828 "asn1p_y.y" + { yyval.a_expr = asn1p_expr_new(asn1p_lineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); checkmem(yyval.a_expr->Identifier); yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_VALUE; - ; - break;} -case 239: -#line 1840 "asn1p_y.y" -{ + } + break; + + case 240: +#line 1839 "asn1p_y.y" + { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); - ; - break;} -case 240: -#line 1844 "asn1p_y.y" -{ + } + break; + + case 241: +#line 1843 "asn1p_y.y" + { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); - ; - break;} -case 241: + } + break; + + case 242: +#line 1874 "asn1p_y.y" + { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); } + break; + + case 243: #line 1875 "asn1p_y.y" -{ memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; - break;} -case 242: -#line 1876 "asn1p_y.y" -{ yyval.a_tag = yyvsp[0].a_tag; ; - break;} -case 243: -#line 1880 "asn1p_y.y" -{ + { yyval.a_tag = yyvsp[0].a_tag; } + break; + + case 244: +#line 1879 "asn1p_y.y" + { yyval.a_tag = yyvsp[0].a_tag; yyval.a_tag.tag_mode = TM_DEFAULT; - ; - break;} -case 244: -#line 1884 "asn1p_y.y" -{ + } + break; + + case 245: +#line 1883 "asn1p_y.y" + { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_IMPLICIT; - ; - break;} -case 245: -#line 1888 "asn1p_y.y" -{ + } + break; + + case 246: +#line 1887 "asn1p_y.y" + { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_EXPLICIT; - ; - break;} -case 246: -#line 1895 "asn1p_y.y" -{ + } + break; + + case 247: +#line 1894 "asn1p_y.y" + { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - ; - break;} -case 247: -#line 1899 "asn1p_y.y" -{ + } + break; + + case 248: +#line 1898 "asn1p_y.y" + { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - ; - break;} -case 248: -#line 1907 "asn1p_y.y" -{ + } + break; + + case 249: +#line 1906 "asn1p_y.y" + { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - ; - break;} -case 249: -#line 1914 "asn1p_y.y" -{ + } + break; + + case 250: +#line 1913 "asn1p_y.y" + { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - ; - break;} -case 250: -#line 1921 "asn1p_y.y" -{ + } + break; + + case 251: +#line 1920 "asn1p_y.y" + { memset(&yyval.tv_nametag, 0, sizeof(yyval.tv_nametag)); yyval.tv_nametag.name = yyvsp[0].tv_str; - ; - break;} -case 251: -#line 1925 "asn1p_y.y" -{ + } + break; + + case 252: +#line 1924 "asn1p_y.y" + { yyval.tv_nametag.name = yyvsp[-1].tv_str; yyval.tv_nametag.tag = yyvsp[0].a_tag; - ; - break;} -} - /* the action file gets copied in in place of this dollarsign */ -#line 543 "/usr/share/bison.simple" + } + break; + + + } + +/* Line 1016 of /usr/local/share/bison/yacc.c. */ +#line 3896 "asn1p_y.c" yyvsp -= yylen; yyssp -= yylen; -#ifdef YYLSP_NEEDED - yylsp -= yylen; -#endif -#if YYDEBUG != 0 + +#if YYDEBUG if (yydebug) { - short *ssp1 = yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); + short *yyssp1 = yyss - 1; + YYFPRINTF (stderr, "state stack now"); + while (yyssp1 != yyssp) + YYFPRINTF (stderr, " %d", *++yyssp1); + YYFPRINTF (stderr, "\n"); } #endif *++yyvsp = yyval; -#ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } -#endif - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ yyn = yyr1[yyn]; - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else - yystate = yydefgoto[yyn - YYNTBASE]; + yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; -yyerrlab: /* here on detecting error */ - if (! yyerrstatus) - /* If not already recovering from an error, report this error. */ +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) { ++yynerrs; - -#ifdef YYERROR_VERBOSE +#if YYERROR_VERBOSE yyn = yypact[yystate]; - if (yyn > YYFLAG && yyn < YYLAST) + if (YYPACT_NINF < yyn && yyn < YYLAST) { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ - for (x = (yyn < 0 ? -yyn : 0); - x < (ssize_t)(sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - size += strlen(yytname[x]) + 15, count++; - msg = (char *) malloc(size + 15); - if (msg != 0) + YYSIZE_T yysize = 0; + int yytype = YYTRANSLATE (yychar); + char *yymsg; + int yyx, yycount; + + yycount = 0; + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + for (yyx = yyn < 0 ? -yyn : 0; + yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + yysize += yystrlen (yytname[yyx]) + 15, yycount++; + yysize += yystrlen ("parse error, unexpected ") + 1; + yysize += yystrlen (yytname[yytype]); + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg != 0) { - strcpy(msg, "parse error"); + char *yyp = yystpcpy (yymsg, "parse error, unexpected "); + yyp = yystpcpy (yyp, yytname[yytype]); - if (count < 5) + if (yycount < 5) { - count = 0; - for (x = (yyn < 0 ? -yyn : 0); - x < (ssize_t)(sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) + yycount = 0; + for (yyx = yyn < 0 ? -yyn : 0; + yyx < (int) (sizeof (yytname) / sizeof (char *)); + yyx++) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); - count++; + const char *yyq = ! yycount ? ", expecting " : " or "; + yyp = yystpcpy (yyp, yyq); + yyp = yystpcpy (yyp, yytname[yyx]); + yycount++; } } - yyerror(msg); - free(msg); + yyerror (yymsg); + YYSTACK_FREE (yymsg); } else - yyerror ("parse error; also virtual memory exceeded"); + yyerror ("parse error; also virtual memory exhausted"); } else #endif /* YYERROR_VERBOSE */ - yyerror("parse error"); + yyerror ("parse error"); } - goto yyerrlab1; -yyerrlab1: /* here on error raised explicitly by an action */ + +/*----------------------------------------------------. +| yyerrlab1 -- error raised explicitly by an action. | +`----------------------------------------------------*/ +yyerrlab1: if (yyerrstatus == 3) { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ - /* return failure if at end of input */ + /* Return failure if at end of input. */ if (yychar == YYEOF) - YYABORT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); -#endif + { + /* Pop the error token. */ + YYPOPSTACK; + /* Pop the rest of the stack. */ + while (yyssp > yyss) + { + YYDPRINTF ((stderr, "Error: popping ")); + YYDSYMPRINT ((stderr, + yystos[*yyssp], + *yyvsp)); + YYDPRINTF ((stderr, "\n")); + yydestruct (yystos[*yyssp], *yyvsp); + YYPOPSTACK; + } + YYABORT; + } + YYDPRINTF ((stderr, "Discarding token %d (%s).\n", + yychar, yytname[yychar1])); + yydestruct (yychar1, yylval); yychar = YYEMPTY; } - /* Else will try to reuse lookahead token - after shifting the error token. */ + /* Else will try to reuse lookahead token after shifting the error + token. */ - yyerrstatus = 3; /* Each real token shifted decrements this */ + yyerrstatus = 3; /* Each real token shifted decrements this. */ - goto yyerrhandle; + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } -yyerrdefault: /* current state does not do anything special for the error token. */ + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (yyn) goto yydefault; -#endif + YYDPRINTF ((stderr, "Error: popping ")); + YYDSYMPRINT ((stderr, + yystos[*yyssp], *yyvsp)); + YYDPRINTF ((stderr, "\n")); -yyerrpop: /* pop the current state because it cannot handle the error token */ + yydestruct (yystos[yystate], *yyvsp); + yyvsp--; + yystate = *--yyssp; - if (yyssp == yyss) YYABORT; - yyvsp--; - yystate = *--yyssp; -#ifdef YYLSP_NEEDED - yylsp--; -#endif -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } +#if YYDEBUG + if (yydebug) + { + short *yyssp1 = yyss - 1; + YYFPRINTF (stderr, "Error: state stack now"); + while (yyssp1 != yyssp) + YYFPRINTF (stderr, " %d", *++yyssp1); + YYFPRINTF (stderr, "\n"); + } #endif - -yyerrhandle: - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yyerrdefault; - - yyn += YYTERROR; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) - goto yyerrdefault; - - yyn = yytable[yyn]; - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrpop; - yyn = -yyn; - goto yyreduce; } - else if (yyn == 0) - goto yyerrpop; if (yyn == YYFINAL) YYACCEPT; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting error token, "); -#endif + YYDPRINTF ((stderr, "Shifting error token, ")); *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif + yystate = yyn; goto yynewstate; - yyacceptlab: - /* YYACCEPT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*----------------------------------------------. +| yyoverflowlab -- parser overflow comes here. | +`----------------------------------------------*/ +yyoverflowlab: + yyerror ("parser stack overflow"); + yyresult = 2; + /* Fall through. */ #endif - } - return 0; - yyabortlab: - /* YYABORT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); +yyreturn: +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); #endif - } - return 1; + return yyresult; } -#line 1932 "asn1p_y.y" + + +#line 1931 "asn1p_y.y" @@ -3572,3 +4221,4 @@ yyerror(const char *msg) { } + diff --git a/libasn1parser/asn1p_y.h b/libasn1parser/asn1p_y.h index 375b845fd..6d3ff5e71 100644 --- a/libasn1parser/asn1p_y.h +++ b/libasn1parser/asn1p_y.h @@ -1,3 +1,243 @@ +/* A Bison parser, made from asn1p_y.y, by GNU bison 1.75. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +#ifndef BISON_ASN_P_Y_H +# define BISON_ASN_P_Y_H + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + TOK_PPEQ = 258, + TOK_opaque = 259, + TOK_bstring = 260, + TOK_cstring = 261, + TOK_hstring = 262, + TOK_identifier = 263, + TOK_number = 264, + TOK_number_negative = 265, + TOK_typereference = 266, + TOK_capitalreference = 267, + TOK_typefieldreference = 268, + TOK_valuefieldreference = 269, + TOK_ABSENT = 270, + TOK_ABSTRACT_SYNTAX = 271, + TOK_ALL = 272, + TOK_ANY = 273, + TOK_APPLICATION = 274, + TOK_AUTOMATIC = 275, + TOK_BEGIN = 276, + TOK_BIT = 277, + TOK_BMPString = 278, + TOK_BOOLEAN = 279, + TOK_BY = 280, + TOK_CHARACTER = 281, + TOK_CHOICE = 282, + TOK_CLASS = 283, + TOK_COMPONENT = 284, + TOK_COMPONENTS = 285, + TOK_CONSTRAINED = 286, + TOK_CONTAINING = 287, + TOK_DEFAULT = 288, + TOK_DEFINITIONS = 289, + TOK_DEFINED = 290, + TOK_EMBEDDED = 291, + TOK_ENCODED = 292, + TOK_ENCODING_CONTROL = 293, + TOK_END = 294, + TOK_ENUMERATED = 295, + TOK_EXPLICIT = 296, + TOK_EXPORTS = 297, + TOK_EXTENSIBILITY = 298, + TOK_EXTERNAL = 299, + TOK_FALSE = 300, + TOK_FROM = 301, + TOK_GeneralizedTime = 302, + TOK_GeneralString = 303, + TOK_GraphicString = 304, + TOK_IA5String = 305, + TOK_IDENTIFIER = 306, + TOK_IMPLICIT = 307, + TOK_IMPLIED = 308, + TOK_IMPORTS = 309, + TOK_INCLUDES = 310, + TOK_INSTANCE = 311, + TOK_INSTRUCTIONS = 312, + TOK_INTEGER = 313, + TOK_ISO646String = 314, + TOK_MAX = 315, + TOK_MIN = 316, + TOK_MINUS_INFINITY = 317, + TOK_NULL = 318, + TOK_NumericString = 319, + TOK_OBJECT = 320, + TOK_ObjectDescriptor = 321, + TOK_OCTET = 322, + TOK_OF = 323, + TOK_OPTIONAL = 324, + TOK_PATTERN = 325, + TOK_PDV = 326, + TOK_PLUS_INFINITY = 327, + TOK_PRESENT = 328, + TOK_PrintableString = 329, + TOK_PRIVATE = 330, + TOK_REAL = 331, + TOK_RELATIVE_OID = 332, + TOK_SEQUENCE = 333, + TOK_SET = 334, + TOK_SIZE = 335, + TOK_STRING = 336, + TOK_SYNTAX = 337, + TOK_T61String = 338, + TOK_TAGS = 339, + TOK_TeletexString = 340, + TOK_TRUE = 341, + TOK_TYPE_IDENTIFIER = 342, + TOK_UNIQUE = 343, + TOK_UNIVERSAL = 344, + TOK_UniversalString = 345, + TOK_UTCTime = 346, + TOK_UTF8String = 347, + TOK_VideotexString = 348, + TOK_VisibleString = 349, + TOK_WITH = 350, + TOK_EXCEPT = 351, + TOK_INTERSECTION = 352, + TOK_UNION = 353, + TOK_TwoDots = 354, + TOK_ThreeDots = 355, + TOK_tag = 356 + }; +#endif +#define TOK_PPEQ 258 +#define TOK_opaque 259 +#define TOK_bstring 260 +#define TOK_cstring 261 +#define TOK_hstring 262 +#define TOK_identifier 263 +#define TOK_number 264 +#define TOK_number_negative 265 +#define TOK_typereference 266 +#define TOK_capitalreference 267 +#define TOK_typefieldreference 268 +#define TOK_valuefieldreference 269 +#define TOK_ABSENT 270 +#define TOK_ABSTRACT_SYNTAX 271 +#define TOK_ALL 272 +#define TOK_ANY 273 +#define TOK_APPLICATION 274 +#define TOK_AUTOMATIC 275 +#define TOK_BEGIN 276 +#define TOK_BIT 277 +#define TOK_BMPString 278 +#define TOK_BOOLEAN 279 +#define TOK_BY 280 +#define TOK_CHARACTER 281 +#define TOK_CHOICE 282 +#define TOK_CLASS 283 +#define TOK_COMPONENT 284 +#define TOK_COMPONENTS 285 +#define TOK_CONSTRAINED 286 +#define TOK_CONTAINING 287 +#define TOK_DEFAULT 288 +#define TOK_DEFINITIONS 289 +#define TOK_DEFINED 290 +#define TOK_EMBEDDED 291 +#define TOK_ENCODED 292 +#define TOK_ENCODING_CONTROL 293 +#define TOK_END 294 +#define TOK_ENUMERATED 295 +#define TOK_EXPLICIT 296 +#define TOK_EXPORTS 297 +#define TOK_EXTENSIBILITY 298 +#define TOK_EXTERNAL 299 +#define TOK_FALSE 300 +#define TOK_FROM 301 +#define TOK_GeneralizedTime 302 +#define TOK_GeneralString 303 +#define TOK_GraphicString 304 +#define TOK_IA5String 305 +#define TOK_IDENTIFIER 306 +#define TOK_IMPLICIT 307 +#define TOK_IMPLIED 308 +#define TOK_IMPORTS 309 +#define TOK_INCLUDES 310 +#define TOK_INSTANCE 311 +#define TOK_INSTRUCTIONS 312 +#define TOK_INTEGER 313 +#define TOK_ISO646String 314 +#define TOK_MAX 315 +#define TOK_MIN 316 +#define TOK_MINUS_INFINITY 317 +#define TOK_NULL 318 +#define TOK_NumericString 319 +#define TOK_OBJECT 320 +#define TOK_ObjectDescriptor 321 +#define TOK_OCTET 322 +#define TOK_OF 323 +#define TOK_OPTIONAL 324 +#define TOK_PATTERN 325 +#define TOK_PDV 326 +#define TOK_PLUS_INFINITY 327 +#define TOK_PRESENT 328 +#define TOK_PrintableString 329 +#define TOK_PRIVATE 330 +#define TOK_REAL 331 +#define TOK_RELATIVE_OID 332 +#define TOK_SEQUENCE 333 +#define TOK_SET 334 +#define TOK_SIZE 335 +#define TOK_STRING 336 +#define TOK_SYNTAX 337 +#define TOK_T61String 338 +#define TOK_TAGS 339 +#define TOK_TeletexString 340 +#define TOK_TRUE 341 +#define TOK_TYPE_IDENTIFIER 342 +#define TOK_UNIQUE 343 +#define TOK_UNIVERSAL 344 +#define TOK_UniversalString 345 +#define TOK_UTCTime 346 +#define TOK_UTF8String 347 +#define TOK_VideotexString 348 +#define TOK_VisibleString 349 +#define TOK_WITH 350 +#define TOK_EXCEPT 351 +#define TOK_INTERSECTION 352 +#define TOK_UNION 353 +#define TOK_TwoDots 354 +#define TOK_ThreeDots 355 +#define TOK_tag 356 + + + + +#ifndef YYSTYPE +#line 58 "asn1p_y.y" typedef union { asn1p_t *a_grammar; asn1p_module_flags_e a_module_flags; @@ -29,106 +269,14 @@ typedef union { char *name; struct asn1p_type_tag_s tag; } tv_nametag; -} YYSTYPE; -#define TOK_PPEQ 257 -#define TOK_opaque 258 -#define TOK_bstring 259 -#define TOK_cstring 260 -#define TOK_hstring 261 -#define TOK_identifier 262 -#define TOK_number 263 -#define TOK_number_negative 264 -#define TOK_typereference 265 -#define TOK_capitalreference 266 -#define TOK_typefieldreference 267 -#define TOK_valuefieldreference 268 -#define TOK_ABSENT 269 -#define TOK_ABSTRACT_SYNTAX 270 -#define TOK_ALL 271 -#define TOK_ANY 272 -#define TOK_APPLICATION 273 -#define TOK_AUTOMATIC 274 -#define TOK_BEGIN 275 -#define TOK_BIT 276 -#define TOK_BMPString 277 -#define TOK_BOOLEAN 278 -#define TOK_BY 279 -#define TOK_CHARACTER 280 -#define TOK_CHOICE 281 -#define TOK_CLASS 282 -#define TOK_COMPONENT 283 -#define TOK_COMPONENTS 284 -#define TOK_CONSTRAINED 285 -#define TOK_CONTAINING 286 -#define TOK_DEFAULT 287 -#define TOK_DEFINITIONS 288 -#define TOK_DEFINED 289 -#define TOK_EMBEDDED 290 -#define TOK_ENCODED 291 -#define TOK_ENCODING_CONTROL 292 -#define TOK_END 293 -#define TOK_ENUMERATED 294 -#define TOK_EXPLICIT 295 -#define TOK_EXPORTS 296 -#define TOK_EXTENSIBILITY 297 -#define TOK_EXTERNAL 298 -#define TOK_FALSE 299 -#define TOK_FROM 300 -#define TOK_GeneralizedTime 301 -#define TOK_GeneralString 302 -#define TOK_GraphicString 303 -#define TOK_IA5String 304 -#define TOK_IDENTIFIER 305 -#define TOK_IMPLICIT 306 -#define TOK_IMPLIED 307 -#define TOK_IMPORTS 308 -#define TOK_INCLUDES 309 -#define TOK_INSTANCE 310 -#define TOK_INSTRUCTIONS 311 -#define TOK_INTEGER 312 -#define TOK_ISO646String 313 -#define TOK_MAX 314 -#define TOK_MIN 315 -#define TOK_MINUS_INFINITY 316 -#define TOK_NULL 317 -#define TOK_NumericString 318 -#define TOK_OBJECT 319 -#define TOK_ObjectDescriptor 320 -#define TOK_OCTET 321 -#define TOK_OF 322 -#define TOK_OPTIONAL 323 -#define TOK_PATTERN 324 -#define TOK_PDV 325 -#define TOK_PLUS_INFINITY 326 -#define TOK_PRESENT 327 -#define TOK_PrintableString 328 -#define TOK_PRIVATE 329 -#define TOK_REAL 330 -#define TOK_RELATIVE_OID 331 -#define TOK_SEQUENCE 332 -#define TOK_SET 333 -#define TOK_SIZE 334 -#define TOK_STRING 335 -#define TOK_SYNTAX 336 -#define TOK_T61String 337 -#define TOK_TAGS 338 -#define TOK_TeletexString 339 -#define TOK_TRUE 340 -#define TOK_TYPE_IDENTIFIER 341 -#define TOK_UNIQUE 342 -#define TOK_UNIVERSAL 343 -#define TOK_UniversalString 344 -#define TOK_UTCTime 345 -#define TOK_UTF8String 346 -#define TOK_VideotexString 347 -#define TOK_VisibleString 348 -#define TOK_WITH 349 -#define TOK_EXCEPT 350 -#define TOK_INTERSECTION 351 -#define TOK_UNION 352 -#define TOK_TwoDots 353 -#define TOK_ThreeDots 354 -#define TOK_tag 355 - +} yystype; +/* Line 1281 of /usr/local/share/bison/yacc.c. */ +#line 275 "y.tab.h" +# define YYSTYPE yystype +#endif extern YYSTYPE asn1p_lval; + + +#endif /* not BISON_ASN_P_Y_H */ + diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index 3e712509e..317bba044 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -1076,7 +1076,7 @@ TypeDeclaration: | TOK_ANY { $$ = asn1p_expr_new(asn1p_lineno); checkmem($$); - $$->expr_type = ASN_CONSTR_ANY; + $$->expr_type = ASN_TYPE_ANY; $$->meta_type = AMT_TYPE; } | TOK_ANY TOK_DEFINED TOK_BY Identifier { @@ -1087,10 +1087,9 @@ TypeDeclaration: ret = asn1p_ref_add_component($$->reference, $4, RLT_lowercase); checkmem(ret == 0); - $$->expr_type = ASN_CONSTR_ANY; + $$->expr_type = ASN_TYPE_ANY; $$->meta_type = AMT_TYPE; } - ; /* * A parametrized assignment. */ From 60e05a440f6d9079914e2e822e6b77de43b28ec7 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 4 Sep 2004 04:54:42 +0000 Subject: [PATCH 0242/1469] changes related to ANY type introduction git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@242 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/42-real-life-OK.asn1.-PR | 2 +- tests/44-choice-in-sequence-OK.asn1.-P | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index ad954aa04..d4da365aa 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -208,7 +208,7 @@ memb_vparts_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, static asn1_TYPE_member_t asn1_MBR_vparts[] = { { 0, 0, - .tag = -1 /* Ambiguous tag (CHOICE?) */, + .tag = -1 /* Ambiguous tag (CHOICE|ANY?) */, .tag_mode = 0, .type = (void *)&asn1_DEF_VariablePart, .memb_constraints = 0, /* Defer to actual type */ diff --git a/tests/44-choice-in-sequence-OK.asn1.-P b/tests/44-choice-in-sequence-OK.asn1.-P index 3a12ecfcb..1d7c1901f 100644 --- a/tests/44-choice-in-sequence-OK.asn1.-P +++ b/tests/44-choice-in-sequence-OK.asn1.-P @@ -176,7 +176,7 @@ static asn1_TYPE_member_t asn1_MBR_b[] = { .name = "d" }, { 0, offsetof(struct b, choice.e), - .tag = -1 /* Ambiguous tag (CHOICE?) */, + .tag = -1 /* Ambiguous tag (CHOICE|ANY?) */, .tag_mode = 0, .type = (void *)&asn1_DEF_e, .memb_constraints = 0, /* Defer to actual type */ @@ -232,7 +232,7 @@ static asn1_TYPE_member_t asn1_MBR_T[] = { .name = "a" }, { 0, offsetof(struct T, b), - .tag = -1 /* Ambiguous tag (CHOICE?) */, + .tag = -1 /* Ambiguous tag (CHOICE|ANY?) */, .tag_mode = 0, .type = (void *)&asn1_DEF_b, .memb_constraints = 0, /* Defer to actual type */ From 39c5061c154b9337cc2bfca645ae207aa7f892bd Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 4 Sep 2004 05:02:31 +0000 Subject: [PATCH 0243/1469] added support for ANY type git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@243 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7fc666c78..a62c1f9a0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,7 @@ -0.9.3: 2004-Aug-25 +0.9.3: 2004-Sep-03 - * Compiled under cygwin. + * Added support for ANY type. 0.9.2: 2004-Aug-24 From 141874aab5375c63225ea1d3f92c0b35e9733109 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 4 Sep 2004 06:17:35 +0000 Subject: [PATCH 0244/1469] typo git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@244 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SEQUENCE.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 67c916e68..2a8a5405b 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -261,7 +261,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, } if(use_bsearch) { /* - * Resorch to a binary search over + * Resort to a binary search over * sorted array of tags. */ asn1_TYPE_tag2member_t *t2m; From 55d20cff3b1c9cc5161968170be44349a07a56be Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 4 Sep 2004 07:49:01 +0000 Subject: [PATCH 0245/1469] -ANY git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@245 59561ff5-6e30-0410-9f3c-9617f08c8826 --- TODO | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/TODO b/TODO index 85745a838..09fc914d0 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,7 @@ MAJOR: -1. Support for PER encoding. Requires advanced subtype constraints support (#1) +1. Support for PER encoding. Requires advanced subtype constraints support, +which is just completed. 2. Support for XER encoding. @@ -11,4 +12,4 @@ MAJOR: MINOR: -1. Support for ANY, EXTERNAL, EMBEDDED-PDV and CHARACTER STRING types. +1. Support for EXTERNAL, EMBEDDED-PDV and CHARACTER STRING types. From 7614245854ee76e83eb4a6fad8bf60a0c57ba8db Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 5 Sep 2004 10:36:22 +0000 Subject: [PATCH 0246/1469] more support for parametrized type; additional ANY support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@246 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix.c | 33 ++++++-- libasn1fix/asn1fix_constr.c | 144 +++++++++++++++++++++----------- libasn1fix/asn1fix_constr.h | 2 +- libasn1fix/asn1fix_constraint.c | 6 +- libasn1fix/asn1fix_crange.c | 2 +- libasn1fix/asn1fix_param.c | 131 ++++++++++++++++++++++++----- libasn1fix/asn1fix_tags.c | 10 ++- libasn1fix/asn1fix_tags.h | 2 +- 8 files changed, 248 insertions(+), 82 deletions(-) diff --git a/libasn1fix/asn1fix.c b/libasn1fix/asn1fix.c index 46a32727b..4a279325c 100644 --- a/libasn1fix/asn1fix.c +++ b/libasn1fix/asn1fix.c @@ -159,15 +159,21 @@ asn1f_fix_module(arg_t *arg) { RET2RVAL(ret, rvalue); /* - * 2.[234] Process SEQUENCE/SET/CHOICE types. + * 2.5.4 */ - ret = asn1f_recurse_expr(arg, asn1f_fix_constructed); + ret = asn1f_recurse_expr(arg, asn1f_fix_dereference_types); RET2RVAL(ret, rvalue); /* - * 2.5.4 + * Fix tagging of top-level types. */ - ret = asn1f_recurse_expr(arg, asn1f_fix_dereference_types); + ret = asn1f_fix_constr_tag(arg, 1); + RET2RVAL(ret, rvalue); + + /* + * 2.[234] Process SEQUENCE/SET/CHOICE types. + */ + ret = asn1f_recurse_expr(arg, asn1f_fix_constructed); RET2RVAL(ret, rvalue); /* @@ -239,6 +245,10 @@ asn1f_fix_module(arg_t *arg) { TQ_FOR(expr, &(arg->mod->members), next) { arg->expr = expr; + if(arg->expr->meta_type == AMT_PARAMTYPE) + /* Do not process the parametrized types here */ + continue; + ret = asn1f_recurse_expr(arg, asn1f_check_constraints); RET2RVAL(ret, rvalue); @@ -286,7 +296,7 @@ asn1f_fix_constructed(arg_t *arg) { RET2RVAL(ret, rvalue); /* Fix tagging */ - ret = asn1f_fix_constr_tag(arg); + ret = asn1f_fix_constr_tag(arg, 0); RET2RVAL(ret, rvalue); /* Import COMPONENTS OF stuff */ @@ -308,6 +318,8 @@ asn1f_resolve_constraints(arg_t *arg) { etype = top_parent->expr_type; else etype = A1TC_INVALID; + DEBUG("asn1f_resolve_constraints(%s)", arg->expr->Identifier); + ret = asn1constraint_resolve(arg, arg->expr->module, arg->expr->constraints, etype, 0); RET2RVAL(ret, rvalue); @@ -326,6 +338,10 @@ asn1f_check_constraints(arg_t *arg) { int rvalue = 0; int ret; + DEBUG("asn1f_check_constraints(%s{%d/%d})", + arg->expr->Identifier, + arg->expr->meta_type, arg->expr->expr_type); + top_parent = asn1f_find_terminal_type(arg, arg->expr); if(!top_parent) return 0; @@ -339,8 +355,13 @@ asn1f_check_constraints(arg_t *arg) { etype, arg->expr->combined_constraints, test_types[i], 0, 0, 0); - if(!range && errno == EPERM) + if(!range && errno == EPERM) { + FATAL("This error happened for %s (%d) at line %d", + arg->expr->Identifier, + arg->expr->meta_type, + arg->expr->_lineno); return -1; + } asn1constraint_range_free(range); } diff --git a/libasn1fix/asn1fix_constr.c b/libasn1fix/asn1fix_constr.c index fab78d377..8c9dd3833 100644 --- a/libasn1fix/asn1fix_constr.c +++ b/libasn1fix/asn1fix_constr.c @@ -1,7 +1,10 @@ #include "asn1fix_internal.h" +#define AFT_IMAGINARY_ANY 1 /* _fetch_tag() flag */ + static int _asn1f_check_if_tag_must_be_explicit(arg_t *arg, asn1p_expr_t *v); static int _asn1f_compare_tags(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b); +static int _asn1f_fix_type_tag(arg_t *arg, asn1p_expr_t *expr); int asn1f_pull_components_of(arg_t *arg) { @@ -77,6 +80,9 @@ asn1f_pull_components_of(arg_t *arg) { return r_value; } +/* + * Fix extensibility parts inside constructed types (SEQUENCE, SET, CHOICE). + */ int asn1f_fix_constr_ext(arg_t *arg) { asn1p_expr_t *expr = arg->expr; @@ -103,6 +109,10 @@ asn1f_fix_constr_ext(arg_t *arg) { TQ_INIT(&ext_list); cur_list = (void *)&root_list; + /* + * Split the set of fields into two lists, the root list + * and the extensions list. + */ while((v = TQ_REMOVE(&(expr->members), next))) { if(v->expr_type == A1TC_EXTENSIBLE) { ext_count++; @@ -161,16 +171,30 @@ asn1f_fix_constr_ext(arg_t *arg) { int -asn1f_fix_constr_tag(arg_t *arg) { +asn1f_fix_constr_tag(arg_t *arg, int fix_top_level) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *v; - int fl_impl_tags = 0; - int fl_auto_tags = 0; int root_tagged = 0; /* The root component is manually tagged */ int ext_tagged = 0; /* The extensions are manually tagged */ int component_number = 0; int r_value = 0; + DEBUG("%s(%s) for line %d", __func__, + expr->Identifier, expr->_lineno); + + /* + * Fix the top-level type itself first. + */ + if(fix_top_level) { + if(expr->tag.tag_class == TC_NOCLASS) + return r_value; + + if(_asn1f_fix_type_tag(arg, expr)) + r_value = -1; + + return r_value; + } + switch(expr->expr_type) { case ASN_CONSTR_SEQUENCE: case ASN_CONSTR_SET: @@ -180,14 +204,7 @@ asn1f_fix_constr_tag(arg_t *arg) { return 0; } - fl_impl_tags = (arg->mod->module_flags & MSF_IMPLICIT_TAGS); - fl_auto_tags = (arg->mod->module_flags & MSF_AUTOMATIC_TAGS); - - DEBUG("%s(%s) {%d, %d} for line %d", __func__, - expr->Identifier, fl_impl_tags, fl_auto_tags, expr->_lineno); - TQ_FOR(v, &(expr->members), next) { - int must_explicit = 0; if(v->expr_type == A1TC_EXTENSIBLE) { component_number++; @@ -196,43 +213,18 @@ asn1f_fix_constr_tag(arg_t *arg) { if(v->tag.tag_class == TC_NOCLASS) { continue; - } else { - switch(component_number) { - case 0: case 2: - root_tagged = 1; break; - default: - ext_tagged = 1; break; - } } - must_explicit = _asn1f_check_if_tag_must_be_explicit(arg, v); - - if(fl_impl_tags) { - if(v->tag.tag_mode != TM_EXPLICIT) { - if(must_explicit) - v->tag.tag_mode = TM_EXPLICIT; - else - v->tag.tag_mode = TM_IMPLICIT; - } - } else { - if(v->tag.tag_mode == TM_DEFAULT) { - v->tag.tag_mode = TM_EXPLICIT; - } + switch(component_number) { + case 0: case 2: + root_tagged = 1; break; + default: + ext_tagged = 1; break; } - /* - * Perform a final sanity check. - */ - if(must_explicit) { - if(v->tag.tag_mode == TM_IMPLICIT) { - FATAL("%s tagged in IMPLICIT mode " - "but must be EXPLICIT at line %d", - v->Identifier, v->_lineno); - r_value = -1; - } else { - v->tag.tag_mode = TM_EXPLICIT; - } - } + if(_asn1f_fix_type_tag(arg, v)) + r_value = -1; + } if(ext_tagged && !root_tagged) { @@ -241,13 +233,51 @@ asn1f_fix_constr_tag(arg_t *arg) { "but root components are not", expr->Identifier, expr->_lineno); r_value = -1; - } else if(!root_tagged && !ext_tagged && fl_auto_tags) { + } else if(!root_tagged && !ext_tagged + && (arg->mod->module_flags & MSF_AUTOMATIC_TAGS)) { + /* Make a decision on automatic tagging */ expr->auto_tags_OK = 1; } return r_value; } +static int +_asn1f_fix_type_tag(arg_t *arg, asn1p_expr_t *expr) { + int must_explicit = _asn1f_check_if_tag_must_be_explicit(arg, expr); + int fl_impl_tags = (arg->mod->module_flags & MSF_IMPLICIT_TAGS); + int r_value = 0; + + if(fl_impl_tags) { + if(expr->tag.tag_mode != TM_EXPLICIT) { + if(must_explicit) + expr->tag.tag_mode = TM_EXPLICIT; + else + expr->tag.tag_mode = TM_IMPLICIT; + } + } else { + if(expr->tag.tag_mode == TM_DEFAULT) { + expr->tag.tag_mode = TM_EXPLICIT; + } + } + + /* + * Perform a final sanity check. + */ + if(must_explicit) { + if(expr->tag.tag_mode == TM_IMPLICIT) { + FATAL("%s tagged in IMPLICIT mode " + "but must be EXPLICIT at line %d", + expr->Identifier, expr->_lineno); + r_value = -1; + } else { + expr->tag.tag_mode = TM_EXPLICIT; + } + } + + return r_value; +} + int asn1f_fix_constr_autotag(arg_t *arg) { asn1p_expr_t *expr = arg->expr; @@ -333,11 +363,25 @@ asn1f_check_constr_tags_distinct(arg_t *arg) { static int _asn1f_check_if_tag_must_be_explicit(arg_t *arg, asn1p_expr_t *v) { + struct asn1p_type_tag_s tag; + struct asn1p_type_tag_s save_tag; asn1p_expr_t *reft; + int ret; + + /* + * Fetch the _next_ tag for this type. + */ + save_tag = v->tag; /* Save existing tag */ + memset(&v->tag, 0, sizeof(v->tag)); /* Remove it temporarily */ + ret = asn1f_fetch_tag(arg->asn, arg->mod, v, &tag, 0); + v->tag = save_tag; /* Restore the tag back */ + + if(ret == 0) return 0; /* If found tag, it's okay */ reft = asn1f_find_terminal_type(arg, v); if(reft) { switch(reft->expr_type) { + case ASN_TYPE_ANY: case ASN_CONSTR_CHOICE: return 1; default: @@ -357,8 +401,8 @@ _asn1f_compare_tags(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b) { int ra, rb; int ret; - ra = asn1f_fetch_tag(arg->asn, arg->mod, a, &ta); - rb = asn1f_fetch_tag(arg->asn, arg->mod, b, &tb); + ra = asn1f_fetch_tag(arg->asn, arg->mod, a, &ta, AFT_IMAGINARY_ANY); + rb = asn1f_fetch_tag(arg->asn, arg->mod, b, &tb, AFT_IMAGINARY_ANY); /* * If both tags are explicitly or implicitly given, use them. @@ -367,8 +411,12 @@ _asn1f_compare_tags(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b) { /* * Simple case: fetched both tags. */ - if(ta.tag_value == tb.tag_value - && ta.tag_class == tb.tag_class) { + + if((ta.tag_value == tb.tag_value + && ta.tag_class == tb.tag_class) + || ta.tag_value == -1 /* Spread IMAGINARY ANY tag... */ + || tb.tag_value == -1 /* ...it is an evil virus, fear it! */ + ) { char *p = (a->expr_type == A1TC_EXTENSIBLE) ?"potentially ":""; FATAL("Component \"%s\" at line %d %shas the same tag " diff --git a/libasn1fix/asn1fix_constr.h b/libasn1fix/asn1fix_constr.h index 59970adf1..ffed14371 100644 --- a/libasn1fix/asn1fix_constr.h +++ b/libasn1fix/asn1fix_constr.h @@ -14,7 +14,7 @@ int asn1f_fix_constr_ext(arg_t *); /* * Fix tagging in constructed types. */ -int asn1f_fix_constr_tag(arg_t *); +int asn1f_fix_constr_tag(arg_t *, int fix_top_level); /* * Check distinctive tagging in constructed types. diff --git a/libasn1fix/asn1fix_constraint.c b/libasn1fix/asn1fix_constraint.c index 4a25faee9..3f30009ee 100644 --- a/libasn1fix/asn1fix_constraint.c +++ b/libasn1fix/asn1fix_constraint.c @@ -93,7 +93,7 @@ asn1constraint_pullup(arg_t *arg) { expr->combined_constraints = ct_parent; if(ct_expr->type == ACT_CA_SET) { - int i; + unsigned int i; for(i = 0; i < ct_expr->el_count; i++) { if(asn1p_constraint_insert( expr->combined_constraints, @@ -120,9 +120,9 @@ asn1constraint_pullup(arg_t *arg) { int asn1constraint_resolve(arg_t *arg, asn1p_module_t *mod, asn1p_constraint_t *ct, asn1p_expr_type_e etype, enum asn1p_constraint_type_e effective_type) { + unsigned int el; int rvalue = 0; int ret; - int el; if(!ct) return 0; @@ -208,7 +208,7 @@ asn1constraint_resolve(arg_t *arg, asn1p_module_t *mod, asn1p_constraint_t *ct, static void _remove_exceptions(arg_t *arg, asn1p_constraint_t *ct) { - int i; + unsigned int i; for(i = 0; i < ct->el_count; i++) { if(ct->elements[i]->type == ACT_EL_EXT) diff --git a/libasn1fix/asn1fix_crange.c b/libasn1fix/asn1fix_crange.c index 6ef8c8ac2..53d46407f 100644 --- a/libasn1fix/asn1fix_crange.c +++ b/libasn1fix/asn1fix_crange.c @@ -699,8 +699,8 @@ asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constr asn1p_value_t *vmin; asn1p_value_t *vmax; int expectation_met; + unsigned int i; int ret; - int i; if(!exmet) { exmet = &expectation_met; diff --git a/libasn1fix/asn1fix_param.c b/libasn1fix/asn1fix_param.c index c399ae421..5ce6b933b 100644 --- a/libasn1fix/asn1fix_param.c +++ b/libasn1fix/asn1fix_param.c @@ -2,7 +2,10 @@ static int asn1f_parametrize(arg_t *arg, asn1p_expr_t *ex, asn1p_expr_t *ptype); static int asn1f_param_process_recursive(arg_t *arg, asn1p_expr_t *expr, asn1p_expr_t *ptype, asn1p_expr_t *actargs); +static int asn1f_param_process_constraints(arg_t *arg, asn1p_expr_t *expr, asn1p_expr_t *ptype, asn1p_expr_t *actargs); + static asn1p_expr_t *_referenced_argument(asn1p_ref_t *ref, asn1p_expr_t *ptype, asn1p_expr_t *actargs); +static int _process_constraints(arg_t *arg, asn1p_constraint_t *ct, asn1p_expr_t *ptype, asn1p_expr_t *actargs); int asn1f_fix_parametrized_assignment(arg_t *arg) { @@ -79,6 +82,7 @@ asn1f_parametrize(arg_t *arg, asn1p_expr_t *expr, asn1p_expr_t *ptype) { * as a child of the expression, replacing all occurences of * symbols which are defined as parametrized type arguments * with the actual values. + * 3. Don't forget to parametrize the subtype constraints. */ nex = asn1p_expr_clone(ptype, 0); @@ -117,34 +121,40 @@ asn1f_param_process_recursive(arg_t *arg, asn1p_expr_t *expr, asn1p_expr_t *ptyp TQ_FOR(child, &(expr->members), next) { asn1p_expr_t *ra; - asn1p_expr_t *ne; - - ra = _referenced_argument(child->reference, ptype, actargs); - if(ra == NULL) continue; - - DEBUG("Substituting parameter for %s %s at line %d", - child->Identifier, - asn1f_printable_reference(child->reference), - child->_lineno - ); + asn1p_expr_t *ne; /* new expression (clone) */ - assert(child->meta_type == AMT_TYPEREF); - assert(child->expr_type == A1TC_REFERENCE); - - ne = asn1p_expr_clone(ra, 0); - if(ne == NULL) return -1; - assert(ne->Identifier == 0); - ne->Identifier = strdup(child->Identifier); - if(ne->Identifier == 0) { - asn1p_expr_free(ne); + if(asn1f_param_process_constraints(arg, child, ptype, actargs)) return -1; + + ra = _referenced_argument(child->reference, ptype, actargs); + if(ra) { + DEBUG("Substituting parameter for %s %s at line %d", + child->Identifier, + asn1f_printable_reference(child->reference), + child->_lineno + ); + + assert(child->meta_type == AMT_TYPEREF); + assert(child->expr_type == A1TC_REFERENCE); + + ne = asn1p_expr_clone(ra, 0); + if(ne == NULL) return -1; + assert(ne->Identifier == 0); + ne->Identifier = strdup(child->Identifier); + if(ne->Identifier == 0) { + asn1p_expr_free(ne); + return -1; + } + SUBSTITUTE(child, ne); } - SUBSTITUTE(child, ne); } return 0; } +/* + * Check that the given ref looks like an argument of a parametrized type. + */ static asn1p_expr_t * _referenced_argument(asn1p_ref_t *ref, asn1p_expr_t *ptype, asn1p_expr_t *actargs) { asn1p_expr_t *aa; @@ -163,3 +173,84 @@ _referenced_argument(asn1p_ref_t *ref, asn1p_expr_t *ptype, asn1p_expr_t *actarg return NULL; } + +/* + * Search for parameters inside constraints. + */ +static int +asn1f_param_process_constraints(arg_t *arg, asn1p_expr_t *expr, asn1p_expr_t *ptype, asn1p_expr_t *actargs) { + asn1p_constraint_t *cts; + int ret; + + if(!expr->constraints) return 0; + + cts = asn1p_constraint_clone(expr->constraints); + assert(cts); + + ret = _process_constraints(arg, cts, ptype, actargs); + if(ret == 1) { + asn1p_constraint_free(expr->constraints); + expr->constraints = cts; + ret = 0; + } else { + asn1p_constraint_free(cts); + } + + return ret; +} + +static int +_process_constraints(arg_t *arg, asn1p_constraint_t *ct, asn1p_expr_t *ptype, asn1p_expr_t *actargs) { + asn1p_value_t *values[3]; + int rvalue = 0; + size_t i; + + values[0] = ct->value; + values[1] = ct->range_start; + values[2] = ct->range_stop; + + for(i = 0; i < sizeof(values)/sizeof(values[0]); i++) { + asn1p_value_t *v = values[i]; + asn1p_expr_t *ra; + asn1p_ref_t *ref; + char *str; + + if(!v || v->type != ATV_REFERENCED) continue; + + ref = v->value.reference; + ra = _referenced_argument(ref, ptype, actargs); + if(!ra) continue; + + DEBUG("_process_constraints(%s), ra=%s", + asn1f_printable_reference(ref), ra->Identifier); + + str = strdup(ra->Identifier); + if(!str) return -1; + + assert(ref->comp_count == 1); + ref = asn1p_ref_new(ref->_lineno); + if(!ref) { free(str); return -1; } + + if(asn1p_ref_add_component(ref, str, 0)) { + free(str); + return -1; + } + + asn1p_ref_free(v->value.reference); + v->value.reference = ref; + rvalue = 1; + } + + /* Process the rest of constraints recursively */ + for(i = 0; i < ct->el_count; i++) { + int ret = _process_constraints(arg, ct->elements[i], + ptype, actargs); + if(ret == -1) + rvalue = -1; + else if(ret == 1 && rvalue != -1) + rvalue = 1; + } + + return rvalue; +} + diff --git a/libasn1fix/asn1fix_tags.c b/libasn1fix/asn1fix_tags.c index de80fad59..22ba422c8 100644 --- a/libasn1fix/asn1fix_tags.c +++ b/libasn1fix/asn1fix_tags.c @@ -1,7 +1,7 @@ #include "asn1fix_internal.h" int -asn1f_fetch_tag(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag) { +asn1f_fetch_tag(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag, int flags) { int ret; if(expr->tag.tag_class != TC_NOCLASS) { @@ -19,6 +19,11 @@ asn1f_fetch_tag(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, struct as memset(tag, 0, sizeof(*tag)); tag->tag_class = TC_UNIVERSAL; tag->tag_value = expr_type2uclass_value[expr->expr_type]; + if(flags && expr->expr_type == ASN_TYPE_ANY) { + assert(tag->tag_value == 0); + tag->tag_value = -1; + return 0; + } return (tag->tag_value == 0) ? -1 : 0; } @@ -37,7 +42,8 @@ asn1f_fetch_tag(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, struct as return -1; expr->_mark |= TM_RECURSION; - ret = asn1f_fetch_tag(asn, expr->module, expr, tag); + ret = asn1f_fetch_tag(asn, expr->module, expr, tag, + flags); expr->_mark &= ~TM_RECURSION; return ret; } diff --git a/libasn1fix/asn1fix_tags.h b/libasn1fix/asn1fix_tags.h index 9d3595b9f..429e56d7f 100644 --- a/libasn1fix/asn1fix_tags.h +++ b/libasn1fix/asn1fix_tags.h @@ -1,6 +1,6 @@ #ifndef _ASN1FIX_TAGS_H_ #define _ASN1FIX_TAGS_H_ -int asn1f_fetch_tag(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag); +int asn1f_fetch_tag(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag, int special_ANY_handling); #endif /* _ASN1FIX_TAGS_H_ */ From ff3a677824f3fa3bec0f6c2eac1f74173d72175f Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 5 Sep 2004 10:37:18 +0000 Subject: [PATCH 0247/1469] support for constraints git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@247 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/19-param-OK.asn1 | 2 +- tests/19-param-OK.asn1.-EF | 6 +++--- tests/19-param-OK.asn1.-P | 42 ++++++++++++++++++++++++++++++++++---- 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/tests/19-param-OK.asn1 b/tests/19-param-OK.asn1 index cd132d22d..31fa7721c 100644 --- a/tests/19-param-OK.asn1 +++ b/tests/19-param-OK.asn1 @@ -14,7 +14,7 @@ BEGIN SIGNED { ToBeSigned } ::= SEQUENCE { toBeSigned ToBeSigned, algorithm OBJECT IDENTIFIER, - signature BIT STRING + signature BIT STRING SIZE(0..256) } Certificate ::= SIGNED { SEQUENCE { diff --git a/tests/19-param-OK.asn1.-EF b/tests/19-param-OK.asn1.-EF index 8ece75cce..624041433 100644 --- a/tests/19-param-OK.asn1.-EF +++ b/tests/19-param-OK.asn1.-EF @@ -1,5 +1,5 @@ -ModuleTestParam {iso(-1) org(3) dod(6) internet(1) private(4) +ModuleTestParam {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 19 } DEFINITIONS ::= @@ -8,7 +8,7 @@ BEGIN SIGNED{ToBeSigned} ::= SEQUENCE { toBeSigned ToBeSigned, algorithm OBJECT IDENTIFIER, - signature BIT STRING + signature BIT STRING SIZE(0..256) } Certificate ::= SEQUENCE { @@ -18,7 +18,7 @@ Certificate ::= SEQUENCE { issuer Name }, algorithm OBJECT IDENTIFIER, - signature BIT STRING + signature BIT STRING SIZE(0..256) } Name ::= SEQUENCE OF RelativeDistinguishedName diff --git a/tests/19-param-OK.asn1.-P b/tests/19-param-OK.asn1.-P index c40c439cc..c69a75bfe 100644 --- a/tests/19-param-OK.asn1.-P +++ b/tests/19-param-OK.asn1.-P @@ -30,6 +30,40 @@ typedef struct Certificate { ber_dec_ctx_t _ber_dec_ctx; } Certificate_t; +/*** <<< CODE [Certificate] >>> ***/ + +static int +memb_signature_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const BIT_STRING_t *st = sptr; + size_t size; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * (st->size - 1) - (st->buf[0] & 0x7); + } else { + size = 0; + } + + if((size <= 256)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + + /*** <<< STAT-DEFS [Certificate] >>> ***/ static asn1_TYPE_member_t asn1_MBR_toBeSigned[] = { @@ -108,7 +142,7 @@ static asn1_TYPE_member_t asn1_MBR_Certificate[] = { .tag = (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_BIT_STRING, - .memb_constraints = 0, /* Defer to actual type */ + .memb_constraints = memb_signature_1_constraint, .name = "signature" }, }; @@ -116,7 +150,7 @@ static ber_tlv_tag_t asn1_DEF_Certificate_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn1_TYPE_tag2member_t asn1_DEF_Certificate_tag2el[] = { - { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 2, 0, 0 }, /* signature at 18 */ + { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 2, 0, 0 }, /* signature at 17 */ { (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)), 1, 0, 0 }, /* algorithm at 16 */ { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 }, /* toBeSigned at 21 */ }; @@ -255,7 +289,7 @@ static int check_permitted_alphabet_1(const void *sptr) { /*** <<< CODE [RelativeDistinguishedName] >>> ***/ static int -memb_IA5String_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +memb_IA5String_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const IA5String_t *st = sptr; @@ -286,7 +320,7 @@ static asn1_TYPE_member_t asn1_MBR_RelativeDistinguishedName[] = { .tag = (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_IA5String, - .memb_constraints = memb_IA5String_1_constraint, + .memb_constraints = memb_IA5String_2_constraint, .name = "" }, }; From 3d70a528c20f4ff8389d17c3c489046cf93bab83 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 5 Sep 2004 10:37:55 +0000 Subject: [PATCH 0248/1469] additional tests git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@248 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/37-indirect-choice-OK.asn1 | 6 ++++-- tests/37-indirect-choice-OK.asn1.-EF | 28 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 tests/37-indirect-choice-OK.asn1.-EF diff --git a/tests/37-indirect-choice-OK.asn1 b/tests/37-indirect-choice-OK.asn1 index b0361c464..9204c1c02 100644 --- a/tests/37-indirect-choice-OK.asn1 +++ b/tests/37-indirect-choice-OK.asn1 @@ -8,14 +8,14 @@ ModuleTestIndirectChoiceFine { iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 37 } - DEFINITIONS ::= + DEFINITIONS IMPLICIT TAGS ::= BEGIN T ::= CHOICE { t-a INTEGER, t-b OCTET STRING, t-c [1] Choice1, - t-d Choice2 + t-d [3] Choice2 } Choice1 ::= CHOICE { @@ -29,4 +29,6 @@ BEGIN c-d [3] Choice1 } + Choice3 ::= [3] EXPLICIT Choice2 -- tags [3] [2] + END diff --git a/tests/37-indirect-choice-OK.asn1.-EF b/tests/37-indirect-choice-OK.asn1.-EF new file mode 100644 index 000000000..e975dde49 --- /dev/null +++ b/tests/37-indirect-choice-OK.asn1.-EF @@ -0,0 +1,28 @@ + +ModuleTestIndirectChoiceFine {iso org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 37 } +DEFINITIONS IMPLICIT TAGS ::= +BEGIN + +T ::= CHOICE { + t-a INTEGER, + t-b OCTET STRING, + t-c [1] EXPLICIT Choice1, + t-d [3] IMPLICIT Choice2 +} + +Choice1 ::= CHOICE { + c-a OCTET STRING, + c-b INTEGER +} + +Choice2 ::= [2] EXPLICIT CHOICE { + c-a OCTET STRING, + c-b INTEGER, + c-d [3] EXPLICIT Choice1 +} + +Choice3 ::= [3] EXPLICIT Choice2 + +END From 52194fe5360056b5770bafd054d9c42261c90894 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 5 Sep 2004 10:38:21 +0000 Subject: [PATCH 0249/1469] more post-processing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@249 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/60-any-OK.asn1 | 4 ++-- tests/60-any-OK.asn1.-EF | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/60-any-OK.asn1 b/tests/60-any-OK.asn1 index ca73358c8..51723d9de 100644 --- a/tests/60-any-OK.asn1 +++ b/tests/60-any-OK.asn1 @@ -8,7 +8,7 @@ ModuleTestANY { iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 60 } - DEFINITIONS ::= + DEFINITIONS IMPLICIT TAGS ::= BEGIN T1 ::= SEQUENCE { @@ -18,7 +18,7 @@ BEGIN T2 ::= SEQUENCE { i INTEGER, - any [0] EXPLICIT ANY OPTIONAL + any [0] ANY OPTIONAL } END diff --git a/tests/60-any-OK.asn1.-EF b/tests/60-any-OK.asn1.-EF index 81dce5706..e2c89e686 100644 --- a/tests/60-any-OK.asn1.-EF +++ b/tests/60-any-OK.asn1.-EF @@ -1,8 +1,8 @@ -ModuleTestANY {iso(-1) org(3) dod(6) internet(1) private(4) +ModuleTestANY {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 60 } -DEFINITIONS ::= +DEFINITIONS IMPLICIT TAGS ::= BEGIN T1 ::= SEQUENCE { From 6cfa7b075e175b571435fc8e186343d486fbf08f Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 5 Sep 2004 10:38:36 +0000 Subject: [PATCH 0250/1469] better pretty-printing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@250 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/07-int-OK.asn1.-EF | 2 +- tests/16-constraint-OK.asn1.-EF | 2 +- tests/20-constr-OK.asn1.-EF | 2 +- tests/21-tags-OK.asn1.-EF | 4 ++-- tests/22-tags-OK.asn1.-EF | 2 +- tests/23-bits-OK.asn1.-EF | 2 +- tests/24-sequence-OK.asn1.-EF | 2 +- tests/31-set-of-OK.asn1.-EF | 2 +- tests/34-class-OK.asn1.-EF | 2 +- tests/42-real-life-OK.asn1.-EF | 2 +- ...ype-SE.asn1.-EFfknown-extern-type=KnownExt | 2 +- tests/49-real-life-OK.asn1.-E | 2 +- ...50-constraint-OK.asn1.-EFprint-constraints | Bin 5033 -> 5029 bytes tests/55-components-of-OK.asn1.-EF | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/tests/07-int-OK.asn1.-EF b/tests/07-int-OK.asn1.-EF index 90b234991..54faa1089 100644 --- a/tests/07-int-OK.asn1.-EF +++ b/tests/07-int-OK.asn1.-EF @@ -1,5 +1,5 @@ -ModuleTestInt1 {iso(-1) org(3) dod(6) internet(1) private(4) +ModuleTestInt1 {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 7 } DEFINITIONS ::= diff --git a/tests/16-constraint-OK.asn1.-EF b/tests/16-constraint-OK.asn1.-EF index a0053bbac..237fb5741 100644 --- a/tests/16-constraint-OK.asn1.-EF +++ b/tests/16-constraint-OK.asn1.-EF @@ -1,5 +1,5 @@ -ModuleTestConstraint {iso(-1) org(3) dod(6) internet(1) private(4) +ModuleTestConstraint {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 16 } DEFINITIONS ::= diff --git a/tests/20-constr-OK.asn1.-EF b/tests/20-constr-OK.asn1.-EF index bf4e39604..dbbdacaef 100644 --- a/tests/20-constr-OK.asn1.-EF +++ b/tests/20-constr-OK.asn1.-EF @@ -1,5 +1,5 @@ -ModuleTestConstr {iso(-1) org(3) dod(6) internet(1) private(4) +ModuleTestConstr {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 20 } DEFINITIONS IMPLICIT TAGS EXTENSIBILITY IMPLIED ::= diff --git a/tests/21-tags-OK.asn1.-EF b/tests/21-tags-OK.asn1.-EF index bf468d40e..a8fd93c70 100644 --- a/tests/21-tags-OK.asn1.-EF +++ b/tests/21-tags-OK.asn1.-EF @@ -1,5 +1,5 @@ -ModuleTestTags1 {iso(-1) org(3) dod(6) internet(1) private(4) +ModuleTestTags1 {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 21 1 } DEFINITIONS EXPLICIT TAGS ::= @@ -12,7 +12,7 @@ T1 ::= CHOICE { END -ModuleTestTags2 {iso(-1) org(3) dod(6) internet(1) private(4) +ModuleTestTags2 {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 21 2 } DEFINITIONS IMPLICIT TAGS ::= diff --git a/tests/22-tags-OK.asn1.-EF b/tests/22-tags-OK.asn1.-EF index 3edad655b..c6c97c99b 100644 --- a/tests/22-tags-OK.asn1.-EF +++ b/tests/22-tags-OK.asn1.-EF @@ -1,5 +1,5 @@ -ModuleTestTags3 {iso(-1) org(3) dod(6) internet(1) private(4) +ModuleTestTags3 {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 22 } DEFINITIONS AUTOMATIC TAGS ::= diff --git a/tests/23-bits-OK.asn1.-EF b/tests/23-bits-OK.asn1.-EF index a3e15a5a9..f65f3b369 100644 --- a/tests/23-bits-OK.asn1.-EF +++ b/tests/23-bits-OK.asn1.-EF @@ -1,5 +1,5 @@ -ModuleTestBitString {iso(-1) org(3) dod(6) internet(1) private(4) +ModuleTestBitString {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 23 } DEFINITIONS AUTOMATIC TAGS ::= diff --git a/tests/24-sequence-OK.asn1.-EF b/tests/24-sequence-OK.asn1.-EF index d1380d2c9..f8507c09e 100644 --- a/tests/24-sequence-OK.asn1.-EF +++ b/tests/24-sequence-OK.asn1.-EF @@ -1,5 +1,5 @@ -ModuleTestSequence {iso(-1) org(3) dod(6) internet(1) private(4) +ModuleTestSequence {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 24 } DEFINITIONS IMPLICIT TAGS ::= diff --git a/tests/31-set-of-OK.asn1.-EF b/tests/31-set-of-OK.asn1.-EF index 34d340181..46a7dfbf0 100644 --- a/tests/31-set-of-OK.asn1.-EF +++ b/tests/31-set-of-OK.asn1.-EF @@ -1,5 +1,5 @@ -ModuleTestSetOfSimple {iso(-1) org(3) dod(6) internet(1) private(4) +ModuleTestSetOfSimple {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 31 } DEFINITIONS IMPLICIT TAGS ::= diff --git a/tests/34-class-OK.asn1.-EF b/tests/34-class-OK.asn1.-EF index e9f76b592..e61b2f44d 100644 --- a/tests/34-class-OK.asn1.-EF +++ b/tests/34-class-OK.asn1.-EF @@ -1,5 +1,5 @@ -ModuleTestClassSimple {iso(-1) org(3) dod(6) internet(1) private(4) +ModuleTestClassSimple {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 34 } DEFINITIONS IMPLICIT TAGS ::= diff --git a/tests/42-real-life-OK.asn1.-EF b/tests/42-real-life-OK.asn1.-EF index 14492fa8d..c07dccf41 100644 --- a/tests/42-real-life-OK.asn1.-EF +++ b/tests/42-real-life-OK.asn1.-EF @@ -1,5 +1,5 @@ -ModuleLAPStorage {iso(-1) org(3) dod(6) internet(1) private(4) +ModuleLAPStorage {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 42 } DEFINITIONS EXTENSIBILITY IMPLIED ::= diff --git a/tests/45-undefined-type-SE.asn1.-EFfknown-extern-type=KnownExt b/tests/45-undefined-type-SE.asn1.-EFfknown-extern-type=KnownExt index 423b32b79..62dc0e373 100644 --- a/tests/45-undefined-type-SE.asn1.-EFfknown-extern-type=KnownExt +++ b/tests/45-undefined-type-SE.asn1.-EFfknown-extern-type=KnownExt @@ -1,5 +1,5 @@ -ModuleKnownExternType {iso(-1) org(3) dod(6) internet(1) private(4) +ModuleKnownExternType {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 45 } DEFINITIONS ::= diff --git a/tests/49-real-life-OK.asn1.-E b/tests/49-real-life-OK.asn1.-E index 268da5e55..7439005c7 100644 --- a/tests/49-real-life-OK.asn1.-E +++ b/tests/49-real-life-OK.asn1.-E @@ -1,5 +1,5 @@ -ModuleSetChoiceExtensibility {iso(-1) org(3) dod(6) internet(1) private(4) +ModuleSetChoiceExtensibility {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 49 } DEFINITIONS ::= diff --git a/tests/50-constraint-OK.asn1.-EFprint-constraints b/tests/50-constraint-OK.asn1.-EFprint-constraints index 2c95754874723da42aca6e55507f6112f3108c29..812ff1ba976610a41afc1c3db216bab49e743df7 100644 GIT binary patch delta 10 RcmZ3fzEpjJ(nhsrVE`7D1H1qL delta 15 WcmZ3gzEXXH5{rheq2@-VW?=v(o&;+E diff --git a/tests/55-components-of-OK.asn1.-EF b/tests/55-components-of-OK.asn1.-EF index 4d640d0a0..e6655db83 100644 --- a/tests/55-components-of-OK.asn1.-EF +++ b/tests/55-components-of-OK.asn1.-EF @@ -1,5 +1,5 @@ -ModuleTestComponentsOf {iso(-1) org(3) dod(6) internet(1) private(4) +ModuleTestComponentsOf {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 55 } DEFINITIONS AUTOMATIC TAGS ::= From dc4d95ad8b6472f1c2e6d03586bd6e3d1a678a96 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 5 Sep 2004 10:38:50 +0000 Subject: [PATCH 0251/1469] better pretty-printing; git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@251 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1print/asn1print.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index a07a894ca..e8281df66 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -100,9 +100,11 @@ asn1print_oid(asn1p_oid_t *oid, enum asn1print_flags flags) { } else if(ac) printf(" "); if(oid->arcs[ac].name) { - printf("%s(%d)", - oid->arcs[ac].name, - (int)oid->arcs[ac].number); + printf("%s", oid->arcs[ac].name); + if(oid->arcs[ac].number >= 0) { + printf("(%lld)", + (long long)oid->arcs[ac].number); + } accum += strlen(oid->arcs[ac].name); } else { printf("%d", @@ -289,7 +291,7 @@ asn1print_constraint(asn1p_constraint_t *ct, enum asn1print_flags flags) { { char *symtable[] = { " EXCEPT ", " ^ ", " | ", ",", "", "(" }; - int i; + unsigned int i; for(i = 0; i < ct->el_count; i++) { enum asn1print_flags nflags = flags; if(i) fputs(symtable[symno], stdout); @@ -562,13 +564,14 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri if(tc->meta_type == AMT_VALUE && tc->expr_type != A1TC_EXTENSIBLE) { - if(tc->expr_type == A1TC_UNIVERVAL) + if(tc->expr_type == A1TC_UNIVERVAL) { printf("("); - else - printf(" ::= "); - asn1print_value(tc->value, flags); - if(tc->expr_type == A1TC_UNIVERVAL) + asn1print_value(tc->value, flags); printf(")"); + } else { + printf(" ::= "); + asn1print_value(tc->value, flags); + } } /* From 06bcb8a1194299fdf1608d724a2c8ebe57969987 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 5 Sep 2004 10:39:05 +0000 Subject: [PATCH 0252/1469] better wording git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@252 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/crfc2asn1.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/crfc2asn1.pl b/examples/crfc2asn1.pl index 20e1f9f79..3e68c5d75 100755 --- a/examples/crfc2asn1.pl +++ b/examples/crfc2asn1.pl @@ -69,7 +69,7 @@ $found++; print "\n"; print "-- \n"; - print "-- Grammar found in $ARGV by $0 at " . $. . "\n"; + print "-- ASN.1 module found in $ARGV by $0 at " . $. . "\n"; print "-- \n"; print "\n"; } From 561141f0d7aad90322f82433e0762cbb67994434 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 5 Sep 2004 10:39:21 +0000 Subject: [PATCH 0253/1469] temporarily removing suggestion to compile PKIX1 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@253 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/README | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/README b/examples/README index 064808095..ec867b2c6 100644 --- a/examples/README +++ b/examples/README @@ -3,4 +3,3 @@ This directory contains several convertors from known text formats into the ASN.1 specifications, as well as examples of these formats and the sample convertor's output. -Try ../asn1c/asn1c -P *PKIX*93.asn1 From 36a76d6304066fec1d72ea50af44bc008cc50bbe Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 5 Sep 2004 10:40:28 +0000 Subject: [PATCH 0254/1469] unsigned git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@254 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_constr.c | 4 ++-- libasn1parser/asn1p_constr.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libasn1parser/asn1p_constr.c b/libasn1parser/asn1p_constr.c index 26f920f4d..7a38f3c14 100644 --- a/libasn1parser/asn1p_constr.c +++ b/libasn1parser/asn1p_constr.c @@ -55,7 +55,7 @@ asn1p_constraint_clone(asn1p_constraint_t *src) { clone = asn1p_constraint_new(src->_lineno); if(clone) { - int i; + unsigned int i; clone->type = src->type; clone->presence = src->presence; @@ -92,7 +92,7 @@ asn1p_constraint_insert(asn1p_constraint_t *into, asn1p_constraint_t *what) { * Make sure there's enough space to add an element. */ if(into->el_count == into->el_size) { - int newsize = into->el_size?into->el_size<<2:4; + unsigned int newsize = into->el_size?into->el_size<<2:4; void *p; p = realloc(into->elements, newsize * sizeof(into->elements[0])); diff --git a/libasn1parser/asn1p_constr.h b/libasn1parser/asn1p_constr.h index c83d58bd3..7c425b45a 100644 --- a/libasn1parser/asn1p_constr.h +++ b/libasn1parser/asn1p_constr.h @@ -53,8 +53,8 @@ typedef struct asn1p_constraint_s { * A collection of constraint elements. */ struct asn1p_constraint_s **elements; - int el_count; /* Number of meaningful elements */ - int el_size; /* Size of the allocated (elements) */ + unsigned int el_count; /* Number of meaningful elements */ + unsigned int el_size; /* Size of the allocated (elements) */ int _lineno; /* Position in a source file */ int _compile_mark; /* Marker used by the compiler */ From 39e5ed7da0d9ded44c301e8d13aa3d5b07c419cc Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 5 Sep 2004 10:40:41 +0000 Subject: [PATCH 0255/1469] better support for subtype constraints and parametrization git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@255 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_value.h | 6 +- libasn1parser/asn1p_y.c | 5376 ++++++++++++++++------------------- libasn1parser/asn1p_y.h | 350 +-- libasn1parser/asn1p_y.y | 60 +- 4 files changed, 2523 insertions(+), 3269 deletions(-) diff --git a/libasn1parser/asn1p_value.h b/libasn1parser/asn1p_value.h index c9dabfcde..087521b14 100644 --- a/libasn1parser/asn1p_value.h +++ b/libasn1parser/asn1p_value.h @@ -14,12 +14,12 @@ typedef struct asn1p_value_s { enum { ATV_NOVALUE, ATV_REFERENCED, - ATV_REAL, ATV_INTEGER, - ATV_MIN, + ATV_REAL, ATV_MAX, - ATV_FALSE, + ATV_MIN, ATV_TRUE, + ATV_FALSE, ATV_STRING, ATV_UNPARSED, ATV_BITVECTOR, diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index 520d20d76..b36871cbf 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -1,269 +1,116 @@ -/* A Bison parser, made from asn1p_y.y, by GNU bison 1.75. */ -/* Skeleton parser for Yacc-like parsing with Bison, - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. +/* A Bison parser, made from asn1p_y.y + by GNU Bison version 1.28 */ - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -/* Written by Richard Stallman by simplifying the original so called - ``semantic'' parser. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ - -/* Identify Bison output. */ -#define YYBISON 1 - -/* Pure parsers. */ -#define YYPURE 0 - -/* Using locations. */ -#define YYLSP_NEEDED 0 +#define YYBISON 1 /* Identify Bison output. */ -/* If NAME_PREFIX is specified substitute the variables and functions - names. */ #define yyparse asn1p_parse -#define yylex asn1p_lex +#define yylex asn1p_lex #define yyerror asn1p_error -#define yylval asn1p_lval -#define yychar asn1p_char +#define yylval asn1p_lval +#define yychar asn1p_char #define yydebug asn1p_debug #define yynerrs asn1p_nerrs +#define TOK_PPEQ 257 +#define TOK_opaque 258 +#define TOK_bstring 259 +#define TOK_cstring 260 +#define TOK_hstring 261 +#define TOK_identifier 262 +#define TOK_number 263 +#define TOK_number_negative 264 +#define TOK_typereference 265 +#define TOK_capitalreference 266 +#define TOK_typefieldreference 267 +#define TOK_valuefieldreference 268 +#define TOK_ABSENT 269 +#define TOK_ABSTRACT_SYNTAX 270 +#define TOK_ALL 271 +#define TOK_ANY 272 +#define TOK_APPLICATION 273 +#define TOK_AUTOMATIC 274 +#define TOK_BEGIN 275 +#define TOK_BIT 276 +#define TOK_BMPString 277 +#define TOK_BOOLEAN 278 +#define TOK_BY 279 +#define TOK_CHARACTER 280 +#define TOK_CHOICE 281 +#define TOK_CLASS 282 +#define TOK_COMPONENT 283 +#define TOK_COMPONENTS 284 +#define TOK_CONSTRAINED 285 +#define TOK_CONTAINING 286 +#define TOK_DEFAULT 287 +#define TOK_DEFINITIONS 288 +#define TOK_DEFINED 289 +#define TOK_EMBEDDED 290 +#define TOK_ENCODED 291 +#define TOK_ENCODING_CONTROL 292 +#define TOK_END 293 +#define TOK_ENUMERATED 294 +#define TOK_EXPLICIT 295 +#define TOK_EXPORTS 296 +#define TOK_EXTENSIBILITY 297 +#define TOK_EXTERNAL 298 +#define TOK_FALSE 299 +#define TOK_FROM 300 +#define TOK_GeneralizedTime 301 +#define TOK_GeneralString 302 +#define TOK_GraphicString 303 +#define TOK_IA5String 304 +#define TOK_IDENTIFIER 305 +#define TOK_IMPLICIT 306 +#define TOK_IMPLIED 307 +#define TOK_IMPORTS 308 +#define TOK_INCLUDES 309 +#define TOK_INSTANCE 310 +#define TOK_INSTRUCTIONS 311 +#define TOK_INTEGER 312 +#define TOK_ISO646String 313 +#define TOK_MAX 314 +#define TOK_MIN 315 +#define TOK_MINUS_INFINITY 316 +#define TOK_NULL 317 +#define TOK_NumericString 318 +#define TOK_OBJECT 319 +#define TOK_ObjectDescriptor 320 +#define TOK_OCTET 321 +#define TOK_OF 322 +#define TOK_OPTIONAL 323 +#define TOK_PATTERN 324 +#define TOK_PDV 325 +#define TOK_PLUS_INFINITY 326 +#define TOK_PRESENT 327 +#define TOK_PrintableString 328 +#define TOK_PRIVATE 329 +#define TOK_REAL 330 +#define TOK_RELATIVE_OID 331 +#define TOK_SEQUENCE 332 +#define TOK_SET 333 +#define TOK_SIZE 334 +#define TOK_STRING 335 +#define TOK_SYNTAX 336 +#define TOK_T61String 337 +#define TOK_TAGS 338 +#define TOK_TeletexString 339 +#define TOK_TRUE 340 +#define TOK_TYPE_IDENTIFIER 341 +#define TOK_UNIQUE 342 +#define TOK_UNIVERSAL 343 +#define TOK_UniversalString 344 +#define TOK_UTCTime 345 +#define TOK_UTF8String 346 +#define TOK_VideotexString 347 +#define TOK_VisibleString 348 +#define TOK_WITH 349 +#define TOK_EXCEPT 350 +#define TOK_INTERSECTION 351 +#define TOK_UNION 352 +#define TOK_TwoDots 353 +#define TOK_ThreeDots 354 +#define TOK_tag 355 - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - TOK_PPEQ = 258, - TOK_opaque = 259, - TOK_bstring = 260, - TOK_cstring = 261, - TOK_hstring = 262, - TOK_identifier = 263, - TOK_number = 264, - TOK_number_negative = 265, - TOK_typereference = 266, - TOK_capitalreference = 267, - TOK_typefieldreference = 268, - TOK_valuefieldreference = 269, - TOK_ABSENT = 270, - TOK_ABSTRACT_SYNTAX = 271, - TOK_ALL = 272, - TOK_ANY = 273, - TOK_APPLICATION = 274, - TOK_AUTOMATIC = 275, - TOK_BEGIN = 276, - TOK_BIT = 277, - TOK_BMPString = 278, - TOK_BOOLEAN = 279, - TOK_BY = 280, - TOK_CHARACTER = 281, - TOK_CHOICE = 282, - TOK_CLASS = 283, - TOK_COMPONENT = 284, - TOK_COMPONENTS = 285, - TOK_CONSTRAINED = 286, - TOK_CONTAINING = 287, - TOK_DEFAULT = 288, - TOK_DEFINITIONS = 289, - TOK_DEFINED = 290, - TOK_EMBEDDED = 291, - TOK_ENCODED = 292, - TOK_ENCODING_CONTROL = 293, - TOK_END = 294, - TOK_ENUMERATED = 295, - TOK_EXPLICIT = 296, - TOK_EXPORTS = 297, - TOK_EXTENSIBILITY = 298, - TOK_EXTERNAL = 299, - TOK_FALSE = 300, - TOK_FROM = 301, - TOK_GeneralizedTime = 302, - TOK_GeneralString = 303, - TOK_GraphicString = 304, - TOK_IA5String = 305, - TOK_IDENTIFIER = 306, - TOK_IMPLICIT = 307, - TOK_IMPLIED = 308, - TOK_IMPORTS = 309, - TOK_INCLUDES = 310, - TOK_INSTANCE = 311, - TOK_INSTRUCTIONS = 312, - TOK_INTEGER = 313, - TOK_ISO646String = 314, - TOK_MAX = 315, - TOK_MIN = 316, - TOK_MINUS_INFINITY = 317, - TOK_NULL = 318, - TOK_NumericString = 319, - TOK_OBJECT = 320, - TOK_ObjectDescriptor = 321, - TOK_OCTET = 322, - TOK_OF = 323, - TOK_OPTIONAL = 324, - TOK_PATTERN = 325, - TOK_PDV = 326, - TOK_PLUS_INFINITY = 327, - TOK_PRESENT = 328, - TOK_PrintableString = 329, - TOK_PRIVATE = 330, - TOK_REAL = 331, - TOK_RELATIVE_OID = 332, - TOK_SEQUENCE = 333, - TOK_SET = 334, - TOK_SIZE = 335, - TOK_STRING = 336, - TOK_SYNTAX = 337, - TOK_T61String = 338, - TOK_TAGS = 339, - TOK_TeletexString = 340, - TOK_TRUE = 341, - TOK_TYPE_IDENTIFIER = 342, - TOK_UNIQUE = 343, - TOK_UNIVERSAL = 344, - TOK_UniversalString = 345, - TOK_UTCTime = 346, - TOK_UTF8String = 347, - TOK_VideotexString = 348, - TOK_VisibleString = 349, - TOK_WITH = 350, - TOK_EXCEPT = 351, - TOK_INTERSECTION = 352, - TOK_UNION = 353, - TOK_TwoDots = 354, - TOK_ThreeDots = 355, - TOK_tag = 356 - }; -#endif -#define TOK_PPEQ 258 -#define TOK_opaque 259 -#define TOK_bstring 260 -#define TOK_cstring 261 -#define TOK_hstring 262 -#define TOK_identifier 263 -#define TOK_number 264 -#define TOK_number_negative 265 -#define TOK_typereference 266 -#define TOK_capitalreference 267 -#define TOK_typefieldreference 268 -#define TOK_valuefieldreference 269 -#define TOK_ABSENT 270 -#define TOK_ABSTRACT_SYNTAX 271 -#define TOK_ALL 272 -#define TOK_ANY 273 -#define TOK_APPLICATION 274 -#define TOK_AUTOMATIC 275 -#define TOK_BEGIN 276 -#define TOK_BIT 277 -#define TOK_BMPString 278 -#define TOK_BOOLEAN 279 -#define TOK_BY 280 -#define TOK_CHARACTER 281 -#define TOK_CHOICE 282 -#define TOK_CLASS 283 -#define TOK_COMPONENT 284 -#define TOK_COMPONENTS 285 -#define TOK_CONSTRAINED 286 -#define TOK_CONTAINING 287 -#define TOK_DEFAULT 288 -#define TOK_DEFINITIONS 289 -#define TOK_DEFINED 290 -#define TOK_EMBEDDED 291 -#define TOK_ENCODED 292 -#define TOK_ENCODING_CONTROL 293 -#define TOK_END 294 -#define TOK_ENUMERATED 295 -#define TOK_EXPLICIT 296 -#define TOK_EXPORTS 297 -#define TOK_EXTENSIBILITY 298 -#define TOK_EXTERNAL 299 -#define TOK_FALSE 300 -#define TOK_FROM 301 -#define TOK_GeneralizedTime 302 -#define TOK_GeneralString 303 -#define TOK_GraphicString 304 -#define TOK_IA5String 305 -#define TOK_IDENTIFIER 306 -#define TOK_IMPLICIT 307 -#define TOK_IMPLIED 308 -#define TOK_IMPORTS 309 -#define TOK_INCLUDES 310 -#define TOK_INSTANCE 311 -#define TOK_INSTRUCTIONS 312 -#define TOK_INTEGER 313 -#define TOK_ISO646String 314 -#define TOK_MAX 315 -#define TOK_MIN 316 -#define TOK_MINUS_INFINITY 317 -#define TOK_NULL 318 -#define TOK_NumericString 319 -#define TOK_OBJECT 320 -#define TOK_ObjectDescriptor 321 -#define TOK_OCTET 322 -#define TOK_OF 323 -#define TOK_OPTIONAL 324 -#define TOK_PATTERN 325 -#define TOK_PDV 326 -#define TOK_PLUS_INFINITY 327 -#define TOK_PRESENT 328 -#define TOK_PrintableString 329 -#define TOK_PRIVATE 330 -#define TOK_REAL 331 -#define TOK_RELATIVE_OID 332 -#define TOK_SEQUENCE 333 -#define TOK_SET 334 -#define TOK_SIZE 335 -#define TOK_STRING 336 -#define TOK_SYNTAX 337 -#define TOK_T61String 338 -#define TOK_TAGS 339 -#define TOK_TeletexString 340 -#define TOK_TRUE 341 -#define TOK_TYPE_IDENTIFIER 342 -#define TOK_UNIQUE 343 -#define TOK_UNIVERSAL 344 -#define TOK_UniversalString 345 -#define TOK_UTCTime 346 -#define TOK_UTF8String 347 -#define TOK_VideotexString 348 -#define TOK_VisibleString 349 -#define TOK_WITH 350 -#define TOK_EXCEPT 351 -#define TOK_INTERSECTION 352 -#define TOK_UNION 353 -#define TOK_TwoDots 354 -#define TOK_ThreeDots 355 -#define TOK_tag 356 - - - - -/* Copy the first part of user declarations. */ #line 1 "asn1p_y.y" @@ -315,21 +162,6 @@ static asn1p_value_t * } while(0) - -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 -#endif - -#ifndef YYSTYPE #line 58 "asn1p_y.y" typedef union { asn1p_t *a_grammar; @@ -362,1054 +194,815 @@ typedef union { char *name; struct asn1p_type_tag_s tag; } tv_nametag; -} yystype; -/* Line 193 of /usr/local/share/bison/yacc.c. */ -#line 368 "asn1p_y.c" -# define YYSTYPE yystype -# define YYSTYPE_IS_TRIVIAL 1 -#endif +} YYSTYPE; +#include -#ifndef YYLTYPE -typedef struct yyltype -{ - int first_line; - int first_column; - int last_line; - int last_column; -} yyltype; -# define YYLTYPE yyltype -# define YYLTYPE_IS_TRIVIAL 1 +#ifndef __cplusplus +#ifndef __STDC__ +#define const #endif - -/* Copy the second part of user declarations. */ - - -/* Line 213 of /usr/local/share/bison/yacc.c. */ -#line 389 "asn1p_y.c" - -#if ! defined (yyoverflow) || YYERROR_VERBOSE - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# if YYSTACK_USE_ALLOCA -# define YYSTACK_ALLOC alloca -# else -# ifndef YYSTACK_USE_ALLOCA -# if defined (alloca) || defined (_ALLOCA_H) -# define YYSTACK_ALLOC alloca -# else -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) -# else -# if defined (__STDC__) || defined (__cplusplus) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# endif -# define YYSTACK_ALLOC malloc -# define YYSTACK_FREE free -# endif -#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ - - -#if (! defined (yyoverflow) \ - && (! defined (__cplusplus) \ - || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) - -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - short yyss; - YYSTYPE yyvs; - }; - -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1) - -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -# define YYSTACK_BYTES(N) \ - ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ - + YYSTACK_GAP_MAX) - -/* Copy COUNT objects from FROM to TO. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if 1 < __GNUC__ -# define YYCOPY(To, From, Count) \ - __builtin_memcpy (To, From, (Count) * sizeof (*(From))) -# else -# define YYCOPY(To, From, Count) \ - do \ - { \ - register YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (To)[yyi] = (From)[yyi]; \ - } \ - while (0) -# endif -# endif - -/* Relocate STACK from its old location to the new one. The - local variables YYSIZE and YYSTACKSIZE give the old and new number of - elements in the stack, and YYPTR gives the new location of the - stack. Advance YYPTR to a properly aligned location for the next - stack. */ -# define YYSTACK_RELOCATE(Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack, Stack, yysize); \ - Stack = &yyptr->Stack; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (0) - #endif -#if defined (__STDC__) || defined (__cplusplus) - typedef signed char yysigned_char; -#else - typedef short yysigned_char; -#endif -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 7 -#define YYLAST 819 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 115 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 98 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 252 -/* YYNRULES -- Number of states. */ -#define YYNSTATES 391 - -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -#define YYUNDEFTOK 2 -#define YYMAXUTOK 356 - -#define YYTRANSLATE(X) \ - ((unsigned)(X) <= YYMAXUTOK ? yytranslate[X] : YYUNDEFTOK) - -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ -static const unsigned char yytranslate[] = -{ - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 111, 2, 2, 2, 2, 2, 2, - 106, 107, 2, 2, 109, 2, 112, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 110, 108, - 113, 2, 2, 2, 114, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 97, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 104, 99, 105, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 98, 100, 101, 102, 103 -}; -#if YYDEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const unsigned short yyprhs[] = -{ - 0, 0, 3, 5, 7, 10, 19, 20, 22, 26, - 29, 31, 34, 36, 41, 43, 44, 46, 48, 51, - 54, 57, 60, 63, 66, 67, 69, 71, 74, 76, - 78, 80, 82, 84, 85, 89, 91, 95, 98, 100, - 103, 108, 110, 114, 116, 118, 122, 126, 129, 131, - 135, 137, 139, 146, 148, 150, 151, 153, 158, 163, - 167, 174, 176, 180, 182, 186, 190, 192, 196, 198, - 200, 202, 206, 210, 214, 216, 218, 222, 225, 227, - 233, 234, 236, 238, 242, 245, 250, 255, 256, 258, - 259, 266, 268, 271, 273, 275, 277, 281, 285, 288, - 290, 292, 297, 302, 307, 312, 317, 319, 324, 329, - 331, 335, 337, 341, 345, 347, 351, 353, 357, 359, - 361, 363, 365, 370, 371, 375, 377, 379, 381, 383, - 385, 387, 391, 393, 396, 398, 400, 402, 404, 407, - 410, 412, 414, 417, 420, 422, 424, 426, 428, 431, - 433, 436, 438, 440, 442, 444, 446, 448, 450, 452, - 454, 456, 458, 460, 462, 464, 466, 468, 470, 472, - 474, 475, 477, 479, 484, 488, 493, 495, 499, 505, - 507, 511, 515, 519, 524, 528, 530, 534, 538, 542, - 546, 548, 550, 552, 555, 558, 562, 564, 566, 568, - 570, 572, 574, 576, 582, 584, 588, 590, 594, 595, - 597, 599, 601, 603, 605, 607, 611, 616, 618, 622, - 625, 629, 631, 635, 636, 638, 640, 643, 645, 647, - 648, 652, 655, 659, 661, 665, 667, 672, 677, 679, - 681, 683, 685, 686, 688, 690, 693, 696, 698, 700, - 702, 704, 706 +#define YYFINAL 396 +#define YYFLAG -32768 +#define YYNTBASE 115 + +#define YYTRANSLATE(x) ((unsigned)(x) <= 355 ? yytranslate[x] : 214) + +static const char yytranslate[] = { 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 111, 2, 2, 2, 2, 2, 2, 106, + 107, 2, 2, 109, 2, 112, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 110, 108, 113, + 2, 2, 2, 114, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 97, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 104, 99, 105, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 98, 100, 101, 102, 103 }; -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const short yyrhs[] = -{ - 116, 0, -1, 117, -1, 118, -1, 117, 118, -1, - 209, 119, 34, 123, 3, 21, 126, 39, -1, -1, - 120, -1, 104, 121, 105, -1, 104, 105, -1, 122, - -1, 121, 122, -1, 211, -1, 211, 106, 9, 107, - -1, 9, -1, -1, 124, -1, 125, -1, 124, 125, - -1, 41, 84, -1, 52, 84, -1, 20, 84, -1, - 43, 53, -1, 12, 57, -1, -1, 127, -1, 128, - -1, 127, 128, -1, 130, -1, 135, -1, 141, -1, - 167, -1, 138, -1, -1, 38, 12, 129, -1, 175, - -1, 54, 131, 108, -1, 54, 46, -1, 132, -1, - 131, 132, -1, 133, 46, 209, 119, -1, 134, -1, - 133, 109, 134, -1, 209, -1, 211, -1, 42, 136, - 108, -1, 42, 17, 108, -1, 42, 108, -1, 137, - -1, 136, 109, 137, -1, 209, -1, 211, -1, 209, - 139, 3, 104, 140, 105, -1, 162, -1, 172, -1, - -1, 182, -1, 209, 3, 207, 87, -1, 209, 3, - 207, 160, -1, 209, 3, 150, -1, 209, 104, 142, - 105, 3, 160, -1, 143, -1, 142, 109, 143, -1, - 209, -1, 209, 110, 211, -1, 172, 110, 211, -1, - 145, -1, 144, 109, 145, -1, 160, -1, 211, -1, - 147, -1, 146, 109, 147, -1, 212, 160, 199, -1, - 30, 68, 160, -1, 159, -1, 149, -1, 148, 109, - 149, -1, 212, 160, -1, 159, -1, 28, 104, 152, - 105, 154, -1, -1, 88, -1, 153, -1, 152, 109, - 153, -1, 165, 199, -1, 165, 160, 199, 151, -1, - 165, 165, 199, 151, -1, -1, 155, -1, -1, 95, - 82, 104, 156, 157, 105, -1, 158, -1, 157, 158, - -1, 4, -1, 165, -1, 102, -1, 102, 111, 170, - -1, 102, 111, 206, -1, 161, 179, -1, 174, -1, - 175, -1, 27, 104, 148, 105, -1, 78, 104, 146, - 105, -1, 79, 104, 146, 105, -1, 78, 179, 68, - 161, -1, 79, 179, 68, 161, -1, 18, -1, 18, - 35, 25, 211, -1, 209, 104, 144, 105, -1, 162, - -1, 56, 68, 162, -1, 11, -1, 11, 112, 209, - -1, 11, 112, 211, -1, 210, -1, 210, 112, 163, - -1, 164, -1, 163, 112, 164, -1, 166, -1, 166, - -1, 13, -1, 14, -1, 211, 139, 3, 168, -1, - -1, 104, 169, 171, -1, 5, -1, 7, -1, 6, - -1, 206, -1, 170, -1, 211, -1, 209, 112, 211, - -1, 4, -1, 171, 4, -1, 24, -1, 63, -1, - 76, -1, 173, -1, 67, 81, -1, 65, 51, -1, - 77, -1, 44, -1, 36, 71, -1, 26, 81, -1, - 91, -1, 47, -1, 58, -1, 40, -1, 22, 81, - -1, 172, -1, 173, 203, -1, 23, -1, 48, -1, - 49, -1, 50, -1, 59, -1, 64, -1, 74, -1, - 83, -1, 85, -1, 90, -1, 92, -1, 93, -1, - 94, -1, 66, -1, 99, -1, 100, -1, 97, -1, - 98, -1, 96, -1, -1, 180, -1, 181, -1, 80, - 106, 182, 107, -1, 106, 182, 107, -1, 181, 106, - 182, 107, -1, 183, -1, 183, 109, 102, -1, 183, - 109, 102, 109, 183, -1, 184, -1, 183, 176, 184, - -1, 183, 177, 184, -1, 184, 178, 184, -1, 186, - 106, 182, 107, -1, 106, 182, 107, -1, 187, -1, - 187, 185, 187, -1, 61, 185, 187, -1, 187, 185, - 60, -1, 61, 185, 60, -1, 193, -1, 188, -1, - 101, -1, 101, 113, -1, 113, 101, -1, 113, 101, - 113, -1, 80, -1, 46, -1, 206, -1, 211, -1, - 6, -1, 45, -1, 86, -1, 95, 30, 104, 189, - 105, -1, 190, -1, 189, 109, 190, -1, 102, -1, - 211, 179, 191, -1, -1, 192, -1, 73, -1, 15, - -1, 69, -1, 194, -1, 195, -1, 104, 209, 105, - -1, 194, 104, 196, 105, -1, 197, -1, 196, 109, - 197, -1, 114, 198, -1, 114, 112, 198, -1, 211, - -1, 198, 112, 211, -1, -1, 200, -1, 69, -1, - 33, 201, -1, 187, -1, 172, -1, -1, 104, 202, - 171, -1, 104, 105, -1, 104, 204, 105, -1, 205, - -1, 204, 109, 205, -1, 211, -1, 211, 106, 206, - 107, -1, 211, 106, 170, 107, -1, 206, -1, 102, - -1, 9, -1, 10, -1, -1, 208, -1, 103, -1, - 103, 52, -1, 103, 41, -1, 11, -1, 12, -1, - 12, -1, 8, -1, 211, -1, 211, 208, -1 +#if YYDEBUG != 0 +static const short yyprhs[] = { 0, + 0, 2, 4, 7, 16, 17, 19, 23, 26, 28, + 31, 33, 38, 40, 41, 43, 45, 48, 51, 54, + 57, 60, 63, 64, 66, 68, 71, 73, 75, 77, + 79, 81, 82, 86, 88, 92, 95, 97, 100, 105, + 107, 111, 113, 115, 119, 123, 126, 128, 132, 134, + 136, 143, 145, 147, 148, 150, 152, 156, 158, 160, + 165, 170, 174, 181, 183, 187, 189, 193, 197, 199, + 203, 205, 207, 209, 213, 217, 221, 223, 225, 229, + 232, 234, 240, 241, 243, 245, 249, 252, 257, 262, + 263, 265, 266, 273, 275, 278, 280, 282, 284, 288, + 292, 295, 297, 299, 304, 309, 314, 319, 324, 326, + 331, 336, 338, 342, 344, 348, 352, 354, 358, 360, + 364, 366, 368, 370, 372, 377, 378, 382, 384, 386, + 388, 390, 392, 394, 398, 400, 403, 405, 407, 409, + 411, 414, 417, 419, 421, 424, 427, 429, 431, 433, + 435, 438, 440, 443, 445, 447, 449, 451, 453, 455, + 457, 459, 461, 463, 465, 467, 469, 471, 473, 475, + 477, 479, 481, 482, 484, 486, 491, 495, 500, 502, + 506, 512, 514, 518, 522, 526, 531, 535, 537, 541, + 545, 549, 553, 555, 557, 559, 562, 565, 569, 571, + 573, 575, 577, 579, 581, 583, 589, 591, 595, 597, + 601, 602, 604, 606, 608, 610, 612, 614, 618, 623, + 625, 629, 632, 636, 638, 642, 643, 645, 647, 650, + 652, 654, 655, 659, 662, 666, 668, 672, 674, 679, + 684, 686, 688, 690, 692, 693, 695, 697, 700, 703, + 705, 707, 709, 711, 713 }; -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const unsigned short yyrline[] = -{ - 0, 298, 298, 304, 310, 326, 351, 353, 356, 360, - 365, 372, 380, 385, 389, 398, 400, 408, 412, 420, - 424, 427, 430, 434, 454, 456, 464, 468, 500, 504, - 513, 520, 533, 541, 540, 554, 567, 574, 579, 585, - 591, 600, 606, 612, 619, 627, 631, 634, 641, 647, - 653, 660, 669, 679, 687, 695, 697, 709, 721, 728, - 744, 753, 763, 773, 778, 785, 795, 801, 807, 811, - 823, 829, 835, 843, 850, 855, 861, 867, 874, 879, - 889, 891, 894, 902, 908, 917, 923, 940, 942, 949, - 947, 956, 961, 967, 971, 982, 991, 1000, 1011, 1032, - 1036, 1042, 1048, 1054, 1060, 1068, 1076, 1082, 1096, 1120, - 1127, 1141, 1150, 1160, 1170, 1178, 1199, 1208, 1217, 1218, - 1220, 1227, 1239, 1250, 1249, 1256, 1260, 1264, 1268, 1271, - 1276, 1288, 1304, 1315, 1329, 1331, 1332, 1333, 1334, 1335, - 1336, 1337, 1338, 1339, 1340, 1341, 1347, 1349, 1350, 1353, - 1360, 1372, 1374, 1378, 1382, 1383, 1384, 1385, 1386, 1390, - 1391, 1392, 1393, 1397, 1398, 1405, 1405, 1406, 1406, 1407, - 1409, 1411, 1416, 1420, 1429, 1433, 1438, 1442, 1448, 1458, - 1462, 1465, 1468, 1473, 1482, 1490, 1496, 1503, 1511, 1519, - 1528, 1531, 1536, 1538, 1539, 1540, 1543, 1547, 1552, 1556, - 1567, 1572, 1577, 1584, 1590, 1594, 1599, 1605, 1617, 1619, - 1622, 1626, 1629, 1634, 1638, 1646, 1661, 1667, 1674, 1687, - 1699, 1714, 1718, 1735, 1737, 1740, 1744, 1750, 1753, 1755, - 1755, 1775, 1780, 1785, 1791, 1797, 1805, 1813, 1821, 1828, - 1838, 1843, 1873, 1875, 1878, 1883, 1887, 1893, 1898, 1905, - 1912, 1919, 1924 +static const short yyrhs[] = { 116, + 0, 117, 0, 116, 117, 0, 210, 118, 34, 122, + 3, 21, 125, 39, 0, 0, 119, 0, 104, 120, + 105, 0, 104, 105, 0, 121, 0, 120, 121, 0, + 212, 0, 212, 106, 9, 107, 0, 9, 0, 0, + 123, 0, 124, 0, 123, 124, 0, 41, 84, 0, + 52, 84, 0, 20, 84, 0, 43, 53, 0, 12, + 57, 0, 0, 126, 0, 127, 0, 126, 127, 0, + 129, 0, 134, 0, 142, 0, 168, 0, 137, 0, + 0, 38, 12, 128, 0, 176, 0, 54, 130, 108, + 0, 54, 46, 0, 131, 0, 130, 131, 0, 132, + 46, 210, 118, 0, 133, 0, 132, 109, 133, 0, + 210, 0, 212, 0, 42, 135, 108, 0, 42, 17, + 108, 0, 42, 108, 0, 136, 0, 135, 109, 136, + 0, 210, 0, 212, 0, 210, 138, 3, 104, 139, + 105, 0, 163, 0, 173, 0, 0, 140, 0, 141, + 0, 140, 109, 141, 0, 102, 0, 184, 0, 210, + 3, 208, 87, 0, 210, 3, 208, 161, 0, 210, + 3, 151, 0, 210, 104, 143, 105, 3, 161, 0, + 144, 0, 143, 109, 144, 0, 210, 0, 210, 110, + 212, 0, 173, 110, 212, 0, 146, 0, 145, 109, + 146, 0, 161, 0, 212, 0, 148, 0, 147, 109, + 148, 0, 213, 161, 200, 0, 30, 68, 161, 0, + 160, 0, 150, 0, 149, 109, 150, 0, 213, 161, + 0, 160, 0, 28, 104, 153, 105, 155, 0, 0, + 88, 0, 154, 0, 153, 109, 154, 0, 166, 200, + 0, 166, 161, 200, 152, 0, 166, 166, 200, 152, + 0, 0, 156, 0, 0, 95, 82, 104, 157, 158, + 105, 0, 159, 0, 158, 159, 0, 4, 0, 166, + 0, 102, 0, 102, 111, 171, 0, 102, 111, 207, + 0, 162, 180, 0, 175, 0, 176, 0, 27, 104, + 149, 105, 0, 78, 104, 147, 105, 0, 79, 104, + 147, 105, 0, 78, 180, 68, 162, 0, 79, 180, + 68, 162, 0, 18, 0, 18, 35, 25, 212, 0, + 210, 104, 145, 105, 0, 163, 0, 56, 68, 163, + 0, 11, 0, 11, 112, 210, 0, 11, 112, 212, + 0, 211, 0, 211, 112, 164, 0, 165, 0, 164, + 112, 165, 0, 167, 0, 167, 0, 13, 0, 14, + 0, 212, 138, 3, 169, 0, 0, 104, 170, 172, + 0, 5, 0, 7, 0, 6, 0, 207, 0, 171, + 0, 212, 0, 210, 112, 212, 0, 4, 0, 172, + 4, 0, 24, 0, 63, 0, 76, 0, 174, 0, + 67, 81, 0, 65, 51, 0, 77, 0, 44, 0, + 36, 71, 0, 26, 81, 0, 91, 0, 47, 0, + 58, 0, 40, 0, 22, 81, 0, 173, 0, 174, + 204, 0, 23, 0, 48, 0, 49, 0, 50, 0, + 59, 0, 64, 0, 74, 0, 83, 0, 85, 0, + 90, 0, 92, 0, 93, 0, 94, 0, 66, 0, + 99, 0, 100, 0, 97, 0, 98, 0, 96, 0, + 0, 181, 0, 182, 0, 80, 106, 183, 107, 0, + 106, 183, 107, 0, 182, 106, 183, 107, 0, 184, + 0, 184, 109, 102, 0, 184, 109, 102, 109, 184, + 0, 185, 0, 184, 177, 185, 0, 184, 178, 185, + 0, 185, 179, 185, 0, 187, 106, 183, 107, 0, + 106, 183, 107, 0, 188, 0, 188, 186, 188, 0, + 61, 186, 188, 0, 188, 186, 60, 0, 61, 186, + 60, 0, 194, 0, 189, 0, 101, 0, 101, 113, + 0, 113, 101, 0, 113, 101, 113, 0, 80, 0, + 46, 0, 207, 0, 212, 0, 6, 0, 45, 0, + 86, 0, 95, 30, 104, 190, 105, 0, 191, 0, + 190, 109, 191, 0, 102, 0, 212, 180, 192, 0, + 0, 193, 0, 73, 0, 15, 0, 69, 0, 195, + 0, 196, 0, 104, 210, 105, 0, 195, 104, 197, + 105, 0, 198, 0, 197, 109, 198, 0, 114, 199, + 0, 114, 112, 199, 0, 212, 0, 199, 112, 212, + 0, 0, 201, 0, 69, 0, 33, 202, 0, 188, + 0, 173, 0, 0, 104, 203, 172, 0, 104, 105, + 0, 104, 205, 105, 0, 206, 0, 205, 109, 206, + 0, 212, 0, 212, 106, 207, 107, 0, 212, 106, + 171, 107, 0, 207, 0, 102, 0, 9, 0, 10, + 0, 0, 209, 0, 103, 0, 103, 52, 0, 103, + 41, 0, 11, 0, 12, 0, 12, 0, 8, 0, + 212, 0, 212, 209, 0 }; + #endif -#if YYDEBUG || YYERROR_VERBOSE -/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[] = -{ - "$end", "error", "$undefined", "TOK_PPEQ", "TOK_opaque", "TOK_bstring", - "TOK_cstring", "TOK_hstring", "TOK_identifier", "TOK_number", - "TOK_number_negative", "TOK_typereference", "TOK_capitalreference", - "TOK_typefieldreference", "TOK_valuefieldreference", "TOK_ABSENT", - "TOK_ABSTRACT_SYNTAX", "TOK_ALL", "TOK_ANY", "TOK_APPLICATION", - "TOK_AUTOMATIC", "TOK_BEGIN", "TOK_BIT", "TOK_BMPString", "TOK_BOOLEAN", - "TOK_BY", "TOK_CHARACTER", "TOK_CHOICE", "TOK_CLASS", "TOK_COMPONENT", - "TOK_COMPONENTS", "TOK_CONSTRAINED", "TOK_CONTAINING", "TOK_DEFAULT", - "TOK_DEFINITIONS", "TOK_DEFINED", "TOK_EMBEDDED", "TOK_ENCODED", - "TOK_ENCODING_CONTROL", "TOK_END", "TOK_ENUMERATED", "TOK_EXPLICIT", - "TOK_EXPORTS", "TOK_EXTENSIBILITY", "TOK_EXTERNAL", "TOK_FALSE", - "TOK_FROM", "TOK_GeneralizedTime", "TOK_GeneralString", - "TOK_GraphicString", "TOK_IA5String", "TOK_IDENTIFIER", "TOK_IMPLICIT", - "TOK_IMPLIED", "TOK_IMPORTS", "TOK_INCLUDES", "TOK_INSTANCE", - "TOK_INSTRUCTIONS", "TOK_INTEGER", "TOK_ISO646String", "TOK_MAX", - "TOK_MIN", "TOK_MINUS_INFINITY", "TOK_NULL", "TOK_NumericString", - "TOK_OBJECT", "TOK_ObjectDescriptor", "TOK_OCTET", "TOK_OF", - "TOK_OPTIONAL", "TOK_PATTERN", "TOK_PDV", "TOK_PLUS_INFINITY", - "TOK_PRESENT", "TOK_PrintableString", "TOK_PRIVATE", "TOK_REAL", - "TOK_RELATIVE_OID", "TOK_SEQUENCE", "TOK_SET", "TOK_SIZE", "TOK_STRING", - "TOK_SYNTAX", "TOK_T61String", "TOK_TAGS", "TOK_TeletexString", - "TOK_TRUE", "TOK_TYPE_IDENTIFIER", "TOK_UNIQUE", "TOK_UNIVERSAL", - "TOK_UniversalString", "TOK_UTCTime", "TOK_UTF8String", - "TOK_VideotexString", "TOK_VisibleString", "TOK_WITH", "TOK_EXCEPT", - "'^'", "TOK_INTERSECTION", "'|'", "TOK_UNION", "TOK_TwoDots", - "TOK_ThreeDots", "TOK_tag", "'{'", "'}'", "'('", "')'", "';'", "','", - "':'", "'!'", "'.'", "'<'", "'@'", "$accept", "ParsedGrammar", - "ModuleList", "ModuleSpecification", "optObjectIdentifier", - "ObjectIdentifier", "ObjectIdentifierBody", "ObjectIdentifierElement", - "optModuleSpecificationFlags", "ModuleSpecificationFlags", - "ModuleSpecificationFlag", "optModuleSpecificationBody", - "ModuleSpecificationBody", "ModuleSpecificationElement", "@1", - "ImportsDefinition", "ImportsBundleSet", "ImportsBundle", "ImportsList", - "ImportsElement", "ExportsDefinition", "ExportsBody", "ExportsElement", - "ValueSetDefinition", "DefinedTypeRef", "optValueSetBody", - "DataTypeReference", "ParameterArgumentList", "ParameterArgumentName", - "ActualParameterList", "ActualParameter", "ComponentTypeLists", - "ComponentType", "AlternativeTypeLists", "AlternativeType", - "ClassDeclaration", "optUnique", "ClassFieldList", "ClassField", - "optWithSyntax", "WithSyntax", "@2", "WithSyntaxFormat", - "WithSyntaxFormatToken", "ExtensionAndException", "Type", - "TypeDeclaration", "ComplexTypeReference", - "ComplexTypeReferenceAmpList", "ComplexTypeReferenceElement", - "ClassFieldIdentifier", "ClassFieldName", "ValueDefinition", - "InlineOrDefinedValue", "@3", "DefinedValue", "Opaque", "BasicTypeId", - "BasicTypeId_UniverationCompatible", "BasicType", "BasicString", - "Union", "Intersection", "Except", "optConstraints", "Constraints", - "SetOfConstraints", "ElementSetSpecs", "ElementSetSpec", - "ConstraintSubtypeElement", "ConstraintRangeSpec", "ConstraintSpec", - "ConstraintValue", "WithComponents", "WithComponentsList", - "WithComponentsElement", "optPresenceConstraint", "PresenceConstraint", - "TableConstraint", "SimpleTableConstraint", - "ComponentRelationConstraint", "AtNotationList", "AtNotationElement", - "ComponentIdList", "optMarker", "Marker", "DefaultValue", "@4", - "UniverationDefinition", "UniverationList", "UniverationElement", - "SignedNumber", "optTag", "Tag", "TypeRefName", "ObjectClassReference", - "Identifier", "TaggedIdentifier", 0 +#if YYDEBUG != 0 +static const short yyrline[] = { 0, + 300, 306, 312, 328, 353, 355, 358, 362, 367, 374, + 382, 387, 391, 400, 402, 410, 414, 422, 426, 429, + 432, 436, 456, 458, 466, 470, 502, 506, 515, 522, + 535, 542, 544, 556, 569, 576, 581, 587, 593, 602, + 608, 614, 621, 629, 633, 636, 643, 649, 655, 662, + 671, 681, 689, 697, 699, 709, 712, 716, 719, 731, + 743, 750, 766, 775, 785, 795, 800, 807, 817, 823, + 829, 833, 845, 851, 857, 865, 872, 877, 883, 889, + 896, 901, 911, 913, 916, 924, 930, 939, 945, 962, + 964, 969, 973, 978, 983, 989, 993, 1004, 1013, 1022, + 1033, 1054, 1058, 1064, 1070, 1076, 1082, 1090, 1098, 1104, + 1118, 1142, 1149, 1163, 1172, 1182, 1192, 1200, 1221, 1230, + 1239, 1240, 1242, 1249, 1261, 1271, 1273, 1278, 1282, 1286, + 1290, 1293, 1298, 1310, 1326, 1337, 1351, 1353, 1354, 1355, + 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1369, 1371, + 1372, 1375, 1382, 1394, 1396, 1400, 1404, 1405, 1406, 1407, + 1408, 1412, 1413, 1414, 1415, 1419, 1420, 1427, 1427, 1428, + 1428, 1429, 1431, 1433, 1438, 1442, 1451, 1455, 1460, 1464, + 1470, 1480, 1484, 1487, 1490, 1495, 1504, 1512, 1518, 1525, + 1533, 1541, 1550, 1553, 1558, 1560, 1561, 1562, 1565, 1569, + 1574, 1578, 1589, 1594, 1599, 1606, 1612, 1616, 1621, 1627, + 1639, 1641, 1644, 1648, 1651, 1656, 1660, 1668, 1683, 1689, + 1696, 1709, 1721, 1736, 1740, 1757, 1759, 1762, 1766, 1772, + 1775, 1777, 1777, 1797, 1802, 1807, 1813, 1819, 1827, 1835, + 1843, 1850, 1860, 1865, 1895, 1897, 1900, 1905, 1909, 1915, + 1920, 1927, 1934, 1941, 1946 }; #endif -# ifdef YYPRINT -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to - token YYLEX-NUM. */ -static const unsigned short yytoknum[] = -{ - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 94, 352, 124, - 353, 354, 355, 356, 123, 125, 40, 41, 59, 44, - 58, 33, 46, 60, 64 -}; -# endif - -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const unsigned char yyr1[] = -{ - 0, 115, 116, 117, 117, 118, 119, 119, 120, 120, - 121, 121, 122, 122, 122, 123, 123, 124, 124, 125, - 125, 125, 125, 125, 126, 126, 127, 127, 128, 128, - 128, 128, 128, 129, 128, 128, 130, 130, 131, 131, - 132, 133, 133, 134, 134, 135, 135, 135, 136, 136, - 137, 137, 138, 139, 139, 140, 140, 141, 141, 141, - 141, 142, 142, 143, 143, 143, 144, 144, 145, 145, - 146, 146, 147, 147, 147, 148, 148, 149, 149, 150, - 151, 151, 152, 152, 153, 153, 153, 154, 154, 156, - 155, 157, 157, 158, 158, 159, 159, 159, 160, 161, - 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, - 161, 162, 162, 162, 162, 162, 163, 163, 164, 165, - 166, 166, 167, 169, 168, 168, 168, 168, 168, 168, - 170, 170, 171, 171, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 173, 173, 173, 174, - 174, 175, 175, 175, 175, 175, 175, 175, 175, 175, - 175, 175, 175, 175, 175, 176, 176, 177, 177, 178, - 179, 179, 180, 180, 181, 181, 182, 182, 182, 183, - 183, 183, 183, 184, 184, 184, 184, 184, 184, 184, - 184, 184, 185, 185, 185, 185, 186, 186, 187, 187, - 187, 187, 187, 188, 189, 189, 190, 190, 191, 191, - 192, 192, 192, 193, 193, 194, 195, 196, 196, 197, - 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, - 201, 203, 203, 204, 204, 205, 205, 205, 205, 205, - 206, 206, 207, 207, 208, 208, 208, 209, 209, 210, - 211, 212, 212 + +#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) + +static const char * const yytname[] = { "$","error","$undefined.","TOK_PPEQ", +"TOK_opaque","TOK_bstring","TOK_cstring","TOK_hstring","TOK_identifier","TOK_number", +"TOK_number_negative","TOK_typereference","TOK_capitalreference","TOK_typefieldreference", +"TOK_valuefieldreference","TOK_ABSENT","TOK_ABSTRACT_SYNTAX","TOK_ALL","TOK_ANY", +"TOK_APPLICATION","TOK_AUTOMATIC","TOK_BEGIN","TOK_BIT","TOK_BMPString","TOK_BOOLEAN", +"TOK_BY","TOK_CHARACTER","TOK_CHOICE","TOK_CLASS","TOK_COMPONENT","TOK_COMPONENTS", +"TOK_CONSTRAINED","TOK_CONTAINING","TOK_DEFAULT","TOK_DEFINITIONS","TOK_DEFINED", +"TOK_EMBEDDED","TOK_ENCODED","TOK_ENCODING_CONTROL","TOK_END","TOK_ENUMERATED", +"TOK_EXPLICIT","TOK_EXPORTS","TOK_EXTENSIBILITY","TOK_EXTERNAL","TOK_FALSE", +"TOK_FROM","TOK_GeneralizedTime","TOK_GeneralString","TOK_GraphicString","TOK_IA5String", +"TOK_IDENTIFIER","TOK_IMPLICIT","TOK_IMPLIED","TOK_IMPORTS","TOK_INCLUDES","TOK_INSTANCE", +"TOK_INSTRUCTIONS","TOK_INTEGER","TOK_ISO646String","TOK_MAX","TOK_MIN","TOK_MINUS_INFINITY", +"TOK_NULL","TOK_NumericString","TOK_OBJECT","TOK_ObjectDescriptor","TOK_OCTET", +"TOK_OF","TOK_OPTIONAL","TOK_PATTERN","TOK_PDV","TOK_PLUS_INFINITY","TOK_PRESENT", +"TOK_PrintableString","TOK_PRIVATE","TOK_REAL","TOK_RELATIVE_OID","TOK_SEQUENCE", +"TOK_SET","TOK_SIZE","TOK_STRING","TOK_SYNTAX","TOK_T61String","TOK_TAGS","TOK_TeletexString", +"TOK_TRUE","TOK_TYPE_IDENTIFIER","TOK_UNIQUE","TOK_UNIVERSAL","TOK_UniversalString", +"TOK_UTCTime","TOK_UTF8String","TOK_VideotexString","TOK_VisibleString","TOK_WITH", +"TOK_EXCEPT","'^'","TOK_INTERSECTION","'|'","TOK_UNION","TOK_TwoDots","TOK_ThreeDots", +"TOK_tag","'{'","'}'","'('","')'","';'","','","':'","'!'","'.'","'<'","'@'", +"ParsedGrammar","ModuleList","ModuleSpecification","optObjectIdentifier","ObjectIdentifier", +"ObjectIdentifierBody","ObjectIdentifierElement","optModuleSpecificationFlags", +"ModuleSpecificationFlags","ModuleSpecificationFlag","optModuleSpecificationBody", +"ModuleSpecificationBody","ModuleSpecificationElement","@1","ImportsDefinition", +"ImportsBundleSet","ImportsBundle","ImportsList","ImportsElement","ExportsDefinition", +"ExportsBody","ExportsElement","ValueSetDefinition","DefinedTypeRef","optValueSetBody", +"ValueSetBody","ValueSetElement","DataTypeReference","ParameterArgumentList", +"ParameterArgumentName","ActualParameterList","ActualParameter","ComponentTypeLists", +"ComponentType","AlternativeTypeLists","AlternativeType","ClassDeclaration", +"optUnique","ClassFieldList","ClassField","optWithSyntax","WithSyntax","@2", +"WithSyntaxFormat","WithSyntaxFormatToken","ExtensionAndException","Type","TypeDeclaration", +"ComplexTypeReference","ComplexTypeReferenceAmpList","ComplexTypeReferenceElement", +"ClassFieldIdentifier","ClassFieldName","ValueDefinition","InlineOrDefinedValue", +"@3","DefinedValue","Opaque","BasicTypeId","BasicTypeId_UniverationCompatible", +"BasicType","BasicString","Union","Intersection","Except","optConstraints","Constraints", +"SetOfConstraints","ElementSetSpecs","ElementSetSpec","ConstraintSubtypeElement", +"ConstraintRangeSpec","ConstraintSpec","ConstraintValue","WithComponents","WithComponentsList", +"WithComponentsElement","optPresenceConstraint","PresenceConstraint","TableConstraint", +"SimpleTableConstraint","ComponentRelationConstraint","AtNotationList","AtNotationElement", +"ComponentIdList","optMarker","Marker","DefaultValue","@4","UniverationDefinition", +"UniverationList","UniverationElement","SignedNumber","optTag","Tag","TypeRefName", +"ObjectClassReference","Identifier","TaggedIdentifier", NULL }; +#endif -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const unsigned char yyr2[] = -{ - 0, 2, 1, 1, 2, 8, 0, 1, 3, 2, - 1, 2, 1, 4, 1, 0, 1, 1, 2, 2, - 2, 2, 2, 2, 0, 1, 1, 2, 1, 1, - 1, 1, 1, 0, 3, 1, 3, 2, 1, 2, - 4, 1, 3, 1, 1, 3, 3, 2, 1, 3, - 1, 1, 6, 1, 1, 0, 1, 4, 4, 3, - 6, 1, 3, 1, 3, 3, 1, 3, 1, 1, - 1, 3, 3, 3, 1, 1, 3, 2, 1, 5, - 0, 1, 1, 3, 2, 4, 4, 0, 1, 0, - 6, 1, 2, 1, 1, 1, 3, 3, 2, 1, - 1, 4, 4, 4, 4, 4, 1, 4, 4, 1, - 3, 1, 3, 3, 1, 3, 1, 3, 1, 1, - 1, 1, 4, 0, 3, 1, 1, 1, 1, 1, - 1, 3, 1, 2, 1, 1, 1, 1, 2, 2, - 1, 1, 2, 2, 1, 1, 1, 1, 2, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 1, 1, 4, 3, 4, 1, 3, 5, 1, - 3, 3, 3, 4, 3, 1, 3, 3, 3, 3, - 1, 1, 1, 2, 2, 3, 1, 1, 1, 1, - 1, 1, 1, 5, 1, 3, 1, 3, 0, 1, - 1, 1, 1, 1, 1, 3, 4, 1, 3, 2, - 3, 1, 3, 0, 1, 1, 2, 1, 1, 0, - 3, 2, 3, 1, 3, 1, 4, 4, 1, 1, - 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, - 1, 1, 2 +static const short yyr1[] = { 0, + 115, 116, 116, 117, 118, 118, 119, 119, 120, 120, + 121, 121, 121, 122, 122, 123, 123, 124, 124, 124, + 124, 124, 125, 125, 126, 126, 127, 127, 127, 127, + 127, 128, 127, 127, 129, 129, 130, 130, 131, 132, + 132, 133, 133, 134, 134, 134, 135, 135, 136, 136, + 137, 138, 138, 139, 139, 140, 140, 141, 141, 142, + 142, 142, 142, 143, 143, 144, 144, 144, 145, 145, + 146, 146, 147, 147, 148, 148, 148, 149, 149, 150, + 150, 151, 152, 152, 153, 153, 154, 154, 154, 155, + 155, 157, 156, 158, 158, 159, 159, 160, 160, 160, + 161, 162, 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 163, 163, 163, 163, 163, 164, 164, + 165, 166, 167, 167, 168, 170, 169, 169, 169, 169, + 169, 169, 171, 171, 172, 172, 173, 173, 173, 173, + 173, 173, 173, 173, 173, 173, 173, 173, 174, 174, + 174, 175, 175, 176, 176, 176, 176, 176, 176, 176, + 176, 176, 176, 176, 176, 176, 176, 177, 177, 178, + 178, 179, 180, 180, 181, 181, 182, 182, 183, 183, + 183, 184, 184, 184, 184, 185, 185, 185, 185, 185, + 185, 185, 185, 185, 186, 186, 186, 186, 187, 187, + 188, 188, 188, 188, 188, 189, 190, 190, 191, 191, + 192, 192, 193, 193, 193, 194, 194, 195, 196, 197, + 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, + 202, 203, 202, 204, 204, 205, 205, 206, 206, 206, + 206, 206, 207, 207, 208, 208, 209, 209, 209, 210, + 210, 211, 212, 213, 213 }; -/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state - STATE-NUM when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ -static const unsigned char yydefact[] = -{ - 0, 247, 248, 0, 2, 3, 6, 1, 4, 0, - 0, 7, 250, 14, 9, 0, 10, 12, 15, 8, - 11, 0, 0, 0, 0, 0, 0, 0, 16, 17, - 0, 23, 21, 19, 22, 20, 0, 18, 13, 24, - 151, 0, 0, 152, 153, 154, 0, 155, 156, 164, - 157, 158, 159, 160, 161, 162, 163, 0, 25, 26, - 28, 29, 32, 30, 31, 35, 0, 0, 33, 0, - 47, 0, 48, 50, 51, 37, 0, 38, 0, 41, - 43, 44, 5, 27, 242, 111, 249, 0, 134, 0, - 0, 147, 141, 145, 146, 135, 0, 0, 136, 140, - 144, 0, 0, 53, 54, 137, 114, 0, 34, 46, - 45, 0, 36, 39, 0, 0, 0, 244, 59, 0, - 243, 0, 148, 143, 142, 139, 138, 0, 61, 0, - 63, 0, 0, 0, 49, 6, 42, 0, 246, 245, - 111, 249, 106, 0, 0, 170, 170, 57, 58, 170, - 109, 149, 137, 99, 100, 0, 112, 113, 0, 0, - 0, 0, 55, 120, 121, 115, 116, 118, 125, 127, - 126, 240, 241, 123, 122, 129, 128, 0, 130, 40, - 0, 82, 223, 119, 0, 0, 0, 0, 0, 0, - 0, 171, 172, 0, 0, 98, 0, 150, 0, 0, - 62, 65, 64, 200, 201, 197, 0, 196, 202, 0, - 0, 0, 0, 56, 176, 179, 0, 185, 191, 190, - 213, 214, 198, 199, 0, 0, 0, 87, 0, 0, - 225, 223, 223, 84, 224, 0, 95, 0, 75, 78, - 251, 0, 110, 0, 0, 0, 70, 74, 0, 0, - 0, 0, 0, 0, 239, 231, 0, 233, 238, 235, - 0, 66, 68, 69, 60, 192, 0, 0, 0, 0, - 0, 52, 167, 168, 165, 166, 0, 0, 0, 169, - 0, 0, 0, 0, 117, 132, 124, 131, 0, 79, - 88, 83, 229, 228, 227, 226, 80, 80, 107, 0, - 101, 0, 252, 77, 0, 0, 102, 0, 223, 174, - 104, 0, 103, 105, 232, 0, 0, 108, 0, 193, - 194, 189, 187, 0, 215, 184, 177, 180, 181, 182, - 0, 188, 186, 0, 0, 217, 133, 0, 0, 81, - 85, 86, 96, 97, 76, 173, 73, 71, 72, 175, - 234, 0, 0, 67, 195, 206, 0, 204, 170, 0, - 183, 0, 219, 221, 216, 0, 89, 230, 237, 236, - 203, 0, 208, 178, 220, 0, 218, 0, 205, 211, - 212, 210, 207, 209, 222, 93, 0, 91, 94, 90, - 92 +static const short yyr2[] = { 0, + 1, 1, 2, 8, 0, 1, 3, 2, 1, 2, + 1, 4, 1, 0, 1, 1, 2, 2, 2, 2, + 2, 2, 0, 1, 1, 2, 1, 1, 1, 1, + 1, 0, 3, 1, 3, 2, 1, 2, 4, 1, + 3, 1, 1, 3, 3, 2, 1, 3, 1, 1, + 6, 1, 1, 0, 1, 1, 3, 1, 1, 4, + 4, 3, 6, 1, 3, 1, 3, 3, 1, 3, + 1, 1, 1, 3, 3, 3, 1, 1, 3, 2, + 1, 5, 0, 1, 1, 3, 2, 4, 4, 0, + 1, 0, 6, 1, 2, 1, 1, 1, 3, 3, + 2, 1, 1, 4, 4, 4, 4, 4, 1, 4, + 4, 1, 3, 1, 3, 3, 1, 3, 1, 3, + 1, 1, 1, 1, 4, 0, 3, 1, 1, 1, + 1, 1, 1, 3, 1, 2, 1, 1, 1, 1, + 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, + 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 4, 3, 4, 1, 3, + 5, 1, 3, 3, 3, 4, 3, 1, 3, 3, + 3, 3, 1, 1, 1, 2, 2, 3, 1, 1, + 1, 1, 1, 1, 1, 5, 1, 3, 1, 3, + 0, 1, 1, 1, 1, 1, 1, 3, 4, 1, + 3, 2, 3, 1, 3, 0, 1, 1, 2, 1, + 1, 0, 3, 2, 3, 1, 3, 1, 4, 4, + 1, 1, 1, 1, 0, 1, 1, 2, 2, 1, + 1, 1, 1, 1, 2 }; -/* YYDEFGOTO[NTERM-NUM]. */ -static const short yydefgoto[] = -{ - -1, 3, 4, 5, 10, 11, 15, 16, 27, 28, - 29, 57, 58, 59, 108, 60, 76, 77, 78, 79, - 61, 71, 72, 62, 102, 212, 63, 127, 128, 260, - 261, 245, 246, 237, 238, 118, 340, 180, 181, 289, - 290, 377, 386, 387, 247, 262, 149, 150, 165, 166, - 182, 183, 64, 174, 225, 175, 286, 151, 152, 153, - 154, 277, 278, 280, 190, 191, 192, 213, 214, 215, - 267, 216, 217, 218, 356, 357, 382, 383, 219, 220, - 221, 334, 335, 362, 233, 234, 295, 338, 197, 256, - 257, 222, 119, 120, 155, 106, 223, 248 +static const short yydefact[] = { 0, + 250, 251, 1, 2, 5, 3, 0, 0, 6, 253, + 13, 8, 0, 9, 11, 14, 7, 10, 0, 0, + 0, 0, 0, 0, 0, 15, 16, 0, 22, 20, + 18, 21, 19, 0, 17, 12, 23, 154, 0, 0, + 155, 156, 157, 0, 158, 159, 167, 160, 161, 162, + 163, 164, 165, 166, 0, 24, 25, 27, 28, 31, + 29, 30, 34, 0, 0, 32, 0, 46, 0, 47, + 49, 50, 36, 0, 37, 0, 40, 42, 43, 4, + 26, 245, 114, 252, 0, 137, 0, 0, 150, 144, + 148, 149, 138, 0, 0, 139, 143, 147, 0, 0, + 52, 53, 140, 117, 0, 33, 45, 44, 0, 35, + 38, 0, 0, 0, 247, 62, 0, 246, 0, 151, + 146, 145, 142, 141, 0, 64, 0, 66, 0, 0, + 0, 48, 5, 41, 0, 249, 248, 114, 252, 109, + 0, 0, 173, 173, 60, 61, 173, 112, 152, 140, + 102, 103, 0, 115, 116, 0, 0, 0, 0, 54, + 123, 124, 118, 119, 121, 128, 130, 129, 243, 244, + 126, 125, 132, 131, 0, 133, 39, 0, 85, 226, + 122, 0, 0, 0, 0, 0, 0, 0, 174, 175, + 0, 0, 101, 0, 153, 0, 0, 65, 68, 67, + 203, 204, 200, 0, 199, 205, 0, 58, 0, 0, + 0, 55, 56, 59, 182, 0, 188, 194, 193, 216, + 217, 201, 202, 0, 0, 0, 90, 0, 0, 228, + 226, 226, 87, 227, 0, 98, 0, 78, 81, 254, + 0, 113, 0, 0, 0, 73, 77, 0, 0, 179, + 0, 0, 0, 0, 242, 234, 0, 236, 241, 238, + 0, 69, 71, 72, 63, 195, 0, 0, 0, 0, + 0, 51, 0, 170, 171, 168, 169, 0, 0, 172, + 0, 0, 0, 0, 120, 135, 127, 134, 0, 82, + 91, 86, 232, 231, 230, 229, 83, 83, 110, 0, + 104, 0, 255, 80, 0, 0, 105, 0, 226, 177, + 0, 107, 0, 106, 108, 235, 0, 0, 111, 0, + 196, 197, 192, 190, 0, 218, 187, 57, 183, 184, + 185, 0, 191, 189, 0, 0, 220, 136, 0, 0, + 84, 88, 89, 99, 100, 79, 176, 76, 74, 75, + 180, 178, 237, 0, 0, 70, 198, 209, 0, 207, + 173, 186, 0, 222, 224, 219, 0, 92, 233, 0, + 240, 239, 206, 0, 211, 223, 0, 221, 0, 181, + 208, 214, 215, 213, 210, 212, 225, 96, 0, 94, + 97, 93, 95, 0, 0, 0 }; -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -#define YYPACT_NINF -213 -static const short yypact[] = -{ - 121, -213, -213, 47, 121, -213, -44, -213, -213, 33, - 31, -213, -213, -213, -213, 36, -213, -18, 41, -213, - -213, 81, 97, 77, 91, 55, 146, 164, 41, -213, - 19, -213, -213, -213, -213, -213, 160, -213, -213, 413, - -213, 185, 15, -213, -213, -213, 131, -213, -213, -213, - -213, -213, -213, -213, -213, -213, -213, 161, 413, -213, - -213, -213, -213, -213, -213, -213, 187, 711, -213, 107, - -213, 65, -213, -213, -213, -213, 27, -213, -10, -213, - -213, -213, -213, -213, 6, 129, -213, 167, -213, 170, - 199, -213, -213, -213, -213, -213, 225, 196, -213, -213, - -213, 728, 276, -213, -213, -213, 168, 278, -213, -213, - -213, 136, -213, -213, 121, 136, 178, 45, -213, 574, - -213, 136, -213, -213, -213, -213, -213, 40, -213, 173, - 176, 181, 226, 64, -213, -44, -213, 226, -213, -213, - 24, 183, 253, 190, 221, 66, 132, -213, -213, -58, - -213, -213, 191, -213, -213, 192, -213, -213, 290, 728, - 294, 294, 149, -213, -213, 193, -213, -213, -213, -213, - -213, -213, -213, -213, -213, -213, -213, 200, -213, -213, - 51, -213, 497, -213, 279, -6, 245, 202, 1, 149, - 242, -213, 205, 1, 248, -213, 48, -213, 352, 651, - -213, -213, -213, -213, -213, -213, -12, -213, -213, 288, - 121, 149, 214, -213, 162, 227, 215, -12, -213, -213, - 218, -213, -213, -213, 226, 321, 294, 231, 226, 291, - -213, 26, 26, -213, -213, 294, 217, 73, -213, -213, - 229, 651, -213, 149, 261, 83, -213, -213, 651, 223, - 651, 149, 113, 651, -213, -213, 115, -213, -213, 228, - 116, -213, -213, -213, -213, 220, 236, 156, 235, 237, - 233, -213, -213, -213, -213, -213, 239, 149, 149, -213, - 149, 149, 198, 230, -213, -213, 339, -213, 263, -213, - -213, -213, -213, -213, -213, -213, 258, 258, -213, 257, - -213, -6, -213, -213, 240, 651, -213, 1, 26, -213, - -213, 241, -213, -213, -213, 69, 257, -213, 352, -213, - 238, -213, -213, 20, -213, -213, 244, -213, -213, -213, - 243, -213, -213, 8, 123, -213, -213, 251, 321, -213, - -213, -213, -213, -213, -213, -213, -213, -213, -213, -213, - -213, 250, 252, -213, -213, -213, 128, -213, -58, 149, - -213, 294, 249, -213, -213, 230, -213, 339, -213, -213, - -213, 20, 25, 175, 249, 294, -213, 189, -213, -213, - -213, -213, -213, -213, -213, -213, 11, -213, -213, -213, - -213 +static const short yydefgoto[] = { 394, + 3, 4, 8, 9, 13, 14, 25, 26, 27, 55, + 56, 57, 106, 58, 74, 75, 76, 77, 59, 69, + 70, 60, 100, 211, 212, 213, 61, 125, 126, 261, + 262, 245, 246, 237, 238, 116, 342, 178, 179, 290, + 291, 379, 389, 390, 247, 263, 147, 148, 163, 164, + 180, 181, 62, 172, 225, 173, 287, 149, 150, 151, + 152, 278, 279, 281, 188, 189, 190, 249, 250, 215, + 268, 216, 217, 218, 359, 360, 385, 386, 219, 220, + 221, 336, 337, 364, 233, 234, 296, 340, 195, 257, + 258, 222, 117, 118, 153, 104, 223, 248 }; -/* YYPGOTO[NTERM-NUM]. */ -static const short yypgoto[] = -{ - -213, -213, -213, 361, 234, -213, -213, 356, -213, -213, - 344, -213, -213, 315, -213, -213, -213, 304, -213, 266, - -213, -213, 272, -213, 317, -213, -213, -213, 232, -213, - 67, 194, 79, -213, 88, -213, 93, -213, 165, -213, - -213, -213, -213, 12, -172, -114, -136, -55, -213, 179, - -181, -113, -213, -213, -213, -212, 56, -49, -46, -213, - 42, -213, -213, -213, -139, -213, -213, -160, 38, -31, - 188, -213, -175, -213, -213, 35, -213, -213, -213, -213, - -213, -213, 39, 46, -168, -213, -213, -213, -213, -213, - 94, -130, -213, 172, 4, -213, -9, -171 +static const short yypact[] = { 86, +-32768,-32768, 86,-32768, -66,-32768, 12, 95,-32768,-32768, +-32768,-32768, 14,-32768, 4, 217,-32768,-32768, 118, 97, + 56, 82, 121, 104, 195, 217,-32768, 115,-32768,-32768, +-32768,-32768,-32768, 179,-32768,-32768, 446,-32768, 213, 23, +-32768,-32768,-32768, 96,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 191, 446,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 212, 744,-32768, 133,-32768, 124,-32768, +-32768,-32768,-32768, 45,-32768, -19,-32768,-32768,-32768,-32768, +-32768, 20, 135,-32768, 164,-32768, 176, 197,-32768,-32768, +-32768,-32768,-32768, 225, 199,-32768,-32768,-32768, 761, 275, +-32768,-32768,-32768, 171, 282,-32768,-32768,-32768, 159,-32768, +-32768, 86, 159, 182, 32,-32768, 607,-32768, 159,-32768, +-32768,-32768,-32768,-32768, -30,-32768, 177, 184, 188, 236, + 54,-32768, -66,-32768, 236,-32768,-32768, 61, 192, 262, + 194, 231, 76, 77,-32768,-32768, -11,-32768,-32768, 196, +-32768,-32768, 200,-32768,-32768, 302, 761, 299, 299, 140, +-32768,-32768, 202,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 203,-32768,-32768, -24,-32768, 530, +-32768, 283, 28, 255, 206, 24, 245, 241,-32768, 211, + 24, 251,-32768, 42,-32768, 385, 684,-32768,-32768,-32768, +-32768,-32768,-32768, -31,-32768,-32768, 291,-32768, 86, 245, + 218, 215,-32768, 174, 226, 220, -31,-32768,-32768, 223, +-32768,-32768,-32768, 236, 325, 299, 240, 236, 324,-32768, + 92, 92,-32768,-32768, 299, 227, -9,-32768,-32768, 233, + 684,-32768, 245, 269, 63,-32768,-32768, 684, 232, 93, + 684, 245, 100, 684,-32768,-32768, 103,-32768,-32768, 235, + 112,-32768,-32768,-32768,-32768, 229, 242, 83, 243, 239, + 238,-32768, 140,-32768,-32768,-32768,-32768, 245, 245,-32768, + 245, 245, 154, 244,-32768,-32768, 348,-32768, 271,-32768, +-32768,-32768,-32768,-32768,-32768,-32768, 266, 266,-32768, 253, +-32768, 28,-32768,-32768, 248, 684,-32768, 24, 92,-32768, + 257,-32768, 250,-32768,-32768,-32768, 16, 253,-32768, 385, +-32768, 249,-32768,-32768, 35,-32768,-32768,-32768,-32768,-32768, +-32768, 254,-32768,-32768, 10, 122,-32768,-32768, 259, 325, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, + 256,-32768,-32768, 265, 267,-32768,-32768,-32768, 134,-32768, + -11,-32768, 299, 261,-32768,-32768, 244,-32768, 348, 245, +-32768,-32768,-32768, 35, 72, 261, 299,-32768, 190, 174, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 15,-32768, +-32768,-32768,-32768, 366, 375,-32768 }; -/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If zero, do what YYDEFACT says. - If YYTABLE_NINF, parse error. */ -#define YYTABLE_NINF -249 -static const short yytable[] = -{ - 17, 232, 12, 176, 6, 148, 17, 194, 6, 12, - 195, 103, 103, 239, 241, 385, 12, 104, 104, 167, - 105, 105, 187, 12, 163, 164, 1, 2, 12, 249, - 67, 244, 69, 74, 116, 12, 114, 81, 1, 2, - 379, 12, 13, 66, 12, 13, 73, 7, 189, 67, - 80, 270, 129, 22, 294, 105, 12, 171, 172, 229, - 9, 23, 66, 296, 297, 18, 258, 81, 231, 168, - 169, 170, 12, 171, 172, 1, 2, 12, 171, 172, - 80, 65, 24, 304, 25, 264, 138, 342, 21, 265, - 30, 311, 322, 26, 380, 230, 236, 139, 381, 115, - 65, 266, 74, 236, 351, 130, 81, 332, 34, 117, - 129, 167, 157, 105, 310, 73, 389, 313, 135, 80, - 361, 330, 355, 70, 178, 156, 38, 303, -247, 239, - 241, 242, 1, 2, 308, 112, 121, 177, 14, 12, - 348, 19, 1, 2, 12, 158, 187, 1, 2, 159, - 254, 201, 202, 255, 31, 203, 227, 12, 171, 172, - 228, 32, 203, 130, 12, 171, 172, 36, 173, 343, - 188, 254, 189, 110, 111, 33, 240, 75, 300, 240, - 293, 39, 301, 105, 240, 258, 352, 259, 306, 263, - 84, 346, 307, 385, 204, 205, 388, 68, 85, 86, - 82, 204, 163, 164, 203, 388, 12, 171, 172, 87, - 206, 88, 187, 89, 269, 109, 321, 287, 312, 372, - 314, 317, 307, 90, 315, 318, 298, 91, 364, 207, - 35, 92, 365, 370, 93, 208, 193, 371, 189, 163, - 164, 121, 208, 204, 209, 94, 327, 328, 122, 329, - 95, 123, 96, 210, 97, 211, 85, 86, 331, 272, - 273, 274, 275, 98, 99, 12, 171, 172, 1, 2, - 124, 276, 272, 273, 274, 275, 125, 126, 100, 131, - 132, 133, 137, 160, 208, 162, 161, -248, 184, 186, - 178, 101, 240, 199, 185, 196, 198, 203, 240, 12, - 171, 172, 12, 177, 235, 224, 259, 178, 243, 263, - 250, 251, 226, 87, 358, 88, 253, 89, 268, 271, - 177, 281, 283, 279, 363, 285, 288, 90, 299, 305, - 309, 91, 117, 319, 316, 92, 204, 320, 93, 323, - 325, 326, 324, 336, 333, 337, 339, 345, 349, 94, - 360, 354, 363, 359, 95, 366, 96, 368, 97, 369, - 12, 375, 358, 140, 141, 8, 384, 98, 99, 179, - 142, 20, 37, 83, 87, 40, 88, 208, 89, 143, - 113, 136, 100, 134, 107, 353, 347, 252, 90, 344, - 341, 200, 91, 291, 367, 292, 92, 373, 390, 93, - 43, 44, 45, 284, 376, 282, 378, 374, 144, 350, - 94, 47, 302, 0, 0, 95, 48, 96, 49, 97, - 0, 12, 0, 0, 1, 2, 50, 0, 98, 99, - 145, 146, 0, 0, 0, 51, 40, 52, 0, 0, - 0, 0, 53, 100, 54, 55, 56, 0, 0, 0, - 0, 41, 0, 0, 0, 42, 0, 0, 0, 0, - 0, 43, 44, 45, 0, 0, 0, 46, 0, 0, - 0, 0, 47, 0, 0, 0, 0, 48, 0, 49, - 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, - 0, 0, 0, 0, 0, 0, 51, 0, 52, 0, - 0, 0, 0, 53, 0, 54, 55, 56, 140, 141, - 163, 164, 0, 0, 0, 142, 0, 0, 0, 87, - 40, 88, 0, 89, 143, 0, 0, 0, 0, 0, - 229, 0, 0, 90, 0, 0, 0, 91, 0, 0, - 0, 92, 0, 0, 93, 43, 44, 45, 0, 0, - 0, 0, 0, 144, 0, 94, 47, 0, 0, 0, - 95, 48, 96, 49, 97, 0, 230, 0, 0, 0, - 0, 50, 0, 98, 99, 145, 146, 0, 0, 0, - 51, 0, 52, 0, 0, 140, 141, 53, 100, 54, - 55, 56, 142, 0, 0, 0, 87, 40, 88, 0, - 89, 143, 0, 0, 0, 0, 0, 0, 0, 0, - 90, 0, 0, 0, 91, 0, 0, 0, 92, 0, - 0, 93, 43, 44, 45, 0, 0, 0, 0, 0, - 144, 0, 94, 47, 0, 0, 0, 95, 48, 96, - 49, 97, 0, 0, 0, 0, 0, 0, 50, 0, - 98, 99, 145, 146, 0, 0, 0, 51, 0, 52, - 0, 147, 140, 141, 53, 100, 54, 55, 56, 142, - 0, 0, 0, 87, 40, 88, 0, 89, 143, 0, - 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, - 0, 91, 0, 0, 0, 92, 0, 0, 93, 43, - 44, 45, 0, 0, 0, 0, 0, 144, 0, 94, - 47, 0, 0, 0, 95, 48, 96, 49, 97, 0, - 0, 0, 85, 86, 0, 50, 0, 98, 99, 145, - 146, 0, 0, 87, 51, 88, 52, 89, 0, 1, - 2, 53, 100, 54, 55, 56, 0, 90, 0, 0, - 87, 91, 88, 0, 89, 92, 0, 0, 93, 0, - 0, 0, 0, 0, 90, 0, 0, 0, 91, 94, - 0, 0, 92, 0, 95, 93, 96, 0, 97, 0, - 0, 0, 0, 0, 0, 0, 94, 98, 99, 0, - 0, 95, 0, 96, 0, 97, 0, 0, 0, 0, - 0, 0, 100, 0, 98, 99, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 100 +static const short yypgoto[] = {-32768, +-32768, 373, 246,-32768,-32768, 364,-32768,-32768, 352,-32768, +-32768, 327,-32768,-32768,-32768, 306,-32768, 268,-32768,-32768, + 276,-32768, 319,-32768,-32768, 113,-32768,-32768, 237,-32768, + 68, 201, 87,-32768, 88,-32768, 101,-32768, 170,-32768, +-32768,-32768,-32768, 13, -167, -109, -44, -50,-32768, 180, + -173, -86,-32768,-32768,-32768, -232, 65, -54, -52,-32768, + 43,-32768,-32768,-32768, -143,-32768,-32768, -169, -157, 3, + 189,-32768, -174,-32768,-32768, 39,-32768,-32768,-32768,-32768, +-32768,-32768, 47, 53, -154,-32768,-32768,-32768,-32768,-32768, + 102, -122,-32768, 178, 2,-32768, -7, -166 }; -static const short yycheck[] = -{ - 9, 182, 8, 133, 0, 119, 15, 146, 4, 8, - 149, 66, 67, 185, 185, 4, 8, 66, 67, 132, - 66, 67, 80, 8, 13, 14, 11, 12, 8, 189, - 39, 30, 17, 42, 28, 8, 46, 46, 11, 12, - 15, 8, 9, 39, 8, 9, 42, 0, 106, 58, - 46, 211, 101, 12, 229, 101, 8, 9, 10, 33, - 104, 20, 58, 231, 232, 34, 196, 76, 182, 5, - 6, 7, 8, 9, 10, 11, 12, 8, 9, 10, - 76, 39, 41, 243, 43, 199, 41, 299, 106, 101, - 9, 251, 267, 52, 69, 69, 102, 52, 73, 109, - 58, 113, 111, 102, 316, 101, 115, 282, 53, 103, - 159, 224, 121, 159, 250, 111, 105, 253, 114, 115, - 112, 281, 102, 108, 133, 121, 107, 241, 104, 301, - 301, 186, 11, 12, 248, 108, 112, 133, 105, 8, - 308, 105, 11, 12, 8, 105, 80, 11, 12, 109, - 102, 160, 161, 105, 57, 6, 105, 8, 9, 10, - 109, 84, 6, 159, 8, 9, 10, 3, 104, 299, - 104, 102, 106, 108, 109, 84, 185, 46, 105, 188, - 229, 21, 109, 229, 193, 315, 316, 196, 105, 198, - 3, 305, 109, 4, 45, 46, 377, 12, 11, 12, - 39, 45, 13, 14, 6, 386, 8, 9, 10, 22, - 61, 24, 80, 26, 210, 108, 60, 226, 105, 358, - 105, 105, 109, 36, 109, 109, 235, 40, 105, 80, - 84, 44, 109, 105, 47, 86, 104, 109, 106, 13, - 14, 112, 86, 45, 95, 58, 277, 278, 81, 280, - 63, 81, 65, 104, 67, 106, 11, 12, 60, 97, - 98, 99, 100, 76, 77, 8, 9, 10, 11, 12, - 71, 109, 97, 98, 99, 100, 51, 81, 91, 3, - 112, 3, 104, 110, 86, 104, 110, 104, 35, 68, - 299, 104, 301, 3, 104, 104, 104, 6, 307, 8, - 9, 10, 8, 299, 25, 112, 315, 316, 106, 318, - 68, 106, 112, 22, 323, 24, 68, 26, 30, 105, - 316, 106, 104, 96, 333, 4, 95, 36, 111, 68, - 107, 40, 103, 113, 106, 44, 45, 101, 47, 104, - 107, 102, 105, 4, 114, 82, 88, 107, 107, 58, - 107, 113, 361, 109, 63, 104, 65, 107, 67, 107, - 8, 112, 371, 11, 12, 4, 375, 76, 77, 135, - 18, 15, 28, 58, 22, 23, 24, 86, 26, 27, - 76, 115, 91, 111, 67, 318, 307, 193, 36, 301, - 297, 159, 40, 228, 338, 104, 44, 359, 386, 47, - 48, 49, 50, 224, 365, 217, 371, 361, 56, 315, - 58, 59, 240, -1, -1, 63, 64, 65, 66, 67, - -1, 8, -1, -1, 11, 12, 74, -1, 76, 77, - 78, 79, -1, -1, -1, 83, 23, 85, -1, -1, - -1, -1, 90, 91, 92, 93, 94, -1, -1, -1, - -1, 38, -1, -1, -1, 42, -1, -1, -1, -1, - -1, 48, 49, 50, -1, -1, -1, 54, -1, -1, - -1, -1, 59, -1, -1, -1, -1, 64, -1, 66, - -1, -1, -1, -1, -1, -1, -1, 74, -1, -1, - -1, -1, -1, -1, -1, -1, 83, -1, 85, -1, - -1, -1, -1, 90, -1, 92, 93, 94, 11, 12, - 13, 14, -1, -1, -1, 18, -1, -1, -1, 22, - 23, 24, -1, 26, 27, -1, -1, -1, -1, -1, - 33, -1, -1, 36, -1, -1, -1, 40, -1, -1, - -1, 44, -1, -1, 47, 48, 49, 50, -1, -1, - -1, -1, -1, 56, -1, 58, 59, -1, -1, -1, - 63, 64, 65, 66, 67, -1, 69, -1, -1, -1, - -1, 74, -1, 76, 77, 78, 79, -1, -1, -1, - 83, -1, 85, -1, -1, 11, 12, 90, 91, 92, - 93, 94, 18, -1, -1, -1, 22, 23, 24, -1, - 26, 27, -1, -1, -1, -1, -1, -1, -1, -1, - 36, -1, -1, -1, 40, -1, -1, -1, 44, -1, - -1, 47, 48, 49, 50, -1, -1, -1, -1, -1, - 56, -1, 58, 59, -1, -1, -1, 63, 64, 65, - 66, 67, -1, -1, -1, -1, -1, -1, 74, -1, - 76, 77, 78, 79, -1, -1, -1, 83, -1, 85, - -1, 87, 11, 12, 90, 91, 92, 93, 94, 18, - -1, -1, -1, 22, 23, 24, -1, 26, 27, -1, - -1, -1, -1, -1, -1, -1, -1, 36, -1, -1, - -1, 40, -1, -1, -1, 44, -1, -1, 47, 48, - 49, 50, -1, -1, -1, -1, -1, 56, -1, 58, - 59, -1, -1, -1, 63, 64, 65, 66, 67, -1, - -1, -1, 11, 12, -1, 74, -1, 76, 77, 78, - 79, -1, -1, 22, 83, 24, 85, 26, -1, 11, - 12, 90, 91, 92, 93, 94, -1, 36, -1, -1, - 22, 40, 24, -1, 26, 44, -1, -1, 47, -1, - -1, -1, -1, -1, 36, -1, -1, -1, 40, 58, - -1, -1, 44, -1, 63, 47, 65, -1, 67, -1, - -1, -1, -1, -1, -1, -1, 58, 76, 77, -1, - -1, 63, -1, 65, -1, 67, -1, -1, -1, -1, - -1, -1, 91, -1, 76, 77, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 91 + +#define YYLAST 852 + + +static const short yytable[] = { 15, + 192, 5, 214, 193, 5, 15, 232, 146, 174, 102, + 102, 103, 103, 101, 101, 239, 241, 10, 388, 10, + 11, 10, 11, 10, 169, 170, 112, 161, 162, 65, + 10, 10, 72, 1, 2, 10, 79, 7, 64, 67, + 271, 71, 10, 165, 127, 78, 103, 114, 65, 10, + 169, 170, 10, 244, 295, 1, 2, 64, 166, 167, + 168, 10, 169, 170, 1, 2, 79, 344, 185, 266, + 231, 259, 136, 305, 156, 78, 297, 298, 157, 63, + 227, 267, 313, 137, 228, 354, 382, 265, 201, 113, + 10, 169, 170, 324, 187, 301, 1, 2, 63, 302, + 128, 72, 127, 10, 103, 79, 1, 2, 334, 19, + 71, 155, 332, 133, 78, 214, 12, 255, 17, 392, + 154, 363, 115, 176, 229, 236, 28, 202, 16, 236, + 68, 304, 175, 242, 239, 241, 358, 165, 309, 30, + 383, 73, 323, 255, 384, 201, 256, 10, 169, 170, + 199, 200, 110, 29, 350, 185, 185, 171, 128, 201, + 230, 10, 169, 170, -250, 31, 10, 307, 206, 1, + 2, 308, 119, 32, 294, 240, 103, 345, 240, 186, + 191, 187, 187, 240, 202, 203, 260, 33, 264, 274, + 275, 276, 277, 388, 259, 355, 348, 34, 202, 37, + 204, 311, 161, 162, 314, 391, 312, 316, 308, 315, + 270, 317, 380, 333, 82, 391, 319, 375, 288, 205, + 320, 36, 83, 84, 66, 206, 366, 299, 20, 80, + 367, 108, 109, 85, 207, 86, 21, 87, 373, 206, + 107, 208, 374, 209, 120, 210, 119, 88, 161, 162, + 201, 89, 10, 169, 170, 90, 121, 22, 91, 23, + 10, 169, 170, 1, 2, 83, 84, 122, 24, 92, + 274, 275, 276, 277, 93, 123, 94, 129, 95, 124, + 329, 330, 130, 331, 131, 135, 158, 96, 97, 202, + 203, 160, 176, 159, 240, -251, 182, 183, 184, 194, + 240, 175, 98, 196, 197, 204, 10, 235, 251, 260, + 176, 243, 264, 224, 226, 99, 252, 361, 254, 175, + 269, 280, 272, 273, 205, 282, 284, 365, 286, 201, + 206, 10, 169, 170, 289, 115, 306, 300, 310, 207, + 318, 321, 322, 326, 327, 85, 325, 86, 209, 87, + 210, 338, 339, 341, 347, 365, 352, 335, 351, 88, + 362, 357, 368, 89, 370, 395, 361, 90, 202, 387, + 91, 371, 377, 372, 396, 6, 18, 35, 177, 111, + 134, 92, 81, 105, 132, 328, 93, 356, 94, 346, + 95, 253, 10, 198, 349, 138, 139, 292, 343, 96, + 97, 393, 140, 285, 369, 283, 85, 38, 86, 206, + 87, 141, 381, 378, 98, 376, 0, 303, 353, 0, + 88, 0, 0, 0, 89, 0, 0, 293, 90, 0, + 0, 91, 41, 42, 43, 0, 0, 0, 0, 0, + 142, 0, 92, 45, 0, 0, 0, 93, 46, 94, + 47, 95, 0, 10, 0, 0, 1, 2, 48, 0, + 96, 97, 143, 144, 0, 0, 0, 49, 38, 50, + 0, 0, 0, 0, 51, 98, 52, 53, 54, 0, + 0, 0, 0, 39, 0, 0, 0, 40, 0, 0, + 0, 0, 0, 41, 42, 43, 0, 0, 0, 44, + 0, 0, 0, 0, 45, 0, 0, 0, 0, 46, + 0, 47, 0, 0, 0, 0, 0, 0, 0, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, + 50, 0, 0, 0, 0, 51, 0, 52, 53, 54, + 138, 139, 161, 162, 0, 0, 0, 140, 0, 0, + 0, 85, 38, 86, 0, 87, 141, 0, 0, 0, + 0, 0, 229, 0, 0, 88, 0, 0, 0, 89, + 0, 0, 0, 90, 0, 0, 91, 41, 42, 43, + 0, 0, 0, 0, 0, 142, 0, 92, 45, 0, + 0, 0, 93, 46, 94, 47, 95, 0, 230, 0, + 0, 0, 0, 48, 0, 96, 97, 143, 144, 0, + 0, 0, 49, 0, 50, 0, 0, 138, 139, 51, + 98, 52, 53, 54, 140, 0, 0, 0, 85, 38, + 86, 0, 87, 141, 0, 0, 0, 0, 0, 0, + 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, + 90, 0, 0, 91, 41, 42, 43, 0, 0, 0, + 0, 0, 142, 0, 92, 45, 0, 0, 0, 93, + 46, 94, 47, 95, 0, 0, 0, 0, 0, 0, + 48, 0, 96, 97, 143, 144, 0, 0, 0, 49, + 0, 50, 0, 145, 138, 139, 51, 98, 52, 53, + 54, 140, 0, 0, 0, 85, 38, 86, 0, 87, + 141, 0, 0, 0, 0, 0, 0, 0, 0, 88, + 0, 0, 0, 89, 0, 0, 0, 90, 0, 0, + 91, 41, 42, 43, 0, 0, 0, 0, 0, 142, + 0, 92, 45, 0, 0, 0, 93, 46, 94, 47, + 95, 0, 0, 0, 83, 84, 0, 48, 0, 96, + 97, 143, 144, 0, 0, 85, 49, 86, 50, 87, + 0, 1, 2, 51, 98, 52, 53, 54, 0, 88, + 0, 0, 85, 89, 86, 0, 87, 90, 0, 0, + 91, 0, 0, 0, 0, 0, 88, 0, 0, 0, + 89, 92, 0, 0, 90, 0, 93, 91, 94, 0, + 95, 0, 0, 0, 0, 0, 0, 0, 92, 96, + 97, 0, 0, 93, 0, 94, 0, 95, 0, 0, + 0, 0, 0, 0, 98, 0, 96, 97, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 98 }; -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const unsigned char yystos[] = -{ - 0, 11, 12, 116, 117, 118, 209, 0, 118, 104, - 119, 120, 8, 9, 105, 121, 122, 211, 34, 105, - 122, 106, 12, 20, 41, 43, 52, 123, 124, 125, - 9, 57, 84, 84, 53, 84, 3, 125, 107, 21, - 23, 38, 42, 48, 49, 50, 54, 59, 64, 66, - 74, 83, 85, 90, 92, 93, 94, 126, 127, 128, - 130, 135, 138, 141, 167, 175, 209, 211, 12, 17, - 108, 136, 137, 209, 211, 46, 131, 132, 133, 134, - 209, 211, 39, 128, 3, 11, 12, 22, 24, 26, - 36, 40, 44, 47, 58, 63, 65, 67, 76, 77, - 91, 104, 139, 162, 172, 173, 210, 139, 129, 108, - 108, 109, 108, 132, 46, 109, 28, 103, 150, 207, - 208, 112, 81, 81, 71, 51, 81, 142, 143, 172, - 209, 3, 112, 3, 137, 209, 134, 104, 41, 52, - 11, 12, 18, 27, 56, 78, 79, 87, 160, 161, - 162, 172, 173, 174, 175, 209, 209, 211, 105, 109, - 110, 110, 104, 13, 14, 163, 164, 166, 5, 6, - 7, 9, 10, 104, 168, 170, 206, 209, 211, 119, - 152, 153, 165, 166, 35, 104, 68, 80, 104, 106, - 179, 180, 181, 104, 179, 179, 104, 203, 104, 3, - 143, 211, 211, 6, 45, 46, 61, 80, 86, 95, - 104, 106, 140, 182, 183, 184, 186, 187, 188, 193, - 194, 195, 206, 211, 112, 169, 112, 105, 109, 33, - 69, 160, 165, 199, 200, 25, 102, 148, 149, 159, - 211, 212, 162, 106, 30, 146, 147, 159, 212, 182, - 68, 106, 146, 68, 102, 105, 204, 205, 206, 211, - 144, 145, 160, 211, 160, 101, 113, 185, 30, 209, - 182, 105, 97, 98, 99, 100, 109, 176, 177, 96, - 178, 106, 185, 104, 164, 4, 171, 211, 95, 154, - 155, 153, 104, 172, 187, 201, 199, 199, 211, 111, - 105, 109, 208, 160, 182, 68, 105, 109, 160, 107, - 161, 182, 105, 161, 105, 109, 106, 105, 109, 113, - 101, 60, 187, 104, 105, 107, 102, 184, 184, 184, - 182, 60, 187, 114, 196, 197, 4, 82, 202, 88, - 151, 151, 170, 206, 149, 107, 160, 147, 199, 107, - 205, 170, 206, 145, 113, 102, 189, 190, 211, 109, - 107, 112, 198, 211, 105, 109, 104, 171, 107, 107, - 105, 109, 179, 183, 198, 112, 197, 156, 190, 15, - 69, 73, 191, 192, 211, 4, 157, 158, 165, 105, - 158 +static const short yycheck[] = { 7, + 144, 0, 160, 147, 3, 13, 180, 117, 131, 64, + 65, 64, 65, 64, 65, 183, 183, 8, 4, 8, + 9, 8, 9, 8, 9, 10, 46, 13, 14, 37, + 8, 8, 40, 11, 12, 8, 44, 104, 37, 17, + 210, 40, 8, 130, 99, 44, 99, 28, 56, 8, + 9, 10, 8, 30, 229, 11, 12, 56, 5, 6, + 7, 8, 9, 10, 11, 12, 74, 300, 80, 101, + 180, 194, 41, 243, 105, 74, 231, 232, 109, 37, + 105, 113, 252, 52, 109, 318, 15, 197, 6, 109, + 8, 9, 10, 268, 106, 105, 11, 12, 56, 109, + 99, 109, 157, 8, 157, 113, 11, 12, 283, 106, + 109, 119, 282, 112, 113, 273, 105, 102, 105, 105, + 119, 112, 103, 131, 33, 102, 9, 45, 34, 102, + 108, 241, 131, 184, 302, 302, 102, 224, 248, 84, + 69, 46, 60, 102, 73, 6, 105, 8, 9, 10, + 158, 159, 108, 57, 309, 80, 80, 104, 157, 6, + 69, 8, 9, 10, 104, 84, 8, 105, 86, 11, + 12, 109, 112, 53, 229, 183, 229, 300, 186, 104, + 104, 106, 106, 191, 45, 46, 194, 84, 196, 97, + 98, 99, 100, 4, 317, 318, 306, 3, 45, 21, + 61, 109, 13, 14, 105, 379, 251, 105, 109, 254, + 209, 109, 370, 60, 3, 389, 105, 361, 226, 80, + 109, 107, 11, 12, 12, 86, 105, 235, 12, 39, + 109, 108, 109, 22, 95, 24, 20, 26, 105, 86, + 108, 102, 109, 104, 81, 106, 112, 36, 13, 14, + 6, 40, 8, 9, 10, 44, 81, 41, 47, 43, + 8, 9, 10, 11, 12, 11, 12, 71, 52, 58, + 97, 98, 99, 100, 63, 51, 65, 3, 67, 81, + 278, 279, 112, 281, 3, 104, 110, 76, 77, 45, + 46, 104, 300, 110, 302, 104, 35, 104, 68, 104, + 308, 300, 91, 104, 3, 61, 8, 25, 68, 317, + 318, 106, 320, 112, 112, 104, 106, 325, 68, 318, + 30, 96, 105, 109, 80, 106, 104, 335, 4, 6, + 86, 8, 9, 10, 95, 103, 68, 111, 107, 95, + 106, 113, 101, 105, 107, 22, 104, 24, 104, 26, + 106, 4, 82, 88, 107, 363, 107, 114, 102, 36, + 107, 113, 104, 40, 109, 0, 374, 44, 45, 377, + 47, 107, 112, 107, 0, 3, 13, 26, 133, 74, + 113, 58, 56, 65, 109, 273, 63, 320, 65, 302, + 67, 191, 8, 157, 308, 11, 12, 228, 298, 76, + 77, 389, 18, 224, 340, 217, 22, 23, 24, 86, + 26, 27, 374, 367, 91, 363, -1, 240, 317, -1, + 36, -1, -1, -1, 40, -1, -1, 104, 44, -1, + -1, 47, 48, 49, 50, -1, -1, -1, -1, -1, + 56, -1, 58, 59, -1, -1, -1, 63, 64, 65, + 66, 67, -1, 8, -1, -1, 11, 12, 74, -1, + 76, 77, 78, 79, -1, -1, -1, 83, 23, 85, + -1, -1, -1, -1, 90, 91, 92, 93, 94, -1, + -1, -1, -1, 38, -1, -1, -1, 42, -1, -1, + -1, -1, -1, 48, 49, 50, -1, -1, -1, 54, + -1, -1, -1, -1, 59, -1, -1, -1, -1, 64, + -1, 66, -1, -1, -1, -1, -1, -1, -1, 74, + -1, -1, -1, -1, -1, -1, -1, -1, 83, -1, + 85, -1, -1, -1, -1, 90, -1, 92, 93, 94, + 11, 12, 13, 14, -1, -1, -1, 18, -1, -1, + -1, 22, 23, 24, -1, 26, 27, -1, -1, -1, + -1, -1, 33, -1, -1, 36, -1, -1, -1, 40, + -1, -1, -1, 44, -1, -1, 47, 48, 49, 50, + -1, -1, -1, -1, -1, 56, -1, 58, 59, -1, + -1, -1, 63, 64, 65, 66, 67, -1, 69, -1, + -1, -1, -1, 74, -1, 76, 77, 78, 79, -1, + -1, -1, 83, -1, 85, -1, -1, 11, 12, 90, + 91, 92, 93, 94, 18, -1, -1, -1, 22, 23, + 24, -1, 26, 27, -1, -1, -1, -1, -1, -1, + -1, -1, 36, -1, -1, -1, 40, -1, -1, -1, + 44, -1, -1, 47, 48, 49, 50, -1, -1, -1, + -1, -1, 56, -1, 58, 59, -1, -1, -1, 63, + 64, 65, 66, 67, -1, -1, -1, -1, -1, -1, + 74, -1, 76, 77, 78, 79, -1, -1, -1, 83, + -1, 85, -1, 87, 11, 12, 90, 91, 92, 93, + 94, 18, -1, -1, -1, 22, 23, 24, -1, 26, + 27, -1, -1, -1, -1, -1, -1, -1, -1, 36, + -1, -1, -1, 40, -1, -1, -1, 44, -1, -1, + 47, 48, 49, 50, -1, -1, -1, -1, -1, 56, + -1, 58, 59, -1, -1, -1, 63, 64, 65, 66, + 67, -1, -1, -1, 11, 12, -1, 74, -1, 76, + 77, 78, 79, -1, -1, 22, 83, 24, 85, 26, + -1, 11, 12, 90, 91, 92, 93, 94, -1, 36, + -1, -1, 22, 40, 24, -1, 26, 44, -1, -1, + 47, -1, -1, -1, -1, -1, 36, -1, -1, -1, + 40, 58, -1, -1, 44, -1, 63, 47, 65, -1, + 67, -1, -1, -1, -1, -1, -1, -1, 58, 76, + 77, -1, -1, 63, -1, 65, -1, 67, -1, -1, + -1, -1, -1, -1, 91, -1, 76, 77, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 91 }; +/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ +#line 3 "/usr/share/bison.simple" +/* This file comes from bison-1.28. */ -#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) -# define YYSIZE_T __SIZE_TYPE__ -#endif -#if ! defined (YYSIZE_T) && defined (size_t) -# define YYSIZE_T size_t +/* Skeleton output parser for bison, + Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* This is the parser code that is written into each bison parser + when the %semantic_parser declaration is not specified in the grammar. + It was written by Richard Stallman by simplifying the hairy parser + used when %semantic_parser is specified. */ + +#ifndef YYSTACK_USE_ALLOCA +#ifdef alloca +#define YYSTACK_USE_ALLOCA +#else /* alloca not defined */ +#ifdef __GNUC__ +#define YYSTACK_USE_ALLOCA +#define alloca __builtin_alloca +#else /* not GNU C. */ +#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) +#define YYSTACK_USE_ALLOCA +#include +#else /* not sparc */ +/* We think this test detects Watcom and Microsoft C. */ +/* This used to test MSDOS, but that is a bad idea + since that symbol is in the user namespace. */ +#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) +#if 0 /* No need for malloc.h, which pollutes the namespace; + instead, just don't use alloca. */ +#include #endif -#if ! defined (YYSIZE_T) -# if defined (__STDC__) || defined (__cplusplus) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# endif +#else /* not MSDOS, or __TURBOC__ */ +#if defined(_AIX) +/* I don't know what this was needed for, but it pollutes the namespace. + So I turned it off. rms, 2 May 1997. */ +/* #include */ + #pragma alloca +#define YYSTACK_USE_ALLOCA +#else /* not MSDOS, or __TURBOC__, or _AIX */ +#if 0 +#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up, + and on HPUX 10. Eventually we can turn this on. */ +#define YYSTACK_USE_ALLOCA +#define alloca __builtin_alloca +#endif /* __hpux */ #endif -#if ! defined (YYSIZE_T) -# define YYSIZE_T unsigned int +#endif /* not _AIX */ +#endif /* not MSDOS, or __TURBOC__ */ +#endif /* not sparc */ +#endif /* not GNU C */ +#endif /* alloca not defined */ +#endif /* YYSTACK_USE_ALLOCA not defined */ + +#ifdef YYSTACK_USE_ALLOCA +#define YYSTACK_ALLOC alloca +#else +#define YYSTACK_ALLOC malloc #endif +/* Note: there must be only one dollar sign in this file. + It is replaced by the list of actions, each action + as one case of the switch. */ + #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY -2 #define YYEOF 0 - #define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab +#define YYABORT goto yyabortlab #define YYERROR goto yyerrlab1 - -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. +/* Like YYERROR except do call yyerror. + This remains here temporarily to ease the + transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ - #define YYFAIL goto yyerrlab - #define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ +#define YYBACKUP(token, value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ - { \ - yychar = (Token); \ - yylval = (Value); \ + { yychar = (token), yylval = (value); \ yychar1 = YYTRANSLATE (yychar); \ YYPOPSTACK; \ goto yybackup; \ } \ else \ - { \ - yyerror ("syntax error: cannot back up"); \ - YYERROR; \ - } \ + { yyerror ("syntax error: cannot back up"); YYERROR; } \ while (0) #define YYTERROR 1 #define YYERRCODE 256 -/* YYLLOC_DEFAULT -- Compute the default location (before the actions - are run). */ - -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - Current.first_line = Rhs[1].first_line; \ - Current.first_column = Rhs[1].first_column; \ - Current.last_line = Rhs[N].last_line; \ - Current.last_column = Rhs[N].last_column; +#ifndef YYPURE +#define YYLEX yylex() #endif -/* YYLEX -- calling `yylex' with the right arguments. */ - -#define YYLEX yylex () - -/* Enable debugging if requested. */ -#if YYDEBUG - -# ifndef YYFPRINTF -# include /* INFRINGES ON USER NAME SPACE */ -# define YYFPRINTF fprintf -# endif - -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (0) -# define YYDSYMPRINT(Args) \ -do { \ - if (yydebug) \ - yysymprint Args; \ -} while (0) -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YYDSYMPRINT(Args) -#endif /* !YYDEBUG */ - -/* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH -# define YYINITDEPTH 200 +#ifdef YYPURE +#ifdef YYLSP_NEEDED +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval, &yylloc) +#endif +#else /* not YYLSP_NEEDED */ +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval) +#endif +#endif /* not YYLSP_NEEDED */ #endif -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). +/* If nonreentrant, generate the variables here */ - Do not make this value too large; the results are undefined if - SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ +#ifndef YYPURE -#if YYMAXDEPTH == 0 -# undef YYMAXDEPTH -#endif +int yychar; /* the lookahead symbol */ +YYSTYPE yylval; /* the semantic value of the */ + /* lookahead symbol */ -#ifndef YYMAXDEPTH -# define YYMAXDEPTH 10000 +#ifdef YYLSP_NEEDED +YYLTYPE yylloc; /* location data for the lookahead */ + /* symbol */ #endif - +int yynerrs; /* number of parse errors so far */ +#endif /* not YYPURE */ -#if YYERROR_VERBOSE +#if YYDEBUG != 0 +int yydebug; /* nonzero means print parse trace */ +/* Since this is uninitialized, it does not stop multiple parsers + from coexisting. */ +#endif -# ifndef yystrlen -# if defined (__GLIBC__) && defined (_STRING_H) -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -static YYSIZE_T -# if defined (__STDC__) || defined (__cplusplus) -yystrlen (const char *yystr) -# else -yystrlen (yystr) - const char *yystr; -# endif -{ - register const char *yys = yystr; +/* YYINITDEPTH indicates the initial size of the parser's stacks */ - while (*yys++ != '\0') - continue; +#ifndef YYINITDEPTH +#define YYINITDEPTH 200 +#endif - return yys - yystr - 1; -} -# endif -# endif - -# ifndef yystpcpy -# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -static char * -# if defined (__STDC__) || defined (__cplusplus) -yystpcpy (char *yydest, const char *yysrc) -# else -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; -# endif -{ - register char *yyd = yydest; - register const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif +/* YYMAXDEPTH is the maximum size the stacks can grow to + (effective only if the built-in stack extension method is used). */ -#endif /* !YYERROR_VERBOSE */ +#if YYMAXDEPTH == 0 +#undef YYMAXDEPTH +#endif +#ifndef YYMAXDEPTH +#define YYMAXDEPTH 10000 +#endif - -#if YYDEBUG -/*-----------------------------. -| Print this symbol on YYOUT. | -`-----------------------------*/ - +/* Define __yy_memcpy. Note that the size argument + should be passed with type unsigned int, because that is what the non-GCC + definitions require. With GCC, __builtin_memcpy takes an arg + of type size_t, but it can handle unsigned int. */ + +#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ +#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) +#else /* not GNU C or C++ */ +#ifndef __cplusplus + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ static void -#if defined (__STDC__) || defined (__cplusplus) -yysymprint (FILE* yyout, int yytype, YYSTYPE yyvalue) -#else -yysymprint (yyout, yytype, yyvalue) - FILE* yyout; - int yytype; - YYSTYPE yyvalue; -#endif +__yy_memcpy (to, from, count) + char *to; + char *from; + unsigned int count; { - /* Pacify ``unused variable'' warnings. */ - (void) yyvalue; - - if (yytype < YYNTOKENS) - { - YYFPRINTF (yyout, "token %s (", yytname[yytype]); -# ifdef YYPRINT - YYPRINT (yyout, yytoknum[yytype], yyvalue); -# endif - } - else - YYFPRINTF (yyout, "nterm %s (", yytname[yytype]); + register char *f = from; + register char *t = to; + register int i = count; - switch (yytype) - { - default: - break; - } - YYFPRINTF (yyout, ")"); + while (i-- > 0) + *t++ = *f++; } -#endif /* YYDEBUG. */ +#else /* __cplusplus */ -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ static void -#if defined (__STDC__) || defined (__cplusplus) -yydestruct (int yytype, YYSTYPE yyvalue) -#else -yydestruct (yytype, yyvalue) - int yytype; - YYSTYPE yyvalue; -#endif +__yy_memcpy (char *to, char *from, unsigned int count) { - /* Pacify ``unused variable'' warnings. */ - (void) yyvalue; + register char *t = to; + register char *f = from; + register int i = count; - switch (yytype) - { - default: - break; - } + while (i-- > 0) + *t++ = *f++; } +#endif +#endif +#line 217 "/usr/share/bison.simple" /* The user can define YYPARSE_PARAM as the name of an argument to be passed into yyparse. The argument should have type void *. @@ -1418,85 +1011,76 @@ yydestruct (yytype, yyvalue) to the proper pointer type. */ #ifdef YYPARSE_PARAM -# if defined (__STDC__) || defined (__cplusplus) -# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM -# define YYPARSE_PARAM_DECL -# else -# define YYPARSE_PARAM_ARG YYPARSE_PARAM -# define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -# endif -#else /* !YYPARSE_PARAM */ -# define YYPARSE_PARAM_ARG -# define YYPARSE_PARAM_DECL -#endif /* !YYPARSE_PARAM */ +#ifdef __cplusplus +#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM +#define YYPARSE_PARAM_DECL +#else /* not __cplusplus */ +#define YYPARSE_PARAM_ARG YYPARSE_PARAM +#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; +#endif /* not __cplusplus */ +#else /* not YYPARSE_PARAM */ +#define YYPARSE_PARAM_ARG +#define YYPARSE_PARAM_DECL +#endif /* not YYPARSE_PARAM */ /* Prevent warning if -Wstrict-prototypes. */ #ifdef __GNUC__ -# ifdef YYPARSE_PARAM +#ifdef YYPARSE_PARAM int yyparse (void *); -# else +#else int yyparse (void); -# endif #endif - - -/* The lookahead symbol. */ -int yychar; - -/* The semantic value of the lookahead symbol. */ -YYSTYPE yylval; - -/* Number of parse errors so far. */ -int yynerrs; - +#endif int -yyparse (YYPARSE_PARAM_ARG) +yyparse(YYPARSE_PARAM_ARG) YYPARSE_PARAM_DECL { - register int yystate; register int yyn; - int yyresult; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - /* Lookahead token as an internal (translated) token number. */ - int yychar1 = 0; - - /* Three stacks and their tools: - `yyss': related to states, - `yyvs': related to semantic values, - `yyls': related to locations. - - Refer to the stacks thru separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - short yyssa[YYINITDEPTH]; - short *yyss = yyssa; register short *yyssp; - - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs = yyvsa; register YYSTYPE *yyvsp; + int yyerrstatus; /* number of tokens to shift before error messages enabled */ + int yychar1 = 0; /* lookahead token as an internal (translated) token number */ + short yyssa[YYINITDEPTH]; /* the state stack */ + YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ + short *yyss = yyssa; /* refer to the stacks thru separate pointers */ + YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ +#ifdef YYLSP_NEEDED + YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ + YYLTYPE *yyls = yylsa; + YYLTYPE *yylsp; + +#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) +#else #define YYPOPSTACK (yyvsp--, yyssp--) +#endif - YYSIZE_T yystacksize = YYINITDEPTH; + int yystacksize = YYINITDEPTH; + int yyfree_stacks = 0; - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; +#ifdef YYPURE + int yychar; + YYSTYPE yylval; + int yynerrs; +#ifdef YYLSP_NEEDED + YYLTYPE yylloc; +#endif +#endif + YYSTYPE yyval; /* the variable used to return */ + /* semantic values from the action */ + /* routines */ - /* When reducing, the number of symbols on the RHS of the reduced - rule. */ int yylen; - YYDPRINTF ((stderr, "Starting parse\n")); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Starting parse\n"); +#endif yystate = 0; yyerrstatus = 0; @@ -1508,96 +1092,110 @@ yyparse (YYPARSE_PARAM_ARG) so that they stay on the same level as the state stack. The wasted elements are never initialized. */ - yyssp = yyss; + yyssp = yyss - 1; yyvsp = yyvs; +#ifdef YYLSP_NEEDED + yylsp = yyls; +#endif - goto yysetstate; - -/*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | -`------------------------------------------------------------*/ - yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. - */ - yyssp++; +/* Push a new state, which is found in yystate . */ +/* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. */ +yynewstate: - yysetstate: - *yyssp = yystate; + *++yyssp = yystate; if (yyssp >= yyss + yystacksize - 1) { + /* Give user a chance to reallocate the stack */ + /* Use copies of these so that the &'s don't force the real ones into memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; +#ifdef YYLSP_NEEDED + YYLTYPE *yyls1 = yyls; +#endif + /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; + int size = yyssp - yyss + 1; #ifdef yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; - - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow ("parser stack overflow", - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; - } + /* Each stack pointer address is followed by the size of + the data in use in that stack, in bytes. */ +#ifdef YYLSP_NEEDED + /* This used to be a conditional around just the two extra args, + but that might be undefined if yyoverflow is a macro. */ + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yyls1, size * sizeof (*yylsp), + &yystacksize); +#else + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yystacksize); +#endif + + yyss = yyss1; yyvs = yyvs1; +#ifdef YYLSP_NEEDED + yyls = yyls1; +#endif #else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyoverflowlab; -# else /* Extend the stack our own way. */ if (yystacksize >= YYMAXDEPTH) - goto yyoverflowlab; + { + yyerror("parser stack overflow"); + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); +#endif + } + return 2; + } yystacksize *= 2; if (yystacksize > YYMAXDEPTH) yystacksize = YYMAXDEPTH; - - { - short *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyoverflowlab; - YYSTACK_RELOCATE (yyss); - YYSTACK_RELOCATE (yyvs); - -# undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } -# endif +#ifndef YYSTACK_USE_ALLOCA + yyfree_stacks = 1; +#endif + yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); + __yy_memcpy ((char *)yyss, (char *)yyss1, + size * (unsigned int) sizeof (*yyssp)); + yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); + __yy_memcpy ((char *)yyvs, (char *)yyvs1, + size * (unsigned int) sizeof (*yyvsp)); +#ifdef YYLSP_NEEDED + yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); + __yy_memcpy ((char *)yyls, (char *)yyls1, + size * (unsigned int) sizeof (*yylsp)); +#endif #endif /* no yyoverflow */ - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; - + yyssp = yyss + size - 1; + yyvsp = yyvs + size - 1; +#ifdef YYLSP_NEEDED + yylsp = yyls + size - 1; +#endif - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Stack size increased to %d\n", yystacksize); +#endif if (yyssp >= yyss + yystacksize - 1) YYABORT; } - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Entering state %d\n", yystate); +#endif goto yybackup; - -/*-----------. -| yybackup. | -`-----------*/ -yybackup: + yybackup: /* Do appropriate processing given the current state. */ /* Read a lookahead token if we need one and don't already have one. */ @@ -1606,7 +1204,7 @@ yyparse (YYPARSE_PARAM_ARG) /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; - if (yyn == YYPACT_NINF) + if (yyn == YYFLAG) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ @@ -1616,141 +1214,146 @@ yyparse (YYPARSE_PARAM_ARG) if (yychar == YYEMPTY) { - YYDPRINTF ((stderr, "Reading a token: ")); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Reading a token: "); +#endif yychar = YYLEX; } - /* Convert token to internal form (in yychar1) for indexing tables with. */ + /* Convert token to internal form (in yychar1) for indexing tables with */ - if (yychar <= 0) /* This means end of input. */ + if (yychar <= 0) /* This means end of input. */ { yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more. */ + yychar = YYEOF; /* Don't call YYLEX any more */ - YYDPRINTF ((stderr, "Now at end of input.\n")); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Now at end of input.\n"); +#endif } else { - yychar1 = YYTRANSLATE (yychar); + yychar1 = YYTRANSLATE(yychar); - /* We have to keep this `#if YYDEBUG', since we use variables - which are defined only if `YYDEBUG' is set. */ - YYDPRINTF ((stderr, "Next token is ")); - YYDSYMPRINT ((stderr, yychar1, yylval)); - YYDPRINTF ((stderr, "\n")); +#if YYDEBUG != 0 + if (yydebug) + { + fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); + /* Give the individual parser a way to print the precise meaning + of a token, for further debugging info. */ +#ifdef YYPRINT + YYPRINT (stderr, yychar, yylval); +#endif + fprintf (stderr, ")\n"); + } +#endif } - /* If the proper action on seeing token YYCHAR1 is to reduce or to - detect an error, take that action. */ yyn += yychar1; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yychar1) + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) goto yydefault; + yyn = yytable[yyn]; - if (yyn <= 0) + + /* yyn is what to do for this token type in this state. + Negative => reduce, -yyn is rule number. + Positive => shift, yyn is new state. + New state is final state => don't bother to shift, + just return success. + 0, or most negative number => error. */ + + if (yyn < 0) { - if (yyn == 0 || yyn == YYTABLE_NINF) + if (yyn == YYFLAG) goto yyerrlab; yyn = -yyn; goto yyreduce; } + else if (yyn == 0) + goto yyerrlab; if (yyn == YYFINAL) YYACCEPT; /* Shift the lookahead token. */ - YYDPRINTF ((stderr, "Shifting token %d (%s), ", - yychar, yytname[yychar1])); + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); +#endif /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; + /* count tokens shifted since error; after three, turn off error status. */ + if (yyerrstatus) yyerrstatus--; yystate = yyn; goto yynewstate; - -/*-----------------------------------------------------------. -| yydefault -- do the default action for the current state. | -`-----------------------------------------------------------*/ +/* Do the default action for the current state. */ yydefault: + yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; - goto yyreduce; - -/*-----------------------------. -| yyreduce -- Do a reduction. | -`-----------------------------*/ +/* Do a reduction. yyn is the number of a rule to reduce with. */ yyreduce: - /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; + if (yylen > 0) + yyval = yyvsp[1-yylen]; /* implement default value of the action */ - /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. - - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval = yyvsp[1-yylen]; - - - -#if YYDEBUG - /* We have to keep this `#if YYDEBUG', since we use variables which - are defined only if `YYDEBUG' is set. */ +#if YYDEBUG != 0 if (yydebug) { - int yyi; + int i; - YYFPRINTF (stderr, "Reducing via rule %d (line %d), ", - yyn - 1, yyrline[yyn]); + fprintf (stderr, "Reducing via rule %d (line %d), ", + yyn, yyrline[yyn]); /* Print the symbols being reduced, and their result. */ - for (yyi = yyprhs[yyn]; yyrhs[yyi] >= 0; yyi++) - YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]); - YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]); + for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) + fprintf (stderr, "%s ", yytname[yyrhs[i]]); + fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); } #endif - switch (yyn) - { - case 2: -#line 299 "asn1p_y.y" - { - *(void **)param = yyvsp[0].a_grammar; - } - break; - case 3: -#line 305 "asn1p_y.y" - { + + switch (yyn) { + +case 1: +#line 301 "asn1p_y.y" +{ + *(void **)param = yyvsp[0].a_grammar; + ; + break;} +case 2: +#line 307 "asn1p_y.y" +{ yyval.a_grammar = asn1p_new(); checkmem(yyval.a_grammar); TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); - } - break; - - case 4: -#line 310 "asn1p_y.y" - { + ; + break;} +case 3: +#line 312 "asn1p_y.y" +{ yyval.a_grammar = yyvsp[-1].a_grammar; TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); - } - break; - - case 5: -#line 331 "asn1p_y.y" - { + ; + break;} +case 4: +#line 333 "asn1p_y.y" +{ if(yyvsp[-1].a_module) { yyval.a_module = yyvsp[-1].a_module; @@ -1763,134 +1366,116 @@ yyparse (YYPARSE_PARAM_ARG) yyval.a_module->Identifier = yyvsp[-7].tv_str; yyval.a_module->module_oid = yyvsp[-6].a_oid; yyval.a_module->module_flags = yyvsp[-4].a_module_flags; - } - break; - - case 6: -#line 352 "asn1p_y.y" - { yyval.a_oid = 0; } - break; - - case 7: -#line 353 "asn1p_y.y" - { yyval.a_oid = yyvsp[0].a_oid; } - break; - - case 8: -#line 357 "asn1p_y.y" - { + ; + break;} +case 5: +#line 354 "asn1p_y.y" +{ yyval.a_oid = 0; ; + break;} +case 6: +#line 355 "asn1p_y.y" +{ yyval.a_oid = yyvsp[0].a_oid; ; + break;} +case 7: +#line 359 "asn1p_y.y" +{ yyval.a_oid = yyvsp[-1].a_oid; - } - break; - - case 9: -#line 360 "asn1p_y.y" - { + ; + break;} +case 8: +#line 362 "asn1p_y.y" +{ yyval.a_oid = 0; - } - break; - - case 10: -#line 366 "asn1p_y.y" - { + ; + break;} +case 9: +#line 368 "asn1p_y.y" +{ yyval.a_oid = asn1p_oid_new(); asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); if(yyvsp[0].a_oid_arc.name) free(yyvsp[0].a_oid_arc.name); - } - break; - - case 11: -#line 372 "asn1p_y.y" - { + ; + break;} +case 10: +#line 374 "asn1p_y.y" +{ yyval.a_oid = yyvsp[-1].a_oid; asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); if(yyvsp[0].a_oid_arc.name) free(yyvsp[0].a_oid_arc.name); - } - break; - - case 12: -#line 381 "asn1p_y.y" - { /* iso */ + ; + break;} +case 11: +#line 383 "asn1p_y.y" +{ /* iso */ yyval.a_oid_arc.name = yyvsp[0].tv_str; yyval.a_oid_arc.number = -1; - } - break; - - case 13: -#line 385 "asn1p_y.y" - { /* iso(1) */ + ; + break;} +case 12: +#line 387 "asn1p_y.y" +{ /* iso(1) */ yyval.a_oid_arc.name = yyvsp[-3].tv_str; yyval.a_oid_arc.number = yyvsp[-1].a_int; - } - break; - - case 14: -#line 389 "asn1p_y.y" - { /* 1 */ + ; + break;} +case 13: +#line 391 "asn1p_y.y" +{ /* 1 */ yyval.a_oid_arc.name = 0; yyval.a_oid_arc.number = yyvsp[0].a_int; - } - break; - - case 15: -#line 399 "asn1p_y.y" - { yyval.a_module_flags = MSF_NOFLAGS; } - break; - - case 16: -#line 400 "asn1p_y.y" - { + ; + break;} +case 14: +#line 401 "asn1p_y.y" +{ yyval.a_module_flags = MSF_NOFLAGS; ; + break;} +case 15: +#line 402 "asn1p_y.y" +{ yyval.a_module_flags = yyvsp[0].a_module_flags; - } - break; - - case 17: -#line 409 "asn1p_y.y" - { + ; + break;} +case 16: +#line 411 "asn1p_y.y" +{ yyval.a_module_flags = yyvsp[0].a_module_flags; - } - break; - - case 18: -#line 412 "asn1p_y.y" - { + ; + break;} +case 17: +#line 414 "asn1p_y.y" +{ yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags; - } - break; - - case 19: -#line 421 "asn1p_y.y" - { + ; + break;} +case 18: +#line 423 "asn1p_y.y" +{ yyval.a_module_flags = MSF_EXPLICIT_TAGS; - } - break; - - case 20: -#line 424 "asn1p_y.y" - { + ; + break;} +case 19: +#line 426 "asn1p_y.y" +{ yyval.a_module_flags = MSF_IMPLICIT_TAGS; - } - break; - - case 21: -#line 427 "asn1p_y.y" - { + ; + break;} +case 20: +#line 429 "asn1p_y.y" +{ yyval.a_module_flags = MSF_AUTOMATIC_TAGS; - } - break; - - case 22: -#line 430 "asn1p_y.y" - { + ; + break;} +case 21: +#line 432 "asn1p_y.y" +{ yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED; - } - break; - - case 23: -#line 434 "asn1p_y.y" - { + ; + break;} +case 22: +#line 436 "asn1p_y.y" +{ /* X.680Amd1 specifies TAG and XER */ if(strcmp(yyvsp[-1].tv_str, "TAG") == 0) { yyval.a_module_flags = MSF_TAG_INSTRUCTIONS; @@ -1904,31 +1489,27 @@ yyparse (YYPARSE_PARAM_ARG) yyval.a_module_flags = MSF_unk_INSTRUCTIONS; } free(yyvsp[-1].tv_str); - } - break; - - case 24: -#line 455 "asn1p_y.y" - { yyval.a_module = 0; } - break; - - case 25: -#line 456 "asn1p_y.y" - { + ; + break;} +case 23: +#line 457 "asn1p_y.y" +{ yyval.a_module = 0; ; + break;} +case 24: +#line 458 "asn1p_y.y" +{ yyval.a_module = yyvsp[0].a_module; - } - break; - - case 26: -#line 465 "asn1p_y.y" - { + ; + break;} +case 25: +#line 467 "asn1p_y.y" +{ yyval.a_module = yyvsp[0].a_module; - } - break; - - case 27: -#line 468 "asn1p_y.y" - { + ; + break;} +case 26: +#line 470 "asn1p_y.y" +{ yyval.a_module = yyvsp[-1].a_module; /* Behave well when one of them is skipped. */ @@ -1954,19 +1535,17 @@ yyparse (YYPARSE_PARAM_ARG) MY_IMPORT(members, next); #undef MY_IMPORT - } - break; - - case 28: -#line 501 "asn1p_y.y" - { + ; + break;} +case 27: +#line 503 "asn1p_y.y" +{ yyval.a_module = yyvsp[0].a_module; - } - break; - - case 29: -#line 504 "asn1p_y.y" - { + ; + break;} +case 28: +#line 506 "asn1p_y.y" +{ yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); if(yyvsp[0].a_xports) { @@ -1974,297 +1553,285 @@ yyparse (YYPARSE_PARAM_ARG) } else { /* "EXPORTS ALL;" ? */ } - } - break; - - case 30: -#line 513 "asn1p_y.y" - { + ; + break;} +case 29: +#line 515 "asn1p_y.y" +{ yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID); assert(yyvsp[0].a_expr->meta_type != AMT_INVALID); TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); - } - break; - - case 31: -#line 520 "asn1p_y.y" - { + ; + break;} +case 30: +#line 522 "asn1p_y.y" +{ yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID); assert(yyvsp[0].a_expr->meta_type != AMT_INVALID); TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); - } - break; - - case 32: -#line 533 "asn1p_y.y" - { + ; + break;} +case 31: +#line 535 "asn1p_y.y" +{ yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID); assert(yyvsp[0].a_expr->meta_type != AMT_INVALID); TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); - } - break; - - case 33: -#line 541 "asn1p_y.y" - { asn1p_lexer_hack_push_encoding_control(); } - break; - - case 34: -#line 542 "asn1p_y.y" - { + ; + break;} +case 32: +#line 543 "asn1p_y.y" +{ asn1p_lexer_hack_push_encoding_control(); ; + break;} +case 33: +#line 544 "asn1p_y.y" +{ fprintf(stderr, "WARNING: ENCODING-CONTROL %s " "specification at line %d ignored\n", yyvsp[-1].tv_str, yylineno); free(yyvsp[-1].tv_str); yyval.a_module = 0; - } - break; - - case 35: -#line 554 "asn1p_y.y" - { + ; + break;} +case 34: +#line 556 "asn1p_y.y" +{ return yyerror( "Attempt to redefine a standard basic type, " "use -ftypesXY to switch back " "to older version of ASN.1 standard"); - } - break; - - case 36: -#line 568 "asn1p_y.y" - { + ; + break;} +case 35: +#line 570 "asn1p_y.y" +{ yyval.a_module = yyvsp[-1].a_module; - } - break; - - case 37: -#line 574 "asn1p_y.y" - { + ; + break;} +case 36: +#line 576 "asn1p_y.y" +{ return yyerror("Empty IMPORTS list"); - } - break; - - case 38: -#line 580 "asn1p_y.y" - { + ; + break;} +case 37: +#line 582 "asn1p_y.y" +{ yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); - } - break; - - case 39: -#line 585 "asn1p_y.y" - { + ; + break;} +case 38: +#line 587 "asn1p_y.y" +{ yyval.a_module = yyvsp[-1].a_module; TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); - } - break; - - case 40: -#line 592 "asn1p_y.y" - { + ; + break;} +case 39: +#line 594 "asn1p_y.y" +{ yyval.a_xports = yyvsp[-3].a_xports; yyval.a_xports->from = yyvsp[-1].tv_str; yyval.a_xports->from_oid = yyvsp[0].a_oid; checkmem(yyval.a_xports); - } - break; - - case 41: -#line 601 "asn1p_y.y" - { + ; + break;} +case 40: +#line 603 "asn1p_y.y" +{ yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - } - break; - - case 42: -#line 606 "asn1p_y.y" - { + ; + break;} +case 41: +#line 608 "asn1p_y.y" +{ yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - } - break; - - case 43: -#line 613 "asn1p_y.y" - { + ; + break;} +case 42: +#line 615 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_REFERENCE; - } - break; - - case 44: -#line 619 "asn1p_y.y" - { + ; + break;} +case 43: +#line 621 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_REFERENCE; - } - break; - - case 45: -#line 628 "asn1p_y.y" - { + ; + break;} +case 44: +#line 630 "asn1p_y.y" +{ yyval.a_xports = yyvsp[-1].a_xports; - } - break; - - case 46: -#line 631 "asn1p_y.y" - { + ; + break;} +case 45: +#line 633 "asn1p_y.y" +{ yyval.a_xports = 0; - } - break; - - case 47: -#line 634 "asn1p_y.y" - { + ; + break;} +case 46: +#line 636 "asn1p_y.y" +{ /* Empty EXPORTS clause effectively prohibits export. */ yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); - } - break; - - case 48: -#line 642 "asn1p_y.y" - { + ; + break;} +case 47: +#line 644 "asn1p_y.y" +{ yyval.a_xports = asn1p_xports_new(); assert(yyval.a_xports); TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - } - break; - - case 49: -#line 647 "asn1p_y.y" - { + ; + break;} +case 48: +#line 649 "asn1p_y.y" +{ yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - } - break; - - case 50: -#line 654 "asn1p_y.y" - { + ; + break;} +case 49: +#line 656 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_EXPORTVAR; - } - break; - - case 51: -#line 660 "asn1p_y.y" - { + ; + break;} +case 50: +#line 662 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_EXPORTVAR; - } - break; - - case 52: -#line 670 "asn1p_y.y" - { + ; + break;} +case 51: +#line 672 "asn1p_y.y" +{ yyval.a_expr = yyvsp[-4].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-5].tv_str; yyval.a_expr->meta_type = AMT_VALUESET; // take care of optValueSetBody - } - break; - - case 53: -#line 680 "asn1p_y.y" - { + ; + break;} +case 52: +#line 682 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->reference = yyvsp[0].a_ref; yyval.a_expr->expr_type = A1TC_REFERENCE; yyval.a_expr->meta_type = AMT_TYPEREF; - } - break; - - case 54: -#line 687 "asn1p_y.y" - { + ; + break;} +case 53: +#line 689 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = yyvsp[0].a_type; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 55: -#line 696 "asn1p_y.y" - { } - break; - - case 56: -#line 697 "asn1p_y.y" - { - } - break; - - case 57: -#line 713 "asn1p_y.y" - { + ; + break;} +case 54: +#line 698 "asn1p_y.y" +{ ; + break;} +case 55: +#line 699 "asn1p_y.y" +{ + ; + break;} +case 56: +#line 710 "asn1p_y.y" +{ + ; + break;} +case 57: +#line 712 "asn1p_y.y" +{ + ; + break;} +case 58: +#line 717 "asn1p_y.y" +{ + ; + break;} +case 59: +#line 719 "asn1p_y.y" +{ + ; + break;} +case 60: +#line 735 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->tag = yyvsp[-1].a_tag; yyval.a_expr->expr_type = A1TC_TYPEID; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 58: -#line 721 "asn1p_y.y" - { + ; + break;} +case 61: +#line 743 "asn1p_y.y" +{ yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->tag = yyvsp[-1].a_tag; assert(yyval.a_expr->expr_type); assert(yyval.a_expr->meta_type); - } - break; - - case 59: -#line 728 "asn1p_y.y" - { + ; + break;} +case 62: +#line 750 "asn1p_y.y" +{ yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; assert(yyval.a_expr->expr_type == A1TC_CLASSDEF); assert(yyval.a_expr->meta_type == AMT_OBJECT); - } - break; - - case 60: -#line 744 "asn1p_y.y" - { + ; + break;} +case 63: +#line 766 "asn1p_y.y" +{ yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-5].tv_str; yyval.a_expr->params = yyvsp[-3].a_plist; yyval.a_expr->meta_type = AMT_PARAMTYPE; - } - break; - - case 61: -#line 754 "asn1p_y.y" - { + ; + break;} +case 64: +#line 776 "asn1p_y.y" +{ int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); checkmem(yyval.a_plist); @@ -2272,232 +1839,207 @@ yyparse (YYPARSE_PARAM_ARG) checkmem(ret == 0); if(yyvsp[0].a_parg.governor) asn1p_ref_free(yyvsp[0].a_parg.governor); if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument); - } - break; - - case 62: -#line 763 "asn1p_y.y" - { + ; + break;} +case 65: +#line 785 "asn1p_y.y" +{ int ret; yyval.a_plist = yyvsp[-2].a_plist; ret = asn1p_paramlist_add_param(yyval.a_plist, yyvsp[0].a_parg.governor, yyvsp[0].a_parg.argument); checkmem(ret == 0); if(yyvsp[0].a_parg.governor) asn1p_ref_free(yyvsp[0].a_parg.governor); if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument); - } - break; - - case 63: -#line 774 "asn1p_y.y" - { + ; + break;} +case 66: +#line 796 "asn1p_y.y" +{ yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; - } - break; - - case 64: -#line 778 "asn1p_y.y" - { + ; + break;} +case 67: +#line 800 "asn1p_y.y" +{ int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); ret = asn1p_ref_add_component(yyval.a_parg.governor, yyvsp[-2].tv_str, 0); checkmem(ret == 0); yyval.a_parg.argument = yyvsp[0].tv_str; - } - break; - - case 65: -#line 785 "asn1p_y.y" - { + ; + break;} +case 68: +#line 807 "asn1p_y.y" +{ int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); ret = asn1p_ref_add_component(yyval.a_parg.governor, ASN_EXPR_TYPE2STR(yyvsp[-2].a_type), 1); checkmem(ret == 0); yyval.a_parg.argument = yyvsp[0].tv_str; - } - break; - - case 66: -#line 796 "asn1p_y.y" - { + ; + break;} +case 69: +#line 818 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 67: -#line 801 "asn1p_y.y" - { + ; + break;} +case 70: +#line 823 "asn1p_y.y" +{ yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 68: -#line 808 "asn1p_y.y" - { + ; + break;} +case 71: +#line 830 "asn1p_y.y" +{ yyval.a_expr = yyvsp[0].a_expr; - } - break; - - case 69: -#line 811 "asn1p_y.y" - { + ; + break;} +case 72: +#line 833 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_REFERENCE; yyval.a_expr->meta_type = AMT_VALUE; - } - break; - - case 70: -#line 824 "asn1p_y.y" - { + ; + break;} +case 73: +#line 846 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 71: -#line 829 "asn1p_y.y" - { + ; + break;} +case 74: +#line 851 "asn1p_y.y" +{ yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 72: -#line 836 "asn1p_y.y" - { + ; + break;} +case 75: +#line 858 "asn1p_y.y" +{ yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-2].tv_nametag.name; yyval.a_expr->tag = yyvsp[-2].tv_nametag.tag; yyval.a_expr->marker = yyvsp[0].a_marker; - } - break; - - case 73: -#line 843 "asn1p_y.y" - { + ; + break;} +case 76: +#line 865 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->meta_type = yyvsp[0].a_expr->meta_type; yyval.a_expr->expr_type = A1TC_COMPONENTS_OF; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 74: -#line 850 "asn1p_y.y" - { + ; + break;} +case 77: +#line 872 "asn1p_y.y" +{ yyval.a_expr = yyvsp[0].a_expr; - } - break; - - case 75: -#line 856 "asn1p_y.y" - { + ; + break;} +case 78: +#line 878 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 76: -#line 861 "asn1p_y.y" - { + ; + break;} +case 79: +#line 883 "asn1p_y.y" +{ yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 77: -#line 868 "asn1p_y.y" - { + ; + break;} +case 80: +#line 890 "asn1p_y.y" +{ yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-1].tv_nametag.name; yyval.a_expr->tag = yyvsp[-1].tv_nametag.tag; - } - break; - - case 78: -#line 874 "asn1p_y.y" - { + ; + break;} +case 81: +#line 896 "asn1p_y.y" +{ yyval.a_expr = yyvsp[0].a_expr; - } - break; - - case 79: -#line 880 "asn1p_y.y" - { + ; + break;} +case 82: +#line 902 "asn1p_y.y" +{ yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); yyval.a_expr->with_syntax = yyvsp[0].a_wsynt; assert(yyval.a_expr->expr_type == A1TC_CLASSDEF); assert(yyval.a_expr->meta_type == AMT_OBJECT); - } - break; - - case 80: -#line 890 "asn1p_y.y" - { yyval.a_int = 0; } - break; - - case 81: -#line 891 "asn1p_y.y" - { yyval.a_int = 1; } - break; - - case 82: -#line 895 "asn1p_y.y" - { + ; + break;} +case 83: +#line 912 "asn1p_y.y" +{ yyval.a_int = 0; ; + break;} +case 84: +#line 913 "asn1p_y.y" +{ yyval.a_int = 1; ; + break;} +case 85: +#line 917 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_CLASSDEF; yyval.a_expr->meta_type = AMT_OBJECT; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 83: -#line 902 "asn1p_y.y" - { + ; + break;} +case 86: +#line 924 "asn1p_y.y" +{ yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 84: -#line 909 "asn1p_y.y" - { + ; + break;} +case 87: +#line 931 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[-1].a_refcomp.name; yyval.a_expr->expr_type = A1TC_CLASSFIELD; yyval.a_expr->meta_type = AMT_OBJECTFIELD; yyval.a_expr->marker = yyvsp[0].a_marker; - } - break; - - case 85: -#line 917 "asn1p_y.y" - { + ; + break;} +case 88: +#line 939 "asn1p_y.y" +{ yyval.a_expr = yyvsp[-2].a_expr; yyval.a_expr->Identifier = yyvsp[-3].a_refcomp.name; yyval.a_expr->marker = yyvsp[-1].a_marker; yyval.a_expr->unique = yyvsp[0].a_int; - } - break; - - case 86: -#line 923 "asn1p_y.y" - { + ; + break;} +case 89: +#line 945 "asn1p_y.y" +{ int ret; yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2511,59 +2053,51 @@ yyparse (YYPARSE_PARAM_ARG) yyval.a_expr->meta_type = AMT_OBJECTFIELD; yyval.a_expr->marker = yyvsp[-1].a_marker; yyval.a_expr->unique = yyvsp[0].a_int; - } - break; - - case 87: -#line 941 "asn1p_y.y" - { yyval.a_wsynt = 0; } - break; - - case 88: -#line 942 "asn1p_y.y" - { + ; + break;} +case 90: +#line 963 "asn1p_y.y" +{ yyval.a_wsynt = 0; ; + break;} +case 91: +#line 964 "asn1p_y.y" +{ yyval.a_wsynt = yyvsp[0].a_wsynt; - } - break; - - case 89: -#line 949 "asn1p_y.y" - { asn1p_lexer_hack_enable_with_syntax(); } - break; - - case 90: -#line 951 "asn1p_y.y" - { + ; + break;} +case 92: +#line 971 "asn1p_y.y" +{ asn1p_lexer_hack_enable_with_syntax(); ; + break;} +case 93: +#line 973 "asn1p_y.y" +{ yyval.a_wsynt = yyvsp[-1].a_wsynt; - } - break; - - case 91: -#line 957 "asn1p_y.y" - { + ; + break;} +case 94: +#line 979 "asn1p_y.y" +{ yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); - } - break; - - case 92: -#line 961 "asn1p_y.y" - { + ; + break;} +case 95: +#line 983 "asn1p_y.y" +{ yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); - } - break; - - case 93: -#line 968 "asn1p_y.y" - { + ; + break;} +case 96: +#line 990 "asn1p_y.y" +{ yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); - } - break; - - case 94: -#line 971 "asn1p_y.y" - { + ; + break;} +case 97: +#line 993 "asn1p_y.y" +{ asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -2571,50 +2105,46 @@ yyparse (YYPARSE_PARAM_ARG) ret = asn1p_ref_add_component(ref, yyvsp[0].a_refcomp.name, yyvsp[0].a_refcomp.lex_type); checkmem(ret == 0); yyval.a_wchunk = asn1p_wsyntx_chunk_fromref(ref, 0); - } - break; - - case 95: -#line 983 "asn1p_y.y" - { - yyval.a_expr = asn1p_expr_new(asn1p_lineno); + ; + break;} +case 98: +#line 1005 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); checkmem(yyval.a_expr->Identifier); yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 96: -#line 991 "asn1p_y.y" - { - yyval.a_expr = asn1p_expr_new(asn1p_lineno); + ; + break;} +case 99: +#line 1013 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); checkmem(yyval.a_expr->Identifier); yyval.a_expr->value = yyvsp[0].a_value; yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 97: -#line 1000 "asn1p_y.y" - { - yyval.a_expr = asn1p_expr_new(asn1p_lineno); + ; + break;} +case 100: +#line 1022 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); yyval.a_expr->value = yyvsp[0].a_value; checkmem(yyval.a_expr->Identifier); yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 98: -#line 1012 "asn1p_y.y" - { + ; + break;} +case 101: +#line 1034 "asn1p_y.y" +{ yyval.a_expr = yyvsp[-1].a_expr; /* * Outer constraint for SEQUENCE OF and SET OF applies @@ -2631,95 +2161,86 @@ yyparse (YYPARSE_PARAM_ARG) yyval.a_expr->constraints = yyvsp[0].a_constr; } } - } - break; - - case 99: -#line 1033 "asn1p_y.y" - { + ; + break;} +case 102: +#line 1055 "asn1p_y.y" +{ yyval.a_expr = yyvsp[0].a_expr; - } - break; - - case 100: -#line 1036 "asn1p_y.y" - { + ; + break;} +case 103: +#line 1058 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = yyvsp[0].a_type; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 101: -#line 1042 "asn1p_y.y" - { + ; + break;} +case 104: +#line 1064 "asn1p_y.y" +{ yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); yyval.a_expr->expr_type = ASN_CONSTR_CHOICE; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 102: -#line 1048 "asn1p_y.y" - { + ; + break;} +case 105: +#line 1070 "asn1p_y.y" +{ yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 103: -#line 1054 "asn1p_y.y" - { + ; + break;} +case 106: +#line 1076 "asn1p_y.y" +{ yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); yyval.a_expr->expr_type = ASN_CONSTR_SET; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 104: -#line 1060 "asn1p_y.y" - { - yyval.a_expr = asn1p_expr_new(asn1p_lineno); + ; + break;} +case 107: +#line 1082 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->constraints = yyvsp[-2].a_constr; yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE_OF; yyval.a_expr->meta_type = AMT_TYPE; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 105: -#line 1068 "asn1p_y.y" - { - yyval.a_expr = asn1p_expr_new(asn1p_lineno); + ; + break;} +case 108: +#line 1090 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->constraints = yyvsp[-2].a_constr; yyval.a_expr->expr_type = ASN_CONSTR_SET_OF; yyval.a_expr->meta_type = AMT_TYPE; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 106: -#line 1076 "asn1p_y.y" - { - yyval.a_expr = asn1p_expr_new(asn1p_lineno); + ; + break;} +case 109: +#line 1098 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = ASN_TYPE_ANY; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 107: -#line 1082 "asn1p_y.y" - { + ; + break;} +case 110: +#line 1104 "asn1p_y.y" +{ int ret; - yyval.a_expr = asn1p_expr_new(asn1p_lineno); + yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->reference = asn1p_ref_new(yylineno); ret = asn1p_ref_add_component(yyval.a_expr->reference, @@ -2727,12 +2248,11 @@ yyparse (YYPARSE_PARAM_ARG) checkmem(ret == 0); yyval.a_expr->expr_type = ASN_TYPE_ANY; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 108: -#line 1096 "asn1p_y.y" - { + ; + break;} +case 111: +#line 1118 "asn1p_y.y" +{ int ret; yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == 0); @@ -2745,46 +2265,42 @@ yyparse (YYPARSE_PARAM_ARG) free(yyvsp[-3].tv_str); yyval.a_expr->expr_type = A1TC_PARAMETRIZED; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 109: -#line 1120 "asn1p_y.y" - { + ; + break;} +case 112: +#line 1142 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->reference = yyvsp[0].a_ref; yyval.a_expr->expr_type = A1TC_REFERENCE; yyval.a_expr->meta_type = AMT_TYPEREF; - } - break; - - case 110: -#line 1127 "asn1p_y.y" - { + ; + break;} +case 113: +#line 1149 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->reference = yyvsp[0].a_ref; yyval.a_expr->expr_type = A1TC_INSTANCE; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 111: -#line 1142 "asn1p_y.y" - { + ; + break;} +case 114: +#line 1164 "asn1p_y.y" +{ int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_UNKNOWN); checkmem(ret == 0); free(yyvsp[0].tv_str); - } - break; - - case 112: -#line 1150 "asn1p_y.y" - { + ; + break;} +case 115: +#line 1172 "asn1p_y.y" +{ int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); @@ -2793,12 +2309,11 @@ yyparse (YYPARSE_PARAM_ARG) ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_UNKNOWN); checkmem(ret == 0); free(yyvsp[-2].tv_str); - } - break; - - case 113: -#line 1160 "asn1p_y.y" - { + ; + break;} +case 116: +#line 1182 "asn1p_y.y" +{ int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); @@ -2807,24 +2322,22 @@ yyparse (YYPARSE_PARAM_ARG) ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_lowercase); checkmem(ret == 0); free(yyvsp[-2].tv_str); - } - break; - - case 114: -#line 1170 "asn1p_y.y" - { + ; + break;} +case 117: +#line 1192 "asn1p_y.y" +{ int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_CAPITALS); free(yyvsp[0].tv_str); checkmem(ret == 0); - } - break; - - case 115: -#line 1178 "asn1p_y.y" - { + ; + break;} +case 118: +#line 1200 "asn1p_y.y" +{ int ret; yyval.a_ref = yyvsp[0].a_ref; ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[-2].tv_str, RLT_CAPITALS); @@ -2842,114 +2355,101 @@ yyparse (YYPARSE_PARAM_ARG) * (yyval.a_ref->comp_count - 1)); yyval.a_ref->components[0] = tmp_comp; } - } - break; - - case 116: -#line 1200 "asn1p_y.y" - { + ; + break;} +case 119: +#line 1222 "asn1p_y.y" +{ int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].a_refcomp.name, yyvsp[0].a_refcomp.lex_type); free(yyvsp[0].a_refcomp.name); checkmem(ret == 0); - } - break; - - case 117: -#line 1208 "asn1p_y.y" - { + ; + break;} +case 120: +#line 1230 "asn1p_y.y" +{ int ret; yyval.a_ref = yyvsp[-2].a_ref; ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].a_refcomp.name, yyvsp[0].a_refcomp.lex_type); free(yyvsp[0].a_refcomp.name); checkmem(ret == 0); - } - break; - - case 120: -#line 1222 "asn1p_y.y" - { + ; + break;} +case 123: +#line 1244 "asn1p_y.y" +{ yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; - } - break; - - case 121: -#line 1227 "asn1p_y.y" - { + ; + break;} +case 124: +#line 1249 "asn1p_y.y" +{ yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; - } - break; - - case 122: -#line 1240 "asn1p_y.y" - { + ; + break;} +case 125: +#line 1262 "asn1p_y.y" +{ yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->value = yyvsp[0].a_value; - } - break; - - case 123: -#line 1250 "asn1p_y.y" - { asn1p_lexer_hack_push_opaque_state(); } - break; - - case 124: -#line 1251 "asn1p_y.y" - { + ; + break;} +case 126: +#line 1272 "asn1p_y.y" +{ asn1p_lexer_hack_push_opaque_state(); ; + break;} +case 127: +#line 1273 "asn1p_y.y" +{ yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); yyval.a_value->type = ATV_UNPARSED; - } - break; - - case 125: -#line 1256 "asn1p_y.y" - { + ; + break;} +case 128: +#line 1278 "asn1p_y.y" +{ yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); - } - break; - - case 126: -#line 1260 "asn1p_y.y" - { + ; + break;} +case 129: +#line 1282 "asn1p_y.y" +{ yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); - } - break; - - case 127: -#line 1264 "asn1p_y.y" - { + ; + break;} +case 130: +#line 1286 "asn1p_y.y" +{ yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); - } - break; - - case 128: -#line 1268 "asn1p_y.y" - { + ; + break;} +case 131: +#line 1290 "asn1p_y.y" +{ yyval.a_value = yyvsp[0].a_value; - } - break; - - case 129: -#line 1271 "asn1p_y.y" - { + ; + break;} +case 132: +#line 1293 "asn1p_y.y" +{ yyval.a_value = yyvsp[0].a_value; - } - break; - - case 130: -#line 1277 "asn1p_y.y" - { + ; + break;} +case 133: +#line 1299 "asn1p_y.y" +{ asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -2959,12 +2459,11 @@ yyparse (YYPARSE_PARAM_ARG) yyval.a_value = asn1p_value_fromref(ref, 0); checkmem(yyval.a_value); free(yyvsp[0].tv_str); - } - break; - - case 131: -#line 1288 "asn1p_y.y" - { + ; + break;} +case 134: +#line 1310 "asn1p_y.y" +{ asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -2977,12 +2476,11 @@ yyparse (YYPARSE_PARAM_ARG) checkmem(yyval.a_value); free(yyvsp[-2].tv_str); free(yyvsp[0].tv_str); - } - break; - - case 132: -#line 1305 "asn1p_y.y" - { + ; + break;} +case 135: +#line 1327 "asn1p_y.y" +{ yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 2; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); checkmem(yyval.tv_opaque.buf); @@ -2991,12 +2489,11 @@ yyparse (YYPARSE_PARAM_ARG) memcpy(yyval.tv_opaque.buf + 2, yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len); yyval.tv_opaque.buf[yyval.tv_opaque.len] = '\0'; free(yyvsp[0].tv_opaque.buf); - } - break; - - case 133: -#line 1315 "asn1p_y.y" - { + ; + break;} +case 136: +#line 1337 "asn1p_y.y" +{ int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); checkmem(p); @@ -3007,363 +2504,312 @@ yyparse (YYPARSE_PARAM_ARG) free(yyvsp[0].tv_opaque.buf); yyval.tv_opaque.buf = p; yyval.tv_opaque.len = newsize; - } - break; - - case 134: -#line 1330 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_BOOLEAN; } - break; - - case 135: -#line 1331 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_NULL; } - break; - - case 136: -#line 1332 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_REAL; } - break; - - case 137: -#line 1333 "asn1p_y.y" - { yyval.a_type = yyvsp[0].a_type; } - break; - - case 138: -#line 1334 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_OCTET_STRING; } - break; - - case 139: -#line 1335 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; } - break; - - case 140: -#line 1336 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_RELATIVE_OID; } - break; - - case 141: -#line 1337 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_EXTERNAL; } - break; - - case 142: -#line 1338 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; } - break; - - case 143: -#line 1339 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_CHARACTER_STRING; } - break; - - case 144: -#line 1340 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_UTCTime; } - break; - - case 145: -#line 1341 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_GeneralizedTime; } - break; - - case 146: -#line 1348 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_INTEGER; } - break; - - case 147: -#line 1349 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_ENUMERATED; } - break; - - case 148: -#line 1350 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_BIT_STRING; } - break; - - case 149: + ; + break;} +case 137: +#line 1352 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_BOOLEAN; ; + break;} +case 138: +#line 1353 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_NULL; ; + break;} +case 139: #line 1354 "asn1p_y.y" - { - yyval.a_expr = asn1p_expr_new(asn1p_lineno); +{ yyval.a_type = ASN_BASIC_REAL; ; + break;} +case 140: +#line 1355 "asn1p_y.y" +{ yyval.a_type = yyvsp[0].a_type; ; + break;} +case 141: +#line 1356 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_OCTET_STRING; ; + break;} +case 142: +#line 1357 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; + break;} +case 143: +#line 1358 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_RELATIVE_OID; ; + break;} +case 144: +#line 1359 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_EXTERNAL; ; + break;} +case 145: +#line 1360 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; + break;} +case 146: +#line 1361 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; + break;} +case 147: +#line 1362 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_UTCTime; ; + break;} +case 148: +#line 1363 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_GeneralizedTime; ; + break;} +case 149: +#line 1370 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_INTEGER; ; + break;} +case 150: +#line 1371 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_ENUMERATED; ; + break;} +case 151: +#line 1372 "asn1p_y.y" +{ yyval.a_type = ASN_BASIC_BIT_STRING; ; + break;} +case 152: +#line 1376 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = yyvsp[0].a_type; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 150: -#line 1360 "asn1p_y.y" - { + ; + break;} +case 153: +#line 1382 "asn1p_y.y" +{ if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; } else { - yyval.a_expr = asn1p_expr_new(asn1p_lineno); + yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); } yyval.a_expr->expr_type = yyvsp[-1].a_type; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 151: -#line 1373 "asn1p_y.y" - { yyval.a_type = ASN_STRING_BMPString; } - break; - - case 152: -#line 1374 "asn1p_y.y" - { + ; + break;} +case 154: +#line 1395 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_BMPString; ; + break;} +case 155: +#line 1396 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_GeneralString; return yyerror("GeneralString is not supported"); - } - break; - - case 153: -#line 1378 "asn1p_y.y" - { + ; + break;} +case 156: +#line 1400 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_GraphicString; return yyerror("GraphicString is not supported"); - } - break; - - case 154: -#line 1382 "asn1p_y.y" - { yyval.a_type = ASN_STRING_IA5String; } - break; - - case 155: -#line 1383 "asn1p_y.y" - { yyval.a_type = ASN_STRING_ISO646String; } - break; - - case 156: -#line 1384 "asn1p_y.y" - { yyval.a_type = ASN_STRING_NumericString; } - break; - - case 157: -#line 1385 "asn1p_y.y" - { yyval.a_type = ASN_STRING_PrintableString; } - break; - - case 158: -#line 1386 "asn1p_y.y" - { + ; + break;} +case 157: +#line 1404 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_IA5String; ; + break;} +case 158: +#line 1405 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_ISO646String; ; + break;} +case 159: +#line 1406 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_NumericString; ; + break;} +case 160: +#line 1407 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_PrintableString; ; + break;} +case 161: +#line 1408 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_T61String; return yyerror("T61String not implemented yet"); - } - break; - - case 159: -#line 1390 "asn1p_y.y" - { yyval.a_type = ASN_STRING_TeletexString; } - break; - - case 160: -#line 1391 "asn1p_y.y" - { yyval.a_type = ASN_STRING_UniversalString; } - break; - - case 161: -#line 1392 "asn1p_y.y" - { yyval.a_type = ASN_STRING_UTF8String; } - break; - - case 162: -#line 1393 "asn1p_y.y" - { + ; + break;} +case 162: +#line 1412 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_TeletexString; ; + break;} +case 163: +#line 1413 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_UniversalString; ; + break;} +case 164: +#line 1414 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_UTF8String; ; + break;} +case 165: +#line 1415 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_VideotexString; return yyerror("VideotexString is no longer supported"); - } - break; - - case 163: -#line 1397 "asn1p_y.y" - { yyval.a_type = ASN_STRING_VisibleString; } - break; - - case 164: -#line 1398 "asn1p_y.y" - { yyval.a_type = ASN_STRING_ObjectDescriptor; } - break; - - case 170: -#line 1410 "asn1p_y.y" - { yyval.a_constr = 0; } - break; - - case 171: -#line 1411 "asn1p_y.y" - { + ; + break;} +case 166: +#line 1419 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_VisibleString; ; + break;} +case 167: +#line 1420 "asn1p_y.y" +{ yyval.a_type = ASN_STRING_ObjectDescriptor; ; + break;} +case 173: +#line 1432 "asn1p_y.y" +{ yyval.a_constr = 0; ; + break;} +case 174: +#line 1433 "asn1p_y.y" +{ yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 172: -#line 1417 "asn1p_y.y" - { + ; + break;} +case 175: +#line 1439 "asn1p_y.y" +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); - } - break; - - case 173: -#line 1420 "asn1p_y.y" - { + ; + break;} +case 176: +#line 1442 "asn1p_y.y" +{ /* * This is a special case, for compatibility purposes. * It goes without parentheses. */ CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_SIZE, yyvsp[-1].a_constr, 0); - } - break; - - case 174: -#line 1430 "asn1p_y.y" - { + ; + break;} +case 177: +#line 1452 "asn1p_y.y" +{ yyval.a_constr = yyvsp[-1].a_constr; - } - break; - - case 175: -#line 1433 "asn1p_y.y" - { + ; + break;} +case 178: +#line 1455 "asn1p_y.y" +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); - } - break; - - case 176: -#line 1439 "asn1p_y.y" - { + ; + break;} +case 179: +#line 1461 "asn1p_y.y" +{ yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 177: -#line 1442 "asn1p_y.y" - { + ; + break;} +case 180: +#line 1464 "asn1p_y.y" +{ asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); ct->type = ACT_EL_EXT; CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); - } - break; - - case 178: -#line 1448 "asn1p_y.y" - { + ; + break;} +case 181: +#line 1470 "asn1p_y.y" +{ asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); ct->type = ACT_EL_EXT; CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-4].a_constr, ct); ct = yyval.a_constr; CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, ct, yyvsp[0].a_constr); - } - break; - - case 179: -#line 1459 "asn1p_y.y" - { + ; + break;} +case 182: +#line 1481 "asn1p_y.y" +{ yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 180: -#line 1462 "asn1p_y.y" - { + ; + break;} +case 183: +#line 1484 "asn1p_y.y" +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); - } - break; - - case 181: -#line 1465 "asn1p_y.y" - { + ; + break;} +case 184: +#line 1487 "asn1p_y.y" +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); - } - break; - - case 182: -#line 1468 "asn1p_y.y" - { + ; + break;} +case 185: +#line 1490 "asn1p_y.y" +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); - } - break; - - case 183: -#line 1474 "asn1p_y.y" - { + ; + break;} +case 186: +#line 1496 "asn1p_y.y" +{ int ret; yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-3].a_ctype; ret = asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr); checkmem(ret == 0); - } - break; - - case 184: -#line 1482 "asn1p_y.y" - { + ; + break;} +case 187: +#line 1504 "asn1p_y.y" +{ int ret; yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_CA_SET; ret = asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr); checkmem(ret == 0); - } - break; - - case 185: -#line 1490 "asn1p_y.y" - { + ; + break;} +case 188: +#line 1512 "asn1p_y.y" +{ yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_VALUE; yyval.a_constr->value = yyvsp[0].a_value; - } - break; - - case 186: -#line 1496 "asn1p_y.y" - { + ; + break;} +case 189: +#line 1518 "asn1p_y.y" +{ yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-1].a_ctype; yyval.a_constr->range_start = yyvsp[-2].a_value; yyval.a_constr->range_stop = yyvsp[0].a_value; - } - break; - - case 187: -#line 1503 "asn1p_y.y" - { + ; + break;} +case 190: +#line 1525 "asn1p_y.y" +{ yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-1].a_ctype; yyval.a_constr->range_start = asn1p_value_fromint(-123); yyval.a_constr->range_stop = yyvsp[0].a_value; yyval.a_constr->range_start->type = ATV_MIN; - } - break; - - case 188: -#line 1511 "asn1p_y.y" - { + ; + break;} +case 191: +#line 1533 "asn1p_y.y" +{ yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-1].a_ctype; yyval.a_constr->range_start = yyvsp[-2].a_value; yyval.a_constr->range_stop = asn1p_value_fromint(321); yyval.a_constr->range_stop->type = ATV_MAX; - } - break; - - case 189: -#line 1519 "asn1p_y.y" - { + ; + break;} +case 192: +#line 1541 "asn1p_y.y" +{ yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-1].a_ctype; @@ -3371,67 +2817,57 @@ yyparse (YYPARSE_PARAM_ARG) yyval.a_constr->range_stop = asn1p_value_fromint(321); yyval.a_constr->range_start->type = ATV_MIN; yyval.a_constr->range_stop->type = ATV_MAX; - } - break; - - case 190: -#line 1528 "asn1p_y.y" - { + ; + break;} +case 193: +#line 1550 "asn1p_y.y" +{ yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 191: -#line 1531 "asn1p_y.y" - { + ; + break;} +case 194: +#line 1553 "asn1p_y.y" +{ yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 192: -#line 1537 "asn1p_y.y" - { yyval.a_ctype = ACT_EL_RANGE; } - break; - - case 193: -#line 1538 "asn1p_y.y" - { yyval.a_ctype = ACT_EL_RLRANGE; } - break; - - case 194: -#line 1539 "asn1p_y.y" - { yyval.a_ctype = ACT_EL_LLRANGE; } - break; - - case 195: -#line 1540 "asn1p_y.y" - { yyval.a_ctype = ACT_EL_ULRANGE; } - break; - - case 196: -#line 1544 "asn1p_y.y" - { + ; + break;} +case 195: +#line 1559 "asn1p_y.y" +{ yyval.a_ctype = ACT_EL_RANGE; ; + break;} +case 196: +#line 1560 "asn1p_y.y" +{ yyval.a_ctype = ACT_EL_RLRANGE; ; + break;} +case 197: +#line 1561 "asn1p_y.y" +{ yyval.a_ctype = ACT_EL_LLRANGE; ; + break;} +case 198: +#line 1562 "asn1p_y.y" +{ yyval.a_ctype = ACT_EL_ULRANGE; ; + break;} +case 199: +#line 1566 "asn1p_y.y" +{ yyval.a_ctype = ACT_CT_SIZE; - } - break; - - case 197: -#line 1547 "asn1p_y.y" - { + ; + break;} +case 200: +#line 1569 "asn1p_y.y" +{ yyval.a_ctype = ACT_CT_FROM; - } - break; - - case 198: -#line 1553 "asn1p_y.y" - { + ; + break;} +case 201: +#line 1575 "asn1p_y.y" +{ yyval.a_value = yyvsp[0].a_value; - } - break; - - case 199: -#line 1556 "asn1p_y.y" - { + ; + break;} +case 202: +#line 1578 "asn1p_y.y" +{ asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -3441,124 +2877,108 @@ yyparse (YYPARSE_PARAM_ARG) yyval.a_value = asn1p_value_fromref(ref, 0); checkmem(yyval.a_value); free(yyvsp[0].tv_str); - } - break; - - case 200: -#line 1567 "asn1p_y.y" - { + ; + break;} +case 203: +#line 1589 "asn1p_y.y" +{ yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); - } - break; - - case 201: -#line 1572 "asn1p_y.y" - { + ; + break;} +case 204: +#line 1594 "asn1p_y.y" +{ yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_FALSE; - } - break; - - case 202: -#line 1577 "asn1p_y.y" - { + ; + break;} +case 205: +#line 1599 "asn1p_y.y" +{ yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); - yyval.a_value->type = ATV_TRUE; - } - break; - - case 203: -#line 1585 "asn1p_y.y" - { + yyval.a_value->type = ATV_TRUE; + ; + break;} +case 206: +#line 1607 "asn1p_y.y" +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); - } - break; - - case 204: -#line 1591 "asn1p_y.y" - { + ; + break;} +case 207: +#line 1613 "asn1p_y.y" +{ yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 205: -#line 1594 "asn1p_y.y" - { + ; + break;} +case 208: +#line 1616 "asn1p_y.y" +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); - } - break; - - case 206: -#line 1600 "asn1p_y.y" - { + ; + break;} +case 209: +#line 1622 "asn1p_y.y" +{ yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_EXT; - } - break; - - case 207: -#line 1605 "asn1p_y.y" - { + ; + break;} +case 210: +#line 1627 "asn1p_y.y" +{ yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_VALUE; yyval.a_constr->value = asn1p_value_frombuf(yyvsp[-2].tv_str, strlen(yyvsp[-2].tv_str), 0); yyval.a_constr->presence = yyvsp[0].a_pres; - } - break; - - case 208: -#line 1618 "asn1p_y.y" - { yyval.a_pres = ACPRES_DEFAULT; } - break; - - case 209: -#line 1619 "asn1p_y.y" - { yyval.a_pres = yyvsp[0].a_pres; } - break; - - case 210: -#line 1623 "asn1p_y.y" - { + ; + break;} +case 211: +#line 1640 "asn1p_y.y" +{ yyval.a_pres = ACPRES_DEFAULT; ; + break;} +case 212: +#line 1641 "asn1p_y.y" +{ yyval.a_pres = yyvsp[0].a_pres; ; + break;} +case 213: +#line 1645 "asn1p_y.y" +{ yyval.a_pres = ACPRES_PRESENT; - } - break; - - case 211: -#line 1626 "asn1p_y.y" - { + ; + break;} +case 214: +#line 1648 "asn1p_y.y" +{ yyval.a_pres = ACPRES_ABSENT; - } - break; - - case 212: -#line 1629 "asn1p_y.y" - { + ; + break;} +case 215: +#line 1651 "asn1p_y.y" +{ yyval.a_pres = ACPRES_OPTIONAL; - } - break; - - case 213: -#line 1635 "asn1p_y.y" - { + ; + break;} +case 216: +#line 1657 "asn1p_y.y" +{ yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 214: -#line 1638 "asn1p_y.y" - { + ; + break;} +case 217: +#line 1660 "asn1p_y.y" +{ yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 215: -#line 1647 "asn1p_y.y" - { + ; + break;} +case 218: +#line 1669 "asn1p_y.y" +{ asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; int ret; @@ -3569,41 +2989,37 @@ yyparse (YYPARSE_PARAM_ARG) ct->type = ACT_EL_VALUE; ct->value = asn1p_value_fromref(ref, 0); CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, ct, 0); - } - break; - - case 216: -#line 1662 "asn1p_y.y" - { + ; + break;} +case 219: +#line 1684 "asn1p_y.y" +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); - } - break; - - case 217: -#line 1668 "asn1p_y.y" - { + ; + break;} +case 220: +#line 1690 "asn1p_y.y" +{ yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_VALUE; yyval.a_constr->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); - } - break; - - case 218: -#line 1674 "asn1p_y.y" - { + ; + break;} +case 221: +#line 1696 "asn1p_y.y" +{ asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); checkmem(ct); ct->type = ACT_EL_VALUE; ct->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); - } - break; - - case 219: -#line 1688 "asn1p_y.y" - { + ; + break;} +case 222: +#line 1710 "asn1p_y.y" +{ char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; *p = '@'; @@ -3613,12 +3029,11 @@ yyparse (YYPARSE_PARAM_ARG) checkmem(ret == 0); free(p); free(yyvsp[0].tv_str); - } - break; - - case 220: -#line 1699 "asn1p_y.y" - { + ; + break;} +case 223: +#line 1721 "asn1p_y.y" +{ char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; p[0] = '@'; @@ -3629,19 +3044,17 @@ yyparse (YYPARSE_PARAM_ARG) checkmem(ret == 0); free(p); free(yyvsp[0].tv_str); - } - break; - - case 221: -#line 1715 "asn1p_y.y" - { + ; + break;} +case 224: +#line 1737 "asn1p_y.y" +{ yyval.tv_str = yyvsp[0].tv_str; - } - break; - - case 222: -#line 1718 "asn1p_y.y" - { + ; + break;} +case 225: +#line 1740 "asn1p_y.y" +{ int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); yyval.tv_str = malloc(l1 + 1 + l3 + 1); @@ -3649,469 +3062,437 @@ yyparse (YYPARSE_PARAM_ARG) yyval.tv_str[l1] = '.'; memcpy(yyval.tv_str + l1 + 1, yyvsp[0].tv_str, l3); yyval.tv_str[l1 + 1 + l3] = '\0'; - } - break; - - case 223: -#line 1736 "asn1p_y.y" - { yyval.a_marker = EM_NOMARK; } - break; - - case 224: -#line 1737 "asn1p_y.y" - { yyval.a_marker = yyvsp[0].a_marker; } - break; - - case 225: -#line 1741 "asn1p_y.y" - { + ; + break;} +case 226: +#line 1758 "asn1p_y.y" +{ yyval.a_marker = EM_NOMARK; ; + break;} +case 227: +#line 1759 "asn1p_y.y" +{ yyval.a_marker = yyvsp[0].a_marker; ; + break;} +case 228: +#line 1763 "asn1p_y.y" +{ yyval.a_marker = EM_OPTIONAL; - } - break; - - case 226: -#line 1744 "asn1p_y.y" - { + ; + break;} +case 229: +#line 1766 "asn1p_y.y" +{ yyval.a_marker = EM_DEFAULT; /* FIXME: store DefaultValue somewhere */ - } - break; - - case 227: -#line 1751 "asn1p_y.y" - { - } - break; - - case 228: -#line 1753 "asn1p_y.y" - { - } - break; - - case 229: -#line 1755 "asn1p_y.y" - { asn1p_lexer_hack_push_opaque_state(); } - break; - - case 230: -#line 1755 "asn1p_y.y" - { - } - break; - - case 231: -#line 1776 "asn1p_y.y" - { - yyval.a_expr = asn1p_expr_new(asn1p_lineno); + ; + break;} +case 230: +#line 1773 "asn1p_y.y" +{ + ; + break;} +case 231: +#line 1775 "asn1p_y.y" +{ + ; + break;} +case 232: +#line 1777 "asn1p_y.y" +{ asn1p_lexer_hack_push_opaque_state(); ; + break;} +case 233: +#line 1777 "asn1p_y.y" +{ + ; + break;} +case 234: +#line 1798 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); - } - break; - - case 232: -#line 1780 "asn1p_y.y" - { + ; + break;} +case 235: +#line 1802 "asn1p_y.y" +{ yyval.a_expr = yyvsp[-1].a_expr; - } - break; - - case 233: -#line 1786 "asn1p_y.y" - { - yyval.a_expr = asn1p_expr_new(asn1p_lineno); + ; + break;} +case 236: +#line 1808 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 234: -#line 1791 "asn1p_y.y" - { + ; + break;} +case 237: +#line 1813 "asn1p_y.y" +{ yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 235: -#line 1798 "asn1p_y.y" - { - yyval.a_expr = asn1p_expr_new(asn1p_lineno); + ; + break;} +case 238: +#line 1820 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->Identifier = yyvsp[0].tv_str; - } - break; - - case 236: -#line 1805 "asn1p_y.y" - { - yyval.a_expr = asn1p_expr_new(asn1p_lineno); + ; + break;} +case 239: +#line 1827 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->value = yyvsp[-1].a_value; - } - break; - - case 237: -#line 1813 "asn1p_y.y" - { - yyval.a_expr = asn1p_expr_new(asn1p_lineno); + ; + break;} +case 240: +#line 1835 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->value = yyvsp[-1].a_value; - } - break; - - case 238: -#line 1821 "asn1p_y.y" - { - yyval.a_expr = asn1p_expr_new(asn1p_lineno); + ; + break;} +case 241: +#line 1843 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->value = yyvsp[0].a_value; - } - break; - - case 239: -#line 1828 "asn1p_y.y" - { - yyval.a_expr = asn1p_expr_new(asn1p_lineno); + ; + break;} +case 242: +#line 1850 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); checkmem(yyval.a_expr->Identifier); yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_VALUE; - } - break; - - case 240: -#line 1839 "asn1p_y.y" - { + ; + break;} +case 243: +#line 1861 "asn1p_y.y" +{ yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); - } - break; - - case 241: -#line 1843 "asn1p_y.y" - { + ; + break;} +case 244: +#line 1865 "asn1p_y.y" +{ yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); - } - break; - - case 242: -#line 1874 "asn1p_y.y" - { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); } - break; - - case 243: -#line 1875 "asn1p_y.y" - { yyval.a_tag = yyvsp[0].a_tag; } - break; - - case 244: -#line 1879 "asn1p_y.y" - { + ; + break;} +case 245: +#line 1896 "asn1p_y.y" +{ memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; + break;} +case 246: +#line 1897 "asn1p_y.y" +{ yyval.a_tag = yyvsp[0].a_tag; ; + break;} +case 247: +#line 1901 "asn1p_y.y" +{ yyval.a_tag = yyvsp[0].a_tag; yyval.a_tag.tag_mode = TM_DEFAULT; - } - break; - - case 245: -#line 1883 "asn1p_y.y" - { + ; + break;} +case 248: +#line 1905 "asn1p_y.y" +{ yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_IMPLICIT; - } - break; - - case 246: -#line 1887 "asn1p_y.y" - { + ; + break;} +case 249: +#line 1909 "asn1p_y.y" +{ yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_EXPLICIT; - } - break; - - case 247: -#line 1894 "asn1p_y.y" - { + ; + break;} +case 250: +#line 1916 "asn1p_y.y" +{ checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - } - break; - - case 248: -#line 1898 "asn1p_y.y" - { + ; + break;} +case 251: +#line 1920 "asn1p_y.y" +{ checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - } - break; - - case 249: -#line 1906 "asn1p_y.y" - { + ; + break;} +case 252: +#line 1928 "asn1p_y.y" +{ checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - } - break; - - case 250: -#line 1913 "asn1p_y.y" - { + ; + break;} +case 253: +#line 1935 "asn1p_y.y" +{ checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - } - break; - - case 251: -#line 1920 "asn1p_y.y" - { + ; + break;} +case 254: +#line 1942 "asn1p_y.y" +{ memset(&yyval.tv_nametag, 0, sizeof(yyval.tv_nametag)); yyval.tv_nametag.name = yyvsp[0].tv_str; - } - break; - - case 252: -#line 1924 "asn1p_y.y" - { + ; + break;} +case 255: +#line 1946 "asn1p_y.y" +{ yyval.tv_nametag.name = yyvsp[-1].tv_str; yyval.tv_nametag.tag = yyvsp[0].a_tag; - } - break; - - - } - -/* Line 1016 of /usr/local/share/bison/yacc.c. */ -#line 3896 "asn1p_y.c" + ; + break;} +} + /* the action file gets copied in in place of this dollarsign */ +#line 543 "/usr/share/bison.simple" yyvsp -= yylen; yyssp -= yylen; +#ifdef YYLSP_NEEDED + yylsp -= yylen; +#endif - -#if YYDEBUG +#if YYDEBUG != 0 if (yydebug) { - short *yyssp1 = yyss - 1; - YYFPRINTF (stderr, "state stack now"); - while (yyssp1 != yyssp) - YYFPRINTF (stderr, " %d", *++yyssp1); - YYFPRINTF (stderr, "\n"); + short *ssp1 = yyss - 1; + fprintf (stderr, "state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); } #endif *++yyvsp = yyval; +#ifdef YYLSP_NEEDED + yylsp++; + if (yylen == 0) + { + yylsp->first_line = yylloc.first_line; + yylsp->first_column = yylloc.first_column; + yylsp->last_line = (yylsp-1)->last_line; + yylsp->last_column = (yylsp-1)->last_column; + yylsp->text = 0; + } + else + { + yylsp->last_line = (yylsp+yylen-1)->last_line; + yylsp->last_column = (yylsp+yylen-1)->last_column; + } +#endif - /* Now `shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ + /* Now "shift" the result of the reduction. + Determine what state that goes to, + based on the state we popped back to + and the rule number reduced by. */ yyn = yyr1[yyn]; - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yypgoto[yyn - YYNTBASE] + *yyssp; + if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else - yystate = yydefgoto[yyn - YYNTOKENS]; + yystate = yydefgoto[yyn - YYNTBASE]; goto yynewstate; +yyerrlab: /* here on detecting error */ -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ -yyerrlab: - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) + if (! yyerrstatus) + /* If not already recovering from an error, report this error. */ { ++yynerrs; -#if YYERROR_VERBOSE + +#ifdef YYERROR_VERBOSE yyn = yypact[yystate]; - if (YYPACT_NINF < yyn && yyn < YYLAST) + if (yyn > YYFLAG && yyn < YYLAST) { - YYSIZE_T yysize = 0; - int yytype = YYTRANSLATE (yychar); - char *yymsg; - int yyx, yycount; - - yycount = 0; - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ - for (yyx = yyn < 0 ? -yyn : 0; - yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - yysize += yystrlen (yytname[yyx]) + 15, yycount++; - yysize += yystrlen ("parse error, unexpected ") + 1; - yysize += yystrlen (yytname[yytype]); - yymsg = (char *) YYSTACK_ALLOC (yysize); - if (yymsg != 0) + int size = 0; + char *msg; + int x, count; + + count = 0; + /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ + for (x = (yyn < 0 ? -yyn : 0); + x < (ssize_t)(sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + size += strlen(yytname[x]) + 15, count++; + msg = (char *) malloc(size + 15); + if (msg != 0) { - char *yyp = yystpcpy (yymsg, "parse error, unexpected "); - yyp = yystpcpy (yyp, yytname[yytype]); + strcpy(msg, "parse error"); - if (yycount < 5) + if (count < 5) { - yycount = 0; - for (yyx = yyn < 0 ? -yyn : 0; - yyx < (int) (sizeof (yytname) / sizeof (char *)); - yyx++) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + count = 0; + for (x = (yyn < 0 ? -yyn : 0); + x < (ssize_t)(sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) { - const char *yyq = ! yycount ? ", expecting " : " or "; - yyp = yystpcpy (yyp, yyq); - yyp = yystpcpy (yyp, yytname[yyx]); - yycount++; + strcat(msg, count == 0 ? ", expecting `" : " or `"); + strcat(msg, yytname[x]); + strcat(msg, "'"); + count++; } } - yyerror (yymsg); - YYSTACK_FREE (yymsg); + yyerror(msg); + free(msg); } else - yyerror ("parse error; also virtual memory exhausted"); + yyerror ("parse error; also virtual memory exceeded"); } else #endif /* YYERROR_VERBOSE */ - yyerror ("parse error"); + yyerror("parse error"); } - goto yyerrlab1; + goto yyerrlab1; +yyerrlab1: /* here on error raised explicitly by an action */ -/*----------------------------------------------------. -| yyerrlab1 -- error raised explicitly by an action. | -`----------------------------------------------------*/ -yyerrlab1: if (yyerrstatus == 3) { - /* If just tried and failed to reuse lookahead token after an - error, discard it. */ + /* if just tried and failed to reuse lookahead token after an error, discard it. */ - /* Return failure if at end of input. */ + /* return failure if at end of input */ if (yychar == YYEOF) - { - /* Pop the error token. */ - YYPOPSTACK; - /* Pop the rest of the stack. */ - while (yyssp > yyss) - { - YYDPRINTF ((stderr, "Error: popping ")); - YYDSYMPRINT ((stderr, - yystos[*yyssp], - *yyvsp)); - YYDPRINTF ((stderr, "\n")); - yydestruct (yystos[*yyssp], *yyvsp); - YYPOPSTACK; - } - YYABORT; - } + YYABORT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); +#endif - YYDPRINTF ((stderr, "Discarding token %d (%s).\n", - yychar, yytname[yychar1])); - yydestruct (yychar1, yylval); yychar = YYEMPTY; } - /* Else will try to reuse lookahead token after shifting the error - token. */ + /* Else will try to reuse lookahead token + after shifting the error token. */ - yyerrstatus = 3; /* Each real token shifted decrements this. */ + yyerrstatus = 3; /* Each real token shifted decrements this */ - for (;;) - { - yyn = yypact[yystate]; - if (yyn != YYPACT_NINF) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } + goto yyerrhandle; - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) - YYABORT; +yyerrdefault: /* current state does not do anything special for the error token. */ - YYDPRINTF ((stderr, "Error: popping ")); - YYDSYMPRINT ((stderr, - yystos[*yyssp], *yyvsp)); - YYDPRINTF ((stderr, "\n")); +#if 0 + /* This is wrong; only states that explicitly want error tokens + should shift them. */ + yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ + if (yyn) goto yydefault; +#endif - yydestruct (yystos[yystate], *yyvsp); - yyvsp--; - yystate = *--yyssp; +yyerrpop: /* pop the current state because it cannot handle the error token */ + if (yyssp == yyss) YYABORT; + yyvsp--; + yystate = *--yyssp; +#ifdef YYLSP_NEEDED + yylsp--; +#endif -#if YYDEBUG - if (yydebug) - { - short *yyssp1 = yyss - 1; - YYFPRINTF (stderr, "Error: state stack now"); - while (yyssp1 != yyssp) - YYFPRINTF (stderr, " %d", *++yyssp1); - YYFPRINTF (stderr, "\n"); - } +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "Error: state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } #endif + +yyerrhandle: + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yyerrdefault; + + yyn += YYTERROR; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) + goto yyerrdefault; + + yyn = yytable[yyn]; + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrpop; + yyn = -yyn; + goto yyreduce; } + else if (yyn == 0) + goto yyerrpop; if (yyn == YYFINAL) YYACCEPT; - YYDPRINTF ((stderr, "Shifting error token, ")); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting error token, "); +#endif *++yyvsp = yylval; - +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif yystate = yyn; goto yynewstate; - -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; - -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; - -#ifndef yyoverflow -/*----------------------------------------------. -| yyoverflowlab -- parser overflow comes here. | -`----------------------------------------------*/ -yyoverflowlab: - yyerror ("parser stack overflow"); - yyresult = 2; - /* Fall through. */ + yyacceptlab: + /* YYACCEPT comes here. */ + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); #endif + } + return 0; -yyreturn: -#ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); + yyabortlab: + /* YYABORT comes here. */ + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); #endif - return yyresult; + } + return 1; } - - -#line 1931 "asn1p_y.y" +#line 1953 "asn1p_y.y" @@ -4216,9 +3597,8 @@ yyerror(const char *msg) { fprintf(stderr, "ASN.1 grammar parse error " "near line %d (token \"%s\"): %s\n", - asn1p_lineno, asn1p_text, msg); + yylineno, asn1p_text, msg); return -1; } - diff --git a/libasn1parser/asn1p_y.h b/libasn1parser/asn1p_y.h index 6d3ff5e71..375b845fd 100644 --- a/libasn1parser/asn1p_y.h +++ b/libasn1parser/asn1p_y.h @@ -1,243 +1,3 @@ -/* A Bison parser, made from asn1p_y.y, by GNU bison 1.75. */ - -/* Skeleton parser for Yacc-like parsing with Bison, - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -#ifndef BISON_ASN_P_Y_H -# define BISON_ASN_P_Y_H - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - TOK_PPEQ = 258, - TOK_opaque = 259, - TOK_bstring = 260, - TOK_cstring = 261, - TOK_hstring = 262, - TOK_identifier = 263, - TOK_number = 264, - TOK_number_negative = 265, - TOK_typereference = 266, - TOK_capitalreference = 267, - TOK_typefieldreference = 268, - TOK_valuefieldreference = 269, - TOK_ABSENT = 270, - TOK_ABSTRACT_SYNTAX = 271, - TOK_ALL = 272, - TOK_ANY = 273, - TOK_APPLICATION = 274, - TOK_AUTOMATIC = 275, - TOK_BEGIN = 276, - TOK_BIT = 277, - TOK_BMPString = 278, - TOK_BOOLEAN = 279, - TOK_BY = 280, - TOK_CHARACTER = 281, - TOK_CHOICE = 282, - TOK_CLASS = 283, - TOK_COMPONENT = 284, - TOK_COMPONENTS = 285, - TOK_CONSTRAINED = 286, - TOK_CONTAINING = 287, - TOK_DEFAULT = 288, - TOK_DEFINITIONS = 289, - TOK_DEFINED = 290, - TOK_EMBEDDED = 291, - TOK_ENCODED = 292, - TOK_ENCODING_CONTROL = 293, - TOK_END = 294, - TOK_ENUMERATED = 295, - TOK_EXPLICIT = 296, - TOK_EXPORTS = 297, - TOK_EXTENSIBILITY = 298, - TOK_EXTERNAL = 299, - TOK_FALSE = 300, - TOK_FROM = 301, - TOK_GeneralizedTime = 302, - TOK_GeneralString = 303, - TOK_GraphicString = 304, - TOK_IA5String = 305, - TOK_IDENTIFIER = 306, - TOK_IMPLICIT = 307, - TOK_IMPLIED = 308, - TOK_IMPORTS = 309, - TOK_INCLUDES = 310, - TOK_INSTANCE = 311, - TOK_INSTRUCTIONS = 312, - TOK_INTEGER = 313, - TOK_ISO646String = 314, - TOK_MAX = 315, - TOK_MIN = 316, - TOK_MINUS_INFINITY = 317, - TOK_NULL = 318, - TOK_NumericString = 319, - TOK_OBJECT = 320, - TOK_ObjectDescriptor = 321, - TOK_OCTET = 322, - TOK_OF = 323, - TOK_OPTIONAL = 324, - TOK_PATTERN = 325, - TOK_PDV = 326, - TOK_PLUS_INFINITY = 327, - TOK_PRESENT = 328, - TOK_PrintableString = 329, - TOK_PRIVATE = 330, - TOK_REAL = 331, - TOK_RELATIVE_OID = 332, - TOK_SEQUENCE = 333, - TOK_SET = 334, - TOK_SIZE = 335, - TOK_STRING = 336, - TOK_SYNTAX = 337, - TOK_T61String = 338, - TOK_TAGS = 339, - TOK_TeletexString = 340, - TOK_TRUE = 341, - TOK_TYPE_IDENTIFIER = 342, - TOK_UNIQUE = 343, - TOK_UNIVERSAL = 344, - TOK_UniversalString = 345, - TOK_UTCTime = 346, - TOK_UTF8String = 347, - TOK_VideotexString = 348, - TOK_VisibleString = 349, - TOK_WITH = 350, - TOK_EXCEPT = 351, - TOK_INTERSECTION = 352, - TOK_UNION = 353, - TOK_TwoDots = 354, - TOK_ThreeDots = 355, - TOK_tag = 356 - }; -#endif -#define TOK_PPEQ 258 -#define TOK_opaque 259 -#define TOK_bstring 260 -#define TOK_cstring 261 -#define TOK_hstring 262 -#define TOK_identifier 263 -#define TOK_number 264 -#define TOK_number_negative 265 -#define TOK_typereference 266 -#define TOK_capitalreference 267 -#define TOK_typefieldreference 268 -#define TOK_valuefieldreference 269 -#define TOK_ABSENT 270 -#define TOK_ABSTRACT_SYNTAX 271 -#define TOK_ALL 272 -#define TOK_ANY 273 -#define TOK_APPLICATION 274 -#define TOK_AUTOMATIC 275 -#define TOK_BEGIN 276 -#define TOK_BIT 277 -#define TOK_BMPString 278 -#define TOK_BOOLEAN 279 -#define TOK_BY 280 -#define TOK_CHARACTER 281 -#define TOK_CHOICE 282 -#define TOK_CLASS 283 -#define TOK_COMPONENT 284 -#define TOK_COMPONENTS 285 -#define TOK_CONSTRAINED 286 -#define TOK_CONTAINING 287 -#define TOK_DEFAULT 288 -#define TOK_DEFINITIONS 289 -#define TOK_DEFINED 290 -#define TOK_EMBEDDED 291 -#define TOK_ENCODED 292 -#define TOK_ENCODING_CONTROL 293 -#define TOK_END 294 -#define TOK_ENUMERATED 295 -#define TOK_EXPLICIT 296 -#define TOK_EXPORTS 297 -#define TOK_EXTENSIBILITY 298 -#define TOK_EXTERNAL 299 -#define TOK_FALSE 300 -#define TOK_FROM 301 -#define TOK_GeneralizedTime 302 -#define TOK_GeneralString 303 -#define TOK_GraphicString 304 -#define TOK_IA5String 305 -#define TOK_IDENTIFIER 306 -#define TOK_IMPLICIT 307 -#define TOK_IMPLIED 308 -#define TOK_IMPORTS 309 -#define TOK_INCLUDES 310 -#define TOK_INSTANCE 311 -#define TOK_INSTRUCTIONS 312 -#define TOK_INTEGER 313 -#define TOK_ISO646String 314 -#define TOK_MAX 315 -#define TOK_MIN 316 -#define TOK_MINUS_INFINITY 317 -#define TOK_NULL 318 -#define TOK_NumericString 319 -#define TOK_OBJECT 320 -#define TOK_ObjectDescriptor 321 -#define TOK_OCTET 322 -#define TOK_OF 323 -#define TOK_OPTIONAL 324 -#define TOK_PATTERN 325 -#define TOK_PDV 326 -#define TOK_PLUS_INFINITY 327 -#define TOK_PRESENT 328 -#define TOK_PrintableString 329 -#define TOK_PRIVATE 330 -#define TOK_REAL 331 -#define TOK_RELATIVE_OID 332 -#define TOK_SEQUENCE 333 -#define TOK_SET 334 -#define TOK_SIZE 335 -#define TOK_STRING 336 -#define TOK_SYNTAX 337 -#define TOK_T61String 338 -#define TOK_TAGS 339 -#define TOK_TeletexString 340 -#define TOK_TRUE 341 -#define TOK_TYPE_IDENTIFIER 342 -#define TOK_UNIQUE 343 -#define TOK_UNIVERSAL 344 -#define TOK_UniversalString 345 -#define TOK_UTCTime 346 -#define TOK_UTF8String 347 -#define TOK_VideotexString 348 -#define TOK_VisibleString 349 -#define TOK_WITH 350 -#define TOK_EXCEPT 351 -#define TOK_INTERSECTION 352 -#define TOK_UNION 353 -#define TOK_TwoDots 354 -#define TOK_ThreeDots 355 -#define TOK_tag 356 - - - - -#ifndef YYSTYPE -#line 58 "asn1p_y.y" typedef union { asn1p_t *a_grammar; asn1p_module_flags_e a_module_flags; @@ -269,14 +29,106 @@ typedef union { char *name; struct asn1p_type_tag_s tag; } tv_nametag; -} yystype; -/* Line 1281 of /usr/local/share/bison/yacc.c. */ -#line 275 "y.tab.h" -# define YYSTYPE yystype -#endif +} YYSTYPE; +#define TOK_PPEQ 257 +#define TOK_opaque 258 +#define TOK_bstring 259 +#define TOK_cstring 260 +#define TOK_hstring 261 +#define TOK_identifier 262 +#define TOK_number 263 +#define TOK_number_negative 264 +#define TOK_typereference 265 +#define TOK_capitalreference 266 +#define TOK_typefieldreference 267 +#define TOK_valuefieldreference 268 +#define TOK_ABSENT 269 +#define TOK_ABSTRACT_SYNTAX 270 +#define TOK_ALL 271 +#define TOK_ANY 272 +#define TOK_APPLICATION 273 +#define TOK_AUTOMATIC 274 +#define TOK_BEGIN 275 +#define TOK_BIT 276 +#define TOK_BMPString 277 +#define TOK_BOOLEAN 278 +#define TOK_BY 279 +#define TOK_CHARACTER 280 +#define TOK_CHOICE 281 +#define TOK_CLASS 282 +#define TOK_COMPONENT 283 +#define TOK_COMPONENTS 284 +#define TOK_CONSTRAINED 285 +#define TOK_CONTAINING 286 +#define TOK_DEFAULT 287 +#define TOK_DEFINITIONS 288 +#define TOK_DEFINED 289 +#define TOK_EMBEDDED 290 +#define TOK_ENCODED 291 +#define TOK_ENCODING_CONTROL 292 +#define TOK_END 293 +#define TOK_ENUMERATED 294 +#define TOK_EXPLICIT 295 +#define TOK_EXPORTS 296 +#define TOK_EXTENSIBILITY 297 +#define TOK_EXTERNAL 298 +#define TOK_FALSE 299 +#define TOK_FROM 300 +#define TOK_GeneralizedTime 301 +#define TOK_GeneralString 302 +#define TOK_GraphicString 303 +#define TOK_IA5String 304 +#define TOK_IDENTIFIER 305 +#define TOK_IMPLICIT 306 +#define TOK_IMPLIED 307 +#define TOK_IMPORTS 308 +#define TOK_INCLUDES 309 +#define TOK_INSTANCE 310 +#define TOK_INSTRUCTIONS 311 +#define TOK_INTEGER 312 +#define TOK_ISO646String 313 +#define TOK_MAX 314 +#define TOK_MIN 315 +#define TOK_MINUS_INFINITY 316 +#define TOK_NULL 317 +#define TOK_NumericString 318 +#define TOK_OBJECT 319 +#define TOK_ObjectDescriptor 320 +#define TOK_OCTET 321 +#define TOK_OF 322 +#define TOK_OPTIONAL 323 +#define TOK_PATTERN 324 +#define TOK_PDV 325 +#define TOK_PLUS_INFINITY 326 +#define TOK_PRESENT 327 +#define TOK_PrintableString 328 +#define TOK_PRIVATE 329 +#define TOK_REAL 330 +#define TOK_RELATIVE_OID 331 +#define TOK_SEQUENCE 332 +#define TOK_SET 333 +#define TOK_SIZE 334 +#define TOK_STRING 335 +#define TOK_SYNTAX 336 +#define TOK_T61String 337 +#define TOK_TAGS 338 +#define TOK_TeletexString 339 +#define TOK_TRUE 340 +#define TOK_TYPE_IDENTIFIER 341 +#define TOK_UNIQUE 342 +#define TOK_UNIVERSAL 343 +#define TOK_UniversalString 344 +#define TOK_UTCTime 345 +#define TOK_UTF8String 346 +#define TOK_VideotexString 347 +#define TOK_VisibleString 348 +#define TOK_WITH 349 +#define TOK_EXCEPT 350 +#define TOK_INTERSECTION 351 +#define TOK_UNION 352 +#define TOK_TwoDots 353 +#define TOK_ThreeDots 354 +#define TOK_tag 355 -extern YYSTYPE asn1p_lval; - - -#endif /* not BISON_ASN_P_Y_H */ +extern YYSTYPE asn1p_lval; diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index 317bba044..2d7a9cb57 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -233,7 +233,9 @@ static asn1p_value_t * %type DefinedTypeRef %type ValueSetDefinition /* Val INTEGER ::= {1|2} */ %type ValueDefinition /* val INTEGER ::= 1*/ -%type optValueSetBody +%type optValueSetBody +%type ValueSetBody +%type ValueSetElement %type InlineOrDefinedValue %type DefinedValue %type SignedNumber @@ -694,7 +696,27 @@ DefinedTypeRef: optValueSetBody: { } - | ElementSetSpecs { + | ValueSetBody { + } + ; + +/* + * X.680 does not permit ElementSetSpecs starting with ellipsis, + * i.e. (..., A, B). This is very strange: the ElementSetSpecs is used + * inside ValueSet, and ValueSets "in the wild" tend to have the first + * ellipsis. + */ +ValueSetBody: + ValueSetElement { + } + | ValueSetBody ',' ValueSetElement { + } + ; + +ValueSetElement: + TOK_ThreeDots { + } + | ElementSetSpec { } ; @@ -981,7 +1003,7 @@ WithSyntaxFormatToken: ExtensionAndException: TOK_ThreeDots { - $$ = asn1p_expr_new(asn1p_lineno); + $$ = asn1p_expr_new(yylineno); checkmem($$); $$->Identifier = strdup("..."); checkmem($$->Identifier); @@ -989,7 +1011,7 @@ ExtensionAndException: $$->meta_type = AMT_TYPE; } | TOK_ThreeDots '!' DefinedValue { - $$ = asn1p_expr_new(asn1p_lineno); + $$ = asn1p_expr_new(yylineno); checkmem($$); $$->Identifier = strdup("..."); checkmem($$->Identifier); @@ -998,7 +1020,7 @@ ExtensionAndException: $$->meta_type = AMT_TYPE; } | TOK_ThreeDots '!' SignedNumber { - $$ = asn1p_expr_new(asn1p_lineno); + $$ = asn1p_expr_new(yylineno); checkmem($$); $$->Identifier = strdup("..."); $$->value = $3; @@ -1058,7 +1080,7 @@ TypeDeclaration: $$->meta_type = AMT_TYPE; } | TOK_SEQUENCE optConstraints TOK_OF TypeDeclaration { - $$ = asn1p_expr_new(asn1p_lineno); + $$ = asn1p_expr_new(yylineno); checkmem($$); $$->constraints = $2; $$->expr_type = ASN_CONSTR_SEQUENCE_OF; @@ -1066,7 +1088,7 @@ TypeDeclaration: TQ_ADD(&($$->members), $4, next); } | TOK_SET optConstraints TOK_OF TypeDeclaration { - $$ = asn1p_expr_new(asn1p_lineno); + $$ = asn1p_expr_new(yylineno); checkmem($$); $$->constraints = $2; $$->expr_type = ASN_CONSTR_SET_OF; @@ -1074,14 +1096,14 @@ TypeDeclaration: TQ_ADD(&($$->members), $4, next); } | TOK_ANY { - $$ = asn1p_expr_new(asn1p_lineno); + $$ = asn1p_expr_new(yylineno); checkmem($$); $$->expr_type = ASN_TYPE_ANY; $$->meta_type = AMT_TYPE; } | TOK_ANY TOK_DEFINED TOK_BY Identifier { int ret; - $$ = asn1p_expr_new(asn1p_lineno); + $$ = asn1p_expr_new(yylineno); checkmem($$); $$->reference = asn1p_ref_new(yylineno); ret = asn1p_ref_add_component($$->reference, @@ -1352,7 +1374,7 @@ BasicTypeId_UniverationCompatible: BasicType: BasicTypeId { - $$ = asn1p_expr_new(asn1p_lineno); + $$ = asn1p_expr_new(yylineno); checkmem($$); $$->expr_type = $1; $$->meta_type = AMT_TYPE; @@ -1361,7 +1383,7 @@ BasicType: if($2) { $$ = $2; } else { - $$ = asn1p_expr_new(asn1p_lineno); + $$ = asn1p_expr_new(yylineno); checkmem($$); } $$->expr_type = $1; @@ -1774,7 +1796,7 @@ optUniverationDefinition: UniverationDefinition: '{' '}' { - $$ = asn1p_expr_new(asn1p_lineno); + $$ = asn1p_expr_new(yylineno); checkmem($$); } | '{' UniverationList '}' { @@ -1784,7 +1806,7 @@ UniverationDefinition: UniverationList: UniverationElement { - $$ = asn1p_expr_new(asn1p_lineno); + $$ = asn1p_expr_new(yylineno); checkmem($$); TQ_ADD(&($$->members), $1, next); } @@ -1796,14 +1818,14 @@ UniverationList: UniverationElement: Identifier { - $$ = asn1p_expr_new(asn1p_lineno); + $$ = asn1p_expr_new(yylineno); checkmem($$); $$->expr_type = A1TC_UNIVERVAL; $$->meta_type = AMT_VALUE; $$->Identifier = $1; } | Identifier '(' SignedNumber ')' { - $$ = asn1p_expr_new(asn1p_lineno); + $$ = asn1p_expr_new(yylineno); checkmem($$); $$->expr_type = A1TC_UNIVERVAL; $$->meta_type = AMT_VALUE; @@ -1811,7 +1833,7 @@ UniverationElement: $$->value = $3; } | Identifier '(' DefinedValue ')' { - $$ = asn1p_expr_new(asn1p_lineno); + $$ = asn1p_expr_new(yylineno); checkmem($$); $$->expr_type = A1TC_UNIVERVAL; $$->meta_type = AMT_VALUE; @@ -1819,14 +1841,14 @@ UniverationElement: $$->value = $3; } | SignedNumber { - $$ = asn1p_expr_new(asn1p_lineno); + $$ = asn1p_expr_new(yylineno); checkmem($$); $$->expr_type = A1TC_UNIVERVAL; $$->meta_type = AMT_VALUE; $$->value = $1; } | TOK_ThreeDots { - $$ = asn1p_expr_new(asn1p_lineno); + $$ = asn1p_expr_new(yylineno); checkmem($$); $$->Identifier = strdup("..."); checkmem($$->Identifier); @@ -2032,7 +2054,7 @@ yyerror(const char *msg) { fprintf(stderr, "ASN.1 grammar parse error " "near line %d (token \"%s\"): %s\n", - asn1p_lineno, asn1p_text, msg); + yylineno, asn1p_text, msg); return -1; } From e6bdf51b3cbf62497f0385e2d8f3739fff474a66 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 5 Sep 2004 10:41:17 +0000 Subject: [PATCH 0256/1469] added PKIX1-related FAQ entry git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@256 59561ff5-6e30-0410-9f3c-9617f08c8826 --- FAQ | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/FAQ b/FAQ index 97b097eb7..d654f3f79 100644 --- a/FAQ +++ b/FAQ @@ -12,3 +12,26 @@ A: Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER)" + +Q: I've tried doing ./asn1c/asn1c -P examples/*PKIX*93*, but compiler spits + several fatal failures and exits. +A: + The PKIX1 specifications uses ASN.1 Information Object Classes, + which is arguably one of the most complex ASN.1 concepts. + + The asn1c parser and fixer subsystems currently understand most of + IOC syntax, but the compiler can cope with only the very basic + IOC semantics. + + The goal of asn1c is to adequately support the practically necessary + subset of IOCs to compile PKIX1 and other real-world specs, + but this milestone isn't yet reached. Please contact me in case + you have special requirements, we can work it out. + + P.S. Parser and fixer are now able to grok PKIX1, try this out: + + ./asn1c/asn1c -E -F examples/*PKIX*93* + +-- +Lev Walkin +vlm@lionet.info From d79b30d7e6768fedbac9868a4953ffb410990428 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 5 Sep 2004 10:41:23 +0000 Subject: [PATCH 0257/1469] added reference to FAQ git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@257 59561ff5-6e30-0410-9f3c-9617f08c8826 --- README | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/README b/README index 586bb3d38..e725b89f8 100644 --- a/README +++ b/README @@ -6,22 +6,23 @@ For quick installation tips read INSTALL. For more complete documentation on this compiler and on using the results of compilation please look into ./doc directory. +Please also read the FAQ file. + An excellent book on ASN.1 is written by Olivier Dubuisson: "ASN.1 Communication between heterogeneous systems", ISBN:0-12-6333361-0. - QUICK START =========== After building [and installing] the compiler (see INSTALL), you may use the asn1c command to compile the ASN.1 specification: - asn1c + asn1c If several specifications contain interdependencies, all of them must be specified: - asn1c ... + asn1c ... The ./examples directory contains several ASN.1 modules and a script to extract ASN.1 modules from RFC documents. To compile X.509 PKI module: @@ -30,8 +31,8 @@ extract ASN.1 modules from RFC documents. To compile X.509 PKI module: In this example, -P option is used to instruct the compiler to print the compiled text on the standard output instead of creating multiple .c -and .h files for every ASN.1 type found inside the specified files. -This is useful for debugging and tests automation. +and .h files for every ASN.1 type found inside the specified ASN.1 modules. +This is useful for debugging and test automation. The compiler -E and -EF options are used for testing the parser and the semantic fixer, respectively. These options will instruct the compiler @@ -40,7 +41,7 @@ to dump out the parsed (and fixed) ASN.1 specification as it was whether a particular syntactic construction is properly supported by the compiler. - asn1c -EF + asn1c -EF MODEL OF OPERATION @@ -49,10 +50,10 @@ MODEL OF OPERATION The asn1c compiler works by processing the ASN.1 module specification in several stages: 1. In the first stage, the ASN.1 file is parsed. - (Parsing produces an ASN.1 syntax tree for the subsequent levels.) + (Parsing produces an ASN.1 syntax tree for the subsequent levels) 2. In the second stage, the syntax tree is "fixed". - (Fixing is done by checking the tree for semantic errors - and by transforming the tree into the canonical representation.) + (Fixing is a process of checking the tree for semantic errors, + accompanied by the tree transformation into the canonical form) 3. In the third stage, the syntax tree is compiled into the target language. There are several command-line options reserved for printing the results From e9a56c9ac94dfe4e128ac3b5da215a29f64bb3f6 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 5 Sep 2004 10:41:39 +0000 Subject: [PATCH 0258/1469] added constraints/parametrization comments git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@258 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ChangeLog b/ChangeLog index a62c1f9a0..e6414fd53 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,8 @@ 0.9.3: 2004-Sep-03 + * Extended constraints support in parametrized types. + * Better support for parametrization and constraints handling. * Added support for ANY type. 0.9.2: 2004-Aug-24 From 17dc9eb65e091ce4e69820e08ec92d6bea28e1ad Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 5 Sep 2004 10:42:19 +0000 Subject: [PATCH 0259/1469] measured in bits git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@259 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_constraint.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index beb874563..10832b569 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -481,7 +481,7 @@ emit_size_determination_code(arg_t *arg, asn1p_expr_type_e etype) { case ASN_BASIC_BIT_STRING: OUT("if(st->size > 0) {\n"); OUT("\t/* Size in bits */\n"); - OUT("\tsize = (st->size - 1) - (st->buf[0] & 0x7);\n"); + OUT("\tsize = 8 * (st->size - 1) - (st->buf[0] & 0x7);\n"); OUT("} else {\n"); OUT("\tsize = 0;\n"); OUT("}\n"); From 2de0e790bf297ac132f1b9518f3cb425654ab329 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 5 Sep 2004 10:42:33 +0000 Subject: [PATCH 0260/1469] integrated ANY support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@260 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 0bf556c1e..10142ca7d 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -905,7 +905,7 @@ _print_tag(arg_t *arg, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag_p) { if(tag_p) { tag = *tag_p; } else { - if(asn1f_fetch_tag(arg->asn, arg->mod, expr, &tag)) { + if(asn1f_fetch_tag(arg->asn, arg->mod, expr, &tag, 0)) { OUT("-1 /* Ambiguous tag (CHOICE|ANY?) */"); return 0; } @@ -1026,12 +1026,20 @@ _add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no) { assert(el_no >= 0); - ret = asn1f_fetch_tag(arg->asn, arg->mod, arg->expr, &tag); + ret = asn1f_fetch_tag(arg->asn, arg->mod, arg->expr, &tag, 1); if(ret == 0) { tag2el_t *te; int new_count = (*count) + 1; void *p; + if(tag.tag_value == -1) { + /* + * This is an untagged ANY type, + * proceed without adding a tag + */ + return 0; + } + p = realloc(*tag2el, new_count * sizeof(tag2el_t)); if(p) *tag2el = p; else return -1; @@ -1077,18 +1085,6 @@ _add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no) { } } - if(arg->expr->expr_type == ASN_TYPE_ANY - && arg->expr->tag.tag_class == TC_NOCLASS) { - if(arg->expr->marker) { - FATAL("Untagged optional ANY type for %s at line %d", - arg->expr->Identifier, - arg->expr->_lineno); - return -1; - } - /* Allow to proceed without adding a tag */ - return 0; - } - DEBUG("No tag for %s at line %d", arg->expr->Identifier, arg->expr->_lineno); From ab820b902b14b98247e29f9198eaf3df76788e8d Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 5 Sep 2004 10:42:51 +0000 Subject: [PATCH 0261/1469] added "describes" comment git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@261 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-usage.lyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/asn1c-usage.lyx b/doc/asn1c-usage.lyx index 438e7b08a..27736a2d5 100644 --- a/doc/asn1c-usage.lyx +++ b/doc/asn1c-usage.lyx @@ -55,7 +55,7 @@ status Open \layout Standard \backslash -extramarks{$Revision$}{} +extramarks{$Revision$ -- describes asn1c-0.9.3}{} \end_inset From 2a7c1b303e6616fb2e34dcee21e60d0735d083fe Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 5 Sep 2004 10:43:39 +0000 Subject: [PATCH 0262/1469] removed nested-externs warning git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@262 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure | 1 - configure.in | 1 - 2 files changed, 2 deletions(-) diff --git a/configure b/configure index 39c7cae7d..043d50a3c 100755 --- a/configure +++ b/configure @@ -21419,7 +21419,6 @@ case "$GCC" in CFLAGS="$CFLAGS -Wmissing-prototypes" CFLAGS="$CFLAGS -Wmissing-declarations" CFLAGS="$CFLAGS -Wredundant-decls" - CFLAGS="$CFLAGS -Wnested-externs" ;; esac diff --git a/configure.in b/configure.in index fbccad98e..1e75908ea 100644 --- a/configure.in +++ b/configure.in @@ -66,7 +66,6 @@ case "$GCC" in CFLAGS="$CFLAGS -Wmissing-prototypes" CFLAGS="$CFLAGS -Wmissing-declarations" CFLAGS="$CFLAGS -Wredundant-decls" - CFLAGS="$CFLAGS -Wnested-externs" ;; esac From 2d75d9e585df7a41aebbc0523fbfa913a8a063d2 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 5 Sep 2004 10:44:13 +0000 Subject: [PATCH 0263/1469] added tests for parametrization git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@263 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/58-param-OK.asn1 | 23 +++++++++++++++++++++++ tests/58-param-OK.asn1.-EF | 20 ++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 tests/58-param-OK.asn1 create mode 100644 tests/58-param-OK.asn1.-EF diff --git a/tests/58-param-OK.asn1 b/tests/58-param-OK.asn1 new file mode 100644 index 000000000..477cabe4e --- /dev/null +++ b/tests/58-param-OK.asn1 @@ -0,0 +1,23 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .58 + +ModuleTestParam + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 58 } + DEFINITIONS ::= +BEGIN + + DirectoryString { INTEGER:maxSize } ::= CHOICE { + teletexString TeletexString (SIZE(1..maxSize)), + utf8String UTF8String (SIZE(1..maxSize)) + } + + DS1 ::= DirectoryString { ub-name } + + ub-name INTEGER ::= 128 + +END diff --git a/tests/58-param-OK.asn1.-EF b/tests/58-param-OK.asn1.-EF new file mode 100644 index 000000000..3f950bfb4 --- /dev/null +++ b/tests/58-param-OK.asn1.-EF @@ -0,0 +1,20 @@ + +ModuleTestParam {iso org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 58 } +DEFINITIONS ::= +BEGIN + +DirectoryString{INTEGER:maxSize} ::= CHOICE { + teletexString TeletexString (SIZE(1..maxSize)), + utf8String UTF8String (SIZE(1..maxSize)) +} + +DS1 ::= CHOICE { + teletexString TeletexString (SIZE(1..128)), + utf8String UTF8String (SIZE(1..128)) +} + +ub-name INTEGER ::= 128 + +END From c5f3c2ecd775809d9512d8d256aa0875572307c1 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 5 Sep 2004 10:44:23 +0000 Subject: [PATCH 0264/1469] tests for ANY type git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@264 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/61-any-1-SE.asn1 | 19 +++++++++++++++++++ tests/62-any-OK.asn1 | 19 +++++++++++++++++++ tests/62-any-OK.asn1.-EF | 13 +++++++++++++ tests/63-any-2-SE.asn1 | 18 ++++++++++++++++++ 4 files changed, 69 insertions(+) create mode 100644 tests/61-any-1-SE.asn1 create mode 100644 tests/62-any-OK.asn1 create mode 100644 tests/62-any-OK.asn1.-EF create mode 100644 tests/63-any-2-SE.asn1 diff --git a/tests/61-any-1-SE.asn1 b/tests/61-any-1-SE.asn1 new file mode 100644 index 000000000..aa3cec365 --- /dev/null +++ b/tests/61-any-1-SE.asn1 @@ -0,0 +1,19 @@ + +-- SE: Semantic error + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .61 + +ModuleTestBadANY1 + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 61 } + DEFINITIONS ::= +BEGIN + + T ::= SEQUENCE { + i1 INTEGER OPTIONAL, + any ANY + } + +END diff --git a/tests/62-any-OK.asn1 b/tests/62-any-OK.asn1 new file mode 100644 index 000000000..5b58562b2 --- /dev/null +++ b/tests/62-any-OK.asn1 @@ -0,0 +1,19 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .62 + +ModuleTestANYSyntax + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 62 } + DEFINITIONS IMPLICIT TAGS ::= +BEGIN + + T ::= SEQUENCE { + i INTEGER, + any [1] ANY -- Converted into [1] EXPLICIT ANY + } + +END diff --git a/tests/62-any-OK.asn1.-EF b/tests/62-any-OK.asn1.-EF new file mode 100644 index 000000000..eb9270925 --- /dev/null +++ b/tests/62-any-OK.asn1.-EF @@ -0,0 +1,13 @@ + +ModuleTestANYSyntax {iso org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 62 } +DEFINITIONS IMPLICIT TAGS ::= +BEGIN + +T ::= SEQUENCE { + i INTEGER, + any [1] EXPLICIT ANY +} + +END diff --git a/tests/63-any-2-SE.asn1 b/tests/63-any-2-SE.asn1 new file mode 100644 index 000000000..ca747cf5b --- /dev/null +++ b/tests/63-any-2-SE.asn1 @@ -0,0 +1,18 @@ + +-- SE: Semantic error + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .63 + +ModuleTestBadANY2 + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 62 } + DEFINITIONS ::= +BEGIN + + T ::= SEQUENCE { + any [1] IMPLICIT ANY + } + +END From 85d571d028e4cb75a6b49641f5742a057ae69dd8 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 5 Sep 2004 10:45:03 +0000 Subject: [PATCH 0265/1469] added clause about manual execution git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@265 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/README | 3 +++ 1 file changed, 3 insertions(+) diff --git a/asn1c/tests/README b/asn1c/tests/README index 99c45e44c..5d37c1117 100644 --- a/asn1c/tests/README +++ b/asn1c/tests/README @@ -4,3 +4,6 @@ as a pointer to the file in ../../tests/N-*.asn1. This file is compiled using the asn1c compiler from above directory. Then, everything is build together in a temporary directory with a check-N.c used as a testing engine. +For manual execution of a specific test case, use the following pattern: + + ./check-assembly.sh check-.c From 45fce80dbb6c645eff03bf667d7873b25b2ded96 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 6 Sep 2004 08:05:23 +0000 Subject: [PATCH 0266/1469] test OBJECT IDENTIFIER reference to itself git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@266 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/64-oid-constr-OK.asn1 | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 tests/64-oid-constr-OK.asn1 diff --git a/tests/64-oid-constr-OK.asn1 b/tests/64-oid-constr-OK.asn1 new file mode 100644 index 000000000..f6cb41dd6 --- /dev/null +++ b/tests/64-oid-constr-OK.asn1 @@ -0,0 +1,18 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .64 + +ModuleTestOIDConstraint + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 64 } + DEFINITIONS ::= +BEGIN + + void OBJECT IDENTIFIER ::= { v 1 3 6 1 4 1 9363 1 5 1 64 1 1 } + + Id ::= OBJECT IDENTIFIER (void) + +END From 59f89da36c9713ffc5e34e0beb8f685d22df7be4 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 6 Sep 2004 08:06:37 +0000 Subject: [PATCH 0267/1469] treat references to object identifier differently git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@267 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_derefv.c | 2 +- libasn1fix/asn1fix_value.c | 22 +++++++++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/libasn1fix/asn1fix_derefv.c b/libasn1fix/asn1fix_derefv.c index 7be9d6d2d..a00eac9c7 100644 --- a/libasn1fix/asn1fix_derefv.c +++ b/libasn1fix/asn1fix_derefv.c @@ -32,7 +32,7 @@ asn1f_fix_dereference_values(arg_t *arg) { r_value = -1; } - if(expr->value->type != ATV_INTEGER) { + if(0 && expr->value->type != ATV_INTEGER) { FATAL( "INTEGER value %s at line %d: " "Incompatible value specified: %s", diff --git a/libasn1fix/asn1fix_value.c b/libasn1fix/asn1fix_value.c index 33da36618..80223d605 100644 --- a/libasn1fix/asn1fix_value.c +++ b/libasn1fix/asn1fix_value.c @@ -22,7 +22,7 @@ asn1f_value_resolve(arg_t *arg, asn1p_expr_t *expr) { type_expr = asn1f_find_terminal_type(arg, expr); DEBUG("%s(): terminal type %p", __func__, type_expr); if(type_expr == 0) { - DEBUG("\tTerminal type for %s not found", expr->Identifier); + FATAL("Terminal type for is %s not found", expr->Identifier); return -1; } @@ -64,10 +64,26 @@ asn1f_value_resolve(arg_t *arg, asn1p_expr_t *expr) { */ ret = asn1f_check_type_compatibility(arg, type_expr, val_type_expr); if(ret == -1) { - DEBUG("\tIncompatible type of %s at %d with %s at %d", + switch(type_expr->expr_type) { + case ASN_BASIC_INTEGER: + case ASN_BASIC_ENUMERATED: + FATAL("Incompatible type of %s at %d with %s at %d", type_expr->Identifier, type_expr->_lineno, val_type_expr->Identifier, val_type_expr->_lineno); - return -1; + return -1; + case ASN_BASIC_OBJECT_IDENTIFIER: + /* + * Ignore this for now. + * We can't deal with OIDs inheritance properly yet. + */ + return 0; + default: + break; + } + WARNING("\tIncompatible type of %s at %d with %s at %d", + type_expr->Identifier, type_expr->_lineno, + val_type_expr->Identifier, val_type_expr->_lineno); + return 1; } if(asn1f_look_value_in_type(arg, val_type_expr, expr) == -1) From 465f3c0249daffd864d2c61a72f43da27442f9b1 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 6 Sep 2004 08:07:19 +0000 Subject: [PATCH 0268/1469] cleaner pointer arithmetics git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@268 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_constraint.c | 42 ++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index 10832b569..f824e3a68 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -207,6 +207,20 @@ asn1c_emit_constraint_tables(arg_t *arg, int got_size) { return 0; } + + if(range->left.type == ARE_MIN + && range->right.type == ARE_MAX) { + /* + * The permitted alphabet constraint checker code guarantees + * that either both bounds (left/right) are present, or + * they're absent simultaneously. Thus, this assertion + * legitimately holds true. + */ + assert(range->el_count == 0); + /* The full range is specified. Ignore it. */ + return 0; + } + range_start = range->left.value; range_stop = range->right.value; assert(range->left.type == ARE_VALUE); @@ -369,28 +383,28 @@ emit_alphabet_check_loop(arg_t *arg, asn1cnst_range_t *range) { natural_stop = 0xffffffffUL; break; case ASN_STRING_UniversalString: - OUT("const uint32_t *ch = st->buf;\n"); - OUT("const uint32_t *end = ch + st->size;\n"); + OUT("const uint8_t *ch = st->buf;\n"); + OUT("const uint8_t *end = ch + st->size;\n"); OUT("\n"); - OUT("if(st->size % 4) return -1; /* (size%4)! */\n"); - OUT("for(; ch < end; ch++) {\n"); + OUT("if(st->size %% 4) return -1; /* (size%%4)! */\n"); + OUT("for(; ch < end; ch += 4) {\n"); INDENT(+1); - OUT("uint32_t cv = (((const uint8_t *)ch)[0] << 24)\n"); - OUT("\t\t| (((const uint8_t *)ch)[1] << 16)\n"); - OUT("\t\t| (((const uint8_t *)ch)[2] << 8)\n"); - OUT("\t\t| ((const uint8_t *)ch)[3];\n"); + OUT("uint32_t cv = (ch[0] << 24)\n"); + OUT("\t\t| (ch[1] << 16)\n"); + OUT("\t\t| (ch[2] << 8)\n"); + OUT("\t\t| ch[3];\n"); if(!range) OUT("if(cv > 255) return -1;\n"); natural_stop = 0xffffffffUL; break; case ASN_STRING_BMPString: - OUT("const uint16_t *ch = st->buf;\n"); - OUT("const uint16_t *end = ch + st->size;\n"); + OUT("const uint8_t *ch = st->buf;\n"); + OUT("const uint8_t *end = ch + st->size;\n"); OUT("\n"); - OUT("if(st->size % 2) return -1; /* (size%2)! */\n"); - OUT("for(; ch < end; ch++) {\n"); + OUT("if(st->size %% 2) return -1; /* (size%%2)! */\n"); + OUT("for(; ch < end; ch += 2) {\n"); INDENT(+1); - OUT("uint16_t cv = (((const uint8_t *)ch)[0] << 8)\n"); - OUT("\t\t| ((const uint8_t *)ch)[1];\n"); + OUT("uint16_t cv = (ch[0] << 8)\n"); + OUT("\t\t| ch[1];\n"); if(!range) OUT("if(cv > 255) return -1;\n"); natural_stop = 0xffff; break; From 12c8f69a56db3203d0df1f84ef3f4b0ce0a13f97 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 6 Sep 2004 08:07:29 +0000 Subject: [PATCH 0269/1469] -fall-defs-global git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@269 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/asn1c.1 | 10 +++++++++- asn1c/asn1c.c | 24 +++++++++++------------- doc/asn1c-usage.lyx | 27 +++++++++++++++++++++++++-- doc/asn1c-usage.pdf | Bin 66895 -> 69290 bytes libasn1compiler/asn1c_C.c | 8 +++++++- libasn1compiler/asn1compiler.h | 4 ++++ 6 files changed, 56 insertions(+), 17 deletions(-) diff --git a/asn1c/asn1c.1 b/asn1c/asn1c.1 index f8553d049..f2c3677e2 100644 --- a/asn1c/asn1c.1 +++ b/asn1c/asn1c.1 @@ -27,7 +27,7 @@ and other encoding standards. .TP \fILanguage Options\fR .br -\fB\-fbless-SIZE \-fnative-integers \-funnamed-unions \-ftypes88\fR +\fB\-fall-defs-global \-fbless-SIZE \-fnative-integers \-funnamed-unions \-ftypes88\fR .TP \fIOutput Options\fR .br @@ -74,6 +74,14 @@ Enable ASN.1 syntax tree fixer debugging during the fixing stage. Enable debugging during the actual compile time. .SH LANGUAGE OPTIONS .TP +.B \-fall-defs-global +Normally the compiler hides the definitions (asn1_DEF_xxx) of the inner +structure elements (members of SEQUENCE, SET and other types). This option +makes all such definitions global. +Enabling this option may pollute the namespace by making lots of asn1_DEF_xxx +structures globally visible, but will allow you to manipulate +(encode and decode) the individual members of any complex ASN.1 structure. +.TP .B \-fbless-SIZE Allow SIZE() constraint for INTEGER, ENUMERATED, and other types for which this constraint is normally prohibited by the standard. This is a violation of diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index db0068851..d84d86421 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -54,20 +54,20 @@ main(int ac, char **av) { print_arg__fix_n_print = 1; break; case 'f': - if(strcmp(optarg, "types88") == 0) { - asn1_parser_flags |= A1P_TYPES_RESTRICT_TO_1988; - } else if(strcmp(optarg, "constr90") == 0) { - asn1_parser_flags |= A1P_CONSTRUCTS_RESTRICT_TO_1990; - } else if(strcmp(optarg, "native-integers") == 0) { - asn1_compiler_flags |= A1C_USE_NATIVE_INTEGERS; - } else if(strcmp(optarg, "unnamed-unions") == 0) { - asn1_compiler_flags |= A1C_UNNAMED_UNIONS; + if(strcmp(optarg, "all-defs-global") == 0) { + asn1_compiler_flags |= A1C_ALL_DEFS_GLOBAL; + } else if(strcmp(optarg, "bless-SIZE") == 0) { + asn1_fixer_flags |= A1F_EXTENDED_SizeConstraint; } else if(strncmp(optarg, "known-extern-type=", 18) == 0) { char *known_type = optarg + 18; ret = asn1f_make_known_external_type(known_type); assert(ret == 0 || errno == EEXIST); - } else if(strcmp(optarg, "bless-SIZE") == 0) { - asn1_fixer_flags |= A1F_EXTENDED_SizeConstraint; + } else if(strcmp(optarg, "native-integers") == 0) { + asn1_compiler_flags |= A1C_USE_NATIVE_INTEGERS; + } else if(strcmp(optarg, "unnamed-unions") == 0) { + asn1_compiler_flags |= A1C_UNNAMED_UNIONS; + } else if(strcmp(optarg, "types88") == 0) { + asn1_parser_flags |= A1P_TYPES_RESTRICT_TO_1988; } else { fprintf(stderr, "-f%s: Invalid argument\n", optarg); exit(EX_USAGE); @@ -286,10 +286,8 @@ usage(char *av0) { " -Wdebug-compiler --//-- compiler\n" "\n" +" -fall-defs-global Don't make the asn1_DEF_'s of structure members \"static\"\n" " -fbless-SIZE Allow SIZE() constraint for INTEGER etc (non-std.)\n" -/* -" -fconstr90 Use only ASN.1:1990 constructs (not available)\n" -*/ " -fknown-extern-type= Pretend this type is known\n" " -fnative-integers Use int instead of INTEGER_t whenever possible\n" " -funnamed-unions Enable unnamed unions in structures\n" diff --git a/doc/asn1c-usage.lyx b/doc/asn1c-usage.lyx index 27736a2d5..8cd9e30aa 100644 --- a/doc/asn1c-usage.lyx +++ b/doc/asn1c-usage.lyx @@ -1309,13 +1309,13 @@ The Table \begin_inset Float table wide false -collapsed true +collapsed false \layout Standard \begin_inset Tabular - + @@ -1602,6 +1602,29 @@ Description \layout Standard +-fall-defs-global +\end_inset + + +\begin_inset Text + +\layout Standard + +Normally the compiler hides the definitions (asn1_DEF_xxx) of the inner + structure elements (members of SEQUENCE, SET and other types). + This option makes all such definitions global. + Enabling this option may pollute the namespace by making lots of asn1_DEF_xxx + structures globally visible, but will allow you to manipulate (encode and + decode) the individual members of any complex ASN.1 structure. +\end_inset + + + + +\begin_inset Text + +\layout Standard + -fbless-SIZE \end_inset diff --git a/doc/asn1c-usage.pdf b/doc/asn1c-usage.pdf index 215d99de6b7de1901d845dc56afb23f1e7a7f3d7..0a3313f4057475eb7e93484a8abb47ffc1b85f55 100644 GIT binary patch delta 38663 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 diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 10142ca7d..a9aa23b37 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -45,6 +45,7 @@ static int emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, int tags_count, int tag #define C99_MODE (!(arg->flags & A1C_NO_C99)) #define UNNAMED_UNIONS (arg->flags & A1C_UNNAMED_UNIONS) +#define HIDE_INNER_DEFS (arg->embed && !(arg->flags & A1C_ALL_DEFS_GLOBAL)) #define PCTX_DEF INDENTED( \ OUT("\n"); \ @@ -867,7 +868,10 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { REDIR(OT_FUNC_DECLS); p = MKID(expr->Identifier); - OUT("extern asn1_TYPE_descriptor_t asn1_DEF_%s;\n", p); + if(HIDE_INNER_DEFS) OUT("/* "); + OUT("extern asn1_TYPE_descriptor_t asn1_DEF_%s;", p); + if(HIDE_INNER_DEFS) OUT(" // (Use -fall-defs-global to expose) */"); + OUT("\n"); OUT("asn_constr_check_f %s_constraint;\n", p); OUT("ber_type_decoder_f %s_decode_ber;\n", p); OUT("der_type_encoder_f %s_encode_der;\n", p); @@ -1297,6 +1301,8 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, int tags_count, int tags_impl_skip char *p; p = MKID(expr->Identifier); + if(HIDE_INNER_DEFS) + OUT("static /* Use -fall-defs-global to expose */\n"); OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p); INDENTED( OUT("\"%s\",\n", expr->_anonymous_type?"":expr->Identifier); diff --git a/libasn1compiler/asn1compiler.h b/libasn1compiler/asn1compiler.h index d104dc9aa..6b9219a5c 100644 --- a/libasn1compiler/asn1compiler.h +++ b/libasn1compiler/asn1compiler.h @@ -31,6 +31,10 @@ enum asn1c_flags { * Enable use of unnamed unions (non-portable feature). */ A1C_UNNAMED_UNIONS = 0x0020, + /* + * Don't make the asn1_DEF_'s of structure members "static". + */ + A1C_ALL_DEFS_GLOBAL = 0x0040, }; /* From 7d11bec94986b8dd1b965f88e8595b4791c01ca8 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 6 Sep 2004 08:07:55 +0000 Subject: [PATCH 0270/1469] recommendation to read the manual page git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@270 59561ff5-6e30-0410-9f3c-9617f08c8826 --- INSTALL | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/INSTALL b/INSTALL index 5d2d54c5f..65b40783c 100644 --- a/INSTALL +++ b/INSTALL @@ -7,8 +7,10 @@ make check # Ensure that the code is still behaving well # after compiling on your platform make install # Install the compiler into standard location +man asn1c # Display the asn1c manual page + QUICK USAGE GUIDE ================= -For usage guide and more information please refer to README file. +For usage guide and more information please refer to the README file. From d3686cd36d2507518dd3c378477e9d2296d8658c Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 6 Sep 2004 08:08:32 +0000 Subject: [PATCH 0271/1469] added clause about asn1c command line options git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@271 59561ff5-6e30-0410-9f3c-9617f08c8826 --- README | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README b/README index e725b89f8..d9a958599 100644 --- a/README +++ b/README @@ -3,6 +3,8 @@ WHAT TO READ? For quick installation tips read INSTALL. +For the list of asn1c command line options, see `asn1c -h` or `man asn1c`. + For more complete documentation on this compiler and on using the results of compilation please look into ./doc directory. From a447deac33459467db91cc255ed9cda7fd481d13 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 7 Sep 2004 06:31:15 +0000 Subject: [PATCH 0272/1469] speed-up in one special case git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@272 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_constraint.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index f824e3a68..7398a4600 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -8,7 +8,7 @@ static int asn1c_emit_constraint_tables(arg_t *arg, int got_size); static int emit_alphabet_check_loop(arg_t *arg, asn1cnst_range_t *range); -static int emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype); +static int emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype, asn1cnst_range_t *r_value); static int emit_size_determination_code(arg_t *arg, asn1p_expr_type_e etype); static asn1p_expr_type_e _find_terminal_type(arg_t *arg); static int emit_range_comparison_code(arg_t *arg, asn1cnst_range_t *range, const char *varname, asn1_integer_t natural_start, asn1_integer_t natural_stop); @@ -115,7 +115,7 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { OUT("\n"); if(r_value) - emit_value_determination_code(arg, etype); + emit_value_determination_code(arg, etype, r_value); if(r_size) emit_size_determination_code(arg, etype); @@ -544,7 +544,7 @@ emit_size_determination_code(arg_t *arg, asn1p_expr_type_e etype) { } static int -emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype) { +emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype, asn1cnst_range_t *r_value) { switch(etype) { case ASN_BASIC_INTEGER: @@ -552,6 +552,23 @@ emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype) { if(arg->flags & A1C_USE_NATIVE_INTEGERS) { OUT("value = *(const int *)sptr;\n"); } else { + if(r_value->el_count == 0 + && ( + /* Speed-up common case: (0..MAX) */ + (r_value->left.type == ARE_VALUE + && r_value->left.value == 0 + && r_value->right.type == ARE_MAX) + || + /* Speed-up common case: (MIN..-1) */ + (r_value->left.type == ARE_MIN + && r_value->right.type == ARE_VALUE + && r_value->right.value == -1) + )) { + OUT("/* Check if the sign bit is present */\n"); + OUT("value = st->buf ? ((st->buf[0] & 0x80) ? -1 : 1) : 0;\n"); + break; + } + OUT("if(asn1_INTEGER2long(st, &value)) {\n"); INDENT(+1); OUT("_ASN_ERRLOG(app_errlog, app_key,\n"); From 769bab9c297fa01e5fe0669b6f37f9e63efdb54d Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 7 Sep 2004 06:31:41 +0000 Subject: [PATCH 0273/1469] directory order changed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@273 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure | 4 ++-- configure.in | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/configure b/configure index 043d50a3c..9ba0eac2e 100755 --- a/configure +++ b/configure @@ -22441,7 +22441,7 @@ done ac_config_headers="$ac_config_headers config.h" - ac_config_files="$ac_config_files libasn1compiler/Makefile skeletons/tests/Makefile libasn1parser/Makefile libasn1print/Makefile asn1c/tests/Makefile libasn1fix/Makefile skeletons/Makefile examples/Makefile tests/Makefile asn1c/Makefile doc/Makefile Makefile" + ac_config_files="$ac_config_files skeletons/tests/Makefile libasn1compiler/Makefile libasn1parser/Makefile libasn1print/Makefile asn1c/tests/Makefile libasn1fix/Makefile skeletons/Makefile examples/Makefile tests/Makefile asn1c/Makefile doc/Makefile Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure @@ -23026,8 +23026,8 @@ for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. - "libasn1compiler/Makefile" ) CONFIG_FILES="$CONFIG_FILES libasn1compiler/Makefile" ;; "skeletons/tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES skeletons/tests/Makefile" ;; + "libasn1compiler/Makefile" ) CONFIG_FILES="$CONFIG_FILES libasn1compiler/Makefile" ;; "libasn1parser/Makefile" ) CONFIG_FILES="$CONFIG_FILES libasn1parser/Makefile" ;; "libasn1print/Makefile" ) CONFIG_FILES="$CONFIG_FILES libasn1print/Makefile" ;; "asn1c/tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES asn1c/tests/Makefile" ;; diff --git a/configure.in b/configure.in index 1e75908ea..c679baf0d 100644 --- a/configure.in +++ b/configure.in @@ -87,8 +87,8 @@ AC_CHECK_FUNCS(mergesort) AM_CONFIG_HEADER(config.h) AC_OUTPUT( \ -libasn1compiler/Makefile \ skeletons/tests/Makefile \ +libasn1compiler/Makefile \ libasn1parser/Makefile \ libasn1print/Makefile \ asn1c/tests/Makefile \ From 399506ea4648c429e5f29754ea2ed94f72287852 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 7 Sep 2004 06:31:59 +0000 Subject: [PATCH 0274/1469] more info git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@274 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/README | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/examples/README b/examples/README index ec867b2c6..58c58d2d5 100644 --- a/examples/README +++ b/examples/README @@ -1,5 +1,10 @@ -This directory contains several convertors from known text formats into -the ASN.1 specifications, as well as examples of these formats and the -sample convertor's output. +This directory contains several convertors from a few known text formats into +the ASN.1 modules, as well as examples of these formats and the sample +convertor's output (generated by `make`). +To regenerate the .asn1 files, do `rm *.asn1; make`. + +To compile the files using asn1c, try + + ../asn1c/asn1c -P rfc3280-*.asn1 From face475730c16c25adcb6dca4f3b532b24f55b29 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 7 Sep 2004 06:32:11 +0000 Subject: [PATCH 0275/1469] automatic .asn1 files creation git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@275 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/Makefile.am | 11 ++++++++++- examples/Makefile.in | 13 ++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/examples/Makefile.am b/examples/Makefile.am index 5b856e50c..90e2678f5 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -1,4 +1,13 @@ dist_bin_SCRIPTS = crfc2asn1.pl clyx2asn1.pl -EXTRA_DIST = *.asn1 rfc*.txt +ASN1_SOURCE_1 = rfc3280.txt +ASN1_FILES_1 = rfc3280-PKIX1Explicit88.asn1 rfc3280-PKIX1Implicit88.asn1 + +all: $(ASN1_FILES_1) + +$(ASN1_FILES_1): crfc2asn1.pl $(ASN1_SOURCE_1) + ./crfc2asn1.pl $(ASN1_SOURCE_1) + +EXTRA_DIST = rfc*.txt +CLEANFILES = *.asn1 diff --git a/examples/Makefile.in b/examples/Makefile.in index 09bae06a3..97ce8d4ff 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -34,9 +34,7 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = @build@ host_triplet = @host@ -target_triplet = @target@ subdir = examples DIST_COMMON = README $(dist_bin_SCRIPTS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in @@ -164,7 +162,10 @@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ dist_bin_SCRIPTS = crfc2asn1.pl clyx2asn1.pl -EXTRA_DIST = *.asn1 rfc*.txt +ASN1_SOURCE_1 = rfc3280.txt +ASN1_FILES_1 = rfc3280-PKIX1Explicit88.asn1 rfc3280-PKIX1Implicit88.asn1 +EXTRA_DIST = rfc*.txt +CLEANFILES = *.asn1 all: all-am .SUFFIXES: @@ -284,6 +285,7 @@ install-strip: mostlyclean-generic: clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -rm -f $(CONFIG_CLEAN_FILES) @@ -348,6 +350,11 @@ uninstall-am: uninstall-dist_binSCRIPTS uninstall-info-am ps ps-am uninstall uninstall-am uninstall-dist_binSCRIPTS \ uninstall-info-am + +all: $(ASN1_FILES_1) + +$(ASN1_FILES_1): crfc2asn1.pl $(ASN1_SOURCE_1) + ./crfc2asn1.pl $(ASN1_SOURCE_1) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: From f7d4f4aa504574b17cf35e7133ea80f13974ecc2 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 7 Sep 2004 06:36:22 +0000 Subject: [PATCH 0276/1469] comment git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@276 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/clyx2asn1.pl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/clyx2asn1.pl b/examples/clyx2asn1.pl index e544baa57..83afbeb43 100755 --- a/examples/clyx2asn1.pl +++ b/examples/clyx2asn1.pl @@ -4,8 +4,7 @@ # $Id$ # $Author$ # -# Simple tool that fetches known ASN.1 specifications from the -# stream of LyX data. +# Simple tool that extracts known ASN.1 modules from the stream of LyX data. # if($#ARGV == -1) { From 54c5d2ef931270529a988b57066a69c1ad9fe765 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 7 Sep 2004 06:36:35 +0000 Subject: [PATCH 0277/1469] real-lifing specs git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@277 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/crfc2asn1.pl | 47 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/examples/crfc2asn1.pl b/examples/crfc2asn1.pl index 3e68c5d75..df0a099f0 100755 --- a/examples/crfc2asn1.pl +++ b/examples/crfc2asn1.pl @@ -11,6 +11,7 @@ my $inasn = 0; # Are we inside ASN.1 grammar? my $found = 0; +my $currentFname = ''; if(-t STDIN && $#ARGV == -1) { print STDERR "Rip ASN.1 specification from RFC file\n"; @@ -35,6 +36,8 @@ if(/^[ \t]*END[ \t]*$/) { print STDERR "Missed an ASN.1 grammar before line ". $. ."?\n"; + unlink($currentFile) or die "Can't remove $!"; + print STDERR "Removed $currentFile"; exit(1); } @@ -42,12 +45,10 @@ $rfcid = $1 . '-' if($ARGV =~ /([a-z0-9]+)/i); if(/^[ \t]+([A-Za-z0-9-]+).*DEFINITIONS.*::=/) { - my $fname = $rfcid . $1 . ".asn1"; - open(O, "> $fname") or die "Can't open $fname"; - select(O); + $currentFname = $rfcid . $1 . ".asn1"; $inasn = 1; } elsif(/^[ \t]*([A-Za-z0-9-]+).*{.*iso/) { - my $fname = $rfcid . $1 . ".asn1"; + $currentFname = $rfcid . $1 . ".asn1"; my @a = ($_); my $i; for($i = 0; $i < 8; $i++) { @@ -60,27 +61,53 @@ } } next unless $inasn; - open(O, "> $fname") or die "Can't open $fname"; - select(O); } else { next; } + print STDERR "Found $1 at line $. => $currentFname\n"; + open(O, "> $currentFname") or die "Can't open $currentFname"; + select(O); + $found++; print "\n"; print "-- \n"; - print "-- ASN.1 module found in $ARGV by $0 at " . $. . "\n"; + print "-- ASN.1 module found by $0 in $ARGV at line " . $. . "\n"; print "-- \n"; print "\n"; } - print; - if(/^[ \t]*END[ \t]*$/) { + print; select(STDOUT); close(O); $inasn = 0; + next; } + + # + # The following clauses are primarily designed to make + # asn1c command-line easier (i.e., to avoid "-ftypes88"). + # You may want to get rid of them if you're doing generic + # ASN.1 extraction and do not want to alter the ASN.1 specs. + # + if( +/^(.*)((UniversalString|BMPString|UTF8String)\s+::=\s+\[[A-Z]+\s\d+\]\sIMPLICIT\sOCTET\sSTRING)(.*)$/ms + ) { + print "\n-- Legacy redefinition of $3 removed by $0:\n"; + print "$1-- $2 -- $4"; + next; + } elsif(/delete following line if \"new\" types are supported/) { + print; + print "/* Legacy stuff deleted by $0:\n"; + $_ = <>; + print; + print " */\n"; + next; + } + + + print; # Dump the ASN.1 module line out. } -die "No ASN.1 specifications found\n" unless $found; +die "No ASN.1 modules found\n" unless $found; From 5521edf748b929a1187ac22097820b7586925e71 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 7 Sep 2004 06:36:54 +0000 Subject: [PATCH 0278/1469] added obsolete rfc2459 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@278 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/Makefile.am | 16 ++++++++++++++-- examples/Makefile.in | 17 +++++++++++++++-- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/examples/Makefile.am b/examples/Makefile.am index 90e2678f5..ca3f9d615 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -1,10 +1,22 @@ dist_bin_SCRIPTS = crfc2asn1.pl clyx2asn1.pl +ASN1_SOURCE_0 = rfc2459.txt +ASN1_FILES_0 = \ + rfc2459-PKIX1Explicit88.asn1 \ + rfc2459-PKIX1Implicit88.asn1 \ + rfc2459-PKIX1Explicit93.asn1 \ + rfc2459-PKIX1Implicit93.asn1 + ASN1_SOURCE_1 = rfc3280.txt -ASN1_FILES_1 = rfc3280-PKIX1Explicit88.asn1 rfc3280-PKIX1Implicit88.asn1 +ASN1_FILES_1 = \ + rfc3280-PKIX1Explicit88.asn1 \ + rfc3280-PKIX1Implicit88.asn1 + +all: $(ASN1_FILES_0) $(ASN1_FILES_1) -all: $(ASN1_FILES_1) +$(ASN1_FILES_0): crfc2asn1.pl $(ASN1_SOURCE_0) + ./crfc2asn1.pl $(ASN1_SOURCE_0) $(ASN1_FILES_1): crfc2asn1.pl $(ASN1_SOURCE_1) ./crfc2asn1.pl $(ASN1_SOURCE_1) diff --git a/examples/Makefile.in b/examples/Makefile.in index 97ce8d4ff..72259e204 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -162,8 +162,18 @@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ dist_bin_SCRIPTS = crfc2asn1.pl clyx2asn1.pl +ASN1_SOURCE_0 = rfc2459.txt +ASN1_FILES_0 = \ + rfc2459-PKIX1Explicit88.asn1 \ + rfc2459-PKIX1Implicit88.asn1 \ + rfc2459-PKIX1Explicit93.asn1 \ + rfc2459-PKIX1Implicit93.asn1 + ASN1_SOURCE_1 = rfc3280.txt -ASN1_FILES_1 = rfc3280-PKIX1Explicit88.asn1 rfc3280-PKIX1Implicit88.asn1 +ASN1_FILES_1 = \ + rfc3280-PKIX1Explicit88.asn1 \ + rfc3280-PKIX1Implicit88.asn1 + EXTRA_DIST = rfc*.txt CLEANFILES = *.asn1 all: all-am @@ -351,7 +361,10 @@ uninstall-am: uninstall-dist_binSCRIPTS uninstall-info-am uninstall-info-am -all: $(ASN1_FILES_1) +all: $(ASN1_FILES_0) $(ASN1_FILES_1) + +$(ASN1_FILES_0): crfc2asn1.pl $(ASN1_SOURCE_0) + ./crfc2asn1.pl $(ASN1_SOURCE_0) $(ASN1_FILES_1): crfc2asn1.pl $(ASN1_SOURCE_1) ./crfc2asn1.pl $(ASN1_SOURCE_1) From 270be9fd10ee5dea85e443da4c075dad8bb5d5d5 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 7 Sep 2004 06:37:25 +0000 Subject: [PATCH 0279/1469] added rfc3280 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@279 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/rfc3280.txt | 7227 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 7227 insertions(+) create mode 100644 examples/rfc3280.txt diff --git a/examples/rfc3280.txt b/examples/rfc3280.txt new file mode 100644 index 000000000..433908bb7 --- /dev/null +++ b/examples/rfc3280.txt @@ -0,0 +1,7227 @@ + + + + + + +Network Working Group R. Housley +Request for Comments: 3280 RSA Laboratories +Obsoletes: 2459 W. Polk +Category: Standards Track NIST + W. Ford + VeriSign + D. Solo + Citigroup + April 2002 + + Internet X.509 Public Key Infrastructure + Certificate and Certificate Revocation List (CRL) Profile + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (2002). All Rights Reserved. + +Abstract + + This memo profiles the X.509 v3 certificate and X.509 v2 Certificate + Revocation List (CRL) for use in the Internet. An overview of this + approach and model are provided as an introduction. The X.509 v3 + certificate format is described in detail, with additional + information regarding the format and semantics of Internet name + forms. Standard certificate extensions are described and two + Internet-specific extensions are defined. A set of required + certificate extensions is specified. The X.509 v2 CRL format is + described in detail, and required extensions are defined. An + algorithm for X.509 certification path validation is described. An + ASN.1 module and examples are provided in the appendices. + +Table of Contents + + 1 Introduction . . . . . . . . . . . . . . . . . . . . . . 4 + 2 Requirements and Assumptions . . . . . . . . . . . . . . 5 + 2.1 Communication and Topology . . . . . . . . . . . . . . 6 + 2.2 Acceptability Criteria . . . . . . . . . . . . . . . . 6 + 2.3 User Expectations . . . . . . . . . . . . . . . . . . . 7 + 2.4 Administrator Expectations . . . . . . . . . . . . . . 7 + 3 Overview of Approach . . . . . . . . . . . . . . . . . . 7 + + + +Housley, et. al. Standards Track [Page 1] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + 3.1 X.509 Version 3 Certificate . . . . . . . . . . . . . . 8 + 3.2 Certification Paths and Trust . . . . . . . . . . . . . 9 + 3.3 Revocation . . . . . . . . . . . . . . . . . . . . . . 11 + 3.4 Operational Protocols . . . . . . . . . . . . . . . . . 13 + 3.5 Management Protocols . . . . . . . . . . . . . . . . . 13 + 4 Certificate and Certificate Extensions Profile . . . . . 14 + 4.1 Basic Certificate Fields . . . . . . . . . . . . . . . 15 + 4.1.1 Certificate Fields . . . . . . . . . . . . . . . . . 16 + 4.1.1.1 tbsCertificate . . . . . . . . . . . . . . . . . . 16 + 4.1.1.2 signatureAlgorithm . . . . . . . . . . . . . . . . 16 + 4.1.1.3 signatureValue . . . . . . . . . . . . . . . . . . 16 + 4.1.2 TBSCertificate . . . . . . . . . . . . . . . . . . . 17 + 4.1.2.1 Version . . . . . . . . . . . . . . . . . . . . . . 17 + 4.1.2.2 Serial number . . . . . . . . . . . . . . . . . . . 17 + 4.1.2.3 Signature . . . . . . . . . . . . . . . . . . . . . 18 + 4.1.2.4 Issuer . . . . . . . . . . . . . . . . . . . . . . 18 + 4.1.2.5 Validity . . . . . . . . . . . . . . . . . . . . . 22 + 4.1.2.5.1 UTCTime . . . . . . . . . . . . . . . . . . . . . 22 + 4.1.2.5.2 GeneralizedTime . . . . . . . . . . . . . . . . . 22 + 4.1.2.6 Subject . . . . . . . . . . . . . . . . . . . . . . 23 + 4.1.2.7 Subject Public Key Info . . . . . . . . . . . . . . 24 + 4.1.2.8 Unique Identifiers . . . . . . . . . . . . . . . . 24 + 4.1.2.9 Extensions . . . . . . . . . . . . . . . . . . . . . 24 + 4.2 Certificate Extensions . . . . . . . . . . . . . . . . 24 + 4.2.1 Standard Extensions . . . . . . . . . . . . . . . . . 25 + 4.2.1.1 Authority Key Identifier . . . . . . . . . . . . . 26 + 4.2.1.2 Subject Key Identifier . . . . . . . . . . . . . . 27 + 4.2.1.3 Key Usage . . . . . . . . . . . . . . . . . . . . . 28 + 4.2.1.4 Private Key Usage Period . . . . . . . . . . . . . 29 + 4.2.1.5 Certificate Policies . . . . . . . . . . . . . . . 30 + 4.2.1.6 Policy Mappings . . . . . . . . . . . . . . . . . . 33 + 4.2.1.7 Subject Alternative Name . . . . . . . . . . . . . 33 + 4.2.1.8 Issuer Alternative Name . . . . . . . . . . . . . . 36 + 4.2.1.9 Subject Directory Attributes . . . . . . . . . . . 36 + 4.2.1.10 Basic Constraints . . . . . . . . . . . . . . . . 36 + 4.2.1.11 Name Constraints . . . . . . . . . . . . . . . . . 37 + 4.2.1.12 Policy Constraints . . . . . . . . . . . . . . . . 40 + 4.2.1.13 Extended Key Usage . . . . . . . . . . . . . . . . 40 + 4.2.1.14 CRL Distribution Points . . . . . . . . . . . . . 42 + 4.2.1.15 Inhibit Any-Policy . . . . . . . . . . . . . . . . 44 + 4.2.1.16 Freshest CRL . . . . . . . . . . . . . . . . . . . 44 + 4.2.2 Internet Certificate Extensions . . . . . . . . . . . 45 + 4.2.2.1 Authority Information Access . . . . . . . . . . . 45 + 4.2.2.2 Subject Information Access . . . . . . . . . . . . 46 + 5 CRL and CRL Extensions Profile . . . . . . . . . . . . . 48 + 5.1 CRL Fields . . . . . . . . . . . . . . . . . . . . . . 49 + 5.1.1 CertificateList Fields . . . . . . . . . . . . . . . 50 + 5.1.1.1 tbsCertList . . . . . . . . . . . . . . . . . . . . 50 + + + +Housley, et. al. Standards Track [Page 2] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + 5.1.1.2 signatureAlgorithm . . . . . . . . . . . . . . . . 50 + 5.1.1.3 signatureValue . . . . . . . . . . . . . . . . . . 51 + 5.1.2 Certificate List "To Be Signed" . . . . . . . . . . . 51 + 5.1.2.1 Version . . . . . . . . . . . . . . . . . . . . . . 52 + 5.1.2.2 Signature . . . . . . . . . . . . . . . . . . . . . 52 + 5.1.2.3 Issuer Name . . . . . . . . . . . . . . . . . . . . 52 + 5.1.2.4 This Update . . . . . . . . . . . . . . . . . . . . 52 + 5.1.2.5 Next Update . . . . . . . . . . . . . . . . . . . . 53 + 5.1.2.6 Revoked Certificates . . . . . . . . . . . . . . . 53 + 5.1.2.7 Extensions . . . . . . . . . . . . . . . . . . . . 53 + 5.2 CRL Extensions . . . . . . . . . . . . . . . . . . . . 53 + 5.2.1 Authority Key Identifier . . . . . . . . . . . . . . 54 + 5.2.2 Issuer Alternative Name . . . . . . . . . . . . . . . 54 + 5.2.3 CRL Number . . . . . . . . . . . . . . . . . . . . . 55 + 5.2.4 Delta CRL Indicator . . . . . . . . . . . . . . . . . 55 + 5.2.5 Issuing Distribution Point . . . . . . . . . . . . . 58 + 5.2.6 Freshest CRL . . . . . . . . . . . . . . . . . . . . 59 + 5.3 CRL Entry Extensions . . . . . . . . . . . . . . . . . 60 + 5.3.1 Reason Code . . . . . . . . . . . . . . . . . . . . . 60 + 5.3.2 Hold Instruction Code . . . . . . . . . . . . . . . . 61 + 5.3.3 Invalidity Date . . . . . . . . . . . . . . . . . . . 62 + 5.3.4 Certificate Issuer . . . . . . . . . . . . . . . . . 62 + 6 Certificate Path Validation . . . . . . . . . . . . . . . 62 + 6.1 Basic Path Validation . . . . . . . . . . . . . . . . . 63 + 6.1.1 Inputs . . . . . . . . . . . . . . . . . . . . . . . 66 + 6.1.2 Initialization . . . . . . . . . . . . . . . . . . . 67 + 6.1.3 Basic Certificate Processing . . . . . . . . . . . . 70 + 6.1.4 Preparation for Certificate i+1 . . . . . . . . . . . 75 + 6.1.5 Wrap-up procedure . . . . . . . . . . . . . . . . . . 78 + 6.1.6 Outputs . . . . . . . . . . . . . . . . . . . . . . . 80 + 6.2 Extending Path Validation . . . . . . . . . . . . . . . 80 + 6.3 CRL Validation . . . . . . . . . . . . . . . . . . . . 81 + 6.3.1 Revocation Inputs . . . . . . . . . . . . . . . . . . 82 + 6.3.2 Initialization and Revocation State Variables . . . . 82 + 6.3.3 CRL Processing . . . . . . . . . . . . . . . . . . . 83 + 7 References . . . . . . . . . . . . . . . . . . . . . . . 86 + 8 Intellectual Property Rights . . . . . . . . . . . . . . 88 + 9 Security Considerations . . . . . . . . . . . . . . . . . 89 + Appendix A. ASN.1 Structures and OIDs . . . . . . . . . . . 92 + A.1 Explicitly Tagged Module, 1988 Syntax . . . . . . . . . 92 + A.2 Implicitly Tagged Module, 1988 Syntax . . . . . . . . . 105 + Appendix B. ASN.1 Notes . . . . . . . . . . . . . . . . . . 112 + Appendix C. Examples . . . . . . . . . . . . . . . . . . . 115 + C.1 DSA Self-Signed Certificate . . . . . . . . . . . . . . 115 + C.2 End Entity Certificate Using DSA . . . . . . . . . . . 119 + C.3 End Entity Certificate Using RSA . . . . . . . . . . . 122 + C.4 Certificate Revocation List . . . . . . . . . . . . . . 126 + Author Addresses . . . . . . . . . . . . . . . . . . . . . . 128 + + + +Housley, et. al. Standards Track [Page 3] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + Full Copyright Statement . . . . . . . . . . . . . . . . . . 129 + +1 Introduction + + This specification is one part of a family of standards for the X.509 + Public Key Infrastructure (PKI) for the Internet. + + This specification profiles the format and semantics of certificates + and certificate revocation lists (CRLs) for the Internet PKI. + Procedures are described for processing of certification paths in the + Internet environment. Finally, ASN.1 modules are provided in the + appendices for all data structures defined or referenced. + + Section 2 describes Internet PKI requirements, and the assumptions + which affect the scope of this document. Section 3 presents an + architectural model and describes its relationship to previous IETF + and ISO/IEC/ITU-T standards. In particular, this document's + relationship with the IETF PEM specifications and the ISO/IEC/ITU-T + X.509 documents are described. + + Section 4 profiles the X.509 version 3 certificate, and section 5 + profiles the X.509 version 2 CRL. The profiles include the + identification of ISO/IEC/ITU-T and ANSI extensions which may be + useful in the Internet PKI. The profiles are presented in the 1988 + Abstract Syntax Notation One (ASN.1) rather than the 1997 ASN.1 + syntax used in the most recent ISO/IEC/ITU-T standards. + + Section 6 includes certification path validation procedures. These + procedures are based upon the ISO/IEC/ITU-T definition. + Implementations are REQUIRED to derive the same results but are not + required to use the specified procedures. + + Procedures for identification and encoding of public key materials + and digital signatures are defined in [PKIXALGS]. Implementations of + this specification are not required to use any particular + cryptographic algorithms. However, conforming implementations which + use the algorithms identified in [PKIXALGS] MUST identify and encode + the public key materials and digital signatures as described in that + specification. + + Finally, three appendices are provided to aid implementers. Appendix + A contains all ASN.1 structures defined or referenced within this + specification. As above, the material is presented in the 1988 + ASN.1. Appendix B contains notes on less familiar features of the + ASN.1 notation used within this specification. Appendix C contains + examples of a conforming certificate and a conforming CRL. + + + + + +Housley, et. al. Standards Track [Page 4] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + This specification obsoletes RFC 2459. This specification differs + from RFC 2459 in five basic areas: + + * To promote interoperable implementations, a detailed algorithm + for certification path validation is included in section 6.1 of + this specification; RFC 2459 provided only a high-level + description of path validation. + + * An algorithm for determining the status of a certificate using + CRLs is provided in section 6.3 of this specification. This + material was not present in RFC 2459. + + * To accommodate new usage models, detailed information describing + the use of delta CRLs is provided in Section 5 of this + specification. + + * Identification and encoding of public key materials and digital + signatures are not included in this specification, but are now + described in a companion specification [PKIXALGS]. + + * Four additional extensions are specified: three certificate + extensions and one CRL extension. The certificate extensions are + subject info access, inhibit any-policy, and freshest CRL. The + freshest CRL extension is also defined as a CRL extension. + + * Throughout the specification, clarifications have been + introduced to enhance consistency with the ITU-T X.509 + specification. X.509 defines the certificate and CRL format as + well as many of the extensions that appear in this specification. + These changes were introduced to improve the likelihood of + interoperability between implementations based on this + specification with implementations based on the ITU-T + specification. + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in RFC 2119. + +2 Requirements and Assumptions + + The goal of this specification is to develop a profile to facilitate + the use of X.509 certificates within Internet applications for those + communities wishing to make use of X.509 technology. Such + applications may include WWW, electronic mail, user authentication, + and IPsec. In order to relieve some of the obstacles to using X.509 + + + + + + +Housley, et. al. Standards Track [Page 5] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + certificates, this document defines a profile to promote the + development of certificate management systems; development of + application tools; and interoperability determined by policy. + + Some communities will need to supplement, or possibly replace, this + profile in order to meet the requirements of specialized application + domains or environments with additional authorization, assurance, or + operational requirements. However, for basic applications, common + representations of frequently used attributes are defined so that + application developers can obtain necessary information without + regard to the issuer of a particular certificate or certificate + revocation list (CRL). + + A certificate user should review the certificate policy generated by + the certification authority (CA) before relying on the authentication + or non-repudiation services associated with the public key in a + particular certificate. To this end, this standard does not + prescribe legally binding rules or duties. + + As supplemental authorization and attribute management tools emerge, + such as attribute certificates, it may be appropriate to limit the + authenticated attributes that are included in a certificate. These + other management tools may provide more appropriate methods of + conveying many authenticated attributes. + +2.1 Communication and Topology + + The users of certificates will operate in a wide range of + environments with respect to their communication topology, especially + users of secure electronic mail. This profile supports users without + high bandwidth, real-time IP connectivity, or high connection + availability. In addition, the profile allows for the presence of + firewall or other filtered communication. + + This profile does not assume the deployment of an X.500 Directory + system or a LDAP directory system. The profile does not prohibit the + use of an X.500 Directory or a LDAP directory; however, any means of + distributing certificates and certificate revocation lists (CRLs) may + be used. + +2.2 Acceptability Criteria + + The goal of the Internet Public Key Infrastructure (PKI) is to meet + the needs of deterministic, automated identification, authentication, + access control, and authorization functions. Support for these + services determines the attributes contained in the certificate as + well as the ancillary control information in the certificate such as + policy data and certification path constraints. + + + +Housley, et. al. Standards Track [Page 6] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + +2.3 User Expectations + + Users of the Internet PKI are people and processes who use client + software and are the subjects named in certificates. These uses + include readers and writers of electronic mail, the clients for WWW + browsers, WWW servers, and the key manager for IPsec within a router. + This profile recognizes the limitations of the platforms these users + employ and the limitations in sophistication and attentiveness of the + users themselves. This manifests itself in minimal user + configuration responsibility (e.g., trusted CA keys, rules), explicit + platform usage constraints within the certificate, certification path + constraints which shield the user from many malicious actions, and + applications which sensibly automate validation functions. + +2.4 Administrator Expectations + + As with user expectations, the Internet PKI profile is structured to + support the individuals who generally operate CAs. Providing + administrators with unbounded choices increases the chances that a + subtle CA administrator mistake will result in broad compromise. + Also, unbounded choices greatly complicate the software that process + and validate the certificates created by the CA. + +3 Overview of Approach + + Following is a simplified view of the architectural model assumed by + the PKIX specifications. + + The components in this model are: + + end entity: user of PKI certificates and/or end user system that is + the subject of a certificate; + CA: certification authority; + RA: registration authority, i.e., an optional system to which + a CA delegates certain management functions; + CRL issuer: an optional system to which a CA delegates the + publication of certificate revocation lists; + repository: a system or collection of distributed systems that stores + certificates and CRLs and serves as a means of + distributing these certificates and CRLs to end entities. + + Note that an Attribute Authority (AA) might also choose to delegate + the publication of CRLs to a CRL issuer. + + + + + + + + +Housley, et. al. Standards Track [Page 7] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + +---+ + | C | +------------+ + | e | <-------------------->| End entity | + | r | Operational +------------+ + | t | transactions ^ + | i | and management | Management + | f | transactions | transactions PKI + | i | | users + | c | v + | a | ======================= +--+------------+ ============== + | t | ^ ^ + | e | | | PKI + | | v | management + | & | +------+ | entities + | | <---------------------| RA |<----+ | + | C | Publish certificate +------+ | | + | R | | | + | L | | | + | | v v + | R | +------------+ + | e | <------------------------------| CA | + | p | Publish certificate +------------+ + | o | Publish CRL ^ ^ + | s | | | Management + | i | +------------+ | | transactions + | t | <--------------| CRL Issuer |<----+ | + | o | Publish CRL +------------+ v + | r | +------+ + | y | | CA | + +---+ +------+ + + Figure 1 - PKI Entities + +3.1 X.509 Version 3 Certificate + + Users of a public key require confidence that the associated private + key is owned by the correct remote subject (person or system) with + which an encryption or digital signature mechanism will be used. + This confidence is obtained through the use of public key + certificates, which are data structures that bind public key values + to subjects. The binding is asserted by having a trusted CA + digitally sign each certificate. The CA may base this assertion upon + technical means (a.k.a., proof of possession through a challenge- + response protocol), presentation of the private key, or on an + assertion by the subject. A certificate has a limited valid lifetime + which is indicated in its signed contents. Because a certificate's + signature and timeliness can be independently checked by a + certificate-using client, certificates can be distributed via + + + +Housley, et. al. Standards Track [Page 8] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + untrusted communications and server systems, and can be cached in + unsecured storage in certificate-using systems. + + ITU-T X.509 (formerly CCITT X.509) or ISO/IEC 9594-8, which was first + published in 1988 as part of the X.500 Directory recommendations, + defines a standard certificate format [X.509]. The certificate + format in the 1988 standard is called the version 1 (v1) format. + When X.500 was revised in 1993, two more fields were added, resulting + in the version 2 (v2) format. + + The Internet Privacy Enhanced Mail (PEM) RFCs, published in 1993, + include specifications for a public key infrastructure based on X.509 + v1 certificates [RFC 1422]. The experience gained in attempts to + deploy RFC 1422 made it clear that the v1 and v2 certificate formats + are deficient in several respects. Most importantly, more fields + were needed to carry information which PEM design and implementation + experience had proven necessary. In response to these new + requirements, ISO/IEC, ITU-T and ANSI X9 developed the X.509 version + 3 (v3) certificate format. The v3 format extends the v2 format by + adding provision for additional extension fields. Particular + extension field types may be specified in standards or may be defined + and registered by any organization or community. In June 1996, + standardization of the basic v3 format was completed [X.509]. + + ISO/IEC, ITU-T, and ANSI X9 have also developed standard extensions + for use in the v3 extensions field [X.509][X9.55]. These extensions + can convey such data as additional subject identification + information, key attribute information, policy information, and + certification path constraints. + + However, the ISO/IEC, ITU-T, and ANSI X9 standard extensions are very + broad in their applicability. In order to develop interoperable + implementations of X.509 v3 systems for Internet use, it is necessary + to specify a profile for use of the X.509 v3 extensions tailored for + the Internet. It is one goal of this document to specify a profile + for Internet WWW, electronic mail, and IPsec applications. + Environments with additional requirements may build on this profile + or may replace it. + +3.2 Certification Paths and Trust + + A user of a security service requiring knowledge of a public key + generally needs to obtain and validate a certificate containing the + required public key. If the public key user does not already hold an + assured copy of the public key of the CA that signed the certificate, + the CA's name, and related information (such as the validity period + or name constraints), then it might need an additional certificate to + obtain that public key. In general, a chain of multiple certificates + + + +Housley, et. al. Standards Track [Page 9] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + may be needed, comprising a certificate of the public key owner (the + end entity) signed by one CA, and zero or more additional + certificates of CAs signed by other CAs. Such chains, called + certification paths, are required because a public key user is only + initialized with a limited number of assured CA public keys. + + There are different ways in which CAs might be configured in order + for public key users to be able to find certification paths. For + PEM, RFC 1422 defined a rigid hierarchical structure of CAs. There + are three types of PEM certification authority: + + (a) Internet Policy Registration Authority (IPRA): This + authority, operated under the auspices of the Internet Society, + acts as the root of the PEM certification hierarchy at level 1. + It issues certificates only for the next level of authorities, + PCAs. All certification paths start with the IPRA. + + (b) Policy Certification Authorities (PCAs): PCAs are at level 2 + of the hierarchy, each PCA being certified by the IPRA. A PCA + shall establish and publish a statement of its policy with respect + to certifying users or subordinate certification authorities. + Distinct PCAs aim to satisfy different user needs. For example, + one PCA (an organizational PCA) might support the general + electronic mail needs of commercial organizations, and another PCA + (a high-assurance PCA) might have a more stringent policy designed + for satisfying legally binding digital signature requirements. + + (c) Certification Authorities (CAs): CAs are at level 3 of the + hierarchy and can also be at lower levels. Those at level 3 are + certified by PCAs. CAs represent, for example, particular + organizations, particular organizational units (e.g., departments, + groups, sections), or particular geographical areas. + + RFC 1422 furthermore has a name subordination rule which requires + that a CA can only issue certificates for entities whose names are + subordinate (in the X.500 naming tree) to the name of the CA itself. + The trust associated with a PEM certification path is implied by the + PCA name. The name subordination rule ensures that CAs below the PCA + are sensibly constrained as to the set of subordinate entities they + can certify (e.g., a CA for an organization can only certify entities + in that organization's name tree). Certificate user systems are able + to mechanically check that the name subordination rule has been + followed. + + The RFC 1422 uses the X.509 v1 certificate formats. The limitations + of X.509 v1 required imposition of several structural restrictions to + clearly associate policy information or restrict the utility of + certificates. These restrictions included: + + + +Housley, et. al. Standards Track [Page 10] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + (a) a pure top-down hierarchy, with all certification paths + starting from IPRA; + + (b) a naming subordination rule restricting the names of a CA's + subjects; and + + (c) use of the PCA concept, which requires knowledge of + individual PCAs to be built into certificate chain verification + logic. Knowledge of individual PCAs was required to determine if + a chain could be accepted. + + With X.509 v3, most of the requirements addressed by RFC 1422 can be + addressed using certificate extensions, without a need to restrict + the CA structures used. In particular, the certificate extensions + relating to certificate policies obviate the need for PCAs and the + constraint extensions obviate the need for the name subordination + rule. As a result, this document supports a more flexible + architecture, including: + + (a) Certification paths start with a public key of a CA in a + user's own domain, or with the public key of the top of a + hierarchy. Starting with the public key of a CA in a user's own + domain has certain advantages. In some environments, the local + domain is the most trusted. + + (b) Name constraints may be imposed through explicit inclusion of + a name constraints extension in a certificate, but are not + required. + + (c) Policy extensions and policy mappings replace the PCA + concept, which permits a greater degree of automation. The + application can determine if the certification path is acceptable + based on the contents of the certificates instead of a priori + knowledge of PCAs. This permits automation of certification path + processing. + +3.3 Revocation + + When a certificate is issued, it is expected to be in use for its + entire validity period. However, various circumstances may cause a + certificate to become invalid prior to the expiration of the validity + period. Such circumstances include change of name, change of + association between subject and CA (e.g., an employee terminates + employment with an organization), and compromise or suspected + compromise of the corresponding private key. Under such + circumstances, the CA needs to revoke the certificate. + + + + + +Housley, et. al. Standards Track [Page 11] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + X.509 defines one method of certificate revocation. This method + involves each CA periodically issuing a signed data structure called + a certificate revocation list (CRL). A CRL is a time stamped list + identifying revoked certificates which is signed by a CA or CRL + issuer and made freely available in a public repository. Each + revoked certificate is identified in a CRL by its certificate serial + number. When a certificate-using system uses a certificate (e.g., + for verifying a remote user's digital signature), that system not + only checks the certificate signature and validity but also acquires + a suitably-recent CRL and checks that the certificate serial number + is not on that CRL. The meaning of "suitably-recent" may vary with + local policy, but it usually means the most recently-issued CRL. A + new CRL is issued on a regular periodic basis (e.g., hourly, daily, + or weekly). An entry is added to the CRL as part of the next update + following notification of revocation. An entry MUST NOT be removed + from the CRL until it appears on one regularly scheduled CRL issued + beyond the revoked certificate's validity period. + + An advantage of this revocation method is that CRLs may be + distributed by exactly the same means as certificates themselves, + namely, via untrusted servers and untrusted communications. + + One limitation of the CRL revocation method, using untrusted + communications and servers, is that the time granularity of + revocation is limited to the CRL issue period. For example, if a + revocation is reported now, that revocation will not be reliably + notified to certificate-using systems until all currently issued CRLs + are updated -- this may be up to one hour, one day, or one week + depending on the frequency that CRLs are issued. + + As with the X.509 v3 certificate format, in order to facilitate + interoperable implementations from multiple vendors, the X.509 v2 CRL + format needs to be profiled for Internet use. It is one goal of this + document to specify that profile. However, this profile does not + require the issuance of CRLs. Message formats and protocols + supporting on-line revocation notification are defined in other PKIX + specifications. On-line methods of revocation notification may be + applicable in some environments as an alternative to the X.509 CRL. + On-line revocation checking may significantly reduce the latency + between a revocation report and the distribution of the information + to relying parties. Once the CA accepts a revocation report as + authentic and valid, any query to the on-line service will correctly + reflect the certificate validation impacts of the revocation. + However, these methods impose new security requirements: the + certificate validator needs to trust the on-line validation service + while the repository does not need to be trusted. + + + + + +Housley, et. al. Standards Track [Page 12] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + +3.4 Operational Protocols + + Operational protocols are required to deliver certificates and CRLs + (or status information) to certificate using client systems. + Provisions are needed for a variety of different means of certificate + and CRL delivery, including distribution procedures based on LDAP, + HTTP, FTP, and X.500. Operational protocols supporting these + functions are defined in other PKIX specifications. These + specifications may include definitions of message formats and + procedures for supporting all of the above operational environments, + including definitions of or references to appropriate MIME content + types. + +3.5 Management Protocols + + Management protocols are required to support on-line interactions + between PKI user and management entities. For example, a management + protocol might be used between a CA and a client system with which a + key pair is associated, or between two CAs which cross-certify each + other. The set of functions which potentially need to be supported + by management protocols include: + + (a) registration: This is the process whereby a user first makes + itself known to a CA (directly, or through an RA), prior to that + CA issuing a certificate or certificates for that user. + + (b) initialization: Before a client system can operate securely + it is necessary to install key materials which have the + appropriate relationship with keys stored elsewhere in the + infrastructure. For example, the client needs to be securely + initialized with the public key and other assured information of + the trusted CA(s), to be used in validating certificate paths. + + Furthermore, a client typically needs to be initialized with its + own key pair(s). + + (c) certification: This is the process in which a CA issues a + certificate for a user's public key, and returns that certificate + to the user's client system and/or posts that certificate in a + repository. + + (d) key pair recovery: As an option, user client key materials + (e.g., a user's private key used for encryption purposes) may be + backed up by a CA or a key backup system. If a user needs to + recover these backed up key materials (e.g., as a result of a + forgotten password or a lost key chain file), an on-line protocol + exchange may be needed to support such recovery. + + + + +Housley, et. al. Standards Track [Page 13] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + (e) key pair update: All key pairs need to be updated regularly, + i.e., replaced with a new key pair, and new certificates issued. + + (f) revocation request: An authorized person advises a CA of an + abnormal situation requiring certificate revocation. + + (g) cross-certification: Two CAs exchange information used in + establishing a cross-certificate. A cross-certificate is a + certificate issued by one CA to another CA which contains a CA + signature key used for issuing certificates. + + Note that on-line protocols are not the only way of implementing the + above functions. For all functions there are off-line methods of + achieving the same result, and this specification does not mandate + use of on-line protocols. For example, when hardware tokens are + used, many of the functions may be achieved as part of the physical + token delivery. Furthermore, some of the above functions may be + combined into one protocol exchange. In particular, two or more of + the registration, initialization, and certification functions can be + combined into one protocol exchange. + + The PKIX series of specifications defines a set of standard message + formats supporting the above functions. The protocols for conveying + these messages in different environments (e.g., e-mail, file + transfer, and WWW) are described in those specifications. + +4 Certificate and Certificate Extensions Profile + + This section presents a profile for public key certificates that will + foster interoperability and a reusable PKI. This section is based + upon the X.509 v3 certificate format and the standard certificate + extensions defined in [X.509]. The ISO/IEC and ITU-T documents use + the 1997 version of ASN.1; while this document uses the 1988 ASN.1 + syntax, the encoded certificate and standard extensions are + equivalent. This section also defines private extensions required to + support a PKI for the Internet community. + + Certificates may be used in a wide range of applications and + environments covering a broad spectrum of interoperability goals and + a broader spectrum of operational and assurance requirements. The + goal of this document is to establish a common baseline for generic + applications requiring broad interoperability and limited special + purpose requirements. In particular, the emphasis will be on + supporting the use of X.509 v3 certificates for informal Internet + electronic mail, IPsec, and WWW applications. + + + + + + +Housley, et. al. Standards Track [Page 14] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + +4.1 Basic Certificate Fields + + The X.509 v3 certificate basic syntax is as follows. For signature + calculation, the data that is to be signed is encoded using the ASN.1 + distinguished encoding rules (DER) [X.690]. ASN.1 DER encoding is a + tag, length, value encoding system for each element. + + Certificate ::= SEQUENCE { + tbsCertificate TBSCertificate, + signatureAlgorithm AlgorithmIdentifier, + signatureValue BIT STRING } + + TBSCertificate ::= SEQUENCE { + version [0] EXPLICIT Version DEFAULT v1, + serialNumber CertificateSerialNumber, + signature AlgorithmIdentifier, + issuer Name, + validity Validity, + subject Name, + subjectPublicKeyInfo SubjectPublicKeyInfo, + issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL, + -- If present, version MUST be v2 or v3 + subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL, + -- If present, version MUST be v2 or v3 + extensions [3] EXPLICIT Extensions OPTIONAL + -- If present, version MUST be v3 + } + + Version ::= INTEGER { v1(0), v2(1), v3(2) } + + CertificateSerialNumber ::= INTEGER + + Validity ::= SEQUENCE { + notBefore Time, + notAfter Time } + + Time ::= CHOICE { + utcTime UTCTime, + generalTime GeneralizedTime } + + UniqueIdentifier ::= BIT STRING + + SubjectPublicKeyInfo ::= SEQUENCE { + algorithm AlgorithmIdentifier, + subjectPublicKey BIT STRING } + + Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension + + + + +Housley, et. al. Standards Track [Page 15] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + Extension ::= SEQUENCE { + extnID OBJECT IDENTIFIER, + critical BOOLEAN DEFAULT FALSE, + extnValue OCTET STRING } + + The following items describe the X.509 v3 certificate for use in the + Internet. + +4.1.1 Certificate Fields + + The Certificate is a SEQUENCE of three required fields. The fields + are described in detail in the following subsections. + +4.1.1.1 tbsCertificate + + The field contains the names of the subject and issuer, a public key + associated with the subject, a validity period, and other associated + information. The fields are described in detail in section 4.1.2; + the tbsCertificate usually includes extensions which are described in + section 4.2. + +4.1.1.2 signatureAlgorithm + + The signatureAlgorithm field contains the identifier for the + cryptographic algorithm used by the CA to sign this certificate. + [PKIXALGS] lists supported signature algorithms, but other signature + algorithms MAY also be supported. + + An algorithm identifier is defined by the following ASN.1 structure: + + AlgorithmIdentifier ::= SEQUENCE { + algorithm OBJECT IDENTIFIER, + parameters ANY DEFINED BY algorithm OPTIONAL } + + The algorithm identifier is used to identify a cryptographic + algorithm. The OBJECT IDENTIFIER component identifies the algorithm + (such as DSA with SHA-1). The contents of the optional parameters + field will vary according to the algorithm identified. + + This field MUST contain the same algorithm identifier as the + signature field in the sequence tbsCertificate (section 4.1.2.3). + +4.1.1.3 signatureValue + + The signatureValue field contains a digital signature computed upon + the ASN.1 DER encoded tbsCertificate. The ASN.1 DER encoded + tbsCertificate is used as the input to the signature function. This + + + + +Housley, et. al. Standards Track [Page 16] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + signature value is encoded as a BIT STRING and included in the + signature field. The details of this process are specified for each + of algorithms listed in [PKIXALGS]. + + By generating this signature, a CA certifies the validity of the + information in the tbsCertificate field. In particular, the CA + certifies the binding between the public key material and the subject + of the certificate. + +4.1.2 TBSCertificate + + The sequence TBSCertificate contains information associated with the + subject of the certificate and the CA who issued it. Every + TBSCertificate contains the names of the subject and issuer, a public + key associated with the subject, a validity period, a version number, + and a serial number; some MAY contain optional unique identifier + fields. The remainder of this section describes the syntax and + semantics of these fields. A TBSCertificate usually includes + extensions. Extensions for the Internet PKI are described in Section + 4.2. + +4.1.2.1 Version + + This field describes the version of the encoded certificate. When + extensions are used, as expected in this profile, version MUST be 3 + (value is 2). If no extensions are present, but a UniqueIdentifier + is present, the version SHOULD be 2 (value is 1); however version MAY + be 3. If only basic fields are present, the version SHOULD be 1 (the + value is omitted from the certificate as the default value); however + the version MAY be 2 or 3. + + Implementations SHOULD be prepared to accept any version certificate. + At a minimum, conforming implementations MUST recognize version 3 + certificates. + + Generation of version 2 certificates is not expected by + implementations based on this profile. + +4.1.2.2 Serial number + + The serial number MUST be a positive integer assigned by the CA to + each certificate. It MUST be unique for each certificate issued by a + given CA (i.e., the issuer name and serial number identify a unique + certificate). CAs MUST force the serialNumber to be a non-negative + integer. + + + + + + +Housley, et. al. Standards Track [Page 17] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + Given the uniqueness requirements above, serial numbers can be + expected to contain long integers. Certificate users MUST be able to + handle serialNumber values up to 20 octets. Conformant CAs MUST NOT + use serialNumber values longer than 20 octets. + + Note: Non-conforming CAs may issue certificates with serial numbers + that are negative, or zero. Certificate users SHOULD be prepared to + gracefully handle such certificates. + +4.1.2.3 Signature + + This field contains the algorithm identifier for the algorithm used + by the CA to sign the certificate. + + This field MUST contain the same algorithm identifier as the + signatureAlgorithm field in the sequence Certificate (section + 4.1.1.2). The contents of the optional parameters field will vary + according to the algorithm identified. [PKIXALGS] lists the + supported signature algorithms, but other signature algorithms MAY + also be supported. + +4.1.2.4 Issuer + + The issuer field identifies the entity who has signed and issued the + certificate. The issuer field MUST contain a non-empty distinguished + name (DN). The issuer field is defined as the X.501 type Name + [X.501]. Name is defined by the following ASN.1 structures: + + Name ::= CHOICE { + RDNSequence } + + RDNSequence ::= SEQUENCE OF RelativeDistinguishedName + + RelativeDistinguishedName ::= + SET OF AttributeTypeAndValue + + AttributeTypeAndValue ::= SEQUENCE { + type AttributeType, + value AttributeValue } + + AttributeType ::= OBJECT IDENTIFIER + + AttributeValue ::= ANY DEFINED BY AttributeType + + + + + + + + +Housley, et. al. Standards Track [Page 18] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + DirectoryString ::= CHOICE { + teletexString TeletexString (SIZE (1..MAX)), + printableString PrintableString (SIZE (1..MAX)), + universalString UniversalString (SIZE (1..MAX)), + utf8String UTF8String (SIZE (1..MAX)), + bmpString BMPString (SIZE (1..MAX)) } + + The Name describes a hierarchical name composed of attributes, such + as country name, and corresponding values, such as US. The type of + the component AttributeValue is determined by the AttributeType; in + general it will be a DirectoryString. + + The DirectoryString type is defined as a choice of PrintableString, + TeletexString, BMPString, UTF8String, and UniversalString. The + UTF8String encoding [RFC 2279] is the preferred encoding, and all + certificates issued after December 31, 2003 MUST use the UTF8String + encoding of DirectoryString (except as noted below). Until that + date, conforming CAs MUST choose from the following options when + creating a distinguished name, including their own: + + (a) if the character set is sufficient, the string MAY be + represented as a PrintableString; + + (b) failing (a), if the BMPString character set is sufficient the + string MAY be represented as a BMPString; and + + (c) failing (a) and (b), the string MUST be represented as a + UTF8String. If (a) or (b) is satisfied, the CA MAY still choose + to represent the string as a UTF8String. + + Exceptions to the December 31, 2003 UTF8 encoding requirements are as + follows: + + (a) CAs MAY issue "name rollover" certificates to support an + orderly migration to UTF8String encoding. Such certificates would + include the CA's UTF8String encoded name as issuer and and the old + name encoding as subject, or vice-versa. + + (b) As stated in section 4.1.2.6, the subject field MUST be + populated with a non-empty distinguished name matching the + contents of the issuer field in all certificates issued by the + subject CA regardless of encoding. + + The TeletexString and UniversalString are included for backward + compatibility, and SHOULD NOT be used for certificates for new + subjects. However, these types MAY be used in certificates where the + name was previously established. Certificate users SHOULD be + prepared to receive certificates with these types. + + + +Housley, et. al. Standards Track [Page 19] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + In addition, many legacy implementations support names encoded in the + ISO 8859-1 character set (Latin1String) [ISO 8859-1] but tag them as + TeletexString. TeletexString encodes a larger character set than ISO + 8859-1, but it encodes some characters differently. Implementations + SHOULD be prepared to handle both encodings. + + As noted above, distinguished names are composed of attributes. This + specification does not restrict the set of attribute types that may + appear in names. However, conforming implementations MUST be + prepared to receive certificates with issuer names containing the set + of attribute types defined below. This specification RECOMMENDS + support for additional attribute types. + + Standard sets of attributes have been defined in the X.500 series of + specifications [X.520]. Implementations of this specification MUST + be prepared to receive the following standard attribute types in + issuer and subject (section 4.1.2.6) names: + + * country, + * organization, + * organizational-unit, + * distinguished name qualifier, + * state or province name, + * common name (e.g., "Susan Housley"), and + * serial number. + + In addition, implementations of this specification SHOULD be prepared + to receive the following standard attribute types in issuer and + subject names: + + * locality, + * title, + * surname, + * given name, + * initials, + * pseudonym, and + * generation qualifier (e.g., "Jr.", "3rd", or "IV"). + + The syntax and associated object identifiers (OIDs) for these + attribute types are provided in the ASN.1 modules in Appendix A. + + In addition, implementations of this specification MUST be prepared + to receive the domainComponent attribute, as defined in [RFC 2247]. + The Domain Name System (DNS) provides a hierarchical resource + labeling system. This attribute provides a convenient mechanism for + organizations that wish to use DNs that parallel their DNS names. + This is not a replacement for the dNSName component of the + + + + +Housley, et. al. Standards Track [Page 20] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + alternative name field. Implementations are not required to convert + such names into DNS names. The syntax and associated OID for this + attribute type is provided in the ASN.1 modules in Appendix A. + + Certificate users MUST be prepared to process the issuer + distinguished name and subject distinguished name (section 4.1.2.6) + fields to perform name chaining for certification path validation + (section 6). Name chaining is performed by matching the issuer + distinguished name in one certificate with the subject name in a CA + certificate. + + This specification requires only a subset of the name comparison + functionality specified in the X.500 series of specifications. + Conforming implementations are REQUIRED to implement the following + name comparison rules: + + (a) attribute values encoded in different types (e.g., + PrintableString and BMPString) MAY be assumed to represent + different strings; + + (b) attribute values in types other than PrintableString are case + sensitive (this permits matching of attribute values as binary + objects); + + (c) attribute values in PrintableString are not case sensitive + (e.g., "Marianne Swanson" is the same as "MARIANNE SWANSON"); and + + (d) attribute values in PrintableString are compared after + removing leading and trailing white space and converting internal + substrings of one or more consecutive white space characters to a + single space. + + These name comparison rules permit a certificate user to validate + certificates issued using languages or encodings unfamiliar to the + certificate user. + + In addition, implementations of this specification MAY use these + comparison rules to process unfamiliar attribute types for name + chaining. This allows implementations to process certificates with + unfamiliar attributes in the issuer name. + + Note that the comparison rules defined in the X.500 series of + specifications indicate that the character sets used to encode data + in distinguished names are irrelevant. The characters themselves are + compared without regard to encoding. Implementations of this profile + are permitted to use the comparison algorithm defined in the X.500 + series. Such an implementation will recognize a superset of name + matches recognized by the algorithm specified above. + + + +Housley, et. al. Standards Track [Page 21] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + +4.1.2.5 Validity + + The certificate validity period is the time interval during which the + CA warrants that it will maintain information about the status of the + certificate. The field is represented as a SEQUENCE of two dates: + the date on which the certificate validity period begins (notBefore) + and the date on which the certificate validity period ends + (notAfter). Both notBefore and notAfter may be encoded as UTCTime or + GeneralizedTime. + + CAs conforming to this profile MUST always encode certificate + validity dates through the year 2049 as UTCTime; certificate validity + dates in 2050 or later MUST be encoded as GeneralizedTime. + + The validity period for a certificate is the period of time from + notBefore through notAfter, inclusive. + +4.1.2.5.1 UTCTime + + The universal time type, UTCTime, is a standard ASN.1 type intended + for representation of dates and time. UTCTime specifies the year + through the two low order digits and time is specified to the + precision of one minute or one second. UTCTime includes either Z + (for Zulu, or Greenwich Mean Time) or a time differential. + + For the purposes of this profile, UTCTime values MUST be expressed + Greenwich Mean Time (Zulu) and MUST include seconds (i.e., times are + YYMMDDHHMMSSZ), even where the number of seconds is zero. Conforming + systems MUST interpret the year field (YY) as follows: + + Where YY is greater than or equal to 50, the year SHALL be + interpreted as 19YY; and + + Where YY is less than 50, the year SHALL be interpreted as 20YY. + +4.1.2.5.2 GeneralizedTime + + The generalized time type, GeneralizedTime, is a standard ASN.1 type + for variable precision representation of time. Optionally, the + GeneralizedTime field can include a representation of the time + differential between local and Greenwich Mean Time. + + For the purposes of this profile, GeneralizedTime values MUST be + expressed Greenwich Mean Time (Zulu) and MUST include seconds (i.e., + times are YYYYMMDDHHMMSSZ), even where the number of seconds is zero. + GeneralizedTime values MUST NOT include fractional seconds. + + + + + +Housley, et. al. Standards Track [Page 22] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + +4.1.2.6 Subject + + The subject field identifies the entity associated with the public + key stored in the subject public key field. The subject name MAY be + carried in the subject field and/or the subjectAltName extension. If + the subject is a CA (e.g., the basic constraints extension, as + discussed in 4.2.1.10, is present and the value of cA is TRUE), then + the subject field MUST be populated with a non-empty distinguished + name matching the contents of the issuer field (section 4.1.2.4) in + all certificates issued by the subject CA. If the subject is a CRL + issuer (e.g., the key usage extension, as discussed in 4.2.1.3, is + present and the value of cRLSign is TRUE) then the subject field MUST + be populated with a non-empty distinguished name matching the + contents of the issuer field (section 4.1.2.4) in all CRLs issued by + the subject CRL issuer. If subject naming information is present + only in the subjectAltName extension (e.g., a key bound only to an + email address or URI), then the subject name MUST be an empty + sequence and the subjectAltName extension MUST be critical. + + Where it is non-empty, the subject field MUST contain an X.500 + distinguished name (DN). The DN MUST be unique for each subject + entity certified by the one CA as defined by the issuer name field. + A CA MAY issue more than one certificate with the same DN to the same + subject entity. + + The subject name field is defined as the X.501 type Name. + Implementation requirements for this field are those defined for the + issuer field (section 4.1.2.4). When encoding attribute values of + type DirectoryString, the encoding rules for the issuer field MUST be + implemented. Implementations of this specification MUST be prepared + to receive subject names containing the attribute types required for + the issuer field. Implementations of this specification SHOULD be + prepared to receive subject names containing the recommended + attribute types for the issuer field. The syntax and associated + object identifiers (OIDs) for these attribute types are provided in + the ASN.1 modules in Appendix A. Implementations of this + specification MAY use these comparison rules to process unfamiliar + attribute types (i.e., for name chaining). This allows + implementations to process certificates with unfamiliar attributes in + the subject name. + + In addition, legacy implementations exist where an RFC 822 name is + embedded in the subject distinguished name as an EmailAddress + attribute. The attribute value for EmailAddress is of type IA5String + to permit inclusion of the character '@', which is not part of the + PrintableString character set. EmailAddress attribute values are not + case sensitive (e.g., "fanfeedback@redsox.com" is the same as + "FANFEEDBACK@REDSOX.COM"). + + + +Housley, et. al. Standards Track [Page 23] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + Conforming implementations generating new certificates with + electronic mail addresses MUST use the rfc822Name in the subject + alternative name field (section 4.2.1.7) to describe such identities. + Simultaneous inclusion of the EmailAddress attribute in the subject + distinguished name to support legacy implementations is deprecated + but permitted. + +4.1.2.7 Subject Public Key Info + + This field is used to carry the public key and identify the algorithm + with which the key is used (e.g., RSA, DSA, or Diffie-Hellman). The + algorithm is identified using the AlgorithmIdentifier structure + specified in section 4.1.1.2. The object identifiers for the + supported algorithms and the methods for encoding the public key + materials (public key and parameters) are specified in [PKIXALGS]. + +4.1.2.8 Unique Identifiers + + These fields MUST only appear if the version is 2 or 3 (section + 4.1.2.1). These fields MUST NOT appear if the version is 1. The + subject and issuer unique identifiers are present in the certificate + to handle the possibility of reuse of subject and/or issuer names + over time. This profile RECOMMENDS that names not be reused for + different entities and that Internet certificates not make use of + unique identifiers. CAs conforming to this profile SHOULD NOT + generate certificates with unique identifiers. Applications + conforming to this profile SHOULD be capable of parsing unique + identifiers. + +4.1.2.9 Extensions + + This field MUST only appear if the version is 3 (section 4.1.2.1). + If present, this field is a SEQUENCE of one or more certificate + extensions. The format and content of certificate extensions in the + Internet PKI is defined in section 4.2. + +4.2 Certificate Extensions + + The extensions defined for X.509 v3 certificates provide methods for + associating additional attributes with users or public keys and for + managing a certification hierarchy. The X.509 v3 certificate format + also allows communities to define private extensions to carry + information unique to those communities. Each extension in a + certificate is designated as either critical or non-critical. A + certificate using system MUST reject the certificate if it encounters + a critical extension it does not recognize; however, a non-critical + extension MAY be ignored if it is not recognized. The following + sections present recommended extensions used within Internet + + + +Housley, et. al. Standards Track [Page 24] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + certificates and standard locations for information. Communities may + elect to use additional extensions; however, caution ought to be + exercised in adopting any critical extensions in certificates which + might prevent use in a general context. + + Each extension includes an OID and an ASN.1 structure. When an + extension appears in a certificate, the OID appears as the field + extnID and the corresponding ASN.1 encoded structure is the value of + the octet string extnValue. A certificate MUST NOT include more than + one instance of a particular extension. For example, a certificate + may contain only one authority key identifier extension (section + 4.2.1.1). An extension includes the boolean critical, with a default + value of FALSE. The text for each extension specifies the acceptable + values for the critical field. + + Conforming CAs MUST support key identifiers (sections 4.2.1.1 and + 4.2.1.2), basic constraints (section 4.2.1.10), key usage (section + 4.2.1.3), and certificate policies (section 4.2.1.5) extensions. If + the CA issues certificates with an empty sequence for the subject + field, the CA MUST support the subject alternative name extension + (section 4.2.1.7). Support for the remaining extensions is OPTIONAL. + Conforming CAs MAY support extensions that are not identified within + this specification; certificate issuers are cautioned that marking + such extensions as critical may inhibit interoperability. + + At a minimum, applications conforming to this profile MUST recognize + the following extensions: key usage (section 4.2.1.3), certificate + policies (section 4.2.1.5), the subject alternative name (section + 4.2.1.7), basic constraints (section 4.2.1.10), name constraints + (section 4.2.1.11), policy constraints (section 4.2.1.12), extended + key usage (section 4.2.1.13), and inhibit any-policy (section + 4.2.1.15). + + In addition, applications conforming to this profile SHOULD recognize + the authority and subject key identifier (sections 4.2.1.1 and + 4.2.1.2), and policy mapping (section 4.2.1.6) extensions. + +4.2.1 Standard Extensions + + This section identifies standard certificate extensions defined in + [X.509] for use in the Internet PKI. Each extension is associated + with an OID defined in [X.509]. These OIDs are members of the id-ce + arc, which is defined by the following: + + id-ce OBJECT IDENTIFIER ::= { joint-iso-ccitt(2) ds(5) 29 } + + + + + + +Housley, et. al. Standards Track [Page 25] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + +4.2.1.1 Authority Key Identifier + + The authority key identifier extension provides a means of + identifying the public key corresponding to the private key used to + sign a certificate. This extension is used where an issuer has + multiple signing keys (either due to multiple concurrent key pairs or + due to changeover). The identification MAY be based on either the + key identifier (the subject key identifier in the issuer's + certificate) or on the issuer name and serial number. + + The keyIdentifier field of the authorityKeyIdentifier extension MUST + be included in all certificates generated by conforming CAs to + facilitate certification path construction. There is one exception; + where a CA distributes its public key in the form of a "self-signed" + certificate, the authority key identifier MAY be omitted. The + signature on a self-signed certificate is generated with the private + key associated with the certificate's subject public key. (This + proves that the issuer possesses both the public and private keys.) + In this case, the subject and authority key identifiers would be + identical, but only the subject key identifier is needed for + certification path building. + + The value of the keyIdentifier field SHOULD be derived from the + public key used to verify the certificate's signature or a method + that generates unique values. Two common methods for generating key + identifiers from the public key, and one common method for generating + unique values, are described in section 4.2.1.2. Where a key + identifier has not been previously established, this specification + RECOMMENDS use of one of these methods for generating keyIdentifiers. + Where a key identifier has been previously established, the CA SHOULD + use the previously established identifier. + + This profile RECOMMENDS support for the key identifier method by all + certificate users. + + This extension MUST NOT be marked critical. + + id-ce-authorityKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 35 } + + AuthorityKeyIdentifier ::= SEQUENCE { + keyIdentifier [0] KeyIdentifier OPTIONAL, + authorityCertIssuer [1] GeneralNames OPTIONAL, + authorityCertSerialNumber [2] CertificateSerialNumber OPTIONAL } + + KeyIdentifier ::= OCTET STRING + + + + + + +Housley, et. al. Standards Track [Page 26] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + +4.2.1.2 Subject Key Identifier + + The subject key identifier extension provides a means of identifying + certificates that contain a particular public key. + + To facilitate certification path construction, this extension MUST + appear in all conforming CA certificates, that is, all certificates + including the basic constraints extension (section 4.2.1.10) where + the value of cA is TRUE. The value of the subject key identifier + MUST be the value placed in the key identifier field of the Authority + Key Identifier extension (section 4.2.1.1) of certificates issued by + the subject of this certificate. + + For CA certificates, subject key identifiers SHOULD be derived from + the public key or a method that generates unique values. Two common + methods for generating key identifiers from the public key are: + + (1) The keyIdentifier is composed of the 160-bit SHA-1 hash of the + value of the BIT STRING subjectPublicKey (excluding the tag, + length, and number of unused bits). + + (2) The keyIdentifier is composed of a four bit type field with + the value 0100 followed by the least significant 60 bits of the + SHA-1 hash of the value of the BIT STRING subjectPublicKey + (excluding the tag, length, and number of unused bit string bits). + + One common method for generating unique values is a monotonically + increasing sequence of integers. + + For end entity certificates, the subject key identifier extension + provides a means for identifying certificates containing the + particular public key used in an application. Where an end entity + has obtained multiple certificates, especially from multiple CAs, the + subject key identifier provides a means to quickly identify the set + of certificates containing a particular public key. To assist + applications in identifying the appropriate end entity certificate, + this extension SHOULD be included in all end entity certificates. + + For end entity certificates, subject key identifiers SHOULD be + derived from the public key. Two common methods for generating key + identifiers from the public key are identified above. + + Where a key identifier has not been previously established, this + specification RECOMMENDS use of one of these methods for generating + keyIdentifiers. Where a key identifier has been previously + established, the CA SHOULD use the previously established identifier. + + This extension MUST NOT be marked critical. + + + +Housley, et. al. Standards Track [Page 27] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + id-ce-subjectKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 14 } + + SubjectKeyIdentifier ::= KeyIdentifier + +4.2.1.3 Key Usage + + The key usage extension defines the purpose (e.g., encipherment, + signature, certificate signing) of the key contained in the + certificate. The usage restriction might be employed when a key that + could be used for more than one operation is to be restricted. For + example, when an RSA key should be used only to verify signatures on + objects other than public key certificates and CRLs, the + digitalSignature and/or nonRepudiation bits would be asserted. + Likewise, when an RSA key should be used only for key management, the + keyEncipherment bit would be asserted. + + This extension MUST appear in certificates that contain public keys + that are used to validate digital signatures on other public key + certificates or CRLs. When this extension appears, it SHOULD be + marked critical. + + id-ce-keyUsage OBJECT IDENTIFIER ::= { id-ce 15 } + + KeyUsage ::= BIT STRING { + digitalSignature (0), + nonRepudiation (1), + keyEncipherment (2), + dataEncipherment (3), + keyAgreement (4), + keyCertSign (5), + cRLSign (6), + encipherOnly (7), + decipherOnly (8) } + + Bits in the KeyUsage type are used as follows: + + The digitalSignature bit is asserted when the subject public key + is used with a digital signature mechanism to support security + services other than certificate signing (bit 5), or CRL signing + (bit 6). Digital signature mechanisms are often used for entity + authentication and data origin authentication with integrity. + + The nonRepudiation bit is asserted when the subject public key is + used to verify digital signatures used to provide a non- + repudiation service which protects against the signing entity + falsely denying some action, excluding certificate or CRL signing. + In the case of later conflict, a reliable third party may + determine the authenticity of the signed data. + + + +Housley, et. al. Standards Track [Page 28] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + Further distinctions between the digitalSignature and + nonRepudiation bits may be provided in specific certificate + policies. + + The keyEncipherment bit is asserted when the subject public key is + used for key transport. For example, when an RSA key is to be + used for key management, then this bit is set. + + The dataEncipherment bit is asserted when the subject public key + is used for enciphering user data, other than cryptographic keys. + + The keyAgreement bit is asserted when the subject public key is + used for key agreement. For example, when a Diffie-Hellman key is + to be used for key management, then this bit is set. + + The keyCertSign bit is asserted when the subject public key is + used for verifying a signature on public key certificates. If the + keyCertSign bit is asserted, then the cA bit in the basic + constraints extension (section 4.2.1.10) MUST also be asserted. + + The cRLSign bit is asserted when the subject public key is used + for verifying a signature on certificate revocation list (e.g., a + CRL, delta CRL, or an ARL). This bit MUST be asserted in + certificates that are used to verify signatures on CRLs. + + The meaning of the encipherOnly bit is undefined in the absence of + the keyAgreement bit. When the encipherOnly bit is asserted and + the keyAgreement bit is also set, the subject public key may be + used only for enciphering data while performing key agreement. + + The meaning of the decipherOnly bit is undefined in the absence of + the keyAgreement bit. When the decipherOnly bit is asserted and + the keyAgreement bit is also set, the subject public key may be + used only for deciphering data while performing key agreement. + + This profile does not restrict the combinations of bits that may be + set in an instantiation of the keyUsage extension. However, + appropriate values for keyUsage extensions for particular algorithms + are specified in [PKIXALGS]. + +4.2.1.4 Private Key Usage Period + + This extension SHOULD NOT be used within the Internet PKI. CAs + conforming to this profile MUST NOT generate certificates that + include a critical private key usage period extension. + + + + + + +Housley, et. al. Standards Track [Page 29] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + The private key usage period extension allows the certificate issuer + to specify a different validity period for the private key than the + certificate. This extension is intended for use with digital + signature keys. This extension consists of two optional components, + notBefore and notAfter. The private key associated with the + certificate SHOULD NOT be used to sign objects before or after the + times specified by the two components, respectively. CAs conforming + to this profile MUST NOT generate certificates with private key usage + period extensions unless at least one of the two components is + present and the extension is non-critical. + + Where used, notBefore and notAfter are represented as GeneralizedTime + and MUST be specified and interpreted as defined in section + 4.1.2.5.2. + + id-ce-privateKeyUsagePeriod OBJECT IDENTIFIER ::= { id-ce 16 } + + PrivateKeyUsagePeriod ::= SEQUENCE { + notBefore [0] GeneralizedTime OPTIONAL, + notAfter [1] GeneralizedTime OPTIONAL } + +4.2.1.5 Certificate Policies + + The certificate policies extension contains a sequence of one or more + policy information terms, each of which consists of an object + identifier (OID) and optional qualifiers. Optional qualifiers, which + MAY be present, are not expected to change the definition of the + policy. + + In an end entity certificate, these policy information terms indicate + the policy under which the certificate has been issued and the + purposes for which the certificate may be used. In a CA certificate, + these policy information terms limit the set of policies for + certification paths which include this certificate. When a CA does + not wish to limit the set of policies for certification paths which + include this certificate, it MAY assert the special policy anyPolicy, + with a value of { 2 5 29 32 0 }. + + Applications with specific policy requirements are expected to have a + list of those policies which they will accept and to compare the + policy OIDs in the certificate to that list. If this extension is + critical, the path validation software MUST be able to interpret this + extension (including the optional qualifier), or MUST reject the + certificate. + + To promote interoperability, this profile RECOMMENDS that policy + information terms consist of only an OID. Where an OID alone is + insufficient, this profile strongly recommends that use of qualifiers + + + +Housley, et. al. Standards Track [Page 30] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + be limited to those identified in this section. When qualifiers are + used with the special policy anyPolicy, they MUST be limited to the + qualifiers identified in this section. + + This specification defines two policy qualifier types for use by + certificate policy writers and certificate issuers. The qualifier + types are the CPS Pointer and User Notice qualifiers. + + The CPS Pointer qualifier contains a pointer to a Certification + Practice Statement (CPS) published by the CA. The pointer is in the + form of a URI. Processing requirements for this qualifier are a + local matter. No action is mandated by this specification regardless + of the criticality value asserted for the extension. + + User notice is intended for display to a relying party when a + certificate is used. The application software SHOULD display all + user notices in all certificates of the certification path used, + except that if a notice is duplicated only one copy need be + displayed. To prevent such duplication, this qualifier SHOULD only + be present in end entity certificates and CA certificates issued to + other organizations. + + The user notice has two optional fields: the noticeRef field and the + explicitText field. + + The noticeRef field, if used, names an organization and + identifies, by number, a particular textual statement prepared by + that organization. For example, it might identify the + organization "CertsRUs" and notice number 1. In a typical + implementation, the application software will have a notice file + containing the current set of notices for CertsRUs; the + application will extract the notice text from the file and display + it. Messages MAY be multilingual, allowing the software to select + the particular language message for its own environment. + + An explicitText field includes the textual statement directly in + the certificate. The explicitText field is a string with a + maximum size of 200 characters. + + If both the noticeRef and explicitText options are included in the + one qualifier and if the application software can locate the notice + text indicated by the noticeRef option, then that text SHOULD be + displayed; otherwise, the explicitText string SHOULD be displayed. + + Note: While the explicitText has a maximum size of 200 characters, + some non-conforming CAs exceed this limit. Therefore, certificate + users SHOULD gracefully handle explicitText with more than 200 + characters. + + + +Housley, et. al. Standards Track [Page 31] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + id-ce-certificatePolicies OBJECT IDENTIFIER ::= { id-ce 32 } + + anyPolicy OBJECT IDENTIFIER ::= { id-ce-certificate-policies 0 } + + certificatePolicies ::= SEQUENCE SIZE (1..MAX) OF PolicyInformation + + PolicyInformation ::= SEQUENCE { + policyIdentifier CertPolicyId, + policyQualifiers SEQUENCE SIZE (1..MAX) OF + PolicyQualifierInfo OPTIONAL } + + CertPolicyId ::= OBJECT IDENTIFIER + + PolicyQualifierInfo ::= SEQUENCE { + policyQualifierId PolicyQualifierId, + qualifier ANY DEFINED BY policyQualifierId } + + -- policyQualifierIds for Internet policy qualifiers + + id-qt OBJECT IDENTIFIER ::= { id-pkix 2 } + id-qt-cps OBJECT IDENTIFIER ::= { id-qt 1 } + id-qt-unotice OBJECT IDENTIFIER ::= { id-qt 2 } + + PolicyQualifierId ::= + OBJECT IDENTIFIER ( id-qt-cps | id-qt-unotice ) + + Qualifier ::= CHOICE { + cPSuri CPSuri, + userNotice UserNotice } + + CPSuri ::= IA5String + + UserNotice ::= SEQUENCE { + noticeRef NoticeReference OPTIONAL, + explicitText DisplayText OPTIONAL} + + NoticeReference ::= SEQUENCE { + organization DisplayText, + noticeNumbers SEQUENCE OF INTEGER } + + DisplayText ::= CHOICE { + ia5String IA5String (SIZE (1..200)), + visibleString VisibleString (SIZE (1..200)), + bmpString BMPString (SIZE (1..200)), + utf8String UTF8String (SIZE (1..200)) } + + + + + + +Housley, et. al. Standards Track [Page 32] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + +4.2.1.6 Policy Mappings + + This extension is used in CA certificates. It lists one or more + pairs of OIDs; each pair includes an issuerDomainPolicy and a + subjectDomainPolicy. The pairing indicates the issuing CA considers + its issuerDomainPolicy equivalent to the subject CA's + subjectDomainPolicy. + + The issuing CA's users might accept an issuerDomainPolicy for certain + applications. The policy mapping defines the list of policies + associated with the subject CA that may be accepted as comparable to + the issuerDomainPolicy. + + Each issuerDomainPolicy named in the policy mapping extension SHOULD + also be asserted in a certificate policies extension in the same + certificate. Policies SHOULD NOT be mapped either to or from the + special value anyPolicy (section 4.2.1.5). + + This extension MAY be supported by CAs and/or applications, and it + MUST be non-critical. + + id-ce-policyMappings OBJECT IDENTIFIER ::= { id-ce 33 } + + PolicyMappings ::= SEQUENCE SIZE (1..MAX) OF SEQUENCE { + issuerDomainPolicy CertPolicyId, + subjectDomainPolicy CertPolicyId } + +4.2.1.7 Subject Alternative Name + + The subject alternative names extension allows additional identities + to be bound to the subject of the certificate. Defined options + include an Internet electronic mail address, a DNS name, an IP + address, and a uniform resource identifier (URI). Other options + exist, including completely local definitions. Multiple name forms, + and multiple instances of each name form, MAY be included. Whenever + such identities are to be bound into a certificate, the subject + alternative name (or issuer alternative name) extension MUST be used; + however, a DNS name MAY be represented in the subject field using the + domainComponent attribute as described in section 4.1.2.4. + + Because the subject alternative name is considered to be definitively + bound to the public key, all parts of the subject alternative name + MUST be verified by the CA. + + Further, if the only subject identity included in the certificate is + an alternative name form (e.g., an electronic mail address), then the + subject distinguished name MUST be empty (an empty sequence), and the + + + + +Housley, et. al. Standards Track [Page 33] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + subjectAltName extension MUST be present. If the subject field + contains an empty sequence, the subjectAltName extension MUST be + marked critical. + + When the subjectAltName extension contains an Internet mail address, + the address MUST be included as an rfc822Name. The format of an + rfc822Name is an "addr-spec" as defined in RFC 822 [RFC 822]. An + addr-spec has the form "local-part@domain". Note that an addr-spec + has no phrase (such as a common name) before it, has no comment (text + surrounded in parentheses) after it, and is not surrounded by "<" and + ">". Note that while upper and lower case letters are allowed in an + RFC 822 addr-spec, no significance is attached to the case. + + When the subjectAltName extension contains a iPAddress, the address + MUST be stored in the octet string in "network byte order," as + specified in RFC 791 [RFC 791]. The least significant bit (LSB) of + each octet is the LSB of the corresponding byte in the network + address. For IP Version 4, as specified in RFC 791, the octet string + MUST contain exactly four octets. For IP Version 6, as specified in + RFC 1883, the octet string MUST contain exactly sixteen octets [RFC + 1883]. + + When the subjectAltName extension contains a domain name system + label, the domain name MUST be stored in the dNSName (an IA5String). + The name MUST be in the "preferred name syntax," as specified by RFC + 1034 [RFC 1034]. Note that while upper and lower case letters are + allowed in domain names, no signifigance is attached to the case. In + addition, while the string " " is a legal domain name, subjectAltName + extensions with a dNSName of " " MUST NOT be used. Finally, the use + of the DNS representation for Internet mail addresses (wpolk.nist.gov + instead of wpolk@nist.gov) MUST NOT be used; such identities are to + be encoded as rfc822Name. + + Note: work is currently underway to specify domain names in + international character sets. Such names will likely not be + accommodated by IA5String. Once this work is complete, this profile + will be revisited and the appropriate functionality will be added. + + When the subjectAltName extension contains a URI, the name MUST be + stored in the uniformResourceIdentifier (an IA5String). The name + MUST NOT be a relative URL, and it MUST follow the URL syntax and + encoding rules specified in [RFC 1738]. The name MUST include both a + scheme (e.g., "http" or "ftp") and a scheme-specific-part. The + scheme-specific-part MUST include a fully qualified domain name or IP + address as the host. + + + + + + +Housley, et. al. Standards Track [Page 34] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + As specified in [RFC 1738], the scheme name is not case-sensitive + (e.g., "http" is equivalent to "HTTP"). The host part is also not + case-sensitive, but other components of the scheme-specific-part may + be case-sensitive. When comparing URIs, conforming implementations + MUST compare the scheme and host without regard to case, but assume + the remainder of the scheme-specific-part is case sensitive. + + When the subjectAltName extension contains a DN in the directoryName, + the DN MUST be unique for each subject entity certified by the one CA + as defined by the issuer name field. A CA MAY issue more than one + certificate with the same DN to the same subject entity. + + The subjectAltName MAY carry additional name types through the use of + the otherName field. The format and semantics of the name are + indicated through the OBJECT IDENTIFIER in the type-id field. The + name itself is conveyed as value field in otherName. For example, + Kerberos [RFC 1510] format names can be encoded into the otherName, + using using a Kerberos 5 principal name OID and a SEQUENCE of the + Realm and the PrincipalName. + + Subject alternative names MAY be constrained in the same manner as + subject distinguished names using the name constraints extension as + described in section 4.2.1.11. + + If the subjectAltName extension is present, the sequence MUST contain + at least one entry. Unlike the subject field, conforming CAs MUST + NOT issue certificates with subjectAltNames containing empty + GeneralName fields. For example, an rfc822Name is represented as an + IA5String. While an empty string is a valid IA5String, such an + rfc822Name is not permitted by this profile. The behavior of clients + that encounter such a certificate when processing a certificication + path is not defined by this profile. + + Finally, the semantics of subject alternative names that include + wildcard characters (e.g., as a placeholder for a set of names) are + not addressed by this specification. Applications with specific + requirements MAY use such names, but they must define the semantics. + + id-ce-subjectAltName OBJECT IDENTIFIER ::= { id-ce 17 } + + SubjectAltName ::= GeneralNames + + GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName + + + + + + + + +Housley, et. al. Standards Track [Page 35] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + GeneralName ::= CHOICE { + otherName [0] OtherName, + rfc822Name [1] IA5String, + dNSName [2] IA5String, + x400Address [3] ORAddress, + directoryName [4] Name, + ediPartyName [5] EDIPartyName, + uniformResourceIdentifier [6] IA5String, + iPAddress [7] OCTET STRING, + registeredID [8] OBJECT IDENTIFIER } + + OtherName ::= SEQUENCE { + type-id OBJECT IDENTIFIER, + value [0] EXPLICIT ANY DEFINED BY type-id } + + EDIPartyName ::= SEQUENCE { + nameAssigner [0] DirectoryString OPTIONAL, + partyName [1] DirectoryString } + +4.2.1.8 Issuer Alternative Names + + As with 4.2.1.7, this extension is used to associate Internet style + identities with the certificate issuer. Issuer alternative names + MUST be encoded as in 4.2.1.7. + + Where present, this extension SHOULD NOT be marked critical. + + id-ce-issuerAltName OBJECT IDENTIFIER ::= { id-ce 18 } + + IssuerAltName ::= GeneralNames + +4.2.1.9 Subject Directory Attributes + + The subject directory attributes extension is used to convey + identification attributes (e.g., nationality) of the subject. The + extension is defined as a sequence of one or more attributes. This + extension MUST be non-critical. + + id-ce-subjectDirectoryAttributes OBJECT IDENTIFIER ::= { id-ce 9 } + + SubjectDirectoryAttributes ::= SEQUENCE SIZE (1..MAX) OF Attribute + +4.2.1.10 Basic Constraints + + The basic constraints extension identifies whether the subject of the + certificate is a CA and the maximum depth of valid certification + paths that include this certificate. + + + + +Housley, et. al. Standards Track [Page 36] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + The cA boolean indicates whether the certified public key belongs to + a CA. If the cA boolean is not asserted, then the keyCertSign bit in + the key usage extension MUST NOT be asserted. + + The pathLenConstraint field is meaningful only if the cA boolean is + asserted and the key usage extension asserts the keyCertSign bit + (section 4.2.1.3). In this case, it gives the maximum number of non- + self-issued intermediate certificates that may follow this + certificate in a valid certification path. A certificate is self- + issued if the DNs that appear in the subject and issuer fields are + identical and are not empty. (Note: The last certificate in the + certification path is not an intermediate certificate, and is not + included in this limit. Usually, the last certificate is an end + entity certificate, but it can be a CA certificate.) A + pathLenConstraint of zero indicates that only one more certificate + may follow in a valid certification path. Where it appears, the + pathLenConstraint field MUST be greater than or equal to zero. Where + pathLenConstraint does not appear, no limit is imposed. + + This extension MUST appear as a critical extension in all CA + certificates that contain public keys used to validate digital + signatures on certificates. This extension MAY appear as a critical + or non-critical extension in CA certificates that contain public keys + used exclusively for purposes other than validating digital + signatures on certificates. Such CA certificates include ones that + contain public keys used exclusively for validating digital + signatures on CRLs and ones that contain key management public keys + used with certificate enrollment protocols. This extension MAY + appear as a critical or non-critical extension in end entity + certificates. + + CAs MUST NOT include the pathLenConstraint field unless the cA + boolean is asserted and the key usage extension asserts the + keyCertSign bit. + + id-ce-basicConstraints OBJECT IDENTIFIER ::= { id-ce 19 } + + BasicConstraints ::= SEQUENCE { + cA BOOLEAN DEFAULT FALSE, + pathLenConstraint INTEGER (0..MAX) OPTIONAL } + +4.2.1.11 Name Constraints + + The name constraints extension, which MUST be used only in a CA + certificate, indicates a name space within which all subject names in + subsequent certificates in a certification path MUST be located. + Restrictions apply to the subject distinguished name and apply to + subject alternative names. Restrictions apply only when the + + + +Housley, et. al. Standards Track [Page 37] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + specified name form is present. If no name of the type is in the + certificate, the certificate is acceptable. + + Name constraints are not applied to certificates whose issuer and + subject are identical (unless the certificate is the final + certificate in the path). (This could prevent CAs that use name + constraints from employing self-issued certificates to implement key + rollover.) + + Restrictions are defined in terms of permitted or excluded name + subtrees. Any name matching a restriction in the excludedSubtrees + field is invalid regardless of information appearing in the + permittedSubtrees. This extension MUST be critical. + + Within this profile, the minimum and maximum fields are not used with + any name forms, thus minimum MUST be zero, and maximum MUST be + absent. + + For URIs, the constraint applies to the host part of the name. The + constraint MAY specify a host or a domain. Examples would be + "foo.bar.com"; and ".xyz.com". When the the constraint begins with + a period, it MAY be expanded with one or more subdomains. That is, + the constraint ".xyz.com" is satisfied by both abc.xyz.com and + abc.def.xyz.com. However, the constraint ".xyz.com" is not satisfied + by "xyz.com". When the constraint does not begin with a period, it + specifies a host. + + A name constraint for Internet mail addresses MAY specify a + particular mailbox, all addresses at a particular host, or all + mailboxes in a domain. To indicate a particular mailbox, the + constraint is the complete mail address. For example, "root@xyz.com" + indicates the root mailbox on the host "xyz.com". To indicate all + Internet mail addresses on a particular host, the constraint is + specified as the host name. For example, the constraint "xyz.com" is + satisfied by any mail address at the host "xyz.com". To specify any + address within a domain, the constraint is specified with a leading + period (as with URIs). For example, ".xyz.com" indicates all the + Internet mail addresses in the domain "xyz.com", but not Internet + mail addresses on the host "xyz.com". + + DNS name restrictions are expressed as foo.bar.com. Any DNS name + that can be constructed by simply adding to the left hand side of the + name satisfies the name constraint. For example, www.foo.bar.com + would satisfy the constraint but foo1.bar.com would not. + + Legacy implementations exist where an RFC 822 name is embedded in the + subject distinguished name in an attribute of type EmailAddress + (section 4.1.2.6). When rfc822 names are constrained, but the + + + +Housley, et. al. Standards Track [Page 38] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + certificate does not include a subject alternative name, the rfc822 + name constraint MUST be applied to the attribute of type EmailAddress + in the subject distinguished name. The ASN.1 syntax for EmailAddress + and the corresponding OID are supplied in Appendix A. + + Restrictions of the form directoryName MUST be applied to the subject + field in the certificate and to the subjectAltName extensions of type + directoryName. Restrictions of the form x400Address MUST be applied + to subjectAltName extensions of type x400Address. + + When applying restrictions of the form directoryName, an + implementation MUST compare DN attributes. At a minimum, + implementations MUST perform the DN comparison rules specified in + Section 4.1.2.4. CAs issuing certificates with a restriction of the + form directoryName SHOULD NOT rely on implementation of the full ISO + DN name comparison algorithm. This implies name restrictions MUST be + stated identically to the encoding used in the subject field or + subjectAltName extension. + + The syntax of iPAddress MUST be as described in section 4.2.1.7 with + the following additions specifically for Name Constraints. For IPv4 + addresses, the ipAddress field of generalName MUST contain eight (8) + octets, encoded in the style of RFC 1519 (CIDR) to represent an + address range [RFC 1519]. For IPv6 addresses, the ipAddress field + MUST contain 32 octets similarly encoded. For example, a name + constraint for "class C" subnet 10.9.8.0 is represented as the octets + 0A 09 08 00 FF FF FF 00, representing the CIDR notation + 10.9.8.0/255.255.255.0. + + The syntax and semantics for name constraints for otherName, + ediPartyName, and registeredID are not defined by this specification. + + id-ce-nameConstraints OBJECT IDENTIFIER ::= { id-ce 30 } + + NameConstraints ::= SEQUENCE { + permittedSubtrees [0] GeneralSubtrees OPTIONAL, + excludedSubtrees [1] GeneralSubtrees OPTIONAL } + + GeneralSubtrees ::= SEQUENCE SIZE (1..MAX) OF GeneralSubtree + + GeneralSubtree ::= SEQUENCE { + base GeneralName, + minimum [0] BaseDistance DEFAULT 0, + maximum [1] BaseDistance OPTIONAL } + + BaseDistance ::= INTEGER (0..MAX) + + + + + +Housley, et. al. Standards Track [Page 39] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + +4.2.1.12 Policy Constraints + + The policy constraints extension can be used in certificates issued + to CAs. The policy constraints extension constrains path validation + in two ways. It can be used to prohibit policy mapping or require + that each certificate in a path contain an acceptable policy + identifier. + + If the inhibitPolicyMapping field is present, the value indicates the + number of additional certificates that may appear in the path before + policy mapping is no longer permitted. For example, a value of one + indicates that policy mapping may be processed in certificates issued + by the subject of this certificate, but not in additional + certificates in the path. + + If the requireExplicitPolicy field is present, the value of + requireExplicitPolicy indicates the number of additional certificates + that may appear in the path before an explicit policy is required for + the entire path. When an explicit policy is required, it is + necessary for all certificates in the path to contain an acceptable + policy identifier in the certificate policies extension. An + acceptable policy identifier is the identifier of a policy required + by the user of the certification path or the identifier of a policy + which has been declared equivalent through policy mapping. + + Conforming CAs MUST NOT issue certificates where policy constraints + is a empty sequence. That is, at least one of the + inhibitPolicyMapping field or the requireExplicitPolicy field MUST be + present. The behavior of clients that encounter a empty policy + constraints field is not addressed in this profile. + + This extension MAY be critical or non-critical. + + id-ce-policyConstraints OBJECT IDENTIFIER ::= { id-ce 36 } + + PolicyConstraints ::= SEQUENCE { + requireExplicitPolicy [0] SkipCerts OPTIONAL, + inhibitPolicyMapping [1] SkipCerts OPTIONAL } + + SkipCerts ::= INTEGER (0..MAX) + +4.2.1.13 Extended Key Usage + + This extension indicates one or more purposes for which the certified + public key may be used, in addition to or in place of the basic + purposes indicated in the key usage extension. In general, this + extension will appear only in end entity certificates. This + extension is defined as follows: + + + +Housley, et. al. Standards Track [Page 40] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + id-ce-extKeyUsage OBJECT IDENTIFIER ::= { id-ce 37 } + + ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId + + KeyPurposeId ::= OBJECT IDENTIFIER + + Key purposes may be defined by any organization with a need. Object + identifiers used to identify key purposes MUST be assigned in + accordance with IANA or ITU-T Recommendation X.660 [X.660]. + + This extension MAY, at the option of the certificate issuer, be + either critical or non-critical. + + If the extension is present, then the certificate MUST only be used + for one of the purposes indicated. If multiple purposes are + indicated the application need not recognize all purposes indicated, + as long as the intended purpose is present. Certificate using + applications MAY require that a particular purpose be indicated in + order for the certificate to be acceptable to that application. + + If a CA includes extended key usages to satisfy such applications, + but does not wish to restrict usages of the key, the CA can include + the special keyPurposeID anyExtendedKeyUsage. If the + anyExtendedKeyUsage keyPurposeID is present, the extension SHOULD NOT + be critical. + + If a certificate contains both a key usage extension and an extended + key usage extension, then both extensions MUST be processed + independently and the certificate MUST only be used for a purpose + consistent with both extensions. If there is no purpose consistent + with both extensions, then the certificate MUST NOT be used for any + purpose. + + The following key usage purposes are defined: + + anyExtendedKeyUsage OBJECT IDENTIFIER ::= { id-ce-extKeyUsage 0 } + + id-kp OBJECT IDENTIFIER ::= { id-pkix 3 } + + id-kp-serverAuth OBJECT IDENTIFIER ::= { id-kp 1 } + -- TLS WWW server authentication + -- Key usage bits that may be consistent: digitalSignature, + -- keyEncipherment or keyAgreement + + id-kp-clientAuth OBJECT IDENTIFIER ::= { id-kp 2 } + -- TLS WWW client authentication + -- Key usage bits that may be consistent: digitalSignature + -- and/or keyAgreement + + + +Housley, et. al. Standards Track [Page 41] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + id-kp-codeSigning OBJECT IDENTIFIER ::= { id-kp 3 } + -- Signing of downloadable executable code + -- Key usage bits that may be consistent: digitalSignature + + id-kp-emailProtection OBJECT IDENTIFIER ::= { id-kp 4 } + -- E-mail protection + -- Key usage bits that may be consistent: digitalSignature, + -- nonRepudiation, and/or (keyEncipherment or keyAgreement) + + id-kp-timeStamping OBJECT IDENTIFIER ::= { id-kp 8 } + -- Binding the hash of an object to a time + -- Key usage bits that may be consistent: digitalSignature + -- and/or nonRepudiation + + id-kp-OCSPSigning OBJECT IDENTIFIER ::= { id-kp 9 } + -- Signing OCSP responses + -- Key usage bits that may be consistent: digitalSignature + -- and/or nonRepudiation + +4.2.1.14 CRL Distribution Points + + The CRL distribution points extension identifies how CRL information + is obtained. The extension SHOULD be non-critical, but this profile + RECOMMENDS support for this extension by CAs and applications. + Further discussion of CRL management is contained in section 5. + + The cRLDistributionPoints extension is a SEQUENCE of + DistributionPoint. A DistributionPoint consists of three fields, + each of which is optional: distributionPoint, reasons, and cRLIssuer. + While each of these fields is optional, a DistributionPoint MUST NOT + consist of only the reasons field; either distributionPoint or + cRLIssuer MUST be present. If the certificate issuer is not the CRL + issuer, then the cRLIssuer field MUST be present and contain the Name + of the CRL issuer. If the certificate issuer is also the CRL issuer, + then the cRLIssuer field MUST be omitted and the distributionPoint + field MUST be present. If the distributionPoint field is omitted, + cRLIssuer MUST be present and include a Name corresponding to an + X.500 or LDAP directory entry where the CRL is located. + + When the distributionPoint field is present, it contains either a + SEQUENCE of general names or a single value, nameRelativeToCRLIssuer. + If the cRLDistributionPoints extension contains a general name of + type URI, the following semantics MUST be assumed: the URI is a + pointer to the current CRL for the associated reasons and will be + issued by the associated cRLIssuer. The expected values for the URI + are those defined in 4.2.1.7. Processing rules for other values are + not defined by this specification. + + + + +Housley, et. al. Standards Track [Page 42] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + If the DistributionPointName contains multiple values, each name + describes a different mechanism to obtain the same CRL. For example, + the same CRL could be available for retrieval through both LDAP and + HTTP. + + If the DistributionPointName contains the single value + nameRelativeToCRLIssuer, the value provides a distinguished name + fragment. The fragment is appended to the X.500 distinguished name + of the CRL issuer to obtain the distribution point name. If the + cRLIssuer field in the DistributionPoint is present, then the name + fragment is appended to the distinguished name that it contains; + otherwise, the name fragment is appended to the certificate issuer + distinguished name. The DistributionPointName MUST NOT use the + nameRealtiveToCRLIssuer alternative when cRLIssuer contains more than + one distinguished name. + + If the DistributionPoint omits the reasons field, the CRL MUST + include revocation information for all reasons. + + The cRLIssuer identifies the entity who signs and issues the CRL. If + present, the cRLIssuer MUST contain at least one an X.500 + distinguished name (DN), and MAY also contain other name forms. + Since the cRLIssuer is compared to the CRL issuer name, the X.501 + type Name MUST follow the encoding rules for the issuer name field in + the certificate (section 4.1.2.4). + + id-ce-cRLDistributionPoints OBJECT IDENTIFIER ::= { id-ce 31 } + + CRLDistributionPoints ::= SEQUENCE SIZE (1..MAX) OF DistributionPoint + + DistributionPoint ::= SEQUENCE { + distributionPoint [0] DistributionPointName OPTIONAL, + reasons [1] ReasonFlags OPTIONAL, + cRLIssuer [2] GeneralNames OPTIONAL } + + DistributionPointName ::= CHOICE { + fullName [0] GeneralNames, + nameRelativeToCRLIssuer [1] RelativeDistinguishedName } + + + + + + + + + + + + + +Housley, et. al. Standards Track [Page 43] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + ReasonFlags ::= BIT STRING { + unused (0), + keyCompromise (1), + cACompromise (2), + affiliationChanged (3), + superseded (4), + cessationOfOperation (5), + certificateHold (6), + privilegeWithdrawn (7), + aACompromise (8) } + +4.2.1.15 Inhibit Any-Policy + + The inhibit any-policy extension can be used in certificates issued + to CAs. The inhibit any-policy indicates that the special anyPolicy + OID, with the value { 2 5 29 32 0 }, is not considered an explicit + match for other certificate policies. The value indicates the number + of additional certificates that may appear in the path before + anyPolicy is no longer permitted. For example, a value of one + indicates that anyPolicy may be processed in certificates issued by + the subject of this certificate, but not in additional certificates + in the path. + + This extension MUST be critical. + + id-ce-inhibitAnyPolicy OBJECT IDENTIFIER ::= { id-ce 54 } + + InhibitAnyPolicy ::= SkipCerts + + SkipCerts ::= INTEGER (0..MAX) + +4.2.1.16 Freshest CRL (a.k.a. Delta CRL Distribution Point) + + The freshest CRL extension identifies how delta CRL information is + obtained. The extension MUST be non-critical. Further discussion of + CRL management is contained in section 5. + + The same syntax is used for this extension and the + cRLDistributionPoints extension, and is described in section + 4.2.1.14. The same conventions apply to both extensions. + + id-ce-freshestCRL OBJECT IDENTIFIER ::= { id-ce 46 } + + FreshestCRL ::= CRLDistributionPoints + + + + + + + +Housley, et. al. Standards Track [Page 44] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + +4.2.2 Private Internet Extensions + + This section defines two extensions for use in the Internet Public + Key Infrastructure. These extensions may be used to direct + applications to on-line information about the issuing CA or the + subject. As the information may be available in multiple forms, each + extension is a sequence of IA5String values, each of which represents + a URI. The URI implicitly specifies the location and format of the + information and the method for obtaining the information. + + An object identifier is defined for the private extension. The + object identifier associated with the private extension is defined + under the arc id-pe within the arc id-pkix. Any future extensions + defined for the Internet PKI are also expected to be defined under + the arc id-pe. + + id-pkix OBJECT IDENTIFIER ::= + { iso(1) identified-organization(3) dod(6) internet(1) + security(5) mechanisms(5) pkix(7) } + + id-pe OBJECT IDENTIFIER ::= { id-pkix 1 } + +4.2.2.1 Authority Information Access + + The authority information access extension indicates how to access CA + information and services for the issuer of the certificate in which + the extension appears. Information and services may include on-line + validation services and CA policy data. (The location of CRLs is not + specified in this extension; that information is provided by the + cRLDistributionPoints extension.) This extension may be included in + end entity or CA certificates, and it MUST be non-critical. + + id-pe-authorityInfoAccess OBJECT IDENTIFIER ::= { id-pe 1 } + + AuthorityInfoAccessSyntax ::= + SEQUENCE SIZE (1..MAX) OF AccessDescription + + AccessDescription ::= SEQUENCE { + accessMethod OBJECT IDENTIFIER, + accessLocation GeneralName } + + id-ad OBJECT IDENTIFIER ::= { id-pkix 48 } + + id-ad-caIssuers OBJECT IDENTIFIER ::= { id-ad 2 } + + id-ad-ocsp OBJECT IDENTIFIER ::= { id-ad 1 } + + + + + +Housley, et. al. Standards Track [Page 45] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + Each entry in the sequence AuthorityInfoAccessSyntax describes the + format and location of additional information provided by the CA that + issued the certificate in which this extension appears. The type and + format of the information is specified by the accessMethod field; the + accessLocation field specifies the location of the information. The + retrieval mechanism may be implied by the accessMethod or specified + by accessLocation. + + This profile defines two accessMethod OIDs: id-ad-caIssuers and + id-ad-ocsp. + + The id-ad-caIssuers OID is used when the additional information lists + CAs that have issued certificates superior to the CA that issued the + certificate containing this extension. The referenced CA issuers + description is intended to aid certificate users in the selection of + a certification path that terminates at a point trusted by the + certificate user. + + When id-ad-caIssuers appears as accessMethod, the accessLocation + field describes the referenced description server and the access + protocol to obtain the referenced description. The accessLocation + field is defined as a GeneralName, which can take several forms. + Where the information is available via http, ftp, or ldap, + accessLocation MUST be a uniformResourceIdentifier. Where the + information is available via the Directory Access Protocol (DAP), + accessLocation MUST be a directoryName. The entry for that + directoryName contains CA certificates in the crossCertificatePair + attribute. When the information is available via electronic mail, + accessLocation MUST be an rfc822Name. The semantics of other + id-ad-caIssuers accessLocation name forms are not defined. + + The id-ad-ocsp OID is used when revocation information for the + certificate containing this extension is available using the Online + Certificate Status Protocol (OCSP) [RFC 2560]. + + When id-ad-ocsp appears as accessMethod, the accessLocation field is + the location of the OCSP responder, using the conventions defined in + [RFC 2560]. + + Additional access descriptors may be defined in other PKIX + specifications. + +4.2.2.2 Subject Information Access + + The subject information access extension indicates how to access + information and services for the subject of the certificate in which + the extension appears. When the subject is a CA, information and + services may include certificate validation services and CA policy + + + +Housley, et. al. Standards Track [Page 46] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + data. When the subject is an end entity, the information describes + the type of services offered and how to access them. In this case, + the contents of this extension are defined in the protocol + specifications for the suported services. This extension may be + included in subject or CA certificates, and it MUST be non-critical. + + id-pe-subjectInfoAccess OBJECT IDENTIFIER ::= { id-pe 11 } + + SubjectInfoAccessSyntax ::= + SEQUENCE SIZE (1..MAX) OF AccessDescription + + AccessDescription ::= SEQUENCE { + accessMethod OBJECT IDENTIFIER, + accessLocation GeneralName } + + Each entry in the sequence SubjectInfoAccessSyntax describes the + format and location of additional information provided by the subject + of the certificate in which this extension appears. The type and + format of the information is specified by the accessMethod field; the + accessLocation field specifies the location of the information. The + retrieval mechanism may be implied by the accessMethod or specified + by accessLocation. + + This profile defines one access method to be used when the subject is + a CA, and one access method to be used when the subject is an end + entity. Additional access methods may be defined in the future in + the protocol specifications for other services. + + The id-ad-caRepository OID is used when the subject is a CA, and + publishes its certificates and CRLs (if issued) in a repository. The + accessLocation field is defined as a GeneralName, which can take + several forms. Where the information is available via http, ftp, or + ldap, accessLocation MUST be a uniformResourceIdentifier. Where the + information is available via the directory access protocol (dap), + accessLocation MUST be a directoryName. When the information is + available via electronic mail, accessLocation MUST be an rfc822Name. + The semantics of other name forms of of accessLocation (when + accessMethod is id-ad-caRepository) are not defined by this + specification. + + The id-ad-timeStamping OID is used when the subject offers + timestamping services using the Time Stamp Protocol defined in + [PKIXTSA]. Where the timestamping services are available via http or + ftp, accessLocation MUST be a uniformResourceIdentifier. Where the + timestamping services are available via electronic mail, + accessLocation MUST be an rfc822Name. Where timestamping services + + + + + +Housley, et. al. Standards Track [Page 47] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + are available using TCP/IP, the dNSName or ipAddress name forms may + be used. The semantics of other name forms of accessLocation (when + accessMethod is id-ad-timeStamping) are not defined by this + specification. + + Additional access descriptors may be defined in other PKIX + specifications. + + id-ad OBJECT IDENTIFIER ::= { id-pkix 48 } + + id-ad-caRepository OBJECT IDENTIFIER ::= { id-ad 5 } + + id-ad-timeStamping OBJECT IDENTIFIER ::= { id-ad 3 } + +5 CRL and CRL Extensions Profile + + As discussed above, one goal of this X.509 v2 CRL profile is to + foster the creation of an interoperable and reusable Internet PKI. + To achieve this goal, guidelines for the use of extensions are + specified, and some assumptions are made about the nature of + information included in the CRL. + + CRLs may be used in a wide range of applications and environments + covering a broad spectrum of interoperability goals and an even + broader spectrum of operational and assurance requirements. This + profile establishes a common baseline for generic applications + requiring broad interoperability. The profile defines a set of + information that can be expected in every CRL. Also, the profile + defines common locations within the CRL for frequently used + attributes as well as common representations for these attributes. + + CRL issuers issue CRLs. In general, the CRL issuer is the CA. CAs + publish CRLs to provide status information about the certificates + they issued. However, a CA may delegate this responsibility to + another trusted authority. Whenever the CRL issuer is not the CA + that issued the certificates, the CRL is referred to as an indirect + CRL. + + Each CRL has a particular scope. The CRL scope is the set of + certificates that could appear on a given CRL. For example, the + scope could be "all certificates issued by CA X", "all CA + certificates issued by CA X", "all certificates issued by CA X that + have been revoked for reasons of key compromise and CA compromise", + or could be a set of certificates based on arbitrary local + information, such as "all certificates issued to the NIST employees + located in Boulder". + + + + + +Housley, et. al. Standards Track [Page 48] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + A complete CRL lists all unexpired certificates, within its scope, + that have been revoked for one of the revocation reasons covered by + the CRL scope. The CRL issuer MAY also generate delta CRLs. A delta + CRL only lists those certificates, within its scope, whose revocation + status has changed since the issuance of a referenced complete CRL. + The referenced complete CRL is referred to as a base CRL. The scope + of a delta CRL MUST be the same as the base CRL that it references. + + This profile does not define any private Internet CRL extensions or + CRL entry extensions. + + Environments with additional or special purpose requirements may + build on this profile or may replace it. + + Conforming CAs are not required to issue CRLs if other revocation or + certificate status mechanisms are provided. When CRLs are issued, + the CRLs MUST be version 2 CRLs, include the date by which the next + CRL will be issued in the nextUpdate field (section 5.1.2.5), include + the CRL number extension (section 5.2.3), and include the authority + key identifier extension (section 5.2.1). Conforming applications + that support CRLs are REQUIRED to process both version 1 and version + 2 complete CRLs that provide revocation information for all + certificates issued by one CA. Conforming applications are NOT + REQUIRED to support processing of delta CRLs, indirect CRLs, or CRLs + with a scope other than all certificates issued by one CA. + +5.1 CRL Fields + + The X.509 v2 CRL syntax is as follows. For signature calculation, + the data that is to be signed is ASN.1 DER encoded. ASN.1 DER + encoding is a tag, length, value encoding system for each element. + + CertificateList ::= SEQUENCE { + tbsCertList TBSCertList, + signatureAlgorithm AlgorithmIdentifier, + signatureValue BIT STRING } + + + + + + + + + + + + + + + +Housley, et. al. Standards Track [Page 49] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + TBSCertList ::= SEQUENCE { + version Version OPTIONAL, + -- if present, MUST be v2 + signature AlgorithmIdentifier, + issuer Name, + thisUpdate Time, + nextUpdate Time OPTIONAL, + revokedCertificates SEQUENCE OF SEQUENCE { + userCertificate CertificateSerialNumber, + revocationDate Time, + crlEntryExtensions Extensions OPTIONAL + -- if present, MUST be v2 + } OPTIONAL, + crlExtensions [0] EXPLICIT Extensions OPTIONAL + -- if present, MUST be v2 + } + + -- Version, Time, CertificateSerialNumber, and Extensions + -- are all defined in the ASN.1 in section 4.1 + + -- AlgorithmIdentifier is defined in section 4.1.1.2 + + The following items describe the use of the X.509 v2 CRL in the + Internet PKI. + +5.1.1 CertificateList Fields + + The CertificateList is a SEQUENCE of three required fields. The + fields are described in detail in the following subsections. + +5.1.1.1 tbsCertList + + The first field in the sequence is the tbsCertList. This field is + itself a sequence containing the name of the issuer, issue date, + issue date of the next list, the optional list of revoked + certificates, and optional CRL extensions. When there are no revoked + certificates, the revoked certificates list is absent. When one or + more certificates are revoked, each entry on the revoked certificate + list is defined by a sequence of user certificate serial number, + revocation date, and optional CRL entry extensions. + +5.1.1.2 signatureAlgorithm + + The signatureAlgorithm field contains the algorithm identifier for + the algorithm used by the CRL issuer to sign the CertificateList. + The field is of type AlgorithmIdentifier, which is defined in section + 4.1.1.2. [PKIXALGS] lists the supported algorithms for this + specification, but other signature algorithms MAY also be supported. + + + +Housley, et. al. Standards Track [Page 50] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + This field MUST contain the same algorithm identifier as the + signature field in the sequence tbsCertList (section 5.1.2.2). + +5.1.1.3 signatureValue + + The signatureValue field contains a digital signature computed upon + the ASN.1 DER encoded tbsCertList. The ASN.1 DER encoded tbsCertList + is used as the input to the signature function. This signature value + is encoded as a BIT STRING and included in the CRL signatureValue + field. The details of this process are specified for each of the + supported algorithms in [PKIXALGS]. + + CAs that are also CRL issuers MAY use one private key to digitally + sign certificates and CRLs, or MAY use separate private keys to + digitally sign certificates and CRLs. When separate private keys are + employed, each of the public keys associated with these private keys + is placed in a separate certificate, one with the keyCertSign bit set + in the key usage extension, and one with the cRLSign bit set in the + key usage extension (section 4.2.1.3). When separate private keys + are employed, certificates issued by the CA contain one authority key + identifier, and the corresponding CRLs contain a different authority + key identifier. The use of separate CA certificates for validation + of certificate signatures and CRL signatures can offer improved + security characteristics; however, it imposes a burden on + applications, and it might limit interoperability. Many applications + construct a certification path, and then validate the certification + path (section 6). CRL checking in turn requires a separate + certification path to be constructed and validated for the CA's CRL + signature validation certificate. Applications that perform CRL + checking MUST support certification path validation when certificates + and CRLs are digitally signed with the same CA private key. These + applications SHOULD support certification path validation when + certificates and CRLs are digitally signed with different CA private + keys. + +5.1.2 Certificate List "To Be Signed" + + The certificate list to be signed, or TBSCertList, is a sequence of + required and optional fields. The required fields identify the CRL + issuer, the algorithm used to sign the CRL, the date and time the CRL + was issued, and the date and time by which the CRL issuer will issue + the next CRL. + + Optional fields include lists of revoked certificates and CRL + extensions. The revoked certificate list is optional to support the + case where a CA has not revoked any unexpired certificates that it + + + + + +Housley, et. al. Standards Track [Page 51] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + has issued. The profile requires conforming CRL issuers to use the + CRL number and authority key identifier CRL extensions in all CRLs + issued. + +5.1.2.1 Version + + This optional field describes the version of the encoded CRL. When + extensions are used, as required by this profile, this field MUST be + present and MUST specify version 2 (the integer value is 1). + +5.1.2.2 Signature + + This field contains the algorithm identifier for the algorithm used + to sign the CRL. [PKIXALGS] lists OIDs for the most popular + signature algorithms used in the Internet PKI. + + This field MUST contain the same algorithm identifier as the + signatureAlgorithm field in the sequence CertificateList (section + 5.1.1.2). + +5.1.2.3 Issuer Name + + The issuer name identifies the entity who has signed and issued the + CRL. The issuer identity is carried in the issuer name field. + Alternative name forms may also appear in the issuerAltName extension + (section 5.2.2). The issuer name field MUST contain an X.500 + distinguished name (DN). The issuer name field is defined as the + X.501 type Name, and MUST follow the encoding rules for the issuer + name field in the certificate (section 4.1.2.4). + +5.1.2.4 This Update + + This field indicates the issue date of this CRL. ThisUpdate may be + encoded as UTCTime or GeneralizedTime. + + CRL issuers conforming to this profile MUST encode thisUpdate as + UTCTime for dates through the year 2049. CRL issuers conforming to + this profile MUST encode thisUpdate as GeneralizedTime for dates in + the year 2050 or later. + + Where encoded as UTCTime, thisUpdate MUST be specified and + interpreted as defined in section 4.1.2.5.1. Where encoded as + GeneralizedTime, thisUpdate MUST be specified and interpreted as + defined in section 4.1.2.5.2. + + + + + + + +Housley, et. al. Standards Track [Page 52] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + +5.1.2.5 Next Update + + This field indicates the date by which the next CRL will be issued. + The next CRL could be issued before the indicated date, but it will + not be issued any later than the indicated date. CRL issuers SHOULD + issue CRLs with a nextUpdate time equal to or later than all previous + CRLs. nextUpdate may be encoded as UTCTime or GeneralizedTime. + + This profile requires inclusion of nextUpdate in all CRLs issued by + conforming CRL issuers. Note that the ASN.1 syntax of TBSCertList + describes this field as OPTIONAL, which is consistent with the ASN.1 + structure defined in [X.509]. The behavior of clients processing + CRLs which omit nextUpdate is not specified by this profile. + + CRL issuers conforming to this profile MUST encode nextUpdate as + UTCTime for dates through the year 2049. CRL issuers conforming to + this profile MUST encode nextUpdate as GeneralizedTime for dates in + the year 2050 or later. + + Where encoded as UTCTime, nextUpdate MUST be specified and + interpreted as defined in section 4.1.2.5.1. Where encoded as + GeneralizedTime, nextUpdate MUST be specified and interpreted as + defined in section 4.1.2.5.2. + +5.1.2.6 Revoked Certificates + + When there are no revoked certificates, the revoked certificates list + MUST be absent. Otherwise, revoked certificates are listed by their + serial numbers. Certificates revoked by the CA are uniquely + identified by the certificate serial number. The date on which the + revocation occurred is specified. The time for revocationDate MUST + be expressed as described in section 5.1.2.4. Additional information + may be supplied in CRL entry extensions; CRL entry extensions are + discussed in section 5.3. + +5.1.2.7 Extensions + + This field may only appear if the version is 2 (section 5.1.2.1). If + present, this field is a sequence of one or more CRL extensions. CRL + extensions are discussed in section 5.2. + +5.2 CRL Extensions + + The extensions defined by ANSI X9, ISO/IEC, and ITU-T for X.509 v2 + CRLs [X.509] [X9.55] provide methods for associating additional + attributes with CRLs. The X.509 v2 CRL format also allows + communities to define private extensions to carry information unique + to those communities. Each extension in a CRL may be designated as + + + +Housley, et. al. Standards Track [Page 53] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + critical or non-critical. A CRL validation MUST fail if it + encounters a critical extension which it does not know how to + process. However, an unrecognized non-critical extension may be + ignored. The following subsections present those extensions used + within Internet CRLs. Communities may elect to include extensions in + CRLs which are not defined in this specification. However, caution + should be exercised in adopting any critical extensions in CRLs which + might be used in a general context. + + Conforming CRL issuers are REQUIRED to include the authority key + identifier (section 5.2.1) and the CRL number (section 5.2.3) + extensions in all CRLs issued. + +5.2.1 Authority Key Identifier + + The authority key identifier extension provides a means of + identifying the public key corresponding to the private key used to + sign a CRL. The identification can be based on either the key + identifier (the subject key identifier in the CRL signer's + certificate) or on the issuer name and serial number. This extension + is especially useful where an issuer has more than one signing key, + either due to multiple concurrent key pairs or due to changeover. + + Conforming CRL issuers MUST use the key identifier method, and MUST + include this extension in all CRLs issued. + + The syntax for this CRL extension is defined in section 4.2.1.1. + +5.2.2 Issuer Alternative Name + + The issuer alternative names extension allows additional identities + to be associated with the issuer of the CRL. Defined options include + an rfc822 name (electronic mail address), a DNS name, an IP address, + and a URI. Multiple instances of a name and multiple name forms may + be included. Whenever such identities are used, the issuer + alternative name extension MUST be used; however, a DNS name MAY be + represented in the issuer field using the domainComponent attribute + as described in section 4.1.2.4. + + The issuerAltName extension SHOULD NOT be marked critical. + + The OID and syntax for this CRL extension are defined in section + 4.2.1.8. + + + + + + + + +Housley, et. al. Standards Track [Page 54] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + +5.2.3 CRL Number + + The CRL number is a non-critical CRL extension which conveys a + monotonically increasing sequence number for a given CRL scope and + CRL issuer. This extension allows users to easily determine when a + particular CRL supersedes another CRL. CRL numbers also support the + identification of complementary complete CRLs and delta CRLs. CRL + issuers conforming to this profile MUST include this extension in all + CRLs. + + If a CRL issuer generates delta CRLs in addition to complete CRLs for + a given scope, the complete CRLs and delta CRLs MUST share one + numbering sequence. If a delta CRL and a complete CRL that cover the + same scope are issued at the same time, they MUST have the same CRL + number and provide the same revocation information. That is, the + combination of the delta CRL and an acceptable complete CRL MUST + provide the same revocation information as the simultaneously issued + complete CRL. + + If a CRL issuer generates two CRLs (two complete CRLs, two delta + CRLs, or a complete CRL and a delta CRL) for the same scope at + different times, the two CRLs MUST NOT have the same CRL number. + That is, if the this update field (section 5.1.2.4) in the two CRLs + are not identical, the CRL numbers MUST be different. + + Given the requirements above, CRL numbers can be expected to contain + long integers. CRL verifiers MUST be able to handle CRLNumber values + up to 20 octets. Conformant CRL issuers MUST NOT use CRLNumber + values longer than 20 octets. + + id-ce-cRLNumber OBJECT IDENTIFIER ::= { id-ce 20 } + + CRLNumber ::= INTEGER (0..MAX) + +5.2.4 Delta CRL Indicator + + The delta CRL indicator is a critical CRL extension that identifies a + CRL as being a delta CRL. Delta CRLs contain updates to revocation + information previously distributed, rather than all the information + that would appear in a complete CRL. The use of delta CRLs can + significantly reduce network load and processing time in some + environments. Delta CRLs are generally smaller than the CRLs they + update, so applications that obtain delta CRLs consume less network + bandwidth than applications that obtain the corresponding complete + CRLs. Applications which store revocation information in a format + other than the CRL structure can add new revocation information to + the local database without reprocessing information. + + + + +Housley, et. al. Standards Track [Page 55] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + The delta CRL indicator extension contains the single value of type + BaseCRLNumber. The CRL number identifies the CRL, complete for a + given scope, that was used as the starting point in the generation of + this delta CRL. A conforming CRL issuer MUST publish the referenced + base CRL as a complete CRL. The delta CRL contains all updates to + the revocation status for that same scope. The combination of a + delta CRL plus the referenced base CRL is equivalent to a complete + CRL, for the applicable scope, at the time of publication of the + delta CRL. + + When a conforming CRL issuer generates a delta CRL, the delta CRL + MUST include a critical delta CRL indicator extension. + + When a delta CRL is issued, it MUST cover the same set of reasons and + the same set of certificates that were covered by the base CRL it + references. That is, the scope of the delta CRL MUST be the same as + the scope of the complete CRL referenced as the base. The referenced + base CRL and the delta CRL MUST omit the issuing distribution point + extension or contain identical issuing distribution point extensions. + Further, the CRL issuer MUST use the same private key to sign the + delta CRL and any complete CRL that it can be used to update. + + An application that supports delta CRLs can construct a CRL that is + complete for a given scope by combining a delta CRL for that scope + with either an issued CRL that is complete for that scope or a + locally constructed CRL that is complete for that scope. + + When a delta CRL is combined with a complete CRL or a locally + constructed CRL, the resulting locally constructed CRL has the CRL + number specified in the CRL number extension found in the delta CRL + used in its construction. In addition, the resulting locally + constructed CRL has the thisUpdate and nextUpdate times specified in + the corresponding fields of the delta CRL used in its construction. + In addition, the locally constructed CRL inherits the issuing + distribution point from the delta CRL. + + A complete CRL and a delta CRL MAY be combined if the following four + conditions are satisfied: + + (a) The complete CRL and delta CRL have the same issuer. + + (b) The complete CRL and delta CRL have the same scope. The two + CRLs have the same scope if either of the following conditions are + met: + + (1) The issuingDistributionPoint extension is omitted from + both the complete CRL and the delta CRL. + + + + +Housley, et. al. Standards Track [Page 56] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + (2) The issuingDistributionPoint extension is present in both + the complete CRL and the delta CRL, and the values for each of + the fields in the extensions are the same in both CRLs. + + (c) The CRL number of the complete CRL is equal to or greater + than the BaseCRLNumber specified in the delta CRL. That is, the + complete CRL contains (at a minimum) all the revocation + information held by the referenced base CRL. + + (d) The CRL number of the complete CRL is less than the CRL + number of the delta CRL. That is, the delta CRL follows the + complete CRL in the numbering sequence. + + CRL issuers MUST ensure that the combination of a delta CRL and any + appropriate complete CRL accurately reflects the current revocation + status. The CRL issuer MUST include an entry in the delta CRL for + each certificate within the scope of the delta CRL whose status has + changed since the generation of the referenced base CRL: + + (a) If the certificate is revoked for a reason included in the + scope of the CRL, list the certificate as revoked. + + (b) If the certificate is valid and was listed on the referenced + base CRL or any subsequent CRL with reason code certificateHold, + and the reason code certificateHold is included in the scope of + the CRL, list the certificate with the reason code removeFromCRL. + + (c) If the certificate is revoked for a reason outside the scope + of the CRL, but the certificate was listed on the referenced base + CRL or any subsequent CRL with a reason code included in the scope + of this CRL, list the certificate as revoked but omit the reason + code. + + (d) If the certificate is revoked for a reason outside the scope + of the CRL and the certificate was neither listed on the + referenced base CRL nor any subsequent CRL with a reason code + included in the scope of this CRL, do not list the certificate on + this CRL. + + The status of a certificate is considered to have changed if it is + revoked, placed on hold, released from hold, or if its revocation + reason changes. + + It is appropriate to list a certificate with reason code + removeFromCRL on a delta CRL even if the certificate was not on hold + in the referenced base CRL. If the certificate was placed on hold in + + + + + +Housley, et. al. Standards Track [Page 57] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + any CRL issued after the base but before this delta CRL and then + released from hold, it MUST be listed on the delta CRL with + revocation reason removeFromCRL. + + A CRL issuer MAY optionally list a certificate on a delta CRL with + reason code removeFromCRL if the notAfter time specified in the + certificate precedes the thisUpdate time specified in the delta CRL + and the certificate was listed on the referenced base CRL or in any + CRL issued after the base but before this delta CRL. + + If a certificate revocation notice first appears on a delta CRL, then + it is possible for the certificate validity period to expire before + the next complete CRL for the same scope is issued. In this case, + the revocation notice MUST be included in all subsequent delta CRLs + until the revocation notice is included on at least one explicitly + issued complete CRL for this scope. + + An application that supports delta CRLs MUST be able to construct a + current complete CRL by combining a previously issued complete CRL + and the most current delta CRL. An application that supports delta + CRLs MAY also be able to construct a current complete CRL by + combining a previously locally constructed complete CRL and the + current delta CRL. A delta CRL is considered to be the current one + if the current time is between the times contained in the thisUpdate + and nextUpdate fields. Under some circumstances, the CRL issuer may + publish one or more delta CRLs before indicated by the nextUpdate + field. If more than one current delta CRL for a given scope is + encountered, the application SHOULD consider the one with the latest + value in thisUpdate to be the most current one. + + id-ce-deltaCRLIndicator OBJECT IDENTIFIER ::= { id-ce 27 } + + BaseCRLNumber ::= CRLNumber + +5.2.5 Issuing Distribution Point + + The issuing distribution point is a critical CRL extension that + identifies the CRL distribution point and scope for a particular CRL, + and it indicates whether the CRL covers revocation for end entity + certificates only, CA certificates only, attribute certificates only, + + or a limited set of reason codes. Although the extension is + critical, conforming implementations are not required to support this + extension. + + + + + + + +Housley, et. al. Standards Track [Page 58] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + The CRL is signed using the CRL issuer's private key. CRL + Distribution Points do not have their own key pairs. If the CRL is + stored in the X.500 Directory, it is stored in the Directory entry + corresponding to the CRL distribution point, which may be different + than the Directory entry of the CRL issuer. + + The reason codes associated with a distribution point MUST be + specified in onlySomeReasons. If onlySomeReasons does not appear, + the distribution point MUST contain revocations for all reason codes. + CAs may use CRL distribution points to partition the CRL on the basis + of compromise and routine revocation. In this case, the revocations + with reason code keyCompromise (1), cACompromise (2), and + aACompromise (8) appear in one distribution point, and the + revocations with other reason codes appear in another distribution + point. + + If the distributionPoint field is present and contains a URI, the + following semantics MUST be assumed: the object is a pointer to the + most current CRL issued by this CRL issuer. The URI schemes ftp, + http, mailto [RFC1738] and ldap [RFC1778] are defined for this + purpose. The URI MUST be an absolute pathname, not a relative + pathname, and MUST specify the host. + + If the distributionPoint field is absent, the CRL MUST contain + entries for all revoked unexpired certificates issued by the CRL + issuer, if any, within the scope of the CRL. + + The CRL issuer MUST assert the indirectCRL boolean, if the scope of + the CRL includes certificates issued by authorities other than the + CRL issuer. The authority responsible for each entry is indicated by + the certificate issuer CRL entry extension (section 5.3.4). + + id-ce-issuingDistributionPoint OBJECT IDENTIFIER ::= { id-ce 28 } + + issuingDistributionPoint ::= SEQUENCE { + distributionPoint [0] DistributionPointName OPTIONAL, + onlyContainsUserCerts [1] BOOLEAN DEFAULT FALSE, + onlyContainsCACerts [2] BOOLEAN DEFAULT FALSE, + onlySomeReasons [3] ReasonFlags OPTIONAL, + indirectCRL [4] BOOLEAN DEFAULT FALSE, + onlyContainsAttributeCerts [5] BOOLEAN DEFAULT FALSE } + +5.2.6 Freshest CRL (a.k.a. Delta CRL Distribution Point) + + The freshest CRL extension identifies how delta CRL information for + this complete CRL is obtained. The extension MUST be non-critical. + This extension MUST NOT appear in delta CRLs. + + + + +Housley, et. al. Standards Track [Page 59] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + The same syntax is used for this extension as the + cRLDistributionPoints certificate extension, and is described in + section 4.2.1.14. However, only the distribution point field is + meaningful in this context. The reasons and CRLIssuer fields MUST be + omitted from this CRL extension. + + Each distribution point name provides the location at which a delta + CRL for this complete CRL can be found. The scope of these delta + CRLs MUST be the same as the scope of this complete CRL. The + contents of this CRL extension are only used to locate delta CRLs; + the contents are not used to validate the CRL or the referenced delta + CRLs. The encoding conventions defined for distribution points in + section 4.2.1.14 apply to this extension. + + id-ce-freshestCRL OBJECT IDENTIFIER ::= { id-ce 46 } + + FreshestCRL ::= CRLDistributionPoints + +5.3 CRL Entry Extensions + + The CRL entry extensions defined by ISO/IEC, ITU-T, and ANSI X9 for + X.509 v2 CRLs provide methods for associating additional attributes + with CRL entries [X.509] [X9.55]. The X.509 v2 CRL format also + allows communities to define private CRL entry extensions to carry + information unique to those communities. Each extension in a CRL + entry may be designated as critical or non-critical. A CRL + validation MUST fail if it encounters a critical CRL entry extension + which it does not know how to process. However, an unrecognized non- + critical CRL entry extension may be ignored. The following + subsections present recommended extensions used within Internet CRL + entries and standard locations for information. Communities may + elect to use additional CRL entry extensions; however, caution should + be exercised in adopting any critical extensions in CRL entries which + might be used in a general context. + + All CRL entry extensions used in this specification are non-critical. + Support for these extensions is optional for conforming CRL issuers + and applications. However, CRL issuers SHOULD include reason codes + (section 5.3.1) and invalidity dates (section 5.3.3) whenever this + information is available. + +5.3.1 Reason Code + + The reasonCode is a non-critical CRL entry extension that identifies + the reason for the certificate revocation. CRL issuers are strongly + encouraged to include meaningful reason codes in CRL entries; + however, the reason code CRL entry extension SHOULD be absent instead + of using the unspecified (0) reasonCode value. + + + +Housley, et. al. Standards Track [Page 60] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + id-ce-cRLReason OBJECT IDENTIFIER ::= { id-ce 21 } + + -- reasonCode ::= { CRLReason } + + CRLReason ::= ENUMERATED { + unspecified (0), + keyCompromise (1), + cACompromise (2), + affiliationChanged (3), + superseded (4), + cessationOfOperation (5), + certificateHold (6), + removeFromCRL (8), + privilegeWithdrawn (9), + aACompromise (10) } + +5.3.2 Hold Instruction Code + + The hold instruction code is a non-critical CRL entry extension that + provides a registered instruction identifier which indicates the + action to be taken after encountering a certificate that has been + placed on hold. + + id-ce-holdInstructionCode OBJECT IDENTIFIER ::= { id-ce 23 } + + holdInstructionCode ::= OBJECT IDENTIFIER + + The following instruction codes have been defined. Conforming + applications that process this extension MUST recognize the following + instruction codes. + + holdInstruction OBJECT IDENTIFIER ::= + { iso(1) member-body(2) us(840) x9-57(10040) 2 } + + id-holdinstruction-none OBJECT IDENTIFIER ::= {holdInstruction 1} + id-holdinstruction-callissuer + OBJECT IDENTIFIER ::= {holdInstruction 2} + id-holdinstruction-reject OBJECT IDENTIFIER ::= {holdInstruction 3} + + Conforming applications which encounter an id-holdinstruction- + callissuer MUST call the certificate issuer or reject the + certificate. Conforming applications which encounter an id- + holdinstruction-reject MUST reject the certificate. The hold + instruction id-holdinstruction-none is semantically equivalent to the + absence of a holdInstructionCode, and its use is strongly deprecated + for the Internet PKI. + + + + + +Housley, et. al. Standards Track [Page 61] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + +5.3.3 Invalidity Date + + The invalidity date is a non-critical CRL entry extension that + provides the date on which it is known or suspected that the private + key was compromised or that the certificate otherwise became invalid. + This date may be earlier than the revocation date in the CRL entry, + which is the date at which the CA processed the revocation. When a + revocation is first posted by a CRL issuer in a CRL, the invalidity + date may precede the date of issue of earlier CRLs, but the + revocation date SHOULD NOT precede the date of issue of earlier CRLs. + Whenever this information is available, CRL issuers are strongly + encouraged to share it with CRL users. + + The GeneralizedTime values included in this field MUST be expressed + in Greenwich Mean Time (Zulu), and MUST be specified and interpreted + as defined in section 4.1.2.5.2. + + id-ce-invalidityDate OBJECT IDENTIFIER ::= { id-ce 24 } + + invalidityDate ::= GeneralizedTime + +5.3.4 Certificate Issuer + + This CRL entry extension identifies the certificate issuer associated + with an entry in an indirect CRL, that is, a CRL that has the + indirectCRL indicator set in its issuing distribution point + extension. If this extension is not present on the first entry in an + indirect CRL, the certificate issuer defaults to the CRL issuer. On + subsequent entries in an indirect CRL, if this extension is not + present, the certificate issuer for the entry is the same as that for + the preceding entry. This field is defined as follows: + + id-ce-certificateIssuer OBJECT IDENTIFIER ::= { id-ce 29 } + + certificateIssuer ::= GeneralNames + + If used by conforming CRL issuers, this extension MUST always be + critical. If an implementation ignored this extension it could not + correctly attribute CRL entries to certificates. This specification + RECOMMENDS that implementations recognize this extension. + +6 Certification Path Validation + + Certification path validation procedures for the Internet PKI are + based on the algorithm supplied in [X.509]. Certification path + processing verifies the binding between the subject distinguished + name and/or subject alternative name and subject public key. The + binding is limited by constraints which are specified in the + + + +Housley, et. al. Standards Track [Page 62] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + certificates which comprise the path and inputs which are specified + by the relying party. The basic constraints and policy constraints + extensions allow the certification path processing logic to automate + the decision making process. + + This section describes an algorithm for validating certification + paths. Conforming implementations of this specification are not + required to implement this algorithm, but MUST provide functionality + equivalent to the external behavior resulting from this procedure. + Any algorithm may be used by a particular implementation so long as + it derives the correct result. + + In section 6.1, the text describes basic path validation. Valid + paths begin with certificates issued by a trust anchor. The + algorithm requires the public key of the CA, the CA's name, and any + constraints upon the set of paths which may be validated using this + key. + + The selection of a trust anchor is a matter of policy: it could be + the top CA in a hierarchical PKI; the CA that issued the verifier's + own certificate(s); or any other CA in a network PKI. The path + validation procedure is the same regardless of the choice of trust + anchor. In addition, different applications may rely on different + trust anchor, or may accept paths that begin with any of a set of + trust anchor. + + Section 6.2 describes methods for using the path validation algorithm + in specific implementations. Two specific cases are discussed: the + case where paths may begin with one of several trusted CAs; and where + compatibility with the PEM architecture is required. + + Section 6.3 describes the steps necessary to determine if a + certificate is revoked or on hold status when CRLs are the revocation + mechanism used by the certificate issuer. + +6.1 Basic Path Validation + + This text describes an algorithm for X.509 path processing. A + conformant implementation MUST include an X.509 path processing + procedure that is functionally equivalent to the external behavior of + this algorithm. However, support for some of the certificate + extensions processed in this algorithm are OPTIONAL for compliant + implementations. Clients that do not support these extensions MAY + omit the corresponding steps in the path validation algorithm. + + + + + + + +Housley, et. al. Standards Track [Page 63] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + For example, clients are NOT REQUIRED to support the policy mapping + extension. Clients that do not support this extension MAY omit the + path validation steps where policy mappings are processed. Note that + clients MUST reject the certificate if it contains an unsupported + critical extension. + + The algorithm presented in this section validates the certificate + with respect to the current date and time. A conformant + implementation MAY also support validation with respect to some point + in the past. Note that mechanisms are not available for validating a + certificate with respect to a time outside the certificate validity + period. + + The trust anchor is an input to the algorithm. There is no + requirement that the same trust anchor be used to validate all + certification paths. Different trust anchors MAY be used to validate + different paths, as discussed further in Section 6.2. + + The primary goal of path validation is to verify the binding between + a subject distinguished name or a subject alternative name and + subject public key, as represented in the end entity certificate, + based on the public key of the trust anchor. This requires obtaining + a sequence of certificates that support that binding. The procedure + performed to obtain this sequence of certificates is outside the + scope of this specification. + + To meet this goal, the path validation process verifies, among other + things, that a prospective certification path (a sequence of n + certificates) satisfies the following conditions: + + (a) for all x in {1, ..., n-1}, the subject of certificate x is + the issuer of certificate x+1; + + (b) certificate 1 is issued by the trust anchor; + + (c) certificate n is the certificate to be validated; and + + (d) for all x in {1, ..., n}, the certificate was valid at the + time in question. + + When the trust anchor is provided in the form of a self-signed + certificate, this self-signed certificate is not included as part of + the prospective certification path. Information about trust anchors + are provided as inputs to the certification path validation algorithm + (section 6.1.1). + + + + + + +Housley, et. al. Standards Track [Page 64] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + A particular certification path may not, however, be appropriate for + all applications. Therefore, an application MAY augment this + algorithm to further limit the set of valid paths. The path + validation process also determines the set of certificate policies + that are valid for this path, based on the certificate policies + extension, policy mapping extension, policy constraints extension, + and inhibit any-policy extension. To achieve this, the path + validation algorithm constructs a valid policy tree. If the set of + certificate policies that are valid for this path is not empty, then + the result will be a valid policy tree of depth n, otherwise the + result will be a null valid policy tree. + + A certificate is self-issued if the DNs that appear in the subject + and issuer fields are identical and are not empty. In general, the + issuer and subject of the certificates that make up a path are + different for each certificate. However, a CA may issue a + certificate to itself to support key rollover or changes in + certificate policies. These self-issued certificates are not counted + when evaluating path length or name constraints. + + This section presents the algorithm in four basic steps: (1) + initialization, (2) basic certificate processing, (3) preparation for + the next certificate, and (4) wrap-up. Steps (1) and (4) are + performed exactly once. Step (2) is performed for all certificates + in the path. Step (3) is performed for all certificates in the path + except the final certificate. Figure 2 provides a high-level + flowchart of this algorithm. + + + + + + + + + + + + + + + + + + + + + + + + +Housley, et. al. Standards Track [Page 65] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + +-------+ + | START | + +-------+ + | + V + +----------------+ + | Initialization | + +----------------+ + | + +<--------------------+ + | | + V | + +----------------+ | + | Process Cert | | + +----------------+ | + | | + V | + +================+ | + | IF Last Cert | | + | in Path | | + +================+ | + | | | + THEN | | ELSE | + V V | + +----------------+ +----------------+ | + | Wrap up | | Prepare for | | + +----------------+ | Next Cert | | + | +----------------+ | + V | | + +-------+ +--------------+ + | STOP | + +-------+ + + + Figure 2. Certification Path Processing Flowchart + +6.1.1 Inputs + + This algorithm assumes the following seven inputs are provided to the + path processing logic: + + (a) a prospective certification path of length n. + + (b) the current date/time. + + + + + + + +Housley, et. al. Standards Track [Page 66] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + (c) user-initial-policy-set: A set of certificate policy + identifiers naming the policies that are acceptable to the + certificate user. The user-initial-policy-set contains the + special value any-policy if the user is not concerned about + certificate policy. + + (d) trust anchor information, describing a CA that serves as a + trust anchor for the certification path. The trust anchor + information includes: + + (1) the trusted issuer name, + + (2) the trusted public key algorithm, + + (3) the trusted public key, and + + (4) optionally, the trusted public key parameters associated + with the public key. + + The trust anchor information may be provided to the path + processing procedure in the form of a self-signed certificate. + The trusted anchor information is trusted because it was delivered + to the path processing procedure by some trustworthy out-of-band + procedure. If the trusted public key algorithm requires + parameters, then the parameters are provided along with the + trusted public key. + + (e) initial-policy-mapping-inhibit, which indicates if policy + mapping is allowed in the certification path. + + (f) initial-explicit-policy, which indicates if the path must be + valid for at least one of the certificate policies in the user- + initial-policy-set. + + (g) initial-any-policy-inhibit, which indicates whether the + anyPolicy OID should be processed if it is included in a + certificate. + +6.1.2 Initialization + + This initialization phase establishes eleven state variables based + upon the seven inputs: + + (a) valid_policy_tree: A tree of certificate policies with their + optional qualifiers; each of the leaves of the tree represents a + valid policy at this stage in the certification path validation. + If valid policies exist at this stage in the certification path + validation, the depth of the tree is equal to the number of + + + +Housley, et. al. Standards Track [Page 67] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + certificates in the chain that have been processed. If valid + policies do not exist at this stage in the certification path + validation, the tree is set to NULL. Once the tree is set to + NULL, policy processing ceases. + + Each node in the valid_policy_tree includes four data objects: the + valid policy, a set of associated policy qualifiers, a set of one + or more expected policy values, and a criticality indicator. If + the node is at depth x, the components of the node have the + following semantics: + + (1) The valid_policy is a single policy OID representing a + valid policy for the path of length x. + + (2) The qualifier_set is a set of policy qualifiers associated + with the valid policy in certificate x. + + (3) The criticality_indicator indicates whether the + certificate policy extension in certificate x was marked as + critical. + + (4) The expected_policy_set contains one or more policy OIDs + that would satisfy this policy in the certificate x+1. + + The initial value of the valid_policy_tree is a single node with + valid_policy anyPolicy, an empty qualifier_set, an + expected_policy_set with the single value anyPolicy, and a + criticality_indicator of FALSE. This node is considered to be at + depth zero. + + Figure 3 is a graphic representation of the initial state of the + valid_policy_tree. Additional figures will use this format to + describe changes in the valid_policy_tree during path processing. + + +----------------+ + | anyPolicy | <---- valid_policy + +----------------+ + | {} | <---- qualifier_set + +----------------+ + | FALSE | <---- criticality_indicator + +----------------+ + | {anyPolicy} | <---- expected_policy_set + +----------------+ + + Figure 3. Initial value of the valid_policy_tree state variable + + + + + + +Housley, et. al. Standards Track [Page 68] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + (b) permitted_subtrees: A set of root names for each name type + (e.g., X.500 distinguished names, email addresses, or ip + addresses) defining a set of subtrees within which all subject + names in subsequent certificates in the certification path MUST + fall. This variable includes a set for each name type: the + initial value for the set for Distinguished Names is the set of + all Distinguished names; the initial value for the set of RFC822 + names is the set of all RFC822 names, etc. + + (c) excluded_subtrees: A set of root names for each name type + (e.g., X.500 distinguished names, email addresses, or ip + addresses) defining a set of subtrees within which no subject name + in subsequent certificates in the certification path may fall. + This variable includes a set for each name type, and the initial + value for each set is empty. + + (d) explicit_policy: an integer which indicates if a non-NULL + valid_policy_tree is required. The integer indicates the number of + non-self-issued certificates to be processed before this + requirement is imposed. Once set, this variable may be decreased, + but may not be increased. That is, if a certificate in the path + requires a non-NULL valid_policy_tree, a later certificate can not + remove this requirement. If initial-explicit-policy is set, then + the initial value is 0, otherwise the initial value is n+1. + + (e) inhibit_any-policy: an integer which indicates whether the + anyPolicy policy identifier is considered a match. The integer + indicates the number of non-self-issued certificates to be + processed before the anyPolicy OID, if asserted in a certificate, + is ignored. Once set, this variable may be decreased, but may not + be increased. That is, if a certificate in the path inhibits + processing of anyPolicy, a later certificate can not permit it. + If initial-any-policy-inhibit is set, then the initial value is 0, + otherwise the initial value is n+1. + + (f) policy_mapping: an integer which indicates if policy mapping + is permitted. The integer indicates the number of non-self-issued + certificates to be processed before policy mapping is inhibited. + Once set, this variable may be decreased, but may not be + increased. That is, if a certificate in the path specifies policy + mapping is not permitted, it can not be overridden by a later + certificate. If initial-policy-mapping-inhibit is set, then the + initial value is 0, otherwise the initial value is n+1. + + (g) working_public_key_algorithm: the digital signature algorithm + used to verify the signature of a certificate. The + working_public_key_algorithm is initialized from the trusted + public key algorithm provided in the trust anchor information. + + + +Housley, et. al. Standards Track [Page 69] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + (h) working_public_key: the public key used to verify the + signature of a certificate. The working_public_key is initialized + from the trusted public key provided in the trust anchor + information. + + (i) working_public_key_parameters: parameters associated with the + current public key, that may be required to verify a signature + (depending upon the algorithm). The working_public_key_parameters + variable is initialized from the trusted public key parameters + provided in the trust anchor information. + + (j) working_issuer_name: the issuer distinguished name expected + in the next certificate in the chain. The working_issuer_name is + initialized to the trusted issuer provided in the trust anchor + information. + + (k) max_path_length: this integer is initialized to n, is + decremented for each non-self-issued certificate in the path, and + may be reduced to the value in the path length constraint field + within the basic constraints extension of a CA certificate. + + Upon completion of the initialization steps, perform the basic + certificate processing steps specified in 6.1.3. + +6.1.3 Basic Certificate Processing + + The basic path processing actions to be performed for certificate i + (for all i in [1..n]) are listed below. + + (a) Verify the basic certificate information. The certificate + MUST satisfy each of the following: + + (1) The certificate was signed with the + working_public_key_algorithm using the working_public_key and + the working_public_key_parameters. + + (2) The certificate validity period includes the current time. + + (3) At the current time, the certificate is not revoked and is + not on hold status. This may be determined by obtaining the + appropriate CRL (section 6.3), status information, or by out- + of-band mechanisms. + + (4) The certificate issuer name is the working_issuer_name. + + + + + + + +Housley, et. al. Standards Track [Page 70] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + (b) If certificate i is self-issued and it is not the final + certificate in the path, skip this step for certificate i. + Otherwise, verify that the subject name is within one of the + permitted_subtrees for X.500 distinguished names, and verify that + each of the alternative names in the subjectAltName extension + (critical or non-critical) is within one of the permitted_subtrees + for that name type. + + (c) If certificate i is self-issued and it is not the final + certificate in the path, skip this step for certificate i. + Otherwise, verify that the subject name is not within one of the + excluded_subtrees for X.500 distinguished names, and verify that + each of the alternative names in the subjectAltName extension + (critical or non-critical) is not within one of the + excluded_subtrees for that name type. + + (d) If the certificate policies extension is present in the + certificate and the valid_policy_tree is not NULL, process the + policy information by performing the following steps in order: + + (1) For each policy P not equal to anyPolicy in the + certificate policies extension, let P-OID denote the OID in + policy P and P-Q denote the qualifier set for policy P. + Perform the following steps in order: + + (i) If the valid_policy_tree includes a node of depth i-1 + where P-OID is in the expected_policy_set, create a child + node as follows: set the valid_policy to OID-P; set the + qualifier_set to P-Q, and set the expected_policy_set to + {P-OID}. + + For example, consider a valid_policy_tree with a node of + depth i-1 where the expected_policy_set is {Gold, White}. + Assume the certificate policies Gold and Silver appear in + the certificate policies extension of certificate i. The + Gold policy is matched but the Silver policy is not. This + rule will generate a child node of depth i for the Gold + policy. The result is shown as Figure 4. + + + + + + + + + + + + + +Housley, et. al. Standards Track [Page 71] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + +-----------------+ + | Red | + +-----------------+ + | {} | + +-----------------+ node of depth i-1 + | FALSE | + +-----------------+ + | {Gold, White} | + +-----------------+ + | + | + | + V + +-----------------+ + | Gold | + +-----------------+ + | {} | + +-----------------+ node of depth i + | uninitialized | + +-----------------+ + | {Gold} | + +-----------------+ + + Figure 4. Processing an exact match + + (ii) If there was no match in step (i) and the + valid_policy_tree includes a node of depth i-1 with the + valid policy anyPolicy, generate a child node with the + following values: set the valid_policy to P-OID; set the + qualifier_set to P-Q, and set the expected_policy_set to + {P-OID}. + + For example, consider a valid_policy_tree with a node of + depth i-1 where the valid_policy is anyPolicy. Assume the + certificate policies Gold and Silver appear in the + certificate policies extension of certificate i. The Gold + policy does not have a qualifier, but the Silver policy has + the qualifier Q-Silver. If Gold and Silver were not matched + in (i) above, this rule will generate two child nodes of + depth i, one for each policy. The result is shown as Figure + 5. + + + + + + + + + + +Housley, et. al. Standards Track [Page 72] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + +-----------------+ + | anyPolicy | + +-----------------+ + | {} | + +-----------------+ node of depth i-1 + | FALSE | + +-----------------+ + | {anyPolicy} | + +-----------------+ + / \ + / \ + / \ + / \ + +-----------------+ +-----------------+ + | Gold | | Silver | + +-----------------+ +-----------------+ + | {} | | {Q-Silver} | + +-----------------+ nodes of +-----------------+ + | uninitialized | depth i | uninitialized | + +-----------------+ +-----------------+ + | {Gold} | | {Silver} | + +-----------------+ +-----------------+ + + Figure 5. Processing unmatched policies when a leaf node + specifies anyPolicy + + (2) If the certificate policies extension includes the policy + anyPolicy with the qualifier set AP-Q and either (a) + inhibit_any-policy is greater than 0 or (b) i. The + binaries for the certificates and CRLs are available at + . + +C.1 Certificate + + This section contains an annotated hex dump of a 699 byte version 3 + certificate. The certificate contains the following information: + (a) the serial number is 23 (17 hex); + + + +Housley, et. al. Standards Track [Page 115] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + (b) the certificate is signed with DSA and the SHA-1 hash algorithm; + (c) the issuer's distinguished name is OU=NIST; O=gov; C=US + (d) and the subject's distinguished name is OU=NIST; O=gov; C=US + (e) the certificate was issued on June 30, 1997 and will expire on + December 31, 1997; + (f) the certificate contains a 1024 bit DSA public key with + parameters; + (g) the certificate contains a subject key identifier extension + generated using method (1) of section 4.2.1.2; and + (h) the certificate is a CA certificate (as indicated through the + basic constraints extension.) + + 0 30 699: SEQUENCE { + 4 30 635: SEQUENCE { + 8 A0 3: [0] { + 10 02 1: INTEGER 2 + : } + 13 02 1: INTEGER 17 + 16 30 9: SEQUENCE { + 18 06 7: OBJECT IDENTIFIER dsaWithSha1 (1 2 840 10040 4 3) + : } + 27 30 42: SEQUENCE { + 29 31 11: SET { + 31 30 9: SEQUENCE { + 33 06 3: OBJECT IDENTIFIER countryName (2 5 4 6) + 38 13 2: PrintableString 'US' + : } + : } + 42 31 12: SET { + 44 30 10: SEQUENCE { + 46 06 3: OBJECT IDENTIFIER organizationName (2 5 4 10) + 51 13 3: PrintableString 'gov' + : } + : } + 56 31 13: SET { + 58 30 11: SEQUENCE { + 60 06 3: OBJECT IDENTIFIER + : organizationalUnitName (2 5 4 11) + 65 13 4: PrintableString 'NIST' + : } + : } + : } + 71 30 30: SEQUENCE { + 73 17 13: UTCTime '970630000000Z' + 88 17 13: UTCTime '971231000000Z' + : } +103 30 42: SEQUENCE { +105 31 11: SET { + + + +Housley, et. al. Standards Track [Page 116] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + +107 30 9: SEQUENCE { +109 06 3: OBJECT IDENTIFIER countryName (2 5 4 6) +114 13 2: PrintableString 'US' + : } + : } +118 31 12: SET { +120 30 10: SEQUENCE { +122 06 3: OBJECT IDENTIFIER organizationName (2 5 4 10) +127 13 3: PrintableString 'gov' + : } + : } +132 31 13: SET { +134 30 11: SEQUENCE { +136 06 3: OBJECT IDENTIFIER + : organizationalUnitName (2 5 4 11) +141 13 4: PrintableString 'NIST' + : } + : } + : } +147 30 440: SEQUENCE { +151 30 300: SEQUENCE { +155 06 7: OBJECT IDENTIFIER dsa (1 2 840 10040 4 1) +164 30 287: SEQUENCE { +168 02 129: INTEGER + : 00 B6 8B 0F 94 2B 9A CE A5 25 C6 F2 ED FC + : FB 95 32 AC 01 12 33 B9 E0 1C AD 90 9B BC + : 48 54 9E F3 94 77 3C 2C 71 35 55 E6 FE 4F + : 22 CB D5 D8 3E 89 93 33 4D FC BD 4F 41 64 + : 3E A2 98 70 EC 31 B4 50 DE EB F1 98 28 0A + : C9 3E 44 B3 FD 22 97 96 83 D0 18 A3 E3 BD + : 35 5B FF EE A3 21 72 6A 7B 96 DA B9 3F 1E + : 5A 90 AF 24 D6 20 F0 0D 21 A7 D4 02 B9 1A + : FC AC 21 FB 9E 94 9E 4B 42 45 9E 6A B2 48 + : 63 FE 43 +300 02 21: INTEGER + : 00 B2 0D B0 B1 01 DF 0C 66 24 FC 13 92 BA + : 55 F7 7D 57 74 81 E5 +323 02 129: INTEGER + : 00 9A BF 46 B1 F5 3F 44 3D C9 A5 65 FB 91 + : C0 8E 47 F1 0A C3 01 47 C2 44 42 36 A9 92 + : 81 DE 57 C5 E0 68 86 58 00 7B 1F F9 9B 77 + : A1 C5 10 A5 80 91 78 51 51 3C F6 FC FC CC + : 46 C6 81 78 92 84 3D F4 93 3D 0C 38 7E 1A + : 5B 99 4E AB 14 64 F6 0C 21 22 4E 28 08 9C + : 92 B9 66 9F 40 E8 95 F6 D5 31 2A EF 39 A2 + : 62 C7 B2 6D 9E 58 C4 3A A8 11 81 84 6D AF + : F8 B4 19 B4 C2 11 AE D0 22 3B AA 20 7F EE + : 1E 57 18 + + + +Housley, et. al. Standards Track [Page 117] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + : } + : } +455 03 133: BIT STRING 0 unused bits, encapsulates { +459 02 129: INTEGER + : 00 B5 9E 1F 49 04 47 D1 DB F5 3A DD CA 04 + : 75 E8 DD 75 F6 9B 8A B1 97 D6 59 69 82 D3 + : 03 4D FD 3B 36 5F 4A F2 D1 4E C1 07 F5 D1 + : 2A D3 78 77 63 56 EA 96 61 4D 42 0B 7A 1D + : FB AB 91 A4 CE DE EF 77 C8 E5 EF 20 AE A6 + : 28 48 AF BE 69 C3 6A A5 30 F2 C2 B9 D9 82 + : 2B 7D D9 C4 84 1F DE 0D E8 54 D7 1B 99 2E + : B3 D0 88 F6 D6 63 9B A7 E2 0E 82 D4 3B 8A + : 68 1B 06 56 31 59 0B 49 EB 99 A5 D5 81 41 + : 7B C9 55 + : } + : } +591 A3 50: [3] { +593 30 48: SEQUENCE { +595 30 29: SEQUENCE { +597 06 3: OBJECT IDENTIFIER + : subjectKeyIdentifier (2 5 29 14) +602 04 22: OCTET STRING, encapsulates { +604 04 20: OCTET STRING + : 86 CA A5 22 81 62 EF AD 0A 89 BC AD 72 41 + : 2C 29 49 F4 86 56 + : } + : } +626 30 15: SEQUENCE { +628 06 3: OBJECT IDENTIFIER basicConstraints (2 5 29 19) +633 01 1: BOOLEAN TRUE +636 04 5: OCTET STRING, encapsulates { +638 30 3: SEQUENCE { +640 01 1: BOOLEAN TRUE + : } + : } + : } + : } + : } + : } +643 30 9: SEQUENCE { +645 06 7: OBJECT IDENTIFIER dsaWithSha1 (1 2 840 10040 4 3) + : } +654 03 47: BIT STRING 0 unused bits, encapsulates { +657 30 44: SEQUENCE { +659 02 20: INTEGER + : 43 1B CF 29 25 45 C0 4E 52 E7 7D D6 FC B1 + : 66 4C 83 CF 2D 77 +681 02 20: INTEGER + + + +Housley, et. al. Standards Track [Page 118] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + : 0B 5B 9A 24 11 98 E8 F3 86 90 04 F6 08 A9 + : E1 8D A5 CC 3A D4 + : } + : } + : } + +C.2 Certificate + + This section contains an annotated hex dump of a 730 byte version 3 + certificate. The certificate contains the following information: + (a) the serial number is 18 (12 hex); + (b) the certificate is signed with DSA and the SHA-1 hash algorithm; + (c) the issuer's distinguished name is OU=nist; O=gov; C=US + (d) and the subject's distinguished name is CN=Tim Polk; OU=nist; + O=gov; C=US + (e) the certificate was valid from July 30, 1997 through December 1, + 1997; + (f) the certificate contains a 1024 bit DSA public key; + (g) the certificate is an end entity certificate, as the basic + constraints extension is not present; + (h) the certificate contains an authority key identifier extension + matching the subject key identifier of the certificate in Appendix + C.1; and + (i) the certificate includes one alternative name - an RFC 822 + address of "wpolk@nist.gov". + + 0 30 730: SEQUENCE { + 4 30 665: SEQUENCE { + 8 A0 3: [0] { + 10 02 1: INTEGER 2 + : } + 13 02 1: INTEGER 18 + 16 30 9: SEQUENCE { + 18 06 7: OBJECT IDENTIFIER dsaWithSha1 (1 2 840 10040 4 3) + : } + 27 30 42: SEQUENCE { + 29 31 11: SET { + 31 30 9: SEQUENCE { + 33 06 3: OBJECT IDENTIFIER countryName (2 5 4 6) + 38 13 2: PrintableString 'US' + : } + : } + 42 31 12: SET { + 44 30 10: SEQUENCE { + 46 06 3: OBJECT IDENTIFIER organizationName (2 5 4 10) + 51 13 3: PrintableString 'gov' + : } + : } + + + +Housley, et. al. Standards Track [Page 119] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + 56 31 13: SET { + 58 30 11: SEQUENCE { + 60 06 3: OBJECT IDENTIFIER + : organizationalUnitName (2 5 4 11) + 65 13 4: PrintableString 'NIST' + : } + : } + : } + 71 30 30: SEQUENCE { + 73 17 13: UTCTime '970730000000Z' + 88 17 13: UTCTime '971201000000Z' + : } + 103 30 61: SEQUENCE { + 105 31 11: SET { + 107 30 9: SEQUENCE { + 109 06 3: OBJECT IDENTIFIER countryName (2 5 4 6) + 114 13 2: PrintableString 'US' + : } + : } + 118 31 12: SET { + 120 30 10: SEQUENCE { + 122 06 3: OBJECT IDENTIFIER organizationName (2 5 4 10) + 127 13 3: PrintableString 'gov' + : } + : } + 132 31 13: SET { + 134 30 11: SEQUENCE { + 136 06 3: OBJECT IDENTIFIER + : organizationalUnitName (2 5 4 11) + 141 13 4: PrintableString 'NIST' + : } + : } + 147 31 17: SET { + 149 30 15: SEQUENCE { + 151 06 3: OBJECT IDENTIFIER commonName (2 5 4 3) + 156 13 8: PrintableString 'Tim Polk' + : } + : } + : } + 166 30 439: SEQUENCE { + 170 30 300: SEQUENCE { + 174 06 7: OBJECT IDENTIFIER dsa (1 2 840 10040 4 1) + 183 30 287: SEQUENCE { + 187 02 129: INTEGER + : 00 B6 8B 0F 94 2B 9A CE A5 25 C6 F2 ED FC + : FB 95 32 AC 01 12 33 B9 E0 1C AD 90 9B BC + : 48 54 9E F3 94 77 3C 2C 71 35 55 E6 FE 4F + : 22 CB D5 D8 3E 89 93 33 4D FC BD 4F 41 64 + + + +Housley, et. al. Standards Track [Page 120] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + : 3E A2 98 70 EC 31 B4 50 DE EB F1 98 28 0A + : C9 3E 44 B3 FD 22 97 96 83 D0 18 A3 E3 BD + : 35 5B FF EE A3 21 72 6A 7B 96 DA B9 3F 1E + : 5A 90 AF 24 D6 20 F0 0D 21 A7 D4 02 B9 1A + : FC AC 21 FB 9E 94 9E 4B 42 45 9E 6A B2 48 + : 63 FE 43 + 319 02 21: INTEGER + : 00 B2 0D B0 B1 01 DF 0C 66 24 FC 13 92 BA + : 55 F7 7D 57 74 81 E5 + 342 02 129: INTEGER + : 00 9A BF 46 B1 F5 3F 44 3D C9 A5 65 FB 91 + : C0 8E 47 F1 0A C3 01 47 C2 44 42 36 A9 92 + : 81 DE 57 C5 E0 68 86 58 00 7B 1F F9 9B 77 + : A1 C5 10 A5 80 91 78 51 51 3C F6 FC FC CC + : 46 C6 81 78 92 84 3D F4 93 3D 0C 38 7E 1A + : 5B 99 4E AB 14 64 F6 0C 21 22 4E 28 08 9C + : 92 B9 66 9F 40 E8 95 F6 D5 31 2A EF 39 A2 + : 62 C7 B2 6D 9E 58 C4 3A A8 11 81 84 6D AF + : F8 B4 19 B4 C2 11 AE D0 22 3B AA 20 7F EE + : 1E 57 18 + : } + : } + 474 03 132: BIT STRING 0 unused bits, encapsulates { + 478 02 128: INTEGER + : 30 B6 75 F7 7C 20 31 AE 38 BB 7E 0D 2B AB + : A0 9C 4B DF 20 D5 24 13 3C CD 98 E5 5F 6C + : B7 C1 BA 4A BA A9 95 80 53 F0 0D 72 DC 33 + : 37 F4 01 0B F5 04 1F 9D 2E 1F 62 D8 84 3A + : 9B 25 09 5A 2D C8 46 8E 2B D4 F5 0D 3B C7 + : 2D C6 6C B9 98 C1 25 3A 44 4E 8E CA 95 61 + : 35 7C CE 15 31 5C 23 13 1E A2 05 D1 7A 24 + : 1C CB D3 72 09 90 FF 9B 9D 28 C0 A1 0A EC + : 46 9F 0D B8 D0 DC D0 18 A6 2B 5E F9 8F B5 + : 95 BE + : } + : } + 609 A3 62: [3] { + 611 30 60: SEQUENCE { + 613 30 25: SEQUENCE { + 615 06 3: OBJECT IDENTIFIER subjectAltName (2 5 29 17) + 620 04 18: OCTET STRING, encapsulates { + 622 30 16: SEQUENCE { + 624 81 14: [1] 'wpolk@nist.gov' + : } + : } + : } + 640 30 31: SEQUENCE { + 642 06 3: OBJECT IDENTIFIER + + + +Housley, et. al. Standards Track [Page 121] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + : authorityKeyIdentifier (2 5 29 35) + 647 04 24: OCTET STRING, encapsulates { + 649 30 22: SEQUENCE { + 651 80 20: [0] + : 86 CA A5 22 81 62 EF AD 0A 89 BC AD 72 + : 41 2C 29 49 F4 86 56 + : } + : } + : } + : } + : } + : } + 673 30 9: SEQUENCE { + 675 06 7: OBJECT IDENTIFIER dsaWithSha1 (1 2 840 10040 4 3) + : } + 684 03 48: BIT STRING 0 unused bits, encapsulates { + 687 30 45: SEQUENCE { + 689 02 20: INTEGER + : 36 97 CB E3 B4 2C E1 BB 61 A9 D3 CC 24 CC + : 22 92 9F F4 F5 87 + 711 02 21: INTEGER + : 00 AB C9 79 AF D2 16 1C A9 E3 68 A9 14 10 + : B4 A0 2E FF 22 5A 73 + : } + : } + : } + +C.3 End Entity Certificate Using RSA + + This section contains an annotated hex dump of a 654 byte version 3 + certificate. The certificate contains the following information: + (a) the serial number is 256; + (b) the certificate is signed with RSA and the SHA-1 hash algorithm; + (c) the issuer's distinguished name is OU=NIST; O=gov; C=US + (d) and the subject's distinguished name is CN=Tim Polk; OU=NIST; + O=gov; C=US + (e) the certificate was issued on May 21, 1996 at 09:58:26 and + expired on May 21, 1997 at 09:58:26; + (f) the certificate contains a 1024 bit RSA public key; + (g) the certificate is an end entity certificate (not a CA + certificate); + (h) the certificate includes an alternative subject name of + "" and an + alternative issuer name of "" - both are URLs; + (i) the certificate include an authority key identifier extension + and a certificate policies extension specifying the policy OID + 2.16.840.1.101.3.2.1.48.9; and + + + + +Housley, et. al. Standards Track [Page 122] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + (j) the certificate includes a critical key usage extension + specifying that the public key is intended for verification of + digital signatures. + + 0 30 654: SEQUENCE { + 4 30 503: SEQUENCE { + 8 A0 3: [0] { + 10 02 1: INTEGER 2 + : } + 13 02 2: INTEGER 256 + 17 30 13: SEQUENCE { + 19 06 9: OBJECT IDENTIFIER + : sha1withRSAEncryption (1 2 840 113549 1 1 5) + 30 05 0: NULL + : } + 32 30 42: SEQUENCE { + 34 31 11: SET { + 36 30 9: SEQUENCE { + 38 06 3: OBJECT IDENTIFIER countryName (2 5 4 6) + 43 13 2: PrintableString 'US' + : } + : } + 47 31 12: SET { + 49 30 10: SEQUENCE { + 51 06 3: OBJECT IDENTIFIER organizationName (2 5 4 10) + 56 13 3: PrintableString 'gov' + : } + : } + 61 31 13: SET { + 63 30 11: SEQUENCE { + 65 06 3: OBJECT IDENTIFIER + : organizationalUnitName (2 5 4 11) + 70 13 4: PrintableString 'NIST' + : } + : } + : } + 76 30 30: SEQUENCE { + 78 17 13: UTCTime '960521095826Z' + 93 17 13: UTCTime '970521095826Z' + : } +108 30 61: SEQUENCE { +110 31 11: SET { +112 30 9: SEQUENCE { +114 06 3: OBJECT IDENTIFIER countryName (2 5 4 6) +119 13 2: PrintableString 'US' + : } + : } +123 31 12: SET { + + + +Housley, et. al. Standards Track [Page 123] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + +125 30 10: SEQUENCE { +127 06 3: OBJECT IDENTIFIER organizationName (2 5 4 10) +132 13 3: PrintableString 'gov' + : } + : } +137 31 13: SET { +139 30 11: SEQUENCE { +141 06 3: OBJECT IDENTIFIER + : organizationalUnitName (2 5 4 11) +146 13 4: PrintableString 'NIST' + : } + : } +152 31 17: SET { +154 30 15: SEQUENCE { +156 06 3: OBJECT IDENTIFIER commonName (2 5 4 3) +161 13 8: PrintableString 'Tim Polk' + : } + : } + : } +171 30 159: SEQUENCE { +174 30 13: SEQUENCE { +176 06 9: OBJECT IDENTIFIER + : rsaEncryption (1 2 840 113549 1 1 1) +187 05 0: NULL + : } +189 03 141: BIT STRING 0 unused bits, encapsulates { +193 30 137: SEQUENCE { +196 02 129: INTEGER + : 00 E1 6A E4 03 30 97 02 3C F4 10 F3 B5 1E + : 4D 7F 14 7B F6 F5 D0 78 E9 A4 8A F0 A3 75 + : EC ED B6 56 96 7F 88 99 85 9A F2 3E 68 77 + : 87 EB 9E D1 9F C0 B4 17 DC AB 89 23 A4 1D + : 7E 16 23 4C 4F A8 4D F5 31 B8 7C AA E3 1A + : 49 09 F4 4B 26 DB 27 67 30 82 12 01 4A E9 + : 1A B6 C1 0C 53 8B 6C FC 2F 7A 43 EC 33 36 + : 7E 32 B2 7B D5 AA CF 01 14 C6 12 EC 13 F2 + : 2D 14 7A 8B 21 58 14 13 4C 46 A3 9A F2 16 + : 95 FF 23 +328 02 3: INTEGER 65537 + : } + : } + : } +333 A3 175: [3] { +336 30 172: SEQUENCE { +339 30 63: SEQUENCE { +341 06 3: OBJECT IDENTIFIER subjectAltName (2 5 29 17) +346 04 56: OCTET STRING, encapsulates { +348 30 54: SEQUENCE { + + + +Housley, et. al. Standards Track [Page 124] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + +350 86 52: [6] + : 'http://www.itl.nist.gov/div893/staff/' + : 'polk/index.html' + : } + : } + : } +404 30 31: SEQUENCE { +406 06 3: OBJECT IDENTIFIER issuerAltName (2 5 29 18) +411 04 24: OCTET STRING, encapsulates { +413 30 22: SEQUENCE { +415 86 20: [6] 'http://www.nist.gov/' + : } + : } + : } +437 30 31: SEQUENCE { +439 06 3: OBJECT IDENTIFIER + : authorityKeyIdentifier (2 5 29 35) +444 04 24: OCTET STRING, encapsulates { +446 30 22: SEQUENCE { +448 80 20: [0] + : 08 68 AF 85 33 C8 39 4A 7A F8 82 93 8E + : 70 6A 4A 20 84 2C 32 + : } + : } + : } +470 30 23: SEQUENCE { +472 06 3: OBJECT IDENTIFIER + : certificatePolicies (2 5 29 32) +477 04 16: OCTET STRING, encapsulates { +479 30 14: SEQUENCE { +481 30 12: SEQUENCE { +483 06 10: OBJECT IDENTIFIER + : '2 16 840 1 101 3 2 1 48 9' + : } + : } + : } + : } +495 30 14: SEQUENCE { +497 06 3: OBJECT IDENTIFIER keyUsage (2 5 29 15) +502 01 1: BOOLEAN TRUE +505 04 4: OCTET STRING, encapsulates { +507 03 2: BIT STRING 7 unused bits + : '1'B (bit 0) + : } + : } + : } + : } + : } + + + +Housley, et. al. Standards Track [Page 125] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + +511 30 13: SEQUENCE { +513 06 9: OBJECT IDENTIFIER + : sha1withRSAEncryption (1 2 840 113549 1 1 5) +524 05 0: NULL + : } +526 03 129: BIT STRING 0 unused bits + : 1E 07 77 6E 66 B5 B6 B8 57 F0 03 DC 6F 77 + : 6D AF 55 1D 74 E5 CE 36 81 FC 4B C5 F4 47 + : 82 C4 0A 25 AA 8D D6 7D 3A 89 AB 44 34 39 + : F6 BD 61 1A 78 85 7A B8 1E 92 A2 22 2F CE + : 07 1A 08 8E F1 46 03 59 36 4A CB 60 E6 03 + : 40 01 5B 2A 44 D6 E4 7F EB 43 5E 74 0A E6 + : E4 F9 3E E1 44 BE 1F E7 5F 5B 2C 41 8D 08 + : BD 26 FE 6A A6 C3 2F B2 3B 41 12 6B C1 06 + : 8A B8 4C 91 59 EB 2F 38 20 2A 67 74 20 0B + : 77 F3 + : } + +C.4 Certificate Revocation List + + This section contains an annotated hex dump of a version 2 CRL with + one extension (cRLNumber). The CRL was issued by OU=NIST; O=gov; + C=US on August 7, 1997; the next scheduled issuance was September 7, + 1997. The CRL includes one revoked certificates: serial number 18 + (12 hex), which was revoked on July 31, 1997 due to keyCompromise. + The CRL itself is number 18, and it was signed with DSA and SHA-1. + + 0 30 203: SEQUENCE { + 3 30 140: SEQUENCE { + 6 02 1: INTEGER 1 + 9 30 9: SEQUENCE { + 11 06 7: OBJECT IDENTIFIER dsaWithSha1 (1 2 840 10040 4 3) + : } + 20 30 42: SEQUENCE { + 22 31 11: SET { + 24 30 9: SEQUENCE { + 26 06 3: OBJECT IDENTIFIER countryName (2 5 4 6) + 31 13 2: PrintableString 'US' + : } + : } + 35 31 12: SET { + 37 30 10: SEQUENCE { + 39 06 3: OBJECT IDENTIFIER organizationName (2 5 4 10) + 44 13 3: PrintableString 'gov' + : } + : } + 49 31 13: SET { + 51 30 11: SEQUENCE { + + + +Housley, et. al. Standards Track [Page 126] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + + 53 06 3: OBJECT IDENTIFIER + : organizationalUnitName (2 5 4 11) + 58 13 4: PrintableString 'NIST' + : } + : } + : } + 64 17 13: UTCTime '970807000000Z' + 79 17 13: UTCTime '970907000000Z' + 94 30 34: SEQUENCE { + 96 30 32: SEQUENCE { + 98 02 1: INTEGER 18 +101 17 13: UTCTime '970731000000Z' +116 30 12: SEQUENCE { +118 30 10: SEQUENCE { +120 06 3: OBJECT IDENTIFIER cRLReason (2 5 29 21) +125 04 3: OCTET STRING, encapsulates { +127 0A 1: ENUMERATED 1 + : } + : } + : } + : } + : } +130 A0 14: [0] { +132 30 12: SEQUENCE { +134 30 10: SEQUENCE { +136 06 3: OBJECT IDENTIFIER cRLNumber (2 5 29 20) +141 04 3: OCTET STRING, encapsulates { +143 02 1: INTEGER 12 + : } + : } + : } + : } + : } +146 30 9: SEQUENCE { +148 06 7: OBJECT IDENTIFIER dsaWithSha1 (1 2 840 10040 4 3) + : } +157 03 47: BIT STRING 0 unused bits, encapsulates { +160 30 44: SEQUENCE { +162 02 20: INTEGER + : 22 4E 9F 43 BA 95 06 34 F2 BB 5E 65 DB A6 + : 80 05 C0 3A 29 47 +184 02 20: INTEGER + : 59 1A 57 C9 82 D7 02 21 14 C3 D4 0B 32 1B + : 96 16 B1 1F 46 5A + : } + : } + : } + + + + +Housley, et. al. Standards Track [Page 127] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + +Author Addresses + + Russell Housley + RSA Laboratories + 918 Spring Knoll Drive + Herndon, VA 20170 + USA + + EMail: rhousley@rsasecurity.com + + Warwick Ford + VeriSign, Inc. + 401 Edgewater Place + Wakefield, MA 01880 + USA + + EMail: wford@verisign.com + + Tim Polk + NIST + Building 820, Room 426 + Gaithersburg, MD 20899 + USA + + EMail: wpolk@nist.gov + + David Solo + Citigroup + 909 Third Ave, 16th Floor + New York, NY 10043 + USA + + EMail: dsolo@alum.mit.edu + + + + + + + + + + + + + + + + + + +Housley, et. al. Standards Track [Page 128] + +RFC 3280 Internet X.509 Public Key Infrastructure April 2002 + + +Full Copyright Statement + + Copyright (C) The Internet Society (2002). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + +Housley, et. al. Standards Track [Page 129] + From b6e055bb9731fb4003718f8834133a246eeaf0e0 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 7 Sep 2004 06:39:12 +0000 Subject: [PATCH 0280/1469] different string to compile PKIX git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@280 59561ff5-6e30-0410-9f3c-9617f08c8826 --- README | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README b/README index d9a958599..9face0775 100644 --- a/README +++ b/README @@ -27,9 +27,10 @@ specified: asn1c ... The ./examples directory contains several ASN.1 modules and a script to -extract ASN.1 modules from RFC documents. To compile X.509 PKI module: +extract ASN.1 modules from RFC documents. Refer to the README file in that +directory. To compile X.509 PKI module: - ./asn1c/asn1c -P ./examples/*PKIX*93*.asn1 + ./asn1c/asn1c -P ./examples/rfc3280-*.asn1 In this example, -P option is used to instruct the compiler to print the compiled text on the standard output instead of creating multiple .c From 8ef1985055e50a0e98472ed711a36c1d90eb5833 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 7 Sep 2004 06:42:40 +0000 Subject: [PATCH 0281/1469] faq updated about rfc3280 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@281 59561ff5-6e30-0410-9f3c-9617f08c8826 --- FAQ | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/FAQ b/FAQ index d654f3f79..c6a945917 100644 --- a/FAQ +++ b/FAQ @@ -16,8 +16,8 @@ A: Q: I've tried doing ./asn1c/asn1c -P examples/*PKIX*93*, but compiler spits several fatal failures and exits. A: - The PKIX1 specifications uses ASN.1 Information Object Classes, - which is arguably one of the most complex ASN.1 concepts. + The old (RFC2459) PKIX1 specifications used ASN.1 Information Object + Classes, which is arguably one of the most complex ASN.1 concepts. The asn1c parser and fixer subsystems currently understand most of IOC syntax, but the compiler can cope with only the very basic @@ -28,9 +28,11 @@ A: but this milestone isn't yet reached. Please contact me in case you have special requirements, we can work it out. - P.S. Parser and fixer are now able to grok PKIX1, try this out: + However, the asn1c compiler is able to understand the newer PKIX1 + ASN.1 specs, contained in RFC3280, which obsole RFC2459. + Try this one out: - ./asn1c/asn1c -E -F examples/*PKIX*93* + ./asn1c/asn1c -P examples/rfc3280-*.asn1 -- Lev Walkin From 6bfdc3f82da5156f2a9db197b9ec1099b062c123 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 7 Sep 2004 06:43:05 +0000 Subject: [PATCH 0282/1469] added clause about DEFAULT git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@282 59561ff5-6e30-0410-9f3c-9617f08c8826 --- TODO | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/TODO b/TODO index 09fc914d0..6d7b11ad6 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,7 @@ MAJOR: 1. Support for PER encoding. Requires advanced subtype constraints support, -which is just completed. +which is already completed. 2. Support for XER encoding. @@ -12,4 +12,5 @@ which is just completed. MINOR: -1. Support for EXTERNAL, EMBEDDED-PDV and CHARACTER STRING types. +1. Support for DEFAULT encoding and decoding, at least in INTEGER/ENUMERATED types. +2. Support for EXTERNAL, EMBEDDED-PDV and CHARACTER STRING types. From 34ce8ade5181d0ca9ab049765ef5bcd3309d9418 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 7 Sep 2004 06:43:57 +0000 Subject: [PATCH 0283/1469] faster way to check for sign git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@283 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/50-constraint-OK.asn1.-P | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tests/50-constraint-OK.asn1.-P b/tests/50-constraint-OK.asn1.-P index 591ce0f90..27c013bbc 100644 --- a/tests/50-constraint-OK.asn1.-P +++ b/tests/50-constraint-OK.asn1.-P @@ -133,12 +133,8 @@ Int2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return -1; } - if(asn1_INTEGER2long(st, &value)) { - _ASN_ERRLOG(app_errlog, app_key, - "%s: value too large (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } + /* Check if the sign bit is present */ + value = st->buf ? ((st->buf[0] & 0x80) ? -1 : 1) : 0; if((value >= 0)) { /* Constraint check succeeded */ From 1dc848e88560829966355dfc28d5f3c7e2cf6310 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 7 Sep 2004 06:44:29 +0000 Subject: [PATCH 0284/1469] result of -fall-defs-global git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@284 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/19-param-OK.asn1.-P | 1 + tests/31-set-of-OK.asn1.-P | 3 +++ tests/39-sequence-of-OK.asn1.-P | 1 + tests/42-real-life-OK.asn1.-PR | 6 ++++++ tests/44-choice-in-sequence-OK.asn1.-P | 3 +++ 5 files changed, 14 insertions(+) diff --git a/tests/19-param-OK.asn1.-P b/tests/19-param-OK.asn1.-P index c69a75bfe..5f31e8236 100644 --- a/tests/19-param-OK.asn1.-P +++ b/tests/19-param-OK.asn1.-P @@ -105,6 +105,7 @@ static asn1_SEQUENCE_specifics_t asn1_DEF_toBeSigned_specs = { -1, /* Start extensions */ -1 /* Stop extensions */ }; +static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_toBeSigned = { "toBeSigned", SEQUENCE_constraint, diff --git a/tests/31-set-of-OK.asn1.-P b/tests/31-set-of-OK.asn1.-P index 0178f298d..be7e123e9 100644 --- a/tests/31-set-of-OK.asn1.-P +++ b/tests/31-set-of-OK.asn1.-P @@ -201,6 +201,7 @@ static asn1_SET_OF_specifics_t asn1_DEF_trees_specs = { sizeof(struct trees), offsetof(struct trees, _ber_dec_ctx), }; +static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_trees = { "trees", SET_OF_constraint, @@ -242,6 +243,7 @@ static asn1_SEQUENCE_specifics_t asn1_DEF_anything_member_specs = { 0, /* Start extensions */ 2 /* Stop extensions */ }; +static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_anything_member = { "", SEQUENCE_constraint, @@ -276,6 +278,7 @@ static asn1_SET_OF_specifics_t asn1_DEF_anything_specs = { sizeof(struct anything), offsetof(struct anything, _ber_dec_ctx), }; +static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_anything = { "anything", SET_OF_constraint, diff --git a/tests/39-sequence-of-OK.asn1.-P b/tests/39-sequence-of-OK.asn1.-P index 6a8553b9a..9a49a798e 100644 --- a/tests/39-sequence-of-OK.asn1.-P +++ b/tests/39-sequence-of-OK.asn1.-P @@ -45,6 +45,7 @@ static asn1_SET_OF_specifics_t asn1_DEF_collection_specs = { sizeof(struct collection), offsetof(struct collection, _ber_dec_ctx), }; +static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_collection = { "collection", SEQUENCE_OF_constraint, diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index d4da365aa..04ee81ad2 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -81,6 +81,7 @@ static asn1_SET_OF_specifics_t asn1_DEF_varsets_specs = { sizeof(struct varsets), offsetof(struct varsets, _ber_dec_ctx), }; +static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_varsets = { "varsets", SEQUENCE_OF_constraint, @@ -222,6 +223,7 @@ static asn1_SET_OF_specifics_t asn1_DEF_vparts_specs = { sizeof(struct vparts), offsetof(struct vparts, _ber_dec_ctx), }; +static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_vparts = { "vparts", SEQUENCE_OF_constraint, @@ -391,6 +393,7 @@ static asn1_SET_OF_specifics_t asn1_DEF_vset_specs = { sizeof(struct vset), offsetof(struct vset, _ber_dec_ctx), }; +static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_vset = { "vset", SET_OF_constraint, @@ -440,6 +443,7 @@ static asn1_SEQUENCE_specifics_t asn1_DEF_vrange_specs = { 1, /* Start extensions */ 3 /* Stop extensions */ }; +static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_vrange = { "vrange", SEQUENCE_constraint, @@ -574,6 +578,7 @@ static asn1_SET_OF_specifics_t asn1_DEF_email_specs = { sizeof(struct email), offsetof(struct email, _ber_dec_ctx), }; +static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_email = { "email", SET_OF_constraint, @@ -623,6 +628,7 @@ static asn1_SEQUENCE_specifics_t asn1_DEF_notify_specs = { 1, /* Start extensions */ 3 /* Stop extensions */ }; +static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_notify = { "notify", SEQUENCE_constraint, diff --git a/tests/44-choice-in-sequence-OK.asn1.-P b/tests/44-choice-in-sequence-OK.asn1.-P index 1d7c1901f..b4d9c719c 100644 --- a/tests/44-choice-in-sequence-OK.asn1.-P +++ b/tests/44-choice-in-sequence-OK.asn1.-P @@ -97,6 +97,7 @@ static asn1_CHOICE_specifics_t asn1_DEF_e_specs = { 2, /* Count of tags in the map */ 0 /* Whether extensible */ }; +static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_e = { "e", CHOICE_constraint, @@ -143,6 +144,7 @@ static asn1_CHOICE_specifics_t asn1_DEF_h_specs = { 2, /* Count of tags in the map */ 0 /* Whether extensible */ }; +static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_h = { "h", CHOICE_constraint, @@ -206,6 +208,7 @@ static asn1_CHOICE_specifics_t asn1_DEF_b_specs = { 5, /* Count of tags in the map */ 0 /* Whether extensible */ }; +static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_b = { "b", CHOICE_constraint, From 4b7650f078a46db96bac81248f7c5f95b5cd8ad0 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 7 Sep 2004 06:44:55 +0000 Subject: [PATCH 0285/1469] automakefied git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@285 59561ff5-6e30-0410-9f3c-9617f08c8826 --- Makefile.in | 2 - asn1c/Makefile.in | 2 - asn1c/tests/Makefile.in | 4 +- doc/Makefile.in | 2 - libasn1compiler/Makefile.in | 139 +++++------------------------------- libasn1fix/Makefile.in | 2 - libasn1parser/Makefile.in | 2 - libasn1print/Makefile.in | 2 - skeletons/Makefile.in | 2 - skeletons/asn_types.h | 2 +- skeletons/tests/Makefile.in | 2 - tests/Makefile.in | 2 - 12 files changed, 21 insertions(+), 142 deletions(-) diff --git a/Makefile.in b/Makefile.in index cce912731..a7cea99a0 100644 --- a/Makefile.in +++ b/Makefile.in @@ -33,9 +33,7 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = @build@ host_triplet = @host@ -target_triplet = @target@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ diff --git a/asn1c/Makefile.in b/asn1c/Makefile.in index 244f501e8..44d20fd16 100644 --- a/asn1c/Makefile.in +++ b/asn1c/Makefile.in @@ -36,9 +36,7 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = @build@ host_triplet = @host@ -target_triplet = @target@ bin_PROGRAMS = asn1c$(EXEEXT) subdir = asn1c DIST_COMMON = README $(dist_man1_MANS) $(srcdir)/Makefile.am \ diff --git a/asn1c/tests/Makefile.in b/asn1c/tests/Makefile.in index b60721abe..2105fb9eb 100644 --- a/asn1c/tests/Makefile.in +++ b/asn1c/tests/Makefile.in @@ -33,9 +33,7 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = @build@ host_triplet = @host@ -target_triplet = @target@ subdir = asn1c/tests DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -163,7 +161,7 @@ check_SCRIPTS = check-assembly.sh TESTS_ENVIRONMENT = CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" ./check-assembly.sh @CPLUSPLUS_FOUND_FALSE@TESTS = check-*.c @CPLUSPLUS_FOUND_TRUE@TESTS = check-*.c check-*.cc ## Include C++ test filed (.cc) -EXTRA_DIST = ${check_SCRIPTS} check-*.c* +EXTRA_DIST = $(check_SCRIPTS) check-*.c* all: all-am .SUFFIXES: diff --git a/doc/Makefile.in b/doc/Makefile.in index 93105837c..c19ee0c79 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -34,9 +34,7 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = @build@ host_triplet = @host@ -target_triplet = @target@ subdir = doc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 diff --git a/libasn1compiler/Makefile.in b/libasn1compiler/Makefile.in index b427be97c..73403835f 100644 --- a/libasn1compiler/Makefile.in +++ b/libasn1compiler/Makefile.in @@ -14,7 +14,7 @@ @SET_MAKE@ -SOURCES = $(libasn1compiler_la_SOURCES) check_compiler.c +SOURCES = $(libasn1compiler_la_SOURCES) srcdir = @srcdir@ top_srcdir = @top_srcdir@ @@ -36,10 +36,7 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = @build@ host_triplet = @host@ -target_triplet = @target@ -check_PROGRAMS = check_compiler$(EXEEXT) subdir = libasn1compiler DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -55,12 +52,6 @@ am_libasn1compiler_la_OBJECTS = asn1compiler.lo asn1c_misc.lo \ asn1c_out.lo asn1c_lang.lo asn1c_save.lo asn1c_C.lo \ asn1c_constraint.lo asn1c_compat.lo asn1c_fdeps.lo libasn1compiler_la_OBJECTS = $(am_libasn1compiler_la_OBJECTS) -check_compiler_SOURCES = check_compiler.c -check_compiler_OBJECTS = check_compiler.$(OBJEXT) -am__DEPENDENCIES_1 = libasn1compiler.la -check_compiler_DEPENDENCIES = $(am__DEPENDENCIES_1) \ - $(top_builddir)/libasn1parser/libasn1parser.la \ - $(top_builddir)/libasn1fix/libasn1fix.la DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @@ -72,8 +63,7 @@ am__depfiles_maybe = depfiles @AMDEP_TRUE@ ./$(DEPDIR)/asn1c_misc.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/asn1c_out.Plo \ @AMDEP_TRUE@ ./$(DEPDIR)/asn1c_save.Plo \ -@AMDEP_TRUE@ ./$(DEPDIR)/asn1compiler.Plo \ -@AMDEP_TRUE@ ./$(DEPDIR)/check_compiler.Po +@AMDEP_TRUE@ ./$(DEPDIR)/asn1compiler.Plo COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ @@ -82,8 +72,8 @@ LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ CCLD = $(CC) LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(libasn1compiler_la_SOURCES) check_compiler.c -DIST_SOURCES = $(libasn1compiler_la_SOURCES) check_compiler.c +SOURCES = $(libasn1compiler_la_SOURCES) +DIST_SOURCES = $(libasn1compiler_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -198,8 +188,8 @@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ AM_CPPFLAGS = \ - -I${top_srcdir}/libasn1parser \ - -I${top_srcdir}/libasn1fix + -I$(top_srcdir)/libasn1parser \ + -I$(top_srcdir)/libasn1fix noinst_LTLIBRARIES = libasn1compiler.la libasn1compiler_la_LDFLAGS = -all-static @@ -215,11 +205,6 @@ libasn1compiler_la_SOURCES = \ asn1c_fdeps.c asn1c_fdeps.h \ asn1c_internal.h -TESTS = $(check_PROGRAMS) -check_compiler_LDADD = $(noinst_LTLIBRARIES) \ - $(top_builddir)/libasn1parser/libasn1parser.la \ - $(top_builddir)/libasn1fix/libasn1fix.la - all: all-am .SUFFIXES: @@ -265,16 +250,6 @@ clean-noinstLTLIBRARIES: libasn1compiler.la: $(libasn1compiler_la_OBJECTS) $(libasn1compiler_la_DEPENDENCIES) $(LINK) $(libasn1compiler_la_LDFLAGS) $(libasn1compiler_la_OBJECTS) $(libasn1compiler_la_LIBADD) $(LIBS) -clean-checkPROGRAMS: - @list='$(check_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done -check_compiler$(EXEEXT): $(check_compiler_OBJECTS) $(check_compiler_DEPENDENCIES) - @rm -f check_compiler$(EXEEXT) - $(LINK) $(check_compiler_LDFLAGS) $(check_compiler_OBJECTS) $(check_compiler_LDADD) $(LIBS) - mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -290,7 +265,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c_out.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c_save.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1compiler.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_compiler.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @@ -374,79 +348,6 @@ GTAGS: distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; skip=0; \ - srcdir=$(srcdir); export srcdir; \ - list='$(TESTS)'; \ - if test -n "$$list"; then \ - for tst in $$list; do \ - if test -f ./$$tst; then dir=./; \ - elif test -f $$tst; then dir=; \ - else dir="$(srcdir)/"; fi; \ - if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *" $$tst "*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - echo "XPASS: $$tst"; \ - ;; \ - *) \ - echo "PASS: $$tst"; \ - ;; \ - esac; \ - elif test $$? -ne 77; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *" $$tst "*) \ - xfail=`expr $$xfail + 1`; \ - echo "XFAIL: $$tst"; \ - ;; \ - *) \ - failed=`expr $$failed + 1`; \ - echo "FAIL: $$tst"; \ - ;; \ - esac; \ - else \ - skip=`expr $$skip + 1`; \ - echo "SKIP: $$tst"; \ - fi; \ - done; \ - if test "$$failed" -eq 0; then \ - if test "$$xfail" -eq 0; then \ - banner="All $$all tests passed"; \ - else \ - banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ - fi; \ - else \ - if test "$$xpass" -eq 0; then \ - banner="$$failed of $$all tests failed"; \ - else \ - banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ - fi; \ - fi; \ - dashes="$$banner"; \ - skipped=""; \ - if test "$$skip" -ne 0; then \ - skipped="($$skip tests were not run)"; \ - test `echo "$$skipped" | wc -c` -gt `echo "$$banner" | wc -c` && \ - dashes="$$skipped"; \ - fi; \ - report=""; \ - if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ - report="Please report to $(PACKAGE_BUGREPORT)"; \ - test `echo "$$report" | wc -c` -gt `echo "$$banner" | wc -c` && \ - dashes="$$report"; \ - fi; \ - dashes=`echo "$$dashes" | sed s/./=/g`; \ - echo "$$dashes"; \ - echo "$$banner"; \ - test -n "$$skipped" && echo "$$skipped"; \ - test -n "$$report" && echo "$$report"; \ - echo "$$dashes"; \ - test "$$failed" -eq 0; \ - else :; fi - distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ @@ -475,8 +376,6 @@ distdir: $(DISTFILES) fi; \ done check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) - $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: @@ -506,8 +405,8 @@ maintainer-clean-generic: @echo "it deletes files that may require special tools to rebuild." clean: clean-am -clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ - clean-noinstLTLIBRARIES mostlyclean-am +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) @@ -555,17 +454,17 @@ ps-am: uninstall-am: uninstall-info-am -.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ - clean-checkPROGRAMS clean-generic clean-libtool \ - clean-noinstLTLIBRARIES ctags distclean distclean-compile \ - distclean-generic distclean-libtool distclean-tags distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-exec install-exec-am \ - install-info install-info-am install-man install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags uninstall uninstall-am uninstall-info-am +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/libasn1fix/Makefile.in b/libasn1fix/Makefile.in index 3224cd8be..24a1b21fe 100644 --- a/libasn1fix/Makefile.in +++ b/libasn1fix/Makefile.in @@ -36,9 +36,7 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = @build@ host_triplet = @host@ -target_triplet = @target@ check_PROGRAMS = check_fixer$(EXEEXT) subdir = libasn1fix DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index 3afcae702..812ef45da 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -36,9 +36,7 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = @build@ host_triplet = @host@ -target_triplet = @target@ subdir = libasn1parser DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in asn1p_l.c \ asn1p_y.c asn1p_y.h diff --git a/libasn1print/Makefile.in b/libasn1print/Makefile.in index fce602b45..487d9dca0 100644 --- a/libasn1print/Makefile.in +++ b/libasn1print/Makefile.in @@ -36,9 +36,7 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = @build@ host_triplet = @host@ -target_triplet = @target@ subdir = libasn1print DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 diff --git a/skeletons/Makefile.in b/skeletons/Makefile.in index ed4c177a6..9216769ba 100644 --- a/skeletons/Makefile.in +++ b/skeletons/Makefile.in @@ -34,9 +34,7 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = @build@ host_triplet = @host@ -target_triplet = @target@ subdir = skeletons DIST_COMMON = README $(dist_pkgdata_DATA) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in diff --git a/skeletons/asn_types.h b/skeletons/asn_types.h index a8bfb6d49..fa78f38b7 100644 --- a/skeletons/asn_types.h +++ b/skeletons/asn_types.h @@ -15,7 +15,7 @@ #include /* For va_start */ #include /* for offsetof and ptrdiff_t */ #ifndef WIN32 -#include /* C99 Standard specifies this file, for uintXX_t */ +#include /* C99 Standard specifies this file, for uintXX_t */ #else typedef unsigned char uint8_t; typedef unsigned short int uint16_t; diff --git a/skeletons/tests/Makefile.in b/skeletons/tests/Makefile.in index 82dc62513..2f84112c2 100644 --- a/skeletons/tests/Makefile.in +++ b/skeletons/tests/Makefile.in @@ -35,9 +35,7 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = @build@ host_triplet = @host@ -target_triplet = @target@ check_PROGRAMS = check-ber_tlv_tag$(EXEEXT) check-length$(EXEEXT) \ check-OIDs$(EXEEXT) check-GeneralizedTime$(EXEEXT) \ check-UTCTime$(EXEEXT) check-INTEGER$(EXEEXT) diff --git a/tests/Makefile.in b/tests/Makefile.in index 17232e715..3e5a431a3 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -33,9 +33,7 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = @build@ host_triplet = @host@ -target_triplet = @target@ subdir = tests DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 From a4294b7168fc24e237e08fb8f30d083723f907fb Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 7 Sep 2004 07:26:32 +0000 Subject: [PATCH 0286/1469] simplification git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@286 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_types.h | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/skeletons/asn_types.h b/skeletons/asn_types.h index fa78f38b7..17cf12546 100644 --- a/skeletons/asn_types.h +++ b/skeletons/asn_types.h @@ -14,20 +14,13 @@ #include /* For size_t */ #include /* For va_start */ #include /* for offsetof and ptrdiff_t */ -#ifndef WIN32 -#include /* C99 Standard specifies this file, for uintXX_t */ -#else -typedef unsigned char uint8_t; -typedef unsigned short int uint16_t; -typedef unsigned int uint32_t; -typedef int ssize_t; -#endif +#include /* SUSv2+ and C99 specify this file, for uintXX_t */ -#ifdef WIN32 +#ifdef WIN32 #define snprintf _snprintf #define vsnprintf _vsnprintf #define alloca(size) _alloca(size) -#endif +#endif /* WIN32 */ #ifndef __GNUC__ #define __attribute__(ignore) From 80103493091301abc2a91cf22cac91e4bafc9ba8 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 7 Sep 2004 10:39:09 +0000 Subject: [PATCH 0287/1469] misleading errors converted to mild warnings git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@287 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_y.c | 4879 ++++++++++++++++++++++----------------- libasn1parser/asn1p_y.h | 350 ++- libasn1parser/asn1p_y.y | 8 +- 3 files changed, 3016 insertions(+), 2221 deletions(-) diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index b36871cbf..e0c84aa5b 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -1,116 +1,269 @@ +/* A Bison parser, made from asn1p_y.y, by GNU bison 1.75. */ -/* A Bison parser, made from asn1p_y.y - by GNU Bison version 1.28 */ +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. -#define YYBISON 1 /* Identify Bison output. */ + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 +/* If NAME_PREFIX is specified substitute the variables and functions + names. */ #define yyparse asn1p_parse -#define yylex asn1p_lex +#define yylex asn1p_lex #define yyerror asn1p_error -#define yylval asn1p_lval -#define yychar asn1p_char +#define yylval asn1p_lval +#define yychar asn1p_char #define yydebug asn1p_debug #define yynerrs asn1p_nerrs -#define TOK_PPEQ 257 -#define TOK_opaque 258 -#define TOK_bstring 259 -#define TOK_cstring 260 -#define TOK_hstring 261 -#define TOK_identifier 262 -#define TOK_number 263 -#define TOK_number_negative 264 -#define TOK_typereference 265 -#define TOK_capitalreference 266 -#define TOK_typefieldreference 267 -#define TOK_valuefieldreference 268 -#define TOK_ABSENT 269 -#define TOK_ABSTRACT_SYNTAX 270 -#define TOK_ALL 271 -#define TOK_ANY 272 -#define TOK_APPLICATION 273 -#define TOK_AUTOMATIC 274 -#define TOK_BEGIN 275 -#define TOK_BIT 276 -#define TOK_BMPString 277 -#define TOK_BOOLEAN 278 -#define TOK_BY 279 -#define TOK_CHARACTER 280 -#define TOK_CHOICE 281 -#define TOK_CLASS 282 -#define TOK_COMPONENT 283 -#define TOK_COMPONENTS 284 -#define TOK_CONSTRAINED 285 -#define TOK_CONTAINING 286 -#define TOK_DEFAULT 287 -#define TOK_DEFINITIONS 288 -#define TOK_DEFINED 289 -#define TOK_EMBEDDED 290 -#define TOK_ENCODED 291 -#define TOK_ENCODING_CONTROL 292 -#define TOK_END 293 -#define TOK_ENUMERATED 294 -#define TOK_EXPLICIT 295 -#define TOK_EXPORTS 296 -#define TOK_EXTENSIBILITY 297 -#define TOK_EXTERNAL 298 -#define TOK_FALSE 299 -#define TOK_FROM 300 -#define TOK_GeneralizedTime 301 -#define TOK_GeneralString 302 -#define TOK_GraphicString 303 -#define TOK_IA5String 304 -#define TOK_IDENTIFIER 305 -#define TOK_IMPLICIT 306 -#define TOK_IMPLIED 307 -#define TOK_IMPORTS 308 -#define TOK_INCLUDES 309 -#define TOK_INSTANCE 310 -#define TOK_INSTRUCTIONS 311 -#define TOK_INTEGER 312 -#define TOK_ISO646String 313 -#define TOK_MAX 314 -#define TOK_MIN 315 -#define TOK_MINUS_INFINITY 316 -#define TOK_NULL 317 -#define TOK_NumericString 318 -#define TOK_OBJECT 319 -#define TOK_ObjectDescriptor 320 -#define TOK_OCTET 321 -#define TOK_OF 322 -#define TOK_OPTIONAL 323 -#define TOK_PATTERN 324 -#define TOK_PDV 325 -#define TOK_PLUS_INFINITY 326 -#define TOK_PRESENT 327 -#define TOK_PrintableString 328 -#define TOK_PRIVATE 329 -#define TOK_REAL 330 -#define TOK_RELATIVE_OID 331 -#define TOK_SEQUENCE 332 -#define TOK_SET 333 -#define TOK_SIZE 334 -#define TOK_STRING 335 -#define TOK_SYNTAX 336 -#define TOK_T61String 337 -#define TOK_TAGS 338 -#define TOK_TeletexString 339 -#define TOK_TRUE 340 -#define TOK_TYPE_IDENTIFIER 341 -#define TOK_UNIQUE 342 -#define TOK_UNIVERSAL 343 -#define TOK_UniversalString 344 -#define TOK_UTCTime 345 -#define TOK_UTF8String 346 -#define TOK_VideotexString 347 -#define TOK_VisibleString 348 -#define TOK_WITH 349 -#define TOK_EXCEPT 350 -#define TOK_INTERSECTION 351 -#define TOK_UNION 352 -#define TOK_TwoDots 353 -#define TOK_ThreeDots 354 -#define TOK_tag 355 + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + TOK_PPEQ = 258, + TOK_opaque = 259, + TOK_bstring = 260, + TOK_cstring = 261, + TOK_hstring = 262, + TOK_identifier = 263, + TOK_number = 264, + TOK_number_negative = 265, + TOK_typereference = 266, + TOK_capitalreference = 267, + TOK_typefieldreference = 268, + TOK_valuefieldreference = 269, + TOK_ABSENT = 270, + TOK_ABSTRACT_SYNTAX = 271, + TOK_ALL = 272, + TOK_ANY = 273, + TOK_APPLICATION = 274, + TOK_AUTOMATIC = 275, + TOK_BEGIN = 276, + TOK_BIT = 277, + TOK_BMPString = 278, + TOK_BOOLEAN = 279, + TOK_BY = 280, + TOK_CHARACTER = 281, + TOK_CHOICE = 282, + TOK_CLASS = 283, + TOK_COMPONENT = 284, + TOK_COMPONENTS = 285, + TOK_CONSTRAINED = 286, + TOK_CONTAINING = 287, + TOK_DEFAULT = 288, + TOK_DEFINITIONS = 289, + TOK_DEFINED = 290, + TOK_EMBEDDED = 291, + TOK_ENCODED = 292, + TOK_ENCODING_CONTROL = 293, + TOK_END = 294, + TOK_ENUMERATED = 295, + TOK_EXPLICIT = 296, + TOK_EXPORTS = 297, + TOK_EXTENSIBILITY = 298, + TOK_EXTERNAL = 299, + TOK_FALSE = 300, + TOK_FROM = 301, + TOK_GeneralizedTime = 302, + TOK_GeneralString = 303, + TOK_GraphicString = 304, + TOK_IA5String = 305, + TOK_IDENTIFIER = 306, + TOK_IMPLICIT = 307, + TOK_IMPLIED = 308, + TOK_IMPORTS = 309, + TOK_INCLUDES = 310, + TOK_INSTANCE = 311, + TOK_INSTRUCTIONS = 312, + TOK_INTEGER = 313, + TOK_ISO646String = 314, + TOK_MAX = 315, + TOK_MIN = 316, + TOK_MINUS_INFINITY = 317, + TOK_NULL = 318, + TOK_NumericString = 319, + TOK_OBJECT = 320, + TOK_ObjectDescriptor = 321, + TOK_OCTET = 322, + TOK_OF = 323, + TOK_OPTIONAL = 324, + TOK_PATTERN = 325, + TOK_PDV = 326, + TOK_PLUS_INFINITY = 327, + TOK_PRESENT = 328, + TOK_PrintableString = 329, + TOK_PRIVATE = 330, + TOK_REAL = 331, + TOK_RELATIVE_OID = 332, + TOK_SEQUENCE = 333, + TOK_SET = 334, + TOK_SIZE = 335, + TOK_STRING = 336, + TOK_SYNTAX = 337, + TOK_T61String = 338, + TOK_TAGS = 339, + TOK_TeletexString = 340, + TOK_TRUE = 341, + TOK_TYPE_IDENTIFIER = 342, + TOK_UNIQUE = 343, + TOK_UNIVERSAL = 344, + TOK_UniversalString = 345, + TOK_UTCTime = 346, + TOK_UTF8String = 347, + TOK_VideotexString = 348, + TOK_VisibleString = 349, + TOK_WITH = 350, + TOK_EXCEPT = 351, + TOK_INTERSECTION = 352, + TOK_UNION = 353, + TOK_TwoDots = 354, + TOK_ThreeDots = 355, + TOK_tag = 356 + }; +#endif +#define TOK_PPEQ 258 +#define TOK_opaque 259 +#define TOK_bstring 260 +#define TOK_cstring 261 +#define TOK_hstring 262 +#define TOK_identifier 263 +#define TOK_number 264 +#define TOK_number_negative 265 +#define TOK_typereference 266 +#define TOK_capitalreference 267 +#define TOK_typefieldreference 268 +#define TOK_valuefieldreference 269 +#define TOK_ABSENT 270 +#define TOK_ABSTRACT_SYNTAX 271 +#define TOK_ALL 272 +#define TOK_ANY 273 +#define TOK_APPLICATION 274 +#define TOK_AUTOMATIC 275 +#define TOK_BEGIN 276 +#define TOK_BIT 277 +#define TOK_BMPString 278 +#define TOK_BOOLEAN 279 +#define TOK_BY 280 +#define TOK_CHARACTER 281 +#define TOK_CHOICE 282 +#define TOK_CLASS 283 +#define TOK_COMPONENT 284 +#define TOK_COMPONENTS 285 +#define TOK_CONSTRAINED 286 +#define TOK_CONTAINING 287 +#define TOK_DEFAULT 288 +#define TOK_DEFINITIONS 289 +#define TOK_DEFINED 290 +#define TOK_EMBEDDED 291 +#define TOK_ENCODED 292 +#define TOK_ENCODING_CONTROL 293 +#define TOK_END 294 +#define TOK_ENUMERATED 295 +#define TOK_EXPLICIT 296 +#define TOK_EXPORTS 297 +#define TOK_EXTENSIBILITY 298 +#define TOK_EXTERNAL 299 +#define TOK_FALSE 300 +#define TOK_FROM 301 +#define TOK_GeneralizedTime 302 +#define TOK_GeneralString 303 +#define TOK_GraphicString 304 +#define TOK_IA5String 305 +#define TOK_IDENTIFIER 306 +#define TOK_IMPLICIT 307 +#define TOK_IMPLIED 308 +#define TOK_IMPORTS 309 +#define TOK_INCLUDES 310 +#define TOK_INSTANCE 311 +#define TOK_INSTRUCTIONS 312 +#define TOK_INTEGER 313 +#define TOK_ISO646String 314 +#define TOK_MAX 315 +#define TOK_MIN 316 +#define TOK_MINUS_INFINITY 317 +#define TOK_NULL 318 +#define TOK_NumericString 319 +#define TOK_OBJECT 320 +#define TOK_ObjectDescriptor 321 +#define TOK_OCTET 322 +#define TOK_OF 323 +#define TOK_OPTIONAL 324 +#define TOK_PATTERN 325 +#define TOK_PDV 326 +#define TOK_PLUS_INFINITY 327 +#define TOK_PRESENT 328 +#define TOK_PrintableString 329 +#define TOK_PRIVATE 330 +#define TOK_REAL 331 +#define TOK_RELATIVE_OID 332 +#define TOK_SEQUENCE 333 +#define TOK_SET 334 +#define TOK_SIZE 335 +#define TOK_STRING 336 +#define TOK_SYNTAX 337 +#define TOK_T61String 338 +#define TOK_TAGS 339 +#define TOK_TeletexString 340 +#define TOK_TRUE 341 +#define TOK_TYPE_IDENTIFIER 342 +#define TOK_UNIQUE 343 +#define TOK_UNIVERSAL 344 +#define TOK_UniversalString 345 +#define TOK_UTCTime 346 +#define TOK_UTF8String 347 +#define TOK_VideotexString 348 +#define TOK_VisibleString 349 +#define TOK_WITH 350 +#define TOK_EXCEPT 351 +#define TOK_INTERSECTION 352 +#define TOK_UNION 353 +#define TOK_TwoDots 354 +#define TOK_ThreeDots 355 +#define TOK_tag 356 + + + + +/* Copy the first part of user declarations. */ #line 1 "asn1p_y.y" @@ -162,6 +315,21 @@ static asn1p_value_t * } while(0) + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +#ifndef YYSTYPE #line 58 "asn1p_y.y" typedef union { asn1p_t *a_grammar; @@ -194,815 +362,1057 @@ typedef union { char *name; struct asn1p_type_tag_s tag; } tv_nametag; -} YYSTYPE; -#include - -#ifndef __cplusplus -#ifndef __STDC__ -#define const +} yystype; +/* Line 193 of /usr/local/share/bison/yacc.c. */ +#line 368 "asn1p_y.c" +# define YYSTYPE yystype +# define YYSTYPE_IS_TRIVIAL 1 #endif + +#ifndef YYLTYPE +typedef struct yyltype +{ + int first_line; + int first_column; + int last_line; + int last_column; +} yyltype; +# define YYLTYPE yyltype +# define YYLTYPE_IS_TRIVIAL 1 #endif +/* Copy the second part of user declarations. */ + + +/* Line 213 of /usr/local/share/bison/yacc.c. */ +#line 389 "asn1p_y.c" + +#if ! defined (yyoverflow) || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# if YYSTACK_USE_ALLOCA +# define YYSTACK_ALLOC alloca +# else +# ifndef YYSTACK_USE_ALLOCA +# if defined (alloca) || defined (_ALLOCA_H) +# define YYSTACK_ALLOC alloca +# else +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# else +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +# define YYSTACK_ALLOC malloc +# define YYSTACK_FREE free +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short yyss; + YYSTYPE yyvs; + }; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAX) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + register YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) +#endif -#define YYFINAL 396 -#define YYFLAG -32768 -#define YYNTBASE 115 - -#define YYTRANSLATE(x) ((unsigned)(x) <= 355 ? yytranslate[x] : 214) - -static const char yytranslate[] = { 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 111, 2, 2, 2, 2, 2, 2, 106, - 107, 2, 2, 109, 2, 112, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 110, 108, 113, - 2, 2, 2, 114, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 97, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 104, 99, 105, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 98, 100, 101, 102, 103 -}; +#if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; +#else + typedef short yysigned_char; +#endif -#if YYDEBUG != 0 -static const short yyprhs[] = { 0, - 0, 2, 4, 7, 16, 17, 19, 23, 26, 28, - 31, 33, 38, 40, 41, 43, 45, 48, 51, 54, - 57, 60, 63, 64, 66, 68, 71, 73, 75, 77, - 79, 81, 82, 86, 88, 92, 95, 97, 100, 105, - 107, 111, 113, 115, 119, 123, 126, 128, 132, 134, - 136, 143, 145, 147, 148, 150, 152, 156, 158, 160, - 165, 170, 174, 181, 183, 187, 189, 193, 197, 199, - 203, 205, 207, 209, 213, 217, 221, 223, 225, 229, - 232, 234, 240, 241, 243, 245, 249, 252, 257, 262, - 263, 265, 266, 273, 275, 278, 280, 282, 284, 288, - 292, 295, 297, 299, 304, 309, 314, 319, 324, 326, - 331, 336, 338, 342, 344, 348, 352, 354, 358, 360, - 364, 366, 368, 370, 372, 377, 378, 382, 384, 386, - 388, 390, 392, 394, 398, 400, 403, 405, 407, 409, - 411, 414, 417, 419, 421, 424, 427, 429, 431, 433, - 435, 438, 440, 443, 445, 447, 449, 451, 453, 455, - 457, 459, 461, 463, 465, 467, 469, 471, 473, 475, - 477, 479, 481, 482, 484, 486, 491, 495, 500, 502, - 506, 512, 514, 518, 522, 526, 531, 535, 537, 541, - 545, 549, 553, 555, 557, 559, 562, 565, 569, 571, - 573, 575, 577, 579, 581, 583, 589, 591, 595, 597, - 601, 602, 604, 606, 608, 610, 612, 614, 618, 623, - 625, 629, 632, 636, 638, 642, 643, 645, 647, 650, - 652, 654, 655, 659, 662, 666, 668, 672, 674, 679, - 684, 686, 688, 690, 692, 693, 695, 697, 700, 703, - 705, 707, 709, 711, 713 +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 7 +#define YYLAST 820 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 115 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 100 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 256 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 396 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 356 + +#define YYTRANSLATE(X) \ + ((unsigned)(X) <= YYMAXUTOK ? yytranslate[X] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 111, 2, 2, 2, 2, 2, 2, + 106, 107, 2, 2, 109, 2, 112, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 110, 108, + 113, 2, 2, 2, 114, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 97, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 104, 99, 105, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 98, 100, 101, 102, 103 }; -static const short yyrhs[] = { 116, - 0, 117, 0, 116, 117, 0, 210, 118, 34, 122, - 3, 21, 125, 39, 0, 0, 119, 0, 104, 120, - 105, 0, 104, 105, 0, 121, 0, 120, 121, 0, - 212, 0, 212, 106, 9, 107, 0, 9, 0, 0, - 123, 0, 124, 0, 123, 124, 0, 41, 84, 0, - 52, 84, 0, 20, 84, 0, 43, 53, 0, 12, - 57, 0, 0, 126, 0, 127, 0, 126, 127, 0, - 129, 0, 134, 0, 142, 0, 168, 0, 137, 0, - 0, 38, 12, 128, 0, 176, 0, 54, 130, 108, - 0, 54, 46, 0, 131, 0, 130, 131, 0, 132, - 46, 210, 118, 0, 133, 0, 132, 109, 133, 0, - 210, 0, 212, 0, 42, 135, 108, 0, 42, 17, - 108, 0, 42, 108, 0, 136, 0, 135, 109, 136, - 0, 210, 0, 212, 0, 210, 138, 3, 104, 139, - 105, 0, 163, 0, 173, 0, 0, 140, 0, 141, - 0, 140, 109, 141, 0, 102, 0, 184, 0, 210, - 3, 208, 87, 0, 210, 3, 208, 161, 0, 210, - 3, 151, 0, 210, 104, 143, 105, 3, 161, 0, - 144, 0, 143, 109, 144, 0, 210, 0, 210, 110, - 212, 0, 173, 110, 212, 0, 146, 0, 145, 109, - 146, 0, 161, 0, 212, 0, 148, 0, 147, 109, - 148, 0, 213, 161, 200, 0, 30, 68, 161, 0, - 160, 0, 150, 0, 149, 109, 150, 0, 213, 161, - 0, 160, 0, 28, 104, 153, 105, 155, 0, 0, - 88, 0, 154, 0, 153, 109, 154, 0, 166, 200, - 0, 166, 161, 200, 152, 0, 166, 166, 200, 152, - 0, 0, 156, 0, 0, 95, 82, 104, 157, 158, - 105, 0, 159, 0, 158, 159, 0, 4, 0, 166, - 0, 102, 0, 102, 111, 171, 0, 102, 111, 207, - 0, 162, 180, 0, 175, 0, 176, 0, 27, 104, - 149, 105, 0, 78, 104, 147, 105, 0, 79, 104, - 147, 105, 0, 78, 180, 68, 162, 0, 79, 180, - 68, 162, 0, 18, 0, 18, 35, 25, 212, 0, - 210, 104, 145, 105, 0, 163, 0, 56, 68, 163, - 0, 11, 0, 11, 112, 210, 0, 11, 112, 212, - 0, 211, 0, 211, 112, 164, 0, 165, 0, 164, - 112, 165, 0, 167, 0, 167, 0, 13, 0, 14, - 0, 212, 138, 3, 169, 0, 0, 104, 170, 172, - 0, 5, 0, 7, 0, 6, 0, 207, 0, 171, - 0, 212, 0, 210, 112, 212, 0, 4, 0, 172, - 4, 0, 24, 0, 63, 0, 76, 0, 174, 0, - 67, 81, 0, 65, 51, 0, 77, 0, 44, 0, - 36, 71, 0, 26, 81, 0, 91, 0, 47, 0, - 58, 0, 40, 0, 22, 81, 0, 173, 0, 174, - 204, 0, 23, 0, 48, 0, 49, 0, 50, 0, - 59, 0, 64, 0, 74, 0, 83, 0, 85, 0, - 90, 0, 92, 0, 93, 0, 94, 0, 66, 0, - 99, 0, 100, 0, 97, 0, 98, 0, 96, 0, - 0, 181, 0, 182, 0, 80, 106, 183, 107, 0, - 106, 183, 107, 0, 182, 106, 183, 107, 0, 184, - 0, 184, 109, 102, 0, 184, 109, 102, 109, 184, - 0, 185, 0, 184, 177, 185, 0, 184, 178, 185, - 0, 185, 179, 185, 0, 187, 106, 183, 107, 0, - 106, 183, 107, 0, 188, 0, 188, 186, 188, 0, - 61, 186, 188, 0, 188, 186, 60, 0, 61, 186, - 60, 0, 194, 0, 189, 0, 101, 0, 101, 113, - 0, 113, 101, 0, 113, 101, 113, 0, 80, 0, - 46, 0, 207, 0, 212, 0, 6, 0, 45, 0, - 86, 0, 95, 30, 104, 190, 105, 0, 191, 0, - 190, 109, 191, 0, 102, 0, 212, 180, 192, 0, - 0, 193, 0, 73, 0, 15, 0, 69, 0, 195, - 0, 196, 0, 104, 210, 105, 0, 195, 104, 197, - 105, 0, 198, 0, 197, 109, 198, 0, 114, 199, - 0, 114, 112, 199, 0, 212, 0, 199, 112, 212, - 0, 0, 201, 0, 69, 0, 33, 202, 0, 188, - 0, 173, 0, 0, 104, 203, 172, 0, 104, 105, - 0, 104, 205, 105, 0, 206, 0, 205, 109, 206, - 0, 212, 0, 212, 106, 207, 107, 0, 212, 106, - 171, 107, 0, 207, 0, 102, 0, 9, 0, 10, - 0, 0, 209, 0, 103, 0, 103, 52, 0, 103, - 41, 0, 11, 0, 12, 0, 12, 0, 8, 0, - 212, 0, 212, 209, 0 +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const unsigned short yyprhs[] = +{ + 0, 0, 3, 5, 7, 10, 19, 20, 22, 26, + 29, 31, 34, 36, 41, 43, 44, 46, 48, 51, + 54, 57, 60, 63, 66, 67, 69, 71, 74, 76, + 78, 80, 82, 84, 85, 89, 91, 95, 98, 100, + 103, 108, 110, 114, 116, 118, 122, 126, 129, 131, + 135, 137, 139, 146, 148, 150, 151, 153, 155, 159, + 161, 163, 168, 173, 177, 184, 186, 190, 192, 196, + 200, 202, 206, 208, 210, 212, 216, 220, 224, 226, + 228, 232, 235, 237, 243, 244, 246, 248, 252, 255, + 260, 265, 266, 268, 269, 276, 278, 281, 283, 285, + 287, 291, 295, 298, 300, 302, 307, 312, 317, 322, + 327, 329, 334, 339, 341, 345, 347, 351, 355, 357, + 361, 363, 367, 369, 371, 373, 375, 380, 381, 385, + 387, 389, 391, 393, 395, 397, 401, 403, 406, 408, + 410, 412, 414, 417, 420, 422, 424, 427, 430, 432, + 434, 436, 438, 441, 443, 446, 448, 450, 452, 454, + 456, 458, 460, 462, 464, 466, 468, 470, 472, 474, + 476, 478, 480, 482, 484, 485, 487, 489, 494, 498, + 503, 505, 509, 515, 517, 521, 525, 529, 534, 538, + 540, 544, 548, 552, 556, 558, 560, 562, 565, 568, + 572, 574, 576, 578, 580, 582, 584, 586, 592, 594, + 598, 600, 604, 605, 607, 609, 611, 613, 615, 617, + 621, 626, 628, 632, 635, 639, 641, 645, 646, 648, + 650, 653, 655, 657, 658, 662, 665, 669, 671, 675, + 677, 682, 687, 689, 691, 693, 695, 696, 698, 700, + 703, 706, 708, 710, 712, 714, 716 }; -#endif +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const short yyrhs[] = +{ + 116, 0, -1, 117, -1, 118, -1, 117, 118, -1, + 211, 119, 34, 123, 3, 21, 126, 39, -1, -1, + 120, -1, 104, 121, 105, -1, 104, 105, -1, 122, + -1, 121, 122, -1, 213, -1, 213, 106, 9, 107, + -1, 9, -1, -1, 124, -1, 125, -1, 124, 125, + -1, 41, 84, -1, 52, 84, -1, 20, 84, -1, + 43, 53, -1, 12, 57, -1, -1, 127, -1, 128, + -1, 127, 128, -1, 130, -1, 135, -1, 143, -1, + 169, -1, 138, -1, -1, 38, 12, 129, -1, 177, + -1, 54, 131, 108, -1, 54, 46, -1, 132, -1, + 131, 132, -1, 133, 46, 211, 119, -1, 134, -1, + 133, 109, 134, -1, 211, -1, 213, -1, 42, 136, + 108, -1, 42, 17, 108, -1, 42, 108, -1, 137, + -1, 136, 109, 137, -1, 211, -1, 213, -1, 211, + 139, 3, 104, 140, 105, -1, 164, -1, 174, -1, + -1, 141, -1, 142, -1, 141, 109, 142, -1, 102, + -1, 185, -1, 211, 3, 209, 87, -1, 211, 3, + 209, 162, -1, 211, 3, 152, -1, 211, 104, 144, + 105, 3, 162, -1, 145, -1, 144, 109, 145, -1, + 211, -1, 211, 110, 213, -1, 174, 110, 213, -1, + 147, -1, 146, 109, 147, -1, 162, -1, 213, -1, + 149, -1, 148, 109, 149, -1, 214, 162, 201, -1, + 30, 68, 162, -1, 161, -1, 151, -1, 150, 109, + 151, -1, 214, 162, -1, 161, -1, 28, 104, 154, + 105, 156, -1, -1, 88, -1, 155, -1, 154, 109, + 155, -1, 167, 201, -1, 167, 162, 201, 153, -1, + 167, 167, 201, 153, -1, -1, 157, -1, -1, 95, + 82, 104, 158, 159, 105, -1, 160, -1, 159, 160, + -1, 4, -1, 167, -1, 102, -1, 102, 111, 172, + -1, 102, 111, 208, -1, 163, 181, -1, 176, -1, + 177, -1, 27, 104, 150, 105, -1, 78, 104, 148, + 105, -1, 79, 104, 148, 105, -1, 78, 181, 68, + 163, -1, 79, 181, 68, 163, -1, 18, -1, 18, + 35, 25, 213, -1, 211, 104, 146, 105, -1, 164, + -1, 56, 68, 164, -1, 11, -1, 11, 112, 211, + -1, 11, 112, 213, -1, 212, -1, 212, 112, 165, + -1, 166, -1, 165, 112, 166, -1, 168, -1, 168, + -1, 13, -1, 14, -1, 213, 139, 3, 170, -1, + -1, 104, 171, 173, -1, 5, -1, 7, -1, 6, + -1, 208, -1, 172, -1, 213, -1, 211, 112, 213, + -1, 4, -1, 173, 4, -1, 24, -1, 63, -1, + 76, -1, 175, -1, 67, 81, -1, 65, 51, -1, + 77, -1, 44, -1, 36, 71, -1, 26, 81, -1, + 91, -1, 47, -1, 58, -1, 40, -1, 22, 81, + -1, 174, -1, 175, 205, -1, 23, -1, 48, -1, + 49, -1, 50, -1, 59, -1, 64, -1, 74, -1, + 83, -1, 85, -1, 90, -1, 92, -1, 93, -1, + 94, -1, 66, -1, 99, -1, 100, -1, 97, -1, + 98, -1, 96, -1, -1, 182, -1, 183, -1, 80, + 106, 184, 107, -1, 106, 184, 107, -1, 183, 106, + 184, 107, -1, 185, -1, 185, 109, 102, -1, 185, + 109, 102, 109, 185, -1, 186, -1, 185, 178, 186, + -1, 185, 179, 186, -1, 186, 180, 186, -1, 188, + 106, 184, 107, -1, 106, 184, 107, -1, 189, -1, + 189, 187, 189, -1, 61, 187, 189, -1, 189, 187, + 60, -1, 61, 187, 60, -1, 195, -1, 190, -1, + 101, -1, 101, 113, -1, 113, 101, -1, 113, 101, + 113, -1, 80, -1, 46, -1, 208, -1, 213, -1, + 6, -1, 45, -1, 86, -1, 95, 30, 104, 191, + 105, -1, 192, -1, 191, 109, 192, -1, 102, -1, + 213, 181, 193, -1, -1, 194, -1, 73, -1, 15, + -1, 69, -1, 196, -1, 197, -1, 104, 211, 105, + -1, 196, 104, 198, 105, -1, 199, -1, 198, 109, + 199, -1, 114, 200, -1, 114, 112, 200, -1, 213, + -1, 200, 112, 213, -1, -1, 202, -1, 69, -1, + 33, 203, -1, 189, -1, 174, -1, -1, 104, 204, + 173, -1, 104, 105, -1, 104, 206, 105, -1, 207, + -1, 206, 109, 207, -1, 213, -1, 213, 106, 208, + 107, -1, 213, 106, 172, 107, -1, 208, -1, 102, + -1, 9, -1, 10, -1, -1, 210, -1, 103, -1, + 103, 52, -1, 103, 41, -1, 11, -1, 12, -1, + 12, -1, 8, -1, 213, -1, 213, 210, -1 +}; -#if YYDEBUG != 0 -static const short yyrline[] = { 0, - 300, 306, 312, 328, 353, 355, 358, 362, 367, 374, - 382, 387, 391, 400, 402, 410, 414, 422, 426, 429, - 432, 436, 456, 458, 466, 470, 502, 506, 515, 522, - 535, 542, 544, 556, 569, 576, 581, 587, 593, 602, - 608, 614, 621, 629, 633, 636, 643, 649, 655, 662, - 671, 681, 689, 697, 699, 709, 712, 716, 719, 731, - 743, 750, 766, 775, 785, 795, 800, 807, 817, 823, - 829, 833, 845, 851, 857, 865, 872, 877, 883, 889, - 896, 901, 911, 913, 916, 924, 930, 939, 945, 962, - 964, 969, 973, 978, 983, 989, 993, 1004, 1013, 1022, - 1033, 1054, 1058, 1064, 1070, 1076, 1082, 1090, 1098, 1104, - 1118, 1142, 1149, 1163, 1172, 1182, 1192, 1200, 1221, 1230, - 1239, 1240, 1242, 1249, 1261, 1271, 1273, 1278, 1282, 1286, - 1290, 1293, 1298, 1310, 1326, 1337, 1351, 1353, 1354, 1355, - 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1369, 1371, - 1372, 1375, 1382, 1394, 1396, 1400, 1404, 1405, 1406, 1407, - 1408, 1412, 1413, 1414, 1415, 1419, 1420, 1427, 1427, 1428, - 1428, 1429, 1431, 1433, 1438, 1442, 1451, 1455, 1460, 1464, - 1470, 1480, 1484, 1487, 1490, 1495, 1504, 1512, 1518, 1525, - 1533, 1541, 1550, 1553, 1558, 1560, 1561, 1562, 1565, 1569, - 1574, 1578, 1589, 1594, 1599, 1606, 1612, 1616, 1621, 1627, - 1639, 1641, 1644, 1648, 1651, 1656, 1660, 1668, 1683, 1689, - 1696, 1709, 1721, 1736, 1740, 1757, 1759, 1762, 1766, 1772, - 1775, 1777, 1777, 1797, 1802, 1807, 1813, 1819, 1827, 1835, - 1843, 1850, 1860, 1865, 1895, 1897, 1900, 1905, 1909, 1915, - 1920, 1927, 1934, 1941, 1946 +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const unsigned short yyrline[] = +{ + 0, 300, 300, 306, 312, 328, 353, 355, 358, 362, + 367, 374, 382, 387, 391, 400, 402, 410, 414, 422, + 426, 429, 432, 436, 456, 458, 466, 470, 502, 506, + 515, 522, 535, 543, 542, 556, 569, 576, 581, 587, + 593, 602, 608, 614, 621, 629, 633, 636, 643, 649, + 655, 662, 671, 681, 689, 697, 699, 709, 712, 716, + 719, 731, 743, 750, 766, 775, 785, 795, 800, 807, + 817, 823, 829, 833, 845, 851, 857, 865, 872, 877, + 883, 889, 896, 901, 911, 913, 916, 924, 930, 939, + 945, 962, 964, 971, 969, 978, 983, 989, 993, 1004, + 1013, 1022, 1033, 1054, 1058, 1064, 1070, 1076, 1082, 1090, + 1098, 1104, 1118, 1142, 1149, 1163, 1172, 1182, 1192, 1200, + 1221, 1230, 1239, 1240, 1242, 1249, 1261, 1272, 1271, 1278, + 1282, 1286, 1290, 1293, 1298, 1310, 1326, 1337, 1351, 1353, + 1354, 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, + 1369, 1371, 1372, 1375, 1382, 1394, 1396, 1400, 1404, 1405, + 1406, 1407, 1408, 1412, 1413, 1414, 1415, 1419, 1420, 1427, + 1427, 1428, 1428, 1429, 1431, 1433, 1438, 1442, 1451, 1455, + 1460, 1464, 1470, 1480, 1484, 1487, 1490, 1495, 1504, 1512, + 1518, 1525, 1533, 1541, 1550, 1553, 1558, 1560, 1561, 1562, + 1565, 1569, 1574, 1578, 1589, 1594, 1599, 1606, 1612, 1616, + 1621, 1627, 1639, 1641, 1644, 1648, 1651, 1656, 1660, 1668, + 1683, 1689, 1696, 1709, 1721, 1736, 1740, 1757, 1759, 1762, + 1766, 1772, 1775, 1777, 1777, 1797, 1802, 1807, 1813, 1819, + 1827, 1835, 1843, 1850, 1860, 1865, 1895, 1897, 1900, 1905, + 1909, 1915, 1920, 1927, 1934, 1941, 1946 }; #endif - -#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) - -static const char * const yytname[] = { "$","error","$undefined.","TOK_PPEQ", -"TOK_opaque","TOK_bstring","TOK_cstring","TOK_hstring","TOK_identifier","TOK_number", -"TOK_number_negative","TOK_typereference","TOK_capitalreference","TOK_typefieldreference", -"TOK_valuefieldreference","TOK_ABSENT","TOK_ABSTRACT_SYNTAX","TOK_ALL","TOK_ANY", -"TOK_APPLICATION","TOK_AUTOMATIC","TOK_BEGIN","TOK_BIT","TOK_BMPString","TOK_BOOLEAN", -"TOK_BY","TOK_CHARACTER","TOK_CHOICE","TOK_CLASS","TOK_COMPONENT","TOK_COMPONENTS", -"TOK_CONSTRAINED","TOK_CONTAINING","TOK_DEFAULT","TOK_DEFINITIONS","TOK_DEFINED", -"TOK_EMBEDDED","TOK_ENCODED","TOK_ENCODING_CONTROL","TOK_END","TOK_ENUMERATED", -"TOK_EXPLICIT","TOK_EXPORTS","TOK_EXTENSIBILITY","TOK_EXTERNAL","TOK_FALSE", -"TOK_FROM","TOK_GeneralizedTime","TOK_GeneralString","TOK_GraphicString","TOK_IA5String", -"TOK_IDENTIFIER","TOK_IMPLICIT","TOK_IMPLIED","TOK_IMPORTS","TOK_INCLUDES","TOK_INSTANCE", -"TOK_INSTRUCTIONS","TOK_INTEGER","TOK_ISO646String","TOK_MAX","TOK_MIN","TOK_MINUS_INFINITY", -"TOK_NULL","TOK_NumericString","TOK_OBJECT","TOK_ObjectDescriptor","TOK_OCTET", -"TOK_OF","TOK_OPTIONAL","TOK_PATTERN","TOK_PDV","TOK_PLUS_INFINITY","TOK_PRESENT", -"TOK_PrintableString","TOK_PRIVATE","TOK_REAL","TOK_RELATIVE_OID","TOK_SEQUENCE", -"TOK_SET","TOK_SIZE","TOK_STRING","TOK_SYNTAX","TOK_T61String","TOK_TAGS","TOK_TeletexString", -"TOK_TRUE","TOK_TYPE_IDENTIFIER","TOK_UNIQUE","TOK_UNIVERSAL","TOK_UniversalString", -"TOK_UTCTime","TOK_UTF8String","TOK_VideotexString","TOK_VisibleString","TOK_WITH", -"TOK_EXCEPT","'^'","TOK_INTERSECTION","'|'","TOK_UNION","TOK_TwoDots","TOK_ThreeDots", -"TOK_tag","'{'","'}'","'('","')'","';'","','","':'","'!'","'.'","'<'","'@'", -"ParsedGrammar","ModuleList","ModuleSpecification","optObjectIdentifier","ObjectIdentifier", -"ObjectIdentifierBody","ObjectIdentifierElement","optModuleSpecificationFlags", -"ModuleSpecificationFlags","ModuleSpecificationFlag","optModuleSpecificationBody", -"ModuleSpecificationBody","ModuleSpecificationElement","@1","ImportsDefinition", -"ImportsBundleSet","ImportsBundle","ImportsList","ImportsElement","ExportsDefinition", -"ExportsBody","ExportsElement","ValueSetDefinition","DefinedTypeRef","optValueSetBody", -"ValueSetBody","ValueSetElement","DataTypeReference","ParameterArgumentList", -"ParameterArgumentName","ActualParameterList","ActualParameter","ComponentTypeLists", -"ComponentType","AlternativeTypeLists","AlternativeType","ClassDeclaration", -"optUnique","ClassFieldList","ClassField","optWithSyntax","WithSyntax","@2", -"WithSyntaxFormat","WithSyntaxFormatToken","ExtensionAndException","Type","TypeDeclaration", -"ComplexTypeReference","ComplexTypeReferenceAmpList","ComplexTypeReferenceElement", -"ClassFieldIdentifier","ClassFieldName","ValueDefinition","InlineOrDefinedValue", -"@3","DefinedValue","Opaque","BasicTypeId","BasicTypeId_UniverationCompatible", -"BasicType","BasicString","Union","Intersection","Except","optConstraints","Constraints", -"SetOfConstraints","ElementSetSpecs","ElementSetSpec","ConstraintSubtypeElement", -"ConstraintRangeSpec","ConstraintSpec","ConstraintValue","WithComponents","WithComponentsList", -"WithComponentsElement","optPresenceConstraint","PresenceConstraint","TableConstraint", -"SimpleTableConstraint","ComponentRelationConstraint","AtNotationList","AtNotationElement", -"ComponentIdList","optMarker","Marker","DefaultValue","@4","UniverationDefinition", -"UniverationList","UniverationElement","SignedNumber","optTag","Tag","TypeRefName", -"ObjectClassReference","Identifier","TaggedIdentifier", NULL +#if YYDEBUG || YYERROR_VERBOSE +/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "TOK_PPEQ", "TOK_opaque", "TOK_bstring", + "TOK_cstring", "TOK_hstring", "TOK_identifier", "TOK_number", + "TOK_number_negative", "TOK_typereference", "TOK_capitalreference", + "TOK_typefieldreference", "TOK_valuefieldreference", "TOK_ABSENT", + "TOK_ABSTRACT_SYNTAX", "TOK_ALL", "TOK_ANY", "TOK_APPLICATION", + "TOK_AUTOMATIC", "TOK_BEGIN", "TOK_BIT", "TOK_BMPString", "TOK_BOOLEAN", + "TOK_BY", "TOK_CHARACTER", "TOK_CHOICE", "TOK_CLASS", "TOK_COMPONENT", + "TOK_COMPONENTS", "TOK_CONSTRAINED", "TOK_CONTAINING", "TOK_DEFAULT", + "TOK_DEFINITIONS", "TOK_DEFINED", "TOK_EMBEDDED", "TOK_ENCODED", + "TOK_ENCODING_CONTROL", "TOK_END", "TOK_ENUMERATED", "TOK_EXPLICIT", + "TOK_EXPORTS", "TOK_EXTENSIBILITY", "TOK_EXTERNAL", "TOK_FALSE", + "TOK_FROM", "TOK_GeneralizedTime", "TOK_GeneralString", + "TOK_GraphicString", "TOK_IA5String", "TOK_IDENTIFIER", "TOK_IMPLICIT", + "TOK_IMPLIED", "TOK_IMPORTS", "TOK_INCLUDES", "TOK_INSTANCE", + "TOK_INSTRUCTIONS", "TOK_INTEGER", "TOK_ISO646String", "TOK_MAX", + "TOK_MIN", "TOK_MINUS_INFINITY", "TOK_NULL", "TOK_NumericString", + "TOK_OBJECT", "TOK_ObjectDescriptor", "TOK_OCTET", "TOK_OF", + "TOK_OPTIONAL", "TOK_PATTERN", "TOK_PDV", "TOK_PLUS_INFINITY", + "TOK_PRESENT", "TOK_PrintableString", "TOK_PRIVATE", "TOK_REAL", + "TOK_RELATIVE_OID", "TOK_SEQUENCE", "TOK_SET", "TOK_SIZE", "TOK_STRING", + "TOK_SYNTAX", "TOK_T61String", "TOK_TAGS", "TOK_TeletexString", + "TOK_TRUE", "TOK_TYPE_IDENTIFIER", "TOK_UNIQUE", "TOK_UNIVERSAL", + "TOK_UniversalString", "TOK_UTCTime", "TOK_UTF8String", + "TOK_VideotexString", "TOK_VisibleString", "TOK_WITH", "TOK_EXCEPT", + "'^'", "TOK_INTERSECTION", "'|'", "TOK_UNION", "TOK_TwoDots", + "TOK_ThreeDots", "TOK_tag", "'{'", "'}'", "'('", "')'", "';'", "','", + "':'", "'!'", "'.'", "'<'", "'@'", "$accept", "ParsedGrammar", + "ModuleList", "ModuleSpecification", "optObjectIdentifier", + "ObjectIdentifier", "ObjectIdentifierBody", "ObjectIdentifierElement", + "optModuleSpecificationFlags", "ModuleSpecificationFlags", + "ModuleSpecificationFlag", "optModuleSpecificationBody", + "ModuleSpecificationBody", "ModuleSpecificationElement", "@1", + "ImportsDefinition", "ImportsBundleSet", "ImportsBundle", "ImportsList", + "ImportsElement", "ExportsDefinition", "ExportsBody", "ExportsElement", + "ValueSetDefinition", "DefinedTypeRef", "optValueSetBody", + "ValueSetBody", "ValueSetElement", "DataTypeReference", + "ParameterArgumentList", "ParameterArgumentName", "ActualParameterList", + "ActualParameter", "ComponentTypeLists", "ComponentType", + "AlternativeTypeLists", "AlternativeType", "ClassDeclaration", + "optUnique", "ClassFieldList", "ClassField", "optWithSyntax", + "WithSyntax", "@2", "WithSyntaxFormat", "WithSyntaxFormatToken", + "ExtensionAndException", "Type", "TypeDeclaration", + "ComplexTypeReference", "ComplexTypeReferenceAmpList", + "ComplexTypeReferenceElement", "ClassFieldIdentifier", "ClassFieldName", + "ValueDefinition", "InlineOrDefinedValue", "@3", "DefinedValue", + "Opaque", "BasicTypeId", "BasicTypeId_UniverationCompatible", + "BasicType", "BasicString", "Union", "Intersection", "Except", + "optConstraints", "Constraints", "SetOfConstraints", "ElementSetSpecs", + "ElementSetSpec", "ConstraintSubtypeElement", "ConstraintRangeSpec", + "ConstraintSpec", "ConstraintValue", "WithComponents", + "WithComponentsList", "WithComponentsElement", "optPresenceConstraint", + "PresenceConstraint", "TableConstraint", "SimpleTableConstraint", + "ComponentRelationConstraint", "AtNotationList", "AtNotationElement", + "ComponentIdList", "optMarker", "Marker", "DefaultValue", "@4", + "UniverationDefinition", "UniverationList", "UniverationElement", + "SignedNumber", "optTag", "Tag", "TypeRefName", "ObjectClassReference", + "Identifier", "TaggedIdentifier", 0 }; #endif -static const short yyr1[] = { 0, - 115, 116, 116, 117, 118, 118, 119, 119, 120, 120, - 121, 121, 121, 122, 122, 123, 123, 124, 124, 124, - 124, 124, 125, 125, 126, 126, 127, 127, 127, 127, - 127, 128, 127, 127, 129, 129, 130, 130, 131, 132, - 132, 133, 133, 134, 134, 134, 135, 135, 136, 136, - 137, 138, 138, 139, 139, 140, 140, 141, 141, 142, - 142, 142, 142, 143, 143, 144, 144, 144, 145, 145, - 146, 146, 147, 147, 148, 148, 148, 149, 149, 150, - 150, 151, 152, 152, 153, 153, 154, 154, 154, 155, - 155, 157, 156, 158, 158, 159, 159, 160, 160, 160, - 161, 162, 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 163, 163, 163, 163, 163, 164, 164, - 165, 166, 167, 167, 168, 170, 169, 169, 169, 169, - 169, 169, 171, 171, 172, 172, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 174, 174, - 174, 175, 175, 176, 176, 176, 176, 176, 176, 176, - 176, 176, 176, 176, 176, 176, 176, 177, 177, 178, - 178, 179, 180, 180, 181, 181, 182, 182, 183, 183, - 183, 184, 184, 184, 184, 185, 185, 185, 185, 185, - 185, 185, 185, 185, 186, 186, 186, 186, 187, 187, - 188, 188, 188, 188, 188, 189, 190, 190, 191, 191, - 192, 192, 193, 193, 193, 194, 194, 195, 196, 197, - 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, - 202, 203, 202, 204, 204, 205, 205, 206, 206, 206, - 206, 206, 207, 207, 208, 208, 209, 209, 209, 210, - 210, 211, 212, 213, 213 +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const unsigned short yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 94, 352, 124, + 353, 354, 355, 356, 123, 125, 40, 41, 59, 44, + 58, 33, 46, 60, 64 }; - -static const short yyr2[] = { 0, - 1, 1, 2, 8, 0, 1, 3, 2, 1, 2, - 1, 4, 1, 0, 1, 1, 2, 2, 2, 2, - 2, 2, 0, 1, 1, 2, 1, 1, 1, 1, - 1, 0, 3, 1, 3, 2, 1, 2, 4, 1, - 3, 1, 1, 3, 3, 2, 1, 3, 1, 1, - 6, 1, 1, 0, 1, 1, 3, 1, 1, 4, - 4, 3, 6, 1, 3, 1, 3, 3, 1, 3, - 1, 1, 1, 3, 3, 3, 1, 1, 3, 2, - 1, 5, 0, 1, 1, 3, 2, 4, 4, 0, - 1, 0, 6, 1, 2, 1, 1, 1, 3, 3, - 2, 1, 1, 4, 4, 4, 4, 4, 1, 4, - 4, 1, 3, 1, 3, 3, 1, 3, 1, 3, - 1, 1, 1, 1, 4, 0, 3, 1, 1, 1, - 1, 1, 1, 3, 1, 2, 1, 1, 1, 1, - 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, - 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 1, 1, 4, 3, 4, 1, 3, - 5, 1, 3, 3, 3, 4, 3, 1, 3, 3, - 3, 3, 1, 1, 1, 2, 2, 3, 1, 1, - 1, 1, 1, 1, 1, 5, 1, 3, 1, 3, - 0, 1, 1, 1, 1, 1, 1, 3, 4, 1, - 3, 2, 3, 1, 3, 0, 1, 1, 2, 1, - 1, 0, 3, 2, 3, 1, 3, 1, 4, 4, - 1, 1, 1, 1, 0, 1, 1, 2, 2, 1, - 1, 1, 1, 1, 2 +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const unsigned char yyr1[] = +{ + 0, 115, 116, 117, 117, 118, 119, 119, 120, 120, + 121, 121, 122, 122, 122, 123, 123, 124, 124, 125, + 125, 125, 125, 125, 126, 126, 127, 127, 128, 128, + 128, 128, 128, 129, 128, 128, 130, 130, 131, 131, + 132, 133, 133, 134, 134, 135, 135, 135, 136, 136, + 137, 137, 138, 139, 139, 140, 140, 141, 141, 142, + 142, 143, 143, 143, 143, 144, 144, 145, 145, 145, + 146, 146, 147, 147, 148, 148, 149, 149, 149, 150, + 150, 151, 151, 152, 153, 153, 154, 154, 155, 155, + 155, 156, 156, 158, 157, 159, 159, 160, 160, 161, + 161, 161, 162, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 164, 164, 164, 164, 164, + 165, 165, 166, 167, 168, 168, 169, 171, 170, 170, + 170, 170, 170, 170, 172, 172, 173, 173, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 175, 175, 175, 176, 176, 177, 177, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 177, 177, 177, 178, + 178, 179, 179, 180, 181, 181, 182, 182, 183, 183, + 184, 184, 184, 185, 185, 185, 185, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 187, 187, 187, 187, + 188, 188, 189, 189, 189, 189, 189, 190, 191, 191, + 192, 192, 193, 193, 194, 194, 194, 195, 195, 196, + 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, + 202, 203, 203, 204, 203, 205, 205, 206, 206, 207, + 207, 207, 207, 207, 208, 208, 209, 209, 210, 210, + 210, 211, 211, 212, 213, 214, 214 }; -static const short yydefact[] = { 0, - 250, 251, 1, 2, 5, 3, 0, 0, 6, 253, - 13, 8, 0, 9, 11, 14, 7, 10, 0, 0, - 0, 0, 0, 0, 0, 15, 16, 0, 22, 20, - 18, 21, 19, 0, 17, 12, 23, 154, 0, 0, - 155, 156, 157, 0, 158, 159, 167, 160, 161, 162, - 163, 164, 165, 166, 0, 24, 25, 27, 28, 31, - 29, 30, 34, 0, 0, 32, 0, 46, 0, 47, - 49, 50, 36, 0, 37, 0, 40, 42, 43, 4, - 26, 245, 114, 252, 0, 137, 0, 0, 150, 144, - 148, 149, 138, 0, 0, 139, 143, 147, 0, 0, - 52, 53, 140, 117, 0, 33, 45, 44, 0, 35, - 38, 0, 0, 0, 247, 62, 0, 246, 0, 151, - 146, 145, 142, 141, 0, 64, 0, 66, 0, 0, - 0, 48, 5, 41, 0, 249, 248, 114, 252, 109, - 0, 0, 173, 173, 60, 61, 173, 112, 152, 140, - 102, 103, 0, 115, 116, 0, 0, 0, 0, 54, - 123, 124, 118, 119, 121, 128, 130, 129, 243, 244, - 126, 125, 132, 131, 0, 133, 39, 0, 85, 226, - 122, 0, 0, 0, 0, 0, 0, 0, 174, 175, - 0, 0, 101, 0, 153, 0, 0, 65, 68, 67, - 203, 204, 200, 0, 199, 205, 0, 58, 0, 0, - 0, 55, 56, 59, 182, 0, 188, 194, 193, 216, - 217, 201, 202, 0, 0, 0, 90, 0, 0, 228, - 226, 226, 87, 227, 0, 98, 0, 78, 81, 254, - 0, 113, 0, 0, 0, 73, 77, 0, 0, 179, - 0, 0, 0, 0, 242, 234, 0, 236, 241, 238, - 0, 69, 71, 72, 63, 195, 0, 0, 0, 0, - 0, 51, 0, 170, 171, 168, 169, 0, 0, 172, - 0, 0, 0, 0, 120, 135, 127, 134, 0, 82, - 91, 86, 232, 231, 230, 229, 83, 83, 110, 0, - 104, 0, 255, 80, 0, 0, 105, 0, 226, 177, - 0, 107, 0, 106, 108, 235, 0, 0, 111, 0, - 196, 197, 192, 190, 0, 218, 187, 57, 183, 184, - 185, 0, 191, 189, 0, 0, 220, 136, 0, 0, - 84, 88, 89, 99, 100, 79, 176, 76, 74, 75, - 180, 178, 237, 0, 0, 70, 198, 209, 0, 207, - 173, 186, 0, 222, 224, 219, 0, 92, 233, 0, - 240, 239, 206, 0, 211, 223, 0, 221, 0, 181, - 208, 214, 215, 213, 210, 212, 225, 96, 0, 94, - 97, 93, 95, 0, 0, 0 +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const unsigned char yyr2[] = +{ + 0, 2, 1, 1, 2, 8, 0, 1, 3, 2, + 1, 2, 1, 4, 1, 0, 1, 1, 2, 2, + 2, 2, 2, 2, 0, 1, 1, 2, 1, 1, + 1, 1, 1, 0, 3, 1, 3, 2, 1, 2, + 4, 1, 3, 1, 1, 3, 3, 2, 1, 3, + 1, 1, 6, 1, 1, 0, 1, 1, 3, 1, + 1, 4, 4, 3, 6, 1, 3, 1, 3, 3, + 1, 3, 1, 1, 1, 3, 3, 3, 1, 1, + 3, 2, 1, 5, 0, 1, 1, 3, 2, 4, + 4, 0, 1, 0, 6, 1, 2, 1, 1, 1, + 3, 3, 2, 1, 1, 4, 4, 4, 4, 4, + 1, 4, 4, 1, 3, 1, 3, 3, 1, 3, + 1, 3, 1, 1, 1, 1, 4, 0, 3, 1, + 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, + 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, + 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 4, 3, 4, + 1, 3, 5, 1, 3, 3, 3, 4, 3, 1, + 3, 3, 3, 3, 1, 1, 1, 2, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 5, 1, 3, + 1, 3, 0, 1, 1, 1, 1, 1, 1, 3, + 4, 1, 3, 2, 3, 1, 3, 0, 1, 1, + 2, 1, 1, 0, 3, 2, 3, 1, 3, 1, + 4, 4, 1, 1, 1, 1, 0, 1, 1, 2, + 2, 1, 1, 1, 1, 1, 2 }; -static const short yydefgoto[] = { 394, - 3, 4, 8, 9, 13, 14, 25, 26, 27, 55, - 56, 57, 106, 58, 74, 75, 76, 77, 59, 69, - 70, 60, 100, 211, 212, 213, 61, 125, 126, 261, - 262, 245, 246, 237, 238, 116, 342, 178, 179, 290, - 291, 379, 389, 390, 247, 263, 147, 148, 163, 164, - 180, 181, 62, 172, 225, 173, 287, 149, 150, 151, - 152, 278, 279, 281, 188, 189, 190, 249, 250, 215, - 268, 216, 217, 218, 359, 360, 385, 386, 219, 220, - 221, 336, 337, 364, 233, 234, 296, 340, 195, 257, - 258, 222, 117, 118, 153, 104, 223, 248 +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const unsigned short yydefact[] = +{ + 0, 251, 252, 0, 2, 3, 6, 1, 4, 0, + 0, 7, 254, 14, 9, 0, 10, 12, 15, 8, + 11, 0, 0, 0, 0, 0, 0, 0, 16, 17, + 0, 23, 21, 19, 22, 20, 0, 18, 13, 24, + 155, 0, 0, 156, 157, 158, 0, 159, 160, 168, + 161, 162, 163, 164, 165, 166, 167, 0, 25, 26, + 28, 29, 32, 30, 31, 35, 0, 0, 33, 0, + 47, 0, 48, 50, 51, 37, 0, 38, 0, 41, + 43, 44, 5, 27, 246, 115, 253, 0, 138, 0, + 0, 151, 145, 149, 150, 139, 0, 0, 140, 144, + 148, 0, 0, 53, 54, 141, 118, 0, 34, 46, + 45, 0, 36, 39, 0, 0, 0, 248, 63, 0, + 247, 0, 152, 147, 146, 143, 142, 0, 65, 0, + 67, 0, 0, 0, 49, 6, 42, 0, 250, 249, + 115, 253, 110, 0, 0, 174, 174, 61, 62, 174, + 113, 153, 141, 103, 104, 0, 116, 117, 0, 0, + 0, 0, 55, 124, 125, 119, 120, 122, 129, 131, + 130, 244, 245, 127, 126, 133, 132, 0, 134, 40, + 0, 86, 227, 123, 0, 0, 0, 0, 0, 0, + 0, 175, 176, 0, 0, 102, 0, 154, 0, 0, + 66, 69, 68, 204, 205, 201, 0, 200, 206, 0, + 59, 0, 0, 0, 56, 57, 60, 183, 0, 189, + 195, 194, 217, 218, 202, 203, 0, 0, 0, 91, + 0, 0, 229, 227, 227, 88, 228, 0, 99, 0, + 79, 82, 255, 0, 114, 0, 0, 0, 74, 78, + 0, 0, 180, 0, 0, 0, 0, 243, 235, 0, + 237, 242, 239, 0, 70, 72, 73, 64, 196, 0, + 0, 0, 0, 0, 52, 0, 171, 172, 169, 170, + 0, 0, 173, 0, 0, 0, 0, 121, 136, 128, + 135, 0, 83, 92, 87, 233, 232, 231, 230, 84, + 84, 111, 0, 105, 0, 256, 81, 0, 0, 106, + 0, 227, 178, 0, 108, 0, 107, 109, 236, 0, + 0, 112, 0, 197, 198, 193, 191, 0, 219, 188, + 58, 184, 185, 186, 0, 192, 190, 0, 0, 221, + 137, 0, 0, 85, 89, 90, 100, 101, 80, 177, + 77, 75, 76, 181, 179, 238, 0, 0, 71, 199, + 210, 0, 208, 174, 187, 0, 223, 225, 220, 0, + 93, 234, 0, 241, 240, 207, 0, 212, 224, 0, + 222, 0, 182, 209, 215, 216, 214, 211, 213, 226, + 97, 0, 95, 98, 94, 96 }; -static const short yypact[] = { 86, --32768,-32768, 86,-32768, -66,-32768, 12, 95,-32768,-32768, --32768,-32768, 14,-32768, 4, 217,-32768,-32768, 118, 97, - 56, 82, 121, 104, 195, 217,-32768, 115,-32768,-32768, --32768,-32768,-32768, 179,-32768,-32768, 446,-32768, 213, 23, --32768,-32768,-32768, 96,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 191, 446,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 212, 744,-32768, 133,-32768, 124,-32768, --32768,-32768,-32768, 45,-32768, -19,-32768,-32768,-32768,-32768, --32768, 20, 135,-32768, 164,-32768, 176, 197,-32768,-32768, --32768,-32768,-32768, 225, 199,-32768,-32768,-32768, 761, 275, --32768,-32768,-32768, 171, 282,-32768,-32768,-32768, 159,-32768, --32768, 86, 159, 182, 32,-32768, 607,-32768, 159,-32768, --32768,-32768,-32768,-32768, -30,-32768, 177, 184, 188, 236, - 54,-32768, -66,-32768, 236,-32768,-32768, 61, 192, 262, - 194, 231, 76, 77,-32768,-32768, -11,-32768,-32768, 196, --32768,-32768, 200,-32768,-32768, 302, 761, 299, 299, 140, --32768,-32768, 202,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 203,-32768,-32768, -24,-32768, 530, --32768, 283, 28, 255, 206, 24, 245, 241,-32768, 211, - 24, 251,-32768, 42,-32768, 385, 684,-32768,-32768,-32768, --32768,-32768,-32768, -31,-32768,-32768, 291,-32768, 86, 245, - 218, 215,-32768, 174, 226, 220, -31,-32768,-32768, 223, --32768,-32768,-32768, 236, 325, 299, 240, 236, 324,-32768, - 92, 92,-32768,-32768, 299, 227, -9,-32768,-32768, 233, - 684,-32768, 245, 269, 63,-32768,-32768, 684, 232, 93, - 684, 245, 100, 684,-32768,-32768, 103,-32768,-32768, 235, - 112,-32768,-32768,-32768,-32768, 229, 242, 83, 243, 239, - 238,-32768, 140,-32768,-32768,-32768,-32768, 245, 245,-32768, - 245, 245, 154, 244,-32768,-32768, 348,-32768, 271,-32768, --32768,-32768,-32768,-32768,-32768,-32768, 266, 266,-32768, 253, --32768, 28,-32768,-32768, 248, 684,-32768, 24, 92,-32768, - 257,-32768, 250,-32768,-32768,-32768, 16, 253,-32768, 385, --32768, 249,-32768,-32768, 35,-32768,-32768,-32768,-32768,-32768, --32768, 254,-32768,-32768, 10, 122,-32768,-32768, 259, 325, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, - 256,-32768,-32768, 265, 267,-32768,-32768,-32768, 134,-32768, - -11,-32768, 299, 261,-32768,-32768, 244,-32768, 348, 245, --32768,-32768,-32768, 35, 72, 261, 299,-32768, 190, 174, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 15,-32768, --32768,-32768,-32768, 366, 375,-32768 +/* YYDEFGOTO[NTERM-NUM]. */ +static const short yydefgoto[] = +{ + -1, 3, 4, 5, 10, 11, 15, 16, 27, 28, + 29, 57, 58, 59, 108, 60, 76, 77, 78, 79, + 61, 71, 72, 62, 102, 213, 214, 215, 63, 127, + 128, 263, 264, 247, 248, 239, 240, 118, 344, 180, + 181, 292, 293, 381, 391, 392, 249, 265, 149, 150, + 165, 166, 182, 183, 64, 174, 227, 175, 289, 151, + 152, 153, 154, 280, 281, 283, 190, 191, 192, 251, + 252, 217, 270, 218, 219, 220, 361, 362, 387, 388, + 221, 222, 223, 338, 339, 366, 235, 236, 298, 342, + 197, 259, 260, 224, 119, 120, 155, 106, 225, 250 }; -static const short yypgoto[] = {-32768, --32768, 373, 246,-32768,-32768, 364,-32768,-32768, 352,-32768, --32768, 327,-32768,-32768,-32768, 306,-32768, 268,-32768,-32768, - 276,-32768, 319,-32768,-32768, 113,-32768,-32768, 237,-32768, - 68, 201, 87,-32768, 88,-32768, 101,-32768, 170,-32768, --32768,-32768,-32768, 13, -167, -109, -44, -50,-32768, 180, - -173, -86,-32768,-32768,-32768, -232, 65, -54, -52,-32768, - 43,-32768,-32768,-32768, -143,-32768,-32768, -169, -157, 3, - 189,-32768, -174,-32768,-32768, 39,-32768,-32768,-32768,-32768, --32768,-32768, 47, 53, -154,-32768,-32768,-32768,-32768,-32768, - 102, -122,-32768, 178, 2,-32768, -7, -166 +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -255 +static const short yypact[] = +{ + 89, -255, -255, 64, 89, -255, -25, -255, -255, 33, + 79, -255, -255, -255, -255, 52, -255, -8, 180, -255, + -255, 147, 91, 77, 80, 119, 96, 183, 180, -255, + 120, -255, -255, -255, -255, -255, 177, -255, -255, 414, + -255, 205, 28, -255, -255, -255, 131, -255, -255, -255, + -255, -255, -255, -255, -255, -255, -255, 196, 414, -255, + -255, -255, -255, -255, -255, -255, 182, 712, -255, 142, + -255, 32, -255, -255, -255, -255, 13, -255, -12, -255, + -255, -255, -255, -255, 1, 141, -255, 188, -255, 206, + 201, -255, -255, -255, -255, -255, 237, 208, -255, -255, + -255, 729, 287, -255, -255, -255, 185, 296, -255, -255, + -255, 249, -255, -255, 89, 249, 210, 76, -255, 575, + -255, 249, -255, -255, -255, -255, -255, -2, -255, 202, + 207, 211, 133, 78, -255, -25, -255, 133, -255, -255, + -41, 215, 274, 216, 254, 110, 127, -255, -255, -28, + -255, -255, 223, -255, -255, 225, -255, -255, 327, 729, + 323, 323, 246, -255, -255, 221, -255, -255, -255, -255, + -255, -255, -255, -255, -255, -255, -255, 224, -255, -255, + 92, -255, 498, -255, 312, 6, 259, 232, -3, 49, + 271, -255, 234, -3, 275, -255, 60, -255, 353, 652, + -255, -255, -255, -255, -255, -255, -20, -255, -255, 315, + -255, 89, 49, 241, 233, -255, 144, 251, 245, -20, + -255, -255, 250, -255, -255, -255, 133, 349, 323, 260, + 133, 258, -255, -13, -13, -255, -255, 323, 247, 94, + -255, -255, 256, 652, -255, 49, 289, 104, -255, -255, + 652, 253, 139, 652, 49, 125, 652, -255, -255, 174, + -255, -255, 257, 176, -255, -255, -255, -255, 255, 265, + 160, 268, 264, 267, -255, 246, -255, -255, -255, -255, + 49, 49, -255, 49, 49, 165, 269, -255, -255, 369, + -255, 299, -255, -255, -255, -255, -255, -255, -255, 290, + 290, -255, 266, -255, 6, -255, -255, 277, 652, -255, + -3, -13, -255, 280, -255, 278, -255, -255, -255, 65, + 266, -255, 353, -255, 273, -255, -255, 20, -255, -255, + -255, -255, -255, -255, 281, -255, -255, 15, 191, -255, + -255, 283, 349, -255, -255, -255, -255, -255, -255, -255, + -255, -255, -255, 282, -255, -255, 285, 288, -255, -255, + -255, 199, -255, -28, -255, 323, 284, -255, -255, 269, + -255, 369, 49, -255, -255, -255, 20, 23, 284, 323, + -255, 146, 144, -255, -255, -255, -255, -255, -255, -255, + -255, 18, -255, -255, -255, -255 }; - -#define YYLAST 852 - - -static const short yytable[] = { 15, - 192, 5, 214, 193, 5, 15, 232, 146, 174, 102, - 102, 103, 103, 101, 101, 239, 241, 10, 388, 10, - 11, 10, 11, 10, 169, 170, 112, 161, 162, 65, - 10, 10, 72, 1, 2, 10, 79, 7, 64, 67, - 271, 71, 10, 165, 127, 78, 103, 114, 65, 10, - 169, 170, 10, 244, 295, 1, 2, 64, 166, 167, - 168, 10, 169, 170, 1, 2, 79, 344, 185, 266, - 231, 259, 136, 305, 156, 78, 297, 298, 157, 63, - 227, 267, 313, 137, 228, 354, 382, 265, 201, 113, - 10, 169, 170, 324, 187, 301, 1, 2, 63, 302, - 128, 72, 127, 10, 103, 79, 1, 2, 334, 19, - 71, 155, 332, 133, 78, 214, 12, 255, 17, 392, - 154, 363, 115, 176, 229, 236, 28, 202, 16, 236, - 68, 304, 175, 242, 239, 241, 358, 165, 309, 30, - 383, 73, 323, 255, 384, 201, 256, 10, 169, 170, - 199, 200, 110, 29, 350, 185, 185, 171, 128, 201, - 230, 10, 169, 170, -250, 31, 10, 307, 206, 1, - 2, 308, 119, 32, 294, 240, 103, 345, 240, 186, - 191, 187, 187, 240, 202, 203, 260, 33, 264, 274, - 275, 276, 277, 388, 259, 355, 348, 34, 202, 37, - 204, 311, 161, 162, 314, 391, 312, 316, 308, 315, - 270, 317, 380, 333, 82, 391, 319, 375, 288, 205, - 320, 36, 83, 84, 66, 206, 366, 299, 20, 80, - 367, 108, 109, 85, 207, 86, 21, 87, 373, 206, - 107, 208, 374, 209, 120, 210, 119, 88, 161, 162, - 201, 89, 10, 169, 170, 90, 121, 22, 91, 23, - 10, 169, 170, 1, 2, 83, 84, 122, 24, 92, - 274, 275, 276, 277, 93, 123, 94, 129, 95, 124, - 329, 330, 130, 331, 131, 135, 158, 96, 97, 202, - 203, 160, 176, 159, 240, -251, 182, 183, 184, 194, - 240, 175, 98, 196, 197, 204, 10, 235, 251, 260, - 176, 243, 264, 224, 226, 99, 252, 361, 254, 175, - 269, 280, 272, 273, 205, 282, 284, 365, 286, 201, - 206, 10, 169, 170, 289, 115, 306, 300, 310, 207, - 318, 321, 322, 326, 327, 85, 325, 86, 209, 87, - 210, 338, 339, 341, 347, 365, 352, 335, 351, 88, - 362, 357, 368, 89, 370, 395, 361, 90, 202, 387, - 91, 371, 377, 372, 396, 6, 18, 35, 177, 111, - 134, 92, 81, 105, 132, 328, 93, 356, 94, 346, - 95, 253, 10, 198, 349, 138, 139, 292, 343, 96, - 97, 393, 140, 285, 369, 283, 85, 38, 86, 206, - 87, 141, 381, 378, 98, 376, 0, 303, 353, 0, - 88, 0, 0, 0, 89, 0, 0, 293, 90, 0, - 0, 91, 41, 42, 43, 0, 0, 0, 0, 0, - 142, 0, 92, 45, 0, 0, 0, 93, 46, 94, - 47, 95, 0, 10, 0, 0, 1, 2, 48, 0, - 96, 97, 143, 144, 0, 0, 0, 49, 38, 50, - 0, 0, 0, 0, 51, 98, 52, 53, 54, 0, - 0, 0, 0, 39, 0, 0, 0, 40, 0, 0, - 0, 0, 0, 41, 42, 43, 0, 0, 0, 44, - 0, 0, 0, 0, 45, 0, 0, 0, 0, 46, - 0, 47, 0, 0, 0, 0, 0, 0, 0, 48, - 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, - 50, 0, 0, 0, 0, 51, 0, 52, 53, 54, - 138, 139, 161, 162, 0, 0, 0, 140, 0, 0, - 0, 85, 38, 86, 0, 87, 141, 0, 0, 0, - 0, 0, 229, 0, 0, 88, 0, 0, 0, 89, - 0, 0, 0, 90, 0, 0, 91, 41, 42, 43, - 0, 0, 0, 0, 0, 142, 0, 92, 45, 0, - 0, 0, 93, 46, 94, 47, 95, 0, 230, 0, - 0, 0, 0, 48, 0, 96, 97, 143, 144, 0, - 0, 0, 49, 0, 50, 0, 0, 138, 139, 51, - 98, 52, 53, 54, 140, 0, 0, 0, 85, 38, - 86, 0, 87, 141, 0, 0, 0, 0, 0, 0, - 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, - 90, 0, 0, 91, 41, 42, 43, 0, 0, 0, - 0, 0, 142, 0, 92, 45, 0, 0, 0, 93, - 46, 94, 47, 95, 0, 0, 0, 0, 0, 0, - 48, 0, 96, 97, 143, 144, 0, 0, 0, 49, - 0, 50, 0, 145, 138, 139, 51, 98, 52, 53, - 54, 140, 0, 0, 0, 85, 38, 86, 0, 87, - 141, 0, 0, 0, 0, 0, 0, 0, 0, 88, - 0, 0, 0, 89, 0, 0, 0, 90, 0, 0, - 91, 41, 42, 43, 0, 0, 0, 0, 0, 142, - 0, 92, 45, 0, 0, 0, 93, 46, 94, 47, - 95, 0, 0, 0, 83, 84, 0, 48, 0, 96, - 97, 143, 144, 0, 0, 85, 49, 86, 50, 87, - 0, 1, 2, 51, 98, 52, 53, 54, 0, 88, - 0, 0, 85, 89, 86, 0, 87, 90, 0, 0, - 91, 0, 0, 0, 0, 0, 88, 0, 0, 0, - 89, 92, 0, 0, 90, 0, 93, 91, 94, 0, - 95, 0, 0, 0, 0, 0, 0, 0, 92, 96, - 97, 0, 0, 93, 0, 94, 0, 95, 0, 0, - 0, 0, 0, 0, 98, 0, 96, 97, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 98 +/* YYPGOTO[NTERM-NUM]. */ +static const short yypgoto[] = +{ + -255, -255, -255, 386, 263, -255, -255, 379, -255, -255, + 371, -255, -255, 346, -255, -255, -255, 329, -255, 291, + -255, -255, 297, -255, 340, -255, -255, 135, -255, -255, + 262, -255, 93, 220, 113, -255, 124, -255, 114, -255, + 194, -255, -255, -255, -255, 42, -172, -117, -209, -55, + -255, 209, -179, -106, -255, -255, -255, -254, 97, -50, + -48, -255, -4, -255, -255, -255, -139, -255, -255, -96, + -161, -18, 222, -255, -140, -255, -255, 58, -255, -255, + -255, -255, -255, -255, 71, 83, -157, -255, -255, -255, + -255, -255, 123, -124, -255, 212, 4, -255, -9, -170 }; -static const short yycheck[] = { 7, - 144, 0, 160, 147, 3, 13, 180, 117, 131, 64, - 65, 64, 65, 64, 65, 183, 183, 8, 4, 8, - 9, 8, 9, 8, 9, 10, 46, 13, 14, 37, - 8, 8, 40, 11, 12, 8, 44, 104, 37, 17, - 210, 40, 8, 130, 99, 44, 99, 28, 56, 8, - 9, 10, 8, 30, 229, 11, 12, 56, 5, 6, - 7, 8, 9, 10, 11, 12, 74, 300, 80, 101, - 180, 194, 41, 243, 105, 74, 231, 232, 109, 37, - 105, 113, 252, 52, 109, 318, 15, 197, 6, 109, - 8, 9, 10, 268, 106, 105, 11, 12, 56, 109, - 99, 109, 157, 8, 157, 113, 11, 12, 283, 106, - 109, 119, 282, 112, 113, 273, 105, 102, 105, 105, - 119, 112, 103, 131, 33, 102, 9, 45, 34, 102, - 108, 241, 131, 184, 302, 302, 102, 224, 248, 84, - 69, 46, 60, 102, 73, 6, 105, 8, 9, 10, - 158, 159, 108, 57, 309, 80, 80, 104, 157, 6, - 69, 8, 9, 10, 104, 84, 8, 105, 86, 11, - 12, 109, 112, 53, 229, 183, 229, 300, 186, 104, - 104, 106, 106, 191, 45, 46, 194, 84, 196, 97, - 98, 99, 100, 4, 317, 318, 306, 3, 45, 21, - 61, 109, 13, 14, 105, 379, 251, 105, 109, 254, - 209, 109, 370, 60, 3, 389, 105, 361, 226, 80, - 109, 107, 11, 12, 12, 86, 105, 235, 12, 39, - 109, 108, 109, 22, 95, 24, 20, 26, 105, 86, - 108, 102, 109, 104, 81, 106, 112, 36, 13, 14, - 6, 40, 8, 9, 10, 44, 81, 41, 47, 43, - 8, 9, 10, 11, 12, 11, 12, 71, 52, 58, - 97, 98, 99, 100, 63, 51, 65, 3, 67, 81, - 278, 279, 112, 281, 3, 104, 110, 76, 77, 45, - 46, 104, 300, 110, 302, 104, 35, 104, 68, 104, - 308, 300, 91, 104, 3, 61, 8, 25, 68, 317, - 318, 106, 320, 112, 112, 104, 106, 325, 68, 318, - 30, 96, 105, 109, 80, 106, 104, 335, 4, 6, - 86, 8, 9, 10, 95, 103, 68, 111, 107, 95, - 106, 113, 101, 105, 107, 22, 104, 24, 104, 26, - 106, 4, 82, 88, 107, 363, 107, 114, 102, 36, - 107, 113, 104, 40, 109, 0, 374, 44, 45, 377, - 47, 107, 112, 107, 0, 3, 13, 26, 133, 74, - 113, 58, 56, 65, 109, 273, 63, 320, 65, 302, - 67, 191, 8, 157, 308, 11, 12, 228, 298, 76, - 77, 389, 18, 224, 340, 217, 22, 23, 24, 86, - 26, 27, 374, 367, 91, 363, -1, 240, 317, -1, - 36, -1, -1, -1, 40, -1, -1, 104, 44, -1, - -1, 47, 48, 49, 50, -1, -1, -1, -1, -1, - 56, -1, 58, 59, -1, -1, -1, 63, 64, 65, - 66, 67, -1, 8, -1, -1, 11, 12, 74, -1, - 76, 77, 78, 79, -1, -1, -1, 83, 23, 85, - -1, -1, -1, -1, 90, 91, 92, 93, 94, -1, - -1, -1, -1, 38, -1, -1, -1, 42, -1, -1, - -1, -1, -1, 48, 49, 50, -1, -1, -1, 54, - -1, -1, -1, -1, 59, -1, -1, -1, -1, 64, - -1, 66, -1, -1, -1, -1, -1, -1, -1, 74, - -1, -1, -1, -1, -1, -1, -1, -1, 83, -1, - 85, -1, -1, -1, -1, 90, -1, 92, 93, 94, - 11, 12, 13, 14, -1, -1, -1, 18, -1, -1, - -1, 22, 23, 24, -1, 26, 27, -1, -1, -1, - -1, -1, 33, -1, -1, 36, -1, -1, -1, 40, - -1, -1, -1, 44, -1, -1, 47, 48, 49, 50, - -1, -1, -1, -1, -1, 56, -1, 58, 59, -1, - -1, -1, 63, 64, 65, 66, 67, -1, 69, -1, - -1, -1, -1, 74, -1, 76, 77, 78, 79, -1, - -1, -1, 83, -1, 85, -1, -1, 11, 12, 90, - 91, 92, 93, 94, 18, -1, -1, -1, 22, 23, - 24, -1, 26, 27, -1, -1, -1, -1, -1, -1, - -1, -1, 36, -1, -1, -1, 40, -1, -1, -1, - 44, -1, -1, 47, 48, 49, 50, -1, -1, -1, - -1, -1, 56, -1, 58, 59, -1, -1, -1, 63, - 64, 65, 66, 67, -1, -1, -1, -1, -1, -1, - 74, -1, 76, 77, 78, 79, -1, -1, -1, 83, - -1, 85, -1, 87, 11, 12, 90, 91, 92, 93, - 94, 18, -1, -1, -1, 22, 23, 24, -1, 26, - 27, -1, -1, -1, -1, -1, -1, -1, -1, 36, - -1, -1, -1, 40, -1, -1, -1, 44, -1, -1, - 47, 48, 49, 50, -1, -1, -1, -1, -1, 56, - -1, 58, 59, -1, -1, -1, 63, 64, 65, 66, - 67, -1, -1, -1, 11, 12, -1, 74, -1, 76, - 77, 78, 79, -1, -1, 22, 83, 24, 85, 26, - -1, 11, 12, 90, 91, 92, 93, 94, -1, 36, - -1, -1, 22, 40, 24, -1, 26, 44, -1, -1, - 47, -1, -1, -1, -1, -1, 36, -1, -1, -1, - 40, 58, -1, -1, 44, -1, 63, 47, 65, -1, - 67, -1, -1, -1, -1, -1, -1, -1, 58, 76, - 77, -1, -1, 63, -1, 65, -1, 67, -1, -1, - -1, -1, -1, -1, 91, -1, 76, 77, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 91 +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, parse error. */ +#define YYTABLE_NINF -253 +static const short yytable[] = +{ + 17, 216, 148, 234, 6, 12, 17, 194, 6, 176, + 195, 103, 103, 241, 12, 243, 104, 104, 105, 105, + 231, 12, 390, 12, 1, 2, 167, 246, 12, 116, + 67, 163, 164, 74, 114, 65, 12, 81, 384, 1, + 2, 12, 13, 66, 314, 69, 73, 317, 346, 67, + 80, 129, 187, 105, 65, 203, 232, 12, 171, 172, + 12, 13, 66, -251, 7, 233, 356, 81, 12, 171, + 172, 121, 261, 12, 171, 172, 299, 300, 189, 9, + 80, 268, 267, 168, 169, 170, 12, 171, 172, 1, + 2, 297, 385, 269, 204, 205, 386, 115, 21, 238, + 1, 2, 74, 158, 117, 130, 81, 159, 238, 129, + 206, 105, 157, 18, 216, 73, 273, 138, 135, 80, + 167, 112, 360, 394, 178, 156, 306, 365, 139, 207, + 326, 244, 241, 311, 243, 208, 70, 177, 14, 12, + 110, 111, 1, 2, 209, 336, 163, 164, 31, 307, + 390, 201, 202, 211, 352, 212, 30, 19, 315, 163, + 164, 32, 257, 130, 33, 258, 203, 257, 12, 171, + 172, 203, 34, 12, 171, 172, 242, 75, 347, 242, + 35, 296, 173, 105, 242, 84, 36, 262, 334, 266, + 187, 350, 22, 85, 86, 261, 357, 229, 39, 303, + 23, 230, 393, 304, 87, 204, 88, 187, 89, 309, + 204, 382, 393, 310, 188, 272, 189, 68, 90, 290, + 325, 24, 91, 25, 377, 335, 92, 38, 301, 93, + 316, 193, 26, 189, 310, 82, 276, 277, 278, 279, + 94, 276, 277, 278, 279, 95, 208, 96, 313, 97, + 109, 208, 203, 121, 12, 171, 172, 12, 98, 99, + 1, 2, 331, 332, 203, 333, 12, 171, 172, 122, + 85, 86, 124, 100, 12, 171, 172, 1, 2, 318, + 87, 321, 88, 319, 89, 322, 101, 123, 125, 126, + 131, 204, 205, 178, 90, 242, 368, 132, 91, 133, + 369, 242, 92, 204, 375, 93, 177, 206, 376, 184, + 262, 178, 160, 266, 137, 162, 94, 161, 363, -252, + 185, 95, 186, 96, 177, 97, 207, 196, 367, 198, + 199, 12, 208, 226, 98, 99, 228, 237, 245, 253, + 254, 209, 275, 256, 208, 271, 274, 282, 210, 100, + 211, 284, 212, 288, 286, 291, 367, 308, 302, 117, + 312, 12, 295, 320, 140, 141, 324, 363, 323, 328, + 389, 142, 327, 340, 329, 87, 40, 88, 343, 89, + 143, 341, 353, 337, 349, 354, 359, 370, 364, 90, + 8, 372, 373, 91, 20, 374, 379, 92, 179, 37, + 93, 43, 44, 45, 83, 113, 136, 107, 134, 144, + 330, 94, 47, 255, 345, 358, 95, 48, 96, 49, + 97, 200, 12, 351, 294, 1, 2, 50, 348, 98, + 99, 145, 146, 395, 383, 287, 51, 40, 52, 371, + 380, 285, 355, 53, 100, 54, 55, 56, 378, 0, + 0, 0, 41, 0, 305, 0, 42, 0, 0, 0, + 0, 0, 43, 44, 45, 0, 0, 0, 46, 0, + 0, 0, 0, 47, 0, 0, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, + 0, 0, 0, 0, 0, 0, 0, 51, 0, 52, + 0, 0, 0, 0, 53, 0, 54, 55, 56, 140, + 141, 163, 164, 0, 0, 0, 142, 0, 0, 0, + 87, 40, 88, 0, 89, 143, 0, 0, 0, 0, + 0, 231, 0, 0, 90, 0, 0, 0, 91, 0, + 0, 0, 92, 0, 0, 93, 43, 44, 45, 0, + 0, 0, 0, 0, 144, 0, 94, 47, 0, 0, + 0, 95, 48, 96, 49, 97, 0, 232, 0, 0, + 0, 0, 50, 0, 98, 99, 145, 146, 0, 0, + 0, 51, 0, 52, 0, 0, 140, 141, 53, 100, + 54, 55, 56, 142, 0, 0, 0, 87, 40, 88, + 0, 89, 143, 0, 0, 0, 0, 0, 0, 0, + 0, 90, 0, 0, 0, 91, 0, 0, 0, 92, + 0, 0, 93, 43, 44, 45, 0, 0, 0, 0, + 0, 144, 0, 94, 47, 0, 0, 0, 95, 48, + 96, 49, 97, 0, 0, 0, 0, 0, 0, 50, + 0, 98, 99, 145, 146, 0, 0, 0, 51, 0, + 52, 0, 147, 140, 141, 53, 100, 54, 55, 56, + 142, 0, 0, 0, 87, 40, 88, 0, 89, 143, + 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, + 0, 0, 91, 0, 0, 0, 92, 0, 0, 93, + 43, 44, 45, 0, 0, 0, 0, 0, 144, 0, + 94, 47, 0, 0, 0, 95, 48, 96, 49, 97, + 0, 0, 0, 85, 86, 0, 50, 0, 98, 99, + 145, 146, 0, 0, 87, 51, 88, 52, 89, 0, + 1, 2, 53, 100, 54, 55, 56, 0, 90, 0, + 0, 87, 91, 88, 0, 89, 92, 0, 0, 93, + 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, + 94, 0, 0, 92, 0, 95, 93, 96, 0, 97, + 0, 0, 0, 0, 0, 0, 0, 94, 98, 99, + 0, 0, 95, 0, 96, 0, 97, 0, 0, 0, + 0, 0, 0, 100, 0, 98, 99, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 100 }; -/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "/usr/share/bison.simple" -/* This file comes from bison-1.28. */ - -/* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ +static const short yycheck[] = +{ + 9, 162, 119, 182, 0, 8, 15, 146, 4, 133, + 149, 66, 67, 185, 8, 185, 66, 67, 66, 67, + 33, 8, 4, 8, 11, 12, 132, 30, 8, 28, + 39, 13, 14, 42, 46, 39, 8, 46, 15, 11, + 12, 8, 9, 39, 253, 17, 42, 256, 302, 58, + 46, 101, 80, 101, 58, 6, 69, 8, 9, 10, + 8, 9, 58, 104, 0, 182, 320, 76, 8, 9, + 10, 112, 196, 8, 9, 10, 233, 234, 106, 104, + 76, 101, 199, 5, 6, 7, 8, 9, 10, 11, + 12, 231, 69, 113, 45, 46, 73, 109, 106, 102, + 11, 12, 111, 105, 103, 101, 115, 109, 102, 159, + 61, 159, 121, 34, 275, 111, 212, 41, 114, 115, + 226, 108, 102, 105, 133, 121, 243, 112, 52, 80, + 270, 186, 304, 250, 304, 86, 108, 133, 105, 8, + 108, 109, 11, 12, 95, 285, 13, 14, 57, 245, + 4, 160, 161, 104, 311, 106, 9, 105, 254, 13, + 14, 84, 102, 159, 84, 105, 6, 102, 8, 9, + 10, 6, 53, 8, 9, 10, 185, 46, 302, 188, + 84, 231, 104, 231, 193, 3, 3, 196, 284, 198, + 80, 308, 12, 11, 12, 319, 320, 105, 21, 105, + 20, 109, 381, 109, 22, 45, 24, 80, 26, 105, + 45, 372, 391, 109, 104, 211, 106, 12, 36, 228, + 60, 41, 40, 43, 363, 60, 44, 107, 237, 47, + 105, 104, 52, 106, 109, 39, 97, 98, 99, 100, + 58, 97, 98, 99, 100, 63, 86, 65, 109, 67, + 108, 86, 6, 112, 8, 9, 10, 8, 76, 77, + 11, 12, 280, 281, 6, 283, 8, 9, 10, 81, + 11, 12, 71, 91, 8, 9, 10, 11, 12, 105, + 22, 105, 24, 109, 26, 109, 104, 81, 51, 81, + 3, 45, 46, 302, 36, 304, 105, 112, 40, 3, + 109, 310, 44, 45, 105, 47, 302, 61, 109, 35, + 319, 320, 110, 322, 104, 104, 58, 110, 327, 104, + 104, 63, 68, 65, 320, 67, 80, 104, 337, 104, + 3, 8, 86, 112, 76, 77, 112, 25, 106, 68, + 106, 95, 109, 68, 86, 30, 105, 96, 102, 91, + 104, 106, 106, 4, 104, 95, 365, 68, 111, 103, + 107, 8, 104, 106, 11, 12, 101, 376, 113, 105, + 379, 18, 104, 4, 107, 22, 23, 24, 88, 26, + 27, 82, 102, 114, 107, 107, 113, 104, 107, 36, + 4, 109, 107, 40, 15, 107, 112, 44, 135, 28, + 47, 48, 49, 50, 58, 76, 115, 67, 111, 56, + 275, 58, 59, 193, 300, 322, 63, 64, 65, 66, + 67, 159, 8, 310, 230, 11, 12, 74, 304, 76, + 77, 78, 79, 391, 376, 226, 83, 23, 85, 342, + 369, 219, 319, 90, 91, 92, 93, 94, 365, -1, + -1, -1, 38, -1, 242, -1, 42, -1, -1, -1, + -1, -1, 48, 49, 50, -1, -1, -1, 54, -1, + -1, -1, -1, 59, -1, -1, -1, -1, 64, -1, + 66, -1, -1, -1, -1, -1, -1, -1, 74, -1, + -1, -1, -1, -1, -1, -1, -1, 83, -1, 85, + -1, -1, -1, -1, 90, -1, 92, 93, 94, 11, + 12, 13, 14, -1, -1, -1, 18, -1, -1, -1, + 22, 23, 24, -1, 26, 27, -1, -1, -1, -1, + -1, 33, -1, -1, 36, -1, -1, -1, 40, -1, + -1, -1, 44, -1, -1, 47, 48, 49, 50, -1, + -1, -1, -1, -1, 56, -1, 58, 59, -1, -1, + -1, 63, 64, 65, 66, 67, -1, 69, -1, -1, + -1, -1, 74, -1, 76, 77, 78, 79, -1, -1, + -1, 83, -1, 85, -1, -1, 11, 12, 90, 91, + 92, 93, 94, 18, -1, -1, -1, 22, 23, 24, + -1, 26, 27, -1, -1, -1, -1, -1, -1, -1, + -1, 36, -1, -1, -1, 40, -1, -1, -1, 44, + -1, -1, 47, 48, 49, 50, -1, -1, -1, -1, + -1, 56, -1, 58, 59, -1, -1, -1, 63, 64, + 65, 66, 67, -1, -1, -1, -1, -1, -1, 74, + -1, 76, 77, 78, 79, -1, -1, -1, 83, -1, + 85, -1, 87, 11, 12, 90, 91, 92, 93, 94, + 18, -1, -1, -1, 22, 23, 24, -1, 26, 27, + -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, + -1, -1, 40, -1, -1, -1, 44, -1, -1, 47, + 48, 49, 50, -1, -1, -1, -1, -1, 56, -1, + 58, 59, -1, -1, -1, 63, 64, 65, 66, 67, + -1, -1, -1, 11, 12, -1, 74, -1, 76, 77, + 78, 79, -1, -1, 22, 83, 24, 85, 26, -1, + 11, 12, 90, 91, 92, 93, 94, -1, 36, -1, + -1, 22, 40, 24, -1, 26, 44, -1, -1, 47, + -1, -1, -1, -1, -1, 36, -1, -1, -1, 40, + 58, -1, -1, 44, -1, 63, 47, 65, -1, 67, + -1, -1, -1, -1, -1, -1, -1, 58, 76, 77, + -1, -1, 63, -1, 65, -1, 67, -1, -1, -1, + -1, -1, -1, 91, -1, 76, 77, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 91 +}; -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const unsigned char yystos[] = +{ + 0, 11, 12, 116, 117, 118, 211, 0, 118, 104, + 119, 120, 8, 9, 105, 121, 122, 213, 34, 105, + 122, 106, 12, 20, 41, 43, 52, 123, 124, 125, + 9, 57, 84, 84, 53, 84, 3, 125, 107, 21, + 23, 38, 42, 48, 49, 50, 54, 59, 64, 66, + 74, 83, 85, 90, 92, 93, 94, 126, 127, 128, + 130, 135, 138, 143, 169, 177, 211, 213, 12, 17, + 108, 136, 137, 211, 213, 46, 131, 132, 133, 134, + 211, 213, 39, 128, 3, 11, 12, 22, 24, 26, + 36, 40, 44, 47, 58, 63, 65, 67, 76, 77, + 91, 104, 139, 164, 174, 175, 212, 139, 129, 108, + 108, 109, 108, 132, 46, 109, 28, 103, 152, 209, + 210, 112, 81, 81, 71, 51, 81, 144, 145, 174, + 211, 3, 112, 3, 137, 211, 134, 104, 41, 52, + 11, 12, 18, 27, 56, 78, 79, 87, 162, 163, + 164, 174, 175, 176, 177, 211, 211, 213, 105, 109, + 110, 110, 104, 13, 14, 165, 166, 168, 5, 6, + 7, 9, 10, 104, 170, 172, 208, 211, 213, 119, + 154, 155, 167, 168, 35, 104, 68, 80, 104, 106, + 181, 182, 183, 104, 181, 181, 104, 205, 104, 3, + 145, 213, 213, 6, 45, 46, 61, 80, 86, 95, + 102, 104, 106, 140, 141, 142, 185, 186, 188, 189, + 190, 195, 196, 197, 208, 213, 112, 171, 112, 105, + 109, 33, 69, 162, 167, 201, 202, 25, 102, 150, + 151, 161, 213, 214, 164, 106, 30, 148, 149, 161, + 214, 184, 185, 68, 106, 148, 68, 102, 105, 206, + 207, 208, 213, 146, 147, 162, 213, 162, 101, 113, + 187, 30, 211, 184, 105, 109, 97, 98, 99, 100, + 178, 179, 96, 180, 106, 187, 104, 166, 4, 173, + 213, 95, 156, 157, 155, 104, 174, 189, 203, 201, + 201, 213, 111, 105, 109, 210, 162, 184, 68, 105, + 109, 162, 107, 109, 163, 184, 105, 163, 105, 109, + 106, 105, 109, 113, 101, 60, 189, 104, 105, 107, + 142, 186, 186, 186, 184, 60, 189, 114, 198, 199, + 4, 82, 204, 88, 153, 153, 172, 208, 151, 107, + 162, 149, 201, 102, 107, 207, 172, 208, 147, 113, + 102, 191, 192, 213, 107, 112, 200, 213, 105, 109, + 104, 173, 109, 107, 107, 105, 109, 181, 200, 112, + 199, 158, 185, 192, 15, 69, 73, 193, 194, 213, + 4, 159, 160, 167, 105, 160 +}; -#ifndef YYSTACK_USE_ALLOCA -#ifdef alloca -#define YYSTACK_USE_ALLOCA -#else /* alloca not defined */ -#ifdef __GNUC__ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) -#define YYSTACK_USE_ALLOCA -#include -#else /* not sparc */ -/* We think this test detects Watcom and Microsoft C. */ -/* This used to test MSDOS, but that is a bad idea - since that symbol is in the user namespace. */ -#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) -#if 0 /* No need for malloc.h, which pollutes the namespace; - instead, just don't use alloca. */ -#include +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ #endif -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) -/* I don't know what this was needed for, but it pollutes the namespace. - So I turned it off. rms, 2 May 1997. */ -/* #include */ - #pragma alloca -#define YYSTACK_USE_ALLOCA -#else /* not MSDOS, or __TURBOC__, or _AIX */ -#if 0 -#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up, - and on HPUX 10. Eventually we can turn this on. */ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#endif /* __hpux */ +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t #endif -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc */ -#endif /* not GNU C */ -#endif /* alloca not defined */ -#endif /* YYSTACK_USE_ALLOCA not defined */ - -#ifdef YYSTACK_USE_ALLOCA -#define YYSTACK_ALLOC alloca -#else -#define YYSTACK_ALLOC malloc +#if ! defined (YYSIZE_T) +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int #endif - -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY -2 #define YYEOF 0 + #define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab +#define YYABORT goto yyabortlab #define YYERROR goto yyerrlab1 -/* Like YYERROR except do call yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ + #define YYFAIL goto yyerrlab + #define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(token, value) \ + +#define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ - { yychar = (token), yylval = (value); \ + { \ + yychar = (Token); \ + yylval = (Value); \ yychar1 = YYTRANSLATE (yychar); \ YYPOPSTACK; \ goto yybackup; \ } \ else \ - { yyerror ("syntax error: cannot back up"); YYERROR; } \ + { \ + yyerror ("syntax error: cannot back up"); \ + YYERROR; \ + } \ while (0) #define YYTERROR 1 #define YYERRCODE 256 -#ifndef YYPURE -#define YYLEX yylex() -#endif +/* YYLLOC_DEFAULT -- Compute the default location (before the actions + are run). */ -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval, &yylloc) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + Current.first_line = Rhs[1].first_line; \ + Current.first_column = Rhs[1].first_column; \ + Current.last_line = Rhs[N].last_line; \ + Current.last_column = Rhs[N].last_column; #endif -#else /* not YYLSP_NEEDED */ -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval) -#endif -#endif /* not YYLSP_NEEDED */ + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#define YYLEX yylex () + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) +# define YYDSYMPRINT(Args) \ +do { \ + if (yydebug) \ + yysymprint Args; \ +} while (0) +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YYDSYMPRINT(Args) +#endif /* !YYDEBUG */ + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 #endif -/* If nonreentrant, generate the variables here */ +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). -#ifndef YYPURE + Do not make this value too large; the results are undefined if + SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ -int yychar; /* the lookahead symbol */ -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ +#if YYMAXDEPTH == 0 +# undef YYMAXDEPTH +#endif -#ifdef YYLSP_NEEDED -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 #endif -int yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ + -#if YYDEBUG != 0 -int yydebug; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ -#endif +#if YYERROR_VERBOSE -/* YYINITDEPTH indicates the initial size of the parser's stacks */ +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif +{ + register const char *yys = yystr; -#ifndef YYINITDEPTH -#define YYINITDEPTH 200 -#endif + while (*yys++ != '\0') + continue; -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ + return yys - yystr - 1; +} +# endif +# endif + +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif +{ + register char *yyd = yydest; + register const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif -#if YYMAXDEPTH == 0 -#undef YYMAXDEPTH -#endif +#endif /* !YYERROR_VERBOSE */ -#ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 -#endif -/* Define __yy_memcpy. Note that the size argument - should be passed with type unsigned int, because that is what the non-GCC - definitions require. With GCC, __builtin_memcpy takes an arg - of type size_t, but it can handle unsigned int. */ - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ + +#if YYDEBUG +/*-----------------------------. +| Print this symbol on YYOUT. | +`-----------------------------*/ + static void -__yy_memcpy (to, from, count) - char *to; - char *from; - unsigned int count; +#if defined (__STDC__) || defined (__cplusplus) +yysymprint (FILE* yyout, int yytype, YYSTYPE yyvalue) +#else +yysymprint (yyout, yytype, yyvalue) + FILE* yyout; + int yytype; + YYSTYPE yyvalue; +#endif { - register char *f = from; - register char *t = to; - register int i = count; + /* Pacify ``unused variable'' warnings. */ + (void) yyvalue; + + if (yytype < YYNTOKENS) + { + YYFPRINTF (yyout, "token %s (", yytname[yytype]); +# ifdef YYPRINT + YYPRINT (yyout, yytoknum[yytype], yyvalue); +# endif + } + else + YYFPRINTF (yyout, "nterm %s (", yytname[yytype]); - while (i-- > 0) - *t++ = *f++; + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyout, ")"); } +#endif /* YYDEBUG. */ -#else /* __cplusplus */ -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + static void -__yy_memcpy (char *to, char *from, unsigned int count) +#if defined (__STDC__) || defined (__cplusplus) +yydestruct (int yytype, YYSTYPE yyvalue) +#else +yydestruct (yytype, yyvalue) + int yytype; + YYSTYPE yyvalue; +#endif { - register char *t = to; - register char *f = from; - register int i = count; + /* Pacify ``unused variable'' warnings. */ + (void) yyvalue; - while (i-- > 0) - *t++ = *f++; + switch (yytype) + { + default: + break; + } } -#endif -#endif -#line 217 "/usr/share/bison.simple" /* The user can define YYPARSE_PARAM as the name of an argument to be passed into yyparse. The argument should have type void *. @@ -1011,76 +1421,85 @@ __yy_memcpy (char *to, char *from, unsigned int count) to the proper pointer type. */ #ifdef YYPARSE_PARAM -#ifdef __cplusplus -#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#else /* not __cplusplus */ -#define YYPARSE_PARAM_ARG YYPARSE_PARAM -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#endif /* not __cplusplus */ -#else /* not YYPARSE_PARAM */ -#define YYPARSE_PARAM_ARG -#define YYPARSE_PARAM_DECL -#endif /* not YYPARSE_PARAM */ +# if defined (__STDC__) || defined (__cplusplus) +# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM +# define YYPARSE_PARAM_DECL +# else +# define YYPARSE_PARAM_ARG YYPARSE_PARAM +# define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; +# endif +#else /* !YYPARSE_PARAM */ +# define YYPARSE_PARAM_ARG +# define YYPARSE_PARAM_DECL +#endif /* !YYPARSE_PARAM */ /* Prevent warning if -Wstrict-prototypes. */ #ifdef __GNUC__ -#ifdef YYPARSE_PARAM +# ifdef YYPARSE_PARAM int yyparse (void *); -#else +# else int yyparse (void); +# endif #endif -#endif + + +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of parse errors so far. */ +int yynerrs; + int -yyparse(YYPARSE_PARAM_ARG) +yyparse (YYPARSE_PARAM_ARG) YYPARSE_PARAM_DECL { + register int yystate; register int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Lookahead token as an internal (translated) token number. */ + int yychar1 = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short yyssa[YYINITDEPTH]; + short *yyss = yyssa; register short *yyssp; - register YYSTYPE *yyvsp; - int yyerrstatus; /* number of tokens to shift before error messages enabled */ - int yychar1 = 0; /* lookahead token as an internal (translated) token number */ - short yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + register YYSTYPE *yyvsp; - short *yyss = yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ -#ifdef YYLSP_NEEDED - YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp; -#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) -#else #define YYPOPSTACK (yyvsp--, yyssp--) -#endif - int yystacksize = YYINITDEPTH; - int yyfree_stacks = 0; + YYSIZE_T yystacksize = YYINITDEPTH; -#ifdef YYPURE - int yychar; - YYSTYPE yylval; - int yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE yylloc; -#endif -#endif + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; - YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ int yylen; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Starting parse\n"); -#endif + YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; @@ -1092,110 +1511,96 @@ yyparse(YYPARSE_PARAM_ARG) so that they stay on the same level as the state stack. The wasted elements are never initialized. */ - yyssp = yyss - 1; + yyssp = yyss; yyvsp = yyvs; -#ifdef YYLSP_NEEDED - yylsp = yyls; -#endif -/* Push a new state, which is found in yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -yynewstate: + goto yysetstate; - *++yyssp = yystate; +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + + yysetstate: + *yyssp = yystate; if (yyssp >= yyss + yystacksize - 1) { - /* Give user a chance to reallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *yyls1 = yyls; -#endif - /* Get the current used size of the three stacks, in elements. */ - int size = yyssp - yyss + 1; + YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if yyoverflow is a macro. */ - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yyls1, size * sizeof (*yylsp), - &yystacksize); -#else - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yystacksize); -#endif - - yyss = yyss1; yyvs = yyvs1; -#ifdef YYLSP_NEEDED - yyls = yyls1; -#endif + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow ("parser stack overflow", + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } #else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyoverflowlab; +# else /* Extend the stack our own way. */ if (yystacksize >= YYMAXDEPTH) - { - yyerror("parser stack overflow"); - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 2; - } + goto yyoverflowlab; yystacksize *= 2; if (yystacksize > YYMAXDEPTH) yystacksize = YYMAXDEPTH; -#ifndef YYSTACK_USE_ALLOCA - yyfree_stacks = 1; -#endif - yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); - __yy_memcpy ((char *)yyss, (char *)yyss1, - size * (unsigned int) sizeof (*yyssp)); - yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); - __yy_memcpy ((char *)yyvs, (char *)yyvs1, - size * (unsigned int) sizeof (*yyvsp)); -#ifdef YYLSP_NEEDED - yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); - __yy_memcpy ((char *)yyls, (char *)yyls1, - size * (unsigned int) sizeof (*yylsp)); -#endif + + { + short *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyoverflowlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif #endif /* no yyoverflow */ - yyssp = yyss + size - 1; - yyvsp = yyvs + size - 1; -#ifdef YYLSP_NEEDED - yylsp = yyls + size - 1; -#endif + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Stack size increased to %d\n", yystacksize); -#endif + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); if (yyssp >= yyss + yystacksize - 1) YYABORT; } -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Entering state %d\n", yystate); -#endif + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; - yybackup: + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: /* Do appropriate processing given the current state. */ /* Read a lookahead token if we need one and don't already have one. */ @@ -1204,7 +1609,7 @@ yyparse(YYPARSE_PARAM_ARG) /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; - if (yyn == YYFLAG) + if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ @@ -1214,146 +1619,141 @@ yyparse(YYPARSE_PARAM_ARG) if (yychar == YYEMPTY) { -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Reading a token: "); -#endif + YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } - /* Convert token to internal form (in yychar1) for indexing tables with */ + /* Convert token to internal form (in yychar1) for indexing tables with. */ - if (yychar <= 0) /* This means end of input. */ + if (yychar <= 0) /* This means end of input. */ { yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more */ + yychar = YYEOF; /* Don't call YYLEX any more. */ -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif + YYDPRINTF ((stderr, "Now at end of input.\n")); } else { - yychar1 = YYTRANSLATE(yychar); + yychar1 = YYTRANSLATE (yychar); -#if YYDEBUG != 0 - if (yydebug) - { - fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT - YYPRINT (stderr, yychar, yylval); -#endif - fprintf (stderr, ")\n"); - } -#endif + /* We have to keep this `#if YYDEBUG', since we use variables + which are defined only if `YYDEBUG' is set. */ + YYDPRINTF ((stderr, "Next token is ")); + YYDSYMPRINT ((stderr, yychar1, yylval)); + YYDPRINTF ((stderr, "\n")); } + /* If the proper action on seeing token YYCHAR1 is to reduce or to + detect an error, take that action. */ yyn += yychar1; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yychar1) goto yydefault; - yyn = yytable[yyn]; - - /* yyn is what to do for this token type in this state. - Negative => reduce, -yyn is rule number. - Positive => shift, yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (yyn < 0) + if (yyn <= 0) { - if (yyn == YYFLAG) + if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } - else if (yyn == 0) - goto yyerrlab; if (yyn == YYFINAL) YYACCEPT; /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); -#endif + YYDPRINTF ((stderr, "Shifting token %d (%s), ", + yychar, yytname[yychar1])); /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - /* count tokens shifted since error; after three, turn off error status. */ - if (yyerrstatus) yyerrstatus--; + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; yystate = yyn; goto yynewstate; -/* Do the default action for the current state. */ -yydefault: +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; + goto yyreduce; -/* Do a reduction. yyn is the number of a rule to reduce with. */ + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ yyreduce: + /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; - if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ -#if YYDEBUG != 0 + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + +#if YYDEBUG + /* We have to keep this `#if YYDEBUG', since we use variables which + are defined only if `YYDEBUG' is set. */ if (yydebug) { - int i; + int yyi; - fprintf (stderr, "Reducing via rule %d (line %d), ", - yyn, yyrline[yyn]); + YYFPRINTF (stderr, "Reducing via rule %d (line %d), ", + yyn - 1, yyrline[yyn]); /* Print the symbols being reduced, and their result. */ - for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", yytname[yyrhs[i]]); - fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); + for (yyi = yyprhs[yyn]; yyrhs[yyi] >= 0; yyi++) + YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]); + YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]); } #endif - - - switch (yyn) { - -case 1: + switch (yyn) + { + case 2: #line 301 "asn1p_y.y" -{ + { *(void **)param = yyvsp[0].a_grammar; - ; - break;} -case 2: + } + break; + + case 3: #line 307 "asn1p_y.y" -{ + { yyval.a_grammar = asn1p_new(); checkmem(yyval.a_grammar); TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); - ; - break;} -case 3: + } + break; + + case 4: #line 312 "asn1p_y.y" -{ + { yyval.a_grammar = yyvsp[-1].a_grammar; TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); - ; - break;} -case 4: + } + break; + + case 5: #line 333 "asn1p_y.y" -{ + { if(yyvsp[-1].a_module) { yyval.a_module = yyvsp[-1].a_module; @@ -1366,116 +1766,134 @@ case 4: yyval.a_module->Identifier = yyvsp[-7].tv_str; yyval.a_module->module_oid = yyvsp[-6].a_oid; yyval.a_module->module_flags = yyvsp[-4].a_module_flags; - ; - break;} -case 5: + } + break; + + case 6: #line 354 "asn1p_y.y" -{ yyval.a_oid = 0; ; - break;} -case 6: + { yyval.a_oid = 0; } + break; + + case 7: #line 355 "asn1p_y.y" -{ yyval.a_oid = yyvsp[0].a_oid; ; - break;} -case 7: + { yyval.a_oid = yyvsp[0].a_oid; } + break; + + case 8: #line 359 "asn1p_y.y" -{ + { yyval.a_oid = yyvsp[-1].a_oid; - ; - break;} -case 8: + } + break; + + case 9: #line 362 "asn1p_y.y" -{ + { yyval.a_oid = 0; - ; - break;} -case 9: + } + break; + + case 10: #line 368 "asn1p_y.y" -{ + { yyval.a_oid = asn1p_oid_new(); asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); if(yyvsp[0].a_oid_arc.name) free(yyvsp[0].a_oid_arc.name); - ; - break;} -case 10: + } + break; + + case 11: #line 374 "asn1p_y.y" -{ + { yyval.a_oid = yyvsp[-1].a_oid; asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); if(yyvsp[0].a_oid_arc.name) free(yyvsp[0].a_oid_arc.name); - ; - break;} -case 11: + } + break; + + case 12: #line 383 "asn1p_y.y" -{ /* iso */ + { /* iso */ yyval.a_oid_arc.name = yyvsp[0].tv_str; yyval.a_oid_arc.number = -1; - ; - break;} -case 12: + } + break; + + case 13: #line 387 "asn1p_y.y" -{ /* iso(1) */ + { /* iso(1) */ yyval.a_oid_arc.name = yyvsp[-3].tv_str; yyval.a_oid_arc.number = yyvsp[-1].a_int; - ; - break;} -case 13: + } + break; + + case 14: #line 391 "asn1p_y.y" -{ /* 1 */ + { /* 1 */ yyval.a_oid_arc.name = 0; yyval.a_oid_arc.number = yyvsp[0].a_int; - ; - break;} -case 14: + } + break; + + case 15: #line 401 "asn1p_y.y" -{ yyval.a_module_flags = MSF_NOFLAGS; ; - break;} -case 15: + { yyval.a_module_flags = MSF_NOFLAGS; } + break; + + case 16: #line 402 "asn1p_y.y" -{ + { yyval.a_module_flags = yyvsp[0].a_module_flags; - ; - break;} -case 16: + } + break; + + case 17: #line 411 "asn1p_y.y" -{ + { yyval.a_module_flags = yyvsp[0].a_module_flags; - ; - break;} -case 17: + } + break; + + case 18: #line 414 "asn1p_y.y" -{ + { yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags; - ; - break;} -case 18: + } + break; + + case 19: #line 423 "asn1p_y.y" -{ + { yyval.a_module_flags = MSF_EXPLICIT_TAGS; - ; - break;} -case 19: + } + break; + + case 20: #line 426 "asn1p_y.y" -{ + { yyval.a_module_flags = MSF_IMPLICIT_TAGS; - ; - break;} -case 20: + } + break; + + case 21: #line 429 "asn1p_y.y" -{ + { yyval.a_module_flags = MSF_AUTOMATIC_TAGS; - ; - break;} -case 21: + } + break; + + case 22: #line 432 "asn1p_y.y" -{ + { yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED; - ; - break;} -case 22: + } + break; + + case 23: #line 436 "asn1p_y.y" -{ + { /* X.680Amd1 specifies TAG and XER */ if(strcmp(yyvsp[-1].tv_str, "TAG") == 0) { yyval.a_module_flags = MSF_TAG_INSTRUCTIONS; @@ -1489,27 +1907,31 @@ case 22: yyval.a_module_flags = MSF_unk_INSTRUCTIONS; } free(yyvsp[-1].tv_str); - ; - break;} -case 23: + } + break; + + case 24: #line 457 "asn1p_y.y" -{ yyval.a_module = 0; ; - break;} -case 24: + { yyval.a_module = 0; } + break; + + case 25: #line 458 "asn1p_y.y" -{ + { yyval.a_module = yyvsp[0].a_module; - ; - break;} -case 25: + } + break; + + case 26: #line 467 "asn1p_y.y" -{ + { yyval.a_module = yyvsp[0].a_module; - ; - break;} -case 26: + } + break; + + case 27: #line 470 "asn1p_y.y" -{ + { yyval.a_module = yyvsp[-1].a_module; /* Behave well when one of them is skipped. */ @@ -1535,17 +1957,19 @@ case 26: MY_IMPORT(members, next); #undef MY_IMPORT - ; - break;} -case 27: + } + break; + + case 28: #line 503 "asn1p_y.y" -{ + { yyval.a_module = yyvsp[0].a_module; - ; - break;} -case 28: + } + break; + + case 29: #line 506 "asn1p_y.y" -{ + { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); if(yyvsp[0].a_xports) { @@ -1553,285 +1977,321 @@ case 28: } else { /* "EXPORTS ALL;" ? */ } - ; - break;} -case 29: + } + break; + + case 30: #line 515 "asn1p_y.y" -{ + { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID); assert(yyvsp[0].a_expr->meta_type != AMT_INVALID); TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); - ; - break;} -case 30: + } + break; + + case 31: #line 522 "asn1p_y.y" -{ + { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID); assert(yyvsp[0].a_expr->meta_type != AMT_INVALID); TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); - ; - break;} -case 31: + } + break; + + case 32: #line 535 "asn1p_y.y" -{ + { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID); assert(yyvsp[0].a_expr->meta_type != AMT_INVALID); TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); - ; - break;} -case 32: + } + break; + + case 33: #line 543 "asn1p_y.y" -{ asn1p_lexer_hack_push_encoding_control(); ; - break;} -case 33: + { asn1p_lexer_hack_push_encoding_control(); } + break; + + case 34: #line 544 "asn1p_y.y" -{ + { fprintf(stderr, "WARNING: ENCODING-CONTROL %s " "specification at line %d ignored\n", yyvsp[-1].tv_str, yylineno); free(yyvsp[-1].tv_str); yyval.a_module = 0; - ; - break;} -case 34: + } + break; + + case 35: #line 556 "asn1p_y.y" -{ + { return yyerror( "Attempt to redefine a standard basic type, " "use -ftypesXY to switch back " "to older version of ASN.1 standard"); - ; - break;} -case 35: + } + break; + + case 36: #line 570 "asn1p_y.y" -{ + { yyval.a_module = yyvsp[-1].a_module; - ; - break;} -case 36: + } + break; + + case 37: #line 576 "asn1p_y.y" -{ + { return yyerror("Empty IMPORTS list"); - ; - break;} -case 37: + } + break; + + case 38: #line 582 "asn1p_y.y" -{ + { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); - ; - break;} -case 38: + } + break; + + case 39: #line 587 "asn1p_y.y" -{ + { yyval.a_module = yyvsp[-1].a_module; TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); - ; - break;} -case 39: + } + break; + + case 40: #line 594 "asn1p_y.y" -{ + { yyval.a_xports = yyvsp[-3].a_xports; yyval.a_xports->from = yyvsp[-1].tv_str; yyval.a_xports->from_oid = yyvsp[0].a_oid; checkmem(yyval.a_xports); - ; - break;} -case 40: + } + break; + + case 41: #line 603 "asn1p_y.y" -{ + { yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - ; - break;} -case 41: + } + break; + + case 42: #line 608 "asn1p_y.y" -{ + { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - ; - break;} -case 42: + } + break; + + case 43: #line 615 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_REFERENCE; - ; - break;} -case 43: + } + break; + + case 44: #line 621 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_REFERENCE; - ; - break;} -case 44: + } + break; + + case 45: #line 630 "asn1p_y.y" -{ + { yyval.a_xports = yyvsp[-1].a_xports; - ; - break;} -case 45: + } + break; + + case 46: #line 633 "asn1p_y.y" -{ + { yyval.a_xports = 0; - ; - break;} -case 46: + } + break; + + case 47: #line 636 "asn1p_y.y" -{ + { /* Empty EXPORTS clause effectively prohibits export. */ yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); - ; - break;} -case 47: + } + break; + + case 48: #line 644 "asn1p_y.y" -{ + { yyval.a_xports = asn1p_xports_new(); assert(yyval.a_xports); TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - ; - break;} -case 48: + } + break; + + case 49: #line 649 "asn1p_y.y" -{ + { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - ; - break;} -case 49: + } + break; + + case 50: #line 656 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_EXPORTVAR; - ; - break;} -case 50: + } + break; + + case 51: #line 662 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_EXPORTVAR; - ; - break;} -case 51: + } + break; + + case 52: #line 672 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-4].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-5].tv_str; yyval.a_expr->meta_type = AMT_VALUESET; // take care of optValueSetBody - ; - break;} -case 52: + } + break; + + case 53: #line 682 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->reference = yyvsp[0].a_ref; yyval.a_expr->expr_type = A1TC_REFERENCE; yyval.a_expr->meta_type = AMT_TYPEREF; - ; - break;} -case 53: + } + break; + + case 54: #line 689 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = yyvsp[0].a_type; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 54: + } + break; + + case 55: #line 698 "asn1p_y.y" -{ ; - break;} -case 55: + { } + break; + + case 56: #line 699 "asn1p_y.y" -{ - ; - break;} -case 56: + { + } + break; + + case 57: #line 710 "asn1p_y.y" -{ - ; - break;} -case 57: + { + } + break; + + case 58: #line 712 "asn1p_y.y" -{ - ; - break;} -case 58: + { + } + break; + + case 59: #line 717 "asn1p_y.y" -{ - ; - break;} -case 59: + { + } + break; + + case 60: #line 719 "asn1p_y.y" -{ - ; - break;} -case 60: + { + } + break; + + case 61: #line 735 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->tag = yyvsp[-1].a_tag; yyval.a_expr->expr_type = A1TC_TYPEID; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 61: + } + break; + + case 62: #line 743 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->tag = yyvsp[-1].a_tag; assert(yyval.a_expr->expr_type); assert(yyval.a_expr->meta_type); - ; - break;} -case 62: + } + break; + + case 63: #line 750 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; assert(yyval.a_expr->expr_type == A1TC_CLASSDEF); assert(yyval.a_expr->meta_type == AMT_OBJECT); - ; - break;} -case 63: + } + break; + + case 64: #line 766 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-5].tv_str; yyval.a_expr->params = yyvsp[-3].a_plist; yyval.a_expr->meta_type = AMT_PARAMTYPE; - ; - break;} -case 64: + } + break; + + case 65: #line 776 "asn1p_y.y" -{ + { int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); checkmem(yyval.a_plist); @@ -1839,207 +2299,232 @@ case 64: checkmem(ret == 0); if(yyvsp[0].a_parg.governor) asn1p_ref_free(yyvsp[0].a_parg.governor); if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument); - ; - break;} -case 65: + } + break; + + case 66: #line 785 "asn1p_y.y" -{ + { int ret; yyval.a_plist = yyvsp[-2].a_plist; ret = asn1p_paramlist_add_param(yyval.a_plist, yyvsp[0].a_parg.governor, yyvsp[0].a_parg.argument); checkmem(ret == 0); if(yyvsp[0].a_parg.governor) asn1p_ref_free(yyvsp[0].a_parg.governor); if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument); - ; - break;} -case 66: + } + break; + + case 67: #line 796 "asn1p_y.y" -{ + { yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; - ; - break;} -case 67: + } + break; + + case 68: #line 800 "asn1p_y.y" -{ + { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); ret = asn1p_ref_add_component(yyval.a_parg.governor, yyvsp[-2].tv_str, 0); checkmem(ret == 0); yyval.a_parg.argument = yyvsp[0].tv_str; - ; - break;} -case 68: + } + break; + + case 69: #line 807 "asn1p_y.y" -{ + { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); ret = asn1p_ref_add_component(yyval.a_parg.governor, ASN_EXPR_TYPE2STR(yyvsp[-2].a_type), 1); checkmem(ret == 0); yyval.a_parg.argument = yyvsp[0].tv_str; - ; - break;} -case 69: + } + break; + + case 70: #line 818 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 70: + } + break; + + case 71: #line 823 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 71: + } + break; + + case 72: #line 830 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; - ; - break;} -case 72: + } + break; + + case 73: #line 833 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_REFERENCE; yyval.a_expr->meta_type = AMT_VALUE; - ; - break;} -case 73: + } + break; + + case 74: #line 846 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 74: + } + break; + + case 75: #line 851 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 75: + } + break; + + case 76: #line 858 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-2].tv_nametag.name; yyval.a_expr->tag = yyvsp[-2].tv_nametag.tag; yyval.a_expr->marker = yyvsp[0].a_marker; - ; - break;} -case 76: + } + break; + + case 77: #line 865 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->meta_type = yyvsp[0].a_expr->meta_type; yyval.a_expr->expr_type = A1TC_COMPONENTS_OF; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 77: + } + break; + + case 78: #line 872 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; - ; - break;} -case 78: + } + break; + + case 79: #line 878 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 79: + } + break; + + case 80: #line 883 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 80: + } + break; + + case 81: #line 890 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-1].tv_nametag.name; yyval.a_expr->tag = yyvsp[-1].tv_nametag.tag; - ; - break;} -case 81: + } + break; + + case 82: #line 896 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; - ; - break;} -case 82: + } + break; + + case 83: #line 902 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); yyval.a_expr->with_syntax = yyvsp[0].a_wsynt; assert(yyval.a_expr->expr_type == A1TC_CLASSDEF); assert(yyval.a_expr->meta_type == AMT_OBJECT); - ; - break;} -case 83: + } + break; + + case 84: #line 912 "asn1p_y.y" -{ yyval.a_int = 0; ; - break;} -case 84: + { yyval.a_int = 0; } + break; + + case 85: #line 913 "asn1p_y.y" -{ yyval.a_int = 1; ; - break;} -case 85: + { yyval.a_int = 1; } + break; + + case 86: #line 917 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_CLASSDEF; yyval.a_expr->meta_type = AMT_OBJECT; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 86: + } + break; + + case 87: #line 924 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 87: + } + break; + + case 88: #line 931 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[-1].a_refcomp.name; yyval.a_expr->expr_type = A1TC_CLASSFIELD; yyval.a_expr->meta_type = AMT_OBJECTFIELD; yyval.a_expr->marker = yyvsp[0].a_marker; - ; - break;} -case 88: + } + break; + + case 89: #line 939 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-2].a_expr; yyval.a_expr->Identifier = yyvsp[-3].a_refcomp.name; yyval.a_expr->marker = yyvsp[-1].a_marker; yyval.a_expr->unique = yyvsp[0].a_int; - ; - break;} -case 89: + } + break; + + case 90: #line 945 "asn1p_y.y" -{ + { int ret; yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2053,51 +2538,59 @@ case 89: yyval.a_expr->meta_type = AMT_OBJECTFIELD; yyval.a_expr->marker = yyvsp[-1].a_marker; yyval.a_expr->unique = yyvsp[0].a_int; - ; - break;} -case 90: + } + break; + + case 91: #line 963 "asn1p_y.y" -{ yyval.a_wsynt = 0; ; - break;} -case 91: + { yyval.a_wsynt = 0; } + break; + + case 92: #line 964 "asn1p_y.y" -{ + { yyval.a_wsynt = yyvsp[0].a_wsynt; - ; - break;} -case 92: + } + break; + + case 93: #line 971 "asn1p_y.y" -{ asn1p_lexer_hack_enable_with_syntax(); ; - break;} -case 93: + { asn1p_lexer_hack_enable_with_syntax(); } + break; + + case 94: #line 973 "asn1p_y.y" -{ + { yyval.a_wsynt = yyvsp[-1].a_wsynt; - ; - break;} -case 94: + } + break; + + case 95: #line 979 "asn1p_y.y" -{ + { yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); - ; - break;} -case 95: + } + break; + + case 96: #line 983 "asn1p_y.y" -{ + { yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); - ; - break;} -case 96: + } + break; + + case 97: #line 990 "asn1p_y.y" -{ + { yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); - ; - break;} -case 97: + } + break; + + case 98: #line 993 "asn1p_y.y" -{ + { asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -2105,22 +2598,24 @@ case 97: ret = asn1p_ref_add_component(ref, yyvsp[0].a_refcomp.name, yyvsp[0].a_refcomp.lex_type); checkmem(ret == 0); yyval.a_wchunk = asn1p_wsyntx_chunk_fromref(ref, 0); - ; - break;} -case 98: + } + break; + + case 99: #line 1005 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); checkmem(yyval.a_expr->Identifier); yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 99: + } + break; + + case 100: #line 1013 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); @@ -2128,11 +2623,12 @@ case 99: yyval.a_expr->value = yyvsp[0].a_value; yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 100: + } + break; + + case 101: #line 1022 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); @@ -2140,11 +2636,12 @@ case 100: checkmem(yyval.a_expr->Identifier); yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 101: + } + break; + + case 102: #line 1034 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-1].a_expr; /* * Outer constraint for SEQUENCE OF and SET OF applies @@ -2161,84 +2658,93 @@ case 101: yyval.a_expr->constraints = yyvsp[0].a_constr; } } - ; - break;} -case 102: + } + break; + + case 103: #line 1055 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[0].a_expr; - ; - break;} -case 103: + } + break; + + case 104: #line 1058 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = yyvsp[0].a_type; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 104: + } + break; + + case 105: #line 1064 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); yyval.a_expr->expr_type = ASN_CONSTR_CHOICE; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 105: + } + break; + + case 106: #line 1070 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 106: + } + break; + + case 107: #line 1076 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); yyval.a_expr->expr_type = ASN_CONSTR_SET; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 107: + } + break; + + case 108: #line 1082 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->constraints = yyvsp[-2].a_constr; yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE_OF; yyval.a_expr->meta_type = AMT_TYPE; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 108: + } + break; + + case 109: #line 1090 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->constraints = yyvsp[-2].a_constr; yyval.a_expr->expr_type = ASN_CONSTR_SET_OF; yyval.a_expr->meta_type = AMT_TYPE; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 109: + } + break; + + case 110: #line 1098 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = ASN_TYPE_ANY; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 110: + } + break; + + case 111: #line 1104 "asn1p_y.y" -{ + { int ret; yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2248,11 +2754,12 @@ case 110: checkmem(ret == 0); yyval.a_expr->expr_type = ASN_TYPE_ANY; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 111: + } + break; + + case 112: #line 1118 "asn1p_y.y" -{ + { int ret; yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == 0); @@ -2265,42 +2772,46 @@ case 111: free(yyvsp[-3].tv_str); yyval.a_expr->expr_type = A1TC_PARAMETRIZED; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 112: + } + break; + + case 113: #line 1142 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->reference = yyvsp[0].a_ref; yyval.a_expr->expr_type = A1TC_REFERENCE; yyval.a_expr->meta_type = AMT_TYPEREF; - ; - break;} -case 113: + } + break; + + case 114: #line 1149 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->reference = yyvsp[0].a_ref; yyval.a_expr->expr_type = A1TC_INSTANCE; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 114: + } + break; + + case 115: #line 1164 "asn1p_y.y" -{ + { int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_UNKNOWN); checkmem(ret == 0); free(yyvsp[0].tv_str); - ; - break;} -case 115: + } + break; + + case 116: #line 1172 "asn1p_y.y" -{ + { int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); @@ -2309,11 +2820,12 @@ case 115: ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_UNKNOWN); checkmem(ret == 0); free(yyvsp[-2].tv_str); - ; - break;} -case 116: + } + break; + + case 117: #line 1182 "asn1p_y.y" -{ + { int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); @@ -2322,22 +2834,24 @@ case 116: ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_lowercase); checkmem(ret == 0); free(yyvsp[-2].tv_str); - ; - break;} -case 117: + } + break; + + case 118: #line 1192 "asn1p_y.y" -{ + { int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_CAPITALS); free(yyvsp[0].tv_str); checkmem(ret == 0); - ; - break;} -case 118: + } + break; + + case 119: #line 1200 "asn1p_y.y" -{ + { int ret; yyval.a_ref = yyvsp[0].a_ref; ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[-2].tv_str, RLT_CAPITALS); @@ -2355,101 +2869,114 @@ case 118: * (yyval.a_ref->comp_count - 1)); yyval.a_ref->components[0] = tmp_comp; } - ; - break;} -case 119: + } + break; + + case 120: #line 1222 "asn1p_y.y" -{ + { int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].a_refcomp.name, yyvsp[0].a_refcomp.lex_type); free(yyvsp[0].a_refcomp.name); checkmem(ret == 0); - ; - break;} -case 120: + } + break; + + case 121: #line 1230 "asn1p_y.y" -{ + { int ret; yyval.a_ref = yyvsp[-2].a_ref; ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].a_refcomp.name, yyvsp[0].a_refcomp.lex_type); free(yyvsp[0].a_refcomp.name); checkmem(ret == 0); - ; - break;} -case 123: + } + break; + + case 124: #line 1244 "asn1p_y.y" -{ + { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; - ; - break;} -case 124: + } + break; + + case 125: #line 1249 "asn1p_y.y" -{ + { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; - ; - break;} -case 125: + } + break; + + case 126: #line 1262 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->value = yyvsp[0].a_value; - ; - break;} -case 126: + } + break; + + case 127: #line 1272 "asn1p_y.y" -{ asn1p_lexer_hack_push_opaque_state(); ; - break;} -case 127: + { asn1p_lexer_hack_push_opaque_state(); } + break; + + case 128: #line 1273 "asn1p_y.y" -{ + { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); yyval.a_value->type = ATV_UNPARSED; - ; - break;} -case 128: + } + break; + + case 129: #line 1278 "asn1p_y.y" -{ + { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); - ; - break;} -case 129: + } + break; + + case 130: #line 1282 "asn1p_y.y" -{ + { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); - ; - break;} -case 130: + } + break; + + case 131: #line 1286 "asn1p_y.y" -{ + { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); - ; - break;} -case 131: + } + break; + + case 132: #line 1290 "asn1p_y.y" -{ + { yyval.a_value = yyvsp[0].a_value; - ; - break;} -case 132: + } + break; + + case 133: #line 1293 "asn1p_y.y" -{ + { yyval.a_value = yyvsp[0].a_value; - ; - break;} -case 133: + } + break; + + case 134: #line 1299 "asn1p_y.y" -{ + { asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -2459,11 +2986,12 @@ case 133: yyval.a_value = asn1p_value_fromref(ref, 0); checkmem(yyval.a_value); free(yyvsp[0].tv_str); - ; - break;} -case 134: + } + break; + + case 135: #line 1310 "asn1p_y.y" -{ + { asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -2476,11 +3004,12 @@ case 134: checkmem(yyval.a_value); free(yyvsp[-2].tv_str); free(yyvsp[0].tv_str); - ; - break;} -case 135: + } + break; + + case 136: #line 1327 "asn1p_y.y" -{ + { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 2; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); checkmem(yyval.tv_opaque.buf); @@ -2489,11 +3018,12 @@ case 135: memcpy(yyval.tv_opaque.buf + 2, yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len); yyval.tv_opaque.buf[yyval.tv_opaque.len] = '\0'; free(yyvsp[0].tv_opaque.buf); - ; - break;} -case 136: + } + break; + + case 137: #line 1337 "asn1p_y.y" -{ + { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); checkmem(p); @@ -2504,80 +3034,97 @@ case 136: free(yyvsp[0].tv_opaque.buf); yyval.tv_opaque.buf = p; yyval.tv_opaque.len = newsize; - ; - break;} -case 137: + } + break; + + case 138: #line 1352 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_BOOLEAN; ; - break;} -case 138: + { yyval.a_type = ASN_BASIC_BOOLEAN; } + break; + + case 139: #line 1353 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_NULL; ; - break;} -case 139: + { yyval.a_type = ASN_BASIC_NULL; } + break; + + case 140: #line 1354 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_REAL; ; - break;} -case 140: + { yyval.a_type = ASN_BASIC_REAL; } + break; + + case 141: #line 1355 "asn1p_y.y" -{ yyval.a_type = yyvsp[0].a_type; ; - break;} -case 141: + { yyval.a_type = yyvsp[0].a_type; } + break; + + case 142: #line 1356 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_OCTET_STRING; ; - break;} -case 142: + { yyval.a_type = ASN_BASIC_OCTET_STRING; } + break; + + case 143: #line 1357 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; - break;} -case 143: + { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; } + break; + + case 144: #line 1358 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_RELATIVE_OID; ; - break;} -case 144: + { yyval.a_type = ASN_BASIC_RELATIVE_OID; } + break; + + case 145: #line 1359 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_EXTERNAL; ; - break;} -case 145: + { yyval.a_type = ASN_BASIC_EXTERNAL; } + break; + + case 146: #line 1360 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; - break;} -case 146: + { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; } + break; + + case 147: #line 1361 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; - break;} -case 147: + { yyval.a_type = ASN_BASIC_CHARACTER_STRING; } + break; + + case 148: #line 1362 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_UTCTime; ; - break;} -case 148: + { yyval.a_type = ASN_BASIC_UTCTime; } + break; + + case 149: #line 1363 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_GeneralizedTime; ; - break;} -case 149: + { yyval.a_type = ASN_BASIC_GeneralizedTime; } + break; + + case 150: #line 1370 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_INTEGER; ; - break;} -case 150: + { yyval.a_type = ASN_BASIC_INTEGER; } + break; + + case 151: #line 1371 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_ENUMERATED; ; - break;} -case 151: + { yyval.a_type = ASN_BASIC_ENUMERATED; } + break; + + case 152: #line 1372 "asn1p_y.y" -{ yyval.a_type = ASN_BASIC_BIT_STRING; ; - break;} -case 152: + { yyval.a_type = ASN_BASIC_BIT_STRING; } + break; + + case 153: #line 1376 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = yyvsp[0].a_type; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 153: + } + break; + + case 154: #line 1382 "asn1p_y.y" -{ + { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; } else { @@ -2586,230 +3133,264 @@ case 153: } yyval.a_expr->expr_type = yyvsp[-1].a_type; yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 154: + } + break; + + case 155: #line 1395 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_BMPString; ; - break;} -case 155: + { yyval.a_type = ASN_STRING_BMPString; } + break; + + case 156: #line 1396 "asn1p_y.y" -{ + { yyval.a_type = ASN_STRING_GeneralString; - return yyerror("GeneralString is not supported"); - ; - break;} -case 156: + fprintf(stderr, "WARNING: GeneralString is not fully supported"); + } + break; + + case 157: #line 1400 "asn1p_y.y" -{ + { yyval.a_type = ASN_STRING_GraphicString; - return yyerror("GraphicString is not supported"); - ; - break;} -case 157: + fprintf(stderr, "WARNING: GraphicString is not fully supported"); + } + break; + + case 158: #line 1404 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_IA5String; ; - break;} -case 158: + { yyval.a_type = ASN_STRING_IA5String; } + break; + + case 159: #line 1405 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_ISO646String; ; - break;} -case 159: + { yyval.a_type = ASN_STRING_ISO646String; } + break; + + case 160: #line 1406 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_NumericString; ; - break;} -case 160: + { yyval.a_type = ASN_STRING_NumericString; } + break; + + case 161: #line 1407 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_PrintableString; ; - break;} -case 161: + { yyval.a_type = ASN_STRING_PrintableString; } + break; + + case 162: #line 1408 "asn1p_y.y" -{ + { yyval.a_type = ASN_STRING_T61String; - return yyerror("T61String not implemented yet"); - ; - break;} -case 162: + fprintf(stderr, "WARNING: T61String is not fully supported"); + } + break; + + case 163: #line 1412 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_TeletexString; ; - break;} -case 163: + { yyval.a_type = ASN_STRING_TeletexString; } + break; + + case 164: #line 1413 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_UniversalString; ; - break;} -case 164: + { yyval.a_type = ASN_STRING_UniversalString; } + break; + + case 165: #line 1414 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_UTF8String; ; - break;} -case 165: + { yyval.a_type = ASN_STRING_UTF8String; } + break; + + case 166: #line 1415 "asn1p_y.y" -{ + { yyval.a_type = ASN_STRING_VideotexString; - return yyerror("VideotexString is no longer supported"); - ; - break;} -case 166: + fprintf(stderr, "WARNING: VideotexString is not fully supported"); + } + break; + + case 167: #line 1419 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_VisibleString; ; - break;} -case 167: + { yyval.a_type = ASN_STRING_VisibleString; } + break; + + case 168: #line 1420 "asn1p_y.y" -{ yyval.a_type = ASN_STRING_ObjectDescriptor; ; - break;} -case 173: + { yyval.a_type = ASN_STRING_ObjectDescriptor; } + break; + + case 174: #line 1432 "asn1p_y.y" -{ yyval.a_constr = 0; ; - break;} -case 174: + { yyval.a_constr = 0; } + break; + + case 175: #line 1433 "asn1p_y.y" -{ + { yyval.a_constr = yyvsp[0].a_constr; - ; - break;} -case 175: + } + break; + + case 176: #line 1439 "asn1p_y.y" -{ + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); - ; - break;} -case 176: + } + break; + + case 177: #line 1442 "asn1p_y.y" -{ + { /* * This is a special case, for compatibility purposes. * It goes without parentheses. */ CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_SIZE, yyvsp[-1].a_constr, 0); - ; - break;} -case 177: + } + break; + + case 178: #line 1452 "asn1p_y.y" -{ + { yyval.a_constr = yyvsp[-1].a_constr; - ; - break;} -case 178: + } + break; + + case 179: #line 1455 "asn1p_y.y" -{ + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); - ; - break;} -case 179: + } + break; + + case 180: #line 1461 "asn1p_y.y" -{ + { yyval.a_constr = yyvsp[0].a_constr; - ; - break;} -case 180: + } + break; + + case 181: #line 1464 "asn1p_y.y" -{ + { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); ct->type = ACT_EL_EXT; CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); - ; - break;} -case 181: + } + break; + + case 182: #line 1470 "asn1p_y.y" -{ + { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); ct->type = ACT_EL_EXT; CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-4].a_constr, ct); ct = yyval.a_constr; CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, ct, yyvsp[0].a_constr); - ; - break;} -case 182: + } + break; + + case 183: #line 1481 "asn1p_y.y" -{ + { yyval.a_constr = yyvsp[0].a_constr; - ; - break;} -case 183: + } + break; + + case 184: #line 1484 "asn1p_y.y" -{ + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); - ; - break;} -case 184: + } + break; + + case 185: #line 1487 "asn1p_y.y" -{ + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); - ; - break;} -case 185: + } + break; + + case 186: #line 1490 "asn1p_y.y" -{ + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); - ; - break;} -case 186: + } + break; + + case 187: #line 1496 "asn1p_y.y" -{ + { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-3].a_ctype; ret = asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr); checkmem(ret == 0); - ; - break;} -case 187: + } + break; + + case 188: #line 1504 "asn1p_y.y" -{ + { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_CA_SET; ret = asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr); checkmem(ret == 0); - ; - break;} -case 188: + } + break; + + case 189: #line 1512 "asn1p_y.y" -{ + { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_VALUE; yyval.a_constr->value = yyvsp[0].a_value; - ; - break;} -case 189: + } + break; + + case 190: #line 1518 "asn1p_y.y" -{ + { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-1].a_ctype; yyval.a_constr->range_start = yyvsp[-2].a_value; yyval.a_constr->range_stop = yyvsp[0].a_value; - ; - break;} -case 190: + } + break; + + case 191: #line 1525 "asn1p_y.y" -{ + { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-1].a_ctype; yyval.a_constr->range_start = asn1p_value_fromint(-123); yyval.a_constr->range_stop = yyvsp[0].a_value; yyval.a_constr->range_start->type = ATV_MIN; - ; - break;} -case 191: + } + break; + + case 192: #line 1533 "asn1p_y.y" -{ + { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-1].a_ctype; yyval.a_constr->range_start = yyvsp[-2].a_value; yyval.a_constr->range_stop = asn1p_value_fromint(321); yyval.a_constr->range_stop->type = ATV_MAX; - ; - break;} -case 192: + } + break; + + case 193: #line 1541 "asn1p_y.y" -{ + { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-1].a_ctype; @@ -2817,57 +3398,67 @@ case 192: yyval.a_constr->range_stop = asn1p_value_fromint(321); yyval.a_constr->range_start->type = ATV_MIN; yyval.a_constr->range_stop->type = ATV_MAX; - ; - break;} -case 193: + } + break; + + case 194: #line 1550 "asn1p_y.y" -{ + { yyval.a_constr = yyvsp[0].a_constr; - ; - break;} -case 194: + } + break; + + case 195: #line 1553 "asn1p_y.y" -{ + { yyval.a_constr = yyvsp[0].a_constr; - ; - break;} -case 195: + } + break; + + case 196: #line 1559 "asn1p_y.y" -{ yyval.a_ctype = ACT_EL_RANGE; ; - break;} -case 196: + { yyval.a_ctype = ACT_EL_RANGE; } + break; + + case 197: #line 1560 "asn1p_y.y" -{ yyval.a_ctype = ACT_EL_RLRANGE; ; - break;} -case 197: + { yyval.a_ctype = ACT_EL_RLRANGE; } + break; + + case 198: #line 1561 "asn1p_y.y" -{ yyval.a_ctype = ACT_EL_LLRANGE; ; - break;} -case 198: + { yyval.a_ctype = ACT_EL_LLRANGE; } + break; + + case 199: #line 1562 "asn1p_y.y" -{ yyval.a_ctype = ACT_EL_ULRANGE; ; - break;} -case 199: + { yyval.a_ctype = ACT_EL_ULRANGE; } + break; + + case 200: #line 1566 "asn1p_y.y" -{ + { yyval.a_ctype = ACT_CT_SIZE; - ; - break;} -case 200: + } + break; + + case 201: #line 1569 "asn1p_y.y" -{ + { yyval.a_ctype = ACT_CT_FROM; - ; - break;} -case 201: + } + break; + + case 202: #line 1575 "asn1p_y.y" -{ + { yyval.a_value = yyvsp[0].a_value; - ; - break;} -case 202: + } + break; + + case 203: #line 1578 "asn1p_y.y" -{ + { asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -2877,108 +3468,124 @@ case 202: yyval.a_value = asn1p_value_fromref(ref, 0); checkmem(yyval.a_value); free(yyvsp[0].tv_str); - ; - break;} -case 203: + } + break; + + case 204: #line 1589 "asn1p_y.y" -{ + { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); - ; - break;} -case 204: + } + break; + + case 205: #line 1594 "asn1p_y.y" -{ + { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_FALSE; - ; - break;} -case 205: + } + break; + + case 206: #line 1599 "asn1p_y.y" -{ + { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); yyval.a_value->type = ATV_TRUE; - ; - break;} -case 206: + } + break; + + case 207: #line 1607 "asn1p_y.y" -{ + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); - ; - break;} -case 207: + } + break; + + case 208: #line 1613 "asn1p_y.y" -{ + { yyval.a_constr = yyvsp[0].a_constr; - ; - break;} -case 208: + } + break; + + case 209: #line 1616 "asn1p_y.y" -{ + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); - ; - break;} -case 209: + } + break; + + case 210: #line 1622 "asn1p_y.y" -{ + { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_EXT; - ; - break;} -case 210: + } + break; + + case 211: #line 1627 "asn1p_y.y" -{ + { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_VALUE; yyval.a_constr->value = asn1p_value_frombuf(yyvsp[-2].tv_str, strlen(yyvsp[-2].tv_str), 0); yyval.a_constr->presence = yyvsp[0].a_pres; - ; - break;} -case 211: + } + break; + + case 212: #line 1640 "asn1p_y.y" -{ yyval.a_pres = ACPRES_DEFAULT; ; - break;} -case 212: + { yyval.a_pres = ACPRES_DEFAULT; } + break; + + case 213: #line 1641 "asn1p_y.y" -{ yyval.a_pres = yyvsp[0].a_pres; ; - break;} -case 213: + { yyval.a_pres = yyvsp[0].a_pres; } + break; + + case 214: #line 1645 "asn1p_y.y" -{ + { yyval.a_pres = ACPRES_PRESENT; - ; - break;} -case 214: + } + break; + + case 215: #line 1648 "asn1p_y.y" -{ + { yyval.a_pres = ACPRES_ABSENT; - ; - break;} -case 215: + } + break; + + case 216: #line 1651 "asn1p_y.y" -{ + { yyval.a_pres = ACPRES_OPTIONAL; - ; - break;} -case 216: + } + break; + + case 217: #line 1657 "asn1p_y.y" -{ + { yyval.a_constr = yyvsp[0].a_constr; - ; - break;} -case 217: + } + break; + + case 218: #line 1660 "asn1p_y.y" -{ + { yyval.a_constr = yyvsp[0].a_constr; - ; - break;} -case 218: + } + break; + + case 219: #line 1669 "asn1p_y.y" -{ + { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; int ret; @@ -2989,37 +3596,41 @@ case 218: ct->type = ACT_EL_VALUE; ct->value = asn1p_value_fromref(ref, 0); CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, ct, 0); - ; - break;} -case 219: + } + break; + + case 220: #line 1684 "asn1p_y.y" -{ + { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); - ; - break;} -case 220: + } + break; + + case 221: #line 1690 "asn1p_y.y" -{ + { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_VALUE; yyval.a_constr->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); - ; - break;} -case 221: + } + break; + + case 222: #line 1696 "asn1p_y.y" -{ + { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); checkmem(ct); ct->type = ACT_EL_VALUE; ct->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); - ; - break;} -case 222: + } + break; + + case 223: #line 1710 "asn1p_y.y" -{ + { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; *p = '@'; @@ -3029,11 +3640,12 @@ case 222: checkmem(ret == 0); free(p); free(yyvsp[0].tv_str); - ; - break;} -case 223: + } + break; + + case 224: #line 1721 "asn1p_y.y" -{ + { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; p[0] = '@'; @@ -3044,17 +3656,19 @@ case 223: checkmem(ret == 0); free(p); free(yyvsp[0].tv_str); - ; - break;} -case 224: + } + break; + + case 225: #line 1737 "asn1p_y.y" -{ + { yyval.tv_str = yyvsp[0].tv_str; - ; - break;} -case 225: + } + break; + + case 226: #line 1740 "asn1p_y.y" -{ + { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); yyval.tv_str = malloc(l1 + 1 + l3 + 1); @@ -3062,436 +3676,468 @@ case 225: yyval.tv_str[l1] = '.'; memcpy(yyval.tv_str + l1 + 1, yyvsp[0].tv_str, l3); yyval.tv_str[l1 + 1 + l3] = '\0'; - ; - break;} -case 226: + } + break; + + case 227: #line 1758 "asn1p_y.y" -{ yyval.a_marker = EM_NOMARK; ; - break;} -case 227: + { yyval.a_marker = EM_NOMARK; } + break; + + case 228: #line 1759 "asn1p_y.y" -{ yyval.a_marker = yyvsp[0].a_marker; ; - break;} -case 228: + { yyval.a_marker = yyvsp[0].a_marker; } + break; + + case 229: #line 1763 "asn1p_y.y" -{ + { yyval.a_marker = EM_OPTIONAL; - ; - break;} -case 229: + } + break; + + case 230: #line 1766 "asn1p_y.y" -{ + { yyval.a_marker = EM_DEFAULT; /* FIXME: store DefaultValue somewhere */ - ; - break;} -case 230: + } + break; + + case 231: #line 1773 "asn1p_y.y" -{ - ; - break;} -case 231: + { + } + break; + + case 232: #line 1775 "asn1p_y.y" -{ - ; - break;} -case 232: + { + } + break; + + case 233: #line 1777 "asn1p_y.y" -{ asn1p_lexer_hack_push_opaque_state(); ; - break;} -case 233: + { asn1p_lexer_hack_push_opaque_state(); } + break; + + case 234: #line 1777 "asn1p_y.y" -{ - ; - break;} -case 234: + { + } + break; + + case 235: #line 1798 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); - ; - break;} -case 235: + } + break; + + case 236: #line 1802 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-1].a_expr; - ; - break;} -case 236: + } + break; + + case 237: #line 1808 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 237: + } + break; + + case 238: #line 1813 "asn1p_y.y" -{ + { yyval.a_expr = yyvsp[-2].a_expr; TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - ; - break;} -case 238: + } + break; + + case 239: #line 1820 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->Identifier = yyvsp[0].tv_str; - ; - break;} -case 239: + } + break; + + case 240: #line 1827 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->value = yyvsp[-1].a_value; - ; - break;} -case 240: + } + break; + + case 241: #line 1835 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->value = yyvsp[-1].a_value; - ; - break;} -case 241: + } + break; + + case 242: #line 1843 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->value = yyvsp[0].a_value; - ; - break;} -case 242: + } + break; + + case 243: #line 1850 "asn1p_y.y" -{ + { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); checkmem(yyval.a_expr->Identifier); yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_VALUE; - ; - break;} -case 243: + } + break; + + case 244: #line 1861 "asn1p_y.y" -{ + { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); - ; - break;} -case 244: + } + break; + + case 245: #line 1865 "asn1p_y.y" -{ + { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); - ; - break;} -case 245: + } + break; + + case 246: #line 1896 "asn1p_y.y" -{ memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; - break;} -case 246: + { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); } + break; + + case 247: #line 1897 "asn1p_y.y" -{ yyval.a_tag = yyvsp[0].a_tag; ; - break;} -case 247: + { yyval.a_tag = yyvsp[0].a_tag; } + break; + + case 248: #line 1901 "asn1p_y.y" -{ + { yyval.a_tag = yyvsp[0].a_tag; yyval.a_tag.tag_mode = TM_DEFAULT; - ; - break;} -case 248: + } + break; + + case 249: #line 1905 "asn1p_y.y" -{ + { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_IMPLICIT; - ; - break;} -case 249: + } + break; + + case 250: #line 1909 "asn1p_y.y" -{ + { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_EXPLICIT; - ; - break;} -case 250: + } + break; + + case 251: #line 1916 "asn1p_y.y" -{ + { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - ; - break;} -case 251: + } + break; + + case 252: #line 1920 "asn1p_y.y" -{ + { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - ; - break;} -case 252: + } + break; + + case 253: #line 1928 "asn1p_y.y" -{ + { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - ; - break;} -case 253: + } + break; + + case 254: #line 1935 "asn1p_y.y" -{ + { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - ; - break;} -case 254: + } + break; + + case 255: #line 1942 "asn1p_y.y" -{ + { memset(&yyval.tv_nametag, 0, sizeof(yyval.tv_nametag)); yyval.tv_nametag.name = yyvsp[0].tv_str; - ; - break;} -case 255: + } + break; + + case 256: #line 1946 "asn1p_y.y" -{ + { yyval.tv_nametag.name = yyvsp[-1].tv_str; yyval.tv_nametag.tag = yyvsp[0].a_tag; - ; - break;} -} - /* the action file gets copied in in place of this dollarsign */ -#line 543 "/usr/share/bison.simple" + } + break; + + + } + +/* Line 1016 of /usr/local/share/bison/yacc.c. */ +#line 3923 "asn1p_y.c" yyvsp -= yylen; yyssp -= yylen; -#ifdef YYLSP_NEEDED - yylsp -= yylen; -#endif -#if YYDEBUG != 0 + +#if YYDEBUG if (yydebug) { - short *ssp1 = yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); + short *yyssp1 = yyss - 1; + YYFPRINTF (stderr, "state stack now"); + while (yyssp1 != yyssp) + YYFPRINTF (stderr, " %d", *++yyssp1); + YYFPRINTF (stderr, "\n"); } #endif *++yyvsp = yyval; -#ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } -#endif - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ yyn = yyr1[yyn]; - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else - yystate = yydefgoto[yyn - YYNTBASE]; + yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; -yyerrlab: /* here on detecting error */ - if (! yyerrstatus) - /* If not already recovering from an error, report this error. */ +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) { ++yynerrs; - -#ifdef YYERROR_VERBOSE +#if YYERROR_VERBOSE yyn = yypact[yystate]; - if (yyn > YYFLAG && yyn < YYLAST) + if (YYPACT_NINF < yyn && yyn < YYLAST) { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ - for (x = (yyn < 0 ? -yyn : 0); - x < (ssize_t)(sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - size += strlen(yytname[x]) + 15, count++; - msg = (char *) malloc(size + 15); - if (msg != 0) + YYSIZE_T yysize = 0; + int yytype = YYTRANSLATE (yychar); + char *yymsg; + int yyx, yycount; + + yycount = 0; + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + for (yyx = yyn < 0 ? -yyn : 0; + yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + yysize += yystrlen (yytname[yyx]) + 15, yycount++; + yysize += yystrlen ("parse error, unexpected ") + 1; + yysize += yystrlen (yytname[yytype]); + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg != 0) { - strcpy(msg, "parse error"); + char *yyp = yystpcpy (yymsg, "parse error, unexpected "); + yyp = yystpcpy (yyp, yytname[yytype]); - if (count < 5) + if (yycount < 5) { - count = 0; - for (x = (yyn < 0 ? -yyn : 0); - x < (ssize_t)(sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) + yycount = 0; + for (yyx = yyn < 0 ? -yyn : 0; + yyx < (int) (sizeof (yytname) / sizeof (char *)); + yyx++) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); - count++; + const char *yyq = ! yycount ? ", expecting " : " or "; + yyp = yystpcpy (yyp, yyq); + yyp = yystpcpy (yyp, yytname[yyx]); + yycount++; } } - yyerror(msg); - free(msg); + yyerror (yymsg); + YYSTACK_FREE (yymsg); } else - yyerror ("parse error; also virtual memory exceeded"); + yyerror ("parse error; also virtual memory exhausted"); } else #endif /* YYERROR_VERBOSE */ - yyerror("parse error"); + yyerror ("parse error"); } - goto yyerrlab1; -yyerrlab1: /* here on error raised explicitly by an action */ + +/*----------------------------------------------------. +| yyerrlab1 -- error raised explicitly by an action. | +`----------------------------------------------------*/ +yyerrlab1: if (yyerrstatus == 3) { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ - /* return failure if at end of input */ + /* Return failure if at end of input. */ if (yychar == YYEOF) - YYABORT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); -#endif + { + /* Pop the error token. */ + YYPOPSTACK; + /* Pop the rest of the stack. */ + while (yyssp > yyss) + { + YYDPRINTF ((stderr, "Error: popping ")); + YYDSYMPRINT ((stderr, + yystos[*yyssp], + *yyvsp)); + YYDPRINTF ((stderr, "\n")); + yydestruct (yystos[*yyssp], *yyvsp); + YYPOPSTACK; + } + YYABORT; + } + YYDPRINTF ((stderr, "Discarding token %d (%s).\n", + yychar, yytname[yychar1])); + yydestruct (yychar1, yylval); yychar = YYEMPTY; } - /* Else will try to reuse lookahead token - after shifting the error token. */ + /* Else will try to reuse lookahead token after shifting the error + token. */ - yyerrstatus = 3; /* Each real token shifted decrements this */ + yyerrstatus = 3; /* Each real token shifted decrements this. */ - goto yyerrhandle; + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } -yyerrdefault: /* current state does not do anything special for the error token. */ + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (yyn) goto yydefault; -#endif + YYDPRINTF ((stderr, "Error: popping ")); + YYDSYMPRINT ((stderr, + yystos[*yyssp], *yyvsp)); + YYDPRINTF ((stderr, "\n")); -yyerrpop: /* pop the current state because it cannot handle the error token */ + yydestruct (yystos[yystate], *yyvsp); + yyvsp--; + yystate = *--yyssp; - if (yyssp == yyss) YYABORT; - yyvsp--; - yystate = *--yyssp; -#ifdef YYLSP_NEEDED - yylsp--; -#endif -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } +#if YYDEBUG + if (yydebug) + { + short *yyssp1 = yyss - 1; + YYFPRINTF (stderr, "Error: state stack now"); + while (yyssp1 != yyssp) + YYFPRINTF (stderr, " %d", *++yyssp1); + YYFPRINTF (stderr, "\n"); + } #endif - -yyerrhandle: - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yyerrdefault; - - yyn += YYTERROR; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) - goto yyerrdefault; - - yyn = yytable[yyn]; - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrpop; - yyn = -yyn; - goto yyreduce; } - else if (yyn == 0) - goto yyerrpop; if (yyn == YYFINAL) YYACCEPT; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting error token, "); -#endif + YYDPRINTF ((stderr, "Shifting error token, ")); *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif + yystate = yyn; goto yynewstate; - yyacceptlab: - /* YYACCEPT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*----------------------------------------------. +| yyoverflowlab -- parser overflow comes here. | +`----------------------------------------------*/ +yyoverflowlab: + yyerror ("parser stack overflow"); + yyresult = 2; + /* Fall through. */ #endif - } - return 0; - yyabortlab: - /* YYABORT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); +yyreturn: +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); #endif - } - return 1; + return yyresult; } + + #line 1953 "asn1p_y.y" @@ -3602,3 +4248,4 @@ yyerror(const char *msg) { } + diff --git a/libasn1parser/asn1p_y.h b/libasn1parser/asn1p_y.h index 375b845fd..6d3ff5e71 100644 --- a/libasn1parser/asn1p_y.h +++ b/libasn1parser/asn1p_y.h @@ -1,3 +1,243 @@ +/* A Bison parser, made from asn1p_y.y, by GNU bison 1.75. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +#ifndef BISON_ASN_P_Y_H +# define BISON_ASN_P_Y_H + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + TOK_PPEQ = 258, + TOK_opaque = 259, + TOK_bstring = 260, + TOK_cstring = 261, + TOK_hstring = 262, + TOK_identifier = 263, + TOK_number = 264, + TOK_number_negative = 265, + TOK_typereference = 266, + TOK_capitalreference = 267, + TOK_typefieldreference = 268, + TOK_valuefieldreference = 269, + TOK_ABSENT = 270, + TOK_ABSTRACT_SYNTAX = 271, + TOK_ALL = 272, + TOK_ANY = 273, + TOK_APPLICATION = 274, + TOK_AUTOMATIC = 275, + TOK_BEGIN = 276, + TOK_BIT = 277, + TOK_BMPString = 278, + TOK_BOOLEAN = 279, + TOK_BY = 280, + TOK_CHARACTER = 281, + TOK_CHOICE = 282, + TOK_CLASS = 283, + TOK_COMPONENT = 284, + TOK_COMPONENTS = 285, + TOK_CONSTRAINED = 286, + TOK_CONTAINING = 287, + TOK_DEFAULT = 288, + TOK_DEFINITIONS = 289, + TOK_DEFINED = 290, + TOK_EMBEDDED = 291, + TOK_ENCODED = 292, + TOK_ENCODING_CONTROL = 293, + TOK_END = 294, + TOK_ENUMERATED = 295, + TOK_EXPLICIT = 296, + TOK_EXPORTS = 297, + TOK_EXTENSIBILITY = 298, + TOK_EXTERNAL = 299, + TOK_FALSE = 300, + TOK_FROM = 301, + TOK_GeneralizedTime = 302, + TOK_GeneralString = 303, + TOK_GraphicString = 304, + TOK_IA5String = 305, + TOK_IDENTIFIER = 306, + TOK_IMPLICIT = 307, + TOK_IMPLIED = 308, + TOK_IMPORTS = 309, + TOK_INCLUDES = 310, + TOK_INSTANCE = 311, + TOK_INSTRUCTIONS = 312, + TOK_INTEGER = 313, + TOK_ISO646String = 314, + TOK_MAX = 315, + TOK_MIN = 316, + TOK_MINUS_INFINITY = 317, + TOK_NULL = 318, + TOK_NumericString = 319, + TOK_OBJECT = 320, + TOK_ObjectDescriptor = 321, + TOK_OCTET = 322, + TOK_OF = 323, + TOK_OPTIONAL = 324, + TOK_PATTERN = 325, + TOK_PDV = 326, + TOK_PLUS_INFINITY = 327, + TOK_PRESENT = 328, + TOK_PrintableString = 329, + TOK_PRIVATE = 330, + TOK_REAL = 331, + TOK_RELATIVE_OID = 332, + TOK_SEQUENCE = 333, + TOK_SET = 334, + TOK_SIZE = 335, + TOK_STRING = 336, + TOK_SYNTAX = 337, + TOK_T61String = 338, + TOK_TAGS = 339, + TOK_TeletexString = 340, + TOK_TRUE = 341, + TOK_TYPE_IDENTIFIER = 342, + TOK_UNIQUE = 343, + TOK_UNIVERSAL = 344, + TOK_UniversalString = 345, + TOK_UTCTime = 346, + TOK_UTF8String = 347, + TOK_VideotexString = 348, + TOK_VisibleString = 349, + TOK_WITH = 350, + TOK_EXCEPT = 351, + TOK_INTERSECTION = 352, + TOK_UNION = 353, + TOK_TwoDots = 354, + TOK_ThreeDots = 355, + TOK_tag = 356 + }; +#endif +#define TOK_PPEQ 258 +#define TOK_opaque 259 +#define TOK_bstring 260 +#define TOK_cstring 261 +#define TOK_hstring 262 +#define TOK_identifier 263 +#define TOK_number 264 +#define TOK_number_negative 265 +#define TOK_typereference 266 +#define TOK_capitalreference 267 +#define TOK_typefieldreference 268 +#define TOK_valuefieldreference 269 +#define TOK_ABSENT 270 +#define TOK_ABSTRACT_SYNTAX 271 +#define TOK_ALL 272 +#define TOK_ANY 273 +#define TOK_APPLICATION 274 +#define TOK_AUTOMATIC 275 +#define TOK_BEGIN 276 +#define TOK_BIT 277 +#define TOK_BMPString 278 +#define TOK_BOOLEAN 279 +#define TOK_BY 280 +#define TOK_CHARACTER 281 +#define TOK_CHOICE 282 +#define TOK_CLASS 283 +#define TOK_COMPONENT 284 +#define TOK_COMPONENTS 285 +#define TOK_CONSTRAINED 286 +#define TOK_CONTAINING 287 +#define TOK_DEFAULT 288 +#define TOK_DEFINITIONS 289 +#define TOK_DEFINED 290 +#define TOK_EMBEDDED 291 +#define TOK_ENCODED 292 +#define TOK_ENCODING_CONTROL 293 +#define TOK_END 294 +#define TOK_ENUMERATED 295 +#define TOK_EXPLICIT 296 +#define TOK_EXPORTS 297 +#define TOK_EXTENSIBILITY 298 +#define TOK_EXTERNAL 299 +#define TOK_FALSE 300 +#define TOK_FROM 301 +#define TOK_GeneralizedTime 302 +#define TOK_GeneralString 303 +#define TOK_GraphicString 304 +#define TOK_IA5String 305 +#define TOK_IDENTIFIER 306 +#define TOK_IMPLICIT 307 +#define TOK_IMPLIED 308 +#define TOK_IMPORTS 309 +#define TOK_INCLUDES 310 +#define TOK_INSTANCE 311 +#define TOK_INSTRUCTIONS 312 +#define TOK_INTEGER 313 +#define TOK_ISO646String 314 +#define TOK_MAX 315 +#define TOK_MIN 316 +#define TOK_MINUS_INFINITY 317 +#define TOK_NULL 318 +#define TOK_NumericString 319 +#define TOK_OBJECT 320 +#define TOK_ObjectDescriptor 321 +#define TOK_OCTET 322 +#define TOK_OF 323 +#define TOK_OPTIONAL 324 +#define TOK_PATTERN 325 +#define TOK_PDV 326 +#define TOK_PLUS_INFINITY 327 +#define TOK_PRESENT 328 +#define TOK_PrintableString 329 +#define TOK_PRIVATE 330 +#define TOK_REAL 331 +#define TOK_RELATIVE_OID 332 +#define TOK_SEQUENCE 333 +#define TOK_SET 334 +#define TOK_SIZE 335 +#define TOK_STRING 336 +#define TOK_SYNTAX 337 +#define TOK_T61String 338 +#define TOK_TAGS 339 +#define TOK_TeletexString 340 +#define TOK_TRUE 341 +#define TOK_TYPE_IDENTIFIER 342 +#define TOK_UNIQUE 343 +#define TOK_UNIVERSAL 344 +#define TOK_UniversalString 345 +#define TOK_UTCTime 346 +#define TOK_UTF8String 347 +#define TOK_VideotexString 348 +#define TOK_VisibleString 349 +#define TOK_WITH 350 +#define TOK_EXCEPT 351 +#define TOK_INTERSECTION 352 +#define TOK_UNION 353 +#define TOK_TwoDots 354 +#define TOK_ThreeDots 355 +#define TOK_tag 356 + + + + +#ifndef YYSTYPE +#line 58 "asn1p_y.y" typedef union { asn1p_t *a_grammar; asn1p_module_flags_e a_module_flags; @@ -29,106 +269,14 @@ typedef union { char *name; struct asn1p_type_tag_s tag; } tv_nametag; -} YYSTYPE; -#define TOK_PPEQ 257 -#define TOK_opaque 258 -#define TOK_bstring 259 -#define TOK_cstring 260 -#define TOK_hstring 261 -#define TOK_identifier 262 -#define TOK_number 263 -#define TOK_number_negative 264 -#define TOK_typereference 265 -#define TOK_capitalreference 266 -#define TOK_typefieldreference 267 -#define TOK_valuefieldreference 268 -#define TOK_ABSENT 269 -#define TOK_ABSTRACT_SYNTAX 270 -#define TOK_ALL 271 -#define TOK_ANY 272 -#define TOK_APPLICATION 273 -#define TOK_AUTOMATIC 274 -#define TOK_BEGIN 275 -#define TOK_BIT 276 -#define TOK_BMPString 277 -#define TOK_BOOLEAN 278 -#define TOK_BY 279 -#define TOK_CHARACTER 280 -#define TOK_CHOICE 281 -#define TOK_CLASS 282 -#define TOK_COMPONENT 283 -#define TOK_COMPONENTS 284 -#define TOK_CONSTRAINED 285 -#define TOK_CONTAINING 286 -#define TOK_DEFAULT 287 -#define TOK_DEFINITIONS 288 -#define TOK_DEFINED 289 -#define TOK_EMBEDDED 290 -#define TOK_ENCODED 291 -#define TOK_ENCODING_CONTROL 292 -#define TOK_END 293 -#define TOK_ENUMERATED 294 -#define TOK_EXPLICIT 295 -#define TOK_EXPORTS 296 -#define TOK_EXTENSIBILITY 297 -#define TOK_EXTERNAL 298 -#define TOK_FALSE 299 -#define TOK_FROM 300 -#define TOK_GeneralizedTime 301 -#define TOK_GeneralString 302 -#define TOK_GraphicString 303 -#define TOK_IA5String 304 -#define TOK_IDENTIFIER 305 -#define TOK_IMPLICIT 306 -#define TOK_IMPLIED 307 -#define TOK_IMPORTS 308 -#define TOK_INCLUDES 309 -#define TOK_INSTANCE 310 -#define TOK_INSTRUCTIONS 311 -#define TOK_INTEGER 312 -#define TOK_ISO646String 313 -#define TOK_MAX 314 -#define TOK_MIN 315 -#define TOK_MINUS_INFINITY 316 -#define TOK_NULL 317 -#define TOK_NumericString 318 -#define TOK_OBJECT 319 -#define TOK_ObjectDescriptor 320 -#define TOK_OCTET 321 -#define TOK_OF 322 -#define TOK_OPTIONAL 323 -#define TOK_PATTERN 324 -#define TOK_PDV 325 -#define TOK_PLUS_INFINITY 326 -#define TOK_PRESENT 327 -#define TOK_PrintableString 328 -#define TOK_PRIVATE 329 -#define TOK_REAL 330 -#define TOK_RELATIVE_OID 331 -#define TOK_SEQUENCE 332 -#define TOK_SET 333 -#define TOK_SIZE 334 -#define TOK_STRING 335 -#define TOK_SYNTAX 336 -#define TOK_T61String 337 -#define TOK_TAGS 338 -#define TOK_TeletexString 339 -#define TOK_TRUE 340 -#define TOK_TYPE_IDENTIFIER 341 -#define TOK_UNIQUE 342 -#define TOK_UNIVERSAL 343 -#define TOK_UniversalString 344 -#define TOK_UTCTime 345 -#define TOK_UTF8String 346 -#define TOK_VideotexString 347 -#define TOK_VisibleString 348 -#define TOK_WITH 349 -#define TOK_EXCEPT 350 -#define TOK_INTERSECTION 351 -#define TOK_UNION 352 -#define TOK_TwoDots 353 -#define TOK_ThreeDots 354 -#define TOK_tag 355 - +} yystype; +/* Line 1281 of /usr/local/share/bison/yacc.c. */ +#line 275 "y.tab.h" +# define YYSTYPE yystype +#endif extern YYSTYPE asn1p_lval; + + +#endif /* not BISON_ASN_P_Y_H */ + diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index 2d7a9cb57..71fa0fa3f 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -1395,11 +1395,11 @@ BasicString: TOK_BMPString { $$ = ASN_STRING_BMPString; } | TOK_GeneralString { $$ = ASN_STRING_GeneralString; - return yyerror("GeneralString is not supported"); + fprintf(stderr, "WARNING: GeneralString is not fully supported"); } | TOK_GraphicString { $$ = ASN_STRING_GraphicString; - return yyerror("GraphicString is not supported"); + fprintf(stderr, "WARNING: GraphicString is not fully supported"); } | TOK_IA5String { $$ = ASN_STRING_IA5String; } | TOK_ISO646String { $$ = ASN_STRING_ISO646String; } @@ -1407,14 +1407,14 @@ BasicString: | TOK_PrintableString { $$ = ASN_STRING_PrintableString; } | TOK_T61String { $$ = ASN_STRING_T61String; - return yyerror("T61String not implemented yet"); + fprintf(stderr, "WARNING: T61String is not fully supported"); } | TOK_TeletexString { $$ = ASN_STRING_TeletexString; } | TOK_UniversalString { $$ = ASN_STRING_UniversalString; } | TOK_UTF8String { $$ = ASN_STRING_UTF8String; } | TOK_VideotexString { $$ = ASN_STRING_VideotexString; - return yyerror("VideotexString is no longer supported"); + fprintf(stderr, "WARNING: VideotexString is not fully supported"); } | TOK_VisibleString { $$ = ASN_STRING_VisibleString; } | TOK_ObjectDescriptor { $$ = ASN_STRING_ObjectDescriptor; } From 7502143c32d92861e0e785ca8047c81d1bc18ef2 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 7 Sep 2004 10:47:39 +0000 Subject: [PATCH 0288/1469] inttypes/stdint hell git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@288 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_types.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/skeletons/asn_types.h b/skeletons/asn_types.h index 17cf12546..a5620b556 100644 --- a/skeletons/asn_types.h +++ b/skeletons/asn_types.h @@ -8,13 +8,26 @@ #ifndef _ASN_TYPES_H_ #define _ASN_TYPES_H_ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include /* For fprintf() */ #include /* For *alloc(3) */ #include /* For memcpy(3) */ #include /* For size_t */ #include /* For va_start */ #include /* for offsetof and ptrdiff_t */ + +#include /* C99 specifies this file */ + +/* + * Earlier FreeBSD version didn't have , + * but was present. + */ +#if !defined(__FreeBSD__) || !defined(_SYS_INTTYPES_H_) /* Workaround */ #include /* SUSv2+ and C99 specify this file, for uintXX_t */ +#endif #ifdef WIN32 #define snprintf _snprintf From b71a9d3fec55afbcb13225d12dc575f1587fc99c Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 8 Sep 2004 00:26:56 +0000 Subject: [PATCH 0289/1469] tests for recursive definitions git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@289 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/43-recursion-OK.asn1 | 12 +- tests/43-recursion-OK.asn1.-P | 315 ++++++++++++++++++++++++++++++++++ 2 files changed, 322 insertions(+), 5 deletions(-) create mode 100644 tests/43-recursion-OK.asn1.-P diff --git a/tests/43-recursion-OK.asn1 b/tests/43-recursion-OK.asn1 index 185b8ccba..f2ee3eb43 100644 --- a/tests/43-recursion-OK.asn1 +++ b/tests/43-recursion-OK.asn1 @@ -14,13 +14,15 @@ BEGIN Test-structure-1 ::= SEQUENCE { t-member1 SET OF Test-structure-1, t-member2 SEQUENCE OF Test-structure-1, - t-member3 Test-structure-1 OPTIONAL + t-member3 Test-structure-1 OPTIONAL, + t-member4 INTEGER } - Sets ::= SEQUENCE { - s-member1 SET OF INTEGER, - s-member2 SET OF ENUMERATED { a, b }, - s-member3 SET OF IA5String + Choice-1 ::= CHOICE { + and [1] Choice-1, + or [2] IMPLICIT SET OF Choice-1, + not [3] Choice-1, + other [4] INTEGER } END diff --git a/tests/43-recursion-OK.asn1.-P b/tests/43-recursion-OK.asn1.-P new file mode 100644 index 000000000..a38cd02bb --- /dev/null +++ b/tests/43-recursion-OK.asn1.-P @@ -0,0 +1,315 @@ + +/*** <<< INCLUDES [Test-structure-1] >>> ***/ + +#include +#include +#include +#include +#include +#include +#include + +/*** <<< DEPS [Test-structure-1] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Test_structure_1; + +/*** <<< TYPE-DECLS [Test-structure-1] >>> ***/ + + +typedef struct Test_structure_1 { + struct t_member1 { + A_SET_OF(struct Test_structure_1) list; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; + } t_member1; + struct t_member2 { + A_SEQUENCE_OF(struct Test_structure_1) list; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; + } t_member2; + struct Test_structure_1 *t_member3 /* OPTIONAL */; + INTEGER_t t_member4; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} Test_structure_1_t; + +/*** <<< STAT-DEFS [Test-structure-1] >>> ***/ + +static asn1_TYPE_member_t asn1_MBR_t_member1[] = { + { 0, 0, + .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_Test_structure_1, + .memb_constraints = 0, /* Defer to actual type */ + .name = "" + }, +}; +static ber_tlv_tag_t asn1_DEF_t_member1_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) +}; +static asn1_SET_OF_specifics_t asn1_DEF_t_member1_specs = { + sizeof(struct t_member1), + offsetof(struct t_member1, _ber_dec_ctx), +}; +static /* Use -fall-defs-global to expose */ +asn1_TYPE_descriptor_t asn1_DEF_t_member1 = { + "t-member1", + SET_OF_constraint, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_print, + SET_OF_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_t_member1_tags, + sizeof(asn1_DEF_t_member1_tags) + /sizeof(asn1_DEF_t_member1_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_t_member1, + 1, /* Single element */ + &asn1_DEF_t_member1_specs /* Additional specs */ +}; + +static asn1_TYPE_member_t asn1_MBR_t_member2[] = { + { 0, 0, + .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_Test_structure_1, + .memb_constraints = 0, /* Defer to actual type */ + .name = "" + }, +}; +static ber_tlv_tag_t asn1_DEF_t_member2_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_SET_OF_specifics_t asn1_DEF_t_member2_specs = { + sizeof(struct t_member2), + offsetof(struct t_member2, _ber_dec_ctx), +}; +static /* Use -fall-defs-global to expose */ +asn1_TYPE_descriptor_t asn1_DEF_t_member2 = { + "t-member2", + SEQUENCE_OF_constraint, + SEQUENCE_OF_decode_ber, + SEQUENCE_OF_encode_der, + SEQUENCE_OF_print, + SEQUENCE_OF_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_t_member2_tags, + sizeof(asn1_DEF_t_member2_tags) + /sizeof(asn1_DEF_t_member2_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_t_member2, + 1, /* Single element */ + &asn1_DEF_t_member2_specs /* Additional specs */ +}; + +static asn1_TYPE_member_t asn1_MBR_Test_structure_1[] = { + { 0, offsetof(struct Test_structure_1, t_member1), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_t_member1, + .memb_constraints = 0, /* Defer to actual type */ + .name = "t-member1" + }, + { 0, offsetof(struct Test_structure_1, t_member2), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_t_member2, + .memb_constraints = 0, /* Defer to actual type */ + .name = "t-member2" + }, + { 1, offsetof(struct Test_structure_1, t_member3), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_Test_structure_1, + .memb_constraints = 0, /* Defer to actual type */ + .name = "t-member3" + }, + { 0, offsetof(struct Test_structure_1, t_member4), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_INTEGER, + .memb_constraints = 0, /* Defer to actual type */ + .name = "t-member4" + }, +}; +static ber_tlv_tag_t asn1_DEF_Test_structure_1_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_TYPE_tag2member_t asn1_DEF_Test_structure_1_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 3, 0, 0 }, /* t-member4 at 19 */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 1 }, /* t-member2 at 16 */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 0 }, /* t-member3 at 17 */ + { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0, 0, 0 }, /* t-member1 at 15 */ +}; +static asn1_SEQUENCE_specifics_t asn1_DEF_Test_structure_1_specs = { + sizeof(struct Test_structure_1), + offsetof(struct Test_structure_1, _ber_dec_ctx), + asn1_DEF_Test_structure_1_tag2el, + 4, /* Count of tags in the map */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn1_TYPE_descriptor_t asn1_DEF_Test_structure_1 = { + "Test-structure-1", + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_print, + SEQUENCE_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Test_structure_1_tags, + sizeof(asn1_DEF_Test_structure_1_tags) + /sizeof(asn1_DEF_Test_structure_1_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_Test_structure_1, + 4, /* Elements count */ + &asn1_DEF_Test_structure_1_specs /* Additional specs */ +}; + + +/*** <<< INCLUDES [Choice-1] >>> ***/ + +#include +#include +#include +#include +#include + +/*** <<< DEPS [Choice-1] >>> ***/ + +typedef enum Choice_1_PR { + Choice_1_PR_NOTHING, /* No components present */ + Choice_1_PR_and, + Choice_1_PR_or, + Choice_1_PR_not, + Choice_1_PR_other, +} Choice_1_PR; +extern asn1_TYPE_descriptor_t asn1_DEF_Choice_1; + +/*** <<< TYPE-DECLS [Choice-1] >>> ***/ + + +typedef struct Choice_1 { + Choice_1_PR present; + union { + struct Choice_1 and; + struct or { + A_SET_OF(struct Choice_1) list; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; + } or; + struct Choice_1 not; + INTEGER_t other; + } choice; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} Choice_1_t; + +/*** <<< STAT-DEFS [Choice-1] >>> ***/ + +static asn1_TYPE_member_t asn1_MBR_or[] = { + { 0, 0, + .tag = -1 /* Ambiguous tag (CHOICE|ANY?) */, + .tag_mode = 0, + .type = (void *)&asn1_DEF_Choice_1, + .memb_constraints = 0, /* Defer to actual type */ + .name = "" + }, +}; +static ber_tlv_tag_t asn1_DEF_or_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (2 << 2)) +}; +static asn1_SET_OF_specifics_t asn1_DEF_or_specs = { + sizeof(struct or), + offsetof(struct or, _ber_dec_ctx), +}; +static /* Use -fall-defs-global to expose */ +asn1_TYPE_descriptor_t asn1_DEF_or = { + "or", + SET_OF_constraint, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_print, + SET_OF_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_or_tags, + sizeof(asn1_DEF_or_tags) + /sizeof(asn1_DEF_or_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_or, + 1, /* Single element */ + &asn1_DEF_or_specs /* Additional specs */ +}; + +static asn1_TYPE_member_t asn1_MBR_Choice_1[] = { + { 0, offsetof(struct Choice_1, choice.and), + .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + .tag_mode = +1, /* EXPLICIT tag at current level */ + .type = (void *)&asn1_DEF_Choice_1, + .memb_constraints = 0, /* Defer to actual type */ + .name = "and" + }, + { 0, offsetof(struct Choice_1, choice.or), + .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn1_DEF_or, + .memb_constraints = 0, /* Defer to actual type */ + .name = "or" + }, + { 0, offsetof(struct Choice_1, choice.not), + .tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + .tag_mode = +1, /* EXPLICIT tag at current level */ + .type = (void *)&asn1_DEF_Choice_1, + .memb_constraints = 0, /* Defer to actual type */ + .name = "not" + }, + { 0, offsetof(struct Choice_1, choice.other), + .tag = (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + .tag_mode = +1, /* EXPLICIT tag at current level */ + .type = (void *)&asn1_DEF_INTEGER, + .memb_constraints = 0, /* Defer to actual type */ + .name = "other" + }, +}; +static asn1_TYPE_tag2member_t asn1_DEF_Choice_1_tag2el[] = { + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* and at 22 */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* or at 23 */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* not at 24 */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 3, 0, 0 }, /* other at 26 */ +}; +static asn1_CHOICE_specifics_t asn1_DEF_Choice_1_specs = { + sizeof(struct Choice_1), + offsetof(struct Choice_1, _ber_dec_ctx), + offsetof(struct Choice_1, present), + sizeof(((struct Choice_1 *)0)->present), + asn1_DEF_Choice_1_tag2el, + 4, /* Count of tags in the map */ + 0 /* Whether extensible */ +}; +asn1_TYPE_descriptor_t asn1_DEF_Choice_1 = { + "Choice-1", + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_print, + CHOICE_free, + CHOICE_outmost_tag, + 0, /* No explicit tags (pointer) */ + 0, /* No explicit tags (count) */ + 0, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_Choice_1, + 4, /* Elements count */ + &asn1_DEF_Choice_1_specs /* Additional specs */ +}; + From 21c70458df5da07d97eab6d4be124cb8ffcd0802 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 8 Sep 2004 00:27:33 +0000 Subject: [PATCH 0290/1469] better recursive defs handling git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@290 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index e6414fd53..2c00deaf8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,7 @@ * Extended constraints support in parametrized types. * Better support for parametrization and constraints handling. + * Better handling of recursive type definitions. * Added support for ANY type. 0.9.2: 2004-Aug-24 From 6a02a8a31d944d4ca1f90dcc1aa47f0c23707f88 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 8 Sep 2004 00:28:11 +0000 Subject: [PATCH 0291/1469] maintaining parent expression git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@291 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_constr.c | 6 +- libasn1fix/asn1fix_misc.c | 1 + libasn1fix/asn1fix_param.c | 26 +- libasn1parser/asn1p_expr.c | 27 +- libasn1parser/asn1p_expr.h | 7 +- libasn1parser/asn1p_y.c | 4903 +++++++++++++++-------------------- libasn1parser/asn1p_y.h | 350 +-- libasn1parser/asn1p_y.y | 32 +- 8 files changed, 2293 insertions(+), 3059 deletions(-) diff --git a/libasn1fix/asn1fix_constr.c b/libasn1fix/asn1fix_constr.c index 8c9dd3833..4a3b99bcc 100644 --- a/libasn1fix/asn1fix_constr.c +++ b/libasn1fix/asn1fix_constr.c @@ -68,8 +68,10 @@ asn1f_pull_components_of(arg_t *arg) { * Move all components of the cloned structure * into the current one. */ - while((memb = TQ_REMOVE(&(coft->members), next))) + while((memb = TQ_REMOVE(&(coft->members), next))) { TQ_ADD(&list, memb, next); + memb->parent_expr = expr; + } asn1p_expr_free(coft); /* Remove wrapper */ } @@ -159,7 +161,7 @@ asn1f_fix_constr_ext(arg_t *arg) { asn1p_expr_free(v); r_value = -1; } else { - TQ_ADD(&(expr->members), v, next); + asn1p_expr_add(expr, v); } } else { r_value = -1; diff --git a/libasn1fix/asn1fix_misc.c b/libasn1fix/asn1fix_misc.c index 4ea94950a..8e70c9014 100644 --- a/libasn1fix/asn1fix_misc.c +++ b/libasn1fix/asn1fix_misc.c @@ -171,6 +171,7 @@ asn1f_recurse_expr(arg_t *arg, int (*callback)(arg_t *arg)) { */ TQ_FOR(arg->expr, &(expr->members), next) { assert(arg->expr->expr_type != A1TC_INVALID); + assert(arg->expr->parent_expr == expr); ret = asn1f_recurse_expr(arg, callback); RET2RVAL(ret, rvalue); } diff --git a/libasn1fix/asn1fix_param.c b/libasn1fix/asn1fix_param.c index 5ce6b933b..1ecdeb10b 100644 --- a/libasn1fix/asn1fix_param.c +++ b/libasn1fix/asn1fix_param.c @@ -58,15 +58,23 @@ asn1f_fix_parametrized_assignment(arg_t *arg) { return asn1f_parametrize(arg, expr, ptype); } -#define SUBSTITUTE(to, from) do { \ - asn1p_expr_t tmp; \ - tmp = *(to); \ - *(to) = *(from); \ - *(from) = tmp; \ - (to)->next = tmp.next; \ - memset(&((from)->next), 0, \ - sizeof((from)->next)); \ - asn1p_expr_free(from); \ +#define SUBSTITUTE(to, from) do { \ + asn1p_expr_t tmp, *__v; \ + tmp = *(to); \ + *(to) = *(from); \ + TQ_MOVE(&(to)->members, &(from)->members); \ + *(from) = tmp; \ + (to)->next = tmp.next; \ + (to)->parent_expr = tmp.parent_expr; \ + memset(&((from)->next), 0, \ + sizeof((from)->next)); \ + memset(&((from)->members), 0, \ + sizeof((from)->members)); \ + asn1p_expr_free(from); \ + TQ_FOR(__v, &((to)->members), next) { \ + assert(__v->parent_expr == (from)); \ + __v->parent_expr = (to); \ + } \ } while(0) static int diff --git a/libasn1parser/asn1p_expr.c b/libasn1parser/asn1p_expr.c index 4337981f9..755196f36 100644 --- a/libasn1parser/asn1p_expr.c +++ b/libasn1parser/asn1p_expr.c @@ -82,12 +82,22 @@ asn1p_expr_clone(asn1p_expr_t *expr, int skip_extensions) { asn1p_expr_free(clone); return NULL; } - TQ_ADD(&(clone->members), cmemb, next); + asn1p_expr_add(clone, cmemb); } return clone; } +/* + * Add expression as a member of another. + */ +void +asn1p_expr_add(asn1p_expr_t *to, asn1p_expr_t *what) { + TQ_ADD(&(to->members), what, next); + what->parent_expr = to; +} + + /* * Destruct the types collection structure. */ @@ -96,6 +106,16 @@ asn1p_expr_free(asn1p_expr_t *expr) { if(expr) { asn1p_expr_t *tm; + /* Remove all children */ + while((tm = TQ_REMOVE(&(expr->members), next))) { + if(tm->parent_expr != expr) + printf("<%s:%p !-> %s:%p>\n", + tm->Identifier, tm->parent_expr, + expr->Identifier, expr); + assert(tm->parent_expr == expr); + asn1p_expr_free(tm); + } + if(expr->Identifier) free(expr->Identifier); if(expr->reference) @@ -111,11 +131,6 @@ asn1p_expr_free(asn1p_expr_t *expr) { if(expr->with_syntax) asn1p_wsyntx_free(expr->with_syntax); - /* Remove all children */ - while((tm = TQ_REMOVE(&(expr->members), next))) { - asn1p_expr_free(tm); - } - if(expr->data && expr->data_free) expr->data_free(expr->data); diff --git a/libasn1parser/asn1p_expr.h b/libasn1parser/asn1p_expr.h index 9accf4c57..461f42da5 100644 --- a/libasn1parser/asn1p_expr.h +++ b/libasn1parser/asn1p_expr.h @@ -195,14 +195,16 @@ typedef struct asn1p_expr_s { */ TQ_ENTRY(struct asn1p_expr_s) next; + struct asn1p_expr_s *parent_expr; /* optional */ + + struct asn1p_module_s *module; /* Defined in module */ + /* * Line number where this structure is defined in the original * grammar source. */ int _lineno; - struct asn1p_module_s *module; /* Defined in module */ - /* * Marks are used for various purposes. * Here are some predefined ones. @@ -228,6 +230,7 @@ typedef struct asn1p_expr_s { */ asn1p_expr_t *asn1p_expr_new(int _lineno); asn1p_expr_t *asn1p_expr_clone(asn1p_expr_t *, int skip_extensions); +void asn1p_expr_add(asn1p_expr_t *to, asn1p_expr_t *what); void asn1p_expr_free(asn1p_expr_t *expr); #endif /* ASN1_PARSER_EXPR_H */ diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index e0c84aa5b..9a33633d7 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -1,269 +1,116 @@ -/* A Bison parser, made from asn1p_y.y, by GNU bison 1.75. */ -/* Skeleton parser for Yacc-like parsing with Bison, - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. +/* A Bison parser, made from asn1p_y.y + by GNU Bison version 1.28 */ - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -/* Written by Richard Stallman by simplifying the original so called - ``semantic'' parser. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ - -/* Identify Bison output. */ -#define YYBISON 1 - -/* Pure parsers. */ -#define YYPURE 0 - -/* Using locations. */ -#define YYLSP_NEEDED 0 +#define YYBISON 1 /* Identify Bison output. */ -/* If NAME_PREFIX is specified substitute the variables and functions - names. */ #define yyparse asn1p_parse -#define yylex asn1p_lex +#define yylex asn1p_lex #define yyerror asn1p_error -#define yylval asn1p_lval -#define yychar asn1p_char +#define yylval asn1p_lval +#define yychar asn1p_char #define yydebug asn1p_debug #define yynerrs asn1p_nerrs +#define TOK_PPEQ 257 +#define TOK_opaque 258 +#define TOK_bstring 259 +#define TOK_cstring 260 +#define TOK_hstring 261 +#define TOK_identifier 262 +#define TOK_number 263 +#define TOK_number_negative 264 +#define TOK_typereference 265 +#define TOK_capitalreference 266 +#define TOK_typefieldreference 267 +#define TOK_valuefieldreference 268 +#define TOK_ABSENT 269 +#define TOK_ABSTRACT_SYNTAX 270 +#define TOK_ALL 271 +#define TOK_ANY 272 +#define TOK_APPLICATION 273 +#define TOK_AUTOMATIC 274 +#define TOK_BEGIN 275 +#define TOK_BIT 276 +#define TOK_BMPString 277 +#define TOK_BOOLEAN 278 +#define TOK_BY 279 +#define TOK_CHARACTER 280 +#define TOK_CHOICE 281 +#define TOK_CLASS 282 +#define TOK_COMPONENT 283 +#define TOK_COMPONENTS 284 +#define TOK_CONSTRAINED 285 +#define TOK_CONTAINING 286 +#define TOK_DEFAULT 287 +#define TOK_DEFINITIONS 288 +#define TOK_DEFINED 289 +#define TOK_EMBEDDED 290 +#define TOK_ENCODED 291 +#define TOK_ENCODING_CONTROL 292 +#define TOK_END 293 +#define TOK_ENUMERATED 294 +#define TOK_EXPLICIT 295 +#define TOK_EXPORTS 296 +#define TOK_EXTENSIBILITY 297 +#define TOK_EXTERNAL 298 +#define TOK_FALSE 299 +#define TOK_FROM 300 +#define TOK_GeneralizedTime 301 +#define TOK_GeneralString 302 +#define TOK_GraphicString 303 +#define TOK_IA5String 304 +#define TOK_IDENTIFIER 305 +#define TOK_IMPLICIT 306 +#define TOK_IMPLIED 307 +#define TOK_IMPORTS 308 +#define TOK_INCLUDES 309 +#define TOK_INSTANCE 310 +#define TOK_INSTRUCTIONS 311 +#define TOK_INTEGER 312 +#define TOK_ISO646String 313 +#define TOK_MAX 314 +#define TOK_MIN 315 +#define TOK_MINUS_INFINITY 316 +#define TOK_NULL 317 +#define TOK_NumericString 318 +#define TOK_OBJECT 319 +#define TOK_ObjectDescriptor 320 +#define TOK_OCTET 321 +#define TOK_OF 322 +#define TOK_OPTIONAL 323 +#define TOK_PATTERN 324 +#define TOK_PDV 325 +#define TOK_PLUS_INFINITY 326 +#define TOK_PRESENT 327 +#define TOK_PrintableString 328 +#define TOK_PRIVATE 329 +#define TOK_REAL 330 +#define TOK_RELATIVE_OID 331 +#define TOK_SEQUENCE 332 +#define TOK_SET 333 +#define TOK_SIZE 334 +#define TOK_STRING 335 +#define TOK_SYNTAX 336 +#define TOK_T61String 337 +#define TOK_TAGS 338 +#define TOK_TeletexString 339 +#define TOK_TRUE 340 +#define TOK_TYPE_IDENTIFIER 341 +#define TOK_UNIQUE 342 +#define TOK_UNIVERSAL 343 +#define TOK_UniversalString 344 +#define TOK_UTCTime 345 +#define TOK_UTF8String 346 +#define TOK_VideotexString 347 +#define TOK_VisibleString 348 +#define TOK_WITH 349 +#define TOK_EXCEPT 350 +#define TOK_INTERSECTION 351 +#define TOK_UNION 352 +#define TOK_TwoDots 353 +#define TOK_ThreeDots 354 +#define TOK_tag 355 - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - TOK_PPEQ = 258, - TOK_opaque = 259, - TOK_bstring = 260, - TOK_cstring = 261, - TOK_hstring = 262, - TOK_identifier = 263, - TOK_number = 264, - TOK_number_negative = 265, - TOK_typereference = 266, - TOK_capitalreference = 267, - TOK_typefieldreference = 268, - TOK_valuefieldreference = 269, - TOK_ABSENT = 270, - TOK_ABSTRACT_SYNTAX = 271, - TOK_ALL = 272, - TOK_ANY = 273, - TOK_APPLICATION = 274, - TOK_AUTOMATIC = 275, - TOK_BEGIN = 276, - TOK_BIT = 277, - TOK_BMPString = 278, - TOK_BOOLEAN = 279, - TOK_BY = 280, - TOK_CHARACTER = 281, - TOK_CHOICE = 282, - TOK_CLASS = 283, - TOK_COMPONENT = 284, - TOK_COMPONENTS = 285, - TOK_CONSTRAINED = 286, - TOK_CONTAINING = 287, - TOK_DEFAULT = 288, - TOK_DEFINITIONS = 289, - TOK_DEFINED = 290, - TOK_EMBEDDED = 291, - TOK_ENCODED = 292, - TOK_ENCODING_CONTROL = 293, - TOK_END = 294, - TOK_ENUMERATED = 295, - TOK_EXPLICIT = 296, - TOK_EXPORTS = 297, - TOK_EXTENSIBILITY = 298, - TOK_EXTERNAL = 299, - TOK_FALSE = 300, - TOK_FROM = 301, - TOK_GeneralizedTime = 302, - TOK_GeneralString = 303, - TOK_GraphicString = 304, - TOK_IA5String = 305, - TOK_IDENTIFIER = 306, - TOK_IMPLICIT = 307, - TOK_IMPLIED = 308, - TOK_IMPORTS = 309, - TOK_INCLUDES = 310, - TOK_INSTANCE = 311, - TOK_INSTRUCTIONS = 312, - TOK_INTEGER = 313, - TOK_ISO646String = 314, - TOK_MAX = 315, - TOK_MIN = 316, - TOK_MINUS_INFINITY = 317, - TOK_NULL = 318, - TOK_NumericString = 319, - TOK_OBJECT = 320, - TOK_ObjectDescriptor = 321, - TOK_OCTET = 322, - TOK_OF = 323, - TOK_OPTIONAL = 324, - TOK_PATTERN = 325, - TOK_PDV = 326, - TOK_PLUS_INFINITY = 327, - TOK_PRESENT = 328, - TOK_PrintableString = 329, - TOK_PRIVATE = 330, - TOK_REAL = 331, - TOK_RELATIVE_OID = 332, - TOK_SEQUENCE = 333, - TOK_SET = 334, - TOK_SIZE = 335, - TOK_STRING = 336, - TOK_SYNTAX = 337, - TOK_T61String = 338, - TOK_TAGS = 339, - TOK_TeletexString = 340, - TOK_TRUE = 341, - TOK_TYPE_IDENTIFIER = 342, - TOK_UNIQUE = 343, - TOK_UNIVERSAL = 344, - TOK_UniversalString = 345, - TOK_UTCTime = 346, - TOK_UTF8String = 347, - TOK_VideotexString = 348, - TOK_VisibleString = 349, - TOK_WITH = 350, - TOK_EXCEPT = 351, - TOK_INTERSECTION = 352, - TOK_UNION = 353, - TOK_TwoDots = 354, - TOK_ThreeDots = 355, - TOK_tag = 356 - }; -#endif -#define TOK_PPEQ 258 -#define TOK_opaque 259 -#define TOK_bstring 260 -#define TOK_cstring 261 -#define TOK_hstring 262 -#define TOK_identifier 263 -#define TOK_number 264 -#define TOK_number_negative 265 -#define TOK_typereference 266 -#define TOK_capitalreference 267 -#define TOK_typefieldreference 268 -#define TOK_valuefieldreference 269 -#define TOK_ABSENT 270 -#define TOK_ABSTRACT_SYNTAX 271 -#define TOK_ALL 272 -#define TOK_ANY 273 -#define TOK_APPLICATION 274 -#define TOK_AUTOMATIC 275 -#define TOK_BEGIN 276 -#define TOK_BIT 277 -#define TOK_BMPString 278 -#define TOK_BOOLEAN 279 -#define TOK_BY 280 -#define TOK_CHARACTER 281 -#define TOK_CHOICE 282 -#define TOK_CLASS 283 -#define TOK_COMPONENT 284 -#define TOK_COMPONENTS 285 -#define TOK_CONSTRAINED 286 -#define TOK_CONTAINING 287 -#define TOK_DEFAULT 288 -#define TOK_DEFINITIONS 289 -#define TOK_DEFINED 290 -#define TOK_EMBEDDED 291 -#define TOK_ENCODED 292 -#define TOK_ENCODING_CONTROL 293 -#define TOK_END 294 -#define TOK_ENUMERATED 295 -#define TOK_EXPLICIT 296 -#define TOK_EXPORTS 297 -#define TOK_EXTENSIBILITY 298 -#define TOK_EXTERNAL 299 -#define TOK_FALSE 300 -#define TOK_FROM 301 -#define TOK_GeneralizedTime 302 -#define TOK_GeneralString 303 -#define TOK_GraphicString 304 -#define TOK_IA5String 305 -#define TOK_IDENTIFIER 306 -#define TOK_IMPLICIT 307 -#define TOK_IMPLIED 308 -#define TOK_IMPORTS 309 -#define TOK_INCLUDES 310 -#define TOK_INSTANCE 311 -#define TOK_INSTRUCTIONS 312 -#define TOK_INTEGER 313 -#define TOK_ISO646String 314 -#define TOK_MAX 315 -#define TOK_MIN 316 -#define TOK_MINUS_INFINITY 317 -#define TOK_NULL 318 -#define TOK_NumericString 319 -#define TOK_OBJECT 320 -#define TOK_ObjectDescriptor 321 -#define TOK_OCTET 322 -#define TOK_OF 323 -#define TOK_OPTIONAL 324 -#define TOK_PATTERN 325 -#define TOK_PDV 326 -#define TOK_PLUS_INFINITY 327 -#define TOK_PRESENT 328 -#define TOK_PrintableString 329 -#define TOK_PRIVATE 330 -#define TOK_REAL 331 -#define TOK_RELATIVE_OID 332 -#define TOK_SEQUENCE 333 -#define TOK_SET 334 -#define TOK_SIZE 335 -#define TOK_STRING 336 -#define TOK_SYNTAX 337 -#define TOK_T61String 338 -#define TOK_TAGS 339 -#define TOK_TeletexString 340 -#define TOK_TRUE 341 -#define TOK_TYPE_IDENTIFIER 342 -#define TOK_UNIQUE 343 -#define TOK_UNIVERSAL 344 -#define TOK_UniversalString 345 -#define TOK_UTCTime 346 -#define TOK_UTF8String 347 -#define TOK_VideotexString 348 -#define TOK_VisibleString 349 -#define TOK_WITH 350 -#define TOK_EXCEPT 351 -#define TOK_INTERSECTION 352 -#define TOK_UNION 353 -#define TOK_TwoDots 354 -#define TOK_ThreeDots 355 -#define TOK_tag 356 - - - - -/* Copy the first part of user declarations. */ #line 1 "asn1p_y.y" @@ -290,9 +137,9 @@ extern int asn1p_lineno; static asn1p_value_t * _convert_bitstring2binary(char *str, int base); -#define checkmem(ptr) do { \ - if(!(ptr)) \ - return yyerror("Memory failure"); \ +#define checkmem(ptr) do { \ + if(!(ptr)) \ + return yyerror("Memory failure"); \ } while(0) #define CONSTRAINT_INSERT(root, constr_type, arg1, arg2) do { \ @@ -315,21 +162,6 @@ static asn1p_value_t * } while(0) - -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 -#endif - -#ifndef YYSTYPE #line 58 "asn1p_y.y" typedef union { asn1p_t *a_grammar; @@ -362,1057 +194,815 @@ typedef union { char *name; struct asn1p_type_tag_s tag; } tv_nametag; -} yystype; -/* Line 193 of /usr/local/share/bison/yacc.c. */ -#line 368 "asn1p_y.c" -# define YYSTYPE yystype -# define YYSTYPE_IS_TRIVIAL 1 -#endif +} YYSTYPE; +#include -#ifndef YYLTYPE -typedef struct yyltype -{ - int first_line; - int first_column; - int last_line; - int last_column; -} yyltype; -# define YYLTYPE yyltype -# define YYLTYPE_IS_TRIVIAL 1 +#ifndef __cplusplus +#ifndef __STDC__ +#define const #endif - -/* Copy the second part of user declarations. */ - - -/* Line 213 of /usr/local/share/bison/yacc.c. */ -#line 389 "asn1p_y.c" - -#if ! defined (yyoverflow) || YYERROR_VERBOSE - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# if YYSTACK_USE_ALLOCA -# define YYSTACK_ALLOC alloca -# else -# ifndef YYSTACK_USE_ALLOCA -# if defined (alloca) || defined (_ALLOCA_H) -# define YYSTACK_ALLOC alloca -# else -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) -# else -# if defined (__STDC__) || defined (__cplusplus) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# endif -# define YYSTACK_ALLOC malloc -# define YYSTACK_FREE free -# endif -#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ - - -#if (! defined (yyoverflow) \ - && (! defined (__cplusplus) \ - || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) - -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - short yyss; - YYSTYPE yyvs; - }; - -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1) - -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -# define YYSTACK_BYTES(N) \ - ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ - + YYSTACK_GAP_MAX) - -/* Copy COUNT objects from FROM to TO. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if 1 < __GNUC__ -# define YYCOPY(To, From, Count) \ - __builtin_memcpy (To, From, (Count) * sizeof (*(From))) -# else -# define YYCOPY(To, From, Count) \ - do \ - { \ - register YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (To)[yyi] = (From)[yyi]; \ - } \ - while (0) -# endif -# endif - -/* Relocate STACK from its old location to the new one. The - local variables YYSIZE and YYSTACKSIZE give the old and new number of - elements in the stack, and YYPTR gives the new location of the - stack. Advance YYPTR to a properly aligned location for the next - stack. */ -# define YYSTACK_RELOCATE(Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack, Stack, yysize); \ - Stack = &yyptr->Stack; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (0) - #endif -#if defined (__STDC__) || defined (__cplusplus) - typedef signed char yysigned_char; -#else - typedef short yysigned_char; -#endif -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 7 -#define YYLAST 820 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 115 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 100 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 256 -/* YYNRULES -- Number of states. */ -#define YYNSTATES 396 - -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -#define YYUNDEFTOK 2 -#define YYMAXUTOK 356 - -#define YYTRANSLATE(X) \ - ((unsigned)(X) <= YYMAXUTOK ? yytranslate[X] : YYUNDEFTOK) - -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ -static const unsigned char yytranslate[] = -{ - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 111, 2, 2, 2, 2, 2, 2, - 106, 107, 2, 2, 109, 2, 112, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 110, 108, - 113, 2, 2, 2, 114, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 97, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 104, 99, 105, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 98, 100, 101, 102, 103 -}; -#if YYDEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const unsigned short yyprhs[] = -{ - 0, 0, 3, 5, 7, 10, 19, 20, 22, 26, - 29, 31, 34, 36, 41, 43, 44, 46, 48, 51, - 54, 57, 60, 63, 66, 67, 69, 71, 74, 76, - 78, 80, 82, 84, 85, 89, 91, 95, 98, 100, - 103, 108, 110, 114, 116, 118, 122, 126, 129, 131, - 135, 137, 139, 146, 148, 150, 151, 153, 155, 159, - 161, 163, 168, 173, 177, 184, 186, 190, 192, 196, - 200, 202, 206, 208, 210, 212, 216, 220, 224, 226, - 228, 232, 235, 237, 243, 244, 246, 248, 252, 255, - 260, 265, 266, 268, 269, 276, 278, 281, 283, 285, - 287, 291, 295, 298, 300, 302, 307, 312, 317, 322, - 327, 329, 334, 339, 341, 345, 347, 351, 355, 357, - 361, 363, 367, 369, 371, 373, 375, 380, 381, 385, - 387, 389, 391, 393, 395, 397, 401, 403, 406, 408, - 410, 412, 414, 417, 420, 422, 424, 427, 430, 432, - 434, 436, 438, 441, 443, 446, 448, 450, 452, 454, - 456, 458, 460, 462, 464, 466, 468, 470, 472, 474, - 476, 478, 480, 482, 484, 485, 487, 489, 494, 498, - 503, 505, 509, 515, 517, 521, 525, 529, 534, 538, - 540, 544, 548, 552, 556, 558, 560, 562, 565, 568, - 572, 574, 576, 578, 580, 582, 584, 586, 592, 594, - 598, 600, 604, 605, 607, 609, 611, 613, 615, 617, - 621, 626, 628, 632, 635, 639, 641, 645, 646, 648, - 650, 653, 655, 657, 658, 662, 665, 669, 671, 675, - 677, 682, 687, 689, 691, 693, 695, 696, 698, 700, - 703, 706, 708, 710, 712, 714, 716 +#define YYFINAL 396 +#define YYFLAG -32768 +#define YYNTBASE 115 + +#define YYTRANSLATE(x) ((unsigned)(x) <= 355 ? yytranslate[x] : 214) + +static const char yytranslate[] = { 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 111, 2, 2, 2, 2, 2, 2, 106, + 107, 2, 2, 109, 2, 112, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 110, 108, 113, + 2, 2, 2, 114, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 97, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 104, 99, 105, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 98, 100, 101, 102, 103 }; -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const short yyrhs[] = -{ - 116, 0, -1, 117, -1, 118, -1, 117, 118, -1, - 211, 119, 34, 123, 3, 21, 126, 39, -1, -1, - 120, -1, 104, 121, 105, -1, 104, 105, -1, 122, - -1, 121, 122, -1, 213, -1, 213, 106, 9, 107, - -1, 9, -1, -1, 124, -1, 125, -1, 124, 125, - -1, 41, 84, -1, 52, 84, -1, 20, 84, -1, - 43, 53, -1, 12, 57, -1, -1, 127, -1, 128, - -1, 127, 128, -1, 130, -1, 135, -1, 143, -1, - 169, -1, 138, -1, -1, 38, 12, 129, -1, 177, - -1, 54, 131, 108, -1, 54, 46, -1, 132, -1, - 131, 132, -1, 133, 46, 211, 119, -1, 134, -1, - 133, 109, 134, -1, 211, -1, 213, -1, 42, 136, - 108, -1, 42, 17, 108, -1, 42, 108, -1, 137, - -1, 136, 109, 137, -1, 211, -1, 213, -1, 211, - 139, 3, 104, 140, 105, -1, 164, -1, 174, -1, - -1, 141, -1, 142, -1, 141, 109, 142, -1, 102, - -1, 185, -1, 211, 3, 209, 87, -1, 211, 3, - 209, 162, -1, 211, 3, 152, -1, 211, 104, 144, - 105, 3, 162, -1, 145, -1, 144, 109, 145, -1, - 211, -1, 211, 110, 213, -1, 174, 110, 213, -1, - 147, -1, 146, 109, 147, -1, 162, -1, 213, -1, - 149, -1, 148, 109, 149, -1, 214, 162, 201, -1, - 30, 68, 162, -1, 161, -1, 151, -1, 150, 109, - 151, -1, 214, 162, -1, 161, -1, 28, 104, 154, - 105, 156, -1, -1, 88, -1, 155, -1, 154, 109, - 155, -1, 167, 201, -1, 167, 162, 201, 153, -1, - 167, 167, 201, 153, -1, -1, 157, -1, -1, 95, - 82, 104, 158, 159, 105, -1, 160, -1, 159, 160, - -1, 4, -1, 167, -1, 102, -1, 102, 111, 172, - -1, 102, 111, 208, -1, 163, 181, -1, 176, -1, - 177, -1, 27, 104, 150, 105, -1, 78, 104, 148, - 105, -1, 79, 104, 148, 105, -1, 78, 181, 68, - 163, -1, 79, 181, 68, 163, -1, 18, -1, 18, - 35, 25, 213, -1, 211, 104, 146, 105, -1, 164, - -1, 56, 68, 164, -1, 11, -1, 11, 112, 211, - -1, 11, 112, 213, -1, 212, -1, 212, 112, 165, - -1, 166, -1, 165, 112, 166, -1, 168, -1, 168, - -1, 13, -1, 14, -1, 213, 139, 3, 170, -1, - -1, 104, 171, 173, -1, 5, -1, 7, -1, 6, - -1, 208, -1, 172, -1, 213, -1, 211, 112, 213, - -1, 4, -1, 173, 4, -1, 24, -1, 63, -1, - 76, -1, 175, -1, 67, 81, -1, 65, 51, -1, - 77, -1, 44, -1, 36, 71, -1, 26, 81, -1, - 91, -1, 47, -1, 58, -1, 40, -1, 22, 81, - -1, 174, -1, 175, 205, -1, 23, -1, 48, -1, - 49, -1, 50, -1, 59, -1, 64, -1, 74, -1, - 83, -1, 85, -1, 90, -1, 92, -1, 93, -1, - 94, -1, 66, -1, 99, -1, 100, -1, 97, -1, - 98, -1, 96, -1, -1, 182, -1, 183, -1, 80, - 106, 184, 107, -1, 106, 184, 107, -1, 183, 106, - 184, 107, -1, 185, -1, 185, 109, 102, -1, 185, - 109, 102, 109, 185, -1, 186, -1, 185, 178, 186, - -1, 185, 179, 186, -1, 186, 180, 186, -1, 188, - 106, 184, 107, -1, 106, 184, 107, -1, 189, -1, - 189, 187, 189, -1, 61, 187, 189, -1, 189, 187, - 60, -1, 61, 187, 60, -1, 195, -1, 190, -1, - 101, -1, 101, 113, -1, 113, 101, -1, 113, 101, - 113, -1, 80, -1, 46, -1, 208, -1, 213, -1, - 6, -1, 45, -1, 86, -1, 95, 30, 104, 191, - 105, -1, 192, -1, 191, 109, 192, -1, 102, -1, - 213, 181, 193, -1, -1, 194, -1, 73, -1, 15, - -1, 69, -1, 196, -1, 197, -1, 104, 211, 105, - -1, 196, 104, 198, 105, -1, 199, -1, 198, 109, - 199, -1, 114, 200, -1, 114, 112, 200, -1, 213, - -1, 200, 112, 213, -1, -1, 202, -1, 69, -1, - 33, 203, -1, 189, -1, 174, -1, -1, 104, 204, - 173, -1, 104, 105, -1, 104, 206, 105, -1, 207, - -1, 206, 109, 207, -1, 213, -1, 213, 106, 208, - 107, -1, 213, 106, 172, 107, -1, 208, -1, 102, - -1, 9, -1, 10, -1, -1, 210, -1, 103, -1, - 103, 52, -1, 103, 41, -1, 11, -1, 12, -1, - 12, -1, 8, -1, 213, -1, 213, 210, -1 +#if YYDEBUG != 0 +static const short yyprhs[] = { 0, + 0, 2, 4, 7, 16, 17, 19, 23, 26, 28, + 31, 33, 38, 40, 41, 43, 45, 48, 51, 54, + 57, 60, 63, 64, 66, 68, 71, 73, 75, 77, + 79, 81, 82, 86, 88, 92, 95, 97, 100, 105, + 107, 111, 113, 115, 119, 123, 126, 128, 132, 134, + 136, 143, 145, 147, 148, 150, 152, 156, 158, 160, + 165, 170, 174, 181, 183, 187, 189, 193, 197, 199, + 203, 205, 207, 209, 213, 217, 221, 223, 225, 229, + 232, 234, 240, 241, 243, 245, 249, 252, 257, 262, + 263, 265, 266, 273, 275, 278, 280, 282, 284, 288, + 292, 295, 297, 299, 304, 309, 314, 319, 324, 326, + 331, 336, 338, 342, 344, 348, 352, 354, 358, 360, + 364, 366, 368, 370, 372, 377, 378, 382, 384, 386, + 388, 390, 392, 394, 398, 400, 403, 405, 407, 409, + 411, 414, 417, 419, 421, 424, 427, 429, 431, 433, + 435, 438, 440, 443, 445, 447, 449, 451, 453, 455, + 457, 459, 461, 463, 465, 467, 469, 471, 473, 475, + 477, 479, 481, 482, 484, 486, 491, 495, 500, 502, + 506, 512, 514, 518, 522, 526, 531, 535, 537, 541, + 545, 549, 553, 555, 557, 559, 562, 565, 569, 571, + 573, 575, 577, 579, 581, 583, 589, 591, 595, 597, + 601, 602, 604, 606, 608, 610, 612, 614, 618, 623, + 625, 629, 632, 636, 638, 642, 643, 645, 647, 650, + 652, 654, 655, 659, 662, 666, 668, 672, 674, 679, + 684, 686, 688, 690, 692, 693, 695, 697, 700, 703, + 705, 707, 709, 711, 713 }; -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const unsigned short yyrline[] = -{ - 0, 300, 300, 306, 312, 328, 353, 355, 358, 362, - 367, 374, 382, 387, 391, 400, 402, 410, 414, 422, - 426, 429, 432, 436, 456, 458, 466, 470, 502, 506, - 515, 522, 535, 543, 542, 556, 569, 576, 581, 587, - 593, 602, 608, 614, 621, 629, 633, 636, 643, 649, - 655, 662, 671, 681, 689, 697, 699, 709, 712, 716, - 719, 731, 743, 750, 766, 775, 785, 795, 800, 807, - 817, 823, 829, 833, 845, 851, 857, 865, 872, 877, - 883, 889, 896, 901, 911, 913, 916, 924, 930, 939, - 945, 962, 964, 971, 969, 978, 983, 989, 993, 1004, - 1013, 1022, 1033, 1054, 1058, 1064, 1070, 1076, 1082, 1090, - 1098, 1104, 1118, 1142, 1149, 1163, 1172, 1182, 1192, 1200, - 1221, 1230, 1239, 1240, 1242, 1249, 1261, 1272, 1271, 1278, - 1282, 1286, 1290, 1293, 1298, 1310, 1326, 1337, 1351, 1353, - 1354, 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, - 1369, 1371, 1372, 1375, 1382, 1394, 1396, 1400, 1404, 1405, - 1406, 1407, 1408, 1412, 1413, 1414, 1415, 1419, 1420, 1427, - 1427, 1428, 1428, 1429, 1431, 1433, 1438, 1442, 1451, 1455, - 1460, 1464, 1470, 1480, 1484, 1487, 1490, 1495, 1504, 1512, - 1518, 1525, 1533, 1541, 1550, 1553, 1558, 1560, 1561, 1562, - 1565, 1569, 1574, 1578, 1589, 1594, 1599, 1606, 1612, 1616, - 1621, 1627, 1639, 1641, 1644, 1648, 1651, 1656, 1660, 1668, - 1683, 1689, 1696, 1709, 1721, 1736, 1740, 1757, 1759, 1762, - 1766, 1772, 1775, 1777, 1777, 1797, 1802, 1807, 1813, 1819, - 1827, 1835, 1843, 1850, 1860, 1865, 1895, 1897, 1900, 1905, - 1909, 1915, 1920, 1927, 1934, 1941, 1946 +static const short yyrhs[] = { 116, + 0, 117, 0, 116, 117, 0, 210, 118, 34, 122, + 3, 21, 125, 39, 0, 0, 119, 0, 104, 120, + 105, 0, 104, 105, 0, 121, 0, 120, 121, 0, + 212, 0, 212, 106, 9, 107, 0, 9, 0, 0, + 123, 0, 124, 0, 123, 124, 0, 41, 84, 0, + 52, 84, 0, 20, 84, 0, 43, 53, 0, 12, + 57, 0, 0, 126, 0, 127, 0, 126, 127, 0, + 129, 0, 134, 0, 142, 0, 168, 0, 137, 0, + 0, 38, 12, 128, 0, 176, 0, 54, 130, 108, + 0, 54, 46, 0, 131, 0, 130, 131, 0, 132, + 46, 210, 118, 0, 133, 0, 132, 109, 133, 0, + 210, 0, 212, 0, 42, 135, 108, 0, 42, 17, + 108, 0, 42, 108, 0, 136, 0, 135, 109, 136, + 0, 210, 0, 212, 0, 210, 138, 3, 104, 139, + 105, 0, 163, 0, 173, 0, 0, 140, 0, 141, + 0, 140, 109, 141, 0, 102, 0, 184, 0, 210, + 3, 208, 87, 0, 210, 3, 208, 161, 0, 210, + 3, 151, 0, 210, 104, 143, 105, 3, 161, 0, + 144, 0, 143, 109, 144, 0, 210, 0, 210, 110, + 212, 0, 173, 110, 212, 0, 146, 0, 145, 109, + 146, 0, 161, 0, 212, 0, 148, 0, 147, 109, + 148, 0, 213, 161, 200, 0, 30, 68, 161, 0, + 160, 0, 150, 0, 149, 109, 150, 0, 213, 161, + 0, 160, 0, 28, 104, 153, 105, 155, 0, 0, + 88, 0, 154, 0, 153, 109, 154, 0, 166, 200, + 0, 166, 161, 200, 152, 0, 166, 166, 200, 152, + 0, 0, 156, 0, 0, 95, 82, 104, 157, 158, + 105, 0, 159, 0, 158, 159, 0, 4, 0, 166, + 0, 102, 0, 102, 111, 171, 0, 102, 111, 207, + 0, 162, 180, 0, 175, 0, 176, 0, 27, 104, + 149, 105, 0, 78, 104, 147, 105, 0, 79, 104, + 147, 105, 0, 78, 180, 68, 162, 0, 79, 180, + 68, 162, 0, 18, 0, 18, 35, 25, 212, 0, + 210, 104, 145, 105, 0, 163, 0, 56, 68, 163, + 0, 11, 0, 11, 112, 210, 0, 11, 112, 212, + 0, 211, 0, 211, 112, 164, 0, 165, 0, 164, + 112, 165, 0, 167, 0, 167, 0, 13, 0, 14, + 0, 212, 138, 3, 169, 0, 0, 104, 170, 172, + 0, 5, 0, 7, 0, 6, 0, 207, 0, 171, + 0, 212, 0, 210, 112, 212, 0, 4, 0, 172, + 4, 0, 24, 0, 63, 0, 76, 0, 174, 0, + 67, 81, 0, 65, 51, 0, 77, 0, 44, 0, + 36, 71, 0, 26, 81, 0, 91, 0, 47, 0, + 58, 0, 40, 0, 22, 81, 0, 173, 0, 174, + 204, 0, 23, 0, 48, 0, 49, 0, 50, 0, + 59, 0, 64, 0, 74, 0, 83, 0, 85, 0, + 90, 0, 92, 0, 93, 0, 94, 0, 66, 0, + 99, 0, 100, 0, 97, 0, 98, 0, 96, 0, + 0, 181, 0, 182, 0, 80, 106, 183, 107, 0, + 106, 183, 107, 0, 182, 106, 183, 107, 0, 184, + 0, 184, 109, 102, 0, 184, 109, 102, 109, 184, + 0, 185, 0, 184, 177, 185, 0, 184, 178, 185, + 0, 185, 179, 185, 0, 187, 106, 183, 107, 0, + 106, 183, 107, 0, 188, 0, 188, 186, 188, 0, + 61, 186, 188, 0, 188, 186, 60, 0, 61, 186, + 60, 0, 194, 0, 189, 0, 101, 0, 101, 113, + 0, 113, 101, 0, 113, 101, 113, 0, 80, 0, + 46, 0, 207, 0, 212, 0, 6, 0, 45, 0, + 86, 0, 95, 30, 104, 190, 105, 0, 191, 0, + 190, 109, 191, 0, 102, 0, 212, 180, 192, 0, + 0, 193, 0, 73, 0, 15, 0, 69, 0, 195, + 0, 196, 0, 104, 210, 105, 0, 195, 104, 197, + 105, 0, 198, 0, 197, 109, 198, 0, 114, 199, + 0, 114, 112, 199, 0, 212, 0, 199, 112, 212, + 0, 0, 201, 0, 69, 0, 33, 202, 0, 188, + 0, 173, 0, 0, 104, 203, 172, 0, 104, 105, + 0, 104, 205, 105, 0, 206, 0, 205, 109, 206, + 0, 212, 0, 212, 106, 207, 107, 0, 212, 106, + 171, 107, 0, 207, 0, 102, 0, 9, 0, 10, + 0, 0, 209, 0, 103, 0, 103, 52, 0, 103, + 41, 0, 11, 0, 12, 0, 12, 0, 8, 0, + 212, 0, 212, 209, 0 }; + #endif -#if YYDEBUG || YYERROR_VERBOSE -/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[] = -{ - "$end", "error", "$undefined", "TOK_PPEQ", "TOK_opaque", "TOK_bstring", - "TOK_cstring", "TOK_hstring", "TOK_identifier", "TOK_number", - "TOK_number_negative", "TOK_typereference", "TOK_capitalreference", - "TOK_typefieldreference", "TOK_valuefieldreference", "TOK_ABSENT", - "TOK_ABSTRACT_SYNTAX", "TOK_ALL", "TOK_ANY", "TOK_APPLICATION", - "TOK_AUTOMATIC", "TOK_BEGIN", "TOK_BIT", "TOK_BMPString", "TOK_BOOLEAN", - "TOK_BY", "TOK_CHARACTER", "TOK_CHOICE", "TOK_CLASS", "TOK_COMPONENT", - "TOK_COMPONENTS", "TOK_CONSTRAINED", "TOK_CONTAINING", "TOK_DEFAULT", - "TOK_DEFINITIONS", "TOK_DEFINED", "TOK_EMBEDDED", "TOK_ENCODED", - "TOK_ENCODING_CONTROL", "TOK_END", "TOK_ENUMERATED", "TOK_EXPLICIT", - "TOK_EXPORTS", "TOK_EXTENSIBILITY", "TOK_EXTERNAL", "TOK_FALSE", - "TOK_FROM", "TOK_GeneralizedTime", "TOK_GeneralString", - "TOK_GraphicString", "TOK_IA5String", "TOK_IDENTIFIER", "TOK_IMPLICIT", - "TOK_IMPLIED", "TOK_IMPORTS", "TOK_INCLUDES", "TOK_INSTANCE", - "TOK_INSTRUCTIONS", "TOK_INTEGER", "TOK_ISO646String", "TOK_MAX", - "TOK_MIN", "TOK_MINUS_INFINITY", "TOK_NULL", "TOK_NumericString", - "TOK_OBJECT", "TOK_ObjectDescriptor", "TOK_OCTET", "TOK_OF", - "TOK_OPTIONAL", "TOK_PATTERN", "TOK_PDV", "TOK_PLUS_INFINITY", - "TOK_PRESENT", "TOK_PrintableString", "TOK_PRIVATE", "TOK_REAL", - "TOK_RELATIVE_OID", "TOK_SEQUENCE", "TOK_SET", "TOK_SIZE", "TOK_STRING", - "TOK_SYNTAX", "TOK_T61String", "TOK_TAGS", "TOK_TeletexString", - "TOK_TRUE", "TOK_TYPE_IDENTIFIER", "TOK_UNIQUE", "TOK_UNIVERSAL", - "TOK_UniversalString", "TOK_UTCTime", "TOK_UTF8String", - "TOK_VideotexString", "TOK_VisibleString", "TOK_WITH", "TOK_EXCEPT", - "'^'", "TOK_INTERSECTION", "'|'", "TOK_UNION", "TOK_TwoDots", - "TOK_ThreeDots", "TOK_tag", "'{'", "'}'", "'('", "')'", "';'", "','", - "':'", "'!'", "'.'", "'<'", "'@'", "$accept", "ParsedGrammar", - "ModuleList", "ModuleSpecification", "optObjectIdentifier", - "ObjectIdentifier", "ObjectIdentifierBody", "ObjectIdentifierElement", - "optModuleSpecificationFlags", "ModuleSpecificationFlags", - "ModuleSpecificationFlag", "optModuleSpecificationBody", - "ModuleSpecificationBody", "ModuleSpecificationElement", "@1", - "ImportsDefinition", "ImportsBundleSet", "ImportsBundle", "ImportsList", - "ImportsElement", "ExportsDefinition", "ExportsBody", "ExportsElement", - "ValueSetDefinition", "DefinedTypeRef", "optValueSetBody", - "ValueSetBody", "ValueSetElement", "DataTypeReference", - "ParameterArgumentList", "ParameterArgumentName", "ActualParameterList", - "ActualParameter", "ComponentTypeLists", "ComponentType", - "AlternativeTypeLists", "AlternativeType", "ClassDeclaration", - "optUnique", "ClassFieldList", "ClassField", "optWithSyntax", - "WithSyntax", "@2", "WithSyntaxFormat", "WithSyntaxFormatToken", - "ExtensionAndException", "Type", "TypeDeclaration", - "ComplexTypeReference", "ComplexTypeReferenceAmpList", - "ComplexTypeReferenceElement", "ClassFieldIdentifier", "ClassFieldName", - "ValueDefinition", "InlineOrDefinedValue", "@3", "DefinedValue", - "Opaque", "BasicTypeId", "BasicTypeId_UniverationCompatible", - "BasicType", "BasicString", "Union", "Intersection", "Except", - "optConstraints", "Constraints", "SetOfConstraints", "ElementSetSpecs", - "ElementSetSpec", "ConstraintSubtypeElement", "ConstraintRangeSpec", - "ConstraintSpec", "ConstraintValue", "WithComponents", - "WithComponentsList", "WithComponentsElement", "optPresenceConstraint", - "PresenceConstraint", "TableConstraint", "SimpleTableConstraint", - "ComponentRelationConstraint", "AtNotationList", "AtNotationElement", - "ComponentIdList", "optMarker", "Marker", "DefaultValue", "@4", - "UniverationDefinition", "UniverationList", "UniverationElement", - "SignedNumber", "optTag", "Tag", "TypeRefName", "ObjectClassReference", - "Identifier", "TaggedIdentifier", 0 +#if YYDEBUG != 0 +static const short yyrline[] = { 0, + 300, 306, 312, 328, 353, 355, 358, 362, 367, 374, + 382, 387, 391, 400, 402, 410, 414, 422, 426, 429, + 432, 436, 456, 458, 466, 470, 502, 506, 515, 522, + 535, 542, 544, 556, 569, 576, 581, 587, 593, 602, + 608, 614, 621, 629, 633, 636, 643, 649, 655, 662, + 671, 681, 689, 697, 699, 709, 712, 716, 719, 731, + 743, 750, 766, 775, 785, 795, 800, 807, 817, 823, + 829, 833, 845, 851, 857, 865, 872, 877, 883, 889, + 896, 901, 911, 913, 916, 924, 930, 939, 945, 962, + 964, 969, 973, 978, 983, 989, 993, 1004, 1013, 1022, + 1033, 1054, 1058, 1064, 1070, 1076, 1082, 1090, 1098, 1104, + 1118, 1142, 1149, 1163, 1172, 1182, 1192, 1200, 1221, 1230, + 1239, 1240, 1242, 1249, 1261, 1271, 1273, 1278, 1282, 1286, + 1290, 1293, 1298, 1310, 1326, 1337, 1351, 1353, 1354, 1355, + 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1369, 1371, + 1372, 1375, 1382, 1394, 1396, 1400, 1404, 1405, 1406, 1407, + 1408, 1412, 1413, 1414, 1415, 1419, 1420, 1427, 1427, 1428, + 1428, 1429, 1431, 1433, 1438, 1442, 1451, 1455, 1460, 1464, + 1470, 1480, 1484, 1487, 1490, 1495, 1504, 1512, 1518, 1525, + 1533, 1541, 1550, 1553, 1558, 1560, 1561, 1562, 1565, 1569, + 1574, 1578, 1589, 1594, 1599, 1606, 1612, 1616, 1621, 1627, + 1639, 1641, 1644, 1648, 1651, 1656, 1660, 1668, 1683, 1689, + 1696, 1709, 1721, 1736, 1740, 1757, 1759, 1762, 1766, 1772, + 1775, 1777, 1777, 1797, 1802, 1807, 1813, 1819, 1827, 1835, + 1843, 1850, 1860, 1865, 1895, 1897, 1900, 1905, 1909, 1915, + 1920, 1927, 1934, 1941, 1946 }; #endif -# ifdef YYPRINT -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to - token YYLEX-NUM. */ -static const unsigned short yytoknum[] = -{ - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 94, 352, 124, - 353, 354, 355, 356, 123, 125, 40, 41, 59, 44, - 58, 33, 46, 60, 64 -}; -# endif - -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const unsigned char yyr1[] = -{ - 0, 115, 116, 117, 117, 118, 119, 119, 120, 120, - 121, 121, 122, 122, 122, 123, 123, 124, 124, 125, - 125, 125, 125, 125, 126, 126, 127, 127, 128, 128, - 128, 128, 128, 129, 128, 128, 130, 130, 131, 131, - 132, 133, 133, 134, 134, 135, 135, 135, 136, 136, - 137, 137, 138, 139, 139, 140, 140, 141, 141, 142, - 142, 143, 143, 143, 143, 144, 144, 145, 145, 145, - 146, 146, 147, 147, 148, 148, 149, 149, 149, 150, - 150, 151, 151, 152, 153, 153, 154, 154, 155, 155, - 155, 156, 156, 158, 157, 159, 159, 160, 160, 161, - 161, 161, 162, 163, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 163, 163, 164, 164, 164, 164, 164, - 165, 165, 166, 167, 168, 168, 169, 171, 170, 170, - 170, 170, 170, 170, 172, 172, 173, 173, 174, 174, - 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, - 175, 175, 175, 176, 176, 177, 177, 177, 177, 177, - 177, 177, 177, 177, 177, 177, 177, 177, 177, 178, - 178, 179, 179, 180, 181, 181, 182, 182, 183, 183, - 184, 184, 184, 185, 185, 185, 185, 186, 186, 186, - 186, 186, 186, 186, 186, 186, 187, 187, 187, 187, - 188, 188, 189, 189, 189, 189, 189, 190, 191, 191, - 192, 192, 193, 193, 194, 194, 194, 195, 195, 196, - 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, - 202, 203, 203, 204, 203, 205, 205, 206, 206, 207, - 207, 207, 207, 207, 208, 208, 209, 209, 210, 210, - 210, 211, 211, 212, 213, 214, 214 + +#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) + +static const char * const yytname[] = { "$","error","$undefined.","TOK_PPEQ", +"TOK_opaque","TOK_bstring","TOK_cstring","TOK_hstring","TOK_identifier","TOK_number", +"TOK_number_negative","TOK_typereference","TOK_capitalreference","TOK_typefieldreference", +"TOK_valuefieldreference","TOK_ABSENT","TOK_ABSTRACT_SYNTAX","TOK_ALL","TOK_ANY", +"TOK_APPLICATION","TOK_AUTOMATIC","TOK_BEGIN","TOK_BIT","TOK_BMPString","TOK_BOOLEAN", +"TOK_BY","TOK_CHARACTER","TOK_CHOICE","TOK_CLASS","TOK_COMPONENT","TOK_COMPONENTS", +"TOK_CONSTRAINED","TOK_CONTAINING","TOK_DEFAULT","TOK_DEFINITIONS","TOK_DEFINED", +"TOK_EMBEDDED","TOK_ENCODED","TOK_ENCODING_CONTROL","TOK_END","TOK_ENUMERATED", +"TOK_EXPLICIT","TOK_EXPORTS","TOK_EXTENSIBILITY","TOK_EXTERNAL","TOK_FALSE", +"TOK_FROM","TOK_GeneralizedTime","TOK_GeneralString","TOK_GraphicString","TOK_IA5String", +"TOK_IDENTIFIER","TOK_IMPLICIT","TOK_IMPLIED","TOK_IMPORTS","TOK_INCLUDES","TOK_INSTANCE", +"TOK_INSTRUCTIONS","TOK_INTEGER","TOK_ISO646String","TOK_MAX","TOK_MIN","TOK_MINUS_INFINITY", +"TOK_NULL","TOK_NumericString","TOK_OBJECT","TOK_ObjectDescriptor","TOK_OCTET", +"TOK_OF","TOK_OPTIONAL","TOK_PATTERN","TOK_PDV","TOK_PLUS_INFINITY","TOK_PRESENT", +"TOK_PrintableString","TOK_PRIVATE","TOK_REAL","TOK_RELATIVE_OID","TOK_SEQUENCE", +"TOK_SET","TOK_SIZE","TOK_STRING","TOK_SYNTAX","TOK_T61String","TOK_TAGS","TOK_TeletexString", +"TOK_TRUE","TOK_TYPE_IDENTIFIER","TOK_UNIQUE","TOK_UNIVERSAL","TOK_UniversalString", +"TOK_UTCTime","TOK_UTF8String","TOK_VideotexString","TOK_VisibleString","TOK_WITH", +"TOK_EXCEPT","'^'","TOK_INTERSECTION","'|'","TOK_UNION","TOK_TwoDots","TOK_ThreeDots", +"TOK_tag","'{'","'}'","'('","')'","';'","','","':'","'!'","'.'","'<'","'@'", +"ParsedGrammar","ModuleList","ModuleSpecification","optObjectIdentifier","ObjectIdentifier", +"ObjectIdentifierBody","ObjectIdentifierElement","optModuleSpecificationFlags", +"ModuleSpecificationFlags","ModuleSpecificationFlag","optModuleSpecificationBody", +"ModuleSpecificationBody","ModuleSpecificationElement","@1","ImportsDefinition", +"ImportsBundleSet","ImportsBundle","ImportsList","ImportsElement","ExportsDefinition", +"ExportsBody","ExportsElement","ValueSetDefinition","DefinedTypeRef","optValueSetBody", +"ValueSetBody","ValueSetElement","DataTypeReference","ParameterArgumentList", +"ParameterArgumentName","ActualParameterList","ActualParameter","ComponentTypeLists", +"ComponentType","AlternativeTypeLists","AlternativeType","ClassDeclaration", +"optUnique","ClassFieldList","ClassField","optWithSyntax","WithSyntax","@2", +"WithSyntaxFormat","WithSyntaxFormatToken","ExtensionAndException","Type","TypeDeclaration", +"ComplexTypeReference","ComplexTypeReferenceAmpList","ComplexTypeReferenceElement", +"ClassFieldIdentifier","ClassFieldName","ValueDefinition","InlineOrDefinedValue", +"@3","DefinedValue","Opaque","BasicTypeId","BasicTypeId_UniverationCompatible", +"BasicType","BasicString","Union","Intersection","Except","optConstraints","Constraints", +"SetOfConstraints","ElementSetSpecs","ElementSetSpec","ConstraintSubtypeElement", +"ConstraintRangeSpec","ConstraintSpec","ConstraintValue","WithComponents","WithComponentsList", +"WithComponentsElement","optPresenceConstraint","PresenceConstraint","TableConstraint", +"SimpleTableConstraint","ComponentRelationConstraint","AtNotationList","AtNotationElement", +"ComponentIdList","optMarker","Marker","DefaultValue","@4","UniverationDefinition", +"UniverationList","UniverationElement","SignedNumber","optTag","Tag","TypeRefName", +"ObjectClassReference","Identifier","TaggedIdentifier", NULL }; +#endif -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const unsigned char yyr2[] = -{ - 0, 2, 1, 1, 2, 8, 0, 1, 3, 2, - 1, 2, 1, 4, 1, 0, 1, 1, 2, 2, - 2, 2, 2, 2, 0, 1, 1, 2, 1, 1, - 1, 1, 1, 0, 3, 1, 3, 2, 1, 2, - 4, 1, 3, 1, 1, 3, 3, 2, 1, 3, - 1, 1, 6, 1, 1, 0, 1, 1, 3, 1, - 1, 4, 4, 3, 6, 1, 3, 1, 3, 3, - 1, 3, 1, 1, 1, 3, 3, 3, 1, 1, - 3, 2, 1, 5, 0, 1, 1, 3, 2, 4, - 4, 0, 1, 0, 6, 1, 2, 1, 1, 1, - 3, 3, 2, 1, 1, 4, 4, 4, 4, 4, - 1, 4, 4, 1, 3, 1, 3, 3, 1, 3, - 1, 3, 1, 1, 1, 1, 4, 0, 3, 1, - 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, - 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, - 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 1, 1, 4, 3, 4, - 1, 3, 5, 1, 3, 3, 3, 4, 3, 1, - 3, 3, 3, 3, 1, 1, 1, 2, 2, 3, - 1, 1, 1, 1, 1, 1, 1, 5, 1, 3, - 1, 3, 0, 1, 1, 1, 1, 1, 1, 3, - 4, 1, 3, 2, 3, 1, 3, 0, 1, 1, - 2, 1, 1, 0, 3, 2, 3, 1, 3, 1, - 4, 4, 1, 1, 1, 1, 0, 1, 1, 2, - 2, 1, 1, 1, 1, 1, 2 +static const short yyr1[] = { 0, + 115, 116, 116, 117, 118, 118, 119, 119, 120, 120, + 121, 121, 121, 122, 122, 123, 123, 124, 124, 124, + 124, 124, 125, 125, 126, 126, 127, 127, 127, 127, + 127, 128, 127, 127, 129, 129, 130, 130, 131, 132, + 132, 133, 133, 134, 134, 134, 135, 135, 136, 136, + 137, 138, 138, 139, 139, 140, 140, 141, 141, 142, + 142, 142, 142, 143, 143, 144, 144, 144, 145, 145, + 146, 146, 147, 147, 148, 148, 148, 149, 149, 150, + 150, 151, 152, 152, 153, 153, 154, 154, 154, 155, + 155, 157, 156, 158, 158, 159, 159, 160, 160, 160, + 161, 162, 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 163, 163, 163, 163, 163, 164, 164, + 165, 166, 167, 167, 168, 170, 169, 169, 169, 169, + 169, 169, 171, 171, 172, 172, 173, 173, 173, 173, + 173, 173, 173, 173, 173, 173, 173, 173, 174, 174, + 174, 175, 175, 176, 176, 176, 176, 176, 176, 176, + 176, 176, 176, 176, 176, 176, 176, 177, 177, 178, + 178, 179, 180, 180, 181, 181, 182, 182, 183, 183, + 183, 184, 184, 184, 184, 185, 185, 185, 185, 185, + 185, 185, 185, 185, 186, 186, 186, 186, 187, 187, + 188, 188, 188, 188, 188, 189, 190, 190, 191, 191, + 192, 192, 193, 193, 193, 194, 194, 195, 196, 197, + 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, + 202, 203, 202, 204, 204, 205, 205, 206, 206, 206, + 206, 206, 207, 207, 208, 208, 209, 209, 209, 210, + 210, 211, 212, 213, 213 }; -/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state - STATE-NUM when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ -static const unsigned short yydefact[] = -{ - 0, 251, 252, 0, 2, 3, 6, 1, 4, 0, - 0, 7, 254, 14, 9, 0, 10, 12, 15, 8, - 11, 0, 0, 0, 0, 0, 0, 0, 16, 17, - 0, 23, 21, 19, 22, 20, 0, 18, 13, 24, - 155, 0, 0, 156, 157, 158, 0, 159, 160, 168, - 161, 162, 163, 164, 165, 166, 167, 0, 25, 26, - 28, 29, 32, 30, 31, 35, 0, 0, 33, 0, - 47, 0, 48, 50, 51, 37, 0, 38, 0, 41, - 43, 44, 5, 27, 246, 115, 253, 0, 138, 0, - 0, 151, 145, 149, 150, 139, 0, 0, 140, 144, - 148, 0, 0, 53, 54, 141, 118, 0, 34, 46, - 45, 0, 36, 39, 0, 0, 0, 248, 63, 0, - 247, 0, 152, 147, 146, 143, 142, 0, 65, 0, - 67, 0, 0, 0, 49, 6, 42, 0, 250, 249, - 115, 253, 110, 0, 0, 174, 174, 61, 62, 174, - 113, 153, 141, 103, 104, 0, 116, 117, 0, 0, - 0, 0, 55, 124, 125, 119, 120, 122, 129, 131, - 130, 244, 245, 127, 126, 133, 132, 0, 134, 40, - 0, 86, 227, 123, 0, 0, 0, 0, 0, 0, - 0, 175, 176, 0, 0, 102, 0, 154, 0, 0, - 66, 69, 68, 204, 205, 201, 0, 200, 206, 0, - 59, 0, 0, 0, 56, 57, 60, 183, 0, 189, - 195, 194, 217, 218, 202, 203, 0, 0, 0, 91, - 0, 0, 229, 227, 227, 88, 228, 0, 99, 0, - 79, 82, 255, 0, 114, 0, 0, 0, 74, 78, - 0, 0, 180, 0, 0, 0, 0, 243, 235, 0, - 237, 242, 239, 0, 70, 72, 73, 64, 196, 0, - 0, 0, 0, 0, 52, 0, 171, 172, 169, 170, - 0, 0, 173, 0, 0, 0, 0, 121, 136, 128, - 135, 0, 83, 92, 87, 233, 232, 231, 230, 84, - 84, 111, 0, 105, 0, 256, 81, 0, 0, 106, - 0, 227, 178, 0, 108, 0, 107, 109, 236, 0, - 0, 112, 0, 197, 198, 193, 191, 0, 219, 188, - 58, 184, 185, 186, 0, 192, 190, 0, 0, 221, - 137, 0, 0, 85, 89, 90, 100, 101, 80, 177, - 77, 75, 76, 181, 179, 238, 0, 0, 71, 199, - 210, 0, 208, 174, 187, 0, 223, 225, 220, 0, - 93, 234, 0, 241, 240, 207, 0, 212, 224, 0, - 222, 0, 182, 209, 215, 216, 214, 211, 213, 226, - 97, 0, 95, 98, 94, 96 +static const short yyr2[] = { 0, + 1, 1, 2, 8, 0, 1, 3, 2, 1, 2, + 1, 4, 1, 0, 1, 1, 2, 2, 2, 2, + 2, 2, 0, 1, 1, 2, 1, 1, 1, 1, + 1, 0, 3, 1, 3, 2, 1, 2, 4, 1, + 3, 1, 1, 3, 3, 2, 1, 3, 1, 1, + 6, 1, 1, 0, 1, 1, 3, 1, 1, 4, + 4, 3, 6, 1, 3, 1, 3, 3, 1, 3, + 1, 1, 1, 3, 3, 3, 1, 1, 3, 2, + 1, 5, 0, 1, 1, 3, 2, 4, 4, 0, + 1, 0, 6, 1, 2, 1, 1, 1, 3, 3, + 2, 1, 1, 4, 4, 4, 4, 4, 1, 4, + 4, 1, 3, 1, 3, 3, 1, 3, 1, 3, + 1, 1, 1, 1, 4, 0, 3, 1, 1, 1, + 1, 1, 1, 3, 1, 2, 1, 1, 1, 1, + 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, + 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 4, 3, 4, 1, 3, + 5, 1, 3, 3, 3, 4, 3, 1, 3, 3, + 3, 3, 1, 1, 1, 2, 2, 3, 1, 1, + 1, 1, 1, 1, 1, 5, 1, 3, 1, 3, + 0, 1, 1, 1, 1, 1, 1, 3, 4, 1, + 3, 2, 3, 1, 3, 0, 1, 1, 2, 1, + 1, 0, 3, 2, 3, 1, 3, 1, 4, 4, + 1, 1, 1, 1, 0, 1, 1, 2, 2, 1, + 1, 1, 1, 1, 2 }; -/* YYDEFGOTO[NTERM-NUM]. */ -static const short yydefgoto[] = -{ - -1, 3, 4, 5, 10, 11, 15, 16, 27, 28, - 29, 57, 58, 59, 108, 60, 76, 77, 78, 79, - 61, 71, 72, 62, 102, 213, 214, 215, 63, 127, - 128, 263, 264, 247, 248, 239, 240, 118, 344, 180, - 181, 292, 293, 381, 391, 392, 249, 265, 149, 150, - 165, 166, 182, 183, 64, 174, 227, 175, 289, 151, - 152, 153, 154, 280, 281, 283, 190, 191, 192, 251, - 252, 217, 270, 218, 219, 220, 361, 362, 387, 388, - 221, 222, 223, 338, 339, 366, 235, 236, 298, 342, - 197, 259, 260, 224, 119, 120, 155, 106, 225, 250 +static const short yydefact[] = { 0, + 250, 251, 1, 2, 5, 3, 0, 0, 6, 253, + 13, 8, 0, 9, 11, 14, 7, 10, 0, 0, + 0, 0, 0, 0, 0, 15, 16, 0, 22, 20, + 18, 21, 19, 0, 17, 12, 23, 154, 0, 0, + 155, 156, 157, 0, 158, 159, 167, 160, 161, 162, + 163, 164, 165, 166, 0, 24, 25, 27, 28, 31, + 29, 30, 34, 0, 0, 32, 0, 46, 0, 47, + 49, 50, 36, 0, 37, 0, 40, 42, 43, 4, + 26, 245, 114, 252, 0, 137, 0, 0, 150, 144, + 148, 149, 138, 0, 0, 139, 143, 147, 0, 0, + 52, 53, 140, 117, 0, 33, 45, 44, 0, 35, + 38, 0, 0, 0, 247, 62, 0, 246, 0, 151, + 146, 145, 142, 141, 0, 64, 0, 66, 0, 0, + 0, 48, 5, 41, 0, 249, 248, 114, 252, 109, + 0, 0, 173, 173, 60, 61, 173, 112, 152, 140, + 102, 103, 0, 115, 116, 0, 0, 0, 0, 54, + 123, 124, 118, 119, 121, 128, 130, 129, 243, 244, + 126, 125, 132, 131, 0, 133, 39, 0, 85, 226, + 122, 0, 0, 0, 0, 0, 0, 0, 174, 175, + 0, 0, 101, 0, 153, 0, 0, 65, 68, 67, + 203, 204, 200, 0, 199, 205, 0, 58, 0, 0, + 0, 55, 56, 59, 182, 0, 188, 194, 193, 216, + 217, 201, 202, 0, 0, 0, 90, 0, 0, 228, + 226, 226, 87, 227, 0, 98, 0, 78, 81, 254, + 0, 113, 0, 0, 0, 73, 77, 0, 0, 179, + 0, 0, 0, 0, 242, 234, 0, 236, 241, 238, + 0, 69, 71, 72, 63, 195, 0, 0, 0, 0, + 0, 51, 0, 170, 171, 168, 169, 0, 0, 172, + 0, 0, 0, 0, 120, 135, 127, 134, 0, 82, + 91, 86, 232, 231, 230, 229, 83, 83, 110, 0, + 104, 0, 255, 80, 0, 0, 105, 0, 226, 177, + 0, 107, 0, 106, 108, 235, 0, 0, 111, 0, + 196, 197, 192, 190, 0, 218, 187, 57, 183, 184, + 185, 0, 191, 189, 0, 0, 220, 136, 0, 0, + 84, 88, 89, 99, 100, 79, 176, 76, 74, 75, + 180, 178, 237, 0, 0, 70, 198, 209, 0, 207, + 173, 186, 0, 222, 224, 219, 0, 92, 233, 0, + 240, 239, 206, 0, 211, 223, 0, 221, 0, 181, + 208, 214, 215, 213, 210, 212, 225, 96, 0, 94, + 97, 93, 95, 0, 0, 0 }; -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -#define YYPACT_NINF -255 -static const short yypact[] = -{ - 89, -255, -255, 64, 89, -255, -25, -255, -255, 33, - 79, -255, -255, -255, -255, 52, -255, -8, 180, -255, - -255, 147, 91, 77, 80, 119, 96, 183, 180, -255, - 120, -255, -255, -255, -255, -255, 177, -255, -255, 414, - -255, 205, 28, -255, -255, -255, 131, -255, -255, -255, - -255, -255, -255, -255, -255, -255, -255, 196, 414, -255, - -255, -255, -255, -255, -255, -255, 182, 712, -255, 142, - -255, 32, -255, -255, -255, -255, 13, -255, -12, -255, - -255, -255, -255, -255, 1, 141, -255, 188, -255, 206, - 201, -255, -255, -255, -255, -255, 237, 208, -255, -255, - -255, 729, 287, -255, -255, -255, 185, 296, -255, -255, - -255, 249, -255, -255, 89, 249, 210, 76, -255, 575, - -255, 249, -255, -255, -255, -255, -255, -2, -255, 202, - 207, 211, 133, 78, -255, -25, -255, 133, -255, -255, - -41, 215, 274, 216, 254, 110, 127, -255, -255, -28, - -255, -255, 223, -255, -255, 225, -255, -255, 327, 729, - 323, 323, 246, -255, -255, 221, -255, -255, -255, -255, - -255, -255, -255, -255, -255, -255, -255, 224, -255, -255, - 92, -255, 498, -255, 312, 6, 259, 232, -3, 49, - 271, -255, 234, -3, 275, -255, 60, -255, 353, 652, - -255, -255, -255, -255, -255, -255, -20, -255, -255, 315, - -255, 89, 49, 241, 233, -255, 144, 251, 245, -20, - -255, -255, 250, -255, -255, -255, 133, 349, 323, 260, - 133, 258, -255, -13, -13, -255, -255, 323, 247, 94, - -255, -255, 256, 652, -255, 49, 289, 104, -255, -255, - 652, 253, 139, 652, 49, 125, 652, -255, -255, 174, - -255, -255, 257, 176, -255, -255, -255, -255, 255, 265, - 160, 268, 264, 267, -255, 246, -255, -255, -255, -255, - 49, 49, -255, 49, 49, 165, 269, -255, -255, 369, - -255, 299, -255, -255, -255, -255, -255, -255, -255, 290, - 290, -255, 266, -255, 6, -255, -255, 277, 652, -255, - -3, -13, -255, 280, -255, 278, -255, -255, -255, 65, - 266, -255, 353, -255, 273, -255, -255, 20, -255, -255, - -255, -255, -255, -255, 281, -255, -255, 15, 191, -255, - -255, 283, 349, -255, -255, -255, -255, -255, -255, -255, - -255, -255, -255, 282, -255, -255, 285, 288, -255, -255, - -255, 199, -255, -28, -255, 323, 284, -255, -255, 269, - -255, 369, 49, -255, -255, -255, 20, 23, 284, 323, - -255, 146, 144, -255, -255, -255, -255, -255, -255, -255, - -255, 18, -255, -255, -255, -255 +static const short yydefgoto[] = { 394, + 3, 4, 8, 9, 13, 14, 25, 26, 27, 55, + 56, 57, 106, 58, 74, 75, 76, 77, 59, 69, + 70, 60, 100, 211, 212, 213, 61, 125, 126, 261, + 262, 245, 246, 237, 238, 116, 342, 178, 179, 290, + 291, 379, 389, 390, 247, 263, 147, 148, 163, 164, + 180, 181, 62, 172, 225, 173, 287, 149, 150, 151, + 152, 278, 279, 281, 188, 189, 190, 249, 250, 215, + 268, 216, 217, 218, 359, 360, 385, 386, 219, 220, + 221, 336, 337, 364, 233, 234, 296, 340, 195, 257, + 258, 222, 117, 118, 153, 104, 223, 248 }; -/* YYPGOTO[NTERM-NUM]. */ -static const short yypgoto[] = -{ - -255, -255, -255, 386, 263, -255, -255, 379, -255, -255, - 371, -255, -255, 346, -255, -255, -255, 329, -255, 291, - -255, -255, 297, -255, 340, -255, -255, 135, -255, -255, - 262, -255, 93, 220, 113, -255, 124, -255, 114, -255, - 194, -255, -255, -255, -255, 42, -172, -117, -209, -55, - -255, 209, -179, -106, -255, -255, -255, -254, 97, -50, - -48, -255, -4, -255, -255, -255, -139, -255, -255, -96, - -161, -18, 222, -255, -140, -255, -255, 58, -255, -255, - -255, -255, -255, -255, 71, 83, -157, -255, -255, -255, - -255, -255, 123, -124, -255, 212, 4, -255, -9, -170 +static const short yypact[] = { 86, +-32768,-32768, 86,-32768, -66,-32768, 12, 95,-32768,-32768, +-32768,-32768, 14,-32768, 4, 217,-32768,-32768, 118, 97, + 56, 82, 121, 104, 195, 217,-32768, 115,-32768,-32768, +-32768,-32768,-32768, 179,-32768,-32768, 446,-32768, 213, 23, +-32768,-32768,-32768, 96,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 191, 446,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 212, 744,-32768, 133,-32768, 124,-32768, +-32768,-32768,-32768, 45,-32768, -19,-32768,-32768,-32768,-32768, +-32768, 20, 135,-32768, 164,-32768, 176, 197,-32768,-32768, +-32768,-32768,-32768, 225, 199,-32768,-32768,-32768, 761, 275, +-32768,-32768,-32768, 171, 282,-32768,-32768,-32768, 159,-32768, +-32768, 86, 159, 182, 32,-32768, 607,-32768, 159,-32768, +-32768,-32768,-32768,-32768, -30,-32768, 177, 184, 188, 236, + 54,-32768, -66,-32768, 236,-32768,-32768, 61, 192, 262, + 194, 231, 76, 77,-32768,-32768, -11,-32768,-32768, 196, +-32768,-32768, 200,-32768,-32768, 302, 761, 299, 299, 140, +-32768,-32768, 202,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 203,-32768,-32768, -24,-32768, 530, +-32768, 283, 28, 255, 206, 24, 245, 241,-32768, 211, + 24, 251,-32768, 42,-32768, 385, 684,-32768,-32768,-32768, +-32768,-32768,-32768, -31,-32768,-32768, 291,-32768, 86, 245, + 218, 215,-32768, 174, 226, 220, -31,-32768,-32768, 223, +-32768,-32768,-32768, 236, 325, 299, 240, 236, 324,-32768, + 92, 92,-32768,-32768, 299, 227, -9,-32768,-32768, 233, + 684,-32768, 245, 269, 63,-32768,-32768, 684, 232, 93, + 684, 245, 100, 684,-32768,-32768, 103,-32768,-32768, 235, + 112,-32768,-32768,-32768,-32768, 229, 242, 83, 243, 239, + 238,-32768, 140,-32768,-32768,-32768,-32768, 245, 245,-32768, + 245, 245, 154, 244,-32768,-32768, 348,-32768, 271,-32768, +-32768,-32768,-32768,-32768,-32768,-32768, 266, 266,-32768, 253, +-32768, 28,-32768,-32768, 248, 684,-32768, 24, 92,-32768, + 257,-32768, 250,-32768,-32768,-32768, 16, 253,-32768, 385, +-32768, 249,-32768,-32768, 35,-32768,-32768,-32768,-32768,-32768, +-32768, 254,-32768,-32768, 10, 122,-32768,-32768, 259, 325, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, + 256,-32768,-32768, 265, 267,-32768,-32768,-32768, 134,-32768, + -11,-32768, 299, 261,-32768,-32768, 244,-32768, 348, 245, +-32768,-32768,-32768, 35, 72, 261, 299,-32768, 190, 174, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 15,-32768, +-32768,-32768,-32768, 366, 375,-32768 }; -/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If zero, do what YYDEFACT says. - If YYTABLE_NINF, parse error. */ -#define YYTABLE_NINF -253 -static const short yytable[] = -{ - 17, 216, 148, 234, 6, 12, 17, 194, 6, 176, - 195, 103, 103, 241, 12, 243, 104, 104, 105, 105, - 231, 12, 390, 12, 1, 2, 167, 246, 12, 116, - 67, 163, 164, 74, 114, 65, 12, 81, 384, 1, - 2, 12, 13, 66, 314, 69, 73, 317, 346, 67, - 80, 129, 187, 105, 65, 203, 232, 12, 171, 172, - 12, 13, 66, -251, 7, 233, 356, 81, 12, 171, - 172, 121, 261, 12, 171, 172, 299, 300, 189, 9, - 80, 268, 267, 168, 169, 170, 12, 171, 172, 1, - 2, 297, 385, 269, 204, 205, 386, 115, 21, 238, - 1, 2, 74, 158, 117, 130, 81, 159, 238, 129, - 206, 105, 157, 18, 216, 73, 273, 138, 135, 80, - 167, 112, 360, 394, 178, 156, 306, 365, 139, 207, - 326, 244, 241, 311, 243, 208, 70, 177, 14, 12, - 110, 111, 1, 2, 209, 336, 163, 164, 31, 307, - 390, 201, 202, 211, 352, 212, 30, 19, 315, 163, - 164, 32, 257, 130, 33, 258, 203, 257, 12, 171, - 172, 203, 34, 12, 171, 172, 242, 75, 347, 242, - 35, 296, 173, 105, 242, 84, 36, 262, 334, 266, - 187, 350, 22, 85, 86, 261, 357, 229, 39, 303, - 23, 230, 393, 304, 87, 204, 88, 187, 89, 309, - 204, 382, 393, 310, 188, 272, 189, 68, 90, 290, - 325, 24, 91, 25, 377, 335, 92, 38, 301, 93, - 316, 193, 26, 189, 310, 82, 276, 277, 278, 279, - 94, 276, 277, 278, 279, 95, 208, 96, 313, 97, - 109, 208, 203, 121, 12, 171, 172, 12, 98, 99, - 1, 2, 331, 332, 203, 333, 12, 171, 172, 122, - 85, 86, 124, 100, 12, 171, 172, 1, 2, 318, - 87, 321, 88, 319, 89, 322, 101, 123, 125, 126, - 131, 204, 205, 178, 90, 242, 368, 132, 91, 133, - 369, 242, 92, 204, 375, 93, 177, 206, 376, 184, - 262, 178, 160, 266, 137, 162, 94, 161, 363, -252, - 185, 95, 186, 96, 177, 97, 207, 196, 367, 198, - 199, 12, 208, 226, 98, 99, 228, 237, 245, 253, - 254, 209, 275, 256, 208, 271, 274, 282, 210, 100, - 211, 284, 212, 288, 286, 291, 367, 308, 302, 117, - 312, 12, 295, 320, 140, 141, 324, 363, 323, 328, - 389, 142, 327, 340, 329, 87, 40, 88, 343, 89, - 143, 341, 353, 337, 349, 354, 359, 370, 364, 90, - 8, 372, 373, 91, 20, 374, 379, 92, 179, 37, - 93, 43, 44, 45, 83, 113, 136, 107, 134, 144, - 330, 94, 47, 255, 345, 358, 95, 48, 96, 49, - 97, 200, 12, 351, 294, 1, 2, 50, 348, 98, - 99, 145, 146, 395, 383, 287, 51, 40, 52, 371, - 380, 285, 355, 53, 100, 54, 55, 56, 378, 0, - 0, 0, 41, 0, 305, 0, 42, 0, 0, 0, - 0, 0, 43, 44, 45, 0, 0, 0, 46, 0, - 0, 0, 0, 47, 0, 0, 0, 0, 48, 0, - 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, - 0, 0, 0, 0, 0, 0, 0, 51, 0, 52, - 0, 0, 0, 0, 53, 0, 54, 55, 56, 140, - 141, 163, 164, 0, 0, 0, 142, 0, 0, 0, - 87, 40, 88, 0, 89, 143, 0, 0, 0, 0, - 0, 231, 0, 0, 90, 0, 0, 0, 91, 0, - 0, 0, 92, 0, 0, 93, 43, 44, 45, 0, - 0, 0, 0, 0, 144, 0, 94, 47, 0, 0, - 0, 95, 48, 96, 49, 97, 0, 232, 0, 0, - 0, 0, 50, 0, 98, 99, 145, 146, 0, 0, - 0, 51, 0, 52, 0, 0, 140, 141, 53, 100, - 54, 55, 56, 142, 0, 0, 0, 87, 40, 88, - 0, 89, 143, 0, 0, 0, 0, 0, 0, 0, - 0, 90, 0, 0, 0, 91, 0, 0, 0, 92, - 0, 0, 93, 43, 44, 45, 0, 0, 0, 0, - 0, 144, 0, 94, 47, 0, 0, 0, 95, 48, - 96, 49, 97, 0, 0, 0, 0, 0, 0, 50, - 0, 98, 99, 145, 146, 0, 0, 0, 51, 0, - 52, 0, 147, 140, 141, 53, 100, 54, 55, 56, - 142, 0, 0, 0, 87, 40, 88, 0, 89, 143, - 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, - 0, 0, 91, 0, 0, 0, 92, 0, 0, 93, - 43, 44, 45, 0, 0, 0, 0, 0, 144, 0, - 94, 47, 0, 0, 0, 95, 48, 96, 49, 97, - 0, 0, 0, 85, 86, 0, 50, 0, 98, 99, - 145, 146, 0, 0, 87, 51, 88, 52, 89, 0, - 1, 2, 53, 100, 54, 55, 56, 0, 90, 0, - 0, 87, 91, 88, 0, 89, 92, 0, 0, 93, - 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, - 94, 0, 0, 92, 0, 95, 93, 96, 0, 97, - 0, 0, 0, 0, 0, 0, 0, 94, 98, 99, - 0, 0, 95, 0, 96, 0, 97, 0, 0, 0, - 0, 0, 0, 100, 0, 98, 99, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 100 +static const short yypgoto[] = {-32768, +-32768, 373, 246,-32768,-32768, 364,-32768,-32768, 352,-32768, +-32768, 327,-32768,-32768,-32768, 306,-32768, 268,-32768,-32768, + 276,-32768, 319,-32768,-32768, 113,-32768,-32768, 237,-32768, + 68, 201, 87,-32768, 88,-32768, 101,-32768, 170,-32768, +-32768,-32768,-32768, 13, -167, -109, -44, -50,-32768, 180, + -173, -86,-32768,-32768,-32768, -232, 65, -54, -52,-32768, + 43,-32768,-32768,-32768, -143,-32768,-32768, -169, -157, 3, + 189,-32768, -174,-32768,-32768, 39,-32768,-32768,-32768,-32768, +-32768,-32768, 47, 53, -154,-32768,-32768,-32768,-32768,-32768, + 102, -122,-32768, 178, 2,-32768, -7, -166 }; -static const short yycheck[] = -{ - 9, 162, 119, 182, 0, 8, 15, 146, 4, 133, - 149, 66, 67, 185, 8, 185, 66, 67, 66, 67, - 33, 8, 4, 8, 11, 12, 132, 30, 8, 28, - 39, 13, 14, 42, 46, 39, 8, 46, 15, 11, - 12, 8, 9, 39, 253, 17, 42, 256, 302, 58, - 46, 101, 80, 101, 58, 6, 69, 8, 9, 10, - 8, 9, 58, 104, 0, 182, 320, 76, 8, 9, - 10, 112, 196, 8, 9, 10, 233, 234, 106, 104, - 76, 101, 199, 5, 6, 7, 8, 9, 10, 11, - 12, 231, 69, 113, 45, 46, 73, 109, 106, 102, - 11, 12, 111, 105, 103, 101, 115, 109, 102, 159, - 61, 159, 121, 34, 275, 111, 212, 41, 114, 115, - 226, 108, 102, 105, 133, 121, 243, 112, 52, 80, - 270, 186, 304, 250, 304, 86, 108, 133, 105, 8, - 108, 109, 11, 12, 95, 285, 13, 14, 57, 245, - 4, 160, 161, 104, 311, 106, 9, 105, 254, 13, - 14, 84, 102, 159, 84, 105, 6, 102, 8, 9, - 10, 6, 53, 8, 9, 10, 185, 46, 302, 188, - 84, 231, 104, 231, 193, 3, 3, 196, 284, 198, - 80, 308, 12, 11, 12, 319, 320, 105, 21, 105, - 20, 109, 381, 109, 22, 45, 24, 80, 26, 105, - 45, 372, 391, 109, 104, 211, 106, 12, 36, 228, - 60, 41, 40, 43, 363, 60, 44, 107, 237, 47, - 105, 104, 52, 106, 109, 39, 97, 98, 99, 100, - 58, 97, 98, 99, 100, 63, 86, 65, 109, 67, - 108, 86, 6, 112, 8, 9, 10, 8, 76, 77, - 11, 12, 280, 281, 6, 283, 8, 9, 10, 81, - 11, 12, 71, 91, 8, 9, 10, 11, 12, 105, - 22, 105, 24, 109, 26, 109, 104, 81, 51, 81, - 3, 45, 46, 302, 36, 304, 105, 112, 40, 3, - 109, 310, 44, 45, 105, 47, 302, 61, 109, 35, - 319, 320, 110, 322, 104, 104, 58, 110, 327, 104, - 104, 63, 68, 65, 320, 67, 80, 104, 337, 104, - 3, 8, 86, 112, 76, 77, 112, 25, 106, 68, - 106, 95, 109, 68, 86, 30, 105, 96, 102, 91, - 104, 106, 106, 4, 104, 95, 365, 68, 111, 103, - 107, 8, 104, 106, 11, 12, 101, 376, 113, 105, - 379, 18, 104, 4, 107, 22, 23, 24, 88, 26, - 27, 82, 102, 114, 107, 107, 113, 104, 107, 36, - 4, 109, 107, 40, 15, 107, 112, 44, 135, 28, - 47, 48, 49, 50, 58, 76, 115, 67, 111, 56, - 275, 58, 59, 193, 300, 322, 63, 64, 65, 66, - 67, 159, 8, 310, 230, 11, 12, 74, 304, 76, - 77, 78, 79, 391, 376, 226, 83, 23, 85, 342, - 369, 219, 319, 90, 91, 92, 93, 94, 365, -1, - -1, -1, 38, -1, 242, -1, 42, -1, -1, -1, - -1, -1, 48, 49, 50, -1, -1, -1, 54, -1, - -1, -1, -1, 59, -1, -1, -1, -1, 64, -1, - 66, -1, -1, -1, -1, -1, -1, -1, 74, -1, - -1, -1, -1, -1, -1, -1, -1, 83, -1, 85, - -1, -1, -1, -1, 90, -1, 92, 93, 94, 11, - 12, 13, 14, -1, -1, -1, 18, -1, -1, -1, - 22, 23, 24, -1, 26, 27, -1, -1, -1, -1, - -1, 33, -1, -1, 36, -1, -1, -1, 40, -1, - -1, -1, 44, -1, -1, 47, 48, 49, 50, -1, - -1, -1, -1, -1, 56, -1, 58, 59, -1, -1, - -1, 63, 64, 65, 66, 67, -1, 69, -1, -1, - -1, -1, 74, -1, 76, 77, 78, 79, -1, -1, - -1, 83, -1, 85, -1, -1, 11, 12, 90, 91, - 92, 93, 94, 18, -1, -1, -1, 22, 23, 24, - -1, 26, 27, -1, -1, -1, -1, -1, -1, -1, - -1, 36, -1, -1, -1, 40, -1, -1, -1, 44, - -1, -1, 47, 48, 49, 50, -1, -1, -1, -1, - -1, 56, -1, 58, 59, -1, -1, -1, 63, 64, - 65, 66, 67, -1, -1, -1, -1, -1, -1, 74, - -1, 76, 77, 78, 79, -1, -1, -1, 83, -1, - 85, -1, 87, 11, 12, 90, 91, 92, 93, 94, - 18, -1, -1, -1, 22, 23, 24, -1, 26, 27, - -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, - -1, -1, 40, -1, -1, -1, 44, -1, -1, 47, - 48, 49, 50, -1, -1, -1, -1, -1, 56, -1, - 58, 59, -1, -1, -1, 63, 64, 65, 66, 67, - -1, -1, -1, 11, 12, -1, 74, -1, 76, 77, - 78, 79, -1, -1, 22, 83, 24, 85, 26, -1, - 11, 12, 90, 91, 92, 93, 94, -1, 36, -1, - -1, 22, 40, 24, -1, 26, 44, -1, -1, 47, - -1, -1, -1, -1, -1, 36, -1, -1, -1, 40, - 58, -1, -1, 44, -1, 63, 47, 65, -1, 67, - -1, -1, -1, -1, -1, -1, -1, 58, 76, 77, - -1, -1, 63, -1, 65, -1, 67, -1, -1, -1, - -1, -1, -1, 91, -1, 76, 77, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 91 + +#define YYLAST 852 + + +static const short yytable[] = { 15, + 192, 5, 214, 193, 5, 15, 232, 146, 174, 102, + 102, 103, 103, 101, 101, 239, 241, 10, 388, 10, + 11, 10, 11, 10, 169, 170, 112, 161, 162, 65, + 10, 10, 72, 1, 2, 10, 79, 7, 64, 67, + 271, 71, 10, 165, 127, 78, 103, 114, 65, 10, + 169, 170, 10, 244, 295, 1, 2, 64, 166, 167, + 168, 10, 169, 170, 1, 2, 79, 344, 185, 266, + 231, 259, 136, 305, 156, 78, 297, 298, 157, 63, + 227, 267, 313, 137, 228, 354, 382, 265, 201, 113, + 10, 169, 170, 324, 187, 301, 1, 2, 63, 302, + 128, 72, 127, 10, 103, 79, 1, 2, 334, 19, + 71, 155, 332, 133, 78, 214, 12, 255, 17, 392, + 154, 363, 115, 176, 229, 236, 28, 202, 16, 236, + 68, 304, 175, 242, 239, 241, 358, 165, 309, 30, + 383, 73, 323, 255, 384, 201, 256, 10, 169, 170, + 199, 200, 110, 29, 350, 185, 185, 171, 128, 201, + 230, 10, 169, 170, -250, 31, 10, 307, 206, 1, + 2, 308, 119, 32, 294, 240, 103, 345, 240, 186, + 191, 187, 187, 240, 202, 203, 260, 33, 264, 274, + 275, 276, 277, 388, 259, 355, 348, 34, 202, 37, + 204, 311, 161, 162, 314, 391, 312, 316, 308, 315, + 270, 317, 380, 333, 82, 391, 319, 375, 288, 205, + 320, 36, 83, 84, 66, 206, 366, 299, 20, 80, + 367, 108, 109, 85, 207, 86, 21, 87, 373, 206, + 107, 208, 374, 209, 120, 210, 119, 88, 161, 162, + 201, 89, 10, 169, 170, 90, 121, 22, 91, 23, + 10, 169, 170, 1, 2, 83, 84, 122, 24, 92, + 274, 275, 276, 277, 93, 123, 94, 129, 95, 124, + 329, 330, 130, 331, 131, 135, 158, 96, 97, 202, + 203, 160, 176, 159, 240, -251, 182, 183, 184, 194, + 240, 175, 98, 196, 197, 204, 10, 235, 251, 260, + 176, 243, 264, 224, 226, 99, 252, 361, 254, 175, + 269, 280, 272, 273, 205, 282, 284, 365, 286, 201, + 206, 10, 169, 170, 289, 115, 306, 300, 310, 207, + 318, 321, 322, 326, 327, 85, 325, 86, 209, 87, + 210, 338, 339, 341, 347, 365, 352, 335, 351, 88, + 362, 357, 368, 89, 370, 395, 361, 90, 202, 387, + 91, 371, 377, 372, 396, 6, 18, 35, 177, 111, + 134, 92, 81, 105, 132, 328, 93, 356, 94, 346, + 95, 253, 10, 198, 349, 138, 139, 292, 343, 96, + 97, 393, 140, 285, 369, 283, 85, 38, 86, 206, + 87, 141, 381, 378, 98, 376, 0, 303, 353, 0, + 88, 0, 0, 0, 89, 0, 0, 293, 90, 0, + 0, 91, 41, 42, 43, 0, 0, 0, 0, 0, + 142, 0, 92, 45, 0, 0, 0, 93, 46, 94, + 47, 95, 0, 10, 0, 0, 1, 2, 48, 0, + 96, 97, 143, 144, 0, 0, 0, 49, 38, 50, + 0, 0, 0, 0, 51, 98, 52, 53, 54, 0, + 0, 0, 0, 39, 0, 0, 0, 40, 0, 0, + 0, 0, 0, 41, 42, 43, 0, 0, 0, 44, + 0, 0, 0, 0, 45, 0, 0, 0, 0, 46, + 0, 47, 0, 0, 0, 0, 0, 0, 0, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, + 50, 0, 0, 0, 0, 51, 0, 52, 53, 54, + 138, 139, 161, 162, 0, 0, 0, 140, 0, 0, + 0, 85, 38, 86, 0, 87, 141, 0, 0, 0, + 0, 0, 229, 0, 0, 88, 0, 0, 0, 89, + 0, 0, 0, 90, 0, 0, 91, 41, 42, 43, + 0, 0, 0, 0, 0, 142, 0, 92, 45, 0, + 0, 0, 93, 46, 94, 47, 95, 0, 230, 0, + 0, 0, 0, 48, 0, 96, 97, 143, 144, 0, + 0, 0, 49, 0, 50, 0, 0, 138, 139, 51, + 98, 52, 53, 54, 140, 0, 0, 0, 85, 38, + 86, 0, 87, 141, 0, 0, 0, 0, 0, 0, + 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, + 90, 0, 0, 91, 41, 42, 43, 0, 0, 0, + 0, 0, 142, 0, 92, 45, 0, 0, 0, 93, + 46, 94, 47, 95, 0, 0, 0, 0, 0, 0, + 48, 0, 96, 97, 143, 144, 0, 0, 0, 49, + 0, 50, 0, 145, 138, 139, 51, 98, 52, 53, + 54, 140, 0, 0, 0, 85, 38, 86, 0, 87, + 141, 0, 0, 0, 0, 0, 0, 0, 0, 88, + 0, 0, 0, 89, 0, 0, 0, 90, 0, 0, + 91, 41, 42, 43, 0, 0, 0, 0, 0, 142, + 0, 92, 45, 0, 0, 0, 93, 46, 94, 47, + 95, 0, 0, 0, 83, 84, 0, 48, 0, 96, + 97, 143, 144, 0, 0, 85, 49, 86, 50, 87, + 0, 1, 2, 51, 98, 52, 53, 54, 0, 88, + 0, 0, 85, 89, 86, 0, 87, 90, 0, 0, + 91, 0, 0, 0, 0, 0, 88, 0, 0, 0, + 89, 92, 0, 0, 90, 0, 93, 91, 94, 0, + 95, 0, 0, 0, 0, 0, 0, 0, 92, 96, + 97, 0, 0, 93, 0, 94, 0, 95, 0, 0, + 0, 0, 0, 0, 98, 0, 96, 97, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 98 }; -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const unsigned char yystos[] = -{ - 0, 11, 12, 116, 117, 118, 211, 0, 118, 104, - 119, 120, 8, 9, 105, 121, 122, 213, 34, 105, - 122, 106, 12, 20, 41, 43, 52, 123, 124, 125, - 9, 57, 84, 84, 53, 84, 3, 125, 107, 21, - 23, 38, 42, 48, 49, 50, 54, 59, 64, 66, - 74, 83, 85, 90, 92, 93, 94, 126, 127, 128, - 130, 135, 138, 143, 169, 177, 211, 213, 12, 17, - 108, 136, 137, 211, 213, 46, 131, 132, 133, 134, - 211, 213, 39, 128, 3, 11, 12, 22, 24, 26, - 36, 40, 44, 47, 58, 63, 65, 67, 76, 77, - 91, 104, 139, 164, 174, 175, 212, 139, 129, 108, - 108, 109, 108, 132, 46, 109, 28, 103, 152, 209, - 210, 112, 81, 81, 71, 51, 81, 144, 145, 174, - 211, 3, 112, 3, 137, 211, 134, 104, 41, 52, - 11, 12, 18, 27, 56, 78, 79, 87, 162, 163, - 164, 174, 175, 176, 177, 211, 211, 213, 105, 109, - 110, 110, 104, 13, 14, 165, 166, 168, 5, 6, - 7, 9, 10, 104, 170, 172, 208, 211, 213, 119, - 154, 155, 167, 168, 35, 104, 68, 80, 104, 106, - 181, 182, 183, 104, 181, 181, 104, 205, 104, 3, - 145, 213, 213, 6, 45, 46, 61, 80, 86, 95, - 102, 104, 106, 140, 141, 142, 185, 186, 188, 189, - 190, 195, 196, 197, 208, 213, 112, 171, 112, 105, - 109, 33, 69, 162, 167, 201, 202, 25, 102, 150, - 151, 161, 213, 214, 164, 106, 30, 148, 149, 161, - 214, 184, 185, 68, 106, 148, 68, 102, 105, 206, - 207, 208, 213, 146, 147, 162, 213, 162, 101, 113, - 187, 30, 211, 184, 105, 109, 97, 98, 99, 100, - 178, 179, 96, 180, 106, 187, 104, 166, 4, 173, - 213, 95, 156, 157, 155, 104, 174, 189, 203, 201, - 201, 213, 111, 105, 109, 210, 162, 184, 68, 105, - 109, 162, 107, 109, 163, 184, 105, 163, 105, 109, - 106, 105, 109, 113, 101, 60, 189, 104, 105, 107, - 142, 186, 186, 186, 184, 60, 189, 114, 198, 199, - 4, 82, 204, 88, 153, 153, 172, 208, 151, 107, - 162, 149, 201, 102, 107, 207, 172, 208, 147, 113, - 102, 191, 192, 213, 107, 112, 200, 213, 105, 109, - 104, 173, 109, 107, 107, 105, 109, 181, 200, 112, - 199, 158, 185, 192, 15, 69, 73, 193, 194, 213, - 4, 159, 160, 167, 105, 160 +static const short yycheck[] = { 7, + 144, 0, 160, 147, 3, 13, 180, 117, 131, 64, + 65, 64, 65, 64, 65, 183, 183, 8, 4, 8, + 9, 8, 9, 8, 9, 10, 46, 13, 14, 37, + 8, 8, 40, 11, 12, 8, 44, 104, 37, 17, + 210, 40, 8, 130, 99, 44, 99, 28, 56, 8, + 9, 10, 8, 30, 229, 11, 12, 56, 5, 6, + 7, 8, 9, 10, 11, 12, 74, 300, 80, 101, + 180, 194, 41, 243, 105, 74, 231, 232, 109, 37, + 105, 113, 252, 52, 109, 318, 15, 197, 6, 109, + 8, 9, 10, 268, 106, 105, 11, 12, 56, 109, + 99, 109, 157, 8, 157, 113, 11, 12, 283, 106, + 109, 119, 282, 112, 113, 273, 105, 102, 105, 105, + 119, 112, 103, 131, 33, 102, 9, 45, 34, 102, + 108, 241, 131, 184, 302, 302, 102, 224, 248, 84, + 69, 46, 60, 102, 73, 6, 105, 8, 9, 10, + 158, 159, 108, 57, 309, 80, 80, 104, 157, 6, + 69, 8, 9, 10, 104, 84, 8, 105, 86, 11, + 12, 109, 112, 53, 229, 183, 229, 300, 186, 104, + 104, 106, 106, 191, 45, 46, 194, 84, 196, 97, + 98, 99, 100, 4, 317, 318, 306, 3, 45, 21, + 61, 109, 13, 14, 105, 379, 251, 105, 109, 254, + 209, 109, 370, 60, 3, 389, 105, 361, 226, 80, + 109, 107, 11, 12, 12, 86, 105, 235, 12, 39, + 109, 108, 109, 22, 95, 24, 20, 26, 105, 86, + 108, 102, 109, 104, 81, 106, 112, 36, 13, 14, + 6, 40, 8, 9, 10, 44, 81, 41, 47, 43, + 8, 9, 10, 11, 12, 11, 12, 71, 52, 58, + 97, 98, 99, 100, 63, 51, 65, 3, 67, 81, + 278, 279, 112, 281, 3, 104, 110, 76, 77, 45, + 46, 104, 300, 110, 302, 104, 35, 104, 68, 104, + 308, 300, 91, 104, 3, 61, 8, 25, 68, 317, + 318, 106, 320, 112, 112, 104, 106, 325, 68, 318, + 30, 96, 105, 109, 80, 106, 104, 335, 4, 6, + 86, 8, 9, 10, 95, 103, 68, 111, 107, 95, + 106, 113, 101, 105, 107, 22, 104, 24, 104, 26, + 106, 4, 82, 88, 107, 363, 107, 114, 102, 36, + 107, 113, 104, 40, 109, 0, 374, 44, 45, 377, + 47, 107, 112, 107, 0, 3, 13, 26, 133, 74, + 113, 58, 56, 65, 109, 273, 63, 320, 65, 302, + 67, 191, 8, 157, 308, 11, 12, 228, 298, 76, + 77, 389, 18, 224, 340, 217, 22, 23, 24, 86, + 26, 27, 374, 367, 91, 363, -1, 240, 317, -1, + 36, -1, -1, -1, 40, -1, -1, 104, 44, -1, + -1, 47, 48, 49, 50, -1, -1, -1, -1, -1, + 56, -1, 58, 59, -1, -1, -1, 63, 64, 65, + 66, 67, -1, 8, -1, -1, 11, 12, 74, -1, + 76, 77, 78, 79, -1, -1, -1, 83, 23, 85, + -1, -1, -1, -1, 90, 91, 92, 93, 94, -1, + -1, -1, -1, 38, -1, -1, -1, 42, -1, -1, + -1, -1, -1, 48, 49, 50, -1, -1, -1, 54, + -1, -1, -1, -1, 59, -1, -1, -1, -1, 64, + -1, 66, -1, -1, -1, -1, -1, -1, -1, 74, + -1, -1, -1, -1, -1, -1, -1, -1, 83, -1, + 85, -1, -1, -1, -1, 90, -1, 92, 93, 94, + 11, 12, 13, 14, -1, -1, -1, 18, -1, -1, + -1, 22, 23, 24, -1, 26, 27, -1, -1, -1, + -1, -1, 33, -1, -1, 36, -1, -1, -1, 40, + -1, -1, -1, 44, -1, -1, 47, 48, 49, 50, + -1, -1, -1, -1, -1, 56, -1, 58, 59, -1, + -1, -1, 63, 64, 65, 66, 67, -1, 69, -1, + -1, -1, -1, 74, -1, 76, 77, 78, 79, -1, + -1, -1, 83, -1, 85, -1, -1, 11, 12, 90, + 91, 92, 93, 94, 18, -1, -1, -1, 22, 23, + 24, -1, 26, 27, -1, -1, -1, -1, -1, -1, + -1, -1, 36, -1, -1, -1, 40, -1, -1, -1, + 44, -1, -1, 47, 48, 49, 50, -1, -1, -1, + -1, -1, 56, -1, 58, 59, -1, -1, -1, 63, + 64, 65, 66, 67, -1, -1, -1, -1, -1, -1, + 74, -1, 76, 77, 78, 79, -1, -1, -1, 83, + -1, 85, -1, 87, 11, 12, 90, 91, 92, 93, + 94, 18, -1, -1, -1, 22, 23, 24, -1, 26, + 27, -1, -1, -1, -1, -1, -1, -1, -1, 36, + -1, -1, -1, 40, -1, -1, -1, 44, -1, -1, + 47, 48, 49, 50, -1, -1, -1, -1, -1, 56, + -1, 58, 59, -1, -1, -1, 63, 64, 65, 66, + 67, -1, -1, -1, 11, 12, -1, 74, -1, 76, + 77, 78, 79, -1, -1, 22, 83, 24, 85, 26, + -1, 11, 12, 90, 91, 92, 93, 94, -1, 36, + -1, -1, 22, 40, 24, -1, 26, 44, -1, -1, + 47, -1, -1, -1, -1, -1, 36, -1, -1, -1, + 40, 58, -1, -1, 44, -1, 63, 47, 65, -1, + 67, -1, -1, -1, -1, -1, -1, -1, 58, 76, + 77, -1, -1, 63, -1, 65, -1, 67, -1, -1, + -1, -1, -1, -1, 91, -1, 76, 77, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 91 }; +/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ +#line 3 "/usr/share/bison.simple" +/* This file comes from bison-1.28. */ -#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) -# define YYSIZE_T __SIZE_TYPE__ -#endif -#if ! defined (YYSIZE_T) && defined (size_t) -# define YYSIZE_T size_t +/* Skeleton output parser for bison, + Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* This is the parser code that is written into each bison parser + when the %semantic_parser declaration is not specified in the grammar. + It was written by Richard Stallman by simplifying the hairy parser + used when %semantic_parser is specified. */ + +#ifndef YYSTACK_USE_ALLOCA +#ifdef alloca +#define YYSTACK_USE_ALLOCA +#else /* alloca not defined */ +#ifdef __GNUC__ +#define YYSTACK_USE_ALLOCA +#define alloca __builtin_alloca +#else /* not GNU C. */ +#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) +#define YYSTACK_USE_ALLOCA +#include +#else /* not sparc */ +/* We think this test detects Watcom and Microsoft C. */ +/* This used to test MSDOS, but that is a bad idea + since that symbol is in the user namespace. */ +#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) +#if 0 /* No need for malloc.h, which pollutes the namespace; + instead, just don't use alloca. */ +#include #endif -#if ! defined (YYSIZE_T) -# if defined (__STDC__) || defined (__cplusplus) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# endif +#else /* not MSDOS, or __TURBOC__ */ +#if defined(_AIX) +/* I don't know what this was needed for, but it pollutes the namespace. + So I turned it off. rms, 2 May 1997. */ +/* #include */ + #pragma alloca +#define YYSTACK_USE_ALLOCA +#else /* not MSDOS, or __TURBOC__, or _AIX */ +#if 0 +#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up, + and on HPUX 10. Eventually we can turn this on. */ +#define YYSTACK_USE_ALLOCA +#define alloca __builtin_alloca +#endif /* __hpux */ #endif -#if ! defined (YYSIZE_T) -# define YYSIZE_T unsigned int +#endif /* not _AIX */ +#endif /* not MSDOS, or __TURBOC__ */ +#endif /* not sparc */ +#endif /* not GNU C */ +#endif /* alloca not defined */ +#endif /* YYSTACK_USE_ALLOCA not defined */ + +#ifdef YYSTACK_USE_ALLOCA +#define YYSTACK_ALLOC alloca +#else +#define YYSTACK_ALLOC malloc #endif +/* Note: there must be only one dollar sign in this file. + It is replaced by the list of actions, each action + as one case of the switch. */ + #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY -2 #define YYEOF 0 - #define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab +#define YYABORT goto yyabortlab #define YYERROR goto yyerrlab1 - -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. +/* Like YYERROR except do call yyerror. + This remains here temporarily to ease the + transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ - #define YYFAIL goto yyerrlab - #define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ +#define YYBACKUP(token, value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ - { \ - yychar = (Token); \ - yylval = (Value); \ + { yychar = (token), yylval = (value); \ yychar1 = YYTRANSLATE (yychar); \ YYPOPSTACK; \ goto yybackup; \ } \ else \ - { \ - yyerror ("syntax error: cannot back up"); \ - YYERROR; \ - } \ + { yyerror ("syntax error: cannot back up"); YYERROR; } \ while (0) #define YYTERROR 1 #define YYERRCODE 256 -/* YYLLOC_DEFAULT -- Compute the default location (before the actions - are run). */ - -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - Current.first_line = Rhs[1].first_line; \ - Current.first_column = Rhs[1].first_column; \ - Current.last_line = Rhs[N].last_line; \ - Current.last_column = Rhs[N].last_column; +#ifndef YYPURE +#define YYLEX yylex() #endif -/* YYLEX -- calling `yylex' with the right arguments. */ - -#define YYLEX yylex () - -/* Enable debugging if requested. */ -#if YYDEBUG - -# ifndef YYFPRINTF -# include /* INFRINGES ON USER NAME SPACE */ -# define YYFPRINTF fprintf -# endif - -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (0) -# define YYDSYMPRINT(Args) \ -do { \ - if (yydebug) \ - yysymprint Args; \ -} while (0) -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YYDSYMPRINT(Args) -#endif /* !YYDEBUG */ - -/* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH -# define YYINITDEPTH 200 +#ifdef YYPURE +#ifdef YYLSP_NEEDED +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval, &yylloc) +#endif +#else /* not YYLSP_NEEDED */ +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval) +#endif +#endif /* not YYLSP_NEEDED */ #endif -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). +/* If nonreentrant, generate the variables here */ - Do not make this value too large; the results are undefined if - SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ +#ifndef YYPURE -#if YYMAXDEPTH == 0 -# undef YYMAXDEPTH -#endif +int yychar; /* the lookahead symbol */ +YYSTYPE yylval; /* the semantic value of the */ + /* lookahead symbol */ -#ifndef YYMAXDEPTH -# define YYMAXDEPTH 10000 +#ifdef YYLSP_NEEDED +YYLTYPE yylloc; /* location data for the lookahead */ + /* symbol */ #endif - +int yynerrs; /* number of parse errors so far */ +#endif /* not YYPURE */ -#if YYERROR_VERBOSE +#if YYDEBUG != 0 +int yydebug; /* nonzero means print parse trace */ +/* Since this is uninitialized, it does not stop multiple parsers + from coexisting. */ +#endif -# ifndef yystrlen -# if defined (__GLIBC__) && defined (_STRING_H) -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -static YYSIZE_T -# if defined (__STDC__) || defined (__cplusplus) -yystrlen (const char *yystr) -# else -yystrlen (yystr) - const char *yystr; -# endif -{ - register const char *yys = yystr; +/* YYINITDEPTH indicates the initial size of the parser's stacks */ - while (*yys++ != '\0') - continue; +#ifndef YYINITDEPTH +#define YYINITDEPTH 200 +#endif - return yys - yystr - 1; -} -# endif -# endif - -# ifndef yystpcpy -# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -static char * -# if defined (__STDC__) || defined (__cplusplus) -yystpcpy (char *yydest, const char *yysrc) -# else -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; -# endif -{ - register char *yyd = yydest; - register const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif +/* YYMAXDEPTH is the maximum size the stacks can grow to + (effective only if the built-in stack extension method is used). */ -#endif /* !YYERROR_VERBOSE */ +#if YYMAXDEPTH == 0 +#undef YYMAXDEPTH +#endif +#ifndef YYMAXDEPTH +#define YYMAXDEPTH 10000 +#endif - -#if YYDEBUG -/*-----------------------------. -| Print this symbol on YYOUT. | -`-----------------------------*/ - +/* Define __yy_memcpy. Note that the size argument + should be passed with type unsigned int, because that is what the non-GCC + definitions require. With GCC, __builtin_memcpy takes an arg + of type size_t, but it can handle unsigned int. */ + +#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ +#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) +#else /* not GNU C or C++ */ +#ifndef __cplusplus + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ static void -#if defined (__STDC__) || defined (__cplusplus) -yysymprint (FILE* yyout, int yytype, YYSTYPE yyvalue) -#else -yysymprint (yyout, yytype, yyvalue) - FILE* yyout; - int yytype; - YYSTYPE yyvalue; -#endif +__yy_memcpy (to, from, count) + char *to; + char *from; + unsigned int count; { - /* Pacify ``unused variable'' warnings. */ - (void) yyvalue; - - if (yytype < YYNTOKENS) - { - YYFPRINTF (yyout, "token %s (", yytname[yytype]); -# ifdef YYPRINT - YYPRINT (yyout, yytoknum[yytype], yyvalue); -# endif - } - else - YYFPRINTF (yyout, "nterm %s (", yytname[yytype]); + register char *f = from; + register char *t = to; + register int i = count; - switch (yytype) - { - default: - break; - } - YYFPRINTF (yyout, ")"); + while (i-- > 0) + *t++ = *f++; } -#endif /* YYDEBUG. */ +#else /* __cplusplus */ -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ static void -#if defined (__STDC__) || defined (__cplusplus) -yydestruct (int yytype, YYSTYPE yyvalue) -#else -yydestruct (yytype, yyvalue) - int yytype; - YYSTYPE yyvalue; -#endif +__yy_memcpy (char *to, char *from, unsigned int count) { - /* Pacify ``unused variable'' warnings. */ - (void) yyvalue; + register char *t = to; + register char *f = from; + register int i = count; - switch (yytype) - { - default: - break; - } + while (i-- > 0) + *t++ = *f++; } +#endif +#endif +#line 217 "/usr/share/bison.simple" /* The user can define YYPARSE_PARAM as the name of an argument to be passed into yyparse. The argument should have type void *. @@ -1421,85 +1011,76 @@ yydestruct (yytype, yyvalue) to the proper pointer type. */ #ifdef YYPARSE_PARAM -# if defined (__STDC__) || defined (__cplusplus) -# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM -# define YYPARSE_PARAM_DECL -# else -# define YYPARSE_PARAM_ARG YYPARSE_PARAM -# define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -# endif -#else /* !YYPARSE_PARAM */ -# define YYPARSE_PARAM_ARG -# define YYPARSE_PARAM_DECL -#endif /* !YYPARSE_PARAM */ +#ifdef __cplusplus +#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM +#define YYPARSE_PARAM_DECL +#else /* not __cplusplus */ +#define YYPARSE_PARAM_ARG YYPARSE_PARAM +#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; +#endif /* not __cplusplus */ +#else /* not YYPARSE_PARAM */ +#define YYPARSE_PARAM_ARG +#define YYPARSE_PARAM_DECL +#endif /* not YYPARSE_PARAM */ /* Prevent warning if -Wstrict-prototypes. */ #ifdef __GNUC__ -# ifdef YYPARSE_PARAM +#ifdef YYPARSE_PARAM int yyparse (void *); -# else +#else int yyparse (void); -# endif #endif - - -/* The lookahead symbol. */ -int yychar; - -/* The semantic value of the lookahead symbol. */ -YYSTYPE yylval; - -/* Number of parse errors so far. */ -int yynerrs; - +#endif int -yyparse (YYPARSE_PARAM_ARG) +yyparse(YYPARSE_PARAM_ARG) YYPARSE_PARAM_DECL { - register int yystate; register int yyn; - int yyresult; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - /* Lookahead token as an internal (translated) token number. */ - int yychar1 = 0; - - /* Three stacks and their tools: - `yyss': related to states, - `yyvs': related to semantic values, - `yyls': related to locations. - - Refer to the stacks thru separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - short yyssa[YYINITDEPTH]; - short *yyss = yyssa; register short *yyssp; - - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs = yyvsa; register YYSTYPE *yyvsp; + int yyerrstatus; /* number of tokens to shift before error messages enabled */ + int yychar1 = 0; /* lookahead token as an internal (translated) token number */ + short yyssa[YYINITDEPTH]; /* the state stack */ + YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ + short *yyss = yyssa; /* refer to the stacks thru separate pointers */ + YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ +#ifdef YYLSP_NEEDED + YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ + YYLTYPE *yyls = yylsa; + YYLTYPE *yylsp; + +#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) +#else #define YYPOPSTACK (yyvsp--, yyssp--) +#endif - YYSIZE_T yystacksize = YYINITDEPTH; + int yystacksize = YYINITDEPTH; + int yyfree_stacks = 0; - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; +#ifdef YYPURE + int yychar; + YYSTYPE yylval; + int yynerrs; +#ifdef YYLSP_NEEDED + YYLTYPE yylloc; +#endif +#endif + YYSTYPE yyval; /* the variable used to return */ + /* semantic values from the action */ + /* routines */ - /* When reducing, the number of symbols on the RHS of the reduced - rule. */ int yylen; - YYDPRINTF ((stderr, "Starting parse\n")); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Starting parse\n"); +#endif yystate = 0; yyerrstatus = 0; @@ -1511,96 +1092,110 @@ yyparse (YYPARSE_PARAM_ARG) so that they stay on the same level as the state stack. The wasted elements are never initialized. */ - yyssp = yyss; + yyssp = yyss - 1; yyvsp = yyvs; +#ifdef YYLSP_NEEDED + yylsp = yyls; +#endif - goto yysetstate; - -/*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | -`------------------------------------------------------------*/ - yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. - */ - yyssp++; +/* Push a new state, which is found in yystate . */ +/* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. */ +yynewstate: - yysetstate: - *yyssp = yystate; + *++yyssp = yystate; if (yyssp >= yyss + yystacksize - 1) { + /* Give user a chance to reallocate the stack */ + /* Use copies of these so that the &'s don't force the real ones into memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; +#ifdef YYLSP_NEEDED + YYLTYPE *yyls1 = yyls; +#endif + /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; + int size = yyssp - yyss + 1; #ifdef yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; - - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow ("parser stack overflow", - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; - } + /* Each stack pointer address is followed by the size of + the data in use in that stack, in bytes. */ +#ifdef YYLSP_NEEDED + /* This used to be a conditional around just the two extra args, + but that might be undefined if yyoverflow is a macro. */ + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yyls1, size * sizeof (*yylsp), + &yystacksize); +#else + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yystacksize); +#endif + + yyss = yyss1; yyvs = yyvs1; +#ifdef YYLSP_NEEDED + yyls = yyls1; +#endif #else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyoverflowlab; -# else /* Extend the stack our own way. */ if (yystacksize >= YYMAXDEPTH) - goto yyoverflowlab; + { + yyerror("parser stack overflow"); + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); +#endif + } + return 2; + } yystacksize *= 2; if (yystacksize > YYMAXDEPTH) yystacksize = YYMAXDEPTH; - - { - short *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyoverflowlab; - YYSTACK_RELOCATE (yyss); - YYSTACK_RELOCATE (yyvs); - -# undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } -# endif +#ifndef YYSTACK_USE_ALLOCA + yyfree_stacks = 1; +#endif + yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); + __yy_memcpy ((char *)yyss, (char *)yyss1, + size * (unsigned int) sizeof (*yyssp)); + yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); + __yy_memcpy ((char *)yyvs, (char *)yyvs1, + size * (unsigned int) sizeof (*yyvsp)); +#ifdef YYLSP_NEEDED + yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); + __yy_memcpy ((char *)yyls, (char *)yyls1, + size * (unsigned int) sizeof (*yylsp)); +#endif #endif /* no yyoverflow */ - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; - + yyssp = yyss + size - 1; + yyvsp = yyvs + size - 1; +#ifdef YYLSP_NEEDED + yylsp = yyls + size - 1; +#endif - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Stack size increased to %d\n", yystacksize); +#endif if (yyssp >= yyss + yystacksize - 1) YYABORT; } - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Entering state %d\n", yystate); +#endif goto yybackup; - -/*-----------. -| yybackup. | -`-----------*/ -yybackup: + yybackup: /* Do appropriate processing given the current state. */ /* Read a lookahead token if we need one and don't already have one. */ @@ -1609,7 +1204,7 @@ yyparse (YYPARSE_PARAM_ARG) /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; - if (yyn == YYPACT_NINF) + if (yyn == YYFLAG) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ @@ -1619,141 +1214,146 @@ yyparse (YYPARSE_PARAM_ARG) if (yychar == YYEMPTY) { - YYDPRINTF ((stderr, "Reading a token: ")); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Reading a token: "); +#endif yychar = YYLEX; } - /* Convert token to internal form (in yychar1) for indexing tables with. */ + /* Convert token to internal form (in yychar1) for indexing tables with */ - if (yychar <= 0) /* This means end of input. */ + if (yychar <= 0) /* This means end of input. */ { yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more. */ + yychar = YYEOF; /* Don't call YYLEX any more */ - YYDPRINTF ((stderr, "Now at end of input.\n")); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Now at end of input.\n"); +#endif } else { - yychar1 = YYTRANSLATE (yychar); + yychar1 = YYTRANSLATE(yychar); - /* We have to keep this `#if YYDEBUG', since we use variables - which are defined only if `YYDEBUG' is set. */ - YYDPRINTF ((stderr, "Next token is ")); - YYDSYMPRINT ((stderr, yychar1, yylval)); - YYDPRINTF ((stderr, "\n")); +#if YYDEBUG != 0 + if (yydebug) + { + fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); + /* Give the individual parser a way to print the precise meaning + of a token, for further debugging info. */ +#ifdef YYPRINT + YYPRINT (stderr, yychar, yylval); +#endif + fprintf (stderr, ")\n"); + } +#endif } - /* If the proper action on seeing token YYCHAR1 is to reduce or to - detect an error, take that action. */ yyn += yychar1; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yychar1) + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) goto yydefault; + yyn = yytable[yyn]; - if (yyn <= 0) + + /* yyn is what to do for this token type in this state. + Negative => reduce, -yyn is rule number. + Positive => shift, yyn is new state. + New state is final state => don't bother to shift, + just return success. + 0, or most negative number => error. */ + + if (yyn < 0) { - if (yyn == 0 || yyn == YYTABLE_NINF) + if (yyn == YYFLAG) goto yyerrlab; yyn = -yyn; goto yyreduce; } + else if (yyn == 0) + goto yyerrlab; if (yyn == YYFINAL) YYACCEPT; /* Shift the lookahead token. */ - YYDPRINTF ((stderr, "Shifting token %d (%s), ", - yychar, yytname[yychar1])); + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); +#endif /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; + /* count tokens shifted since error; after three, turn off error status. */ + if (yyerrstatus) yyerrstatus--; yystate = yyn; goto yynewstate; - -/*-----------------------------------------------------------. -| yydefault -- do the default action for the current state. | -`-----------------------------------------------------------*/ +/* Do the default action for the current state. */ yydefault: + yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; - goto yyreduce; - -/*-----------------------------. -| yyreduce -- Do a reduction. | -`-----------------------------*/ +/* Do a reduction. yyn is the number of a rule to reduce with. */ yyreduce: - /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; + if (yylen > 0) + yyval = yyvsp[1-yylen]; /* implement default value of the action */ - /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. - - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval = yyvsp[1-yylen]; - - - -#if YYDEBUG - /* We have to keep this `#if YYDEBUG', since we use variables which - are defined only if `YYDEBUG' is set. */ +#if YYDEBUG != 0 if (yydebug) { - int yyi; + int i; - YYFPRINTF (stderr, "Reducing via rule %d (line %d), ", - yyn - 1, yyrline[yyn]); + fprintf (stderr, "Reducing via rule %d (line %d), ", + yyn, yyrline[yyn]); /* Print the symbols being reduced, and their result. */ - for (yyi = yyprhs[yyn]; yyrhs[yyi] >= 0; yyi++) - YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]); - YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]); + for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) + fprintf (stderr, "%s ", yytname[yyrhs[i]]); + fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); } #endif - switch (yyn) - { - case 2: + + + switch (yyn) { + +case 1: #line 301 "asn1p_y.y" - { +{ *(void **)param = yyvsp[0].a_grammar; - } - break; - - case 3: + ; + break;} +case 2: #line 307 "asn1p_y.y" - { +{ yyval.a_grammar = asn1p_new(); checkmem(yyval.a_grammar); TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); - } - break; - - case 4: + ; + break;} +case 3: #line 312 "asn1p_y.y" - { +{ yyval.a_grammar = yyvsp[-1].a_grammar; TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); - } - break; - - case 5: + ; + break;} +case 4: #line 333 "asn1p_y.y" - { +{ if(yyvsp[-1].a_module) { yyval.a_module = yyvsp[-1].a_module; @@ -1766,134 +1366,116 @@ yyparse (YYPARSE_PARAM_ARG) yyval.a_module->Identifier = yyvsp[-7].tv_str; yyval.a_module->module_oid = yyvsp[-6].a_oid; yyval.a_module->module_flags = yyvsp[-4].a_module_flags; - } - break; - - case 6: + ; + break;} +case 5: #line 354 "asn1p_y.y" - { yyval.a_oid = 0; } - break; - - case 7: +{ yyval.a_oid = 0; ; + break;} +case 6: #line 355 "asn1p_y.y" - { yyval.a_oid = yyvsp[0].a_oid; } - break; - - case 8: +{ yyval.a_oid = yyvsp[0].a_oid; ; + break;} +case 7: #line 359 "asn1p_y.y" - { +{ yyval.a_oid = yyvsp[-1].a_oid; - } - break; - - case 9: + ; + break;} +case 8: #line 362 "asn1p_y.y" - { +{ yyval.a_oid = 0; - } - break; - - case 10: + ; + break;} +case 9: #line 368 "asn1p_y.y" - { +{ yyval.a_oid = asn1p_oid_new(); asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); if(yyvsp[0].a_oid_arc.name) free(yyvsp[0].a_oid_arc.name); - } - break; - - case 11: + ; + break;} +case 10: #line 374 "asn1p_y.y" - { +{ yyval.a_oid = yyvsp[-1].a_oid; asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); if(yyvsp[0].a_oid_arc.name) free(yyvsp[0].a_oid_arc.name); - } - break; - - case 12: + ; + break;} +case 11: #line 383 "asn1p_y.y" - { /* iso */ +{ /* iso */ yyval.a_oid_arc.name = yyvsp[0].tv_str; yyval.a_oid_arc.number = -1; - } - break; - - case 13: + ; + break;} +case 12: #line 387 "asn1p_y.y" - { /* iso(1) */ +{ /* iso(1) */ yyval.a_oid_arc.name = yyvsp[-3].tv_str; yyval.a_oid_arc.number = yyvsp[-1].a_int; - } - break; - - case 14: + ; + break;} +case 13: #line 391 "asn1p_y.y" - { /* 1 */ +{ /* 1 */ yyval.a_oid_arc.name = 0; yyval.a_oid_arc.number = yyvsp[0].a_int; - } - break; - - case 15: + ; + break;} +case 14: #line 401 "asn1p_y.y" - { yyval.a_module_flags = MSF_NOFLAGS; } - break; - - case 16: +{ yyval.a_module_flags = MSF_NOFLAGS; ; + break;} +case 15: #line 402 "asn1p_y.y" - { +{ yyval.a_module_flags = yyvsp[0].a_module_flags; - } - break; - - case 17: + ; + break;} +case 16: #line 411 "asn1p_y.y" - { +{ yyval.a_module_flags = yyvsp[0].a_module_flags; - } - break; - - case 18: + ; + break;} +case 17: #line 414 "asn1p_y.y" - { +{ yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags; - } - break; - - case 19: + ; + break;} +case 18: #line 423 "asn1p_y.y" - { +{ yyval.a_module_flags = MSF_EXPLICIT_TAGS; - } - break; - - case 20: + ; + break;} +case 19: #line 426 "asn1p_y.y" - { +{ yyval.a_module_flags = MSF_IMPLICIT_TAGS; - } - break; - - case 21: + ; + break;} +case 20: #line 429 "asn1p_y.y" - { +{ yyval.a_module_flags = MSF_AUTOMATIC_TAGS; - } - break; - - case 22: + ; + break;} +case 21: #line 432 "asn1p_y.y" - { +{ yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED; - } - break; - - case 23: + ; + break;} +case 22: #line 436 "asn1p_y.y" - { +{ /* X.680Amd1 specifies TAG and XER */ if(strcmp(yyvsp[-1].tv_str, "TAG") == 0) { yyval.a_module_flags = MSF_TAG_INSTRUCTIONS; @@ -1907,31 +1489,27 @@ yyparse (YYPARSE_PARAM_ARG) yyval.a_module_flags = MSF_unk_INSTRUCTIONS; } free(yyvsp[-1].tv_str); - } - break; - - case 24: + ; + break;} +case 23: #line 457 "asn1p_y.y" - { yyval.a_module = 0; } - break; - - case 25: +{ yyval.a_module = 0; ; + break;} +case 24: #line 458 "asn1p_y.y" - { +{ yyval.a_module = yyvsp[0].a_module; - } - break; - - case 26: + ; + break;} +case 25: #line 467 "asn1p_y.y" - { +{ yyval.a_module = yyvsp[0].a_module; - } - break; - - case 27: + ; + break;} +case 26: #line 470 "asn1p_y.y" - { +{ yyval.a_module = yyvsp[-1].a_module; /* Behave well when one of them is skipped. */ @@ -1957,19 +1535,17 @@ yyparse (YYPARSE_PARAM_ARG) MY_IMPORT(members, next); #undef MY_IMPORT - } - break; - - case 28: + ; + break;} +case 27: #line 503 "asn1p_y.y" - { +{ yyval.a_module = yyvsp[0].a_module; - } - break; - - case 29: + ; + break;} +case 28: #line 506 "asn1p_y.y" - { +{ yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); if(yyvsp[0].a_xports) { @@ -1977,321 +1553,285 @@ yyparse (YYPARSE_PARAM_ARG) } else { /* "EXPORTS ALL;" ? */ } - } - break; - - case 30: + ; + break;} +case 29: #line 515 "asn1p_y.y" - { +{ yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID); assert(yyvsp[0].a_expr->meta_type != AMT_INVALID); TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); - } - break; - - case 31: + ; + break;} +case 30: #line 522 "asn1p_y.y" - { +{ yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID); assert(yyvsp[0].a_expr->meta_type != AMT_INVALID); TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); - } - break; - - case 32: + ; + break;} +case 31: #line 535 "asn1p_y.y" - { +{ yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); assert(yyvsp[0].a_expr->expr_type != A1TC_INVALID); assert(yyvsp[0].a_expr->meta_type != AMT_INVALID); TQ_ADD(&(yyval.a_module->members), yyvsp[0].a_expr, next); - } - break; - - case 33: + ; + break;} +case 32: #line 543 "asn1p_y.y" - { asn1p_lexer_hack_push_encoding_control(); } - break; - - case 34: +{ asn1p_lexer_hack_push_encoding_control(); ; + break;} +case 33: #line 544 "asn1p_y.y" - { +{ fprintf(stderr, "WARNING: ENCODING-CONTROL %s " "specification at line %d ignored\n", yyvsp[-1].tv_str, yylineno); free(yyvsp[-1].tv_str); yyval.a_module = 0; - } - break; - - case 35: + ; + break;} +case 34: #line 556 "asn1p_y.y" - { +{ return yyerror( "Attempt to redefine a standard basic type, " "use -ftypesXY to switch back " "to older version of ASN.1 standard"); - } - break; - - case 36: + ; + break;} +case 35: #line 570 "asn1p_y.y" - { +{ yyval.a_module = yyvsp[-1].a_module; - } - break; - - case 37: + ; + break;} +case 36: #line 576 "asn1p_y.y" - { +{ return yyerror("Empty IMPORTS list"); - } - break; - - case 38: + ; + break;} +case 37: #line 582 "asn1p_y.y" - { +{ yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); - } - break; - - case 39: + ; + break;} +case 38: #line 587 "asn1p_y.y" - { +{ yyval.a_module = yyvsp[-1].a_module; TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); - } - break; - - case 40: + ; + break;} +case 39: #line 594 "asn1p_y.y" - { +{ yyval.a_xports = yyvsp[-3].a_xports; yyval.a_xports->from = yyvsp[-1].tv_str; yyval.a_xports->from_oid = yyvsp[0].a_oid; checkmem(yyval.a_xports); - } - break; - - case 41: + ; + break;} +case 40: #line 603 "asn1p_y.y" - { +{ yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - } - break; - - case 42: + ; + break;} +case 41: #line 608 "asn1p_y.y" - { +{ yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - } - break; - - case 43: + ; + break;} +case 42: #line 615 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_REFERENCE; - } - break; - - case 44: + ; + break;} +case 43: #line 621 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_REFERENCE; - } - break; - - case 45: + ; + break;} +case 44: #line 630 "asn1p_y.y" - { +{ yyval.a_xports = yyvsp[-1].a_xports; - } - break; - - case 46: + ; + break;} +case 45: #line 633 "asn1p_y.y" - { +{ yyval.a_xports = 0; - } - break; - - case 47: + ; + break;} +case 46: #line 636 "asn1p_y.y" - { +{ /* Empty EXPORTS clause effectively prohibits export. */ yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); - } - break; - - case 48: + ; + break;} +case 47: #line 644 "asn1p_y.y" - { +{ yyval.a_xports = asn1p_xports_new(); assert(yyval.a_xports); TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - } - break; - - case 49: + ; + break;} +case 48: #line 649 "asn1p_y.y" - { +{ yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); - } - break; - - case 50: + ; + break;} +case 49: #line 656 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_EXPORTVAR; - } - break; - - case 51: + ; + break;} +case 50: #line 662 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_EXPORTVAR; - } - break; - - case 52: + ; + break;} +case 51: #line 672 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-4].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-5].tv_str; yyval.a_expr->meta_type = AMT_VALUESET; // take care of optValueSetBody - } - break; - - case 53: + ; + break;} +case 52: #line 682 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->reference = yyvsp[0].a_ref; yyval.a_expr->expr_type = A1TC_REFERENCE; yyval.a_expr->meta_type = AMT_TYPEREF; - } - break; - - case 54: + ; + break;} +case 53: #line 689 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = yyvsp[0].a_type; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 55: + ; + break;} +case 54: #line 698 "asn1p_y.y" - { } - break; - - case 56: +{ ; + break;} +case 55: #line 699 "asn1p_y.y" - { - } - break; - - case 57: +{ + ; + break;} +case 56: #line 710 "asn1p_y.y" - { - } - break; - - case 58: +{ + ; + break;} +case 57: #line 712 "asn1p_y.y" - { - } - break; - - case 59: +{ + ; + break;} +case 58: #line 717 "asn1p_y.y" - { - } - break; - - case 60: +{ + ; + break;} +case 59: #line 719 "asn1p_y.y" - { - } - break; - - case 61: +{ + ; + break;} +case 60: #line 735 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->tag = yyvsp[-1].a_tag; yyval.a_expr->expr_type = A1TC_TYPEID; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 62: + ; + break;} +case 61: #line 743 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->tag = yyvsp[-1].a_tag; assert(yyval.a_expr->expr_type); assert(yyval.a_expr->meta_type); - } - break; - - case 63: + ; + break;} +case 62: #line 750 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; assert(yyval.a_expr->expr_type == A1TC_CLASSDEF); assert(yyval.a_expr->meta_type == AMT_OBJECT); - } - break; - - case 64: + ; + break;} +case 63: #line 766 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-5].tv_str; yyval.a_expr->params = yyvsp[-3].a_plist; yyval.a_expr->meta_type = AMT_PARAMTYPE; - } - break; - - case 65: + ; + break;} +case 64: #line 776 "asn1p_y.y" - { +{ int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); checkmem(yyval.a_plist); @@ -2299,232 +1839,207 @@ yyparse (YYPARSE_PARAM_ARG) checkmem(ret == 0); if(yyvsp[0].a_parg.governor) asn1p_ref_free(yyvsp[0].a_parg.governor); if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument); - } - break; - - case 66: + ; + break;} +case 65: #line 785 "asn1p_y.y" - { +{ int ret; yyval.a_plist = yyvsp[-2].a_plist; ret = asn1p_paramlist_add_param(yyval.a_plist, yyvsp[0].a_parg.governor, yyvsp[0].a_parg.argument); checkmem(ret == 0); if(yyvsp[0].a_parg.governor) asn1p_ref_free(yyvsp[0].a_parg.governor); if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument); - } - break; - - case 67: + ; + break;} +case 66: #line 796 "asn1p_y.y" - { +{ yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; - } - break; - - case 68: + ; + break;} +case 67: #line 800 "asn1p_y.y" - { +{ int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); ret = asn1p_ref_add_component(yyval.a_parg.governor, yyvsp[-2].tv_str, 0); checkmem(ret == 0); yyval.a_parg.argument = yyvsp[0].tv_str; - } - break; - - case 69: + ; + break;} +case 68: #line 807 "asn1p_y.y" - { +{ int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); ret = asn1p_ref_add_component(yyval.a_parg.governor, ASN_EXPR_TYPE2STR(yyvsp[-2].a_type), 1); checkmem(ret == 0); yyval.a_parg.argument = yyvsp[0].tv_str; - } - break; - - case 70: + ; + break;} +case 69: #line 818 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); - TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 71: + asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); + ; + break;} +case 70: #line 823 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-2].a_expr; - TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 72: + asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); + ; + break;} +case 71: #line 830 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[0].a_expr; - } - break; - - case 73: + ; + break;} +case 72: #line 833 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_REFERENCE; yyval.a_expr->meta_type = AMT_VALUE; - } - break; - - case 74: + ; + break;} +case 73: #line 846 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); - TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 75: + asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); + ; + break;} +case 74: #line 851 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-2].a_expr; - TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 76: + asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); + ; + break;} +case 75: #line 858 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-2].tv_nametag.name; yyval.a_expr->tag = yyvsp[-2].tv_nametag.tag; yyval.a_expr->marker = yyvsp[0].a_marker; - } - break; - - case 77: + ; + break;} +case 76: #line 865 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->meta_type = yyvsp[0].a_expr->meta_type; yyval.a_expr->expr_type = A1TC_COMPONENTS_OF; - TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 78: + asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); + ; + break;} +case 77: #line 872 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[0].a_expr; - } - break; - - case 79: + ; + break;} +case 78: #line 878 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); - TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 80: + asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); + ; + break;} +case 79: #line 883 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-2].a_expr; - TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 81: + asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); + ; + break;} +case 80: #line 890 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-1].tv_nametag.name; yyval.a_expr->tag = yyvsp[-1].tv_nametag.tag; - } - break; - - case 82: + ; + break;} +case 81: #line 896 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[0].a_expr; - } - break; - - case 83: + ; + break;} +case 82: #line 902 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); yyval.a_expr->with_syntax = yyvsp[0].a_wsynt; assert(yyval.a_expr->expr_type == A1TC_CLASSDEF); assert(yyval.a_expr->meta_type == AMT_OBJECT); - } - break; - - case 84: + ; + break;} +case 83: #line 912 "asn1p_y.y" - { yyval.a_int = 0; } - break; - - case 85: +{ yyval.a_int = 0; ; + break;} +case 84: #line 913 "asn1p_y.y" - { yyval.a_int = 1; } - break; - - case 86: +{ yyval.a_int = 1; ; + break;} +case 85: #line 917 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_CLASSDEF; yyval.a_expr->meta_type = AMT_OBJECT; - TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 87: + asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); + ; + break;} +case 86: #line 924 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-2].a_expr; - TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 88: + asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); + ; + break;} +case 87: #line 931 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[-1].a_refcomp.name; yyval.a_expr->expr_type = A1TC_CLASSFIELD; yyval.a_expr->meta_type = AMT_OBJECTFIELD; yyval.a_expr->marker = yyvsp[0].a_marker; - } - break; - - case 89: + ; + break;} +case 88: #line 939 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-2].a_expr; yyval.a_expr->Identifier = yyvsp[-3].a_refcomp.name; yyval.a_expr->marker = yyvsp[-1].a_marker; yyval.a_expr->unique = yyvsp[0].a_int; - } - break; - - case 90: + ; + break;} +case 89: #line 945 "asn1p_y.y" - { +{ int ret; yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2538,59 +2053,51 @@ yyparse (YYPARSE_PARAM_ARG) yyval.a_expr->meta_type = AMT_OBJECTFIELD; yyval.a_expr->marker = yyvsp[-1].a_marker; yyval.a_expr->unique = yyvsp[0].a_int; - } - break; - - case 91: + ; + break;} +case 90: #line 963 "asn1p_y.y" - { yyval.a_wsynt = 0; } - break; - - case 92: +{ yyval.a_wsynt = 0; ; + break;} +case 91: #line 964 "asn1p_y.y" - { +{ yyval.a_wsynt = yyvsp[0].a_wsynt; - } - break; - - case 93: + ; + break;} +case 92: #line 971 "asn1p_y.y" - { asn1p_lexer_hack_enable_with_syntax(); } - break; - - case 94: +{ asn1p_lexer_hack_enable_with_syntax(); ; + break;} +case 93: #line 973 "asn1p_y.y" - { +{ yyval.a_wsynt = yyvsp[-1].a_wsynt; - } - break; - - case 95: + ; + break;} +case 94: #line 979 "asn1p_y.y" - { +{ yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); - } - break; - - case 96: + ; + break;} +case 95: #line 983 "asn1p_y.y" - { +{ yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); - } - break; - - case 97: + ; + break;} +case 96: #line 990 "asn1p_y.y" - { +{ yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); - } - break; - - case 98: + ; + break;} +case 97: #line 993 "asn1p_y.y" - { +{ asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -2598,24 +2105,22 @@ yyparse (YYPARSE_PARAM_ARG) ret = asn1p_ref_add_component(ref, yyvsp[0].a_refcomp.name, yyvsp[0].a_refcomp.lex_type); checkmem(ret == 0); yyval.a_wchunk = asn1p_wsyntx_chunk_fromref(ref, 0); - } - break; - - case 99: + ; + break;} +case 98: #line 1005 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); checkmem(yyval.a_expr->Identifier); yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 100: + ; + break;} +case 99: #line 1013 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); @@ -2623,12 +2128,11 @@ yyparse (YYPARSE_PARAM_ARG) yyval.a_expr->value = yyvsp[0].a_value; yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 101: + ; + break;} +case 100: #line 1022 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); @@ -2636,12 +2140,11 @@ yyparse (YYPARSE_PARAM_ARG) checkmem(yyval.a_expr->Identifier); yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 102: + ; + break;} +case 101: #line 1034 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-1].a_expr; /* * Outer constraint for SEQUENCE OF and SET OF applies @@ -2658,93 +2161,84 @@ yyparse (YYPARSE_PARAM_ARG) yyval.a_expr->constraints = yyvsp[0].a_constr; } } - } - break; - - case 103: + ; + break;} +case 102: #line 1055 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[0].a_expr; - } - break; - - case 104: + ; + break;} +case 103: #line 1058 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = yyvsp[0].a_type; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 105: + ; + break;} +case 104: #line 1064 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); yyval.a_expr->expr_type = ASN_CONSTR_CHOICE; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 106: + ; + break;} +case 105: #line 1070 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 107: + ; + break;} +case 106: #line 1076 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); yyval.a_expr->expr_type = ASN_CONSTR_SET; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 108: + ; + break;} +case 107: #line 1082 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->constraints = yyvsp[-2].a_constr; yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE_OF; yyval.a_expr->meta_type = AMT_TYPE; - TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 109: + asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); + ; + break;} +case 108: #line 1090 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->constraints = yyvsp[-2].a_constr; yyval.a_expr->expr_type = ASN_CONSTR_SET_OF; yyval.a_expr->meta_type = AMT_TYPE; - TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 110: + asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); + ; + break;} +case 109: #line 1098 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = ASN_TYPE_ANY; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 111: + ; + break;} +case 110: #line 1104 "asn1p_y.y" - { +{ int ret; yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2754,12 +2248,11 @@ yyparse (YYPARSE_PARAM_ARG) checkmem(ret == 0); yyval.a_expr->expr_type = ASN_TYPE_ANY; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 112: + ; + break;} +case 111: #line 1118 "asn1p_y.y" - { +{ int ret; yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == 0); @@ -2772,46 +2265,42 @@ yyparse (YYPARSE_PARAM_ARG) free(yyvsp[-3].tv_str); yyval.a_expr->expr_type = A1TC_PARAMETRIZED; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 113: + ; + break;} +case 112: #line 1142 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->reference = yyvsp[0].a_ref; yyval.a_expr->expr_type = A1TC_REFERENCE; yyval.a_expr->meta_type = AMT_TYPEREF; - } - break; - - case 114: + ; + break;} +case 113: #line 1149 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->reference = yyvsp[0].a_ref; yyval.a_expr->expr_type = A1TC_INSTANCE; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 115: + ; + break;} +case 114: #line 1164 "asn1p_y.y" - { +{ int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_UNKNOWN); checkmem(ret == 0); free(yyvsp[0].tv_str); - } - break; - - case 116: + ; + break;} +case 115: #line 1172 "asn1p_y.y" - { +{ int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); @@ -2820,12 +2309,11 @@ yyparse (YYPARSE_PARAM_ARG) ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_UNKNOWN); checkmem(ret == 0); free(yyvsp[-2].tv_str); - } - break; - - case 117: + ; + break;} +case 116: #line 1182 "asn1p_y.y" - { +{ int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); @@ -2834,24 +2322,22 @@ yyparse (YYPARSE_PARAM_ARG) ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_lowercase); checkmem(ret == 0); free(yyvsp[-2].tv_str); - } - break; - - case 118: + ; + break;} +case 117: #line 1192 "asn1p_y.y" - { +{ int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_CAPITALS); free(yyvsp[0].tv_str); checkmem(ret == 0); - } - break; - - case 119: + ; + break;} +case 118: #line 1200 "asn1p_y.y" - { +{ int ret; yyval.a_ref = yyvsp[0].a_ref; ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[-2].tv_str, RLT_CAPITALS); @@ -2869,114 +2355,101 @@ yyparse (YYPARSE_PARAM_ARG) * (yyval.a_ref->comp_count - 1)); yyval.a_ref->components[0] = tmp_comp; } - } - break; - - case 120: + ; + break;} +case 119: #line 1222 "asn1p_y.y" - { +{ int ret; yyval.a_ref = asn1p_ref_new(yylineno); checkmem(yyval.a_ref); ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].a_refcomp.name, yyvsp[0].a_refcomp.lex_type); free(yyvsp[0].a_refcomp.name); checkmem(ret == 0); - } - break; - - case 121: + ; + break;} +case 120: #line 1230 "asn1p_y.y" - { +{ int ret; yyval.a_ref = yyvsp[-2].a_ref; ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].a_refcomp.name, yyvsp[0].a_refcomp.lex_type); free(yyvsp[0].a_refcomp.name); checkmem(ret == 0); - } - break; - - case 124: + ; + break;} +case 123: #line 1244 "asn1p_y.y" - { +{ yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; - } - break; - - case 125: + ; + break;} +case 124: #line 1249 "asn1p_y.y" - { +{ yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; - } - break; - - case 126: + ; + break;} +case 125: #line 1262 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->value = yyvsp[0].a_value; - } - break; - - case 127: + ; + break;} +case 126: #line 1272 "asn1p_y.y" - { asn1p_lexer_hack_push_opaque_state(); } - break; - - case 128: +{ asn1p_lexer_hack_push_opaque_state(); ; + break;} +case 127: #line 1273 "asn1p_y.y" - { +{ yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); yyval.a_value->type = ATV_UNPARSED; - } - break; - - case 129: + ; + break;} +case 128: #line 1278 "asn1p_y.y" - { +{ yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); - } - break; - - case 130: + ; + break;} +case 129: #line 1282 "asn1p_y.y" - { +{ yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); - } - break; - - case 131: + ; + break;} +case 130: #line 1286 "asn1p_y.y" - { +{ yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); - } - break; - - case 132: + ; + break;} +case 131: #line 1290 "asn1p_y.y" - { +{ yyval.a_value = yyvsp[0].a_value; - } - break; - - case 133: + ; + break;} +case 132: #line 1293 "asn1p_y.y" - { +{ yyval.a_value = yyvsp[0].a_value; - } - break; - - case 134: + ; + break;} +case 133: #line 1299 "asn1p_y.y" - { +{ asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -2986,12 +2459,11 @@ yyparse (YYPARSE_PARAM_ARG) yyval.a_value = asn1p_value_fromref(ref, 0); checkmem(yyval.a_value); free(yyvsp[0].tv_str); - } - break; - - case 135: + ; + break;} +case 134: #line 1310 "asn1p_y.y" - { +{ asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -3004,12 +2476,11 @@ yyparse (YYPARSE_PARAM_ARG) checkmem(yyval.a_value); free(yyvsp[-2].tv_str); free(yyvsp[0].tv_str); - } - break; - - case 136: + ; + break;} +case 135: #line 1327 "asn1p_y.y" - { +{ yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 2; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); checkmem(yyval.tv_opaque.buf); @@ -3018,12 +2489,11 @@ yyparse (YYPARSE_PARAM_ARG) memcpy(yyval.tv_opaque.buf + 2, yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len); yyval.tv_opaque.buf[yyval.tv_opaque.len] = '\0'; free(yyvsp[0].tv_opaque.buf); - } - break; - - case 137: + ; + break;} +case 136: #line 1337 "asn1p_y.y" - { +{ int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); checkmem(p); @@ -3034,97 +2504,80 @@ yyparse (YYPARSE_PARAM_ARG) free(yyvsp[0].tv_opaque.buf); yyval.tv_opaque.buf = p; yyval.tv_opaque.len = newsize; - } - break; - - case 138: + ; + break;} +case 137: #line 1352 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_BOOLEAN; } - break; - - case 139: +{ yyval.a_type = ASN_BASIC_BOOLEAN; ; + break;} +case 138: #line 1353 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_NULL; } - break; - - case 140: +{ yyval.a_type = ASN_BASIC_NULL; ; + break;} +case 139: #line 1354 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_REAL; } - break; - - case 141: +{ yyval.a_type = ASN_BASIC_REAL; ; + break;} +case 140: #line 1355 "asn1p_y.y" - { yyval.a_type = yyvsp[0].a_type; } - break; - - case 142: +{ yyval.a_type = yyvsp[0].a_type; ; + break;} +case 141: #line 1356 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_OCTET_STRING; } - break; - - case 143: +{ yyval.a_type = ASN_BASIC_OCTET_STRING; ; + break;} +case 142: #line 1357 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; } - break; - - case 144: +{ yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; + break;} +case 143: #line 1358 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_RELATIVE_OID; } - break; - - case 145: +{ yyval.a_type = ASN_BASIC_RELATIVE_OID; ; + break;} +case 144: #line 1359 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_EXTERNAL; } - break; - - case 146: +{ yyval.a_type = ASN_BASIC_EXTERNAL; ; + break;} +case 145: #line 1360 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; } - break; - - case 147: +{ yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; + break;} +case 146: #line 1361 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_CHARACTER_STRING; } - break; - - case 148: +{ yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; + break;} +case 147: #line 1362 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_UTCTime; } - break; - - case 149: +{ yyval.a_type = ASN_BASIC_UTCTime; ; + break;} +case 148: #line 1363 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_GeneralizedTime; } - break; - - case 150: +{ yyval.a_type = ASN_BASIC_GeneralizedTime; ; + break;} +case 149: #line 1370 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_INTEGER; } - break; - - case 151: +{ yyval.a_type = ASN_BASIC_INTEGER; ; + break;} +case 150: #line 1371 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_ENUMERATED; } - break; - - case 152: +{ yyval.a_type = ASN_BASIC_ENUMERATED; ; + break;} +case 151: #line 1372 "asn1p_y.y" - { yyval.a_type = ASN_BASIC_BIT_STRING; } - break; - - case 153: +{ yyval.a_type = ASN_BASIC_BIT_STRING; ; + break;} +case 152: #line 1376 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = yyvsp[0].a_type; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 154: + ; + break;} +case 153: #line 1382 "asn1p_y.y" - { +{ if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; } else { @@ -3133,264 +2586,230 @@ yyparse (YYPARSE_PARAM_ARG) } yyval.a_expr->expr_type = yyvsp[-1].a_type; yyval.a_expr->meta_type = AMT_TYPE; - } - break; - - case 155: + ; + break;} +case 154: #line 1395 "asn1p_y.y" - { yyval.a_type = ASN_STRING_BMPString; } - break; - - case 156: +{ yyval.a_type = ASN_STRING_BMPString; ; + break;} +case 155: #line 1396 "asn1p_y.y" - { +{ yyval.a_type = ASN_STRING_GeneralString; fprintf(stderr, "WARNING: GeneralString is not fully supported"); - } - break; - - case 157: + ; + break;} +case 156: #line 1400 "asn1p_y.y" - { +{ yyval.a_type = ASN_STRING_GraphicString; fprintf(stderr, "WARNING: GraphicString is not fully supported"); - } - break; - - case 158: + ; + break;} +case 157: #line 1404 "asn1p_y.y" - { yyval.a_type = ASN_STRING_IA5String; } - break; - - case 159: +{ yyval.a_type = ASN_STRING_IA5String; ; + break;} +case 158: #line 1405 "asn1p_y.y" - { yyval.a_type = ASN_STRING_ISO646String; } - break; - - case 160: +{ yyval.a_type = ASN_STRING_ISO646String; ; + break;} +case 159: #line 1406 "asn1p_y.y" - { yyval.a_type = ASN_STRING_NumericString; } - break; - - case 161: +{ yyval.a_type = ASN_STRING_NumericString; ; + break;} +case 160: #line 1407 "asn1p_y.y" - { yyval.a_type = ASN_STRING_PrintableString; } - break; - - case 162: +{ yyval.a_type = ASN_STRING_PrintableString; ; + break;} +case 161: #line 1408 "asn1p_y.y" - { +{ yyval.a_type = ASN_STRING_T61String; fprintf(stderr, "WARNING: T61String is not fully supported"); - } - break; - - case 163: + ; + break;} +case 162: #line 1412 "asn1p_y.y" - { yyval.a_type = ASN_STRING_TeletexString; } - break; - - case 164: +{ yyval.a_type = ASN_STRING_TeletexString; ; + break;} +case 163: #line 1413 "asn1p_y.y" - { yyval.a_type = ASN_STRING_UniversalString; } - break; - - case 165: +{ yyval.a_type = ASN_STRING_UniversalString; ; + break;} +case 164: #line 1414 "asn1p_y.y" - { yyval.a_type = ASN_STRING_UTF8String; } - break; - - case 166: +{ yyval.a_type = ASN_STRING_UTF8String; ; + break;} +case 165: #line 1415 "asn1p_y.y" - { +{ yyval.a_type = ASN_STRING_VideotexString; fprintf(stderr, "WARNING: VideotexString is not fully supported"); - } - break; - - case 167: + ; + break;} +case 166: #line 1419 "asn1p_y.y" - { yyval.a_type = ASN_STRING_VisibleString; } - break; - - case 168: +{ yyval.a_type = ASN_STRING_VisibleString; ; + break;} +case 167: #line 1420 "asn1p_y.y" - { yyval.a_type = ASN_STRING_ObjectDescriptor; } - break; - - case 174: +{ yyval.a_type = ASN_STRING_ObjectDescriptor; ; + break;} +case 173: #line 1432 "asn1p_y.y" - { yyval.a_constr = 0; } - break; - - case 175: +{ yyval.a_constr = 0; ; + break;} +case 174: #line 1433 "asn1p_y.y" - { +{ yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 176: + ; + break;} +case 175: #line 1439 "asn1p_y.y" - { +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); - } - break; - - case 177: + ; + break;} +case 176: #line 1442 "asn1p_y.y" - { +{ /* * This is a special case, for compatibility purposes. * It goes without parentheses. */ CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_SIZE, yyvsp[-1].a_constr, 0); - } - break; - - case 178: + ; + break;} +case 177: #line 1452 "asn1p_y.y" - { +{ yyval.a_constr = yyvsp[-1].a_constr; - } - break; - - case 179: + ; + break;} +case 178: #line 1455 "asn1p_y.y" - { +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); - } - break; - - case 180: + ; + break;} +case 179: #line 1461 "asn1p_y.y" - { +{ yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 181: + ; + break;} +case 180: #line 1464 "asn1p_y.y" - { +{ asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); ct->type = ACT_EL_EXT; CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); - } - break; - - case 182: + ; + break;} +case 181: #line 1470 "asn1p_y.y" - { +{ asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); ct->type = ACT_EL_EXT; CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-4].a_constr, ct); ct = yyval.a_constr; CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, ct, yyvsp[0].a_constr); - } - break; - - case 183: + ; + break;} +case 182: #line 1481 "asn1p_y.y" - { +{ yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 184: + ; + break;} +case 183: #line 1484 "asn1p_y.y" - { +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); - } - break; - - case 185: + ; + break;} +case 184: #line 1487 "asn1p_y.y" - { +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); - } - break; - - case 186: + ; + break;} +case 185: #line 1490 "asn1p_y.y" - { +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); - } - break; - - case 187: + ; + break;} +case 186: #line 1496 "asn1p_y.y" - { +{ int ret; yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-3].a_ctype; ret = asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr); checkmem(ret == 0); - } - break; - - case 188: + ; + break;} +case 187: #line 1504 "asn1p_y.y" - { +{ int ret; yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_CA_SET; ret = asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr); checkmem(ret == 0); - } - break; - - case 189: + ; + break;} +case 188: #line 1512 "asn1p_y.y" - { +{ yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_VALUE; yyval.a_constr->value = yyvsp[0].a_value; - } - break; - - case 190: + ; + break;} +case 189: #line 1518 "asn1p_y.y" - { +{ yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-1].a_ctype; yyval.a_constr->range_start = yyvsp[-2].a_value; yyval.a_constr->range_stop = yyvsp[0].a_value; - } - break; - - case 191: + ; + break;} +case 190: #line 1525 "asn1p_y.y" - { +{ yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-1].a_ctype; yyval.a_constr->range_start = asn1p_value_fromint(-123); yyval.a_constr->range_stop = yyvsp[0].a_value; yyval.a_constr->range_start->type = ATV_MIN; - } - break; - - case 192: + ; + break;} +case 191: #line 1533 "asn1p_y.y" - { +{ yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-1].a_ctype; yyval.a_constr->range_start = yyvsp[-2].a_value; yyval.a_constr->range_stop = asn1p_value_fromint(321); yyval.a_constr->range_stop->type = ATV_MAX; - } - break; - - case 193: + ; + break;} +case 192: #line 1541 "asn1p_y.y" - { +{ yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = yyvsp[-1].a_ctype; @@ -3398,67 +2817,57 @@ yyparse (YYPARSE_PARAM_ARG) yyval.a_constr->range_stop = asn1p_value_fromint(321); yyval.a_constr->range_start->type = ATV_MIN; yyval.a_constr->range_stop->type = ATV_MAX; - } - break; - - case 194: + ; + break;} +case 193: #line 1550 "asn1p_y.y" - { +{ yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 195: + ; + break;} +case 194: #line 1553 "asn1p_y.y" - { +{ yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 196: + ; + break;} +case 195: #line 1559 "asn1p_y.y" - { yyval.a_ctype = ACT_EL_RANGE; } - break; - - case 197: +{ yyval.a_ctype = ACT_EL_RANGE; ; + break;} +case 196: #line 1560 "asn1p_y.y" - { yyval.a_ctype = ACT_EL_RLRANGE; } - break; - - case 198: +{ yyval.a_ctype = ACT_EL_RLRANGE; ; + break;} +case 197: #line 1561 "asn1p_y.y" - { yyval.a_ctype = ACT_EL_LLRANGE; } - break; - - case 199: +{ yyval.a_ctype = ACT_EL_LLRANGE; ; + break;} +case 198: #line 1562 "asn1p_y.y" - { yyval.a_ctype = ACT_EL_ULRANGE; } - break; - - case 200: +{ yyval.a_ctype = ACT_EL_ULRANGE; ; + break;} +case 199: #line 1566 "asn1p_y.y" - { +{ yyval.a_ctype = ACT_CT_SIZE; - } - break; - - case 201: + ; + break;} +case 200: #line 1569 "asn1p_y.y" - { +{ yyval.a_ctype = ACT_CT_FROM; - } - break; - - case 202: + ; + break;} +case 201: #line 1575 "asn1p_y.y" - { +{ yyval.a_value = yyvsp[0].a_value; - } - break; - - case 203: + ; + break;} +case 202: #line 1578 "asn1p_y.y" - { +{ asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); @@ -3468,124 +2877,108 @@ yyparse (YYPARSE_PARAM_ARG) yyval.a_value = asn1p_value_fromref(ref, 0); checkmem(yyval.a_value); free(yyvsp[0].tv_str); - } - break; - - case 204: + ; + break;} +case 203: #line 1589 "asn1p_y.y" - { +{ yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); - } - break; - - case 205: + ; + break;} +case 204: #line 1594 "asn1p_y.y" - { +{ yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_FALSE; - } - break; - - case 206: + ; + break;} +case 205: #line 1599 "asn1p_y.y" - { +{ yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); yyval.a_value->type = ATV_TRUE; - } - break; - - case 207: + ; + break;} +case 206: #line 1607 "asn1p_y.y" - { +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); - } - break; - - case 208: + ; + break;} +case 207: #line 1613 "asn1p_y.y" - { +{ yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 209: + ; + break;} +case 208: #line 1616 "asn1p_y.y" - { +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); - } - break; - - case 210: + ; + break;} +case 209: #line 1622 "asn1p_y.y" - { +{ yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_EXT; - } - break; - - case 211: + ; + break;} +case 210: #line 1627 "asn1p_y.y" - { +{ yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_VALUE; yyval.a_constr->value = asn1p_value_frombuf(yyvsp[-2].tv_str, strlen(yyvsp[-2].tv_str), 0); yyval.a_constr->presence = yyvsp[0].a_pres; - } - break; - - case 212: + ; + break;} +case 211: #line 1640 "asn1p_y.y" - { yyval.a_pres = ACPRES_DEFAULT; } - break; - - case 213: +{ yyval.a_pres = ACPRES_DEFAULT; ; + break;} +case 212: #line 1641 "asn1p_y.y" - { yyval.a_pres = yyvsp[0].a_pres; } - break; - - case 214: +{ yyval.a_pres = yyvsp[0].a_pres; ; + break;} +case 213: #line 1645 "asn1p_y.y" - { +{ yyval.a_pres = ACPRES_PRESENT; - } - break; - - case 215: + ; + break;} +case 214: #line 1648 "asn1p_y.y" - { +{ yyval.a_pres = ACPRES_ABSENT; - } - break; - - case 216: + ; + break;} +case 215: #line 1651 "asn1p_y.y" - { +{ yyval.a_pres = ACPRES_OPTIONAL; - } - break; - - case 217: + ; + break;} +case 216: #line 1657 "asn1p_y.y" - { +{ yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 218: + ; + break;} +case 217: #line 1660 "asn1p_y.y" - { +{ yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 219: + ; + break;} +case 218: #line 1669 "asn1p_y.y" - { +{ asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; int ret; @@ -3596,41 +2989,37 @@ yyparse (YYPARSE_PARAM_ARG) ct->type = ACT_EL_VALUE; ct->value = asn1p_value_fromref(ref, 0); CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, ct, 0); - } - break; - - case 220: + ; + break;} +case 219: #line 1684 "asn1p_y.y" - { +{ CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); - } - break; - - case 221: + ; + break;} +case 220: #line 1690 "asn1p_y.y" - { +{ yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_VALUE; yyval.a_constr->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); - } - break; - - case 222: + ; + break;} +case 221: #line 1696 "asn1p_y.y" - { +{ asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); checkmem(ct); ct->type = ACT_EL_VALUE; ct->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); - } - break; - - case 223: + ; + break;} +case 222: #line 1710 "asn1p_y.y" - { +{ char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; *p = '@'; @@ -3640,12 +3029,11 @@ yyparse (YYPARSE_PARAM_ARG) checkmem(ret == 0); free(p); free(yyvsp[0].tv_str); - } - break; - - case 224: + ; + break;} +case 223: #line 1721 "asn1p_y.y" - { +{ char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; p[0] = '@'; @@ -3656,19 +3044,17 @@ yyparse (YYPARSE_PARAM_ARG) checkmem(ret == 0); free(p); free(yyvsp[0].tv_str); - } - break; - - case 225: + ; + break;} +case 224: #line 1737 "asn1p_y.y" - { +{ yyval.tv_str = yyvsp[0].tv_str; - } - break; - - case 226: + ; + break;} +case 225: #line 1740 "asn1p_y.y" - { +{ int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); yyval.tv_str = malloc(l1 + 1 + l3 + 1); @@ -3676,468 +3062,436 @@ yyparse (YYPARSE_PARAM_ARG) yyval.tv_str[l1] = '.'; memcpy(yyval.tv_str + l1 + 1, yyvsp[0].tv_str, l3); yyval.tv_str[l1 + 1 + l3] = '\0'; - } - break; - - case 227: + ; + break;} +case 226: #line 1758 "asn1p_y.y" - { yyval.a_marker = EM_NOMARK; } - break; - - case 228: +{ yyval.a_marker = EM_NOMARK; ; + break;} +case 227: #line 1759 "asn1p_y.y" - { yyval.a_marker = yyvsp[0].a_marker; } - break; - - case 229: +{ yyval.a_marker = yyvsp[0].a_marker; ; + break;} +case 228: #line 1763 "asn1p_y.y" - { +{ yyval.a_marker = EM_OPTIONAL; - } - break; - - case 230: + ; + break;} +case 229: #line 1766 "asn1p_y.y" - { +{ yyval.a_marker = EM_DEFAULT; /* FIXME: store DefaultValue somewhere */ - } - break; - - case 231: + ; + break;} +case 230: #line 1773 "asn1p_y.y" - { - } - break; - - case 232: +{ + ; + break;} +case 231: #line 1775 "asn1p_y.y" - { - } - break; - - case 233: +{ + ; + break;} +case 232: #line 1777 "asn1p_y.y" - { asn1p_lexer_hack_push_opaque_state(); } - break; - - case 234: +{ asn1p_lexer_hack_push_opaque_state(); ; + break;} +case 233: #line 1777 "asn1p_y.y" - { - } - break; - - case 235: +{ + ; + break;} +case 234: #line 1798 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); - } - break; - - case 236: + ; + break;} +case 235: #line 1802 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-1].a_expr; - } - break; - - case 237: + ; + break;} +case 236: #line 1808 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); - TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 238: + asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); + ; + break;} +case 237: #line 1813 "asn1p_y.y" - { +{ yyval.a_expr = yyvsp[-2].a_expr; - TQ_ADD(&(yyval.a_expr->members), yyvsp[0].a_expr, next); - } - break; - - case 239: + asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); + ; + break;} +case 238: #line 1820 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->Identifier = yyvsp[0].tv_str; - } - break; - - case 240: + ; + break;} +case 239: #line 1827 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->value = yyvsp[-1].a_value; - } - break; - - case 241: + ; + break;} +case 240: #line 1835 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->value = yyvsp[-1].a_value; - } - break; - - case 242: + ; + break;} +case 241: #line 1843 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; yyval.a_expr->value = yyvsp[0].a_value; - } - break; - - case 243: + ; + break;} +case 242: #line 1850 "asn1p_y.y" - { +{ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); checkmem(yyval.a_expr->Identifier); yyval.a_expr->expr_type = A1TC_EXTENSIBLE; yyval.a_expr->meta_type = AMT_VALUE; - } - break; - - case 244: + ; + break;} +case 243: #line 1861 "asn1p_y.y" - { +{ yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); - } - break; - - case 245: + ; + break;} +case 244: #line 1865 "asn1p_y.y" - { +{ yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); - } - break; - - case 246: + ; + break;} +case 245: #line 1896 "asn1p_y.y" - { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); } - break; - - case 247: +{ memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; + break;} +case 246: #line 1897 "asn1p_y.y" - { yyval.a_tag = yyvsp[0].a_tag; } - break; - - case 248: +{ yyval.a_tag = yyvsp[0].a_tag; ; + break;} +case 247: #line 1901 "asn1p_y.y" - { +{ yyval.a_tag = yyvsp[0].a_tag; yyval.a_tag.tag_mode = TM_DEFAULT; - } - break; - - case 249: + ; + break;} +case 248: #line 1905 "asn1p_y.y" - { +{ yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_IMPLICIT; - } - break; - - case 250: + ; + break;} +case 249: #line 1909 "asn1p_y.y" - { +{ yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_EXPLICIT; - } - break; - - case 251: + ; + break;} +case 250: #line 1916 "asn1p_y.y" - { +{ checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - } - break; - - case 252: + ; + break;} +case 251: #line 1920 "asn1p_y.y" - { +{ checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - } - break; - - case 253: + ; + break;} +case 252: #line 1928 "asn1p_y.y" - { +{ checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - } - break; - - case 254: + ; + break;} +case 253: #line 1935 "asn1p_y.y" - { +{ checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; - } - break; - - case 255: + ; + break;} +case 254: #line 1942 "asn1p_y.y" - { +{ memset(&yyval.tv_nametag, 0, sizeof(yyval.tv_nametag)); yyval.tv_nametag.name = yyvsp[0].tv_str; - } - break; - - case 256: + ; + break;} +case 255: #line 1946 "asn1p_y.y" - { +{ yyval.tv_nametag.name = yyvsp[-1].tv_str; yyval.tv_nametag.tag = yyvsp[0].a_tag; - } - break; - - - } - -/* Line 1016 of /usr/local/share/bison/yacc.c. */ -#line 3923 "asn1p_y.c" + ; + break;} +} + /* the action file gets copied in in place of this dollarsign */ +#line 543 "/usr/share/bison.simple" yyvsp -= yylen; yyssp -= yylen; +#ifdef YYLSP_NEEDED + yylsp -= yylen; +#endif - -#if YYDEBUG +#if YYDEBUG != 0 if (yydebug) { - short *yyssp1 = yyss - 1; - YYFPRINTF (stderr, "state stack now"); - while (yyssp1 != yyssp) - YYFPRINTF (stderr, " %d", *++yyssp1); - YYFPRINTF (stderr, "\n"); + short *ssp1 = yyss - 1; + fprintf (stderr, "state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); } #endif *++yyvsp = yyval; +#ifdef YYLSP_NEEDED + yylsp++; + if (yylen == 0) + { + yylsp->first_line = yylloc.first_line; + yylsp->first_column = yylloc.first_column; + yylsp->last_line = (yylsp-1)->last_line; + yylsp->last_column = (yylsp-1)->last_column; + yylsp->text = 0; + } + else + { + yylsp->last_line = (yylsp+yylen-1)->last_line; + yylsp->last_column = (yylsp+yylen-1)->last_column; + } +#endif - /* Now `shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ + /* Now "shift" the result of the reduction. + Determine what state that goes to, + based on the state we popped back to + and the rule number reduced by. */ yyn = yyr1[yyn]; - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yypgoto[yyn - YYNTBASE] + *yyssp; + if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else - yystate = yydefgoto[yyn - YYNTOKENS]; + yystate = yydefgoto[yyn - YYNTBASE]; goto yynewstate; +yyerrlab: /* here on detecting error */ -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ -yyerrlab: - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) + if (! yyerrstatus) + /* If not already recovering from an error, report this error. */ { ++yynerrs; -#if YYERROR_VERBOSE + +#ifdef YYERROR_VERBOSE yyn = yypact[yystate]; - if (YYPACT_NINF < yyn && yyn < YYLAST) + if (yyn > YYFLAG && yyn < YYLAST) { - YYSIZE_T yysize = 0; - int yytype = YYTRANSLATE (yychar); - char *yymsg; - int yyx, yycount; - - yycount = 0; - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ - for (yyx = yyn < 0 ? -yyn : 0; - yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - yysize += yystrlen (yytname[yyx]) + 15, yycount++; - yysize += yystrlen ("parse error, unexpected ") + 1; - yysize += yystrlen (yytname[yytype]); - yymsg = (char *) YYSTACK_ALLOC (yysize); - if (yymsg != 0) + int size = 0; + char *msg; + int x, count; + + count = 0; + /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ + for (x = (yyn < 0 ? -yyn : 0); + x < (ssize_t)(sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + size += strlen(yytname[x]) + 15, count++; + msg = (char *) malloc(size + 15); + if (msg != 0) { - char *yyp = yystpcpy (yymsg, "parse error, unexpected "); - yyp = yystpcpy (yyp, yytname[yytype]); + strcpy(msg, "parse error"); - if (yycount < 5) + if (count < 5) { - yycount = 0; - for (yyx = yyn < 0 ? -yyn : 0; - yyx < (int) (sizeof (yytname) / sizeof (char *)); - yyx++) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + count = 0; + for (x = (yyn < 0 ? -yyn : 0); + x < (ssize_t)(sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) { - const char *yyq = ! yycount ? ", expecting " : " or "; - yyp = yystpcpy (yyp, yyq); - yyp = yystpcpy (yyp, yytname[yyx]); - yycount++; + strcat(msg, count == 0 ? ", expecting `" : " or `"); + strcat(msg, yytname[x]); + strcat(msg, "'"); + count++; } } - yyerror (yymsg); - YYSTACK_FREE (yymsg); + yyerror(msg); + free(msg); } else - yyerror ("parse error; also virtual memory exhausted"); + yyerror ("parse error; also virtual memory exceeded"); } else #endif /* YYERROR_VERBOSE */ - yyerror ("parse error"); + yyerror("parse error"); } - goto yyerrlab1; + goto yyerrlab1; +yyerrlab1: /* here on error raised explicitly by an action */ -/*----------------------------------------------------. -| yyerrlab1 -- error raised explicitly by an action. | -`----------------------------------------------------*/ -yyerrlab1: if (yyerrstatus == 3) { - /* If just tried and failed to reuse lookahead token after an - error, discard it. */ + /* if just tried and failed to reuse lookahead token after an error, discard it. */ - /* Return failure if at end of input. */ + /* return failure if at end of input */ if (yychar == YYEOF) - { - /* Pop the error token. */ - YYPOPSTACK; - /* Pop the rest of the stack. */ - while (yyssp > yyss) - { - YYDPRINTF ((stderr, "Error: popping ")); - YYDSYMPRINT ((stderr, - yystos[*yyssp], - *yyvsp)); - YYDPRINTF ((stderr, "\n")); - yydestruct (yystos[*yyssp], *yyvsp); - YYPOPSTACK; - } - YYABORT; - } + YYABORT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); +#endif - YYDPRINTF ((stderr, "Discarding token %d (%s).\n", - yychar, yytname[yychar1])); - yydestruct (yychar1, yylval); yychar = YYEMPTY; } - /* Else will try to reuse lookahead token after shifting the error - token. */ + /* Else will try to reuse lookahead token + after shifting the error token. */ - yyerrstatus = 3; /* Each real token shifted decrements this. */ + yyerrstatus = 3; /* Each real token shifted decrements this */ - for (;;) - { - yyn = yypact[yystate]; - if (yyn != YYPACT_NINF) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } + goto yyerrhandle; - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) - YYABORT; +yyerrdefault: /* current state does not do anything special for the error token. */ - YYDPRINTF ((stderr, "Error: popping ")); - YYDSYMPRINT ((stderr, - yystos[*yyssp], *yyvsp)); - YYDPRINTF ((stderr, "\n")); +#if 0 + /* This is wrong; only states that explicitly want error tokens + should shift them. */ + yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ + if (yyn) goto yydefault; +#endif - yydestruct (yystos[yystate], *yyvsp); - yyvsp--; - yystate = *--yyssp; +yyerrpop: /* pop the current state because it cannot handle the error token */ + if (yyssp == yyss) YYABORT; + yyvsp--; + yystate = *--yyssp; +#ifdef YYLSP_NEEDED + yylsp--; +#endif -#if YYDEBUG - if (yydebug) - { - short *yyssp1 = yyss - 1; - YYFPRINTF (stderr, "Error: state stack now"); - while (yyssp1 != yyssp) - YYFPRINTF (stderr, " %d", *++yyssp1); - YYFPRINTF (stderr, "\n"); - } +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "Error: state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } #endif + +yyerrhandle: + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yyerrdefault; + + yyn += YYTERROR; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) + goto yyerrdefault; + + yyn = yytable[yyn]; + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrpop; + yyn = -yyn; + goto yyreduce; } + else if (yyn == 0) + goto yyerrpop; if (yyn == YYFINAL) YYACCEPT; - YYDPRINTF ((stderr, "Shifting error token, ")); +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting error token, "); +#endif *++yyvsp = yylval; - +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif yystate = yyn; goto yynewstate; - -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; - -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; - -#ifndef yyoverflow -/*----------------------------------------------. -| yyoverflowlab -- parser overflow comes here. | -`----------------------------------------------*/ -yyoverflowlab: - yyerror ("parser stack overflow"); - yyresult = 2; - /* Fall through. */ + yyacceptlab: + /* YYACCEPT comes here. */ + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); #endif + } + return 0; -yyreturn: -#ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); + yyabortlab: + /* YYABORT comes here. */ + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); #endif - return yyresult; + } + return 1; } - - #line 1953 "asn1p_y.y" @@ -4248,4 +3602,3 @@ yyerror(const char *msg) { } - diff --git a/libasn1parser/asn1p_y.h b/libasn1parser/asn1p_y.h index 6d3ff5e71..375b845fd 100644 --- a/libasn1parser/asn1p_y.h +++ b/libasn1parser/asn1p_y.h @@ -1,243 +1,3 @@ -/* A Bison parser, made from asn1p_y.y, by GNU bison 1.75. */ - -/* Skeleton parser for Yacc-like parsing with Bison, - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -#ifndef BISON_ASN_P_Y_H -# define BISON_ASN_P_Y_H - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - TOK_PPEQ = 258, - TOK_opaque = 259, - TOK_bstring = 260, - TOK_cstring = 261, - TOK_hstring = 262, - TOK_identifier = 263, - TOK_number = 264, - TOK_number_negative = 265, - TOK_typereference = 266, - TOK_capitalreference = 267, - TOK_typefieldreference = 268, - TOK_valuefieldreference = 269, - TOK_ABSENT = 270, - TOK_ABSTRACT_SYNTAX = 271, - TOK_ALL = 272, - TOK_ANY = 273, - TOK_APPLICATION = 274, - TOK_AUTOMATIC = 275, - TOK_BEGIN = 276, - TOK_BIT = 277, - TOK_BMPString = 278, - TOK_BOOLEAN = 279, - TOK_BY = 280, - TOK_CHARACTER = 281, - TOK_CHOICE = 282, - TOK_CLASS = 283, - TOK_COMPONENT = 284, - TOK_COMPONENTS = 285, - TOK_CONSTRAINED = 286, - TOK_CONTAINING = 287, - TOK_DEFAULT = 288, - TOK_DEFINITIONS = 289, - TOK_DEFINED = 290, - TOK_EMBEDDED = 291, - TOK_ENCODED = 292, - TOK_ENCODING_CONTROL = 293, - TOK_END = 294, - TOK_ENUMERATED = 295, - TOK_EXPLICIT = 296, - TOK_EXPORTS = 297, - TOK_EXTENSIBILITY = 298, - TOK_EXTERNAL = 299, - TOK_FALSE = 300, - TOK_FROM = 301, - TOK_GeneralizedTime = 302, - TOK_GeneralString = 303, - TOK_GraphicString = 304, - TOK_IA5String = 305, - TOK_IDENTIFIER = 306, - TOK_IMPLICIT = 307, - TOK_IMPLIED = 308, - TOK_IMPORTS = 309, - TOK_INCLUDES = 310, - TOK_INSTANCE = 311, - TOK_INSTRUCTIONS = 312, - TOK_INTEGER = 313, - TOK_ISO646String = 314, - TOK_MAX = 315, - TOK_MIN = 316, - TOK_MINUS_INFINITY = 317, - TOK_NULL = 318, - TOK_NumericString = 319, - TOK_OBJECT = 320, - TOK_ObjectDescriptor = 321, - TOK_OCTET = 322, - TOK_OF = 323, - TOK_OPTIONAL = 324, - TOK_PATTERN = 325, - TOK_PDV = 326, - TOK_PLUS_INFINITY = 327, - TOK_PRESENT = 328, - TOK_PrintableString = 329, - TOK_PRIVATE = 330, - TOK_REAL = 331, - TOK_RELATIVE_OID = 332, - TOK_SEQUENCE = 333, - TOK_SET = 334, - TOK_SIZE = 335, - TOK_STRING = 336, - TOK_SYNTAX = 337, - TOK_T61String = 338, - TOK_TAGS = 339, - TOK_TeletexString = 340, - TOK_TRUE = 341, - TOK_TYPE_IDENTIFIER = 342, - TOK_UNIQUE = 343, - TOK_UNIVERSAL = 344, - TOK_UniversalString = 345, - TOK_UTCTime = 346, - TOK_UTF8String = 347, - TOK_VideotexString = 348, - TOK_VisibleString = 349, - TOK_WITH = 350, - TOK_EXCEPT = 351, - TOK_INTERSECTION = 352, - TOK_UNION = 353, - TOK_TwoDots = 354, - TOK_ThreeDots = 355, - TOK_tag = 356 - }; -#endif -#define TOK_PPEQ 258 -#define TOK_opaque 259 -#define TOK_bstring 260 -#define TOK_cstring 261 -#define TOK_hstring 262 -#define TOK_identifier 263 -#define TOK_number 264 -#define TOK_number_negative 265 -#define TOK_typereference 266 -#define TOK_capitalreference 267 -#define TOK_typefieldreference 268 -#define TOK_valuefieldreference 269 -#define TOK_ABSENT 270 -#define TOK_ABSTRACT_SYNTAX 271 -#define TOK_ALL 272 -#define TOK_ANY 273 -#define TOK_APPLICATION 274 -#define TOK_AUTOMATIC 275 -#define TOK_BEGIN 276 -#define TOK_BIT 277 -#define TOK_BMPString 278 -#define TOK_BOOLEAN 279 -#define TOK_BY 280 -#define TOK_CHARACTER 281 -#define TOK_CHOICE 282 -#define TOK_CLASS 283 -#define TOK_COMPONENT 284 -#define TOK_COMPONENTS 285 -#define TOK_CONSTRAINED 286 -#define TOK_CONTAINING 287 -#define TOK_DEFAULT 288 -#define TOK_DEFINITIONS 289 -#define TOK_DEFINED 290 -#define TOK_EMBEDDED 291 -#define TOK_ENCODED 292 -#define TOK_ENCODING_CONTROL 293 -#define TOK_END 294 -#define TOK_ENUMERATED 295 -#define TOK_EXPLICIT 296 -#define TOK_EXPORTS 297 -#define TOK_EXTENSIBILITY 298 -#define TOK_EXTERNAL 299 -#define TOK_FALSE 300 -#define TOK_FROM 301 -#define TOK_GeneralizedTime 302 -#define TOK_GeneralString 303 -#define TOK_GraphicString 304 -#define TOK_IA5String 305 -#define TOK_IDENTIFIER 306 -#define TOK_IMPLICIT 307 -#define TOK_IMPLIED 308 -#define TOK_IMPORTS 309 -#define TOK_INCLUDES 310 -#define TOK_INSTANCE 311 -#define TOK_INSTRUCTIONS 312 -#define TOK_INTEGER 313 -#define TOK_ISO646String 314 -#define TOK_MAX 315 -#define TOK_MIN 316 -#define TOK_MINUS_INFINITY 317 -#define TOK_NULL 318 -#define TOK_NumericString 319 -#define TOK_OBJECT 320 -#define TOK_ObjectDescriptor 321 -#define TOK_OCTET 322 -#define TOK_OF 323 -#define TOK_OPTIONAL 324 -#define TOK_PATTERN 325 -#define TOK_PDV 326 -#define TOK_PLUS_INFINITY 327 -#define TOK_PRESENT 328 -#define TOK_PrintableString 329 -#define TOK_PRIVATE 330 -#define TOK_REAL 331 -#define TOK_RELATIVE_OID 332 -#define TOK_SEQUENCE 333 -#define TOK_SET 334 -#define TOK_SIZE 335 -#define TOK_STRING 336 -#define TOK_SYNTAX 337 -#define TOK_T61String 338 -#define TOK_TAGS 339 -#define TOK_TeletexString 340 -#define TOK_TRUE 341 -#define TOK_TYPE_IDENTIFIER 342 -#define TOK_UNIQUE 343 -#define TOK_UNIVERSAL 344 -#define TOK_UniversalString 345 -#define TOK_UTCTime 346 -#define TOK_UTF8String 347 -#define TOK_VideotexString 348 -#define TOK_VisibleString 349 -#define TOK_WITH 350 -#define TOK_EXCEPT 351 -#define TOK_INTERSECTION 352 -#define TOK_UNION 353 -#define TOK_TwoDots 354 -#define TOK_ThreeDots 355 -#define TOK_tag 356 - - - - -#ifndef YYSTYPE -#line 58 "asn1p_y.y" typedef union { asn1p_t *a_grammar; asn1p_module_flags_e a_module_flags; @@ -269,14 +29,106 @@ typedef union { char *name; struct asn1p_type_tag_s tag; } tv_nametag; -} yystype; -/* Line 1281 of /usr/local/share/bison/yacc.c. */ -#line 275 "y.tab.h" -# define YYSTYPE yystype -#endif +} YYSTYPE; +#define TOK_PPEQ 257 +#define TOK_opaque 258 +#define TOK_bstring 259 +#define TOK_cstring 260 +#define TOK_hstring 261 +#define TOK_identifier 262 +#define TOK_number 263 +#define TOK_number_negative 264 +#define TOK_typereference 265 +#define TOK_capitalreference 266 +#define TOK_typefieldreference 267 +#define TOK_valuefieldreference 268 +#define TOK_ABSENT 269 +#define TOK_ABSTRACT_SYNTAX 270 +#define TOK_ALL 271 +#define TOK_ANY 272 +#define TOK_APPLICATION 273 +#define TOK_AUTOMATIC 274 +#define TOK_BEGIN 275 +#define TOK_BIT 276 +#define TOK_BMPString 277 +#define TOK_BOOLEAN 278 +#define TOK_BY 279 +#define TOK_CHARACTER 280 +#define TOK_CHOICE 281 +#define TOK_CLASS 282 +#define TOK_COMPONENT 283 +#define TOK_COMPONENTS 284 +#define TOK_CONSTRAINED 285 +#define TOK_CONTAINING 286 +#define TOK_DEFAULT 287 +#define TOK_DEFINITIONS 288 +#define TOK_DEFINED 289 +#define TOK_EMBEDDED 290 +#define TOK_ENCODED 291 +#define TOK_ENCODING_CONTROL 292 +#define TOK_END 293 +#define TOK_ENUMERATED 294 +#define TOK_EXPLICIT 295 +#define TOK_EXPORTS 296 +#define TOK_EXTENSIBILITY 297 +#define TOK_EXTERNAL 298 +#define TOK_FALSE 299 +#define TOK_FROM 300 +#define TOK_GeneralizedTime 301 +#define TOK_GeneralString 302 +#define TOK_GraphicString 303 +#define TOK_IA5String 304 +#define TOK_IDENTIFIER 305 +#define TOK_IMPLICIT 306 +#define TOK_IMPLIED 307 +#define TOK_IMPORTS 308 +#define TOK_INCLUDES 309 +#define TOK_INSTANCE 310 +#define TOK_INSTRUCTIONS 311 +#define TOK_INTEGER 312 +#define TOK_ISO646String 313 +#define TOK_MAX 314 +#define TOK_MIN 315 +#define TOK_MINUS_INFINITY 316 +#define TOK_NULL 317 +#define TOK_NumericString 318 +#define TOK_OBJECT 319 +#define TOK_ObjectDescriptor 320 +#define TOK_OCTET 321 +#define TOK_OF 322 +#define TOK_OPTIONAL 323 +#define TOK_PATTERN 324 +#define TOK_PDV 325 +#define TOK_PLUS_INFINITY 326 +#define TOK_PRESENT 327 +#define TOK_PrintableString 328 +#define TOK_PRIVATE 329 +#define TOK_REAL 330 +#define TOK_RELATIVE_OID 331 +#define TOK_SEQUENCE 332 +#define TOK_SET 333 +#define TOK_SIZE 334 +#define TOK_STRING 335 +#define TOK_SYNTAX 336 +#define TOK_T61String 337 +#define TOK_TAGS 338 +#define TOK_TeletexString 339 +#define TOK_TRUE 340 +#define TOK_TYPE_IDENTIFIER 341 +#define TOK_UNIQUE 342 +#define TOK_UNIVERSAL 343 +#define TOK_UniversalString 344 +#define TOK_UTCTime 345 +#define TOK_UTF8String 346 +#define TOK_VideotexString 347 +#define TOK_VisibleString 348 +#define TOK_WITH 349 +#define TOK_EXCEPT 350 +#define TOK_INTERSECTION 351 +#define TOK_UNION 352 +#define TOK_TwoDots 353 +#define TOK_ThreeDots 354 +#define TOK_tag 355 -extern YYSTYPE asn1p_lval; - - -#endif /* not BISON_ASN_P_Y_H */ +extern YYSTYPE asn1p_lval; diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index 71fa0fa3f..04912fe19 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -23,9 +23,9 @@ extern int asn1p_lineno; static asn1p_value_t * _convert_bitstring2binary(char *str, int base); -#define checkmem(ptr) do { \ - if(!(ptr)) \ - return yyerror("Memory failure"); \ +#define checkmem(ptr) do { \ + if(!(ptr)) \ + return yyerror("Memory failure"); \ } while(0) #define CONSTRAINT_INSERT(root, constr_type, arg1, arg2) do { \ @@ -818,11 +818,11 @@ ActualParameterList: ActualParameter { $$ = asn1p_expr_new(yylineno); checkmem($$); - TQ_ADD(&($$->members), $1, next); + asn1p_expr_add($$, $1); } | ActualParameterList ',' ActualParameter { $$ = $1; - TQ_ADD(&($$->members), $3, next); + asn1p_expr_add($$, $3); } ; @@ -846,11 +846,11 @@ ComponentTypeLists: ComponentType { $$ = asn1p_expr_new(yylineno); checkmem($$); - TQ_ADD(&($$->members), $1, next); + asn1p_expr_add($$, $1); } | ComponentTypeLists ',' ComponentType { $$ = $1; - TQ_ADD(&($$->members), $3, next); + asn1p_expr_add($$, $3); } ; @@ -867,7 +867,7 @@ ComponentType: checkmem($$); $$->meta_type = $3->meta_type; $$->expr_type = A1TC_COMPONENTS_OF; - TQ_ADD(&($$->members), $3, next); + asn1p_expr_add($$, $3); } | ExtensionAndException { $$ = $1; @@ -878,11 +878,11 @@ AlternativeTypeLists: AlternativeType { $$ = asn1p_expr_new(yylineno); checkmem($$); - TQ_ADD(&($$->members), $1, next); + asn1p_expr_add($$, $1); } | AlternativeTypeLists ',' AlternativeType { $$ = $1; - TQ_ADD(&($$->members), $3, next); + asn1p_expr_add($$, $3); } ; @@ -919,11 +919,11 @@ ClassFieldList: checkmem($$); $$->expr_type = A1TC_CLASSDEF; $$->meta_type = AMT_OBJECT; - TQ_ADD(&($$->members), $1, next); + asn1p_expr_add($$, $1); } | ClassFieldList ',' ClassField { $$ = $1; - TQ_ADD(&($$->members), $3, next); + asn1p_expr_add($$, $3); } ; @@ -1085,7 +1085,7 @@ TypeDeclaration: $$->constraints = $2; $$->expr_type = ASN_CONSTR_SEQUENCE_OF; $$->meta_type = AMT_TYPE; - TQ_ADD(&($$->members), $4, next); + asn1p_expr_add($$, $4); } | TOK_SET optConstraints TOK_OF TypeDeclaration { $$ = asn1p_expr_new(yylineno); @@ -1093,7 +1093,7 @@ TypeDeclaration: $$->constraints = $2; $$->expr_type = ASN_CONSTR_SET_OF; $$->meta_type = AMT_TYPE; - TQ_ADD(&($$->members), $4, next); + asn1p_expr_add($$, $4); } | TOK_ANY { $$ = asn1p_expr_new(yylineno); @@ -1808,11 +1808,11 @@ UniverationList: UniverationElement { $$ = asn1p_expr_new(yylineno); checkmem($$); - TQ_ADD(&($$->members), $1, next); + asn1p_expr_add($$, $1); } | UniverationList ',' UniverationElement { $$ = $1; - TQ_ADD(&($$->members), $3, next); + asn1p_expr_add($$, $3); } ; From 9cb7877081ada5f4dfe265ae43a7606f6821e390 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 8 Sep 2004 00:28:47 +0000 Subject: [PATCH 0292/1469] removed assert state git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@292 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_out.c | 3 --- libasn1compiler/asn1c_out.h | 12 ++---------- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/libasn1compiler/asn1c_out.c b/libasn1compiler/asn1c_out.c index fb4187115..ebf2fb142 100644 --- a/libasn1compiler/asn1c_out.c +++ b/libasn1compiler/asn1c_out.c @@ -18,9 +18,6 @@ asn1c_compiled_output(arg_t *arg, const char *fmt, ...) { switch(arg->target->target) { case OT_IGNORE: return 0; - case OT_ASSERT: - assert(arg->target->target != OT_ASSERT); - return -1; default: dst = &arg->target->destination[arg->target->target]; break; diff --git a/libasn1compiler/asn1c_out.h b/libasn1compiler/asn1c_out.h index 7e2abfd8f..4c3fc415e 100644 --- a/libasn1compiler/asn1c_out.h +++ b/libasn1compiler/asn1c_out.h @@ -13,8 +13,7 @@ typedef struct out_chunk { typedef struct compiler_streams { enum { - OT_IGNORE = -1, - OT_ASSERT = 0, + OT_IGNORE, /* Ignore this output */ OT_INCLUDES, /* #include files */ OT_DEPS, /* Dependencies (other than #includes) */ OT_TYPE_DECLS, /* Type declarations */ @@ -33,7 +32,7 @@ typedef struct compiler_streams { } compiler_streams_t; static char *_compiler_stream2str[] __attribute__ ((unused)) - = { "ASSERT", "INCLUDES", "DEPS", "TYPE-DECLS", "FUNC-DECLS", "CTABLES", "CODE", "STAT-DEFS" }; + = { "IGNORE", "INCLUDES", "DEPS", "TYPE-DECLS", "FUNC-DECLS", "CTABLES", "CODE", "STAT-DEFS" }; int asn1c_compiled_output(arg_t *arg, const char *fmt, ...); @@ -53,13 +52,6 @@ int asn1c_compiled_output(arg_t *arg, const char *fmt, ...); INDENT(-1); \ } while(0) -#define FLAT(code) do { \ - int _il = INDENT_LEVEL; \ - INDENT_LEVEL = 0; \ - do { code; } while(0); \ - INDENT_LEVEL = _il; \ - } while(0) - #define EMBED(ev) do { \ int saved_target = arg->target->target; \ REDIR(OT_TYPE_DECLS); \ From fb41dbbd8ceeac23b8f6c95297c49b735d9db86c Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 8 Sep 2004 00:28:57 +0000 Subject: [PATCH 0293/1469] better handling of recursive definitions git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@293 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 48 ++++++++++++++++++------------------ libasn1compiler/asn1c_misc.c | 21 ++++++++++++---- 2 files changed, 40 insertions(+), 29 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index a9aa23b37..81ae97160 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1145,32 +1145,32 @@ emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int *tags_impl_skip, int choice p = MKID(expr->Identifier); OUT("static ber_tlv_tag_t asn1_DEF_%s_tags[] = {\n", p); - INDENTED( - if(expr->tag.tag_class) { + INDENT(+1); + if(expr->tag.tag_class) { + tags_count++; + _print_tag(arg, expr, &expr->tag); + if(expr->tag.tag_mode != TM_EXPLICIT) + (*tags_impl_skip)++; + } else { + if(!choice_mode) + (*tags_impl_skip)++; + } + if(!choice_mode) { + if(!expr->tag.tag_class + || (expr->meta_type == AMT_TYPE + && expr->tag.tag_mode == TM_EXPLICIT)) { + struct asn1p_type_tag_s tag; + if(expr->tag.tag_class) + OUT(",\n"); + tag.tag_class = TC_UNIVERSAL; + tag.tag_mode = TM_IMPLICIT; + tag.tag_value = expr_type2uclass_value[expr->expr_type]; + _print_tag(arg, expr, &tag); tags_count++; - _print_tag(arg, expr, &expr->tag); - if(expr->tag.tag_mode != TM_EXPLICIT) - (*tags_impl_skip)++; - } else { - if(!choice_mode) - (*tags_impl_skip)++; } - if(!choice_mode) { - if(!expr->tag.tag_class - || (expr->meta_type == AMT_TYPE - && expr->tag.tag_mode == TM_EXPLICIT)) { - struct asn1p_type_tag_s tag; - if(expr->tag.tag_class) - OUT(",\n"); - tag.tag_class = TC_UNIVERSAL; - tag.tag_mode = TM_IMPLICIT; - tag.tag_value = expr_type2uclass_value[expr->expr_type]; - _print_tag(arg, expr, &tag); - tags_count++; - } - } - OUT("\n"); - ); + } + OUT("\n"); + INDENT(-1); OUT("};\n"); return tags_count; diff --git a/libasn1compiler/asn1c_misc.c b/libasn1compiler/asn1c_misc.c index 14a3649e1..2bdbd7c85 100644 --- a/libasn1compiler/asn1c_misc.c +++ b/libasn1compiler/asn1c_misc.c @@ -85,8 +85,14 @@ asn1c_make_identifier(int unsafe_only_spaces, char *arg1, ...) { char * asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { + asn1p_expr_t *top_parent; char *typename; + /* Rewind to the topmost parent expression */ + if((top_parent = expr->parent_expr)) + while(top_parent->parent_expr) + top_parent = top_parent->parent_expr; + switch(expr->expr_type) { case A1TC_REFERENCE: typename = expr->reference->components[ @@ -104,7 +110,9 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { tmp.mod = tmp.expr->module; return asn1c_type_name(&tmp, tmp.expr, _format); - } else if(_format == TNF_RSAFE) { + } + + if(_format == TNF_RSAFE || _format == TNF_CTYPE) { /* * The recursion-safe format is requested. * The problem here is that only constructed types @@ -115,10 +123,13 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { asn1p_expr_t *terminal; terminal = asn1f_find_terminal_type_ex( arg->asn, arg->mod, arg->expr); - if(terminal - && (terminal->expr_type - & (ASN_BASIC_MASK | ASN_STRING_MASK))) - _format = TNF_CTYPE; + if(terminal) { + if(terminal->expr_type + & (ASN_BASIC_MASK | ASN_STRING_MASK)) + _format = TNF_CTYPE; + if(terminal == top_parent) + _format = TNF_RSAFE; + } } break; #if 0 From 8c80dc5811bc56f642531bf1e5b1d811d7e9564e Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 8 Sep 2004 02:49:06 +0000 Subject: [PATCH 0294/1469] date changed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@294 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 2c00deaf8..377b8e1bd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9.3: 2004-Sep-03 +0.9.3: 2004-Sep-07 * Extended constraints support in parametrized types. * Better support for parametrization and constraints handling. From 89d219bcdb90eccc32a74796a37a452165f03673 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 8 Sep 2004 03:01:06 +0000 Subject: [PATCH 0295/1469] Free -> Open git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@295 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-usage.lyx | 4 ++-- doc/asn1c-usage.pdf | Bin 69290 -> 66940 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/asn1c-usage.lyx b/doc/asn1c-usage.lyx index 8cd9e30aa..ad3d12173 100644 --- a/doc/asn1c-usage.lyx +++ b/doc/asn1c-usage.lyx @@ -37,7 +37,7 @@ \layout Title -Using the Free ASN.1 Compiler +Using the Open ASN.1 Compiler \layout Author Lev Walkin < @@ -2590,7 +2590,7 @@ free_struct \layout Bibliography \bibitem [ASN1C]{ASN1C} -Free ASN.1 Compiler. +The OpenSource ASN.1 Compiler. \begin_inset LatexCommand \htmlurl{http://lionet.info/asn1/} diff --git a/doc/asn1c-usage.pdf b/doc/asn1c-usage.pdf index 0a3313f4057475eb7e93484a8abb47ffc1b85f55..105671c0216367e43af31211b69903a3bb6a25b0 100644 GIT binary patch delta 36403 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 delta 38665 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 From 03eb4e1c8a9480f3f21554e3b0e3b154df620053 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 8 Sep 2004 03:10:54 +0000 Subject: [PATCH 0296/1469] recompiled git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@296 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-usage.html | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/doc/asn1c-usage.html b/doc/asn1c-usage.html index d7b22b0f3..589e4273a 100644 --- a/doc/asn1c-usage.html +++ b/doc/asn1c-usage.html @@ -6,8 +6,8 @@ Jens Lippmann, Marek Rouchal, Martin Wilck and others --> -Using the Free ASN.1 Compiler - +Using the Open ASN.1 Compiler + @@ -21,7 +21,7 @@

    -

    Using the Free ASN.1 Compiler

    +

    Using the Open ASN.1 Compiler

    Lev Walkin <vlm@lionet.info>

    @@ -705,6 +705,14 @@

    Language Options Description +-fall-defs-global +Normally the compiler hides the definitions (asn1_DEF_xxx) of the +inner structure elements (members of SEQUENCE, SET and other types). +This option makes all such definitions global. Enabling this option +may pollute the namespace by making lots of asn1_DEF_xxx structures +globally visible, but will allow you to manipulate (encode and decode) +the individual members of any complex ASN.1 structure. + -fbless-SIZE Allow SIZE() constraint for INTEGER, ENUMERATED, and other types for which this constraint is normally prohibited by the standard. @@ -1198,7 +1206,7 @@

    <

    Bibliography

    ASN1C -
    Free ASN.1 Compiler. http://lionet.info/asn1/ +
    The OpenSource ASN.1 Compiler. http://lionet.info/asn1/

    Dub00
    Olivier Dubuisson - ASN.1 Communication between heterogeneous systems - Morgan Kaufmann Publishers, 2000. http://asn1.elibel.tm.fr/en/book/. @@ -1262,7 +1270,7 @@



    Lev Walkin -2004-08-23 +2004-09-07
    From 8fbd56297cba545747130528584c28f828b07911 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 10 Sep 2004 06:07:04 +0000 Subject: [PATCH 0297/1469] extended tags support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@297 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_constr.c | 8 +-- libasn1fix/asn1fix_tags.c | 109 ++++++++++++++++++++++++++---------- libasn1fix/asn1fix_tags.h | 25 ++++++++- 3 files changed, 106 insertions(+), 36 deletions(-) diff --git a/libasn1fix/asn1fix_constr.c b/libasn1fix/asn1fix_constr.c index 4a3b99bcc..7a45cd97e 100644 --- a/libasn1fix/asn1fix_constr.c +++ b/libasn1fix/asn1fix_constr.c @@ -1,6 +1,6 @@ #include "asn1fix_internal.h" -#define AFT_IMAGINARY_ANY 1 /* _fetch_tag() flag */ +#define AFT_MAGIC_ANY 1 /* _fetch_tag() flag */ static int _asn1f_check_if_tag_must_be_explicit(arg_t *arg, asn1p_expr_t *v); static int _asn1f_compare_tags(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b); @@ -375,7 +375,7 @@ _asn1f_check_if_tag_must_be_explicit(arg_t *arg, asn1p_expr_t *v) { */ save_tag = v->tag; /* Save existing tag */ memset(&v->tag, 0, sizeof(v->tag)); /* Remove it temporarily */ - ret = asn1f_fetch_tag(arg->asn, arg->mod, v, &tag, 0); + ret = asn1f_fetch_outmost_tag(arg->asn, arg->mod, v, &tag, 0); v->tag = save_tag; /* Restore the tag back */ if(ret == 0) return 0; /* If found tag, it's okay */ @@ -403,8 +403,8 @@ _asn1f_compare_tags(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b) { int ra, rb; int ret; - ra = asn1f_fetch_tag(arg->asn, arg->mod, a, &ta, AFT_IMAGINARY_ANY); - rb = asn1f_fetch_tag(arg->asn, arg->mod, b, &tb, AFT_IMAGINARY_ANY); + ra = asn1f_fetch_outmost_tag(arg->asn, arg->mod, a, &ta, AFT_MAGIC_ANY); + rb = asn1f_fetch_outmost_tag(arg->asn, arg->mod, b, &tb, AFT_MAGIC_ANY); /* * If both tags are explicitly or implicitly given, use them. diff --git a/libasn1fix/asn1fix_tags.c b/libasn1fix/asn1fix_tags.c index 22ba422c8..20066e6d4 100644 --- a/libasn1fix/asn1fix_tags.c +++ b/libasn1fix/asn1fix_tags.c @@ -1,53 +1,100 @@ #include "asn1fix_internal.h" -int -asn1f_fetch_tag(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag, int flags) { - int ret; +#define ADD_TAG(skip, newtag) do { \ + void *__p; \ + if(skip) { skip--; break; } \ + __p = realloc((*tags), \ + sizeof(struct asn1p_type_tag_s) * (count + 1)); \ + if(!__p) return -1; \ + *tags = __p; \ + (*tags)[count++] = newtag; \ + if((flags & AFT_FETCH_OUTMOST)) return count; \ + if(newtag.tag_mode == TM_IMPLICIT) skip++; \ +} while(0) - if(expr->tag.tag_class != TC_NOCLASS) { - *tag = expr->tag; - return 0; - } +static int +asn1f_fetch_tags_impl(arg_t *arg, struct asn1p_type_tag_s **tags, int count, int skip, enum asn1f_aft_flags_e flags) { + asn1p_expr_t *expr = arg->expr; + + /* If this type is tagged, add this tag first */ + if(expr->tag.tag_class != TC_NOCLASS) + ADD_TAG(skip, expr->tag); + /* REMOVE ME */ if(expr->expr_type == A1TC_EXTENSIBLE) { - memset(tag, 0, sizeof(*tag)); - tag->tag_class = -1; - return 0; + struct asn1p_type_tag_s tt; + memset(&tt, 0, sizeof(tt)); + tt.tag_class = -1; + ADD_TAG(skip, tt); + return count; } if(expr->meta_type == AMT_TYPE) { - memset(tag, 0, sizeof(*tag)); - tag->tag_class = TC_UNIVERSAL; - tag->tag_value = expr_type2uclass_value[expr->expr_type]; - if(flags && expr->expr_type == ASN_TYPE_ANY) { - assert(tag->tag_value == 0); - tag->tag_value = -1; - return 0; + struct asn1p_type_tag_s tt; + memset(&tt, 0, sizeof(tt)); + tt.tag_class = TC_UNIVERSAL; + tt.tag_value = expr_type2uclass_value[expr->expr_type]; + if(tt.tag_value == 0) { + if(expr->expr_type == ASN_TYPE_ANY + && (flags & AFT_IMAGINARY_ANY)) + tt.tag_value = -1; + else + return -1; } - return (tag->tag_value == 0) ? -1 : 0; + ADD_TAG(skip, tt); + return count; } if(expr->meta_type == AMT_TYPEREF) { - arg_t arg; - - memset(&arg, 0, sizeof(arg)); - arg.asn = asn; - arg.mod = mod; - arg.expr = expr; - - expr = asn1f_lookup_symbol(&arg, expr->module, expr->reference); + expr = asn1f_lookup_symbol(arg, expr->module, expr->reference); if(expr == NULL) return -1; - if(expr->_mark & TM_RECURSION) return -1; - + arg->expr = expr; expr->_mark |= TM_RECURSION; - ret = asn1f_fetch_tag(asn, expr->module, expr, tag, - flags); + count = asn1f_fetch_tags_impl(arg, tags, count, skip, flags); expr->_mark &= ~TM_RECURSION; - return ret; + return count; } return -1; } + +int +asn1f_fetch_outmost_tag(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag, int _aft_imaginary_any) { + struct asn1p_type_tag_s *tags; + enum asn1f_aft_flags_e flags; + int count; + + flags = AFT_FETCH_OUTMOST; + flags |= AFT_IMAGINARY_ANY * _aft_imaginary_any; + + count = asn1f_fetch_tags(asn, mod, expr, &tags, flags); + if(count <= 0) return count; + + *tag = tags[0]; + free(tags); + + return 0; +} + +int +asn1f_fetch_tags(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, struct asn1p_type_tag_s **tags_r, enum asn1f_aft_flags_e flags) { + arg_t arg; + struct asn1p_type_tag_s *tags = 0; + int count; + + memset(&arg, 0, sizeof(arg)); + arg.asn = asn; + arg.mod = mod; + arg.expr = expr; + + count = asn1f_fetch_tags_impl(&arg, &tags, 0, 0, flags); + if(count <= 0 && tags) { + free(tags); + tags = 0; + } + *tags_r = tags; + return count; +} diff --git a/libasn1fix/asn1fix_tags.h b/libasn1fix/asn1fix_tags.h index 429e56d7f..8dd622b70 100644 --- a/libasn1fix/asn1fix_tags.h +++ b/libasn1fix/asn1fix_tags.h @@ -1,6 +1,29 @@ #ifndef _ASN1FIX_TAGS_H_ #define _ASN1FIX_TAGS_H_ -int asn1f_fetch_tag(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag, int special_ANY_handling); +enum asn1f_aft_flags_e { + AFT_IMAGINARY_ANY = 0x01, /* Treat ANY tag as [IMAGINARY ANY] */ + AFT_FETCH_OUTMOST = 0x02, /* Fetch only outmost tag */ +}; + + +/* + * Allocate and return an array of tags for the given type. + * Type1 ::= [2] EXPLICIT Type2 + * Type2 ::= [3] IMPLICIT Type3 + * Type3 ::= [4] EXPLICIT SEQUENCE { ... } + * Will return [2][3][UNIVERSAL 16] for the Type1. + */ +int asn1f_fetch_tags(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, + struct asn1p_type_tag_s **tags, enum asn1f_aft_flags_e flags); + +/* + * Fetch the outmost tag of the given type. + * Type1 ::= Type2 + * Type2 ::= [2] Type3 + * Type3 ::= SEQUENCE { ... } + * Will yield [2] for Type1. + */ +int asn1f_fetch_outmost_tag(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag, int _aft_imaginary_any); #endif /* _ASN1FIX_TAGS_H_ */ From a8a86ccb62ec8d3b211a056c3d3da803d790c45a Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 10 Sep 2004 06:07:18 +0000 Subject: [PATCH 0298/1469] new tags api git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@298 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 81ae97160..4d9390cb2 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -24,7 +24,7 @@ static int asn1c_lang_C_type_SEQUENCE_def(arg_t *arg); static int asn1c_lang_C_type_SET_def(arg_t *arg); static int asn1c_lang_C_type_CHOICE_def(arg_t *arg); static int asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of); -static int _print_tag(arg_t *arg, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag_p); +static int _print_tag(arg_t *arg, struct asn1p_type_tag_s *tag_p); static int check_if_extensible(asn1p_expr_t *expr); static int expr_elements_count(arg_t *arg, asn1p_expr_t *expr); static int emit_member_table(arg_t *arg, asn1p_expr_t *expr); @@ -903,20 +903,10 @@ static int check_if_extensible(asn1p_expr_t *expr) { } static int -_print_tag(arg_t *arg, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag_p) { - struct asn1p_type_tag_s tag; - - if(tag_p) { - tag = *tag_p; - } else { - if(asn1f_fetch_tag(arg->asn, arg->mod, expr, &tag, 0)) { - OUT("-1 /* Ambiguous tag (CHOICE|ANY?) */"); - return 0; - } - } +_print_tag(arg_t *arg, struct asn1p_type_tag_s *tag) { OUT("("); - switch(tag.tag_class) { + switch(tag->tag_class) { case TC_UNIVERSAL: OUT("ASN_TAG_CLASS_UNIVERSAL"); break; case TC_APPLICATION: OUT("ASN_TAG_CLASS_APPLICATION"); break; case TC_CONTEXT_SPECIFIC: OUT("ASN_TAG_CLASS_CONTEXT"); break; @@ -924,7 +914,7 @@ _print_tag(arg_t *arg, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag_p) { case TC_NOCLASS: break; } - OUT(" | (%lld << 2))", tag.tag_value); + OUT(" | (%lld << 2))", tag->tag_value); return 0; } @@ -1030,7 +1020,7 @@ _add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no) { assert(el_no >= 0); - ret = asn1f_fetch_tag(arg->asn, arg->mod, arg->expr, &tag, 1); + ret = asn1f_fetch_outmost_tag(arg->asn, arg->mod, arg->expr, &tag, 1); if(ret == 0) { tag2el_t *te; int new_count = (*count) + 1; @@ -1106,7 +1096,7 @@ emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count) { int i; for(i = 0; i < tag2el_count; i++) { OUT(" { "); - _print_tag(arg, expr, &tag2el[i].el_tag); + _print_tag(arg, &tag2el[i].el_tag); OUT(", "); OUT("%d, ", tag2el[i].el_no); OUT("%d, ", tag2el[i].toff_first); @@ -1148,7 +1138,7 @@ emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int *tags_impl_skip, int choice INDENT(+1); if(expr->tag.tag_class) { tags_count++; - _print_tag(arg, expr, &expr->tag); + _print_tag(arg, &expr->tag); if(expr->tag.tag_mode != TM_EXPLICIT) (*tags_impl_skip)++; } else { @@ -1165,7 +1155,7 @@ emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int *tags_impl_skip, int choice tag.tag_class = TC_UNIVERSAL; tag.tag_mode = TM_IMPLICIT; tag.tag_value = expr_type2uclass_value[expr->expr_type]; - _print_tag(arg, expr, &tag); + _print_tag(arg, &tag); tags_count++; } } @@ -1201,6 +1191,7 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { static int global_memb_unique; int save_target; arg_t tmp_arg; + struct asn1p_type_tag_s outmost_tag; char *p; OUT("{ "); @@ -1228,7 +1219,12 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { } INDENT(+1); if(C99_MODE) OUT(".tag = "); - _print_tag(arg, expr , NULL); + if(asn1f_fetch_outmost_tag(arg->asn, + expr->module, expr, &outmost_tag, 0)) { + OUT("-1 /* Ambiguous tag (CHOICE|ANY?) */"); + } else { + _print_tag(arg, &outmost_tag); + } OUT(",\n"); if(C99_MODE) OUT(".tag_mode = "); if(expr->tag.tag_class) { From 25e1293f13117874331b27472731db56bfda44ca Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 10 Sep 2004 06:07:39 +0000 Subject: [PATCH 0299/1469] new tests for constraint processing logic git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@299 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/50-constraint-OK.asn1 | 3 + ...50-constraint-OK.asn1.-EFprint-constraints | Bin 5029 -> 5266 bytes tests/50-constraint-OK.asn1.-P | 171 ++++++++++++++++-- 3 files changed, 154 insertions(+), 20 deletions(-) diff --git a/tests/50-constraint-OK.asn1 b/tests/50-constraint-OK.asn1 index 210c69dec..83f083f23 100644 --- a/tests/50-constraint-OK.asn1 +++ b/tests/50-constraint-OK.asn1 @@ -16,6 +16,7 @@ BEGIN Int3 ::= Int2 (MIN..ten) -- Means (0..10) Int4 ::= Int3 (5..MAX,...,1..4) -- Means (5..10,...,1..4) Int5 ::= Int4 (MIN..5) -- Means (5) + -- Int6 ::= INTEGER (Int5) -- -- Not yet supported ten Int1 ::= other-ten other-ten Int2 ::= 10 @@ -28,6 +29,8 @@ BEGIN -- Means (SIZE(0..20 | 25..30)) Str3 ::= Str2 (SIZE(10..27))(FROM("ABC"|"def")) -- (SIZE(10..20,25..27))(FROM("ABCdef")) + Str4 ::= IA5String ("ABCD"|SIZE(4)) + -- Not PER-visible PER-Visible ::= IA5String (FROM("A".."F")) PER-Visible-2 ::= PER-Visible (FROM("E".."F")) -- Means (FROM("EF")) diff --git a/tests/50-constraint-OK.asn1.-EFprint-constraints b/tests/50-constraint-OK.asn1.-EFprint-constraints index 812ff1ba976610a41afc1c3db216bab49e743df7..fbe9ad3038ced579c42debd8a4c89183a679b965 100644 GIT binary patch delta 100 zcmZ3gK1p*!K8H$hNs)BqB&WBS%x1? iaPmP8Sr(Ay$pKs{lcm_XCZA)IXN2*%H|KMhaRUH(QW}~7 delta 12 TcmbQFxm0~aKF8)5PBU%*9>> ***/ + +#include + +/*** <<< TYPE-DECLS [Str4] >>> ***/ + + +typedef IA5String_t Str4_t; + +/*** <<< FUNC-DECLS [Str4] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Str4; +asn_constr_check_f Str4_constraint; +ber_type_decoder_f Str4_decode_ber; +der_type_encoder_f Str4_encode_der; +asn_struct_print_f Str4_print; +asn_struct_free_f Str4_free; + +/*** <<< CTABLES [Str4] >>> ***/ + +static int check_permitted_alphabet_3(const void *sptr) { + /* The underlying type is IA5String */ + const IA5String_t *st = sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!(cv <= 127)) return -1; + } + return 0; +} + + +/*** <<< CODE [Str4] >>> ***/ + +int +Str4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + const IA5String_t *st = sptr; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(!check_permitted_alphabet_3(sptr)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using IA5String, + * so adjust the DEF appropriately. + */ +static void +Str4_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_IA5String.ber_decoder; + td->der_encoder = asn1_DEF_IA5String.der_encoder; + td->free_struct = asn1_DEF_IA5String.free_struct; + td->print_struct = asn1_DEF_IA5String.print_struct; + td->last_tag_form = asn1_DEF_IA5String.last_tag_form; + td->elements = asn1_DEF_IA5String.elements; + td->elements_count = asn1_DEF_IA5String.elements_count; + td->specifics = asn1_DEF_IA5String.specifics; +} + +ber_dec_rval_t +Str4_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + Str4_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, + bufptr, size, tag_mode); +} + +der_enc_rval_t +Str4_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Str4_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +Str4_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Str4_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +Str4_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Str4_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [Str4] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_Str4_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_Str4 = { + "Str4", + Str4_constraint, + Str4_decode_ber, + Str4_encode_der, + Str4_print, + Str4_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Str4_tags, + sizeof(asn1_DEF_Str4_tags) + /sizeof(asn1_DEF_Str4_tags[0]), /* 1 */ + 1, /* Tags to skip */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + /*** <<< INCLUDES [PER-Visible] >>> ***/ #include @@ -1104,7 +1235,7 @@ asn_struct_free_f PER_Visible_free; /*** <<< CTABLES [PER-Visible] >>> ***/ -static int check_permitted_alphabet_3(const void *sptr) { +static int check_permitted_alphabet_4(const void *sptr) { /* The underlying type is IA5String */ const IA5String_t *st = sptr; const uint8_t *ch = st->buf; @@ -1134,7 +1265,7 @@ PER_Visible_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } - if(!check_permitted_alphabet_3(sptr)) { + if(!check_permitted_alphabet_4(sptr)) { /* Constraint check succeeded */ return 0; } else { @@ -1235,7 +1366,7 @@ asn_struct_free_f PER_Visible_2_free; /*** <<< CTABLES [PER-Visible-2] >>> ***/ -static int check_permitted_alphabet_4(const void *sptr) { +static int check_permitted_alphabet_5(const void *sptr) { /* The underlying type is IA5String */ const IA5String_t *st = sptr; const uint8_t *ch = st->buf; @@ -1265,7 +1396,7 @@ PER_Visible_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } - if(!check_permitted_alphabet_4(sptr)) { + if(!check_permitted_alphabet_5(sptr)) { /* Constraint check succeeded */ return 0; } else { @@ -1366,7 +1497,7 @@ asn_struct_free_f Not_PER_Visible_1_free; /*** <<< CTABLES [Not-PER-Visible-1] >>> ***/ -static int check_permitted_alphabet_5(const void *sptr) { +static int check_permitted_alphabet_6(const void *sptr) { /* The underlying type is IA5String */ const IA5String_t *st = sptr; const uint8_t *ch = st->buf; @@ -1396,7 +1527,7 @@ Not_PER_Visible_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } - if(!check_permitted_alphabet_5(sptr)) { + if(!check_permitted_alphabet_6(sptr)) { /* Constraint check succeeded */ return 0; } else { @@ -1497,7 +1628,7 @@ asn_struct_free_f Not_PER_Visible_2_free; /*** <<< CTABLES [Not-PER-Visible-2] >>> ***/ -static int check_permitted_alphabet_6(const void *sptr) { +static int check_permitted_alphabet_7(const void *sptr) { /* The underlying type is IA5String */ const IA5String_t *st = sptr; const uint8_t *ch = st->buf; @@ -1527,7 +1658,7 @@ Not_PER_Visible_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } - if(!check_permitted_alphabet_6(sptr)) { + if(!check_permitted_alphabet_7(sptr)) { /* Constraint check succeeded */ return 0; } else { @@ -1628,7 +1759,7 @@ asn_struct_free_f Not_PER_Visible_3_free; /*** <<< CTABLES [Not-PER-Visible-3] >>> ***/ -static int check_permitted_alphabet_7(const void *sptr) { +static int check_permitted_alphabet_8(const void *sptr) { /* The underlying type is IA5String */ const IA5String_t *st = sptr; const uint8_t *ch = st->buf; @@ -1658,7 +1789,7 @@ Not_PER_Visible_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } - if(!check_permitted_alphabet_7(sptr)) { + if(!check_permitted_alphabet_8(sptr)) { /* Constraint check succeeded */ return 0; } else { @@ -1759,7 +1890,7 @@ asn_struct_free_f SIZE_but_not_FROM_free; /*** <<< CTABLES [SIZE-but-not-FROM] >>> ***/ -static int check_permitted_alphabet_8(const void *sptr) { +static int check_permitted_alphabet_9(const void *sptr) { /* The underlying type is IA5String */ const IA5String_t *st = sptr; const uint8_t *ch = st->buf; @@ -1792,7 +1923,7 @@ SIZE_but_not_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, size = st->size; if((size >= 1 && size <= 4) - && !check_permitted_alphabet_8(sptr)) { + && !check_permitted_alphabet_9(sptr)) { /* Constraint check succeeded */ return 0; } else { @@ -1893,7 +2024,7 @@ asn_struct_free_f SIZE_and_FROM_free; /*** <<< CTABLES [SIZE-and-FROM] >>> ***/ -static int check_permitted_alphabet_9(const void *sptr) { +static int check_permitted_alphabet_10(const void *sptr) { /* The underlying type is IA5String */ const IA5String_t *st = sptr; const uint8_t *ch = st->buf; @@ -1926,7 +2057,7 @@ SIZE_and_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, size = st->size; if((size >= 1 && size <= 4) - && !check_permitted_alphabet_9(sptr)) { + && !check_permitted_alphabet_10(sptr)) { /* Constraint check succeeded */ return 0; } else { @@ -2027,7 +2158,7 @@ asn_struct_free_f Neither_SIZE_nor_FROM_free; /*** <<< CTABLES [Neither-SIZE-nor-FROM] >>> ***/ -static int check_permitted_alphabet_10(const void *sptr) { +static int check_permitted_alphabet_11(const void *sptr) { /* The underlying type is IA5String */ const IA5String_t *st = sptr; const uint8_t *ch = st->buf; @@ -2057,7 +2188,7 @@ Neither_SIZE_nor_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } - if(!check_permitted_alphabet_10(sptr)) { + if(!check_permitted_alphabet_11(sptr)) { /* Constraint check succeeded */ return 0; } else { @@ -2158,7 +2289,7 @@ asn_struct_free_f Utf8_3_free; /*** <<< CTABLES [Utf8-3] >>> ***/ -static int permitted_alphabet_table_11[128] = { +static int permitted_alphabet_table_12[128] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ @@ -2169,8 +2300,8 @@ static int permitted_alphabet_table_11[128] = { 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, /* pqrstuvwxyz */ }; -static int check_permitted_alphabet_11(const void *sptr) { - int *table = permitted_alphabet_table_11; +static int check_permitted_alphabet_12(const void *sptr) { + int *table = permitted_alphabet_table_12; /* The underlying type is UTF8String */ const UTF8String_t *st = sptr; const uint8_t *ch = st->buf; @@ -2205,7 +2336,7 @@ Utf8_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, if(size == (size_t)-1) return -1; if((size >= 1 && size <= 2) - && !check_permitted_alphabet_11(sptr)) { + && !check_permitted_alphabet_12(sptr)) { /* Constraint check succeeded */ return 0; } else { From d82eb017671240ac5eb2806e6c3c94fe2fbd6612 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 10 Sep 2004 08:21:27 +0000 Subject: [PATCH 0300/1469] different marker semantics git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@300 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_expr.h | 15 ++++++++------- libasn1print/asn1print.c | 9 ++++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/libasn1parser/asn1p_expr.h b/libasn1parser/asn1p_expr.h index 461f42da5..2c284ff05 100644 --- a/libasn1parser/asn1p_expr.h +++ b/libasn1parser/asn1p_expr.h @@ -173,18 +173,19 @@ typedef struct asn1p_expr_s { asn1_integer_t tag_value; } tag; - /* - * Whether automatic tagging is applicable for subtypes. - */ - int auto_tags_OK; - enum asn1p_expr_marker_e { EM_NOMARK, - EM_OPTIONAL, - EM_DEFAULT, /* FIXME: store the value somewhere. */ + EM_INDIRECT = 0x01, /* 0001: Represent as pointer */ + EM_OPTIONAL = 0x03, /* 0011: Optional member */ + EM_DEFAULT = 0x07, /* 0111: FIXME: store the value */ } marker; int unique; /* UNIQUE */ + /* + * Whether automatic tagging is applicable for subtypes. + */ + int auto_tags_OK; + /* * Members of the constructed type. */ diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index e8281df66..41b2b7191 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -533,11 +533,10 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri * Print the expression as it were a stand-alone type. */ asn1print_expr(asn, mod, se, flags, level + 4); - switch(se->marker) { - case EM_NOMARK: break; - case EM_OPTIONAL: printf(" OPTIONAL"); break; - case EM_DEFAULT: printf(" DEFAULT "); break; - } + if(se->marker & EM_DEFAULT) + printf(" DEFAULT "); + else if(se->marker & EM_OPTIONAL) + printf(" OPTIONAL"); if(TQ_NEXT(se, next)) { printf(","); INDENT("\n"); From 432c199ab6808c6708ed53e4fa9f84b3b411baf2 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 10 Sep 2004 08:22:50 +0000 Subject: [PATCH 0301/1469] different marker semantics git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@301 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1print/asn1print.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index 41b2b7191..31d7d1423 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -533,9 +533,9 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri * Print the expression as it were a stand-alone type. */ asn1print_expr(asn, mod, se, flags, level + 4); - if(se->marker & EM_DEFAULT) + if((se->marker & EM_DEFAULT) == EM_DEFAULT) printf(" DEFAULT "); - else if(se->marker & EM_OPTIONAL) + else if((se->marker & EM_OPTIONAL) == EM_OPTIONAL) printf(" OPTIONAL"); if(TQ_NEXT(se, next)) { printf(","); From ddd5a7dd24cdb8b8826740c33614d4fc3c1f0698 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 10 Sep 2004 09:18:20 +0000 Subject: [PATCH 0302/1469] distinction between an optional member and a member encoded with a pointer git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@302 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 81 +++++++++++++++++++------- skeletons/constr_CHOICE.c | 32 +++++++--- skeletons/constr_SEQUENCE.c | 28 +++++---- skeletons/constr_SET.c | 30 +++++----- skeletons/constr_TYPE.h | 6 +- tests/19-param-OK.asn1.-P | 16 ++--- tests/31-set-of-OK.asn1.-P | 16 ++--- tests/39-sequence-of-OK.asn1.-P | 10 ++-- tests/42-real-life-OK.asn1.-PR | 32 +++++----- tests/43-recursion-OK.asn1.-P | 26 ++++----- tests/44-choice-in-sequence-OK.asn1.-P | 20 +++---- tests/46-redefine-OK.asn1.-PR | 2 +- tests/47-set-ext-OK.asn1.-P | 8 +-- 13 files changed, 181 insertions(+), 126 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 4d9390cb2..8755c2a2c 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -26,6 +26,7 @@ static int asn1c_lang_C_type_CHOICE_def(arg_t *arg); static int asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of); static int _print_tag(arg_t *arg, struct asn1p_type_tag_s *tag_p); static int check_if_extensible(asn1p_expr_t *expr); +static int expr_better_indirect(arg_t *arg, asn1p_expr_t *expr); static int expr_elements_count(arg_t *arg, asn1p_expr_t *expr); static int emit_member_table(arg_t *arg, asn1p_expr_t *expr); static int emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int *tags_impl_skip, int choice_mode); @@ -149,8 +150,9 @@ asn1c_lang_C_type_SEQUENCE(arg_t *arg) { if(v->expr_type == A1TC_EXTENSIBLE) { if(comp_mode < 3) comp_mode++; } - if(comp_mode == 1 && !v->marker) - v->marker = EM_OPTIONAL; + if(comp_mode == 1 + || expr_better_indirect(arg, v)) + v->marker |= EM_INDIRECT; EMBED(v); } @@ -289,8 +291,9 @@ asn1c_lang_C_type_SET(arg_t *arg) { if(v->expr_type == A1TC_EXTENSIBLE) { if(comp_mode < 3) comp_mode++; } - if(comp_mode == 1 && !v->marker) - v->marker = EM_OPTIONAL; + if(comp_mode == 1 + || expr_better_indirect(arg, v)) + v->marker |= EM_INDIRECT; EMBED(v); } @@ -345,15 +348,15 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { elements = 0; INDENTED(TQ_FOR(v, &(expr->members), next) { - if(v->expr_type != A1TC_EXTENSIBLE) { - if(comp_mode == 1) - v->marker = EM_OPTIONAL; - } else { + if(v->expr_type == A1TC_EXTENSIBLE) { if(comp_mode < 3) comp_mode++; - continue; + } else { + if(comp_mode == 1 + || expr_better_indirect(arg, v)) + v->marker |= EM_INDIRECT; + elements++; + emit_member_table(arg, v); } - elements++; - emit_member_table(arg, v); }); OUT("};\n"); @@ -386,7 +389,9 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { } else if(el) { OUT(" | "); } - OUT("(%d << %d)", v->marker?0:1, 7 - (el % 8)); + OUT("(%d << %d)", + v->marker?0:1, + 7 - (el % 8)); if(el && (el % 8) == 0) delimit = 1; el++; @@ -573,6 +578,8 @@ asn1c_lang_C_type_CHOICE(arg_t *arg) { OUT("%s_PR present;\n", id); OUT("union {\n", id); TQ_FOR(v, &(expr->members), next) { + if(expr_better_indirect(arg, v)) + v->marker |= EM_INDIRECT; EMBED(v); } if(UNNAMED_UNIONS) OUT("};\n"); @@ -621,15 +628,15 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { elements = 0; INDENTED(TQ_FOR(v, &(expr->members), next) { - if(v->expr_type != A1TC_EXTENSIBLE) { - if(comp_mode == 1) - v->marker = EM_OPTIONAL; - } else { + if(v->expr_type == A1TC_EXTENSIBLE) { if(comp_mode < 3) comp_mode++; - continue; + } else { + if(comp_mode == 1 + || expr_better_indirect(arg, v)) + v->marker |= EM_INDIRECT; + elements++; + emit_member_table(arg, v); } - elements++; - emit_member_table(arg, v); }); OUT("};\n"); @@ -731,8 +738,10 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { expr->marker?TNF_RSAFE:TNF_CTYPE)); OUT("%s", expr->marker?"*":" "); OUT("%s", MKID(expr->Identifier)); - if(expr->marker) OUT("\t/* %s */", - (expr->marker==EM_OPTIONAL)?"OPTIONAL":"DEFAULT"); + if((expr->marker & EM_DEFAULT) == EM_DEFAULT) + OUT("\t/* DEFAULT */"); + else if((expr->marker & EM_OPTIONAL) == EM_OPTIONAL) + OUT("\t/* OPTIONAL */"); REDIR(OT_TYPE_DECLS); return 0; @@ -1195,7 +1204,8 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { char *p; OUT("{ "); - if(expr->marker) { + OUT("%s, ", expr->marker?"ATF_POINTER":"ATF_NOFLAGS"); + if((expr->marker & EM_OPTIONAL) == EM_OPTIONAL) { asn1p_expr_t *tv; int opts = 0; for(tv = expr; tv && tv->marker; @@ -1378,3 +1388,30 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, int tags_count, int tags_impl_skip return 0; } + +/* + * Check if it is better to make this type indirectly accessed via + * a pointer. + * This may be the case for the following recursive definition: + * Type ::= CHOICE { member Type }; + */ +static int +expr_better_indirect(arg_t *arg, asn1p_expr_t *expr) { + asn1p_expr_t *top_parent; + asn1p_expr_t *terminal; + + if(expr->expr_type != A1TC_REFERENCE) + return 0; + + /* Rewind to the topmost parent expression */ + if((top_parent = expr->parent_expr)) { + while(top_parent->parent_expr) + top_parent = top_parent->parent_expr; + } else { + return 0; + } + + terminal = asn1f_find_terminal_type_ex(arg->asn, arg->mod, expr); + + return (terminal == top_parent); +} diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index cec0b8aad..b7d38fbae 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -238,8 +238,8 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *td, * and also a type of containment (it may be contained * as pointer or using inline inclusion). */ - if(elm->optional) { - /* Optional member, hereby, a simple pointer */ + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ memb_ptr2 = (void **)((char *)st + elm->memb_offset); } else { /* @@ -386,10 +386,17 @@ CHOICE_encode_der(asn1_TYPE_descriptor_t *td, * Seek over the present member of the structure. */ elm = &td->elements[present-1]; - if(elm->optional) { + if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)struct_ptr + elm->memb_offset); if(memb_ptr == 0) { - erval.encoded = 0; + if(elm->optional) { + erval.encoded = 0; + } else { + /* Mandatory element absent */ + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = struct_ptr; + } return erval; } } else { @@ -458,7 +465,7 @@ CHOICE_outmost_tag(asn1_TYPE_descriptor_t *td, const void *ptr, int tag_mode, be asn1_TYPE_member_t *elm = &td->elements[present-1]; const void *memb_ptr; - if(elm->optional) { + if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *) ((const char *)ptr + elm->memb_offset); } else { @@ -494,9 +501,16 @@ CHOICE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn1_TYPE_member_t *elm = &td->elements[present-1]; const void *memb_ptr; - if(elm->optional) { + if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); - if(!memb_ptr) return 0; + if(!memb_ptr) { + if(elm->optional) + return 0; + _ASN_ERRLOG(app_errlog, app_key, + "%s: mandatory CHOICE element %s absent (%s:%d)", + td->name, elm->name, __FILE__, __LINE__); + return -1; + } } else { memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); } @@ -542,7 +556,7 @@ CHOICE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn1_TYPE_member_t *elm = &td->elements[present-1]; const void *memb_ptr; - if(elm->optional) { + if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); if(!memb_ptr) return cb("", 8, app_key); } else { @@ -583,7 +597,7 @@ CHOICE_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { asn1_TYPE_member_t *elm = &td->elements[present-1]; void *memb_ptr; - if(elm->optional) { + if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)ptr + elm->memb_offset); if(memb_ptr) elm->type->free_struct(elm->type, memb_ptr, 0); diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 2a8a5405b..5bee2ed64 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -197,14 +197,17 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, /* * MICROPHASE 1: Synchronize decoding. */ - ASN_DEBUG("In %s SEQUENCE left %d, edx=%d opt=%d ec=%d", - td->name, (int)ctx->left, - edx, elements[edx].optional, td->elements_count); + ASN_DEBUG("In %s SEQUENCE left %d, edx=%d flags=%d" + " opt=%d ec=%d", + td->name, (int)ctx->left, edx, + elements[edx].flags, elements[edx].optional, + td->elements_count); if(ctx->left == 0 /* No more stuff is expected */ && ( /* Explicit OPTIONAL specification reaches the end */ - (edx + elements[edx].optional == td->elements_count) + (edx + elements[edx].optional + == td->elements_count) || /* All extensions are optional */ (IN_EXTENSION_GROUP(specs, edx) @@ -304,7 +307,8 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, if(!IN_EXTENSION_GROUP(specs, edx)) { if(elements[edx].tag == (ber_tlv_tag_t)-1 - && elements[edx].optional == 0) { + /* FIXME: any support */ + && (elements[edx].flags & ATF_POINTER) == 0) { /* * This must be the ANY type. */ @@ -375,8 +379,8 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, * and also a type of containment (it may be contained * as pointer or using inline inclusion). */ - if(elements[edx].optional) { - /* Optional member, hereby, a simple pointer */ + if(elements[edx].flags & ATF_POINTER) { + /* Member is a pointer to another structure */ memb_ptr2 = (void **)((char *)st + elements[edx].memb_offset); } else { /* @@ -505,7 +509,7 @@ SEQUENCE_encode_der(asn1_TYPE_descriptor_t *td, for(edx = 0; edx < td->elements_count; edx++) { asn1_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; - if(elm->optional) { + if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)ptr + elm->memb_offset); if(!memb_ptr) continue; } else { @@ -544,7 +548,7 @@ SEQUENCE_encode_der(asn1_TYPE_descriptor_t *td, der_enc_rval_t tmperval; void *memb_ptr; - if(elm->optional) { + if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)ptr + elm->memb_offset); if(!memb_ptr) continue; } else { @@ -589,7 +593,7 @@ SEQUENCE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn1_TYPE_member_t *elm = &td->elements[edx]; const void *memb_ptr; - if(elm->optional) { + if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); if(!memb_ptr) continue; } else { @@ -632,7 +636,7 @@ SEQUENCE_free(asn1_TYPE_descriptor_t *td, void *sptr, int contents_only) { for(edx = 0; edx < td->elements_count; edx++) { asn1_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; - if(elm->optional) { + if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)sptr + elm->memb_offset); if(memb_ptr) elm->type->free_struct(elm->type, memb_ptr, 0); @@ -666,7 +670,7 @@ SEQUENCE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn1_TYPE_member_t *elm = &td->elements[edx]; const void *memb_ptr; - if(elm->optional) { + if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); if(!memb_ptr) continue; } else { diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index 67816a773..f103fa398 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -294,8 +294,8 @@ SET_decode_ber(asn1_TYPE_descriptor_t *td, * and also a type of containment (it may be contained * as pointer or using inline inclusion). */ - if(elements[edx].optional) { - /* Optional member, hereby, a simple pointer */ + if(elements[edx].flags & ATF_POINTER) { + /* Member is a pointer to another structure */ memb_ptr2 = (void **)((char *)st + elements[edx].memb_offset); } else { /* @@ -475,7 +475,7 @@ SET_encode_der(asn1_TYPE_descriptor_t *td, /* * Compute the length of the encoding of this member. */ - if(elm->optional) { + if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)ptr + elm->memb_offset); if(!memb_ptr) { if(t2m_build_own) { @@ -551,7 +551,7 @@ SET_encode_der(asn1_TYPE_descriptor_t *td, /* Encode according to the tag order */ elm = &td->elements[t2m[edx].el_no]; - if(elm->optional) { + if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)ptr + elm->memb_offset); if(!memb_ptr) continue; } else { @@ -594,7 +594,7 @@ SET_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn1_TYPE_member_t *elm = &td->elements[edx]; const void *memb_ptr; - if(elm->optional) { + if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); if(!memb_ptr) continue; } else { @@ -636,7 +636,7 @@ SET_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { for(edx = 0; edx < td->elements_count; edx++) { asn1_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; - if(elm->optional) { + if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)ptr + elm->memb_offset); if(memb_ptr) elm->type->free_struct(elm->type, memb_ptr, 0); @@ -671,19 +671,15 @@ SET_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn1_TYPE_member_t *elm = &td->elements[edx]; const void *memb_ptr; - if(elm->optional) { + if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); if(!memb_ptr) { - if(ASN_SET_ISPRESENT2( - &(specs->_mandatory_elements), edx)) { - _ASN_ERRLOG(app_errlog, app_key, - "%s: mandatory element " - "%s absent (%s:%d)", - td->name, elm->name, - __FILE__, __LINE__); - return -1; - } - continue; + if(elm->optional) + continue; + _ASN_ERRLOG(app_errlog, app_key, + "%s: mandatory element %s absent (%s:%d)", + td->name, elm->name, __FILE__, __LINE__); + return -1; } } else { memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index 67f9c55ec..3463c6c00 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -94,7 +94,11 @@ typedef struct asn1_TYPE_descriptor_s { * An element of the constructed type, i.e. SEQUENCE, SET, CHOICE. */ typedef struct asn1_TYPE_member_s { - int optional; /* Whether the element is optional */ + enum asn1_TYPE_flags_e { + ATF_NOFLAGS, + ATF_POINTER = 0x01, /* Represented by the pointer */ + } flags; /* Element's presentation flags */ + int optional; /* Following optional members, including current */ int memb_offset; /* Offset of the element */ ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ int tag_mode; /* IMPLICIT/no/EXPLICIT tag at current level */ diff --git a/tests/19-param-OK.asn1.-P b/tests/19-param-OK.asn1.-P index 5f31e8236..ec393c082 100644 --- a/tests/19-param-OK.asn1.-P +++ b/tests/19-param-OK.asn1.-P @@ -67,21 +67,21 @@ memb_signature_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /*** <<< STAT-DEFS [Certificate] >>> ***/ static asn1_TYPE_member_t asn1_MBR_toBeSigned[] = { - { 0, offsetof(struct toBeSigned, version), + { ATF_NOFLAGS, 0, offsetof(struct toBeSigned, version), .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_INTEGER, .memb_constraints = 0, /* Defer to actual type */ .name = "version" }, - { 0, offsetof(struct toBeSigned, signature), + { ATF_NOFLAGS, 0, offsetof(struct toBeSigned, signature), .tag = (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_OBJECT_IDENTIFIER, .memb_constraints = 0, /* Defer to actual type */ .name = "signature" }, - { 0, offsetof(struct toBeSigned, issuer), + { ATF_NOFLAGS, 0, offsetof(struct toBeSigned, issuer), .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_Name, @@ -125,21 +125,21 @@ asn1_TYPE_descriptor_t asn1_DEF_toBeSigned = { }; static asn1_TYPE_member_t asn1_MBR_Certificate[] = { - { 0, offsetof(struct Certificate, toBeSigned), + { ATF_NOFLAGS, 0, offsetof(struct Certificate, toBeSigned), .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_toBeSigned, .memb_constraints = 0, /* Defer to actual type */ .name = "toBeSigned" }, - { 0, offsetof(struct Certificate, algorithm), + { ATF_NOFLAGS, 0, offsetof(struct Certificate, algorithm), .tag = (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_OBJECT_IDENTIFIER, .memb_constraints = 0, /* Defer to actual type */ .name = "algorithm" }, - { 0, offsetof(struct Certificate, signature), + { ATF_NOFLAGS, 0, offsetof(struct Certificate, signature), .tag = (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_BIT_STRING, @@ -205,7 +205,7 @@ typedef struct Name { /*** <<< STAT-DEFS [Name] >>> ***/ static asn1_TYPE_member_t asn1_MBR_Name[] = { - { 0, 0, + { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_RelativeDistinguishedName, @@ -317,7 +317,7 @@ memb_IA5String_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /*** <<< STAT-DEFS [RelativeDistinguishedName] >>> ***/ static asn1_TYPE_member_t asn1_MBR_RelativeDistinguishedName[] = { - { 0, 0, + { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_IA5String, diff --git a/tests/31-set-of-OK.asn1.-P b/tests/31-set-of-OK.asn1.-P index be7e123e9..b3c6ce637 100644 --- a/tests/31-set-of-OK.asn1.-P +++ b/tests/31-set-of-OK.asn1.-P @@ -22,7 +22,7 @@ typedef struct Forest { /*** <<< STAT-DEFS [Forest] >>> ***/ static asn1_TYPE_member_t asn1_MBR_Forest[] = { - { 0, 0, + { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_Tree, @@ -79,14 +79,14 @@ typedef struct Tree { /*** <<< STAT-DEFS [Tree] >>> ***/ static asn1_TYPE_member_t asn1_MBR_Tree[] = { - { 0, offsetof(struct Tree, height), + { ATF_NOFLAGS, 0, offsetof(struct Tree, height), .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_INTEGER, .memb_constraints = 0, /* Defer to actual type */ .name = "height" }, - { 0, offsetof(struct Tree, width), + { ATF_NOFLAGS, 0, offsetof(struct Tree, width), .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_INTEGER, @@ -186,7 +186,7 @@ typedef struct Stuff { /*** <<< STAT-DEFS [Stuff] >>> ***/ static asn1_TYPE_member_t asn1_MBR_trees[] = { - { 0, 0, + { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_Forest, @@ -221,7 +221,7 @@ asn1_TYPE_descriptor_t asn1_DEF_trees = { }; static asn1_TYPE_member_t asn1_MBR_anything_member[] = { - { 0, offsetof(struct anything_member, cup_of_coffee), + { ATF_NOFLAGS, 0, offsetof(struct anything_member, cup_of_coffee), .tag = (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_BIT_STRING, @@ -263,7 +263,7 @@ asn1_TYPE_descriptor_t asn1_DEF_anything_member = { }; static asn1_TYPE_member_t asn1_MBR_anything[] = { - { 0, 0, + { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_anything_member, @@ -298,14 +298,14 @@ asn1_TYPE_descriptor_t asn1_DEF_anything = { }; static asn1_TYPE_member_t asn1_MBR_Stuff[] = { - { 2, offsetof(struct Stuff, trees), + { ATF_POINTER, 2, offsetof(struct Stuff, trees), .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = (void *)&asn1_DEF_trees, .memb_constraints = 0, /* Defer to actual type */ .name = "trees" }, - { 1, offsetof(struct Stuff, anything), + { ATF_POINTER, 1, offsetof(struct Stuff, anything), .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = (void *)&asn1_DEF_anything, diff --git a/tests/39-sequence-of-OK.asn1.-P b/tests/39-sequence-of-OK.asn1.-P index 9a49a798e..2b8df8b12 100644 --- a/tests/39-sequence-of-OK.asn1.-P +++ b/tests/39-sequence-of-OK.asn1.-P @@ -30,7 +30,7 @@ typedef struct T { /*** <<< STAT-DEFS [T] >>> ***/ static asn1_TYPE_member_t asn1_MBR_collection[] = { - { 0, 0, + { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_T2, @@ -65,14 +65,14 @@ asn1_TYPE_descriptor_t asn1_DEF_collection = { }; static asn1_TYPE_member_t asn1_MBR_T[] = { - { 0, offsetof(struct T, int), + { ATF_NOFLAGS, 0, offsetof(struct T, int), .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_INTEGER, .memb_constraints = 0, /* Defer to actual type */ .name = "int" }, - { 0, offsetof(struct T, collection), + { ATF_NOFLAGS, 0, offsetof(struct T, collection), .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_collection, @@ -138,14 +138,14 @@ typedef struct T2 { /*** <<< STAT-DEFS [T2] >>> ***/ static asn1_TYPE_member_t asn1_MBR_T2[] = { - { 0, offsetof(struct T2, flag), + { ATF_NOFLAGS, 0, offsetof(struct T2, flag), .tag = (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_BOOLEAN, .memb_constraints = 0, /* Defer to actual type */ .name = "flag" }, - { 0, offsetof(struct T2, str), + { ATF_NOFLAGS, 0, offsetof(struct T2, str), .tag = (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_UTF8String, diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index 04ee81ad2..63b696d67 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -66,7 +66,7 @@ memb_varsets_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /*** <<< STAT-DEFS [LogLine] >>> ***/ static asn1_TYPE_member_t asn1_MBR_varsets[] = { - { 0, 0, + { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_VariablePartSet, @@ -101,14 +101,14 @@ asn1_TYPE_descriptor_t asn1_DEF_varsets = { }; static asn1_TYPE_member_t asn1_MBR_LogLine[] = { - { 0, offsetof(struct LogLine, line_digest), + { ATF_NOFLAGS, 0, offsetof(struct LogLine, line_digest), .tag = (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_IA5String, .memb_constraints = 0, /* Defer to actual type */ .name = "line-digest" }, - { 0, offsetof(struct LogLine, varsets), + { ATF_NOFLAGS, 0, offsetof(struct LogLine, varsets), .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_varsets, @@ -208,7 +208,7 @@ memb_vparts_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /*** <<< STAT-DEFS [VariablePartSet] >>> ***/ static asn1_TYPE_member_t asn1_MBR_vparts[] = { - { 0, 0, + { ATF_NOFLAGS, 0, 0, .tag = -1 /* Ambiguous tag (CHOICE|ANY?) */, .tag_mode = 0, .type = (void *)&asn1_DEF_VariablePart, @@ -243,14 +243,14 @@ asn1_TYPE_descriptor_t asn1_DEF_vparts = { }; static asn1_TYPE_member_t asn1_MBR_VariablePartSet[] = { - { 0, offsetof(struct VariablePartSet, vparts), + { ATF_NOFLAGS, 0, offsetof(struct VariablePartSet, vparts), .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_vparts, .memb_constraints = memb_vparts_2_constraint, .name = "vparts" }, - { 0, offsetof(struct VariablePartSet, resolution), + { ATF_NOFLAGS, 0, offsetof(struct VariablePartSet, resolution), .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_ActionItem, @@ -378,7 +378,7 @@ memb_vset_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /*** <<< STAT-DEFS [VariablePart] >>> ***/ static asn1_TYPE_member_t asn1_MBR_vset[] = { - { 0, 0, + { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_VisibleString, @@ -413,14 +413,14 @@ asn1_TYPE_descriptor_t asn1_DEF_vset = { }; static asn1_TYPE_member_t asn1_MBR_vrange[] = { - { 0, offsetof(struct vrange, from), + { ATF_NOFLAGS, 0, offsetof(struct vrange, from), .tag = (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_VisibleString, .memb_constraints = 0, /* Defer to actual type */ .name = "from" }, - { 0, offsetof(struct vrange, to), + { ATF_NOFLAGS, 0, offsetof(struct vrange, to), .tag = (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_VisibleString, @@ -463,14 +463,14 @@ asn1_TYPE_descriptor_t asn1_DEF_vrange = { }; static asn1_TYPE_member_t asn1_MBR_VariablePart[] = { - { 0, offsetof(struct VariablePart, choice.vset), + { ATF_NOFLAGS, 0, offsetof(struct VariablePart, choice.vset), .tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_vset, .memb_constraints = memb_vset_3_constraint, .name = "vset" }, - { 0, offsetof(struct VariablePart, choice.vrange), + { ATF_NOFLAGS, 0, offsetof(struct VariablePart, choice.vrange), .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_vrange, @@ -563,7 +563,7 @@ typedef struct ActionItem { /*** <<< STAT-DEFS [ActionItem] >>> ***/ static asn1_TYPE_member_t asn1_MBR_email[] = { - { 0, 0, + { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_VisibleString, @@ -598,14 +598,14 @@ asn1_TYPE_descriptor_t asn1_DEF_email = { }; static asn1_TYPE_member_t asn1_MBR_notify[] = { - { 0, offsetof(struct notify, critical), + { ATF_NOFLAGS, 0, offsetof(struct notify, critical), .tag = (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_BOOLEAN, .memb_constraints = 0, /* Defer to actual type */ .name = "critical" }, - { 0, offsetof(struct notify, email), + { ATF_NOFLAGS, 0, offsetof(struct notify, email), .tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_email, @@ -648,14 +648,14 @@ asn1_TYPE_descriptor_t asn1_DEF_notify = { }; static asn1_TYPE_member_t asn1_MBR_ActionItem[] = { - { 0, offsetof(struct ActionItem, accept_as), + { ATF_NOFLAGS, 0, offsetof(struct ActionItem, accept_as), .tag = (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_ENUMERATED, .memb_constraints = 0, /* Defer to actual type */ .name = "accept-as" }, - { 1, offsetof(struct ActionItem, notify), + { ATF_POINTER, 1, offsetof(struct ActionItem, notify), .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_notify, diff --git a/tests/43-recursion-OK.asn1.-P b/tests/43-recursion-OK.asn1.-P index a38cd02bb..3ff74e4bf 100644 --- a/tests/43-recursion-OK.asn1.-P +++ b/tests/43-recursion-OK.asn1.-P @@ -39,7 +39,7 @@ typedef struct Test_structure_1 { /*** <<< STAT-DEFS [Test-structure-1] >>> ***/ static asn1_TYPE_member_t asn1_MBR_t_member1[] = { - { 0, 0, + { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_Test_structure_1, @@ -74,7 +74,7 @@ asn1_TYPE_descriptor_t asn1_DEF_t_member1 = { }; static asn1_TYPE_member_t asn1_MBR_t_member2[] = { - { 0, 0, + { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_Test_structure_1, @@ -109,28 +109,28 @@ asn1_TYPE_descriptor_t asn1_DEF_t_member2 = { }; static asn1_TYPE_member_t asn1_MBR_Test_structure_1[] = { - { 0, offsetof(struct Test_structure_1, t_member1), + { ATF_NOFLAGS, 0, offsetof(struct Test_structure_1, t_member1), .tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_t_member1, .memb_constraints = 0, /* Defer to actual type */ .name = "t-member1" }, - { 0, offsetof(struct Test_structure_1, t_member2), + { ATF_NOFLAGS, 0, offsetof(struct Test_structure_1, t_member2), .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_t_member2, .memb_constraints = 0, /* Defer to actual type */ .name = "t-member2" }, - { 1, offsetof(struct Test_structure_1, t_member3), + { ATF_POINTER, 1, offsetof(struct Test_structure_1, t_member3), .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_Test_structure_1, .memb_constraints = 0, /* Defer to actual type */ .name = "t-member3" }, - { 0, offsetof(struct Test_structure_1, t_member4), + { ATF_NOFLAGS, 0, offsetof(struct Test_structure_1, t_member4), .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_INTEGER, @@ -199,14 +199,14 @@ extern asn1_TYPE_descriptor_t asn1_DEF_Choice_1; typedef struct Choice_1 { Choice_1_PR present; union { - struct Choice_1 and; + struct Choice_1 *and; struct or { A_SET_OF(struct Choice_1) list; /* Context for parsing across buffer boundaries */ ber_dec_ctx_t _ber_dec_ctx; } or; - struct Choice_1 not; + struct Choice_1 *not; INTEGER_t other; } choice; @@ -217,7 +217,7 @@ typedef struct Choice_1 { /*** <<< STAT-DEFS [Choice-1] >>> ***/ static asn1_TYPE_member_t asn1_MBR_or[] = { - { 0, 0, + { ATF_NOFLAGS, 0, 0, .tag = -1 /* Ambiguous tag (CHOICE|ANY?) */, .tag_mode = 0, .type = (void *)&asn1_DEF_Choice_1, @@ -252,28 +252,28 @@ asn1_TYPE_descriptor_t asn1_DEF_or = { }; static asn1_TYPE_member_t asn1_MBR_Choice_1[] = { - { 0, offsetof(struct Choice_1, choice.and), + { ATF_POINTER, 0, offsetof(struct Choice_1, choice.and), .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), .tag_mode = +1, /* EXPLICIT tag at current level */ .type = (void *)&asn1_DEF_Choice_1, .memb_constraints = 0, /* Defer to actual type */ .name = "and" }, - { 0, offsetof(struct Choice_1, choice.or), + { ATF_NOFLAGS, 0, offsetof(struct Choice_1, choice.or), .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = (void *)&asn1_DEF_or, .memb_constraints = 0, /* Defer to actual type */ .name = "or" }, - { 0, offsetof(struct Choice_1, choice.not), + { ATF_POINTER, 0, offsetof(struct Choice_1, choice.not), .tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)), .tag_mode = +1, /* EXPLICIT tag at current level */ .type = (void *)&asn1_DEF_Choice_1, .memb_constraints = 0, /* Defer to actual type */ .name = "not" }, - { 0, offsetof(struct Choice_1, choice.other), + { ATF_NOFLAGS, 0, offsetof(struct Choice_1, choice.other), .tag = (ASN_TAG_CLASS_CONTEXT | (4 << 2)), .tag_mode = +1, /* EXPLICIT tag at current level */ .type = (void *)&asn1_DEF_INTEGER, diff --git a/tests/44-choice-in-sequence-OK.asn1.-P b/tests/44-choice-in-sequence-OK.asn1.-P index b4d9c719c..3c6c15231 100644 --- a/tests/44-choice-in-sequence-OK.asn1.-P +++ b/tests/44-choice-in-sequence-OK.asn1.-P @@ -69,14 +69,14 @@ typedef struct T { /*** <<< STAT-DEFS [T] >>> ***/ static asn1_TYPE_member_t asn1_MBR_e[] = { - { 0, offsetof(struct e, choice.f), + { ATF_NOFLAGS, 0, offsetof(struct e, choice.f), .tag = (ASN_TAG_CLASS_PRIVATE | (7 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = (void *)&asn1_DEF_NULL, .memb_constraints = 0, /* Defer to actual type */ .name = "f" }, - { 0, offsetof(struct e, choice.g), + { ATF_NOFLAGS, 0, offsetof(struct e, choice.g), .tag = (ASN_TAG_CLASS_PRIVATE | (8 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = (void *)&asn1_DEF_NULL, @@ -116,14 +116,14 @@ asn1_TYPE_descriptor_t asn1_DEF_e = { }; static asn1_TYPE_member_t asn1_MBR_h[] = { - { 0, offsetof(struct h, choice.i), + { ATF_NOFLAGS, 0, offsetof(struct h, choice.i), .tag = (ASN_TAG_CLASS_PRIVATE | (1 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = (void *)&asn1_DEF_NULL, .memb_constraints = 0, /* Defer to actual type */ .name = "i" }, - { 0, offsetof(struct h, choice.j), + { ATF_NOFLAGS, 0, offsetof(struct h, choice.j), .tag = (ASN_TAG_CLASS_PRIVATE | (2 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = (void *)&asn1_DEF_NULL, @@ -163,28 +163,28 @@ asn1_TYPE_descriptor_t asn1_DEF_h = { }; static asn1_TYPE_member_t asn1_MBR_b[] = { - { 0, offsetof(struct b, choice.c), + { ATF_NOFLAGS, 0, offsetof(struct b, choice.c), .tag = (ASN_TAG_CLASS_PRIVATE | (5 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = (void *)&asn1_DEF_NULL, .memb_constraints = 0, /* Defer to actual type */ .name = "c" }, - { 0, offsetof(struct b, choice.d), + { ATF_NOFLAGS, 0, offsetof(struct b, choice.d), .tag = (ASN_TAG_CLASS_PRIVATE | (6 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = (void *)&asn1_DEF_NULL, .memb_constraints = 0, /* Defer to actual type */ .name = "d" }, - { 0, offsetof(struct b, choice.e), + { ATF_NOFLAGS, 0, offsetof(struct b, choice.e), .tag = -1 /* Ambiguous tag (CHOICE|ANY?) */, .tag_mode = 0, .type = (void *)&asn1_DEF_e, .memb_constraints = 0, /* Defer to actual type */ .name = "e" }, - { 0, offsetof(struct b, choice.h), + { ATF_NOFLAGS, 0, offsetof(struct b, choice.h), .tag = (ASN_TAG_CLASS_PRIVATE | (9 << 2)), .tag_mode = +1, /* EXPLICIT tag at current level */ .type = (void *)&asn1_DEF_h, @@ -227,14 +227,14 @@ asn1_TYPE_descriptor_t asn1_DEF_b = { }; static asn1_TYPE_member_t asn1_MBR_T[] = { - { 0, offsetof(struct T, a), + { ATF_NOFLAGS, 0, offsetof(struct T, a), .tag = (ASN_TAG_CLASS_PRIVATE | (2 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = (void *)&asn1_DEF_NULL, .memb_constraints = 0, /* Defer to actual type */ .name = "a" }, - { 0, offsetof(struct T, b), + { ATF_NOFLAGS, 0, offsetof(struct T, b), .tag = -1 /* Ambiguous tag (CHOICE|ANY?) */, .tag_mode = 0, .type = (void *)&asn1_DEF_b, diff --git a/tests/46-redefine-OK.asn1.-PR b/tests/46-redefine-OK.asn1.-PR index ad54f8748..c78b29f50 100644 --- a/tests/46-redefine-OK.asn1.-PR +++ b/tests/46-redefine-OK.asn1.-PR @@ -121,7 +121,7 @@ typedef struct ConstructedType { /*** <<< STAT-DEFS [ConstructedType] >>> ***/ static asn1_TYPE_member_t asn1_MBR_ConstructedType[] = { - { 0, offsetof(struct ConstructedType, field), + { ATF_NOFLAGS, 0, offsetof(struct ConstructedType, field), .tag = (ASN_TAG_CLASS_CONTEXT | (5 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = (void *)&asn1_DEF_PrimitiveType, diff --git a/tests/47-set-ext-OK.asn1.-P b/tests/47-set-ext-OK.asn1.-P index 9991cf570..8354a16c8 100644 --- a/tests/47-set-ext-OK.asn1.-P +++ b/tests/47-set-ext-OK.asn1.-P @@ -36,7 +36,7 @@ typedef struct T1 { /*** <<< STAT-DEFS [T1] >>> ***/ static asn1_TYPE_member_t asn1_MBR_T1[] = { - { 0, offsetof(struct T1, i), + { ATF_NOFLAGS, 0, offsetof(struct T1, i), .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_INTEGER, @@ -118,7 +118,7 @@ typedef struct T2 { /*** <<< STAT-DEFS [T2] >>> ***/ static asn1_TYPE_member_t asn1_MBR_T2[] = { - { 0, offsetof(struct T2, i), + { ATF_NOFLAGS, 0, offsetof(struct T2, i), .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_INTEGER, @@ -197,7 +197,7 @@ typedef struct T3 { /*** <<< STAT-DEFS [T3] >>> ***/ static asn1_TYPE_member_t asn1_MBR_T3[] = { - { 0, offsetof(struct T3, choice.i), + { ATF_NOFLAGS, 0, offsetof(struct T3, choice.i), .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_INTEGER, @@ -269,7 +269,7 @@ typedef struct T4 { /*** <<< STAT-DEFS [T4] >>> ***/ static asn1_TYPE_member_t asn1_MBR_T4[] = { - { 0, offsetof(struct T4, choice.i), + { ATF_NOFLAGS, 0, offsetof(struct T4, choice.i), .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), .tag_mode = 0, .type = (void *)&asn1_DEF_INTEGER, From 060fe2a5252a40b27f71ad2b39dc3395980f6c7d Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 10 Sep 2004 09:37:12 +0000 Subject: [PATCH 0303/1469] more explicit ANY support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@303 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 24 +++- skeletons/constr_SEQUENCE.c | 19 ++-- skeletons/constr_TYPE.h | 1 + tests/42-real-life-OK.asn1.-PR | 2 +- tests/43-recursion-OK.asn1.-P | 2 +- tests/44-choice-in-sequence-OK.asn1.-P | 4 +- tests/60-any-OK.asn1.-P | 145 +++++++++++++++++++++++++ 7 files changed, 177 insertions(+), 20 deletions(-) create mode 100644 tests/60-any-OK.asn1.-P diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 8755c2a2c..00b278b9b 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1200,10 +1200,21 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { static int global_memb_unique; int save_target; arg_t tmp_arg; - struct asn1p_type_tag_s outmost_tag; + struct asn1p_type_tag_s outmost_tag_s; + struct asn1p_type_tag_s *outmost_tag; char *p; + if(asn1f_fetch_outmost_tag(arg->asn, + expr->module, expr, &outmost_tag_s, 1)) { + outmost_tag = 0; + } else { + outmost_tag = &outmost_tag_s; + } + OUT("{ "); + + if(outmost_tag && outmost_tag->tag_value == -1) + OUT("ATF_OPEN_TYPE | "); OUT("%s, ", expr->marker?"ATF_POINTER":"ATF_NOFLAGS"); if((expr->marker & EM_OPTIONAL) == EM_OPTIONAL) { asn1p_expr_t *tv; @@ -1229,12 +1240,15 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { } INDENT(+1); if(C99_MODE) OUT(".tag = "); - if(asn1f_fetch_outmost_tag(arg->asn, - expr->module, expr, &outmost_tag, 0)) { - OUT("-1 /* Ambiguous tag (CHOICE|ANY?) */"); + if(outmost_tag) { + if(outmost_tag->tag_value == -1) + OUT("-1 /* Ambiguous tag (ANY?) */"); + else + _print_tag(arg, outmost_tag); } else { - _print_tag(arg, &outmost_tag); + OUT("-1 /* Ambiguous tag (CHOICE?) */"); } + OUT(",\n"); if(C99_MODE) OUT(".tag_mode = "); if(expr->tag.tag_class) { diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 5bee2ed64..649f53b72 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -257,6 +257,14 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, edx = n; ctx->step = 1 + 2 * edx; /* Remember! */ goto microphase2; + } else if(elements[n].flags & ATF_OPEN_TYPE) { + /* + * This is the ANY type, which may bear + * any flag whatsoever. + */ + edx = n; + ctx->step = 1 + 2 * edx; /* Remember! */ + goto microphase2; } else if(elements[n].tag == (ber_tlv_tag_t)-1) { use_bsearch = 1; break; @@ -304,18 +312,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, * or an extension (...), * or an end of the indefinite-length structure. */ - if(!IN_EXTENSION_GROUP(specs, edx)) { - if(elements[edx].tag == (ber_tlv_tag_t)-1 - /* FIXME: any support */ - && (elements[edx].flags & ATF_POINTER) == 0) { - /* - * This must be the ANY type. - */ - ctx->step |= 1; - goto microphase2; - } - ASN_DEBUG("Unexpected tag %s", ber_tlv_tag_string(tlv_tag)); ASN_DEBUG("Expected tag %s (%s)%s", diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index 3463c6c00..e072ec539 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -97,6 +97,7 @@ typedef struct asn1_TYPE_member_s { enum asn1_TYPE_flags_e { ATF_NOFLAGS, ATF_POINTER = 0x01, /* Represented by the pointer */ + ATF_OPEN_TYPE = 0x02, /* ANY type, without meaningful tag */ } flags; /* Element's presentation flags */ int optional; /* Following optional members, including current */ int memb_offset; /* Offset of the element */ diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index 63b696d67..4cdd03927 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -209,7 +209,7 @@ memb_vparts_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, static asn1_TYPE_member_t asn1_MBR_vparts[] = { { ATF_NOFLAGS, 0, 0, - .tag = -1 /* Ambiguous tag (CHOICE|ANY?) */, + .tag = -1 /* Ambiguous tag (CHOICE?) */, .tag_mode = 0, .type = (void *)&asn1_DEF_VariablePart, .memb_constraints = 0, /* Defer to actual type */ diff --git a/tests/43-recursion-OK.asn1.-P b/tests/43-recursion-OK.asn1.-P index 3ff74e4bf..c89e881f4 100644 --- a/tests/43-recursion-OK.asn1.-P +++ b/tests/43-recursion-OK.asn1.-P @@ -218,7 +218,7 @@ typedef struct Choice_1 { static asn1_TYPE_member_t asn1_MBR_or[] = { { ATF_NOFLAGS, 0, 0, - .tag = -1 /* Ambiguous tag (CHOICE|ANY?) */, + .tag = -1 /* Ambiguous tag (CHOICE?) */, .tag_mode = 0, .type = (void *)&asn1_DEF_Choice_1, .memb_constraints = 0, /* Defer to actual type */ diff --git a/tests/44-choice-in-sequence-OK.asn1.-P b/tests/44-choice-in-sequence-OK.asn1.-P index 3c6c15231..413ff00da 100644 --- a/tests/44-choice-in-sequence-OK.asn1.-P +++ b/tests/44-choice-in-sequence-OK.asn1.-P @@ -178,7 +178,7 @@ static asn1_TYPE_member_t asn1_MBR_b[] = { .name = "d" }, { ATF_NOFLAGS, 0, offsetof(struct b, choice.e), - .tag = -1 /* Ambiguous tag (CHOICE|ANY?) */, + .tag = -1 /* Ambiguous tag (CHOICE?) */, .tag_mode = 0, .type = (void *)&asn1_DEF_e, .memb_constraints = 0, /* Defer to actual type */ @@ -235,7 +235,7 @@ static asn1_TYPE_member_t asn1_MBR_T[] = { .name = "a" }, { ATF_NOFLAGS, 0, offsetof(struct T, b), - .tag = -1 /* Ambiguous tag (CHOICE|ANY?) */, + .tag = -1 /* Ambiguous tag (CHOICE?) */, .tag_mode = 0, .type = (void *)&asn1_DEF_b, .memb_constraints = 0, /* Defer to actual type */ diff --git a/tests/60-any-OK.asn1.-P b/tests/60-any-OK.asn1.-P new file mode 100644 index 000000000..96098a58d --- /dev/null +++ b/tests/60-any-OK.asn1.-P @@ -0,0 +1,145 @@ + +/*** <<< INCLUDES [T1] >>> ***/ + +#include +#include +#include + +/*** <<< DEPS [T1] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_T1; + +/*** <<< TYPE-DECLS [T1] >>> ***/ + + +typedef struct T1 { + INTEGER_t i; + ANY_t any; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} T1_t; + +/*** <<< STAT-DEFS [T1] >>> ***/ + +static asn1_TYPE_member_t asn1_MBR_T1[] = { + { ATF_NOFLAGS, 0, offsetof(struct T1, i), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_INTEGER, + .memb_constraints = 0, /* Defer to actual type */ + .name = "i" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct T1, any), + .tag = -1 /* Ambiguous tag (ANY?) */, + .tag_mode = 0, + .type = (void *)&asn1_DEF_ANY, + .memb_constraints = 0, /* Defer to actual type */ + .name = "any" + }, +}; +static ber_tlv_tag_t asn1_DEF_T1_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_TYPE_tag2member_t asn1_DEF_T1_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 15 */ +}; +static asn1_SEQUENCE_specifics_t asn1_DEF_T1_specs = { + sizeof(struct T1), + offsetof(struct T1, _ber_dec_ctx), + asn1_DEF_T1_tag2el, + 1, /* Count of tags in the map */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn1_TYPE_descriptor_t asn1_DEF_T1 = { + "T1", + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_print, + SEQUENCE_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T1_tags, + sizeof(asn1_DEF_T1_tags) + /sizeof(asn1_DEF_T1_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_T1, + 2, /* Elements count */ + &asn1_DEF_T1_specs /* Additional specs */ +}; + + +/*** <<< INCLUDES [T2] >>> ***/ + +#include +#include +#include + +/*** <<< DEPS [T2] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_T2; + +/*** <<< TYPE-DECLS [T2] >>> ***/ + + +typedef struct T2 { + INTEGER_t i; + ANY_t *any /* OPTIONAL */; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} T2_t; + +/*** <<< STAT-DEFS [T2] >>> ***/ + +static asn1_TYPE_member_t asn1_MBR_T2[] = { + { ATF_NOFLAGS, 0, offsetof(struct T2, i), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_INTEGER, + .memb_constraints = 0, /* Defer to actual type */ + .name = "i" + }, + { ATF_POINTER, 1, offsetof(struct T2, any), + .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + .tag_mode = +1, /* EXPLICIT tag at current level */ + .type = (void *)&asn1_DEF_ANY, + .memb_constraints = 0, /* Defer to actual type */ + .name = "any" + }, +}; +static ber_tlv_tag_t asn1_DEF_T2_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_TYPE_tag2member_t asn1_DEF_T2_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 20 */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 }, /* any at 21 */ +}; +static asn1_SEQUENCE_specifics_t asn1_DEF_T2_specs = { + sizeof(struct T2), + offsetof(struct T2, _ber_dec_ctx), + asn1_DEF_T2_tag2el, + 2, /* Count of tags in the map */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn1_TYPE_descriptor_t asn1_DEF_T2 = { + "T2", + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_print, + SEQUENCE_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T2_tags, + sizeof(asn1_DEF_T2_tags) + /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_T2, + 2, /* Elements count */ + &asn1_DEF_T2_specs /* Additional specs */ +}; + From dbf655b8277848b448b3d7d75675b5d5f98a2eab Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 10 Sep 2004 09:38:17 +0000 Subject: [PATCH 0304/1469] recursive and any git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@304 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ChangeLog b/ChangeLog index 377b8e1bd..fd99b9676 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,9 @@ +0.9.4: 2004-Sep-07 + + * More support for recursive type definitions. + * Explicit support for ANY type decoding. + 0.9.3: 2004-Sep-07 * Extended constraints support in parametrized types. From 5ad7bf2156b6b4b1316d217541ec5b5b906df73a Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 10 Sep 2004 15:39:19 +0000 Subject: [PATCH 0305/1469] new version git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@305 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure | 2 +- configure.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 9ba0eac2e..171830b00 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.9.3 + VERSION=0.9.4 cat >>confdefs.h <<_ACEOF diff --git a/configure.in b/configure.in index c679baf0d..40341d4b0 100644 --- a/configure.in +++ b/configure.in @@ -3,7 +3,7 @@ AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_BUILD AC_CANONICAL_TARGET AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.9.3) +AM_INIT_AUTOMAKE(asn1c, 0.9.4) AC_SUBST(PATH) From f97a6192b89a5a22e5a8e6c95e247efb286693e2 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 10 Sep 2004 15:48:41 +0000 Subject: [PATCH 0306/1469] added a warning about 16MB limit git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@306 59561ff5-6e30-0410-9f3c-9617f08c8826 --- BUGS | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/BUGS b/BUGS index 3e8145c01..d35cff723 100644 --- a/BUGS +++ b/BUGS @@ -28,4 +28,9 @@ is still possible, for example, to encode a wrapper structure using definite length, and encode its substructure member using indefinite length. The BER decoder is perfectly capable of decoding such sequences. +6. Encoding or decoding of structures with combined length greater than 16MB +is not tested. There are some size determination bugs lurking in the produced +code, which may cause integer overflow in certain edge cases. This restriction +should not cause a problem in the real world, as higher level protocol typically +have similar or tighter restrictions on the supported PDU size. From 1308d2b421d14aaabf2c98615a2d2662d674ca24 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 10 Sep 2004 15:49:15 +0000 Subject: [PATCH 0307/1469] refactored tagging support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@307 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 5 +- asn1c/tests/check-43.c | 5 +- asn1c/tests/check-65.c | 115 ++++ libasn1compiler/asn1c_C.c | 99 ++-- libasn1fix/asn1fix_internal.h | 2 +- libasn1fix/asn1fix_tags.c | 38 +- libasn1fix/asn1fix_tags.h | 1 - skeletons/ANY.c | 1 - skeletons/BIT_STRING.c | 1 - skeletons/BMPString.c | 1 - skeletons/BOOLEAN.c | 1 - skeletons/ENUMERATED.c | 1 - skeletons/GeneralString.c | 1 - skeletons/GeneralizedTime.c | 1 - skeletons/GraphicString.c | 1 - skeletons/IA5String.c | 1 - skeletons/INTEGER.c | 1 - skeletons/ISO646String.c | 1 - skeletons/NULL.c | 1 - skeletons/NativeEnumerated.c | 1 - skeletons/NativeInteger.c | 1 - skeletons/NumericString.c | 1 - skeletons/OBJECT_IDENTIFIER.c | 1 - skeletons/OCTET_STRING.c | 1 - skeletons/ObjectDescriptor.c | 1 - skeletons/PrintableString.c | 1 - skeletons/RELATIVE-OID.c | 1 - skeletons/T61String.c | 1 - skeletons/TeletexString.c | 1 - skeletons/UTCTime.c | 1 - skeletons/UTF8String.c | 1 - skeletons/UniversalString.c | 1 - skeletons/VideotexString.c | 1 - skeletons/VisibleString.c | 1 - skeletons/ber_decoder.c | 20 +- skeletons/constr_SEQUENCE.c | 6 +- skeletons/constr_SET.c | 1 - skeletons/constr_TYPE.h | 1 - skeletons/constraints.c | 5 +- skeletons/der_encoder.c | 10 +- tests/19-param-OK.asn1.-P | 4 - tests/31-set-of-OK.asn1.-P | 6 - tests/39-sequence-of-OK.asn1.-P | 3 - tests/42-real-life-OK.asn1.-PR | 10 - tests/43-recursion-OK.asn1.-P | 5 - tests/44-choice-in-sequence-OK.asn1.-P | 4 - tests/46-redefine-OK.asn1.-PR | 9 +- tests/47-set-ext-OK.asn1.-P | 4 - tests/50-constraint-OK.asn1.-P | 114 ++-- tests/60-any-OK.asn1.-P | 2 - tests/65-multi-tag-OK.asn1 | 29 + tests/65-multi-tag-OK.asn1.-P | 774 +++++++++++++++++++++++++ 52 files changed, 1047 insertions(+), 252 deletions(-) create mode 100644 asn1c/tests/check-65.c create mode 100644 tests/65-multi-tag-OK.asn1 create mode 100644 tests/65-multi-tag-OK.asn1.-P diff --git a/ChangeLog b/ChangeLog index fd99b9676..9725d7fd2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,11 @@ -0.9.4: 2004-Sep-07 +0.9.4: 2004-Sep-10 * More support for recursive type definitions. * Explicit support for ANY type decoding. + * Refactored tags processing code. + * Fixed constraints checking code: non-exploitable buffer overflow. + (Severity: medium, Security impact: low) 0.9.3: 2004-Sep-07 diff --git a/asn1c/tests/check-43.c b/asn1c/tests/check-43.c index c906f64dc..bb5c219d2 100644 --- a/asn1c/tests/check-43.c +++ b/asn1c/tests/check-43.c @@ -6,18 +6,17 @@ #include #include -#include +#include int main(int ac, char **av) { Test_structure_1_t ts1; - Sets_t s1; + Choice_1_t cs1; (void)ac; /* Unused argument */ (void)av; /* Unused argument */ memset(&ts1, 0, sizeof(ts1)); - memset(&s1, 0, sizeof(s1)); /* * No plans to fill it up: just checking whether it compiles or not. diff --git a/asn1c/tests/check-65.c b/asn1c/tests/check-65.c new file mode 100644 index 000000000..65078e2b3 --- /dev/null +++ b/asn1c/tests/check-65.c @@ -0,0 +1,115 @@ +#undef NDEBUG +#include +#include +#include +#include +#include + +#include +#include + +uint8_t buf1[] = { + 32 | ((2 << 6) + 2), /* [2], constructed */ + 8, + 32 | ((2 << 6) + 3), /* [3], constructed */ + 6, + 32 | ((2 << 6) + 4), /* [4], constructed */ + 4, + 0 | ((2 << 6) + 6), /* [6], primitive */ + 2, + 0x91, + 0x92 +}; + +uint8_t buf2[] = { + + 32 | ((2 << 6) + 0), /* [0], constructed */ + 22, + + 32 | ((2 << 6) + 1), /* [1], constructed */ + 6, + 32 | ((2 << 6) + 4), /* [4], constructed */ + 4, + 0 | ((2 << 6) + 6), /* [6], primitive */ + 2, + 0x91, + 0x92, + + 32 | ((2 << 6) + 2), /* [2], constructed */ + 6, + 32 | ((2 << 6) + 4), /* [4], constructed */ + 4, + 0 | ((2 << 6) + 6), /* [6], primitive */ + 2, + 0x91, + 0x92, + + 32 | ((2 << 6) + 3), /* [3], constructed */ + 4, + 0 | ((2 << 6) + 6), /* [6], primitive */ + 2, + 0x91, + 0x92, + +}; + +static void +check_1(int is_ok, uint8_t *buf, int size, size_t consumed) { + asn1_TYPE_descriptor_t *td = &asn1_DEF_T1; + ber_dec_rval_t rval; + T1_t t, *tp; + + tp = memset(&t, 0, sizeof(t)); + + fprintf(stderr, "Buf %p\n", buf); + rval = ber_decode(td, (void **)&tp, buf, size); + fprintf(stderr, "Returned code %d, consumed %d\n", + (int)rval.code, (int)rval.consumed); + + if(is_ok) { + assert(rval.code == RC_OK); + assert(rval.consumed == consumed); + } else { + if(rval.code == RC_OK) { + } + assert(rval.consumed <= consumed); + } +} + +static void +check_2(int is_ok, uint8_t *buf, int size, size_t consumed) { + asn1_TYPE_descriptor_t *td = &asn1_DEF_T; + ber_dec_rval_t rval; + T_t t, *tp; + + tp = memset(&t, 0, sizeof(t)); + + fprintf(stderr, "Buf %p\n", buf); + rval = ber_decode(td, (void **)&tp, buf, size); + fprintf(stderr, "Returned code %d, consumed %d\n", + (int)rval.code, (int)rval.consumed); + + if(is_ok) { + assert(rval.code == RC_OK); + assert(rval.consumed == consumed); + } else { + if(rval.code == RC_OK) { + } + assert(rval.consumed <= consumed); + } +} + +int +main(int ac, char **av) { + + (void)ac; /* Unused argument */ + (void)av; /* Unused argument */ + + check_1(1, buf1, sizeof(buf1), sizeof(buf1)); + check_1(0, buf1, sizeof(buf1) - 1, sizeof(buf1) - 1); + + check_2(1, buf2, sizeof(buf2), sizeof(buf2)); + check_2(0, buf2, sizeof(buf2) - 1, sizeof(buf2) - 1); + + return 0; +} diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 00b278b9b..c448795ab 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -29,7 +29,7 @@ static int check_if_extensible(asn1p_expr_t *expr); static int expr_better_indirect(arg_t *arg, asn1p_expr_t *expr); static int expr_elements_count(arg_t *arg, asn1p_expr_t *expr); static int emit_member_table(arg_t *arg, asn1p_expr_t *expr); -static int emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int *tags_impl_skip, int choice_mode); +static int emit_tags_vector(arg_t *arg, asn1p_expr_t *expr); static int emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count); enum etd_cp { @@ -42,7 +42,7 @@ enum etd_spec { ETD_NO_SPECIFICS, ETD_HAS_SPECIFICS }; -static int emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, int tags_count, int tags_impl_skip, int elements_count, enum etd_cp, enum etd_spec); +static int emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, int tags_count, int elements_count, enum etd_cp, enum etd_spec); #define C99_MODE (!(arg->flags & A1C_NO_C99)) #define UNNAMED_UNIONS (arg->flags & A1C_UNNAMED_UNIONS) @@ -169,7 +169,6 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *v; int elements; /* Number of elements */ - int tags_impl_skip = 0; int comp_mode = 0; /* {root,ext=1,root,root,...} */ int ext_start = -1; int ext_stop = -1; @@ -215,7 +214,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { /* * Print out asn1_DEF__tags[] vector. */ - tags_count = emit_tags_vector(arg, expr, &tags_impl_skip, 0); + tags_count = emit_tags_vector(arg, expr); /* * Tags to elements map. @@ -239,7 +238,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { /* * Emit asn1_DEF_xxx table. */ - emit_type_DEF(arg, expr, tags_count, tags_impl_skip, elements, + emit_type_DEF(arg, expr, tags_count, elements, ETD_CP_CONSTRUCTED, ETD_HAS_SPECIFICS); REDIR(OT_TYPE_DECLS); @@ -319,7 +318,6 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *v; int elements; - int tags_impl_skip = 0; int comp_mode = 0; /* {root,ext=1,root,root,...} */ tag2el_t *tag2el = NULL; int tag2el_count = 0; @@ -363,7 +361,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { /* * Print out asn1_DEF__tags[] vector. */ - tags_count = emit_tags_vector(arg, expr, &tags_impl_skip, 0); + tags_count = emit_tags_vector(arg, expr); /* * Tags to elements map. @@ -419,7 +417,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { /* * Emit asn1_DEF_xxx table. */ - emit_type_DEF(arg, expr, tags_count, tags_impl_skip, elements, + emit_type_DEF(arg, expr, tags_count, elements, ETD_CP_CONSTRUCTED, ETD_HAS_SPECIFICS); REDIR(OT_TYPE_DECLS); @@ -484,7 +482,6 @@ static int asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *v; - int tags_impl_skip = 0; int tags_count; char *p; @@ -516,7 +513,7 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { /* * Print out asn1_DEF__tags[] vector. */ - tags_count = emit_tags_vector(arg, expr, &tags_impl_skip, 0); + tags_count = emit_tags_vector(arg, expr); p = MKID(expr->Identifier); OUT("static asn1_SET_OF_specifics_t asn1_DEF_%s_specs = {\n", p); @@ -529,7 +526,7 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { /* * Emit asn1_DEF_xxx table. */ - emit_type_DEF(arg, expr, tags_count, tags_impl_skip, 1, + emit_type_DEF(arg, expr, tags_count, 1, ETD_CP_CONSTRUCTED, ETD_HAS_SPECIFICS); REDIR(OT_TYPE_DECLS); @@ -599,7 +596,6 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *v; int elements; /* Number of elements */ - int tags_impl_skip = 0; int comp_mode = 0; /* {root,ext=1,root,root,...} */ tag2el_t *tag2el = NULL; int tag2el_count = 0; @@ -647,7 +643,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { */ tags_count = 0; } else { - tags_count = emit_tags_vector(arg, expr, &tags_impl_skip, 1); + tags_count = emit_tags_vector(arg, expr); } /* @@ -672,7 +668,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { /* * Emit asn1_DEF_xxx table. */ - emit_type_DEF(arg, expr, tags_count, tags_impl_skip, elements, + emit_type_DEF(arg, expr, tags_count, elements, ETD_CP_CONSTRUCTED /*either?!*/, ETD_HAS_SPECIFICS); REDIR(OT_TYPE_DECLS); @@ -727,7 +723,6 @@ asn1c_lang_C_type_REFERENCE(arg_t *arg) { int asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { asn1p_expr_t *expr = arg->expr; - int tags_impl_skip = 0; int tags_count; char *p; @@ -761,9 +756,9 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { /* * Print out asn1_DEF__tags[] vector. */ - tags_count = emit_tags_vector(arg, expr, &tags_impl_skip, 0); + tags_count = emit_tags_vector(arg, expr); - emit_type_DEF(arg, expr, tags_count, tags_impl_skip, 0, + emit_type_DEF(arg, expr, tags_count, 0, ETD_CP_UNKNOWN, ETD_NO_SPECIFICS); REDIR(OT_CODE); @@ -814,11 +809,18 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("%s_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) {\n", p); INDENT(+1); { + asn1p_expr_t *terminal = asn1f_find_terminal_type_ex(arg->asn, arg->mod, expr); char *type_name = asn1c_type_name(arg, expr, TNF_SAFE); OUT("td->ber_decoder = asn1_DEF_%s.ber_decoder;\n", type_name); OUT("td->der_encoder = asn1_DEF_%s.der_encoder;\n", type_name); OUT("td->free_struct = asn1_DEF_%s.free_struct;\n", type_name); OUT("td->print_struct = asn1_DEF_%s.print_struct;\n", type_name); + if(!terminal && !tags_count) { + OUT("/* The next two lines are because of -fknown-extern-type */\n"); + OUT("td->tags = asn1_DEF_%s.tags;\n", type_name); + OUT("td->tags_count = asn1_DEF_%s.tags_count;\n", type_name); + OUT("/* End of these lines */\n"); + } OUT("td->last_tag_form = asn1_DEF_%s.last_tag_form;\n", type_name); OUT("td->elements = asn1_DEF_%s.elements;\n", type_name); OUT("td->elements_count = asn1_DEF_%s.elements_count;\n", type_name); @@ -834,8 +836,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { INDENTED( OUT("\tvoid **structure, void *bufptr, size_t size, int tag_mode) {\n"); OUT("%s_inherit_TYPE_descriptor(td);\n", p); - OUT("return td->ber_decoder(td, structure,\n"); - OUT("\tbufptr, size, tag_mode);\n"); + OUT("return td->ber_decoder(td, structure, bufptr, size, tag_mode);\n"); ); OUT("}\n"); OUT("\n"); @@ -1122,56 +1123,31 @@ emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count) { } static int -emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int *tags_impl_skip, int choice_mode) { +emit_tags_vector(arg_t *arg, asn1p_expr_t *expr) { + struct asn1p_type_tag_s *tags = 0; int tags_count = 0; - int save_target = arg->target->target; - char *p; + int i; - if(save_target != OT_IGNORE) { - int save_impl_skip = *tags_impl_skip; - REDIR(OT_IGNORE); - tags_count = emit_tags_vector(arg, expr, - tags_impl_skip, choice_mode); - REDIR(save_target); - if(tags_count) { - *tags_impl_skip = save_impl_skip; - tags_count = 0; - } else { - return 0; - } - } - + /* Fetch a chain of tags */ + tags_count = asn1f_fetch_tags(arg->asn, arg->mod, expr, &tags, 0); + if(tags_count <= 0) + return 0; - p = MKID(expr->Identifier); - OUT("static ber_tlv_tag_t asn1_DEF_%s_tags[] = {\n", p); + OUT("static ber_tlv_tag_t asn1_DEF_%s_tags[] = {\n", + MKID(expr->Identifier)); INDENT(+1); - if(expr->tag.tag_class) { - tags_count++; - _print_tag(arg, &expr->tag); - if(expr->tag.tag_mode != TM_EXPLICIT) - (*tags_impl_skip)++; - } else { - if(!choice_mode) - (*tags_impl_skip)++; - } - if(!choice_mode) { - if(!expr->tag.tag_class - || (expr->meta_type == AMT_TYPE - && expr->tag.tag_mode == TM_EXPLICIT)) { - struct asn1p_type_tag_s tag; - if(expr->tag.tag_class) - OUT(",\n"); - tag.tag_class = TC_UNIVERSAL; - tag.tag_mode = TM_IMPLICIT; - tag.tag_value = expr_type2uclass_value[expr->expr_type]; - _print_tag(arg, &tag); - tags_count++; - } + + /* Print the array of collected tags */ + for(i = 0; i < tags_count; i++) { + if(i) OUT(",\n"); + _print_tag(arg, &tags[i]); } + OUT("\n"); INDENT(-1); OUT("};\n"); + free(tags); return tags_count; } @@ -1317,7 +1293,7 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { } static int -emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, int tags_count, int tags_impl_skip, int elements_count, enum etd_cp cp, enum etd_spec spec) { +emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, int tags_count, int elements_count, enum etd_cp cp, enum etd_spec spec) { char *p; p = MKID(expr->Identifier); @@ -1355,7 +1331,6 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, int tags_count, int tags_impl_skip OUT("0,\t/* No explicit tags (count) */\n"); } - OUT("%d,\t/* Tags to skip */\n", tags_impl_skip); switch(cp) { case ETD_CP_UNKNOWN: OUT("-0,\t/* Unknown yet */\n"); diff --git a/libasn1fix/asn1fix_internal.h b/libasn1fix/asn1fix_internal.h index c37396339..040750df5 100644 --- a/libasn1fix/asn1fix_internal.h +++ b/libasn1fix/asn1fix_internal.h @@ -89,7 +89,7 @@ typedef struct arg_s { if(code < 0) { \ if(arg->debug) \ arg->debug(code, fmt, ##args); \ - } else { \ + } else if(arg->eh) { \ arg->eh(code, fmt " in %s", ##args, \ arg->mod->source_file_name); \ } \ diff --git a/libasn1fix/asn1fix_tags.c b/libasn1fix/asn1fix_tags.c index 20066e6d4..6d887980e 100644 --- a/libasn1fix/asn1fix_tags.c +++ b/libasn1fix/asn1fix_tags.c @@ -2,14 +2,20 @@ #define ADD_TAG(skip, newtag) do { \ void *__p; \ - if(skip) { skip--; break; } \ + if(skip) { \ + if(newtag.tag_mode != TM_IMPLICIT) \ + skip--; \ + break; \ + } else { \ + if(newtag.tag_mode == TM_IMPLICIT) \ + skip++; \ + } \ __p = realloc((*tags), \ sizeof(struct asn1p_type_tag_s) * (count + 1)); \ if(!__p) return -1; \ *tags = __p; \ (*tags)[count++] = newtag; \ if((flags & AFT_FETCH_OUTMOST)) return count; \ - if(newtag.tag_mode == TM_IMPLICIT) skip++; \ } while(0) static int @@ -46,11 +52,33 @@ asn1f_fetch_tags_impl(arg_t *arg, struct asn1p_type_tag_s **tags, int count, int } if(expr->meta_type == AMT_TYPEREF) { - expr = asn1f_lookup_symbol(arg, expr->module, expr->reference); - if(expr == NULL) return -1; + asn1p_expr_t *nexpr; + nexpr = asn1f_lookup_symbol(arg, expr->module, expr->reference); + if(nexpr == NULL) { + if(errno != EEXIST) /* -fknown-extern-type */ + return -1; + if(!count) + return 0; /* OK */ + if((*tags)[count-1].tag_mode == TM_IMPLICIT) { + WARNING("Tagging mode for %s " + "is IMPLICIT, assuming %s " + "has exactly one tag", + expr->Identifier, + asn1f_printable_reference(expr->reference) + ); + return count; + } + FATAL("Tagging mode %s -> %s " + "dangerously incompatible", + expr->Identifier, + asn1f_printable_reference(expr->reference) + ); + return -1; + } else { + arg->expr = nexpr; + } if(expr->_mark & TM_RECURSION) return -1; - arg->expr = expr; expr->_mark |= TM_RECURSION; count = asn1f_fetch_tags_impl(arg, tags, count, skip, flags); expr->_mark &= ~TM_RECURSION; diff --git a/libasn1fix/asn1fix_tags.h b/libasn1fix/asn1fix_tags.h index 8dd622b70..394c3e842 100644 --- a/libasn1fix/asn1fix_tags.h +++ b/libasn1fix/asn1fix_tags.h @@ -6,7 +6,6 @@ enum asn1f_aft_flags_e { AFT_FETCH_OUTMOST = 0x02, /* Fetch only outmost tag */ }; - /* * Allocate and return an array of tags for the given type. * Type1 ::= [2] EXPLICIT Type2 diff --git a/skeletons/ANY.c b/skeletons/ANY.c index 205712096..92b209d94 100644 --- a/skeletons/ANY.c +++ b/skeletons/ANY.c @@ -15,7 +15,6 @@ asn1_TYPE_descriptor_t asn1_DEF_ANY = { OCTET_STRING_free, 0, /* Use generic outmost tag fetcher */ 0, - 0, 0, /* No tags may be overridden */ -1, /* Both ways are fine (primitive and constructed) */ 0, 0, /* No members */ diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index bca34732d..7f1aa09ac 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -21,7 +21,6 @@ asn1_TYPE_descriptor_t asn1_DEF_BIT_STRING = { asn1_DEF_BIT_STRING_tags, sizeof(asn1_DEF_BIT_STRING_tags) / sizeof(asn1_DEF_BIT_STRING_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ 0, 0, /* No members */ (void *)-1 /* Special indicator that this is a BIT STRING */ diff --git a/skeletons/BMPString.c b/skeletons/BMPString.c index 6b3ceeb3c..87aaceae8 100644 --- a/skeletons/BMPString.c +++ b/skeletons/BMPString.c @@ -21,7 +21,6 @@ asn1_TYPE_descriptor_t asn1_DEF_BMPString = { asn1_DEF_BMPString_tags, sizeof(asn1_DEF_BMPString_tags) / sizeof(asn1_DEF_BMPString_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c index b0ae1786c..b7b4795ad 100644 --- a/skeletons/BOOLEAN.c +++ b/skeletons/BOOLEAN.c @@ -20,7 +20,6 @@ asn1_TYPE_descriptor_t asn1_DEF_BOOLEAN = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_BOOLEAN_tags, sizeof(asn1_DEF_BOOLEAN_tags)/sizeof(asn1_DEF_BOOLEAN_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ 0, /* Always in primitive form */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/ENUMERATED.c b/skeletons/ENUMERATED.c index 12350ef61..9c8db298e 100644 --- a/skeletons/ENUMERATED.c +++ b/skeletons/ENUMERATED.c @@ -20,7 +20,6 @@ asn1_TYPE_descriptor_t asn1_DEF_ENUMERATED = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_ENUMERATED_tags, sizeof(asn1_DEF_ENUMERATED_tags)/sizeof(asn1_DEF_ENUMERATED_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ 0, /* Primitive */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/GeneralString.c b/skeletons/GeneralString.c index db3b87d8d..feef7ccb4 100644 --- a/skeletons/GeneralString.c +++ b/skeletons/GeneralString.c @@ -21,7 +21,6 @@ asn1_TYPE_descriptor_t asn1_DEF_GeneralString = { asn1_DEF_GeneralString_tags, sizeof(asn1_DEF_GeneralString_tags) / sizeof(asn1_DEF_GeneralString_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index e84650287..c66c31455 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -85,7 +85,6 @@ asn1_TYPE_descriptor_t asn1_DEF_GeneralizedTime = { asn1_DEF_GeneralizedTime_tags, sizeof(asn1_DEF_GeneralizedTime_tags) / sizeof(asn1_DEF_GeneralizedTime_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/GraphicString.c b/skeletons/GraphicString.c index bd931467e..f6d0ae9f3 100644 --- a/skeletons/GraphicString.c +++ b/skeletons/GraphicString.c @@ -21,7 +21,6 @@ asn1_TYPE_descriptor_t asn1_DEF_GraphicString = { asn1_DEF_GraphicString_tags, sizeof(asn1_DEF_GraphicString_tags) / sizeof(asn1_DEF_GraphicString_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/IA5String.c b/skeletons/IA5String.c index e3ae82fe2..33f38a64b 100644 --- a/skeletons/IA5String.c +++ b/skeletons/IA5String.c @@ -21,7 +21,6 @@ asn1_TYPE_descriptor_t asn1_DEF_IA5String = { asn1_DEF_IA5String_tags, sizeof(asn1_DEF_IA5String_tags) / sizeof(asn1_DEF_IA5String_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 16a6b74d6..14e91c6db 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -22,7 +22,6 @@ asn1_TYPE_descriptor_t asn1_DEF_INTEGER = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_INTEGER_tags, sizeof(asn1_DEF_INTEGER_tags)/sizeof(asn1_DEF_INTEGER_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ 0, /* Always in primitive form */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/ISO646String.c b/skeletons/ISO646String.c index a86d0cec3..7ce549688 100644 --- a/skeletons/ISO646String.c +++ b/skeletons/ISO646String.c @@ -21,7 +21,6 @@ asn1_TYPE_descriptor_t asn1_DEF_ISO646String = { asn1_DEF_ISO646String_tags, sizeof(asn1_DEF_ISO646String_tags) / sizeof(asn1_DEF_ISO646String_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/NULL.c b/skeletons/NULL.c index d71d90de5..42afa7e31 100644 --- a/skeletons/NULL.c +++ b/skeletons/NULL.c @@ -21,7 +21,6 @@ asn1_TYPE_descriptor_t asn1_DEF_NULL = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_NULL_tags, sizeof(asn1_DEF_NULL_tags)/sizeof(asn1_DEF_NULL_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ 0, /* Always in primitive form */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c index 139a602b8..9c4fd8f5a 100644 --- a/skeletons/NativeEnumerated.c +++ b/skeletons/NativeEnumerated.c @@ -27,7 +27,6 @@ asn1_TYPE_descriptor_t asn1_DEF_NativeEnumerated = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_NativeEnumerated_tags, sizeof(asn1_DEF_NativeEnumerated_tags)/sizeof(asn1_DEF_NativeEnumerated_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ 0, /* Always in primitive form */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index b0cc3b713..60321cc34 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -29,7 +29,6 @@ asn1_TYPE_descriptor_t asn1_DEF_NativeInteger = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_NativeInteger_tags, sizeof(asn1_DEF_NativeInteger_tags)/sizeof(asn1_DEF_NativeInteger_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ 0, /* Always in primitive form */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/NumericString.c b/skeletons/NumericString.c index aba1c72b8..a70bb5d75 100644 --- a/skeletons/NumericString.c +++ b/skeletons/NumericString.c @@ -21,7 +21,6 @@ asn1_TYPE_descriptor_t asn1_DEF_NumericString = { asn1_DEF_NumericString_tags, sizeof(asn1_DEF_NumericString_tags) / sizeof(asn1_DEF_NumericString_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index fe209056d..a44349e2d 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -24,7 +24,6 @@ asn1_TYPE_descriptor_t asn1_DEF_OBJECT_IDENTIFIER = { asn1_DEF_OBJECT_IDENTIFIER_tags, sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags) / sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ 0, /* Always in primitive form */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 71d59d3d5..65893347a 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -23,7 +23,6 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { asn1_DEF_OCTET_STRING_tags, sizeof(asn1_DEF_OCTET_STRING_tags) / sizeof(asn1_DEF_OCTET_STRING_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine (primitive and constructed) */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/ObjectDescriptor.c b/skeletons/ObjectDescriptor.c index 3a03b978a..1f82e2b17 100644 --- a/skeletons/ObjectDescriptor.c +++ b/skeletons/ObjectDescriptor.c @@ -21,7 +21,6 @@ asn1_TYPE_descriptor_t asn1_DEF_ObjectDescriptor = { asn1_DEF_ObjectDescriptor_tags, sizeof(asn1_DEF_ObjectDescriptor_tags) / sizeof(asn1_DEF_ObjectDescriptor_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/PrintableString.c b/skeletons/PrintableString.c index 22d2fbce6..89cbf8df3 100644 --- a/skeletons/PrintableString.c +++ b/skeletons/PrintableString.c @@ -21,7 +21,6 @@ asn1_TYPE_descriptor_t asn1_DEF_PrintableString = { asn1_DEF_PrintableString_tags, sizeof(asn1_DEF_PrintableString_tags) / sizeof(asn1_DEF_PrintableString_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index 252cc3739..f1948f861 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -24,7 +24,6 @@ asn1_TYPE_descriptor_t asn1_DEF_RELATIVE_OID = { asn1_DEF_RELATIVE_OID_tags, sizeof(asn1_DEF_RELATIVE_OID_tags) / sizeof(asn1_DEF_RELATIVE_OID_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ 0, /* Always in primitive form */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/T61String.c b/skeletons/T61String.c index 2815298c2..52263744c 100644 --- a/skeletons/T61String.c +++ b/skeletons/T61String.c @@ -21,7 +21,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T61String = { asn1_DEF_T61String_tags, sizeof(asn1_DEF_T61String_tags) / sizeof(asn1_DEF_T61String_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/TeletexString.c b/skeletons/TeletexString.c index 3c20e2f77..b46caed4f 100644 --- a/skeletons/TeletexString.c +++ b/skeletons/TeletexString.c @@ -21,7 +21,6 @@ asn1_TYPE_descriptor_t asn1_DEF_TeletexString = { asn1_DEF_TeletexString_tags, sizeof(asn1_DEF_TeletexString_tags) / sizeof(asn1_DEF_TeletexString_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c index b2ca1a66f..c574e4ea3 100644 --- a/skeletons/UTCTime.c +++ b/skeletons/UTCTime.c @@ -27,7 +27,6 @@ asn1_TYPE_descriptor_t asn1_DEF_UTCTime = { asn1_DEF_UTCTime_tags, sizeof(asn1_DEF_UTCTime_tags) / sizeof(asn1_DEF_UTCTime_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/UTF8String.c b/skeletons/UTF8String.c index c96c71a4e..384600aab 100644 --- a/skeletons/UTF8String.c +++ b/skeletons/UTF8String.c @@ -21,7 +21,6 @@ asn1_TYPE_descriptor_t asn1_DEF_UTF8String = { asn1_DEF_UTF8String_tags, sizeof(asn1_DEF_UTF8String_tags) / sizeof(asn1_DEF_UTF8String_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/UniversalString.c b/skeletons/UniversalString.c index 628ed0caa..35e7bead1 100644 --- a/skeletons/UniversalString.c +++ b/skeletons/UniversalString.c @@ -21,7 +21,6 @@ asn1_TYPE_descriptor_t asn1_DEF_UniversalString = { asn1_DEF_UniversalString_tags, sizeof(asn1_DEF_UniversalString_tags) / sizeof(asn1_DEF_UniversalString_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/VideotexString.c b/skeletons/VideotexString.c index df21b149e..772c66c63 100644 --- a/skeletons/VideotexString.c +++ b/skeletons/VideotexString.c @@ -21,7 +21,6 @@ asn1_TYPE_descriptor_t asn1_DEF_VideotexString = { asn1_DEF_VideotexString_tags, sizeof(asn1_DEF_VideotexString_tags) / sizeof(asn1_DEF_VideotexString_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/VisibleString.c b/skeletons/VisibleString.c index d1a11dbef..18a27faf6 100644 --- a/skeletons/VisibleString.c +++ b/skeletons/VisibleString.c @@ -21,7 +21,6 @@ asn1_TYPE_descriptor_t asn1_DEF_VisibleString = { asn1_DEF_VisibleString_tags, sizeof(asn1_DEF_VisibleString_tags) / sizeof(asn1_DEF_VisibleString_tags[0]), - 1, /* Single UNIVERSAL tag may be implicitly overriden */ -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c index b2c08f50e..24a47ac9f 100644 --- a/skeletons/ber_decoder.c +++ b/skeletons/ber_decoder.c @@ -53,7 +53,7 @@ ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *ctx, int tagno; /* - * So what does all this tags_impl_skip stuff mean? + * So what does all this implicit skip stuff mean? * Imagine two types, * A ::= [5] IMPLICIT T * B ::= [2] EXPLICIT T @@ -74,30 +74,14 @@ ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *ctx, * it appropriately. */ - /* - * We have a list of tags that must occur in the stream: - * {A,B,C} - * However, it may be indicated that the type is - * implicitly tagged in the caller, so it really boils down to the - * {I,B,C} or even {I,C} - * This is because the implicit tag at above structure may replace - * zero or more (or every) tags which follow it. We don't care - * about the precise number, as it is already computed for us - * by the ASN.1 compiler and placed into td->tags_impl_skip. - * So let's suppose the only tag left after implicit tagging is {I}. - * Yet, the table we have is {A,B,C} and td->tags_impl_skip=3. - * We need to check at least one tag in the loop, so the loop range - * is modified so it will be invoked at least one time. - */ tagno = ctx->step /* Continuing where left previously */ - + (tag_mode==-1?(td->tags_impl_skip-1):0) + (tag_mode==1?-1:0) ; ASN_DEBUG("ber_check_tags(%s, size=%ld, tm=%d, step=%d, tagno=%d)", td->name, (long)size, tag_mode, ctx->step, tagno); //assert(td->tags_count >= 1); ?May not be the case for CHOICE or ANY. - if(tagno == td->tags_count) { + if(tag_mode == 0 && tagno == td->tags_count) { /* * This must be the _untagged_ ANY type, * which outermost tag isn't known in advance. diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 649f53b72..36412a657 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -226,8 +226,10 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, * Fetch the T from TLV. */ tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); - ASN_DEBUG("In %s SEQUENCE for %d %s next tag length %d", - td->name, edx, elements[edx].name, (int)tag_len); + ASN_DEBUG("Current tag in %s SEQUENCE for element %d " + "(%s) is %s encoded in %d bytes, left %ld", + td->name, edx, elements[edx].name, + ber_tlv_tag_string(tlv_tag), (int)tag_len, (long)LEFT); switch(tag_len) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index f103fa398..7a3133402 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -654,7 +654,6 @@ SET_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { int SET_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - asn1_SET_specifics_t *specs = (asn1_SET_specifics_t *)td->specifics; int edx; if(!sptr) { diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index e072ec539..1918b5c1d 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -74,7 +74,6 @@ typedef struct asn1_TYPE_descriptor_s { */ ber_tlv_tag_t *tags; /* At least one tag must be specified */ int tags_count; /* Number of tags which are expected */ - int tags_impl_skip; /* Tags to skip in implicit mode */ int last_tag_form; /* Acceptable form of the tag (prim, constr) */ /* diff --git a/skeletons/constraints.c b/skeletons/constraints.c index a7dce959a..862d8f1e0 100644 --- a/skeletons/constraints.c +++ b/skeletons/constraints.c @@ -112,12 +112,13 @@ _asn_i_log_error(asn_app_consume_bytes_f *cb, void *key, const char *fmt, ...) { va_start(ap, fmt); - ret = vsnprintf(buf, len, fmt, ap); + ret = vsnprintf(p, len, fmt, ap); va_end(ap); if(ret < 0 || ret >= (ssize_t)len) { ret = sizeof("") - 1; memcpy(buf, "", ret + 1); + p = buf; } - cb(buf, ret, key); + cb(p, ret, key); } diff --git a/skeletons/der_encoder.c b/skeletons/der_encoder.c index fbdccec4d..be7149256 100644 --- a/skeletons/der_encoder.c +++ b/skeletons/der_encoder.c @@ -44,12 +44,12 @@ der_write_tags(asn1_TYPE_descriptor_t *sd, ssize_t *lens; int i; - ASN_DEBUG("Writing tags (%s, tm=%d, tc=%d, iskip=%d, tag=%s, mtc=%d)", - sd->name, tag_mode, sd->tags_count, sd->tags_impl_skip, + ASN_DEBUG("Writing tags (%s, tm=%d, tc=%d, tag=%s, mtc=%d)", + sd->name, tag_mode, sd->tags_count, ber_tlv_tag_string(tag), tag_mode ?(sd->tags_count+1 - -((tag_mode==-1)?sd->tags_impl_skip:0)) + -((tag_mode == -1) && sd->tags_count)) :sd->tags_count ); @@ -67,10 +67,10 @@ der_write_tags(asn1_TYPE_descriptor_t *sd, } tags_count = sd->tags_count + 1 /* EXPLICIT or IMPLICIT tag is given */ - - ((tag_mode==-1)?sd->tags_impl_skip:0); + - ((tag_mode == -1) && sd->tags_count); /* Copy tags over */ tags[0] = tag; - stag_offset = -1 + ((tag_mode==-1)?sd->tags_impl_skip:0); + stag_offset = -1 + ((tag_mode == -1) && sd->tags_count); for(i = 1; i < tags_count; i++) tags[i] = sd->tags[i + stag_offset]; } else { diff --git a/tests/19-param-OK.asn1.-P b/tests/19-param-OK.asn1.-P index ec393c082..bed6a5ff6 100644 --- a/tests/19-param-OK.asn1.-P +++ b/tests/19-param-OK.asn1.-P @@ -117,7 +117,6 @@ asn1_TYPE_descriptor_t asn1_DEF_toBeSigned = { asn1_DEF_toBeSigned_tags, sizeof(asn1_DEF_toBeSigned_tags) /sizeof(asn1_DEF_toBeSigned_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_toBeSigned, 3, /* Elements count */ @@ -174,7 +173,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Certificate = { asn1_DEF_Certificate_tags, sizeof(asn1_DEF_Certificate_tags) /sizeof(asn1_DEF_Certificate_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_Certificate, 3, /* Elements count */ @@ -231,7 +229,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Name = { asn1_DEF_Name_tags, sizeof(asn1_DEF_Name_tags) /sizeof(asn1_DEF_Name_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_Name, 1, /* Single element */ @@ -343,7 +340,6 @@ asn1_TYPE_descriptor_t asn1_DEF_RelativeDistinguishedName = { asn1_DEF_RelativeDistinguishedName_tags, sizeof(asn1_DEF_RelativeDistinguishedName_tags) /sizeof(asn1_DEF_RelativeDistinguishedName_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_RelativeDistinguishedName, 1, /* Single element */ diff --git a/tests/31-set-of-OK.asn1.-P b/tests/31-set-of-OK.asn1.-P index b3c6ce637..e28455aef 100644 --- a/tests/31-set-of-OK.asn1.-P +++ b/tests/31-set-of-OK.asn1.-P @@ -48,7 +48,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Forest = { asn1_DEF_Forest_tags, sizeof(asn1_DEF_Forest_tags) /sizeof(asn1_DEF_Forest_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_Forest, 1, /* Single element */ @@ -120,7 +119,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Tree = { asn1_DEF_Tree_tags, sizeof(asn1_DEF_Tree_tags) /sizeof(asn1_DEF_Tree_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_Tree, 2, /* Elements count */ @@ -213,7 +211,6 @@ asn1_TYPE_descriptor_t asn1_DEF_trees = { asn1_DEF_trees_tags, sizeof(asn1_DEF_trees_tags) /sizeof(asn1_DEF_trees_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_trees, 1, /* Single element */ @@ -255,7 +252,6 @@ asn1_TYPE_descriptor_t asn1_DEF_anything_member = { asn1_DEF_anything_member_tags, sizeof(asn1_DEF_anything_member_tags) /sizeof(asn1_DEF_anything_member_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_anything_member, 1, /* Elements count */ @@ -290,7 +286,6 @@ asn1_TYPE_descriptor_t asn1_DEF_anything = { asn1_DEF_anything_tags, sizeof(asn1_DEF_anything_tags) /sizeof(asn1_DEF_anything_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_anything, 1, /* Single element */ @@ -343,7 +338,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Stuff = { asn1_DEF_Stuff_tags, sizeof(asn1_DEF_Stuff_tags) /sizeof(asn1_DEF_Stuff_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_Stuff, 2, /* Elements count */ diff --git a/tests/39-sequence-of-OK.asn1.-P b/tests/39-sequence-of-OK.asn1.-P index 2b8df8b12..a1f622bf1 100644 --- a/tests/39-sequence-of-OK.asn1.-P +++ b/tests/39-sequence-of-OK.asn1.-P @@ -57,7 +57,6 @@ asn1_TYPE_descriptor_t asn1_DEF_collection = { asn1_DEF_collection_tags, sizeof(asn1_DEF_collection_tags) /sizeof(asn1_DEF_collection_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_collection, 1, /* Single element */ @@ -106,7 +105,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { asn1_DEF_T_tags, sizeof(asn1_DEF_T_tags) /sizeof(asn1_DEF_T_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_T, 2, /* Elements count */ @@ -179,7 +177,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { asn1_DEF_T2_tags, sizeof(asn1_DEF_T2_tags) /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_T2, 2, /* Elements count */ diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index 4cdd03927..385dcb9cf 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -93,7 +93,6 @@ asn1_TYPE_descriptor_t asn1_DEF_varsets = { asn1_DEF_varsets_tags, sizeof(asn1_DEF_varsets_tags) /sizeof(asn1_DEF_varsets_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_varsets, 1, /* Single element */ @@ -142,7 +141,6 @@ asn1_TYPE_descriptor_t asn1_DEF_LogLine = { asn1_DEF_LogLine_tags, sizeof(asn1_DEF_LogLine_tags) /sizeof(asn1_DEF_LogLine_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_LogLine, 2, /* Elements count */ @@ -235,7 +233,6 @@ asn1_TYPE_descriptor_t asn1_DEF_vparts = { asn1_DEF_vparts_tags, sizeof(asn1_DEF_vparts_tags) /sizeof(asn1_DEF_vparts_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_vparts, 1, /* Single element */ @@ -284,7 +281,6 @@ asn1_TYPE_descriptor_t asn1_DEF_VariablePartSet = { asn1_DEF_VariablePartSet_tags, sizeof(asn1_DEF_VariablePartSet_tags) /sizeof(asn1_DEF_VariablePartSet_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_VariablePartSet, 2, /* Elements count */ @@ -405,7 +401,6 @@ asn1_TYPE_descriptor_t asn1_DEF_vset = { asn1_DEF_vset_tags, sizeof(asn1_DEF_vset_tags) /sizeof(asn1_DEF_vset_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_vset, 1, /* Single element */ @@ -455,7 +450,6 @@ asn1_TYPE_descriptor_t asn1_DEF_vrange = { asn1_DEF_vrange_tags, sizeof(asn1_DEF_vrange_tags) /sizeof(asn1_DEF_vrange_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_vrange, 2, /* Elements count */ @@ -501,7 +495,6 @@ asn1_TYPE_descriptor_t asn1_DEF_VariablePart = { CHOICE_outmost_tag, 0, /* No explicit tags (pointer) */ 0, /* No explicit tags (count) */ - 0, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_VariablePart, 2, /* Elements count */ @@ -590,7 +583,6 @@ asn1_TYPE_descriptor_t asn1_DEF_email = { asn1_DEF_email_tags, sizeof(asn1_DEF_email_tags) /sizeof(asn1_DEF_email_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_email, 1, /* Single element */ @@ -640,7 +632,6 @@ asn1_TYPE_descriptor_t asn1_DEF_notify = { asn1_DEF_notify_tags, sizeof(asn1_DEF_notify_tags) /sizeof(asn1_DEF_notify_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_notify, 2, /* Elements count */ @@ -689,7 +680,6 @@ asn1_TYPE_descriptor_t asn1_DEF_ActionItem = { asn1_DEF_ActionItem_tags, sizeof(asn1_DEF_ActionItem_tags) /sizeof(asn1_DEF_ActionItem_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_ActionItem, 2, /* Elements count */ diff --git a/tests/43-recursion-OK.asn1.-P b/tests/43-recursion-OK.asn1.-P index c89e881f4..18c02d7ca 100644 --- a/tests/43-recursion-OK.asn1.-P +++ b/tests/43-recursion-OK.asn1.-P @@ -66,7 +66,6 @@ asn1_TYPE_descriptor_t asn1_DEF_t_member1 = { asn1_DEF_t_member1_tags, sizeof(asn1_DEF_t_member1_tags) /sizeof(asn1_DEF_t_member1_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_t_member1, 1, /* Single element */ @@ -101,7 +100,6 @@ asn1_TYPE_descriptor_t asn1_DEF_t_member2 = { asn1_DEF_t_member2_tags, sizeof(asn1_DEF_t_member2_tags) /sizeof(asn1_DEF_t_member2_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_t_member2, 1, /* Single element */ @@ -166,7 +164,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Test_structure_1 = { asn1_DEF_Test_structure_1_tags, sizeof(asn1_DEF_Test_structure_1_tags) /sizeof(asn1_DEF_Test_structure_1_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_Test_structure_1, 4, /* Elements count */ @@ -244,7 +241,6 @@ asn1_TYPE_descriptor_t asn1_DEF_or = { asn1_DEF_or_tags, sizeof(asn1_DEF_or_tags) /sizeof(asn1_DEF_or_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_or, 1, /* Single element */ @@ -306,7 +302,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Choice_1 = { CHOICE_outmost_tag, 0, /* No explicit tags (pointer) */ 0, /* No explicit tags (count) */ - 0, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_Choice_1, 4, /* Elements count */ diff --git a/tests/44-choice-in-sequence-OK.asn1.-P b/tests/44-choice-in-sequence-OK.asn1.-P index 413ff00da..107cdb8de 100644 --- a/tests/44-choice-in-sequence-OK.asn1.-P +++ b/tests/44-choice-in-sequence-OK.asn1.-P @@ -108,7 +108,6 @@ asn1_TYPE_descriptor_t asn1_DEF_e = { CHOICE_outmost_tag, 0, /* No explicit tags (pointer) */ 0, /* No explicit tags (count) */ - 0, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_e, 2, /* Elements count */ @@ -155,7 +154,6 @@ asn1_TYPE_descriptor_t asn1_DEF_h = { CHOICE_outmost_tag, 0, /* No explicit tags (pointer) */ 0, /* No explicit tags (count) */ - 0, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_h, 2, /* Elements count */ @@ -219,7 +217,6 @@ asn1_TYPE_descriptor_t asn1_DEF_b = { CHOICE_outmost_tag, 0, /* No explicit tags (pointer) */ 0, /* No explicit tags (count) */ - 0, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_b, 4, /* Elements count */ @@ -272,7 +269,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { asn1_DEF_T_tags, sizeof(asn1_DEF_T_tags) /sizeof(asn1_DEF_T_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_T, 2, /* Elements count */ diff --git a/tests/46-redefine-OK.asn1.-PR b/tests/46-redefine-OK.asn1.-PR index c78b29f50..ea256a82a 100644 --- a/tests/46-redefine-OK.asn1.-PR +++ b/tests/46-redefine-OK.asn1.-PR @@ -49,8 +49,7 @@ ber_dec_rval_t PrimitiveType_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { PrimitiveType_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -92,7 +91,6 @@ asn1_TYPE_descriptor_t asn1_DEF_PrimitiveType = { asn1_DEF_PrimitiveType_tags, sizeof(asn1_DEF_PrimitiveType_tags) /sizeof(asn1_DEF_PrimitiveType_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -154,7 +152,6 @@ asn1_TYPE_descriptor_t asn1_DEF_ConstructedType = { asn1_DEF_ConstructedType_tags, sizeof(asn1_DEF_ConstructedType_tags) /sizeof(asn1_DEF_ConstructedType_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_ConstructedType, 1, /* Elements count */ @@ -212,8 +209,7 @@ ber_dec_rval_t T_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -255,7 +251,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { asn1_DEF_T_tags, sizeof(asn1_DEF_T_tags) /sizeof(asn1_DEF_T_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* Defined elsewhere */ 0 /* No specifics */ diff --git a/tests/47-set-ext-OK.asn1.-P b/tests/47-set-ext-OK.asn1.-P index 8354a16c8..5a3e2c106 100644 --- a/tests/47-set-ext-OK.asn1.-P +++ b/tests/47-set-ext-OK.asn1.-P @@ -73,7 +73,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T1 = { asn1_DEF_T1_tags, sizeof(asn1_DEF_T1_tags) /sizeof(asn1_DEF_T1_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_T1, 1, /* Elements count */ @@ -155,7 +154,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { asn1_DEF_T2_tags, sizeof(asn1_DEF_T2_tags) /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_T2, 1, /* Elements count */ @@ -227,7 +225,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T3 = { CHOICE_outmost_tag, 0, /* No explicit tags (pointer) */ 0, /* No explicit tags (count) */ - 0, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_T3, 1, /* Elements count */ @@ -299,7 +296,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T4 = { CHOICE_outmost_tag, 0, /* No explicit tags (pointer) */ 0, /* No explicit tags (count) */ - 0, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_T4, 1, /* Elements count */ diff --git a/tests/50-constraint-OK.asn1.-P b/tests/50-constraint-OK.asn1.-P index 3ae2200a1..4459f5359 100644 --- a/tests/50-constraint-OK.asn1.-P +++ b/tests/50-constraint-OK.asn1.-P @@ -49,8 +49,7 @@ ber_dec_rval_t Int1_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Int1_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -92,7 +91,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Int1 = { asn1_DEF_Int1_tags, sizeof(asn1_DEF_Int1_tags) /sizeof(asn1_DEF_Int1_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -167,8 +165,7 @@ ber_dec_rval_t Int2_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Int2_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -197,7 +194,7 @@ Int2_free(asn1_TYPE_descriptor_t *td, /*** <<< STAT-DEFS [Int2] >>> ***/ static ber_tlv_tag_t asn1_DEF_Int2_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_Int2 = { "Int2", @@ -210,7 +207,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Int2 = { asn1_DEF_Int2_tags, sizeof(asn1_DEF_Int2_tags) /sizeof(asn1_DEF_Int2_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -289,8 +285,7 @@ ber_dec_rval_t Int3_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Int3_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -319,7 +314,7 @@ Int3_free(asn1_TYPE_descriptor_t *td, /*** <<< STAT-DEFS [Int3] >>> ***/ static ber_tlv_tag_t asn1_DEF_Int3_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_Int3 = { "Int3", @@ -332,7 +327,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Int3 = { asn1_DEF_Int3_tags, sizeof(asn1_DEF_Int3_tags) /sizeof(asn1_DEF_Int3_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -411,8 +405,7 @@ ber_dec_rval_t Int4_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Int4_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -441,7 +434,7 @@ Int4_free(asn1_TYPE_descriptor_t *td, /*** <<< STAT-DEFS [Int4] >>> ***/ static ber_tlv_tag_t asn1_DEF_Int4_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_Int4 = { "Int4", @@ -454,7 +447,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Int4 = { asn1_DEF_Int4_tags, sizeof(asn1_DEF_Int4_tags) /sizeof(asn1_DEF_Int4_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -533,8 +525,7 @@ ber_dec_rval_t Int5_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Int5_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -563,7 +554,7 @@ Int5_free(asn1_TYPE_descriptor_t *td, /*** <<< STAT-DEFS [Int5] >>> ***/ static ber_tlv_tag_t asn1_DEF_Int5_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_Int5 = { "Int5", @@ -576,7 +567,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Int5 = { asn1_DEF_Int5_tags, sizeof(asn1_DEF_Int5_tags) /sizeof(asn1_DEF_Int5_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -655,8 +645,7 @@ ber_dec_rval_t ExtensibleExtensions_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { ExtensibleExtensions_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -698,7 +687,6 @@ asn1_TYPE_descriptor_t asn1_DEF_ExtensibleExtensions = { asn1_DEF_ExtensibleExtensions_tags, sizeof(asn1_DEF_ExtensibleExtensions_tags) /sizeof(asn1_DEF_ExtensibleExtensions_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -755,8 +743,7 @@ ber_dec_rval_t Str1_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Str1_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -798,7 +785,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Str1 = { asn1_DEF_Str1_tags, sizeof(asn1_DEF_Str1_tags) /sizeof(asn1_DEF_Str1_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -889,8 +875,7 @@ ber_dec_rval_t Str2_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Str2_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -919,7 +904,7 @@ Str2_free(asn1_TYPE_descriptor_t *td, /*** <<< STAT-DEFS [Str2] >>> ***/ static ber_tlv_tag_t asn1_DEF_Str2_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_Str2 = { "Str2", @@ -932,7 +917,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Str2 = { asn1_DEF_Str2_tags, sizeof(asn1_DEF_Str2_tags) /sizeof(asn1_DEF_Str2_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -1034,8 +1018,7 @@ ber_dec_rval_t Str3_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Str3_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -1064,7 +1047,7 @@ Str3_free(asn1_TYPE_descriptor_t *td, /*** <<< STAT-DEFS [Str3] >>> ***/ static ber_tlv_tag_t asn1_DEF_Str3_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_Str3 = { "Str3", @@ -1077,7 +1060,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Str3 = { asn1_DEF_Str3_tags, sizeof(asn1_DEF_Str3_tags) /sizeof(asn1_DEF_Str3_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -1165,8 +1147,7 @@ ber_dec_rval_t Str4_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Str4_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -1208,7 +1189,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Str4 = { asn1_DEF_Str4_tags, sizeof(asn1_DEF_Str4_tags) /sizeof(asn1_DEF_Str4_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -1296,8 +1276,7 @@ ber_dec_rval_t PER_Visible_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { PER_Visible_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -1339,7 +1318,6 @@ asn1_TYPE_descriptor_t asn1_DEF_PER_Visible = { asn1_DEF_PER_Visible_tags, sizeof(asn1_DEF_PER_Visible_tags) /sizeof(asn1_DEF_PER_Visible_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -1427,8 +1405,7 @@ ber_dec_rval_t PER_Visible_2_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { PER_Visible_2_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -1457,7 +1434,7 @@ PER_Visible_2_free(asn1_TYPE_descriptor_t *td, /*** <<< STAT-DEFS [PER-Visible-2] >>> ***/ static ber_tlv_tag_t asn1_DEF_PER_Visible_2_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_PER_Visible_2 = { "PER-Visible-2", @@ -1470,7 +1447,6 @@ asn1_TYPE_descriptor_t asn1_DEF_PER_Visible_2 = { asn1_DEF_PER_Visible_2_tags, sizeof(asn1_DEF_PER_Visible_2_tags) /sizeof(asn1_DEF_PER_Visible_2_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -1558,8 +1534,7 @@ ber_dec_rval_t Not_PER_Visible_1_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Not_PER_Visible_1_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -1588,7 +1563,7 @@ Not_PER_Visible_1_free(asn1_TYPE_descriptor_t *td, /*** <<< STAT-DEFS [Not-PER-Visible-1] >>> ***/ static ber_tlv_tag_t asn1_DEF_Not_PER_Visible_1_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_1 = { "Not-PER-Visible-1", @@ -1601,7 +1576,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_1 = { asn1_DEF_Not_PER_Visible_1_tags, sizeof(asn1_DEF_Not_PER_Visible_1_tags) /sizeof(asn1_DEF_Not_PER_Visible_1_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -1689,8 +1663,7 @@ ber_dec_rval_t Not_PER_Visible_2_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Not_PER_Visible_2_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -1719,7 +1692,7 @@ Not_PER_Visible_2_free(asn1_TYPE_descriptor_t *td, /*** <<< STAT-DEFS [Not-PER-Visible-2] >>> ***/ static ber_tlv_tag_t asn1_DEF_Not_PER_Visible_2_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_2 = { "Not-PER-Visible-2", @@ -1732,7 +1705,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_2 = { asn1_DEF_Not_PER_Visible_2_tags, sizeof(asn1_DEF_Not_PER_Visible_2_tags) /sizeof(asn1_DEF_Not_PER_Visible_2_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -1820,8 +1792,7 @@ ber_dec_rval_t Not_PER_Visible_3_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Not_PER_Visible_3_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -1850,7 +1821,7 @@ Not_PER_Visible_3_free(asn1_TYPE_descriptor_t *td, /*** <<< STAT-DEFS [Not-PER-Visible-3] >>> ***/ static ber_tlv_tag_t asn1_DEF_Not_PER_Visible_3_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_3 = { "Not-PER-Visible-3", @@ -1863,7 +1834,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_3 = { asn1_DEF_Not_PER_Visible_3_tags, sizeof(asn1_DEF_Not_PER_Visible_3_tags) /sizeof(asn1_DEF_Not_PER_Visible_3_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -1954,8 +1924,7 @@ ber_dec_rval_t SIZE_but_not_FROM_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { SIZE_but_not_FROM_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -1984,7 +1953,7 @@ SIZE_but_not_FROM_free(asn1_TYPE_descriptor_t *td, /*** <<< STAT-DEFS [SIZE-but-not-FROM] >>> ***/ static ber_tlv_tag_t asn1_DEF_SIZE_but_not_FROM_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_SIZE_but_not_FROM = { "SIZE-but-not-FROM", @@ -1997,7 +1966,6 @@ asn1_TYPE_descriptor_t asn1_DEF_SIZE_but_not_FROM = { asn1_DEF_SIZE_but_not_FROM_tags, sizeof(asn1_DEF_SIZE_but_not_FROM_tags) /sizeof(asn1_DEF_SIZE_but_not_FROM_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -2088,8 +2056,7 @@ ber_dec_rval_t SIZE_and_FROM_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { SIZE_and_FROM_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -2118,7 +2085,7 @@ SIZE_and_FROM_free(asn1_TYPE_descriptor_t *td, /*** <<< STAT-DEFS [SIZE-and-FROM] >>> ***/ static ber_tlv_tag_t asn1_DEF_SIZE_and_FROM_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_SIZE_and_FROM = { "SIZE-and-FROM", @@ -2131,7 +2098,6 @@ asn1_TYPE_descriptor_t asn1_DEF_SIZE_and_FROM = { asn1_DEF_SIZE_and_FROM_tags, sizeof(asn1_DEF_SIZE_and_FROM_tags) /sizeof(asn1_DEF_SIZE_and_FROM_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -2219,8 +2185,7 @@ ber_dec_rval_t Neither_SIZE_nor_FROM_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Neither_SIZE_nor_FROM_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -2249,7 +2214,7 @@ Neither_SIZE_nor_FROM_free(asn1_TYPE_descriptor_t *td, /*** <<< STAT-DEFS [Neither-SIZE-nor-FROM] >>> ***/ static ber_tlv_tag_t asn1_DEF_Neither_SIZE_nor_FROM_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_Neither_SIZE_nor_FROM = { "Neither-SIZE-nor-FROM", @@ -2262,7 +2227,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Neither_SIZE_nor_FROM = { asn1_DEF_Neither_SIZE_nor_FROM_tags, sizeof(asn1_DEF_Neither_SIZE_nor_FROM_tags) /sizeof(asn1_DEF_Neither_SIZE_nor_FROM_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -2367,8 +2331,7 @@ ber_dec_rval_t Utf8_3_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Utf8_3_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -2397,7 +2360,7 @@ Utf8_3_free(asn1_TYPE_descriptor_t *td, /*** <<< STAT-DEFS [Utf8-3] >>> ***/ static ber_tlv_tag_t asn1_DEF_Utf8_3_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_Utf8_3 = { "Utf8-3", @@ -2410,7 +2373,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Utf8_3 = { asn1_DEF_Utf8_3_tags, sizeof(asn1_DEF_Utf8_3_tags) /sizeof(asn1_DEF_Utf8_3_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -2485,8 +2447,7 @@ ber_dec_rval_t Utf8_2_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Utf8_2_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -2515,7 +2476,7 @@ Utf8_2_free(asn1_TYPE_descriptor_t *td, /*** <<< STAT-DEFS [Utf8-2] >>> ***/ static ber_tlv_tag_t asn1_DEF_Utf8_2_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (0 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_Utf8_2 = { "Utf8-2", @@ -2528,7 +2489,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Utf8_2 = { asn1_DEF_Utf8_2_tags, sizeof(asn1_DEF_Utf8_2_tags) /sizeof(asn1_DEF_Utf8_2_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -2585,8 +2545,7 @@ ber_dec_rval_t Utf8_1_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Utf8_1_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, - bufptr, size, tag_mode); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); } der_enc_rval_t @@ -2628,7 +2587,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Utf8_1 = { asn1_DEF_Utf8_1_tags, sizeof(asn1_DEF_Utf8_1_tags) /sizeof(asn1_DEF_Utf8_1_tags[0]), /* 1 */ - 1, /* Tags to skip */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/tests/60-any-OK.asn1.-P b/tests/60-any-OK.asn1.-P index 96098a58d..86d47f4b7 100644 --- a/tests/60-any-OK.asn1.-P +++ b/tests/60-any-OK.asn1.-P @@ -63,7 +63,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T1 = { asn1_DEF_T1_tags, sizeof(asn1_DEF_T1_tags) /sizeof(asn1_DEF_T1_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_T1, 2, /* Elements count */ @@ -136,7 +135,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { asn1_DEF_T2_tags, sizeof(asn1_DEF_T2_tags) /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ - 1, /* Tags to skip */ 1, /* Whether CONSTRUCTED */ asn1_MBR_T2, 2, /* Elements count */ diff --git a/tests/65-multi-tag-OK.asn1 b/tests/65-multi-tag-OK.asn1 new file mode 100644 index 000000000..32e85cc30 --- /dev/null +++ b/tests/65-multi-tag-OK.asn1 @@ -0,0 +1,29 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .65 + +ModuleTestMultipleTags + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 65 } + DEFINITIONS ::= +BEGIN + + T1 ::= [2] EXPLICIT T2 + T2 ::= [3] EXPLICIT T3 + T3 ::= [4] IMPLICIT T4 + T4 ::= [5] EXPLICIT T5 + T5 ::= [6] IMPLICIT T6 + T6 ::= INTEGER + + T ::= [0] IMPLICIT Ts + + Ts ::= [123] IMPLICIT SEQUENCE { + m1 [1] IMPLICIT T2, -- [1][4][6] + m2 [2] EXPLICIT T3 OPTIONAL, -- [2][4][6] + m3 [3] IMPLICIT T3 -- [3][6] + } + +END diff --git a/tests/65-multi-tag-OK.asn1.-P b/tests/65-multi-tag-OK.asn1.-P new file mode 100644 index 000000000..fec7c9cb3 --- /dev/null +++ b/tests/65-multi-tag-OK.asn1.-P @@ -0,0 +1,774 @@ + +/*** <<< INCLUDES [T1] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [T1] >>> ***/ + + +typedef T2_t T1_t; + +/*** <<< FUNC-DECLS [T1] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_T1; +asn_constr_check_f T1_constraint; +ber_type_decoder_f T1_decode_ber; +der_type_encoder_f T1_encode_der; +asn_struct_print_f T1_print; +asn_struct_free_f T1_free; + +/*** <<< CODE [T1] >>> ***/ + +int +T1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_T2.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using T2, + * so adjust the DEF appropriately. + */ +static void +T1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_T2.ber_decoder; + td->der_encoder = asn1_DEF_T2.der_encoder; + td->free_struct = asn1_DEF_T2.free_struct; + td->print_struct = asn1_DEF_T2.print_struct; + td->last_tag_form = asn1_DEF_T2.last_tag_form; + td->elements = asn1_DEF_T2.elements; + td->elements_count = asn1_DEF_T2.elements_count; + td->specifics = asn1_DEF_T2.specifics; +} + +ber_dec_rval_t +T1_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + T1_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); +} + +der_enc_rval_t +T1_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + T1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +T1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +T1_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [T1] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_T1_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + (ASN_TAG_CLASS_CONTEXT | (6 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_T1 = { + "T1", + T1_constraint, + T1_decode_ber, + T1_encode_der, + T1_print, + T1_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T1_tags, + sizeof(asn1_DEF_T1_tags) + /sizeof(asn1_DEF_T1_tags[0]), /* 4 */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [T2] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [T2] >>> ***/ + + +typedef T3_t T2_t; + +/*** <<< FUNC-DECLS [T2] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_T2; +asn_constr_check_f T2_constraint; +ber_type_decoder_f T2_decode_ber; +der_type_encoder_f T2_encode_der; +asn_struct_print_f T2_print; +asn_struct_free_f T2_free; + +/*** <<< CODE [T2] >>> ***/ + +int +T2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_T3.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using T3, + * so adjust the DEF appropriately. + */ +static void +T2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_T3.ber_decoder; + td->der_encoder = asn1_DEF_T3.der_encoder; + td->free_struct = asn1_DEF_T3.free_struct; + td->print_struct = asn1_DEF_T3.print_struct; + td->last_tag_form = asn1_DEF_T3.last_tag_form; + td->elements = asn1_DEF_T3.elements; + td->elements_count = asn1_DEF_T3.elements_count; + td->specifics = asn1_DEF_T3.specifics; +} + +ber_dec_rval_t +T2_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + T2_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); +} + +der_enc_rval_t +T2_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + T2_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +T2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T2_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +T2_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T2_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [T2] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_T2_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + (ASN_TAG_CLASS_CONTEXT | (6 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_T2 = { + "T2", + T2_constraint, + T2_decode_ber, + T2_encode_der, + T2_print, + T2_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T2_tags, + sizeof(asn1_DEF_T2_tags) + /sizeof(asn1_DEF_T2_tags[0]), /* 3 */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [T3] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [T3] >>> ***/ + + +typedef T4_t T3_t; + +/*** <<< FUNC-DECLS [T3] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_T3; +asn_constr_check_f T3_constraint; +ber_type_decoder_f T3_decode_ber; +der_type_encoder_f T3_encode_der; +asn_struct_print_f T3_print; +asn_struct_free_f T3_free; + +/*** <<< CODE [T3] >>> ***/ + +int +T3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_T4.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using T4, + * so adjust the DEF appropriately. + */ +static void +T3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_T4.ber_decoder; + td->der_encoder = asn1_DEF_T4.der_encoder; + td->free_struct = asn1_DEF_T4.free_struct; + td->print_struct = asn1_DEF_T4.print_struct; + td->last_tag_form = asn1_DEF_T4.last_tag_form; + td->elements = asn1_DEF_T4.elements; + td->elements_count = asn1_DEF_T4.elements_count; + td->specifics = asn1_DEF_T4.specifics; +} + +ber_dec_rval_t +T3_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + T3_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); +} + +der_enc_rval_t +T3_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + T3_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +T3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T3_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +T3_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T3_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [T3] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_T3_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + (ASN_TAG_CLASS_CONTEXT | (6 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_T3 = { + "T3", + T3_constraint, + T3_decode_ber, + T3_encode_der, + T3_print, + T3_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T3_tags, + sizeof(asn1_DEF_T3_tags) + /sizeof(asn1_DEF_T3_tags[0]), /* 2 */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [T4] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [T4] >>> ***/ + + +typedef T5_t T4_t; + +/*** <<< FUNC-DECLS [T4] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_T4; +asn_constr_check_f T4_constraint; +ber_type_decoder_f T4_decode_ber; +der_type_encoder_f T4_encode_der; +asn_struct_print_f T4_print; +asn_struct_free_f T4_free; + +/*** <<< CODE [T4] >>> ***/ + +int +T4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_T5.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using T5, + * so adjust the DEF appropriately. + */ +static void +T4_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_T5.ber_decoder; + td->der_encoder = asn1_DEF_T5.der_encoder; + td->free_struct = asn1_DEF_T5.free_struct; + td->print_struct = asn1_DEF_T5.print_struct; + td->last_tag_form = asn1_DEF_T5.last_tag_form; + td->elements = asn1_DEF_T5.elements; + td->elements_count = asn1_DEF_T5.elements_count; + td->specifics = asn1_DEF_T5.specifics; +} + +ber_dec_rval_t +T4_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + T4_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); +} + +der_enc_rval_t +T4_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + T4_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +T4_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T4_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +T4_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T4_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [T4] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_T4_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (5 << 2)), + (ASN_TAG_CLASS_CONTEXT | (6 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_T4 = { + "T4", + T4_constraint, + T4_decode_ber, + T4_encode_der, + T4_print, + T4_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T4_tags, + sizeof(asn1_DEF_T4_tags) + /sizeof(asn1_DEF_T4_tags[0]), /* 2 */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [T5] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [T5] >>> ***/ + + +typedef T6_t T5_t; + +/*** <<< FUNC-DECLS [T5] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_T5; +asn_constr_check_f T5_constraint; +ber_type_decoder_f T5_decode_ber; +der_type_encoder_f T5_encode_der; +asn_struct_print_f T5_print; +asn_struct_free_f T5_free; + +/*** <<< CODE [T5] >>> ***/ + +int +T5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_T6.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using T6, + * so adjust the DEF appropriately. + */ +static void +T5_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_T6.ber_decoder; + td->der_encoder = asn1_DEF_T6.der_encoder; + td->free_struct = asn1_DEF_T6.free_struct; + td->print_struct = asn1_DEF_T6.print_struct; + td->last_tag_form = asn1_DEF_T6.last_tag_form; + td->elements = asn1_DEF_T6.elements; + td->elements_count = asn1_DEF_T6.elements_count; + td->specifics = asn1_DEF_T6.specifics; +} + +ber_dec_rval_t +T5_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + T5_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); +} + +der_enc_rval_t +T5_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + T5_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +T5_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T5_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +T5_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T5_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [T5] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_T5_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (6 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_T5 = { + "T5", + T5_constraint, + T5_decode_ber, + T5_encode_der, + T5_print, + T5_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T5_tags, + sizeof(asn1_DEF_T5_tags) + /sizeof(asn1_DEF_T5_tags[0]), /* 1 */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [T6] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [T6] >>> ***/ + + +typedef INTEGER_t T6_t; + +/*** <<< FUNC-DECLS [T6] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_T6; +asn_constr_check_f T6_constraint; +ber_type_decoder_f T6_decode_ber; +der_type_encoder_f T6_encode_der; +asn_struct_print_f T6_print; +asn_struct_free_f T6_free; + +/*** <<< CODE [T6] >>> ***/ + +int +T6_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_INTEGER.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using INTEGER, + * so adjust the DEF appropriately. + */ +static void +T6_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_INTEGER.ber_decoder; + td->der_encoder = asn1_DEF_INTEGER.der_encoder; + td->free_struct = asn1_DEF_INTEGER.free_struct; + td->print_struct = asn1_DEF_INTEGER.print_struct; + td->last_tag_form = asn1_DEF_INTEGER.last_tag_form; + td->elements = asn1_DEF_INTEGER.elements; + td->elements_count = asn1_DEF_INTEGER.elements_count; + td->specifics = asn1_DEF_INTEGER.specifics; +} + +ber_dec_rval_t +T6_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + T6_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); +} + +der_enc_rval_t +T6_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + T6_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +T6_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T6_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +T6_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T6_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [T6] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_T6_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_T6 = { + "T6", + T6_constraint, + T6_decode_ber, + T6_encode_der, + T6_print, + T6_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T6_tags, + sizeof(asn1_DEF_T6_tags) + /sizeof(asn1_DEF_T6_tags[0]), /* 1 */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [T] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [T] >>> ***/ + + +typedef Ts_t T_t; + +/*** <<< FUNC-DECLS [T] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_T; +asn_constr_check_f T_constraint; +ber_type_decoder_f T_decode_ber; +der_type_encoder_f T_encode_der; +asn_struct_print_f T_print; +asn_struct_free_f T_free; + +/*** <<< CODE [T] >>> ***/ + +int +T_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_Ts.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using Ts, + * so adjust the DEF appropriately. + */ +static void +T_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_Ts.ber_decoder; + td->der_encoder = asn1_DEF_Ts.der_encoder; + td->free_struct = asn1_DEF_Ts.free_struct; + td->print_struct = asn1_DEF_Ts.print_struct; + td->last_tag_form = asn1_DEF_Ts.last_tag_form; + td->elements = asn1_DEF_Ts.elements; + td->elements_count = asn1_DEF_Ts.elements_count; + td->specifics = asn1_DEF_Ts.specifics; +} + +ber_dec_rval_t +T_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + T_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); +} + +der_enc_rval_t +T_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + T_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +T_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +T_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [T] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_T_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (0 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_T = { + "T", + T_constraint, + T_decode_ber, + T_encode_der, + T_print, + T_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T_tags, + sizeof(asn1_DEF_T_tags) + /sizeof(asn1_DEF_T_tags[0]), /* 1 */ + -0, /* Unknown yet */ + 0, 0, /* Defined elsewhere */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Ts] >>> ***/ + +#include +#include +#include + +/*** <<< DEPS [Ts] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Ts; + +/*** <<< TYPE-DECLS [Ts] >>> ***/ + + +typedef struct Ts { + T2_t m1; + T3_t *m2 /* OPTIONAL */; + T3_t m3; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} Ts_t; + +/*** <<< STAT-DEFS [Ts] >>> ***/ + +static asn1_TYPE_member_t asn1_MBR_Ts[] = { + { ATF_NOFLAGS, 0, offsetof(struct Ts, m1), + .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn1_DEF_T2, + .memb_constraints = 0, /* Defer to actual type */ + .name = "m1" + }, + { ATF_POINTER, 1, offsetof(struct Ts, m2), + .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + .tag_mode = +1, /* EXPLICIT tag at current level */ + .type = (void *)&asn1_DEF_T3, + .memb_constraints = 0, /* Defer to actual type */ + .name = "m2" + }, + { ATF_NOFLAGS, 0, offsetof(struct Ts, m3), + .tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn1_DEF_T3, + .memb_constraints = 0, /* Defer to actual type */ + .name = "m3" + }, +}; +static ber_tlv_tag_t asn1_DEF_Ts_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (123 << 2)) +}; +static asn1_TYPE_tag2member_t asn1_DEF_Ts_tag2el[] = { + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* m1 at 24 */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* m2 at 25 */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* m3 at 27 */ +}; +static asn1_SEQUENCE_specifics_t asn1_DEF_Ts_specs = { + sizeof(struct Ts), + offsetof(struct Ts, _ber_dec_ctx), + asn1_DEF_Ts_tag2el, + 3, /* Count of tags in the map */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn1_TYPE_descriptor_t asn1_DEF_Ts = { + "Ts", + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_print, + SEQUENCE_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Ts_tags, + sizeof(asn1_DEF_Ts_tags) + /sizeof(asn1_DEF_Ts_tags[0]), /* 1 */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_Ts, + 3, /* Elements count */ + &asn1_DEF_Ts_specs /* Additional specs */ +}; + From 6dffddc930616f581d22bc3e5c5f38a890141258 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 10 Sep 2004 16:15:58 +0000 Subject: [PATCH 0308/1469] doc files git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@308 59561ff5-6e30-0410-9f3c-9617f08c8826 --- Makefile.am | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Makefile.am b/Makefile.am index ddb7a4b8d..2b6d1e95d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -6,3 +6,7 @@ SUBDIRS = \ doc asn1c EXTRA_DIST = BUGS MANIFEST + +docsdir = $(datadir)/doc/asn1c + +docs_DATA = INSTALL README FAQ BUGS TODO From 69e185d15f4127e19fad9aa423560e331d55405c Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 10 Sep 2004 16:17:03 +0000 Subject: [PATCH 0309/1469] updated git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@309 59561ff5-6e30-0410-9f3c-9617f08c8826 --- Makefile.in | 47 ++++++++++++++++++++++++++++++--------- libasn1parser/Makefile.in | 4 ++-- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/Makefile.in b/Makefile.in index a7cea99a0..ce718abde 100644 --- a/Makefile.in +++ b/Makefile.in @@ -13,6 +13,7 @@ # PARTICULAR PURPOSE. @SET_MAKE@ + srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ @@ -57,6 +58,9 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive +am__installdirs = "$(DESTDIR)$(docsdir)" +docsDATA_INSTALL = $(INSTALL_DATA) +DATA = $(docs_DATA) ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) @@ -188,6 +192,8 @@ SUBDIRS = \ doc asn1c EXTRA_DIST = BUGS MANIFEST +docsdir = $(datadir)/doc/asn1c +docs_DATA = INSTALL README FAQ BUGS TODO all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive @@ -252,6 +258,23 @@ clean-libtool: distclean-libtool: -rm -f libtool uninstall-info-am: +install-docsDATA: $(docs_DATA) + @$(NORMAL_INSTALL) + test -z "$(docsdir)" || $(mkdir_p) "$(DESTDIR)$(docsdir)" + @list='$(docs_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " $(docsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(docsdir)/$$f'"; \ + $(docsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(docsdir)/$$f"; \ + done + +uninstall-docsDATA: + @$(NORMAL_UNINSTALL) + @list='$(docs_DATA)'; for p in $$list; do \ + f="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " rm -f '$(DESTDIR)$(docsdir)/$$f'"; \ + rm -f "$(DESTDIR)$(docsdir)/$$f"; \ + done # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. @@ -514,9 +537,12 @@ distcleancheck: distclean exit 1; } >&2 check-am: all-am check: check-recursive -all-am: Makefile config.h +all-am: Makefile $(DATA) config.h installdirs: installdirs-recursive installdirs-am: + for dir in "$(DESTDIR)$(docsdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive @@ -561,7 +587,7 @@ info: info-recursive info-am: -install-data-am: +install-data-am: install-docsDATA install-exec-am: @@ -589,7 +615,7 @@ ps: ps-recursive ps-am: -uninstall-am: uninstall-info-am +uninstall-am: uninstall-docsDATA uninstall-info-am uninstall-info: uninstall-info-recursive @@ -600,13 +626,14 @@ uninstall-info: uninstall-info-recursive distclean-generic distclean-hdr distclean-libtool \ distclean-recursive distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - installdirs-am maintainer-clean maintainer-clean-generic \ - maintainer-clean-recursive mostlyclean mostlyclean-generic \ - mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \ - tags tags-recursive uninstall uninstall-am uninstall-info-am + install install-am install-data install-data-am \ + install-docsDATA install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic maintainer-clean-recursive \ + mostlyclean mostlyclean-generic mostlyclean-libtool \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-docsDATA uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index 812ef45da..eba1ca00c 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -448,9 +448,9 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." - -rm -f asn1p_y.c - -rm -f asn1p_l.c -rm -f asn1p_y.h + -rm -f asn1p_l.c + -rm -f asn1p_y.c clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ From 83204112b91eff1dbd5498e032735115503e8c31 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 13 Sep 2004 08:26:57 +0000 Subject: [PATCH 0310/1469] added type2any and any2type conversion routines git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@310 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ANY.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++- skeletons/ANY.h | 7 +++ 2 files changed, 120 insertions(+), 2 deletions(-) diff --git a/skeletons/ANY.c b/skeletons/ANY.c index 92b209d94..389452cdb 100644 --- a/skeletons/ANY.c +++ b/skeletons/ANY.c @@ -14,9 +14,120 @@ asn1_TYPE_descriptor_t asn1_DEF_ANY = { OCTET_STRING_print, OCTET_STRING_free, 0, /* Use generic outmost tag fetcher */ - 0, - 0, /* No tags may be overridden */ + 0, 0, 0, 0, -1, /* Both ways are fine (primitive and constructed) */ 0, 0, /* No members */ (void *)1 /* Special indicator that this is an ANY type */ }; + + +struct _callback_arg { + uint8_t *buffer; + size_t offset; + size_t size; +}; + +static int ANY__consume_bytes(const void *buffer, size_t size, void *key); + +int +ANY_fromType(ANY_t *st, asn1_TYPE_descriptor_t *td, void *sptr) { + struct _callback_arg arg; + der_enc_rval_t erval; + + if(!st || !td) { + errno = EINVAL; + return -1; + } + + if(!sptr) { + if(st->buf) FREEMEM(st->buf); + st->size = 0; + return 0; + } + + arg.offset = arg.size = 0; + arg.buffer = 0; + + erval = der_encode(td, sptr, ANY__consume_bytes, &arg); + if(erval.encoded == -1) { + if(arg.buffer) FREEMEM(arg.buffer); + return -1; + } + assert(erval.encoded == arg.offset); + + if(st->buf) FREEMEM(st->buf); + st->buf = arg.buffer; + st->size = arg.offset; + + return 0; +} + +ANY_t * +ANY_new_fromType(asn1_TYPE_descriptor_t *td, void *sptr) { + ANY_t tmp; + ANY_t *st; + + if(!td || !sptr) { + errno = EINVAL; + return 0; + } + + memset(&tmp, 0, sizeof(tmp)); + + if(ANY_fromType(&tmp, td, sptr)) return 0; + + st = (ANY_t *)MALLOC(sizeof(*st)); + if(st) { + *st = tmp; + return st; + } else { + FREEMEM(tmp.buf); + return 0; + } +} + +int +ANY_to_type(ANY_t *st, asn1_TYPE_descriptor_t *td, void **struct_ptr) { + ber_dec_rval_t rval; + void *newst = 0; + + if(!st || !td || !struct_ptr) { + errno = EINVAL; + return -1; + } + + if(st->buf == 0) { + /* Nothing to convert, make it empty. */ + *struct_ptr = (void *)0; + return 0; + } + + rval = ber_decode(td, (void **)&newst, st->buf, st->size); + if(rval.code == RC_OK) { + *struct_ptr = newst; + return 0; + } else { + /* Remove possibly partially decoded data. */ + td->free_struct(td, newst, 0); + return -1; + } +} + +static int ANY__consume_bytes(const void *buffer, size_t size, void *key) { + struct _callback_arg *arg = (struct _callback_arg *)key; + + if((arg->offset + size) >= arg->size) { + size_t nsize = (arg->size ? arg->size << 2 : 16) + size; + void *p = REALLOC(arg->buffer, nsize); + if(!p) return -1; + (void *)arg->buffer = p; + arg->size = nsize; + } + + memcpy(arg->buffer + arg->offset, buffer, size); + arg->offset += size; + assert(arg->offset < arg->size); + + return 0; +} + diff --git a/skeletons/ANY.h b/skeletons/ANY.h index 0f10e1013..719b3a993 100644 --- a/skeletons/ANY.h +++ b/skeletons/ANY.h @@ -26,6 +26,13 @@ asn_struct_free_f ANY_free; * Handy conversion routines. * ******************************/ +/* Convert another ASN.1 type into the ANY. This implies DER encoding. */ +int ANY_fromType(ANY_t *, asn1_TYPE_descriptor_t *td, void *struct_ptr); +ANY_t *ANY_new_fromType(asn1_TYPE_descriptor_t *td, void *struct_ptr); + +/* Convert the contents of the ANY type into the specified type. */ +int ANY_to_type(ANY_t *, asn1_TYPE_descriptor_t *td, void **struct_ptr); + #define ANY_fromBuf(s, buf, size) OCTET_STRING_fromBuf((s), (buf), (size)) #define ANY_new_fromBuf(buf, size) OCTET_STRING_new_fromBuf((buf), (size)) From 72425de1aa8e5a89ace3836027d75a5791aa022c Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 13 Sep 2004 08:31:01 +0000 Subject: [PATCH 0311/1469] inner structures tagging fix. see 0.9.5 comment in ChangeLog git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@311 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-25.c | 27 ++-- libasn1compiler/asn1c_C.c | 164 ++++++++++++++++++------- libasn1fix/asn1fix_tags.c | 2 +- libasn1fix/asn1fix_tags.h | 1 + skeletons/BIT_STRING.c | 3 + skeletons/BMPString.c | 6 +- skeletons/BOOLEAN.c | 4 +- skeletons/ENUMERATED.c | 4 +- skeletons/GeneralString.c | 6 +- skeletons/GeneralizedTime.c | 3 + skeletons/GraphicString.c | 6 +- skeletons/IA5String.c | 6 +- skeletons/INTEGER.c | 4 +- skeletons/ISO646String.c | 6 +- skeletons/NULL.c | 4 +- skeletons/NativeEnumerated.c | 4 +- skeletons/NativeInteger.c | 4 +- skeletons/NumericString.c | 6 +- skeletons/OBJECT_IDENTIFIER.c | 5 +- skeletons/OCTET_STRING.c | 95 +++++++++----- skeletons/ObjectDescriptor.c | 6 +- skeletons/PrintableString.c | 6 +- skeletons/RELATIVE-OID.c | 3 + skeletons/T61String.c | 6 +- skeletons/TeletexString.c | 6 +- skeletons/UTCTime.c | 3 + skeletons/UTF8String.c | 6 +- skeletons/UniversalString.c | 6 +- skeletons/VideotexString.c | 6 +- skeletons/VisibleString.c | 6 +- skeletons/constr_TYPE.h | 18 +-- tests/19-param-OK.asn1.-P | 12 ++ tests/25-misc-OK.asn1 | 4 +- tests/31-set-of-OK.asn1.-P | 28 ++++- tests/39-sequence-of-OK.asn1.-P | 9 ++ tests/42-real-life-OK.asn1.-PR | 33 ++++- tests/43-recursion-OK.asn1.-P | 23 +++- tests/44-choice-in-sequence-OK.asn1.-P | 26 ++-- tests/46-redefine-OK.asn1.-PR | 14 ++- tests/47-set-ext-OK.asn1.-P | 18 ++- tests/50-constraint-OK.asn1.-P | 63 ++++++++++ tests/60-any-OK.asn1.-P | 6 + tests/65-multi-tag-OK.asn1.-P | 66 ++++++++-- 43 files changed, 586 insertions(+), 148 deletions(-) diff --git a/asn1c/tests/check-25.c b/asn1c/tests/check-25.c index eba3ddf25..782fc86bd 100644 --- a/asn1c/tests/check-25.c +++ b/asn1c/tests/check-25.c @@ -15,7 +15,7 @@ uint8_t buf1[] = { 2, /* L */ 150, 70, - /* b BOOLEAN */ + /* b [2] IMPLICIT BOOLEAN */ 128 | 2, /* [2] */ 1, /* L */ 0xff, @@ -26,30 +26,35 @@ uint8_t buf1[] = { 10, /* [UNIVERSAL 10] */ 1, /* L */ 222, + /* e OCTET STRING */ 4, /* [UNIVERSAL 4] */ 3, /* L */ 'x', 'y', 'z', - /* f OCTET STRING */ - 32 | 4, /* [UNIVERSAL 4], constructed */ + /* + * X.690 specifies that inner structures must be tagged by + * stripping off the outer tag for each subsequent level. + */ + /* f [5] IMPLICIT VisibleString */ + 128 | 32 | 5, /* [5], constructed */ 128, /* L indefinite */ - 4, /* [UNIVERSAL 4], primitive */ + 26, /* [UNIVERSAL 26] (VisibleString), primitive */ 2, 'l', 'o', - 32 | 4, /* [UNIVERSAL 4], recursively constructed */ + 32 | 26, /* [UNIVERSAL 26], recursively constructed */ 128, - 4, + 4, /* [UNIVERSAL 4] (OCTET STRING), primitive */ 1, 'v', - 4, + 4, /* [UNIVERSAL 4], primitive */ 2, 'e', '_', 0, 0, - 4, /* [UNIVERSAL 4], primitive */ + 26, /* [UNIVERSAL 26], primitive */ 2, 'i', 't', @@ -61,8 +66,8 @@ uint8_t buf1[] = { 2, /* Skip 2 bits */ 147, 150, /* => 148 */ - /* h BIT STRING */ - 32 | 3, /* [UNIVERSAL 3], constructed */ + /* h [7] BIT STRING */ + 128 | 32 | 7, /* [7], constructed */ 128, /* L indefinite */ 3, /* [UNIVERSAL 3], primitive */ 3, /* L */ @@ -73,7 +78,7 @@ uint8_t buf1[] = { 2, /* L */ 1, /* Skip 1 bit */ 143, /* => 142 */ - 0, /* End of f */ + 0, /* End of h */ 0, 0, /* End of the whole structure */ 0, diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index c448795ab..485e990aa 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -29,9 +29,15 @@ static int check_if_extensible(asn1p_expr_t *expr); static int expr_better_indirect(arg_t *arg, asn1p_expr_t *expr); static int expr_elements_count(arg_t *arg, asn1p_expr_t *expr); static int emit_member_table(arg_t *arg, asn1p_expr_t *expr); -static int emit_tags_vector(arg_t *arg, asn1p_expr_t *expr); static int emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count); +enum tvm_compat { + _TVM_SAME = 0, /* tags and all_tags are same */ + _TVM_SUBSET = 1, /* tags are subset of all_tags */ + _TVM_DIFFERENT = 2, /* tags and all_tags are different */ +}; +static enum tvm_compat emit_tags_vectors(arg_t *arg, asn1p_expr_t *expr, int *tc, int *atc); + enum etd_cp { ETD_CP_UNKNOWN = -2, ETD_CP_EITHER = -1, @@ -42,7 +48,7 @@ enum etd_spec { ETD_NO_SPECIFICS, ETD_HAS_SPECIFICS }; -static int emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, int tags_count, int elements_count, enum etd_cp, enum etd_spec); +static int emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_count, int all_tags_count, int elements_count, enum etd_cp, enum etd_spec); #define C99_MODE (!(arg->flags & A1C_NO_C99)) #define UNNAMED_UNIONS (arg->flags & A1C_UNNAMED_UNIONS) @@ -175,6 +181,8 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { tag2el_t *tag2el = NULL; int tag2el_count = 0; int tags_count; + int all_tags_count; + enum tvm_compat tv_mode; char *p; /* @@ -212,9 +220,9 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { OUT("};\n"); /* - * Print out asn1_DEF__tags[] vector. + * Print out asn1_DEF__[all_]tags[] vectors. */ - tags_count = emit_tags_vector(arg, expr); + tv_mode = emit_tags_vectors(arg, expr, &tags_count, &all_tags_count); /* * Tags to elements map. @@ -238,7 +246,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { /* * Emit asn1_DEF_xxx table. */ - emit_type_DEF(arg, expr, tags_count, elements, + emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, elements, ETD_CP_CONSTRUCTED, ETD_HAS_SPECIFICS); REDIR(OT_TYPE_DECLS); @@ -322,6 +330,8 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { tag2el_t *tag2el = NULL; int tag2el_count = 0; int tags_count; + int all_tags_count; + enum tvm_compat tv_mode; char *p; /* @@ -359,9 +369,9 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { OUT("};\n"); /* - * Print out asn1_DEF__tags[] vector. + * Print out asn1_DEF__[all_]tags[] vectors. */ - tags_count = emit_tags_vector(arg, expr); + tv_mode = emit_tags_vectors(arg, expr, &tags_count, &all_tags_count); /* * Tags to elements map. @@ -417,7 +427,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { /* * Emit asn1_DEF_xxx table. */ - emit_type_DEF(arg, expr, tags_count, elements, + emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, elements, ETD_CP_CONSTRUCTED, ETD_HAS_SPECIFICS); REDIR(OT_TYPE_DECLS); @@ -483,6 +493,8 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *v; int tags_count; + int all_tags_count; + enum tvm_compat tv_mode; char *p; /* @@ -511,9 +523,9 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { OUT("};\n"); /* - * Print out asn1_DEF__tags[] vector. + * Print out asn1_DEF__[all_]tags[] vectors. */ - tags_count = emit_tags_vector(arg, expr); + tv_mode = emit_tags_vectors(arg, expr, &tags_count, &all_tags_count); p = MKID(expr->Identifier); OUT("static asn1_SET_OF_specifics_t asn1_DEF_%s_specs = {\n", p); @@ -526,7 +538,7 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { /* * Emit asn1_DEF_xxx table. */ - emit_type_DEF(arg, expr, tags_count, 1, + emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, 1, ETD_CP_CONSTRUCTED, ETD_HAS_SPECIFICS); REDIR(OT_TYPE_DECLS); @@ -600,6 +612,8 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { tag2el_t *tag2el = NULL; int tag2el_count = 0; int tags_count; + int all_tags_count; + enum tvm_compat tv_mode; char *p; /* @@ -641,9 +655,11 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { /* * Our parent structure has already taken this into account. */ - tags_count = 0; + tv_mode = _TVM_SAME; + tags_count = all_tags_count = 0; } else { - tags_count = emit_tags_vector(arg, expr); + tv_mode = emit_tags_vectors(arg, expr, + &tags_count, &all_tags_count); } /* @@ -668,7 +684,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { /* * Emit asn1_DEF_xxx table. */ - emit_type_DEF(arg, expr, tags_count, elements, + emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, elements, ETD_CP_CONSTRUCTED /*either?!*/, ETD_HAS_SPECIFICS); REDIR(OT_TYPE_DECLS); @@ -724,6 +740,8 @@ int asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { asn1p_expr_t *expr = arg->expr; int tags_count; + int all_tags_count; + enum tvm_compat tv_mode; char *p; if(arg->embed) { @@ -754,11 +772,11 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { REDIR(OT_STAT_DEFS); /* - * Print out asn1_DEF__tags[] vector. + * Print out asn1_DEF__[all_]tags[] vectors. */ - tags_count = emit_tags_vector(arg, expr); + tv_mode = emit_tags_vectors(arg, expr, &tags_count, &all_tags_count); - emit_type_DEF(arg, expr, tags_count, 0, + emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, 0, ETD_CP_UNKNOWN, ETD_NO_SPECIFICS); REDIR(OT_CODE); @@ -816,9 +834,11 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("td->free_struct = asn1_DEF_%s.free_struct;\n", type_name); OUT("td->print_struct = asn1_DEF_%s.print_struct;\n", type_name); if(!terminal && !tags_count) { - OUT("/* The next two lines are because of -fknown-extern-type */\n"); + OUT("/* The next four lines are here because of -fknown-extern-type */\n"); OUT("td->tags = asn1_DEF_%s.tags;\n", type_name); OUT("td->tags_count = asn1_DEF_%s.tags_count;\n", type_name); + OUT("td->all_tags = asn1_DEF_%s.all_tags;\n", type_name); + OUT("td->all_tags_count = asn1_DEF_%s.all_tags_count;\n",type_name); OUT("/* End of these lines */\n"); } OUT("td->last_tag_form = asn1_DEF_%s.last_tag_form;\n", type_name); @@ -1122,33 +1142,77 @@ emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count) { return 0;; } -static int -emit_tags_vector(arg_t *arg, asn1p_expr_t *expr) { - struct asn1p_type_tag_s *tags = 0; +static enum tvm_compat +emit_tags_vectors(arg_t *arg, asn1p_expr_t *expr, int *tags_count_r, int *all_tags_count_r) { + struct asn1p_type_tag_s *tags = 0; /* Effective tags */ + struct asn1p_type_tag_s *all_tags = 0; /* The full array */ int tags_count = 0; + int all_tags_count = 0; + enum tvm_compat tv_mode = _TVM_SAME; int i; /* Fetch a chain of tags */ tags_count = asn1f_fetch_tags(arg->asn, arg->mod, expr, &tags, 0); - if(tags_count <= 0) - return 0; + if(tags_count < 0) return -1; - OUT("static ber_tlv_tag_t asn1_DEF_%s_tags[] = {\n", - MKID(expr->Identifier)); - INDENT(+1); + /* Fetch a chain of tags */ + all_tags_count = asn1f_fetch_tags(arg->asn, arg->mod, expr, + &all_tags, AFT_FULL_COLLECT); + if(all_tags_count < 0) { + if(tags) free(tags); + return -1; + } + + assert(tags_count <= all_tags_count); + assert((tags_count?0:1) == (all_tags_count?0:1)); - /* Print the array of collected tags */ - for(i = 0; i < tags_count; i++) { - if(i) OUT(",\n"); - _print_tag(arg, &tags[i]); + if(tags_count <= all_tags_count) { + for(i = 0; i < tags_count; i++) { + if(tags[i].tag_value != all_tags[i].tag_value + || tags[i].tag_class != all_tags[i].tag_class) { + tv_mode = _TVM_DIFFERENT; + break; + } + } + if(i == tags_count && tags_count < all_tags_count) + tv_mode = _TVM_SUBSET; + } else { + tv_mode = _TVM_DIFFERENT; } - OUT("\n"); - INDENT(-1); - OUT("};\n"); +#define EMIT_TAGS_TABLE(name, tags, tags_count) do { \ + OUT("static ber_tlv_tag_t asn1_DEF_%s%s_tags[] = {\n", \ + MKID(expr->Identifier), name); \ + INDENT(+1); \ + /* Print the array of collected tags */ \ + for(i = 0; i < tags_count; i++) { \ + if(i) OUT(",\n"); \ + _print_tag(arg, &tags[i]); \ + } \ + OUT("\n"); \ + INDENT(-1); \ + OUT("};\n"); \ + } while(0) + + if(tags_count) { + if(tv_mode == _TVM_SUBSET) + EMIT_TAGS_TABLE("", all_tags, all_tags_count); + else + EMIT_TAGS_TABLE("", tags, tags_count); + } + + if(all_tags_count) { + if(tv_mode == _TVM_DIFFERENT) + EMIT_TAGS_TABLE("_all", all_tags, all_tags_count); + } + + if(tags) free(tags); + if(all_tags) free(all_tags); + + *tags_count_r = tags_count; + *all_tags_count_r = all_tags_count; - free(tags); - return tags_count; + return tv_mode; } static int @@ -1293,14 +1357,14 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { } static int -emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, int tags_count, int elements_count, enum etd_cp cp, enum etd_spec spec) { +emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_count, int all_tags_count, int elements_count, enum etd_cp cp, enum etd_spec spec) { char *p; p = MKID(expr->Identifier); if(HIDE_INNER_DEFS) OUT("static /* Use -fall-defs-global to expose */\n"); OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p); - INDENTED( + INDENT(+1); OUT("\"%s\",\n", expr->_anonymous_type?"":expr->Identifier); if(expr->expr_type & ASN_CONSTR_MASK) { @@ -1324,11 +1388,29 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, int tags_count, int elements_count if(tags_count) { OUT("asn1_DEF_%s_tags,\n", p); OUT("sizeof(asn1_DEF_%s_tags)\n", p); + OUT("\t/sizeof(asn1_DEF_%s_tags[0])", p); + if(tv_mode == _TVM_SUBSET + && tags_count != all_tags_count) + OUT(" - %d", all_tags_count - tags_count); + OUT(", /* %d */\n", tags_count); + } else { + OUT("0,\t/* No effective tags (pointer) */\n"); + OUT("0,\t/* No effective tags (count) */\n"); + } + + if(all_tags_count && tv_mode == _TVM_DIFFERENT) { + OUT("asn1_DEF_%s_all_tags,\n", p); + OUT("sizeof(asn1_DEF_%s_all_tags)\n", p); + OUT("\t/sizeof(asn1_DEF_%s_all_tags[0]), /* %d */\n", + p, all_tags_count); + } else if(all_tags_count) { + OUT("asn1_DEF_%s_tags,\t/* Same as above */\n", p); + OUT("sizeof(asn1_DEF_%s_tags)\n", p); OUT("\t/sizeof(asn1_DEF_%s_tags[0]), /* %d */\n", - p, tags_count); + p, all_tags_count); } else { - OUT("0,\t/* No explicit tags (pointer) */\n"); - OUT("0,\t/* No explicit tags (count) */\n"); + OUT("0,\t/* No tags (pointer) */\n"); + OUT("0,\t/* No tags (count) */\n"); } switch(cp) { @@ -1371,7 +1453,7 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, int tags_count, int elements_count case ETD_HAS_SPECIFICS: OUT("&asn1_DEF_%s_specs\t/* Additional specs */\n", p); } - ); + INDENT(-1); OUT("};\n"); OUT("\n"); diff --git a/libasn1fix/asn1fix_tags.c b/libasn1fix/asn1fix_tags.c index 6d887980e..ed08513b3 100644 --- a/libasn1fix/asn1fix_tags.c +++ b/libasn1fix/asn1fix_tags.c @@ -2,7 +2,7 @@ #define ADD_TAG(skip, newtag) do { \ void *__p; \ - if(skip) { \ + if(skip && !(flags & AFT_FULL_COLLECT)) { \ if(newtag.tag_mode != TM_IMPLICIT) \ skip--; \ break; \ diff --git a/libasn1fix/asn1fix_tags.h b/libasn1fix/asn1fix_tags.h index 394c3e842..a4c31ad90 100644 --- a/libasn1fix/asn1fix_tags.h +++ b/libasn1fix/asn1fix_tags.h @@ -4,6 +4,7 @@ enum asn1f_aft_flags_e { AFT_IMAGINARY_ANY = 0x01, /* Treat ANY tag as [IMAGINARY ANY] */ AFT_FETCH_OUTMOST = 0x02, /* Fetch only outmost tag */ + AFT_FULL_COLLECT = 0x04, /* Collect all tags */ }; /* diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index 7f1aa09ac..a43a22aa5 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -19,6 +19,9 @@ asn1_TYPE_descriptor_t asn1_DEF_BIT_STRING = { OCTET_STRING_free, /* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ asn1_DEF_BIT_STRING_tags, + sizeof(asn1_DEF_BIT_STRING_tags) + / sizeof(asn1_DEF_BIT_STRING_tags[0]), + asn1_DEF_BIT_STRING_tags, /* Same as above */ sizeof(asn1_DEF_BIT_STRING_tags) / sizeof(asn1_DEF_BIT_STRING_tags[0]), -1, /* Both ways are fine */ diff --git a/skeletons/BMPString.c b/skeletons/BMPString.c index 87aaceae8..3e779cce3 100644 --- a/skeletons/BMPString.c +++ b/skeletons/BMPString.c @@ -8,7 +8,8 @@ * BMPString basic type description. */ static ber_tlv_tag_t asn1_DEF_BMPString_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (30 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (30 << 2)), /* [UNIVERSAL 30] IMPLICIT ...*/ + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn1_TYPE_descriptor_t asn1_DEF_BMPString = { "BMPString", @@ -19,6 +20,9 @@ asn1_TYPE_descriptor_t asn1_DEF_BMPString = { OCTET_STRING_free, /* -//- */ 0, /* Use generic outmost tag fetcher */ asn1_DEF_BMPString_tags, + sizeof(asn1_DEF_BMPString_tags) + / sizeof(asn1_DEF_BMPString_tags[0]) - 1, + asn1_DEF_BMPString_tags, sizeof(asn1_DEF_BMPString_tags) / sizeof(asn1_DEF_BMPString_tags[0]), -1, /* Both ways are fine */ diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c index b7b4795ad..5ba2e4f87 100644 --- a/skeletons/BOOLEAN.c +++ b/skeletons/BOOLEAN.c @@ -19,7 +19,9 @@ asn1_TYPE_descriptor_t asn1_DEF_BOOLEAN = { BOOLEAN_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_BOOLEAN_tags, - sizeof(asn1_DEF_BOOLEAN_tags)/sizeof(asn1_DEF_BOOLEAN_tags[0]), + sizeof(asn1_DEF_BOOLEAN_tags) / sizeof(asn1_DEF_BOOLEAN_tags[0]), + asn1_DEF_BOOLEAN_tags, /* Same as above */ + sizeof(asn1_DEF_BOOLEAN_tags) / sizeof(asn1_DEF_BOOLEAN_tags[0]), 0, /* Always in primitive form */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/ENUMERATED.c b/skeletons/ENUMERATED.c index 9c8db298e..ed908b563 100644 --- a/skeletons/ENUMERATED.c +++ b/skeletons/ENUMERATED.c @@ -19,7 +19,9 @@ asn1_TYPE_descriptor_t asn1_DEF_ENUMERATED = { INTEGER_free, /* Implemented in terms of INTEGER */ 0, /* Use generic outmost tag fetcher */ asn1_DEF_ENUMERATED_tags, - sizeof(asn1_DEF_ENUMERATED_tags)/sizeof(asn1_DEF_ENUMERATED_tags[0]), + sizeof(asn1_DEF_ENUMERATED_tags) / sizeof(asn1_DEF_ENUMERATED_tags[0]), + asn1_DEF_ENUMERATED_tags, /* Same as above */ + sizeof(asn1_DEF_ENUMERATED_tags) / sizeof(asn1_DEF_ENUMERATED_tags[0]), 0, /* Primitive */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/GeneralString.c b/skeletons/GeneralString.c index feef7ccb4..dfca2cac7 100644 --- a/skeletons/GeneralString.c +++ b/skeletons/GeneralString.c @@ -8,7 +8,8 @@ * GeneralString basic type description. */ static ber_tlv_tag_t asn1_DEF_GeneralString_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (27 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (27 << 2)), /* [UNIVERSAL 27] IMPLICIT ...*/ + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn1_TYPE_descriptor_t asn1_DEF_GeneralString = { "GeneralString", @@ -19,6 +20,9 @@ asn1_TYPE_descriptor_t asn1_DEF_GeneralString = { OCTET_STRING_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_GeneralString_tags, + sizeof(asn1_DEF_GeneralString_tags) + / sizeof(asn1_DEF_GeneralString_tags[0]) - 1, + asn1_DEF_GeneralString_tags, sizeof(asn1_DEF_GeneralString_tags) / sizeof(asn1_DEF_GeneralString_tags[0]), -1, /* Both ways are fine */ diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index c66c31455..6a89b2d64 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -83,6 +83,9 @@ asn1_TYPE_descriptor_t asn1_DEF_GeneralizedTime = { OCTET_STRING_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_GeneralizedTime_tags, + sizeof(asn1_DEF_GeneralizedTime_tags) + / sizeof(asn1_DEF_GeneralizedTime_tags[0]), + asn1_DEF_GeneralizedTime_tags, /* Same as above */ sizeof(asn1_DEF_GeneralizedTime_tags) / sizeof(asn1_DEF_GeneralizedTime_tags[0]), -1, /* Both ways are fine */ diff --git a/skeletons/GraphicString.c b/skeletons/GraphicString.c index f6d0ae9f3..ceb247d60 100644 --- a/skeletons/GraphicString.c +++ b/skeletons/GraphicString.c @@ -8,7 +8,8 @@ * GraphicString basic type description. */ static ber_tlv_tag_t asn1_DEF_GraphicString_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (25 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (25 << 2)), /* [UNIVERSAL 25] IMPLICIT ...*/ + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn1_TYPE_descriptor_t asn1_DEF_GraphicString = { "GraphicString", @@ -19,6 +20,9 @@ asn1_TYPE_descriptor_t asn1_DEF_GraphicString = { OCTET_STRING_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_GraphicString_tags, + sizeof(asn1_DEF_GraphicString_tags) + / sizeof(asn1_DEF_GraphicString_tags[0]) - 1, + asn1_DEF_GraphicString_tags, sizeof(asn1_DEF_GraphicString_tags) / sizeof(asn1_DEF_GraphicString_tags[0]), -1, /* Both ways are fine */ diff --git a/skeletons/IA5String.c b/skeletons/IA5String.c index 33f38a64b..9fc308b17 100644 --- a/skeletons/IA5String.c +++ b/skeletons/IA5String.c @@ -8,7 +8,8 @@ * IA5String basic type description. */ static ber_tlv_tag_t asn1_DEF_IA5String_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), /* [UNIVERSAL 22] IMPLICIT ...*/ + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn1_TYPE_descriptor_t asn1_DEF_IA5String = { "IA5String", @@ -19,6 +20,9 @@ asn1_TYPE_descriptor_t asn1_DEF_IA5String = { OCTET_STRING_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_IA5String_tags, + sizeof(asn1_DEF_IA5String_tags) + / sizeof(asn1_DEF_IA5String_tags[0]) - 1, + asn1_DEF_IA5String_tags, sizeof(asn1_DEF_IA5String_tags) / sizeof(asn1_DEF_IA5String_tags[0]), -1, /* Both ways are fine */ diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 14e91c6db..5bfcf1fbf 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -21,7 +21,9 @@ asn1_TYPE_descriptor_t asn1_DEF_INTEGER = { INTEGER_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_INTEGER_tags, - sizeof(asn1_DEF_INTEGER_tags)/sizeof(asn1_DEF_INTEGER_tags[0]), + sizeof(asn1_DEF_INTEGER_tags) / sizeof(asn1_DEF_INTEGER_tags[0]), + asn1_DEF_INTEGER_tags, /* Same as above */ + sizeof(asn1_DEF_INTEGER_tags) / sizeof(asn1_DEF_INTEGER_tags[0]), 0, /* Always in primitive form */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/ISO646String.c b/skeletons/ISO646String.c index 7ce549688..8a99cbcb5 100644 --- a/skeletons/ISO646String.c +++ b/skeletons/ISO646String.c @@ -8,7 +8,8 @@ * ISO646String basic type description. */ static ber_tlv_tag_t asn1_DEF_ISO646String_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), /* [UNIVERSAL 26] IMPLICIT ...*/ + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn1_TYPE_descriptor_t asn1_DEF_ISO646String = { "ISO646String", @@ -19,6 +20,9 @@ asn1_TYPE_descriptor_t asn1_DEF_ISO646String = { OCTET_STRING_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_ISO646String_tags, + sizeof(asn1_DEF_ISO646String_tags) + / sizeof(asn1_DEF_ISO646String_tags[0]) - 1, + asn1_DEF_ISO646String_tags, sizeof(asn1_DEF_ISO646String_tags) / sizeof(asn1_DEF_ISO646String_tags[0]), -1, /* Both ways are fine */ diff --git a/skeletons/NULL.c b/skeletons/NULL.c index 42afa7e31..36796b8a6 100644 --- a/skeletons/NULL.c +++ b/skeletons/NULL.c @@ -20,7 +20,9 @@ asn1_TYPE_descriptor_t asn1_DEF_NULL = { BOOLEAN_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_NULL_tags, - sizeof(asn1_DEF_NULL_tags)/sizeof(asn1_DEF_NULL_tags[0]), + sizeof(asn1_DEF_NULL_tags) / sizeof(asn1_DEF_NULL_tags[0]), + asn1_DEF_NULL_tags, /* Same as above */ + sizeof(asn1_DEF_NULL_tags) / sizeof(asn1_DEF_NULL_tags[0]), 0, /* Always in primitive form */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c index 9c4fd8f5a..53ce5012e 100644 --- a/skeletons/NativeEnumerated.c +++ b/skeletons/NativeEnumerated.c @@ -26,7 +26,9 @@ asn1_TYPE_descriptor_t asn1_DEF_NativeEnumerated = { NativeInteger_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_NativeEnumerated_tags, - sizeof(asn1_DEF_NativeEnumerated_tags)/sizeof(asn1_DEF_NativeEnumerated_tags[0]), + sizeof(asn1_DEF_NativeEnumerated_tags) / sizeof(asn1_DEF_NativeEnumerated_tags[0]), + asn1_DEF_NativeEnumerated_tags, /* Same as above */ + sizeof(asn1_DEF_NativeEnumerated_tags) / sizeof(asn1_DEF_NativeEnumerated_tags[0]), 0, /* Always in primitive form */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index 60321cc34..98fee965d 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -28,7 +28,9 @@ asn1_TYPE_descriptor_t asn1_DEF_NativeInteger = { NativeInteger_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_NativeInteger_tags, - sizeof(asn1_DEF_NativeInteger_tags)/sizeof(asn1_DEF_NativeInteger_tags[0]), + sizeof(asn1_DEF_NativeInteger_tags) / sizeof(asn1_DEF_NativeInteger_tags[0]), + asn1_DEF_NativeInteger_tags, /* Same as above */ + sizeof(asn1_DEF_NativeInteger_tags) / sizeof(asn1_DEF_NativeInteger_tags[0]), 0, /* Always in primitive form */ 0, 0, /* No members */ 0 /* No specifics */ diff --git a/skeletons/NumericString.c b/skeletons/NumericString.c index a70bb5d75..a23e39f13 100644 --- a/skeletons/NumericString.c +++ b/skeletons/NumericString.c @@ -8,7 +8,8 @@ * NumericString basic type description. */ static ber_tlv_tag_t asn1_DEF_NumericString_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (18 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (18 << 2)), /* [UNIVERSAL 18] IMPLICIT ...*/ + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn1_TYPE_descriptor_t asn1_DEF_NumericString = { "NumericString", @@ -19,6 +20,9 @@ asn1_TYPE_descriptor_t asn1_DEF_NumericString = { OCTET_STRING_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_NumericString_tags, + sizeof(asn1_DEF_NumericString_tags) + / sizeof(asn1_DEF_NumericString_tags[0]) - 1, + asn1_DEF_NumericString_tags, sizeof(asn1_DEF_NumericString_tags) / sizeof(asn1_DEF_NumericString_tags[0]), -1, /* Both ways are fine */ diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index a44349e2d..c55410d5d 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -22,6 +22,9 @@ asn1_TYPE_descriptor_t asn1_DEF_OBJECT_IDENTIFIER = { INTEGER_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_OBJECT_IDENTIFIER_tags, + sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags) + / sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags[0]), + asn1_DEF_OBJECT_IDENTIFIER_tags, /* Same as above */ sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags) / sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags[0]), 0, /* Always in primitive form */ @@ -98,7 +101,7 @@ OBJECT_IDENTIFIER_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, int OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed int add, void *rvbuf, unsigned int rvsize) { - unsigned LE = 1; /* Little endian (x86) */ + unsigned LE __attribute__ ((unused)) = 1; /* Little endian (x86) */ uint8_t *arcend = arcbuf + arclen; /* End of arc */ void *rvstart = rvbuf; /* Original start of the value buffer */ unsigned int cache = 0; /* No more than 14 significant bits */ diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 65893347a..e0af730aa 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include @@ -21,6 +21,9 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { OCTET_STRING_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_OCTET_STRING_tags, + sizeof(asn1_DEF_OCTET_STRING_tags) + / sizeof(asn1_DEF_OCTET_STRING_tags[0]), + asn1_DEF_OCTET_STRING_tags, /* Same as above */ sizeof(asn1_DEF_OCTET_STRING_tags) / sizeof(asn1_DEF_OCTET_STRING_tags[0]), -1, /* Both ways are fine (primitive and constructed) */ @@ -54,6 +57,7 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { size_t _ns = ctx->step; /* Allocated */ \ if(_ns <= (size_t)(st->size + _bs)) { \ void *ptr; \ + /* Be nice and round to the memory allocator */ \ do { _ns = _ns ? _ns<<2 : 16; } \ while(_ns <= (size_t)(st->size + _bs)); \ ptr = REALLOC(st->buf, _ns); \ @@ -81,6 +85,7 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { */ struct _stack_el { ber_tlv_len_t left; /* What's left to read */ + int cont_level; /* Depth of subcontainment */ int want_nulls; /* Want null "end of content" octets? */ int bits_chopped; /* Flag in BIT STRING mode */ struct _stack_el *prev; @@ -95,17 +100,23 @@ static struct _stack_el * _add_stack_el(struct _stack *st) { struct _stack_el *nel; + /* + * Reuse the old stack frame or allocate a new one. + */ if(st->cur_ptr && st->cur_ptr->next) { nel = st->cur_ptr->next; nel->left = 0; nel->want_nulls = 0; nel->bits_chopped = 0; + /* Retain nel->cont_level, it's correct. */ } else { (void *)nel = CALLOC(1, sizeof(struct _stack_el)); if(nel == NULL) return NULL; if(st->tail) { + /* Increase a subcontainment depth */ + nel->cont_level = st->tail->cont_level + 1; st->tail->next = nel; } nel->prev = st->tail; @@ -136,13 +147,16 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, OCTET_STRING_t *st = (OCTET_STRING_t *)*os_structure; ber_dec_rval_t rval; ber_dec_ctx_t *ctx; - ber_tlv_tag_t terminal_tag; /* Inner tag for constructed types */ ssize_t consumed_myself = 0; struct _stack *stck; /* A stack structure */ struct _stack_el *sel; /* Stack element */ int tlv_constr; - int is_bit_str = 0; /* See below under switch(td->specifics) */ - int is_ANY_type = 0; /* See below under switch(td->specifics) */ + enum type_type_e { + _TT_GENERIC = 0, /* Just a random OCTET STRING */ + _TT_BIT_STRING = -1, /* BIT STRING type, a special case */ + _TT_ANY = 1, /* ANY type, a special case too */ + } type_type + = (enum type_type_e)(int)td->specifics; /* An ugly hack */ ASN_DEBUG("Decoding %s as %s (%ld)", td->name, "OCTET STRING", (long)size); @@ -159,25 +173,6 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, /* Restore parsing context */ ctx = &st->_ber_dec_ctx; - switch((int)td->specifics) { - case 0: - terminal_tag = asn1_DEF_OCTET_STRING_tags[0]; /* [U4] */ - break; - case -1: /* BIT STRING */ - /* - * This is some sort of a hack. - * The OCTET STRING decoder is being used in BIT STRING mode. - */ - is_bit_str = 1; - terminal_tag = ASN_TAG_CLASS_UNIVERSAL | (3 << 2); - break; - default: /* Just in case; fall through */ - case 1: /* ANY type */ - is_ANY_type = 1; - terminal_tag = -1; - break; - } - switch(ctx->phase) { case 0: /* @@ -212,7 +207,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, stck->cur_ptr->left, stck->cur_ptr->want_nulls); #endif - if(is_bit_str) { + if(type_type == _TT_BIT_STRING) { /* Number of meaningless tail bits */ APPEND("\0", 1); } @@ -224,7 +219,8 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, * Jump into stackless primitive decoding. */ _CH_PHASE(ctx, 3); - if(is_ANY_type) APPEND(buf_ptr, rval.consumed); + if(type_type == _TT_ANY) + APPEND(buf_ptr, rval.consumed); ADVANCE(rval.consumed); goto phase3; } @@ -241,6 +237,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, do { ber_tlv_tag_t tlv_tag; ber_tlv_len_t tlv_len; + ber_tlv_tag_t expected_tag; ssize_t tl, ll; ASN_DEBUG("fetch tag(size=%d), %sstack, left=%d, want0=%d", @@ -271,7 +268,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, && ((uint8_t *)buf_ptr)[1] == 0) { ADVANCE(2); - if(is_ANY_type) APPEND("\0\0", 2); + if(type_type == _TT_ANY) APPEND("\0\0", 2); ASN_DEBUG("Eat EOC; wn=%d--", sel->want_nulls); @@ -294,8 +291,38 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, } continue; - } else if(tlv_tag != terminal_tag - && terminal_tag != (ber_tlv_tag_t)-1) { + } + + /* + * Set up expected tags, + * depending on ASN.1 type being decoded. + */ + switch(type_type) { + case _TT_BIT_STRING: + /* X.690: 8.6.4.1, NOTE 2 */ + /* Fall through */ + case _TT_GENERIC: + default: + if(sel) { + int level = sel->cont_level; + if(level < td->all_tags_count) { + expected_tag = td->all_tags[level]; + break; + } else if(td->all_tags_count) { + expected_tag = td->all_tags + [td->all_tags_count - 1]; + break; + } + /* else, Fall through */ + } + /* Fall through */ + case _TT_ANY: + expected_tag = tlv_tag; + break; + } + + + if(tlv_tag != expected_tag) { char buf[2][32]; ber_tlv_tag_snprint(tlv_tag, buf[0], sizeof(buf[0])); @@ -313,17 +340,18 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, if(sel) { sel->want_nulls = (tlv_len==-1); sel->left = tlv_len; - ASN_DEBUG("+EXPECT2 left=%d wn=%d", - sel->left, sel->want_nulls); + ASN_DEBUG("+EXPECT2 left=%d wn=%d, clvl=%d", + sel->left, sel->want_nulls, sel->cont_level); } else { RETURN(RC_FAIL); } - if(is_ANY_type) APPEND(buf_ptr, tl + ll); + if(type_type == _TT_ANY) APPEND(buf_ptr, tl + ll); ADVANCE(tl+ll); } while(tlv_constr); if(sel == NULL) { /* Finished operation, "phase out" */ + ASN_DEBUG("Phase out"); _CH_PHASE(ctx, +3); break; } @@ -343,7 +371,8 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, len = ((ber_tlv_len_t)size < sel->left) ? (ber_tlv_len_t)size : sel->left; if(len > 0) { - if(is_bit_str && sel->bits_chopped == 0) { + if(type_type == _TT_BIT_STRING + && sel->bits_chopped == 0) { /* * Finalize the previous chunk: * strip down unused bits. @@ -394,7 +423,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, /* * BIT STRING-specific processing. */ - if(is_bit_str && st->size >= 2) { + if(type_type == _TT_BIT_STRING && st->size >= 2) { /* Finalize BIT STRING: zero out unused bits. */ st->buf[st->size-1] &= 0xff << st->buf[0]; } diff --git a/skeletons/ObjectDescriptor.c b/skeletons/ObjectDescriptor.c index 1f82e2b17..5017918ea 100644 --- a/skeletons/ObjectDescriptor.c +++ b/skeletons/ObjectDescriptor.c @@ -8,7 +8,8 @@ * ObjectDescriptor basic type description. */ static ber_tlv_tag_t asn1_DEF_ObjectDescriptor_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (7 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (7 << 2)), /* [UNIVERSAL 7] IMPLICIT ... */ + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn1_TYPE_descriptor_t asn1_DEF_ObjectDescriptor = { "ObjectDescriptor", @@ -19,6 +20,9 @@ asn1_TYPE_descriptor_t asn1_DEF_ObjectDescriptor = { OCTET_STRING_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_ObjectDescriptor_tags, + sizeof(asn1_DEF_ObjectDescriptor_tags) + / sizeof(asn1_DEF_ObjectDescriptor_tags[0]) - 1, + asn1_DEF_ObjectDescriptor_tags, sizeof(asn1_DEF_ObjectDescriptor_tags) / sizeof(asn1_DEF_ObjectDescriptor_tags[0]), -1, /* Both ways are fine */ diff --git a/skeletons/PrintableString.c b/skeletons/PrintableString.c index 89cbf8df3..c37de4970 100644 --- a/skeletons/PrintableString.c +++ b/skeletons/PrintableString.c @@ -8,7 +8,8 @@ * PrintableString basic type description. */ static ber_tlv_tag_t asn1_DEF_PrintableString_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (19 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (19 << 2)), /* [UNIVERSAL 19] IMPLICIT ...*/ + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn1_TYPE_descriptor_t asn1_DEF_PrintableString = { "PrintableString", @@ -19,6 +20,9 @@ asn1_TYPE_descriptor_t asn1_DEF_PrintableString = { OCTET_STRING_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_PrintableString_tags, + sizeof(asn1_DEF_PrintableString_tags) + / sizeof(asn1_DEF_PrintableString_tags[0]) - 1, + asn1_DEF_PrintableString_tags, sizeof(asn1_DEF_PrintableString_tags) / sizeof(asn1_DEF_PrintableString_tags[0]), -1, /* Both ways are fine */ diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index f1948f861..bee795c48 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -22,6 +22,9 @@ asn1_TYPE_descriptor_t asn1_DEF_RELATIVE_OID = { INTEGER_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_RELATIVE_OID_tags, + sizeof(asn1_DEF_RELATIVE_OID_tags) + / sizeof(asn1_DEF_RELATIVE_OID_tags[0]), + asn1_DEF_RELATIVE_OID_tags, /* Same as above */ sizeof(asn1_DEF_RELATIVE_OID_tags) / sizeof(asn1_DEF_RELATIVE_OID_tags[0]), 0, /* Always in primitive form */ diff --git a/skeletons/T61String.c b/skeletons/T61String.c index 52263744c..b306a5ba6 100644 --- a/skeletons/T61String.c +++ b/skeletons/T61String.c @@ -8,7 +8,8 @@ * T61String basic type description. */ static ber_tlv_tag_t asn1_DEF_T61String_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (20 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (20 << 2)), /* [UNIVERSAL 20] IMPLICIT ...*/ + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn1_TYPE_descriptor_t asn1_DEF_T61String = { "T61String", @@ -19,6 +20,9 @@ asn1_TYPE_descriptor_t asn1_DEF_T61String = { OCTET_STRING_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T61String_tags, + sizeof(asn1_DEF_T61String_tags) + / sizeof(asn1_DEF_T61String_tags[0]) - 1, + asn1_DEF_T61String_tags, sizeof(asn1_DEF_T61String_tags) / sizeof(asn1_DEF_T61String_tags[0]), -1, /* Both ways are fine */ diff --git a/skeletons/TeletexString.c b/skeletons/TeletexString.c index b46caed4f..09f3eb6a0 100644 --- a/skeletons/TeletexString.c +++ b/skeletons/TeletexString.c @@ -8,7 +8,8 @@ * TeletexString basic type description. */ static ber_tlv_tag_t asn1_DEF_TeletexString_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (20 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (20 << 2)), /* [UNIVERSAL 20] IMPLICIT ...*/ + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), /* ... OCTET STRING */ }; asn1_TYPE_descriptor_t asn1_DEF_TeletexString = { "TeletexString", @@ -19,6 +20,9 @@ asn1_TYPE_descriptor_t asn1_DEF_TeletexString = { OCTET_STRING_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_TeletexString_tags, + sizeof(asn1_DEF_TeletexString_tags) + / sizeof(asn1_DEF_TeletexString_tags[0]) - 1, + asn1_DEF_TeletexString_tags, sizeof(asn1_DEF_TeletexString_tags) / sizeof(asn1_DEF_TeletexString_tags[0]), -1, /* Both ways are fine */ diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c index c574e4ea3..029a43e4d 100644 --- a/skeletons/UTCTime.c +++ b/skeletons/UTCTime.c @@ -25,6 +25,9 @@ asn1_TYPE_descriptor_t asn1_DEF_UTCTime = { OCTET_STRING_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_UTCTime_tags, + sizeof(asn1_DEF_UTCTime_tags) + / sizeof(asn1_DEF_UTCTime_tags[0]), + asn1_DEF_UTCTime_tags, /* Same as above */ sizeof(asn1_DEF_UTCTime_tags) / sizeof(asn1_DEF_UTCTime_tags[0]), -1, /* Both ways are fine */ diff --git a/skeletons/UTF8String.c b/skeletons/UTF8String.c index 384600aab..40fef39b8 100644 --- a/skeletons/UTF8String.c +++ b/skeletons/UTF8String.c @@ -8,7 +8,8 @@ * UTF8String basic type description. */ static ber_tlv_tag_t asn1_DEF_UTF8String_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), /* [UNIVERSAL 12] IMPLICIT ...*/ + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), /* ... OCTET STRING */ }; asn1_TYPE_descriptor_t asn1_DEF_UTF8String = { "UTF8String", @@ -19,6 +20,9 @@ asn1_TYPE_descriptor_t asn1_DEF_UTF8String = { OCTET_STRING_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_UTF8String_tags, + sizeof(asn1_DEF_UTF8String_tags) + / sizeof(asn1_DEF_UTF8String_tags[0]) - 1, + asn1_DEF_UTF8String_tags, sizeof(asn1_DEF_UTF8String_tags) / sizeof(asn1_DEF_UTF8String_tags[0]), -1, /* Both ways are fine */ diff --git a/skeletons/UniversalString.c b/skeletons/UniversalString.c index 35e7bead1..149889665 100644 --- a/skeletons/UniversalString.c +++ b/skeletons/UniversalString.c @@ -8,7 +8,8 @@ * UniversalString basic type description. */ static ber_tlv_tag_t asn1_DEF_UniversalString_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (28 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (28 << 2)), /* [UNIVERSAL 28] IMPLICIT ...*/ + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn1_TYPE_descriptor_t asn1_DEF_UniversalString = { "UniversalString", @@ -19,6 +20,9 @@ asn1_TYPE_descriptor_t asn1_DEF_UniversalString = { OCTET_STRING_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_UniversalString_tags, + sizeof(asn1_DEF_UniversalString_tags) + / sizeof(asn1_DEF_UniversalString_tags[0]) - 1, + asn1_DEF_UniversalString_tags, sizeof(asn1_DEF_UniversalString_tags) / sizeof(asn1_DEF_UniversalString_tags[0]), -1, /* Both ways are fine */ diff --git a/skeletons/VideotexString.c b/skeletons/VideotexString.c index 772c66c63..6d2eaeb62 100644 --- a/skeletons/VideotexString.c +++ b/skeletons/VideotexString.c @@ -8,7 +8,8 @@ * VideotexString basic type description. */ static ber_tlv_tag_t asn1_DEF_VideotexString_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (21 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (21 << 2)), /* [UNIVERSAL 21] IMPLICIT */ + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn1_TYPE_descriptor_t asn1_DEF_VideotexString = { "VideotexString", @@ -19,6 +20,9 @@ asn1_TYPE_descriptor_t asn1_DEF_VideotexString = { OCTET_STRING_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_VideotexString_tags, + sizeof(asn1_DEF_VideotexString_tags) + / sizeof(asn1_DEF_VideotexString_tags[0]) - 1, + asn1_DEF_VideotexString_tags, sizeof(asn1_DEF_VideotexString_tags) / sizeof(asn1_DEF_VideotexString_tags[0]), -1, /* Both ways are fine */ diff --git a/skeletons/VisibleString.c b/skeletons/VisibleString.c index 18a27faf6..9ddb0f1c8 100644 --- a/skeletons/VisibleString.c +++ b/skeletons/VisibleString.c @@ -8,7 +8,8 @@ * VisibleString basic type description. */ static ber_tlv_tag_t asn1_DEF_VisibleString_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), /* [UNIVERSAL 26] IMPLICIT ...*/ + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn1_TYPE_descriptor_t asn1_DEF_VisibleString = { "VisibleString", @@ -19,6 +20,9 @@ asn1_TYPE_descriptor_t asn1_DEF_VisibleString = { OCTET_STRING_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_VisibleString_tags, + sizeof(asn1_DEF_VisibleString_tags) + / sizeof(asn1_DEF_VisibleString_tags[0]) - 1, + asn1_DEF_VisibleString_tags, sizeof(asn1_DEF_VisibleString_tags) / sizeof(asn1_DEF_VisibleString_tags[0]), -1, /* Both ways are fine */ diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index 1918b5c1d..15a67261d 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -70,10 +70,13 @@ typedef struct asn1_TYPE_descriptor_s { asn_outmost_tag_f *outmost_tag; /* */ /* - * Tags that are expected, with some of their vital properties. + * Tags that are expected to occur. */ - ber_tlv_tag_t *tags; /* At least one tag must be specified */ + ber_tlv_tag_t *tags; /* Effective tags sequence for this type */ int tags_count; /* Number of tags which are expected */ + ber_tlv_tag_t *all_tags;/* Every tag for BER/containment */ + int all_tags_count; /* Number of tags */ + int last_tag_form; /* Acceptable form of the tag (prim, constr) */ /* @@ -92,12 +95,13 @@ typedef struct asn1_TYPE_descriptor_s { /* * An element of the constructed type, i.e. SEQUENCE, SET, CHOICE. */ + enum asn1_TYPE_flags_e { + ATF_NOFLAGS, + ATF_POINTER = 0x01, /* Represented by the pointer */ + ATF_OPEN_TYPE = 0x02, /* ANY type, without meaningful tag */ + }; typedef struct asn1_TYPE_member_s { - enum asn1_TYPE_flags_e { - ATF_NOFLAGS, - ATF_POINTER = 0x01, /* Represented by the pointer */ - ATF_OPEN_TYPE = 0x02, /* ANY type, without meaningful tag */ - } flags; /* Element's presentation flags */ + enum asn1_TYPE_flags_e flags; /* Element's presentation flags */ int optional; /* Following optional members, including current */ int memb_offset; /* Offset of the element */ ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ diff --git a/tests/19-param-OK.asn1.-P b/tests/19-param-OK.asn1.-P index bed6a5ff6..83be07d77 100644 --- a/tests/19-param-OK.asn1.-P +++ b/tests/19-param-OK.asn1.-P @@ -115,6 +115,9 @@ asn1_TYPE_descriptor_t asn1_DEF_toBeSigned = { SEQUENCE_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_toBeSigned_tags, + sizeof(asn1_DEF_toBeSigned_tags) + /sizeof(asn1_DEF_toBeSigned_tags[0]), /* 1 */ + asn1_DEF_toBeSigned_tags, /* Same as above */ sizeof(asn1_DEF_toBeSigned_tags) /sizeof(asn1_DEF_toBeSigned_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -171,6 +174,9 @@ asn1_TYPE_descriptor_t asn1_DEF_Certificate = { SEQUENCE_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Certificate_tags, + sizeof(asn1_DEF_Certificate_tags) + /sizeof(asn1_DEF_Certificate_tags[0]), /* 1 */ + asn1_DEF_Certificate_tags, /* Same as above */ sizeof(asn1_DEF_Certificate_tags) /sizeof(asn1_DEF_Certificate_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -227,6 +233,9 @@ asn1_TYPE_descriptor_t asn1_DEF_Name = { SEQUENCE_OF_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Name_tags, + sizeof(asn1_DEF_Name_tags) + /sizeof(asn1_DEF_Name_tags[0]), /* 1 */ + asn1_DEF_Name_tags, /* Same as above */ sizeof(asn1_DEF_Name_tags) /sizeof(asn1_DEF_Name_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -338,6 +347,9 @@ asn1_TYPE_descriptor_t asn1_DEF_RelativeDistinguishedName = { SET_OF_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_RelativeDistinguishedName_tags, + sizeof(asn1_DEF_RelativeDistinguishedName_tags) + /sizeof(asn1_DEF_RelativeDistinguishedName_tags[0]), /* 1 */ + asn1_DEF_RelativeDistinguishedName_tags, /* Same as above */ sizeof(asn1_DEF_RelativeDistinguishedName_tags) /sizeof(asn1_DEF_RelativeDistinguishedName_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ diff --git a/tests/25-misc-OK.asn1 b/tests/25-misc-OK.asn1 index 3a7eb917e..43487de69 100644 --- a/tests/25-misc-OK.asn1 +++ b/tests/25-misc-OK.asn1 @@ -20,9 +20,9 @@ BEGIN a(1), b(2) }, e OCTET STRING, - f OCTET STRING, + f [5] VisibleString, g BIT STRING, - h BIT STRING, + h [7] BIT STRING, ... } diff --git a/tests/31-set-of-OK.asn1.-P b/tests/31-set-of-OK.asn1.-P index e28455aef..77281214c 100644 --- a/tests/31-set-of-OK.asn1.-P +++ b/tests/31-set-of-OK.asn1.-P @@ -46,6 +46,9 @@ asn1_TYPE_descriptor_t asn1_DEF_Forest = { SET_OF_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Forest_tags, + sizeof(asn1_DEF_Forest_tags) + /sizeof(asn1_DEF_Forest_tags[0]), /* 1 */ + asn1_DEF_Forest_tags, /* Same as above */ sizeof(asn1_DEF_Forest_tags) /sizeof(asn1_DEF_Forest_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -117,6 +120,9 @@ asn1_TYPE_descriptor_t asn1_DEF_Tree = { SEQUENCE_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Tree_tags, + sizeof(asn1_DEF_Tree_tags) + /sizeof(asn1_DEF_Tree_tags[0]), /* 1 */ + asn1_DEF_Tree_tags, /* Same as above */ sizeof(asn1_DEF_Tree_tags) /sizeof(asn1_DEF_Tree_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -193,7 +199,8 @@ static asn1_TYPE_member_t asn1_MBR_trees[] = { }, }; static ber_tlv_tag_t asn1_DEF_trees_tags[] = { - (ASN_TAG_CLASS_CONTEXT | (0 << 2)) + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; static asn1_SET_OF_specifics_t asn1_DEF_trees_specs = { sizeof(struct trees), @@ -210,7 +217,10 @@ asn1_TYPE_descriptor_t asn1_DEF_trees = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_trees_tags, sizeof(asn1_DEF_trees_tags) - /sizeof(asn1_DEF_trees_tags[0]), /* 1 */ + /sizeof(asn1_DEF_trees_tags[0]) - 1, /* 1 */ + asn1_DEF_trees_tags, /* Same as above */ + sizeof(asn1_DEF_trees_tags) + /sizeof(asn1_DEF_trees_tags[0]), /* 2 */ 1, /* Whether CONSTRUCTED */ asn1_MBR_trees, 1, /* Single element */ @@ -250,6 +260,9 @@ asn1_TYPE_descriptor_t asn1_DEF_anything_member = { SEQUENCE_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_anything_member_tags, + sizeof(asn1_DEF_anything_member_tags) + /sizeof(asn1_DEF_anything_member_tags[0]), /* 1 */ + asn1_DEF_anything_member_tags, /* Same as above */ sizeof(asn1_DEF_anything_member_tags) /sizeof(asn1_DEF_anything_member_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -268,7 +281,8 @@ static asn1_TYPE_member_t asn1_MBR_anything[] = { }, }; static ber_tlv_tag_t asn1_DEF_anything_tags[] = { - (ASN_TAG_CLASS_CONTEXT | (1 << 2)) + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; static asn1_SET_OF_specifics_t asn1_DEF_anything_specs = { sizeof(struct anything), @@ -285,7 +299,10 @@ asn1_TYPE_descriptor_t asn1_DEF_anything = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_anything_tags, sizeof(asn1_DEF_anything_tags) - /sizeof(asn1_DEF_anything_tags[0]), /* 1 */ + /sizeof(asn1_DEF_anything_tags[0]) - 1, /* 1 */ + asn1_DEF_anything_tags, /* Same as above */ + sizeof(asn1_DEF_anything_tags) + /sizeof(asn1_DEF_anything_tags[0]), /* 2 */ 1, /* Whether CONSTRUCTED */ asn1_MBR_anything, 1, /* Single element */ @@ -336,6 +353,9 @@ asn1_TYPE_descriptor_t asn1_DEF_Stuff = { SET_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Stuff_tags, + sizeof(asn1_DEF_Stuff_tags) + /sizeof(asn1_DEF_Stuff_tags[0]), /* 1 */ + asn1_DEF_Stuff_tags, /* Same as above */ sizeof(asn1_DEF_Stuff_tags) /sizeof(asn1_DEF_Stuff_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ diff --git a/tests/39-sequence-of-OK.asn1.-P b/tests/39-sequence-of-OK.asn1.-P index a1f622bf1..81ac16d9e 100644 --- a/tests/39-sequence-of-OK.asn1.-P +++ b/tests/39-sequence-of-OK.asn1.-P @@ -55,6 +55,9 @@ asn1_TYPE_descriptor_t asn1_DEF_collection = { SEQUENCE_OF_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_collection_tags, + sizeof(asn1_DEF_collection_tags) + /sizeof(asn1_DEF_collection_tags[0]), /* 1 */ + asn1_DEF_collection_tags, /* Same as above */ sizeof(asn1_DEF_collection_tags) /sizeof(asn1_DEF_collection_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -103,6 +106,9 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { SEQUENCE_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T_tags, + sizeof(asn1_DEF_T_tags) + /sizeof(asn1_DEF_T_tags[0]), /* 1 */ + asn1_DEF_T_tags, /* Same as above */ sizeof(asn1_DEF_T_tags) /sizeof(asn1_DEF_T_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -175,6 +181,9 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { SEQUENCE_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T2_tags, + sizeof(asn1_DEF_T2_tags) + /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ + asn1_DEF_T2_tags, /* Same as above */ sizeof(asn1_DEF_T2_tags) /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index 385dcb9cf..262bacc16 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -91,6 +91,9 @@ asn1_TYPE_descriptor_t asn1_DEF_varsets = { SEQUENCE_OF_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_varsets_tags, + sizeof(asn1_DEF_varsets_tags) + /sizeof(asn1_DEF_varsets_tags[0]), /* 1 */ + asn1_DEF_varsets_tags, /* Same as above */ sizeof(asn1_DEF_varsets_tags) /sizeof(asn1_DEF_varsets_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -139,6 +142,9 @@ asn1_TYPE_descriptor_t asn1_DEF_LogLine = { SEQUENCE_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_LogLine_tags, + sizeof(asn1_DEF_LogLine_tags) + /sizeof(asn1_DEF_LogLine_tags[0]), /* 1 */ + asn1_DEF_LogLine_tags, /* Same as above */ sizeof(asn1_DEF_LogLine_tags) /sizeof(asn1_DEF_LogLine_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -231,6 +237,9 @@ asn1_TYPE_descriptor_t asn1_DEF_vparts = { SEQUENCE_OF_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_vparts_tags, + sizeof(asn1_DEF_vparts_tags) + /sizeof(asn1_DEF_vparts_tags[0]), /* 1 */ + asn1_DEF_vparts_tags, /* Same as above */ sizeof(asn1_DEF_vparts_tags) /sizeof(asn1_DEF_vparts_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -279,6 +288,9 @@ asn1_TYPE_descriptor_t asn1_DEF_VariablePartSet = { SEQUENCE_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_VariablePartSet_tags, + sizeof(asn1_DEF_VariablePartSet_tags) + /sizeof(asn1_DEF_VariablePartSet_tags[0]), /* 1 */ + asn1_DEF_VariablePartSet_tags, /* Same as above */ sizeof(asn1_DEF_VariablePartSet_tags) /sizeof(asn1_DEF_VariablePartSet_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -399,6 +411,9 @@ asn1_TYPE_descriptor_t asn1_DEF_vset = { SET_OF_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_vset_tags, + sizeof(asn1_DEF_vset_tags) + /sizeof(asn1_DEF_vset_tags[0]), /* 1 */ + asn1_DEF_vset_tags, /* Same as above */ sizeof(asn1_DEF_vset_tags) /sizeof(asn1_DEF_vset_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -448,6 +463,9 @@ asn1_TYPE_descriptor_t asn1_DEF_vrange = { SEQUENCE_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_vrange_tags, + sizeof(asn1_DEF_vrange_tags) + /sizeof(asn1_DEF_vrange_tags[0]), /* 1 */ + asn1_DEF_vrange_tags, /* Same as above */ sizeof(asn1_DEF_vrange_tags) /sizeof(asn1_DEF_vrange_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -493,8 +511,10 @@ asn1_TYPE_descriptor_t asn1_DEF_VariablePart = { CHOICE_print, CHOICE_free, CHOICE_outmost_tag, - 0, /* No explicit tags (pointer) */ - 0, /* No explicit tags (count) */ + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ 1, /* Whether CONSTRUCTED */ asn1_MBR_VariablePart, 2, /* Elements count */ @@ -581,6 +601,9 @@ asn1_TYPE_descriptor_t asn1_DEF_email = { SET_OF_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_email_tags, + sizeof(asn1_DEF_email_tags) + /sizeof(asn1_DEF_email_tags[0]), /* 1 */ + asn1_DEF_email_tags, /* Same as above */ sizeof(asn1_DEF_email_tags) /sizeof(asn1_DEF_email_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -630,6 +653,9 @@ asn1_TYPE_descriptor_t asn1_DEF_notify = { SEQUENCE_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_notify_tags, + sizeof(asn1_DEF_notify_tags) + /sizeof(asn1_DEF_notify_tags[0]), /* 1 */ + asn1_DEF_notify_tags, /* Same as above */ sizeof(asn1_DEF_notify_tags) /sizeof(asn1_DEF_notify_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -678,6 +704,9 @@ asn1_TYPE_descriptor_t asn1_DEF_ActionItem = { SEQUENCE_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_ActionItem_tags, + sizeof(asn1_DEF_ActionItem_tags) + /sizeof(asn1_DEF_ActionItem_tags[0]), /* 1 */ + asn1_DEF_ActionItem_tags, /* Same as above */ sizeof(asn1_DEF_ActionItem_tags) /sizeof(asn1_DEF_ActionItem_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ diff --git a/tests/43-recursion-OK.asn1.-P b/tests/43-recursion-OK.asn1.-P index 18c02d7ca..1f9352401 100644 --- a/tests/43-recursion-OK.asn1.-P +++ b/tests/43-recursion-OK.asn1.-P @@ -64,6 +64,9 @@ asn1_TYPE_descriptor_t asn1_DEF_t_member1 = { SET_OF_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_t_member1_tags, + sizeof(asn1_DEF_t_member1_tags) + /sizeof(asn1_DEF_t_member1_tags[0]), /* 1 */ + asn1_DEF_t_member1_tags, /* Same as above */ sizeof(asn1_DEF_t_member1_tags) /sizeof(asn1_DEF_t_member1_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -98,6 +101,9 @@ asn1_TYPE_descriptor_t asn1_DEF_t_member2 = { SEQUENCE_OF_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_t_member2_tags, + sizeof(asn1_DEF_t_member2_tags) + /sizeof(asn1_DEF_t_member2_tags[0]), /* 1 */ + asn1_DEF_t_member2_tags, /* Same as above */ sizeof(asn1_DEF_t_member2_tags) /sizeof(asn1_DEF_t_member2_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -162,6 +168,9 @@ asn1_TYPE_descriptor_t asn1_DEF_Test_structure_1 = { SEQUENCE_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Test_structure_1_tags, + sizeof(asn1_DEF_Test_structure_1_tags) + /sizeof(asn1_DEF_Test_structure_1_tags[0]), /* 1 */ + asn1_DEF_Test_structure_1_tags, /* Same as above */ sizeof(asn1_DEF_Test_structure_1_tags) /sizeof(asn1_DEF_Test_structure_1_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -223,7 +232,8 @@ static asn1_TYPE_member_t asn1_MBR_or[] = { }, }; static ber_tlv_tag_t asn1_DEF_or_tags[] = { - (ASN_TAG_CLASS_CONTEXT | (2 << 2)) + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; static asn1_SET_OF_specifics_t asn1_DEF_or_specs = { sizeof(struct or), @@ -240,7 +250,10 @@ asn1_TYPE_descriptor_t asn1_DEF_or = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_or_tags, sizeof(asn1_DEF_or_tags) - /sizeof(asn1_DEF_or_tags[0]), /* 1 */ + /sizeof(asn1_DEF_or_tags[0]) - 1, /* 1 */ + asn1_DEF_or_tags, /* Same as above */ + sizeof(asn1_DEF_or_tags) + /sizeof(asn1_DEF_or_tags[0]), /* 2 */ 1, /* Whether CONSTRUCTED */ asn1_MBR_or, 1, /* Single element */ @@ -300,8 +313,10 @@ asn1_TYPE_descriptor_t asn1_DEF_Choice_1 = { CHOICE_print, CHOICE_free, CHOICE_outmost_tag, - 0, /* No explicit tags (pointer) */ - 0, /* No explicit tags (count) */ + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ 1, /* Whether CONSTRUCTED */ asn1_MBR_Choice_1, 4, /* Elements count */ diff --git a/tests/44-choice-in-sequence-OK.asn1.-P b/tests/44-choice-in-sequence-OK.asn1.-P index 107cdb8de..5ac269d3b 100644 --- a/tests/44-choice-in-sequence-OK.asn1.-P +++ b/tests/44-choice-in-sequence-OK.asn1.-P @@ -106,8 +106,10 @@ asn1_TYPE_descriptor_t asn1_DEF_e = { CHOICE_print, CHOICE_free, CHOICE_outmost_tag, - 0, /* No explicit tags (pointer) */ - 0, /* No explicit tags (count) */ + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ 1, /* Whether CONSTRUCTED */ asn1_MBR_e, 2, /* Elements count */ @@ -152,8 +154,10 @@ asn1_TYPE_descriptor_t asn1_DEF_h = { CHOICE_print, CHOICE_free, CHOICE_outmost_tag, - 0, /* No explicit tags (pointer) */ - 0, /* No explicit tags (count) */ + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ 1, /* Whether CONSTRUCTED */ asn1_MBR_h, 2, /* Elements count */ @@ -215,8 +219,10 @@ asn1_TYPE_descriptor_t asn1_DEF_b = { CHOICE_print, CHOICE_free, CHOICE_outmost_tag, - 0, /* No explicit tags (pointer) */ - 0, /* No explicit tags (count) */ + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ 1, /* Whether CONSTRUCTED */ asn1_MBR_b, 4, /* Elements count */ @@ -240,7 +246,8 @@ static asn1_TYPE_member_t asn1_MBR_T[] = { }, }; static ber_tlv_tag_t asn1_DEF_T_tags[] = { - (ASN_TAG_CLASS_PRIVATE | (1 << 2)) + (ASN_TAG_CLASS_PRIVATE | (1 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn1_TYPE_tag2member_t asn1_DEF_T_tag2el[] = { { (ASN_TAG_CLASS_PRIVATE | (2 << 2)), 0, 0, 0 }, /* a at 15 */ @@ -268,7 +275,10 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_T_tags, sizeof(asn1_DEF_T_tags) - /sizeof(asn1_DEF_T_tags[0]), /* 1 */ + /sizeof(asn1_DEF_T_tags[0]) - 1, /* 1 */ + asn1_DEF_T_tags, /* Same as above */ + sizeof(asn1_DEF_T_tags) + /sizeof(asn1_DEF_T_tags[0]), /* 2 */ 1, /* Whether CONSTRUCTED */ asn1_MBR_T, 2, /* Elements count */ diff --git a/tests/46-redefine-OK.asn1.-PR b/tests/46-redefine-OK.asn1.-PR index ea256a82a..9104df853 100644 --- a/tests/46-redefine-OK.asn1.-PR +++ b/tests/46-redefine-OK.asn1.-PR @@ -89,6 +89,9 @@ asn1_TYPE_descriptor_t asn1_DEF_PrimitiveType = { PrimitiveType_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_PrimitiveType_tags, + sizeof(asn1_DEF_PrimitiveType_tags) + /sizeof(asn1_DEF_PrimitiveType_tags[0]), /* 1 */ + asn1_DEF_PrimitiveType_tags, /* Same as above */ sizeof(asn1_DEF_PrimitiveType_tags) /sizeof(asn1_DEF_PrimitiveType_tags[0]), /* 1 */ -0, /* Unknown yet */ @@ -150,6 +153,9 @@ asn1_TYPE_descriptor_t asn1_DEF_ConstructedType = { SEQUENCE_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_ConstructedType_tags, + sizeof(asn1_DEF_ConstructedType_tags) + /sizeof(asn1_DEF_ConstructedType_tags[0]), /* 1 */ + asn1_DEF_ConstructedType_tags, /* Same as above */ sizeof(asn1_DEF_ConstructedType_tags) /sizeof(asn1_DEF_ConstructedType_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -238,7 +244,8 @@ T_free(asn1_TYPE_descriptor_t *td, /*** <<< STAT-DEFS [T] >>> ***/ static ber_tlv_tag_t asn1_DEF_T_tags[] = { - (ASN_TAG_CLASS_CONTEXT | (3 << 2)) + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_T = { "T", @@ -250,7 +257,10 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_T_tags, sizeof(asn1_DEF_T_tags) - /sizeof(asn1_DEF_T_tags[0]), /* 1 */ + /sizeof(asn1_DEF_T_tags[0]) - 1, /* 1 */ + asn1_DEF_T_tags, /* Same as above */ + sizeof(asn1_DEF_T_tags) + /sizeof(asn1_DEF_T_tags[0]), /* 2 */ -0, /* Unknown yet */ 0, 0, /* Defined elsewhere */ 0 /* No specifics */ diff --git a/tests/47-set-ext-OK.asn1.-P b/tests/47-set-ext-OK.asn1.-P index 5a3e2c106..51b77acd6 100644 --- a/tests/47-set-ext-OK.asn1.-P +++ b/tests/47-set-ext-OK.asn1.-P @@ -71,6 +71,9 @@ asn1_TYPE_descriptor_t asn1_DEF_T1 = { SET_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T1_tags, + sizeof(asn1_DEF_T1_tags) + /sizeof(asn1_DEF_T1_tags[0]), /* 1 */ + asn1_DEF_T1_tags, /* Same as above */ sizeof(asn1_DEF_T1_tags) /sizeof(asn1_DEF_T1_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -152,6 +155,9 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { SET_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T2_tags, + sizeof(asn1_DEF_T2_tags) + /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ + asn1_DEF_T2_tags, /* Same as above */ sizeof(asn1_DEF_T2_tags) /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -223,8 +229,10 @@ asn1_TYPE_descriptor_t asn1_DEF_T3 = { CHOICE_print, CHOICE_free, CHOICE_outmost_tag, - 0, /* No explicit tags (pointer) */ - 0, /* No explicit tags (count) */ + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ 1, /* Whether CONSTRUCTED */ asn1_MBR_T3, 1, /* Elements count */ @@ -294,8 +302,10 @@ asn1_TYPE_descriptor_t asn1_DEF_T4 = { CHOICE_print, CHOICE_free, CHOICE_outmost_tag, - 0, /* No explicit tags (pointer) */ - 0, /* No explicit tags (count) */ + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ 1, /* Whether CONSTRUCTED */ asn1_MBR_T4, 1, /* Elements count */ diff --git a/tests/50-constraint-OK.asn1.-P b/tests/50-constraint-OK.asn1.-P index 4459f5359..545ddba15 100644 --- a/tests/50-constraint-OK.asn1.-P +++ b/tests/50-constraint-OK.asn1.-P @@ -89,6 +89,9 @@ asn1_TYPE_descriptor_t asn1_DEF_Int1 = { Int1_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Int1_tags, + sizeof(asn1_DEF_Int1_tags) + /sizeof(asn1_DEF_Int1_tags[0]), /* 1 */ + asn1_DEF_Int1_tags, /* Same as above */ sizeof(asn1_DEF_Int1_tags) /sizeof(asn1_DEF_Int1_tags[0]), /* 1 */ -0, /* Unknown yet */ @@ -205,6 +208,9 @@ asn1_TYPE_descriptor_t asn1_DEF_Int2 = { Int2_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Int2_tags, + sizeof(asn1_DEF_Int2_tags) + /sizeof(asn1_DEF_Int2_tags[0]), /* 1 */ + asn1_DEF_Int2_tags, /* Same as above */ sizeof(asn1_DEF_Int2_tags) /sizeof(asn1_DEF_Int2_tags[0]), /* 1 */ -0, /* Unknown yet */ @@ -325,6 +331,9 @@ asn1_TYPE_descriptor_t asn1_DEF_Int3 = { Int3_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Int3_tags, + sizeof(asn1_DEF_Int3_tags) + /sizeof(asn1_DEF_Int3_tags[0]), /* 1 */ + asn1_DEF_Int3_tags, /* Same as above */ sizeof(asn1_DEF_Int3_tags) /sizeof(asn1_DEF_Int3_tags[0]), /* 1 */ -0, /* Unknown yet */ @@ -445,6 +454,9 @@ asn1_TYPE_descriptor_t asn1_DEF_Int4 = { Int4_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Int4_tags, + sizeof(asn1_DEF_Int4_tags) + /sizeof(asn1_DEF_Int4_tags[0]), /* 1 */ + asn1_DEF_Int4_tags, /* Same as above */ sizeof(asn1_DEF_Int4_tags) /sizeof(asn1_DEF_Int4_tags[0]), /* 1 */ -0, /* Unknown yet */ @@ -565,6 +577,9 @@ asn1_TYPE_descriptor_t asn1_DEF_Int5 = { Int5_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Int5_tags, + sizeof(asn1_DEF_Int5_tags) + /sizeof(asn1_DEF_Int5_tags[0]), /* 1 */ + asn1_DEF_Int5_tags, /* Same as above */ sizeof(asn1_DEF_Int5_tags) /sizeof(asn1_DEF_Int5_tags[0]), /* 1 */ -0, /* Unknown yet */ @@ -685,6 +700,9 @@ asn1_TYPE_descriptor_t asn1_DEF_ExtensibleExtensions = { ExtensibleExtensions_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_ExtensibleExtensions_tags, + sizeof(asn1_DEF_ExtensibleExtensions_tags) + /sizeof(asn1_DEF_ExtensibleExtensions_tags[0]), /* 1 */ + asn1_DEF_ExtensibleExtensions_tags, /* Same as above */ sizeof(asn1_DEF_ExtensibleExtensions_tags) /sizeof(asn1_DEF_ExtensibleExtensions_tags[0]), /* 1 */ -0, /* Unknown yet */ @@ -783,6 +801,9 @@ asn1_TYPE_descriptor_t asn1_DEF_Str1 = { Str1_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Str1_tags, + sizeof(asn1_DEF_Str1_tags) + /sizeof(asn1_DEF_Str1_tags[0]), /* 1 */ + asn1_DEF_Str1_tags, /* Same as above */ sizeof(asn1_DEF_Str1_tags) /sizeof(asn1_DEF_Str1_tags[0]), /* 1 */ -0, /* Unknown yet */ @@ -915,6 +936,9 @@ asn1_TYPE_descriptor_t asn1_DEF_Str2 = { Str2_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Str2_tags, + sizeof(asn1_DEF_Str2_tags) + /sizeof(asn1_DEF_Str2_tags[0]), /* 1 */ + asn1_DEF_Str2_tags, /* Same as above */ sizeof(asn1_DEF_Str2_tags) /sizeof(asn1_DEF_Str2_tags[0]), /* 1 */ -0, /* Unknown yet */ @@ -1058,6 +1082,9 @@ asn1_TYPE_descriptor_t asn1_DEF_Str3 = { Str3_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Str3_tags, + sizeof(asn1_DEF_Str3_tags) + /sizeof(asn1_DEF_Str3_tags[0]), /* 1 */ + asn1_DEF_Str3_tags, /* Same as above */ sizeof(asn1_DEF_Str3_tags) /sizeof(asn1_DEF_Str3_tags[0]), /* 1 */ -0, /* Unknown yet */ @@ -1187,6 +1214,9 @@ asn1_TYPE_descriptor_t asn1_DEF_Str4 = { Str4_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Str4_tags, + sizeof(asn1_DEF_Str4_tags) + /sizeof(asn1_DEF_Str4_tags[0]), /* 1 */ + asn1_DEF_Str4_tags, /* Same as above */ sizeof(asn1_DEF_Str4_tags) /sizeof(asn1_DEF_Str4_tags[0]), /* 1 */ -0, /* Unknown yet */ @@ -1316,6 +1346,9 @@ asn1_TYPE_descriptor_t asn1_DEF_PER_Visible = { PER_Visible_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_PER_Visible_tags, + sizeof(asn1_DEF_PER_Visible_tags) + /sizeof(asn1_DEF_PER_Visible_tags[0]), /* 1 */ + asn1_DEF_PER_Visible_tags, /* Same as above */ sizeof(asn1_DEF_PER_Visible_tags) /sizeof(asn1_DEF_PER_Visible_tags[0]), /* 1 */ -0, /* Unknown yet */ @@ -1445,6 +1478,9 @@ asn1_TYPE_descriptor_t asn1_DEF_PER_Visible_2 = { PER_Visible_2_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_PER_Visible_2_tags, + sizeof(asn1_DEF_PER_Visible_2_tags) + /sizeof(asn1_DEF_PER_Visible_2_tags[0]), /* 1 */ + asn1_DEF_PER_Visible_2_tags, /* Same as above */ sizeof(asn1_DEF_PER_Visible_2_tags) /sizeof(asn1_DEF_PER_Visible_2_tags[0]), /* 1 */ -0, /* Unknown yet */ @@ -1574,6 +1610,9 @@ asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_1 = { Not_PER_Visible_1_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Not_PER_Visible_1_tags, + sizeof(asn1_DEF_Not_PER_Visible_1_tags) + /sizeof(asn1_DEF_Not_PER_Visible_1_tags[0]), /* 1 */ + asn1_DEF_Not_PER_Visible_1_tags, /* Same as above */ sizeof(asn1_DEF_Not_PER_Visible_1_tags) /sizeof(asn1_DEF_Not_PER_Visible_1_tags[0]), /* 1 */ -0, /* Unknown yet */ @@ -1703,6 +1742,9 @@ asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_2 = { Not_PER_Visible_2_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Not_PER_Visible_2_tags, + sizeof(asn1_DEF_Not_PER_Visible_2_tags) + /sizeof(asn1_DEF_Not_PER_Visible_2_tags[0]), /* 1 */ + asn1_DEF_Not_PER_Visible_2_tags, /* Same as above */ sizeof(asn1_DEF_Not_PER_Visible_2_tags) /sizeof(asn1_DEF_Not_PER_Visible_2_tags[0]), /* 1 */ -0, /* Unknown yet */ @@ -1832,6 +1874,9 @@ asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_3 = { Not_PER_Visible_3_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Not_PER_Visible_3_tags, + sizeof(asn1_DEF_Not_PER_Visible_3_tags) + /sizeof(asn1_DEF_Not_PER_Visible_3_tags[0]), /* 1 */ + asn1_DEF_Not_PER_Visible_3_tags, /* Same as above */ sizeof(asn1_DEF_Not_PER_Visible_3_tags) /sizeof(asn1_DEF_Not_PER_Visible_3_tags[0]), /* 1 */ -0, /* Unknown yet */ @@ -1964,6 +2009,9 @@ asn1_TYPE_descriptor_t asn1_DEF_SIZE_but_not_FROM = { SIZE_but_not_FROM_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_SIZE_but_not_FROM_tags, + sizeof(asn1_DEF_SIZE_but_not_FROM_tags) + /sizeof(asn1_DEF_SIZE_but_not_FROM_tags[0]), /* 1 */ + asn1_DEF_SIZE_but_not_FROM_tags, /* Same as above */ sizeof(asn1_DEF_SIZE_but_not_FROM_tags) /sizeof(asn1_DEF_SIZE_but_not_FROM_tags[0]), /* 1 */ -0, /* Unknown yet */ @@ -2096,6 +2144,9 @@ asn1_TYPE_descriptor_t asn1_DEF_SIZE_and_FROM = { SIZE_and_FROM_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_SIZE_and_FROM_tags, + sizeof(asn1_DEF_SIZE_and_FROM_tags) + /sizeof(asn1_DEF_SIZE_and_FROM_tags[0]), /* 1 */ + asn1_DEF_SIZE_and_FROM_tags, /* Same as above */ sizeof(asn1_DEF_SIZE_and_FROM_tags) /sizeof(asn1_DEF_SIZE_and_FROM_tags[0]), /* 1 */ -0, /* Unknown yet */ @@ -2225,6 +2276,9 @@ asn1_TYPE_descriptor_t asn1_DEF_Neither_SIZE_nor_FROM = { Neither_SIZE_nor_FROM_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Neither_SIZE_nor_FROM_tags, + sizeof(asn1_DEF_Neither_SIZE_nor_FROM_tags) + /sizeof(asn1_DEF_Neither_SIZE_nor_FROM_tags[0]), /* 1 */ + asn1_DEF_Neither_SIZE_nor_FROM_tags, /* Same as above */ sizeof(asn1_DEF_Neither_SIZE_nor_FROM_tags) /sizeof(asn1_DEF_Neither_SIZE_nor_FROM_tags[0]), /* 1 */ -0, /* Unknown yet */ @@ -2371,6 +2425,9 @@ asn1_TYPE_descriptor_t asn1_DEF_Utf8_3 = { Utf8_3_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Utf8_3_tags, + sizeof(asn1_DEF_Utf8_3_tags) + /sizeof(asn1_DEF_Utf8_3_tags[0]), /* 1 */ + asn1_DEF_Utf8_3_tags, /* Same as above */ sizeof(asn1_DEF_Utf8_3_tags) /sizeof(asn1_DEF_Utf8_3_tags[0]), /* 1 */ -0, /* Unknown yet */ @@ -2487,6 +2544,9 @@ asn1_TYPE_descriptor_t asn1_DEF_Utf8_2 = { Utf8_2_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Utf8_2_tags, + sizeof(asn1_DEF_Utf8_2_tags) + /sizeof(asn1_DEF_Utf8_2_tags[0]), /* 1 */ + asn1_DEF_Utf8_2_tags, /* Same as above */ sizeof(asn1_DEF_Utf8_2_tags) /sizeof(asn1_DEF_Utf8_2_tags[0]), /* 1 */ -0, /* Unknown yet */ @@ -2585,6 +2645,9 @@ asn1_TYPE_descriptor_t asn1_DEF_Utf8_1 = { Utf8_1_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Utf8_1_tags, + sizeof(asn1_DEF_Utf8_1_tags) + /sizeof(asn1_DEF_Utf8_1_tags[0]), /* 1 */ + asn1_DEF_Utf8_1_tags, /* Same as above */ sizeof(asn1_DEF_Utf8_1_tags) /sizeof(asn1_DEF_Utf8_1_tags[0]), /* 1 */ -0, /* Unknown yet */ diff --git a/tests/60-any-OK.asn1.-P b/tests/60-any-OK.asn1.-P index 86d47f4b7..62fd9b388 100644 --- a/tests/60-any-OK.asn1.-P +++ b/tests/60-any-OK.asn1.-P @@ -61,6 +61,9 @@ asn1_TYPE_descriptor_t asn1_DEF_T1 = { SEQUENCE_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T1_tags, + sizeof(asn1_DEF_T1_tags) + /sizeof(asn1_DEF_T1_tags[0]), /* 1 */ + asn1_DEF_T1_tags, /* Same as above */ sizeof(asn1_DEF_T1_tags) /sizeof(asn1_DEF_T1_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ @@ -133,6 +136,9 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { SEQUENCE_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T2_tags, + sizeof(asn1_DEF_T2_tags) + /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ + asn1_DEF_T2_tags, /* Same as above */ sizeof(asn1_DEF_T2_tags) /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ 1, /* Whether CONSTRUCTED */ diff --git a/tests/65-multi-tag-OK.asn1.-P b/tests/65-multi-tag-OK.asn1.-P index fec7c9cb3..01681c2a4 100644 --- a/tests/65-multi-tag-OK.asn1.-P +++ b/tests/65-multi-tag-OK.asn1.-P @@ -83,6 +83,14 @@ static ber_tlv_tag_t asn1_DEF_T1_tags[] = { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)) }; +static ber_tlv_tag_t asn1_DEF_T1_all_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + (ASN_TAG_CLASS_CONTEXT | (5 << 2)), + (ASN_TAG_CLASS_CONTEXT | (6 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; asn1_TYPE_descriptor_t asn1_DEF_T1 = { "T1", T1_constraint, @@ -94,6 +102,9 @@ asn1_TYPE_descriptor_t asn1_DEF_T1 = { asn1_DEF_T1_tags, sizeof(asn1_DEF_T1_tags) /sizeof(asn1_DEF_T1_tags[0]), /* 4 */ + asn1_DEF_T1_all_tags, + sizeof(asn1_DEF_T1_all_tags) + /sizeof(asn1_DEF_T1_all_tags[0]), /* 6 */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -183,6 +194,13 @@ static ber_tlv_tag_t asn1_DEF_T2_tags[] = { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)) }; +static ber_tlv_tag_t asn1_DEF_T2_all_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + (ASN_TAG_CLASS_CONTEXT | (5 << 2)), + (ASN_TAG_CLASS_CONTEXT | (6 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; asn1_TYPE_descriptor_t asn1_DEF_T2 = { "T2", T2_constraint, @@ -194,6 +212,9 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { asn1_DEF_T2_tags, sizeof(asn1_DEF_T2_tags) /sizeof(asn1_DEF_T2_tags[0]), /* 3 */ + asn1_DEF_T2_all_tags, + sizeof(asn1_DEF_T2_all_tags) + /sizeof(asn1_DEF_T2_all_tags[0]), /* 5 */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -282,6 +303,12 @@ static ber_tlv_tag_t asn1_DEF_T3_tags[] = { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)) }; +static ber_tlv_tag_t asn1_DEF_T3_all_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + (ASN_TAG_CLASS_CONTEXT | (5 << 2)), + (ASN_TAG_CLASS_CONTEXT | (6 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; asn1_TYPE_descriptor_t asn1_DEF_T3 = { "T3", T3_constraint, @@ -293,6 +320,9 @@ asn1_TYPE_descriptor_t asn1_DEF_T3 = { asn1_DEF_T3_tags, sizeof(asn1_DEF_T3_tags) /sizeof(asn1_DEF_T3_tags[0]), /* 2 */ + asn1_DEF_T3_all_tags, + sizeof(asn1_DEF_T3_all_tags) + /sizeof(asn1_DEF_T3_all_tags[0]), /* 4 */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -379,7 +409,8 @@ T4_free(asn1_TYPE_descriptor_t *td, static ber_tlv_tag_t asn1_DEF_T4_tags[] = { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), - (ASN_TAG_CLASS_CONTEXT | (6 << 2)) + (ASN_TAG_CLASS_CONTEXT | (6 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_T4 = { "T4", @@ -391,7 +422,10 @@ asn1_TYPE_descriptor_t asn1_DEF_T4 = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_T4_tags, sizeof(asn1_DEF_T4_tags) - /sizeof(asn1_DEF_T4_tags[0]), /* 2 */ + /sizeof(asn1_DEF_T4_tags[0]) - 1, /* 2 */ + asn1_DEF_T4_tags, /* Same as above */ + sizeof(asn1_DEF_T4_tags) + /sizeof(asn1_DEF_T4_tags[0]), /* 3 */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -477,7 +511,8 @@ T5_free(asn1_TYPE_descriptor_t *td, /*** <<< STAT-DEFS [T5] >>> ***/ static ber_tlv_tag_t asn1_DEF_T5_tags[] = { - (ASN_TAG_CLASS_CONTEXT | (6 << 2)) + (ASN_TAG_CLASS_CONTEXT | (6 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_T5 = { "T5", @@ -489,7 +524,10 @@ asn1_TYPE_descriptor_t asn1_DEF_T5 = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_T5_tags, sizeof(asn1_DEF_T5_tags) - /sizeof(asn1_DEF_T5_tags[0]), /* 1 */ + /sizeof(asn1_DEF_T5_tags[0]) - 1, /* 1 */ + asn1_DEF_T5_tags, /* Same as above */ + sizeof(asn1_DEF_T5_tags) + /sizeof(asn1_DEF_T5_tags[0]), /* 2 */ -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ @@ -586,6 +624,9 @@ asn1_TYPE_descriptor_t asn1_DEF_T6 = { T6_free, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T6_tags, + sizeof(asn1_DEF_T6_tags) + /sizeof(asn1_DEF_T6_tags[0]), /* 1 */ + asn1_DEF_T6_tags, /* Same as above */ sizeof(asn1_DEF_T6_tags) /sizeof(asn1_DEF_T6_tags[0]), /* 1 */ -0, /* Unknown yet */ @@ -673,7 +714,9 @@ T_free(asn1_TYPE_descriptor_t *td, /*** <<< STAT-DEFS [T] >>> ***/ static ber_tlv_tag_t asn1_DEF_T_tags[] = { - (ASN_TAG_CLASS_CONTEXT | (0 << 2)) + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + (ASN_TAG_CLASS_CONTEXT | (123 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_T = { "T", @@ -685,7 +728,10 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_T_tags, sizeof(asn1_DEF_T_tags) - /sizeof(asn1_DEF_T_tags[0]), /* 1 */ + /sizeof(asn1_DEF_T_tags[0]) - 2, /* 1 */ + asn1_DEF_T_tags, /* Same as above */ + sizeof(asn1_DEF_T_tags) + /sizeof(asn1_DEF_T_tags[0]), /* 3 */ -0, /* Unknown yet */ 0, 0, /* Defined elsewhere */ 0 /* No specifics */ @@ -740,7 +786,8 @@ static asn1_TYPE_member_t asn1_MBR_Ts[] = { }, }; static ber_tlv_tag_t asn1_DEF_Ts_tags[] = { - (ASN_TAG_CLASS_CONTEXT | (123 << 2)) + (ASN_TAG_CLASS_CONTEXT | (123 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn1_TYPE_tag2member_t asn1_DEF_Ts_tag2el[] = { { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* m1 at 24 */ @@ -765,7 +812,10 @@ asn1_TYPE_descriptor_t asn1_DEF_Ts = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_Ts_tags, sizeof(asn1_DEF_Ts_tags) - /sizeof(asn1_DEF_Ts_tags[0]), /* 1 */ + /sizeof(asn1_DEF_Ts_tags[0]) - 1, /* 1 */ + asn1_DEF_Ts_tags, /* Same as above */ + sizeof(asn1_DEF_Ts_tags) + /sizeof(asn1_DEF_Ts_tags[0]), /* 2 */ 1, /* Whether CONSTRUCTED */ asn1_MBR_Ts, 3, /* Elements count */ From 313a58129d34646f1d07965cc18934557f12ec99 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 13 Sep 2004 08:31:41 +0000 Subject: [PATCH 0312/1469] version bump-up git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@312 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure | 2 +- configure.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 171830b00..41f15bd2b 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.9.4 + VERSION=0.9.5 cat >>confdefs.h <<_ACEOF diff --git a/configure.in b/configure.in index 40341d4b0..c3cddb798 100644 --- a/configure.in +++ b/configure.in @@ -3,7 +3,7 @@ AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_BUILD AC_CANONICAL_TARGET AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.9.4) +AM_INIT_AUTOMAKE(asn1c, 0.9.5) AC_SUBST(PATH) From f72653e5b39c5ae608089728300e24caf32ddb44 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 13 Sep 2004 08:32:15 +0000 Subject: [PATCH 0313/1469] inner structures tagging fix git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@313 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ChangeLog b/ChangeLog index 9725d7fd2..fc7abe1d4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,14 @@ +0.9.5: 2004-Sep-13 + + * Fixed CER (common BER) decoder code. See check-25.c/VisibleString + case for details. X.690 specifies that inner structures in BER + encoding must be tagged by stripping off the outer tag for each + subsequent containment level. See also X.690: 8.21.5.4 and + the "Spouse" case in A.3. + (Severity: medium, Security impact: low) + * Added converters between any generic type and the ANY type. + 0.9.4: 2004-Sep-10 * More support for recursive type definitions. From c2c1f7f109e1fe8386ef8944a54801d04199cd53 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 14 Sep 2004 02:35:12 +0000 Subject: [PATCH 0314/1469] test for possibility to use tags inside CLASS definition git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@314 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/34-class-OK.asn1 | 2 +- tests/34-class-OK.asn1.-EF | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/34-class-OK.asn1 b/tests/34-class-OK.asn1 index b2d4dffdb..48437fbac 100644 --- a/tests/34-class-OK.asn1 +++ b/tests/34-class-OK.asn1 @@ -14,7 +14,7 @@ BEGIN -- First CLASS EXTENSION ::= CLASS { - &id OBJECT IDENTIFIER UNIQUE, + &id [PRIVATE 0] OBJECT IDENTIFIER UNIQUE, &ExtnType } WITH SYNTAX { SYNTAX &ExtnType diff --git a/tests/34-class-OK.asn1.-EF b/tests/34-class-OK.asn1.-EF index e61b2f44d..7a181c3bf 100644 --- a/tests/34-class-OK.asn1.-EF +++ b/tests/34-class-OK.asn1.-EF @@ -6,7 +6,7 @@ DEFINITIONS IMPLICIT TAGS ::= BEGIN EXTENSION ::= CLASS { - &id OBJECT IDENTIFIER UNIQUE, + &id [PRIVATE 0] OBJECT IDENTIFIER UNIQUE, &ExtnType } WITH SYNTAX { SYNTAX &ExtnType From fce48a452da490809e5d51444903ca4e4e39ffba Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 14 Sep 2004 02:36:39 +0000 Subject: [PATCH 0315/1469] Type may contain tags git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@315 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/Makefile.in | 2 +- libasn1parser/asn1p_y.c | 1081 +++++++++++++++++-------------------- libasn1parser/asn1p_y.y | 37 +- 3 files changed, 522 insertions(+), 598 deletions(-) diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index eba1ca00c..c8266756a 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -448,9 +448,9 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." + -rm -f asn1p_y.c -rm -f asn1p_y.h -rm -f asn1p_l.c - -rm -f asn1p_y.c clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index 9a33633d7..84a8c555e 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -205,11 +205,11 @@ typedef union { -#define YYFINAL 396 +#define YYFINAL 395 #define YYFLAG -32768 #define YYNTBASE 115 -#define YYTRANSLATE(x) ((unsigned)(x) <= 355 ? yytranslate[x] : 214) +#define YYTRANSLATE(x) ((unsigned)(x) <= 355 ? yytranslate[x] : 213) static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -258,11 +258,11 @@ static const short yyprhs[] = { 0, 79, 81, 82, 86, 88, 92, 95, 97, 100, 105, 107, 111, 113, 115, 119, 123, 126, 128, 132, 134, 136, 143, 145, 147, 148, 150, 152, 156, 158, 160, - 165, 170, 174, 181, 183, 187, 189, 193, 197, 199, - 203, 205, 207, 209, 213, 217, 221, 223, 225, 229, - 232, 234, 240, 241, 243, 245, 249, 252, 257, 262, - 263, 265, 266, 273, 275, 278, 280, 282, 284, 288, - 292, 295, 297, 299, 304, 309, 314, 319, 324, 326, + 165, 169, 173, 180, 182, 186, 188, 192, 196, 198, + 202, 204, 206, 208, 212, 216, 220, 222, 224, 228, + 231, 233, 239, 240, 242, 244, 248, 251, 256, 261, + 262, 264, 265, 272, 274, 277, 279, 281, 283, 287, + 291, 295, 297, 299, 304, 309, 314, 319, 324, 326, 331, 336, 338, 342, 344, 348, 352, 354, 358, 360, 364, 366, 368, 370, 372, 377, 378, 382, 384, 386, 388, 390, 392, 394, 398, 400, 403, 405, 407, 409, @@ -277,7 +277,7 @@ static const short yyprhs[] = { 0, 625, 629, 632, 636, 638, 642, 643, 645, 647, 650, 652, 654, 655, 659, 662, 666, 668, 672, 674, 679, 684, 686, 688, 690, 692, 693, 695, 697, 700, 703, - 705, 707, 709, 711, 713 + 705, 707, 709 }; static const short yyrhs[] = { 116, @@ -297,20 +297,20 @@ static const short yyrhs[] = { 116, 0, 210, 0, 212, 0, 210, 138, 3, 104, 139, 105, 0, 163, 0, 173, 0, 0, 140, 0, 141, 0, 140, 109, 141, 0, 102, 0, 184, 0, 210, - 3, 208, 87, 0, 210, 3, 208, 161, 0, 210, - 3, 151, 0, 210, 104, 143, 105, 3, 161, 0, - 144, 0, 143, 109, 144, 0, 210, 0, 210, 110, - 212, 0, 173, 110, 212, 0, 146, 0, 145, 109, - 146, 0, 161, 0, 212, 0, 148, 0, 147, 109, - 148, 0, 213, 161, 200, 0, 30, 68, 161, 0, - 160, 0, 150, 0, 149, 109, 150, 0, 213, 161, - 0, 160, 0, 28, 104, 153, 105, 155, 0, 0, - 88, 0, 154, 0, 153, 109, 154, 0, 166, 200, - 0, 166, 161, 200, 152, 0, 166, 166, 200, 152, - 0, 0, 156, 0, 0, 95, 82, 104, 157, 158, - 105, 0, 159, 0, 158, 159, 0, 4, 0, 166, - 0, 102, 0, 102, 111, 171, 0, 102, 111, 207, - 0, 162, 180, 0, 175, 0, 176, 0, 27, 104, + 3, 208, 87, 0, 210, 3, 161, 0, 210, 3, + 151, 0, 210, 104, 143, 105, 3, 161, 0, 144, + 0, 143, 109, 144, 0, 210, 0, 210, 110, 212, + 0, 173, 110, 212, 0, 146, 0, 145, 109, 146, + 0, 161, 0, 212, 0, 148, 0, 147, 109, 148, + 0, 212, 161, 200, 0, 30, 68, 161, 0, 160, + 0, 150, 0, 149, 109, 150, 0, 212, 161, 0, + 160, 0, 28, 104, 153, 105, 155, 0, 0, 88, + 0, 154, 0, 153, 109, 154, 0, 166, 200, 0, + 166, 161, 200, 152, 0, 166, 166, 200, 152, 0, + 0, 156, 0, 0, 95, 82, 104, 157, 158, 105, + 0, 159, 0, 158, 159, 0, 4, 0, 166, 0, + 102, 0, 102, 111, 171, 0, 102, 111, 207, 0, + 208, 162, 180, 0, 175, 0, 176, 0, 27, 104, 149, 105, 0, 78, 104, 147, 105, 0, 79, 104, 147, 105, 0, 78, 180, 68, 162, 0, 79, 180, 68, 162, 0, 18, 0, 18, 35, 25, 212, 0, @@ -351,40 +351,39 @@ static const short yyrhs[] = { 116, 0, 212, 0, 212, 106, 207, 107, 0, 212, 106, 171, 107, 0, 207, 0, 102, 0, 9, 0, 10, 0, 0, 209, 0, 103, 0, 103, 52, 0, 103, - 41, 0, 11, 0, 12, 0, 12, 0, 8, 0, - 212, 0, 212, 209, 0 + 41, 0, 11, 0, 12, 0, 12, 0, 8, 0 }; #endif #if YYDEBUG != 0 static const short yyrline[] = { 0, - 300, 306, 312, 328, 353, 355, 358, 362, 367, 374, - 382, 387, 391, 400, 402, 410, 414, 422, 426, 429, - 432, 436, 456, 458, 466, 470, 502, 506, 515, 522, - 535, 542, 544, 556, 569, 576, 581, 587, 593, 602, - 608, 614, 621, 629, 633, 636, 643, 649, 655, 662, - 671, 681, 689, 697, 699, 709, 712, 716, 719, 731, - 743, 750, 766, 775, 785, 795, 800, 807, 817, 823, - 829, 833, 845, 851, 857, 865, 872, 877, 883, 889, - 896, 901, 911, 913, 916, 924, 930, 939, 945, 962, - 964, 969, 973, 978, 983, 989, 993, 1004, 1013, 1022, - 1033, 1054, 1058, 1064, 1070, 1076, 1082, 1090, 1098, 1104, - 1118, 1142, 1149, 1163, 1172, 1182, 1192, 1200, 1221, 1230, - 1239, 1240, 1242, 1249, 1261, 1271, 1273, 1278, 1282, 1286, - 1290, 1293, 1298, 1310, 1326, 1337, 1351, 1353, 1354, 1355, - 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1369, 1371, - 1372, 1375, 1382, 1394, 1396, 1400, 1404, 1405, 1406, 1407, - 1408, 1412, 1413, 1414, 1415, 1419, 1420, 1427, 1427, 1428, - 1428, 1429, 1431, 1433, 1438, 1442, 1451, 1455, 1460, 1464, - 1470, 1480, 1484, 1487, 1490, 1495, 1504, 1512, 1518, 1525, - 1533, 1541, 1550, 1553, 1558, 1560, 1561, 1562, 1565, 1569, - 1574, 1578, 1589, 1594, 1599, 1606, 1612, 1616, 1621, 1627, - 1639, 1641, 1644, 1648, 1651, 1656, 1660, 1668, 1683, 1689, - 1696, 1709, 1721, 1736, 1740, 1757, 1759, 1762, 1766, 1772, - 1775, 1777, 1777, 1797, 1802, 1807, 1813, 1819, 1827, 1835, - 1843, 1850, 1860, 1865, 1895, 1897, 1900, 1905, 1909, 1915, - 1920, 1927, 1934, 1941, 1946 + 299, 305, 311, 327, 352, 354, 357, 361, 366, 373, + 381, 386, 390, 399, 401, 409, 413, 421, 425, 428, + 431, 435, 455, 457, 465, 469, 501, 505, 514, 521, + 534, 541, 543, 555, 568, 575, 580, 586, 592, 601, + 607, 613, 620, 628, 632, 635, 642, 648, 654, 661, + 670, 680, 688, 696, 698, 708, 711, 715, 718, 730, + 742, 748, 764, 773, 783, 793, 798, 805, 815, 821, + 827, 831, 843, 849, 855, 862, 869, 874, 880, 886, + 892, 897, 907, 909, 912, 920, 926, 935, 941, 958, + 960, 965, 969, 974, 979, 985, 989, 1000, 1009, 1018, + 1029, 1051, 1055, 1061, 1067, 1073, 1079, 1087, 1095, 1101, + 1115, 1139, 1146, 1160, 1169, 1179, 1189, 1197, 1218, 1227, + 1236, 1237, 1239, 1246, 1258, 1268, 1270, 1275, 1279, 1283, + 1287, 1290, 1295, 1307, 1323, 1334, 1348, 1350, 1351, 1352, + 1353, 1354, 1355, 1356, 1357, 1358, 1359, 1360, 1366, 1368, + 1369, 1372, 1379, 1391, 1393, 1397, 1401, 1402, 1403, 1404, + 1405, 1409, 1410, 1411, 1412, 1416, 1417, 1424, 1424, 1425, + 1425, 1426, 1428, 1430, 1435, 1439, 1448, 1452, 1457, 1461, + 1467, 1477, 1481, 1484, 1487, 1492, 1501, 1509, 1515, 1522, + 1530, 1538, 1547, 1550, 1555, 1557, 1558, 1559, 1562, 1566, + 1571, 1575, 1586, 1591, 1596, 1603, 1609, 1613, 1618, 1624, + 1636, 1638, 1641, 1645, 1648, 1653, 1657, 1665, 1680, 1686, + 1693, 1706, 1718, 1733, 1737, 1754, 1756, 1759, 1763, 1769, + 1772, 1774, 1774, 1794, 1799, 1804, 1810, 1816, 1824, 1832, + 1840, 1847, 1857, 1862, 1892, 1894, 1897, 1902, 1906, 1912, + 1917, 1924, 1931 }; #endif @@ -432,7 +431,7 @@ static const char * const yytname[] = { "$","error","$undefined.","TOK_PPEQ", "SimpleTableConstraint","ComponentRelationConstraint","AtNotationList","AtNotationElement", "ComponentIdList","optMarker","Marker","DefaultValue","@4","UniverationDefinition", "UniverationList","UniverationElement","SignedNumber","optTag","Tag","TypeRefName", -"ObjectClassReference","Identifier","TaggedIdentifier", NULL +"ObjectClassReference","Identifier", NULL }; #endif @@ -462,7 +461,7 @@ static const short yyr1[] = { 0, 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, 202, 203, 202, 204, 204, 205, 205, 206, 206, 206, 206, 206, 207, 207, 208, 208, 209, 209, 209, 210, - 210, 211, 212, 213, 213 + 210, 211, 212 }; static const short yyr2[] = { 0, @@ -472,11 +471,11 @@ static const short yyr2[] = { 0, 1, 0, 3, 1, 3, 2, 1, 2, 4, 1, 3, 1, 1, 3, 3, 2, 1, 3, 1, 1, 6, 1, 1, 0, 1, 1, 3, 1, 1, 4, - 4, 3, 6, 1, 3, 1, 3, 3, 1, 3, + 3, 3, 6, 1, 3, 1, 3, 3, 1, 3, 1, 1, 1, 3, 3, 3, 1, 1, 3, 2, 1, 5, 0, 1, 1, 3, 2, 4, 4, 0, 1, 0, 6, 1, 2, 1, 1, 1, 3, 3, - 2, 1, 1, 4, 4, 4, 4, 4, 1, 4, + 3, 1, 1, 4, 4, 4, 4, 4, 1, 4, 4, 1, 3, 1, 3, 3, 1, 3, 1, 3, 1, 1, 1, 1, 4, 0, 3, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 1, 1, @@ -491,7 +490,7 @@ static const short yyr2[] = { 0, 3, 2, 3, 1, 3, 0, 1, 1, 2, 1, 1, 0, 3, 2, 3, 1, 3, 1, 4, 4, 1, 1, 1, 1, 0, 1, 1, 2, 2, 1, - 1, 1, 1, 1, 2 + 1, 1, 1 }; static const short yydefact[] = { 0, @@ -506,286 +505,242 @@ static const short yydefact[] = { 0, 26, 245, 114, 252, 0, 137, 0, 0, 150, 144, 148, 149, 138, 0, 0, 139, 143, 147, 0, 0, 52, 53, 140, 117, 0, 33, 45, 44, 0, 35, - 38, 0, 0, 0, 247, 62, 0, 246, 0, 151, - 146, 145, 142, 141, 0, 64, 0, 66, 0, 0, - 0, 48, 5, 41, 0, 249, 248, 114, 252, 109, - 0, 0, 173, 173, 60, 61, 173, 112, 152, 140, + 38, 0, 0, 0, 247, 62, 61, 0, 246, 0, + 151, 146, 145, 142, 141, 0, 64, 0, 66, 0, + 0, 0, 48, 5, 41, 0, 249, 248, 114, 252, + 109, 0, 0, 173, 173, 60, 173, 112, 152, 140, 102, 103, 0, 115, 116, 0, 0, 0, 0, 54, 123, 124, 118, 119, 121, 128, 130, 129, 243, 244, - 126, 125, 132, 131, 0, 133, 39, 0, 85, 226, + 126, 125, 132, 131, 0, 133, 39, 0, 85, 245, 122, 0, 0, 0, 0, 0, 0, 0, 174, 175, - 0, 0, 101, 0, 153, 0, 0, 65, 68, 67, + 0, 0, 101, 0, 153, 245, 245, 65, 68, 67, 203, 204, 200, 0, 199, 205, 0, 58, 0, 0, 0, 55, 56, 59, 182, 0, 188, 194, 193, 216, 217, 201, 202, 0, 0, 0, 90, 0, 0, 228, - 226, 226, 87, 227, 0, 98, 0, 78, 81, 254, - 0, 113, 0, 0, 0, 73, 77, 0, 0, 179, + 226, 226, 87, 227, 0, 0, 98, 0, 78, 81, + 245, 113, 0, 0, 0, 73, 77, 245, 0, 179, 0, 0, 0, 0, 242, 234, 0, 236, 241, 238, 0, 69, 71, 72, 63, 195, 0, 0, 0, 0, 0, 51, 0, 170, 171, 168, 169, 0, 0, 172, 0, 0, 0, 0, 120, 135, 127, 134, 0, 82, 91, 86, 232, 231, 230, 229, 83, 83, 110, 0, - 104, 0, 255, 80, 0, 0, 105, 0, 226, 177, - 0, 107, 0, 106, 108, 235, 0, 0, 111, 0, - 196, 197, 192, 190, 0, 218, 187, 57, 183, 184, - 185, 0, 191, 189, 0, 0, 220, 136, 0, 0, - 84, 88, 89, 99, 100, 79, 176, 76, 74, 75, - 180, 178, 237, 0, 0, 70, 198, 209, 0, 207, - 173, 186, 0, 222, 224, 219, 0, 92, 233, 0, - 240, 239, 206, 0, 211, 223, 0, 221, 0, 181, - 208, 214, 215, 213, 210, 212, 225, 96, 0, 94, - 97, 93, 95, 0, 0, 0 + 104, 0, 80, 0, 245, 105, 0, 226, 177, 0, + 107, 0, 106, 108, 235, 0, 0, 111, 245, 196, + 197, 192, 190, 0, 218, 187, 57, 183, 184, 185, + 0, 191, 189, 0, 0, 220, 136, 0, 0, 84, + 88, 89, 99, 100, 79, 176, 76, 74, 75, 180, + 178, 237, 0, 0, 70, 198, 209, 0, 207, 173, + 186, 0, 222, 224, 219, 0, 92, 233, 0, 240, + 239, 206, 0, 211, 223, 0, 221, 0, 181, 208, + 214, 215, 213, 210, 212, 225, 96, 0, 94, 97, + 93, 95, 0, 0, 0 }; -static const short yydefgoto[] = { 394, +static const short yydefgoto[] = { 393, 3, 4, 8, 9, 13, 14, 25, 26, 27, 55, 56, 57, 106, 58, 74, 75, 76, 77, 59, 69, - 70, 60, 100, 211, 212, 213, 61, 125, 126, 261, - 262, 245, 246, 237, 238, 116, 342, 178, 179, 290, - 291, 379, 389, 390, 247, 263, 147, 148, 163, 164, - 180, 181, 62, 172, 225, 173, 287, 149, 150, 151, + 70, 60, 100, 211, 212, 213, 61, 126, 127, 261, + 262, 245, 246, 238, 239, 116, 341, 178, 179, 290, + 291, 378, 388, 389, 247, 263, 147, 148, 163, 164, + 180, 181, 62, 172, 225, 173, 287, 149, 103, 151, 152, 278, 279, 281, 188, 189, 190, 249, 250, 215, - 268, 216, 217, 218, 359, 360, 385, 386, 219, 220, - 221, 336, 337, 364, 233, 234, 296, 340, 195, 257, - 258, 222, 117, 118, 153, 104, 223, 248 + 268, 216, 217, 218, 358, 359, 384, 385, 219, 220, + 221, 335, 336, 363, 233, 234, 296, 339, 195, 257, + 258, 222, 235, 119, 153, 104, 223 }; -static const short yypact[] = { 86, --32768,-32768, 86,-32768, -66,-32768, 12, 95,-32768,-32768, --32768,-32768, 14,-32768, 4, 217,-32768,-32768, 118, 97, - 56, 82, 121, 104, 195, 217,-32768, 115,-32768,-32768, --32768,-32768,-32768, 179,-32768,-32768, 446,-32768, 213, 23, --32768,-32768,-32768, 96,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 191, 446,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 212, 744,-32768, 133,-32768, 124,-32768, --32768,-32768,-32768, 45,-32768, -19,-32768,-32768,-32768,-32768, --32768, 20, 135,-32768, 164,-32768, 176, 197,-32768,-32768, --32768,-32768,-32768, 225, 199,-32768,-32768,-32768, 761, 275, --32768,-32768,-32768, 171, 282,-32768,-32768,-32768, 159,-32768, --32768, 86, 159, 182, 32,-32768, 607,-32768, 159,-32768, --32768,-32768,-32768,-32768, -30,-32768, 177, 184, 188, 236, - 54,-32768, -66,-32768, 236,-32768,-32768, 61, 192, 262, - 194, 231, 76, 77,-32768,-32768, -11,-32768,-32768, 196, --32768,-32768, 200,-32768,-32768, 302, 761, 299, 299, 140, --32768,-32768, 202,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 203,-32768,-32768, -24,-32768, 530, --32768, 283, 28, 255, 206, 24, 245, 241,-32768, 211, - 24, 251,-32768, 42,-32768, 385, 684,-32768,-32768,-32768, --32768,-32768,-32768, -31,-32768,-32768, 291,-32768, 86, 245, - 218, 215,-32768, 174, 226, 220, -31,-32768,-32768, 223, --32768,-32768,-32768, 236, 325, 299, 240, 236, 324,-32768, - 92, 92,-32768,-32768, 299, 227, -9,-32768,-32768, 233, - 684,-32768, 245, 269, 63,-32768,-32768, 684, 232, 93, - 684, 245, 100, 684,-32768,-32768, 103,-32768,-32768, 235, - 112,-32768,-32768,-32768,-32768, 229, 242, 83, 243, 239, - 238,-32768, 140,-32768,-32768,-32768,-32768, 245, 245,-32768, - 245, 245, 154, 244,-32768,-32768, 348,-32768, 271,-32768, --32768,-32768,-32768,-32768,-32768,-32768, 266, 266,-32768, 253, --32768, 28,-32768,-32768, 248, 684,-32768, 24, 92,-32768, - 257,-32768, 250,-32768,-32768,-32768, 16, 253,-32768, 385, --32768, 249,-32768,-32768, 35,-32768,-32768,-32768,-32768,-32768, --32768, 254,-32768,-32768, 10, 122,-32768,-32768, 259, 325, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, - 256,-32768,-32768, 265, 267,-32768,-32768,-32768, 134,-32768, - -11,-32768, 299, 261,-32768,-32768, 244,-32768, 348, 245, --32768,-32768,-32768, 35, 72, 261, 299,-32768, 190, 174, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 15,-32768, --32768,-32768,-32768, 366, 375,-32768 +static const short yypact[] = { 29, +-32768,-32768, 29,-32768, -79,-32768, 18, 22,-32768,-32768, +-32768,-32768, 42,-32768, 34, 236,-32768,-32768, 99, 71, + 115, 118, 102, 121, 190, 236,-32768, 105,-32768,-32768, +-32768,-32768,-32768, 224,-32768,-32768, 329,-32768, 235, 11, +-32768,-32768,-32768, 192,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 227, 329,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 33, 238,-32768, 173,-32768, 54,-32768, +-32768,-32768,-32768, 23,-32768, -17,-32768,-32768,-32768,-32768, +-32768, -10, 174,-32768, 210,-32768, 211, 223,-32768,-32768, +-32768,-32768,-32768, 247, 216,-32768,-32768,-32768, 543, 296, +-32768,-32768,-32768, 199, 310,-32768,-32768,-32768, 246,-32768, +-32768, 29, 246, 212, 176,-32768,-32768, 406,-32768, 246, +-32768,-32768,-32768,-32768,-32768, 109,-32768, 208, 213, 217, + 155, 78,-32768, -79,-32768, 155,-32768,-32768, -9, 221, + 291, 231, 260, 103, 128,-32768, 117,-32768,-32768, 232, +-32768,-32768, 240,-32768,-32768, 336, 543, 342, 342, 135, +-32768,-32768, 241,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 242,-32768,-32768, 150,-32768, 61, +-32768, 326, 16, 278, 251, 40, 140, 292,-32768, 253, + 40, 294,-32768, 52,-32768, 24, 261,-32768,-32768,-32768, +-32768,-32768,-32768, 25,-32768,-32768, 338,-32768, 29, 140, + 265, 263,-32768, 233, 277, 270, 25,-32768,-32768, 276, +-32768,-32768,-32768, 155, 377, 342, 287, 155, 298,-32768, + 35, 35,-32768,-32768, 483, 342, 274, 156,-32768,-32768, + 261,-32768, 140, 318, 158,-32768,-32768, 261, 280, 249, + 483, 140, 164, 483,-32768,-32768, 166,-32768,-32768, 284, + 167,-32768,-32768,-32768,-32768, 279, 290, 165, 297, 289, + 299,-32768, 135,-32768,-32768,-32768,-32768, 140, 140,-32768, + 140, 140, 182, 293,-32768,-32768, 400,-32768, 323,-32768, +-32768,-32768,-32768,-32768,-32768,-32768, 320, 320,-32768, 388, +-32768, 16,-32768, 302, 261,-32768, 40, 35,-32768, 308, +-32768, 304,-32768,-32768,-32768, 56, 388,-32768, 24,-32768, + 300,-32768,-32768, 30,-32768,-32768,-32768,-32768,-32768,-32768, + 309,-32768,-32768, 9, 175,-32768,-32768, 311, 377,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 316, +-32768,-32768, 313, 319,-32768,-32768,-32768, 178,-32768, 117, +-32768, 342, 315,-32768,-32768, 293,-32768, 400, 140,-32768, +-32768,-32768, 30, 92, 315, 342,-32768, 239, 233,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768, 7,-32768,-32768, +-32768,-32768, 431, 434,-32768 }; static const short yypgoto[] = {-32768, --32768, 373, 246,-32768,-32768, 364,-32768,-32768, 352,-32768, --32768, 327,-32768,-32768,-32768, 306,-32768, 268,-32768,-32768, - 276,-32768, 319,-32768,-32768, 113,-32768,-32768, 237,-32768, - 68, 201, 87,-32768, 88,-32768, 101,-32768, 170,-32768, --32768,-32768,-32768, 13, -167, -109, -44, -50,-32768, 180, - -173, -86,-32768,-32768,-32768, -232, 65, -54, -52,-32768, - 43,-32768,-32768,-32768, -143,-32768,-32768, -169, -157, 3, - 189,-32768, -174,-32768,-32768, 39,-32768,-32768,-32768,-32768, --32768,-32768, 47, 53, -154,-32768,-32768,-32768,-32768,-32768, - 102, -122,-32768, 178, 2,-32768, -7, -166 +-32768, 432, 303,-32768,-32768, 423,-32768,-32768, 412,-32768, +-32768, 383,-32768,-32768,-32768, 366,-32768, 328,-32768,-32768, + 334,-32768, 379,-32768,-32768, 172,-32768,-32768, 295,-32768, + 129, 256, 142,-32768, 149,-32768, 159,-32768, 230,-32768, +-32768,-32768,-32768, 72, -169, -81, -18, -49,-32768, 237, + -172, -68,-32768,-32768,-32768, -246, 120, -52, -115,-32768, + 116,-32768,-32768,-32768, -138,-32768,-32768, -12, -156, -200, + 250,-32768, -186,-32768,-32768, 90,-32768,-32768,-32768,-32768, +-32768,-32768, 100, 106, -179,-32768,-32768,-32768,-32768,-32768, + 160, -122, 392,-32768, 2,-32768, -7 }; -#define YYLAST 852 +#define YYLAST 634 static const short yytable[] = { 15, - 192, 5, 214, 193, 5, 15, 232, 146, 174, 102, - 102, 103, 103, 101, 101, 239, 241, 10, 388, 10, - 11, 10, 11, 10, 169, 170, 112, 161, 162, 65, - 10, 10, 72, 1, 2, 10, 79, 7, 64, 67, - 271, 71, 10, 165, 127, 78, 103, 114, 65, 10, - 169, 170, 10, 244, 295, 1, 2, 64, 166, 167, - 168, 10, 169, 170, 1, 2, 79, 344, 185, 266, - 231, 259, 136, 305, 156, 78, 297, 298, 157, 63, - 227, 267, 313, 137, 228, 354, 382, 265, 201, 113, - 10, 169, 170, 324, 187, 301, 1, 2, 63, 302, - 128, 72, 127, 10, 103, 79, 1, 2, 334, 19, - 71, 155, 332, 133, 78, 214, 12, 255, 17, 392, - 154, 363, 115, 176, 229, 236, 28, 202, 16, 236, - 68, 304, 175, 242, 239, 241, 358, 165, 309, 30, - 383, 73, 323, 255, 384, 201, 256, 10, 169, 170, - 199, 200, 110, 29, 350, 185, 185, 171, 128, 201, - 230, 10, 169, 170, -250, 31, 10, 307, 206, 1, - 2, 308, 119, 32, 294, 240, 103, 345, 240, 186, - 191, 187, 187, 240, 202, 203, 260, 33, 264, 274, - 275, 276, 277, 388, 259, 355, 348, 34, 202, 37, - 204, 311, 161, 162, 314, 391, 312, 316, 308, 315, - 270, 317, 380, 333, 82, 391, 319, 375, 288, 205, - 320, 36, 83, 84, 66, 206, 366, 299, 20, 80, - 367, 108, 109, 85, 207, 86, 21, 87, 373, 206, - 107, 208, 374, 209, 120, 210, 119, 88, 161, 162, - 201, 89, 10, 169, 170, 90, 121, 22, 91, 23, - 10, 169, 170, 1, 2, 83, 84, 122, 24, 92, - 274, 275, 276, 277, 93, 123, 94, 129, 95, 124, - 329, 330, 130, 331, 131, 135, 158, 96, 97, 202, - 203, 160, 176, 159, 240, -251, 182, 183, 184, 194, - 240, 175, 98, 196, 197, 204, 10, 235, 251, 260, - 176, 243, 264, 224, 226, 99, 252, 361, 254, 175, - 269, 280, 272, 273, 205, 282, 284, 365, 286, 201, - 206, 10, 169, 170, 289, 115, 306, 300, 310, 207, - 318, 321, 322, 326, 327, 85, 325, 86, 209, 87, - 210, 338, 339, 341, 347, 365, 352, 335, 351, 88, - 362, 357, 368, 89, 370, 395, 361, 90, 202, 387, - 91, 371, 377, 372, 396, 6, 18, 35, 177, 111, - 134, 92, 81, 105, 132, 328, 93, 356, 94, 346, - 95, 253, 10, 198, 349, 138, 139, 292, 343, 96, - 97, 393, 140, 285, 369, 283, 85, 38, 86, 206, - 87, 141, 381, 378, 98, 376, 0, 303, 353, 0, - 88, 0, 0, 0, 89, 0, 0, 293, 90, 0, - 0, 91, 41, 42, 43, 0, 0, 0, 0, 0, - 142, 0, 92, 45, 0, 0, 0, 93, 46, 94, - 47, 95, 0, 10, 0, 0, 1, 2, 48, 0, - 96, 97, 143, 144, 0, 0, 0, 49, 38, 50, - 0, 0, 0, 0, 51, 98, 52, 53, 54, 0, - 0, 0, 0, 39, 0, 0, 0, 40, 0, 0, - 0, 0, 0, 41, 42, 43, 0, 0, 0, 44, - 0, 0, 0, 0, 45, 0, 0, 0, 0, 46, - 0, 47, 0, 0, 0, 0, 0, 0, 0, 48, - 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, - 50, 0, 0, 0, 0, 51, 0, 52, 53, 54, - 138, 139, 161, 162, 0, 0, 0, 140, 0, 0, - 0, 85, 38, 86, 0, 87, 141, 0, 0, 0, - 0, 0, 229, 0, 0, 88, 0, 0, 0, 89, - 0, 0, 0, 90, 0, 0, 91, 41, 42, 43, - 0, 0, 0, 0, 0, 142, 0, 92, 45, 0, - 0, 0, 93, 46, 94, 47, 95, 0, 230, 0, - 0, 0, 0, 48, 0, 96, 97, 143, 144, 0, - 0, 0, 49, 0, 50, 0, 0, 138, 139, 51, - 98, 52, 53, 54, 140, 0, 0, 0, 85, 38, - 86, 0, 87, 141, 0, 0, 0, 0, 0, 0, - 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, - 90, 0, 0, 91, 41, 42, 43, 0, 0, 0, - 0, 0, 142, 0, 92, 45, 0, 0, 0, 93, - 46, 94, 47, 95, 0, 0, 0, 0, 0, 0, - 48, 0, 96, 97, 143, 144, 0, 0, 0, 49, - 0, 50, 0, 145, 138, 139, 51, 98, 52, 53, - 54, 140, 0, 0, 0, 85, 38, 86, 0, 87, - 141, 0, 0, 0, 0, 0, 0, 0, 0, 88, - 0, 0, 0, 89, 0, 0, 0, 90, 0, 0, - 91, 41, 42, 43, 0, 0, 0, 0, 0, 142, - 0, 92, 45, 0, 0, 0, 93, 46, 94, 47, - 95, 0, 0, 0, 83, 84, 0, 48, 0, 96, - 97, 143, 144, 0, 0, 85, 49, 86, 50, 87, - 0, 1, 2, 51, 98, 52, 53, 54, 0, 88, - 0, 0, 85, 89, 86, 0, 87, 90, 0, 0, - 91, 0, 0, 0, 0, 0, 88, 0, 0, 0, - 89, 92, 0, 0, 90, 0, 93, 91, 94, 0, - 95, 0, 0, 0, 0, 0, 0, 0, 92, 96, - 97, 0, 0, 93, 0, 94, 0, 95, 0, 0, - 0, 0, 0, 0, 98, 0, 96, 97, 0, 0, + 117, 5, 150, 214, 5, 15, 192, 232, 193, 174, + 387, 102, 102, 240, 101, 101, 10, 114, 10, 161, + 162, 1, 2, 10, 7, 10, 11, 67, 112, 65, + 10, 10, 72, 1, 2, 82, 79, 10, 64, 1, + 2, 71, 295, 83, 84, 78, 128, 10, 65, 10, + 11, 297, 298, 343, 85, 16, 86, 64, 87, 10, + 169, 170, 165, 10, 169, 170, 79, 229, 88, 244, + 353, 259, 89, 161, 162, 78, 90, 328, 329, 91, + 330, 323, 166, 167, 168, 10, 169, 170, 1, 2, + 92, 113, 115, 229, -250, 93, 333, 94, 231, 95, + 129, 72, 120, 230, 128, 79, 381, 28, 96, 97, + 71, 391, 155, 134, 78, 265, 214, 237, 68, 150, + 362, 154, 12, 98, 176, 266, 115, 29, 349, 230, + 110, 357, 240, 175, 242, 150, 99, 267, 150, 19, + 201, 237, 10, 169, 170, 201, 17, 10, 169, 170, + 199, 200, 63, 255, 32, 165, 256, 255, 129, 303, + 382, 108, 109, 115, 383, -226, 308, 161, 162, -226, + 201, 63, 10, 169, 170, 241, 294, 344, 248, 202, + 203, 171, 185, 248, 202, 203, 260, 201, 264, 10, + 169, 170, 34, 259, 354, 204, 185, 271, 30, 10, + 204, 31, 1, 2, 33, 390, 186, 185, 187, 202, + 270, 36, 379, 156, 205, 390, 137, 157, 288, 205, + 206, 374, 187, 347, 322, 206, 202, 138, 299, 207, + 304, 191, 311, 187, 207, 314, 208, 73, 209, 312, + 210, 332, 387, 209, 37, 210, 66, 20, 83, 84, + 206, 161, 162, 10, 227, 21, 1, 2, 228, 85, + 301, 86, 306, 87, 302, 80, 307, 206, 313, 331, + 315, 318, 307, 88, 316, 319, 22, 89, 23, 365, + 107, 90, 372, 366, 91, 120, 373, 24, 83, 84, + 121, 122, 176, 123, 241, 92, 125, 124, 130, 248, + 93, 175, 94, 201, 95, 10, 169, 170, 260, 176, + 131, 264, 132, 96, 97, 136, 360, 158, 175, 85, + 160, 86, 159, 87, -251, 182, 364, 184, 98, 274, + 275, 276, 277, 88, 183, 194, 10, 89, 197, 1, + 2, 90, 202, 196, 91, 274, 275, 276, 277, 10, + 236, 38, 224, 226, 364, 92, 243, 310, 252, 251, + 93, 254, 94, 115, 95, 360, 39, 269, 386, 272, + 40, 273, 280, 96, 97, 282, 41, 42, 43, 284, + 286, 289, 44, 206, 300, 305, 309, 45, 98, 317, + 321, 320, 46, 325, 47, 10, 169, 170, 1, 2, + 324, 293, 48, 337, 338, 326, 334, 340, 346, 350, + 351, 49, 356, 50, 367, 361, 139, 140, 51, 370, + 52, 53, 54, 141, 369, 371, 376, 85, 38, 86, + 394, 87, 142, 395, 6, 18, 177, 35, 81, 111, + 135, 88, 133, 105, 327, 89, 253, 355, 348, 90, + 345, 198, 91, 41, 42, 43, 342, 292, 368, 392, + 285, 143, 380, 92, 45, 377, 283, 375, 93, 46, + 94, 47, 95, 118, 0, 352, 0, 0, 0, 48, + 0, 96, 97, 144, 145, 0, 0, 0, 49, 0, + 50, 0, 146, 139, 140, 51, 98, 52, 53, 54, + 141, 0, 0, 0, 85, 38, 86, 0, 87, 142, + 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, + 0, 0, 89, 0, 0, 0, 90, 0, 0, 91, + 41, 42, 43, 0, 0, 0, 0, 0, 143, 0, + 92, 45, 0, 0, 0, 93, 46, 94, 47, 95, + 0, 0, 0, 1, 2, 0, 48, 0, 96, 97, + 144, 145, 0, 0, 85, 49, 86, 50, 87, 0, + 0, 0, 51, 98, 52, 53, 54, 0, 88, 0, + 0, 0, 89, 0, 0, 0, 90, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 98 + 92, 0, 0, 0, 0, 93, 0, 94, 0, 95, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 97, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 98 }; static const short yycheck[] = { 7, - 144, 0, 160, 147, 3, 13, 180, 117, 131, 64, - 65, 64, 65, 64, 65, 183, 183, 8, 4, 8, - 9, 8, 9, 8, 9, 10, 46, 13, 14, 37, - 8, 8, 40, 11, 12, 8, 44, 104, 37, 17, - 210, 40, 8, 130, 99, 44, 99, 28, 56, 8, - 9, 10, 8, 30, 229, 11, 12, 56, 5, 6, - 7, 8, 9, 10, 11, 12, 74, 300, 80, 101, - 180, 194, 41, 243, 105, 74, 231, 232, 109, 37, - 105, 113, 252, 52, 109, 318, 15, 197, 6, 109, - 8, 9, 10, 268, 106, 105, 11, 12, 56, 109, - 99, 109, 157, 8, 157, 113, 11, 12, 283, 106, - 109, 119, 282, 112, 113, 273, 105, 102, 105, 105, - 119, 112, 103, 131, 33, 102, 9, 45, 34, 102, - 108, 241, 131, 184, 302, 302, 102, 224, 248, 84, - 69, 46, 60, 102, 73, 6, 105, 8, 9, 10, - 158, 159, 108, 57, 309, 80, 80, 104, 157, 6, - 69, 8, 9, 10, 104, 84, 8, 105, 86, 11, - 12, 109, 112, 53, 229, 183, 229, 300, 186, 104, - 104, 106, 106, 191, 45, 46, 194, 84, 196, 97, - 98, 99, 100, 4, 317, 318, 306, 3, 45, 21, - 61, 109, 13, 14, 105, 379, 251, 105, 109, 254, - 209, 109, 370, 60, 3, 389, 105, 361, 226, 80, - 109, 107, 11, 12, 12, 86, 105, 235, 12, 39, - 109, 108, 109, 22, 95, 24, 20, 26, 105, 86, - 108, 102, 109, 104, 81, 106, 112, 36, 13, 14, - 6, 40, 8, 9, 10, 44, 81, 41, 47, 43, - 8, 9, 10, 11, 12, 11, 12, 71, 52, 58, - 97, 98, 99, 100, 63, 51, 65, 3, 67, 81, - 278, 279, 112, 281, 3, 104, 110, 76, 77, 45, - 46, 104, 300, 110, 302, 104, 35, 104, 68, 104, - 308, 300, 91, 104, 3, 61, 8, 25, 68, 317, - 318, 106, 320, 112, 112, 104, 106, 325, 68, 318, - 30, 96, 105, 109, 80, 106, 104, 335, 4, 6, - 86, 8, 9, 10, 95, 103, 68, 111, 107, 95, - 106, 113, 101, 105, 107, 22, 104, 24, 104, 26, - 106, 4, 82, 88, 107, 363, 107, 114, 102, 36, - 107, 113, 104, 40, 109, 0, 374, 44, 45, 377, - 47, 107, 112, 107, 0, 3, 13, 26, 133, 74, - 113, 58, 56, 65, 109, 273, 63, 320, 65, 302, - 67, 191, 8, 157, 308, 11, 12, 228, 298, 76, - 77, 389, 18, 224, 340, 217, 22, 23, 24, 86, - 26, 27, 374, 367, 91, 363, -1, 240, 317, -1, - 36, -1, -1, -1, 40, -1, -1, 104, 44, -1, - -1, 47, 48, 49, 50, -1, -1, -1, -1, -1, - 56, -1, 58, 59, -1, -1, -1, 63, 64, 65, - 66, 67, -1, 8, -1, -1, 11, 12, 74, -1, - 76, 77, 78, 79, -1, -1, -1, 83, 23, 85, - -1, -1, -1, -1, 90, 91, 92, 93, 94, -1, - -1, -1, -1, 38, -1, -1, -1, 42, -1, -1, - -1, -1, -1, 48, 49, 50, -1, -1, -1, 54, - -1, -1, -1, -1, 59, -1, -1, -1, -1, 64, - -1, 66, -1, -1, -1, -1, -1, -1, -1, 74, - -1, -1, -1, -1, -1, -1, -1, -1, 83, -1, - 85, -1, -1, -1, -1, 90, -1, 92, 93, 94, - 11, 12, 13, 14, -1, -1, -1, 18, -1, -1, - -1, 22, 23, 24, -1, 26, 27, -1, -1, -1, - -1, -1, 33, -1, -1, 36, -1, -1, -1, 40, - -1, -1, -1, 44, -1, -1, 47, 48, 49, 50, - -1, -1, -1, -1, -1, 56, -1, 58, 59, -1, - -1, -1, 63, 64, 65, 66, 67, -1, 69, -1, - -1, -1, -1, 74, -1, 76, 77, 78, 79, -1, - -1, -1, 83, -1, 85, -1, -1, 11, 12, 90, - 91, 92, 93, 94, 18, -1, -1, -1, 22, 23, - 24, -1, 26, 27, -1, -1, -1, -1, -1, -1, - -1, -1, 36, -1, -1, -1, 40, -1, -1, -1, - 44, -1, -1, 47, 48, 49, 50, -1, -1, -1, - -1, -1, 56, -1, 58, 59, -1, -1, -1, 63, - 64, 65, 66, 67, -1, -1, -1, -1, -1, -1, - 74, -1, 76, 77, 78, 79, -1, -1, -1, 83, - -1, 85, -1, 87, 11, 12, 90, 91, 92, 93, - 94, 18, -1, -1, -1, 22, 23, 24, -1, 26, - 27, -1, -1, -1, -1, -1, -1, -1, -1, 36, - -1, -1, -1, 40, -1, -1, -1, 44, -1, -1, - 47, 48, 49, 50, -1, -1, -1, -1, -1, 56, - -1, 58, 59, -1, -1, -1, 63, 64, 65, 66, - 67, -1, -1, -1, 11, 12, -1, 74, -1, 76, - 77, 78, 79, -1, -1, 22, 83, 24, 85, 26, - -1, 11, 12, 90, 91, 92, 93, 94, -1, 36, - -1, -1, 22, 40, 24, -1, 26, 44, -1, -1, - 47, -1, -1, -1, -1, -1, 36, -1, -1, -1, - 40, 58, -1, -1, 44, -1, 63, 47, 65, -1, - 67, -1, -1, -1, -1, -1, -1, -1, 58, 76, - 77, -1, -1, 63, -1, 65, -1, 67, -1, -1, - -1, -1, -1, -1, 91, -1, 76, 77, -1, -1, + 82, 0, 118, 160, 3, 13, 145, 180, 147, 132, + 4, 64, 65, 183, 64, 65, 8, 28, 8, 13, + 14, 11, 12, 8, 104, 8, 9, 17, 46, 37, + 8, 8, 40, 11, 12, 3, 44, 8, 37, 11, + 12, 40, 229, 11, 12, 44, 99, 8, 56, 8, + 9, 231, 232, 300, 22, 34, 24, 56, 26, 8, + 9, 10, 131, 8, 9, 10, 74, 33, 36, 30, + 317, 194, 40, 13, 14, 74, 44, 278, 279, 47, + 281, 268, 5, 6, 7, 8, 9, 10, 11, 12, + 58, 109, 103, 33, 104, 63, 283, 65, 180, 67, + 99, 109, 112, 69, 157, 113, 15, 9, 76, 77, + 109, 105, 120, 112, 113, 197, 273, 102, 108, 235, + 112, 120, 105, 91, 132, 101, 103, 57, 308, 69, + 108, 102, 302, 132, 184, 251, 104, 113, 254, 106, + 6, 102, 8, 9, 10, 6, 105, 8, 9, 10, + 158, 159, 37, 102, 53, 224, 105, 102, 157, 241, + 69, 108, 109, 103, 73, 105, 248, 13, 14, 109, + 6, 56, 8, 9, 10, 183, 229, 300, 186, 45, + 46, 104, 80, 191, 45, 46, 194, 6, 196, 8, + 9, 10, 3, 316, 317, 61, 80, 210, 84, 8, + 61, 84, 11, 12, 84, 378, 104, 80, 106, 45, + 209, 107, 369, 105, 80, 388, 41, 109, 226, 80, + 86, 360, 106, 305, 60, 86, 45, 52, 236, 95, + 243, 104, 251, 106, 95, 254, 102, 46, 104, 252, + 106, 60, 4, 104, 21, 106, 12, 12, 11, 12, + 86, 13, 14, 8, 105, 20, 11, 12, 109, 22, + 105, 24, 105, 26, 109, 39, 109, 86, 105, 282, + 105, 105, 109, 36, 109, 109, 41, 40, 43, 105, + 108, 44, 105, 109, 47, 112, 109, 52, 11, 12, + 81, 81, 300, 71, 302, 58, 81, 51, 3, 307, + 63, 300, 65, 6, 67, 8, 9, 10, 316, 317, + 112, 319, 3, 76, 77, 104, 324, 110, 317, 22, + 104, 24, 110, 26, 104, 35, 334, 68, 91, 97, + 98, 99, 100, 36, 104, 104, 8, 40, 3, 11, + 12, 44, 45, 104, 47, 97, 98, 99, 100, 8, + 25, 23, 112, 112, 362, 58, 106, 109, 106, 68, + 63, 68, 65, 103, 67, 373, 38, 30, 376, 105, + 42, 109, 96, 76, 77, 106, 48, 49, 50, 104, + 4, 95, 54, 86, 111, 68, 107, 59, 91, 106, + 101, 113, 64, 105, 66, 8, 9, 10, 11, 12, + 104, 104, 74, 4, 82, 107, 114, 88, 107, 102, + 107, 83, 113, 85, 104, 107, 11, 12, 90, 107, + 92, 93, 94, 18, 109, 107, 112, 22, 23, 24, + 0, 26, 27, 0, 3, 13, 134, 26, 56, 74, + 113, 36, 109, 65, 273, 40, 191, 319, 307, 44, + 302, 157, 47, 48, 49, 50, 298, 228, 339, 388, + 224, 56, 373, 58, 59, 366, 217, 362, 63, 64, + 65, 66, 67, 82, -1, 316, -1, -1, -1, 74, + -1, 76, 77, 78, 79, -1, -1, -1, 83, -1, + 85, -1, 87, 11, 12, 90, 91, 92, 93, 94, + 18, -1, -1, -1, 22, 23, 24, -1, 26, 27, + -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, + -1, -1, 40, -1, -1, -1, 44, -1, -1, 47, + 48, 49, 50, -1, -1, -1, -1, -1, 56, -1, + 58, 59, -1, -1, -1, 63, 64, 65, 66, 67, + -1, -1, -1, 11, 12, -1, 74, -1, 76, 77, + 78, 79, -1, -1, 22, 83, 24, 85, 26, -1, + -1, -1, 90, 91, 92, 93, 94, -1, 36, -1, + -1, -1, 40, -1, -1, -1, 44, -1, -1, 47, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 58, -1, -1, -1, -1, 63, -1, 65, -1, 67, + -1, -1, -1, -1, -1, -1, -1, -1, 76, 77, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 91 + -1, -1, -1, 91 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/share/bison.simple" @@ -1331,13 +1286,13 @@ yyparse(YYPARSE_PARAM_ARG) switch (yyn) { case 1: -#line 301 "asn1p_y.y" +#line 300 "asn1p_y.y" { *(void **)param = yyvsp[0].a_grammar; ; break;} case 2: -#line 307 "asn1p_y.y" +#line 306 "asn1p_y.y" { yyval.a_grammar = asn1p_new(); checkmem(yyval.a_grammar); @@ -1345,14 +1300,14 @@ case 2: ; break;} case 3: -#line 312 "asn1p_y.y" +#line 311 "asn1p_y.y" { yyval.a_grammar = yyvsp[-1].a_grammar; TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); ; break;} case 4: -#line 333 "asn1p_y.y" +#line 332 "asn1p_y.y" { if(yyvsp[-1].a_module) { @@ -1369,27 +1324,27 @@ case 4: ; break;} case 5: -#line 354 "asn1p_y.y" +#line 353 "asn1p_y.y" { yyval.a_oid = 0; ; break;} case 6: -#line 355 "asn1p_y.y" +#line 354 "asn1p_y.y" { yyval.a_oid = yyvsp[0].a_oid; ; break;} case 7: -#line 359 "asn1p_y.y" +#line 358 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; ; break;} case 8: -#line 362 "asn1p_y.y" +#line 361 "asn1p_y.y" { yyval.a_oid = 0; ; break;} case 9: -#line 368 "asn1p_y.y" +#line 367 "asn1p_y.y" { yyval.a_oid = asn1p_oid_new(); asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1398,7 +1353,7 @@ case 9: ; break;} case 10: -#line 374 "asn1p_y.y" +#line 373 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1407,74 +1362,74 @@ case 10: ; break;} case 11: -#line 383 "asn1p_y.y" +#line 382 "asn1p_y.y" { /* iso */ yyval.a_oid_arc.name = yyvsp[0].tv_str; yyval.a_oid_arc.number = -1; ; break;} case 12: -#line 387 "asn1p_y.y" +#line 386 "asn1p_y.y" { /* iso(1) */ yyval.a_oid_arc.name = yyvsp[-3].tv_str; yyval.a_oid_arc.number = yyvsp[-1].a_int; ; break;} case 13: -#line 391 "asn1p_y.y" +#line 390 "asn1p_y.y" { /* 1 */ yyval.a_oid_arc.name = 0; yyval.a_oid_arc.number = yyvsp[0].a_int; ; break;} case 14: -#line 401 "asn1p_y.y" +#line 400 "asn1p_y.y" { yyval.a_module_flags = MSF_NOFLAGS; ; break;} case 15: -#line 402 "asn1p_y.y" +#line 401 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; ; break;} case 16: -#line 411 "asn1p_y.y" +#line 410 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; ; break;} case 17: -#line 414 "asn1p_y.y" +#line 413 "asn1p_y.y" { yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags; ; break;} case 18: -#line 423 "asn1p_y.y" +#line 422 "asn1p_y.y" { yyval.a_module_flags = MSF_EXPLICIT_TAGS; ; break;} case 19: -#line 426 "asn1p_y.y" +#line 425 "asn1p_y.y" { yyval.a_module_flags = MSF_IMPLICIT_TAGS; ; break;} case 20: -#line 429 "asn1p_y.y" +#line 428 "asn1p_y.y" { yyval.a_module_flags = MSF_AUTOMATIC_TAGS; ; break;} case 21: -#line 432 "asn1p_y.y" +#line 431 "asn1p_y.y" { yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED; ; break;} case 22: -#line 436 "asn1p_y.y" +#line 435 "asn1p_y.y" { /* X.680Amd1 specifies TAG and XER */ if(strcmp(yyvsp[-1].tv_str, "TAG") == 0) { @@ -1492,23 +1447,23 @@ case 22: ; break;} case 23: -#line 457 "asn1p_y.y" +#line 456 "asn1p_y.y" { yyval.a_module = 0; ; break;} case 24: -#line 458 "asn1p_y.y" +#line 457 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 25: -#line 467 "asn1p_y.y" +#line 466 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 26: -#line 470 "asn1p_y.y" +#line 469 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; @@ -1538,13 +1493,13 @@ case 26: ; break;} case 27: -#line 503 "asn1p_y.y" +#line 502 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 28: -#line 506 "asn1p_y.y" +#line 505 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1556,7 +1511,7 @@ case 28: ; break;} case 29: -#line 515 "asn1p_y.y" +#line 514 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1566,7 +1521,7 @@ case 29: ; break;} case 30: -#line 522 "asn1p_y.y" +#line 521 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1576,7 +1531,7 @@ case 30: ; break;} case 31: -#line 535 "asn1p_y.y" +#line 534 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1586,11 +1541,11 @@ case 31: ; break;} case 32: -#line 543 "asn1p_y.y" +#line 542 "asn1p_y.y" { asn1p_lexer_hack_push_encoding_control(); ; break;} case 33: -#line 544 "asn1p_y.y" +#line 543 "asn1p_y.y" { fprintf(stderr, "WARNING: ENCODING-CONTROL %s " @@ -1601,7 +1556,7 @@ case 33: ; break;} case 34: -#line 556 "asn1p_y.y" +#line 555 "asn1p_y.y" { return yyerror( "Attempt to redefine a standard basic type, " @@ -1610,19 +1565,19 @@ case 34: ; break;} case 35: -#line 570 "asn1p_y.y" +#line 569 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; ; break;} case 36: -#line 576 "asn1p_y.y" +#line 575 "asn1p_y.y" { return yyerror("Empty IMPORTS list"); ; break;} case 37: -#line 582 "asn1p_y.y" +#line 581 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1630,14 +1585,14 @@ case 37: ; break;} case 38: -#line 587 "asn1p_y.y" +#line 586 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); ; break;} case 39: -#line 594 "asn1p_y.y" +#line 593 "asn1p_y.y" { yyval.a_xports = yyvsp[-3].a_xports; yyval.a_xports->from = yyvsp[-1].tv_str; @@ -1646,7 +1601,7 @@ case 39: ; break;} case 40: -#line 603 "asn1p_y.y" +#line 602 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); @@ -1654,14 +1609,14 @@ case 40: ; break;} case 41: -#line 608 "asn1p_y.y" +#line 607 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} case 42: -#line 615 "asn1p_y.y" +#line 614 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1670,7 +1625,7 @@ case 42: ; break;} case 43: -#line 621 "asn1p_y.y" +#line 620 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1679,19 +1634,19 @@ case 43: ; break;} case 44: -#line 630 "asn1p_y.y" +#line 629 "asn1p_y.y" { yyval.a_xports = yyvsp[-1].a_xports; ; break;} case 45: -#line 633 "asn1p_y.y" +#line 632 "asn1p_y.y" { yyval.a_xports = 0; ; break;} case 46: -#line 636 "asn1p_y.y" +#line 635 "asn1p_y.y" { /* Empty EXPORTS clause effectively prohibits export. */ yyval.a_xports = asn1p_xports_new(); @@ -1699,7 +1654,7 @@ case 46: ; break;} case 47: -#line 644 "asn1p_y.y" +#line 643 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); assert(yyval.a_xports); @@ -1707,14 +1662,14 @@ case 47: ; break;} case 48: -#line 649 "asn1p_y.y" +#line 648 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} case 49: -#line 656 "asn1p_y.y" +#line 655 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1723,7 +1678,7 @@ case 49: ; break;} case 50: -#line 662 "asn1p_y.y" +#line 661 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1732,7 +1687,7 @@ case 50: ; break;} case 51: -#line 672 "asn1p_y.y" +#line 671 "asn1p_y.y" { yyval.a_expr = yyvsp[-4].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1742,7 +1697,7 @@ case 51: ; break;} case 52: -#line 682 "asn1p_y.y" +#line 681 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1752,7 +1707,7 @@ case 52: ; break;} case 53: -#line 689 "asn1p_y.y" +#line 688 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1761,36 +1716,36 @@ case 53: ; break;} case 54: -#line 698 "asn1p_y.y" +#line 697 "asn1p_y.y" { ; break;} case 55: -#line 699 "asn1p_y.y" +#line 698 "asn1p_y.y" { ; break;} case 56: -#line 710 "asn1p_y.y" +#line 709 "asn1p_y.y" { ; break;} case 57: -#line 712 "asn1p_y.y" +#line 711 "asn1p_y.y" { ; break;} case 58: -#line 717 "asn1p_y.y" +#line 716 "asn1p_y.y" { ; break;} case 59: -#line 719 "asn1p_y.y" +#line 718 "asn1p_y.y" { ; break;} case 60: -#line 735 "asn1p_y.y" +#line 734 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1801,17 +1756,16 @@ case 60: ; break;} case 61: -#line 743 "asn1p_y.y" +#line 742 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; - yyval.a_expr->Identifier = yyvsp[-3].tv_str; - yyval.a_expr->tag = yyvsp[-1].a_tag; + yyval.a_expr->Identifier = yyvsp[-2].tv_str; assert(yyval.a_expr->expr_type); assert(yyval.a_expr->meta_type); ; break;} case 62: -#line 750 "asn1p_y.y" +#line 748 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -1820,7 +1774,7 @@ case 62: ; break;} case 63: -#line 766 "asn1p_y.y" +#line 764 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1830,7 +1784,7 @@ case 63: ; break;} case 64: -#line 776 "asn1p_y.y" +#line 774 "asn1p_y.y" { int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); @@ -1842,7 +1796,7 @@ case 64: ; break;} case 65: -#line 785 "asn1p_y.y" +#line 783 "asn1p_y.y" { int ret; yyval.a_plist = yyvsp[-2].a_plist; @@ -1853,14 +1807,14 @@ case 65: ; break;} case 66: -#line 796 "asn1p_y.y" +#line 794 "asn1p_y.y" { yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} case 67: -#line 800 "asn1p_y.y" +#line 798 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1870,7 +1824,7 @@ case 67: ; break;} case 68: -#line 807 "asn1p_y.y" +#line 805 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1881,7 +1835,7 @@ case 68: ; break;} case 69: -#line 818 "asn1p_y.y" +#line 816 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1889,20 +1843,20 @@ case 69: ; break;} case 70: -#line 823 "asn1p_y.y" +#line 821 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 71: -#line 830 "asn1p_y.y" +#line 828 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 72: -#line 833 "asn1p_y.y" +#line 831 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1912,7 +1866,7 @@ case 72: ; break;} case 73: -#line 846 "asn1p_y.y" +#line 844 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1920,24 +1874,23 @@ case 73: ; break;} case 74: -#line 851 "asn1p_y.y" +#line 849 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 75: -#line 858 "asn1p_y.y" +#line 856 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->Identifier == 0); - yyval.a_expr->Identifier = yyvsp[-2].tv_nametag.name; - yyval.a_expr->tag = yyvsp[-2].tv_nametag.tag; + yyval.a_expr->Identifier = yyvsp[-2].tv_str; yyval.a_expr->marker = yyvsp[0].a_marker; ; break;} case 76: -#line 865 "asn1p_y.y" +#line 862 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1947,13 +1900,13 @@ case 76: ; break;} case 77: -#line 872 "asn1p_y.y" +#line 869 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 78: -#line 878 "asn1p_y.y" +#line 875 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1961,29 +1914,28 @@ case 78: ; break;} case 79: -#line 883 "asn1p_y.y" +#line 880 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 80: -#line 890 "asn1p_y.y" +#line 887 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); - yyval.a_expr->Identifier = yyvsp[-1].tv_nametag.name; - yyval.a_expr->tag = yyvsp[-1].tv_nametag.tag; + yyval.a_expr->Identifier = yyvsp[-1].tv_str; ; break;} case 81: -#line 896 "asn1p_y.y" +#line 892 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 82: -#line 902 "asn1p_y.y" +#line 898 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); @@ -1993,15 +1945,15 @@ case 82: ; break;} case 83: -#line 912 "asn1p_y.y" +#line 908 "asn1p_y.y" { yyval.a_int = 0; ; break;} case 84: -#line 913 "asn1p_y.y" +#line 909 "asn1p_y.y" { yyval.a_int = 1; ; break;} case 85: -#line 917 "asn1p_y.y" +#line 913 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2011,14 +1963,14 @@ case 85: ; break;} case 86: -#line 924 "asn1p_y.y" +#line 920 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 87: -#line 931 "asn1p_y.y" +#line 927 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2029,7 +1981,7 @@ case 87: ; break;} case 88: -#line 939 "asn1p_y.y" +#line 935 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; yyval.a_expr->Identifier = yyvsp[-3].a_refcomp.name; @@ -2038,7 +1990,7 @@ case 88: ; break;} case 89: -#line 945 "asn1p_y.y" +#line 941 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2056,47 +2008,47 @@ case 89: ; break;} case 90: -#line 963 "asn1p_y.y" +#line 959 "asn1p_y.y" { yyval.a_wsynt = 0; ; break;} case 91: -#line 964 "asn1p_y.y" +#line 960 "asn1p_y.y" { yyval.a_wsynt = yyvsp[0].a_wsynt; ; break;} case 92: -#line 971 "asn1p_y.y" +#line 967 "asn1p_y.y" { asn1p_lexer_hack_enable_with_syntax(); ; break;} case 93: -#line 973 "asn1p_y.y" +#line 969 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; ; break;} case 94: -#line 979 "asn1p_y.y" +#line 975 "asn1p_y.y" { yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} case 95: -#line 983 "asn1p_y.y" +#line 979 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} case 96: -#line 990 "asn1p_y.y" +#line 986 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); ; break;} case 97: -#line 993 "asn1p_y.y" +#line 989 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2108,7 +2060,7 @@ case 97: ; break;} case 98: -#line 1005 "asn1p_y.y" +#line 1001 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2119,7 +2071,7 @@ case 98: ; break;} case 99: -#line 1013 "asn1p_y.y" +#line 1009 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2131,7 +2083,7 @@ case 99: ; break;} case 100: -#line 1022 "asn1p_y.y" +#line 1018 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2143,9 +2095,10 @@ case 100: ; break;} case 101: -#line 1034 "asn1p_y.y" +#line 1030 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; + yyval.a_expr->tag = yyvsp[-2].a_tag; /* * Outer constraint for SEQUENCE OF and SET OF applies * to the inner type. @@ -2156,7 +2109,7 @@ case 101: TQ_FIRST(&(yyval.a_expr->members))->constraints = yyvsp[0].a_constr; } else { if(yyval.a_expr->constraints) { - assert(!yyvsp[0].a_constr); + assert(!yyvsp[-1].a_expr); } else { yyval.a_expr->constraints = yyvsp[0].a_constr; } @@ -2164,13 +2117,13 @@ case 101: ; break;} case 102: -#line 1055 "asn1p_y.y" +#line 1052 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 103: -#line 1058 "asn1p_y.y" +#line 1055 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2179,7 +2132,7 @@ case 103: ; break;} case 104: -#line 1064 "asn1p_y.y" +#line 1061 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2188,7 +2141,7 @@ case 104: ; break;} case 105: -#line 1070 "asn1p_y.y" +#line 1067 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2197,7 +2150,7 @@ case 105: ; break;} case 106: -#line 1076 "asn1p_y.y" +#line 1073 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2206,7 +2159,7 @@ case 106: ; break;} case 107: -#line 1082 "asn1p_y.y" +#line 1079 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2217,7 +2170,7 @@ case 107: ; break;} case 108: -#line 1090 "asn1p_y.y" +#line 1087 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2228,7 +2181,7 @@ case 108: ; break;} case 109: -#line 1098 "asn1p_y.y" +#line 1095 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2237,7 +2190,7 @@ case 109: ; break;} case 110: -#line 1104 "asn1p_y.y" +#line 1101 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2251,7 +2204,7 @@ case 110: ; break;} case 111: -#line 1118 "asn1p_y.y" +#line 1115 "asn1p_y.y" { int ret; yyval.a_expr = yyvsp[-1].a_expr; @@ -2268,7 +2221,7 @@ case 111: ; break;} case 112: -#line 1142 "asn1p_y.y" +#line 1139 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2278,7 +2231,7 @@ case 112: ; break;} case 113: -#line 1149 "asn1p_y.y" +#line 1146 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2288,7 +2241,7 @@ case 113: ; break;} case 114: -#line 1164 "asn1p_y.y" +#line 1161 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2299,7 +2252,7 @@ case 114: ; break;} case 115: -#line 1172 "asn1p_y.y" +#line 1169 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2312,7 +2265,7 @@ case 115: ; break;} case 116: -#line 1182 "asn1p_y.y" +#line 1179 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2325,7 +2278,7 @@ case 116: ; break;} case 117: -#line 1192 "asn1p_y.y" +#line 1189 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2336,7 +2289,7 @@ case 117: ; break;} case 118: -#line 1200 "asn1p_y.y" +#line 1197 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[0].a_ref; @@ -2358,7 +2311,7 @@ case 118: ; break;} case 119: -#line 1222 "asn1p_y.y" +#line 1219 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2369,7 +2322,7 @@ case 119: ; break;} case 120: -#line 1230 "asn1p_y.y" +#line 1227 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[-2].a_ref; @@ -2379,21 +2332,21 @@ case 120: ; break;} case 123: -#line 1244 "asn1p_y.y" +#line 1241 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} case 124: -#line 1249 "asn1p_y.y" +#line 1246 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} case 125: -#line 1262 "asn1p_y.y" +#line 1259 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); @@ -2403,11 +2356,11 @@ case 125: ; break;} case 126: -#line 1272 "asn1p_y.y" +#line 1269 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} case 127: -#line 1273 "asn1p_y.y" +#line 1270 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); @@ -2415,40 +2368,40 @@ case 127: ; break;} case 128: -#line 1278 "asn1p_y.y" +#line 1275 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); ; break;} case 129: -#line 1282 "asn1p_y.y" +#line 1279 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); ; break;} case 130: -#line 1286 "asn1p_y.y" +#line 1283 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} case 131: -#line 1290 "asn1p_y.y" +#line 1287 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 132: -#line 1293 "asn1p_y.y" +#line 1290 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 133: -#line 1299 "asn1p_y.y" +#line 1296 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2462,7 +2415,7 @@ case 133: ; break;} case 134: -#line 1310 "asn1p_y.y" +#line 1307 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2479,7 +2432,7 @@ case 134: ; break;} case 135: -#line 1327 "asn1p_y.y" +#line 1324 "asn1p_y.y" { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 2; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); @@ -2492,7 +2445,7 @@ case 135: ; break;} case 136: -#line 1337 "asn1p_y.y" +#line 1334 "asn1p_y.y" { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); @@ -2507,67 +2460,67 @@ case 136: ; break;} case 137: -#line 1352 "asn1p_y.y" +#line 1349 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BOOLEAN; ; break;} case 138: -#line 1353 "asn1p_y.y" +#line 1350 "asn1p_y.y" { yyval.a_type = ASN_BASIC_NULL; ; break;} case 139: -#line 1354 "asn1p_y.y" +#line 1351 "asn1p_y.y" { yyval.a_type = ASN_BASIC_REAL; ; break;} case 140: -#line 1355 "asn1p_y.y" +#line 1352 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} case 141: -#line 1356 "asn1p_y.y" +#line 1353 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OCTET_STRING; ; break;} case 142: -#line 1357 "asn1p_y.y" +#line 1354 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; break;} case 143: -#line 1358 "asn1p_y.y" +#line 1355 "asn1p_y.y" { yyval.a_type = ASN_BASIC_RELATIVE_OID; ; break;} case 144: -#line 1359 "asn1p_y.y" +#line 1356 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EXTERNAL; ; break;} case 145: -#line 1360 "asn1p_y.y" +#line 1357 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; break;} case 146: -#line 1361 "asn1p_y.y" +#line 1358 "asn1p_y.y" { yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; break;} case 147: -#line 1362 "asn1p_y.y" +#line 1359 "asn1p_y.y" { yyval.a_type = ASN_BASIC_UTCTime; ; break;} case 148: -#line 1363 "asn1p_y.y" +#line 1360 "asn1p_y.y" { yyval.a_type = ASN_BASIC_GeneralizedTime; ; break;} case 149: -#line 1370 "asn1p_y.y" +#line 1367 "asn1p_y.y" { yyval.a_type = ASN_BASIC_INTEGER; ; break;} case 150: -#line 1371 "asn1p_y.y" +#line 1368 "asn1p_y.y" { yyval.a_type = ASN_BASIC_ENUMERATED; ; break;} case 151: -#line 1372 "asn1p_y.y" +#line 1369 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BIT_STRING; ; break;} case 152: -#line 1376 "asn1p_y.y" +#line 1373 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2576,7 +2529,7 @@ case 152: ; break;} case 153: -#line 1382 "asn1p_y.y" +#line 1379 "asn1p_y.y" { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; @@ -2589,91 +2542,91 @@ case 153: ; break;} case 154: -#line 1395 "asn1p_y.y" +#line 1392 "asn1p_y.y" { yyval.a_type = ASN_STRING_BMPString; ; break;} case 155: -#line 1396 "asn1p_y.y" +#line 1393 "asn1p_y.y" { yyval.a_type = ASN_STRING_GeneralString; fprintf(stderr, "WARNING: GeneralString is not fully supported"); ; break;} case 156: -#line 1400 "asn1p_y.y" +#line 1397 "asn1p_y.y" { yyval.a_type = ASN_STRING_GraphicString; fprintf(stderr, "WARNING: GraphicString is not fully supported"); ; break;} case 157: -#line 1404 "asn1p_y.y" +#line 1401 "asn1p_y.y" { yyval.a_type = ASN_STRING_IA5String; ; break;} case 158: -#line 1405 "asn1p_y.y" +#line 1402 "asn1p_y.y" { yyval.a_type = ASN_STRING_ISO646String; ; break;} case 159: -#line 1406 "asn1p_y.y" +#line 1403 "asn1p_y.y" { yyval.a_type = ASN_STRING_NumericString; ; break;} case 160: -#line 1407 "asn1p_y.y" +#line 1404 "asn1p_y.y" { yyval.a_type = ASN_STRING_PrintableString; ; break;} case 161: -#line 1408 "asn1p_y.y" +#line 1405 "asn1p_y.y" { yyval.a_type = ASN_STRING_T61String; fprintf(stderr, "WARNING: T61String is not fully supported"); ; break;} case 162: -#line 1412 "asn1p_y.y" +#line 1409 "asn1p_y.y" { yyval.a_type = ASN_STRING_TeletexString; ; break;} case 163: -#line 1413 "asn1p_y.y" +#line 1410 "asn1p_y.y" { yyval.a_type = ASN_STRING_UniversalString; ; break;} case 164: -#line 1414 "asn1p_y.y" +#line 1411 "asn1p_y.y" { yyval.a_type = ASN_STRING_UTF8String; ; break;} case 165: -#line 1415 "asn1p_y.y" +#line 1412 "asn1p_y.y" { yyval.a_type = ASN_STRING_VideotexString; fprintf(stderr, "WARNING: VideotexString is not fully supported"); ; break;} case 166: -#line 1419 "asn1p_y.y" +#line 1416 "asn1p_y.y" { yyval.a_type = ASN_STRING_VisibleString; ; break;} case 167: -#line 1420 "asn1p_y.y" +#line 1417 "asn1p_y.y" { yyval.a_type = ASN_STRING_ObjectDescriptor; ; break;} case 173: -#line 1432 "asn1p_y.y" +#line 1429 "asn1p_y.y" { yyval.a_constr = 0; ; break;} case 174: -#line 1433 "asn1p_y.y" +#line 1430 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 175: -#line 1439 "asn1p_y.y" +#line 1436 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); ; break;} case 176: -#line 1442 "asn1p_y.y" +#line 1439 "asn1p_y.y" { /* * This is a special case, for compatibility purposes. @@ -2683,25 +2636,25 @@ case 176: ; break;} case 177: -#line 1452 "asn1p_y.y" +#line 1449 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; ; break;} case 178: -#line 1455 "asn1p_y.y" +#line 1452 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} case 179: -#line 1461 "asn1p_y.y" +#line 1458 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 180: -#line 1464 "asn1p_y.y" +#line 1461 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2710,7 +2663,7 @@ case 180: ; break;} case 181: -#line 1470 "asn1p_y.y" +#line 1467 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2721,31 +2674,31 @@ case 181: ; break;} case 182: -#line 1481 "asn1p_y.y" +#line 1478 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 183: -#line 1484 "asn1p_y.y" +#line 1481 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 184: -#line 1487 "asn1p_y.y" +#line 1484 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 185: -#line 1490 "asn1p_y.y" +#line 1487 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 186: -#line 1496 "asn1p_y.y" +#line 1493 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2756,7 +2709,7 @@ case 186: ; break;} case 187: -#line 1504 "asn1p_y.y" +#line 1501 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2767,7 +2720,7 @@ case 187: ; break;} case 188: -#line 1512 "asn1p_y.y" +#line 1509 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2776,7 +2729,7 @@ case 188: ; break;} case 189: -#line 1518 "asn1p_y.y" +#line 1515 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2786,7 +2739,7 @@ case 189: ; break;} case 190: -#line 1525 "asn1p_y.y" +#line 1522 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2797,7 +2750,7 @@ case 190: ; break;} case 191: -#line 1533 "asn1p_y.y" +#line 1530 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2808,7 +2761,7 @@ case 191: ; break;} case 192: -#line 1541 "asn1p_y.y" +#line 1538 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2820,53 +2773,53 @@ case 192: ; break;} case 193: -#line 1550 "asn1p_y.y" +#line 1547 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 194: -#line 1553 "asn1p_y.y" +#line 1550 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 195: -#line 1559 "asn1p_y.y" +#line 1556 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RANGE; ; break;} case 196: -#line 1560 "asn1p_y.y" +#line 1557 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RLRANGE; ; break;} case 197: -#line 1561 "asn1p_y.y" +#line 1558 "asn1p_y.y" { yyval.a_ctype = ACT_EL_LLRANGE; ; break;} case 198: -#line 1562 "asn1p_y.y" +#line 1559 "asn1p_y.y" { yyval.a_ctype = ACT_EL_ULRANGE; ; break;} case 199: -#line 1566 "asn1p_y.y" +#line 1563 "asn1p_y.y" { yyval.a_ctype = ACT_CT_SIZE; ; break;} case 200: -#line 1569 "asn1p_y.y" +#line 1566 "asn1p_y.y" { yyval.a_ctype = ACT_CT_FROM; ; break;} case 201: -#line 1575 "asn1p_y.y" +#line 1572 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 202: -#line 1578 "asn1p_y.y" +#line 1575 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2880,14 +2833,14 @@ case 202: ; break;} case 203: -#line 1589 "asn1p_y.y" +#line 1586 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} case 204: -#line 1594 "asn1p_y.y" +#line 1591 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2895,7 +2848,7 @@ case 204: ; break;} case 205: -#line 1599 "asn1p_y.y" +#line 1596 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); @@ -2903,25 +2856,25 @@ case 205: ; break;} case 206: -#line 1607 "asn1p_y.y" +#line 1604 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); ; break;} case 207: -#line 1613 "asn1p_y.y" +#line 1610 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 208: -#line 1616 "asn1p_y.y" +#line 1613 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 209: -#line 1622 "asn1p_y.y" +#line 1619 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2929,7 +2882,7 @@ case 209: ; break;} case 210: -#line 1627 "asn1p_y.y" +#line 1624 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2939,45 +2892,45 @@ case 210: ; break;} case 211: -#line 1640 "asn1p_y.y" +#line 1637 "asn1p_y.y" { yyval.a_pres = ACPRES_DEFAULT; ; break;} case 212: -#line 1641 "asn1p_y.y" +#line 1638 "asn1p_y.y" { yyval.a_pres = yyvsp[0].a_pres; ; break;} case 213: -#line 1645 "asn1p_y.y" +#line 1642 "asn1p_y.y" { yyval.a_pres = ACPRES_PRESENT; ; break;} case 214: -#line 1648 "asn1p_y.y" +#line 1645 "asn1p_y.y" { yyval.a_pres = ACPRES_ABSENT; ; break;} case 215: -#line 1651 "asn1p_y.y" +#line 1648 "asn1p_y.y" { yyval.a_pres = ACPRES_OPTIONAL; ; break;} case 216: -#line 1657 "asn1p_y.y" +#line 1654 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 217: -#line 1660 "asn1p_y.y" +#line 1657 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 218: -#line 1669 "asn1p_y.y" +#line 1666 "asn1p_y.y" { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; @@ -2992,13 +2945,13 @@ case 218: ; break;} case 219: -#line 1684 "asn1p_y.y" +#line 1681 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} case 220: -#line 1690 "asn1p_y.y" +#line 1687 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3007,7 +2960,7 @@ case 220: ; break;} case 221: -#line 1696 "asn1p_y.y" +#line 1693 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3018,7 +2971,7 @@ case 221: ; break;} case 222: -#line 1710 "asn1p_y.y" +#line 1707 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; @@ -3032,7 +2985,7 @@ case 222: ; break;} case 223: -#line 1721 "asn1p_y.y" +#line 1718 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; @@ -3047,13 +3000,13 @@ case 223: ; break;} case 224: -#line 1737 "asn1p_y.y" +#line 1734 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} case 225: -#line 1740 "asn1p_y.y" +#line 1737 "asn1p_y.y" { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); @@ -3065,60 +3018,60 @@ case 225: ; break;} case 226: -#line 1758 "asn1p_y.y" +#line 1755 "asn1p_y.y" { yyval.a_marker = EM_NOMARK; ; break;} case 227: -#line 1759 "asn1p_y.y" +#line 1756 "asn1p_y.y" { yyval.a_marker = yyvsp[0].a_marker; ; break;} case 228: -#line 1763 "asn1p_y.y" +#line 1760 "asn1p_y.y" { yyval.a_marker = EM_OPTIONAL; ; break;} case 229: -#line 1766 "asn1p_y.y" +#line 1763 "asn1p_y.y" { yyval.a_marker = EM_DEFAULT; /* FIXME: store DefaultValue somewhere */ ; break;} case 230: -#line 1773 "asn1p_y.y" +#line 1770 "asn1p_y.y" { ; break;} case 231: -#line 1775 "asn1p_y.y" +#line 1772 "asn1p_y.y" { ; break;} case 232: -#line 1777 "asn1p_y.y" +#line 1774 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} case 233: -#line 1777 "asn1p_y.y" +#line 1774 "asn1p_y.y" { ; break;} case 234: -#line 1798 "asn1p_y.y" +#line 1795 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); ; break;} case 235: -#line 1802 "asn1p_y.y" +#line 1799 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; ; break;} case 236: -#line 1808 "asn1p_y.y" +#line 1805 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3126,14 +3079,14 @@ case 236: ; break;} case 237: -#line 1813 "asn1p_y.y" +#line 1810 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 238: -#line 1820 "asn1p_y.y" +#line 1817 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3143,7 +3096,7 @@ case 238: ; break;} case 239: -#line 1827 "asn1p_y.y" +#line 1824 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3154,7 +3107,7 @@ case 239: ; break;} case 240: -#line 1835 "asn1p_y.y" +#line 1832 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3165,7 +3118,7 @@ case 240: ; break;} case 241: -#line 1843 "asn1p_y.y" +#line 1840 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3175,7 +3128,7 @@ case 241: ; break;} case 242: -#line 1850 "asn1p_y.y" +#line 1847 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3186,90 +3139,76 @@ case 242: ; break;} case 243: -#line 1861 "asn1p_y.y" +#line 1858 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} case 244: -#line 1865 "asn1p_y.y" +#line 1862 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} case 245: -#line 1896 "asn1p_y.y" +#line 1893 "asn1p_y.y" { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; break;} case 246: -#line 1897 "asn1p_y.y" +#line 1894 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; ; break;} case 247: -#line 1901 "asn1p_y.y" +#line 1898 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; yyval.a_tag.tag_mode = TM_DEFAULT; ; break;} case 248: -#line 1905 "asn1p_y.y" +#line 1902 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_IMPLICIT; ; break;} case 249: -#line 1909 "asn1p_y.y" +#line 1906 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_EXPLICIT; ; break;} case 250: -#line 1916 "asn1p_y.y" +#line 1913 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} case 251: -#line 1920 "asn1p_y.y" +#line 1917 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} case 252: -#line 1928 "asn1p_y.y" +#line 1925 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} case 253: -#line 1935 "asn1p_y.y" +#line 1932 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 254: -#line 1942 "asn1p_y.y" -{ - memset(&yyval.tv_nametag, 0, sizeof(yyval.tv_nametag)); - yyval.tv_nametag.name = yyvsp[0].tv_str; - ; - break;} -case 255: -#line 1946 "asn1p_y.y" -{ - yyval.tv_nametag.name = yyvsp[-1].tv_str; - yyval.tv_nametag.tag = yyvsp[0].a_tag; - ; - break;} } /* the action file gets copied in in place of this dollarsign */ #line 543 "/usr/share/bison.simple" @@ -3492,7 +3431,7 @@ case 255: } return 1; } -#line 1953 "asn1p_y.y" +#line 1938 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index 04912fe19..a15287049 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -249,7 +249,6 @@ static asn1p_value_t * %type UniverationElement %type TypeRefName %type ObjectClassReference -%type TaggedIdentifier %type Identifier %type ParameterArgumentName %type ParameterArgumentList @@ -740,10 +739,9 @@ DataTypeReference: $$->expr_type = A1TC_TYPEID; $$->meta_type = AMT_TYPE; } - | TypeRefName TOK_PPEQ optTag Type { - $$ = $4; + | TypeRefName TOK_PPEQ Type { + $$ = $3; $$->Identifier = $1; - $$->tag = $3; assert($$->expr_type); assert($$->meta_type); } @@ -855,11 +853,10 @@ ComponentTypeLists: ; ComponentType: - TaggedIdentifier Type optMarker { + Identifier Type optMarker { $$ = $2; assert($$->Identifier == 0); - $$->Identifier = $1.name; - $$->tag = $1.tag; + $$->Identifier = $1; $$->marker = $3; } | TOK_COMPONENTS TOK_OF Type { @@ -887,11 +884,10 @@ AlternativeTypeLists: ; AlternativeType: - TaggedIdentifier Type { + Identifier Type { $$ = $2; assert($$->Identifier == 0); - $$->Identifier = $1.name; - $$->tag = $1.tag; + $$->Identifier = $1; } | ExtensionAndException { $$ = $1; @@ -1031,8 +1027,9 @@ ExtensionAndException: ; Type: - TypeDeclaration optConstraints { - $$ = $1; + optTag TypeDeclaration optConstraints { + $$ = $2; + $$->tag = $1; /* * Outer constraint for SEQUENCE OF and SET OF applies * to the inner type. @@ -1040,12 +1037,12 @@ Type: if($$->expr_type == ASN_CONSTR_SEQUENCE_OF || $$->expr_type == ASN_CONSTR_SET_OF) { assert(!TQ_FIRST(&($$->members))->constraints); - TQ_FIRST(&($$->members))->constraints = $2; + TQ_FIRST(&($$->members))->constraints = $3; } else { if($$->constraints) { assert(!$2); } else { - $$->constraints = $2; + $$->constraints = $3; } } } @@ -1938,18 +1935,6 @@ Identifier: } ; -TaggedIdentifier: - Identifier { - memset(&$$, 0, sizeof($$)); - $$.name = $1; - } - | Identifier Tag { - $$.name = $1; - $$.tag = $2; - } - ; - - %% From a2374a0eb76275ce48b7b47c525e0067979418c3 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 14 Sep 2004 02:44:07 +0000 Subject: [PATCH 0316/1469] support of tags after SET OF/SEQUENCE OF: SET OF [1] INTEGER git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@316 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_y.c | 821 ++++++++++++++++++++-------------------- libasn1parser/asn1p_y.y | 10 +- 2 files changed, 422 insertions(+), 409 deletions(-) diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index 84a8c555e..7d927e976 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -205,7 +205,7 @@ typedef union { -#define YYFINAL 395 +#define YYFINAL 397 #define YYFLAG -32768 #define YYNTBASE 115 @@ -262,22 +262,22 @@ static const short yyprhs[] = { 0, 202, 204, 206, 208, 212, 216, 220, 222, 224, 228, 231, 233, 239, 240, 242, 244, 248, 251, 256, 261, 262, 264, 265, 272, 274, 277, 279, 281, 283, 287, - 291, 295, 297, 299, 304, 309, 314, 319, 324, 326, - 331, 336, 338, 342, 344, 348, 352, 354, 358, 360, - 364, 366, 368, 370, 372, 377, 378, 382, 384, 386, - 388, 390, 392, 394, 398, 400, 403, 405, 407, 409, - 411, 414, 417, 419, 421, 424, 427, 429, 431, 433, - 435, 438, 440, 443, 445, 447, 449, 451, 453, 455, - 457, 459, 461, 463, 465, 467, 469, 471, 473, 475, - 477, 479, 481, 482, 484, 486, 491, 495, 500, 502, - 506, 512, 514, 518, 522, 526, 531, 535, 537, 541, - 545, 549, 553, 555, 557, 559, 562, 565, 569, 571, - 573, 575, 577, 579, 581, 583, 589, 591, 595, 597, - 601, 602, 604, 606, 608, 610, 612, 614, 618, 623, - 625, 629, 632, 636, 638, 642, 643, 645, 647, 650, - 652, 654, 655, 659, 662, 666, 668, 672, 674, 679, - 684, 686, 688, 690, 692, 693, 695, 697, 700, 703, - 705, 707, 709 + 291, 295, 297, 299, 304, 309, 314, 320, 326, 328, + 333, 338, 340, 344, 346, 350, 354, 356, 360, 362, + 366, 368, 370, 372, 374, 379, 380, 384, 386, 388, + 390, 392, 394, 396, 400, 402, 405, 407, 409, 411, + 413, 416, 419, 421, 423, 426, 429, 431, 433, 435, + 437, 440, 442, 445, 447, 449, 451, 453, 455, 457, + 459, 461, 463, 465, 467, 469, 471, 473, 475, 477, + 479, 481, 483, 484, 486, 488, 493, 497, 502, 504, + 508, 514, 516, 520, 524, 528, 533, 537, 539, 543, + 547, 551, 555, 557, 559, 561, 564, 567, 571, 573, + 575, 577, 579, 581, 583, 585, 591, 593, 597, 599, + 603, 604, 606, 608, 610, 612, 614, 616, 620, 625, + 627, 631, 634, 638, 640, 644, 645, 647, 649, 652, + 654, 656, 657, 661, 664, 668, 670, 674, 676, 681, + 686, 688, 690, 692, 694, 695, 697, 699, 702, 705, + 707, 709, 711 }; static const short yyrhs[] = { 116, @@ -312,46 +312,47 @@ static const short yyrhs[] = { 116, 102, 0, 102, 111, 171, 0, 102, 111, 207, 0, 208, 162, 180, 0, 175, 0, 176, 0, 27, 104, 149, 105, 0, 78, 104, 147, 105, 0, 79, 104, - 147, 105, 0, 78, 180, 68, 162, 0, 79, 180, - 68, 162, 0, 18, 0, 18, 35, 25, 212, 0, - 210, 104, 145, 105, 0, 163, 0, 56, 68, 163, - 0, 11, 0, 11, 112, 210, 0, 11, 112, 212, - 0, 211, 0, 211, 112, 164, 0, 165, 0, 164, - 112, 165, 0, 167, 0, 167, 0, 13, 0, 14, - 0, 212, 138, 3, 169, 0, 0, 104, 170, 172, - 0, 5, 0, 7, 0, 6, 0, 207, 0, 171, - 0, 212, 0, 210, 112, 212, 0, 4, 0, 172, - 4, 0, 24, 0, 63, 0, 76, 0, 174, 0, - 67, 81, 0, 65, 51, 0, 77, 0, 44, 0, - 36, 71, 0, 26, 81, 0, 91, 0, 47, 0, - 58, 0, 40, 0, 22, 81, 0, 173, 0, 174, - 204, 0, 23, 0, 48, 0, 49, 0, 50, 0, - 59, 0, 64, 0, 74, 0, 83, 0, 85, 0, - 90, 0, 92, 0, 93, 0, 94, 0, 66, 0, - 99, 0, 100, 0, 97, 0, 98, 0, 96, 0, - 0, 181, 0, 182, 0, 80, 106, 183, 107, 0, - 106, 183, 107, 0, 182, 106, 183, 107, 0, 184, - 0, 184, 109, 102, 0, 184, 109, 102, 109, 184, - 0, 185, 0, 184, 177, 185, 0, 184, 178, 185, - 0, 185, 179, 185, 0, 187, 106, 183, 107, 0, - 106, 183, 107, 0, 188, 0, 188, 186, 188, 0, - 61, 186, 188, 0, 188, 186, 60, 0, 61, 186, - 60, 0, 194, 0, 189, 0, 101, 0, 101, 113, - 0, 113, 101, 0, 113, 101, 113, 0, 80, 0, - 46, 0, 207, 0, 212, 0, 6, 0, 45, 0, - 86, 0, 95, 30, 104, 190, 105, 0, 191, 0, - 190, 109, 191, 0, 102, 0, 212, 180, 192, 0, - 0, 193, 0, 73, 0, 15, 0, 69, 0, 195, - 0, 196, 0, 104, 210, 105, 0, 195, 104, 197, - 105, 0, 198, 0, 197, 109, 198, 0, 114, 199, - 0, 114, 112, 199, 0, 212, 0, 199, 112, 212, - 0, 0, 201, 0, 69, 0, 33, 202, 0, 188, - 0, 173, 0, 0, 104, 203, 172, 0, 104, 105, - 0, 104, 205, 105, 0, 206, 0, 205, 109, 206, - 0, 212, 0, 212, 106, 207, 107, 0, 212, 106, - 171, 107, 0, 207, 0, 102, 0, 9, 0, 10, - 0, 0, 209, 0, 103, 0, 103, 52, 0, 103, - 41, 0, 11, 0, 12, 0, 12, 0, 8, 0 + 147, 105, 0, 78, 180, 68, 208, 162, 0, 79, + 180, 68, 208, 162, 0, 18, 0, 18, 35, 25, + 212, 0, 210, 104, 145, 105, 0, 163, 0, 56, + 68, 163, 0, 11, 0, 11, 112, 210, 0, 11, + 112, 212, 0, 211, 0, 211, 112, 164, 0, 165, + 0, 164, 112, 165, 0, 167, 0, 167, 0, 13, + 0, 14, 0, 212, 138, 3, 169, 0, 0, 104, + 170, 172, 0, 5, 0, 7, 0, 6, 0, 207, + 0, 171, 0, 212, 0, 210, 112, 212, 0, 4, + 0, 172, 4, 0, 24, 0, 63, 0, 76, 0, + 174, 0, 67, 81, 0, 65, 51, 0, 77, 0, + 44, 0, 36, 71, 0, 26, 81, 0, 91, 0, + 47, 0, 58, 0, 40, 0, 22, 81, 0, 173, + 0, 174, 204, 0, 23, 0, 48, 0, 49, 0, + 50, 0, 59, 0, 64, 0, 74, 0, 83, 0, + 85, 0, 90, 0, 92, 0, 93, 0, 94, 0, + 66, 0, 99, 0, 100, 0, 97, 0, 98, 0, + 96, 0, 0, 181, 0, 182, 0, 80, 106, 183, + 107, 0, 106, 183, 107, 0, 182, 106, 183, 107, + 0, 184, 0, 184, 109, 102, 0, 184, 109, 102, + 109, 184, 0, 185, 0, 184, 177, 185, 0, 184, + 178, 185, 0, 185, 179, 185, 0, 187, 106, 183, + 107, 0, 106, 183, 107, 0, 188, 0, 188, 186, + 188, 0, 61, 186, 188, 0, 188, 186, 60, 0, + 61, 186, 60, 0, 194, 0, 189, 0, 101, 0, + 101, 113, 0, 113, 101, 0, 113, 101, 113, 0, + 80, 0, 46, 0, 207, 0, 212, 0, 6, 0, + 45, 0, 86, 0, 95, 30, 104, 190, 105, 0, + 191, 0, 190, 109, 191, 0, 102, 0, 212, 180, + 192, 0, 0, 193, 0, 73, 0, 15, 0, 69, + 0, 195, 0, 196, 0, 104, 210, 105, 0, 195, + 104, 197, 105, 0, 198, 0, 197, 109, 198, 0, + 114, 199, 0, 114, 112, 199, 0, 212, 0, 199, + 112, 212, 0, 0, 201, 0, 69, 0, 33, 202, + 0, 188, 0, 173, 0, 0, 104, 203, 172, 0, + 104, 105, 0, 104, 205, 105, 0, 206, 0, 205, + 109, 206, 0, 212, 0, 212, 106, 207, 107, 0, + 212, 106, 171, 107, 0, 207, 0, 102, 0, 9, + 0, 10, 0, 0, 209, 0, 103, 0, 103, 52, + 0, 103, 41, 0, 11, 0, 12, 0, 12, 0, + 8, 0 }; #endif @@ -368,22 +369,22 @@ static const short yyrline[] = { 0, 827, 831, 843, 849, 855, 862, 869, 874, 880, 886, 892, 897, 907, 909, 912, 920, 926, 935, 941, 958, 960, 965, 969, 974, 979, 985, 989, 1000, 1009, 1018, - 1029, 1051, 1055, 1061, 1067, 1073, 1079, 1087, 1095, 1101, - 1115, 1139, 1146, 1160, 1169, 1179, 1189, 1197, 1218, 1227, - 1236, 1237, 1239, 1246, 1258, 1268, 1270, 1275, 1279, 1283, - 1287, 1290, 1295, 1307, 1323, 1334, 1348, 1350, 1351, 1352, - 1353, 1354, 1355, 1356, 1357, 1358, 1359, 1360, 1366, 1368, - 1369, 1372, 1379, 1391, 1393, 1397, 1401, 1402, 1403, 1404, - 1405, 1409, 1410, 1411, 1412, 1416, 1417, 1424, 1424, 1425, - 1425, 1426, 1428, 1430, 1435, 1439, 1448, 1452, 1457, 1461, - 1467, 1477, 1481, 1484, 1487, 1492, 1501, 1509, 1515, 1522, - 1530, 1538, 1547, 1550, 1555, 1557, 1558, 1559, 1562, 1566, - 1571, 1575, 1586, 1591, 1596, 1603, 1609, 1613, 1618, 1624, - 1636, 1638, 1641, 1645, 1648, 1653, 1657, 1665, 1680, 1686, - 1693, 1706, 1718, 1733, 1737, 1754, 1756, 1759, 1763, 1769, - 1772, 1774, 1774, 1794, 1799, 1804, 1810, 1816, 1824, 1832, - 1840, 1847, 1857, 1862, 1892, 1894, 1897, 1902, 1906, 1912, - 1917, 1924, 1931 + 1029, 1051, 1055, 1061, 1067, 1073, 1079, 1088, 1097, 1103, + 1117, 1141, 1148, 1162, 1171, 1181, 1191, 1199, 1220, 1229, + 1238, 1239, 1241, 1248, 1260, 1270, 1272, 1277, 1281, 1285, + 1289, 1292, 1297, 1309, 1325, 1336, 1350, 1352, 1353, 1354, + 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1368, 1370, + 1371, 1374, 1381, 1393, 1395, 1399, 1403, 1404, 1405, 1406, + 1407, 1411, 1412, 1413, 1414, 1418, 1419, 1426, 1426, 1427, + 1427, 1428, 1430, 1432, 1437, 1441, 1450, 1454, 1459, 1463, + 1469, 1479, 1483, 1486, 1489, 1494, 1503, 1511, 1517, 1524, + 1532, 1540, 1549, 1552, 1557, 1559, 1560, 1561, 1564, 1568, + 1573, 1577, 1588, 1593, 1598, 1605, 1611, 1615, 1620, 1626, + 1638, 1640, 1643, 1647, 1650, 1655, 1659, 1667, 1682, 1688, + 1695, 1708, 1720, 1735, 1739, 1756, 1758, 1761, 1765, 1771, + 1774, 1776, 1776, 1796, 1801, 1806, 1812, 1818, 1826, 1834, + 1842, 1849, 1859, 1864, 1894, 1896, 1899, 1904, 1908, 1914, + 1919, 1926, 1933 }; #endif @@ -475,7 +476,7 @@ static const short yyr2[] = { 0, 1, 1, 1, 3, 3, 3, 1, 1, 3, 2, 1, 5, 0, 1, 1, 3, 2, 4, 4, 0, 1, 0, 6, 1, 2, 1, 1, 1, 3, 3, - 3, 1, 1, 4, 4, 4, 4, 4, 1, 4, + 3, 1, 1, 4, 4, 4, 5, 5, 1, 4, 4, 1, 3, 1, 3, 3, 1, 3, 1, 3, 1, 1, 1, 1, 4, 0, 3, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 1, 1, @@ -519,228 +520,236 @@ static const short yydefact[] = { 0, 217, 201, 202, 0, 0, 0, 90, 0, 0, 228, 226, 226, 87, 227, 0, 0, 98, 0, 78, 81, 245, 113, 0, 0, 0, 73, 77, 245, 0, 179, - 0, 0, 0, 0, 242, 234, 0, 236, 241, 238, + 245, 0, 0, 245, 242, 234, 0, 236, 241, 238, 0, 69, 71, 72, 63, 195, 0, 0, 0, 0, 0, 51, 0, 170, 171, 168, 169, 0, 0, 172, 0, 0, 0, 0, 120, 135, 127, 134, 0, 82, 91, 86, 232, 231, 230, 229, 83, 83, 110, 0, 104, 0, 80, 0, 245, 105, 0, 226, 177, 0, - 107, 0, 106, 108, 235, 0, 0, 111, 245, 196, + 0, 0, 106, 0, 235, 0, 0, 111, 245, 196, 197, 192, 190, 0, 218, 187, 57, 183, 184, 185, 0, 191, 189, 0, 0, 220, 136, 0, 0, 84, 88, 89, 99, 100, 79, 176, 76, 74, 75, 180, - 178, 237, 0, 0, 70, 198, 209, 0, 207, 173, - 186, 0, 222, 224, 219, 0, 92, 233, 0, 240, - 239, 206, 0, 211, 223, 0, 221, 0, 181, 208, - 214, 215, 213, 210, 212, 225, 96, 0, 94, 97, - 93, 95, 0, 0, 0 + 107, 178, 108, 237, 0, 0, 70, 198, 209, 0, + 207, 173, 186, 0, 222, 224, 219, 0, 92, 233, + 0, 240, 239, 206, 0, 211, 223, 0, 221, 0, + 181, 208, 214, 215, 213, 210, 212, 225, 96, 0, + 94, 97, 93, 95, 0, 0, 0 }; -static const short yydefgoto[] = { 393, +static const short yydefgoto[] = { 395, 3, 4, 8, 9, 13, 14, 25, 26, 27, 55, 56, 57, 106, 58, 74, 75, 76, 77, 59, 69, 70, 60, 100, 211, 212, 213, 61, 126, 127, 261, 262, 245, 246, 238, 239, 116, 341, 178, 179, 290, - 291, 378, 388, 389, 247, 263, 147, 148, 163, 164, + 291, 380, 390, 391, 247, 263, 147, 148, 163, 164, 180, 181, 62, 172, 225, 173, 287, 149, 103, 151, 152, 278, 279, 281, 188, 189, 190, 249, 250, 215, - 268, 216, 217, 218, 358, 359, 384, 385, 219, 220, - 221, 335, 336, 363, 233, 234, 296, 339, 195, 257, + 268, 216, 217, 218, 360, 361, 386, 387, 219, 220, + 221, 335, 336, 365, 233, 234, 296, 339, 195, 257, 258, 222, 235, 119, 153, 104, 223 }; -static const short yypact[] = { 29, --32768,-32768, 29,-32768, -79,-32768, 18, 22,-32768,-32768, --32768,-32768, 42,-32768, 34, 236,-32768,-32768, 99, 71, - 115, 118, 102, 121, 190, 236,-32768, 105,-32768,-32768, --32768,-32768,-32768, 224,-32768,-32768, 329,-32768, 235, 11, --32768,-32768,-32768, 192,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 227, 329,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 33, 238,-32768, 173,-32768, 54,-32768, --32768,-32768,-32768, 23,-32768, -17,-32768,-32768,-32768,-32768, --32768, -10, 174,-32768, 210,-32768, 211, 223,-32768,-32768, --32768,-32768,-32768, 247, 216,-32768,-32768,-32768, 543, 296, --32768,-32768,-32768, 199, 310,-32768,-32768,-32768, 246,-32768, --32768, 29, 246, 212, 176,-32768,-32768, 406,-32768, 246, --32768,-32768,-32768,-32768,-32768, 109,-32768, 208, 213, 217, - 155, 78,-32768, -79,-32768, 155,-32768,-32768, -9, 221, - 291, 231, 260, 103, 128,-32768, 117,-32768,-32768, 232, --32768,-32768, 240,-32768,-32768, 336, 543, 342, 342, 135, --32768,-32768, 241,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 242,-32768,-32768, 150,-32768, 61, --32768, 326, 16, 278, 251, 40, 140, 292,-32768, 253, - 40, 294,-32768, 52,-32768, 24, 261,-32768,-32768,-32768, --32768,-32768,-32768, 25,-32768,-32768, 338,-32768, 29, 140, - 265, 263,-32768, 233, 277, 270, 25,-32768,-32768, 276, --32768,-32768,-32768, 155, 377, 342, 287, 155, 298,-32768, - 35, 35,-32768,-32768, 483, 342, 274, 156,-32768,-32768, - 261,-32768, 140, 318, 158,-32768,-32768, 261, 280, 249, - 483, 140, 164, 483,-32768,-32768, 166,-32768,-32768, 284, - 167,-32768,-32768,-32768,-32768, 279, 290, 165, 297, 289, - 299,-32768, 135,-32768,-32768,-32768,-32768, 140, 140,-32768, - 140, 140, 182, 293,-32768,-32768, 400,-32768, 323,-32768, --32768,-32768,-32768,-32768,-32768,-32768, 320, 320,-32768, 388, --32768, 16,-32768, 302, 261,-32768, 40, 35,-32768, 308, --32768, 304,-32768,-32768,-32768, 56, 388,-32768, 24,-32768, - 300,-32768,-32768, 30,-32768,-32768,-32768,-32768,-32768,-32768, - 309,-32768,-32768, 9, 175,-32768,-32768, 311, 377,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 316, --32768,-32768, 313, 319,-32768,-32768,-32768, 178,-32768, 117, --32768, 342, 315,-32768,-32768, 293,-32768, 400, 140,-32768, --32768,-32768, 30, 92, 315, 342,-32768, 239, 233,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768, 7,-32768,-32768, --32768,-32768, 431, 434,-32768 +static const short yypact[] = { 254, +-32768,-32768, 254,-32768, -79,-32768, 13, 7,-32768,-32768, +-32768,-32768, 35,-32768, -51, 202,-32768,-32768, 61, 20, + 11, 19, 57, 44, 90, 202,-32768, 23,-32768,-32768, +-32768,-32768,-32768, 115,-32768,-32768, 351,-32768, 176, 12, +-32768,-32768,-32768, 174,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 151, 351,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 220, 565,-32768, 99,-32768, 199,-32768, +-32768,-32768,-32768, 24,-32768, -20,-32768,-32768,-32768,-32768, +-32768, -9, 106,-32768, 140,-32768, 145, 163,-32768,-32768, +-32768,-32768,-32768, 186, 182,-32768,-32768,-32768, 582, 249, +-32768,-32768,-32768, 143, 278,-32768,-32768,-32768, 228,-32768, +-32768, 254, 228, 180, 129,-32768,-32768, 428,-32768, 228, +-32768,-32768,-32768,-32768,-32768, 101,-32768, 147, 191, 195, + 300, 74,-32768, -79,-32768, 300,-32768,-32768, 105, 214, + 285, 217, 255, 89, 124,-32768, -40,-32768,-32768, 218, +-32768,-32768, 221,-32768,-32768, 328, 582, 324, 324, 51, +-32768,-32768, 222,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 223,-32768,-32768, 142,-32768, 40, +-32768, 308, 37, 304, 230, 48, 155, 269,-32768, 232, + 48, 271,-32768, 42,-32768, 26, 237,-32768,-32768,-32768, +-32768,-32768,-32768, -26,-32768,-32768, 311,-32768, 254, 155, + 238, 236,-32768, 206, 251, 242, -26,-32768,-32768, 245, +-32768,-32768,-32768, 300, 346, 324, 256, 300, 320,-32768, + 5, 5,-32768,-32768, 505, 324, 241, 144,-32768,-32768, + 237,-32768, 155, 286, 153,-32768,-32768, 237, 246, 171, + 237, 155, 167, 237,-32768,-32768, 168,-32768,-32768, 252, + 170,-32768,-32768,-32768,-32768, 248, 265, 82, 266, 250, + 262,-32768, 51,-32768,-32768,-32768,-32768, 155, 155,-32768, + 155, 155, 188, 258,-32768,-32768, 369,-32768, 293,-32768, +-32768,-32768,-32768,-32768,-32768,-32768, 288, 288,-32768, 280, +-32768, 37,-32768, 270, 237,-32768, 48, 5,-32768, 277, + 505, 273,-32768, 505,-32768, 54, 280,-32768, 26,-32768, + 268,-32768,-32768, 60,-32768,-32768,-32768,-32768,-32768,-32768, + 275,-32768,-32768, 9, 177,-32768,-32768, 282, 346,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 279, +-32768,-32768,-32768,-32768, 283, 284,-32768,-32768,-32768, 189, +-32768, -40,-32768, 324, 272,-32768,-32768, 258,-32768, 369, + 155,-32768,-32768,-32768, 60, 85, 272, 324,-32768, 94, + 206,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 14, +-32768,-32768,-32768,-32768, 392, 394,-32768 }; static const short yypgoto[] = {-32768, --32768, 432, 303,-32768,-32768, 423,-32768,-32768, 412,-32768, --32768, 383,-32768,-32768,-32768, 366,-32768, 328,-32768,-32768, - 334,-32768, 379,-32768,-32768, 172,-32768,-32768, 295,-32768, - 129, 256, 142,-32768, 149,-32768, 159,-32768, 230,-32768, --32768,-32768,-32768, 72, -169, -81, -18, -49,-32768, 237, - -172, -68,-32768,-32768,-32768, -246, 120, -52, -115,-32768, - 116,-32768,-32768,-32768, -138,-32768,-32768, -12, -156, -200, - 250,-32768, -186,-32768,-32768, 90,-32768,-32768,-32768,-32768, --32768,-32768, 100, 106, -179,-32768,-32768,-32768,-32768,-32768, - 160, -122, 392,-32768, 2,-32768, -7 +-32768, 395, 261,-32768,-32768, 389,-32768,-32768, 377,-32768, +-32768, 348,-32768,-32768,-32768, 333,-32768, 295,-32768,-32768, + 303,-32768, 344,-32768,-32768, 141,-32768,-32768, 259,-32768, + 100, 227, 113,-32768, 111,-32768, 123,-32768, 194,-32768, +-32768,-32768,-32768, 33, -169, -81, -173, -49,-32768, 203, + -177, -100,-32768,-32768,-32768, -252, 87, -52, -109,-32768, + 67,-32768,-32768,-32768, -137,-32768,-32768, -44, -156, -107, + 211,-32768, -56,-32768,-32768, 55,-32768,-32768,-32768,-32768, +-32768,-32768, 63, 65, -160,-32768,-32768,-32768,-32768,-32768, + 116, -125, -71,-32768, 2,-32768, -7 }; -#define YYLAST 634 +#define YYLAST 673 static const short yytable[] = { 15, - 117, 5, 150, 214, 5, 15, 192, 232, 193, 174, - 387, 102, 102, 240, 101, 101, 10, 114, 10, 161, - 162, 1, 2, 10, 7, 10, 11, 67, 112, 65, - 10, 10, 72, 1, 2, 82, 79, 10, 64, 1, - 2, 71, 295, 83, 84, 78, 128, 10, 65, 10, - 11, 297, 298, 343, 85, 16, 86, 64, 87, 10, - 169, 170, 165, 10, 169, 170, 79, 229, 88, 244, - 353, 259, 89, 161, 162, 78, 90, 328, 329, 91, - 330, 323, 166, 167, 168, 10, 169, 170, 1, 2, - 92, 113, 115, 229, -250, 93, 333, 94, 231, 95, - 129, 72, 120, 230, 128, 79, 381, 28, 96, 97, - 71, 391, 155, 134, 78, 265, 214, 237, 68, 150, - 362, 154, 12, 98, 176, 266, 115, 29, 349, 230, - 110, 357, 240, 175, 242, 150, 99, 267, 150, 19, - 201, 237, 10, 169, 170, 201, 17, 10, 169, 170, - 199, 200, 63, 255, 32, 165, 256, 255, 129, 303, - 382, 108, 109, 115, 383, -226, 308, 161, 162, -226, - 201, 63, 10, 169, 170, 241, 294, 344, 248, 202, - 203, 171, 185, 248, 202, 203, 260, 201, 264, 10, - 169, 170, 34, 259, 354, 204, 185, 271, 30, 10, - 204, 31, 1, 2, 33, 390, 186, 185, 187, 202, - 270, 36, 379, 156, 205, 390, 137, 157, 288, 205, - 206, 374, 187, 347, 322, 206, 202, 138, 299, 207, - 304, 191, 311, 187, 207, 314, 208, 73, 209, 312, - 210, 332, 387, 209, 37, 210, 66, 20, 83, 84, - 206, 161, 162, 10, 227, 21, 1, 2, 228, 85, - 301, 86, 306, 87, 302, 80, 307, 206, 313, 331, - 315, 318, 307, 88, 316, 319, 22, 89, 23, 365, - 107, 90, 372, 366, 91, 120, 373, 24, 83, 84, - 121, 122, 176, 123, 241, 92, 125, 124, 130, 248, - 93, 175, 94, 201, 95, 10, 169, 170, 260, 176, - 131, 264, 132, 96, 97, 136, 360, 158, 175, 85, - 160, 86, 159, 87, -251, 182, 364, 184, 98, 274, - 275, 276, 277, 88, 183, 194, 10, 89, 197, 1, - 2, 90, 202, 196, 91, 274, 275, 276, 277, 10, - 236, 38, 224, 226, 364, 92, 243, 310, 252, 251, - 93, 254, 94, 115, 95, 360, 39, 269, 386, 272, - 40, 273, 280, 96, 97, 282, 41, 42, 43, 284, - 286, 289, 44, 206, 300, 305, 309, 45, 98, 317, - 321, 320, 46, 325, 47, 10, 169, 170, 1, 2, - 324, 293, 48, 337, 338, 326, 334, 340, 346, 350, - 351, 49, 356, 50, 367, 361, 139, 140, 51, 370, - 52, 53, 54, 141, 369, 371, 376, 85, 38, 86, - 394, 87, 142, 395, 6, 18, 177, 35, 81, 111, - 135, 88, 133, 105, 327, 89, 253, 355, 348, 90, - 345, 198, 91, 41, 42, 43, 342, 292, 368, 392, - 285, 143, 380, 92, 45, 377, 283, 375, 93, 46, - 94, 47, 95, 118, 0, 352, 0, 0, 0, 48, - 0, 96, 97, 144, 145, 0, 0, 0, 49, 0, - 50, 0, 146, 139, 140, 51, 98, 52, 53, 54, - 141, 0, 0, 0, 85, 38, 86, 0, 87, 142, - 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, - 0, 0, 89, 0, 0, 0, 90, 0, 0, 91, - 41, 42, 43, 0, 0, 0, 0, 0, 143, 0, - 92, 45, 0, 0, 0, 93, 46, 94, 47, 95, - 0, 0, 0, 1, 2, 0, 48, 0, 96, 97, - 144, 145, 0, 0, 85, 49, 86, 50, 87, 0, - 0, 0, 51, 98, 52, 53, 54, 0, 88, 0, - 0, 0, 89, 0, 0, 0, 90, 0, 0, 91, + 117, 5, 232, 214, 5, 15, 174, 192, 150, 193, + 118, 102, 102, 240, 101, 101, 10, 389, 114, 10, + 10, 11, 1, 2, 7, 112, 161, 162, 67, 65, + 165, 10, 72, 10, 1, 2, 79, 229, 64, 185, + 16, 71, 10, 11, 10, 78, 128, 343, 65, 10, + 169, 170, 161, 162, 19, 10, 201, 64, 10, 169, + 170, 10, 169, 170, 355, 187, 79, 10, 259, 28, + 297, 298, 229, 230, 266, 78, 29, 244, 166, 167, + 168, 10, 169, 170, 1, 2, 267, 201, 113, 10, + 169, 170, 34, 115, 30, 202, 203, 389, 231, 383, + 129, 72, 31, 63, 128, 79, 161, 162, 230, 32, + 71, 204, 155, 134, 78, 265, 214, 12, 393, 68, + 364, 154, 63, 165, 176, 150, 202, 33, 115, 36, + 205, 110, 240, 175, 242, 37, 206, 351, 237, 17, + 353, 322, 115, 255, -226, 207, 256, 349, -226, 237, + 199, 200, 208, 384, 209, 255, 210, 385, 129, 303, + 201, 359, 10, 169, 170, 271, 308, 206, 185, 137, + 328, 329, 295, 330, 344, 241, 294, 171, 248, 311, + 138, 10, 314, 248, 1, 2, 260, 66, 264, 80, + 259, 356, 186, 201, 187, 10, 169, 170, 304, 202, + 203, 150, 392, 185, 150, 156, 107, 312, -250, 157, + 270, 323, 392, 20, 381, 204, 120, 120, 288, 73, + 121, 21, 82, 347, 376, 122, 333, 191, 299, 187, + 83, 84, 202, 123, 205, 10, 124, 331, 1, 2, + 206, 85, 22, 86, 23, 87, 227, 332, 301, 207, + 228, 130, 302, 24, 131, 88, 158, 306, 209, 89, + 210, 307, 125, 90, 1, 2, 91, 274, 275, 276, + 277, 313, 315, 206, 318, 307, 316, 92, 319, 310, + 132, 367, 93, 136, 94, 368, 95, 10, 169, 170, + 1, 2, 176, 374, 241, 96, 97, 375, 160, 248, + 159, 175, 274, 275, 276, 277, 108, 109, 260, 176, + 98, 264, 161, 162, 83, 84, 362, -251, 175, 182, + 183, 194, 184, 99, 196, 201, 366, 10, 169, 170, + 197, 10, 236, 224, 226, 243, 251, 252, 254, 115, + 269, 85, 272, 86, 273, 87, 280, 282, 284, 286, + 289, 300, 309, 305, 325, 88, 366, 317, 10, 89, + 320, 1, 2, 90, 202, 321, 91, 362, 326, 324, + 388, 334, 337, 38, 338, 340, 346, 92, 350, 352, + 358, 363, 93, 378, 94, 369, 95, 371, 39, 372, + 373, 396, 40, 397, 177, 96, 97, 6, 41, 42, + 43, 18, 35, 81, 44, 206, 111, 135, 105, 45, + 98, 133, 345, 327, 46, 198, 47, 253, 357, 348, + 342, 292, 394, 293, 48, 370, 285, 283, 377, 382, + 379, 354, 0, 49, 0, 50, 0, 0, 139, 140, + 51, 0, 52, 53, 54, 141, 0, 0, 0, 85, + 38, 86, 0, 87, 142, 0, 0, 0, 0, 0, + 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, + 0, 90, 0, 0, 91, 41, 42, 43, 0, 0, + 0, 0, 0, 143, 0, 92, 45, 0, 0, 0, + 93, 46, 94, 47, 95, 0, 0, 0, 0, 0, + 0, 48, 0, 96, 97, 144, 145, 0, 0, 0, + 49, 0, 50, 0, 146, 139, 140, 51, 98, 52, + 53, 54, 141, 0, 0, 0, 85, 38, 86, 0, + 87, 142, 0, 0, 0, 0, 0, 0, 0, 0, + 88, 0, 0, 0, 89, 0, 0, 0, 90, 0, + 0, 91, 41, 42, 43, 0, 0, 0, 0, 0, + 143, 0, 92, 45, 0, 0, 0, 93, 46, 94, + 47, 95, 0, 0, 0, 83, 84, 0, 48, 0, + 96, 97, 144, 145, 0, 0, 85, 49, 86, 50, + 87, 0, 1, 2, 51, 98, 52, 53, 54, 0, + 88, 0, 0, 85, 89, 86, 0, 87, 90, 0, + 0, 91, 0, 0, 0, 0, 0, 88, 0, 0, + 0, 89, 92, 0, 0, 90, 0, 93, 91, 94, + 0, 95, 0, 0, 0, 0, 0, 0, 0, 92, + 96, 97, 0, 0, 93, 0, 94, 0, 95, 0, + 0, 0, 0, 0, 0, 98, 0, 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 92, 0, 0, 0, 0, 93, 0, 94, 0, 95, - 0, 0, 0, 0, 0, 0, 0, 0, 96, 97, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 98 + 0, 0, 98 }; static const short yycheck[] = { 7, - 82, 0, 118, 160, 3, 13, 145, 180, 147, 132, - 4, 64, 65, 183, 64, 65, 8, 28, 8, 13, - 14, 11, 12, 8, 104, 8, 9, 17, 46, 37, - 8, 8, 40, 11, 12, 3, 44, 8, 37, 11, - 12, 40, 229, 11, 12, 44, 99, 8, 56, 8, - 9, 231, 232, 300, 22, 34, 24, 56, 26, 8, - 9, 10, 131, 8, 9, 10, 74, 33, 36, 30, - 317, 194, 40, 13, 14, 74, 44, 278, 279, 47, - 281, 268, 5, 6, 7, 8, 9, 10, 11, 12, - 58, 109, 103, 33, 104, 63, 283, 65, 180, 67, - 99, 109, 112, 69, 157, 113, 15, 9, 76, 77, - 109, 105, 120, 112, 113, 197, 273, 102, 108, 235, - 112, 120, 105, 91, 132, 101, 103, 57, 308, 69, - 108, 102, 302, 132, 184, 251, 104, 113, 254, 106, - 6, 102, 8, 9, 10, 6, 105, 8, 9, 10, - 158, 159, 37, 102, 53, 224, 105, 102, 157, 241, - 69, 108, 109, 103, 73, 105, 248, 13, 14, 109, - 6, 56, 8, 9, 10, 183, 229, 300, 186, 45, - 46, 104, 80, 191, 45, 46, 194, 6, 196, 8, - 9, 10, 3, 316, 317, 61, 80, 210, 84, 8, - 61, 84, 11, 12, 84, 378, 104, 80, 106, 45, - 209, 107, 369, 105, 80, 388, 41, 109, 226, 80, - 86, 360, 106, 305, 60, 86, 45, 52, 236, 95, - 243, 104, 251, 106, 95, 254, 102, 46, 104, 252, - 106, 60, 4, 104, 21, 106, 12, 12, 11, 12, - 86, 13, 14, 8, 105, 20, 11, 12, 109, 22, - 105, 24, 105, 26, 109, 39, 109, 86, 105, 282, - 105, 105, 109, 36, 109, 109, 41, 40, 43, 105, - 108, 44, 105, 109, 47, 112, 109, 52, 11, 12, - 81, 81, 300, 71, 302, 58, 81, 51, 3, 307, - 63, 300, 65, 6, 67, 8, 9, 10, 316, 317, - 112, 319, 3, 76, 77, 104, 324, 110, 317, 22, - 104, 24, 110, 26, 104, 35, 334, 68, 91, 97, - 98, 99, 100, 36, 104, 104, 8, 40, 3, 11, - 12, 44, 45, 104, 47, 97, 98, 99, 100, 8, - 25, 23, 112, 112, 362, 58, 106, 109, 106, 68, - 63, 68, 65, 103, 67, 373, 38, 30, 376, 105, - 42, 109, 96, 76, 77, 106, 48, 49, 50, 104, - 4, 95, 54, 86, 111, 68, 107, 59, 91, 106, - 101, 113, 64, 105, 66, 8, 9, 10, 11, 12, - 104, 104, 74, 4, 82, 107, 114, 88, 107, 102, - 107, 83, 113, 85, 104, 107, 11, 12, 90, 107, - 92, 93, 94, 18, 109, 107, 112, 22, 23, 24, - 0, 26, 27, 0, 3, 13, 134, 26, 56, 74, - 113, 36, 109, 65, 273, 40, 191, 319, 307, 44, - 302, 157, 47, 48, 49, 50, 298, 228, 339, 388, - 224, 56, 373, 58, 59, 366, 217, 362, 63, 64, - 65, 66, 67, 82, -1, 316, -1, -1, -1, 74, - -1, 76, 77, 78, 79, -1, -1, -1, 83, -1, - 85, -1, 87, 11, 12, 90, 91, 92, 93, 94, - 18, -1, -1, -1, 22, 23, 24, -1, 26, 27, - -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, - -1, -1, 40, -1, -1, -1, 44, -1, -1, 47, - 48, 49, 50, -1, -1, -1, -1, -1, 56, -1, - 58, 59, -1, -1, -1, 63, 64, 65, 66, 67, - -1, -1, -1, 11, 12, -1, 74, -1, 76, 77, - 78, 79, -1, -1, 22, 83, 24, 85, 26, -1, - -1, -1, 90, 91, 92, 93, 94, -1, 36, -1, - -1, -1, 40, -1, -1, -1, 44, -1, -1, 47, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 58, -1, -1, -1, -1, 63, -1, 65, -1, 67, - -1, -1, -1, -1, -1, -1, -1, -1, 76, 77, + 82, 0, 180, 160, 3, 13, 132, 145, 118, 147, + 82, 64, 65, 183, 64, 65, 8, 4, 28, 8, + 8, 9, 11, 12, 104, 46, 13, 14, 17, 37, + 131, 8, 40, 8, 11, 12, 44, 33, 37, 80, + 34, 40, 8, 9, 8, 44, 99, 300, 56, 8, + 9, 10, 13, 14, 106, 8, 6, 56, 8, 9, + 10, 8, 9, 10, 317, 106, 74, 8, 194, 9, + 231, 232, 33, 69, 101, 74, 57, 30, 5, 6, + 7, 8, 9, 10, 11, 12, 113, 6, 109, 8, + 9, 10, 3, 103, 84, 45, 46, 4, 180, 15, + 99, 109, 84, 37, 157, 113, 13, 14, 69, 53, + 109, 61, 120, 112, 113, 197, 273, 105, 105, 108, + 112, 120, 56, 224, 132, 235, 45, 84, 103, 107, + 80, 108, 302, 132, 184, 21, 86, 311, 102, 105, + 314, 60, 103, 102, 105, 95, 105, 308, 109, 102, + 158, 159, 102, 69, 104, 102, 106, 73, 157, 241, + 6, 102, 8, 9, 10, 210, 248, 86, 80, 41, + 278, 279, 229, 281, 300, 183, 229, 104, 186, 251, + 52, 8, 254, 191, 11, 12, 194, 12, 196, 39, + 316, 317, 104, 6, 106, 8, 9, 10, 243, 45, + 46, 311, 380, 80, 314, 105, 108, 252, 104, 109, + 209, 268, 390, 12, 371, 61, 112, 112, 226, 46, + 81, 20, 3, 305, 362, 81, 283, 104, 236, 106, + 11, 12, 45, 71, 80, 8, 51, 282, 11, 12, + 86, 22, 41, 24, 43, 26, 105, 60, 105, 95, + 109, 3, 109, 52, 112, 36, 110, 105, 104, 40, + 106, 109, 81, 44, 11, 12, 47, 97, 98, 99, + 100, 105, 105, 86, 105, 109, 109, 58, 109, 109, + 3, 105, 63, 104, 65, 109, 67, 8, 9, 10, + 11, 12, 300, 105, 302, 76, 77, 109, 104, 307, + 110, 300, 97, 98, 99, 100, 108, 109, 316, 317, + 91, 319, 13, 14, 11, 12, 324, 104, 317, 35, + 104, 104, 68, 104, 104, 6, 334, 8, 9, 10, + 3, 8, 25, 112, 112, 106, 68, 106, 68, 103, + 30, 22, 105, 24, 109, 26, 96, 106, 104, 4, + 95, 111, 107, 68, 105, 36, 364, 106, 8, 40, + 113, 11, 12, 44, 45, 101, 47, 375, 107, 104, + 378, 114, 4, 23, 82, 88, 107, 58, 102, 107, + 113, 107, 63, 112, 65, 104, 67, 109, 38, 107, + 107, 0, 42, 0, 134, 76, 77, 3, 48, 49, + 50, 13, 26, 56, 54, 86, 74, 113, 65, 59, + 91, 109, 302, 273, 64, 157, 66, 191, 319, 307, + 298, 228, 390, 104, 74, 339, 224, 217, 364, 375, + 368, 316, -1, 83, -1, 85, -1, -1, 11, 12, + 90, -1, 92, 93, 94, 18, -1, -1, -1, 22, + 23, 24, -1, 26, 27, -1, -1, -1, -1, -1, + -1, -1, -1, 36, -1, -1, -1, 40, -1, -1, + -1, 44, -1, -1, 47, 48, 49, 50, -1, -1, + -1, -1, -1, 56, -1, 58, 59, -1, -1, -1, + 63, 64, 65, 66, 67, -1, -1, -1, -1, -1, + -1, 74, -1, 76, 77, 78, 79, -1, -1, -1, + 83, -1, 85, -1, 87, 11, 12, 90, 91, 92, + 93, 94, 18, -1, -1, -1, 22, 23, 24, -1, + 26, 27, -1, -1, -1, -1, -1, -1, -1, -1, + 36, -1, -1, -1, 40, -1, -1, -1, 44, -1, + -1, 47, 48, 49, 50, -1, -1, -1, -1, -1, + 56, -1, 58, 59, -1, -1, -1, 63, 64, 65, + 66, 67, -1, -1, -1, 11, 12, -1, 74, -1, + 76, 77, 78, 79, -1, -1, 22, 83, 24, 85, + 26, -1, 11, 12, 90, 91, 92, 93, 94, -1, + 36, -1, -1, 22, 40, 24, -1, 26, 44, -1, + -1, 47, -1, -1, -1, -1, -1, 36, -1, -1, + -1, 40, 58, -1, -1, 44, -1, 63, 47, 65, + -1, 67, -1, -1, -1, -1, -1, -1, -1, 58, + 76, 77, -1, -1, 63, -1, 65, -1, 67, -1, + -1, -1, -1, -1, -1, 91, -1, 76, 77, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 91 + -1, -1, 91 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/share/bison.simple" @@ -2163,25 +2172,27 @@ case 107: { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); - yyval.a_expr->constraints = yyvsp[-2].a_constr; + yyval.a_expr->constraints = yyvsp[-3].a_constr; yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE_OF; yyval.a_expr->meta_type = AMT_TYPE; + yyvsp[0].a_expr->tag = yyvsp[-1].a_tag; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 108: -#line 1087 "asn1p_y.y" +#line 1088 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); - yyval.a_expr->constraints = yyvsp[-2].a_constr; + yyval.a_expr->constraints = yyvsp[-3].a_constr; yyval.a_expr->expr_type = ASN_CONSTR_SET_OF; yyval.a_expr->meta_type = AMT_TYPE; + yyvsp[0].a_expr->tag = yyvsp[-1].a_tag; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 109: -#line 1095 "asn1p_y.y" +#line 1097 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2190,7 +2201,7 @@ case 109: ; break;} case 110: -#line 1101 "asn1p_y.y" +#line 1103 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2204,7 +2215,7 @@ case 110: ; break;} case 111: -#line 1115 "asn1p_y.y" +#line 1117 "asn1p_y.y" { int ret; yyval.a_expr = yyvsp[-1].a_expr; @@ -2221,7 +2232,7 @@ case 111: ; break;} case 112: -#line 1139 "asn1p_y.y" +#line 1141 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2231,7 +2242,7 @@ case 112: ; break;} case 113: -#line 1146 "asn1p_y.y" +#line 1148 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2241,7 +2252,7 @@ case 113: ; break;} case 114: -#line 1161 "asn1p_y.y" +#line 1163 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2252,7 +2263,7 @@ case 114: ; break;} case 115: -#line 1169 "asn1p_y.y" +#line 1171 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2265,7 +2276,7 @@ case 115: ; break;} case 116: -#line 1179 "asn1p_y.y" +#line 1181 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2278,7 +2289,7 @@ case 116: ; break;} case 117: -#line 1189 "asn1p_y.y" +#line 1191 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2289,7 +2300,7 @@ case 117: ; break;} case 118: -#line 1197 "asn1p_y.y" +#line 1199 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[0].a_ref; @@ -2311,7 +2322,7 @@ case 118: ; break;} case 119: -#line 1219 "asn1p_y.y" +#line 1221 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2322,7 +2333,7 @@ case 119: ; break;} case 120: -#line 1227 "asn1p_y.y" +#line 1229 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[-2].a_ref; @@ -2332,21 +2343,21 @@ case 120: ; break;} case 123: -#line 1241 "asn1p_y.y" +#line 1243 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} case 124: -#line 1246 "asn1p_y.y" +#line 1248 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} case 125: -#line 1259 "asn1p_y.y" +#line 1261 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); @@ -2356,11 +2367,11 @@ case 125: ; break;} case 126: -#line 1269 "asn1p_y.y" +#line 1271 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} case 127: -#line 1270 "asn1p_y.y" +#line 1272 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); @@ -2368,40 +2379,40 @@ case 127: ; break;} case 128: -#line 1275 "asn1p_y.y" +#line 1277 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); ; break;} case 129: -#line 1279 "asn1p_y.y" +#line 1281 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); ; break;} case 130: -#line 1283 "asn1p_y.y" +#line 1285 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} case 131: -#line 1287 "asn1p_y.y" +#line 1289 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 132: -#line 1290 "asn1p_y.y" +#line 1292 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 133: -#line 1296 "asn1p_y.y" +#line 1298 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2415,7 +2426,7 @@ case 133: ; break;} case 134: -#line 1307 "asn1p_y.y" +#line 1309 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2432,7 +2443,7 @@ case 134: ; break;} case 135: -#line 1324 "asn1p_y.y" +#line 1326 "asn1p_y.y" { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 2; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); @@ -2445,7 +2456,7 @@ case 135: ; break;} case 136: -#line 1334 "asn1p_y.y" +#line 1336 "asn1p_y.y" { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); @@ -2460,67 +2471,67 @@ case 136: ; break;} case 137: -#line 1349 "asn1p_y.y" +#line 1351 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BOOLEAN; ; break;} case 138: -#line 1350 "asn1p_y.y" +#line 1352 "asn1p_y.y" { yyval.a_type = ASN_BASIC_NULL; ; break;} case 139: -#line 1351 "asn1p_y.y" +#line 1353 "asn1p_y.y" { yyval.a_type = ASN_BASIC_REAL; ; break;} case 140: -#line 1352 "asn1p_y.y" +#line 1354 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} case 141: -#line 1353 "asn1p_y.y" +#line 1355 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OCTET_STRING; ; break;} case 142: -#line 1354 "asn1p_y.y" +#line 1356 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; break;} case 143: -#line 1355 "asn1p_y.y" +#line 1357 "asn1p_y.y" { yyval.a_type = ASN_BASIC_RELATIVE_OID; ; break;} case 144: -#line 1356 "asn1p_y.y" +#line 1358 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EXTERNAL; ; break;} case 145: -#line 1357 "asn1p_y.y" +#line 1359 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; break;} case 146: -#line 1358 "asn1p_y.y" +#line 1360 "asn1p_y.y" { yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; break;} case 147: -#line 1359 "asn1p_y.y" +#line 1361 "asn1p_y.y" { yyval.a_type = ASN_BASIC_UTCTime; ; break;} case 148: -#line 1360 "asn1p_y.y" +#line 1362 "asn1p_y.y" { yyval.a_type = ASN_BASIC_GeneralizedTime; ; break;} case 149: -#line 1367 "asn1p_y.y" +#line 1369 "asn1p_y.y" { yyval.a_type = ASN_BASIC_INTEGER; ; break;} case 150: -#line 1368 "asn1p_y.y" +#line 1370 "asn1p_y.y" { yyval.a_type = ASN_BASIC_ENUMERATED; ; break;} case 151: -#line 1369 "asn1p_y.y" +#line 1371 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BIT_STRING; ; break;} case 152: -#line 1373 "asn1p_y.y" +#line 1375 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2529,7 +2540,7 @@ case 152: ; break;} case 153: -#line 1379 "asn1p_y.y" +#line 1381 "asn1p_y.y" { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; @@ -2542,91 +2553,91 @@ case 153: ; break;} case 154: -#line 1392 "asn1p_y.y" +#line 1394 "asn1p_y.y" { yyval.a_type = ASN_STRING_BMPString; ; break;} case 155: -#line 1393 "asn1p_y.y" +#line 1395 "asn1p_y.y" { yyval.a_type = ASN_STRING_GeneralString; fprintf(stderr, "WARNING: GeneralString is not fully supported"); ; break;} case 156: -#line 1397 "asn1p_y.y" +#line 1399 "asn1p_y.y" { yyval.a_type = ASN_STRING_GraphicString; fprintf(stderr, "WARNING: GraphicString is not fully supported"); ; break;} case 157: -#line 1401 "asn1p_y.y" +#line 1403 "asn1p_y.y" { yyval.a_type = ASN_STRING_IA5String; ; break;} case 158: -#line 1402 "asn1p_y.y" +#line 1404 "asn1p_y.y" { yyval.a_type = ASN_STRING_ISO646String; ; break;} case 159: -#line 1403 "asn1p_y.y" +#line 1405 "asn1p_y.y" { yyval.a_type = ASN_STRING_NumericString; ; break;} case 160: -#line 1404 "asn1p_y.y" +#line 1406 "asn1p_y.y" { yyval.a_type = ASN_STRING_PrintableString; ; break;} case 161: -#line 1405 "asn1p_y.y" +#line 1407 "asn1p_y.y" { yyval.a_type = ASN_STRING_T61String; fprintf(stderr, "WARNING: T61String is not fully supported"); ; break;} case 162: -#line 1409 "asn1p_y.y" +#line 1411 "asn1p_y.y" { yyval.a_type = ASN_STRING_TeletexString; ; break;} case 163: -#line 1410 "asn1p_y.y" +#line 1412 "asn1p_y.y" { yyval.a_type = ASN_STRING_UniversalString; ; break;} case 164: -#line 1411 "asn1p_y.y" +#line 1413 "asn1p_y.y" { yyval.a_type = ASN_STRING_UTF8String; ; break;} case 165: -#line 1412 "asn1p_y.y" +#line 1414 "asn1p_y.y" { yyval.a_type = ASN_STRING_VideotexString; fprintf(stderr, "WARNING: VideotexString is not fully supported"); ; break;} case 166: -#line 1416 "asn1p_y.y" +#line 1418 "asn1p_y.y" { yyval.a_type = ASN_STRING_VisibleString; ; break;} case 167: -#line 1417 "asn1p_y.y" +#line 1419 "asn1p_y.y" { yyval.a_type = ASN_STRING_ObjectDescriptor; ; break;} case 173: -#line 1429 "asn1p_y.y" +#line 1431 "asn1p_y.y" { yyval.a_constr = 0; ; break;} case 174: -#line 1430 "asn1p_y.y" +#line 1432 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 175: -#line 1436 "asn1p_y.y" +#line 1438 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); ; break;} case 176: -#line 1439 "asn1p_y.y" +#line 1441 "asn1p_y.y" { /* * This is a special case, for compatibility purposes. @@ -2636,25 +2647,25 @@ case 176: ; break;} case 177: -#line 1449 "asn1p_y.y" +#line 1451 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; ; break;} case 178: -#line 1452 "asn1p_y.y" +#line 1454 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} case 179: -#line 1458 "asn1p_y.y" +#line 1460 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 180: -#line 1461 "asn1p_y.y" +#line 1463 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2663,7 +2674,7 @@ case 180: ; break;} case 181: -#line 1467 "asn1p_y.y" +#line 1469 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2674,31 +2685,31 @@ case 181: ; break;} case 182: -#line 1478 "asn1p_y.y" +#line 1480 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 183: -#line 1481 "asn1p_y.y" +#line 1483 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 184: -#line 1484 "asn1p_y.y" +#line 1486 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 185: -#line 1487 "asn1p_y.y" +#line 1489 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 186: -#line 1493 "asn1p_y.y" +#line 1495 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2709,7 +2720,7 @@ case 186: ; break;} case 187: -#line 1501 "asn1p_y.y" +#line 1503 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2720,7 +2731,7 @@ case 187: ; break;} case 188: -#line 1509 "asn1p_y.y" +#line 1511 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2729,7 +2740,7 @@ case 188: ; break;} case 189: -#line 1515 "asn1p_y.y" +#line 1517 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2739,7 +2750,7 @@ case 189: ; break;} case 190: -#line 1522 "asn1p_y.y" +#line 1524 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2750,7 +2761,7 @@ case 190: ; break;} case 191: -#line 1530 "asn1p_y.y" +#line 1532 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2761,7 +2772,7 @@ case 191: ; break;} case 192: -#line 1538 "asn1p_y.y" +#line 1540 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2773,53 +2784,53 @@ case 192: ; break;} case 193: -#line 1547 "asn1p_y.y" +#line 1549 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 194: -#line 1550 "asn1p_y.y" +#line 1552 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 195: -#line 1556 "asn1p_y.y" +#line 1558 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RANGE; ; break;} case 196: -#line 1557 "asn1p_y.y" +#line 1559 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RLRANGE; ; break;} case 197: -#line 1558 "asn1p_y.y" +#line 1560 "asn1p_y.y" { yyval.a_ctype = ACT_EL_LLRANGE; ; break;} case 198: -#line 1559 "asn1p_y.y" +#line 1561 "asn1p_y.y" { yyval.a_ctype = ACT_EL_ULRANGE; ; break;} case 199: -#line 1563 "asn1p_y.y" +#line 1565 "asn1p_y.y" { yyval.a_ctype = ACT_CT_SIZE; ; break;} case 200: -#line 1566 "asn1p_y.y" +#line 1568 "asn1p_y.y" { yyval.a_ctype = ACT_CT_FROM; ; break;} case 201: -#line 1572 "asn1p_y.y" +#line 1574 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 202: -#line 1575 "asn1p_y.y" +#line 1577 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2833,14 +2844,14 @@ case 202: ; break;} case 203: -#line 1586 "asn1p_y.y" +#line 1588 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} case 204: -#line 1591 "asn1p_y.y" +#line 1593 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2848,7 +2859,7 @@ case 204: ; break;} case 205: -#line 1596 "asn1p_y.y" +#line 1598 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); @@ -2856,25 +2867,25 @@ case 205: ; break;} case 206: -#line 1604 "asn1p_y.y" +#line 1606 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); ; break;} case 207: -#line 1610 "asn1p_y.y" +#line 1612 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 208: -#line 1613 "asn1p_y.y" +#line 1615 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 209: -#line 1619 "asn1p_y.y" +#line 1621 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2882,7 +2893,7 @@ case 209: ; break;} case 210: -#line 1624 "asn1p_y.y" +#line 1626 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2892,45 +2903,45 @@ case 210: ; break;} case 211: -#line 1637 "asn1p_y.y" +#line 1639 "asn1p_y.y" { yyval.a_pres = ACPRES_DEFAULT; ; break;} case 212: -#line 1638 "asn1p_y.y" +#line 1640 "asn1p_y.y" { yyval.a_pres = yyvsp[0].a_pres; ; break;} case 213: -#line 1642 "asn1p_y.y" +#line 1644 "asn1p_y.y" { yyval.a_pres = ACPRES_PRESENT; ; break;} case 214: -#line 1645 "asn1p_y.y" +#line 1647 "asn1p_y.y" { yyval.a_pres = ACPRES_ABSENT; ; break;} case 215: -#line 1648 "asn1p_y.y" +#line 1650 "asn1p_y.y" { yyval.a_pres = ACPRES_OPTIONAL; ; break;} case 216: -#line 1654 "asn1p_y.y" +#line 1656 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 217: -#line 1657 "asn1p_y.y" +#line 1659 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 218: -#line 1666 "asn1p_y.y" +#line 1668 "asn1p_y.y" { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; @@ -2945,13 +2956,13 @@ case 218: ; break;} case 219: -#line 1681 "asn1p_y.y" +#line 1683 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} case 220: -#line 1687 "asn1p_y.y" +#line 1689 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2960,7 +2971,7 @@ case 220: ; break;} case 221: -#line 1693 "asn1p_y.y" +#line 1695 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2971,7 +2982,7 @@ case 221: ; break;} case 222: -#line 1707 "asn1p_y.y" +#line 1709 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; @@ -2985,7 +2996,7 @@ case 222: ; break;} case 223: -#line 1718 "asn1p_y.y" +#line 1720 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; @@ -3000,13 +3011,13 @@ case 223: ; break;} case 224: -#line 1734 "asn1p_y.y" +#line 1736 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} case 225: -#line 1737 "asn1p_y.y" +#line 1739 "asn1p_y.y" { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); @@ -3018,60 +3029,60 @@ case 225: ; break;} case 226: -#line 1755 "asn1p_y.y" +#line 1757 "asn1p_y.y" { yyval.a_marker = EM_NOMARK; ; break;} case 227: -#line 1756 "asn1p_y.y" +#line 1758 "asn1p_y.y" { yyval.a_marker = yyvsp[0].a_marker; ; break;} case 228: -#line 1760 "asn1p_y.y" +#line 1762 "asn1p_y.y" { yyval.a_marker = EM_OPTIONAL; ; break;} case 229: -#line 1763 "asn1p_y.y" +#line 1765 "asn1p_y.y" { yyval.a_marker = EM_DEFAULT; /* FIXME: store DefaultValue somewhere */ ; break;} case 230: -#line 1770 "asn1p_y.y" +#line 1772 "asn1p_y.y" { ; break;} case 231: -#line 1772 "asn1p_y.y" +#line 1774 "asn1p_y.y" { ; break;} case 232: -#line 1774 "asn1p_y.y" +#line 1776 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} case 233: -#line 1774 "asn1p_y.y" +#line 1776 "asn1p_y.y" { ; break;} case 234: -#line 1795 "asn1p_y.y" +#line 1797 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); ; break;} case 235: -#line 1799 "asn1p_y.y" +#line 1801 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; ; break;} case 236: -#line 1805 "asn1p_y.y" +#line 1807 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3079,14 +3090,14 @@ case 236: ; break;} case 237: -#line 1810 "asn1p_y.y" +#line 1812 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 238: -#line 1817 "asn1p_y.y" +#line 1819 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3096,7 +3107,7 @@ case 238: ; break;} case 239: -#line 1824 "asn1p_y.y" +#line 1826 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3107,7 +3118,7 @@ case 239: ; break;} case 240: -#line 1832 "asn1p_y.y" +#line 1834 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3118,7 +3129,7 @@ case 240: ; break;} case 241: -#line 1840 "asn1p_y.y" +#line 1842 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3128,7 +3139,7 @@ case 241: ; break;} case 242: -#line 1847 "asn1p_y.y" +#line 1849 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3139,71 +3150,71 @@ case 242: ; break;} case 243: -#line 1858 "asn1p_y.y" +#line 1860 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} case 244: -#line 1862 "asn1p_y.y" +#line 1864 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} case 245: -#line 1893 "asn1p_y.y" +#line 1895 "asn1p_y.y" { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; break;} case 246: -#line 1894 "asn1p_y.y" +#line 1896 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; ; break;} case 247: -#line 1898 "asn1p_y.y" +#line 1900 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; yyval.a_tag.tag_mode = TM_DEFAULT; ; break;} case 248: -#line 1902 "asn1p_y.y" +#line 1904 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_IMPLICIT; ; break;} case 249: -#line 1906 "asn1p_y.y" +#line 1908 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_EXPLICIT; ; break;} case 250: -#line 1913 "asn1p_y.y" +#line 1915 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} case 251: -#line 1917 "asn1p_y.y" +#line 1919 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} case 252: -#line 1925 "asn1p_y.y" +#line 1927 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} case 253: -#line 1932 "asn1p_y.y" +#line 1934 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; @@ -3431,7 +3442,7 @@ case 253: } return 1; } -#line 1938 "asn1p_y.y" +#line 1940 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index a15287049..bc1952221 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -1076,21 +1076,23 @@ TypeDeclaration: $$->expr_type = ASN_CONSTR_SET; $$->meta_type = AMT_TYPE; } - | TOK_SEQUENCE optConstraints TOK_OF TypeDeclaration { + | TOK_SEQUENCE optConstraints TOK_OF optTag TypeDeclaration { $$ = asn1p_expr_new(yylineno); checkmem($$); $$->constraints = $2; $$->expr_type = ASN_CONSTR_SEQUENCE_OF; $$->meta_type = AMT_TYPE; - asn1p_expr_add($$, $4); + $5->tag = $4; + asn1p_expr_add($$, $5); } - | TOK_SET optConstraints TOK_OF TypeDeclaration { + | TOK_SET optConstraints TOK_OF optTag TypeDeclaration { $$ = asn1p_expr_new(yylineno); checkmem($$); $$->constraints = $2; $$->expr_type = ASN_CONSTR_SET_OF; $$->meta_type = AMT_TYPE; - asn1p_expr_add($$, $4); + $5->tag = $4; + asn1p_expr_add($$, $5); } | TOK_ANY { $$ = asn1p_expr_new(yylineno); From 00db042fad28e03539db21c543a5e9e4ec52a866 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 14 Sep 2004 02:46:01 +0000 Subject: [PATCH 0317/1469] Tagged types inside SET OF/SEQUENCE OF test git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@317 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/32-sequence-of-OK.asn1 | 2 +- tests/32-sequence-of-OK.asn1.-EF | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 tests/32-sequence-of-OK.asn1.-EF diff --git a/tests/32-sequence-of-OK.asn1 b/tests/32-sequence-of-OK.asn1 index cd16118c8..2b82127f1 100644 --- a/tests/32-sequence-of-OK.asn1 +++ b/tests/32-sequence-of-OK.asn1 @@ -11,7 +11,7 @@ ModuleTestSequenceSimple DEFINITIONS IMPLICIT TAGS ::= BEGIN - Programming ::= SEQUENCE SIZE(1..maxSize) OF Fault + Programming ::= SEQUENCE SIZE(1..maxSize) OF [0] IMPLICIT Fault Fault ::= SET OF Error diff --git a/tests/32-sequence-of-OK.asn1.-EF b/tests/32-sequence-of-OK.asn1.-EF new file mode 100644 index 000000000..543c2ab91 --- /dev/null +++ b/tests/32-sequence-of-OK.asn1.-EF @@ -0,0 +1,18 @@ + +ModuleTestSequenceSimple {iso org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 32 } +DEFINITIONS IMPLICIT TAGS ::= +BEGIN + +Programming ::= SEQUENCE SIZE(1..10) OF [0] IMPLICIT Fault + +Fault ::= SET OF Error + +Error ::= SEQUENCE { + ... +} + +maxSize INTEGER ::= 10 + +END From b807ac4eb2aad41e8472ffec29aa18f43f973f3d Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 14 Sep 2004 02:46:22 +0000 Subject: [PATCH 0318/1469] tagging-related changes git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@318 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ChangeLog b/ChangeLog index fc7abe1d4..3867e960f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -8,6 +8,8 @@ the "Spouse" case in A.3. (Severity: medium, Security impact: low) * Added converters between any generic type and the ANY type. + * Parser fixed: Information Object Class fields may be taged. + * Parser fixed: tagged types inside SEQUENCE OF/SET OF support. 0.9.4: 2004-Sep-10 From 785435b6271268880c2f537843d76f5691376d8e Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 14 Sep 2004 12:46:35 +0000 Subject: [PATCH 0319/1469] REAL type support, including -fnative-types git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@319 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/NativeReal.c | 191 ++++++++++++++++++ skeletons/NativeReal.h | 23 +++ skeletons/REAL.c | 377 +++++++++++++++++++++++++++++++++++ skeletons/REAL.h | 32 +++ skeletons/file-dependencies | 2 + skeletons/tests/Makefile.am | 3 +- skeletons/tests/Makefile.in | 19 +- skeletons/tests/check-REAL.c | 139 +++++++++++++ 8 files changed, 781 insertions(+), 5 deletions(-) create mode 100644 skeletons/NativeReal.c create mode 100644 skeletons/NativeReal.h create mode 100644 skeletons/REAL.c create mode 100644 skeletons/REAL.h create mode 100644 skeletons/tests/check-REAL.c diff --git a/skeletons/NativeReal.c b/skeletons/NativeReal.c new file mode 100644 index 000000000..e7cc28f9a --- /dev/null +++ b/skeletons/NativeReal.c @@ -0,0 +1,191 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * Please read the NativeReal.h for the explanation wrt. differences between + * REAL and NativeReal. + * Basically, both are decoders and encoders of ASN.1 REAL type, but this + * implementation deals with the standard (machine-specific) representation + * of them instead of using the platform-independent buffer. + */ +#include +#include +#include +#include + +/* + * NativeReal basic type description. + */ +static ber_tlv_tag_t asn1_DEF_NativeReal_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_NativeReal = { + "REAL", /* The ASN.1 type is still REAL */ + asn_generic_no_constraint, + NativeReal_decode_ber, + NativeReal_encode_der, + NativeReal_print, + NativeReal_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_NativeReal_tags, + sizeof(asn1_DEF_NativeReal_tags) / sizeof(asn1_DEF_NativeReal_tags[0]), + asn1_DEF_NativeReal_tags, /* Same as above */ + sizeof(asn1_DEF_NativeReal_tags) / sizeof(asn1_DEF_NativeReal_tags[0]), + 0, /* Always in primitive form */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + +/* + * Decode REAL type. + */ +ber_dec_rval_t +NativeReal_decode_ber(asn1_TYPE_descriptor_t *td, + void **dbl_ptr, void *buf_ptr, size_t size, int tag_mode) { + double *Dbl = (double *)*dbl_ptr; + ber_dec_rval_t rval; + ber_dec_ctx_t ctx = { 0, 0, 0, 0 }; + ber_tlv_len_t length; + + /* + * If the structure is not there, allocate it. + */ + if(Dbl == NULL) { + (void *)Dbl = *dbl_ptr = CALLOC(1, sizeof(*Dbl)); + if(Dbl == NULL) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + } + + ASN_DEBUG("Decoding %s as REAL (tm=%d)", + td->name, tag_mode); + + /* + * Check tags. + */ + rval = ber_check_tags(td, &ctx, + buf_ptr, size, tag_mode, &length, 0); + if(rval.code != RC_OK) + return rval; + + ASN_DEBUG("%s length is %d bytes", td->name, (int)length); + + /* + * Make sure we have this length. + */ + buf_ptr = ((char *)buf_ptr) + rval.consumed; + size -= rval.consumed; + if(length > (ber_tlv_len_t)size) { + rval.code = RC_WMORE; + rval.consumed = 0; + return rval; + } + + /* + * ASN.1 encoded REAL: buf_ptr, length + * Fill the Dbl, at the same time checking for overflow. + * If overflow occured, return with RC_FAIL. + */ + { + REAL_t tmp; + double d; + tmp.buf = (uint8_t *)buf_ptr; + tmp.size = length; + + if(asn1_REAL2double(&tmp, &d)) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + + *Dbl = d; + } + + rval.code = RC_OK; + rval.consumed += length; + + ASN_DEBUG("Took %ld/%ld bytes to encode %s (%d)", + (long)rval.consumed, (long)length, td->name, *Dbl); + + return rval; +} + +/* + * Encode the NativeReal using the standard REAL type DER encoder. + */ +der_enc_rval_t +NativeReal_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + double Dbl = *(const double *)ptr; + der_enc_rval_t erval; + REAL_t tmp; + + if(asn1_double2REAL(&tmp, Dbl)) { + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = ptr; + return erval; + } + + /* Encode fake REAL */ + erval = INTEGER_encode_der(td, &tmp, tag_mode, tag, cb, app_key); + if(erval.encoded == -1) { + assert(erval.structure_ptr == &tmp); + erval.structure_ptr = ptr; + } + return erval; +} + +/* + * REAL specific human-readable output. + */ +int +NativeReal_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const double *Dbl = (const double *)sptr; + char scratch[64]; + int ret; + + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + + if(Dbl) { + char *p = scratch; + int buf_size = sizeof(scratch); + for(;;) { + ret = snprintf(p, buf_size, "%f", *Dbl); + if(ret >= 0 && ret < buf_size) { + ret = cb(p, ret, app_key); + if(p != scratch) free(p); + return ret; + } else { + if(p != scratch) free(p); + } + if(ret < 0) buf_size <<= 2; /* Old libc. */ + else buf_size = ret + 1; + (void *)p = MALLOC(ret); + if(!p) return -1; + } + } else { + return cb("", 8, app_key); + } +} + +void +NativeReal_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { + + if(!td || !ptr) + return; + + ASN_DEBUG("Freeing %s as REAL (%d, %p, Native)", + td->name, contents_only, ptr); + + if(!contents_only) { + FREEMEM(ptr); + } +} + diff --git a/skeletons/NativeReal.h b/skeletons/NativeReal.h new file mode 100644 index 000000000..1a5436dff --- /dev/null +++ b/skeletons/NativeReal.h @@ -0,0 +1,23 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * This type differs from the standard REAL in that it is modelled using + * the fixed machine type (double), so it can hold only values of + * limited precision. There is no explicit type (i.e., NativeReal_t). + * Use of this type is normally enabled by -fnative-integers. + */ +#ifndef ASN_TYPE_NativeReal_H +#define ASN_TYPE_NativeReal_H + +#include + +extern asn1_TYPE_descriptor_t asn1_DEF_NativeReal; + +ber_type_decoder_f NativeReal_decode_ber; +der_type_encoder_f NativeReal_encode_der; +asn_struct_print_f NativeReal_print; +asn_struct_free_f NativeReal_free; + +#endif /* ASN_TYPE_NativeReal_H */ diff --git a/skeletons/REAL.c b/skeletons/REAL.c new file mode 100644 index 000000000..79b517361 --- /dev/null +++ b/skeletons/REAL.c @@ -0,0 +1,377 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include /* for strtod(3) */ +#include +#include +#include + +#undef INT_MAX +#define INT_MAX ((int)(((unsigned int)-1) >> 1)) + +/* + * REAL basic type description. + */ +static ber_tlv_tag_t asn1_DEF_REAL_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_REAL = { + "REAL", + asn_generic_no_constraint, + INTEGER_decode_ber, /* Implemented in terms of INTEGER type */ + INTEGER_encode_der, + REAL_print, + INTEGER_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_REAL_tags, + sizeof(asn1_DEF_REAL_tags) / sizeof(asn1_DEF_REAL_tags[0]), + asn1_DEF_REAL_tags, /* Same as above */ + sizeof(asn1_DEF_REAL_tags) / sizeof(asn1_DEF_REAL_tags[0]), + 0, /* Always in primitive form */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + +int +REAL_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const REAL_t *st = (const REAL_t *)sptr; + char buf[128]; + double d; + int ret; + + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + + if(!st) + return cb("", 8, app_key); + + if(asn1_REAL2double(st, &d)) + return cb("", 7, app_key); + + ret = snprintf(buf, sizeof(buf), "%f", d); + if(ret < 0 || ret >= sizeof(buf)) + return cb("", 7, app_key); + + return cb(buf, ret, app_key); +} + +int +asn1_REAL2double(const REAL_t *st, double *dbl_value) { + unsigned long octv; + + if(!st || !st->buf) { + errno = EINVAL; + return -1; + } + + if(st->size == 0) { + *dbl_value = 0; + return 0; + } + + octv = st->buf[0]; /* unsigned byte */ + + switch(octv & 0xC0) { + case 0x40: /* X.690: 8.5.8 */ + /* "SpecialRealValue" */ + + /* Be liberal in what you accept... + if(st->size != 1) ... + */ + + switch(st->buf[0]) { + case 0x40: /* 01000000: PLUS-INFINITY */ + *dbl_value = INFINITY; + return 0; + case 0x41: /* 01000001: MINUS-INFINITY */ + *dbl_value = -INFINITY; + return 0; + /* + * The following cases are defined by + * X.690 Amendment 1 (10/03) + */ + case 0x42: /* 01000010: NOT-A-NUMBER */ + *dbl_value = NAN; + return 0; + case 0x43: /* 01000011: minus zero */ + *dbl_value = NAN; + return 0; + } + + errno = EINVAL; + return -1; + case 0x00: { /* X.690: 8.5.6 */ + /* + * Decimal. NR{1,2,3} format. + */ + double d; + + assert(st->buf[st->size - 1] == 0); /* Security, vashu mat' */ + + d = strtod((char *)st->buf, 0); + if(finite(d)) { + *dbl_value = d; + return 0; + } else { + errno = ERANGE; + return 0; + } + } + } + + /* + * Binary representation. + */ + { + double m; + int expval; /* exponent value */ + unsigned int elen; /* exponent value length, in octets */ + unsigned int scaleF; + unsigned int baseF; + uint8_t *ptr; + uint8_t *end; + int sign; + + switch((octv & 0x30) >> 4) { + case 0x00: baseF = 1; break; /* base 2 */ + case 0x01: baseF = 3; break; /* base 8 */ + case 0x02: baseF = 4; break; /* base 16 */ + default: + /* Reserved field, can't parse now. */ + errno = EINVAL; + return -1; + } + + sign = (octv & 0x40); /* bit 7 */ + scaleF = (octv & 0x0C) >> 2; /* bits 4 to 3 */ + + if(st->size <= (1 + (octv & 0x03))) { + errno = EINVAL; + return -1; + } + + if((octv & 0x03) == 0x11) { + /* 8.5.6.4, case d) */ + elen = st->buf[1]; /* unsigned binary number */ + if(elen == 0 || st->size <= (2 + elen)) { + errno = EINVAL; + return -1; + } + ptr = &st->buf[2]; + } else { + elen = (octv & 0x03); + ptr = &st->buf[1]; + } + + /* Fetch the multibyte exponent */ + expval = (int)(*(int8_t *)ptr); + end = ptr + elen + 1; + for(ptr++; ptr < end; ptr++) + expval = (expval * 256) + *ptr; + + m = 0.0; /* Initial mantissa value */ + + /* Okay, the exponent is here. Now, what about mantissa? */ + end = st->buf + st->size; + if(ptr < end) { + for(; ptr < end; ptr++) + m = scalbn(m, 8) + *ptr; + } + + ASN_DEBUG("m=%.10f, scF=%d, bF=%d, expval=%d, ldexp()=%f, scalbn()=%f", + m, scaleF, baseF, expval, + ldexp(m, expval * baseF + scaleF), + scalbn(m, scaleF) * pow(pow(2, baseF), expval) + ); + + /* + * (S * N * 2^F) * B^E + * Essentially: + m = scalbn(m, scaleF) * pow(pow(2, base), expval); + */ + m = ldexp(m, expval * baseF + scaleF); + if(finite(m)) { + *dbl_value = sign ? -m : m; + } else { + errno = ERANGE; + return -1; + } + + } /* if(binary_format) */ + + return 0; +} + +/* + * Assume IEEE 754 floating point: standard 64 bit double. + * [1 bit sign] [11 bits exponent] [52 bits mantissa] + */ +int +asn1_double2REAL(REAL_t *st, double dbl_value) { +#ifdef WORDS_BIGENDIAN /* Known to be big-endian */ + int littleEndian = 0; +#else /* need to test: have no explicit information */ + unsigned int LE = 1; + int littleEndian = *(unsigned char *)&LE; +#endif + uint8_t buf[16]; /* More than enough for 8-byte dbl_value */ + uint8_t dscr[sizeof(dbl_value)]; /* double value scratch pad */ + /* Assertion guards: won't even compile, if unexpected double size */ + char assertion_buffer1[9 - sizeof(dbl_value)] __attribute__((unused)); + char assertion_buffer2[sizeof(dbl_value) - 7] __attribute__((unused)); + uint8_t *ptr = buf; + uint8_t *mstop; /* Last byte of mantissa */ + unsigned int mval; /* Value of the last byte of mantissa */ + unsigned int bmsign; /* binary mask with sign */ + unsigned int buflen; + unsigned int accum; + int expval; + + if(!st) { + errno = EINVAL; + return -1; + } + + expval = ilogb(dbl_value); + + if(expval == -INT_MAX /* Also catches (dbl_value == 0) */ + || expval == INT_MAX /* catches finite() which catches isnan() */ + ) { + if(!st->buf || st->size < 2) { + (void *)ptr = MALLOC(2); + if(!ptr) return -1; + st->buf = ptr; + } + /* fpclassify(3) is not portable yet */ + if(expval == -INT_MAX) { + if(signbit(dbl_value)) { + st->buf[0] = 0x80 | 0x40; + st->buf[1] = 0; + st->size = 2; + } else { + st->buf[0] = 0; /* JIC */ + st->size = 0; + } + } else if(isinf(dbl_value)) { + if(signbit(dbl_value)) { + st->buf[0] = 0x41; /* MINUS-INFINITY */ + } else { + st->buf[0] = 0x40; /* PLUS-INFINITY */ + } + st->buf[1] = 0; + st->size = 1; + } else { + st->buf[0] = 0x42; /* NaN */ + st->buf[1] = 0; + st->size = 1; + } + return 0; + } + + if(littleEndian) { + uint8_t *s = ((uint8_t *)&dbl_value) + sizeof(dbl_value) - 2; + uint8_t *d; + + bmsign = 0x80 | ((s[1] >> 1) & 0x40); /* binary mask & - */ + for(mstop = d = dscr; s >= (uint8_t *)&dbl_value; d++, s--) { + *d = *s; + if(*d) mstop = d; + } + } else { + uint8_t *s = ((uint8_t *)&dbl_value) + 1; + uint8_t *end = ((uint8_t *)&dbl_value) + sizeof(double); + uint8_t *d; + + bmsign = 0x80 | ((s[-1] >> 1) & 0x40); /* binary mask & - */ + for(mstop = d = dscr; s < end; d++, s++) { + *d = *s; + if(*d) mstop = d; + } + } + + /* Remove parts of the exponent, leave mantissa and explicit 1. */ + dscr[0] = 0x10 | (dscr[0] & 0x0f); + + /* Adjust exponent in a very unobvious way */ + expval -= 8 * ((mstop - dscr) + 1) - 4; + + /* This loop ensures DER conformance by forcing mantissa odd: 11.3.1 */ + mval = *mstop; + if(mval && !(mval & 1)) { + unsigned int shift_count = 1; + unsigned int ishift; + uint8_t *mptr; + + /* + * Figure out what needs to be done to make mantissa odd. + */ + if(!(mval & 0x0f)) /* Speed-up a little */ + shift_count = 4; + while(((mval >> shift_count) & 1) == 0) + shift_count++; + + ishift = 8 - shift_count; + accum = 0; + + /* Go over the buffer, shifting it shift_count bits right. */ + for(mptr = dscr; mptr <= mstop; mptr++) { + mval = *mptr; + *mptr = accum | (mval >> shift_count); + accum = mval << ishift; + } + + /* Adjust mantissa appropriately. */ + expval += shift_count; + } + + if(expval < 0) { + if((expval >> 7) == -1) { + *ptr++ = bmsign | 0x00; + *ptr++ = expval; + } else if((expval >> 15) == -1) { + *ptr++ = bmsign | 0x01; + *ptr++ = expval >> 8; + *ptr++ = expval; + } else { + assert((expval >> 23) == -1); + *ptr++ = bmsign | 0x02; + *ptr++ = expval >> 16; + *ptr++ = expval >> 8; + *ptr++ = expval; + } + } else if(expval <= 0x7f) { + *ptr++ = bmsign | 0x00; + *ptr++ = expval; + } else if(expval <= 0x7fff) { + *ptr++ = bmsign | 0x01; + *ptr++ = expval >> 8; + *ptr++ = expval; + } else { + assert(expval <= 0x7fffff); + *ptr++ = bmsign | 0x02; + *ptr++ = expval >> 16; + *ptr++ = expval >> 8; + *ptr++ = expval; + } + + buflen = (mstop - dscr) + 1; + memcpy(ptr, dscr, buflen); + ptr += buflen; + buflen = ptr - buf; + + (void *)ptr = MALLOC(buflen + 1); + if(!ptr) return -1; + + memcpy(ptr, buf, buflen); + buf[buflen] = 0; /* JIC */ + + if(st->buf) FREEMEM(st->buf); + st->buf = ptr; + st->size = buflen; + + return 0; +} diff --git a/skeletons/REAL.h b/skeletons/REAL.h new file mode 100644 index 000000000..751000b8f --- /dev/null +++ b/skeletons/REAL.h @@ -0,0 +1,32 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_TYPE_REAL_H +#define ASN_TYPE_REAL_H + +#include + +typedef struct REAL { + uint8_t *buf; /* Buffer with REAL type encoding */ + int size; /* Size of the buffer */ +} REAL_t; + +extern asn1_TYPE_descriptor_t asn1_DEF_REAL; + +asn_struct_print_f REAL_print; + +/*********************************** + * Some handy conversion routines. * + ***********************************/ + +/* + * Convert between native double type and REAL representation (DER). + * RETURN VALUES: + * 0: Value converted successfully + * -1: An error occured while converting the value: invalid format. + */ +int asn1_REAL2double(const REAL_t *real_ptr, double *d); +int asn1_double2REAL(REAL_t *real_ptr, double d); + +#endif /* ASN_TYPE_REAL_H */ diff --git a/skeletons/file-dependencies b/skeletons/file-dependencies index 128bda230..f40184452 100644 --- a/skeletons/file-dependencies +++ b/skeletons/file-dependencies @@ -20,10 +20,12 @@ ISO646String.h ISO646String.c NULL.h NULL.c BOOLEAN.h NativeEnumerated.h NativeEnumerated.c NativeInteger.h NativeInteger.h NativeInteger.c INTEGER.h +NativeReal.h NativeReal.c REAL.h NumericString.h NumericString.c OBJECT_IDENTIFIER.h OBJECT_IDENTIFIER.c INTEGER.h ObjectDescriptor.h ObjectDescriptor.c GraphicString.h PrintableString.h PrintableString.c +REAL.h REAL.c INTEGER.h RELATIVE-OID.h RELATIVE-OID.c OBJECT-IDENTIFIER.h T61String.h T61String.c TeletexString.h TeletexString.c diff --git a/skeletons/tests/Makefile.am b/skeletons/tests/Makefile.am index 0c93ef9e5..7af584300 100644 --- a/skeletons/tests/Makefile.am +++ b/skeletons/tests/Makefile.am @@ -6,6 +6,7 @@ check_PROGRAMS = \ check-OIDs \ check-GeneralizedTime \ check-UTCTime \ - check-INTEGER + check-INTEGER \ + check-REAL TESTS = $(check_PROGRAMS) diff --git a/skeletons/tests/Makefile.in b/skeletons/tests/Makefile.in index 2f84112c2..ea0acc0d6 100644 --- a/skeletons/tests/Makefile.in +++ b/skeletons/tests/Makefile.in @@ -13,7 +13,7 @@ # PARTICULAR PURPOSE. @SET_MAKE@ -SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c check-UTCTime.c check-ber_tlv_tag.c check-length.c +SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c check-REAL.c check-UTCTime.c check-ber_tlv_tag.c check-length.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ @@ -38,7 +38,8 @@ POST_UNINSTALL = : host_triplet = @host@ check_PROGRAMS = check-ber_tlv_tag$(EXEEXT) check-length$(EXEEXT) \ check-OIDs$(EXEEXT) check-GeneralizedTime$(EXEEXT) \ - check-UTCTime$(EXEEXT) check-INTEGER$(EXEEXT) + check-UTCTime$(EXEEXT) check-INTEGER$(EXEEXT) \ + check-REAL$(EXEEXT) subdir = skeletons/tests DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -57,6 +58,9 @@ check_INTEGER_LDADD = $(LDADD) check_OIDs_SOURCES = check-OIDs.c check_OIDs_OBJECTS = check-OIDs.$(OBJEXT) check_OIDs_LDADD = $(LDADD) +check_REAL_SOURCES = check-REAL.c +check_REAL_OBJECTS = check-REAL.$(OBJEXT) +check_REAL_LDADD = $(LDADD) check_UTCTime_SOURCES = check-UTCTime.c check_UTCTime_OBJECTS = check-UTCTime.$(OBJEXT) check_UTCTime_LDADD = $(LDADD) @@ -72,6 +76,7 @@ am__depfiles_maybe = depfiles @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/check-GeneralizedTime.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-INTEGER.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-OIDs.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/check-REAL.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-UTCTime.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-ber_tlv_tag.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-length.Po @@ -84,9 +89,11 @@ CCLD = $(CC) LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c \ - check-UTCTime.c check-ber_tlv_tag.c check-length.c + check-REAL.c check-UTCTime.c check-ber_tlv_tag.c \ + check-length.c DIST_SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c \ - check-UTCTime.c check-ber_tlv_tag.c check-length.c + check-REAL.c check-UTCTime.c check-ber_tlv_tag.c \ + check-length.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -251,6 +258,9 @@ check-INTEGER$(EXEEXT): $(check_INTEGER_OBJECTS) $(check_INTEGER_DEPENDENCIES) check-OIDs$(EXEEXT): $(check_OIDs_OBJECTS) $(check_OIDs_DEPENDENCIES) @rm -f check-OIDs$(EXEEXT) $(LINK) $(check_OIDs_LDFLAGS) $(check_OIDs_OBJECTS) $(check_OIDs_LDADD) $(LIBS) +check-REAL$(EXEEXT): $(check_REAL_OBJECTS) $(check_REAL_DEPENDENCIES) + @rm -f check-REAL$(EXEEXT) + $(LINK) $(check_REAL_LDFLAGS) $(check_REAL_OBJECTS) $(check_REAL_LDADD) $(LIBS) check-UTCTime$(EXEEXT): $(check_UTCTime_OBJECTS) $(check_UTCTime_DEPENDENCIES) @rm -f check-UTCTime$(EXEEXT) $(LINK) $(check_UTCTime_LDFLAGS) $(check_UTCTime_OBJECTS) $(check_UTCTime_LDADD) $(LIBS) @@ -270,6 +280,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-GeneralizedTime.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-INTEGER.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-OIDs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-REAL.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-UTCTime.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-ber_tlv_tag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-length.Po@am__quote@ diff --git a/skeletons/tests/check-REAL.c b/skeletons/tests/check-REAL.c new file mode 100644 index 000000000..12310e3fa --- /dev/null +++ b/skeletons/tests/check-REAL.c @@ -0,0 +1,139 @@ +#define EMIT_ASN_DEBUG 1 +#include +#include +#include +#include +#include +#include +#include + +static void +check(REAL_t *rn, double orig_dbl) { + double val; + uint8_t *p, *end; + int ret; + + printf("double value %.12f [", orig_dbl); + for(p = (uint8_t *)&orig_dbl, end = p + sizeof(double); p < end ; p++) + printf("%02x", *p); + printf("] (ilogb %d)\n", ilogb(orig_dbl)); + + val = frexp(orig_dbl, &ret); + printf("frexp(%f, %d): [", val, ret); + for(p = (uint8_t *)&val, end = p + sizeof(double); p < end ; p++) + printf("%02x", *p); + printf("]\n"); + + ret = asn1_double2REAL(rn, orig_dbl); + assert(ret == 0); + + printf("converted into ["); + for(p = rn->buf, end = p + rn->size; p < end; p++) + printf("%02x", *p); + printf("]\n"); + + ret = asn1_REAL2double(rn, &val); + assert(ret == 0); + + printf("and back to double: ["); + for(p = (uint8_t *)&val, end = p + sizeof(double); p < end ; p++) + printf("%02x", *p); + printf("] (ilogb %d)\n", ilogb(val)); + + printf("%.12f vs %.12f\n", orig_dbl, val); + + assert(orig_dbl == val); + printf("OK\n"); +} + +uint8_t buf_1_0[] = { 0x80, 0xcc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +uint8_t buf_1_1[] = { 0x80, 0xcc, 0x11, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9a }; +uint8_t buf_3_14[] = { 0x80, 0xcd, 0x19, 0x1e, 0xb8, 0x51, 0xeb, 0x85, 0x1f }; +/* These ones are very interesting! It checks mantissa overflow! */ +uint8_t buf_mo1[] = { 0x80, 0xc5, 0x19, 0x1e, 0xb8, 0x51, 0xeb, 0x85, 0x1f,3}; +uint8_t buf_mo2[] = { 0x80, 0xbd, 0x19, 0x1e, 0xb8, 0x51, 0xeb, 0x85, 0x1f,3,2}; + +static void +check_buf(uint8_t *buf, size_t bufsize, double verify) { + REAL_t rn; + double val; + uint8_t *p, *end; + int ret; + + printf("verify double value %.12f [", verify); + for(p = (uint8_t *)&verify, end = p + sizeof(double); p < end ; p++) + printf("%02x", *p); + printf("] (ilogb %d)\n", ilogb(verify)); + + rn.buf = 0; + rn.size = 0; + + ret = asn1_double2REAL(&rn, verify); + assert(ret == 0); + + printf("canonical DER: ["); + for(p = rn.buf, end = p + rn.size; p < end; p++) + printf("%02x", *p); + printf("]\n"); + + rn.buf = buf; + rn.size = bufsize; + + printf("received as: ["); + for(p = rn.buf, end = p + rn.size; p < end; p++) + printf("%02x", *p); + printf("]\n"); + + ret = asn1_REAL2double(&rn, &val); + assert(ret == 0); + + printf("%.12f vs %.12f\n", verify, val); + + assert(val == verify); +} + +int +main() { + REAL_t rn; + + memset(&rn, 0, sizeof(rn)); + + check(&rn, 0.0); + check(&rn, 1.0); + check(&rn, -1.0); + check(&rn, 1.5); + check(&rn, 0.1); + check(&rn, 0.33333); + check(&rn, 2); + check(&rn, 2.1); + check(&rn, 3); + check(&rn, 3.1); + check(&rn, 3.14); + check(&rn, 3.1415); + check(&rn, 3.141592); + check(&rn, 3.14159265); + check(&rn, -3.14159265); + check(&rn, 14159265.0); + check(&rn, -123456789123456789.0); + check(&rn, 0.00000000001); + check(&rn, 0.00000000002); + check(&rn, 0.00000000009); + check(&rn, 0.0000000000000000000001); + check(&rn, 0.000000000000000000000000000001); /* proved 2B a problem */ + check(&rn,-0.000000000000000000000000000001); /* proved 2B a problem */ + check(&rn, 0.0000000000010000000001000000000001); + check(&rn, 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001); + check(&rn, 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001); + check(&rn,-0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001); + check(&rn,-3.33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333); + check(&rn, 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333); + check(&rn, -0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001); + + check_buf(buf_1_0, sizeof(buf_1_0), 1.0); + check_buf(buf_1_1, sizeof(buf_1_1), 1.1); + check_buf(buf_3_14, sizeof(buf_3_14), 3.14); + check_buf(buf_mo1, sizeof(buf_mo1), 3.14); + check_buf(buf_mo2, sizeof(buf_mo2), 3.14); + + return 0; +} From de592d795156210847b12fc666a6d45957cae5c1 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 14 Sep 2004 12:46:58 +0000 Subject: [PATCH 0320/1469] test for REAL support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@320 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/65-multi-tag-OK.asn1 | 2 +- tests/65-multi-tag-OK.asn1.-P | 36 +- tests/65-multi-tag-OK.asn1.-Pfnative-types | 824 +++++++++++++++++++++ 3 files changed, 843 insertions(+), 19 deletions(-) create mode 100644 tests/65-multi-tag-OK.asn1.-Pfnative-types diff --git a/tests/65-multi-tag-OK.asn1 b/tests/65-multi-tag-OK.asn1 index 32e85cc30..a6f85bb29 100644 --- a/tests/65-multi-tag-OK.asn1 +++ b/tests/65-multi-tag-OK.asn1 @@ -16,7 +16,7 @@ BEGIN T3 ::= [4] IMPLICIT T4 T4 ::= [5] EXPLICIT T5 T5 ::= [6] IMPLICIT T6 - T6 ::= INTEGER + T6 ::= REAL T ::= [0] IMPLICIT Ts diff --git a/tests/65-multi-tag-OK.asn1.-P b/tests/65-multi-tag-OK.asn1.-P index 01681c2a4..51d2b0880 100644 --- a/tests/65-multi-tag-OK.asn1.-P +++ b/tests/65-multi-tag-OK.asn1.-P @@ -89,7 +89,7 @@ static ber_tlv_tag_t asn1_DEF_T1_all_tags[] = { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), - (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_T1 = { "T1", @@ -199,7 +199,7 @@ static ber_tlv_tag_t asn1_DEF_T2_all_tags[] = { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), - (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_T2 = { "T2", @@ -307,7 +307,7 @@ static ber_tlv_tag_t asn1_DEF_T3_all_tags[] = { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), - (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_T3 = { "T3", @@ -410,7 +410,7 @@ T4_free(asn1_TYPE_descriptor_t *td, static ber_tlv_tag_t asn1_DEF_T4_tags[] = { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), - (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_T4 = { "T4", @@ -512,7 +512,7 @@ T5_free(asn1_TYPE_descriptor_t *td, static ber_tlv_tag_t asn1_DEF_T5_tags[] = { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), - (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_T5 = { "T5", @@ -536,12 +536,12 @@ asn1_TYPE_descriptor_t asn1_DEF_T5 = { /*** <<< INCLUDES [T6] >>> ***/ -#include +#include /*** <<< TYPE-DECLS [T6] >>> ***/ -typedef INTEGER_t T6_t; +typedef REAL_t T6_t; /*** <<< FUNC-DECLS [T6] >>> ***/ @@ -559,25 +559,25 @@ T6_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { /* Make the underlying type checker permanent */ - td->check_constraints = asn1_DEF_INTEGER.check_constraints; + td->check_constraints = asn1_DEF_REAL.check_constraints; return td->check_constraints (td, sptr, app_errlog, app_key); } /* - * This type is implemented using INTEGER, + * This type is implemented using REAL, * so adjust the DEF appropriately. */ static void T6_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_INTEGER.ber_decoder; - td->der_encoder = asn1_DEF_INTEGER.der_encoder; - td->free_struct = asn1_DEF_INTEGER.free_struct; - td->print_struct = asn1_DEF_INTEGER.print_struct; - td->last_tag_form = asn1_DEF_INTEGER.last_tag_form; - td->elements = asn1_DEF_INTEGER.elements; - td->elements_count = asn1_DEF_INTEGER.elements_count; - td->specifics = asn1_DEF_INTEGER.specifics; + td->ber_decoder = asn1_DEF_REAL.ber_decoder; + td->der_encoder = asn1_DEF_REAL.der_encoder; + td->free_struct = asn1_DEF_REAL.free_struct; + td->print_struct = asn1_DEF_REAL.print_struct; + td->last_tag_form = asn1_DEF_REAL.last_tag_form; + td->elements = asn1_DEF_REAL.elements; + td->elements_count = asn1_DEF_REAL.elements_count; + td->specifics = asn1_DEF_REAL.specifics; } ber_dec_rval_t @@ -613,7 +613,7 @@ T6_free(asn1_TYPE_descriptor_t *td, /*** <<< STAT-DEFS [T6] >>> ***/ static ber_tlv_tag_t asn1_DEF_T6_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; asn1_TYPE_descriptor_t asn1_DEF_T6 = { "T6", diff --git a/tests/65-multi-tag-OK.asn1.-Pfnative-types b/tests/65-multi-tag-OK.asn1.-Pfnative-types new file mode 100644 index 000000000..88535bdee --- /dev/null +++ b/tests/65-multi-tag-OK.asn1.-Pfnative-types @@ -0,0 +1,824 @@ + +/*** <<< INCLUDES [T1] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [T1] >>> ***/ + + +typedef T2_t T1_t; + +/*** <<< FUNC-DECLS [T1] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_T1; +asn_constr_check_f T1_constraint; +ber_type_decoder_f T1_decode_ber; +der_type_encoder_f T1_encode_der; +asn_struct_print_f T1_print; +asn_struct_free_f T1_free; + +/*** <<< CODE [T1] >>> ***/ + +int +T1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_T2.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using T2, + * so adjust the DEF appropriately. + */ +static void +T1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_T2.ber_decoder; + td->der_encoder = asn1_DEF_T2.der_encoder; + td->free_struct = asn1_DEF_T2.free_struct; + td->print_struct = asn1_DEF_T2.print_struct; + td->last_tag_form = asn1_DEF_T2.last_tag_form; + td->elements = asn1_DEF_T2.elements; + td->elements_count = asn1_DEF_T2.elements_count; + td->specifics = asn1_DEF_T2.specifics; +} + +ber_dec_rval_t +T1_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + T1_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); +} + +der_enc_rval_t +T1_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + T1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +T1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +T1_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [T1] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_T1_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + (ASN_TAG_CLASS_CONTEXT | (6 << 2)) +}; +static ber_tlv_tag_t asn1_DEF_T1_all_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + (ASN_TAG_CLASS_CONTEXT | (5 << 2)), + (ASN_TAG_CLASS_CONTEXT | (6 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_T1 = { + "T1", + T1_constraint, + T1_decode_ber, + T1_encode_der, + T1_print, + T1_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T1_tags, + sizeof(asn1_DEF_T1_tags) + /sizeof(asn1_DEF_T1_tags[0]), /* 4 */ + asn1_DEF_T1_all_tags, + sizeof(asn1_DEF_T1_all_tags) + /sizeof(asn1_DEF_T1_all_tags[0]), /* 6 */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [T2] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [T2] >>> ***/ + + +typedef T3_t T2_t; + +/*** <<< FUNC-DECLS [T2] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_T2; +asn_constr_check_f T2_constraint; +ber_type_decoder_f T2_decode_ber; +der_type_encoder_f T2_encode_der; +asn_struct_print_f T2_print; +asn_struct_free_f T2_free; + +/*** <<< CODE [T2] >>> ***/ + +int +T2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_T3.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using T3, + * so adjust the DEF appropriately. + */ +static void +T2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_T3.ber_decoder; + td->der_encoder = asn1_DEF_T3.der_encoder; + td->free_struct = asn1_DEF_T3.free_struct; + td->print_struct = asn1_DEF_T3.print_struct; + td->last_tag_form = asn1_DEF_T3.last_tag_form; + td->elements = asn1_DEF_T3.elements; + td->elements_count = asn1_DEF_T3.elements_count; + td->specifics = asn1_DEF_T3.specifics; +} + +ber_dec_rval_t +T2_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + T2_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); +} + +der_enc_rval_t +T2_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + T2_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +T2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T2_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +T2_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T2_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [T2] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_T2_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + (ASN_TAG_CLASS_CONTEXT | (6 << 2)) +}; +static ber_tlv_tag_t asn1_DEF_T2_all_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + (ASN_TAG_CLASS_CONTEXT | (5 << 2)), + (ASN_TAG_CLASS_CONTEXT | (6 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_T2 = { + "T2", + T2_constraint, + T2_decode_ber, + T2_encode_der, + T2_print, + T2_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T2_tags, + sizeof(asn1_DEF_T2_tags) + /sizeof(asn1_DEF_T2_tags[0]), /* 3 */ + asn1_DEF_T2_all_tags, + sizeof(asn1_DEF_T2_all_tags) + /sizeof(asn1_DEF_T2_all_tags[0]), /* 5 */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [T3] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [T3] >>> ***/ + + +typedef T4_t T3_t; + +/*** <<< FUNC-DECLS [T3] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_T3; +asn_constr_check_f T3_constraint; +ber_type_decoder_f T3_decode_ber; +der_type_encoder_f T3_encode_der; +asn_struct_print_f T3_print; +asn_struct_free_f T3_free; + +/*** <<< CODE [T3] >>> ***/ + +int +T3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_T4.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using T4, + * so adjust the DEF appropriately. + */ +static void +T3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_T4.ber_decoder; + td->der_encoder = asn1_DEF_T4.der_encoder; + td->free_struct = asn1_DEF_T4.free_struct; + td->print_struct = asn1_DEF_T4.print_struct; + td->last_tag_form = asn1_DEF_T4.last_tag_form; + td->elements = asn1_DEF_T4.elements; + td->elements_count = asn1_DEF_T4.elements_count; + td->specifics = asn1_DEF_T4.specifics; +} + +ber_dec_rval_t +T3_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + T3_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); +} + +der_enc_rval_t +T3_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + T3_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +T3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T3_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +T3_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T3_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [T3] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_T3_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + (ASN_TAG_CLASS_CONTEXT | (6 << 2)) +}; +static ber_tlv_tag_t asn1_DEF_T3_all_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + (ASN_TAG_CLASS_CONTEXT | (5 << 2)), + (ASN_TAG_CLASS_CONTEXT | (6 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_T3 = { + "T3", + T3_constraint, + T3_decode_ber, + T3_encode_der, + T3_print, + T3_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T3_tags, + sizeof(asn1_DEF_T3_tags) + /sizeof(asn1_DEF_T3_tags[0]), /* 2 */ + asn1_DEF_T3_all_tags, + sizeof(asn1_DEF_T3_all_tags) + /sizeof(asn1_DEF_T3_all_tags[0]), /* 4 */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [T4] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [T4] >>> ***/ + + +typedef T5_t T4_t; + +/*** <<< FUNC-DECLS [T4] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_T4; +asn_constr_check_f T4_constraint; +ber_type_decoder_f T4_decode_ber; +der_type_encoder_f T4_encode_der; +asn_struct_print_f T4_print; +asn_struct_free_f T4_free; + +/*** <<< CODE [T4] >>> ***/ + +int +T4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_T5.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using T5, + * so adjust the DEF appropriately. + */ +static void +T4_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_T5.ber_decoder; + td->der_encoder = asn1_DEF_T5.der_encoder; + td->free_struct = asn1_DEF_T5.free_struct; + td->print_struct = asn1_DEF_T5.print_struct; + td->last_tag_form = asn1_DEF_T5.last_tag_form; + td->elements = asn1_DEF_T5.elements; + td->elements_count = asn1_DEF_T5.elements_count; + td->specifics = asn1_DEF_T5.specifics; +} + +ber_dec_rval_t +T4_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + T4_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); +} + +der_enc_rval_t +T4_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + T4_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +T4_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T4_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +T4_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T4_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [T4] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_T4_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (5 << 2)), + (ASN_TAG_CLASS_CONTEXT | (6 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_T4 = { + "T4", + T4_constraint, + T4_decode_ber, + T4_encode_der, + T4_print, + T4_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T4_tags, + sizeof(asn1_DEF_T4_tags) + /sizeof(asn1_DEF_T4_tags[0]) - 1, /* 2 */ + asn1_DEF_T4_tags, /* Same as above */ + sizeof(asn1_DEF_T4_tags) + /sizeof(asn1_DEF_T4_tags[0]), /* 3 */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [T5] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [T5] >>> ***/ + + +typedef T6_t T5_t; + +/*** <<< FUNC-DECLS [T5] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_T5; +asn_constr_check_f T5_constraint; +ber_type_decoder_f T5_decode_ber; +der_type_encoder_f T5_encode_der; +asn_struct_print_f T5_print; +asn_struct_free_f T5_free; + +/*** <<< CODE [T5] >>> ***/ + +int +T5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_T6.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using T6, + * so adjust the DEF appropriately. + */ +static void +T5_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_T6.ber_decoder; + td->der_encoder = asn1_DEF_T6.der_encoder; + td->free_struct = asn1_DEF_T6.free_struct; + td->print_struct = asn1_DEF_T6.print_struct; + td->last_tag_form = asn1_DEF_T6.last_tag_form; + td->elements = asn1_DEF_T6.elements; + td->elements_count = asn1_DEF_T6.elements_count; + td->specifics = asn1_DEF_T6.specifics; +} + +ber_dec_rval_t +T5_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + T5_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); +} + +der_enc_rval_t +T5_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + T5_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +T5_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T5_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +T5_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T5_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [T5] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_T5_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (6 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_T5 = { + "T5", + T5_constraint, + T5_decode_ber, + T5_encode_der, + T5_print, + T5_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T5_tags, + sizeof(asn1_DEF_T5_tags) + /sizeof(asn1_DEF_T5_tags[0]) - 1, /* 1 */ + asn1_DEF_T5_tags, /* Same as above */ + sizeof(asn1_DEF_T5_tags) + /sizeof(asn1_DEF_T5_tags[0]), /* 2 */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [T6] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [T6] >>> ***/ + + +typedef double T6_t; + +/*** <<< FUNC-DECLS [T6] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_T6; +asn_constr_check_f T6_constraint; +ber_type_decoder_f T6_decode_ber; +der_type_encoder_f T6_encode_der; +asn_struct_print_f T6_print; +asn_struct_free_f T6_free; + +/*** <<< CODE [T6] >>> ***/ + +int +T6_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_NativeReal.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using NativeReal, + * so adjust the DEF appropriately. + */ +static void +T6_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_NativeReal.ber_decoder; + td->der_encoder = asn1_DEF_NativeReal.der_encoder; + td->free_struct = asn1_DEF_NativeReal.free_struct; + td->print_struct = asn1_DEF_NativeReal.print_struct; + td->last_tag_form = asn1_DEF_NativeReal.last_tag_form; + td->elements = asn1_DEF_NativeReal.elements; + td->elements_count = asn1_DEF_NativeReal.elements_count; + td->specifics = asn1_DEF_NativeReal.specifics; +} + +ber_dec_rval_t +T6_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + T6_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); +} + +der_enc_rval_t +T6_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + T6_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +T6_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T6_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +T6_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T6_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [T6] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_T6_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_T6 = { + "T6", + T6_constraint, + T6_decode_ber, + T6_encode_der, + T6_print, + T6_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T6_tags, + sizeof(asn1_DEF_T6_tags) + /sizeof(asn1_DEF_T6_tags[0]), /* 1 */ + asn1_DEF_T6_tags, /* Same as above */ + sizeof(asn1_DEF_T6_tags) + /sizeof(asn1_DEF_T6_tags[0]), /* 1 */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [T] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [T] >>> ***/ + + +typedef Ts_t T_t; + +/*** <<< FUNC-DECLS [T] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_T; +asn_constr_check_f T_constraint; +ber_type_decoder_f T_decode_ber; +der_type_encoder_f T_encode_der; +asn_struct_print_f T_print; +asn_struct_free_f T_free; + +/*** <<< CODE [T] >>> ***/ + +int +T_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_Ts.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using Ts, + * so adjust the DEF appropriately. + */ +static void +T_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_Ts.ber_decoder; + td->der_encoder = asn1_DEF_Ts.der_encoder; + td->free_struct = asn1_DEF_Ts.free_struct; + td->print_struct = asn1_DEF_Ts.print_struct; + td->last_tag_form = asn1_DEF_Ts.last_tag_form; + td->elements = asn1_DEF_Ts.elements; + td->elements_count = asn1_DEF_Ts.elements_count; + td->specifics = asn1_DEF_Ts.specifics; +} + +ber_dec_rval_t +T_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + T_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); +} + +der_enc_rval_t +T_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + T_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +T_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +T_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [T] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_T_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + (ASN_TAG_CLASS_CONTEXT | (123 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_T = { + "T", + T_constraint, + T_decode_ber, + T_encode_der, + T_print, + T_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T_tags, + sizeof(asn1_DEF_T_tags) + /sizeof(asn1_DEF_T_tags[0]) - 2, /* 1 */ + asn1_DEF_T_tags, /* Same as above */ + sizeof(asn1_DEF_T_tags) + /sizeof(asn1_DEF_T_tags[0]), /* 3 */ + -0, /* Unknown yet */ + 0, 0, /* Defined elsewhere */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Ts] >>> ***/ + +#include +#include +#include + +/*** <<< DEPS [Ts] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Ts; + +/*** <<< TYPE-DECLS [Ts] >>> ***/ + + +typedef struct Ts { + T2_t m1; + T3_t *m2 /* OPTIONAL */; + T3_t m3; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} Ts_t; + +/*** <<< STAT-DEFS [Ts] >>> ***/ + +static asn1_TYPE_member_t asn1_MBR_Ts[] = { + { ATF_NOFLAGS, 0, offsetof(struct Ts, m1), + .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn1_DEF_T2, + .memb_constraints = 0, /* Defer to actual type */ + .name = "m1" + }, + { ATF_POINTER, 1, offsetof(struct Ts, m2), + .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + .tag_mode = +1, /* EXPLICIT tag at current level */ + .type = (void *)&asn1_DEF_T3, + .memb_constraints = 0, /* Defer to actual type */ + .name = "m2" + }, + { ATF_NOFLAGS, 0, offsetof(struct Ts, m3), + .tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn1_DEF_T3, + .memb_constraints = 0, /* Defer to actual type */ + .name = "m3" + }, +}; +static ber_tlv_tag_t asn1_DEF_Ts_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (123 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_TYPE_tag2member_t asn1_DEF_Ts_tag2el[] = { + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* m1 at 24 */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* m2 at 25 */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* m3 at 27 */ +}; +static asn1_SEQUENCE_specifics_t asn1_DEF_Ts_specs = { + sizeof(struct Ts), + offsetof(struct Ts, _ber_dec_ctx), + asn1_DEF_Ts_tag2el, + 3, /* Count of tags in the map */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn1_TYPE_descriptor_t asn1_DEF_Ts = { + "Ts", + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_print, + SEQUENCE_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Ts_tags, + sizeof(asn1_DEF_Ts_tags) + /sizeof(asn1_DEF_Ts_tags[0]) - 1, /* 1 */ + asn1_DEF_Ts_tags, /* Same as above */ + sizeof(asn1_DEF_Ts_tags) + /sizeof(asn1_DEF_Ts_tags[0]), /* 2 */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_Ts, + 3, /* Elements count */ + &asn1_DEF_Ts_specs /* Additional specs */ +}; + From f9d178d667f20496151ea20028788ae20cc714ff Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 14 Sep 2004 12:47:45 +0000 Subject: [PATCH 0321/1469] REAL support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@321 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 4 ++- libasn1compiler/asn1c_C.c | 39 ++++++++---------------------- libasn1compiler/asn1c_C.h | 10 ++++---- libasn1compiler/asn1c_constraint.c | 22 +++++++++++++++-- libasn1compiler/asn1c_misc.c | 21 +++++++++++----- libasn1compiler/asn1compiler.h | 4 +-- 6 files changed, 55 insertions(+), 45 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3867e960f..e101272a0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9.5: 2004-Sep-13 +0.9.5: 2004-Sep-14 * Fixed CER (common BER) decoder code. See check-25.c/VisibleString case for details. X.690 specifies that inner structures in BER @@ -10,6 +10,8 @@ * Added converters between any generic type and the ANY type. * Parser fixed: Information Object Class fields may be taged. * Parser fixed: tagged types inside SEQUENCE OF/SET OF support. + * Real REAL support! (Haven't tested denormals support yet!) + See skeletons/tests/check-REAL.c 0.9.4: 2004-Sep-10 diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 485e990aa..f17a0d6a4 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -78,45 +78,21 @@ static int emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode #define MKID(id) asn1c_make_identifier(0, (id), 0) int -asn1c_lang_C_type_ENUMERATED(arg_t *arg) { - asn1p_expr_t *expr = arg->expr; - asn1p_expr_t *v; - +asn1c_lang_C_type_REAL(arg_t *arg) { REDIR(OT_DEPS); - - OUT("typedef enum %s {\n", MKID(expr->Identifier)); - TQ_FOR(v, &(expr->members), next) { - switch(v->expr_type) { - case A1TC_UNIVERVAL: - OUT("\t%s\t= %lld,\n", - asn1c_make_identifier(0, - expr->Identifier, - v->Identifier, 0), - v->value->value.v_integer); - break; - case A1TC_EXTENSIBLE: - OUT("\t/*\n"); - OUT("\t * Enumeration is extensible\n"); - OUT("\t */\n"); - break; - default: - return -1; - } - } - OUT("} %s_e;\n", MKID(expr->Identifier)); - return asn1c_lang_C_type_SIMPLE_TYPE(arg); } - int -asn1c_lang_C_type_INTEGER(arg_t *arg) { +asn1c_lang_C_type_common_INTEGER(arg_t *arg) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *v; REDIR(OT_DEPS); - if(TQ_FIRST(&(expr->members))) { + if(expr->expr_type == ASN_BASIC_ENUMERATED + || TQ_FIRST(&(expr->members)) + ) { OUT("typedef enum %s {\n", MKID(expr->Identifier)); TQ_FOR(v, &(expr->members), next) { switch(v->expr_type) { @@ -127,6 +103,11 @@ asn1c_lang_C_type_INTEGER(arg_t *arg) { v->Identifier, 0), v->value->value.v_integer); break; + case A1TC_EXTENSIBLE: + OUT("\t/*\n"); + OUT("\t * Enumeration is extensible\n"); + OUT("\t */\n"); + break; default: return -1; } diff --git a/libasn1compiler/asn1c_C.h b/libasn1compiler/asn1c_C.h index e8f56ed91..76fce34fb 100644 --- a/libasn1compiler/asn1c_C.h +++ b/libasn1compiler/asn1c_C.h @@ -11,8 +11,8 @@ int asn1c_lang_C_type_SET(arg_t *); int asn1c_lang_C_type_SEx_OF(arg_t *); /* SET OF or SEQUENCE OF */ int asn1c_lang_C_type_CHOICE(arg_t *); -int asn1c_lang_C_type_INTEGER(arg_t *); -int asn1c_lang_C_type_ENUMERATED(arg_t *); +int asn1c_lang_C_type_common_INTEGER(arg_t *); +int asn1c_lang_C_type_REAL(arg_t *); int asn1c_lang_C_type_SIMPLE_TYPE(arg_t *); static asn1_language_map_t asn1_lang_C[] __attribute__ ((unused)) = { @@ -38,9 +38,9 @@ static asn1_language_map_t asn1_lang_C[] __attribute__ ((unused)) = { */ { AMT_TYPE, ASN_BASIC_BOOLEAN, asn1c_lang_C_type_SIMPLE_TYPE }, { AMT_TYPE, ASN_BASIC_NULL, asn1c_lang_C_type_SIMPLE_TYPE }, - { AMT_TYPE, ASN_BASIC_INTEGER, asn1c_lang_C_type_INTEGER }, - /* [Skipped REAL] */ - { AMT_TYPE, ASN_BASIC_ENUMERATED, asn1c_lang_C_type_ENUMERATED }, + { AMT_TYPE, ASN_BASIC_INTEGER, asn1c_lang_C_type_common_INTEGER }, + { AMT_TYPE, ASN_BASIC_REAL, asn1c_lang_C_type_REAL }, + { AMT_TYPE, ASN_BASIC_ENUMERATED, asn1c_lang_C_type_common_INTEGER }, { AMT_TYPE, ASN_BASIC_BIT_STRING, asn1c_lang_C_type_SIMPLE_TYPE }, { AMT_TYPE, ASN_BASIC_OCTET_STRING, asn1c_lang_C_type_SIMPLE_TYPE }, { AMT_TYPE, ASN_BASIC_OBJECT_IDENTIFIER,asn1c_lang_C_type_SIMPLE_TYPE }, diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index 7398a4600..5147806f3 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -65,7 +65,8 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { switch(etype) { case ASN_BASIC_INTEGER: case ASN_BASIC_ENUMERATED: - if(!(arg->flags & A1C_USE_NATIVE_INTEGERS)) + case ASN_BASIC_REAL: + if(!(arg->flags & A1C_USE_NATIVE_TYPES)) produce_st = 1; break; case ASN_BASIC_BIT_STRING: @@ -91,6 +92,9 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { case ASN_BASIC_ENUMERATED: OUT("long value;\n"); break; + case ASN_BASIC_REAL: + OUT("double value;\n"); + break; case ASN_BASIC_BOOLEAN: OUT("int value;\n"); break; @@ -549,7 +553,7 @@ emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype, asn1cnst_rang switch(etype) { case ASN_BASIC_INTEGER: case ASN_BASIC_ENUMERATED: - if(arg->flags & A1C_USE_NATIVE_INTEGERS) { + if(arg->flags & A1C_USE_NATIVE_TYPES) { OUT("value = *(const int *)sptr;\n"); } else { if(r_value->el_count == 0 @@ -579,6 +583,20 @@ emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype, asn1cnst_rang OUT("}\n"); } break; + case ASN_BASIC_REAL: + if(arg->flags & A1C_USE_NATIVE_TYPES) { + OUT("value = *(const double *)sptr;\n"); + } else { + OUT("if(asn1_REAL2double(st, &value)) {\n"); + INDENT(+1); + OUT("_ASN_ERRLOG(app_errlog, app_key,\n"); + OUT("\t\"%%s: value too large (%%s:%%d)\",\n"); + OUT("\ttd->name, __FILE__, __LINE__);\n"); + OUT("return -1;\n"); + INDENT(-1); + OUT("}\n"); + } + break; case ASN_BASIC_BOOLEAN: OUT("value = (*(const int *)sptr) ? 1 : 0;\n"); break; diff --git a/libasn1compiler/asn1c_misc.c b/libasn1compiler/asn1c_misc.c index 2bdbd7c85..1c4912d6e 100644 --- a/libasn1compiler/asn1c_misc.c +++ b/libasn1compiler/asn1c_misc.c @@ -150,16 +150,25 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { #endif case ASN_BASIC_INTEGER: case ASN_BASIC_ENUMERATED: - if((arg->flags & A1C_USE_NATIVE_INTEGERS)) { + case ASN_BASIC_REAL: + if((arg->flags & A1C_USE_NATIVE_TYPES)) { switch(_format) { case TNF_CTYPE: case TNF_RSAFE: - return "int"; - default: - if(expr->expr_type == ASN_BASIC_INTEGER) - return "NativeInteger"; + if(expr->expr_type == ASN_BASIC_REAL) + return "double"; else - return "NativeEnumerated"; + return "int"; + default: break; + } + switch(expr->expr_type) { + case ASN_BASIC_INTEGER: + return "NativeInteger"; + case ASN_BASIC_ENUMERATED: + return "NativeEnumerated"; + case ASN_BASIC_REAL: + return "NativeReal"; + default: break; } } /* Fall through */ diff --git a/libasn1compiler/asn1compiler.h b/libasn1compiler/asn1compiler.h index 6b9219a5c..8099e6e1b 100644 --- a/libasn1compiler/asn1compiler.h +++ b/libasn1compiler/asn1compiler.h @@ -20,9 +20,9 @@ enum asn1c_flags { */ A1C_OMIT_SUPPORT_CODE = 0x0004, /* - * Use native integers instead of INTEGER_t and ENUMERATED_t types. + * Use native data types instead of INTEGER_t et al. */ - A1C_USE_NATIVE_INTEGERS = 0x0008, + A1C_USE_NATIVE_TYPES = 0x0008, /* * Do not use C99 extensions. */ From 03af0f048d551dd0950dca3c607ad539116b980d Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 14 Sep 2004 12:48:17 +0000 Subject: [PATCH 0322/1469] -fnative-integers -> -fnative-types git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@322 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/asn1c.1 | 8 ++++---- asn1c/asn1c.c | 6 ++++-- doc/asn1c-usage.lyx | 10 +++++----- doc/asn1c-usage.pdf | Bin 66940 -> 69328 bytes 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/asn1c/asn1c.1 b/asn1c/asn1c.1 index f2c3677e2..8d7cf0617 100644 --- a/asn1c/asn1c.1 +++ b/asn1c/asn1c.1 @@ -27,7 +27,7 @@ and other encoding standards. .TP \fILanguage Options\fR .br -\fB\-fall-defs-global \-fbless-SIZE \-fnative-integers \-funnamed-unions \-ftypes88\fR +\fB\-fall-defs-global \-fbless-SIZE \-fnative-types \-funnamed-unions \-ftypes88\fR .TP \fIOutput Options\fR .br @@ -87,9 +87,9 @@ Allow SIZE() constraint for INTEGER, ENUMERATED, and other types for which this constraint is normally prohibited by the standard. This is a violation of an ASN.1 standard and compiler may fail to produce the meaningful code. .TP -.B \-fnative-integers -Use native machine's integer types whenever possible, -instead of the complex ASN.1 INTEGER and ENUMERATED types. +.B \-fnative-types +Use the native machine's data types (int, double) whenever possible, +instead of the compound ASN.1 INTEGER_t, ENUMERATED_t and REAL_t types. .TP .B \-funnamed-unions Enable unnamed unions in the definitions of target language's structures. diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index d84d86421..9dd5dde3d 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -63,7 +63,9 @@ main(int ac, char **av) { ret = asn1f_make_known_external_type(known_type); assert(ret == 0 || errno == EEXIST); } else if(strcmp(optarg, "native-integers") == 0) { - asn1_compiler_flags |= A1C_USE_NATIVE_INTEGERS; + asn1_compiler_flags |= A1C_USE_NATIVE_TYPES; + } else if(strcmp(optarg, "native-types") == 0) { + asn1_compiler_flags |= A1C_USE_NATIVE_TYPES; } else if(strcmp(optarg, "unnamed-unions") == 0) { asn1_compiler_flags |= A1C_UNNAMED_UNIONS; } else if(strcmp(optarg, "types88") == 0) { @@ -289,7 +291,7 @@ usage(char *av0) { " -fall-defs-global Don't make the asn1_DEF_'s of structure members \"static\"\n" " -fbless-SIZE Allow SIZE() constraint for INTEGER etc (non-std.)\n" " -fknown-extern-type= Pretend this type is known\n" -" -fnative-integers Use int instead of INTEGER_t whenever possible\n" +" -fnative-types Use \"int\" instead of INTEGER_t whenever possible\n" " -funnamed-unions Enable unnamed unions in structures\n" " -ftypes88 Use only ASN.1:1988 embedded types\n" "\n" diff --git a/doc/asn1c-usage.lyx b/doc/asn1c-usage.lyx index ad3d12173..dd0dbfb2e 100644 --- a/doc/asn1c-usage.lyx +++ b/doc/asn1c-usage.lyx @@ -55,7 +55,7 @@ status Open \layout Standard \backslash -extramarks{$Revision$ -- describes asn1c-0.9.3}{} +extramarks{$Revision$ -- describes asn1c-0.9.5}{} \end_inset @@ -1117,7 +1117,7 @@ collapsed false \emph on --fnative-integers +-fnative-types \emph default compiler option is used to produce basic C \emph on @@ -1648,7 +1648,7 @@ Allow SIZE() constraint for INTEGER, ENUMERATED, and other types for which \layout Standard --fnative-integers +-fnative-types \end_inset @@ -1658,8 +1658,8 @@ Allow SIZE() constraint for INTEGER, ENUMERATED, and other types for which \size small -Use native machine's integer types whenever possible, instead of the complex - ASN.1 INTEGER and ENUMERATED types. +Use the native machine's data types (int, double) whenever possible, instead + of the compound ASN.1 INTEGER_t, ENUMERATED_t and REAL_t types. \end_inset diff --git a/doc/asn1c-usage.pdf b/doc/asn1c-usage.pdf index 105671c0216367e43af31211b69903a3bb6a25b0..6a22d2257378abf3242a639766fdaf6316be9420 100644 GIT binary patch delta 38627 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
    S#|6{CCqwB8;i0hkJ{51$?J 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 delta 36364 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 Date: Tue, 14 Sep 2004 13:40:42 +0000 Subject: [PATCH 0323/1469] infinity and nan defined git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@323 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/REAL.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/skeletons/REAL.c b/skeletons/REAL.c index 79b517361..ea37965b0 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -12,6 +12,15 @@ #undef INT_MAX #define INT_MAX ((int)(((unsigned int)-1) >> 1)) +#ifndef INFINITY +#define INFINITY HUGE_VAL +#endif + +#ifndef NAN +static const double nan0; +#define NAN (nan0/nan0) +#endif + /* * REAL basic type description. */ From b305ead7db11a1da0fb183f552fabd273051f6d3 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 14 Sep 2004 13:42:05 +0000 Subject: [PATCH 0324/1469] explicitly add math library git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@324 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/Makefile.in | 2 +- skeletons/tests/Makefile.am | 2 ++ skeletons/tests/Makefile.in | 8 ++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index c8266756a..ecc0c71a3 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -448,9 +448,9 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." + -rm -f asn1p_l.c -rm -f asn1p_y.c -rm -f asn1p_y.h - -rm -f asn1p_l.c clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ diff --git a/skeletons/tests/Makefile.am b/skeletons/tests/Makefile.am index 7af584300..eb1f0187f 100644 --- a/skeletons/tests/Makefile.am +++ b/skeletons/tests/Makefile.am @@ -9,4 +9,6 @@ check_PROGRAMS = \ check-INTEGER \ check-REAL +LDADD = -lm + TESTS = $(check_PROGRAMS) diff --git a/skeletons/tests/Makefile.in b/skeletons/tests/Makefile.in index ea0acc0d6..af4156215 100644 --- a/skeletons/tests/Makefile.in +++ b/skeletons/tests/Makefile.in @@ -52,24 +52,31 @@ CONFIG_CLEAN_FILES = check_GeneralizedTime_SOURCES = check-GeneralizedTime.c check_GeneralizedTime_OBJECTS = check-GeneralizedTime.$(OBJEXT) check_GeneralizedTime_LDADD = $(LDADD) +check_GeneralizedTime_DEPENDENCIES = check_INTEGER_SOURCES = check-INTEGER.c check_INTEGER_OBJECTS = check-INTEGER.$(OBJEXT) check_INTEGER_LDADD = $(LDADD) +check_INTEGER_DEPENDENCIES = check_OIDs_SOURCES = check-OIDs.c check_OIDs_OBJECTS = check-OIDs.$(OBJEXT) check_OIDs_LDADD = $(LDADD) +check_OIDs_DEPENDENCIES = check_REAL_SOURCES = check-REAL.c check_REAL_OBJECTS = check-REAL.$(OBJEXT) check_REAL_LDADD = $(LDADD) +check_REAL_DEPENDENCIES = check_UTCTime_SOURCES = check-UTCTime.c check_UTCTime_OBJECTS = check-UTCTime.$(OBJEXT) check_UTCTime_LDADD = $(LDADD) +check_UTCTime_DEPENDENCIES = check_ber_tlv_tag_SOURCES = check-ber_tlv_tag.c check_ber_tlv_tag_OBJECTS = check-ber_tlv_tag.$(OBJEXT) check_ber_tlv_tag_LDADD = $(LDADD) +check_ber_tlv_tag_DEPENDENCIES = check_length_SOURCES = check-length.c check_length_OBJECTS = check-length.$(OBJEXT) check_length_LDADD = $(LDADD) +check_length_DEPENDENCIES = DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @@ -208,6 +215,7 @@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ AM_CPPFLAGS = -I$(top_srcdir)/skeletons +LDADD = -lm TESTS = $(check_PROGRAMS) all: all-am From b02ccb2812e378501037e30494c304addbea02e6 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 14 Sep 2004 13:50:21 +0000 Subject: [PATCH 0325/1469] more portable constructs git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@325 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/REAL.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/skeletons/REAL.c b/skeletons/REAL.c index ea37965b0..5ec56e481 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -257,7 +257,7 @@ asn1_double2REAL(REAL_t *st, double dbl_value) { } /* fpclassify(3) is not portable yet */ if(expval == -INT_MAX) { - if(signbit(dbl_value)) { + if(copysign(1.0, dbl_value) < 0.0) { st->buf[0] = 0x80 | 0x40; st->buf[1] = 0; st->size = 2; @@ -266,7 +266,7 @@ asn1_double2REAL(REAL_t *st, double dbl_value) { st->size = 0; } } else if(isinf(dbl_value)) { - if(signbit(dbl_value)) { + if(copysign(1.0, dbl_value) < 0.0) { st->buf[0] = 0x41; /* MINUS-INFINITY */ } else { st->buf[0] = 0x40; /* PLUS-INFINITY */ From 46361983e4586b1ef16987002e9793afe2d60657 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 14 Sep 2004 13:58:10 +0000 Subject: [PATCH 0326/1469] ilogb() return value is platform-dependent git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@326 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/REAL.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/skeletons/REAL.c b/skeletons/REAL.c index 5ec56e481..e42a0613c 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -245,9 +245,13 @@ asn1_double2REAL(REAL_t *st, double dbl_value) { return -1; } + /* + * ilogb(+-0) returns -INT_MAX or INT_MIN (platform-dependent) + * ilogb(+-inf) returns INT_MAX + */ expval = ilogb(dbl_value); - if(expval == -INT_MAX /* Also catches (dbl_value == 0) */ + if(expval <= -INT_MAX /* Also catches (dbl_value == 0) */ || expval == INT_MAX /* catches finite() which catches isnan() */ ) { if(!st->buf || st->size < 2) { @@ -256,7 +260,7 @@ asn1_double2REAL(REAL_t *st, double dbl_value) { st->buf = ptr; } /* fpclassify(3) is not portable yet */ - if(expval == -INT_MAX) { + if(expval <= -INT_MAX) { if(copysign(1.0, dbl_value) < 0.0) { st->buf[0] = 0x80 | 0x40; st->buf[1] = 0; @@ -283,10 +287,11 @@ asn1_double2REAL(REAL_t *st, double dbl_value) { if(littleEndian) { uint8_t *s = ((uint8_t *)&dbl_value) + sizeof(dbl_value) - 2; + uint8_t *start = ((uint8_t *)&dbl_value); uint8_t *d; bmsign = 0x80 | ((s[1] >> 1) & 0x40); /* binary mask & - */ - for(mstop = d = dscr; s >= (uint8_t *)&dbl_value; d++, s--) { + for(mstop = d = dscr; s >= start; d++, s--) { *d = *s; if(*d) mstop = d; } @@ -346,7 +351,6 @@ asn1_double2REAL(REAL_t *st, double dbl_value) { *ptr++ = expval >> 8; *ptr++ = expval; } else { - assert((expval >> 23) == -1); *ptr++ = bmsign | 0x02; *ptr++ = expval >> 16; *ptr++ = expval >> 8; From c6de2c4f112bb337e506b4bcee11983cdd0706f0 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 14 Sep 2004 14:10:10 +0000 Subject: [PATCH 0327/1469] cleanup before proceeding git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@327 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index f17a0d6a4..7762bcd3c 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1132,9 +1132,14 @@ emit_tags_vectors(arg_t *arg, asn1p_expr_t *expr, int *tags_count_r, int *all_ta enum tvm_compat tv_mode = _TVM_SAME; int i; + /* Cleanup before proceeding. */ + *tags_count_r = 0; + *all_tags_count_r = 0; + /* Fetch a chain of tags */ tags_count = asn1f_fetch_tags(arg->asn, arg->mod, expr, &tags, 0); - if(tags_count < 0) return -1; + if(tags_count < 0) + return -1; /* Fetch a chain of tags */ all_tags_count = asn1f_fetch_tags(arg->asn, arg->mod, expr, From b958d28c4fd0d9ab5e6956078a7ee27c6fd38642 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 14 Sep 2004 14:14:58 +0000 Subject: [PATCH 0328/1469] REAL/math git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@328 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-65.c | 20 +++++++++----------- asn1c/tests/check-assembly.sh | 2 +- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/asn1c/tests/check-65.c b/asn1c/tests/check-65.c index 65078e2b3..3ada64317 100644 --- a/asn1c/tests/check-65.c +++ b/asn1c/tests/check-65.c @@ -16,9 +16,7 @@ uint8_t buf1[] = { 32 | ((2 << 6) + 4), /* [4], constructed */ 4, 0 | ((2 << 6) + 6), /* [6], primitive */ - 2, - 0x91, - 0x92 + 0 }; uint8_t buf2[] = { @@ -32,8 +30,8 @@ uint8_t buf2[] = { 4, 0 | ((2 << 6) + 6), /* [6], primitive */ 2, - 0x91, - 0x92, + 0xC0, + 0x00, 32 | ((2 << 6) + 2), /* [2], constructed */ 6, @@ -41,16 +39,16 @@ uint8_t buf2[] = { 4, 0 | ((2 << 6) + 6), /* [6], primitive */ 2, - 0x91, - 0x92, + 0x80, + 0x00, 32 | ((2 << 6) + 3), /* [3], constructed */ 4, 0 | ((2 << 6) + 6), /* [6], primitive */ - 2, - 0x91, - 0x92, - + 3, + 0x80, + 0x01, + 0x02, }; static void diff --git a/asn1c/tests/check-assembly.sh b/asn1c/tests/check-assembly.sh index a0b0fdb12..b4bd1182f 100755 --- a/asn1c/tests/check-assembly.sh +++ b/asn1c/tests/check-assembly.sh @@ -44,7 +44,7 @@ CXXFLAGS=\${COMMON_FLAGS} ${CXXFLAGS} all: check-executable check-executable: compiled-module *.c* - \$(CC) \$(CFLAGS) -o check-executable *.c* + \$(CC) \$(CFLAGS) -o check-executable -lm *.c* # Compile the corresponding .asn1 spec. compiled-module: ${asn_module} ../../asn1c From b703836ce9fad8994042f97fffc0c0913154c245 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 14 Sep 2004 14:19:53 +0000 Subject: [PATCH 0329/1469] fixes git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@329 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-65.c | 10 +++++----- asn1c/tests/check-assembly.sh | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/asn1c/tests/check-65.c b/asn1c/tests/check-65.c index 3ada64317..08da99ea9 100644 --- a/asn1c/tests/check-65.c +++ b/asn1c/tests/check-65.c @@ -10,11 +10,11 @@ uint8_t buf1[] = { 32 | ((2 << 6) + 2), /* [2], constructed */ - 8, - 32 | ((2 << 6) + 3), /* [3], constructed */ 6, - 32 | ((2 << 6) + 4), /* [4], constructed */ + 32 | ((2 << 6) + 3), /* [3], constructed */ 4, + 32 | ((2 << 6) + 4), /* [4], constructed */ + 2, 0 | ((2 << 6) + 6), /* [6], primitive */ 0 }; @@ -22,7 +22,7 @@ uint8_t buf1[] = { uint8_t buf2[] = { 32 | ((2 << 6) + 0), /* [0], constructed */ - 22, + 23, 32 | ((2 << 6) + 1), /* [1], constructed */ 6, @@ -43,7 +43,7 @@ uint8_t buf2[] = { 0x00, 32 | ((2 << 6) + 3), /* [3], constructed */ - 4, + 5, 0 | ((2 << 6) + 6), /* [6], primitive */ 3, 0x80, diff --git a/asn1c/tests/check-assembly.sh b/asn1c/tests/check-assembly.sh index b4bd1182f..43ce00128 100755 --- a/asn1c/tests/check-assembly.sh +++ b/asn1c/tests/check-assembly.sh @@ -44,6 +44,7 @@ CXXFLAGS=\${COMMON_FLAGS} ${CXXFLAGS} all: check-executable check-executable: compiled-module *.c* + @rm -f *.core \$(CC) \$(CFLAGS) -o check-executable -lm *.c* # Compile the corresponding .asn1 spec. From 2591f52f45232ad3b25c9b1c6b0d6ed8dea20f0c Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 14 Sep 2004 14:29:47 +0000 Subject: [PATCH 0330/1469] REAL type is now supported git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@330 59561ff5-6e30-0410-9f3c-9617f08c8826 --- BUGS | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/BUGS b/BUGS index d35cff723..2023fcffe 100644 --- a/BUGS +++ b/BUGS @@ -5,30 +5,28 @@ known. Not a huge problem for run-once programs like a compiler. NOTE: This statement does not apply to the target code _produced_ by the compiler. -1. REAL type is not supported yet. - -2. For purposes of compilation, INTEGER type is modelled using a large +1. For purposes of compilation, INTEGER type is modelled using a large static type (asn_integer_t), but defined as any positive or negative value by ASN.1. Not a problem as most specifications use very small values anyway. NOTE: This statement does not apply to the target code _produced_ by the compiler. -3. ASN Macros are prohibited by the current ASN.1 standard, +2. ASN Macros are prohibited by the current ASN.1 standard, and are not supported. -4. Multiple tags applied at the same level are not supported: +3. Multiple tags applied at the same level are not supported: BadTags ::= [0] EXPLICIT [2] IMPLICIT OtherType The same thing could be achieved by using the indirection: GoodTags ::= [0] EXPLICIT OtherTypePtr OtherTypePtr ::= [2] IMPLICIT OtherType -5. Mixed definite/indefinite length in a _single_ BER tags sequence is not +4. Mixed definite/indefinite length in a _single_ BER tags sequence is not supported. Should not be a problem in the real world. Please note that it is still possible, for example, to encode a wrapper structure using definite length, and encode its substructure member using indefinite length. The BER decoder is perfectly capable of decoding such sequences. -6. Encoding or decoding of structures with combined length greater than 16MB +5. Encoding or decoding of structures with combined length greater than 16MB is not tested. There are some size determination bugs lurking in the produced code, which may cause integer overflow in certain edge cases. This restriction should not cause a problem in the real world, as higher level protocol typically From 63c808c45f1d2ff6d6d6f6eb7943a98e7ee280a6 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Sep 2004 11:44:13 +0000 Subject: [PATCH 0331/1469] test for subtype constraint referencing values from other modules git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@331 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/50-constraint-OK.asn1 | 29 +- ...50-constraint-OK.asn1.-EFprint-constraints | Bin 5266 -> 7349 bytes tests/50-constraint-OK.asn1.-P | 294 ++++++++++++++++++ 3 files changed, 321 insertions(+), 2 deletions(-) diff --git a/tests/50-constraint-OK.asn1 b/tests/50-constraint-OK.asn1 index 83f083f23..b8812bc84 100644 --- a/tests/50-constraint-OK.asn1 +++ b/tests/50-constraint-OK.asn1 @@ -3,13 +3,15 @@ -- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) -- .spelio.software.asn1c.test (9363.1.5.1) --- .50 +-- .50 1 +-- .50 2 ModuleNestedConstraintsCheck { iso org(3) dod(6) internet (1) private(4) enterprise(1) - spelio(9363) software(1) asn1c(5) test(1) 50 } + spelio(9363) software(1) asn1c(5) test(1) 50 1 } DEFINITIONS ::= BEGIN + IMPORTS Identifier FROM IdentifierModule; Int1 ::= INTEGER Int2 ::= Int1 (0..MAX) -- X.680-0207::41.4.4 @@ -47,4 +49,27 @@ BEGIN Utf8-2 ::= Utf8-1 (SIZE(1..2)) Utf8-1 ::= UTF8String + VisibleIdentifier ::= Identifier + +END + + +IdentifierModule + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 50 2 } + DEFINITIONS ::= +BEGIN + EXPORTS Identifier; + + maxIdentifier INTEGER ::= 32 + + Identifier ::= + VisibleString ( FROM + ("A"|"a"|"B"|"b"|"C"|"c"|"D"|"d"|"E"|"e"|"F"|"f"| + "G"|"g"|"H"|"h"|"I"|"i"|"J"|"j"|"K"|"k"|"L"|"l"| + "M"|"m"|"N"|"n"|"O"|"o"|"P"|"p"|"Q"|"q"|"R"|"r"| + "S"|"s"|"T"|"t"|"U"|"u"|"V"|"v"|"W"|"w"|"X"|"x"| + "Y"|"y"|"Z"|"z"|"$"|"_"|"0"|"1"|"2"|"3"|"4"|"5"| + "6"|"7"|"8"|"9") ) (SIZE(1..maxIdentifier)) + END diff --git a/tests/50-constraint-OK.asn1.-EFprint-constraints b/tests/50-constraint-OK.asn1.-EFprint-constraints index fbe9ad3038ced579c42debd8a4c89183a679b965..8fb42287a37bce51bb499db79915d675f2f72716 100644 GIT binary patch literal 7349 zcmeHLTXUO680~BL6+49#>`lJL&Y0)1d;PXhKk{UHt5f6|*^5ytvXe~Zpc<9YVMPw)>v zjqIsDG)P80(vjMep+#)+MLTfDuIHY)N8Tyf-F>d@Ift&NX>OF+>~G?FXU?H>qM0T+ zPW)*WPW=U$7KDk;h8nv>pSWJPI~lz;2*GIQ#JmgB@L~}(k7xdR+#hqSTig<}vmaky zgi$an8=>AxBN}*#kt?z)Ml(+RoKsJ%&$f(aQd|l#w3!_pxH>sLm~k8A-1ch5}w^fN(CNT2DocurtJ6waa!56`&Hc+Oizgk*ipq2#@ zp)`37*cKA{5z{};u7boAPI)0bzEkI(Iz)krFIv?+EWGB4uG6^nhFd(+?}+%*P=!i0 zMG~Sq9;~61ovUNFng#7NOGHx}4e56nT`J(K|nMy4}uS z9WKhTtm(D4#@O;qU~>s~jvm{y$Y;`{CEvG{p#a_b8InjSSXP{FZ0!wJnFhQCLkzBg zO43x=KJ60~rV56ne(wfG^d@0TzIK&id=0%GrjMe#4Gg7kNlDk!w zU2!gr``Sj!t2cQEDcQ>N&|%5fP61JHm6@ASq-s*uLrbezMdre&=Ea#=nr-r3p!7?w z%4n}+nXAl;sID$)+F_ts`JIb)V!@Ri7%!n2lTN#d!6=kr!&~h3Wv!r+=USEJDZ z+m|&j2yrQbR#BWZYxQ|kxg{~Qo@U}fp_*O!#=CB2$&G5~*?imN?Fpas<)TzZZ*f-k z+2;RIef-Juhwgz51|+(`d+im9#++Jh;w9B)X_(&V`EvO_#eWw!CGJDfgiGsF+ya-r zO3z#3#!y)VZh?ObMO!fECz12B@isl6t1qN-Di5<^4Km`i?9S+WVmJ?jgg*o<|5ON> zXBWGK`ADxl;02Ihb*A{nU86I@w*w4-W8fTk2)qRT1iS*ez!3NX_&e}t;CtXNzy)vu zyasx}2zUgHfyclb;IF_xfG5BNcnVB`XTS`24!i}v1l|E(0Y3m=1Mh)vfPVsc5q`w? zkHFu67SIOvfPLTqI0SA1p8>alJ2dN-DcKiCR!L13@vS@m(3)ZM^TOoREY>S_;0fm; zPM#C4^bu*+Kblj`@eb%y^)gBMoBF@?dft=2o?rX-1*`lC9TnB@DVj}XS~WoG_b=td ll0cv!N}czcJk}!w_&A9Y5f)cJ7cKxWOa%D= diff --git a/tests/50-constraint-OK.asn1.-P b/tests/50-constraint-OK.asn1.-P index 545ddba15..305dc5023 100644 --- a/tests/50-constraint-OK.asn1.-P +++ b/tests/50-constraint-OK.asn1.-P @@ -2655,3 +2655,297 @@ asn1_TYPE_descriptor_t asn1_DEF_Utf8_1 = { 0 /* No specifics */ }; + +/*** <<< INCLUDES [VisibleIdentifier] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [VisibleIdentifier] >>> ***/ + + +typedef Identifier_t VisibleIdentifier_t; + +/*** <<< FUNC-DECLS [VisibleIdentifier] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_VisibleIdentifier; +asn_constr_check_f VisibleIdentifier_constraint; +ber_type_decoder_f VisibleIdentifier_decode_ber; +der_type_encoder_f VisibleIdentifier_encode_der; +asn_struct_print_f VisibleIdentifier_print; +asn_struct_free_f VisibleIdentifier_free; + +/*** <<< CTABLES [VisibleIdentifier] >>> ***/ + +static int permitted_alphabet_table_14[256] = { +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, /* $ */ +1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, /* 0123456789 */ +0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ABCDEFGHIJKLMNO */ +1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1, /* PQRSTUVWXYZ _ */ +0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* abcdefghijklmno */ +1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, /* pqrstuvwxyz */ +}; + +static int check_permitted_alphabet_14(const void *sptr) { + int *table = permitted_alphabet_table_14; + /* The underlying type is VisibleString */ + const VisibleString_t *st = sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!table[cv]) return -1; + } + return 0; +} + + +/*** <<< CODE [VisibleIdentifier] >>> ***/ + +int +VisibleIdentifier_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + const Identifier_t *st = sptr; + size_t size; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size >= 1 && size <= 32) + && !check_permitted_alphabet_14(sptr)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using Identifier, + * so adjust the DEF appropriately. + */ +static void +VisibleIdentifier_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_Identifier.ber_decoder; + td->der_encoder = asn1_DEF_Identifier.der_encoder; + td->free_struct = asn1_DEF_Identifier.free_struct; + td->print_struct = asn1_DEF_Identifier.print_struct; + td->last_tag_form = asn1_DEF_Identifier.last_tag_form; + td->elements = asn1_DEF_Identifier.elements; + td->elements_count = asn1_DEF_Identifier.elements_count; + td->specifics = asn1_DEF_Identifier.specifics; +} + +ber_dec_rval_t +VisibleIdentifier_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + VisibleIdentifier_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); +} + +der_enc_rval_t +VisibleIdentifier_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + VisibleIdentifier_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +VisibleIdentifier_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + VisibleIdentifier_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +VisibleIdentifier_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + VisibleIdentifier_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [VisibleIdentifier] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_VisibleIdentifier_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_VisibleIdentifier = { + "VisibleIdentifier", + VisibleIdentifier_constraint, + VisibleIdentifier_decode_ber, + VisibleIdentifier_encode_der, + VisibleIdentifier_print, + VisibleIdentifier_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_VisibleIdentifier_tags, + sizeof(asn1_DEF_VisibleIdentifier_tags) + /sizeof(asn1_DEF_VisibleIdentifier_tags[0]), /* 1 */ + asn1_DEF_VisibleIdentifier_tags, /* Same as above */ + sizeof(asn1_DEF_VisibleIdentifier_tags) + /sizeof(asn1_DEF_VisibleIdentifier_tags[0]), /* 1 */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Identifier] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Identifier] >>> ***/ + + +typedef VisibleString_t Identifier_t; + +/*** <<< FUNC-DECLS [Identifier] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Identifier; +asn_constr_check_f Identifier_constraint; +ber_type_decoder_f Identifier_decode_ber; +der_type_encoder_f Identifier_encode_der; +asn_struct_print_f Identifier_print; +asn_struct_free_f Identifier_free; + +/*** <<< CTABLES [Identifier] >>> ***/ + +static int permitted_alphabet_table_15[256] = { +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, /* $ */ +1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, /* 0123456789 */ +0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ABCDEFGHIJKLMNO */ +1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1, /* PQRSTUVWXYZ _ */ +0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* abcdefghijklmno */ +1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, /* pqrstuvwxyz */ +}; + +static int check_permitted_alphabet_15(const void *sptr) { + int *table = permitted_alphabet_table_15; + /* The underlying type is VisibleString */ + const VisibleString_t *st = sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!table[cv]) return -1; + } + return 0; +} + + +/*** <<< CODE [Identifier] >>> ***/ + +int +Identifier_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + const VisibleString_t *st = sptr; + size_t size; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size >= 1 && size <= 32) + && !check_permitted_alphabet_15(sptr)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using VisibleString, + * so adjust the DEF appropriately. + */ +static void +Identifier_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_VisibleString.ber_decoder; + td->der_encoder = asn1_DEF_VisibleString.der_encoder; + td->free_struct = asn1_DEF_VisibleString.free_struct; + td->print_struct = asn1_DEF_VisibleString.print_struct; + td->last_tag_form = asn1_DEF_VisibleString.last_tag_form; + td->elements = asn1_DEF_VisibleString.elements; + td->elements_count = asn1_DEF_VisibleString.elements_count; + td->specifics = asn1_DEF_VisibleString.specifics; +} + +ber_dec_rval_t +Identifier_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + Identifier_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); +} + +der_enc_rval_t +Identifier_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Identifier_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +Identifier_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Identifier_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +Identifier_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Identifier_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [Identifier] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_Identifier_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_Identifier = { + "Identifier", + Identifier_constraint, + Identifier_decode_ber, + Identifier_encode_der, + Identifier_print, + Identifier_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Identifier_tags, + sizeof(asn1_DEF_Identifier_tags) + /sizeof(asn1_DEF_Identifier_tags[0]), /* 1 */ + asn1_DEF_Identifier_tags, /* Same as above */ + sizeof(asn1_DEF_Identifier_tags) + /sizeof(asn1_DEF_Identifier_tags[0]), /* 1 */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + From 2e4a386124986522dfacb213d054b18694ec6258 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Sep 2004 11:44:21 +0000 Subject: [PATCH 0332/1469] ouch git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@332 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/file-dependencies | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/file-dependencies b/skeletons/file-dependencies index f40184452..2fdb58181 100644 --- a/skeletons/file-dependencies +++ b/skeletons/file-dependencies @@ -26,7 +26,7 @@ OBJECT_IDENTIFIER.h OBJECT_IDENTIFIER.c INTEGER.h ObjectDescriptor.h ObjectDescriptor.c GraphicString.h PrintableString.h PrintableString.c REAL.h REAL.c INTEGER.h -RELATIVE-OID.h RELATIVE-OID.c OBJECT-IDENTIFIER.h +RELATIVE-OID.h RELATIVE-OID.c OBJECT_IDENTIFIER.h T61String.h T61String.c TeletexString.h TeletexString.c UTCTime.h UTCTime.c GeneralizedTime.h From 093f67594823ace3544baeff9e8a7dafdc07741b Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Sep 2004 11:44:55 +0000 Subject: [PATCH 0333/1469] better DEFAULT and ENUMERATED pretty-printing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@333 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1print/asn1print.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index 31d7d1423..1237f64c4 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -171,8 +171,12 @@ asn1print_value(asn1p_value_t *val, enum asn1print_flags flags) { switch(val->type) { case ATV_NOVALUE: break; - case ATV_REFERENCED: - return asn1print_ref(val->value.reference, flags); + case ATV_NULL: + printf("NULL"); + return 0; + case ATV_REAL: + printf("%f", val->value.v_double); + return 0; case ATV_INTEGER: printf("%lld", (long long)val->value.v_integer); return 0; @@ -180,9 +184,6 @@ asn1print_value(asn1p_value_t *val, enum asn1print_flags flags) { case ATV_MAX: printf("MAX"); return 0; case ATV_FALSE: printf("FALSE"); return 0; case ATV_TRUE: printf("TRUE"); return 0; - case ATV_REAL: - printf("%f", val->value.v_double); - return 0; case ATV_STRING: { char *p = val->value.string.buf; @@ -229,6 +230,11 @@ asn1print_value(asn1p_value_t *val, enum asn1print_flags flags) { printf("'H"); } } + case ATV_REFERENCED: + return asn1print_ref(val->value.reference, flags); + case ATV_CHOICE_IDENTIFIER: + printf("%s: ", val->value.choice_identifier.identifier); + return asn1print_value(val->value.choice_identifier.value, flags); } assert(val->type || !"Unknown"); @@ -533,10 +539,13 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri * Print the expression as it were a stand-alone type. */ asn1print_expr(asn, mod, se, flags, level + 4); - if((se->marker & EM_DEFAULT) == EM_DEFAULT) - printf(" DEFAULT "); - else if((se->marker & EM_OPTIONAL) == EM_OPTIONAL) + if((se->marker.flags & EM_DEFAULT) == EM_DEFAULT) { + printf(" DEFAULT "); + asn1print_value(se->marker.default_value, flags); + } else if((se->marker.flags & EM_OPTIONAL) + == EM_OPTIONAL) { printf(" OPTIONAL"); + } if(TQ_NEXT(se, next)) { printf(","); INDENT("\n"); @@ -564,9 +573,11 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri if(tc->meta_type == AMT_VALUE && tc->expr_type != A1TC_EXTENSIBLE) { if(tc->expr_type == A1TC_UNIVERVAL) { - printf("("); - asn1print_value(tc->value, flags); - printf(")"); + if(tc->value) { + printf("("); + asn1print_value(tc->value, flags); + printf(")"); + } } else { printf(" ::= "); asn1print_value(tc->value, flags); From 5746178789bf3c8c7926bcda1e343fe7297f0b1b Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Sep 2004 11:45:44 +0000 Subject: [PATCH 0334/1469] more logging git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@334 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_constraint.c | 6 ++++-- libasn1fix/asn1fix_crange.c | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/libasn1fix/asn1fix_constraint.c b/libasn1fix/asn1fix_constraint.c index 3f30009ee..8c6c73ca9 100644 --- a/libasn1fix/asn1fix_constraint.c +++ b/libasn1fix/asn1fix_constraint.c @@ -238,10 +238,12 @@ _constraint_value_resolve(arg_t *arg, asn1p_module_t *mod, asn1p_value_t **value tmp_expr = asn1f_lookup_symbol(arg, mod, (*value)->value.reference); if(tmp_expr == NULL) { - FATAL("Cannot find symbol %s " + FATAL("Cannot find symbol %s (%s) " "used in %s subtype constraint at line %d", asn1f_printable_reference((*value)->value.reference), - arg->expr->Identifier, arg->expr->_lineno); + mod->Identifier, + arg->expr->Identifier, + arg->expr->_lineno); assert((*value)->type == ATV_REFERENCED); return -1; } diff --git a/libasn1fix/asn1fix_crange.c b/libasn1fix/asn1fix_crange.c index 53d46407f..e35ecad2a 100644 --- a/libasn1fix/asn1fix_crange.c +++ b/libasn1fix/asn1fix_crange.c @@ -326,7 +326,7 @@ static int _range_fill(asn1p_value_t *val, const asn1cnst_range_t *minmax, asn1c return 0; break; case ATV_REFERENCED: - FATAL("Unrecognized constraint element \"%s\" at line %d", + FATAL("Unresolved constraint element \"%s\" at line %d", asn1f_printable_reference(val->value.reference), lineno); return -1; From 44a9b52dc42d3187b6375460f2d20995ee3cdad3 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Sep 2004 11:46:23 +0000 Subject: [PATCH 0335/1469] dereferencing DEFAULT value git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@335 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_derefv.c | 54 +++++++++++++------------------------ 1 file changed, 19 insertions(+), 35 deletions(-) diff --git a/libasn1fix/asn1fix_derefv.c b/libasn1fix/asn1fix_derefv.c index a00eac9c7..eb67ac3f6 100644 --- a/libasn1fix/asn1fix_derefv.c +++ b/libasn1fix/asn1fix_derefv.c @@ -8,47 +8,31 @@ asn1f_fix_dereference_values(arg_t *arg) { asn1p_expr_t *expr = arg->expr; int r_value = 0; - if(expr->meta_type != AMT_VALUE) - return 0; /* Just ignore it */ - - if(expr->value == NULL) - return 0; /* Just ignore it */ - - if(expr->value && expr->value->type != ATV_REFERENCED) - return 0; /* Not a reference */ - - DEBUG("%s(%s %x ::= %s) for line %d", __func__, - expr->Identifier, expr->expr_type, - asn1f_printable_value(expr->value), expr->_lineno); - - /* - * If this integer has a value, check that this value - * is an integer. If it is a reference, resolve it. - */ - if(expr->value) { - + if(expr->value && expr->meta_type == AMT_VALUE) { if(asn1f_value_resolve(arg, expr)) { /* This function will emit messages */ r_value = -1; } + } - if(0 && expr->value->type != ATV_INTEGER) { - FATAL( - "INTEGER value %s at line %d: " - "Incompatible value specified: %s", - expr->Identifier, - expr->_lineno, - asn1f_printable_value(expr->value) - ); - r_value = -1; + if(expr->marker.default_value) { + arg_t tmparg = *arg; + asn1p_expr_t tmpexpr = *expr; + + switch(expr->marker.default_value->type) { + default: + return r_value; + case ATV_REFERENCED: + break; } - } else { - FATAL("Value of \"%s\" at line %d: " - "Incompatible value specified", - expr->Identifier, - expr->_lineno - ); - r_value = -1; + + tmparg.expr = &tmpexpr; + tmpexpr.meta_type = AMT_VALUE; + tmpexpr.marker.default_value = 0; + tmpexpr.value = expr->marker.default_value; + if(asn1f_value_resolve(&tmparg, &tmpexpr)) + r_value = -1; + expr->marker.default_value = tmpexpr.value; } return r_value; From 52864bbd958b872aa0f6d3eb55b71e472ad39b78 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Sep 2004 11:46:28 +0000 Subject: [PATCH 0336/1469] added ChoiceIdentifier git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@336 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_misc.c | 89 ++++++++++++++++++++++++--------------- 1 file changed, 55 insertions(+), 34 deletions(-) diff --git a/libasn1fix/asn1fix_misc.c b/libasn1fix/asn1fix_misc.c index 8e70c9014..c022abce7 100644 --- a/libasn1fix/asn1fix_misc.c +++ b/libasn1fix/asn1fix_misc.c @@ -23,12 +23,13 @@ asn1f_printable_value(asn1p_value_t *v) { int ret; #define ENSURE(len) do { \ - if(len >= managedptr_len) { \ + int __len = (len); \ + if(__len >= managedptr_len) { \ if(managedptr) \ free(managedptr); \ - managedptr = malloc(len + 1); \ + managedptr = malloc(__len + 1); \ if(managedptr) { \ - managedptr_len = len; \ + managedptr_len = __len; \ } else { \ managedptr_len = 0; \ return ""; \ @@ -42,37 +43,8 @@ asn1f_printable_value(asn1p_value_t *v) { switch(v->type) { case ATV_NOVALUE: return ""; - case ATV_REFERENCED: - { - asn1p_ref_t *ref; - char reflen; - char *ptr; - int i; - - assert(v->value.reference); - ref = v->value.reference; - reflen = ref->comp_count; /* Number of dots */ - for(i = 0; i < ref->comp_count; i++) - reflen += strlen(ref->components[i].name); - /* - * Make sure we have a buffer of this size. - */ - ENSURE(reflen); - - /* - * Fill-up the buffer. - */ - ptr = managedptr; - for(i = 0; i < ref->comp_count; i++) { - char *nc; - if(i) *ptr++ = '.'; - for(nc = ref->components[i].name; *nc; nc++) - *ptr++ = *nc; - } - *ptr++ = '\0'; - assert(reflen == (ptr - managedptr)); - return managedptr; - } + case ATV_NULL: + return "NULL"; case ATV_REAL: ret = snprintf(buf, sizeof(buf), "%f", v->value.v_double); if(ret >= (ssize_t)sizeof(buf)) @@ -141,6 +113,55 @@ asn1f_printable_value(asn1p_value_t *v) { assert((ptr - managedptr) == len); return managedptr; } + case ATV_REFERENCED: + { + asn1p_ref_t *ref; + char reflen; + char *ptr; + int i; + + assert(v->value.reference); + ref = v->value.reference; + reflen = ref->comp_count; /* Number of dots */ + for(i = 0; i < ref->comp_count; i++) + reflen += strlen(ref->components[i].name); + /* + * Make sure we have a buffer of this size. + */ + ENSURE(reflen); + + /* + * Fill-up the buffer. + */ + ptr = managedptr; + for(i = 0; i < ref->comp_count; i++) { + char *nc; + if(i) *ptr++ = '.'; + for(nc = ref->components[i].name; *nc; nc++) + *ptr++ = *nc; + } + *ptr++ = '\0'; + assert(reflen == (ptr - managedptr)); + return managedptr; + } + case ATV_CHOICE_IDENTIFIER: + { + char *cid = v->value.choice_identifier.identifier; + char const *vptr = asn1f_printable_value( + v->value.choice_identifier.value); + char *val; + + val = strdup(vptr); + if(!val) return ""; + + ENSURE(strlen(cid) + sizeof(": ") + strlen(val)); + + ret = snprintf(managedptr, managedptr_len + 1, + "%s: %s", cid, val); + assert(ret >= 0 && ret <= managedptr_len); + free(val); + return managedptr; + } } return ""; From f98e07a5128f3f6c52cfc92f220ce5ab43d08678 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Sep 2004 11:46:47 +0000 Subject: [PATCH 0337/1469] recursive importing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@337 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_retrieve.c | 41 ++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/libasn1fix/asn1fix_retrieve.c b/libasn1fix/asn1fix_retrieve.c index 97e77fed0..4e0eee9a6 100644 --- a/libasn1fix/asn1fix_retrieve.c +++ b/libasn1fix/asn1fix_retrieve.c @@ -23,15 +23,14 @@ asn1f_lookup_child(asn1p_expr_t *tc, const char *name) { } asn1p_module_t * -asn1f_lookup_in_imports(arg_t *arg, const char *name) { - asn1p_module_t *mod; +asn1f_lookup_in_imports(arg_t *arg, asn1p_module_t *mod, const char *name) { asn1p_xports_t *xp; asn1p_expr_t *tc; /* * Search in which exactly module this name is defined. */ - TQ_FOR(xp, &(arg->mod->imports), xp_next) { + TQ_FOR(xp, &(mod->imports), xp_next) { TQ_FOR(tc, &(xp->members), next) { if(strcmp(name, tc->Identifier) == 0) break; @@ -137,7 +136,7 @@ asn1f_lookup_module(arg_t *arg, const char *module_name, asn1p_oid_t *oid) { asn1p_expr_t * asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { asn1p_expr_t *ref_tc; /* Referenced tc */ - asn1p_module_t *src_mod; + asn1p_module_t *imports_from; char *modulename; char *identifier; @@ -188,8 +187,8 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { * fetch that module. */ if(modulename) { - src_mod = asn1f_lookup_module(arg, modulename, 0); - if(src_mod == NULL) { + imports_from = asn1f_lookup_module(arg, modulename, 0); + if(imports_from == NULL) { FATAL("Module \"%s\" " "mentioned at line %d is not found", modulename, ref->_lineno); @@ -200,13 +199,13 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { * Check that the EXPORTS section of this module contains * the symbol we care about, or it is EXPORTS ALL. */ - if(asn1f_compatible_with_exports(arg, src_mod, identifier)) { + if(asn1f_compatible_with_exports(arg,imports_from,identifier)) { errno = EPERM; return NULL; } } else { - src_mod = asn1f_lookup_in_imports(arg, identifier); - if(src_mod == NULL && errno != ESRCH) { + imports_from = asn1f_lookup_in_imports(arg, mod, identifier); + if(imports_from == NULL && errno != ESRCH) { /* * Return only of the name was not found. * If module was not found or more serious error @@ -216,12 +215,28 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { } } - if(src_mod == 0) src_mod = mod; + /* + * The symbol is being imported from another module. + */ + if(imports_from) { + asn1p_ref_t tmpref = *ref; + if(modulename) { + /* + * The modulename is specified inside this reference. + * To avoid recursion, reformat the reference + * as it were local to that module. + */ + tmpref.components++; /* Hide the first element */ + tmpref.comp_count--; + assert(tmpref.comp_count > 0); + } + return asn1f_lookup_symbol(arg, imports_from, &tmpref); + } /* - * Now we know where to search for a value. + * Now we know where to search for a value: in the current module. */ - TQ_FOR(ref_tc, &(src_mod->members), next) { + TQ_FOR(ref_tc, &(mod->members), next) { if(ref_tc->Identifier) if(strcmp(ref_tc->Identifier, identifier) == 0) break; @@ -229,7 +244,7 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { if(ref_tc == NULL) { DEBUG("Module \"%s\" does not contain \"%s\" " "mentioned at line %d: %s", - src_mod->Identifier, + mod->Identifier, identifier, ref->_lineno, strerror(errno) From 71ad49644415cdc2cb528b72eb7a477e7d5c880b Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Sep 2004 11:47:02 +0000 Subject: [PATCH 0338/1469] some debugs made fatal git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@338 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_value.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/libasn1fix/asn1fix_value.c b/libasn1fix/asn1fix_value.c index 80223d605..ab7e9a359 100644 --- a/libasn1fix/asn1fix_value.c +++ b/libasn1fix/asn1fix_value.c @@ -13,6 +13,9 @@ asn1f_value_resolve(arg_t *arg, asn1p_expr_t *expr) { assert(expr->meta_type == AMT_VALUE); assert(expr->value); + if(expr->value->type != ATV_REFERENCED) + return 0; + DEBUG("%s(=\"%s\", %x)", __func__, asn1f_printable_value(expr->value), expr->expr_type); @@ -26,8 +29,10 @@ asn1f_value_resolve(arg_t *arg, asn1p_expr_t *expr) { return -1; } - if(asn1f_look_value_in_type(arg, type_expr, expr) == -1) + if(asn1f_look_value_in_type(arg, type_expr, expr) == -1) { + FATAL("Value not found in type for %s", expr->Identifier); return -1; + } /* * 2. Find the terminal value also. @@ -38,7 +43,7 @@ asn1f_value_resolve(arg_t *arg, asn1p_expr_t *expr) { expr->Identifier, asn1f_printable_value(expr->value), value_expr->Identifier, value_expr->_lineno); } else { - DEBUG("\tTerminal value for %s->%s not found", + FATAL("Terminal value for %s->%s not found", expr->Identifier, asn1f_printable_value(expr->value)); return -1; } @@ -53,7 +58,7 @@ asn1f_value_resolve(arg_t *arg, asn1p_expr_t *expr) { expr->Identifier, asn1f_printable_value(expr->value), val_type_expr->Identifier, val_type_expr->_lineno); } else { - DEBUG("\tTerminal type of value %s->%s not found", + FATAL("\tTerminal type of value %s->%s not found", expr->Identifier, asn1f_printable_value(expr->value)); return -1; } @@ -94,7 +99,7 @@ asn1f_value_resolve(arg_t *arg, asn1p_expr_t *expr) { */ ret = _asn1f_copy_value(arg, expr, value_expr); if(ret == -1) { - DEBUG("\tValue %s cannot be copied from line %d to line %d", + FATAL("Value %s cannot be copied from line %d to line %d", asn1f_printable_value(value_expr->value), value_expr->_lineno, expr->_lineno); return -1; From a57277e696194244ba7ebac970f7bc0015779429 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Sep 2004 11:47:23 +0000 Subject: [PATCH 0339/1469] fixing all in module before checking constraints git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@339 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/libasn1fix/asn1fix.c b/libasn1fix/asn1fix.c index 4a279325c..02df593a8 100644 --- a/libasn1fix/asn1fix.c +++ b/libasn1fix/asn1fix.c @@ -12,7 +12,8 @@ static void _default_error_logger(int _severity, const char *fmt, ...); /* * Internal check functions. */ -static int asn1f_fix_module(arg_t *arg); +static int asn1f_fix_module__phase_1(arg_t *arg); +static int asn1f_fix_module__phase_2(arg_t *arg); static int asn1f_fix_simple(arg_t *arg); /* For INTEGER/ENUMERATED */ static int asn1f_fix_constructed(arg_t *arg); /* For SEQUENCE/SET/CHOICE */ static int asn1f_resolve_constraints(arg_t *arg); /* For subtype constraints */ @@ -79,7 +80,7 @@ asn1f_process(asn1p_t *asn, enum asn1f_flags flags, * Process each module in the list. */ TQ_FOR(arg.mod, &(asn->modules), mod_next) { - int ret = asn1f_fix_module(&arg); + int ret = asn1f_fix_module__phase_1(&arg); /* * These lines are used for illustration purposes. * RET2RVAL() is used everywhere else. @@ -87,6 +88,13 @@ asn1f_process(asn1p_t *asn, enum asn1f_flags flags, if(ret == -1) fatals++; if(ret == 1) warnings++; } + TQ_FOR(arg.mod, &(asn->modules), mod_next) { + int ret = asn1f_fix_module__phase_2(&arg); + if(ret == -1) fatals++; + if(ret == 1) warnings++; + } + + memset(&a1f_replace_me_with_proper_interface_arg, 0, sizeof(arg_t)); memset(&a1f_replace_me_with_proper_interface_arg, 0, sizeof(arg_t)); @@ -100,7 +108,7 @@ asn1f_process(asn1p_t *asn, enum asn1f_flags flags, * Check the internals of a single module. */ static int -asn1f_fix_module(arg_t *arg) { +asn1f_fix_module__phase_1(arg_t *arg) { asn1p_expr_t *expr; int rvalue = 0; int ret; @@ -239,6 +247,15 @@ asn1f_fix_module(arg_t *arg) { assert(arg->expr == expr); } + return rvalue; +} + +static int +asn1f_fix_module__phase_2(arg_t *arg) { + asn1p_expr_t *expr; + int rvalue = 0; + int ret; + /* * Check semantic validity of constraints. */ @@ -258,7 +275,6 @@ asn1f_fix_module(arg_t *arg) { return rvalue; } - static int asn1f_fix_simple(arg_t *arg) { int rvalue = 0; From 387a08857c7e958342b0f3a47b1c5af891a8c4a1 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Sep 2004 11:48:34 +0000 Subject: [PATCH 0340/1469] condition on non-tagged root and tagged extensions is only valid when automatic tags is in effect; also go into CHOICE or type only when it is untagged git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@340 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_constr.c | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/libasn1fix/asn1fix_constr.c b/libasn1fix/asn1fix_constr.c index 7a45cd97e..66e7450e8 100644 --- a/libasn1fix/asn1fix_constr.c +++ b/libasn1fix/asn1fix_constr.c @@ -229,16 +229,19 @@ asn1f_fix_constr_tag(arg_t *arg, int fix_top_level) { } - if(ext_tagged && !root_tagged) { - FATAL("In %s at line %d: " - "extensions are tagged " - "but root components are not", - expr->Identifier, expr->_lineno); - r_value = -1; - } else if(!root_tagged && !ext_tagged - && (arg->mod->module_flags & MSF_AUTOMATIC_TAGS)) { - /* Make a decision on automatic tagging */ - expr->auto_tags_OK = 1; + if((arg->mod->module_flags & MSF_AUTOMATIC_TAGS) + && !root_tagged) { + if(ext_tagged) { + /* X.690: 28.4 */ + FATAL("In %s at line %d: " + "extensions are tagged " + "but root components are not", + expr->Identifier, expr->_lineno); + r_value = -1; + } else { + /* Make a decision on automatic tagging */ + expr->auto_tags_OK = 1; + } } return r_value; @@ -349,13 +352,13 @@ asn1f_check_constr_tags_distinct(arg_t *arg) { * For SET and CHOICE treat everything as a big set of * non-mandatory components. */ - if(expr->expr_type != ASN_CONSTR_SEQUENCE || v->marker) { + if(expr->expr_type != ASN_CONSTR_SEQUENCE || v->marker.flags) { asn1p_expr_t *nv; for(nv = v; (nv = TQ_NEXT(nv, next));) { if(_asn1f_compare_tags(arg, v, nv)) r_value = -1; if(expr->expr_type == ASN_CONSTR_SEQUENCE - && !nv->marker) break; + && !nv->marker.flags) break; } } } @@ -421,8 +424,10 @@ _asn1f_compare_tags(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b) { ) { char *p = (a->expr_type == A1TC_EXTENSIBLE) ?"potentially ":""; - FATAL("Component \"%s\" at line %d %shas the same tag " + FATAL("Processing %s at line %d: component \"%s\" at line %d %shas the same tag " "with component \"%s\" at line %d", + arg->expr->Identifier, + arg->expr->_lineno, a->Identifier, a->_lineno, p, @@ -454,7 +459,7 @@ _asn1f_compare_tags(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b) { a->Identifier, a->expr_type, b->Identifier, b->expr_type); - if(a->meta_type == AMT_TYPEREF) { + if(ra && a->meta_type == AMT_TYPEREF) { DEBUG(" %s is a type reference", a->Identifier); @@ -464,7 +469,7 @@ _asn1f_compare_tags(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b) { return ret; } - if(a->expr_type == ASN_CONSTR_CHOICE) { + if(ra && a->expr_type == ASN_CONSTR_CHOICE) { asn1p_expr_t *v; DEBUG(" %s is a choice type (%d)", a->Identifier, a->_mark); @@ -482,7 +487,7 @@ _asn1f_compare_tags(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b) { return 0; } - if(b->expr_type == ASN_CONSTR_CHOICE) { + if(rb && b->expr_type == ASN_CONSTR_CHOICE) { return _asn1f_compare_tags(arg, b, a); } From ca5c2433698dee547c3226dba37b067589b0c48d Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Sep 2004 11:48:47 +0000 Subject: [PATCH 0341/1469] add explicit module specification git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@341 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_retrieve.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libasn1fix/asn1fix_retrieve.h b/libasn1fix/asn1fix_retrieve.h index 7088b4934..8ab026070 100644 --- a/libasn1fix/asn1fix_retrieve.h +++ b/libasn1fix/asn1fix_retrieve.h @@ -20,7 +20,7 @@ asn1p_expr_t *asn1f_lookup_child(asn1p_expr_t *tc, const char *name); * NULL/EPERM: The name was not found in EXPORTS section of the source module. * Also, NULL with errno values defined by asn1f_lookup_module(). */ -asn1p_module_t *asn1f_lookup_in_imports(arg_t *arg, const char *name); +asn1p_module_t *asn1f_lookup_in_imports(arg_t *arg, asn1p_module_t *mod, const char *name); /* * Return a module by its name or optional OID. From 895c633ff456dc4bd02df833758adb3e9707073b Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Sep 2004 11:52:28 +0000 Subject: [PATCH 0342/1469] check pretty-printing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@342 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/04-enum-SE.asn1.-E | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 tests/04-enum-SE.asn1.-E diff --git a/tests/04-enum-SE.asn1.-E b/tests/04-enum-SE.asn1.-E new file mode 100644 index 000000000..c908ea5f3 --- /dev/null +++ b/tests/04-enum-SE.asn1.-E @@ -0,0 +1,17 @@ + +ModuleTestEnum2 {iso org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 4 } +DEFINITIONS ::= +BEGIN + +enum1 Enum1 ::= blue + +Enum1 ::= ENUMERATED { + red, + green, + ..., + blue(1) +} + +END From c4dadcdc30ed3a545440146f5491121abbee716f Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Sep 2004 11:53:04 +0000 Subject: [PATCH 0343/1469] check recursive resolver git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@343 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/14-resolver-OK.asn1 | 29 +++++++++++++++++--- tests/14-resolver-OK.asn1.-EF | 51 +++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 tests/14-resolver-OK.asn1.-EF diff --git a/tests/14-resolver-OK.asn1 b/tests/14-resolver-OK.asn1 index 48fb0cc3c..4b0df810c 100644 --- a/tests/14-resolver-OK.asn1 +++ b/tests/14-resolver-OK.asn1 @@ -5,19 +5,26 @@ -- .spelio.software.asn1c.test (9363.1.5.1) -- .14 1 -- .14 2 +-- .14 3 ModuleTestResolver2 { iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 14 1 } DEFINITIONS ::= BEGIN - IMPORTS Enumeration, beta FROM + IMPORTS Enumeration, beta, gamma FROM OtherModuleRenamed { iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 14 2 }; - -- external reference + -- external references alpha Enumeration ::= beta + other Enumeration ::= gamma + + Struct ::= SEQUENCE { + member1 [1] ModuleTestResolver3.Enumeration OPTIONAL, + member2 [2] OtherModuleRenamed.Enumeration DEFAULT b + } -- -- The following are for post-fix checking by the check_fixer. @@ -26,6 +33,7 @@ BEGIN -- check-alpha INTEGER ::= 2 + check-other INTEGER ::= 1 END @@ -34,12 +42,25 @@ ModuleTestResolver3 spelio(9363) software(1) asn1c(5) test(1) 14 2 } DEFINITIONS ::= BEGIN - EXPORTS Enumeration, beta ; + EXPORTS Enumeration, beta, gamma; + IMPORTS gamma, HiddenEnum FROM HiddenModule; beta HiddenEnum ::= b + Enumeration ::= ENUMERATED { a(1), b(2) } -- the same type -- + +END + +HiddenModule + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 14 3 } + DEFINITIONS ::= +BEGIN + EXPORTS HiddenEnum, gamma; + IMPORTS Enumeration FROM ModuleTestResolver3; + HiddenEnum ::= ENUMERATED { a(1), b(2) } - Enumeration ::= ENUMERATED { a(1), b(2) } -- the same type -- + gamma Enumeration ::= a END diff --git a/tests/14-resolver-OK.asn1.-EF b/tests/14-resolver-OK.asn1.-EF new file mode 100644 index 000000000..7070bc8e4 --- /dev/null +++ b/tests/14-resolver-OK.asn1.-EF @@ -0,0 +1,51 @@ + +ModuleTestResolver2 {iso org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 14 1 } +DEFINITIONS ::= +BEGIN + +alpha Enumeration ::= 2 + +other Enumeration ::= 1 + +Struct ::= SEQUENCE { + member1 [1] EXPLICIT ModuleTestResolver3.Enumeration OPTIONAL, + member2 [2] EXPLICIT OtherModuleRenamed.Enumeration DEFAULT 2 +} + +check-alpha INTEGER ::= 2 + +check-other INTEGER ::= 1 + +END + +ModuleTestResolver3 {iso org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 14 2 } +DEFINITIONS ::= +BEGIN + +beta HiddenEnum ::= 2 + +Enumeration ::= ENUMERATED { + a(1), + b(2) +} + +END + +HiddenModule {iso org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 14 3 } +DEFINITIONS ::= +BEGIN + +HiddenEnum ::= ENUMERATED { + a(1), + b(2) +} + +gamma Enumeration ::= 1 + +END From c23e15be501d7d607532e6dd1941647e982529bd Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Sep 2004 11:53:22 +0000 Subject: [PATCH 0344/1469] check DEFAULT resolver git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@344 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/24-sequence-OK.asn1 | 4 +++- tests/24-sequence-OK.asn1.-EF | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/24-sequence-OK.asn1 b/tests/24-sequence-OK.asn1 index 851ebf0d2..ce6f6d6e7 100644 --- a/tests/24-sequence-OK.asn1 +++ b/tests/24-sequence-OK.asn1 @@ -14,8 +14,10 @@ BEGIN T ::= [5] EXPLICIT SEQUENCE { a INTEGER, b [0] INTEGER OPTIONAL, - c [1] INTEGER DEFAULT 10, + c [1] INTEGER DEFAULT ten, d [5] EXPLICIT INTEGER } + ten INTEGER ::= 10 + END diff --git a/tests/24-sequence-OK.asn1.-EF b/tests/24-sequence-OK.asn1.-EF index f8507c09e..87740d67d 100644 --- a/tests/24-sequence-OK.asn1.-EF +++ b/tests/24-sequence-OK.asn1.-EF @@ -8,8 +8,10 @@ BEGIN T ::= [5] EXPLICIT SEQUENCE { a INTEGER, b [0] IMPLICIT INTEGER OPTIONAL, - c [1] IMPLICIT INTEGER DEFAULT , + c [1] IMPLICIT INTEGER DEFAULT 10, d [5] EXPLICIT INTEGER } +ten INTEGER ::= 10 + END From 48f87889df76d9873ba34ddf28de61ae5ff560c4 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Sep 2004 11:53:38 +0000 Subject: [PATCH 0345/1469] check distinct tags fixer git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@345 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/37-indirect-choice-OK.asn1 | 3 ++- tests/37-indirect-choice-OK.asn1.-EF | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/37-indirect-choice-OK.asn1 b/tests/37-indirect-choice-OK.asn1 index 9204c1c02..612479058 100644 --- a/tests/37-indirect-choice-OK.asn1 +++ b/tests/37-indirect-choice-OK.asn1 @@ -26,7 +26,8 @@ BEGIN Choice2 ::= [2] CHOICE { c-a OCTET STRING, c-b INTEGER, - c-d [3] Choice1 + c-d [3] Choice1, + c-e [4] Choice1 } Choice3 ::= [3] EXPLICIT Choice2 -- tags [3] [2] diff --git a/tests/37-indirect-choice-OK.asn1.-EF b/tests/37-indirect-choice-OK.asn1.-EF index e975dde49..88f7b03b1 100644 --- a/tests/37-indirect-choice-OK.asn1.-EF +++ b/tests/37-indirect-choice-OK.asn1.-EF @@ -20,7 +20,8 @@ Choice1 ::= CHOICE { Choice2 ::= [2] EXPLICIT CHOICE { c-a OCTET STRING, c-b INTEGER, - c-d [3] EXPLICIT Choice1 + c-d [3] EXPLICIT Choice1, + c-e [4] EXPLICIT Choice1 } Choice3 ::= [3] EXPLICIT Choice2 From 2cbc386d8eb8f4c968db6da54420efc763a53e64 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Sep 2004 11:54:10 +0000 Subject: [PATCH 0346/1469] using the value git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@346 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-43.c | 1 + 1 file changed, 1 insertion(+) diff --git a/asn1c/tests/check-43.c b/asn1c/tests/check-43.c index bb5c219d2..4a6138547 100644 --- a/asn1c/tests/check-43.c +++ b/asn1c/tests/check-43.c @@ -17,6 +17,7 @@ main(int ac, char **av) { (void)av; /* Unused argument */ memset(&ts1, 0, sizeof(ts1)); + memset(&cs1, 0, sizeof(cs1)); /* * No plans to fill it up: just checking whether it compiles or not. From a02b74df32ce4083e153ba1b04e270d223ed3e3d Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Sep 2004 11:54:38 +0000 Subject: [PATCH 0347/1469] marker definition changed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@347 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 7762bcd3c..0e356aeb8 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -139,12 +139,12 @@ asn1c_lang_C_type_SEQUENCE(arg_t *arg) { } if(comp_mode == 1 || expr_better_indirect(arg, v)) - v->marker |= EM_INDIRECT; + v->marker.flags |= EM_INDIRECT; EMBED(v); } PCTX_DEF; - OUT("} %s%s%s", expr->marker?"*":"", + OUT("} %s%s%s", expr->marker.flags?"*":"", expr->_anonymous_type ? "" : MKID(expr->Identifier), arg->embed ? "" : "_t"); @@ -281,7 +281,7 @@ asn1c_lang_C_type_SET(arg_t *arg) { } if(comp_mode == 1 || expr_better_indirect(arg, v)) - v->marker |= EM_INDIRECT; + v->marker.flags |= EM_INDIRECT; EMBED(v); } @@ -295,7 +295,7 @@ asn1c_lang_C_type_SET(arg_t *arg) { ); PCTX_DEF; - OUT("} %s%s%s", expr->marker?"*":"", + OUT("} %s%s%s", expr->marker.flags?"*":"", expr->_anonymous_type ? "" : MKID(expr->Identifier), arg->embed ? "" : "_t"); @@ -342,7 +342,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { } else { if(comp_mode == 1 || expr_better_indirect(arg, v)) - v->marker |= EM_INDIRECT; + v->marker.flags |= EM_INDIRECT; elements++; emit_member_table(arg, v); } @@ -379,7 +379,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { OUT(" | "); } OUT("(%d << %d)", - v->marker?0:1, + v->marker.flags?0:1, 7 - (el % 8)); if(el && (el % 8) == 0) delimit = 1; @@ -458,7 +458,7 @@ asn1c_lang_C_type_SEx_OF(arg_t *arg) { INDENT(-1); PCTX_DEF; - OUT("} %s%s%s", expr->marker?"*":"", + OUT("} %s%s%s", expr->marker.flags?"*":"", expr->_anonymous_type ? "" : MKID(expr->Identifier), arg->embed ? "" : "_t"); @@ -569,7 +569,7 @@ asn1c_lang_C_type_CHOICE(arg_t *arg) { OUT("union {\n", id); TQ_FOR(v, &(expr->members), next) { if(expr_better_indirect(arg, v)) - v->marker |= EM_INDIRECT; + v->marker.flags |= EM_INDIRECT; EMBED(v); } if(UNNAMED_UNIONS) OUT("};\n"); @@ -577,7 +577,7 @@ asn1c_lang_C_type_CHOICE(arg_t *arg) { ); PCTX_DEF; - OUT("} %s%s%s", expr->marker?"*":"", + OUT("} %s%s%s", expr->marker.flags?"*":"", expr->_anonymous_type ? "" : MKID(expr->Identifier), arg->embed ? "" : "_t"); @@ -624,7 +624,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { } else { if(comp_mode == 1 || expr_better_indirect(arg, v)) - v->marker |= EM_INDIRECT; + v->marker.flags |= EM_INDIRECT; elements++; emit_member_table(arg, v); } @@ -729,12 +729,13 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { REDIR(OT_TYPE_DECLS); OUT("%s\t", asn1c_type_name(arg, arg->expr, - expr->marker?TNF_RSAFE:TNF_CTYPE)); - OUT("%s", expr->marker?"*":" "); + expr->marker.flags?TNF_RSAFE:TNF_CTYPE)); + OUT("%s", expr->marker.flags?"*":" "); OUT("%s", MKID(expr->Identifier)); - if((expr->marker & EM_DEFAULT) == EM_DEFAULT) - OUT("\t/* DEFAULT */"); - else if((expr->marker & EM_OPTIONAL) == EM_OPTIONAL) + if((expr->marker.flags & EM_DEFAULT) == EM_DEFAULT) + OUT("\t/* DEFAULT %s */", + asn1f_printable_value(expr->marker.default_value)); + else if((expr->marker.flags & EM_OPTIONAL) == EM_OPTIONAL) OUT("\t/* OPTIONAL */"); REDIR(OT_TYPE_DECLS); @@ -747,7 +748,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { REDIR(OT_TYPE_DECLS); OUT("typedef %s\t", asn1c_type_name(arg, arg->expr, TNF_CTYPE)); - OUT("%s", expr->marker?"*":" "); + OUT("%s", expr->marker.flags?"*":" "); OUT("%s_t", MKID(expr->Identifier)); REDIR(OT_STAT_DEFS); @@ -1241,11 +1242,11 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { if(outmost_tag && outmost_tag->tag_value == -1) OUT("ATF_OPEN_TYPE | "); - OUT("%s, ", expr->marker?"ATF_POINTER":"ATF_NOFLAGS"); - if((expr->marker & EM_OPTIONAL) == EM_OPTIONAL) { + OUT("%s, ", expr->marker.flags?"ATF_POINTER":"ATF_NOFLAGS"); + if((expr->marker.flags & EM_OPTIONAL) == EM_OPTIONAL) { asn1p_expr_t *tv; int opts = 0; - for(tv = expr; tv && tv->marker; + for(tv = expr; tv && tv->marker.flags; tv = TQ_NEXT(tv, next), opts++) { if(tv->expr_type == A1TC_EXTENSIBLE) opts--; From 6ac9b0dc46b9afee3dbd6c51cbbd1691c9410af6 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Sep 2004 11:59:30 +0000 Subject: [PATCH 0348/1469] extended marker git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@348 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_expr.c | 5 ++++- libasn1parser/asn1p_expr.h | 13 ++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/libasn1parser/asn1p_expr.c b/libasn1parser/asn1p_expr.c index 755196f36..c3c31f2c3 100644 --- a/libasn1parser/asn1p_expr.c +++ b/libasn1parser/asn1p_expr.c @@ -46,7 +46,7 @@ asn1p_expr_clone(asn1p_expr_t *expr, int skip_extensions) { CLCOPY(meta_type); CLCOPY(expr_type); CLCOPY(tag); - CLCOPY(marker); /* OPTIONAL/DEFAULT */ + CLCOPY(marker.flags); /* OPTIONAL/DEFAULT */ CLCOPY(module); CLCOPY(_mark); @@ -62,6 +62,7 @@ asn1p_expr_clone(asn1p_expr_t *expr, int skip_extensions) { CLCLONE(combined_constraints, asn1p_constraint_clone); CLCLONE(params, asn1p_paramlist_clone); CLCLONE(value, asn1p_value_clone); + CLCLONE(marker.default_value, asn1p_value_clone); CLCLONE(with_syntax, asn1p_wsyntx_clone); /* @@ -128,6 +129,8 @@ asn1p_expr_free(asn1p_expr_t *expr) { asn1p_paramlist_free(expr->params); if(expr->value) asn1p_value_free(expr->value); + if(expr->marker.default_value) + asn1p_value_free(expr->marker.default_value); if(expr->with_syntax) asn1p_wsyntx_free(expr->with_syntax); diff --git a/libasn1parser/asn1p_expr.h b/libasn1parser/asn1p_expr.h index 2c284ff05..4cdcd41fd 100644 --- a/libasn1parser/asn1p_expr.h +++ b/libasn1parser/asn1p_expr.h @@ -173,11 +173,14 @@ typedef struct asn1p_expr_s { asn1_integer_t tag_value; } tag; - enum asn1p_expr_marker_e { - EM_NOMARK, - EM_INDIRECT = 0x01, /* 0001: Represent as pointer */ - EM_OPTIONAL = 0x03, /* 0011: Optional member */ - EM_DEFAULT = 0x07, /* 0111: FIXME: store the value */ + struct asn1p_expr_marker_s { + enum asn1p_expr_marker_e { + EM_NOMARK, + EM_INDIRECT = 0x01, /* 0001: Represent as pointer */ + EM_OPTIONAL = 0x03, /* 0011: Optional member */ + EM_DEFAULT = 0x07, /* 0111: default_value */ + } flags; + asn1p_value_t *default_value; /* For EM_DEFAULT case */ } marker; int unique; /* UNIQUE */ From c94e28fa0a1c2d3bf19ec011001857c680fb0c10 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Sep 2004 11:59:51 +0000 Subject: [PATCH 0349/1469] DEFAULT type support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@349 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_l.c | 2906 +++++++++++++++++------------------ libasn1parser/asn1p_l.l | 9 +- libasn1parser/asn1p_value.c | 37 +- libasn1parser/asn1p_value.h | 12 +- libasn1parser/asn1p_y.c | 1299 ++++++++-------- libasn1parser/asn1p_y.h | 2 +- libasn1parser/asn1p_y.y | 75 +- 7 files changed, 2196 insertions(+), 2144 deletions(-) diff --git a/libasn1parser/asn1p_l.c b/libasn1parser/asn1p_l.c index f40f7a384..2d0c30754 100644 --- a/libasn1parser/asn1p_l.c +++ b/libasn1parser/asn1p_l.c @@ -312,154 +312,152 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 132 -#define YY_END_OF_BUFFER 133 -static yyconst short int yy_acclist[1291] = +#define YY_NUM_RULES 131 +#define YY_END_OF_BUFFER 132 +static yyconst short int yy_acclist[1266] = { 0, - 133, 131, 132, 125, 131, 132, 125, 132, 124, 131, - 132, 15, 131, 132, 124, 131, 132, 131, 132, 124, - 131, 132, 131, 132, 124, 131, 132, 131, 132, 29, - 131, 132, 28, 131, 132, 124, 131, 132, 131, 132, - 119, 120, 131, 132, 119, 120, 131, 132, 119, 120, - 131, 132, 119, 120, 131, 132, 119, 120, 131, 132, - 119, 120, 131, 132, 119, 120, 131, 132, 119, 120, - 131, 132, 119, 120, 131, 132, 119, 120, 131, 132, - 119, 120, 131, 132, 119, 120, 131, 132, 119, 120, - 131, 132, 119, 120, 131, 132, 119, 120, 131, 132, - - 119, 120, 131, 132, 119, 120, 131, 132, 119, 120, - 131, 132, 119, 120, 131, 132, 124, 131, 132, 130, - 131, 132, 118, 131, 132, 124, 130, 131, 132, 5, - 131, 132, 2, 132, 2, 131, 132, 4, 131, 132, - 7, 9, 131, 132, 7, 132, 9, 131, 132, 9, - 131, 132, 17, 131, 132, 17, 132, 18, 131, 132, - 12, 131, 132, 12, 132, 14, 131, 132, 14, 131, - 132, 10, 131, 132, 11, 131, 132, 21, 23, 131, - 132, 23, 131, 132, 24, 132, 21, 22, 23, 131, - 132, 21, 22, 23, 131, 132, 127, 131, 132, 128, - - 131, 132, 128, 132, 131, 132, 129, 131, 132, 125, - 15, 15, 116, 117, 1, 27, 123, 6, 28, 119, - 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, - 120, 120, 119, 120, 119, 120, 119, 120, 119, 120, - 42, 119, 120, 119, 120, 119, 120, 119, 120, 119, - 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, - 120, 120, 120, 119, 120, 119, 120, 119, 120, 119, - 120, 119, 120, 119, 120, 119, 120, 119, 120, 120, - 119, 120, 119, 120, 87, 119, 120, 119, 120, 120, - 119, 120, 119, 120, 119, 120, 119, 120, 120, 119, - - 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, - 120, 119, 120, 119, 120, 119, 120, 120, 119, 120, - 119, 120, 120, 120, 119, 120, 118, 5, 3, 8, - 17, 16, 12, 21, 21, 22, 21, 22, 127, 128, - 126, 116, 117, 27, 122, 121, 119, 120, 34, 119, - 120, 35, 119, 120, 119, 120, 119, 120, 119, 120, - 39, 119, 120, 119, 120, 119, 120, 119, 120, 119, - 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, - 120, 119, 120, 56, 119, 120, 119, 120, 119, 120, - 119, 120, 119, 120, 119, 120, 119, 120, 120, 120, - - 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, - 119, 120, 119, 120, 79, 119, 120, 80, 119, 120, - 119, 120, 120, 119, 120, 119, 120, 119, 120, 120, - 119, 120, 90, 119, 120, 119, 120, 119, 120, 119, - 120, 120, 119, 120, 119, 120, 119, 120, 98, 119, - 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, - 120, 119, 120, 119, 120, 120, 119, 120, 119, 120, - 119, 120, 120, 120, 120, 119, 120, 30, 13, 21, - 22, 20, 21, 22, 26, 25, 119, 120, 119, 120, - 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, - - 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, - 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, - 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, - 119, 120, 64, 119, 120, 120, 120, 119, 120, 119, - 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, - 120, 119, 120, 119, 120, 82, 119, 120, 120, 119, - 120, 119, 120, 119, 120, 120, 119, 120, 119, 120, - 119, 120, 119, 120, 120, 95, 119, 120, 119, 120, - 119, 120, 99, 119, 120, 119, 120, 119, 120, 119, - 120, 103, 119, 120, 105, 119, 120, 119, 120, 120, - - 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, - 120, 120, 120, 115, 119, 120, 21, 22, 119, 120, - 119, 120, 119, 120, 119, 120, 38, 119, 120, 120, - 119, 120, 119, 120, 119, 120, 45, 119, 120, 119, - 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, - 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, - 120, 119, 120, 119, 120, 63, 119, 120, 120, 120, - 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, - 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, - 120, 120, 119, 120, 86, 119, 120, 119, 120, 120, - - 119, 120, 119, 120, 119, 120, 119, 120, 120, 119, - 120, 119, 120, 119, 120, 119, 120, 120, 119, 120, - 120, 107, 119, 120, 119, 120, 119, 120, 120, 119, - 120, 120, 120, 120, 31, 21, 22, 32, 119, 120, - 119, 120, 119, 120, 119, 120, 120, 119, 120, 119, - 120, 44, 119, 120, 119, 120, 119, 120, 119, 120, - 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, - 119, 120, 119, 120, 58, 119, 120, 119, 120, 119, - 120, 119, 120, 119, 120, 120, 120, 120, 119, 120, - 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, - - 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, - 120, 84, 119, 120, 119, 120, 120, 119, 120, 119, - 120, 119, 120, 119, 120, 120, 119, 120, 119, 120, - 100, 119, 120, 101, 119, 120, 120, 119, 120, 120, - 108, 119, 120, 119, 120, 120, 120, 120, 120, 120, - 21, 22, 119, 120, 119, 120, 119, 120, 120, 41, - 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, - 50, 119, 120, 51, 119, 120, 119, 120, 119, 120, - 54, 119, 120, 119, 120, 119, 120, 119, 120, 60, - 119, 120, 119, 120, 119, 120, 120, 120, 120, 119, - - 120, 119, 120, 71, 119, 120, 72, 119, 120, 119, - 120, 119, 120, 119, 120, 76, 119, 120, 119, 120, - 119, 120, 119, 120, 120, 119, 120, 120, 89, 119, - 120, 119, 120, 92, 119, 120, 94, 119, 120, 120, - 119, 120, 119, 120, 120, 119, 120, 120, 119, 120, - 111, 120, 120, 120, 120, 120, 21, 22, 119, 120, - 119, 120, 119, 120, 120, 119, 120, 119, 120, 119, - 120, 119, 120, 119, 120, 53, 119, 120, 119, 120, - 119, 120, 59, 119, 120, 119, 120, 62, 119, 120, - 120, 120, 120, 120, 119, 120, 70, 119, 120, 73, - - 119, 120, 74, 119, 120, 119, 120, 119, 120, 120, - 119, 120, 120, 88, 119, 120, 120, 119, 120, 120, - 119, 120, 97, 119, 120, 120, 119, 120, 120, 119, - 120, 120, 120, 120, 120, 21, 22, 119, 120, 119, - 120, 37, 119, 120, 40, 120, 43, 119, 120, 46, - 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, - 119, 120, 119, 120, 120, 120, 120, 68, 120, 119, - 120, 119, 120, 119, 120, 120, 119, 120, 120, 120, - 119, 120, 120, 119, 120, 102, 120, 119, 120, 120, - 109, 119, 120, 120, 120, 120, 120, 21, 119, 120, - - 119, 120, 47, 119, 120, 48, 119, 120, 49, 119, - 120, 119, 120, 119, 120, 57, 119, 120, 119, 120, - 120, 120, 120, 69, 119, 120, 119, 120, 119, 120, - 120, 119, 120, 120, 120, 119, 120, 120, 119, 120, - 119, 120, 120, 112, 120, 120, 120, 120, 21, 119, - 120, 36, 119, 120, 52, 119, 120, 119, 120, 119, - 120, 120, 120, 120, 119, 120, 119, 120, 120, 119, - 120, 120, 120, 119, 120, 120, 119, 120, 119, 120, - 120, 120, 120, 120, 30, 31, 21, 119, 120, 119, - 120, 119, 120, 120, 120, 120, 75, 119, 120, 77, - - 119, 120, 78, 120, 119, 120, 120, 120, 119, 120, - 120, 96, 119, 120, 119, 120, 120, 120, 120, 120, - 21, 119, 120, 119, 120, 61, 119, 120, 66, 120, - 120, 67, 120, 119, 120, 83, 120, 120, 91, 119, - 120, 120, 119, 120, 104, 120, 120, 120, 114, 120, - 21, 119, 120, 119, 120, 120, 81, 119, 120, 120, - 120, 119, 120, 120, 113, 120, 21, 33, 119, 120, - 119, 120, 65, 120, 120, 93, 120, 106, 119, 120, - 110, 120, 21, 55, 119, 120, 85, 120, 19, 21 + 132, 130, 131, 124, 130, 131, 124, 131, 123, 130, + 131, 15, 130, 131, 123, 130, 131, 130, 131, 123, + 130, 131, 130, 131, 123, 130, 131, 130, 131, 29, + 130, 131, 28, 130, 131, 123, 130, 131, 130, 131, + 118, 119, 130, 131, 118, 119, 130, 131, 118, 119, + 130, 131, 118, 119, 130, 131, 118, 119, 130, 131, + 118, 119, 130, 131, 118, 119, 130, 131, 118, 119, + 130, 131, 118, 119, 130, 131, 118, 119, 130, 131, + 118, 119, 130, 131, 118, 119, 130, 131, 118, 119, + 130, 131, 118, 119, 130, 131, 118, 119, 130, 131, + + 118, 119, 130, 131, 118, 119, 130, 131, 118, 119, + 130, 131, 118, 119, 130, 131, 123, 130, 131, 129, + 130, 131, 117, 130, 131, 123, 129, 130, 131, 5, + 130, 131, 2, 131, 2, 130, 131, 4, 130, 131, + 7, 9, 130, 131, 7, 131, 9, 130, 131, 9, + 130, 131, 17, 130, 131, 17, 131, 18, 130, 131, + 12, 130, 131, 12, 131, 14, 130, 131, 14, 130, + 131, 10, 130, 131, 11, 130, 131, 21, 23, 130, + 131, 23, 130, 131, 24, 131, 21, 22, 23, 130, + 131, 21, 22, 23, 130, 131, 126, 130, 131, 127, + + 130, 131, 127, 131, 130, 131, 128, 130, 131, 124, + 15, 15, 115, 116, 1, 27, 122, 6, 28, 118, + 119, 118, 119, 118, 119, 118, 119, 118, 119, 118, + 119, 119, 118, 119, 118, 119, 118, 119, 118, 119, + 41, 118, 119, 118, 119, 118, 119, 118, 119, 118, + 119, 118, 119, 118, 119, 118, 119, 118, 119, 118, + 119, 119, 119, 118, 119, 118, 119, 118, 119, 118, + 119, 118, 119, 118, 119, 118, 119, 118, 119, 119, + 118, 119, 118, 119, 86, 118, 119, 118, 119, 119, + 118, 119, 118, 119, 118, 119, 118, 119, 119, 118, + + 119, 118, 119, 118, 119, 118, 119, 118, 119, 118, + 119, 118, 119, 118, 119, 118, 119, 119, 118, 119, + 118, 119, 119, 119, 118, 119, 117, 5, 3, 8, + 17, 16, 12, 21, 21, 22, 21, 22, 126, 127, + 125, 115, 116, 27, 121, 120, 118, 119, 33, 118, + 119, 34, 118, 119, 118, 119, 118, 119, 118, 119, + 38, 118, 119, 118, 119, 118, 119, 118, 119, 118, + 119, 118, 119, 118, 119, 118, 119, 118, 119, 118, + 119, 118, 119, 55, 118, 119, 118, 119, 118, 119, + 118, 119, 118, 119, 118, 119, 118, 119, 119, 119, + + 118, 119, 118, 119, 118, 119, 118, 119, 118, 119, + 118, 119, 118, 119, 78, 118, 119, 79, 118, 119, + 118, 119, 119, 118, 119, 118, 119, 118, 119, 119, + 118, 119, 89, 118, 119, 118, 119, 118, 119, 118, + 119, 119, 118, 119, 118, 119, 118, 119, 97, 118, + 119, 118, 119, 118, 119, 118, 119, 118, 119, 118, + 119, 118, 119, 118, 119, 119, 118, 119, 118, 119, + 118, 119, 119, 119, 119, 118, 119, 30, 13, 21, + 22, 20, 21, 22, 26, 25, 118, 119, 118, 119, + 118, 119, 118, 119, 118, 119, 118, 119, 118, 119, + + 118, 119, 118, 119, 118, 119, 118, 119, 118, 119, + 118, 119, 118, 119, 118, 119, 118, 119, 118, 119, + 118, 119, 118, 119, 118, 119, 118, 119, 118, 119, + 63, 118, 119, 119, 119, 118, 119, 118, 119, 118, + 119, 118, 119, 118, 119, 118, 119, 118, 119, 118, + 119, 118, 119, 81, 118, 119, 119, 118, 119, 118, + 119, 118, 119, 119, 118, 119, 118, 119, 118, 119, + 118, 119, 119, 94, 118, 119, 118, 119, 118, 119, + 98, 118, 119, 118, 119, 118, 119, 118, 119, 102, + 118, 119, 104, 118, 119, 118, 119, 119, 118, 119, + + 118, 119, 118, 119, 118, 119, 118, 119, 119, 119, + 119, 114, 118, 119, 21, 22, 118, 119, 118, 119, + 118, 119, 37, 118, 119, 119, 118, 119, 118, 119, + 118, 119, 44, 118, 119, 118, 119, 118, 119, 118, + 119, 118, 119, 118, 119, 118, 119, 118, 119, 118, + 119, 118, 119, 118, 119, 118, 119, 118, 119, 118, + 119, 62, 118, 119, 119, 119, 119, 118, 119, 118, + 119, 118, 119, 118, 119, 118, 119, 118, 119, 118, + 119, 118, 119, 118, 119, 118, 119, 119, 118, 119, + 85, 118, 119, 118, 119, 119, 118, 119, 118, 119, + + 118, 119, 118, 119, 119, 118, 119, 118, 119, 118, + 119, 118, 119, 119, 118, 119, 119, 106, 118, 119, + 118, 119, 118, 119, 119, 118, 119, 119, 119, 119, + 31, 21, 22, 32, 118, 119, 118, 119, 118, 119, + 119, 118, 119, 118, 119, 43, 118, 119, 118, 119, + 118, 119, 118, 119, 118, 119, 118, 119, 118, 119, + 118, 119, 118, 119, 118, 119, 118, 119, 57, 118, + 119, 118, 119, 118, 119, 118, 119, 118, 119, 119, + 119, 119, 118, 119, 118, 119, 118, 119, 118, 119, + 118, 119, 118, 119, 118, 119, 118, 119, 118, 119, + + 118, 119, 118, 119, 119, 83, 118, 119, 118, 119, + 119, 118, 119, 118, 119, 118, 119, 118, 119, 119, + 118, 119, 118, 119, 99, 118, 119, 100, 118, 119, + 119, 118, 119, 119, 107, 118, 119, 118, 119, 119, + 119, 119, 119, 119, 21, 22, 118, 119, 118, 119, + 119, 40, 118, 119, 118, 119, 118, 119, 118, 119, + 118, 119, 49, 118, 119, 50, 118, 119, 118, 119, + 118, 119, 53, 118, 119, 118, 119, 118, 119, 118, + 119, 59, 118, 119, 118, 119, 118, 119, 119, 119, + 119, 118, 119, 118, 119, 70, 118, 119, 71, 118, + + 119, 118, 119, 118, 119, 118, 119, 75, 118, 119, + 118, 119, 118, 119, 118, 119, 119, 118, 119, 119, + 88, 118, 119, 118, 119, 91, 118, 119, 93, 118, + 119, 119, 118, 119, 118, 119, 119, 118, 119, 119, + 118, 119, 110, 119, 119, 119, 119, 119, 21, 22, + 118, 119, 118, 119, 119, 118, 119, 118, 119, 118, + 119, 118, 119, 118, 119, 52, 118, 119, 118, 119, + 118, 119, 58, 118, 119, 118, 119, 61, 118, 119, + 119, 119, 119, 119, 118, 119, 69, 118, 119, 72, + 118, 119, 73, 118, 119, 118, 119, 118, 119, 119, + + 118, 119, 119, 87, 118, 119, 119, 118, 119, 119, + 118, 119, 96, 118, 119, 119, 118, 119, 119, 118, + 119, 119, 119, 119, 119, 21, 22, 118, 119, 36, + 118, 119, 39, 119, 42, 118, 119, 45, 118, 119, + 118, 119, 118, 119, 118, 119, 118, 119, 118, 119, + 118, 119, 119, 119, 119, 67, 119, 118, 119, 118, + 119, 118, 119, 119, 118, 119, 119, 119, 118, 119, + 119, 118, 119, 101, 119, 118, 119, 119, 108, 118, + 119, 119, 119, 119, 119, 21, 118, 119, 46, 118, + 119, 47, 118, 119, 48, 118, 119, 118, 119, 118, + + 119, 56, 118, 119, 118, 119, 119, 119, 119, 68, + 118, 119, 118, 119, 118, 119, 119, 118, 119, 119, + 119, 118, 119, 119, 118, 119, 118, 119, 119, 111, + 119, 119, 119, 119, 21, 35, 118, 119, 51, 118, + 119, 118, 119, 118, 119, 119, 119, 119, 118, 119, + 118, 119, 119, 118, 119, 119, 119, 118, 119, 119, + 118, 119, 118, 119, 119, 119, 119, 119, 30, 31, + 21, 118, 119, 118, 119, 119, 119, 119, 74, 118, + 119, 76, 118, 119, 77, 119, 118, 119, 119, 119, + 118, 119, 119, 95, 118, 119, 118, 119, 119, 119, + + 119, 119, 21, 118, 119, 60, 118, 119, 65, 119, + 119, 66, 119, 118, 119, 82, 119, 119, 90, 118, + 119, 119, 118, 119, 103, 119, 119, 119, 113, 119, + 21, 118, 119, 119, 80, 118, 119, 119, 119, 118, + 119, 119, 112, 119, 21, 118, 119, 64, 119, 119, + 92, 119, 105, 118, 119, 109, 119, 21, 54, 118, + 119, 84, 119, 19, 21 } ; -static yyconst short int yy_accept[722] = +static yyconst short int yy_accept[710] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 7, 9, 12, @@ -491,56 +489,54 @@ static yyconst short int yy_accept[722] = 479, 479, 480, 482, 485, 485, 486, 487, 489, 491, 493, 495, 497, 499, 501, 503, 505, 507, 509, 511, 513, 515, 517, 519, 521, 523, 525, 527, 529, 531, - 533, 536, 537, 538, 540, 542, 544, 546, 548, 550, - 552, 554, 556, 559, 560, 562, 564, 566, 567, 569, + 534, 535, 536, 538, 540, 542, 544, 546, 548, 550, + 552, 554, 557, 558, 560, 562, 564, 565, 567, 569, - 571, 573, 575, 576, 579, 581, 583, 586, 588, 590, - 592, 595, 598, 600, 601, 603, 605, 607, 609, 611, - 612, 613, 614, 617, 617, 617, 617, 617, 619, 621, - 623, 625, 627, 630, 631, 633, 635, 637, 640, 642, + 571, 573, 574, 577, 579, 581, 584, 586, 588, 590, + 593, 596, 598, 599, 601, 603, 605, 607, 609, 610, + 611, 612, 615, 615, 615, 615, 615, 617, 619, 621, + 623, 626, 627, 629, 631, 633, 636, 638, 640, 642, 644, 646, 648, 650, 652, 654, 656, 658, 660, 662, - 664, 666, 669, 670, 671, 672, 674, 676, 678, 680, - 682, 684, 686, 688, 690, 692, 693, 695, 698, 700, - 701, 703, 705, 707, 709, 710, 712, 714, 716, 718, - 719, 721, 722, 725, 727, 729, 730, 732, 733, 734, - 735, 736, 736, 736, 736, 738, 741, 743, 745, 747, - - 748, 750, 752, 755, 757, 759, 761, 763, 765, 767, - 769, 771, 773, 775, 778, 780, 782, 784, 786, 787, - 788, 789, 791, 793, 795, 797, 799, 801, 803, 805, - 807, 809, 811, 812, 815, 817, 818, 820, 822, 824, - 826, 827, 829, 831, 834, 837, 838, 840, 841, 844, - 846, 847, 848, 849, 850, 851, 851, 851, 851, 853, - 855, 857, 859, 860, 863, 865, 867, 869, 871, 874, - 877, 879, 881, 884, 886, 888, 890, 893, 895, 897, - 898, 899, 900, 902, 904, 907, 910, 912, 914, 916, - 919, 921, 923, 925, 926, 928, 929, 932, 934, 937, - - 940, 941, 943, 945, 946, 948, 949, 951, 953, 954, - 955, 956, 957, 957, 957, 957, 959, 961, 963, 965, - 966, 968, 970, 972, 974, 976, 979, 981, 983, 986, - 988, 991, 992, 993, 994, 995, 997, 1000, 1003, 1006, - 1008, 1010, 1011, 1013, 1014, 1017, 1018, 1020, 1021, 1023, - 1026, 1027, 1029, 1030, 1032, 1033, 1034, 1035, 1036, 1036, - 1036, 1036, 1038, 1040, 1042, 1045, 1047, 1050, 1053, 1055, - 1057, 1059, 1061, 1063, 1065, 1066, 1067, 1068, 1070, 1072, - 1074, 1076, 1077, 1079, 1080, 1081, 1083, 1084, 1086, 1088, - 1090, 1091, 1094, 1095, 1096, 1097, 1098, 1098, 1098, 1098, - - 1099, 1101, 1103, 1106, 1109, 1112, 1114, 1116, 1119, 1121, - 1122, 1123, 1124, 1127, 1129, 1131, 1132, 1134, 1135, 1136, - 1138, 1139, 1141, 1143, 1144, 1146, 1147, 1148, 1149, 1149, - 1149, 1149, 1150, 1152, 1155, 1158, 1160, 1162, 1163, 1164, - 1165, 1167, 1169, 1170, 1172, 1173, 1174, 1176, 1177, 1179, - 1181, 1182, 1183, 1184, 1185, 1185, 1187, 1187, 1188, 1190, - 1192, 1194, 1195, 1196, 1197, 1200, 1203, 1205, 1207, 1208, - 1209, 1211, 1212, 1215, 1217, 1218, 1219, 1220, 1221, 1221, - 1222, 1224, 1226, 1229, 1231, 1232, 1234, 1236, 1238, 1239, - 1242, 1243, 1245, 1247, 1248, 1249, 1251, 1251, 1252, 1254, - - 1256, 1257, 1260, 1261, 1262, 1264, 1265, 1267, 1268, 1271, - 1273, 1275, 1276, 1278, 1281, 1283, 1284, 1287, 1289, 1291, - 1291 + 665, 666, 667, 668, 670, 672, 674, 676, 678, 680, + 682, 684, 686, 688, 689, 691, 694, 696, 697, 699, + 701, 703, 705, 706, 708, 710, 712, 714, 715, 717, + 718, 721, 723, 725, 726, 728, 729, 730, 731, 732, + 732, 732, 732, 734, 737, 739, 741, 742, 744, 746, + + 749, 751, 753, 755, 757, 759, 761, 763, 765, 767, + 769, 772, 774, 776, 778, 780, 781, 782, 783, 785, + 787, 789, 791, 793, 795, 797, 799, 801, 803, 805, + 806, 809, 811, 812, 814, 816, 818, 820, 821, 823, + 825, 828, 831, 832, 834, 835, 838, 840, 841, 842, + 843, 844, 845, 845, 845, 845, 847, 849, 851, 852, + 855, 857, 859, 861, 863, 866, 869, 871, 873, 876, + 878, 880, 882, 885, 887, 889, 890, 891, 892, 894, + 896, 899, 902, 904, 906, 908, 911, 913, 915, 917, + 918, 920, 921, 924, 926, 929, 932, 933, 935, 937, + + 938, 940, 941, 943, 945, 946, 947, 948, 949, 949, + 949, 949, 951, 953, 955, 956, 958, 960, 962, 964, + 966, 969, 971, 973, 976, 978, 981, 982, 983, 984, + 985, 987, 990, 993, 996, 998, 1000, 1001, 1003, 1004, + 1007, 1008, 1010, 1011, 1013, 1016, 1017, 1019, 1020, 1022, + 1023, 1024, 1025, 1026, 1026, 1026, 1026, 1028, 1030, 1033, + 1035, 1038, 1041, 1043, 1045, 1047, 1049, 1051, 1053, 1054, + 1055, 1056, 1058, 1060, 1062, 1064, 1065, 1067, 1068, 1069, + 1071, 1072, 1074, 1076, 1078, 1079, 1082, 1083, 1084, 1085, + 1086, 1086, 1086, 1086, 1087, 1089, 1092, 1095, 1098, 1100, + + 1102, 1105, 1107, 1108, 1109, 1110, 1113, 1115, 1117, 1118, + 1120, 1121, 1122, 1124, 1125, 1127, 1129, 1130, 1132, 1133, + 1134, 1135, 1135, 1135, 1135, 1136, 1139, 1142, 1144, 1146, + 1147, 1148, 1149, 1151, 1153, 1154, 1156, 1157, 1158, 1160, + 1161, 1163, 1165, 1166, 1167, 1168, 1169, 1169, 1171, 1171, + 1172, 1174, 1176, 1177, 1178, 1179, 1182, 1185, 1187, 1189, + 1190, 1191, 1193, 1194, 1197, 1199, 1200, 1201, 1202, 1203, + 1203, 1204, 1206, 1209, 1211, 1212, 1214, 1216, 1218, 1219, + 1222, 1223, 1225, 1227, 1228, 1229, 1231, 1231, 1232, 1234, + 1235, 1238, 1239, 1240, 1242, 1243, 1245, 1246, 1248, 1250, + + 1251, 1253, 1256, 1258, 1259, 1262, 1264, 1266, 1266 } ; static yyconst int yy_ec[256] = @@ -587,18 +583,18 @@ static yyconst int yy_meta[79] = 11, 11, 11, 11, 11, 12, 1, 12 } ; -static yyconst short int yy_base[740] = +static yyconst short int yy_base[728] = { 0, 0, 0, 76, 78, 80, 81, 82, 89, 83, 93, 171, 249, 109, 120, 961, 952, 95, 98, 951, 948, - 320, 117, 4484, 118, 933, 100, 4484, 125, 923, 4484, + 320, 117, 4405, 118, 933, 100, 4405, 125, 923, 4405, 385, 176, 194, 120, 239, 267, 435, 163, 293, 441, 191, 259, 463, 471, 484, 500, 508, 270, 521, 553, - 935, 0, 933, 0, 4484, 4484, 926, 4484, 4484, 922, - 922, 0, 0, 924, 0, 0, 902, 4484, 4484, 4484, - 0, 4484, 4484, 598, 675, 0, 148, 151, 182, 4484, + 935, 0, 933, 0, 4405, 4405, 926, 4405, 4405, 922, + 922, 0, 0, 924, 0, 0, 902, 4405, 4405, 4405, + 0, 4405, 4405, 598, 675, 0, 148, 151, 182, 4405, 915, 160, 0, 913, 912, 0, 135, 0, 573, 908, - 4484, 226, 902, 4484, 598, 886, 556, 597, 598, 618, + 4405, 226, 902, 4405, 598, 886, 556, 597, 598, 618, 619, 634, 0, 664, 667, 680, 693, 704, 720, 728, 741, 744, 757, 772, 778, 775, 793, 842, 852, 808, @@ -606,158 +602,156 @@ static yyconst short int yy_base[740] = 902, 910, 840, 913, 926, 937, 950, 835, 966, 972, 983, 989, 1000, 1015, 1016, 1031, 1032, 831, 1047, 1048, 831, 48, 1063, 1095, 1102, 851, 88, 128, 0, 0, - 4484, 4484, 0, 4484, 0, 865, 0, 849, 253, 0, - 264, 4484, 875, 0, 0, 83, 848, 611, 4484, 4484, - 1099, 1100, 1115, 1123, 1126, 1141, 1144, 1147, 1162, 1168, - 1179, 1185, 1196, 1207, 1223, 1229, 1240, 1246, 1257, 1263, - - 1274, 1280, 1291, 1302, 818, 807, 1315, 1323, 1326, 1341, - 1344, 1347, 1371, 1365, 1368, 1386, 815, 1389, 1404, 1410, - 811, 1421, 1432, 1438, 1449, 1460, 802, 1471, 1477, 1488, - 1494, 1509, 1510, 1525, 1536, 1542, 1557, 1563, 809, 1574, - 1585, 1596, 793, 807, 801, 1607, 4484, 1646, 822, 178, - 250, 4484, 109, 820, 802, 4484, 4484, 1631, 1632, 1647, - 1653, 1668, 1669, 1686, 1685, 1701, 1707, 1718, 1729, 1747, - 1744, 1750, 1765, 1768, 1771, 1786, 1792, 1803, 1814, 1829, - 1835, 783, 789, 1846, 1852, 1867, 1868, 1883, 1889, 1904, - 1907, 1915, 1928, 774, 1936, 1939, 1952, 786, 1960, 1976, - - 1975, 1992, 770, 1993, 2008, 2021, 2029, 2032, 2050, 2047, - 2053, 2068, 2071, 768, 2074, 2089, 2095, 2106, 2112, 778, - 768, 775, 2127, 2159, 170, 151, 242, 200, 2144, 2160, - 2168, 2176, 2184, 759, 2192, 2200, 2213, 2221, 2224, 2242, - 2239, 2245, 2260, 2266, 2281, 2282, 2297, 2312, 2318, 2329, - 2335, 2350, 773, 763, 755, 2351, 2371, 2368, 2389, 2388, - 2404, 2410, 2421, 2432, 2443, 759, 2449, 2460, 2466, 738, - 2477, 2488, 2494, 2505, 753, 2518, 2521, 2529, 2542, 737, - 2553, 745, 2559, 2574, 2575, 731, 2590, 725, 721, 727, - 4484, 280, 297, 294, 231, 2596, 2611, 2614, 2622, 728, - - 2637, 2643, 2654, 2660, 2671, 2677, 2688, 2699, 2705, 2722, - 2728, 2739, 2745, 2756, 2762, 2773, 2779, 2795, 724, 731, - 723, 2796, 2811, 2817, 2828, 2834, 2849, 2855, 2866, 2881, - 2887, 2898, 720, 2909, 2915, 747, 2926, 2932, 2943, 2956, - 716, 2964, 2979, 2982, 2985, 707, 3000, 689, 3003, 3006, - 704, 692, 687, 697, 693, 271, 295, 301, 712, 3021, - 3024, 3037, 682, 3045, 3058, 3066, 3069, 3082, 3090, 3093, - 3106, 3117, 3114, 3130, 3138, 3141, 3154, 3162, 3165, 124, - 704, 677, 3178, 3186, 3189, 3202, 3210, 3223, 3231, 3234, - 3251, 3254, 3257, 698, 3272, 681, 3275, 3288, 3296, 3304, - - 673, 3317, 3325, 658, 3338, 680, 3346, 0, 660, 667, - 643, 672, 438, 368, 366, 286, 3349, 3362, 3370, 654, - 3378, 3386, 3399, 3407, 3410, 3425, 3431, 3446, 3428, 3452, - 3463, 639, 633, 630, 634, 3469, 3480, 3486, 3497, 3503, - 3514, 623, 3525, 620, 3531, 619, 3542, 619, 3553, 3559, - 613, 3570, 600, 3576, 603, 604, 623, 594, 300, 466, - 447, 360, 3587, 3598, 3609, 0, 3615, 3626, 3637, 3648, - 3654, 3669, 3672, 3675, 593, 603, 584, 0, 3690, 3698, - 3713, 590, 3714, 579, 591, 3729, 603, 3737, 0, 3745, - 572, 3758, 579, 589, 531, 528, 443, 3797, 454, 568, - - 3782, 3783, 3798, 3799, 3814, 3815, 3830, 3836, 3847, 529, - 533, 527, 3853, 3864, 3875, 520, 3881, 523, 515, 3892, - 512, 3898, 3909, 518, 0, 508, 496, 498, 397, 3941, - 560, 517, 3926, 3927, 3942, 3943, 3958, 489, 507, 484, - 3969, 3975, 483, 3990, 475, 477, 3993, 468, 3996, 4013, - 469, 462, 468, 461, 424, 4484, 4052, 485, 4037, 4048, - 4059, 461, 456, 455, 4065, 4076, 0, 4087, 454, 444, - 4098, 440, 4104, 4115, 438, 434, 429, 432, 732, 441, - 4131, 4128, 4139, 0, 419, 0, 4152, 0, 411, 4155, - 399, 4170, 0, 372, 347, 0, 4209, 330, 4194, 4205, - - 258, 4211, 227, 214, 4222, 177, 0, 180, 4233, 4239, - 0, 138, 0, 4250, 0, 134, 4256, 0, 0, 4484, - 4301, 4313, 4325, 4337, 4349, 4361, 4373, 4384, 4385, 4389, - 4400, 4412, 4424, 4435, 4446, 4457, 4462, 4467, 4472 + 4405, 4405, 0, 4405, 0, 865, 0, 849, 253, 0, + 264, 4405, 875, 0, 0, 83, 848, 611, 4405, 4405, + 1098, 1099, 1114, 1115, 1130, 1138, 1141, 1154, 1162, 1170, + 1178, 1191, 1199, 1202, 1223, 1224, 1239, 1245, 1256, 1262, + + 1273, 1279, 1290, 1301, 818, 807, 1314, 1322, 1325, 1340, + 1343, 1346, 1370, 1364, 1367, 1385, 815, 1388, 1403, 1409, + 811, 1420, 1431, 1437, 1448, 1459, 802, 1470, 1476, 1487, + 1493, 1508, 1509, 1524, 1535, 1541, 1556, 1562, 809, 1573, + 1584, 1595, 793, 807, 801, 1606, 4405, 1645, 822, 178, + 250, 4405, 109, 820, 802, 4405, 4405, 1630, 1641, 1647, + 1662, 1663, 1680, 1679, 1695, 1701, 1712, 1723, 1741, 1738, + 1744, 1759, 1762, 1765, 1780, 1786, 1797, 1808, 1823, 1829, + 783, 789, 1840, 1846, 1861, 1862, 1877, 1883, 1898, 1901, + 1909, 1922, 774, 1930, 1933, 1946, 786, 1954, 1970, 1969, + + 1986, 770, 1987, 2002, 2015, 2023, 2026, 2044, 2041, 2047, + 2062, 2065, 768, 2068, 2083, 2089, 2100, 2106, 778, 768, + 775, 2121, 2153, 170, 151, 242, 200, 2138, 2153, 2159, + 2170, 759, 2176, 2191, 2194, 2202, 2215, 2218, 2226, 2239, + 2247, 2260, 2268, 2276, 2284, 2299, 2305, 2316, 2322, 2337, + 773, 763, 755, 2338, 2358, 2355, 2376, 2375, 2391, 2397, + 2408, 2419, 2430, 759, 2436, 2447, 2453, 738, 2464, 2475, + 2481, 2492, 753, 2505, 2508, 2516, 2529, 737, 2540, 745, + 2546, 2561, 2562, 731, 2577, 725, 721, 727, 4405, 280, + 297, 294, 231, 2583, 2599, 2605, 728, 2616, 2627, 2638, + + 2644, 2655, 2661, 2672, 2683, 2689, 2706, 2712, 2723, 2729, + 2740, 2746, 2757, 2763, 2779, 724, 731, 723, 2780, 2795, + 2801, 2812, 2818, 2833, 2839, 2850, 2865, 2871, 2882, 720, + 2893, 2899, 747, 2910, 2916, 2927, 2940, 716, 2948, 2963, + 2966, 2969, 707, 2984, 689, 2987, 2990, 704, 692, 687, + 697, 693, 271, 295, 301, 712, 3005, 3018, 682, 3021, + 3036, 3042, 3053, 3059, 3070, 3076, 3087, 3098, 3104, 3115, + 3121, 3132, 3143, 3149, 3160, 124, 704, 677, 3166, 3177, + 3188, 3194, 3205, 3211, 3226, 3227, 3242, 3248, 3259, 698, + 3265, 681, 3276, 3287, 3298, 3304, 673, 3319, 3325, 658, + + 3340, 680, 3346, 0, 660, 667, 643, 672, 438, 368, + 366, 286, 3357, 3372, 654, 3378, 3389, 3402, 3410, 3413, + 3428, 3434, 3449, 3431, 3455, 3466, 639, 633, 630, 634, + 3472, 3483, 3489, 3500, 3506, 3517, 623, 3528, 620, 3534, + 619, 3545, 619, 3556, 3562, 613, 3573, 600, 3579, 603, + 604, 623, 594, 300, 466, 447, 360, 3590, 3596, 0, + 3607, 3613, 3629, 3628, 3644, 3645, 3660, 3661, 593, 603, + 584, 0, 3676, 3684, 3699, 590, 3700, 579, 591, 3715, + 603, 3723, 0, 3731, 572, 3744, 579, 589, 531, 528, + 443, 3783, 454, 568, 3768, 3769, 3784, 3785, 3800, 3808, + + 3816, 3824, 529, 533, 527, 3832, 3840, 3848, 520, 3856, + 523, 515, 3864, 512, 3872, 3880, 518, 0, 508, 496, + 498, 397, 3912, 560, 517, 3897, 3898, 3913, 3921, 489, + 507, 484, 3934, 3942, 483, 3950, 475, 477, 3958, 468, + 3971, 3974, 469, 462, 468, 461, 424, 4405, 4018, 485, + 4003, 4004, 461, 456, 455, 4019, 4020, 0, 4035, 454, + 444, 4036, 440, 4051, 4057, 438, 434, 429, 432, 732, + 441, 4068, 4079, 0, 419, 0, 4085, 0, 411, 4100, + 399, 4103, 0, 372, 347, 0, 4147, 330, 4132, 258, + 4143, 227, 214, 4149, 177, 0, 180, 4160, 0, 138, + + 0, 4166, 0, 134, 4177, 0, 0, 4405, 4222, 4234, + 4246, 4258, 4270, 4282, 4294, 4305, 4306, 4310, 4321, 4333, + 4345, 4356, 4367, 4378, 4383, 4388, 4393 } ; -static yyconst short int yy_def[740] = +static yyconst short int yy_def[728] = { 0, - 720, 1, 721, 721, 722, 722, 723, 723, 724, 724, - 725, 725, 726, 726, 720, 720, 720, 720, 720, 727, - 720, 728, 720, 720, 720, 720, 720, 720, 720, 720, - 720, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 729, - 720, 730, 720, 731, 720, 720, 720, 720, 720, 720, - 720, 732, 732, 720, 733, 733, 720, 720, 720, 720, - 734, 720, 720, 735, 735, 736, 720, 720, 21, 720, - 720, 720, 727, 727, 720, 737, 720, 738, 728, 728, - 720, 720, 720, 720, 720, 720, 31, 31, 31, 31, - - 31, 31, 739, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 739, 739, 31, - 31, 31, 31, 31, 31, 31, 31, 739, 31, 31, - 31, 31, 739, 31, 31, 31, 31, 739, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 739, 31, 31, - 739, 739, 31, 720, 729, 155, 155, 155, 730, 731, - 720, 720, 732, 720, 733, 720, 734, 75, 75, 736, - 720, 720, 720, 737, 738, 720, 720, 720, 720, 720, + 708, 1, 709, 709, 710, 710, 711, 711, 712, 712, + 713, 713, 714, 714, 708, 708, 708, 708, 708, 715, + 708, 716, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 717, + 708, 718, 708, 719, 708, 708, 708, 708, 708, 708, + 708, 720, 720, 708, 721, 721, 708, 708, 708, 708, + 722, 708, 708, 723, 723, 724, 708, 708, 21, 708, + 708, 708, 715, 715, 708, 725, 708, 726, 716, 716, + 708, 708, 708, 708, 708, 708, 31, 31, 31, 31, + + 31, 31, 727, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 727, 727, 31, + 31, 31, 31, 31, 31, 31, 31, 727, 31, 31, + 31, 31, 727, 31, 31, 31, 31, 727, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 727, 31, 31, + 727, 727, 31, 708, 717, 155, 155, 155, 718, 719, + 708, 708, 720, 708, 721, 708, 722, 75, 75, 724, + 708, 708, 708, 725, 726, 708, 708, 708, 708, 708, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 739, 739, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 739, 31, 31, 31, - 739, 31, 31, 31, 31, 31, 739, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 739, 31, - 31, 31, 739, 739, 739, 31, 720, 720, 155, 155, - 155, 720, 75, 75, 720, 720, 720, 31, 31, 31, + 31, 31, 31, 31, 727, 727, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 727, 31, 31, 31, + 727, 31, 31, 31, 31, 31, 727, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 727, 31, + 31, 31, 727, 727, 727, 31, 708, 708, 155, 155, + 155, 708, 75, 75, 708, 708, 708, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 739, 739, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 739, 31, 31, 31, 739, 31, 31, + 727, 727, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 727, 31, 31, 31, 727, 31, 31, 31, - 31, 31, 739, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 739, 31, 31, 31, 31, 31, 739, - 739, 739, 31, 720, 155, 155, 155, 75, 31, 31, - 31, 31, 31, 739, 31, 31, 31, 31, 31, 31, + 31, 727, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 727, 31, 31, 31, 31, 31, 727, 727, + 727, 31, 708, 155, 155, 155, 75, 31, 31, 31, + 31, 727, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 739, 739, 739, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 739, 31, 31, 31, 739, - 31, 31, 31, 31, 739, 31, 31, 31, 31, 739, - 31, 739, 31, 31, 31, 739, 31, 739, 739, 739, - 720, 155, 155, 155, 75, 31, 31, 31, 31, 739, + 727, 727, 727, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 727, 31, 31, 31, 727, 31, 31, + 31, 31, 727, 31, 31, 31, 31, 727, 31, 727, + 31, 31, 31, 727, 31, 727, 727, 727, 708, 155, + 155, 155, 75, 31, 31, 31, 727, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 739, 739, - 739, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 739, 31, 31, 739, 31, 31, 31, 31, - 739, 31, 31, 31, 31, 739, 31, 739, 31, 31, - 739, 739, 739, 739, 739, 155, 155, 155, 75, 31, - 31, 31, 739, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 739, - 739, 739, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 739, 31, 739, 31, 31, 31, 31, - - 739, 31, 31, 739, 31, 739, 31, 739, 739, 739, - 739, 739, 155, 155, 155, 75, 31, 31, 31, 739, + 31, 31, 31, 31, 31, 727, 727, 727, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 727, + 31, 31, 727, 31, 31, 31, 31, 727, 31, 31, + 31, 31, 727, 31, 727, 31, 31, 727, 727, 727, + 727, 727, 155, 155, 155, 75, 31, 31, 727, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 739, 739, 739, 739, 31, 31, 31, 31, 31, - 31, 739, 31, 739, 31, 739, 31, 739, 31, 31, - 739, 31, 739, 31, 739, 739, 739, 739, 155, 155, - 155, 75, 31, 31, 31, 739, 31, 31, 31, 31, - 31, 31, 31, 31, 739, 739, 739, 739, 31, 31, - 31, 739, 31, 739, 739, 31, 739, 31, 739, 31, - 739, 31, 739, 739, 739, 739, 155, 720, 155, 734, - - 31, 31, 31, 31, 31, 31, 31, 31, 31, 739, - 739, 739, 31, 31, 31, 739, 31, 739, 739, 31, - 739, 31, 31, 739, 739, 739, 739, 739, 155, 720, - 155, 734, 31, 31, 31, 31, 31, 739, 739, 739, - 31, 31, 739, 31, 739, 739, 31, 739, 31, 31, - 739, 739, 739, 739, 155, 720, 720, 734, 31, 31, - 31, 739, 739, 739, 31, 31, 739, 31, 739, 739, - 31, 739, 31, 31, 739, 739, 739, 739, 155, 734, - 31, 31, 31, 739, 739, 739, 31, 739, 739, 31, - 739, 31, 739, 739, 739, 739, 720, 734, 31, 31, - - 739, 31, 739, 739, 31, 739, 739, 734, 31, 31, - 739, 739, 739, 31, 739, 734, 31, 739, 734, 0, - 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, - 720, 720, 720, 720, 720, 720, 720, 720, 720 + 31, 31, 31, 31, 31, 727, 727, 727, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 727, + 31, 727, 31, 31, 31, 31, 727, 31, 31, 727, + + 31, 727, 31, 727, 727, 727, 727, 727, 155, 155, + 155, 75, 31, 31, 727, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 727, 727, 727, 727, + 31, 31, 31, 31, 31, 31, 727, 31, 727, 31, + 727, 31, 727, 31, 31, 727, 31, 727, 31, 727, + 727, 727, 727, 155, 155, 155, 75, 31, 31, 727, + 31, 31, 31, 31, 31, 31, 31, 31, 727, 727, + 727, 727, 31, 31, 31, 727, 31, 727, 727, 31, + 727, 31, 727, 31, 727, 31, 727, 727, 727, 727, + 155, 708, 155, 722, 31, 31, 31, 31, 31, 31, + + 31, 31, 727, 727, 727, 31, 31, 31, 727, 31, + 727, 727, 31, 727, 31, 31, 727, 727, 727, 727, + 727, 155, 708, 155, 722, 31, 31, 31, 31, 727, + 727, 727, 31, 31, 727, 31, 727, 727, 31, 727, + 31, 31, 727, 727, 727, 727, 155, 708, 708, 722, + 31, 31, 727, 727, 727, 31, 31, 727, 31, 727, + 727, 31, 727, 31, 31, 727, 727, 727, 727, 155, + 722, 31, 31, 727, 727, 727, 31, 727, 727, 31, + 727, 31, 727, 727, 727, 727, 708, 722, 31, 727, + 31, 727, 727, 31, 727, 727, 722, 31, 727, 727, + + 727, 31, 727, 722, 31, 727, 722, 0, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708 } ; -static yyconst short int yy_nxt[4563] = +static yyconst short int yy_nxt[4484] = { 0, 16, 17, 18, 17, 19, 20, 21, 22, 23, 16, 24, 25, 26, 27, 28, 28, 28, 28, 28, 28, @@ -774,87 +768,87 @@ static yyconst short int yy_nxt[4563] = 77, 78, 77, 67, 257, 79, 68, 245, 89, 89, 89, 77, 78, 77, 81, 81, 79, 156, 91, 250, 89, 89, 92, 92, 92, 92, 92, 92, 95, 95, - 95, 95, 95, 95, 95, 97, 168, 328, 112, 171, + 95, 95, 95, 95, 95, 97, 168, 327, 112, 171, 171, 171, 171, 171, 171, 97, 85, 97, 69, 97, - 70, 82, 82, 82, 97, 251, 532, 156, 69, 719, + 70, 82, 82, 82, 97, 251, 527, 156, 69, 707, 70, 71, 72, 73, 72, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 30, 533, 80, 87, 97, 720, - 156, 71, 71, 71, 71, 30, 393, 80, 97, 75, + 71, 71, 71, 71, 30, 528, 80, 87, 97, 708, + 156, 71, 71, 71, 71, 30, 391, 80, 97, 75, - 97, 97, 97, 720, 104, 392, 718, 97, 105, 156, - 326, 97, 106, 97, 107, 97, 97, 156, 716, 97, - 97, 71, 71, 71, 108, 109, 97, 395, 97, 110, - 97, 97, 111, 97, 720, 127, 715, 168, 97, 178, + 97, 97, 97, 708, 104, 390, 706, 97, 105, 156, + 325, 97, 106, 97, 107, 97, 97, 156, 704, 97, + 97, 71, 71, 71, 108, 109, 97, 393, 97, 110, + 97, 97, 111, 97, 708, 127, 703, 168, 97, 178, 178, 178, 178, 178, 178, 178, 72, 71, 72, 71, 72, 73, 72, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 128, 459, 97, 171, 171, 171, 168, 71, - 71, 71, 71, 713, 97, 113, 114, 75, 97, 253, - 254, 156, 327, 97, 129, 130, 115, 394, 131, 156, - 168, 116, 97, 712, 97, 97, 97, 513, 132, 71, + 71, 71, 128, 456, 97, 171, 171, 171, 168, 71, + 71, 71, 71, 701, 97, 113, 114, 75, 97, 253, + 254, 156, 326, 97, 129, 130, 115, 392, 131, 156, + 168, 116, 97, 700, 97, 97, 97, 509, 132, 71, 71, 71, 97, 97, 97, 97, 97, 97, 117, 97, - 156, 97, 456, 133, 97, 711, 562, 120, 97, 156, - 121, 457, 458, 168, 72, 71, 72, 81, 97, 122, - 123, 152, 97, 156, 156, 124, 156, 97, 514, 156, - 156, 85, 515, 597, 86, 86, 86, 86, 86, 86, + 156, 97, 453, 133, 97, 699, 557, 120, 97, 156, + 121, 454, 455, 168, 72, 71, 72, 81, 97, 122, + 123, 152, 97, 156, 156, 124, 156, 97, 510, 156, + 156, 85, 511, 591, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 600, 708, 87, 88, 88, 88, 88, 88, 88, 88, + 594, 697, 87, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 97, 560, 168, 97, 97, + 88, 88, 88, 88, 88, 97, 555, 168, 97, 97, - 97, 97, 97, 97, 97, 156, 707, 156, 561, 97, + 97, 97, 97, 97, 97, 156, 696, 156, 556, 97, 98, 97, 97, 97, 97, 97, 97, 97, 97, 97, 99, 97, 100, 97, 101, 97, 97, 97, 97, 102, - 97, 97, 97, 97, 97, 655, 156, 706, 103, 103, + 97, 97, 97, 97, 97, 647, 156, 695, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, - 97, 679, 559, 156, 704, 125, 97, 598, 598, 598, - 97, 599, 97, 126, 97, 629, 97, 156, 97, 97, - 97, 703, 156, 701, 698, 97, 156, 134, 97, 631, - 135, 696, 118, 156, 695, 694, 97, 693, 136, 139, - - 97, 691, 97, 119, 137, 156, 97, 97, 97, 97, - 97, 689, 140, 688, 686, 97, 141, 685, 144, 97, - 684, 97, 680, 97, 145, 97, 678, 142, 97, 677, - 676, 138, 143, 97, 675, 97, 672, 97, 670, 97, - 669, 146, 667, 97, 97, 149, 97, 97, 147, 664, - 663, 150, 97, 153, 662, 658, 97, 148, 97, 654, - 97, 657, 657, 657, 653, 97, 154, 154, 154, 154, - 154, 154, 154, 151, 89, 89, 89, 155, 652, 651, - 176, 97, 648, 646, 645, 643, 89, 89, 640, 639, - 638, 97, 157, 97, 632, 97, 628, 158, 167, 156, - - 97, 627, 167, 167, 167, 167, 167, 167, 167, 167, + 97, 670, 554, 156, 693, 125, 97, 592, 592, 592, + 97, 593, 97, 126, 97, 622, 97, 156, 97, 97, + 97, 692, 156, 690, 688, 97, 156, 134, 97, 624, + 135, 686, 118, 156, 685, 684, 97, 683, 136, 139, + + 97, 681, 97, 119, 137, 156, 97, 97, 97, 97, + 97, 679, 140, 678, 676, 97, 141, 675, 144, 97, + 674, 97, 671, 97, 145, 97, 669, 142, 97, 668, + 667, 138, 143, 97, 666, 97, 663, 97, 661, 97, + 660, 146, 658, 97, 97, 149, 97, 97, 147, 655, + 654, 150, 97, 153, 653, 650, 97, 148, 97, 646, + 97, 649, 649, 649, 645, 97, 154, 154, 154, 154, + 154, 154, 154, 151, 89, 89, 89, 155, 644, 643, + 176, 97, 640, 638, 637, 635, 89, 89, 632, 631, + 630, 97, 157, 97, 625, 97, 621, 158, 167, 156, + + 97, 620, 167, 167, 167, 167, 167, 167, 167, 167, 167, 95, 95, 95, 95, 95, 95, 95, 167, 167, 167, 167, 97, 97, 178, 178, 178, 178, 178, 178, - 178, 626, 97, 182, 97, 97, 97, 97, 625, 181, - 624, 97, 97, 97, 97, 621, 619, 618, 167, 167, - 167, 616, 612, 97, 97, 97, 97, 97, 184, 97, - 611, 610, 97, 97, 596, 595, 183, 594, 593, 97, - 591, 97, 589, 97, 167, 167, 587, 185, 97, 167, - 167, 167, 167, 167, 167, 167, 167, 167, 585, 97, - 584, 582, 97, 578, 186, 167, 167, 167, 167, 97, - - 577, 97, 97, 97, 97, 97, 97, 576, 97, 575, - 187, 97, 169, 566, 558, 97, 557, 97, 97, 188, - 556, 555, 553, 551, 97, 167, 167, 167, 97, 97, - 97, 189, 97, 697, 697, 697, 548, 97, 546, 97, - 544, 97, 535, 97, 190, 97, 534, 520, 97, 516, - 512, 167, 192, 97, 511, 97, 510, 97, 191, 97, - 509, 508, 506, 97, 97, 97, 97, 97, 504, 97, - 501, 156, 97, 195, 496, 494, 97, 193, 194, 97, - 97, 97, 196, 97, 482, 97, 481, 480, 97, 463, - 455, 454, 97, 453, 97, 451, 97, 97, 197, 198, - - 97, 97, 448, 97, 200, 446, 441, 97, 436, 97, + 178, 619, 97, 182, 97, 97, 97, 97, 618, 181, + 617, 97, 97, 97, 97, 614, 612, 611, 167, 167, + 167, 609, 605, 97, 97, 97, 97, 97, 184, 97, + 604, 603, 97, 97, 590, 589, 183, 588, 587, 97, + 585, 97, 583, 97, 167, 167, 581, 185, 97, 167, + 167, 167, 167, 167, 167, 167, 167, 167, 579, 97, + 578, 576, 97, 572, 186, 167, 167, 167, 167, 97, + + 571, 97, 97, 97, 97, 97, 97, 570, 97, 569, + 187, 97, 169, 560, 553, 97, 552, 97, 97, 188, + 551, 550, 548, 546, 97, 167, 167, 167, 97, 97, + 97, 189, 97, 687, 687, 687, 543, 97, 541, 97, + 539, 97, 530, 97, 190, 97, 529, 515, 97, 512, + 508, 167, 192, 97, 507, 97, 506, 97, 191, 97, + 505, 504, 502, 97, 97, 97, 97, 97, 500, 97, + 497, 156, 97, 195, 492, 490, 97, 193, 194, 97, + 97, 97, 196, 97, 478, 97, 477, 476, 97, 459, + 452, 451, 97, 450, 97, 448, 97, 97, 197, 198, + + 97, 97, 445, 97, 200, 443, 438, 97, 433, 97, 203, 97, 97, 97, 97, 97, 199, 201, 97, 97, - 433, 202, 97, 421, 420, 207, 419, 400, 97, 390, - 97, 204, 97, 97, 389, 388, 97, 97, 382, 208, - 375, 370, 366, 97, 97, 97, 97, 97, 97, 354, - 97, 353, 97, 172, 97, 97, 97, 168, 209, 97, - 210, 325, 322, 97, 321, 320, 314, 303, 298, 97, - 97, 97, 294, 97, 283, 282, 211, 212, 97, 257, + 430, 202, 97, 418, 417, 207, 416, 397, 97, 388, + 97, 204, 97, 97, 387, 386, 97, 97, 380, 208, + 373, 368, 364, 97, 97, 97, 97, 97, 97, 352, + 97, 351, 97, 172, 97, 97, 97, 168, 209, 97, + 210, 324, 321, 97, 320, 319, 313, 302, 297, 97, + 97, 97, 293, 97, 282, 281, 211, 212, 97, 257, 97, 97, 97, 213, 97, 255, 168, 97, 252, 97, 156, 97, 243, 97, 239, 97, 227, 97, 97, 215, @@ -864,406 +858,397 @@ static yyconst short int yy_nxt[4563] = 97, 94, 219, 97, 162, 97, 161, 97, 97, 97, 81, 97, 81, 96, 93, 97, 97, 97, 97, 97, 97, 97, 97, 220, 97, 84, 222, 97, 81, 81, - 720, 97, 97, 97, 720, 97, 720, 720, 720, 720, - 97, 223, 97, 720, 97, 97, 97, 720, 225, 720, - 720, 224, 226, 720, 720, 97, 720, 97, 720, 97, - 228, 97, 720, 720, 97, 720, 720, 97, 720, 720, - - 720, 229, 720, 97, 720, 97, 720, 97, 97, 97, - 97, 97, 230, 720, 97, 231, 97, 720, 97, 720, - 97, 720, 97, 720, 97, 97, 97, 97, 97, 235, - 233, 720, 232, 97, 720, 97, 720, 234, 720, 97, - 97, 97, 720, 720, 97, 720, 236, 720, 720, 720, - 97, 97, 97, 97, 97, 97, 97, 97, 720, 97, - 97, 720, 720, 720, 720, 720, 97, 97, 97, 97, - 97, 238, 97, 97, 241, 237, 97, 242, 720, 240, - 720, 720, 97, 97, 97, 97, 97, 97, 97, 720, - 720, 97, 97, 720, 720, 720, 720, 720, 97, 720, - - 97, 720, 97, 248, 248, 248, 246, 97, 154, 154, - 154, 154, 154, 154, 154, 720, 720, 720, 720, 720, - 720, 720, 720, 720, 97, 97, 720, 258, 720, 720, - 720, 720, 720, 720, 97, 97, 97, 97, 97, 97, - 97, 249, 259, 97, 97, 720, 247, 720, 97, 720, - 97, 97, 97, 720, 97, 720, 720, 720, 260, 97, - 97, 97, 97, 97, 261, 97, 97, 97, 720, 97, - 97, 720, 97, 262, 720, 720, 97, 720, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 263, - 720, 97, 720, 97, 720, 720, 720, 264, 720, 97, - - 720, 97, 720, 97, 97, 97, 97, 97, 720, 265, - 97, 266, 97, 720, 97, 720, 97, 720, 97, 720, - 97, 97, 97, 97, 97, 720, 720, 267, 720, 97, - 720, 97, 97, 97, 720, 268, 720, 720, 720, 720, - 97, 720, 97, 720, 97, 720, 97, 271, 97, 269, - 270, 97, 720, 720, 97, 272, 720, 273, 97, 720, - 97, 720, 97, 720, 97, 97, 97, 97, 97, 720, - 720, 97, 720, 97, 720, 97, 720, 97, 274, 97, - 720, 97, 97, 97, 97, 97, 720, 720, 97, 720, - 97, 276, 97, 275, 97, 720, 97, 720, 97, 97, - - 97, 97, 97, 720, 720, 97, 720, 97, 279, 277, - 720, 97, 278, 97, 720, 97, 97, 97, 97, 97, - 720, 720, 720, 720, 97, 720, 97, 97, 97, 720, - 97, 720, 720, 280, 720, 97, 720, 97, 281, 97, - 97, 97, 720, 720, 720, 720, 97, 720, 97, 720, - 97, 97, 97, 720, 97, 720, 720, 284, 97, 97, - 285, 286, 97, 97, 287, 97, 97, 97, 720, 97, - 97, 720, 97, 720, 720, 290, 288, 720, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 289, 97, 291, - 97, 97, 720, 97, 720, 720, 97, 720, 720, 720, - - 97, 720, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 292, 720, 97, 97, 720, 295, 720, 720, - 720, 293, 720, 97, 97, 97, 97, 720, 97, 97, - 97, 720, 296, 97, 720, 97, 720, 720, 720, 97, - 720, 97, 297, 97, 720, 97, 97, 97, 97, 97, - 720, 720, 720, 720, 97, 720, 97, 97, 97, 720, - 97, 720, 720, 97, 299, 97, 720, 97, 720, 97, - 720, 97, 720, 97, 97, 97, 97, 97, 720, 720, - 300, 720, 97, 720, 97, 97, 97, 720, 97, 720, - 720, 301, 720, 97, 720, 97, 97, 97, 720, 97, - - 720, 305, 97, 720, 97, 302, 304, 720, 97, 720, - 97, 720, 97, 97, 97, 97, 97, 720, 720, 97, - 720, 97, 720, 97, 720, 97, 720, 97, 720, 97, - 720, 97, 306, 97, 97, 97, 720, 307, 97, 720, - 720, 720, 308, 720, 97, 97, 97, 97, 97, 97, - 97, 720, 720, 97, 97, 720, 720, 720, 720, 720, - 97, 97, 97, 720, 97, 720, 720, 97, 309, 97, - 720, 97, 720, 97, 720, 97, 720, 97, 310, 97, - 97, 97, 97, 720, 311, 312, 97, 720, 97, 720, - 720, 313, 97, 720, 97, 720, 97, 720, 97, 97, - - 97, 97, 97, 720, 720, 720, 720, 97, 720, 97, - 97, 97, 315, 97, 316, 319, 720, 720, 97, 317, - 97, 97, 97, 720, 97, 720, 720, 720, 318, 97, - 720, 97, 97, 97, 720, 97, 720, 720, 323, 720, - 97, 720, 97, 720, 97, 720, 97, 248, 248, 248, - 720, 97, 720, 720, 720, 720, 97, 97, 720, 324, - 324, 324, 324, 324, 324, 324, 97, 97, 329, 97, - 97, 97, 97, 330, 720, 97, 97, 720, 97, 331, - 720, 720, 97, 720, 97, 720, 97, 720, 97, 332, - 97, 97, 97, 97, 97, 720, 720, 97, 720, 720, - - 720, 720, 720, 97, 97, 333, 97, 97, 97, 336, - 97, 97, 97, 97, 335, 720, 720, 720, 720, 720, - 97, 97, 97, 97, 97, 97, 97, 337, 720, 97, - 97, 720, 97, 720, 720, 720, 97, 720, 97, 334, - 97, 720, 97, 97, 97, 97, 97, 720, 720, 338, - 720, 97, 720, 97, 97, 97, 339, 97, 720, 720, - 720, 720, 97, 720, 97, 720, 97, 720, 97, 97, - 340, 341, 97, 97, 720, 97, 720, 720, 720, 97, - 720, 97, 97, 97, 97, 97, 97, 343, 342, 97, - 97, 97, 344, 97, 97, 345, 97, 720, 720, 346, - - 97, 720, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 720, 720, 97, 720, 97, 720, 720, - 720, 97, 720, 97, 348, 347, 720, 97, 97, 97, - 97, 97, 720, 720, 720, 720, 97, 720, 97, 97, - 97, 720, 97, 720, 349, 720, 720, 97, 720, 97, - 720, 350, 720, 97, 97, 351, 720, 352, 97, 720, - 97, 720, 720, 720, 97, 720, 97, 720, 97, 720, - 97, 97, 97, 97, 97, 720, 720, 97, 720, 97, - 720, 97, 720, 97, 720, 97, 720, 97, 720, 97, - 97, 97, 97, 97, 720, 356, 97, 720, 720, 357, - - 720, 720, 97, 97, 97, 97, 97, 97, 97, 358, - 720, 97, 97, 360, 97, 720, 355, 720, 97, 720, - 97, 720, 97, 364, 97, 720, 97, 359, 97, 97, - 361, 720, 97, 97, 362, 720, 720, 720, 720, 97, - 97, 97, 97, 97, 97, 363, 97, 720, 97, 720, - 97, 97, 97, 97, 97, 720, 720, 365, 720, 97, - 720, 97, 367, 97, 97, 97, 720, 97, 720, 720, - 720, 97, 97, 97, 97, 97, 97, 97, 97, 720, - 97, 720, 368, 97, 720, 97, 372, 97, 371, 97, - 369, 97, 720, 720, 720, 97, 97, 97, 720, 97, - - 97, 97, 720, 373, 97, 720, 720, 720, 720, 720, - 97, 97, 97, 97, 97, 97, 374, 97, 97, 97, - 97, 720, 720, 720, 720, 720, 720, 97, 97, 97, - 97, 97, 97, 97, 720, 720, 97, 97, 720, 720, - 720, 720, 720, 97, 720, 97, 97, 97, 720, 377, - 720, 376, 97, 720, 97, 720, 97, 97, 97, 720, - 97, 720, 720, 720, 97, 97, 97, 97, 97, 378, - 720, 97, 97, 97, 379, 97, 97, 720, 97, 720, - 720, 381, 97, 720, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 720, 97, 97, 720, 97, - - 720, 720, 720, 97, 720, 97, 97, 97, 97, 97, - 97, 383, 97, 97, 97, 97, 720, 380, 97, 720, - 97, 720, 720, 385, 97, 720, 97, 720, 97, 720, - 97, 97, 97, 384, 97, 720, 720, 97, 720, 97, - 720, 97, 720, 97, 720, 97, 720, 97, 720, 97, - 97, 97, 97, 720, 387, 720, 97, 720, 720, 720, - 720, 720, 97, 720, 97, 720, 97, 386, 720, 97, - 720, 97, 324, 324, 324, 324, 324, 324, 324, 97, - 720, 97, 720, 97, 397, 97, 720, 396, 97, 720, - 720, 720, 720, 97, 398, 97, 720, 97, 720, 97, - - 399, 97, 720, 97, 97, 97, 720, 97, 720, 97, - 391, 97, 97, 97, 720, 97, 401, 97, 720, 97, - 97, 97, 720, 97, 720, 97, 402, 97, 97, 97, - 720, 97, 720, 720, 720, 97, 97, 97, 97, 97, - 720, 403, 720, 720, 97, 720, 97, 720, 97, 97, - 97, 720, 97, 720, 720, 720, 97, 97, 97, 97, - 97, 404, 720, 97, 97, 97, 405, 97, 97, 720, - 97, 406, 720, 720, 97, 720, 97, 97, 97, 97, - 407, 97, 97, 97, 97, 97, 97, 720, 408, 97, - 720, 97, 409, 410, 720, 97, 720, 97, 720, 97, - - 720, 97, 720, 97, 97, 97, 97, 97, 720, 411, - 97, 720, 720, 412, 720, 720, 97, 97, 97, 97, - 97, 97, 97, 413, 720, 97, 97, 720, 720, 720, - 720, 720, 97, 720, 97, 720, 97, 97, 415, 720, - 414, 97, 720, 97, 720, 720, 720, 97, 720, 97, - 720, 97, 720, 97, 97, 97, 97, 97, 720, 720, - 97, 416, 97, 720, 97, 720, 97, 720, 97, 720, - 97, 417, 418, 97, 97, 97, 97, 720, 720, 97, - 720, 720, 720, 422, 720, 97, 97, 97, 97, 97, - 97, 720, 720, 97, 97, 97, 97, 423, 720, 424, - - 720, 720, 720, 97, 720, 97, 97, 97, 97, 720, - 97, 425, 97, 97, 97, 97, 426, 720, 720, 720, - 720, 720, 720, 97, 97, 427, 97, 97, 97, 97, - 720, 720, 97, 97, 720, 97, 720, 720, 429, 97, - 720, 97, 720, 97, 720, 97, 97, 97, 428, 97, - 431, 720, 720, 432, 97, 720, 97, 97, 97, 720, - 97, 720, 720, 430, 720, 97, 720, 97, 97, 97, - 720, 97, 720, 720, 97, 720, 97, 720, 97, 720, - 97, 720, 97, 720, 97, 97, 97, 97, 97, 720, - 720, 97, 434, 97, 720, 97, 720, 97, 720, 97, - - 720, 97, 97, 435, 97, 97, 720, 720, 720, 720, - 97, 720, 97, 97, 97, 720, 97, 720, 437, 97, - 438, 97, 720, 97, 720, 97, 720, 97, 720, 97, - 97, 439, 97, 97, 720, 720, 720, 720, 97, 720, - 97, 720, 97, 97, 97, 720, 97, 720, 440, 97, - 442, 720, 720, 97, 97, 97, 97, 97, 443, 444, - 97, 720, 97, 720, 97, 97, 97, 97, 97, 720, - 720, 720, 720, 97, 720, 720, 720, 97, 97, 97, - 720, 97, 720, 720, 97, 447, 97, 720, 97, 445, - 97, 720, 97, 720, 97, 720, 97, 97, 97, 97, - - 97, 720, 449, 97, 720, 720, 720, 720, 720, 97, - 97, 97, 97, 97, 97, 97, 450, 720, 97, 97, - 720, 97, 720, 720, 720, 97, 720, 97, 720, 97, - 720, 97, 720, 97, 97, 97, 97, 460, 461, 97, - 97, 720, 720, 720, 720, 720, 97, 97, 97, 97, - 97, 97, 720, 97, 720, 97, 720, 97, 97, 97, - 452, 97, 97, 720, 720, 462, 97, 720, 97, 720, - 720, 720, 97, 720, 464, 720, 97, 720, 97, 97, - 97, 97, 97, 720, 720, 97, 465, 97, 466, 97, - 720, 97, 720, 97, 720, 97, 97, 97, 97, 97, - - 720, 720, 97, 467, 97, 720, 97, 720, 97, 720, - 97, 720, 97, 97, 468, 97, 97, 720, 720, 720, - 720, 97, 720, 97, 97, 97, 470, 97, 720, 720, - 97, 469, 97, 720, 97, 720, 97, 720, 97, 720, - 97, 720, 97, 97, 97, 720, 720, 97, 471, 97, - 472, 720, 720, 97, 720, 473, 720, 97, 720, 97, - 720, 97, 720, 97, 97, 97, 97, 97, 720, 475, - 97, 720, 97, 720, 97, 720, 474, 720, 97, 720, - 97, 97, 97, 97, 97, 720, 720, 97, 720, 97, - 720, 97, 720, 97, 476, 97, 720, 97, 97, 97, - - 97, 97, 720, 720, 97, 720, 97, 720, 97, 720, - 97, 478, 97, 720, 97, 477, 97, 97, 97, 479, - 97, 97, 720, 97, 720, 483, 720, 720, 720, 720, - 97, 97, 97, 97, 97, 97, 97, 720, 720, 97, - 97, 720, 97, 484, 485, 720, 97, 720, 97, 720, - 97, 720, 97, 97, 97, 97, 97, 720, 720, 97, - 720, 97, 487, 97, 720, 97, 720, 97, 720, 97, - 486, 97, 97, 97, 97, 488, 720, 720, 97, 720, - 97, 489, 720, 720, 97, 720, 97, 720, 97, 720, - 97, 97, 97, 97, 97, 720, 720, 720, 720, 97, - - 720, 97, 720, 97, 720, 97, 97, 490, 720, 491, - 97, 720, 97, 720, 720, 720, 97, 720, 97, 720, - 97, 720, 97, 97, 97, 97, 97, 720, 720, 492, - 493, 97, 720, 97, 97, 97, 720, 97, 720, 495, - 97, 720, 97, 720, 97, 720, 97, 720, 97, 720, - 97, 97, 97, 97, 97, 720, 720, 97, 720, 97, - 720, 97, 720, 497, 720, 97, 720, 97, 97, 498, - 97, 97, 720, 720, 720, 720, 97, 720, 97, 720, - 97, 97, 97, 720, 500, 720, 499, 97, 720, 97, - 720, 97, 720, 97, 720, 97, 720, 720, 720, 97, - - 97, 97, 720, 97, 97, 503, 720, 97, 97, 502, - 97, 720, 720, 720, 97, 720, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 505, 97, 97, - 720, 97, 720, 720, 720, 97, 720, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 507, 97, - 97, 720, 720, 720, 720, 720, 97, 720, 97, 97, - 97, 97, 97, 97, 517, 97, 720, 518, 97, 519, - 97, 720, 97, 720, 97, 720, 97, 720, 720, 720, - 97, 97, 97, 97, 97, 720, 521, 720, 720, 97, - 720, 97, 720, 97, 97, 97, 720, 97, 720, 720, - - 720, 97, 97, 522, 97, 97, 523, 97, 97, 720, - 97, 720, 720, 97, 524, 97, 720, 97, 97, 97, - 720, 97, 720, 720, 720, 97, 97, 97, 97, 97, - 97, 97, 97, 720, 97, 720, 720, 97, 525, 97, - 720, 97, 97, 97, 526, 97, 720, 720, 720, 97, - 97, 97, 97, 97, 97, 97, 97, 720, 97, 720, - 527, 97, 720, 97, 720, 97, 97, 97, 720, 97, - 720, 720, 720, 97, 97, 97, 97, 97, 97, 97, - 97, 528, 97, 720, 529, 97, 720, 530, 720, 97, - 97, 97, 720, 97, 720, 720, 720, 97, 97, 97, - - 531, 97, 97, 97, 97, 720, 97, 720, 720, 97, - 536, 97, 720, 97, 97, 97, 720, 97, 720, 720, - 720, 97, 97, 97, 97, 97, 97, 97, 97, 537, - 97, 720, 720, 97, 720, 97, 720, 97, 720, 97, - 720, 97, 720, 720, 720, 97, 97, 97, 97, 97, - 720, 539, 538, 720, 97, 720, 97, 720, 97, 97, - 97, 720, 97, 720, 720, 720, 97, 97, 97, 97, - 97, 97, 720, 97, 540, 97, 97, 541, 97, 97, - 720, 720, 97, 720, 720, 720, 97, 720, 97, 97, - 97, 97, 97, 97, 543, 97, 97, 97, 97, 720, - - 97, 97, 720, 720, 720, 720, 720, 545, 720, 97, - 97, 97, 97, 97, 97, 720, 97, 547, 720, 97, - 720, 97, 720, 97, 542, 97, 720, 97, 720, 97, - 720, 97, 97, 97, 720, 97, 720, 720, 720, 97, - 97, 97, 97, 97, 720, 549, 720, 720, 97, 720, - 97, 720, 97, 550, 97, 720, 97, 720, 720, 563, - 97, 97, 97, 97, 97, 720, 552, 720, 720, 97, - 554, 97, 720, 97, 97, 97, 720, 97, 720, 720, - 720, 97, 97, 97, 97, 97, 97, 97, 97, 720, - 97, 720, 720, 97, 564, 97, 565, 97, 720, 97, - - 720, 97, 720, 97, 720, 97, 97, 97, 720, 97, - 720, 97, 720, 97, 97, 97, 720, 97, 720, 567, - 720, 97, 97, 97, 97, 97, 720, 569, 720, 568, - 97, 720, 97, 720, 97, 97, 97, 720, 97, 720, - 720, 572, 97, 97, 570, 97, 97, 97, 571, 97, - 97, 97, 720, 97, 97, 720, 97, 720, 720, 720, - 97, 720, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 720, 573, 97, 720, 97, 720, 720, - 720, 97, 720, 97, 574, 97, 720, 97, 97, 97, - 97, 97, 720, 720, 97, 720, 97, 579, 97, 720, - - 97, 720, 97, 720, 97, 97, 97, 97, 97, 720, - 720, 97, 720, 97, 720, 97, 720, 97, 720, 97, - 720, 97, 97, 97, 97, 97, 720, 720, 97, 720, - 97, 720, 97, 720, 97, 580, 97, 720, 97, 97, - 97, 97, 97, 720, 720, 720, 720, 97, 720, 97, - 97, 97, 720, 97, 583, 720, 97, 581, 97, 720, - 97, 720, 97, 588, 97, 720, 97, 97, 97, 97, - 97, 720, 720, 720, 586, 97, 720, 97, 97, 97, - 720, 97, 720, 720, 97, 720, 97, 720, 97, 720, - 97, 720, 97, 720, 97, 97, 97, 97, 97, 720, - - 720, 97, 720, 97, 720, 97, 720, 590, 720, 97, - 720, 592, 97, 97, 97, 97, 720, 720, 720, 720, - 97, 720, 97, 97, 97, 720, 97, 720, 720, 601, - 720, 97, 720, 97, 97, 97, 602, 97, 720, 720, - 97, 720, 97, 720, 97, 720, 97, 720, 97, 720, - 97, 97, 97, 97, 97, 720, 720, 720, 720, 97, - 720, 97, 97, 97, 604, 97, 720, 720, 603, 720, - 97, 720, 97, 97, 97, 720, 97, 720, 605, 97, - 720, 97, 720, 97, 720, 97, 720, 97, 720, 97, - 720, 606, 97, 97, 97, 607, 720, 97, 97, 608, - - 97, 720, 720, 720, 97, 720, 97, 97, 97, 97, - 609, 97, 97, 97, 97, 97, 97, 720, 720, 97, - 720, 720, 720, 97, 720, 97, 720, 97, 720, 97, - 720, 613, 720, 97, 97, 97, 614, 97, 97, 97, - 720, 720, 97, 720, 720, 615, 617, 720, 97, 97, - 97, 97, 97, 97, 97, 720, 720, 97, 97, 720, - 720, 720, 97, 720, 97, 720, 620, 720, 97, 720, - 97, 720, 97, 97, 97, 622, 97, 720, 720, 720, - 97, 97, 97, 97, 97, 720, 720, 720, 623, 97, - 720, 720, 720, 97, 720, 97, 720, 97, 598, 598, - - 598, 720, 97, 720, 720, 720, 720, 97, 97, 720, - 630, 630, 630, 630, 630, 630, 630, 97, 97, 97, - 634, 97, 97, 97, 97, 720, 97, 97, 720, 720, - 633, 720, 720, 97, 97, 97, 97, 97, 97, 97, - 97, 720, 97, 97, 720, 720, 720, 720, 720, 97, - 97, 97, 97, 97, 97, 97, 720, 635, 97, 97, - 720, 97, 720, 720, 720, 97, 720, 97, 636, 97, - 720, 97, 97, 97, 97, 97, 720, 720, 97, 637, - 97, 720, 97, 720, 97, 720, 97, 720, 97, 97, - 97, 97, 97, 720, 720, 720, 720, 97, 720, 97, - - 97, 641, 720, 97, 720, 720, 97, 720, 97, 720, - 97, 720, 97, 642, 97, 720, 97, 97, 644, 97, - 97, 720, 720, 97, 647, 97, 720, 97, 720, 97, - 649, 97, 720, 97, 97, 97, 97, 97, 720, 720, - 720, 650, 97, 720, 97, 720, 97, 720, 97, 720, - 720, 97, 97, 97, 630, 630, 630, 630, 630, 630, - 630, 97, 97, 659, 97, 97, 97, 97, 97, 720, - 97, 97, 720, 720, 720, 720, 720, 97, 97, 97, - 660, 97, 97, 97, 720, 720, 97, 97, 720, 720, - 720, 720, 656, 97, 97, 97, 720, 97, 720, 720, - - 97, 661, 97, 720, 97, 720, 97, 720, 97, 720, - 97, 665, 666, 97, 97, 97, 720, 720, 97, 97, - 720, 97, 668, 673, 720, 97, 720, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 671, 97, 97, 720, - 97, 720, 674, 720, 720, 720, 720, 720, 97, 720, - 97, 720, 97, 657, 657, 657, 720, 97, 720, 720, - 720, 720, 97, 720, 720, 630, 630, 630, 630, 630, - 630, 630, 97, 97, 97, 720, 97, 720, 720, 720, - 681, 97, 720, 97, 97, 97, 720, 97, 720, 720, - 97, 682, 97, 720, 97, 720, 97, 720, 97, 720, - - 97, 97, 97, 97, 97, 720, 720, 683, 720, 97, - 720, 97, 97, 97, 720, 97, 720, 720, 720, 720, - 97, 720, 97, 97, 97, 720, 97, 720, 720, 97, - 687, 97, 720, 97, 720, 97, 720, 97, 720, 97, - 97, 97, 97, 97, 720, 720, 690, 692, 97, 720, - 97, 720, 97, 97, 97, 699, 97, 720, 720, 97, - 720, 720, 720, 97, 97, 97, 97, 97, 97, 700, - 97, 720, 97, 720, 97, 97, 97, 97, 97, 720, - 97, 720, 720, 97, 720, 720, 720, 97, 720, 97, - 97, 97, 97, 720, 97, 97, 97, 720, 705, 97, - - 702, 720, 720, 720, 720, 97, 720, 97, 720, 97, - 697, 697, 697, 720, 97, 720, 720, 720, 720, 97, - 720, 720, 630, 630, 630, 630, 630, 630, 630, 97, - 97, 97, 720, 97, 720, 720, 97, 720, 97, 720, - 97, 709, 97, 710, 97, 720, 97, 97, 97, 97, - 97, 720, 720, 720, 720, 97, 720, 97, 97, 97, - 720, 97, 720, 714, 97, 720, 97, 720, 97, 720, - 97, 720, 97, 720, 717, 97, 97, 97, 97, 720, - 720, 97, 720, 97, 720, 97, 720, 97, 720, 97, - 720, 97, 720, 97, 97, 97, 720, 720, 720, 720, - - 97, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 74, + 708, 97, 97, 97, 708, 97, 708, 708, 708, 708, + 97, 223, 97, 708, 97, 97, 97, 708, 225, 708, + 708, 224, 226, 708, 708, 97, 708, 97, 708, 97, + 228, 97, 708, 708, 97, 708, 708, 97, 708, 708, + + 708, 229, 708, 97, 708, 97, 708, 97, 97, 97, + 97, 97, 230, 708, 97, 231, 97, 708, 97, 708, + 97, 708, 97, 708, 97, 97, 97, 97, 97, 235, + 233, 708, 232, 97, 708, 97, 708, 234, 708, 97, + 97, 97, 708, 708, 97, 708, 236, 708, 708, 708, + 97, 97, 97, 97, 97, 97, 97, 97, 708, 97, + 97, 708, 708, 708, 708, 708, 97, 97, 97, 97, + 97, 238, 97, 97, 241, 237, 97, 242, 708, 240, + 708, 708, 97, 97, 97, 97, 97, 97, 97, 708, + 708, 97, 97, 708, 708, 708, 708, 708, 97, 708, + + 97, 708, 97, 248, 248, 248, 246, 97, 154, 154, + 154, 154, 154, 154, 154, 708, 708, 708, 708, 708, + 708, 708, 708, 97, 97, 708, 258, 708, 708, 708, + 708, 708, 708, 97, 97, 97, 97, 97, 97, 97, + 97, 249, 97, 97, 708, 708, 247, 708, 708, 97, + 259, 97, 97, 97, 97, 97, 708, 708, 97, 97, + 708, 708, 708, 97, 708, 97, 97, 97, 260, 97, + 261, 708, 708, 97, 97, 97, 97, 97, 97, 97, + 97, 708, 97, 708, 708, 97, 708, 97, 708, 97, + 708, 97, 708, 97, 708, 97, 262, 263, 97, 97, + + 708, 97, 708, 97, 708, 97, 97, 97, 708, 97, + 265, 264, 708, 97, 97, 97, 97, 97, 708, 708, + 708, 708, 97, 708, 97, 708, 97, 97, 97, 708, + 97, 708, 708, 266, 97, 97, 97, 97, 267, 97, + 708, 97, 708, 97, 268, 269, 97, 270, 97, 97, + 708, 708, 272, 708, 708, 271, 708, 708, 97, 97, + 97, 97, 97, 97, 97, 708, 708, 97, 97, 708, + 97, 708, 708, 708, 97, 708, 97, 273, 97, 708, + 97, 97, 97, 97, 97, 708, 708, 97, 708, 97, + 275, 97, 274, 97, 708, 97, 708, 97, 97, 97, + + 97, 97, 708, 708, 97, 708, 97, 278, 276, 708, + 97, 277, 97, 708, 97, 97, 97, 97, 97, 708, + 708, 708, 708, 97, 708, 97, 97, 97, 708, 97, + 708, 708, 279, 708, 97, 708, 97, 280, 97, 97, + 97, 708, 708, 708, 708, 97, 708, 97, 708, 97, + 97, 97, 708, 97, 708, 708, 283, 97, 97, 284, + 285, 97, 97, 286, 97, 97, 97, 708, 97, 97, + 708, 97, 708, 708, 289, 287, 708, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 288, 97, 290, 97, + 97, 708, 97, 708, 708, 97, 708, 708, 708, 97, + + 708, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 291, 708, 97, 97, 708, 294, 708, 708, 708, + 292, 708, 97, 97, 97, 97, 708, 97, 97, 97, + 708, 295, 97, 708, 97, 708, 708, 708, 97, 708, + 97, 296, 97, 708, 97, 97, 97, 97, 97, 708, + 708, 708, 708, 97, 708, 97, 97, 97, 708, 97, + 708, 708, 97, 298, 97, 708, 97, 708, 97, 708, + 97, 708, 97, 97, 97, 97, 97, 708, 708, 299, + 708, 97, 708, 97, 97, 97, 708, 97, 708, 708, + 300, 708, 97, 708, 97, 97, 97, 708, 97, 708, + + 304, 97, 708, 97, 301, 303, 708, 97, 708, 97, + 708, 97, 97, 97, 97, 97, 708, 708, 97, 708, + 97, 708, 97, 708, 97, 708, 97, 708, 97, 708, + 97, 305, 97, 97, 97, 708, 306, 97, 708, 708, + 708, 307, 708, 97, 97, 97, 97, 97, 97, 97, + 708, 708, 97, 97, 708, 708, 708, 708, 708, 97, + 97, 97, 708, 97, 708, 708, 97, 308, 97, 708, + 97, 708, 97, 708, 97, 708, 97, 309, 97, 97, + 97, 97, 708, 310, 311, 97, 708, 97, 708, 708, + 312, 97, 708, 97, 708, 97, 708, 97, 97, 97, + + 97, 97, 708, 708, 708, 708, 97, 708, 97, 97, + 97, 314, 97, 315, 318, 708, 708, 97, 316, 97, + 97, 97, 708, 97, 708, 708, 708, 317, 97, 708, + 97, 97, 97, 708, 97, 708, 708, 322, 708, 97, + 708, 97, 708, 97, 708, 97, 248, 248, 248, 708, + 97, 708, 708, 708, 708, 97, 708, 708, 323, 323, + 323, 323, 323, 323, 323, 97, 97, 328, 708, 97, + 708, 708, 97, 329, 97, 708, 97, 708, 97, 708, + 97, 708, 97, 330, 97, 97, 97, 97, 97, 708, + 708, 97, 708, 708, 708, 708, 708, 97, 97, 331, + + 97, 97, 97, 334, 97, 97, 97, 97, 333, 708, + 708, 708, 708, 708, 97, 97, 97, 97, 97, 97, + 97, 335, 708, 97, 97, 708, 97, 708, 708, 708, + 97, 708, 97, 332, 97, 708, 97, 97, 97, 97, + 97, 708, 708, 336, 708, 97, 708, 97, 97, 97, + 337, 97, 708, 708, 708, 708, 97, 708, 97, 708, + 97, 708, 97, 97, 338, 339, 97, 97, 708, 97, + 708, 708, 708, 97, 708, 97, 97, 97, 97, 97, + 97, 341, 340, 97, 97, 97, 342, 97, 97, 343, + 97, 708, 708, 344, 97, 708, 97, 97, 97, 97, + + 97, 97, 97, 97, 97, 97, 97, 708, 708, 97, + 708, 97, 708, 708, 708, 97, 708, 97, 346, 345, + 708, 97, 97, 97, 97, 97, 708, 708, 708, 708, + 97, 708, 97, 97, 97, 708, 97, 708, 347, 708, + 708, 97, 708, 97, 708, 348, 708, 97, 97, 349, + 708, 350, 97, 708, 97, 708, 708, 708, 97, 708, + 97, 708, 97, 708, 97, 97, 97, 97, 97, 708, + 708, 97, 708, 97, 708, 97, 708, 97, 708, 97, + 708, 97, 708, 97, 97, 97, 97, 97, 708, 354, + 97, 708, 708, 355, 708, 708, 97, 97, 97, 97, + + 97, 97, 97, 356, 708, 97, 97, 358, 97, 708, + 353, 708, 97, 708, 97, 708, 97, 362, 97, 708, + 97, 357, 97, 97, 359, 708, 97, 97, 360, 708, + 708, 708, 708, 97, 97, 97, 97, 97, 97, 361, + 97, 708, 97, 708, 97, 97, 97, 97, 97, 708, + 708, 363, 708, 97, 708, 97, 365, 97, 97, 97, + 708, 97, 708, 708, 708, 97, 97, 97, 97, 97, + 97, 97, 97, 708, 97, 708, 366, 97, 708, 97, + 370, 97, 369, 97, 367, 97, 708, 708, 708, 97, + 97, 97, 708, 97, 97, 97, 708, 371, 97, 708, + + 708, 708, 708, 708, 97, 97, 97, 97, 97, 97, + 372, 97, 97, 97, 97, 708, 708, 708, 708, 708, + 708, 97, 97, 97, 97, 97, 97, 97, 708, 708, + 97, 97, 708, 708, 708, 708, 708, 97, 708, 97, + 97, 97, 708, 375, 708, 374, 97, 708, 97, 708, + 97, 97, 97, 708, 97, 708, 708, 708, 97, 97, + 97, 97, 97, 376, 708, 97, 97, 97, 377, 97, + 97, 708, 97, 708, 708, 379, 97, 708, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 708, + 97, 97, 708, 97, 708, 708, 708, 97, 708, 97, + + 97, 97, 97, 97, 97, 381, 97, 97, 97, 97, + 708, 378, 97, 708, 97, 708, 708, 383, 97, 708, + 97, 708, 97, 708, 97, 97, 97, 382, 97, 708, + 708, 97, 708, 97, 708, 97, 708, 97, 708, 97, + 708, 97, 708, 97, 97, 97, 97, 708, 385, 708, + 97, 708, 708, 708, 708, 708, 97, 708, 97, 708, + 97, 384, 708, 97, 708, 97, 323, 323, 323, 323, + 323, 323, 323, 97, 708, 97, 708, 97, 97, 395, + 708, 394, 97, 396, 97, 708, 708, 708, 97, 708, + 97, 708, 97, 708, 97, 97, 97, 97, 97, 708, + + 398, 97, 708, 97, 389, 97, 708, 97, 708, 97, + 708, 97, 708, 97, 97, 97, 97, 399, 708, 97, + 97, 708, 400, 708, 708, 708, 97, 97, 97, 97, + 97, 97, 708, 97, 708, 97, 708, 97, 97, 97, + 97, 97, 402, 97, 708, 708, 97, 708, 708, 708, + 97, 97, 401, 97, 97, 97, 708, 97, 403, 97, + 708, 97, 97, 97, 97, 97, 708, 708, 708, 708, + 97, 708, 97, 708, 404, 405, 97, 708, 97, 406, + 708, 708, 97, 97, 97, 97, 97, 407, 708, 708, + 708, 97, 708, 97, 708, 97, 408, 97, 708, 97, + + 409, 97, 708, 97, 97, 97, 708, 97, 708, 97, + 708, 97, 97, 97, 708, 97, 708, 410, 708, 97, + 97, 97, 708, 97, 97, 412, 708, 411, 97, 708, + 97, 708, 708, 708, 97, 708, 97, 708, 97, 708, + 97, 97, 97, 97, 97, 708, 708, 97, 413, 97, + 708, 97, 708, 97, 708, 97, 708, 97, 414, 415, + 97, 97, 97, 97, 708, 708, 97, 708, 708, 708, + 419, 708, 97, 97, 97, 97, 97, 97, 708, 708, + 97, 97, 97, 97, 420, 708, 421, 708, 708, 708, + 97, 708, 97, 97, 97, 97, 708, 97, 422, 97, + + 97, 97, 97, 423, 708, 708, 708, 708, 708, 708, + 97, 97, 424, 97, 97, 97, 97, 708, 708, 97, + 97, 708, 97, 708, 708, 426, 97, 708, 97, 708, + 97, 708, 97, 97, 97, 425, 97, 428, 708, 708, + 429, 97, 708, 97, 97, 97, 708, 97, 708, 708, + 427, 708, 97, 708, 97, 97, 97, 708, 97, 708, + 708, 97, 708, 97, 708, 97, 708, 97, 708, 97, + 708, 97, 97, 97, 97, 97, 708, 708, 97, 431, + 97, 708, 97, 708, 97, 708, 97, 708, 97, 97, + 432, 97, 97, 708, 708, 708, 708, 97, 708, 97, + + 97, 97, 708, 97, 708, 434, 97, 435, 97, 708, + 97, 708, 97, 708, 97, 708, 97, 97, 436, 97, + 97, 708, 708, 708, 708, 97, 708, 97, 708, 97, + 97, 97, 708, 97, 708, 437, 97, 439, 708, 708, + 97, 97, 97, 97, 97, 440, 441, 97, 708, 97, + 708, 97, 97, 97, 97, 97, 708, 708, 708, 708, + 97, 708, 708, 708, 97, 97, 97, 708, 97, 708, + 708, 97, 444, 97, 708, 97, 442, 97, 708, 97, + 708, 97, 708, 97, 97, 97, 97, 97, 708, 446, + 97, 708, 708, 708, 708, 708, 97, 97, 97, 97, + + 97, 97, 97, 447, 708, 97, 97, 708, 97, 708, + 708, 708, 97, 708, 97, 708, 97, 708, 97, 708, + 97, 97, 97, 457, 97, 708, 708, 97, 708, 708, + 97, 708, 708, 708, 97, 708, 97, 708, 97, 708, + 97, 97, 97, 97, 97, 708, 708, 449, 458, 97, + 708, 97, 97, 460, 708, 97, 708, 708, 708, 708, + 97, 708, 97, 97, 97, 708, 97, 708, 708, 97, + 461, 97, 462, 97, 708, 97, 708, 97, 708, 97, + 97, 97, 97, 97, 708, 708, 97, 463, 97, 708, + 97, 708, 97, 708, 97, 708, 97, 97, 464, 97, + + 97, 708, 708, 708, 708, 97, 708, 97, 97, 97, + 466, 97, 708, 708, 97, 465, 97, 708, 97, 708, + 97, 708, 97, 708, 97, 708, 97, 97, 97, 708, + 708, 97, 467, 97, 468, 708, 708, 97, 708, 469, + 708, 97, 708, 97, 708, 97, 708, 97, 97, 97, + 97, 97, 708, 471, 97, 708, 97, 708, 97, 708, + 470, 708, 97, 708, 97, 97, 97, 97, 97, 708, + 708, 97, 708, 97, 708, 97, 708, 97, 472, 97, + 708, 97, 97, 97, 97, 97, 708, 708, 97, 708, + 97, 708, 97, 708, 97, 474, 97, 708, 97, 473, + + 97, 97, 97, 475, 97, 97, 708, 97, 708, 479, + 708, 708, 708, 708, 97, 97, 97, 97, 97, 97, + 97, 708, 708, 97, 97, 708, 97, 480, 481, 708, + 97, 708, 97, 708, 97, 708, 97, 97, 97, 97, + 97, 708, 708, 97, 708, 97, 483, 97, 708, 97, + 708, 97, 708, 97, 482, 97, 97, 97, 97, 484, + 708, 708, 97, 708, 97, 485, 708, 708, 97, 708, + 97, 708, 97, 708, 97, 97, 97, 97, 97, 708, + 708, 708, 708, 97, 708, 97, 708, 97, 708, 97, + 97, 486, 708, 487, 97, 708, 97, 708, 708, 708, + + 97, 708, 97, 708, 97, 708, 97, 97, 97, 97, + 97, 708, 708, 488, 489, 97, 708, 97, 97, 97, + 708, 97, 708, 491, 97, 708, 97, 708, 97, 708, + 97, 708, 97, 708, 97, 97, 97, 97, 97, 708, + 708, 97, 708, 97, 708, 97, 708, 493, 708, 97, + 708, 97, 97, 494, 97, 97, 708, 708, 708, 708, + 97, 708, 97, 708, 97, 97, 97, 708, 496, 708, + 495, 97, 708, 97, 708, 97, 708, 97, 708, 97, + 708, 708, 708, 97, 97, 97, 708, 97, 97, 499, + 708, 97, 97, 498, 97, 708, 708, 708, 97, 708, + + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 501, 97, 97, 708, 97, 708, 708, 708, 97, + 708, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 503, 708, 97, 708, 708, 708, 708, 708, + 97, 708, 97, 97, 97, 708, 97, 708, 513, 97, + 514, 708, 708, 97, 708, 97, 97, 97, 97, 708, + 97, 97, 97, 708, 516, 97, 708, 97, 708, 708, + 708, 97, 708, 97, 708, 97, 708, 97, 97, 517, + 97, 97, 708, 708, 97, 708, 97, 708, 97, 708, + 518, 519, 97, 708, 97, 97, 97, 97, 97, 708, + + 708, 97, 708, 97, 708, 97, 708, 97, 708, 97, + 708, 97, 97, 97, 97, 97, 708, 708, 708, 520, + 97, 708, 97, 97, 97, 521, 97, 708, 708, 97, + 708, 97, 708, 97, 708, 97, 708, 97, 708, 97, + 97, 97, 97, 97, 708, 522, 97, 708, 97, 708, + 97, 708, 97, 708, 97, 708, 97, 97, 97, 97, + 97, 708, 708, 708, 523, 97, 708, 97, 97, 97, + 708, 97, 708, 708, 525, 524, 97, 708, 97, 708, + 97, 708, 97, 708, 97, 97, 97, 97, 97, 708, + 708, 97, 708, 97, 708, 526, 708, 97, 531, 97, + + 708, 97, 97, 97, 97, 97, 708, 708, 708, 708, + 97, 708, 97, 97, 97, 708, 97, 708, 708, 97, + 532, 97, 708, 97, 708, 97, 708, 97, 708, 97, + 97, 97, 97, 97, 708, 708, 97, 708, 97, 534, + 97, 708, 97, 708, 97, 708, 97, 533, 97, 97, + 97, 97, 97, 708, 708, 97, 708, 708, 708, 708, + 708, 97, 97, 97, 97, 97, 97, 97, 536, 535, + 97, 97, 708, 97, 708, 708, 708, 97, 708, 97, + 708, 97, 708, 97, 97, 97, 97, 97, 708, 708, + 97, 708, 97, 708, 97, 708, 538, 708, 97, 708, + + 540, 97, 97, 97, 97, 708, 708, 708, 708, 97, + 708, 97, 97, 97, 708, 97, 542, 708, 537, 708, + 97, 708, 97, 97, 97, 708, 97, 708, 708, 97, + 708, 97, 708, 97, 708, 97, 708, 97, 708, 97, + 708, 97, 97, 97, 97, 708, 708, 544, 97, 708, + 97, 708, 708, 545, 97, 708, 97, 708, 97, 708, + 97, 708, 97, 97, 97, 97, 708, 708, 547, 97, + 549, 97, 708, 708, 708, 97, 708, 97, 708, 97, + 708, 97, 97, 97, 97, 97, 708, 708, 708, 558, + 97, 708, 97, 708, 97, 708, 97, 97, 559, 708, + + 708, 97, 708, 97, 708, 708, 708, 97, 708, 97, + 708, 97, 708, 97, 97, 97, 97, 97, 708, 561, + 708, 708, 97, 708, 97, 708, 97, 97, 97, 708, + 563, 708, 562, 97, 708, 97, 708, 97, 97, 97, + 708, 97, 708, 708, 566, 97, 97, 564, 97, 97, + 97, 565, 97, 97, 97, 708, 97, 97, 708, 97, + 708, 708, 708, 97, 708, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 708, 567, 97, 708, + 97, 708, 708, 708, 97, 708, 97, 568, 97, 708, + 97, 97, 97, 97, 97, 708, 708, 97, 708, 97, + + 573, 97, 708, 97, 708, 97, 708, 97, 97, 97, + 97, 97, 708, 708, 97, 708, 97, 708, 97, 708, + 97, 708, 97, 708, 97, 97, 97, 97, 97, 708, + 708, 97, 708, 97, 708, 97, 708, 97, 574, 97, + 708, 97, 97, 97, 97, 97, 708, 708, 708, 708, + 97, 708, 97, 97, 97, 708, 97, 577, 708, 97, + 575, 97, 708, 97, 708, 97, 582, 97, 708, 97, + 97, 97, 97, 97, 708, 708, 708, 580, 97, 708, + 97, 97, 97, 708, 97, 708, 708, 97, 708, 97, + 708, 97, 708, 97, 708, 97, 708, 97, 97, 97, + + 97, 97, 708, 708, 97, 708, 97, 708, 97, 708, + 584, 708, 97, 708, 586, 97, 97, 97, 97, 708, + 708, 97, 708, 97, 708, 97, 708, 97, 595, 97, + 708, 97, 97, 97, 97, 97, 708, 708, 97, 708, + 97, 708, 97, 708, 97, 708, 97, 708, 97, 708, + 97, 97, 97, 97, 97, 596, 597, 97, 598, 708, + 708, 708, 708, 97, 97, 97, 97, 97, 97, 97, + 97, 600, 97, 97, 708, 708, 708, 708, 708, 97, + 97, 599, 97, 97, 97, 97, 97, 601, 97, 97, + 708, 708, 708, 708, 708, 97, 602, 97, 97, 97, + + 97, 97, 708, 708, 97, 97, 708, 708, 708, 97, + 708, 97, 708, 97, 708, 97, 708, 606, 708, 97, + 97, 97, 607, 97, 97, 97, 708, 708, 97, 708, + 708, 608, 610, 708, 97, 97, 97, 97, 97, 97, + 97, 708, 708, 97, 97, 708, 708, 708, 97, 708, + 97, 708, 613, 708, 97, 708, 97, 708, 97, 97, + 97, 615, 97, 708, 708, 708, 97, 97, 97, 97, + 97, 708, 708, 708, 616, 97, 708, 708, 708, 97, + 708, 97, 708, 97, 592, 592, 592, 708, 97, 708, + 708, 708, 708, 97, 97, 708, 623, 623, 623, 623, + + 623, 623, 623, 97, 97, 626, 97, 97, 97, 97, + 97, 708, 97, 97, 708, 708, 708, 708, 708, 97, + 97, 97, 97, 97, 97, 97, 708, 708, 97, 97, + 708, 708, 708, 97, 708, 97, 708, 97, 708, 97, + 708, 97, 627, 97, 97, 97, 628, 97, 708, 97, + 708, 97, 97, 97, 708, 97, 629, 97, 708, 97, + 97, 97, 708, 97, 708, 97, 708, 97, 97, 97, + 708, 97, 708, 97, 708, 97, 97, 633, 708, 97, + 708, 97, 708, 97, 97, 97, 634, 97, 708, 97, + 708, 97, 97, 636, 708, 97, 639, 97, 708, 97, + + 97, 97, 708, 97, 641, 97, 708, 97, 97, 97, + 708, 97, 642, 708, 708, 97, 97, 97, 708, 97, + 708, 708, 97, 97, 97, 623, 623, 623, 623, 623, + 623, 623, 97, 97, 97, 97, 97, 97, 97, 708, + 708, 97, 97, 708, 708, 708, 97, 708, 97, 708, + 651, 708, 97, 708, 708, 708, 97, 97, 97, 97, + 97, 708, 708, 648, 652, 97, 708, 97, 708, 97, + 708, 97, 708, 97, 708, 97, 656, 97, 97, 657, + 708, 97, 659, 97, 708, 97, 97, 97, 708, 97, + 708, 708, 708, 97, 97, 97, 97, 97, 664, 97, + + 708, 662, 97, 665, 708, 708, 97, 708, 97, 97, + 97, 97, 708, 97, 708, 97, 708, 708, 97, 649, + 649, 649, 708, 708, 708, 708, 708, 708, 97, 97, + 708, 623, 623, 623, 623, 623, 623, 623, 97, 97, + 97, 97, 97, 97, 97, 97, 672, 97, 97, 708, + 708, 708, 673, 708, 97, 97, 97, 97, 97, 97, + 97, 97, 708, 97, 97, 708, 708, 708, 708, 708, + 97, 97, 97, 97, 97, 97, 97, 708, 677, 97, + 97, 708, 97, 708, 680, 708, 97, 708, 97, 682, + 97, 708, 97, 97, 97, 97, 97, 708, 708, 708, + + 708, 97, 708, 97, 97, 97, 708, 97, 708, 689, + 97, 708, 97, 708, 97, 708, 97, 708, 97, 708, + 97, 708, 97, 97, 97, 97, 708, 708, 97, 97, + 708, 694, 708, 691, 708, 97, 708, 97, 97, 97, + 97, 708, 97, 708, 97, 708, 708, 97, 687, 687, + 687, 708, 708, 708, 708, 708, 708, 97, 708, 708, + 623, 623, 623, 623, 623, 623, 623, 97, 97, 97, + 698, 97, 708, 708, 97, 708, 97, 708, 97, 708, + 97, 708, 97, 708, 97, 97, 97, 97, 97, 708, + 702, 97, 708, 97, 708, 705, 708, 97, 708, 97, + + 708, 97, 97, 97, 97, 97, 708, 708, 708, 708, + 97, 708, 97, 708, 97, 708, 97, 708, 708, 708, + 708, 97, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 83, 83, 83, 720, 83, 83, 83, - 83, 83, 83, 83, 83, 90, 90, 720, 720, 90, - 720, 90, 156, 720, 156, 159, 159, 720, 159, 159, - - 160, 160, 720, 160, 160, 160, 720, 160, 160, 160, - 160, 160, 163, 163, 163, 720, 163, 163, 163, 163, - 163, 163, 163, 163, 165, 165, 165, 165, 165, 165, - 165, 165, 720, 165, 165, 167, 720, 720, 167, 167, - 167, 167, 167, 167, 167, 167, 168, 720, 720, 168, - 168, 168, 168, 168, 168, 168, 168, 170, 720, 720, - 170, 720, 170, 170, 170, 170, 170, 170, 174, 174, - 720, 174, 174, 175, 175, 720, 175, 175, 103, 103, - 720, 103, 103, 15, 720, 720, 720, 720, 720, 720, - 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, - - 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, - 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, - 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, - 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, - 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, - 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, - 720, 720 + 74, 74, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 83, 83, 83, 708, 83, 83, + + 83, 83, 83, 83, 83, 83, 90, 90, 708, 708, + 90, 708, 90, 156, 708, 156, 159, 159, 708, 159, + 159, 160, 160, 708, 160, 160, 160, 708, 160, 160, + 160, 160, 160, 163, 163, 163, 708, 163, 163, 163, + 163, 163, 163, 163, 163, 165, 165, 165, 165, 165, + 165, 165, 165, 708, 165, 165, 167, 708, 708, 167, + 167, 167, 167, 167, 167, 167, 167, 168, 708, 708, + 168, 168, 168, 168, 168, 168, 168, 168, 170, 708, + 708, 170, 708, 170, 170, 170, 170, 170, 170, 174, + 174, 708, 174, 174, 175, 175, 708, 175, 175, 103, + + 103, 708, 103, 103, 15, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708 } ; -static yyconst short int yy_chk[4563] = +static yyconst short int yy_chk[4484] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -1282,83 +1267,83 @@ static yyconst short int yy_chk[4563] = 22, 22, 24, 24, 24, 24, 24, 24, 28, 28, 28, 28, 28, 28, 28, 34, 253, 253, 34, 77, 77, 77, 78, 78, 78, 34, 87, 34, 9, 34, - 9, 82, 82, 82, 34, 158, 480, 158, 10, 716, + 9, 82, 82, 82, 34, 158, 476, 158, 10, 704, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 13, 480, 13, 87, 38, 79, - 326, 11, 11, 11, 11, 14, 326, 14, 38, 11, + 11, 11, 11, 11, 13, 476, 13, 87, 38, 79, + 325, 11, 11, 11, 11, 14, 325, 14, 38, 11, - 38, 32, 38, 79, 32, 325, 712, 38, 32, 325, - 250, 32, 32, 32, 32, 32, 41, 250, 708, 33, - 32, 11, 11, 11, 32, 33, 41, 328, 41, 33, - 41, 33, 33, 33, 79, 41, 706, 328, 33, 92, + 38, 32, 38, 79, 32, 324, 700, 38, 32, 324, + 250, 32, 32, 32, 32, 32, 41, 250, 697, 33, + 32, 11, 11, 11, 32, 33, 41, 327, 41, 33, + 41, 33, 33, 33, 79, 41, 695, 327, 33, 92, 92, 92, 92, 92, 92, 92, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 41, 395, 35, 171, 171, 171, 395, 12, - 12, 12, 12, 704, 35, 35, 35, 12, 35, 169, - 169, 327, 251, 35, 42, 42, 35, 327, 42, 251, - 169, 36, 36, 703, 42, 48, 42, 456, 42, 12, + 12, 12, 41, 393, 35, 171, 171, 171, 393, 12, + 12, 12, 12, 693, 35, 35, 35, 12, 35, 169, + 169, 326, 251, 35, 42, 42, 35, 326, 42, 251, + 169, 36, 36, 692, 42, 48, 42, 453, 42, 12, 12, 12, 36, 42, 36, 48, 36, 48, 36, 48, - 456, 36, 392, 42, 48, 701, 516, 39, 39, 392, - 39, 393, 394, 516, 12, 12, 12, 21, 39, 39, - 39, 48, 39, 394, 457, 39, 393, 39, 457, 559, - 458, 21, 458, 559, 21, 21, 21, 21, 21, 21, + 453, 36, 390, 42, 48, 690, 512, 39, 39, 390, + 39, 391, 392, 512, 12, 12, 12, 21, 39, 39, + 39, 48, 39, 392, 454, 39, 391, 39, 454, 554, + 455, 21, 455, 554, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 562, 698, 21, 21, 21, 21, 21, 21, 21, 21, + 557, 688, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 31, 514, 562, 31, 31, + 21, 21, 21, 21, 21, 31, 510, 557, 31, 31, - 31, 31, 31, 31, 31, 515, 695, 514, 515, 31, + 31, 31, 31, 31, 31, 511, 685, 510, 511, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 629, 629, 694, 31, 31, + 31, 31, 31, 31, 31, 622, 622, 684, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 37, 655, 513, 655, 691, 40, 40, 560, 560, 560, - 37, 561, 37, 40, 37, 597, 40, 513, 40, 37, - 40, 689, 597, 685, 680, 40, 561, 43, 43, 599, - 43, 678, 37, 599, 677, 676, 44, 675, 43, 44, - - 43, 672, 43, 37, 43, 560, 44, 43, 44, 45, - 44, 670, 45, 669, 664, 44, 45, 663, 46, 45, - 662, 45, 658, 45, 46, 46, 654, 45, 45, 653, - 652, 43, 45, 47, 651, 46, 648, 46, 646, 46, - 645, 46, 643, 47, 46, 47, 49, 47, 46, 640, - 639, 47, 47, 49, 638, 632, 49, 46, 49, 628, - 49, 631, 631, 631, 627, 49, 50, 50, 50, 50, - 50, 50, 50, 47, 89, 89, 89, 50, 626, 624, - 89, 97, 621, 619, 618, 616, 89, 89, 612, 611, - 610, 97, 50, 97, 600, 97, 596, 50, 74, 631, - - 97, 595, 74, 74, 74, 74, 74, 74, 74, 74, + 37, 647, 509, 647, 681, 40, 40, 555, 555, 555, + 37, 556, 37, 40, 37, 591, 40, 509, 40, 37, + 40, 679, 591, 675, 671, 40, 556, 43, 43, 593, + 43, 669, 37, 593, 668, 667, 44, 666, 43, 44, + + 43, 663, 43, 37, 43, 555, 44, 43, 44, 45, + 44, 661, 45, 660, 655, 44, 45, 654, 46, 45, + 653, 45, 650, 45, 46, 46, 646, 45, 45, 645, + 644, 43, 45, 47, 643, 46, 640, 46, 638, 46, + 637, 46, 635, 47, 46, 47, 49, 47, 46, 632, + 631, 47, 47, 49, 630, 625, 49, 46, 49, 621, + 49, 624, 624, 624, 620, 49, 50, 50, 50, 50, + 50, 50, 50, 47, 89, 89, 89, 50, 619, 617, + 89, 97, 614, 612, 611, 609, 89, 89, 605, 604, + 603, 97, 50, 97, 594, 97, 590, 50, 74, 624, + + 97, 589, 74, 74, 74, 74, 74, 74, 74, 74, 74, 95, 95, 95, 95, 95, 95, 95, 74, 74, 74, 74, 98, 99, 178, 178, 178, 178, 178, 178, - 178, 594, 98, 99, 98, 99, 98, 99, 593, 98, - 591, 98, 99, 100, 101, 587, 585, 584, 74, 74, - 74, 582, 577, 100, 101, 100, 101, 100, 101, 102, - 576, 575, 100, 101, 558, 557, 100, 556, 555, 102, - 553, 102, 551, 102, 74, 75, 548, 102, 102, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 546, 104, - 544, 542, 105, 535, 104, 75, 75, 75, 75, 104, - - 534, 104, 105, 104, 105, 106, 105, 533, 104, 532, - 105, 105, 75, 520, 512, 106, 511, 106, 107, 106, - 510, 509, 506, 504, 106, 75, 75, 75, 107, 108, - 107, 107, 107, 679, 679, 679, 501, 107, 496, 108, - 494, 108, 482, 108, 109, 109, 481, 463, 108, 459, - 455, 75, 110, 110, 454, 109, 453, 109, 109, 109, - 452, 451, 448, 110, 109, 110, 111, 110, 446, 112, - 441, 679, 110, 112, 436, 433, 111, 111, 111, 112, - 111, 112, 113, 112, 421, 111, 420, 419, 112, 400, - 390, 389, 113, 388, 113, 386, 113, 114, 114, 114, - - 116, 113, 382, 115, 115, 380, 375, 114, 370, 114, + 178, 588, 98, 99, 98, 99, 98, 99, 587, 98, + 585, 98, 99, 100, 101, 581, 579, 578, 74, 74, + 74, 576, 571, 100, 101, 100, 101, 100, 101, 102, + 570, 569, 100, 101, 553, 552, 100, 551, 550, 102, + 548, 102, 546, 102, 74, 75, 543, 102, 102, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 541, 104, + 539, 537, 105, 530, 104, 75, 75, 75, 75, 104, + + 529, 104, 105, 104, 105, 106, 105, 528, 104, 527, + 105, 105, 75, 515, 508, 106, 507, 106, 107, 106, + 506, 505, 502, 500, 106, 75, 75, 75, 107, 108, + 107, 107, 107, 670, 670, 670, 497, 107, 492, 108, + 490, 108, 478, 108, 109, 109, 477, 459, 108, 456, + 452, 75, 110, 110, 451, 109, 450, 109, 109, 109, + 449, 448, 445, 110, 109, 110, 111, 110, 443, 112, + 438, 670, 110, 112, 433, 430, 111, 111, 111, 112, + 111, 112, 113, 112, 418, 111, 417, 416, 112, 397, + 388, 387, 113, 386, 113, 384, 113, 114, 114, 114, + + 116, 113, 380, 115, 115, 378, 373, 114, 368, 114, 116, 114, 116, 115, 116, 115, 114, 115, 117, 116, - 366, 115, 115, 355, 354, 120, 353, 334, 117, 322, - 117, 117, 117, 120, 321, 320, 121, 117, 314, 121, - 303, 298, 294, 120, 122, 120, 121, 120, 121, 283, - 121, 282, 120, 255, 122, 121, 122, 254, 122, 123, + 364, 115, 115, 353, 352, 120, 351, 332, 117, 321, + 117, 117, 117, 120, 320, 319, 121, 117, 313, 121, + 302, 297, 293, 120, 122, 120, 121, 120, 121, 282, + 121, 281, 120, 255, 122, 121, 122, 254, 122, 123, 123, 249, 245, 122, 244, 243, 239, 227, 221, 123, 124, 123, 217, 123, 206, 205, 123, 123, 123, 177, 124, 125, 124, 124, 124, 173, 168, 126, 166, 124, @@ -1388,407 +1373,397 @@ static yyconst short int yy_chk[4563] = 153, 0, 153, 155, 155, 155, 153, 153, 154, 154, 154, 154, 154, 154, 154, 155, 155, 155, 155, 155, - 155, 155, 0, 0, 181, 182, 0, 181, 0, 0, - 0, 0, 0, 0, 181, 182, 181, 182, 181, 182, - 183, 155, 181, 181, 182, 0, 154, 0, 184, 0, - 183, 185, 183, 0, 183, 0, 0, 0, 184, 183, - 184, 185, 184, 185, 185, 185, 186, 184, 0, 187, - 185, 0, 188, 186, 0, 0, 186, 0, 186, 187, - 186, 187, 188, 187, 188, 186, 188, 189, 187, 188, - 0, 188, 0, 190, 0, 0, 0, 189, 0, 189, - - 0, 189, 0, 190, 191, 190, 189, 190, 0, 190, - 192, 191, 190, 0, 191, 0, 191, 0, 191, 0, - 192, 193, 192, 191, 192, 0, 0, 192, 0, 192, - 0, 193, 194, 193, 0, 193, 0, 0, 0, 0, - 193, 0, 194, 0, 194, 0, 194, 195, 195, 194, - 194, 194, 0, 0, 196, 195, 0, 196, 195, 0, - 195, 0, 195, 0, 196, 197, 196, 195, 196, 0, - 0, 198, 0, 196, 0, 197, 0, 197, 197, 197, - 0, 198, 199, 198, 197, 198, 0, 0, 200, 0, - 198, 200, 199, 199, 199, 0, 199, 0, 200, 201, - - 200, 199, 200, 0, 0, 202, 0, 200, 202, 201, - 0, 201, 201, 201, 0, 202, 203, 202, 201, 202, - 0, 0, 0, 0, 202, 0, 203, 204, 203, 0, - 203, 0, 0, 203, 0, 203, 0, 204, 204, 204, - 207, 204, 0, 0, 0, 0, 204, 0, 208, 0, - 207, 209, 207, 0, 207, 0, 0, 207, 208, 207, - 208, 209, 208, 209, 209, 209, 210, 208, 0, 211, - 209, 0, 212, 0, 0, 212, 210, 0, 210, 211, - 210, 211, 212, 211, 212, 210, 212, 211, 211, 213, - 214, 212, 0, 215, 0, 0, 213, 0, 0, 0, - - 214, 0, 214, 215, 214, 215, 213, 215, 213, 214, - 213, 216, 215, 0, 218, 213, 0, 218, 0, 0, - 0, 216, 0, 216, 218, 216, 218, 0, 218, 219, - 216, 0, 219, 218, 0, 220, 0, 0, 0, 219, - 0, 219, 220, 219, 0, 220, 222, 220, 219, 220, - 0, 0, 0, 0, 220, 0, 222, 223, 222, 0, - 222, 0, 0, 224, 222, 222, 0, 223, 0, 223, - 0, 223, 0, 224, 225, 224, 223, 224, 0, 0, - 224, 0, 224, 0, 225, 226, 225, 0, 225, 0, - 0, 225, 0, 225, 0, 226, 228, 226, 0, 226, - - 0, 229, 229, 0, 226, 226, 228, 0, 228, 0, - 228, 0, 229, 230, 229, 228, 229, 0, 0, 231, - 0, 229, 0, 230, 0, 230, 0, 230, 0, 231, - 0, 231, 230, 231, 232, 233, 0, 232, 231, 0, - 0, 0, 233, 0, 232, 233, 232, 233, 232, 233, - 234, 0, 0, 232, 233, 0, 0, 0, 0, 0, - 234, 235, 234, 0, 234, 0, 0, 236, 234, 234, - 0, 235, 0, 235, 0, 235, 0, 236, 235, 236, - 235, 236, 237, 0, 236, 237, 236, 0, 238, 0, - 0, 238, 237, 0, 237, 0, 237, 0, 238, 240, - - 238, 237, 238, 0, 0, 0, 0, 238, 0, 240, - 241, 240, 240, 240, 240, 242, 0, 0, 240, 240, - 241, 242, 241, 0, 241, 0, 0, 0, 241, 241, - 0, 242, 246, 242, 0, 242, 0, 0, 246, 0, - 242, 0, 246, 0, 246, 0, 246, 248, 248, 248, - 0, 246, 0, 0, 0, 0, 258, 259, 0, 248, - 248, 248, 248, 248, 248, 248, 258, 259, 258, 259, - 258, 259, 260, 259, 0, 258, 259, 0, 261, 260, - 0, 0, 260, 0, 260, 0, 260, 0, 261, 261, - 261, 260, 261, 262, 263, 0, 0, 261, 0, 0, - - 0, 0, 0, 262, 263, 262, 263, 262, 263, 265, - 265, 264, 262, 263, 264, 0, 0, 0, 0, 0, - 265, 264, 265, 264, 265, 264, 266, 266, 0, 265, - 264, 0, 267, 0, 0, 0, 266, 0, 266, 263, - 266, 0, 267, 268, 267, 266, 267, 0, 0, 267, - 0, 267, 0, 268, 269, 268, 268, 268, 0, 0, - 0, 0, 268, 0, 269, 0, 269, 0, 269, 271, - 269, 270, 270, 269, 0, 272, 0, 0, 0, 271, - 0, 271, 270, 271, 270, 272, 270, 272, 271, 272, - 273, 270, 273, 274, 272, 274, 275, 0, 0, 275, - - 273, 0, 273, 274, 273, 274, 275, 274, 275, 273, - 275, 276, 274, 0, 0, 275, 0, 277, 0, 0, - 0, 276, 0, 276, 277, 276, 0, 277, 278, 277, - 276, 277, 0, 0, 0, 0, 277, 0, 278, 279, - 278, 0, 278, 0, 278, 0, 0, 278, 0, 279, - 0, 279, 0, 279, 280, 279, 0, 280, 279, 0, - 281, 0, 0, 0, 280, 0, 280, 0, 280, 0, - 281, 284, 281, 280, 281, 0, 0, 285, 0, 281, - 0, 284, 0, 284, 0, 284, 0, 285, 0, 285, - 284, 285, 286, 287, 0, 285, 285, 0, 0, 286, - - 0, 0, 286, 287, 286, 287, 286, 287, 288, 287, - 0, 286, 287, 289, 289, 0, 284, 0, 288, 0, - 288, 0, 288, 291, 289, 0, 289, 288, 289, 290, - 289, 0, 291, 289, 290, 0, 0, 0, 0, 290, - 292, 290, 291, 290, 291, 290, 291, 0, 290, 0, - 292, 291, 292, 293, 292, 0, 0, 292, 0, 292, - 0, 295, 295, 293, 296, 293, 0, 293, 0, 0, - 0, 295, 293, 295, 296, 295, 296, 297, 296, 0, - 295, 0, 296, 296, 0, 299, 300, 297, 299, 297, - 297, 297, 0, 0, 0, 299, 297, 299, 0, 299, - - 301, 300, 0, 301, 299, 0, 0, 0, 0, 0, - 301, 300, 301, 300, 301, 300, 302, 302, 304, 301, - 300, 0, 0, 0, 0, 0, 0, 302, 304, 302, - 304, 302, 304, 305, 0, 0, 302, 304, 0, 0, - 0, 0, 0, 305, 0, 305, 306, 305, 0, 306, - 0, 305, 305, 0, 307, 0, 306, 308, 306, 0, - 306, 0, 0, 0, 307, 306, 307, 308, 307, 308, - 0, 308, 310, 307, 309, 309, 308, 0, 311, 0, - 0, 313, 310, 0, 310, 309, 310, 309, 311, 309, - 311, 310, 311, 312, 309, 0, 313, 311, 0, 315, - - 0, 0, 0, 312, 0, 312, 313, 312, 313, 315, - 313, 315, 312, 315, 316, 313, 0, 310, 315, 0, - 317, 0, 0, 317, 316, 0, 316, 0, 316, 0, - 317, 318, 317, 316, 317, 0, 0, 319, 0, 317, - 0, 318, 0, 318, 0, 318, 0, 319, 0, 319, - 318, 319, 323, 0, 319, 0, 319, 0, 0, 0, - 0, 0, 323, 0, 323, 0, 323, 318, 0, 329, - 0, 323, 324, 324, 324, 324, 324, 324, 324, 329, - 0, 329, 0, 329, 330, 330, 0, 329, 329, 0, - 0, 0, 0, 331, 331, 330, 0, 330, 0, 330, - - 332, 332, 0, 331, 330, 331, 0, 331, 0, 333, - 324, 332, 331, 332, 0, 332, 335, 335, 0, 333, - 332, 333, 0, 333, 0, 336, 336, 335, 333, 335, - 0, 335, 0, 0, 0, 336, 335, 336, 337, 336, - 0, 337, 0, 0, 336, 0, 338, 0, 337, 339, - 337, 0, 337, 0, 0, 0, 338, 337, 338, 339, - 338, 339, 0, 339, 341, 338, 340, 340, 339, 0, - 342, 341, 0, 0, 341, 0, 341, 340, 341, 340, - 342, 340, 342, 341, 342, 343, 340, 0, 343, 342, - 0, 344, 343, 344, 0, 343, 0, 343, 0, 343, - - 0, 344, 0, 344, 343, 344, 345, 346, 0, 345, - 344, 0, 0, 345, 0, 0, 345, 346, 345, 346, - 345, 346, 347, 346, 0, 345, 346, 0, 0, 0, - 0, 0, 347, 0, 347, 0, 347, 348, 348, 0, - 347, 347, 0, 349, 0, 0, 0, 348, 0, 348, - 0, 348, 0, 349, 350, 349, 348, 349, 0, 0, - 351, 349, 349, 0, 350, 0, 350, 0, 350, 0, - 351, 350, 351, 350, 351, 352, 356, 0, 0, 351, - 0, 0, 0, 356, 0, 352, 356, 352, 356, 352, - 356, 0, 0, 358, 352, 356, 357, 357, 0, 357, - - 0, 0, 0, 358, 0, 358, 357, 358, 357, 0, - 357, 358, 358, 360, 359, 357, 359, 0, 0, 0, - 0, 0, 0, 360, 359, 360, 359, 360, 359, 361, - 0, 0, 360, 359, 0, 362, 0, 0, 362, 361, - 0, 361, 0, 361, 0, 362, 363, 362, 361, 362, - 364, 0, 0, 365, 362, 0, 363, 364, 363, 0, - 363, 0, 0, 363, 0, 363, 0, 364, 365, 364, - 0, 364, 0, 0, 367, 0, 364, 0, 365, 0, - 365, 0, 365, 0, 367, 368, 367, 365, 367, 0, - 0, 369, 367, 367, 0, 368, 0, 368, 0, 368, - - 0, 369, 371, 369, 368, 369, 0, 0, 0, 0, - 369, 0, 371, 372, 371, 0, 371, 0, 371, 373, - 372, 371, 0, 372, 0, 372, 0, 372, 0, 373, - 374, 373, 372, 373, 0, 0, 0, 0, 373, 0, - 374, 0, 374, 376, 374, 0, 377, 0, 374, 374, - 376, 0, 0, 376, 378, 376, 377, 376, 377, 378, - 377, 0, 376, 0, 378, 377, 378, 379, 378, 0, - 0, 0, 0, 378, 0, 0, 0, 379, 381, 379, - 0, 379, 0, 0, 383, 381, 379, 0, 381, 379, - 381, 0, 381, 0, 383, 0, 383, 381, 383, 384, - - 385, 0, 384, 383, 0, 0, 0, 0, 0, 384, - 385, 384, 385, 384, 385, 387, 385, 0, 384, 385, - 0, 396, 0, 0, 0, 387, 0, 387, 0, 387, - 0, 396, 0, 396, 387, 396, 397, 397, 398, 398, - 396, 0, 0, 0, 0, 0, 397, 399, 397, 398, - 397, 398, 0, 398, 0, 397, 0, 399, 398, 399, - 387, 399, 401, 0, 0, 399, 399, 0, 402, 0, - 0, 0, 401, 0, 401, 0, 401, 0, 402, 403, - 402, 401, 402, 0, 0, 404, 402, 402, 404, 403, - 0, 403, 0, 403, 0, 404, 405, 404, 403, 404, - - 0, 0, 406, 405, 404, 0, 405, 0, 405, 0, - 405, 0, 406, 407, 406, 405, 406, 0, 0, 0, - 0, 406, 0, 407, 408, 407, 408, 407, 0, 0, - 409, 407, 407, 0, 408, 0, 408, 0, 408, 0, - 409, 0, 409, 408, 409, 0, 0, 410, 409, 409, - 410, 0, 0, 411, 0, 411, 0, 410, 0, 410, - 0, 410, 0, 411, 412, 411, 410, 411, 0, 413, - 413, 0, 411, 0, 412, 0, 412, 0, 412, 0, - 413, 414, 413, 412, 413, 0, 0, 415, 0, 413, - 0, 414, 0, 414, 415, 414, 0, 415, 416, 415, - - 414, 415, 0, 0, 417, 0, 415, 0, 416, 0, - 416, 417, 416, 0, 417, 416, 417, 416, 417, 418, - 418, 422, 0, 417, 0, 422, 0, 0, 0, 0, - 418, 422, 418, 422, 418, 422, 423, 0, 0, 418, - 422, 0, 424, 423, 424, 0, 423, 0, 423, 0, - 423, 0, 424, 425, 424, 423, 424, 0, 0, 426, - 0, 424, 426, 425, 0, 425, 0, 425, 0, 426, - 425, 426, 425, 426, 427, 427, 0, 0, 426, 0, - 428, 428, 0, 0, 427, 0, 427, 0, 427, 0, - 428, 429, 428, 427, 428, 0, 0, 0, 0, 428, - - 0, 429, 0, 429, 0, 429, 430, 429, 0, 430, - 429, 0, 431, 0, 0, 0, 430, 0, 430, 0, - 430, 0, 431, 432, 431, 430, 431, 0, 0, 431, - 432, 431, 0, 432, 434, 432, 0, 432, 0, 435, - 435, 0, 432, 0, 434, 0, 434, 0, 434, 0, - 435, 437, 435, 434, 435, 0, 0, 438, 0, 435, - 0, 437, 0, 437, 0, 437, 0, 438, 439, 438, - 437, 438, 0, 0, 0, 0, 438, 0, 439, 0, - 439, 440, 439, 0, 440, 0, 439, 439, 0, 442, - 0, 440, 0, 440, 0, 440, 0, 0, 0, 442, - - 440, 442, 0, 442, 443, 443, 0, 444, 442, 442, - 445, 0, 0, 0, 443, 0, 443, 444, 443, 444, - 445, 444, 445, 443, 445, 447, 444, 447, 449, 445, - 0, 450, 0, 0, 0, 447, 0, 447, 449, 447, - 449, 450, 449, 450, 447, 450, 460, 449, 450, 461, - 450, 0, 0, 0, 0, 0, 460, 0, 460, 461, - 460, 461, 462, 461, 460, 460, 0, 461, 461, 462, - 464, 0, 462, 0, 462, 0, 462, 0, 0, 0, - 464, 462, 464, 465, 464, 0, 465, 0, 0, 464, - 0, 466, 0, 465, 467, 465, 0, 465, 0, 0, - - 0, 466, 465, 466, 467, 466, 467, 468, 467, 0, - 466, 0, 0, 467, 468, 469, 0, 468, 470, 468, - 0, 468, 0, 0, 0, 469, 468, 469, 470, 469, - 470, 471, 470, 0, 469, 0, 0, 470, 471, 473, - 0, 471, 472, 471, 472, 471, 0, 0, 0, 473, - 471, 473, 472, 473, 472, 474, 472, 0, 473, 0, - 474, 472, 0, 475, 0, 474, 476, 474, 0, 474, - 0, 0, 0, 475, 474, 475, 476, 475, 476, 477, - 476, 475, 475, 0, 476, 476, 0, 478, 0, 477, - 479, 477, 0, 477, 0, 0, 0, 478, 477, 478, - - 479, 478, 479, 483, 479, 0, 478, 0, 0, 479, - 483, 484, 0, 483, 485, 483, 0, 483, 0, 0, - 0, 484, 483, 484, 485, 484, 485, 486, 485, 484, - 484, 0, 0, 485, 0, 487, 0, 486, 0, 486, - 0, 486, 0, 0, 0, 487, 486, 487, 488, 487, - 0, 488, 487, 0, 487, 0, 489, 0, 488, 490, - 488, 0, 488, 0, 0, 0, 489, 488, 489, 490, - 489, 490, 0, 490, 489, 489, 491, 491, 490, 492, - 0, 0, 493, 0, 0, 0, 491, 0, 491, 492, - 491, 492, 493, 492, 493, 491, 493, 495, 492, 0, - - 497, 493, 0, 0, 0, 0, 0, 495, 0, 495, - 497, 495, 497, 498, 497, 0, 495, 498, 0, 497, - 0, 499, 0, 498, 492, 498, 0, 498, 0, 500, - 0, 499, 498, 499, 0, 499, 0, 0, 0, 500, - 499, 500, 502, 500, 0, 502, 0, 0, 500, 0, - 503, 0, 502, 503, 502, 0, 502, 0, 0, 517, - 503, 502, 503, 505, 503, 0, 505, 0, 0, 503, - 507, 507, 0, 505, 517, 505, 0, 505, 0, 0, - 0, 507, 505, 507, 517, 507, 517, 518, 517, 0, - 507, 0, 0, 517, 518, 519, 519, 518, 0, 518, - - 0, 518, 0, 521, 0, 519, 518, 519, 0, 519, - 0, 522, 0, 521, 519, 521, 0, 521, 0, 521, - 0, 522, 521, 522, 523, 522, 0, 523, 0, 522, - 522, 0, 524, 0, 523, 525, 523, 0, 523, 0, - 0, 527, 524, 523, 524, 525, 524, 525, 525, 525, - 526, 524, 0, 529, 525, 0, 527, 0, 0, 0, - 526, 0, 526, 529, 526, 529, 527, 529, 527, 526, - 527, 528, 529, 0, 528, 527, 0, 530, 0, 0, - 0, 528, 0, 528, 530, 528, 0, 530, 531, 530, - 528, 530, 0, 0, 536, 0, 530, 536, 531, 0, - - 531, 0, 531, 0, 536, 537, 536, 531, 536, 0, - 0, 538, 0, 536, 0, 537, 0, 537, 0, 537, - 0, 538, 539, 538, 537, 538, 0, 0, 540, 0, - 538, 0, 539, 0, 539, 540, 539, 0, 540, 541, - 540, 539, 540, 0, 0, 0, 0, 540, 0, 541, - 543, 541, 0, 541, 543, 0, 545, 541, 541, 0, - 543, 0, 543, 549, 543, 0, 545, 547, 545, 543, - 545, 0, 0, 0, 547, 545, 0, 547, 549, 547, - 0, 547, 0, 0, 550, 0, 547, 0, 549, 0, - 549, 0, 549, 0, 550, 552, 550, 549, 550, 0, - - 0, 554, 0, 550, 0, 552, 0, 552, 0, 552, - 0, 554, 563, 554, 552, 554, 0, 0, 0, 0, - 554, 0, 563, 564, 563, 0, 563, 0, 0, 563, - 0, 563, 0, 564, 565, 564, 564, 564, 0, 0, - 567, 0, 564, 0, 565, 0, 565, 0, 565, 0, - 567, 568, 567, 565, 567, 0, 0, 0, 0, 567, - 0, 568, 569, 568, 569, 568, 0, 0, 568, 0, - 568, 0, 569, 570, 569, 0, 569, 0, 570, 571, - 0, 569, 0, 570, 0, 570, 0, 570, 0, 571, - 0, 571, 570, 571, 572, 572, 0, 573, 571, 573, - - 574, 0, 0, 0, 572, 0, 572, 573, 572, 573, - 574, 573, 574, 572, 574, 579, 573, 0, 0, 574, - 0, 0, 0, 580, 0, 579, 0, 579, 0, 579, - 0, 579, 0, 580, 579, 580, 580, 580, 581, 583, - 0, 0, 580, 0, 0, 581, 583, 0, 581, 583, - 581, 583, 581, 583, 586, 0, 0, 581, 583, 0, - 0, 0, 588, 0, 586, 0, 586, 0, 586, 0, - 590, 0, 588, 586, 588, 588, 588, 0, 0, 0, - 590, 588, 590, 592, 590, 0, 0, 0, 590, 590, - 0, 0, 0, 592, 0, 592, 0, 592, 598, 598, - - 598, 0, 592, 0, 0, 0, 0, 601, 602, 0, - 598, 598, 598, 598, 598, 598, 598, 601, 602, 601, - 602, 601, 602, 603, 604, 0, 601, 602, 0, 0, - 601, 0, 0, 603, 604, 603, 604, 603, 604, 605, - 606, 0, 603, 604, 0, 0, 0, 0, 0, 605, - 606, 605, 606, 605, 606, 607, 0, 606, 605, 606, - 0, 608, 0, 0, 0, 607, 0, 607, 607, 607, - 0, 608, 609, 608, 607, 608, 0, 0, 613, 609, - 608, 0, 609, 0, 609, 0, 609, 0, 613, 614, - 613, 609, 613, 0, 0, 0, 0, 613, 0, 614, - - 615, 614, 0, 614, 0, 0, 617, 0, 614, 0, - 615, 0, 615, 615, 615, 0, 617, 620, 617, 615, - 617, 0, 0, 622, 620, 617, 0, 620, 0, 620, - 622, 620, 0, 622, 623, 622, 620, 622, 0, 0, - 0, 623, 622, 0, 623, 0, 623, 0, 623, 0, - 0, 633, 634, 623, 630, 630, 630, 630, 630, 630, - 630, 633, 634, 633, 634, 633, 634, 635, 636, 0, - 633, 634, 0, 0, 0, 0, 0, 635, 636, 635, - 636, 635, 636, 637, 0, 0, 635, 636, 0, 0, - 0, 0, 630, 637, 641, 637, 0, 637, 0, 0, - - 642, 637, 637, 0, 641, 0, 641, 0, 641, 0, - 642, 641, 642, 641, 642, 644, 0, 0, 647, 642, - 0, 649, 644, 649, 0, 644, 0, 644, 647, 644, - 647, 649, 647, 649, 644, 649, 647, 647, 650, 0, - 649, 0, 650, 0, 0, 0, 0, 0, 650, 0, - 650, 0, 650, 657, 657, 657, 0, 650, 0, 0, - 0, 0, 659, 0, 0, 657, 657, 657, 657, 657, - 657, 657, 659, 660, 659, 0, 659, 0, 0, 0, - 659, 659, 0, 660, 661, 660, 0, 660, 0, 0, - 665, 660, 660, 0, 661, 0, 661, 0, 661, 0, - - 665, 666, 665, 661, 665, 0, 0, 661, 0, 665, - 0, 666, 668, 666, 0, 666, 0, 0, 0, 0, - 666, 0, 668, 671, 668, 0, 668, 0, 0, 673, - 668, 668, 0, 671, 0, 671, 0, 671, 0, 673, - 674, 673, 671, 673, 0, 0, 671, 674, 673, 0, - 674, 0, 674, 682, 674, 681, 681, 0, 0, 674, - 0, 0, 0, 682, 683, 682, 681, 682, 681, 682, - 681, 0, 682, 0, 683, 681, 683, 687, 683, 0, - 690, 0, 0, 683, 0, 0, 0, 687, 0, 687, - 690, 687, 690, 0, 690, 692, 687, 0, 692, 690, - - 687, 0, 0, 0, 0, 692, 0, 692, 0, 692, - 697, 697, 697, 0, 692, 0, 0, 0, 0, 699, - 0, 0, 697, 697, 697, 697, 697, 697, 697, 699, - 700, 699, 0, 699, 0, 0, 702, 0, 699, 0, - 700, 699, 700, 700, 700, 0, 702, 705, 702, 700, - 702, 0, 0, 0, 0, 702, 0, 705, 709, 705, - 0, 705, 0, 705, 710, 0, 705, 0, 709, 0, - 709, 0, 709, 0, 710, 714, 710, 709, 710, 0, - 0, 717, 0, 710, 0, 714, 0, 714, 0, 714, - 0, 717, 0, 717, 714, 717, 0, 0, 0, 0, - - 717, 721, 721, 721, 721, 721, 721, 721, 721, 721, - 721, 721, 721, 722, 722, 722, 722, 722, 722, 722, - 722, 722, 722, 722, 722, 723, 723, 723, 723, 723, - 723, 723, 723, 723, 723, 723, 723, 724, 724, 724, - 724, 724, 724, 724, 724, 724, 724, 724, 724, 725, - 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, - 725, 726, 726, 726, 726, 726, 726, 726, 726, 726, - 726, 726, 726, 727, 727, 727, 0, 727, 727, 727, - 727, 727, 727, 727, 727, 728, 728, 0, 0, 728, - 0, 728, 729, 0, 729, 730, 730, 0, 730, 730, - - 731, 731, 0, 731, 731, 731, 0, 731, 731, 731, - 731, 731, 732, 732, 732, 0, 732, 732, 732, 732, - 732, 732, 732, 732, 733, 733, 733, 733, 733, 733, - 733, 733, 0, 733, 733, 734, 0, 0, 734, 734, - 734, 734, 734, 734, 734, 734, 735, 0, 0, 735, - 735, 735, 735, 735, 735, 735, 735, 736, 0, 0, - 736, 0, 736, 736, 736, 736, 736, 736, 737, 737, - 0, 737, 737, 738, 738, 0, 738, 738, 739, 739, - 0, 739, 739, 720, 720, 720, 720, 720, 720, 720, - 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, - - 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, - 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, - 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, - 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, - 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, - 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, - 720, 720 + 155, 155, 0, 181, 182, 0, 181, 0, 0, 0, + 0, 0, 0, 181, 182, 181, 182, 181, 182, 183, + 184, 155, 181, 182, 0, 0, 154, 0, 0, 183, + 184, 183, 184, 183, 184, 185, 0, 0, 183, 184, + 0, 0, 0, 186, 0, 185, 187, 185, 185, 185, + 186, 0, 0, 186, 185, 186, 187, 186, 187, 188, + 187, 0, 186, 0, 0, 187, 0, 189, 0, 188, + 0, 188, 0, 188, 0, 190, 188, 189, 188, 189, + + 0, 189, 0, 191, 0, 190, 189, 190, 0, 190, + 191, 190, 0, 191, 190, 191, 192, 191, 0, 0, + 0, 0, 191, 0, 193, 0, 192, 194, 192, 0, + 192, 0, 0, 192, 193, 192, 193, 194, 193, 194, + 0, 194, 0, 193, 194, 194, 194, 195, 195, 196, + 0, 0, 196, 0, 0, 195, 0, 0, 195, 196, + 195, 196, 195, 196, 197, 0, 0, 195, 196, 0, + 198, 0, 0, 0, 197, 0, 197, 197, 197, 0, + 198, 199, 198, 197, 198, 0, 0, 200, 0, 198, + 200, 199, 199, 199, 0, 199, 0, 200, 201, 200, + + 199, 200, 0, 0, 202, 0, 200, 202, 201, 0, + 201, 201, 201, 0, 202, 203, 202, 201, 202, 0, + 0, 0, 0, 202, 0, 203, 204, 203, 0, 203, + 0, 0, 203, 0, 203, 0, 204, 204, 204, 207, + 204, 0, 0, 0, 0, 204, 0, 208, 0, 207, + 209, 207, 0, 207, 0, 0, 207, 208, 207, 208, + 209, 208, 209, 209, 209, 210, 208, 0, 211, 209, + 0, 212, 0, 0, 212, 210, 0, 210, 211, 210, + 211, 212, 211, 212, 210, 212, 211, 211, 213, 214, + 212, 0, 215, 0, 0, 213, 0, 0, 0, 214, + + 0, 214, 215, 214, 215, 213, 215, 213, 214, 213, + 216, 215, 0, 218, 213, 0, 218, 0, 0, 0, + 216, 0, 216, 218, 216, 218, 0, 218, 219, 216, + 0, 219, 218, 0, 220, 0, 0, 0, 219, 0, + 219, 220, 219, 0, 220, 222, 220, 219, 220, 0, + 0, 0, 0, 220, 0, 222, 223, 222, 0, 222, + 0, 0, 224, 222, 222, 0, 223, 0, 223, 0, + 223, 0, 224, 225, 224, 223, 224, 0, 0, 224, + 0, 224, 0, 225, 226, 225, 0, 225, 0, 0, + 225, 0, 225, 0, 226, 228, 226, 0, 226, 0, + + 229, 229, 0, 226, 226, 228, 0, 228, 0, 228, + 0, 229, 230, 229, 228, 229, 0, 0, 231, 0, + 229, 0, 230, 0, 230, 0, 230, 0, 231, 0, + 231, 230, 231, 232, 233, 0, 232, 231, 0, 0, + 0, 233, 0, 232, 233, 232, 233, 232, 233, 234, + 0, 0, 232, 233, 0, 0, 0, 0, 0, 234, + 235, 234, 0, 234, 0, 0, 236, 234, 234, 0, + 235, 0, 235, 0, 235, 0, 236, 235, 236, 235, + 236, 237, 0, 236, 237, 236, 0, 238, 0, 0, + 238, 237, 0, 237, 0, 237, 0, 238, 240, 238, + + 237, 238, 0, 0, 0, 0, 238, 0, 240, 241, + 240, 240, 240, 240, 242, 0, 0, 240, 240, 241, + 242, 241, 0, 241, 0, 0, 0, 241, 241, 0, + 242, 246, 242, 0, 242, 0, 0, 246, 0, 242, + 0, 246, 0, 246, 0, 246, 248, 248, 248, 0, + 246, 0, 0, 0, 0, 258, 0, 0, 248, 248, + 248, 248, 248, 248, 248, 258, 259, 258, 0, 258, + 0, 0, 260, 259, 258, 0, 259, 0, 259, 0, + 259, 0, 260, 260, 260, 259, 260, 261, 262, 0, + 0, 260, 0, 0, 0, 0, 0, 261, 262, 261, + + 262, 261, 262, 264, 264, 263, 261, 262, 263, 0, + 0, 0, 0, 0, 264, 263, 264, 263, 264, 263, + 265, 265, 0, 264, 263, 0, 266, 0, 0, 0, + 265, 0, 265, 262, 265, 0, 266, 267, 266, 265, + 266, 0, 0, 266, 0, 266, 0, 267, 268, 267, + 267, 267, 0, 0, 0, 0, 267, 0, 268, 0, + 268, 0, 268, 270, 268, 269, 269, 268, 0, 271, + 0, 0, 0, 270, 0, 270, 269, 270, 269, 271, + 269, 271, 270, 271, 272, 269, 272, 273, 271, 273, + 274, 0, 0, 274, 272, 0, 272, 273, 272, 273, + + 274, 273, 274, 272, 274, 275, 273, 0, 0, 274, + 0, 276, 0, 0, 0, 275, 0, 275, 276, 275, + 0, 276, 277, 276, 275, 276, 0, 0, 0, 0, + 276, 0, 277, 278, 277, 0, 277, 0, 277, 0, + 0, 277, 0, 278, 0, 278, 0, 278, 279, 278, + 0, 279, 278, 0, 280, 0, 0, 0, 279, 0, + 279, 0, 279, 0, 280, 283, 280, 279, 280, 0, + 0, 284, 0, 280, 0, 283, 0, 283, 0, 283, + 0, 284, 0, 284, 283, 284, 285, 286, 0, 284, + 284, 0, 0, 285, 0, 0, 285, 286, 285, 286, + + 285, 286, 287, 286, 0, 285, 286, 288, 288, 0, + 283, 0, 287, 0, 287, 0, 287, 290, 288, 0, + 288, 287, 288, 289, 288, 0, 290, 288, 289, 0, + 0, 0, 0, 289, 291, 289, 290, 289, 290, 289, + 290, 0, 289, 0, 291, 290, 291, 292, 291, 0, + 0, 291, 0, 291, 0, 294, 294, 292, 295, 292, + 0, 292, 0, 0, 0, 294, 292, 294, 295, 294, + 295, 296, 295, 0, 294, 0, 295, 295, 0, 298, + 299, 296, 298, 296, 296, 296, 0, 0, 0, 298, + 296, 298, 0, 298, 300, 299, 0, 300, 298, 0, + + 0, 0, 0, 0, 300, 299, 300, 299, 300, 299, + 301, 301, 303, 300, 299, 0, 0, 0, 0, 0, + 0, 301, 303, 301, 303, 301, 303, 304, 0, 0, + 301, 303, 0, 0, 0, 0, 0, 304, 0, 304, + 305, 304, 0, 305, 0, 304, 304, 0, 306, 0, + 305, 307, 305, 0, 305, 0, 0, 0, 306, 305, + 306, 307, 306, 307, 0, 307, 309, 306, 308, 308, + 307, 0, 310, 0, 0, 312, 309, 0, 309, 308, + 309, 308, 310, 308, 310, 309, 310, 311, 308, 0, + 312, 310, 0, 314, 0, 0, 0, 311, 0, 311, + + 312, 311, 312, 314, 312, 314, 311, 314, 315, 312, + 0, 309, 314, 0, 316, 0, 0, 316, 315, 0, + 315, 0, 315, 0, 316, 317, 316, 315, 316, 0, + 0, 318, 0, 316, 0, 317, 0, 317, 0, 317, + 0, 318, 0, 318, 317, 318, 322, 0, 318, 0, + 318, 0, 0, 0, 0, 0, 322, 0, 322, 0, + 322, 317, 0, 328, 0, 322, 323, 323, 323, 323, + 323, 323, 323, 328, 0, 328, 0, 328, 329, 329, + 0, 328, 328, 330, 330, 0, 0, 0, 329, 0, + 329, 0, 329, 0, 330, 331, 330, 329, 330, 0, + + 333, 333, 0, 330, 323, 331, 0, 331, 0, 331, + 0, 333, 0, 333, 331, 333, 334, 334, 0, 335, + 333, 0, 335, 0, 0, 0, 334, 336, 334, 335, + 334, 335, 0, 335, 0, 334, 0, 336, 335, 336, + 337, 336, 338, 338, 0, 0, 336, 0, 0, 0, + 337, 339, 337, 338, 337, 338, 0, 338, 339, 337, + 0, 339, 338, 339, 340, 339, 0, 0, 0, 0, + 339, 0, 341, 0, 340, 341, 340, 0, 340, 341, + 0, 0, 341, 340, 341, 342, 341, 342, 0, 0, + 0, 341, 0, 343, 0, 342, 343, 342, 0, 342, + + 343, 344, 0, 343, 342, 343, 0, 343, 0, 345, + 0, 344, 343, 344, 0, 344, 0, 344, 0, 345, + 344, 345, 0, 345, 346, 346, 0, 345, 345, 0, + 347, 0, 0, 0, 346, 0, 346, 0, 346, 0, + 347, 348, 347, 346, 347, 0, 0, 349, 347, 347, + 0, 348, 0, 348, 0, 348, 0, 349, 348, 349, + 348, 349, 350, 354, 0, 0, 349, 0, 0, 0, + 354, 0, 350, 354, 350, 354, 350, 354, 0, 0, + 356, 350, 354, 355, 355, 0, 355, 0, 0, 0, + 356, 0, 356, 355, 356, 355, 0, 355, 356, 356, + + 358, 357, 355, 357, 0, 0, 0, 0, 0, 0, + 358, 357, 358, 357, 358, 357, 359, 0, 0, 358, + 357, 0, 360, 0, 0, 360, 359, 0, 359, 0, + 359, 0, 360, 361, 360, 359, 360, 362, 0, 0, + 363, 360, 0, 361, 362, 361, 0, 361, 0, 0, + 361, 0, 361, 0, 362, 363, 362, 0, 362, 0, + 0, 365, 0, 362, 0, 363, 0, 363, 0, 363, + 0, 365, 366, 365, 363, 365, 0, 0, 367, 365, + 365, 0, 366, 0, 366, 0, 366, 0, 367, 369, + 367, 366, 367, 0, 0, 0, 0, 367, 0, 369, + + 370, 369, 0, 369, 0, 369, 371, 370, 369, 0, + 370, 0, 370, 0, 370, 0, 371, 372, 371, 370, + 371, 0, 0, 0, 0, 371, 0, 372, 0, 372, + 374, 372, 0, 375, 0, 372, 372, 374, 0, 0, + 374, 376, 374, 375, 374, 375, 376, 375, 0, 374, + 0, 376, 375, 376, 377, 376, 0, 0, 0, 0, + 376, 0, 0, 0, 377, 379, 377, 0, 377, 0, + 0, 381, 379, 377, 0, 379, 377, 379, 0, 379, + 0, 381, 0, 381, 379, 381, 382, 383, 0, 382, + 381, 0, 0, 0, 0, 0, 382, 383, 382, 383, + + 382, 383, 385, 383, 0, 382, 383, 0, 394, 0, + 0, 0, 385, 0, 385, 0, 385, 0, 394, 0, + 394, 385, 394, 395, 395, 0, 0, 394, 0, 0, + 396, 0, 0, 0, 395, 0, 395, 0, 395, 0, + 396, 398, 396, 395, 396, 0, 0, 385, 396, 396, + 0, 398, 399, 398, 0, 398, 0, 0, 0, 0, + 398, 0, 399, 400, 399, 0, 399, 0, 0, 401, + 399, 399, 401, 400, 0, 400, 0, 400, 0, 401, + 402, 401, 400, 401, 0, 0, 403, 402, 401, 0, + 402, 0, 402, 0, 402, 0, 403, 404, 403, 402, + + 403, 0, 0, 0, 0, 403, 0, 404, 405, 404, + 405, 404, 0, 0, 406, 404, 404, 0, 405, 0, + 405, 0, 405, 0, 406, 0, 406, 405, 406, 0, + 0, 407, 406, 406, 407, 0, 0, 408, 0, 408, + 0, 407, 0, 407, 0, 407, 0, 408, 409, 408, + 407, 408, 0, 410, 410, 0, 408, 0, 409, 0, + 409, 0, 409, 0, 410, 411, 410, 409, 410, 0, + 0, 412, 0, 410, 0, 411, 0, 411, 412, 411, + 0, 412, 413, 412, 411, 412, 0, 0, 414, 0, + 412, 0, 413, 0, 413, 414, 413, 0, 414, 413, + + 414, 413, 414, 415, 415, 419, 0, 414, 0, 419, + 0, 0, 0, 0, 415, 419, 415, 419, 415, 419, + 420, 0, 0, 415, 419, 0, 421, 420, 421, 0, + 420, 0, 420, 0, 420, 0, 421, 422, 421, 420, + 421, 0, 0, 423, 0, 421, 423, 422, 0, 422, + 0, 422, 0, 423, 422, 423, 422, 423, 424, 424, + 0, 0, 423, 0, 425, 425, 0, 0, 424, 0, + 424, 0, 424, 0, 425, 426, 425, 424, 425, 0, + 0, 0, 0, 425, 0, 426, 0, 426, 0, 426, + 427, 426, 0, 427, 426, 0, 428, 0, 0, 0, + + 427, 0, 427, 0, 427, 0, 428, 429, 428, 427, + 428, 0, 0, 428, 429, 428, 0, 429, 431, 429, + 0, 429, 0, 432, 432, 0, 429, 0, 431, 0, + 431, 0, 431, 0, 432, 434, 432, 431, 432, 0, + 0, 435, 0, 432, 0, 434, 0, 434, 0, 434, + 0, 435, 436, 435, 434, 435, 0, 0, 0, 0, + 435, 0, 436, 0, 436, 437, 436, 0, 437, 0, + 436, 436, 0, 439, 0, 437, 0, 437, 0, 437, + 0, 0, 0, 439, 437, 439, 0, 439, 440, 440, + 0, 441, 439, 439, 442, 0, 0, 0, 440, 0, + + 440, 441, 440, 441, 442, 441, 442, 440, 442, 444, + 441, 444, 446, 442, 0, 447, 0, 0, 0, 444, + 0, 444, 446, 444, 446, 447, 446, 447, 444, 447, + 457, 446, 447, 0, 447, 0, 0, 0, 0, 0, + 457, 0, 457, 458, 457, 0, 460, 0, 457, 457, + 458, 0, 0, 458, 0, 458, 460, 458, 460, 0, + 460, 461, 458, 0, 461, 460, 0, 462, 0, 0, + 0, 461, 0, 461, 0, 461, 0, 462, 463, 462, + 461, 462, 0, 0, 464, 0, 462, 0, 463, 0, + 463, 464, 463, 0, 464, 465, 464, 463, 464, 0, + + 0, 466, 0, 464, 0, 465, 0, 465, 0, 465, + 0, 466, 467, 466, 465, 466, 0, 0, 0, 467, + 466, 0, 467, 468, 467, 468, 467, 0, 0, 469, + 0, 467, 0, 468, 0, 468, 0, 468, 0, 469, + 470, 469, 468, 469, 0, 470, 471, 0, 469, 0, + 470, 0, 470, 0, 470, 0, 471, 472, 471, 470, + 471, 0, 0, 0, 471, 471, 0, 472, 473, 472, + 0, 472, 0, 0, 474, 472, 472, 0, 473, 0, + 473, 0, 473, 0, 474, 475, 474, 473, 474, 0, + 0, 479, 0, 474, 0, 475, 0, 475, 479, 475, + + 0, 479, 480, 479, 475, 479, 0, 0, 0, 0, + 479, 0, 480, 481, 480, 0, 480, 0, 0, 482, + 480, 480, 0, 481, 0, 481, 0, 481, 0, 482, + 483, 482, 481, 482, 0, 0, 484, 0, 482, 484, + 483, 0, 483, 0, 483, 0, 484, 483, 484, 483, + 484, 485, 486, 0, 0, 484, 0, 0, 0, 0, + 0, 485, 486, 485, 486, 485, 486, 487, 487, 485, + 485, 486, 0, 488, 0, 0, 0, 487, 0, 487, + 0, 487, 0, 488, 489, 488, 487, 488, 0, 0, + 491, 0, 488, 0, 489, 0, 489, 0, 489, 0, + + 491, 493, 491, 489, 491, 0, 0, 0, 0, 491, + 0, 493, 494, 493, 0, 493, 494, 0, 488, 0, + 493, 0, 494, 495, 494, 0, 494, 0, 0, 496, + 0, 494, 0, 495, 0, 495, 0, 495, 0, 496, + 0, 496, 495, 496, 498, 0, 0, 498, 496, 0, + 499, 0, 0, 499, 498, 0, 498, 0, 498, 0, + 499, 0, 499, 498, 499, 501, 0, 0, 501, 499, + 503, 503, 0, 0, 0, 501, 0, 501, 0, 501, + 0, 503, 513, 503, 501, 503, 0, 0, 0, 513, + 503, 0, 513, 0, 513, 0, 513, 514, 514, 0, + + 0, 513, 0, 516, 0, 0, 0, 514, 0, 514, + 0, 514, 0, 516, 517, 516, 514, 516, 0, 516, + 0, 0, 516, 0, 517, 0, 517, 518, 517, 0, + 518, 0, 517, 517, 0, 519, 0, 518, 520, 518, + 0, 518, 0, 0, 522, 519, 518, 519, 520, 519, + 520, 520, 520, 521, 519, 0, 524, 520, 0, 522, + 0, 0, 0, 521, 0, 521, 524, 521, 524, 522, + 524, 522, 521, 522, 523, 524, 0, 523, 522, 0, + 525, 0, 0, 0, 523, 0, 523, 525, 523, 0, + 525, 526, 525, 523, 525, 0, 0, 531, 0, 525, + + 531, 526, 0, 526, 0, 526, 0, 531, 532, 531, + 526, 531, 0, 0, 533, 0, 531, 0, 532, 0, + 532, 0, 532, 0, 533, 534, 533, 532, 533, 0, + 0, 535, 0, 533, 0, 534, 0, 534, 535, 534, + 0, 535, 536, 535, 534, 535, 0, 0, 0, 0, + 535, 0, 536, 538, 536, 0, 536, 538, 0, 540, + 536, 536, 0, 538, 0, 538, 544, 538, 0, 540, + 542, 540, 538, 540, 0, 0, 0, 542, 540, 0, + 542, 544, 542, 0, 542, 0, 0, 545, 0, 542, + 0, 544, 0, 544, 0, 544, 0, 545, 547, 545, + + 544, 545, 0, 0, 549, 0, 545, 0, 547, 0, + 547, 0, 547, 0, 549, 558, 549, 547, 549, 0, + 0, 559, 0, 549, 0, 558, 0, 558, 558, 558, + 0, 559, 561, 559, 558, 559, 0, 0, 562, 0, + 559, 0, 561, 0, 561, 0, 561, 0, 562, 0, + 562, 561, 562, 564, 563, 562, 563, 562, 564, 0, + 0, 0, 0, 564, 563, 564, 563, 564, 563, 565, + 566, 566, 564, 563, 0, 0, 0, 0, 0, 565, + 566, 565, 566, 565, 566, 567, 568, 567, 565, 566, + 0, 0, 0, 0, 0, 567, 568, 567, 568, 567, + + 568, 573, 0, 0, 567, 568, 0, 0, 0, 574, + 0, 573, 0, 573, 0, 573, 0, 573, 0, 574, + 573, 574, 574, 574, 575, 577, 0, 0, 574, 0, + 0, 575, 577, 0, 575, 577, 575, 577, 575, 577, + 580, 0, 0, 575, 577, 0, 0, 0, 582, 0, + 580, 0, 580, 0, 580, 0, 584, 0, 582, 580, + 582, 582, 582, 0, 0, 0, 584, 582, 584, 586, + 584, 0, 0, 0, 584, 584, 0, 0, 0, 586, + 0, 586, 0, 586, 592, 592, 592, 0, 586, 0, + 0, 0, 0, 595, 596, 0, 592, 592, 592, 592, + + 592, 592, 592, 595, 596, 595, 596, 595, 596, 597, + 598, 0, 595, 596, 0, 0, 0, 0, 0, 597, + 598, 597, 598, 597, 598, 599, 0, 0, 597, 598, + 0, 0, 0, 600, 0, 599, 0, 599, 0, 599, + 0, 601, 599, 600, 599, 600, 600, 600, 0, 602, + 0, 601, 600, 601, 0, 601, 602, 606, 0, 602, + 601, 602, 0, 602, 0, 607, 0, 606, 602, 606, + 0, 606, 0, 608, 0, 607, 606, 607, 0, 607, + 0, 610, 0, 608, 607, 608, 608, 608, 0, 613, + 0, 610, 608, 610, 0, 610, 613, 615, 0, 613, + + 610, 613, 0, 613, 615, 616, 0, 615, 613, 615, + 0, 615, 616, 0, 0, 616, 615, 616, 0, 616, + 0, 0, 626, 627, 616, 623, 623, 623, 623, 623, + 623, 623, 626, 627, 626, 627, 626, 627, 628, 0, + 0, 626, 627, 0, 0, 0, 629, 0, 628, 0, + 628, 0, 628, 0, 0, 0, 629, 628, 629, 633, + 629, 0, 0, 623, 629, 629, 0, 634, 0, 633, + 0, 633, 0, 633, 0, 636, 633, 634, 633, 634, + 0, 634, 636, 639, 0, 636, 634, 636, 0, 636, + 0, 0, 0, 639, 636, 639, 641, 639, 641, 642, + + 0, 639, 639, 642, 0, 0, 641, 0, 641, 642, + 641, 642, 0, 642, 0, 641, 0, 0, 642, 649, + 649, 649, 0, 0, 0, 0, 0, 0, 651, 652, + 0, 649, 649, 649, 649, 649, 649, 649, 651, 652, + 651, 652, 651, 652, 656, 657, 651, 651, 652, 0, + 0, 0, 652, 0, 656, 657, 656, 657, 656, 657, + 659, 662, 0, 656, 657, 0, 0, 0, 0, 0, + 659, 662, 659, 662, 659, 662, 664, 0, 659, 659, + 662, 0, 665, 0, 662, 0, 664, 0, 664, 665, + 664, 0, 665, 672, 665, 664, 665, 0, 0, 0, + + 0, 665, 0, 672, 673, 672, 0, 672, 0, 672, + 677, 0, 672, 0, 673, 0, 673, 0, 673, 0, + 677, 0, 677, 673, 677, 680, 0, 0, 682, 677, + 0, 682, 0, 677, 0, 680, 0, 680, 682, 680, + 682, 0, 682, 0, 680, 0, 0, 682, 687, 687, + 687, 0, 0, 0, 0, 0, 0, 689, 0, 0, + 687, 687, 687, 687, 687, 687, 687, 689, 691, 689, + 689, 689, 0, 0, 694, 0, 689, 0, 691, 0, + 691, 0, 691, 0, 694, 698, 694, 691, 694, 0, + 694, 702, 0, 694, 0, 698, 0, 698, 0, 698, + + 0, 702, 705, 702, 698, 702, 0, 0, 0, 0, + 702, 0, 705, 0, 705, 0, 705, 0, 0, 0, + 0, 705, 709, 709, 709, 709, 709, 709, 709, 709, + 709, 709, 709, 709, 710, 710, 710, 710, 710, 710, + 710, 710, 710, 710, 710, 710, 711, 711, 711, 711, + 711, 711, 711, 711, 711, 711, 711, 711, 712, 712, + 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, + 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, + 713, 713, 714, 714, 714, 714, 714, 714, 714, 714, + 714, 714, 714, 714, 715, 715, 715, 0, 715, 715, + + 715, 715, 715, 715, 715, 715, 716, 716, 0, 0, + 716, 0, 716, 717, 0, 717, 718, 718, 0, 718, + 718, 719, 719, 0, 719, 719, 719, 0, 719, 719, + 719, 719, 719, 720, 720, 720, 0, 720, 720, 720, + 720, 720, 720, 720, 720, 721, 721, 721, 721, 721, + 721, 721, 721, 0, 721, 721, 722, 0, 0, 722, + 722, 722, 722, 722, 722, 722, 722, 723, 0, 0, + 723, 723, 723, 723, 723, 723, 723, 723, 724, 0, + 0, 724, 0, 724, 724, 724, 724, 724, 724, 725, + 725, 0, 725, 725, 726, 726, 0, 726, 726, 727, + + 727, 0, 727, 727, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708 } ; extern int yy_flex_debug; int yy_flex_debug = 1; -static yyconst short int yy_rule_linenum[132] = +static yyconst short int yy_rule_linenum[131] = { 0, 103, 106, 108, 109, 110, 113, 115, 116, 117, 129, 136, 143, 149, 158, 166, 174, 175, 177, 196, 202, 203, 204, 205, 206, 209, 215, 222, 229, 236, 246, - 280, 287, 288, 289, 290, 298, 299, 300, 301, 302, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - - 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 389, 390, 395, 396, 397, 400, 406, 413, 422, 433, - 439, 441, 442, 444, 446, 448, 461, 467, 473, 480, - 482 + 280, 287, 291, 292, 300, 301, 302, 303, 304, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + + 378, 379, 380, 381, 382, 383, 384, 385, 386, 391, + 392, 397, 398, 399, 402, 408, 415, 424, 435, 441, + 443, 444, 446, 448, 450, 463, 469, 475, 482, 484 } ; static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; @@ -1902,7 +1877,7 @@ static asn1_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */ /* Newline */ /* White-space */ -#line 1906 "asn1p_l.c" +#line 1881 "asn1p_l.c" /* Macros after this point can all be overridden by user definitions in * section 1. @@ -2056,7 +2031,7 @@ YY_DECL #line 101 "asn1p_l.l" -#line 2060 "asn1p_l.c" +#line 2035 "asn1p_l.c" if ( yy_init ) { @@ -2104,14 +2079,14 @@ YY_DECL while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 721 ) + if ( yy_current_state >= 709 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *yy_state_ptr++ = yy_current_state; ++yy_cp; } - while ( yy_base[yy_current_state] != 4484 ); + while ( yy_base[yy_current_state] != 4405 ); yy_find_action: yy_current_state = *--yy_state_ptr; @@ -2148,13 +2123,13 @@ YY_DECL { if ( yy_act == 0 ) fprintf( stderr, "--scanner backing up\n" ); - else if ( yy_act < 132 ) + else if ( yy_act < 131 ) fprintf( stderr, "--accepting rule at line %d (\"%s\")\n", yy_rule_linenum[yy_act], yytext ); - else if ( yy_act == 132 ) + else if ( yy_act == 131 ) fprintf( stderr, "--accepting default rule (\"%s\")\n", yytext ); - else if ( yy_act == 133 ) + else if ( yy_act == 132 ) fprintf( stderr, "--(end of buffer or a NUL)\n" ); else fprintf( stderr, "--EOF (start condition %d)\n", YY_START ); @@ -2450,19 +2425,17 @@ YY_RULE_SETUP #line 287 "asn1p_l.l" return TOK_ABSENT; YY_BREAK +/* +ABSTRACT-SYNTAX return TOK_ABSTRACT_SYNTAX; + */ case 33: YY_RULE_SETUP -#line 288 "asn1p_l.l" -return TOK_ABSTRACT_SYNTAX; - YY_BREAK -case 34: -YY_RULE_SETUP -#line 289 "asn1p_l.l" +#line 291 "asn1p_l.l" return TOK_ALL; YY_BREAK -case 35: +case 34: YY_RULE_SETUP -#line 290 "asn1p_l.l" +#line 292 "asn1p_l.l" { /* Appeared in 1990, removed in 1997 */ if(TYPE_LIFETIME(1990, 1997)) @@ -2472,88 +2445,88 @@ YY_RULE_SETUP REJECT; } YY_BREAK -case 36: +case 35: YY_RULE_SETUP -#line 298 "asn1p_l.l" +#line 300 "asn1p_l.l" return TOK_APPLICATION; YY_BREAK -case 37: +case 36: YY_RULE_SETUP -#line 299 "asn1p_l.l" +#line 301 "asn1p_l.l" return TOK_AUTOMATIC; YY_BREAK -case 38: +case 37: YY_RULE_SETUP -#line 300 "asn1p_l.l" +#line 302 "asn1p_l.l" return TOK_BEGIN; YY_BREAK -case 39: +case 38: YY_RULE_SETUP -#line 301 "asn1p_l.l" +#line 303 "asn1p_l.l" return TOK_BIT; YY_BREAK -case 40: +case 39: YY_RULE_SETUP -#line 302 "asn1p_l.l" +#line 304 "asn1p_l.l" { if(TYPE_LIFETIME(1994, 0)) return TOK_BMPString; REJECT; } YY_BREAK -case 41: +case 40: YY_RULE_SETUP -#line 307 "asn1p_l.l" +#line 309 "asn1p_l.l" return TOK_BOOLEAN; YY_BREAK -case 42: +case 41: YY_RULE_SETUP -#line 308 "asn1p_l.l" +#line 310 "asn1p_l.l" return TOK_BY; YY_BREAK -case 43: +case 42: YY_RULE_SETUP -#line 309 "asn1p_l.l" +#line 311 "asn1p_l.l" return TOK_CHARACTER; YY_BREAK -case 44: +case 43: YY_RULE_SETUP -#line 310 "asn1p_l.l" +#line 312 "asn1p_l.l" return TOK_CHOICE; YY_BREAK -case 45: +case 44: YY_RULE_SETUP -#line 311 "asn1p_l.l" +#line 313 "asn1p_l.l" return TOK_CLASS; YY_BREAK -case 46: +case 45: YY_RULE_SETUP -#line 312 "asn1p_l.l" +#line 314 "asn1p_l.l" return TOK_COMPONENT; YY_BREAK -case 47: +case 46: YY_RULE_SETUP -#line 313 "asn1p_l.l" +#line 315 "asn1p_l.l" return TOK_COMPONENTS; YY_BREAK -case 48: +case 47: YY_RULE_SETUP -#line 314 "asn1p_l.l" +#line 316 "asn1p_l.l" return TOK_CONSTRAINED; YY_BREAK -case 49: +case 48: YY_RULE_SETUP -#line 315 "asn1p_l.l" +#line 317 "asn1p_l.l" return TOK_CONTAINING; YY_BREAK -case 50: +case 49: YY_RULE_SETUP -#line 316 "asn1p_l.l" +#line 318 "asn1p_l.l" return TOK_DEFAULT; YY_BREAK -case 51: +case 50: YY_RULE_SETUP -#line 317 "asn1p_l.l" +#line 319 "asn1p_l.l" { /* Appeared in 1990, removed in 1997 */ if(TYPE_LIFETIME(1990, 1997)) @@ -2564,355 +2537,355 @@ YY_RULE_SETUP REJECT; } YY_BREAK -case 52: +case 51: YY_RULE_SETUP -#line 326 "asn1p_l.l" +#line 328 "asn1p_l.l" return TOK_DEFINITIONS; YY_BREAK -case 53: +case 52: YY_RULE_SETUP -#line 327 "asn1p_l.l" +#line 329 "asn1p_l.l" return TOK_EMBEDDED; YY_BREAK -case 54: +case 53: YY_RULE_SETUP -#line 328 "asn1p_l.l" +#line 330 "asn1p_l.l" return TOK_ENCODED; YY_BREAK -case 55: +case 54: YY_RULE_SETUP -#line 329 "asn1p_l.l" +#line 331 "asn1p_l.l" return TOK_ENCODING_CONTROL; YY_BREAK -case 56: +case 55: YY_RULE_SETUP -#line 330 "asn1p_l.l" +#line 332 "asn1p_l.l" return TOK_END; YY_BREAK -case 57: +case 56: YY_RULE_SETUP -#line 331 "asn1p_l.l" +#line 333 "asn1p_l.l" return TOK_ENUMERATED; YY_BREAK -case 58: +case 57: YY_RULE_SETUP -#line 332 "asn1p_l.l" +#line 334 "asn1p_l.l" return TOK_EXCEPT; YY_BREAK -case 59: +case 58: YY_RULE_SETUP -#line 333 "asn1p_l.l" +#line 335 "asn1p_l.l" return TOK_EXPLICIT; YY_BREAK -case 60: +case 59: YY_RULE_SETUP -#line 334 "asn1p_l.l" +#line 336 "asn1p_l.l" return TOK_EXPORTS; YY_BREAK -case 61: +case 60: YY_RULE_SETUP -#line 335 "asn1p_l.l" +#line 337 "asn1p_l.l" return TOK_EXTENSIBILITY; YY_BREAK -case 62: +case 61: YY_RULE_SETUP -#line 336 "asn1p_l.l" +#line 338 "asn1p_l.l" return TOK_EXTERNAL; YY_BREAK -case 63: +case 62: YY_RULE_SETUP -#line 337 "asn1p_l.l" +#line 339 "asn1p_l.l" return TOK_FALSE; YY_BREAK -case 64: +case 63: YY_RULE_SETUP -#line 338 "asn1p_l.l" +#line 340 "asn1p_l.l" return TOK_FROM; YY_BREAK -case 65: +case 64: YY_RULE_SETUP -#line 339 "asn1p_l.l" +#line 341 "asn1p_l.l" return TOK_GeneralizedTime; YY_BREAK -case 66: +case 65: YY_RULE_SETUP -#line 340 "asn1p_l.l" +#line 342 "asn1p_l.l" return TOK_GeneralString; YY_BREAK -case 67: +case 66: YY_RULE_SETUP -#line 341 "asn1p_l.l" +#line 343 "asn1p_l.l" return TOK_GraphicString; YY_BREAK -case 68: +case 67: YY_RULE_SETUP -#line 342 "asn1p_l.l" +#line 344 "asn1p_l.l" return TOK_IA5String; YY_BREAK -case 69: +case 68: YY_RULE_SETUP -#line 343 "asn1p_l.l" +#line 345 "asn1p_l.l" return TOK_IDENTIFIER; YY_BREAK -case 70: +case 69: YY_RULE_SETUP -#line 344 "asn1p_l.l" +#line 346 "asn1p_l.l" return TOK_IMPLICIT; YY_BREAK -case 71: +case 70: YY_RULE_SETUP -#line 345 "asn1p_l.l" +#line 347 "asn1p_l.l" return TOK_IMPLIED; YY_BREAK -case 72: +case 71: YY_RULE_SETUP -#line 346 "asn1p_l.l" +#line 348 "asn1p_l.l" return TOK_IMPORTS; YY_BREAK -case 73: +case 72: YY_RULE_SETUP -#line 347 "asn1p_l.l" +#line 349 "asn1p_l.l" return TOK_INCLUDES; YY_BREAK -case 74: +case 73: YY_RULE_SETUP -#line 348 "asn1p_l.l" +#line 350 "asn1p_l.l" return TOK_INSTANCE; YY_BREAK -case 75: +case 74: YY_RULE_SETUP -#line 349 "asn1p_l.l" +#line 351 "asn1p_l.l" return TOK_INSTRUCTIONS; YY_BREAK -case 76: +case 75: YY_RULE_SETUP -#line 350 "asn1p_l.l" +#line 352 "asn1p_l.l" return TOK_INTEGER; YY_BREAK -case 77: +case 76: YY_RULE_SETUP -#line 351 "asn1p_l.l" +#line 353 "asn1p_l.l" return TOK_INTERSECTION; YY_BREAK -case 78: +case 77: YY_RULE_SETUP -#line 352 "asn1p_l.l" +#line 354 "asn1p_l.l" return TOK_ISO646String; YY_BREAK -case 79: +case 78: YY_RULE_SETUP -#line 353 "asn1p_l.l" +#line 355 "asn1p_l.l" return TOK_MAX; YY_BREAK -case 80: +case 79: YY_RULE_SETUP -#line 354 "asn1p_l.l" +#line 356 "asn1p_l.l" return TOK_MIN; YY_BREAK -case 81: +case 80: YY_RULE_SETUP -#line 355 "asn1p_l.l" +#line 357 "asn1p_l.l" return TOK_MINUS_INFINITY; YY_BREAK -case 82: +case 81: YY_RULE_SETUP -#line 356 "asn1p_l.l" +#line 358 "asn1p_l.l" return TOK_NULL; YY_BREAK -case 83: +case 82: YY_RULE_SETUP -#line 357 "asn1p_l.l" +#line 359 "asn1p_l.l" return TOK_NumericString; YY_BREAK -case 84: +case 83: YY_RULE_SETUP -#line 358 "asn1p_l.l" +#line 360 "asn1p_l.l" return TOK_OBJECT; YY_BREAK -case 85: +case 84: YY_RULE_SETUP -#line 359 "asn1p_l.l" +#line 361 "asn1p_l.l" return TOK_ObjectDescriptor; YY_BREAK -case 86: +case 85: YY_RULE_SETUP -#line 360 "asn1p_l.l" +#line 362 "asn1p_l.l" return TOK_OCTET; YY_BREAK -case 87: +case 86: YY_RULE_SETUP -#line 361 "asn1p_l.l" +#line 363 "asn1p_l.l" return TOK_OF; YY_BREAK -case 88: +case 87: YY_RULE_SETUP -#line 362 "asn1p_l.l" +#line 364 "asn1p_l.l" return TOK_OPTIONAL; YY_BREAK -case 89: +case 88: YY_RULE_SETUP -#line 363 "asn1p_l.l" +#line 365 "asn1p_l.l" return TOK_PATTERN; YY_BREAK -case 90: +case 89: YY_RULE_SETUP -#line 364 "asn1p_l.l" +#line 366 "asn1p_l.l" return TOK_PDV; YY_BREAK -case 91: +case 90: YY_RULE_SETUP -#line 365 "asn1p_l.l" +#line 367 "asn1p_l.l" return TOK_PLUS_INFINITY; YY_BREAK -case 92: +case 91: YY_RULE_SETUP -#line 366 "asn1p_l.l" +#line 368 "asn1p_l.l" return TOK_PRESENT; YY_BREAK -case 93: +case 92: YY_RULE_SETUP -#line 367 "asn1p_l.l" +#line 369 "asn1p_l.l" return TOK_PrintableString; YY_BREAK -case 94: +case 93: YY_RULE_SETUP -#line 368 "asn1p_l.l" +#line 370 "asn1p_l.l" return TOK_PRIVATE; YY_BREAK -case 95: +case 94: YY_RULE_SETUP -#line 369 "asn1p_l.l" +#line 371 "asn1p_l.l" return TOK_REAL; YY_BREAK -case 96: +case 95: YY_RULE_SETUP -#line 370 "asn1p_l.l" +#line 372 "asn1p_l.l" return TOK_RELATIVE_OID; YY_BREAK -case 97: +case 96: YY_RULE_SETUP -#line 371 "asn1p_l.l" +#line 373 "asn1p_l.l" return TOK_SEQUENCE; YY_BREAK -case 98: +case 97: YY_RULE_SETUP -#line 372 "asn1p_l.l" +#line 374 "asn1p_l.l" return TOK_SET; YY_BREAK -case 99: +case 98: YY_RULE_SETUP -#line 373 "asn1p_l.l" +#line 375 "asn1p_l.l" return TOK_SIZE; YY_BREAK -case 100: +case 99: YY_RULE_SETUP -#line 374 "asn1p_l.l" +#line 376 "asn1p_l.l" return TOK_STRING; YY_BREAK -case 101: +case 100: YY_RULE_SETUP -#line 375 "asn1p_l.l" +#line 377 "asn1p_l.l" return TOK_SYNTAX; YY_BREAK -case 102: +case 101: YY_RULE_SETUP -#line 376 "asn1p_l.l" +#line 378 "asn1p_l.l" return TOK_T61String; YY_BREAK -case 103: +case 102: YY_RULE_SETUP -#line 377 "asn1p_l.l" +#line 379 "asn1p_l.l" return TOK_TAGS; YY_BREAK -case 104: +case 103: YY_RULE_SETUP -#line 378 "asn1p_l.l" +#line 380 "asn1p_l.l" return TOK_TeletexString; YY_BREAK -case 105: +case 104: YY_RULE_SETUP -#line 379 "asn1p_l.l" +#line 381 "asn1p_l.l" return TOK_TRUE; YY_BREAK -case 106: +case 105: YY_RULE_SETUP -#line 380 "asn1p_l.l" +#line 382 "asn1p_l.l" return TOK_TYPE_IDENTIFIER; YY_BREAK -case 107: +case 106: YY_RULE_SETUP -#line 381 "asn1p_l.l" +#line 383 "asn1p_l.l" return TOK_UNION; YY_BREAK -case 108: +case 107: YY_RULE_SETUP -#line 382 "asn1p_l.l" +#line 384 "asn1p_l.l" return TOK_UNIQUE; YY_BREAK -case 109: +case 108: YY_RULE_SETUP -#line 383 "asn1p_l.l" +#line 385 "asn1p_l.l" return TOK_UNIVERSAL; YY_BREAK -case 110: +case 109: YY_RULE_SETUP -#line 384 "asn1p_l.l" +#line 386 "asn1p_l.l" { if(TYPE_LIFETIME(1994, 0)) return TOK_UniversalString; REJECT; } YY_BREAK -case 111: +case 110: YY_RULE_SETUP -#line 389 "asn1p_l.l" +#line 391 "asn1p_l.l" return TOK_UTCTime; YY_BREAK -case 112: +case 111: YY_RULE_SETUP -#line 390 "asn1p_l.l" +#line 392 "asn1p_l.l" { if(TYPE_LIFETIME(1994, 0)) return TOK_UTF8String; REJECT; } YY_BREAK -case 113: +case 112: YY_RULE_SETUP -#line 395 "asn1p_l.l" +#line 397 "asn1p_l.l" return TOK_VideotexString; YY_BREAK -case 114: +case 113: YY_RULE_SETUP -#line 396 "asn1p_l.l" +#line 398 "asn1p_l.l" return TOK_VisibleString; YY_BREAK -case 115: +case 114: YY_RULE_SETUP -#line 397 "asn1p_l.l" +#line 399 "asn1p_l.l" return TOK_WITH; YY_BREAK -case 116: +case 115: YY_RULE_SETUP -#line 400 "asn1p_l.l" +#line 402 "asn1p_l.l" { CHECK_DASHES; asn1p_lval.tv_str = strdup(yytext); return TOK_typefieldreference; } YY_BREAK -case 117: +case 116: YY_RULE_SETUP -#line 406 "asn1p_l.l" +#line 408 "asn1p_l.l" { CHECK_DASHES; asn1p_lval.tv_str = strdup(yytext); return TOK_valuefieldreference; } YY_BREAK -case 118: +case 117: YY_RULE_SETUP -#line 413 "asn1p_l.l" +#line 415 "asn1p_l.l" { CHECK_DASHES; asn1p_lval.tv_str = strdup(yytext); @@ -2922,9 +2895,9 @@ YY_RULE_SETUP /* * objectclassreference */ -case 119: +case 118: YY_RULE_SETUP -#line 422 "asn1p_l.l" +#line 424 "asn1p_l.l" { CHECK_DASHES; asn1p_lval.tv_str = strdup(yytext); @@ -2936,43 +2909,43 @@ YY_RULE_SETUP * NOTE: TOK_objectclassreference must be combined * with this token to produce true typereference. */ -case 120: +case 119: YY_RULE_SETUP -#line 433 "asn1p_l.l" +#line 435 "asn1p_l.l" { CHECK_DASHES; asn1p_lval.tv_str = strdup(yytext); return TOK_typereference; } YY_BREAK -case 121: +case 120: YY_RULE_SETUP -#line 439 "asn1p_l.l" +#line 441 "asn1p_l.l" return TOK_PPEQ; YY_BREAK -case 122: +case 121: YY_RULE_SETUP -#line 441 "asn1p_l.l" +#line 443 "asn1p_l.l" return TOK_ThreeDots; YY_BREAK -case 123: +case 122: YY_RULE_SETUP -#line 442 "asn1p_l.l" +#line 444 "asn1p_l.l" return TOK_TwoDots; YY_BREAK -case 124: +case 123: YY_RULE_SETUP -#line 444 "asn1p_l.l" +#line 446 "asn1p_l.l" return yytext[0]; YY_BREAK -case 125: +case 124: YY_RULE_SETUP -#line 446 "asn1p_l.l" +#line 448 "asn1p_l.l" /* Ignore whitespace */ YY_BREAK -case 126: +case 125: YY_RULE_SETUP -#line 448 "asn1p_l.l" +#line 450 "asn1p_l.l" { if(TYPE_LIFETIME(1994, 0)) fprintf(stderr, "ERROR: "); @@ -2985,50 +2958,51 @@ YY_RULE_SETUP } YY_BREAK -case 127: +case 126: YY_RULE_SETUP -#line 461 "asn1p_l.l" +#line 463 "asn1p_l.l" { asn1p_lval.tv_opaque.buf = strdup(yytext); asn1p_lval.tv_opaque.len = yyleng; return TOK_opaque; } YY_BREAK -case 128: +case 127: YY_RULE_SETUP -#line 467 "asn1p_l.l" +#line 469 "asn1p_l.l" { asn1p_lval.tv_opaque.buf = strdup(yytext); asn1p_lval.tv_opaque.len = yyleng; return TOK_opaque; } YY_BREAK -case 129: +case 128: YY_RULE_SETUP -#line 473 "asn1p_l.l" +#line 475 "asn1p_l.l" { yy_pop_state(); return '}'; } YY_BREAK -case 130: +case 129: YY_RULE_SETUP -#line 480 "asn1p_l.l" +#line 482 "asn1p_l.l" return yytext[0]; /* Union, Intersection */ YY_BREAK -case 131: +case 130: YY_RULE_SETUP -#line 482 "asn1p_l.l" +#line 484 "asn1p_l.l" { fprintf(stderr, "Unexpected token at line %d: \"%s\"\n", yylineno, yytext); while(YYSTATE != INITIAL) yy_pop_state(); - yy_top_state(); /* Just to use this function. */ - yyterminate(); - yy_fatal_error("Unexpected token"); + if(0) { + yy_top_state(); /* Just to use this function. */ + yy_fatal_error("Parse error"); + } return -1; } YY_BREAK @@ -3039,19 +3013,19 @@ case YY_STATE_EOF(quoted): case YY_STATE_EOF(opaque): case YY_STATE_EOF(encoding_control): case YY_STATE_EOF(with_syntax): -#line 494 "asn1p_l.l" +#line 497 "asn1p_l.l" { while(YYSTATE != INITIAL) yy_pop_state(); yyterminate(); } YY_BREAK -case 132: +case 131: YY_RULE_SETUP -#line 501 "asn1p_l.l" +#line 504 "asn1p_l.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK -#line 3055 "asn1p_l.c" +#line 3029 "asn1p_l.c" case YY_END_OF_BUFFER: { @@ -3338,7 +3312,7 @@ static yy_state_type yy_get_previous_state() while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 721 ) + if ( yy_current_state >= 709 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -3368,11 +3342,11 @@ yy_state_type yy_current_state; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 721 ) + if ( yy_current_state >= 709 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 720); + yy_is_jam = (yy_current_state == 708); if ( ! yy_is_jam ) *yy_state_ptr++ = yy_current_state; @@ -3933,7 +3907,7 @@ int main() return 0; } #endif -#line 501 "asn1p_l.l" +#line 504 "asn1p_l.l" /* diff --git a/libasn1parser/asn1p_l.l b/libasn1parser/asn1p_l.l index 6a2a0cc79..efa4c1a1e 100644 --- a/libasn1parser/asn1p_l.l +++ b/libasn1parser/asn1p_l.l @@ -285,7 +285,9 @@ WSP [\t\r\v\f\n ] } ABSENT return TOK_ABSENT; + /* ABSTRACT-SYNTAX return TOK_ABSTRACT_SYNTAX; + */ ALL return TOK_ALL; ANY { /* Appeared in 1990, removed in 1997 */ @@ -485,9 +487,10 @@ WITH return TOK_WITH; yylineno, yytext); while(YYSTATE != INITIAL) yy_pop_state(); - yy_top_state(); /* Just to use this function. */ - yyterminate(); - yy_fatal_error("Unexpected token"); + if(0) { + yy_top_state(); /* Just to use this function. */ + yy_fatal_error("Parse error"); + } return -1; } diff --git a/libasn1parser/asn1p_value.c b/libasn1parser/asn1p_value.c index fb3a9453f..b38240977 100644 --- a/libasn1parser/asn1p_value.c +++ b/libasn1parser/asn1p_value.c @@ -110,13 +110,12 @@ asn1p_value_fromint(asn1_integer_t i) { asn1p_value_t * asn1p_value_clone(asn1p_value_t *v) { - asn1p_value_t *clone; + asn1p_value_t *clone = NULL; if(v) { switch(v->type) { case ATV_NOVALUE: - return calloc(1, sizeof(*v)); - case ATV_REFERENCED: - return asn1p_value_fromref(v->value.reference, 1); + case ATV_NULL: + return calloc(1, sizeof(*clone)); case ATV_REAL: return asn1p_value_fromdouble(v->value.v_double); case ATV_INTEGER: @@ -140,7 +139,24 @@ asn1p_value_clone(asn1p_value_t *v) { case ATV_BITVECTOR: return asn1p_value_frombuf(v->value.binary_vector.bits, v->value.binary_vector.size_in_bits, 1); + case ATV_REFERENCED: + return asn1p_value_fromref(v->value.reference, 1); + case ATV_CHOICE_IDENTIFIER: { + char *id = v->value.choice_identifier.identifier; + clone = calloc(1, sizeof(*clone)); + if(!clone) return NULL; + clone->type = v->type; + id = strdup(id); + if(!id) { asn1p_value_free(clone); return NULL; } + clone->value.choice_identifier.identifier = id; + v = asn1p_value_clone(v->value.choice_identifier.value); + if(!v) { asn1p_value_free(clone); return NULL; } + clone->value.choice_identifier.value = v; + return clone; + } } + + assert(!"UNREACHABLE"); } return v; } @@ -150,16 +166,14 @@ asn1p_value_free(asn1p_value_t *v) { if(v) { switch(v->type) { case ATV_NOVALUE: + case ATV_NULL: break; - case ATV_REFERENCED: - asn1p_ref_free(v->value.reference); - break; + case ATV_REAL: case ATV_INTEGER: case ATV_MIN: case ATV_MAX: case ATV_FALSE: case ATV_TRUE: - case ATV_REAL: /* No freeing necessary */ break; case ATV_STRING: @@ -171,6 +185,13 @@ asn1p_value_free(asn1p_value_t *v) { assert(v->value.binary_vector.bits); free(v->value.binary_vector.bits); break; + case ATV_REFERENCED: + asn1p_ref_free(v->value.reference); + break; + case ATV_CHOICE_IDENTIFIER: + free(v->value.choice_identifier.identifier); + asn1p_value_free(v->value.choice_identifier.value); + break; } free(v); } diff --git a/libasn1parser/asn1p_value.h b/libasn1parser/asn1p_value.h index 087521b14..5310b01f0 100644 --- a/libasn1parser/asn1p_value.h +++ b/libasn1parser/asn1p_value.h @@ -13,9 +13,9 @@ typedef struct asn1p_value_s { */ enum { ATV_NOVALUE, - ATV_REFERENCED, - ATV_INTEGER, - ATV_REAL, + ATV_NULL, /* A "NULL" value of type NULL. */ + ATV_REAL, /* A constant floating-point value */ + ATV_INTEGER, /* An integer constant */ ATV_MAX, ATV_MIN, ATV_TRUE, @@ -23,6 +23,8 @@ typedef struct asn1p_value_s { ATV_STRING, ATV_UNPARSED, ATV_BITVECTOR, + ATV_REFERENCED, /* Reference to a value defined elsewhere */ + ATV_CHOICE_IDENTIFIER, /* ChoiceIdentifier value */ } type; /* Value type and location */ union { @@ -40,6 +42,10 @@ typedef struct asn1p_value_s { uint8_t *bits; int size_in_bits; } binary_vector; + struct { + char *identifier; + struct asn1p_value_s *value; + } choice_identifier; } value; } asn1p_value_t; diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index 7d927e976..4cbd21fed 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -182,7 +182,7 @@ typedef union { asn1p_value_t *a_value; /* Number, DefinedValue, etc */ struct asn1p_param_s a_parg; /* A parameter argument */ asn1p_paramlist_t *a_plist; /* A pargs list */ - enum asn1p_expr_marker_e a_marker; /* OPTIONAL/DEFAULT */ + struct asn1p_expr_marker_s a_marker; /* OPTIONAL/DEFAULT */ enum asn1p_constr_pres_e a_pres; /* PRESENT/ABSENT/OPTIONAL */ asn1_integer_t a_int; char *tv_str; @@ -205,11 +205,11 @@ typedef union { -#define YYFINAL 397 +#define YYFINAL 399 #define YYFLAG -32768 #define YYNTBASE 115 -#define YYTRANSLATE(x) ((unsigned)(x) <= 355 ? yytranslate[x] : 213) +#define YYTRANSLATE(x) ((unsigned)(x) <= 355 ? yytranslate[x] : 211) static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -263,96 +263,96 @@ static const short yyprhs[] = { 0, 231, 233, 239, 240, 242, 244, 248, 251, 256, 261, 262, 264, 265, 272, 274, 277, 279, 281, 283, 287, 291, 295, 297, 299, 304, 309, 314, 320, 326, 328, - 333, 338, 340, 344, 346, 350, 354, 356, 360, 362, - 366, 368, 370, 372, 374, 379, 380, 384, 386, 388, - 390, 392, 394, 396, 400, 402, 405, 407, 409, 411, - 413, 416, 419, 421, 423, 426, 429, 431, 433, 435, - 437, 440, 442, 445, 447, 449, 451, 453, 455, 457, - 459, 461, 463, 465, 467, 469, 471, 473, 475, 477, - 479, 481, 483, 484, 486, 488, 493, 497, 502, 504, - 508, 514, 516, 520, 524, 528, 533, 537, 539, 543, - 547, 551, 555, 557, 559, 561, 564, 567, 571, 573, - 575, 577, 579, 581, 583, 585, 591, 593, 597, 599, - 603, 604, 606, 608, 610, 612, 614, 616, 620, 625, - 627, 631, 634, 638, 640, 644, 645, 647, 649, 652, - 654, 656, 657, 661, 664, 668, 670, 674, 676, 681, - 686, 688, 690, 692, 694, 695, 697, 699, 702, 705, - 707, 709, 711 + 333, 338, 340, 344, 346, 350, 354, 358, 360, 364, + 366, 370, 372, 374, 376, 378, 383, 387, 388, 392, + 394, 396, 398, 400, 402, 404, 406, 408, 410, 414, + 416, 419, 421, 423, 425, 427, 430, 433, 435, 437, + 440, 443, 445, 447, 449, 451, 454, 456, 459, 461, + 463, 465, 467, 469, 471, 473, 475, 477, 479, 481, + 483, 485, 487, 489, 491, 493, 495, 497, 498, 500, + 502, 507, 511, 516, 518, 522, 528, 530, 534, 538, + 542, 547, 551, 553, 557, 561, 565, 569, 571, 573, + 575, 578, 581, 585, 587, 589, 591, 593, 595, 597, + 599, 605, 607, 611, 613, 617, 618, 620, 622, 624, + 626, 628, 630, 634, 639, 641, 645, 648, 652, 654, + 658, 659, 661, 663, 666, 669, 673, 675, 679, 681, + 686, 691, 693, 695, 697, 699, 700, 702, 704, 707, + 710, 712, 714, 716 }; static const short yyrhs[] = { 116, - 0, 117, 0, 116, 117, 0, 210, 118, 34, 122, + 0, 117, 0, 116, 117, 0, 208, 118, 34, 122, 3, 21, 125, 39, 0, 0, 119, 0, 104, 120, 105, 0, 104, 105, 0, 121, 0, 120, 121, 0, - 212, 0, 212, 106, 9, 107, 0, 9, 0, 0, + 210, 0, 210, 106, 9, 107, 0, 9, 0, 0, 123, 0, 124, 0, 123, 124, 0, 41, 84, 0, 52, 84, 0, 20, 84, 0, 43, 53, 0, 12, 57, 0, 0, 126, 0, 127, 0, 126, 127, 0, 129, 0, 134, 0, 142, 0, 168, 0, 137, 0, 0, 38, 12, 128, 0, 176, 0, 54, 130, 108, 0, 54, 46, 0, 131, 0, 130, 131, 0, 132, - 46, 210, 118, 0, 133, 0, 132, 109, 133, 0, - 210, 0, 212, 0, 42, 135, 108, 0, 42, 17, + 46, 208, 118, 0, 133, 0, 132, 109, 133, 0, + 208, 0, 210, 0, 42, 135, 108, 0, 42, 17, 108, 0, 42, 108, 0, 136, 0, 135, 109, 136, - 0, 210, 0, 212, 0, 210, 138, 3, 104, 139, + 0, 208, 0, 210, 0, 208, 138, 3, 104, 139, 105, 0, 163, 0, 173, 0, 0, 140, 0, 141, - 0, 140, 109, 141, 0, 102, 0, 184, 0, 210, - 3, 208, 87, 0, 210, 3, 161, 0, 210, 3, - 151, 0, 210, 104, 143, 105, 3, 161, 0, 144, - 0, 143, 109, 144, 0, 210, 0, 210, 110, 212, - 0, 173, 110, 212, 0, 146, 0, 145, 109, 146, - 0, 161, 0, 212, 0, 148, 0, 147, 109, 148, - 0, 212, 161, 200, 0, 30, 68, 161, 0, 160, - 0, 150, 0, 149, 109, 150, 0, 212, 161, 0, + 0, 140, 109, 141, 0, 102, 0, 184, 0, 208, + 3, 206, 87, 0, 208, 3, 161, 0, 208, 3, + 151, 0, 208, 104, 143, 105, 3, 161, 0, 144, + 0, 143, 109, 144, 0, 208, 0, 208, 110, 210, + 0, 173, 110, 210, 0, 146, 0, 145, 109, 146, + 0, 161, 0, 210, 0, 148, 0, 147, 109, 148, + 0, 210, 161, 200, 0, 30, 68, 161, 0, 160, + 0, 150, 0, 149, 109, 150, 0, 210, 161, 0, 160, 0, 28, 104, 153, 105, 155, 0, 0, 88, 0, 154, 0, 153, 109, 154, 0, 166, 200, 0, 166, 161, 200, 152, 0, 166, 166, 200, 152, 0, 0, 156, 0, 0, 95, 82, 104, 157, 158, 105, 0, 159, 0, 158, 159, 0, 4, 0, 166, 0, - 102, 0, 102, 111, 171, 0, 102, 111, 207, 0, - 208, 162, 180, 0, 175, 0, 176, 0, 27, 104, + 102, 0, 102, 111, 171, 0, 102, 111, 205, 0, + 206, 162, 180, 0, 175, 0, 176, 0, 27, 104, 149, 105, 0, 78, 104, 147, 105, 0, 79, 104, - 147, 105, 0, 78, 180, 68, 208, 162, 0, 79, - 180, 68, 208, 162, 0, 18, 0, 18, 35, 25, - 212, 0, 210, 104, 145, 105, 0, 163, 0, 56, - 68, 163, 0, 11, 0, 11, 112, 210, 0, 11, - 112, 212, 0, 211, 0, 211, 112, 164, 0, 165, - 0, 164, 112, 165, 0, 167, 0, 167, 0, 13, - 0, 14, 0, 212, 138, 3, 169, 0, 0, 104, - 170, 172, 0, 5, 0, 7, 0, 6, 0, 207, - 0, 171, 0, 212, 0, 210, 112, 212, 0, 4, - 0, 172, 4, 0, 24, 0, 63, 0, 76, 0, - 174, 0, 67, 81, 0, 65, 51, 0, 77, 0, - 44, 0, 36, 71, 0, 26, 81, 0, 91, 0, - 47, 0, 58, 0, 40, 0, 22, 81, 0, 173, - 0, 174, 204, 0, 23, 0, 48, 0, 49, 0, - 50, 0, 59, 0, 64, 0, 74, 0, 83, 0, - 85, 0, 90, 0, 92, 0, 93, 0, 94, 0, - 66, 0, 99, 0, 100, 0, 97, 0, 98, 0, - 96, 0, 0, 181, 0, 182, 0, 80, 106, 183, - 107, 0, 106, 183, 107, 0, 182, 106, 183, 107, - 0, 184, 0, 184, 109, 102, 0, 184, 109, 102, - 109, 184, 0, 185, 0, 184, 177, 185, 0, 184, - 178, 185, 0, 185, 179, 185, 0, 187, 106, 183, - 107, 0, 106, 183, 107, 0, 188, 0, 188, 186, - 188, 0, 61, 186, 188, 0, 188, 186, 60, 0, - 61, 186, 60, 0, 194, 0, 189, 0, 101, 0, - 101, 113, 0, 113, 101, 0, 113, 101, 113, 0, - 80, 0, 46, 0, 207, 0, 212, 0, 6, 0, - 45, 0, 86, 0, 95, 30, 104, 190, 105, 0, - 191, 0, 190, 109, 191, 0, 102, 0, 212, 180, - 192, 0, 0, 193, 0, 73, 0, 15, 0, 69, - 0, 195, 0, 196, 0, 104, 210, 105, 0, 195, - 104, 197, 105, 0, 198, 0, 197, 109, 198, 0, - 114, 199, 0, 114, 112, 199, 0, 212, 0, 199, - 112, 212, 0, 0, 201, 0, 69, 0, 33, 202, - 0, 188, 0, 173, 0, 0, 104, 203, 172, 0, - 104, 105, 0, 104, 205, 105, 0, 206, 0, 205, - 109, 206, 0, 212, 0, 212, 106, 207, 107, 0, - 212, 106, 171, 107, 0, 207, 0, 102, 0, 9, - 0, 10, 0, 0, 209, 0, 103, 0, 103, 52, - 0, 103, 41, 0, 11, 0, 12, 0, 12, 0, - 8, 0 + 147, 105, 0, 78, 180, 68, 206, 162, 0, 79, + 180, 68, 206, 162, 0, 18, 0, 18, 35, 25, + 210, 0, 208, 104, 145, 105, 0, 163, 0, 56, + 68, 163, 0, 11, 0, 11, 112, 208, 0, 209, + 112, 208, 0, 11, 112, 210, 0, 209, 0, 209, + 112, 164, 0, 165, 0, 164, 112, 165, 0, 167, + 0, 167, 0, 13, 0, 14, 0, 210, 138, 3, + 169, 0, 210, 110, 169, 0, 0, 104, 170, 172, + 0, 63, 0, 45, 0, 86, 0, 5, 0, 7, + 0, 6, 0, 205, 0, 171, 0, 210, 0, 208, + 112, 210, 0, 4, 0, 172, 4, 0, 24, 0, + 63, 0, 76, 0, 174, 0, 67, 81, 0, 65, + 51, 0, 77, 0, 44, 0, 36, 71, 0, 26, + 81, 0, 91, 0, 47, 0, 58, 0, 40, 0, + 22, 81, 0, 173, 0, 174, 202, 0, 23, 0, + 48, 0, 49, 0, 50, 0, 59, 0, 64, 0, + 74, 0, 83, 0, 85, 0, 90, 0, 92, 0, + 93, 0, 94, 0, 66, 0, 99, 0, 100, 0, + 97, 0, 98, 0, 96, 0, 0, 181, 0, 182, + 0, 80, 106, 183, 107, 0, 106, 183, 107, 0, + 182, 106, 183, 107, 0, 184, 0, 184, 109, 102, + 0, 184, 109, 102, 109, 184, 0, 185, 0, 184, + 177, 185, 0, 184, 178, 185, 0, 185, 179, 185, + 0, 187, 106, 183, 107, 0, 106, 183, 107, 0, + 188, 0, 188, 186, 188, 0, 61, 186, 188, 0, + 188, 186, 60, 0, 61, 186, 60, 0, 194, 0, + 189, 0, 101, 0, 101, 113, 0, 113, 101, 0, + 113, 101, 113, 0, 80, 0, 46, 0, 205, 0, + 210, 0, 6, 0, 45, 0, 86, 0, 95, 30, + 104, 190, 105, 0, 191, 0, 190, 109, 191, 0, + 102, 0, 210, 180, 192, 0, 0, 193, 0, 73, + 0, 15, 0, 69, 0, 195, 0, 196, 0, 104, + 208, 105, 0, 195, 104, 197, 105, 0, 198, 0, + 197, 109, 198, 0, 114, 199, 0, 114, 112, 199, + 0, 210, 0, 199, 112, 210, 0, 0, 201, 0, + 69, 0, 33, 169, 0, 104, 105, 0, 104, 203, + 105, 0, 204, 0, 203, 109, 204, 0, 210, 0, + 210, 106, 205, 107, 0, 210, 106, 171, 107, 0, + 205, 0, 102, 0, 9, 0, 10, 0, 0, 207, + 0, 103, 0, 103, 52, 0, 103, 41, 0, 11, + 0, 12, 0, 12, 0, 8, 0 }; #endif @@ -370,21 +370,21 @@ static const short yyrline[] = { 0, 892, 897, 907, 909, 912, 920, 926, 935, 941, 958, 960, 965, 969, 974, 979, 985, 989, 1000, 1009, 1018, 1029, 1051, 1055, 1061, 1067, 1073, 1079, 1088, 1097, 1103, - 1117, 1141, 1148, 1162, 1171, 1181, 1191, 1199, 1220, 1229, - 1238, 1239, 1241, 1248, 1260, 1270, 1272, 1277, 1281, 1285, - 1289, 1292, 1297, 1309, 1325, 1336, 1350, 1352, 1353, 1354, - 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1368, 1370, - 1371, 1374, 1381, 1393, 1395, 1399, 1403, 1404, 1405, 1406, - 1407, 1411, 1412, 1413, 1414, 1418, 1419, 1426, 1426, 1427, - 1427, 1428, 1430, 1432, 1437, 1441, 1450, 1454, 1459, 1463, - 1469, 1479, 1483, 1486, 1489, 1494, 1503, 1511, 1517, 1524, - 1532, 1540, 1549, 1552, 1557, 1559, 1560, 1561, 1564, 1568, - 1573, 1577, 1588, 1593, 1598, 1605, 1611, 1615, 1620, 1626, - 1638, 1640, 1643, 1647, 1650, 1655, 1659, 1667, 1682, 1688, - 1695, 1708, 1720, 1735, 1739, 1756, 1758, 1761, 1765, 1771, - 1774, 1776, 1776, 1796, 1801, 1806, 1812, 1818, 1826, 1834, - 1842, 1849, 1859, 1864, 1894, 1896, 1899, 1904, 1908, 1914, - 1919, 1926, 1933 + 1117, 1141, 1148, 1162, 1171, 1181, 1191, 1201, 1209, 1230, + 1239, 1248, 1249, 1251, 1258, 1270, 1280, 1288, 1288, 1293, + 1298, 1303, 1308, 1312, 1316, 1320, 1323, 1328, 1340, 1356, + 1367, 1381, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, + 1391, 1392, 1393, 1399, 1401, 1402, 1405, 1412, 1424, 1426, + 1430, 1434, 1435, 1436, 1437, 1438, 1442, 1443, 1444, 1445, + 1449, 1450, 1457, 1457, 1458, 1458, 1459, 1461, 1463, 1468, + 1472, 1481, 1485, 1490, 1494, 1500, 1510, 1514, 1517, 1520, + 1525, 1534, 1542, 1548, 1555, 1563, 1571, 1580, 1583, 1588, + 1590, 1591, 1592, 1595, 1599, 1604, 1608, 1619, 1623, 1628, + 1635, 1641, 1645, 1650, 1656, 1668, 1670, 1673, 1677, 1680, + 1685, 1689, 1697, 1712, 1718, 1725, 1738, 1750, 1765, 1769, + 1786, 1791, 1794, 1799, 1821, 1826, 1831, 1837, 1843, 1851, + 1859, 1867, 1874, 1884, 1889, 1919, 1921, 1924, 1929, 1933, + 1939, 1944, 1951, 1958 }; #endif @@ -423,16 +423,15 @@ static const char * const yytname[] = { "$","error","$undefined.","TOK_PPEQ", "optUnique","ClassFieldList","ClassField","optWithSyntax","WithSyntax","@2", "WithSyntaxFormat","WithSyntaxFormatToken","ExtensionAndException","Type","TypeDeclaration", "ComplexTypeReference","ComplexTypeReferenceAmpList","ComplexTypeReferenceElement", -"ClassFieldIdentifier","ClassFieldName","ValueDefinition","InlineOrDefinedValue", -"@3","DefinedValue","Opaque","BasicTypeId","BasicTypeId_UniverationCompatible", -"BasicType","BasicString","Union","Intersection","Except","optConstraints","Constraints", -"SetOfConstraints","ElementSetSpecs","ElementSetSpec","ConstraintSubtypeElement", -"ConstraintRangeSpec","ConstraintSpec","ConstraintValue","WithComponents","WithComponentsList", -"WithComponentsElement","optPresenceConstraint","PresenceConstraint","TableConstraint", -"SimpleTableConstraint","ComponentRelationConstraint","AtNotationList","AtNotationElement", -"ComponentIdList","optMarker","Marker","DefaultValue","@4","UniverationDefinition", -"UniverationList","UniverationElement","SignedNumber","optTag","Tag","TypeRefName", -"ObjectClassReference","Identifier", NULL +"ClassFieldIdentifier","ClassFieldName","ValueDefinition","Value","@3","DefinedValue", +"Opaque","BasicTypeId","BasicTypeId_UniverationCompatible","BasicType","BasicString", +"Union","Intersection","Except","optConstraints","Constraints","SetOfConstraints", +"ElementSetSpecs","ElementSetSpec","ConstraintSubtypeElement","ConstraintRangeSpec", +"ConstraintSpec","ConstraintValue","WithComponents","WithComponentsList","WithComponentsElement", +"optPresenceConstraint","PresenceConstraint","TableConstraint","SimpleTableConstraint", +"ComponentRelationConstraint","AtNotationList","AtNotationElement","ComponentIdList", +"optMarker","Marker","UniverationDefinition","UniverationList","UniverationElement", +"SignedNumber","optTag","Tag","TypeRefName","ObjectClassReference","Identifier", NULL }; #endif @@ -448,21 +447,21 @@ static const short yyr1[] = { 0, 150, 151, 152, 152, 153, 153, 154, 154, 154, 155, 155, 157, 156, 158, 158, 159, 159, 160, 160, 160, 161, 162, 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 163, 163, 163, 163, 163, 164, 164, - 165, 166, 167, 167, 168, 170, 169, 169, 169, 169, - 169, 169, 171, 171, 172, 172, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 174, 174, - 174, 175, 175, 176, 176, 176, 176, 176, 176, 176, - 176, 176, 176, 176, 176, 176, 176, 177, 177, 178, - 178, 179, 180, 180, 181, 181, 182, 182, 183, 183, - 183, 184, 184, 184, 184, 185, 185, 185, 185, 185, - 185, 185, 185, 185, 186, 186, 186, 186, 187, 187, - 188, 188, 188, 188, 188, 189, 190, 190, 191, 191, - 192, 192, 193, 193, 193, 194, 194, 195, 196, 197, - 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, - 202, 203, 202, 204, 204, 205, 205, 206, 206, 206, - 206, 206, 207, 207, 208, 208, 209, 209, 209, 210, - 210, 211, 212 + 162, 162, 162, 163, 163, 163, 163, 163, 163, 164, + 164, 165, 166, 167, 167, 168, 169, 170, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 171, 171, 172, + 172, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 173, 173, 173, 174, 174, 174, 175, 175, 176, 176, + 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, + 176, 176, 177, 177, 178, 178, 179, 180, 180, 181, + 181, 182, 182, 183, 183, 183, 184, 184, 184, 184, + 185, 185, 185, 185, 185, 185, 185, 185, 185, 186, + 186, 186, 186, 187, 187, 188, 188, 188, 188, 188, + 189, 190, 190, 191, 191, 192, 192, 193, 193, 193, + 194, 194, 195, 196, 197, 197, 198, 198, 199, 199, + 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, + 204, 204, 204, 205, 205, 206, 206, 207, 207, 207, + 208, 208, 209, 210 }; static const short yyr2[] = { 0, @@ -477,279 +476,271 @@ static const short yyr2[] = { 0, 1, 5, 0, 1, 1, 3, 2, 4, 4, 0, 1, 0, 6, 1, 2, 1, 1, 1, 3, 3, 3, 1, 1, 4, 4, 4, 5, 5, 1, 4, - 4, 1, 3, 1, 3, 3, 1, 3, 1, 3, - 1, 1, 1, 1, 4, 0, 3, 1, 1, 1, - 1, 1, 1, 3, 1, 2, 1, 1, 1, 1, - 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, - 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 4, 1, 3, 1, 3, 3, 3, 1, 3, 1, + 3, 1, 1, 1, 1, 4, 3, 0, 3, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, + 2, 1, 1, 1, 1, 2, 2, 1, 1, 2, + 2, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 1, 1, 4, 3, 4, 1, 3, - 5, 1, 3, 3, 3, 4, 3, 1, 3, 3, - 3, 3, 1, 1, 1, 2, 2, 3, 1, 1, - 1, 1, 1, 1, 1, 5, 1, 3, 1, 3, - 0, 1, 1, 1, 1, 1, 1, 3, 4, 1, - 3, 2, 3, 1, 3, 0, 1, 1, 2, 1, - 1, 0, 3, 2, 3, 1, 3, 1, 4, 4, - 1, 1, 1, 1, 0, 1, 1, 2, 2, 1, - 1, 1, 1 + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 4, 3, 4, 1, 3, 5, 1, 3, 3, 3, + 4, 3, 1, 3, 3, 3, 3, 1, 1, 1, + 2, 2, 3, 1, 1, 1, 1, 1, 1, 1, + 5, 1, 3, 1, 3, 0, 1, 1, 1, 1, + 1, 1, 3, 4, 1, 3, 2, 3, 1, 3, + 0, 1, 1, 2, 2, 3, 1, 3, 1, 4, + 4, 1, 1, 1, 1, 0, 1, 1, 2, 2, + 1, 1, 1, 1 }; static const short yydefact[] = { 0, - 250, 251, 1, 2, 5, 3, 0, 0, 6, 253, + 251, 252, 1, 2, 5, 3, 0, 0, 6, 254, 13, 8, 0, 9, 11, 14, 7, 10, 0, 0, 0, 0, 0, 0, 0, 15, 16, 0, 22, 20, - 18, 21, 19, 0, 17, 12, 23, 154, 0, 0, - 155, 156, 157, 0, 158, 159, 167, 160, 161, 162, - 163, 164, 165, 166, 0, 24, 25, 27, 28, 31, + 18, 21, 19, 0, 17, 12, 23, 159, 0, 0, + 160, 161, 162, 0, 163, 164, 172, 165, 166, 167, + 168, 169, 170, 171, 0, 24, 25, 27, 28, 31, 29, 30, 34, 0, 0, 32, 0, 46, 0, 47, 49, 50, 36, 0, 37, 0, 40, 42, 43, 4, - 26, 245, 114, 252, 0, 137, 0, 0, 150, 144, - 148, 149, 138, 0, 0, 139, 143, 147, 0, 0, - 52, 53, 140, 117, 0, 33, 45, 44, 0, 35, - 38, 0, 0, 0, 247, 62, 61, 0, 246, 0, - 151, 146, 145, 142, 141, 0, 64, 0, 66, 0, - 0, 0, 48, 5, 41, 0, 249, 248, 114, 252, - 109, 0, 0, 173, 173, 60, 173, 112, 152, 140, - 102, 103, 0, 115, 116, 0, 0, 0, 0, 54, - 123, 124, 118, 119, 121, 128, 130, 129, 243, 244, - 126, 125, 132, 131, 0, 133, 39, 0, 85, 245, - 122, 0, 0, 0, 0, 0, 0, 0, 174, 175, - 0, 0, 101, 0, 153, 245, 245, 65, 68, 67, - 203, 204, 200, 0, 199, 205, 0, 58, 0, 0, - 0, 55, 56, 59, 182, 0, 188, 194, 193, 216, - 217, 201, 202, 0, 0, 0, 90, 0, 0, 228, - 226, 226, 87, 227, 0, 0, 98, 0, 78, 81, - 245, 113, 0, 0, 0, 73, 77, 245, 0, 179, - 245, 0, 0, 245, 242, 234, 0, 236, 241, 238, - 0, 69, 71, 72, 63, 195, 0, 0, 0, 0, - 0, 51, 0, 170, 171, 168, 169, 0, 0, 172, - 0, 0, 0, 0, 120, 135, 127, 134, 0, 82, - 91, 86, 232, 231, 230, 229, 83, 83, 110, 0, - 104, 0, 80, 0, 245, 105, 0, 226, 177, 0, - 0, 0, 106, 0, 235, 0, 0, 111, 245, 196, - 197, 192, 190, 0, 218, 187, 57, 183, 184, 185, - 0, 191, 189, 0, 0, 220, 136, 0, 0, 84, - 88, 89, 99, 100, 79, 176, 76, 74, 75, 180, - 107, 178, 108, 237, 0, 0, 70, 198, 209, 0, - 207, 173, 186, 0, 222, 224, 219, 0, 92, 233, - 0, 240, 239, 206, 0, 211, 223, 0, 221, 0, - 181, 208, 214, 215, 213, 210, 212, 225, 96, 0, - 94, 97, 93, 95, 0, 0, 0 + 26, 246, 114, 253, 0, 142, 0, 0, 155, 149, + 153, 154, 143, 0, 0, 144, 148, 152, 0, 0, + 52, 53, 145, 118, 0, 33, 45, 44, 0, 35, + 38, 0, 0, 0, 248, 62, 61, 0, 247, 0, + 156, 151, 150, 147, 146, 0, 64, 0, 66, 0, + 0, 0, 48, 5, 41, 0, 250, 249, 114, 253, + 109, 0, 0, 178, 178, 60, 178, 112, 157, 145, + 102, 103, 0, 115, 117, 0, 0, 0, 0, 54, + 124, 125, 119, 120, 122, 116, 133, 135, 134, 244, + 245, 131, 130, 132, 128, 126, 137, 136, 0, 138, + 39, 0, 85, 246, 123, 0, 0, 0, 0, 0, + 0, 0, 179, 180, 0, 0, 101, 0, 158, 246, + 246, 65, 68, 67, 208, 209, 205, 0, 204, 210, + 0, 58, 0, 0, 0, 55, 56, 59, 187, 0, + 193, 199, 198, 221, 222, 206, 207, 0, 0, 0, + 0, 90, 0, 0, 233, 231, 231, 87, 232, 0, + 0, 98, 0, 78, 81, 246, 113, 0, 0, 0, + 73, 77, 246, 0, 184, 246, 0, 0, 246, 243, + 235, 0, 237, 242, 239, 0, 69, 71, 72, 63, + 200, 0, 0, 0, 0, 0, 51, 0, 175, 176, + 173, 174, 0, 0, 177, 0, 0, 0, 0, 121, + 140, 129, 139, 127, 0, 82, 91, 86, 234, 83, + 83, 110, 0, 104, 0, 80, 0, 246, 105, 0, + 231, 182, 0, 0, 0, 106, 0, 236, 0, 0, + 111, 246, 201, 202, 197, 195, 0, 223, 192, 57, + 188, 189, 190, 0, 196, 194, 0, 0, 225, 141, + 0, 84, 88, 89, 99, 100, 138, 79, 181, 76, + 74, 75, 185, 107, 183, 108, 238, 0, 0, 70, + 203, 214, 0, 212, 178, 191, 0, 227, 229, 224, + 0, 92, 0, 241, 240, 211, 0, 216, 228, 0, + 226, 0, 186, 213, 219, 220, 218, 215, 217, 230, + 96, 0, 94, 97, 93, 95, 0, 0, 0 }; -static const short yydefgoto[] = { 395, +static const short yydefgoto[] = { 397, 3, 4, 8, 9, 13, 14, 25, 26, 27, 55, 56, 57, 106, 58, 74, 75, 76, 77, 59, 69, - 70, 60, 100, 211, 212, 213, 61, 126, 127, 261, - 262, 245, 246, 238, 239, 116, 341, 178, 179, 290, - 291, 380, 390, 391, 247, 263, 147, 148, 163, 164, - 180, 181, 62, 172, 225, 173, 287, 149, 103, 151, - 152, 278, 279, 281, 188, 189, 190, 249, 250, 215, - 268, 216, 217, 218, 360, 361, 386, 387, 219, 220, - 221, 335, 336, 365, 233, 234, 296, 339, 195, 257, - 258, 222, 235, 119, 153, 104, 223 + 70, 60, 100, 215, 216, 217, 61, 126, 127, 266, + 267, 250, 251, 243, 244, 116, 343, 182, 183, 296, + 297, 382, 392, 393, 252, 268, 147, 148, 163, 164, + 184, 185, 62, 176, 229, 177, 292, 149, 103, 151, + 152, 283, 284, 286, 192, 193, 194, 254, 255, 219, + 273, 220, 221, 222, 363, 364, 388, 389, 223, 224, + 225, 338, 339, 368, 238, 239, 199, 262, 263, 226, + 240, 119, 179, 104, 227 }; -static const short yypact[] = { 254, --32768,-32768, 254,-32768, -79,-32768, 13, 7,-32768,-32768, --32768,-32768, 35,-32768, -51, 202,-32768,-32768, 61, 20, - 11, 19, 57, 44, 90, 202,-32768, 23,-32768,-32768, --32768,-32768,-32768, 115,-32768,-32768, 351,-32768, 176, 12, --32768,-32768,-32768, 174,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 151, 351,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 220, 565,-32768, 99,-32768, 199,-32768, --32768,-32768,-32768, 24,-32768, -20,-32768,-32768,-32768,-32768, --32768, -9, 106,-32768, 140,-32768, 145, 163,-32768,-32768, --32768,-32768,-32768, 186, 182,-32768,-32768,-32768, 582, 249, --32768,-32768,-32768, 143, 278,-32768,-32768,-32768, 228,-32768, --32768, 254, 228, 180, 129,-32768,-32768, 428,-32768, 228, --32768,-32768,-32768,-32768,-32768, 101,-32768, 147, 191, 195, - 300, 74,-32768, -79,-32768, 300,-32768,-32768, 105, 214, - 285, 217, 255, 89, 124,-32768, -40,-32768,-32768, 218, --32768,-32768, 221,-32768,-32768, 328, 582, 324, 324, 51, --32768,-32768, 222,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 223,-32768,-32768, 142,-32768, 40, --32768, 308, 37, 304, 230, 48, 155, 269,-32768, 232, - 48, 271,-32768, 42,-32768, 26, 237,-32768,-32768,-32768, --32768,-32768,-32768, -26,-32768,-32768, 311,-32768, 254, 155, - 238, 236,-32768, 206, 251, 242, -26,-32768,-32768, 245, --32768,-32768,-32768, 300, 346, 324, 256, 300, 320,-32768, - 5, 5,-32768,-32768, 505, 324, 241, 144,-32768,-32768, - 237,-32768, 155, 286, 153,-32768,-32768, 237, 246, 171, - 237, 155, 167, 237,-32768,-32768, 168,-32768,-32768, 252, - 170,-32768,-32768,-32768,-32768, 248, 265, 82, 266, 250, - 262,-32768, 51,-32768,-32768,-32768,-32768, 155, 155,-32768, - 155, 155, 188, 258,-32768,-32768, 369,-32768, 293,-32768, --32768,-32768,-32768,-32768,-32768,-32768, 288, 288,-32768, 280, --32768, 37,-32768, 270, 237,-32768, 48, 5,-32768, 277, - 505, 273,-32768, 505,-32768, 54, 280,-32768, 26,-32768, - 268,-32768,-32768, 60,-32768,-32768,-32768,-32768,-32768,-32768, - 275,-32768,-32768, 9, 177,-32768,-32768, 282, 346,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 279, --32768,-32768,-32768,-32768, 283, 284,-32768,-32768,-32768, 189, --32768, -40,-32768, 324, 272,-32768,-32768, 258,-32768, 369, - 155,-32768,-32768,-32768, 60, 85, 272, 324,-32768, 94, - 206,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 14, --32768,-32768,-32768,-32768, 392, 394,-32768 +static const short yypact[] = { 42, +-32768,-32768, 42,-32768, -6,-32768, 72, 111,-32768,-32768, +-32768,-32768, 74,-32768, -1, 162,-32768,-32768, 138, 99, + 83, 91, 123, 97, 222, 162,-32768, 121,-32768,-32768, +-32768,-32768,-32768, 209,-32768,-32768, 313,-32768, 219, 33, +-32768,-32768,-32768, 96,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 210, 313,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 12, 527,-32768, 185,-32768, -18,-32768, +-32768,-32768,-32768, 49,-32768, -25,-32768,-32768,-32768,-32768, +-32768, -3, 145,-32768, 186,-32768, 202, 229,-32768,-32768, +-32768,-32768,-32768, 250, 223,-32768,-32768,-32768, 544, 302, +-32768,-32768,-32768, 194, 311,-32768,-32768,-32768, 158,-32768, +-32768, 42, 158, 214, 102,-32768,-32768, 390,-32768, 158, +-32768,-32768,-32768,-32768,-32768, 87,-32768, 213, 216, 225, + 297, 254,-32768, -6,-32768, 124,-32768,-32768, -57, 231, + 292, 233, 270, -12, 149,-32768, -37,-32768,-32768, 235, +-32768,-32768, 237,-32768,-32768, 339, 544, 335, 335, 152, +-32768,-32768, 232,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 238, 236, +-32768, 90,-32768, 176,-32768, 320, 8, 207, 241, 32, + 140, 281,-32768, 246, 32, 285,-32768, 63,-32768, 20, + 251,-32768,-32768,-32768,-32768,-32768,-32768, -16,-32768,-32768, + 326,-32768, 42, 140, 252, 255,-32768, 234, 263, 259, + -16,-32768,-32768, 264,-32768,-32768,-32768, 124, 362, 335, + 254, 274, 124, 254,-32768, 18, 18,-32768,-32768, 467, + 335, 260, 101,-32768,-32768, 251,-32768, 140, 306, 131, +-32768,-32768, 251, 268, 177, 251, 140, 132, 251,-32768, +-32768, 134,-32768,-32768, 272, 164,-32768,-32768,-32768,-32768, + 267, 275, 242, 277, 278, 279,-32768, 152,-32768,-32768, +-32768,-32768, 140, 140,-32768, 140, 140, 262, 271,-32768, +-32768, 378,-32768,-32768, 307,-32768,-32768,-32768,-32768, 296, + 296,-32768, 280,-32768, 8,-32768, 283, 251,-32768, 32, + 18,-32768, 286, 467, 284,-32768, 467,-32768, 10, 280, +-32768, 20,-32768, 282,-32768,-32768, 27,-32768,-32768,-32768, +-32768,-32768,-32768, 287,-32768,-32768, 5, 173,-32768,-32768, + 288,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768, 290,-32768,-32768,-32768,-32768, 293, 303,-32768, +-32768,-32768, 175,-32768, -37,-32768, 335, 299,-32768,-32768, + 271,-32768, 140,-32768,-32768,-32768, 27, 71, 299, 335, +-32768, 159, 234,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768, 13,-32768,-32768,-32768,-32768, 393, 397,-32768 }; static const short yypgoto[] = {-32768, --32768, 395, 261,-32768,-32768, 389,-32768,-32768, 377,-32768, --32768, 348,-32768,-32768,-32768, 333,-32768, 295,-32768,-32768, - 303,-32768, 344,-32768,-32768, 141,-32768,-32768, 259,-32768, - 100, 227, 113,-32768, 111,-32768, 123,-32768, 194,-32768, --32768,-32768,-32768, 33, -169, -81, -173, -49,-32768, 203, - -177, -100,-32768,-32768,-32768, -252, 87, -52, -109,-32768, - 67,-32768,-32768,-32768, -137,-32768,-32768, -44, -156, -107, - 211,-32768, -56,-32768,-32768, 55,-32768,-32768,-32768,-32768, --32768,-32768, 63, 65, -160,-32768,-32768,-32768,-32768,-32768, - 116, -125, -71,-32768, 2,-32768, -7 +-32768, 401, 289,-32768,-32768, 396,-32768,-32768, 389,-32768, +-32768, 363,-32768,-32768,-32768, 344,-32768, 308,-32768,-32768, + 315,-32768, 355,-32768,-32768, 144,-32768,-32768, 276,-32768, + 103, 240, 117,-32768, 126,-32768, 127,-32768, 196,-32768, +-32768,-32768,-32768, 40, -173, -75, -218, -53,-32768, 208, + -180, -109,-32768, -23,-32768, -167,-32768, -33, -110,-32768, + 37,-32768,-32768,-32768, -144,-32768,-32768, -93, -151, 11, + 220,-32768, -210,-32768,-32768, 65,-32768,-32768,-32768,-32768, +-32768,-32768, 73, 76, -172,-32768,-32768,-32768, 128, -103, + -72,-32768, 2,-32768, -7 }; -#define YYLAST 673 +#define YYLAST 635 static const short yytable[] = { 15, - 117, 5, 232, 214, 5, 15, 174, 192, 150, 193, - 118, 102, 102, 240, 101, 101, 10, 389, 114, 10, - 10, 11, 1, 2, 7, 112, 161, 162, 67, 65, - 165, 10, 72, 10, 1, 2, 79, 229, 64, 185, - 16, 71, 10, 11, 10, 78, 128, 343, 65, 10, - 169, 170, 161, 162, 19, 10, 201, 64, 10, 169, - 170, 10, 169, 170, 355, 187, 79, 10, 259, 28, - 297, 298, 229, 230, 266, 78, 29, 244, 166, 167, - 168, 10, 169, 170, 1, 2, 267, 201, 113, 10, - 169, 170, 34, 115, 30, 202, 203, 389, 231, 383, - 129, 72, 31, 63, 128, 79, 161, 162, 230, 32, - 71, 204, 155, 134, 78, 265, 214, 12, 393, 68, - 364, 154, 63, 165, 176, 150, 202, 33, 115, 36, - 205, 110, 240, 175, 242, 37, 206, 351, 237, 17, - 353, 322, 115, 255, -226, 207, 256, 349, -226, 237, - 199, 200, 208, 384, 209, 255, 210, 385, 129, 303, - 201, 359, 10, 169, 170, 271, 308, 206, 185, 137, - 328, 329, 295, 330, 344, 241, 294, 171, 248, 311, - 138, 10, 314, 248, 1, 2, 260, 66, 264, 80, - 259, 356, 186, 201, 187, 10, 169, 170, 304, 202, - 203, 150, 392, 185, 150, 156, 107, 312, -250, 157, - 270, 323, 392, 20, 381, 204, 120, 120, 288, 73, - 121, 21, 82, 347, 376, 122, 333, 191, 299, 187, - 83, 84, 202, 123, 205, 10, 124, 331, 1, 2, - 206, 85, 22, 86, 23, 87, 227, 332, 301, 207, - 228, 130, 302, 24, 131, 88, 158, 306, 209, 89, - 210, 307, 125, 90, 1, 2, 91, 274, 275, 276, - 277, 313, 315, 206, 318, 307, 316, 92, 319, 310, - 132, 367, 93, 136, 94, 368, 95, 10, 169, 170, - 1, 2, 176, 374, 241, 96, 97, 375, 160, 248, - 159, 175, 274, 275, 276, 277, 108, 109, 260, 176, - 98, 264, 161, 162, 83, 84, 362, -251, 175, 182, - 183, 194, 184, 99, 196, 201, 366, 10, 169, 170, - 197, 10, 236, 224, 226, 243, 251, 252, 254, 115, - 269, 85, 272, 86, 273, 87, 280, 282, 284, 286, - 289, 300, 309, 305, 325, 88, 366, 317, 10, 89, - 320, 1, 2, 90, 202, 321, 91, 362, 326, 324, - 388, 334, 337, 38, 338, 340, 346, 92, 350, 352, - 358, 363, 93, 378, 94, 369, 95, 371, 39, 372, - 373, 396, 40, 397, 177, 96, 97, 6, 41, 42, - 43, 18, 35, 81, 44, 206, 111, 135, 105, 45, - 98, 133, 345, 327, 46, 198, 47, 253, 357, 348, - 342, 292, 394, 293, 48, 370, 285, 283, 377, 382, - 379, 354, 0, 49, 0, 50, 0, 0, 139, 140, - 51, 0, 52, 53, 54, 141, 0, 0, 0, 85, - 38, 86, 0, 87, 142, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, - 0, 90, 0, 0, 91, 41, 42, 43, 0, 0, - 0, 0, 0, 143, 0, 92, 45, 0, 0, 0, - 93, 46, 94, 47, 95, 0, 0, 0, 0, 0, - 0, 48, 0, 96, 97, 144, 145, 0, 0, 0, - 49, 0, 50, 0, 146, 139, 140, 51, 98, 52, - 53, 54, 141, 0, 0, 0, 85, 38, 86, 0, - 87, 142, 0, 0, 0, 0, 0, 0, 0, 0, - 88, 0, 0, 0, 89, 0, 0, 0, 90, 0, - 0, 91, 41, 42, 43, 0, 0, 0, 0, 0, - 143, 0, 92, 45, 0, 0, 0, 93, 46, 94, - 47, 95, 0, 0, 0, 83, 84, 0, 48, 0, - 96, 97, 144, 145, 0, 0, 85, 49, 86, 50, - 87, 0, 1, 2, 51, 98, 52, 53, 54, 0, - 88, 0, 0, 85, 89, 86, 0, 87, 90, 0, - 0, 91, 0, 0, 0, 0, 0, 88, 0, 0, - 0, 89, 92, 0, 0, 90, 0, 93, 91, 94, - 0, 95, 0, 0, 0, 0, 0, 0, 0, 92, - 96, 97, 0, 0, 93, 0, 94, 0, 95, 0, - 0, 0, 0, 0, 0, 98, 0, 96, 97, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 98 + 196, 5, 197, 237, 5, 15, 117, 150, 218, 118, + 101, 101, 10, 245, 82, 10, 391, 10, 170, 171, + 112, 165, 83, 84, 114, 161, 162, 10, 178, 65, + 102, 102, 72, 85, 10, 86, 79, 87, 64, 10, + 10, 71, 189, 1, 2, 78, -251, 88, 65, 67, + 234, 89, 1, 2, 120, 90, 10, 64, 91, 1, + 2, 249, 326, 300, 301, 128, 79, 189, 191, 92, + 10, 170, 171, 63, 93, 78, 94, 336, 95, 10, + 11, 10, 11, 113, 271, 385, 235, 96, 97, 108, + 109, 190, 63, 191, 264, 354, 272, 7, 356, 115, + 129, 72, 98, 10, 19, 79, 1, 2, 236, 242, + 71, 260, 155, 134, 78, 99, 367, 395, 165, 153, + 276, 154, 115, 128, 180, 270, 218, 178, 362, 150, + 178, 245, 166, 242, 247, 345, 161, 162, 352, 386, + 68, 73, 137, 387, 16, 205, 28, 10, 170, 171, + 203, 204, 358, 138, 307, 29, 110, 205, 129, 10, + 170, 171, 391, 315, 260, 10, 30, 261, 1, 2, + 306, 161, 162, 20, 31, 32, 12, 311, 17, 246, + 33, 21, 253, 314, 206, 207, 317, 253, 161, 162, + 265, 156, 269, 334, 232, 157, 206, 207, 233, 346, + 208, 394, 22, 150, 23, 304, 150, 294, 234, 305, + 299, 394, 208, 24, 275, 264, 359, 83, 84, 209, + 378, 383, 293, 180, 34, 210, 180, 36, 189, 37, + 66, 209, 350, 302, 211, 309, 316, 210, 318, 310, + 310, 153, 319, 213, 235, 214, 211, 205, 80, 10, + 170, 171, 195, 212, 191, 213, 120, 214, 167, 168, + 169, 10, 170, 171, 1, 2, 121, 205, 321, 10, + 170, 171, 322, 279, 280, 281, 282, 370, 115, 376, + -231, 371, 122, 377, -231, 313, 206, 10, 170, 171, + 1, 2, 107, 331, 332, 347, 333, 246, 172, 123, + 124, 325, 253, 125, 130, 131, 206, 1, 2, 161, + 162, 265, 347, 132, 269, 153, 173, 136, 153, 365, + 10, 335, 158, 1, 2, 159, 186, 210, 160, 369, + 279, 280, 281, 282, -252, 38, 187, 188, 198, 174, + 200, 201, 10, 228, 241, 231, 248, 210, 256, 230, + 39, 257, 259, 115, 40, 274, 277, 175, 285, 369, + 41, 42, 43, 278, 287, 291, 44, 289, 295, 365, + 303, 45, 390, 308, 312, 324, 46, 320, 47, 323, + 327, 340, 328, 342, 337, 329, 48, 353, 341, 349, + 355, 372, 398, 366, 361, 49, 399, 50, 373, 374, + 139, 140, 51, 6, 52, 53, 54, 141, 18, 375, + 380, 85, 38, 86, 35, 87, 142, 111, 81, 105, + 135, 330, 181, 133, 360, 88, 351, 344, 298, 89, + 348, 396, 202, 90, 258, 290, 91, 41, 42, 43, + 288, 384, 379, 381, 0, 143, 357, 92, 45, 0, + 0, 0, 93, 46, 94, 47, 95, 0, 0, 0, + 0, 0, 0, 48, 0, 96, 97, 144, 145, 0, + 0, 0, 49, 0, 50, 0, 146, 139, 140, 51, + 98, 52, 53, 54, 141, 0, 0, 0, 85, 38, + 86, 0, 87, 142, 0, 0, 0, 0, 0, 0, + 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, + 90, 0, 0, 91, 41, 42, 43, 0, 0, 0, + 0, 0, 143, 0, 92, 45, 0, 0, 0, 93, + 46, 94, 47, 95, 0, 0, 0, 83, 84, 0, + 48, 0, 96, 97, 144, 145, 0, 0, 85, 49, + 86, 50, 87, 0, 1, 2, 51, 98, 52, 53, + 54, 0, 88, 0, 0, 85, 89, 86, 0, 87, + 90, 0, 0, 91, 0, 0, 0, 0, 0, 88, + 0, 0, 0, 89, 92, 0, 0, 90, 0, 93, + 91, 94, 0, 95, 0, 0, 0, 0, 0, 0, + 0, 92, 96, 97, 0, 0, 93, 0, 94, 0, + 95, 0, 0, 0, 0, 0, 0, 98, 0, 96, + 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 98 }; static const short yycheck[] = { 7, - 82, 0, 180, 160, 3, 13, 132, 145, 118, 147, - 82, 64, 65, 183, 64, 65, 8, 4, 28, 8, - 8, 9, 11, 12, 104, 46, 13, 14, 17, 37, - 131, 8, 40, 8, 11, 12, 44, 33, 37, 80, - 34, 40, 8, 9, 8, 44, 99, 300, 56, 8, - 9, 10, 13, 14, 106, 8, 6, 56, 8, 9, - 10, 8, 9, 10, 317, 106, 74, 8, 194, 9, - 231, 232, 33, 69, 101, 74, 57, 30, 5, 6, - 7, 8, 9, 10, 11, 12, 113, 6, 109, 8, - 9, 10, 3, 103, 84, 45, 46, 4, 180, 15, - 99, 109, 84, 37, 157, 113, 13, 14, 69, 53, - 109, 61, 120, 112, 113, 197, 273, 105, 105, 108, - 112, 120, 56, 224, 132, 235, 45, 84, 103, 107, - 80, 108, 302, 132, 184, 21, 86, 311, 102, 105, - 314, 60, 103, 102, 105, 95, 105, 308, 109, 102, - 158, 159, 102, 69, 104, 102, 106, 73, 157, 241, - 6, 102, 8, 9, 10, 210, 248, 86, 80, 41, - 278, 279, 229, 281, 300, 183, 229, 104, 186, 251, - 52, 8, 254, 191, 11, 12, 194, 12, 196, 39, - 316, 317, 104, 6, 106, 8, 9, 10, 243, 45, - 46, 311, 380, 80, 314, 105, 108, 252, 104, 109, - 209, 268, 390, 12, 371, 61, 112, 112, 226, 46, - 81, 20, 3, 305, 362, 81, 283, 104, 236, 106, - 11, 12, 45, 71, 80, 8, 51, 282, 11, 12, - 86, 22, 41, 24, 43, 26, 105, 60, 105, 95, - 109, 3, 109, 52, 112, 36, 110, 105, 104, 40, - 106, 109, 81, 44, 11, 12, 47, 97, 98, 99, - 100, 105, 105, 86, 105, 109, 109, 58, 109, 109, - 3, 105, 63, 104, 65, 109, 67, 8, 9, 10, - 11, 12, 300, 105, 302, 76, 77, 109, 104, 307, - 110, 300, 97, 98, 99, 100, 108, 109, 316, 317, - 91, 319, 13, 14, 11, 12, 324, 104, 317, 35, - 104, 104, 68, 104, 104, 6, 334, 8, 9, 10, - 3, 8, 25, 112, 112, 106, 68, 106, 68, 103, - 30, 22, 105, 24, 109, 26, 96, 106, 104, 4, - 95, 111, 107, 68, 105, 36, 364, 106, 8, 40, - 113, 11, 12, 44, 45, 101, 47, 375, 107, 104, - 378, 114, 4, 23, 82, 88, 107, 58, 102, 107, - 113, 107, 63, 112, 65, 104, 67, 109, 38, 107, - 107, 0, 42, 0, 134, 76, 77, 3, 48, 49, - 50, 13, 26, 56, 54, 86, 74, 113, 65, 59, - 91, 109, 302, 273, 64, 157, 66, 191, 319, 307, - 298, 228, 390, 104, 74, 339, 224, 217, 364, 375, - 368, 316, -1, 83, -1, 85, -1, -1, 11, 12, - 90, -1, 92, 93, 94, 18, -1, -1, -1, 22, - 23, 24, -1, 26, 27, -1, -1, -1, -1, -1, - -1, -1, -1, 36, -1, -1, -1, 40, -1, -1, - -1, 44, -1, -1, 47, 48, 49, 50, -1, -1, - -1, -1, -1, 56, -1, 58, 59, -1, -1, -1, - 63, 64, 65, 66, 67, -1, -1, -1, -1, -1, - -1, 74, -1, 76, 77, 78, 79, -1, -1, -1, - 83, -1, 85, -1, 87, 11, 12, 90, 91, 92, - 93, 94, 18, -1, -1, -1, 22, 23, 24, -1, - 26, 27, -1, -1, -1, -1, -1, -1, -1, -1, - 36, -1, -1, -1, 40, -1, -1, -1, 44, -1, - -1, 47, 48, 49, 50, -1, -1, -1, -1, -1, - 56, -1, 58, 59, -1, -1, -1, 63, 64, 65, - 66, 67, -1, -1, -1, 11, 12, -1, 74, -1, - 76, 77, 78, 79, -1, -1, 22, 83, 24, 85, - 26, -1, 11, 12, 90, 91, 92, 93, 94, -1, - 36, -1, -1, 22, 40, 24, -1, 26, 44, -1, - -1, 47, -1, -1, -1, -1, -1, 36, -1, -1, - -1, 40, 58, -1, -1, 44, -1, 63, 47, 65, - -1, 67, -1, -1, -1, -1, -1, -1, -1, 58, - 76, 77, -1, -1, 63, -1, 65, -1, 67, -1, - -1, -1, -1, -1, -1, 91, -1, 76, 77, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 91 + 145, 0, 147, 184, 3, 13, 82, 118, 160, 82, + 64, 65, 8, 187, 3, 8, 4, 8, 9, 10, + 46, 131, 11, 12, 28, 13, 14, 8, 132, 37, + 64, 65, 40, 22, 8, 24, 44, 26, 37, 8, + 8, 40, 80, 11, 12, 44, 104, 36, 56, 17, + 33, 40, 11, 12, 112, 44, 8, 56, 47, 11, + 12, 30, 273, 236, 237, 99, 74, 80, 106, 58, + 8, 9, 10, 37, 63, 74, 65, 288, 67, 8, + 9, 8, 9, 109, 101, 15, 69, 76, 77, 108, + 109, 104, 56, 106, 198, 314, 113, 104, 317, 103, + 99, 109, 91, 8, 106, 113, 11, 12, 184, 102, + 109, 102, 120, 112, 113, 104, 112, 105, 228, 118, + 214, 120, 103, 157, 132, 201, 278, 231, 102, 240, + 234, 305, 131, 102, 188, 303, 13, 14, 311, 69, + 108, 46, 41, 73, 34, 6, 9, 8, 9, 10, + 158, 159, 320, 52, 248, 57, 108, 6, 157, 8, + 9, 10, 4, 257, 102, 8, 84, 105, 11, 12, + 246, 13, 14, 12, 84, 53, 105, 253, 105, 187, + 84, 20, 190, 256, 45, 46, 259, 195, 13, 14, + 198, 105, 200, 287, 105, 109, 45, 46, 109, 303, + 61, 382, 41, 314, 43, 105, 317, 231, 33, 109, + 234, 392, 61, 52, 213, 319, 320, 11, 12, 80, + 365, 373, 230, 231, 3, 86, 234, 107, 80, 21, + 12, 80, 308, 241, 95, 105, 105, 86, 105, 109, + 109, 240, 109, 104, 69, 106, 95, 6, 39, 8, + 9, 10, 104, 102, 106, 104, 112, 106, 5, 6, + 7, 8, 9, 10, 11, 12, 81, 6, 105, 8, + 9, 10, 109, 97, 98, 99, 100, 105, 103, 105, + 105, 109, 81, 109, 109, 109, 45, 8, 9, 10, + 11, 12, 108, 283, 284, 303, 286, 305, 45, 71, + 51, 60, 310, 81, 3, 112, 45, 11, 12, 13, + 14, 319, 320, 3, 322, 314, 63, 104, 317, 327, + 8, 60, 110, 11, 12, 110, 35, 86, 104, 337, + 97, 98, 99, 100, 104, 23, 104, 68, 104, 86, + 104, 3, 8, 112, 25, 110, 106, 86, 68, 112, + 38, 106, 68, 103, 42, 30, 105, 104, 96, 367, + 48, 49, 50, 109, 106, 4, 54, 104, 95, 377, + 111, 59, 380, 68, 107, 101, 64, 106, 66, 113, + 104, 4, 105, 88, 114, 107, 74, 102, 82, 107, + 107, 104, 0, 107, 113, 83, 0, 85, 109, 107, + 11, 12, 90, 3, 92, 93, 94, 18, 13, 107, + 112, 22, 23, 24, 26, 26, 27, 74, 56, 65, + 113, 278, 134, 109, 322, 36, 310, 301, 233, 40, + 305, 392, 157, 44, 195, 228, 47, 48, 49, 50, + 221, 377, 367, 371, -1, 56, 319, 58, 59, -1, + -1, -1, 63, 64, 65, 66, 67, -1, -1, -1, + -1, -1, -1, 74, -1, 76, 77, 78, 79, -1, + -1, -1, 83, -1, 85, -1, 87, 11, 12, 90, + 91, 92, 93, 94, 18, -1, -1, -1, 22, 23, + 24, -1, 26, 27, -1, -1, -1, -1, -1, -1, + -1, -1, 36, -1, -1, -1, 40, -1, -1, -1, + 44, -1, -1, 47, 48, 49, 50, -1, -1, -1, + -1, -1, 56, -1, 58, 59, -1, -1, -1, 63, + 64, 65, 66, 67, -1, -1, -1, 11, 12, -1, + 74, -1, 76, 77, 78, 79, -1, -1, 22, 83, + 24, 85, 26, -1, 11, 12, 90, 91, 92, 93, + 94, -1, 36, -1, -1, 22, 40, 24, -1, 26, + 44, -1, -1, 47, -1, -1, -1, -1, -1, 36, + -1, -1, -1, 40, 58, -1, -1, 44, -1, 63, + 47, 65, -1, 67, -1, -1, -1, -1, -1, -1, + -1, 58, 76, 77, -1, -1, 63, -1, 65, -1, + 67, -1, -1, -1, -1, -1, -1, 91, -1, 76, + 77, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 91 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/share/bison.simple" @@ -2283,13 +2274,26 @@ case 116: checkmem(yyval.a_ref); ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[-2].tv_str, RLT_UNKNOWN); checkmem(ret == 0); - ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_lowercase); + ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_UNKNOWN); checkmem(ret == 0); free(yyvsp[-2].tv_str); ; break;} case 117: #line 1191 "asn1p_y.y" +{ + int ret; + yyval.a_ref = asn1p_ref_new(yylineno); + checkmem(yyval.a_ref); + ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[-2].tv_str, RLT_UNKNOWN); + checkmem(ret == 0); + ret = asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_lowercase); + checkmem(ret == 0); + free(yyvsp[-2].tv_str); + ; + break;} +case 118: +#line 1201 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2299,8 +2303,8 @@ case 117: checkmem(ret == 0); ; break;} -case 118: -#line 1199 "asn1p_y.y" +case 119: +#line 1209 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[0].a_ref; @@ -2321,8 +2325,8 @@ case 118: } ; break;} -case 119: -#line 1221 "asn1p_y.y" +case 120: +#line 1231 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2332,8 +2336,8 @@ case 119: checkmem(ret == 0); ; break;} -case 120: -#line 1229 "asn1p_y.y" +case 121: +#line 1239 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[-2].a_ref; @@ -2342,22 +2346,22 @@ case 120: checkmem(ret == 0); ; break;} -case 123: -#line 1243 "asn1p_y.y" +case 124: +#line 1253 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} -case 124: -#line 1248 "asn1p_y.y" +case 125: +#line 1258 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} -case 125: -#line 1261 "asn1p_y.y" +case 126: +#line 1271 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); @@ -2366,53 +2370,87 @@ case 125: yyval.a_expr->value = yyvsp[0].a_value; ; break;} -case 126: -#line 1271 "asn1p_y.y" +case 127: +#line 1281 "asn1p_y.y" +{ + yyval.a_value = asn1p_value_fromint(0); + checkmem(yyval.a_value); + yyval.a_value->type = ATV_CHOICE_IDENTIFIER; + yyval.a_value->value.choice_identifier.identifier = yyvsp[-2].tv_str; + yyval.a_value->value.choice_identifier.value = yyvsp[0].a_value; + ; + break;} +case 128: +#line 1288 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} -case 127: -#line 1272 "asn1p_y.y" +case 129: +#line 1288 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); yyval.a_value->type = ATV_UNPARSED; ; break;} -case 128: -#line 1277 "asn1p_y.y" +case 130: +#line 1293 "asn1p_y.y" +{ + yyval.a_value = asn1p_value_fromint(0); + checkmem(yyval.a_value); + yyval.a_value->type = ATV_NULL; + ; + break;} +case 131: +#line 1298 "asn1p_y.y" +{ + yyval.a_value = asn1p_value_fromint(0); + checkmem(yyval.a_value); + yyval.a_value->type = ATV_FALSE; + ; + break;} +case 132: +#line 1303 "asn1p_y.y" +{ + yyval.a_value = asn1p_value_fromint(0); + checkmem(yyval.a_value); + yyval.a_value->type = ATV_TRUE; + ; + break;} +case 133: +#line 1308 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); ; break;} -case 129: -#line 1281 "asn1p_y.y" +case 134: +#line 1312 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); ; break;} -case 130: -#line 1285 "asn1p_y.y" +case 135: +#line 1316 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} -case 131: -#line 1289 "asn1p_y.y" +case 136: +#line 1320 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 132: -#line 1292 "asn1p_y.y" +case 137: +#line 1323 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 133: -#line 1298 "asn1p_y.y" +case 138: +#line 1329 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2425,8 +2463,8 @@ case 133: free(yyvsp[0].tv_str); ; break;} -case 134: -#line 1309 "asn1p_y.y" +case 139: +#line 1340 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2442,8 +2480,8 @@ case 134: free(yyvsp[0].tv_str); ; break;} -case 135: -#line 1326 "asn1p_y.y" +case 140: +#line 1357 "asn1p_y.y" { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 2; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); @@ -2455,8 +2493,8 @@ case 135: free(yyvsp[0].tv_opaque.buf); ; break;} -case 136: -#line 1336 "asn1p_y.y" +case 141: +#line 1367 "asn1p_y.y" { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); @@ -2470,68 +2508,68 @@ case 136: yyval.tv_opaque.len = newsize; ; break;} -case 137: -#line 1351 "asn1p_y.y" +case 142: +#line 1382 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BOOLEAN; ; break;} -case 138: -#line 1352 "asn1p_y.y" +case 143: +#line 1383 "asn1p_y.y" { yyval.a_type = ASN_BASIC_NULL; ; break;} -case 139: -#line 1353 "asn1p_y.y" +case 144: +#line 1384 "asn1p_y.y" { yyval.a_type = ASN_BASIC_REAL; ; break;} -case 140: -#line 1354 "asn1p_y.y" +case 145: +#line 1385 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} -case 141: -#line 1355 "asn1p_y.y" +case 146: +#line 1386 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OCTET_STRING; ; break;} -case 142: -#line 1356 "asn1p_y.y" +case 147: +#line 1387 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; break;} -case 143: -#line 1357 "asn1p_y.y" +case 148: +#line 1388 "asn1p_y.y" { yyval.a_type = ASN_BASIC_RELATIVE_OID; ; break;} -case 144: -#line 1358 "asn1p_y.y" +case 149: +#line 1389 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EXTERNAL; ; break;} -case 145: -#line 1359 "asn1p_y.y" +case 150: +#line 1390 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; break;} -case 146: -#line 1360 "asn1p_y.y" +case 151: +#line 1391 "asn1p_y.y" { yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; break;} -case 147: -#line 1361 "asn1p_y.y" +case 152: +#line 1392 "asn1p_y.y" { yyval.a_type = ASN_BASIC_UTCTime; ; break;} -case 148: -#line 1362 "asn1p_y.y" +case 153: +#line 1393 "asn1p_y.y" { yyval.a_type = ASN_BASIC_GeneralizedTime; ; break;} -case 149: -#line 1369 "asn1p_y.y" +case 154: +#line 1400 "asn1p_y.y" { yyval.a_type = ASN_BASIC_INTEGER; ; break;} -case 150: -#line 1370 "asn1p_y.y" +case 155: +#line 1401 "asn1p_y.y" { yyval.a_type = ASN_BASIC_ENUMERATED; ; break;} -case 151: -#line 1371 "asn1p_y.y" +case 156: +#line 1402 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BIT_STRING; ; break;} -case 152: -#line 1375 "asn1p_y.y" +case 157: +#line 1406 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2539,8 +2577,8 @@ case 152: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 153: -#line 1381 "asn1p_y.y" +case 158: +#line 1412 "asn1p_y.y" { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; @@ -2552,92 +2590,92 @@ case 153: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 154: -#line 1394 "asn1p_y.y" +case 159: +#line 1425 "asn1p_y.y" { yyval.a_type = ASN_STRING_BMPString; ; break;} -case 155: -#line 1395 "asn1p_y.y" +case 160: +#line 1426 "asn1p_y.y" { yyval.a_type = ASN_STRING_GeneralString; - fprintf(stderr, "WARNING: GeneralString is not fully supported"); + fprintf(stderr, "WARNING: GeneralString is not fully supported\n"); ; break;} -case 156: -#line 1399 "asn1p_y.y" +case 161: +#line 1430 "asn1p_y.y" { yyval.a_type = ASN_STRING_GraphicString; - fprintf(stderr, "WARNING: GraphicString is not fully supported"); + fprintf(stderr, "WARNING: GraphicString is not fully supported\n"); ; break;} -case 157: -#line 1403 "asn1p_y.y" +case 162: +#line 1434 "asn1p_y.y" { yyval.a_type = ASN_STRING_IA5String; ; break;} -case 158: -#line 1404 "asn1p_y.y" +case 163: +#line 1435 "asn1p_y.y" { yyval.a_type = ASN_STRING_ISO646String; ; break;} -case 159: -#line 1405 "asn1p_y.y" +case 164: +#line 1436 "asn1p_y.y" { yyval.a_type = ASN_STRING_NumericString; ; break;} -case 160: -#line 1406 "asn1p_y.y" +case 165: +#line 1437 "asn1p_y.y" { yyval.a_type = ASN_STRING_PrintableString; ; break;} -case 161: -#line 1407 "asn1p_y.y" +case 166: +#line 1438 "asn1p_y.y" { yyval.a_type = ASN_STRING_T61String; - fprintf(stderr, "WARNING: T61String is not fully supported"); + fprintf(stderr, "WARNING: T61String is not fully supported\n"); ; break;} -case 162: -#line 1411 "asn1p_y.y" +case 167: +#line 1442 "asn1p_y.y" { yyval.a_type = ASN_STRING_TeletexString; ; break;} -case 163: -#line 1412 "asn1p_y.y" +case 168: +#line 1443 "asn1p_y.y" { yyval.a_type = ASN_STRING_UniversalString; ; break;} -case 164: -#line 1413 "asn1p_y.y" +case 169: +#line 1444 "asn1p_y.y" { yyval.a_type = ASN_STRING_UTF8String; ; break;} -case 165: -#line 1414 "asn1p_y.y" +case 170: +#line 1445 "asn1p_y.y" { yyval.a_type = ASN_STRING_VideotexString; - fprintf(stderr, "WARNING: VideotexString is not fully supported"); + fprintf(stderr, "WARNING: VideotexString is not fully supported\n"); ; break;} -case 166: -#line 1418 "asn1p_y.y" +case 171: +#line 1449 "asn1p_y.y" { yyval.a_type = ASN_STRING_VisibleString; ; break;} -case 167: -#line 1419 "asn1p_y.y" +case 172: +#line 1450 "asn1p_y.y" { yyval.a_type = ASN_STRING_ObjectDescriptor; ; break;} -case 173: -#line 1431 "asn1p_y.y" +case 178: +#line 1462 "asn1p_y.y" { yyval.a_constr = 0; ; break;} -case 174: -#line 1432 "asn1p_y.y" +case 179: +#line 1463 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 175: -#line 1438 "asn1p_y.y" +case 180: +#line 1469 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); ; break;} -case 176: -#line 1441 "asn1p_y.y" +case 181: +#line 1472 "asn1p_y.y" { /* * This is a special case, for compatibility purposes. @@ -2646,26 +2684,26 @@ case 176: CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_SIZE, yyvsp[-1].a_constr, 0); ; break;} -case 177: -#line 1451 "asn1p_y.y" +case 182: +#line 1482 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; ; break;} -case 178: -#line 1454 "asn1p_y.y" +case 183: +#line 1485 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} -case 179: -#line 1460 "asn1p_y.y" +case 184: +#line 1491 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 180: -#line 1463 "asn1p_y.y" +case 185: +#line 1494 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2673,8 +2711,8 @@ case 180: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); ; break;} -case 181: -#line 1469 "asn1p_y.y" +case 186: +#line 1500 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2684,32 +2722,32 @@ case 181: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, ct, yyvsp[0].a_constr); ; break;} -case 182: -#line 1480 "asn1p_y.y" +case 187: +#line 1511 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 183: -#line 1483 "asn1p_y.y" +case 188: +#line 1514 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 184: -#line 1486 "asn1p_y.y" +case 189: +#line 1517 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 185: -#line 1489 "asn1p_y.y" +case 190: +#line 1520 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 186: -#line 1495 "asn1p_y.y" +case 191: +#line 1526 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2719,8 +2757,8 @@ case 186: checkmem(ret == 0); ; break;} -case 187: -#line 1503 "asn1p_y.y" +case 192: +#line 1534 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2730,8 +2768,8 @@ case 187: checkmem(ret == 0); ; break;} -case 188: -#line 1511 "asn1p_y.y" +case 193: +#line 1542 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2739,8 +2777,8 @@ case 188: yyval.a_constr->value = yyvsp[0].a_value; ; break;} -case 189: -#line 1517 "asn1p_y.y" +case 194: +#line 1548 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2749,8 +2787,8 @@ case 189: yyval.a_constr->range_stop = yyvsp[0].a_value; ; break;} -case 190: -#line 1524 "asn1p_y.y" +case 195: +#line 1555 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2760,8 +2798,8 @@ case 190: yyval.a_constr->range_start->type = ATV_MIN; ; break;} -case 191: -#line 1532 "asn1p_y.y" +case 196: +#line 1563 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2771,8 +2809,8 @@ case 191: yyval.a_constr->range_stop->type = ATV_MAX; ; break;} -case 192: -#line 1540 "asn1p_y.y" +case 197: +#line 1571 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2783,54 +2821,54 @@ case 192: yyval.a_constr->range_stop->type = ATV_MAX; ; break;} -case 193: -#line 1549 "asn1p_y.y" +case 198: +#line 1580 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 194: -#line 1552 "asn1p_y.y" +case 199: +#line 1583 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 195: -#line 1558 "asn1p_y.y" +case 200: +#line 1589 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RANGE; ; break;} -case 196: -#line 1559 "asn1p_y.y" +case 201: +#line 1590 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RLRANGE; ; break;} -case 197: -#line 1560 "asn1p_y.y" +case 202: +#line 1591 "asn1p_y.y" { yyval.a_ctype = ACT_EL_LLRANGE; ; break;} -case 198: -#line 1561 "asn1p_y.y" +case 203: +#line 1592 "asn1p_y.y" { yyval.a_ctype = ACT_EL_ULRANGE; ; break;} -case 199: -#line 1565 "asn1p_y.y" +case 204: +#line 1596 "asn1p_y.y" { yyval.a_ctype = ACT_CT_SIZE; ; break;} -case 200: -#line 1568 "asn1p_y.y" +case 205: +#line 1599 "asn1p_y.y" { yyval.a_ctype = ACT_CT_FROM; ; break;} -case 201: -#line 1574 "asn1p_y.y" +case 206: +#line 1605 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 202: -#line 1577 "asn1p_y.y" +case 207: +#line 1608 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2843,57 +2881,57 @@ case 202: free(yyvsp[0].tv_str); ; break;} -case 203: -#line 1588 "asn1p_y.y" +case 208: +#line 1619 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} -case 204: -#line 1593 "asn1p_y.y" +case 209: +#line 1623 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_FALSE; ; break;} -case 205: -#line 1598 "asn1p_y.y" +case 210: +#line 1628 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); yyval.a_value->type = ATV_TRUE; ; break;} -case 206: -#line 1606 "asn1p_y.y" +case 211: +#line 1636 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); ; break;} -case 207: -#line 1612 "asn1p_y.y" +case 212: +#line 1642 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 208: -#line 1615 "asn1p_y.y" +case 213: +#line 1645 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 209: -#line 1621 "asn1p_y.y" +case 214: +#line 1651 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_EXT; ; break;} -case 210: -#line 1626 "asn1p_y.y" +case 215: +#line 1656 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2902,46 +2940,46 @@ case 210: yyval.a_constr->presence = yyvsp[0].a_pres; ; break;} -case 211: -#line 1639 "asn1p_y.y" +case 216: +#line 1669 "asn1p_y.y" { yyval.a_pres = ACPRES_DEFAULT; ; break;} -case 212: -#line 1640 "asn1p_y.y" +case 217: +#line 1670 "asn1p_y.y" { yyval.a_pres = yyvsp[0].a_pres; ; break;} -case 213: -#line 1644 "asn1p_y.y" +case 218: +#line 1674 "asn1p_y.y" { yyval.a_pres = ACPRES_PRESENT; ; break;} -case 214: -#line 1647 "asn1p_y.y" +case 219: +#line 1677 "asn1p_y.y" { yyval.a_pres = ACPRES_ABSENT; ; break;} -case 215: -#line 1650 "asn1p_y.y" +case 220: +#line 1680 "asn1p_y.y" { yyval.a_pres = ACPRES_OPTIONAL; ; break;} -case 216: -#line 1656 "asn1p_y.y" +case 221: +#line 1686 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 217: -#line 1659 "asn1p_y.y" +case 222: +#line 1689 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 218: -#line 1668 "asn1p_y.y" +case 223: +#line 1698 "asn1p_y.y" { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; @@ -2955,14 +2993,14 @@ case 218: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, ct, 0); ; break;} -case 219: -#line 1683 "asn1p_y.y" +case 224: +#line 1713 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} -case 220: -#line 1689 "asn1p_y.y" +case 225: +#line 1719 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2970,8 +3008,8 @@ case 220: yyval.a_constr->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); ; break;} -case 221: -#line 1695 "asn1p_y.y" +case 226: +#line 1725 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2981,8 +3019,8 @@ case 221: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); ; break;} -case 222: -#line 1709 "asn1p_y.y" +case 227: +#line 1739 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; @@ -2995,8 +3033,8 @@ case 222: free(yyvsp[0].tv_str); ; break;} -case 223: -#line 1720 "asn1p_y.y" +case 228: +#line 1750 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; @@ -3010,14 +3048,14 @@ case 223: free(yyvsp[0].tv_str); ; break;} -case 224: -#line 1736 "asn1p_y.y" +case 229: +#line 1766 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 225: -#line 1739 "asn1p_y.y" +case 230: +#line 1769 "asn1p_y.y" { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); @@ -3028,76 +3066,61 @@ case 225: yyval.tv_str[l1 + 1 + l3] = '\0'; ; break;} -case 226: -#line 1757 "asn1p_y.y" -{ yyval.a_marker = EM_NOMARK; ; - break;} -case 227: -#line 1758 "asn1p_y.y" -{ yyval.a_marker = yyvsp[0].a_marker; ; - break;} -case 228: -#line 1762 "asn1p_y.y" -{ - yyval.a_marker = EM_OPTIONAL; - ; - break;} -case 229: -#line 1765 "asn1p_y.y" -{ - yyval.a_marker = EM_DEFAULT; - /* FIXME: store DefaultValue somewhere */ - ; - break;} -case 230: -#line 1772 "asn1p_y.y" -{ - ; - break;} case 231: -#line 1774 "asn1p_y.y" +#line 1787 "asn1p_y.y" { + yyval.a_marker.flags = EM_NOMARK; + yyval.a_marker.default_value = 0; ; break;} case 232: -#line 1776 "asn1p_y.y" -{ asn1p_lexer_hack_push_opaque_state(); ; +#line 1791 "asn1p_y.y" +{ yyval.a_marker = yyvsp[0].a_marker; ; break;} case 233: -#line 1776 "asn1p_y.y" +#line 1795 "asn1p_y.y" { + yyval.a_marker.flags = EM_OPTIONAL; + yyval.a_marker.default_value = 0; ; break;} case 234: -#line 1797 "asn1p_y.y" +#line 1799 "asn1p_y.y" +{ + yyval.a_marker.flags = EM_DEFAULT; + yyval.a_marker.default_value = yyvsp[0].a_value; + ; + break;} +case 235: +#line 1822 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); ; break;} -case 235: -#line 1801 "asn1p_y.y" +case 236: +#line 1826 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; ; break;} -case 236: -#line 1807 "asn1p_y.y" +case 237: +#line 1832 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 237: -#line 1812 "asn1p_y.y" +case 238: +#line 1837 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 238: -#line 1819 "asn1p_y.y" +case 239: +#line 1844 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3106,8 +3129,8 @@ case 238: yyval.a_expr->Identifier = yyvsp[0].tv_str; ; break;} -case 239: -#line 1826 "asn1p_y.y" +case 240: +#line 1851 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3117,8 +3140,8 @@ case 239: yyval.a_expr->value = yyvsp[-1].a_value; ; break;} -case 240: -#line 1834 "asn1p_y.y" +case 241: +#line 1859 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3128,8 +3151,8 @@ case 240: yyval.a_expr->value = yyvsp[-1].a_value; ; break;} -case 241: -#line 1842 "asn1p_y.y" +case 242: +#line 1867 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3138,8 +3161,8 @@ case 241: yyval.a_expr->value = yyvsp[0].a_value; ; break;} -case 242: -#line 1849 "asn1p_y.y" +case 243: +#line 1874 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3149,72 +3172,72 @@ case 242: yyval.a_expr->meta_type = AMT_VALUE; ; break;} -case 243: -#line 1860 "asn1p_y.y" +case 244: +#line 1885 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} -case 244: -#line 1864 "asn1p_y.y" +case 245: +#line 1889 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} -case 245: -#line 1895 "asn1p_y.y" +case 246: +#line 1920 "asn1p_y.y" { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; break;} -case 246: -#line 1896 "asn1p_y.y" +case 247: +#line 1921 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; ; break;} -case 247: -#line 1900 "asn1p_y.y" +case 248: +#line 1925 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; yyval.a_tag.tag_mode = TM_DEFAULT; ; break;} -case 248: -#line 1904 "asn1p_y.y" +case 249: +#line 1929 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_IMPLICIT; ; break;} -case 249: -#line 1908 "asn1p_y.y" +case 250: +#line 1933 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_EXPLICIT; ; break;} -case 250: -#line 1915 "asn1p_y.y" +case 251: +#line 1940 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 251: -#line 1919 "asn1p_y.y" +case 252: +#line 1944 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 252: -#line 1927 "asn1p_y.y" +case 253: +#line 1952 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 253: -#line 1934 "asn1p_y.y" +case 254: +#line 1959 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; @@ -3442,7 +3465,7 @@ case 253: } return 1; } -#line 1940 "asn1p_y.y" +#line 1965 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.h b/libasn1parser/asn1p_y.h index 375b845fd..788f2d9ee 100644 --- a/libasn1parser/asn1p_y.h +++ b/libasn1parser/asn1p_y.h @@ -17,7 +17,7 @@ typedef union { asn1p_value_t *a_value; /* Number, DefinedValue, etc */ struct asn1p_param_s a_parg; /* A parameter argument */ asn1p_paramlist_t *a_plist; /* A pargs list */ - enum asn1p_expr_marker_e a_marker; /* OPTIONAL/DEFAULT */ + struct asn1p_expr_marker_s a_marker; /* OPTIONAL/DEFAULT */ enum asn1p_constr_pres_e a_pres; /* PRESENT/ABSENT/OPTIONAL */ asn1_integer_t a_int; char *tv_str; diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index bc1952221..ae63090ea 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -74,7 +74,7 @@ static asn1p_value_t * asn1p_value_t *a_value; /* Number, DefinedValue, etc */ struct asn1p_param_s a_parg; /* A parameter argument */ asn1p_paramlist_t *a_plist; /* A pargs list */ - enum asn1p_expr_marker_e a_marker; /* OPTIONAL/DEFAULT */ + struct asn1p_expr_marker_s a_marker; /* OPTIONAL/DEFAULT */ enum asn1p_constr_pres_e a_pres; /* PRESENT/ABSENT/OPTIONAL */ asn1_integer_t a_int; char *tv_str; @@ -236,7 +236,7 @@ static asn1p_value_t * %type optValueSetBody %type ValueSetBody %type ValueSetElement -%type InlineOrDefinedValue +%type Value %type DefinedValue %type SignedNumber %type ComponentTypeLists @@ -1178,6 +1178,16 @@ ComplexTypeReference: checkmem(ret == 0); free($1); } + | ObjectClassReference '.' TypeRefName { + int ret; + $$ = asn1p_ref_new(yylineno); + checkmem($$); + ret = asn1p_ref_add_component($$, $1, RLT_UNKNOWN); + checkmem(ret == 0); + ret = asn1p_ref_add_component($$, $3, RLT_UNKNOWN); + checkmem(ret == 0); + free($1); + } | TOK_typereference '.' Identifier { int ret; $$ = asn1p_ref_new(yylineno); @@ -1258,7 +1268,7 @@ ClassFieldName: * === EOF === */ ValueDefinition: - Identifier DefinedTypeRef TOK_PPEQ InlineOrDefinedValue { + Identifier DefinedTypeRef TOK_PPEQ Value { $$ = $2; assert($$->Identifier == NULL); $$->Identifier = $1; @@ -1267,13 +1277,34 @@ ValueDefinition: } ; -InlineOrDefinedValue: - '{' { asn1p_lexer_hack_push_opaque_state(); } - Opaque /* '}' */ { +Value: + Identifier ':' Value { + $$ = asn1p_value_fromint(0); + checkmem($$); + $$->type = ATV_CHOICE_IDENTIFIER; + $$->value.choice_identifier.identifier = $1; + $$->value.choice_identifier.value = $3; + } + | '{' { asn1p_lexer_hack_push_opaque_state(); } Opaque /* '}' */ { $$ = asn1p_value_frombuf($3.buf, $3.len, 0); checkmem($$); $$->type = ATV_UNPARSED; } + | TOK_NULL { + $$ = asn1p_value_fromint(0); + checkmem($$); + $$->type = ATV_NULL; + } + | TOK_FALSE { + $$ = asn1p_value_fromint(0); + checkmem($$); + $$->type = ATV_FALSE; + } + | TOK_TRUE { + $$ = asn1p_value_fromint(0); + checkmem($$); + $$->type = ATV_TRUE; + } | TOK_bstring { $$ = _convert_bitstring2binary($1, 'B'); checkmem($$); @@ -1394,11 +1425,11 @@ BasicString: TOK_BMPString { $$ = ASN_STRING_BMPString; } | TOK_GeneralString { $$ = ASN_STRING_GeneralString; - fprintf(stderr, "WARNING: GeneralString is not fully supported"); + fprintf(stderr, "WARNING: GeneralString is not fully supported\n"); } | TOK_GraphicString { $$ = ASN_STRING_GraphicString; - fprintf(stderr, "WARNING: GraphicString is not fully supported"); + fprintf(stderr, "WARNING: GraphicString is not fully supported\n"); } | TOK_IA5String { $$ = ASN_STRING_IA5String; } | TOK_ISO646String { $$ = ASN_STRING_ISO646String; } @@ -1406,14 +1437,14 @@ BasicString: | TOK_PrintableString { $$ = ASN_STRING_PrintableString; } | TOK_T61String { $$ = ASN_STRING_T61String; - fprintf(stderr, "WARNING: T61String is not fully supported"); + fprintf(stderr, "WARNING: T61String is not fully supported\n"); } | TOK_TeletexString { $$ = ASN_STRING_TeletexString; } | TOK_UniversalString { $$ = ASN_STRING_UniversalString; } | TOK_UTF8String { $$ = ASN_STRING_UTF8String; } | TOK_VideotexString { $$ = ASN_STRING_VideotexString; - fprintf(stderr, "WARNING: VideotexString is not fully supported"); + fprintf(stderr, "WARNING: VideotexString is not fully supported\n"); } | TOK_VisibleString { $$ = ASN_STRING_VisibleString; } | TOK_ObjectDescriptor { $$ = ASN_STRING_ObjectDescriptor; } @@ -1589,7 +1620,6 @@ ConstraintValue: $$ = asn1p_value_frombuf($1.buf, $1.len, 0); checkmem($$); } - | TOK_FALSE { $$ = asn1p_value_fromint(0); checkmem($$); @@ -1754,26 +1784,21 @@ ComponentIdList: */ optMarker: - { $$ = EM_NOMARK; } + { + $$.flags = EM_NOMARK; + $$.default_value = 0; + } | Marker { $$ = $1; } ; Marker: TOK_OPTIONAL { - $$ = EM_OPTIONAL; - } - | TOK_DEFAULT DefaultValue { - $$ = EM_DEFAULT; - /* FIXME: store DefaultValue somewhere */ - } - ; - -DefaultValue: - ConstraintValue { - } - | BasicTypeId { + $$.flags = EM_OPTIONAL; + $$.default_value = 0; } - | '{' { asn1p_lexer_hack_push_opaque_state(); } Opaque /* '}' */ { + | TOK_DEFAULT Value { + $$.flags = EM_DEFAULT; + $$.default_value = $2; } ; From 9e4815dfbeea7d10aa9ce874d4020acb51b865a6 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Sep 2004 12:01:04 +0000 Subject: [PATCH 0350/1469] DEFAULT Value parsing and pretty-printing. constraints and tags checking/fixing code fixes git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@350 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ChangeLog b/ChangeLog index e101272a0..48d542d9b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -10,6 +10,11 @@ * Added converters between any generic type and the ANY type. * Parser fixed: Information Object Class fields may be taged. * Parser fixed: tagged types inside SEQUENCE OF/SET OF support. + * Improved DEFAULT Value parsing and pretty-printing. + * Condition on distinct tags checker was incorrectly dealing with + tagged CHOICE types. Fixed. Modified tests/37-indirect-choice-OK.asn1 + * Fixed constraint checking code incorrectly dealing with imported + types with constraint values defined in other modules. * Real REAL support! (Haven't tested denormals support yet!) See skeletons/tests/check-REAL.c From b47f48e60c2687e9fe7b2d8b5347a2188278d50f Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 17 Sep 2004 06:32:12 +0000 Subject: [PATCH 0351/1469] better type naming git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@351 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 1 + libasn1compiler/asn1c_C.c | 5 +- libasn1compiler/asn1c_misc.c | 24 ++--- tests/19-param-OK.asn1.-P | 2 +- tests/31-set-of-OK.asn1.-P | 4 +- tests/39-sequence-of-OK.asn1.-P | 2 +- tests/42-real-life-OK.asn1.-PR | 4 +- tests/66-ref-simple-OK.asn1 | 18 ++++ tests/66-ref-simple-OK.asn1.-P | 168 ++++++++++++++++++++++++++++++++ 9 files changed, 204 insertions(+), 24 deletions(-) create mode 100644 tests/66-ref-simple-OK.asn1 create mode 100644 tests/66-ref-simple-OK.asn1.-P diff --git a/ChangeLog b/ChangeLog index 48d542d9b..e66d7cc46 100644 --- a/ChangeLog +++ b/ChangeLog @@ -13,6 +13,7 @@ * Improved DEFAULT Value parsing and pretty-printing. * Condition on distinct tags checker was incorrectly dealing with tagged CHOICE types. Fixed. Modified tests/37-indirect-choice-OK.asn1 + * Improved type name generation code ("struct foo" vs "foo_t"). * Fixed constraint checking code incorrectly dealing with imported types with constraint values defined in other modules. * Real REAL support! (Haven't tested denormals support yet!) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 0e356aeb8..a5d04c6b3 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -452,7 +452,7 @@ asn1c_lang_C_type_SEx_OF(arg_t *arg) { arg->embed--; assert(arg->target->target == OT_TYPE_DECLS); } else { - OUT("%s", asn1c_type_name(arg, memb, TNF_RSAFE)); + OUT("%s", asn1c_type_name(arg, memb, TNF_CTYPE)); } OUT(") list;\n"); INDENT(-1); @@ -728,8 +728,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { if(arg->embed) { REDIR(OT_TYPE_DECLS); - OUT("%s\t", asn1c_type_name(arg, arg->expr, - expr->marker.flags?TNF_RSAFE:TNF_CTYPE)); + OUT("%s\t", asn1c_type_name(arg, arg->expr, TNF_CTYPE)); OUT("%s", expr->marker.flags?"*":" "); OUT("%s", MKID(expr->Identifier)); if((expr->marker.flags & EM_DEFAULT) == EM_DEFAULT) diff --git a/libasn1compiler/asn1c_misc.c b/libasn1compiler/asn1c_misc.c index 1c4912d6e..86edb52bd 100644 --- a/libasn1compiler/asn1c_misc.c +++ b/libasn1compiler/asn1c_misc.c @@ -112,23 +112,17 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { return asn1c_type_name(&tmp, tmp.expr, _format); } - if(_format == TNF_RSAFE || _format == TNF_CTYPE) { + if(_format == TNF_CTYPE) { /* - * The recursion-safe format is requested. - * The problem here is that only constructed types - * might be referenced with "struct". - * Change RSAFE to CTYPE if the terminal type - * is primitive. + * If the component references the type itself, + * switch to a recursion safe type representation + * ("struct foo" instead of "foo_t"). */ asn1p_expr_t *terminal; terminal = asn1f_find_terminal_type_ex( - arg->asn, arg->mod, arg->expr); - if(terminal) { - if(terminal->expr_type - & (ASN_BASIC_MASK | ASN_STRING_MASK)) - _format = TNF_CTYPE; - if(terminal == top_parent) - _format = TNF_RSAFE; + arg->asn, arg->mod, expr); + if(terminal && terminal == top_parent) { + _format = TNF_RSAFE; } } break; @@ -179,7 +173,7 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { _format = TNF_CTYPE; typename = ASN_EXPR_TYPE2STR(expr->expr_type); } else { - _format = TNF_SAFE; + _format = TNF_RSAFE; typename = expr->Identifier; } } @@ -196,7 +190,7 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { return asn1c_make_identifier(0, "struct", " ", typename, 0); } - assert("!unreachable"); + assert(!"unreachable"); return typename; } diff --git a/tests/19-param-OK.asn1.-P b/tests/19-param-OK.asn1.-P index 83be07d77..e980f1c5f 100644 --- a/tests/19-param-OK.asn1.-P +++ b/tests/19-param-OK.asn1.-P @@ -200,7 +200,7 @@ extern asn1_TYPE_descriptor_t asn1_DEF_Name; typedef struct Name { - A_SEQUENCE_OF(struct RelativeDistinguishedName) list; + A_SEQUENCE_OF(RelativeDistinguishedName_t) list; /* Context for parsing across buffer boundaries */ ber_dec_ctx_t _ber_dec_ctx; diff --git a/tests/31-set-of-OK.asn1.-P b/tests/31-set-of-OK.asn1.-P index 77281214c..d16751276 100644 --- a/tests/31-set-of-OK.asn1.-P +++ b/tests/31-set-of-OK.asn1.-P @@ -13,7 +13,7 @@ extern asn1_TYPE_descriptor_t asn1_DEF_Forest; typedef struct Forest { - A_SET_OF(struct Tree) list; + A_SET_OF(Tree_t) list; /* Context for parsing across buffer boundaries */ ber_dec_ctx_t _ber_dec_ctx; @@ -158,7 +158,7 @@ extern asn1_TYPE_descriptor_t asn1_DEF_Stuff; typedef struct Stuff { struct trees { - A_SET_OF(struct Forest) list; + A_SET_OF(Forest_t) list; /* Context for parsing across buffer boundaries */ ber_dec_ctx_t _ber_dec_ctx; diff --git a/tests/39-sequence-of-OK.asn1.-P b/tests/39-sequence-of-OK.asn1.-P index 81ac16d9e..04b9948d6 100644 --- a/tests/39-sequence-of-OK.asn1.-P +++ b/tests/39-sequence-of-OK.asn1.-P @@ -17,7 +17,7 @@ extern asn1_TYPE_descriptor_t asn1_DEF_T; typedef struct T { INTEGER_t int; struct collection { - A_SEQUENCE_OF(struct T2) list; + A_SEQUENCE_OF(T2_t) list; /* Context for parsing across buffer boundaries */ ber_dec_ctx_t _ber_dec_ctx; diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index 262bacc16..72044d3f5 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -17,7 +17,7 @@ extern asn1_TYPE_descriptor_t asn1_DEF_LogLine; typedef struct LogLine { IA5String_t line_digest; struct varsets { - A_SEQUENCE_OF(struct VariablePartSet) list; + A_SEQUENCE_OF(VariablePartSet_t) list; /* Context for parsing across buffer boundaries */ ber_dec_ctx_t _ber_dec_ctx; @@ -171,7 +171,7 @@ extern asn1_TYPE_descriptor_t asn1_DEF_VariablePartSet; typedef struct VariablePartSet { struct vparts { - A_SEQUENCE_OF(struct VariablePart) list; + A_SEQUENCE_OF(VariablePart_t) list; /* Context for parsing across buffer boundaries */ ber_dec_ctx_t _ber_dec_ctx; diff --git a/tests/66-ref-simple-OK.asn1 b/tests/66-ref-simple-OK.asn1 new file mode 100644 index 000000000..7b19c705d --- /dev/null +++ b/tests/66-ref-simple-OK.asn1 @@ -0,0 +1,18 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .66 + +ModuleTestReferenceToSimpleType + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 66 } + DEFINITIONS IMPLICIT TAGS ::= +BEGIN + + T ::= SET OF SimpleType + + SimpleType ::= ENUMERATED { one, two, three } + +END diff --git a/tests/66-ref-simple-OK.asn1.-P b/tests/66-ref-simple-OK.asn1.-P new file mode 100644 index 000000000..8a3466de4 --- /dev/null +++ b/tests/66-ref-simple-OK.asn1.-P @@ -0,0 +1,168 @@ + +/*** <<< INCLUDES [T] >>> ***/ + +#include +#include +#include + +/*** <<< DEPS [T] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_T; + +/*** <<< TYPE-DECLS [T] >>> ***/ + + +typedef struct T { + A_SET_OF(SimpleType_t) list; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} T_t; + +/*** <<< STAT-DEFS [T] >>> ***/ + +static asn1_TYPE_member_t asn1_MBR_T[] = { + { ATF_NOFLAGS, 0, 0, + .tag = (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_SimpleType, + .memb_constraints = 0, /* Defer to actual type */ + .name = "" + }, +}; +static ber_tlv_tag_t asn1_DEF_T_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) +}; +static asn1_SET_OF_specifics_t asn1_DEF_T_specs = { + sizeof(struct T), + offsetof(struct T, _ber_dec_ctx), +}; +asn1_TYPE_descriptor_t asn1_DEF_T = { + "T", + SET_OF_constraint, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_print, + SET_OF_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T_tags, + sizeof(asn1_DEF_T_tags) + /sizeof(asn1_DEF_T_tags[0]), /* 1 */ + asn1_DEF_T_tags, /* Same as above */ + sizeof(asn1_DEF_T_tags) + /sizeof(asn1_DEF_T_tags[0]), /* 1 */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_T, + 1, /* Single element */ + &asn1_DEF_T_specs /* Additional specs */ +}; + + +/*** <<< INCLUDES [SimpleType] >>> ***/ + +#include + +/*** <<< DEPS [SimpleType] >>> ***/ + +typedef enum SimpleType { + SimpleType_one = 0, + SimpleType_two = 1, + SimpleType_three = 2, +} SimpleType_e; + +/*** <<< TYPE-DECLS [SimpleType] >>> ***/ + + +typedef ENUMERATED_t SimpleType_t; + +/*** <<< FUNC-DECLS [SimpleType] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_SimpleType; +asn_constr_check_f SimpleType_constraint; +ber_type_decoder_f SimpleType_decode_ber; +der_type_encoder_f SimpleType_encode_der; +asn_struct_print_f SimpleType_print; +asn_struct_free_f SimpleType_free; + +/*** <<< CODE [SimpleType] >>> ***/ + +int +SimpleType_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + + /* Make the underlying type checker permanent */ + td->check_constraints = asn1_DEF_ENUMERATED.check_constraints; + return td->check_constraints + (td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using ENUMERATED, + * so adjust the DEF appropriately. + */ +static void +SimpleType_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { + td->ber_decoder = asn1_DEF_ENUMERATED.ber_decoder; + td->der_encoder = asn1_DEF_ENUMERATED.der_encoder; + td->free_struct = asn1_DEF_ENUMERATED.free_struct; + td->print_struct = asn1_DEF_ENUMERATED.print_struct; + td->last_tag_form = asn1_DEF_ENUMERATED.last_tag_form; + td->elements = asn1_DEF_ENUMERATED.elements; + td->elements_count = asn1_DEF_ENUMERATED.elements_count; + td->specifics = asn1_DEF_ENUMERATED.specifics; +} + +ber_dec_rval_t +SimpleType_decode_ber(asn1_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + SimpleType_inherit_TYPE_descriptor(td); + return td->ber_decoder(td, structure, bufptr, size, tag_mode); +} + +der_enc_rval_t +SimpleType_encode_der(asn1_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + SimpleType_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +int +SimpleType_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + SimpleType_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +void +SimpleType_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + SimpleType_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + + +/*** <<< STAT-DEFS [SimpleType] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_SimpleType_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn1_TYPE_descriptor_t asn1_DEF_SimpleType = { + "SimpleType", + SimpleType_constraint, + SimpleType_decode_ber, + SimpleType_encode_der, + SimpleType_print, + SimpleType_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_SimpleType_tags, + sizeof(asn1_DEF_SimpleType_tags) + /sizeof(asn1_DEF_SimpleType_tags[0]), /* 1 */ + asn1_DEF_SimpleType_tags, /* Same as above */ + sizeof(asn1_DEF_SimpleType_tags) + /sizeof(asn1_DEF_SimpleType_tags[0]), /* 1 */ + -0, /* Unknown yet */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + From bed6f81cb8ddb65c1e764d4caf9d6fc66b73303e Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 17 Sep 2004 06:46:10 +0000 Subject: [PATCH 0352/1469] __CYGWIN__ portability git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@352 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 2 +- skeletons/GeneralizedTime.c | 97 ++++++++++++++++++++++--------------- 2 files changed, 58 insertions(+), 41 deletions(-) diff --git a/ChangeLog b/ChangeLog index e66d7cc46..5949abebe 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9.5: 2004-Sep-14 +0.9.5: 2004-Sep-17 * Fixed CER (common BER) decoder code. See check-25.c/VisibleString case for details. X.690 specifies that inner structures in BER diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 6a89b2d64..88806f91d 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -11,8 +11,8 @@ #if defined(WIN32) #warning PLEASE STOP AND READ! -#warning localtime_r is implemented via localtime(), which is not thread-safe. -#warning gmtime_r is implemented via gmtime(), which is not thread-safe. +#warning localtime_r is implemented via localtime(), which may be not thread-safe. +#warning gmtime_r is implemented via gmtime(), which may be not thread-safe. #warning #warning You must fix the code by inserting appropriate locking #warning if you want to use asn_GT2time() or asn_UT2time(). @@ -32,39 +32,76 @@ static struct tm *gmtime_r(const time_t *tloc, struct tm *result) { return 0; } +#define tzset() _tzset() +#define _EMULATE_TIMEGM + +#endif /* WIN32 */ + +/* + * Where to look for offset from GMT, Phase I. + * Several platforms are known. + */ +#if defined(__FreeBSD__) \ + || (defined(__GNUC__) && defined(__APPLE_CC__)) \ + || (defined __GLIBC__ && __GLIBC__ >= 2) +#undef HAVE_TM_GMTOFF +#define HAVE_TM_GMTOFF +#endif /* BSDs and newer glibc */ + +/* + * Where to look for offset from GMT, Phase II. + */ +#ifdef HAVE_TM_GMTOFF +#define GMTOFF(tm) ((tm).tm_gmtoff) +#else /* HAVE_TM_GMTOFF */ +#define GMTOFF(tm) (-timezone) +#endif /* HAVE_TM_GMTOFF */ + +/* + * Override our GMTOFF decision for other known platforms. + */ +#ifdef __CYGWIN__ +#undef GMTOFF +static long GMTOFF(struct tm a){ + struct tm *lt; + time_t local_time, gmt_time; + long zone; + + tzset(); + gmt_time = time (NULL); + + lt = gmtime(&gmt_time); + + local_time = mktime(lt); + return (gmt_time - local_time); +} +#define _EMULATE_TIMEGM + +#endif /* __CYGWIN__ */ + +#ifdef _EMULATE_TIMEGM static time_t timegm(struct tm *tm) { time_t tloc; char *tz; char *buf; tz = getenv("TZ"); - _putenv("TZ=UTC"); - _tzset(); + _putenv("TZ=UTC"); + tzset(); tloc = mktime(tm); if (tz) { - buf = alloca(strlen(tz) + 4); - sprintf(buf, "TZ=%s", tz); + int bufsize = strlen(tz) + 4; + buf = alloca(bufsize); + snprintf(buf, bufsize, "TZ=%s", tz); } else { buf = "TZ="; } _putenv(buf); - _tzset(); + tzset(); return tloc; } +#endif /* _EMULATE_TIMEGM */ -#if 0 /* Alternate version */ -/* vlm: I am not sure about validity of this algorithm. */ -static time_t timegm(struct tm *tm) { - struct tm tmp; - time_t tloc = mktime(tm); - localtime_r(&tloc, &tmp); /* Figure out our GMT offset */ - tloc += tmp.tm_gmtoff; - tm->tm_zone = "GMT"; - tm->tm_gmtoff = 0; /* Simulate GMT */ - return tloc; -} -#endif -#endif /* WIN32 */ #ifndef __NO_ASN_TABLE__ @@ -185,26 +222,6 @@ GeneralizedTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, } } -/* - * Where to look for offset from GMT, Phase I. - * Several platforms are known. - */ -#if defined(__FreeBSD__) \ - || (defined(__GNUC__) && defined(__APPLE_CC__)) \ - || (defined __GLIBC__ && __GLIBC__ >= 2) -#undef HAVE_TM_GMTOFF -#define HAVE_TM_GMTOFF -#endif /* BSDs and newer glibc */ - -/* - * Where to look for offset from GMT, Phase II. - */ -#ifdef HAVE_TM_GMTOFF -#define GMTOFF(tm) ((tm).tm_gmtoff) -#else /* HAVE_TM_GMTOFF */ -#define GMTOFF(tm) (-timezone) -#endif /* HAVE_TM_GMTOFF */ - time_t asn_GT2time(const GeneralizedTime_t *st, struct tm *ret_tm, int as_gmt) { struct tm tm_s; From 11115254b547596fd2144cf54e7d7c475a422620 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 17 Sep 2004 08:35:02 +0000 Subject: [PATCH 0353/1469] -fnative-integers -> -fnative-types git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@353 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-usage.html | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/asn1c-usage.html b/doc/asn1c-usage.html index 589e4273a..523435edd 100644 --- a/doc/asn1c-usage.html +++ b/doc/asn1c-usage.html @@ -719,9 +719,10 @@

    This is a violation of an ASN.1 standard and compiler may fail to produce the meaningful code. --fnative-integers -Use native machine's integer types whenever possible, instead -of the complex ASN.1 INTEGER and ENUMERATED types. +-fnative-types +Use the native machine's data types (int, double) whenever +possible, instead of the compound ASN.1 INTEGER_t, ENUMERATED_t +and REAL_t types. -funnamed-unions Enable unnamed unions in the definitions of target language's @@ -1225,9 +1226,8 @@

    ... this2.2
    -
    -fnative-integers compiler option is used to produce basic -C int types instead of infinite width INTEGER_t structures. -See Table 1. +
    -fnative-types compiler option is used to produce basic C int +types instead of infinite width INTEGER_t structures. See Table 1.
    ... binary


    Lev Walkin -2004-09-07 +2004-09-17
    From 95df4c63bf55326e8f42ffd2055cfe2323fcf836 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 19 Sep 2004 00:11:23 +0000 Subject: [PATCH 0354/1469] RPM spec added git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@354 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c.spec.in | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 asn1c.spec.in diff --git a/asn1c.spec.in b/asn1c.spec.in new file mode 100644 index 000000000..f4e0132fe --- /dev/null +++ b/asn1c.spec.in @@ -0,0 +1,50 @@ +# +# $Id$ +# + +Name: @PACKAGE@ +Version: @VERSION@ +Release: 1 +Copyright: Lev Walkin +Source: %{name}-%{version}.tar.gz +Url: http://asn1c.sourceforge.net/ +BuildRoot: /var/tmp/%{name}-root + +Group: Development/Languages + +Summary: The ASN.1 to C compiler + +%description +The asn1c compiler turns ASN.1 specifications into C language source files. +The source files would contain BER/CER/DER encoders and decoders for the +given abstract notation. + +%prep +%setup -q + +%build +./configure +%{_make} DESTDIR=$RPM_BUILD_ROOT + +%install +rm -rf $RPM_BUILD_ROOT +%{__make} install-exec DESTDIR=$RPM_BUILD_ROOT +(cd skeletons && %{__make} install-data DESTDIR=$RPM_BUILD_ROOT) +(cd asn1c && %{__make} install-man DESTDIR=$RPM_BUILD_ROOT) + + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%doc README FAQ COPYING ChangeLog BUGS TODO +%doc doc/asn1c-usage.pdf doc/asn1c-usage.html +%attr(755,root,root) %{_bindir} +%attr(644,root,root) %{_datadir}/asn1c +%{_mandir}/man1/asn1c.1* + +%changelog + +* Tue Sep 18 2004 Lev Walkin +- First version of asn1c.spec + From e43659ab28cc39ea659aaf26a07ba0b8780b4c07 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 19 Sep 2004 19:40:52 +0000 Subject: [PATCH 0355/1469] CGI environment for online ASN.1 compilation git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@355 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 4 + Makefile.am | 7 +- Makefile.in | 20 +- README | 23 +- asn1c/Makefile.am | 2 +- asn1c/Makefile.in | 3 +- asn1c/tests/Makefile.in | 1 - asn1c/webcgi/Makefile.am | 4 + asn1c/webcgi/Makefile.in | 437 +++++++++++++++++++++++++++++++ asn1c/webcgi/README | 21 ++ asn1c/webcgi/asn1c-suid-helper.c | 87 ++++++ asn1c/webcgi/asn1c.cgi | 435 ++++++++++++++++++++++++++++++ configure | 67 +++-- configure.in | 6 +- doc/Makefile.in | 1 - examples/Makefile.in | 1 - libasn1compiler/Makefile.in | 1 - libasn1fix/Makefile.in | 1 - libasn1parser/Makefile.in | 3 +- libasn1print/Makefile.in | 1 - skeletons/Makefile.in | 1 - skeletons/tests/Makefile.in | 1 - tests/Makefile.in | 1 - 23 files changed, 1057 insertions(+), 71 deletions(-) create mode 100644 asn1c/webcgi/Makefile.am create mode 100644 asn1c/webcgi/Makefile.in create mode 100644 asn1c/webcgi/README create mode 100644 asn1c/webcgi/asn1c-suid-helper.c create mode 100755 asn1c/webcgi/asn1c.cgi diff --git a/ChangeLog b/ChangeLog index 5949abebe..d8a65bdca 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,8 @@ +0.9.6: 2004-Sep-19 + + * Added CGI for online ASN.1 compilation (asn1c/webcgi). + 0.9.5: 2004-Sep-17 * Fixed CER (common BER) decoder code. See check-25.c/VisibleString diff --git a/Makefile.am b/Makefile.am index 2b6d1e95d..6d02a8185 100644 --- a/Makefile.am +++ b/Makefile.am @@ -5,8 +5,9 @@ SUBDIRS = \ skeletons examples tests \ doc asn1c -EXTRA_DIST = BUGS MANIFEST - docsdir = $(datadir)/doc/asn1c -docs_DATA = INSTALL README FAQ BUGS TODO +docs_DATA = README FAQ COPYING ChangeLog BUGS TODO + +EXTRA_DIST = asn1c.spec.in FAQ BUGS MANIFEST +CLEANFILES = asn1c.spec diff --git a/Makefile.in b/Makefile.in index ce718abde..98cf233b4 100644 --- a/Makefile.in +++ b/Makefile.in @@ -36,10 +36,10 @@ PRE_UNINSTALL = : POST_UNINSTALL = : host_triplet = @host@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(srcdir)/config.h.in \ - $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ - TODO config.guess config.sub depcomp install-sh ltconfig \ - ltmain.sh missing mkinstalldirs + $(srcdir)/Makefile.in $(srcdir)/asn1c.spec.in \ + $(srcdir)/config.h.in $(top_srcdir)/configure AUTHORS COPYING \ + ChangeLog INSTALL NEWS TODO config.guess config.sub depcomp \ + install-sh ltconfig ltmain.sh missing mkinstalldirs subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in @@ -49,7 +49,7 @@ am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno configure.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h -CONFIG_CLEAN_FILES = +CONFIG_CLEAN_FILES = asn1c.spec SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ @@ -132,7 +132,6 @@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH = @PATH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ @@ -191,9 +190,10 @@ SUBDIRS = \ skeletons examples tests \ doc asn1c -EXTRA_DIST = BUGS MANIFEST docsdir = $(datadir)/doc/asn1c -docs_DATA = INSTALL README FAQ BUGS TODO +docs_DATA = README FAQ COPYING ChangeLog BUGS TODO +EXTRA_DIST = asn1c.spec.in FAQ BUGS MANIFEST +CLEANFILES = asn1c.spec all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive @@ -248,6 +248,8 @@ $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) distclean-hdr: -rm -f config.h stamp-h1 +asn1c.spec: $(top_builddir)/config.status $(srcdir)/asn1c.spec.in + cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo @@ -399,6 +401,7 @@ distclean-tags: distdir: $(DISTFILES) $(am__remove_distdir) mkdir $(distdir) + $(mkdir_p) $(distdir)/. @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ @@ -560,6 +563,7 @@ install-strip: mostlyclean-generic: clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -rm -f $(CONFIG_CLEAN_FILES) diff --git a/README b/README index 9face0775..be74c6ba7 100644 --- a/README +++ b/README @@ -1,12 +1,16 @@ WHAT TO READ? ============= -For quick installation tips read INSTALL. +If you haven't installed the asn1c yet, read the INSTALL file for +a short installation guide. For the list of asn1c command line options, see `asn1c -h` or `man asn1c`. For more complete documentation on this compiler and on using the -results of compilation please look into ./doc directory. +results of compilation phase, please look into asn1c-usage.{pdf,html}. +If you are building the compiler from the sources, these documents reside +in the ./doc directory, otherwise they lie nearby the README file you're +reading right now. Please also read the FAQ file. @@ -19,18 +23,19 @@ QUICK START After building [and installing] the compiler (see INSTALL), you may use the asn1c command to compile the ASN.1 specification: - asn1c + asn1c # Compile module If several specifications contain interdependencies, all of them must be specified: - asn1c ... + asn1c ... # Compile interdependent modules -The ./examples directory contains several ASN.1 modules and a script to -extract ASN.1 modules from RFC documents. Refer to the README file in that -directory. To compile X.509 PKI module: +If you are building the asn1c from the sources, the ./examples directory +contains several ASN.1 modules and a script to extract the ASN.1 modules +from RFC documents. Refer to the README file in that directory. +To compile the X.509 PKI module: - ./asn1c/asn1c -P ./examples/rfc3280-*.asn1 + ./asn1c/asn1c -P ./examples/rfc3280-*.asn1 # Compile-n-print In this example, -P option is used to instruct the compiler to print the compiled text on the standard output instead of creating multiple .c @@ -44,7 +49,7 @@ to dump out the parsed (and fixed) ASN.1 specification as it was whether a particular syntactic construction is properly supported by the compiler. - asn1c -EF + asn1c -EF # Check semantic validity MODEL OF OPERATION diff --git a/asn1c/Makefile.am b/asn1c/Makefile.am index 21da616d3..63bb31c27 100644 --- a/asn1c/Makefile.am +++ b/asn1c/Makefile.am @@ -1,5 +1,5 @@ -SUBDIRS = . tests +SUBDIRS = . tests webcgi AM_CFLAGS = @ADD_CFLAGS@ AM_CPPFLAGS = \ diff --git a/asn1c/Makefile.in b/asn1c/Makefile.in index 44d20fd16..431b38abf 100644 --- a/asn1c/Makefile.in +++ b/asn1c/Makefile.in @@ -143,7 +143,6 @@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH = @PATH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ @@ -196,7 +195,7 @@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ -SUBDIRS = . tests +SUBDIRS = . tests webcgi AM_CFLAGS = @ADD_CFLAGS@ AM_CPPFLAGS = \ -I${top_srcdir}/libasn1compiler \ diff --git a/asn1c/tests/Makefile.in b/asn1c/tests/Makefile.in index 2105fb9eb..e4b6b3b11 100644 --- a/asn1c/tests/Makefile.in +++ b/asn1c/tests/Makefile.in @@ -103,7 +103,6 @@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH = @PATH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ diff --git a/asn1c/webcgi/Makefile.am b/asn1c/webcgi/Makefile.am new file mode 100644 index 000000000..332d2c5c4 --- /dev/null +++ b/asn1c/webcgi/Makefile.am @@ -0,0 +1,4 @@ + +noinst_SCRIPTS = asn1c.cgi +noinst_PROGRAMS = asn1c-suid-helper + diff --git a/asn1c/webcgi/Makefile.in b/asn1c/webcgi/Makefile.in new file mode 100644 index 000000000..8b83b04ca --- /dev/null +++ b/asn1c/webcgi/Makefile.in @@ -0,0 +1,437 @@ +# Makefile.in generated by automake 1.8.4 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +SOURCES = asn1c-suid-helper.c + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +noinst_PROGRAMS = asn1c-suid-helper$(EXEEXT) +subdir = asn1c/webcgi +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +PROGRAMS = $(noinst_PROGRAMS) +asn1c_suid_helper_SOURCES = asn1c-suid-helper.c +asn1c_suid_helper_OBJECTS = asn1c-suid-helper.$(OBJEXT) +asn1c_suid_helper_LDADD = $(LDADD) +SCRIPTS = $(noinst_SCRIPTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/asn1c-suid-helper.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = asn1c-suid-helper.c +DIST_SOURCES = asn1c-suid-helper.c +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ADD_CFLAGS = @ADD_CFLAGS@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ +CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ +CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +noinst_SCRIPTS = asn1c.cgi +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu asn1c/webcgi/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu asn1c/webcgi/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +asn1c-suid-helper$(EXEEXT): $(asn1c_suid_helper_OBJECTS) $(asn1c_suid_helper_DEPENDENCIES) + @rm -f asn1c-suid-helper$(EXEEXT) + $(LINK) $(asn1c_suid_helper_LDFLAGS) $(asn1c_suid_helper_OBJECTS) $(asn1c_suid_helper_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c-suid-helper.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -z "$$unique" && unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(SCRIPTS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/asn1c/webcgi/README b/asn1c/webcgi/README new file mode 100644 index 000000000..063b0fc3e --- /dev/null +++ b/asn1c/webcgi/README @@ -0,0 +1,21 @@ + +This is the source of the CGI-based Web wrapper around asn1c compiler. + +To install, execute the following steps in this directory + + CGIDIR=/path/where/webserver/CGIs/are/stored + make # Ensure the binary files are built + cp asn1c.cgi asn1c-suid-helper $CGIDIR + chmod 4555 $CGIDIR/asn1c-suid-helper + chown root $CGIDIR/asn1c-suid-helper + # edit the $CGIDIR/asn1c.cgi to set up a few preferences + # in the beginning of that Perl script. + +The chmod command makes the asn1c-suid-helper program setuid. +The asn1c-suid-helper is a tiny wrapper (look in the asn1c-suid-helper.c), +which has the single purpose of running the asn1c compiler under extremely +strict environment. +The root uid and 4555 mode actually _raise_ security of the whole ASN.1 CGI +system, so don't worry. +If you're still uncertain, just go read the source code, it's only a page long. + diff --git a/asn1c/webcgi/asn1c-suid-helper.c b/asn1c/webcgi/asn1c-suid-helper.c new file mode 100644 index 000000000..64390981b --- /dev/null +++ b/asn1c/webcgi/asn1c-suid-helper.c @@ -0,0 +1,87 @@ +#include +#include +#include +#include +#include +#include +#include + +/* + * This program chroots into a given directory, + * then executes the asn1c command with strict arguments checking. + */ +int +main(int ac, char **av) { + char **argv; + char *envp[] = { NULL }; /* Empty environment */ + int ret; + int i; + + if(ac < 3) { + setgid(getgid()); + setuid(getuid()); + fprintf(stderr, + "Usage: %s [options]\n", av[0]); + exit(EX_USAGE); + } + + ret = chroot(av[1]); + + /* Drop the privileges */ + setgid(getgid()); + setuid(getuid()); + + if(ret != 0) { + fprintf(stderr, "chroot(\"%s\") failed: %s\n", + av[1], strerror(errno)); + exit(EX_OSERR); + } + + if(chdir(av[2]) != 0) { + fprintf(stderr, "chdir(\"%s\") failed: %s\n", + av[2], strerror(errno)); + exit(EX_OSERR); + } + + if(ac > 64) { + fprintf(stderr, "Insecure number of arguments: %d\n", ac); + exit(EX_DATAERR); + } + + argv = calloc(ac + 1, sizeof(*argv)); + if(argv) { + argv[0] = "asn1c"; + argv[1] = "-S/skeletons"; + memcpy(argv + 2, av + 3, (ac - 3) * sizeof(*argv)); + } else { + perror("malloc()"); + exit(EX_OSERR); + } + + /* + * Check arguments for the permitted alphabet constraints. + */ + for(i = 3; i < ac; i++) { + char *p; + for(p = av[i];; p++) { + switch(*p) { + case '0' ... '9': case 'A' ... 'Z': case 'a' ... 'z': + case '.': case '_': case '-': case '=': + continue; + case '\0': + default: + break; + } + break; + } + if(*p || (p - av[i]) > 250) { + fprintf(stderr, "Insecure argument %d\n", i); + exit(EX_DATAERR); + } + } + + execve("/bin/asn1c", argv, envp); + + exit(EX_UNAVAILABLE); +} + diff --git a/asn1c/webcgi/asn1c.cgi b/asn1c/webcgi/asn1c.cgi new file mode 100755 index 000000000..68ab225c4 --- /dev/null +++ b/asn1c/webcgi/asn1c.cgi @@ -0,0 +1,435 @@ +#!/usr/bin/perl -w +# +# $Id$ +# + +############################################################################ +# The following preferences may be modified to match the local environment # +############################################################################ + +# Directory with the users data. +$TMPDIR = '/tmp/asn1c-cgi-jail/'; +$SUIDHelper = './asn1c-suid-helper'; +$SkeletonsDir = '/usr/local/share/asn1c'; # Will be needed only once +$MD5ProgramPath = 'md5'; + +$warn = '
    '; +$unwarn = '
    '; + +$OpEnvFailed = 'Failed to create the operations\' environment:'; +$RandFailed = 'No source of randomness'; +$SandBoxInitFailed = 'User playground initialization failed'; + +$myName = $ENV{SCRIPT_NAME}; # URL of this particular script (without args) + +$homePath = "" + . "
    Home" + . " >> asn1c" + . " >> Online ASN.1 Compiler" + . "

    "; + +################################################### +# The code below rarely requires any modification # +################################################### + +my $content = ''; # Default content is empty + +use CGI qw/param cookie header upload escapeHTML/; + +$|=1; # Enable AutoFlush (for older versions of Perl) + +# If something goes wrong, this function is invoked to display the error message +sub bark($@) { + local $_ = join("
    \n", @_); + $content = $warn . $_ . $unwarn; + goto PRINTOUT; +} + +# Make the directory name containing session files for the given Session ID +sub makeSessionDirName($$) { + local $pfx = shift; # Prefix is the name of the top-level directory + local $sid = shift; # Session identifier (md5) + $pfx . '/sessions/' . $sid . '/'; +} + +# Create ISO 8601 time string: "YYYY-MM-DDThh:mm:ss" +my $cachedTime; +sub isoTime() { + return $cachedTime if $cachedTime; + local @tm = localtime(time); + + $tm[5] += 1900; + $tm[4] += 1; + + # Insert leading zeros + for(my $i = 0; $i < 5; $i++) { + $tm[$i] =~ s/^(.)$/0$1/; + } + + $cachedTime = "$tm[5]-$tm[4]-$tm[3]T$tm[2]:$tm[1]:$tm[0]"; +} + +# Create the necessary environment for chrooting into. +sub prepareChrootEnvironment() { + return 1 if(-d $TMPDIR); # Envuronment already exists + mkdir $TMPDIR or bark($OpEnvFailed, $!); # Global directory + mkdir $TMPDIR . 'sessions' or bark($OpEnvFailed, $!); # User sessions + mkdir $TMPDIR . 'bin' or bark($OpEnvFailed, $!); # asn1c location + mkdir $TMPDIR . 'skeletons' or bark($OpEnvFailed, $!); # asn1c data + my $compiler_location = `cd / && which asn1c 2>/dev/null` + or bark($OpEnvFailed, $!); # copy asn1c in + $compiler_location =~ s/[^\/a-z1-9.-]//ig; + bark($OpEnvFailed, $!) unless($compiler_location =~ /^\//); + if(-d '/lib') { + # Merge in dynamic libc + mkdir $TMPDIR . 'lib' or bark($OpEnvFailed, $!); + system("cd $TMPDIR/lib && " + . "for i in" + . " /lib/libc.*" + . " /lib/libm.*" + . 'do ln $i; done'); + } elsif(-d '/usr/lib') { + # There's no /lib on MacOS + mkdir $TMPDIR . 'usr' or bark($OpEnvFailed, $!); + mkdir $TMPDIR . 'usr/lib' or bark($OpEnvFailed, $!); + mkdir $TMPDIR . 'usr/lib/system' or bark($OpEnvFailed, $!); + system("cd $TMPDIR/usr/lib && " + . "for i in" + . " /usr/lib/libc.*" + . " /usr/lib/libSystem.*" + . " /usr/lib/system/libmath*" + . " /usr/lib/dy*" + . '; do ln $i; done'); + } + system("cp $compiler_location $TMPDIR/bin 2>/dev/null") == 0 + or bark($OpEnvFailed, $!); + system("cp -r $SkeletonsDir/* $TMPDIR/skeletons >/dev/null 2>&1") == 0 + or bark($OpEnvFailed, $!); + return 1; +} + +my $EnvironmentSetOK = prepareChrootEnvironment(); + +# +# Prepare the session and create the session directory. +# If session exists, perfom arguments checking and execute historic views. +# +$session = cookie('SessionID'); +unless($session) { + $session = ''; + open(R, '/dev/urandom') + or open(R, '/dev/random') + or bark($RandFailed); + read(R, $session, 16) == 16 or bark("Not enough randomness"); + if($ENV{HTTP_USER_AGENT}) { + $session .= $ENV{HTTP_USER_AGENT}; # Add randomness + } + my $pid = open(R, "-|"); + if($pid == 0) { # Child + open(W, "| $MD5ProgramPath") or die; + print W $session; + exit(0); + } + $session = ; + $session =~ s/[^a-f0-9]//ig; + bark("md5 program is rotten here") if(length($session) != 32); + $sessionDir = makeSessionDirName($TMPDIR, $session); + mkdir($sessionDir) or bark($SandBoxInitFailed); + my $ck = cookie(-name=>'SessionID', -value=>$session, -expires=>'+1y'); + print header(-cookie=>$ck); +} else { + $session =~ s/[^a-f0-9]//ig; + bark("Nope, try again") if(length($session) != 32); # cool hacker? + + # Make sure the session directory exists + $sessionDir = makeSessionDirName($TMPDIR, $session); + mkdir($sessionDir) or bark($SandBoxInitFailed) unless(-d $sessionDir); + + local $t = param('time'); + local $trans = param('trans'); + local $fetch = param('fetch'); + local $show = param('show'); + + unless($t =~ /^[0-9TZ:+-]{14,}$/ && $trans =~ /^[.a-z0-9_-]+$/i) { + $fetch = ''; + $show = ''; + } + if($fetch =~ /^[.a-z0-9_-]+$/i || $show =~ /^(log|tgz)$/) { + local $fname = $sessionDir . '/' . $t . '--' . $trans; + + if($show eq 'tgz') { + printf("Content-Type: application/x-tar\n"); + printf("Content-Encoding: gzip\n\n"); + exec("cd $fname && " + . "for i in *.[ch]; do if [ -L \$i ]; then" + . " cp $TMPDIR/skeletons/\$i \$i.-;" + . " mv \$i.- \$i;" + . " fi done && tar --dereference --owner nobody --group nobody -zcvf - ./*.[ch] ./Makefile*"); + exit(0); + } + + if($show eq 'log') { + $fname .= '/+Log'; + } else { + $fname .= '/' . $fetch; + } + open(I, "< " . $fname) + or bark("Invalid or outdated request: [$fname] [$show] $!"); + printf "Content-Type: text/plain\n\n"; + while() { + print; + } + exit(0); + } + + print header(); +} +$HTTPHeaderGenerated = 1; + +open(LOG, ">> $sessionDir/+logfile") or bark("Sandbox error: $!"); +print LOG isoTime() . "\tIP=$ENV{REMOTE_ADDR}"; + +@gotSafeNames = (); +@gotNames = param('file'); +if($#gotNames != -1 && $gotNames[0] ne "") { + @gotFiles = upload('file'); +} else { + @gotNames = (); + @gotFiles = (); +} + +if($#gotNames == -1) { + my $text = param('text'); + if($text) { + push(@gotNames, 'module.asn1'); + } +} + +# Make safe filenames +foreach my $fname (@gotNames) { + local $_ = $fname; + s/.*\///g; # Strip directory components + s/.*\\//g; # Strip directory components (DOS version) + s/^[.-]/_/g; # Don't allow filenames starting with a dot or a dash + s/[^._a-z0-9-]/_/gi; + if(!length($_)) { + print LOG "\n"; + bark("Too strange filename: \"$fname\""); + } + $_ .= '.asn1' unless(/asn[1]{0,1}$/i); + @gotSafeNames = (@gotSafeNames, $_); + print LOG "\t" . $_; +} + +# +# Save the files and start compilation process. +# +if($#gotSafeNames >= 0) { + $transactionDir = isoTime() . '--' . join("-", @gotSafeNames); + print LOG "\tDST=$transactionDir"; + + my $sandbox = $sessionDir . '/' . $transactionDir; + mkdir($sandbox) or bark($SandBoxInitFailed); + + open(I, '> ' . $sandbox . '/+Names'); + print I join("\n", @gotNames); + open(I, '> ' . $sandbox . '/+safeNames'); + print I join("\n", @gotSafeNames); + for(my $i = 0; $i <= $#gotSafeNames; $i++) { + local $name = $gotSafeNames[$i]; + open(I, '> ' . $sandbox . '/'. $name); + if($#gotFiles == -1) { + print I scalar(param('text')); + } else { + while(<$gotFiles[$I]>) { + print I; + } + } + } + + my $inChDir = makeSessionDirName("/", $session) . $transactionDir; + my $options = ''; + $options .= " -Wdebug-lexer" if(param("optDebugL") eq "on"); + $options .= " -E" if(param("optE") eq "on"); + $options .= " -EF" if(param("optEF") eq "on"); + $options .= " -fnative-types" if(param("optNT") eq "on"); + system("$TMPDIR/bin/asn1c -v 2>&1 | sed -e 's/^/-- /' > $sandbox/\+Log && $SUIDHelper $TMPDIR $inChDir $options @gotSafeNames >> $sandbox/+Log 2>&1; " + . "echo \$? > $sandbox/+ExitCode"); + bark("Failed to initiate compilation process: $!") + if(!-r $sandbox . '/+ExitCode'); +} + +#print join("
    \n", `env`); + +$form = + "

    " +. "Pick the ASN.1 module file:
    \n" +. "
    \n" +. "Alternatively, enter the ASN.1 specification into the area below:
    \n" +. "
    \n" +. "

    " +. "" +. "These options may be enabled to control the compiler's behavior:
    \n" +. " Debug lexer (-Wdebug-lexer)
    \n" +. " Just parse and dump (do not compile) (-E)
    \n" +. " Parse, perform semantic checks, and dump (-E -F)
    \n" +. " Employ native machine types (e.g. double instead of REAL_t) (-fnative-types)
    \n" +. "
    " +. "

    \n" +. "\n" +. "

    \n"; +; + +# +# Gather previous transactions to generate the history page. +# The history page contains a list of several last ASN.1 files +# which were uploaded for compilation into the system +# by this particular browser (cookie-tracked). +# +opendir(SD, $sessionDir) or bark("Cannot open sandbox: $!"); +my @transactions = readdir(SD); +my $CountHistoryItems = 0; +foreach my $trans (sort { $b <=> $a } @transactions) { + next unless($trans =~ /^([0-9TZ:+-]{14,})--([_.a-zA-Z0-9-]+)$/); + + local ($t, $f) = ($1, $2); + local $origTime = $t; + $t =~ s/T/ /; # 1999-01-02T13:53:12 => 1999-01-02 13:53:12 + + # Open the list of file names under which these files are known + # at the remote system. + open(I, '< ' . $sessionDir . '/' . $trans . '/+Names'); + local @Names = ; + + # Open the list of "safe" file names under which these files + # are known to our file system. + open(I, '< ' . $sessionDir . '/' . $trans . '/+safeNames'); + local @safeNames = ; + + # Create a list of real file names whith appropriate links to the + # "safe" file names for subsequent file fetching. + local @markedNames = (); + for(my $i = 0; $i <= $#Names; $i++) { + local $_ = "$Names[$i]"; + @markedNames = (@markedNames, $_); + } + + open(I, '< ' . $sessionDir . '/' . $trans . '/+ExitCode'); + local $ec = int(); + + if($ec == 0) { + $results = "" + . "Compiled OK
    \n"; + } else { + $results = "" + . "Error during compilation: $ec
    \n"; + } + + $results .= "" + . (($ec == 0) ? '1. ' : '') + . "" + . "Show compiler log"; + if($ec == 0) { + $results .= "
    \n" + . "2. " + . "Fetch results (.tgz)"; + } + + $history .= + "$t" + . "" + . join(", ", @markedNames) + . "" + . "" + . $results + . "" + . ""; + + last unless(++$CountHistoryItems < 5); +} +if($history) { + $history = "

    History

    " + . "
    " + . "\n" + . "" + . "" + . "" + . "" + . "\n" + . $history . "
    TimeFiles processedResult

    \n"; +} + +$content = + "
    \n" +. "

    ASN.1 Input

    \n" +. "$form\n" +. "
    \n$history" + . "Privacy Note 1: this page is tailored " + . "to your browser using a cryprographically strong cookie. " + . "Other users will see different data. " + . "However, the page is not secure against malicious users " + . "if they are able to intercept your non-SSL Web traffic." + . "
    Privacy Note 2: The author reserves the right to collect any information directly or indirectly supplied by the user of this system. This information may only be used by the author or contributors to enhance the software product. No data is ever given, sold, or otherwise distributed to the third-parties." + . "
    Privacy Note 3: In no event shall the author or contributors be liable for any damages, however caused, even if advised of the possibility of such damage." + . "
    " +. "
    "; + +$ua = $ENV{HTTP_USER_AGENT}; +$ua =~ s/\\/\\\\/; +$ua =~ s/"/\\"/; +print LOG "\tUA=\"$ua\""; +print LOG "\n"; # Finalize logging record + +PRINTOUT: + +print header() unless($HTTPHeaderGenerated); + +# If environment has never been set up completely, remove it. +if($EnvironmentSetOK != 1 && $TMPDIR ne "/") { + system("rm -rf $TMPDIR/ >/dev/null 2>&1"); +} + +print< + + +Online ASN.1 Compiler + + + +$homePath + +$content + +
    +
    +The ASN.1 Compiler + Copyright © 2003, 2004 +Lev Walkin <vlm@lionet.info> +
    + + +EOM diff --git a/configure b/configure index 41f15bd2b..6f313bbf9 100755 --- a/configure +++ b/configure @@ -463,7 +463,7 @@ ac_includes_default="\ # include #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO AMTAR install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot PATH MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CPP CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL CONFIGURE_DEPENDS CPLUSPLUS_FOUND_TRUE CPLUSPLUS_FOUND_FALSE YACC LEX LEXLIB LEX_OUTPUT_ROOT ADD_CFLAGS LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO AMTAR install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CPP CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL CONFIGURE_DEPENDS CPLUSPLUS_FOUND_TRUE CPLUSPLUS_FOUND_FALSE YACC LEX LEXLIB LEX_OUTPUT_ROOT ADD_CFLAGS LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.9.5 + VERSION=0.9.6 cat >>confdefs.h <<_ACEOF @@ -2008,8 +2008,6 @@ INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" - - echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. @@ -3693,7 +3691,7 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 3696 "configure"' > conftest.$ac_ext + echo '#line 3694 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -5265,7 +5263,7 @@ fi # Provide some information about the compiler. -echo "$as_me:5268:" \ +echo "$as_me:5266:" \ "checking for Fortran 77 compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 @@ -6299,11 +6297,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6302: $lt_compile\"" >&5) + (eval echo "\"\$as_me:6300: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:6306: \$? = $ac_status" >&5 + echo "$as_me:6304: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -6532,11 +6530,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6535: $lt_compile\"" >&5) + (eval echo "\"\$as_me:6533: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:6539: \$? = $ac_status" >&5 + echo "$as_me:6537: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -6592,11 +6590,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6595: $lt_compile\"" >&5) + (eval echo "\"\$as_me:6593: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:6599: \$? = $ac_status" >&5 + echo "$as_me:6597: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -8776,7 +8774,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&5) + (eval echo "\"\$as_me:11054: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:11060: \$? = $ac_status" >&5 + echo "$as_me:11058: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -11113,11 +11111,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:11116: $lt_compile\"" >&5) + (eval echo "\"\$as_me:11114: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:11120: \$? = $ac_status" >&5 + echo "$as_me:11118: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -12474,7 +12472,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&5) + (eval echo "\"\$as_me:13400: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:13406: \$? = $ac_status" >&5 + echo "$as_me:13404: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -13459,11 +13457,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:13462: $lt_compile\"" >&5) + (eval echo "\"\$as_me:13460: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:13466: \$? = $ac_status" >&5 + echo "$as_me:13464: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -15493,11 +15491,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15496: $lt_compile\"" >&5) + (eval echo "\"\$as_me:15494: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:15500: \$? = $ac_status" >&5 + echo "$as_me:15498: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -15726,11 +15724,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15729: $lt_compile\"" >&5) + (eval echo "\"\$as_me:15727: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:15733: \$? = $ac_status" >&5 + echo "$as_me:15731: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -15786,11 +15784,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15789: $lt_compile\"" >&5) + (eval echo "\"\$as_me:15787: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:15793: \$? = $ac_status" >&5 + echo "$as_me:15791: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -17970,7 +17968,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure @@ -23030,6 +23028,7 @@ do "libasn1compiler/Makefile" ) CONFIG_FILES="$CONFIG_FILES libasn1compiler/Makefile" ;; "libasn1parser/Makefile" ) CONFIG_FILES="$CONFIG_FILES libasn1parser/Makefile" ;; "libasn1print/Makefile" ) CONFIG_FILES="$CONFIG_FILES libasn1print/Makefile" ;; + "asn1c/webcgi/Makefile" ) CONFIG_FILES="$CONFIG_FILES asn1c/webcgi/Makefile" ;; "asn1c/tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES asn1c/tests/Makefile" ;; "libasn1fix/Makefile" ) CONFIG_FILES="$CONFIG_FILES libasn1fix/Makefile" ;; "skeletons/Makefile" ) CONFIG_FILES="$CONFIG_FILES skeletons/Makefile" ;; @@ -23037,6 +23036,7 @@ do "tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; "asn1c/Makefile" ) CONFIG_FILES="$CONFIG_FILES asn1c/Makefile" ;; "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "asn1c.spec" ) CONFIG_FILES="$CONFIG_FILES asn1c.spec" ;; "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; @@ -23157,7 +23157,6 @@ s,@mkdir_p@,$mkdir_p,;t t s,@AWK@,$AWK,;t t s,@SET_MAKE@,$SET_MAKE,;t t s,@am__leading_dot@,$am__leading_dot,;t t -s,@PATH@,$PATH,;t t s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t s,@MAINT@,$MAINT,;t t diff --git a/configure.in b/configure.in index c3cddb798..0c3e8dd34 100644 --- a/configure.in +++ b/configure.in @@ -3,9 +3,7 @@ AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_BUILD AC_CANONICAL_TARGET AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.9.5) - -AC_SUBST(PATH) +AM_INIT_AUTOMAKE(asn1c, 0.9.6) AM_MAINTAINER_MODE @@ -91,6 +89,7 @@ skeletons/tests/Makefile \ libasn1compiler/Makefile \ libasn1parser/Makefile \ libasn1print/Makefile \ +asn1c/webcgi/Makefile \ asn1c/tests/Makefile \ libasn1fix/Makefile \ skeletons/Makefile \ @@ -98,6 +97,7 @@ examples/Makefile \ tests/Makefile \ asn1c/Makefile \ doc/Makefile \ +asn1c.spec \ Makefile \ ) diff --git a/doc/Makefile.in b/doc/Makefile.in index c19ee0c79..7d105e259 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -107,7 +107,6 @@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH = @PATH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ diff --git a/examples/Makefile.in b/examples/Makefile.in index 72259e204..aea3168ba 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -108,7 +108,6 @@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH = @PATH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ diff --git a/libasn1compiler/Makefile.in b/libasn1compiler/Makefile.in index 73403835f..7eaf562d4 100644 --- a/libasn1compiler/Makefile.in +++ b/libasn1compiler/Makefile.in @@ -134,7 +134,6 @@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH = @PATH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ diff --git a/libasn1fix/Makefile.in b/libasn1fix/Makefile.in index 24a1b21fe..b44880955 100644 --- a/libasn1fix/Makefile.in +++ b/libasn1fix/Makefile.in @@ -153,7 +153,6 @@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH = @PATH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index ecc0c71a3..ef80e29b5 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -142,7 +142,6 @@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH = @PATH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ @@ -448,9 +447,9 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." - -rm -f asn1p_l.c -rm -f asn1p_y.c -rm -f asn1p_y.h + -rm -f asn1p_l.c clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ diff --git a/libasn1print/Makefile.in b/libasn1print/Makefile.in index 487d9dca0..86a6a6932 100644 --- a/libasn1print/Makefile.in +++ b/libasn1print/Makefile.in @@ -124,7 +124,6 @@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH = @PATH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ diff --git a/skeletons/Makefile.in b/skeletons/Makefile.in index 9216769ba..15a236b17 100644 --- a/skeletons/Makefile.in +++ b/skeletons/Makefile.in @@ -117,7 +117,6 @@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH = @PATH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ diff --git a/skeletons/tests/Makefile.in b/skeletons/tests/Makefile.in index af4156215..0587cec74 100644 --- a/skeletons/tests/Makefile.in +++ b/skeletons/tests/Makefile.in @@ -161,7 +161,6 @@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH = @PATH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ diff --git a/tests/Makefile.in b/tests/Makefile.in index 3e5a431a3..0cdc97ddb 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -103,7 +103,6 @@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH = @PATH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ From 9dcef28199eca06473c50d19675e324f33eb5895 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 19 Sep 2004 19:51:12 +0000 Subject: [PATCH 0356/1469] oops, .cgi weren't included into the distribution git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@356 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/webcgi/Makefile.am | 1 + asn1c/webcgi/Makefile.in | 1 + 2 files changed, 2 insertions(+) diff --git a/asn1c/webcgi/Makefile.am b/asn1c/webcgi/Makefile.am index 332d2c5c4..0f76e3cf8 100644 --- a/asn1c/webcgi/Makefile.am +++ b/asn1c/webcgi/Makefile.am @@ -2,3 +2,4 @@ noinst_SCRIPTS = asn1c.cgi noinst_PROGRAMS = asn1c-suid-helper +EXTRA_DIST = asn1c.cgi diff --git a/asn1c/webcgi/Makefile.in b/asn1c/webcgi/Makefile.in index 8b83b04ca..e1ae52391 100644 --- a/asn1c/webcgi/Makefile.in +++ b/asn1c/webcgi/Makefile.in @@ -180,6 +180,7 @@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ noinst_SCRIPTS = asn1c.cgi +EXTRA_DIST = asn1c.cgi all: all-am .SUFFIXES: From f4aed98b8ea04f107cfee92e36e25be8cd0cb4cd Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 19 Sep 2004 19:59:10 +0000 Subject: [PATCH 0357/1469] mkdir mode defaulted to 0750 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@357 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/webcgi/asn1c.cgi | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/asn1c/webcgi/asn1c.cgi b/asn1c/webcgi/asn1c.cgi index 68ab225c4..f596e64e0 100755 --- a/asn1c/webcgi/asn1c.cgi +++ b/asn1c/webcgi/asn1c.cgi @@ -12,6 +12,7 @@ $TMPDIR = '/tmp/asn1c-cgi-jail/'; $SUIDHelper = './asn1c-suid-helper'; $SkeletonsDir = '/usr/local/share/asn1c'; # Will be needed only once $MD5ProgramPath = 'md5'; +$DM = 0750; # Directory mode for all mkdirs. $warn = '
    '; $unwarn = '
    '; @@ -72,17 +73,17 @@ sub isoTime() { # Create the necessary environment for chrooting into. sub prepareChrootEnvironment() { return 1 if(-d $TMPDIR); # Envuronment already exists - mkdir $TMPDIR or bark($OpEnvFailed, $!); # Global directory - mkdir $TMPDIR . 'sessions' or bark($OpEnvFailed, $!); # User sessions - mkdir $TMPDIR . 'bin' or bark($OpEnvFailed, $!); # asn1c location - mkdir $TMPDIR . 'skeletons' or bark($OpEnvFailed, $!); # asn1c data + mkdir $TMPDIR, $DM, or bark($OpEnvFailed, $!); # Global directory + mkdir $TMPDIR . 'sessions', $DM or bark($OpEnvFailed, $!); # sessions + mkdir $TMPDIR . 'bin', $DM or bark($OpEnvFailed, $!); # asn1c location + mkdir $TMPDIR . 'skeletons', $DM or bark($OpEnvFailed, $!); # asn1c data my $compiler_location = `cd / && which asn1c 2>/dev/null` or bark($OpEnvFailed, $!); # copy asn1c in $compiler_location =~ s/[^\/a-z1-9.-]//ig; bark($OpEnvFailed, $!) unless($compiler_location =~ /^\//); if(-d '/lib') { # Merge in dynamic libc - mkdir $TMPDIR . 'lib' or bark($OpEnvFailed, $!); + mkdir $TMPDIR . 'lib', $DM or bark($OpEnvFailed, $!); system("cd $TMPDIR/lib && " . "for i in" . " /lib/libc.*" @@ -90,9 +91,9 @@ sub prepareChrootEnvironment() { . 'do ln $i; done'); } elsif(-d '/usr/lib') { # There's no /lib on MacOS - mkdir $TMPDIR . 'usr' or bark($OpEnvFailed, $!); - mkdir $TMPDIR . 'usr/lib' or bark($OpEnvFailed, $!); - mkdir $TMPDIR . 'usr/lib/system' or bark($OpEnvFailed, $!); + mkdir $TMPDIR . 'usr', $DM or bark($OpEnvFailed, $!); + mkdir $TMPDIR . 'usr/lib', $DM or bark($OpEnvFailed, $!); + mkdir $TMPDIR . 'usr/lib/system', $DM or bark($OpEnvFailed, $!); system("cd $TMPDIR/usr/lib && " . "for i in" . " /usr/lib/libc.*" @@ -134,7 +135,7 @@ unless($session) { $session =~ s/[^a-f0-9]//ig; bark("md5 program is rotten here") if(length($session) != 32); $sessionDir = makeSessionDirName($TMPDIR, $session); - mkdir($sessionDir) or bark($SandBoxInitFailed); + mkdir($sessionDir, $DM) or bark($SandBoxInitFailed); my $ck = cookie(-name=>'SessionID', -value=>$session, -expires=>'+1y'); print header(-cookie=>$ck); } else { @@ -143,7 +144,8 @@ unless($session) { # Make sure the session directory exists $sessionDir = makeSessionDirName($TMPDIR, $session); - mkdir($sessionDir) or bark($SandBoxInitFailed) unless(-d $sessionDir); + mkdir($sessionDir, $DM) or bark($SandBoxInitFailed) + unless(-d $sessionDir); local $t = param('time'); local $trans = param('trans'); @@ -229,7 +231,7 @@ if($#gotSafeNames >= 0) { print LOG "\tDST=$transactionDir"; my $sandbox = $sessionDir . '/' . $transactionDir; - mkdir($sandbox) or bark($SandBoxInitFailed); + mkdir($sandbox, $DM) or bark($SandBoxInitFailed); open(I, '> ' . $sandbox . '/+Names'); print I join("\n", @gotNames); From 9c9edbee99759ee9d098c53e42eb8728221cddde Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 19 Sep 2004 20:10:59 +0000 Subject: [PATCH 0358/1469] improved to match local conditions git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@358 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/webcgi/asn1c.cgi | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/asn1c/webcgi/asn1c.cgi b/asn1c/webcgi/asn1c.cgi index f596e64e0..b5b01725d 100755 --- a/asn1c/webcgi/asn1c.cgi +++ b/asn1c/webcgi/asn1c.cgi @@ -11,6 +11,7 @@ $TMPDIR = '/tmp/asn1c-cgi-jail/'; $SUIDHelper = './asn1c-suid-helper'; $SkeletonsDir = '/usr/local/share/asn1c'; # Will be needed only once +$CompilerLocation = '/usr/local/bin/asn1c'; # asn1c binary location $MD5ProgramPath = 'md5'; $DM = 0750; # Directory mode for all mkdirs. @@ -77,10 +78,6 @@ sub prepareChrootEnvironment() { mkdir $TMPDIR . 'sessions', $DM or bark($OpEnvFailed, $!); # sessions mkdir $TMPDIR . 'bin', $DM or bark($OpEnvFailed, $!); # asn1c location mkdir $TMPDIR . 'skeletons', $DM or bark($OpEnvFailed, $!); # asn1c data - my $compiler_location = `cd / && which asn1c 2>/dev/null` - or bark($OpEnvFailed, $!); # copy asn1c in - $compiler_location =~ s/[^\/a-z1-9.-]//ig; - bark($OpEnvFailed, $!) unless($compiler_location =~ /^\//); if(-d '/lib') { # Merge in dynamic libc mkdir $TMPDIR . 'lib', $DM or bark($OpEnvFailed, $!); @@ -102,7 +99,7 @@ sub prepareChrootEnvironment() { . " /usr/lib/dy*" . '; do ln $i; done'); } - system("cp $compiler_location $TMPDIR/bin 2>/dev/null") == 0 + system("cp $CompilerLocation $TMPDIR/bin 2>/dev/null") == 0 or bark($OpEnvFailed, $!); system("cp -r $SkeletonsDir/* $TMPDIR/skeletons >/dev/null 2>&1") == 0 or bark($OpEnvFailed, $!); @@ -137,7 +134,8 @@ unless($session) { $sessionDir = makeSessionDirName($TMPDIR, $session); mkdir($sessionDir, $DM) or bark($SandBoxInitFailed); my $ck = cookie(-name=>'SessionID', -value=>$session, -expires=>'+1y'); - print header(-cookie=>$ck); + print header(-expires=>'-1y', -cookie=>$ck); + $HTTPHeaderGenerated = 1; } else { $session =~ s/[^a-f0-9]//ig; bark("Nope, try again") if(length($session) != 32); # cool hacker? @@ -183,10 +181,7 @@ unless($session) { } exit(0); } - - print header(); } -$HTTPHeaderGenerated = 1; open(LOG, ">> $sessionDir/+logfile") or bark("Sandbox error: $!"); print LOG isoTime() . "\tIP=$ENV{REMOTE_ADDR}"; @@ -407,7 +402,7 @@ print LOG "\n"; # Finalize logging record PRINTOUT: -print header() unless($HTTPHeaderGenerated); +print header(-expires=>'-1y') unless($HTTPHeaderGenerated); # If environment has never been set up completely, remove it. if($EnvironmentSetOK != 1 && $TMPDIR ne "/") { From 70af7e48cb04bbd7678a6c8ca5cb618969a59f96 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 22 Sep 2004 03:33:29 +0000 Subject: [PATCH 0359/1469] portability fixes git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@359 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/webcgi/asn1c.cgi | 50 +++++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/asn1c/webcgi/asn1c.cgi b/asn1c/webcgi/asn1c.cgi index b5b01725d..0a03fe35f 100755 --- a/asn1c/webcgi/asn1c.cgi +++ b/asn1c/webcgi/asn1c.cgi @@ -83,9 +83,10 @@ sub prepareChrootEnvironment() { mkdir $TMPDIR . 'lib', $DM or bark($OpEnvFailed, $!); system("cd $TMPDIR/lib && " . "for i in" - . " /lib/libc.*" - . " /lib/libm.*" - . 'do ln $i; done'); + . " /lib/ld-linux.*" # Linux ELF loader + . " /lib/libc.*" # Standard C library + . " /lib/libm.*" # Math library + . '; do ln $i; done'); } elsif(-d '/usr/lib') { # There's no /lib on MacOS mkdir $TMPDIR . 'usr', $DM or bark($OpEnvFailed, $!); @@ -99,6 +100,13 @@ sub prepareChrootEnvironment() { . " /usr/lib/dy*" . '; do ln $i; done'); } + if(-d '/usr/libexec') { + # FreeBSD ELF loader + mkdir $TMPDIR . 'usr', $DM; + mkdir $TMPDIR . 'usr/libexec',$DM or bark($OpEnvFailed, $!); + system("cd $TMPDIR/usr/libexec && " + . 'for i in /usr/libexec/ld-elf.*; do ln $i; done'); + } system("cp $CompilerLocation $TMPDIR/bin 2>/dev/null") == 0 or bark($OpEnvFailed, $!); system("cp -r $SkeletonsDir/* $TMPDIR/skeletons >/dev/null 2>&1") == 0 @@ -242,6 +250,7 @@ if($#gotSafeNames >= 0) { print I; } } + close(I); } my $inChDir = makeSessionDirName("/", $session) . $transactionDir; @@ -250,8 +259,12 @@ if($#gotSafeNames >= 0) { $options .= " -E" if(param("optE") eq "on"); $options .= " -EF" if(param("optEF") eq "on"); $options .= " -fnative-types" if(param("optNT") eq "on"); - system("$TMPDIR/bin/asn1c -v 2>&1 | sed -e 's/^/-- /' > $sandbox/\+Log && $SUIDHelper $TMPDIR $inChDir $options @gotSafeNames >> $sandbox/+Log 2>&1; " - . "echo \$? > $sandbox/+ExitCode"); + my $CompileASN = "$TMPDIR/bin/asn1c -v | sed -e 's/^/-- /'" + . " > $sandbox/+Log 2>&1" + . "; $SUIDHelper $TMPDIR $inChDir $options @gotSafeNames " + . " >> $sandbox/+Log 2>&1" + . "; echo \$? > $sandbox/+ExitCode"; + system($CompileASN); bark("Failed to initiate compilation process: $!") if(!-r $sandbox . '/+ExitCode'); } @@ -298,15 +311,20 @@ $form = # by this particular browser (cookie-tracked). # opendir(SD, $sessionDir) or bark("Cannot open sandbox: $!"); -my @transactions = readdir(SD); +my @transactions = sort { $b cmp $a } + (grep {/^[0-9TZ:+-]{14,}--[_.a-zA-Z0-9-]+$/} + readdir(SD)); my $CountHistoryItems = 0; -foreach my $trans (sort { $b <=> $a } @transactions) { +foreach my $trans (sort { $b cmp $a } @transactions) { next unless($trans =~ /^([0-9TZ:+-]{14,})--([_.a-zA-Z0-9-]+)$/); local ($t, $f) = ($1, $2); local $origTime = $t; $t =~ s/T/ /; # 1999-01-02T13:53:12 => 1999-01-02 13:53:12 + # Global transaction number + local $tNum = 1 + $#transactions - $CountHistoryItems; + # Open the list of file names under which these files are known # at the remote system. open(I, '< ' . $sessionDir . '/' . $trans . '/+Names'); @@ -329,9 +347,11 @@ foreach my $trans (sort { $b <=> $a } @transactions) { } open(I, '< ' . $sessionDir . '/' . $trans . '/+ExitCode'); - local $ec = int(); + local $ec = ; + + chop($ec); - if($ec == 0) { + if($ec eq "0") { $results = "" . "Compiled OK
    \n"; } else { @@ -340,13 +360,13 @@ foreach my $trans (sort { $b <=> $a } @transactions) { } $results .= "" - . (($ec == 0) ? '1. ' : '') + . (($ec eq "0") ? '1. ' : '') . "" . "Show compiler log"; - if($ec == 0) { + if($ec eq "0") { $results .= "
    \n" . "2. $a } @transactions) { . "Fetch results (.tgz)"; } - $history .= - "$t" + $history .= "" + . "$tNum" . "" . join(", ", @markedNames) . "" @@ -372,14 +392,14 @@ if($history) { . "
    " . "\n" . "" - . "" + . "" . "" . "" . "\n" . $history . "
    TimeNFiles processedResult

    \n"; } -$content = +$content .= "" - . "" - . "" + . "" - . "" + . "" - . "\n"; - - last if(++$CountHistoryItems >= $MaxHistoryItems - && $HistoryShow ne 'full'); + . "" + ; } if($DynamicHistory eq 'yes') { # [Un-]limit number of history items - $HistoryItemsHidden = 1 + $#transactions - $CountHistoryItems; + $HistoryItemsHidden = $CountHistoryItems - $CountShownItems; if($HistoryItemsHidden > 0) { # Propose to expand the list. - local $item = 'item'; + my $item = 'item'; $HistoryItemsHidden == 1 or $item = 'items'; $history .= "\n"; + . "\n"; } elsif($HistoryShow eq "full" && $#transactions >= $MaxHistoryItems) { # Propose to shorten the list. - local $item = 'item'; + my $item = 'item'; $MaxHistoryItems == 1 or $item = 'items'; $history .= "\n"; + . "\n"; } } if($history) { $history = "

    History

    " - . "
    \n" . "

    ASN.1 Input

    \n" . "$form\n" From 39e4e6cdeb6c820c2be72a7546d31c99a0cc66f5 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 22 Sep 2004 03:33:56 +0000 Subject: [PATCH 0360/1469] added web group and 4550 instead of 4555 mode git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@360 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/webcgi/README | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/asn1c/webcgi/README b/asn1c/webcgi/README index 063b0fc3e..9bee03fbc 100644 --- a/asn1c/webcgi/README +++ b/asn1c/webcgi/README @@ -6,8 +6,9 @@ To install, execute the following steps in this directory CGIDIR=/path/where/webserver/CGIs/are/stored make # Ensure the binary files are built cp asn1c.cgi asn1c-suid-helper $CGIDIR - chmod 4555 $CGIDIR/asn1c-suid-helper + chgrp www $CGIDIR/asn1c-suid-helper # Or whatever Web server has chown root $CGIDIR/asn1c-suid-helper + chmod 4550 $CGIDIR/asn1c-suid-helper # Make it setuid # edit the $CGIDIR/asn1c.cgi to set up a few preferences # in the beginning of that Perl script. From 922589801b7aac43149a3b771fd8578b8239d55f Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 22 Sep 2004 16:02:03 +0000 Subject: [PATCH 0361/1469] added asn_internal.h git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@361 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_save.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c index add70e175..2db1c2ef8 100644 --- a/libasn1compiler/asn1c_save.c +++ b/libasn1compiler/asn1c_save.c @@ -200,6 +200,7 @@ asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *deps) { "#endif\t/* _%s_H_ */\n", header_id); + fprintf(fp_c, "#include \n\n"); fprintf(fp_c, "#include <%s.h>\n\n", expr->Identifier); /* Myself */ TQ_FOR(ot, &(cs->destination[OT_CTABLES].chunks), next) fwrite(ot->buf, ot->len, 1, fp_c); From 04f75f22d791c877ec086252675363c4a5160fb3 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 22 Sep 2004 16:03:19 +0000 Subject: [PATCH 0362/1469] explicit module is not necessary git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@362 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_export.c | 6 ++---- libasn1fix/asn1fix_export.h | 3 +-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/libasn1fix/asn1fix_export.c b/libasn1fix/asn1fix_export.c index 3a18ece0e..d6866fda3 100644 --- a/libasn1fix/asn1fix_export.c +++ b/libasn1fix/asn1fix_export.c @@ -43,15 +43,13 @@ asn1f_class_access_ex(asn1p_t *asn, } asn1p_expr_t * -asn1f_find_terminal_type_ex(asn1p_t *asn, - asn1p_module_t *mod, - asn1p_expr_t *expr) { +asn1f_find_terminal_type_ex(asn1p_t *asn, asn1p_expr_t *expr) { arg_t arg; memset(&arg, 0, sizeof(arg)); arg.asn = asn; - arg.mod = mod; + arg.mod = expr->module; arg.expr = expr; arg.eh = a1f_replace_me_with_proper_interface_arg.eh; arg.debug = a1f_replace_me_with_proper_interface_arg.debug; diff --git a/libasn1fix/asn1fix_export.h b/libasn1fix/asn1fix_export.h index 8ebe44875..5879b93ff 100644 --- a/libasn1fix/asn1fix_export.h +++ b/libasn1fix/asn1fix_export.h @@ -31,8 +31,7 @@ asn1p_expr_t *asn1f_class_access_ex(asn1p_t *asn, asn1p_module_t *mod, /* * Exportable version of asn1f_find_terminal_type(). */ -asn1p_expr_t *asn1f_find_terminal_type_ex(asn1p_t *asn, asn1p_module_t *mod, - asn1p_expr_t *tc); +asn1p_expr_t *asn1f_find_terminal_type_ex(asn1p_t *asn, asn1p_expr_t *tc); /* * Exportable version of asn1f_fix_dereference_values(); From 151c0b29fe1d85790fd08944d9a5422a871bd240 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 22 Sep 2004 16:03:36 +0000 Subject: [PATCH 0363/1469] NamedType support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@363 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_y.c | 1104 ++++++++++++++++++++------------------- libasn1parser/asn1p_y.y | 21 +- 2 files changed, 575 insertions(+), 550 deletions(-) diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index 4cbd21fed..9d621e242 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -205,11 +205,11 @@ typedef union { -#define YYFINAL 399 +#define YYFINAL 402 #define YYFLAG -32768 #define YYNTBASE 115 -#define YYTRANSLATE(x) ((unsigned)(x) <= 355 ? yytranslate[x] : 211) +#define YYTRANSLATE(x) ((unsigned)(x) <= 355 ? yytranslate[x] : 212) static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -262,29 +262,29 @@ static const short yyprhs[] = { 0, 202, 204, 206, 208, 212, 216, 220, 222, 224, 228, 231, 233, 239, 240, 242, 244, 248, 251, 256, 261, 262, 264, 265, 272, 274, 277, 279, 281, 283, 287, - 291, 295, 297, 299, 304, 309, 314, 320, 326, 328, - 333, 338, 340, 344, 346, 350, 354, 358, 360, 364, - 366, 370, 372, 374, 376, 378, 383, 387, 388, 392, - 394, 396, 398, 400, 402, 404, 406, 408, 410, 414, - 416, 419, 421, 423, 425, 427, 430, 433, 435, 437, - 440, 443, 445, 447, 449, 451, 454, 456, 459, 461, - 463, 465, 467, 469, 471, 473, 475, 477, 479, 481, - 483, 485, 487, 489, 491, 493, 495, 497, 498, 500, - 502, 507, 511, 516, 518, 522, 528, 530, 534, 538, - 542, 547, 551, 553, 557, 561, 565, 569, 571, 573, - 575, 578, 581, 585, 587, 589, 591, 593, 595, 597, - 599, 605, 607, 611, 613, 617, 618, 620, 622, 624, - 626, 628, 630, 634, 639, 641, 645, 648, 652, 654, - 658, 659, 661, 663, 666, 669, 673, 675, 679, 681, - 686, 691, 693, 695, 697, 699, 700, 702, 704, 707, - 710, 712, 714, 716 + 291, 295, 297, 299, 304, 309, 314, 321, 328, 330, + 335, 340, 342, 346, 348, 352, 356, 360, 362, 366, + 368, 372, 374, 376, 378, 380, 385, 389, 390, 394, + 396, 398, 400, 402, 404, 406, 408, 410, 412, 416, + 418, 421, 423, 425, 427, 429, 432, 435, 437, 439, + 442, 445, 447, 449, 451, 453, 456, 458, 461, 463, + 465, 467, 469, 471, 473, 475, 477, 479, 481, 483, + 485, 487, 489, 491, 493, 495, 497, 499, 500, 502, + 504, 509, 513, 518, 520, 524, 530, 532, 536, 540, + 544, 549, 553, 555, 559, 563, 567, 571, 573, 575, + 577, 580, 583, 587, 589, 591, 593, 595, 597, 599, + 601, 607, 609, 613, 615, 619, 620, 622, 624, 626, + 628, 630, 632, 636, 641, 643, 647, 650, 654, 656, + 660, 661, 663, 665, 668, 671, 675, 677, 681, 683, + 688, 693, 695, 697, 699, 701, 702, 704, 706, 709, + 712, 714, 716, 718, 719, 721 }; static const short yyrhs[] = { 116, 0, 117, 0, 116, 117, 0, 208, 118, 34, 122, 3, 21, 125, 39, 0, 0, 119, 0, 104, 120, 105, 0, 104, 105, 0, 121, 0, 120, 121, 0, - 210, 0, 210, 106, 9, 107, 0, 9, 0, 0, + 211, 0, 211, 106, 9, 107, 0, 9, 0, 0, 123, 0, 124, 0, 123, 124, 0, 41, 84, 0, 52, 84, 0, 20, 84, 0, 43, 53, 0, 12, 57, 0, 0, 126, 0, 127, 0, 126, 127, 0, @@ -292,18 +292,18 @@ static const short yyrhs[] = { 116, 0, 38, 12, 128, 0, 176, 0, 54, 130, 108, 0, 54, 46, 0, 131, 0, 130, 131, 0, 132, 46, 208, 118, 0, 133, 0, 132, 109, 133, 0, - 208, 0, 210, 0, 42, 135, 108, 0, 42, 17, + 208, 0, 211, 0, 42, 135, 108, 0, 42, 17, 108, 0, 42, 108, 0, 136, 0, 135, 109, 136, - 0, 208, 0, 210, 0, 208, 138, 3, 104, 139, + 0, 208, 0, 211, 0, 208, 138, 3, 104, 139, 105, 0, 163, 0, 173, 0, 0, 140, 0, 141, 0, 140, 109, 141, 0, 102, 0, 184, 0, 208, 3, 206, 87, 0, 208, 3, 161, 0, 208, 3, 151, 0, 208, 104, 143, 105, 3, 161, 0, 144, - 0, 143, 109, 144, 0, 208, 0, 208, 110, 210, - 0, 173, 110, 210, 0, 146, 0, 145, 109, 146, - 0, 161, 0, 210, 0, 148, 0, 147, 109, 148, - 0, 210, 161, 200, 0, 30, 68, 161, 0, 160, - 0, 150, 0, 149, 109, 150, 0, 210, 161, 0, + 0, 143, 109, 144, 0, 208, 0, 208, 110, 211, + 0, 173, 110, 211, 0, 146, 0, 145, 109, 146, + 0, 161, 0, 211, 0, 148, 0, 147, 109, 148, + 0, 211, 161, 200, 0, 30, 68, 161, 0, 160, + 0, 150, 0, 149, 109, 150, 0, 211, 161, 0, 160, 0, 28, 104, 153, 105, 155, 0, 0, 88, 0, 154, 0, 153, 109, 154, 0, 166, 200, 0, 166, 161, 200, 152, 0, 166, 166, 200, 152, 0, @@ -312,79 +312,80 @@ static const short yyrhs[] = { 116, 102, 0, 102, 111, 171, 0, 102, 111, 205, 0, 206, 162, 180, 0, 175, 0, 176, 0, 27, 104, 149, 105, 0, 78, 104, 147, 105, 0, 79, 104, - 147, 105, 0, 78, 180, 68, 206, 162, 0, 79, - 180, 68, 206, 162, 0, 18, 0, 18, 35, 25, - 210, 0, 208, 104, 145, 105, 0, 163, 0, 56, - 68, 163, 0, 11, 0, 11, 112, 208, 0, 209, - 112, 208, 0, 11, 112, 210, 0, 209, 0, 209, - 112, 164, 0, 165, 0, 164, 112, 165, 0, 167, - 0, 167, 0, 13, 0, 14, 0, 210, 138, 3, - 169, 0, 210, 110, 169, 0, 0, 104, 170, 172, - 0, 63, 0, 45, 0, 86, 0, 5, 0, 7, - 0, 6, 0, 205, 0, 171, 0, 210, 0, 208, - 112, 210, 0, 4, 0, 172, 4, 0, 24, 0, - 63, 0, 76, 0, 174, 0, 67, 81, 0, 65, - 51, 0, 77, 0, 44, 0, 36, 71, 0, 26, - 81, 0, 91, 0, 47, 0, 58, 0, 40, 0, - 22, 81, 0, 173, 0, 174, 202, 0, 23, 0, - 48, 0, 49, 0, 50, 0, 59, 0, 64, 0, - 74, 0, 83, 0, 85, 0, 90, 0, 92, 0, - 93, 0, 94, 0, 66, 0, 99, 0, 100, 0, - 97, 0, 98, 0, 96, 0, 0, 181, 0, 182, - 0, 80, 106, 183, 107, 0, 106, 183, 107, 0, - 182, 106, 183, 107, 0, 184, 0, 184, 109, 102, - 0, 184, 109, 102, 109, 184, 0, 185, 0, 184, - 177, 185, 0, 184, 178, 185, 0, 185, 179, 185, - 0, 187, 106, 183, 107, 0, 106, 183, 107, 0, - 188, 0, 188, 186, 188, 0, 61, 186, 188, 0, - 188, 186, 60, 0, 61, 186, 60, 0, 194, 0, - 189, 0, 101, 0, 101, 113, 0, 113, 101, 0, - 113, 101, 113, 0, 80, 0, 46, 0, 205, 0, - 210, 0, 6, 0, 45, 0, 86, 0, 95, 30, - 104, 190, 105, 0, 191, 0, 190, 109, 191, 0, - 102, 0, 210, 180, 192, 0, 0, 193, 0, 73, - 0, 15, 0, 69, 0, 195, 0, 196, 0, 104, - 208, 105, 0, 195, 104, 197, 105, 0, 198, 0, - 197, 109, 198, 0, 114, 199, 0, 114, 112, 199, - 0, 210, 0, 199, 112, 210, 0, 0, 201, 0, - 69, 0, 33, 169, 0, 104, 105, 0, 104, 203, - 105, 0, 204, 0, 203, 109, 204, 0, 210, 0, - 210, 106, 205, 107, 0, 210, 106, 171, 107, 0, - 205, 0, 102, 0, 9, 0, 10, 0, 0, 207, - 0, 103, 0, 103, 52, 0, 103, 41, 0, 11, - 0, 12, 0, 12, 0, 8, 0 + 147, 105, 0, 78, 180, 68, 210, 206, 162, 0, + 79, 180, 68, 210, 206, 162, 0, 18, 0, 18, + 35, 25, 211, 0, 208, 104, 145, 105, 0, 163, + 0, 56, 68, 163, 0, 11, 0, 11, 112, 208, + 0, 209, 112, 208, 0, 11, 112, 211, 0, 209, + 0, 209, 112, 164, 0, 165, 0, 164, 112, 165, + 0, 167, 0, 167, 0, 13, 0, 14, 0, 211, + 138, 3, 169, 0, 211, 110, 169, 0, 0, 104, + 170, 172, 0, 63, 0, 45, 0, 86, 0, 5, + 0, 7, 0, 6, 0, 205, 0, 171, 0, 211, + 0, 208, 112, 211, 0, 4, 0, 172, 4, 0, + 24, 0, 63, 0, 76, 0, 174, 0, 67, 81, + 0, 65, 51, 0, 77, 0, 44, 0, 36, 71, + 0, 26, 81, 0, 91, 0, 47, 0, 58, 0, + 40, 0, 22, 81, 0, 173, 0, 174, 202, 0, + 23, 0, 48, 0, 49, 0, 50, 0, 59, 0, + 64, 0, 74, 0, 83, 0, 85, 0, 90, 0, + 92, 0, 93, 0, 94, 0, 66, 0, 99, 0, + 100, 0, 97, 0, 98, 0, 96, 0, 0, 181, + 0, 182, 0, 80, 106, 183, 107, 0, 106, 183, + 107, 0, 182, 106, 183, 107, 0, 184, 0, 184, + 109, 102, 0, 184, 109, 102, 109, 184, 0, 185, + 0, 184, 177, 185, 0, 184, 178, 185, 0, 185, + 179, 185, 0, 187, 106, 183, 107, 0, 106, 183, + 107, 0, 188, 0, 188, 186, 188, 0, 61, 186, + 188, 0, 188, 186, 60, 0, 61, 186, 60, 0, + 194, 0, 189, 0, 101, 0, 101, 113, 0, 113, + 101, 0, 113, 101, 113, 0, 80, 0, 46, 0, + 205, 0, 211, 0, 6, 0, 45, 0, 86, 0, + 95, 30, 104, 190, 105, 0, 191, 0, 190, 109, + 191, 0, 102, 0, 211, 180, 192, 0, 0, 193, + 0, 73, 0, 15, 0, 69, 0, 195, 0, 196, + 0, 104, 208, 105, 0, 195, 104, 197, 105, 0, + 198, 0, 197, 109, 198, 0, 114, 199, 0, 114, + 112, 199, 0, 211, 0, 199, 112, 211, 0, 0, + 201, 0, 69, 0, 33, 169, 0, 104, 105, 0, + 104, 203, 105, 0, 204, 0, 203, 109, 204, 0, + 211, 0, 211, 106, 205, 107, 0, 211, 106, 171, + 107, 0, 205, 0, 102, 0, 9, 0, 10, 0, + 0, 207, 0, 103, 0, 103, 52, 0, 103, 41, + 0, 11, 0, 12, 0, 12, 0, 0, 211, 0, + 8, 0 }; #endif #if YYDEBUG != 0 static const short yyrline[] = { 0, - 299, 305, 311, 327, 352, 354, 357, 361, 366, 373, - 381, 386, 390, 399, 401, 409, 413, 421, 425, 428, - 431, 435, 455, 457, 465, 469, 501, 505, 514, 521, - 534, 541, 543, 555, 568, 575, 580, 586, 592, 601, - 607, 613, 620, 628, 632, 635, 642, 648, 654, 661, - 670, 680, 688, 696, 698, 708, 711, 715, 718, 730, - 742, 748, 764, 773, 783, 793, 798, 805, 815, 821, - 827, 831, 843, 849, 855, 862, 869, 874, 880, 886, - 892, 897, 907, 909, 912, 920, 926, 935, 941, 958, - 960, 965, 969, 974, 979, 985, 989, 1000, 1009, 1018, - 1029, 1051, 1055, 1061, 1067, 1073, 1079, 1088, 1097, 1103, - 1117, 1141, 1148, 1162, 1171, 1181, 1191, 1201, 1209, 1230, - 1239, 1248, 1249, 1251, 1258, 1270, 1280, 1288, 1288, 1293, - 1298, 1303, 1308, 1312, 1316, 1320, 1323, 1328, 1340, 1356, - 1367, 1381, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, - 1391, 1392, 1393, 1399, 1401, 1402, 1405, 1412, 1424, 1426, - 1430, 1434, 1435, 1436, 1437, 1438, 1442, 1443, 1444, 1445, - 1449, 1450, 1457, 1457, 1458, 1458, 1459, 1461, 1463, 1468, - 1472, 1481, 1485, 1490, 1494, 1500, 1510, 1514, 1517, 1520, - 1525, 1534, 1542, 1548, 1555, 1563, 1571, 1580, 1583, 1588, - 1590, 1591, 1592, 1595, 1599, 1604, 1608, 1619, 1623, 1628, - 1635, 1641, 1645, 1650, 1656, 1668, 1670, 1673, 1677, 1680, - 1685, 1689, 1697, 1712, 1718, 1725, 1738, 1750, 1765, 1769, - 1786, 1791, 1794, 1799, 1821, 1826, 1831, 1837, 1843, 1851, - 1859, 1867, 1874, 1884, 1889, 1919, 1921, 1924, 1929, 1933, - 1939, 1944, 1951, 1958 + 300, 306, 312, 328, 353, 355, 358, 362, 367, 374, + 382, 387, 391, 400, 402, 410, 414, 422, 426, 429, + 432, 436, 456, 458, 466, 470, 502, 506, 515, 522, + 535, 542, 544, 556, 569, 576, 581, 587, 593, 602, + 608, 614, 621, 629, 633, 636, 643, 649, 655, 662, + 671, 681, 689, 697, 699, 709, 712, 716, 719, 731, + 743, 749, 765, 774, 784, 794, 799, 806, 816, 822, + 828, 832, 844, 850, 856, 863, 870, 875, 881, 887, + 893, 898, 908, 910, 913, 921, 927, 936, 942, 959, + 961, 966, 970, 975, 980, 986, 990, 1001, 1010, 1019, + 1030, 1052, 1056, 1062, 1068, 1074, 1080, 1090, 1100, 1106, + 1120, 1144, 1151, 1165, 1174, 1184, 1194, 1204, 1212, 1233, + 1242, 1251, 1252, 1254, 1261, 1273, 1283, 1291, 1291, 1296, + 1301, 1306, 1311, 1315, 1319, 1323, 1326, 1331, 1343, 1359, + 1370, 1384, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, + 1394, 1395, 1396, 1402, 1404, 1405, 1408, 1415, 1427, 1429, + 1433, 1437, 1438, 1439, 1440, 1441, 1445, 1446, 1447, 1448, + 1452, 1453, 1460, 1460, 1461, 1461, 1462, 1464, 1466, 1471, + 1475, 1484, 1488, 1493, 1497, 1503, 1513, 1517, 1520, 1523, + 1528, 1537, 1545, 1551, 1558, 1566, 1574, 1583, 1586, 1591, + 1593, 1594, 1595, 1598, 1602, 1607, 1611, 1622, 1626, 1631, + 1638, 1644, 1648, 1653, 1659, 1671, 1673, 1676, 1680, 1683, + 1688, 1692, 1700, 1715, 1721, 1728, 1741, 1753, 1768, 1772, + 1789, 1794, 1797, 1802, 1824, 1829, 1834, 1840, 1846, 1854, + 1862, 1870, 1877, 1887, 1892, 1922, 1924, 1927, 1932, 1936, + 1942, 1947, 1954, 1961, 1963, 1967 }; #endif @@ -431,7 +432,8 @@ static const char * const yytname[] = { "$","error","$undefined.","TOK_PPEQ", "optPresenceConstraint","PresenceConstraint","TableConstraint","SimpleTableConstraint", "ComponentRelationConstraint","AtNotationList","AtNotationElement","ComponentIdList", "optMarker","Marker","UniverationDefinition","UniverationList","UniverationElement", -"SignedNumber","optTag","Tag","TypeRefName","ObjectClassReference","Identifier", NULL +"SignedNumber","optTag","Tag","TypeRefName","ObjectClassReference","optIdentifier", +"Identifier", NULL }; #endif @@ -461,7 +463,7 @@ static const short yyr1[] = { 0, 194, 194, 195, 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 204, 204, 204, 205, 205, 206, 206, 207, 207, 207, - 208, 208, 209, 210 + 208, 208, 209, 210, 210, 211 }; static const short yyr2[] = { 0, @@ -475,7 +477,7 @@ static const short yyr2[] = { 0, 1, 1, 1, 3, 3, 3, 1, 1, 3, 2, 1, 5, 0, 1, 1, 3, 2, 4, 4, 0, 1, 0, 6, 1, 2, 1, 1, 1, 3, 3, - 3, 1, 1, 4, 4, 4, 5, 5, 1, 4, + 3, 1, 1, 4, 4, 4, 6, 6, 1, 4, 4, 1, 3, 1, 3, 3, 3, 1, 3, 1, 3, 1, 1, 1, 1, 4, 3, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, @@ -490,11 +492,11 @@ static const short yyr2[] = { 0, 1, 1, 3, 4, 1, 3, 2, 3, 1, 3, 0, 1, 1, 2, 2, 3, 1, 3, 1, 4, 4, 1, 1, 1, 1, 0, 1, 1, 2, 2, - 1, 1, 1, 1 + 1, 1, 1, 0, 1, 1 }; static const short yydefact[] = { 0, - 251, 252, 1, 2, 5, 3, 0, 0, 6, 254, + 251, 252, 1, 2, 5, 3, 0, 0, 6, 256, 13, 8, 0, 9, 11, 14, 7, 10, 0, 0, 0, 0, 0, 0, 0, 15, 16, 0, 22, 20, 18, 21, 19, 0, 17, 12, 23, 159, 0, 0, @@ -519,228 +521,230 @@ static const short yydefact[] = { 0, 193, 199, 198, 221, 222, 206, 207, 0, 0, 0, 0, 90, 0, 0, 233, 231, 231, 87, 232, 0, 0, 98, 0, 78, 81, 246, 113, 0, 0, 0, - 73, 77, 246, 0, 184, 246, 0, 0, 246, 243, + 73, 77, 246, 0, 184, 254, 0, 0, 254, 243, 235, 0, 237, 242, 239, 0, 69, 71, 72, 63, 200, 0, 0, 0, 0, 0, 51, 0, 175, 176, 173, 174, 0, 0, 177, 0, 0, 0, 0, 121, 140, 129, 139, 127, 0, 82, 91, 86, 234, 83, 83, 110, 0, 104, 0, 80, 0, 246, 105, 0, - 231, 182, 0, 0, 0, 106, 0, 236, 0, 0, - 111, 246, 201, 202, 197, 195, 0, 223, 192, 57, - 188, 189, 190, 0, 196, 194, 0, 0, 225, 141, - 0, 84, 88, 89, 99, 100, 138, 79, 181, 76, - 74, 75, 185, 107, 183, 108, 238, 0, 0, 70, - 203, 214, 0, 212, 178, 191, 0, 227, 229, 224, - 0, 92, 0, 241, 240, 211, 0, 216, 228, 0, - 226, 0, 186, 213, 219, 220, 218, 215, 217, 230, - 96, 0, 94, 97, 93, 95, 0, 0, 0 + 231, 182, 0, 246, 255, 0, 106, 246, 236, 0, + 0, 111, 246, 201, 202, 197, 195, 0, 223, 192, + 57, 188, 189, 190, 0, 196, 194, 0, 0, 225, + 141, 0, 84, 88, 89, 99, 100, 138, 79, 181, + 76, 74, 75, 185, 0, 183, 0, 238, 0, 0, + 70, 203, 214, 0, 212, 178, 191, 0, 227, 229, + 224, 0, 92, 0, 107, 108, 241, 240, 211, 0, + 216, 228, 0, 226, 0, 186, 213, 219, 220, 218, + 215, 217, 230, 96, 0, 94, 97, 93, 95, 0, + 0, 0 }; -static const short yydefgoto[] = { 397, +static const short yydefgoto[] = { 400, 3, 4, 8, 9, 13, 14, 25, 26, 27, 55, 56, 57, 106, 58, 74, 75, 76, 77, 59, 69, 70, 60, 100, 215, 216, 217, 61, 126, 127, 266, - 267, 250, 251, 243, 244, 116, 343, 182, 183, 296, - 297, 382, 392, 393, 252, 268, 147, 148, 163, 164, + 267, 250, 251, 243, 244, 116, 344, 182, 183, 296, + 297, 385, 395, 396, 252, 268, 147, 148, 163, 164, 184, 185, 62, 176, 229, 177, 292, 149, 103, 151, 152, 283, 284, 286, 192, 193, 194, 254, 255, 219, - 273, 220, 221, 222, 363, 364, 388, 389, 223, 224, - 225, 338, 339, 368, 238, 239, 199, 262, 263, 226, - 240, 119, 179, 104, 227 + 273, 220, 221, 222, 364, 365, 391, 392, 223, 224, + 225, 339, 340, 369, 238, 239, 199, 262, 263, 226, + 240, 119, 179, 104, 314, 227 }; -static const short yypact[] = { 42, --32768,-32768, 42,-32768, -6,-32768, 72, 111,-32768,-32768, --32768,-32768, 74,-32768, -1, 162,-32768,-32768, 138, 99, - 83, 91, 123, 97, 222, 162,-32768, 121,-32768,-32768, --32768,-32768,-32768, 209,-32768,-32768, 313,-32768, 219, 33, --32768,-32768,-32768, 96,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 210, 313,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 12, 527,-32768, 185,-32768, -18,-32768, --32768,-32768,-32768, 49,-32768, -25,-32768,-32768,-32768,-32768, --32768, -3, 145,-32768, 186,-32768, 202, 229,-32768,-32768, --32768,-32768,-32768, 250, 223,-32768,-32768,-32768, 544, 302, --32768,-32768,-32768, 194, 311,-32768,-32768,-32768, 158,-32768, --32768, 42, 158, 214, 102,-32768,-32768, 390,-32768, 158, --32768,-32768,-32768,-32768,-32768, 87,-32768, 213, 216, 225, - 297, 254,-32768, -6,-32768, 124,-32768,-32768, -57, 231, - 292, 233, 270, -12, 149,-32768, -37,-32768,-32768, 235, --32768,-32768, 237,-32768,-32768, 339, 544, 335, 335, 152, --32768,-32768, 232,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 238, 236, --32768, 90,-32768, 176,-32768, 320, 8, 207, 241, 32, - 140, 281,-32768, 246, 32, 285,-32768, 63,-32768, 20, - 251,-32768,-32768,-32768,-32768,-32768,-32768, -16,-32768,-32768, - 326,-32768, 42, 140, 252, 255,-32768, 234, 263, 259, - -16,-32768,-32768, 264,-32768,-32768,-32768, 124, 362, 335, - 254, 274, 124, 254,-32768, 18, 18,-32768,-32768, 467, - 335, 260, 101,-32768,-32768, 251,-32768, 140, 306, 131, --32768,-32768, 251, 268, 177, 251, 140, 132, 251,-32768, --32768, 134,-32768,-32768, 272, 164,-32768,-32768,-32768,-32768, - 267, 275, 242, 277, 278, 279,-32768, 152,-32768,-32768, --32768,-32768, 140, 140,-32768, 140, 140, 262, 271,-32768, --32768, 378,-32768,-32768, 307,-32768,-32768,-32768,-32768, 296, - 296,-32768, 280,-32768, 8,-32768, 283, 251,-32768, 32, - 18,-32768, 286, 467, 284,-32768, 467,-32768, 10, 280, --32768, 20,-32768, 282,-32768,-32768, 27,-32768,-32768,-32768, --32768,-32768,-32768, 287,-32768,-32768, 5, 173,-32768,-32768, - 288,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768, 290,-32768,-32768,-32768,-32768, 293, 303,-32768, --32768,-32768, 175,-32768, -37,-32768, 335, 299,-32768,-32768, - 271,-32768, 140,-32768,-32768,-32768, 27, 71, 299, 335, --32768, 159, 234,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768, 13,-32768,-32768,-32768,-32768, 393, 397,-32768 +static const short yypact[] = { 93, +-32768,-32768, 93,-32768, 65,-32768, 23, 78,-32768,-32768, +-32768,-32768, 52,-32768, 68, 224,-32768,-32768, 118, 122, + 51, 59, 139, 113, 203, 224,-32768, 109,-32768,-32768, +-32768,-32768,-32768, 201,-32768,-32768, 318,-32768, 220, 9, +-32768,-32768,-32768, 173,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 198, 318,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 12, 532,-32768, 135,-32768, 46,-32768, +-32768,-32768,-32768, 32,-32768, -11,-32768,-32768,-32768,-32768, +-32768, -6, 149,-32768, 196,-32768, 207, 226,-32768,-32768, +-32768,-32768,-32768, 223, 214,-32768,-32768,-32768, 549, 305, +-32768,-32768,-32768, 200, 307,-32768,-32768,-32768, 252,-32768, +-32768, 93, 252, 211, 30,-32768,-32768, 395,-32768, 252, +-32768,-32768,-32768,-32768,-32768, -25,-32768, 208, 209, 216, + 293, 155,-32768, 65,-32768, 217,-32768,-32768, -5, 229, + 292, 231, 268, -23, 64,-32768, -55,-32768,-32768, 233, +-32768,-32768, 234,-32768,-32768, 336, 549, 332, 332, 167, +-32768,-32768, 230,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 232, 235, +-32768, 77,-32768, 181,-32768, 321, 8, 280, 241, 39, + 248, 281,-32768, 242, 39, 282,-32768, 45,-32768, 21, + 250,-32768,-32768,-32768,-32768,-32768,-32768, 29,-32768,-32768, + 325,-32768, 93, 248, 246, 253,-32768, 225, 267, 258, + 29,-32768,-32768, 261,-32768,-32768,-32768, 217, 365, 332, + 155, 275, 217, 155,-32768, 17, 17,-32768,-32768, 472, + 332, 260, 112,-32768,-32768, 250,-32768, 248, 306, 146, +-32768,-32768, 250, 271, 202, 332, 248, 161, 332,-32768, +-32768, 163,-32768,-32768, 269, 170,-32768,-32768,-32768,-32768, + 266, 279, 86, 277, 278, 283,-32768, 167,-32768,-32768, +-32768,-32768, 248, 248,-32768, 248, 248, 272, 273,-32768, +-32768, 381,-32768,-32768, 304,-32768,-32768,-32768,-32768, 300, + 300,-32768, 193,-32768, 8,-32768, 284, 250,-32768, 39, + 17,-32768, 287, 250,-32768, 286,-32768, 250,-32768, 54, + 193,-32768, 21,-32768, 285,-32768,-32768, 37,-32768,-32768, +-32768,-32768,-32768,-32768, 288,-32768,-32768, -4, 178,-32768, +-32768, 290,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 291, 472,-32768, 472,-32768, 289, 295, +-32768,-32768,-32768, 180,-32768, -55,-32768, 332, 297,-32768, +-32768, 273,-32768, 248,-32768,-32768,-32768,-32768,-32768, 37, + 76, 297, 332,-32768, 185, 225,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 14,-32768,-32768,-32768,-32768, 397, + 399,-32768 }; static const short yypgoto[] = {-32768, --32768, 401, 289,-32768,-32768, 396,-32768,-32768, 389,-32768, --32768, 363,-32768,-32768,-32768, 344,-32768, 308,-32768,-32768, - 315,-32768, 355,-32768,-32768, 144,-32768,-32768, 276,-32768, - 103, 240, 117,-32768, 126,-32768, 127,-32768, 196,-32768, --32768,-32768,-32768, 40, -173, -75, -218, -53,-32768, 208, - -180, -109,-32768, -23,-32768, -167,-32768, -33, -110,-32768, - 37,-32768,-32768,-32768, -144,-32768,-32768, -93, -151, 11, - 220,-32768, -210,-32768,-32768, 65,-32768,-32768,-32768,-32768, --32768,-32768, 73, 76, -172,-32768,-32768,-32768, 128, -103, - -72,-32768, 2,-32768, -7 +-32768, 401, 294,-32768,-32768, 392,-32768,-32768, 388,-32768, +-32768, 359,-32768,-32768,-32768, 342,-32768, 310,-32768,-32768, + 311,-32768, 360,-32768,-32768, 148,-32768,-32768, 270,-32768, + 101, 237, 119,-32768, 125,-32768, 132,-32768, 204,-32768, +-32768,-32768,-32768, 41, -173, -75, -146, -52,-32768, 206, + -175, -90,-32768, -97,-32768, -231,-32768, 1, -117,-32768, + 31,-32768,-32768,-32768, -137,-32768,-32768, -61, -149, -38, + 219,-32768, -195,-32768,-32768, 58,-32768,-32768,-32768,-32768, +-32768,-32768, 69, 79, -163,-32768,-32768,-32768, 126, -113, + -79,-32768, 2,-32768, 189, -7 }; -#define YYLAST 635 +#define YYLAST 640 static const short yytable[] = { 15, - 196, 5, 197, 237, 5, 15, 117, 150, 218, 118, - 101, 101, 10, 245, 82, 10, 391, 10, 170, 171, - 112, 165, 83, 84, 114, 161, 162, 10, 178, 65, - 102, 102, 72, 85, 10, 86, 79, 87, 64, 10, - 10, 71, 189, 1, 2, 78, -251, 88, 65, 67, - 234, 89, 1, 2, 120, 90, 10, 64, 91, 1, - 2, 249, 326, 300, 301, 128, 79, 189, 191, 92, - 10, 170, 171, 63, 93, 78, 94, 336, 95, 10, - 11, 10, 11, 113, 271, 385, 235, 96, 97, 108, - 109, 190, 63, 191, 264, 354, 272, 7, 356, 115, - 129, 72, 98, 10, 19, 79, 1, 2, 236, 242, - 71, 260, 155, 134, 78, 99, 367, 395, 165, 153, - 276, 154, 115, 128, 180, 270, 218, 178, 362, 150, - 178, 245, 166, 242, 247, 345, 161, 162, 352, 386, - 68, 73, 137, 387, 16, 205, 28, 10, 170, 171, - 203, 204, 358, 138, 307, 29, 110, 205, 129, 10, - 170, 171, 391, 315, 260, 10, 30, 261, 1, 2, - 306, 161, 162, 20, 31, 32, 12, 311, 17, 246, - 33, 21, 253, 314, 206, 207, 317, 253, 161, 162, - 265, 156, 269, 334, 232, 157, 206, 207, 233, 346, - 208, 394, 22, 150, 23, 304, 150, 294, 234, 305, - 299, 394, 208, 24, 275, 264, 359, 83, 84, 209, - 378, 383, 293, 180, 34, 210, 180, 36, 189, 37, - 66, 209, 350, 302, 211, 309, 316, 210, 318, 310, - 310, 153, 319, 213, 235, 214, 211, 205, 80, 10, - 170, 171, 195, 212, 191, 213, 120, 214, 167, 168, - 169, 10, 170, 171, 1, 2, 121, 205, 321, 10, - 170, 171, 322, 279, 280, 281, 282, 370, 115, 376, - -231, 371, 122, 377, -231, 313, 206, 10, 170, 171, - 1, 2, 107, 331, 332, 347, 333, 246, 172, 123, - 124, 325, 253, 125, 130, 131, 206, 1, 2, 161, - 162, 265, 347, 132, 269, 153, 173, 136, 153, 365, - 10, 335, 158, 1, 2, 159, 186, 210, 160, 369, - 279, 280, 281, 282, -252, 38, 187, 188, 198, 174, - 200, 201, 10, 228, 241, 231, 248, 210, 256, 230, - 39, 257, 259, 115, 40, 274, 277, 175, 285, 369, - 41, 42, 43, 278, 287, 291, 44, 289, 295, 365, - 303, 45, 390, 308, 312, 324, 46, 320, 47, 323, - 327, 340, 328, 342, 337, 329, 48, 353, 341, 349, - 355, 372, 398, 366, 361, 49, 399, 50, 373, 374, - 139, 140, 51, 6, 52, 53, 54, 141, 18, 375, - 380, 85, 38, 86, 35, 87, 142, 111, 81, 105, - 135, 330, 181, 133, 360, 88, 351, 344, 298, 89, - 348, 396, 202, 90, 258, 290, 91, 41, 42, 43, - 288, 384, 379, 381, 0, 143, 357, 92, 45, 0, - 0, 0, 93, 46, 94, 47, 95, 0, 0, 0, - 0, 0, 0, 48, 0, 96, 97, 144, 145, 0, - 0, 0, 49, 0, 50, 0, 146, 139, 140, 51, - 98, 52, 53, 54, 141, 0, 0, 0, 85, 38, - 86, 0, 87, 142, 0, 0, 0, 0, 0, 0, - 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, - 90, 0, 0, 91, 41, 42, 43, 0, 0, 0, - 0, 0, 143, 0, 92, 45, 0, 0, 0, 93, - 46, 94, 47, 95, 0, 0, 0, 83, 84, 0, - 48, 0, 96, 97, 144, 145, 0, 0, 85, 49, - 86, 50, 87, 0, 1, 2, 51, 98, 52, 53, - 54, 0, 88, 0, 0, 85, 89, 86, 0, 87, - 90, 0, 0, 91, 0, 0, 0, 0, 0, 88, - 0, 0, 0, 89, 92, 0, 0, 90, 0, 93, - 91, 94, 0, 95, 0, 0, 0, 0, 0, 0, - 0, 92, 96, 97, 0, 0, 93, 0, 94, 0, - 95, 0, 0, 0, 0, 0, 0, 98, 0, 96, - 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 98 + 150, 5, 118, 10, 5, 15, 117, 196, 237, 197, + 218, 101, 101, 245, 82, 10, 10, 394, 178, 1, + 2, 114, 83, 84, 189, 67, 161, 162, 10, 65, + 10, 11, 72, 85, 112, 86, 79, 87, 64, 10, + 165, 71, 1, 2, 10, 78, 10, 88, 65, 234, + 191, 89, 10, 170, 171, 90, 189, 64, 91, 10, + 11, 10, 170, 171, 102, 102, 79, 63, 249, 92, + 137, 346, 300, 301, 93, 78, 94, 327, 95, 156, + 190, 138, 191, 157, 264, 235, 63, 96, 97, 359, + 388, 205, 337, 10, 170, 171, 115, 113, -251, 128, + 129, 72, 98, 1, 2, 79, 120, 368, 236, 242, + 71, 16, 155, 134, 78, 99, 68, 178, 398, 153, + 178, 154, 150, 115, 180, 270, 28, 12, 218, 271, + 206, 245, 166, 294, 30, 247, 299, 165, 363, 110, + 242, 272, 31, 189, 389, 326, 260, 353, 390, 261, + 203, 204, 276, 108, 109, 260, 17, 128, 129, 167, + 168, 169, 10, 170, 171, 1, 2, 195, 7, 191, + 306, 210, 205, 19, 10, 170, 171, 311, 29, 246, + 10, 232, 253, 1, 2, 233, 307, 253, 394, 347, + 265, 32, 269, 161, 162, 316, 33, 161, 162, 172, + 10, 170, 171, 1, 2, 34, 264, 360, 375, 397, + 376, 206, 207, 234, 275, 36, 304, 173, 73, 397, + 305, 37, 293, 180, 386, 335, 180, 208, 381, 161, + 162, 66, 351, 302, 355, 20, 80, 150, 357, 150, + 174, 153, 107, 21, 332, 333, 209, 334, 315, 235, + 309, 315, 210, 205, 310, 10, 170, 171, 175, 10, + 120, 211, 1, 2, 22, 317, 23, 319, 212, 310, + 213, 320, 214, 124, 322, 24, 121, 205, 323, 10, + 170, 171, 371, 115, 379, -231, 372, 122, 380, -231, + 83, 84, 206, 207, 125, 348, 123, 246, 279, 280, + 281, 282, 253, 1, 2, 161, 162, 130, 208, 132, + 313, 131, 265, 348, 136, 269, 206, 158, 159, 160, + 366, 279, 280, 281, 282, 10, 186, 209, 1, 2, + 370, 336, -252, 210, 187, 188, 198, 200, 201, 10, + 38, 228, 211, 230, 231, 241, 248, 257, 256, 259, + 277, 213, 115, 214, 274, 39, 153, 210, 153, 40, + 370, 278, 285, 287, 289, 41, 42, 43, 291, 295, + 303, 44, 366, 308, 321, 393, 45, 312, 324, 325, + 328, 46, 329, 47, 341, 342, 338, 343, 354, 330, + 350, 48, 356, 373, 367, 377, 401, 362, 402, 374, + 49, 378, 50, 6, 18, 139, 140, 51, 383, 52, + 53, 54, 141, 35, 81, 111, 85, 38, 86, 133, + 87, 142, 135, 361, 105, 331, 202, 181, 352, 349, + 88, 258, 345, 290, 89, 399, 298, 387, 90, 288, + 384, 91, 41, 42, 43, 358, 382, 318, 0, 0, + 143, 0, 92, 45, 0, 0, 0, 93, 46, 94, + 47, 95, 0, 0, 0, 0, 0, 0, 48, 0, + 96, 97, 144, 145, 0, 0, 0, 49, 0, 50, + 0, 146, 139, 140, 51, 98, 52, 53, 54, 141, + 0, 0, 0, 85, 38, 86, 0, 87, 142, 0, + 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, + 0, 89, 0, 0, 0, 90, 0, 0, 91, 41, + 42, 43, 0, 0, 0, 0, 0, 143, 0, 92, + 45, 0, 0, 0, 93, 46, 94, 47, 95, 0, + 0, 0, 83, 84, 0, 48, 0, 96, 97, 144, + 145, 0, 0, 85, 49, 86, 50, 87, 0, 1, + 2, 51, 98, 52, 53, 54, 0, 88, 0, 0, + 85, 89, 86, 0, 87, 90, 0, 0, 91, 0, + 0, 0, 0, 0, 88, 0, 0, 0, 89, 92, + 0, 0, 90, 0, 93, 91, 94, 0, 95, 0, + 0, 0, 0, 0, 0, 0, 92, 96, 97, 0, + 0, 93, 0, 94, 0, 95, 0, 0, 0, 0, + 0, 0, 98, 0, 96, 97, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 98 }; static const short yycheck[] = { 7, - 145, 0, 147, 184, 3, 13, 82, 118, 160, 82, - 64, 65, 8, 187, 3, 8, 4, 8, 9, 10, - 46, 131, 11, 12, 28, 13, 14, 8, 132, 37, - 64, 65, 40, 22, 8, 24, 44, 26, 37, 8, - 8, 40, 80, 11, 12, 44, 104, 36, 56, 17, - 33, 40, 11, 12, 112, 44, 8, 56, 47, 11, - 12, 30, 273, 236, 237, 99, 74, 80, 106, 58, - 8, 9, 10, 37, 63, 74, 65, 288, 67, 8, - 9, 8, 9, 109, 101, 15, 69, 76, 77, 108, - 109, 104, 56, 106, 198, 314, 113, 104, 317, 103, - 99, 109, 91, 8, 106, 113, 11, 12, 184, 102, - 109, 102, 120, 112, 113, 104, 112, 105, 228, 118, - 214, 120, 103, 157, 132, 201, 278, 231, 102, 240, - 234, 305, 131, 102, 188, 303, 13, 14, 311, 69, - 108, 46, 41, 73, 34, 6, 9, 8, 9, 10, - 158, 159, 320, 52, 248, 57, 108, 6, 157, 8, - 9, 10, 4, 257, 102, 8, 84, 105, 11, 12, - 246, 13, 14, 12, 84, 53, 105, 253, 105, 187, - 84, 20, 190, 256, 45, 46, 259, 195, 13, 14, - 198, 105, 200, 287, 105, 109, 45, 46, 109, 303, - 61, 382, 41, 314, 43, 105, 317, 231, 33, 109, - 234, 392, 61, 52, 213, 319, 320, 11, 12, 80, - 365, 373, 230, 231, 3, 86, 234, 107, 80, 21, - 12, 80, 308, 241, 95, 105, 105, 86, 105, 109, - 109, 240, 109, 104, 69, 106, 95, 6, 39, 8, - 9, 10, 104, 102, 106, 104, 112, 106, 5, 6, - 7, 8, 9, 10, 11, 12, 81, 6, 105, 8, - 9, 10, 109, 97, 98, 99, 100, 105, 103, 105, - 105, 109, 81, 109, 109, 109, 45, 8, 9, 10, - 11, 12, 108, 283, 284, 303, 286, 305, 45, 71, - 51, 60, 310, 81, 3, 112, 45, 11, 12, 13, - 14, 319, 320, 3, 322, 314, 63, 104, 317, 327, - 8, 60, 110, 11, 12, 110, 35, 86, 104, 337, - 97, 98, 99, 100, 104, 23, 104, 68, 104, 86, - 104, 3, 8, 112, 25, 110, 106, 86, 68, 112, - 38, 106, 68, 103, 42, 30, 105, 104, 96, 367, - 48, 49, 50, 109, 106, 4, 54, 104, 95, 377, - 111, 59, 380, 68, 107, 101, 64, 106, 66, 113, - 104, 4, 105, 88, 114, 107, 74, 102, 82, 107, - 107, 104, 0, 107, 113, 83, 0, 85, 109, 107, - 11, 12, 90, 3, 92, 93, 94, 18, 13, 107, - 112, 22, 23, 24, 26, 26, 27, 74, 56, 65, - 113, 278, 134, 109, 322, 36, 310, 301, 233, 40, - 305, 392, 157, 44, 195, 228, 47, 48, 49, 50, - 221, 377, 367, 371, -1, 56, 319, 58, 59, -1, - -1, -1, 63, 64, 65, 66, 67, -1, -1, -1, - -1, -1, -1, 74, -1, 76, 77, 78, 79, -1, - -1, -1, 83, -1, 85, -1, 87, 11, 12, 90, - 91, 92, 93, 94, 18, -1, -1, -1, 22, 23, - 24, -1, 26, 27, -1, -1, -1, -1, -1, -1, - -1, -1, 36, -1, -1, -1, 40, -1, -1, -1, - 44, -1, -1, 47, 48, 49, 50, -1, -1, -1, - -1, -1, 56, -1, 58, 59, -1, -1, -1, 63, - 64, 65, 66, 67, -1, -1, -1, 11, 12, -1, - 74, -1, 76, 77, 78, 79, -1, -1, 22, 83, - 24, 85, 26, -1, 11, 12, 90, 91, 92, 93, - 94, -1, 36, -1, -1, 22, 40, 24, -1, 26, - 44, -1, -1, 47, -1, -1, -1, -1, -1, 36, - -1, -1, -1, 40, 58, -1, -1, 44, -1, 63, - 47, 65, -1, 67, -1, -1, -1, -1, -1, -1, - -1, 58, 76, 77, -1, -1, 63, -1, 65, -1, - 67, -1, -1, -1, -1, -1, -1, 91, -1, 76, - 77, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 91 + 118, 0, 82, 8, 3, 13, 82, 145, 184, 147, + 160, 64, 65, 187, 3, 8, 8, 4, 132, 11, + 12, 28, 11, 12, 80, 17, 13, 14, 8, 37, + 8, 9, 40, 22, 46, 24, 44, 26, 37, 8, + 131, 40, 11, 12, 8, 44, 8, 36, 56, 33, + 106, 40, 8, 9, 10, 44, 80, 56, 47, 8, + 9, 8, 9, 10, 64, 65, 74, 37, 30, 58, + 41, 303, 236, 237, 63, 74, 65, 273, 67, 105, + 104, 52, 106, 109, 198, 69, 56, 76, 77, 321, + 15, 6, 288, 8, 9, 10, 103, 109, 104, 99, + 99, 109, 91, 11, 12, 113, 112, 112, 184, 102, + 109, 34, 120, 112, 113, 104, 108, 231, 105, 118, + 234, 120, 240, 103, 132, 201, 9, 105, 278, 101, + 45, 305, 131, 231, 84, 188, 234, 228, 102, 108, + 102, 113, 84, 80, 69, 60, 102, 311, 73, 105, + 158, 159, 214, 108, 109, 102, 105, 157, 157, 5, + 6, 7, 8, 9, 10, 11, 12, 104, 104, 106, + 246, 86, 6, 106, 8, 9, 10, 253, 57, 187, + 8, 105, 190, 11, 12, 109, 248, 195, 4, 303, + 198, 53, 200, 13, 14, 257, 84, 13, 14, 45, + 8, 9, 10, 11, 12, 3, 320, 321, 355, 385, + 357, 45, 46, 33, 213, 107, 105, 63, 46, 395, + 109, 21, 230, 231, 374, 287, 234, 61, 366, 13, + 14, 12, 308, 241, 314, 12, 39, 355, 318, 357, + 86, 240, 108, 20, 283, 284, 80, 286, 256, 69, + 105, 259, 86, 6, 109, 8, 9, 10, 104, 8, + 112, 95, 11, 12, 41, 105, 43, 105, 102, 109, + 104, 109, 106, 51, 105, 52, 81, 6, 109, 8, + 9, 10, 105, 103, 105, 105, 109, 81, 109, 109, + 11, 12, 45, 46, 81, 303, 71, 305, 97, 98, + 99, 100, 310, 11, 12, 13, 14, 3, 61, 3, + 109, 112, 320, 321, 104, 323, 45, 110, 110, 104, + 328, 97, 98, 99, 100, 8, 35, 80, 11, 12, + 338, 60, 104, 86, 104, 68, 104, 104, 3, 8, + 23, 112, 95, 112, 110, 25, 106, 106, 68, 68, + 105, 104, 103, 106, 30, 38, 355, 86, 357, 42, + 368, 109, 96, 106, 104, 48, 49, 50, 4, 95, + 111, 54, 380, 68, 106, 383, 59, 107, 113, 101, + 104, 64, 105, 66, 4, 82, 114, 88, 102, 107, + 107, 74, 107, 104, 107, 107, 0, 113, 0, 109, + 83, 107, 85, 3, 13, 11, 12, 90, 112, 92, + 93, 94, 18, 26, 56, 74, 22, 23, 24, 109, + 26, 27, 113, 323, 65, 278, 157, 134, 310, 305, + 36, 195, 301, 228, 40, 395, 233, 380, 44, 221, + 372, 47, 48, 49, 50, 320, 368, 259, -1, -1, + 56, -1, 58, 59, -1, -1, -1, 63, 64, 65, + 66, 67, -1, -1, -1, -1, -1, -1, 74, -1, + 76, 77, 78, 79, -1, -1, -1, 83, -1, 85, + -1, 87, 11, 12, 90, 91, 92, 93, 94, 18, + -1, -1, -1, 22, 23, 24, -1, 26, 27, -1, + -1, -1, -1, -1, -1, -1, -1, 36, -1, -1, + -1, 40, -1, -1, -1, 44, -1, -1, 47, 48, + 49, 50, -1, -1, -1, -1, -1, 56, -1, 58, + 59, -1, -1, -1, 63, 64, 65, 66, 67, -1, + -1, -1, 11, 12, -1, 74, -1, 76, 77, 78, + 79, -1, -1, 22, 83, 24, 85, 26, -1, 11, + 12, 90, 91, 92, 93, 94, -1, 36, -1, -1, + 22, 40, 24, -1, 26, 44, -1, -1, 47, -1, + -1, -1, -1, -1, 36, -1, -1, -1, 40, 58, + -1, -1, 44, -1, 63, 47, 65, -1, 67, -1, + -1, -1, -1, -1, -1, -1, 58, 76, 77, -1, + -1, 63, -1, 65, -1, 67, -1, -1, -1, -1, + -1, -1, 91, -1, 76, 77, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 91 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/share/bison.simple" @@ -1286,13 +1290,13 @@ yyparse(YYPARSE_PARAM_ARG) switch (yyn) { case 1: -#line 300 "asn1p_y.y" +#line 301 "asn1p_y.y" { *(void **)param = yyvsp[0].a_grammar; ; break;} case 2: -#line 306 "asn1p_y.y" +#line 307 "asn1p_y.y" { yyval.a_grammar = asn1p_new(); checkmem(yyval.a_grammar); @@ -1300,14 +1304,14 @@ case 2: ; break;} case 3: -#line 311 "asn1p_y.y" +#line 312 "asn1p_y.y" { yyval.a_grammar = yyvsp[-1].a_grammar; TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); ; break;} case 4: -#line 332 "asn1p_y.y" +#line 333 "asn1p_y.y" { if(yyvsp[-1].a_module) { @@ -1324,27 +1328,27 @@ case 4: ; break;} case 5: -#line 353 "asn1p_y.y" +#line 354 "asn1p_y.y" { yyval.a_oid = 0; ; break;} case 6: -#line 354 "asn1p_y.y" +#line 355 "asn1p_y.y" { yyval.a_oid = yyvsp[0].a_oid; ; break;} case 7: -#line 358 "asn1p_y.y" +#line 359 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; ; break;} case 8: -#line 361 "asn1p_y.y" +#line 362 "asn1p_y.y" { yyval.a_oid = 0; ; break;} case 9: -#line 367 "asn1p_y.y" +#line 368 "asn1p_y.y" { yyval.a_oid = asn1p_oid_new(); asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1353,7 +1357,7 @@ case 9: ; break;} case 10: -#line 373 "asn1p_y.y" +#line 374 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1362,74 +1366,74 @@ case 10: ; break;} case 11: -#line 382 "asn1p_y.y" +#line 383 "asn1p_y.y" { /* iso */ yyval.a_oid_arc.name = yyvsp[0].tv_str; yyval.a_oid_arc.number = -1; ; break;} case 12: -#line 386 "asn1p_y.y" +#line 387 "asn1p_y.y" { /* iso(1) */ yyval.a_oid_arc.name = yyvsp[-3].tv_str; yyval.a_oid_arc.number = yyvsp[-1].a_int; ; break;} case 13: -#line 390 "asn1p_y.y" +#line 391 "asn1p_y.y" { /* 1 */ yyval.a_oid_arc.name = 0; yyval.a_oid_arc.number = yyvsp[0].a_int; ; break;} case 14: -#line 400 "asn1p_y.y" +#line 401 "asn1p_y.y" { yyval.a_module_flags = MSF_NOFLAGS; ; break;} case 15: -#line 401 "asn1p_y.y" +#line 402 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; ; break;} case 16: -#line 410 "asn1p_y.y" +#line 411 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; ; break;} case 17: -#line 413 "asn1p_y.y" +#line 414 "asn1p_y.y" { yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags; ; break;} case 18: -#line 422 "asn1p_y.y" +#line 423 "asn1p_y.y" { yyval.a_module_flags = MSF_EXPLICIT_TAGS; ; break;} case 19: -#line 425 "asn1p_y.y" +#line 426 "asn1p_y.y" { yyval.a_module_flags = MSF_IMPLICIT_TAGS; ; break;} case 20: -#line 428 "asn1p_y.y" +#line 429 "asn1p_y.y" { yyval.a_module_flags = MSF_AUTOMATIC_TAGS; ; break;} case 21: -#line 431 "asn1p_y.y" +#line 432 "asn1p_y.y" { yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED; ; break;} case 22: -#line 435 "asn1p_y.y" +#line 436 "asn1p_y.y" { /* X.680Amd1 specifies TAG and XER */ if(strcmp(yyvsp[-1].tv_str, "TAG") == 0) { @@ -1447,23 +1451,23 @@ case 22: ; break;} case 23: -#line 456 "asn1p_y.y" +#line 457 "asn1p_y.y" { yyval.a_module = 0; ; break;} case 24: -#line 457 "asn1p_y.y" +#line 458 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 25: -#line 466 "asn1p_y.y" +#line 467 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 26: -#line 469 "asn1p_y.y" +#line 470 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; @@ -1493,13 +1497,13 @@ case 26: ; break;} case 27: -#line 502 "asn1p_y.y" +#line 503 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 28: -#line 505 "asn1p_y.y" +#line 506 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1511,7 +1515,7 @@ case 28: ; break;} case 29: -#line 514 "asn1p_y.y" +#line 515 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1521,7 +1525,7 @@ case 29: ; break;} case 30: -#line 521 "asn1p_y.y" +#line 522 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1531,7 +1535,7 @@ case 30: ; break;} case 31: -#line 534 "asn1p_y.y" +#line 535 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1541,11 +1545,11 @@ case 31: ; break;} case 32: -#line 542 "asn1p_y.y" +#line 543 "asn1p_y.y" { asn1p_lexer_hack_push_encoding_control(); ; break;} case 33: -#line 543 "asn1p_y.y" +#line 544 "asn1p_y.y" { fprintf(stderr, "WARNING: ENCODING-CONTROL %s " @@ -1556,7 +1560,7 @@ case 33: ; break;} case 34: -#line 555 "asn1p_y.y" +#line 556 "asn1p_y.y" { return yyerror( "Attempt to redefine a standard basic type, " @@ -1565,19 +1569,19 @@ case 34: ; break;} case 35: -#line 569 "asn1p_y.y" +#line 570 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; ; break;} case 36: -#line 575 "asn1p_y.y" +#line 576 "asn1p_y.y" { return yyerror("Empty IMPORTS list"); ; break;} case 37: -#line 581 "asn1p_y.y" +#line 582 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1585,14 +1589,14 @@ case 37: ; break;} case 38: -#line 586 "asn1p_y.y" +#line 587 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); ; break;} case 39: -#line 593 "asn1p_y.y" +#line 594 "asn1p_y.y" { yyval.a_xports = yyvsp[-3].a_xports; yyval.a_xports->from = yyvsp[-1].tv_str; @@ -1601,7 +1605,7 @@ case 39: ; break;} case 40: -#line 602 "asn1p_y.y" +#line 603 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); @@ -1609,14 +1613,14 @@ case 40: ; break;} case 41: -#line 607 "asn1p_y.y" +#line 608 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} case 42: -#line 614 "asn1p_y.y" +#line 615 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1625,7 +1629,7 @@ case 42: ; break;} case 43: -#line 620 "asn1p_y.y" +#line 621 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1634,19 +1638,19 @@ case 43: ; break;} case 44: -#line 629 "asn1p_y.y" +#line 630 "asn1p_y.y" { yyval.a_xports = yyvsp[-1].a_xports; ; break;} case 45: -#line 632 "asn1p_y.y" +#line 633 "asn1p_y.y" { yyval.a_xports = 0; ; break;} case 46: -#line 635 "asn1p_y.y" +#line 636 "asn1p_y.y" { /* Empty EXPORTS clause effectively prohibits export. */ yyval.a_xports = asn1p_xports_new(); @@ -1654,7 +1658,7 @@ case 46: ; break;} case 47: -#line 643 "asn1p_y.y" +#line 644 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); assert(yyval.a_xports); @@ -1662,14 +1666,14 @@ case 47: ; break;} case 48: -#line 648 "asn1p_y.y" +#line 649 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} case 49: -#line 655 "asn1p_y.y" +#line 656 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1678,7 +1682,7 @@ case 49: ; break;} case 50: -#line 661 "asn1p_y.y" +#line 662 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1687,7 +1691,7 @@ case 50: ; break;} case 51: -#line 671 "asn1p_y.y" +#line 672 "asn1p_y.y" { yyval.a_expr = yyvsp[-4].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1697,7 +1701,7 @@ case 51: ; break;} case 52: -#line 681 "asn1p_y.y" +#line 682 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1707,7 +1711,7 @@ case 52: ; break;} case 53: -#line 688 "asn1p_y.y" +#line 689 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1716,36 +1720,36 @@ case 53: ; break;} case 54: -#line 697 "asn1p_y.y" +#line 698 "asn1p_y.y" { ; break;} case 55: -#line 698 "asn1p_y.y" +#line 699 "asn1p_y.y" { ; break;} case 56: -#line 709 "asn1p_y.y" +#line 710 "asn1p_y.y" { ; break;} case 57: -#line 711 "asn1p_y.y" +#line 712 "asn1p_y.y" { ; break;} case 58: -#line 716 "asn1p_y.y" +#line 717 "asn1p_y.y" { ; break;} case 59: -#line 718 "asn1p_y.y" +#line 719 "asn1p_y.y" { ; break;} case 60: -#line 734 "asn1p_y.y" +#line 735 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1756,7 +1760,7 @@ case 60: ; break;} case 61: -#line 742 "asn1p_y.y" +#line 743 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -1765,7 +1769,7 @@ case 61: ; break;} case 62: -#line 748 "asn1p_y.y" +#line 749 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -1774,7 +1778,7 @@ case 62: ; break;} case 63: -#line 764 "asn1p_y.y" +#line 765 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1784,7 +1788,7 @@ case 63: ; break;} case 64: -#line 774 "asn1p_y.y" +#line 775 "asn1p_y.y" { int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); @@ -1796,7 +1800,7 @@ case 64: ; break;} case 65: -#line 783 "asn1p_y.y" +#line 784 "asn1p_y.y" { int ret; yyval.a_plist = yyvsp[-2].a_plist; @@ -1807,14 +1811,14 @@ case 65: ; break;} case 66: -#line 794 "asn1p_y.y" +#line 795 "asn1p_y.y" { yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} case 67: -#line 798 "asn1p_y.y" +#line 799 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1824,7 +1828,7 @@ case 67: ; break;} case 68: -#line 805 "asn1p_y.y" +#line 806 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1835,7 +1839,7 @@ case 68: ; break;} case 69: -#line 816 "asn1p_y.y" +#line 817 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1843,20 +1847,20 @@ case 69: ; break;} case 70: -#line 821 "asn1p_y.y" +#line 822 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 71: -#line 828 "asn1p_y.y" +#line 829 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 72: -#line 831 "asn1p_y.y" +#line 832 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1866,7 +1870,7 @@ case 72: ; break;} case 73: -#line 844 "asn1p_y.y" +#line 845 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1874,14 +1878,14 @@ case 73: ; break;} case 74: -#line 849 "asn1p_y.y" +#line 850 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 75: -#line 856 "asn1p_y.y" +#line 857 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1890,7 +1894,7 @@ case 75: ; break;} case 76: -#line 862 "asn1p_y.y" +#line 863 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1900,13 +1904,13 @@ case 76: ; break;} case 77: -#line 869 "asn1p_y.y" +#line 870 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 78: -#line 875 "asn1p_y.y" +#line 876 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1914,14 +1918,14 @@ case 78: ; break;} case 79: -#line 880 "asn1p_y.y" +#line 881 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 80: -#line 887 "asn1p_y.y" +#line 888 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1929,13 +1933,13 @@ case 80: ; break;} case 81: -#line 892 "asn1p_y.y" +#line 893 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 82: -#line 898 "asn1p_y.y" +#line 899 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); @@ -1945,15 +1949,15 @@ case 82: ; break;} case 83: -#line 908 "asn1p_y.y" +#line 909 "asn1p_y.y" { yyval.a_int = 0; ; break;} case 84: -#line 909 "asn1p_y.y" +#line 910 "asn1p_y.y" { yyval.a_int = 1; ; break;} case 85: -#line 913 "asn1p_y.y" +#line 914 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1963,14 +1967,14 @@ case 85: ; break;} case 86: -#line 920 "asn1p_y.y" +#line 921 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 87: -#line 927 "asn1p_y.y" +#line 928 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1981,7 +1985,7 @@ case 87: ; break;} case 88: -#line 935 "asn1p_y.y" +#line 936 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; yyval.a_expr->Identifier = yyvsp[-3].a_refcomp.name; @@ -1990,7 +1994,7 @@ case 88: ; break;} case 89: -#line 941 "asn1p_y.y" +#line 942 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2008,47 +2012,47 @@ case 89: ; break;} case 90: -#line 959 "asn1p_y.y" +#line 960 "asn1p_y.y" { yyval.a_wsynt = 0; ; break;} case 91: -#line 960 "asn1p_y.y" +#line 961 "asn1p_y.y" { yyval.a_wsynt = yyvsp[0].a_wsynt; ; break;} case 92: -#line 967 "asn1p_y.y" +#line 968 "asn1p_y.y" { asn1p_lexer_hack_enable_with_syntax(); ; break;} case 93: -#line 969 "asn1p_y.y" +#line 970 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; ; break;} case 94: -#line 975 "asn1p_y.y" +#line 976 "asn1p_y.y" { yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} case 95: -#line 979 "asn1p_y.y" +#line 980 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} case 96: -#line 986 "asn1p_y.y" +#line 987 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); ; break;} case 97: -#line 989 "asn1p_y.y" +#line 990 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2060,7 +2064,7 @@ case 97: ; break;} case 98: -#line 1001 "asn1p_y.y" +#line 1002 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2071,7 +2075,7 @@ case 98: ; break;} case 99: -#line 1009 "asn1p_y.y" +#line 1010 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2083,7 +2087,7 @@ case 99: ; break;} case 100: -#line 1018 "asn1p_y.y" +#line 1019 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2095,7 +2099,7 @@ case 100: ; break;} case 101: -#line 1030 "asn1p_y.y" +#line 1031 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; yyval.a_expr->tag = yyvsp[-2].a_tag; @@ -2117,13 +2121,13 @@ case 101: ; break;} case 102: -#line 1052 "asn1p_y.y" +#line 1053 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 103: -#line 1055 "asn1p_y.y" +#line 1056 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2132,7 +2136,7 @@ case 103: ; break;} case 104: -#line 1061 "asn1p_y.y" +#line 1062 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2141,7 +2145,7 @@ case 104: ; break;} case 105: -#line 1067 "asn1p_y.y" +#line 1068 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2150,7 +2154,7 @@ case 105: ; break;} case 106: -#line 1073 "asn1p_y.y" +#line 1074 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2159,31 +2163,33 @@ case 106: ; break;} case 107: -#line 1079 "asn1p_y.y" +#line 1080 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); - yyval.a_expr->constraints = yyvsp[-3].a_constr; + yyval.a_expr->constraints = yyvsp[-4].a_constr; yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE_OF; yyval.a_expr->meta_type = AMT_TYPE; + yyvsp[0].a_expr->Identifier = yyvsp[-2].tv_str; yyvsp[0].a_expr->tag = yyvsp[-1].a_tag; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 108: -#line 1088 "asn1p_y.y" +#line 1090 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); - yyval.a_expr->constraints = yyvsp[-3].a_constr; + yyval.a_expr->constraints = yyvsp[-4].a_constr; yyval.a_expr->expr_type = ASN_CONSTR_SET_OF; yyval.a_expr->meta_type = AMT_TYPE; + yyvsp[0].a_expr->Identifier = yyvsp[-2].tv_str; yyvsp[0].a_expr->tag = yyvsp[-1].a_tag; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 109: -#line 1097 "asn1p_y.y" +#line 1100 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2192,7 +2198,7 @@ case 109: ; break;} case 110: -#line 1103 "asn1p_y.y" +#line 1106 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2206,7 +2212,7 @@ case 110: ; break;} case 111: -#line 1117 "asn1p_y.y" +#line 1120 "asn1p_y.y" { int ret; yyval.a_expr = yyvsp[-1].a_expr; @@ -2223,7 +2229,7 @@ case 111: ; break;} case 112: -#line 1141 "asn1p_y.y" +#line 1144 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2233,7 +2239,7 @@ case 112: ; break;} case 113: -#line 1148 "asn1p_y.y" +#line 1151 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2243,7 +2249,7 @@ case 113: ; break;} case 114: -#line 1163 "asn1p_y.y" +#line 1166 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2254,7 +2260,7 @@ case 114: ; break;} case 115: -#line 1171 "asn1p_y.y" +#line 1174 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2267,7 +2273,7 @@ case 115: ; break;} case 116: -#line 1181 "asn1p_y.y" +#line 1184 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2280,7 +2286,7 @@ case 116: ; break;} case 117: -#line 1191 "asn1p_y.y" +#line 1194 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2293,7 +2299,7 @@ case 117: ; break;} case 118: -#line 1201 "asn1p_y.y" +#line 1204 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2304,7 +2310,7 @@ case 118: ; break;} case 119: -#line 1209 "asn1p_y.y" +#line 1212 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[0].a_ref; @@ -2326,7 +2332,7 @@ case 119: ; break;} case 120: -#line 1231 "asn1p_y.y" +#line 1234 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2337,7 +2343,7 @@ case 120: ; break;} case 121: -#line 1239 "asn1p_y.y" +#line 1242 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[-2].a_ref; @@ -2347,21 +2353,21 @@ case 121: ; break;} case 124: -#line 1253 "asn1p_y.y" +#line 1256 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} case 125: -#line 1258 "asn1p_y.y" +#line 1261 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} case 126: -#line 1271 "asn1p_y.y" +#line 1274 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); @@ -2371,7 +2377,7 @@ case 126: ; break;} case 127: -#line 1281 "asn1p_y.y" +#line 1284 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2381,11 +2387,11 @@ case 127: ; break;} case 128: -#line 1288 "asn1p_y.y" +#line 1291 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} case 129: -#line 1288 "asn1p_y.y" +#line 1291 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); @@ -2393,7 +2399,7 @@ case 129: ; break;} case 130: -#line 1293 "asn1p_y.y" +#line 1296 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2401,7 +2407,7 @@ case 130: ; break;} case 131: -#line 1298 "asn1p_y.y" +#line 1301 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2409,7 +2415,7 @@ case 131: ; break;} case 132: -#line 1303 "asn1p_y.y" +#line 1306 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2417,40 +2423,40 @@ case 132: ; break;} case 133: -#line 1308 "asn1p_y.y" +#line 1311 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); ; break;} case 134: -#line 1312 "asn1p_y.y" +#line 1315 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); ; break;} case 135: -#line 1316 "asn1p_y.y" +#line 1319 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} case 136: -#line 1320 "asn1p_y.y" +#line 1323 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 137: -#line 1323 "asn1p_y.y" +#line 1326 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 138: -#line 1329 "asn1p_y.y" +#line 1332 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2464,7 +2470,7 @@ case 138: ; break;} case 139: -#line 1340 "asn1p_y.y" +#line 1343 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2481,7 +2487,7 @@ case 139: ; break;} case 140: -#line 1357 "asn1p_y.y" +#line 1360 "asn1p_y.y" { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 2; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); @@ -2494,7 +2500,7 @@ case 140: ; break;} case 141: -#line 1367 "asn1p_y.y" +#line 1370 "asn1p_y.y" { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); @@ -2509,67 +2515,67 @@ case 141: ; break;} case 142: -#line 1382 "asn1p_y.y" +#line 1385 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BOOLEAN; ; break;} case 143: -#line 1383 "asn1p_y.y" +#line 1386 "asn1p_y.y" { yyval.a_type = ASN_BASIC_NULL; ; break;} case 144: -#line 1384 "asn1p_y.y" +#line 1387 "asn1p_y.y" { yyval.a_type = ASN_BASIC_REAL; ; break;} case 145: -#line 1385 "asn1p_y.y" +#line 1388 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} case 146: -#line 1386 "asn1p_y.y" +#line 1389 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OCTET_STRING; ; break;} case 147: -#line 1387 "asn1p_y.y" +#line 1390 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; break;} case 148: -#line 1388 "asn1p_y.y" +#line 1391 "asn1p_y.y" { yyval.a_type = ASN_BASIC_RELATIVE_OID; ; break;} case 149: -#line 1389 "asn1p_y.y" +#line 1392 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EXTERNAL; ; break;} case 150: -#line 1390 "asn1p_y.y" +#line 1393 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; break;} case 151: -#line 1391 "asn1p_y.y" +#line 1394 "asn1p_y.y" { yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; break;} case 152: -#line 1392 "asn1p_y.y" +#line 1395 "asn1p_y.y" { yyval.a_type = ASN_BASIC_UTCTime; ; break;} case 153: -#line 1393 "asn1p_y.y" +#line 1396 "asn1p_y.y" { yyval.a_type = ASN_BASIC_GeneralizedTime; ; break;} case 154: -#line 1400 "asn1p_y.y" +#line 1403 "asn1p_y.y" { yyval.a_type = ASN_BASIC_INTEGER; ; break;} case 155: -#line 1401 "asn1p_y.y" +#line 1404 "asn1p_y.y" { yyval.a_type = ASN_BASIC_ENUMERATED; ; break;} case 156: -#line 1402 "asn1p_y.y" +#line 1405 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BIT_STRING; ; break;} case 157: -#line 1406 "asn1p_y.y" +#line 1409 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2578,7 +2584,7 @@ case 157: ; break;} case 158: -#line 1412 "asn1p_y.y" +#line 1415 "asn1p_y.y" { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; @@ -2591,91 +2597,91 @@ case 158: ; break;} case 159: -#line 1425 "asn1p_y.y" +#line 1428 "asn1p_y.y" { yyval.a_type = ASN_STRING_BMPString; ; break;} case 160: -#line 1426 "asn1p_y.y" +#line 1429 "asn1p_y.y" { yyval.a_type = ASN_STRING_GeneralString; fprintf(stderr, "WARNING: GeneralString is not fully supported\n"); ; break;} case 161: -#line 1430 "asn1p_y.y" +#line 1433 "asn1p_y.y" { yyval.a_type = ASN_STRING_GraphicString; fprintf(stderr, "WARNING: GraphicString is not fully supported\n"); ; break;} case 162: -#line 1434 "asn1p_y.y" +#line 1437 "asn1p_y.y" { yyval.a_type = ASN_STRING_IA5String; ; break;} case 163: -#line 1435 "asn1p_y.y" +#line 1438 "asn1p_y.y" { yyval.a_type = ASN_STRING_ISO646String; ; break;} case 164: -#line 1436 "asn1p_y.y" +#line 1439 "asn1p_y.y" { yyval.a_type = ASN_STRING_NumericString; ; break;} case 165: -#line 1437 "asn1p_y.y" +#line 1440 "asn1p_y.y" { yyval.a_type = ASN_STRING_PrintableString; ; break;} case 166: -#line 1438 "asn1p_y.y" +#line 1441 "asn1p_y.y" { yyval.a_type = ASN_STRING_T61String; fprintf(stderr, "WARNING: T61String is not fully supported\n"); ; break;} case 167: -#line 1442 "asn1p_y.y" +#line 1445 "asn1p_y.y" { yyval.a_type = ASN_STRING_TeletexString; ; break;} case 168: -#line 1443 "asn1p_y.y" +#line 1446 "asn1p_y.y" { yyval.a_type = ASN_STRING_UniversalString; ; break;} case 169: -#line 1444 "asn1p_y.y" +#line 1447 "asn1p_y.y" { yyval.a_type = ASN_STRING_UTF8String; ; break;} case 170: -#line 1445 "asn1p_y.y" +#line 1448 "asn1p_y.y" { yyval.a_type = ASN_STRING_VideotexString; fprintf(stderr, "WARNING: VideotexString is not fully supported\n"); ; break;} case 171: -#line 1449 "asn1p_y.y" +#line 1452 "asn1p_y.y" { yyval.a_type = ASN_STRING_VisibleString; ; break;} case 172: -#line 1450 "asn1p_y.y" +#line 1453 "asn1p_y.y" { yyval.a_type = ASN_STRING_ObjectDescriptor; ; break;} case 178: -#line 1462 "asn1p_y.y" +#line 1465 "asn1p_y.y" { yyval.a_constr = 0; ; break;} case 179: -#line 1463 "asn1p_y.y" +#line 1466 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 180: -#line 1469 "asn1p_y.y" +#line 1472 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); ; break;} case 181: -#line 1472 "asn1p_y.y" +#line 1475 "asn1p_y.y" { /* * This is a special case, for compatibility purposes. @@ -2685,25 +2691,25 @@ case 181: ; break;} case 182: -#line 1482 "asn1p_y.y" +#line 1485 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; ; break;} case 183: -#line 1485 "asn1p_y.y" +#line 1488 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} case 184: -#line 1491 "asn1p_y.y" +#line 1494 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 185: -#line 1494 "asn1p_y.y" +#line 1497 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2712,7 +2718,7 @@ case 185: ; break;} case 186: -#line 1500 "asn1p_y.y" +#line 1503 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2723,31 +2729,31 @@ case 186: ; break;} case 187: -#line 1511 "asn1p_y.y" +#line 1514 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 188: -#line 1514 "asn1p_y.y" +#line 1517 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 189: -#line 1517 "asn1p_y.y" +#line 1520 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 190: -#line 1520 "asn1p_y.y" +#line 1523 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 191: -#line 1526 "asn1p_y.y" +#line 1529 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2758,7 +2764,7 @@ case 191: ; break;} case 192: -#line 1534 "asn1p_y.y" +#line 1537 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2769,7 +2775,7 @@ case 192: ; break;} case 193: -#line 1542 "asn1p_y.y" +#line 1545 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2778,7 +2784,7 @@ case 193: ; break;} case 194: -#line 1548 "asn1p_y.y" +#line 1551 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2788,7 +2794,7 @@ case 194: ; break;} case 195: -#line 1555 "asn1p_y.y" +#line 1558 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2799,7 +2805,7 @@ case 195: ; break;} case 196: -#line 1563 "asn1p_y.y" +#line 1566 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2810,7 +2816,7 @@ case 196: ; break;} case 197: -#line 1571 "asn1p_y.y" +#line 1574 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2822,53 +2828,53 @@ case 197: ; break;} case 198: -#line 1580 "asn1p_y.y" +#line 1583 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 199: -#line 1583 "asn1p_y.y" +#line 1586 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 200: -#line 1589 "asn1p_y.y" +#line 1592 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RANGE; ; break;} case 201: -#line 1590 "asn1p_y.y" +#line 1593 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RLRANGE; ; break;} case 202: -#line 1591 "asn1p_y.y" +#line 1594 "asn1p_y.y" { yyval.a_ctype = ACT_EL_LLRANGE; ; break;} case 203: -#line 1592 "asn1p_y.y" +#line 1595 "asn1p_y.y" { yyval.a_ctype = ACT_EL_ULRANGE; ; break;} case 204: -#line 1596 "asn1p_y.y" +#line 1599 "asn1p_y.y" { yyval.a_ctype = ACT_CT_SIZE; ; break;} case 205: -#line 1599 "asn1p_y.y" +#line 1602 "asn1p_y.y" { yyval.a_ctype = ACT_CT_FROM; ; break;} case 206: -#line 1605 "asn1p_y.y" +#line 1608 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 207: -#line 1608 "asn1p_y.y" +#line 1611 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2882,14 +2888,14 @@ case 207: ; break;} case 208: -#line 1619 "asn1p_y.y" +#line 1622 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} case 209: -#line 1623 "asn1p_y.y" +#line 1626 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2897,7 +2903,7 @@ case 209: ; break;} case 210: -#line 1628 "asn1p_y.y" +#line 1631 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); @@ -2905,25 +2911,25 @@ case 210: ; break;} case 211: -#line 1636 "asn1p_y.y" +#line 1639 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); ; break;} case 212: -#line 1642 "asn1p_y.y" +#line 1645 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 213: -#line 1645 "asn1p_y.y" +#line 1648 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 214: -#line 1651 "asn1p_y.y" +#line 1654 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2931,7 +2937,7 @@ case 214: ; break;} case 215: -#line 1656 "asn1p_y.y" +#line 1659 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2941,45 +2947,45 @@ case 215: ; break;} case 216: -#line 1669 "asn1p_y.y" +#line 1672 "asn1p_y.y" { yyval.a_pres = ACPRES_DEFAULT; ; break;} case 217: -#line 1670 "asn1p_y.y" +#line 1673 "asn1p_y.y" { yyval.a_pres = yyvsp[0].a_pres; ; break;} case 218: -#line 1674 "asn1p_y.y" +#line 1677 "asn1p_y.y" { yyval.a_pres = ACPRES_PRESENT; ; break;} case 219: -#line 1677 "asn1p_y.y" +#line 1680 "asn1p_y.y" { yyval.a_pres = ACPRES_ABSENT; ; break;} case 220: -#line 1680 "asn1p_y.y" +#line 1683 "asn1p_y.y" { yyval.a_pres = ACPRES_OPTIONAL; ; break;} case 221: -#line 1686 "asn1p_y.y" +#line 1689 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 222: -#line 1689 "asn1p_y.y" +#line 1692 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 223: -#line 1698 "asn1p_y.y" +#line 1701 "asn1p_y.y" { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; @@ -2994,13 +3000,13 @@ case 223: ; break;} case 224: -#line 1713 "asn1p_y.y" +#line 1716 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} case 225: -#line 1719 "asn1p_y.y" +#line 1722 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3009,7 +3015,7 @@ case 225: ; break;} case 226: -#line 1725 "asn1p_y.y" +#line 1728 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3020,7 +3026,7 @@ case 226: ; break;} case 227: -#line 1739 "asn1p_y.y" +#line 1742 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; @@ -3034,7 +3040,7 @@ case 227: ; break;} case 228: -#line 1750 "asn1p_y.y" +#line 1753 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; @@ -3049,13 +3055,13 @@ case 228: ; break;} case 229: -#line 1766 "asn1p_y.y" +#line 1769 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} case 230: -#line 1769 "asn1p_y.y" +#line 1772 "asn1p_y.y" { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); @@ -3067,45 +3073,45 @@ case 230: ; break;} case 231: -#line 1787 "asn1p_y.y" +#line 1790 "asn1p_y.y" { yyval.a_marker.flags = EM_NOMARK; yyval.a_marker.default_value = 0; ; break;} case 232: -#line 1791 "asn1p_y.y" +#line 1794 "asn1p_y.y" { yyval.a_marker = yyvsp[0].a_marker; ; break;} case 233: -#line 1795 "asn1p_y.y" +#line 1798 "asn1p_y.y" { yyval.a_marker.flags = EM_OPTIONAL; yyval.a_marker.default_value = 0; ; break;} case 234: -#line 1799 "asn1p_y.y" +#line 1802 "asn1p_y.y" { yyval.a_marker.flags = EM_DEFAULT; yyval.a_marker.default_value = yyvsp[0].a_value; ; break;} case 235: -#line 1822 "asn1p_y.y" +#line 1825 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); ; break;} case 236: -#line 1826 "asn1p_y.y" +#line 1829 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; ; break;} case 237: -#line 1832 "asn1p_y.y" +#line 1835 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3113,14 +3119,14 @@ case 237: ; break;} case 238: -#line 1837 "asn1p_y.y" +#line 1840 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 239: -#line 1844 "asn1p_y.y" +#line 1847 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3130,7 +3136,7 @@ case 239: ; break;} case 240: -#line 1851 "asn1p_y.y" +#line 1854 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3141,7 +3147,7 @@ case 240: ; break;} case 241: -#line 1859 "asn1p_y.y" +#line 1862 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3152,7 +3158,7 @@ case 241: ; break;} case 242: -#line 1867 "asn1p_y.y" +#line 1870 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3162,7 +3168,7 @@ case 242: ; break;} case 243: -#line 1874 "asn1p_y.y" +#line 1877 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3173,71 +3179,81 @@ case 243: ; break;} case 244: -#line 1885 "asn1p_y.y" +#line 1888 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} case 245: -#line 1889 "asn1p_y.y" +#line 1892 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} case 246: -#line 1920 "asn1p_y.y" +#line 1923 "asn1p_y.y" { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; break;} case 247: -#line 1921 "asn1p_y.y" +#line 1924 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; ; break;} case 248: -#line 1925 "asn1p_y.y" +#line 1928 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; yyval.a_tag.tag_mode = TM_DEFAULT; ; break;} case 249: -#line 1929 "asn1p_y.y" +#line 1932 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_IMPLICIT; ; break;} case 250: -#line 1933 "asn1p_y.y" +#line 1936 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_EXPLICIT; ; break;} case 251: -#line 1940 "asn1p_y.y" +#line 1943 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} case 252: -#line 1944 "asn1p_y.y" +#line 1947 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} case 253: -#line 1952 "asn1p_y.y" +#line 1955 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} case 254: -#line 1959 "asn1p_y.y" +#line 1962 "asn1p_y.y" +{ yyval.tv_str = 0; ; + break;} +case 255: +#line 1963 "asn1p_y.y" +{ + yyval.tv_str = yyvsp[0].tv_str; + ; + break;} +case 256: +#line 1968 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; @@ -3465,7 +3481,7 @@ case 254: } return 1; } -#line 1965 "asn1p_y.y" +#line 1974 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index ae63090ea..1fe3c910b 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -250,6 +250,7 @@ static asn1p_value_t * %type TypeRefName %type ObjectClassReference %type Identifier +%type optIdentifier %type ParameterArgumentName %type ParameterArgumentList %type ActualParameter @@ -1076,23 +1077,25 @@ TypeDeclaration: $$->expr_type = ASN_CONSTR_SET; $$->meta_type = AMT_TYPE; } - | TOK_SEQUENCE optConstraints TOK_OF optTag TypeDeclaration { + | TOK_SEQUENCE optConstraints TOK_OF optIdentifier optTag TypeDeclaration { $$ = asn1p_expr_new(yylineno); checkmem($$); $$->constraints = $2; $$->expr_type = ASN_CONSTR_SEQUENCE_OF; $$->meta_type = AMT_TYPE; - $5->tag = $4; - asn1p_expr_add($$, $5); + $6->Identifier = $4; + $6->tag = $5; + asn1p_expr_add($$, $6); } - | TOK_SET optConstraints TOK_OF optTag TypeDeclaration { + | TOK_SET optConstraints TOK_OF optIdentifier optTag TypeDeclaration { $$ = asn1p_expr_new(yylineno); checkmem($$); $$->constraints = $2; $$->expr_type = ASN_CONSTR_SET_OF; $$->meta_type = AMT_TYPE; - $5->tag = $4; - asn1p_expr_add($$, $5); + $6->Identifier = $4; + $6->tag = $5; + asn1p_expr_add($$, $6); } | TOK_ANY { $$ = asn1p_expr_new(yylineno); @@ -1955,6 +1958,12 @@ ObjectClassReference: } ; +optIdentifier: + { $$ = 0; } + | Identifier { + $$ = $1; + } + Identifier: TOK_identifier { checkmem($1); From cbebb81cd4625de826089b9eabdfb7632cadff22 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 22 Sep 2004 16:05:13 +0000 Subject: [PATCH 0364/1469] libasn1fix api change git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@364 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_constraint.c | 4 ++-- libasn1compiler/asn1c_misc.c | 3 +-- libasn1print/asn1print.c | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index 5147806f3..7de5e54d0 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -365,7 +365,7 @@ emit_alphabet_check_loop(arg_t *arg, asn1cnst_range_t *range) { asn1_integer_t natural_stop; asn1p_expr_t *terminal; - terminal = asn1f_find_terminal_type_ex(arg->asn, arg->mod, arg->expr); + terminal = asn1f_find_terminal_type_ex(arg->asn, arg->expr); if(terminal) { OUT("/* The underlying type is %s */\n", ASN_EXPR_TYPE2STR(terminal->expr_type)); @@ -622,7 +622,7 @@ emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype, asn1cnst_rang static asn1p_expr_type_e _find_terminal_type(arg_t *arg) { asn1p_expr_t *expr; - expr = asn1f_find_terminal_type_ex(arg->asn, arg->mod, arg->expr); + expr = asn1f_find_terminal_type_ex(arg->asn, arg->expr); if(expr) return expr->expr_type; return A1TC_INVALID; } diff --git a/libasn1compiler/asn1c_misc.c b/libasn1compiler/asn1c_misc.c index 86edb52bd..a1dbbd898 100644 --- a/libasn1compiler/asn1c_misc.c +++ b/libasn1compiler/asn1c_misc.c @@ -119,8 +119,7 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { * ("struct foo" instead of "foo_t"). */ asn1p_expr_t *terminal; - terminal = asn1f_find_terminal_type_ex( - arg->asn, arg->mod, expr); + terminal = asn1f_find_terminal_type_ex(arg->asn, expr); if(terminal && terminal == top_parent) { _format = TNF_RSAFE; } diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index 1237f64c4..e314defd4 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -596,7 +596,7 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri asn1print_constraint(tc->combined_constraints, flags); } - top_parent = asn1f_find_terminal_type_ex(asn, mod, tc); + top_parent = asn1f_find_terminal_type_ex(asn, tc); if(top_parent) { printf("\n-- Practical constraints (%s): ", top_parent->Identifier); From 39ba4c41d5ed916a957d28fe3a5027ce80cbed5a Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 22 Sep 2004 16:06:28 +0000 Subject: [PATCH 0365/1469] XER support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@365 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-22.c | 11 +- asn1c/tests/check-31.c | 1 + asn1c/tests/check-35.c | 7 +- asn1c/tests/check-41.c | 49 +- asn1c/tests/check-48.c | 4 +- libasn1compiler/asn1c_C.c | 258 +++-- skeletons/ANY.c | 28 +- skeletons/ANY.h | 5 +- skeletons/BIT_STRING.c | 68 +- skeletons/BIT_STRING.h | 1 + skeletons/BMPString.c | 78 +- skeletons/BMPString.h | 3 +- skeletons/BOOLEAN.c | 34 +- skeletons/BOOLEAN.h | 5 +- skeletons/ENUMERATED.c | 7 +- skeletons/GeneralString.c | 7 +- skeletons/GeneralizedTime.c | 41 +- skeletons/GeneralizedTime.h | 3 +- skeletons/GraphicString.c | 7 +- skeletons/IA5String.c | 8 +- skeletons/INTEGER.c | 71 +- skeletons/INTEGER.h | 5 +- skeletons/ISO646String.c | 7 +- skeletons/NULL.c | 36 +- skeletons/NULL.h | 3 +- skeletons/NativeEnumerated.c | 7 +- skeletons/NativeInteger.c | 34 +- skeletons/NativeInteger.h | 5 +- skeletons/NativeReal.c | 55 +- skeletons/NativeReal.h | 5 +- skeletons/NumericString.c | 7 +- skeletons/OBJECT_IDENTIFIER.c | 119 ++- skeletons/OBJECT_IDENTIFIER.h | 9 +- skeletons/OCTET_STRING.c | 96 +- skeletons/OCTET_STRING.h | 8 +- skeletons/ObjectDescriptor.c | 7 +- skeletons/PrintableString.c | 7 +- skeletons/REAL.c | 107 +- skeletons/REAL.h | 3 + skeletons/RELATIVE-OID.c | 69 +- skeletons/RELATIVE-OID.h | 1 + skeletons/T61String.c | 7 +- skeletons/TeletexString.c | 7 +- skeletons/UTCTime.c | 37 +- skeletons/UTCTime.h | 3 +- skeletons/UTF8String.c | 7 +- skeletons/UTF8String.h | 2 +- skeletons/UniversalString.c | 85 +- skeletons/UniversalString.h | 3 +- skeletons/VideotexString.c | 7 +- skeletons/VisibleString.c | 7 +- skeletons/asn_SEQUENCE_OF.c | 1 + skeletons/asn_SET_OF.c | 1 + skeletons/asn_internal.h | 72 ++ skeletons/asn_types.h | 30 - skeletons/ber_decoder.c | 1 + skeletons/ber_tlv_length.c | 1 + skeletons/ber_tlv_tag.c | 1 + skeletons/constr_CHOICE.c | 58 +- skeletons/constr_CHOICE.h | 5 +- skeletons/constr_SEQUENCE.c | 51 +- skeletons/constr_SEQUENCE.h | 5 +- skeletons/constr_SEQUENCE_OF.c | 52 +- skeletons/constr_SEQUENCE_OF.h | 5 +- skeletons/constr_SET.c | 55 +- skeletons/constr_SET.h | 5 +- skeletons/constr_SET_OF.c | 52 +- skeletons/constr_SET_OF.h | 8 +- skeletons/constr_TYPE.c | 6 + skeletons/constr_TYPE.h | 51 +- skeletons/constraints.c | 1 + skeletons/der_encoder.c | 3 +- skeletons/der_encoder.h | 27 +- skeletons/file-dependencies | 2 + skeletons/tests/check-GeneralizedTime.c | 18 +- skeletons/tests/check-UTCTime.c | 18 +- skeletons/tests/check-length.c | 2 +- skeletons/xer_encoder.c | 71 ++ skeletons/xer_encoder.h | 51 + tests/19-param-OK.asn1.-P | 26 +- tests/31-set-of-OK.asn1.-P | 39 +- tests/32-sequence-of-OK.asn1.-P | 182 ++++ tests/39-sequence-of-OK.asn1.-P | 19 +- tests/42-real-life-OK.asn1.-PR | 64 +- tests/43-recursion-OK.asn1.-P | 33 +- tests/44-choice-in-sequence-OK.asn1.-P | 24 +- tests/46-redefine-OK.asn1.-PR | 104 +- tests/47-set-ext-OK.asn1.-P | 24 +- tests/50-constraint-OK.asn1.-P | 1127 +++++++++++++------- tests/60-any-OK.asn1.-P | 12 +- tests/65-multi-tag-OK.asn1.-P | 349 +++--- tests/65-multi-tag-OK.asn1.-Pfnative-types | 349 +++--- tests/66-ref-simple-OK.asn1 | 4 +- tests/66-ref-simple-OK.asn1.-P | 56 +- 94 files changed, 3257 insertions(+), 1259 deletions(-) create mode 100644 skeletons/asn_internal.h create mode 100644 skeletons/xer_encoder.c create mode 100644 skeletons/xer_encoder.h create mode 100644 tests/32-sequence-of-OK.asn1.-P diff --git a/asn1c/tests/check-22.c b/asn1c/tests/check-22.c index 022278220..6a3538033 100644 --- a/asn1c/tests/check-22.c +++ b/asn1c/tests/check-22.c @@ -48,7 +48,8 @@ static void check(int is_ok, uint8_t *buf, int size, size_t consumed) { T1_t t, *tp; ber_dec_rval_t rval; - der_enc_rval_t erval; + asn_enc_rval_t erval; + int ret; int i; tp = memset(&t, 0, sizeof(t)); @@ -104,8 +105,12 @@ check(int is_ok, uint8_t *buf, int size, size_t consumed) { assert(buf1[i] == buf2[i]); } - fprintf(stderr, "=== PRINT ===\n"); - asn_fprint(stderr, &asn1_DEF_T1, tp); + fprintf(stderr, "=== asn_fprint() ===\n"); + ret = asn_fprint(stderr, &asn1_DEF_T1, tp); + assert(ret == 0); + fprintf(stderr, "=== xer_fprint() ===\n"); + ret = xer_fprint(stderr, &asn1_DEF_T1, tp); + assert(ret == 0); fprintf(stderr, "=== EOF ===\n"); } diff --git a/asn1c/tests/check-31.c b/asn1c/tests/check-31.c index 4b13f080d..b0a47b981 100644 --- a/asn1c/tests/check-31.c +++ b/asn1c/tests/check-31.c @@ -136,6 +136,7 @@ check(int is_ok, uint8_t *buf, int size, size_t consumed) { assert(buf_pos == sizeof(buf1_reconstr)); asn_fprint(stderr, &asn1_DEF_Forest, &t); + xer_fprint(stderr, &asn1_DEF_Forest, &t); asn1_DEF_Forest.free_struct(&asn1_DEF_Forest, &t, 1); } diff --git a/asn1c/tests/check-35.c b/asn1c/tests/check-35.c index 1d260f080..bc2239460 100644 --- a/asn1c/tests/check-35.c +++ b/asn1c/tests/check-35.c @@ -131,6 +131,9 @@ check(T_t *tp, uint8_t *buf, int size, size_t consumed) { assert(strcmp(tp->a.buf, "ns") == 0); assert(strcmp(tp->b.choice.b1.buf, "z") == 0 && strcmp(tp->b.choice.b2.buf, "z") == 0); + + asn_fprint(stderr, &asn1_DEF_T, tp); + xer_fprint(stderr, &asn1_DEF_T, tp); } size_t buf_pos; @@ -157,7 +160,7 @@ buf_fill(const void *buffer, size_t size, void *app_key) { static void compare(T_t *tp, uint8_t *cmp_buf, int cmp_buf_size) { - der_enc_rval_t erval; + asn_enc_rval_t erval; int i; buf_size = cmp_buf_size + 100; @@ -268,12 +271,10 @@ main(int ac, char **av) { check(&t, buf1, sizeof(buf1) + 10, sizeof(buf1)); compare(&t, buf1_reconstr, sizeof(buf1_reconstr)); - asn_fprint(stderr, &asn1_DEF_T, &t); asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); check(&t, buf2, sizeof(buf2) + 10, sizeof(buf2)); compare(&t, buf2_reconstr, sizeof(buf2_reconstr)); - asn_fprint(stderr, &asn1_DEF_T, &t); asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); /* Split the buffer in parts and check decoder restartability */ diff --git a/asn1c/tests/check-41.c b/asn1c/tests/check-41.c index fc2ce66f1..33634e865 100644 --- a/asn1c/tests/check-41.c +++ b/asn1c/tests/check-41.c @@ -132,10 +132,11 @@ uint8_t buf2_reconstr[] = { static void check(T_t *tp, uint8_t *buf, int size, size_t consumed) { ber_dec_rval_t rval; + int ret; tp = memset(tp, 0, sizeof(*tp)); - fprintf(stderr, "Buf %p (%d)\n", buf, size); + fprintf(stderr, "Buf %p (%d)\n", (int)buf, (int)size); rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf, size); fprintf(stderr, "Returned code %d, consumed %d\n", (int)rval.code, (int)rval.consumed); @@ -143,6 +144,14 @@ check(T_t *tp, uint8_t *buf, int size, size_t consumed) { assert(rval.code == RC_OK); assert(rval.consumed == consumed); + fprintf(stderr, "=== asn_fprint() ===\n"); + ret = asn_fprint(stderr, &asn1_DEF_T, tp); + assert(ret == 0); + fprintf(stderr, "=== xer_fprint() ===\n"); + ret = xer_fprint(stderr, &asn1_DEF_T, tp); + fprintf(stderr, "=== END ===\n"); + assert(ret == 0); + /* assert(tp->string.size == 128); assert(strncmp(tp->string.buf, "zz") == 0); @@ -153,32 +162,33 @@ check(T_t *tp, uint8_t *buf, int size, size_t consumed) { size_t buf_pos; size_t buf_size; -uint8_t *buf; +uint8_t *buffer; static int -buf_fill(const void *buffer, size_t size, void *app_key) { +buf_fill(const void *bufp, size_t size, void *app_key) { (void)app_key; /* Unused argument */ if(buf_pos + size > buf_size) { - fprintf(stderr, "%d + %d > %d\n", buf_pos, (int)size, buf_size); + fprintf(stderr, "%d + %d > %d\n", + (int)buf_pos, (int)size, (int)buf_size); return -1; } - memcpy(buf + buf_pos, buffer, size); + memcpy(buffer + buf_pos, bufp, size); buf_pos += size; - fprintf(stderr, " written %d (%d)\n", (int)size, buf_pos); + fprintf(stderr, " written %d (%d)\n", (int)size, (int)buf_pos); return 0; } static void compare(T_t *tp, uint8_t *cmp_buf, int cmp_buf_size) { - der_enc_rval_t erval; + asn_enc_rval_t erval; int i; buf_size = cmp_buf_size + 100; - buf = alloca(buf_size); + buffer = alloca(buf_size); buf_pos = 0; /* @@ -187,19 +197,19 @@ compare(T_t *tp, uint8_t *cmp_buf, int cmp_buf_size) { erval = der_encode(&asn1_DEF_T, tp, buf_fill, 0); assert(erval.encoded != -1); if(erval.encoded != cmp_buf_size) { - printf("%d != %d\n", erval.encoded, cmp_buf_size); + printf("%d != %d\n", (int)erval.encoded, (int)cmp_buf_size); } assert(erval.encoded == cmp_buf_size); for(i = 0; i < cmp_buf_size; i++) { - if(buf[i] != cmp_buf[i]) { + if(buffer[i] != cmp_buf[i]) { fprintf(stderr, "Recreated buffer content mismatch:\n"); fprintf(stderr, "Byte %d, %x != %x (%d != %d)\n", i, - buf[i], cmp_buf[i], - buf[i], cmp_buf[i] + buffer[i], cmp_buf[i], + buffer[i], cmp_buf[i] ); } - assert(buf[i] == cmp_buf[i]); + assert(buffer[i] == cmp_buf[i]); } } @@ -230,7 +240,7 @@ partial_read(uint8_t *buf, size_t size) { size_t size3 = size - size1 - size2; fprintf(stderr, "\n%d:{%d, %d, %d}...\n", - size, size1, size2, size3); + (int)size, (int)size1, (int)size2, (int)size3); memset(buf1, 0, size); memset(buf2, 0, size); @@ -241,7 +251,7 @@ partial_read(uint8_t *buf, size_t size) { tp = memset(&t, 0, sizeof(t)); - fprintf(stderr, "=> Chunk 1 (%d):\n", size1); + fprintf(stderr, "=> Chunk 1 (%d):\n", (int)size1); rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf1, size1); assert(rval.code == RC_WMORE); @@ -253,7 +263,7 @@ partial_read(uint8_t *buf, size_t size) { size2 += leftover; } - fprintf(stderr, "=> Chunk 2 (%d):\n", size2); + fprintf(stderr, "=> Chunk 2 (%d):\n", (int)size2); rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf2, size2); assert(rval.code == RC_WMORE); @@ -265,7 +275,7 @@ partial_read(uint8_t *buf, size_t size) { size3 += leftover; } - fprintf(stderr, "=> Chunk 3 (%d):\n", size3); + fprintf(stderr, "=> Chunk 3 (%d):\n", (int)size3); rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf3, size3); assert(rval.code == RC_OK); @@ -283,31 +293,26 @@ main() { /* Check exact buf0 */ check(&t, buf0, sizeof(buf0), sizeof(buf0)); compare(&t, buf0_reconstr, sizeof(buf0_reconstr)); - asn_fprint(stderr, &asn1_DEF_T, &t); asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); /* Check exact buf1 */ check(&t, buf1, sizeof(buf1), sizeof(buf1)); compare(&t, buf1_reconstr, sizeof(buf1_reconstr)); - asn_fprint(stderr, &asn1_DEF_T, &t); asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); /* Check slightly more than buf1 */ check(&t, buf1, sizeof(buf1) + 10, sizeof(buf1)); compare(&t, buf1_reconstr, sizeof(buf1_reconstr)); - asn_fprint(stderr, &asn1_DEF_T, &t); asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); /* Check exact buf2 */ check(&t, buf2, sizeof(buf2), sizeof(buf2)); compare(&t, buf2_reconstr, sizeof(buf2_reconstr)); - asn_fprint(stderr, &asn1_DEF_T, &t); asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); /* Check slightly more than buf2 */ check(&t, buf2, sizeof(buf2) + 10, sizeof(buf2)); compare(&t, buf2_reconstr, sizeof(buf2_reconstr)); - asn_fprint(stderr, &asn1_DEF_T, &t); asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); /* Split the buffer in parts and check decoder restartability */ diff --git a/asn1c/tests/check-48.c b/asn1c/tests/check-48.c index 8c4f395f1..84227680e 100644 --- a/asn1c/tests/check-48.c +++ b/asn1c/tests/check-48.c @@ -29,7 +29,7 @@ _buf_writer(const void *buffer, size_t size, void *app_key) { static int save_object(void *bs, asn1_TYPE_descriptor_t *td) { - der_enc_rval_t rval; /* Return value */ + asn_enc_rval_t rval; /* Return value */ int i; rval = der_encode(td, bs, _buf_writer, 0); @@ -44,6 +44,7 @@ save_object(void *bs, asn1_TYPE_descriptor_t *td) { buf[buf_offset++] = 123; /* Finalize with garbage */ asn_fprint(stderr, td, bs); + xer_fprint(stderr, td, bs); printf("OUT: ["); for(i = 0; i < buf_offset; i++) @@ -63,6 +64,7 @@ load_object(void *bs, asn1_TYPE_descriptor_t *td) { assert(rval.code == RC_OK); asn_fprint(stderr, td, bs); + xer_fprint(stderr, td, bs); return (rval.code == RC_OK)?0:-1; } diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index a5d04c6b3..179161f03 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -27,6 +27,7 @@ static int asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of); static int _print_tag(arg_t *arg, struct asn1p_type_tag_s *tag_p); static int check_if_extensible(asn1p_expr_t *expr); static int expr_better_indirect(arg_t *arg, asn1p_expr_t *expr); +static int expr_as_xmlvaluelist(arg_t *arg, asn1p_expr_t *expr); static int expr_elements_count(arg_t *arg, asn1p_expr_t *expr); static int emit_member_table(arg_t *arg, asn1p_expr_t *expr); static int emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count); @@ -156,7 +157,6 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *v; int elements; /* Number of elements */ - int comp_mode = 0; /* {root,ext=1,root,root,...} */ int ext_start = -1; int ext_stop = -1; tag2el_t *tag2el = NULL; @@ -183,22 +183,28 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { /* * Print out the table according to which the parsing is performed. */ - p = MKID(expr->Identifier); - OUT("static asn1_TYPE_member_t asn1_MBR_%s[] = {\n", p); + if(expr_elements_count(arg, expr)) { + int comp_mode = 0; /* {root,ext=1,root,root,...} */ - elements = 0; - INDENTED(TQ_FOR(v, &(expr->members), next) { - if(v->expr_type == A1TC_EXTENSIBLE) { - if((++comp_mode) == 1) - ext_start = elements - 1; - else - ext_stop = elements - 1; - continue; - } - elements++; - emit_member_table(arg, v); - }); - OUT("};\n"); + p = MKID(expr->Identifier); + OUT("static asn1_TYPE_member_t asn1_MBR_%s[] = {\n", p); + + elements = 0; + INDENTED(TQ_FOR(v, &(expr->members), next) { + if(v->expr_type == A1TC_EXTENSIBLE) { + if((++comp_mode) == 1) + ext_start = elements - 1; + else + ext_stop = elements - 1; + continue; + } + elements++; + emit_member_table(arg, v); + }); + OUT("};\n"); + } else { + elements = 0; + } /* * Print out asn1_DEF__[all_]tags[] vectors. @@ -307,7 +313,6 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *v; int elements; - int comp_mode = 0; /* {root,ext=1,root,root,...} */ tag2el_t *tag2el = NULL; int tag2el_count = 0; int tags_count; @@ -332,22 +337,28 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { /* * Print out the table according to which the parsing is performed. */ - p = MKID(expr->Identifier); - OUT("static asn1_TYPE_member_t asn1_MBR_%s[] = {\n", p); + if(expr_elements_count(arg, expr)) { + int comp_mode = 0; /* {root,ext=1,root,root,...} */ - elements = 0; - INDENTED(TQ_FOR(v, &(expr->members), next) { - if(v->expr_type == A1TC_EXTENSIBLE) { - if(comp_mode < 3) comp_mode++; - } else { - if(comp_mode == 1 - || expr_better_indirect(arg, v)) - v->marker.flags |= EM_INDIRECT; - elements++; - emit_member_table(arg, v); - } - }); - OUT("};\n"); + p = MKID(expr->Identifier); + OUT("static asn1_TYPE_member_t asn1_MBR_%s[] = {\n", p); + + elements = 0; + INDENTED(TQ_FOR(v, &(expr->members), next) { + if(v->expr_type == A1TC_EXTENSIBLE) { + if(comp_mode < 3) comp_mode++; + } else { + if(comp_mode == 1 + || expr_better_indirect(arg, v)) + v->marker.flags |= EM_INDIRECT; + elements++; + emit_member_table(arg, v); + } + }); + OUT("};\n"); + } else { + elements = 0; + } /* * Print out asn1_DEF__[all_]tags[] vectors. @@ -443,12 +454,15 @@ asn1c_lang_C_type_SEx_OF(arg_t *arg) { tmp.expr = &tmp_memb; tmp_memb = *memb; tmp_memb._anonymous_type = 1; - tmp_memb.Identifier = strdup( - asn1c_make_identifier(0, - expr->Identifier, "member", 0)); - assert(tmp_memb.Identifier); + if(tmp_memb.Identifier == 0) { + tmp_memb.Identifier = strdup( + asn1c_make_identifier(0, + expr->Identifier, "member", 0)); + assert(tmp_memb.Identifier); + } tmp.default_cb(&tmp); - free(tmp_memb.Identifier); + if(tmp_memb.Identifier != memb->Identifier) + free(tmp_memb.Identifier); arg->embed--; assert(arg->target->target == OT_TYPE_DECLS); } else { @@ -496,11 +510,17 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { */ p = MKID(expr->Identifier); OUT("static asn1_TYPE_member_t asn1_MBR_%s[] = {\n", p); - - INDENTED( + INDENT(+1); v = TQ_FIRST(&(expr->members)); + if(!v->Identifier) { + v->Identifier = strdup("member"); + assert(v->Identifier); + } + v->_anonymous_type = 1; + arg->embed++; emit_member_table(arg, v); - ); + arg->embed--; + INDENT(-1); OUT("};\n"); /* @@ -513,6 +533,10 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { INDENTED( OUT("sizeof(struct %s),\n", p); OUT("offsetof(struct %s, _ber_dec_ctx),\n", p); + if(expr_as_xmlvaluelist(arg, v)) + OUT("1,\t/* XER encoding is XMLValueList */\n"); + else + OUT("0,\t/* XER encoding is XMLDelimitedItemList */\n"); ); OUT("};\n"); @@ -589,7 +613,6 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *v; int elements; /* Number of elements */ - int comp_mode = 0; /* {root,ext=1,root,root,...} */ tag2el_t *tag2el = NULL; int tag2el_count = 0; int tags_count; @@ -614,22 +637,28 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { /* * Print out the table according to which the parsing is performed. */ - p = MKID(expr->Identifier); - OUT("static asn1_TYPE_member_t asn1_MBR_%s[] = {\n", p); + if(expr_elements_count(arg, expr)) { + int comp_mode = 0; /* {root,ext=1,root,root,...} */ - elements = 0; - INDENTED(TQ_FOR(v, &(expr->members), next) { - if(v->expr_type == A1TC_EXTENSIBLE) { - if(comp_mode < 3) comp_mode++; - } else { - if(comp_mode == 1 - || expr_better_indirect(arg, v)) - v->marker.flags |= EM_INDIRECT; - elements++; - emit_member_table(arg, v); - } - }); - OUT("};\n"); + p = MKID(expr->Identifier); + OUT("static asn1_TYPE_member_t asn1_MBR_%s[] = {\n", p); + + elements = 0; + INDENTED(TQ_FOR(v, &(expr->members), next) { + if(v->expr_type == A1TC_EXTENSIBLE) { + if(comp_mode < 3) comp_mode++; + } else { + if(comp_mode == 1 + || expr_better_indirect(arg, v)) + v->marker.flags |= EM_INDIRECT; + elements++; + emit_member_table(arg, v); + } + }); + OUT("};\n"); + } else { + elements = 0; + } if(arg->embed) { @@ -683,7 +712,7 @@ asn1c_lang_C_type_REFERENCE(arg_t *arg) { arg_t tmp; int ret; - extract = asn1f_class_access_ex(arg->asn, arg->mod, + extract = asn1f_class_access_ex(arg->asn, arg->expr->module, arg->expr, ref); if(extract == NULL) return -1; @@ -808,12 +837,14 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("%s_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) {\n", p); INDENT(+1); { - asn1p_expr_t *terminal = asn1f_find_terminal_type_ex(arg->asn, arg->mod, expr); + asn1p_expr_t *terminal = asn1f_find_terminal_type_ex(arg->asn, expr); char *type_name = asn1c_type_name(arg, expr, TNF_SAFE); - OUT("td->ber_decoder = asn1_DEF_%s.ber_decoder;\n", type_name); - OUT("td->der_encoder = asn1_DEF_%s.der_encoder;\n", type_name); OUT("td->free_struct = asn1_DEF_%s.free_struct;\n", type_name); OUT("td->print_struct = asn1_DEF_%s.print_struct;\n", type_name); + OUT("td->ber_decoder = asn1_DEF_%s.ber_decoder;\n", type_name); + OUT("td->der_encoder = asn1_DEF_%s.der_encoder;\n", type_name); + OUT("td->xer_decoder = asn1_DEF_%s.xer_decoder;\n", type_name); + OUT("td->xer_encoder = asn1_DEF_%s.xer_encoder;\n", type_name); if(!terminal && !tags_count) { OUT("/* The next four lines are here because of -fknown-extern-type */\n"); OUT("td->tags = asn1_DEF_%s.tags;\n", type_name); @@ -831,6 +862,28 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("}\n"); OUT("\n"); + p = MKID(expr->Identifier); + OUT("void\n"); + OUT("%s_free(asn1_TYPE_descriptor_t *td,\n", p); + INDENTED( + OUT("\tvoid *struct_ptr, int contents_only) {\n"); + OUT("%s_inherit_TYPE_descriptor(td);\n", p); + OUT("td->free_struct(td, struct_ptr, contents_only);\n"); + ); + OUT("}\n"); + OUT("\n"); + + p = MKID(expr->Identifier); + OUT("int\n"); + OUT("%s_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr,\n", p); + INDENTED( + OUT("\tint ilevel, asn_app_consume_bytes_f *cb, void *app_key) {\n"); + OUT("%s_inherit_TYPE_descriptor(td);\n", p); + OUT("return td->print_struct(td, struct_ptr, ilevel, cb, app_key);\n"); + ); + OUT("}\n"); + OUT("\n"); + p = MKID(expr->Identifier); OUT("ber_dec_rval_t\n"); OUT("%s_decode_ber(asn1_TYPE_descriptor_t *td,\n", p); @@ -843,7 +896,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("\n"); p = MKID(expr->Identifier); - OUT("der_enc_rval_t\n"); + OUT("asn_enc_rval_t\n"); OUT("%s_encode_der(asn1_TYPE_descriptor_t *td,\n", p); INDENTED( OUT("\tvoid *structure, int tag_mode, ber_tlv_tag_t tag,\n"); @@ -855,23 +908,13 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("\n"); p = MKID(expr->Identifier); - OUT("int\n"); - OUT("%s_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr,\n", p); - INDENTED( - OUT("\tint ilevel, asn_app_consume_bytes_f *cb, void *app_key) {\n"); - OUT("%s_inherit_TYPE_descriptor(td);\n", p); - OUT("return td->print_struct(td, struct_ptr, ilevel, cb, app_key);\n"); - ); - OUT("}\n"); - OUT("\n"); - - p = MKID(expr->Identifier); - OUT("void\n"); - OUT("%s_free(asn1_TYPE_descriptor_t *td,\n", p); + OUT("asn_enc_rval_t\n"); + OUT("%s_encode_xer(asn1_TYPE_descriptor_t *td, void *structure,\n", p); INDENTED( - OUT("\tvoid *struct_ptr, int contents_only) {\n"); + OUT("\tint ilevel, enum xer_encoder_flags_e flags,\n"); + OUT("\tasn_app_consume_bytes_f *cb, void *app_key) {\n"); OUT("%s_inherit_TYPE_descriptor(td);\n", p); - OUT("td->free_struct(td, struct_ptr, contents_only);\n"); + OUT("return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);\n"); ); OUT("}\n"); OUT("\n"); @@ -883,11 +926,12 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("extern asn1_TYPE_descriptor_t asn1_DEF_%s;", p); if(HIDE_INNER_DEFS) OUT(" // (Use -fall-defs-global to expose) */"); OUT("\n"); + OUT("asn_struct_free_f %s_free;\n", p); + OUT("asn_struct_print_f %s_print;\n", p); OUT("asn_constr_check_f %s_constraint;\n", p); OUT("ber_type_decoder_f %s_decode_ber;\n", p); OUT("der_type_encoder_f %s_encode_der;\n", p); - OUT("asn_struct_print_f %s_print;\n", p); - OUT("asn_struct_free_f %s_free;\n", p); + OUT("xer_type_encoder_f %s_encode_xer;\n", p); REDIR(OT_TYPE_DECLS); @@ -1031,7 +1075,8 @@ _add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no) { assert(el_no >= 0); - ret = asn1f_fetch_outmost_tag(arg->asn, arg->mod, arg->expr, &tag, 1); + ret = asn1f_fetch_outmost_tag(arg->asn, arg->expr->module, + arg->expr, &tag, 1); if(ret == 0) { tag2el_t *te; int new_count = (*count) + 1; @@ -1137,12 +1182,12 @@ emit_tags_vectors(arg_t *arg, asn1p_expr_t *expr, int *tags_count_r, int *all_ta *all_tags_count_r = 0; /* Fetch a chain of tags */ - tags_count = asn1f_fetch_tags(arg->asn, arg->mod, expr, &tags, 0); + tags_count = asn1f_fetch_tags(arg->asn, expr->module, expr, &tags, 0); if(tags_count < 0) return -1; /* Fetch a chain of tags */ - all_tags_count = asn1f_fetch_tags(arg->asn, arg->mod, expr, + all_tags_count = asn1f_fetch_tags(arg->asn, expr->module, expr, &all_tags, AFT_FULL_COLLECT); if(all_tags_count < 0) { if(tags) free(tags); @@ -1207,7 +1252,7 @@ expr_elements_count(arg_t *arg, asn1p_expr_t *expr) { asn1p_expr_t *v; int elements = 0; - topmost_parent = asn1f_find_terminal_type_ex(arg->asn, arg->mod, expr); + topmost_parent = asn1f_find_terminal_type_ex(arg->asn, expr); if(!topmost_parent) return 0; if(!(topmost_parent->expr_type & ASN_CONSTR_MASK)) @@ -1254,15 +1299,15 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { } else { OUT("0, "); } - if(expr->Identifier) { + if(expr->_anonymous_type) { + assert(arg->expr->expr_type == ASN_CONSTR_SET_OF + || arg->expr->expr_type == ASN_CONSTR_SEQUENCE_OF); + OUT("0,\n"); + } else { OUT("offsetof(struct %s, ", MKID(arg->expr->Identifier)); if(arg->expr->expr_type == ASN_CONSTR_CHOICE && (!UNNAMED_UNIONS)) OUT("choice."); OUT("%s),\n", MKID(expr->Identifier)); - } else { - assert(arg->expr->expr_type == ASN_CONSTR_SET_OF - || arg->expr->expr_type == ASN_CONSTR_SEQUENCE_OF); - OUT("0,\n"); } INDENT(+1); if(C99_MODE) OUT(".tag = "); @@ -1286,9 +1331,7 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { OUT("0,\n"); } if(C99_MODE) OUT(".type = "); - if((expr->expr_type & ASN_CONSTR_MASK) - && (arg->expr->expr_type == ASN_CONSTR_SEQUENCE_OF - || arg->expr->expr_type == ASN_CONSTR_SET_OF)) { + if(expr->_anonymous_type && (expr->expr_type & ASN_CONSTR_MASK)) { OUT("(void *)&asn1_DEF_%s_member,\n", MKID(arg->expr->Identifier)); } else if(expr->expr_type & ASN_CONSTR_MASK) { @@ -1301,7 +1344,7 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { if(C99_MODE) OUT(".memb_constraints = "); if(expr->constraints) { char *id = MKID(expr->Identifier); - if(!expr->Identifier) + if(expr->_anonymous_type && !strcmp(expr->Identifier, "member")) id = asn1c_type_name(arg, expr, TNF_SAFE); OUT("memb_%s_%d_constraint,\n", id, ++global_memb_unique); @@ -1309,7 +1352,7 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { OUT("0,\t/* Defer to actual type */\n"); } if(C99_MODE) OUT(".name = "); - OUT("\"%s\"\n", expr->Identifier ? expr->Identifier : ""); + OUT("\"%s\"\n", expr->_anonymous_type ? "" : expr->Identifier); OUT("},\n"); INDENT(-1); @@ -1319,10 +1362,10 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { save_target = arg->target->target; REDIR(OT_CODE); - if(expr->Identifier) - p = MKID(expr->Identifier); - else + if(expr->_anonymous_type && !strcmp(expr->Identifier, "member")) p = asn1c_type_name(arg, expr, TNF_SAFE); + else + p = MKID(expr->Identifier); OUT("static int\n"); OUT("memb_%s_%d_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,\n", p, global_memb_unique); INDENT(+1); @@ -1357,11 +1400,13 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ p = asn1c_type_name(arg, arg->expr, TNF_SAFE); } + OUT("%s_free,\n", p); + OUT("%s_print,\n", p); OUT("%s_constraint,\n", p); OUT("%s_decode_ber,\n", p); OUT("%s_encode_der,\n", p); - OUT("%s_print,\n", p); - OUT("%s_free,\n", p); + OUT("0, /* Not implemented yet */\n"); + OUT("%s_encode_xer,\n", p); p = MKID(expr->Identifier); @@ -1468,7 +1513,24 @@ expr_better_indirect(arg_t *arg, asn1p_expr_t *expr) { return 0; } - terminal = asn1f_find_terminal_type_ex(arg->asn, arg->mod, expr); + terminal = asn1f_find_terminal_type_ex(arg->asn, expr); return (terminal == top_parent); } + +static int +expr_as_xmlvaluelist(arg_t *arg, asn1p_expr_t *expr) { + expr = asn1f_find_terminal_type_ex(arg->asn, expr); + if(!expr) return 0; + + /* X.680, 25.5, Table 5 */ + switch(expr->expr_type) { + case ASN_CONSTR_CHOICE: + case ASN_BASIC_BOOLEAN: + case ASN_BASIC_ENUMERATED: + case ASN_BASIC_NULL: + return 1; + default: + return 0; + } +} diff --git a/skeletons/ANY.c b/skeletons/ANY.c index 389452cdb..a1c77118d 100644 --- a/skeletons/ANY.c +++ b/skeletons/ANY.c @@ -2,17 +2,20 @@ * Copyright (c) 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include #include #include asn1_TYPE_descriptor_t asn1_DEF_ANY = { "ANY", + OCTET_STRING_free, + OCTET_STRING_print, asn_generic_no_constraint, OCTET_STRING_decode_ber, OCTET_STRING_encode_der, - OCTET_STRING_print, - OCTET_STRING_free, + 0, /* Not implemented yet */ + ANY_encode_xer, 0, /* Use generic outmost tag fetcher */ 0, 0, 0, 0, -1, /* Both ways are fine (primitive and constructed) */ @@ -21,6 +24,23 @@ asn1_TYPE_descriptor_t asn1_DEF_ANY = { }; +asn_enc_rval_t +ANY_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + + (void)ilevel; + (void)flags; + (void)cb; + (void)app_key; + + /* + * XER-encoding of ANY type is not supported. + */ + + _ASN_ENCODE_FAILED; +} + struct _callback_arg { uint8_t *buffer; size_t offset; @@ -32,7 +52,7 @@ static int ANY__consume_bytes(const void *buffer, size_t size, void *key); int ANY_fromType(ANY_t *st, asn1_TYPE_descriptor_t *td, void *sptr) { struct _callback_arg arg; - der_enc_rval_t erval; + asn_enc_rval_t erval; if(!st || !td) { errno = EINVAL; @@ -53,7 +73,7 @@ ANY_fromType(ANY_t *st, asn1_TYPE_descriptor_t *td, void *sptr) { if(arg.buffer) FREEMEM(arg.buffer); return -1; } - assert(erval.encoded == arg.offset); + assert((size_t)erval.encoded == arg.offset); if(st->buf) FREEMEM(st->buf); st->buf = arg.buffer; diff --git a/skeletons/ANY.h b/skeletons/ANY.h index 719b3a993..d010de4a1 100644 --- a/skeletons/ANY.h +++ b/skeletons/ANY.h @@ -17,10 +17,11 @@ typedef struct ANY { extern asn1_TYPE_descriptor_t asn1_DEF_ANY; +asn_struct_free_f ANY_free; +asn_struct_print_f ANY_print; ber_type_decoder_f ANY_decode_ber; der_type_encoder_f ANY_encode_der; -asn_struct_print_f ANY_print; -asn_struct_free_f ANY_free; +xer_type_encoder_f ANY_encode_xer; /****************************** * Handy conversion routines. * diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index a43a22aa5..b6da3aeab 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -2,6 +2,7 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include /* @@ -12,11 +13,13 @@ static ber_tlv_tag_t asn1_DEF_BIT_STRING_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_BIT_STRING = { "BIT STRING", + OCTET_STRING_free, /* Implemented in terms of OCTET STRING */ + BIT_STRING_print, BIT_STRING_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - BIT_STRING_print, - OCTET_STRING_free, /* Implemented in terms of OCTET STRING */ + 0, /* Not implemented yet */ + BIT_STRING_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_BIT_STRING_tags, sizeof(asn1_DEF_BIT_STRING_tags) @@ -61,6 +64,66 @@ BIT_STRING_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } +static char *_bit_pattern[16] = { + "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", + "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111" +}; + +asn_enc_rval_t +BIT_STRING_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er; + char scratch[128]; + char *p = scratch; + char *scend = scratch + (sizeof(scratch) - 10); + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + uint8_t *buf; + uint8_t *end; + + if(!st || !st->buf) + _ASN_ENCODE_FAILED; + + er.encoded = 0; + + buf = st->buf; + end = buf + st->size - 1; /* Last byte is special */ + + /* + * Binary dump + */ + for(buf++; buf < end; buf++) { + int v = *buf; + int nline = (flags & XER_F_CANONICAL) + ?0:((((buf - st->buf) - 1) % 16) == 0); + if(p >= scend || nline) { + er.encoded += p - scratch; + _ASN_CALLBACK(scratch, p - scratch); + p = scratch; + if(nline) _i_ASN_TEXT_INDENT(1, ilevel); + } + memcpy(p + 0, _bit_pattern[v >> 4], 4); + memcpy(p + 4, _bit_pattern[v & 0x0f], 4); + p += 8; + } + + er.encoded += p - scratch; + _ASN_CALLBACK(scratch, p - scratch); + + if(buf < end + 1) { + int v = *buf; + int mbit = st->buf[0]; /* bits to skip from the right */ + int i; + for(i = 7; i >= mbit; i--) + *p++ = (v & (1 << i)) ? '1' : '0'; + er.encoded += p - scratch; + _ASN_CALLBACK(scratch, p - scratch); + } + + return er; +} + + /* * BIT STRING specific contents printer. */ @@ -99,6 +162,7 @@ BIT_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, *p++ = h2c[*buf & 0x0F]; *p++ = 0x20; } + if(p > scratch) p--; /* Eat the tailing space */ /* Dump the incomplete 16-bytes row */ return cb(scratch, p - scratch, app_key); diff --git a/skeletons/BIT_STRING.h b/skeletons/BIT_STRING.h index 1def8bb22..f9ebf9b7e 100644 --- a/skeletons/BIT_STRING.h +++ b/skeletons/BIT_STRING.h @@ -14,5 +14,6 @@ extern asn1_TYPE_descriptor_t asn1_DEF_BIT_STRING; asn_struct_print_f BIT_STRING_print; /* Human-readable output */ asn_constr_check_f BIT_STRING_constraint; +xer_type_encoder_f BIT_STRING_encode_xer; #endif /* _BIT_STRING_H_ */ diff --git a/skeletons/BMPString.c b/skeletons/BMPString.c index 3e779cce3..bdbd40d62 100644 --- a/skeletons/BMPString.c +++ b/skeletons/BMPString.c @@ -2,6 +2,7 @@ * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include /* @@ -13,11 +14,13 @@ static ber_tlv_tag_t asn1_DEF_BMPString_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_BMPString = { "BMPString", + OCTET_STRING_free, /* Implemented in terms of OCTET STRING */ + BMPString_print, asn_generic_no_constraint, /* No constraint by default */ OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - BMPString_print, - OCTET_STRING_free, /* -//- */ + 0, /* Not implemented yet */ + BMPString_encode_xer, /* Conver to UTF8 */ 0, /* Use generic outmost tag fetcher */ asn1_DEF_BMPString_tags, sizeof(asn1_DEF_BMPString_tags) @@ -33,27 +36,22 @@ asn1_TYPE_descriptor_t asn1_DEF_BMPString = { /* * BMPString specific contents printer. */ -int -BMPString_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, +static ssize_t +BMPString__dump(const BMPString_t *st, asn_app_consume_bytes_f *cb, void *app_key) { - const BMPString_t *st = (const BMPString_t *)sptr; - uint16_t *wchar; - uint16_t *wend; char scratch[128]; /* Scratchpad buffer */ - char *p; + char *p = scratch; + ssize_t wrote = 0; + uint8_t *ch; + uint8_t *end; - (void)td; /* Unused argument */ - (void)ilevel; /* Unused argument */ - - if(!st || !st->buf) return cb("", 8, app_key); - - wchar = (uint16_t *)st->buf; - wend = (uint16_t *)(st->buf + st->size); - for(p = scratch; wchar < wend; wchar++) { - uint16_t wc = (((uint8_t *)wchar)[0] << 8) - | ((uint8_t *)wchar)[1]; /* 2 bytes */ + ch = st->buf; + end = (st->buf + st->size); + for(end--; ch < end; ch += 2) { + uint16_t wc = (ch[0] << 8) | ch[1]; /* 2 bytes */ if(sizeof(scratch) - (p - scratch) < 3) { - if(cb(scratch, p - scratch, app_key)) + wrote += p - scratch; + if(cb(scratch, p - scratch, app_key) < 0) return -1; p = scratch; } @@ -69,5 +67,45 @@ BMPString_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, } } - return cb(scratch, p - scratch, app_key); + wrote += p - scratch; + if(cb(scratch, p - scratch, app_key) < 0) + return -1; + + return wrote; } + +asn_enc_rval_t +BMPString_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + const BMPString_t *st = (const BMPString_t *)sptr; + asn_enc_rval_t er; + + (void)ilevel; + (void)flags; + + if(!st || !st->buf) + _ASN_ENCODE_FAILED; + + er.encoded = BMPString__dump(st, cb, app_key); + if(er.encoded < 0) _ASN_ENCODE_FAILED; + + return er; +} + +int +BMPString_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const BMPString_t *st = (const BMPString_t *)sptr; + + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + + if(!st || !st->buf) return cb("", 8, app_key); + + if(BMPString__dump(st, cb, app_key) < 0) + return -1; + + return 0; +} + diff --git a/skeletons/BMPString.h b/skeletons/BMPString.h index e3957ca03..31d67eaee 100644 --- a/skeletons/BMPString.h +++ b/skeletons/BMPString.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _BMPString_H_ @@ -13,5 +13,6 @@ typedef OCTET_STRING_t BMPString_t; /* Implemented in terms of OCTET STRING */ extern asn1_TYPE_descriptor_t asn1_DEF_BMPString; asn_struct_print_f BMPString_print; /* Human-readable output */ +xer_type_encoder_f BMPString_encode_xer; #endif /* _BMPString_H_ */ diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c index 5ba2e4f87..9609a19ef 100644 --- a/skeletons/BOOLEAN.c +++ b/skeletons/BOOLEAN.c @@ -2,6 +2,7 @@ * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include /* @@ -12,11 +13,13 @@ static ber_tlv_tag_t asn1_DEF_BOOLEAN_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_BOOLEAN = { "BOOLEAN", + BOOLEAN_free, + BOOLEAN_print, asn_generic_no_constraint, BOOLEAN_decode_ber, BOOLEAN_encode_der, - BOOLEAN_print, - BOOLEAN_free, + 0, /* Not implemented yet */ + BOOLEAN_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_BOOLEAN_tags, sizeof(asn1_DEF_BOOLEAN_tags) / sizeof(asn1_DEF_BOOLEAN_tags[0]), @@ -93,11 +96,11 @@ BOOLEAN_decode_ber(asn1_TYPE_descriptor_t *td, return rval; } -der_enc_rval_t +asn_enc_rval_t BOOLEAN_encode_der(asn1_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - der_enc_rval_t erval; + asn_enc_rval_t erval; BOOLEAN_t *st = (BOOLEAN_t *)sptr; erval.encoded = der_write_tags(td, 1, tag_mode, tag, cb, app_key); @@ -126,6 +129,29 @@ BOOLEAN_encode_der(asn1_TYPE_descriptor_t *td, void *sptr, return erval; } +asn_enc_rval_t +BOOLEAN_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + const BOOLEAN_t *st = (const BOOLEAN_t *)sptr; + asn_enc_rval_t er; + + (void)ilevel; + (void)flags; + + if(!st) _ASN_ENCODE_FAILED; + + if(*st) { + _ASN_CALLBACK("", 7); + er.encoded = 7; + } else { + _ASN_CALLBACK("", 8); + er.encoded = 8; + } + + return er; +} + int BOOLEAN_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { diff --git a/skeletons/BOOLEAN.h b/skeletons/BOOLEAN.h index 6ad69a451..b9b836ee5 100644 --- a/skeletons/BOOLEAN.h +++ b/skeletons/BOOLEAN.h @@ -16,9 +16,10 @@ typedef int BOOLEAN_t; extern asn1_TYPE_descriptor_t asn1_DEF_BOOLEAN; +asn_struct_free_f BOOLEAN_free; +asn_struct_print_f BOOLEAN_print; ber_type_decoder_f BOOLEAN_decode_ber; der_type_encoder_f BOOLEAN_encode_der; -asn_struct_print_f BOOLEAN_print; -asn_struct_free_f BOOLEAN_free; +xer_type_encoder_f BOOLEAN_encode_xer; #endif /* _BOOLEAN_H_ */ diff --git a/skeletons/ENUMERATED.c b/skeletons/ENUMERATED.c index ed908b563..158119d67 100644 --- a/skeletons/ENUMERATED.c +++ b/skeletons/ENUMERATED.c @@ -2,6 +2,7 @@ * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include /* @@ -12,11 +13,13 @@ static ber_tlv_tag_t asn1_DEF_ENUMERATED_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_ENUMERATED = { "ENUMERATED", + INTEGER_free, /* Implemented in terms of INTEGER */ + INTEGER_print, /* Implemented in terms of INTEGER */ asn_generic_no_constraint, INTEGER_decode_ber, /* Implemented in terms of INTEGER */ INTEGER_encode_der, /* Implemented in terms of INTEGER */ - INTEGER_print, /* Implemented in terms of INTEGER */ - INTEGER_free, /* Implemented in terms of INTEGER */ + 0, /* Not implemented yet */ + INTEGER_encode_xer, /* Implemented in terms of INTEGER */ 0, /* Use generic outmost tag fetcher */ asn1_DEF_ENUMERATED_tags, sizeof(asn1_DEF_ENUMERATED_tags) / sizeof(asn1_DEF_ENUMERATED_tags[0]), diff --git a/skeletons/GeneralString.c b/skeletons/GeneralString.c index dfca2cac7..c9d82480e 100644 --- a/skeletons/GeneralString.c +++ b/skeletons/GeneralString.c @@ -2,6 +2,7 @@ * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include /* @@ -13,11 +14,13 @@ static ber_tlv_tag_t asn1_DEF_GeneralString_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_GeneralString = { "GeneralString", + OCTET_STRING_free, + OCTET_STRING_print, /* non-ascii string */ asn_generic_unknown_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_print, /* non-ascii string */ - OCTET_STRING_free, + 0, /* Not implemented yet */ + OCTET_STRING_encode_xer, /* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ asn1_DEF_GeneralString_tags, sizeof(asn1_DEF_GeneralString_tags) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 88806f91d..8f8fff21e 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -2,6 +2,7 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include #include #include @@ -113,11 +114,13 @@ static ber_tlv_tag_t asn1_DEF_GeneralizedTime_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_GeneralizedTime = { "GeneralizedTime", + OCTET_STRING_free, + GeneralizedTime_print, GeneralizedTime_constraint, /* Check validity of time */ OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ GeneralizedTime_encode_der, /* Implemented in terms of OCTET STRING */ - GeneralizedTime_print, - OCTET_STRING_free, + 0, /* Not implemented yet */ + GeneralizedTime_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_GeneralizedTime_tags, sizeof(asn1_DEF_GeneralizedTime_tags) @@ -153,12 +156,12 @@ GeneralizedTime_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } -der_enc_rval_t +asn_enc_rval_t GeneralizedTime_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { GeneralizedTime_t *st = (GeneralizedTime_t *)ptr; - der_enc_rval_t erval; + asn_enc_rval_t erval; /* If not canonical DER, re-encode into canonical DER. */ if(st->size && st->buf[st->size-1] != 'Z') { @@ -194,6 +197,36 @@ GeneralizedTime_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, return erval; } +asn_enc_rval_t +GeneralizedTime_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + OCTET_STRING_t st; + + if(flags & XER_F_CANONICAL) { + char buf[32]; + struct tm tm; + ssize_t ret; + + errno = EPERM; + if(asn_GT2time((GeneralizedTime_t *)sptr, &tm, 1) == -1 + && errno != EPERM) + _ASN_ENCODE_FAILED; + + ret = snprintf(buf, sizeof(buf), "%04d%02d%02d%02d%02d%02dZ", + tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, + tm.tm_hour, tm.tm_min, tm.tm_sec); + assert(ret > 0 && ret < (int)sizeof(buf)); + + st.buf = (uint8_t *)buf; + st.size = ret; + sptr = &st; + } + + return OCTET_STRING_encode_xer_ascii(td, sptr, ilevel, flags, + cb, app_key); +} + int GeneralizedTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { diff --git a/skeletons/GeneralizedTime.h b/skeletons/GeneralizedTime.h index a7a8a4a2d..06b4ca5f7 100644 --- a/skeletons/GeneralizedTime.h +++ b/skeletons/GeneralizedTime.h @@ -12,9 +12,10 @@ typedef OCTET_STRING_t GeneralizedTime_t; /* Implemented using OCTET STRING */ extern asn1_TYPE_descriptor_t asn1_DEF_GeneralizedTime; +asn_struct_print_f GeneralizedTime_print; asn_constr_check_f GeneralizedTime_constraint; der_type_encoder_f GeneralizedTime_encode_der; -asn_struct_print_f GeneralizedTime_print; +xer_type_encoder_f GeneralizedTime_encode_xer; /*********************** * Some handy helpers. * diff --git a/skeletons/GraphicString.c b/skeletons/GraphicString.c index ceb247d60..e8fa79758 100644 --- a/skeletons/GraphicString.c +++ b/skeletons/GraphicString.c @@ -2,6 +2,7 @@ * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include /* @@ -13,11 +14,13 @@ static ber_tlv_tag_t asn1_DEF_GraphicString_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_GraphicString = { "GraphicString", + OCTET_STRING_free, + OCTET_STRING_print, /* non-ascii string */ asn_generic_unknown_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_print, /* non-ascii string */ - OCTET_STRING_free, + 0, /* Not implemented yet */ + OCTET_STRING_encode_xer, /* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ asn1_DEF_GraphicString_tags, sizeof(asn1_DEF_GraphicString_tags) diff --git a/skeletons/IA5String.c b/skeletons/IA5String.c index 9fc308b17..a2c828dda 100644 --- a/skeletons/IA5String.c +++ b/skeletons/IA5String.c @@ -2,6 +2,7 @@ * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include /* @@ -13,11 +14,13 @@ static ber_tlv_tag_t asn1_DEF_IA5String_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_IA5String = { "IA5String", + OCTET_STRING_free, + OCTET_STRING_print_ascii, /* ASCII subset */ IA5String_constraint, /* Constraint on the alphabet */ OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_print_ascii, /* ASCII subset */ - OCTET_STRING_free, + 0, /* Not implemented yet */ + OCTET_STRING_encode_xer_ascii,/* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ asn1_DEF_IA5String_tags, sizeof(asn1_DEF_IA5String_tags) @@ -63,3 +66,4 @@ IA5String_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } + diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 5bfcf1fbf..75782a689 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -2,6 +2,7 @@ * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include #include #include @@ -14,11 +15,13 @@ static ber_tlv_tag_t asn1_DEF_INTEGER_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_INTEGER = { "INTEGER", + INTEGER_free, + INTEGER_print, asn_generic_no_constraint, INTEGER_decode_ber, INTEGER_encode_der, - INTEGER_print, - INTEGER_free, + 0, /* Not implemented yet */ + INTEGER_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_INTEGER_tags, sizeof(asn1_DEF_INTEGER_tags) / sizeof(asn1_DEF_INTEGER_tags[0]), @@ -100,11 +103,11 @@ INTEGER_decode_ber(asn1_TYPE_descriptor_t *td, /* * Encode INTEGER type using DER. */ -der_enc_rval_t +asn_enc_rval_t INTEGER_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - der_enc_rval_t erval; + asn_enc_rval_t erval; INTEGER_t *st = (INTEGER_t *)ptr; ASN_DEBUG("%s %s as INTEGER (tm=%d)", @@ -185,24 +188,19 @@ INTEGER_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, /* * INTEGER specific human-readable output. */ -int -INTEGER_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, - asn_app_consume_bytes_f *cb, void *app_key) { +static ssize_t +INTEGER__dump(const INTEGER_t *st, asn_app_consume_bytes_f *cb, void *app_key) { char scratch[32]; /* Enough for 64-bit integer */ - const INTEGER_t *st = (const INTEGER_t *)sptr; uint8_t *buf = st->buf; uint8_t *buf_end = st->buf + st->size; signed long accum; + ssize_t wrote = 0; char *p; int ret; - (void)td; /* Unused argument */ - (void)ilevel; /* Unused argument */ - - if(!st && !st->buf) return cb("", 8, app_key); - - if(st->size == 0) - return cb("0", 1, app_key); + if(st->size == 0) { + return (cb("0", 1, app_key) < 0) ? -1 : 1; + } /* * Advance buf pointer until the start of the value's body. @@ -226,7 +224,7 @@ INTEGER_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, accum = (accum << 8) | *buf; ret = snprintf(scratch, sizeof(scratch), "%ld", accum); assert(ret > 0 && ret < (int)sizeof(scratch)); - return cb(scratch, ret, app_key); + return (cb(scratch, ret, app_key) < 0) ? -1 : ret; } /* Output in the long xx:yy:zz... format */ @@ -235,8 +233,9 @@ INTEGER_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, static const char *h2c = "0123456789ABCDEF"; if((p - scratch) >= (ssize_t)(sizeof(scratch) - 4)) { /* Flush buffer */ - if(cb(scratch, p - scratch, app_key)) + if(cb(scratch, p - scratch, app_key) < 0) return -1; + wrote += p - scratch; p = scratch; } *p++ = h2c[*buf >> 4]; @@ -246,7 +245,43 @@ INTEGER_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, if(p != scratch) p--; /* Remove the last ':' */ - return cb(scratch, p - scratch, app_key); + wrote += p - scratch; + return (cb(scratch, p - scratch, app_key) < 0) ? -1 : wrote; +} + +/* + * INTEGER specific human-readable output. + */ +int +INTEGER_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + + (void)td; + (void)ilevel; + + if(!st && !st->buf) return cb("", 8, app_key); + + return (INTEGER__dump(st, cb, app_key) < 0) ? -1 : 0; +} + +asn_enc_rval_t +INTEGER_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + asn_enc_rval_t er; + + (void)ilevel; + (void)flags; + + if(!st && !st->buf) + _ASN_ENCODE_FAILED; + + er.encoded = INTEGER__dump(st, cb, app_key); + if(er.encoded < 0) _ASN_ENCODE_FAILED; + + return er; } void diff --git a/skeletons/INTEGER.h b/skeletons/INTEGER.h index ef4d3f252..8e3c5458b 100644 --- a/skeletons/INTEGER.h +++ b/skeletons/INTEGER.h @@ -14,10 +14,11 @@ typedef struct INTEGER { extern asn1_TYPE_descriptor_t asn1_DEF_INTEGER; +asn_struct_free_f INTEGER_free; +asn_struct_print_f INTEGER_print; ber_type_decoder_f INTEGER_decode_ber; der_type_encoder_f INTEGER_encode_der; -asn_struct_print_f INTEGER_print; -asn_struct_free_f INTEGER_free; +xer_type_encoder_f INTEGER_encode_xer; /*********************************** * Some handy conversion routines. * diff --git a/skeletons/ISO646String.c b/skeletons/ISO646String.c index 8a99cbcb5..e5a4d444c 100644 --- a/skeletons/ISO646String.c +++ b/skeletons/ISO646String.c @@ -2,6 +2,7 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include /* @@ -13,11 +14,13 @@ static ber_tlv_tag_t asn1_DEF_ISO646String_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_ISO646String = { "ISO646String", + OCTET_STRING_free, + OCTET_STRING_print_ascii, /* ASCII subset */ VisibleString_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_print_ascii, /* ASCII subset */ - OCTET_STRING_free, + 0, /* Not implemented yet */ + OCTET_STRING_encode_xer_ascii,/* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ asn1_DEF_ISO646String_tags, sizeof(asn1_DEF_ISO646String_tags) diff --git a/skeletons/NULL.c b/skeletons/NULL.c index 36796b8a6..e15b9af86 100644 --- a/skeletons/NULL.c +++ b/skeletons/NULL.c @@ -2,6 +2,7 @@ * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include #include /* Implemented in terms of BOOLEAN type */ @@ -13,11 +14,13 @@ static ber_tlv_tag_t asn1_DEF_NULL_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_NULL = { "NULL", + BOOLEAN_free, + NULL_print, asn_generic_no_constraint, BOOLEAN_decode_ber, /* Implemented in terms of BOOLEAN */ NULL_encode_der, /* Special handling of DER encoding */ - NULL_print, - BOOLEAN_free, + 0, /* Not implemented yet */ + NULL_encode_xer, /* Special handling of DER encoding */ 0, /* Use generic outmost tag fetcher */ asn1_DEF_NULL_tags, sizeof(asn1_DEF_NULL_tags) / sizeof(asn1_DEF_NULL_tags[0]), @@ -28,21 +31,40 @@ asn1_TYPE_descriptor_t asn1_DEF_NULL = { 0 /* No specifics */ }; -der_enc_rval_t -NULL_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, +asn_enc_rval_t +NULL_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - der_enc_rval_t erval; + asn_enc_rval_t erval; - erval.encoded = der_write_tags(sd, 0, tag_mode, tag, cb, app_key); + erval.encoded = der_write_tags(td, 0, tag_mode, tag, cb, app_key); if(erval.encoded == -1) { - erval.failed_type = sd; + erval.failed_type = td; erval.structure_ptr = ptr; } return erval; } +asn_enc_rval_t +NULL_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er; + + (void)td; + (void)sptr; + (void)ilevel; + (void)flags; + (void)cb; + (void)app_key; + + /* XMLNullValue is empty */ + er.encoded = 0; + + return er; +} + int NULL_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { diff --git a/skeletons/NULL.h b/skeletons/NULL.h index 003a5a63d..0c07ffe85 100644 --- a/skeletons/NULL.h +++ b/skeletons/NULL.h @@ -15,7 +15,8 @@ typedef int NULL_t; extern asn1_TYPE_descriptor_t asn1_DEF_NULL; -der_type_encoder_f NULL_encode_der; asn_struct_print_f NULL_print; +der_type_encoder_f NULL_encode_der; +xer_type_encoder_f NULL_encode_xer; #endif /* NULL_H */ diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c index 53ce5012e..ec4dd88db 100644 --- a/skeletons/NativeEnumerated.c +++ b/skeletons/NativeEnumerated.c @@ -9,6 +9,7 @@ * implementation deals with the standard (machine-specific) representation * of them instead of using the platform-independent buffer. */ +#include #include /* @@ -19,11 +20,13 @@ static ber_tlv_tag_t asn1_DEF_NativeEnumerated_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_NativeEnumerated = { "ENUMERATED", /* The ASN.1 type is still ENUMERATED */ + NativeInteger_free, + NativeInteger_print, asn_generic_no_constraint, NativeInteger_decode_ber, NativeInteger_encode_der, - NativeInteger_print, - NativeInteger_free, + 0, /* Not implemented yet */ + NativeInteger_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_NativeEnumerated_tags, sizeof(asn1_DEF_NativeEnumerated_tags) / sizeof(asn1_DEF_NativeEnumerated_tags[0]), diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index 98fee965d..b0872a2ea 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -9,6 +9,7 @@ * implementation deals with the standard (machine-specific) representation * of them instead of using the platform-independent buffer. */ +#include #include #include #include @@ -21,11 +22,13 @@ static ber_tlv_tag_t asn1_DEF_NativeInteger_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_NativeInteger = { "INTEGER", /* The ASN.1 type is still INTEGER */ + NativeInteger_free, + NativeInteger_print, asn_generic_no_constraint, NativeInteger_decode_ber, NativeInteger_encode_der, - NativeInteger_print, - NativeInteger_free, + 0, /* Not implemented yet */ + NativeInteger_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_NativeInteger_tags, sizeof(asn1_DEF_NativeInteger_tags) / sizeof(asn1_DEF_NativeInteger_tags[0]), @@ -127,17 +130,17 @@ NativeInteger_decode_ber(asn1_TYPE_descriptor_t *td, /* * Encode the NativeInteger using the standard INTEGER type DER encoder. */ -der_enc_rval_t +asn_enc_rval_t NativeInteger_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { unsigned int Int = *(unsigned int *)ptr; /* Disable sign ext. */ - der_enc_rval_t erval; + asn_enc_rval_t erval; INTEGER_t tmp; #ifdef WORDS_BIGENDIAN /* Opportunistic optimization */ - tmp.buf = ∬ + tmp.buf = (uint8_t *)∬ tmp.size = sizeof(Int); #else /* Works even if WORDS_BIGENDIAN is not set where should've been */ @@ -161,6 +164,27 @@ NativeInteger_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, return erval; } +asn_enc_rval_t +NativeInteger_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + char scratch[32]; /* Enough for 64-bit int */ + asn_enc_rval_t er; + const int *Int = (const int *)sptr; + + (void)ilevel; + (void)flags; + + if(!Int) _ASN_ENCODE_FAILED; + + er.encoded = snprintf(scratch, sizeof(scratch), "%d", *Int); + if(er.encoded <= 0 || (size_t)er.encoded >= sizeof(scratch) + || cb(scratch, er.encoded, app_key) < 0) + _ASN_ENCODE_FAILED; + + return er; +} + /* * INTEGER specific human-readable output. */ diff --git a/skeletons/NativeInteger.h b/skeletons/NativeInteger.h index e0f26c784..2d0cddaad 100644 --- a/skeletons/NativeInteger.h +++ b/skeletons/NativeInteger.h @@ -16,9 +16,10 @@ extern asn1_TYPE_descriptor_t asn1_DEF_NativeInteger; +asn_struct_free_f NativeInteger_free; +asn_struct_print_f NativeInteger_print; ber_type_decoder_f NativeInteger_decode_ber; der_type_encoder_f NativeInteger_encode_der; -asn_struct_print_f NativeInteger_print; -asn_struct_free_f NativeInteger_free; +xer_type_encoder_f NativeInteger_encode_xer; #endif /* _NativeInteger_H_ */ diff --git a/skeletons/NativeReal.c b/skeletons/NativeReal.c index e7cc28f9a..1566a7fb3 100644 --- a/skeletons/NativeReal.c +++ b/skeletons/NativeReal.c @@ -9,6 +9,7 @@ * implementation deals with the standard (machine-specific) representation * of them instead of using the platform-independent buffer. */ +#include #include #include #include @@ -22,11 +23,13 @@ static ber_tlv_tag_t asn1_DEF_NativeReal_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_NativeReal = { "REAL", /* The ASN.1 type is still REAL */ + NativeReal_free, + NativeReal_print, asn_generic_no_constraint, NativeReal_decode_ber, NativeReal_encode_der, - NativeReal_print, - NativeReal_free, + 0, /* Not implemented yet */ + NativeReal_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_NativeReal_tags, sizeof(asn1_DEF_NativeReal_tags) / sizeof(asn1_DEF_NativeReal_tags[0]), @@ -116,12 +119,12 @@ NativeReal_decode_ber(asn1_TYPE_descriptor_t *td, /* * Encode the NativeReal using the standard REAL type DER encoder. */ -der_enc_rval_t +asn_enc_rval_t NativeReal_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { double Dbl = *(const double *)ptr; - der_enc_rval_t erval; + asn_enc_rval_t erval; REAL_t tmp; if(asn1_double2REAL(&tmp, Dbl)) { @@ -140,6 +143,25 @@ NativeReal_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, return erval; } + +asn_enc_rval_t +NativeReal_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + const double *Dbl = (const double *)sptr; + asn_enc_rval_t er; + double d; + + (void)ilevel; + + if(!Dbl) _ASN_ENCODE_FAILED; + + er.encoded = REAL__dump(d, flags & XER_F_CANONICAL, cb, app_key); + if(er.encoded < 0) _ASN_ENCODE_FAILED; + + return er; +} + /* * REAL specific human-readable output. */ @@ -147,32 +169,13 @@ int NativeReal_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const double *Dbl = (const double *)sptr; - char scratch[64]; - int ret; (void)td; /* Unused argument */ (void)ilevel; /* Unused argument */ - if(Dbl) { - char *p = scratch; - int buf_size = sizeof(scratch); - for(;;) { - ret = snprintf(p, buf_size, "%f", *Dbl); - if(ret >= 0 && ret < buf_size) { - ret = cb(p, ret, app_key); - if(p != scratch) free(p); - return ret; - } else { - if(p != scratch) free(p); - } - if(ret < 0) buf_size <<= 2; /* Old libc. */ - else buf_size = ret + 1; - (void *)p = MALLOC(ret); - if(!p) return -1; - } - } else { - return cb("", 8, app_key); - } + if(!Dbl) return cb("", 8, app_key); + + return (REAL__dump(*Dbl, 0, cb, app_key) < 0) ? -1 : 0; } void diff --git a/skeletons/NativeReal.h b/skeletons/NativeReal.h index 1a5436dff..a130a334b 100644 --- a/skeletons/NativeReal.h +++ b/skeletons/NativeReal.h @@ -15,9 +15,10 @@ extern asn1_TYPE_descriptor_t asn1_DEF_NativeReal; +asn_struct_free_f NativeReal_free; +asn_struct_print_f NativeReal_print; ber_type_decoder_f NativeReal_decode_ber; der_type_encoder_f NativeReal_encode_der; -asn_struct_print_f NativeReal_print; -asn_struct_free_f NativeReal_free; +xer_type_encoder_f NativeReal_encode_xer; #endif /* ASN_TYPE_NativeReal_H */ diff --git a/skeletons/NumericString.c b/skeletons/NumericString.c index a23e39f13..b4a6df92f 100644 --- a/skeletons/NumericString.c +++ b/skeletons/NumericString.c @@ -2,6 +2,7 @@ * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include /* @@ -13,11 +14,13 @@ static ber_tlv_tag_t asn1_DEF_NumericString_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_NumericString = { "NumericString", + OCTET_STRING_free, + OCTET_STRING_print_ascii, /* ASCII subset */ NumericString_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_print_ascii, /* ASCII subset */ - OCTET_STRING_free, + 0, /* Not implemented yet */ + OCTET_STRING_encode_xer_ascii,/* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ asn1_DEF_NumericString_tags, sizeof(asn1_DEF_NumericString_tags) diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index c55410d5d..43ced796d 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -2,6 +2,7 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include #include /* for CHAR_BIT */ #include @@ -15,11 +16,13 @@ static ber_tlv_tag_t asn1_DEF_OBJECT_IDENTIFIER_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_OBJECT_IDENTIFIER = { "OBJECT IDENTIFIER", + INTEGER_free, + OBJECT_IDENTIFIER_print, OBJECT_IDENTIFIER_constraint, INTEGER_decode_ber, /* Implemented in terms of INTEGER type */ OBJECT_IDENTIFIER_encode_der, - OBJECT_IDENTIFIER_print, - INTEGER_free, + 0, /* Not implemented yet */ + OBJECT_IDENTIFIER_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_OBJECT_IDENTIFIER_tags, sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags) @@ -36,11 +39,11 @@ asn1_TYPE_descriptor_t asn1_DEF_OBJECT_IDENTIFIER = { /* * Encode OBJECT IDENTIFIER type using DER. */ -der_enc_rval_t +asn_enc_rval_t OBJECT_IDENTIFIER_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - der_enc_rval_t erval; + asn_enc_rval_t erval; OBJECT_IDENTIFIER_t *st = (OBJECT_IDENTIFIER_t *)ptr; ASN_DEBUG("%s %s as OBJECT IDENTIFIER (tm=%d)", @@ -57,10 +60,8 @@ OBJECT_IDENTIFIER_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, } if(cb && st->buf) { - ssize_t ret; - - ret = cb(st->buf, st->size, app_key); - if(ret == -1) { + int ret = cb(st->buf, st->size, app_key); + if(ret < 0) { erval.encoded = -1; erval.failed_type = sd; erval.structure_ptr = ptr; @@ -215,9 +216,8 @@ OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed in return 0; } - -int -OBJECT_IDENTIFIER_print_arc(uint8_t *arcbuf, int arclen, int add, +ssize_t +OBJECT_IDENTIFIER__dump_arc(uint8_t *arcbuf, int arclen, int add, asn_app_consume_bytes_f *cb, void *app_key) { char scratch[64]; /* Conservative estimate */ unsigned long accum; /* Bits accumulator */ @@ -228,35 +228,41 @@ OBJECT_IDENTIFIER_print_arc(uint8_t *arcbuf, int arclen, int add, return -1; if(accum) { + ssize_t len; + /* Fill the scratch buffer in reverse. */ p = scratch + sizeof(scratch); for(; accum; accum /= 10) - *(--p) = (char)(accum % 10) + 0x30; + *(--p) = (char)(accum % 10) + 0x30; /* Put a digit */ - return cb(p, sizeof(scratch) - (p - scratch), app_key); + len = sizeof(scratch) - (p - scratch); + if(cb(p, len, app_key) < 0) + return -1; + return len; } else { *scratch = 0x30; - return cb(scratch, 1, app_key); + if(cb(scratch, 1, app_key) < 0) + return -1; + return 1; } } int -OBJECT_IDENTIFIER_print(asn1_TYPE_descriptor_t *td, const void *sptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - const OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr; - int startn; - int add = 0; - int i; +OBJECT_IDENTIFIER_print_arc(uint8_t *arcbuf, int arclen, int add, + asn_app_consume_bytes_f *cb, void *app_key) { - (void)td; /* Unused argument */ - (void)ilevel; /* Unused argument */ + if(OBJECT_IDENTIFIER__dump_arc(arcbuf, arclen, add, cb, app_key) < 0) + return -1; - if(!st || !st->buf) - return cb("", 8, app_key); + return 0; +} - /* Dump preamble */ - if(cb("{ ", 2, app_key)) - return -1; +static ssize_t +OBJECT_IDENTIFIER__dump_body(const OBJECT_IDENTIFIER_t *st, asn_app_consume_bytes_f *cb, void *app_key) { + ssize_t wrote_len = 0; + int startn; + int add = 0; + int i; for(i = 0, startn = 0; i < st->size; i++) { uint8_t b = st->buf[i]; @@ -269,30 +275,71 @@ OBJECT_IDENTIFIER_print(asn1_TYPE_descriptor_t *td, const void *sptr, */ if(i) { add = -80; - if(cb("2", 1, app_key)) return -1; + if(cb("2", 1, app_key) < 0) return -1; } else if(b <= 39) { add = 0; - if(cb("0", 1, app_key)) return -1; + if(cb("0", 1, app_key) < 0) return -1; } else if(b < 79) { add = -40; - if(cb("1", 1, app_key)) return -1; + if(cb("1", 1, app_key) < 0) return -1; } else { add = -80; - if(cb("2", 1, app_key)) return -1; + if(cb("2", 1, app_key) < 0) return -1; } + wrote_len += 1; } - if(cb(" ", 1, app_key)) /* Separate arcs */ + if(cb(".", 1, app_key) < 0) /* Separate arcs */ return -1; - if(OBJECT_IDENTIFIER_print_arc(&st->buf[startn], - i - startn + 1, add, - cb, app_key)) - return -1; + add = OBJECT_IDENTIFIER__dump_arc(&st->buf[startn], + i - startn + 1, add, cb, app_key); + if(add < 0) return -1; + wrote_len += 1 + add; startn = i + 1; add = 0; } + return wrote_len; +} + +asn_enc_rval_t +OBJECT_IDENTIFIER_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + const OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr; + asn_enc_rval_t er; + + (void)ilevel; + (void)flags; + + if(!st || !st->buf) + _ASN_ENCODE_FAILED; + + er.encoded = OBJECT_IDENTIFIER__dump_body(st, cb, app_key); + if(er.encoded < 0) _ASN_ENCODE_FAILED; + + return er; +} + +int +OBJECT_IDENTIFIER_print(asn1_TYPE_descriptor_t *td, const void *sptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + const OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr; + + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + + if(!st || !st->buf) + return cb("", 8, app_key); + + /* Dump preamble */ + if(cb("{ ", 2, app_key)) + return -1; + + if(OBJECT_IDENTIFIER__dump_body(st, cb, app_key) < 0) + return -1; + return cb(" }", 2, app_key); } diff --git a/skeletons/OBJECT_IDENTIFIER.h b/skeletons/OBJECT_IDENTIFIER.h index 8d43c9970..4f45090cf 100644 --- a/skeletons/OBJECT_IDENTIFIER.h +++ b/skeletons/OBJECT_IDENTIFIER.h @@ -12,9 +12,10 @@ typedef INTEGER_t OBJECT_IDENTIFIER_t; /* Implemented in terms of INTEGER */ extern asn1_TYPE_descriptor_t asn1_DEF_OBJECT_IDENTIFIER; -der_type_encoder_f OBJECT_IDENTIFIER_encode_der; -asn_constr_check_f OBJECT_IDENTIFIER_constraint; asn_struct_print_f OBJECT_IDENTIFIER_print; +asn_constr_check_f OBJECT_IDENTIFIER_constraint; +der_type_encoder_f OBJECT_IDENTIFIER_encode_der; +xer_type_encoder_f OBJECT_IDENTIFIER_encode_xer; /********************************** * Some handy conversion routines * @@ -27,6 +28,10 @@ int OBJECT_IDENTIFIER_print_arc(uint8_t *arcbuf, int arclen, int add, /* Arbitrary offset, required to process the first two arcs */ asn_app_consume_bytes_f *cb, void *app_key); +/* Same as above, but returns the number of written digits, instead of 0 */ +ssize_t OBJECT_IDENTIFIER__dump_arc(uint8_t *arcbuf, int arclen, int add, + asn_app_consume_bytes_f *cb, void *app_key); + /* * This function fills an (_arcs) array with OBJECT IDENTIFIER arcs * up to specified (_arc_slots) elements. diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index e0af730aa..4b7bd66ec 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -2,6 +2,7 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include #include #include @@ -14,11 +15,13 @@ static ber_tlv_tag_t asn1_DEF_OCTET_STRING_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { "OCTET STRING", + OCTET_STRING_free, + OCTET_STRING_print, /* non-ascii stuff, generally */ asn_generic_no_constraint, OCTET_STRING_decode_ber, OCTET_STRING_encode_der, - OCTET_STRING_print, /* non-ascii stuff, generally */ - OCTET_STRING_free, + 0, /* Not implemented yet */ + OCTET_STRING_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_OCTET_STRING_tags, sizeof(asn1_DEF_OCTET_STRING_tags) @@ -440,11 +443,11 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, /* * Encode OCTET STRING type using DER. */ -der_enc_rval_t +asn_enc_rval_t OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - der_enc_rval_t erval; + asn_enc_rval_t erval; OCTET_STRING_t *st = (OCTET_STRING_t *)ptr; int add_byte = 0; int is_bit_str = (td->specifics == (void *)-1); @@ -514,6 +517,84 @@ OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, return erval; } +asn_enc_rval_t +OCTET_STRING_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + static const char *h2c = "0123456789ABCDEF"; + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + asn_enc_rval_t er; + char scratch[16 * 3 + 4]; + char *p = scratch; + uint8_t *buf; + uint8_t *end; + size_t i; + + if(!st || !st->buf) { + er.encoded = -1; + er.failed_type = td; + er.structure_ptr = sptr; + return er; + } + + er.encoded = 0; + + /* + * Dump the contents of the buffer in hexadecimal. + */ + buf = st->buf; + end = buf + st->size; + if(flags & XER_F_CANONICAL) { + char *scend = scratch + (sizeof(scratch) - 2); + for(; buf < end; buf++) { + if(p >= scend) { + _ASN_CALLBACK(scratch, p - scratch); + er.encoded += p - scratch; + p = scratch; + } + *p++ = h2c[(*buf >> 4) & 0x0F]; + *p++ = h2c[*buf & 0x0F]; + } + } else { + for(i = 0; buf < end; buf++, i++) { + if(!(i % 16) && (i || st->size > 16)) { + _ASN_CALLBACK(scratch, p-scratch); + er.encoded += (p-scratch); + p = scratch; + _i_ASN_TEXT_INDENT(1, ilevel); + } + *p++ = h2c[(*buf >> 4) & 0x0F]; + *p++ = h2c[*buf & 0x0F]; + *p++ = 0x20; + } + if(i) p--; /* Remove the tail space */ + } + + _ASN_CALLBACK(scratch, p-scratch); /* Dump the rest */ + er.encoded += p - scratch; + + return er; +} + +asn_enc_rval_t +OCTET_STRING_encode_xer_ascii(asn1_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + asn_enc_rval_t er; + + (void)ilevel; /* Unused argument */ + (void)flags; /* Unused argument */ + + if(!st || !st->buf) + _ASN_ENCODE_FAILED; + + _ASN_CALLBACK(st->buf, st->size); + er.encoded = st->size; + + return er; +} + int OCTET_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { @@ -524,7 +605,7 @@ OCTET_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, uint8_t *buf; uint8_t *end; size_t i; - int ret; + int lvl; (void)td; /* Unused argument */ @@ -540,14 +621,15 @@ OCTET_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, if(cb(scratch, p - scratch, app_key) || cb("\n", 1, app_key)) return -1; - for(ret = 0; ret < ilevel; ret++) + for(lvl = 0; lvl < ilevel; lvl++) cb(" ", 1, app_key); p = scratch; } *p++ = h2c[(*buf >> 4) & 0x0F]; *p++ = h2c[*buf & 0x0F]; - *p++ = ' '; + *p++ = 0x20; } + if(i) p--; /* Remove the tail space */ return cb(scratch, p - scratch, app_key); } diff --git a/skeletons/OCTET_STRING.h b/skeletons/OCTET_STRING.h index df6ff4f23..a67cef94b 100644 --- a/skeletons/OCTET_STRING.h +++ b/skeletons/OCTET_STRING.h @@ -16,11 +16,13 @@ typedef struct OCTET_STRING { extern asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING; -ber_type_decoder_f OCTET_STRING_decode_ber; -der_type_encoder_f OCTET_STRING_encode_der; +asn_struct_free_f OCTET_STRING_free; asn_struct_print_f OCTET_STRING_print; asn_struct_print_f OCTET_STRING_print_ascii; -asn_struct_free_f OCTET_STRING_free; +ber_type_decoder_f OCTET_STRING_decode_ber; +der_type_encoder_f OCTET_STRING_encode_der; +xer_type_encoder_f OCTET_STRING_encode_xer; +xer_type_encoder_f OCTET_STRING_encode_xer_ascii; /*********************************** * Some handy conversion routines. * diff --git a/skeletons/ObjectDescriptor.c b/skeletons/ObjectDescriptor.c index 5017918ea..4ddcaac7a 100644 --- a/skeletons/ObjectDescriptor.c +++ b/skeletons/ObjectDescriptor.c @@ -2,6 +2,7 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include /* @@ -13,11 +14,13 @@ static ber_tlv_tag_t asn1_DEF_ObjectDescriptor_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_ObjectDescriptor = { "ObjectDescriptor", + OCTET_STRING_free, + OCTET_STRING_print_ascii, /* Treat as ASCII subset (it's not) */ asn_generic_unknown_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_print_ascii, /* Treat as ASCII subset (it's not) */ - OCTET_STRING_free, + 0, /* Not implemented yet */ + OCTET_STRING_encode_xer_ascii,/* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ asn1_DEF_ObjectDescriptor_tags, sizeof(asn1_DEF_ObjectDescriptor_tags) diff --git a/skeletons/PrintableString.c b/skeletons/PrintableString.c index c37de4970..1368447f2 100644 --- a/skeletons/PrintableString.c +++ b/skeletons/PrintableString.c @@ -2,6 +2,7 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include /* @@ -13,11 +14,13 @@ static ber_tlv_tag_t asn1_DEF_PrintableString_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_PrintableString = { "PrintableString", + OCTET_STRING_free, + OCTET_STRING_print_ascii, /* ASCII subset */ PrintableString_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_print_ascii, /* ASCII subset */ - OCTET_STRING_free, + 0, /* Not implemented yet */ + OCTET_STRING_encode_xer_ascii,/* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ asn1_DEF_PrintableString_tags, sizeof(asn1_DEF_PrintableString_tags) diff --git a/skeletons/REAL.c b/skeletons/REAL.c index e42a0613c..7c230103e 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -2,6 +2,7 @@ * Copyright (c) 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include #include #include /* for strtod(3) */ @@ -29,11 +30,13 @@ static ber_tlv_tag_t asn1_DEF_REAL_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_REAL = { "REAL", + INTEGER_free, + REAL_print, asn_generic_no_constraint, INTEGER_decode_ber, /* Implemented in terms of INTEGER type */ INTEGER_encode_der, - REAL_print, - INTEGER_free, + 0, /* Not implemented yet */ + REAL_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_REAL_tags, sizeof(asn1_DEF_REAL_tags) / sizeof(asn1_DEF_REAL_tags[0]), @@ -44,33 +47,113 @@ asn1_TYPE_descriptor_t asn1_DEF_REAL = { 0 /* No specifics */ }; +ssize_t +REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) { + char local_buf[32]; + char *buf = local_buf; + ssize_t buflen = sizeof(local_buf); + const char *fmt = canonical?"%15E":"f"; + ssize_t ret; + + do { + ret = snprintf(buf, buflen, fmt, d); + if(ret < 0) { + buflen <<= 1; + } else if(ret >= buflen) { + buflen = ret + 1; + } else { + buflen = ret; + break; + } + if(buf != local_buf) free(buf); + (void *)buf = MALLOC(buflen); + if(!buf) return -1; + } while(1); + + /* + * Transform the "[-]d.dddE+-dd" output into "[-]d.dddE[-]d" + */ + if(canonical) { + char *dot, *E; + char *end = buf + buflen; + + dot = (buf[0] == '-') ? (buf + 2) : (buf + 1); + if(*dot >= 0x30) { + errno = EINVAL; + return -1; /* Not a dot, really */ + } + *dot = '.'; /* Replace possible comma */ + + for(E = dot; dot < end; E++) { + if(*E == 'E') { + char *s = ++E; + if(*E == '+') { + /* Skip the "+" too */ + buflen -= 2; + } else { + buflen -= 1; + s++; + } + E += 2; + if(E[-1] != '0' || E > end) { + errno = EINVAL; + return -1; + } + for(; E <= end; s++, E++) + *s = *E; + } + } + if(E == end) { + errno = EINVAL; + return -1; /* No promised E */ + } + } + + ret = cb(buf, buflen, app_key); + if(buf != local_buf) free(buf); + return (ret < 0) ? -1 : buflen; +} + int REAL_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const REAL_t *st = (const REAL_t *)sptr; - char buf[128]; double d; - int ret; (void)td; /* Unused argument */ (void)ilevel; /* Unused argument */ - if(!st) + if(!st || !st->buf) return cb("", 8, app_key); if(asn1_REAL2double(st, &d)) return cb("", 7, app_key); - ret = snprintf(buf, sizeof(buf), "%f", d); - if(ret < 0 || ret >= sizeof(buf)) - return cb("", 7, app_key); + return (REAL__dump(d, 0, cb, app_key) < 0) ? -1 : 0; +} + +asn_enc_rval_t +REAL_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + REAL_t *st = (REAL_t *)sptr; + asn_enc_rval_t er; + double d; + + (void)ilevel; + + if(!st || !st->buf || asn1_REAL2double(st, &d)) + _ASN_ENCODE_FAILED; + + er.encoded = REAL__dump(d, flags & XER_F_CANONICAL, cb, app_key); + if(er.encoded < 0) _ASN_ENCODE_FAILED; - return cb(buf, ret, app_key); + return er; } int asn1_REAL2double(const REAL_t *st, double *dbl_value) { - unsigned long octv; + unsigned int octv; if(!st || !st->buf) { errno = EINVAL; @@ -158,7 +241,7 @@ asn1_REAL2double(const REAL_t *st, double *dbl_value) { sign = (octv & 0x40); /* bit 7 */ scaleF = (octv & 0x0C) >> 2; /* bits 4 to 3 */ - if(st->size <= (1 + (octv & 0x03))) { + if(st->size <= (int)(1 + (octv & 0x03))) { errno = EINVAL; return -1; } @@ -166,7 +249,7 @@ asn1_REAL2double(const REAL_t *st, double *dbl_value) { if((octv & 0x03) == 0x11) { /* 8.5.6.4, case d) */ elen = st->buf[1]; /* unsigned binary number */ - if(elen == 0 || st->size <= (2 + elen)) { + if(elen == 0 || st->size <= (int)(2 + elen)) { errno = EINVAL; return -1; } diff --git a/skeletons/REAL.h b/skeletons/REAL.h index 751000b8f..83f96d019 100644 --- a/skeletons/REAL.h +++ b/skeletons/REAL.h @@ -15,11 +15,14 @@ typedef struct REAL { extern asn1_TYPE_descriptor_t asn1_DEF_REAL; asn_struct_print_f REAL_print; +xer_type_encoder_f REAL_encode_xer; /*********************************** * Some handy conversion routines. * ***********************************/ +ssize_t REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key); + /* * Convert between native double type and REAL representation (DER). * RETURN VALUES: diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index bee795c48..5d1e1a9d0 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -2,6 +2,7 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include #include /* for CHAR_BIT */ #include @@ -15,11 +16,13 @@ static ber_tlv_tag_t asn1_DEF_RELATIVE_OID_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_RELATIVE_OID = { "RELATIVE-OID", + INTEGER_free, + RELATIVE_OID_print, asn_generic_no_constraint, INTEGER_decode_ber, /* Implemented in terms of INTEGER type */ OBJECT_IDENTIFIER_encode_der, - RELATIVE_OID_print, - INTEGER_free, + 0, /* Not implemented yet */ + RELATIVE_OID_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_RELATIVE_OID_tags, sizeof(asn1_DEF_RELATIVE_OID_tags) @@ -32,12 +35,39 @@ asn1_TYPE_descriptor_t asn1_DEF_RELATIVE_OID = { 0 /* No specifics */ }; +static ssize_t +RELATIVE_OID__dump_body(const RELATIVE_OID_t *st, asn_app_consume_bytes_f *cb, void *app_key) { + ssize_t wrote = 0; + ssize_t ret; + int startn; + int i; + + for(i = 0, startn = 0; i < st->size; i++) { + uint8_t b = st->buf[i]; + if((b & 0x80)) /* Continuation expected */ + continue; + if(startn) { + /* Separate arcs */ + if(cb(".", 1, app_key) < 0) + return -1; + wrote++; + } + + ret = OBJECT_IDENTIFIER__dump_arc(&st->buf[startn], + i - startn + 1, 0, cb, app_key); + if(ret < 0) return -1; + wrote += ret; + + startn = i + 1; + } + + return wrote; +} + int RELATIVE_OID_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const RELATIVE_OID_t *st = (const RELATIVE_OID_t *)sptr; - int startn; - int i; (void)td; /* Unused argument */ (void)ilevel; /* Unused argument */ @@ -49,21 +79,30 @@ RELATIVE_OID_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, if(cb("{ ", 2, app_key)) return -1; - for(i = 0, startn = 0; i < st->size; i++) { - uint8_t b = st->buf[i]; - if((b & 0x80)) /* Continuation expected */ - continue; - if(startn && cb(" ", 1, app_key)) /* Separate arcs */ - return -1; - if(OBJECT_IDENTIFIER_print_arc(&st->buf[startn], - i - startn + 1, 0, cb, app_key)) - return -1; - startn = i + 1; - } + if(RELATIVE_OID__dump_body(st, cb, app_key) < 0) + return -1; return cb(" }", 2, app_key); } +asn_enc_rval_t +RELATIVE_OID_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + RELATIVE_OID_t *st = (RELATIVE_OID_t *)sptr; + asn_enc_rval_t er; + + (void)ilevel; /* Unused argument */ + (void)flags; /* Unused argument */ + + if(!st || !st->buf) + _ASN_ENCODE_FAILED; + + er.encoded = RELATIVE_OID__dump_body(st, cb, app_key); + if(er.encoded < 0) _ASN_ENCODE_FAILED; + + return er; +} int RELATIVE_OID_get_arcs(RELATIVE_OID_t *roid, diff --git a/skeletons/RELATIVE-OID.h b/skeletons/RELATIVE-OID.h index 1dafb62d5..e6af93466 100644 --- a/skeletons/RELATIVE-OID.h +++ b/skeletons/RELATIVE-OID.h @@ -14,6 +14,7 @@ typedef OBJECT_IDENTIFIER_t RELATIVE_OID_t; extern asn1_TYPE_descriptor_t asn1_DEF_RELATIVE_OID; asn_struct_print_f RELATIVE_OID_print; +xer_type_encoder_f RELATIVE_OID_encode_xer; /********************************** * Some handy conversion routines * diff --git a/skeletons/T61String.c b/skeletons/T61String.c index b306a5ba6..d2ac2d5fc 100644 --- a/skeletons/T61String.c +++ b/skeletons/T61String.c @@ -2,6 +2,7 @@ * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include /* @@ -13,11 +14,13 @@ static ber_tlv_tag_t asn1_DEF_T61String_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_T61String = { "T61String", + OCTET_STRING_free, + OCTET_STRING_print, /* non-ascii string */ asn_generic_unknown_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_print, /* non-ascii string */ - OCTET_STRING_free, + 0, /* Not implemented yet */ + OCTET_STRING_encode_xer, /* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ asn1_DEF_T61String_tags, sizeof(asn1_DEF_T61String_tags) diff --git a/skeletons/TeletexString.c b/skeletons/TeletexString.c index 09f3eb6a0..7a5695341 100644 --- a/skeletons/TeletexString.c +++ b/skeletons/TeletexString.c @@ -2,6 +2,7 @@ * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include /* @@ -13,11 +14,13 @@ static ber_tlv_tag_t asn1_DEF_TeletexString_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_TeletexString = { "TeletexString", + OCTET_STRING_free, + OCTET_STRING_print, /* non-ascii string */ asn_generic_unknown_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_print, /* non-ascii string */ - OCTET_STRING_free, + 0, /* Not implemented yet */ + OCTET_STRING_encode_xer, /* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ asn1_DEF_TeletexString_tags, sizeof(asn1_DEF_TeletexString_tags) diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c index 029a43e4d..22e5498f2 100644 --- a/skeletons/UTCTime.c +++ b/skeletons/UTCTime.c @@ -2,6 +2,7 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include #include #include @@ -18,11 +19,13 @@ static ber_tlv_tag_t asn1_DEF_UTCTime_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_UTCTime = { "UTCTime", + OCTET_STRING_free, + UTCTime_print, UTCTime_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - UTCTime_print, - OCTET_STRING_free, + 0, /* Not implemented yet */ + UTCTime_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_UTCTime_tags, sizeof(asn1_DEF_UTCTime_tags) @@ -58,6 +61,36 @@ UTCTime_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return 0; } +asn_enc_rval_t +UTCTime_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + OCTET_STRING_t st; + + if(flags & XER_F_CANONICAL) { + char buf[32]; + struct tm tm; + ssize_t ret; + + errno = EPERM; + if(asn_UT2time((UTCTime_t *)sptr, &tm, 1) == -1 + && errno != EPERM) + _ASN_ENCODE_FAILED; + + ret = snprintf(buf, sizeof(buf), "%02d%02d%02d%02d%02d%02dZ", + tm.tm_year % 100, tm.tm_mon + 1, tm.tm_mday, + tm.tm_hour, tm.tm_min, tm.tm_sec); + assert(ret > 0 && ret < (int)sizeof(buf)); + + st.buf = (uint8_t *)buf; + st.size = ret; + sptr = &st; + } + + return OCTET_STRING_encode_xer_ascii(td, sptr, ilevel, flags, + cb, app_key); +} + int UTCTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { diff --git a/skeletons/UTCTime.h b/skeletons/UTCTime.h index d00dafb51..b026deddb 100644 --- a/skeletons/UTCTime.h +++ b/skeletons/UTCTime.h @@ -12,8 +12,9 @@ typedef OCTET_STRING_t UTCTime_t; /* Implemented using OCTET STRING */ extern asn1_TYPE_descriptor_t asn1_DEF_UTCTime; -asn_constr_check_f UTCTime_constraint; asn_struct_print_f UTCTime_print; +asn_constr_check_f UTCTime_constraint; +xer_type_encoder_f UTCTime_encode_xer; /*********************** * Some handy helpers. * diff --git a/skeletons/UTF8String.c b/skeletons/UTF8String.c index 40fef39b8..7220a6748 100644 --- a/skeletons/UTF8String.c +++ b/skeletons/UTF8String.c @@ -2,6 +2,7 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include /* @@ -13,11 +14,13 @@ static ber_tlv_tag_t asn1_DEF_UTF8String_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_UTF8String = { "UTF8String", + OCTET_STRING_free, + UTF8String_print, UTF8String_constraint, /* Check for invalid codes, etc. */ OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - UTF8String_print, - OCTET_STRING_free, + 0, /* Not implemented yet */ + OCTET_STRING_encode_xer_ascii, /* Already in UTF-8 format */ 0, /* Use generic outmost tag fetcher */ asn1_DEF_UTF8String_tags, sizeof(asn1_DEF_UTF8String_tags) diff --git a/skeletons/UTF8String.h b/skeletons/UTF8String.h index f18bf7030..543d31969 100644 --- a/skeletons/UTF8String.h +++ b/skeletons/UTF8String.h @@ -12,8 +12,8 @@ typedef OCTET_STRING_t UTF8String_t; /* Implemented in terms of OCTET STRING */ extern asn1_TYPE_descriptor_t asn1_DEF_UTF8String; -asn_constr_check_f UTF8String_constraint; asn_struct_print_f UTF8String_print; +asn_constr_check_f UTF8String_constraint; /* Returns length of UTF-8 string in characters or -1 if error. */ ssize_t UTF8String_length(const UTF8String_t *st, const char *opt_type_name, diff --git a/skeletons/UniversalString.c b/skeletons/UniversalString.c index 149889665..d56cd9254 100644 --- a/skeletons/UniversalString.c +++ b/skeletons/UniversalString.c @@ -2,6 +2,7 @@ * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include /* @@ -13,11 +14,13 @@ static ber_tlv_tag_t asn1_DEF_UniversalString_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_UniversalString = { "UniversalString", + OCTET_STRING_free, + UniversalString_print, /* Convert into UTF8 and print */ asn_generic_no_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - UniversalString_print, /* Convert into UTF8 and print */ - OCTET_STRING_free, + 0, /* Not implemented yet */ + UniversalString_encode_xer, /* Conver into UTF8 */ 0, /* Use generic outmost tag fetcher */ asn1_DEF_UniversalString_tags, sizeof(asn1_DEF_UniversalString_tags) @@ -31,29 +34,25 @@ asn1_TYPE_descriptor_t asn1_DEF_UniversalString = { }; -int -UniversalString_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, - asn_app_consume_bytes_f *cb, void *app_key) { - const UniversalString_t *st = (const UniversalString_t *)sptr; - uint32_t *wchar; - uint32_t *wend; +static ssize_t +UniversalString__dump(const UniversalString_t *st, + asn_app_consume_bytes_f *cb, void *app_key) { char scratch[128]; /* Scratchpad buffer */ - char *p; - - (void)td; /* Unused argument */ - (void)ilevel; /* Unused argument */ + char *p = scratch; + ssize_t wrote = 0; + uint8_t *ch; + uint8_t *end; - if(!st || !st->buf) return cb("", 8, app_key); - - wchar = (uint32_t *)st->buf; - wend = (uint32_t *)(st->buf + st->size); - for(p = scratch; wchar < wend; wchar++) { - uint32_t wc = (((uint8_t *)wchar)[0] << 24) - | (((uint8_t *)wchar)[1] << 16) - | (((uint8_t *)wchar)[2] << 8) - | ((uint8_t *)wchar)[3]; /* 4 bytes */ + ch = st->buf; + end = (st->buf + st->size); + for(end -= 3; ch < end; ch += 4) { + uint32_t wc = (ch[0] << 24) + | (ch[1] << 16) + | (ch[2] << 8) + | ch[3]; /* 4 bytes */ if(sizeof(scratch) - (p - scratch) < 6) { - if(cb(scratch, p - scratch, app_key)) + wrote += p - scratch; + if(cb(scratch, p - scratch, app_key) < 0) return -1; p = scratch; } @@ -87,5 +86,45 @@ UniversalString_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, } } - return cb(scratch, p - scratch, app_key); + wrote += p - scratch; + if(cb(scratch, p - scratch, app_key) < 0) + return -1; + + return wrote; } + +asn_enc_rval_t +UniversalString_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + const UniversalString_t *st = (const UniversalString_t *)sptr; + asn_enc_rval_t er; + + (void)ilevel; + (void)flags; + + if(!st || !st->buf) + _ASN_ENCODE_FAILED; + + er.encoded = UniversalString__dump(st, cb, app_key); + if(er.encoded < 0) _ASN_ENCODE_FAILED; + + return er; +} + +int +UniversalString_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const UniversalString_t *st = (const UniversalString_t *)sptr; + + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + + if(!st || !st->buf) return cb("", 8, app_key); + + if(UniversalString__dump(st, cb, app_key) < 0) + return -1; + + return 0; +} + diff --git a/skeletons/UniversalString.h b/skeletons/UniversalString.h index cafbc80cc..88875236f 100644 --- a/skeletons/UniversalString.h +++ b/skeletons/UniversalString.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _UniversalString_H_ @@ -13,5 +13,6 @@ typedef OCTET_STRING_t UniversalString_t; /* Implemented in terms of OCTET STRIN extern asn1_TYPE_descriptor_t asn1_DEF_UniversalString; asn_struct_print_f UniversalString_print; /* Human-readable output */ +xer_type_encoder_f UniversalString_encode_xer; #endif /* _UniversalString_H_ */ diff --git a/skeletons/VideotexString.c b/skeletons/VideotexString.c index 6d2eaeb62..f313ecb67 100644 --- a/skeletons/VideotexString.c +++ b/skeletons/VideotexString.c @@ -2,6 +2,7 @@ * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include /* @@ -13,11 +14,13 @@ static ber_tlv_tag_t asn1_DEF_VideotexString_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_VideotexString = { "VideotexString", + OCTET_STRING_free, + OCTET_STRING_print, /* non-ascii string */ asn_generic_unknown_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_print, /* non-ascii string */ - OCTET_STRING_free, + 0, /* Not implemented yet */ + OCTET_STRING_encode_xer, /* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ asn1_DEF_VideotexString_tags, sizeof(asn1_DEF_VideotexString_tags) diff --git a/skeletons/VisibleString.c b/skeletons/VisibleString.c index 9ddb0f1c8..dbd0e92e3 100644 --- a/skeletons/VisibleString.c +++ b/skeletons/VisibleString.c @@ -2,6 +2,7 @@ * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include /* @@ -13,11 +14,13 @@ static ber_tlv_tag_t asn1_DEF_VisibleString_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_VisibleString = { "VisibleString", + OCTET_STRING_free, + OCTET_STRING_print_ascii, /* ASCII subset */ VisibleString_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_print_ascii, /* ASCII subset */ - OCTET_STRING_free, + 0, /* Not implemented yet */ + OCTET_STRING_encode_xer_ascii,/* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ asn1_DEF_VisibleString_tags, sizeof(asn1_DEF_VisibleString_tags) diff --git a/skeletons/asn_SEQUENCE_OF.c b/skeletons/asn_SEQUENCE_OF.c index 7cfd45f3a..b2d5f1fa7 100644 --- a/skeletons/asn_SEQUENCE_OF.c +++ b/skeletons/asn_SEQUENCE_OF.c @@ -2,6 +2,7 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include /* for MALLOC/REALLOC/FREEMEM */ #include diff --git a/skeletons/asn_SET_OF.c b/skeletons/asn_SET_OF.c index c6afc30f8..7aeafddb1 100644 --- a/skeletons/asn_SET_OF.c +++ b/skeletons/asn_SET_OF.c @@ -2,6 +2,7 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include /* for MALLOC/REALLOC/FREEMEM */ #include #include diff --git a/skeletons/asn_internal.h b/skeletons/asn_internal.h new file mode 100644 index 000000000..6a44cab5b --- /dev/null +++ b/skeletons/asn_internal.h @@ -0,0 +1,72 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * Declarations internally useful for the ASN.1 support code. + */ +#ifndef _ASN_INTERNAL_H_ +#define _ASN_INTERNAL_H_ + +#define ASN1C_ENVIRONMENT_VERSION 96 /* Compile-time version */ +int get_asn1c_environment_version(void); /* Run-time version */ + +#include +#include + +#define CALLOC(nmemb, size) calloc(nmemb, size) +#define MALLOC(size) malloc(size) +#define REALLOC(oldptr, size) realloc(oldptr, size) +#define FREEMEM(ptr) free(ptr) + +/* + * A macro for debugging the ASN.1 internals. + * You may enable or override it. + */ +#ifndef ASN_DEBUG /* If debugging code is not defined elsewhere... */ +#if EMIT_ASN_DEBUG == 1 /* And it was asked to emit this code... */ +#ifdef __GNUC__ +#define ASN_DEBUG(fmt, args...) do { \ + fprintf(stderr, fmt, ##args); \ + fprintf(stderr, "\n"); \ + } while(0) +#else /* !__GNUC__ */ +extern void ASN_DEBUG_f(const char *fmt, ...); +#define ASN_DEBUG ASN_DEBUG_f +#endif /* __GNUC__ */ +#else /* EMIT_ASN_DEBUG != 1 */ +#ifdef __GNUC__ +#define ASN_DEBUG(fmt, args...) ((void)0) /* Emit a no-op operator */ +#else /* __GNUC__ */ +static void ASN_DEBUG(const char *fmt, ...) { (void)fmt; }; +#endif /* __GNUC__ */ +#endif /* EMIT_ASN_DEBUG */ +#endif /* ASN_DEBUG */ + +/* + * Invoke the application-supplied callback and fail, if something is wrong. + */ +#define __ASN_E_cbc(buf, size) (cb((buf), (size), app_key) == -1) +#define _ASN_E_CALLBACK(foo) do { \ + if(foo) _ASN_ENCODE_FAILED; \ + } while(0) +#define _ASN_CALLBACK(buf, size) \ + _ASN_E_CALLBACK(__ASN_E_cbc(buf, size)) +#define _ASN_CALLBACK2(buf1, size1, buf2, size2) \ + _ASN_E_CALLBACK(__ASN_E_cbc(buf1, size1) || __ASN_E_cbc(buf2, size2)) +#define _ASN_CALLBACK3(buf1, size1, buf2, size2, buf3, size3) \ + _ASN_E_CALLBACK(__ASN_E_cbc(buf1, size1) \ + || __ASN_E_cbc(buf2, size2) \ + || __ASN_E_cbc(buf3, size3)) + +#define _i_ASN_TEXT_INDENT(nl, level) do { \ + int __level = (level); \ + int __nl = ((nl) != 0); \ + int __i; \ + if(__nl) _ASN_CALLBACK("\n", 1); \ + for(__i = 0; __i < __level; __i++) \ + _ASN_CALLBACK(" ", 4); \ + er.encoded += __nl + 4 * __level; \ +} while(0) + +#endif /* _ASN_INTERNAL_H_ */ diff --git a/skeletons/asn_types.h b/skeletons/asn_types.h index a5620b556..80ab061e8 100644 --- a/skeletons/asn_types.h +++ b/skeletons/asn_types.h @@ -43,11 +43,6 @@ #define offsetof(s, m) ((ptrdiff_t)&(((s *)0)->m) - (ptrdiff_t)((s *)0)) #endif /* offsetof */ -#define CALLOC(nmemb, size) calloc(nmemb, size) -#define MALLOC(size) malloc(size) -#define REALLOC(oldptr, size) realloc(oldptr, size) -#define FREEMEM(ptr) free(ptr) - #ifndef MIN /* Suitable for comparing primitive types (integers) */ #if defined(__GNUC__) #define MIN(a,b) ({ __typeof a _a = a; __typeof b _b = b; \ @@ -57,31 +52,6 @@ #endif /* __GNUC__ */ #endif /* MIN */ -/* - * A macro for debugging the ASN.1 internals. - * You may enable or override it. - */ -#ifndef ASN_DEBUG /* If debugging code is not defined elsewhere... */ -#if EMIT_ASN_DEBUG == 1 /* And it was asked to emit this code... */ -#ifdef __GNUC__ -#define ASN_DEBUG(fmt, args...) do { \ - fprintf(stderr, fmt, ##args); \ - fprintf(stderr, "\n"); \ - } while(0) -#else /* !__GNUC__ */ -extern void ASN_DEBUG_f(const char *fmt, ...); -#define ASN_DEBUG ASN_DEBUG_f -#endif /* __GNUC__ */ -#else /* EMIT_ASN_DEBUG != 1 */ -#ifdef __GNUC__ -#define ASN_DEBUG(fmt, args...) ((void)0) /* Emit a no-op operator */ -#else /* __GNUC__ */ -static void ASN_DEBUG(const char *fmt, ...) { (void)fmt; }; -#endif /* __GNUC__ */ -#endif /* EMIT_ASN_DEBUG */ -#endif /* ASN_DEBUG */ - - /* * Generic type of an application-defined callback to return various * types of data to the application. diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c index 24a47ac9f..cd4072835 100644 --- a/skeletons/ber_decoder.c +++ b/skeletons/ber_decoder.c @@ -2,6 +2,7 @@ * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include #include diff --git a/skeletons/ber_tlv_length.c b/skeletons/ber_tlv_length.c index 508bc39ff..7daaaef68 100644 --- a/skeletons/ber_tlv_length.c +++ b/skeletons/ber_tlv_length.c @@ -2,6 +2,7 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include #include #include diff --git a/skeletons/ber_tlv_tag.c b/skeletons/ber_tlv_tag.c index c0a0d6a67..d66b78835 100644 --- a/skeletons/ber_tlv_tag.c +++ b/skeletons/ber_tlv_tag.c @@ -2,6 +2,7 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include #include #include diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index b7d38fbae..ac2bbd68f 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -2,6 +2,7 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include #include @@ -348,14 +349,14 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *td, RETURN(RC_OK); } -der_enc_rval_t +asn_enc_rval_t CHOICE_encode_der(asn1_TYPE_descriptor_t *td, void *struct_ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)td->specifics; asn1_TYPE_member_t *elm; /* CHOICE element */ - der_enc_rval_t erval; + asn_enc_rval_t erval; void *memb_ptr; size_t computed_size = 0; int present; @@ -536,6 +537,57 @@ CHOICE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } } +asn_enc_rval_t +CHOICE_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn1_CHOICE_specifics_t *specs=(asn1_CHOICE_specifics_t *)td->specifics; + asn_enc_rval_t er; + int present; + + if(!sptr) + _ASN_ENCODE_FAILED; + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); + + if(present <= 0 || present > td->elements_count) { + _ASN_ENCODE_FAILED; + } else { + asn_enc_rval_t tmper; + asn1_TYPE_member_t *elm = &td->elements[present-1]; + void *memb_ptr; + const char *mname = elm->name; + unsigned int mlen = strlen(mname); + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(!memb_ptr) _ASN_ENCODE_FAILED; + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + } + + er.encoded = 0; + + if(!(flags & XER_F_CANONICAL)) _i_ASN_TEXT_INDENT(1, ilevel); + _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); + + tmper = elm->type->xer_encoder(elm->type, memb_ptr, + ilevel + 1, flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + + _ASN_CALLBACK3("", 1); + + er.encoded += 5 + (2 * mlen) + tmper.encoded; + } + + if(!(flags & XER_F_CANONICAL)) _i_ASN_TEXT_INDENT(1, ilevel - 1); + + return er; +} + int CHOICE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { @@ -550,7 +602,7 @@ CHOICE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); /* - * Free that element. + * Print that element. */ if(present > 0 && present <= td->elements_count) { asn1_TYPE_member_t *elm = &td->elements[present-1]; diff --git a/skeletons/constr_CHOICE.h b/skeletons/constr_CHOICE.h index 327bae2e4..35b951105 100644 --- a/skeletons/constr_CHOICE.h +++ b/skeletons/constr_CHOICE.h @@ -31,11 +31,12 @@ typedef struct asn1_CHOICE_specifics_s { /* * A set specialized functions dealing with the CHOICE type. */ +asn_struct_free_f CHOICE_free; +asn_struct_print_f CHOICE_print; asn_constr_check_f CHOICE_constraint; ber_type_decoder_f CHOICE_decode_ber; der_type_encoder_f CHOICE_encode_der; +xer_type_encoder_f CHOICE_encode_xer; asn_outmost_tag_f CHOICE_outmost_tag; -asn_struct_print_f CHOICE_print; -asn_struct_free_f CHOICE_free; #endif /* _CONSTR_CHOICE_H_ */ diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 36412a657..9057ac036 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -2,6 +2,7 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include #include @@ -490,12 +491,12 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, /* * The DER encoder of the SEQUENCE type. */ -der_enc_rval_t +asn_enc_rval_t SEQUENCE_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { size_t computed_size = 0; - der_enc_rval_t erval; + asn_enc_rval_t erval; ssize_t ret; int edx; @@ -544,7 +545,7 @@ SEQUENCE_encode_der(asn1_TYPE_descriptor_t *td, */ for(edx = 0; edx < td->elements_count; edx++) { asn1_TYPE_member_t *elm = &td->elements[edx]; - der_enc_rval_t tmperval; + asn_enc_rval_t tmperval; void *memb_ptr; if(elm->flags & ATF_POINTER) { @@ -575,6 +576,50 @@ SEQUENCE_encode_der(asn1_TYPE_descriptor_t *td, return erval; } +asn_enc_rval_t +SEQUENCE_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er; + int xcan = (flags & XER_F_CANONICAL); + int edx; + + if(!sptr) + _ASN_ENCODE_FAILED; + + er.encoded = 0; + + for(edx = 0; edx < td->elements_count; edx++) { + asn_enc_rval_t tmper; + asn1_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; + const char *mname = elm->name; + unsigned int mlen = strlen(mname); + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(!memb_ptr) continue; /* OPTIONAL element? */ + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + } + + if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel); + _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); + + /* Print the member itself */ + tmper = elm->type->xer_encoder(elm->type, memb_ptr, + ilevel + 1, flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + + _ASN_CALLBACK3("", 1); + er.encoded += 5 + (2 * mlen) + tmper.encoded; + } + + if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); + + return er; +} + int SEQUENCE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { diff --git a/skeletons/constr_SEQUENCE.h b/skeletons/constr_SEQUENCE.h index 1e282c2b8..156db8c74 100644 --- a/skeletons/constr_SEQUENCE.h +++ b/skeletons/constr_SEQUENCE.h @@ -31,10 +31,11 @@ typedef struct asn1_SEQUENCE_specifics_s { /* * A set specialized functions dealing with the SEQUENCE type. */ +asn_struct_free_f SEQUENCE_free; +asn_struct_print_f SEQUENCE_print; asn_constr_check_f SEQUENCE_constraint; ber_type_decoder_f SEQUENCE_decode_ber; der_type_encoder_f SEQUENCE_encode_der; -asn_struct_print_f SEQUENCE_print; -asn_struct_free_f SEQUENCE_free; +xer_type_encoder_f SEQUENCE_encode_xer; #endif /* _CONSTR_SEQUENCE_H_ */ diff --git a/skeletons/constr_SEQUENCE_OF.c b/skeletons/constr_SEQUENCE_OF.c index 0a58f09a1..7330f659f 100644 --- a/skeletons/constr_SEQUENCE_OF.c +++ b/skeletons/constr_SEQUENCE_OF.c @@ -2,13 +2,14 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include #include /* * The DER encoder of the SEQUENCE OF type. */ -der_enc_rval_t +asn_enc_rval_t SEQUENCE_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -16,7 +17,7 @@ SEQUENCE_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, A_SEQUENCE_OF(void) *list; size_t computed_size = 0; ssize_t encoding_size = 0; - der_enc_rval_t erval; + asn_enc_rval_t erval; int edx; ASN_DEBUG("Estimating size of SEQUENCE OF %s", td->name); @@ -82,3 +83,50 @@ SEQUENCE_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, return erval; } +asn_enc_rval_t +SEQUENCE_OF_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er; + asn1_SET_OF_specifics_t *specs = (asn1_SET_OF_specifics_t *)td->specifics; + asn1_TYPE_member_t *element = td->elements; + A_SEQUENCE_OF(void) *list; + const char *mname = specs->as_XMLValueList + ? 0 : ((*element->name) ? element->name : element->type->name); + unsigned int mlen = mname ? strlen(mname) : 0; + int xcan = (flags & XER_F_CANONICAL); + int i; + + if(!sptr) _ASN_ENCODE_FAILED; + + er.encoded = 0; + + (void *)list = sptr; + for(i = 0; i < list->count; i++) { + asn_enc_rval_t tmper; + + void *memb_ptr = list->array[i]; + if(!memb_ptr) continue; + + if(mname) { + if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel); + _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); + } + + tmper = element->type->xer_encoder(element->type, memb_ptr, + ilevel + 1, flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + + if(mname) { + _ASN_CALLBACK3("", 1); + er.encoded += 5; + } + + er.encoded += (2 * mlen) + tmper.encoded; + } + + if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); + + return er; +} + diff --git a/skeletons/constr_SEQUENCE_OF.h b/skeletons/constr_SEQUENCE_OF.h index d2560c6a2..ee117508c 100644 --- a/skeletons/constr_SEQUENCE_OF.h +++ b/skeletons/constr_SEQUENCE_OF.h @@ -12,10 +12,11 @@ * A set specialized functions dealing with the SEQUENCE OF type. * Implemented using SET OF. */ +#define SEQUENCE_OF_free SET_OF_free +#define SEQUENCE_OF_print SET_OF_print #define SEQUENCE_OF_constraint SET_OF_constraint #define SEQUENCE_OF_decode_ber SET_OF_decode_ber der_type_encoder_f SEQUENCE_OF_encode_der; -#define SEQUENCE_OF_print SET_OF_print -#define SEQUENCE_OF_free SET_OF_free +xer_type_encoder_f SEQUENCE_OF_encode_xer; #endif /* _CONSTR_SET_OF_H_ */ diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index 7a3133402..4c0c3b770 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -2,6 +2,7 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include #include /* for assert() */ @@ -430,13 +431,13 @@ SET_decode_ber(asn1_TYPE_descriptor_t *td, /* * The DER encoder of the SET type. */ -der_enc_rval_t +asn_enc_rval_t SET_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn1_SET_specifics_t *specs = (asn1_SET_specifics_t *)td->specifics; size_t computed_size = 0; - der_enc_rval_t my_erval; + asn_enc_rval_t my_erval; int t2m_build_own = (specs->tag2el_count != td->elements_count); asn1_TYPE_tag2member_t *t2m; int t2m_count; @@ -469,7 +470,7 @@ SET_encode_der(asn1_TYPE_descriptor_t *td, */ for(edx = 0; edx < td->elements_count; edx++) { asn1_TYPE_member_t *elm = &td->elements[edx]; - der_enc_rval_t erval; + asn_enc_rval_t erval; void *memb_ptr; /* @@ -545,7 +546,7 @@ SET_encode_der(asn1_TYPE_descriptor_t *td, */ for(edx = 0; edx < td->elements_count; edx++) { asn1_TYPE_member_t *elm; - der_enc_rval_t erval; + asn_enc_rval_t erval; void *memb_ptr; /* Encode according to the tag order */ @@ -577,6 +578,52 @@ SET_encode_der(asn1_TYPE_descriptor_t *td, return my_erval; } +asn_enc_rval_t +SET_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er; + int xcan = (flags & XER_F_CANONICAL); + int edx; + + if(!sptr) + _ASN_ENCODE_FAILED; + + er.encoded = 0; + + for(edx = 0; edx < td->elements_count; edx++) { + asn_enc_rval_t tmper; + asn1_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; + const char *mname = elm->name; + unsigned int mlen = strlen(elm->name); + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(!memb_ptr) continue; /* OPTIONAL element? */ + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + } + + if(!xcan) + _i_ASN_TEXT_INDENT(1, ilevel); + _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); + + /* Print the member itself */ + tmper = elm->type->xer_encoder(elm->type, memb_ptr, + ilevel + 1, flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + + _ASN_CALLBACK3("", 1); + + er.encoded += 5 + (2 * mlen) + tmper.encoded; + } + + if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); + + return er; +} + int SET_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { diff --git a/skeletons/constr_SET.h b/skeletons/constr_SET.h index eab2c3070..eaf7df0ac 100644 --- a/skeletons/constr_SET.h +++ b/skeletons/constr_SET.h @@ -32,11 +32,12 @@ typedef struct asn1_SET_specifics_s { /* * A set specialized functions dealing with the SET type. */ +asn_struct_free_f SET_free; +asn_struct_print_f SET_print; asn_constr_check_f SET_constraint; ber_type_decoder_f SET_decode_ber; der_type_encoder_f SET_encode_der; -asn_struct_print_f SET_print; -asn_struct_free_f SET_free; +xer_type_encoder_f SET_encode_xer; /*********************** * Some handy helpers. * diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index d8dadf50e..0a8ee2819 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -2,6 +2,7 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include #include @@ -304,7 +305,7 @@ static int _el_buf_cmp(const void *ap, const void *bp) { /* * The DER encoder of the SET OF type. */ -der_enc_rval_t +asn_enc_rval_t SET_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -316,7 +317,7 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, ssize_t encoding_size = 0; struct _el_buffer *encoded_els; size_t max_encoded_len = 1; - der_enc_rval_t erval; + asn_enc_rval_t erval; int ret; int edx; @@ -444,6 +445,53 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, return erval; } +asn_enc_rval_t +SET_OF_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er; + asn1_SET_OF_specifics_t *specs=(asn1_SET_OF_specifics_t *)td->specifics; + asn1_TYPE_member_t *element = td->elements; + A_SET_OF(void) *list; + const char *mname = specs->as_XMLValueList + ? 0 : ((*element->name) ? element->name : element->type->name); + size_t mlen = mname ? strlen(mname) : 0; + int xcan = (flags & XER_F_CANONICAL); + int i; + + if(!sptr) _ASN_ENCODE_FAILED; + + er.encoded = 0; + + (void *)list = sptr; + for(i = 0; i < list->count; i++) { + asn_enc_rval_t tmper; + + void *memb_ptr = list->array[i]; + if(!memb_ptr) continue; + + if(mname) { + if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel); + _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); + } + + tmper = element->type->xer_encoder(element->type, memb_ptr, + ilevel + 1, flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + + if(mname) { + _ASN_CALLBACK3("", 1); + er.encoded += 5; + } + + er.encoded += (2 * mlen) + tmper.encoded; + } + + if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); + + return er; +} + int SET_OF_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { diff --git a/skeletons/constr_SET_OF.h b/skeletons/constr_SET_OF.h index 0dd6040b6..1a1384daf 100644 --- a/skeletons/constr_SET_OF.h +++ b/skeletons/constr_SET_OF.h @@ -13,15 +13,19 @@ typedef struct asn1_SET_OF_specifics_s { */ int struct_size; /* Size of the target structure. */ int ctx_offset; /* Offset of the ber_dec_ctx_t member */ + + /* XER-specific stuff */ + int as_XMLValueList; /* The member type must be encoded like this */ } asn1_SET_OF_specifics_t; /* * A set specialized functions dealing with the SET OF type. */ +asn_struct_free_f SET_OF_free; +asn_struct_print_f SET_OF_print; asn_constr_check_f SET_OF_constraint; ber_type_decoder_f SET_OF_decode_ber; der_type_encoder_f SET_OF_encode_der; -asn_struct_print_f SET_OF_print; -asn_struct_free_f SET_OF_free; +xer_type_encoder_f SET_OF_encode_xer; #endif /* _CONSTR_SET_OF_H_ */ diff --git a/skeletons/constr_TYPE.c b/skeletons/constr_TYPE.c index 68cc50fa8..5085e4aad 100644 --- a/skeletons/constr_TYPE.c +++ b/skeletons/constr_TYPE.c @@ -2,9 +2,15 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include #include +/* + * Version of the ASN.1 infrastructure shipped with compiler. + */ +int get_asn1c_environment_version() { return ASN1C_ENVIRONMENT_VERSION; } + static asn_app_consume_bytes_f _print2fp; /* diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index 15a67261d..28e8e2cdd 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -2,19 +2,53 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ -#ifndef _CONSTR_TYPE_H_ -#define _CONSTR_TYPE_H_ +/* + * This file contains the declaration structure called "ASN.1 Type Definition", + * which holds all information necessary for encoding and decoding routines. + * This structure even contains pointer to these encoding and decoding routines + * for each defined ASN.1 type. + */ +#ifndef _CONSTR_TYPE_H +#define _CONSTR_TYPE_H #include /* System-dependent types */ + +struct asn1_TYPE_descriptor_s; /* Forward declaration */ +struct asn1_TYPE_member_s; /* Forward declaration */ + +/* + * Type of the return value of the encoding functions (der_encode, xer_encode). + */ +typedef struct asn_enc_rval_s { + /* + * Number of bytes encoded. + * -1 indicates failure to encode the structure. + * In this case, the members below this one are meaningful. + */ + ssize_t encoded; + + /* + * Members meaningful when (encoded == -1), for post mortem analysis. + */ + + /* Type which cannot be encoded */ + struct asn1_TYPE_descriptor_s *failed_type; + + /* Pointer to the structure of that type */ + void *structure_ptr; +} asn_enc_rval_t; +#define _ASN_ENCODE_FAILED do { \ + asn_enc_rval_t __er = { -1, td, sptr }; \ + return __er; \ +} while(0) + #include #include #include #include +#include #include -struct asn1_TYPE_descriptor_s; /* Forward declaration */ -struct asn1_TYPE_member_s; /* Forward declaration */ - /* * Free the structure according to its specification. * If (free_contents_only) is set, the wrapper structure itself (struct_ptr) @@ -58,11 +92,13 @@ typedef struct asn1_TYPE_descriptor_s { * Generalized functions for dealing with the specific type. * May be directly invoked by applications. */ + asn_struct_free_f *free_struct; /* Free the structure */ + asn_struct_print_f *print_struct; /* Human readable output */ asn_constr_check_f *check_constraints; /* Constraints validator */ ber_type_decoder_f *ber_decoder; /* Free-form BER decoder */ der_type_encoder_f *der_encoder; /* Canonical DER encoder */ - asn_struct_print_f *print_struct; /* Human readable output */ - asn_struct_free_f *free_struct; /* Free the structure */ + int (*xer_decoder);/* PLACEHOLDER */ /* Free-form XER decoder */ + xer_type_encoder_f *xer_encoder; /* [Canonical] XER encoder */ /* * Functions used internally. Should not be used by applications. @@ -129,6 +165,7 @@ typedef struct asn1_TYPE_tag2member_s { * RETURN VALUES: * 0: The structure is printed. * -1: Problem dumping the structure. + * (See also xer_fprint() in xer_encoder.h) */ int asn_fprint(FILE *stream, /* Destination stream descriptor */ asn1_TYPE_descriptor_t *td, /* ASN.1 type descriptor */ diff --git a/skeletons/constraints.c b/skeletons/constraints.c index 862d8f1e0..d95e3cbd0 100644 --- a/skeletons/constraints.c +++ b/skeletons/constraints.c @@ -1,3 +1,4 @@ +#include #include #include diff --git a/skeletons/der_encoder.c b/skeletons/der_encoder.c index be7149256..4f1936f8e 100644 --- a/skeletons/der_encoder.c +++ b/skeletons/der_encoder.c @@ -2,6 +2,7 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#include #include #include #include @@ -12,7 +13,7 @@ static ssize_t der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len, /* * The DER encoder of any type. */ -der_enc_rval_t +asn_enc_rval_t der_encode(asn1_TYPE_descriptor_t *type_descriptor, void *struct_ptr, asn_app_consume_bytes_f *consume_bytes, void *app_key) { diff --git a/skeletons/der_encoder.h b/skeletons/der_encoder.h index 052d9f4c2..fe64bccf9 100644 --- a/skeletons/der_encoder.h +++ b/skeletons/der_encoder.h @@ -9,33 +9,10 @@ struct asn1_TYPE_descriptor_s; /* Forward declaration */ -/* - * Type of the return value of the der_encode function. - */ -typedef struct der_enc_rval_s { - /* - * Number of bytes encoded. - * -1 indicates failure to encode the structure. - * In this case, the members below this one are meaningful. - */ - ssize_t encoded; - - /* - * Members meaningful when (encoded == -1), for post-mortem analysis. - */ - - /* Type which cannot be encoded */ - struct asn1_TYPE_descriptor_s *failed_type; - - /* Pointer to the structure of that type */ - void *structure_ptr; -} der_enc_rval_t; - - /* * The DER encoder of any type. May be invoked by the application. */ -der_enc_rval_t der_encode(struct asn1_TYPE_descriptor_s *type_descriptor, +asn_enc_rval_t der_encode(struct asn1_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ asn_app_consume_bytes_f *consume_bytes_cb, void *app_key /* Arbitrary callback argument */ @@ -44,7 +21,7 @@ der_enc_rval_t der_encode(struct asn1_TYPE_descriptor_s *type_descriptor, /* * Type of the generic DER encoder. */ -typedef der_enc_rval_t (der_type_encoder_f)( +typedef asn_enc_rval_t (der_type_encoder_f)( struct asn1_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ diff --git a/skeletons/file-dependencies b/skeletons/file-dependencies index 2fdb58181..25d10a079 100644 --- a/skeletons/file-dependencies +++ b/skeletons/file-dependencies @@ -44,6 +44,7 @@ constr_SET_OF.h constr_SET_OF.c asn_SET_OF.h COMMON-FILES: # This is a special section asn_types.h +asn_internal.h OCTET_STRING.h OCTET_STRING.c # This one is used too widely ber_decoder.h ber_decoder.c ber_tlv_length.h ber_tlv_length.c @@ -51,3 +52,4 @@ ber_tlv_tag.h ber_tlv_tag.c constr_TYPE.h constr_TYPE.c constraints.h constraints.c der_encoder.h der_encoder.c +xer_encoder.h xer_encoder.c diff --git a/skeletons/tests/check-GeneralizedTime.c b/skeletons/tests/check-GeneralizedTime.c index 59474e421..40008f0be 100644 --- a/skeletons/tests/check-GeneralizedTime.c +++ b/skeletons/tests/check-GeneralizedTime.c @@ -97,9 +97,9 @@ main(int ac, char **av) { * Dummy function. */ -der_enc_rval_t +asn_enc_rval_t OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - der_enc_rval_t erval; + asn_enc_rval_t erval; (void)td; (void)ptr; @@ -110,3 +110,17 @@ OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber return erval; } + +asn_enc_rval_t +OCTET_STRING_encode_xer_ascii(asn1_TYPE_descriptor_t *td, void *ptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t erval; + + (void)td; + (void)ptr; + (void)ilevel; + (void)flags; + (void)cb; + (void)app_key; + + return erval; +} diff --git a/skeletons/tests/check-UTCTime.c b/skeletons/tests/check-UTCTime.c index 1bd49b3c2..b8ad57b3a 100644 --- a/skeletons/tests/check-UTCTime.c +++ b/skeletons/tests/check-UTCTime.c @@ -64,9 +64,9 @@ main(int ac, char **av) { * Dummy function. */ -der_enc_rval_t +asn_enc_rval_t OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - der_enc_rval_t erval; + asn_enc_rval_t erval; (void)td; (void)ptr; @@ -77,3 +77,17 @@ OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber return erval; } + +asn_enc_rval_t +OCTET_STRING_encode_xer_ascii(asn1_TYPE_descriptor_t *td, void *ptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t erval; + + (void)td; + (void)ptr; + (void)ilevel; + (void)flags; + (void)cb; + (void)app_key; + + return erval; +} diff --git a/skeletons/tests/check-length.c b/skeletons/tests/check-length.c index 7746bcf30..6176ddd9f 100644 --- a/skeletons/tests/check-length.c +++ b/skeletons/tests/check-length.c @@ -36,7 +36,7 @@ static void check(int size) { OCTET_STRING_t *os; OCTET_STRING_t *nos = 0; - der_enc_rval_t erval; + asn_enc_rval_t erval; ber_dec_rval_t rval; int i; diff --git a/skeletons/xer_encoder.c b/skeletons/xer_encoder.c new file mode 100644 index 000000000..51f8d1d5a --- /dev/null +++ b/skeletons/xer_encoder.c @@ -0,0 +1,71 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include +#include + +/* + * The XER encoder of any type. May be invoked by the application. + */ +asn_enc_rval_t +xer_encode(asn1_TYPE_descriptor_t *td, void *sptr, + enum xer_encoder_flags_e xer_flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er, tmper; + const char *mname; + size_t mlen; + int xcan = (xer_flags & XER_F_CANONICAL) ? 1 : 2; + + if(!td || !sptr) { + er.encoded = -1; + er.failed_type = td; + er.structure_ptr = sptr; + return er; + } + + mname = td->name; + mlen = strlen(mname); + + _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); + + tmper = td->xer_encoder(td, sptr, 1, xer_flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + + _ASN_CALLBACK3("\n",xcan); + + er.encoded = 2 + (2 * xcan) + (2 * mlen) + tmper.encoded; + + return er; +} + +static int _print2fp(const void *buffer, size_t size, void *app_key); + +int +xer_fprint(FILE *stream, asn1_TYPE_descriptor_t *td, void *sptr) { + asn_enc_rval_t er; + + if(!stream) stream = stdout; + if(!td || !sptr) + return -1; + + er = xer_encode(td, sptr, XER_F_BASIC, _print2fp, stream); + if(er.encoded == -1) + return -1; + + return fflush(stream); +} + +static int +_print2fp(const void *buffer, size_t size, void *app_key) { + FILE *stream = (FILE *)app_key; + + if(fwrite(buffer, 1, size, stream) != size) + return -1; + + return 0; +} + diff --git a/skeletons/xer_encoder.h b/skeletons/xer_encoder.h new file mode 100644 index 000000000..43c192d39 --- /dev/null +++ b/skeletons/xer_encoder.h @@ -0,0 +1,51 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _XER_ENCODER_H_ +#define _XER_ENCODER_H_ + +#include + +struct asn1_TYPE_descriptor_s; /* Forward declaration */ + +/* Flags used by the xer_encode() and (*xer_type_encoder_f), defined below */ +enum xer_encoder_flags_e { + /* Mode of encoding */ + XER_F_BASIC = 0x01, /* BASIC-XER (pretty-printing) */ + XER_F_CANONICAL = 0x02, /* Canonical XER (strict rules, unreadable) */ +}; + +/* + * The XER encoder of any type. May be invoked by the application. + */ +asn_enc_rval_t xer_encode(struct asn1_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, /* Structure to be encoded */ + enum xer_encoder_flags_e xer_flags, + asn_app_consume_bytes_f *consume_bytes_cb, + void *app_key /* Arbitrary callback argument */ + ); + +/* + * The variant of the above function which dumps the BASIC-XER (XER_F_BASIC) + * output into the chosen file pointer. + * RETURN VALUES: + * 0: The structure is printed. + * -1: Problem printing the structure. + * WARNING: No sensible errno value is returned. + */ +int xer_fprint(FILE *stream, struct asn1_TYPE_descriptor_s *td, void *sptr); + +/* + * Type of the generic XER encoder. + */ +typedef asn_enc_rval_t (xer_type_encoder_f)( + struct asn1_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, /* Structure to be encoded */ + int ilevel, /* Level of indentation */ + enum xer_encoder_flags_e xer_flags, + asn_app_consume_bytes_f *consume_bytes_cb, /* Callback */ + void *app_key /* Arbitrary callback argument */ + ); + +#endif /* _XER_ENCODER_H_ */ diff --git a/tests/19-param-OK.asn1.-P b/tests/19-param-OK.asn1.-P index e980f1c5f..fa6aaf31e 100644 --- a/tests/19-param-OK.asn1.-P +++ b/tests/19-param-OK.asn1.-P @@ -108,11 +108,13 @@ static asn1_SEQUENCE_specifics_t asn1_DEF_toBeSigned_specs = { static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_toBeSigned = { "toBeSigned", + SEQUENCE_free, + SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - SEQUENCE_print, - SEQUENCE_free, + 0, /* Not implemented yet */ + SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_toBeSigned_tags, sizeof(asn1_DEF_toBeSigned_tags) @@ -167,11 +169,13 @@ static asn1_SEQUENCE_specifics_t asn1_DEF_Certificate_specs = { }; asn1_TYPE_descriptor_t asn1_DEF_Certificate = { "Certificate", + SEQUENCE_free, + SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - SEQUENCE_print, - SEQUENCE_free, + 0, /* Not implemented yet */ + SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Certificate_tags, sizeof(asn1_DEF_Certificate_tags) @@ -223,14 +227,17 @@ static ber_tlv_tag_t asn1_DEF_Name_tags[] = { static asn1_SET_OF_specifics_t asn1_DEF_Name_specs = { sizeof(struct Name), offsetof(struct Name, _ber_dec_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ }; asn1_TYPE_descriptor_t asn1_DEF_Name = { "Name", + SEQUENCE_OF_free, + SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, - SEQUENCE_OF_print, - SEQUENCE_OF_free, + 0, /* Not implemented yet */ + SEQUENCE_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Name_tags, sizeof(asn1_DEF_Name_tags) @@ -337,14 +344,17 @@ static ber_tlv_tag_t asn1_DEF_RelativeDistinguishedName_tags[] = { static asn1_SET_OF_specifics_t asn1_DEF_RelativeDistinguishedName_specs = { sizeof(struct RelativeDistinguishedName), offsetof(struct RelativeDistinguishedName, _ber_dec_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ }; asn1_TYPE_descriptor_t asn1_DEF_RelativeDistinguishedName = { "RelativeDistinguishedName", + SET_OF_free, + SET_OF_print, SET_OF_constraint, SET_OF_decode_ber, SET_OF_encode_der, - SET_OF_print, - SET_OF_free, + 0, /* Not implemented yet */ + SET_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_RelativeDistinguishedName_tags, sizeof(asn1_DEF_RelativeDistinguishedName_tags) diff --git a/tests/31-set-of-OK.asn1.-P b/tests/31-set-of-OK.asn1.-P index d16751276..ce284dfca 100644 --- a/tests/31-set-of-OK.asn1.-P +++ b/tests/31-set-of-OK.asn1.-P @@ -36,14 +36,17 @@ static ber_tlv_tag_t asn1_DEF_Forest_tags[] = { static asn1_SET_OF_specifics_t asn1_DEF_Forest_specs = { sizeof(struct Forest), offsetof(struct Forest, _ber_dec_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ }; asn1_TYPE_descriptor_t asn1_DEF_Forest = { "Forest", + SET_OF_free, + SET_OF_print, SET_OF_constraint, SET_OF_decode_ber, SET_OF_encode_der, - SET_OF_print, - SET_OF_free, + 0, /* Not implemented yet */ + SET_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Forest_tags, sizeof(asn1_DEF_Forest_tags) @@ -113,11 +116,13 @@ static asn1_SEQUENCE_specifics_t asn1_DEF_Tree_specs = { }; asn1_TYPE_descriptor_t asn1_DEF_Tree = { "Tree", + SEQUENCE_free, + SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - SEQUENCE_print, - SEQUENCE_free, + 0, /* Not implemented yet */ + SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Tree_tags, sizeof(asn1_DEF_Tree_tags) @@ -205,15 +210,18 @@ static ber_tlv_tag_t asn1_DEF_trees_tags[] = { static asn1_SET_OF_specifics_t asn1_DEF_trees_specs = { sizeof(struct trees), offsetof(struct trees, _ber_dec_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ }; static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_trees = { "trees", + SET_OF_free, + SET_OF_print, SET_OF_constraint, SET_OF_decode_ber, SET_OF_encode_der, - SET_OF_print, - SET_OF_free, + 0, /* Not implemented yet */ + SET_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_trees_tags, sizeof(asn1_DEF_trees_tags) @@ -253,11 +261,13 @@ static asn1_SEQUENCE_specifics_t asn1_DEF_anything_member_specs = { static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_anything_member = { "", + SEQUENCE_free, + SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - SEQUENCE_print, - SEQUENCE_free, + 0, /* Not implemented yet */ + SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_anything_member_tags, sizeof(asn1_DEF_anything_member_tags) @@ -287,15 +297,18 @@ static ber_tlv_tag_t asn1_DEF_anything_tags[] = { static asn1_SET_OF_specifics_t asn1_DEF_anything_specs = { sizeof(struct anything), offsetof(struct anything, _ber_dec_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ }; static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_anything = { "anything", + SET_OF_free, + SET_OF_print, SET_OF_constraint, SET_OF_decode_ber, SET_OF_encode_der, - SET_OF_print, - SET_OF_free, + 0, /* Not implemented yet */ + SET_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_anything_tags, sizeof(asn1_DEF_anything_tags) @@ -346,11 +359,13 @@ static asn1_SET_specifics_t asn1_DEF_Stuff_specs = { }; asn1_TYPE_descriptor_t asn1_DEF_Stuff = { "Stuff", + SET_free, + SET_print, SET_constraint, SET_decode_ber, SET_encode_der, - SET_print, - SET_free, + 0, /* Not implemented yet */ + SET_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Stuff_tags, sizeof(asn1_DEF_Stuff_tags) diff --git a/tests/32-sequence-of-OK.asn1.-P b/tests/32-sequence-of-OK.asn1.-P new file mode 100644 index 000000000..5b3d606ce --- /dev/null +++ b/tests/32-sequence-of-OK.asn1.-P @@ -0,0 +1,182 @@ + +/*** <<< INCLUDES [Programming] >>> ***/ + +#include +#include +#include + +/*** <<< DEPS [Programming] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Programming; + +/*** <<< TYPE-DECLS [Programming] >>> ***/ + + +typedef struct Programming { + A_SEQUENCE_OF(Fault_t) list; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} Programming_t; + +/*** <<< STAT-DEFS [Programming] >>> ***/ + +static asn1_TYPE_member_t asn1_MBR_Programming[] = { + { ATF_NOFLAGS, 0, 0, + .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn1_DEF_Fault, + .memb_constraints = 0, /* Defer to actual type */ + .name = "" + }, +}; +static ber_tlv_tag_t asn1_DEF_Programming_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_SET_OF_specifics_t asn1_DEF_Programming_specs = { + sizeof(struct Programming), + offsetof(struct Programming, _ber_dec_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn1_TYPE_descriptor_t asn1_DEF_Programming = { + "Programming", + SEQUENCE_OF_free, + SEQUENCE_OF_print, + SEQUENCE_OF_constraint, + SEQUENCE_OF_decode_ber, + SEQUENCE_OF_encode_der, + 0, /* Not implemented yet */ + SEQUENCE_OF_encode_xer, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Programming_tags, + sizeof(asn1_DEF_Programming_tags) + /sizeof(asn1_DEF_Programming_tags[0]), /* 1 */ + asn1_DEF_Programming_tags, /* Same as above */ + sizeof(asn1_DEF_Programming_tags) + /sizeof(asn1_DEF_Programming_tags[0]), /* 1 */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_Programming, + 1, /* Single element */ + &asn1_DEF_Programming_specs /* Additional specs */ +}; + + +/*** <<< INCLUDES [Fault] >>> ***/ + +#include +#include +#include + +/*** <<< DEPS [Fault] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Fault; + +/*** <<< TYPE-DECLS [Fault] >>> ***/ + + +typedef struct Fault { + A_SET_OF(Error_t) list; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} Fault_t; + +/*** <<< STAT-DEFS [Fault] >>> ***/ + +static asn1_TYPE_member_t asn1_MBR_Fault[] = { + { ATF_NOFLAGS, 0, 0, + .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_Error, + .memb_constraints = 0, /* Defer to actual type */ + .name = "" + }, +}; +static ber_tlv_tag_t asn1_DEF_Fault_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) +}; +static asn1_SET_OF_specifics_t asn1_DEF_Fault_specs = { + sizeof(struct Fault), + offsetof(struct Fault, _ber_dec_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn1_TYPE_descriptor_t asn1_DEF_Fault = { + "Fault", + SET_OF_free, + SET_OF_print, + SET_OF_constraint, + SET_OF_decode_ber, + SET_OF_encode_der, + 0, /* Not implemented yet */ + SET_OF_encode_xer, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Fault_tags, + sizeof(asn1_DEF_Fault_tags) + /sizeof(asn1_DEF_Fault_tags[0]), /* 1 */ + asn1_DEF_Fault_tags, /* Same as above */ + sizeof(asn1_DEF_Fault_tags) + /sizeof(asn1_DEF_Fault_tags[0]), /* 1 */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_Fault, + 1, /* Single element */ + &asn1_DEF_Fault_specs /* Additional specs */ +}; + + +/*** <<< INCLUDES [Error] >>> ***/ + +#include + +/*** <<< DEPS [Error] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_Error; + +/*** <<< TYPE-DECLS [Error] >>> ***/ + + +typedef struct Error { + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} Error_t; + +/*** <<< STAT-DEFS [Error] >>> ***/ + +static ber_tlv_tag_t asn1_DEF_Error_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_TYPE_tag2member_t asn1_DEF_Error_tag2el[] = { +}; +static asn1_SEQUENCE_specifics_t asn1_DEF_Error_specs = { + sizeof(struct Error), + offsetof(struct Error, _ber_dec_ctx), + asn1_DEF_Error_tag2el, + 0, /* Count of tags in the map */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn1_TYPE_descriptor_t asn1_DEF_Error = { + "Error", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + 0, /* Not implemented yet */ + SEQUENCE_encode_xer, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_Error_tags, + sizeof(asn1_DEF_Error_tags) + /sizeof(asn1_DEF_Error_tags[0]), /* 1 */ + asn1_DEF_Error_tags, /* Same as above */ + sizeof(asn1_DEF_Error_tags) + /sizeof(asn1_DEF_Error_tags[0]), /* 1 */ + 1, /* Whether CONSTRUCTED */ + 0, 0, /* No members */ + &asn1_DEF_Error_specs /* Additional specs */ +}; + diff --git a/tests/39-sequence-of-OK.asn1.-P b/tests/39-sequence-of-OK.asn1.-P index 04b9948d6..bd13dfd31 100644 --- a/tests/39-sequence-of-OK.asn1.-P +++ b/tests/39-sequence-of-OK.asn1.-P @@ -44,15 +44,18 @@ static ber_tlv_tag_t asn1_DEF_collection_tags[] = { static asn1_SET_OF_specifics_t asn1_DEF_collection_specs = { sizeof(struct collection), offsetof(struct collection, _ber_dec_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ }; static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_collection = { "collection", + SEQUENCE_OF_free, + SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, - SEQUENCE_OF_print, - SEQUENCE_OF_free, + 0, /* Not implemented yet */ + SEQUENCE_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_collection_tags, sizeof(asn1_DEF_collection_tags) @@ -99,11 +102,13 @@ static asn1_SEQUENCE_specifics_t asn1_DEF_T_specs = { }; asn1_TYPE_descriptor_t asn1_DEF_T = { "T", + SEQUENCE_free, + SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - SEQUENCE_print, - SEQUENCE_free, + 0, /* Not implemented yet */ + SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T_tags, sizeof(asn1_DEF_T_tags) @@ -174,11 +179,13 @@ static asn1_SEQUENCE_specifics_t asn1_DEF_T2_specs = { }; asn1_TYPE_descriptor_t asn1_DEF_T2 = { "T2", + SEQUENCE_free, + SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - SEQUENCE_print, - SEQUENCE_free, + 0, /* Not implemented yet */ + SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T2_tags, sizeof(asn1_DEF_T2_tags) diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index 72044d3f5..ef05fa512 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -80,15 +80,18 @@ static ber_tlv_tag_t asn1_DEF_varsets_tags[] = { static asn1_SET_OF_specifics_t asn1_DEF_varsets_specs = { sizeof(struct varsets), offsetof(struct varsets, _ber_dec_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ }; static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_varsets = { "varsets", + SEQUENCE_OF_free, + SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, - SEQUENCE_OF_print, - SEQUENCE_OF_free, + 0, /* Not implemented yet */ + SEQUENCE_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_varsets_tags, sizeof(asn1_DEF_varsets_tags) @@ -135,11 +138,13 @@ static asn1_SEQUENCE_specifics_t asn1_DEF_LogLine_specs = { }; asn1_TYPE_descriptor_t asn1_DEF_LogLine = { "LogLine", + SEQUENCE_free, + SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - SEQUENCE_print, - SEQUENCE_free, + 0, /* Not implemented yet */ + SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_LogLine_tags, sizeof(asn1_DEF_LogLine_tags) @@ -226,15 +231,18 @@ static ber_tlv_tag_t asn1_DEF_vparts_tags[] = { static asn1_SET_OF_specifics_t asn1_DEF_vparts_specs = { sizeof(struct vparts), offsetof(struct vparts, _ber_dec_ctx), + 1, /* XER encoding is XMLValueList */ }; static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_vparts = { "vparts", + SEQUENCE_OF_free, + SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, - SEQUENCE_OF_print, - SEQUENCE_OF_free, + 0, /* Not implemented yet */ + SEQUENCE_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_vparts_tags, sizeof(asn1_DEF_vparts_tags) @@ -281,11 +289,13 @@ static asn1_SEQUENCE_specifics_t asn1_DEF_VariablePartSet_specs = { }; asn1_TYPE_descriptor_t asn1_DEF_VariablePartSet = { "VariablePartSet", + SEQUENCE_free, + SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - SEQUENCE_print, - SEQUENCE_free, + 0, /* Not implemented yet */ + SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_VariablePartSet_tags, sizeof(asn1_DEF_VariablePartSet_tags) @@ -400,15 +410,18 @@ static ber_tlv_tag_t asn1_DEF_vset_tags[] = { static asn1_SET_OF_specifics_t asn1_DEF_vset_specs = { sizeof(struct vset), offsetof(struct vset, _ber_dec_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ }; static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_vset = { "vset", + SET_OF_free, + SET_OF_print, SET_OF_constraint, SET_OF_decode_ber, SET_OF_encode_der, - SET_OF_print, - SET_OF_free, + 0, /* Not implemented yet */ + SET_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_vset_tags, sizeof(asn1_DEF_vset_tags) @@ -456,11 +469,13 @@ static asn1_SEQUENCE_specifics_t asn1_DEF_vrange_specs = { static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_vrange = { "vrange", + SEQUENCE_free, + SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - SEQUENCE_print, - SEQUENCE_free, + 0, /* Not implemented yet */ + SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_vrange_tags, sizeof(asn1_DEF_vrange_tags) @@ -505,11 +520,13 @@ static asn1_CHOICE_specifics_t asn1_DEF_VariablePart_specs = { }; asn1_TYPE_descriptor_t asn1_DEF_VariablePart = { "VariablePart", + CHOICE_free, + CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, - CHOICE_print, - CHOICE_free, + 0, /* Not implemented yet */ + CHOICE_encode_xer, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ @@ -590,15 +607,18 @@ static ber_tlv_tag_t asn1_DEF_email_tags[] = { static asn1_SET_OF_specifics_t asn1_DEF_email_specs = { sizeof(struct email), offsetof(struct email, _ber_dec_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ }; static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_email = { "email", + SET_OF_free, + SET_OF_print, SET_OF_constraint, SET_OF_decode_ber, SET_OF_encode_der, - SET_OF_print, - SET_OF_free, + 0, /* Not implemented yet */ + SET_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_email_tags, sizeof(asn1_DEF_email_tags) @@ -646,11 +666,13 @@ static asn1_SEQUENCE_specifics_t asn1_DEF_notify_specs = { static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_notify = { "notify", + SEQUENCE_free, + SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - SEQUENCE_print, - SEQUENCE_free, + 0, /* Not implemented yet */ + SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_notify_tags, sizeof(asn1_DEF_notify_tags) @@ -697,11 +719,13 @@ static asn1_SEQUENCE_specifics_t asn1_DEF_ActionItem_specs = { }; asn1_TYPE_descriptor_t asn1_DEF_ActionItem = { "ActionItem", + SEQUENCE_free, + SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - SEQUENCE_print, - SEQUENCE_free, + 0, /* Not implemented yet */ + SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_ActionItem_tags, sizeof(asn1_DEF_ActionItem_tags) diff --git a/tests/43-recursion-OK.asn1.-P b/tests/43-recursion-OK.asn1.-P index 1f9352401..9c5945d2c 100644 --- a/tests/43-recursion-OK.asn1.-P +++ b/tests/43-recursion-OK.asn1.-P @@ -53,15 +53,18 @@ static ber_tlv_tag_t asn1_DEF_t_member1_tags[] = { static asn1_SET_OF_specifics_t asn1_DEF_t_member1_specs = { sizeof(struct t_member1), offsetof(struct t_member1, _ber_dec_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ }; static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_t_member1 = { "t-member1", + SET_OF_free, + SET_OF_print, SET_OF_constraint, SET_OF_decode_ber, SET_OF_encode_der, - SET_OF_print, - SET_OF_free, + 0, /* Not implemented yet */ + SET_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_t_member1_tags, sizeof(asn1_DEF_t_member1_tags) @@ -90,15 +93,18 @@ static ber_tlv_tag_t asn1_DEF_t_member2_tags[] = { static asn1_SET_OF_specifics_t asn1_DEF_t_member2_specs = { sizeof(struct t_member2), offsetof(struct t_member2, _ber_dec_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ }; static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_t_member2 = { "t-member2", + SEQUENCE_OF_free, + SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, - SEQUENCE_OF_print, - SEQUENCE_OF_free, + 0, /* Not implemented yet */ + SEQUENCE_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_t_member2_tags, sizeof(asn1_DEF_t_member2_tags) @@ -161,11 +167,13 @@ static asn1_SEQUENCE_specifics_t asn1_DEF_Test_structure_1_specs = { }; asn1_TYPE_descriptor_t asn1_DEF_Test_structure_1 = { "Test-structure-1", + SEQUENCE_free, + SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - SEQUENCE_print, - SEQUENCE_free, + 0, /* Not implemented yet */ + SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Test_structure_1_tags, sizeof(asn1_DEF_Test_structure_1_tags) @@ -238,15 +246,18 @@ static ber_tlv_tag_t asn1_DEF_or_tags[] = { static asn1_SET_OF_specifics_t asn1_DEF_or_specs = { sizeof(struct or), offsetof(struct or, _ber_dec_ctx), + 1, /* XER encoding is XMLValueList */ }; static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_or = { "or", + SET_OF_free, + SET_OF_print, SET_OF_constraint, SET_OF_decode_ber, SET_OF_encode_der, - SET_OF_print, - SET_OF_free, + 0, /* Not implemented yet */ + SET_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_or_tags, sizeof(asn1_DEF_or_tags) @@ -307,11 +318,13 @@ static asn1_CHOICE_specifics_t asn1_DEF_Choice_1_specs = { }; asn1_TYPE_descriptor_t asn1_DEF_Choice_1 = { "Choice-1", + CHOICE_free, + CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, - CHOICE_print, - CHOICE_free, + 0, /* Not implemented yet */ + CHOICE_encode_xer, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ diff --git a/tests/44-choice-in-sequence-OK.asn1.-P b/tests/44-choice-in-sequence-OK.asn1.-P index 5ac269d3b..4fcddc4bc 100644 --- a/tests/44-choice-in-sequence-OK.asn1.-P +++ b/tests/44-choice-in-sequence-OK.asn1.-P @@ -100,11 +100,13 @@ static asn1_CHOICE_specifics_t asn1_DEF_e_specs = { static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_e = { "e", + CHOICE_free, + CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, - CHOICE_print, - CHOICE_free, + 0, /* Not implemented yet */ + CHOICE_encode_xer, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ @@ -148,11 +150,13 @@ static asn1_CHOICE_specifics_t asn1_DEF_h_specs = { static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_h = { "h", + CHOICE_free, + CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, - CHOICE_print, - CHOICE_free, + 0, /* Not implemented yet */ + CHOICE_encode_xer, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ @@ -213,11 +217,13 @@ static asn1_CHOICE_specifics_t asn1_DEF_b_specs = { static /* Use -fall-defs-global to expose */ asn1_TYPE_descriptor_t asn1_DEF_b = { "b", + CHOICE_free, + CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, - CHOICE_print, - CHOICE_free, + 0, /* Not implemented yet */ + CHOICE_encode_xer, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ @@ -267,11 +273,13 @@ static asn1_SEQUENCE_specifics_t asn1_DEF_T_specs = { }; asn1_TYPE_descriptor_t asn1_DEF_T = { "T", + SEQUENCE_free, + SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - SEQUENCE_print, - SEQUENCE_free, + 0, /* Not implemented yet */ + SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T_tags, sizeof(asn1_DEF_T_tags) diff --git a/tests/46-redefine-OK.asn1.-PR b/tests/46-redefine-OK.asn1.-PR index 9104df853..f89085e1d 100644 --- a/tests/46-redefine-OK.asn1.-PR +++ b/tests/46-redefine-OK.asn1.-PR @@ -11,11 +11,12 @@ typedef OCTET_STRING_t PrimitiveType_t; /*** <<< FUNC-DECLS [PrimitiveType] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_PrimitiveType; +asn_struct_free_f PrimitiveType_free; +asn_struct_print_f PrimitiveType_print; asn_constr_check_f PrimitiveType_constraint; ber_type_decoder_f PrimitiveType_decode_ber; der_type_encoder_f PrimitiveType_encode_der; -asn_struct_print_f PrimitiveType_print; -asn_struct_free_f PrimitiveType_free; +xer_type_encoder_f PrimitiveType_encode_xer; /*** <<< CODE [PrimitiveType] >>> ***/ @@ -35,16 +36,32 @@ PrimitiveType_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void PrimitiveType_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_OCTET_STRING.ber_decoder; - td->der_encoder = asn1_DEF_OCTET_STRING.der_encoder; td->free_struct = asn1_DEF_OCTET_STRING.free_struct; td->print_struct = asn1_DEF_OCTET_STRING.print_struct; + td->ber_decoder = asn1_DEF_OCTET_STRING.ber_decoder; + td->der_encoder = asn1_DEF_OCTET_STRING.der_encoder; + td->xer_decoder = asn1_DEF_OCTET_STRING.xer_decoder; + td->xer_encoder = asn1_DEF_OCTET_STRING.xer_encoder; td->last_tag_form = asn1_DEF_OCTET_STRING.last_tag_form; td->elements = asn1_DEF_OCTET_STRING.elements; td->elements_count = asn1_DEF_OCTET_STRING.elements_count; td->specifics = asn1_DEF_OCTET_STRING.specifics; } +void +PrimitiveType_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + PrimitiveType_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +PrimitiveType_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + PrimitiveType_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t PrimitiveType_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -52,7 +69,7 @@ PrimitiveType_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t PrimitiveType_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -60,18 +77,12 @@ PrimitiveType_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -PrimitiveType_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - PrimitiveType_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -PrimitiveType_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +PrimitiveType_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { PrimitiveType_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -82,11 +93,13 @@ static ber_tlv_tag_t asn1_DEF_PrimitiveType_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_PrimitiveType = { "PrimitiveType", + PrimitiveType_free, + PrimitiveType_print, PrimitiveType_constraint, PrimitiveType_decode_ber, PrimitiveType_encode_der, - PrimitiveType_print, - PrimitiveType_free, + 0, /* Not implemented yet */ + PrimitiveType_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_PrimitiveType_tags, sizeof(asn1_DEF_PrimitiveType_tags) @@ -146,11 +159,13 @@ static asn1_SEQUENCE_specifics_t asn1_DEF_ConstructedType_specs = { }; asn1_TYPE_descriptor_t asn1_DEF_ConstructedType = { "ConstructedType", + SEQUENCE_free, + SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - SEQUENCE_print, - SEQUENCE_free, + 0, /* Not implemented yet */ + SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_ConstructedType_tags, sizeof(asn1_DEF_ConstructedType_tags) @@ -177,11 +192,12 @@ typedef ConstructedType_t T_t; /*** <<< FUNC-DECLS [T] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_T; +asn_struct_free_f T_free; +asn_struct_print_f T_print; asn_constr_check_f T_constraint; ber_type_decoder_f T_decode_ber; der_type_encoder_f T_encode_der; -asn_struct_print_f T_print; -asn_struct_free_f T_free; +xer_type_encoder_f T_encode_xer; /*** <<< CODE [T] >>> ***/ @@ -201,16 +217,32 @@ T_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void T_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_ConstructedType.ber_decoder; - td->der_encoder = asn1_DEF_ConstructedType.der_encoder; td->free_struct = asn1_DEF_ConstructedType.free_struct; td->print_struct = asn1_DEF_ConstructedType.print_struct; + td->ber_decoder = asn1_DEF_ConstructedType.ber_decoder; + td->der_encoder = asn1_DEF_ConstructedType.der_encoder; + td->xer_decoder = asn1_DEF_ConstructedType.xer_decoder; + td->xer_encoder = asn1_DEF_ConstructedType.xer_encoder; td->last_tag_form = asn1_DEF_ConstructedType.last_tag_form; td->elements = asn1_DEF_ConstructedType.elements; td->elements_count = asn1_DEF_ConstructedType.elements_count; td->specifics = asn1_DEF_ConstructedType.specifics; } +void +T_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +T_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t T_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -218,7 +250,7 @@ T_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t T_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -226,18 +258,12 @@ T_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -T_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - T_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -T_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +T_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { T_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -249,11 +275,13 @@ static ber_tlv_tag_t asn1_DEF_T_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_T = { "T", + T_free, + T_print, T_constraint, T_decode_ber, T_encode_der, - T_print, - T_free, + 0, /* Not implemented yet */ + T_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T_tags, sizeof(asn1_DEF_T_tags) diff --git a/tests/47-set-ext-OK.asn1.-P b/tests/47-set-ext-OK.asn1.-P index 51b77acd6..bcc364b09 100644 --- a/tests/47-set-ext-OK.asn1.-P +++ b/tests/47-set-ext-OK.asn1.-P @@ -64,11 +64,13 @@ static asn1_SET_specifics_t asn1_DEF_T1_specs = { }; asn1_TYPE_descriptor_t asn1_DEF_T1 = { "T1", + SET_free, + SET_print, SET_constraint, SET_decode_ber, SET_encode_der, - SET_print, - SET_free, + 0, /* Not implemented yet */ + SET_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T1_tags, sizeof(asn1_DEF_T1_tags) @@ -148,11 +150,13 @@ static asn1_SET_specifics_t asn1_DEF_T2_specs = { }; asn1_TYPE_descriptor_t asn1_DEF_T2 = { "T2", + SET_free, + SET_print, SET_constraint, SET_decode_ber, SET_encode_der, - SET_print, - SET_free, + 0, /* Not implemented yet */ + SET_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T2_tags, sizeof(asn1_DEF_T2_tags) @@ -223,11 +227,13 @@ static asn1_CHOICE_specifics_t asn1_DEF_T3_specs = { }; asn1_TYPE_descriptor_t asn1_DEF_T3 = { "T3", + CHOICE_free, + CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, - CHOICE_print, - CHOICE_free, + 0, /* Not implemented yet */ + CHOICE_encode_xer, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ @@ -296,11 +302,13 @@ static asn1_CHOICE_specifics_t asn1_DEF_T4_specs = { }; asn1_TYPE_descriptor_t asn1_DEF_T4 = { "T4", + CHOICE_free, + CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, - CHOICE_print, - CHOICE_free, + 0, /* Not implemented yet */ + CHOICE_encode_xer, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ diff --git a/tests/50-constraint-OK.asn1.-P b/tests/50-constraint-OK.asn1.-P index 305dc5023..a03652fb3 100644 --- a/tests/50-constraint-OK.asn1.-P +++ b/tests/50-constraint-OK.asn1.-P @@ -11,11 +11,12 @@ typedef INTEGER_t Int1_t; /*** <<< FUNC-DECLS [Int1] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Int1; +asn_struct_free_f Int1_free; +asn_struct_print_f Int1_print; asn_constr_check_f Int1_constraint; ber_type_decoder_f Int1_decode_ber; der_type_encoder_f Int1_encode_der; -asn_struct_print_f Int1_print; -asn_struct_free_f Int1_free; +xer_type_encoder_f Int1_encode_xer; /*** <<< CODE [Int1] >>> ***/ @@ -35,16 +36,32 @@ Int1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void Int1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_INTEGER.ber_decoder; - td->der_encoder = asn1_DEF_INTEGER.der_encoder; td->free_struct = asn1_DEF_INTEGER.free_struct; td->print_struct = asn1_DEF_INTEGER.print_struct; + td->ber_decoder = asn1_DEF_INTEGER.ber_decoder; + td->der_encoder = asn1_DEF_INTEGER.der_encoder; + td->xer_decoder = asn1_DEF_INTEGER.xer_decoder; + td->xer_encoder = asn1_DEF_INTEGER.xer_encoder; td->last_tag_form = asn1_DEF_INTEGER.last_tag_form; td->elements = asn1_DEF_INTEGER.elements; td->elements_count = asn1_DEF_INTEGER.elements_count; td->specifics = asn1_DEF_INTEGER.specifics; } +void +Int1_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Int1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Int1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Int1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t Int1_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -52,7 +69,7 @@ Int1_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t Int1_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -60,18 +77,12 @@ Int1_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -Int1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - Int1_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -Int1_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +Int1_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { Int1_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -82,11 +93,13 @@ static ber_tlv_tag_t asn1_DEF_Int1_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_Int1 = { "Int1", + Int1_free, + Int1_print, Int1_constraint, Int1_decode_ber, Int1_encode_der, - Int1_print, - Int1_free, + 0, /* Not implemented yet */ + Int1_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Int1_tags, sizeof(asn1_DEF_Int1_tags) @@ -112,11 +125,12 @@ typedef Int1_t Int2_t; /*** <<< FUNC-DECLS [Int2] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Int2; +asn_struct_free_f Int2_free; +asn_struct_print_f Int2_print; asn_constr_check_f Int2_constraint; ber_type_decoder_f Int2_decode_ber; der_type_encoder_f Int2_encode_der; -asn_struct_print_f Int2_print; -asn_struct_free_f Int2_free; +xer_type_encoder_f Int2_encode_xer; /*** <<< CODE [Int2] >>> ***/ @@ -154,16 +168,32 @@ Int2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void Int2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_Int1.ber_decoder; - td->der_encoder = asn1_DEF_Int1.der_encoder; td->free_struct = asn1_DEF_Int1.free_struct; td->print_struct = asn1_DEF_Int1.print_struct; + td->ber_decoder = asn1_DEF_Int1.ber_decoder; + td->der_encoder = asn1_DEF_Int1.der_encoder; + td->xer_decoder = asn1_DEF_Int1.xer_decoder; + td->xer_encoder = asn1_DEF_Int1.xer_encoder; td->last_tag_form = asn1_DEF_Int1.last_tag_form; td->elements = asn1_DEF_Int1.elements; td->elements_count = asn1_DEF_Int1.elements_count; td->specifics = asn1_DEF_Int1.specifics; } +void +Int2_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Int2_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Int2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Int2_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t Int2_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -171,7 +201,7 @@ Int2_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t Int2_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -179,18 +209,12 @@ Int2_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -Int2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - Int2_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -Int2_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +Int2_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { Int2_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -201,11 +225,13 @@ static ber_tlv_tag_t asn1_DEF_Int2_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_Int2 = { "Int2", + Int2_free, + Int2_print, Int2_constraint, Int2_decode_ber, Int2_encode_der, - Int2_print, - Int2_free, + 0, /* Not implemented yet */ + Int2_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Int2_tags, sizeof(asn1_DEF_Int2_tags) @@ -231,11 +257,12 @@ typedef Int2_t Int3_t; /*** <<< FUNC-DECLS [Int3] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Int3; +asn_struct_free_f Int3_free; +asn_struct_print_f Int3_print; asn_constr_check_f Int3_constraint; ber_type_decoder_f Int3_decode_ber; der_type_encoder_f Int3_encode_der; -asn_struct_print_f Int3_print; -asn_struct_free_f Int3_free; +xer_type_encoder_f Int3_encode_xer; /*** <<< CODE [Int3] >>> ***/ @@ -277,16 +304,32 @@ Int3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void Int3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_Int2.ber_decoder; - td->der_encoder = asn1_DEF_Int2.der_encoder; td->free_struct = asn1_DEF_Int2.free_struct; td->print_struct = asn1_DEF_Int2.print_struct; + td->ber_decoder = asn1_DEF_Int2.ber_decoder; + td->der_encoder = asn1_DEF_Int2.der_encoder; + td->xer_decoder = asn1_DEF_Int2.xer_decoder; + td->xer_encoder = asn1_DEF_Int2.xer_encoder; td->last_tag_form = asn1_DEF_Int2.last_tag_form; td->elements = asn1_DEF_Int2.elements; td->elements_count = asn1_DEF_Int2.elements_count; td->specifics = asn1_DEF_Int2.specifics; } +void +Int3_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Int3_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Int3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Int3_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t Int3_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -294,7 +337,7 @@ Int3_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t Int3_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -302,18 +345,12 @@ Int3_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -Int3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - Int3_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -Int3_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +Int3_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { Int3_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -324,11 +361,13 @@ static ber_tlv_tag_t asn1_DEF_Int3_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_Int3 = { "Int3", + Int3_free, + Int3_print, Int3_constraint, Int3_decode_ber, Int3_encode_der, - Int3_print, - Int3_free, + 0, /* Not implemented yet */ + Int3_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Int3_tags, sizeof(asn1_DEF_Int3_tags) @@ -354,11 +393,12 @@ typedef Int3_t Int4_t; /*** <<< FUNC-DECLS [Int4] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Int4; +asn_struct_free_f Int4_free; +asn_struct_print_f Int4_print; asn_constr_check_f Int4_constraint; ber_type_decoder_f Int4_decode_ber; der_type_encoder_f Int4_encode_der; -asn_struct_print_f Int4_print; -asn_struct_free_f Int4_free; +xer_type_encoder_f Int4_encode_xer; /*** <<< CODE [Int4] >>> ***/ @@ -400,16 +440,32 @@ Int4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void Int4_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_Int3.ber_decoder; - td->der_encoder = asn1_DEF_Int3.der_encoder; td->free_struct = asn1_DEF_Int3.free_struct; td->print_struct = asn1_DEF_Int3.print_struct; + td->ber_decoder = asn1_DEF_Int3.ber_decoder; + td->der_encoder = asn1_DEF_Int3.der_encoder; + td->xer_decoder = asn1_DEF_Int3.xer_decoder; + td->xer_encoder = asn1_DEF_Int3.xer_encoder; td->last_tag_form = asn1_DEF_Int3.last_tag_form; td->elements = asn1_DEF_Int3.elements; td->elements_count = asn1_DEF_Int3.elements_count; td->specifics = asn1_DEF_Int3.specifics; } +void +Int4_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Int4_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Int4_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Int4_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t Int4_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -417,7 +473,7 @@ Int4_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t Int4_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -425,18 +481,12 @@ Int4_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -Int4_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - Int4_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -Int4_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +Int4_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { Int4_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -447,11 +497,13 @@ static ber_tlv_tag_t asn1_DEF_Int4_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_Int4 = { "Int4", + Int4_free, + Int4_print, Int4_constraint, Int4_decode_ber, Int4_encode_der, - Int4_print, - Int4_free, + 0, /* Not implemented yet */ + Int4_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Int4_tags, sizeof(asn1_DEF_Int4_tags) @@ -477,11 +529,12 @@ typedef Int4_t Int5_t; /*** <<< FUNC-DECLS [Int5] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Int5; +asn_struct_free_f Int5_free; +asn_struct_print_f Int5_print; asn_constr_check_f Int5_constraint; ber_type_decoder_f Int5_decode_ber; der_type_encoder_f Int5_encode_der; -asn_struct_print_f Int5_print; -asn_struct_free_f Int5_free; +xer_type_encoder_f Int5_encode_xer; /*** <<< CODE [Int5] >>> ***/ @@ -523,16 +576,32 @@ Int5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void Int5_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_Int4.ber_decoder; - td->der_encoder = asn1_DEF_Int4.der_encoder; td->free_struct = asn1_DEF_Int4.free_struct; td->print_struct = asn1_DEF_Int4.print_struct; + td->ber_decoder = asn1_DEF_Int4.ber_decoder; + td->der_encoder = asn1_DEF_Int4.der_encoder; + td->xer_decoder = asn1_DEF_Int4.xer_decoder; + td->xer_encoder = asn1_DEF_Int4.xer_encoder; td->last_tag_form = asn1_DEF_Int4.last_tag_form; td->elements = asn1_DEF_Int4.elements; td->elements_count = asn1_DEF_Int4.elements_count; td->specifics = asn1_DEF_Int4.specifics; } +void +Int5_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Int5_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Int5_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Int5_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t Int5_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -540,7 +609,7 @@ Int5_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t Int5_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -548,18 +617,12 @@ Int5_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -Int5_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - Int5_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -Int5_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +Int5_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { Int5_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -570,11 +633,13 @@ static ber_tlv_tag_t asn1_DEF_Int5_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_Int5 = { "Int5", + Int5_free, + Int5_print, Int5_constraint, Int5_decode_ber, Int5_encode_der, - Int5_print, - Int5_free, + 0, /* Not implemented yet */ + Int5_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Int5_tags, sizeof(asn1_DEF_Int5_tags) @@ -600,11 +665,12 @@ typedef INTEGER_t ExtensibleExtensions_t; /*** <<< FUNC-DECLS [ExtensibleExtensions] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_ExtensibleExtensions; +asn_struct_free_f ExtensibleExtensions_free; +asn_struct_print_f ExtensibleExtensions_print; asn_constr_check_f ExtensibleExtensions_constraint; ber_type_decoder_f ExtensibleExtensions_decode_ber; der_type_encoder_f ExtensibleExtensions_encode_der; -asn_struct_print_f ExtensibleExtensions_print; -asn_struct_free_f ExtensibleExtensions_free; +xer_type_encoder_f ExtensibleExtensions_encode_xer; /*** <<< CODE [ExtensibleExtensions] >>> ***/ @@ -646,16 +712,32 @@ ExtensibleExtensions_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void ExtensibleExtensions_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_INTEGER.ber_decoder; - td->der_encoder = asn1_DEF_INTEGER.der_encoder; td->free_struct = asn1_DEF_INTEGER.free_struct; td->print_struct = asn1_DEF_INTEGER.print_struct; + td->ber_decoder = asn1_DEF_INTEGER.ber_decoder; + td->der_encoder = asn1_DEF_INTEGER.der_encoder; + td->xer_decoder = asn1_DEF_INTEGER.xer_decoder; + td->xer_encoder = asn1_DEF_INTEGER.xer_encoder; td->last_tag_form = asn1_DEF_INTEGER.last_tag_form; td->elements = asn1_DEF_INTEGER.elements; td->elements_count = asn1_DEF_INTEGER.elements_count; td->specifics = asn1_DEF_INTEGER.specifics; } +void +ExtensibleExtensions_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + ExtensibleExtensions_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +ExtensibleExtensions_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + ExtensibleExtensions_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t ExtensibleExtensions_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -663,7 +745,7 @@ ExtensibleExtensions_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t ExtensibleExtensions_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -671,18 +753,12 @@ ExtensibleExtensions_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -ExtensibleExtensions_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - ExtensibleExtensions_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -ExtensibleExtensions_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +ExtensibleExtensions_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { ExtensibleExtensions_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -693,11 +769,13 @@ static ber_tlv_tag_t asn1_DEF_ExtensibleExtensions_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_ExtensibleExtensions = { "ExtensibleExtensions", + ExtensibleExtensions_free, + ExtensibleExtensions_print, ExtensibleExtensions_constraint, ExtensibleExtensions_decode_ber, ExtensibleExtensions_encode_der, - ExtensibleExtensions_print, - ExtensibleExtensions_free, + 0, /* Not implemented yet */ + ExtensibleExtensions_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_ExtensibleExtensions_tags, sizeof(asn1_DEF_ExtensibleExtensions_tags) @@ -723,11 +801,12 @@ typedef IA5String_t Str1_t; /*** <<< FUNC-DECLS [Str1] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Str1; +asn_struct_free_f Str1_free; +asn_struct_print_f Str1_print; asn_constr_check_f Str1_constraint; ber_type_decoder_f Str1_decode_ber; der_type_encoder_f Str1_encode_der; -asn_struct_print_f Str1_print; -asn_struct_free_f Str1_free; +xer_type_encoder_f Str1_encode_xer; /*** <<< CODE [Str1] >>> ***/ @@ -747,16 +826,32 @@ Str1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void Str1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_IA5String.ber_decoder; - td->der_encoder = asn1_DEF_IA5String.der_encoder; td->free_struct = asn1_DEF_IA5String.free_struct; td->print_struct = asn1_DEF_IA5String.print_struct; + td->ber_decoder = asn1_DEF_IA5String.ber_decoder; + td->der_encoder = asn1_DEF_IA5String.der_encoder; + td->xer_decoder = asn1_DEF_IA5String.xer_decoder; + td->xer_encoder = asn1_DEF_IA5String.xer_encoder; td->last_tag_form = asn1_DEF_IA5String.last_tag_form; td->elements = asn1_DEF_IA5String.elements; td->elements_count = asn1_DEF_IA5String.elements_count; td->specifics = asn1_DEF_IA5String.specifics; } +void +Str1_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Str1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Str1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Str1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t Str1_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -764,7 +859,7 @@ Str1_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t Str1_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -772,18 +867,12 @@ Str1_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -Str1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - Str1_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -Str1_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +Str1_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { Str1_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -794,11 +883,13 @@ static ber_tlv_tag_t asn1_DEF_Str1_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_Str1 = { "Str1", + Str1_free, + Str1_print, Str1_constraint, Str1_decode_ber, Str1_encode_der, - Str1_print, - Str1_free, + 0, /* Not implemented yet */ + Str1_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Str1_tags, sizeof(asn1_DEF_Str1_tags) @@ -824,11 +915,12 @@ typedef Str1_t Str2_t; /*** <<< FUNC-DECLS [Str2] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Str2; +asn_struct_free_f Str2_free; +asn_struct_print_f Str2_print; asn_constr_check_f Str2_constraint; ber_type_decoder_f Str2_decode_ber; der_type_encoder_f Str2_encode_der; -asn_struct_print_f Str2_print; -asn_struct_free_f Str2_free; +xer_type_encoder_f Str2_encode_xer; /*** <<< CTABLES [Str2] >>> ***/ @@ -882,16 +974,32 @@ Str2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void Str2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_Str1.ber_decoder; - td->der_encoder = asn1_DEF_Str1.der_encoder; td->free_struct = asn1_DEF_Str1.free_struct; td->print_struct = asn1_DEF_Str1.print_struct; + td->ber_decoder = asn1_DEF_Str1.ber_decoder; + td->der_encoder = asn1_DEF_Str1.der_encoder; + td->xer_decoder = asn1_DEF_Str1.xer_decoder; + td->xer_encoder = asn1_DEF_Str1.xer_encoder; td->last_tag_form = asn1_DEF_Str1.last_tag_form; td->elements = asn1_DEF_Str1.elements; td->elements_count = asn1_DEF_Str1.elements_count; td->specifics = asn1_DEF_Str1.specifics; } +void +Str2_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Str2_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Str2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Str2_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t Str2_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -899,7 +1007,7 @@ Str2_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t Str2_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -907,18 +1015,12 @@ Str2_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -Str2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - Str2_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -Str2_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +Str2_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { Str2_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -929,11 +1031,13 @@ static ber_tlv_tag_t asn1_DEF_Str2_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_Str2 = { "Str2", + Str2_free, + Str2_print, Str2_constraint, Str2_decode_ber, Str2_encode_der, - Str2_print, - Str2_free, + 0, /* Not implemented yet */ + Str2_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Str2_tags, sizeof(asn1_DEF_Str2_tags) @@ -959,11 +1063,12 @@ typedef Str2_t Str3_t; /*** <<< FUNC-DECLS [Str3] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Str3; +asn_struct_free_f Str3_free; +asn_struct_print_f Str3_print; asn_constr_check_f Str3_constraint; ber_type_decoder_f Str3_decode_ber; der_type_encoder_f Str3_encode_der; -asn_struct_print_f Str3_print; -asn_struct_free_f Str3_free; +xer_type_encoder_f Str3_encode_xer; /*** <<< CTABLES [Str3] >>> ***/ @@ -1028,16 +1133,32 @@ Str3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void Str3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_Str2.ber_decoder; - td->der_encoder = asn1_DEF_Str2.der_encoder; td->free_struct = asn1_DEF_Str2.free_struct; td->print_struct = asn1_DEF_Str2.print_struct; + td->ber_decoder = asn1_DEF_Str2.ber_decoder; + td->der_encoder = asn1_DEF_Str2.der_encoder; + td->xer_decoder = asn1_DEF_Str2.xer_decoder; + td->xer_encoder = asn1_DEF_Str2.xer_encoder; td->last_tag_form = asn1_DEF_Str2.last_tag_form; td->elements = asn1_DEF_Str2.elements; td->elements_count = asn1_DEF_Str2.elements_count; td->specifics = asn1_DEF_Str2.specifics; } +void +Str3_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Str3_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Str3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Str3_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t Str3_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -1045,7 +1166,7 @@ Str3_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t Str3_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -1053,18 +1174,12 @@ Str3_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -Str3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - Str3_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -Str3_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +Str3_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { Str3_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -1075,11 +1190,13 @@ static ber_tlv_tag_t asn1_DEF_Str3_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_Str3 = { "Str3", + Str3_free, + Str3_print, Str3_constraint, Str3_decode_ber, Str3_encode_der, - Str3_print, - Str3_free, + 0, /* Not implemented yet */ + Str3_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Str3_tags, sizeof(asn1_DEF_Str3_tags) @@ -1105,11 +1222,12 @@ typedef IA5String_t Str4_t; /*** <<< FUNC-DECLS [Str4] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Str4; +asn_struct_free_f Str4_free; +asn_struct_print_f Str4_print; asn_constr_check_f Str4_constraint; ber_type_decoder_f Str4_decode_ber; der_type_encoder_f Str4_encode_der; -asn_struct_print_f Str4_print; -asn_struct_free_f Str4_free; +xer_type_encoder_f Str4_encode_xer; /*** <<< CTABLES [Str4] >>> ***/ @@ -1160,16 +1278,32 @@ Str4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void Str4_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_IA5String.ber_decoder; - td->der_encoder = asn1_DEF_IA5String.der_encoder; td->free_struct = asn1_DEF_IA5String.free_struct; td->print_struct = asn1_DEF_IA5String.print_struct; + td->ber_decoder = asn1_DEF_IA5String.ber_decoder; + td->der_encoder = asn1_DEF_IA5String.der_encoder; + td->xer_decoder = asn1_DEF_IA5String.xer_decoder; + td->xer_encoder = asn1_DEF_IA5String.xer_encoder; td->last_tag_form = asn1_DEF_IA5String.last_tag_form; td->elements = asn1_DEF_IA5String.elements; td->elements_count = asn1_DEF_IA5String.elements_count; td->specifics = asn1_DEF_IA5String.specifics; } +void +Str4_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Str4_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Str4_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Str4_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t Str4_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -1177,7 +1311,7 @@ Str4_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t Str4_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -1185,18 +1319,12 @@ Str4_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -Str4_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - Str4_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -Str4_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +Str4_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { Str4_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -1207,11 +1335,13 @@ static ber_tlv_tag_t asn1_DEF_Str4_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_Str4 = { "Str4", + Str4_free, + Str4_print, Str4_constraint, Str4_decode_ber, Str4_encode_der, - Str4_print, - Str4_free, + 0, /* Not implemented yet */ + Str4_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Str4_tags, sizeof(asn1_DEF_Str4_tags) @@ -1237,11 +1367,12 @@ typedef IA5String_t PER_Visible_t; /*** <<< FUNC-DECLS [PER-Visible] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_PER_Visible; +asn_struct_free_f PER_Visible_free; +asn_struct_print_f PER_Visible_print; asn_constr_check_f PER_Visible_constraint; ber_type_decoder_f PER_Visible_decode_ber; der_type_encoder_f PER_Visible_encode_der; -asn_struct_print_f PER_Visible_print; -asn_struct_free_f PER_Visible_free; +xer_type_encoder_f PER_Visible_encode_xer; /*** <<< CTABLES [PER-Visible] >>> ***/ @@ -1292,16 +1423,32 @@ PER_Visible_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void PER_Visible_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_IA5String.ber_decoder; - td->der_encoder = asn1_DEF_IA5String.der_encoder; td->free_struct = asn1_DEF_IA5String.free_struct; td->print_struct = asn1_DEF_IA5String.print_struct; + td->ber_decoder = asn1_DEF_IA5String.ber_decoder; + td->der_encoder = asn1_DEF_IA5String.der_encoder; + td->xer_decoder = asn1_DEF_IA5String.xer_decoder; + td->xer_encoder = asn1_DEF_IA5String.xer_encoder; td->last_tag_form = asn1_DEF_IA5String.last_tag_form; td->elements = asn1_DEF_IA5String.elements; td->elements_count = asn1_DEF_IA5String.elements_count; td->specifics = asn1_DEF_IA5String.specifics; } +void +PER_Visible_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + PER_Visible_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +PER_Visible_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + PER_Visible_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t PER_Visible_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -1309,7 +1456,7 @@ PER_Visible_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t PER_Visible_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -1317,18 +1464,12 @@ PER_Visible_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -PER_Visible_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - PER_Visible_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -PER_Visible_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +PER_Visible_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { PER_Visible_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -1339,11 +1480,13 @@ static ber_tlv_tag_t asn1_DEF_PER_Visible_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_PER_Visible = { "PER-Visible", + PER_Visible_free, + PER_Visible_print, PER_Visible_constraint, PER_Visible_decode_ber, PER_Visible_encode_der, - PER_Visible_print, - PER_Visible_free, + 0, /* Not implemented yet */ + PER_Visible_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_PER_Visible_tags, sizeof(asn1_DEF_PER_Visible_tags) @@ -1369,11 +1512,12 @@ typedef PER_Visible_t PER_Visible_2_t; /*** <<< FUNC-DECLS [PER-Visible-2] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_PER_Visible_2; +asn_struct_free_f PER_Visible_2_free; +asn_struct_print_f PER_Visible_2_print; asn_constr_check_f PER_Visible_2_constraint; ber_type_decoder_f PER_Visible_2_decode_ber; der_type_encoder_f PER_Visible_2_encode_der; -asn_struct_print_f PER_Visible_2_print; -asn_struct_free_f PER_Visible_2_free; +xer_type_encoder_f PER_Visible_2_encode_xer; /*** <<< CTABLES [PER-Visible-2] >>> ***/ @@ -1424,16 +1568,32 @@ PER_Visible_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void PER_Visible_2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; - td->der_encoder = asn1_DEF_PER_Visible.der_encoder; td->free_struct = asn1_DEF_PER_Visible.free_struct; td->print_struct = asn1_DEF_PER_Visible.print_struct; + td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn1_DEF_PER_Visible.der_encoder; + td->xer_decoder = asn1_DEF_PER_Visible.xer_decoder; + td->xer_encoder = asn1_DEF_PER_Visible.xer_encoder; td->last_tag_form = asn1_DEF_PER_Visible.last_tag_form; td->elements = asn1_DEF_PER_Visible.elements; td->elements_count = asn1_DEF_PER_Visible.elements_count; td->specifics = asn1_DEF_PER_Visible.specifics; } +void +PER_Visible_2_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + PER_Visible_2_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +PER_Visible_2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + PER_Visible_2_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t PER_Visible_2_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -1441,7 +1601,7 @@ PER_Visible_2_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t PER_Visible_2_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -1449,18 +1609,12 @@ PER_Visible_2_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -PER_Visible_2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - PER_Visible_2_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -PER_Visible_2_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +PER_Visible_2_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { PER_Visible_2_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -1471,11 +1625,13 @@ static ber_tlv_tag_t asn1_DEF_PER_Visible_2_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_PER_Visible_2 = { "PER-Visible-2", + PER_Visible_2_free, + PER_Visible_2_print, PER_Visible_2_constraint, PER_Visible_2_decode_ber, PER_Visible_2_encode_der, - PER_Visible_2_print, - PER_Visible_2_free, + 0, /* Not implemented yet */ + PER_Visible_2_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_PER_Visible_2_tags, sizeof(asn1_DEF_PER_Visible_2_tags) @@ -1501,11 +1657,12 @@ typedef PER_Visible_t Not_PER_Visible_1_t; /*** <<< FUNC-DECLS [Not-PER-Visible-1] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_1; +asn_struct_free_f Not_PER_Visible_1_free; +asn_struct_print_f Not_PER_Visible_1_print; asn_constr_check_f Not_PER_Visible_1_constraint; ber_type_decoder_f Not_PER_Visible_1_decode_ber; der_type_encoder_f Not_PER_Visible_1_encode_der; -asn_struct_print_f Not_PER_Visible_1_print; -asn_struct_free_f Not_PER_Visible_1_free; +xer_type_encoder_f Not_PER_Visible_1_encode_xer; /*** <<< CTABLES [Not-PER-Visible-1] >>> ***/ @@ -1556,16 +1713,32 @@ Not_PER_Visible_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void Not_PER_Visible_1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; - td->der_encoder = asn1_DEF_PER_Visible.der_encoder; td->free_struct = asn1_DEF_PER_Visible.free_struct; td->print_struct = asn1_DEF_PER_Visible.print_struct; + td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn1_DEF_PER_Visible.der_encoder; + td->xer_decoder = asn1_DEF_PER_Visible.xer_decoder; + td->xer_encoder = asn1_DEF_PER_Visible.xer_encoder; td->last_tag_form = asn1_DEF_PER_Visible.last_tag_form; td->elements = asn1_DEF_PER_Visible.elements; td->elements_count = asn1_DEF_PER_Visible.elements_count; td->specifics = asn1_DEF_PER_Visible.specifics; } +void +Not_PER_Visible_1_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Not_PER_Visible_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Not_PER_Visible_1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Not_PER_Visible_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t Not_PER_Visible_1_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -1573,7 +1746,7 @@ Not_PER_Visible_1_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t Not_PER_Visible_1_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -1581,18 +1754,12 @@ Not_PER_Visible_1_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -Not_PER_Visible_1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - Not_PER_Visible_1_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -Not_PER_Visible_1_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +Not_PER_Visible_1_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { Not_PER_Visible_1_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -1603,11 +1770,13 @@ static ber_tlv_tag_t asn1_DEF_Not_PER_Visible_1_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_1 = { "Not-PER-Visible-1", + Not_PER_Visible_1_free, + Not_PER_Visible_1_print, Not_PER_Visible_1_constraint, Not_PER_Visible_1_decode_ber, Not_PER_Visible_1_encode_der, - Not_PER_Visible_1_print, - Not_PER_Visible_1_free, + 0, /* Not implemented yet */ + Not_PER_Visible_1_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Not_PER_Visible_1_tags, sizeof(asn1_DEF_Not_PER_Visible_1_tags) @@ -1633,11 +1802,12 @@ typedef PER_Visible_t Not_PER_Visible_2_t; /*** <<< FUNC-DECLS [Not-PER-Visible-2] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_2; +asn_struct_free_f Not_PER_Visible_2_free; +asn_struct_print_f Not_PER_Visible_2_print; asn_constr_check_f Not_PER_Visible_2_constraint; ber_type_decoder_f Not_PER_Visible_2_decode_ber; der_type_encoder_f Not_PER_Visible_2_encode_der; -asn_struct_print_f Not_PER_Visible_2_print; -asn_struct_free_f Not_PER_Visible_2_free; +xer_type_encoder_f Not_PER_Visible_2_encode_xer; /*** <<< CTABLES [Not-PER-Visible-2] >>> ***/ @@ -1688,16 +1858,32 @@ Not_PER_Visible_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void Not_PER_Visible_2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; - td->der_encoder = asn1_DEF_PER_Visible.der_encoder; td->free_struct = asn1_DEF_PER_Visible.free_struct; td->print_struct = asn1_DEF_PER_Visible.print_struct; + td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn1_DEF_PER_Visible.der_encoder; + td->xer_decoder = asn1_DEF_PER_Visible.xer_decoder; + td->xer_encoder = asn1_DEF_PER_Visible.xer_encoder; td->last_tag_form = asn1_DEF_PER_Visible.last_tag_form; td->elements = asn1_DEF_PER_Visible.elements; td->elements_count = asn1_DEF_PER_Visible.elements_count; td->specifics = asn1_DEF_PER_Visible.specifics; } +void +Not_PER_Visible_2_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Not_PER_Visible_2_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Not_PER_Visible_2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Not_PER_Visible_2_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t Not_PER_Visible_2_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -1705,7 +1891,7 @@ Not_PER_Visible_2_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t Not_PER_Visible_2_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -1713,18 +1899,12 @@ Not_PER_Visible_2_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -Not_PER_Visible_2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - Not_PER_Visible_2_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -Not_PER_Visible_2_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +Not_PER_Visible_2_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { Not_PER_Visible_2_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -1735,11 +1915,13 @@ static ber_tlv_tag_t asn1_DEF_Not_PER_Visible_2_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_2 = { "Not-PER-Visible-2", + Not_PER_Visible_2_free, + Not_PER_Visible_2_print, Not_PER_Visible_2_constraint, Not_PER_Visible_2_decode_ber, Not_PER_Visible_2_encode_der, - Not_PER_Visible_2_print, - Not_PER_Visible_2_free, + 0, /* Not implemented yet */ + Not_PER_Visible_2_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Not_PER_Visible_2_tags, sizeof(asn1_DEF_Not_PER_Visible_2_tags) @@ -1765,11 +1947,12 @@ typedef PER_Visible_t Not_PER_Visible_3_t; /*** <<< FUNC-DECLS [Not-PER-Visible-3] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_3; +asn_struct_free_f Not_PER_Visible_3_free; +asn_struct_print_f Not_PER_Visible_3_print; asn_constr_check_f Not_PER_Visible_3_constraint; ber_type_decoder_f Not_PER_Visible_3_decode_ber; der_type_encoder_f Not_PER_Visible_3_encode_der; -asn_struct_print_f Not_PER_Visible_3_print; -asn_struct_free_f Not_PER_Visible_3_free; +xer_type_encoder_f Not_PER_Visible_3_encode_xer; /*** <<< CTABLES [Not-PER-Visible-3] >>> ***/ @@ -1820,16 +2003,32 @@ Not_PER_Visible_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void Not_PER_Visible_3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; - td->der_encoder = asn1_DEF_PER_Visible.der_encoder; td->free_struct = asn1_DEF_PER_Visible.free_struct; td->print_struct = asn1_DEF_PER_Visible.print_struct; + td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn1_DEF_PER_Visible.der_encoder; + td->xer_decoder = asn1_DEF_PER_Visible.xer_decoder; + td->xer_encoder = asn1_DEF_PER_Visible.xer_encoder; td->last_tag_form = asn1_DEF_PER_Visible.last_tag_form; td->elements = asn1_DEF_PER_Visible.elements; td->elements_count = asn1_DEF_PER_Visible.elements_count; td->specifics = asn1_DEF_PER_Visible.specifics; } +void +Not_PER_Visible_3_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Not_PER_Visible_3_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Not_PER_Visible_3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Not_PER_Visible_3_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t Not_PER_Visible_3_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -1837,7 +2036,7 @@ Not_PER_Visible_3_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t Not_PER_Visible_3_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -1845,18 +2044,12 @@ Not_PER_Visible_3_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -Not_PER_Visible_3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - Not_PER_Visible_3_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -Not_PER_Visible_3_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +Not_PER_Visible_3_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { Not_PER_Visible_3_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -1867,11 +2060,13 @@ static ber_tlv_tag_t asn1_DEF_Not_PER_Visible_3_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_3 = { "Not-PER-Visible-3", + Not_PER_Visible_3_free, + Not_PER_Visible_3_print, Not_PER_Visible_3_constraint, Not_PER_Visible_3_decode_ber, Not_PER_Visible_3_encode_der, - Not_PER_Visible_3_print, - Not_PER_Visible_3_free, + 0, /* Not implemented yet */ + Not_PER_Visible_3_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Not_PER_Visible_3_tags, sizeof(asn1_DEF_Not_PER_Visible_3_tags) @@ -1897,11 +2092,12 @@ typedef PER_Visible_t SIZE_but_not_FROM_t; /*** <<< FUNC-DECLS [SIZE-but-not-FROM] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_SIZE_but_not_FROM; +asn_struct_free_f SIZE_but_not_FROM_free; +asn_struct_print_f SIZE_but_not_FROM_print; asn_constr_check_f SIZE_but_not_FROM_constraint; ber_type_decoder_f SIZE_but_not_FROM_decode_ber; der_type_encoder_f SIZE_but_not_FROM_encode_der; -asn_struct_print_f SIZE_but_not_FROM_print; -asn_struct_free_f SIZE_but_not_FROM_free; +xer_type_encoder_f SIZE_but_not_FROM_encode_xer; /*** <<< CTABLES [SIZE-but-not-FROM] >>> ***/ @@ -1955,16 +2151,32 @@ SIZE_but_not_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void SIZE_but_not_FROM_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; - td->der_encoder = asn1_DEF_PER_Visible.der_encoder; td->free_struct = asn1_DEF_PER_Visible.free_struct; td->print_struct = asn1_DEF_PER_Visible.print_struct; + td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn1_DEF_PER_Visible.der_encoder; + td->xer_decoder = asn1_DEF_PER_Visible.xer_decoder; + td->xer_encoder = asn1_DEF_PER_Visible.xer_encoder; td->last_tag_form = asn1_DEF_PER_Visible.last_tag_form; td->elements = asn1_DEF_PER_Visible.elements; td->elements_count = asn1_DEF_PER_Visible.elements_count; td->specifics = asn1_DEF_PER_Visible.specifics; } +void +SIZE_but_not_FROM_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + SIZE_but_not_FROM_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +SIZE_but_not_FROM_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + SIZE_but_not_FROM_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t SIZE_but_not_FROM_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -1972,7 +2184,7 @@ SIZE_but_not_FROM_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t SIZE_but_not_FROM_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -1980,18 +2192,12 @@ SIZE_but_not_FROM_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -SIZE_but_not_FROM_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - SIZE_but_not_FROM_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -SIZE_but_not_FROM_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +SIZE_but_not_FROM_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { SIZE_but_not_FROM_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -2002,11 +2208,13 @@ static ber_tlv_tag_t asn1_DEF_SIZE_but_not_FROM_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_SIZE_but_not_FROM = { "SIZE-but-not-FROM", + SIZE_but_not_FROM_free, + SIZE_but_not_FROM_print, SIZE_but_not_FROM_constraint, SIZE_but_not_FROM_decode_ber, SIZE_but_not_FROM_encode_der, - SIZE_but_not_FROM_print, - SIZE_but_not_FROM_free, + 0, /* Not implemented yet */ + SIZE_but_not_FROM_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_SIZE_but_not_FROM_tags, sizeof(asn1_DEF_SIZE_but_not_FROM_tags) @@ -2032,11 +2240,12 @@ typedef PER_Visible_t SIZE_and_FROM_t; /*** <<< FUNC-DECLS [SIZE-and-FROM] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_SIZE_and_FROM; +asn_struct_free_f SIZE_and_FROM_free; +asn_struct_print_f SIZE_and_FROM_print; asn_constr_check_f SIZE_and_FROM_constraint; ber_type_decoder_f SIZE_and_FROM_decode_ber; der_type_encoder_f SIZE_and_FROM_encode_der; -asn_struct_print_f SIZE_and_FROM_print; -asn_struct_free_f SIZE_and_FROM_free; +xer_type_encoder_f SIZE_and_FROM_encode_xer; /*** <<< CTABLES [SIZE-and-FROM] >>> ***/ @@ -2090,16 +2299,32 @@ SIZE_and_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void SIZE_and_FROM_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; - td->der_encoder = asn1_DEF_PER_Visible.der_encoder; td->free_struct = asn1_DEF_PER_Visible.free_struct; td->print_struct = asn1_DEF_PER_Visible.print_struct; + td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn1_DEF_PER_Visible.der_encoder; + td->xer_decoder = asn1_DEF_PER_Visible.xer_decoder; + td->xer_encoder = asn1_DEF_PER_Visible.xer_encoder; td->last_tag_form = asn1_DEF_PER_Visible.last_tag_form; td->elements = asn1_DEF_PER_Visible.elements; td->elements_count = asn1_DEF_PER_Visible.elements_count; td->specifics = asn1_DEF_PER_Visible.specifics; } +void +SIZE_and_FROM_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + SIZE_and_FROM_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +SIZE_and_FROM_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + SIZE_and_FROM_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t SIZE_and_FROM_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -2107,7 +2332,7 @@ SIZE_and_FROM_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t SIZE_and_FROM_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -2115,18 +2340,12 @@ SIZE_and_FROM_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -SIZE_and_FROM_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - SIZE_and_FROM_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -SIZE_and_FROM_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +SIZE_and_FROM_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { SIZE_and_FROM_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -2137,11 +2356,13 @@ static ber_tlv_tag_t asn1_DEF_SIZE_and_FROM_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_SIZE_and_FROM = { "SIZE-and-FROM", + SIZE_and_FROM_free, + SIZE_and_FROM_print, SIZE_and_FROM_constraint, SIZE_and_FROM_decode_ber, SIZE_and_FROM_encode_der, - SIZE_and_FROM_print, - SIZE_and_FROM_free, + 0, /* Not implemented yet */ + SIZE_and_FROM_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_SIZE_and_FROM_tags, sizeof(asn1_DEF_SIZE_and_FROM_tags) @@ -2167,11 +2388,12 @@ typedef PER_Visible_t Neither_SIZE_nor_FROM_t; /*** <<< FUNC-DECLS [Neither-SIZE-nor-FROM] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Neither_SIZE_nor_FROM; +asn_struct_free_f Neither_SIZE_nor_FROM_free; +asn_struct_print_f Neither_SIZE_nor_FROM_print; asn_constr_check_f Neither_SIZE_nor_FROM_constraint; ber_type_decoder_f Neither_SIZE_nor_FROM_decode_ber; der_type_encoder_f Neither_SIZE_nor_FROM_encode_der; -asn_struct_print_f Neither_SIZE_nor_FROM_print; -asn_struct_free_f Neither_SIZE_nor_FROM_free; +xer_type_encoder_f Neither_SIZE_nor_FROM_encode_xer; /*** <<< CTABLES [Neither-SIZE-nor-FROM] >>> ***/ @@ -2222,16 +2444,32 @@ Neither_SIZE_nor_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void Neither_SIZE_nor_FROM_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; - td->der_encoder = asn1_DEF_PER_Visible.der_encoder; td->free_struct = asn1_DEF_PER_Visible.free_struct; td->print_struct = asn1_DEF_PER_Visible.print_struct; + td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn1_DEF_PER_Visible.der_encoder; + td->xer_decoder = asn1_DEF_PER_Visible.xer_decoder; + td->xer_encoder = asn1_DEF_PER_Visible.xer_encoder; td->last_tag_form = asn1_DEF_PER_Visible.last_tag_form; td->elements = asn1_DEF_PER_Visible.elements; td->elements_count = asn1_DEF_PER_Visible.elements_count; td->specifics = asn1_DEF_PER_Visible.specifics; } +void +Neither_SIZE_nor_FROM_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Neither_SIZE_nor_FROM_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Neither_SIZE_nor_FROM_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Neither_SIZE_nor_FROM_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t Neither_SIZE_nor_FROM_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -2239,7 +2477,7 @@ Neither_SIZE_nor_FROM_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t Neither_SIZE_nor_FROM_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -2247,18 +2485,12 @@ Neither_SIZE_nor_FROM_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -Neither_SIZE_nor_FROM_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - Neither_SIZE_nor_FROM_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -Neither_SIZE_nor_FROM_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +Neither_SIZE_nor_FROM_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { Neither_SIZE_nor_FROM_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -2269,11 +2501,13 @@ static ber_tlv_tag_t asn1_DEF_Neither_SIZE_nor_FROM_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_Neither_SIZE_nor_FROM = { "Neither-SIZE-nor-FROM", + Neither_SIZE_nor_FROM_free, + Neither_SIZE_nor_FROM_print, Neither_SIZE_nor_FROM_constraint, Neither_SIZE_nor_FROM_decode_ber, Neither_SIZE_nor_FROM_encode_der, - Neither_SIZE_nor_FROM_print, - Neither_SIZE_nor_FROM_free, + 0, /* Not implemented yet */ + Neither_SIZE_nor_FROM_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Neither_SIZE_nor_FROM_tags, sizeof(asn1_DEF_Neither_SIZE_nor_FROM_tags) @@ -2299,11 +2533,12 @@ typedef Utf8_2_t Utf8_3_t; /*** <<< FUNC-DECLS [Utf8-3] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Utf8_3; +asn_struct_free_f Utf8_3_free; +asn_struct_print_f Utf8_3_print; asn_constr_check_f Utf8_3_constraint; ber_type_decoder_f Utf8_3_decode_ber; der_type_encoder_f Utf8_3_encode_der; -asn_struct_print_f Utf8_3_print; -asn_struct_free_f Utf8_3_free; +xer_type_encoder_f Utf8_3_encode_xer; /*** <<< CTABLES [Utf8-3] >>> ***/ @@ -2371,16 +2606,32 @@ Utf8_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void Utf8_3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_Utf8_2.ber_decoder; - td->der_encoder = asn1_DEF_Utf8_2.der_encoder; td->free_struct = asn1_DEF_Utf8_2.free_struct; td->print_struct = asn1_DEF_Utf8_2.print_struct; + td->ber_decoder = asn1_DEF_Utf8_2.ber_decoder; + td->der_encoder = asn1_DEF_Utf8_2.der_encoder; + td->xer_decoder = asn1_DEF_Utf8_2.xer_decoder; + td->xer_encoder = asn1_DEF_Utf8_2.xer_encoder; td->last_tag_form = asn1_DEF_Utf8_2.last_tag_form; td->elements = asn1_DEF_Utf8_2.elements; td->elements_count = asn1_DEF_Utf8_2.elements_count; td->specifics = asn1_DEF_Utf8_2.specifics; } +void +Utf8_3_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Utf8_3_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Utf8_3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_3_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t Utf8_3_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -2388,7 +2639,7 @@ Utf8_3_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t Utf8_3_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -2396,18 +2647,12 @@ Utf8_3_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -Utf8_3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - Utf8_3_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -Utf8_3_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +Utf8_3_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { Utf8_3_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -2418,11 +2663,13 @@ static ber_tlv_tag_t asn1_DEF_Utf8_3_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_Utf8_3 = { "Utf8-3", + Utf8_3_free, + Utf8_3_print, Utf8_3_constraint, Utf8_3_decode_ber, Utf8_3_encode_der, - Utf8_3_print, - Utf8_3_free, + 0, /* Not implemented yet */ + Utf8_3_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Utf8_3_tags, sizeof(asn1_DEF_Utf8_3_tags) @@ -2448,11 +2695,12 @@ typedef Utf8_1_t Utf8_2_t; /*** <<< FUNC-DECLS [Utf8-2] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Utf8_2; +asn_struct_free_f Utf8_2_free; +asn_struct_print_f Utf8_2_print; asn_constr_check_f Utf8_2_constraint; ber_type_decoder_f Utf8_2_decode_ber; der_type_encoder_f Utf8_2_encode_der; -asn_struct_print_f Utf8_2_print; -asn_struct_free_f Utf8_2_free; +xer_type_encoder_f Utf8_2_encode_xer; /*** <<< CODE [Utf8-2] >>> ***/ @@ -2490,16 +2738,32 @@ Utf8_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void Utf8_2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_Utf8_1.ber_decoder; - td->der_encoder = asn1_DEF_Utf8_1.der_encoder; td->free_struct = asn1_DEF_Utf8_1.free_struct; td->print_struct = asn1_DEF_Utf8_1.print_struct; + td->ber_decoder = asn1_DEF_Utf8_1.ber_decoder; + td->der_encoder = asn1_DEF_Utf8_1.der_encoder; + td->xer_decoder = asn1_DEF_Utf8_1.xer_decoder; + td->xer_encoder = asn1_DEF_Utf8_1.xer_encoder; td->last_tag_form = asn1_DEF_Utf8_1.last_tag_form; td->elements = asn1_DEF_Utf8_1.elements; td->elements_count = asn1_DEF_Utf8_1.elements_count; td->specifics = asn1_DEF_Utf8_1.specifics; } +void +Utf8_2_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Utf8_2_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Utf8_2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_2_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t Utf8_2_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -2507,7 +2771,7 @@ Utf8_2_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t Utf8_2_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -2515,18 +2779,12 @@ Utf8_2_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -Utf8_2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - Utf8_2_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -Utf8_2_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +Utf8_2_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { Utf8_2_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -2537,11 +2795,13 @@ static ber_tlv_tag_t asn1_DEF_Utf8_2_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_Utf8_2 = { "Utf8-2", + Utf8_2_free, + Utf8_2_print, Utf8_2_constraint, Utf8_2_decode_ber, Utf8_2_encode_der, - Utf8_2_print, - Utf8_2_free, + 0, /* Not implemented yet */ + Utf8_2_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Utf8_2_tags, sizeof(asn1_DEF_Utf8_2_tags) @@ -2567,11 +2827,12 @@ typedef UTF8String_t Utf8_1_t; /*** <<< FUNC-DECLS [Utf8-1] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Utf8_1; +asn_struct_free_f Utf8_1_free; +asn_struct_print_f Utf8_1_print; asn_constr_check_f Utf8_1_constraint; ber_type_decoder_f Utf8_1_decode_ber; der_type_encoder_f Utf8_1_encode_der; -asn_struct_print_f Utf8_1_print; -asn_struct_free_f Utf8_1_free; +xer_type_encoder_f Utf8_1_encode_xer; /*** <<< CODE [Utf8-1] >>> ***/ @@ -2591,16 +2852,32 @@ Utf8_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void Utf8_1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_UTF8String.ber_decoder; - td->der_encoder = asn1_DEF_UTF8String.der_encoder; td->free_struct = asn1_DEF_UTF8String.free_struct; td->print_struct = asn1_DEF_UTF8String.print_struct; + td->ber_decoder = asn1_DEF_UTF8String.ber_decoder; + td->der_encoder = asn1_DEF_UTF8String.der_encoder; + td->xer_decoder = asn1_DEF_UTF8String.xer_decoder; + td->xer_encoder = asn1_DEF_UTF8String.xer_encoder; td->last_tag_form = asn1_DEF_UTF8String.last_tag_form; td->elements = asn1_DEF_UTF8String.elements; td->elements_count = asn1_DEF_UTF8String.elements_count; td->specifics = asn1_DEF_UTF8String.specifics; } +void +Utf8_1_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Utf8_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Utf8_1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t Utf8_1_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -2608,7 +2885,7 @@ Utf8_1_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t Utf8_1_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -2616,18 +2893,12 @@ Utf8_1_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -Utf8_1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - Utf8_1_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -Utf8_1_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +Utf8_1_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { Utf8_1_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -2638,11 +2909,13 @@ static ber_tlv_tag_t asn1_DEF_Utf8_1_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_Utf8_1 = { "Utf8-1", + Utf8_1_free, + Utf8_1_print, Utf8_1_constraint, Utf8_1_decode_ber, Utf8_1_encode_der, - Utf8_1_print, - Utf8_1_free, + 0, /* Not implemented yet */ + Utf8_1_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Utf8_1_tags, sizeof(asn1_DEF_Utf8_1_tags) @@ -2668,11 +2941,12 @@ typedef Identifier_t VisibleIdentifier_t; /*** <<< FUNC-DECLS [VisibleIdentifier] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_VisibleIdentifier; +asn_struct_free_f VisibleIdentifier_free; +asn_struct_print_f VisibleIdentifier_print; asn_constr_check_f VisibleIdentifier_constraint; ber_type_decoder_f VisibleIdentifier_decode_ber; der_type_encoder_f VisibleIdentifier_encode_der; -asn_struct_print_f VisibleIdentifier_print; -asn_struct_free_f VisibleIdentifier_free; +xer_type_encoder_f VisibleIdentifier_encode_xer; /*** <<< CTABLES [VisibleIdentifier] >>> ***/ @@ -2738,16 +3012,32 @@ VisibleIdentifier_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void VisibleIdentifier_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_Identifier.ber_decoder; - td->der_encoder = asn1_DEF_Identifier.der_encoder; td->free_struct = asn1_DEF_Identifier.free_struct; td->print_struct = asn1_DEF_Identifier.print_struct; + td->ber_decoder = asn1_DEF_Identifier.ber_decoder; + td->der_encoder = asn1_DEF_Identifier.der_encoder; + td->xer_decoder = asn1_DEF_Identifier.xer_decoder; + td->xer_encoder = asn1_DEF_Identifier.xer_encoder; td->last_tag_form = asn1_DEF_Identifier.last_tag_form; td->elements = asn1_DEF_Identifier.elements; td->elements_count = asn1_DEF_Identifier.elements_count; td->specifics = asn1_DEF_Identifier.specifics; } +void +VisibleIdentifier_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + VisibleIdentifier_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +VisibleIdentifier_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + VisibleIdentifier_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t VisibleIdentifier_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -2755,7 +3045,7 @@ VisibleIdentifier_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t VisibleIdentifier_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -2763,18 +3053,12 @@ VisibleIdentifier_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -VisibleIdentifier_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - VisibleIdentifier_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -VisibleIdentifier_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +VisibleIdentifier_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { VisibleIdentifier_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -2785,11 +3069,13 @@ static ber_tlv_tag_t asn1_DEF_VisibleIdentifier_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_VisibleIdentifier = { "VisibleIdentifier", + VisibleIdentifier_free, + VisibleIdentifier_print, VisibleIdentifier_constraint, VisibleIdentifier_decode_ber, VisibleIdentifier_encode_der, - VisibleIdentifier_print, - VisibleIdentifier_free, + 0, /* Not implemented yet */ + VisibleIdentifier_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_VisibleIdentifier_tags, sizeof(asn1_DEF_VisibleIdentifier_tags) @@ -2815,11 +3101,12 @@ typedef VisibleString_t Identifier_t; /*** <<< FUNC-DECLS [Identifier] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_Identifier; +asn_struct_free_f Identifier_free; +asn_struct_print_f Identifier_print; asn_constr_check_f Identifier_constraint; ber_type_decoder_f Identifier_decode_ber; der_type_encoder_f Identifier_encode_der; -asn_struct_print_f Identifier_print; -asn_struct_free_f Identifier_free; +xer_type_encoder_f Identifier_encode_xer; /*** <<< CTABLES [Identifier] >>> ***/ @@ -2885,16 +3172,32 @@ Identifier_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void Identifier_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_VisibleString.ber_decoder; - td->der_encoder = asn1_DEF_VisibleString.der_encoder; td->free_struct = asn1_DEF_VisibleString.free_struct; td->print_struct = asn1_DEF_VisibleString.print_struct; + td->ber_decoder = asn1_DEF_VisibleString.ber_decoder; + td->der_encoder = asn1_DEF_VisibleString.der_encoder; + td->xer_decoder = asn1_DEF_VisibleString.xer_decoder; + td->xer_encoder = asn1_DEF_VisibleString.xer_encoder; td->last_tag_form = asn1_DEF_VisibleString.last_tag_form; td->elements = asn1_DEF_VisibleString.elements; td->elements_count = asn1_DEF_VisibleString.elements_count; td->specifics = asn1_DEF_VisibleString.specifics; } +void +Identifier_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Identifier_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Identifier_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Identifier_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t Identifier_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -2902,7 +3205,7 @@ Identifier_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t Identifier_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -2910,18 +3213,12 @@ Identifier_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -Identifier_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - Identifier_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -Identifier_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +Identifier_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { Identifier_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -2932,11 +3229,13 @@ static ber_tlv_tag_t asn1_DEF_Identifier_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_Identifier = { "Identifier", + Identifier_free, + Identifier_print, Identifier_constraint, Identifier_decode_ber, Identifier_encode_der, - Identifier_print, - Identifier_free, + 0, /* Not implemented yet */ + Identifier_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Identifier_tags, sizeof(asn1_DEF_Identifier_tags) diff --git a/tests/60-any-OK.asn1.-P b/tests/60-any-OK.asn1.-P index 62fd9b388..2da68af1e 100644 --- a/tests/60-any-OK.asn1.-P +++ b/tests/60-any-OK.asn1.-P @@ -54,11 +54,13 @@ static asn1_SEQUENCE_specifics_t asn1_DEF_T1_specs = { }; asn1_TYPE_descriptor_t asn1_DEF_T1 = { "T1", + SEQUENCE_free, + SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - SEQUENCE_print, - SEQUENCE_free, + 0, /* Not implemented yet */ + SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T1_tags, sizeof(asn1_DEF_T1_tags) @@ -129,11 +131,13 @@ static asn1_SEQUENCE_specifics_t asn1_DEF_T2_specs = { }; asn1_TYPE_descriptor_t asn1_DEF_T2 = { "T2", + SEQUENCE_free, + SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - SEQUENCE_print, - SEQUENCE_free, + 0, /* Not implemented yet */ + SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T2_tags, sizeof(asn1_DEF_T2_tags) diff --git a/tests/65-multi-tag-OK.asn1.-P b/tests/65-multi-tag-OK.asn1.-P index 51d2b0880..3156ba757 100644 --- a/tests/65-multi-tag-OK.asn1.-P +++ b/tests/65-multi-tag-OK.asn1.-P @@ -11,11 +11,12 @@ typedef T2_t T1_t; /*** <<< FUNC-DECLS [T1] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_T1; +asn_struct_free_f T1_free; +asn_struct_print_f T1_print; asn_constr_check_f T1_constraint; ber_type_decoder_f T1_decode_ber; der_type_encoder_f T1_encode_der; -asn_struct_print_f T1_print; -asn_struct_free_f T1_free; +xer_type_encoder_f T1_encode_xer; /*** <<< CODE [T1] >>> ***/ @@ -35,16 +36,32 @@ T1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void T1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_T2.ber_decoder; - td->der_encoder = asn1_DEF_T2.der_encoder; td->free_struct = asn1_DEF_T2.free_struct; td->print_struct = asn1_DEF_T2.print_struct; + td->ber_decoder = asn1_DEF_T2.ber_decoder; + td->der_encoder = asn1_DEF_T2.der_encoder; + td->xer_decoder = asn1_DEF_T2.xer_decoder; + td->xer_encoder = asn1_DEF_T2.xer_encoder; td->last_tag_form = asn1_DEF_T2.last_tag_form; td->elements = asn1_DEF_T2.elements; td->elements_count = asn1_DEF_T2.elements_count; td->specifics = asn1_DEF_T2.specifics; } +void +T1_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +T1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t T1_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -52,7 +69,7 @@ T1_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t T1_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -60,18 +77,12 @@ T1_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -T1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - T1_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -T1_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +T1_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { T1_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -93,11 +104,13 @@ static ber_tlv_tag_t asn1_DEF_T1_all_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_T1 = { "T1", + T1_free, + T1_print, T1_constraint, T1_decode_ber, T1_encode_der, - T1_print, - T1_free, + 0, /* Not implemented yet */ + T1_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T1_tags, sizeof(asn1_DEF_T1_tags) @@ -123,11 +136,12 @@ typedef T3_t T2_t; /*** <<< FUNC-DECLS [T2] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_T2; +asn_struct_free_f T2_free; +asn_struct_print_f T2_print; asn_constr_check_f T2_constraint; ber_type_decoder_f T2_decode_ber; der_type_encoder_f T2_encode_der; -asn_struct_print_f T2_print; -asn_struct_free_f T2_free; +xer_type_encoder_f T2_encode_xer; /*** <<< CODE [T2] >>> ***/ @@ -147,16 +161,32 @@ T2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void T2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_T3.ber_decoder; - td->der_encoder = asn1_DEF_T3.der_encoder; td->free_struct = asn1_DEF_T3.free_struct; td->print_struct = asn1_DEF_T3.print_struct; + td->ber_decoder = asn1_DEF_T3.ber_decoder; + td->der_encoder = asn1_DEF_T3.der_encoder; + td->xer_decoder = asn1_DEF_T3.xer_decoder; + td->xer_encoder = asn1_DEF_T3.xer_encoder; td->last_tag_form = asn1_DEF_T3.last_tag_form; td->elements = asn1_DEF_T3.elements; td->elements_count = asn1_DEF_T3.elements_count; td->specifics = asn1_DEF_T3.specifics; } +void +T2_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T2_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +T2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T2_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t T2_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -164,7 +194,7 @@ T2_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t T2_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -172,18 +202,12 @@ T2_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -T2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - T2_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -T2_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +T2_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { T2_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -203,11 +227,13 @@ static ber_tlv_tag_t asn1_DEF_T2_all_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_T2 = { "T2", + T2_free, + T2_print, T2_constraint, T2_decode_ber, T2_encode_der, - T2_print, - T2_free, + 0, /* Not implemented yet */ + T2_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T2_tags, sizeof(asn1_DEF_T2_tags) @@ -233,11 +259,12 @@ typedef T4_t T3_t; /*** <<< FUNC-DECLS [T3] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_T3; +asn_struct_free_f T3_free; +asn_struct_print_f T3_print; asn_constr_check_f T3_constraint; ber_type_decoder_f T3_decode_ber; der_type_encoder_f T3_encode_der; -asn_struct_print_f T3_print; -asn_struct_free_f T3_free; +xer_type_encoder_f T3_encode_xer; /*** <<< CODE [T3] >>> ***/ @@ -257,16 +284,32 @@ T3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void T3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_T4.ber_decoder; - td->der_encoder = asn1_DEF_T4.der_encoder; td->free_struct = asn1_DEF_T4.free_struct; td->print_struct = asn1_DEF_T4.print_struct; + td->ber_decoder = asn1_DEF_T4.ber_decoder; + td->der_encoder = asn1_DEF_T4.der_encoder; + td->xer_decoder = asn1_DEF_T4.xer_decoder; + td->xer_encoder = asn1_DEF_T4.xer_encoder; td->last_tag_form = asn1_DEF_T4.last_tag_form; td->elements = asn1_DEF_T4.elements; td->elements_count = asn1_DEF_T4.elements_count; td->specifics = asn1_DEF_T4.specifics; } +void +T3_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T3_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +T3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T3_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t T3_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -274,7 +317,7 @@ T3_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t T3_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -282,18 +325,12 @@ T3_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -T3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - T3_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -T3_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +T3_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { T3_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -311,11 +348,13 @@ static ber_tlv_tag_t asn1_DEF_T3_all_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_T3 = { "T3", + T3_free, + T3_print, T3_constraint, T3_decode_ber, T3_encode_der, - T3_print, - T3_free, + 0, /* Not implemented yet */ + T3_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T3_tags, sizeof(asn1_DEF_T3_tags) @@ -341,11 +380,12 @@ typedef T5_t T4_t; /*** <<< FUNC-DECLS [T4] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_T4; +asn_struct_free_f T4_free; +asn_struct_print_f T4_print; asn_constr_check_f T4_constraint; ber_type_decoder_f T4_decode_ber; der_type_encoder_f T4_encode_der; -asn_struct_print_f T4_print; -asn_struct_free_f T4_free; +xer_type_encoder_f T4_encode_xer; /*** <<< CODE [T4] >>> ***/ @@ -365,16 +405,32 @@ T4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void T4_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_T5.ber_decoder; - td->der_encoder = asn1_DEF_T5.der_encoder; td->free_struct = asn1_DEF_T5.free_struct; td->print_struct = asn1_DEF_T5.print_struct; + td->ber_decoder = asn1_DEF_T5.ber_decoder; + td->der_encoder = asn1_DEF_T5.der_encoder; + td->xer_decoder = asn1_DEF_T5.xer_decoder; + td->xer_encoder = asn1_DEF_T5.xer_encoder; td->last_tag_form = asn1_DEF_T5.last_tag_form; td->elements = asn1_DEF_T5.elements; td->elements_count = asn1_DEF_T5.elements_count; td->specifics = asn1_DEF_T5.specifics; } +void +T4_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T4_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +T4_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T4_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t T4_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -382,7 +438,7 @@ T4_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t T4_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -390,18 +446,12 @@ T4_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -T4_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - T4_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -T4_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +T4_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { T4_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -414,11 +464,13 @@ static ber_tlv_tag_t asn1_DEF_T4_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_T4 = { "T4", + T4_free, + T4_print, T4_constraint, T4_decode_ber, T4_encode_der, - T4_print, - T4_free, + 0, /* Not implemented yet */ + T4_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T4_tags, sizeof(asn1_DEF_T4_tags) @@ -444,11 +496,12 @@ typedef T6_t T5_t; /*** <<< FUNC-DECLS [T5] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_T5; +asn_struct_free_f T5_free; +asn_struct_print_f T5_print; asn_constr_check_f T5_constraint; ber_type_decoder_f T5_decode_ber; der_type_encoder_f T5_encode_der; -asn_struct_print_f T5_print; -asn_struct_free_f T5_free; +xer_type_encoder_f T5_encode_xer; /*** <<< CODE [T5] >>> ***/ @@ -468,16 +521,32 @@ T5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void T5_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_T6.ber_decoder; - td->der_encoder = asn1_DEF_T6.der_encoder; td->free_struct = asn1_DEF_T6.free_struct; td->print_struct = asn1_DEF_T6.print_struct; + td->ber_decoder = asn1_DEF_T6.ber_decoder; + td->der_encoder = asn1_DEF_T6.der_encoder; + td->xer_decoder = asn1_DEF_T6.xer_decoder; + td->xer_encoder = asn1_DEF_T6.xer_encoder; td->last_tag_form = asn1_DEF_T6.last_tag_form; td->elements = asn1_DEF_T6.elements; td->elements_count = asn1_DEF_T6.elements_count; td->specifics = asn1_DEF_T6.specifics; } +void +T5_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T5_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +T5_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T5_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t T5_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -485,7 +554,7 @@ T5_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t T5_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -493,18 +562,12 @@ T5_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -T5_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - T5_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -T5_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +T5_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { T5_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -516,11 +579,13 @@ static ber_tlv_tag_t asn1_DEF_T5_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_T5 = { "T5", + T5_free, + T5_print, T5_constraint, T5_decode_ber, T5_encode_der, - T5_print, - T5_free, + 0, /* Not implemented yet */ + T5_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T5_tags, sizeof(asn1_DEF_T5_tags) @@ -546,11 +611,12 @@ typedef REAL_t T6_t; /*** <<< FUNC-DECLS [T6] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_T6; +asn_struct_free_f T6_free; +asn_struct_print_f T6_print; asn_constr_check_f T6_constraint; ber_type_decoder_f T6_decode_ber; der_type_encoder_f T6_encode_der; -asn_struct_print_f T6_print; -asn_struct_free_f T6_free; +xer_type_encoder_f T6_encode_xer; /*** <<< CODE [T6] >>> ***/ @@ -570,16 +636,32 @@ T6_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void T6_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_REAL.ber_decoder; - td->der_encoder = asn1_DEF_REAL.der_encoder; td->free_struct = asn1_DEF_REAL.free_struct; td->print_struct = asn1_DEF_REAL.print_struct; + td->ber_decoder = asn1_DEF_REAL.ber_decoder; + td->der_encoder = asn1_DEF_REAL.der_encoder; + td->xer_decoder = asn1_DEF_REAL.xer_decoder; + td->xer_encoder = asn1_DEF_REAL.xer_encoder; td->last_tag_form = asn1_DEF_REAL.last_tag_form; td->elements = asn1_DEF_REAL.elements; td->elements_count = asn1_DEF_REAL.elements_count; td->specifics = asn1_DEF_REAL.specifics; } +void +T6_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T6_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +T6_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T6_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t T6_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -587,7 +669,7 @@ T6_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t T6_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -595,18 +677,12 @@ T6_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -T6_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - T6_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -T6_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +T6_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { T6_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -617,11 +693,13 @@ static ber_tlv_tag_t asn1_DEF_T6_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_T6 = { "T6", + T6_free, + T6_print, T6_constraint, T6_decode_ber, T6_encode_der, - T6_print, - T6_free, + 0, /* Not implemented yet */ + T6_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T6_tags, sizeof(asn1_DEF_T6_tags) @@ -647,11 +725,12 @@ typedef Ts_t T_t; /*** <<< FUNC-DECLS [T] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_T; +asn_struct_free_f T_free; +asn_struct_print_f T_print; asn_constr_check_f T_constraint; ber_type_decoder_f T_decode_ber; der_type_encoder_f T_encode_der; -asn_struct_print_f T_print; -asn_struct_free_f T_free; +xer_type_encoder_f T_encode_xer; /*** <<< CODE [T] >>> ***/ @@ -671,16 +750,32 @@ T_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void T_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_Ts.ber_decoder; - td->der_encoder = asn1_DEF_Ts.der_encoder; td->free_struct = asn1_DEF_Ts.free_struct; td->print_struct = asn1_DEF_Ts.print_struct; + td->ber_decoder = asn1_DEF_Ts.ber_decoder; + td->der_encoder = asn1_DEF_Ts.der_encoder; + td->xer_decoder = asn1_DEF_Ts.xer_decoder; + td->xer_encoder = asn1_DEF_Ts.xer_encoder; td->last_tag_form = asn1_DEF_Ts.last_tag_form; td->elements = asn1_DEF_Ts.elements; td->elements_count = asn1_DEF_Ts.elements_count; td->specifics = asn1_DEF_Ts.specifics; } +void +T_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +T_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t T_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -688,7 +783,7 @@ T_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t T_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -696,18 +791,12 @@ T_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -T_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - T_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -T_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +T_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { T_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -720,11 +809,13 @@ static ber_tlv_tag_t asn1_DEF_T_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_T = { "T", + T_free, + T_print, T_constraint, T_decode_ber, T_encode_der, - T_print, - T_free, + 0, /* Not implemented yet */ + T_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T_tags, sizeof(asn1_DEF_T_tags) @@ -804,11 +895,13 @@ static asn1_SEQUENCE_specifics_t asn1_DEF_Ts_specs = { }; asn1_TYPE_descriptor_t asn1_DEF_Ts = { "Ts", + SEQUENCE_free, + SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - SEQUENCE_print, - SEQUENCE_free, + 0, /* Not implemented yet */ + SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Ts_tags, sizeof(asn1_DEF_Ts_tags) diff --git a/tests/65-multi-tag-OK.asn1.-Pfnative-types b/tests/65-multi-tag-OK.asn1.-Pfnative-types index 88535bdee..d26bfaf57 100644 --- a/tests/65-multi-tag-OK.asn1.-Pfnative-types +++ b/tests/65-multi-tag-OK.asn1.-Pfnative-types @@ -11,11 +11,12 @@ typedef T2_t T1_t; /*** <<< FUNC-DECLS [T1] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_T1; +asn_struct_free_f T1_free; +asn_struct_print_f T1_print; asn_constr_check_f T1_constraint; ber_type_decoder_f T1_decode_ber; der_type_encoder_f T1_encode_der; -asn_struct_print_f T1_print; -asn_struct_free_f T1_free; +xer_type_encoder_f T1_encode_xer; /*** <<< CODE [T1] >>> ***/ @@ -35,16 +36,32 @@ T1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void T1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_T2.ber_decoder; - td->der_encoder = asn1_DEF_T2.der_encoder; td->free_struct = asn1_DEF_T2.free_struct; td->print_struct = asn1_DEF_T2.print_struct; + td->ber_decoder = asn1_DEF_T2.ber_decoder; + td->der_encoder = asn1_DEF_T2.der_encoder; + td->xer_decoder = asn1_DEF_T2.xer_decoder; + td->xer_encoder = asn1_DEF_T2.xer_encoder; td->last_tag_form = asn1_DEF_T2.last_tag_form; td->elements = asn1_DEF_T2.elements; td->elements_count = asn1_DEF_T2.elements_count; td->specifics = asn1_DEF_T2.specifics; } +void +T1_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +T1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t T1_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -52,7 +69,7 @@ T1_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t T1_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -60,18 +77,12 @@ T1_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -T1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - T1_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -T1_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +T1_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { T1_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -93,11 +104,13 @@ static ber_tlv_tag_t asn1_DEF_T1_all_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_T1 = { "T1", + T1_free, + T1_print, T1_constraint, T1_decode_ber, T1_encode_der, - T1_print, - T1_free, + 0, /* Not implemented yet */ + T1_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T1_tags, sizeof(asn1_DEF_T1_tags) @@ -123,11 +136,12 @@ typedef T3_t T2_t; /*** <<< FUNC-DECLS [T2] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_T2; +asn_struct_free_f T2_free; +asn_struct_print_f T2_print; asn_constr_check_f T2_constraint; ber_type_decoder_f T2_decode_ber; der_type_encoder_f T2_encode_der; -asn_struct_print_f T2_print; -asn_struct_free_f T2_free; +xer_type_encoder_f T2_encode_xer; /*** <<< CODE [T2] >>> ***/ @@ -147,16 +161,32 @@ T2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void T2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_T3.ber_decoder; - td->der_encoder = asn1_DEF_T3.der_encoder; td->free_struct = asn1_DEF_T3.free_struct; td->print_struct = asn1_DEF_T3.print_struct; + td->ber_decoder = asn1_DEF_T3.ber_decoder; + td->der_encoder = asn1_DEF_T3.der_encoder; + td->xer_decoder = asn1_DEF_T3.xer_decoder; + td->xer_encoder = asn1_DEF_T3.xer_encoder; td->last_tag_form = asn1_DEF_T3.last_tag_form; td->elements = asn1_DEF_T3.elements; td->elements_count = asn1_DEF_T3.elements_count; td->specifics = asn1_DEF_T3.specifics; } +void +T2_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T2_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +T2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T2_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t T2_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -164,7 +194,7 @@ T2_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t T2_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -172,18 +202,12 @@ T2_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -T2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - T2_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -T2_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +T2_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { T2_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -203,11 +227,13 @@ static ber_tlv_tag_t asn1_DEF_T2_all_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_T2 = { "T2", + T2_free, + T2_print, T2_constraint, T2_decode_ber, T2_encode_der, - T2_print, - T2_free, + 0, /* Not implemented yet */ + T2_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T2_tags, sizeof(asn1_DEF_T2_tags) @@ -233,11 +259,12 @@ typedef T4_t T3_t; /*** <<< FUNC-DECLS [T3] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_T3; +asn_struct_free_f T3_free; +asn_struct_print_f T3_print; asn_constr_check_f T3_constraint; ber_type_decoder_f T3_decode_ber; der_type_encoder_f T3_encode_der; -asn_struct_print_f T3_print; -asn_struct_free_f T3_free; +xer_type_encoder_f T3_encode_xer; /*** <<< CODE [T3] >>> ***/ @@ -257,16 +284,32 @@ T3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void T3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_T4.ber_decoder; - td->der_encoder = asn1_DEF_T4.der_encoder; td->free_struct = asn1_DEF_T4.free_struct; td->print_struct = asn1_DEF_T4.print_struct; + td->ber_decoder = asn1_DEF_T4.ber_decoder; + td->der_encoder = asn1_DEF_T4.der_encoder; + td->xer_decoder = asn1_DEF_T4.xer_decoder; + td->xer_encoder = asn1_DEF_T4.xer_encoder; td->last_tag_form = asn1_DEF_T4.last_tag_form; td->elements = asn1_DEF_T4.elements; td->elements_count = asn1_DEF_T4.elements_count; td->specifics = asn1_DEF_T4.specifics; } +void +T3_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T3_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +T3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T3_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t T3_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -274,7 +317,7 @@ T3_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t T3_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -282,18 +325,12 @@ T3_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -T3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - T3_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -T3_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +T3_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { T3_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -311,11 +348,13 @@ static ber_tlv_tag_t asn1_DEF_T3_all_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_T3 = { "T3", + T3_free, + T3_print, T3_constraint, T3_decode_ber, T3_encode_der, - T3_print, - T3_free, + 0, /* Not implemented yet */ + T3_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T3_tags, sizeof(asn1_DEF_T3_tags) @@ -341,11 +380,12 @@ typedef T5_t T4_t; /*** <<< FUNC-DECLS [T4] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_T4; +asn_struct_free_f T4_free; +asn_struct_print_f T4_print; asn_constr_check_f T4_constraint; ber_type_decoder_f T4_decode_ber; der_type_encoder_f T4_encode_der; -asn_struct_print_f T4_print; -asn_struct_free_f T4_free; +xer_type_encoder_f T4_encode_xer; /*** <<< CODE [T4] >>> ***/ @@ -365,16 +405,32 @@ T4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void T4_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_T5.ber_decoder; - td->der_encoder = asn1_DEF_T5.der_encoder; td->free_struct = asn1_DEF_T5.free_struct; td->print_struct = asn1_DEF_T5.print_struct; + td->ber_decoder = asn1_DEF_T5.ber_decoder; + td->der_encoder = asn1_DEF_T5.der_encoder; + td->xer_decoder = asn1_DEF_T5.xer_decoder; + td->xer_encoder = asn1_DEF_T5.xer_encoder; td->last_tag_form = asn1_DEF_T5.last_tag_form; td->elements = asn1_DEF_T5.elements; td->elements_count = asn1_DEF_T5.elements_count; td->specifics = asn1_DEF_T5.specifics; } +void +T4_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T4_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +T4_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T4_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t T4_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -382,7 +438,7 @@ T4_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t T4_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -390,18 +446,12 @@ T4_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -T4_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - T4_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -T4_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +T4_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { T4_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -414,11 +464,13 @@ static ber_tlv_tag_t asn1_DEF_T4_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_T4 = { "T4", + T4_free, + T4_print, T4_constraint, T4_decode_ber, T4_encode_der, - T4_print, - T4_free, + 0, /* Not implemented yet */ + T4_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T4_tags, sizeof(asn1_DEF_T4_tags) @@ -444,11 +496,12 @@ typedef T6_t T5_t; /*** <<< FUNC-DECLS [T5] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_T5; +asn_struct_free_f T5_free; +asn_struct_print_f T5_print; asn_constr_check_f T5_constraint; ber_type_decoder_f T5_decode_ber; der_type_encoder_f T5_encode_der; -asn_struct_print_f T5_print; -asn_struct_free_f T5_free; +xer_type_encoder_f T5_encode_xer; /*** <<< CODE [T5] >>> ***/ @@ -468,16 +521,32 @@ T5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void T5_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_T6.ber_decoder; - td->der_encoder = asn1_DEF_T6.der_encoder; td->free_struct = asn1_DEF_T6.free_struct; td->print_struct = asn1_DEF_T6.print_struct; + td->ber_decoder = asn1_DEF_T6.ber_decoder; + td->der_encoder = asn1_DEF_T6.der_encoder; + td->xer_decoder = asn1_DEF_T6.xer_decoder; + td->xer_encoder = asn1_DEF_T6.xer_encoder; td->last_tag_form = asn1_DEF_T6.last_tag_form; td->elements = asn1_DEF_T6.elements; td->elements_count = asn1_DEF_T6.elements_count; td->specifics = asn1_DEF_T6.specifics; } +void +T5_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T5_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +T5_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T5_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t T5_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -485,7 +554,7 @@ T5_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t T5_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -493,18 +562,12 @@ T5_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -T5_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - T5_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -T5_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +T5_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { T5_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -516,11 +579,13 @@ static ber_tlv_tag_t asn1_DEF_T5_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_T5 = { "T5", + T5_free, + T5_print, T5_constraint, T5_decode_ber, T5_encode_der, - T5_print, - T5_free, + 0, /* Not implemented yet */ + T5_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T5_tags, sizeof(asn1_DEF_T5_tags) @@ -546,11 +611,12 @@ typedef double T6_t; /*** <<< FUNC-DECLS [T6] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_T6; +asn_struct_free_f T6_free; +asn_struct_print_f T6_print; asn_constr_check_f T6_constraint; ber_type_decoder_f T6_decode_ber; der_type_encoder_f T6_encode_der; -asn_struct_print_f T6_print; -asn_struct_free_f T6_free; +xer_type_encoder_f T6_encode_xer; /*** <<< CODE [T6] >>> ***/ @@ -570,16 +636,32 @@ T6_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void T6_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_NativeReal.ber_decoder; - td->der_encoder = asn1_DEF_NativeReal.der_encoder; td->free_struct = asn1_DEF_NativeReal.free_struct; td->print_struct = asn1_DEF_NativeReal.print_struct; + td->ber_decoder = asn1_DEF_NativeReal.ber_decoder; + td->der_encoder = asn1_DEF_NativeReal.der_encoder; + td->xer_decoder = asn1_DEF_NativeReal.xer_decoder; + td->xer_encoder = asn1_DEF_NativeReal.xer_encoder; td->last_tag_form = asn1_DEF_NativeReal.last_tag_form; td->elements = asn1_DEF_NativeReal.elements; td->elements_count = asn1_DEF_NativeReal.elements_count; td->specifics = asn1_DEF_NativeReal.specifics; } +void +T6_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T6_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +T6_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T6_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t T6_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -587,7 +669,7 @@ T6_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t T6_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -595,18 +677,12 @@ T6_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -T6_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - T6_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -T6_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +T6_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { T6_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -617,11 +693,13 @@ static ber_tlv_tag_t asn1_DEF_T6_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_T6 = { "T6", + T6_free, + T6_print, T6_constraint, T6_decode_ber, T6_encode_der, - T6_print, - T6_free, + 0, /* Not implemented yet */ + T6_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T6_tags, sizeof(asn1_DEF_T6_tags) @@ -647,11 +725,12 @@ typedef Ts_t T_t; /*** <<< FUNC-DECLS [T] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_T; +asn_struct_free_f T_free; +asn_struct_print_f T_print; asn_constr_check_f T_constraint; ber_type_decoder_f T_decode_ber; der_type_encoder_f T_encode_der; -asn_struct_print_f T_print; -asn_struct_free_f T_free; +xer_type_encoder_f T_encode_xer; /*** <<< CODE [T] >>> ***/ @@ -671,16 +750,32 @@ T_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void T_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_Ts.ber_decoder; - td->der_encoder = asn1_DEF_Ts.der_encoder; td->free_struct = asn1_DEF_Ts.free_struct; td->print_struct = asn1_DEF_Ts.print_struct; + td->ber_decoder = asn1_DEF_Ts.ber_decoder; + td->der_encoder = asn1_DEF_Ts.der_encoder; + td->xer_decoder = asn1_DEF_Ts.xer_decoder; + td->xer_encoder = asn1_DEF_Ts.xer_encoder; td->last_tag_form = asn1_DEF_Ts.last_tag_form; td->elements = asn1_DEF_Ts.elements; td->elements_count = asn1_DEF_Ts.elements_count; td->specifics = asn1_DEF_Ts.specifics; } +void +T_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + T_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +T_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + T_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t T_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -688,7 +783,7 @@ T_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t T_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -696,18 +791,12 @@ T_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -T_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - T_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -T_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +T_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { T_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -720,11 +809,13 @@ static ber_tlv_tag_t asn1_DEF_T_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_T = { "T", + T_free, + T_print, T_constraint, T_decode_ber, T_encode_der, - T_print, - T_free, + 0, /* Not implemented yet */ + T_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T_tags, sizeof(asn1_DEF_T_tags) @@ -804,11 +895,13 @@ static asn1_SEQUENCE_specifics_t asn1_DEF_Ts_specs = { }; asn1_TYPE_descriptor_t asn1_DEF_Ts = { "Ts", + SEQUENCE_free, + SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - SEQUENCE_print, - SEQUENCE_free, + 0, /* Not implemented yet */ + SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_Ts_tags, sizeof(asn1_DEF_Ts_tags) diff --git a/tests/66-ref-simple-OK.asn1 b/tests/66-ref-simple-OK.asn1 index 7b19c705d..38254a9f6 100644 --- a/tests/66-ref-simple-OK.asn1 +++ b/tests/66-ref-simple-OK.asn1 @@ -5,13 +5,13 @@ -- .spelio.software.asn1c.test (9363.1.5.1) -- .66 -ModuleTestReferenceToSimpleType +ModuleTestReferenceToNamedSimpleType { iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 66 } DEFINITIONS IMPLICIT TAGS ::= BEGIN - T ::= SET OF SimpleType + T ::= SET OF named SimpleType SimpleType ::= ENUMERATED { one, two, three } diff --git a/tests/66-ref-simple-OK.asn1.-P b/tests/66-ref-simple-OK.asn1.-P index 8a3466de4..0ae62e3cb 100644 --- a/tests/66-ref-simple-OK.asn1.-P +++ b/tests/66-ref-simple-OK.asn1.-P @@ -36,14 +36,17 @@ static ber_tlv_tag_t asn1_DEF_T_tags[] = { static asn1_SET_OF_specifics_t asn1_DEF_T_specs = { sizeof(struct T), offsetof(struct T, _ber_dec_ctx), + 1, /* XER encoding is XMLValueList */ }; asn1_TYPE_descriptor_t asn1_DEF_T = { "T", + SET_OF_free, + SET_OF_print, SET_OF_constraint, SET_OF_decode_ber, SET_OF_encode_der, - SET_OF_print, - SET_OF_free, + 0, /* Not implemented yet */ + SET_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_T_tags, sizeof(asn1_DEF_T_tags) @@ -78,11 +81,12 @@ typedef ENUMERATED_t SimpleType_t; /*** <<< FUNC-DECLS [SimpleType] >>> ***/ extern asn1_TYPE_descriptor_t asn1_DEF_SimpleType; +asn_struct_free_f SimpleType_free; +asn_struct_print_f SimpleType_print; asn_constr_check_f SimpleType_constraint; ber_type_decoder_f SimpleType_decode_ber; der_type_encoder_f SimpleType_encode_der; -asn_struct_print_f SimpleType_print; -asn_struct_free_f SimpleType_free; +xer_type_encoder_f SimpleType_encode_xer; /*** <<< CODE [SimpleType] >>> ***/ @@ -102,16 +106,32 @@ SimpleType_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ static void SimpleType_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->ber_decoder = asn1_DEF_ENUMERATED.ber_decoder; - td->der_encoder = asn1_DEF_ENUMERATED.der_encoder; td->free_struct = asn1_DEF_ENUMERATED.free_struct; td->print_struct = asn1_DEF_ENUMERATED.print_struct; + td->ber_decoder = asn1_DEF_ENUMERATED.ber_decoder; + td->der_encoder = asn1_DEF_ENUMERATED.der_encoder; + td->xer_decoder = asn1_DEF_ENUMERATED.xer_decoder; + td->xer_encoder = asn1_DEF_ENUMERATED.xer_encoder; td->last_tag_form = asn1_DEF_ENUMERATED.last_tag_form; td->elements = asn1_DEF_ENUMERATED.elements; td->elements_count = asn1_DEF_ENUMERATED.elements_count; td->specifics = asn1_DEF_ENUMERATED.specifics; } +void +SimpleType_free(asn1_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + SimpleType_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +SimpleType_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + SimpleType_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + ber_dec_rval_t SimpleType_decode_ber(asn1_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { @@ -119,7 +139,7 @@ SimpleType_decode_ber(asn1_TYPE_descriptor_t *td, return td->ber_decoder(td, structure, bufptr, size, tag_mode); } -der_enc_rval_t +asn_enc_rval_t SimpleType_encode_der(asn1_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { @@ -127,18 +147,12 @@ SimpleType_encode_der(asn1_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } -int -SimpleType_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - SimpleType_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -void -SimpleType_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { +asn_enc_rval_t +SimpleType_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { SimpleType_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } @@ -149,11 +163,13 @@ static ber_tlv_tag_t asn1_DEF_SimpleType_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_SimpleType = { "SimpleType", + SimpleType_free, + SimpleType_print, SimpleType_constraint, SimpleType_decode_ber, SimpleType_encode_der, - SimpleType_print, - SimpleType_free, + 0, /* Not implemented yet */ + SimpleType_encode_xer, 0, /* Use generic outmost tag fetcher */ asn1_DEF_SimpleType_tags, sizeof(asn1_DEF_SimpleType_tags) From f7ed1489631e9db95665e6a12859899877a0a016 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 22 Sep 2004 16:06:52 +0000 Subject: [PATCH 0366/1469] BASIC-XER support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@366 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index d8a65bdca..475fb955d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,10 @@ -0.9.6: 2004-Sep-19 +0.9.6: 2004-Sep-22 - * Added CGI for online ASN.1 compilation (asn1c/webcgi). + * Implemented BASIC-XER encoding support (X.693). + * Implemented CGI for online ASN.1 compilation (asn1c/webcgi). + * NamedType is now supported for SET OF/SEQUENCE OF type. + * Added ASN1C_ENVIRONMENT_VERSION and get_asn1c_environment_version(). 0.9.5: 2004-Sep-17 From 9e9eac8f70c7a4aa0932c7af85fb8be8fe56cf0b Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 22 Sep 2004 18:30:46 +0000 Subject: [PATCH 0367/1469] added / path git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@367 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/webcgi/asn1c.cgi | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/asn1c/webcgi/asn1c.cgi b/asn1c/webcgi/asn1c.cgi index 0a03fe35f..4003ff336 100755 --- a/asn1c/webcgi/asn1c.cgi +++ b/asn1c/webcgi/asn1c.cgi @@ -141,7 +141,8 @@ unless($session) { bark("md5 program is rotten here") if(length($session) != 32); $sessionDir = makeSessionDirName($TMPDIR, $session); mkdir($sessionDir, $DM) or bark($SandBoxInitFailed); - my $ck = cookie(-name=>'SessionID', -value=>$session, -expires=>'+1y'); + my $ck = cookie(-name=>'SessionID', -value=>$session, + -path=>'/', -expires=>'+1y'); print header(-expires=>'-1y', -cookie=>$ck); $HTTPHeaderGenerated = 1; } else { From 412017606b49d5b9a1094405ce0e700ee38ca08f Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 22 Sep 2004 18:38:21 +0000 Subject: [PATCH 0368/1469] asap expiration chaned to -1d git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@368 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/webcgi/asn1c.cgi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/asn1c/webcgi/asn1c.cgi b/asn1c/webcgi/asn1c.cgi index 4003ff336..2dbab3c7c 100755 --- a/asn1c/webcgi/asn1c.cgi +++ b/asn1c/webcgi/asn1c.cgi @@ -143,7 +143,7 @@ unless($session) { mkdir($sessionDir, $DM) or bark($SandBoxInitFailed); my $ck = cookie(-name=>'SessionID', -value=>$session, -path=>'/', -expires=>'+1y'); - print header(-expires=>'-1y', -cookie=>$ck); + print header(-expires=>'-1d', -cookie=>$ck); $HTTPHeaderGenerated = 1; } else { $session =~ s/[^a-f0-9]//ig; @@ -423,7 +423,7 @@ print LOG "\n"; # Finalize logging record PRINTOUT: -print header(-expires=>'-1y') unless($HTTPHeaderGenerated); +print header(-expires=>'-1d') unless($HTTPHeaderGenerated); # If environment has never been set up completely, remove it. if($EnvironmentSetOK != 1 && $TMPDIR ne "/") { From f331497761f4cac1679e94d043fddab1d759c7b6 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 23 Sep 2004 22:02:52 +0000 Subject: [PATCH 0369/1469] sample x.509 certificate dumper program git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@369 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/Makefile.am | 6 +- examples/Makefile.in | 8 +- examples/sample.source.PKIX1/Makefile | 355 ++++++++++++++++++++++++++ examples/sample.source.PKIX1/config.h | 8 + 4 files changed, 375 insertions(+), 2 deletions(-) create mode 100644 examples/sample.source.PKIX1/Makefile create mode 100644 examples/sample.source.PKIX1/config.h diff --git a/examples/Makefile.am b/examples/Makefile.am index ca3f9d615..d3e73d6d4 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -21,5 +21,9 @@ $(ASN1_FILES_0): crfc2asn1.pl $(ASN1_SOURCE_0) $(ASN1_FILES_1): crfc2asn1.pl $(ASN1_SOURCE_1) ./crfc2asn1.pl $(ASN1_SOURCE_1) -EXTRA_DIST = rfc*.txt +EXTRA_DIST = rfc*.txt \ + sample.source.PKIX1/x509dump.c \ + sample.source.PKIX1/config.h \ + sample.source.PKIX1/Makefile \ + sample.source.PKIX1/regenerate.Makefile CLEANFILES = *.asn1 diff --git a/examples/Makefile.in b/examples/Makefile.in index aea3168ba..c2a3b941a 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -173,7 +173,12 @@ ASN1_FILES_1 = \ rfc3280-PKIX1Explicit88.asn1 \ rfc3280-PKIX1Implicit88.asn1 -EXTRA_DIST = rfc*.txt +EXTRA_DIST = rfc*.txt \ + sample.source.PKIX1/x509dump.c \ + sample.source.PKIX1/config.h \ + sample.source.PKIX1/Makefile \ + sample.source.PKIX1/regenerate.Makefile + CLEANFILES = *.asn1 all: all-am @@ -244,6 +249,7 @@ CTAGS: distdir: $(DISTFILES) + $(mkdir_p) $(distdir)/sample.source.PKIX1 @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile new file mode 100644 index 000000000..41638ee5f --- /dev/null +++ b/examples/sample.source.PKIX1/Makefile @@ -0,0 +1,355 @@ +ASN_MODULE_SOURCES= \ + Attribute.c \ + AttributeType.c \ + AttributeValue.c \ + AttributeTypeAndValue.c \ + X520name.c \ + X520CommonName.c \ + X520LocalityName.c \ + X520StateOrProvinceName.c \ + X520OrganizationName.c \ + X520OrganizationalUnitName.c \ + X520Title.c \ + X520dnQualifier.c \ + X520countryName.c \ + X520SerialNumber.c \ + X520Pseudonym.c \ + DomainComponent.c \ + EmailAddress.c \ + Name.c \ + RDNSequence.c \ + DistinguishedName.c \ + RelativeDistinguishedName.c \ + DirectoryString.c \ + Certificate.c \ + TBSCertificate.c \ + Version.c \ + CertificateSerialNumber.c \ + Validity.c \ + Time.c \ + UniqueIdentifier.c \ + SubjectPublicKeyInfo.c \ + Extensions.c \ + Extension.c \ + CertificateList.c \ + TBSCertList.c \ + AlgorithmIdentifier.c \ + ORAddress.c \ + BuiltInStandardAttributes.c \ + CountryName.c \ + AdministrationDomainName.c \ + NetworkAddress.c \ + X121Address.c \ + TerminalIdentifier.c \ + PrivateDomainName.c \ + OrganizationName.c \ + NumericUserIdentifier.c \ + PersonalName.c \ + OrganizationalUnitNames.c \ + OrganizationalUnitName.c \ + BuiltInDomainDefinedAttributes.c \ + BuiltInDomainDefinedAttribute.c \ + ExtensionAttributes.c \ + ExtensionAttribute.c \ + CommonName.c \ + TeletexCommonName.c \ + TeletexOrganizationName.c \ + TeletexPersonalName.c \ + TeletexOrganizationalUnitNames.c \ + TeletexOrganizationalUnitName.c \ + PDSName.c \ + PhysicalDeliveryCountryName.c \ + PostalCode.c \ + PhysicalDeliveryOfficeName.c \ + PhysicalDeliveryOfficeNumber.c \ + ExtensionORAddressComponents.c \ + PhysicalDeliveryPersonalName.c \ + PhysicalDeliveryOrganizationName.c \ + ExtensionPhysicalDeliveryAddressComponents.c \ + UnformattedPostalAddress.c \ + StreetAddress.c \ + PostOfficeBoxAddress.c \ + PosteRestanteAddress.c \ + UniquePostalName.c \ + LocalPostalAttributes.c \ + PDSParameter.c \ + ExtendedNetworkAddress.c \ + PresentationAddress.c \ + TerminalType.c \ + TeletexDomainDefinedAttributes.c \ + TeletexDomainDefinedAttribute.c \ + AuthorityKeyIdentifier.c \ + KeyIdentifier.c \ + SubjectKeyIdentifier.c \ + KeyUsage.c \ + PrivateKeyUsagePeriod.c \ + CertificatePolicies.c \ + PolicyInformation.c \ + CertPolicyId.c \ + PolicyQualifierInfo.c \ + PolicyQualifierId.c \ + CPSuri.c \ + UserNotice.c \ + NoticeReference.c \ + DisplayText.c \ + PolicyMappings.c \ + SubjectAltName.c \ + GeneralNames.c \ + GeneralName.c \ + AnotherName.c \ + EDIPartyName.c \ + IssuerAltName.c \ + SubjectDirectoryAttributes.c \ + BasicConstraints.c \ + NameConstraints.c \ + GeneralSubtrees.c \ + GeneralSubtree.c \ + BaseDistance.c \ + PolicyConstraints.c \ + SkipCerts.c \ + CRLDistributionPoints.c \ + DistributionPoint.c \ + DistributionPointName.c \ + ReasonFlags.c \ + ExtKeyUsageSyntax.c \ + KeyPurposeId.c \ + InhibitAnyPolicy.c \ + FreshestCRL.c \ + AuthorityInfoAccessSyntax.c \ + AccessDescription.c \ + SubjectInfoAccessSyntax.c \ + CRLNumber.c \ + IssuingDistributionPoint.c \ + BaseCRLNumber.c \ + CRLReason.c \ + CertificateIssuer.c \ + HoldInstructionCode.c \ + InvalidityDate.c + +ASN_MODULE_HEADERS= \ + Attribute.h \ + AttributeType.h \ + AttributeValue.h \ + AttributeTypeAndValue.h \ + X520name.h \ + X520CommonName.h \ + X520LocalityName.h \ + X520StateOrProvinceName.h \ + X520OrganizationName.h \ + X520OrganizationalUnitName.h \ + X520Title.h \ + X520dnQualifier.h \ + X520countryName.h \ + X520SerialNumber.h \ + X520Pseudonym.h \ + DomainComponent.h \ + EmailAddress.h \ + Name.h \ + RDNSequence.h \ + DistinguishedName.h \ + RelativeDistinguishedName.h \ + DirectoryString.h \ + Certificate.h \ + TBSCertificate.h \ + Version.h \ + CertificateSerialNumber.h \ + Validity.h \ + Time.h \ + UniqueIdentifier.h \ + SubjectPublicKeyInfo.h \ + Extensions.h \ + Extension.h \ + CertificateList.h \ + TBSCertList.h \ + AlgorithmIdentifier.h \ + ORAddress.h \ + BuiltInStandardAttributes.h \ + CountryName.h \ + AdministrationDomainName.h \ + NetworkAddress.h \ + X121Address.h \ + TerminalIdentifier.h \ + PrivateDomainName.h \ + OrganizationName.h \ + NumericUserIdentifier.h \ + PersonalName.h \ + OrganizationalUnitNames.h \ + OrganizationalUnitName.h \ + BuiltInDomainDefinedAttributes.h \ + BuiltInDomainDefinedAttribute.h \ + ExtensionAttributes.h \ + ExtensionAttribute.h \ + CommonName.h \ + TeletexCommonName.h \ + TeletexOrganizationName.h \ + TeletexPersonalName.h \ + TeletexOrganizationalUnitNames.h \ + TeletexOrganizationalUnitName.h \ + PDSName.h \ + PhysicalDeliveryCountryName.h \ + PostalCode.h \ + PhysicalDeliveryOfficeName.h \ + PhysicalDeliveryOfficeNumber.h \ + ExtensionORAddressComponents.h \ + PhysicalDeliveryPersonalName.h \ + PhysicalDeliveryOrganizationName.h \ + ExtensionPhysicalDeliveryAddressComponents.h \ + UnformattedPostalAddress.h \ + StreetAddress.h \ + PostOfficeBoxAddress.h \ + PosteRestanteAddress.h \ + UniquePostalName.h \ + LocalPostalAttributes.h \ + PDSParameter.h \ + ExtendedNetworkAddress.h \ + PresentationAddress.h \ + TerminalType.h \ + TeletexDomainDefinedAttributes.h \ + TeletexDomainDefinedAttribute.h \ + AuthorityKeyIdentifier.h \ + KeyIdentifier.h \ + SubjectKeyIdentifier.h \ + KeyUsage.h \ + PrivateKeyUsagePeriod.h \ + CertificatePolicies.h \ + PolicyInformation.h \ + CertPolicyId.h \ + PolicyQualifierInfo.h \ + PolicyQualifierId.h \ + CPSuri.h \ + UserNotice.h \ + NoticeReference.h \ + DisplayText.h \ + PolicyMappings.h \ + SubjectAltName.h \ + GeneralNames.h \ + GeneralName.h \ + AnotherName.h \ + EDIPartyName.h \ + IssuerAltName.h \ + SubjectDirectoryAttributes.h \ + BasicConstraints.h \ + NameConstraints.h \ + GeneralSubtrees.h \ + GeneralSubtree.h \ + BaseDistance.h \ + PolicyConstraints.h \ + SkipCerts.h \ + CRLDistributionPoints.h \ + DistributionPoint.h \ + DistributionPointName.h \ + ReasonFlags.h \ + ExtKeyUsageSyntax.h \ + KeyPurposeId.h \ + InhibitAnyPolicy.h \ + FreshestCRL.h \ + AuthorityInfoAccessSyntax.h \ + AccessDescription.h \ + SubjectInfoAccessSyntax.h \ + CRLNumber.h \ + IssuingDistributionPoint.h \ + BaseCRLNumber.h \ + CRLReason.h \ + CertificateIssuer.h \ + HoldInstructionCode.h \ + InvalidityDate.h + +ASN_MODULE_HEADERS+=ANY.h +ASN_MODULE_SOURCES+=ANY.c +ASN_MODULE_HEADERS+=BIT_STRING.h +ASN_MODULE_SOURCES+=BIT_STRING.c +ASN_MODULE_HEADERS+=BMPString.h +ASN_MODULE_SOURCES+=BMPString.c +ASN_MODULE_HEADERS+=BOOLEAN.h +ASN_MODULE_SOURCES+=BOOLEAN.c +ASN_MODULE_HEADERS+=ENUMERATED.h +ASN_MODULE_SOURCES+=ENUMERATED.c +ASN_MODULE_HEADERS+=INTEGER.h +ASN_MODULE_HEADERS+=GeneralizedTime.h +ASN_MODULE_SOURCES+=GeneralizedTime.c +ASN_MODULE_HEADERS+=IA5String.h +ASN_MODULE_SOURCES+=IA5String.c +ASN_MODULE_SOURCES+=INTEGER.c +ASN_MODULE_HEADERS+=NumericString.h +ASN_MODULE_SOURCES+=NumericString.c +ASN_MODULE_HEADERS+=OBJECT_IDENTIFIER.h +ASN_MODULE_SOURCES+=OBJECT_IDENTIFIER.c +ASN_MODULE_HEADERS+=PrintableString.h +ASN_MODULE_SOURCES+=PrintableString.c +ASN_MODULE_HEADERS+=TeletexString.h +ASN_MODULE_SOURCES+=TeletexString.c +ASN_MODULE_HEADERS+=UTCTime.h +ASN_MODULE_SOURCES+=UTCTime.c +ASN_MODULE_HEADERS+=UTF8String.h +ASN_MODULE_SOURCES+=UTF8String.c +ASN_MODULE_HEADERS+=UniversalString.h +ASN_MODULE_SOURCES+=UniversalString.c +ASN_MODULE_HEADERS+=VisibleString.h +ASN_MODULE_SOURCES+=VisibleString.c +ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h +ASN_MODULE_SOURCES+=asn_SEQUENCE_OF.c +ASN_MODULE_HEADERS+=asn_SET_OF.h +ASN_MODULE_SOURCES+=asn_SET_OF.c +ASN_MODULE_HEADERS+=constr_CHOICE.h +ASN_MODULE_SOURCES+=constr_CHOICE.c +ASN_MODULE_HEADERS+=constr_SEQUENCE.h +ASN_MODULE_SOURCES+=constr_SEQUENCE.c +ASN_MODULE_HEADERS+=constr_SEQUENCE_OF.h +ASN_MODULE_SOURCES+=constr_SEQUENCE_OF.c +ASN_MODULE_HEADERS+=constr_SET.h +ASN_MODULE_SOURCES+=constr_SET.c +ASN_MODULE_HEADERS+=constr_SET_OF.h +ASN_MODULE_SOURCES+=constr_SET_OF.c +ASN_MODULE_HEADERS+=asn_types.h +ASN_MODULE_HEADERS+=asn_internal.h +ASN_MODULE_HEADERS+=OCTET_STRING.h +ASN_MODULE_SOURCES+=OCTET_STRING.c +ASN_MODULE_HEADERS+=ber_decoder.h +ASN_MODULE_SOURCES+=ber_decoder.c +ASN_MODULE_HEADERS+=ber_tlv_length.h +ASN_MODULE_SOURCES+=ber_tlv_length.c +ASN_MODULE_HEADERS+=ber_tlv_tag.h +ASN_MODULE_SOURCES+=ber_tlv_tag.c +ASN_MODULE_HEADERS+=constr_TYPE.h +ASN_MODULE_SOURCES+=constr_TYPE.c +ASN_MODULE_HEADERS+=constraints.h +ASN_MODULE_SOURCES+=constraints.c +ASN_MODULE_HEADERS+=der_encoder.h +ASN_MODULE_SOURCES+=der_encoder.c +ASN_MODULE_HEADERS+=xer_encoder.h +ASN_MODULE_SOURCES+=xer_encoder.c + + +lib_LTLIBRARIES=libsomething.la +libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) + +# This file may be used as an input for make(3) +# Remove the lines below to convert it into a pure .am file +TARGET = x509dump +CFLAGS += -I. -g -DHAVE_CONFIG_H +OBJS=${ASN_MODULE_SOURCES:.c=.o} $(TARGET).o + +all: $(TARGET) + +$(TARGET): ${OBJS} + $(CC) $(CFLAGS) -o $(TARGET) ${OBJS} $(LDFLAGS) $(LIBS) + +.SUFFIXES: +.SUFFIXES: .c .o + +.c.o: + $(CC) $(CFLAGS) -o $@ -c $< + +clean: + rm -f $(TARGET) + rm -f $(OBJS) + + +Attribute.c: regenerate.Makefile + ./regenerate.Makefile + make + exit + +distclean: clean + rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) + rm -f Makefile.am.sample diff --git a/examples/sample.source.PKIX1/config.h b/examples/sample.source.PKIX1/config.h new file mode 100644 index 000000000..e9a97e66b --- /dev/null +++ b/examples/sample.source.PKIX1/config.h @@ -0,0 +1,8 @@ + +extern int opt_debug; + +#define ASN_DEBUG(fmt, args...) do { \ + if(opt_debug < 2) break; \ + fprintf(stderr, fmt, ##args); \ + fprintf(stderr, "\n"); \ + } while(0) From 784a6b77f4dd7824dc1b9213f34b52a552a2895e Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 23 Sep 2004 22:06:02 +0000 Subject: [PATCH 0370/1469] implemented unber - the ASN.1 BER Decoder git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@370 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/Makefile.am | 9 +- asn1c/Makefile.in | 31 +-- asn1c/README | 3 +- asn1c/asn1c.1 | 11 +- asn1c/asn1c.c | 20 +- asn1c/unber.c | 481 ++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 511 insertions(+), 44 deletions(-) create mode 100644 asn1c/unber.c diff --git a/asn1c/Makefile.am b/asn1c/Makefile.am index 63bb31c27..a5caec37e 100644 --- a/asn1c/Makefile.am +++ b/asn1c/Makefile.am @@ -10,18 +10,15 @@ AM_CPPFLAGS = \ -I${top_srcdir}/skeletons \ -DDATADIR=\"$(pkgdatadir)\" -LDADD = \ +asn1c_LDADD = \ $(top_builddir)/libasn1parser/libasn1parser.la \ $(top_builddir)/libasn1print/libasn1print.la \ $(top_builddir)/libasn1fix/libasn1fix.la \ $(top_builddir)/libasn1compiler/libasn1compiler.la -asn1c_SOURCES = asn1c.c \ - tlv_decoder.c tlv_decoder.h +bin_PROGRAMS = asn1c unber -bin_PROGRAMS = asn1c - -dist_man1_MANS = asn1c.1 +dist_man1_MANS = asn1c.1 unber.1 check_SCRIPTS = check-parsing.sh TESTS = check-parsing.sh diff --git a/asn1c/Makefile.in b/asn1c/Makefile.in index 431b38abf..73c25f358 100644 --- a/asn1c/Makefile.in +++ b/asn1c/Makefile.in @@ -14,7 +14,7 @@ @SET_MAKE@ -SOURCES = $(asn1c_SOURCES) +SOURCES = asn1c.c unber.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ @@ -37,7 +37,7 @@ NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_triplet = @host@ -bin_PROGRAMS = asn1c$(EXEEXT) +bin_PROGRAMS = asn1c$(EXEEXT) unber$(EXEEXT) subdir = asn1c DIST_COMMON = README $(dist_man1_MANS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in @@ -51,18 +51,19 @@ CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) -am_asn1c_OBJECTS = asn1c.$(OBJEXT) tlv_decoder.$(OBJEXT) -asn1c_OBJECTS = $(am_asn1c_OBJECTS) -asn1c_LDADD = $(LDADD) +asn1c_SOURCES = asn1c.c +asn1c_OBJECTS = asn1c.$(OBJEXT) asn1c_DEPENDENCIES = $(top_builddir)/libasn1parser/libasn1parser.la \ $(top_builddir)/libasn1print/libasn1print.la \ $(top_builddir)/libasn1fix/libasn1fix.la \ $(top_builddir)/libasn1compiler/libasn1compiler.la +unber_SOURCES = unber.c +unber_OBJECTS = unber.$(OBJEXT) +unber_LDADD = $(LDADD) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles -@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/asn1c.Po \ -@AMDEP_TRUE@ ./$(DEPDIR)/tlv_decoder.Po +@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/asn1c.Po ./$(DEPDIR)/unber.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ @@ -71,8 +72,8 @@ LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ CCLD = $(CC) LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(asn1c_SOURCES) -DIST_SOURCES = $(asn1c_SOURCES) +SOURCES = asn1c.c unber.c +DIST_SOURCES = asn1c.c unber.c RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ @@ -205,16 +206,13 @@ AM_CPPFLAGS = \ -I${top_srcdir}/skeletons \ -DDATADIR=\"$(pkgdatadir)\" -LDADD = \ +asn1c_LDADD = \ $(top_builddir)/libasn1parser/libasn1parser.la \ $(top_builddir)/libasn1print/libasn1print.la \ $(top_builddir)/libasn1fix/libasn1fix.la \ $(top_builddir)/libasn1compiler/libasn1compiler.la -asn1c_SOURCES = asn1c.c \ - tlv_decoder.c tlv_decoder.h - -dist_man1_MANS = asn1c.1 +dist_man1_MANS = asn1c.1 unber.1 check_SCRIPTS = check-parsing.sh TESTS = check-parsing.sh EXTRA_DIST = check-parsing.sh @@ -283,6 +281,9 @@ clean-binPROGRAMS: asn1c$(EXEEXT): $(asn1c_OBJECTS) $(asn1c_DEPENDENCIES) @rm -f asn1c$(EXEEXT) $(LINK) $(asn1c_LDFLAGS) $(asn1c_OBJECTS) $(asn1c_LDADD) $(LIBS) +unber$(EXEEXT): $(unber_OBJECTS) $(unber_DEPENDENCIES) + @rm -f unber$(EXEEXT) + $(LINK) $(unber_LDFLAGS) $(unber_OBJECTS) $(unber_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -291,7 +292,7 @@ distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlv_decoder.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unber.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ diff --git a/asn1c/README b/asn1c/README index 158cd1150..8bec7b9e7 100644 --- a/asn1c/README +++ b/asn1c/README @@ -1 +1,2 @@ -The ASN.1 Compiler +asn1c - The ASN.1 Compiler +unber - The ASN.1 BER Decoder diff --git a/asn1c/asn1c.1 b/asn1c/asn1c.1 index 8d7cf0617..d6be94582 100644 --- a/asn1c/asn1c.1 +++ b/asn1c/asn1c.1 @@ -4,9 +4,8 @@ .TH ASN1C 1 "\*(Dt" "ASN.1 Compiler" "ASN.1 Compiler" .SH NAME asn1c \- ASN.1 Compiler -.ND ASN.1 compiler .SH SYNOPSIS -asn1c [\fB\-E\fR [\fB-F\fR] | \fB\-P\fR | \fB\-R\fR | \fB\-t\fR\fIdata-string\fR] +asn1c [\fB\-E\fR [\fB-F\fR] | \fB\-P\fR | \fB\-R\fR] [\fB\-S\fR\fIdir\fR] [\fB\-W\fR\fIdebug-\fR...] [\fB\-f\fR\fIoption\fR...] [\fB\-p\fR\fIrint-\fR...] \fIinfile\fR... @@ -19,7 +18,6 @@ and other encoding standards. \fIOverall Options\fR \fB\-E \-F \-P \-R\fR .BI "\-S " directory -.BI "\-t " data-string .TP \fIWarning Options\fR .br @@ -55,10 +53,6 @@ omitting the usual support code. .TP \fB\-S\fR \fIdirectory\fR Use the specified directory with ASN.1 skeleton files. -.TP -\fB\-t\fR \fIdata-string\fR -Interpret the data-string as a sequence of hexadecimal values representing -the start of BER TLV encoding. Print the human readable explanation. .SH WARNING OPTIONS .TP .B \-Werror @@ -104,5 +98,8 @@ its internal understanding of subtype constraints. .TP .B \-print-lines Generate "-- #line" comments in \fB-E\fR output. +.SH SEE ALSO +.TP +\&\fIunber\fR\|(1) .SH AUTHORS Lev Walkin diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index 9dd5dde3d..e3097bd52 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -19,9 +19,7 @@ #include /* Portable basename(3) and dirname(3) */ -#include "tlv_decoder.h" /* -t: decode TL[V?] string */ - -static void usage(char *av0); /* Print the Usage screen and exit(EX_USAGE) */ +static void usage(const char *av0); /* Print the Usage screen and exit */ #undef COPYRIGHT #define COPYRIGHT \ @@ -45,7 +43,7 @@ main(int ac, char **av) { /* * Process command-line options. */ - while((ch = getopt(ac, av, "EFf:hLPp:RS:t:vW:")) != -1) + while((ch = getopt(ac, av, "EFf:hLPp:RS:vW:")) != -1) switch(ch) { case 'E': print_arg__print_out = 1; @@ -97,10 +95,6 @@ main(int ac, char **av) { case 'S': skeletons_dir = optarg; break; - case 't': - if(decode_tlv_from_string(optarg)) - exit(EX_DATAERR); - exit(0); case 'v': fprintf(stderr, "ASN.1 Compiler, v" VERSION "\n" COPYRIGHT); exit(0); @@ -264,11 +258,11 @@ main(int ac, char **av) { * Print the usage screen and exit(EX_USAGE). */ static void -usage(char *av0) { +usage(const char *av0) { fprintf(stderr, "ASN.1 Compiler, v" VERSION "\n" COPYRIGHT -"Usage: %s [options] infile...\n" -"Where [options] are:\n" +"Usage: %s [options] file ...\n" +"Options:\n" " -E Run only the ASN.1 parser and print out the tree\n" " -F During -E operation, also perform tree fixing\n" "\n" @@ -278,10 +272,6 @@ usage(char *av0) { " (Default is \"%s\")\n" "\n" -" -t Decode the given tag[/length] sequence\n" -" (e.g. -t \"bf 20\")\n" -"\n" - " -Werror Treat warnings as errors; abort if any warning\n" " -Wdebug-lexer Enable verbose debugging output from lexer\n" " -Wdebug-fixer --//-- semantics processor\n" diff --git a/asn1c/unber.c b/asn1c/unber.c new file mode 100644 index 000000000..a954ece15 --- /dev/null +++ b/asn1c/unber.c @@ -0,0 +1,481 @@ +#include +#include +#include +#include +#include +#include /* for EX_USAGE */ +#include +#include + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include /* For static string tables */ + +#include +#include +#include +#include +#include + +static void usage(const char *av0); /* Print the Usage screen and exit */ +static int process(const char *fname); /* Perform the BER decoding */ +static int decode_tlv_from_string(const char *datastring); + +#undef COPYRIGHT +#define COPYRIGHT \ + "Copyright (c) 2004 Lev Walkin \n" + +static char *indent_buffer = " "; + +int +main(int ac, char **av) { + int ch; /* Command line character */ + int i; /* Index in some loops */ + + /* + * Process command-line options. + */ + while((ch = getopt(ac, av, "i:t:v")) != -1) + switch(ch) { + case 't': + if(decode_tlv_from_string(optarg)) + exit(EX_DATAERR); + exit(0); + case 'i': + i = atoi(optarg); + if(i >= 0 && i < 16) { + indent_buffer = alloca(i + 1); + memset(indent_buffer, ' ', i); + indent_buffer[i] = '\0'; + } else { + fprintf(stderr, "-i %s: Invalid indent value\n",optarg); + exit(EX_USAGE); + } + break; + case 'v': + fprintf(stderr, "ASN.1 BER Decoder, v" VERSION "\n" COPYRIGHT); + exit(0); + break; + default: + usage(av[0]); + } + + /* + * Ensure that there are some input files present. + */ + if(ac > optind) { + ac -= optind; + av += optind; + } else { + fprintf(stderr, "%s: No input files specified\n", av[0]); + exit(1); + } + + setvbuf(stdout, 0, _IOLBF, 0); + + /* + * Iterate over input files and parse each. + * All syntax trees from all files will be bundled together. + */ + for(i = 0; i < ac; i++) { + if(process(av[i])) + exit(EX_DATAERR); + } + + return 0; +} + +/* + * Print the usage screen and exit(EX_USAGE). + */ +static void +usage(const char *av0) { + fprintf(stderr, +"ASN.1 BER Decoder, v" VERSION "\n" COPYRIGHT +"Usage: %s [options] [-] [file ...]\n" +"Options:\n" +" -i Amount of spaces for indentation (default is 4)\n" +" -t Decode the given tag[/length] sequence\n" +" (e.g. -t \"bf 20\")\n" + , av0); + exit(EX_USAGE); +} + +typedef enum pd_code { + PD_FAILED = -1, + PD_FINISHED = 0, + PD_EOF = 1, +} pd_code_e; +static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t limit); +static void print_TL(int fin, int level, int constr, ssize_t tlen, ber_tlv_tag_t, ber_tlv_len_t); +static int print_V(const char *fname, FILE *fp, ber_tlv_tag_t, ber_tlv_len_t); + +/* + * Open the file and initiate recursive processing. + */ +static int +process(const char *fname) { + FILE *fp; + pd_code_e pdc; + + if(strcmp(fname, "-")) { + fp = fopen(fname, "r"); + if(!fp) { + perror(fname); + return -1; + } + } else { + fp = stdin; + } + + /* + * Fetch out BER-encoded data until EOF or error. + */ + do { + pdc = process_deeper(fname, fp, 0, -1); + } while(pdc == PD_FINISHED); /* Wait until PD_EOF */ + + if(fp != stdin) + fclose(fp); + + if(pdc == PD_FAILED) + return -1; + return 0; +} + +/* + * Process the TLV recursively. + */ +static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t limit) { + unsigned char tagbuf[32]; + ssize_t tblen = 0; + pd_code_e pdc = PD_FINISHED; + ber_tlv_tag_t tlv_tag; + ber_tlv_len_t tlv_len; + ssize_t t_len; + ssize_t l_len; + + do { + int constr; + int ch; + + if(limit == 0) + return PD_FINISHED; + + if(limit >= 0 && tblen >= limit) { + fprintf(stderr, + "%s: Too long TL sequence (%ld >= %ld). " + "Dangerous file\n", + fname, (long)tblen, (long)limit); + return PD_FAILED; + } + + ch = fgetc(fp); + if(ch == -1) { + if(tblen) { + fprintf(stderr, + "%s: Unexpected end of file (TL)\n", + fname); + return PD_FAILED; + } else { + return PD_EOF; + } + } + + tagbuf[tblen++] = ch; + + /* + * Decode the TLV tag. + */ + t_len = ber_fetch_tag(tagbuf, tblen, &tlv_tag); + switch(t_len) { + case -1: + fprintf(stderr, "%s: Fatal error deciphering tag\n", + fname); + return PD_FAILED; + case 0: + /* More data expected */ + continue; + } + + /* + * Decode the TLV length. + */ + constr = BER_TLV_CONSTRUCTED(tagbuf); + l_len = ber_fetch_length(constr, + tagbuf + t_len, tblen - t_len, &tlv_len); + switch(l_len) { + case -1: + fprintf(stderr, "%s: Fatal error deciphering length\n", + fname); + return PD_FAILED; + case 0: + /* More data expected */ + continue; + } + + /* Make sure the T & L decoders took exactly the whole buffer */ + assert((t_len + l_len) == tblen); + + print_TL(0, level, constr, tblen, tlv_tag, tlv_len); + + if(limit != -1) { + /* If limit is set, account for the TL sequence */ + limit -= (t_len + l_len); + assert(limit >= 0); + } + + if(limit != -1) { + if(tlv_len > limit) { + fprintf(stderr, + "%s: Structure advertizes length (%ld) " + "greater than of a parent container (%ld)\n", + fname, (long)tlv_len, (long)limit); + return PD_FAILED; + } else if(tlv_len != -1) { + /* Account for the V */ + limit -= tlv_len; + } + } + + if(constr) { + /* + * This is a constructed type. Process recursively. + */ + + /* Get the new subframe limit from the structure tags */ + if(tlv_len == -1) + tlv_len = limit; + + pdc = process_deeper(fname, fp, level + 1, tlv_len); + if(pdc == PD_FAILED) return pdc; + } else { + + assert(tlv_len >= 0); + if(print_V(fname, fp, tlv_tag, tlv_len)) + return PD_FAILED; + } + + print_TL(1, level, constr, tblen, tlv_tag, tlv_len); + + tblen = 0; + } while(1); + + return pdc; +} + +static void +print_TL(int fin, int level, int constr, ssize_t tlen, ber_tlv_tag_t tlv_tag, ber_tlv_len_t tlv_len) { + + if(fin && tlen == 2 && !constr && !tlv_tag && !tlv_len) { + /* end of content octets */ + return; + } + + if(fin && !constr) { + printf("

    \n"); + return; + } + + while(level-- > 0) printf(indent_buffer); /* Print indent */ + printf(fin ? "\n"); + else + printf(">"); +} + +static int +print_V(const char *fname, FILE *fp, ber_tlv_tag_t tlv_tag, ber_tlv_len_t tlv_len) { + asn1p_expr_type_e etype = 0; + long collector = 0; + ssize_t i; + + /* Figure out what type is it */ + if(BER_TAG_CLASS(tlv_tag) == ASN_TAG_CLASS_UNIVERSAL) { + ber_tlv_tag_t tvalue = BER_TAG_VALUE(tlv_tag); + etype = ASN_UNIVERSAL_TAG2TYPE(tvalue); + } + + /* + * Print the value in binary or text form. + */ + for(i = 0; i < tlv_len; i++) { + int ch = fgetc(fp); + if(ch == -1) { + fprintf(stderr, + "%s: Unexpected end of file (V)\n", fname); + return -1; + } + switch(etype) { + case ASN_BASIC_UTCTime: + case ASN_BASIC_GeneralizedTime: + case ASN_STRING_NumericString: + case ASN_STRING_PrintableString: + case ASN_STRING_VisibleString: + case ASN_STRING_UTF8String: + switch(ch) { + default: + if(((etype == ASN_STRING_UTF8String) + || !(ch & 0x80)) + && (ch >= 0x20) + ) { + printf("%c", ch); + break; + } + /* Fall through */ + case '<': case '>': case '&': + printf("&x%02x;", ch); + } + break; + case ASN_BASIC_BOOLEAN: + if(tlv_len == 1) { + switch(ch) { + case 0: printf(""); break; + case 0xff: printf(""); break; + default: printf("", ch); + } + break; + } + /* Fall through */ + case ASN_BASIC_INTEGER: + case ASN_BASIC_ENUMERATED: + if((size_t)tlv_len <= sizeof(collector)) { + if(i) { + collector = collector * 256 + ch; + } else { + collector = (int)(signed char)ch; + } + if((i+1) == tlv_len) + printf("%ld", collector); + break; + } + /* Fall through */ + default: + printf("&x%02x;", ch); + } + } + + return 0; +} + + +static int +decode_tlv_from_string(const char *datastring) { + unsigned char *data, *dp; + size_t dsize; /* Data size */ + ssize_t len; + ber_tlv_tag_t tlv_tag; + ber_tlv_len_t tlv_len; + const char *p; + int half; + + dsize = strlen(datastring) + 1; + dp = data = calloc(1, dsize); + assert(data); + + for(half = 0, p = datastring; *p; p++) { + switch(*p) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + *dp |= *p - '0'; break; + case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': + *dp |= *p - 'A' + 10; break; + case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': + *dp |= *p - 'a' + 10; break; + case ' ': case '\t': case '\r': case '\n': + continue; + default: + fprintf(stderr, "Unexpected symbols in data string:\n"); + fprintf(stderr, "%s\n", datastring); + for(dp = data; datastring < p; datastring++, dp++) + *dp = ' '; + *dp = '\0'; + fprintf(stderr, "%s^ <- here\n", (char *)data); + return -1; + } + if(half) dp++; else (*dp) <<= 4; + half = !half; + } + + assert((size_t)(dp - data) <= dsize); + dsize = dp - data; + + printf("BER: "); + for(dp = data; dp < data + dsize; dp++) + printf("%02X", *dp); + printf("\n"); + + len = ber_fetch_tag(data, dsize, &tlv_tag); + switch(len) { + case -1: + fprintf(stderr, "TAG: Fatal error deciphering tag\n"); + return -1; + case 0: + fprintf(stderr, "TAG: More data expected\n"); + return -1; + default: + printf("TAG: "); + ber_tlv_tag_fwrite(tlv_tag, stdout); + if(BER_TLV_CONSTRUCTED(data)) { + printf(" (constructed)"); + } else if(dsize >= 2 && data[0] == 0 && data[1] == 0) { + printf(" (end-of-content)"); + } else { + printf(" (primitive)"); + } + if(BER_TAG_CLASS(tlv_tag) == ASN_TAG_CLASS_UNIVERSAL) { + const char *str; + ber_tlv_tag_t tvalue = BER_TAG_VALUE(tlv_tag); + str = ASN_UNIVERSAL_TAG2STR(tvalue); + if(str) printf(" \"%s\"", str); + } + printf("\n"); + } + + if(dsize > (size_t)len) { + len = ber_fetch_length(BER_TLV_CONSTRUCTED(data), + data + len, dsize - len, &tlv_len); + switch(len) { + case -1: + fprintf(stderr, + "LEN: Fatal error deciphering length\n"); + return -1; + case 0: + fprintf(stderr, "LEN: More data expected\n"); + return -1; + default: + if(tlv_len == (ber_tlv_len_t)-1) + printf("LEN: Indefinite length encoding\n"); + else + printf("LEN: %ld bytes\n", (long)tlv_len); + } + } + + return 0; +} From ef1b4c0f5749d1b7a71213f809ae50be71094205 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 23 Sep 2004 22:06:26 +0000 Subject: [PATCH 0371/1469] pretty-printing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@371 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ANY.c | 17 ++++++------- skeletons/BIT_STRING.c | 31 +++++++++++++++++----- skeletons/OCTET_STRING.c | 51 +++++++++++++++++++++---------------- skeletons/ber_decoder.c | 4 +++ skeletons/constr_CHOICE.c | 11 +++++--- skeletons/constr_SEQUENCE.c | 6 ++++- skeletons/constr_SET.c | 3 +++ skeletons/constr_SET_OF.c | 6 ++++- skeletons/xer_encoder.c | 27 ++++++++++---------- 9 files changed, 100 insertions(+), 56 deletions(-) diff --git a/skeletons/ANY.c b/skeletons/ANY.c index a1c77118d..ed529c571 100644 --- a/skeletons/ANY.c +++ b/skeletons/ANY.c @@ -29,16 +29,15 @@ ANY_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { - (void)ilevel; - (void)flags; - (void)cb; - (void)app_key; - - /* - * XER-encoding of ANY type is not supported. - */ + if(flags & XER_F_CANONICAL) { + /* + * Canonical XER-encoding of ANY type is not supported. + */ + _ASN_ENCODE_FAILED; + } - _ASN_ENCODE_FAILED; + /* Dump as binary */ + return OCTET_STRING_encode_xer(td, sptr, ilevel, flags, cb, app_key); } struct _callback_arg { diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index b6da3aeab..c3788d834 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -78,6 +78,7 @@ BIT_STRING_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, char *p = scratch; char *scend = scratch + (sizeof(scratch) - 10); const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + int xcan = (flags & XER_F_CANONICAL); uint8_t *buf; uint8_t *end; @@ -94,8 +95,7 @@ BIT_STRING_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, */ for(buf++; buf < end; buf++) { int v = *buf; - int nline = (flags & XER_F_CANONICAL) - ?0:((((buf - st->buf) - 1) % 16) == 0); + int nline = xcan?0:((((buf - st->buf) - 1) % 8) == 0); if(p >= scend || nline) { er.encoded += p - scratch; _ASN_CALLBACK(scratch, p - scratch); @@ -108,7 +108,8 @@ BIT_STRING_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, } er.encoded += p - scratch; - _ASN_CALLBACK(scratch, p - scratch); + if(!xcan && (((buf - st->buf) - 1) % 8) == 0) + _i_ASN_TEXT_INDENT(1, ilevel); if(buf < end + 1) { int v = *buf; @@ -120,6 +121,9 @@ BIT_STRING_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, _ASN_CALLBACK(scratch, p - scratch); } + if(!xcan && ((st->size - 1) % 8) == 0) + _i_ASN_TEXT_INDENT(1, ilevel - 1); + return er; } @@ -149,7 +153,8 @@ BIT_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, * Hexadecimal dump. */ for(buf++; buf < end; buf++) { - if(((buf - st->buf) - 1) % 16 == 0 && (st->size > 16)) { + if(((buf - st->buf) - 1) % 16 == 0 && (st->size > 17) + && buf != st->buf+1) { int i; /* Indentation */ if(cb("\n", 1, app_key)) return -1; @@ -162,9 +167,21 @@ BIT_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, *p++ = h2c[*buf & 0x0F]; *p++ = 0x20; } - if(p > scratch) p--; /* Eat the tailing space */ - /* Dump the incomplete 16-bytes row */ - return cb(scratch, p - scratch, app_key); + if(p > scratch) { + p--; /* Eat the tailing space */ + + if((st->size > 17)) { + int i; + if(cb("\n", 1, app_key)) return -1; + for(i = 0; i < ilevel; i++) cb(" ", 1, app_key); + } + + /* Dump the incomplete 16-bytes row */ + if(cb(scratch, p - scratch, app_key)) + return -1; + } + + return 0; } diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 4b7bd66ec..8906c6f81 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -34,6 +34,9 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { 0 /* No specifics */ }; +#undef _CH_PHASE +#undef NEXT_PHASE +#undef PREV_PHASE #define _CH_PHASE(ctx, inc) do { \ if(ctx->phase == 0) \ ctx->step = 0; \ @@ -42,6 +45,7 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { #define NEXT_PHASE(ctx) _CH_PHASE(ctx, +1) #define PREV_PHASE(ctx) _CH_PHASE(ctx, -1) +#undef ADVANCE #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ buf_ptr = ((char *)buf_ptr) + num; \ @@ -49,12 +53,14 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { consumed_myself += num; \ } while(0) +#undef RETURN #define RETURN(_code) do { \ rval.code = _code; \ rval.consumed = consumed_myself;\ return rval; \ } while(0) +#undef APPEND #define APPEND(bufptr, bufsize) do { \ size_t _bs = (bufsize); \ size_t _ns = ctx->step; /* Allocated */ \ @@ -161,8 +167,10 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, } type_type = (enum type_type_e)(int)td->specifics; /* An ugly hack */ - ASN_DEBUG("Decoding %s as %s (%ld)", - td->name, "OCTET STRING", (long)size); + ASN_DEBUG("Decoding %s as %s (frame %ld)", + td->name, + (type_type == _TT_GENERIC) ? "OCTET STRING" : "OS-SpecialCase", + (long)size); /* * Create the string if does not exist. @@ -188,8 +196,8 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, RETURN(rval.code); } - ASN_DEBUG("OS length is %d bytes, form %d", - (int)ctx->left, tlv_constr); + ASN_DEBUG("OS length is %d bytes, form %d (consumed %d==0)", + (int)ctx->left, tlv_constr, rval.consumed); if(tlv_constr) { /* @@ -198,18 +206,6 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, ctx->ptr = _new_stack(); if(ctx->ptr) { (void *)stck = ctx->ptr; -#if 0 - if(ctx->left < 0) { - stck->cur_ptr->want_nulls = -ctx->left; - stck->cur_ptr->left = -1; - } else { - stck->cur_ptr->want_nulls = 0; - stck->cur_ptr->left = ctx->left; - } - ASN_DEBUG("+EXPECT1 left=%d wn=%d", - stck->cur_ptr->left, - stck->cur_ptr->want_nulls); -#endif if(type_type == _TT_BIT_STRING) { /* Number of meaningless tail bits */ APPEND("\0", 1); @@ -555,6 +551,9 @@ OCTET_STRING_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, *p++ = h2c[(*buf >> 4) & 0x0F]; *p++ = h2c[*buf & 0x0F]; } + + _ASN_CALLBACK(scratch, p-scratch); /* Dump the rest */ + er.encoded += p - scratch; } else { for(i = 0; buf < end; buf++, i++) { if(!(i % 16) && (i || st->size > 16)) { @@ -567,12 +566,15 @@ OCTET_STRING_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, *p++ = h2c[*buf & 0x0F]; *p++ = 0x20; } - if(i) p--; /* Remove the tail space */ + if(p - scratch) { + p--; /* Remove the tail space */ + _ASN_CALLBACK(scratch, p-scratch); /* Dump the rest */ + er.encoded += p - scratch; + if(st->size > 16) + _i_ASN_TEXT_INDENT(1, ilevel-1); + } } - _ASN_CALLBACK(scratch, p-scratch); /* Dump the rest */ - er.encoded += p - scratch; - return er; } @@ -629,9 +631,14 @@ OCTET_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, *p++ = h2c[*buf & 0x0F]; *p++ = 0x20; } - if(i) p--; /* Remove the tail space */ - return cb(scratch, p - scratch, app_key); + if(p > scratch) { + p--; /* Remove the tail space */ + if(cb(scratch, p - scratch, app_key)) + return -1; + } + + return 0; } int diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c index cd4072835..5ef1bf44b 100644 --- a/skeletons/ber_decoder.c +++ b/skeletons/ber_decoder.c @@ -6,13 +6,16 @@ #include #include +#undef ADVANCE #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ ptr = ((char *)ptr) + num; \ size -= num; \ consumed_myself += num; \ } while(0) +#undef RETURN #define RETURN(_code) do { \ + fprintf(stderr, "-----%d", __LINE__); \ ber_dec_rval_t rval; \ rval.code = _code; \ rval.consumed = consumed_myself; \ @@ -100,6 +103,7 @@ ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *ctx, case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); } + ADVANCE(tag_len + len_len); } else { assert(tagno < td->tags_count); /* At least one loop */ } diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index ac2bbd68f..41fbae3fb 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -30,6 +30,7 @@ * This macro "eats" the part of the buffer which is definitely "consumed", * i.e. was correctly converted into local representation or rightfully skipped. */ +#undef ADVANCE #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ ptr = ((char *)ptr) + num; \ @@ -42,6 +43,7 @@ /* * Switch to the next phase of parsing. */ +#undef NEXT_PHASE #define NEXT_PHASE(ctx) do { \ ctx->phase++; \ ctx->step = 0; \ @@ -50,6 +52,7 @@ /* * Return a standardized complex structure. */ +#undef RETURN #define RETURN(_code) do { \ rval.code = _code; \ rval.consumed = consumed_myself;\ @@ -616,9 +619,11 @@ CHOICE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, } /* Print member's name and stuff */ - if(cb(elm->name, strlen(elm->name), app_key) - || cb(": ", 2, app_key)) - return -1; + if(0) { + if(cb(elm->name, strlen(elm->name), app_key) + || cb(": ", 2, app_key)) + return -1; + } return elm->type->print_struct(elm->type, memb_ptr, ilevel, cb, app_key); diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 9057ac036..041f8c2d0 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -30,6 +30,7 @@ * This macro "eats" the part of the buffer which is definitely "consumed", * i.e. was correctly converted into local representation or rightfully skipped. */ +#undef ADVANCE #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ ptr = ((char *)ptr) + num; \ @@ -42,6 +43,8 @@ /* * Switch to the next phase of parsing. */ +#undef NEXT_PHASE +#undef PHASE_OUT #define NEXT_PHASE(ctx) do { \ ctx->phase++; \ ctx->step = 0; \ @@ -51,6 +54,7 @@ /* * Return a standardized complex structure. */ +#undef RETURN #define RETURN(_code) do { \ rval.code = _code; \ rval.consumed = consumed_myself;\ @@ -228,7 +232,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, */ tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); ASN_DEBUG("Current tag in %s SEQUENCE for element %d " - "(%s) is %s encoded in %d bytes, left %ld", + "(%s) is %s encoded in %d bytes, of frame %ld", td->name, edx, elements[edx].name, ber_tlv_tag_string(tlv_tag), (int)tag_len, (long)LEFT); switch(tag_len) { diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index 4c0c3b770..93da7828f 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -36,6 +36,7 @@ * This macro "eats" the part of the buffer which is definitely "consumed", * i.e. was correctly converted into local representation or rightfully skipped. */ +#undef ADVANCE #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ ptr = ((char *)ptr) + num; \ @@ -48,6 +49,7 @@ /* * Switch to the next phase of parsing. */ +#undef NEXT_PHASE #define NEXT_PHASE(ctx) do { \ ctx->phase++; \ ctx->step = 0; \ @@ -56,6 +58,7 @@ /* * Return a standardized complex structure. */ +#undef RETURN #define RETURN(_code) do { \ rval.code = _code; \ rval.consumed = consumed_myself;\ diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index 0a8ee2819..055676050 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -24,12 +24,13 @@ * if the V processor returns with "want more data" even if the buffer * contains way more data than the V processor have seen. */ -#define SIZE_VIOLATION (ctx->left != -1 && (size_t)ctx->left <= size) +#define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) /* * This macro "eats" the part of the buffer which is definitely "consumed", * i.e. was correctly converted into local representation or rightfully skipped. */ +#undef ADVANCE #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ ptr = ((char *)ptr) + num; \ @@ -42,6 +43,8 @@ /* * Switch to the next phase of parsing. */ +#undef NEXT_PHASE +#undef PHASE_OUT #define NEXT_PHASE(ctx) do { \ ctx->phase++; \ ctx->step = 0; \ @@ -51,6 +54,7 @@ /* * Return a standardized complex structure. */ +#undef RETURN #define RETURN(_code) do { \ rval.code = _code; \ rval.consumed = consumed_myself;\ diff --git a/skeletons/xer_encoder.c b/skeletons/xer_encoder.c index 51f8d1d5a..e4581aaaf 100644 --- a/skeletons/xer_encoder.c +++ b/skeletons/xer_encoder.c @@ -42,7 +42,19 @@ xer_encode(asn1_TYPE_descriptor_t *td, void *sptr, return er; } -static int _print2fp(const void *buffer, size_t size, void *app_key); +/* + * This is a helper function for xer_fprint, which directs all the incoming data + * into the provided file descriptor. + */ +static int +xer__print2fp(const void *buffer, size_t size, void *app_key) { + FILE *stream = (FILE *)app_key; + + if(fwrite(buffer, 1, size, stream) != size) + return -1; + + return 0; +} int xer_fprint(FILE *stream, asn1_TYPE_descriptor_t *td, void *sptr) { @@ -52,20 +64,9 @@ xer_fprint(FILE *stream, asn1_TYPE_descriptor_t *td, void *sptr) { if(!td || !sptr) return -1; - er = xer_encode(td, sptr, XER_F_BASIC, _print2fp, stream); + er = xer_encode(td, sptr, XER_F_BASIC, xer__print2fp, stream); if(er.encoded == -1) return -1; return fflush(stream); } - -static int -_print2fp(const void *buffer, size_t size, void *app_key) { - FILE *stream = (FILE *)app_key; - - if(fwrite(buffer, 1, size, stream) != size) - return -1; - - return 0; -} - From cb0b7fc1489ba9ed04145bd1ca84a03a80eec284 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 23 Sep 2004 22:14:58 +0000 Subject: [PATCH 0372/1469] typos git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@372 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/46-redefine-OK.asn1.-PR | 4 +- tests/50-constraint-OK.asn1.-P | 46 +++++++++++----------- tests/65-multi-tag-OK.asn1.-P | 14 +++---- tests/65-multi-tag-OK.asn1.-Pfnative-types | 14 +++---- tests/66-ref-simple-OK.asn1.-P | 2 +- 5 files changed, 40 insertions(+), 40 deletions(-) diff --git a/tests/46-redefine-OK.asn1.-PR b/tests/46-redefine-OK.asn1.-PR index f89085e1d..74632450e 100644 --- a/tests/46-redefine-OK.asn1.-PR +++ b/tests/46-redefine-OK.asn1.-PR @@ -32,7 +32,7 @@ PrimitiveType_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using OCTET_STRING, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void PrimitiveType_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -213,7 +213,7 @@ T_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using ConstructedType, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void T_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { diff --git a/tests/50-constraint-OK.asn1.-P b/tests/50-constraint-OK.asn1.-P index a03652fb3..197474f94 100644 --- a/tests/50-constraint-OK.asn1.-P +++ b/tests/50-constraint-OK.asn1.-P @@ -32,7 +32,7 @@ Int1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using INTEGER, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void Int1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -164,7 +164,7 @@ Int2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using Int1, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void Int2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -300,7 +300,7 @@ Int3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using Int2, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void Int3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -436,7 +436,7 @@ Int4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using Int3, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void Int4_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -572,7 +572,7 @@ Int5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using Int4, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void Int5_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -708,7 +708,7 @@ ExtensibleExtensions_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using INTEGER, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void ExtensibleExtensions_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -822,7 +822,7 @@ Str1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using IA5String, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void Str1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -970,7 +970,7 @@ Str2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using Str1, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void Str2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -1129,7 +1129,7 @@ Str3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using Str2, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void Str3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -1274,7 +1274,7 @@ Str4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using IA5String, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void Str4_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -1419,7 +1419,7 @@ PER_Visible_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using IA5String, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void PER_Visible_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -1564,7 +1564,7 @@ PER_Visible_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using PER_Visible, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void PER_Visible_2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -1709,7 +1709,7 @@ Not_PER_Visible_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using PER_Visible, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void Not_PER_Visible_1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -1854,7 +1854,7 @@ Not_PER_Visible_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using PER_Visible, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void Not_PER_Visible_2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -1999,7 +1999,7 @@ Not_PER_Visible_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using PER_Visible, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void Not_PER_Visible_3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -2147,7 +2147,7 @@ SIZE_but_not_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using PER_Visible, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void SIZE_but_not_FROM_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -2295,7 +2295,7 @@ SIZE_and_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using PER_Visible, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void SIZE_and_FROM_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -2440,7 +2440,7 @@ Neither_SIZE_nor_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using PER_Visible, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void Neither_SIZE_nor_FROM_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -2602,7 +2602,7 @@ Utf8_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using Utf8_2, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void Utf8_3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -2734,7 +2734,7 @@ Utf8_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using Utf8_1, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void Utf8_2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -2848,7 +2848,7 @@ Utf8_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using UTF8String, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void Utf8_1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -3008,7 +3008,7 @@ VisibleIdentifier_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using Identifier, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void VisibleIdentifier_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -3168,7 +3168,7 @@ Identifier_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using VisibleString, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void Identifier_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { diff --git a/tests/65-multi-tag-OK.asn1.-P b/tests/65-multi-tag-OK.asn1.-P index 3156ba757..111c27610 100644 --- a/tests/65-multi-tag-OK.asn1.-P +++ b/tests/65-multi-tag-OK.asn1.-P @@ -32,7 +32,7 @@ T1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using T2, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void T1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -157,7 +157,7 @@ T2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using T3, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void T2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -280,7 +280,7 @@ T3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using T4, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void T3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -401,7 +401,7 @@ T4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using T5, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void T4_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -517,7 +517,7 @@ T5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using T6, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void T5_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -632,7 +632,7 @@ T6_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using REAL, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void T6_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -746,7 +746,7 @@ T_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using Ts, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void T_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { diff --git a/tests/65-multi-tag-OK.asn1.-Pfnative-types b/tests/65-multi-tag-OK.asn1.-Pfnative-types index d26bfaf57..67bfa8d1e 100644 --- a/tests/65-multi-tag-OK.asn1.-Pfnative-types +++ b/tests/65-multi-tag-OK.asn1.-Pfnative-types @@ -32,7 +32,7 @@ T1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using T2, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void T1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -157,7 +157,7 @@ T2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using T3, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void T2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -280,7 +280,7 @@ T3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using T4, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void T3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -401,7 +401,7 @@ T4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using T5, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void T4_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -517,7 +517,7 @@ T5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using T6, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void T5_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -632,7 +632,7 @@ T6_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using NativeReal, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void T6_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { @@ -746,7 +746,7 @@ T_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using Ts, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void T_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { diff --git a/tests/66-ref-simple-OK.asn1.-P b/tests/66-ref-simple-OK.asn1.-P index 0ae62e3cb..b023ad4fd 100644 --- a/tests/66-ref-simple-OK.asn1.-P +++ b/tests/66-ref-simple-OK.asn1.-P @@ -102,7 +102,7 @@ SimpleType_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * This type is implemented using ENUMERATED, - * so adjust the DEF appropriately. + * so here we adjust the DEF accordingly. */ static void SimpleType_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { From 00cf36fc9944c22554e90262b10fd1e3e4514081 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 23 Sep 2004 22:18:25 +0000 Subject: [PATCH 0373/1469] use x509dump git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@373 59561ff5-6e30-0410-9f3c-9617f08c8826 --- FAQ | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/FAQ b/FAQ index c6a945917..0873a248e 100644 --- a/FAQ +++ b/FAQ @@ -30,9 +30,12 @@ A: However, the asn1c compiler is able to understand the newer PKIX1 ASN.1 specs, contained in RFC3280, which obsole RFC2459. - Try this one out: + Try this one out instead: + + cd ./examples/sample.source.PKIX1 + make + ./x509dump -h - ./asn1c/asn1c -P examples/rfc3280-*.asn1 -- Lev Walkin From 2ffc8bba0d1024aa4724b3b73f013f408f2fc7f9 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 23 Sep 2004 22:19:14 +0000 Subject: [PATCH 0374/1469] versatile Makefile creation git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@374 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_save.c | 52 ++++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c index 2db1c2ef8..00a4496ed 100644 --- a/libasn1compiler/asn1c_save.c +++ b/libasn1compiler/asn1c_save.c @@ -52,12 +52,22 @@ asn1c_save_compiled_output(arg_t *arg, const char *datadir) { TQ_FOR(arg->expr, &(arg->mod->members), next) { if(asn1_lang_map[arg->expr->meta_type] [arg->expr->expr_type].type_cb) { - fprintf(mkf, "\t\\\n\t%s.c %s.h", - arg->expr->Identifier, + fprintf(mkf, "\t\\\n\t%s.c", arg->expr->Identifier); } } } + fprintf(mkf, "\n\nASN_MODULE_HEADERS="); + TQ_FOR(arg->mod, &(arg->asn->modules), mod_next) { + TQ_FOR(arg->expr, &(arg->mod->members), next) { + if(asn1_lang_map[arg->expr->meta_type] + [arg->expr->expr_type].type_cb) { + fprintf(mkf, "\t\\\n\t%s.h", + arg->expr->Identifier); + } + } + } + fprintf(mkf, "\n\n"); /* * Move necessary skeleton files and add them to Makefile.am.sample. @@ -75,6 +85,7 @@ asn1c_save_compiled_output(arg_t *arg, const char *datadir) { for(i = 0; i < dlist->el_count; i++) { char *fname = dlist->elements[i]->filename; + char *dotH; assert(strlen(fname) < (sizeof(buf) / 2)); strcpy(dir_end, fname); @@ -83,15 +94,38 @@ asn1c_save_compiled_output(arg_t *arg, const char *datadir) { fprintf(mkf, ">>>ABORTED<<<"); fclose(mkf); return -1; + } + dotH = strrchr(fname, 'h'); + if(dotH && fnamemod->Identifier, arg->mod->source_file_name @@ -166,7 +201,8 @@ asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *deps) { fprintf(fp_h, "/*\n" " * Generated by asn1c-" VERSION " (http://lionet.info/asn1c)\n" - " * From ASN.1 module \"%s\" found in \"%s\"\n" + " * From ASN.1 module \"%s\"\n" + " * \tfound in \"%s\"\n" " */\n\n", arg->mod->Identifier, arg->mod->source_file_name From dcd32fe42414d0b96ca2ccf767a68598788357f9 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 23 Sep 2004 22:20:47 +0000 Subject: [PATCH 0375/1469] change of message git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@375 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 179161f03..01b32aa6e 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -830,7 +830,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("/*\n"); OUT(" * This type is implemented using %s,\n", asn1c_type_name(arg, expr, TNF_SAFE)); - OUT(" * so adjust the DEF appropriately.\n"); + OUT(" * so here we adjust the DEF accordingly.\n"); OUT(" */\n"); OUT("static void\n"); p = MKID(expr->Identifier); From 74ce239f626ddc820da81866f4dfb25546f4e7c8 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 23 Sep 2004 22:21:07 +0000 Subject: [PATCH 0376/1469] removed orthohonality git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@376 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/Makefile.in | 2 +- libasn1parser/asn1p_expr2uclass.h | 73 +++++++++++++++++++------------ libasn1parser/asn1p_expr_str.h | 2 +- libasn1parser/expr-h.pl | 2 +- 4 files changed, 47 insertions(+), 32 deletions(-) diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index ef80e29b5..1f29cf7d2 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -448,8 +448,8 @@ maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -rm -f asn1p_y.c - -rm -f asn1p_y.h -rm -f asn1p_l.c + -rm -f asn1p_y.h clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ diff --git a/libasn1parser/asn1p_expr2uclass.h b/libasn1parser/asn1p_expr2uclass.h index 8812a0be5..8bb4f6373 100644 --- a/libasn1parser/asn1p_expr2uclass.h +++ b/libasn1parser/asn1p_expr2uclass.h @@ -37,37 +37,52 @@ static int expr_type2uclass_value[ASN_EXPR_TYPE_MAX] [ ASN_STRING_BMPString ] = 30, }; -static char *expr_uclass2str[32] __attribute__ ((unused)) = { +static enum asn1p_expr_type expr_utag2type[32] __attribute__ ((unused)) = { [ 0 ] = 0, /* If zero length, end-of-content */ - [ 1 ] = "BOOLEAN", - [ 2 ] = "INTEGER", - [ 3 ] = "BIT STRING", - [ 4 ] = "OCTET STRING", - [ 5 ] = "NULL", - [ 6 ] = "OBJECT IDENTIFIER", - [ 7 ] = "ObjectDescriptor", - [ 8 ] = "EXTERNAL", - [ 9 ] = "REAL", - [ 10 ] = "ENUMERATED", - [ 11 ] = "EMBEDDED-PDV", - [ 12 ] = "UTF8String", - [ 13 ] = "RELATIVE-OID", + [ 1 ] = ASN_BASIC_BOOLEAN, + [ 2 ] = ASN_BASIC_INTEGER, + [ 3 ] = ASN_BASIC_BIT_STRING, + [ 4 ] = ASN_BASIC_OCTET_STRING, + [ 5 ] = ASN_BASIC_NULL, + [ 6 ] = ASN_BASIC_OBJECT_IDENTIFIER, + [ 7 ] = ASN_STRING_ObjectDescriptor, + [ 8 ] = ASN_BASIC_EXTERNAL, + [ 9 ] = ASN_BASIC_REAL, + [ 10 ] = ASN_BASIC_ENUMERATED, + [ 11 ] = ASN_BASIC_EMBEDDED_PDV, + [ 12 ] = ASN_STRING_UTF8String, + [ 13 ] = ASN_BASIC_RELATIVE_OID, [ 14 ] = 0, - [ 16 ] = "SEQUENCE", /* Or "SEQUENCE OF" */ - [ 17 ] = "SET", /* Or "SET OF" */ - [ 18 ] = "NumericString", /* " "|"0".."9" */ - [ 19 ] = "PrintableString", - [ 20 ] = "TeletexString", - [ 21 ] = "VideotexString", - [ 22 ] = "IA5String", - [ 23 ] = "UTCTime", - [ 24 ] = "GeneralizedTime", - [ 25 ] = "GraphicString", - [ 26 ] = "VisibleString", - [ 27 ] = "GeneralString", - [ 28 ] = "UniversalString", /* 32-bit UCS-4 */ - [ 29 ] = "CharacterString", - [ 30 ] = "BMPString", /* 16-bit UCS-2 */ + [ 15 ] = 0, + [ 16 ] = ASN_CONSTR_SEQUENCE, /* Or SEQUENCE OF */ + [ 17 ] = ASN_CONSTR_SET, /* Or SET OF */ + [ 18 ] = ASN_STRING_NumericString, /* " "|"0".."9" */ + [ 19 ] = ASN_STRING_PrintableString, + [ 20 ] = ASN_STRING_TeletexString, + [ 21 ] = ASN_STRING_VideotexString, + [ 22 ] = ASN_STRING_IA5String, + [ 23 ] = ASN_BASIC_UTCTime, + [ 24 ] = ASN_BASIC_GeneralizedTime, + [ 25 ] = ASN_STRING_GraphicString, + [ 26 ] = ASN_STRING_VisibleString, + [ 27 ] = ASN_STRING_GeneralString, + [ 28 ] = ASN_STRING_UniversalString, /* 32-bit UCS-4 */ + [ 29 ] = ASN_BASIC_CHARACTER_STRING, + [ 30 ] = ASN_STRING_BMPString, /* 16-bit UCS-2 */ }; +/* + * Convert the [UNIVERSAL value] into the internal type or a string. + */ +#define ASN_UNIVERSAL_TAG2TYPE(utag) \ + ( \ + (((int)(utag)) < 0 \ + || ((int)(utag)) >= (int)(sizeof(expr_utag2type) \ + / sizeof(expr_utag2type[0]))) \ + ? 0 \ + : expr_utag2type[(int)(utag)] \ + ) +#define ASN_UNIVERSAL_TAG2STR(utag) \ + ASN_EXPR_TYPE2STR(ASN_UNIVERSAL_TAG2TYPE(utag)) + #endif /* ASN1_PARSER_EXPR2UCLASS_H */ diff --git a/libasn1parser/asn1p_expr_str.h b/libasn1parser/asn1p_expr_str.h index 40ddeb608..d99f8350c 100644 --- a/libasn1parser/asn1p_expr_str.h +++ b/libasn1parser/asn1p_expr_str.h @@ -51,7 +51,7 @@ static char *asn1p_expr_type2str[] __attribute__ ((unused)) = { || ((size_t)(type)) >= sizeof(asn1p_expr_type2str) \ / sizeof(asn1p_expr_type2str[0])) \ ? (char *)0 \ - : asn1p_expr_type2str[(type)] \ + : asn1p_expr_type2str[(int)(type)] \ ) #endif /* ASN1_PARSER_EXPR_STR_H */ diff --git a/libasn1parser/expr-h.pl b/libasn1parser/expr-h.pl index 64f68921d..a66425a8e 100755 --- a/libasn1parser/expr-h.pl +++ b/libasn1parser/expr-h.pl @@ -42,7 +42,7 @@ || ((size_t)(type)) >= sizeof(asn1p_expr_type2str) \\ / sizeof(asn1p_expr_type2str[0])) \\ ? (char *)0 \\ - : asn1p_expr_type2str[(type)] \\ + : asn1p_expr_type2str[(int)(type)] \\ ) #endif /* ASN1_PARSER_EXPR_STR_H */ From 95d229315a7508d28371f844d58d4d4df2e9f97e Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 23 Sep 2004 22:21:38 +0000 Subject: [PATCH 0377/1469] manual page from the ASN.1 BER decoder git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@377 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/unber.1 | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 asn1c/unber.1 diff --git a/asn1c/unber.1 b/asn1c/unber.1 new file mode 100644 index 000000000..ec731a040 --- /dev/null +++ b/asn1c/unber.1 @@ -0,0 +1,22 @@ +.de Id +.. +.Id $Id" +.TH UNBER 1 "\*(Dt" "ASN.1 BER Decoder" "ASN.1 BER Decoder" +.SH NAME +unber \- ASN.1 BER Decoder +.SH SYNOPSIS +unber [\fB\-t\fR\fIdata-string\fR] [\fB-\fR] \fIinfile\fR... +.SH DESCRIPTION +unber takes the BER-encoded files and dumps their internal structure to stdout. +(The DER and CER formats are both subsets of the BER, and are also supported.) +A single dash represents the standard input. +.SH OPTIONS +.TP +\fB\-t\fR \fIdata-string\fR +Interpret the data-string as a sequence of hexadecimal values representing +the start of BER TLV encoding. Print the human readable explanation. +.SH SEE ALSO +.TP +\&\fIasn1c\fR\|(1) +.SH AUTHORS +Lev Walkin From 9ad4f8e082588ec0e9337593d78576ad674569d9 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 23 Sep 2004 22:21:56 +0000 Subject: [PATCH 0378/1469] unber, x509 and ANY type fixes git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@378 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ChangeLog b/ChangeLog index 475fb955d..68adf0eb2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,9 +2,12 @@ 0.9.6: 2004-Sep-22 * Implemented BASIC-XER encoding support (X.693). + * Implemented unber(1) for generic BER decoding. * Implemented CGI for online ASN.1 compilation (asn1c/webcgi). + * The X.509 decoder implemented (./examples/sample.source.PKIX1). * NamedType is now supported for SET OF/SEQUENCE OF type. * Added ASN1C_ENVIRONMENT_VERSION and get_asn1c_environment_version(). + * Fixed ANY type decoding (Severity: high, Secruity impact: low). 0.9.5: 2004-Sep-17 From bb274d0092c6ff0e347019efb1c4349d55f1db6d Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 23 Sep 2004 22:27:50 +0000 Subject: [PATCH 0379/1469] removed debugging git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@379 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ber_decoder.c | 1 - 1 file changed, 1 deletion(-) diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c index 5ef1bf44b..1632bb053 100644 --- a/skeletons/ber_decoder.c +++ b/skeletons/ber_decoder.c @@ -15,7 +15,6 @@ } while(0) #undef RETURN #define RETURN(_code) do { \ - fprintf(stderr, "-----%d", __LINE__); \ ber_dec_rval_t rval; \ rval.code = _code; \ rval.consumed = consumed_myself; \ From 3253ecca33fd1d252b9ac606446bc05191f9a623 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 23 Sep 2004 22:39:56 +0000 Subject: [PATCH 0380/1469] oops git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@380 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.PKIX1/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index 41638ee5f..1f7355e7a 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -326,7 +326,7 @@ libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) # This file may be used as an input for make(3) # Remove the lines below to convert it into a pure .am file TARGET = x509dump -CFLAGS += -I. -g -DHAVE_CONFIG_H +CFLAGS += -g -I. -DHAVE_CONFIG_H OBJS=${ASN_MODULE_SOURCES:.c=.o} $(TARGET).o all: $(TARGET) From 2b9f951fe51d479cf4d232b8e2259157f393f9f8 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 23 Sep 2004 22:40:26 +0000 Subject: [PATCH 0381/1469] oops git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@381 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.PKIX1/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index 1f7355e7a..d51f43907 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -326,7 +326,7 @@ libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) # This file may be used as an input for make(3) # Remove the lines below to convert it into a pure .am file TARGET = x509dump -CFLAGS += -g -I. -DHAVE_CONFIG_H +CFLAGS += -I. -DHAVE_CONFIG_H OBJS=${ASN_MODULE_SOURCES:.c=.o} $(TARGET).o all: $(TARGET) From 26759d736132a918d07e8ade5765140525769568 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 24 Sep 2004 20:54:08 +0000 Subject: [PATCH 0382/1469] added PRIdASN and PRIuASN git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@382 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1parser.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libasn1parser/asn1parser.h b/libasn1parser/asn1parser.h index b4c72f8b2..126057d66 100644 --- a/libasn1parser/asn1parser.h +++ b/libasn1parser/asn1parser.h @@ -30,6 +30,13 @@ * specified inside ASN.1 grammar. */ typedef intmax_t asn1_integer_t; +#ifdef PRIdMAX +#define PRIdASN PRIdMAX +#define PRIuASN PRIuMAX +#else +#define PRIdASN "lld" /* Or j? */ +#define PRIuASN "llu" /* Or j? */ +#endif #include #include /* Object identifiers (OIDs) */ From 31b5cdadd775b6806e0c37eddba1852baf4e3d15 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 24 Sep 2004 20:54:48 +0000 Subject: [PATCH 0383/1469] added file and line number information git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@383 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.PKIX1/config.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/sample.source.PKIX1/config.h b/examples/sample.source.PKIX1/config.h index e9a97e66b..63b2105e6 100644 --- a/examples/sample.source.PKIX1/config.h +++ b/examples/sample.source.PKIX1/config.h @@ -4,5 +4,6 @@ extern int opt_debug; #define ASN_DEBUG(fmt, args...) do { \ if(opt_debug < 2) break; \ fprintf(stderr, fmt, ##args); \ - fprintf(stderr, "\n"); \ + fprintf(stderr, " (%s:%d)\n", \ + __FILE__, __LINE__); \ } while(0) From ec618c652d5f1ffb6855daf939ea3991a4d6ffe0 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 24 Sep 2004 20:55:11 +0000 Subject: [PATCH 0384/1469] asn_application.h git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@384 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.PKIX1/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index d51f43907..87827a24d 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -300,8 +300,9 @@ ASN_MODULE_HEADERS+=constr_SET.h ASN_MODULE_SOURCES+=constr_SET.c ASN_MODULE_HEADERS+=constr_SET_OF.h ASN_MODULE_SOURCES+=constr_SET_OF.c -ASN_MODULE_HEADERS+=asn_types.h +ASN_MODULE_HEADERS+=asn_application.h ASN_MODULE_HEADERS+=asn_internal.h +ASN_MODULE_HEADERS+=asn_types.h ASN_MODULE_HEADERS+=OCTET_STRING.h ASN_MODULE_SOURCES+=OCTET_STRING.c ASN_MODULE_HEADERS+=ber_decoder.h From 68d43e974a6e94bd9cb61d022d6c5c97ad40a8f4 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 24 Sep 2004 20:56:07 +0000 Subject: [PATCH 0385/1469] doc updated with regards to XML stuff git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@385 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-usage.lyx | 210 ++++++++++++++++++++++++++++++++++---------- doc/asn1c-usage.pdf | Bin 69328 -> 71786 bytes 2 files changed, 162 insertions(+), 48 deletions(-) diff --git a/doc/asn1c-usage.lyx b/doc/asn1c-usage.lyx index dd0dbfb2e..03d8a9703 100644 --- a/doc/asn1c-usage.lyx +++ b/doc/asn1c-usage.lyx @@ -55,7 +55,7 @@ status Open \layout Standard \backslash -extramarks{$Revision$ -- describes asn1c-0.9.5}{} +extramarks{$Revision$ -- describes asn1c-0.9.6}{} \end_inset @@ -1315,7 +1315,7 @@ collapsed false \begin_inset Tabular - + @@ -1426,7 +1426,7 @@ Restrict the compiler to generate only the ASN.1 tables, omit- ting the usual \end_inset - + \begin_inset Text @@ -1448,30 +1448,6 @@ Use the specified directory with ASN.1 skeleton files. \end_inset - - -\begin_inset Text - -\layout Standard - --t -\emph on - -\end_inset - - -\begin_inset Text - -\layout Standard - - -\size small -Interpret the data-string as a sequence of hexadecimal values representing - the start of BER TLV encoding. - Print the human readable explanation. -\end_inset - - \begin_inset Text @@ -1923,16 +1899,6 @@ asn1_DEF_Rectangle There are several generic functions available: \layout Description -check_constraints Check that the contents of the target structure are semantical -ly valid and constrained to appropriate implicit or explicit subtype constraints. - Please refer to Section -\begin_inset LatexCommand \vref{sub:Validating-the-target} - -\end_inset - -. -\layout Description - ber_decoder This is the generic \emph on restartable @@ -1959,7 +1925,7 @@ BER decoder (Basic Encoding Rules). \layout Description der_encoder This is the generic DER encoder (Distinguished Encoding Rules). - This decoder will take the target structure and encode it into a series + This encoder will take the target structure and encode it into a series of bytes. Please refer to Section \begin_inset LatexCommand \ref{sub:Encoding-DER} @@ -1969,6 +1935,27 @@ der_encoder This is the generic DER encoder (Distinguished Encoding Rules). . \layout Description +xer_encoder This is the generic XER encoder (XML Encoding Rules). + This encoder will take the target structure and represent it as an XML + (text) document. + Please refer to Section +\begin_inset LatexCommand \ref{sub:Encoding-XER} + +\end_inset + +. +\layout Description + +check_constraints Check that the contents of the target structure are semantical +ly valid and constrained to appropriate implicit or explicit subtype constraints. + Please refer to Section +\begin_inset LatexCommand \vref{sub:Validating-the-target} + +\end_inset + +. +\layout Description + print_struct This function convert the contents of the passed target structure into human readable form. This form is not formal and cannot be converted back into the structure, @@ -1990,6 +1977,16 @@ free_struct This is a generic disposal which frees the target structure. . \layout Standard +check_constraints Check that the contents of the target structure are semantical +ly valid and constrained to appropriate implicit or explicit subtype constraints. + Please refer to Section +\begin_inset LatexCommand \vref{sub:Validating-the-target} + +\end_inset + +. +\layout Standard + Each of the above function takes the type descriptor ( \emph on asn1_DEF_\SpecialChar \ldots{} @@ -2232,8 +2229,13 @@ Please look into ber_decoder.h for the precise definition of ber_decode() Encoding DER \layout Standard -The Distinguished Encoding Rules is the variant of BER encoding rules which - is oriented on representing the structures with length known beforehand. +The Distinguished Encoding Rules is the +\emph on +canonical +\emph default + variant of BER encoding rules. + The DER is best suited to encode the structures where all the lengths are + known beforehand. This is probably exactly how you want to encode: either after a BER decoding or after a manual fill-up, the target structure contains the data which size is implicitly known before encoding. @@ -2308,21 +2310,21 @@ ssize_t simple_serializer(FILE *ostream, Rectangle_t *rect) { \layout LyX-Code - der_enc_rval_t rval; /* Return value */ + asn_enc_rval_t er; /* Encoder return value */ \layout LyX-Code \layout LyX-Code - rval = der_encode(&asn1_DEF_Rect, rect, + er = der_encode(&asn1_DEF_Rect, rect, \layout LyX-Code write_stream, ostream); \layout LyX-Code - if(rval + if(er. \series bold -.encoded +encoded \series default == -1) { \layout LyX-Code @@ -2330,7 +2332,7 @@ simple_serializer(FILE *ostream, Rectangle_t *rect) { /* \layout LyX-Code - * Failure to encode the rectangle data. + * Failed to encode the rectangle data. \layout LyX-Code */ @@ -2349,9 +2351,9 @@ n , \layout LyX-Code - rval + er. \series bold -.failed_type +failed_type \series default ->name, \layout LyX-Code @@ -2368,7 +2370,7 @@ n /* Return the number of bytes */ \layout LyX-Code - return rval.encoded; + return er.encoded; \layout LyX-Code } @@ -2413,6 +2415,99 @@ Please look into der_encoder.h for the precise definition of der_encode() \layout Subsection +\begin_inset LatexCommand \label{sub:Encoding-XER} + +\end_inset + +Encoding XER +\layout Standard + +The XER stands for XML Encoding Rules, where XML, in turn, is eXtensible + Markup Language, a text-based format for information exchange. + The encoder routine API comes in two flavors: stdio-based and callback-based. + With the callback-based encoder, the encoding process is very similar to + the DER one, described in Section +\begin_inset LatexCommand \vref{sub:Encoding-DER} + +\end_inset + +. + The following example uses the definition of write_stream() from up there. +\layout LyX-Code + +/* +\layout LyX-Code + + * This procedure generates the XML document +\layout LyX-Code + + * by invoking the XER encoder. +\layout LyX-Code + + * NOTE: Do not copy this code verbatim! +\layout LyX-Code + + * If the stdio output is necessary, +\layout LyX-Code + + * use the xer_fprint() procedure instead. +\layout LyX-Code + + * See Section +\begin_inset LatexCommand \vref{sub:Printing-the-target} + +\end_inset + +. +\layout LyX-Code + + */ +\layout LyX-Code + +int +\layout LyX-Code + +print_as_XML(FILE *ostream, Rectangle_t *rect) { +\layout LyX-Code + + asn_enc_rval_t er; /* Encoder return value */ +\layout LyX-Code + + +\layout LyX-Code + + er = xer_encode(&asn1_DEF_Rect, rect, +\layout LyX-Code + + XER_F_BASIC, /* BASIC-XER or CANONICAL-XER */ +\layout LyX-Code + + write_stream, ostream); +\layout LyX-Code + + +\layout LyX-Code + + return (er.encoded == -1) ? -1 : 0; +\layout LyX-Code + +} +\layout Standard + +Please look into xer_encoder.h for the precise definition of xer_encode() + and related types. +\layout Standard + +See Section +\begin_inset LatexCommand \ref{sub:Printing-the-target} + +\end_inset + + for the example of stdio-based XML encoder and other pretty-printing suggestion +s. +\layout Subsection + + \begin_inset LatexCommand \label{sub:Validating-the-target} \end_inset @@ -2461,6 +2556,25 @@ asn_fprint(stdout, &asn1_DEF_Rectangle, rect); Please look into constr_TYPE.h for the precise definition of asn_fprint() and related types. +\layout Standard + +Another practical alternative to this custom format printing would be to + invoke XER encoder. + The default BASIC-XER encoder performs reasonable formatting for the output + to be useful and human readable. + To invoke the XER decoder in a manner similar to asn_fprint(), use the + xer_fprint() call: +\layout LyX-Code + +xer_fprint(stdout, &asn1_DEF_Rectangle, rect); +\layout Standard + +See Section +\begin_inset LatexCommand \vref{sub:Encoding-XER} + +\end_inset + + for XML-related details. \layout Subsection diff --git a/doc/asn1c-usage.pdf b/doc/asn1c-usage.pdf index 6a22d2257378abf3242a639766fdaf6316be9420..85b31086e99cf86090f3339037dcab633d01f492 100644 GIT binary patch delta 25845 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’p?*$kAM|gIq!%yDp0u8aBQ)rpyyF& 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 delta 23770 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 From 1827a1c9973bc87cae1b8d9ff0265fd62c474d54 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 24 Sep 2004 20:56:25 +0000 Subject: [PATCH 0386/1469] pretty-printing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@386 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/BIT_STRING.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index c3788d834..274dec9bb 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -107,11 +107,13 @@ BIT_STRING_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, p += 8; } - er.encoded += p - scratch; if(!xcan && (((buf - st->buf) - 1) % 8) == 0) _i_ASN_TEXT_INDENT(1, ilevel); + er.encoded += p - scratch; + _ASN_CALLBACK(scratch, p - scratch); + p = scratch; - if(buf < end + 1) { + if(buf == end) { int v = *buf; int mbit = st->buf[0]; /* bits to skip from the right */ int i; @@ -121,8 +123,7 @@ BIT_STRING_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, _ASN_CALLBACK(scratch, p - scratch); } - if(!xcan && ((st->size - 1) % 8) == 0) - _i_ASN_TEXT_INDENT(1, ilevel - 1); + if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); return er; } From b33ed6887896134e7a8a3fd9f1ef455c63f2f067 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 24 Sep 2004 20:57:41 +0000 Subject: [PATCH 0387/1469] managing nested expectations better git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@387 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OCTET_STRING.c | 77 +++++++++++++++++++++++++++------------- 1 file changed, 53 insertions(+), 24 deletions(-) diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 8906c6f81..df6f86e82 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -47,7 +47,7 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { #undef ADVANCE #define ADVANCE(num_bytes) do { \ - size_t num = num_bytes; \ + size_t num = (num_bytes); \ buf_ptr = ((char *)buf_ptr) + num; \ size -= num; \ consumed_myself += num; \ @@ -93,7 +93,8 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { * No, I am not going to explain what the following stuff is. */ struct _stack_el { - ber_tlv_len_t left; /* What's left to read */ + ber_tlv_len_t left; /* What's left to read (or -1) */ + ber_tlv_len_t frame; /* What was planned to read (or -1) */ int cont_level; /* Depth of subcontainment */ int want_nulls; /* Want null "end of content" octets? */ int bits_chopped; /* Flag in BIT STRING mode */ @@ -106,7 +107,7 @@ struct _stack { }; static struct _stack_el * -_add_stack_el(struct _stack *st) { +OS__add_stack_el(struct _stack *st) { struct _stack_el *nel; /* @@ -114,8 +115,6 @@ _add_stack_el(struct _stack *st) { */ if(st->cur_ptr && st->cur_ptr->next) { nel = st->cur_ptr->next; - nel->left = 0; - nel->want_nulls = 0; nel->bits_chopped = 0; /* Retain nel->cont_level, it's correct. */ } else { @@ -196,9 +195,6 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, RETURN(rval.code); } - ASN_DEBUG("OS length is %d bytes, form %d (consumed %d==0)", - (int)ctx->left, tlv_constr, rval.consumed); - if(tlv_constr) { /* * Complex operation, requires stack of expectations. @@ -238,11 +234,14 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, ber_tlv_len_t tlv_len; ber_tlv_tag_t expected_tag; ssize_t tl, ll; + ssize_t Left = ((!sel||sel->left==-1||sel->left >= size) + ?size:sel->left); + - ASN_DEBUG("fetch tag(size=%d), %sstack, left=%d, want0=%d", - (int)size, sel?"":"!", + ASN_DEBUG("fetch tag(size=%d,L=%d), %sstack, left=%d, want0=%d", + (int)size, Left, sel?"":"!", sel?sel->left:0, sel?sel->want_nulls:0); - tl = ber_fetch_tag(buf_ptr, size, &tlv_tag); + tl = ber_fetch_tag(buf_ptr, Left, &tlv_tag); switch(tl) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); @@ -251,10 +250,10 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, tlv_constr = BER_TLV_CONSTRUCTED(buf_ptr); ll = ber_fetch_length(tlv_constr, - (char *)buf_ptr + tl, size - tl, &tlv_len); + (char *)buf_ptr + tl, Left - tl, &tlv_len); ASN_DEBUG("Got tag=%s, tc=%d, size=%d, tl=%d, len=%d, ll=%d, {%d, %d}", ber_tlv_tag_string(tlv_tag), tlv_constr, - (int)size, tl, tlv_len, ll, + (int)Left, tl, tlv_len, ll, ((uint8_t *)buf_ptr)[0], ((uint8_t *)buf_ptr)[1]); switch(ll) { @@ -332,15 +331,28 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, RETURN(RC_FAIL); } + /* + * Consult with the old expectation. + * Check that it knows what we are doing here, and how much. + */ + if(sel && sel->left != -1) { + if(sel->left < (tl + ll)) + RETURN(RC_FAIL); + sel->left -= (tl + ll); + if(sel->left < tlv_len) + RETURN(RC_FAIL); + } + + /* * Append a new expectation. */ - sel = _add_stack_el(stck); + sel = OS__add_stack_el(stck); if(sel) { sel->want_nulls = (tlv_len==-1); - sel->left = tlv_len; - ASN_DEBUG("+EXPECT2 left=%d wn=%d, clvl=%d", - sel->left, sel->want_nulls, sel->cont_level); + sel->frame = sel->left = tlv_len; + ASN_DEBUG("+EXPECT2 frame=%d wn=%d, clvl=%d", + sel->frame, sel->want_nulls, sel->cont_level); } else { RETURN(RC_FAIL); } @@ -388,14 +400,30 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, sel->left -= len; } - if(sel->left) { + if(sel->left) RETURN(RC_WMORE); - } else { - sel->left = 0; - if(sel->prev) + + while(sel->left == 0) { + ASN_DEBUG("sel %p, l=%d, f=%d, %p->l=%d p->f=%d\n", + sel, sel->left, sel->frame, + sel->prev, + sel->prev?sel->prev->left:0, + sel->prev?sel->prev->frame:0 + ); + if(sel->prev) { + if(sel->prev->left != -1) { + if(sel->prev->left < sel->frame) + RETURN(RC_FAIL); + sel->prev->left -= sel->frame; + } sel = stck->cur_ptr = sel->prev; - PREV_PHASE(ctx); - goto phase1; + if(sel->left) { + PREV_PHASE(ctx); + goto phase1; + } + } else { + break; + } } } break; @@ -428,7 +456,8 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, } ASN_DEBUG("Took %d bytes to encode %s: [%s]:%d", - consumed_myself, td->name, st->buf, st->size); + consumed_myself, td->name, + (type_type == _TT_GENERIC) ? (char *)st->buf : "", st->size); rval.code = RC_OK; rval.consumed = consumed_myself; From 22dcbd116c48fa7a7bf1056ba8f692bc231e87e9 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 24 Sep 2004 20:57:56 +0000 Subject: [PATCH 0388/1469] added line and file name information git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@388 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_internal.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/skeletons/asn_internal.h b/skeletons/asn_internal.h index 6a44cab5b..f50b7a1de 100644 --- a/skeletons/asn_internal.h +++ b/skeletons/asn_internal.h @@ -11,8 +11,7 @@ #define ASN1C_ENVIRONMENT_VERSION 96 /* Compile-time version */ int get_asn1c_environment_version(void); /* Run-time version */ -#include -#include +#include /* Application-visible API */ #define CALLOC(nmemb, size) calloc(nmemb, size) #define MALLOC(size) malloc(size) @@ -28,7 +27,8 @@ int get_asn1c_environment_version(void); /* Run-time version */ #ifdef __GNUC__ #define ASN_DEBUG(fmt, args...) do { \ fprintf(stderr, fmt, ##args); \ - fprintf(stderr, "\n"); \ + fprintf(stderr, " (%s:%d)\n", \ + __FILE__, __LINE__); \ } while(0) #else /* !__GNUC__ */ extern void ASN_DEBUG_f(const char *fmt, ...); From e3a3156505e853804d3eba90e66979fc74936256 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 24 Sep 2004 20:58:37 +0000 Subject: [PATCH 0389/1469] dedicated asn_application.h header git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@389 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_application.h | 25 +++++++++++++++++++++++++ skeletons/asn_types.h | 10 ---------- 2 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 skeletons/asn_application.h diff --git a/skeletons/asn_application.h b/skeletons/asn_application.h new file mode 100644 index 000000000..14fe3a931 --- /dev/null +++ b/skeletons/asn_application.h @@ -0,0 +1,25 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * Application-level ASN.1 API. + */ +#ifndef _ASN_APPLICATION_H_ +#define _ASN_APPLICATION_H_ + +#include /* for platform-dependent types */ + +/* + * Generic type of an application-defined callback to return various + * types of data to the application. + * EXPECTED RETURN VALUES: + * -1: Failed to consume bytes. Abort the mission. + * Non-negative return values indicate success, and ignored. + */ +typedef int (asn_app_consume_bytes_f)(const void *buffer, size_t size, + void *application_specific_key); + +#include /* for asn1_TYPE_descriptor_t */ + +#endif /* _ASN_APPLICATION_H_ */ diff --git a/skeletons/asn_types.h b/skeletons/asn_types.h index 80ab061e8..81a00c348 100644 --- a/skeletons/asn_types.h +++ b/skeletons/asn_types.h @@ -52,14 +52,4 @@ #endif /* __GNUC__ */ #endif /* MIN */ -/* - * Generic type of an application-defined callback to return various - * types of data to the application. - * EXPECTED RETURN VALUES: - * -1: Failed to consume bytes. Abort the mission. - * Other return values indicate success, and ignored. - */ -typedef int (asn_app_consume_bytes_f)(const void *buffer, size_t size, - void *application_specific_key); - #endif /* _ASN_TYPES_H_ */ From 63dd5a1b477fa070d52e0fe7089a613d0714606c Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 24 Sep 2004 20:58:47 +0000 Subject: [PATCH 0390/1469] context is now optional git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@390 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/BOOLEAN.c | 4 +--- skeletons/INTEGER.c | 4 +--- skeletons/NativeInteger.c | 4 +--- skeletons/NativeReal.c | 4 +--- skeletons/ber_decoder.c | 49 ++++++++++++++++++++++++--------------- 5 files changed, 34 insertions(+), 31 deletions(-) diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c index 9609a19ef..c7a1cac2b 100644 --- a/skeletons/BOOLEAN.c +++ b/skeletons/BOOLEAN.c @@ -39,7 +39,6 @@ BOOLEAN_decode_ber(asn1_TYPE_descriptor_t *td, int tag_mode) { BOOLEAN_t *st = (BOOLEAN_t *)*bool_value; ber_dec_rval_t rval; - ber_dec_ctx_t ctx = { 0, 0, 0, 0 }; ber_tlv_len_t length; ber_tlv_len_t lidx; @@ -58,8 +57,7 @@ BOOLEAN_decode_ber(asn1_TYPE_descriptor_t *td, /* * Check tags. */ - rval = ber_check_tags(td, &ctx, - buf_ptr, size, tag_mode, &length, 0); + rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, &length, 0); if(rval.code != RC_OK) return rval; diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 75782a689..73b5959c5 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -40,7 +40,6 @@ INTEGER_decode_ber(asn1_TYPE_descriptor_t *td, void **int_structure, void *buf_ptr, size_t size, int tag_mode) { INTEGER_t *st = (INTEGER_t *)*int_structure; ber_dec_rval_t rval; - ber_dec_ctx_t ctx = { 0, 0, 0, 0 }; ber_tlv_len_t length; /* @@ -61,8 +60,7 @@ INTEGER_decode_ber(asn1_TYPE_descriptor_t *td, /* * Check tags. */ - rval = ber_check_tags(td, &ctx, - buf_ptr, size, tag_mode, &length, 0); + rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, &length, 0); if(rval.code != RC_OK) return rval; diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index b0872a2ea..aac5f86b3 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -47,7 +47,6 @@ NativeInteger_decode_ber(asn1_TYPE_descriptor_t *td, void **int_ptr, void *buf_ptr, size_t size, int tag_mode) { int *Int = (int *)*int_ptr; ber_dec_rval_t rval; - ber_dec_ctx_t ctx = { 0, 0, 0, 0 }; ber_tlv_len_t length; /* @@ -68,8 +67,7 @@ NativeInteger_decode_ber(asn1_TYPE_descriptor_t *td, /* * Check tags. */ - rval = ber_check_tags(td, &ctx, - buf_ptr, size, tag_mode, &length, 0); + rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, &length, 0); if(rval.code != RC_OK) return rval; diff --git a/skeletons/NativeReal.c b/skeletons/NativeReal.c index 1566a7fb3..1151087fa 100644 --- a/skeletons/NativeReal.c +++ b/skeletons/NativeReal.c @@ -48,7 +48,6 @@ NativeReal_decode_ber(asn1_TYPE_descriptor_t *td, void **dbl_ptr, void *buf_ptr, size_t size, int tag_mode) { double *Dbl = (double *)*dbl_ptr; ber_dec_rval_t rval; - ber_dec_ctx_t ctx = { 0, 0, 0, 0 }; ber_tlv_len_t length; /* @@ -69,8 +68,7 @@ NativeReal_decode_ber(asn1_TYPE_descriptor_t *td, /* * Check tags. */ - rval = ber_check_tags(td, &ctx, - buf_ptr, size, tag_mode, &length, 0); + rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, &length, 0); if(rval.code != RC_OK) return rval; diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c index 1632bb053..3672b6867 100644 --- a/skeletons/ber_decoder.c +++ b/skeletons/ber_decoder.c @@ -3,22 +3,25 @@ * Redistribution and modifications are permitted subject to BSD license. */ #include -#include #include #undef ADVANCE -#define ADVANCE(num_bytes) do { \ - size_t num = num_bytes; \ - ptr = ((char *)ptr) + num; \ - size -= num; \ - consumed_myself += num; \ +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr = ((char *)ptr) + num; \ + size -= num; \ + consumed_myself += num; \ } while(0) #undef RETURN -#define RETURN(_code) do { \ - ber_dec_rval_t rval; \ - rval.code = _code; \ - rval.consumed = consumed_myself; \ - return rval; \ +#define RETURN(_code) do { \ + ber_dec_rval_t rval; \ + rval.code = _code; \ + if(opt_ctx) opt_ctx->step = step; /* Save context */ \ + if(_code == RC_OK || opt_ctx) \ + rval.consumed = consumed_myself; \ + else \ + rval.consumed = 0; /* Context-free */ \ + return rval; \ } while(0) /* @@ -42,7 +45,7 @@ ber_decode(asn1_TYPE_descriptor_t *type_descriptor, * Check the set of >> tags matches the definition. */ ber_dec_rval_t -ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *ctx, +ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *opt_ctx, void *ptr, size_t size, int tag_mode, ber_tlv_len_t *last_length, int *opt_tlv_form) { ssize_t consumed_myself = 0; @@ -53,6 +56,7 @@ ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *ctx, ber_tlv_len_t limit_len = -1; int expect_00_terminators = 0; int tlv_constr = -1; /* If CHOICE, opt_tlv_form is not given */ + int step = opt_ctx ? opt_ctx->step : 0; /* Where we left previously */ int tagno; /* @@ -77,11 +81,11 @@ ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *ctx, * it appropriately. */ - tagno = ctx->step /* Continuing where left previously */ + tagno = step /* Continuing where left previously */ + (tag_mode==1?-1:0) ; ASN_DEBUG("ber_check_tags(%s, size=%ld, tm=%d, step=%d, tagno=%d)", - td->name, (long)size, tag_mode, ctx->step, tagno); + td->name, (long)size, tag_mode, step, tagno); //assert(td->tags_count >= 1); ?May not be the case for CHOICE or ANY. if(tag_mode == 0 && tagno == td->tags_count) { @@ -102,23 +106,25 @@ ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *ctx, case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); } + ASN_DEBUG("Advancing %ld in ANY case", + (long)(tag_len + len_len)); ADVANCE(tag_len + len_len); } else { assert(tagno < td->tags_count); /* At least one loop */ } - for((void)tagno; tagno < td->tags_count; tagno++, ctx->step++) { + for((void)tagno; tagno < td->tags_count; tagno++, step++) { /* * Fetch and process T from TLV. */ tag_len = ber_fetch_tag(ptr, size, &tlv_tag); ASN_DEBUG("Fetching tag from {%p,%ld} %02X..%02X: " - "len %ld, tag %s", + "len %ld, step %d, tag %s", ptr, (long)size, size?*(uint8_t *)ptr:0, ((size_t)tag_len0) ?*((uint8_t *)ptr + tag_len):0, - (long)tag_len, + (long)tag_len, step, ber_tlv_tag_string(tlv_tag)); switch(tag_len) { case -1: RETURN(RC_FAIL); @@ -131,7 +137,7 @@ ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *ctx, * If {I}, don't check anything. * If {I,B,C}, check B and C unless we're at I. */ - if(tag_mode != 0 && ctx->step == 0) { + if(tag_mode != 0 && step == 0) { /* * We don't expect tag to match here. * It's just because we don't know how the tag @@ -158,11 +164,15 @@ ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *ctx, */ if(tagno < (td->tags_count - 1)) { if(tlv_constr == 0) { + ASN_DEBUG("tlv_constr = %d, expfail", + tlv_constr); RETURN(RC_FAIL); } } else { if(td->last_tag_form != tlv_constr && td->last_tag_form != -1) { + ASN_DEBUG("last_tag_form %d != %d", + td->last_tag_form, tlv_constr); RETURN(RC_FAIL); } } @@ -172,6 +182,7 @@ ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *ctx, */ len_len = ber_fetch_length(tlv_constr, (char *)ptr + tag_len, size - tag_len, &tlv_len); + ASN_DEBUG("Fetchinig len = %ld", (long)len_len); switch(len_len) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); @@ -227,7 +238,7 @@ ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *ctx, if((ssize_t)size > limit_len) { /* * Make sure that we won't consume more bytes - * from the large buffer than the inferred limit. + * from the parent frame than the inferred limit. */ size = limit_len; } From 3326d45c8cf09b750a329d43048d0c7184279ade Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 24 Sep 2004 20:59:13 +0000 Subject: [PATCH 0391/1469] size_t instead of confusing ssize_t git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@391 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ber_tlv_length.c | 3 +-- skeletons/ber_tlv_length.h | 4 ++-- skeletons/ber_tlv_tag.c | 3 +-- skeletons/ber_tlv_tag.h | 4 ++-- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/skeletons/ber_tlv_length.c b/skeletons/ber_tlv_length.c index 7daaaef68..bde022a2f 100644 --- a/skeletons/ber_tlv_length.c +++ b/skeletons/ber_tlv_length.c @@ -3,7 +3,6 @@ * Redistribution and modifications are permitted subject to BSD license. */ #include -#include #include #include @@ -117,7 +116,7 @@ ber_skip_length(int _is_constructed, void *ptr, size_t size) { /* UNREACHABLE */ } -ssize_t +size_t der_tlv_length_serialize(ber_tlv_len_t len, void *bufp, size_t size) { size_t required_size; /* Size of len encoding */ uint8_t *buf = (uint8_t *)bufp; diff --git a/skeletons/ber_tlv_length.h b/skeletons/ber_tlv_length.h index 7e5d5f8aa..5222bbf48 100644 --- a/skeletons/ber_tlv_length.h +++ b/skeletons/ber_tlv_length.h @@ -31,10 +31,10 @@ ssize_t ber_skip_length(int _is_constructed, void *bufptr, size_t size); /* * This function serializes the length (L from TLV) in DER format. - * It always return number of bytes necessary to represent the length, + * It always returns number of bytes necessary to represent the length, * it is a caller's responsibility to check the return value * against the supplied buffer's size. */ -ssize_t der_tlv_length_serialize(ber_tlv_len_t len, void *bufptr, size_t size); +size_t der_tlv_length_serialize(ber_tlv_len_t len, void *bufptr, size_t size); #endif /* _BER_TLV_LENGTH_H_ */ diff --git a/skeletons/ber_tlv_tag.c b/skeletons/ber_tlv_tag.c index d66b78835..43a2d1ad7 100644 --- a/skeletons/ber_tlv_tag.c +++ b/skeletons/ber_tlv_tag.c @@ -3,7 +3,6 @@ * Redistribution and modifications are permitted subject to BSD license. */ #include -#include #include #include @@ -100,7 +99,7 @@ ber_tlv_tag_string(ber_tlv_tag_t tag) { } -ssize_t +size_t ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { int tclass = BER_TAG_CLASS(tag); ber_tlv_tag_t tval = BER_TAG_VALUE(tag); diff --git a/skeletons/ber_tlv_tag.h b/skeletons/ber_tlv_tag.h index 22152ffdc..c02a6862d 100644 --- a/skeletons/ber_tlv_tag.h +++ b/skeletons/ber_tlv_tag.h @@ -43,10 +43,10 @@ ssize_t ber_fetch_tag(void *bufptr, size_t size, ber_tlv_tag_t *tag_r); /* * This function serializes the tag (T from TLV) in BER format. - * It always return number of bytes necessary to represent the tag, + * It always returns number of bytes necessary to represent the tag, * it is a caller's responsibility to check the return value * against the supplied buffer's size. */ -ssize_t ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufptr, size_t size); +size_t ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufptr, size_t size); #endif /* _BER_TLV_TAG_H_ */ From eca9d62db8e14aea652e63c6bb7d08f457da8aba Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 24 Sep 2004 20:59:27 +0000 Subject: [PATCH 0392/1469] logging git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@392 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SEQUENCE.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 041f8c2d0..f12961333 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -402,9 +402,9 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, memb_ptr2, ptr, LEFT, elements[edx].tag_mode); ASN_DEBUG("In %s SEQUENCE decoded %d %s of %d " - "in %d bytes rval.code %d", + "in %d bytes rval.code %d, size=%d", td->name, edx, elements[edx].type->name, - (int)LEFT, (int)rval.consumed, rval.code); + (int)LEFT, (int)rval.consumed, rval.code, (int)size); switch(rval.code) { case RC_OK: break; @@ -413,6 +413,8 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, ADVANCE(rval.consumed); RETURN(RC_WMORE); } + ASN_DEBUG("Size violation (c->l=%ld <= s=%ld)", + (long)ctx->left, (long)size); /* Fall through */ case RC_FAIL: /* Fatal error */ RETURN(RC_FAIL); From eda244a4295c8fbf468bed53afdd588409884103 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 24 Sep 2004 21:00:15 +0000 Subject: [PATCH 0393/1469] unber and enber git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@393 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/Makefile.am | 6 +- asn1c/Makefile.in | 22 ++- asn1c/asn1c.1 | 5 +- asn1c/asn1c.c | 27 ++++ asn1c/enber.1 | 29 ++++ asn1c/enber.c | 381 ++++++++++++++++++++++++++++++++++++++++++++++ asn1c/unber.1 | 85 ++++++++++- asn1c/unber.c | 286 ++++++++++++++++++++++++++++------ 8 files changed, 778 insertions(+), 63 deletions(-) create mode 100644 asn1c/enber.1 create mode 100644 asn1c/enber.c diff --git a/asn1c/Makefile.am b/asn1c/Makefile.am index a5caec37e..142226671 100644 --- a/asn1c/Makefile.am +++ b/asn1c/Makefile.am @@ -1,5 +1,5 @@ -SUBDIRS = . tests webcgi +SUBDIRS = . webcgi tests AM_CFLAGS = @ADD_CFLAGS@ AM_CPPFLAGS = \ @@ -16,9 +16,9 @@ asn1c_LDADD = \ $(top_builddir)/libasn1fix/libasn1fix.la \ $(top_builddir)/libasn1compiler/libasn1compiler.la -bin_PROGRAMS = asn1c unber +bin_PROGRAMS = asn1c unber enber -dist_man1_MANS = asn1c.1 unber.1 +dist_man1_MANS = asn1c.1 unber.1 enber.1 check_SCRIPTS = check-parsing.sh TESTS = check-parsing.sh diff --git a/asn1c/Makefile.in b/asn1c/Makefile.in index 73c25f358..dd6652aa6 100644 --- a/asn1c/Makefile.in +++ b/asn1c/Makefile.in @@ -14,7 +14,7 @@ @SET_MAKE@ -SOURCES = asn1c.c unber.c +SOURCES = asn1c.c enber.c unber.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ @@ -37,7 +37,7 @@ NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_triplet = @host@ -bin_PROGRAMS = asn1c$(EXEEXT) unber$(EXEEXT) +bin_PROGRAMS = asn1c$(EXEEXT) unber$(EXEEXT) enber$(EXEEXT) subdir = asn1c DIST_COMMON = README $(dist_man1_MANS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in @@ -57,13 +57,17 @@ asn1c_DEPENDENCIES = $(top_builddir)/libasn1parser/libasn1parser.la \ $(top_builddir)/libasn1print/libasn1print.la \ $(top_builddir)/libasn1fix/libasn1fix.la \ $(top_builddir)/libasn1compiler/libasn1compiler.la +enber_SOURCES = enber.c +enber_OBJECTS = enber.$(OBJEXT) +enber_LDADD = $(LDADD) unber_SOURCES = unber.c unber_OBJECTS = unber.$(OBJEXT) unber_LDADD = $(LDADD) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles -@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/asn1c.Po ./$(DEPDIR)/unber.Po +@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/asn1c.Po ./$(DEPDIR)/enber.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/unber.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ @@ -72,8 +76,8 @@ LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ CCLD = $(CC) LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = asn1c.c unber.c -DIST_SOURCES = asn1c.c unber.c +SOURCES = asn1c.c enber.c unber.c +DIST_SOURCES = asn1c.c enber.c unber.c RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ @@ -196,7 +200,7 @@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ -SUBDIRS = . tests webcgi +SUBDIRS = . webcgi tests AM_CFLAGS = @ADD_CFLAGS@ AM_CPPFLAGS = \ -I${top_srcdir}/libasn1compiler \ @@ -212,7 +216,7 @@ asn1c_LDADD = \ $(top_builddir)/libasn1fix/libasn1fix.la \ $(top_builddir)/libasn1compiler/libasn1compiler.la -dist_man1_MANS = asn1c.1 unber.1 +dist_man1_MANS = asn1c.1 unber.1 enber.1 check_SCRIPTS = check-parsing.sh TESTS = check-parsing.sh EXTRA_DIST = check-parsing.sh @@ -281,6 +285,9 @@ clean-binPROGRAMS: asn1c$(EXEEXT): $(asn1c_OBJECTS) $(asn1c_DEPENDENCIES) @rm -f asn1c$(EXEEXT) $(LINK) $(asn1c_LDFLAGS) $(asn1c_OBJECTS) $(asn1c_LDADD) $(LIBS) +enber$(EXEEXT): $(enber_OBJECTS) $(enber_DEPENDENCIES) + @rm -f enber$(EXEEXT) + $(LINK) $(enber_LDFLAGS) $(enber_OBJECTS) $(enber_LDADD) $(LIBS) unber$(EXEEXT): $(unber_OBJECTS) $(unber_DEPENDENCIES) @rm -f unber$(EXEEXT) $(LINK) $(unber_LDFLAGS) $(unber_OBJECTS) $(unber_LDADD) $(LIBS) @@ -292,6 +299,7 @@ distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1c.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/enber.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unber.Po@am__quote@ .c.o: diff --git a/asn1c/asn1c.1 b/asn1c/asn1c.1 index d6be94582..359724b21 100644 --- a/asn1c/asn1c.1 +++ b/asn1c/asn1c.1 @@ -1,6 +1,3 @@ -.de Id -.. -.Id $Id" .TH ASN1C 1 "\*(Dt" "ASN.1 Compiler" "ASN.1 Compiler" .SH NAME asn1c \- ASN.1 Compiler @@ -100,6 +97,6 @@ its internal understanding of subtype constraints. Generate "-- #line" comments in \fB-E\fR output. .SH SEE ALSO .TP -\&\fIunber\fR\|(1) +\&\fIunber\fR\|(1), \&\fIenber\fR\|(1) .SH AUTHORS Lev Walkin diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index e3097bd52..8c3a7e582 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -1,3 +1,30 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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 AUTHOR 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 AUTHOR 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. + * + * $Id$ + */ /* * This is the program that connects the libasn1* libraries together. * It uses them in turn to parse, fix and then compile or print the ASN.1 tree. diff --git a/asn1c/enber.1 b/asn1c/enber.1 new file mode 100644 index 000000000..b3984336a --- /dev/null +++ b/asn1c/enber.1 @@ -0,0 +1,29 @@ +.de Vb +.sp +.ft CW +.nf +.. +.de Ve +.ft R +.fi +.sp +.. +.TH ENBER 1 "\*(Dt" "unber counterpart" "unber counterpart" +.SH NAME +enber \- Convert the unber XML output back into BER +.SH SYNOPSIS +enber [\fB-\fR] \fIinfile\fR... +.SH DESCRIPTION +enber takes the XML-encoded files produced by \fIunber\fR\|(1) and converts +them back into the BER format. +A single dash represents the standard input. +.SH EXAMPLES +Decode the BER sequence and immediately encode it back +.Vb +\& enber \fB-p\fR \fIfilename.ber\fR | unber \fB-\fR > \fIreconstructed.ber\fR +.Ve +.SH SEE ALSO +.TP +\&\fIunber\fR\|(1), \&\fIasn1c\fR\|(1) +.SH AUTHORS +Lev Walkin diff --git a/asn1c/enber.c b/asn1c/enber.c new file mode 100644 index 000000000..45fda4345 --- /dev/null +++ b/asn1c/enber.c @@ -0,0 +1,381 @@ +/*- + * Copyright (c) 2004 Lev Walkin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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 AUTHOR 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 AUTHOR 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. + * + * $Id$ + */ +#include +#include +#include +#include +#include +#include /* for EX_USAGE */ +#include +#include + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include /* For static string tables */ + +#include +#include +#include +#include + +static void usage(const char *av0); /* Print the Usage screen and exit */ +static int process(const char *fname); /* Perform the BER decoding */ +static int process_line(const char *fname, char *line, int lineno); + +#undef COPYRIGHT +#define COPYRIGHT \ + "Copyright (c) 2004 Lev Walkin \n" + +int +main(int ac, char **av) { + int ch; /* Command line character */ + int i; /* Index in some loops */ + + /* + * Process command-line options. + */ + while((ch = getopt(ac, av, "hv")) != -1) + switch(ch) { + case 'v': + fprintf(stderr, "ASN.1 BER Decoder, v" VERSION "\n" COPYRIGHT); + exit(0); + break; + case 'h': + default: + usage(av[0]); + } + + /* + * Ensure that there are some input files present. + */ + if(ac > optind) { + ac -= optind; + av += optind; + } else { + fprintf(stderr, "%s: No input files specified\n", av[0]); + exit(1); + } + + setvbuf(stdout, 0, _IOLBF, 0); + + /* + * Iterate over input files and parse each. + * All syntax trees from all files will be bundled together. + */ + for(i = 0; i < ac; i++) { + if(process(av[i])) + exit(EX_DATAERR); + } + + return 0; +} + +/* + * Print the usage screen and exit(EX_USAGE). + */ +static void +usage(const char *av0) { + fprintf(stderr, +"Convertor of under(1) output back into BER, v" VERSION "\n" COPYRIGHT +"Usage: %s [-] [file ...]\n" + , av0); + exit(EX_USAGE); +} + +/* + * Open the file and initiate recursive processing. + */ +static int +process(const char *fname) { + char buf[8192]; + char *collector = 0; + size_t collector_size = sizeof(buf); + size_t collector_offset = 0; + int lineno = 0; + FILE *fp; + + if(strcmp(fname, "-")) { + fp = fopen(fname, "r"); + if(!fp) { + perror(fname); + return -1; + } + } else { + fp = stdin; + } + + + while(fgets(buf, sizeof(buf), fp) || !feof(fp)) { + size_t len = strlen(buf); + + if(!len) continue; + if(collector_offset || buf[len-1] != '\n') { + if((collector_size - collector_offset) <= len + || !collector) { + collector_size <<= 1; + collector = realloc(collector, collector_size); + if(!collector) { + perror("realloc()"); + exit(EX_OSERR); + } + } + memcpy(collector + collector_offset, buf, len + 1); + collector_offset += len; + } + if(buf[len-1] != '\n') continue; + + if(collector_offset) { + assert(collector[collector_offset-1] == '\n'); + process_line(fname, collector, ++lineno); + collector_offset = 0; + } else { + process_line(fname, buf, ++lineno); + } + } + + if(fp != stdin) + fclose(fp); + + return 0; +} + +static int +process_line(const char *fname, char *line, int lineno) { + char buf[32]; + char *op; /* '<' */ + char *cl; /* '>' */ + char *tcl_pos; /* tag class position */ + char *tl_pos; + char *v_pos; + int constr; + ber_tlv_tag_t tag_value; + ber_tlv_tag_t tag_class; + ber_tlv_tag_t tlv_tag; + ber_tlv_len_t tlv_len; + ber_tlv_len_t tl_len; + ssize_t ret; + (void)fname; + + /* Find a tag opening angle bracket */ + for(; *line == ' '; line++); + op = line; + if(*op != '<') { + fprintf(stderr, "%s: Missing '<' after whitespace\n", fname); + exit(EX_DATAERR); + } + + /* Find a tag closing angle bracket */ + for(; *line && *line != '>'; line++) { + if(*line < ' ') { + fprintf(stderr, "%s: Invalid charset (%d)\n", + fname, *(const unsigned char *)line); + exit(EX_DATAERR); + } + } + cl = line; + if(*cl != '>') { + fprintf(stderr, "%s: Missing '>'\n", fname); + exit(EX_DATAERR); + } + + /* Ignore closing tags */ + if(op[1] == '/') { + if(strchr(cl, '<')) { /* We are not very robust */ + fprintf(stderr, "%s: Multiple tags per line\n", fname); + exit(EX_DATAERR); + } + /* End-of-content octets */ + if(op[2] == 'I') { + buf[0] = buf[1] = 0x00; + fwrite(buf, 1, 2, stdout); + } + return 0; + } + + switch(op[1]) { + case 'C': constr = 1; break; + case 'P': constr = 0; break; + case 'I': constr = 2; break; + default: + fprintf(stderr, + "%s: Expected \"C\"/\"P\"/\"I\" as the XML tag name (%c)\n", + fname, op[1]); + exit(EX_DATAERR); + } + + *cl = '\0'; + if(cl[-1] == 'F') { + fprintf(stderr, "%s: Uses pretty-printing of values. " + "Use -p option to unber\n", fname); + exit(EX_DATAERR); + } + + tcl_pos = strstr(op, "T=\"["); + tl_pos = strstr(op, "TL=\""); + v_pos = strstr(op, "V=\""); + if(!tcl_pos || !tl_pos || !v_pos) { + fprintf(stderr, + "%s: Mandatory attribute %s is not found at line %d\n", + fname, (!tcl_pos)?"T":(v_pos?"V":"TCL"), lineno); + exit(EX_DATAERR); + } + errno = 0; + tl_len = strtoul(tl_pos + 4, 0, 10); + if(constr == 2) { + tlv_len = 0; + } else { + tlv_len = strtoul(v_pos + 3, 0, 10); + } + if(errno || tl_len < 2 || tlv_len < 0) { + fprintf(stderr, "%s: Invalid TL or V value at line %d\n", + fname, lineno); + exit(EX_DATAERR); + } + + tcl_pos += 4; + switch(*tcl_pos) { + case 'U': /* UNIVERSAL */ + tag_class = ASN_TAG_CLASS_UNIVERSAL; break; + case 'P': /* PRIVATE */ + tag_class = ASN_TAG_CLASS_PRIVATE; break; + case 'A': /* APPLICATION */ + tag_class = ASN_TAG_CLASS_APPLICATION; break; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': /* context */ + tag_class = ASN_TAG_CLASS_CONTEXT; break; + default: + fprintf(stderr, "%s: Invalid tag class (%c) at line %d\n", + fname, tcl_pos[4], lineno); + exit(EX_DATAERR); + } + for(;; tcl_pos++) { + switch(*tcl_pos) { + case '"': tcl_pos = ""; + case '\0': + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + break; + default: continue; + } + break; + } + errno = 0; + if(!*tcl_pos + || ((long)(tag_value = strtoul(tcl_pos, 0, 10))) < 0 + || errno) { + fprintf(stderr, "%s: Invalid tag value (%c) at line %d\n", + fname, *tcl_pos, lineno); + exit(EX_DATAERR); + } + tlv_tag = ((tag_value << 2) | tag_class); + + if(0) { + printf("[%s>]\n", op); + printf(" <%c T=\"%s\" TL=\"%d\" V=\"%d\">\n", + constr?'C':'P', + ber_tlv_tag_string(tlv_tag), + tl_len, tlv_len); + } + + ret = ber_tlv_tag_serialize(tlv_tag, buf, sizeof(buf)); + assert(ret >= 1 && (size_t)ret < sizeof(buf)); + if(constr == 2) { + buf[ret] = 0x80; + ret += 1; + } else { + ret += der_tlv_length_serialize(tlv_len, + buf + ret, sizeof(buf) - ret); + assert(ret >= 2 && (size_t)ret < sizeof(buf)); + } + if(ret != tl_len) { + fprintf(stderr, "%s: Cannot encode TL at line %d " + "in the given number of bytes (%d!=%d)\n", + fname, lineno, ret, tl_len); + exit(EX_DATAERR); + } + if(constr) *buf |= 0x20; /* Enable "constructed" bit */ + fwrite(buf, 1, tl_len, stdout); + + if(!constr) { + ber_tlv_len_t len; + for(len = 0, cl++; *cl && *cl != '<'; cl++, len++) { + unsigned char v; + int h; + if(*cl != '&') { + fputc(*cl, stdout); + continue; + } + cl++; + if(*cl != 'x') { + fprintf(stderr, "%s: Expected \"&xNN;\" at line %d\n", + fname, lineno); + exit(EX_DATAERR); + } + for(v = 0, h = 0; h < 2; h++) { + unsigned char clv = *++cl; + v <<= 4; + switch(clv) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + v |= clv - '0'; break; + case 'A': case 'B': case 'C': + case 'D': case 'E': case 'F': + v |= clv - 'A' + 10; break; + case 'a': case 'b': case 'c': + case 'd': case 'e': case 'f': + v |= clv - 'a' + 10; break; + default: + fprintf(stderr, + "%s: Expected \"&xNN;\" at line %d (%c)\n", + fname, lineno, clv); + exit(EX_DATAERR); + } + } + cl++; + if(*cl != ';') { + fprintf(stderr, + "%s: Expected \"&xNN;\" at line %d\n", + fname, lineno); + exit(EX_DATAERR); + } + fputc(v, stdout); + } + if(len != tlv_len) { + fprintf(stderr, + "%s: Could not encode value of %d chars " + "at line %d in %d bytes\n", + fname, len, lineno, tlv_len); + exit(EX_DATAERR); + } + } + + return 0; +} + diff --git a/asn1c/unber.1 b/asn1c/unber.1 index ec731a040..a96b0f5dc 100644 --- a/asn1c/unber.1 +++ b/asn1c/unber.1 @@ -1,22 +1,95 @@ -.de Id +.de Vb +.sp +.ft CW +.nf +.. +.de Ve +.ft R +.fi +.sp .. -.Id $Id" .TH UNBER 1 "\*(Dt" "ASN.1 BER Decoder" "ASN.1 BER Decoder" .SH NAME unber \- ASN.1 BER Decoder .SH SYNOPSIS -unber [\fB\-t\fR\fIdata-string\fR] [\fB-\fR] \fIinfile\fR... +unber [\fB-1\fR] [\fB-i\fRindent] [\fB-p\fR] [\fB\-t\fR\fIdata-string\fR] [\fB-\fR] \fIinfile\fR... .SH DESCRIPTION -unber takes the BER-encoded files and dumps their internal structure to stdout. -(The DER and CER formats are both subsets of the BER, and are also supported.) +unber takes the BER-encoded files and dumps their internal structure as human readable text. A single dash represents the standard input. +.sp +(The DER and CER formats are both subsets of the BER, and are also supported.) .SH OPTIONS .TP +\fB\-1\fR +Do \fInot\fR attempt to read the next BER structure after the first one. +This may be useful if the input contains garbage past the single BER sequence. +By default, unber continues decoding until the end of file (input stream). +.TP +\fB\-i\fR \fIindent\fR +Use the specified number of spaces for output indentation. Default is 4 spaces. +.TP +\fB\-p\fR +Do \fInot\fR attempt pretty-printing of known ASN.1 types (strings, INTEGER, BOOLEAN, etc). +.TP \fB\-t\fR \fIdata-string\fR Interpret the data-string as a sequence of hexadecimal values representing the start of BER TLV encoding. Print the human readable explanation. +.SH XML FORMAT +unber dumps the output in the regular XML format which preserves most of the +information from the underlying binary encoding. +.P +The XML opening tag format is as follows: +.Vb +\& <\fItform\fR T="\fItag\fR" TL="\fItl_len\fR" V="{Indefinite|\fIv_len\fR}" [A="\fItype\fR"] [\fIF\fR]> +.Ve +Where: +.TP +\fItform\fR +Which form the value is in: primitive ("P") or constructed ("C") or constructed with indefinite length ("I") +.TP +\fItag\fR +The tag class and value +.TP +\fItl_len\fR +The length of the TL (BER Tag and Length) encoding +.TP +\fIv_len\fR +The length of the value (V, encoded by the L), may be "Indefinite" +.TP +\fItype\fR +Likely name of the underlying ASN.1 type (for UNIVERSAL tags) +.TP +[\fIF\fR] +Indicates that the value was reformatted (pretty-printed) +.P +Example: +.Vb +\& +\&

    US

    +\& +\&

    832970823

    +\&
    +\&
    +.Ve +.SH EXAMPLES +Decode the given Tag/Length sequence given in hexadecimal form: +.Vb +\& unber \fB-t\fR "\fIbf 20\fR" +.Ve +Decode the given DER file using two-spaces indentation: +.Vb +\& unber \fB-i\fR \fI2\fR \fIfilename.der\fR +.Ve +Decode the binary stream taken from the standard input: +.Vb +\& cat \fI...\fR | unber \fB-\fR +.Ve +Decode the binary stream into the same stream (see \fIenber\fR\|(1)): +.Vb +\& cat \fI...\fR | unber \fB-\fR | enber \fB-\fR > filename.ber\fI\fR +.Ve .SH SEE ALSO .TP -\&\fIasn1c\fR\|(1) +\&\fIenber\fR\|(1), \&\fIasn1c\fR\|(1) .SH AUTHORS Lev Walkin diff --git a/asn1c/unber.c b/asn1c/unber.c index a954ece15..60f3a0362 100644 --- a/asn1c/unber.c +++ b/asn1c/unber.c @@ -1,3 +1,30 @@ +/*- + * Copyright (c) 2004 Lev Walkin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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 AUTHOR 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 AUTHOR 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. + * + * $Id$ + */ #include #include #include @@ -13,11 +40,13 @@ #include /* For static string tables */ -#include -#include -#include +#include +#include #include #include +#include +#include +#include static void usage(const char *av0); /* Print the Usage screen and exit */ static int process(const char *fname); /* Perform the BER decoding */ @@ -27,7 +56,9 @@ static int decode_tlv_from_string(const char *datastring); #define COPYRIGHT \ "Copyright (c) 2004 Lev Walkin \n" -static char *indent_buffer = " "; +static int single_type_decoding = 0; /* -1 enables that */ +static int pretty_printing = 1; /* -p disables that */ +static char *indent_buffer = " "; /* -i controls that */ int main(int ac, char **av) { @@ -37,12 +68,18 @@ main(int ac, char **av) { /* * Process command-line options. */ - while((ch = getopt(ac, av, "i:t:v")) != -1) + while((ch = getopt(ac, av, "1hi:pt:v")) != -1) switch(ch) { + case '1': + single_type_decoding = 1; + break; case 't': if(decode_tlv_from_string(optarg)) exit(EX_DATAERR); exit(0); + case 'p': + pretty_printing = 0; + break; case 'i': i = atoi(optarg); if(i >= 0 && i < 16) { @@ -58,6 +95,7 @@ main(int ac, char **av) { fprintf(stderr, "ASN.1 BER Decoder, v" VERSION "\n" COPYRIGHT); exit(0); break; + case 'h': default: usage(av[0]); } @@ -96,9 +134,21 @@ usage(const char *av0) { "ASN.1 BER Decoder, v" VERSION "\n" COPYRIGHT "Usage: %s [options] [-] [file ...]\n" "Options:\n" -" -i Amount of spaces for indentation (default is 4)\n" -" -t Decode the given tag[/length] sequence\n" -" (e.g. -t \"bf 20\")\n" +" -1 Decode only the first BER structure (otherwise, until EOF)\n" +" -i Amount of spaces for output indentation (default is 4)\n" +" -p Do not attempt pretty-printing of known ASN.1 types\n" +" -t Decode the given tag[/length] sequence (e.g. -t \"bf20\")\n" +"\n" +"The XML opening tag format is as follows:\n" +" \n" +"Where:\n" +" tform Which form the value is in: constructed (\"C\", \"I\") or primitive (\"P\")\n" +" tag The tag class and value\n" +" tl_len The length of the TL (BER Tag and Length) encoding\n" +" v_len The length of the value (V, encoded by the L), may be \"Indefinite\"\n" +" type Likely name of the underlying ASN.1 type (for [UNIVERSAL n] tags)\n" +" [F] Indicates that the value was reformatted (pretty-printed)\n" +"See the manual page for details\n" , av0); exit(EX_USAGE); } @@ -135,7 +185,7 @@ process(const char *fname) { */ do { pdc = process_deeper(fname, fp, 0, -1); - } while(pdc == PD_FINISHED); /* Wait until PD_EOF */ + } while(pdc == PD_FINISHED && !single_type_decoding); if(fp != stdin) fclose(fp); @@ -216,6 +266,11 @@ static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t continue; } + if(tagbuf[0] == '\0' && tagbuf[1] == '\0') { + /* End of content octets */ + return PD_FINISHED; + } + /* Make sure the T & L decoders took exactly the whole buffer */ assert((t_len + l_len) == tblen); @@ -249,6 +304,7 @@ static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t if(tlv_len == -1) tlv_len = limit; + printf(">\n"); /* Close the opening tag */ pdc = process_deeper(fname, fp, level + 1, tlv_len); if(pdc == PD_FAILED) return pdc; } else { @@ -269,11 +325,6 @@ static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t static void print_TL(int fin, int level, int constr, ssize_t tlen, ber_tlv_tag_t tlv_tag, ber_tlv_len_t tlv_len) { - if(fin && tlen == 2 && !constr && !tlv_tag && !tlv_len) { - /* end of content octets */ - return; - } - if(fin && !constr) { printf("

    \n"); return; @@ -282,19 +333,19 @@ print_TL(int fin, int level, int constr, ssize_t tlen, ber_tlv_tag_t tlv_tag, be while(level-- > 0) printf(indent_buffer); /* Print indent */ printf(fin ? "\n"); - else - printf(">"); + if(fin) printf(">\n"); } +/* + * Print the value in binary form, or reformat for pretty-printing. + */ static int print_V(const char *fname, FILE *fp, ber_tlv_tag_t tlv_tag, ber_tlv_len_t tlv_len) { + asn1_integer_t *arcs = 0; /* Object identifier arcs */ + unsigned char *vbuf = 0; asn1p_expr_type_e etype = 0; - long collector = 0; + asn1_integer_t collector = 0; + int special_format = 0; ssize_t i; /* Figure out what type is it */ - if(BER_TAG_CLASS(tlv_tag) == ASN_TAG_CLASS_UNIVERSAL) { + if(BER_TAG_CLASS(tlv_tag) == ASN_TAG_CLASS_UNIVERSAL + && pretty_printing) { ber_tlv_tag_t tvalue = BER_TAG_VALUE(tlv_tag); etype = ASN_UNIVERSAL_TAG2TYPE(tvalue); } + /* + * Determine how to print the value, either in its native binary form, + * encoded with &xNN characters, or using pretty-printing. + * The basic string types (including "useful types", like UTCTime) + * are excempt from this determination logic, because their alphabets + * are subsets of the XML's native UTF-8 encoding. + */ + switch(etype) { + case ASN_BASIC_BOOLEAN: + if(tlv_len == 1) + special_format = 1; + else + etype = 0; + break; + case ASN_BASIC_INTEGER: + case ASN_BASIC_ENUMERATED: + if((size_t)tlv_len <= sizeof(collector)) + special_format = 1; + else + etype = 0; + break; + case ASN_BASIC_OBJECT_IDENTIFIER: + case ASN_BASIC_RELATIVE_OID: + if(tlv_len > 0 && tlv_len < 128*1024 /* VERY long OID! */) { + arcs = malloc(sizeof(*arcs) * (tlv_len + 1)); + if(arcs) { + vbuf = malloc(tlv_len + 1); + /* Not checking is intentional */ + } + } + case ASN_BASIC_UTCTime: + case ASN_BASIC_GeneralizedTime: + case ASN_STRING_NumericString: + case ASN_STRING_PrintableString: + case ASN_STRING_VisibleString: + case ASN_STRING_IA5String: + case ASN_STRING_UTF8String: + break; /* Directly compatible with UTF-8 */ + case ASN_STRING_BMPString: + case ASN_STRING_UniversalString: + break; /* Not directly compatible with UTF-8 */ + default: + /* Conditionally compatible with UTF-8 */ + if(( + (etype & ASN_STRING_MASK) + || + (etype == ASN_BASIC_OCTET_STRING) + ) && (tlv_len > 0 && tlv_len < 128 * 1024)) { + vbuf = malloc(tlv_len + 1); + /* Not checking is intentional */ + } + break; + } + + /* If collection vbuf is present, defer printing the F flag. */ + if(!vbuf) printf(special_format ? " F>" : ">"); + /* * Print the value in binary or text form. */ @@ -330,6 +442,8 @@ print_V(const char *fname, FILE *fp, ber_tlv_tag_t tlv_tag, ber_tlv_len_t tlv_le if(ch == -1) { fprintf(stderr, "%s: Unexpected end of file (V)\n", fname); + if(vbuf) free(vbuf); + if(arcs) free(arcs); return -1; } switch(etype) { @@ -338,6 +452,7 @@ print_V(const char *fname, FILE *fp, ber_tlv_tag_t tlv_tag, ber_tlv_len_t tlv_le case ASN_STRING_NumericString: case ASN_STRING_PrintableString: case ASN_STRING_VisibleString: + case ASN_STRING_IA5String: case ASN_STRING_UTF8String: switch(ch) { default: @@ -354,33 +469,112 @@ print_V(const char *fname, FILE *fp, ber_tlv_tag_t tlv_tag, ber_tlv_len_t tlv_le } break; case ASN_BASIC_BOOLEAN: - if(tlv_len == 1) { - switch(ch) { - case 0: printf(""); break; - case 0xff: printf(""); break; - default: printf("", ch); - } - break; + switch(ch) { + case 0: printf(""); break; + case 0xff: printf(""); break; + default: printf("", ch); } - /* Fall through */ + break; case ASN_BASIC_INTEGER: case ASN_BASIC_ENUMERATED: - if((size_t)tlv_len <= sizeof(collector)) { - if(i) { - collector = collector * 256 + ch; - } else { - collector = (int)(signed char)ch; + if(i) collector = collector * 256 + ch; + else collector = (int)(signed char)ch; + break; + default: + if(vbuf) { + vbuf[i] = ch; + } else { + printf("&x%02x;", ch); + } + } + } + + /* Do post-processing */ + switch(etype) { + case ASN_BASIC_INTEGER: + case ASN_BASIC_ENUMERATED: + printf("%" PRIdMAX, collector); + break; + case ASN_BASIC_OBJECT_IDENTIFIER: + if(vbuf) { + OBJECT_IDENTIFIER_t oid; + int arcno; + + oid.buf = vbuf; + oid.size = tlv_len; + + arcno = OBJECT_IDENTIFIER_get_arcs(&oid, arcs, + sizeof(*arcs), tlv_len + 1); + if(arcno >= 0) { + assert(arcno <= (tlv_len + 1)); + printf(" F>"); + for(i = 0; i < arcno; i++) { + if(i) printf("."); + printf("%" PRIuASN, arcs[i]); } - if((i+1) == tlv_len) - printf("%ld", collector); - break; + free(vbuf); + vbuf = 0; + } + } + break; + case ASN_BASIC_RELATIVE_OID: + if(vbuf) { + RELATIVE_OID_t oid; + int arcno; + + oid.buf = vbuf; + oid.size = tlv_len; + + arcno = RELATIVE_OID_get_arcs(&oid, arcs, + sizeof(*arcs), tlv_len); + if(arcno >= 0) { + assert(arcno <= (tlv_len + 1)); + printf(" F>"); + for(i = 0; i < arcno; i++) { + if(i) printf("."); + printf("%" PRIuASN, arcs[i]); + } + free(vbuf); + vbuf = 0; } - /* Fall through */ - default: - printf("&x%02x;", ch); } + break; + default: break; } + /* + * If the buffer was not consumed, print it out. + */ + if(vbuf) { + int binary; + + /* + * Check whether the data could be represented as text + */ + binary = -1 * (tlv_len >> 2); /* Threshold is 25% binary */ + for(i = 0; i < tlv_len; i++) { + switch(vbuf[i]) { + case 0x1b: binary = 1; break; + case 0x09: case 0x0a: case 0x0d: continue; + default: + if(vbuf[i] < 0x20 || (vbuf[i] & 0x80)) + if(++binary > 0) /* Way too many */ + break; + continue; + } + break; + } + printf(">"); + for(i = 0; i < tlv_len; i++) { + if(binary > 0 || vbuf[i] < 0x20 || (vbuf[i] & 0x80)) + printf("&x%02x;", vbuf[i]); + else + printf("%c", vbuf[i]); + } + free(vbuf); + } + + if(arcs) free(arcs); return 0; } @@ -479,3 +673,9 @@ decode_tlv_from_string(const char *datastring) { return 0; } + +/* + * Dummy functions. + */ +ber_dec_rval_t ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *opt_ctx, void *ptr, size_t size, int tag_mode, ber_tlv_len_t *last_length, int *opt_tlv_form) { ber_dec_rval_t rv; (void)td; (void)opt_ctx; (void)ptr; (void)size; (void)tag_mode; (void)last_length; (void)opt_tlv_form; return rv; } +ssize_t der_write_tags(asn1_TYPE_descriptor_t *td, size_t slen, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { (void)td; (void)slen; (void)tag_mode; (void)tag; (void)cb; (void)app_key; return -1; } From d157958dc747e6c5d5744a6fcf503c9dcb4e7bc6 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 24 Sep 2004 21:00:50 +0000 Subject: [PATCH 0394/1469] reheaderization git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@394 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_save.c | 2 +- skeletons/ANY.h | 1 - skeletons/BIT_STRING.h | 3 +-- skeletons/BMPString.h | 3 +-- skeletons/BOOLEAN.h | 2 +- skeletons/ENUMERATED.h | 3 +-- skeletons/GeneralString.h | 3 +-- skeletons/GeneralizedTime.h | 3 +-- skeletons/GraphicString.h | 3 +-- skeletons/IA5String.h | 3 +-- skeletons/INTEGER.h | 2 +- skeletons/ISO646String.h | 2 +- skeletons/NULL.h | 2 +- skeletons/NativeInteger.h | 2 +- skeletons/NativeReal.h | 2 +- skeletons/NumericString.h | 3 +-- skeletons/OBJECT_IDENTIFIER.h | 3 +-- skeletons/OCTET_STRING.h | 2 +- skeletons/ObjectDescriptor.h | 3 +-- skeletons/PrintableString.h | 3 +-- skeletons/REAL.h | 2 +- skeletons/RELATIVE-OID.h | 3 +-- skeletons/T61String.h | 3 +-- skeletons/TeletexString.h | 3 +-- skeletons/UTCTime.h | 3 +-- skeletons/UTF8String.h | 3 +-- skeletons/UniversalString.h | 3 +-- skeletons/VideotexString.h | 3 +-- skeletons/VisibleString.h | 3 +-- skeletons/ber_decoder.h | 4 ++-- skeletons/constr_CHOICE.h | 2 +- skeletons/constr_SEQUENCE.h | 2 +- skeletons/constr_SEQUENCE_OF.h | 2 +- skeletons/constr_SET.h | 2 +- skeletons/constr_SET_OF.h | 2 +- skeletons/constr_TYPE.h | 2 -- skeletons/constraints.c | 1 - skeletons/der_encoder.c | 1 - skeletons/der_encoder.h | 2 +- skeletons/file-dependencies | 3 ++- skeletons/xer_encoder.c | 3 +-- skeletons/xer_encoder.h | 2 +- 42 files changed, 40 insertions(+), 64 deletions(-) diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c index 00a4496ed..381404e4f 100644 --- a/libasn1compiler/asn1c_save.c +++ b/libasn1compiler/asn1c_save.c @@ -216,7 +216,7 @@ asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *deps) { fprintf(fp_h, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n"); - fprintf(fp_h, "#include \n\n"); + fprintf(fp_h, "#include \n\n"); TQ_FOR(ot, &(cs->destination[OT_INCLUDES].chunks), next) { asn1c_activate_dependency(deps, 0, ot->buf); diff --git a/skeletons/ANY.h b/skeletons/ANY.h index d010de4a1..ae62596ff 100644 --- a/skeletons/ANY.h +++ b/skeletons/ANY.h @@ -5,7 +5,6 @@ #ifndef ASN_TYPE_ANY_H #define ASN_TYPE_ANY_H -#include #include /* Implemented via OCTET SRING type */ typedef struct ANY { diff --git a/skeletons/BIT_STRING.h b/skeletons/BIT_STRING.h index f9ebf9b7e..ff622a325 100644 --- a/skeletons/BIT_STRING.h +++ b/skeletons/BIT_STRING.h @@ -5,10 +5,9 @@ #ifndef _BIT_STRING_H_ #define _BIT_STRING_H_ -#include #include -typedef OCTET_STRING_t BIT_STRING_t; /* Implemented in terms of OCTET STRING */ +typedef OCTET_STRING_t BIT_STRING_t; /* Implemented via OCTET STRING */ extern asn1_TYPE_descriptor_t asn1_DEF_BIT_STRING; diff --git a/skeletons/BMPString.h b/skeletons/BMPString.h index 31d67eaee..2860e6baa 100644 --- a/skeletons/BMPString.h +++ b/skeletons/BMPString.h @@ -5,10 +5,9 @@ #ifndef _BMPString_H_ #define _BMPString_H_ -#include #include -typedef OCTET_STRING_t BMPString_t; /* Implemented in terms of OCTET STRING */ +typedef OCTET_STRING_t BMPString_t; /* Implemented via OCTET STRING */ extern asn1_TYPE_descriptor_t asn1_DEF_BMPString; diff --git a/skeletons/BOOLEAN.h b/skeletons/BOOLEAN.h index b9b836ee5..2b195dc1b 100644 --- a/skeletons/BOOLEAN.h +++ b/skeletons/BOOLEAN.h @@ -5,7 +5,7 @@ #ifndef _BOOLEAN_H_ #define _BOOLEAN_H_ -#include +#include /* * The underlying integer may contain various values, but everything diff --git a/skeletons/ENUMERATED.h b/skeletons/ENUMERATED.h index a0948ed06..b926eb263 100644 --- a/skeletons/ENUMERATED.h +++ b/skeletons/ENUMERATED.h @@ -5,10 +5,9 @@ #ifndef _ENUMERATED_H_ #define _ENUMERATED_H_ -#include #include -typedef INTEGER_t ENUMERATED_t; /* Implemented in terms of INTEGER */ +typedef INTEGER_t ENUMERATED_t; /* Implemented via INTEGER */ extern asn1_TYPE_descriptor_t asn1_DEF_ENUMERATED; diff --git a/skeletons/GeneralString.h b/skeletons/GeneralString.h index 6d5bfdf67..d8d07e97b 100644 --- a/skeletons/GeneralString.h +++ b/skeletons/GeneralString.h @@ -5,10 +5,9 @@ #ifndef _GeneralString_H_ #define _GeneralString_H_ -#include #include -typedef OCTET_STRING_t GeneralString_t; /* Implemented in terms of OCTET STRING */ +typedef OCTET_STRING_t GeneralString_t; /* Implemented via OCTET STRING */ extern asn1_TYPE_descriptor_t asn1_DEF_GeneralString; diff --git a/skeletons/GeneralizedTime.h b/skeletons/GeneralizedTime.h index 06b4ca5f7..6681183b6 100644 --- a/skeletons/GeneralizedTime.h +++ b/skeletons/GeneralizedTime.h @@ -5,10 +5,9 @@ #ifndef _GeneralizedTime_H_ #define _GeneralizedTime_H_ -#include #include -typedef OCTET_STRING_t GeneralizedTime_t; /* Implemented using OCTET STRING */ +typedef OCTET_STRING_t GeneralizedTime_t; /* Implemented via OCTET STRING */ extern asn1_TYPE_descriptor_t asn1_DEF_GeneralizedTime; diff --git a/skeletons/GraphicString.h b/skeletons/GraphicString.h index b37b2c7e0..64fcf642d 100644 --- a/skeletons/GraphicString.h +++ b/skeletons/GraphicString.h @@ -5,10 +5,9 @@ #ifndef _GraphicString_H_ #define _GraphicString_H_ -#include #include -typedef OCTET_STRING_t GraphicString_t; /* Implemented in terms of OCTET STRING */ +typedef OCTET_STRING_t GraphicString_t; /* Implemented via OCTET STRING */ extern asn1_TYPE_descriptor_t asn1_DEF_GraphicString; diff --git a/skeletons/IA5String.h b/skeletons/IA5String.h index a80004e8c..6c40a954d 100644 --- a/skeletons/IA5String.h +++ b/skeletons/IA5String.h @@ -5,10 +5,9 @@ #ifndef _IA5String_H_ #define _IA5String_H_ -#include #include -typedef OCTET_STRING_t IA5String_t; /* Implemented in terms of OCTET STRING */ +typedef OCTET_STRING_t IA5String_t; /* Implemented via OCTET STRING */ /* * IA5String ASN.1 type definition. diff --git a/skeletons/INTEGER.h b/skeletons/INTEGER.h index 8e3c5458b..89ab1af59 100644 --- a/skeletons/INTEGER.h +++ b/skeletons/INTEGER.h @@ -5,7 +5,7 @@ #ifndef _INTEGER_H_ #define _INTEGER_H_ -#include +#include typedef struct INTEGER { uint8_t *buf; /* Buffer with consecutive INTEGER bits (big-endian) */ diff --git a/skeletons/ISO646String.h b/skeletons/ISO646String.h index 566ce3bea..c1ff80f7e 100644 --- a/skeletons/ISO646String.h +++ b/skeletons/ISO646String.h @@ -5,7 +5,7 @@ #ifndef _ISO646String_H_ #define _ISO646String_H_ -#include +#include #include typedef VisibleString_t ISO646String_t; /* Implemented using VisibleString */ diff --git a/skeletons/NULL.h b/skeletons/NULL.h index 0c07ffe85..64c02f707 100644 --- a/skeletons/NULL.h +++ b/skeletons/NULL.h @@ -5,7 +5,7 @@ #ifndef ASN_TYPE_NULL_H #define ASN_TYPE_NULL_H -#include +#include /* * The value of the NULL type is meaningless: see BOOLEAN if you want to diff --git a/skeletons/NativeInteger.h b/skeletons/NativeInteger.h index 2d0cddaad..5c1e5e41b 100644 --- a/skeletons/NativeInteger.h +++ b/skeletons/NativeInteger.h @@ -12,7 +12,7 @@ #ifndef _NativeInteger_H_ #define _NativeInteger_H_ -#include +#include extern asn1_TYPE_descriptor_t asn1_DEF_NativeInteger; diff --git a/skeletons/NativeReal.h b/skeletons/NativeReal.h index a130a334b..2f3b0a60c 100644 --- a/skeletons/NativeReal.h +++ b/skeletons/NativeReal.h @@ -11,7 +11,7 @@ #ifndef ASN_TYPE_NativeReal_H #define ASN_TYPE_NativeReal_H -#include +#include extern asn1_TYPE_descriptor_t asn1_DEF_NativeReal; diff --git a/skeletons/NumericString.h b/skeletons/NumericString.h index 71f72c769..2e06255ea 100644 --- a/skeletons/NumericString.h +++ b/skeletons/NumericString.h @@ -5,10 +5,9 @@ #ifndef _NumericString_H_ #define _NumericString_H_ -#include #include -typedef OCTET_STRING_t NumericString_t; /* Implemented in terms of OCTET STRING */ +typedef OCTET_STRING_t NumericString_t; /* Implemented via OCTET STRING */ extern asn1_TYPE_descriptor_t asn1_DEF_NumericString; diff --git a/skeletons/OBJECT_IDENTIFIER.h b/skeletons/OBJECT_IDENTIFIER.h index 4f45090cf..e232f70b7 100644 --- a/skeletons/OBJECT_IDENTIFIER.h +++ b/skeletons/OBJECT_IDENTIFIER.h @@ -5,10 +5,9 @@ #ifndef _OBJECT_IDENTIFIER_H_ #define _OBJECT_IDENTIFIER_H_ -#include #include -typedef INTEGER_t OBJECT_IDENTIFIER_t; /* Implemented in terms of INTEGER */ +typedef INTEGER_t OBJECT_IDENTIFIER_t; /* Implemented via INTEGER */ extern asn1_TYPE_descriptor_t asn1_DEF_OBJECT_IDENTIFIER; diff --git a/skeletons/OCTET_STRING.h b/skeletons/OCTET_STRING.h index a67cef94b..3c4509b68 100644 --- a/skeletons/OCTET_STRING.h +++ b/skeletons/OCTET_STRING.h @@ -5,7 +5,7 @@ #ifndef _OCTET_STRING_H_ #define _OCTET_STRING_H_ -#include +#include typedef struct OCTET_STRING { uint8_t *buf; /* Buffer with consecutive OCTET_STRING bits */ diff --git a/skeletons/ObjectDescriptor.h b/skeletons/ObjectDescriptor.h index 67addf243..2620d139e 100644 --- a/skeletons/ObjectDescriptor.h +++ b/skeletons/ObjectDescriptor.h @@ -5,10 +5,9 @@ #ifndef _ObjectDescriptor_H_ #define _ObjectDescriptor_H_ -#include #include -typedef GraphicString_t ObjectDescriptor_t; /* Implemented in terms of. */ +typedef GraphicString_t ObjectDescriptor_t; /* Implemented via GraphicString */ extern asn1_TYPE_descriptor_t asn1_DEF_ObjectDescriptor; diff --git a/skeletons/PrintableString.h b/skeletons/PrintableString.h index b44a61ec3..fffb86ee1 100644 --- a/skeletons/PrintableString.h +++ b/skeletons/PrintableString.h @@ -5,10 +5,9 @@ #ifndef _PrintableString_H_ #define _PrintableString_H_ -#include #include -typedef OCTET_STRING_t PrintableString_t; /* Implemented in terms of OCTET STRING */ +typedef OCTET_STRING_t PrintableString_t; /* Implemented via OCTET STRING */ extern asn1_TYPE_descriptor_t asn1_DEF_PrintableString; diff --git a/skeletons/REAL.h b/skeletons/REAL.h index 83f96d019..2f7809b52 100644 --- a/skeletons/REAL.h +++ b/skeletons/REAL.h @@ -5,7 +5,7 @@ #ifndef ASN_TYPE_REAL_H #define ASN_TYPE_REAL_H -#include +#include typedef struct REAL { uint8_t *buf; /* Buffer with REAL type encoding */ diff --git a/skeletons/RELATIVE-OID.h b/skeletons/RELATIVE-OID.h index e6af93466..855391c9a 100644 --- a/skeletons/RELATIVE-OID.h +++ b/skeletons/RELATIVE-OID.h @@ -5,10 +5,9 @@ #ifndef _RELATIVE_OID_H_ #define _RELATIVE_OID_H_ -#include #include -/* Implemented in terms of OBJECT IDENTIFIER */ +/* Implemented via OBJECT IDENTIFIER */ typedef OBJECT_IDENTIFIER_t RELATIVE_OID_t; extern asn1_TYPE_descriptor_t asn1_DEF_RELATIVE_OID; diff --git a/skeletons/T61String.h b/skeletons/T61String.h index 1485577ef..f523444bb 100644 --- a/skeletons/T61String.h +++ b/skeletons/T61String.h @@ -5,10 +5,9 @@ #ifndef _T61String_H_ #define _T61String_H_ -#include #include -typedef OCTET_STRING_t T61String_t; /* Implemented in terms of OCTET STRING */ +typedef OCTET_STRING_t T61String_t; /* Implemented via OCTET STRING */ extern asn1_TYPE_descriptor_t asn1_DEF_T61String; diff --git a/skeletons/TeletexString.h b/skeletons/TeletexString.h index 6f513581a..e92f7c2dc 100644 --- a/skeletons/TeletexString.h +++ b/skeletons/TeletexString.h @@ -5,10 +5,9 @@ #ifndef _TeletexString_H_ #define _TeletexString_H_ -#include #include -typedef OCTET_STRING_t TeletexString_t; /* Implemented in terms of OCTET STRING */ +typedef OCTET_STRING_t TeletexString_t; /* Implemented via OCTET STRING */ extern asn1_TYPE_descriptor_t asn1_DEF_TeletexString; diff --git a/skeletons/UTCTime.h b/skeletons/UTCTime.h index b026deddb..65de7a3a4 100644 --- a/skeletons/UTCTime.h +++ b/skeletons/UTCTime.h @@ -5,10 +5,9 @@ #ifndef _UTCTime_H_ #define _UTCTime_H_ -#include #include -typedef OCTET_STRING_t UTCTime_t; /* Implemented using OCTET STRING */ +typedef OCTET_STRING_t UTCTime_t; /* Implemented via OCTET STRING */ extern asn1_TYPE_descriptor_t asn1_DEF_UTCTime; diff --git a/skeletons/UTF8String.h b/skeletons/UTF8String.h index 543d31969..bb58bbea5 100644 --- a/skeletons/UTF8String.h +++ b/skeletons/UTF8String.h @@ -5,10 +5,9 @@ #ifndef _UTF8String_H_ #define _UTF8String_H_ -#include #include -typedef OCTET_STRING_t UTF8String_t; /* Implemented in terms of OCTET STRING */ +typedef OCTET_STRING_t UTF8String_t; /* Implemented via OCTET STRING */ extern asn1_TYPE_descriptor_t asn1_DEF_UTF8String; diff --git a/skeletons/UniversalString.h b/skeletons/UniversalString.h index 88875236f..fe74f0fd7 100644 --- a/skeletons/UniversalString.h +++ b/skeletons/UniversalString.h @@ -5,10 +5,9 @@ #ifndef _UniversalString_H_ #define _UniversalString_H_ -#include #include -typedef OCTET_STRING_t UniversalString_t; /* Implemented in terms of OCTET STRING */ +typedef OCTET_STRING_t UniversalString_t; /* Implemented via OCTET STRING */ extern asn1_TYPE_descriptor_t asn1_DEF_UniversalString; diff --git a/skeletons/VideotexString.h b/skeletons/VideotexString.h index 4dd7c8e7b..6b60341f5 100644 --- a/skeletons/VideotexString.h +++ b/skeletons/VideotexString.h @@ -5,10 +5,9 @@ #ifndef _VideotexString_H_ #define _VideotexString_H_ -#include #include -typedef OCTET_STRING_t VideotexString_t; /* Implemented in terms of OCTET STRING */ +typedef OCTET_STRING_t VideotexString_t; /* Implemented via OCTET STRING */ extern asn1_TYPE_descriptor_t asn1_DEF_VideotexString; diff --git a/skeletons/VisibleString.h b/skeletons/VisibleString.h index 3c1df420a..b90234c68 100644 --- a/skeletons/VisibleString.h +++ b/skeletons/VisibleString.h @@ -5,10 +5,9 @@ #ifndef _VisibleString_H_ #define _VisibleString_H_ -#include #include -typedef OCTET_STRING_t VisibleString_t; /* Implemented in terms of OCTET STRING */ +typedef OCTET_STRING_t VisibleString_t; /* Implemented via OCTET STRING */ extern asn1_TYPE_descriptor_t asn1_DEF_VisibleString; diff --git a/skeletons/ber_decoder.h b/skeletons/ber_decoder.h index 4842adb53..3e1b84f38 100644 --- a/skeletons/ber_decoder.h +++ b/skeletons/ber_decoder.h @@ -5,7 +5,7 @@ #ifndef _BER_DECODER_H_ #define _BER_DECODER_H_ -#include +#include struct asn1_TYPE_descriptor_s; /* Forward declaration */ @@ -68,7 +68,7 @@ typedef ber_dec_rval_t (ber_type_decoder_f)( * head->last_tag_form is non-zero. */ ber_dec_rval_t ber_check_tags(struct asn1_TYPE_descriptor_s *type_dsc, - ber_dec_ctx_t *ctx, /* saved context */ + ber_dec_ctx_t *opt_ctx, /* saved context */ void *ptr, size_t size, int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ ber_tlv_len_t *last_length, diff --git a/skeletons/constr_CHOICE.h b/skeletons/constr_CHOICE.h index 35b951105..4e296413c 100644 --- a/skeletons/constr_CHOICE.h +++ b/skeletons/constr_CHOICE.h @@ -5,7 +5,7 @@ #ifndef _CONSTR_CHOICE_H_ #define _CONSTR_CHOICE_H_ -#include +#include typedef struct asn1_CHOICE_specifics_s { /* diff --git a/skeletons/constr_SEQUENCE.h b/skeletons/constr_SEQUENCE.h index 156db8c74..27903b13a 100644 --- a/skeletons/constr_SEQUENCE.h +++ b/skeletons/constr_SEQUENCE.h @@ -5,7 +5,7 @@ #ifndef _CONSTR_SEQUENCE_H_ #define _CONSTR_SEQUENCE_H_ -#include +#include typedef struct asn1_SEQUENCE_specifics_s { /* diff --git a/skeletons/constr_SEQUENCE_OF.h b/skeletons/constr_SEQUENCE_OF.h index ee117508c..f6b714914 100644 --- a/skeletons/constr_SEQUENCE_OF.h +++ b/skeletons/constr_SEQUENCE_OF.h @@ -5,7 +5,7 @@ #ifndef _CONSTR_SEQUENCE_OF_H_ #define _CONSTR_SEQUENCE_OF_H_ -#include +#include #include /* Implemented using SET OF */ /* diff --git a/skeletons/constr_SET.h b/skeletons/constr_SET.h index eaf7df0ac..17fb61325 100644 --- a/skeletons/constr_SET.h +++ b/skeletons/constr_SET.h @@ -5,7 +5,7 @@ #ifndef _CONSTR_SET_H_ #define _CONSTR_SET_H_ -#include +#include typedef struct asn1_SET_specifics_s { diff --git a/skeletons/constr_SET_OF.h b/skeletons/constr_SET_OF.h index 1a1384daf..b013dd6f1 100644 --- a/skeletons/constr_SET_OF.h +++ b/skeletons/constr_SET_OF.h @@ -5,7 +5,7 @@ #ifndef _CONSTR_SET_OF_H_ #define _CONSTR_SET_OF_H_ -#include +#include typedef struct asn1_SET_OF_specifics_s { /* diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index 28e8e2cdd..c8982f9d2 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -11,8 +11,6 @@ #ifndef _CONSTR_TYPE_H #define _CONSTR_TYPE_H -#include /* System-dependent types */ - struct asn1_TYPE_descriptor_s; /* Forward declaration */ struct asn1_TYPE_member_s; /* Forward declaration */ diff --git a/skeletons/constraints.c b/skeletons/constraints.c index d95e3cbd0..9c348851c 100644 --- a/skeletons/constraints.c +++ b/skeletons/constraints.c @@ -1,6 +1,5 @@ #include #include -#include int asn_generic_no_constraint(asn1_TYPE_descriptor_t *type_descriptor, diff --git a/skeletons/der_encoder.c b/skeletons/der_encoder.c index 4f1936f8e..3d5cc8594 100644 --- a/skeletons/der_encoder.c +++ b/skeletons/der_encoder.c @@ -3,7 +3,6 @@ * Redistribution and modifications are permitted subject to BSD license. */ #include -#include #include #include diff --git a/skeletons/der_encoder.h b/skeletons/der_encoder.h index fe64bccf9..2acccaafb 100644 --- a/skeletons/der_encoder.h +++ b/skeletons/der_encoder.h @@ -5,7 +5,7 @@ #ifndef _DER_ENCODER_H_ #define _DER_ENCODER_H_ -#include +#include struct asn1_TYPE_descriptor_s; /* Forward declaration */ diff --git a/skeletons/file-dependencies b/skeletons/file-dependencies index 25d10a079..559d2725f 100644 --- a/skeletons/file-dependencies +++ b/skeletons/file-dependencies @@ -43,8 +43,9 @@ constr_SET.h constr_SET.c constr_SET_OF.h constr_SET_OF.c asn_SET_OF.h COMMON-FILES: # This is a special section -asn_types.h +asn_application.h asn_internal.h +asn_types.h OCTET_STRING.h OCTET_STRING.c # This one is used too widely ber_decoder.h ber_decoder.c ber_tlv_length.h ber_tlv_length.c diff --git a/skeletons/xer_encoder.c b/skeletons/xer_encoder.c index e4581aaaf..876980e17 100644 --- a/skeletons/xer_encoder.c +++ b/skeletons/xer_encoder.c @@ -3,7 +3,6 @@ * Redistribution and modifications are permitted subject to BSD license. */ #include -#include #include #include #include @@ -43,7 +42,7 @@ xer_encode(asn1_TYPE_descriptor_t *td, void *sptr, } /* - * This is a helper function for xer_fprint, which directs all the incoming data + * This is a helper function for xer_fprint, which directs all incoming data * into the provided file descriptor. */ static int diff --git a/skeletons/xer_encoder.h b/skeletons/xer_encoder.h index 43c192d39..fbb7a8171 100644 --- a/skeletons/xer_encoder.h +++ b/skeletons/xer_encoder.h @@ -5,7 +5,7 @@ #ifndef _XER_ENCODER_H_ #define _XER_ENCODER_H_ -#include +#include struct asn1_TYPE_descriptor_s; /* Forward declaration */ From 47ae158d523397037a0f3b434fc6011f8156cd3d Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 24 Sep 2004 21:01:43 +0000 Subject: [PATCH 0395/1469] PRIdASN instead of lld git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@395 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 4 ++-- libasn1compiler/asn1c_constraint.c | 18 +++++++++--------- libasn1fix/asn1fix_crange.c | 6 +++--- libasn1fix/asn1fix_enum.c | 4 ++-- libasn1fix/asn1fix_misc.c | 4 ++-- libasn1print/asn1print.c | 9 ++++----- 6 files changed, 22 insertions(+), 23 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 01b32aa6e..3443ccf8d 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -98,7 +98,7 @@ asn1c_lang_C_type_common_INTEGER(arg_t *arg) { TQ_FOR(v, &(expr->members), next) { switch(v->expr_type) { case A1TC_UNIVERVAL: - OUT("\t%s\t= %lld,\n", + OUT("\t%s\t= %" PRIdASN ",\n", asn1c_make_identifier(0, expr->Identifier, v->Identifier, 0), @@ -969,7 +969,7 @@ _print_tag(arg_t *arg, struct asn1p_type_tag_s *tag) { case TC_NOCLASS: break; } - OUT(" | (%lld << 2))", tag->tag_value); + OUT(" | (%" PRIdASN " << 2))", tag->tag_value); return 0; } diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index 7de5e54d0..9f2edeca6 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -470,20 +470,20 @@ emit_range_comparison_code(arg_t *arg, asn1cnst_range_t *range, const char *varn } if(ignore_left) { - OUT("%s <= %lld", varname, - (long long)r->right.value); + OUT("%s <= %" PRIdASN, varname, + r->right.value); } else if(ignore_right) { - OUT("%s >= %lld", varname, - (long long)r->left.value); + OUT("%s >= %" PRIdASN, varname, + r->left.value); } else if(r->left.value == r->right.value) { - OUT("%s == %lld", varname, - (long long)r->right.value); + OUT("%s == %" PRIdASN, varname, + r->right.value); } else { - OUT("%s >= %lld && %s <= %lld", + OUT("%s >= %" PRIdASN " && %s <= %" PRIdASN, varname, - (long long)r->left.value, + r->left.value, varname, - (long long)r->right.value); + r->right.value); } if(r != range) OUT(")"); generated_something = 1; diff --git a/libasn1fix/asn1fix_crange.c b/libasn1fix/asn1fix_crange.c index e35ecad2a..f6e111139 100644 --- a/libasn1fix/asn1fix_crange.c +++ b/libasn1fix/asn1fix_crange.c @@ -157,7 +157,7 @@ _edge_value(const asn1cnst_edge_t *edge) { case ARE_MIN: strcpy(buf, "MIN"); break; case ARE_MAX: strcpy(buf, "MAX"); break; case ARE_VALUE: - snprintf(buf, sizeof(buf), "%lld", (long long)edge->value); + snprintf(buf, sizeof(buf), "%" PRIdASN, edge->value); } return buf; } @@ -280,9 +280,9 @@ static int _range_fill(asn1p_value_t *val, const asn1cnst_range_t *minmax, asn1c switch(val->type) { case ATV_INTEGER: if(type != ACT_EL_RANGE && type != ACT_CT_SIZE) { - FATAL("Integer %lld value invalid " + FATAL("Integer %" PRIdASN " value invalid " "for %s constraint at line %d", - (long long)val->value.v_integer, + val->value.v_integer, asn1p_constraint_type2str(type), lineno); return -1; } diff --git a/libasn1fix/asn1fix_enum.c b/libasn1fix/asn1fix_enum.c index 8a90a435d..4eb98135f 100644 --- a/libasn1fix/asn1fix_enum.c +++ b/libasn1fix/asn1fix_enum.c @@ -102,9 +102,9 @@ asn1f_fix_enum(arg_t *arg) { */ FATAL( "Enumeration %s at line %d: " - "Explicit value \"%s(%lld)\" " + "Explicit value \"%s(%" PRIdASN ")\" " "is not greater " - "than previous values (max %lld)", + "than previous values (max %" PRIdASN ")", expr->Identifier, ev->_lineno, ev->Identifier, diff --git a/libasn1fix/asn1fix_misc.c b/libasn1fix/asn1fix_misc.c index c022abce7..b049d1ae9 100644 --- a/libasn1fix/asn1fix_misc.c +++ b/libasn1fix/asn1fix_misc.c @@ -51,8 +51,8 @@ asn1f_printable_value(asn1p_value_t *v) { memcpy(buf + sizeof(buf) - 4, "...", 4); return buf; case ATV_INTEGER: - ret = snprintf(buf, sizeof(buf), "%lld", - (long long)v->value.v_integer); + ret = snprintf(buf, sizeof(buf), "%" PRIdASN, + v->value.v_integer); if(ret >= (ssize_t)sizeof(buf)) memcpy(buf + sizeof(buf) - 4, "...", 4); return buf; diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index e314defd4..886c94921 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -102,8 +102,7 @@ asn1print_oid(asn1p_oid_t *oid, enum asn1print_flags flags) { if(oid->arcs[ac].name) { printf("%s", oid->arcs[ac].name); if(oid->arcs[ac].number >= 0) { - printf("(%lld)", - (long long)oid->arcs[ac].number); + printf("(%" PRIdASN ")", oid->arcs[ac].number); } accum += strlen(oid->arcs[ac].name); } else { @@ -151,7 +150,7 @@ asn1print_tag(asn1p_expr_t *tc, enum asn1print_flags flags) { case TC_CONTEXT_SPECIFIC: break; } - printf("%lld]", (long long)tag->tag_value); + printf("%" PRIdASN "]", tag->tag_value); switch(tag->tag_mode) { case TM_DEFAULT: break; @@ -178,7 +177,7 @@ asn1print_value(asn1p_value_t *val, enum asn1print_flags flags) { printf("%f", val->value.v_double); return 0; case ATV_INTEGER: - printf("%lld", (long long)val->value.v_integer); + printf("%" PRIdASN, val->value.v_integer); return 0; case ATV_MIN: printf("MIN"); return 0; case ATV_MAX: printf("MAX"); return 0; @@ -367,7 +366,7 @@ asn1print_crange_value(asn1cnst_edge_t *edge, int as_char) { if(as_char) { printf("\"%c\"", (unsigned char)edge->value); } else { - printf("%lld", (long long)edge->value); + printf("%" PRIdASN, edge->value); } } return 0; From 74e9e3405137e515c781eb1d3d39f544bc87b987 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 24 Sep 2004 21:06:19 +0000 Subject: [PATCH 0396/1469] BER decoder restartability problem; unbe & enber; updated documentation git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@396 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 68adf0eb2..98244726e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,13 +1,18 @@ -0.9.6: 2004-Sep-22 +0.9.6: 2004-Sep-24 * Implemented BASIC-XER encoding support (X.693). - * Implemented unber(1) for generic BER decoding. + * Implemented unber(1) and enber(1) for BER<->XML translation. * Implemented CGI for online ASN.1 compilation (asn1c/webcgi). - * The X.509 decoder implemented (./examples/sample.source.PKIX1). + * Implemented the sample X.509 decoder (./examples/sample.source.PKIX1). * NamedType is now supported for SET OF/SEQUENCE OF type. * Added ASN1C_ENVIRONMENT_VERSION and get_asn1c_environment_version(). * Fixed ANY type decoding (Severity: high, Secruity impact: low). + * Fixed BER decoder restartability problem with certain primitive + types (BOOLEAN, INTEGER, and REAL). The problem occured when the + encoding of such type is split between several bytes. + (Severity: high, Security impact: low) + * Updated documentation. 0.9.5: 2004-Sep-17 From 00402a2f01468807c915b7cb9a65ddebc8fda58d Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 24 Sep 2004 23:46:19 +0000 Subject: [PATCH 0397/1469] oops, I meant PRIdASN git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@397 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/unber.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asn1c/unber.c b/asn1c/unber.c index 60f3a0362..38296b2f9 100644 --- a/asn1c/unber.c +++ b/asn1c/unber.c @@ -493,7 +493,7 @@ print_V(const char *fname, FILE *fp, ber_tlv_tag_t tlv_tag, ber_tlv_len_t tlv_le switch(etype) { case ASN_BASIC_INTEGER: case ASN_BASIC_ENUMERATED: - printf("%" PRIdMAX, collector); + printf("%" PRIdASN, collector); break; case ASN_BASIC_OBJECT_IDENTIFIER: if(vbuf) { From 7bbc577fc00111dbea09b85e7003f0862ab6d183 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 24 Sep 2004 23:51:53 +0000 Subject: [PATCH 0398/1469] proper keys in manual pages git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@398 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/enber.1 | 2 +- asn1c/unber.1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/asn1c/enber.1 b/asn1c/enber.1 index b3984336a..8b1f42e12 100644 --- a/asn1c/enber.1 +++ b/asn1c/enber.1 @@ -20,7 +20,7 @@ A single dash represents the standard input. .SH EXAMPLES Decode the BER sequence and immediately encode it back .Vb -\& enber \fB-p\fR \fIfilename.ber\fR | unber \fB-\fR > \fIreconstructed.ber\fR +\& unber \fB-p\fR \fIfilename.ber\fR | enber \fB-\fR > \fIreconstructed.ber\fR .Ve .SH SEE ALSO .TP diff --git a/asn1c/unber.1 b/asn1c/unber.1 index a96b0f5dc..bfedffa32 100644 --- a/asn1c/unber.1 +++ b/asn1c/unber.1 @@ -86,7 +86,7 @@ Decode the binary stream taken from the standard input: .Ve Decode the binary stream into the same stream (see \fIenber\fR\|(1)): .Vb -\& cat \fI...\fR | unber \fB-\fR | enber \fB-\fR > filename.ber\fI\fR +\& cat \fI...\fR | unber \fB-p\fR \fB-\fR | enber \fB-\fR > filename.ber\fI\fR .Ve .SH SEE ALSO .TP From b21cfd41d061a1749c3792081d9e53e3295a999c Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 26 Sep 2004 13:08:42 +0000 Subject: [PATCH 0399/1469] mentioned sample.source.PKIX1 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@399 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/README | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/examples/README b/examples/README index 58c58d2d5..682aaf9b9 100644 --- a/examples/README +++ b/examples/README @@ -3,8 +3,11 @@ This directory contains several convertors from a few known text formats into the ASN.1 modules, as well as examples of these formats and the sample convertor's output (generated by `make`). -To regenerate the .asn1 files, do `rm *.asn1; make`. +To regenerate the .asn1 files from the original RFC texts, do `rm *.asn1; make`. To compile the files using asn1c, try ../asn1c/asn1c -P rfc3280-*.asn1 + +The ./sample.source.PKIX1 directory contains the X.509 certificate decoder. + From 6678cb11c1990e5f816a5e0230d18ce9f72804fa Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 26 Sep 2004 13:10:40 +0000 Subject: [PATCH 0400/1469] clean-up; removed unnecessary field from type descriptor git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@400 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ANY.c | 5 +- skeletons/BIT_STRING.c | 22 +++--- skeletons/BMPString.c | 4 +- skeletons/BOOLEAN.c | 32 ++++---- skeletons/ENUMERATED.c | 6 +- skeletons/GeneralString.c | 1 - skeletons/GeneralizedTime.c | 19 ++--- skeletons/GraphicString.c | 1 - skeletons/IA5String.c | 1 - skeletons/INTEGER.c | 133 ++++---------------------------- skeletons/INTEGER.h | 7 +- skeletons/ISO646String.c | 1 - skeletons/NULL.c | 7 +- skeletons/NativeEnumerated.c | 1 - skeletons/NativeInteger.c | 9 +-- skeletons/NativeReal.c | 13 ++-- skeletons/NumericString.c | 1 - skeletons/OBJECT_IDENTIFIER.c | 85 ++++++-------------- skeletons/OBJECT_IDENTIFIER.h | 5 +- skeletons/OCTET_STRING.c | 40 ++++------ skeletons/ObjectDescriptor.c | 1 - skeletons/PrintableString.c | 1 - skeletons/REAL.c | 46 ++++++++--- skeletons/REAL.h | 6 +- skeletons/RELATIVE-OID.c | 14 ++-- skeletons/T61String.c | 1 - skeletons/TeletexString.c | 1 - skeletons/UTCTime.c | 15 ++-- skeletons/UTF8String.c | 5 +- skeletons/UniversalString.c | 3 +- skeletons/VideotexString.c | 1 - skeletons/VisibleString.c | 1 - skeletons/asn_internal.h | 23 ++++-- skeletons/ber_decoder.c | 8 +- skeletons/ber_decoder.h | 3 +- skeletons/ber_tlv_tag.h | 2 +- skeletons/constr_CHOICE.c | 14 ++-- skeletons/constr_SEQUENCE.c | 28 +++---- skeletons/constr_SEQUENCE_OF.c | 2 +- skeletons/constr_SET.c | 28 +++---- skeletons/constr_SET_OF.c | 29 ++++--- skeletons/constr_TYPE.c | 2 +- skeletons/constr_TYPE.h | 4 +- skeletons/constraints.c | 4 +- skeletons/constraints.h | 11 +-- skeletons/der_encoder.c | 11 +-- skeletons/der_encoder.h | 1 + skeletons/file-dependencies | 1 + skeletons/tests/check-INTEGER.c | 1 + skeletons/tests/check-OIDs.c | 2 +- skeletons/tests/check-REAL.c | 2 +- skeletons/xer_encoder.h | 2 +- 52 files changed, 251 insertions(+), 415 deletions(-) diff --git a/skeletons/ANY.c b/skeletons/ANY.c index ed529c571..1825da134 100644 --- a/skeletons/ANY.c +++ b/skeletons/ANY.c @@ -18,9 +18,8 @@ asn1_TYPE_descriptor_t asn1_DEF_ANY = { ANY_encode_xer, 0, /* Use generic outmost tag fetcher */ 0, 0, 0, 0, - -1, /* Both ways are fine (primitive and constructed) */ 0, 0, /* No members */ - (void *)1 /* Special indicator that this is an ANY type */ + (void *)2 /* Special indicator that this is an ANY type */ }; @@ -139,7 +138,7 @@ static int ANY__consume_bytes(const void *buffer, size_t size, void *key) { size_t nsize = (arg->size ? arg->size << 2 : 16) + size; void *p = REALLOC(arg->buffer, nsize); if(!p) return -1; - (void *)arg->buffer = p; + arg->buffer = (uint8_t *)p; arg->size = nsize; } diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index 274dec9bb..e0e2507a3 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -4,6 +4,7 @@ */ #include #include +#include /* * BIT STRING basic type description. @@ -27,9 +28,8 @@ asn1_TYPE_descriptor_t asn1_DEF_BIT_STRING = { asn1_DEF_BIT_STRING_tags, /* Same as above */ sizeof(asn1_DEF_BIT_STRING_tags) / sizeof(asn1_DEF_BIT_STRING_tags[0]), - -1, /* Both ways are fine */ 0, 0, /* No members */ - (void *)-1 /* Special indicator that this is a BIT STRING */ + (void *)1 /* Special indicator that this is a BIT STRING */ }; /* @@ -144,9 +144,10 @@ BIT_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, (void)td; /* Unused argument */ - if(!st || !st->buf) return cb("", 8, app_key); + if(!st || !st->buf) + return (cb("", 8, app_key) < 0) ? -1 : 0; - ilevel += 4; + ilevel++; buf = st->buf; end = buf + st->size; @@ -156,12 +157,9 @@ BIT_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, for(buf++; buf < end; buf++) { if(((buf - st->buf) - 1) % 16 == 0 && (st->size > 17) && buf != st->buf+1) { - int i; - /* Indentation */ - if(cb("\n", 1, app_key)) return -1; - for(i = 0; i < ilevel; i++) cb(" ", 1, app_key); + _i_INDENT(1); /* Dump the string */ - if(cb(scratch, p - scratch, app_key)) return -1; + if(cb(scratch, p - scratch, app_key) < 0) return -1; p = scratch; } *p++ = h2c[*buf >> 4]; @@ -173,13 +171,11 @@ BIT_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, p--; /* Eat the tailing space */ if((st->size > 17)) { - int i; - if(cb("\n", 1, app_key)) return -1; - for(i = 0; i < ilevel; i++) cb(" ", 1, app_key); + _i_INDENT(1); } /* Dump the incomplete 16-bytes row */ - if(cb(scratch, p - scratch, app_key)) + if(cb(scratch, p - scratch, app_key) < 0) return -1; } diff --git a/skeletons/BMPString.c b/skeletons/BMPString.c index bdbd40d62..2a1129940 100644 --- a/skeletons/BMPString.c +++ b/skeletons/BMPString.c @@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_BMPString = { asn1_DEF_BMPString_tags, sizeof(asn1_DEF_BMPString_tags) / sizeof(asn1_DEF_BMPString_tags[0]), - -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -101,7 +100,8 @@ BMPString_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, (void)td; /* Unused argument */ (void)ilevel; /* Unused argument */ - if(!st || !st->buf) return cb("", 8, app_key); + if(!st || !st->buf) + return (cb("", 8, app_key) < 0) ? -1 : 0; if(BMPString__dump(st, cb, app_key) < 0) return -1; diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c index c7a1cac2b..ef6926a6f 100644 --- a/skeletons/BOOLEAN.c +++ b/skeletons/BOOLEAN.c @@ -25,7 +25,6 @@ asn1_TYPE_descriptor_t asn1_DEF_BOOLEAN = { sizeof(asn1_DEF_BOOLEAN_tags) / sizeof(asn1_DEF_BOOLEAN_tags[0]), asn1_DEF_BOOLEAN_tags, /* Same as above */ sizeof(asn1_DEF_BOOLEAN_tags) / sizeof(asn1_DEF_BOOLEAN_tags[0]), - 0, /* Always in primitive form */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -43,7 +42,7 @@ BOOLEAN_decode_ber(asn1_TYPE_descriptor_t *td, ber_tlv_len_t lidx; if(st == NULL) { - (void *)st = *bool_value = CALLOC(1, sizeof(*st)); + st = (BOOLEAN_t *)(*bool_value = CALLOC(1, sizeof(*st))); if(st == NULL) { rval.code = RC_FAIL; rval.consumed = 0; @@ -57,7 +56,7 @@ BOOLEAN_decode_ber(asn1_TYPE_descriptor_t *td, /* * Check tags. */ - rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, &length, 0); + rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, 0, &length, 0); if(rval.code != RC_OK) return rval; @@ -101,7 +100,7 @@ BOOLEAN_encode_der(asn1_TYPE_descriptor_t *td, void *sptr, asn_enc_rval_t erval; BOOLEAN_t *st = (BOOLEAN_t *)sptr; - erval.encoded = der_write_tags(td, 1, tag_mode, tag, cb, app_key); + erval.encoded = der_write_tags(td, 1, tag_mode, 0, tag, cb, app_key); if(erval.encoded == -1) { erval.failed_type = td; erval.structure_ptr = sptr; @@ -110,11 +109,10 @@ BOOLEAN_encode_der(asn1_TYPE_descriptor_t *td, void *sptr, if(cb) { uint8_t bool_value; - ssize_t ret; - bool_value = *st?0xff:0; /* 0xff mandated by DER */ - ret = cb(&bool_value, 1, app_key); - if(ret == -1) { + bool_value = *st ? 0xff : 0; /* 0xff mandated by DER */ + + if(cb(&bool_value, 1, app_key) < 0) { erval.encoded = -1; erval.failed_type = td; erval.structure_ptr = sptr; @@ -154,18 +152,26 @@ int BOOLEAN_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const BOOLEAN_t *st = (const BOOLEAN_t *)sptr; + const char *buf; + size_t buflen; (void)td; /* Unused argument */ (void)ilevel; /* Unused argument */ if(st) { - if(*st) - return cb("TRUE", 4, app_key); - else - return cb("FALSE", 5, app_key); + if(*st) { + buf = "TRUE"; + buflen = 4; + } else { + buf = "FALSE"; + buflen = 5; + } } else { - return cb("", 8, app_key); + buf = ""; + buflen = 8; } + + return (cb(buf, buflen, app_key) < 0) ? -1 : 0; } void diff --git a/skeletons/ENUMERATED.c b/skeletons/ENUMERATED.c index 158119d67..821a4674b 100644 --- a/skeletons/ENUMERATED.c +++ b/skeletons/ENUMERATED.c @@ -4,6 +4,7 @@ */ #include #include +#include /* * ENUMERATED basic type description. @@ -13,10 +14,10 @@ static ber_tlv_tag_t asn1_DEF_ENUMERATED_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_ENUMERATED = { "ENUMERATED", - INTEGER_free, /* Implemented in terms of INTEGER */ + ASN__PRIMITIVE_TYPE_free, INTEGER_print, /* Implemented in terms of INTEGER */ asn_generic_no_constraint, - INTEGER_decode_ber, /* Implemented in terms of INTEGER */ + ber_decode_primitive, INTEGER_encode_der, /* Implemented in terms of INTEGER */ 0, /* Not implemented yet */ INTEGER_encode_xer, /* Implemented in terms of INTEGER */ @@ -25,7 +26,6 @@ asn1_TYPE_descriptor_t asn1_DEF_ENUMERATED = { sizeof(asn1_DEF_ENUMERATED_tags) / sizeof(asn1_DEF_ENUMERATED_tags[0]), asn1_DEF_ENUMERATED_tags, /* Same as above */ sizeof(asn1_DEF_ENUMERATED_tags) / sizeof(asn1_DEF_ENUMERATED_tags[0]), - 0, /* Primitive */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/GeneralString.c b/skeletons/GeneralString.c index c9d82480e..02c1c7e3e 100644 --- a/skeletons/GeneralString.c +++ b/skeletons/GeneralString.c @@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_GeneralString = { asn1_DEF_GeneralString_tags, sizeof(asn1_DEF_GeneralString_tags) / sizeof(asn1_DEF_GeneralString_tags[0]), - -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 8f8fff21e..161898f3c 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -110,7 +110,9 @@ static time_t timegm(struct tm *tm) { * GeneralizedTime basic type description. */ static ber_tlv_tag_t asn1_DEF_GeneralizedTime_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (24 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (24 << 2)), /* [UNIVERSAL 24] IMPLICIT ...*/ + (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), /* [UNIVERSAL 26] IMPLICIT ...*/ + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn1_TYPE_descriptor_t asn1_DEF_GeneralizedTime = { "GeneralizedTime", @@ -124,11 +126,10 @@ asn1_TYPE_descriptor_t asn1_DEF_GeneralizedTime = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_GeneralizedTime_tags, sizeof(asn1_DEF_GeneralizedTime_tags) - / sizeof(asn1_DEF_GeneralizedTime_tags[0]), - asn1_DEF_GeneralizedTime_tags, /* Same as above */ + / sizeof(asn1_DEF_GeneralizedTime_tags[0]) - 2, + asn1_DEF_GeneralizedTime_tags, sizeof(asn1_DEF_GeneralizedTime_tags) / sizeof(asn1_DEF_GeneralizedTime_tags[0]), - -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -242,16 +243,16 @@ GeneralizedTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, errno = EPERM; if(asn_GT2time(st, &tm, 1) == -1 && errno != EPERM) - return cb("", 11, app_key); + return (cb("", 11, app_key) < 0) ? -1 : 0; ret = snprintf(buf, sizeof(buf), "%04d-%02d-%02d %02d:%02d%02d (GMT)", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); assert(ret > 0 && ret < (int)sizeof(buf)); - return cb(buf, ret, app_key); + return (cb(buf, ret, app_key) < 0) ? -1 : 0; } else { - return cb("", 8, app_key); + return (cb("", 8, app_key) < 0) ? -1 : 0; } } @@ -493,7 +494,7 @@ asn_time2GT(GeneralizedTime_t *opt_gt, const struct tm *tm, int force_gmt) { } /* Pre-allocate a buffer of sufficient yet small length */ - (void *)buf = MALLOC(buf_size); + buf = (char *)MALLOC(buf_size); if(!buf) return 0; gmtoff = GMTOFF(*tm); @@ -536,7 +537,7 @@ asn_time2GT(GeneralizedTime_t *opt_gt, const struct tm *tm, int force_gmt) { if(opt_gt->buf) FREEMEM(opt_gt->buf); } else { - (void *)opt_gt = CALLOC(1, sizeof *opt_gt); + opt_gt = (GeneralizedTime_t *)CALLOC(1, sizeof *opt_gt); if(!opt_gt) { free(buf); return 0; } } diff --git a/skeletons/GraphicString.c b/skeletons/GraphicString.c index e8fa79758..98a8d4802 100644 --- a/skeletons/GraphicString.c +++ b/skeletons/GraphicString.c @@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_GraphicString = { asn1_DEF_GraphicString_tags, sizeof(asn1_DEF_GraphicString_tags) / sizeof(asn1_DEF_GraphicString_tags[0]), - -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/IA5String.c b/skeletons/IA5String.c index a2c828dda..e9d2a6117 100644 --- a/skeletons/IA5String.c +++ b/skeletons/IA5String.c @@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_IA5String = { asn1_DEF_IA5String_tags, sizeof(asn1_DEF_IA5String_tags) / sizeof(asn1_DEF_IA5String_tags[0]), - -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 73b5959c5..89be79eca 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -4,6 +4,7 @@ */ #include #include +#include /* Encoder and decoder of a primitive */ #include #include @@ -15,10 +16,10 @@ static ber_tlv_tag_t asn1_DEF_INTEGER_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_INTEGER = { "INTEGER", - INTEGER_free, + ASN__PRIMITIVE_TYPE_free, INTEGER_print, asn_generic_no_constraint, - INTEGER_decode_ber, + ber_decode_primitive, INTEGER_encode_der, 0, /* Not implemented yet */ INTEGER_encode_xer, @@ -27,89 +28,21 @@ asn1_TYPE_descriptor_t asn1_DEF_INTEGER = { sizeof(asn1_DEF_INTEGER_tags) / sizeof(asn1_DEF_INTEGER_tags[0]), asn1_DEF_INTEGER_tags, /* Same as above */ sizeof(asn1_DEF_INTEGER_tags) / sizeof(asn1_DEF_INTEGER_tags[0]), - 0, /* Always in primitive form */ 0, 0, /* No members */ 0 /* No specifics */ }; -/* - * Decode INTEGER type. - */ -ber_dec_rval_t -INTEGER_decode_ber(asn1_TYPE_descriptor_t *td, - void **int_structure, void *buf_ptr, size_t size, int tag_mode) { - INTEGER_t *st = (INTEGER_t *)*int_structure; - ber_dec_rval_t rval; - ber_tlv_len_t length; - - /* - * If the structure is not there, allocate it. - */ - if(st == NULL) { - (void *)st = *int_structure = CALLOC(1, sizeof(*st)); - if(st == NULL) { - rval.code = RC_FAIL; - rval.consumed = 0; - return rval; - } - } - - ASN_DEBUG("Decoding %s as INTEGER (tm=%d)", - td->name, tag_mode); - - /* - * Check tags. - */ - rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, &length, 0); - if(rval.code != RC_OK) - return rval; - - ASN_DEBUG("%s length is %d bytes", td->name, (int)length); - - /* - * Make sure we have this length. - */ - buf_ptr = ((char *)buf_ptr) + rval.consumed; - size -= rval.consumed; - if(length > (ber_tlv_len_t)size) { - rval.code = RC_WMORE; - rval.consumed = 0; - return rval; - } - - st->buf = (uint8_t *)MALLOC(length); - if(st->buf) { - st->size = length; - } else { - rval.code = RC_FAIL; - rval.consumed = 0; - return rval; - } - - memcpy(st->buf, buf_ptr, st->size); - - rval.code = RC_OK; - rval.consumed += length; - - ASN_DEBUG("Took %ld/%ld bytes to encode %s", - (long)rval.consumed, - (long)length, td->name); - - return rval; -} - /* * Encode INTEGER type using DER. */ asn_enc_rval_t -INTEGER_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, +INTEGER_encode_der(asn1_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - asn_enc_rval_t erval; - INTEGER_t *st = (INTEGER_t *)ptr; + INTEGER_t *st = (INTEGER_t *)sptr; ASN_DEBUG("%s %s as INTEGER (tm=%d)", - cb?"Encoding":"Estimating", sd->name, tag_mode); + cb?"Encoding":"Estimating", td->name, tag_mode); /* * Canonicalize integer in the buffer. @@ -155,32 +88,7 @@ INTEGER_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, } /* if(1) */ - erval.encoded = der_write_tags(sd, st->size, tag_mode, tag, - cb, app_key); - ASN_DEBUG("INTEGER %s wrote tags %d", sd->name, (int)erval.encoded); - if(erval.encoded == -1) { - erval.failed_type = sd; - erval.structure_ptr = ptr; - return erval; - } - - if(cb && st->buf) { - ssize_t ret; - - ret = cb(st->buf, st->size, app_key); - if(ret == -1) { - erval.encoded = -1; - erval.failed_type = sd; - erval.structure_ptr = ptr; - return erval; - } - } else { - assert(st->buf || st->size == 0); - } - - erval.encoded += st->size; - - return erval; + return der_encode_primitive(td, sptr, tag_mode, tag, cb, app_key); } /* @@ -254,13 +162,17 @@ int INTEGER_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const INTEGER_t *st = (const INTEGER_t *)sptr; + ssize_t ret; (void)td; (void)ilevel; - if(!st && !st->buf) return cb("", 8, app_key); + if(!st && !st->buf) + ret = cb("", 8, app_key); + else + ret = INTEGER__dump(st, cb, app_key); - return (INTEGER__dump(st, cb, app_key) < 0) ? -1 : 0; + return (ret < 0) ? -1 : 0; } asn_enc_rval_t @@ -282,25 +194,6 @@ INTEGER_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, return er; } -void -INTEGER_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { - INTEGER_t *st = (INTEGER_t *)ptr; - - if(!td || !st) - return; - - ASN_DEBUG("Freeing %s as INTEGER (%d, %p, %p)", - td->name, contents_only, st, st->buf); - - if(st->buf) { - FREEMEM(st->buf); - } - - if(!contents_only) { - FREEMEM(st); - } -} - int asn1_INTEGER2long(const INTEGER_t *iptr, long *lptr) { uint8_t *b, *end; diff --git a/skeletons/INTEGER.h b/skeletons/INTEGER.h index 89ab1af59..b42321b49 100644 --- a/skeletons/INTEGER.h +++ b/skeletons/INTEGER.h @@ -6,15 +6,12 @@ #define _INTEGER_H_ #include +#include -typedef struct INTEGER { - uint8_t *buf; /* Buffer with consecutive INTEGER bits (big-endian) */ - int size; /* Size of the buffer */ -} INTEGER_t; +typedef ASN__PRIMITIVE_TYPE_t INTEGER_t; extern asn1_TYPE_descriptor_t asn1_DEF_INTEGER; -asn_struct_free_f INTEGER_free; asn_struct_print_f INTEGER_print; ber_type_decoder_f INTEGER_decode_ber; der_type_encoder_f INTEGER_encode_der; diff --git a/skeletons/ISO646String.c b/skeletons/ISO646String.c index e5a4d444c..dd94be2b4 100644 --- a/skeletons/ISO646String.c +++ b/skeletons/ISO646String.c @@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_ISO646String = { asn1_DEF_ISO646String_tags, sizeof(asn1_DEF_ISO646String_tags) / sizeof(asn1_DEF_ISO646String_tags[0]), - -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/NULL.c b/skeletons/NULL.c index e15b9af86..8276368cc 100644 --- a/skeletons/NULL.c +++ b/skeletons/NULL.c @@ -26,7 +26,6 @@ asn1_TYPE_descriptor_t asn1_DEF_NULL = { sizeof(asn1_DEF_NULL_tags) / sizeof(asn1_DEF_NULL_tags[0]), asn1_DEF_NULL_tags, /* Same as above */ sizeof(asn1_DEF_NULL_tags) / sizeof(asn1_DEF_NULL_tags[0]), - 0, /* Always in primitive form */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -37,7 +36,7 @@ NULL_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t erval; - erval.encoded = der_write_tags(td, 0, tag_mode, tag, cb, app_key); + erval.encoded = der_write_tags(td, 0, tag_mode, 0, tag, cb, app_key); if(erval.encoded == -1) { erval.failed_type = td; erval.structure_ptr = ptr; @@ -73,8 +72,8 @@ NULL_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, (void)ilevel; /* Unused argument */ if(sptr) { - return cb("", 9, app_key); + return (cb("", 9, app_key) < 0) ? -1 : 0; } else { - return cb("", 8, app_key); + return (cb("", 8, app_key) < 0) ? -1 : 0; } } diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c index ec4dd88db..bbbc3fb47 100644 --- a/skeletons/NativeEnumerated.c +++ b/skeletons/NativeEnumerated.c @@ -32,7 +32,6 @@ asn1_TYPE_descriptor_t asn1_DEF_NativeEnumerated = { sizeof(asn1_DEF_NativeEnumerated_tags) / sizeof(asn1_DEF_NativeEnumerated_tags[0]), asn1_DEF_NativeEnumerated_tags, /* Same as above */ sizeof(asn1_DEF_NativeEnumerated_tags) / sizeof(asn1_DEF_NativeEnumerated_tags[0]), - 0, /* Always in primitive form */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index aac5f86b3..2310c07cc 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -34,7 +34,6 @@ asn1_TYPE_descriptor_t asn1_DEF_NativeInteger = { sizeof(asn1_DEF_NativeInteger_tags) / sizeof(asn1_DEF_NativeInteger_tags[0]), asn1_DEF_NativeInteger_tags, /* Same as above */ sizeof(asn1_DEF_NativeInteger_tags) / sizeof(asn1_DEF_NativeInteger_tags[0]), - 0, /* Always in primitive form */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -53,7 +52,7 @@ NativeInteger_decode_ber(asn1_TYPE_descriptor_t *td, * If the structure is not there, allocate it. */ if(Int == NULL) { - (void *)Int = *int_ptr = CALLOC(1, sizeof(*Int)); + Int = (int *)(*int_ptr = CALLOC(1, sizeof(*Int))); if(Int == NULL) { rval.code = RC_FAIL; rval.consumed = 0; @@ -67,7 +66,7 @@ NativeInteger_decode_ber(asn1_TYPE_descriptor_t *td, /* * Check tags. */ - rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, &length, 0); + rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, 0, &length, 0); if(rval.code != RC_OK) return rval; @@ -199,9 +198,9 @@ NativeInteger_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, if(Int) { ret = snprintf(scratch, sizeof(scratch), "%d", *Int); assert(ret > 0 && ret < (int)sizeof(scratch)); - return cb(scratch, ret, app_key); + return (cb(scratch, ret, app_key) < 0) ? -1 : 0; } else { - return cb("", 8, app_key); + return (cb("", 8, app_key) < 0) ? -1 : 0; } } diff --git a/skeletons/NativeReal.c b/skeletons/NativeReal.c index 1151087fa..8fc9ca63b 100644 --- a/skeletons/NativeReal.c +++ b/skeletons/NativeReal.c @@ -11,7 +11,6 @@ */ #include #include -#include #include #include @@ -35,7 +34,6 @@ asn1_TYPE_descriptor_t asn1_DEF_NativeReal = { sizeof(asn1_DEF_NativeReal_tags) / sizeof(asn1_DEF_NativeReal_tags[0]), asn1_DEF_NativeReal_tags, /* Same as above */ sizeof(asn1_DEF_NativeReal_tags) / sizeof(asn1_DEF_NativeReal_tags[0]), - 0, /* Always in primitive form */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -68,7 +66,7 @@ NativeReal_decode_ber(asn1_TYPE_descriptor_t *td, /* * Check tags. */ - rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, &length, 0); + rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, 0, &length, 0); if(rval.code != RC_OK) return rval; @@ -132,8 +130,8 @@ NativeReal_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, return erval; } - /* Encode fake REAL */ - erval = INTEGER_encode_der(td, &tmp, tag_mode, tag, cb, app_key); + /* Encode a fake REAL */ + erval = der_encode_primitive(td, &tmp, tag_mode, tag, cb, app_key); if(erval.encoded == -1) { assert(erval.structure_ptr == &tmp); erval.structure_ptr = ptr; @@ -148,13 +146,12 @@ NativeReal_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, asn_app_consume_bytes_f *cb, void *app_key) { const double *Dbl = (const double *)sptr; asn_enc_rval_t er; - double d; (void)ilevel; if(!Dbl) _ASN_ENCODE_FAILED; - er.encoded = REAL__dump(d, flags & XER_F_CANONICAL, cb, app_key); + er.encoded = REAL__dump(*Dbl, flags & XER_F_CANONICAL, cb, app_key); if(er.encoded < 0) _ASN_ENCODE_FAILED; return er; @@ -171,7 +168,7 @@ NativeReal_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, (void)td; /* Unused argument */ (void)ilevel; /* Unused argument */ - if(!Dbl) return cb("", 8, app_key); + if(!Dbl) return (cb("", 8, app_key) < 0) ? -1 : 0; return (REAL__dump(*Dbl, 0, cb, app_key) < 0) ? -1 : 0; } diff --git a/skeletons/NumericString.c b/skeletons/NumericString.c index b4a6df92f..fa4355802 100644 --- a/skeletons/NumericString.c +++ b/skeletons/NumericString.c @@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_NumericString = { asn1_DEF_NumericString_tags, sizeof(asn1_DEF_NumericString_tags) / sizeof(asn1_DEF_NumericString_tags[0]), - -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index 43ced796d..9e8f2e2a2 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -16,11 +16,11 @@ static ber_tlv_tag_t asn1_DEF_OBJECT_IDENTIFIER_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_OBJECT_IDENTIFIER = { "OBJECT IDENTIFIER", - INTEGER_free, + ASN__PRIMITIVE_TYPE_free, OBJECT_IDENTIFIER_print, OBJECT_IDENTIFIER_constraint, - INTEGER_decode_ber, /* Implemented in terms of INTEGER type */ - OBJECT_IDENTIFIER_encode_der, + ber_decode_primitive, + der_encode_primitive, 0, /* Not implemented yet */ OBJECT_IDENTIFIER_encode_xer, 0, /* Use generic outmost tag fetcher */ @@ -30,52 +30,11 @@ asn1_TYPE_descriptor_t asn1_DEF_OBJECT_IDENTIFIER = { asn1_DEF_OBJECT_IDENTIFIER_tags, /* Same as above */ sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags) / sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags[0]), - 0, /* Always in primitive form */ 0, 0, /* No members */ 0 /* No specifics */ }; -/* - * Encode OBJECT IDENTIFIER type using DER. - */ -asn_enc_rval_t -OBJECT_IDENTIFIER_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, - int tag_mode, ber_tlv_tag_t tag, - asn_app_consume_bytes_f *cb, void *app_key) { - asn_enc_rval_t erval; - OBJECT_IDENTIFIER_t *st = (OBJECT_IDENTIFIER_t *)ptr; - - ASN_DEBUG("%s %s as OBJECT IDENTIFIER (tm=%d)", - cb?"Encoding":"Estimating", sd->name, tag_mode); - - erval.encoded = der_write_tags(sd, st->size, tag_mode, tag, - cb, app_key); - ASN_DEBUG("OBJECT IDENTIFIER %s wrote tags %d", - sd->name, (int)erval.encoded); - if(erval.encoded == -1) { - erval.failed_type = sd; - erval.structure_ptr = ptr; - return erval; - } - - if(cb && st->buf) { - int ret = cb(st->buf, st->size, app_key); - if(ret < 0) { - erval.encoded = -1; - erval.failed_type = sd; - erval.structure_ptr = ptr; - return erval; - } - } else { - assert(st->buf || st->size == 0); - } - - erval.encoded += st->size; - - return erval; -} - int OBJECT_IDENTIFIER_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { @@ -101,11 +60,12 @@ OBJECT_IDENTIFIER_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, int -OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed int add, void *rvbuf, unsigned int rvsize) { +OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed int add, void *rvbufp, unsigned int rvsize) { unsigned LE __attribute__ ((unused)) = 1; /* Little endian (x86) */ uint8_t *arcend = arcbuf + arclen; /* End of arc */ - void *rvstart = rvbuf; /* Original start of the value buffer */ unsigned int cache = 0; /* No more than 14 significant bits */ + unsigned char *rvbuf = (unsigned char *)rvbufp; + unsigned char *rvstart = rvbuf; /* Original start of the value buffer */ int inc; /* Return value growth direction */ rvsize *= CHAR_BIT; /* bytes to bits */ @@ -155,15 +115,15 @@ OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed in errno = ERANGE; /* Overflow */ return -1; } - *(unsigned long *)rvbuf = accum + add; + *(unsigned long *)rvbuf = accum + add; /* alignment OK! */ return 0; } #ifndef WORDS_BIGENDIAN if(*(unsigned char *)&LE) { /* Little endian (x86) */ /* "Convert" to big endian */ - (unsigned char *)rvbuf += rvsize / CHAR_BIT - 1; - ((unsigned char *)rvstart)--; + rvbuf += rvsize / CHAR_BIT - 1; + rvstart--; inc = -1; /* Descending */ } else #endif /* !WORDS_BIGENDIAN */ @@ -175,8 +135,8 @@ OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed in /* Clear the high unused bits */ for(bits = rvsize - arclen; bits > CHAR_BIT; - (unsigned char *)rvbuf += inc, bits -= CHAR_BIT) - *(unsigned char *)rvbuf = 0; + rvbuf += inc, bits -= CHAR_BIT) + *rvbuf = 0; /* Fill the body of a value */ for(; arcbuf < arcend; arcbuf++) { @@ -184,25 +144,24 @@ OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed in bits += 7; if(bits >= CHAR_BIT) { bits -= CHAR_BIT; - *(unsigned char *)rvbuf = (cache >> bits); - (unsigned char *)rvbuf += inc; + *rvbuf = (cache >> bits); + rvbuf += inc; } } if(bits) { - *(unsigned char *)rvbuf = cache; - (unsigned char *)rvbuf += inc; + *rvbuf = cache; + rvbuf += inc; } } if(add) { - for((unsigned char *)rvbuf -= inc; rvbuf != rvstart; (unsigned char *)rvbuf -= inc) { - int v = add + *(unsigned char *)rvbuf; + for(rvbuf -= inc; rvbuf != rvstart; rvbuf -= inc) { + int v = add + *rvbuf; if(v & (-1 << CHAR_BIT)) { - *(unsigned char *)rvbuf - = (unsigned char)(v + (1 << CHAR_BIT)); + *rvbuf = (unsigned char)(v + (1 << CHAR_BIT)); add = -1; } else { - *(unsigned char *)rvbuf = v; + *rvbuf = v; break; } } @@ -331,16 +290,16 @@ OBJECT_IDENTIFIER_print(asn1_TYPE_descriptor_t *td, const void *sptr, (void)ilevel; /* Unused argument */ if(!st || !st->buf) - return cb("", 8, app_key); + return (cb("", 8, app_key) < 0) ? -1 : 0; /* Dump preamble */ - if(cb("{ ", 2, app_key)) + if(cb("{ ", 2, app_key) < 0) return -1; if(OBJECT_IDENTIFIER__dump_body(st, cb, app_key) < 0) return -1; - return cb(" }", 2, app_key); + return (cb(" }", 2, app_key) < 0) ? -1 : 0; } int diff --git a/skeletons/OBJECT_IDENTIFIER.h b/skeletons/OBJECT_IDENTIFIER.h index e232f70b7..3ccbc6493 100644 --- a/skeletons/OBJECT_IDENTIFIER.h +++ b/skeletons/OBJECT_IDENTIFIER.h @@ -5,9 +5,10 @@ #ifndef _OBJECT_IDENTIFIER_H_ #define _OBJECT_IDENTIFIER_H_ -#include +#include +#include -typedef INTEGER_t OBJECT_IDENTIFIER_t; /* Implemented via INTEGER */ +typedef ASN__PRIMITIVE_TYPE_t OBJECT_IDENTIFIER_t; extern asn1_TYPE_descriptor_t asn1_DEF_OBJECT_IDENTIFIER; diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index df6f86e82..6a72d1a19 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -29,7 +29,6 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { asn1_DEF_OCTET_STRING_tags, /* Same as above */ sizeof(asn1_DEF_OCTET_STRING_tags) / sizeof(asn1_DEF_OCTET_STRING_tags[0]), - -1, /* Both ways are fine (primitive and constructed) */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -161,10 +160,9 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, int tlv_constr; enum type_type_e { _TT_GENERIC = 0, /* Just a random OCTET STRING */ - _TT_BIT_STRING = -1, /* BIT STRING type, a special case */ - _TT_ANY = 1, /* ANY type, a special case too */ - } type_type - = (enum type_type_e)(int)td->specifics; /* An ugly hack */ + _TT_BIT_STRING = 1, /* BIT STRING type, a special case */ + _TT_ANY = 2, /* ANY type, a special case too */ + } type_type = (enum type_type_e)(int)td->specifics; ASN_DEBUG("Decoding %s as %s (frame %ld)", td->name, @@ -189,7 +187,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, * Check tags. */ rval = ber_check_tags(td, ctx, - buf_ptr, size, tag_mode, + buf_ptr, size, tag_mode, -1, &ctx->left, &tlv_constr); if(rval.code != RC_OK) { RETURN(rval.code); @@ -234,8 +232,9 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, ber_tlv_len_t tlv_len; ber_tlv_tag_t expected_tag; ssize_t tl, ll; - ssize_t Left = ((!sel||sel->left==-1||sel->left >= size) - ?size:sel->left); + /* This one works even if (sel->left == -1) */ + ssize_t Left = ((!sel||(size_t)sel->left >= size) + ?size:(size_t)sel->left); ASN_DEBUG("fetch tag(size=%d,L=%d), %sstack, left=%d, want0=%d", @@ -475,8 +474,8 @@ OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, asn_enc_rval_t erval; OCTET_STRING_t *st = (OCTET_STRING_t *)ptr; int add_byte = 0; - int is_bit_str = (td->specifics == (void *)-1); - int is_ANY_type = (td->specifics == (void *)1); + int is_bit_str = (td->specifics == (void *)1); + int is_ANY_type = (td->specifics == (void *)2); ASN_DEBUG("%s %s as OCTET STRING", cb?"Estimating":"Encoding", td->name); @@ -498,7 +497,7 @@ OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, erval.encoded = 0; } else { erval.encoded = der_write_tags(td, st->size + add_byte, - tag_mode, tag, cb, app_key); + tag_mode, 0, tag, cb, app_key); if(erval.encoded == -1) { erval.failed_type = td; erval.structure_ptr = ptr; @@ -510,7 +509,6 @@ OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, uint8_t zero; uint8_t *buf; int size; - ssize_t ret; /* BIT STRING-aware handling */ if(add_byte) { @@ -527,8 +525,7 @@ OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, } if(size) { - ret = cb(buf, size, app_key); - if(ret == -1) { + if(cb(buf, size, app_key) < 0) { erval.encoded = -1; erval.failed_type = td; erval.structure_ptr = ptr; @@ -636,11 +633,10 @@ OCTET_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, uint8_t *buf; uint8_t *end; size_t i; - int lvl; (void)td; /* Unused argument */ - if(!st || !st->buf) return cb("", 8, app_key); + if(!st || !st->buf) return (cb("", 8, app_key) < 0) ? -1 : 0; /* * Dump the contents of the buffer in hexadecimal. @@ -649,11 +645,9 @@ OCTET_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, end = buf + st->size; for(i = 0; buf < end; buf++, i++) { if(!(i % 16) && (i || st->size > 16)) { - if(cb(scratch, p - scratch, app_key) - || cb("\n", 1, app_key)) + if(cb(scratch, p - scratch, app_key) < 0) return -1; - for(lvl = 0; lvl < ilevel; lvl++) - cb(" ", 1, app_key); + _i_INDENT(1); p = scratch; } *p++ = h2c[(*buf >> 4) & 0x0F]; @@ -663,7 +657,7 @@ OCTET_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, if(p > scratch) { p--; /* Remove the tail space */ - if(cb(scratch, p - scratch, app_key)) + if(cb(scratch, p - scratch, app_key) < 0) return -1; } @@ -679,9 +673,9 @@ OCTET_STRING_print_ascii(asn1_TYPE_descriptor_t *td, const void *sptr, (void)ilevel; /* Unused argument */ if(st && st->buf) { - return cb(st->buf, st->size, app_key); + return (cb(st->buf, st->size, app_key) < 0) ? -1 : 0; } else { - return cb("", 8, app_key); + return (cb("", 8, app_key) < 0) ? -1 : 0; } } diff --git a/skeletons/ObjectDescriptor.c b/skeletons/ObjectDescriptor.c index 4ddcaac7a..192b4684f 100644 --- a/skeletons/ObjectDescriptor.c +++ b/skeletons/ObjectDescriptor.c @@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_ObjectDescriptor = { asn1_DEF_ObjectDescriptor_tags, sizeof(asn1_DEF_ObjectDescriptor_tags) / sizeof(asn1_DEF_ObjectDescriptor_tags[0]), - -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/PrintableString.c b/skeletons/PrintableString.c index 1368447f2..f0d4b1674 100644 --- a/skeletons/PrintableString.c +++ b/skeletons/PrintableString.c @@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_PrintableString = { asn1_DEF_PrintableString_tags, sizeof(asn1_DEF_PrintableString_tags) / sizeof(asn1_DEF_PrintableString_tags[0]), - -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/REAL.c b/skeletons/REAL.c index 7c230103e..010097b93 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -4,7 +4,6 @@ */ #include #include -#include #include /* for strtod(3) */ #include #include @@ -30,11 +29,11 @@ static ber_tlv_tag_t asn1_DEF_REAL_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_REAL = { "REAL", - INTEGER_free, + ASN__PRIMITIVE_TYPE_free, REAL_print, asn_generic_no_constraint, - INTEGER_decode_ber, /* Implemented in terms of INTEGER type */ - INTEGER_encode_der, + ber_decode_primitive, + der_encode_primitive, 0, /* Not implemented yet */ REAL_encode_xer, 0, /* Use generic outmost tag fetcher */ @@ -42,7 +41,6 @@ asn1_TYPE_descriptor_t asn1_DEF_REAL = { sizeof(asn1_DEF_REAL_tags) / sizeof(asn1_DEF_REAL_tags[0]), asn1_DEF_REAL_tags, /* Same as above */ sizeof(asn1_DEF_REAL_tags) / sizeof(asn1_DEF_REAL_tags[0]), - 0, /* Always in primitive form */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -55,6 +53,28 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) const char *fmt = canonical?"%15E":"f"; ssize_t ret; + /* + * Check whether it is a special value. + */ + if(finite(d) == 0) { + if(isinf(d)) { + if(copysign(1.0, d) < 0.0) { + buf = ""; + buflen = 17; + } else { + buf = ""; + buflen = 16; + } + } else { + buf = ""; + buflen = 15; + } + return (cb(buf, buflen, app_key) < 0) ? -1 : buflen; + } + + /* + * Use the libc's double printing, hopefully they got it right. + */ do { ret = snprintf(buf, buflen, fmt, d); if(ret < 0) { @@ -66,7 +86,7 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) break; } if(buf != local_buf) free(buf); - (void *)buf = MALLOC(buflen); + buf = (char *)MALLOC(buflen); if(!buf) return -1; } while(1); @@ -118,18 +138,20 @@ int REAL_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const REAL_t *st = (const REAL_t *)sptr; + ssize_t ret; double d; (void)td; /* Unused argument */ (void)ilevel; /* Unused argument */ if(!st || !st->buf) - return cb("", 8, app_key); - - if(asn1_REAL2double(st, &d)) - return cb("", 7, app_key); + ret = cb("", 8, app_key); + else if(asn1_REAL2double(st, &d)) + ret = cb("", 7, app_key); + else + ret = REAL__dump(d, 0, cb, app_key); - return (REAL__dump(d, 0, cb, app_key) < 0) ? -1 : 0; + return (ret < 0) ? -1 : 0; } asn_enc_rval_t @@ -338,7 +360,7 @@ asn1_double2REAL(REAL_t *st, double dbl_value) { || expval == INT_MAX /* catches finite() which catches isnan() */ ) { if(!st->buf || st->size < 2) { - (void *)ptr = MALLOC(2); + ptr = (uint8_t *)MALLOC(2); if(!ptr) return -1; st->buf = ptr; } diff --git a/skeletons/REAL.h b/skeletons/REAL.h index 2f7809b52..c478f41d9 100644 --- a/skeletons/REAL.h +++ b/skeletons/REAL.h @@ -6,11 +6,9 @@ #define ASN_TYPE_REAL_H #include +#include -typedef struct REAL { - uint8_t *buf; /* Buffer with REAL type encoding */ - int size; /* Size of the buffer */ -} REAL_t; +typedef ASN__PRIMITIVE_TYPE_t REAL_t; extern asn1_TYPE_descriptor_t asn1_DEF_REAL; diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index 5d1e1a9d0..e928bd059 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -4,6 +4,7 @@ */ #include #include +#include /* Encoder and decoder of a primitive */ #include /* for CHAR_BIT */ #include #include @@ -16,11 +17,11 @@ static ber_tlv_tag_t asn1_DEF_RELATIVE_OID_tags[] = { }; asn1_TYPE_descriptor_t asn1_DEF_RELATIVE_OID = { "RELATIVE-OID", - INTEGER_free, + ASN__PRIMITIVE_TYPE_free, RELATIVE_OID_print, asn_generic_no_constraint, - INTEGER_decode_ber, /* Implemented in terms of INTEGER type */ - OBJECT_IDENTIFIER_encode_der, + ber_decode_primitive, + der_encode_primitive, 0, /* Not implemented yet */ RELATIVE_OID_encode_xer, 0, /* Use generic outmost tag fetcher */ @@ -30,7 +31,6 @@ asn1_TYPE_descriptor_t asn1_DEF_RELATIVE_OID = { asn1_DEF_RELATIVE_OID_tags, /* Same as above */ sizeof(asn1_DEF_RELATIVE_OID_tags) / sizeof(asn1_DEF_RELATIVE_OID_tags[0]), - 0, /* Always in primitive form */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -73,16 +73,16 @@ RELATIVE_OID_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, (void)ilevel; /* Unused argument */ if(!st || !st->buf) - return cb("", 8, app_key); + return (cb("", 8, app_key) < 0) ? -1 : 0; /* Dump preamble */ - if(cb("{ ", 2, app_key)) + if(cb("{ ", 2, app_key) < 0) return -1; if(RELATIVE_OID__dump_body(st, cb, app_key) < 0) return -1; - return cb(" }", 2, app_key); + return (cb(" }", 2, app_key) < 0) ? -1 : 0; } asn_enc_rval_t diff --git a/skeletons/T61String.c b/skeletons/T61String.c index d2ac2d5fc..14a86b907 100644 --- a/skeletons/T61String.c +++ b/skeletons/T61String.c @@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T61String = { asn1_DEF_T61String_tags, sizeof(asn1_DEF_T61String_tags) / sizeof(asn1_DEF_T61String_tags[0]), - -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/TeletexString.c b/skeletons/TeletexString.c index 7a5695341..965ada862 100644 --- a/skeletons/TeletexString.c +++ b/skeletons/TeletexString.c @@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_TeletexString = { asn1_DEF_TeletexString_tags, sizeof(asn1_DEF_TeletexString_tags) / sizeof(asn1_DEF_TeletexString_tags[0]), - -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c index 22e5498f2..f884eebca 100644 --- a/skeletons/UTCTime.c +++ b/skeletons/UTCTime.c @@ -15,7 +15,9 @@ * UTCTime basic type description. */ static ber_tlv_tag_t asn1_DEF_UTCTime_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (23 << 2)) + (ASN_TAG_CLASS_UNIVERSAL | (23 << 2)), /* [UNIVERSAL 23] IMPLICIT ...*/ + (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), /* [UNIVERSAL 26] IMPLICIT ...*/ + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn1_TYPE_descriptor_t asn1_DEF_UTCTime = { "UTCTime", @@ -29,11 +31,10 @@ asn1_TYPE_descriptor_t asn1_DEF_UTCTime = { 0, /* Use generic outmost tag fetcher */ asn1_DEF_UTCTime_tags, sizeof(asn1_DEF_UTCTime_tags) - / sizeof(asn1_DEF_UTCTime_tags[0]), - asn1_DEF_UTCTime_tags, /* Same as above */ + / sizeof(asn1_DEF_UTCTime_tags[0]) - 2, + asn1_DEF_UTCTime_tags, sizeof(asn1_DEF_UTCTime_tags) / sizeof(asn1_DEF_UTCTime_tags[0]), - -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -106,16 +107,16 @@ UTCTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, errno = EPERM; if(asn_UT2time(st, &tm, 1) == -1 && errno != EPERM) - return cb("", 11, app_key); + return (cb("", 11, app_key) < 0) ? -1 : 0; ret = snprintf(buf, sizeof(buf), "%04d-%02d-%02d %02d:%02d%02d (GMT)", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); assert(ret > 0 && ret < (int)sizeof(buf)); - return cb(buf, ret, app_key); + return (cb(buf, ret, app_key) < 0) ? -1 : 0; } else { - return cb("", 8, app_key); + return (cb("", 8, app_key) < 0) ? -1 : 0; } } diff --git a/skeletons/UTF8String.c b/skeletons/UTF8String.c index 7220a6748..2d474e9b0 100644 --- a/skeletons/UTF8String.c +++ b/skeletons/UTF8String.c @@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_UTF8String = { asn1_DEF_UTF8String_tags, sizeof(asn1_DEF_UTF8String_tags) / sizeof(asn1_DEF_UTF8String_tags[0]), - -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -122,8 +121,8 @@ UTF8String_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, (void)ilevel; /* Unused argument */ if(st && st->buf) { - return cb(st->buf, st->size, app_key); + return (cb(st->buf, st->size, app_key) < 0) ? -1 : 0; } else { - return cb("", 8, app_key); + return (cb("", 8, app_key) < 0) ? -1 : 0; } } diff --git a/skeletons/UniversalString.c b/skeletons/UniversalString.c index d56cd9254..3dc0441b1 100644 --- a/skeletons/UniversalString.c +++ b/skeletons/UniversalString.c @@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_UniversalString = { asn1_DEF_UniversalString_tags, sizeof(asn1_DEF_UniversalString_tags) / sizeof(asn1_DEF_UniversalString_tags[0]), - -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -120,7 +119,7 @@ UniversalString_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, (void)td; /* Unused argument */ (void)ilevel; /* Unused argument */ - if(!st || !st->buf) return cb("", 8, app_key); + if(!st || !st->buf) return (cb("", 8, app_key) < 0) ? -1 : 0; if(UniversalString__dump(st, cb, app_key) < 0) return -1; diff --git a/skeletons/VideotexString.c b/skeletons/VideotexString.c index f313ecb67..3520471d1 100644 --- a/skeletons/VideotexString.c +++ b/skeletons/VideotexString.c @@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_VideotexString = { asn1_DEF_VideotexString_tags, sizeof(asn1_DEF_VideotexString_tags) / sizeof(asn1_DEF_VideotexString_tags[0]), - -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/VisibleString.c b/skeletons/VisibleString.c index dbd0e92e3..8c7d37c96 100644 --- a/skeletons/VisibleString.c +++ b/skeletons/VisibleString.c @@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_VisibleString = { asn1_DEF_VisibleString_tags, sizeof(asn1_DEF_VisibleString_tags) / sizeof(asn1_DEF_VisibleString_tags[0]), - -1, /* Both ways are fine */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/asn_internal.h b/skeletons/asn_internal.h index f50b7a1de..e8a699391 100644 --- a/skeletons/asn_internal.h +++ b/skeletons/asn_internal.h @@ -31,7 +31,7 @@ int get_asn1c_environment_version(void); /* Run-time version */ __FILE__, __LINE__); \ } while(0) #else /* !__GNUC__ */ -extern void ASN_DEBUG_f(const char *fmt, ...); +void ASN_DEBUG_f(const char *fmt, ...); #define ASN_DEBUG ASN_DEBUG_f #endif /* __GNUC__ */ #else /* EMIT_ASN_DEBUG != 1 */ @@ -60,13 +60,20 @@ static void ASN_DEBUG(const char *fmt, ...) { (void)fmt; }; || __ASN_E_cbc(buf3, size3)) #define _i_ASN_TEXT_INDENT(nl, level) do { \ - int __level = (level); \ - int __nl = ((nl) != 0); \ - int __i; \ - if(__nl) _ASN_CALLBACK("\n", 1); \ - for(__i = 0; __i < __level; __i++) \ - _ASN_CALLBACK(" ", 4); \ - er.encoded += __nl + 4 * __level; \ + int __level = (level); \ + int __nl = ((nl) != 0); \ + int __i; \ + if(__nl) _ASN_CALLBACK("\n", 1); \ + for(__i = 0; __i < __level; __i++) \ + _ASN_CALLBACK(" ", 4); \ + er.encoded += __nl + 4 * __level; \ +} while(0) + +#define _i_INDENT(nl) do { \ + int __i; \ + if((nl) && cb("\n", 1, app_key) < 0) return -1; \ + for(__i = 0; __i < ilevel; __i++) \ + if(cb(" ", 4, app_key) < 0) return -1; \ } while(0) #endif /* _ASN_INTERNAL_H_ */ diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c index 3672b6867..a64f36d52 100644 --- a/skeletons/ber_decoder.c +++ b/skeletons/ber_decoder.c @@ -46,7 +46,7 @@ ber_decode(asn1_TYPE_descriptor_t *type_descriptor, */ ber_dec_rval_t ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *opt_ctx, - void *ptr, size_t size, int tag_mode, + void *ptr, size_t size, int tag_mode, int last_tag_form, ber_tlv_len_t *last_length, int *opt_tlv_form) { ssize_t consumed_myself = 0; ssize_t tag_len; @@ -169,10 +169,10 @@ ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *opt_ctx, RETURN(RC_FAIL); } } else { - if(td->last_tag_form != tlv_constr - && td->last_tag_form != -1) { + if(last_tag_form != tlv_constr + && last_tag_form != -1) { ASN_DEBUG("last_tag_form %d != %d", - td->last_tag_form, tlv_constr); + last_tag_form, tlv_constr); RETURN(RC_FAIL); } } diff --git a/skeletons/ber_decoder.h b/skeletons/ber_decoder.h index 3e1b84f38..a4a50381b 100644 --- a/skeletons/ber_decoder.h +++ b/skeletons/ber_decoder.h @@ -21,7 +21,7 @@ struct asn1_TYPE_descriptor_s; /* Forward declaration */ enum ber_dec_rval_code_e { RC_OK, /* Decoded successfully */ RC_WMORE, /* More data expected, call again */ - RC_FAIL, /* Failure to decode data */ + RC_FAIL /* Failure to decode data */ }; typedef struct ber_dec_rval_s { enum ber_dec_rval_code_e code; /* Result code */ @@ -71,6 +71,7 @@ ber_dec_rval_t ber_check_tags(struct asn1_TYPE_descriptor_s *type_dsc, ber_dec_ctx_t *opt_ctx, /* saved context */ void *ptr, size_t size, int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ + int last_tag_form, /* {-1,0:1}: any, primitive, constr */ ber_tlv_len_t *last_length, int *opt_tlv_form); diff --git a/skeletons/ber_tlv_tag.h b/skeletons/ber_tlv_tag.h index c02a6862d..52a114107 100644 --- a/skeletons/ber_tlv_tag.h +++ b/skeletons/ber_tlv_tag.h @@ -9,7 +9,7 @@ enum asn_tag_class { ASN_TAG_CLASS_UNIVERSAL = 0, /* 0b00 */ ASN_TAG_CLASS_APPLICATION = 1, /* 0b01 */ ASN_TAG_CLASS_CONTEXT = 2, /* 0b10 */ - ASN_TAG_CLASS_PRIVATE = 3, /* 0b11 */ + ASN_TAG_CLASS_PRIVATE = 3 /* 0b11 */ }; typedef unsigned ber_tlv_tag_t; /* BER TAG from Tag-Length-Value */ diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 41fbae3fb..5ad33c830 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -148,7 +148,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *td, if(tag_mode || td->tags_count) { rval = ber_check_tags(td, ctx, ptr, size, - tag_mode, &ctx->left, 0); + tag_mode, -1, &ctx->left, 0); if(rval.code != RC_OK) { ASN_DEBUG("%s tagging check failed: %d", td->name, rval.code); @@ -425,7 +425,7 @@ CHOICE_encode_der(asn1_TYPE_descriptor_t *td, return erval; /* Encode CHOICE with parent or my own tag */ - ret = der_write_tags(td, erval.encoded, tag_mode, tag, + ret = der_write_tags(td, erval.encoded, tag_mode, 1, tag, cb, app_key); if(ret == -1) { erval.encoded = -1; @@ -597,7 +597,7 @@ CHOICE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)td->specifics; int present; - if(!sptr) return cb("", 8, app_key); + if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; /* * Figure out which CHOICE element is encoded. @@ -613,22 +613,22 @@ CHOICE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); - if(!memb_ptr) return cb("", 8, app_key); + if(!memb_ptr) return (cb("", 8, app_key) < 0) ? -1 : 0; } else { memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); } /* Print member's name and stuff */ if(0) { - if(cb(elm->name, strlen(elm->name), app_key) - || cb(": ", 2, app_key)) + if(cb(elm->name, strlen(elm->name), app_key) < 0 + || cb(": ", 2, app_key) < 0) return -1; } return elm->type->print_struct(elm->type, memb_ptr, ilevel, cb, app_key); } else { - return cb("", 8, app_key); + return (cb("", 8, app_key) < 0) ? -1 : 0; } } diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index f12961333..b00ae6fa8 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -158,7 +158,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, */ rval = ber_check_tags(td, ctx, ptr, size, - tag_mode, &ctx->left, 0); + tag_mode, 1, &ctx->left, 0); if(rval.code != RC_OK) { ASN_DEBUG("%s tagging check failed: %d", td->name, rval.code); @@ -534,7 +534,7 @@ SEQUENCE_encode_der(asn1_TYPE_descriptor_t *td, /* * Encode the TLV for the sequence itself. */ - ret = der_write_tags(td, computed_size, tag_mode, tag, cb, app_key); + ret = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key); ASN_DEBUG("Wrote tags: %ld (+%ld)", (long)ret, (long)computed_size); if(ret == -1) { erval.encoded = -1; @@ -632,11 +632,11 @@ SEQUENCE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, int edx; int ret; - if(!sptr) return cb("", 8, app_key); + if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; /* Dump preamble */ - if(cb(td->name, strlen(td->name), app_key) - || cb(" ::= {\n", 7, app_key)) + if(cb(td->name, strlen(td->name), app_key) < 0 + || cb(" ::= {", 6, app_key) < 0) return -1; for(edx = 0; edx < td->elements_count; edx++) { @@ -651,27 +651,23 @@ SEQUENCE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, } /* Indentation */ - for(ret = 0; ret < ilevel; ret++) cb(" ", 1, app_key); + _i_INDENT(1); /* Print the member's name and stuff */ - if(cb(elm->name, strlen(elm->name), app_key) - || cb(": ", 2, app_key)) + if(cb(elm->name, strlen(elm->name), app_key) < 0 + || cb(": ", 2, app_key) < 0) return -1; /* Print the member itself */ - ret = elm->type->print_struct(elm->type, memb_ptr, ilevel + 4, + ret = elm->type->print_struct(elm->type, memb_ptr, ilevel + 1, cb, app_key); if(ret) return ret; - - /* Print out the terminator */ - ret = cb("\n", 1, app_key); - if(ret) return ret; } - /* Indentation */ - for(ret = 0; ret < ilevel - 4; ret++) cb(" ", 1, app_key); + ilevel--; + _i_INDENT(1); - return cb("}", 1, app_key); + return (cb("}", 1, app_key) < 0) ? -1 : 0; } void diff --git a/skeletons/constr_SEQUENCE_OF.c b/skeletons/constr_SEQUENCE_OF.c index 7330f659f..be2ed60bb 100644 --- a/skeletons/constr_SEQUENCE_OF.c +++ b/skeletons/constr_SEQUENCE_OF.c @@ -39,7 +39,7 @@ SEQUENCE_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, /* * Encode the TLV for the sequence itself. */ - encoding_size = der_write_tags(td, computed_size, tag_mode, tag, + encoding_size = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key); if(encoding_size == -1) { erval.encoded = -1; diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index 93da7828f..6a604e437 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -147,7 +147,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *td, */ rval = ber_check_tags(td, ctx, ptr, size, - tag_mode, &ctx->left, 0); + tag_mode, 1, &ctx->left, 0); if(rval.code != RC_OK) { ASN_DEBUG("%s tagging check failed: %d", td->name, rval.code); @@ -533,7 +533,7 @@ SET_encode_der(asn1_TYPE_descriptor_t *td, /* * Encode the TLV for the sequence itself. */ - ret = der_write_tags(td, computed_size, tag_mode, tag, cb, app_key); + ret = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key); if(ret == -1) { my_erval.encoded = -1; my_erval.failed_type = td; @@ -633,11 +633,11 @@ SET_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, int edx; int ret; - if(!sptr) return cb("", 8, app_key); + if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; /* Dump preamble */ - if(cb(td->name, strlen(td->name), app_key) - || cb(" ::= {\n", 7, app_key)) + if(cb(td->name, strlen(td->name), app_key) < 0 + || cb(" ::= {", 6, app_key) < 0) return -1; for(edx = 0; edx < td->elements_count; edx++) { @@ -651,27 +651,23 @@ SET_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); } - /* Indentation */ - for(ret = 0; ret < ilevel; ret++) cb(" ", 1, app_key); + _i_INDENT(1); /* Print the member's name and stuff */ - if(cb(elm->name, strlen(elm->name), app_key) - || cb(": ", 2, app_key)) + if(cb(elm->name, strlen(elm->name), app_key) < 0 + || cb(": ", 2, app_key) < 0) return -1; /* Print the member itself */ - ret = elm->type->print_struct(elm->type, memb_ptr, ilevel + 4, + ret = elm->type->print_struct(elm->type, memb_ptr, ilevel + 1, cb, app_key); if(ret) return ret; - - ret = cb("\n", 1, app_key); - if(ret) return ret; } - /* Indentation */ - for(ret = 0; ret < ilevel - 4; ret++) cb(" ", 1, app_key); + ilevel--; + _i_INDENT(1); - return cb("}", 1, app_key); + return (cb("}", 1, app_key) < 0) ? -1 : 0; } void diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index 055676050..2050d1a5e 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -114,7 +114,7 @@ SET_OF_decode_ber(asn1_TYPE_descriptor_t *td, */ rval = ber_check_tags(td, ctx, ptr, size, - tag_mode, &ctx->left, 0); + tag_mode, 1, &ctx->left, 0); if(rval.code != RC_OK) { ASN_DEBUG("%s tagging check failed: %d", td->name, rval.code); @@ -346,7 +346,7 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, /* * Encode the TLV for the sequence itself. */ - encoding_size = der_write_tags(td, computed_size, tag_mode, tag, + encoding_size = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key); if(encoding_size == -1) { erval.encoded = -1; @@ -366,7 +366,8 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, * according to their encodings. Build an array of the * encoded elements. */ - (void *)encoded_els = MALLOC(list->count * sizeof(encoded_els[0])); + encoded_els = (struct _el_buffer *)MALLOC( + list->count * sizeof(encoded_els[0])); if(encoded_els == NULL) { erval.encoded = -1; erval.failed_type = td; @@ -428,7 +429,7 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, struct _el_buffer *encoded_el = &encoded_els[edx]; /* Report encoded chunks to the application */ if(ret == 0 - && cb(encoded_el->buf, encoded_el->length, app_key) == -1) + && cb(encoded_el->buf, encoded_el->length, app_key) < 0) ret = -1; FREEMEM(encoded_el->buf); } @@ -504,11 +505,11 @@ SET_OF_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, int ret; int i; - if(!sptr) return cb("", 8, app_key); + if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; /* Dump preamble */ - if(cb(td->name, strlen(td->name), app_key) - || cb(" ::= {\n", 7, app_key)) + if(cb(td->name, strlen(td->name), app_key) < 0 + || cb(" ::= {", 6, app_key) < 0) return -1; (const void *)list = sptr; @@ -516,21 +517,17 @@ SET_OF_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, const void *memb_ptr = list->array[i]; if(!memb_ptr) continue; - /* Indentation */ - for(ret = 0; ret < ilevel; ret++) cb(" ", 1, app_key); + _i_INDENT(1); ret = element->type->print_struct(element->type, memb_ptr, - ilevel + 4, cb, app_key); - if(ret) return ret; - - ret = cb("\n", 1, app_key); + ilevel + 1, cb, app_key); if(ret) return ret; } - /* Indentation */ - for(ret = 0; ret < ilevel - 4; ret++) cb(" ", 1, app_key); + ilevel--; + _i_INDENT(1); - return cb("}", 1, app_key); + return (cb("}", 1, app_key) < 0) ? -1 : 0; } void diff --git a/skeletons/constr_TYPE.c b/skeletons/constr_TYPE.c index 5085e4aad..c0e966af8 100644 --- a/skeletons/constr_TYPE.c +++ b/skeletons/constr_TYPE.c @@ -41,7 +41,7 @@ asn_fprint(FILE *stream, asn1_TYPE_descriptor_t *td, const void *struct_ptr) { } /* Invoke type-specific printer */ - if(td->print_struct(td, struct_ptr, 4, _print2fp, stream)) + if(td->print_struct(td, struct_ptr, 1, _print2fp, stream)) return -1; /* Terminate the output */ diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index c8982f9d2..93ed24d38 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -111,8 +111,6 @@ typedef struct asn1_TYPE_descriptor_s { ber_tlv_tag_t *all_tags;/* Every tag for BER/containment */ int all_tags_count; /* Number of tags */ - int last_tag_form; /* Acceptable form of the tag (prim, constr) */ - /* * An ASN.1 production type members (members of SEQUENCE, SET, CHOICE). */ @@ -132,7 +130,7 @@ typedef struct asn1_TYPE_descriptor_s { enum asn1_TYPE_flags_e { ATF_NOFLAGS, ATF_POINTER = 0x01, /* Represented by the pointer */ - ATF_OPEN_TYPE = 0x02, /* ANY type, without meaningful tag */ + ATF_OPEN_TYPE = 0x02 /* ANY type, without meaningful tag */ }; typedef struct asn1_TYPE_member_s { enum asn1_TYPE_flags_e flags; /* Element's presentation flags */ diff --git a/skeletons/constraints.c b/skeletons/constraints.c index 9c348851c..9b6054517 100644 --- a/skeletons/constraints.c +++ b/skeletons/constraints.c @@ -99,7 +99,7 @@ _asn_i_log_error(asn_app_consume_bytes_f *cb, void *key, const char *fmt, ...) { } if(ret < (ssize_t)sizeof(buf)) { - cb(buf, ret, key); + (void)cb(buf, ret, key); return; } @@ -120,5 +120,5 @@ _asn_i_log_error(asn_app_consume_bytes_f *cb, void *key, const char *fmt, ...) { p = buf; } - cb(p, ret, key); + (void)cb(p, ret, key); } diff --git a/skeletons/constraints.h b/skeletons/constraints.h index dfc0759f7..fe693aee0 100644 --- a/skeletons/constraints.h +++ b/skeletons/constraints.h @@ -45,17 +45,10 @@ asn_constr_check_f asn_generic_unknown_constraint; /* Not fully supported */ /* * Invoke the callback with a complete error message. */ -#ifdef __GNUC__ -#define _ASN_ERRLOG(app_errlog, app_key, fmt, args...) do { \ - if(app_errlog) \ - _asn_i_log_error(app_errlog, \ - app_key, fmt, ##args); \ -} while(0); -#else /* Preprocessor does not support variable args macros */ +/* Preprocessor may not support variable args macros, so act strangely */ #define _ASN_ERRLOG if(app_errlog) _asn_i_log_error -#endif -extern void _asn_i_log_error(asn_app_consume_bytes_f *, void *key, +void _asn_i_log_error(asn_app_consume_bytes_f *, void *key, const char *fmt, ...) __attribute__ ((format(printf, 3, 4))); #endif /* _ASN1_CONSTRAINTS_VALIDATOR_H_ */ diff --git a/skeletons/der_encoder.c b/skeletons/der_encoder.c index 3d5cc8594..9ac0afb58 100644 --- a/skeletons/der_encoder.c +++ b/skeletons/der_encoder.c @@ -34,7 +34,7 @@ der_encode(asn1_TYPE_descriptor_t *type_descriptor, void *struct_ptr, ssize_t der_write_tags(asn1_TYPE_descriptor_t *sd, size_t struct_length, - int tag_mode, + int tag_mode, int last_tag_form, ber_tlv_tag_t tag, /* EXPLICIT or IMPLICIT tag */ asn_app_consume_bytes_f *cb, void *app_key) { @@ -112,10 +112,8 @@ der_write_tags(asn1_TYPE_descriptor_t *sd, ssize_t len; int _constr; - /* If this one happens to be constructed, do it. */ - if(i < (tags_count - 1) || sd->last_tag_form == 1) - _constr = 1; - else _constr = 0; + /* Check if this tag happens to be constructed */ + _constr = (last_tag_form || i < (tags_count - 1)); len = der_write_TL(tags[i], lens[i], cb, app_key, _constr); if(len == -1) return -1; @@ -151,9 +149,8 @@ der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len, */ if(cb) { if(constructed) *buf |= 0x20; - if(cb(buf, size, app_key) == -1) { + if(cb(buf, size, app_key) < 0) return -1; - } } return size; diff --git a/skeletons/der_encoder.h b/skeletons/der_encoder.h index 2acccaafb..5a296130f 100644 --- a/skeletons/der_encoder.h +++ b/skeletons/der_encoder.h @@ -42,6 +42,7 @@ ssize_t der_write_tags( struct asn1_TYPE_descriptor_s *type_descriptor, size_t struct_length, int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ + int last_tag_form, /* {0,!0}: prim, constructed */ ber_tlv_tag_t tag, asn_app_consume_bytes_f *consume_bytes_cb, void *app_key diff --git a/skeletons/file-dependencies b/skeletons/file-dependencies index 559d2725f..0f496cc5d 100644 --- a/skeletons/file-dependencies +++ b/skeletons/file-dependencies @@ -48,6 +48,7 @@ asn_internal.h asn_types.h OCTET_STRING.h OCTET_STRING.c # This one is used too widely ber_decoder.h ber_decoder.c +ber_codec_prim.c ber_codec_prim.h ber_tlv_length.h ber_tlv_length.c ber_tlv_tag.h ber_tlv_tag.c constr_TYPE.h constr_TYPE.c diff --git a/skeletons/tests/check-INTEGER.c b/skeletons/tests/check-INTEGER.c index a7edb73ea..03efc0507 100644 --- a/skeletons/tests/check-INTEGER.c +++ b/skeletons/tests/check-INTEGER.c @@ -1,4 +1,5 @@ #include +#include #include #include #include diff --git a/skeletons/tests/check-OIDs.c b/skeletons/tests/check-OIDs.c index b99208519..e435c01ff 100644 --- a/skeletons/tests/check-OIDs.c +++ b/skeletons/tests/check-OIDs.c @@ -1,6 +1,6 @@ #include #include -#include +#include #include #include #include diff --git a/skeletons/tests/check-REAL.c b/skeletons/tests/check-REAL.c index 12310e3fa..0d6d0736a 100644 --- a/skeletons/tests/check-REAL.c +++ b/skeletons/tests/check-REAL.c @@ -1,6 +1,6 @@ #define EMIT_ASN_DEBUG 1 -#include #include +#include #include #include #include diff --git a/skeletons/xer_encoder.h b/skeletons/xer_encoder.h index fbb7a8171..8a619ca83 100644 --- a/skeletons/xer_encoder.h +++ b/skeletons/xer_encoder.h @@ -13,7 +13,7 @@ struct asn1_TYPE_descriptor_s; /* Forward declaration */ enum xer_encoder_flags_e { /* Mode of encoding */ XER_F_BASIC = 0x01, /* BASIC-XER (pretty-printing) */ - XER_F_CANONICAL = 0x02, /* Canonical XER (strict rules, unreadable) */ + XER_F_CANONICAL = 0x02 /* Canonical XER (strict rules, unreadable) */ }; /* From 7fc571a54b1c4e8c6a18780301b731e281e977ba Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 26 Sep 2004 13:11:01 +0000 Subject: [PATCH 0401/1469] generic primitive codec added git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@401 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ber_codec_prim.c | 131 +++++++++++++++++++++++++++++++++++++ skeletons/ber_codec_prim.h | 19 ++++++ 2 files changed, 150 insertions(+) create mode 100644 skeletons/ber_codec_prim.c create mode 100644 skeletons/ber_codec_prim.h diff --git a/skeletons/ber_codec_prim.c b/skeletons/ber_codec_prim.c new file mode 100644 index 000000000..6bb361355 --- /dev/null +++ b/skeletons/ber_codec_prim.c @@ -0,0 +1,131 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include + +/* + * Decode an always-primitive type. + */ +ber_dec_rval_t +ber_decode_primitive(asn1_TYPE_descriptor_t *td, + void **sptr, void *buf_ptr, size_t size, int tag_mode) { + ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)*sptr; + ber_dec_rval_t rval; + ber_tlv_len_t length; + + /* + * If the structure is not there, allocate it. + */ + if(st == NULL) { + (void *)st = *sptr = CALLOC(1, sizeof(*st)); + if(st == NULL) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + } + + ASN_DEBUG("Decoding %s as plain primitive (tm=%d)", + td->name, tag_mode); + + /* + * Check tags and extract value length. + */ + rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, 0, &length, 0); + if(rval.code != RC_OK) + return rval; + + ASN_DEBUG("%s length is %d bytes", td->name, (int)length); + + /* + * Make sure we have this length. + */ + buf_ptr = ((char *)buf_ptr) + rval.consumed; + size -= rval.consumed; + if(length > (ber_tlv_len_t)size) { + rval.code = RC_WMORE; + rval.consumed = 0; + return rval; + } + + st->buf = (uint8_t *)MALLOC(length + 1); + if(st->buf) { + st->size = length; + } else { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + + memcpy(st->buf, buf_ptr, length); + st->buf[length] = '\0'; /* Just in case */ + + rval.code = RC_OK; + rval.consumed += length; + + ASN_DEBUG("Took %ld/%ld bytes to encode %s", + (long)rval.consumed, + (long)length, td->name); + + return rval; +} + +/* + * Encode an always-primitive type using DER. + */ +asn_enc_rval_t +der_encode_primitive(asn1_TYPE_descriptor_t *td, void *sptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t erval; + ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)sptr; + + ASN_DEBUG("%s %s as a primitive type (tm=%d)", + cb?"Encoding":"Estimating", td->name, tag_mode); + + erval.encoded = der_write_tags(td, st->size, tag_mode, 0, tag, + cb, app_key); + ASN_DEBUG("%s wrote tags %d", td->name, (int)erval.encoded); + if(erval.encoded == -1) { + erval.failed_type = td; + erval.structure_ptr = sptr; + return erval; + } + + if(cb && st->buf) { + if(cb(st->buf, st->size, app_key) < 0) { + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = sptr; + return erval; + } + } else { + assert(st->buf || st->size == 0); + } + + erval.encoded += st->size; + + return erval; +} + +void +ASN__PRIMITIVE_TYPE_free(asn1_TYPE_descriptor_t *td, void *sptr, + int contents_only) { + ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)sptr; + + if(!td || !sptr) + return; + + ASN_DEBUG("Freeing %s as a primitive type", td->name); + + if(st->buf) + FREEMEM(st->buf); + + if(!contents_only) + FREEMEM(st); +} + diff --git a/skeletons/ber_codec_prim.h b/skeletons/ber_codec_prim.h new file mode 100644 index 000000000..aa6a5c59d --- /dev/null +++ b/skeletons/ber_codec_prim.h @@ -0,0 +1,19 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _BER_CODEC_of_PRIMITIVE_TYPE_H_ +#define _BER_CODEC_of_PRIMITIVE_TYPE_H_ + +#include + +typedef struct ASN__PRIMITIVE_TYPE_s { + uint8_t *buf; /* Buffer with consecutive primitive encoding bytes */ + int size; /* Size of the buffer */ +} ASN__PRIMITIVE_TYPE_t; /* Do not use this type directly! */ + +asn_struct_free_f ASN__PRIMITIVE_TYPE_free; +ber_type_decoder_f ber_decode_primitive; +der_type_encoder_f der_encode_primitive; + +#endif /* _BER_CODEC_of_PRIMITIVE_TYPE_H_ */ From 86f5ed28933e6828de386a41b78c2c9d2d40604e Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 26 Sep 2004 13:11:31 +0000 Subject: [PATCH 0402/1469] -fno-constraints support; removed last_tag_form git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@402 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 121 +++++++++++++++++---------------- libasn1compiler/asn1compiler.h | 4 ++ 2 files changed, 68 insertions(+), 57 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 3443ccf8d..d94d24b4d 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -39,17 +39,11 @@ enum tvm_compat { }; static enum tvm_compat emit_tags_vectors(arg_t *arg, asn1p_expr_t *expr, int *tc, int *atc); -enum etd_cp { - ETD_CP_UNKNOWN = -2, - ETD_CP_EITHER = -1, - ETD_CP_PRIMITIVE = 0, - ETD_CP_CONSTRUCTED = 1, -}; enum etd_spec { ETD_NO_SPECIFICS, ETD_HAS_SPECIFICS }; -static int emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_count, int all_tags_count, int elements_count, enum etd_cp, enum etd_spec); +static int emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_count, int all_tags_count, int elements_count, enum etd_spec); #define C99_MODE (!(arg->flags & A1C_NO_C99)) #define UNNAMED_UNIONS (arg->flags & A1C_UNNAMED_UNIONS) @@ -234,7 +228,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { * Emit asn1_DEF_xxx table. */ emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, elements, - ETD_CP_CONSTRUCTED, ETD_HAS_SPECIFICS); + ETD_HAS_SPECIFICS); REDIR(OT_TYPE_DECLS); @@ -420,7 +414,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { * Emit asn1_DEF_xxx table. */ emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, elements, - ETD_CP_CONSTRUCTED, ETD_HAS_SPECIFICS); + ETD_HAS_SPECIFICS); REDIR(OT_TYPE_DECLS); @@ -544,7 +538,7 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { * Emit asn1_DEF_xxx table. */ emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, 1, - ETD_CP_CONSTRUCTED, ETD_HAS_SPECIFICS); + ETD_HAS_SPECIFICS); REDIR(OT_TYPE_DECLS); @@ -695,7 +689,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { * Emit asn1_DEF_xxx table. */ emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, elements, - ETD_CP_CONSTRUCTED /*either?!*/, ETD_HAS_SPECIFICS); + ETD_HAS_SPECIFICS); REDIR(OT_TYPE_DECLS); @@ -779,6 +773,32 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("%s", expr->marker.flags?"*":" "); OUT("%s_t", MKID(expr->Identifier)); + /* + * If this type just blindly refers the other type, alias it. + * Type1 ::= Type2 + */ + if((!expr->constraints || (arg->flags & A1C_NO_CONSTRAINTS)) + && expr->tag.tag_class == TC_NOCLASS + && !TQ_FIRST(&(expr->members)) + ) { + char *type_name; + REDIR(OT_FUNC_DECLS); + type_name = asn1c_type_name(arg, expr, TNF_SAFE); + OUT("/* This type is equivalent to %s */\n", type_name); + p = MKID(expr->Identifier); + if(HIDE_INNER_DEFS) OUT("/* "); + OUT("#define\tasn1_DEF_%s\t", p); + type_name = asn1c_type_name(arg, expr, TNF_SAFE); + OUT("asn1_DEF_%s\n", type_name); + if(HIDE_INNER_DEFS) + OUT(" // (Use -fall-defs-global to expose) */"); + REDIR(OT_CODE); + OUT("/* This type is equivalent to %s */\n", type_name); + OUT("\n"); + REDIR(OT_TYPE_DECLS); + return 0; + } + REDIR(OT_STAT_DEFS); /* @@ -787,36 +807,33 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { tv_mode = emit_tags_vectors(arg, expr, &tags_count, &all_tags_count); emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, 0, - ETD_CP_UNKNOWN, ETD_NO_SPECIFICS); + ETD_NO_SPECIFICS); REDIR(OT_CODE); /* * Constraint checking. */ - p = MKID(expr->Identifier); - OUT("int\n"); - OUT("%s_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,\n", p); - INDENTED( - OUT("\t\tasn_app_consume_bytes_f *app_errlog, void *app_key) {\n"); - OUT("\n"); - if(asn1c_emit_constraint_checking_code(arg) == 1) { - if(0) { - OUT("/* Check the constraints of the underlying type */\n"); - OUT("return asn1_DEF_%s.check_constraints\n", - asn1c_type_name(arg, expr, TNF_SAFE)); - OUT("\t(td, sptr, app_errlog, app_key);\n"); - } else { - OUT("/* Make the underlying type checker permanent */\n"); - OUT("td->check_constraints = asn1_DEF_%s.check_constraints;\n", - asn1c_type_name(arg, expr, TNF_SAFE)); - OUT("return td->check_constraints\n"); - OUT("\t(td, sptr, app_errlog, app_key);\n"); + if(!(arg->flags & A1C_NO_CONSTRAINTS)) { + p = MKID(expr->Identifier); + OUT("int\n"); + OUT("%s_constraint(" + "asn1_TYPE_descriptor_t *td, const void *sptr,\n", p); + INDENT(+1); + OUT("\t\tasn_app_consume_bytes_f *app_errlog, void *app_key) {"); + OUT("\n"); + if(asn1c_emit_constraint_checking_code(arg) == 1) { + OUT("/* Replace with underlying type checker */\n"); + OUT("td->check_constraints " + "= asn1_DEF_%s.check_constraints;\n", + asn1c_type_name(arg, expr, TNF_SAFE)); + OUT("return td->check_constraints" + "(td, sptr, app_errlog, app_key);\n"); } + INDENT(-1); + OUT("}\n"); + OUT("\n"); } - ); - OUT("}\n"); - OUT("\n"); /* * Emit suicidal functions. @@ -853,7 +870,6 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("td->all_tags_count = asn1_DEF_%s.all_tags_count;\n",type_name); OUT("/* End of these lines */\n"); } - OUT("td->last_tag_form = asn1_DEF_%s.last_tag_form;\n", type_name); OUT("td->elements = asn1_DEF_%s.elements;\n", type_name); OUT("td->elements_count = asn1_DEF_%s.elements_count;\n", type_name); OUT("td->specifics = asn1_DEF_%s.specifics;\n", type_name); @@ -1343,11 +1359,16 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { } if(C99_MODE) OUT(".memb_constraints = "); if(expr->constraints) { - char *id = MKID(expr->Identifier); - if(expr->_anonymous_type && !strcmp(expr->Identifier, "member")) - id = asn1c_type_name(arg, expr, TNF_SAFE); - OUT("memb_%s_%d_constraint,\n", id, - ++global_memb_unique); + if(arg->flags & A1C_NO_CONSTRAINTS) { + OUT("0,\t/* No check because of -fno-constraints */\n"); + } else { + char *id = MKID(expr->Identifier); + if(expr->_anonymous_type + && !strcmp(expr->Identifier, "member")) + id = asn1c_type_name(arg, expr, TNF_SAFE); + OUT("memb_%s_%d_constraint,\n", id, + ++global_memb_unique); + } } else { OUT("0,\t/* Defer to actual type */\n"); } @@ -1356,7 +1377,7 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { OUT("},\n"); INDENT(-1); - if(!expr->constraints) + if(!expr->constraints || (arg->flags & A1C_NO_CONSTRAINTS)) return 0; save_target = arg->target->target; @@ -1373,8 +1394,8 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { tmp_arg = *arg; tmp_arg.expr = expr; if(asn1c_emit_constraint_checking_code(&tmp_arg) == 1) { - OUT("return td->check_constraints\n"); - OUT("\t(td, sptr, app_errlog, app_key);\n"); + OUT("return td->check_constraints" + "(td, sptr, app_errlog, app_key);\n"); } INDENT(-1); OUT("}\n"); @@ -1386,7 +1407,7 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { } static int -emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_count, int all_tags_count, int elements_count, enum etd_cp cp, enum etd_spec spec) { +emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_count, int all_tags_count, int elements_count, enum etd_spec spec) { char *p; p = MKID(expr->Identifier); @@ -1444,20 +1465,6 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ OUT("0,\t/* No tags (count) */\n"); } - switch(cp) { - case ETD_CP_UNKNOWN: - OUT("-0,\t/* Unknown yet */\n"); - break; - case ETD_CP_EITHER: - OUT("-1,\t/* Primitive or constructed */\n"); - case ETD_CP_PRIMITIVE: - OUT("0,\t/* Primitive */\n"); - break; - case ETD_CP_CONSTRUCTED: - OUT("1,\t/* Whether CONSTRUCTED */\n"); - break; - } - if(elements_count) { OUT("asn1_MBR_%s,\n", p); if(expr->expr_type == ASN_CONSTR_SEQUENCE_OF diff --git a/libasn1compiler/asn1compiler.h b/libasn1compiler/asn1compiler.h index 8099e6e1b..bd309e44a 100644 --- a/libasn1compiler/asn1compiler.h +++ b/libasn1compiler/asn1compiler.h @@ -35,6 +35,10 @@ enum asn1c_flags { * Don't make the asn1_DEF_'s of structure members "static". */ A1C_ALL_DEFS_GLOBAL = 0x0040, + /* + * Do not generate constraint checking code. + */ + A1C_NO_CONSTRAINTS = 0x0080, }; /* From 1276169ece5b70a0f3df30179f425c24def47d9c Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 26 Sep 2004 13:12:36 +0000 Subject: [PATCH 0403/1469] signatures changed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@403 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/unber.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/asn1c/unber.c b/asn1c/unber.c index 38296b2f9..c9e7da124 100644 --- a/asn1c/unber.c +++ b/asn1c/unber.c @@ -46,7 +46,7 @@ #include #include #include -#include +#include static void usage(const char *av0); /* Print the Usage screen and exit */ static int process(const char *fname); /* Perform the BER decoding */ @@ -677,5 +677,5 @@ decode_tlv_from_string(const char *datastring) { /* * Dummy functions. */ -ber_dec_rval_t ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *opt_ctx, void *ptr, size_t size, int tag_mode, ber_tlv_len_t *last_length, int *opt_tlv_form) { ber_dec_rval_t rv; (void)td; (void)opt_ctx; (void)ptr; (void)size; (void)tag_mode; (void)last_length; (void)opt_tlv_form; return rv; } -ssize_t der_write_tags(asn1_TYPE_descriptor_t *td, size_t slen, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { (void)td; (void)slen; (void)tag_mode; (void)tag; (void)cb; (void)app_key; return -1; } +ber_dec_rval_t ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *opt_ctx, void *ptr, size_t size, int tag_mode, int last_tag_form, ber_tlv_len_t *last_length, int *opt_tlv_form) { ber_dec_rval_t rv; (void)td; (void)opt_ctx; (void)ptr; (void)size; (void)tag_mode; (void)last_tag_form; (void)last_length; (void)opt_tlv_form; return rv; } +ssize_t der_write_tags(asn1_TYPE_descriptor_t *td, size_t slen, int tag_mode, int last_tag_form, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { (void)td; (void)slen; (void)tag_mode; (void)last_tag_form; (void)tag; (void)cb; (void)app_key; return -1; } From aafc94105ea876653305a0d5262c87e6bcc271f1 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 26 Sep 2004 13:12:56 +0000 Subject: [PATCH 0404/1469] type aliasing implemented; last_tag_form removed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@404 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/19-param-OK.asn1.-P | 4 - tests/31-set-of-OK.asn1.-P | 6 - tests/32-sequence-of-OK.asn1.-P | 3 - tests/39-sequence-of-OK.asn1.-P | 3 - tests/42-real-life-OK.asn1.-PR | 13 +- tests/43-recursion-OK.asn1.-P | 5 - tests/44-choice-in-sequence-OK.asn1.-P | 4 - tests/46-redefine-OK.asn1.-PR | 110 +---- tests/47-set-ext-OK.asn1.-P | 4 - tests/50-constraint-OK.asn1.-P | 515 +-------------------- tests/60-any-OK.asn1.-P | 2 - tests/65-multi-tag-OK.asn1.-P | 150 +----- tests/65-multi-tag-OK.asn1.-Pfnative-types | 150 +----- tests/66-ref-simple-OK.asn1.-P | 9 +- 14 files changed, 54 insertions(+), 924 deletions(-) diff --git a/tests/19-param-OK.asn1.-P b/tests/19-param-OK.asn1.-P index fa6aaf31e..5089d3ac2 100644 --- a/tests/19-param-OK.asn1.-P +++ b/tests/19-param-OK.asn1.-P @@ -122,7 +122,6 @@ asn1_TYPE_descriptor_t asn1_DEF_toBeSigned = { asn1_DEF_toBeSigned_tags, /* Same as above */ sizeof(asn1_DEF_toBeSigned_tags) /sizeof(asn1_DEF_toBeSigned_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_toBeSigned, 3, /* Elements count */ &asn1_DEF_toBeSigned_specs /* Additional specs */ @@ -183,7 +182,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Certificate = { asn1_DEF_Certificate_tags, /* Same as above */ sizeof(asn1_DEF_Certificate_tags) /sizeof(asn1_DEF_Certificate_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_Certificate, 3, /* Elements count */ &asn1_DEF_Certificate_specs /* Additional specs */ @@ -245,7 +243,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Name = { asn1_DEF_Name_tags, /* Same as above */ sizeof(asn1_DEF_Name_tags) /sizeof(asn1_DEF_Name_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_Name, 1, /* Single element */ &asn1_DEF_Name_specs /* Additional specs */ @@ -362,7 +359,6 @@ asn1_TYPE_descriptor_t asn1_DEF_RelativeDistinguishedName = { asn1_DEF_RelativeDistinguishedName_tags, /* Same as above */ sizeof(asn1_DEF_RelativeDistinguishedName_tags) /sizeof(asn1_DEF_RelativeDistinguishedName_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_RelativeDistinguishedName, 1, /* Single element */ &asn1_DEF_RelativeDistinguishedName_specs /* Additional specs */ diff --git a/tests/31-set-of-OK.asn1.-P b/tests/31-set-of-OK.asn1.-P index ce284dfca..6bf3d7c75 100644 --- a/tests/31-set-of-OK.asn1.-P +++ b/tests/31-set-of-OK.asn1.-P @@ -54,7 +54,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Forest = { asn1_DEF_Forest_tags, /* Same as above */ sizeof(asn1_DEF_Forest_tags) /sizeof(asn1_DEF_Forest_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_Forest, 1, /* Single element */ &asn1_DEF_Forest_specs /* Additional specs */ @@ -130,7 +129,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Tree = { asn1_DEF_Tree_tags, /* Same as above */ sizeof(asn1_DEF_Tree_tags) /sizeof(asn1_DEF_Tree_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_Tree, 2, /* Elements count */ &asn1_DEF_Tree_specs /* Additional specs */ @@ -229,7 +227,6 @@ asn1_TYPE_descriptor_t asn1_DEF_trees = { asn1_DEF_trees_tags, /* Same as above */ sizeof(asn1_DEF_trees_tags) /sizeof(asn1_DEF_trees_tags[0]), /* 2 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_trees, 1, /* Single element */ &asn1_DEF_trees_specs /* Additional specs */ @@ -275,7 +272,6 @@ asn1_TYPE_descriptor_t asn1_DEF_anything_member = { asn1_DEF_anything_member_tags, /* Same as above */ sizeof(asn1_DEF_anything_member_tags) /sizeof(asn1_DEF_anything_member_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_anything_member, 1, /* Elements count */ &asn1_DEF_anything_member_specs /* Additional specs */ @@ -316,7 +312,6 @@ asn1_TYPE_descriptor_t asn1_DEF_anything = { asn1_DEF_anything_tags, /* Same as above */ sizeof(asn1_DEF_anything_tags) /sizeof(asn1_DEF_anything_tags[0]), /* 2 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_anything, 1, /* Single element */ &asn1_DEF_anything_specs /* Additional specs */ @@ -373,7 +368,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Stuff = { asn1_DEF_Stuff_tags, /* Same as above */ sizeof(asn1_DEF_Stuff_tags) /sizeof(asn1_DEF_Stuff_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_Stuff, 2, /* Elements count */ &asn1_DEF_Stuff_specs /* Additional specs */ diff --git a/tests/32-sequence-of-OK.asn1.-P b/tests/32-sequence-of-OK.asn1.-P index 5b3d606ce..e258529d9 100644 --- a/tests/32-sequence-of-OK.asn1.-P +++ b/tests/32-sequence-of-OK.asn1.-P @@ -54,7 +54,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Programming = { asn1_DEF_Programming_tags, /* Same as above */ sizeof(asn1_DEF_Programming_tags) /sizeof(asn1_DEF_Programming_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_Programming, 1, /* Single element */ &asn1_DEF_Programming_specs /* Additional specs */ @@ -116,7 +115,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Fault = { asn1_DEF_Fault_tags, /* Same as above */ sizeof(asn1_DEF_Fault_tags) /sizeof(asn1_DEF_Fault_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_Fault, 1, /* Single element */ &asn1_DEF_Fault_specs /* Additional specs */ @@ -175,7 +173,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Error = { asn1_DEF_Error_tags, /* Same as above */ sizeof(asn1_DEF_Error_tags) /sizeof(asn1_DEF_Error_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ 0, 0, /* No members */ &asn1_DEF_Error_specs /* Additional specs */ }; diff --git a/tests/39-sequence-of-OK.asn1.-P b/tests/39-sequence-of-OK.asn1.-P index bd13dfd31..b8f9f598f 100644 --- a/tests/39-sequence-of-OK.asn1.-P +++ b/tests/39-sequence-of-OK.asn1.-P @@ -63,7 +63,6 @@ asn1_TYPE_descriptor_t asn1_DEF_collection = { asn1_DEF_collection_tags, /* Same as above */ sizeof(asn1_DEF_collection_tags) /sizeof(asn1_DEF_collection_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_collection, 1, /* Single element */ &asn1_DEF_collection_specs /* Additional specs */ @@ -116,7 +115,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { asn1_DEF_T_tags, /* Same as above */ sizeof(asn1_DEF_T_tags) /sizeof(asn1_DEF_T_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_T, 2, /* Elements count */ &asn1_DEF_T_specs /* Additional specs */ @@ -193,7 +191,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { asn1_DEF_T2_tags, /* Same as above */ sizeof(asn1_DEF_T2_tags) /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_T2, 2, /* Elements count */ &asn1_DEF_T2_specs /* Additional specs */ diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index ef05fa512..f26068f79 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -99,7 +99,6 @@ asn1_TYPE_descriptor_t asn1_DEF_varsets = { asn1_DEF_varsets_tags, /* Same as above */ sizeof(asn1_DEF_varsets_tags) /sizeof(asn1_DEF_varsets_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_varsets, 1, /* Single element */ &asn1_DEF_varsets_specs /* Additional specs */ @@ -152,7 +151,6 @@ asn1_TYPE_descriptor_t asn1_DEF_LogLine = { asn1_DEF_LogLine_tags, /* Same as above */ sizeof(asn1_DEF_LogLine_tags) /sizeof(asn1_DEF_LogLine_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_LogLine, 2, /* Elements count */ &asn1_DEF_LogLine_specs /* Additional specs */ @@ -209,8 +207,7 @@ memb_vparts_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* Nothing is here. See below */ } - return td->check_constraints - (td, sptr, app_errlog, app_key); + return td->check_constraints(td, sptr, app_errlog, app_key); } @@ -250,7 +247,6 @@ asn1_TYPE_descriptor_t asn1_DEF_vparts = { asn1_DEF_vparts_tags, /* Same as above */ sizeof(asn1_DEF_vparts_tags) /sizeof(asn1_DEF_vparts_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_vparts, 1, /* Single element */ &asn1_DEF_vparts_specs /* Additional specs */ @@ -303,7 +299,6 @@ asn1_TYPE_descriptor_t asn1_DEF_VariablePartSet = { asn1_DEF_VariablePartSet_tags, /* Same as above */ sizeof(asn1_DEF_VariablePartSet_tags) /sizeof(asn1_DEF_VariablePartSet_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_VariablePartSet, 2, /* Elements count */ &asn1_DEF_VariablePartSet_specs /* Additional specs */ @@ -429,7 +424,6 @@ asn1_TYPE_descriptor_t asn1_DEF_vset = { asn1_DEF_vset_tags, /* Same as above */ sizeof(asn1_DEF_vset_tags) /sizeof(asn1_DEF_vset_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_vset, 1, /* Single element */ &asn1_DEF_vset_specs /* Additional specs */ @@ -483,7 +477,6 @@ asn1_TYPE_descriptor_t asn1_DEF_vrange = { asn1_DEF_vrange_tags, /* Same as above */ sizeof(asn1_DEF_vrange_tags) /sizeof(asn1_DEF_vrange_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_vrange, 2, /* Elements count */ &asn1_DEF_vrange_specs /* Additional specs */ @@ -532,7 +525,6 @@ asn1_TYPE_descriptor_t asn1_DEF_VariablePart = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_VariablePart, 2, /* Elements count */ &asn1_DEF_VariablePart_specs /* Additional specs */ @@ -626,7 +618,6 @@ asn1_TYPE_descriptor_t asn1_DEF_email = { asn1_DEF_email_tags, /* Same as above */ sizeof(asn1_DEF_email_tags) /sizeof(asn1_DEF_email_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_email, 1, /* Single element */ &asn1_DEF_email_specs /* Additional specs */ @@ -680,7 +671,6 @@ asn1_TYPE_descriptor_t asn1_DEF_notify = { asn1_DEF_notify_tags, /* Same as above */ sizeof(asn1_DEF_notify_tags) /sizeof(asn1_DEF_notify_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_notify, 2, /* Elements count */ &asn1_DEF_notify_specs /* Additional specs */ @@ -733,7 +723,6 @@ asn1_TYPE_descriptor_t asn1_DEF_ActionItem = { asn1_DEF_ActionItem_tags, /* Same as above */ sizeof(asn1_DEF_ActionItem_tags) /sizeof(asn1_DEF_ActionItem_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_ActionItem, 2, /* Elements count */ &asn1_DEF_ActionItem_specs /* Additional specs */ diff --git a/tests/43-recursion-OK.asn1.-P b/tests/43-recursion-OK.asn1.-P index 9c5945d2c..58fd39a9b 100644 --- a/tests/43-recursion-OK.asn1.-P +++ b/tests/43-recursion-OK.asn1.-P @@ -72,7 +72,6 @@ asn1_TYPE_descriptor_t asn1_DEF_t_member1 = { asn1_DEF_t_member1_tags, /* Same as above */ sizeof(asn1_DEF_t_member1_tags) /sizeof(asn1_DEF_t_member1_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_t_member1, 1, /* Single element */ &asn1_DEF_t_member1_specs /* Additional specs */ @@ -112,7 +111,6 @@ asn1_TYPE_descriptor_t asn1_DEF_t_member2 = { asn1_DEF_t_member2_tags, /* Same as above */ sizeof(asn1_DEF_t_member2_tags) /sizeof(asn1_DEF_t_member2_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_t_member2, 1, /* Single element */ &asn1_DEF_t_member2_specs /* Additional specs */ @@ -181,7 +179,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Test_structure_1 = { asn1_DEF_Test_structure_1_tags, /* Same as above */ sizeof(asn1_DEF_Test_structure_1_tags) /sizeof(asn1_DEF_Test_structure_1_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_Test_structure_1, 4, /* Elements count */ &asn1_DEF_Test_structure_1_specs /* Additional specs */ @@ -265,7 +262,6 @@ asn1_TYPE_descriptor_t asn1_DEF_or = { asn1_DEF_or_tags, /* Same as above */ sizeof(asn1_DEF_or_tags) /sizeof(asn1_DEF_or_tags[0]), /* 2 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_or, 1, /* Single element */ &asn1_DEF_or_specs /* Additional specs */ @@ -330,7 +326,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Choice_1 = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_Choice_1, 4, /* Elements count */ &asn1_DEF_Choice_1_specs /* Additional specs */ diff --git a/tests/44-choice-in-sequence-OK.asn1.-P b/tests/44-choice-in-sequence-OK.asn1.-P index 4fcddc4bc..09b999a26 100644 --- a/tests/44-choice-in-sequence-OK.asn1.-P +++ b/tests/44-choice-in-sequence-OK.asn1.-P @@ -112,7 +112,6 @@ asn1_TYPE_descriptor_t asn1_DEF_e = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_e, 2, /* Elements count */ &asn1_DEF_e_specs /* Additional specs */ @@ -162,7 +161,6 @@ asn1_TYPE_descriptor_t asn1_DEF_h = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_h, 2, /* Elements count */ &asn1_DEF_h_specs /* Additional specs */ @@ -229,7 +227,6 @@ asn1_TYPE_descriptor_t asn1_DEF_b = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_b, 4, /* Elements count */ &asn1_DEF_b_specs /* Additional specs */ @@ -287,7 +284,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { asn1_DEF_T_tags, /* Same as above */ sizeof(asn1_DEF_T_tags) /sizeof(asn1_DEF_T_tags[0]), /* 2 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_T, 2, /* Elements count */ &asn1_DEF_T_specs /* Additional specs */ diff --git a/tests/46-redefine-OK.asn1.-PR b/tests/46-redefine-OK.asn1.-PR index 74632450e..4981e2220 100644 --- a/tests/46-redefine-OK.asn1.-PR +++ b/tests/46-redefine-OK.asn1.-PR @@ -10,107 +10,12 @@ typedef OCTET_STRING_t PrimitiveType_t; /*** <<< FUNC-DECLS [PrimitiveType] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_PrimitiveType; -asn_struct_free_f PrimitiveType_free; -asn_struct_print_f PrimitiveType_print; -asn_constr_check_f PrimitiveType_constraint; -ber_type_decoder_f PrimitiveType_decode_ber; -der_type_encoder_f PrimitiveType_encode_der; -xer_type_encoder_f PrimitiveType_encode_xer; +/* This type is equivalent to OCTET_STRING */ +#define asn1_DEF_PrimitiveType asn1_DEF_OCTET_STRING /*** <<< CODE [PrimitiveType] >>> ***/ -int -PrimitiveType_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, - asn_app_consume_bytes_f *app_errlog, void *app_key) { - - /* Make the underlying type checker permanent */ - td->check_constraints = asn1_DEF_OCTET_STRING.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); -} - -/* - * This type is implemented using OCTET_STRING, - * so here we adjust the DEF accordingly. - */ -static void -PrimitiveType_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_OCTET_STRING.free_struct; - td->print_struct = asn1_DEF_OCTET_STRING.print_struct; - td->ber_decoder = asn1_DEF_OCTET_STRING.ber_decoder; - td->der_encoder = asn1_DEF_OCTET_STRING.der_encoder; - td->xer_decoder = asn1_DEF_OCTET_STRING.xer_decoder; - td->xer_encoder = asn1_DEF_OCTET_STRING.xer_encoder; - td->last_tag_form = asn1_DEF_OCTET_STRING.last_tag_form; - td->elements = asn1_DEF_OCTET_STRING.elements; - td->elements_count = asn1_DEF_OCTET_STRING.elements_count; - td->specifics = asn1_DEF_OCTET_STRING.specifics; -} - -void -PrimitiveType_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { - PrimitiveType_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); -} - -int -PrimitiveType_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - PrimitiveType_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -ber_dec_rval_t -PrimitiveType_decode_ber(asn1_TYPE_descriptor_t *td, - void **structure, void *bufptr, size_t size, int tag_mode) { - PrimitiveType_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); -} - -asn_enc_rval_t -PrimitiveType_encode_der(asn1_TYPE_descriptor_t *td, - void *structure, int tag_mode, ber_tlv_tag_t tag, - asn_app_consume_bytes_f *cb, void *app_key) { - PrimitiveType_inherit_TYPE_descriptor(td); - return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); -} - -asn_enc_rval_t -PrimitiveType_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, - int ilevel, enum xer_encoder_flags_e flags, - asn_app_consume_bytes_f *cb, void *app_key) { - PrimitiveType_inherit_TYPE_descriptor(td); - return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); -} - - -/*** <<< STAT-DEFS [PrimitiveType] >>> ***/ - -static ber_tlv_tag_t asn1_DEF_PrimitiveType_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) -}; -asn1_TYPE_descriptor_t asn1_DEF_PrimitiveType = { - "PrimitiveType", - PrimitiveType_free, - PrimitiveType_print, - PrimitiveType_constraint, - PrimitiveType_decode_ber, - PrimitiveType_encode_der, - 0, /* Not implemented yet */ - PrimitiveType_encode_xer, - 0, /* Use generic outmost tag fetcher */ - asn1_DEF_PrimitiveType_tags, - sizeof(asn1_DEF_PrimitiveType_tags) - /sizeof(asn1_DEF_PrimitiveType_tags[0]), /* 1 */ - asn1_DEF_PrimitiveType_tags, /* Same as above */ - sizeof(asn1_DEF_PrimitiveType_tags) - /sizeof(asn1_DEF_PrimitiveType_tags[0]), /* 1 */ - -0, /* Unknown yet */ - 0, 0, /* No members */ - 0 /* No specifics */ -}; +/* This type is equivalent to OCTET_STRING */ /*** <<< INCLUDES [ConstructedType] >>> ***/ @@ -173,7 +78,6 @@ asn1_TYPE_descriptor_t asn1_DEF_ConstructedType = { asn1_DEF_ConstructedType_tags, /* Same as above */ sizeof(asn1_DEF_ConstructedType_tags) /sizeof(asn1_DEF_ConstructedType_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_ConstructedType, 1, /* Elements count */ &asn1_DEF_ConstructedType_specs /* Additional specs */ @@ -204,11 +108,9 @@ xer_type_encoder_f T_encode_xer; int T_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - - /* Make the underlying type checker permanent */ + /* Replace with underlying type checker */ td->check_constraints = asn1_DEF_ConstructedType.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); + return td->check_constraints(td, sptr, app_errlog, app_key); } /* @@ -223,7 +125,6 @@ T_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_ConstructedType.der_encoder; td->xer_decoder = asn1_DEF_ConstructedType.xer_decoder; td->xer_encoder = asn1_DEF_ConstructedType.xer_encoder; - td->last_tag_form = asn1_DEF_ConstructedType.last_tag_form; td->elements = asn1_DEF_ConstructedType.elements; td->elements_count = asn1_DEF_ConstructedType.elements_count; td->specifics = asn1_DEF_ConstructedType.specifics; @@ -289,7 +190,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { asn1_DEF_T_tags, /* Same as above */ sizeof(asn1_DEF_T_tags) /sizeof(asn1_DEF_T_tags[0]), /* 2 */ - -0, /* Unknown yet */ 0, 0, /* Defined elsewhere */ 0 /* No specifics */ }; diff --git a/tests/47-set-ext-OK.asn1.-P b/tests/47-set-ext-OK.asn1.-P index bcc364b09..0e207d52e 100644 --- a/tests/47-set-ext-OK.asn1.-P +++ b/tests/47-set-ext-OK.asn1.-P @@ -78,7 +78,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T1 = { asn1_DEF_T1_tags, /* Same as above */ sizeof(asn1_DEF_T1_tags) /sizeof(asn1_DEF_T1_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_T1, 1, /* Elements count */ &asn1_DEF_T1_specs /* Additional specs */ @@ -164,7 +163,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { asn1_DEF_T2_tags, /* Same as above */ sizeof(asn1_DEF_T2_tags) /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_T2, 1, /* Elements count */ &asn1_DEF_T2_specs /* Additional specs */ @@ -239,7 +237,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T3 = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_T3, 1, /* Elements count */ &asn1_DEF_T3_specs /* Additional specs */ @@ -314,7 +311,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T4 = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_T4, 1, /* Elements count */ &asn1_DEF_T4_specs /* Additional specs */ diff --git a/tests/50-constraint-OK.asn1.-P b/tests/50-constraint-OK.asn1.-P index 197474f94..6696b560b 100644 --- a/tests/50-constraint-OK.asn1.-P +++ b/tests/50-constraint-OK.asn1.-P @@ -10,107 +10,12 @@ typedef INTEGER_t Int1_t; /*** <<< FUNC-DECLS [Int1] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Int1; -asn_struct_free_f Int1_free; -asn_struct_print_f Int1_print; -asn_constr_check_f Int1_constraint; -ber_type_decoder_f Int1_decode_ber; -der_type_encoder_f Int1_encode_der; -xer_type_encoder_f Int1_encode_xer; +/* This type is equivalent to INTEGER */ +#define asn1_DEF_Int1 asn1_DEF_INTEGER /*** <<< CODE [Int1] >>> ***/ -int -Int1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, - asn_app_consume_bytes_f *app_errlog, void *app_key) { - - /* Make the underlying type checker permanent */ - td->check_constraints = asn1_DEF_INTEGER.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); -} - -/* - * This type is implemented using INTEGER, - * so here we adjust the DEF accordingly. - */ -static void -Int1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_INTEGER.free_struct; - td->print_struct = asn1_DEF_INTEGER.print_struct; - td->ber_decoder = asn1_DEF_INTEGER.ber_decoder; - td->der_encoder = asn1_DEF_INTEGER.der_encoder; - td->xer_decoder = asn1_DEF_INTEGER.xer_decoder; - td->xer_encoder = asn1_DEF_INTEGER.xer_encoder; - td->last_tag_form = asn1_DEF_INTEGER.last_tag_form; - td->elements = asn1_DEF_INTEGER.elements; - td->elements_count = asn1_DEF_INTEGER.elements_count; - td->specifics = asn1_DEF_INTEGER.specifics; -} - -void -Int1_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { - Int1_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); -} - -int -Int1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - Int1_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -ber_dec_rval_t -Int1_decode_ber(asn1_TYPE_descriptor_t *td, - void **structure, void *bufptr, size_t size, int tag_mode) { - Int1_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); -} - -asn_enc_rval_t -Int1_encode_der(asn1_TYPE_descriptor_t *td, - void *structure, int tag_mode, ber_tlv_tag_t tag, - asn_app_consume_bytes_f *cb, void *app_key) { - Int1_inherit_TYPE_descriptor(td); - return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); -} - -asn_enc_rval_t -Int1_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, - int ilevel, enum xer_encoder_flags_e flags, - asn_app_consume_bytes_f *cb, void *app_key) { - Int1_inherit_TYPE_descriptor(td); - return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); -} - - -/*** <<< STAT-DEFS [Int1] >>> ***/ - -static ber_tlv_tag_t asn1_DEF_Int1_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) -}; -asn1_TYPE_descriptor_t asn1_DEF_Int1 = { - "Int1", - Int1_free, - Int1_print, - Int1_constraint, - Int1_decode_ber, - Int1_encode_der, - 0, /* Not implemented yet */ - Int1_encode_xer, - 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Int1_tags, - sizeof(asn1_DEF_Int1_tags) - /sizeof(asn1_DEF_Int1_tags[0]), /* 1 */ - asn1_DEF_Int1_tags, /* Same as above */ - sizeof(asn1_DEF_Int1_tags) - /sizeof(asn1_DEF_Int1_tags[0]), /* 1 */ - -0, /* Unknown yet */ - 0, 0, /* No members */ - 0 /* No specifics */ -}; +/* This type is equivalent to INTEGER */ /*** <<< INCLUDES [Int2] >>> ***/ @@ -137,7 +42,6 @@ xer_type_encoder_f Int2_encode_xer; int Int2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const Int1_t *st = sptr; long value; @@ -174,7 +78,6 @@ Int2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_Int1.der_encoder; td->xer_decoder = asn1_DEF_Int1.xer_decoder; td->xer_encoder = asn1_DEF_Int1.xer_encoder; - td->last_tag_form = asn1_DEF_Int1.last_tag_form; td->elements = asn1_DEF_Int1.elements; td->elements_count = asn1_DEF_Int1.elements_count; td->specifics = asn1_DEF_Int1.specifics; @@ -239,7 +142,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Int2 = { asn1_DEF_Int2_tags, /* Same as above */ sizeof(asn1_DEF_Int2_tags) /sizeof(asn1_DEF_Int2_tags[0]), /* 1 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -269,7 +171,6 @@ xer_type_encoder_f Int3_encode_xer; int Int3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const Int2_t *st = sptr; long value; @@ -310,7 +211,6 @@ Int3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_Int2.der_encoder; td->xer_decoder = asn1_DEF_Int2.xer_decoder; td->xer_encoder = asn1_DEF_Int2.xer_encoder; - td->last_tag_form = asn1_DEF_Int2.last_tag_form; td->elements = asn1_DEF_Int2.elements; td->elements_count = asn1_DEF_Int2.elements_count; td->specifics = asn1_DEF_Int2.specifics; @@ -375,7 +275,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Int3 = { asn1_DEF_Int3_tags, /* Same as above */ sizeof(asn1_DEF_Int3_tags) /sizeof(asn1_DEF_Int3_tags[0]), /* 1 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -405,7 +304,6 @@ xer_type_encoder_f Int4_encode_xer; int Int4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const Int3_t *st = sptr; long value; @@ -446,7 +344,6 @@ Int4_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_Int3.der_encoder; td->xer_decoder = asn1_DEF_Int3.xer_decoder; td->xer_encoder = asn1_DEF_Int3.xer_encoder; - td->last_tag_form = asn1_DEF_Int3.last_tag_form; td->elements = asn1_DEF_Int3.elements; td->elements_count = asn1_DEF_Int3.elements_count; td->specifics = asn1_DEF_Int3.specifics; @@ -511,7 +408,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Int4 = { asn1_DEF_Int4_tags, /* Same as above */ sizeof(asn1_DEF_Int4_tags) /sizeof(asn1_DEF_Int4_tags[0]), /* 1 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -541,7 +437,6 @@ xer_type_encoder_f Int5_encode_xer; int Int5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const Int4_t *st = sptr; long value; @@ -582,7 +477,6 @@ Int5_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_Int4.der_encoder; td->xer_decoder = asn1_DEF_Int4.xer_decoder; td->xer_encoder = asn1_DEF_Int4.xer_encoder; - td->last_tag_form = asn1_DEF_Int4.last_tag_form; td->elements = asn1_DEF_Int4.elements; td->elements_count = asn1_DEF_Int4.elements_count; td->specifics = asn1_DEF_Int4.specifics; @@ -647,7 +541,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Int5 = { asn1_DEF_Int5_tags, /* Same as above */ sizeof(asn1_DEF_Int5_tags) /sizeof(asn1_DEF_Int5_tags[0]), /* 1 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -677,7 +570,6 @@ xer_type_encoder_f ExtensibleExtensions_encode_xer; int ExtensibleExtensions_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const INTEGER_t *st = sptr; long value; @@ -718,7 +610,6 @@ ExtensibleExtensions_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_INTEGER.der_encoder; td->xer_decoder = asn1_DEF_INTEGER.xer_decoder; td->xer_encoder = asn1_DEF_INTEGER.xer_encoder; - td->last_tag_form = asn1_DEF_INTEGER.last_tag_form; td->elements = asn1_DEF_INTEGER.elements; td->elements_count = asn1_DEF_INTEGER.elements_count; td->specifics = asn1_DEF_INTEGER.specifics; @@ -783,7 +674,6 @@ asn1_TYPE_descriptor_t asn1_DEF_ExtensibleExtensions = { asn1_DEF_ExtensibleExtensions_tags, /* Same as above */ sizeof(asn1_DEF_ExtensibleExtensions_tags) /sizeof(asn1_DEF_ExtensibleExtensions_tags[0]), /* 1 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -800,107 +690,12 @@ typedef IA5String_t Str1_t; /*** <<< FUNC-DECLS [Str1] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Str1; -asn_struct_free_f Str1_free; -asn_struct_print_f Str1_print; -asn_constr_check_f Str1_constraint; -ber_type_decoder_f Str1_decode_ber; -der_type_encoder_f Str1_encode_der; -xer_type_encoder_f Str1_encode_xer; +/* This type is equivalent to IA5String */ +#define asn1_DEF_Str1 asn1_DEF_IA5String /*** <<< CODE [Str1] >>> ***/ -int -Str1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, - asn_app_consume_bytes_f *app_errlog, void *app_key) { - - /* Make the underlying type checker permanent */ - td->check_constraints = asn1_DEF_IA5String.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); -} - -/* - * This type is implemented using IA5String, - * so here we adjust the DEF accordingly. - */ -static void -Str1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_IA5String.free_struct; - td->print_struct = asn1_DEF_IA5String.print_struct; - td->ber_decoder = asn1_DEF_IA5String.ber_decoder; - td->der_encoder = asn1_DEF_IA5String.der_encoder; - td->xer_decoder = asn1_DEF_IA5String.xer_decoder; - td->xer_encoder = asn1_DEF_IA5String.xer_encoder; - td->last_tag_form = asn1_DEF_IA5String.last_tag_form; - td->elements = asn1_DEF_IA5String.elements; - td->elements_count = asn1_DEF_IA5String.elements_count; - td->specifics = asn1_DEF_IA5String.specifics; -} - -void -Str1_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { - Str1_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); -} - -int -Str1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - Str1_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -ber_dec_rval_t -Str1_decode_ber(asn1_TYPE_descriptor_t *td, - void **structure, void *bufptr, size_t size, int tag_mode) { - Str1_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); -} - -asn_enc_rval_t -Str1_encode_der(asn1_TYPE_descriptor_t *td, - void *structure, int tag_mode, ber_tlv_tag_t tag, - asn_app_consume_bytes_f *cb, void *app_key) { - Str1_inherit_TYPE_descriptor(td); - return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); -} - -asn_enc_rval_t -Str1_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, - int ilevel, enum xer_encoder_flags_e flags, - asn_app_consume_bytes_f *cb, void *app_key) { - Str1_inherit_TYPE_descriptor(td); - return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); -} - - -/*** <<< STAT-DEFS [Str1] >>> ***/ - -static ber_tlv_tag_t asn1_DEF_Str1_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) -}; -asn1_TYPE_descriptor_t asn1_DEF_Str1 = { - "Str1", - Str1_free, - Str1_print, - Str1_constraint, - Str1_decode_ber, - Str1_encode_der, - 0, /* Not implemented yet */ - Str1_encode_xer, - 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Str1_tags, - sizeof(asn1_DEF_Str1_tags) - /sizeof(asn1_DEF_Str1_tags[0]), /* 1 */ - asn1_DEF_Str1_tags, /* Same as above */ - sizeof(asn1_DEF_Str1_tags) - /sizeof(asn1_DEF_Str1_tags[0]), /* 1 */ - -0, /* Unknown yet */ - 0, 0, /* No members */ - 0 /* No specifics */ -}; +/* This type is equivalent to IA5String */ /*** <<< INCLUDES [Str2] >>> ***/ @@ -943,7 +738,6 @@ static int check_permitted_alphabet_1(const void *sptr) { int Str2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const Str1_t *st = sptr; size_t size; @@ -980,7 +774,6 @@ Str2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_Str1.der_encoder; td->xer_decoder = asn1_DEF_Str1.xer_decoder; td->xer_encoder = asn1_DEF_Str1.xer_encoder; - td->last_tag_form = asn1_DEF_Str1.last_tag_form; td->elements = asn1_DEF_Str1.elements; td->elements_count = asn1_DEF_Str1.elements_count; td->specifics = asn1_DEF_Str1.specifics; @@ -1045,7 +838,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Str2 = { asn1_DEF_Str2_tags, /* Same as above */ sizeof(asn1_DEF_Str2_tags) /sizeof(asn1_DEF_Str2_tags[0]), /* 1 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1102,7 +894,6 @@ static int check_permitted_alphabet_2(const void *sptr) { int Str3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const Str2_t *st = sptr; size_t size; @@ -1139,7 +930,6 @@ Str3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_Str2.der_encoder; td->xer_decoder = asn1_DEF_Str2.xer_decoder; td->xer_encoder = asn1_DEF_Str2.xer_encoder; - td->last_tag_form = asn1_DEF_Str2.last_tag_form; td->elements = asn1_DEF_Str2.elements; td->elements_count = asn1_DEF_Str2.elements_count; td->specifics = asn1_DEF_Str2.specifics; @@ -1204,7 +994,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Str3 = { asn1_DEF_Str3_tags, /* Same as above */ sizeof(asn1_DEF_Str3_tags) /sizeof(asn1_DEF_Str3_tags[0]), /* 1 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1250,7 +1039,6 @@ static int check_permitted_alphabet_3(const void *sptr) { int Str4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const IA5String_t *st = sptr; if(!sptr) { @@ -1284,7 +1072,6 @@ Str4_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_IA5String.der_encoder; td->xer_decoder = asn1_DEF_IA5String.xer_decoder; td->xer_encoder = asn1_DEF_IA5String.xer_encoder; - td->last_tag_form = asn1_DEF_IA5String.last_tag_form; td->elements = asn1_DEF_IA5String.elements; td->elements_count = asn1_DEF_IA5String.elements_count; td->specifics = asn1_DEF_IA5String.specifics; @@ -1349,7 +1136,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Str4 = { asn1_DEF_Str4_tags, /* Same as above */ sizeof(asn1_DEF_Str4_tags) /sizeof(asn1_DEF_Str4_tags[0]), /* 1 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1395,7 +1181,6 @@ static int check_permitted_alphabet_4(const void *sptr) { int PER_Visible_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const IA5String_t *st = sptr; if(!sptr) { @@ -1429,7 +1214,6 @@ PER_Visible_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_IA5String.der_encoder; td->xer_decoder = asn1_DEF_IA5String.xer_decoder; td->xer_encoder = asn1_DEF_IA5String.xer_encoder; - td->last_tag_form = asn1_DEF_IA5String.last_tag_form; td->elements = asn1_DEF_IA5String.elements; td->elements_count = asn1_DEF_IA5String.elements_count; td->specifics = asn1_DEF_IA5String.specifics; @@ -1494,7 +1278,6 @@ asn1_TYPE_descriptor_t asn1_DEF_PER_Visible = { asn1_DEF_PER_Visible_tags, /* Same as above */ sizeof(asn1_DEF_PER_Visible_tags) /sizeof(asn1_DEF_PER_Visible_tags[0]), /* 1 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1540,7 +1323,6 @@ static int check_permitted_alphabet_5(const void *sptr) { int PER_Visible_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const PER_Visible_t *st = sptr; if(!sptr) { @@ -1574,7 +1356,6 @@ PER_Visible_2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_PER_Visible.der_encoder; td->xer_decoder = asn1_DEF_PER_Visible.xer_decoder; td->xer_encoder = asn1_DEF_PER_Visible.xer_encoder; - td->last_tag_form = asn1_DEF_PER_Visible.last_tag_form; td->elements = asn1_DEF_PER_Visible.elements; td->elements_count = asn1_DEF_PER_Visible.elements_count; td->specifics = asn1_DEF_PER_Visible.specifics; @@ -1639,7 +1420,6 @@ asn1_TYPE_descriptor_t asn1_DEF_PER_Visible_2 = { asn1_DEF_PER_Visible_2_tags, /* Same as above */ sizeof(asn1_DEF_PER_Visible_2_tags) /sizeof(asn1_DEF_PER_Visible_2_tags[0]), /* 1 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1685,7 +1465,6 @@ static int check_permitted_alphabet_6(const void *sptr) { int Not_PER_Visible_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const PER_Visible_t *st = sptr; if(!sptr) { @@ -1719,7 +1498,6 @@ Not_PER_Visible_1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_PER_Visible.der_encoder; td->xer_decoder = asn1_DEF_PER_Visible.xer_decoder; td->xer_encoder = asn1_DEF_PER_Visible.xer_encoder; - td->last_tag_form = asn1_DEF_PER_Visible.last_tag_form; td->elements = asn1_DEF_PER_Visible.elements; td->elements_count = asn1_DEF_PER_Visible.elements_count; td->specifics = asn1_DEF_PER_Visible.specifics; @@ -1784,7 +1562,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_1 = { asn1_DEF_Not_PER_Visible_1_tags, /* Same as above */ sizeof(asn1_DEF_Not_PER_Visible_1_tags) /sizeof(asn1_DEF_Not_PER_Visible_1_tags[0]), /* 1 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1830,7 +1607,6 @@ static int check_permitted_alphabet_7(const void *sptr) { int Not_PER_Visible_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const PER_Visible_t *st = sptr; if(!sptr) { @@ -1864,7 +1640,6 @@ Not_PER_Visible_2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_PER_Visible.der_encoder; td->xer_decoder = asn1_DEF_PER_Visible.xer_decoder; td->xer_encoder = asn1_DEF_PER_Visible.xer_encoder; - td->last_tag_form = asn1_DEF_PER_Visible.last_tag_form; td->elements = asn1_DEF_PER_Visible.elements; td->elements_count = asn1_DEF_PER_Visible.elements_count; td->specifics = asn1_DEF_PER_Visible.specifics; @@ -1929,7 +1704,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_2 = { asn1_DEF_Not_PER_Visible_2_tags, /* Same as above */ sizeof(asn1_DEF_Not_PER_Visible_2_tags) /sizeof(asn1_DEF_Not_PER_Visible_2_tags[0]), /* 1 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1975,7 +1749,6 @@ static int check_permitted_alphabet_8(const void *sptr) { int Not_PER_Visible_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const PER_Visible_t *st = sptr; if(!sptr) { @@ -2009,7 +1782,6 @@ Not_PER_Visible_3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_PER_Visible.der_encoder; td->xer_decoder = asn1_DEF_PER_Visible.xer_decoder; td->xer_encoder = asn1_DEF_PER_Visible.xer_encoder; - td->last_tag_form = asn1_DEF_PER_Visible.last_tag_form; td->elements = asn1_DEF_PER_Visible.elements; td->elements_count = asn1_DEF_PER_Visible.elements_count; td->specifics = asn1_DEF_PER_Visible.specifics; @@ -2074,7 +1846,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_3 = { asn1_DEF_Not_PER_Visible_3_tags, /* Same as above */ sizeof(asn1_DEF_Not_PER_Visible_3_tags) /sizeof(asn1_DEF_Not_PER_Visible_3_tags[0]), /* 1 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -2120,7 +1891,6 @@ static int check_permitted_alphabet_9(const void *sptr) { int SIZE_but_not_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const PER_Visible_t *st = sptr; size_t size; @@ -2157,7 +1927,6 @@ SIZE_but_not_FROM_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_PER_Visible.der_encoder; td->xer_decoder = asn1_DEF_PER_Visible.xer_decoder; td->xer_encoder = asn1_DEF_PER_Visible.xer_encoder; - td->last_tag_form = asn1_DEF_PER_Visible.last_tag_form; td->elements = asn1_DEF_PER_Visible.elements; td->elements_count = asn1_DEF_PER_Visible.elements_count; td->specifics = asn1_DEF_PER_Visible.specifics; @@ -2222,7 +1991,6 @@ asn1_TYPE_descriptor_t asn1_DEF_SIZE_but_not_FROM = { asn1_DEF_SIZE_but_not_FROM_tags, /* Same as above */ sizeof(asn1_DEF_SIZE_but_not_FROM_tags) /sizeof(asn1_DEF_SIZE_but_not_FROM_tags[0]), /* 1 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -2268,7 +2036,6 @@ static int check_permitted_alphabet_10(const void *sptr) { int SIZE_and_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const PER_Visible_t *st = sptr; size_t size; @@ -2305,7 +2072,6 @@ SIZE_and_FROM_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_PER_Visible.der_encoder; td->xer_decoder = asn1_DEF_PER_Visible.xer_decoder; td->xer_encoder = asn1_DEF_PER_Visible.xer_encoder; - td->last_tag_form = asn1_DEF_PER_Visible.last_tag_form; td->elements = asn1_DEF_PER_Visible.elements; td->elements_count = asn1_DEF_PER_Visible.elements_count; td->specifics = asn1_DEF_PER_Visible.specifics; @@ -2370,7 +2136,6 @@ asn1_TYPE_descriptor_t asn1_DEF_SIZE_and_FROM = { asn1_DEF_SIZE_and_FROM_tags, /* Same as above */ sizeof(asn1_DEF_SIZE_and_FROM_tags) /sizeof(asn1_DEF_SIZE_and_FROM_tags[0]), /* 1 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -2416,7 +2181,6 @@ static int check_permitted_alphabet_11(const void *sptr) { int Neither_SIZE_nor_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const PER_Visible_t *st = sptr; if(!sptr) { @@ -2450,7 +2214,6 @@ Neither_SIZE_nor_FROM_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_PER_Visible.der_encoder; td->xer_decoder = asn1_DEF_PER_Visible.xer_decoder; td->xer_encoder = asn1_DEF_PER_Visible.xer_encoder; - td->last_tag_form = asn1_DEF_PER_Visible.last_tag_form; td->elements = asn1_DEF_PER_Visible.elements; td->elements_count = asn1_DEF_PER_Visible.elements_count; td->specifics = asn1_DEF_PER_Visible.specifics; @@ -2515,7 +2278,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Neither_SIZE_nor_FROM = { asn1_DEF_Neither_SIZE_nor_FROM_tags, /* Same as above */ sizeof(asn1_DEF_Neither_SIZE_nor_FROM_tags) /sizeof(asn1_DEF_Neither_SIZE_nor_FROM_tags[0]), /* 1 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -2574,7 +2336,6 @@ static int check_permitted_alphabet_12(const void *sptr) { int Utf8_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const Utf8_2_t *st = sptr; size_t size; @@ -2612,7 +2373,6 @@ Utf8_3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_Utf8_2.der_encoder; td->xer_decoder = asn1_DEF_Utf8_2.xer_decoder; td->xer_encoder = asn1_DEF_Utf8_2.xer_encoder; - td->last_tag_form = asn1_DEF_Utf8_2.last_tag_form; td->elements = asn1_DEF_Utf8_2.elements; td->elements_count = asn1_DEF_Utf8_2.elements_count; td->specifics = asn1_DEF_Utf8_2.specifics; @@ -2677,7 +2437,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Utf8_3 = { asn1_DEF_Utf8_3_tags, /* Same as above */ sizeof(asn1_DEF_Utf8_3_tags) /sizeof(asn1_DEF_Utf8_3_tags[0]), /* 1 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -2707,7 +2466,6 @@ xer_type_encoder_f Utf8_2_encode_xer; int Utf8_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const Utf8_1_t *st = sptr; size_t size; @@ -2744,7 +2502,6 @@ Utf8_2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_Utf8_1.der_encoder; td->xer_decoder = asn1_DEF_Utf8_1.xer_decoder; td->xer_encoder = asn1_DEF_Utf8_1.xer_encoder; - td->last_tag_form = asn1_DEF_Utf8_1.last_tag_form; td->elements = asn1_DEF_Utf8_1.elements; td->elements_count = asn1_DEF_Utf8_1.elements_count; td->specifics = asn1_DEF_Utf8_1.specifics; @@ -2809,7 +2566,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Utf8_2 = { asn1_DEF_Utf8_2_tags, /* Same as above */ sizeof(asn1_DEF_Utf8_2_tags) /sizeof(asn1_DEF_Utf8_2_tags[0]), /* 1 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -2826,107 +2582,12 @@ typedef UTF8String_t Utf8_1_t; /*** <<< FUNC-DECLS [Utf8-1] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Utf8_1; -asn_struct_free_f Utf8_1_free; -asn_struct_print_f Utf8_1_print; -asn_constr_check_f Utf8_1_constraint; -ber_type_decoder_f Utf8_1_decode_ber; -der_type_encoder_f Utf8_1_encode_der; -xer_type_encoder_f Utf8_1_encode_xer; +/* This type is equivalent to UTF8String */ +#define asn1_DEF_Utf8_1 asn1_DEF_UTF8String /*** <<< CODE [Utf8-1] >>> ***/ -int -Utf8_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, - asn_app_consume_bytes_f *app_errlog, void *app_key) { - - /* Make the underlying type checker permanent */ - td->check_constraints = asn1_DEF_UTF8String.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); -} - -/* - * This type is implemented using UTF8String, - * so here we adjust the DEF accordingly. - */ -static void -Utf8_1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_UTF8String.free_struct; - td->print_struct = asn1_DEF_UTF8String.print_struct; - td->ber_decoder = asn1_DEF_UTF8String.ber_decoder; - td->der_encoder = asn1_DEF_UTF8String.der_encoder; - td->xer_decoder = asn1_DEF_UTF8String.xer_decoder; - td->xer_encoder = asn1_DEF_UTF8String.xer_encoder; - td->last_tag_form = asn1_DEF_UTF8String.last_tag_form; - td->elements = asn1_DEF_UTF8String.elements; - td->elements_count = asn1_DEF_UTF8String.elements_count; - td->specifics = asn1_DEF_UTF8String.specifics; -} - -void -Utf8_1_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { - Utf8_1_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); -} - -int -Utf8_1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - Utf8_1_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -ber_dec_rval_t -Utf8_1_decode_ber(asn1_TYPE_descriptor_t *td, - void **structure, void *bufptr, size_t size, int tag_mode) { - Utf8_1_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); -} - -asn_enc_rval_t -Utf8_1_encode_der(asn1_TYPE_descriptor_t *td, - void *structure, int tag_mode, ber_tlv_tag_t tag, - asn_app_consume_bytes_f *cb, void *app_key) { - Utf8_1_inherit_TYPE_descriptor(td); - return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); -} - -asn_enc_rval_t -Utf8_1_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, - int ilevel, enum xer_encoder_flags_e flags, - asn_app_consume_bytes_f *cb, void *app_key) { - Utf8_1_inherit_TYPE_descriptor(td); - return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); -} - - -/*** <<< STAT-DEFS [Utf8-1] >>> ***/ - -static ber_tlv_tag_t asn1_DEF_Utf8_1_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)) -}; -asn1_TYPE_descriptor_t asn1_DEF_Utf8_1 = { - "Utf8-1", - Utf8_1_free, - Utf8_1_print, - Utf8_1_constraint, - Utf8_1_decode_ber, - Utf8_1_encode_der, - 0, /* Not implemented yet */ - Utf8_1_encode_xer, - 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Utf8_1_tags, - sizeof(asn1_DEF_Utf8_1_tags) - /sizeof(asn1_DEF_Utf8_1_tags[0]), /* 1 */ - asn1_DEF_Utf8_1_tags, /* Same as above */ - sizeof(asn1_DEF_Utf8_1_tags) - /sizeof(asn1_DEF_Utf8_1_tags[0]), /* 1 */ - -0, /* Unknown yet */ - 0, 0, /* No members */ - 0 /* No specifics */ -}; +/* This type is equivalent to UTF8String */ /*** <<< INCLUDES [VisibleIdentifier] >>> ***/ @@ -2940,153 +2601,12 @@ typedef Identifier_t VisibleIdentifier_t; /*** <<< FUNC-DECLS [VisibleIdentifier] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_VisibleIdentifier; -asn_struct_free_f VisibleIdentifier_free; -asn_struct_print_f VisibleIdentifier_print; -asn_constr_check_f VisibleIdentifier_constraint; -ber_type_decoder_f VisibleIdentifier_decode_ber; -der_type_encoder_f VisibleIdentifier_encode_der; -xer_type_encoder_f VisibleIdentifier_encode_xer; - -/*** <<< CTABLES [VisibleIdentifier] >>> ***/ - -static int permitted_alphabet_table_14[256] = { -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, /* $ */ -1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, /* 0123456789 */ -0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ABCDEFGHIJKLMNO */ -1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1, /* PQRSTUVWXYZ _ */ -0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* abcdefghijklmno */ -1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, /* pqrstuvwxyz */ -}; - -static int check_permitted_alphabet_14(const void *sptr) { - int *table = permitted_alphabet_table_14; - /* The underlying type is VisibleString */ - const VisibleString_t *st = sptr; - const uint8_t *ch = st->buf; - const uint8_t *end = ch + st->size; - - for(; ch < end; ch++) { - uint8_t cv = *ch; - if(!table[cv]) return -1; - } - return 0; -} - +/* This type is equivalent to Identifier */ +#define asn1_DEF_VisibleIdentifier asn1_DEF_Identifier /*** <<< CODE [VisibleIdentifier] >>> ***/ -int -VisibleIdentifier_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, - asn_app_consume_bytes_f *app_errlog, void *app_key) { - - const Identifier_t *st = sptr; - size_t size; - - if(!sptr) { - _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } - - size = st->size; - - if((size >= 1 && size <= 32) - && !check_permitted_alphabet_14(sptr)) { - /* Constraint check succeeded */ - return 0; - } else { - _ASN_ERRLOG(app_errlog, app_key, - "%s: constraint failed (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } -} - -/* - * This type is implemented using Identifier, - * so here we adjust the DEF accordingly. - */ -static void -VisibleIdentifier_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_Identifier.free_struct; - td->print_struct = asn1_DEF_Identifier.print_struct; - td->ber_decoder = asn1_DEF_Identifier.ber_decoder; - td->der_encoder = asn1_DEF_Identifier.der_encoder; - td->xer_decoder = asn1_DEF_Identifier.xer_decoder; - td->xer_encoder = asn1_DEF_Identifier.xer_encoder; - td->last_tag_form = asn1_DEF_Identifier.last_tag_form; - td->elements = asn1_DEF_Identifier.elements; - td->elements_count = asn1_DEF_Identifier.elements_count; - td->specifics = asn1_DEF_Identifier.specifics; -} - -void -VisibleIdentifier_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { - VisibleIdentifier_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); -} - -int -VisibleIdentifier_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - VisibleIdentifier_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -ber_dec_rval_t -VisibleIdentifier_decode_ber(asn1_TYPE_descriptor_t *td, - void **structure, void *bufptr, size_t size, int tag_mode) { - VisibleIdentifier_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); -} - -asn_enc_rval_t -VisibleIdentifier_encode_der(asn1_TYPE_descriptor_t *td, - void *structure, int tag_mode, ber_tlv_tag_t tag, - asn_app_consume_bytes_f *cb, void *app_key) { - VisibleIdentifier_inherit_TYPE_descriptor(td); - return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); -} - -asn_enc_rval_t -VisibleIdentifier_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, - int ilevel, enum xer_encoder_flags_e flags, - asn_app_consume_bytes_f *cb, void *app_key) { - VisibleIdentifier_inherit_TYPE_descriptor(td); - return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); -} - - -/*** <<< STAT-DEFS [VisibleIdentifier] >>> ***/ - -static ber_tlv_tag_t asn1_DEF_VisibleIdentifier_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)) -}; -asn1_TYPE_descriptor_t asn1_DEF_VisibleIdentifier = { - "VisibleIdentifier", - VisibleIdentifier_free, - VisibleIdentifier_print, - VisibleIdentifier_constraint, - VisibleIdentifier_decode_ber, - VisibleIdentifier_encode_der, - 0, /* Not implemented yet */ - VisibleIdentifier_encode_xer, - 0, /* Use generic outmost tag fetcher */ - asn1_DEF_VisibleIdentifier_tags, - sizeof(asn1_DEF_VisibleIdentifier_tags) - /sizeof(asn1_DEF_VisibleIdentifier_tags[0]), /* 1 */ - asn1_DEF_VisibleIdentifier_tags, /* Same as above */ - sizeof(asn1_DEF_VisibleIdentifier_tags) - /sizeof(asn1_DEF_VisibleIdentifier_tags[0]), /* 1 */ - -0, /* Unknown yet */ - 0, 0, /* No members */ - 0 /* No specifics */ -}; +/* This type is equivalent to Identifier */ /*** <<< INCLUDES [Identifier] >>> ***/ @@ -3110,7 +2630,7 @@ xer_type_encoder_f Identifier_encode_xer; /*** <<< CTABLES [Identifier] >>> ***/ -static int permitted_alphabet_table_15[256] = { +static int permitted_alphabet_table_14[256] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, /* $ */ @@ -3121,8 +2641,8 @@ static int permitted_alphabet_table_15[256] = { 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, /* pqrstuvwxyz */ }; -static int check_permitted_alphabet_15(const void *sptr) { - int *table = permitted_alphabet_table_15; +static int check_permitted_alphabet_14(const void *sptr) { + int *table = permitted_alphabet_table_14; /* The underlying type is VisibleString */ const VisibleString_t *st = sptr; const uint8_t *ch = st->buf; @@ -3141,7 +2661,6 @@ static int check_permitted_alphabet_15(const void *sptr) { int Identifier_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - const VisibleString_t *st = sptr; size_t size; @@ -3155,7 +2674,7 @@ Identifier_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, size = st->size; if((size >= 1 && size <= 32) - && !check_permitted_alphabet_15(sptr)) { + && !check_permitted_alphabet_14(sptr)) { /* Constraint check succeeded */ return 0; } else { @@ -3178,7 +2697,6 @@ Identifier_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_VisibleString.der_encoder; td->xer_decoder = asn1_DEF_VisibleString.xer_decoder; td->xer_encoder = asn1_DEF_VisibleString.xer_encoder; - td->last_tag_form = asn1_DEF_VisibleString.last_tag_form; td->elements = asn1_DEF_VisibleString.elements; td->elements_count = asn1_DEF_VisibleString.elements_count; td->specifics = asn1_DEF_VisibleString.specifics; @@ -3243,7 +2761,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Identifier = { asn1_DEF_Identifier_tags, /* Same as above */ sizeof(asn1_DEF_Identifier_tags) /sizeof(asn1_DEF_Identifier_tags[0]), /* 1 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/tests/60-any-OK.asn1.-P b/tests/60-any-OK.asn1.-P index 2da68af1e..ded466ba6 100644 --- a/tests/60-any-OK.asn1.-P +++ b/tests/60-any-OK.asn1.-P @@ -68,7 +68,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T1 = { asn1_DEF_T1_tags, /* Same as above */ sizeof(asn1_DEF_T1_tags) /sizeof(asn1_DEF_T1_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_T1, 2, /* Elements count */ &asn1_DEF_T1_specs /* Additional specs */ @@ -145,7 +144,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { asn1_DEF_T2_tags, /* Same as above */ sizeof(asn1_DEF_T2_tags) /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_T2, 2, /* Elements count */ &asn1_DEF_T2_specs /* Additional specs */ diff --git a/tests/65-multi-tag-OK.asn1.-P b/tests/65-multi-tag-OK.asn1.-P index 111c27610..150fb21a2 100644 --- a/tests/65-multi-tag-OK.asn1.-P +++ b/tests/65-multi-tag-OK.asn1.-P @@ -23,11 +23,9 @@ xer_type_encoder_f T1_encode_xer; int T1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - - /* Make the underlying type checker permanent */ + /* Replace with underlying type checker */ td->check_constraints = asn1_DEF_T2.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); + return td->check_constraints(td, sptr, app_errlog, app_key); } /* @@ -42,7 +40,6 @@ T1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_T2.der_encoder; td->xer_decoder = asn1_DEF_T2.xer_decoder; td->xer_encoder = asn1_DEF_T2.xer_encoder; - td->last_tag_form = asn1_DEF_T2.last_tag_form; td->elements = asn1_DEF_T2.elements; td->elements_count = asn1_DEF_T2.elements_count; td->specifics = asn1_DEF_T2.specifics; @@ -118,7 +115,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T1 = { asn1_DEF_T1_all_tags, sizeof(asn1_DEF_T1_all_tags) /sizeof(asn1_DEF_T1_all_tags[0]), /* 6 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -148,11 +144,9 @@ xer_type_encoder_f T2_encode_xer; int T2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - - /* Make the underlying type checker permanent */ + /* Replace with underlying type checker */ td->check_constraints = asn1_DEF_T3.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); + return td->check_constraints(td, sptr, app_errlog, app_key); } /* @@ -167,7 +161,6 @@ T2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_T3.der_encoder; td->xer_decoder = asn1_DEF_T3.xer_decoder; td->xer_encoder = asn1_DEF_T3.xer_encoder; - td->last_tag_form = asn1_DEF_T3.last_tag_form; td->elements = asn1_DEF_T3.elements; td->elements_count = asn1_DEF_T3.elements_count; td->specifics = asn1_DEF_T3.specifics; @@ -241,7 +234,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { asn1_DEF_T2_all_tags, sizeof(asn1_DEF_T2_all_tags) /sizeof(asn1_DEF_T2_all_tags[0]), /* 5 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -271,11 +263,9 @@ xer_type_encoder_f T3_encode_xer; int T3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - - /* Make the underlying type checker permanent */ + /* Replace with underlying type checker */ td->check_constraints = asn1_DEF_T4.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); + return td->check_constraints(td, sptr, app_errlog, app_key); } /* @@ -290,7 +280,6 @@ T3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_T4.der_encoder; td->xer_decoder = asn1_DEF_T4.xer_decoder; td->xer_encoder = asn1_DEF_T4.xer_encoder; - td->last_tag_form = asn1_DEF_T4.last_tag_form; td->elements = asn1_DEF_T4.elements; td->elements_count = asn1_DEF_T4.elements_count; td->specifics = asn1_DEF_T4.specifics; @@ -362,7 +351,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T3 = { asn1_DEF_T3_all_tags, sizeof(asn1_DEF_T3_all_tags) /sizeof(asn1_DEF_T3_all_tags[0]), /* 4 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -392,11 +380,9 @@ xer_type_encoder_f T4_encode_xer; int T4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - - /* Make the underlying type checker permanent */ + /* Replace with underlying type checker */ td->check_constraints = asn1_DEF_T5.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); + return td->check_constraints(td, sptr, app_errlog, app_key); } /* @@ -411,7 +397,6 @@ T4_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_T5.der_encoder; td->xer_decoder = asn1_DEF_T5.xer_decoder; td->xer_encoder = asn1_DEF_T5.xer_encoder; - td->last_tag_form = asn1_DEF_T5.last_tag_form; td->elements = asn1_DEF_T5.elements; td->elements_count = asn1_DEF_T5.elements_count; td->specifics = asn1_DEF_T5.specifics; @@ -478,7 +463,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T4 = { asn1_DEF_T4_tags, /* Same as above */ sizeof(asn1_DEF_T4_tags) /sizeof(asn1_DEF_T4_tags[0]), /* 3 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -508,11 +492,9 @@ xer_type_encoder_f T5_encode_xer; int T5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - - /* Make the underlying type checker permanent */ + /* Replace with underlying type checker */ td->check_constraints = asn1_DEF_T6.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); + return td->check_constraints(td, sptr, app_errlog, app_key); } /* @@ -527,7 +509,6 @@ T5_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_T6.der_encoder; td->xer_decoder = asn1_DEF_T6.xer_decoder; td->xer_encoder = asn1_DEF_T6.xer_encoder; - td->last_tag_form = asn1_DEF_T6.last_tag_form; td->elements = asn1_DEF_T6.elements; td->elements_count = asn1_DEF_T6.elements_count; td->specifics = asn1_DEF_T6.specifics; @@ -593,7 +574,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T5 = { asn1_DEF_T5_tags, /* Same as above */ sizeof(asn1_DEF_T5_tags) /sizeof(asn1_DEF_T5_tags[0]), /* 2 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -610,107 +590,12 @@ typedef REAL_t T6_t; /*** <<< FUNC-DECLS [T6] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_T6; -asn_struct_free_f T6_free; -asn_struct_print_f T6_print; -asn_constr_check_f T6_constraint; -ber_type_decoder_f T6_decode_ber; -der_type_encoder_f T6_encode_der; -xer_type_encoder_f T6_encode_xer; +/* This type is equivalent to REAL */ +#define asn1_DEF_T6 asn1_DEF_REAL /*** <<< CODE [T6] >>> ***/ -int -T6_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, - asn_app_consume_bytes_f *app_errlog, void *app_key) { - - /* Make the underlying type checker permanent */ - td->check_constraints = asn1_DEF_REAL.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); -} - -/* - * This type is implemented using REAL, - * so here we adjust the DEF accordingly. - */ -static void -T6_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_REAL.free_struct; - td->print_struct = asn1_DEF_REAL.print_struct; - td->ber_decoder = asn1_DEF_REAL.ber_decoder; - td->der_encoder = asn1_DEF_REAL.der_encoder; - td->xer_decoder = asn1_DEF_REAL.xer_decoder; - td->xer_encoder = asn1_DEF_REAL.xer_encoder; - td->last_tag_form = asn1_DEF_REAL.last_tag_form; - td->elements = asn1_DEF_REAL.elements; - td->elements_count = asn1_DEF_REAL.elements_count; - td->specifics = asn1_DEF_REAL.specifics; -} - -void -T6_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { - T6_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); -} - -int -T6_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - T6_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -ber_dec_rval_t -T6_decode_ber(asn1_TYPE_descriptor_t *td, - void **structure, void *bufptr, size_t size, int tag_mode) { - T6_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); -} - -asn_enc_rval_t -T6_encode_der(asn1_TYPE_descriptor_t *td, - void *structure, int tag_mode, ber_tlv_tag_t tag, - asn_app_consume_bytes_f *cb, void *app_key) { - T6_inherit_TYPE_descriptor(td); - return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); -} - -asn_enc_rval_t -T6_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, - int ilevel, enum xer_encoder_flags_e flags, - asn_app_consume_bytes_f *cb, void *app_key) { - T6_inherit_TYPE_descriptor(td); - return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); -} - - -/*** <<< STAT-DEFS [T6] >>> ***/ - -static ber_tlv_tag_t asn1_DEF_T6_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) -}; -asn1_TYPE_descriptor_t asn1_DEF_T6 = { - "T6", - T6_free, - T6_print, - T6_constraint, - T6_decode_ber, - T6_encode_der, - 0, /* Not implemented yet */ - T6_encode_xer, - 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T6_tags, - sizeof(asn1_DEF_T6_tags) - /sizeof(asn1_DEF_T6_tags[0]), /* 1 */ - asn1_DEF_T6_tags, /* Same as above */ - sizeof(asn1_DEF_T6_tags) - /sizeof(asn1_DEF_T6_tags[0]), /* 1 */ - -0, /* Unknown yet */ - 0, 0, /* No members */ - 0 /* No specifics */ -}; +/* This type is equivalent to REAL */ /*** <<< INCLUDES [T] >>> ***/ @@ -737,11 +622,9 @@ xer_type_encoder_f T_encode_xer; int T_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - - /* Make the underlying type checker permanent */ + /* Replace with underlying type checker */ td->check_constraints = asn1_DEF_Ts.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); + return td->check_constraints(td, sptr, app_errlog, app_key); } /* @@ -756,7 +639,6 @@ T_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_Ts.der_encoder; td->xer_decoder = asn1_DEF_Ts.xer_decoder; td->xer_encoder = asn1_DEF_Ts.xer_encoder; - td->last_tag_form = asn1_DEF_Ts.last_tag_form; td->elements = asn1_DEF_Ts.elements; td->elements_count = asn1_DEF_Ts.elements_count; td->specifics = asn1_DEF_Ts.specifics; @@ -823,7 +705,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { asn1_DEF_T_tags, /* Same as above */ sizeof(asn1_DEF_T_tags) /sizeof(asn1_DEF_T_tags[0]), /* 3 */ - -0, /* Unknown yet */ 0, 0, /* Defined elsewhere */ 0 /* No specifics */ }; @@ -909,7 +790,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Ts = { asn1_DEF_Ts_tags, /* Same as above */ sizeof(asn1_DEF_Ts_tags) /sizeof(asn1_DEF_Ts_tags[0]), /* 2 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_Ts, 3, /* Elements count */ &asn1_DEF_Ts_specs /* Additional specs */ diff --git a/tests/65-multi-tag-OK.asn1.-Pfnative-types b/tests/65-multi-tag-OK.asn1.-Pfnative-types index 67bfa8d1e..f12b9024a 100644 --- a/tests/65-multi-tag-OK.asn1.-Pfnative-types +++ b/tests/65-multi-tag-OK.asn1.-Pfnative-types @@ -23,11 +23,9 @@ xer_type_encoder_f T1_encode_xer; int T1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - - /* Make the underlying type checker permanent */ + /* Replace with underlying type checker */ td->check_constraints = asn1_DEF_T2.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); + return td->check_constraints(td, sptr, app_errlog, app_key); } /* @@ -42,7 +40,6 @@ T1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_T2.der_encoder; td->xer_decoder = asn1_DEF_T2.xer_decoder; td->xer_encoder = asn1_DEF_T2.xer_encoder; - td->last_tag_form = asn1_DEF_T2.last_tag_form; td->elements = asn1_DEF_T2.elements; td->elements_count = asn1_DEF_T2.elements_count; td->specifics = asn1_DEF_T2.specifics; @@ -118,7 +115,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T1 = { asn1_DEF_T1_all_tags, sizeof(asn1_DEF_T1_all_tags) /sizeof(asn1_DEF_T1_all_tags[0]), /* 6 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -148,11 +144,9 @@ xer_type_encoder_f T2_encode_xer; int T2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - - /* Make the underlying type checker permanent */ + /* Replace with underlying type checker */ td->check_constraints = asn1_DEF_T3.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); + return td->check_constraints(td, sptr, app_errlog, app_key); } /* @@ -167,7 +161,6 @@ T2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_T3.der_encoder; td->xer_decoder = asn1_DEF_T3.xer_decoder; td->xer_encoder = asn1_DEF_T3.xer_encoder; - td->last_tag_form = asn1_DEF_T3.last_tag_form; td->elements = asn1_DEF_T3.elements; td->elements_count = asn1_DEF_T3.elements_count; td->specifics = asn1_DEF_T3.specifics; @@ -241,7 +234,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { asn1_DEF_T2_all_tags, sizeof(asn1_DEF_T2_all_tags) /sizeof(asn1_DEF_T2_all_tags[0]), /* 5 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -271,11 +263,9 @@ xer_type_encoder_f T3_encode_xer; int T3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - - /* Make the underlying type checker permanent */ + /* Replace with underlying type checker */ td->check_constraints = asn1_DEF_T4.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); + return td->check_constraints(td, sptr, app_errlog, app_key); } /* @@ -290,7 +280,6 @@ T3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_T4.der_encoder; td->xer_decoder = asn1_DEF_T4.xer_decoder; td->xer_encoder = asn1_DEF_T4.xer_encoder; - td->last_tag_form = asn1_DEF_T4.last_tag_form; td->elements = asn1_DEF_T4.elements; td->elements_count = asn1_DEF_T4.elements_count; td->specifics = asn1_DEF_T4.specifics; @@ -362,7 +351,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T3 = { asn1_DEF_T3_all_tags, sizeof(asn1_DEF_T3_all_tags) /sizeof(asn1_DEF_T3_all_tags[0]), /* 4 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -392,11 +380,9 @@ xer_type_encoder_f T4_encode_xer; int T4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - - /* Make the underlying type checker permanent */ + /* Replace with underlying type checker */ td->check_constraints = asn1_DEF_T5.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); + return td->check_constraints(td, sptr, app_errlog, app_key); } /* @@ -411,7 +397,6 @@ T4_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_T5.der_encoder; td->xer_decoder = asn1_DEF_T5.xer_decoder; td->xer_encoder = asn1_DEF_T5.xer_encoder; - td->last_tag_form = asn1_DEF_T5.last_tag_form; td->elements = asn1_DEF_T5.elements; td->elements_count = asn1_DEF_T5.elements_count; td->specifics = asn1_DEF_T5.specifics; @@ -478,7 +463,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T4 = { asn1_DEF_T4_tags, /* Same as above */ sizeof(asn1_DEF_T4_tags) /sizeof(asn1_DEF_T4_tags[0]), /* 3 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -508,11 +492,9 @@ xer_type_encoder_f T5_encode_xer; int T5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - - /* Make the underlying type checker permanent */ + /* Replace with underlying type checker */ td->check_constraints = asn1_DEF_T6.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); + return td->check_constraints(td, sptr, app_errlog, app_key); } /* @@ -527,7 +509,6 @@ T5_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_T6.der_encoder; td->xer_decoder = asn1_DEF_T6.xer_decoder; td->xer_encoder = asn1_DEF_T6.xer_encoder; - td->last_tag_form = asn1_DEF_T6.last_tag_form; td->elements = asn1_DEF_T6.elements; td->elements_count = asn1_DEF_T6.elements_count; td->specifics = asn1_DEF_T6.specifics; @@ -593,7 +574,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T5 = { asn1_DEF_T5_tags, /* Same as above */ sizeof(asn1_DEF_T5_tags) /sizeof(asn1_DEF_T5_tags[0]), /* 2 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -610,107 +590,12 @@ typedef double T6_t; /*** <<< FUNC-DECLS [T6] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_T6; -asn_struct_free_f T6_free; -asn_struct_print_f T6_print; -asn_constr_check_f T6_constraint; -ber_type_decoder_f T6_decode_ber; -der_type_encoder_f T6_encode_der; -xer_type_encoder_f T6_encode_xer; +/* This type is equivalent to NativeReal */ +#define asn1_DEF_T6 asn1_DEF_NativeReal /*** <<< CODE [T6] >>> ***/ -int -T6_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, - asn_app_consume_bytes_f *app_errlog, void *app_key) { - - /* Make the underlying type checker permanent */ - td->check_constraints = asn1_DEF_NativeReal.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); -} - -/* - * This type is implemented using NativeReal, - * so here we adjust the DEF accordingly. - */ -static void -T6_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_NativeReal.free_struct; - td->print_struct = asn1_DEF_NativeReal.print_struct; - td->ber_decoder = asn1_DEF_NativeReal.ber_decoder; - td->der_encoder = asn1_DEF_NativeReal.der_encoder; - td->xer_decoder = asn1_DEF_NativeReal.xer_decoder; - td->xer_encoder = asn1_DEF_NativeReal.xer_encoder; - td->last_tag_form = asn1_DEF_NativeReal.last_tag_form; - td->elements = asn1_DEF_NativeReal.elements; - td->elements_count = asn1_DEF_NativeReal.elements_count; - td->specifics = asn1_DEF_NativeReal.specifics; -} - -void -T6_free(asn1_TYPE_descriptor_t *td, - void *struct_ptr, int contents_only) { - T6_inherit_TYPE_descriptor(td); - td->free_struct(td, struct_ptr, contents_only); -} - -int -T6_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, - int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - T6_inherit_TYPE_descriptor(td); - return td->print_struct(td, struct_ptr, ilevel, cb, app_key); -} - -ber_dec_rval_t -T6_decode_ber(asn1_TYPE_descriptor_t *td, - void **structure, void *bufptr, size_t size, int tag_mode) { - T6_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); -} - -asn_enc_rval_t -T6_encode_der(asn1_TYPE_descriptor_t *td, - void *structure, int tag_mode, ber_tlv_tag_t tag, - asn_app_consume_bytes_f *cb, void *app_key) { - T6_inherit_TYPE_descriptor(td); - return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); -} - -asn_enc_rval_t -T6_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, - int ilevel, enum xer_encoder_flags_e flags, - asn_app_consume_bytes_f *cb, void *app_key) { - T6_inherit_TYPE_descriptor(td); - return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); -} - - -/*** <<< STAT-DEFS [T6] >>> ***/ - -static ber_tlv_tag_t asn1_DEF_T6_tags[] = { - (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) -}; -asn1_TYPE_descriptor_t asn1_DEF_T6 = { - "T6", - T6_free, - T6_print, - T6_constraint, - T6_decode_ber, - T6_encode_der, - 0, /* Not implemented yet */ - T6_encode_xer, - 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T6_tags, - sizeof(asn1_DEF_T6_tags) - /sizeof(asn1_DEF_T6_tags[0]), /* 1 */ - asn1_DEF_T6_tags, /* Same as above */ - sizeof(asn1_DEF_T6_tags) - /sizeof(asn1_DEF_T6_tags[0]), /* 1 */ - -0, /* Unknown yet */ - 0, 0, /* No members */ - 0 /* No specifics */ -}; +/* This type is equivalent to NativeReal */ /*** <<< INCLUDES [T] >>> ***/ @@ -737,11 +622,9 @@ xer_type_encoder_f T_encode_xer; int T_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - - /* Make the underlying type checker permanent */ + /* Replace with underlying type checker */ td->check_constraints = asn1_DEF_Ts.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); + return td->check_constraints(td, sptr, app_errlog, app_key); } /* @@ -756,7 +639,6 @@ T_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_Ts.der_encoder; td->xer_decoder = asn1_DEF_Ts.xer_decoder; td->xer_encoder = asn1_DEF_Ts.xer_encoder; - td->last_tag_form = asn1_DEF_Ts.last_tag_form; td->elements = asn1_DEF_Ts.elements; td->elements_count = asn1_DEF_Ts.elements_count; td->specifics = asn1_DEF_Ts.specifics; @@ -823,7 +705,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { asn1_DEF_T_tags, /* Same as above */ sizeof(asn1_DEF_T_tags) /sizeof(asn1_DEF_T_tags[0]), /* 3 */ - -0, /* Unknown yet */ 0, 0, /* Defined elsewhere */ 0 /* No specifics */ }; @@ -909,7 +790,6 @@ asn1_TYPE_descriptor_t asn1_DEF_Ts = { asn1_DEF_Ts_tags, /* Same as above */ sizeof(asn1_DEF_Ts_tags) /sizeof(asn1_DEF_Ts_tags[0]), /* 2 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_Ts, 3, /* Elements count */ &asn1_DEF_Ts_specs /* Additional specs */ diff --git a/tests/66-ref-simple-OK.asn1.-P b/tests/66-ref-simple-OK.asn1.-P index b023ad4fd..03027f0ac 100644 --- a/tests/66-ref-simple-OK.asn1.-P +++ b/tests/66-ref-simple-OK.asn1.-P @@ -54,7 +54,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { asn1_DEF_T_tags, /* Same as above */ sizeof(asn1_DEF_T_tags) /sizeof(asn1_DEF_T_tags[0]), /* 1 */ - 1, /* Whether CONSTRUCTED */ asn1_MBR_T, 1, /* Single element */ &asn1_DEF_T_specs /* Additional specs */ @@ -93,11 +92,9 @@ xer_type_encoder_f SimpleType_encode_xer; int SimpleType_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - - /* Make the underlying type checker permanent */ + /* Replace with underlying type checker */ td->check_constraints = asn1_DEF_ENUMERATED.check_constraints; - return td->check_constraints - (td, sptr, app_errlog, app_key); + return td->check_constraints(td, sptr, app_errlog, app_key); } /* @@ -112,7 +109,6 @@ SimpleType_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { td->der_encoder = asn1_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn1_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn1_DEF_ENUMERATED.xer_encoder; - td->last_tag_form = asn1_DEF_ENUMERATED.last_tag_form; td->elements = asn1_DEF_ENUMERATED.elements; td->elements_count = asn1_DEF_ENUMERATED.elements_count; td->specifics = asn1_DEF_ENUMERATED.specifics; @@ -177,7 +173,6 @@ asn1_TYPE_descriptor_t asn1_DEF_SimpleType = { asn1_DEF_SimpleType_tags, /* Same as above */ sizeof(asn1_DEF_SimpleType_tags) /sizeof(asn1_DEF_SimpleType_tags[0]), /* 1 */ - -0, /* Unknown yet */ 0, 0, /* No members */ 0 /* No specifics */ }; From bfc49bdec4bdfadafdcec205e0a40c6bc84c6943 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 26 Sep 2004 13:13:13 +0000 Subject: [PATCH 0405/1469] -fno-constraints git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@405 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/asn1c.1 | 5 ++++- asn1c/asn1c.c | 3 +++ doc/asn1c-usage.lyx | 21 ++++++++++++++++++++- doc/asn1c-usage.pdf | Bin 71786 -> 71499 bytes 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/asn1c/asn1c.1 b/asn1c/asn1c.1 index 359724b21..7ac0015c8 100644 --- a/asn1c/asn1c.1 +++ b/asn1c/asn1c.1 @@ -22,7 +22,7 @@ and other encoding standards. .TP \fILanguage Options\fR .br -\fB\-fall-defs-global \-fbless-SIZE \-fnative-types \-funnamed-unions \-ftypes88\fR +\fB\-fall-defs-global \-fbless-SIZE \-fnative-types \-fno-constraints \-funnamed-unions \-ftypes88\fR .TP \fIOutput Options\fR .br @@ -82,6 +82,9 @@ an ASN.1 standard and compiler may fail to produce the meaningful code. Use the native machine's data types (int, double) whenever possible, instead of the compound ASN.1 INTEGER_t, ENUMERATED_t and REAL_t types. .TP +.B \-fno-constraints +Do not generate ASN.1 subtype constraint checking code. This may make a shorter executable. +.TP .B \-funnamed-unions Enable unnamed unions in the definitions of target language's structures. .TP diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index 8c3a7e582..ad0cab43b 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -91,6 +91,8 @@ main(int ac, char **av) { asn1_compiler_flags |= A1C_USE_NATIVE_TYPES; } else if(strcmp(optarg, "native-types") == 0) { asn1_compiler_flags |= A1C_USE_NATIVE_TYPES; + } else if(strcmp(optarg, "no-constraints") == 0) { + asn1_compiler_flags |= A1C_NO_CONSTRAINTS; } else if(strcmp(optarg, "unnamed-unions") == 0) { asn1_compiler_flags |= A1C_UNNAMED_UNIONS; } else if(strcmp(optarg, "types88") == 0) { @@ -309,6 +311,7 @@ usage(const char *av0) { " -fbless-SIZE Allow SIZE() constraint for INTEGER etc (non-std.)\n" " -fknown-extern-type= Pretend this type is known\n" " -fnative-types Use \"int\" instead of INTEGER_t whenever possible\n" +" -fno-constraints Do not generate constraint checking code\n" " -funnamed-unions Enable unnamed unions in structures\n" " -ftypes88 Use only ASN.1:1988 embedded types\n" "\n" diff --git a/doc/asn1c-usage.lyx b/doc/asn1c-usage.lyx index 03d8a9703..b14674418 100644 --- a/doc/asn1c-usage.lyx +++ b/doc/asn1c-usage.lyx @@ -1315,7 +1315,7 @@ collapsed false \begin_inset Tabular - + @@ -1646,6 +1646,25 @@ Use the native machine's data types (int, double) whenever possible, instead \layout Standard +-fno-constraints +\end_inset +
    + +\begin_inset Text + +\layout Standard + +Do not generate ASN.1 subtype constraint checking code. + This may make a shorter executable. +\end_inset + +
    + + +\begin_inset Text + +\layout Standard + -funnamed-unions \end_inset diff --git a/doc/asn1c-usage.pdf b/doc/asn1c-usage.pdf index 85b31086e99cf86090f3339037dcab633d01f492..85ce3b056961cbcc80bf54efbf227edfc03030fa 100644 GIT binary patch delta 20911 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

    Z!r%>oop0Y1?oug5GEUV9mU-#TfXuAfK< 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 LL`Fu}R1flhOH(-$ delta 21229 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 Date: Sun, 26 Sep 2004 13:13:31 +0000 Subject: [PATCH 0406/1469] explanation git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@406 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.PKIX1/README | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 examples/sample.source.PKIX1/README diff --git a/examples/sample.source.PKIX1/README b/examples/sample.source.PKIX1/README new file mode 100644 index 000000000..76762f011 --- /dev/null +++ b/examples/sample.source.PKIX1/README @@ -0,0 +1,5 @@ + +The X.509 (PKIX1) certificate decoder. Invoking `make` will compile the ASN.1 +specifications from the RFC3280 in the above directory. This x509dump.c will +supply the missing "int main()" routine which drives the decoding process. + From a8b7cd6708e9f706d79c5aee5189d8859d858fdf Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 26 Sep 2004 13:15:05 +0000 Subject: [PATCH 0407/1469] added ber_codec_prim.[ch] git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@407 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.PKIX1/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index 87827a24d..9953647c9 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -307,6 +307,8 @@ ASN_MODULE_HEADERS+=OCTET_STRING.h ASN_MODULE_SOURCES+=OCTET_STRING.c ASN_MODULE_HEADERS+=ber_decoder.h ASN_MODULE_SOURCES+=ber_decoder.c +ASN_MODULE_SOURCES+=ber_codec_prim.c +ASN_MODULE_HEADERS+=ber_codec_prim.h ASN_MODULE_HEADERS+=ber_tlv_length.h ASN_MODULE_SOURCES+=ber_tlv_length.c ASN_MODULE_HEADERS+=ber_tlv_tag.h From 1ca8d23cf7b36f5ee3df4400ca3ac9f66b8a3d50 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 26 Sep 2004 13:16:33 +0000 Subject: [PATCH 0408/1469] added -Wpointer-arith and -Wchar-subscripts git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@408 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure | 3 ++- configure.in | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 6f313bbf9..f866aec76 100755 --- a/configure +++ b/configure @@ -21414,9 +21414,10 @@ case "$GCC" in CFLAGS="$CFLAGS -Wshadow" CFLAGS="$CFLAGS -Wcast-qual" CFLAGS="$CFLAGS -Wcast-align" + CFLAGS="$CFLAGS -Wpointer-arith" + CFLAGS="$CFLAGS -Wchar-subscripts" CFLAGS="$CFLAGS -Wmissing-prototypes" CFLAGS="$CFLAGS -Wmissing-declarations" - CFLAGS="$CFLAGS -Wredundant-decls" ;; esac diff --git a/configure.in b/configure.in index 0c3e8dd34..da0cad6ea 100644 --- a/configure.in +++ b/configure.in @@ -61,9 +61,10 @@ case "$GCC" in CFLAGS="$CFLAGS -Wshadow" CFLAGS="$CFLAGS -Wcast-qual" CFLAGS="$CFLAGS -Wcast-align" + CFLAGS="$CFLAGS -Wpointer-arith" + CFLAGS="$CFLAGS -Wchar-subscripts" CFLAGS="$CFLAGS -Wmissing-prototypes" CFLAGS="$CFLAGS -Wmissing-declarations" - CFLAGS="$CFLAGS -Wredundant-decls" ;; esac From 986afd6797f5085b52f274904dbb6a5c4564ee6f Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 26 Sep 2004 13:16:56 +0000 Subject: [PATCH 0409/1469] added -fno-constraints git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@409 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 98244726e..c9fe81125 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,11 +1,13 @@ -0.9.6: 2004-Sep-24 +0.9.6: 2004-Sep-26 * Implemented BASIC-XER encoding support (X.693). * Implemented unber(1) and enber(1) for BER<->XML translation. * Implemented CGI for online ASN.1 compilation (asn1c/webcgi). * Implemented the sample X.509 decoder (./examples/sample.source.PKIX1). * NamedType is now supported for SET OF/SEQUENCE OF type. + * Added -fno-constraints option to asn1c, which disabled generation of + ASN.1 subtype constraints checking code. * Added ASN1C_ENVIRONMENT_VERSION and get_asn1c_environment_version(). * Fixed ANY type decoding (Severity: high, Secruity impact: low). * Fixed BER decoder restartability problem with certain primitive From 763ac41509c8e52a1ed0dae0a41a74eb15126b53 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 26 Sep 2004 13:41:45 +0000 Subject: [PATCH 0410/1469] html version recompiled from the source git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@410 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-usage.html | 224 ++++++++++++++++++++++++++++--------------- 1 file changed, 149 insertions(+), 75 deletions(-) diff --git a/doc/asn1c-usage.html b/doc/asn1c-usage.html index 523435edd..9ac7b1ba6 100644 --- a/doc/asn1c-usage.html +++ b/doc/asn1c-usage.html @@ -25,6 +25,9 @@

    Using the Open ASN.1 Compiler

    Lev Walkin <vlm@lionet.info>

    +


    @@ -35,89 +38,91 @@

    the C structure which may be created by compiler to represent the simple Rectangle specification defined earlier in this document, may look like this2.2: + HREF="#foot403">2.2:

    @@ -583,8 +588,8 @@

    After building and installing the compiler, the asn1c3.1 command may be used to compile the ASN.1 specification3.2: + HREF="#foot404">3.1 command may be used to compile the ASN.1 specification3.2:

    @@ -650,7 +655,7 @@


    -
    +
    @@ -681,11 +686,6 @@

    - - @@ -724,6 +724,10 @@

    possible, instead of the compound ASN.1 INTEGER_t, ENUMERATED_t and REAL_t types.

    + + @@ -789,7 +793,7 @@

     cc -o rectangle *.c   # It could be that simple4.1
    +  HREF="#foot411">4.1
     
    @@ -836,22 +840,27 @@

    -
    check_constraints
    -
    Check that the contents of the target structure -are semantically valid and constrained to appropriate implicit or -explicit subtype constraints. Please refer to Section sub:Validating-the-target. -
    ber_decoder
    This is the generic restartable4.2 BER decoder (Basic Encoding Rules). This decoder would create + HREF="#foot238">4.2 BER decoder (Basic Encoding Rules). This decoder would create and/or fill the target structure for you. Please refer to Section [Decoding-BER].
    der_encoder
    This is the generic DER encoder (Distinguished Encoding -Rules). This decoder will take the target structure and encode it +Rules). This encoder will take the target structure and encode it into a series of bytes. Please refer to Section [Encoding-DER].
    +
    xer_encoder
    +
    This is the generic XER encoder (XML Encoding Rules). +This encoder will take the target structure and represent it as an +XML (text) document. Please refer to Section [Encoding-XER]. +
    +
    check_constraints
    +
    Check that the contents of the target structure +are semantically valid and constrained to appropriate implicit or +explicit subtype constraints. Please refer to Section sub:Validating-the-target. +
    print_struct
    This function convert the contents of the passed target structure into human readable form. This form is not formal and cannot @@ -863,6 +872,11 @@

    Please refer to Section [Freeing-the-target].

    +check_constraints Check that the contents of the target structure +are semantically valid and constrained to appropriate implicit or +explicit subtype constraints. Please refer to Section sub:Validating-the-target. + +

    Each of the above function takes the type descriptor (asn1_DEF_...) and the target structure (rect, in the above example). The target structure is typically created by the generic BER decoder or @@ -1015,12 +1029,13 @@


    -The Distinguished Encoding Rules is the variant of BER encoding rules -which is oriented on representing the structures with length known -beforehand. This is probably exactly how you want to encode: either -after a BER decoding or after a manual fill-up, the target structure -contains the data which size is implicitly known before encoding. -The DER encoding is used, for example, to encode X.509 certificates. +The Distinguished Encoding Rules is the canonical variant of +BER encoding rules. The DER is best suited to encode the structures +where all the lengths are known beforehand. This is probably exactly +how you want to encode: either after a BER decoding or after a manual +fill-up, the target structure contains the data which size is implicitly +known before encoding. The DER encoding is used, for example, to encode +X.509 certificates.

    As with BER decoder, the DER encoder may be invoked either directly @@ -1051,21 +1066,21 @@


    .encoded == -1) { +    if(er.encoded == -1) {         /* -         * Failure to encode the rectangle data. +         * Failed to encode the rectangle data.          */         fprintf(stderr, ''Cannot encode %s: %s\n'', -            rval.failed_type->name, +            er.failed_type->name,             strerror(errno));         return -1;     } else {         /* Return the number of bytes */ -        return rval.encoded; +        return er.encoded;     } } @@ -1083,7 +1098,7 @@


    4.3. + HREF="#foot314">4.3.

    Please look into der_encoder.h for the precise definition of der_encode() @@ -1091,7 +1106,51 @@


    -


    +


    +Encoding XER +

    + +

    +The XER stands for XML Encoding Rules, where XML, in turn, is eXtensible +Markup Language, a text-based format for information exchange. The +encoder routine API comes in two flavors: stdio-based and callback-based. +With the callback-based encoder, the encoding process is very similar +to the DER one, described in Section sub:Encoding-DER. The +following example uses the definition of write_stream() from up there. + +

    + +

    +/*
    + * This procedure generates the XML document
    + * by invoking the XER encoder.
    + * NOTE: Do not copy this code verbatim!
    + *       If the stdio output is necessary,
    + *       use the xer_fprint() procedure instead.
    + *       See Section sub:Printing-the-target.
    + */
    +int
    +print_as_XML(FILE *ostream, Rectangle_t *rect) {
    +    asn_enc_rval_t er;  /* Encoder return value */
    + 
    +    er = xer_encode(&asn1_DEF_Rect, rect,
    +        XER_F_BASIC, /* BASIC-XER or CANONICAL-XER */
    +        write_stream, ostream);
    + 
    +    return (er.encoded == -1) ? -1 : 0;
    +}
    +
    +
    +Please look into xer_encoder.h for the precise definition of xer_encode() +and related types. + +

    +See Section [Printing-the-target] for the example of stdio-based +XML encoder and other pretty-printing suggestions. + +

    + +


    Validating the target structure

    @@ -1119,7 +1178,7 @@


    +


    Printing the target structure

    @@ -1137,9 +1196,24 @@

    Please look into constr_TYPE.h for the precise definition of asn_fprint() and related types. +

    +Another practical alternative to this custom format printing would +be to invoke XER encoder. The default BASIC-XER encoder performs reasonable +formatting for the output to be useful and human readable. To invoke +the XER decoder in a manner similar to asn_fprint(), use the xer_fprint() +call: + +

    + +

    +xer_fprint(stdout, &asn1_DEF_Rectangle, rect);
    +
    +
    +See Section sub:Encoding-XER for XML-related details. +

    -


    +


    Freeing the target structure

    @@ -1224,7 +1298,7 @@

    not a definitive factor. -
    ... this... this2.2
    -fnative-types compiler option is used to produce basic C int types instead of infinite width INTEGER_t structures. See Table 1. @@ -1236,32 +1310,32 @@

    text (XML) based.

    -
    ...asn1c...asn1c3.1
    The 1 symbol in asn1c is a digit, not an ''ell'' letter.
    -
    ... specification... specification3.2
    This is probably not what you want to try out right now - read through the rest of this chapter to find out about -P and -R options.
    -
    ...that simple...that simple4.1
    Provided that you've also created a .c file with the int main() routine.
    -
    ...restartable...restartable4.2
    Restartable means that if the decoder encounters the end of the buffer, it will fail, but may later be invoked again with the rest of the buffer to continue decoding.
    -
    ... encoding... encoding4.3
    It is actually faster too: the encoder might skip over some computations which aren't important for the size determination. @@ -1270,7 +1344,7 @@



    Lev Walkin -2004-09-17 +2004-09-26
    From 57ec1487dea4c29af088ed8750b9bca56ea3e775 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 26 Sep 2004 13:42:43 +0000 Subject: [PATCH 0411/1469] -fno-constraints git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@411 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-usage.pdf | Bin 71499 -> 71318 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/asn1c-usage.pdf b/doc/asn1c-usage.pdf index 85ce3b056961cbcc80bf54efbf227edfc03030fa..032679c8c09d48980427a69d5fb527d3057c34e2 100644 GIT binary patch delta 17010 zcmY(KV{@hru&rY}$qpwI+twtR*tRvXZR3t@CllMYZQHgnvCg~ed^mNw`a{?H1KoA4 zUK7<&DOFIl_z(cE{D1&r$n!e}!A*$M)jPWpIhQk}EiFEgWRXN897*2}rA;E*>h%0O z&-404xf-r1O44B-fgieo6t)uTBwlVa_oun_+*WEG-?=YS<@+!a%Usn^3gtVZOs(3 z{qePMVtN}r!Ho#K=(ecsuhl1*HN7fW!z)B+B`mDF7<8MbWkYBU4J5d1Vtsuef`X)$ zlBguDu&lCXDmW}SdZKcJ;{PYw!-C^Bj5pwdgR{mHQzrgT6CCh!bIStm`oBT~$1%^% z%X4spzqTcA?GUzigGYf20`mv!Bi4xHx%Xjxo^F3Qo|*jcym-vHR(7$xDPMQ7WW#SN zM*5q?wunZC?BZy4V0iKarZf`mlwN@U5RfBMCxXg7 zGk^!z23P4*BckL$LGOh*2l;*YfN2P3RrUc=PDVfDm77e$nmym1lcx zt5&UV=GKc)QC#`4GO6y77se zN)D$FfLxtIzTsw`&r~mFYW~p-TlV!_%_@Bsu26$ zL;aTDdFT4|t-*?`II zS@>k^P1^Klw261D_lXaY4a>T*qg|CHxCGTNLv?7cfm{2`n0em{4}?pR}h?<-&XL9o}a2A4z?p_80 zBJ#CV3VSEe-N%&4(cbwR3p8L8mRkMs{#p|X4&f14sj#A!t46Z-q}jH14HAJaSg5B6 z{QPrUfI59N)lM$j=Q7)!TUkn4n;xL& z^%MGFVf(icjFt&IIhuE`t$&{l)t7@vj;FoX022>0JJ-D1ouz(i)R7JeC@YK-0>;O> zc7mG)-l)s62MWS;tc$D+_)#>mMVvdgl^uapwZ*|y`cl=&VIll3d*{E5{$wmUz2eX7 z5i?|zdmMru&R%j1@=Y_Ou4T{8@_)OmUi63%Cs^7dgGNh^n9V6;eW9*1VDTAns4)s! z4rH4QV5#lBssQD`x80R9M z58MBlx)_gPZ65^Tz$<8Hwf@Gx+UOk^BJ1Fm!d}S%nU~Phc9mE@zjZB~UJ33={`UPP zi%ftXKv`<)_fm=s1jsJcc_3p>WbWDU4^_WlP*W;KrnG$wlfSj3E*qR|WI@i9LN1Ko zkk+orVW}bGDA>;6agQZD8v$3(tK|9|c85`~b_7%^WzmFQ3raZQbA<0&e*RjbE?mwz zFUUK6Pck+EASJn23l(dS97pAZ%VWFE_J{GX%GS+f*Sa3yPr*05w*}CAT>Z84)g~o1 zzHk!EMnE4?4k9XE75ll=8$3&86JuzVpQ_$J1`_u0>)TIR`40MQmk&Je&SA;eGH>^u zg(xwquwk~V)sG@RDsu)r*!K9CduSnfg~e5=RyEsq@?pC*f=X#!8 zUT<=4!~q#(gJ&>58%CWnG#Qv7Uc$+q5w~t%8^~YC)=6oIGaIb;ei!(A%af&=<{WQ|IP-L%?VM?t zquP3$ELQY*S$XpIk1p2K&45V3@=@M{r_{yeN;PI#G$h@dW_4NJU5IZCz)(E>E z!HmzASSowh;%fvrTUfZ2s@1<~#NGMSDlI@zC;?i6E32!ch&o~j>LKaps zFzcmXq)ik1WPF(N37%c;9V}!T<_4@IHCPBlF8mw~qC?kB2$`4;s`4xA5wvT(#peLa z`MGc5H_r?QCw;4oOI>THri9wB@y6{Tv?)-U(E>epU2FzC`n@WPS0G-0A|>!+79MxX z@xci44C~rshXDgTXe+0c`QV=f59NsQd^zbXR-ia!E0PY2(%^ySAQGIU)L+S7H+5#B zd+R^%aV50WnkKXfBpFcB*B{3ghs40}hX0Q|e5HyXz9dxP7wrZn>->7Tgzg_<{GRnVc(}PDZ7yWJaONn!7 z$DpxWQ%luRIC8QG!S+p16oc1H$ncLq=^yJXd3NbNMDMEfPh+eolLD0mkkSI*^6o9aNv7FwkDiwV?zk0JY?Fl@>s%%rUz2~HE zz-?E`J>)U$@0ch??nCCe|CRysz)57a7W}^N?C8wy9qo&kQkq_tIdmtM3f>Rnv6m$q z0*Cs38momWDnpN*n0>h9l5t-Q(-~}qHhA2wg6df=DT}W%74m~@#-BEqlEP=^A`?9b zfg_$oYhwND51uzxY{M#zpK+@OeG z%fr|}TAzFtw4=rfl;!<}6`8EaGMcnmvfaDV#QyUbf+;>aK>~3w^>>L8`&kIq-$@&i z@Ai^sBVIC7@KIN+_cFjke^`$xpTxgn#tElq&a}epz4F}FxMCmFetSMSCp}dJpOUaj zYungQ$eJHLJMMlba26*m+jMQqzl=0btzATX6sIqzzLFcdKrA@smtG2*8C)50O6mn0 zw;K+69eRb9epOP{$(<)O>sEt{Z2r?sax!`z`&!VUlsoX(O>#hyVEev?X^D1dF|i`I zA{rkCtaDYQg3CO2Y()FY5`pFdW)+`^T>RQQ7RZ#*|Fu??nL>YBDSXNb9E#h;PTN(P7AkmLepR|-U?T6-@h zwV5aQvaL@EDF(oKT<{cA)Lr61eZniaAMdJiH7`{3H*wYp7qltq>$Q+tF}eb$$6|YO z${t^#{>dduRw~DKs*k*59_(N1OeD7)83Gp)Eg#OS%t8BjHzZ9Pw!P@N{nJ^;Kf`}D zHkWEF1H0M3GV?E|X#X_23u%{P9Y6RgKdHG$yP{aXCZ+?)0vkzd zS+bkDoU!QH{^>K+RmIQspNl1MO>M~(JuX6iH?7n06j>K-sPHY>4{G7mM%5U51D`OH zj$>mF!vX+tk@*u**_&2|**PI|oJmzv)UO0Tn!@zVQvAn}C8$g91-mWUsjRehH4VWx zauI=VR*M(`u*0Xu*J*|0-_e4CsZ?l}J3SB~?9<*qGrRUK5=L~nEy$n~A9(6{wLAkx zv{E#A0@kI)-j=*sq6Wx8^{+w;7cK(FhbxrEVWT=8W-83+xl9?k;Iqc^ zC;>p%IQO^_ak8^7&(s`P5F2gxWNAcmNSrb7`7U(oius#vb=YJ5m_$)TSN{O9 zD4SlSf&K0(Nci!1Lj-f{{lJ_tw(5ptGQjR90n4n6!CYwGSxx9geOXf+I1}dS?GXi9%K;AH!TT?#F>wp6FY)XP6MIUSGfWqQL>> zZ%`^xtp$cb-Dflla`v5f{7lK1C4CdP)m0{Etu$)fNSB4(*-CyHQR9{+8fByhhM3F&V!O)b3!Bz#n8pxfg zMMAuDxsaP$5B@yXWNKpxX``OC9v*=0hjH+;RHF|U!F-Zj7u-36K+%BCB0xZ?^u6atQBRRqo25oWu7&m^Kx)$jSM#@m|ZN9Im#2;~}FYb?8ZELtzSXJyvgtPH0+uTw{xj)Tf`d(ZtB7 zn`cZHR)Pa)Z8CJ~bLX@LXN_l@^CqlXfpEa-Tc{MS>TfW3y(?%zCmgq*7Dcxth`={x z__J2DQ_G+HoV>ei8>m>GIrG-I|0;>(iPYrP@ONmWyUsH-K+}bo31?QG#lZeMNNf6* z+!9e%@|%+FwYS99?B7`A%d%43)P?k?cksE!+=a#Q)LRYSnJG(@)k$8^7iH7_MXvY=%^vvEF3!Ek>w*-__3dye50)VDQ_KFW1B>v8wE|)cA z^eI6kP33Ptdeh+8KH53| zQ&wCp?BJ+=x5?7@LB^9;LuC0la!^zY@!JEXqlq}F$O1>H`x|$W7&sh9>@jMrY)=MF zevDTghv&F30lG@wwTZu)d*|g0W5=X{951N)j5@p%ur`v6{@Dpg$R}B144z8~c#Ujd z@}-+>DnlG%y>JvdKFSE#inXe3^_>DYIWlJ^LA8hAf1*a=44`p{5-Z$d3DzxFnZU@d$AquTYGxQ`q8<0f8$d8aYU?xaHsDZVf)yHi%Sg z;k~7v3pcaJ2h_ZTe|qcGo$UWAZI)L)g~L&Xgfr}x9Fv|aH8@qpfNC~5lGp;(pLbSc zM-oQG(2em#MC)f-n5(&-eP~txMAZ_N8o3a(0aSX{kn9QE)L9N8l6`MTcsF7*%UYnK zRFx$nK}S@CDOPN98JlK07*E{Kns@q4ez;wlB)dlE&|j~ND+DafThu2lc5i-m>6DAb z-P-&}4fjek#QPVsT~a*wNe(hYjvW!>lt?|QogQ@!1o6WmDR_9e)vX;&DKOSNDvE< zPDMWHvJ;wx>w?xudAV3tZdu-wYSm^cN)V@G|Dg-2J2vi^6+bD1bhX5=*P8v+ugI_9 zr??s1PZcsm8K%=7`)=f^J^BdOa~5HN$6FiAoBk~0-$Iaoh1C|{^yV6lcaPFVMtz2f zD>6O}eB{+gE+gdcy8!Ook*nf5ib`HCOhwSwzlX(;L)7;veWCmJ{t$WcC|^>OWs&KX z(3WDDe*`XayPsU(k(C4)(G*MLZ3pMpeeano7O7P{;Zx9g?3m$Sbc(AFD%WoSDKmeP zA)}9H>3dYd&|c>4YJp8is?V%tzAwtqDJ985;y-cuha4g;OEr^{BUL5T(Ylv3al9@~ zZi3$|v;$Q_c9qt%sm3=BW6@zDDjgU)%bDg*Oop?Og@PnirzF>Z-A5ndz_C>1iHSki zr7Ct}9McX{ZiC52Ls~X8x4JU`kvR0w28{A+^xWpZVdL9!Cb(lQ#b&WF zb2WKtL!r48zc#`tdZ?Z*akMl?SuM~T)M5Vkh|xk)?&QfU4`exT!{GX)m_Yb| zI(mv6hqXmy?aWW9`Pkz(LDWKe0(w?Ob!-21nCvjnA8HR#Kxo_-@STOpxj zCa3rxa=X51Mfp z#e=+*Cc-YZ9?KsC&0%bNesTTYmqI3gOTRQs&7`IKsRt~<>ql(1NzSe=-E6`LNwX$7 zy(saJpW(II&)GS!TTp6?(l60p#+o_=-s&OfY*;rCvlW;5l&*h%L}!(nu#6annpuXU zzp!t)RhT`*t!`Pku(qs`Acgdok24HQiM7nZjXSdSRJ~t6!ZGN zyLu^re*h9qOxm=mvxso)tyvw%@gc7+Y=ejaHQn4r#?RG$v(ERD;}Q)U-n;Njjkwr< z5tDp!c#XnyDk5iAofe7c>dI;L#Hnhtyo}Qxm2J#(z1i2Y`i&}z3Zyos#X+`bela7@ z5nJHgDN9J2En>s^gM<|uQcV<5Fz}u@;1~aLyn%k&4b9ap1h!6I_dg8xubV}N3g>w^ z3!`8d7lv{r@i8?yhFC~v$%~Uq^WD?=o?^VD{n$#`zW!t+^^qGPOP=!~Qp2%42rS}D zggT-UO9^cCi3mt#ep8oJAgt zIlrFAKuFIp;imJ=vjj}RyF^y1y(o2l))S4jwRevCRVL~Gu3)b`MA)Q5mDs>f@>cV% zJs3ABqd2v#Vgy^Aeei5tjGUT;>(iKPU z$ql`5>_w-0Wy-E#5d2bg!UoCjJW19y;;HYb_C^?{lrPOyuFVsCo8n)ft}!FTTntiQ z(Dyo|jAN8}yGlsgq%S5W`82-&SPWz;PpMM&*Ak0oz7YI@nNmIY^nsg`RKrdU&?Nr% zWfMavvHGLvZZ4%1wWpjQ!p@Q!q$x50UvrIso>Hj6l3oWxQS}+JQn#ChrA;8QiR*lE zBVSAYjrOP6hg(p_-noiK9@An!BOt$r)q?4Lqnt)L>L^7{cB`#QpV;uVK{R=ZHbTCO z!T9hPgHW(Z+I6ADR(*nB7(=lSkT^{-J7&FQMZg+Vk7OaKnZ_%vL|`k2AnZvQ5MOhj4UKQ_&9atpk&EWNA+ZoZ?DzqF}z*;r^O9}L= zma6KHm(=me3m=sIF74%eIzJDZDf?tt*J;|X0@yur^|0cWBjVO`0-kEuYIHogypMBC z^|gE4Zv7oi@~n(Ri6pWO_DV%Ph65Uz-(p8AaYA!k-`+G;s|#Yit)xBu<=|LLryCOcNG>JZcfRN zKX6@IaHO6#F|v0uf37t(ko10MTKO+~D>GPK`>8Emkoah1QC_8)SlTiWAt2t)D^2{7 zy&EZiRp)t^-JM&xUl$>oI-T6oIg9!qsMq-nfx!FSBCS_Y>RC|%Nb4=r`mFs+&~g_p zX6@WbmeLc*bcjuhw{RC`S&jE5%swoXpaNx9@S>p2+-?NfetReJi2)X#C2g+sZ8O3k zF%WPeH_OycHz3}wbgX`%nLo@tO(yO1~kG`424y5vTHN$VP~z zSG6g<7IwbKVkV^+pvkmvMJ*dDJ^i4Q_)nlGmuuFkNA6D3ZJ-Jp@|%vv1B&1X&TF)XrMX|Lu0S-Qm#u zyr|eUo1GZ)wA60h4v!><#S@`(*!P5Q!h1Ey%0*r$=M=XCWb}Av-kW{b9~^|Zya=4% zU#LCsDGuaUf&F$Q5xdOWxQrvmEH*;j`ea16=WZ}$bvrQE53fG~CWx zIgj)o&a5j_z(G%JqXx|tc27%x(h8}7PcneV=FmmP8FLkv)E+uXeN@P9Y^%oQXMfq+Aa#GK4Go3$`nhHvj-)91i&tH}0w&w_QUCsBwT!)LV z*y0?C--i+eny7*ReM~{vGy5r&R7nFTG;to5oYc@ubzP+TG%LuEAV)cryQkFovAdk8 zwVrVX%0H`-1bfm#!>^PNCa8Xtiwzt6wDGwmj}zB`=`FbHJ+oAE(I!#NPu#*TgVQIO ziOJ`+^@x(hWTHgD^o3XPMBDjG(F?!i_AoaGw78iexjtXEZGE~}oZ?Hd?(`;ZHznyS z-g>vHnD8*~yi8BIW_z2fOrtDYOI}4kR=iEVJX%Tq?e5rNT@~naZo5mmDdC=pDkT=6 zTpg04Oe>(n&oV_r#GWMzzqyyy=fw)qr!8M+fhVyvDcdD`J`nE~Eck(raxY+b5r~%I ziASEVMb2?a+}+>tdp!e6R$r$?X)!x8d5}j0jBrgypJdI^d_dpD=-qxGg`FIySn#s{ zN9)erY;ASWM-GKbiAm&vhMVQ2c{vCODS!d5%cjotRaBYVzG*zg3Jtq|U$RZJL!{x! zU__SPwvqMC4Ad|Jp+iple&1UsdV4?eX=F3KR7EBnpB)K zg_kM%**rx_qKt!mIlHT}bZ7?V-QPrt9-ZkcI$A)wMPY5LS;DTe^^-@q*wO=adl@4Q zI?SOfs(C`^n%PWxizvlSNBr+Uxt8A|R_eOStzCZJ9y#$e_w;@Rv-Rad;RRyeCEeiX z{JK$6pQ(oPmuHi!9<;5f6P7ivzpBIHRiLJd_?(U5*0*+)vFT1&@(qzDbS-NITeT4Q z&hwg#oc42-Ym*$O?oZLj3H=K^d``I6q8OE`CkufoJ-2*_*eNyUb|tlxf=rUm4y!;8 zIkW_-U7J?tWCr)B!jv^D1+MWM4Wy0&koEHJX+bg+B2Eq$vcoGh((4E_bf+R@p-NZl zkH1Cvbi&*g*X@o0&)_}x5cvyBgCpy*F{~-7&d|D6dC-maQ9Y9Orx_g(7B zDzLE37uV67#kTJ~C2-Fd|9xkfZQh6~CVp<#U0B&DE&c>TXdP`?R}Fi9q8S-Q$-8x6 zWMfK&@~vV}XA5iIwoWu~{%n%Hl?uLTtYo-EcKvC9%7=?eG>3PAMDKZyvM0$fwiP`; z)`(rgydnm-%Uyzps14BAvhad~@T@cUQeqx)-Tp>&b(9R4izx5>AsOF$`}IbAD;&R! z13^d;tH2klfFgD`G*!4~5U~waTw5A+Q{C2o%N|+szKygdgQs?^YGrx$2F-xXDD^|< z&^~gJ#znfVJRw^VU#F_dl1gE(i|<4mVKTP{nVoO%5I&rrTnH$0B4|xo)TAM{vNvcX zbgmCXYVhqz&u;l(;ooyAoriBA8`_PRF{GW}+H?4vHgC~!U**m@mdKrXUOg_>AU>$j zM0IVPx36**fp*8K9JB1_^)uCHhGbU)5%GJgBf};Zy;P2W;iyym137FIkh=|$+Z&NQ zVC*Zsf(x7Cd;$-AUYz;m!!a6qS<5UY%(B$5<}^cx4b(zGKW)ruKsDjVN=#YnVe*QO zm~5P|vca^mgYRzC)tM$?L4}+&0)xd|Ez8}TQM5D9k$)>Psuo$T%bN+jv6SK9q?77i zxTJpQO*Tk8DCZ1bC@l((Jqm}}&@Ld}vLe-VyqxXcfdI+U&(XCDOr_s6wt>fqBwMtJ z5xj?U*aN;AV!a-{nQTGS75ELmw9mR*1Vht*VKDXv94sP?!8B~q;F(P*q@fX#juuF~ zNzQX#kVmR9JG7LwnD z8T&ay-a-`#ild7O?H(KW2hHNu<)jsH#|+L>BpiM8BYUZuA6|*)WBtKXNfzeH4k&H4 z5@B%9M+AvFv-l}kbSz`zr#&V0{>VIAQ|5D)-zerG z^c}QBrLN^3RB3cTMW3^;oMMs=XBBA7gA%E4&p`@@4!SD0V4c8jbL6j*NBa?&w@#Xv ze+KyD!!_6*xm~4@W+!{8mu#>+(yELcwkCPyY>xW>PPruOMsnh-cTz-Hh-aKn^PTF6 zthK)C@Ei7Ju~BH;taZNgmR&6mk8C%Dv{z??432RC>xy*})k-eKb%|n3SUu)l3Dpg7 z;>25gPZ4h|6*M9LaCclw`Qt!)*Wjs{-VTUwwkEnYiG@VZdx+pg3Uv5q7srYj?N33n zXuU0SLY2#`*dttFqJh*B<=wp<<4x^o(YaL$z+Nti)xF+c)3YIi^@`Oggq_~28y3ro z%b3@mz(?iR+De*~pB3`K`##U3AT#?!L6yN(pmFGe+JbK+xY77PhN#aJ_xhblcYkb zM}N$Ux?p1SL++@UelmUoB}qY&f^l<$!YP4E^WVgte*yl1wYVAgYG6sl z6i9cDFoGJY9V_Q3#)F2x+6Kz)4lrU2^TG8Ty0f-D<(3P>N|SU7&(HZo-~7p*r8&gO z)t9RO=zZdat@W?cKk_JO^zh0>&{waaGvPrTyv-%FvA?j1+Hy$kNDQm6h3#eS1OPPZ@Nep= z&c3D~+%*&6uGNB`U{Z>I<6a%0&%p7N-be4mK`bv3YNN4sKQTJ{Jz~4Jz6Dm!txWO$ z!|QyyZbU~YuRDr#iNMF;(peTxw*lW8TK7A%DSrEP^+QxLNSLy@g!?w(Yua%i%P#(1 zw|te%mt9%=;_TRay!j5Y3uxrw=UhsW-6T=@{IOPt6j)e0{|^HD&zLxcS&oJCa@dfJ;&g6U`<*4;6=8_M8Ng*RNQ>3D!6 z^qe7h3|DI^ork$UyP?-5j3p~lJn(AUjxxfTD;?ng)yu0ppAbnt0^XiF0nyH*kJ=&1 zKHFCVpGmnz=0f|E$eJM@-)mpKV>R<)Nv%IG$WKM{0tEC|N$-Bte_t8@A)eR}L|Z{- zP-FHIBYqX-HF>STDf*nrFAH=z5584pn`mdcc`Mu9Uhl;0-Rs41%CZErqFW9nk)aXj zJYrz`yf(mzFpVv=1ju2?RJbj=4WUx8+ZAq-^$Hw&H`y`3% z-_@_4Ao!8`@m&sF?U%5{{;h&UIY@xPpq+TRc!n_90y&cV0(6ij~bD=eE z+KA*qVbw-kGM^^FZ_f6^s_V3?y3?e0bSYOA!cJZuj`@b^(cnq=sb7^{VVB94EOV^O zhhk_2aF_Ui1!+Aq#uojO+dlN#pSS!U<{K#L^0W>-nrF%FUx`_BA%t%kUxu%zXQp-= z2|<%O?zCCaP$U5qQ(Z;ptO)kj;o&O;9v0<2|K2F?4DjeLer#x|t> zy=co_7hRm{T;Au8x)bb$ru?B6aWW(jcBM>VCX-13P3#&mDuM_1uZ%ct`M}%uW1PBP z4=UK%9$}=dk%nbmy+?rXS11GIB;@1o^SPOz?8~1^$LnXp7#kDzZ80_C(b~Ms4R0!9 z>R0JkLl&2Mf!l-RGsJ}HWVwF-j-;WoUsfAh@@)>4YbFd@n^^Ak~ zsZlXR-@_rF8~3*hZuF@E_YZ`h4MnJtfDdX}6+dp|%^Iz&aWn@g(gEVZ&Hb$%zamFQ z@u>;eqG4PhH0z+|K&HdlGsj#n)p4wJ$cy}R&J9q^Psn(HHYLCfW5PSR=AKTn|3c<3 z{U+S~h6kgCgF8J(a)D~+%Kail=V*vZgx~XrQIS=Z(Nau|+XMdJNZ9aepAQa|<2Nga zQO3m9%-NiUh?$v{CGmf%F(EmanG*e}semgbD;0DzoRBIJ9E|=Uu{?49L84R$Nr_f< zMDQPNIAMQCOa_c00u5j&(4qQ8X&|bkj_M=!NCFgUpmcI;i$~`3)iBGFZB0^zG?Vo) z5U46Px8Rqz8vdPJ*YIYgKV;qbY@c}Tm}Ng3X#|V^z9-Xw!1K!sBAp07f`1`~_z9rb zW~RyL(FFF57%=2mdkTAjdhs#j*CXV?DxCtRa)#42=7=)uI4?&M{_-upk_Tzk@R;8_2hc9x8<>BI#&NK!{G5h#-S15d48H zXcRIIQ3EXoMFA}?!o<-XK2&kc5w*}s8ZGlRFOTPY3#rDeJqZDmlnOOH9eArL=ek## zd~=g&4^A(RJHT=pRtb%?SH@*4msab`v@27Tmw?@c({FDi}BQY*> zIzjKi66pzly3h|vFT{Hq z3BGMzclMQ@y=hKJFQ1*knV68TyU6Ytb^KGtrBt>pkW>Ru8C*=u@ewX}oQ#{=I1{k=7et9>O9RF*| z2)~e*3*LAWjj8_Vld6$U+Fn;x-97(_pPK+5iKN@?P=_{4voQVBDFWtsj%Hj9(btKH zqiwWyz(5~ufl9^<7x7{o^SSfSdpLaI+9^q^ogD+#BR02Fdzh*Bnd=27hNU0#l!vEz1e}&;e7O(*R>8t&5A3r>a1=>Mb&MxK|@S=NeDrg z!9}@Teu%cn@GnhF>H=8_39|WrB*pci%>ce4s-wm$^jk$5sIl2V!CR!yJ($LoYL@-l zY9U*YsQNxf2Nh3S}@m@o)T>1H0w>>b>lDB{Iuno&PteR_! z1)9K7!9B9pI58*5=+x-;CFE|dab6tjs|;1!H(e0rcF>D8?7BX1;>g)?^XR|D;St#) zSV#h_>ys09w++)am!`wJxQu@M6WpP@Cl6G&IAa1bmp}5OJxikp+UM3=zOyk@Dll6( za$io|s^u_l#qDAy!>cjuw(e~aMw+8^LZO~B*q4O|``WH>v=M04&!z&K<|@R?F^9_u zn!8m!dInZ}B- z4W}Zp2Y|R=Uk+M~7JZEBr8*LSNUb5PU{eZiZ%Xod0-o)EkNP9wT@A)2we!V2_6-0x zOxG06k%E}%!YzEKyVPua_G-01nFUh8l%k|U9loB228kr`Q!Sa7>VM*66H+G=TVB#S z-@9GDV_P`ZW^tvo%Z=#yW7m2loJ%C+*3BlK*=M1PE}q3fjG10fQ$eR!$Stv%=&7Qw z_ZE2Fh3flTtk*4yx4m9m`&NefX49NFGxruF&9OMLfo=}SOVBHoM>2Z2znj}vE?>=R z2jq@{R|SCf7ElCB=rhdhRT_NJJ?96fRr8li#Jg7q=S+0Irv?ej$q9<8{g=Q|`riP~ zkHn691(^Swyr4bpWg0 z1XHL;sGd@@zFF}Jjk^8@Ef1OvtzN|JzWc_5J1h3Yo2%!6M=$%Lz2>C*zb3?{md1tF zA-O^{7b#%*u^VB}CO{a;=05ft%0Ju|BxdPg^&0rB<&dZfq(aP(LGfVp?qf3$1t$mkxxreSL$QqBDnmJM zZGm6paCCxM%_0=O`-zCc;US@nLBZI=I8!JS&*o&yl#=1(zQM}=dwQWggq-ivDE1rp z%WeXmB1sZ`ehrHvhz4aTXQT?Lsr!Z7>^sJQukq6YqZaw@Mzam08 zAPXTia8L`Cfm8y>Z>CV_aAUji8%1=O?JSwuBCd`=KZrk?sKpv)}qx}kBGjp~u^moQI1IsgzQ2Iax2lI#Bq$OI`C4i9W zN8PV)pAy&f&BghtHW??Ci#n!a2Ij8Xm+ zp$?{IHVsaOgMaT-E%5{FQ9n9F>|@MMi3$p=>5DR;VO*$Bj|j~#;X9<#Ot7p+ASLYy z!8p9j*T2$`@9*snZgGkD14uzZ2mk}YkzIf@nf%C&2+Dd_&%;l?JOgE5fk|LVslo?u z8pCfpb4i$3`>HN8ef5*ESosp2BA^ik`uqy;46?c(cz_lR;lvNltk*@O_CT#_ihovK z#4r2y1L-#7hUB%OfjK)K;-mX(-2i`+K9EnVU z+-;8@rVHr4Ql69VeLjf<826LJXG0u(O_@cegnQ*2Lwq{BRHrxE-#CXqH`&=+uecOF zY2f#hG)+?A)&X~?*Q4`FX8KU}w0Ccg>*4&{;oQ~46&+hrZl&3}bd9I&A5%A-OqzQ0 z?zm9d=goGr#E>?Y1;eCyz`RjTGKBS70d?|z?qexh;O8Xk9Cc)NoYdO337RXz*(o!6 z2l-vU^?yEcYe%s|H5RVM)1f=QXyiHyo2DrS#i81=|7<7BbE!m99bZ>H11mt3ZPaIB zWAkq#R-=xKf>^*Z(tK>$=)P3NCTHNDwZ4jpdHVX)lv=!VV(A$X(77ro*l;%dOI6c2 z0!c`31P<$LH#*(@VSXkEby%3tW^ zg%Ubd&>x-n&Vu3uVEa+Wr<`}Jx@})MJHi;{M5VQLLv%<}yA5p7>`6;z&Y}lNWv=V^ zXT0#3$c6xPg>efvbXvf}j~+(z?Li^uHM~q-+FDb=mV0dKL|<$w-Y9t8q(qwp&d2;y z1mWHKqxGqU2xsxD^L9!VE|+>^@?Ka)8wXHXjMMh%{CGn*kc?|jo%UL!r^#~sL&Rp| zr58$Ta$uI9`c!;y-mmVNU2tH089i|EIheXedwBFT{5C^7V0%6TX$ZFId{8O}Djmkb z%{V1^gI<=kSl4jtkisdh!k zQ>u)Wy6PDeAgEPkmEl^u)j7On>EJ@)T1Kft%eIrZ0+DRL_e$J5*zIQ3pGm)T?{#*y zhqMiKHnf(_Ep_({6*46SmHc7EfK)smlkcL{2}&s_InkYlyUzfvc)8ez-^U&PzCUV+ zh$r;Ui!YYG7Wf=ab?57wiWw9NCaYj{CR4eReY!(EREWHByQP3txldF~I zz}%Dg$SM(YWogfUH#o($f^uY)TxGSDjM4bm^U6Pal(6Ap48D8I*NSK1_XNU3lw)OF zR$v9j4f=Y~f5!dT-awM$2M?gPnfZh?=o%Q!=SlnrAjzi#Q<0 zg8CGJuRGuV(TmuB>XTU+IfaNQTJK0u-s3O`18JT z1}aPD^ri9YimJc-=&xMZ{cq*^mjQrue(m`bC#KwQx7%$|ca5Xbkkt0;r?9&X=!e6& zt|WI$@|C5(e-pkjp9SZ?(Tlg)z$4FmYpy8px$~YjS(8>8z zCkukvAZ;ZsnVGQw6M^Fq_b;xgIHm<_i0OR#pJDFzX>KkqN1v_}LdRX35cSspcQ)#3 zse=%i#yU3rwujOzro1p#{nKRUjVCS_(&HC@QqhN#;MSzJ4oPYBjT|f7oTrTA8m!Y# zSN_^xW`{}yHisaoq@afKnixP^he+3b3TaX@ONO;vc2SLc#DV@VM8?IDkca16){~4> zBaw@_c(&C2SdGNX6MJi(Va+MD4ip*=y7bPr#w3cMg*>avuS5~|g4&f&%*%U*%q#s! z-`NLdQoESAkL}lwbEmW!(c%a^TY4Et-)Z3=R*dy~>6jAeT$G(dd#gZIb0W-FXcSfX zq#H~tD)GrMsVcFT;e*?Sv)GTPIy+E@x2oS}8CC~YU-J`)9{VTxyL0QGZei*q&A3(e z??%~VuX}>#VS^s;@=B)uewXs9c7|%1P}HAhHQthHxz7COA~9ciC|=!X$gDe5!fq5& z;&zXPZ@?$2Icjn=ej89h_MBF=m$bk@^C`0@Ad$5eSy?7Yj5V+3!B@uuH8jwm_%5_3 zv!!rCvoo)~Rqno#nl3h5(E1+f%I0F~Lyl_BZv7y^XRz_94sIzfX784&7`+7VsvXBS zdExa|jsBvQyhcLY!4KDAbsCj3?#q%izr3~`CM9vqQJb03;SIb;NZQfgSQg|{WX?YD zNqZxq4~2Kcdc>Wxwz4Xu_WGVR924i()H!Gs1Zbxj%VR$W2GQsF6jwmILv=(juwRRlbSkIsW2~ zF;DT@YIfiMWDQ8pNL^Uzd(Y}(NM(;a_jaJ21*@ z>K}&+vB_cMyRWehYbw2XOG+(lDtajPHTB6Rg3a3E;jcOEzzvAh{=-VX75oNc7Kq2% zz|sVmEo|{NTqo#X!E?kY@HJmVL)&Iays4c%Jh6i__5;lL&tIS$rZan|(qj7;L+w}V z)3_I=Z?Sp!143bwfSYYlYBt-wU86#HvyF;Rsx~0&Y3ExPTc@h5?`@UUtaQDqM2zns z|M#Ftu)>TdA`Ac7UYg%`|3~+uFPCqY*Ei(=ort1Vs=;Bp%f#;VT9F81G!XkJ zIqkud^nV&Rca;XBAPh4rNwJtUVo2*E#7lRsd(OcS-CR}>biqQfNRc9<1T10-wF#v1 z@&G55omg6KVHFDtK@_o53-Jw7SOsDd0?KaVR6qZGGt5js==(MK)(P56_wDlIUAOvl zb!cwfJXiXkt=>wfUo=|Fr`L2ZmHjZgQ{+88ryFr-#n=2D&oAj-9QMaLs11JWV=;#j ziuJ`LoEZ+&=>*KDxr1yp4Ew+~N5T<;>a7H9HnHU4991OBBNE}TiqvwYlnnR7l8BIp z2*PCO=~)Zb4S{sc0w1KlwO|26@MXawObE#WD+$K~rFd{Y4G&--C)l2W6ELs{UQ)0M zO&03SC5`S&uv8(=A%xPfCm0&d_4ihi$OtE?7;}l=qe>?AWg7A|x5$y=4D%vmTog)5 ty>dX?B5IpI^Gn>^&iQ2NF;UUy{2y)(>k+RR6R20*9;zNBIYMx%gBi}c3@2op-{>;p;w_gA0K2@jouBu(9R?|^wXtPOL zLoGpaP$zdbE_Tj005!0qrH7jq)KLm5q{5~Jvh@JG*!fWC=%igiKzA_INe1W+dIQi0 zSp#H1Rser)ZUC2%kPr$TKpN`o;|jL5a|bZ$YUwkvu(1Bq^5+V`(&yhjFOhCwTPFbh z%MVWw1nTSva&mux_-_YlgFpaxI}pGI3;_Y8)in$i)#L$;@@l#Od5{yx6$k-ncvwQf zRsa>S70Ag7#00Q`x&k179{^TRCu{JZ(%jfzuq1!o06>77Gsp`35(e_N0y+P2u>zby zu8v?gx0l}lup7YE73k#t(gSxW0PJK1@v#1rz>D1m`d32EuF#hojxW9!Fbb%fyPK6O z*x4QM!m1%7_jjJ|c0l((+-~3(Hvnq$a?=`W5(L!fECH!fgw7LgDx`D~e7wPyiR_-*#&c=YRKkf?WS< z5aXYjVR}gdXbN?L_yDXyHYglwQ1=%~0ONmuPi6N1J(2$xB>rC!_EY-}v-Zq1OL6`~j4bf_ek|*tqxw0c_lYTrW@YB{d;#-hlrL`CmX> z|2(S#-Ce=n0Ao&ePEM{D&_Catf4G1DVE~x^3yiFj71a9A6luEyovdF5?;nPLYX{iH z1EeVP(gbc!A)ddvtUO#@U#8%%3h~mFe?R~AFhC%0kQK`6GSo`=t$k)rmU}&6{>YS! z@jxFJ+(@`{S(8q2VQ?+9Hz+f5OQ_1?sVt1tY#RT`l6#_`jmsaTZW;kuF zYW<|x zF-f&)O=?II(Yz<|)#9MmS}`#?+INA63yF636wmwV1sAM|>r(At9DCSv>(VB?UZ5VpdR_|+_8f+X+P%Yez#pbR?~X+sQ<=+e5LBxi8n2Up(y={uLT&WSy-!0 z_nH6j{j2WD3b1~D^4STsvaSBvx^!c#2n!{>tEzIo<% z)zU(?K9^)UFtI#^@S+N>q>=Sp@Cs7q$hOA1xy78UFcb&qEN;1d&sa3Q>XZ+C6jAJk zQ)L4d*zH@b3%LXNqYTNxxz5yDypf zIJ>LLC;xt2|Neg{3hMsI1nOdc|7CUS_@WiCCTX-9nsHMbwmOO>ZKJ=hN`D}vKPnp) zCM^JG%QQRjc~?tF2lpUw`FZHBFuHcB~` zZF)Ey)w@>;A3S?Uz^esXkT(1B-Tz79m2qFZuflRz^;*)Fxm+$<6!GUbricYo3U1#p zJnc{>kztEb#ITcqncd*aLZ?U`ObRd?x*_4=d*4@043c8Bm51@gZ+8kZzSpXPGg=S2 zZpl&+4hesjz~PfD3mFI1PfoLJ)FCx*!4CeAmbcyEQ-Dsqnol3a=+=^OR8VHA4`D?f zFI0xmzj0+zBzi0`x13?T&EbX7_&!89VqF$Gr>nTee&c$X($LQ$$2ZVq;O;E9VPJX~ zlU{W93ex1ieN2wMGx?B@f7eg2X2ssf4Dl67ro4Y6IP?&gu$#7%CA?-ZIJlWFW|NqD zl<4PHTt$W1ex!64DUj|@D#|I!>;SY}>4h2E*NiyabFJCy@TK^o3bb5)6eRiframva zTQVbE9KcpZJzTRSM(lI>ETP+@vnx%Ei5fP2@|rOpQu|{gOGNZRE8lqmN9Am_wWxyK zW3qoXy|(r!?Z-u)@mc;=ii^e7?R=7gVTScCrbuSMESpa0seR;hn2@icnJH2TPp;f? zK*y^nmfNFs#1q(G`*tbtAgsQG^=YRkqFGrc;}&g!hG<-Bz)k3)p#mp=ZPD$6Or=iAr1HWRb*IWX`6~!;gQ_-VP-2ZIGJz?o)NT1h(pYU74WRv6$89 zoA<~5YsoA9^ zUAEABfZH^yKTrl-K90(=m{NFWF;#!~?|ju!Ek@W68vYSHb_(}E0`s#2HJ=xql7pNy z39qWvBUa{(^6FFzvS{wN<5&Wv$16EvuAGiubu6ckx)US--Ak1)lh{L zI~&}F-i`U%{UlKZY*lbA=l-gsy+KG>73c`##PF3Ps*!hi_8sS5?NEOlpeu@DcDi$D z92Bt=A?8zdK-0VoRU^6gD6gfd^2nUJZ1EvkacN4uuu z67KlIu3lv;l*Z^wvXVFNo5F=t+5&|zpAQ={cPd*l17OP^%&dR-TCO#!d7b<_mf{=Q zE(Vk`45UW2#tPW4N$*88`E8JxCur&NzP4{sQblZyhdHmQ7)u@h1g<<1wsKgVqq*xf zeWh995|5Q<@~vyRsRKjH z3NuKrm=NfHF2xZDfZUxm-5W@sq%z3s5JrIg`=4AiW)sOtqOg}0YJzLq1M-uITif+*fs){{%+@;d@7vRccI3yb}vwI);& zpa)EABoBWU+Nip1g^O=-r|8?kQ71;Xdo|JJauAK7zI`DyyGv{qETdd4bKyuruV;D~ zsk-Lv?6lF3jxB(e_uAM&9Y8iO z3AgcmS_?K!gYCmFjWfQtzDt!}*}u;NAI{~bEvA2|>`*{Yk-eSP3^`*Sor=#g^^UiM z=Ze~lvcD`uGB@z--h}GTwTdjb_r=m)omk(8n+4y_Kc=Iayh0m-rqK-5W>IM(1w1%z z>3VOdB9C(z9gGoG=Dc6|$`Z!|yGJYsx5nrdCW+d@_>Far@!SW?^){-_(k}#N=HhAG z8y$b9?i&t%VB-q>LYt`)53bQ%q0i@uDoxdOn~`+KRPmwWs6l)aZOef9py}b>r{S4g z@7}_8PVR(kM~RE-JDA?!6vkn<0H54-{_3C6aT}z(;eN}yfq{b441`2pL5G$zL^x1B zuLIwWlp_u`CxiD`yr0pSO6Aj~q_9l)ug-rA1XF$Z4va#&H;cEsj#L>k0Hpr7=s6Wauy3wh zgFA?IrF`X0`rNAy?YsGUIzZM6ZDJKASYG9=aCaV1{ehHM`cUzD|GK z3-USvSAWO(ST+XBRg|z3ZvPI zoVYjbnbCLs%AQ#&>!@Ig458SiO0$1N+7oaPNJY-)Ga6wYY^5=jrvi)<_`MrX|Jk~97ucCW+tC%{iZs1#ux~PB5xEmbM zSje#tQysx7Kl-&4VccQ^&{IQ{zqai-319RuO6qHpKU1J;asTFc^79Zi6q53mPOj^h zX=whm|6bRz2VEkzK8yLVsqY*8Rs);Id*>aIWvUZ6?w|1Gp|vwGK-SJ7x@$25IC+Ab z2D^Woev(lNI}>CjPe@NBhVV+iG;pe>ep0$O ziJ0Sc3%AH?-zswNtL#upI2RZW7*XFEnNy1&A1Z6iQFxkMIS_yIdEyU*X+>7q>|wfm z2dIb!hqabR&N~W11J@rkyq~C&%SWTz<5h!~D>*ZwA1%#4OiL*=m>u$zuX256%9vv2 zvL(;sLqc)2ar?c8wr$vtT`CvHRt4WwT?))}7_1XMP)X|e-JuoTW%A&S6}qMug6>xa zB@0|{-@ zfBo={{bV$ebR=HdK}0y~VjKOsW8b$z*~JhOf-+j`k%NEy)iz)~se{59dx!+A=fLrP zvGraluWiEz ze8)VlI{DrDX)rP7hAU_agaSKjHH88Bon+}EoAy@43}`sRH)(1rRaxTub(gEk7n;C} zkqaSya{YfTc%{X4=-ptfO}u6`w#o58M0ve%EAXMve7#oUi;ok83zIa!T>_vK2B#*SHh#Z5ftTTcdU9av^SU-}__?<~neqWf{&d7Ob8Kq@f z`(L*ex5YQ@xZt8esTa67qt^z$KPTq~e{6eJ8_<8nv#Gg%>m4BplRgyGe=cV9 z8!ojbbiO&fGtsB_sC5GG*9urk5BIA1TIM`E*nD8YYRsI^nWM*$gfDpjJm75k~7JAkh=|MNRRaB3NovW~Js4j4v5mt2J4~;xzxkvzX z%IA;}d3O{_(~LM`blevZ9w-1N{ldg#?L7#zKlzF%eA9-Qa$dNzhWCK8w>HSZ( zX?&izX(jP8iLZsk?#Ih-J_R3o%&9o6L|-)Z(9%nnY_B0iDH#^7$#-LiFaCXvrbCW(fl+#HJ9^Y9@2 z4|>l_+iBZZeG1?&d0rF8s{J{D1U3k}Kx&=wkhuYo^Hw-mFg||Vd}7n}db7JMubX z`o;lYY2&S*N%X1h)5lcS=8QdJ85y~YovXsxhjbC3Q3^N&M?Z=L>F0ui+Z2DR#}{6= zFO6X|qDjWFyWEUA@i4*Y+pQxE3h^_z5sdUl*E#DFO*4!Yy>}SlkNf+xE&H~prn~xR zajjNvCwE~HItqMxMD5Nt#V*D$^NPkOv^c+VBVU*s~cdox&9K+l3;iw zLfkp-Flm6N7DY@R-%p@K1*?BkbgcQ}LTZYd%s{wL_|MlgWl`CrrKv>#FZEGp(Xg;z z8KI@kI#F->5#*;r8&dp|F(Tr&zo+fd_lBkR1lXA?eKRU>(M%Hcp^KjD_K%V4lK(Dp zN|=M0B5^w!A-^ZNgs|3Cr&2e7s_*twy`3Yrg{NH96!@P;qZbUPrw{pcx*{qRmo*62U`ysdv|V_|nMQ1|xWakt-XL)ySjCOD`JHnXG9Z>Rgk{M%tK5Q$;e`E!9z;8aj$fA?MK;8Vk^ zV)RkFC2g}~9ov6+=ei{}V~ae+*by4NNT(czx`wJ>meC+v&xB7!JfA|Qg+`leyG!P0 zf7dy6ecQWe_epi1DCcmm7jGhI3hf4y3l6YW1`HAj$TUyAd1JH`SYuf#b@x$g4nft@ zp+r@{c`#+>&Tyk8lO<_e$f8gxxytGoRiXcZ;dM__+b6OBaiCC)}73fr+cX;j}Gy z$48g?6ZQt&`ugH+$-V}cZr_a);UC|q$k9a@yCx&+?M&#;{I;sh5M{ZeQ&n?r&7Tin z`eIRO^_u*1j|(Z8dHE+$&7$4Zo!j-&k5B~^Fd~1N<+=GZ-1Iy;(e;9~@auC2O6vmk z%7CZtZDDo_(+mhtaev2>pt^I_*u$OLIB@Kd&2Q^18sBf`bR|cluId@EmuczXJgLMM z!(j=G>7`|1yrMq}2`Wl;nOEldOx(6fQcX^0flfk_K8C_O{$6lc!YT?o5$M->i17AV!kG!GbFtZ^>tOdu!XTA@OHc7_U4~qE}w>el~mPe940@EHDRW8?`F@x-m=fh2ns1Xp?apY3RzSg zm=}zA*UdblyS_PqYQGVT&&U; z|I(9_`Zc&fsr_rsuGv3ktmJ z3frC)kbzrCa%!A&%T9^P8h(F+#o$ik>xsp}_hU|q4|>0NEhKA3P%8F+3XrPhO*(l; zeT3SfiUHUe8@E?MN(Jnfivm?55dQvMcx}YPRRbI*`Hcx|v4}ig9@3w=*+`2cB3}e72r1-b=HUdtuY(%67sY<3#w}InDtuo&^&+jY)R`Uw$e$=gy+hq z;GV1MHo%UDcYH!MX)J!NwjS%tu&bXkutOC8s}}bs*L!opn5f<~G$vMj=98&Ln<;o{ z`EP1v%sp@Sq$PfZwr!PClX4F?(XVKfY^nJmZXBq1e$12M|dNO%zt3Z$1 zx^^j-lOG2}^KgF!J6Y)jvz4TxQjLQl{p!SVoxbs`2SX4n1r=K+K?KcAW$dIrya-cN z3Q++e4@9iiQNSzf-Rdi?3GST zFHYFvhIsuHi2VvV&Uai?%xfY4=W&%OnW9+MooX}cD*b<<$N@l%XELZy1VyChJ1rXe zA%fg~l^cesez`}})uD0Rodi-rjb<0+W~Y%Dh&8$(A>jP?PtR6~r`I2X(w5SXbn-~VzW=$IhA@}1=y{$}QH>)>L`hB^eG!-mDCZ+F=9?jcAaD*Tj|+!x;h#~NR;TDI2}EzSbIe2ypfmsmeB z#~BoXqj18Way?@c=ACM4S>+*cDMm>ZSgqA|DDjQ9-4-JU%K3#cAKP&Hjf_vI%$GCU z&T;6&t`z10JN0NsIw!nn45$|r8zh{0q)rTj_7%e}f*0wxb3bmC?$au=yBD?A(2FY}CxLBM28I2*gxXmq2z zs5SqK1&xsSP_j*{4!h8&6XBjp%XIFCR~WYE+bJDQ%r&O_cLW?Tx(A->5{$o|BOGaf(U$y?Cm|!{(w=q80xtBe zauwpeyUsQ=fG>F3O9{*&hFh)8Q3;~0GuvPoS);KDUM}~YlF@l}#Ln_Yn9oKSNI1*7 zLyML&NN}1%e1EHWI%URb#I+s*_|7Q{!3qm9p7viO7_;-P<3 z*^gX`YAh9yRoF1vkJ?#5hnc@kr{*lb&W-yVDtEvvN-}sP5!(uPwR_yWH{5M|Gvu8| zeJs%Hdt!52B%i)%R)`g)I8-AQUJjlDYp@z~_oM1tOoIv)1IP~F*TKSMD*RGmr@@g9 zH6?0&vg9tm04m&t8V0qP`>ATdTQ5QAAzB0h&xU{$c_ju1Oo3 zLd|Qeu^3FJI_y)J)Ja9gL0#_3BmUuivMXmP0s%?3G7zD$)~%&CC;i&+%!>+_VEtCqEq=o&kR`l^+>< z-Fz}f`CZUlVuX7|Vv&a&8e`azWjL${%z1s7lIjUdlapOV*y1L3=UvgS-QPL+fU4-I`vhk9|!)M?YvRpsSOaL1*K(@OVmeAIxbbotTGhL}80y;?g!8xsY0%;P{~m zLpKuai*1XSCDlsfdZ(<0IZ|(iN!!WD&5k_8XkXGfiP=Uem8E}VwpMjwK~m{KSQ;RPfED=$qXHcVn|QpYBA;_ zIuCR2@aiVA~mAAt0nm2*}z`2Z#C7u>H(KfoSXAjh2FDyNt?Y$}XQ2O!5z zz@+STib|vSp74K7BL()27l#tX?%pBp;wf=;mgHz|ut&UlA90P-eF?0$P9yn#afhU} zmLqf>L%8k&TSsVB;TJ4%BWZY*lh>itxP>u%7lIrr!Q_Q=*Jw^$D}(l%Icga*Elj1@ zEpViLjP3Y*2W#MLrAgi^>SGbPKquob*%O|MPpj*}o&0}T^P=AdUvvC2H}D-JKnTpB zzCzYZsuJCPm&UB@92M`2zjCqjy%aTSM&HG9TzKN{CO@yYNlwxElYs1+Lux_d>Lisy zi&mfl>zYBtGA7&F;rVayVnyJNkt)5g(iA2*;3vHi;`^{yeNsXhl@bTf)-|`B*^<;; z6jR>TTM~cuNU`)y_A#(DQG`3rza3buf~6TLN&Fq`VHZpcye07PUk?P;Q6gU#)W7$! zbev_kaP6uG)t)PnevUbF=h)*eCRba+mTZf^EJx1dl!EPkMwanv|*idGrq!G$+G}sZ@AguD4?thSX|t3WDrYyy}&GNiz5?d!=8vH zk^Ju_VhdQ_3J|+~bg_!wGYrWq>@Lk)Q7`HHC6Y2wt5yJ4S-qqK^S+M~_MOcK0c;M; zQP;_Ou=+w>DEx#x#9Q`C!|ws6zHsJPvPOTrUtFbwdJ{dk)WC&muj~ee1J16FO=e4C z4vv&|>SMNuSh}Nl()daB<_hF3rd2w>+35Ty#Afbp?KEn*3vrWm(N;bF$PD{eI5XZb zj>)9ABd>f(LW>@Yq)OSjMxcQ+f)1OK*5mKVt&6z@RR~{sedDvJM7XOx)Zurfw}gMC zqu2rLH_~NW3E=B+$CiD2r9WX++#dQ^Eo5J-2EPu48KUul6J9jsBM)-slt^KcxCW!uW&>|U;{h-gMb z07d(iKWh&HdxffW)U-93q4)?qdwYNCuuOD$S98_9Sbi3lo(MVWHpJD_N(@&|I+v^>qrb`|FTltw<5&R6qVSa$D37W!i&ZPhO#EdeZN%YO!n$_7H)czQ&b&To+J;o`XEO?riihJ476h@3noxh{GCL$- zB5j985pe6O6WmnaAmlp_W&`?m$e{bU)>>;T{vU#7(WHU7pl(N9`svWq-NKq2J3XjE zTPY6L$<2sSizh~Auky%>J+r+SwLJ>RG&X4#>DV|P8KfsyEbz?7p0x@+IbpdEWJAZ9 zBEDbE*l;g87O1rB0g-4fCBA=2z~9{(kU+w+C%aS?b|^x~$Kc%N!B;m;B&d^P5I~-U zCKjgy{J$9=AM_Gq>DABMDCjM-GYUDGja$5HRC_b|fbx7Ykavu-lg{Z>U*JglD~p!t z*$UANb)zf_X37kDJjQ!_*p_NwpF2-Bs75)>ie23by=;NMoOg}sjPHLIA@=F66E&=V zkW7hZasV<4e2~?)IMrsiyv~oY(ii8z(egP+>G8brr8n~lXDT2rJh8_wlRGDtEbbx@&!zJU+d?c(h~himYY&j|AHa5R)LM`6~`(Un&=M)N*F~-$yr}u z#)-Z#!%5D*<8(3S|L}wI{{jA=0I-69fUfRPN1&?%%KriC$+KdU3E_bTPDM{nNK2ED z;eQ5BMNdvhOOue{AG0*#J_r#wFfa-)Ol59obZ9alF)}$flMSvH12{M_lYuEHf9+Cf zSQJ+l1w>>@WRoqR_}G+1dSP!+*+IaDrU69|Nz+|GVRsi4-AJ>FtO_CqQ0NvSpe#X! zpfD~tgp4Ax#3)8o78$|D1zD7tAQDXhW9A$3bMhx!E2$R7DR0b~+=HNA$3^wpXnF!1i5P&0_3h0X`VgVhF zg|Rr8MS#d;z(SZj5C%seT!^?R$%7k?0_$a%#gG1+ii5FOTof=|l4%5Re~~Pd%N76@ z91an^QM?QOn$LqVKt)+F#$8F>121c% z!YqW(S()|VG1v&xksHB=0cjaRV%?B+CooYqKI}#0_y6hSgvKYDnpu(ozTllnBnqHdQIh|g8NfwifB3M63$P@SNY)hd zC6vj>Fqq3*x?H%4pW|=@w;YD!VJ7tWAASug zYttW{kYrbPdBqqHHwDhu3)jnwSBp0tT+oU=+M49s>o%1ZQ&95LM{(SjVqwBnt-!ZJ zs^EFF?$7D36|T2Df0&)Hl=Qhj++A0+_w22*>5kVGG(#8v@il`w679ipm)k`dR@Q-T zLUurQX47VK9lBykOkIve_RvAaqOYWf?xv?iWy@YM8JIy^`O5QEvS$iE?)zEwxDvB< zlR5pFu?l_MexmklwxYtfpKf+GIEX-m9|pv$pUBd?Jkrb8e`ht6C1|>a-kVnc!8L~( zH?{R@YoN|A238@%)nlRNCZUmMJs+JTO@CE|o6ilPM%x#CO5{5TLmZQUr`PjXUQcp06c48w>T%x9(`{N=&f(SnKnK(({4iAKcV>vwXkWe<{|Q`m&+`_Je6z{i!{oNQss~ z+lGv__8o@`F{^w#C*F`umsP`Yrdzv~^KGn0pJ=DE)vI6fSWHFDE@9CdiNbRq;61Y= zd`0($eo!(|C3)pyq>@63^~vXHGcqb3zE6Ys(q@&UU#gnUymM+X` zl*L>bf0!+%U3+zU=4w*g?Vgh!`8|cXn(B%z(Qxuhz3ROK*?UwHRiK?Rv4-QL@Bf~x zk<*k>;4JAXH`1y)`AT9eua}wgZed$y{FD%!8R7aQ3^m9nYipP)1L{fhGGR82vQh0V7C~+A<-PXz z%_H9%IF@LcESyrj_^)Otx7mVx`*Po*ejR4HM92ZRoJqB|*$n6LJI_A^-^$ssWkaKd zVR1-s6kGEB(|4$4YYgvS!bXlfqVfG)76)}}pEIFvP zM5cQGY(1S@!n32Ua+461JS6T9>vg9xe_aprg*(pKNjr@$_|6W%k%p7ovL4DNQNZ`# zj^~x7wrsbJ>8U3?H6t~_?E=o)(y9x2f0?9AZS3h`AIY*qCnUV*0+<2%{d=z|5Suw} zH1?4oxv^Zr#)%41M9PM^t#KQUNZqr!m)#sb(D>HhY^aYqJoxo?y=uaw+HlRYe=umG zT(=Q&<)1&2FO~hiCFQmiGWf<2B)+8s6CZ{#d=G||+JNTl*eCT9%=;a=ch;+g? z6C-SXDtf|9GAbH%Z}$>jv+KWi;Kld@$=y3v?R4LgRI~LtJeDdIk{p#WLi!&c=>G-& z6a|=Un1S(74g)&?{R(=0*oc#H@mB#jlgaTZ21-y$QBhTs`0;24N>EBsQB{*>@?Zpd zWpZzm#qu_@_wx4!0XLI@DJYW{`VW7Vbryyh`!2@Vi5k^3^B)E?!x*w{k_kGXX>3lrr)A^m}`SM)XeLeSmJ@@^{NLkq`>Je$DL1P+~ zp$J!ks{;mDtSKA@u+A_TL`KGd4&oVP8r2Zb0M!9F8m$VL`FH>bWdNq8j#PhEN2)<& z00Ww*Kb`F2$^Z@<$o>?m0eTdWPA1@~02a@11u3i?1iS}eOCyj$hQAV^=ivd^{Jh}` z*nr+3-4`S(LEvzJNG33V)1V8P3W5IgWJ)E`0JT48qL1faAzzU0%`ycX-n1zTuuKwZ zR1bfE2$CRB3mU5$$nx^vu=Rg?a$_G44+}iyXZp=f{aYMQA$$1$si09jeHb7ez|x2y zo%*}!cc0;DC8zf@S)Q| zDr57jvWD>&CXre513^EK02v;j5i}y*GVY!$3N|Y2D&v&(mdGrQY=0PaJ5xhxW?Vz4 zk6zPh2kxC0j1qJsUl&OKgsFfMNyyh?clCl=18t#ELxQb4cFKPiT(;$A5@v8Gwm!{k zdBji2iG4r3Z_=|yo;f1D_{#SoXQlZ^xY`x5PjMWjg9GbdgWW?qUJq}(M3kONhdAfe znWupcA6_LtU!66f71D-_p6?c>qmOi0fA?^ z?;Cc^MVr~G^GJWF_BrHd0$cWINo6`}->b!7Kl4m<%c3WwGPn1bhM!G8a@5p*NxZB; zh)^o-p=DAe#s*eBI@UnZrZz=SR#}G&xmR@|v@XIuYtm$FPOYrV%pXYPSa4oj8~^qr zUaWyh2$b3)dSmNRc~q8;?_v2F*>;#1XKzfaloQ_d!h3&)p3af+ZMyL-lovX0g6=J2 z0Y`Ly=+1$X80ldI;~nZmfvYCG!!n6=5TJUH8w6hP|HIbn$X`Zr7bL>u}eS?H)#jBo*!=N@k^d{tq&4H zuC7R4S66?{>G`fP)tPSJTJxz`RWg`!Dni`-ywa?lTp;Q*`$J6mDgQ21`K{JAkwY0o zyC6mD4EO7$n9_3;|1W6Xv@&$n9GpErsD44O_6aGEo(xnT#)K@&$+pOxd{+L2A&_jf zcIA{3-AU&`!y_u4I(cIy&=>K*@+49N=d#hGU2K1IwJ0ztg!yGqMKbmzM19+vp$W8@ zr%^z9@Q=u)Arqf%f=0FN$A_u!%Q9cKy(Xh4BI>US`bcXzRvgrB5UYF?Y!=Mjl~)yE zzckI5f>kl#2Jt9lJ+13=VVsd6!u`A|dY4;Fo)=4gvowN_ZLJ&Ge`8vw zu1HwT{^ft<75_> z`L)HH>%!=W9hDb4@M@xzo#;ynLA!kkVjJ zNAt%>6KBHqF%j3MJErTp5@FeeXO0-{(=tpMK9CA2Z!e>0R#- z5o6b%Ks>(Y;Gkzr4* z26%g3i>@ZH&3xv<>=d#esI&@QvS^LbI;A&VxM5^*znnMcZZ&rBRQ6i7cAr z)XsLH)X>HrGM~O2rtq>c>|nLNXf9rq4`ue{`-4-UKZZE39pe>hv9(B9)^O`uys?+Y z%()^N$jmXLSI^9Sp98lVnG79BgTvk*Zf*e)^~s87Bl4?FvO;jNu`7S17U@F005|6# zOgQExWaYKD@w0_12F zG=;~KeDW(2e*I1EsQ6U<;PXIAb6Vxw%Zs@pD4l7hu2#ATZ#4E&z=C~o+?g)6m^*zR zbBpH)8Sh=rtv-eMo@c7c;nu=6;b%QXu?`{|Ud2H)p|iqU9FKoq?Koi=aLAaV#(Zap z8xwMAR;UZz6JN4hw>z?IfPHIt@&y5Mw^ICKB-`3Iv}Aa+?BmgD`7Y%!W@%c-{NoNa z?#Wx&ddL0pS+c?iOSh?x2MP&Qx{UAy2bCmQfy(`;(kY#iMcIPrjyRQsPxliL!k=h&+?}xgeVIMJLvSw6AY4AGi^TX2Z6Ql@PYwei5jyFowIijB0+6V!s9H%e=H_ z;1YqaU4<3X~7A7@AJjy zFwva2+n769zQa3%^a$)ppS2G8RzH(d?=?IWqTyo^3vcfvh)hWxgv{>>)XlRMlPj!n zkfe#s<}DqyDHrPPLikKcOejWVJ4zIM-IKwHrN-+j6nqLAT;C>P{i1eb9LSxVPtq*Qs1k5PPJeV@Lnp?%Xopt` zjM_bEz86s26mQwk^QkypdrS8fgS^IKK@K{*MM-h_cXtFAx42ejjw|&Q&KCLF+`Dz= z;oRK(_h)uxclCVyqu0K_oz1d`qyBiwq2D3*0xvzhW}y49<7nTj zn;Qf_2L9{)@>tE@Z57M?z0zxKl4UOBtdvT=zUJGy6(1LUxi^U`UikI21xLQI$v$0l z-8;49h^}nk^tQKgof>6jckb#o|LC0jFL(X) zm?E8&@uzxCzT3mU6Aj-Sce|mt@2HL8u{T+E)7B^GwP&YPwetPu7k~1f^PjqqfQ^IA zT*t)^UcQ@9&%mW1W;}gAD`OK|fMpU%d|sLp7%U5}4ZgOS<7 zz-W6UKVv13WoW$pssQ6DMkXVZ?F)q%s~DM#O}ER6Fgh^S8>1O(YGG`O;Y=fAGZQp* zW=1B4M(ASZrWP1t7A9usc9>b1nnKm_BErtX%xwBgQAVe17grYxLlYMxXHz3%Cl^a+ zQx`)w11Bd-Cj&z#V?%ROV`mc+6H_|{8zL3Pa@pB&6_+Fyl~fd^rg52Bn46h#sj9mA HyKw;kIyT+g From 1d200e3205c62feabba642cd93a68a9ba80c8065 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 26 Sep 2004 14:06:05 +0000 Subject: [PATCH 0412/1469] moved to higher level git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@412 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure.in | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/configure.in b/configure.in index da0cad6ea..045d12d9d 100644 --- a/configure.in +++ b/configure.in @@ -51,7 +51,7 @@ esac AC_ARG_ENABLE(autoconf, [ --enable-Werror abort compilation after any C compiler warning], - ADD_CFLAGS="-Werror -W") + ADD_CFLAGS="-Werror -W -Wpointer-arith") AC_SUBST(ADD_CFLAGS) dnl Add these flags if we're using GCC. @@ -61,7 +61,6 @@ case "$GCC" in CFLAGS="$CFLAGS -Wshadow" CFLAGS="$CFLAGS -Wcast-qual" CFLAGS="$CFLAGS -Wcast-align" - CFLAGS="$CFLAGS -Wpointer-arith" CFLAGS="$CFLAGS -Wchar-subscripts" CFLAGS="$CFLAGS -Wmissing-prototypes" CFLAGS="$CFLAGS -Wmissing-declarations" From b22c36f0a41758063ff71ee9526d5158775374d1 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 26 Sep 2004 14:06:39 +0000 Subject: [PATCH 0413/1469] recompiled git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@413 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/configure b/configure index f866aec76..2db0d94d1 100755 --- a/configure +++ b/configure @@ -21404,7 +21404,7 @@ esac # Check whether --enable-autoconf or --disable-autoconf was given. if test "${enable_autoconf+set}" = set; then enableval="$enable_autoconf" - ADD_CFLAGS="-Werror -W" + ADD_CFLAGS="-Werror -W -Wpointer-arith" fi; @@ -21414,7 +21414,6 @@ case "$GCC" in CFLAGS="$CFLAGS -Wshadow" CFLAGS="$CFLAGS -Wcast-qual" CFLAGS="$CFLAGS -Wcast-align" - CFLAGS="$CFLAGS -Wpointer-arith" CFLAGS="$CFLAGS -Wchar-subscripts" CFLAGS="$CFLAGS -Wmissing-prototypes" CFLAGS="$CFLAGS -Wmissing-declarations" From ab8e43d8db3b8007d3882be4dd5e9249e2652529 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 26 Sep 2004 14:07:09 +0000 Subject: [PATCH 0414/1469] no strdup git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@414 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1parser.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libasn1parser/asn1parser.c b/libasn1parser/asn1parser.c index 6a3477d10..05330d6d5 100644 --- a/libasn1parser/asn1parser.c +++ b/libasn1parser/asn1parser.c @@ -1,5 +1,5 @@ #include -#include +#include #include #include #include @@ -181,10 +181,12 @@ _asn1p_fix_modules(asn1p_t *a, const char *fname) { asn1p_module_t *mod; TQ_FOR(mod, &(a->modules), mod_next) { asn1p_expr_t *expr; + int flen = strlen(fname) + 1; - mod->source_file_name = strdup(fname); + mod->source_file_name = malloc(flen); if(mod->source_file_name == NULL) return -1; + memcpy(mod->source_file_name, fname, flen); TQ_FOR(expr, &(mod->members), next) { _asn1p_apply_module2expr(expr, mod); From 275e5fda84759d6cad274f82bb45e81d0f299e8a Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 26 Sep 2004 14:10:37 +0000 Subject: [PATCH 0415/1469] another way git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@415 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure.in | 3 +++ 1 file changed, 3 insertions(+) diff --git a/configure.in b/configure.in index 045d12d9d..5f9f56f10 100644 --- a/configure.in +++ b/configure.in @@ -51,7 +51,10 @@ esac AC_ARG_ENABLE(autoconf, [ --enable-Werror abort compilation after any C compiler warning], + enable_werror=$enableval, enable_werror=no) +if test x$enable_werror = xyes; then ADD_CFLAGS="-Werror -W -Wpointer-arith") +fi AC_SUBST(ADD_CFLAGS) dnl Add these flags if we're using GCC. From ee2e9c550980ba131ba6e48767dab94d6f2c1b19 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 26 Sep 2004 14:18:32 +0000 Subject: [PATCH 0416/1469] proper way of doing things git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@416 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure | 13 +++++++++---- configure.in | 4 ++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/configure b/configure index 2db0d94d1..794cd3efd 100755 --- a/configure +++ b/configure @@ -21401,11 +21401,16 @@ mingw* | p32*) ;; esac -# Check whether --enable-autoconf or --disable-autoconf was given. -if test "${enable_autoconf+set}" = set; then - enableval="$enable_autoconf" - ADD_CFLAGS="-Werror -W -Wpointer-arith" +# Check whether --enable-Werror or --disable-Werror was given. +if test "${enable_Werror+set}" = set; then + enableval="$enable_Werror" + enable_werror=$enableval +else + enable_werror=no fi; +if test x$enable_werror = xyes; then + ADD_CFLAGS="-Werror -W -Wpointer-arith" +fi case "$GCC" in diff --git a/configure.in b/configure.in index 5f9f56f10..a3362b0fc 100644 --- a/configure.in +++ b/configure.in @@ -49,11 +49,11 @@ mingw* | p32*) ;; esac -AC_ARG_ENABLE(autoconf, +AC_ARG_ENABLE(Werror, [ --enable-Werror abort compilation after any C compiler warning], enable_werror=$enableval, enable_werror=no) if test x$enable_werror = xyes; then - ADD_CFLAGS="-Werror -W -Wpointer-arith") + ADD_CFLAGS="-Werror -W -Wpointer-arith" fi AC_SUBST(ADD_CFLAGS) From 4f929ef5be25bfc6c61404f9871461ca1d3b06c5 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 27 Sep 2004 20:31:02 +0000 Subject: [PATCH 0417/1469] added extensibility git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@417 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/62-any-OK.asn1 | 5 +++-- tests/62-any-OK.asn1.-EF | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/62-any-OK.asn1 b/tests/62-any-OK.asn1 index 5b58562b2..7c9991bd4 100644 --- a/tests/62-any-OK.asn1 +++ b/tests/62-any-OK.asn1 @@ -12,8 +12,9 @@ ModuleTestANYSyntax BEGIN T ::= SEQUENCE { - i INTEGER, - any [1] ANY -- Converted into [1] EXPLICIT ANY + i INTEGER OPTIONAL, + any [1] ANY, -- Converted into [1] EXPLICIT ANY + ... } END diff --git a/tests/62-any-OK.asn1.-EF b/tests/62-any-OK.asn1.-EF index eb9270925..bc08f0389 100644 --- a/tests/62-any-OK.asn1.-EF +++ b/tests/62-any-OK.asn1.-EF @@ -6,8 +6,9 @@ DEFINITIONS IMPLICIT TAGS ::= BEGIN T ::= SEQUENCE { - i INTEGER, - any [1] EXPLICIT ANY + i INTEGER OPTIONAL, + any [1] EXPLICIT ANY, + ... } END From 91ac31ce713cceb588542eb00d9b15f277154f44 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 27 Sep 2004 20:31:19 +0000 Subject: [PATCH 0418/1469] improved xml handling git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@418 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/enber.1 | 26 ++++++++++++++++++++++++-- asn1c/enber.c | 47 +++++++++++++++++++++++++++++++++------------- asn1c/unber.1 | 16 +++++++++++++--- asn1c/unber.c | 52 ++++++++++++++++++++++++++++----------------------- 4 files changed, 100 insertions(+), 41 deletions(-) diff --git a/asn1c/enber.1 b/asn1c/enber.1 index 8b1f42e12..4a9edfc22 100644 --- a/asn1c/enber.1 +++ b/asn1c/enber.1 @@ -12,16 +12,38 @@ .SH NAME enber \- Convert the unber XML output back into BER .SH SYNOPSIS -enber [\fB-\fR] \fIinfile\fR... +enber [\fB-n\fR] [\fB-\fR] \fIinfile\fR... .SH DESCRIPTION -enber takes the XML-encoded files produced by \fIunber\fR\|(1) and converts +enber takes the XML-formatted files produced by \fIunber\fR\|(1) and converts them back into the BER format. A single dash represents the standard input. +.SH OPTIONS +.TP +\fB\-n\fR +Disable input validation. By default, enber performs some basic validity checks +against the XML input. This option disables such checks. .SH EXAMPLES Decode the BER sequence and immediately encode it back .Vb \& unber \fB-p\fR \fIfilename.ber\fR | enber \fB-\fR > \fIreconstructed.ber\fR .Ve +.SH FOOTNOTES +This program does not attempt to perform full-fledged XML parsing. It is merely +compatible with \fIunber\fR\|(1)'s output. +In particular, the XML comments are not supported. +The following characters after the initial white space indicate +the start of a comment: "\fB#\fR" (a hash) and "\fB--\fR" (two dashes). +The whole comment line is ignored completely. Empty lines are ignored as well. +.P +The following example demostrates the use of comments: +.Vb +\& +\& +\& -- +\& # Do not terminate: +\& # the absence of end-of-content octets is intentional! +\& +.Ve .SH SEE ALSO .TP \&\fIunber\fR\|(1), \&\fIasn1c\fR\|(1) diff --git a/asn1c/enber.c b/asn1c/enber.c index 45fda4345..c6cadf7bb 100644 --- a/asn1c/enber.c +++ b/asn1c/enber.c @@ -45,7 +45,7 @@ #include #include -static void usage(const char *av0); /* Print the Usage screen and exit */ +static void usage(const char *av0, int);/* Print the Usage screen and exit */ static int process(const char *fname); /* Perform the BER decoding */ static int process_line(const char *fname, char *line, int lineno); @@ -53,6 +53,8 @@ static int process_line(const char *fname, char *line, int lineno); #define COPYRIGHT \ "Copyright (c) 2004 Lev Walkin \n" +static int no_validation; /* -n */ + int main(int ac, char **av) { int ch; /* Command line character */ @@ -61,15 +63,20 @@ main(int ac, char **av) { /* * Process command-line options. */ - while((ch = getopt(ac, av, "hv")) != -1) + while((ch = getopt(ac, av, "nhv")) != -1) switch(ch) { + case 'n': + no_validation++; + break; case 'v': - fprintf(stderr, "ASN.1 BER Decoder, v" VERSION "\n" COPYRIGHT); + usage(av[0], 1); + fprintf(stderr, "Convert unber(1)'s output back into BER, " + "v" VERSION "\n" COPYRIGHT); exit(0); break; case 'h': default: - usage(av[0]); + usage(av[0], 0); } /* @@ -101,11 +108,15 @@ main(int ac, char **av) { * Print the usage screen and exit(EX_USAGE). */ static void -usage(const char *av0) { +usage(const char *av0, int copyright_only) { + fprintf(stderr, + "Convert unber(1)'s output back into BER, " + "v" VERSION "\n" COPYRIGHT); + if(copyright_only) exit(0); fprintf(stderr, -"Convertor of under(1) output back into BER, v" VERSION "\n" COPYRIGHT -"Usage: %s [-] [file ...]\n" - , av0); + "Usage: %s [-n] [-] [file ...]\n" + "Options:\n" + " -n Disable XML input validation\n", av0); exit(EX_USAGE); } @@ -184,9 +195,18 @@ process_line(const char *fname, char *line, int lineno) { (void)fname; /* Find a tag opening angle bracket */ - for(; *line == ' '; line++); + for(; *line == ' ' || *line == '\t'; line++); op = line; - if(*op != '<') { + switch(*op) { + case '<': /* That's what we want! A tag opening */ + break; + case '-': /* This is a comment (dash-dash) */ + if(op[1] == *op) + case '\r': + case '\n': + case '#': /* This is a comment */ + return 0; + default: fprintf(stderr, "%s: Missing '<' after whitespace\n", fname); exit(EX_DATAERR); } @@ -240,10 +260,10 @@ process_line(const char *fname, char *line, int lineno) { tcl_pos = strstr(op, "T=\"["); tl_pos = strstr(op, "TL=\""); v_pos = strstr(op, "V=\""); - if(!tcl_pos || !tl_pos || !v_pos) { + if(!tcl_pos || !tl_pos || (!v_pos && constr != 2)) { fprintf(stderr, "%s: Mandatory attribute %s is not found at line %d\n", - fname, (!tcl_pos)?"T":(v_pos?"V":"TCL"), lineno); + fname, (!tcl_pos)?"T":((!v_pos)?"V":"TL"), lineno); exit(EX_DATAERR); } errno = 0; @@ -368,11 +388,12 @@ process_line(const char *fname, char *line, int lineno) { fputc(v, stdout); } if(len != tlv_len) { + if(no_validation) fprintf(stderr, "Warning: "); fprintf(stderr, "%s: Could not encode value of %d chars " "at line %d in %d bytes\n", fname, len, lineno, tlv_len); - exit(EX_DATAERR); + if(!no_validation) exit(EX_DATAERR); } } diff --git a/asn1c/unber.1 b/asn1c/unber.1 index bfedffa32..a31fabd1d 100644 --- a/asn1c/unber.1 +++ b/asn1c/unber.1 @@ -29,7 +29,8 @@ By default, unber continues decoding until the end of file (input stream). Use the specified number of spaces for output indentation. Default is 4 spaces. .TP \fB\-p\fR -Do \fInot\fR attempt pretty-printing of known ASN.1 types (strings, INTEGER, BOOLEAN, etc). +Do \fInot\fR attempt pretty-printing of known ASN.1 types (OBJECT IDENTIFIER, INTEGER, BOOLEAN, etc). By default, some ASN.1 types are converted into +the text representation. This option is required for \&\fIenber\fR\|(1). .TP \fB\-t\fR \fIdata-string\fR Interpret the data-string as a sequence of hexadecimal values representing @@ -62,7 +63,7 @@ Likely name of the underlying ASN.1 type (for UNIVERSAL tags) [\fIF\fR] Indicates that the value was reformatted (pretty-printed) .P -Example: +Sample XML output: .Vb \& \&

    US

    @@ -84,10 +85,19 @@ Decode the binary stream taken from the standard input: .Vb \& cat \fI...\fR | unber \fB-\fR .Ve -Decode the binary stream into the same stream (see \fIenber\fR\|(1)): +Decode the binary stream into the same stream (see \&\fIenber\fR\|(1)): .Vb \& cat \fI...\fR | unber \fB-p\fR \fB-\fR | enber \fB-\fR > filename.ber\fI\fR .Ve +.SH FOOTNOTES +The constructed XML output is not necessarily well-formed. +.P +When indefinite length encoding is being used, the BER sequence, which is not +terminated with the end-of-content octets, will cause the terminating \fB
    \fR +XML tag to disappear. +Thus, the invalid BER framing directly causes invalid XML output. +.P +The \&\fIenber\fR\|(1) utility understands this convention correctly. .SH SEE ALSO .TP \&\fIenber\fR\|(1), \&\fIasn1c\fR\|(1) diff --git a/asn1c/unber.c b/asn1c/unber.c index c9e7da124..c7ba71c8e 100644 --- a/asn1c/unber.c +++ b/asn1c/unber.c @@ -158,7 +158,7 @@ typedef enum pd_code { PD_FINISHED = 0, PD_EOF = 1, } pd_code_e; -static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t limit); +static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t limit, ssize_t *decoded, int expect_eoc); static void print_TL(int fin, int level, int constr, ssize_t tlen, ber_tlv_tag_t, ber_tlv_len_t); static int print_V(const char *fname, FILE *fp, ber_tlv_tag_t, ber_tlv_len_t); @@ -169,6 +169,7 @@ static int process(const char *fname) { FILE *fp; pd_code_e pdc; + ssize_t decoded = 0; if(strcmp(fname, "-")) { fp = fopen(fname, "r"); @@ -184,7 +185,7 @@ process(const char *fname) { * Fetch out BER-encoded data until EOF or error. */ do { - pdc = process_deeper(fname, fp, 0, -1); + pdc = process_deeper(fname, fp, 0, -1, &decoded, 0); } while(pdc == PD_FINISHED && !single_type_decoding); if(fp != stdin) @@ -198,7 +199,7 @@ process(const char *fname) { /* * Process the TLV recursively. */ -static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t limit) { +static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t limit, ssize_t *decoded, int expect_eoc) { unsigned char tagbuf[32]; ssize_t tblen = 0; pd_code_e pdc = PD_FINISHED; @@ -266,52 +267,57 @@ static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t continue; } - if(tagbuf[0] == '\0' && tagbuf[1] == '\0') { - /* End of content octets */ - return PD_FINISHED; - } - /* Make sure the T & L decoders took exactly the whole buffer */ assert((t_len + l_len) == tblen); - print_TL(0, level, constr, tblen, tlv_tag, tlv_len); + if(!expect_eoc || tagbuf[0] || tagbuf[1]) + print_TL(0, level, constr, tblen, tlv_tag, tlv_len); if(limit != -1) { /* If limit is set, account for the TL sequence */ limit -= (t_len + l_len); assert(limit >= 0); - } - if(limit != -1) { if(tlv_len > limit) { fprintf(stderr, "%s: Structure advertizes length (%ld) " "greater than of a parent container (%ld)\n", fname, (long)tlv_len, (long)limit); return PD_FAILED; - } else if(tlv_len != -1) { - /* Account for the V */ - limit -= tlv_len; } } + *decoded += t_len + l_len; + + if(expect_eoc && tagbuf[0] == '\0' && tagbuf[1] == '\0') { + /* End of content octets */ + print_TL(1, level - 1, 1, 2, 0, -1); + return PD_FINISHED; + } + if(constr) { + ssize_t dec = 0; /* * This is a constructed type. Process recursively. */ - - /* Get the new subframe limit from the structure tags */ - if(tlv_len == -1) - tlv_len = limit; - printf(">\n"); /* Close the opening tag */ - pdc = process_deeper(fname, fp, level + 1, tlv_len); + pdc = process_deeper(fname, fp, level + 1, + tlv_len == -1 ? limit : tlv_len, + &dec, tlv_len == -1); if(pdc == PD_FAILED) return pdc; + if(limit != -1) limit -= dec; + *decoded += dec; + if(tlv_len == -1) { + tblen = 0; + continue; + } } else { - assert(tlv_len >= 0); if(print_V(fname, fp, tlv_tag, tlv_len)) return PD_FAILED; + + limit -= tlv_len; + *decoded += tlv_len; } print_TL(1, level, constr, tblen, tlv_tag, tlv_len); @@ -339,9 +345,9 @@ print_TL(int fin, int level, int constr, ssize_t tlen, ber_tlv_tag_t tlv_tag, be ber_tlv_tag_fwrite(tlv_tag, stdout); printf("\""); - if(!fin) { + if(!fin || tlv_len == -1) printf(" TL=\"%ld\"", (long)tlen); - + if(!fin) { if(tlv_len == -1) printf(" V=\"Indefinite\""); else From 7b7e1dc1bebda3876b7dbe692db75e3c9a90e53f Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 27 Sep 2004 20:50:48 +0000 Subject: [PATCH 0419/1469] ANY/OCTET STRING/BIT STRING testing, plus numerous test cases git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@419 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/Makefile.am | 9 +- asn1c/tests/Makefile.in | 10 +- asn1c/tests/check-62.c | 193 +++++++++++++++++++++++++++ asn1c/tests/data-62/data-62-01.ber | 1 + asn1c/tests/data-62/data-62-01.xbr | 6 + asn1c/tests/data-62/data-62-02-B.ber | 2 + asn1c/tests/data-62/data-62-02-B.xbr | 6 + asn1c/tests/data-62/data-62-03-B.ber | 1 + asn1c/tests/data-62/data-62-03-B.xbr | 6 + asn1c/tests/data-62/data-62-04-B.ber | 1 + asn1c/tests/data-62/data-62-04-B.xbr | 6 + asn1c/tests/data-62/data-62-05-B.ber | 1 + asn1c/tests/data-62/data-62-05-B.xbr | 6 + asn1c/tests/data-62/data-62-06-B.ber | 1 + asn1c/tests/data-62/data-62-06-B.xbr | 6 + asn1c/tests/data-62/data-62-07-B.ber | 1 + asn1c/tests/data-62/data-62-07-B.xbr | 6 + asn1c/tests/data-62/data-62-08-L.ber | Bin 0 -> 15 bytes asn1c/tests/data-62/data-62-08-L.xbr | 7 + asn1c/tests/data-62/data-62-09-L.ber | Bin 0 -> 18 bytes asn1c/tests/data-62/data-62-09-L.xbr | 8 ++ asn1c/tests/data-62/data-62-10.ber | Bin 0 -> 9 bytes asn1c/tests/data-62/data-62-10.xbr | 6 + asn1c/tests/data-62/data-62-11.ber | Bin 0 -> 12 bytes asn1c/tests/data-62/data-62-11.xbr | 8 ++ asn1c/tests/data-62/data-62-12-B.ber | 1 + asn1c/tests/data-62/data-62-12-B.xbr | 6 + asn1c/tests/data-62/data-62-13-B.ber | Bin 0 -> 10 bytes asn1c/tests/data-62/data-62-13-B.xbr | 8 ++ asn1c/tests/data-62/data-62-14.ber | Bin 0 -> 16 bytes asn1c/tests/data-62/data-62-14.xbr | 10 ++ asn1c/tests/data-62/data-62-15-B.ber | Bin 0 -> 14 bytes asn1c/tests/data-62/data-62-15-B.xbr | 10 ++ asn1c/tests/data-62/data-62-16.ber | Bin 0 -> 14 bytes asn1c/tests/data-62/data-62-16.xbr | 7 + asn1c/tests/data-62/data-62-17-B.ber | Bin 0 -> 15 bytes asn1c/tests/data-62/data-62-17-B.xbr | 7 + asn1c/tests/data-62/data-62-18-B.ber | Bin 0 -> 14 bytes asn1c/tests/data-62/data-62-18-B.xbr | 7 + asn1c/tests/data-62/data-62-19-B.ber | Bin 0 -> 14 bytes asn1c/tests/data-62/data-62-19-B.xbr | 7 + asn1c/tests/data-62/data-62-20.ber | Bin 0 -> 11 bytes asn1c/tests/data-62/data-62-20.xbr | 8 ++ asn1c/tests/data-62/data-62-21-B.ber | Bin 0 -> 15 bytes asn1c/tests/data-62/data-62-21-B.xbr | 11 ++ asn1c/tests/data-62/data-62-22.ber | Bin 0 -> 15 bytes asn1c/tests/data-62/data-62-22.xbr | 11 ++ asn1c/tests/data-62/data-62-23-B.ber | Bin 0 -> 15 bytes asn1c/tests/data-62/data-62-23-B.xbr | 11 ++ asn1c/tests/data-62/data-62-24-L.ber | Bin 0 -> 20 bytes asn1c/tests/data-62/data-62-24-L.xbr | 12 ++ asn1c/tests/data-62/data-62-25.ber | Bin 0 -> 16 bytes asn1c/tests/data-62/data-62-25.xbr | 11 ++ asn1c/tests/data-62/data-62-26-B.ber | Bin 0 -> 18 bytes asn1c/tests/data-62/data-62-26-B.xbr | 11 ++ asn1c/tests/data-62/data-62-27.ber | Bin 0 -> 4 bytes asn1c/tests/data-62/data-62-27.xbr | 4 + 57 files changed, 429 insertions(+), 4 deletions(-) create mode 100644 asn1c/tests/check-62.c create mode 100644 asn1c/tests/data-62/data-62-01.ber create mode 100644 asn1c/tests/data-62/data-62-01.xbr create mode 100644 asn1c/tests/data-62/data-62-02-B.ber create mode 100644 asn1c/tests/data-62/data-62-02-B.xbr create mode 100644 asn1c/tests/data-62/data-62-03-B.ber create mode 100644 asn1c/tests/data-62/data-62-03-B.xbr create mode 100644 asn1c/tests/data-62/data-62-04-B.ber create mode 100644 asn1c/tests/data-62/data-62-04-B.xbr create mode 100644 asn1c/tests/data-62/data-62-05-B.ber create mode 100644 asn1c/tests/data-62/data-62-05-B.xbr create mode 100644 asn1c/tests/data-62/data-62-06-B.ber create mode 100644 asn1c/tests/data-62/data-62-06-B.xbr create mode 100644 asn1c/tests/data-62/data-62-07-B.ber create mode 100644 asn1c/tests/data-62/data-62-07-B.xbr create mode 100644 asn1c/tests/data-62/data-62-08-L.ber create mode 100644 asn1c/tests/data-62/data-62-08-L.xbr create mode 100644 asn1c/tests/data-62/data-62-09-L.ber create mode 100644 asn1c/tests/data-62/data-62-09-L.xbr create mode 100644 asn1c/tests/data-62/data-62-10.ber create mode 100644 asn1c/tests/data-62/data-62-10.xbr create mode 100644 asn1c/tests/data-62/data-62-11.ber create mode 100644 asn1c/tests/data-62/data-62-11.xbr create mode 100644 asn1c/tests/data-62/data-62-12-B.ber create mode 100644 asn1c/tests/data-62/data-62-12-B.xbr create mode 100644 asn1c/tests/data-62/data-62-13-B.ber create mode 100644 asn1c/tests/data-62/data-62-13-B.xbr create mode 100644 asn1c/tests/data-62/data-62-14.ber create mode 100644 asn1c/tests/data-62/data-62-14.xbr create mode 100644 asn1c/tests/data-62/data-62-15-B.ber create mode 100644 asn1c/tests/data-62/data-62-15-B.xbr create mode 100644 asn1c/tests/data-62/data-62-16.ber create mode 100644 asn1c/tests/data-62/data-62-16.xbr create mode 100644 asn1c/tests/data-62/data-62-17-B.ber create mode 100644 asn1c/tests/data-62/data-62-17-B.xbr create mode 100644 asn1c/tests/data-62/data-62-18-B.ber create mode 100644 asn1c/tests/data-62/data-62-18-B.xbr create mode 100644 asn1c/tests/data-62/data-62-19-B.ber create mode 100644 asn1c/tests/data-62/data-62-19-B.xbr create mode 100644 asn1c/tests/data-62/data-62-20.ber create mode 100644 asn1c/tests/data-62/data-62-20.xbr create mode 100644 asn1c/tests/data-62/data-62-21-B.ber create mode 100644 asn1c/tests/data-62/data-62-21-B.xbr create mode 100644 asn1c/tests/data-62/data-62-22.ber create mode 100644 asn1c/tests/data-62/data-62-22.xbr create mode 100644 asn1c/tests/data-62/data-62-23-B.ber create mode 100644 asn1c/tests/data-62/data-62-23-B.xbr create mode 100644 asn1c/tests/data-62/data-62-24-L.ber create mode 100644 asn1c/tests/data-62/data-62-24-L.xbr create mode 100644 asn1c/tests/data-62/data-62-25.ber create mode 100644 asn1c/tests/data-62/data-62-25.xbr create mode 100644 asn1c/tests/data-62/data-62-26-B.ber create mode 100644 asn1c/tests/data-62/data-62-26-B.xbr create mode 100644 asn1c/tests/data-62/data-62-27.ber create mode 100644 asn1c/tests/data-62/data-62-27.xbr diff --git a/asn1c/tests/Makefile.am b/asn1c/tests/Makefile.am index 24d0a38f9..979161396 100644 --- a/asn1c/tests/Makefile.am +++ b/asn1c/tests/Makefile.am @@ -11,7 +11,12 @@ else TESTS = check-*.c endif -EXTRA_DIST = $(check_SCRIPTS) check-*.c* +EXTRA_DIST = $(check_SCRIPTS) check-*.c* data-*/*.* clean: - for t in test-*; do rm -rf $$t; done + rm -rf test-* + +SUFFIXES = .xbr .ber + +.xbr.ber: + ../enber $< > $@ diff --git a/asn1c/tests/Makefile.in b/asn1c/tests/Makefile.in index e4b6b3b11..00336bf2e 100644 --- a/asn1c/tests/Makefile.in +++ b/asn1c/tests/Makefile.in @@ -160,10 +160,12 @@ check_SCRIPTS = check-assembly.sh TESTS_ENVIRONMENT = CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" ./check-assembly.sh @CPLUSPLUS_FOUND_FALSE@TESTS = check-*.c @CPLUSPLUS_FOUND_TRUE@TESTS = check-*.c check-*.cc ## Include C++ test filed (.cc) -EXTRA_DIST = $(check_SCRIPTS) check-*.c* +EXTRA_DIST = $(check_SCRIPTS) check-*.c* data-*/*.* +SUFFIXES = .xbr .ber all: all-am .SUFFIXES: +.SUFFIXES: .xbr .ber $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -284,6 +286,7 @@ check-TESTS: $(TESTS) else :; fi distdir: $(DISTFILES) + $(mkdir_p) $(distdir)/data-* @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ @@ -396,7 +399,10 @@ uninstall-am: uninstall-info-am clean: - for t in test-*; do rm -rf $$t; done + rm -rf test-* + +.xbr.ber: + ../enber $< > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/asn1c/tests/check-62.c b/asn1c/tests/check-62.c new file mode 100644 index 000000000..06287a8a4 --- /dev/null +++ b/asn1c/tests/check-62.c @@ -0,0 +1,193 @@ +#undef NDEBUG +#include +#include +#include +#include /* for chdir(2) */ +#include +#include +#include +#include + +#include + +enum expectation { + EXP_OK, /* Encoding/decoding must succeed */ + EXP_BROKEN, /* Decoding must fail */ + EXP_RECLESS, /* Reconstruction is allowed to yield less data */ +}; + +static unsigned char buf[4096]; +static int buf_offset; + +static int +_buf_writer(const void *buffer, size_t size, void *app_key) { + unsigned char *b, *bend; + (void)app_key; + assert(buf_offset + size < sizeof(buf)); + memcpy(buf + buf_offset, buffer, size); + b = buf + buf_offset; + bend = b + size; + printf("=> ["); + for(; b < bend; b++) + printf(" %02X", *b); + printf("]:%ld\n", (long)size); + buf_offset += size; + return 0; +} + +static int +save_object(T_t *st) { + asn_enc_rval_t rval; /* Return value */ + + buf_offset = 0; + + rval = der_encode(&asn1_DEF_T, st, _buf_writer, 0); + if (rval.encoded == -1) { + fprintf(stderr, + "Cannot encode %s: %s\n", + rval.failed_type->name, strerror(errno)); + assert(rval.encoded != -1); + return -1; /* JIC */ + } + + fprintf(stderr, "SAVED OBJECT IN SIZE %d\n", buf_offset); + + return 0; +} + +static T_t * +load_object(enum expectation expectation, char *fbuf, int size) { + ber_dec_rval_t rval; + T_t *st = 0; + int csize; + + fprintf(stderr, "LOADING OBJECT OF SIZE %d\n", size); + + /* Perform multiple iterations with multiple chunks sizes */ + for(csize = 1; csize < 20; csize += 1) { + int fbuf_offset = 0; + int fbuf_left = size; + int fbuf_chunk = csize; + + if(st) asn1_DEF_T.free_struct(&asn1_DEF_T, st, 0); + st = 0; + + do { + fprintf(stderr, "Decoding from %d with %d (left %d)\n", + fbuf_offset, fbuf_chunk, fbuf_left); + rval = ber_decode(&asn1_DEF_T, (void **)&st, + fbuf + fbuf_offset, + fbuf_chunk < fbuf_left + ? fbuf_chunk : fbuf_left); + fbuf_offset += rval.consumed; + fbuf_left -= rval.consumed; + if(rval.code == RC_WMORE) + fbuf_chunk += 1; /* Give little more */ + else + fbuf_chunk = csize; /* Back off */ + } while(fbuf_left && rval.code == RC_WMORE); + + if(expectation != EXP_BROKEN) { + assert(rval.code == RC_OK); + } else { + assert(rval.code != RC_OK); + fprintf(stderr, "Failed, but this was expected\n"); + asn1_DEF_T.free_struct(&asn1_DEF_T, st, 0); + st = 0; /* ignore leak for now */ + } + } + + if(st) asn_fprint(stderr, &asn1_DEF_T, st); + return st; +} + + +static void +process_data(enum expectation expectation, char *fbuf, int size) { + T_t *st; + int ret; + + st = load_object(expectation, fbuf, size); + if(!st) return; + + ret = save_object(st); + assert(buf_offset < sizeof(buf)); + assert(ret == 0); + + if(expectation == EXP_RECLESS) { + assert(buf_offset > 0 && buf_offset < size); + assert(memcmp(buf + 2, fbuf + 2, buf_offset - 2) == 0); + } else { + assert(buf_offset == size); + assert(memcmp(buf, fbuf, buf_offset) == 0); + } + + asn1_DEF_T.free_struct(&asn1_DEF_T, st, 0); +} + +/* + * Decode the .der files and try to regenerate them. + */ +static int +process(const char *fname) { + char fbuf[4096]; + char *ext = strrchr(fname, '.'); + enum expectation expectation; + int ret; + int rd; + FILE *fp; + + if(ext == 0 || strcmp(ext, ".ber")) + return 0; + + switch(ext[-1]) { + case 'B': /* The file is intentionally broken */ + expectation = EXP_BROKEN; break; + case 'L': /* Extensions are present */ + expectation = EXP_RECLESS; break; + default: + expectation = EXP_OK; break; + } + + fprintf(stderr, "\nProcessing file [../%s]\n", fname); + + ret = chdir("../data-62"); + assert(ret == 0); + fp = fopen(fname, "r"); + ret = chdir("../test-check-62"); + assert(ret == 0); + assert(fp); + + rd = fread(fbuf, 1, sizeof(fbuf), fp); + fclose(fp); + + assert(rd < sizeof(fbuf)); /* expect small files */ + + process_data(expectation, fbuf, rd); + + return 1; +} + +int +main() { + DIR *dir; + struct dirent *dent; + int processed_files = 0; + + dir = opendir("../data-62"); + assert(dir); + + while((dent = readdir(dir))) { + if(strncmp(dent->d_name, "data-62-", 8)) + continue; + + if(process(dent->d_name)) + processed_files++; + } + + assert(processed_files); + closedir(dir); + + return 0; +} + diff --git a/asn1c/tests/data-62/data-62-01.ber b/asn1c/tests/data-62/data-62-01.ber new file mode 100644 index 000000000..9d0cd7d58 --- /dev/null +++ b/asn1c/tests/data-62/data-62-01.ber @@ -0,0 +1 @@ +0 ¡test \ No newline at end of file diff --git a/asn1c/tests/data-62/data-62-01.xbr b/asn1c/tests/data-62/data-62-01.xbr new file mode 100644 index 000000000..18f3e1087 --- /dev/null +++ b/asn1c/tests/data-62/data-62-01.xbr @@ -0,0 +1,6 @@ + +

    &x05;

    + +

    test

    +
    +
    diff --git a/asn1c/tests/data-62/data-62-02-B.ber b/asn1c/tests/data-62/data-62-02-B.ber new file mode 100644 index 000000000..288fa2f61 --- /dev/null +++ b/asn1c/tests/data-62/data-62-02-B.ber @@ -0,0 +1,2 @@ +0 +¡test \ No newline at end of file diff --git a/asn1c/tests/data-62/data-62-02-B.xbr b/asn1c/tests/data-62/data-62-02-B.xbr new file mode 100644 index 000000000..3d4afbf36 --- /dev/null +++ b/asn1c/tests/data-62/data-62-02-B.xbr @@ -0,0 +1,6 @@ + +

    &x05;

    + +

    test

    +
    +
    diff --git a/asn1c/tests/data-62/data-62-03-B.ber b/asn1c/tests/data-62/data-62-03-B.ber new file mode 100644 index 000000000..35271bcbc --- /dev/null +++ b/asn1c/tests/data-62/data-62-03-B.ber @@ -0,0 +1 @@ +0 ¡test \ No newline at end of file diff --git a/asn1c/tests/data-62/data-62-03-B.xbr b/asn1c/tests/data-62/data-62-03-B.xbr new file mode 100644 index 000000000..50930a62a --- /dev/null +++ b/asn1c/tests/data-62/data-62-03-B.xbr @@ -0,0 +1,6 @@ + +

    &x05;

    + +

    test

    +
    +
    diff --git a/asn1c/tests/data-62/data-62-04-B.ber b/asn1c/tests/data-62/data-62-04-B.ber new file mode 100644 index 000000000..c65a578cb --- /dev/null +++ b/asn1c/tests/data-62/data-62-04-B.ber @@ -0,0 +1 @@ +0¡test \ No newline at end of file diff --git a/asn1c/tests/data-62/data-62-04-B.xbr b/asn1c/tests/data-62/data-62-04-B.xbr new file mode 100644 index 000000000..f5b78c30d --- /dev/null +++ b/asn1c/tests/data-62/data-62-04-B.xbr @@ -0,0 +1,6 @@ + +

    &x05;

    + +

    test

    +
    +
    diff --git a/asn1c/tests/data-62/data-62-05-B.ber b/asn1c/tests/data-62/data-62-05-B.ber new file mode 100644 index 000000000..ff65b2023 --- /dev/null +++ b/asn1c/tests/data-62/data-62-05-B.ber @@ -0,0 +1 @@ +0¡test \ No newline at end of file diff --git a/asn1c/tests/data-62/data-62-05-B.xbr b/asn1c/tests/data-62/data-62-05-B.xbr new file mode 100644 index 000000000..dd075fc96 --- /dev/null +++ b/asn1c/tests/data-62/data-62-05-B.xbr @@ -0,0 +1,6 @@ + +

    &x05;

    + +

    test

    +
    +
    diff --git a/asn1c/tests/data-62/data-62-06-B.ber b/asn1c/tests/data-62/data-62-06-B.ber new file mode 100644 index 000000000..530d54b2d --- /dev/null +++ b/asn1c/tests/data-62/data-62-06-B.ber @@ -0,0 +1 @@ +0¡test \ No newline at end of file diff --git a/asn1c/tests/data-62/data-62-06-B.xbr b/asn1c/tests/data-62/data-62-06-B.xbr new file mode 100644 index 000000000..e5bdfd8bf --- /dev/null +++ b/asn1c/tests/data-62/data-62-06-B.xbr @@ -0,0 +1,6 @@ + +

    &x05;

    + +

    test

    +
    +
    diff --git a/asn1c/tests/data-62/data-62-07-B.ber b/asn1c/tests/data-62/data-62-07-B.ber new file mode 100644 index 000000000..286ca58b7 --- /dev/null +++ b/asn1c/tests/data-62/data-62-07-B.ber @@ -0,0 +1 @@ +0 ¡test \ No newline at end of file diff --git a/asn1c/tests/data-62/data-62-07-B.xbr b/asn1c/tests/data-62/data-62-07-B.xbr new file mode 100644 index 000000000..968030920 --- /dev/null +++ b/asn1c/tests/data-62/data-62-07-B.xbr @@ -0,0 +1,6 @@ + +

    &x05;

    + +

    test

    +
    +
    diff --git a/asn1c/tests/data-62/data-62-08-L.ber b/asn1c/tests/data-62/data-62-08-L.ber new file mode 100644 index 0000000000000000000000000000000000000000..d127e0882d89aaac98aa70965cf46e286d7b763f GIT binary patch literal 15 WcmXruVq#=n$R^BEl3HBC$^ZZo-vY(} literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-62/data-62-08-L.xbr b/asn1c/tests/data-62/data-62-08-L.xbr new file mode 100644 index 000000000..8afad43a0 --- /dev/null +++ b/asn1c/tests/data-62/data-62-08-L.xbr @@ -0,0 +1,7 @@ + +

    &x05;

    + +

    test

    +
    +

    -- extra component +
    diff --git a/asn1c/tests/data-62/data-62-09-L.ber b/asn1c/tests/data-62/data-62-09-L.ber new file mode 100644 index 0000000000000000000000000000000000000000..b7856ca024e1c3f1b2048af260626b641234f5df GIT binary patch literal 18 ZcmXpIU}9ul$R^BEl3HBC%D~9@9{?Pi1I+*c literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-62/data-62-09-L.xbr b/asn1c/tests/data-62/data-62-09-L.xbr new file mode 100644 index 000000000..e24ba2cd8 --- /dev/null +++ b/asn1c/tests/data-62/data-62-09-L.xbr @@ -0,0 +1,8 @@ + +

    &x05;

    + +

    test

    +
    +

    -- extra component +

    &xff;

    -- another extra component +
    diff --git a/asn1c/tests/data-62/data-62-10.ber b/asn1c/tests/data-62/data-62-10.ber new file mode 100644 index 0000000000000000000000000000000000000000..0772c45986479f98ad39844e63a4998014840e04 GIT binary patch literal 9 QcmXqDU&vZt-N3*A01RCMSO5S3 literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-62/data-62-10.xbr b/asn1c/tests/data-62/data-62-10.xbr new file mode 100644 index 000000000..7dd86f020 --- /dev/null +++ b/asn1c/tests/data-62/data-62-10.xbr @@ -0,0 +1,6 @@ + + + + + + diff --git a/asn1c/tests/data-62/data-62-11.ber b/asn1c/tests/data-62/data-62-11.ber new file mode 100644 index 0000000000000000000000000000000000000000..8eeb0d883e62bed9aa49b5380c02b9dc8b1a9c4d GIT binary patch literal 12 QcmXruTF9}mfq?;p0TtK-CIA2c literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-62/data-62-11.xbr b/asn1c/tests/data-62/data-62-11.xbr new file mode 100644 index 000000000..1ce0695ac --- /dev/null +++ b/asn1c/tests/data-62/data-62-11.xbr @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/asn1c/tests/data-62/data-62-12-B.ber b/asn1c/tests/data-62/data-62-12-B.ber new file mode 100644 index 000000000..2ea1bdcc8 --- /dev/null +++ b/asn1c/tests/data-62/data-62-12-B.ber @@ -0,0 +1 @@ +0¡¡€ \ No newline at end of file diff --git a/asn1c/tests/data-62/data-62-12-B.xbr b/asn1c/tests/data-62/data-62-12-B.xbr new file mode 100644 index 000000000..b3a370c96 --- /dev/null +++ b/asn1c/tests/data-62/data-62-12-B.xbr @@ -0,0 +1,6 @@ + + + + -- Do not terminate: no end-of-content octets is intended + + diff --git a/asn1c/tests/data-62/data-62-13-B.ber b/asn1c/tests/data-62/data-62-13-B.ber new file mode 100644 index 0000000000000000000000000000000000000000..47dc2ac027d2b410ccf4c6eb1c67ef8d067f51ff GIT binary patch literal 10 RcmXruSjhIUfq~&s0{{_j1ET-{ literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-62/data-62-13-B.xbr b/asn1c/tests/data-62/data-62-13-B.xbr new file mode 100644 index 000000000..4ee300223 --- /dev/null +++ b/asn1c/tests/data-62/data-62-13-B.xbr @@ -0,0 +1,8 @@ + + + + + + -- Do not terminate: no end-of-content octets is intended. + + diff --git a/asn1c/tests/data-62/data-62-14.ber b/asn1c/tests/data-62/data-62-14.ber new file mode 100644 index 0000000000000000000000000000000000000000..c048f282f50d7255afa45e9b9767513f7eabe5bc GIT binary patch literal 16 WcmXruTgdaU;ZXwv!($+3U;qFzegzT$ literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-62/data-62-14.xbr b/asn1c/tests/data-62/data-62-14.xbr new file mode 100644 index 000000000..0c7da7c66 --- /dev/null +++ b/asn1c/tests/data-62/data-62-14.xbr @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/asn1c/tests/data-62/data-62-15-B.ber b/asn1c/tests/data-62/data-62-15-B.ber new file mode 100644 index 0000000000000000000000000000000000000000..f87367fd5203b151630ea52fbaa6a4fc89b11bab GIT binary patch literal 14 UcmXruS;+OU;ZXwv!($)@04OR24gdfE literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-62/data-62-15-B.xbr b/asn1c/tests/data-62/data-62-15-B.xbr new file mode 100644 index 000000000..c57f270c3 --- /dev/null +++ b/asn1c/tests/data-62/data-62-15-B.xbr @@ -0,0 +1,10 @@ + + + + + + + -- missing EOC + + + diff --git a/asn1c/tests/data-62/data-62-16.ber b/asn1c/tests/data-62/data-62-16.ber new file mode 100644 index 0000000000000000000000000000000000000000..799e1e7323f56a54a168bbdc3c4c83b357578b5a GIT binary patch literal 14 VcmXruS;+OUL71f^wYY?V0RSNz1Rwwa literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-62/data-62-16.xbr b/asn1c/tests/data-62/data-62-16.xbr new file mode 100644 index 000000000..600a6c11b --- /dev/null +++ b/asn1c/tests/data-62/data-62-16.xbr @@ -0,0 +1,7 @@ + + + +

    test

    +
    +
    +
    diff --git a/asn1c/tests/data-62/data-62-17-B.ber b/asn1c/tests/data-62/data-62-17-B.ber new file mode 100644 index 0000000000000000000000000000000000000000..5d98f99696749641627ee67e7a2b4aa562e48052 GIT binary patch literal 15 WcmXruS;+OUL7259wYbEHfdK#|*#uJn literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-62/data-62-17-B.xbr b/asn1c/tests/data-62/data-62-17-B.xbr new file mode 100644 index 000000000..4e49f2b14 --- /dev/null +++ b/asn1c/tests/data-62/data-62-17-B.xbr @@ -0,0 +1,7 @@ + + + +

    test2

    +
    +
    +
    diff --git a/asn1c/tests/data-62/data-62-18-B.ber b/asn1c/tests/data-62/data-62-18-B.ber new file mode 100644 index 0000000000000000000000000000000000000000..8200bcaf8ec907902dc026040a4f41308337f14c GIT binary patch literal 14 VcmXruTFCvdL71f^wYY?V0RSNk1RnqZ literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-62/data-62-18-B.xbr b/asn1c/tests/data-62/data-62-18-B.xbr new file mode 100644 index 000000000..217786607 --- /dev/null +++ b/asn1c/tests/data-62/data-62-18-B.xbr @@ -0,0 +1,7 @@ + + + +

    test

    +
    +
    +
    diff --git a/asn1c/tests/data-62/data-62-19-B.ber b/asn1c/tests/data-62/data-62-19-B.ber new file mode 100644 index 0000000000000000000000000000000000000000..1e2641b3ed3666bea14d132f6cc36d0d9d77c770 GIT binary patch literal 14 VcmXruS;+mcL71f^wYY?V0RSN;1R($b literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-62/data-62-19-B.xbr b/asn1c/tests/data-62/data-62-19-B.xbr new file mode 100644 index 000000000..5e424cc45 --- /dev/null +++ b/asn1c/tests/data-62/data-62-19-B.xbr @@ -0,0 +1,7 @@ + + + +

    test

    +
    +
    +
    diff --git a/asn1c/tests/data-62/data-62-20.ber b/asn1c/tests/data-62/data-62-20.ber new file mode 100644 index 0000000000000000000000000000000000000000..ea13838a4f51e6e4c1bd6c93e9fc046ffb00bf9b GIT binary patch literal 11 ScmXruT*&^gVShCP0|NjTBm;c_ literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-62/data-62-20.xbr b/asn1c/tests/data-62/data-62-20.xbr new file mode 100644 index 000000000..178fa6609 --- /dev/null +++ b/asn1c/tests/data-62/data-62-20.xbr @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/asn1c/tests/data-62/data-62-21-B.ber b/asn1c/tests/data-62/data-62-21-B.ber new file mode 100644 index 0000000000000000000000000000000000000000..d109b4f23e9f0bff1d2a7e4132f0672a6ab32b57 GIT binary patch literal 15 WcmXruT*&^gVShElb_P}k1_l5rb_6*9 literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-62/data-62-21-B.xbr b/asn1c/tests/data-62/data-62-21-B.xbr new file mode 100644 index 000000000..7aeac97d7 --- /dev/null +++ b/asn1c/tests/data-62/data-62-21-B.xbr @@ -0,0 +1,11 @@ + + + + + +

    +
    +
    +
    +
    +
    diff --git a/asn1c/tests/data-62/data-62-22.ber b/asn1c/tests/data-62/data-62-22.ber new file mode 100644 index 0000000000000000000000000000000000000000..93111e9f4528787ae78c17a8948f418bb760eda3 GIT binary patch literal 15 WcmXruTFCvdVShEtb|zK^1_l5r+5|)Z literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-62/data-62-22.xbr b/asn1c/tests/data-62/data-62-22.xbr new file mode 100644 index 000000000..ca220a739 --- /dev/null +++ b/asn1c/tests/data-62/data-62-22.xbr @@ -0,0 +1,11 @@ + + + + + +

    +
    +
    +
    +
    +
    diff --git a/asn1c/tests/data-62/data-62-23-B.ber b/asn1c/tests/data-62/data-62-23-B.ber new file mode 100644 index 0000000000000000000000000000000000000000..a1f5af9b8bed55a1ec496e1662b807fd6ff39902 GIT binary patch literal 15 WcmXruTFCvdVShF2b|zK^1_l5r;RHnh literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-62/data-62-23-B.xbr b/asn1c/tests/data-62/data-62-23-B.xbr new file mode 100644 index 000000000..7a2777ed2 --- /dev/null +++ b/asn1c/tests/data-62/data-62-23-B.xbr @@ -0,0 +1,11 @@ + + + + + +

    +
    +
    +
    +
    +
    diff --git a/asn1c/tests/data-62/data-62-24-L.ber b/asn1c/tests/data-62/data-62-24-L.ber new file mode 100644 index 0000000000000000000000000000000000000000..d88d78b4a21b31086cf36ed94671935d11f5a925 GIT binary patch literal 20 YcmXqLSjhLVVShF2c4lG5Dh4nB08AAHNB{r; literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-62/data-62-24-L.xbr b/asn1c/tests/data-62/data-62-24-L.xbr new file mode 100644 index 000000000..9974a67ee --- /dev/null +++ b/asn1c/tests/data-62/data-62-24-L.xbr @@ -0,0 +1,12 @@ + + + + + +

    z

    +
    +
    +
    +

    +
    +
    diff --git a/asn1c/tests/data-62/data-62-25.ber b/asn1c/tests/data-62/data-62-25.ber new file mode 100644 index 0000000000000000000000000000000000000000..931978ba483cd274faa4f997a6fafbbbf14d5d62 GIT binary patch literal 16 XcmXruTgdaUVShF2c4lG5Dh37sFf9bs literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-62/data-62-25.xbr b/asn1c/tests/data-62/data-62-25.xbr new file mode 100644 index 000000000..d62e45677 --- /dev/null +++ b/asn1c/tests/data-62/data-62-25.xbr @@ -0,0 +1,11 @@ + + + + + +

    z

    +
    +
    +
    +
    +
    diff --git a/asn1c/tests/data-62/data-62-26-B.ber b/asn1c/tests/data-62/data-62-26-B.ber new file mode 100644 index 0000000000000000000000000000000000000000..ef7d10632c6296380d40e17c6e18855685d04270 GIT binary patch literal 18 YcmXqLSjhLVVShF2c4lG5Dh40`06~QXNB{r; literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-62/data-62-26-B.xbr b/asn1c/tests/data-62/data-62-26-B.xbr new file mode 100644 index 000000000..13c0aa29a --- /dev/null +++ b/asn1c/tests/data-62/data-62-26-B.xbr @@ -0,0 +1,11 @@ + + + + + +

    z

    +
    +
    +
    +
    +
    diff --git a/asn1c/tests/data-62/data-62-27.ber b/asn1c/tests/data-62/data-62-27.ber new file mode 100644 index 0000000000000000000000000000000000000000..7cb619dcd6355c15108a6558777e518d7f852896 GIT binary patch literal 4 LcmXqDTF3wZ0t^7u literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-62/data-62-27.xbr b/asn1c/tests/data-62/data-62-27.xbr new file mode 100644 index 000000000..2fb64227d --- /dev/null +++ b/asn1c/tests/data-62/data-62-27.xbr @@ -0,0 +1,4 @@ + + + + From 0a1738cbf5bbc16320c19ffc497d4584ba06c54c Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 27 Sep 2004 20:52:18 +0000 Subject: [PATCH 0420/1469] pretty-printing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@420 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/REAL.c | 99 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 79 insertions(+), 20 deletions(-) diff --git a/skeletons/REAL.c b/skeletons/REAL.c index 010097b93..927a94b36 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -47,17 +47,34 @@ asn1_TYPE_descriptor_t asn1_DEF_REAL = { ssize_t REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) { - char local_buf[32]; + char local_buf[64]; char *buf = local_buf; ssize_t buflen = sizeof(local_buf); - const char *fmt = canonical?"%15E":"f"; + const char *fmt = canonical?"%.15E":"%.15f"; ssize_t ret; + int expval; /* * Check whether it is a special value. */ - if(finite(d) == 0) { - if(isinf(d)) { + /* + * ilogb(+-0) returns -INT_MAX or INT_MIN (platform-dependent) + * ilogb(+-inf) returns INT_MAX + */ + expval = ilogb(d); + if(expval <= -INT_MAX /* Also catches (d == 0) */ + || expval == INT_MAX /* catches finite() which catches isnan() */ + ) { + /* fpclassify(3) is not portable yet */ + if(expval <= -INT_MAX) { + if(copysign(1.0, d) < 0.0) { + buf = "-0"; + buflen = 2; + } else { + buf = "0"; + buflen = 1; + } + } else if(isinf(d)) { if(copysign(1.0, d) < 0.0) { buf = ""; buflen = 17; @@ -90,43 +107,85 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) if(!buf) return -1; } while(1); - /* - * Transform the "[-]d.dddE+-dd" output into "[-]d.dddE[-]d" - */ if(canonical) { + /* + * Transform the "[-]d.dddE+-dd" output into "[-]d.dddE[-]d" + */ char *dot, *E; char *end = buf + buflen; + char *last_zero; dot = (buf[0] == '-') ? (buf + 2) : (buf + 1); if(*dot >= 0x30) { errno = EINVAL; return -1; /* Not a dot, really */ } - *dot = '.'; /* Replace possible comma */ - - for(E = dot; dot < end; E++) { - if(*E == 'E') { - char *s = ++E; - if(*E == '+') { - /* Skip the "+" too */ - buflen -= 2; - } else { + *dot = 0x2e; /* Replace possible comma */ + + for(last_zero = dot + 2, E = dot; dot < end; E++) { + if(*E == 0x45) { + char *expptr = ++E; + char *s = expptr; + int sign; + if(*expptr == '+') { + /* Skip the "+" */ buflen -= 1; + sign = 0; + } else { + sign = 1; s++; } - E += 2; - if(E[-1] != '0' || E > end) { + expptr++; + if(expptr > end) { errno = EINVAL; return -1; } - for(; E <= end; s++, E++) - *s = *E; + if(*expptr == 0x30) { + buflen--; + expptr++; + } + if(*last_zero == 0x30) { + *last_zero = 0x45; /* E */ + s = last_zero + 1; + if(sign) *s++ = '-'; + } + for(; expptr <= end; s++, expptr++) + *s = *expptr; + break; + } else if(*E == 0x30) { + if(*last_zero != 0x30) + last_zero = E; } } if(E == end) { errno = EINVAL; return -1; /* No promised E */ } + } else { + /* + * Remove trailing zeros. + */ + char *end = buf + buflen; + char *last_zero = end; + char *z; + for(z = end - 1; z > buf; z--) { + switch(*z) { + case 0x030: + last_zero = z; + case 0x31: case 0x32: case 0x33: case 0x34: + case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: + continue; + default: /* Catch dot and other separators */ + *z = 0x2e; /* Replace possible comma */ + if(last_zero == z + 1) { /* leave x.0 */ + last_zero++; + } + buflen = last_zero - buf; + *last_zero = '\0'; + break; + } + break; + } } ret = cb(buf, buflen, app_key); From 09a4aa5306469c4b498b3f749f8a7567d959e3b2 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 27 Sep 2004 20:52:36 +0000 Subject: [PATCH 0421/1469] pretty-printing check cases git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@421 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/check-REAL.c | 128 ++++++++++++++++++++++++----------- 1 file changed, 89 insertions(+), 39 deletions(-) diff --git a/skeletons/tests/check-REAL.c b/skeletons/tests/check-REAL.c index 0d6d0736a..198113cee 100644 --- a/skeletons/tests/check-REAL.c +++ b/skeletons/tests/check-REAL.c @@ -7,8 +7,53 @@ #include #include +static char reconstructed[2][512]; +static int reconstr_lens[2]; + +static int +callback(const void *buffer, size_t size, void *app_key) { + char *buf = reconstructed[app_key ? 1 : 0]; + int *len = &reconstr_lens[app_key ? 1 : 0]; + + if(*len + size >= sizeof(reconstructed[0])) + return -1; + + memcpy(buf + *len, buffer, size); + *len += size; + + return 0; +} + +static void +check_str_repr(double d, const char *sample, const char *canonical_sample) { + ssize_t s1, s2; + + reconstr_lens[1] = reconstr_lens[0] = 0; + + s1 = REAL__dump(d, 0, callback, 0); + assert(s1 < sizeof(reconstructed[0])); + assert(s1 == reconstr_lens[0]); + reconstructed[0][s1] = '\0'; + + s2 = REAL__dump(d, 1, callback, (void *)1); + assert(s2 < sizeof(reconstructed[1])); + assert(s2 == reconstr_lens[1]); + reconstructed[1][s2] = '\0'; + + if(sample) { + printf("Checking [%s] against [%s]\n", + reconstructed[0], sample); + assert(!strcmp(reconstructed[0], sample)); + } + if(canonical_sample) { + printf("Checking [%s] against [%s] (canonical)\n", + reconstructed[1], canonical_sample); + assert(!strcmp(reconstructed[1], canonical_sample)); + } +} + static void -check(REAL_t *rn, double orig_dbl) { +check(REAL_t *rn, double orig_dbl, const char *sample, const char *canonical_sample) { double val; uint8_t *p, *end; int ret; @@ -44,17 +89,19 @@ check(REAL_t *rn, double orig_dbl) { assert(orig_dbl == val); printf("OK\n"); + + check_str_repr(val, sample, canonical_sample); } uint8_t buf_1_0[] = { 0x80, 0xcc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; uint8_t buf_1_1[] = { 0x80, 0xcc, 0x11, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9a }; uint8_t buf_3_14[] = { 0x80, 0xcd, 0x19, 0x1e, 0xb8, 0x51, 0xeb, 0x85, 0x1f }; /* These ones are very interesting! It checks mantissa overflow! */ -uint8_t buf_mo1[] = { 0x80, 0xc5, 0x19, 0x1e, 0xb8, 0x51, 0xeb, 0x85, 0x1f,3}; +uint8_t buf_mo1[] = { 0xC0, 0xc5, 0x19, 0x1e, 0xb8, 0x51, 0xeb, 0x85, 0x1f,3}; uint8_t buf_mo2[] = { 0x80, 0xbd, 0x19, 0x1e, 0xb8, 0x51, 0xeb, 0x85, 0x1f,3,2}; static void -check_buf(uint8_t *buf, size_t bufsize, double verify) { +check_buf(uint8_t *buf, size_t bufsize, double verify, const char *sample, const char *canonical_sample) { REAL_t rn; double val; uint8_t *p, *end; @@ -90,6 +137,8 @@ check_buf(uint8_t *buf, size_t bufsize, double verify) { printf("%.12f vs %.12f\n", verify, val); assert(val == verify); + + check_str_repr(val, sample, canonical_sample); } int @@ -98,42 +147,43 @@ main() { memset(&rn, 0, sizeof(rn)); - check(&rn, 0.0); - check(&rn, 1.0); - check(&rn, -1.0); - check(&rn, 1.5); - check(&rn, 0.1); - check(&rn, 0.33333); - check(&rn, 2); - check(&rn, 2.1); - check(&rn, 3); - check(&rn, 3.1); - check(&rn, 3.14); - check(&rn, 3.1415); - check(&rn, 3.141592); - check(&rn, 3.14159265); - check(&rn, -3.14159265); - check(&rn, 14159265.0); - check(&rn, -123456789123456789.0); - check(&rn, 0.00000000001); - check(&rn, 0.00000000002); - check(&rn, 0.00000000009); - check(&rn, 0.0000000000000000000001); - check(&rn, 0.000000000000000000000000000001); /* proved 2B a problem */ - check(&rn,-0.000000000000000000000000000001); /* proved 2B a problem */ - check(&rn, 0.0000000000010000000001000000000001); - check(&rn, 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001); - check(&rn, 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001); - check(&rn,-0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001); - check(&rn,-3.33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333); - check(&rn, 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333); - check(&rn, -0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001); - - check_buf(buf_1_0, sizeof(buf_1_0), 1.0); - check_buf(buf_1_1, sizeof(buf_1_1), 1.1); - check_buf(buf_3_14, sizeof(buf_3_14), 3.14); - check_buf(buf_mo1, sizeof(buf_mo1), 3.14); - check_buf(buf_mo2, sizeof(buf_mo2), 3.14); + check(&rn, 0.0, "0", "0"); + check(&rn, -0.0, "-0", "-0"); /* minus-zero */ + check(&rn, 1.0, "1.0", "1.0E0"); + check(&rn, -1.0, "-1.0", "-1.0E0"); + check(&rn, 1.5, "1.5", "1.5E0"); + check(&rn, 0.1, "0.1", "1.0E-1"); + check(&rn, 0.33333, "0.33333", "3.3333E-1"); + check(&rn, 2, "2.0", "2.0E0"); + check(&rn, 2.1, "2.1", "2.1E0"); + check(&rn, 3, "3.0", "3.0E0"); + check(&rn, 3.1, "3.1", "3.1E0"); + check(&rn, 3.14, "3.14", "3.14E0"); + check(&rn, 3.1415, "3.1415", "3.1415E0"); + check(&rn, 3.141592, "3.141592", "3.141592E0"); + check(&rn, 3.14159265, "3.14159265", "3.14159265E0"); + check(&rn, -3.14159265, "-3.14159265", "-3.14159265E0"); + check(&rn, 14159265.0, "14159265.0", "1.4159265E7"); + check(&rn, -123456789123456789.0, "-123456789123456784.0", "-1.234567891234568E17"); + check(&rn, 0.00000000001, "0.0", "9.999999999999999E-12"); + check(&rn, 0.00000000002, "0.0", "2.0E-11"); + check(&rn, 0.00000000009, "0.0", "9.0E-11"); + check(&rn, 0.0000000000000000000001, "0.0", "1.0E-22"); + check(&rn, 0.000000000000000000000000000001, "0.0", "1.0E-30"); /* proved 2B a problem */ + check(&rn,-0.000000000000000000000000000001, "-0.0", "-1.0E-30"); /* proved 2B a problem */ + check(&rn, 0.0000000000010000000001000000000001, 0, 0); + check(&rn, 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001, 0, 0); + check(&rn, 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001, 0, 0); + check(&rn,-0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001, 0, 0); + check(&rn,-3.33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333, 0, 0); + check(&rn, 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333, 0, 0); + check(&rn, -0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001, 0, 0); + + check_buf(buf_1_0, sizeof(buf_1_0), 1.0, "1.0", "1.0E0"); + check_buf(buf_1_1, sizeof(buf_1_1), 1.1, "1.1", "1.1E0"); + check_buf(buf_3_14, sizeof(buf_3_14), 3.14, "3.14", "3.14E0"); + check_buf(buf_mo1, sizeof(buf_mo1), -3.14, "-3.14", "-3.14E0"); + check_buf(buf_mo2, sizeof(buf_mo2), 3.14, "3.14", "3.14E0"); return 0; } From db6b290b4447e80fa11b70dd0d2febe9619f28ca Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 27 Sep 2004 20:54:06 +0000 Subject: [PATCH 0422/1469] better handling of encoded subTLVs git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@422 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OCTET_STRING.c | 162 +++++++++++++++++++++------------------ 1 file changed, 87 insertions(+), 75 deletions(-) diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 6a72d1a19..984b7f574 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -93,10 +93,11 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { */ struct _stack_el { ber_tlv_len_t left; /* What's left to read (or -1) */ - ber_tlv_len_t frame; /* What was planned to read (or -1) */ + ber_tlv_len_t got; /* What was actually processed */ int cont_level; /* Depth of subcontainment */ int want_nulls; /* Want null "end of content" octets? */ int bits_chopped; /* Flag in BIT STRING mode */ + ber_tlv_tag_t tag; /* For debugging purposes */ struct _stack_el *prev; struct _stack_el *next; }; @@ -115,7 +116,8 @@ OS__add_stack_el(struct _stack *st) { if(st->cur_ptr && st->cur_ptr->next) { nel = st->cur_ptr->next; nel->bits_chopped = 0; - /* Retain nel->cont_level, it's correct. */ + nel->got = 0; + /* Retain the nel->cont_level, it's correct. */ } else { (void *)nel = CALLOC(1, sizeof(struct _stack_el)); if(nel == NULL) @@ -156,7 +158,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *ctx; ssize_t consumed_myself = 0; struct _stack *stck; /* A stack structure */ - struct _stack_el *sel; /* Stack element */ + struct _stack_el *sel = 0; /* Stack element */ int tlv_constr; enum type_type_e { _TT_GENERIC = 0, /* Just a random OCTET STRING */ @@ -231,16 +233,40 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, ber_tlv_tag_t tlv_tag; ber_tlv_len_t tlv_len; ber_tlv_tag_t expected_tag; - ssize_t tl, ll; + ssize_t tl, ll, tlvl; /* This one works even if (sel->left == -1) */ ssize_t Left = ((!sel||(size_t)sel->left >= size) - ?size:(size_t)sel->left); + ?(ssize_t)size:sel->left); - ASN_DEBUG("fetch tag(size=%d,L=%d), %sstack, left=%d, want0=%d", - (int)size, Left, sel?"":"!", - sel?sel->left:0, sel?sel->want_nulls:0); + ASN_DEBUG("%p, s->l=%d, s->wn=%d, s->g=%d\n", sel, + sel?sel->left:0, + sel?sel->want_nulls:0, + sel?sel->got:0 + ); + if(sel && sel->left <= 0 && sel->want_nulls == 0) { + if(sel->prev) { + struct _stack_el *prev = sel->prev; + if(prev->left != -1) { + if(prev->left < sel->got) + RETURN(RC_FAIL); + prev->left -= sel->got; + } + prev->got += sel->got; + sel = stck->cur_ptr = prev; + if(!sel) break; + tlv_constr = 1; + continue; + } else { + sel = stck->cur_ptr = 0; + break; /* Nothing to wait */ + } + } + tl = ber_fetch_tag(buf_ptr, Left, &tlv_tag); + ASN_DEBUG("fetch tag(size=%d,L=%d), %sstack, left=%d, wn=%d, tl=%d", + (int)size, Left, sel?"":"!", + sel?sel->left:0, sel?sel->want_nulls:0, tl); switch(tl) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); @@ -250,11 +276,9 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, ll = ber_fetch_length(tlv_constr, (char *)buf_ptr + tl, Left - tl, &tlv_len); - ASN_DEBUG("Got tag=%s, tc=%d, size=%d, tl=%d, len=%d, ll=%d, {%d, %d}", + ASN_DEBUG("Got tag=%s, tc=%d, left=%ld, tl=%d, len=%d, ll=%d", ber_tlv_tag_string(tlv_tag), tlv_constr, - (int)Left, tl, tlv_len, ll, - ((uint8_t *)buf_ptr)[0], - ((uint8_t *)buf_ptr)[1]); + (long)Left, tl, tlv_len, ll); switch(ll) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); @@ -264,26 +288,21 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, && ((uint8_t *)buf_ptr)[0] == 0 && ((uint8_t *)buf_ptr)[1] == 0) { - ADVANCE(2); - if(type_type == _TT_ANY) APPEND("\0\0", 2); ASN_DEBUG("Eat EOC; wn=%d--", sel->want_nulls); + if(type_type == _TT_ANY) APPEND("\0\0", 2); + + ADVANCE(2); + sel->got += 2; + if(sel->left != -1) { + sel->left -= 2; /* assert(sel->left >= 2) */ + } + sel->want_nulls--; if(sel->want_nulls == 0) { /* Move to the next expectation */ - sel = stck->cur_ptr = sel->prev; - if(sel == NULL) - break; - } - - if(sel->want_nulls) { - /* - * Simulate while(TRUE) for this loop. - * This is necessary to fetch the next - * expectation after current "end of content", - * for which tlv_constr is 0. - */ + sel->left = 0; tlv_constr = 1; } @@ -330,34 +349,35 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, RETURN(RC_FAIL); } - /* - * Consult with the old expectation. - * Check that it knows what we are doing here, and how much. - */ - if(sel && sel->left != -1) { - if(sel->left < (tl + ll)) - RETURN(RC_FAIL); - sel->left -= (tl + ll); - if(sel->left < tlv_len) - RETURN(RC_FAIL); - } - - /* * Append a new expectation. */ sel = OS__add_stack_el(stck); - if(sel) { - sel->want_nulls = (tlv_len==-1); - sel->frame = sel->left = tlv_len; - ASN_DEBUG("+EXPECT2 frame=%d wn=%d, clvl=%d", - sel->frame, sel->want_nulls, sel->cont_level); + if(!sel) RETURN(RC_FAIL); + + tlvl = tl + ll; /* Combined length of T and L encoding */ + + sel->tag = tlv_tag; + + sel->want_nulls = (tlv_len==-1); + if(sel->prev && sel->prev->left != -1) { + /* Check that the parent frame is big enough */ + if(sel->prev->left < tlvl + (tlv_len==-1?0:tlv_len)) + RETURN(RC_FAIL); + if(tlv_len == -1) + sel->left = sel->prev->left - tlvl; + else + sel->left = tlv_len; } else { - RETURN(RC_FAIL); + sel->left = tlv_len; } + if(type_type == _TT_ANY) APPEND(buf_ptr, tlvl); + sel->got += tlvl; + ADVANCE(tlvl); + + ASN_DEBUG("+EXPECT2 got=%d left=%d, wn=%d, clvl=%d", + sel->got, sel->left, sel->want_nulls, sel->cont_level); - if(type_type == _TT_ANY) APPEND(buf_ptr, tl + ll); - ADVANCE(tl+ll); } while(tlv_constr); if(sel == NULL) { /* Finished operation, "phase out" */ @@ -371,8 +391,9 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, case 2: (void *)stck = ctx->ptr; sel = stck->cur_ptr; - ASN_DEBUG("Phase 2: Need %ld bytes, size=%ld", - (long)sel->left, (long)size); + ASN_DEBUG("Phase 2: Need %ld bytes, size=%ld, alrg=%ld, wn=%d", + (long)sel->left, (long)size, (long)sel->got, + sel->want_nulls); { ber_tlv_len_t len; @@ -397,33 +418,17 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, } ADVANCE(len); sel->left -= len; + sel->got += len; } - if(sel->left) + if(sel->left) { + ASN_DEBUG("OS left %ld, size = %ld, wn=%d\n", + (long)sel->left, (long)size, sel->want_nulls); RETURN(RC_WMORE); - - while(sel->left == 0) { - ASN_DEBUG("sel %p, l=%d, f=%d, %p->l=%d p->f=%d\n", - sel, sel->left, sel->frame, - sel->prev, - sel->prev?sel->prev->left:0, - sel->prev?sel->prev->frame:0 - ); - if(sel->prev) { - if(sel->prev->left != -1) { - if(sel->prev->left < sel->frame) - RETURN(RC_FAIL); - sel->prev->left -= sel->frame; - } - sel = stck->cur_ptr = sel->prev; - if(sel->left) { - PREV_PHASE(ctx); - goto phase1; - } - } else { - break; - } } + + PREV_PHASE(ctx); + goto phase1; } break; case 3: @@ -446,6 +451,15 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, break; } + if(sel) { + ASN_DEBUG("3sel p=%p, wn=%d, l=%ld, g=%ld, size=%ld", + sel->prev, sel->want_nulls, + (long)sel->left, (long)sel->got, (long)size); + if(sel->prev || sel->want_nulls > 1 || sel->left > 0) { + RETURN(RC_WMORE); + } + } + /* * BIT STRING-specific processing. */ @@ -458,10 +472,8 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, consumed_myself, td->name, (type_type == _TT_GENERIC) ? (char *)st->buf : "", st->size); - rval.code = RC_OK; - rval.consumed = consumed_myself; - return rval; + RETURN(RC_OK); } /* From c15f56362af85c8e54adddb78b5a06e360ead19f Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 27 Sep 2004 20:54:27 +0000 Subject: [PATCH 0423/1469] more manuals are there git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@423 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c.spec.in | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/asn1c.spec.in b/asn1c.spec.in index f4e0132fe..7c8355566 100644 --- a/asn1c.spec.in +++ b/asn1c.spec.in @@ -41,10 +41,13 @@ rm -rf $RPM_BUILD_ROOT %doc doc/asn1c-usage.pdf doc/asn1c-usage.html %attr(755,root,root) %{_bindir} %attr(644,root,root) %{_datadir}/asn1c -%{_mandir}/man1/asn1c.1* +%{_mandir}/man1 %changelog * Tue Sep 18 2004 Lev Walkin - First version of asn1c.spec +* Sun Sep 26 2004 Lev Walkin +- All manuals are now getting installed, including new onws: unber.1 and enber.1 + From fd2ee9e259afb4a4193431c112ff5bdc8b9a2758 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 27 Sep 2004 20:54:44 +0000 Subject: [PATCH 0424/1469] reverted to strdup() back git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@424 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/Makefile.in | 2 +- libasn1parser/asn1parser.c | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index 1f29cf7d2..cb9ebd03f 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -447,8 +447,8 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." - -rm -f asn1p_y.c -rm -f asn1p_l.c + -rm -f asn1p_y.c -rm -f asn1p_y.h clean: clean-am diff --git a/libasn1parser/asn1parser.c b/libasn1parser/asn1parser.c index 05330d6d5..6a3477d10 100644 --- a/libasn1parser/asn1parser.c +++ b/libasn1parser/asn1parser.c @@ -1,5 +1,5 @@ #include -#include +#include #include #include #include @@ -181,12 +181,10 @@ _asn1p_fix_modules(asn1p_t *a, const char *fname) { asn1p_module_t *mod; TQ_FOR(mod, &(a->modules), mod_next) { asn1p_expr_t *expr; - int flen = strlen(fname) + 1; - mod->source_file_name = malloc(flen); + mod->source_file_name = strdup(fname); if(mod->source_file_name == NULL) return -1; - memcpy(mod->source_file_name, fname, flen); TQ_FOR(expr, &(mod->members), next) { _asn1p_apply_module2expr(expr, mod); From c8ee3054b12abee5b7138275f6c4acb60b5ed815 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 27 Sep 2004 20:56:03 +0000 Subject: [PATCH 0425/1469] fixed REAL pretty-printing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@425 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index c9fe81125..e13b149d1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9.6: 2004-Sep-26 +0.9.6: 2004-Sep-27 * Implemented BASIC-XER encoding support (X.693). * Implemented unber(1) and enber(1) for BER<->XML translation. @@ -14,6 +14,7 @@ types (BOOLEAN, INTEGER, and REAL). The problem occured when the encoding of such type is split between several bytes. (Severity: high, Security impact: low) + * Fixed pretty-printing of the REAL type. Added lots of test cases. * Updated documentation. 0.9.5: 2004-Sep-17 From 8f6ded061105170befae36c1ed23a3d01eaad272 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 27 Sep 2004 21:36:59 +0000 Subject: [PATCH 0426/1469] nan handling git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@426 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/REAL.c | 39 ++++++++++++++++++------------------ skeletons/tests/check-REAL.c | 7 ++++--- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/skeletons/REAL.c b/skeletons/REAL.c index 927a94b36..2373dde9b 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -17,8 +17,8 @@ #endif #ifndef NAN -static const double nan0; -#define NAN (nan0/nan0) +static const double real_nan0; +#define NAN (real_nan0/real_nan0) #endif /* @@ -60,13 +60,17 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) /* * ilogb(+-0) returns -INT_MAX or INT_MIN (platform-dependent) * ilogb(+-inf) returns INT_MAX + * ilogb(NaN) returns INT_MIN or INT_MAX (platform-dependent) */ expval = ilogb(d); - if(expval <= -INT_MAX /* Also catches (d == 0) */ - || expval == INT_MAX /* catches finite() which catches isnan() */ + if(expval <= -INT_MAX /* Also catches +-0 and maybe isnan() */ + || expval == INT_MAX /* catches isfin() and maybe isnan() */ ) { /* fpclassify(3) is not portable yet */ - if(expval <= -INT_MAX) { + if(isnan(d)) { + buf = ""; + buflen = 15; + } else if(expval <= -INT_MAX) { if(copysign(1.0, d) < 0.0) { buf = "-0"; buflen = 2; @@ -74,7 +78,7 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) buf = "0"; buflen = 1; } - } else if(isinf(d)) { + } else { /* isinf() */ if(copysign(1.0, d) < 0.0) { buf = ""; buflen = 17; @@ -82,9 +86,6 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) buf = ""; buflen = 16; } - } else { - buf = ""; - buflen = 15; } return (cb(buf, buflen, app_key) < 0) ? -1 : buflen; } @@ -271,7 +272,7 @@ asn1_REAL2double(const REAL_t *st, double *dbl_value) { *dbl_value = NAN; return 0; case 0x43: /* 01000011: minus zero */ - *dbl_value = NAN; + *dbl_value = -0.0; return 0; } @@ -412,11 +413,11 @@ asn1_double2REAL(REAL_t *st, double dbl_value) { /* * ilogb(+-0) returns -INT_MAX or INT_MIN (platform-dependent) * ilogb(+-inf) returns INT_MAX + * ilogb(NaN) returns INT_MIN or INT_MAX (platform-dependent) */ expval = ilogb(dbl_value); - - if(expval <= -INT_MAX /* Also catches (dbl_value == 0) */ - || expval == INT_MAX /* catches finite() which catches isnan() */ + if(expval <= -INT_MAX /* Also catches +-0 and maybe isnan() */ + || expval == INT_MAX /* catches isfin() and maybe isnan() */ ) { if(!st->buf || st->size < 2) { ptr = (uint8_t *)MALLOC(2); @@ -424,7 +425,11 @@ asn1_double2REAL(REAL_t *st, double dbl_value) { st->buf = ptr; } /* fpclassify(3) is not portable yet */ - if(expval <= -INT_MAX) { + if(isnan(dbl_value)) { + st->buf[0] = 0x42; /* NaN */ + st->buf[1] = 0; + st->size = 1; + } else if(expval <= -INT_MAX) { if(copysign(1.0, dbl_value) < 0.0) { st->buf[0] = 0x80 | 0x40; st->buf[1] = 0; @@ -433,7 +438,7 @@ asn1_double2REAL(REAL_t *st, double dbl_value) { st->buf[0] = 0; /* JIC */ st->size = 0; } - } else if(isinf(dbl_value)) { + } else { /* isinf() */ if(copysign(1.0, dbl_value) < 0.0) { st->buf[0] = 0x41; /* MINUS-INFINITY */ } else { @@ -441,10 +446,6 @@ asn1_double2REAL(REAL_t *st, double dbl_value) { } st->buf[1] = 0; st->size = 1; - } else { - st->buf[0] = 0x42; /* NaN */ - st->buf[1] = 0; - st->size = 1; } return 0; } diff --git a/skeletons/tests/check-REAL.c b/skeletons/tests/check-REAL.c index 198113cee..e61a54a05 100644 --- a/skeletons/tests/check-REAL.c +++ b/skeletons/tests/check-REAL.c @@ -75,7 +75,7 @@ check(REAL_t *rn, double orig_dbl, const char *sample, const char *canonical_sam printf("converted into ["); for(p = rn->buf, end = p + rn->size; p < end; p++) printf("%02x", *p); - printf("]\n"); + printf("]: %d\n", rn->size); ret = asn1_REAL2double(rn, &val); assert(ret == 0); @@ -86,8 +86,7 @@ check(REAL_t *rn, double orig_dbl, const char *sample, const char *canonical_sam printf("] (ilogb %d)\n", ilogb(val)); printf("%.12f vs %.12f\n", orig_dbl, val); - - assert(orig_dbl == val); + assert(orig_dbl == val || (isnan(orig_dbl) && isnan(val))); printf("OK\n"); check_str_repr(val, sample, canonical_sample); @@ -144,9 +143,11 @@ check_buf(uint8_t *buf, size_t bufsize, double verify, const char *sample, const int main() { REAL_t rn; + static const double c_NaN = 0.0; memset(&rn, 0, sizeof(rn)); + check(&rn, c_NaN/c_NaN, "", ""); check(&rn, 0.0, "0", "0"); check(&rn, -0.0, "-0", "-0"); /* minus-zero */ check(&rn, 1.0, "1.0", "1.0E0"); From b1f8d6102154ef8b5af5b555ff7bd359a379ca8a Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 27 Sep 2004 22:16:18 +0000 Subject: [PATCH 0427/1469] infinity handling git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@427 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/REAL.c | 82 +++++++++++++++--------------------- skeletons/tests/check-REAL.c | 6 ++- 2 files changed, 39 insertions(+), 49 deletions(-) diff --git a/skeletons/REAL.c b/skeletons/REAL.c index 2373dde9b..6ce124ee8 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -12,13 +12,9 @@ #undef INT_MAX #define INT_MAX ((int)(((unsigned int)-1) >> 1)) -#ifndef INFINITY -#define INFINITY HUGE_VAL -#endif - #ifndef NAN -static const double real_nan0; -#define NAN (real_nan0/real_nan0) +static const double real_zero; +#define NAN (real_zero/real_zero) #endif /* @@ -52,40 +48,31 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) ssize_t buflen = sizeof(local_buf); const char *fmt = canonical?"%.15E":"%.15f"; ssize_t ret; - int expval; /* * Check whether it is a special value. */ - /* - * ilogb(+-0) returns -INT_MAX or INT_MIN (platform-dependent) - * ilogb(+-inf) returns INT_MAX - * ilogb(NaN) returns INT_MIN or INT_MAX (platform-dependent) - */ - expval = ilogb(d); - if(expval <= -INT_MAX /* Also catches +-0 and maybe isnan() */ - || expval == INT_MAX /* catches isfin() and maybe isnan() */ - ) { - /* fpclassify(3) is not portable yet */ - if(isnan(d)) { - buf = ""; - buflen = 15; - } else if(expval <= -INT_MAX) { - if(copysign(1.0, d) < 0.0) { - buf = "-0"; - buflen = 2; - } else { - buf = "0"; - buflen = 1; - } - } else { /* isinf() */ - if(copysign(1.0, d) < 0.0) { - buf = ""; - buflen = 17; - } else { - buf = ""; - buflen = 16; - } + /* fpclassify(3) is not portable yet */ + if(isnan(d)) { + buf = ""; + buflen = 15; + return (cb(buf, buflen, app_key) < 0) ? -1 : buflen; + } else if(isinf(d)) { + if(copysign(1.0, d) < 0.0) { + buf = ""; + buflen = 17; + } else { + buf = ""; + buflen = 16; + } + return (cb(buf, buflen, app_key) < 0) ? -1 : buflen; + } else if(ilogb(d) <= -INT_MAX) { + if(copysign(1.0, d) < 0.0) { + buf = "-0"; + buflen = 2; + } else { + buf = "0"; + buflen = 1; } return (cb(buf, buflen, app_key) < 0) ? -1 : buflen; } @@ -259,10 +246,10 @@ asn1_REAL2double(const REAL_t *st, double *dbl_value) { switch(st->buf[0]) { case 0x40: /* 01000000: PLUS-INFINITY */ - *dbl_value = INFINITY; + *dbl_value = 1.0/real_zero; return 0; case 0x41: /* 01000001: MINUS-INFINITY */ - *dbl_value = -INFINITY; + *dbl_value = -1.0/real_zero; return 0; /* * The following cases are defined by @@ -429,23 +416,24 @@ asn1_double2REAL(REAL_t *st, double dbl_value) { st->buf[0] = 0x42; /* NaN */ st->buf[1] = 0; st->size = 1; - } else if(expval <= -INT_MAX) { + } else if(isinf(dbl_value)) { + if(copysign(1.0, dbl_value) < 0.0) { + st->buf[0] = 0x41; /* MINUS-INFINITY */ + } else { + st->buf[0] = 0x40; /* PLUS-INFINITY */ + } + st->buf[1] = 0; + st->size = 1; + } else { if(copysign(1.0, dbl_value) < 0.0) { st->buf[0] = 0x80 | 0x40; st->buf[1] = 0; st->size = 2; } else { + /* no content octets: positive zero */ st->buf[0] = 0; /* JIC */ st->size = 0; } - } else { /* isinf() */ - if(copysign(1.0, dbl_value) < 0.0) { - st->buf[0] = 0x41; /* MINUS-INFINITY */ - } else { - st->buf[0] = 0x40; /* PLUS-INFINITY */ - } - st->buf[1] = 0; - st->size = 1; } return 0; } diff --git a/skeletons/tests/check-REAL.c b/skeletons/tests/check-REAL.c index e61a54a05..89ab3260e 100644 --- a/skeletons/tests/check-REAL.c +++ b/skeletons/tests/check-REAL.c @@ -143,13 +143,15 @@ check_buf(uint8_t *buf, size_t bufsize, double verify, const char *sample, const int main() { REAL_t rn; - static const double c_NaN = 0.0; + static const double zero = 0.0; memset(&rn, 0, sizeof(rn)); - check(&rn, c_NaN/c_NaN, "", ""); check(&rn, 0.0, "0", "0"); check(&rn, -0.0, "-0", "-0"); /* minus-zero */ + check(&rn, zero/zero, "", ""); + check(&rn, 1.0/zero, "", ""); + check(&rn, -1.0/zero, "", ""); check(&rn, 1.0, "1.0", "1.0E0"); check(&rn, -1.0, "-1.0", "-1.0E0"); check(&rn, 1.5, "1.5", "1.5E0"); From 40056308923f02dc3828fcbeb2797ee058fd0c87 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 27 Sep 2004 22:18:34 +0000 Subject: [PATCH 0428/1469] real_zero moved up git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@428 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/REAL.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/REAL.c b/skeletons/REAL.c index 6ce124ee8..b03a70dd5 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -12,8 +12,8 @@ #undef INT_MAX #define INT_MAX ((int)(((unsigned int)-1) >> 1)) -#ifndef NAN static const double real_zero; +#ifndef NAN #define NAN (real_zero/real_zero) #endif From bbfd8668c163a4764b028914f306cb24214ded44 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 28 Sep 2004 11:37:37 +0000 Subject: [PATCH 0429/1469] order and typos fixed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@429 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c.spec.in | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/asn1c.spec.in b/asn1c.spec.in index 7c8355566..8915b394b 100644 --- a/asn1c.spec.in +++ b/asn1c.spec.in @@ -45,9 +45,9 @@ rm -rf $RPM_BUILD_ROOT %changelog +* Sun Sep 26 2004 Lev Walkin +- All manuals are now getting installed, including new ones: unber.1 and enber.1 + * Tue Sep 18 2004 Lev Walkin - First version of asn1c.spec -* Sun Sep 26 2004 Lev Walkin -- All manuals are now getting installed, including new onws: unber.1 and enber.1 - From 95ad5b3d083a9498d2f019c5200a0de1d32dc035 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 13:13:29 +0000 Subject: [PATCH 0430/1469] added an extra complex components git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@430 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/data-62/data-62-09-L.ber | Bin 18 -> 36 bytes asn1c/tests/data-62/data-62-09-L.xbr | 13 ++++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/asn1c/tests/data-62/data-62-09-L.ber b/asn1c/tests/data-62/data-62-09-L.ber index b7856ca024e1c3f1b2048af260626b641234f5df..808abc47fe3efe3db3c228a1c6b7f3c249469319 100644 GIT binary patch literal 36 scmXp|Vq#=n$R^BEl3HBC%D~9@e<9DqhW*v7+nI$Ks~8v_HZU*%0H+=a)c^nh literal 18 ZcmXpIU}9ul$R^BEl3HBC%D~9@9{?Pi1I+*c diff --git a/asn1c/tests/data-62/data-62-09-L.xbr b/asn1c/tests/data-62/data-62-09-L.xbr index e24ba2cd8..224091898 100644 --- a/asn1c/tests/data-62/data-62-09-L.xbr +++ b/asn1c/tests/data-62/data-62-09-L.xbr @@ -1,8 +1,19 @@ - +

    &x05;

    test

    -- extra component

    &xff;

    -- another extra component + -- yet another extra component + + + +

    z

    +
    +
    +
    +
    + -- and yet another one +
    From d8ff33552a071d10046804312a269eefbf231e2a Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 13:14:36 +0000 Subject: [PATCH 0431/1469] renamed asn1_* into asn_* git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@431 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-22.c | 8 ++++---- asn1c/tests/check-24.c | 2 +- asn1c/tests/check-25.c | 12 ++++++------ asn1c/tests/check-30.c | 2 +- asn1c/tests/check-31.c | 10 +++++----- asn1c/tests/check-35.c | 20 ++++++++++---------- asn1c/tests/check-41.c | 26 +++++++++++++------------- asn1c/tests/check-44.c | 2 +- asn1c/tests/check-46.c | 2 +- asn1c/tests/check-48.c | 8 ++++---- asn1c/tests/check-62.c | 12 ++++++------ asn1c/tests/check-65.c | 8 ++++---- 12 files changed, 56 insertions(+), 56 deletions(-) diff --git a/asn1c/tests/check-22.c b/asn1c/tests/check-22.c index 6a3538033..95f0c4aa2 100644 --- a/asn1c/tests/check-22.c +++ b/asn1c/tests/check-22.c @@ -55,7 +55,7 @@ check(int is_ok, uint8_t *buf, int size, size_t consumed) { tp = memset(&t, 0, sizeof(t)); fprintf(stderr, "Buf %p\n", buf); - rval = ber_decode(&asn1_DEF_T1, (void **)&tp, buf, size); + rval = ber_decode(0, &asn_DEF_T1, (void **)&tp, buf, size); fprintf(stderr, "Returned code %d, consumed %d\n", (int)rval.code, (int)rval.consumed); @@ -87,7 +87,7 @@ check(int is_ok, uint8_t *buf, int size, size_t consumed) { * Try to re-create using DER encoding. */ buf2_pos = 0; - erval = der_encode(&asn1_DEF_T1, tp, buf2_fill, 0); + erval = der_encode(&asn_DEF_T1, tp, buf2_fill, 0); assert(erval.encoded != -1); if(erval.encoded != sizeof(buf1)) { printf("%d != %d\n", (int)erval.encoded, (int)sizeof(buf1)); @@ -106,10 +106,10 @@ check(int is_ok, uint8_t *buf, int size, size_t consumed) { } fprintf(stderr, "=== asn_fprint() ===\n"); - ret = asn_fprint(stderr, &asn1_DEF_T1, tp); + ret = asn_fprint(stderr, &asn_DEF_T1, tp); assert(ret == 0); fprintf(stderr, "=== xer_fprint() ===\n"); - ret = xer_fprint(stderr, &asn1_DEF_T1, tp); + ret = xer_fprint(stderr, &asn_DEF_T1, tp); assert(ret == 0); fprintf(stderr, "=== EOF ===\n"); } diff --git a/asn1c/tests/check-24.c b/asn1c/tests/check-24.c index 79de91156..f50cbf64f 100644 --- a/asn1c/tests/check-24.c +++ b/asn1c/tests/check-24.c @@ -41,7 +41,7 @@ check(int is_ok, uint8_t *buf, int size, size_t consumed) { tp = memset(&t, 0, sizeof(t)); fprintf(stderr, "Buf %p\n", buf); - rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf, size); + rval = ber_decode(0, &asn_DEF_T, (void **)&tp, buf, size); fprintf(stderr, "Returned code %d, consumed %d\n", (int)rval.code, (int)rval.consumed); diff --git a/asn1c/tests/check-25.c b/asn1c/tests/check-25.c index 782fc86bd..9352a802d 100644 --- a/asn1c/tests/check-25.c +++ b/asn1c/tests/check-25.c @@ -94,7 +94,7 @@ check(int is_ok, uint8_t *buf, int size, size_t consumed) { tp = memset(&t, 0, sizeof(t)); fprintf(stderr, "Buf %p (%d)\n", buf, (int)size); - rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf, size); + rval = ber_decode(0, &asn_DEF_T, (void **)&tp, buf, size); fprintf(stderr, "Returned code %d, consumed %d, expected %d\n", (int)rval.code, (int)rval.consumed, (int)consumed); @@ -136,7 +136,7 @@ check(int is_ok, uint8_t *buf, int size, size_t consumed) { assert(rval.consumed <= consumed); } - asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); + asn_DEF_T.free_struct(&asn_DEF_T, &t, 1); } static void @@ -208,7 +208,7 @@ partial_read(uint8_t *buf, size_t size) { tp = memset(&t, 0, sizeof(t)); fprintf(stderr, "=> Chunk 1 (%d):\n", (int)size1); - rval = ber_decode(&asn1_DEF_T, (void **)&tp, + rval = ber_decode(0, &asn_DEF_T, (void **)&tp, tbuf1, size1); assert(rval.code == RC_WMORE); assert(rval.consumed <= size1); @@ -220,7 +220,7 @@ partial_read(uint8_t *buf, size_t size) { } fprintf(stderr, "=> Chunk 2 (%d):\n", (int)size2); - rval = ber_decode(&asn1_DEF_T, (void **)&tp, + rval = ber_decode(0, &asn_DEF_T, (void **)&tp, tbuf2, size2); assert(rval.code == RC_WMORE); assert(rval.consumed <= size2); @@ -232,12 +232,12 @@ partial_read(uint8_t *buf, size_t size) { } fprintf(stderr, "=> Chunk 3 (%d):\n", (int)size3); - rval = ber_decode(&asn1_DEF_T, (void **)&tp, + rval = ber_decode(0, &asn_DEF_T, (void **)&tp, tbuf3, size3); assert(rval.code == RC_OK); assert(rval.consumed == size3); - asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); + asn_DEF_T.free_struct(&asn_DEF_T, &t, 1); } } } diff --git a/asn1c/tests/check-30.c b/asn1c/tests/check-30.c index 014a9f0ea..3389d5391 100644 --- a/asn1c/tests/check-30.c +++ b/asn1c/tests/check-30.c @@ -151,7 +151,7 @@ check(int is_ok, uint8_t *buf, int size, size_t consumed) { tp = memset(&t, 0, sizeof(t)); fprintf(stderr, "Buf %p\n", buf); - rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf, size); + rval = ber_decode(0, &asn_DEF_T, (void **)&tp, buf, size); fprintf(stderr, "Returned code %d, consumed %d (out of %d)\n", (int)rval.code, (int)rval.consumed, size); diff --git a/asn1c/tests/check-31.c b/asn1c/tests/check-31.c index b0a47b981..06ad6b556 100644 --- a/asn1c/tests/check-31.c +++ b/asn1c/tests/check-31.c @@ -101,7 +101,7 @@ check(int is_ok, uint8_t *buf, int size, size_t consumed) { tp = memset(&t, 0, sizeof(t)); fprintf(stderr, "Buf %p\n", buf); - rval = ber_decode(&asn1_DEF_Forest, (void **)&tp, buf, size); + rval = ber_decode(0, &asn_DEF_Forest, (void **)&tp, buf, size); fprintf(stderr, "Returned code %d, consumed %d\n", (int)rval.code, (int)rval.consumed); @@ -131,14 +131,14 @@ check(int is_ok, uint8_t *buf, int size, size_t consumed) { * Try to re-create the buffer. */ buf_pos = 0; - der_encode(&asn1_DEF_Forest, &t, + der_encode(&asn_DEF_Forest, &t, bytes_compare, buf1_reconstr); assert(buf_pos == sizeof(buf1_reconstr)); - asn_fprint(stderr, &asn1_DEF_Forest, &t); - xer_fprint(stderr, &asn1_DEF_Forest, &t); + asn_fprint(stderr, &asn_DEF_Forest, &t); + xer_fprint(stderr, &asn_DEF_Forest, &t); - asn1_DEF_Forest.free_struct(&asn1_DEF_Forest, &t, 1); + asn_DEF_Forest.free_struct(&asn_DEF_Forest, &t, 1); } static void diff --git a/asn1c/tests/check-35.c b/asn1c/tests/check-35.c index bc2239460..f54045189 100644 --- a/asn1c/tests/check-35.c +++ b/asn1c/tests/check-35.c @@ -121,7 +121,7 @@ check(T_t *tp, uint8_t *buf, int size, size_t consumed) { tp = memset(tp, 0, sizeof(*tp)); fprintf(stderr, "Buf %p (%d)\n", buf, (int)size); - rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf, size); + rval = ber_decode(0, &asn_DEF_T, (void **)&tp, buf, size); fprintf(stderr, "Returned code %d, consumed %d\n", (int)rval.code, (int)rval.consumed); @@ -132,8 +132,8 @@ check(T_t *tp, uint8_t *buf, int size, size_t consumed) { assert(strcmp(tp->b.choice.b1.buf, "z") == 0 && strcmp(tp->b.choice.b2.buf, "z") == 0); - asn_fprint(stderr, &asn1_DEF_T, tp); - xer_fprint(stderr, &asn1_DEF_T, tp); + asn_fprint(stderr, &asn_DEF_T, tp); + xer_fprint(stderr, &asn_DEF_T, tp); } size_t buf_pos; @@ -170,7 +170,7 @@ compare(T_t *tp, uint8_t *cmp_buf, int cmp_buf_size) { /* * Try to re-create using DER encoding. */ - erval = der_encode(&asn1_DEF_T, tp, buf_fill, 0); + erval = der_encode(&asn_DEF_T, tp, buf_fill, 0); assert(erval.encoded != -1); if(erval.encoded != cmp_buf_size) { printf("%d != %d\n", erval.encoded, cmp_buf_size); @@ -228,7 +228,7 @@ partial_read(uint8_t *buf, size_t size) { tp = memset(&t, 0, sizeof(t)); fprintf(stderr, "=> Chunk 1 (%d):\n", (int)size1); - rval = ber_decode(&asn1_DEF_T, (void **)&tp, + rval = ber_decode(0, &asn_DEF_T, (void **)&tp, buf1, size1); assert(rval.code == RC_WMORE); assert(rval.consumed <= size1); @@ -240,7 +240,7 @@ partial_read(uint8_t *buf, size_t size) { } fprintf(stderr, "=> Chunk 2 (%d):\n", (int)size2); - rval = ber_decode(&asn1_DEF_T, (void **)&tp, + rval = ber_decode(0, &asn_DEF_T, (void **)&tp, buf2, size2); assert(rval.code == RC_WMORE); assert(rval.consumed <= size2); @@ -252,12 +252,12 @@ partial_read(uint8_t *buf, size_t size) { } fprintf(stderr, "=> Chunk 3 (%d):\n", (int)size3); - rval = ber_decode(&asn1_DEF_T, (void **)&tp, + rval = ber_decode(0, &asn_DEF_T, (void **)&tp, buf3, size3); assert(rval.code == RC_OK); assert(rval.consumed == size3); - asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); + asn_DEF_T.free_struct(&asn_DEF_T, &t, 1); } } } @@ -271,11 +271,11 @@ main(int ac, char **av) { check(&t, buf1, sizeof(buf1) + 10, sizeof(buf1)); compare(&t, buf1_reconstr, sizeof(buf1_reconstr)); - asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); + asn_DEF_T.free_struct(&asn_DEF_T, &t, 1); check(&t, buf2, sizeof(buf2) + 10, sizeof(buf2)); compare(&t, buf2_reconstr, sizeof(buf2_reconstr)); - asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); + asn_DEF_T.free_struct(&asn_DEF_T, &t, 1); /* Split the buffer in parts and check decoder restartability */ partial_read(buf1, sizeof(buf1)); diff --git a/asn1c/tests/check-41.c b/asn1c/tests/check-41.c index 33634e865..be623fc91 100644 --- a/asn1c/tests/check-41.c +++ b/asn1c/tests/check-41.c @@ -137,7 +137,7 @@ check(T_t *tp, uint8_t *buf, int size, size_t consumed) { tp = memset(tp, 0, sizeof(*tp)); fprintf(stderr, "Buf %p (%d)\n", (int)buf, (int)size); - rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf, size); + rval = ber_decode(0, &asn_DEF_T, (void **)&tp, buf, size); fprintf(stderr, "Returned code %d, consumed %d\n", (int)rval.code, (int)rval.consumed); @@ -145,10 +145,10 @@ check(T_t *tp, uint8_t *buf, int size, size_t consumed) { assert(rval.consumed == consumed); fprintf(stderr, "=== asn_fprint() ===\n"); - ret = asn_fprint(stderr, &asn1_DEF_T, tp); + ret = asn_fprint(stderr, &asn_DEF_T, tp); assert(ret == 0); fprintf(stderr, "=== xer_fprint() ===\n"); - ret = xer_fprint(stderr, &asn1_DEF_T, tp); + ret = xer_fprint(stderr, &asn_DEF_T, tp); fprintf(stderr, "=== END ===\n"); assert(ret == 0); @@ -194,7 +194,7 @@ compare(T_t *tp, uint8_t *cmp_buf, int cmp_buf_size) { /* * Try to re-create using DER encoding. */ - erval = der_encode(&asn1_DEF_T, tp, buf_fill, 0); + erval = der_encode(&asn_DEF_T, tp, buf_fill, 0); assert(erval.encoded != -1); if(erval.encoded != cmp_buf_size) { printf("%d != %d\n", (int)erval.encoded, (int)cmp_buf_size); @@ -252,7 +252,7 @@ partial_read(uint8_t *buf, size_t size) { tp = memset(&t, 0, sizeof(t)); fprintf(stderr, "=> Chunk 1 (%d):\n", (int)size1); - rval = ber_decode(&asn1_DEF_T, (void **)&tp, + rval = ber_decode(0, &asn_DEF_T, (void **)&tp, buf1, size1); assert(rval.code == RC_WMORE); assert(rval.consumed <= size1); @@ -264,7 +264,7 @@ partial_read(uint8_t *buf, size_t size) { } fprintf(stderr, "=> Chunk 2 (%d):\n", (int)size2); - rval = ber_decode(&asn1_DEF_T, (void **)&tp, + rval = ber_decode(0, &asn_DEF_T, (void **)&tp, buf2, size2); assert(rval.code == RC_WMORE); assert(rval.consumed <= size2); @@ -276,12 +276,12 @@ partial_read(uint8_t *buf, size_t size) { } fprintf(stderr, "=> Chunk 3 (%d):\n", (int)size3); - rval = ber_decode(&asn1_DEF_T, (void **)&tp, + rval = ber_decode(0, &asn_DEF_T, (void **)&tp, buf3, size3); assert(rval.code == RC_OK); assert(rval.consumed == size3); - asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); + asn_DEF_T.free_struct(&asn_DEF_T, &t, 1); } } } @@ -293,27 +293,27 @@ main() { /* Check exact buf0 */ check(&t, buf0, sizeof(buf0), sizeof(buf0)); compare(&t, buf0_reconstr, sizeof(buf0_reconstr)); - asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); + asn_DEF_T.free_struct(&asn_DEF_T, &t, 1); /* Check exact buf1 */ check(&t, buf1, sizeof(buf1), sizeof(buf1)); compare(&t, buf1_reconstr, sizeof(buf1_reconstr)); - asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); + asn_DEF_T.free_struct(&asn_DEF_T, &t, 1); /* Check slightly more than buf1 */ check(&t, buf1, sizeof(buf1) + 10, sizeof(buf1)); compare(&t, buf1_reconstr, sizeof(buf1_reconstr)); - asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); + asn_DEF_T.free_struct(&asn_DEF_T, &t, 1); /* Check exact buf2 */ check(&t, buf2, sizeof(buf2), sizeof(buf2)); compare(&t, buf2_reconstr, sizeof(buf2_reconstr)); - asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); + asn_DEF_T.free_struct(&asn_DEF_T, &t, 1); /* Check slightly more than buf2 */ check(&t, buf2, sizeof(buf2) + 10, sizeof(buf2)); compare(&t, buf2_reconstr, sizeof(buf2_reconstr)); - asn1_DEF_T.free_struct(&asn1_DEF_T, &t, 1); + asn_DEF_T.free_struct(&asn_DEF_T, &t, 1); /* Split the buffer in parts and check decoder restartability */ partial_read(buf0, sizeof(buf0)); diff --git a/asn1c/tests/check-44.c b/asn1c/tests/check-44.c index a705ef51e..3a175b3b9 100644 --- a/asn1c/tests/check-44.c +++ b/asn1c/tests/check-44.c @@ -35,7 +35,7 @@ check(int is_ok, uint8_t *buf, int size, size_t consumed) { tp = memset(&t, 0, sizeof(t)); fprintf(stderr, "Buf %p\n", buf); - rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf, size); + rval = ber_decode(0, &asn_DEF_T, (void **)&tp, buf, size); fprintf(stderr, "Returned code %d, consumed %d\n", (int)rval.code, (int)rval.consumed); diff --git a/asn1c/tests/check-46.c b/asn1c/tests/check-46.c index d2183d3ca..4e8c33bb5 100644 --- a/asn1c/tests/check-46.c +++ b/asn1c/tests/check-46.c @@ -25,7 +25,7 @@ check(uint8_t *buf, int size, size_t consumed) { tp = memset(&t, 0, sizeof(t)); fprintf(stderr, "Buf %p\n", buf); - rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf, size); + rval = ber_decode(0, &asn_DEF_T, (void **)&tp, buf, size); fprintf(stderr, "Returned code %d, consumed %d\n", (int)rval.code, (int)rval.consumed); diff --git a/asn1c/tests/check-48.c b/asn1c/tests/check-48.c index 84227680e..71dd8b211 100644 --- a/asn1c/tests/check-48.c +++ b/asn1c/tests/check-48.c @@ -28,7 +28,7 @@ _buf_writer(const void *buffer, size_t size, void *app_key) { } static int -save_object(void *bs, asn1_TYPE_descriptor_t *td) { +save_object(void *bs, asn_TYPE_descriptor_t *td) { asn_enc_rval_t rval; /* Return value */ int i; @@ -55,12 +55,12 @@ save_object(void *bs, asn1_TYPE_descriptor_t *td) { } static int -load_object(void *bs, asn1_TYPE_descriptor_t *td) { +load_object(void *bs, asn_TYPE_descriptor_t *td) { ber_dec_rval_t rval; fprintf(stderr, "\nLOADING OBJECT OF SIZE %d\n", buf_offset); - rval = ber_decode(td, (void **)&bs, buf, buf_offset); + rval = ber_decode(0, td, (void **)&bs, buf, buf_offset); assert(rval.code == RC_OK); asn_fprint(stderr, td, bs); @@ -71,7 +71,7 @@ load_object(void *bs, asn1_TYPE_descriptor_t *td) { int main() { - asn1_TYPE_descriptor_t *td = &asn1_DEF_UserIdentifier; + asn_TYPE_descriptor_t *td = &asn_DEF_UserIdentifier; UserIdentifier_t user; UserIdentifier_t user_new; int ret; diff --git a/asn1c/tests/check-62.c b/asn1c/tests/check-62.c index 06287a8a4..d9365d85b 100644 --- a/asn1c/tests/check-62.c +++ b/asn1c/tests/check-62.c @@ -41,7 +41,7 @@ save_object(T_t *st) { buf_offset = 0; - rval = der_encode(&asn1_DEF_T, st, _buf_writer, 0); + rval = der_encode(&asn_DEF_T, st, _buf_writer, 0); if (rval.encoded == -1) { fprintf(stderr, "Cannot encode %s: %s\n", @@ -69,13 +69,13 @@ load_object(enum expectation expectation, char *fbuf, int size) { int fbuf_left = size; int fbuf_chunk = csize; - if(st) asn1_DEF_T.free_struct(&asn1_DEF_T, st, 0); + if(st) asn_DEF_T.free_struct(&asn_DEF_T, st, 0); st = 0; do { fprintf(stderr, "Decoding from %d with %d (left %d)\n", fbuf_offset, fbuf_chunk, fbuf_left); - rval = ber_decode(&asn1_DEF_T, (void **)&st, + rval = ber_decode(0, &asn_DEF_T, (void **)&st, fbuf + fbuf_offset, fbuf_chunk < fbuf_left ? fbuf_chunk : fbuf_left); @@ -92,12 +92,12 @@ load_object(enum expectation expectation, char *fbuf, int size) { } else { assert(rval.code != RC_OK); fprintf(stderr, "Failed, but this was expected\n"); - asn1_DEF_T.free_struct(&asn1_DEF_T, st, 0); + asn_DEF_T.free_struct(&asn_DEF_T, st, 0); st = 0; /* ignore leak for now */ } } - if(st) asn_fprint(stderr, &asn1_DEF_T, st); + if(st) asn_fprint(stderr, &asn_DEF_T, st); return st; } @@ -122,7 +122,7 @@ process_data(enum expectation expectation, char *fbuf, int size) { assert(memcmp(buf, fbuf, buf_offset) == 0); } - asn1_DEF_T.free_struct(&asn1_DEF_T, st, 0); + asn_DEF_T.free_struct(&asn_DEF_T, st, 0); } /* diff --git a/asn1c/tests/check-65.c b/asn1c/tests/check-65.c index 08da99ea9..76295a7ce 100644 --- a/asn1c/tests/check-65.c +++ b/asn1c/tests/check-65.c @@ -53,14 +53,14 @@ uint8_t buf2[] = { static void check_1(int is_ok, uint8_t *buf, int size, size_t consumed) { - asn1_TYPE_descriptor_t *td = &asn1_DEF_T1; + asn_TYPE_descriptor_t *td = &asn_DEF_T1; ber_dec_rval_t rval; T1_t t, *tp; tp = memset(&t, 0, sizeof(t)); fprintf(stderr, "Buf %p\n", buf); - rval = ber_decode(td, (void **)&tp, buf, size); + rval = ber_decode(0, td, (void **)&tp, buf, size); fprintf(stderr, "Returned code %d, consumed %d\n", (int)rval.code, (int)rval.consumed); @@ -76,14 +76,14 @@ check_1(int is_ok, uint8_t *buf, int size, size_t consumed) { static void check_2(int is_ok, uint8_t *buf, int size, size_t consumed) { - asn1_TYPE_descriptor_t *td = &asn1_DEF_T; + asn_TYPE_descriptor_t *td = &asn_DEF_T; ber_dec_rval_t rval; T_t t, *tp; tp = memset(&t, 0, sizeof(t)); fprintf(stderr, "Buf %p\n", buf); - rval = ber_decode(td, (void **)&tp, buf, size); + rval = ber_decode(0, td, (void **)&tp, buf, size); fprintf(stderr, "Returned code %d, consumed %d\n", (int)rval.code, (int)rval.consumed); From 81f1a0cd0c344b6fc0eab419512d25dd0652f24e Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 13:15:06 +0000 Subject: [PATCH 0432/1469] removed unnecessary exit git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@432 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.PKIX1/Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index 9953647c9..c4d3eacc4 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -351,7 +351,6 @@ clean: Attribute.c: regenerate.Makefile ./regenerate.Makefile make - exit distclean: clean rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) From a5dcb91841a907d46c2a77ee005810a43cb36815 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 13:16:40 +0000 Subject: [PATCH 0433/1469] renamed asn1_ into asn_; support for cross-referenced types git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@433 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 168 ++++++++++++++++------------- libasn1compiler/asn1c_constraint.c | 16 +-- libasn1compiler/asn1c_out.h | 4 +- 3 files changed, 104 insertions(+), 84 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index d94d24b4d..4a34bd48c 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -52,7 +52,7 @@ static int emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode #define PCTX_DEF INDENTED( \ OUT("\n"); \ OUT("/* Context for parsing across buffer boundaries */\n"); \ - OUT("ber_dec_ctx_t _ber_dec_ctx;\n")); + OUT("asn_struct_ctx_t _asn_ctx;\n")); #define DEPENDENCIES do { \ asn1p_expr_t *__m; \ @@ -170,7 +170,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { GEN_INCLUDE("constr_SEQUENCE"); if(!arg->embed) - GEN_DECLARE(expr); /* asn1_DEF_xxx */ + GEN_DECLARE(expr); /* asn_DEF_xxx */ REDIR(OT_STAT_DEFS); @@ -181,7 +181,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { int comp_mode = 0; /* {root,ext=1,root,root,...} */ p = MKID(expr->Identifier); - OUT("static asn1_TYPE_member_t asn1_MBR_%s[] = {\n", p); + OUT("static asn_TYPE_member_t asn_MBR_%s[] = {\n", p); elements = 0; INDENTED(TQ_FOR(v, &(expr->members), next) { @@ -201,7 +201,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { } /* - * Print out asn1_DEF__[all_]tags[] vectors. + * Print out asn_DEF__[all_]tags[] vectors. */ tv_mode = emit_tags_vectors(arg, expr, &tags_count, &all_tags_count); @@ -211,11 +211,11 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { emit_tag2member_map(arg, tag2el, tag2el_count); p = MKID(expr->Identifier); - OUT("static asn1_SEQUENCE_specifics_t asn1_DEF_%s_specs = {\n", p); + OUT("static asn_SEQUENCE_specifics_t asn_DEF_%s_specs = {\n", p); INDENTED( OUT("sizeof(struct %s),\n", p); - OUT("offsetof(struct %s, _ber_dec_ctx),\n", p); - OUT("asn1_DEF_%s_tag2el,\n", p); + OUT("offsetof(struct %s, _asn_ctx),\n", p); + OUT("asn_DEF_%s_tag2el,\n", p); OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); OUT("%d,\t/* Start extensions */\n", ext_start); @@ -225,7 +225,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { OUT("};\n"); /* - * Emit asn1_DEF_xxx table. + * Emit asn_DEF_xxx table. */ emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, elements, ETD_HAS_SPECIFICS); @@ -324,7 +324,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { GEN_INCLUDE("constr_SET"); if(!arg->embed) - GEN_DECLARE(expr); /* asn1_DEF_xxx */ + GEN_DECLARE(expr); /* asn_DEF_xxx */ REDIR(OT_STAT_DEFS); @@ -335,7 +335,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { int comp_mode = 0; /* {root,ext=1,root,root,...} */ p = MKID(expr->Identifier); - OUT("static asn1_TYPE_member_t asn1_MBR_%s[] = {\n", p); + OUT("static asn_TYPE_member_t asn_MBR_%s[] = {\n", p); elements = 0; INDENTED(TQ_FOR(v, &(expr->members), next) { @@ -355,7 +355,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { } /* - * Print out asn1_DEF__[all_]tags[] vectors. + * Print out asn_DEF__[all_]tags[] vectors. */ tv_mode = emit_tags_vectors(arg, expr, &tags_count, &all_tags_count); @@ -368,7 +368,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { * Emit a map of mandatory elements. */ p = MKID(expr->Identifier); - OUT("static uint8_t asn1_DEF_%s_mmap", p); + OUT("static uint8_t asn_DEF_%s_mmap", p); OUT("[(%d + (8 * sizeof(unsigned int)) - 1) / 8]", elements); OUT(" = {\n", p); INDENTED( @@ -397,21 +397,21 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { OUT("\n"); OUT("};\n"); - OUT("static asn1_SET_specifics_t asn1_DEF_%s_specs = {\n", p); + OUT("static asn_SET_specifics_t asn_DEF_%s_specs = {\n", p); INDENTED( OUT("sizeof(struct %s),\n", p); - OUT("offsetof(struct %s, _ber_dec_ctx),\n", p); + OUT("offsetof(struct %s, _asn_ctx),\n", p); OUT("offsetof(struct %s, _presence_map),\n", p); - OUT("asn1_DEF_%s_tag2el,\n", p); + OUT("asn_DEF_%s_tag2el,\n", p); OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); OUT("%d,\t/* Whether extensible */\n", check_if_extensible(expr)); - OUT("(unsigned int *)asn1_DEF_%s_mmap\t/* Mandatory elements map */\n", p); + OUT("(unsigned int *)asn_DEF_%s_mmap\t/* Mandatory elements map */\n", p); ); OUT("};\n"); /* - * Emit asn1_DEF_xxx table. + * Emit asn_DEF_xxx table. */ emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, elements, ETD_HAS_SPECIFICS); @@ -495,7 +495,7 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { GEN_INCLUDE("constr_SET_OF"); } if(!arg->embed) - GEN_DECLARE(expr); /* asn1_DEF_xxx */ + GEN_DECLARE(expr); /* asn_DEF_xxx */ REDIR(OT_STAT_DEFS); @@ -503,7 +503,7 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { * Print out the table according to which the parsing is performed. */ p = MKID(expr->Identifier); - OUT("static asn1_TYPE_member_t asn1_MBR_%s[] = {\n", p); + OUT("static asn_TYPE_member_t asn_MBR_%s[] = {\n", p); INDENT(+1); v = TQ_FIRST(&(expr->members)); if(!v->Identifier) { @@ -518,15 +518,15 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { OUT("};\n"); /* - * Print out asn1_DEF__[all_]tags[] vectors. + * Print out asn_DEF__[all_]tags[] vectors. */ tv_mode = emit_tags_vectors(arg, expr, &tags_count, &all_tags_count); p = MKID(expr->Identifier); - OUT("static asn1_SET_OF_specifics_t asn1_DEF_%s_specs = {\n", p); + OUT("static asn_SET_OF_specifics_t asn_DEF_%s_specs = {\n", p); INDENTED( OUT("sizeof(struct %s),\n", p); - OUT("offsetof(struct %s, _ber_dec_ctx),\n", p); + OUT("offsetof(struct %s, _asn_ctx),\n", p); if(expr_as_xmlvaluelist(arg, v)) OUT("1,\t/* XER encoding is XMLValueList */\n"); else @@ -535,7 +535,7 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { OUT("};\n"); /* - * Emit asn1_DEF_xxx table. + * Emit asn_DEF_xxx table. */ emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, 1, ETD_HAS_SPECIFICS); @@ -624,7 +624,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { GEN_INCLUDE("constr_CHOICE"); if(!arg->embed) - GEN_DECLARE(expr); /* asn1_DEF_xxx */ + GEN_DECLARE(expr); /* asn_DEF_xxx */ REDIR(OT_STAT_DEFS); @@ -635,7 +635,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { int comp_mode = 0; /* {root,ext=1,root,root,...} */ p = MKID(expr->Identifier); - OUT("static asn1_TYPE_member_t asn1_MBR_%s[] = {\n", p); + OUT("static asn_TYPE_member_t asn_MBR_%s[] = {\n", p); elements = 0; INDENTED(TQ_FOR(v, &(expr->members), next) { @@ -672,13 +672,13 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { emit_tag2member_map(arg, tag2el, tag2el_count); p = MKID(expr->Identifier); - OUT("static asn1_CHOICE_specifics_t asn1_DEF_%s_specs = {\n", p); + OUT("static asn_CHOICE_specifics_t asn_DEF_%s_specs = {\n", p); INDENTED( OUT("sizeof(struct %s),\n", p); - OUT("offsetof(struct %s, _ber_dec_ctx),\n", p); + OUT("offsetof(struct %s, _asn_ctx),\n", p); OUT("offsetof(struct %s, present),\n", p); OUT("sizeof(((struct %s *)0)->present),\n", p); - OUT("asn1_DEF_%s_tag2el,\n", p); + OUT("asn_DEF_%s_tag2el,\n", p); OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); OUT("%d\t/* Whether extensible */\n", check_if_extensible(expr)); @@ -686,7 +686,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { OUT("};\n"); /* - * Emit asn1_DEF_xxx table. + * Emit asn_DEF_xxx table. */ emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, elements, ETD_HAS_SPECIFICS); @@ -749,9 +749,29 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { char *p; if(arg->embed) { + enum tnfmt tnfmt = TNF_CTYPE; + + /* + * If this is an optional compound type, + * refer it using "struct X" convention, + * as it may recursively include the current structure. + */ + if(expr->marker.flags) { + asn1p_expr_t *terminal; + terminal = asn1f_find_terminal_type_ex(arg->asn, expr); + if(terminal + && (terminal->expr_type & ASN_CONSTR_MASK)) { + REDIR(OT_DEPS); + tnfmt = TNF_RSAFE; + OUT("\n"); + OUT("%s;\t/* Forward declaration */\n", + asn1c_type_name(arg, arg->expr, tnfmt)); + } + } + REDIR(OT_TYPE_DECLS); - OUT("%s\t", asn1c_type_name(arg, arg->expr, TNF_CTYPE)); + OUT("%s\t", asn1c_type_name(arg, arg->expr, tnfmt)); OUT("%s", expr->marker.flags?"*":" "); OUT("%s", MKID(expr->Identifier)); if((expr->marker.flags & EM_DEFAULT) == EM_DEFAULT) @@ -787,9 +807,9 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("/* This type is equivalent to %s */\n", type_name); p = MKID(expr->Identifier); if(HIDE_INNER_DEFS) OUT("/* "); - OUT("#define\tasn1_DEF_%s\t", p); + OUT("#define\tasn_DEF_%s\t", p); type_name = asn1c_type_name(arg, expr, TNF_SAFE); - OUT("asn1_DEF_%s\n", type_name); + OUT("asn_DEF_%s\n", type_name); if(HIDE_INNER_DEFS) OUT(" // (Use -fall-defs-global to expose) */"); REDIR(OT_CODE); @@ -802,7 +822,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { REDIR(OT_STAT_DEFS); /* - * Print out asn1_DEF__[all_]tags[] vectors. + * Print out asn_DEF__[all_]tags[] vectors. */ tv_mode = emit_tags_vectors(arg, expr, &tags_count, &all_tags_count); @@ -818,14 +838,14 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { p = MKID(expr->Identifier); OUT("int\n"); OUT("%s_constraint(" - "asn1_TYPE_descriptor_t *td, const void *sptr,\n", p); + "asn_TYPE_descriptor_t *td, const void *sptr,\n", p); INDENT(+1); OUT("\t\tasn_app_consume_bytes_f *app_errlog, void *app_key) {"); OUT("\n"); if(asn1c_emit_constraint_checking_code(arg) == 1) { OUT("/* Replace with underlying type checker */\n"); OUT("td->check_constraints " - "= asn1_DEF_%s.check_constraints;\n", + "= asn_DEF_%s.check_constraints;\n", asn1c_type_name(arg, expr, TNF_SAFE)); OUT("return td->check_constraints" "(td, sptr, app_errlog, app_key);\n"); @@ -851,28 +871,28 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT(" */\n"); OUT("static void\n"); p = MKID(expr->Identifier); - OUT("%s_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) {\n", p); + OUT("%s_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {\n", p); INDENT(+1); { asn1p_expr_t *terminal = asn1f_find_terminal_type_ex(arg->asn, expr); char *type_name = asn1c_type_name(arg, expr, TNF_SAFE); - OUT("td->free_struct = asn1_DEF_%s.free_struct;\n", type_name); - OUT("td->print_struct = asn1_DEF_%s.print_struct;\n", type_name); - OUT("td->ber_decoder = asn1_DEF_%s.ber_decoder;\n", type_name); - OUT("td->der_encoder = asn1_DEF_%s.der_encoder;\n", type_name); - OUT("td->xer_decoder = asn1_DEF_%s.xer_decoder;\n", type_name); - OUT("td->xer_encoder = asn1_DEF_%s.xer_encoder;\n", type_name); + OUT("td->free_struct = asn_DEF_%s.free_struct;\n", type_name); + OUT("td->print_struct = asn_DEF_%s.print_struct;\n", type_name); + OUT("td->ber_decoder = asn_DEF_%s.ber_decoder;\n", type_name); + OUT("td->der_encoder = asn_DEF_%s.der_encoder;\n", type_name); + OUT("td->xer_decoder = asn_DEF_%s.xer_decoder;\n", type_name); + OUT("td->xer_encoder = asn_DEF_%s.xer_encoder;\n", type_name); if(!terminal && !tags_count) { OUT("/* The next four lines are here because of -fknown-extern-type */\n"); - OUT("td->tags = asn1_DEF_%s.tags;\n", type_name); - OUT("td->tags_count = asn1_DEF_%s.tags_count;\n", type_name); - OUT("td->all_tags = asn1_DEF_%s.all_tags;\n", type_name); - OUT("td->all_tags_count = asn1_DEF_%s.all_tags_count;\n",type_name); + OUT("td->tags = asn_DEF_%s.tags;\n", type_name); + OUT("td->tags_count = asn_DEF_%s.tags_count;\n", type_name); + OUT("td->all_tags = asn_DEF_%s.all_tags;\n", type_name); + OUT("td->all_tags_count = asn_DEF_%s.all_tags_count;\n",type_name); OUT("/* End of these lines */\n"); } - OUT("td->elements = asn1_DEF_%s.elements;\n", type_name); - OUT("td->elements_count = asn1_DEF_%s.elements_count;\n", type_name); - OUT("td->specifics = asn1_DEF_%s.specifics;\n", type_name); + OUT("td->elements = asn_DEF_%s.elements;\n", type_name); + OUT("td->elements_count = asn_DEF_%s.elements_count;\n", type_name); + OUT("td->specifics = asn_DEF_%s.specifics;\n", type_name); } INDENT(-1); OUT("}\n"); @@ -880,7 +900,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { p = MKID(expr->Identifier); OUT("void\n"); - OUT("%s_free(asn1_TYPE_descriptor_t *td,\n", p); + OUT("%s_free(asn_TYPE_descriptor_t *td,\n", p); INDENTED( OUT("\tvoid *struct_ptr, int contents_only) {\n"); OUT("%s_inherit_TYPE_descriptor(td);\n", p); @@ -891,7 +911,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { p = MKID(expr->Identifier); OUT("int\n"); - OUT("%s_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr,\n", p); + OUT("%s_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,\n", p); INDENTED( OUT("\tint ilevel, asn_app_consume_bytes_f *cb, void *app_key) {\n"); OUT("%s_inherit_TYPE_descriptor(td);\n", p); @@ -902,18 +922,18 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { p = MKID(expr->Identifier); OUT("ber_dec_rval_t\n"); - OUT("%s_decode_ber(asn1_TYPE_descriptor_t *td,\n", p); + OUT("%s_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,\n", p); INDENTED( OUT("\tvoid **structure, void *bufptr, size_t size, int tag_mode) {\n"); OUT("%s_inherit_TYPE_descriptor(td);\n", p); - OUT("return td->ber_decoder(td, structure, bufptr, size, tag_mode);\n"); + OUT("return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);\n"); ); OUT("}\n"); OUT("\n"); p = MKID(expr->Identifier); OUT("asn_enc_rval_t\n"); - OUT("%s_encode_der(asn1_TYPE_descriptor_t *td,\n", p); + OUT("%s_encode_der(asn_TYPE_descriptor_t *td,\n", p); INDENTED( OUT("\tvoid *structure, int tag_mode, ber_tlv_tag_t tag,\n"); OUT("\tasn_app_consume_bytes_f *cb, void *app_key) {\n"); @@ -925,7 +945,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { p = MKID(expr->Identifier); OUT("asn_enc_rval_t\n"); - OUT("%s_encode_xer(asn1_TYPE_descriptor_t *td, void *structure,\n", p); + OUT("%s_encode_xer(asn_TYPE_descriptor_t *td, void *structure,\n", p); INDENTED( OUT("\tint ilevel, enum xer_encoder_flags_e flags,\n"); OUT("\tasn_app_consume_bytes_f *cb, void *app_key) {\n"); @@ -939,7 +959,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { p = MKID(expr->Identifier); if(HIDE_INNER_DEFS) OUT("/* "); - OUT("extern asn1_TYPE_descriptor_t asn1_DEF_%s;", p); + OUT("extern asn_TYPE_descriptor_t asn_DEF_%s;", p); if(HIDE_INNER_DEFS) OUT(" // (Use -fall-defs-global to expose) */"); OUT("\n"); OUT("asn_struct_free_f %s_free;\n", p); @@ -1162,7 +1182,7 @@ static int emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count) { asn1p_expr_t *expr = arg->expr; - OUT("static asn1_TYPE_tag2member_t asn1_DEF_%s_tag2el[] = {\n", + OUT("static asn_TYPE_tag2member_t asn_DEF_%s_tag2el[] = {\n", MKID(expr->Identifier)); if(tag2el_count) { int i; @@ -1228,7 +1248,7 @@ emit_tags_vectors(arg_t *arg, asn1p_expr_t *expr, int *tags_count_r, int *all_ta } #define EMIT_TAGS_TABLE(name, tags, tags_count) do { \ - OUT("static ber_tlv_tag_t asn1_DEF_%s%s_tags[] = {\n", \ + OUT("static ber_tlv_tag_t asn_DEF_%s%s_tags[] = {\n", \ MKID(expr->Identifier), name); \ INDENT(+1); \ /* Print the array of collected tags */ \ @@ -1348,13 +1368,13 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { } if(C99_MODE) OUT(".type = "); if(expr->_anonymous_type && (expr->expr_type & ASN_CONSTR_MASK)) { - OUT("(void *)&asn1_DEF_%s_member,\n", + OUT("(void *)&asn_DEF_%s_member,\n", MKID(arg->expr->Identifier)); } else if(expr->expr_type & ASN_CONSTR_MASK) { - OUT("(void *)&asn1_DEF_%s,\n", + OUT("(void *)&asn_DEF_%s,\n", MKID(expr->Identifier)); } else { - OUT("(void *)&asn1_DEF_%s,\n", + OUT("(void *)&asn_DEF_%s,\n", asn1c_type_name(arg, expr, TNF_SAFE)); } if(C99_MODE) OUT(".memb_constraints = "); @@ -1388,7 +1408,7 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { else p = MKID(expr->Identifier); OUT("static int\n"); - OUT("memb_%s_%d_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,\n", p, global_memb_unique); + OUT("memb_%s_%d_constraint(asn_TYPE_descriptor_t *td, const void *sptr,\n", p, global_memb_unique); INDENT(+1); OUT("\t\tasn_app_consume_bytes_f *app_errlog, void *app_key) {\n"); tmp_arg = *arg; @@ -1413,7 +1433,7 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ p = MKID(expr->Identifier); if(HIDE_INNER_DEFS) OUT("static /* Use -fall-defs-global to expose */\n"); - OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p); + OUT("asn_TYPE_descriptor_t asn_DEF_%s = {\n", p); INDENT(+1); OUT("\"%s\",\n", expr->_anonymous_type?"":expr->Identifier); @@ -1438,9 +1458,9 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ } if(tags_count) { - OUT("asn1_DEF_%s_tags,\n", p); - OUT("sizeof(asn1_DEF_%s_tags)\n", p); - OUT("\t/sizeof(asn1_DEF_%s_tags[0])", p); + OUT("asn_DEF_%s_tags,\n", p); + OUT("sizeof(asn_DEF_%s_tags)\n", p); + OUT("\t/sizeof(asn_DEF_%s_tags[0])", p); if(tv_mode == _TVM_SUBSET && tags_count != all_tags_count) OUT(" - %d", all_tags_count - tags_count); @@ -1451,14 +1471,14 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ } if(all_tags_count && tv_mode == _TVM_DIFFERENT) { - OUT("asn1_DEF_%s_all_tags,\n", p); - OUT("sizeof(asn1_DEF_%s_all_tags)\n", p); - OUT("\t/sizeof(asn1_DEF_%s_all_tags[0]), /* %d */\n", + OUT("asn_DEF_%s_all_tags,\n", p); + OUT("sizeof(asn_DEF_%s_all_tags)\n", p); + OUT("\t/sizeof(asn_DEF_%s_all_tags[0]), /* %d */\n", p, all_tags_count); } else if(all_tags_count) { - OUT("asn1_DEF_%s_tags,\t/* Same as above */\n", p); - OUT("sizeof(asn1_DEF_%s_tags)\n", p); - OUT("\t/sizeof(asn1_DEF_%s_tags[0]), /* %d */\n", + OUT("asn_DEF_%s_tags,\t/* Same as above */\n", p); + OUT("sizeof(asn_DEF_%s_tags)\n", p); + OUT("\t/sizeof(asn_DEF_%s_tags[0]), /* %d */\n", p, all_tags_count); } else { OUT("0,\t/* No tags (pointer) */\n"); @@ -1466,7 +1486,7 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ } if(elements_count) { - OUT("asn1_MBR_%s,\n", p); + OUT("asn_MBR_%s,\n", p); if(expr->expr_type == ASN_CONSTR_SEQUENCE_OF || expr->expr_type == ASN_CONSTR_SET_OF) { OUT("%d,\t/* Single element */\n", @@ -1489,7 +1509,7 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ OUT("0\t/* No specifics */\n"); break; case ETD_HAS_SPECIFICS: - OUT("&asn1_DEF_%s_specs\t/* Additional specs */\n", p); + OUT("&asn_DEF_%s_specs\t/* Additional specs */\n", p); } INDENT(-1); OUT("};\n"); diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index 9f2edeca6..9a9e667e4 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -11,7 +11,7 @@ static int emit_alphabet_check_loop(arg_t *arg, asn1cnst_range_t *range); static int emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype, asn1cnst_range_t *r_value); static int emit_size_determination_code(arg_t *arg, asn1p_expr_type_e etype); static asn1p_expr_type_e _find_terminal_type(arg_t *arg); -static int emit_range_comparison_code(arg_t *arg, asn1cnst_range_t *range, const char *varname, asn1_integer_t natural_start, asn1_integer_t natural_stop); +static int emit_range_comparison_code(arg_t *arg, asn1cnst_range_t *range, const char *varname, asn1c_integer_t natural_start, asn1c_integer_t natural_stop); #define MKID(id) asn1c_make_identifier(0, (id), 0) @@ -187,8 +187,8 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { static int asn1c_emit_constraint_tables(arg_t *arg, int got_size) { - asn1_integer_t range_start; - asn1_integer_t range_stop; + asn1c_integer_t range_start; + asn1c_integer_t range_stop; asn1p_expr_type_e etype; asn1cnst_range_t *range; asn1p_constraint_t *ct; @@ -262,7 +262,7 @@ asn1c_emit_constraint_tables(arg_t *arg, int got_size) { memset(table, 0, sizeof(table)); for(i = -1; i < range->el_count; i++) { asn1cnst_range_t *r; - asn1_integer_t v; + asn1c_integer_t v; if(i == -1) { if(range->el_count) continue; r = range; @@ -362,7 +362,7 @@ asn1c_emit_constraint_tables(arg_t *arg, int got_size) { static int emit_alphabet_check_loop(arg_t *arg, asn1cnst_range_t *range) { - asn1_integer_t natural_stop; + asn1c_integer_t natural_stop; asn1p_expr_t *terminal; terminal = asn1f_find_terminal_type_ex(arg->asn, arg->expr); @@ -439,7 +439,7 @@ emit_alphabet_check_loop(arg_t *arg, asn1cnst_range_t *range) { } static int -emit_range_comparison_code(arg_t *arg, asn1cnst_range_t *range, const char *varname, asn1_integer_t natural_start, asn1_integer_t natural_stop) { +emit_range_comparison_code(arg_t *arg, asn1cnst_range_t *range, const char *varname, asn1c_integer_t natural_start, asn1c_integer_t natural_stop) { int ignore_left; int ignore_right; int generated_something = 0; @@ -573,7 +573,7 @@ emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype, asn1cnst_rang break; } - OUT("if(asn1_INTEGER2long(st, &value)) {\n"); + OUT("if(asn_INTEGER2long(st, &value)) {\n"); INDENT(+1); OUT("_ASN_ERRLOG(app_errlog, app_key,\n"); OUT("\t\"%%s: value too large (%%s:%%d)\",\n"); @@ -587,7 +587,7 @@ emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype, asn1cnst_rang if(arg->flags & A1C_USE_NATIVE_TYPES) { OUT("value = *(const double *)sptr;\n"); } else { - OUT("if(asn1_REAL2double(st, &value)) {\n"); + OUT("if(asn_REAL2double(st, &value)) {\n"); INDENT(+1); OUT("_ASN_ERRLOG(app_errlog, app_key,\n"); OUT("\t\"%%s: value too large (%%s:%%d)\",\n"); diff --git a/libasn1compiler/asn1c_out.h b/libasn1compiler/asn1c_out.h index 4c3fc415e..8f032211e 100644 --- a/libasn1compiler/asn1c_out.h +++ b/libasn1compiler/asn1c_out.h @@ -88,8 +88,8 @@ int asn1c_compiled_output(arg_t *arg, const char *fmt, ...); #define GEN_DECLARE(expr) do { \ int saved_target = arg->target->target; \ REDIR(OT_DEPS); \ - OUT_NOINDENT("extern asn1_TYPE_descriptor_t " \ - "asn1_DEF_%s;\n", \ + OUT_NOINDENT("extern asn_TYPE_descriptor_t " \ + "asn_DEF_%s;\n", \ MKID(expr->Identifier)); \ REDIR(saved_target); \ } while(0) From 3a3a0dd5a331f4495be2e7a7f1a263d4956a8b77 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 13:17:06 +0000 Subject: [PATCH 0434/1469] rearranging git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@434 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/libasn1fix/asn1fix.c b/libasn1fix/asn1fix.c index 02df593a8..33123fc24 100644 --- a/libasn1fix/asn1fix.c +++ b/libasn1fix/asn1fix.c @@ -96,8 +96,6 @@ asn1f_process(asn1p_t *asn, enum asn1f_flags flags, memset(&a1f_replace_me_with_proper_interface_arg, 0, sizeof(arg_t)); - memset(&a1f_replace_me_with_proper_interface_arg, 0, sizeof(arg_t)); - /* * Compute a return value. */ @@ -256,9 +254,6 @@ asn1f_fix_module__phase_2(arg_t *arg) { int rvalue = 0; int ret; - /* - * Check semantic validity of constraints. - */ TQ_FOR(expr, &(arg->mod->members), next) { arg->expr = expr; @@ -266,6 +261,9 @@ asn1f_fix_module__phase_2(arg_t *arg) { /* Do not process the parametrized types here */ continue; + /* + * Check semantic validity of constraints. + */ ret = asn1f_recurse_expr(arg, asn1f_check_constraints); RET2RVAL(ret, rvalue); From d5b3bf398c853c967b972530b4c7e20de31ea9ad Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 13:17:17 +0000 Subject: [PATCH 0435/1469] different type for the big integer git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@435 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_bitstring.c | 2 +- libasn1fix/asn1fix_constr.c | 2 +- libasn1fix/asn1fix_crange.c | 2 +- libasn1fix/asn1fix_crange.h | 2 +- libasn1fix/asn1fix_enum.c | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libasn1fix/asn1fix_bitstring.c b/libasn1fix/asn1fix_bitstring.c index c9a09761f..4ef945dc1 100644 --- a/libasn1fix/asn1fix_bitstring.c +++ b/libasn1fix/asn1fix_bitstring.c @@ -103,7 +103,7 @@ asn1f_BS_unparsed_convert(arg_t *arg, asn1p_value_t *value, asn1p_expr_t *ttype) asn1p_module_t *mod; asn1p_expr_t *V; asn1p_expr_t *bit; - asn1_integer_t aI; + asn1c_integer_t aI; uint8_t *bitbuf; int bits; int psize; diff --git a/libasn1fix/asn1fix_constr.c b/libasn1fix/asn1fix_constr.c index 66e7450e8..d837f35d6 100644 --- a/libasn1fix/asn1fix_constr.c +++ b/libasn1fix/asn1fix_constr.c @@ -287,7 +287,7 @@ int asn1f_fix_constr_autotag(arg_t *arg) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *v; - asn1_integer_t tag_value = 0; + asn1c_integer_t tag_value = 0; int r_value = 0; switch(expr->expr_type) { diff --git a/libasn1fix/asn1fix_crange.c b/libasn1fix/asn1fix_crange.c index f6e111139..974aa21cc 100644 --- a/libasn1fix/asn1fix_crange.c +++ b/libasn1fix/asn1fix_crange.c @@ -352,7 +352,7 @@ static int _range_fill(asn1p_value_t *val, const asn1cnst_range_t *minmax, asn1c * However, (FROM("abc".."def")) is forbidden. * See also 47.4.4. */ - asn1_integer_t vmin, vmax; + asn1c_integer_t vmin, vmax; vmin = vmax = *p; for(; p < pend; p++) { asn1cnst_range_t *nr = _range_new(); diff --git a/libasn1fix/asn1fix_crange.h b/libasn1fix/asn1fix_crange.h index 9d4763ace..06817796c 100644 --- a/libasn1fix/asn1fix_crange.h +++ b/libasn1fix/asn1fix_crange.h @@ -8,7 +8,7 @@ typedef struct asn1cnst_edge_s { ARE_VALUE, } type; int lineno; /* Line where the corresponding token was found */ - asn1_integer_t value; /* Value when type is ARE_VALUE */ + asn1c_integer_t value; /* Value when type is ARE_VALUE */ } asn1cnst_edge_t; typedef struct asn1cnst_range_s { diff --git a/libasn1fix/asn1fix_enum.c b/libasn1fix/asn1fix_enum.c index 4eb98135f..d0c0f2555 100644 --- a/libasn1fix/asn1fix_enum.c +++ b/libasn1fix/asn1fix_enum.c @@ -7,7 +7,7 @@ int asn1f_fix_enum(arg_t *arg) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *ev; - asn1_integer_t max_value = -1; + asn1c_integer_t max_value = -1; int rvalue = 0; asn1p_expr_t *ext_marker = NULL; /* "..." position */ int ret; @@ -21,7 +21,7 @@ asn1f_fix_enum(arg_t *arg) { * 1. Scan the enumeration values in search for inconsistencies. */ TQ_FOR(ev, &(expr->members), next) { - asn1_integer_t eval; + asn1c_integer_t eval; if(ev->value) DEBUG("\tItem %s(%s)", ev->Identifier, From ec6acd445da4cc0402156ac8369f2b5511caed59 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 13:18:09 +0000 Subject: [PATCH 0436/1469] different type name for the big integer git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@436 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/Makefile.in | 2 +- libasn1parser/asn1p_expr.h | 2 +- libasn1parser/asn1p_l.c | 6 +++--- libasn1parser/asn1p_oid.c | 4 ++-- libasn1parser/asn1p_oid.h | 4 ++-- libasn1parser/asn1p_value.c | 2 +- libasn1parser/asn1p_value.h | 4 ++-- libasn1parser/asn1p_y.c | 2 +- libasn1parser/asn1p_y.h | 2 +- libasn1parser/asn1parser.h | 2 +- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index cb9ebd03f..dc7abe835 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -447,9 +447,9 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." + -rm -f asn1p_y.h -rm -f asn1p_l.c -rm -f asn1p_y.c - -rm -f asn1p_y.h clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ diff --git a/libasn1parser/asn1p_expr.h b/libasn1parser/asn1p_expr.h index 4cdcd41fd..05329e0cb 100644 --- a/libasn1parser/asn1p_expr.h +++ b/libasn1parser/asn1p_expr.h @@ -170,7 +170,7 @@ typedef struct asn1p_expr_s { TM_IMPLICIT, TM_EXPLICIT, } tag_mode; - asn1_integer_t tag_value; + asn1c_integer_t tag_value; } tag; struct asn1p_expr_marker_s { diff --git a/libasn1parser/asn1p_l.c b/libasn1parser/asn1p_l.c index 2d0c30754..93a12c343 100644 --- a/libasn1parser/asn1p_l.c +++ b/libasn1parser/asn1p_l.c @@ -1808,7 +1808,7 @@ int asn1p_lexer_pedantic_1990 = 0; int asn1p_lexer_types_year = 0; int asn1p_lexer_constructs_year = 0; static int _check_dashes(char *ptr); -static asn1_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */ +static asn1c_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */ /* * Check that the type is defined in the year of the standard choosen. @@ -3957,9 +3957,9 @@ _check_dashes(char *ptr) { return 0; } -static asn1_integer_t +static asn1c_integer_t asn1p_atoi(char *ptr) { - asn1_integer_t value; + asn1c_integer_t value; errno = 0; /* Clear the error code */ if(sizeof(value) <= sizeof(int)) { diff --git a/libasn1parser/asn1p_oid.c b/libasn1parser/asn1p_oid.c index 2c22b0fd9..deb8c381d 100644 --- a/libasn1parser/asn1p_oid.c +++ b/libasn1parser/asn1p_oid.c @@ -39,7 +39,7 @@ asn1p_oid_free(asn1p_oid_t *oid) { } asn1p_oid_arc_t * -asn1p_oid_arc_new(const char *optName, asn1_integer_t optNumber /* = -1 */) { +asn1p_oid_arc_new(const char *optName, asn1c_integer_t optNumber /* = -1 */) { asn1p_oid_arc_t *arc; arc = calloc(1, sizeof *arc); @@ -66,7 +66,7 @@ asn1p_oid_compare(asn1p_oid_t *a, asn1p_oid_t *b) { int i; for(i = 0; ; i++) { - asn1_integer_t cmp; + asn1c_integer_t cmp; if(b->arcs_count > i) { if(a->arcs_count <= i) diff --git a/libasn1parser/asn1p_oid.h b/libasn1parser/asn1p_oid.h index cbb6b0799..d561c52d6 100644 --- a/libasn1parser/asn1p_oid.h +++ b/libasn1parser/asn1p_oid.h @@ -12,7 +12,7 @@ * Object identifier arc (one number in the hierarchy). */ typedef struct asn1p_oid_arc_s { - asn1_integer_t number; /* -1 if not yet defined */ + asn1c_integer_t number; /* -1 if not yet defined */ char *name; /* 0 if not defined */ } asn1p_oid_arc_t; @@ -21,7 +21,7 @@ typedef struct asn1p_oid_arc_s { * Arc constructor. */ asn1p_oid_arc_t *asn1p_oid_arc_new( - const char *optName, asn1_integer_t optNumber /* = -1 */); + const char *optName, asn1c_integer_t optNumber /* = -1 */); /* * Arc destructor. */ diff --git a/libasn1parser/asn1p_value.c b/libasn1parser/asn1p_value.c index b38240977..f6c8c4911 100644 --- a/libasn1parser/asn1p_value.c +++ b/libasn1parser/asn1p_value.c @@ -99,7 +99,7 @@ asn1p_value_fromdouble(double d) { } asn1p_value_t * -asn1p_value_fromint(asn1_integer_t i) { +asn1p_value_fromint(asn1c_integer_t i) { asn1p_value_t *v = calloc(1, sizeof *v); if(v) { v->value.v_integer = i; diff --git a/libasn1parser/asn1p_value.h b/libasn1parser/asn1p_value.h index 5310b01f0..fa622d7fb 100644 --- a/libasn1parser/asn1p_value.h +++ b/libasn1parser/asn1p_value.h @@ -29,7 +29,7 @@ typedef struct asn1p_value_s { union { asn1p_ref_t *reference; - asn1_integer_t v_integer; + asn1c_integer_t v_integer; double v_double; /* * Binary bits vector. @@ -59,7 +59,7 @@ asn1p_value_t *asn1p_value_fromref(asn1p_ref_t *ref, int do_copy); asn1p_value_t *asn1p_value_frombits(uint8_t *bits, int size_in_bits, int dc); asn1p_value_t *asn1p_value_frombuf(char *buffer, int size, int do_copy); asn1p_value_t *asn1p_value_fromdouble(double); -asn1p_value_t *asn1p_value_fromint(asn1_integer_t); +asn1p_value_t *asn1p_value_fromint(asn1c_integer_t); asn1p_value_t *asn1p_value_clone(asn1p_value_t *); void asn1p_value_free(asn1p_value_t *); diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index 9d621e242..02d618108 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -184,7 +184,7 @@ typedef union { asn1p_paramlist_t *a_plist; /* A pargs list */ struct asn1p_expr_marker_s a_marker; /* OPTIONAL/DEFAULT */ enum asn1p_constr_pres_e a_pres; /* PRESENT/ABSENT/OPTIONAL */ - asn1_integer_t a_int; + asn1c_integer_t a_int; char *tv_str; struct { char *buf; diff --git a/libasn1parser/asn1p_y.h b/libasn1parser/asn1p_y.h index 788f2d9ee..e1c581b15 100644 --- a/libasn1parser/asn1p_y.h +++ b/libasn1parser/asn1p_y.h @@ -19,7 +19,7 @@ typedef union { asn1p_paramlist_t *a_plist; /* A pargs list */ struct asn1p_expr_marker_s a_marker; /* OPTIONAL/DEFAULT */ enum asn1p_constr_pres_e a_pres; /* PRESENT/ABSENT/OPTIONAL */ - asn1_integer_t a_int; + asn1c_integer_t a_int; char *tv_str; struct { char *buf; diff --git a/libasn1parser/asn1parser.h b/libasn1parser/asn1parser.h index 126057d66..ff7e410d0 100644 --- a/libasn1parser/asn1parser.h +++ b/libasn1parser/asn1parser.h @@ -29,7 +29,7 @@ * type is used by the compiler itself to handle large integer values * specified inside ASN.1 grammar. */ -typedef intmax_t asn1_integer_t; +typedef intmax_t asn1c_integer_t; #ifdef PRIdMAX #define PRIdASN PRIdMAX #define PRIuASN PRIuMAX From 24b9a8b8b2c787b95439d7014274b4fa340d0beb Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 13:18:44 +0000 Subject: [PATCH 0437/1469] README file git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@437 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/Makefile.am | 4 ++++ examples/Makefile.in | 24 ++++++++++++++---------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/examples/Makefile.am b/examples/Makefile.am index d3e73d6d4..2fb1c2cca 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -22,8 +22,12 @@ $(ASN1_FILES_1): crfc2asn1.pl $(ASN1_SOURCE_1) ./crfc2asn1.pl $(ASN1_SOURCE_1) EXTRA_DIST = rfc*.txt \ + sample.source.PKIX1/README \ sample.source.PKIX1/x509dump.c \ sample.source.PKIX1/config.h \ sample.source.PKIX1/Makefile \ sample.source.PKIX1/regenerate.Makefile CLEANFILES = *.asn1 + +clean-local: + cd sample.source.PKIX1 && make distclean diff --git a/examples/Makefile.in b/examples/Makefile.in index c2a3b941a..7aad746b6 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -174,6 +174,7 @@ ASN1_FILES_1 = \ rfc3280-PKIX1Implicit88.asn1 EXTRA_DIST = rfc*.txt \ + sample.source.PKIX1/README \ sample.source.PKIX1/x509dump.c \ sample.source.PKIX1/config.h \ sample.source.PKIX1/Makefile \ @@ -310,7 +311,7 @@ maintainer-clean-generic: @echo "it deletes files that may require special tools to rebuild." clean: clean-am -clean-am: clean-generic clean-libtool mostlyclean-am +clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile @@ -355,15 +356,15 @@ ps-am: uninstall-am: uninstall-dist_binSCRIPTS uninstall-info-am .PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dist_binSCRIPTS \ - install-exec install-exec-am install-info install-info-am \ - install-man install-strip installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ - ps ps-am uninstall uninstall-am uninstall-dist_binSCRIPTS \ - uninstall-info-am + clean-local distclean distclean-generic distclean-libtool \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am \ + install-dist_binSCRIPTS install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ + uninstall-dist_binSCRIPTS uninstall-info-am all: $(ASN1_FILES_0) $(ASN1_FILES_1) @@ -373,6 +374,9 @@ $(ASN1_FILES_0): crfc2asn1.pl $(ASN1_SOURCE_0) $(ASN1_FILES_1): crfc2asn1.pl $(ASN1_SOURCE_1) ./crfc2asn1.pl $(ASN1_SOURCE_1) + +clean-local: + cd sample.source.PKIX1 && make distclean # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: From 7a5a31a1b50013828e6a004bc1bbbfc21eed40b3 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 13:19:12 +0000 Subject: [PATCH 0438/1469] added cross-referenced types git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@438 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/43-recursion-OK.asn1 | 3 + tests/43-recursion-OK.asn1.-P | 332 ++++++++++++++++++++++++++-------- 2 files changed, 255 insertions(+), 80 deletions(-) diff --git a/tests/43-recursion-OK.asn1 b/tests/43-recursion-OK.asn1 index f2ee3eb43..782f6c3d8 100644 --- a/tests/43-recursion-OK.asn1 +++ b/tests/43-recursion-OK.asn1 @@ -25,4 +25,7 @@ BEGIN other [4] INTEGER } + Test-structure-2 ::= SET { m1 Test-structure-3 OPTIONAL } + Test-structure-3 ::= SET { m1 Test-structure-2 OPTIONAL } + END diff --git a/tests/43-recursion-OK.asn1.-P b/tests/43-recursion-OK.asn1.-P index 58fd39a9b..885e6352d 100644 --- a/tests/43-recursion-OK.asn1.-P +++ b/tests/43-recursion-OK.asn1.-P @@ -11,7 +11,9 @@ /*** <<< DEPS [Test-structure-1] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Test_structure_1; + +struct Test_structure_1; /* Forward declaration */ +extern asn_TYPE_descriptor_t asn_DEF_Test_structure_1; /*** <<< TYPE-DECLS [Test-structure-1] >>> ***/ @@ -21,42 +23,42 @@ typedef struct Test_structure_1 { A_SET_OF(struct Test_structure_1) list; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } t_member1; struct t_member2 { A_SEQUENCE_OF(struct Test_structure_1) list; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } t_member2; struct Test_structure_1 *t_member3 /* OPTIONAL */; INTEGER_t t_member4; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } Test_structure_1_t; /*** <<< STAT-DEFS [Test-structure-1] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_t_member1[] = { +static asn_TYPE_member_t asn_MBR_t_member1[] = { { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_Test_structure_1, + .type = (void *)&asn_DEF_Test_structure_1, .memb_constraints = 0, /* Defer to actual type */ .name = "" }, }; -static ber_tlv_tag_t asn1_DEF_t_member1_tags[] = { +static ber_tlv_tag_t asn_DEF_t_member1_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn1_SET_OF_specifics_t asn1_DEF_t_member1_specs = { +static asn_SET_OF_specifics_t asn_DEF_t_member1_specs = { sizeof(struct t_member1), - offsetof(struct t_member1, _ber_dec_ctx), + offsetof(struct t_member1, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; static /* Use -fall-defs-global to expose */ -asn1_TYPE_descriptor_t asn1_DEF_t_member1 = { +asn_TYPE_descriptor_t asn_DEF_t_member1 = { "t-member1", SET_OF_free, SET_OF_print, @@ -66,36 +68,36 @@ asn1_TYPE_descriptor_t asn1_DEF_t_member1 = { 0, /* Not implemented yet */ SET_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_t_member1_tags, - sizeof(asn1_DEF_t_member1_tags) - /sizeof(asn1_DEF_t_member1_tags[0]), /* 1 */ - asn1_DEF_t_member1_tags, /* Same as above */ - sizeof(asn1_DEF_t_member1_tags) - /sizeof(asn1_DEF_t_member1_tags[0]), /* 1 */ - asn1_MBR_t_member1, + asn_DEF_t_member1_tags, + sizeof(asn_DEF_t_member1_tags) + /sizeof(asn_DEF_t_member1_tags[0]), /* 1 */ + asn_DEF_t_member1_tags, /* Same as above */ + sizeof(asn_DEF_t_member1_tags) + /sizeof(asn_DEF_t_member1_tags[0]), /* 1 */ + asn_MBR_t_member1, 1, /* Single element */ - &asn1_DEF_t_member1_specs /* Additional specs */ + &asn_DEF_t_member1_specs /* Additional specs */ }; -static asn1_TYPE_member_t asn1_MBR_t_member2[] = { +static asn_TYPE_member_t asn_MBR_t_member2[] = { { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_Test_structure_1, + .type = (void *)&asn_DEF_Test_structure_1, .memb_constraints = 0, /* Defer to actual type */ .name = "" }, }; -static ber_tlv_tag_t asn1_DEF_t_member2_tags[] = { +static ber_tlv_tag_t asn_DEF_t_member2_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_SET_OF_specifics_t asn1_DEF_t_member2_specs = { +static asn_SET_OF_specifics_t asn_DEF_t_member2_specs = { sizeof(struct t_member2), - offsetof(struct t_member2, _ber_dec_ctx), + offsetof(struct t_member2, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; static /* Use -fall-defs-global to expose */ -asn1_TYPE_descriptor_t asn1_DEF_t_member2 = { +asn_TYPE_descriptor_t asn_DEF_t_member2 = { "t-member2", SEQUENCE_OF_free, SEQUENCE_OF_print, @@ -105,65 +107,65 @@ asn1_TYPE_descriptor_t asn1_DEF_t_member2 = { 0, /* Not implemented yet */ SEQUENCE_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_t_member2_tags, - sizeof(asn1_DEF_t_member2_tags) - /sizeof(asn1_DEF_t_member2_tags[0]), /* 1 */ - asn1_DEF_t_member2_tags, /* Same as above */ - sizeof(asn1_DEF_t_member2_tags) - /sizeof(asn1_DEF_t_member2_tags[0]), /* 1 */ - asn1_MBR_t_member2, + asn_DEF_t_member2_tags, + sizeof(asn_DEF_t_member2_tags) + /sizeof(asn_DEF_t_member2_tags[0]), /* 1 */ + asn_DEF_t_member2_tags, /* Same as above */ + sizeof(asn_DEF_t_member2_tags) + /sizeof(asn_DEF_t_member2_tags[0]), /* 1 */ + asn_MBR_t_member2, 1, /* Single element */ - &asn1_DEF_t_member2_specs /* Additional specs */ + &asn_DEF_t_member2_specs /* Additional specs */ }; -static asn1_TYPE_member_t asn1_MBR_Test_structure_1[] = { +static asn_TYPE_member_t asn_MBR_Test_structure_1[] = { { ATF_NOFLAGS, 0, offsetof(struct Test_structure_1, t_member1), .tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_t_member1, + .type = (void *)&asn_DEF_t_member1, .memb_constraints = 0, /* Defer to actual type */ .name = "t-member1" }, { ATF_NOFLAGS, 0, offsetof(struct Test_structure_1, t_member2), .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_t_member2, + .type = (void *)&asn_DEF_t_member2, .memb_constraints = 0, /* Defer to actual type */ .name = "t-member2" }, { ATF_POINTER, 1, offsetof(struct Test_structure_1, t_member3), .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_Test_structure_1, + .type = (void *)&asn_DEF_Test_structure_1, .memb_constraints = 0, /* Defer to actual type */ .name = "t-member3" }, { ATF_NOFLAGS, 0, offsetof(struct Test_structure_1, t_member4), .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_INTEGER, + .type = (void *)&asn_DEF_INTEGER, .memb_constraints = 0, /* Defer to actual type */ .name = "t-member4" }, }; -static ber_tlv_tag_t asn1_DEF_Test_structure_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Test_structure_1_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_TYPE_tag2member_t asn1_DEF_Test_structure_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_Test_structure_1_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 3, 0, 0 }, /* t-member4 at 19 */ { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 1 }, /* t-member2 at 16 */ { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 0 }, /* t-member3 at 17 */ { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0, 0, 0 }, /* t-member1 at 15 */ }; -static asn1_SEQUENCE_specifics_t asn1_DEF_Test_structure_1_specs = { +static asn_SEQUENCE_specifics_t asn_DEF_Test_structure_1_specs = { sizeof(struct Test_structure_1), - offsetof(struct Test_structure_1, _ber_dec_ctx), - asn1_DEF_Test_structure_1_tag2el, + offsetof(struct Test_structure_1, _asn_ctx), + asn_DEF_Test_structure_1_tag2el, 4, /* Count of tags in the map */ -1, /* Start extensions */ -1 /* Stop extensions */ }; -asn1_TYPE_descriptor_t asn1_DEF_Test_structure_1 = { +asn_TYPE_descriptor_t asn_DEF_Test_structure_1 = { "Test-structure-1", SEQUENCE_free, SEQUENCE_print, @@ -173,15 +175,15 @@ asn1_TYPE_descriptor_t asn1_DEF_Test_structure_1 = { 0, /* Not implemented yet */ SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Test_structure_1_tags, - sizeof(asn1_DEF_Test_structure_1_tags) - /sizeof(asn1_DEF_Test_structure_1_tags[0]), /* 1 */ - asn1_DEF_Test_structure_1_tags, /* Same as above */ - sizeof(asn1_DEF_Test_structure_1_tags) - /sizeof(asn1_DEF_Test_structure_1_tags[0]), /* 1 */ - asn1_MBR_Test_structure_1, + asn_DEF_Test_structure_1_tags, + sizeof(asn_DEF_Test_structure_1_tags) + /sizeof(asn_DEF_Test_structure_1_tags[0]), /* 1 */ + asn_DEF_Test_structure_1_tags, /* Same as above */ + sizeof(asn_DEF_Test_structure_1_tags) + /sizeof(asn_DEF_Test_structure_1_tags[0]), /* 1 */ + asn_MBR_Test_structure_1, 4, /* Elements count */ - &asn1_DEF_Test_structure_1_specs /* Additional specs */ + &asn_DEF_Test_structure_1_specs /* Additional specs */ }; @@ -202,7 +204,11 @@ typedef enum Choice_1_PR { Choice_1_PR_not, Choice_1_PR_other, } Choice_1_PR; -extern asn1_TYPE_descriptor_t asn1_DEF_Choice_1; + +struct Choice_1; /* Forward declaration */ + +struct Choice_1; /* Forward declaration */ +extern asn_TYPE_descriptor_t asn_DEF_Choice_1; /*** <<< TYPE-DECLS [Choice-1] >>> ***/ @@ -215,38 +221,38 @@ typedef struct Choice_1 { A_SET_OF(struct Choice_1) list; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } or; struct Choice_1 *not; INTEGER_t other; } choice; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } Choice_1_t; /*** <<< STAT-DEFS [Choice-1] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_or[] = { +static asn_TYPE_member_t asn_MBR_or[] = { { ATF_NOFLAGS, 0, 0, .tag = -1 /* Ambiguous tag (CHOICE?) */, .tag_mode = 0, - .type = (void *)&asn1_DEF_Choice_1, + .type = (void *)&asn_DEF_Choice_1, .memb_constraints = 0, /* Defer to actual type */ .name = "" }, }; -static ber_tlv_tag_t asn1_DEF_or_tags[] = { +static ber_tlv_tag_t asn_DEF_or_tags[] = { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn1_SET_OF_specifics_t asn1_DEF_or_specs = { +static asn_SET_OF_specifics_t asn_DEF_or_specs = { sizeof(struct or), - offsetof(struct or, _ber_dec_ctx), + offsetof(struct or, _asn_ctx), 1, /* XER encoding is XMLValueList */ }; static /* Use -fall-defs-global to expose */ -asn1_TYPE_descriptor_t asn1_DEF_or = { +asn_TYPE_descriptor_t asn_DEF_or = { "or", SET_OF_free, SET_OF_print, @@ -256,63 +262,63 @@ asn1_TYPE_descriptor_t asn1_DEF_or = { 0, /* Not implemented yet */ SET_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_or_tags, - sizeof(asn1_DEF_or_tags) - /sizeof(asn1_DEF_or_tags[0]) - 1, /* 1 */ - asn1_DEF_or_tags, /* Same as above */ - sizeof(asn1_DEF_or_tags) - /sizeof(asn1_DEF_or_tags[0]), /* 2 */ - asn1_MBR_or, + asn_DEF_or_tags, + sizeof(asn_DEF_or_tags) + /sizeof(asn_DEF_or_tags[0]) - 1, /* 1 */ + asn_DEF_or_tags, /* Same as above */ + sizeof(asn_DEF_or_tags) + /sizeof(asn_DEF_or_tags[0]), /* 2 */ + asn_MBR_or, 1, /* Single element */ - &asn1_DEF_or_specs /* Additional specs */ + &asn_DEF_or_specs /* Additional specs */ }; -static asn1_TYPE_member_t asn1_MBR_Choice_1[] = { +static asn_TYPE_member_t asn_MBR_Choice_1[] = { { ATF_POINTER, 0, offsetof(struct Choice_1, choice.and), .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), .tag_mode = +1, /* EXPLICIT tag at current level */ - .type = (void *)&asn1_DEF_Choice_1, + .type = (void *)&asn_DEF_Choice_1, .memb_constraints = 0, /* Defer to actual type */ .name = "and" }, { ATF_NOFLAGS, 0, offsetof(struct Choice_1, choice.or), .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ - .type = (void *)&asn1_DEF_or, + .type = (void *)&asn_DEF_or, .memb_constraints = 0, /* Defer to actual type */ .name = "or" }, { ATF_POINTER, 0, offsetof(struct Choice_1, choice.not), .tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)), .tag_mode = +1, /* EXPLICIT tag at current level */ - .type = (void *)&asn1_DEF_Choice_1, + .type = (void *)&asn_DEF_Choice_1, .memb_constraints = 0, /* Defer to actual type */ .name = "not" }, { ATF_NOFLAGS, 0, offsetof(struct Choice_1, choice.other), .tag = (ASN_TAG_CLASS_CONTEXT | (4 << 2)), .tag_mode = +1, /* EXPLICIT tag at current level */ - .type = (void *)&asn1_DEF_INTEGER, + .type = (void *)&asn_DEF_INTEGER, .memb_constraints = 0, /* Defer to actual type */ .name = "other" }, }; -static asn1_TYPE_tag2member_t asn1_DEF_Choice_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_Choice_1_tag2el[] = { { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* and at 22 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* or at 23 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* not at 24 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 3, 0, 0 }, /* other at 26 */ }; -static asn1_CHOICE_specifics_t asn1_DEF_Choice_1_specs = { +static asn_CHOICE_specifics_t asn_DEF_Choice_1_specs = { sizeof(struct Choice_1), - offsetof(struct Choice_1, _ber_dec_ctx), + offsetof(struct Choice_1, _asn_ctx), offsetof(struct Choice_1, present), sizeof(((struct Choice_1 *)0)->present), - asn1_DEF_Choice_1_tag2el, + asn_DEF_Choice_1_tag2el, 4, /* Count of tags in the map */ 0 /* Whether extensible */ }; -asn1_TYPE_descriptor_t asn1_DEF_Choice_1 = { +asn_TYPE_descriptor_t asn_DEF_Choice_1 = { "Choice-1", CHOICE_free, CHOICE_print, @@ -326,8 +332,174 @@ asn1_TYPE_descriptor_t asn1_DEF_Choice_1 = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - asn1_MBR_Choice_1, + asn_MBR_Choice_1, 4, /* Elements count */ - &asn1_DEF_Choice_1_specs /* Additional specs */ + &asn_DEF_Choice_1_specs /* Additional specs */ +}; + + +/*** <<< INCLUDES [Test-structure-2] >>> ***/ + +#include +#include + +/*** <<< DEPS [Test-structure-2] >>> ***/ + + +/* + * Method of determining the components presence + */ +typedef enum Test_structure_2_PR { + Test_structure_2_PR_m1, /* Member m1 is present */ +} Test_structure_2_PR; + +struct Test_structure_3; /* Forward declaration */ +extern asn_TYPE_descriptor_t asn_DEF_Test_structure_2; + +/*** <<< TYPE-DECLS [Test-structure-2] >>> ***/ + + +typedef struct Test_structure_2 { + struct Test_structure_3 *m1 /* OPTIONAL */; + + /* Presence bitmask: ASN_SET_ISPRESENT(pTest_structure_2, Test_structure_2_PR_x) */ + unsigned int _presence_map + [((1+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))]; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} Test_structure_2_t; + +/*** <<< STAT-DEFS [Test-structure-2] >>> ***/ + +static asn_TYPE_member_t asn_MBR_Test_structure_2[] = { + { ATF_POINTER, 1, offsetof(struct Test_structure_2, m1), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), + .tag_mode = 0, + .type = (void *)&asn_DEF_Test_structure_3, + .memb_constraints = 0, /* Defer to actual type */ + .name = "m1" + }, +}; +static ber_tlv_tag_t asn_DEF_Test_structure_2_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) +}; +static asn_TYPE_tag2member_t asn_DEF_Test_structure_2_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0, 0, 0 }, /* m1 at 28 */ +}; +static uint8_t asn_DEF_Test_structure_2_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { + (0 << 7) +}; +static asn_SET_specifics_t asn_DEF_Test_structure_2_specs = { + sizeof(struct Test_structure_2), + offsetof(struct Test_structure_2, _asn_ctx), + offsetof(struct Test_structure_2, _presence_map), + asn_DEF_Test_structure_2_tag2el, + 1, /* Count of tags in the map */ + 0, /* Whether extensible */ + (unsigned int *)asn_DEF_Test_structure_2_mmap /* Mandatory elements map */ +}; +asn_TYPE_descriptor_t asn_DEF_Test_structure_2 = { + "Test-structure-2", + SET_free, + SET_print, + SET_constraint, + SET_decode_ber, + SET_encode_der, + 0, /* Not implemented yet */ + SET_encode_xer, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Test_structure_2_tags, + sizeof(asn_DEF_Test_structure_2_tags) + /sizeof(asn_DEF_Test_structure_2_tags[0]), /* 1 */ + asn_DEF_Test_structure_2_tags, /* Same as above */ + sizeof(asn_DEF_Test_structure_2_tags) + /sizeof(asn_DEF_Test_structure_2_tags[0]), /* 1 */ + asn_MBR_Test_structure_2, + 1, /* Elements count */ + &asn_DEF_Test_structure_2_specs /* Additional specs */ +}; + + +/*** <<< INCLUDES [Test-structure-3] >>> ***/ + +#include +#include + +/*** <<< DEPS [Test-structure-3] >>> ***/ + + +/* + * Method of determining the components presence + */ +typedef enum Test_structure_3_PR { + Test_structure_3_PR_m1, /* Member m1 is present */ +} Test_structure_3_PR; + +struct Test_structure_2; /* Forward declaration */ +extern asn_TYPE_descriptor_t asn_DEF_Test_structure_3; + +/*** <<< TYPE-DECLS [Test-structure-3] >>> ***/ + + +typedef struct Test_structure_3 { + struct Test_structure_2 *m1 /* OPTIONAL */; + + /* Presence bitmask: ASN_SET_ISPRESENT(pTest_structure_3, Test_structure_3_PR_x) */ + unsigned int _presence_map + [((1+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))]; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} Test_structure_3_t; + +/*** <<< STAT-DEFS [Test-structure-3] >>> ***/ + +static asn_TYPE_member_t asn_MBR_Test_structure_3[] = { + { ATF_POINTER, 1, offsetof(struct Test_structure_3, m1), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), + .tag_mode = 0, + .type = (void *)&asn_DEF_Test_structure_2, + .memb_constraints = 0, /* Defer to actual type */ + .name = "m1" + }, +}; +static ber_tlv_tag_t asn_DEF_Test_structure_3_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) +}; +static asn_TYPE_tag2member_t asn_DEF_Test_structure_3_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0, 0, 0 }, /* m1 at 29 */ +}; +static uint8_t asn_DEF_Test_structure_3_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { + (0 << 7) +}; +static asn_SET_specifics_t asn_DEF_Test_structure_3_specs = { + sizeof(struct Test_structure_3), + offsetof(struct Test_structure_3, _asn_ctx), + offsetof(struct Test_structure_3, _presence_map), + asn_DEF_Test_structure_3_tag2el, + 1, /* Count of tags in the map */ + 0, /* Whether extensible */ + (unsigned int *)asn_DEF_Test_structure_3_mmap /* Mandatory elements map */ +}; +asn_TYPE_descriptor_t asn_DEF_Test_structure_3 = { + "Test-structure-3", + SET_free, + SET_print, + SET_constraint, + SET_decode_ber, + SET_encode_der, + 0, /* Not implemented yet */ + SET_encode_xer, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Test_structure_3_tags, + sizeof(asn_DEF_Test_structure_3_tags) + /sizeof(asn_DEF_Test_structure_3_tags[0]), /* 1 */ + asn_DEF_Test_structure_3_tags, /* Same as above */ + sizeof(asn_DEF_Test_structure_3_tags) + /sizeof(asn_DEF_Test_structure_3_tags[0]), /* 1 */ + asn_MBR_Test_structure_3, + 1, /* Elements count */ + &asn_DEF_Test_structure_3_specs /* Additional specs */ }; From 0229643efe2fd98a8142df9fb5083e3464ebc158 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 13:19:37 +0000 Subject: [PATCH 0439/1469] asn1_* renamed into asn_* git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@439 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/19-param-OK.asn1.-P | 146 +-- tests/31-set-of-OK.asn1.-P | 206 ++-- tests/32-sequence-of-OK.asn1.-P | 94 +- tests/39-sequence-of-OK.asn1.-P | 106 +-- tests/42-real-life-OK.asn1.-PR | 336 +++---- tests/44-choice-in-sequence-OK.asn1.-P | 108 +-- tests/46-redefine-OK.asn1.-PR | 92 +- tests/47-set-ext-OK.asn1.-P | 124 +-- tests/50-constraint-OK.asn1.-P | 1004 ++++++++++---------- tests/60-any-OK.asn1.-P | 76 +- tests/65-multi-tag-OK.asn1.-P | 372 ++++---- tests/65-multi-tag-OK.asn1.-Pfnative-types | 372 ++++---- tests/66-ref-simple-OK.asn1.-P | 86 +- 13 files changed, 1561 insertions(+), 1561 deletions(-) diff --git a/tests/19-param-OK.asn1.-P b/tests/19-param-OK.asn1.-P index 5089d3ac2..8c609e9de 100644 --- a/tests/19-param-OK.asn1.-P +++ b/tests/19-param-OK.asn1.-P @@ -9,7 +9,7 @@ /*** <<< DEPS [Certificate] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Certificate; +extern asn_TYPE_descriptor_t asn_DEF_Certificate; /*** <<< TYPE-DECLS [Certificate] >>> ***/ @@ -21,19 +21,19 @@ typedef struct Certificate { Name_t issuer; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } toBeSigned; OBJECT_IDENTIFIER_t algorithm; BIT_STRING_t signature; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } Certificate_t; /*** <<< CODE [Certificate] >>> ***/ static int -memb_signature_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +memb_signature_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const BIT_STRING_t *st = sptr; size_t size; @@ -66,47 +66,47 @@ memb_signature_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /*** <<< STAT-DEFS [Certificate] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_toBeSigned[] = { +static asn_TYPE_member_t asn_MBR_toBeSigned[] = { { ATF_NOFLAGS, 0, offsetof(struct toBeSigned, version), .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_INTEGER, + .type = (void *)&asn_DEF_INTEGER, .memb_constraints = 0, /* Defer to actual type */ .name = "version" }, { ATF_NOFLAGS, 0, offsetof(struct toBeSigned, signature), .tag = (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_OBJECT_IDENTIFIER, + .type = (void *)&asn_DEF_OBJECT_IDENTIFIER, .memb_constraints = 0, /* Defer to actual type */ .name = "signature" }, { ATF_NOFLAGS, 0, offsetof(struct toBeSigned, issuer), .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_Name, + .type = (void *)&asn_DEF_Name, .memb_constraints = 0, /* Defer to actual type */ .name = "issuer" }, }; -static ber_tlv_tag_t asn1_DEF_toBeSigned_tags[] = { +static ber_tlv_tag_t asn_DEF_toBeSigned_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_TYPE_tag2member_t asn1_DEF_toBeSigned_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_toBeSigned_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* version at 21 */ { (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)), 1, 0, 0 }, /* signature at 22 */ { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, 0, 0 }, /* issuer at 24 */ }; -static asn1_SEQUENCE_specifics_t asn1_DEF_toBeSigned_specs = { +static asn_SEQUENCE_specifics_t asn_DEF_toBeSigned_specs = { sizeof(struct toBeSigned), - offsetof(struct toBeSigned, _ber_dec_ctx), - asn1_DEF_toBeSigned_tag2el, + offsetof(struct toBeSigned, _asn_ctx), + asn_DEF_toBeSigned_tag2el, 3, /* Count of tags in the map */ -1, /* Start extensions */ -1 /* Stop extensions */ }; static /* Use -fall-defs-global to expose */ -asn1_TYPE_descriptor_t asn1_DEF_toBeSigned = { +asn_TYPE_descriptor_t asn_DEF_toBeSigned = { "toBeSigned", SEQUENCE_free, SEQUENCE_print, @@ -116,57 +116,57 @@ asn1_TYPE_descriptor_t asn1_DEF_toBeSigned = { 0, /* Not implemented yet */ SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_toBeSigned_tags, - sizeof(asn1_DEF_toBeSigned_tags) - /sizeof(asn1_DEF_toBeSigned_tags[0]), /* 1 */ - asn1_DEF_toBeSigned_tags, /* Same as above */ - sizeof(asn1_DEF_toBeSigned_tags) - /sizeof(asn1_DEF_toBeSigned_tags[0]), /* 1 */ - asn1_MBR_toBeSigned, + asn_DEF_toBeSigned_tags, + sizeof(asn_DEF_toBeSigned_tags) + /sizeof(asn_DEF_toBeSigned_tags[0]), /* 1 */ + asn_DEF_toBeSigned_tags, /* Same as above */ + sizeof(asn_DEF_toBeSigned_tags) + /sizeof(asn_DEF_toBeSigned_tags[0]), /* 1 */ + asn_MBR_toBeSigned, 3, /* Elements count */ - &asn1_DEF_toBeSigned_specs /* Additional specs */ + &asn_DEF_toBeSigned_specs /* Additional specs */ }; -static asn1_TYPE_member_t asn1_MBR_Certificate[] = { +static asn_TYPE_member_t asn_MBR_Certificate[] = { { ATF_NOFLAGS, 0, offsetof(struct Certificate, toBeSigned), .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_toBeSigned, + .type = (void *)&asn_DEF_toBeSigned, .memb_constraints = 0, /* Defer to actual type */ .name = "toBeSigned" }, { ATF_NOFLAGS, 0, offsetof(struct Certificate, algorithm), .tag = (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_OBJECT_IDENTIFIER, + .type = (void *)&asn_DEF_OBJECT_IDENTIFIER, .memb_constraints = 0, /* Defer to actual type */ .name = "algorithm" }, { ATF_NOFLAGS, 0, offsetof(struct Certificate, signature), .tag = (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_BIT_STRING, + .type = (void *)&asn_DEF_BIT_STRING, .memb_constraints = memb_signature_1_constraint, .name = "signature" }, }; -static ber_tlv_tag_t asn1_DEF_Certificate_tags[] = { +static ber_tlv_tag_t asn_DEF_Certificate_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_TYPE_tag2member_t asn1_DEF_Certificate_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_Certificate_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 2, 0, 0 }, /* signature at 17 */ { (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)), 1, 0, 0 }, /* algorithm at 16 */ { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 }, /* toBeSigned at 21 */ }; -static asn1_SEQUENCE_specifics_t asn1_DEF_Certificate_specs = { +static asn_SEQUENCE_specifics_t asn_DEF_Certificate_specs = { sizeof(struct Certificate), - offsetof(struct Certificate, _ber_dec_ctx), - asn1_DEF_Certificate_tag2el, + offsetof(struct Certificate, _asn_ctx), + asn_DEF_Certificate_tag2el, 3, /* Count of tags in the map */ -1, /* Start extensions */ -1 /* Stop extensions */ }; -asn1_TYPE_descriptor_t asn1_DEF_Certificate = { +asn_TYPE_descriptor_t asn_DEF_Certificate = { "Certificate", SEQUENCE_free, SEQUENCE_print, @@ -176,15 +176,15 @@ asn1_TYPE_descriptor_t asn1_DEF_Certificate = { 0, /* Not implemented yet */ SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Certificate_tags, - sizeof(asn1_DEF_Certificate_tags) - /sizeof(asn1_DEF_Certificate_tags[0]), /* 1 */ - asn1_DEF_Certificate_tags, /* Same as above */ - sizeof(asn1_DEF_Certificate_tags) - /sizeof(asn1_DEF_Certificate_tags[0]), /* 1 */ - asn1_MBR_Certificate, + asn_DEF_Certificate_tags, + sizeof(asn_DEF_Certificate_tags) + /sizeof(asn_DEF_Certificate_tags[0]), /* 1 */ + asn_DEF_Certificate_tags, /* Same as above */ + sizeof(asn_DEF_Certificate_tags) + /sizeof(asn_DEF_Certificate_tags[0]), /* 1 */ + asn_MBR_Certificate, 3, /* Elements count */ - &asn1_DEF_Certificate_specs /* Additional specs */ + &asn_DEF_Certificate_specs /* Additional specs */ }; @@ -196,7 +196,7 @@ asn1_TYPE_descriptor_t asn1_DEF_Certificate = { /*** <<< DEPS [Name] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Name; +extern asn_TYPE_descriptor_t asn_DEF_Name; /*** <<< TYPE-DECLS [Name] >>> ***/ @@ -205,29 +205,29 @@ typedef struct Name { A_SEQUENCE_OF(RelativeDistinguishedName_t) list; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } Name_t; /*** <<< STAT-DEFS [Name] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_Name[] = { +static asn_TYPE_member_t asn_MBR_Name[] = { { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_RelativeDistinguishedName, + .type = (void *)&asn_DEF_RelativeDistinguishedName, .memb_constraints = 0, /* Defer to actual type */ .name = "" }, }; -static ber_tlv_tag_t asn1_DEF_Name_tags[] = { +static ber_tlv_tag_t asn_DEF_Name_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_SET_OF_specifics_t asn1_DEF_Name_specs = { +static asn_SET_OF_specifics_t asn_DEF_Name_specs = { sizeof(struct Name), - offsetof(struct Name, _ber_dec_ctx), + offsetof(struct Name, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn1_TYPE_descriptor_t asn1_DEF_Name = { +asn_TYPE_descriptor_t asn_DEF_Name = { "Name", SEQUENCE_OF_free, SEQUENCE_OF_print, @@ -237,15 +237,15 @@ asn1_TYPE_descriptor_t asn1_DEF_Name = { 0, /* Not implemented yet */ SEQUENCE_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Name_tags, - sizeof(asn1_DEF_Name_tags) - /sizeof(asn1_DEF_Name_tags[0]), /* 1 */ - asn1_DEF_Name_tags, /* Same as above */ - sizeof(asn1_DEF_Name_tags) - /sizeof(asn1_DEF_Name_tags[0]), /* 1 */ - asn1_MBR_Name, + asn_DEF_Name_tags, + sizeof(asn_DEF_Name_tags) + /sizeof(asn_DEF_Name_tags[0]), /* 1 */ + asn_DEF_Name_tags, /* Same as above */ + sizeof(asn_DEF_Name_tags) + /sizeof(asn_DEF_Name_tags[0]), /* 1 */ + asn_MBR_Name, 1, /* Single element */ - &asn1_DEF_Name_specs /* Additional specs */ + &asn_DEF_Name_specs /* Additional specs */ }; @@ -257,7 +257,7 @@ asn1_TYPE_descriptor_t asn1_DEF_Name = { /*** <<< DEPS [RelativeDistinguishedName] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_RelativeDistinguishedName; +extern asn_TYPE_descriptor_t asn_DEF_RelativeDistinguishedName; /*** <<< TYPE-DECLS [RelativeDistinguishedName] >>> ***/ @@ -266,7 +266,7 @@ typedef struct RelativeDistinguishedName { A_SET_OF(IA5String_t) list; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } RelativeDistinguishedName_t; /*** <<< CTABLES [RelativeDistinguishedName] >>> ***/ @@ -300,7 +300,7 @@ static int check_permitted_alphabet_1(const void *sptr) { /*** <<< CODE [RelativeDistinguishedName] >>> ***/ static int -memb_IA5String_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +memb_IA5String_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const IA5String_t *st = sptr; @@ -326,24 +326,24 @@ memb_IA5String_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /*** <<< STAT-DEFS [RelativeDistinguishedName] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_RelativeDistinguishedName[] = { +static asn_TYPE_member_t asn_MBR_RelativeDistinguishedName[] = { { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_IA5String, + .type = (void *)&asn_DEF_IA5String, .memb_constraints = memb_IA5String_2_constraint, .name = "" }, }; -static ber_tlv_tag_t asn1_DEF_RelativeDistinguishedName_tags[] = { +static ber_tlv_tag_t asn_DEF_RelativeDistinguishedName_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn1_SET_OF_specifics_t asn1_DEF_RelativeDistinguishedName_specs = { +static asn_SET_OF_specifics_t asn_DEF_RelativeDistinguishedName_specs = { sizeof(struct RelativeDistinguishedName), - offsetof(struct RelativeDistinguishedName, _ber_dec_ctx), + offsetof(struct RelativeDistinguishedName, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn1_TYPE_descriptor_t asn1_DEF_RelativeDistinguishedName = { +asn_TYPE_descriptor_t asn_DEF_RelativeDistinguishedName = { "RelativeDistinguishedName", SET_OF_free, SET_OF_print, @@ -353,14 +353,14 @@ asn1_TYPE_descriptor_t asn1_DEF_RelativeDistinguishedName = { 0, /* Not implemented yet */ SET_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_RelativeDistinguishedName_tags, - sizeof(asn1_DEF_RelativeDistinguishedName_tags) - /sizeof(asn1_DEF_RelativeDistinguishedName_tags[0]), /* 1 */ - asn1_DEF_RelativeDistinguishedName_tags, /* Same as above */ - sizeof(asn1_DEF_RelativeDistinguishedName_tags) - /sizeof(asn1_DEF_RelativeDistinguishedName_tags[0]), /* 1 */ - asn1_MBR_RelativeDistinguishedName, + asn_DEF_RelativeDistinguishedName_tags, + sizeof(asn_DEF_RelativeDistinguishedName_tags) + /sizeof(asn_DEF_RelativeDistinguishedName_tags[0]), /* 1 */ + asn_DEF_RelativeDistinguishedName_tags, /* Same as above */ + sizeof(asn_DEF_RelativeDistinguishedName_tags) + /sizeof(asn_DEF_RelativeDistinguishedName_tags[0]), /* 1 */ + asn_MBR_RelativeDistinguishedName, 1, /* Single element */ - &asn1_DEF_RelativeDistinguishedName_specs /* Additional specs */ + &asn_DEF_RelativeDistinguishedName_specs /* Additional specs */ }; diff --git a/tests/31-set-of-OK.asn1.-P b/tests/31-set-of-OK.asn1.-P index 6bf3d7c75..37533f006 100644 --- a/tests/31-set-of-OK.asn1.-P +++ b/tests/31-set-of-OK.asn1.-P @@ -7,7 +7,7 @@ /*** <<< DEPS [Forest] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Forest; +extern asn_TYPE_descriptor_t asn_DEF_Forest; /*** <<< TYPE-DECLS [Forest] >>> ***/ @@ -16,29 +16,29 @@ typedef struct Forest { A_SET_OF(Tree_t) list; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } Forest_t; /*** <<< STAT-DEFS [Forest] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_Forest[] = { +static asn_TYPE_member_t asn_MBR_Forest[] = { { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_Tree, + .type = (void *)&asn_DEF_Tree, .memb_constraints = 0, /* Defer to actual type */ .name = "" }, }; -static ber_tlv_tag_t asn1_DEF_Forest_tags[] = { +static ber_tlv_tag_t asn_DEF_Forest_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn1_SET_OF_specifics_t asn1_DEF_Forest_specs = { +static asn_SET_OF_specifics_t asn_DEF_Forest_specs = { sizeof(struct Forest), - offsetof(struct Forest, _ber_dec_ctx), + offsetof(struct Forest, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn1_TYPE_descriptor_t asn1_DEF_Forest = { +asn_TYPE_descriptor_t asn_DEF_Forest = { "Forest", SET_OF_free, SET_OF_print, @@ -48,15 +48,15 @@ asn1_TYPE_descriptor_t asn1_DEF_Forest = { 0, /* Not implemented yet */ SET_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Forest_tags, - sizeof(asn1_DEF_Forest_tags) - /sizeof(asn1_DEF_Forest_tags[0]), /* 1 */ - asn1_DEF_Forest_tags, /* Same as above */ - sizeof(asn1_DEF_Forest_tags) - /sizeof(asn1_DEF_Forest_tags[0]), /* 1 */ - asn1_MBR_Forest, + asn_DEF_Forest_tags, + sizeof(asn_DEF_Forest_tags) + /sizeof(asn_DEF_Forest_tags[0]), /* 1 */ + asn_DEF_Forest_tags, /* Same as above */ + sizeof(asn_DEF_Forest_tags) + /sizeof(asn_DEF_Forest_tags[0]), /* 1 */ + asn_MBR_Forest, 1, /* Single element */ - &asn1_DEF_Forest_specs /* Additional specs */ + &asn_DEF_Forest_specs /* Additional specs */ }; @@ -67,7 +67,7 @@ asn1_TYPE_descriptor_t asn1_DEF_Forest = { /*** <<< DEPS [Tree] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Tree; +extern asn_TYPE_descriptor_t asn_DEF_Tree; /*** <<< TYPE-DECLS [Tree] >>> ***/ @@ -77,43 +77,43 @@ typedef struct Tree { INTEGER_t width; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } Tree_t; /*** <<< STAT-DEFS [Tree] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_Tree[] = { +static asn_TYPE_member_t asn_MBR_Tree[] = { { ATF_NOFLAGS, 0, offsetof(struct Tree, height), .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_INTEGER, + .type = (void *)&asn_DEF_INTEGER, .memb_constraints = 0, /* Defer to actual type */ .name = "height" }, { ATF_NOFLAGS, 0, offsetof(struct Tree, width), .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_INTEGER, + .type = (void *)&asn_DEF_INTEGER, .memb_constraints = 0, /* Defer to actual type */ .name = "width" }, }; -static ber_tlv_tag_t asn1_DEF_Tree_tags[] = { +static ber_tlv_tag_t asn_DEF_Tree_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_TYPE_tag2member_t asn1_DEF_Tree_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_Tree_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 1 }, /* height at 17 */ { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, -1, 0 }, /* width at 19 */ }; -static asn1_SEQUENCE_specifics_t asn1_DEF_Tree_specs = { +static asn_SEQUENCE_specifics_t asn_DEF_Tree_specs = { sizeof(struct Tree), - offsetof(struct Tree, _ber_dec_ctx), - asn1_DEF_Tree_tag2el, + offsetof(struct Tree, _asn_ctx), + asn_DEF_Tree_tag2el, 2, /* Count of tags in the map */ -1, /* Start extensions */ -1 /* Stop extensions */ }; -asn1_TYPE_descriptor_t asn1_DEF_Tree = { +asn_TYPE_descriptor_t asn_DEF_Tree = { "Tree", SEQUENCE_free, SEQUENCE_print, @@ -123,15 +123,15 @@ asn1_TYPE_descriptor_t asn1_DEF_Tree = { 0, /* Not implemented yet */ SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Tree_tags, - sizeof(asn1_DEF_Tree_tags) - /sizeof(asn1_DEF_Tree_tags[0]), /* 1 */ - asn1_DEF_Tree_tags, /* Same as above */ - sizeof(asn1_DEF_Tree_tags) - /sizeof(asn1_DEF_Tree_tags[0]), /* 1 */ - asn1_MBR_Tree, + asn_DEF_Tree_tags, + sizeof(asn_DEF_Tree_tags) + /sizeof(asn_DEF_Tree_tags[0]), /* 1 */ + asn_DEF_Tree_tags, /* Same as above */ + sizeof(asn_DEF_Tree_tags) + /sizeof(asn_DEF_Tree_tags[0]), /* 1 */ + asn_MBR_Tree, 2, /* Elements count */ - &asn1_DEF_Tree_specs /* Additional specs */ + &asn_DEF_Tree_specs /* Additional specs */ }; @@ -154,7 +154,7 @@ typedef enum Stuff_PR { Stuff_PR_trees, /* Member trees is present */ Stuff_PR_anything, /* Member anything is present */ } Stuff_PR; -extern asn1_TYPE_descriptor_t asn1_DEF_Stuff; +extern asn_TYPE_descriptor_t asn_DEF_Stuff; /*** <<< TYPE-DECLS [Stuff] >>> ***/ @@ -164,7 +164,7 @@ typedef struct Stuff { A_SET_OF(Forest_t) list; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } *trees; struct anything { A_SET_OF(struct anything_member { @@ -175,11 +175,11 @@ typedef struct Stuff { */ /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } ) list; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } *anything; /* Presence bitmask: ASN_SET_ISPRESENT(pStuff, Stuff_PR_x) */ @@ -187,31 +187,31 @@ typedef struct Stuff { [((2+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))]; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } Stuff_t; /*** <<< STAT-DEFS [Stuff] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_trees[] = { +static asn_TYPE_member_t asn_MBR_trees[] = { { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_Forest, + .type = (void *)&asn_DEF_Forest, .memb_constraints = 0, /* Defer to actual type */ .name = "" }, }; -static ber_tlv_tag_t asn1_DEF_trees_tags[] = { +static ber_tlv_tag_t asn_DEF_trees_tags[] = { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn1_SET_OF_specifics_t asn1_DEF_trees_specs = { +static asn_SET_OF_specifics_t asn_DEF_trees_specs = { sizeof(struct trees), - offsetof(struct trees, _ber_dec_ctx), + offsetof(struct trees, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; static /* Use -fall-defs-global to expose */ -asn1_TYPE_descriptor_t asn1_DEF_trees = { +asn_TYPE_descriptor_t asn_DEF_trees = { "trees", SET_OF_free, SET_OF_print, @@ -221,42 +221,42 @@ asn1_TYPE_descriptor_t asn1_DEF_trees = { 0, /* Not implemented yet */ SET_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_trees_tags, - sizeof(asn1_DEF_trees_tags) - /sizeof(asn1_DEF_trees_tags[0]) - 1, /* 1 */ - asn1_DEF_trees_tags, /* Same as above */ - sizeof(asn1_DEF_trees_tags) - /sizeof(asn1_DEF_trees_tags[0]), /* 2 */ - asn1_MBR_trees, + asn_DEF_trees_tags, + sizeof(asn_DEF_trees_tags) + /sizeof(asn_DEF_trees_tags[0]) - 1, /* 1 */ + asn_DEF_trees_tags, /* Same as above */ + sizeof(asn_DEF_trees_tags) + /sizeof(asn_DEF_trees_tags[0]), /* 2 */ + asn_MBR_trees, 1, /* Single element */ - &asn1_DEF_trees_specs /* Additional specs */ + &asn_DEF_trees_specs /* Additional specs */ }; -static asn1_TYPE_member_t asn1_MBR_anything_member[] = { +static asn_TYPE_member_t asn_MBR_anything_member[] = { { ATF_NOFLAGS, 0, offsetof(struct anything_member, cup_of_coffee), .tag = (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_BIT_STRING, + .type = (void *)&asn_DEF_BIT_STRING, .memb_constraints = 0, /* Defer to actual type */ .name = "cup-of-coffee" }, }; -static ber_tlv_tag_t asn1_DEF_anything_member_tags[] = { +static ber_tlv_tag_t asn_DEF_anything_member_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_TYPE_tag2member_t asn1_DEF_anything_member_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_anything_member_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 0, 0, 0 }, /* cup-of-coffee at 26 */ }; -static asn1_SEQUENCE_specifics_t asn1_DEF_anything_member_specs = { +static asn_SEQUENCE_specifics_t asn_DEF_anything_member_specs = { sizeof(struct anything_member), - offsetof(struct anything_member, _ber_dec_ctx), - asn1_DEF_anything_member_tag2el, + offsetof(struct anything_member, _asn_ctx), + asn_DEF_anything_member_tag2el, 1, /* Count of tags in the map */ 0, /* Start extensions */ 2 /* Stop extensions */ }; static /* Use -fall-defs-global to expose */ -asn1_TYPE_descriptor_t asn1_DEF_anything_member = { +asn_TYPE_descriptor_t asn_DEF_anything_member = { "", SEQUENCE_free, SEQUENCE_print, @@ -266,37 +266,37 @@ asn1_TYPE_descriptor_t asn1_DEF_anything_member = { 0, /* Not implemented yet */ SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_anything_member_tags, - sizeof(asn1_DEF_anything_member_tags) - /sizeof(asn1_DEF_anything_member_tags[0]), /* 1 */ - asn1_DEF_anything_member_tags, /* Same as above */ - sizeof(asn1_DEF_anything_member_tags) - /sizeof(asn1_DEF_anything_member_tags[0]), /* 1 */ - asn1_MBR_anything_member, + asn_DEF_anything_member_tags, + sizeof(asn_DEF_anything_member_tags) + /sizeof(asn_DEF_anything_member_tags[0]), /* 1 */ + asn_DEF_anything_member_tags, /* Same as above */ + sizeof(asn_DEF_anything_member_tags) + /sizeof(asn_DEF_anything_member_tags[0]), /* 1 */ + asn_MBR_anything_member, 1, /* Elements count */ - &asn1_DEF_anything_member_specs /* Additional specs */ + &asn_DEF_anything_member_specs /* Additional specs */ }; -static asn1_TYPE_member_t asn1_MBR_anything[] = { +static asn_TYPE_member_t asn_MBR_anything[] = { { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_anything_member, + .type = (void *)&asn_DEF_anything_member, .memb_constraints = 0, /* Defer to actual type */ .name = "" }, }; -static ber_tlv_tag_t asn1_DEF_anything_tags[] = { +static ber_tlv_tag_t asn_DEF_anything_tags[] = { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn1_SET_OF_specifics_t asn1_DEF_anything_specs = { +static asn_SET_OF_specifics_t asn_DEF_anything_specs = { sizeof(struct anything), - offsetof(struct anything, _ber_dec_ctx), + offsetof(struct anything, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; static /* Use -fall-defs-global to expose */ -asn1_TYPE_descriptor_t asn1_DEF_anything = { +asn_TYPE_descriptor_t asn_DEF_anything = { "anything", SET_OF_free, SET_OF_print, @@ -306,53 +306,53 @@ asn1_TYPE_descriptor_t asn1_DEF_anything = { 0, /* Not implemented yet */ SET_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_anything_tags, - sizeof(asn1_DEF_anything_tags) - /sizeof(asn1_DEF_anything_tags[0]) - 1, /* 1 */ - asn1_DEF_anything_tags, /* Same as above */ - sizeof(asn1_DEF_anything_tags) - /sizeof(asn1_DEF_anything_tags[0]), /* 2 */ - asn1_MBR_anything, + asn_DEF_anything_tags, + sizeof(asn_DEF_anything_tags) + /sizeof(asn_DEF_anything_tags[0]) - 1, /* 1 */ + asn_DEF_anything_tags, /* Same as above */ + sizeof(asn_DEF_anything_tags) + /sizeof(asn_DEF_anything_tags[0]), /* 2 */ + asn_MBR_anything, 1, /* Single element */ - &asn1_DEF_anything_specs /* Additional specs */ + &asn_DEF_anything_specs /* Additional specs */ }; -static asn1_TYPE_member_t asn1_MBR_Stuff[] = { +static asn_TYPE_member_t asn_MBR_Stuff[] = { { ATF_POINTER, 2, offsetof(struct Stuff, trees), .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ - .type = (void *)&asn1_DEF_trees, + .type = (void *)&asn_DEF_trees, .memb_constraints = 0, /* Defer to actual type */ .name = "trees" }, { ATF_POINTER, 1, offsetof(struct Stuff, anything), .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ - .type = (void *)&asn1_DEF_anything, + .type = (void *)&asn_DEF_anything, .memb_constraints = 0, /* Defer to actual type */ .name = "anything" }, }; -static ber_tlv_tag_t asn1_DEF_Stuff_tags[] = { +static ber_tlv_tag_t asn_DEF_Stuff_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn1_TYPE_tag2member_t asn1_DEF_Stuff_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_Stuff_tag2el[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* trees at 23 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* anything at 28 */ }; -static uint8_t asn1_DEF_Stuff_mmap[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = { +static uint8_t asn_DEF_Stuff_mmap[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = { (0 << 7) | (0 << 6) }; -static asn1_SET_specifics_t asn1_DEF_Stuff_specs = { +static asn_SET_specifics_t asn_DEF_Stuff_specs = { sizeof(struct Stuff), - offsetof(struct Stuff, _ber_dec_ctx), + offsetof(struct Stuff, _asn_ctx), offsetof(struct Stuff, _presence_map), - asn1_DEF_Stuff_tag2el, + asn_DEF_Stuff_tag2el, 2, /* Count of tags in the map */ 0, /* Whether extensible */ - (unsigned int *)asn1_DEF_Stuff_mmap /* Mandatory elements map */ + (unsigned int *)asn_DEF_Stuff_mmap /* Mandatory elements map */ }; -asn1_TYPE_descriptor_t asn1_DEF_Stuff = { +asn_TYPE_descriptor_t asn_DEF_Stuff = { "Stuff", SET_free, SET_print, @@ -362,14 +362,14 @@ asn1_TYPE_descriptor_t asn1_DEF_Stuff = { 0, /* Not implemented yet */ SET_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Stuff_tags, - sizeof(asn1_DEF_Stuff_tags) - /sizeof(asn1_DEF_Stuff_tags[0]), /* 1 */ - asn1_DEF_Stuff_tags, /* Same as above */ - sizeof(asn1_DEF_Stuff_tags) - /sizeof(asn1_DEF_Stuff_tags[0]), /* 1 */ - asn1_MBR_Stuff, + asn_DEF_Stuff_tags, + sizeof(asn_DEF_Stuff_tags) + /sizeof(asn_DEF_Stuff_tags[0]), /* 1 */ + asn_DEF_Stuff_tags, /* Same as above */ + sizeof(asn_DEF_Stuff_tags) + /sizeof(asn_DEF_Stuff_tags[0]), /* 1 */ + asn_MBR_Stuff, 2, /* Elements count */ - &asn1_DEF_Stuff_specs /* Additional specs */ + &asn_DEF_Stuff_specs /* Additional specs */ }; diff --git a/tests/32-sequence-of-OK.asn1.-P b/tests/32-sequence-of-OK.asn1.-P index e258529d9..508eb0516 100644 --- a/tests/32-sequence-of-OK.asn1.-P +++ b/tests/32-sequence-of-OK.asn1.-P @@ -7,7 +7,7 @@ /*** <<< DEPS [Programming] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Programming; +extern asn_TYPE_descriptor_t asn_DEF_Programming; /*** <<< TYPE-DECLS [Programming] >>> ***/ @@ -16,29 +16,29 @@ typedef struct Programming { A_SEQUENCE_OF(Fault_t) list; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } Programming_t; /*** <<< STAT-DEFS [Programming] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_Programming[] = { +static asn_TYPE_member_t asn_MBR_Programming[] = { { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ - .type = (void *)&asn1_DEF_Fault, + .type = (void *)&asn_DEF_Fault, .memb_constraints = 0, /* Defer to actual type */ .name = "" }, }; -static ber_tlv_tag_t asn1_DEF_Programming_tags[] = { +static ber_tlv_tag_t asn_DEF_Programming_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_SET_OF_specifics_t asn1_DEF_Programming_specs = { +static asn_SET_OF_specifics_t asn_DEF_Programming_specs = { sizeof(struct Programming), - offsetof(struct Programming, _ber_dec_ctx), + offsetof(struct Programming, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn1_TYPE_descriptor_t asn1_DEF_Programming = { +asn_TYPE_descriptor_t asn_DEF_Programming = { "Programming", SEQUENCE_OF_free, SEQUENCE_OF_print, @@ -48,15 +48,15 @@ asn1_TYPE_descriptor_t asn1_DEF_Programming = { 0, /* Not implemented yet */ SEQUENCE_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Programming_tags, - sizeof(asn1_DEF_Programming_tags) - /sizeof(asn1_DEF_Programming_tags[0]), /* 1 */ - asn1_DEF_Programming_tags, /* Same as above */ - sizeof(asn1_DEF_Programming_tags) - /sizeof(asn1_DEF_Programming_tags[0]), /* 1 */ - asn1_MBR_Programming, + asn_DEF_Programming_tags, + sizeof(asn_DEF_Programming_tags) + /sizeof(asn_DEF_Programming_tags[0]), /* 1 */ + asn_DEF_Programming_tags, /* Same as above */ + sizeof(asn_DEF_Programming_tags) + /sizeof(asn_DEF_Programming_tags[0]), /* 1 */ + asn_MBR_Programming, 1, /* Single element */ - &asn1_DEF_Programming_specs /* Additional specs */ + &asn_DEF_Programming_specs /* Additional specs */ }; @@ -68,7 +68,7 @@ asn1_TYPE_descriptor_t asn1_DEF_Programming = { /*** <<< DEPS [Fault] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Fault; +extern asn_TYPE_descriptor_t asn_DEF_Fault; /*** <<< TYPE-DECLS [Fault] >>> ***/ @@ -77,29 +77,29 @@ typedef struct Fault { A_SET_OF(Error_t) list; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } Fault_t; /*** <<< STAT-DEFS [Fault] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_Fault[] = { +static asn_TYPE_member_t asn_MBR_Fault[] = { { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_Error, + .type = (void *)&asn_DEF_Error, .memb_constraints = 0, /* Defer to actual type */ .name = "" }, }; -static ber_tlv_tag_t asn1_DEF_Fault_tags[] = { +static ber_tlv_tag_t asn_DEF_Fault_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn1_SET_OF_specifics_t asn1_DEF_Fault_specs = { +static asn_SET_OF_specifics_t asn_DEF_Fault_specs = { sizeof(struct Fault), - offsetof(struct Fault, _ber_dec_ctx), + offsetof(struct Fault, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn1_TYPE_descriptor_t asn1_DEF_Fault = { +asn_TYPE_descriptor_t asn_DEF_Fault = { "Fault", SET_OF_free, SET_OF_print, @@ -109,15 +109,15 @@ asn1_TYPE_descriptor_t asn1_DEF_Fault = { 0, /* Not implemented yet */ SET_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Fault_tags, - sizeof(asn1_DEF_Fault_tags) - /sizeof(asn1_DEF_Fault_tags[0]), /* 1 */ - asn1_DEF_Fault_tags, /* Same as above */ - sizeof(asn1_DEF_Fault_tags) - /sizeof(asn1_DEF_Fault_tags[0]), /* 1 */ - asn1_MBR_Fault, + asn_DEF_Fault_tags, + sizeof(asn_DEF_Fault_tags) + /sizeof(asn_DEF_Fault_tags[0]), /* 1 */ + asn_DEF_Fault_tags, /* Same as above */ + sizeof(asn_DEF_Fault_tags) + /sizeof(asn_DEF_Fault_tags[0]), /* 1 */ + asn_MBR_Fault, 1, /* Single element */ - &asn1_DEF_Fault_specs /* Additional specs */ + &asn_DEF_Fault_specs /* Additional specs */ }; @@ -127,7 +127,7 @@ asn1_TYPE_descriptor_t asn1_DEF_Fault = { /*** <<< DEPS [Error] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Error; +extern asn_TYPE_descriptor_t asn_DEF_Error; /*** <<< TYPE-DECLS [Error] >>> ***/ @@ -139,25 +139,25 @@ typedef struct Error { */ /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } Error_t; /*** <<< STAT-DEFS [Error] >>> ***/ -static ber_tlv_tag_t asn1_DEF_Error_tags[] = { +static ber_tlv_tag_t asn_DEF_Error_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_TYPE_tag2member_t asn1_DEF_Error_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_Error_tag2el[] = { }; -static asn1_SEQUENCE_specifics_t asn1_DEF_Error_specs = { +static asn_SEQUENCE_specifics_t asn_DEF_Error_specs = { sizeof(struct Error), - offsetof(struct Error, _ber_dec_ctx), - asn1_DEF_Error_tag2el, + offsetof(struct Error, _asn_ctx), + asn_DEF_Error_tag2el, 0, /* Count of tags in the map */ -1, /* Start extensions */ -1 /* Stop extensions */ }; -asn1_TYPE_descriptor_t asn1_DEF_Error = { +asn_TYPE_descriptor_t asn_DEF_Error = { "Error", SEQUENCE_free, SEQUENCE_print, @@ -167,13 +167,13 @@ asn1_TYPE_descriptor_t asn1_DEF_Error = { 0, /* Not implemented yet */ SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Error_tags, - sizeof(asn1_DEF_Error_tags) - /sizeof(asn1_DEF_Error_tags[0]), /* 1 */ - asn1_DEF_Error_tags, /* Same as above */ - sizeof(asn1_DEF_Error_tags) - /sizeof(asn1_DEF_Error_tags[0]), /* 1 */ + asn_DEF_Error_tags, + sizeof(asn_DEF_Error_tags) + /sizeof(asn_DEF_Error_tags[0]), /* 1 */ + asn_DEF_Error_tags, /* Same as above */ + sizeof(asn_DEF_Error_tags) + /sizeof(asn_DEF_Error_tags[0]), /* 1 */ 0, 0, /* No members */ - &asn1_DEF_Error_specs /* Additional specs */ + &asn_DEF_Error_specs /* Additional specs */ }; diff --git a/tests/39-sequence-of-OK.asn1.-P b/tests/39-sequence-of-OK.asn1.-P index b8f9f598f..6ef4a4f23 100644 --- a/tests/39-sequence-of-OK.asn1.-P +++ b/tests/39-sequence-of-OK.asn1.-P @@ -9,7 +9,7 @@ /*** <<< DEPS [T] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_T; +extern asn_TYPE_descriptor_t asn_DEF_T; /*** <<< TYPE-DECLS [T] >>> ***/ @@ -20,34 +20,34 @@ typedef struct T { A_SEQUENCE_OF(T2_t) list; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } collection; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } T_t; /*** <<< STAT-DEFS [T] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_collection[] = { +static asn_TYPE_member_t asn_MBR_collection[] = { { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_T2, + .type = (void *)&asn_DEF_T2, .memb_constraints = 0, /* Defer to actual type */ .name = "" }, }; -static ber_tlv_tag_t asn1_DEF_collection_tags[] = { +static ber_tlv_tag_t asn_DEF_collection_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_SET_OF_specifics_t asn1_DEF_collection_specs = { +static asn_SET_OF_specifics_t asn_DEF_collection_specs = { sizeof(struct collection), - offsetof(struct collection, _ber_dec_ctx), + offsetof(struct collection, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; static /* Use -fall-defs-global to expose */ -asn1_TYPE_descriptor_t asn1_DEF_collection = { +asn_TYPE_descriptor_t asn_DEF_collection = { "collection", SEQUENCE_OF_free, SEQUENCE_OF_print, @@ -57,49 +57,49 @@ asn1_TYPE_descriptor_t asn1_DEF_collection = { 0, /* Not implemented yet */ SEQUENCE_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_collection_tags, - sizeof(asn1_DEF_collection_tags) - /sizeof(asn1_DEF_collection_tags[0]), /* 1 */ - asn1_DEF_collection_tags, /* Same as above */ - sizeof(asn1_DEF_collection_tags) - /sizeof(asn1_DEF_collection_tags[0]), /* 1 */ - asn1_MBR_collection, + asn_DEF_collection_tags, + sizeof(asn_DEF_collection_tags) + /sizeof(asn_DEF_collection_tags[0]), /* 1 */ + asn_DEF_collection_tags, /* Same as above */ + sizeof(asn_DEF_collection_tags) + /sizeof(asn_DEF_collection_tags[0]), /* 1 */ + asn_MBR_collection, 1, /* Single element */ - &asn1_DEF_collection_specs /* Additional specs */ + &asn_DEF_collection_specs /* Additional specs */ }; -static asn1_TYPE_member_t asn1_MBR_T[] = { +static asn_TYPE_member_t asn_MBR_T[] = { { ATF_NOFLAGS, 0, offsetof(struct T, int), .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_INTEGER, + .type = (void *)&asn_DEF_INTEGER, .memb_constraints = 0, /* Defer to actual type */ .name = "int" }, { ATF_NOFLAGS, 0, offsetof(struct T, collection), .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_collection, + .type = (void *)&asn_DEF_collection, .memb_constraints = 0, /* Defer to actual type */ .name = "collection" }, }; -static ber_tlv_tag_t asn1_DEF_T_tags[] = { +static ber_tlv_tag_t asn_DEF_T_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_TYPE_tag2member_t asn1_DEF_T_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_T_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* int at 15 */ { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* collection at 17 */ }; -static asn1_SEQUENCE_specifics_t asn1_DEF_T_specs = { +static asn_SEQUENCE_specifics_t asn_DEF_T_specs = { sizeof(struct T), - offsetof(struct T, _ber_dec_ctx), - asn1_DEF_T_tag2el, + offsetof(struct T, _asn_ctx), + asn_DEF_T_tag2el, 2, /* Count of tags in the map */ -1, /* Start extensions */ -1 /* Stop extensions */ }; -asn1_TYPE_descriptor_t asn1_DEF_T = { +asn_TYPE_descriptor_t asn_DEF_T = { "T", SEQUENCE_free, SEQUENCE_print, @@ -109,15 +109,15 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { 0, /* Not implemented yet */ SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T_tags, - sizeof(asn1_DEF_T_tags) - /sizeof(asn1_DEF_T_tags[0]), /* 1 */ - asn1_DEF_T_tags, /* Same as above */ - sizeof(asn1_DEF_T_tags) - /sizeof(asn1_DEF_T_tags[0]), /* 1 */ - asn1_MBR_T, + asn_DEF_T_tags, + sizeof(asn_DEF_T_tags) + /sizeof(asn_DEF_T_tags[0]), /* 1 */ + asn_DEF_T_tags, /* Same as above */ + sizeof(asn_DEF_T_tags) + /sizeof(asn_DEF_T_tags[0]), /* 1 */ + asn_MBR_T, 2, /* Elements count */ - &asn1_DEF_T_specs /* Additional specs */ + &asn_DEF_T_specs /* Additional specs */ }; @@ -129,7 +129,7 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { /*** <<< DEPS [T2] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_T2; +extern asn_TYPE_descriptor_t asn_DEF_T2; /*** <<< TYPE-DECLS [T2] >>> ***/ @@ -139,43 +139,43 @@ typedef struct T2 { UTF8String_t str; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } T2_t; /*** <<< STAT-DEFS [T2] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_T2[] = { +static asn_TYPE_member_t asn_MBR_T2[] = { { ATF_NOFLAGS, 0, offsetof(struct T2, flag), .tag = (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_BOOLEAN, + .type = (void *)&asn_DEF_BOOLEAN, .memb_constraints = 0, /* Defer to actual type */ .name = "flag" }, { ATF_NOFLAGS, 0, offsetof(struct T2, str), .tag = (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_UTF8String, + .type = (void *)&asn_DEF_UTF8String, .memb_constraints = 0, /* Defer to actual type */ .name = "str" }, }; -static ber_tlv_tag_t asn1_DEF_T2_tags[] = { +static ber_tlv_tag_t asn_DEF_T2_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_TYPE_tag2member_t asn1_DEF_T2_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_T2_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 0, 0, 0 }, /* flag at 20 */ { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), 1, 0, 0 }, /* str at 21 */ }; -static asn1_SEQUENCE_specifics_t asn1_DEF_T2_specs = { +static asn_SEQUENCE_specifics_t asn_DEF_T2_specs = { sizeof(struct T2), - offsetof(struct T2, _ber_dec_ctx), - asn1_DEF_T2_tag2el, + offsetof(struct T2, _asn_ctx), + asn_DEF_T2_tag2el, 2, /* Count of tags in the map */ -1, /* Start extensions */ -1 /* Stop extensions */ }; -asn1_TYPE_descriptor_t asn1_DEF_T2 = { +asn_TYPE_descriptor_t asn_DEF_T2 = { "T2", SEQUENCE_free, SEQUENCE_print, @@ -185,14 +185,14 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { 0, /* Not implemented yet */ SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T2_tags, - sizeof(asn1_DEF_T2_tags) - /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ - asn1_DEF_T2_tags, /* Same as above */ - sizeof(asn1_DEF_T2_tags) - /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ - asn1_MBR_T2, + asn_DEF_T2_tags, + sizeof(asn_DEF_T2_tags) + /sizeof(asn_DEF_T2_tags[0]), /* 1 */ + asn_DEF_T2_tags, /* Same as above */ + sizeof(asn_DEF_T2_tags) + /sizeof(asn_DEF_T2_tags[0]), /* 1 */ + asn_MBR_T2, 2, /* Elements count */ - &asn1_DEF_T2_specs /* Additional specs */ + &asn_DEF_T2_specs /* Additional specs */ }; diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index f26068f79..1bfd634df 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -9,7 +9,7 @@ /*** <<< DEPS [LogLine] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_LogLine; +extern asn_TYPE_descriptor_t asn_DEF_LogLine; /*** <<< TYPE-DECLS [LogLine] >>> ***/ @@ -20,7 +20,7 @@ typedef struct LogLine { A_SEQUENCE_OF(VariablePartSet_t) list; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } varsets; /* * This type is extensible, @@ -28,13 +28,13 @@ typedef struct LogLine { */ /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } LogLine_t; /*** <<< CODE [LogLine] >>> ***/ static int -memb_varsets_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +memb_varsets_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { size_t size; @@ -65,25 +65,25 @@ memb_varsets_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /*** <<< STAT-DEFS [LogLine] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_varsets[] = { +static asn_TYPE_member_t asn_MBR_varsets[] = { { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_VariablePartSet, + .type = (void *)&asn_DEF_VariablePartSet, .memb_constraints = 0, /* Defer to actual type */ .name = "" }, }; -static ber_tlv_tag_t asn1_DEF_varsets_tags[] = { +static ber_tlv_tag_t asn_DEF_varsets_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_SET_OF_specifics_t asn1_DEF_varsets_specs = { +static asn_SET_OF_specifics_t asn_DEF_varsets_specs = { sizeof(struct varsets), - offsetof(struct varsets, _ber_dec_ctx), + offsetof(struct varsets, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; static /* Use -fall-defs-global to expose */ -asn1_TYPE_descriptor_t asn1_DEF_varsets = { +asn_TYPE_descriptor_t asn_DEF_varsets = { "varsets", SEQUENCE_OF_free, SEQUENCE_OF_print, @@ -93,49 +93,49 @@ asn1_TYPE_descriptor_t asn1_DEF_varsets = { 0, /* Not implemented yet */ SEQUENCE_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_varsets_tags, - sizeof(asn1_DEF_varsets_tags) - /sizeof(asn1_DEF_varsets_tags[0]), /* 1 */ - asn1_DEF_varsets_tags, /* Same as above */ - sizeof(asn1_DEF_varsets_tags) - /sizeof(asn1_DEF_varsets_tags[0]), /* 1 */ - asn1_MBR_varsets, + asn_DEF_varsets_tags, + sizeof(asn_DEF_varsets_tags) + /sizeof(asn_DEF_varsets_tags[0]), /* 1 */ + asn_DEF_varsets_tags, /* Same as above */ + sizeof(asn_DEF_varsets_tags) + /sizeof(asn_DEF_varsets_tags[0]), /* 1 */ + asn_MBR_varsets, 1, /* Single element */ - &asn1_DEF_varsets_specs /* Additional specs */ + &asn_DEF_varsets_specs /* Additional specs */ }; -static asn1_TYPE_member_t asn1_MBR_LogLine[] = { +static asn_TYPE_member_t asn_MBR_LogLine[] = { { ATF_NOFLAGS, 0, offsetof(struct LogLine, line_digest), .tag = (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_IA5String, + .type = (void *)&asn_DEF_IA5String, .memb_constraints = 0, /* Defer to actual type */ .name = "line-digest" }, { ATF_NOFLAGS, 0, offsetof(struct LogLine, varsets), .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_varsets, + .type = (void *)&asn_DEF_varsets, .memb_constraints = memb_varsets_1_constraint, .name = "varsets" }, }; -static ber_tlv_tag_t asn1_DEF_LogLine_tags[] = { +static ber_tlv_tag_t asn_DEF_LogLine_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_TYPE_tag2member_t asn1_DEF_LogLine_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_LogLine_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* varsets at 25 */ { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), 0, 0, 0 }, /* line-digest at 23 */ }; -static asn1_SEQUENCE_specifics_t asn1_DEF_LogLine_specs = { +static asn_SEQUENCE_specifics_t asn_DEF_LogLine_specs = { sizeof(struct LogLine), - offsetof(struct LogLine, _ber_dec_ctx), - asn1_DEF_LogLine_tag2el, + offsetof(struct LogLine, _asn_ctx), + asn_DEF_LogLine_tag2el, 2, /* Count of tags in the map */ 1, /* Start extensions */ 3 /* Stop extensions */ }; -asn1_TYPE_descriptor_t asn1_DEF_LogLine = { +asn_TYPE_descriptor_t asn_DEF_LogLine = { "LogLine", SEQUENCE_free, SEQUENCE_print, @@ -145,15 +145,15 @@ asn1_TYPE_descriptor_t asn1_DEF_LogLine = { 0, /* Not implemented yet */ SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_LogLine_tags, - sizeof(asn1_DEF_LogLine_tags) - /sizeof(asn1_DEF_LogLine_tags[0]), /* 1 */ - asn1_DEF_LogLine_tags, /* Same as above */ - sizeof(asn1_DEF_LogLine_tags) - /sizeof(asn1_DEF_LogLine_tags[0]), /* 1 */ - asn1_MBR_LogLine, + asn_DEF_LogLine_tags, + sizeof(asn_DEF_LogLine_tags) + /sizeof(asn_DEF_LogLine_tags[0]), /* 1 */ + asn_DEF_LogLine_tags, /* Same as above */ + sizeof(asn_DEF_LogLine_tags) + /sizeof(asn_DEF_LogLine_tags[0]), /* 1 */ + asn_MBR_LogLine, 2, /* Elements count */ - &asn1_DEF_LogLine_specs /* Additional specs */ + &asn_DEF_LogLine_specs /* Additional specs */ }; @@ -167,7 +167,7 @@ asn1_TYPE_descriptor_t asn1_DEF_LogLine = { /*** <<< DEPS [VariablePartSet] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_VariablePartSet; +extern asn_TYPE_descriptor_t asn_DEF_VariablePartSet; /*** <<< TYPE-DECLS [VariablePartSet] >>> ***/ @@ -177,7 +177,7 @@ typedef struct VariablePartSet { A_SEQUENCE_OF(VariablePart_t) list; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } vparts; ActionItem_t resolution; /* @@ -186,13 +186,13 @@ typedef struct VariablePartSet { */ /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } VariablePartSet_t; /*** <<< CODE [VariablePartSet] >>> ***/ static int -memb_vparts_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +memb_vparts_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { if(!sptr) { @@ -213,25 +213,25 @@ memb_vparts_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /*** <<< STAT-DEFS [VariablePartSet] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_vparts[] = { +static asn_TYPE_member_t asn_MBR_vparts[] = { { ATF_NOFLAGS, 0, 0, .tag = -1 /* Ambiguous tag (CHOICE?) */, .tag_mode = 0, - .type = (void *)&asn1_DEF_VariablePart, + .type = (void *)&asn_DEF_VariablePart, .memb_constraints = 0, /* Defer to actual type */ .name = "" }, }; -static ber_tlv_tag_t asn1_DEF_vparts_tags[] = { +static ber_tlv_tag_t asn_DEF_vparts_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_SET_OF_specifics_t asn1_DEF_vparts_specs = { +static asn_SET_OF_specifics_t asn_DEF_vparts_specs = { sizeof(struct vparts), - offsetof(struct vparts, _ber_dec_ctx), + offsetof(struct vparts, _asn_ctx), 1, /* XER encoding is XMLValueList */ }; static /* Use -fall-defs-global to expose */ -asn1_TYPE_descriptor_t asn1_DEF_vparts = { +asn_TYPE_descriptor_t asn_DEF_vparts = { "vparts", SEQUENCE_OF_free, SEQUENCE_OF_print, @@ -241,49 +241,49 @@ asn1_TYPE_descriptor_t asn1_DEF_vparts = { 0, /* Not implemented yet */ SEQUENCE_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_vparts_tags, - sizeof(asn1_DEF_vparts_tags) - /sizeof(asn1_DEF_vparts_tags[0]), /* 1 */ - asn1_DEF_vparts_tags, /* Same as above */ - sizeof(asn1_DEF_vparts_tags) - /sizeof(asn1_DEF_vparts_tags[0]), /* 1 */ - asn1_MBR_vparts, + asn_DEF_vparts_tags, + sizeof(asn_DEF_vparts_tags) + /sizeof(asn_DEF_vparts_tags[0]), /* 1 */ + asn_DEF_vparts_tags, /* Same as above */ + sizeof(asn_DEF_vparts_tags) + /sizeof(asn_DEF_vparts_tags[0]), /* 1 */ + asn_MBR_vparts, 1, /* Single element */ - &asn1_DEF_vparts_specs /* Additional specs */ + &asn_DEF_vparts_specs /* Additional specs */ }; -static asn1_TYPE_member_t asn1_MBR_VariablePartSet[] = { +static asn_TYPE_member_t asn_MBR_VariablePartSet[] = { { ATF_NOFLAGS, 0, offsetof(struct VariablePartSet, vparts), .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_vparts, + .type = (void *)&asn_DEF_vparts, .memb_constraints = memb_vparts_2_constraint, .name = "vparts" }, { ATF_NOFLAGS, 0, offsetof(struct VariablePartSet, resolution), .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_ActionItem, + .type = (void *)&asn_DEF_ActionItem, .memb_constraints = 0, /* Defer to actual type */ .name = "resolution" }, }; -static ber_tlv_tag_t asn1_DEF_VariablePartSet_tags[] = { +static ber_tlv_tag_t asn_DEF_VariablePartSet_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_TYPE_tag2member_t asn1_DEF_VariablePartSet_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_VariablePartSet_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* vparts at 33 */ { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 0 }, /* resolution at 35 */ }; -static asn1_SEQUENCE_specifics_t asn1_DEF_VariablePartSet_specs = { +static asn_SEQUENCE_specifics_t asn_DEF_VariablePartSet_specs = { sizeof(struct VariablePartSet), - offsetof(struct VariablePartSet, _ber_dec_ctx), - asn1_DEF_VariablePartSet_tag2el, + offsetof(struct VariablePartSet, _asn_ctx), + asn_DEF_VariablePartSet_tag2el, 2, /* Count of tags in the map */ 1, /* Start extensions */ 3 /* Stop extensions */ }; -asn1_TYPE_descriptor_t asn1_DEF_VariablePartSet = { +asn_TYPE_descriptor_t asn_DEF_VariablePartSet = { "VariablePartSet", SEQUENCE_free, SEQUENCE_print, @@ -293,15 +293,15 @@ asn1_TYPE_descriptor_t asn1_DEF_VariablePartSet = { 0, /* Not implemented yet */ SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_VariablePartSet_tags, - sizeof(asn1_DEF_VariablePartSet_tags) - /sizeof(asn1_DEF_VariablePartSet_tags[0]), /* 1 */ - asn1_DEF_VariablePartSet_tags, /* Same as above */ - sizeof(asn1_DEF_VariablePartSet_tags) - /sizeof(asn1_DEF_VariablePartSet_tags[0]), /* 1 */ - asn1_MBR_VariablePartSet, + asn_DEF_VariablePartSet_tags, + sizeof(asn_DEF_VariablePartSet_tags) + /sizeof(asn_DEF_VariablePartSet_tags[0]), /* 1 */ + asn_DEF_VariablePartSet_tags, /* Same as above */ + sizeof(asn_DEF_VariablePartSet_tags) + /sizeof(asn_DEF_VariablePartSet_tags[0]), /* 1 */ + asn_MBR_VariablePartSet, 2, /* Elements count */ - &asn1_DEF_VariablePartSet_specs /* Additional specs */ + &asn_DEF_VariablePartSet_specs /* Additional specs */ }; @@ -321,7 +321,7 @@ typedef enum VariablePart_PR { VariablePart_PR_vrange, /* Extensions may appear below */ } VariablePart_PR; -extern asn1_TYPE_descriptor_t asn1_DEF_VariablePart; +extern asn_TYPE_descriptor_t asn_DEF_VariablePart; /*** <<< TYPE-DECLS [VariablePart] >>> ***/ @@ -333,7 +333,7 @@ typedef struct VariablePart { A_SET_OF(VisibleString_t) list; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } vset; struct vrange { VisibleString_t from; @@ -344,7 +344,7 @@ typedef struct VariablePart { */ /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } vrange; /* * This type is extensible, @@ -353,13 +353,13 @@ typedef struct VariablePart { } choice; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } VariablePart_t; /*** <<< CODE [VariablePart] >>> ***/ static int -memb_vset_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +memb_vset_3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { size_t size; @@ -390,25 +390,25 @@ memb_vset_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /*** <<< STAT-DEFS [VariablePart] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_vset[] = { +static asn_TYPE_member_t asn_MBR_vset[] = { { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_VisibleString, + .type = (void *)&asn_DEF_VisibleString, .memb_constraints = 0, /* Defer to actual type */ .name = "" }, }; -static ber_tlv_tag_t asn1_DEF_vset_tags[] = { +static ber_tlv_tag_t asn_DEF_vset_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn1_SET_OF_specifics_t asn1_DEF_vset_specs = { +static asn_SET_OF_specifics_t asn_DEF_vset_specs = { sizeof(struct vset), - offsetof(struct vset, _ber_dec_ctx), + offsetof(struct vset, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; static /* Use -fall-defs-global to expose */ -asn1_TYPE_descriptor_t asn1_DEF_vset = { +asn_TYPE_descriptor_t asn_DEF_vset = { "vset", SET_OF_free, SET_OF_print, @@ -418,50 +418,50 @@ asn1_TYPE_descriptor_t asn1_DEF_vset = { 0, /* Not implemented yet */ SET_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_vset_tags, - sizeof(asn1_DEF_vset_tags) - /sizeof(asn1_DEF_vset_tags[0]), /* 1 */ - asn1_DEF_vset_tags, /* Same as above */ - sizeof(asn1_DEF_vset_tags) - /sizeof(asn1_DEF_vset_tags[0]), /* 1 */ - asn1_MBR_vset, + asn_DEF_vset_tags, + sizeof(asn_DEF_vset_tags) + /sizeof(asn_DEF_vset_tags[0]), /* 1 */ + asn_DEF_vset_tags, /* Same as above */ + sizeof(asn_DEF_vset_tags) + /sizeof(asn_DEF_vset_tags[0]), /* 1 */ + asn_MBR_vset, 1, /* Single element */ - &asn1_DEF_vset_specs /* Additional specs */ + &asn_DEF_vset_specs /* Additional specs */ }; -static asn1_TYPE_member_t asn1_MBR_vrange[] = { +static asn_TYPE_member_t asn_MBR_vrange[] = { { ATF_NOFLAGS, 0, offsetof(struct vrange, from), .tag = (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_VisibleString, + .type = (void *)&asn_DEF_VisibleString, .memb_constraints = 0, /* Defer to actual type */ .name = "from" }, { ATF_NOFLAGS, 0, offsetof(struct vrange, to), .tag = (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_VisibleString, + .type = (void *)&asn_DEF_VisibleString, .memb_constraints = 0, /* Defer to actual type */ .name = "to" }, }; -static ber_tlv_tag_t asn1_DEF_vrange_tags[] = { +static ber_tlv_tag_t asn_DEF_vrange_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_TYPE_tag2member_t asn1_DEF_vrange_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_vrange_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), 0, 0, 1 }, /* from at 45 */ { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), 1, -1, 0 }, /* to at 46 */ }; -static asn1_SEQUENCE_specifics_t asn1_DEF_vrange_specs = { +static asn_SEQUENCE_specifics_t asn_DEF_vrange_specs = { sizeof(struct vrange), - offsetof(struct vrange, _ber_dec_ctx), - asn1_DEF_vrange_tag2el, + offsetof(struct vrange, _asn_ctx), + asn_DEF_vrange_tag2el, 2, /* Count of tags in the map */ 1, /* Start extensions */ 3 /* Stop extensions */ }; static /* Use -fall-defs-global to expose */ -asn1_TYPE_descriptor_t asn1_DEF_vrange = { +asn_TYPE_descriptor_t asn_DEF_vrange = { "vrange", SEQUENCE_free, SEQUENCE_print, @@ -471,47 +471,47 @@ asn1_TYPE_descriptor_t asn1_DEF_vrange = { 0, /* Not implemented yet */ SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_vrange_tags, - sizeof(asn1_DEF_vrange_tags) - /sizeof(asn1_DEF_vrange_tags[0]), /* 1 */ - asn1_DEF_vrange_tags, /* Same as above */ - sizeof(asn1_DEF_vrange_tags) - /sizeof(asn1_DEF_vrange_tags[0]), /* 1 */ - asn1_MBR_vrange, + asn_DEF_vrange_tags, + sizeof(asn_DEF_vrange_tags) + /sizeof(asn_DEF_vrange_tags[0]), /* 1 */ + asn_DEF_vrange_tags, /* Same as above */ + sizeof(asn_DEF_vrange_tags) + /sizeof(asn_DEF_vrange_tags[0]), /* 1 */ + asn_MBR_vrange, 2, /* Elements count */ - &asn1_DEF_vrange_specs /* Additional specs */ + &asn_DEF_vrange_specs /* Additional specs */ }; -static asn1_TYPE_member_t asn1_MBR_VariablePart[] = { +static asn_TYPE_member_t asn_MBR_VariablePart[] = { { ATF_NOFLAGS, 0, offsetof(struct VariablePart, choice.vset), .tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_vset, + .type = (void *)&asn_DEF_vset, .memb_constraints = memb_vset_3_constraint, .name = "vset" }, { ATF_NOFLAGS, 0, offsetof(struct VariablePart, choice.vrange), .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_vrange, + .type = (void *)&asn_DEF_vrange, .memb_constraints = 0, /* Defer to actual type */ .name = "vrange" }, }; -static asn1_TYPE_tag2member_t asn1_DEF_VariablePart_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_VariablePart_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* vrange at 45 */ { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0, 0, 0 }, /* vset at 42 */ }; -static asn1_CHOICE_specifics_t asn1_DEF_VariablePart_specs = { +static asn_CHOICE_specifics_t asn_DEF_VariablePart_specs = { sizeof(struct VariablePart), - offsetof(struct VariablePart, _ber_dec_ctx), + offsetof(struct VariablePart, _asn_ctx), offsetof(struct VariablePart, present), sizeof(((struct VariablePart *)0)->present), - asn1_DEF_VariablePart_tag2el, + asn_DEF_VariablePart_tag2el, 2, /* Count of tags in the map */ 1 /* Whether extensible */ }; -asn1_TYPE_descriptor_t asn1_DEF_VariablePart = { +asn_TYPE_descriptor_t asn_DEF_VariablePart = { "VariablePart", CHOICE_free, CHOICE_print, @@ -525,9 +525,9 @@ asn1_TYPE_descriptor_t asn1_DEF_VariablePart = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - asn1_MBR_VariablePart, + asn_MBR_VariablePart, 2, /* Elements count */ - &asn1_DEF_VariablePart_specs /* Additional specs */ + &asn_DEF_VariablePart_specs /* Additional specs */ }; @@ -550,7 +550,7 @@ typedef enum accept_as { * Enumeration is extensible */ } accept_as_e; -extern asn1_TYPE_descriptor_t asn1_DEF_ActionItem; +extern asn_TYPE_descriptor_t asn_DEF_ActionItem; /*** <<< TYPE-DECLS [ActionItem] >>> ***/ @@ -563,7 +563,7 @@ typedef struct ActionItem { A_SET_OF(VisibleString_t) list; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } email; /* * This type is extensible, @@ -571,7 +571,7 @@ typedef struct ActionItem { */ /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } *notify; /* * This type is extensible, @@ -579,30 +579,30 @@ typedef struct ActionItem { */ /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } ActionItem_t; /*** <<< STAT-DEFS [ActionItem] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_email[] = { +static asn_TYPE_member_t asn_MBR_email[] = { { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_VisibleString, + .type = (void *)&asn_DEF_VisibleString, .memb_constraints = 0, /* Defer to actual type */ .name = "" }, }; -static ber_tlv_tag_t asn1_DEF_email_tags[] = { +static ber_tlv_tag_t asn_DEF_email_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn1_SET_OF_specifics_t asn1_DEF_email_specs = { +static asn_SET_OF_specifics_t asn_DEF_email_specs = { sizeof(struct email), - offsetof(struct email, _ber_dec_ctx), + offsetof(struct email, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; static /* Use -fall-defs-global to expose */ -asn1_TYPE_descriptor_t asn1_DEF_email = { +asn_TYPE_descriptor_t asn_DEF_email = { "email", SET_OF_free, SET_OF_print, @@ -612,50 +612,50 @@ asn1_TYPE_descriptor_t asn1_DEF_email = { 0, /* Not implemented yet */ SET_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_email_tags, - sizeof(asn1_DEF_email_tags) - /sizeof(asn1_DEF_email_tags[0]), /* 1 */ - asn1_DEF_email_tags, /* Same as above */ - sizeof(asn1_DEF_email_tags) - /sizeof(asn1_DEF_email_tags[0]), /* 1 */ - asn1_MBR_email, + asn_DEF_email_tags, + sizeof(asn_DEF_email_tags) + /sizeof(asn_DEF_email_tags[0]), /* 1 */ + asn_DEF_email_tags, /* Same as above */ + sizeof(asn_DEF_email_tags) + /sizeof(asn_DEF_email_tags[0]), /* 1 */ + asn_MBR_email, 1, /* Single element */ - &asn1_DEF_email_specs /* Additional specs */ + &asn_DEF_email_specs /* Additional specs */ }; -static asn1_TYPE_member_t asn1_MBR_notify[] = { +static asn_TYPE_member_t asn_MBR_notify[] = { { ATF_NOFLAGS, 0, offsetof(struct notify, critical), .tag = (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_BOOLEAN, + .type = (void *)&asn_DEF_BOOLEAN, .memb_constraints = 0, /* Defer to actual type */ .name = "critical" }, { ATF_NOFLAGS, 0, offsetof(struct notify, email), .tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_email, + .type = (void *)&asn_DEF_email, .memb_constraints = 0, /* Defer to actual type */ .name = "email" }, }; -static ber_tlv_tag_t asn1_DEF_notify_tags[] = { +static ber_tlv_tag_t asn_DEF_notify_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_TYPE_tag2member_t asn1_DEF_notify_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_notify_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 0, 0, 0 }, /* critical at 61 */ { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 1, 0, 0 }, /* email at 62 */ }; -static asn1_SEQUENCE_specifics_t asn1_DEF_notify_specs = { +static asn_SEQUENCE_specifics_t asn_DEF_notify_specs = { sizeof(struct notify), - offsetof(struct notify, _ber_dec_ctx), - asn1_DEF_notify_tag2el, + offsetof(struct notify, _asn_ctx), + asn_DEF_notify_tag2el, 2, /* Count of tags in the map */ 1, /* Start extensions */ 3 /* Stop extensions */ }; static /* Use -fall-defs-global to expose */ -asn1_TYPE_descriptor_t asn1_DEF_notify = { +asn_TYPE_descriptor_t asn_DEF_notify = { "notify", SEQUENCE_free, SEQUENCE_print, @@ -665,49 +665,49 @@ asn1_TYPE_descriptor_t asn1_DEF_notify = { 0, /* Not implemented yet */ SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_notify_tags, - sizeof(asn1_DEF_notify_tags) - /sizeof(asn1_DEF_notify_tags[0]), /* 1 */ - asn1_DEF_notify_tags, /* Same as above */ - sizeof(asn1_DEF_notify_tags) - /sizeof(asn1_DEF_notify_tags[0]), /* 1 */ - asn1_MBR_notify, + asn_DEF_notify_tags, + sizeof(asn_DEF_notify_tags) + /sizeof(asn_DEF_notify_tags[0]), /* 1 */ + asn_DEF_notify_tags, /* Same as above */ + sizeof(asn_DEF_notify_tags) + /sizeof(asn_DEF_notify_tags[0]), /* 1 */ + asn_MBR_notify, 2, /* Elements count */ - &asn1_DEF_notify_specs /* Additional specs */ + &asn_DEF_notify_specs /* Additional specs */ }; -static asn1_TYPE_member_t asn1_MBR_ActionItem[] = { +static asn_TYPE_member_t asn_MBR_ActionItem[] = { { ATF_NOFLAGS, 0, offsetof(struct ActionItem, accept_as), .tag = (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_ENUMERATED, + .type = (void *)&asn_DEF_ENUMERATED, .memb_constraints = 0, /* Defer to actual type */ .name = "accept-as" }, { ATF_POINTER, 1, offsetof(struct ActionItem, notify), .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_notify, + .type = (void *)&asn_DEF_notify, .memb_constraints = 0, /* Defer to actual type */ .name = "notify" }, }; -static ber_tlv_tag_t asn1_DEF_ActionItem_tags[] = { +static ber_tlv_tag_t asn_DEF_ActionItem_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_TYPE_tag2member_t asn1_DEF_ActionItem_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_ActionItem_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, 0, 0 }, /* accept-as at 55 */ { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* notify at 61 */ }; -static asn1_SEQUENCE_specifics_t asn1_DEF_ActionItem_specs = { +static asn_SEQUENCE_specifics_t asn_DEF_ActionItem_specs = { sizeof(struct ActionItem), - offsetof(struct ActionItem, _ber_dec_ctx), - asn1_DEF_ActionItem_tag2el, + offsetof(struct ActionItem, _asn_ctx), + asn_DEF_ActionItem_tag2el, 2, /* Count of tags in the map */ 1, /* Start extensions */ 3 /* Stop extensions */ }; -asn1_TYPE_descriptor_t asn1_DEF_ActionItem = { +asn_TYPE_descriptor_t asn_DEF_ActionItem = { "ActionItem", SEQUENCE_free, SEQUENCE_print, @@ -717,14 +717,14 @@ asn1_TYPE_descriptor_t asn1_DEF_ActionItem = { 0, /* Not implemented yet */ SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_ActionItem_tags, - sizeof(asn1_DEF_ActionItem_tags) - /sizeof(asn1_DEF_ActionItem_tags[0]), /* 1 */ - asn1_DEF_ActionItem_tags, /* Same as above */ - sizeof(asn1_DEF_ActionItem_tags) - /sizeof(asn1_DEF_ActionItem_tags[0]), /* 1 */ - asn1_MBR_ActionItem, + asn_DEF_ActionItem_tags, + sizeof(asn_DEF_ActionItem_tags) + /sizeof(asn_DEF_ActionItem_tags[0]), /* 1 */ + asn_DEF_ActionItem_tags, /* Same as above */ + sizeof(asn_DEF_ActionItem_tags) + /sizeof(asn_DEF_ActionItem_tags[0]), /* 1 */ + asn_MBR_ActionItem, 2, /* Elements count */ - &asn1_DEF_ActionItem_specs /* Additional specs */ + &asn_DEF_ActionItem_specs /* Additional specs */ }; diff --git a/tests/44-choice-in-sequence-OK.asn1.-P b/tests/44-choice-in-sequence-OK.asn1.-P index 09b999a26..8b3106d8d 100644 --- a/tests/44-choice-in-sequence-OK.asn1.-P +++ b/tests/44-choice-in-sequence-OK.asn1.-P @@ -24,7 +24,7 @@ typedef enum h_PR { h_PR_i, h_PR_j, } h_PR; -extern asn1_TYPE_descriptor_t asn1_DEF_T; +extern asn_TYPE_descriptor_t asn_DEF_T; /*** <<< TYPE-DECLS [T] >>> ***/ @@ -44,7 +44,7 @@ typedef struct T { } choice; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } e; struct h { h_PR present; @@ -54,51 +54,51 @@ typedef struct T { } choice; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } h; } choice; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } b; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } T_t; /*** <<< STAT-DEFS [T] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_e[] = { +static asn_TYPE_member_t asn_MBR_e[] = { { ATF_NOFLAGS, 0, offsetof(struct e, choice.f), .tag = (ASN_TAG_CLASS_PRIVATE | (7 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ - .type = (void *)&asn1_DEF_NULL, + .type = (void *)&asn_DEF_NULL, .memb_constraints = 0, /* Defer to actual type */ .name = "f" }, { ATF_NOFLAGS, 0, offsetof(struct e, choice.g), .tag = (ASN_TAG_CLASS_PRIVATE | (8 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ - .type = (void *)&asn1_DEF_NULL, + .type = (void *)&asn_DEF_NULL, .memb_constraints = 0, /* Defer to actual type */ .name = "g" }, }; -static asn1_TYPE_tag2member_t asn1_DEF_e_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_e_tag2el[] = { { (ASN_TAG_CLASS_PRIVATE | (7 << 2)), 0, 0, 0 }, /* f at 20 */ { (ASN_TAG_CLASS_PRIVATE | (8 << 2)), 1, 0, 0 }, /* g at 21 */ }; -static asn1_CHOICE_specifics_t asn1_DEF_e_specs = { +static asn_CHOICE_specifics_t asn_DEF_e_specs = { sizeof(struct e), - offsetof(struct e, _ber_dec_ctx), + offsetof(struct e, _asn_ctx), offsetof(struct e, present), sizeof(((struct e *)0)->present), - asn1_DEF_e_tag2el, + asn_DEF_e_tag2el, 2, /* Count of tags in the map */ 0 /* Whether extensible */ }; static /* Use -fall-defs-global to expose */ -asn1_TYPE_descriptor_t asn1_DEF_e = { +asn_TYPE_descriptor_t asn_DEF_e = { "e", CHOICE_free, CHOICE_print, @@ -112,42 +112,42 @@ asn1_TYPE_descriptor_t asn1_DEF_e = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - asn1_MBR_e, + asn_MBR_e, 2, /* Elements count */ - &asn1_DEF_e_specs /* Additional specs */ + &asn_DEF_e_specs /* Additional specs */ }; -static asn1_TYPE_member_t asn1_MBR_h[] = { +static asn_TYPE_member_t asn_MBR_h[] = { { ATF_NOFLAGS, 0, offsetof(struct h, choice.i), .tag = (ASN_TAG_CLASS_PRIVATE | (1 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ - .type = (void *)&asn1_DEF_NULL, + .type = (void *)&asn_DEF_NULL, .memb_constraints = 0, /* Defer to actual type */ .name = "i" }, { ATF_NOFLAGS, 0, offsetof(struct h, choice.j), .tag = (ASN_TAG_CLASS_PRIVATE | (2 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ - .type = (void *)&asn1_DEF_NULL, + .type = (void *)&asn_DEF_NULL, .memb_constraints = 0, /* Defer to actual type */ .name = "j" }, }; -static asn1_TYPE_tag2member_t asn1_DEF_h_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_h_tag2el[] = { { (ASN_TAG_CLASS_PRIVATE | (1 << 2)), 0, 0, 0 }, /* i at 24 */ { (ASN_TAG_CLASS_PRIVATE | (2 << 2)), 1, 0, 0 }, /* j at 25 */ }; -static asn1_CHOICE_specifics_t asn1_DEF_h_specs = { +static asn_CHOICE_specifics_t asn_DEF_h_specs = { sizeof(struct h), - offsetof(struct h, _ber_dec_ctx), + offsetof(struct h, _asn_ctx), offsetof(struct h, present), sizeof(((struct h *)0)->present), - asn1_DEF_h_tag2el, + asn_DEF_h_tag2el, 2, /* Count of tags in the map */ 0 /* Whether extensible */ }; static /* Use -fall-defs-global to expose */ -asn1_TYPE_descriptor_t asn1_DEF_h = { +asn_TYPE_descriptor_t asn_DEF_h = { "h", CHOICE_free, CHOICE_print, @@ -161,59 +161,59 @@ asn1_TYPE_descriptor_t asn1_DEF_h = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - asn1_MBR_h, + asn_MBR_h, 2, /* Elements count */ - &asn1_DEF_h_specs /* Additional specs */ + &asn_DEF_h_specs /* Additional specs */ }; -static asn1_TYPE_member_t asn1_MBR_b[] = { +static asn_TYPE_member_t asn_MBR_b[] = { { ATF_NOFLAGS, 0, offsetof(struct b, choice.c), .tag = (ASN_TAG_CLASS_PRIVATE | (5 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ - .type = (void *)&asn1_DEF_NULL, + .type = (void *)&asn_DEF_NULL, .memb_constraints = 0, /* Defer to actual type */ .name = "c" }, { ATF_NOFLAGS, 0, offsetof(struct b, choice.d), .tag = (ASN_TAG_CLASS_PRIVATE | (6 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ - .type = (void *)&asn1_DEF_NULL, + .type = (void *)&asn_DEF_NULL, .memb_constraints = 0, /* Defer to actual type */ .name = "d" }, { ATF_NOFLAGS, 0, offsetof(struct b, choice.e), .tag = -1 /* Ambiguous tag (CHOICE?) */, .tag_mode = 0, - .type = (void *)&asn1_DEF_e, + .type = (void *)&asn_DEF_e, .memb_constraints = 0, /* Defer to actual type */ .name = "e" }, { ATF_NOFLAGS, 0, offsetof(struct b, choice.h), .tag = (ASN_TAG_CLASS_PRIVATE | (9 << 2)), .tag_mode = +1, /* EXPLICIT tag at current level */ - .type = (void *)&asn1_DEF_h, + .type = (void *)&asn_DEF_h, .memb_constraints = 0, /* Defer to actual type */ .name = "h" }, }; -static asn1_TYPE_tag2member_t asn1_DEF_b_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_b_tag2el[] = { { (ASN_TAG_CLASS_PRIVATE | (5 << 2)), 0, 0, 0 }, /* c at 17 */ { (ASN_TAG_CLASS_PRIVATE | (6 << 2)), 1, 0, 0 }, /* d at 18 */ { (ASN_TAG_CLASS_PRIVATE | (7 << 2)), 2, 0, 0 }, /* f at 20 */ { (ASN_TAG_CLASS_PRIVATE | (8 << 2)), 2, 0, 0 }, /* g at 21 */ { (ASN_TAG_CLASS_PRIVATE | (9 << 2)), 3, 0, 0 }, /* h at 24 */ }; -static asn1_CHOICE_specifics_t asn1_DEF_b_specs = { +static asn_CHOICE_specifics_t asn_DEF_b_specs = { sizeof(struct b), - offsetof(struct b, _ber_dec_ctx), + offsetof(struct b, _asn_ctx), offsetof(struct b, present), sizeof(((struct b *)0)->present), - asn1_DEF_b_tag2el, + asn_DEF_b_tag2el, 5, /* Count of tags in the map */ 0 /* Whether extensible */ }; static /* Use -fall-defs-global to expose */ -asn1_TYPE_descriptor_t asn1_DEF_b = { +asn_TYPE_descriptor_t asn_DEF_b = { "b", CHOICE_free, CHOICE_print, @@ -227,32 +227,32 @@ asn1_TYPE_descriptor_t asn1_DEF_b = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - asn1_MBR_b, + asn_MBR_b, 4, /* Elements count */ - &asn1_DEF_b_specs /* Additional specs */ + &asn_DEF_b_specs /* Additional specs */ }; -static asn1_TYPE_member_t asn1_MBR_T[] = { +static asn_TYPE_member_t asn_MBR_T[] = { { ATF_NOFLAGS, 0, offsetof(struct T, a), .tag = (ASN_TAG_CLASS_PRIVATE | (2 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ - .type = (void *)&asn1_DEF_NULL, + .type = (void *)&asn_DEF_NULL, .memb_constraints = 0, /* Defer to actual type */ .name = "a" }, { ATF_NOFLAGS, 0, offsetof(struct T, b), .tag = -1 /* Ambiguous tag (CHOICE?) */, .tag_mode = 0, - .type = (void *)&asn1_DEF_b, + .type = (void *)&asn_DEF_b, .memb_constraints = 0, /* Defer to actual type */ .name = "b" }, }; -static ber_tlv_tag_t asn1_DEF_T_tags[] = { +static ber_tlv_tag_t asn_DEF_T_tags[] = { (ASN_TAG_CLASS_PRIVATE | (1 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_TYPE_tag2member_t asn1_DEF_T_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_T_tag2el[] = { { (ASN_TAG_CLASS_PRIVATE | (2 << 2)), 0, 0, 0 }, /* a at 15 */ { (ASN_TAG_CLASS_PRIVATE | (5 << 2)), 1, 0, 0 }, /* c at 17 */ { (ASN_TAG_CLASS_PRIVATE | (6 << 2)), 1, 0, 0 }, /* d at 18 */ @@ -260,15 +260,15 @@ static asn1_TYPE_tag2member_t asn1_DEF_T_tag2el[] = { { (ASN_TAG_CLASS_PRIVATE | (8 << 2)), 1, 0, 0 }, /* g at 21 */ { (ASN_TAG_CLASS_PRIVATE | (9 << 2)), 1, 0, 0 }, /* h at 24 */ }; -static asn1_SEQUENCE_specifics_t asn1_DEF_T_specs = { +static asn_SEQUENCE_specifics_t asn_DEF_T_specs = { sizeof(struct T), - offsetof(struct T, _ber_dec_ctx), - asn1_DEF_T_tag2el, + offsetof(struct T, _asn_ctx), + asn_DEF_T_tag2el, 6, /* Count of tags in the map */ -1, /* Start extensions */ -1 /* Stop extensions */ }; -asn1_TYPE_descriptor_t asn1_DEF_T = { +asn_TYPE_descriptor_t asn_DEF_T = { "T", SEQUENCE_free, SEQUENCE_print, @@ -278,14 +278,14 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { 0, /* Not implemented yet */ SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T_tags, - sizeof(asn1_DEF_T_tags) - /sizeof(asn1_DEF_T_tags[0]) - 1, /* 1 */ - asn1_DEF_T_tags, /* Same as above */ - sizeof(asn1_DEF_T_tags) - /sizeof(asn1_DEF_T_tags[0]), /* 2 */ - asn1_MBR_T, + asn_DEF_T_tags, + sizeof(asn_DEF_T_tags) + /sizeof(asn_DEF_T_tags[0]) - 1, /* 1 */ + asn_DEF_T_tags, /* Same as above */ + sizeof(asn_DEF_T_tags) + /sizeof(asn_DEF_T_tags[0]), /* 2 */ + asn_MBR_T, 2, /* Elements count */ - &asn1_DEF_T_specs /* Additional specs */ + &asn_DEF_T_specs /* Additional specs */ }; diff --git a/tests/46-redefine-OK.asn1.-PR b/tests/46-redefine-OK.asn1.-PR index 4981e2220..92a81cae5 100644 --- a/tests/46-redefine-OK.asn1.-PR +++ b/tests/46-redefine-OK.asn1.-PR @@ -11,7 +11,7 @@ typedef OCTET_STRING_t PrimitiveType_t; /*** <<< FUNC-DECLS [PrimitiveType] >>> ***/ /* This type is equivalent to OCTET_STRING */ -#define asn1_DEF_PrimitiveType asn1_DEF_OCTET_STRING +#define asn_DEF_PrimitiveType asn_DEF_OCTET_STRING /*** <<< CODE [PrimitiveType] >>> ***/ @@ -25,7 +25,7 @@ typedef OCTET_STRING_t PrimitiveType_t; /*** <<< DEPS [ConstructedType] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_ConstructedType; +extern asn_TYPE_descriptor_t asn_DEF_ConstructedType; /*** <<< TYPE-DECLS [ConstructedType] >>> ***/ @@ -34,35 +34,35 @@ typedef struct ConstructedType { PrimitiveType_t field; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } ConstructedType_t; /*** <<< STAT-DEFS [ConstructedType] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_ConstructedType[] = { +static asn_TYPE_member_t asn_MBR_ConstructedType[] = { { ATF_NOFLAGS, 0, offsetof(struct ConstructedType, field), .tag = (ASN_TAG_CLASS_CONTEXT | (5 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ - .type = (void *)&asn1_DEF_PrimitiveType, + .type = (void *)&asn_DEF_PrimitiveType, .memb_constraints = 0, /* Defer to actual type */ .name = "field" }, }; -static ber_tlv_tag_t asn1_DEF_ConstructedType_tags[] = { +static ber_tlv_tag_t asn_DEF_ConstructedType_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_TYPE_tag2member_t asn1_DEF_ConstructedType_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_ConstructedType_tag2el[] = { { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 0, 0, 0 }, /* field at 18 */ }; -static asn1_SEQUENCE_specifics_t asn1_DEF_ConstructedType_specs = { +static asn_SEQUENCE_specifics_t asn_DEF_ConstructedType_specs = { sizeof(struct ConstructedType), - offsetof(struct ConstructedType, _ber_dec_ctx), - asn1_DEF_ConstructedType_tag2el, + offsetof(struct ConstructedType, _asn_ctx), + asn_DEF_ConstructedType_tag2el, 1, /* Count of tags in the map */ -1, /* Start extensions */ -1 /* Stop extensions */ }; -asn1_TYPE_descriptor_t asn1_DEF_ConstructedType = { +asn_TYPE_descriptor_t asn_DEF_ConstructedType = { "ConstructedType", SEQUENCE_free, SEQUENCE_print, @@ -72,15 +72,15 @@ asn1_TYPE_descriptor_t asn1_DEF_ConstructedType = { 0, /* Not implemented yet */ SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_ConstructedType_tags, - sizeof(asn1_DEF_ConstructedType_tags) - /sizeof(asn1_DEF_ConstructedType_tags[0]), /* 1 */ - asn1_DEF_ConstructedType_tags, /* Same as above */ - sizeof(asn1_DEF_ConstructedType_tags) - /sizeof(asn1_DEF_ConstructedType_tags[0]), /* 1 */ - asn1_MBR_ConstructedType, + asn_DEF_ConstructedType_tags, + sizeof(asn_DEF_ConstructedType_tags) + /sizeof(asn_DEF_ConstructedType_tags[0]), /* 1 */ + asn_DEF_ConstructedType_tags, /* Same as above */ + sizeof(asn_DEF_ConstructedType_tags) + /sizeof(asn_DEF_ConstructedType_tags[0]), /* 1 */ + asn_MBR_ConstructedType, 1, /* Elements count */ - &asn1_DEF_ConstructedType_specs /* Additional specs */ + &asn_DEF_ConstructedType_specs /* Additional specs */ }; @@ -95,7 +95,7 @@ typedef ConstructedType_t T_t; /*** <<< FUNC-DECLS [T] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_T; +extern asn_TYPE_descriptor_t asn_DEF_T; asn_struct_free_f T_free; asn_struct_print_f T_print; asn_constr_check_f T_constraint; @@ -106,10 +106,10 @@ xer_type_encoder_f T_encode_xer; /*** <<< CODE [T] >>> ***/ int -T_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +T_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { /* Replace with underlying type checker */ - td->check_constraints = asn1_DEF_ConstructedType.check_constraints; + td->check_constraints = asn_DEF_ConstructedType.check_constraints; return td->check_constraints(td, sptr, app_errlog, app_key); } @@ -118,41 +118,41 @@ T_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -T_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_ConstructedType.free_struct; - td->print_struct = asn1_DEF_ConstructedType.print_struct; - td->ber_decoder = asn1_DEF_ConstructedType.ber_decoder; - td->der_encoder = asn1_DEF_ConstructedType.der_encoder; - td->xer_decoder = asn1_DEF_ConstructedType.xer_decoder; - td->xer_encoder = asn1_DEF_ConstructedType.xer_encoder; - td->elements = asn1_DEF_ConstructedType.elements; - td->elements_count = asn1_DEF_ConstructedType.elements_count; - td->specifics = asn1_DEF_ConstructedType.specifics; +T_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_ConstructedType.free_struct; + td->print_struct = asn_DEF_ConstructedType.print_struct; + td->ber_decoder = asn_DEF_ConstructedType.ber_decoder; + td->der_encoder = asn_DEF_ConstructedType.der_encoder; + td->xer_decoder = asn_DEF_ConstructedType.xer_decoder; + td->xer_encoder = asn_DEF_ConstructedType.xer_encoder; + td->elements = asn_DEF_ConstructedType.elements; + td->elements_count = asn_DEF_ConstructedType.elements_count; + td->specifics = asn_DEF_ConstructedType.specifics; } void -T_free(asn1_TYPE_descriptor_t *td, +T_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { T_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -T_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +T_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { T_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -T_decode_ber(asn1_TYPE_descriptor_t *td, +T_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -T_encode_der(asn1_TYPE_descriptor_t *td, +T_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { T_inherit_TYPE_descriptor(td); @@ -160,7 +160,7 @@ T_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -T_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +T_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { T_inherit_TYPE_descriptor(td); @@ -170,11 +170,11 @@ T_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T] >>> ***/ -static ber_tlv_tag_t asn1_DEF_T_tags[] = { +static ber_tlv_tag_t asn_DEF_T_tags[] = { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_T = { +asn_TYPE_descriptor_t asn_DEF_T = { "T", T_free, T_print, @@ -184,12 +184,12 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { 0, /* Not implemented yet */ T_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T_tags, - sizeof(asn1_DEF_T_tags) - /sizeof(asn1_DEF_T_tags[0]) - 1, /* 1 */ - asn1_DEF_T_tags, /* Same as above */ - sizeof(asn1_DEF_T_tags) - /sizeof(asn1_DEF_T_tags[0]), /* 2 */ + asn_DEF_T_tags, + sizeof(asn_DEF_T_tags) + /sizeof(asn_DEF_T_tags[0]) - 1, /* 1 */ + asn_DEF_T_tags, /* Same as above */ + sizeof(asn_DEF_T_tags) + /sizeof(asn_DEF_T_tags[0]), /* 2 */ 0, 0, /* Defined elsewhere */ 0 /* No specifics */ }; diff --git a/tests/47-set-ext-OK.asn1.-P b/tests/47-set-ext-OK.asn1.-P index 0e207d52e..568caadcb 100644 --- a/tests/47-set-ext-OK.asn1.-P +++ b/tests/47-set-ext-OK.asn1.-P @@ -13,7 +13,7 @@ typedef enum T1_PR { T1_PR_i, /* Member i is present */ } T1_PR; -extern asn1_TYPE_descriptor_t asn1_DEF_T1; +extern asn_TYPE_descriptor_t asn_DEF_T1; /*** <<< TYPE-DECLS [T1] >>> ***/ @@ -30,39 +30,39 @@ typedef struct T1 { [((1+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))]; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } T1_t; /*** <<< STAT-DEFS [T1] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_T1[] = { +static asn_TYPE_member_t asn_MBR_T1[] = { { ATF_NOFLAGS, 0, offsetof(struct T1, i), .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_INTEGER, + .type = (void *)&asn_DEF_INTEGER, .memb_constraints = 0, /* Defer to actual type */ .name = "i" }, }; -static ber_tlv_tag_t asn1_DEF_T1_tags[] = { +static ber_tlv_tag_t asn_DEF_T1_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn1_TYPE_tag2member_t asn1_DEF_T1_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_T1_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 14 */ }; -static uint8_t asn1_DEF_T1_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { +static uint8_t asn_DEF_T1_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { (1 << 7) }; -static asn1_SET_specifics_t asn1_DEF_T1_specs = { +static asn_SET_specifics_t asn_DEF_T1_specs = { sizeof(struct T1), - offsetof(struct T1, _ber_dec_ctx), + offsetof(struct T1, _asn_ctx), offsetof(struct T1, _presence_map), - asn1_DEF_T1_tag2el, + asn_DEF_T1_tag2el, 1, /* Count of tags in the map */ 1, /* Whether extensible */ - (unsigned int *)asn1_DEF_T1_mmap /* Mandatory elements map */ + (unsigned int *)asn_DEF_T1_mmap /* Mandatory elements map */ }; -asn1_TYPE_descriptor_t asn1_DEF_T1 = { +asn_TYPE_descriptor_t asn_DEF_T1 = { "T1", SET_free, SET_print, @@ -72,15 +72,15 @@ asn1_TYPE_descriptor_t asn1_DEF_T1 = { 0, /* Not implemented yet */ SET_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T1_tags, - sizeof(asn1_DEF_T1_tags) - /sizeof(asn1_DEF_T1_tags[0]), /* 1 */ - asn1_DEF_T1_tags, /* Same as above */ - sizeof(asn1_DEF_T1_tags) - /sizeof(asn1_DEF_T1_tags[0]), /* 1 */ - asn1_MBR_T1, + asn_DEF_T1_tags, + sizeof(asn_DEF_T1_tags) + /sizeof(asn_DEF_T1_tags[0]), /* 1 */ + asn_DEF_T1_tags, /* Same as above */ + sizeof(asn_DEF_T1_tags) + /sizeof(asn_DEF_T1_tags[0]), /* 1 */ + asn_MBR_T1, 1, /* Elements count */ - &asn1_DEF_T1_specs /* Additional specs */ + &asn_DEF_T1_specs /* Additional specs */ }; @@ -98,7 +98,7 @@ asn1_TYPE_descriptor_t asn1_DEF_T1 = { typedef enum T2_PR { T2_PR_i, /* Member i is present */ } T2_PR; -extern asn1_TYPE_descriptor_t asn1_DEF_T2; +extern asn_TYPE_descriptor_t asn_DEF_T2; /*** <<< TYPE-DECLS [T2] >>> ***/ @@ -115,39 +115,39 @@ typedef struct T2 { [((1+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))]; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } T2_t; /*** <<< STAT-DEFS [T2] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_T2[] = { +static asn_TYPE_member_t asn_MBR_T2[] = { { ATF_NOFLAGS, 0, offsetof(struct T2, i), .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_INTEGER, + .type = (void *)&asn_DEF_INTEGER, .memb_constraints = 0, /* Defer to actual type */ .name = "i" }, }; -static ber_tlv_tag_t asn1_DEF_T2_tags[] = { +static ber_tlv_tag_t asn_DEF_T2_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn1_TYPE_tag2member_t asn1_DEF_T2_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_T2_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 15 */ }; -static uint8_t asn1_DEF_T2_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { +static uint8_t asn_DEF_T2_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { (1 << 7) }; -static asn1_SET_specifics_t asn1_DEF_T2_specs = { +static asn_SET_specifics_t asn_DEF_T2_specs = { sizeof(struct T2), - offsetof(struct T2, _ber_dec_ctx), + offsetof(struct T2, _asn_ctx), offsetof(struct T2, _presence_map), - asn1_DEF_T2_tag2el, + asn_DEF_T2_tag2el, 1, /* Count of tags in the map */ 1, /* Whether extensible */ - (unsigned int *)asn1_DEF_T2_mmap /* Mandatory elements map */ + (unsigned int *)asn_DEF_T2_mmap /* Mandatory elements map */ }; -asn1_TYPE_descriptor_t asn1_DEF_T2 = { +asn_TYPE_descriptor_t asn_DEF_T2 = { "T2", SET_free, SET_print, @@ -157,15 +157,15 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { 0, /* Not implemented yet */ SET_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T2_tags, - sizeof(asn1_DEF_T2_tags) - /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ - asn1_DEF_T2_tags, /* Same as above */ - sizeof(asn1_DEF_T2_tags) - /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ - asn1_MBR_T2, + asn_DEF_T2_tags, + sizeof(asn_DEF_T2_tags) + /sizeof(asn_DEF_T2_tags[0]), /* 1 */ + asn_DEF_T2_tags, /* Same as above */ + sizeof(asn_DEF_T2_tags) + /sizeof(asn_DEF_T2_tags[0]), /* 1 */ + asn_MBR_T2, 1, /* Elements count */ - &asn1_DEF_T2_specs /* Additional specs */ + &asn_DEF_T2_specs /* Additional specs */ }; @@ -181,7 +181,7 @@ typedef enum T3_PR { T3_PR_i, /* Extensions may appear below */ } T3_PR; -extern asn1_TYPE_descriptor_t asn1_DEF_T3; +extern asn_TYPE_descriptor_t asn_DEF_T3; /*** <<< TYPE-DECLS [T3] >>> ***/ @@ -197,33 +197,33 @@ typedef struct T3 { } choice; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } T3_t; /*** <<< STAT-DEFS [T3] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_T3[] = { +static asn_TYPE_member_t asn_MBR_T3[] = { { ATF_NOFLAGS, 0, offsetof(struct T3, choice.i), .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_INTEGER, + .type = (void *)&asn_DEF_INTEGER, .memb_constraints = 0, /* Defer to actual type */ .name = "i" }, }; -static asn1_TYPE_tag2member_t asn1_DEF_T3_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_T3_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 16 */ }; -static asn1_CHOICE_specifics_t asn1_DEF_T3_specs = { +static asn_CHOICE_specifics_t asn_DEF_T3_specs = { sizeof(struct T3), - offsetof(struct T3, _ber_dec_ctx), + offsetof(struct T3, _asn_ctx), offsetof(struct T3, present), sizeof(((struct T3 *)0)->present), - asn1_DEF_T3_tag2el, + asn_DEF_T3_tag2el, 1, /* Count of tags in the map */ 1 /* Whether extensible */ }; -asn1_TYPE_descriptor_t asn1_DEF_T3 = { +asn_TYPE_descriptor_t asn_DEF_T3 = { "T3", CHOICE_free, CHOICE_print, @@ -237,9 +237,9 @@ asn1_TYPE_descriptor_t asn1_DEF_T3 = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - asn1_MBR_T3, + asn_MBR_T3, 1, /* Elements count */ - &asn1_DEF_T3_specs /* Additional specs */ + &asn_DEF_T3_specs /* Additional specs */ }; @@ -255,7 +255,7 @@ typedef enum T4_PR { T4_PR_i, /* Extensions may appear below */ } T4_PR; -extern asn1_TYPE_descriptor_t asn1_DEF_T4; +extern asn_TYPE_descriptor_t asn_DEF_T4; /*** <<< TYPE-DECLS [T4] >>> ***/ @@ -271,33 +271,33 @@ typedef struct T4 { } choice; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } T4_t; /*** <<< STAT-DEFS [T4] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_T4[] = { +static asn_TYPE_member_t asn_MBR_T4[] = { { ATF_NOFLAGS, 0, offsetof(struct T4, choice.i), .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_INTEGER, + .type = (void *)&asn_DEF_INTEGER, .memb_constraints = 0, /* Defer to actual type */ .name = "i" }, }; -static asn1_TYPE_tag2member_t asn1_DEF_T4_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_T4_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 17 */ }; -static asn1_CHOICE_specifics_t asn1_DEF_T4_specs = { +static asn_CHOICE_specifics_t asn_DEF_T4_specs = { sizeof(struct T4), - offsetof(struct T4, _ber_dec_ctx), + offsetof(struct T4, _asn_ctx), offsetof(struct T4, present), sizeof(((struct T4 *)0)->present), - asn1_DEF_T4_tag2el, + asn_DEF_T4_tag2el, 1, /* Count of tags in the map */ 1 /* Whether extensible */ }; -asn1_TYPE_descriptor_t asn1_DEF_T4 = { +asn_TYPE_descriptor_t asn_DEF_T4 = { "T4", CHOICE_free, CHOICE_print, @@ -311,8 +311,8 @@ asn1_TYPE_descriptor_t asn1_DEF_T4 = { 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ - asn1_MBR_T4, + asn_MBR_T4, 1, /* Elements count */ - &asn1_DEF_T4_specs /* Additional specs */ + &asn_DEF_T4_specs /* Additional specs */ }; diff --git a/tests/50-constraint-OK.asn1.-P b/tests/50-constraint-OK.asn1.-P index 6696b560b..b8c0c353e 100644 --- a/tests/50-constraint-OK.asn1.-P +++ b/tests/50-constraint-OK.asn1.-P @@ -11,7 +11,7 @@ typedef INTEGER_t Int1_t; /*** <<< FUNC-DECLS [Int1] >>> ***/ /* This type is equivalent to INTEGER */ -#define asn1_DEF_Int1 asn1_DEF_INTEGER +#define asn_DEF_Int1 asn_DEF_INTEGER /*** <<< CODE [Int1] >>> ***/ @@ -29,7 +29,7 @@ typedef Int1_t Int2_t; /*** <<< FUNC-DECLS [Int2] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Int2; +extern asn_TYPE_descriptor_t asn_DEF_Int2; asn_struct_free_f Int2_free; asn_struct_print_f Int2_print; asn_constr_check_f Int2_constraint; @@ -40,7 +40,7 @@ xer_type_encoder_f Int2_encode_xer; /*** <<< CODE [Int2] >>> ***/ int -Int2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +Int2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const Int1_t *st = sptr; long value; @@ -71,41 +71,41 @@ Int2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -Int2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_Int1.free_struct; - td->print_struct = asn1_DEF_Int1.print_struct; - td->ber_decoder = asn1_DEF_Int1.ber_decoder; - td->der_encoder = asn1_DEF_Int1.der_encoder; - td->xer_decoder = asn1_DEF_Int1.xer_decoder; - td->xer_encoder = asn1_DEF_Int1.xer_encoder; - td->elements = asn1_DEF_Int1.elements; - td->elements_count = asn1_DEF_Int1.elements_count; - td->specifics = asn1_DEF_Int1.specifics; +Int2_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Int1.free_struct; + td->print_struct = asn_DEF_Int1.print_struct; + td->ber_decoder = asn_DEF_Int1.ber_decoder; + td->der_encoder = asn_DEF_Int1.der_encoder; + td->xer_decoder = asn_DEF_Int1.xer_decoder; + td->xer_encoder = asn_DEF_Int1.xer_encoder; + td->elements = asn_DEF_Int1.elements; + td->elements_count = asn_DEF_Int1.elements_count; + td->specifics = asn_DEF_Int1.specifics; } void -Int2_free(asn1_TYPE_descriptor_t *td, +Int2_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { Int2_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -Int2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +Int2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { Int2_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -Int2_decode_ber(asn1_TYPE_descriptor_t *td, +Int2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Int2_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -Int2_encode_der(asn1_TYPE_descriptor_t *td, +Int2_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { Int2_inherit_TYPE_descriptor(td); @@ -113,7 +113,7 @@ Int2_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -Int2_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +Int2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { Int2_inherit_TYPE_descriptor(td); @@ -123,10 +123,10 @@ Int2_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Int2] >>> ***/ -static ber_tlv_tag_t asn1_DEF_Int2_tags[] = { +static ber_tlv_tag_t asn_DEF_Int2_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_Int2 = { +asn_TYPE_descriptor_t asn_DEF_Int2 = { "Int2", Int2_free, Int2_print, @@ -136,12 +136,12 @@ asn1_TYPE_descriptor_t asn1_DEF_Int2 = { 0, /* Not implemented yet */ Int2_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Int2_tags, - sizeof(asn1_DEF_Int2_tags) - /sizeof(asn1_DEF_Int2_tags[0]), /* 1 */ - asn1_DEF_Int2_tags, /* Same as above */ - sizeof(asn1_DEF_Int2_tags) - /sizeof(asn1_DEF_Int2_tags[0]), /* 1 */ + asn_DEF_Int2_tags, + sizeof(asn_DEF_Int2_tags) + /sizeof(asn_DEF_Int2_tags[0]), /* 1 */ + asn_DEF_Int2_tags, /* Same as above */ + sizeof(asn_DEF_Int2_tags) + /sizeof(asn_DEF_Int2_tags[0]), /* 1 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -158,7 +158,7 @@ typedef Int2_t Int3_t; /*** <<< FUNC-DECLS [Int3] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Int3; +extern asn_TYPE_descriptor_t asn_DEF_Int3; asn_struct_free_f Int3_free; asn_struct_print_f Int3_print; asn_constr_check_f Int3_constraint; @@ -169,7 +169,7 @@ xer_type_encoder_f Int3_encode_xer; /*** <<< CODE [Int3] >>> ***/ int -Int3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +Int3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const Int2_t *st = sptr; long value; @@ -181,7 +181,7 @@ Int3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return -1; } - if(asn1_INTEGER2long(st, &value)) { + if(asn_INTEGER2long(st, &value)) { _ASN_ERRLOG(app_errlog, app_key, "%s: value too large (%s:%d)", td->name, __FILE__, __LINE__); @@ -204,41 +204,41 @@ Int3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -Int3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_Int2.free_struct; - td->print_struct = asn1_DEF_Int2.print_struct; - td->ber_decoder = asn1_DEF_Int2.ber_decoder; - td->der_encoder = asn1_DEF_Int2.der_encoder; - td->xer_decoder = asn1_DEF_Int2.xer_decoder; - td->xer_encoder = asn1_DEF_Int2.xer_encoder; - td->elements = asn1_DEF_Int2.elements; - td->elements_count = asn1_DEF_Int2.elements_count; - td->specifics = asn1_DEF_Int2.specifics; +Int3_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Int2.free_struct; + td->print_struct = asn_DEF_Int2.print_struct; + td->ber_decoder = asn_DEF_Int2.ber_decoder; + td->der_encoder = asn_DEF_Int2.der_encoder; + td->xer_decoder = asn_DEF_Int2.xer_decoder; + td->xer_encoder = asn_DEF_Int2.xer_encoder; + td->elements = asn_DEF_Int2.elements; + td->elements_count = asn_DEF_Int2.elements_count; + td->specifics = asn_DEF_Int2.specifics; } void -Int3_free(asn1_TYPE_descriptor_t *td, +Int3_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { Int3_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -Int3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +Int3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { Int3_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -Int3_decode_ber(asn1_TYPE_descriptor_t *td, +Int3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Int3_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -Int3_encode_der(asn1_TYPE_descriptor_t *td, +Int3_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { Int3_inherit_TYPE_descriptor(td); @@ -246,7 +246,7 @@ Int3_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -Int3_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +Int3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { Int3_inherit_TYPE_descriptor(td); @@ -256,10 +256,10 @@ Int3_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Int3] >>> ***/ -static ber_tlv_tag_t asn1_DEF_Int3_tags[] = { +static ber_tlv_tag_t asn_DEF_Int3_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_Int3 = { +asn_TYPE_descriptor_t asn_DEF_Int3 = { "Int3", Int3_free, Int3_print, @@ -269,12 +269,12 @@ asn1_TYPE_descriptor_t asn1_DEF_Int3 = { 0, /* Not implemented yet */ Int3_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Int3_tags, - sizeof(asn1_DEF_Int3_tags) - /sizeof(asn1_DEF_Int3_tags[0]), /* 1 */ - asn1_DEF_Int3_tags, /* Same as above */ - sizeof(asn1_DEF_Int3_tags) - /sizeof(asn1_DEF_Int3_tags[0]), /* 1 */ + asn_DEF_Int3_tags, + sizeof(asn_DEF_Int3_tags) + /sizeof(asn_DEF_Int3_tags[0]), /* 1 */ + asn_DEF_Int3_tags, /* Same as above */ + sizeof(asn_DEF_Int3_tags) + /sizeof(asn_DEF_Int3_tags[0]), /* 1 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -291,7 +291,7 @@ typedef Int3_t Int4_t; /*** <<< FUNC-DECLS [Int4] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Int4; +extern asn_TYPE_descriptor_t asn_DEF_Int4; asn_struct_free_f Int4_free; asn_struct_print_f Int4_print; asn_constr_check_f Int4_constraint; @@ -302,7 +302,7 @@ xer_type_encoder_f Int4_encode_xer; /*** <<< CODE [Int4] >>> ***/ int -Int4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +Int4_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const Int3_t *st = sptr; long value; @@ -314,7 +314,7 @@ Int4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return -1; } - if(asn1_INTEGER2long(st, &value)) { + if(asn_INTEGER2long(st, &value)) { _ASN_ERRLOG(app_errlog, app_key, "%s: value too large (%s:%d)", td->name, __FILE__, __LINE__); @@ -337,41 +337,41 @@ Int4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -Int4_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_Int3.free_struct; - td->print_struct = asn1_DEF_Int3.print_struct; - td->ber_decoder = asn1_DEF_Int3.ber_decoder; - td->der_encoder = asn1_DEF_Int3.der_encoder; - td->xer_decoder = asn1_DEF_Int3.xer_decoder; - td->xer_encoder = asn1_DEF_Int3.xer_encoder; - td->elements = asn1_DEF_Int3.elements; - td->elements_count = asn1_DEF_Int3.elements_count; - td->specifics = asn1_DEF_Int3.specifics; +Int4_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Int3.free_struct; + td->print_struct = asn_DEF_Int3.print_struct; + td->ber_decoder = asn_DEF_Int3.ber_decoder; + td->der_encoder = asn_DEF_Int3.der_encoder; + td->xer_decoder = asn_DEF_Int3.xer_decoder; + td->xer_encoder = asn_DEF_Int3.xer_encoder; + td->elements = asn_DEF_Int3.elements; + td->elements_count = asn_DEF_Int3.elements_count; + td->specifics = asn_DEF_Int3.specifics; } void -Int4_free(asn1_TYPE_descriptor_t *td, +Int4_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { Int4_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -Int4_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +Int4_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { Int4_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -Int4_decode_ber(asn1_TYPE_descriptor_t *td, +Int4_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Int4_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -Int4_encode_der(asn1_TYPE_descriptor_t *td, +Int4_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { Int4_inherit_TYPE_descriptor(td); @@ -379,7 +379,7 @@ Int4_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -Int4_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +Int4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { Int4_inherit_TYPE_descriptor(td); @@ -389,10 +389,10 @@ Int4_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Int4] >>> ***/ -static ber_tlv_tag_t asn1_DEF_Int4_tags[] = { +static ber_tlv_tag_t asn_DEF_Int4_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_Int4 = { +asn_TYPE_descriptor_t asn_DEF_Int4 = { "Int4", Int4_free, Int4_print, @@ -402,12 +402,12 @@ asn1_TYPE_descriptor_t asn1_DEF_Int4 = { 0, /* Not implemented yet */ Int4_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Int4_tags, - sizeof(asn1_DEF_Int4_tags) - /sizeof(asn1_DEF_Int4_tags[0]), /* 1 */ - asn1_DEF_Int4_tags, /* Same as above */ - sizeof(asn1_DEF_Int4_tags) - /sizeof(asn1_DEF_Int4_tags[0]), /* 1 */ + asn_DEF_Int4_tags, + sizeof(asn_DEF_Int4_tags) + /sizeof(asn_DEF_Int4_tags[0]), /* 1 */ + asn_DEF_Int4_tags, /* Same as above */ + sizeof(asn_DEF_Int4_tags) + /sizeof(asn_DEF_Int4_tags[0]), /* 1 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -424,7 +424,7 @@ typedef Int4_t Int5_t; /*** <<< FUNC-DECLS [Int5] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Int5; +extern asn_TYPE_descriptor_t asn_DEF_Int5; asn_struct_free_f Int5_free; asn_struct_print_f Int5_print; asn_constr_check_f Int5_constraint; @@ -435,7 +435,7 @@ xer_type_encoder_f Int5_encode_xer; /*** <<< CODE [Int5] >>> ***/ int -Int5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +Int5_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const Int4_t *st = sptr; long value; @@ -447,7 +447,7 @@ Int5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return -1; } - if(asn1_INTEGER2long(st, &value)) { + if(asn_INTEGER2long(st, &value)) { _ASN_ERRLOG(app_errlog, app_key, "%s: value too large (%s:%d)", td->name, __FILE__, __LINE__); @@ -470,41 +470,41 @@ Int5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -Int5_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_Int4.free_struct; - td->print_struct = asn1_DEF_Int4.print_struct; - td->ber_decoder = asn1_DEF_Int4.ber_decoder; - td->der_encoder = asn1_DEF_Int4.der_encoder; - td->xer_decoder = asn1_DEF_Int4.xer_decoder; - td->xer_encoder = asn1_DEF_Int4.xer_encoder; - td->elements = asn1_DEF_Int4.elements; - td->elements_count = asn1_DEF_Int4.elements_count; - td->specifics = asn1_DEF_Int4.specifics; +Int5_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Int4.free_struct; + td->print_struct = asn_DEF_Int4.print_struct; + td->ber_decoder = asn_DEF_Int4.ber_decoder; + td->der_encoder = asn_DEF_Int4.der_encoder; + td->xer_decoder = asn_DEF_Int4.xer_decoder; + td->xer_encoder = asn_DEF_Int4.xer_encoder; + td->elements = asn_DEF_Int4.elements; + td->elements_count = asn_DEF_Int4.elements_count; + td->specifics = asn_DEF_Int4.specifics; } void -Int5_free(asn1_TYPE_descriptor_t *td, +Int5_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { Int5_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -Int5_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +Int5_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { Int5_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -Int5_decode_ber(asn1_TYPE_descriptor_t *td, +Int5_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Int5_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -Int5_encode_der(asn1_TYPE_descriptor_t *td, +Int5_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { Int5_inherit_TYPE_descriptor(td); @@ -512,7 +512,7 @@ Int5_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -Int5_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +Int5_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { Int5_inherit_TYPE_descriptor(td); @@ -522,10 +522,10 @@ Int5_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Int5] >>> ***/ -static ber_tlv_tag_t asn1_DEF_Int5_tags[] = { +static ber_tlv_tag_t asn_DEF_Int5_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_Int5 = { +asn_TYPE_descriptor_t asn_DEF_Int5 = { "Int5", Int5_free, Int5_print, @@ -535,12 +535,12 @@ asn1_TYPE_descriptor_t asn1_DEF_Int5 = { 0, /* Not implemented yet */ Int5_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Int5_tags, - sizeof(asn1_DEF_Int5_tags) - /sizeof(asn1_DEF_Int5_tags[0]), /* 1 */ - asn1_DEF_Int5_tags, /* Same as above */ - sizeof(asn1_DEF_Int5_tags) - /sizeof(asn1_DEF_Int5_tags[0]), /* 1 */ + asn_DEF_Int5_tags, + sizeof(asn_DEF_Int5_tags) + /sizeof(asn_DEF_Int5_tags[0]), /* 1 */ + asn_DEF_Int5_tags, /* Same as above */ + sizeof(asn_DEF_Int5_tags) + /sizeof(asn_DEF_Int5_tags[0]), /* 1 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -557,7 +557,7 @@ typedef INTEGER_t ExtensibleExtensions_t; /*** <<< FUNC-DECLS [ExtensibleExtensions] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_ExtensibleExtensions; +extern asn_TYPE_descriptor_t asn_DEF_ExtensibleExtensions; asn_struct_free_f ExtensibleExtensions_free; asn_struct_print_f ExtensibleExtensions_print; asn_constr_check_f ExtensibleExtensions_constraint; @@ -568,7 +568,7 @@ xer_type_encoder_f ExtensibleExtensions_encode_xer; /*** <<< CODE [ExtensibleExtensions] >>> ***/ int -ExtensibleExtensions_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +ExtensibleExtensions_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const INTEGER_t *st = sptr; long value; @@ -580,7 +580,7 @@ ExtensibleExtensions_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, return -1; } - if(asn1_INTEGER2long(st, &value)) { + if(asn_INTEGER2long(st, &value)) { _ASN_ERRLOG(app_errlog, app_key, "%s: value too large (%s:%d)", td->name, __FILE__, __LINE__); @@ -603,41 +603,41 @@ ExtensibleExtensions_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -ExtensibleExtensions_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_INTEGER.free_struct; - td->print_struct = asn1_DEF_INTEGER.print_struct; - td->ber_decoder = asn1_DEF_INTEGER.ber_decoder; - td->der_encoder = asn1_DEF_INTEGER.der_encoder; - td->xer_decoder = asn1_DEF_INTEGER.xer_decoder; - td->xer_encoder = asn1_DEF_INTEGER.xer_encoder; - td->elements = asn1_DEF_INTEGER.elements; - td->elements_count = asn1_DEF_INTEGER.elements_count; - td->specifics = asn1_DEF_INTEGER.specifics; +ExtensibleExtensions_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_INTEGER.free_struct; + td->print_struct = asn_DEF_INTEGER.print_struct; + td->ber_decoder = asn_DEF_INTEGER.ber_decoder; + td->der_encoder = asn_DEF_INTEGER.der_encoder; + td->xer_decoder = asn_DEF_INTEGER.xer_decoder; + td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->elements = asn_DEF_INTEGER.elements; + td->elements_count = asn_DEF_INTEGER.elements_count; + td->specifics = asn_DEF_INTEGER.specifics; } void -ExtensibleExtensions_free(asn1_TYPE_descriptor_t *td, +ExtensibleExtensions_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { ExtensibleExtensions_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -ExtensibleExtensions_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +ExtensibleExtensions_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { ExtensibleExtensions_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -ExtensibleExtensions_decode_ber(asn1_TYPE_descriptor_t *td, +ExtensibleExtensions_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { ExtensibleExtensions_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -ExtensibleExtensions_encode_der(asn1_TYPE_descriptor_t *td, +ExtensibleExtensions_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { ExtensibleExtensions_inherit_TYPE_descriptor(td); @@ -645,7 +645,7 @@ ExtensibleExtensions_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -ExtensibleExtensions_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +ExtensibleExtensions_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { ExtensibleExtensions_inherit_TYPE_descriptor(td); @@ -655,10 +655,10 @@ ExtensibleExtensions_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [ExtensibleExtensions] >>> ***/ -static ber_tlv_tag_t asn1_DEF_ExtensibleExtensions_tags[] = { +static ber_tlv_tag_t asn_DEF_ExtensibleExtensions_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_ExtensibleExtensions = { +asn_TYPE_descriptor_t asn_DEF_ExtensibleExtensions = { "ExtensibleExtensions", ExtensibleExtensions_free, ExtensibleExtensions_print, @@ -668,12 +668,12 @@ asn1_TYPE_descriptor_t asn1_DEF_ExtensibleExtensions = { 0, /* Not implemented yet */ ExtensibleExtensions_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_ExtensibleExtensions_tags, - sizeof(asn1_DEF_ExtensibleExtensions_tags) - /sizeof(asn1_DEF_ExtensibleExtensions_tags[0]), /* 1 */ - asn1_DEF_ExtensibleExtensions_tags, /* Same as above */ - sizeof(asn1_DEF_ExtensibleExtensions_tags) - /sizeof(asn1_DEF_ExtensibleExtensions_tags[0]), /* 1 */ + asn_DEF_ExtensibleExtensions_tags, + sizeof(asn_DEF_ExtensibleExtensions_tags) + /sizeof(asn_DEF_ExtensibleExtensions_tags[0]), /* 1 */ + asn_DEF_ExtensibleExtensions_tags, /* Same as above */ + sizeof(asn_DEF_ExtensibleExtensions_tags) + /sizeof(asn_DEF_ExtensibleExtensions_tags[0]), /* 1 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -691,7 +691,7 @@ typedef IA5String_t Str1_t; /*** <<< FUNC-DECLS [Str1] >>> ***/ /* This type is equivalent to IA5String */ -#define asn1_DEF_Str1 asn1_DEF_IA5String +#define asn_DEF_Str1 asn_DEF_IA5String /*** <<< CODE [Str1] >>> ***/ @@ -709,7 +709,7 @@ typedef Str1_t Str2_t; /*** <<< FUNC-DECLS [Str2] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Str2; +extern asn_TYPE_descriptor_t asn_DEF_Str2; asn_struct_free_f Str2_free; asn_struct_print_f Str2_print; asn_constr_check_f Str2_constraint; @@ -736,7 +736,7 @@ static int check_permitted_alphabet_1(const void *sptr) { /*** <<< CODE [Str2] >>> ***/ int -Str2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +Str2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const Str1_t *st = sptr; size_t size; @@ -767,41 +767,41 @@ Str2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -Str2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_Str1.free_struct; - td->print_struct = asn1_DEF_Str1.print_struct; - td->ber_decoder = asn1_DEF_Str1.ber_decoder; - td->der_encoder = asn1_DEF_Str1.der_encoder; - td->xer_decoder = asn1_DEF_Str1.xer_decoder; - td->xer_encoder = asn1_DEF_Str1.xer_encoder; - td->elements = asn1_DEF_Str1.elements; - td->elements_count = asn1_DEF_Str1.elements_count; - td->specifics = asn1_DEF_Str1.specifics; +Str2_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Str1.free_struct; + td->print_struct = asn_DEF_Str1.print_struct; + td->ber_decoder = asn_DEF_Str1.ber_decoder; + td->der_encoder = asn_DEF_Str1.der_encoder; + td->xer_decoder = asn_DEF_Str1.xer_decoder; + td->xer_encoder = asn_DEF_Str1.xer_encoder; + td->elements = asn_DEF_Str1.elements; + td->elements_count = asn_DEF_Str1.elements_count; + td->specifics = asn_DEF_Str1.specifics; } void -Str2_free(asn1_TYPE_descriptor_t *td, +Str2_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { Str2_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -Str2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +Str2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { Str2_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -Str2_decode_ber(asn1_TYPE_descriptor_t *td, +Str2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Str2_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -Str2_encode_der(asn1_TYPE_descriptor_t *td, +Str2_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { Str2_inherit_TYPE_descriptor(td); @@ -809,7 +809,7 @@ Str2_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -Str2_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +Str2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { Str2_inherit_TYPE_descriptor(td); @@ -819,10 +819,10 @@ Str2_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Str2] >>> ***/ -static ber_tlv_tag_t asn1_DEF_Str2_tags[] = { +static ber_tlv_tag_t asn_DEF_Str2_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_Str2 = { +asn_TYPE_descriptor_t asn_DEF_Str2 = { "Str2", Str2_free, Str2_print, @@ -832,12 +832,12 @@ asn1_TYPE_descriptor_t asn1_DEF_Str2 = { 0, /* Not implemented yet */ Str2_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Str2_tags, - sizeof(asn1_DEF_Str2_tags) - /sizeof(asn1_DEF_Str2_tags[0]), /* 1 */ - asn1_DEF_Str2_tags, /* Same as above */ - sizeof(asn1_DEF_Str2_tags) - /sizeof(asn1_DEF_Str2_tags[0]), /* 1 */ + asn_DEF_Str2_tags, + sizeof(asn_DEF_Str2_tags) + /sizeof(asn_DEF_Str2_tags[0]), /* 1 */ + asn_DEF_Str2_tags, /* Same as above */ + sizeof(asn_DEF_Str2_tags) + /sizeof(asn_DEF_Str2_tags[0]), /* 1 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -854,7 +854,7 @@ typedef Str2_t Str3_t; /*** <<< FUNC-DECLS [Str3] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Str3; +extern asn_TYPE_descriptor_t asn_DEF_Str3; asn_struct_free_f Str3_free; asn_struct_print_f Str3_print; asn_constr_check_f Str3_constraint; @@ -892,7 +892,7 @@ static int check_permitted_alphabet_2(const void *sptr) { /*** <<< CODE [Str3] >>> ***/ int -Str3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +Str3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const Str2_t *st = sptr; size_t size; @@ -923,41 +923,41 @@ Str3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -Str3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_Str2.free_struct; - td->print_struct = asn1_DEF_Str2.print_struct; - td->ber_decoder = asn1_DEF_Str2.ber_decoder; - td->der_encoder = asn1_DEF_Str2.der_encoder; - td->xer_decoder = asn1_DEF_Str2.xer_decoder; - td->xer_encoder = asn1_DEF_Str2.xer_encoder; - td->elements = asn1_DEF_Str2.elements; - td->elements_count = asn1_DEF_Str2.elements_count; - td->specifics = asn1_DEF_Str2.specifics; +Str3_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Str2.free_struct; + td->print_struct = asn_DEF_Str2.print_struct; + td->ber_decoder = asn_DEF_Str2.ber_decoder; + td->der_encoder = asn_DEF_Str2.der_encoder; + td->xer_decoder = asn_DEF_Str2.xer_decoder; + td->xer_encoder = asn_DEF_Str2.xer_encoder; + td->elements = asn_DEF_Str2.elements; + td->elements_count = asn_DEF_Str2.elements_count; + td->specifics = asn_DEF_Str2.specifics; } void -Str3_free(asn1_TYPE_descriptor_t *td, +Str3_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { Str3_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -Str3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +Str3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { Str3_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -Str3_decode_ber(asn1_TYPE_descriptor_t *td, +Str3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Str3_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -Str3_encode_der(asn1_TYPE_descriptor_t *td, +Str3_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { Str3_inherit_TYPE_descriptor(td); @@ -965,7 +965,7 @@ Str3_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -Str3_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +Str3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { Str3_inherit_TYPE_descriptor(td); @@ -975,10 +975,10 @@ Str3_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Str3] >>> ***/ -static ber_tlv_tag_t asn1_DEF_Str3_tags[] = { +static ber_tlv_tag_t asn_DEF_Str3_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_Str3 = { +asn_TYPE_descriptor_t asn_DEF_Str3 = { "Str3", Str3_free, Str3_print, @@ -988,12 +988,12 @@ asn1_TYPE_descriptor_t asn1_DEF_Str3 = { 0, /* Not implemented yet */ Str3_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Str3_tags, - sizeof(asn1_DEF_Str3_tags) - /sizeof(asn1_DEF_Str3_tags[0]), /* 1 */ - asn1_DEF_Str3_tags, /* Same as above */ - sizeof(asn1_DEF_Str3_tags) - /sizeof(asn1_DEF_Str3_tags[0]), /* 1 */ + asn_DEF_Str3_tags, + sizeof(asn_DEF_Str3_tags) + /sizeof(asn_DEF_Str3_tags[0]), /* 1 */ + asn_DEF_Str3_tags, /* Same as above */ + sizeof(asn_DEF_Str3_tags) + /sizeof(asn_DEF_Str3_tags[0]), /* 1 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1010,7 +1010,7 @@ typedef IA5String_t Str4_t; /*** <<< FUNC-DECLS [Str4] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Str4; +extern asn_TYPE_descriptor_t asn_DEF_Str4; asn_struct_free_f Str4_free; asn_struct_print_f Str4_print; asn_constr_check_f Str4_constraint; @@ -1037,7 +1037,7 @@ static int check_permitted_alphabet_3(const void *sptr) { /*** <<< CODE [Str4] >>> ***/ int -Str4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +Str4_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const IA5String_t *st = sptr; @@ -1065,41 +1065,41 @@ Str4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -Str4_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_IA5String.free_struct; - td->print_struct = asn1_DEF_IA5String.print_struct; - td->ber_decoder = asn1_DEF_IA5String.ber_decoder; - td->der_encoder = asn1_DEF_IA5String.der_encoder; - td->xer_decoder = asn1_DEF_IA5String.xer_decoder; - td->xer_encoder = asn1_DEF_IA5String.xer_encoder; - td->elements = asn1_DEF_IA5String.elements; - td->elements_count = asn1_DEF_IA5String.elements_count; - td->specifics = asn1_DEF_IA5String.specifics; +Str4_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_IA5String.free_struct; + td->print_struct = asn_DEF_IA5String.print_struct; + td->ber_decoder = asn_DEF_IA5String.ber_decoder; + td->der_encoder = asn_DEF_IA5String.der_encoder; + td->xer_decoder = asn_DEF_IA5String.xer_decoder; + td->xer_encoder = asn_DEF_IA5String.xer_encoder; + td->elements = asn_DEF_IA5String.elements; + td->elements_count = asn_DEF_IA5String.elements_count; + td->specifics = asn_DEF_IA5String.specifics; } void -Str4_free(asn1_TYPE_descriptor_t *td, +Str4_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { Str4_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -Str4_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +Str4_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { Str4_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -Str4_decode_ber(asn1_TYPE_descriptor_t *td, +Str4_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Str4_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -Str4_encode_der(asn1_TYPE_descriptor_t *td, +Str4_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { Str4_inherit_TYPE_descriptor(td); @@ -1107,7 +1107,7 @@ Str4_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -Str4_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +Str4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { Str4_inherit_TYPE_descriptor(td); @@ -1117,10 +1117,10 @@ Str4_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Str4] >>> ***/ -static ber_tlv_tag_t asn1_DEF_Str4_tags[] = { +static ber_tlv_tag_t asn_DEF_Str4_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_Str4 = { +asn_TYPE_descriptor_t asn_DEF_Str4 = { "Str4", Str4_free, Str4_print, @@ -1130,12 +1130,12 @@ asn1_TYPE_descriptor_t asn1_DEF_Str4 = { 0, /* Not implemented yet */ Str4_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Str4_tags, - sizeof(asn1_DEF_Str4_tags) - /sizeof(asn1_DEF_Str4_tags[0]), /* 1 */ - asn1_DEF_Str4_tags, /* Same as above */ - sizeof(asn1_DEF_Str4_tags) - /sizeof(asn1_DEF_Str4_tags[0]), /* 1 */ + asn_DEF_Str4_tags, + sizeof(asn_DEF_Str4_tags) + /sizeof(asn_DEF_Str4_tags[0]), /* 1 */ + asn_DEF_Str4_tags, /* Same as above */ + sizeof(asn_DEF_Str4_tags) + /sizeof(asn_DEF_Str4_tags[0]), /* 1 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1152,7 +1152,7 @@ typedef IA5String_t PER_Visible_t; /*** <<< FUNC-DECLS [PER-Visible] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_PER_Visible; +extern asn_TYPE_descriptor_t asn_DEF_PER_Visible; asn_struct_free_f PER_Visible_free; asn_struct_print_f PER_Visible_print; asn_constr_check_f PER_Visible_constraint; @@ -1179,7 +1179,7 @@ static int check_permitted_alphabet_4(const void *sptr) { /*** <<< CODE [PER-Visible] >>> ***/ int -PER_Visible_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +PER_Visible_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const IA5String_t *st = sptr; @@ -1207,41 +1207,41 @@ PER_Visible_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -PER_Visible_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_IA5String.free_struct; - td->print_struct = asn1_DEF_IA5String.print_struct; - td->ber_decoder = asn1_DEF_IA5String.ber_decoder; - td->der_encoder = asn1_DEF_IA5String.der_encoder; - td->xer_decoder = asn1_DEF_IA5String.xer_decoder; - td->xer_encoder = asn1_DEF_IA5String.xer_encoder; - td->elements = asn1_DEF_IA5String.elements; - td->elements_count = asn1_DEF_IA5String.elements_count; - td->specifics = asn1_DEF_IA5String.specifics; +PER_Visible_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_IA5String.free_struct; + td->print_struct = asn_DEF_IA5String.print_struct; + td->ber_decoder = asn_DEF_IA5String.ber_decoder; + td->der_encoder = asn_DEF_IA5String.der_encoder; + td->xer_decoder = asn_DEF_IA5String.xer_decoder; + td->xer_encoder = asn_DEF_IA5String.xer_encoder; + td->elements = asn_DEF_IA5String.elements; + td->elements_count = asn_DEF_IA5String.elements_count; + td->specifics = asn_DEF_IA5String.specifics; } void -PER_Visible_free(asn1_TYPE_descriptor_t *td, +PER_Visible_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { PER_Visible_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -PER_Visible_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +PER_Visible_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { PER_Visible_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -PER_Visible_decode_ber(asn1_TYPE_descriptor_t *td, +PER_Visible_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { PER_Visible_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -PER_Visible_encode_der(asn1_TYPE_descriptor_t *td, +PER_Visible_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { PER_Visible_inherit_TYPE_descriptor(td); @@ -1249,7 +1249,7 @@ PER_Visible_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -PER_Visible_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +PER_Visible_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { PER_Visible_inherit_TYPE_descriptor(td); @@ -1259,10 +1259,10 @@ PER_Visible_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [PER-Visible] >>> ***/ -static ber_tlv_tag_t asn1_DEF_PER_Visible_tags[] = { +static ber_tlv_tag_t asn_DEF_PER_Visible_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_PER_Visible = { +asn_TYPE_descriptor_t asn_DEF_PER_Visible = { "PER-Visible", PER_Visible_free, PER_Visible_print, @@ -1272,12 +1272,12 @@ asn1_TYPE_descriptor_t asn1_DEF_PER_Visible = { 0, /* Not implemented yet */ PER_Visible_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_PER_Visible_tags, - sizeof(asn1_DEF_PER_Visible_tags) - /sizeof(asn1_DEF_PER_Visible_tags[0]), /* 1 */ - asn1_DEF_PER_Visible_tags, /* Same as above */ - sizeof(asn1_DEF_PER_Visible_tags) - /sizeof(asn1_DEF_PER_Visible_tags[0]), /* 1 */ + asn_DEF_PER_Visible_tags, + sizeof(asn_DEF_PER_Visible_tags) + /sizeof(asn_DEF_PER_Visible_tags[0]), /* 1 */ + asn_DEF_PER_Visible_tags, /* Same as above */ + sizeof(asn_DEF_PER_Visible_tags) + /sizeof(asn_DEF_PER_Visible_tags[0]), /* 1 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1294,7 +1294,7 @@ typedef PER_Visible_t PER_Visible_2_t; /*** <<< FUNC-DECLS [PER-Visible-2] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_PER_Visible_2; +extern asn_TYPE_descriptor_t asn_DEF_PER_Visible_2; asn_struct_free_f PER_Visible_2_free; asn_struct_print_f PER_Visible_2_print; asn_constr_check_f PER_Visible_2_constraint; @@ -1321,7 +1321,7 @@ static int check_permitted_alphabet_5(const void *sptr) { /*** <<< CODE [PER-Visible-2] >>> ***/ int -PER_Visible_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +PER_Visible_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const PER_Visible_t *st = sptr; @@ -1349,41 +1349,41 @@ PER_Visible_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -PER_Visible_2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_PER_Visible.free_struct; - td->print_struct = asn1_DEF_PER_Visible.print_struct; - td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; - td->der_encoder = asn1_DEF_PER_Visible.der_encoder; - td->xer_decoder = asn1_DEF_PER_Visible.xer_decoder; - td->xer_encoder = asn1_DEF_PER_Visible.xer_encoder; - td->elements = asn1_DEF_PER_Visible.elements; - td->elements_count = asn1_DEF_PER_Visible.elements_count; - td->specifics = asn1_DEF_PER_Visible.specifics; +PER_Visible_2_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_PER_Visible.free_struct; + td->print_struct = asn_DEF_PER_Visible.print_struct; + td->ber_decoder = asn_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn_DEF_PER_Visible.der_encoder; + td->xer_decoder = asn_DEF_PER_Visible.xer_decoder; + td->xer_encoder = asn_DEF_PER_Visible.xer_encoder; + td->elements = asn_DEF_PER_Visible.elements; + td->elements_count = asn_DEF_PER_Visible.elements_count; + td->specifics = asn_DEF_PER_Visible.specifics; } void -PER_Visible_2_free(asn1_TYPE_descriptor_t *td, +PER_Visible_2_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { PER_Visible_2_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -PER_Visible_2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +PER_Visible_2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { PER_Visible_2_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -PER_Visible_2_decode_ber(asn1_TYPE_descriptor_t *td, +PER_Visible_2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { PER_Visible_2_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -PER_Visible_2_encode_der(asn1_TYPE_descriptor_t *td, +PER_Visible_2_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { PER_Visible_2_inherit_TYPE_descriptor(td); @@ -1391,7 +1391,7 @@ PER_Visible_2_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -PER_Visible_2_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +PER_Visible_2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { PER_Visible_2_inherit_TYPE_descriptor(td); @@ -1401,10 +1401,10 @@ PER_Visible_2_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [PER-Visible-2] >>> ***/ -static ber_tlv_tag_t asn1_DEF_PER_Visible_2_tags[] = { +static ber_tlv_tag_t asn_DEF_PER_Visible_2_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_PER_Visible_2 = { +asn_TYPE_descriptor_t asn_DEF_PER_Visible_2 = { "PER-Visible-2", PER_Visible_2_free, PER_Visible_2_print, @@ -1414,12 +1414,12 @@ asn1_TYPE_descriptor_t asn1_DEF_PER_Visible_2 = { 0, /* Not implemented yet */ PER_Visible_2_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_PER_Visible_2_tags, - sizeof(asn1_DEF_PER_Visible_2_tags) - /sizeof(asn1_DEF_PER_Visible_2_tags[0]), /* 1 */ - asn1_DEF_PER_Visible_2_tags, /* Same as above */ - sizeof(asn1_DEF_PER_Visible_2_tags) - /sizeof(asn1_DEF_PER_Visible_2_tags[0]), /* 1 */ + asn_DEF_PER_Visible_2_tags, + sizeof(asn_DEF_PER_Visible_2_tags) + /sizeof(asn_DEF_PER_Visible_2_tags[0]), /* 1 */ + asn_DEF_PER_Visible_2_tags, /* Same as above */ + sizeof(asn_DEF_PER_Visible_2_tags) + /sizeof(asn_DEF_PER_Visible_2_tags[0]), /* 1 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1436,7 +1436,7 @@ typedef PER_Visible_t Not_PER_Visible_1_t; /*** <<< FUNC-DECLS [Not-PER-Visible-1] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_1; +extern asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_1; asn_struct_free_f Not_PER_Visible_1_free; asn_struct_print_f Not_PER_Visible_1_print; asn_constr_check_f Not_PER_Visible_1_constraint; @@ -1463,7 +1463,7 @@ static int check_permitted_alphabet_6(const void *sptr) { /*** <<< CODE [Not-PER-Visible-1] >>> ***/ int -Not_PER_Visible_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +Not_PER_Visible_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const PER_Visible_t *st = sptr; @@ -1491,41 +1491,41 @@ Not_PER_Visible_1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -Not_PER_Visible_1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_PER_Visible.free_struct; - td->print_struct = asn1_DEF_PER_Visible.print_struct; - td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; - td->der_encoder = asn1_DEF_PER_Visible.der_encoder; - td->xer_decoder = asn1_DEF_PER_Visible.xer_decoder; - td->xer_encoder = asn1_DEF_PER_Visible.xer_encoder; - td->elements = asn1_DEF_PER_Visible.elements; - td->elements_count = asn1_DEF_PER_Visible.elements_count; - td->specifics = asn1_DEF_PER_Visible.specifics; +Not_PER_Visible_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_PER_Visible.free_struct; + td->print_struct = asn_DEF_PER_Visible.print_struct; + td->ber_decoder = asn_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn_DEF_PER_Visible.der_encoder; + td->xer_decoder = asn_DEF_PER_Visible.xer_decoder; + td->xer_encoder = asn_DEF_PER_Visible.xer_encoder; + td->elements = asn_DEF_PER_Visible.elements; + td->elements_count = asn_DEF_PER_Visible.elements_count; + td->specifics = asn_DEF_PER_Visible.specifics; } void -Not_PER_Visible_1_free(asn1_TYPE_descriptor_t *td, +Not_PER_Visible_1_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { Not_PER_Visible_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -Not_PER_Visible_1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +Not_PER_Visible_1_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { Not_PER_Visible_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -Not_PER_Visible_1_decode_ber(asn1_TYPE_descriptor_t *td, +Not_PER_Visible_1_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Not_PER_Visible_1_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -Not_PER_Visible_1_encode_der(asn1_TYPE_descriptor_t *td, +Not_PER_Visible_1_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { Not_PER_Visible_1_inherit_TYPE_descriptor(td); @@ -1533,7 +1533,7 @@ Not_PER_Visible_1_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -Not_PER_Visible_1_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +Not_PER_Visible_1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { Not_PER_Visible_1_inherit_TYPE_descriptor(td); @@ -1543,10 +1543,10 @@ Not_PER_Visible_1_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Not-PER-Visible-1] >>> ***/ -static ber_tlv_tag_t asn1_DEF_Not_PER_Visible_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Not_PER_Visible_1_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_1 = { +asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_1 = { "Not-PER-Visible-1", Not_PER_Visible_1_free, Not_PER_Visible_1_print, @@ -1556,12 +1556,12 @@ asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_1 = { 0, /* Not implemented yet */ Not_PER_Visible_1_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Not_PER_Visible_1_tags, - sizeof(asn1_DEF_Not_PER_Visible_1_tags) - /sizeof(asn1_DEF_Not_PER_Visible_1_tags[0]), /* 1 */ - asn1_DEF_Not_PER_Visible_1_tags, /* Same as above */ - sizeof(asn1_DEF_Not_PER_Visible_1_tags) - /sizeof(asn1_DEF_Not_PER_Visible_1_tags[0]), /* 1 */ + asn_DEF_Not_PER_Visible_1_tags, + sizeof(asn_DEF_Not_PER_Visible_1_tags) + /sizeof(asn_DEF_Not_PER_Visible_1_tags[0]), /* 1 */ + asn_DEF_Not_PER_Visible_1_tags, /* Same as above */ + sizeof(asn_DEF_Not_PER_Visible_1_tags) + /sizeof(asn_DEF_Not_PER_Visible_1_tags[0]), /* 1 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1578,7 +1578,7 @@ typedef PER_Visible_t Not_PER_Visible_2_t; /*** <<< FUNC-DECLS [Not-PER-Visible-2] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_2; +extern asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_2; asn_struct_free_f Not_PER_Visible_2_free; asn_struct_print_f Not_PER_Visible_2_print; asn_constr_check_f Not_PER_Visible_2_constraint; @@ -1605,7 +1605,7 @@ static int check_permitted_alphabet_7(const void *sptr) { /*** <<< CODE [Not-PER-Visible-2] >>> ***/ int -Not_PER_Visible_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +Not_PER_Visible_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const PER_Visible_t *st = sptr; @@ -1633,41 +1633,41 @@ Not_PER_Visible_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -Not_PER_Visible_2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_PER_Visible.free_struct; - td->print_struct = asn1_DEF_PER_Visible.print_struct; - td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; - td->der_encoder = asn1_DEF_PER_Visible.der_encoder; - td->xer_decoder = asn1_DEF_PER_Visible.xer_decoder; - td->xer_encoder = asn1_DEF_PER_Visible.xer_encoder; - td->elements = asn1_DEF_PER_Visible.elements; - td->elements_count = asn1_DEF_PER_Visible.elements_count; - td->specifics = asn1_DEF_PER_Visible.specifics; +Not_PER_Visible_2_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_PER_Visible.free_struct; + td->print_struct = asn_DEF_PER_Visible.print_struct; + td->ber_decoder = asn_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn_DEF_PER_Visible.der_encoder; + td->xer_decoder = asn_DEF_PER_Visible.xer_decoder; + td->xer_encoder = asn_DEF_PER_Visible.xer_encoder; + td->elements = asn_DEF_PER_Visible.elements; + td->elements_count = asn_DEF_PER_Visible.elements_count; + td->specifics = asn_DEF_PER_Visible.specifics; } void -Not_PER_Visible_2_free(asn1_TYPE_descriptor_t *td, +Not_PER_Visible_2_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { Not_PER_Visible_2_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -Not_PER_Visible_2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +Not_PER_Visible_2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { Not_PER_Visible_2_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -Not_PER_Visible_2_decode_ber(asn1_TYPE_descriptor_t *td, +Not_PER_Visible_2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Not_PER_Visible_2_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -Not_PER_Visible_2_encode_der(asn1_TYPE_descriptor_t *td, +Not_PER_Visible_2_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { Not_PER_Visible_2_inherit_TYPE_descriptor(td); @@ -1675,7 +1675,7 @@ Not_PER_Visible_2_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -Not_PER_Visible_2_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +Not_PER_Visible_2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { Not_PER_Visible_2_inherit_TYPE_descriptor(td); @@ -1685,10 +1685,10 @@ Not_PER_Visible_2_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Not-PER-Visible-2] >>> ***/ -static ber_tlv_tag_t asn1_DEF_Not_PER_Visible_2_tags[] = { +static ber_tlv_tag_t asn_DEF_Not_PER_Visible_2_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_2 = { +asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_2 = { "Not-PER-Visible-2", Not_PER_Visible_2_free, Not_PER_Visible_2_print, @@ -1698,12 +1698,12 @@ asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_2 = { 0, /* Not implemented yet */ Not_PER_Visible_2_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Not_PER_Visible_2_tags, - sizeof(asn1_DEF_Not_PER_Visible_2_tags) - /sizeof(asn1_DEF_Not_PER_Visible_2_tags[0]), /* 1 */ - asn1_DEF_Not_PER_Visible_2_tags, /* Same as above */ - sizeof(asn1_DEF_Not_PER_Visible_2_tags) - /sizeof(asn1_DEF_Not_PER_Visible_2_tags[0]), /* 1 */ + asn_DEF_Not_PER_Visible_2_tags, + sizeof(asn_DEF_Not_PER_Visible_2_tags) + /sizeof(asn_DEF_Not_PER_Visible_2_tags[0]), /* 1 */ + asn_DEF_Not_PER_Visible_2_tags, /* Same as above */ + sizeof(asn_DEF_Not_PER_Visible_2_tags) + /sizeof(asn_DEF_Not_PER_Visible_2_tags[0]), /* 1 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1720,7 +1720,7 @@ typedef PER_Visible_t Not_PER_Visible_3_t; /*** <<< FUNC-DECLS [Not-PER-Visible-3] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_3; +extern asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_3; asn_struct_free_f Not_PER_Visible_3_free; asn_struct_print_f Not_PER_Visible_3_print; asn_constr_check_f Not_PER_Visible_3_constraint; @@ -1747,7 +1747,7 @@ static int check_permitted_alphabet_8(const void *sptr) { /*** <<< CODE [Not-PER-Visible-3] >>> ***/ int -Not_PER_Visible_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +Not_PER_Visible_3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const PER_Visible_t *st = sptr; @@ -1775,41 +1775,41 @@ Not_PER_Visible_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -Not_PER_Visible_3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_PER_Visible.free_struct; - td->print_struct = asn1_DEF_PER_Visible.print_struct; - td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; - td->der_encoder = asn1_DEF_PER_Visible.der_encoder; - td->xer_decoder = asn1_DEF_PER_Visible.xer_decoder; - td->xer_encoder = asn1_DEF_PER_Visible.xer_encoder; - td->elements = asn1_DEF_PER_Visible.elements; - td->elements_count = asn1_DEF_PER_Visible.elements_count; - td->specifics = asn1_DEF_PER_Visible.specifics; +Not_PER_Visible_3_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_PER_Visible.free_struct; + td->print_struct = asn_DEF_PER_Visible.print_struct; + td->ber_decoder = asn_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn_DEF_PER_Visible.der_encoder; + td->xer_decoder = asn_DEF_PER_Visible.xer_decoder; + td->xer_encoder = asn_DEF_PER_Visible.xer_encoder; + td->elements = asn_DEF_PER_Visible.elements; + td->elements_count = asn_DEF_PER_Visible.elements_count; + td->specifics = asn_DEF_PER_Visible.specifics; } void -Not_PER_Visible_3_free(asn1_TYPE_descriptor_t *td, +Not_PER_Visible_3_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { Not_PER_Visible_3_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -Not_PER_Visible_3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +Not_PER_Visible_3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { Not_PER_Visible_3_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -Not_PER_Visible_3_decode_ber(asn1_TYPE_descriptor_t *td, +Not_PER_Visible_3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Not_PER_Visible_3_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -Not_PER_Visible_3_encode_der(asn1_TYPE_descriptor_t *td, +Not_PER_Visible_3_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { Not_PER_Visible_3_inherit_TYPE_descriptor(td); @@ -1817,7 +1817,7 @@ Not_PER_Visible_3_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -Not_PER_Visible_3_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +Not_PER_Visible_3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { Not_PER_Visible_3_inherit_TYPE_descriptor(td); @@ -1827,10 +1827,10 @@ Not_PER_Visible_3_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Not-PER-Visible-3] >>> ***/ -static ber_tlv_tag_t asn1_DEF_Not_PER_Visible_3_tags[] = { +static ber_tlv_tag_t asn_DEF_Not_PER_Visible_3_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_3 = { +asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_3 = { "Not-PER-Visible-3", Not_PER_Visible_3_free, Not_PER_Visible_3_print, @@ -1840,12 +1840,12 @@ asn1_TYPE_descriptor_t asn1_DEF_Not_PER_Visible_3 = { 0, /* Not implemented yet */ Not_PER_Visible_3_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Not_PER_Visible_3_tags, - sizeof(asn1_DEF_Not_PER_Visible_3_tags) - /sizeof(asn1_DEF_Not_PER_Visible_3_tags[0]), /* 1 */ - asn1_DEF_Not_PER_Visible_3_tags, /* Same as above */ - sizeof(asn1_DEF_Not_PER_Visible_3_tags) - /sizeof(asn1_DEF_Not_PER_Visible_3_tags[0]), /* 1 */ + asn_DEF_Not_PER_Visible_3_tags, + sizeof(asn_DEF_Not_PER_Visible_3_tags) + /sizeof(asn_DEF_Not_PER_Visible_3_tags[0]), /* 1 */ + asn_DEF_Not_PER_Visible_3_tags, /* Same as above */ + sizeof(asn_DEF_Not_PER_Visible_3_tags) + /sizeof(asn_DEF_Not_PER_Visible_3_tags[0]), /* 1 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1862,7 +1862,7 @@ typedef PER_Visible_t SIZE_but_not_FROM_t; /*** <<< FUNC-DECLS [SIZE-but-not-FROM] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_SIZE_but_not_FROM; +extern asn_TYPE_descriptor_t asn_DEF_SIZE_but_not_FROM; asn_struct_free_f SIZE_but_not_FROM_free; asn_struct_print_f SIZE_but_not_FROM_print; asn_constr_check_f SIZE_but_not_FROM_constraint; @@ -1889,7 +1889,7 @@ static int check_permitted_alphabet_9(const void *sptr) { /*** <<< CODE [SIZE-but-not-FROM] >>> ***/ int -SIZE_but_not_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +SIZE_but_not_FROM_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const PER_Visible_t *st = sptr; size_t size; @@ -1920,41 +1920,41 @@ SIZE_but_not_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -SIZE_but_not_FROM_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_PER_Visible.free_struct; - td->print_struct = asn1_DEF_PER_Visible.print_struct; - td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; - td->der_encoder = asn1_DEF_PER_Visible.der_encoder; - td->xer_decoder = asn1_DEF_PER_Visible.xer_decoder; - td->xer_encoder = asn1_DEF_PER_Visible.xer_encoder; - td->elements = asn1_DEF_PER_Visible.elements; - td->elements_count = asn1_DEF_PER_Visible.elements_count; - td->specifics = asn1_DEF_PER_Visible.specifics; +SIZE_but_not_FROM_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_PER_Visible.free_struct; + td->print_struct = asn_DEF_PER_Visible.print_struct; + td->ber_decoder = asn_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn_DEF_PER_Visible.der_encoder; + td->xer_decoder = asn_DEF_PER_Visible.xer_decoder; + td->xer_encoder = asn_DEF_PER_Visible.xer_encoder; + td->elements = asn_DEF_PER_Visible.elements; + td->elements_count = asn_DEF_PER_Visible.elements_count; + td->specifics = asn_DEF_PER_Visible.specifics; } void -SIZE_but_not_FROM_free(asn1_TYPE_descriptor_t *td, +SIZE_but_not_FROM_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { SIZE_but_not_FROM_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -SIZE_but_not_FROM_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +SIZE_but_not_FROM_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { SIZE_but_not_FROM_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -SIZE_but_not_FROM_decode_ber(asn1_TYPE_descriptor_t *td, +SIZE_but_not_FROM_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { SIZE_but_not_FROM_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -SIZE_but_not_FROM_encode_der(asn1_TYPE_descriptor_t *td, +SIZE_but_not_FROM_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { SIZE_but_not_FROM_inherit_TYPE_descriptor(td); @@ -1962,7 +1962,7 @@ SIZE_but_not_FROM_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -SIZE_but_not_FROM_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +SIZE_but_not_FROM_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { SIZE_but_not_FROM_inherit_TYPE_descriptor(td); @@ -1972,10 +1972,10 @@ SIZE_but_not_FROM_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [SIZE-but-not-FROM] >>> ***/ -static ber_tlv_tag_t asn1_DEF_SIZE_but_not_FROM_tags[] = { +static ber_tlv_tag_t asn_DEF_SIZE_but_not_FROM_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_SIZE_but_not_FROM = { +asn_TYPE_descriptor_t asn_DEF_SIZE_but_not_FROM = { "SIZE-but-not-FROM", SIZE_but_not_FROM_free, SIZE_but_not_FROM_print, @@ -1985,12 +1985,12 @@ asn1_TYPE_descriptor_t asn1_DEF_SIZE_but_not_FROM = { 0, /* Not implemented yet */ SIZE_but_not_FROM_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_SIZE_but_not_FROM_tags, - sizeof(asn1_DEF_SIZE_but_not_FROM_tags) - /sizeof(asn1_DEF_SIZE_but_not_FROM_tags[0]), /* 1 */ - asn1_DEF_SIZE_but_not_FROM_tags, /* Same as above */ - sizeof(asn1_DEF_SIZE_but_not_FROM_tags) - /sizeof(asn1_DEF_SIZE_but_not_FROM_tags[0]), /* 1 */ + asn_DEF_SIZE_but_not_FROM_tags, + sizeof(asn_DEF_SIZE_but_not_FROM_tags) + /sizeof(asn_DEF_SIZE_but_not_FROM_tags[0]), /* 1 */ + asn_DEF_SIZE_but_not_FROM_tags, /* Same as above */ + sizeof(asn_DEF_SIZE_but_not_FROM_tags) + /sizeof(asn_DEF_SIZE_but_not_FROM_tags[0]), /* 1 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -2007,7 +2007,7 @@ typedef PER_Visible_t SIZE_and_FROM_t; /*** <<< FUNC-DECLS [SIZE-and-FROM] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_SIZE_and_FROM; +extern asn_TYPE_descriptor_t asn_DEF_SIZE_and_FROM; asn_struct_free_f SIZE_and_FROM_free; asn_struct_print_f SIZE_and_FROM_print; asn_constr_check_f SIZE_and_FROM_constraint; @@ -2034,7 +2034,7 @@ static int check_permitted_alphabet_10(const void *sptr) { /*** <<< CODE [SIZE-and-FROM] >>> ***/ int -SIZE_and_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +SIZE_and_FROM_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const PER_Visible_t *st = sptr; size_t size; @@ -2065,41 +2065,41 @@ SIZE_and_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -SIZE_and_FROM_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_PER_Visible.free_struct; - td->print_struct = asn1_DEF_PER_Visible.print_struct; - td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; - td->der_encoder = asn1_DEF_PER_Visible.der_encoder; - td->xer_decoder = asn1_DEF_PER_Visible.xer_decoder; - td->xer_encoder = asn1_DEF_PER_Visible.xer_encoder; - td->elements = asn1_DEF_PER_Visible.elements; - td->elements_count = asn1_DEF_PER_Visible.elements_count; - td->specifics = asn1_DEF_PER_Visible.specifics; +SIZE_and_FROM_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_PER_Visible.free_struct; + td->print_struct = asn_DEF_PER_Visible.print_struct; + td->ber_decoder = asn_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn_DEF_PER_Visible.der_encoder; + td->xer_decoder = asn_DEF_PER_Visible.xer_decoder; + td->xer_encoder = asn_DEF_PER_Visible.xer_encoder; + td->elements = asn_DEF_PER_Visible.elements; + td->elements_count = asn_DEF_PER_Visible.elements_count; + td->specifics = asn_DEF_PER_Visible.specifics; } void -SIZE_and_FROM_free(asn1_TYPE_descriptor_t *td, +SIZE_and_FROM_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { SIZE_and_FROM_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -SIZE_and_FROM_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +SIZE_and_FROM_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { SIZE_and_FROM_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -SIZE_and_FROM_decode_ber(asn1_TYPE_descriptor_t *td, +SIZE_and_FROM_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { SIZE_and_FROM_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -SIZE_and_FROM_encode_der(asn1_TYPE_descriptor_t *td, +SIZE_and_FROM_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { SIZE_and_FROM_inherit_TYPE_descriptor(td); @@ -2107,7 +2107,7 @@ SIZE_and_FROM_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -SIZE_and_FROM_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +SIZE_and_FROM_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { SIZE_and_FROM_inherit_TYPE_descriptor(td); @@ -2117,10 +2117,10 @@ SIZE_and_FROM_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [SIZE-and-FROM] >>> ***/ -static ber_tlv_tag_t asn1_DEF_SIZE_and_FROM_tags[] = { +static ber_tlv_tag_t asn_DEF_SIZE_and_FROM_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_SIZE_and_FROM = { +asn_TYPE_descriptor_t asn_DEF_SIZE_and_FROM = { "SIZE-and-FROM", SIZE_and_FROM_free, SIZE_and_FROM_print, @@ -2130,12 +2130,12 @@ asn1_TYPE_descriptor_t asn1_DEF_SIZE_and_FROM = { 0, /* Not implemented yet */ SIZE_and_FROM_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_SIZE_and_FROM_tags, - sizeof(asn1_DEF_SIZE_and_FROM_tags) - /sizeof(asn1_DEF_SIZE_and_FROM_tags[0]), /* 1 */ - asn1_DEF_SIZE_and_FROM_tags, /* Same as above */ - sizeof(asn1_DEF_SIZE_and_FROM_tags) - /sizeof(asn1_DEF_SIZE_and_FROM_tags[0]), /* 1 */ + asn_DEF_SIZE_and_FROM_tags, + sizeof(asn_DEF_SIZE_and_FROM_tags) + /sizeof(asn_DEF_SIZE_and_FROM_tags[0]), /* 1 */ + asn_DEF_SIZE_and_FROM_tags, /* Same as above */ + sizeof(asn_DEF_SIZE_and_FROM_tags) + /sizeof(asn_DEF_SIZE_and_FROM_tags[0]), /* 1 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -2152,7 +2152,7 @@ typedef PER_Visible_t Neither_SIZE_nor_FROM_t; /*** <<< FUNC-DECLS [Neither-SIZE-nor-FROM] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Neither_SIZE_nor_FROM; +extern asn_TYPE_descriptor_t asn_DEF_Neither_SIZE_nor_FROM; asn_struct_free_f Neither_SIZE_nor_FROM_free; asn_struct_print_f Neither_SIZE_nor_FROM_print; asn_constr_check_f Neither_SIZE_nor_FROM_constraint; @@ -2179,7 +2179,7 @@ static int check_permitted_alphabet_11(const void *sptr) { /*** <<< CODE [Neither-SIZE-nor-FROM] >>> ***/ int -Neither_SIZE_nor_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +Neither_SIZE_nor_FROM_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const PER_Visible_t *st = sptr; @@ -2207,41 +2207,41 @@ Neither_SIZE_nor_FROM_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -Neither_SIZE_nor_FROM_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_PER_Visible.free_struct; - td->print_struct = asn1_DEF_PER_Visible.print_struct; - td->ber_decoder = asn1_DEF_PER_Visible.ber_decoder; - td->der_encoder = asn1_DEF_PER_Visible.der_encoder; - td->xer_decoder = asn1_DEF_PER_Visible.xer_decoder; - td->xer_encoder = asn1_DEF_PER_Visible.xer_encoder; - td->elements = asn1_DEF_PER_Visible.elements; - td->elements_count = asn1_DEF_PER_Visible.elements_count; - td->specifics = asn1_DEF_PER_Visible.specifics; +Neither_SIZE_nor_FROM_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_PER_Visible.free_struct; + td->print_struct = asn_DEF_PER_Visible.print_struct; + td->ber_decoder = asn_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn_DEF_PER_Visible.der_encoder; + td->xer_decoder = asn_DEF_PER_Visible.xer_decoder; + td->xer_encoder = asn_DEF_PER_Visible.xer_encoder; + td->elements = asn_DEF_PER_Visible.elements; + td->elements_count = asn_DEF_PER_Visible.elements_count; + td->specifics = asn_DEF_PER_Visible.specifics; } void -Neither_SIZE_nor_FROM_free(asn1_TYPE_descriptor_t *td, +Neither_SIZE_nor_FROM_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { Neither_SIZE_nor_FROM_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -Neither_SIZE_nor_FROM_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +Neither_SIZE_nor_FROM_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { Neither_SIZE_nor_FROM_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -Neither_SIZE_nor_FROM_decode_ber(asn1_TYPE_descriptor_t *td, +Neither_SIZE_nor_FROM_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Neither_SIZE_nor_FROM_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -Neither_SIZE_nor_FROM_encode_der(asn1_TYPE_descriptor_t *td, +Neither_SIZE_nor_FROM_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { Neither_SIZE_nor_FROM_inherit_TYPE_descriptor(td); @@ -2249,7 +2249,7 @@ Neither_SIZE_nor_FROM_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -Neither_SIZE_nor_FROM_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +Neither_SIZE_nor_FROM_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { Neither_SIZE_nor_FROM_inherit_TYPE_descriptor(td); @@ -2259,10 +2259,10 @@ Neither_SIZE_nor_FROM_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Neither-SIZE-nor-FROM] >>> ***/ -static ber_tlv_tag_t asn1_DEF_Neither_SIZE_nor_FROM_tags[] = { +static ber_tlv_tag_t asn_DEF_Neither_SIZE_nor_FROM_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_Neither_SIZE_nor_FROM = { +asn_TYPE_descriptor_t asn_DEF_Neither_SIZE_nor_FROM = { "Neither-SIZE-nor-FROM", Neither_SIZE_nor_FROM_free, Neither_SIZE_nor_FROM_print, @@ -2272,12 +2272,12 @@ asn1_TYPE_descriptor_t asn1_DEF_Neither_SIZE_nor_FROM = { 0, /* Not implemented yet */ Neither_SIZE_nor_FROM_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Neither_SIZE_nor_FROM_tags, - sizeof(asn1_DEF_Neither_SIZE_nor_FROM_tags) - /sizeof(asn1_DEF_Neither_SIZE_nor_FROM_tags[0]), /* 1 */ - asn1_DEF_Neither_SIZE_nor_FROM_tags, /* Same as above */ - sizeof(asn1_DEF_Neither_SIZE_nor_FROM_tags) - /sizeof(asn1_DEF_Neither_SIZE_nor_FROM_tags[0]), /* 1 */ + asn_DEF_Neither_SIZE_nor_FROM_tags, + sizeof(asn_DEF_Neither_SIZE_nor_FROM_tags) + /sizeof(asn_DEF_Neither_SIZE_nor_FROM_tags[0]), /* 1 */ + asn_DEF_Neither_SIZE_nor_FROM_tags, /* Same as above */ + sizeof(asn_DEF_Neither_SIZE_nor_FROM_tags) + /sizeof(asn_DEF_Neither_SIZE_nor_FROM_tags[0]), /* 1 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -2294,7 +2294,7 @@ typedef Utf8_2_t Utf8_3_t; /*** <<< FUNC-DECLS [Utf8-3] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Utf8_3; +extern asn_TYPE_descriptor_t asn_DEF_Utf8_3; asn_struct_free_f Utf8_3_free; asn_struct_print_f Utf8_3_print; asn_constr_check_f Utf8_3_constraint; @@ -2334,7 +2334,7 @@ static int check_permitted_alphabet_12(const void *sptr) { /*** <<< CODE [Utf8-3] >>> ***/ int -Utf8_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +Utf8_3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const Utf8_2_t *st = sptr; size_t size; @@ -2366,41 +2366,41 @@ Utf8_3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -Utf8_3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_Utf8_2.free_struct; - td->print_struct = asn1_DEF_Utf8_2.print_struct; - td->ber_decoder = asn1_DEF_Utf8_2.ber_decoder; - td->der_encoder = asn1_DEF_Utf8_2.der_encoder; - td->xer_decoder = asn1_DEF_Utf8_2.xer_decoder; - td->xer_encoder = asn1_DEF_Utf8_2.xer_encoder; - td->elements = asn1_DEF_Utf8_2.elements; - td->elements_count = asn1_DEF_Utf8_2.elements_count; - td->specifics = asn1_DEF_Utf8_2.specifics; +Utf8_3_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Utf8_2.free_struct; + td->print_struct = asn_DEF_Utf8_2.print_struct; + td->ber_decoder = asn_DEF_Utf8_2.ber_decoder; + td->der_encoder = asn_DEF_Utf8_2.der_encoder; + td->xer_decoder = asn_DEF_Utf8_2.xer_decoder; + td->xer_encoder = asn_DEF_Utf8_2.xer_encoder; + td->elements = asn_DEF_Utf8_2.elements; + td->elements_count = asn_DEF_Utf8_2.elements_count; + td->specifics = asn_DEF_Utf8_2.specifics; } void -Utf8_3_free(asn1_TYPE_descriptor_t *td, +Utf8_3_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { Utf8_3_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -Utf8_3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +Utf8_3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { Utf8_3_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -Utf8_3_decode_ber(asn1_TYPE_descriptor_t *td, +Utf8_3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Utf8_3_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -Utf8_3_encode_der(asn1_TYPE_descriptor_t *td, +Utf8_3_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { Utf8_3_inherit_TYPE_descriptor(td); @@ -2408,7 +2408,7 @@ Utf8_3_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -Utf8_3_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +Utf8_3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { Utf8_3_inherit_TYPE_descriptor(td); @@ -2418,10 +2418,10 @@ Utf8_3_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Utf8-3] >>> ***/ -static ber_tlv_tag_t asn1_DEF_Utf8_3_tags[] = { +static ber_tlv_tag_t asn_DEF_Utf8_3_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_Utf8_3 = { +asn_TYPE_descriptor_t asn_DEF_Utf8_3 = { "Utf8-3", Utf8_3_free, Utf8_3_print, @@ -2431,12 +2431,12 @@ asn1_TYPE_descriptor_t asn1_DEF_Utf8_3 = { 0, /* Not implemented yet */ Utf8_3_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Utf8_3_tags, - sizeof(asn1_DEF_Utf8_3_tags) - /sizeof(asn1_DEF_Utf8_3_tags[0]), /* 1 */ - asn1_DEF_Utf8_3_tags, /* Same as above */ - sizeof(asn1_DEF_Utf8_3_tags) - /sizeof(asn1_DEF_Utf8_3_tags[0]), /* 1 */ + asn_DEF_Utf8_3_tags, + sizeof(asn_DEF_Utf8_3_tags) + /sizeof(asn_DEF_Utf8_3_tags[0]), /* 1 */ + asn_DEF_Utf8_3_tags, /* Same as above */ + sizeof(asn_DEF_Utf8_3_tags) + /sizeof(asn_DEF_Utf8_3_tags[0]), /* 1 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -2453,7 +2453,7 @@ typedef Utf8_1_t Utf8_2_t; /*** <<< FUNC-DECLS [Utf8-2] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Utf8_2; +extern asn_TYPE_descriptor_t asn_DEF_Utf8_2; asn_struct_free_f Utf8_2_free; asn_struct_print_f Utf8_2_print; asn_constr_check_f Utf8_2_constraint; @@ -2464,7 +2464,7 @@ xer_type_encoder_f Utf8_2_encode_xer; /*** <<< CODE [Utf8-2] >>> ***/ int -Utf8_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +Utf8_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const Utf8_1_t *st = sptr; size_t size; @@ -2495,41 +2495,41 @@ Utf8_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -Utf8_2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_Utf8_1.free_struct; - td->print_struct = asn1_DEF_Utf8_1.print_struct; - td->ber_decoder = asn1_DEF_Utf8_1.ber_decoder; - td->der_encoder = asn1_DEF_Utf8_1.der_encoder; - td->xer_decoder = asn1_DEF_Utf8_1.xer_decoder; - td->xer_encoder = asn1_DEF_Utf8_1.xer_encoder; - td->elements = asn1_DEF_Utf8_1.elements; - td->elements_count = asn1_DEF_Utf8_1.elements_count; - td->specifics = asn1_DEF_Utf8_1.specifics; +Utf8_2_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Utf8_1.free_struct; + td->print_struct = asn_DEF_Utf8_1.print_struct; + td->ber_decoder = asn_DEF_Utf8_1.ber_decoder; + td->der_encoder = asn_DEF_Utf8_1.der_encoder; + td->xer_decoder = asn_DEF_Utf8_1.xer_decoder; + td->xer_encoder = asn_DEF_Utf8_1.xer_encoder; + td->elements = asn_DEF_Utf8_1.elements; + td->elements_count = asn_DEF_Utf8_1.elements_count; + td->specifics = asn_DEF_Utf8_1.specifics; } void -Utf8_2_free(asn1_TYPE_descriptor_t *td, +Utf8_2_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { Utf8_2_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -Utf8_2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +Utf8_2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { Utf8_2_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -Utf8_2_decode_ber(asn1_TYPE_descriptor_t *td, +Utf8_2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Utf8_2_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -Utf8_2_encode_der(asn1_TYPE_descriptor_t *td, +Utf8_2_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { Utf8_2_inherit_TYPE_descriptor(td); @@ -2537,7 +2537,7 @@ Utf8_2_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -Utf8_2_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +Utf8_2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { Utf8_2_inherit_TYPE_descriptor(td); @@ -2547,10 +2547,10 @@ Utf8_2_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Utf8-2] >>> ***/ -static ber_tlv_tag_t asn1_DEF_Utf8_2_tags[] = { +static ber_tlv_tag_t asn_DEF_Utf8_2_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_Utf8_2 = { +asn_TYPE_descriptor_t asn_DEF_Utf8_2 = { "Utf8-2", Utf8_2_free, Utf8_2_print, @@ -2560,12 +2560,12 @@ asn1_TYPE_descriptor_t asn1_DEF_Utf8_2 = { 0, /* Not implemented yet */ Utf8_2_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Utf8_2_tags, - sizeof(asn1_DEF_Utf8_2_tags) - /sizeof(asn1_DEF_Utf8_2_tags[0]), /* 1 */ - asn1_DEF_Utf8_2_tags, /* Same as above */ - sizeof(asn1_DEF_Utf8_2_tags) - /sizeof(asn1_DEF_Utf8_2_tags[0]), /* 1 */ + asn_DEF_Utf8_2_tags, + sizeof(asn_DEF_Utf8_2_tags) + /sizeof(asn_DEF_Utf8_2_tags[0]), /* 1 */ + asn_DEF_Utf8_2_tags, /* Same as above */ + sizeof(asn_DEF_Utf8_2_tags) + /sizeof(asn_DEF_Utf8_2_tags[0]), /* 1 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -2583,7 +2583,7 @@ typedef UTF8String_t Utf8_1_t; /*** <<< FUNC-DECLS [Utf8-1] >>> ***/ /* This type is equivalent to UTF8String */ -#define asn1_DEF_Utf8_1 asn1_DEF_UTF8String +#define asn_DEF_Utf8_1 asn_DEF_UTF8String /*** <<< CODE [Utf8-1] >>> ***/ @@ -2602,7 +2602,7 @@ typedef Identifier_t VisibleIdentifier_t; /*** <<< FUNC-DECLS [VisibleIdentifier] >>> ***/ /* This type is equivalent to Identifier */ -#define asn1_DEF_VisibleIdentifier asn1_DEF_Identifier +#define asn_DEF_VisibleIdentifier asn_DEF_Identifier /*** <<< CODE [VisibleIdentifier] >>> ***/ @@ -2620,7 +2620,7 @@ typedef VisibleString_t Identifier_t; /*** <<< FUNC-DECLS [Identifier] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Identifier; +extern asn_TYPE_descriptor_t asn_DEF_Identifier; asn_struct_free_f Identifier_free; asn_struct_print_f Identifier_print; asn_constr_check_f Identifier_constraint; @@ -2659,7 +2659,7 @@ static int check_permitted_alphabet_14(const void *sptr) { /*** <<< CODE [Identifier] >>> ***/ int -Identifier_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +Identifier_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const VisibleString_t *st = sptr; size_t size; @@ -2690,41 +2690,41 @@ Identifier_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -Identifier_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_VisibleString.free_struct; - td->print_struct = asn1_DEF_VisibleString.print_struct; - td->ber_decoder = asn1_DEF_VisibleString.ber_decoder; - td->der_encoder = asn1_DEF_VisibleString.der_encoder; - td->xer_decoder = asn1_DEF_VisibleString.xer_decoder; - td->xer_encoder = asn1_DEF_VisibleString.xer_encoder; - td->elements = asn1_DEF_VisibleString.elements; - td->elements_count = asn1_DEF_VisibleString.elements_count; - td->specifics = asn1_DEF_VisibleString.specifics; +Identifier_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_VisibleString.free_struct; + td->print_struct = asn_DEF_VisibleString.print_struct; + td->ber_decoder = asn_DEF_VisibleString.ber_decoder; + td->der_encoder = asn_DEF_VisibleString.der_encoder; + td->xer_decoder = asn_DEF_VisibleString.xer_decoder; + td->xer_encoder = asn_DEF_VisibleString.xer_encoder; + td->elements = asn_DEF_VisibleString.elements; + td->elements_count = asn_DEF_VisibleString.elements_count; + td->specifics = asn_DEF_VisibleString.specifics; } void -Identifier_free(asn1_TYPE_descriptor_t *td, +Identifier_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { Identifier_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -Identifier_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +Identifier_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { Identifier_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -Identifier_decode_ber(asn1_TYPE_descriptor_t *td, +Identifier_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Identifier_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -Identifier_encode_der(asn1_TYPE_descriptor_t *td, +Identifier_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { Identifier_inherit_TYPE_descriptor(td); @@ -2732,7 +2732,7 @@ Identifier_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -Identifier_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +Identifier_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { Identifier_inherit_TYPE_descriptor(td); @@ -2742,10 +2742,10 @@ Identifier_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Identifier] >>> ***/ -static ber_tlv_tag_t asn1_DEF_Identifier_tags[] = { +static ber_tlv_tag_t asn_DEF_Identifier_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_Identifier = { +asn_TYPE_descriptor_t asn_DEF_Identifier = { "Identifier", Identifier_free, Identifier_print, @@ -2755,12 +2755,12 @@ asn1_TYPE_descriptor_t asn1_DEF_Identifier = { 0, /* Not implemented yet */ Identifier_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Identifier_tags, - sizeof(asn1_DEF_Identifier_tags) - /sizeof(asn1_DEF_Identifier_tags[0]), /* 1 */ - asn1_DEF_Identifier_tags, /* Same as above */ - sizeof(asn1_DEF_Identifier_tags) - /sizeof(asn1_DEF_Identifier_tags[0]), /* 1 */ + asn_DEF_Identifier_tags, + sizeof(asn_DEF_Identifier_tags) + /sizeof(asn_DEF_Identifier_tags[0]), /* 1 */ + asn_DEF_Identifier_tags, /* Same as above */ + sizeof(asn_DEF_Identifier_tags) + /sizeof(asn_DEF_Identifier_tags[0]), /* 1 */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/tests/60-any-OK.asn1.-P b/tests/60-any-OK.asn1.-P index ded466ba6..59aa7b1db 100644 --- a/tests/60-any-OK.asn1.-P +++ b/tests/60-any-OK.asn1.-P @@ -7,7 +7,7 @@ /*** <<< DEPS [T1] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_T1; +extern asn_TYPE_descriptor_t asn_DEF_T1; /*** <<< TYPE-DECLS [T1] >>> ***/ @@ -17,42 +17,42 @@ typedef struct T1 { ANY_t any; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } T1_t; /*** <<< STAT-DEFS [T1] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_T1[] = { +static asn_TYPE_member_t asn_MBR_T1[] = { { ATF_NOFLAGS, 0, offsetof(struct T1, i), .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_INTEGER, + .type = (void *)&asn_DEF_INTEGER, .memb_constraints = 0, /* Defer to actual type */ .name = "i" }, { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct T1, any), .tag = -1 /* Ambiguous tag (ANY?) */, .tag_mode = 0, - .type = (void *)&asn1_DEF_ANY, + .type = (void *)&asn_DEF_ANY, .memb_constraints = 0, /* Defer to actual type */ .name = "any" }, }; -static ber_tlv_tag_t asn1_DEF_T1_tags[] = { +static ber_tlv_tag_t asn_DEF_T1_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_TYPE_tag2member_t asn1_DEF_T1_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_T1_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 15 */ }; -static asn1_SEQUENCE_specifics_t asn1_DEF_T1_specs = { +static asn_SEQUENCE_specifics_t asn_DEF_T1_specs = { sizeof(struct T1), - offsetof(struct T1, _ber_dec_ctx), - asn1_DEF_T1_tag2el, + offsetof(struct T1, _asn_ctx), + asn_DEF_T1_tag2el, 1, /* Count of tags in the map */ -1, /* Start extensions */ -1 /* Stop extensions */ }; -asn1_TYPE_descriptor_t asn1_DEF_T1 = { +asn_TYPE_descriptor_t asn_DEF_T1 = { "T1", SEQUENCE_free, SEQUENCE_print, @@ -62,15 +62,15 @@ asn1_TYPE_descriptor_t asn1_DEF_T1 = { 0, /* Not implemented yet */ SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T1_tags, - sizeof(asn1_DEF_T1_tags) - /sizeof(asn1_DEF_T1_tags[0]), /* 1 */ - asn1_DEF_T1_tags, /* Same as above */ - sizeof(asn1_DEF_T1_tags) - /sizeof(asn1_DEF_T1_tags[0]), /* 1 */ - asn1_MBR_T1, + asn_DEF_T1_tags, + sizeof(asn_DEF_T1_tags) + /sizeof(asn_DEF_T1_tags[0]), /* 1 */ + asn_DEF_T1_tags, /* Same as above */ + sizeof(asn_DEF_T1_tags) + /sizeof(asn_DEF_T1_tags[0]), /* 1 */ + asn_MBR_T1, 2, /* Elements count */ - &asn1_DEF_T1_specs /* Additional specs */ + &asn_DEF_T1_specs /* Additional specs */ }; @@ -82,7 +82,7 @@ asn1_TYPE_descriptor_t asn1_DEF_T1 = { /*** <<< DEPS [T2] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_T2; +extern asn_TYPE_descriptor_t asn_DEF_T2; /*** <<< TYPE-DECLS [T2] >>> ***/ @@ -92,43 +92,43 @@ typedef struct T2 { ANY_t *any /* OPTIONAL */; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } T2_t; /*** <<< STAT-DEFS [T2] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_T2[] = { +static asn_TYPE_member_t asn_MBR_T2[] = { { ATF_NOFLAGS, 0, offsetof(struct T2, i), .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_INTEGER, + .type = (void *)&asn_DEF_INTEGER, .memb_constraints = 0, /* Defer to actual type */ .name = "i" }, { ATF_POINTER, 1, offsetof(struct T2, any), .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), .tag_mode = +1, /* EXPLICIT tag at current level */ - .type = (void *)&asn1_DEF_ANY, + .type = (void *)&asn_DEF_ANY, .memb_constraints = 0, /* Defer to actual type */ .name = "any" }, }; -static ber_tlv_tag_t asn1_DEF_T2_tags[] = { +static ber_tlv_tag_t asn_DEF_T2_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_TYPE_tag2member_t asn1_DEF_T2_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_T2_tag2el[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 20 */ { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 }, /* any at 21 */ }; -static asn1_SEQUENCE_specifics_t asn1_DEF_T2_specs = { +static asn_SEQUENCE_specifics_t asn_DEF_T2_specs = { sizeof(struct T2), - offsetof(struct T2, _ber_dec_ctx), - asn1_DEF_T2_tag2el, + offsetof(struct T2, _asn_ctx), + asn_DEF_T2_tag2el, 2, /* Count of tags in the map */ -1, /* Start extensions */ -1 /* Stop extensions */ }; -asn1_TYPE_descriptor_t asn1_DEF_T2 = { +asn_TYPE_descriptor_t asn_DEF_T2 = { "T2", SEQUENCE_free, SEQUENCE_print, @@ -138,14 +138,14 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { 0, /* Not implemented yet */ SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T2_tags, - sizeof(asn1_DEF_T2_tags) - /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ - asn1_DEF_T2_tags, /* Same as above */ - sizeof(asn1_DEF_T2_tags) - /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ - asn1_MBR_T2, + asn_DEF_T2_tags, + sizeof(asn_DEF_T2_tags) + /sizeof(asn_DEF_T2_tags[0]), /* 1 */ + asn_DEF_T2_tags, /* Same as above */ + sizeof(asn_DEF_T2_tags) + /sizeof(asn_DEF_T2_tags[0]), /* 1 */ + asn_MBR_T2, 2, /* Elements count */ - &asn1_DEF_T2_specs /* Additional specs */ + &asn_DEF_T2_specs /* Additional specs */ }; diff --git a/tests/65-multi-tag-OK.asn1.-P b/tests/65-multi-tag-OK.asn1.-P index 150fb21a2..995697ee7 100644 --- a/tests/65-multi-tag-OK.asn1.-P +++ b/tests/65-multi-tag-OK.asn1.-P @@ -10,7 +10,7 @@ typedef T2_t T1_t; /*** <<< FUNC-DECLS [T1] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_T1; +extern asn_TYPE_descriptor_t asn_DEF_T1; asn_struct_free_f T1_free; asn_struct_print_f T1_print; asn_constr_check_f T1_constraint; @@ -21,10 +21,10 @@ xer_type_encoder_f T1_encode_xer; /*** <<< CODE [T1] >>> ***/ int -T1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +T1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { /* Replace with underlying type checker */ - td->check_constraints = asn1_DEF_T2.check_constraints; + td->check_constraints = asn_DEF_T2.check_constraints; return td->check_constraints(td, sptr, app_errlog, app_key); } @@ -33,41 +33,41 @@ T1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -T1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_T2.free_struct; - td->print_struct = asn1_DEF_T2.print_struct; - td->ber_decoder = asn1_DEF_T2.ber_decoder; - td->der_encoder = asn1_DEF_T2.der_encoder; - td->xer_decoder = asn1_DEF_T2.xer_decoder; - td->xer_encoder = asn1_DEF_T2.xer_encoder; - td->elements = asn1_DEF_T2.elements; - td->elements_count = asn1_DEF_T2.elements_count; - td->specifics = asn1_DEF_T2.specifics; +T1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_T2.free_struct; + td->print_struct = asn_DEF_T2.print_struct; + td->ber_decoder = asn_DEF_T2.ber_decoder; + td->der_encoder = asn_DEF_T2.der_encoder; + td->xer_decoder = asn_DEF_T2.xer_decoder; + td->xer_encoder = asn_DEF_T2.xer_encoder; + td->elements = asn_DEF_T2.elements; + td->elements_count = asn_DEF_T2.elements_count; + td->specifics = asn_DEF_T2.specifics; } void -T1_free(asn1_TYPE_descriptor_t *td, +T1_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { T1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -T1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +T1_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { T1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -T1_decode_ber(asn1_TYPE_descriptor_t *td, +T1_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T1_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -T1_encode_der(asn1_TYPE_descriptor_t *td, +T1_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { T1_inherit_TYPE_descriptor(td); @@ -75,7 +75,7 @@ T1_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -T1_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +T1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { T1_inherit_TYPE_descriptor(td); @@ -85,13 +85,13 @@ T1_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T1] >>> ***/ -static ber_tlv_tag_t asn1_DEF_T1_tags[] = { +static ber_tlv_tag_t asn_DEF_T1_tags[] = { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)) }; -static ber_tlv_tag_t asn1_DEF_T1_all_tags[] = { +static ber_tlv_tag_t asn_DEF_T1_all_tags[] = { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), @@ -99,7 +99,7 @@ static ber_tlv_tag_t asn1_DEF_T1_all_tags[] = { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_T1 = { +asn_TYPE_descriptor_t asn_DEF_T1 = { "T1", T1_free, T1_print, @@ -109,12 +109,12 @@ asn1_TYPE_descriptor_t asn1_DEF_T1 = { 0, /* Not implemented yet */ T1_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T1_tags, - sizeof(asn1_DEF_T1_tags) - /sizeof(asn1_DEF_T1_tags[0]), /* 4 */ - asn1_DEF_T1_all_tags, - sizeof(asn1_DEF_T1_all_tags) - /sizeof(asn1_DEF_T1_all_tags[0]), /* 6 */ + asn_DEF_T1_tags, + sizeof(asn_DEF_T1_tags) + /sizeof(asn_DEF_T1_tags[0]), /* 4 */ + asn_DEF_T1_all_tags, + sizeof(asn_DEF_T1_all_tags) + /sizeof(asn_DEF_T1_all_tags[0]), /* 6 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -131,7 +131,7 @@ typedef T3_t T2_t; /*** <<< FUNC-DECLS [T2] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_T2; +extern asn_TYPE_descriptor_t asn_DEF_T2; asn_struct_free_f T2_free; asn_struct_print_f T2_print; asn_constr_check_f T2_constraint; @@ -142,10 +142,10 @@ xer_type_encoder_f T2_encode_xer; /*** <<< CODE [T2] >>> ***/ int -T2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +T2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { /* Replace with underlying type checker */ - td->check_constraints = asn1_DEF_T3.check_constraints; + td->check_constraints = asn_DEF_T3.check_constraints; return td->check_constraints(td, sptr, app_errlog, app_key); } @@ -154,41 +154,41 @@ T2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -T2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_T3.free_struct; - td->print_struct = asn1_DEF_T3.print_struct; - td->ber_decoder = asn1_DEF_T3.ber_decoder; - td->der_encoder = asn1_DEF_T3.der_encoder; - td->xer_decoder = asn1_DEF_T3.xer_decoder; - td->xer_encoder = asn1_DEF_T3.xer_encoder; - td->elements = asn1_DEF_T3.elements; - td->elements_count = asn1_DEF_T3.elements_count; - td->specifics = asn1_DEF_T3.specifics; +T2_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_T3.free_struct; + td->print_struct = asn_DEF_T3.print_struct; + td->ber_decoder = asn_DEF_T3.ber_decoder; + td->der_encoder = asn_DEF_T3.der_encoder; + td->xer_decoder = asn_DEF_T3.xer_decoder; + td->xer_encoder = asn_DEF_T3.xer_encoder; + td->elements = asn_DEF_T3.elements; + td->elements_count = asn_DEF_T3.elements_count; + td->specifics = asn_DEF_T3.specifics; } void -T2_free(asn1_TYPE_descriptor_t *td, +T2_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { T2_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -T2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +T2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { T2_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -T2_decode_ber(asn1_TYPE_descriptor_t *td, +T2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T2_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -T2_encode_der(asn1_TYPE_descriptor_t *td, +T2_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { T2_inherit_TYPE_descriptor(td); @@ -196,7 +196,7 @@ T2_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -T2_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +T2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { T2_inherit_TYPE_descriptor(td); @@ -206,19 +206,19 @@ T2_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T2] >>> ***/ -static ber_tlv_tag_t asn1_DEF_T2_tags[] = { +static ber_tlv_tag_t asn_DEF_T2_tags[] = { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)) }; -static ber_tlv_tag_t asn1_DEF_T2_all_tags[] = { +static ber_tlv_tag_t asn_DEF_T2_all_tags[] = { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_T2 = { +asn_TYPE_descriptor_t asn_DEF_T2 = { "T2", T2_free, T2_print, @@ -228,12 +228,12 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { 0, /* Not implemented yet */ T2_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T2_tags, - sizeof(asn1_DEF_T2_tags) - /sizeof(asn1_DEF_T2_tags[0]), /* 3 */ - asn1_DEF_T2_all_tags, - sizeof(asn1_DEF_T2_all_tags) - /sizeof(asn1_DEF_T2_all_tags[0]), /* 5 */ + asn_DEF_T2_tags, + sizeof(asn_DEF_T2_tags) + /sizeof(asn_DEF_T2_tags[0]), /* 3 */ + asn_DEF_T2_all_tags, + sizeof(asn_DEF_T2_all_tags) + /sizeof(asn_DEF_T2_all_tags[0]), /* 5 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -250,7 +250,7 @@ typedef T4_t T3_t; /*** <<< FUNC-DECLS [T3] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_T3; +extern asn_TYPE_descriptor_t asn_DEF_T3; asn_struct_free_f T3_free; asn_struct_print_f T3_print; asn_constr_check_f T3_constraint; @@ -261,10 +261,10 @@ xer_type_encoder_f T3_encode_xer; /*** <<< CODE [T3] >>> ***/ int -T3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +T3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { /* Replace with underlying type checker */ - td->check_constraints = asn1_DEF_T4.check_constraints; + td->check_constraints = asn_DEF_T4.check_constraints; return td->check_constraints(td, sptr, app_errlog, app_key); } @@ -273,41 +273,41 @@ T3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -T3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_T4.free_struct; - td->print_struct = asn1_DEF_T4.print_struct; - td->ber_decoder = asn1_DEF_T4.ber_decoder; - td->der_encoder = asn1_DEF_T4.der_encoder; - td->xer_decoder = asn1_DEF_T4.xer_decoder; - td->xer_encoder = asn1_DEF_T4.xer_encoder; - td->elements = asn1_DEF_T4.elements; - td->elements_count = asn1_DEF_T4.elements_count; - td->specifics = asn1_DEF_T4.specifics; +T3_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_T4.free_struct; + td->print_struct = asn_DEF_T4.print_struct; + td->ber_decoder = asn_DEF_T4.ber_decoder; + td->der_encoder = asn_DEF_T4.der_encoder; + td->xer_decoder = asn_DEF_T4.xer_decoder; + td->xer_encoder = asn_DEF_T4.xer_encoder; + td->elements = asn_DEF_T4.elements; + td->elements_count = asn_DEF_T4.elements_count; + td->specifics = asn_DEF_T4.specifics; } void -T3_free(asn1_TYPE_descriptor_t *td, +T3_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { T3_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -T3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +T3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { T3_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -T3_decode_ber(asn1_TYPE_descriptor_t *td, +T3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T3_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -T3_encode_der(asn1_TYPE_descriptor_t *td, +T3_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { T3_inherit_TYPE_descriptor(td); @@ -315,7 +315,7 @@ T3_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -T3_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +T3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { T3_inherit_TYPE_descriptor(td); @@ -325,17 +325,17 @@ T3_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T3] >>> ***/ -static ber_tlv_tag_t asn1_DEF_T3_tags[] = { +static ber_tlv_tag_t asn_DEF_T3_tags[] = { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)) }; -static ber_tlv_tag_t asn1_DEF_T3_all_tags[] = { +static ber_tlv_tag_t asn_DEF_T3_all_tags[] = { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_T3 = { +asn_TYPE_descriptor_t asn_DEF_T3 = { "T3", T3_free, T3_print, @@ -345,12 +345,12 @@ asn1_TYPE_descriptor_t asn1_DEF_T3 = { 0, /* Not implemented yet */ T3_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T3_tags, - sizeof(asn1_DEF_T3_tags) - /sizeof(asn1_DEF_T3_tags[0]), /* 2 */ - asn1_DEF_T3_all_tags, - sizeof(asn1_DEF_T3_all_tags) - /sizeof(asn1_DEF_T3_all_tags[0]), /* 4 */ + asn_DEF_T3_tags, + sizeof(asn_DEF_T3_tags) + /sizeof(asn_DEF_T3_tags[0]), /* 2 */ + asn_DEF_T3_all_tags, + sizeof(asn_DEF_T3_all_tags) + /sizeof(asn_DEF_T3_all_tags[0]), /* 4 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -367,7 +367,7 @@ typedef T5_t T4_t; /*** <<< FUNC-DECLS [T4] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_T4; +extern asn_TYPE_descriptor_t asn_DEF_T4; asn_struct_free_f T4_free; asn_struct_print_f T4_print; asn_constr_check_f T4_constraint; @@ -378,10 +378,10 @@ xer_type_encoder_f T4_encode_xer; /*** <<< CODE [T4] >>> ***/ int -T4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +T4_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { /* Replace with underlying type checker */ - td->check_constraints = asn1_DEF_T5.check_constraints; + td->check_constraints = asn_DEF_T5.check_constraints; return td->check_constraints(td, sptr, app_errlog, app_key); } @@ -390,41 +390,41 @@ T4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -T4_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_T5.free_struct; - td->print_struct = asn1_DEF_T5.print_struct; - td->ber_decoder = asn1_DEF_T5.ber_decoder; - td->der_encoder = asn1_DEF_T5.der_encoder; - td->xer_decoder = asn1_DEF_T5.xer_decoder; - td->xer_encoder = asn1_DEF_T5.xer_encoder; - td->elements = asn1_DEF_T5.elements; - td->elements_count = asn1_DEF_T5.elements_count; - td->specifics = asn1_DEF_T5.specifics; +T4_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_T5.free_struct; + td->print_struct = asn_DEF_T5.print_struct; + td->ber_decoder = asn_DEF_T5.ber_decoder; + td->der_encoder = asn_DEF_T5.der_encoder; + td->xer_decoder = asn_DEF_T5.xer_decoder; + td->xer_encoder = asn_DEF_T5.xer_encoder; + td->elements = asn_DEF_T5.elements; + td->elements_count = asn_DEF_T5.elements_count; + td->specifics = asn_DEF_T5.specifics; } void -T4_free(asn1_TYPE_descriptor_t *td, +T4_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { T4_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -T4_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +T4_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { T4_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -T4_decode_ber(asn1_TYPE_descriptor_t *td, +T4_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T4_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -T4_encode_der(asn1_TYPE_descriptor_t *td, +T4_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { T4_inherit_TYPE_descriptor(td); @@ -432,7 +432,7 @@ T4_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -T4_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +T4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { T4_inherit_TYPE_descriptor(td); @@ -442,12 +442,12 @@ T4_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T4] >>> ***/ -static ber_tlv_tag_t asn1_DEF_T4_tags[] = { +static ber_tlv_tag_t asn_DEF_T4_tags[] = { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_T4 = { +asn_TYPE_descriptor_t asn_DEF_T4 = { "T4", T4_free, T4_print, @@ -457,12 +457,12 @@ asn1_TYPE_descriptor_t asn1_DEF_T4 = { 0, /* Not implemented yet */ T4_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T4_tags, - sizeof(asn1_DEF_T4_tags) - /sizeof(asn1_DEF_T4_tags[0]) - 1, /* 2 */ - asn1_DEF_T4_tags, /* Same as above */ - sizeof(asn1_DEF_T4_tags) - /sizeof(asn1_DEF_T4_tags[0]), /* 3 */ + asn_DEF_T4_tags, + sizeof(asn_DEF_T4_tags) + /sizeof(asn_DEF_T4_tags[0]) - 1, /* 2 */ + asn_DEF_T4_tags, /* Same as above */ + sizeof(asn_DEF_T4_tags) + /sizeof(asn_DEF_T4_tags[0]), /* 3 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -479,7 +479,7 @@ typedef T6_t T5_t; /*** <<< FUNC-DECLS [T5] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_T5; +extern asn_TYPE_descriptor_t asn_DEF_T5; asn_struct_free_f T5_free; asn_struct_print_f T5_print; asn_constr_check_f T5_constraint; @@ -490,10 +490,10 @@ xer_type_encoder_f T5_encode_xer; /*** <<< CODE [T5] >>> ***/ int -T5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +T5_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { /* Replace with underlying type checker */ - td->check_constraints = asn1_DEF_T6.check_constraints; + td->check_constraints = asn_DEF_T6.check_constraints; return td->check_constraints(td, sptr, app_errlog, app_key); } @@ -502,41 +502,41 @@ T5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -T5_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_T6.free_struct; - td->print_struct = asn1_DEF_T6.print_struct; - td->ber_decoder = asn1_DEF_T6.ber_decoder; - td->der_encoder = asn1_DEF_T6.der_encoder; - td->xer_decoder = asn1_DEF_T6.xer_decoder; - td->xer_encoder = asn1_DEF_T6.xer_encoder; - td->elements = asn1_DEF_T6.elements; - td->elements_count = asn1_DEF_T6.elements_count; - td->specifics = asn1_DEF_T6.specifics; +T5_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_T6.free_struct; + td->print_struct = asn_DEF_T6.print_struct; + td->ber_decoder = asn_DEF_T6.ber_decoder; + td->der_encoder = asn_DEF_T6.der_encoder; + td->xer_decoder = asn_DEF_T6.xer_decoder; + td->xer_encoder = asn_DEF_T6.xer_encoder; + td->elements = asn_DEF_T6.elements; + td->elements_count = asn_DEF_T6.elements_count; + td->specifics = asn_DEF_T6.specifics; } void -T5_free(asn1_TYPE_descriptor_t *td, +T5_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { T5_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -T5_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +T5_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { T5_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -T5_decode_ber(asn1_TYPE_descriptor_t *td, +T5_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T5_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -T5_encode_der(asn1_TYPE_descriptor_t *td, +T5_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { T5_inherit_TYPE_descriptor(td); @@ -544,7 +544,7 @@ T5_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -T5_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +T5_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { T5_inherit_TYPE_descriptor(td); @@ -554,11 +554,11 @@ T5_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T5] >>> ***/ -static ber_tlv_tag_t asn1_DEF_T5_tags[] = { +static ber_tlv_tag_t asn_DEF_T5_tags[] = { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_T5 = { +asn_TYPE_descriptor_t asn_DEF_T5 = { "T5", T5_free, T5_print, @@ -568,12 +568,12 @@ asn1_TYPE_descriptor_t asn1_DEF_T5 = { 0, /* Not implemented yet */ T5_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T5_tags, - sizeof(asn1_DEF_T5_tags) - /sizeof(asn1_DEF_T5_tags[0]) - 1, /* 1 */ - asn1_DEF_T5_tags, /* Same as above */ - sizeof(asn1_DEF_T5_tags) - /sizeof(asn1_DEF_T5_tags[0]), /* 2 */ + asn_DEF_T5_tags, + sizeof(asn_DEF_T5_tags) + /sizeof(asn_DEF_T5_tags[0]) - 1, /* 1 */ + asn_DEF_T5_tags, /* Same as above */ + sizeof(asn_DEF_T5_tags) + /sizeof(asn_DEF_T5_tags[0]), /* 2 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -591,7 +591,7 @@ typedef REAL_t T6_t; /*** <<< FUNC-DECLS [T6] >>> ***/ /* This type is equivalent to REAL */ -#define asn1_DEF_T6 asn1_DEF_REAL +#define asn_DEF_T6 asn_DEF_REAL /*** <<< CODE [T6] >>> ***/ @@ -609,7 +609,7 @@ typedef Ts_t T_t; /*** <<< FUNC-DECLS [T] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_T; +extern asn_TYPE_descriptor_t asn_DEF_T; asn_struct_free_f T_free; asn_struct_print_f T_print; asn_constr_check_f T_constraint; @@ -620,10 +620,10 @@ xer_type_encoder_f T_encode_xer; /*** <<< CODE [T] >>> ***/ int -T_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +T_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { /* Replace with underlying type checker */ - td->check_constraints = asn1_DEF_Ts.check_constraints; + td->check_constraints = asn_DEF_Ts.check_constraints; return td->check_constraints(td, sptr, app_errlog, app_key); } @@ -632,41 +632,41 @@ T_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -T_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_Ts.free_struct; - td->print_struct = asn1_DEF_Ts.print_struct; - td->ber_decoder = asn1_DEF_Ts.ber_decoder; - td->der_encoder = asn1_DEF_Ts.der_encoder; - td->xer_decoder = asn1_DEF_Ts.xer_decoder; - td->xer_encoder = asn1_DEF_Ts.xer_encoder; - td->elements = asn1_DEF_Ts.elements; - td->elements_count = asn1_DEF_Ts.elements_count; - td->specifics = asn1_DEF_Ts.specifics; +T_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Ts.free_struct; + td->print_struct = asn_DEF_Ts.print_struct; + td->ber_decoder = asn_DEF_Ts.ber_decoder; + td->der_encoder = asn_DEF_Ts.der_encoder; + td->xer_decoder = asn_DEF_Ts.xer_decoder; + td->xer_encoder = asn_DEF_Ts.xer_encoder; + td->elements = asn_DEF_Ts.elements; + td->elements_count = asn_DEF_Ts.elements_count; + td->specifics = asn_DEF_Ts.specifics; } void -T_free(asn1_TYPE_descriptor_t *td, +T_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { T_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -T_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +T_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { T_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -T_decode_ber(asn1_TYPE_descriptor_t *td, +T_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -T_encode_der(asn1_TYPE_descriptor_t *td, +T_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { T_inherit_TYPE_descriptor(td); @@ -674,7 +674,7 @@ T_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -T_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +T_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { T_inherit_TYPE_descriptor(td); @@ -684,12 +684,12 @@ T_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T] >>> ***/ -static ber_tlv_tag_t asn1_DEF_T_tags[] = { +static ber_tlv_tag_t asn_DEF_T_tags[] = { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), (ASN_TAG_CLASS_CONTEXT | (123 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_T = { +asn_TYPE_descriptor_t asn_DEF_T = { "T", T_free, T_print, @@ -699,12 +699,12 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { 0, /* Not implemented yet */ T_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T_tags, - sizeof(asn1_DEF_T_tags) - /sizeof(asn1_DEF_T_tags[0]) - 2, /* 1 */ - asn1_DEF_T_tags, /* Same as above */ - sizeof(asn1_DEF_T_tags) - /sizeof(asn1_DEF_T_tags[0]), /* 3 */ + asn_DEF_T_tags, + sizeof(asn_DEF_T_tags) + /sizeof(asn_DEF_T_tags[0]) - 2, /* 1 */ + asn_DEF_T_tags, /* Same as above */ + sizeof(asn_DEF_T_tags) + /sizeof(asn_DEF_T_tags[0]), /* 3 */ 0, 0, /* Defined elsewhere */ 0 /* No specifics */ }; @@ -718,7 +718,7 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { /*** <<< DEPS [Ts] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Ts; +extern asn_TYPE_descriptor_t asn_DEF_Ts; /*** <<< TYPE-DECLS [Ts] >>> ***/ @@ -729,52 +729,52 @@ typedef struct Ts { T3_t m3; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } Ts_t; /*** <<< STAT-DEFS [Ts] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_Ts[] = { +static asn_TYPE_member_t asn_MBR_Ts[] = { { ATF_NOFLAGS, 0, offsetof(struct Ts, m1), .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ - .type = (void *)&asn1_DEF_T2, + .type = (void *)&asn_DEF_T2, .memb_constraints = 0, /* Defer to actual type */ .name = "m1" }, { ATF_POINTER, 1, offsetof(struct Ts, m2), .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), .tag_mode = +1, /* EXPLICIT tag at current level */ - .type = (void *)&asn1_DEF_T3, + .type = (void *)&asn_DEF_T3, .memb_constraints = 0, /* Defer to actual type */ .name = "m2" }, { ATF_NOFLAGS, 0, offsetof(struct Ts, m3), .tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ - .type = (void *)&asn1_DEF_T3, + .type = (void *)&asn_DEF_T3, .memb_constraints = 0, /* Defer to actual type */ .name = "m3" }, }; -static ber_tlv_tag_t asn1_DEF_Ts_tags[] = { +static ber_tlv_tag_t asn_DEF_Ts_tags[] = { (ASN_TAG_CLASS_CONTEXT | (123 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_TYPE_tag2member_t asn1_DEF_Ts_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_Ts_tag2el[] = { { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* m1 at 24 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* m2 at 25 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* m3 at 27 */ }; -static asn1_SEQUENCE_specifics_t asn1_DEF_Ts_specs = { +static asn_SEQUENCE_specifics_t asn_DEF_Ts_specs = { sizeof(struct Ts), - offsetof(struct Ts, _ber_dec_ctx), - asn1_DEF_Ts_tag2el, + offsetof(struct Ts, _asn_ctx), + asn_DEF_Ts_tag2el, 3, /* Count of tags in the map */ -1, /* Start extensions */ -1 /* Stop extensions */ }; -asn1_TYPE_descriptor_t asn1_DEF_Ts = { +asn_TYPE_descriptor_t asn_DEF_Ts = { "Ts", SEQUENCE_free, SEQUENCE_print, @@ -784,14 +784,14 @@ asn1_TYPE_descriptor_t asn1_DEF_Ts = { 0, /* Not implemented yet */ SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Ts_tags, - sizeof(asn1_DEF_Ts_tags) - /sizeof(asn1_DEF_Ts_tags[0]) - 1, /* 1 */ - asn1_DEF_Ts_tags, /* Same as above */ - sizeof(asn1_DEF_Ts_tags) - /sizeof(asn1_DEF_Ts_tags[0]), /* 2 */ - asn1_MBR_Ts, + asn_DEF_Ts_tags, + sizeof(asn_DEF_Ts_tags) + /sizeof(asn_DEF_Ts_tags[0]) - 1, /* 1 */ + asn_DEF_Ts_tags, /* Same as above */ + sizeof(asn_DEF_Ts_tags) + /sizeof(asn_DEF_Ts_tags[0]), /* 2 */ + asn_MBR_Ts, 3, /* Elements count */ - &asn1_DEF_Ts_specs /* Additional specs */ + &asn_DEF_Ts_specs /* Additional specs */ }; diff --git a/tests/65-multi-tag-OK.asn1.-Pfnative-types b/tests/65-multi-tag-OK.asn1.-Pfnative-types index f12b9024a..faed7c666 100644 --- a/tests/65-multi-tag-OK.asn1.-Pfnative-types +++ b/tests/65-multi-tag-OK.asn1.-Pfnative-types @@ -10,7 +10,7 @@ typedef T2_t T1_t; /*** <<< FUNC-DECLS [T1] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_T1; +extern asn_TYPE_descriptor_t asn_DEF_T1; asn_struct_free_f T1_free; asn_struct_print_f T1_print; asn_constr_check_f T1_constraint; @@ -21,10 +21,10 @@ xer_type_encoder_f T1_encode_xer; /*** <<< CODE [T1] >>> ***/ int -T1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +T1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { /* Replace with underlying type checker */ - td->check_constraints = asn1_DEF_T2.check_constraints; + td->check_constraints = asn_DEF_T2.check_constraints; return td->check_constraints(td, sptr, app_errlog, app_key); } @@ -33,41 +33,41 @@ T1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -T1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_T2.free_struct; - td->print_struct = asn1_DEF_T2.print_struct; - td->ber_decoder = asn1_DEF_T2.ber_decoder; - td->der_encoder = asn1_DEF_T2.der_encoder; - td->xer_decoder = asn1_DEF_T2.xer_decoder; - td->xer_encoder = asn1_DEF_T2.xer_encoder; - td->elements = asn1_DEF_T2.elements; - td->elements_count = asn1_DEF_T2.elements_count; - td->specifics = asn1_DEF_T2.specifics; +T1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_T2.free_struct; + td->print_struct = asn_DEF_T2.print_struct; + td->ber_decoder = asn_DEF_T2.ber_decoder; + td->der_encoder = asn_DEF_T2.der_encoder; + td->xer_decoder = asn_DEF_T2.xer_decoder; + td->xer_encoder = asn_DEF_T2.xer_encoder; + td->elements = asn_DEF_T2.elements; + td->elements_count = asn_DEF_T2.elements_count; + td->specifics = asn_DEF_T2.specifics; } void -T1_free(asn1_TYPE_descriptor_t *td, +T1_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { T1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -T1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +T1_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { T1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -T1_decode_ber(asn1_TYPE_descriptor_t *td, +T1_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T1_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -T1_encode_der(asn1_TYPE_descriptor_t *td, +T1_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { T1_inherit_TYPE_descriptor(td); @@ -75,7 +75,7 @@ T1_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -T1_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +T1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { T1_inherit_TYPE_descriptor(td); @@ -85,13 +85,13 @@ T1_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T1] >>> ***/ -static ber_tlv_tag_t asn1_DEF_T1_tags[] = { +static ber_tlv_tag_t asn_DEF_T1_tags[] = { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)) }; -static ber_tlv_tag_t asn1_DEF_T1_all_tags[] = { +static ber_tlv_tag_t asn_DEF_T1_all_tags[] = { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), @@ -99,7 +99,7 @@ static ber_tlv_tag_t asn1_DEF_T1_all_tags[] = { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_T1 = { +asn_TYPE_descriptor_t asn_DEF_T1 = { "T1", T1_free, T1_print, @@ -109,12 +109,12 @@ asn1_TYPE_descriptor_t asn1_DEF_T1 = { 0, /* Not implemented yet */ T1_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T1_tags, - sizeof(asn1_DEF_T1_tags) - /sizeof(asn1_DEF_T1_tags[0]), /* 4 */ - asn1_DEF_T1_all_tags, - sizeof(asn1_DEF_T1_all_tags) - /sizeof(asn1_DEF_T1_all_tags[0]), /* 6 */ + asn_DEF_T1_tags, + sizeof(asn_DEF_T1_tags) + /sizeof(asn_DEF_T1_tags[0]), /* 4 */ + asn_DEF_T1_all_tags, + sizeof(asn_DEF_T1_all_tags) + /sizeof(asn_DEF_T1_all_tags[0]), /* 6 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -131,7 +131,7 @@ typedef T3_t T2_t; /*** <<< FUNC-DECLS [T2] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_T2; +extern asn_TYPE_descriptor_t asn_DEF_T2; asn_struct_free_f T2_free; asn_struct_print_f T2_print; asn_constr_check_f T2_constraint; @@ -142,10 +142,10 @@ xer_type_encoder_f T2_encode_xer; /*** <<< CODE [T2] >>> ***/ int -T2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +T2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { /* Replace with underlying type checker */ - td->check_constraints = asn1_DEF_T3.check_constraints; + td->check_constraints = asn_DEF_T3.check_constraints; return td->check_constraints(td, sptr, app_errlog, app_key); } @@ -154,41 +154,41 @@ T2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -T2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_T3.free_struct; - td->print_struct = asn1_DEF_T3.print_struct; - td->ber_decoder = asn1_DEF_T3.ber_decoder; - td->der_encoder = asn1_DEF_T3.der_encoder; - td->xer_decoder = asn1_DEF_T3.xer_decoder; - td->xer_encoder = asn1_DEF_T3.xer_encoder; - td->elements = asn1_DEF_T3.elements; - td->elements_count = asn1_DEF_T3.elements_count; - td->specifics = asn1_DEF_T3.specifics; +T2_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_T3.free_struct; + td->print_struct = asn_DEF_T3.print_struct; + td->ber_decoder = asn_DEF_T3.ber_decoder; + td->der_encoder = asn_DEF_T3.der_encoder; + td->xer_decoder = asn_DEF_T3.xer_decoder; + td->xer_encoder = asn_DEF_T3.xer_encoder; + td->elements = asn_DEF_T3.elements; + td->elements_count = asn_DEF_T3.elements_count; + td->specifics = asn_DEF_T3.specifics; } void -T2_free(asn1_TYPE_descriptor_t *td, +T2_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { T2_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -T2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +T2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { T2_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -T2_decode_ber(asn1_TYPE_descriptor_t *td, +T2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T2_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -T2_encode_der(asn1_TYPE_descriptor_t *td, +T2_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { T2_inherit_TYPE_descriptor(td); @@ -196,7 +196,7 @@ T2_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -T2_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +T2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { T2_inherit_TYPE_descriptor(td); @@ -206,19 +206,19 @@ T2_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T2] >>> ***/ -static ber_tlv_tag_t asn1_DEF_T2_tags[] = { +static ber_tlv_tag_t asn_DEF_T2_tags[] = { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)) }; -static ber_tlv_tag_t asn1_DEF_T2_all_tags[] = { +static ber_tlv_tag_t asn_DEF_T2_all_tags[] = { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_T2 = { +asn_TYPE_descriptor_t asn_DEF_T2 = { "T2", T2_free, T2_print, @@ -228,12 +228,12 @@ asn1_TYPE_descriptor_t asn1_DEF_T2 = { 0, /* Not implemented yet */ T2_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T2_tags, - sizeof(asn1_DEF_T2_tags) - /sizeof(asn1_DEF_T2_tags[0]), /* 3 */ - asn1_DEF_T2_all_tags, - sizeof(asn1_DEF_T2_all_tags) - /sizeof(asn1_DEF_T2_all_tags[0]), /* 5 */ + asn_DEF_T2_tags, + sizeof(asn_DEF_T2_tags) + /sizeof(asn_DEF_T2_tags[0]), /* 3 */ + asn_DEF_T2_all_tags, + sizeof(asn_DEF_T2_all_tags) + /sizeof(asn_DEF_T2_all_tags[0]), /* 5 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -250,7 +250,7 @@ typedef T4_t T3_t; /*** <<< FUNC-DECLS [T3] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_T3; +extern asn_TYPE_descriptor_t asn_DEF_T3; asn_struct_free_f T3_free; asn_struct_print_f T3_print; asn_constr_check_f T3_constraint; @@ -261,10 +261,10 @@ xer_type_encoder_f T3_encode_xer; /*** <<< CODE [T3] >>> ***/ int -T3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +T3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { /* Replace with underlying type checker */ - td->check_constraints = asn1_DEF_T4.check_constraints; + td->check_constraints = asn_DEF_T4.check_constraints; return td->check_constraints(td, sptr, app_errlog, app_key); } @@ -273,41 +273,41 @@ T3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -T3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_T4.free_struct; - td->print_struct = asn1_DEF_T4.print_struct; - td->ber_decoder = asn1_DEF_T4.ber_decoder; - td->der_encoder = asn1_DEF_T4.der_encoder; - td->xer_decoder = asn1_DEF_T4.xer_decoder; - td->xer_encoder = asn1_DEF_T4.xer_encoder; - td->elements = asn1_DEF_T4.elements; - td->elements_count = asn1_DEF_T4.elements_count; - td->specifics = asn1_DEF_T4.specifics; +T3_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_T4.free_struct; + td->print_struct = asn_DEF_T4.print_struct; + td->ber_decoder = asn_DEF_T4.ber_decoder; + td->der_encoder = asn_DEF_T4.der_encoder; + td->xer_decoder = asn_DEF_T4.xer_decoder; + td->xer_encoder = asn_DEF_T4.xer_encoder; + td->elements = asn_DEF_T4.elements; + td->elements_count = asn_DEF_T4.elements_count; + td->specifics = asn_DEF_T4.specifics; } void -T3_free(asn1_TYPE_descriptor_t *td, +T3_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { T3_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -T3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +T3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { T3_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -T3_decode_ber(asn1_TYPE_descriptor_t *td, +T3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T3_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -T3_encode_der(asn1_TYPE_descriptor_t *td, +T3_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { T3_inherit_TYPE_descriptor(td); @@ -315,7 +315,7 @@ T3_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -T3_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +T3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { T3_inherit_TYPE_descriptor(td); @@ -325,17 +325,17 @@ T3_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T3] >>> ***/ -static ber_tlv_tag_t asn1_DEF_T3_tags[] = { +static ber_tlv_tag_t asn_DEF_T3_tags[] = { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)) }; -static ber_tlv_tag_t asn1_DEF_T3_all_tags[] = { +static ber_tlv_tag_t asn_DEF_T3_all_tags[] = { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_T3 = { +asn_TYPE_descriptor_t asn_DEF_T3 = { "T3", T3_free, T3_print, @@ -345,12 +345,12 @@ asn1_TYPE_descriptor_t asn1_DEF_T3 = { 0, /* Not implemented yet */ T3_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T3_tags, - sizeof(asn1_DEF_T3_tags) - /sizeof(asn1_DEF_T3_tags[0]), /* 2 */ - asn1_DEF_T3_all_tags, - sizeof(asn1_DEF_T3_all_tags) - /sizeof(asn1_DEF_T3_all_tags[0]), /* 4 */ + asn_DEF_T3_tags, + sizeof(asn_DEF_T3_tags) + /sizeof(asn_DEF_T3_tags[0]), /* 2 */ + asn_DEF_T3_all_tags, + sizeof(asn_DEF_T3_all_tags) + /sizeof(asn_DEF_T3_all_tags[0]), /* 4 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -367,7 +367,7 @@ typedef T5_t T4_t; /*** <<< FUNC-DECLS [T4] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_T4; +extern asn_TYPE_descriptor_t asn_DEF_T4; asn_struct_free_f T4_free; asn_struct_print_f T4_print; asn_constr_check_f T4_constraint; @@ -378,10 +378,10 @@ xer_type_encoder_f T4_encode_xer; /*** <<< CODE [T4] >>> ***/ int -T4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +T4_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { /* Replace with underlying type checker */ - td->check_constraints = asn1_DEF_T5.check_constraints; + td->check_constraints = asn_DEF_T5.check_constraints; return td->check_constraints(td, sptr, app_errlog, app_key); } @@ -390,41 +390,41 @@ T4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -T4_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_T5.free_struct; - td->print_struct = asn1_DEF_T5.print_struct; - td->ber_decoder = asn1_DEF_T5.ber_decoder; - td->der_encoder = asn1_DEF_T5.der_encoder; - td->xer_decoder = asn1_DEF_T5.xer_decoder; - td->xer_encoder = asn1_DEF_T5.xer_encoder; - td->elements = asn1_DEF_T5.elements; - td->elements_count = asn1_DEF_T5.elements_count; - td->specifics = asn1_DEF_T5.specifics; +T4_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_T5.free_struct; + td->print_struct = asn_DEF_T5.print_struct; + td->ber_decoder = asn_DEF_T5.ber_decoder; + td->der_encoder = asn_DEF_T5.der_encoder; + td->xer_decoder = asn_DEF_T5.xer_decoder; + td->xer_encoder = asn_DEF_T5.xer_encoder; + td->elements = asn_DEF_T5.elements; + td->elements_count = asn_DEF_T5.elements_count; + td->specifics = asn_DEF_T5.specifics; } void -T4_free(asn1_TYPE_descriptor_t *td, +T4_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { T4_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -T4_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +T4_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { T4_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -T4_decode_ber(asn1_TYPE_descriptor_t *td, +T4_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T4_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -T4_encode_der(asn1_TYPE_descriptor_t *td, +T4_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { T4_inherit_TYPE_descriptor(td); @@ -432,7 +432,7 @@ T4_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -T4_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +T4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { T4_inherit_TYPE_descriptor(td); @@ -442,12 +442,12 @@ T4_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T4] >>> ***/ -static ber_tlv_tag_t asn1_DEF_T4_tags[] = { +static ber_tlv_tag_t asn_DEF_T4_tags[] = { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_T4 = { +asn_TYPE_descriptor_t asn_DEF_T4 = { "T4", T4_free, T4_print, @@ -457,12 +457,12 @@ asn1_TYPE_descriptor_t asn1_DEF_T4 = { 0, /* Not implemented yet */ T4_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T4_tags, - sizeof(asn1_DEF_T4_tags) - /sizeof(asn1_DEF_T4_tags[0]) - 1, /* 2 */ - asn1_DEF_T4_tags, /* Same as above */ - sizeof(asn1_DEF_T4_tags) - /sizeof(asn1_DEF_T4_tags[0]), /* 3 */ + asn_DEF_T4_tags, + sizeof(asn_DEF_T4_tags) + /sizeof(asn_DEF_T4_tags[0]) - 1, /* 2 */ + asn_DEF_T4_tags, /* Same as above */ + sizeof(asn_DEF_T4_tags) + /sizeof(asn_DEF_T4_tags[0]), /* 3 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -479,7 +479,7 @@ typedef T6_t T5_t; /*** <<< FUNC-DECLS [T5] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_T5; +extern asn_TYPE_descriptor_t asn_DEF_T5; asn_struct_free_f T5_free; asn_struct_print_f T5_print; asn_constr_check_f T5_constraint; @@ -490,10 +490,10 @@ xer_type_encoder_f T5_encode_xer; /*** <<< CODE [T5] >>> ***/ int -T5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +T5_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { /* Replace with underlying type checker */ - td->check_constraints = asn1_DEF_T6.check_constraints; + td->check_constraints = asn_DEF_T6.check_constraints; return td->check_constraints(td, sptr, app_errlog, app_key); } @@ -502,41 +502,41 @@ T5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -T5_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_T6.free_struct; - td->print_struct = asn1_DEF_T6.print_struct; - td->ber_decoder = asn1_DEF_T6.ber_decoder; - td->der_encoder = asn1_DEF_T6.der_encoder; - td->xer_decoder = asn1_DEF_T6.xer_decoder; - td->xer_encoder = asn1_DEF_T6.xer_encoder; - td->elements = asn1_DEF_T6.elements; - td->elements_count = asn1_DEF_T6.elements_count; - td->specifics = asn1_DEF_T6.specifics; +T5_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_T6.free_struct; + td->print_struct = asn_DEF_T6.print_struct; + td->ber_decoder = asn_DEF_T6.ber_decoder; + td->der_encoder = asn_DEF_T6.der_encoder; + td->xer_decoder = asn_DEF_T6.xer_decoder; + td->xer_encoder = asn_DEF_T6.xer_encoder; + td->elements = asn_DEF_T6.elements; + td->elements_count = asn_DEF_T6.elements_count; + td->specifics = asn_DEF_T6.specifics; } void -T5_free(asn1_TYPE_descriptor_t *td, +T5_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { T5_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -T5_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +T5_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { T5_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -T5_decode_ber(asn1_TYPE_descriptor_t *td, +T5_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T5_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -T5_encode_der(asn1_TYPE_descriptor_t *td, +T5_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { T5_inherit_TYPE_descriptor(td); @@ -544,7 +544,7 @@ T5_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -T5_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +T5_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { T5_inherit_TYPE_descriptor(td); @@ -554,11 +554,11 @@ T5_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T5] >>> ***/ -static ber_tlv_tag_t asn1_DEF_T5_tags[] = { +static ber_tlv_tag_t asn_DEF_T5_tags[] = { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_T5 = { +asn_TYPE_descriptor_t asn_DEF_T5 = { "T5", T5_free, T5_print, @@ -568,12 +568,12 @@ asn1_TYPE_descriptor_t asn1_DEF_T5 = { 0, /* Not implemented yet */ T5_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T5_tags, - sizeof(asn1_DEF_T5_tags) - /sizeof(asn1_DEF_T5_tags[0]) - 1, /* 1 */ - asn1_DEF_T5_tags, /* Same as above */ - sizeof(asn1_DEF_T5_tags) - /sizeof(asn1_DEF_T5_tags[0]), /* 2 */ + asn_DEF_T5_tags, + sizeof(asn_DEF_T5_tags) + /sizeof(asn_DEF_T5_tags[0]) - 1, /* 1 */ + asn_DEF_T5_tags, /* Same as above */ + sizeof(asn_DEF_T5_tags) + /sizeof(asn_DEF_T5_tags[0]), /* 2 */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -591,7 +591,7 @@ typedef double T6_t; /*** <<< FUNC-DECLS [T6] >>> ***/ /* This type is equivalent to NativeReal */ -#define asn1_DEF_T6 asn1_DEF_NativeReal +#define asn_DEF_T6 asn_DEF_NativeReal /*** <<< CODE [T6] >>> ***/ @@ -609,7 +609,7 @@ typedef Ts_t T_t; /*** <<< FUNC-DECLS [T] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_T; +extern asn_TYPE_descriptor_t asn_DEF_T; asn_struct_free_f T_free; asn_struct_print_f T_print; asn_constr_check_f T_constraint; @@ -620,10 +620,10 @@ xer_type_encoder_f T_encode_xer; /*** <<< CODE [T] >>> ***/ int -T_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +T_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { /* Replace with underlying type checker */ - td->check_constraints = asn1_DEF_Ts.check_constraints; + td->check_constraints = asn_DEF_Ts.check_constraints; return td->check_constraints(td, sptr, app_errlog, app_key); } @@ -632,41 +632,41 @@ T_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -T_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_Ts.free_struct; - td->print_struct = asn1_DEF_Ts.print_struct; - td->ber_decoder = asn1_DEF_Ts.ber_decoder; - td->der_encoder = asn1_DEF_Ts.der_encoder; - td->xer_decoder = asn1_DEF_Ts.xer_decoder; - td->xer_encoder = asn1_DEF_Ts.xer_encoder; - td->elements = asn1_DEF_Ts.elements; - td->elements_count = asn1_DEF_Ts.elements_count; - td->specifics = asn1_DEF_Ts.specifics; +T_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Ts.free_struct; + td->print_struct = asn_DEF_Ts.print_struct; + td->ber_decoder = asn_DEF_Ts.ber_decoder; + td->der_encoder = asn_DEF_Ts.der_encoder; + td->xer_decoder = asn_DEF_Ts.xer_decoder; + td->xer_encoder = asn_DEF_Ts.xer_encoder; + td->elements = asn_DEF_Ts.elements; + td->elements_count = asn_DEF_Ts.elements_count; + td->specifics = asn_DEF_Ts.specifics; } void -T_free(asn1_TYPE_descriptor_t *td, +T_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { T_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -T_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +T_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { T_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -T_decode_ber(asn1_TYPE_descriptor_t *td, +T_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -T_encode_der(asn1_TYPE_descriptor_t *td, +T_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { T_inherit_TYPE_descriptor(td); @@ -674,7 +674,7 @@ T_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -T_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +T_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { T_inherit_TYPE_descriptor(td); @@ -684,12 +684,12 @@ T_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T] >>> ***/ -static ber_tlv_tag_t asn1_DEF_T_tags[] = { +static ber_tlv_tag_t asn_DEF_T_tags[] = { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), (ASN_TAG_CLASS_CONTEXT | (123 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_T = { +asn_TYPE_descriptor_t asn_DEF_T = { "T", T_free, T_print, @@ -699,12 +699,12 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { 0, /* Not implemented yet */ T_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T_tags, - sizeof(asn1_DEF_T_tags) - /sizeof(asn1_DEF_T_tags[0]) - 2, /* 1 */ - asn1_DEF_T_tags, /* Same as above */ - sizeof(asn1_DEF_T_tags) - /sizeof(asn1_DEF_T_tags[0]), /* 3 */ + asn_DEF_T_tags, + sizeof(asn_DEF_T_tags) + /sizeof(asn_DEF_T_tags[0]) - 2, /* 1 */ + asn_DEF_T_tags, /* Same as above */ + sizeof(asn_DEF_T_tags) + /sizeof(asn_DEF_T_tags[0]), /* 3 */ 0, 0, /* Defined elsewhere */ 0 /* No specifics */ }; @@ -718,7 +718,7 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { /*** <<< DEPS [Ts] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_Ts; +extern asn_TYPE_descriptor_t asn_DEF_Ts; /*** <<< TYPE-DECLS [Ts] >>> ***/ @@ -729,52 +729,52 @@ typedef struct Ts { T3_t m3; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } Ts_t; /*** <<< STAT-DEFS [Ts] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_Ts[] = { +static asn_TYPE_member_t asn_MBR_Ts[] = { { ATF_NOFLAGS, 0, offsetof(struct Ts, m1), .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ - .type = (void *)&asn1_DEF_T2, + .type = (void *)&asn_DEF_T2, .memb_constraints = 0, /* Defer to actual type */ .name = "m1" }, { ATF_POINTER, 1, offsetof(struct Ts, m2), .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), .tag_mode = +1, /* EXPLICIT tag at current level */ - .type = (void *)&asn1_DEF_T3, + .type = (void *)&asn_DEF_T3, .memb_constraints = 0, /* Defer to actual type */ .name = "m2" }, { ATF_NOFLAGS, 0, offsetof(struct Ts, m3), .tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ - .type = (void *)&asn1_DEF_T3, + .type = (void *)&asn_DEF_T3, .memb_constraints = 0, /* Defer to actual type */ .name = "m3" }, }; -static ber_tlv_tag_t asn1_DEF_Ts_tags[] = { +static ber_tlv_tag_t asn_DEF_Ts_tags[] = { (ASN_TAG_CLASS_CONTEXT | (123 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn1_TYPE_tag2member_t asn1_DEF_Ts_tag2el[] = { +static asn_TYPE_tag2member_t asn_DEF_Ts_tag2el[] = { { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* m1 at 24 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* m2 at 25 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* m3 at 27 */ }; -static asn1_SEQUENCE_specifics_t asn1_DEF_Ts_specs = { +static asn_SEQUENCE_specifics_t asn_DEF_Ts_specs = { sizeof(struct Ts), - offsetof(struct Ts, _ber_dec_ctx), - asn1_DEF_Ts_tag2el, + offsetof(struct Ts, _asn_ctx), + asn_DEF_Ts_tag2el, 3, /* Count of tags in the map */ -1, /* Start extensions */ -1 /* Stop extensions */ }; -asn1_TYPE_descriptor_t asn1_DEF_Ts = { +asn_TYPE_descriptor_t asn_DEF_Ts = { "Ts", SEQUENCE_free, SEQUENCE_print, @@ -784,14 +784,14 @@ asn1_TYPE_descriptor_t asn1_DEF_Ts = { 0, /* Not implemented yet */ SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_Ts_tags, - sizeof(asn1_DEF_Ts_tags) - /sizeof(asn1_DEF_Ts_tags[0]) - 1, /* 1 */ - asn1_DEF_Ts_tags, /* Same as above */ - sizeof(asn1_DEF_Ts_tags) - /sizeof(asn1_DEF_Ts_tags[0]), /* 2 */ - asn1_MBR_Ts, + asn_DEF_Ts_tags, + sizeof(asn_DEF_Ts_tags) + /sizeof(asn_DEF_Ts_tags[0]) - 1, /* 1 */ + asn_DEF_Ts_tags, /* Same as above */ + sizeof(asn_DEF_Ts_tags) + /sizeof(asn_DEF_Ts_tags[0]), /* 2 */ + asn_MBR_Ts, 3, /* Elements count */ - &asn1_DEF_Ts_specs /* Additional specs */ + &asn_DEF_Ts_specs /* Additional specs */ }; diff --git a/tests/66-ref-simple-OK.asn1.-P b/tests/66-ref-simple-OK.asn1.-P index 03027f0ac..025f7e953 100644 --- a/tests/66-ref-simple-OK.asn1.-P +++ b/tests/66-ref-simple-OK.asn1.-P @@ -7,7 +7,7 @@ /*** <<< DEPS [T] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_T; +extern asn_TYPE_descriptor_t asn_DEF_T; /*** <<< TYPE-DECLS [T] >>> ***/ @@ -16,29 +16,29 @@ typedef struct T { A_SET_OF(SimpleType_t) list; /* Context for parsing across buffer boundaries */ - ber_dec_ctx_t _ber_dec_ctx; + asn_struct_ctx_t _asn_ctx; } T_t; /*** <<< STAT-DEFS [T] >>> ***/ -static asn1_TYPE_member_t asn1_MBR_T[] = { +static asn_TYPE_member_t asn_MBR_T[] = { { ATF_NOFLAGS, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), .tag_mode = 0, - .type = (void *)&asn1_DEF_SimpleType, + .type = (void *)&asn_DEF_SimpleType, .memb_constraints = 0, /* Defer to actual type */ .name = "" }, }; -static ber_tlv_tag_t asn1_DEF_T_tags[] = { +static ber_tlv_tag_t asn_DEF_T_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn1_SET_OF_specifics_t asn1_DEF_T_specs = { +static asn_SET_OF_specifics_t asn_DEF_T_specs = { sizeof(struct T), - offsetof(struct T, _ber_dec_ctx), + offsetof(struct T, _asn_ctx), 1, /* XER encoding is XMLValueList */ }; -asn1_TYPE_descriptor_t asn1_DEF_T = { +asn_TYPE_descriptor_t asn_DEF_T = { "T", SET_OF_free, SET_OF_print, @@ -48,15 +48,15 @@ asn1_TYPE_descriptor_t asn1_DEF_T = { 0, /* Not implemented yet */ SET_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T_tags, - sizeof(asn1_DEF_T_tags) - /sizeof(asn1_DEF_T_tags[0]), /* 1 */ - asn1_DEF_T_tags, /* Same as above */ - sizeof(asn1_DEF_T_tags) - /sizeof(asn1_DEF_T_tags[0]), /* 1 */ - asn1_MBR_T, + asn_DEF_T_tags, + sizeof(asn_DEF_T_tags) + /sizeof(asn_DEF_T_tags[0]), /* 1 */ + asn_DEF_T_tags, /* Same as above */ + sizeof(asn_DEF_T_tags) + /sizeof(asn_DEF_T_tags[0]), /* 1 */ + asn_MBR_T, 1, /* Single element */ - &asn1_DEF_T_specs /* Additional specs */ + &asn_DEF_T_specs /* Additional specs */ }; @@ -79,7 +79,7 @@ typedef ENUMERATED_t SimpleType_t; /*** <<< FUNC-DECLS [SimpleType] >>> ***/ -extern asn1_TYPE_descriptor_t asn1_DEF_SimpleType; +extern asn_TYPE_descriptor_t asn_DEF_SimpleType; asn_struct_free_f SimpleType_free; asn_struct_print_f SimpleType_print; asn_constr_check_f SimpleType_constraint; @@ -90,10 +90,10 @@ xer_type_encoder_f SimpleType_encode_xer; /*** <<< CODE [SimpleType] >>> ***/ int -SimpleType_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +SimpleType_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { /* Replace with underlying type checker */ - td->check_constraints = asn1_DEF_ENUMERATED.check_constraints; + td->check_constraints = asn_DEF_ENUMERATED.check_constraints; return td->check_constraints(td, sptr, app_errlog, app_key); } @@ -102,41 +102,41 @@ SimpleType_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * so here we adjust the DEF accordingly. */ static void -SimpleType_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) { - td->free_struct = asn1_DEF_ENUMERATED.free_struct; - td->print_struct = asn1_DEF_ENUMERATED.print_struct; - td->ber_decoder = asn1_DEF_ENUMERATED.ber_decoder; - td->der_encoder = asn1_DEF_ENUMERATED.der_encoder; - td->xer_decoder = asn1_DEF_ENUMERATED.xer_decoder; - td->xer_encoder = asn1_DEF_ENUMERATED.xer_encoder; - td->elements = asn1_DEF_ENUMERATED.elements; - td->elements_count = asn1_DEF_ENUMERATED.elements_count; - td->specifics = asn1_DEF_ENUMERATED.specifics; +SimpleType_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_ENUMERATED.free_struct; + td->print_struct = asn_DEF_ENUMERATED.print_struct; + td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; + td->der_encoder = asn_DEF_ENUMERATED.der_encoder; + td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; + td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; + td->elements = asn_DEF_ENUMERATED.elements; + td->elements_count = asn_DEF_ENUMERATED.elements_count; + td->specifics = asn_DEF_ENUMERATED.specifics; } void -SimpleType_free(asn1_TYPE_descriptor_t *td, +SimpleType_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { SimpleType_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int -SimpleType_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr, +SimpleType_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { SimpleType_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } ber_dec_rval_t -SimpleType_decode_ber(asn1_TYPE_descriptor_t *td, +SimpleType_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { SimpleType_inherit_TYPE_descriptor(td); - return td->ber_decoder(td, structure, bufptr, size, tag_mode); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t -SimpleType_encode_der(asn1_TYPE_descriptor_t *td, +SimpleType_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { SimpleType_inherit_TYPE_descriptor(td); @@ -144,7 +144,7 @@ SimpleType_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -SimpleType_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, +SimpleType_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { SimpleType_inherit_TYPE_descriptor(td); @@ -154,10 +154,10 @@ SimpleType_encode_xer(asn1_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [SimpleType] >>> ***/ -static ber_tlv_tag_t asn1_DEF_SimpleType_tags[] = { +static ber_tlv_tag_t asn_DEF_SimpleType_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_SimpleType = { +asn_TYPE_descriptor_t asn_DEF_SimpleType = { "SimpleType", SimpleType_free, SimpleType_print, @@ -167,12 +167,12 @@ asn1_TYPE_descriptor_t asn1_DEF_SimpleType = { 0, /* Not implemented yet */ SimpleType_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_SimpleType_tags, - sizeof(asn1_DEF_SimpleType_tags) - /sizeof(asn1_DEF_SimpleType_tags[0]), /* 1 */ - asn1_DEF_SimpleType_tags, /* Same as above */ - sizeof(asn1_DEF_SimpleType_tags) - /sizeof(asn1_DEF_SimpleType_tags[0]), /* 1 */ + asn_DEF_SimpleType_tags, + sizeof(asn_DEF_SimpleType_tags) + /sizeof(asn_DEF_SimpleType_tags[0]), /* 1 */ + asn_DEF_SimpleType_tags, /* Same as above */ + sizeof(asn_DEF_SimpleType_tags) + /sizeof(asn_DEF_SimpleType_tags[0]), /* 1 */ 0, 0, /* No members */ 0 /* No specifics */ }; From 7b75d980b7ee2d9629eae616081204d250167442 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 13:20:14 +0000 Subject: [PATCH 0440/1469] protection against integer wrap-around; also asn1_* renamed into asn_* git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@440 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OCTET_STRING.c | 49 +++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 984b7f574..2730fc4d7 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -10,10 +10,10 @@ /* * OCTET STRING basic type description. */ -static ber_tlv_tag_t asn1_DEF_OCTET_STRING_tags[] = { +static ber_tlv_tag_t asn_DEF_OCTET_STRING_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { +asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { "OCTET STRING", OCTET_STRING_free, OCTET_STRING_print, /* non-ascii stuff, generally */ @@ -23,12 +23,12 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = { 0, /* Not implemented yet */ OCTET_STRING_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_OCTET_STRING_tags, - sizeof(asn1_DEF_OCTET_STRING_tags) - / sizeof(asn1_DEF_OCTET_STRING_tags[0]), - asn1_DEF_OCTET_STRING_tags, /* Same as above */ - sizeof(asn1_DEF_OCTET_STRING_tags) - / sizeof(asn1_DEF_OCTET_STRING_tags[0]), + asn_DEF_OCTET_STRING_tags, + sizeof(asn_DEF_OCTET_STRING_tags) + / sizeof(asn_DEF_OCTET_STRING_tags[0]), + asn_DEF_OCTET_STRING_tags, /* Same as above */ + sizeof(asn_DEF_OCTET_STRING_tags) + / sizeof(asn_DEF_OCTET_STRING_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; @@ -151,11 +151,12 @@ _new_stack() { * Decode OCTET STRING type. */ ber_dec_rval_t -OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, +OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **os_structure, void *buf_ptr, size_t size, int tag_mode) { OCTET_STRING_t *st = (OCTET_STRING_t *)*os_structure; ber_dec_rval_t rval; - ber_dec_ctx_t *ctx; + asn_struct_ctx_t *ctx; ssize_t consumed_myself = 0; struct _stack *stck; /* A stack structure */ struct _stack_el *sel = 0; /* Stack element */ @@ -181,14 +182,14 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, } /* Restore parsing context */ - ctx = &st->_ber_dec_ctx; + ctx = &st->_asn_ctx; switch(ctx->phase) { case 0: /* * Check tags. */ - rval = ber_check_tags(td, ctx, + rval = ber_check_tags(opt_codec_ctx, td, ctx, buf_ptr, size, tag_mode, -1, &ctx->left, &tlv_constr); if(rval.code != RC_OK) { @@ -349,14 +350,20 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, RETURN(RC_FAIL); } + tlvl = tl + ll; /* Combined length of T and L encoding */ + if((tlv_len + tlvl) < 0) { + /* tlv_len value is too big */ + ASN_DEBUG("TLV encoding + length (%ld) is too big", + (long)tlv_len); + RETURN(RC_FAIL); + } + /* * Append a new expectation. */ sel = OS__add_stack_el(stck); if(!sel) RETURN(RC_FAIL); - tlvl = tl + ll; /* Combined length of T and L encoding */ - sel->tag = tlv_tag; sel->want_nulls = (tlv_len==-1); @@ -480,7 +487,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td, * Encode OCTET STRING type using DER. */ asn_enc_rval_t -OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, +OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t erval; @@ -552,7 +559,7 @@ OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, } asn_enc_rval_t -OCTET_STRING_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, +OCTET_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { static const char *h2c = "0123456789ABCDEF"; @@ -617,7 +624,7 @@ OCTET_STRING_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, } asn_enc_rval_t -OCTET_STRING_encode_xer_ascii(asn1_TYPE_descriptor_t *td, void *sptr, +OCTET_STRING_encode_xer_ascii(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; @@ -636,7 +643,7 @@ OCTET_STRING_encode_xer_ascii(asn1_TYPE_descriptor_t *td, void *sptr, } int -OCTET_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, +OCTET_STRING_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { static const char *h2c = "0123456789ABCDEF"; const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; @@ -677,7 +684,7 @@ OCTET_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, } int -OCTET_STRING_print_ascii(asn1_TYPE_descriptor_t *td, const void *sptr, +OCTET_STRING_print_ascii(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; @@ -692,9 +699,9 @@ OCTET_STRING_print_ascii(asn1_TYPE_descriptor_t *td, const void *sptr, } void -OCTET_STRING_free(asn1_TYPE_descriptor_t *td, void *sptr, int contents_only) { +OCTET_STRING_free(asn_TYPE_descriptor_t *td, void *sptr, int contents_only) { OCTET_STRING_t *st = (OCTET_STRING_t *)sptr; - struct _stack *stck = (struct _stack *)st->_ber_dec_ctx.ptr; + struct _stack *stck = (struct _stack *)st->_asn_ctx.ptr; if(!td || !st) return; From 406ff3b3d16c87130bb404f7dab274aec611a504 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 13:21:23 +0000 Subject: [PATCH 0441/1469] stack usage limits; also asn1_* renamed into asn_* git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@441 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ber_decoder.c | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c index a64f36d52..95d710177 100644 --- a/skeletons/ber_decoder.c +++ b/skeletons/ber_decoder.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include @@ -28,13 +28,24 @@ * The BER decoder of any type. */ ber_dec_rval_t -ber_decode(asn1_TYPE_descriptor_t *type_descriptor, +ber_decode(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *type_descriptor, void **struct_ptr, void *ptr, size_t size) { + asn_codec_ctx_t s_codec_ctx; + + /* + * Satisfy the requirement that the codec context + * must be allocated on the stack. + */ + if(opt_codec_ctx && opt_codec_ctx->max_stack_size) { + s_codec_ctx = *opt_codec_ctx; + opt_codec_ctx = &s_codec_ctx; + } /* * Invoke type-specific decoder. */ - return type_descriptor->ber_decoder(type_descriptor, + return type_descriptor->ber_decoder(opt_codec_ctx, type_descriptor, struct_ptr, /* Pointer to the destination structure */ ptr, size, /* Buffer and its size */ 0 /* Default tag mode is 0 */ @@ -45,7 +56,8 @@ ber_decode(asn1_TYPE_descriptor_t *type_descriptor, * Check the set of >> tags matches the definition. */ ber_dec_rval_t -ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *opt_ctx, +ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, asn_struct_ctx_t *opt_ctx, void *ptr, size_t size, int tag_mode, int last_tag_form, ber_tlv_len_t *last_length, int *opt_tlv_form) { ssize_t consumed_myself = 0; @@ -59,6 +71,19 @@ ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *opt_ctx, int step = opt_ctx ? opt_ctx->step : 0; /* Where we left previously */ int tagno; + if(opt_codec_ctx && opt_codec_ctx->max_stack_size) { + ptrdiff_t usedstack = ((char *)opt_codec_ctx - (char *)&size); + /* do not change the semantics: + * double negative is required to avoid int wrap-around */ + if(usedstack > 0) usedstack = -usedstack; + ASN_DEBUG("Current stack size %ld", -(long)usedstack); + if(usedstack < -(ptrdiff_t)opt_codec_ctx->max_stack_size) { + ASN_DEBUG("Stack limit %ld reached", + (long)opt_codec_ctx->max_stack_size); + RETURN(RC_FAIL); + } + } + /* * So what does all this implicit skip stuff mean? * Imagine two types, @@ -86,7 +111,7 @@ ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *opt_ctx, ; ASN_DEBUG("ber_check_tags(%s, size=%ld, tm=%d, step=%d, tagno=%d)", td->name, (long)size, tag_mode, step, tagno); - //assert(td->tags_count >= 1); ?May not be the case for CHOICE or ANY. + /* assert(td->tags_count >= 1) May not be the case for CHOICE or ANY */ if(tag_mode == 0 && tagno == td->tags_count) { /* @@ -222,6 +247,10 @@ ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *opt_ctx, */ if(limit_len == -1) { limit_len = tlv_len + tag_len + len_len; + if(limit_len < 0) { + /* Too great tlv_len value? */ + RETURN(RC_FAIL); + } } else if(limit_len != tlv_len + tag_len + len_len) { /* * Inner TLV specifies length which is inconsistent From d08d6c5c149ebd4be698c31a09f6934d4983aadb Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 13:21:39 +0000 Subject: [PATCH 0442/1469] got rid of 4k table; also asn1_* renamed into asn_* git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@442 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/VisibleString.c | 45 +++++++++++---------------------------- 1 file changed, 12 insertions(+), 33 deletions(-) diff --git a/skeletons/VisibleString.c b/skeletons/VisibleString.c index 8c7d37c96..8e361e714 100644 --- a/skeletons/VisibleString.c +++ b/skeletons/VisibleString.c @@ -8,11 +8,11 @@ /* * VisibleString basic type description. */ -static ber_tlv_tag_t asn1_DEF_VisibleString_tags[] = { +static ber_tlv_tag_t asn_DEF_VisibleString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), /* [UNIVERSAL 26] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; -asn1_TYPE_descriptor_t asn1_DEF_VisibleString = { +asn_TYPE_descriptor_t asn_DEF_VisibleString = { "VisibleString", OCTET_STRING_free, OCTET_STRING_print_ascii, /* ASCII subset */ @@ -22,41 +22,18 @@ asn1_TYPE_descriptor_t asn1_DEF_VisibleString = { 0, /* Not implemented yet */ OCTET_STRING_encode_xer_ascii,/* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ - asn1_DEF_VisibleString_tags, - sizeof(asn1_DEF_VisibleString_tags) - / sizeof(asn1_DEF_VisibleString_tags[0]) - 1, - asn1_DEF_VisibleString_tags, - sizeof(asn1_DEF_VisibleString_tags) - / sizeof(asn1_DEF_VisibleString_tags[0]), + asn_DEF_VisibleString_tags, + sizeof(asn_DEF_VisibleString_tags) + / sizeof(asn_DEF_VisibleString_tags[0]) - 1, + asn_DEF_VisibleString_tags, + sizeof(asn_DEF_VisibleString_tags) + / sizeof(asn_DEF_VisibleString_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; - -/* - * ISO646, ISOReg#6 - */ -static int _VisibleString_alphabet[256] = { -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, /* ! " # $ % & ' */ -0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, /* ( ) * + , - . / */ -0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, /* 0 1 2 3 4 5 6 7 */ -0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, /* 8 9 : ; < = > ? */ -0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, /* @ A B C D E F G */ -0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, /* H I J K L M N O */ -0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* P Q R S T U V W */ -0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, /* X Y Z [ \ ] ^ _ */ -0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, /* ` a b c d e f g */ -0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, /* h i j k l m n o */ -0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, /* p q r s t u v w */ -0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x00, /* x y z { | } ~ */ -}; - int -VisibleString_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +VisibleString_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const VisibleString_t *st = (const VisibleString_t *)sptr; @@ -67,9 +44,11 @@ VisibleString_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, /* * Check the alphabet of the VisibleString. * ISO646, ISOReg#6 + * The alphabet is a subset of ASCII between the space + * and "~" (tilde). */ for(; buf < end; buf++) { - if(!_VisibleString_alphabet[*buf]) { + if(*buf < 0x20 || *buf > 0x7e) { _ASN_ERRLOG(app_errlog, app_key, "%s: value byte %d (%d) " "not in VisibleString alphabet (%s:%d)", From 574b081484244b1d645a14c2d4256f04f1ad2c3c Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 13:24:10 +0000 Subject: [PATCH 0443/1469] ber_dec_ctx_t renamed into asn_struct_ctx_t; added generic codec context git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@443 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ber_decoder.h | 32 ++++++++--------- skeletons/constr_TYPE.h | 79 +++++++++++++++++++++++++++++------------ 2 files changed, 71 insertions(+), 40 deletions(-) diff --git a/skeletons/ber_decoder.h b/skeletons/ber_decoder.h index a4a50381b..8499c6a1a 100644 --- a/skeletons/ber_decoder.h +++ b/skeletons/ber_decoder.h @@ -7,7 +7,8 @@ #include -struct asn1_TYPE_descriptor_s; /* Forward declaration */ +struct asn_TYPE_descriptor_s; /* Forward declaration */ +struct asn_codec_ctx_s; /* Forward declaration */ /* * This structure describes the return value common across the @@ -18,31 +19,22 @@ struct asn1_TYPE_descriptor_s; /* Forward declaration */ * decoded bytes, hence provide a possibility, to fail with more diagnostics * (i.e., print the offending remainder of the buffer). */ -enum ber_dec_rval_code_e { + enum ber_dec_rval_code_e { RC_OK, /* Decoded successfully */ RC_WMORE, /* More data expected, call again */ RC_FAIL /* Failure to decode data */ -}; + }; typedef struct ber_dec_rval_s { enum ber_dec_rval_code_e code; /* Result code */ size_t consumed; /* Number of bytes consumed */ } ber_dec_rval_t; -/* - * A context for decoding BER across buffer boundaries. - */ -typedef struct ber_dec_ctx_s { - int phase; /* Decoding phase */ - int step; /* Elementary step of a phase */ - ber_tlv_len_t left; /* Number of bytes left, -1 for indefinite */ - void *ptr; /* Decoder-specific stuff */ -} ber_dec_ctx_t; - /* * The BER decoder of any type. * This function may be invoked directly from the application. */ -ber_dec_rval_t ber_decode(struct asn1_TYPE_descriptor_s *type_descriptor, +ber_dec_rval_t ber_decode(struct asn_codec_ctx_s *opt_codec_ctx, + struct asn_TYPE_descriptor_s *type_descriptor, void **struct_ptr, /* Pointer to a target structure's pointer */ void *buffer, /* Data to be decoded */ size_t size /* Size of that buffer */ @@ -52,7 +44,8 @@ ber_dec_rval_t ber_decode(struct asn1_TYPE_descriptor_s *type_descriptor, * Type of generic function which decodes the byte stream into the structure. */ typedef ber_dec_rval_t (ber_type_decoder_f)( - struct asn1_TYPE_descriptor_s *type_descriptor, + struct asn_codec_ctx_s *opt_codec_ctx, + struct asn_TYPE_descriptor_s *type_descriptor, void **type_structure, void *buf_ptr, size_t size, int tag_mode); @@ -67,12 +60,15 @@ typedef ber_dec_rval_t (ber_type_decoder_f)( * "end of content" sequences. The number may only be negative if the * head->last_tag_form is non-zero. */ -ber_dec_rval_t ber_check_tags(struct asn1_TYPE_descriptor_s *type_dsc, - ber_dec_ctx_t *opt_ctx, /* saved context */ +ber_dec_rval_t ber_check_tags( + struct asn_codec_ctx_s *opt_codec_ctx, /* optional context */ + struct asn_TYPE_descriptor_s *type_dsc, + asn_struct_ctx_t *opt_ctx, /* saved decoding context */ void *ptr, size_t size, int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ int last_tag_form, /* {-1,0:1}: any, primitive, constr */ ber_tlv_len_t *last_length, - int *opt_tlv_form); + int *opt_tlv_form /* optional tag form */ + ); #endif /* _BER_DECODER_H_ */ diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index 93ed24d38..937ef10e6 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -11,8 +11,45 @@ #ifndef _CONSTR_TYPE_H #define _CONSTR_TYPE_H -struct asn1_TYPE_descriptor_s; /* Forward declaration */ -struct asn1_TYPE_member_s; /* Forward declaration */ +#include +#include + +struct asn_TYPE_descriptor_s; /* Forward declaration */ +struct asn_TYPE_member_s; /* Forward declaration */ + +/* + * This type provides the context information for various ASN.1 routines, + * primarily ones doing decoding. A member _asn_ctx of this type must be + * included into certain target language's structures, such as compound types. + */ +typedef struct asn_struct_ctx_s { + int phase; /* Decoding phase */ + int step; /* Elementary step of a phase */ + ber_tlv_len_t left; /* Number of bytes left, -1 for indefinite */ + void *ptr; /* Decoder-specific stuff (stack elements) */ +} asn_struct_ctx_t; + +/* + * This structure defines a context that may be passed to every ASN.1 encoder + * or decoder function. + * WARNING: if max_stack_size member is set, and you are calling the + * function pointers of the asn_TYPE_descriptor_t directly, + * this structure must be ALLOCATED ON THE STACK! + */ +typedef struct asn_codec_ctx_s { + /* + * Limit the decoder routines to use no (much) more stack than a given + * number of bytes. Most of decoders are stack-based, and this + * would protect against stack overflows if the number of nested + * encodings is high. + * The OCTET STRING, BIT STRING and ANY BER decoders are heap-based, + * and are safe from this kind of overflow. + * A value from getrlimit(RLIMIT_STACK) may be used to initialize + * this variable. Be careful in multithreaded environments, as the + * stack size is rather limited. + */ + size_t max_stack_size; /* 0 disables stack bounds checking */ +} asn_codec_ctx_t; /* * Type of the return value of the encoding functions (der_encode, xer_encode). @@ -30,7 +67,7 @@ typedef struct asn_enc_rval_s { */ /* Type which cannot be encoded */ - struct asn1_TYPE_descriptor_s *failed_type; + struct asn_TYPE_descriptor_s *failed_type; /* Pointer to the structure of that type */ void *structure_ptr; @@ -40,8 +77,6 @@ typedef struct asn_enc_rval_s { return __er; \ } while(0) -#include -#include #include #include #include @@ -55,14 +90,14 @@ typedef struct asn_enc_rval_s { * dynamically.) */ typedef void (asn_struct_free_f)( - struct asn1_TYPE_descriptor_s *type_descriptor, + struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, int free_contents_only); /* * Print the structure according to its specification. */ typedef int (asn_struct_print_f)( - struct asn1_TYPE_descriptor_s *type_descriptor, + struct asn_TYPE_descriptor_s *type_descriptor, const void *struct_ptr, int level, /* Indentation level */ asn_app_consume_bytes_f *callback, void *app_key); @@ -74,16 +109,16 @@ typedef int (asn_struct_print_f)( * Do not use it in your application. */ typedef ber_tlv_tag_t (asn_outmost_tag_f)( - struct asn1_TYPE_descriptor_s *type_descriptor, + struct asn_TYPE_descriptor_s *type_descriptor, const void *struct_ptr, int tag_mode, ber_tlv_tag_t tag); /* The instance of the above function type; used internally. */ -asn_outmost_tag_f asn1_TYPE_outmost_tag; +asn_outmost_tag_f asn_TYPE_outmost_tag; /* * The definitive description of the destination language's structure. */ -typedef struct asn1_TYPE_descriptor_s { +typedef struct asn_TYPE_descriptor_s { char *name; /* A name of the ASN.1 type */ /* @@ -114,7 +149,7 @@ typedef struct asn1_TYPE_descriptor_s { /* * An ASN.1 production type members (members of SEQUENCE, SET, CHOICE). */ - struct asn1_TYPE_member_s *elements; + struct asn_TYPE_member_s *elements; int elements_count; /* @@ -122,37 +157,37 @@ typedef struct asn1_TYPE_descriptor_s { * functions above. */ void *specifics; -} asn1_TYPE_descriptor_t; +} asn_TYPE_descriptor_t; /* - * An element of the constructed type, i.e. SEQUENCE, SET, CHOICE. + * This type describes an element of the constructed type, + * i.e. SEQUENCE, SET, CHOICE, etc. */ - enum asn1_TYPE_flags_e { + enum asn_TYPE_flags_e { ATF_NOFLAGS, ATF_POINTER = 0x01, /* Represented by the pointer */ ATF_OPEN_TYPE = 0x02 /* ANY type, without meaningful tag */ }; -typedef struct asn1_TYPE_member_s { - enum asn1_TYPE_flags_e flags; /* Element's presentation flags */ +typedef struct asn_TYPE_member_s { + enum asn_TYPE_flags_e flags; /* Element's presentation flags */ int optional; /* Following optional members, including current */ int memb_offset; /* Offset of the element */ ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ int tag_mode; /* IMPLICIT/no/EXPLICIT tag at current level */ - asn1_TYPE_descriptor_t *type; /* Member type descriptor */ + asn_TYPE_descriptor_t *type; /* Member type descriptor */ asn_constr_check_f *memb_constraints; /* Constraints validator */ char *name; /* ASN.1 identifier of the element */ -} asn1_TYPE_member_t; +} asn_TYPE_member_t; /* * BER tag to element number mapping. */ -typedef struct asn1_TYPE_tag2member_s { +typedef struct asn_TYPE_tag2member_s { ber_tlv_tag_t el_tag; /* Outmost tag of the member */ int el_no; /* Index of the associated member, base 0 */ int toff_first; /* First occurence of the el_tag, relative */ int toff_last; /* Last occurence of the el_tag, relatvie */ -} asn1_TYPE_tag2member_t; - +} asn_TYPE_tag2member_t; /* * This function is a wrapper around (td)->print_struct, which prints out @@ -164,7 +199,7 @@ typedef struct asn1_TYPE_tag2member_s { * (See also xer_fprint() in xer_encoder.h) */ int asn_fprint(FILE *stream, /* Destination stream descriptor */ - asn1_TYPE_descriptor_t *td, /* ASN.1 type descriptor */ + asn_TYPE_descriptor_t *td, /* ASN.1 type descriptor */ const void *struct_ptr); /* Structure to be printed */ #endif /* _CONSTR_TYPE_H_ */ From c896456b2c0821ca6b7c3b3c4e753085cbef2bb5 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 13:24:33 +0000 Subject: [PATCH 0444/1469] added tests for length limit git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@444 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/check-length.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/skeletons/tests/check-length.c b/skeletons/tests/check-length.c index 6176ddd9f..c01c5dd02 100644 --- a/skeletons/tests/check-length.c +++ b/skeletons/tests/check-length.c @@ -53,12 +53,12 @@ check(int size) { } buf_off = 0; - erval = der_encode(&asn1_DEF_OCTET_STRING, + erval = der_encode(&asn_DEF_OCTET_STRING, os, write_to_buf, 0); assert(erval.encoded == buf_off); assert(buf_off > size); - rval = ber_decode(&asn1_DEF_OCTET_STRING, (void **)&nos, buf, buf_off); + rval = ber_decode(0, &asn_DEF_OCTET_STRING, (void **)&nos, buf, buf_off); assert(rval.code == RC_OK); assert(rval.consumed == buf_off); @@ -76,12 +76,17 @@ check(int size) { } - asn1_DEF_OCTET_STRING.free_struct(&asn1_DEF_OCTET_STRING, os, 0); - asn1_DEF_OCTET_STRING.free_struct(&asn1_DEF_OCTET_STRING, nos, 0); + asn_DEF_OCTET_STRING.free_struct(&asn_DEF_OCTET_STRING, os, 0); + asn_DEF_OCTET_STRING.free_struct(&asn_DEF_OCTET_STRING, nos, 0); } int main() { + uint8_t buf1[] = { 0x85, 0x00, 0x01, 0x02, 0x03, 0x04 }; + uint8_t buf2[] = { 0x85, 0x00, 0x7f, 0xff, 0x03, 0x04 }; + uint8_t buf3[] = { 0x85, 0x00, 0x7f, 0xff, 0xff, 0x04 }; + ber_tlv_len_t tlv_len; + ssize_t ret; int i; for(i = 0; i < 66000; i++) { @@ -89,5 +94,17 @@ main() { check(i); } + ret = ber_fetch_length(0, buf1, sizeof(buf1), &tlv_len); + printf("ret=%d, len=%d\n", ret, tlv_len); + assert(ret == sizeof(buf1)); + + ret = ber_fetch_length(0, buf2, sizeof(buf2), &tlv_len); + printf("ret=%d, len=%d\n", ret, tlv_len); + assert(ret == sizeof(buf2)); + + ret = ber_fetch_length(0, buf3, sizeof(buf3), &tlv_len); + printf("ret=%d\n", ret); + assert(ret == -1); + return 0; } From eeb5ff93f8ba3d29b46bab1800711d3b06631e97 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 13:25:23 +0000 Subject: [PATCH 0445/1469] length value limit git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@445 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ber_tlv_length.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/skeletons/ber_tlv_length.c b/skeletons/ber_tlv_length.c index bde022a2f..a0ec1e5df 100644 --- a/skeletons/ber_tlv_length.c +++ b/skeletons/ber_tlv_length.c @@ -51,6 +51,19 @@ ber_fetch_length(int _is_constructed, void *bufptr, size_t size, } if(oct == 0) { + + /* + * Here length may be very close or equal to 2G. + * However, the arithmetics used in other decoders + * often add some (small) quantities to the length, + * to check the resulting value against some limits. + * This may result in integer wrap-around. + */ + if((len + 1024) < 0) { + /* Too large length value */ + return -1; + } + *len_r = len; return skipped; } From ef6355bd668a348d64fddd1785dfc2849bd840ec Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 13:26:15 +0000 Subject: [PATCH 0446/1469] asn1_* renamed into asn_* git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@446 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ANY.c | 12 ++--- skeletons/ANY.h | 10 ++-- skeletons/BIT_STRING.c | 24 +++++----- skeletons/BIT_STRING.h | 2 +- skeletons/BMPString.c | 20 ++++---- skeletons/BMPString.h | 2 +- skeletons/BOOLEAN.c | 26 +++++----- skeletons/BOOLEAN.h | 2 +- skeletons/ENUMERATED.c | 12 ++--- skeletons/ENUMERATED.h | 2 +- skeletons/GeneralString.c | 16 +++---- skeletons/GeneralString.h | 2 +- skeletons/GeneralizedTime.c | 30 ++++++------ skeletons/GeneralizedTime.h | 4 +- skeletons/GraphicString.c | 16 +++---- skeletons/GraphicString.h | 2 +- skeletons/IA5String.c | 18 +++---- skeletons/IA5String.h | 2 +- skeletons/INTEGER.c | 24 +++++----- skeletons/INTEGER.h | 4 +- skeletons/ISO646String.c | 16 +++---- skeletons/ISO646String.h | 2 +- skeletons/NULL.c | 18 +++---- skeletons/NULL.h | 2 +- skeletons/NativeEnumerated.c | 12 ++--- skeletons/NativeEnumerated.h | 2 +- skeletons/NativeInteger.c | 28 ++++++----- skeletons/NativeInteger.h | 2 +- skeletons/NativeReal.c | 30 ++++++------ skeletons/NativeReal.h | 2 +- skeletons/NumericString.c | 18 +++---- skeletons/NumericString.h | 2 +- skeletons/OBJECT_IDENTIFIER.c | 22 ++++----- skeletons/OBJECT_IDENTIFIER.h | 2 +- skeletons/OCTET_STRING.h | 4 +- skeletons/ObjectDescriptor.c | 16 +++---- skeletons/ObjectDescriptor.h | 2 +- skeletons/PrintableString.c | 18 +++---- skeletons/PrintableString.h | 2 +- skeletons/REAL.c | 24 +++++----- skeletons/REAL.h | 6 +-- skeletons/RELATIVE-OID.c | 20 ++++---- skeletons/RELATIVE-OID.h | 2 +- skeletons/T61String.c | 16 +++---- skeletons/T61String.h | 2 +- skeletons/TeletexString.c | 16 +++---- skeletons/TeletexString.h | 2 +- skeletons/UTCTime.c | 22 ++++----- skeletons/UTCTime.h | 2 +- skeletons/UTF8String.c | 20 ++++---- skeletons/UTF8String.h | 2 +- skeletons/UniversalString.c | 20 ++++---- skeletons/UniversalString.h | 2 +- skeletons/VideotexString.c | 16 +++---- skeletons/VideotexString.h | 2 +- skeletons/VisibleString.h | 2 +- skeletons/asn_application.h | 2 +- skeletons/ber_codec_prim.c | 10 ++-- skeletons/constr_CHOICE.c | 63 ++++++++++++------------- skeletons/constr_CHOICE.h | 6 +-- skeletons/constr_SEQUENCE.c | 49 ++++++++++--------- skeletons/constr_SEQUENCE.h | 8 ++-- skeletons/constr_SEQUENCE_OF.c | 10 ++-- skeletons/constr_SET.c | 51 ++++++++++---------- skeletons/constr_SET.h | 8 ++-- skeletons/constr_SET_OF.c | 41 ++++++++-------- skeletons/constr_SET_OF.h | 6 +-- skeletons/constr_TYPE.c | 4 +- skeletons/constraints.c | 6 +-- skeletons/constraints.h | 6 +-- skeletons/der_encoder.c | 4 +- skeletons/der_encoder.h | 8 ++-- skeletons/tests/check-GeneralizedTime.c | 4 +- skeletons/tests/check-INTEGER.c | 4 +- skeletons/tests/check-OIDs.c | 8 ++-- skeletons/tests/check-REAL.c | 8 ++-- skeletons/tests/check-UTCTime.c | 4 +- skeletons/xer_encoder.c | 4 +- skeletons/xer_encoder.h | 8 ++-- 79 files changed, 466 insertions(+), 462 deletions(-) diff --git a/skeletons/ANY.c b/skeletons/ANY.c index 1825da134..ae19ab5db 100644 --- a/skeletons/ANY.c +++ b/skeletons/ANY.c @@ -7,7 +7,7 @@ #include #include -asn1_TYPE_descriptor_t asn1_DEF_ANY = { +asn_TYPE_descriptor_t asn_DEF_ANY = { "ANY", OCTET_STRING_free, OCTET_STRING_print, @@ -24,7 +24,7 @@ asn1_TYPE_descriptor_t asn1_DEF_ANY = { asn_enc_rval_t -ANY_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, +ANY_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { @@ -48,7 +48,7 @@ struct _callback_arg { static int ANY__consume_bytes(const void *buffer, size_t size, void *key); int -ANY_fromType(ANY_t *st, asn1_TYPE_descriptor_t *td, void *sptr) { +ANY_fromType(ANY_t *st, asn_TYPE_descriptor_t *td, void *sptr) { struct _callback_arg arg; asn_enc_rval_t erval; @@ -81,7 +81,7 @@ ANY_fromType(ANY_t *st, asn1_TYPE_descriptor_t *td, void *sptr) { } ANY_t * -ANY_new_fromType(asn1_TYPE_descriptor_t *td, void *sptr) { +ANY_new_fromType(asn_TYPE_descriptor_t *td, void *sptr) { ANY_t tmp; ANY_t *st; @@ -105,7 +105,7 @@ ANY_new_fromType(asn1_TYPE_descriptor_t *td, void *sptr) { } int -ANY_to_type(ANY_t *st, asn1_TYPE_descriptor_t *td, void **struct_ptr) { +ANY_to_type(ANY_t *st, asn_TYPE_descriptor_t *td, void **struct_ptr) { ber_dec_rval_t rval; void *newst = 0; @@ -120,7 +120,7 @@ ANY_to_type(ANY_t *st, asn1_TYPE_descriptor_t *td, void **struct_ptr) { return 0; } - rval = ber_decode(td, (void **)&newst, st->buf, st->size); + rval = ber_decode(0, td, (void **)&newst, st->buf, st->size); if(rval.code == RC_OK) { *struct_ptr = newst; return 0; diff --git a/skeletons/ANY.h b/skeletons/ANY.h index ae62596ff..588f2951f 100644 --- a/skeletons/ANY.h +++ b/skeletons/ANY.h @@ -11,10 +11,10 @@ typedef struct ANY { uint8_t *buf; /* BER-encoded ANY contents */ int size; /* Size of the above buffer */ - ber_dec_ctx_t _ber_dec_ctx; /* Parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; /* Parsing across buffer boundaries */ } ANY_t; -extern asn1_TYPE_descriptor_t asn1_DEF_ANY; +extern asn_TYPE_descriptor_t asn_DEF_ANY; asn_struct_free_f ANY_free; asn_struct_print_f ANY_print; @@ -27,11 +27,11 @@ xer_type_encoder_f ANY_encode_xer; ******************************/ /* Convert another ASN.1 type into the ANY. This implies DER encoding. */ -int ANY_fromType(ANY_t *, asn1_TYPE_descriptor_t *td, void *struct_ptr); -ANY_t *ANY_new_fromType(asn1_TYPE_descriptor_t *td, void *struct_ptr); +int ANY_fromType(ANY_t *, asn_TYPE_descriptor_t *td, void *struct_ptr); +ANY_t *ANY_new_fromType(asn_TYPE_descriptor_t *td, void *struct_ptr); /* Convert the contents of the ANY type into the specified type. */ -int ANY_to_type(ANY_t *, asn1_TYPE_descriptor_t *td, void **struct_ptr); +int ANY_to_type(ANY_t *, asn_TYPE_descriptor_t *td, void **struct_ptr); #define ANY_fromBuf(s, buf, size) OCTET_STRING_fromBuf((s), (buf), (size)) #define ANY_new_fromBuf(buf, size) OCTET_STRING_new_fromBuf((buf), (size)) diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index e0e2507a3..b3b77d1f9 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -9,10 +9,10 @@ /* * BIT STRING basic type description. */ -static ber_tlv_tag_t asn1_DEF_BIT_STRING_tags[] = { +static ber_tlv_tag_t asn_DEF_BIT_STRING_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_BIT_STRING = { +asn_TYPE_descriptor_t asn_DEF_BIT_STRING = { "BIT STRING", OCTET_STRING_free, /* Implemented in terms of OCTET STRING */ BIT_STRING_print, @@ -22,12 +22,12 @@ asn1_TYPE_descriptor_t asn1_DEF_BIT_STRING = { 0, /* Not implemented yet */ BIT_STRING_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_BIT_STRING_tags, - sizeof(asn1_DEF_BIT_STRING_tags) - / sizeof(asn1_DEF_BIT_STRING_tags[0]), - asn1_DEF_BIT_STRING_tags, /* Same as above */ - sizeof(asn1_DEF_BIT_STRING_tags) - / sizeof(asn1_DEF_BIT_STRING_tags[0]), + asn_DEF_BIT_STRING_tags, + sizeof(asn_DEF_BIT_STRING_tags) + / sizeof(asn_DEF_BIT_STRING_tags[0]), + asn_DEF_BIT_STRING_tags, /* Same as above */ + sizeof(asn_DEF_BIT_STRING_tags) + / sizeof(asn_DEF_BIT_STRING_tags[0]), 0, 0, /* No members */ (void *)1 /* Special indicator that this is a BIT STRING */ }; @@ -36,7 +36,7 @@ asn1_TYPE_descriptor_t asn1_DEF_BIT_STRING = { * BIT STRING generic constraint. */ int -BIT_STRING_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +BIT_STRING_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; @@ -70,7 +70,7 @@ static char *_bit_pattern[16] = { }; asn_enc_rval_t -BIT_STRING_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, +BIT_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t er; @@ -118,7 +118,7 @@ BIT_STRING_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, int mbit = st->buf[0]; /* bits to skip from the right */ int i; for(i = 7; i >= mbit; i--) - *p++ = (v & (1 << i)) ? '1' : '0'; + *p++ = (v & (1 << i)) ? 0x31 : 0x30; er.encoded += p - scratch; _ASN_CALLBACK(scratch, p - scratch); } @@ -133,7 +133,7 @@ BIT_STRING_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, * BIT STRING specific contents printer. */ int -BIT_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, +BIT_STRING_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { static const char *h2c = "0123456789ABCDEF"; char scratch[64]; diff --git a/skeletons/BIT_STRING.h b/skeletons/BIT_STRING.h index ff622a325..665d036d2 100644 --- a/skeletons/BIT_STRING.h +++ b/skeletons/BIT_STRING.h @@ -9,7 +9,7 @@ typedef OCTET_STRING_t BIT_STRING_t; /* Implemented via OCTET STRING */ -extern asn1_TYPE_descriptor_t asn1_DEF_BIT_STRING; +extern asn_TYPE_descriptor_t asn_DEF_BIT_STRING; asn_struct_print_f BIT_STRING_print; /* Human-readable output */ asn_constr_check_f BIT_STRING_constraint; diff --git a/skeletons/BMPString.c b/skeletons/BMPString.c index 2a1129940..e03d334d0 100644 --- a/skeletons/BMPString.c +++ b/skeletons/BMPString.c @@ -8,11 +8,11 @@ /* * BMPString basic type description. */ -static ber_tlv_tag_t asn1_DEF_BMPString_tags[] = { +static ber_tlv_tag_t asn_DEF_BMPString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (30 << 2)), /* [UNIVERSAL 30] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; -asn1_TYPE_descriptor_t asn1_DEF_BMPString = { +asn_TYPE_descriptor_t asn_DEF_BMPString = { "BMPString", OCTET_STRING_free, /* Implemented in terms of OCTET STRING */ BMPString_print, @@ -22,12 +22,12 @@ asn1_TYPE_descriptor_t asn1_DEF_BMPString = { 0, /* Not implemented yet */ BMPString_encode_xer, /* Conver to UTF8 */ 0, /* Use generic outmost tag fetcher */ - asn1_DEF_BMPString_tags, - sizeof(asn1_DEF_BMPString_tags) - / sizeof(asn1_DEF_BMPString_tags[0]) - 1, - asn1_DEF_BMPString_tags, - sizeof(asn1_DEF_BMPString_tags) - / sizeof(asn1_DEF_BMPString_tags[0]), + asn_DEF_BMPString_tags, + sizeof(asn_DEF_BMPString_tags) + / sizeof(asn_DEF_BMPString_tags[0]) - 1, + asn_DEF_BMPString_tags, + sizeof(asn_DEF_BMPString_tags) + / sizeof(asn_DEF_BMPString_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; @@ -74,7 +74,7 @@ BMPString__dump(const BMPString_t *st, } asn_enc_rval_t -BMPString_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, +BMPString_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { const BMPString_t *st = (const BMPString_t *)sptr; @@ -93,7 +93,7 @@ BMPString_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, } int -BMPString_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, +BMPString_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const BMPString_t *st = (const BMPString_t *)sptr; diff --git a/skeletons/BMPString.h b/skeletons/BMPString.h index 2860e6baa..3ff2baf3a 100644 --- a/skeletons/BMPString.h +++ b/skeletons/BMPString.h @@ -9,7 +9,7 @@ typedef OCTET_STRING_t BMPString_t; /* Implemented via OCTET STRING */ -extern asn1_TYPE_descriptor_t asn1_DEF_BMPString; +extern asn_TYPE_descriptor_t asn_DEF_BMPString; asn_struct_print_f BMPString_print; /* Human-readable output */ xer_type_encoder_f BMPString_encode_xer; diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c index ef6926a6f..992b9a892 100644 --- a/skeletons/BOOLEAN.c +++ b/skeletons/BOOLEAN.c @@ -8,10 +8,10 @@ /* * BOOLEAN basic type description. */ -static ber_tlv_tag_t asn1_DEF_BOOLEAN_tags[] = { +static ber_tlv_tag_t asn_DEF_BOOLEAN_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_BOOLEAN = { +asn_TYPE_descriptor_t asn_DEF_BOOLEAN = { "BOOLEAN", BOOLEAN_free, BOOLEAN_print, @@ -21,10 +21,10 @@ asn1_TYPE_descriptor_t asn1_DEF_BOOLEAN = { 0, /* Not implemented yet */ BOOLEAN_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_BOOLEAN_tags, - sizeof(asn1_DEF_BOOLEAN_tags) / sizeof(asn1_DEF_BOOLEAN_tags[0]), - asn1_DEF_BOOLEAN_tags, /* Same as above */ - sizeof(asn1_DEF_BOOLEAN_tags) / sizeof(asn1_DEF_BOOLEAN_tags[0]), + asn_DEF_BOOLEAN_tags, + sizeof(asn_DEF_BOOLEAN_tags) / sizeof(asn_DEF_BOOLEAN_tags[0]), + asn_DEF_BOOLEAN_tags, /* Same as above */ + sizeof(asn_DEF_BOOLEAN_tags) / sizeof(asn_DEF_BOOLEAN_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; @@ -33,7 +33,8 @@ asn1_TYPE_descriptor_t asn1_DEF_BOOLEAN = { * Decode BOOLEAN type. */ ber_dec_rval_t -BOOLEAN_decode_ber(asn1_TYPE_descriptor_t *td, +BOOLEAN_decode_ber(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **bool_value, void *buf_ptr, size_t size, int tag_mode) { BOOLEAN_t *st = (BOOLEAN_t *)*bool_value; @@ -56,7 +57,8 @@ BOOLEAN_decode_ber(asn1_TYPE_descriptor_t *td, /* * Check tags. */ - rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, 0, &length, 0); + rval = ber_check_tags(opt_codec_ctx, td, 0, buf_ptr, size, + tag_mode, 0, &length, 0); if(rval.code != RC_OK) return rval; @@ -94,7 +96,7 @@ BOOLEAN_decode_ber(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -BOOLEAN_encode_der(asn1_TYPE_descriptor_t *td, void *sptr, +BOOLEAN_encode_der(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t erval; @@ -126,7 +128,7 @@ BOOLEAN_encode_der(asn1_TYPE_descriptor_t *td, void *sptr, } asn_enc_rval_t -BOOLEAN_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, +BOOLEAN_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { const BOOLEAN_t *st = (const BOOLEAN_t *)sptr; @@ -149,7 +151,7 @@ BOOLEAN_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, } int -BOOLEAN_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, +BOOLEAN_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const BOOLEAN_t *st = (const BOOLEAN_t *)sptr; const char *buf; @@ -175,7 +177,7 @@ BOOLEAN_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, } void -BOOLEAN_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { +BOOLEAN_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { if(td && ptr && !contents_only) { FREEMEM(ptr); } diff --git a/skeletons/BOOLEAN.h b/skeletons/BOOLEAN.h index 2b195dc1b..217d36f02 100644 --- a/skeletons/BOOLEAN.h +++ b/skeletons/BOOLEAN.h @@ -14,7 +14,7 @@ */ typedef int BOOLEAN_t; -extern asn1_TYPE_descriptor_t asn1_DEF_BOOLEAN; +extern asn_TYPE_descriptor_t asn_DEF_BOOLEAN; asn_struct_free_f BOOLEAN_free; asn_struct_print_f BOOLEAN_print; diff --git a/skeletons/ENUMERATED.c b/skeletons/ENUMERATED.c index 821a4674b..13d7e0583 100644 --- a/skeletons/ENUMERATED.c +++ b/skeletons/ENUMERATED.c @@ -9,10 +9,10 @@ /* * ENUMERATED basic type description. */ -static ber_tlv_tag_t asn1_DEF_ENUMERATED_tags[] = { +static ber_tlv_tag_t asn_DEF_ENUMERATED_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_ENUMERATED = { +asn_TYPE_descriptor_t asn_DEF_ENUMERATED = { "ENUMERATED", ASN__PRIMITIVE_TYPE_free, INTEGER_print, /* Implemented in terms of INTEGER */ @@ -22,10 +22,10 @@ asn1_TYPE_descriptor_t asn1_DEF_ENUMERATED = { 0, /* Not implemented yet */ INTEGER_encode_xer, /* Implemented in terms of INTEGER */ 0, /* Use generic outmost tag fetcher */ - asn1_DEF_ENUMERATED_tags, - sizeof(asn1_DEF_ENUMERATED_tags) / sizeof(asn1_DEF_ENUMERATED_tags[0]), - asn1_DEF_ENUMERATED_tags, /* Same as above */ - sizeof(asn1_DEF_ENUMERATED_tags) / sizeof(asn1_DEF_ENUMERATED_tags[0]), + asn_DEF_ENUMERATED_tags, + sizeof(asn_DEF_ENUMERATED_tags) / sizeof(asn_DEF_ENUMERATED_tags[0]), + asn_DEF_ENUMERATED_tags, /* Same as above */ + sizeof(asn_DEF_ENUMERATED_tags) / sizeof(asn_DEF_ENUMERATED_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/ENUMERATED.h b/skeletons/ENUMERATED.h index b926eb263..45733cb25 100644 --- a/skeletons/ENUMERATED.h +++ b/skeletons/ENUMERATED.h @@ -9,6 +9,6 @@ typedef INTEGER_t ENUMERATED_t; /* Implemented via INTEGER */ -extern asn1_TYPE_descriptor_t asn1_DEF_ENUMERATED; +extern asn_TYPE_descriptor_t asn_DEF_ENUMERATED; #endif /* _ENUMERATED_H_ */ diff --git a/skeletons/GeneralString.c b/skeletons/GeneralString.c index 02c1c7e3e..f846c0268 100644 --- a/skeletons/GeneralString.c +++ b/skeletons/GeneralString.c @@ -8,11 +8,11 @@ /* * GeneralString basic type description. */ -static ber_tlv_tag_t asn1_DEF_GeneralString_tags[] = { +static ber_tlv_tag_t asn_DEF_GeneralString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (27 << 2)), /* [UNIVERSAL 27] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; -asn1_TYPE_descriptor_t asn1_DEF_GeneralString = { +asn_TYPE_descriptor_t asn_DEF_GeneralString = { "GeneralString", OCTET_STRING_free, OCTET_STRING_print, /* non-ascii string */ @@ -22,12 +22,12 @@ asn1_TYPE_descriptor_t asn1_DEF_GeneralString = { 0, /* Not implemented yet */ OCTET_STRING_encode_xer, /* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ - asn1_DEF_GeneralString_tags, - sizeof(asn1_DEF_GeneralString_tags) - / sizeof(asn1_DEF_GeneralString_tags[0]) - 1, - asn1_DEF_GeneralString_tags, - sizeof(asn1_DEF_GeneralString_tags) - / sizeof(asn1_DEF_GeneralString_tags[0]), + asn_DEF_GeneralString_tags, + sizeof(asn_DEF_GeneralString_tags) + / sizeof(asn_DEF_GeneralString_tags[0]) - 1, + asn_DEF_GeneralString_tags, + sizeof(asn_DEF_GeneralString_tags) + / sizeof(asn_DEF_GeneralString_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/GeneralString.h b/skeletons/GeneralString.h index d8d07e97b..d284674a7 100644 --- a/skeletons/GeneralString.h +++ b/skeletons/GeneralString.h @@ -9,6 +9,6 @@ typedef OCTET_STRING_t GeneralString_t; /* Implemented via OCTET STRING */ -extern asn1_TYPE_descriptor_t asn1_DEF_GeneralString; +extern asn_TYPE_descriptor_t asn_DEF_GeneralString; #endif /* _GeneralString_H_ */ diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 161898f3c..631f3ed6e 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -109,12 +109,12 @@ static time_t timegm(struct tm *tm) { /* * GeneralizedTime basic type description. */ -static ber_tlv_tag_t asn1_DEF_GeneralizedTime_tags[] = { +static ber_tlv_tag_t asn_DEF_GeneralizedTime_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (24 << 2)), /* [UNIVERSAL 24] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), /* [UNIVERSAL 26] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; -asn1_TYPE_descriptor_t asn1_DEF_GeneralizedTime = { +asn_TYPE_descriptor_t asn_DEF_GeneralizedTime = { "GeneralizedTime", OCTET_STRING_free, GeneralizedTime_print, @@ -124,12 +124,12 @@ asn1_TYPE_descriptor_t asn1_DEF_GeneralizedTime = { 0, /* Not implemented yet */ GeneralizedTime_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_GeneralizedTime_tags, - sizeof(asn1_DEF_GeneralizedTime_tags) - / sizeof(asn1_DEF_GeneralizedTime_tags[0]) - 2, - asn1_DEF_GeneralizedTime_tags, - sizeof(asn1_DEF_GeneralizedTime_tags) - / sizeof(asn1_DEF_GeneralizedTime_tags[0]), + asn_DEF_GeneralizedTime_tags, + sizeof(asn_DEF_GeneralizedTime_tags) + / sizeof(asn_DEF_GeneralizedTime_tags[0]) - 2, + asn_DEF_GeneralizedTime_tags, + sizeof(asn_DEF_GeneralizedTime_tags) + / sizeof(asn_DEF_GeneralizedTime_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; @@ -140,7 +140,7 @@ asn1_TYPE_descriptor_t asn1_DEF_GeneralizedTime = { * Check that the time looks like the time. */ int -GeneralizedTime_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +GeneralizedTime_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const GeneralizedTime_t *st = (const GeneralizedTime_t *)sptr; time_t tloc; @@ -158,14 +158,14 @@ GeneralizedTime_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } asn_enc_rval_t -GeneralizedTime_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, +GeneralizedTime_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { GeneralizedTime_t *st = (GeneralizedTime_t *)ptr; asn_enc_rval_t erval; /* If not canonical DER, re-encode into canonical DER. */ - if(st->size && st->buf[st->size-1] != 'Z') { + if(st->size && st->buf[st->size-1] != 0x5a) { struct tm tm; time_t tloc; @@ -199,7 +199,7 @@ GeneralizedTime_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, } asn_enc_rval_t -GeneralizedTime_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, +GeneralizedTime_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { OCTET_STRING_t st; @@ -229,7 +229,7 @@ GeneralizedTime_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, } int -GeneralizedTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, +GeneralizedTime_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const GeneralizedTime_t *st = (const GeneralizedTime_t *)sptr; @@ -445,7 +445,7 @@ asn_GT2time(const GeneralizedTime_t *st, struct tm *ret_tm, int as_gmt) { tloc = timegm(&tm_s); } else { /* - * Without an offset (or 'Z'), + * Without an offset (or "Z"), * we can only guess that it is a local zone. * Interpret it in this fashion. */ @@ -523,7 +523,7 @@ asn_time2GT(GeneralizedTime_t *opt_gt, const struct tm *tm, int force_gmt) { p = buf + size; if(force_gmt) { - *p++ = 0x5a; /* 'Z' */ + *p++ = 0x5a; /* "Z" */ *p++ = 0; size++; } else { diff --git a/skeletons/GeneralizedTime.h b/skeletons/GeneralizedTime.h index 6681183b6..21a680cbf 100644 --- a/skeletons/GeneralizedTime.h +++ b/skeletons/GeneralizedTime.h @@ -9,7 +9,7 @@ typedef OCTET_STRING_t GeneralizedTime_t; /* Implemented via OCTET STRING */ -extern asn1_TYPE_descriptor_t asn1_DEF_GeneralizedTime; +extern asn_TYPE_descriptor_t asn_DEF_GeneralizedTime; asn_struct_print_f GeneralizedTime_print; asn_constr_check_f GeneralizedTime_constraint; @@ -36,7 +36,7 @@ time_t asn_GT2time(const GeneralizedTime_t *, struct tm *_optional_tm4fill, * Convert a struct tm into GeneralizedTime. * If __opt_gt is not given, this function will try to allocate one. * If force_gmt is given, the resulting GeneralizedTime will be forced - * into a GMT time zone (encoding ends with 'Z'). + * into a GMT time zone (encoding ends with a "Z"). * On error, this function returns 0 and sets errno. */ GeneralizedTime_t *asn_time2GT(GeneralizedTime_t *__opt_gt, const struct tm *, diff --git a/skeletons/GraphicString.c b/skeletons/GraphicString.c index 98a8d4802..67442fc1c 100644 --- a/skeletons/GraphicString.c +++ b/skeletons/GraphicString.c @@ -8,11 +8,11 @@ /* * GraphicString basic type description. */ -static ber_tlv_tag_t asn1_DEF_GraphicString_tags[] = { +static ber_tlv_tag_t asn_DEF_GraphicString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (25 << 2)), /* [UNIVERSAL 25] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; -asn1_TYPE_descriptor_t asn1_DEF_GraphicString = { +asn_TYPE_descriptor_t asn_DEF_GraphicString = { "GraphicString", OCTET_STRING_free, OCTET_STRING_print, /* non-ascii string */ @@ -22,12 +22,12 @@ asn1_TYPE_descriptor_t asn1_DEF_GraphicString = { 0, /* Not implemented yet */ OCTET_STRING_encode_xer, /* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ - asn1_DEF_GraphicString_tags, - sizeof(asn1_DEF_GraphicString_tags) - / sizeof(asn1_DEF_GraphicString_tags[0]) - 1, - asn1_DEF_GraphicString_tags, - sizeof(asn1_DEF_GraphicString_tags) - / sizeof(asn1_DEF_GraphicString_tags[0]), + asn_DEF_GraphicString_tags, + sizeof(asn_DEF_GraphicString_tags) + / sizeof(asn_DEF_GraphicString_tags[0]) - 1, + asn_DEF_GraphicString_tags, + sizeof(asn_DEF_GraphicString_tags) + / sizeof(asn_DEF_GraphicString_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/GraphicString.h b/skeletons/GraphicString.h index 64fcf642d..ac78f3eb8 100644 --- a/skeletons/GraphicString.h +++ b/skeletons/GraphicString.h @@ -9,6 +9,6 @@ typedef OCTET_STRING_t GraphicString_t; /* Implemented via OCTET STRING */ -extern asn1_TYPE_descriptor_t asn1_DEF_GraphicString; +extern asn_TYPE_descriptor_t asn_DEF_GraphicString; #endif /* _GraphicString_H_ */ diff --git a/skeletons/IA5String.c b/skeletons/IA5String.c index e9d2a6117..42eb17c4a 100644 --- a/skeletons/IA5String.c +++ b/skeletons/IA5String.c @@ -8,11 +8,11 @@ /* * IA5String basic type description. */ -static ber_tlv_tag_t asn1_DEF_IA5String_tags[] = { +static ber_tlv_tag_t asn_DEF_IA5String_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), /* [UNIVERSAL 22] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; -asn1_TYPE_descriptor_t asn1_DEF_IA5String = { +asn_TYPE_descriptor_t asn_DEF_IA5String = { "IA5String", OCTET_STRING_free, OCTET_STRING_print_ascii, /* ASCII subset */ @@ -22,18 +22,18 @@ asn1_TYPE_descriptor_t asn1_DEF_IA5String = { 0, /* Not implemented yet */ OCTET_STRING_encode_xer_ascii,/* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ - asn1_DEF_IA5String_tags, - sizeof(asn1_DEF_IA5String_tags) - / sizeof(asn1_DEF_IA5String_tags[0]) - 1, - asn1_DEF_IA5String_tags, - sizeof(asn1_DEF_IA5String_tags) - / sizeof(asn1_DEF_IA5String_tags[0]), + asn_DEF_IA5String_tags, + sizeof(asn_DEF_IA5String_tags) + / sizeof(asn_DEF_IA5String_tags[0]) - 1, + asn_DEF_IA5String_tags, + sizeof(asn_DEF_IA5String_tags) + / sizeof(asn_DEF_IA5String_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; int -IA5String_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +IA5String_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const IA5String_t *st = (const IA5String_t *)sptr; diff --git a/skeletons/IA5String.h b/skeletons/IA5String.h index 6c40a954d..c20bc6b32 100644 --- a/skeletons/IA5String.h +++ b/skeletons/IA5String.h @@ -12,7 +12,7 @@ typedef OCTET_STRING_t IA5String_t; /* Implemented via OCTET STRING */ /* * IA5String ASN.1 type definition. */ -extern asn1_TYPE_descriptor_t asn1_DEF_IA5String; +extern asn_TYPE_descriptor_t asn_DEF_IA5String; asn_constr_check_f IA5String_constraint; diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 89be79eca..f485bacbc 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -11,10 +11,10 @@ /* * INTEGER basic type description. */ -static ber_tlv_tag_t asn1_DEF_INTEGER_tags[] = { +static ber_tlv_tag_t asn_DEF_INTEGER_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_INTEGER = { +asn_TYPE_descriptor_t asn_DEF_INTEGER = { "INTEGER", ASN__PRIMITIVE_TYPE_free, INTEGER_print, @@ -24,10 +24,10 @@ asn1_TYPE_descriptor_t asn1_DEF_INTEGER = { 0, /* Not implemented yet */ INTEGER_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_INTEGER_tags, - sizeof(asn1_DEF_INTEGER_tags) / sizeof(asn1_DEF_INTEGER_tags[0]), - asn1_DEF_INTEGER_tags, /* Same as above */ - sizeof(asn1_DEF_INTEGER_tags) / sizeof(asn1_DEF_INTEGER_tags[0]), + asn_DEF_INTEGER_tags, + sizeof(asn_DEF_INTEGER_tags) / sizeof(asn_DEF_INTEGER_tags[0]), + asn_DEF_INTEGER_tags, /* Same as above */ + sizeof(asn_DEF_INTEGER_tags) / sizeof(asn_DEF_INTEGER_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; @@ -36,7 +36,7 @@ asn1_TYPE_descriptor_t asn1_DEF_INTEGER = { * Encode INTEGER type using DER. */ asn_enc_rval_t -INTEGER_encode_der(asn1_TYPE_descriptor_t *td, void *sptr, +INTEGER_encode_der(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { INTEGER_t *st = (INTEGER_t *)sptr; @@ -146,10 +146,10 @@ INTEGER__dump(const INTEGER_t *st, asn_app_consume_bytes_f *cb, void *app_key) { } *p++ = h2c[*buf >> 4]; *p++ = h2c[*buf & 0x0F]; - *p++ = ':'; + *p++ = 0x3a; /* ":" */ } if(p != scratch) - p--; /* Remove the last ':' */ + p--; /* Remove the last ":" */ wrote += p - scratch; return (cb(scratch, p - scratch, app_key) < 0) ? -1 : wrote; @@ -159,7 +159,7 @@ INTEGER__dump(const INTEGER_t *st, asn_app_consume_bytes_f *cb, void *app_key) { * INTEGER specific human-readable output. */ int -INTEGER_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, +INTEGER_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const INTEGER_t *st = (const INTEGER_t *)sptr; ssize_t ret; @@ -176,7 +176,7 @@ INTEGER_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, } asn_enc_rval_t -INTEGER_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, +INTEGER_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { const INTEGER_t *st = (const INTEGER_t *)sptr; @@ -195,7 +195,7 @@ INTEGER_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, } int -asn1_INTEGER2long(const INTEGER_t *iptr, long *lptr) { +asn_INTEGER2long(const INTEGER_t *iptr, long *lptr) { uint8_t *b, *end; size_t size; long l; diff --git a/skeletons/INTEGER.h b/skeletons/INTEGER.h index b42321b49..eb7e9c9fc 100644 --- a/skeletons/INTEGER.h +++ b/skeletons/INTEGER.h @@ -10,7 +10,7 @@ typedef ASN__PRIMITIVE_TYPE_t INTEGER_t; -extern asn1_TYPE_descriptor_t asn1_DEF_INTEGER; +extern asn_TYPE_descriptor_t asn_DEF_INTEGER; asn_struct_print_f INTEGER_print; ber_type_decoder_f INTEGER_decode_ber; @@ -26,6 +26,6 @@ xer_type_encoder_f INTEGER_encode_xer; * -1/EINVAL: Mandatory argument missing * -1/ERANGE: Value encoded is out of range for long representation */ -int asn1_INTEGER2long(const INTEGER_t *i, long *l); +int asn_INTEGER2long(const INTEGER_t *i, long *l); #endif /* _INTEGER_H_ */ diff --git a/skeletons/ISO646String.c b/skeletons/ISO646String.c index dd94be2b4..751139d8b 100644 --- a/skeletons/ISO646String.c +++ b/skeletons/ISO646String.c @@ -8,11 +8,11 @@ /* * ISO646String basic type description. */ -static ber_tlv_tag_t asn1_DEF_ISO646String_tags[] = { +static ber_tlv_tag_t asn_DEF_ISO646String_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), /* [UNIVERSAL 26] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; -asn1_TYPE_descriptor_t asn1_DEF_ISO646String = { +asn_TYPE_descriptor_t asn_DEF_ISO646String = { "ISO646String", OCTET_STRING_free, OCTET_STRING_print_ascii, /* ASCII subset */ @@ -22,12 +22,12 @@ asn1_TYPE_descriptor_t asn1_DEF_ISO646String = { 0, /* Not implemented yet */ OCTET_STRING_encode_xer_ascii,/* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ - asn1_DEF_ISO646String_tags, - sizeof(asn1_DEF_ISO646String_tags) - / sizeof(asn1_DEF_ISO646String_tags[0]) - 1, - asn1_DEF_ISO646String_tags, - sizeof(asn1_DEF_ISO646String_tags) - / sizeof(asn1_DEF_ISO646String_tags[0]), + asn_DEF_ISO646String_tags, + sizeof(asn_DEF_ISO646String_tags) + / sizeof(asn_DEF_ISO646String_tags[0]) - 1, + asn_DEF_ISO646String_tags, + sizeof(asn_DEF_ISO646String_tags) + / sizeof(asn_DEF_ISO646String_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/ISO646String.h b/skeletons/ISO646String.h index c1ff80f7e..5c3c73a51 100644 --- a/skeletons/ISO646String.h +++ b/skeletons/ISO646String.h @@ -10,6 +10,6 @@ typedef VisibleString_t ISO646String_t; /* Implemented using VisibleString */ -extern asn1_TYPE_descriptor_t asn1_DEF_ISO646String; +extern asn_TYPE_descriptor_t asn_DEF_ISO646String; #endif /* _ISO646String_H_ */ diff --git a/skeletons/NULL.c b/skeletons/NULL.c index 8276368cc..7375d0fb0 100644 --- a/skeletons/NULL.c +++ b/skeletons/NULL.c @@ -9,10 +9,10 @@ /* * NULL basic type description. */ -static ber_tlv_tag_t asn1_DEF_NULL_tags[] = { +static ber_tlv_tag_t asn_DEF_NULL_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_NULL = { +asn_TYPE_descriptor_t asn_DEF_NULL = { "NULL", BOOLEAN_free, NULL_print, @@ -22,16 +22,16 @@ asn1_TYPE_descriptor_t asn1_DEF_NULL = { 0, /* Not implemented yet */ NULL_encode_xer, /* Special handling of DER encoding */ 0, /* Use generic outmost tag fetcher */ - asn1_DEF_NULL_tags, - sizeof(asn1_DEF_NULL_tags) / sizeof(asn1_DEF_NULL_tags[0]), - asn1_DEF_NULL_tags, /* Same as above */ - sizeof(asn1_DEF_NULL_tags) / sizeof(asn1_DEF_NULL_tags[0]), + asn_DEF_NULL_tags, + sizeof(asn_DEF_NULL_tags) / sizeof(asn_DEF_NULL_tags[0]), + asn_DEF_NULL_tags, /* Same as above */ + sizeof(asn_DEF_NULL_tags) / sizeof(asn_DEF_NULL_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; asn_enc_rval_t -NULL_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, +NULL_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t erval; @@ -46,7 +46,7 @@ NULL_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, } asn_enc_rval_t -NULL_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, +NULL_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t er; @@ -65,7 +65,7 @@ NULL_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, } int -NULL_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, +NULL_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { (void)td; /* Unused argument */ diff --git a/skeletons/NULL.h b/skeletons/NULL.h index 64c02f707..1a9f7030a 100644 --- a/skeletons/NULL.h +++ b/skeletons/NULL.h @@ -13,7 +13,7 @@ */ typedef int NULL_t; -extern asn1_TYPE_descriptor_t asn1_DEF_NULL; +extern asn_TYPE_descriptor_t asn_DEF_NULL; asn_struct_print_f NULL_print; der_type_encoder_f NULL_encode_der; diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c index bbbc3fb47..19c7559bf 100644 --- a/skeletons/NativeEnumerated.c +++ b/skeletons/NativeEnumerated.c @@ -15,10 +15,10 @@ /* * NativeEnumerated basic type description. */ -static ber_tlv_tag_t asn1_DEF_NativeEnumerated_tags[] = { +static ber_tlv_tag_t asn_DEF_NativeEnumerated_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_NativeEnumerated = { +asn_TYPE_descriptor_t asn_DEF_NativeEnumerated = { "ENUMERATED", /* The ASN.1 type is still ENUMERATED */ NativeInteger_free, NativeInteger_print, @@ -28,10 +28,10 @@ asn1_TYPE_descriptor_t asn1_DEF_NativeEnumerated = { 0, /* Not implemented yet */ NativeInteger_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_NativeEnumerated_tags, - sizeof(asn1_DEF_NativeEnumerated_tags) / sizeof(asn1_DEF_NativeEnumerated_tags[0]), - asn1_DEF_NativeEnumerated_tags, /* Same as above */ - sizeof(asn1_DEF_NativeEnumerated_tags) / sizeof(asn1_DEF_NativeEnumerated_tags[0]), + asn_DEF_NativeEnumerated_tags, + sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]), + asn_DEF_NativeEnumerated_tags, /* Same as above */ + sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/NativeEnumerated.h b/skeletons/NativeEnumerated.h index 681147c1c..2e6e1d0ac 100644 --- a/skeletons/NativeEnumerated.h +++ b/skeletons/NativeEnumerated.h @@ -14,6 +14,6 @@ #include -extern asn1_TYPE_descriptor_t asn1_DEF_NativeEnumerated; +extern asn_TYPE_descriptor_t asn_DEF_NativeEnumerated; #endif /* _NativeEnumerated_H_ */ diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index 2310c07cc..ae71c044c 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -17,10 +17,10 @@ /* * NativeInteger basic type description. */ -static ber_tlv_tag_t asn1_DEF_NativeInteger_tags[] = { +static ber_tlv_tag_t asn_DEF_NativeInteger_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_NativeInteger = { +asn_TYPE_descriptor_t asn_DEF_NativeInteger = { "INTEGER", /* The ASN.1 type is still INTEGER */ NativeInteger_free, NativeInteger_print, @@ -30,10 +30,10 @@ asn1_TYPE_descriptor_t asn1_DEF_NativeInteger = { 0, /* Not implemented yet */ NativeInteger_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_NativeInteger_tags, - sizeof(asn1_DEF_NativeInteger_tags) / sizeof(asn1_DEF_NativeInteger_tags[0]), - asn1_DEF_NativeInteger_tags, /* Same as above */ - sizeof(asn1_DEF_NativeInteger_tags) / sizeof(asn1_DEF_NativeInteger_tags[0]), + asn_DEF_NativeInteger_tags, + sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]), + asn_DEF_NativeInteger_tags, /* Same as above */ + sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; @@ -42,7 +42,8 @@ asn1_TYPE_descriptor_t asn1_DEF_NativeInteger = { * Decode INTEGER type. */ ber_dec_rval_t -NativeInteger_decode_ber(asn1_TYPE_descriptor_t *td, +NativeInteger_decode_ber(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **int_ptr, void *buf_ptr, size_t size, int tag_mode) { int *Int = (int *)*int_ptr; ber_dec_rval_t rval; @@ -66,7 +67,8 @@ NativeInteger_decode_ber(asn1_TYPE_descriptor_t *td, /* * Check tags. */ - rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, 0, &length, 0); + rval = ber_check_tags(opt_codec_ctx, td, 0, buf_ptr, size, + tag_mode, 0, &length, 0); if(rval.code != RC_OK) return rval; @@ -94,7 +96,7 @@ NativeInteger_decode_ber(asn1_TYPE_descriptor_t *td, tmp.buf = (uint8_t *)buf_ptr; tmp.size = length; - if(asn1_INTEGER2long(&tmp, &l)) { + if(asn_INTEGER2long(&tmp, &l)) { rval.code = RC_FAIL; rval.consumed = 0; return rval; @@ -128,7 +130,7 @@ NativeInteger_decode_ber(asn1_TYPE_descriptor_t *td, * Encode the NativeInteger using the standard INTEGER type DER encoder. */ asn_enc_rval_t -NativeInteger_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, +NativeInteger_encode_der(asn_TYPE_descriptor_t *sd, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { unsigned int Int = *(unsigned int *)ptr; /* Disable sign ext. */ @@ -162,7 +164,7 @@ NativeInteger_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr, } asn_enc_rval_t -NativeInteger_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, +NativeInteger_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { char scratch[32]; /* Enough for 64-bit int */ @@ -186,7 +188,7 @@ NativeInteger_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, * INTEGER specific human-readable output. */ int -NativeInteger_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, +NativeInteger_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const int *Int = (const int *)sptr; char scratch[32]; /* Enough for 64-bit int */ @@ -205,7 +207,7 @@ NativeInteger_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, } void -NativeInteger_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { +NativeInteger_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { if(!td || !ptr) return; diff --git a/skeletons/NativeInteger.h b/skeletons/NativeInteger.h index 5c1e5e41b..4de0d66a0 100644 --- a/skeletons/NativeInteger.h +++ b/skeletons/NativeInteger.h @@ -14,7 +14,7 @@ #include -extern asn1_TYPE_descriptor_t asn1_DEF_NativeInteger; +extern asn_TYPE_descriptor_t asn_DEF_NativeInteger; asn_struct_free_f NativeInteger_free; asn_struct_print_f NativeInteger_print; diff --git a/skeletons/NativeReal.c b/skeletons/NativeReal.c index 8fc9ca63b..83b1676e1 100644 --- a/skeletons/NativeReal.c +++ b/skeletons/NativeReal.c @@ -17,10 +17,10 @@ /* * NativeReal basic type description. */ -static ber_tlv_tag_t asn1_DEF_NativeReal_tags[] = { +static ber_tlv_tag_t asn_DEF_NativeReal_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_NativeReal = { +asn_TYPE_descriptor_t asn_DEF_NativeReal = { "REAL", /* The ASN.1 type is still REAL */ NativeReal_free, NativeReal_print, @@ -30,10 +30,10 @@ asn1_TYPE_descriptor_t asn1_DEF_NativeReal = { 0, /* Not implemented yet */ NativeReal_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_NativeReal_tags, - sizeof(asn1_DEF_NativeReal_tags) / sizeof(asn1_DEF_NativeReal_tags[0]), - asn1_DEF_NativeReal_tags, /* Same as above */ - sizeof(asn1_DEF_NativeReal_tags) / sizeof(asn1_DEF_NativeReal_tags[0]), + asn_DEF_NativeReal_tags, + sizeof(asn_DEF_NativeReal_tags) / sizeof(asn_DEF_NativeReal_tags[0]), + asn_DEF_NativeReal_tags, /* Same as above */ + sizeof(asn_DEF_NativeReal_tags) / sizeof(asn_DEF_NativeReal_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; @@ -42,7 +42,8 @@ asn1_TYPE_descriptor_t asn1_DEF_NativeReal = { * Decode REAL type. */ ber_dec_rval_t -NativeReal_decode_ber(asn1_TYPE_descriptor_t *td, +NativeReal_decode_ber(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **dbl_ptr, void *buf_ptr, size_t size, int tag_mode) { double *Dbl = (double *)*dbl_ptr; ber_dec_rval_t rval; @@ -66,7 +67,8 @@ NativeReal_decode_ber(asn1_TYPE_descriptor_t *td, /* * Check tags. */ - rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, 0, &length, 0); + rval = ber_check_tags(opt_codec_ctx, td, 0, buf_ptr, size, + tag_mode, 0, &length, 0); if(rval.code != RC_OK) return rval; @@ -94,7 +96,7 @@ NativeReal_decode_ber(asn1_TYPE_descriptor_t *td, tmp.buf = (uint8_t *)buf_ptr; tmp.size = length; - if(asn1_REAL2double(&tmp, &d)) { + if(asn_REAL2double(&tmp, &d)) { rval.code = RC_FAIL; rval.consumed = 0; return rval; @@ -116,14 +118,14 @@ NativeReal_decode_ber(asn1_TYPE_descriptor_t *td, * Encode the NativeReal using the standard REAL type DER encoder. */ asn_enc_rval_t -NativeReal_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, +NativeReal_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { double Dbl = *(const double *)ptr; asn_enc_rval_t erval; REAL_t tmp; - if(asn1_double2REAL(&tmp, Dbl)) { + if(asn_double2REAL(&tmp, Dbl)) { erval.encoded = -1; erval.failed_type = td; erval.structure_ptr = ptr; @@ -141,7 +143,7 @@ NativeReal_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, asn_enc_rval_t -NativeReal_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, +NativeReal_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { const double *Dbl = (const double *)sptr; @@ -161,7 +163,7 @@ NativeReal_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, * REAL specific human-readable output. */ int -NativeReal_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, +NativeReal_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const double *Dbl = (const double *)sptr; @@ -174,7 +176,7 @@ NativeReal_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, } void -NativeReal_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { +NativeReal_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { if(!td || !ptr) return; diff --git a/skeletons/NativeReal.h b/skeletons/NativeReal.h index 2f3b0a60c..b1c58bf47 100644 --- a/skeletons/NativeReal.h +++ b/skeletons/NativeReal.h @@ -13,7 +13,7 @@ #include -extern asn1_TYPE_descriptor_t asn1_DEF_NativeReal; +extern asn_TYPE_descriptor_t asn_DEF_NativeReal; asn_struct_free_f NativeReal_free; asn_struct_print_f NativeReal_print; diff --git a/skeletons/NumericString.c b/skeletons/NumericString.c index fa4355802..7d471985c 100644 --- a/skeletons/NumericString.c +++ b/skeletons/NumericString.c @@ -8,11 +8,11 @@ /* * NumericString basic type description. */ -static ber_tlv_tag_t asn1_DEF_NumericString_tags[] = { +static ber_tlv_tag_t asn_DEF_NumericString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (18 << 2)), /* [UNIVERSAL 18] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; -asn1_TYPE_descriptor_t asn1_DEF_NumericString = { +asn_TYPE_descriptor_t asn_DEF_NumericString = { "NumericString", OCTET_STRING_free, OCTET_STRING_print_ascii, /* ASCII subset */ @@ -22,18 +22,18 @@ asn1_TYPE_descriptor_t asn1_DEF_NumericString = { 0, /* Not implemented yet */ OCTET_STRING_encode_xer_ascii,/* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ - asn1_DEF_NumericString_tags, - sizeof(asn1_DEF_NumericString_tags) - / sizeof(asn1_DEF_NumericString_tags[0]) - 1, - asn1_DEF_NumericString_tags, - sizeof(asn1_DEF_NumericString_tags) - / sizeof(asn1_DEF_NumericString_tags[0]), + asn_DEF_NumericString_tags, + sizeof(asn_DEF_NumericString_tags) + / sizeof(asn_DEF_NumericString_tags[0]) - 1, + asn_DEF_NumericString_tags, + sizeof(asn_DEF_NumericString_tags) + / sizeof(asn_DEF_NumericString_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; int -NumericString_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +NumericString_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const NumericString_t *st = (const NumericString_t *)sptr; diff --git a/skeletons/NumericString.h b/skeletons/NumericString.h index 2e06255ea..5ace1dda8 100644 --- a/skeletons/NumericString.h +++ b/skeletons/NumericString.h @@ -9,7 +9,7 @@ typedef OCTET_STRING_t NumericString_t; /* Implemented via OCTET STRING */ -extern asn1_TYPE_descriptor_t asn1_DEF_NumericString; +extern asn_TYPE_descriptor_t asn_DEF_NumericString; asn_constr_check_f NumericString_constraint; diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index 9e8f2e2a2..db2fd7a39 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -11,10 +11,10 @@ /* * OBJECT IDENTIFIER basic type description. */ -static ber_tlv_tag_t asn1_DEF_OBJECT_IDENTIFIER_tags[] = { +static ber_tlv_tag_t asn_DEF_OBJECT_IDENTIFIER_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_OBJECT_IDENTIFIER = { +asn_TYPE_descriptor_t asn_DEF_OBJECT_IDENTIFIER = { "OBJECT IDENTIFIER", ASN__PRIMITIVE_TYPE_free, OBJECT_IDENTIFIER_print, @@ -24,19 +24,19 @@ asn1_TYPE_descriptor_t asn1_DEF_OBJECT_IDENTIFIER = { 0, /* Not implemented yet */ OBJECT_IDENTIFIER_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_OBJECT_IDENTIFIER_tags, - sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags) - / sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags[0]), - asn1_DEF_OBJECT_IDENTIFIER_tags, /* Same as above */ - sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags) - / sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags[0]), + asn_DEF_OBJECT_IDENTIFIER_tags, + sizeof(asn_DEF_OBJECT_IDENTIFIER_tags) + / sizeof(asn_DEF_OBJECT_IDENTIFIER_tags[0]), + asn_DEF_OBJECT_IDENTIFIER_tags, /* Same as above */ + sizeof(asn_DEF_OBJECT_IDENTIFIER_tags) + / sizeof(asn_DEF_OBJECT_IDENTIFIER_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; int -OBJECT_IDENTIFIER_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +OBJECT_IDENTIFIER_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr; @@ -263,7 +263,7 @@ OBJECT_IDENTIFIER__dump_body(const OBJECT_IDENTIFIER_t *st, asn_app_consume_byte } asn_enc_rval_t -OBJECT_IDENTIFIER_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, +OBJECT_IDENTIFIER_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { const OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr; @@ -282,7 +282,7 @@ OBJECT_IDENTIFIER_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, } int -OBJECT_IDENTIFIER_print(asn1_TYPE_descriptor_t *td, const void *sptr, +OBJECT_IDENTIFIER_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr; diff --git a/skeletons/OBJECT_IDENTIFIER.h b/skeletons/OBJECT_IDENTIFIER.h index 3ccbc6493..8945a32da 100644 --- a/skeletons/OBJECT_IDENTIFIER.h +++ b/skeletons/OBJECT_IDENTIFIER.h @@ -10,7 +10,7 @@ typedef ASN__PRIMITIVE_TYPE_t OBJECT_IDENTIFIER_t; -extern asn1_TYPE_descriptor_t asn1_DEF_OBJECT_IDENTIFIER; +extern asn_TYPE_descriptor_t asn_DEF_OBJECT_IDENTIFIER; asn_struct_print_f OBJECT_IDENTIFIER_print; asn_constr_check_f OBJECT_IDENTIFIER_constraint; diff --git a/skeletons/OCTET_STRING.h b/skeletons/OCTET_STRING.h index 3c4509b68..7291585b9 100644 --- a/skeletons/OCTET_STRING.h +++ b/skeletons/OCTET_STRING.h @@ -11,10 +11,10 @@ typedef struct OCTET_STRING { uint8_t *buf; /* Buffer with consecutive OCTET_STRING bits */ int size; /* Size of the buffer */ - ber_dec_ctx_t _ber_dec_ctx; /* Parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; /* Parsing across buffer boundaries */ } OCTET_STRING_t; -extern asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING; +extern asn_TYPE_descriptor_t asn_DEF_OCTET_STRING; asn_struct_free_f OCTET_STRING_free; asn_struct_print_f OCTET_STRING_print; diff --git a/skeletons/ObjectDescriptor.c b/skeletons/ObjectDescriptor.c index 192b4684f..125e69599 100644 --- a/skeletons/ObjectDescriptor.c +++ b/skeletons/ObjectDescriptor.c @@ -8,11 +8,11 @@ /* * ObjectDescriptor basic type description. */ -static ber_tlv_tag_t asn1_DEF_ObjectDescriptor_tags[] = { +static ber_tlv_tag_t asn_DEF_ObjectDescriptor_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (7 << 2)), /* [UNIVERSAL 7] IMPLICIT ... */ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; -asn1_TYPE_descriptor_t asn1_DEF_ObjectDescriptor = { +asn_TYPE_descriptor_t asn_DEF_ObjectDescriptor = { "ObjectDescriptor", OCTET_STRING_free, OCTET_STRING_print_ascii, /* Treat as ASCII subset (it's not) */ @@ -22,12 +22,12 @@ asn1_TYPE_descriptor_t asn1_DEF_ObjectDescriptor = { 0, /* Not implemented yet */ OCTET_STRING_encode_xer_ascii,/* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ - asn1_DEF_ObjectDescriptor_tags, - sizeof(asn1_DEF_ObjectDescriptor_tags) - / sizeof(asn1_DEF_ObjectDescriptor_tags[0]) - 1, - asn1_DEF_ObjectDescriptor_tags, - sizeof(asn1_DEF_ObjectDescriptor_tags) - / sizeof(asn1_DEF_ObjectDescriptor_tags[0]), + asn_DEF_ObjectDescriptor_tags, + sizeof(asn_DEF_ObjectDescriptor_tags) + / sizeof(asn_DEF_ObjectDescriptor_tags[0]) - 1, + asn_DEF_ObjectDescriptor_tags, + sizeof(asn_DEF_ObjectDescriptor_tags) + / sizeof(asn_DEF_ObjectDescriptor_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/ObjectDescriptor.h b/skeletons/ObjectDescriptor.h index 2620d139e..54a0000fe 100644 --- a/skeletons/ObjectDescriptor.h +++ b/skeletons/ObjectDescriptor.h @@ -9,6 +9,6 @@ typedef GraphicString_t ObjectDescriptor_t; /* Implemented via GraphicString */ -extern asn1_TYPE_descriptor_t asn1_DEF_ObjectDescriptor; +extern asn_TYPE_descriptor_t asn_DEF_ObjectDescriptor; #endif /* _ObjectDescriptor_H_ */ diff --git a/skeletons/PrintableString.c b/skeletons/PrintableString.c index f0d4b1674..dfe4f9c97 100644 --- a/skeletons/PrintableString.c +++ b/skeletons/PrintableString.c @@ -8,11 +8,11 @@ /* * PrintableString basic type description. */ -static ber_tlv_tag_t asn1_DEF_PrintableString_tags[] = { +static ber_tlv_tag_t asn_DEF_PrintableString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (19 << 2)), /* [UNIVERSAL 19] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; -asn1_TYPE_descriptor_t asn1_DEF_PrintableString = { +asn_TYPE_descriptor_t asn_DEF_PrintableString = { "PrintableString", OCTET_STRING_free, OCTET_STRING_print_ascii, /* ASCII subset */ @@ -22,12 +22,12 @@ asn1_TYPE_descriptor_t asn1_DEF_PrintableString = { 0, /* Not implemented yet */ OCTET_STRING_encode_xer_ascii,/* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ - asn1_DEF_PrintableString_tags, - sizeof(asn1_DEF_PrintableString_tags) - / sizeof(asn1_DEF_PrintableString_tags[0]) - 1, - asn1_DEF_PrintableString_tags, - sizeof(asn1_DEF_PrintableString_tags) - / sizeof(asn1_DEF_PrintableString_tags[0]), + asn_DEF_PrintableString_tags, + sizeof(asn_DEF_PrintableString_tags) + / sizeof(asn_DEF_PrintableString_tags[0]) - 1, + asn_DEF_PrintableString_tags, + sizeof(asn_DEF_PrintableString_tags) + / sizeof(asn_DEF_PrintableString_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; @@ -56,7 +56,7 @@ static int _PrintableString_alphabet[256] = { }; int -PrintableString_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +PrintableString_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const PrintableString_t *st = (const PrintableString_t *)sptr; diff --git a/skeletons/PrintableString.h b/skeletons/PrintableString.h index fffb86ee1..e4a230de3 100644 --- a/skeletons/PrintableString.h +++ b/skeletons/PrintableString.h @@ -9,7 +9,7 @@ typedef OCTET_STRING_t PrintableString_t; /* Implemented via OCTET STRING */ -extern asn1_TYPE_descriptor_t asn1_DEF_PrintableString; +extern asn_TYPE_descriptor_t asn_DEF_PrintableString; asn_constr_check_f PrintableString_constraint; diff --git a/skeletons/REAL.c b/skeletons/REAL.c index b03a70dd5..c6d90f332 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -20,10 +20,10 @@ static const double real_zero; /* * REAL basic type description. */ -static ber_tlv_tag_t asn1_DEF_REAL_tags[] = { +static ber_tlv_tag_t asn_DEF_REAL_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_REAL = { +asn_TYPE_descriptor_t asn_DEF_REAL = { "REAL", ASN__PRIMITIVE_TYPE_free, REAL_print, @@ -33,10 +33,10 @@ asn1_TYPE_descriptor_t asn1_DEF_REAL = { 0, /* Not implemented yet */ REAL_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_REAL_tags, - sizeof(asn1_DEF_REAL_tags) / sizeof(asn1_DEF_REAL_tags[0]), - asn1_DEF_REAL_tags, /* Same as above */ - sizeof(asn1_DEF_REAL_tags) / sizeof(asn1_DEF_REAL_tags[0]), + asn_DEF_REAL_tags, + sizeof(asn_DEF_REAL_tags) / sizeof(asn_DEF_REAL_tags[0]), + asn_DEF_REAL_tags, /* Same as above */ + sizeof(asn_DEF_REAL_tags) / sizeof(asn_DEF_REAL_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; @@ -182,7 +182,7 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) } int -REAL_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, +REAL_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const REAL_t *st = (const REAL_t *)sptr; ssize_t ret; @@ -193,7 +193,7 @@ REAL_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, if(!st || !st->buf) ret = cb("", 8, app_key); - else if(asn1_REAL2double(st, &d)) + else if(asn_REAL2double(st, &d)) ret = cb("", 7, app_key); else ret = REAL__dump(d, 0, cb, app_key); @@ -202,7 +202,7 @@ REAL_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, } asn_enc_rval_t -REAL_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, +REAL_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { REAL_t *st = (REAL_t *)sptr; @@ -211,7 +211,7 @@ REAL_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, (void)ilevel; - if(!st || !st->buf || asn1_REAL2double(st, &d)) + if(!st || !st->buf || asn_REAL2double(st, &d)) _ASN_ENCODE_FAILED; er.encoded = REAL__dump(d, flags & XER_F_CANONICAL, cb, app_key); @@ -221,7 +221,7 @@ REAL_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, } int -asn1_REAL2double(const REAL_t *st, double *dbl_value) { +asn_REAL2double(const REAL_t *st, double *dbl_value) { unsigned int octv; if(!st || !st->buf) { @@ -372,7 +372,7 @@ asn1_REAL2double(const REAL_t *st, double *dbl_value) { * [1 bit sign] [11 bits exponent] [52 bits mantissa] */ int -asn1_double2REAL(REAL_t *st, double dbl_value) { +asn_double2REAL(REAL_t *st, double dbl_value) { #ifdef WORDS_BIGENDIAN /* Known to be big-endian */ int littleEndian = 0; #else /* need to test: have no explicit information */ diff --git a/skeletons/REAL.h b/skeletons/REAL.h index c478f41d9..bd5979940 100644 --- a/skeletons/REAL.h +++ b/skeletons/REAL.h @@ -10,7 +10,7 @@ typedef ASN__PRIMITIVE_TYPE_t REAL_t; -extern asn1_TYPE_descriptor_t asn1_DEF_REAL; +extern asn_TYPE_descriptor_t asn_DEF_REAL; asn_struct_print_f REAL_print; xer_type_encoder_f REAL_encode_xer; @@ -27,7 +27,7 @@ ssize_t REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *a * 0: Value converted successfully * -1: An error occured while converting the value: invalid format. */ -int asn1_REAL2double(const REAL_t *real_ptr, double *d); -int asn1_double2REAL(REAL_t *real_ptr, double d); +int asn_REAL2double(const REAL_t *real_ptr, double *d); +int asn_double2REAL(REAL_t *real_ptr, double d); #endif /* ASN_TYPE_REAL_H */ diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index e928bd059..899e69c6e 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -12,10 +12,10 @@ /* * RELATIVE-OID basic type description. */ -static ber_tlv_tag_t asn1_DEF_RELATIVE_OID_tags[] = { +static ber_tlv_tag_t asn_DEF_RELATIVE_OID_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (13 << 2)) }; -asn1_TYPE_descriptor_t asn1_DEF_RELATIVE_OID = { +asn_TYPE_descriptor_t asn_DEF_RELATIVE_OID = { "RELATIVE-OID", ASN__PRIMITIVE_TYPE_free, RELATIVE_OID_print, @@ -25,12 +25,12 @@ asn1_TYPE_descriptor_t asn1_DEF_RELATIVE_OID = { 0, /* Not implemented yet */ RELATIVE_OID_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_RELATIVE_OID_tags, - sizeof(asn1_DEF_RELATIVE_OID_tags) - / sizeof(asn1_DEF_RELATIVE_OID_tags[0]), - asn1_DEF_RELATIVE_OID_tags, /* Same as above */ - sizeof(asn1_DEF_RELATIVE_OID_tags) - / sizeof(asn1_DEF_RELATIVE_OID_tags[0]), + asn_DEF_RELATIVE_OID_tags, + sizeof(asn_DEF_RELATIVE_OID_tags) + / sizeof(asn_DEF_RELATIVE_OID_tags[0]), + asn_DEF_RELATIVE_OID_tags, /* Same as above */ + sizeof(asn_DEF_RELATIVE_OID_tags) + / sizeof(asn_DEF_RELATIVE_OID_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; @@ -65,7 +65,7 @@ RELATIVE_OID__dump_body(const RELATIVE_OID_t *st, asn_app_consume_bytes_f *cb, v } int -RELATIVE_OID_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, +RELATIVE_OID_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const RELATIVE_OID_t *st = (const RELATIVE_OID_t *)sptr; @@ -86,7 +86,7 @@ RELATIVE_OID_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, } asn_enc_rval_t -RELATIVE_OID_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, +RELATIVE_OID_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { RELATIVE_OID_t *st = (RELATIVE_OID_t *)sptr; diff --git a/skeletons/RELATIVE-OID.h b/skeletons/RELATIVE-OID.h index 855391c9a..943517213 100644 --- a/skeletons/RELATIVE-OID.h +++ b/skeletons/RELATIVE-OID.h @@ -10,7 +10,7 @@ /* Implemented via OBJECT IDENTIFIER */ typedef OBJECT_IDENTIFIER_t RELATIVE_OID_t; -extern asn1_TYPE_descriptor_t asn1_DEF_RELATIVE_OID; +extern asn_TYPE_descriptor_t asn_DEF_RELATIVE_OID; asn_struct_print_f RELATIVE_OID_print; xer_type_encoder_f RELATIVE_OID_encode_xer; diff --git a/skeletons/T61String.c b/skeletons/T61String.c index 14a86b907..41835c4b5 100644 --- a/skeletons/T61String.c +++ b/skeletons/T61String.c @@ -8,11 +8,11 @@ /* * T61String basic type description. */ -static ber_tlv_tag_t asn1_DEF_T61String_tags[] = { +static ber_tlv_tag_t asn_DEF_T61String_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (20 << 2)), /* [UNIVERSAL 20] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; -asn1_TYPE_descriptor_t asn1_DEF_T61String = { +asn_TYPE_descriptor_t asn_DEF_T61String = { "T61String", OCTET_STRING_free, OCTET_STRING_print, /* non-ascii string */ @@ -22,12 +22,12 @@ asn1_TYPE_descriptor_t asn1_DEF_T61String = { 0, /* Not implemented yet */ OCTET_STRING_encode_xer, /* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ - asn1_DEF_T61String_tags, - sizeof(asn1_DEF_T61String_tags) - / sizeof(asn1_DEF_T61String_tags[0]) - 1, - asn1_DEF_T61String_tags, - sizeof(asn1_DEF_T61String_tags) - / sizeof(asn1_DEF_T61String_tags[0]), + asn_DEF_T61String_tags, + sizeof(asn_DEF_T61String_tags) + / sizeof(asn_DEF_T61String_tags[0]) - 1, + asn_DEF_T61String_tags, + sizeof(asn_DEF_T61String_tags) + / sizeof(asn_DEF_T61String_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/T61String.h b/skeletons/T61String.h index f523444bb..46b12ceb5 100644 --- a/skeletons/T61String.h +++ b/skeletons/T61String.h @@ -9,6 +9,6 @@ typedef OCTET_STRING_t T61String_t; /* Implemented via OCTET STRING */ -extern asn1_TYPE_descriptor_t asn1_DEF_T61String; +extern asn_TYPE_descriptor_t asn_DEF_T61String; #endif /* _T61String_H_ */ diff --git a/skeletons/TeletexString.c b/skeletons/TeletexString.c index 965ada862..aa8d2a907 100644 --- a/skeletons/TeletexString.c +++ b/skeletons/TeletexString.c @@ -8,11 +8,11 @@ /* * TeletexString basic type description. */ -static ber_tlv_tag_t asn1_DEF_TeletexString_tags[] = { +static ber_tlv_tag_t asn_DEF_TeletexString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (20 << 2)), /* [UNIVERSAL 20] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), /* ... OCTET STRING */ }; -asn1_TYPE_descriptor_t asn1_DEF_TeletexString = { +asn_TYPE_descriptor_t asn_DEF_TeletexString = { "TeletexString", OCTET_STRING_free, OCTET_STRING_print, /* non-ascii string */ @@ -22,12 +22,12 @@ asn1_TYPE_descriptor_t asn1_DEF_TeletexString = { 0, /* Not implemented yet */ OCTET_STRING_encode_xer, /* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ - asn1_DEF_TeletexString_tags, - sizeof(asn1_DEF_TeletexString_tags) - / sizeof(asn1_DEF_TeletexString_tags[0]) - 1, - asn1_DEF_TeletexString_tags, - sizeof(asn1_DEF_TeletexString_tags) - / sizeof(asn1_DEF_TeletexString_tags[0]), + asn_DEF_TeletexString_tags, + sizeof(asn_DEF_TeletexString_tags) + / sizeof(asn_DEF_TeletexString_tags[0]) - 1, + asn_DEF_TeletexString_tags, + sizeof(asn_DEF_TeletexString_tags) + / sizeof(asn_DEF_TeletexString_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/TeletexString.h b/skeletons/TeletexString.h index e92f7c2dc..a408d5841 100644 --- a/skeletons/TeletexString.h +++ b/skeletons/TeletexString.h @@ -9,6 +9,6 @@ typedef OCTET_STRING_t TeletexString_t; /* Implemented via OCTET STRING */ -extern asn1_TYPE_descriptor_t asn1_DEF_TeletexString; +extern asn_TYPE_descriptor_t asn_DEF_TeletexString; #endif /* _TeletexString_H_ */ diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c index f884eebca..045b172fd 100644 --- a/skeletons/UTCTime.c +++ b/skeletons/UTCTime.c @@ -14,12 +14,12 @@ /* * UTCTime basic type description. */ -static ber_tlv_tag_t asn1_DEF_UTCTime_tags[] = { +static ber_tlv_tag_t asn_DEF_UTCTime_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (23 << 2)), /* [UNIVERSAL 23] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), /* [UNIVERSAL 26] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; -asn1_TYPE_descriptor_t asn1_DEF_UTCTime = { +asn_TYPE_descriptor_t asn_DEF_UTCTime = { "UTCTime", OCTET_STRING_free, UTCTime_print, @@ -29,12 +29,12 @@ asn1_TYPE_descriptor_t asn1_DEF_UTCTime = { 0, /* Not implemented yet */ UTCTime_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn1_DEF_UTCTime_tags, - sizeof(asn1_DEF_UTCTime_tags) - / sizeof(asn1_DEF_UTCTime_tags[0]) - 2, - asn1_DEF_UTCTime_tags, - sizeof(asn1_DEF_UTCTime_tags) - / sizeof(asn1_DEF_UTCTime_tags[0]), + asn_DEF_UTCTime_tags, + sizeof(asn_DEF_UTCTime_tags) + / sizeof(asn_DEF_UTCTime_tags[0]) - 2, + asn_DEF_UTCTime_tags, + sizeof(asn_DEF_UTCTime_tags) + / sizeof(asn_DEF_UTCTime_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; @@ -45,7 +45,7 @@ asn1_TYPE_descriptor_t asn1_DEF_UTCTime = { * Check that the time looks like the time. */ int -UTCTime_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +UTCTime_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const UTCTime_t *st = (const UTCTime_t *)sptr; time_t tloc; @@ -63,7 +63,7 @@ UTCTime_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } asn_enc_rval_t -UTCTime_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, +UTCTime_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { OCTET_STRING_t st; @@ -93,7 +93,7 @@ UTCTime_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, } int -UTCTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, +UTCTime_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const UTCTime_t *st = (const UTCTime_t *)sptr; diff --git a/skeletons/UTCTime.h b/skeletons/UTCTime.h index 65de7a3a4..6d26807b8 100644 --- a/skeletons/UTCTime.h +++ b/skeletons/UTCTime.h @@ -9,7 +9,7 @@ typedef OCTET_STRING_t UTCTime_t; /* Implemented via OCTET STRING */ -extern asn1_TYPE_descriptor_t asn1_DEF_UTCTime; +extern asn_TYPE_descriptor_t asn_DEF_UTCTime; asn_struct_print_f UTCTime_print; asn_constr_check_f UTCTime_constraint; diff --git a/skeletons/UTF8String.c b/skeletons/UTF8String.c index 2d474e9b0..7d3fcd2c1 100644 --- a/skeletons/UTF8String.c +++ b/skeletons/UTF8String.c @@ -8,11 +8,11 @@ /* * UTF8String basic type description. */ -static ber_tlv_tag_t asn1_DEF_UTF8String_tags[] = { +static ber_tlv_tag_t asn_DEF_UTF8String_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), /* [UNIVERSAL 12] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), /* ... OCTET STRING */ }; -asn1_TYPE_descriptor_t asn1_DEF_UTF8String = { +asn_TYPE_descriptor_t asn_DEF_UTF8String = { "UTF8String", OCTET_STRING_free, UTF8String_print, @@ -22,12 +22,12 @@ asn1_TYPE_descriptor_t asn1_DEF_UTF8String = { 0, /* Not implemented yet */ OCTET_STRING_encode_xer_ascii, /* Already in UTF-8 format */ 0, /* Use generic outmost tag fetcher */ - asn1_DEF_UTF8String_tags, - sizeof(asn1_DEF_UTF8String_tags) - / sizeof(asn1_DEF_UTF8String_tags[0]) - 1, - asn1_DEF_UTF8String_tags, - sizeof(asn1_DEF_UTF8String_tags) - / sizeof(asn1_DEF_UTF8String_tags[0]), + asn_DEF_UTF8String_tags, + sizeof(asn_DEF_UTF8String_tags) + / sizeof(asn_DEF_UTF8String_tags[0]) - 1, + asn_DEF_UTF8String_tags, + sizeof(asn_DEF_UTF8String_tags) + / sizeof(asn_DEF_UTF8String_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; @@ -42,7 +42,7 @@ static int _UTF8String_h2[16] = { }; int -UTF8String_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +UTF8String_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { ssize_t len; len = UTF8String_length((const UTF8String_t *)sptr, td->name, @@ -113,7 +113,7 @@ UTF8String_length(const UTF8String_t *st, const char *opt_type_name, } int -UTF8String_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, +UTF8String_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const UTF8String_t *st = (const UTF8String_t *)sptr; diff --git a/skeletons/UTF8String.h b/skeletons/UTF8String.h index bb58bbea5..a1149e4fd 100644 --- a/skeletons/UTF8String.h +++ b/skeletons/UTF8String.h @@ -9,7 +9,7 @@ typedef OCTET_STRING_t UTF8String_t; /* Implemented via OCTET STRING */ -extern asn1_TYPE_descriptor_t asn1_DEF_UTF8String; +extern asn_TYPE_descriptor_t asn_DEF_UTF8String; asn_struct_print_f UTF8String_print; asn_constr_check_f UTF8String_constraint; diff --git a/skeletons/UniversalString.c b/skeletons/UniversalString.c index 3dc0441b1..f43de182f 100644 --- a/skeletons/UniversalString.c +++ b/skeletons/UniversalString.c @@ -8,11 +8,11 @@ /* * UniversalString basic type description. */ -static ber_tlv_tag_t asn1_DEF_UniversalString_tags[] = { +static ber_tlv_tag_t asn_DEF_UniversalString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (28 << 2)), /* [UNIVERSAL 28] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; -asn1_TYPE_descriptor_t asn1_DEF_UniversalString = { +asn_TYPE_descriptor_t asn_DEF_UniversalString = { "UniversalString", OCTET_STRING_free, UniversalString_print, /* Convert into UTF8 and print */ @@ -22,12 +22,12 @@ asn1_TYPE_descriptor_t asn1_DEF_UniversalString = { 0, /* Not implemented yet */ UniversalString_encode_xer, /* Conver into UTF8 */ 0, /* Use generic outmost tag fetcher */ - asn1_DEF_UniversalString_tags, - sizeof(asn1_DEF_UniversalString_tags) - / sizeof(asn1_DEF_UniversalString_tags[0]) - 1, - asn1_DEF_UniversalString_tags, - sizeof(asn1_DEF_UniversalString_tags) - / sizeof(asn1_DEF_UniversalString_tags[0]), + asn_DEF_UniversalString_tags, + sizeof(asn_DEF_UniversalString_tags) + / sizeof(asn_DEF_UniversalString_tags[0]) - 1, + asn_DEF_UniversalString_tags, + sizeof(asn_DEF_UniversalString_tags) + / sizeof(asn_DEF_UniversalString_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; @@ -93,7 +93,7 @@ UniversalString__dump(const UniversalString_t *st, } asn_enc_rval_t -UniversalString_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, +UniversalString_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { const UniversalString_t *st = (const UniversalString_t *)sptr; @@ -112,7 +112,7 @@ UniversalString_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, } int -UniversalString_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, +UniversalString_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const UniversalString_t *st = (const UniversalString_t *)sptr; diff --git a/skeletons/UniversalString.h b/skeletons/UniversalString.h index fe74f0fd7..6d4a291f5 100644 --- a/skeletons/UniversalString.h +++ b/skeletons/UniversalString.h @@ -9,7 +9,7 @@ typedef OCTET_STRING_t UniversalString_t; /* Implemented via OCTET STRING */ -extern asn1_TYPE_descriptor_t asn1_DEF_UniversalString; +extern asn_TYPE_descriptor_t asn_DEF_UniversalString; asn_struct_print_f UniversalString_print; /* Human-readable output */ xer_type_encoder_f UniversalString_encode_xer; diff --git a/skeletons/VideotexString.c b/skeletons/VideotexString.c index 3520471d1..fa6892ec1 100644 --- a/skeletons/VideotexString.c +++ b/skeletons/VideotexString.c @@ -8,11 +8,11 @@ /* * VideotexString basic type description. */ -static ber_tlv_tag_t asn1_DEF_VideotexString_tags[] = { +static ber_tlv_tag_t asn_DEF_VideotexString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (21 << 2)), /* [UNIVERSAL 21] IMPLICIT */ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; -asn1_TYPE_descriptor_t asn1_DEF_VideotexString = { +asn_TYPE_descriptor_t asn_DEF_VideotexString = { "VideotexString", OCTET_STRING_free, OCTET_STRING_print, /* non-ascii string */ @@ -22,12 +22,12 @@ asn1_TYPE_descriptor_t asn1_DEF_VideotexString = { 0, /* Not implemented yet */ OCTET_STRING_encode_xer, /* Implemented in terms of OCTET STRING */ 0, /* Use generic outmost tag fetcher */ - asn1_DEF_VideotexString_tags, - sizeof(asn1_DEF_VideotexString_tags) - / sizeof(asn1_DEF_VideotexString_tags[0]) - 1, - asn1_DEF_VideotexString_tags, - sizeof(asn1_DEF_VideotexString_tags) - / sizeof(asn1_DEF_VideotexString_tags[0]), + asn_DEF_VideotexString_tags, + sizeof(asn_DEF_VideotexString_tags) + / sizeof(asn_DEF_VideotexString_tags[0]) - 1, + asn_DEF_VideotexString_tags, + sizeof(asn_DEF_VideotexString_tags) + / sizeof(asn_DEF_VideotexString_tags[0]), 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/VideotexString.h b/skeletons/VideotexString.h index 6b60341f5..0a156e247 100644 --- a/skeletons/VideotexString.h +++ b/skeletons/VideotexString.h @@ -9,6 +9,6 @@ typedef OCTET_STRING_t VideotexString_t; /* Implemented via OCTET STRING */ -extern asn1_TYPE_descriptor_t asn1_DEF_VideotexString; +extern asn_TYPE_descriptor_t asn_DEF_VideotexString; #endif /* _VideotexString_H_ */ diff --git a/skeletons/VisibleString.h b/skeletons/VisibleString.h index b90234c68..ca05beafe 100644 --- a/skeletons/VisibleString.h +++ b/skeletons/VisibleString.h @@ -9,7 +9,7 @@ typedef OCTET_STRING_t VisibleString_t; /* Implemented via OCTET STRING */ -extern asn1_TYPE_descriptor_t asn1_DEF_VisibleString; +extern asn_TYPE_descriptor_t asn_DEF_VisibleString; asn_constr_check_f VisibleString_constraint; diff --git a/skeletons/asn_application.h b/skeletons/asn_application.h index 14fe3a931..33de699a4 100644 --- a/skeletons/asn_application.h +++ b/skeletons/asn_application.h @@ -20,6 +20,6 @@ typedef int (asn_app_consume_bytes_f)(const void *buffer, size_t size, void *application_specific_key); -#include /* for asn1_TYPE_descriptor_t */ +#include /* for asn_TYPE_descriptor_t */ #endif /* _ASN_APPLICATION_H_ */ diff --git a/skeletons/ber_codec_prim.c b/skeletons/ber_codec_prim.c index 6bb361355..c4d06e16d 100644 --- a/skeletons/ber_codec_prim.c +++ b/skeletons/ber_codec_prim.c @@ -11,7 +11,8 @@ * Decode an always-primitive type. */ ber_dec_rval_t -ber_decode_primitive(asn1_TYPE_descriptor_t *td, +ber_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, void *buf_ptr, size_t size, int tag_mode) { ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)*sptr; ber_dec_rval_t rval; @@ -35,7 +36,8 @@ ber_decode_primitive(asn1_TYPE_descriptor_t *td, /* * Check tags and extract value length. */ - rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, 0, &length, 0); + rval = ber_check_tags(opt_codec_ctx, td, 0, buf_ptr, size, + tag_mode, 0, &length, 0); if(rval.code != RC_OK) return rval; @@ -78,7 +80,7 @@ ber_decode_primitive(asn1_TYPE_descriptor_t *td, * Encode an always-primitive type using DER. */ asn_enc_rval_t -der_encode_primitive(asn1_TYPE_descriptor_t *td, void *sptr, +der_encode_primitive(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t erval; @@ -113,7 +115,7 @@ der_encode_primitive(asn1_TYPE_descriptor_t *td, void *sptr, } void -ASN__PRIMITIVE_TYPE_free(asn1_TYPE_descriptor_t *td, void *sptr, +ASN__PRIMITIVE_TYPE_free(asn_TYPE_descriptor_t *td, void *sptr, int contents_only) { ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)sptr; diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 5ad33c830..ab158462b 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -70,8 +70,8 @@ static void _set_present_idx(void *sptr, int offset, int size, int pres); */ static int _search4tag(const void *ap, const void *bp) { - const asn1_TYPE_tag2member_t *a = (const asn1_TYPE_tag2member_t *)ap; - const asn1_TYPE_tag2member_t *b = (const asn1_TYPE_tag2member_t *)bp; + const asn_TYPE_tag2member_t *a = (const asn_TYPE_tag2member_t *)ap; + const asn_TYPE_tag2member_t *b = (const asn_TYPE_tag2member_t *)bp; int a_class = BER_TAG_CLASS(a->el_tag); int b_class = BER_TAG_CLASS(b->el_tag); @@ -97,23 +97,22 @@ _search4tag(const void *ap, const void *bp) { * The decoder of the CHOICE type. */ ber_dec_rval_t -CHOICE_decode_ber(asn1_TYPE_descriptor_t *td, +CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, void *ptr, size_t size, int tag_mode) { /* * Bring closer parts of structure description. */ - asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)td->specifics; - asn1_TYPE_member_t *elements = td->elements; + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elements = td->elements; /* * Parts of the structure being constructed. */ void *st = *struct_ptr; /* Target structure. */ - ber_dec_ctx_t *ctx; /* Decoder context */ + asn_struct_ctx_t *ctx; /* Decoder context */ ber_tlv_tag_t tlv_tag; /* T from TLV */ ssize_t tag_len; /* Length of TLV's T */ - //ber_tlv_len_t tlv_len; /* L from TLV */ ber_dec_rval_t rval; /* Return code from subparsers */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ @@ -133,7 +132,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *td, /* * Restore parsing context. */ - ctx = (ber_dec_ctx_t *)((char *)st + specs->ctx_offset); + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); /* * Start to parse where left previously @@ -147,7 +146,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *td, */ if(tag_mode || td->tags_count) { - rval = ber_check_tags(td, ctx, ptr, size, + rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, tag_mode, -1, &ctx->left, 0); if(rval.code != RC_OK) { ASN_DEBUG("%s tagging check failed: %d", @@ -184,8 +183,8 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *td, } do { - asn1_TYPE_tag2member_t *t2m; - asn1_TYPE_tag2member_t key; + asn_TYPE_tag2member_t *t2m; + asn_TYPE_tag2member_t key; key.el_tag = tlv_tag; (void *)t2m = bsearch(&key, @@ -231,7 +230,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *td, * Read in the element. */ do { - asn1_TYPE_member_t *elm;/* CHOICE's element */ + asn_TYPE_member_t *elm;/* CHOICE's element */ void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ @@ -256,7 +255,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *td, /* * Invoke the member fetch routine according to member's type */ - rval = elm->type->ber_decoder(elm->type, + rval = elm->type->ber_decoder(opt_codec_ctx, elm->type, memb_ptr2, ptr, LEFT, elm->tag_mode); switch(rval.code) { @@ -353,12 +352,12 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -CHOICE_encode_der(asn1_TYPE_descriptor_t *td, +CHOICE_encode_der(asn_TYPE_descriptor_t *td, void *struct_ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)td->specifics; - asn1_TYPE_member_t *elm; /* CHOICE element */ + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elm; /* CHOICE element */ asn_enc_rval_t erval; void *memb_ptr; size_t computed_size = 0; @@ -453,8 +452,8 @@ CHOICE_encode_der(asn1_TYPE_descriptor_t *td, } ber_tlv_tag_t -CHOICE_outmost_tag(asn1_TYPE_descriptor_t *td, const void *ptr, int tag_mode, ber_tlv_tag_t tag) { - asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)td->specifics; +CHOICE_outmost_tag(asn_TYPE_descriptor_t *td, const void *ptr, int tag_mode, ber_tlv_tag_t tag) { + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; int present; assert(tag_mode == 0); @@ -466,7 +465,7 @@ CHOICE_outmost_tag(asn1_TYPE_descriptor_t *td, const void *ptr, int tag_mode, be present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size); if(present > 0 || present <= td->elements_count) { - asn1_TYPE_member_t *elm = &td->elements[present-1]; + asn_TYPE_member_t *elm = &td->elements[present-1]; const void *memb_ptr; if(elm->flags & ATF_POINTER) { @@ -477,7 +476,7 @@ CHOICE_outmost_tag(asn1_TYPE_descriptor_t *td, const void *ptr, int tag_mode, be ((const char *)ptr + elm->memb_offset); } - return asn1_TYPE_outmost_tag(elm->type, memb_ptr, + return asn_TYPE_outmost_tag(elm->type, memb_ptr, elm->tag_mode, elm->tag); } else { return (ber_tlv_tag_t)-1; @@ -485,9 +484,9 @@ CHOICE_outmost_tag(asn1_TYPE_descriptor_t *td, const void *ptr, int tag_mode, be } int -CHOICE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +CHOICE_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)td->specifics; + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; int present; if(!sptr) { @@ -502,7 +501,7 @@ CHOICE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, */ present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); if(present > 0 && present <= td->elements_count) { - asn1_TYPE_member_t *elm = &td->elements[present-1]; + asn_TYPE_member_t *elm = &td->elements[present-1]; const void *memb_ptr; if(elm->flags & ATF_POINTER) { @@ -541,10 +540,10 @@ CHOICE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, } asn_enc_rval_t -CHOICE_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, +CHOICE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_CHOICE_specifics_t *specs=(asn1_CHOICE_specifics_t *)td->specifics; + asn_CHOICE_specifics_t *specs=(asn_CHOICE_specifics_t *)td->specifics; asn_enc_rval_t er; int present; @@ -560,7 +559,7 @@ CHOICE_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, _ASN_ENCODE_FAILED; } else { asn_enc_rval_t tmper; - asn1_TYPE_member_t *elm = &td->elements[present-1]; + asn_TYPE_member_t *elm = &td->elements[present-1]; void *memb_ptr; const char *mname = elm->name; unsigned int mlen = strlen(mname); @@ -592,9 +591,9 @@ CHOICE_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, } int -CHOICE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, +CHOICE_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)td->specifics; + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; int present; if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; @@ -608,7 +607,7 @@ CHOICE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, * Print that element. */ if(present > 0 && present <= td->elements_count) { - asn1_TYPE_member_t *elm = &td->elements[present-1]; + asn_TYPE_member_t *elm = &td->elements[present-1]; const void *memb_ptr; if(elm->flags & ATF_POINTER) { @@ -633,8 +632,8 @@ CHOICE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, } void -CHOICE_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { - asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)td->specifics; +CHOICE_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; int present; if(!td || !ptr) @@ -651,7 +650,7 @@ CHOICE_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { * Free that element. */ if(present > 0 && present <= td->elements_count) { - asn1_TYPE_member_t *elm = &td->elements[present-1]; + asn_TYPE_member_t *elm = &td->elements[present-1]; void *memb_ptr; if(elm->flags & ATF_POINTER) { diff --git a/skeletons/constr_CHOICE.h b/skeletons/constr_CHOICE.h index 4e296413c..8cd323a2c 100644 --- a/skeletons/constr_CHOICE.h +++ b/skeletons/constr_CHOICE.h @@ -7,7 +7,7 @@ #include -typedef struct asn1_CHOICE_specifics_s { +typedef struct asn_CHOICE_specifics_s { /* * Target structure description. */ @@ -19,14 +19,14 @@ typedef struct asn1_CHOICE_specifics_s { /* * Tags to members mapping table. */ - asn1_TYPE_tag2member_t *tag2el; + asn_TYPE_tag2member_t *tag2el; int tag2el_count; /* * Extensions-related stuff. */ int extensible; /* Whether CHOICE is extensible */ -} asn1_CHOICE_specifics_t; +} asn_CHOICE_specifics_t; /* * A set specialized functions dealing with the CHOICE type. diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index b00ae6fa8..740ce570d 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -74,8 +74,8 @@ */ static int _t2e_cmp(const void *ap, const void *bp) { - const asn1_TYPE_tag2member_t *a = (const asn1_TYPE_tag2member_t *)ap; - const asn1_TYPE_tag2member_t *b = (const asn1_TYPE_tag2member_t *)bp; + const asn_TYPE_tag2member_t *a = (const asn_TYPE_tag2member_t *)ap; + const asn_TYPE_tag2member_t *b = (const asn_TYPE_tag2member_t *)bp; int a_class = BER_TAG_CLASS(a->el_tag); int b_class = BER_TAG_CLASS(b->el_tag); @@ -108,22 +108,21 @@ _t2e_cmp(const void *ap, const void *bp) { * The decoder of the SEQUENCE type. */ ber_dec_rval_t -SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, +SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, void *ptr, size_t size, int tag_mode) { /* * Bring closer parts of structure description. */ - asn1_SEQUENCE_specifics_t *specs = (asn1_SEQUENCE_specifics_t *)td->specifics; - asn1_TYPE_member_t *elements = td->elements; + asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics; + asn_TYPE_member_t *elements = td->elements; /* * Parts of the structure being constructed. */ void *st = *struct_ptr; /* Target structure. */ - ber_dec_ctx_t *ctx; /* Decoder context */ + asn_struct_ctx_t *ctx; /* Decoder context */ ber_tlv_tag_t tlv_tag; /* T from TLV */ - //ber_tlv_len_t tlv_len; /* L from TLV */ ber_dec_rval_t rval; /* Return code from subparsers */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ @@ -144,7 +143,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, /* * Restore parsing context. */ - ctx = (ber_dec_ctx_t *)((char *)st + specs->ctx_offset); + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); /* * Start to parse where left previously @@ -157,7 +156,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, * perfectly fits our expectations. */ - rval = ber_check_tags(td, ctx, ptr, size, + rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, tag_mode, 1, &ctx->left, 0); if(rval.code != RC_OK) { ASN_DEBUG("%s tagging check failed: %d", @@ -282,16 +281,16 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, * Resort to a binary search over * sorted array of tags. */ - asn1_TYPE_tag2member_t *t2m; - asn1_TYPE_tag2member_t key; + asn_TYPE_tag2member_t *t2m; + asn_TYPE_tag2member_t key; key.el_tag = tlv_tag; key.el_no = edx; (void *)t2m = bsearch(&key, specs->tag2el, specs->tag2el_count, sizeof(specs->tag2el[0]), _t2e_cmp); if(t2m) { - asn1_TYPE_tag2member_t *best = 0; - asn1_TYPE_tag2member_t *t2m_f, *t2m_l; + asn_TYPE_tag2member_t *best = 0; + asn_TYPE_tag2member_t *t2m_f, *t2m_l; int edx_max = edx + elements[edx].optional; /* * Rewind to the first element with that tag, @@ -397,7 +396,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, /* * Invoke the member fetch routine according to member's type */ - rval = elements[edx].type->ber_decoder( + rval = elements[edx].type->ber_decoder(opt_codec_ctx, elements[edx].type, memb_ptr2, ptr, LEFT, elements[edx].tag_mode); @@ -498,7 +497,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, * The DER encoder of the SEQUENCE type. */ asn_enc_rval_t -SEQUENCE_encode_der(asn1_TYPE_descriptor_t *td, +SEQUENCE_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { size_t computed_size = 0; @@ -513,7 +512,7 @@ SEQUENCE_encode_der(asn1_TYPE_descriptor_t *td, * Gather the length of the underlying members sequence. */ for(edx = 0; edx < td->elements_count; edx++) { - asn1_TYPE_member_t *elm = &td->elements[edx]; + asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)ptr + elm->memb_offset); @@ -550,7 +549,7 @@ SEQUENCE_encode_der(asn1_TYPE_descriptor_t *td, * Encode all members. */ for(edx = 0; edx < td->elements_count; edx++) { - asn1_TYPE_member_t *elm = &td->elements[edx]; + asn_TYPE_member_t *elm = &td->elements[edx]; asn_enc_rval_t tmperval; void *memb_ptr; @@ -583,7 +582,7 @@ SEQUENCE_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -SEQUENCE_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, +SEQUENCE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t er; @@ -597,7 +596,7 @@ SEQUENCE_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, for(edx = 0; edx < td->elements_count; edx++) { asn_enc_rval_t tmper; - asn1_TYPE_member_t *elm = &td->elements[edx]; + asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; const char *mname = elm->name; unsigned int mlen = strlen(mname); @@ -627,7 +626,7 @@ SEQUENCE_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, } int -SEQUENCE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, +SEQUENCE_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { int edx; int ret; @@ -640,7 +639,7 @@ SEQUENCE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, return -1; for(edx = 0; edx < td->elements_count; edx++) { - asn1_TYPE_member_t *elm = &td->elements[edx]; + asn_TYPE_member_t *elm = &td->elements[edx]; const void *memb_ptr; if(elm->flags & ATF_POINTER) { @@ -671,7 +670,7 @@ SEQUENCE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, } void -SEQUENCE_free(asn1_TYPE_descriptor_t *td, void *sptr, int contents_only) { +SEQUENCE_free(asn_TYPE_descriptor_t *td, void *sptr, int contents_only) { int edx; if(!td || !sptr) @@ -680,7 +679,7 @@ SEQUENCE_free(asn1_TYPE_descriptor_t *td, void *sptr, int contents_only) { ASN_DEBUG("Freeing %s as SEQUENCE", td->name); for(edx = 0; edx < td->elements_count; edx++) { - asn1_TYPE_member_t *elm = &td->elements[edx]; + asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)sptr + elm->memb_offset); @@ -698,7 +697,7 @@ SEQUENCE_free(asn1_TYPE_descriptor_t *td, void *sptr, int contents_only) { } int -SEQUENCE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +SEQUENCE_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { int edx; @@ -713,7 +712,7 @@ SEQUENCE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * Iterate over structure members and check their validity. */ for(edx = 0; edx < td->elements_count; edx++) { - asn1_TYPE_member_t *elm = &td->elements[edx]; + asn_TYPE_member_t *elm = &td->elements[edx]; const void *memb_ptr; if(elm->flags & ATF_POINTER) { diff --git a/skeletons/constr_SEQUENCE.h b/skeletons/constr_SEQUENCE.h index 27903b13a..0b3607915 100644 --- a/skeletons/constr_SEQUENCE.h +++ b/skeletons/constr_SEQUENCE.h @@ -7,17 +7,17 @@ #include -typedef struct asn1_SEQUENCE_specifics_s { +typedef struct asn_SEQUENCE_specifics_s { /* * Target structure description. */ int struct_size; /* Size of the target structure. */ - int ctx_offset; /* Offset of the ber_dec_ctx_t member */ + int ctx_offset; /* Offset of the asn_struct_ctx_t member */ /* * Tags to members mapping table (sorted). */ - asn1_TYPE_tag2member_t *tag2el; + asn_TYPE_tag2member_t *tag2el; int tag2el_count; /* @@ -25,7 +25,7 @@ typedef struct asn1_SEQUENCE_specifics_s { */ int ext_after; /* Extensions start after this member */ int ext_before; /* Extensions stop before this member */ -} asn1_SEQUENCE_specifics_t; +} asn_SEQUENCE_specifics_t; /* diff --git a/skeletons/constr_SEQUENCE_OF.c b/skeletons/constr_SEQUENCE_OF.c index be2ed60bb..b99831f94 100644 --- a/skeletons/constr_SEQUENCE_OF.c +++ b/skeletons/constr_SEQUENCE_OF.c @@ -10,10 +10,10 @@ * The DER encoder of the SEQUENCE OF type. */ asn_enc_rval_t -SEQUENCE_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, +SEQUENCE_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_TYPE_member_t *elm = td->elements; + asn_TYPE_member_t *elm = td->elements; A_SEQUENCE_OF(void) *list; size_t computed_size = 0; ssize_t encoding_size = 0; @@ -84,12 +84,12 @@ SEQUENCE_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, } asn_enc_rval_t -SEQUENCE_OF_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, +SEQUENCE_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t er; - asn1_SET_OF_specifics_t *specs = (asn1_SET_OF_specifics_t *)td->specifics; - asn1_TYPE_member_t *element = td->elements; + asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; + asn_TYPE_member_t *element = td->elements; A_SEQUENCE_OF(void) *list; const char *mname = specs->as_XMLValueList ? 0 : ((*element->name) ? element->name : element->type->name); diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index 6a604e437..647bb83a2 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -70,8 +70,8 @@ */ static int _t2e_cmp(const void *ap, const void *bp) { - const asn1_TYPE_tag2member_t *a = (const asn1_TYPE_tag2member_t *)ap; - const asn1_TYPE_tag2member_t *b = (const asn1_TYPE_tag2member_t *)bp; + const asn_TYPE_tag2member_t *a = (const asn_TYPE_tag2member_t *)ap; + const asn_TYPE_tag2member_t *b = (const asn_TYPE_tag2member_t *)bp; int a_class = BER_TAG_CLASS(a->el_tag); int b_class = BER_TAG_CLASS(b->el_tag); @@ -97,22 +97,21 @@ _t2e_cmp(const void *ap, const void *bp) { * The decoder of the SET type. */ ber_dec_rval_t -SET_decode_ber(asn1_TYPE_descriptor_t *td, +SET_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, void *ptr, size_t size, int tag_mode) { /* * Bring closer parts of structure description. */ - asn1_SET_specifics_t *specs = (asn1_SET_specifics_t *)td->specifics; - asn1_TYPE_member_t *elements = td->elements; + asn_SET_specifics_t *specs = (asn_SET_specifics_t *)td->specifics; + asn_TYPE_member_t *elements = td->elements; /* * Parts of the structure being constructed. */ void *st = *struct_ptr; /* Target structure. */ - ber_dec_ctx_t *ctx; /* Decoder context */ + asn_struct_ctx_t *ctx; /* Decoder context */ ber_tlv_tag_t tlv_tag; /* T from TLV */ - //ber_tlv_len_t tlv_len; /* L from TLV */ ber_dec_rval_t rval; /* Return code from subparsers */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ @@ -133,7 +132,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *td, /* * Restore parsing context. */ - ctx = (ber_dec_ctx_t *)((char *)st + specs->ctx_offset); + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); /* * Start to parse where left previously @@ -146,7 +145,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *td, * perfectly fits our expectations. */ - rval = ber_check_tags(td, ctx, ptr, size, + rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, tag_mode, 1, &ctx->left, 0); if(rval.code != RC_OK) { ASN_DEBUG("%s tagging check failed: %d", @@ -235,8 +234,8 @@ SET_decode_ber(asn1_TYPE_descriptor_t *td, * but is not strongly anticipated either. */ } else { - asn1_TYPE_tag2member_t *t2m; - asn1_TYPE_tag2member_t key; + asn_TYPE_tag2member_t *t2m; + asn_TYPE_tag2member_t key; key.el_tag = tlv_tag; (void *)t2m = bsearch(&key, @@ -312,7 +311,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *td, /* * Invoke the member fetch routine according to member's type */ - rval = elements[edx].type->ber_decoder( + rval = elements[edx].type->ber_decoder(opt_codec_ctx, elements[edx].type, memb_ptr2, ptr, LEFT, elements[edx].tag_mode); @@ -435,14 +434,14 @@ SET_decode_ber(asn1_TYPE_descriptor_t *td, * The DER encoder of the SET type. */ asn_enc_rval_t -SET_encode_der(asn1_TYPE_descriptor_t *td, +SET_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_SET_specifics_t *specs = (asn1_SET_specifics_t *)td->specifics; + asn_SET_specifics_t *specs = (asn_SET_specifics_t *)td->specifics; size_t computed_size = 0; asn_enc_rval_t my_erval; int t2m_build_own = (specs->tag2el_count != td->elements_count); - asn1_TYPE_tag2member_t *t2m; + asn_TYPE_tag2member_t *t2m; int t2m_count; ssize_t ret; int edx; @@ -472,7 +471,7 @@ SET_encode_der(asn1_TYPE_descriptor_t *td, * Gather the length of the underlying members sequence. */ for(edx = 0; edx < td->elements_count; edx++) { - asn1_TYPE_member_t *elm = &td->elements[edx]; + asn_TYPE_member_t *elm = &td->elements[edx]; asn_enc_rval_t erval; void *memb_ptr; @@ -504,7 +503,7 @@ SET_encode_der(asn1_TYPE_descriptor_t *td, */ if(t2m_build_own) { t2m[t2m_count].el_no = edx; - t2m[t2m_count].el_tag = asn1_TYPE_outmost_tag( + t2m[t2m_count].el_tag = asn_TYPE_outmost_tag( elm->type, memb_ptr, elm->tag_mode, elm->tag); t2m_count++; } else { @@ -548,7 +547,7 @@ SET_encode_der(asn1_TYPE_descriptor_t *td, * Encode all members. */ for(edx = 0; edx < td->elements_count; edx++) { - asn1_TYPE_member_t *elm; + asn_TYPE_member_t *elm; asn_enc_rval_t erval; void *memb_ptr; @@ -582,7 +581,7 @@ SET_encode_der(asn1_TYPE_descriptor_t *td, } asn_enc_rval_t -SET_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, +SET_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t er; @@ -596,7 +595,7 @@ SET_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, for(edx = 0; edx < td->elements_count; edx++) { asn_enc_rval_t tmper; - asn1_TYPE_member_t *elm = &td->elements[edx]; + asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; const char *mname = elm->name; unsigned int mlen = strlen(elm->name); @@ -628,7 +627,7 @@ SET_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, } int -SET_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, +SET_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { int edx; int ret; @@ -641,7 +640,7 @@ SET_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, return -1; for(edx = 0; edx < td->elements_count; edx++) { - asn1_TYPE_member_t *elm = &td->elements[edx]; + asn_TYPE_member_t *elm = &td->elements[edx]; const void *memb_ptr; if(elm->flags & ATF_POINTER) { @@ -671,7 +670,7 @@ SET_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, } void -SET_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { +SET_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { int edx; if(!td || !ptr) @@ -680,7 +679,7 @@ SET_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { ASN_DEBUG("Freeing %s as SET", td->name); for(edx = 0; edx < td->elements_count; edx++) { - asn1_TYPE_member_t *elm = &td->elements[edx]; + asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)ptr + elm->memb_offset); @@ -698,7 +697,7 @@ SET_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { } int -SET_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +SET_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { int edx; @@ -713,7 +712,7 @@ SET_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, * Iterate over structure members and check their validity. */ for(edx = 0; edx < td->elements_count; edx++) { - asn1_TYPE_member_t *elm = &td->elements[edx]; + asn_TYPE_member_t *elm = &td->elements[edx]; const void *memb_ptr; if(elm->flags & ATF_POINTER) { diff --git a/skeletons/constr_SET.h b/skeletons/constr_SET.h index 17fb61325..8f9b265cb 100644 --- a/skeletons/constr_SET.h +++ b/skeletons/constr_SET.h @@ -8,18 +8,18 @@ #include -typedef struct asn1_SET_specifics_s { +typedef struct asn_SET_specifics_s { /* * Target structure description. */ int struct_size; /* Size of the target structure. */ - int ctx_offset; /* Offset of the ber_dec_ctx_t member */ + int ctx_offset; /* Offset of the asn_struct_ctx_t member */ int pres_offset; /* Offset of _presence_map member */ /* * Tags to members mapping table (sorted). */ - asn1_TYPE_tag2member_t *tag2el; + asn_TYPE_tag2member_t *tag2el; int tag2el_count; /* @@ -27,7 +27,7 @@ typedef struct asn1_SET_specifics_s { */ int extensible; /* Whether SET is extensible */ unsigned int *_mandatory_elements; /* Bitmask of mandatory ones */ -} asn1_SET_specifics_t; +} asn_SET_specifics_t; /* * A set specialized functions dealing with the SET type. diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index 2050d1a5e..00c4cb3dd 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -65,22 +65,21 @@ * The decoder of the SET OF type. */ ber_dec_rval_t -SET_OF_decode_ber(asn1_TYPE_descriptor_t *td, +SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, void *ptr, size_t size, int tag_mode) { /* * Bring closer parts of structure description. */ - asn1_SET_OF_specifics_t *specs = (asn1_SET_OF_specifics_t *)td->specifics; - asn1_TYPE_member_t *element = td->elements; /* Single one */ + asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; + asn_TYPE_member_t *element = td->elements; /* Single one */ /* * Parts of the structure being constructed. */ void *st = *struct_ptr; /* Target structure. */ - ber_dec_ctx_t *ctx; /* Decoder context */ + asn_struct_ctx_t *ctx; /* Decoder context */ ber_tlv_tag_t tlv_tag; /* T from TLV */ - //ber_tlv_len_t tlv_len; /* L from TLV */ ber_dec_rval_t rval; /* Return code from subparsers */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ @@ -100,7 +99,7 @@ SET_OF_decode_ber(asn1_TYPE_descriptor_t *td, /* * Restore parsing context. */ - ctx = (ber_dec_ctx_t *)((char *)st + specs->ctx_offset); + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); /* * Start to parse where left previously @@ -113,7 +112,7 @@ SET_OF_decode_ber(asn1_TYPE_descriptor_t *td, * perfectly fits our expectations. */ - rval = ber_check_tags(td, ctx, ptr, size, + rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, tag_mode, 1, &ctx->left, 0); if(rval.code != RC_OK) { ASN_DEBUG("%s tagging check failed: %d", @@ -206,8 +205,8 @@ SET_OF_decode_ber(asn1_TYPE_descriptor_t *td, /* * Invoke the member fetch routine according to member's type */ - rval = element->type->ber_decoder(element->type, - &ctx->ptr, ptr, LEFT, 0); + rval = element->type->ber_decoder(opt_codec_ctx, + element->type, &ctx->ptr, ptr, LEFT, 0); ASN_DEBUG("In %s SET OF %s code %d consumed %d", td->name, element->type->name, rval.code, (int)rval.consumed); @@ -310,11 +309,11 @@ static int _el_buf_cmp(const void *ap, const void *bp) { * The DER encoder of the SET OF type. */ asn_enc_rval_t -SET_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, +SET_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_TYPE_member_t *elm = td->elements; - asn1_TYPE_descriptor_t *elm_type = elm->type; + asn_TYPE_member_t *elm = td->elements; + asn_TYPE_descriptor_t *elm_type = elm->type; der_type_encoder_f *der_encoder = elm_type->der_encoder; A_SET_OF(void) *list; size_t computed_size = 0; @@ -451,12 +450,12 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, } asn_enc_rval_t -SET_OF_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, +SET_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t er; - asn1_SET_OF_specifics_t *specs=(asn1_SET_OF_specifics_t *)td->specifics; - asn1_TYPE_member_t *element = td->elements; + asn_SET_OF_specifics_t *specs=(asn_SET_OF_specifics_t *)td->specifics; + asn_TYPE_member_t *element = td->elements; A_SET_OF(void) *list; const char *mname = specs->as_XMLValueList ? 0 : ((*element->name) ? element->name : element->type->name); @@ -498,9 +497,9 @@ SET_OF_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr, } int -SET_OF_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, +SET_OF_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { - asn1_TYPE_member_t *element = td->elements; + asn_TYPE_member_t *element = td->elements; const A_SET_OF(void) *list; int ret; int i; @@ -531,9 +530,9 @@ SET_OF_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel, } void -SET_OF_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { +SET_OF_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { if(td && ptr) { - asn1_TYPE_member_t *element = td->elements; + asn_TYPE_member_t *element = td->elements; A_SET_OF(void) *list; int i; @@ -558,9 +557,9 @@ SET_OF_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) { } int -SET_OF_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, +SET_OF_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - asn1_TYPE_member_t *element = td->elements; + asn_TYPE_member_t *element = td->elements; asn_constr_check_f *constr; const A_SET_OF(void) *list; int i; diff --git a/skeletons/constr_SET_OF.h b/skeletons/constr_SET_OF.h index b013dd6f1..72de815e1 100644 --- a/skeletons/constr_SET_OF.h +++ b/skeletons/constr_SET_OF.h @@ -7,16 +7,16 @@ #include -typedef struct asn1_SET_OF_specifics_s { +typedef struct asn_SET_OF_specifics_s { /* * Target structure description. */ int struct_size; /* Size of the target structure. */ - int ctx_offset; /* Offset of the ber_dec_ctx_t member */ + int ctx_offset; /* Offset of the asn_struct_ctx_t member */ /* XER-specific stuff */ int as_XMLValueList; /* The member type must be encoded like this */ -} asn1_SET_OF_specifics_t; +} asn_SET_OF_specifics_t; /* * A set specialized functions dealing with the SET OF type. diff --git a/skeletons/constr_TYPE.c b/skeletons/constr_TYPE.c index c0e966af8..4bc88d44f 100644 --- a/skeletons/constr_TYPE.c +++ b/skeletons/constr_TYPE.c @@ -17,7 +17,7 @@ static asn_app_consume_bytes_f _print2fp; * Return the outmost tag of the type. */ ber_tlv_tag_t -asn1_TYPE_outmost_tag(asn1_TYPE_descriptor_t *type_descriptor, +asn_TYPE_outmost_tag(asn_TYPE_descriptor_t *type_descriptor, const void *struct_ptr, int tag_mode, ber_tlv_tag_t tag) { if(tag_mode) @@ -33,7 +33,7 @@ asn1_TYPE_outmost_tag(asn1_TYPE_descriptor_t *type_descriptor, * Print the target language's structure in human readable form. */ int -asn_fprint(FILE *stream, asn1_TYPE_descriptor_t *td, const void *struct_ptr) { +asn_fprint(FILE *stream, asn_TYPE_descriptor_t *td, const void *struct_ptr) { if(!stream) stream = stdout; if(!td || !struct_ptr) { errno = EINVAL; diff --git a/skeletons/constraints.c b/skeletons/constraints.c index 9b6054517..e38435285 100644 --- a/skeletons/constraints.c +++ b/skeletons/constraints.c @@ -2,7 +2,7 @@ #include int -asn_generic_no_constraint(asn1_TYPE_descriptor_t *type_descriptor, +asn_generic_no_constraint(asn_TYPE_descriptor_t *type_descriptor, const void *struct_ptr, asn_app_consume_bytes_f *cb, void *key) { (void)type_descriptor; /* Unused argument */ @@ -15,7 +15,7 @@ asn_generic_no_constraint(asn1_TYPE_descriptor_t *type_descriptor, } int -asn_generic_unknown_constraint(asn1_TYPE_descriptor_t *type_descriptor, +asn_generic_unknown_constraint(asn_TYPE_descriptor_t *type_descriptor, const void *struct_ptr, asn_app_consume_bytes_f *cb, void *key) { (void)type_descriptor; /* Unused argument */ @@ -54,7 +54,7 @@ __fill_errbuf(const void *buffer, size_t size, void *app_key) { } int -asn_check_constraints(asn1_TYPE_descriptor_t *type_descriptor, +asn_check_constraints(asn_TYPE_descriptor_t *type_descriptor, const void *struct_ptr, char *errbuf, size_t *errlen) { if(errlen) { diff --git a/skeletons/constraints.h b/skeletons/constraints.h index fe693aee0..07eb8362e 100644 --- a/skeletons/constraints.h +++ b/skeletons/constraints.h @@ -7,7 +7,7 @@ #include /* System-dependent types */ -struct asn1_TYPE_descriptor_s; /* Forward declaration */ +struct asn_TYPE_descriptor_s; /* Forward declaration */ /* * Validate the structure according to the ASN.1 constraints. @@ -18,7 +18,7 @@ struct asn1_TYPE_descriptor_s; /* Forward declaration */ * to encode an error message (properly 0-terminated). */ int -asn_check_constraints(struct asn1_TYPE_descriptor_s *type_descriptor, +asn_check_constraints(struct asn_TYPE_descriptor_s *type_descriptor, const void *struct_ptr, /* Target language's structure */ char *errbuf, /* Returned error description */ size_t *errlen /* Length of the error description */ @@ -29,7 +29,7 @@ asn_check_constraints(struct asn1_TYPE_descriptor_s *type_descriptor, * associated with every type descriptor. */ typedef int (asn_constr_check_f)( - struct asn1_TYPE_descriptor_s *type_descriptor, + struct asn_TYPE_descriptor_s *type_descriptor, const void *struct_ptr, asn_app_consume_bytes_f *optional_app_errlog, /* Log the error */ void *optional_app_key /* Opaque key passed to app_errlog */ diff --git a/skeletons/der_encoder.c b/skeletons/der_encoder.c index 9ac0afb58..3523cb12e 100644 --- a/skeletons/der_encoder.c +++ b/skeletons/der_encoder.c @@ -13,7 +13,7 @@ static ssize_t der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len, * The DER encoder of any type. */ asn_enc_rval_t -der_encode(asn1_TYPE_descriptor_t *type_descriptor, void *struct_ptr, +der_encode(asn_TYPE_descriptor_t *type_descriptor, void *struct_ptr, asn_app_consume_bytes_f *consume_bytes, void *app_key) { ASN_DEBUG("DER encoder invoked for %s", @@ -32,7 +32,7 @@ der_encode(asn1_TYPE_descriptor_t *type_descriptor, void *struct_ptr, * Write out leading TL[v] sequence according to the type definition. */ ssize_t -der_write_tags(asn1_TYPE_descriptor_t *sd, +der_write_tags(asn_TYPE_descriptor_t *sd, size_t struct_length, int tag_mode, int last_tag_form, ber_tlv_tag_t tag, /* EXPLICIT or IMPLICIT tag */ diff --git a/skeletons/der_encoder.h b/skeletons/der_encoder.h index 5a296130f..62aafa7af 100644 --- a/skeletons/der_encoder.h +++ b/skeletons/der_encoder.h @@ -7,12 +7,12 @@ #include -struct asn1_TYPE_descriptor_s; /* Forward declaration */ +struct asn_TYPE_descriptor_s; /* Forward declaration */ /* * The DER encoder of any type. May be invoked by the application. */ -asn_enc_rval_t der_encode(struct asn1_TYPE_descriptor_s *type_descriptor, +asn_enc_rval_t der_encode(struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ asn_app_consume_bytes_f *consume_bytes_cb, void *app_key /* Arbitrary callback argument */ @@ -22,7 +22,7 @@ asn_enc_rval_t der_encode(struct asn1_TYPE_descriptor_s *type_descriptor, * Type of the generic DER encoder. */ typedef asn_enc_rval_t (der_type_encoder_f)( - struct asn1_TYPE_descriptor_s *type_descriptor, + struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ ber_tlv_tag_t tag, @@ -39,7 +39,7 @@ typedef asn_enc_rval_t (der_type_encoder_f)( * Write out leading TL[v] sequence according to the type definition. */ ssize_t der_write_tags( - struct asn1_TYPE_descriptor_s *type_descriptor, + struct asn_TYPE_descriptor_s *type_descriptor, size_t struct_length, int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ int last_tag_form, /* {0,!0}: prim, constructed */ diff --git a/skeletons/tests/check-GeneralizedTime.c b/skeletons/tests/check-GeneralizedTime.c index 40008f0be..6c35a1c22 100644 --- a/skeletons/tests/check-GeneralizedTime.c +++ b/skeletons/tests/check-GeneralizedTime.c @@ -98,7 +98,7 @@ main(int ac, char **av) { */ asn_enc_rval_t -OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { +OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t erval; (void)td; @@ -112,7 +112,7 @@ OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber } asn_enc_rval_t -OCTET_STRING_encode_xer_ascii(asn1_TYPE_descriptor_t *td, void *ptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { +OCTET_STRING_encode_xer_ascii(asn_TYPE_descriptor_t *td, void *ptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t erval; (void)td; diff --git a/skeletons/tests/check-INTEGER.c b/skeletons/tests/check-INTEGER.c index 03efc0507..85e9b1116 100644 --- a/skeletons/tests/check-INTEGER.c +++ b/skeletons/tests/check-INTEGER.c @@ -38,14 +38,14 @@ check(uint8_t *buf, int size, long check_long, int check_ret) { } printf("]: "); - ret = asn1_INTEGER2long(&val, &rlong); + ret = asn_INTEGER2long(&val, &rlong); printf(" (%ld, %d) vs (%ld, %d)\n", rlong, ret, check_long, check_ret); assert(ret == check_ret); assert(rlong == check_long); shared_scratch_start = scratch; - ret = INTEGER_print(&asn1_DEF_INTEGER, &val, 0, _print2buf, scratch); + ret = INTEGER_print(&asn_DEF_INTEGER, &val, 0, _print2buf, scratch); assert(shared_scratch_start < scratch + sizeof(scratch)); assert(ret == 0); ret = snprintf(verify, sizeof(verify), "%ld", check_long); diff --git a/skeletons/tests/check-OIDs.c b/skeletons/tests/check-OIDs.c index e435c01ff..0cd4d1406 100644 --- a/skeletons/tests/check-OIDs.c +++ b/skeletons/tests/check-OIDs.c @@ -31,7 +31,7 @@ check_OID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { printf("}\n"); oid = NULL; - rval = ber_decode(&asn1_DEF_OBJECT_IDENTIFIER, (void *)&oid, buf, len); + rval = ber_decode(0, &asn_DEF_OBJECT_IDENTIFIER, (void *)&oid, buf, len); assert(rval.code == RC_OK); assert(oid->size == (ssize_t)len - 2); @@ -40,7 +40,7 @@ check_OID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { * Print the contents for visual debugging. */ printf("OBJECT_IDENTIFIER_print() => "); - OBJECT_IDENTIFIER_print(&asn1_DEF_OBJECT_IDENTIFIER, oid, 0, _print, 0); + OBJECT_IDENTIFIER_print(&asn_DEF_OBJECT_IDENTIFIER, oid, 0, _print, 0); printf("\n"); memset(arcs, 'A', sizeof(arcs)); @@ -78,7 +78,7 @@ check_ROID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { printf("}\n"); oid = NULL; - rval = ber_decode(&asn1_DEF_RELATIVE_OID, (void *)&oid, buf, len); + rval = ber_decode(0, &asn_DEF_RELATIVE_OID, (void *)&oid, buf, len); assert(rval.code == RC_OK); assert(oid->size == (ssize_t)len - 2); @@ -87,7 +87,7 @@ check_ROID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { * Print the contents for visual debugging. */ printf("RELATIVE_OID_print() => "); - RELATIVE_OID_print(&asn1_DEF_RELATIVE_OID, oid, 0, _print, 0); + RELATIVE_OID_print(&asn_DEF_RELATIVE_OID, oid, 0, _print, 0); printf("\n"); memset(arcs, 'A', sizeof(arcs)); diff --git a/skeletons/tests/check-REAL.c b/skeletons/tests/check-REAL.c index 89ab3260e..33f69182a 100644 --- a/skeletons/tests/check-REAL.c +++ b/skeletons/tests/check-REAL.c @@ -69,7 +69,7 @@ check(REAL_t *rn, double orig_dbl, const char *sample, const char *canonical_sam printf("%02x", *p); printf("]\n"); - ret = asn1_double2REAL(rn, orig_dbl); + ret = asn_double2REAL(rn, orig_dbl); assert(ret == 0); printf("converted into ["); @@ -77,7 +77,7 @@ check(REAL_t *rn, double orig_dbl, const char *sample, const char *canonical_sam printf("%02x", *p); printf("]: %d\n", rn->size); - ret = asn1_REAL2double(rn, &val); + ret = asn_REAL2double(rn, &val); assert(ret == 0); printf("and back to double: ["); @@ -114,7 +114,7 @@ check_buf(uint8_t *buf, size_t bufsize, double verify, const char *sample, const rn.buf = 0; rn.size = 0; - ret = asn1_double2REAL(&rn, verify); + ret = asn_double2REAL(&rn, verify); assert(ret == 0); printf("canonical DER: ["); @@ -130,7 +130,7 @@ check_buf(uint8_t *buf, size_t bufsize, double verify, const char *sample, const printf("%02x", *p); printf("]\n"); - ret = asn1_REAL2double(&rn, &val); + ret = asn_REAL2double(&rn, &val); assert(ret == 0); printf("%.12f vs %.12f\n", verify, val); diff --git a/skeletons/tests/check-UTCTime.c b/skeletons/tests/check-UTCTime.c index b8ad57b3a..d62635933 100644 --- a/skeletons/tests/check-UTCTime.c +++ b/skeletons/tests/check-UTCTime.c @@ -65,7 +65,7 @@ main(int ac, char **av) { */ asn_enc_rval_t -OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { +OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t erval; (void)td; @@ -79,7 +79,7 @@ OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber } asn_enc_rval_t -OCTET_STRING_encode_xer_ascii(asn1_TYPE_descriptor_t *td, void *ptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { +OCTET_STRING_encode_xer_ascii(asn_TYPE_descriptor_t *td, void *ptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t erval; (void)td; diff --git a/skeletons/xer_encoder.c b/skeletons/xer_encoder.c index 876980e17..3c97a8f7b 100644 --- a/skeletons/xer_encoder.c +++ b/skeletons/xer_encoder.c @@ -11,7 +11,7 @@ * The XER encoder of any type. May be invoked by the application. */ asn_enc_rval_t -xer_encode(asn1_TYPE_descriptor_t *td, void *sptr, +xer_encode(asn_TYPE_descriptor_t *td, void *sptr, enum xer_encoder_flags_e xer_flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t er, tmper; @@ -56,7 +56,7 @@ xer__print2fp(const void *buffer, size_t size, void *app_key) { } int -xer_fprint(FILE *stream, asn1_TYPE_descriptor_t *td, void *sptr) { +xer_fprint(FILE *stream, asn_TYPE_descriptor_t *td, void *sptr) { asn_enc_rval_t er; if(!stream) stream = stdout; diff --git a/skeletons/xer_encoder.h b/skeletons/xer_encoder.h index 8a619ca83..5f9bbf2cb 100644 --- a/skeletons/xer_encoder.h +++ b/skeletons/xer_encoder.h @@ -7,7 +7,7 @@ #include -struct asn1_TYPE_descriptor_s; /* Forward declaration */ +struct asn_TYPE_descriptor_s; /* Forward declaration */ /* Flags used by the xer_encode() and (*xer_type_encoder_f), defined below */ enum xer_encoder_flags_e { @@ -19,7 +19,7 @@ enum xer_encoder_flags_e { /* * The XER encoder of any type. May be invoked by the application. */ -asn_enc_rval_t xer_encode(struct asn1_TYPE_descriptor_s *type_descriptor, +asn_enc_rval_t xer_encode(struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ enum xer_encoder_flags_e xer_flags, asn_app_consume_bytes_f *consume_bytes_cb, @@ -34,13 +34,13 @@ asn_enc_rval_t xer_encode(struct asn1_TYPE_descriptor_s *type_descriptor, * -1: Problem printing the structure. * WARNING: No sensible errno value is returned. */ -int xer_fprint(FILE *stream, struct asn1_TYPE_descriptor_s *td, void *sptr); +int xer_fprint(FILE *stream, struct asn_TYPE_descriptor_s *td, void *sptr); /* * Type of the generic XER encoder. */ typedef asn_enc_rval_t (xer_type_encoder_f)( - struct asn1_TYPE_descriptor_s *type_descriptor, + struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ int ilevel, /* Level of indentation */ enum xer_encoder_flags_e xer_flags, From ba56d85ad59da43049843a5d33bcd05399037786 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 13:29:17 +0000 Subject: [PATCH 0447/1469] asn1_* renamed into asn_*; also added an argument to ber_decode[r] routines git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@447 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-usage.lyx | 60 ++++++++++++++++++++++++-------------------- doc/asn1c-usage.pdf | Bin 71318 -> 71477 bytes 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/doc/asn1c-usage.lyx b/doc/asn1c-usage.lyx index b14674418..865d08b59 100644 --- a/doc/asn1c-usage.lyx +++ b/doc/asn1c-usage.lyx @@ -283,7 +283,7 @@ SimpleInteger ::= INTEGER -- An integer with a very limited range \layout LyX-Code -SmallInt ::= INTEGER (0..127) +SmallPositiveInt ::= INTEGER (0..127) \layout LyX-Code @@ -512,7 +512,11 @@ The character string with the following alphabet: space, \begin_inset Quotes sld \end_inset + +\series bold , +\series default + \begin_inset Quotes srd \end_inset @@ -636,14 +640,14 @@ z \begin_inset Quotes srd \end_inset -) +). \layout Subsection The VisibleString type \layout Standard The character string with the alphabet which is more or less a subset of - ASCII between space and + ASCII between the space and the \begin_inset Quotes sld \end_inset @@ -655,8 +659,10 @@ The character string with the alphabet which is more or less a subset of \begin_inset Quotes srd \end_inset - (tilde). - Alternatively, the alphabet may be described as the PrintableString alphabet + symbol (tilde). +\layout Standard + +Alternatively, the alphabet may be described as the PrintableString alphabet presented earlier, plus the following characters: \begin_inset Quotes sld \end_inset @@ -1586,10 +1592,10 @@ Description \layout Standard -Normally the compiler hides the definitions (asn1_DEF_xxx) of the inner - structure elements (members of SEQUENCE, SET and other types). +Normally the compiler hides the definitions (asn_DEF_xxx) of the inner structure + elements (members of SEQUENCE, SET and other types). This option makes all such definitions global. - Enabling this option may pollute the namespace by making lots of asn1_DEF_xxx + Enabling this option may pollute the namespace by making lots of asn_DEF_xxx structures globally visible, but will allow you to manipulate (encode and decode) the individual members of any complex ASN.1 structure. \end_inset @@ -1894,7 +1900,7 @@ Rectangle_t *rect = ...; \layout LyX-Code -asn1_DEF_Rectangle->free_struct(&asn1_DEF_Rectangle, +asn_DEF_Rectangle->free_struct(&asn_DEF_Rectangle, \layout LyX-Code rect, 0); @@ -1909,7 +1915,7 @@ rect for this Rectangle_t structure. The \emph on -asn1_DEF_Rectangle +asn_DEF_Rectangle \emph default is the type descriptor, which holds a collection of generic routines to deal with the Rectangle_t structure. @@ -2008,7 +2014,7 @@ ly valid and constrained to appropriate implicit or explicit subtype constraints Each of the above function takes the type descriptor ( \emph on -asn1_DEF_\SpecialChar \ldots{} +asn_DEF_\SpecialChar \ldots{} \emph default ) and the target structure ( @@ -2038,10 +2044,10 @@ simple_deserializer(const void *buffer, size_t buf_size) { \layout LyX-Code - rval = asn1_DEF_Rectangle->ber_decoder( + rval = asn_DEF_Rectangle->ber_decoder(0, \layout LyX-Code - &asn1_DEF_Rectangle, + &asn_DEF_Rectangle, \layout LyX-Code (void **)&rect, @@ -2072,10 +2078,10 @@ simple_deserializer(const void *buffer, size_t buf_size) { /* Free partially decoded rect */ \layout LyX-Code - asn1_DEF_Rectangle->free_struct( + asn_DEF_Rectangle->free_struct( \layout LyX-Code - &asn1_DEF_Rectangle, rect, 0); + &asn_DEF_Rectangle, rect, 0); \layout LyX-Code return 0; @@ -2188,13 +2194,13 @@ ber_decode less wordy notation: \layout LyX-Code -rval = ber_decode(&asn1_DEF_Rectangle, (void **)&rect, +rval = ber_decode(0, &asn_DEF_Rectangle, (void **)&rect, \layout LyX-Code buffer, buf_size); \layout Standard -Note that the initial (asn1_DEF_Rectangle->ber_decoder) reference is gone, +Note that the initial (asn_DEF_Rectangle->ber_decoder) reference is gone, and also the last argument (0) is no longer necessary. \layout Standard @@ -2205,7 +2211,7 @@ The BER de \emph on coder \emph default - may fail because ( + may fail because of ( \emph on the following RC_\SpecialChar \ldots{} codes are defined in ber_decoder.h @@ -2262,7 +2268,7 @@ canonical \layout Standard As with BER decoder, the DER encoder may be invoked either directly from - the ASN.1 type descriptor (asn1_DEF_Rectangle) or from the stand-alone function, + the ASN.1 type descriptor (asn_DEF_Rectangle) or from the stand-alone function, which is somewhat simpler: \layout LyX-Code @@ -2335,7 +2341,7 @@ simple_serializer(FILE *ostream, Rectangle_t *rect) { \layout LyX-Code - er = der_encode(&asn1_DEF_Rect, rect, + er = der_encode(&asn_DEF_Rect, rect, \layout LyX-Code write_stream, ostream); @@ -2495,7 +2501,7 @@ print_as_XML(FILE *ostream, Rectangle_t *rect) { \layout LyX-Code - er = xer_encode(&asn1_DEF_Rect, rect, + er = xer_encode(&asn_DEF_Rect, rect, \layout LyX-Code XER_F_BASIC, /* BASIC-XER or CANONICAL-XER */ @@ -2570,7 +2576,7 @@ There are two ways to print the target structure: either invoke the print_struct which is a simpler wrapper of the former: \layout LyX-Code -asn_fprint(stdout, &asn1_DEF_Rectangle, rect); +asn_fprint(stdout, &asn_DEF_Rectangle, rect); \layout Standard Please look into constr_TYPE.h for the precise definition of asn_fprint() @@ -2585,7 +2591,7 @@ Another practical alternative to this custom format printing would be to xer_fprint() call: \layout LyX-Code -xer_fprint(stdout, &asn1_DEF_Rectangle, rect); +xer_fprint(stdout, &asn_DEF_Rectangle, rect); \layout Standard See Section @@ -2669,10 +2675,10 @@ struct my_figure *mf = */ \layout LyX-Code -asn1_DEF_Rectangle->free_struct( +asn_DEF_Rectangle->free_struct( \layout LyX-Code - &asn1_DEF_Rectangle, &mf->rect, + &asn_DEF_Rectangle, &mf->rect, \emph on 1 \emph default @@ -2704,10 +2710,10 @@ Rectangle_t *rect = */ \layout LyX-Code -asn1_DEF_Rectangle->free_struct( +asn_DEF_Rectangle->free_struct( \layout LyX-Code - &asn1_DEF_Rectangle, rect, + &asn_DEF_Rectangle, rect, \emph on 0 \emph default diff --git a/doc/asn1c-usage.pdf b/doc/asn1c-usage.pdf index 032679c8c09d48980427a69d5fb527d3057c34e2..e47e102981e8fa33d3007242e7f6a0182c87b8d0 100644 GIT binary patch delta 27099 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
    n8nd2*n}n# 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 From 845c0eef28d39587b2b6b493ebf573b8486ec026 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 13:29:57 +0000 Subject: [PATCH 0448/1469] api changes reflected git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@448 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/unber.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/asn1c/unber.c b/asn1c/unber.c index c7ba71c8e..bb52690f2 100644 --- a/asn1c/unber.c +++ b/asn1c/unber.c @@ -369,10 +369,10 @@ print_TL(int fin, int level, int constr, ssize_t tlen, ber_tlv_tag_t tlv_tag, be */ static int print_V(const char *fname, FILE *fp, ber_tlv_tag_t tlv_tag, ber_tlv_len_t tlv_len) { - asn1_integer_t *arcs = 0; /* Object identifier arcs */ + asn1c_integer_t *arcs = 0; /* Object identifier arcs */ unsigned char *vbuf = 0; asn1p_expr_type_e etype = 0; - asn1_integer_t collector = 0; + asn1c_integer_t collector = 0; int special_format = 0; ssize_t i; @@ -683,5 +683,5 @@ decode_tlv_from_string(const char *datastring) { /* * Dummy functions. */ -ber_dec_rval_t ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *opt_ctx, void *ptr, size_t size, int tag_mode, int last_tag_form, ber_tlv_len_t *last_length, int *opt_tlv_form) { ber_dec_rval_t rv; (void)td; (void)opt_ctx; (void)ptr; (void)size; (void)tag_mode; (void)last_tag_form; (void)last_length; (void)opt_tlv_form; return rv; } -ssize_t der_write_tags(asn1_TYPE_descriptor_t *td, size_t slen, int tag_mode, int last_tag_form, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { (void)td; (void)slen; (void)tag_mode; (void)last_tag_form; (void)tag; (void)cb; (void)app_key; return -1; } +ber_dec_rval_t ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_struct_ctx_t *opt_ctx, void *ptr, size_t size, int tag_mode, int last_tag_form, ber_tlv_len_t *last_length, int *opt_tlv_form) { ber_dec_rval_t rv; (void)opt_codec_ctx; (void)td; (void)opt_ctx; (void)ptr; (void)size; (void)tag_mode; (void)last_tag_form; (void)last_length; (void)opt_tlv_form; return rv; } +ssize_t der_write_tags(asn_TYPE_descriptor_t *td, size_t slen, int tag_mode, int last_tag_form, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { (void)td; (void)slen; (void)tag_mode; (void)last_tag_form; (void)tag; (void)cb; (void)app_key; return -1; } From 0d181f20747a75b9cb27f26c9418925fd2e40f6f Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 13:30:32 +0000 Subject: [PATCH 0449/1469] rename; security and cross-referencing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@449 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index e13b149d1..033a2acd9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,8 @@ -0.9.6: 2004-Sep-27 +0.9.6: 2004-Sep-29 + * Added several security firewalls: decoder's stack usage control + and the stricter checking of the TLV length. * Implemented BASIC-XER encoding support (X.693). * Implemented unber(1) and enber(1) for BER<->XML translation. * Implemented CGI for online ASN.1 compilation (asn1c/webcgi). @@ -14,7 +16,9 @@ types (BOOLEAN, INTEGER, and REAL). The problem occured when the encoding of such type is split between several bytes. (Severity: high, Security impact: low) + * Support for cross-referencing type definitions (updated ./tests/43-*). * Fixed pretty-printing of the REAL type. Added lots of test cases. + * Renamed asn1_* into asn_* in function and type names. * Updated documentation. 0.9.5: 2004-Sep-17 From 4a168ae4b6eceb78321f0bccfcfb6017b26abea9 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 13:37:15 +0000 Subject: [PATCH 0450/1469] api changes git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@450 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-usage.html | 91 +++++++++++++++++++++++--------------------- 1 file changed, 47 insertions(+), 44 deletions(-) diff --git a/doc/asn1c-usage.html b/doc/asn1c-usage.html index 9ac7b1ba6..ded6c7583 100644 --- a/doc/asn1c-usage.html +++ b/doc/asn1c-usage.html @@ -254,7 +254,7 @@

    SimpleInteger ::= INTEGER   -- An integer with a very limited range -SmallInt ::= INTEGER (0..127) +SmallPositiveInt ::= INTEGER (0..127)   -- Integer, negative NegativeInt ::= INTEGER (MIN..0) @@ -400,10 +400,10 @@

    The character string with the following alphabet: space, ''''' (single quote), ''('', '')'', ''+'', -'','' (comma), ''-'', ''.'', ''/'', +'','' (comma), ''-'', ''.'', ''/'', digits (''0'' to ''9''), '':'', ''='', ''?'', upper-case and lower-case letters (''A'' to ''Z'' and ''a'' -to ''z'') +to ''z'').

    @@ -413,7 +413,10 @@

    The character string with the alphabet which is more or less a subset -of ASCII between space and ''~'' (tilde). +of ASCII between the space and the ''~'' +symbol (tilde). + +

    Alternatively, the alphabet may be described as the PrintableString alphabet presented earlier, plus the following characters: ''!'', '''''', ''#'', ''$'', ''%'', @@ -557,12 +560,12 @@

    The purpose of the ASN.1 compiler, of which this document is part, is to convert the ASN.1 specifications to some other target language (currently, only C is supported2.1). The compiler reads the specification and emits a series of target + HREF="#foot145">2.1). The compiler reads the specification and emits a series of target language structures and surrounding maintenance code. For example, the C structure which may be created by compiler to represent the simple Rectangle specification defined earlier in this document, may look like this2.2: + HREF="#foot404">2.2:

    @@ -576,7 +579,7 @@

    This would not be of much value for such a simple specification, so the compiler goes further and actually produces the code which fills in this structure by parsing the opaque binary2.3 data provided in some buffer. It also produces the code that takes + HREF="#foot152">2.3 data provided in some buffer. It also produces the code that takes this structure as an argument and performs structure serialization by emitting a series of bytes. @@ -588,8 +591,8 @@

    After building and installing the compiler, the asn1c3.1 command may be used to compile the ASN.1 specification3.2: + HREF="#foot405">3.1 command may be used to compile the ASN.1 specification3.2:

    @@ -655,7 +658,7 @@


    -
    +

    Table 1: The list of asn1c command line options
    -S <directory> Use the specified directory with ASN.1 skeleton files.
    -t <data-string> -Interpret the data-string as a sequence of hexadecimal values -representing the start of BER TLV encoding. Print the human readable -explanation.
    Warning Options Description
    -fno-constraints +Do not generate ASN.1 subtype constraint checking code. This may make +a shorter executable.
    -funnamed-unions Enable unnamed unions in the definitions of target language's structures.
    @@ -706,10 +709,10 @@

    Description

    @@ -793,7 +796,7 @@

     cc -o rectangle *.c   # It could be that simple4.1
    +  HREF="#foot412">4.1
     
    @@ -825,14 +828,14 @@

     Rectangle_t *rect = ...;
      
    -asn1_DEF_Rectangle->free_struct(&asn1_DEF_Rectangle,
    +asn_DEF_Rectangle->free_struct(&asn_DEF_Rectangle,
         rect, 0);
     
    This code defines a rect pointer which points to the Rectangle_t structure which needs to be freed. The second line invokes the generic free_struct routine created specifically for this Rectangle_t structure. -The asn1_DEF_Rectangle is the type descriptor, which holds +The asn_DEF_Rectangle is the type descriptor, which holds a collection of generic routines to deal with the Rectangle_t structure.

    @@ -842,7 +845,7 @@

    ber_decoder
    This is the generic restartable4.2 BER decoder (Basic Encoding Rules). This decoder would create + HREF="#foot239">4.2 BER decoder (Basic Encoding Rules). This decoder would create and/or fill the target structure for you. Please refer to Section [Decoding-BER].
    @@ -877,7 +880,7 @@

    explicit subtype constraints. Please refer to Section sub:Validating-the-target.

    -Each of the above function takes the type descriptor (asn1_DEF_...) +Each of the above function takes the type descriptor (asn_DEF_...) and the target structure (rect, in the above example). The target structure is typically created by the generic BER decoder or by the application itself. @@ -893,8 +896,8 @@

        Rectangle_t *rect = 0;    /* Note this 0! */     ber_dec_rval_t rval;   -    rval = asn1_DEF_Rectangle->ber_decoder( -          &asn1_DEF_Rectangle, +    rval = asn_DEF_Rectangle->ber_decoder(0, +          &asn_DEF_Rectangle,           (void **)&rect,           buffer, buf_size,           0); @@ -903,8 +906,8 @@

            return rect;          /* Decoding succeeded */     } else {         /* Free partially decoded rect */ -        asn1_DEF_Rectangle->free_struct( -            &asn1_DEF_Rectangle, rect, 0); +        asn_DEF_Rectangle->free_struct( +            &asn_DEF_Rectangle, rect, 0);         return 0;     } } @@ -985,18 +988,18 @@


    -rval = ber_decode(&asn1_DEF_Rectangle, (void **)&rect,
    +rval = ber_decode(0, &asn_DEF_Rectangle, (void **)&rect,
         buffer, buf_size);
     
    -Note that the initial (asn1_DEF_Rectangle->ber_decoder) reference +Note that the initial (asn_DEF_Rectangle->ber_decoder) reference is gone, and also the last argument (0) is no longer necessary.

    These two ways of invocations are fully equivalent.

    -The BER decoder may fail because (the following RC_... +The BER decoder may fail because of (the following RC_... codes are defined in ber_decoder.h):

    @@ -1039,8 +1042,8 @@


    As with BER decoder, the DER encoder may be invoked either directly -from the ASN.1 type descriptor (asn1_DEF_Rectangle) or from the -stand-alone function, which is somewhat simpler: +from the ASN.1 type descriptor (asn_DEF_Rectangle) or from the stand-alone +function, which is somewhat simpler:

    @@ -1068,7 +1071,7 @@


    encoded == -1) {         /* @@ -1098,7 +1101,7 @@


    4.3. + HREF="#foot315">4.3.

    Please look into der_encoder.h for the precise definition of der_encode() @@ -1133,7 +1136,7 @@


    -asn_fprint(stdout, &asn1_DEF_Rectangle, rect);
    +asn_fprint(stdout, &asn_DEF_Rectangle, rect);
     
    Please look into constr_TYPE.h for the precise definition of asn_fprint() @@ -1206,7 +1209,7 @@

    -xer_fprint(stdout, &asn1_DEF_Rectangle, rect);
    +xer_fprint(stdout, &asn_DEF_Rectangle, rect);
     
    See Section sub:Encoding-XER for XML-related details. @@ -1260,8 +1263,8 @@

    <  * Freeing the Rectangle_td  * without freeing the mf->rect pointer  */ -asn1_DEF_Rectangle->free_struct( -    &asn1_DEF_Rectangle, &mf->rect, 1 /* !free */); +asn_DEF_Rectangle->free_struct( +    &asn_DEF_Rectangle, &mf->rect, 1 /* !free */);   /* Rectangle_t is a stand-alone pointer */ Rectangle_t *rect = ...; @@ -1269,8 +1272,8 @@

    <  * Freeing the Rectangle_t  * and freeing the rect pointer  */ -asn1_DEF_Rectangle->free_struct( -    &asn1_DEF_Rectangle, rect, 0 /* free the pointer too */); +asn_DEF_Rectangle->free_struct( +    &asn_DEF_Rectangle, rect, 0 /* free the pointer too */); It is safe to invoke the free_struct function with the target @@ -1292,50 +1295,50 @@



    Footnotes

    -
    ... supported... supported2.1
    C++ is ''supported'' too, as long as an class-based approach is not a definitive factor.
    -
    ... this... this2.2
    -fnative-types compiler option is used to produce basic C int types instead of infinite width INTEGER_t structures. See Table 1.
    -
    ... binary... binary2.3
    BER, CER and DER encodings are binary. However, the XER encoding is text (XML) based.
    -
    ...asn1c...asn1c3.1
    The 1 symbol in asn1c is a digit, not an ''ell'' letter.
    -
    ... specification... specification3.2
    This is probably not what you want to try out right now - read through the rest of this chapter to find out about -P and -R options.
    -
    ...that simple...that simple4.1
    Provided that you've also created a .c file with the int main() routine.
    -
    ...restartable...restartable4.2
    Restartable means that if the decoder encounters the end of the buffer, it will fail, but may later be invoked again with the rest of the buffer to continue decoding.
    -
    ... encoding... encoding4.3
    It is actually faster too: the encoder might skip over some computations which aren't important for the size determination. @@ -1344,7 +1347,7 @@



    Lev Walkin -2004-09-26 +2004-09-29
    From 6130a2f2f0f713e36324970ea99157a79c95aa99 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 14:19:14 +0000 Subject: [PATCH 0451/1469] added stack checking into ber_skip_length also git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@451 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ber_decoder.c | 6 ++++-- skeletons/ber_tlv_length.c | 21 +++++++++++++++++++-- skeletons/ber_tlv_length.h | 5 ++++- skeletons/constr_CHOICE.c | 2 +- skeletons/constr_SEQUENCE.c | 4 ++-- skeletons/constr_SET.c | 4 ++-- 6 files changed, 32 insertions(+), 10 deletions(-) diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c index 95d710177..f932b3b2f 100644 --- a/skeletons/ber_decoder.c +++ b/skeletons/ber_decoder.c @@ -71,10 +71,12 @@ ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, int step = opt_ctx ? opt_ctx->step : 0; /* Where we left previously */ int tagno; + /* + * Make sure we didn't exceed the maximum stack size. + */ if(opt_codec_ctx && opt_codec_ctx->max_stack_size) { ptrdiff_t usedstack = ((char *)opt_codec_ctx - (char *)&size); - /* do not change the semantics: - * double negative is required to avoid int wrap-around */ + /* double negative is required to avoid int wrap-around */ if(usedstack > 0) usedstack = -usedstack; ASN_DEBUG("Current stack size %ld", -(long)usedstack); if(usedstack < -(ptrdiff_t)opt_codec_ctx->max_stack_size) { diff --git a/skeletons/ber_tlv_length.c b/skeletons/ber_tlv_length.c index a0ec1e5df..10a9e1c38 100644 --- a/skeletons/ber_tlv_length.c +++ b/skeletons/ber_tlv_length.c @@ -74,12 +74,28 @@ ber_fetch_length(int _is_constructed, void *bufptr, size_t size, } ssize_t -ber_skip_length(int _is_constructed, void *ptr, size_t size) { +ber_skip_length(asn_codec_ctx_t *opt_codec_ctx, + int _is_constructed, void *ptr, size_t size) { ber_tlv_len_t vlen; /* Length of V in TLV */ ssize_t tl; /* Length of L in TLV */ ssize_t ll; /* Length of L in TLV */ size_t skip; + /* + * Make sure we didn't exceed the maximum stack size. + */ + if(opt_codec_ctx && opt_codec_ctx->max_stack_size) { + ptrdiff_t usedstack = ((char *)opt_codec_ctx - (char *)&size); + /* double negative is required to avoid int wrap-around */ + if(usedstack > 0) usedstack = -usedstack; + ASN_DEBUG("Current stack size %ld", -(long)usedstack); + if(usedstack < -(ptrdiff_t)opt_codec_ctx->max_stack_size) { + ASN_DEBUG("Stack limit %ld reached", + (long)opt_codec_ctx->max_stack_size); + return -1; + } + } + /* * Determine the size of L in TLV. */ @@ -107,7 +123,8 @@ ber_skip_length(int _is_constructed, void *ptr, size_t size) { tl = ber_fetch_tag(ptr, size, &tag); if(tl <= 0) return tl; - ll = ber_skip_length(BER_TLV_CONSTRUCTED(ptr), + ll = ber_skip_length(opt_codec_ctx, + BER_TLV_CONSTRUCTED(ptr), ((char *)ptr) + tl, size - tl); if(ll <= 0) return ll; diff --git a/skeletons/ber_tlv_length.h b/skeletons/ber_tlv_length.h index 5222bbf48..9d99e663f 100644 --- a/skeletons/ber_tlv_length.h +++ b/skeletons/ber_tlv_length.h @@ -27,7 +27,10 @@ ssize_t ber_fetch_length(int _is_constructed, void *bufptr, size_t size, * RETURN VALUES: * Standard {-1,0,>0} convention. */ -ssize_t ber_skip_length(int _is_constructed, void *bufptr, size_t size); +struct asn_codec_ctx_s; /* Forward declaration */ +ssize_t ber_skip_length( + struct asn_codec_ctx_s *opt_codec_ctx, /* optional context */ + int _is_constructed, void *bufptr, size_t size); /* * This function serializes the length (L from TLV) in DER format. diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index ab158462b..4db6d7b16 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -209,7 +209,7 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ASN_DEBUG("Skipping unknown tag %s", ber_tlv_tag_string(tlv_tag)); - skip = ber_skip_length( + skip = ber_skip_length(opt_codec_ctx, BER_TLV_CONSTRUCTED(ptr), (char *)ptr + tag_len, LEFT - tag_len); diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 740ce570d..07c777289 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -352,7 +352,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, /* Skip this tag */ ssize_t skip; - skip = ber_skip_length( + skip = ber_skip_length(opt_codec_ctx, BER_TLV_CONSTRUCTED(ptr), (char *)ptr + tag_len, LEFT - tag_len); ASN_DEBUG("Skip length %d in %s", @@ -474,7 +474,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, RETURN(RC_FAIL); } - ll = ber_skip_length( + ll = ber_skip_length(opt_codec_ctx, BER_TLV_CONSTRUCTED(ptr), (char *)ptr + tl, LEFT - tl); switch(ll) { diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index 647bb83a2..d9f93c3b2 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -259,7 +259,7 @@ SET_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ASN_DEBUG("Skipping unknown tag %s", ber_tlv_tag_string(tlv_tag)); - skip = ber_skip_length( + skip = ber_skip_length(opt_codec_ctx, BER_TLV_CONSTRUCTED(ptr), (char *)ptr + tag_len, LEFT - tag_len); @@ -381,7 +381,7 @@ SET_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, RETURN(RC_FAIL); } - ll = ber_skip_length( + ll = ber_skip_length(opt_codec_ctx, BER_TLV_CONSTRUCTED(ptr), (char *)ptr + tl, LEFT - tl); switch(ll) { From c6d0977c2475f197bdaac76ed7029ce976ff485e Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 14:28:07 +0000 Subject: [PATCH 0452/1469] makefile added git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@452 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/data-62/Makefile | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 asn1c/tests/data-62/Makefile diff --git a/asn1c/tests/data-62/Makefile b/asn1c/tests/data-62/Makefile new file mode 100644 index 000000000..eb8d641d0 --- /dev/null +++ b/asn1c/tests/data-62/Makefile @@ -0,0 +1,9 @@ + +all: + @for xbr in *.xbr; do \ + ber=`echo "$$xbr" | sed -e 's/\.xbr$$/\.ber/`; \ + if [ $$xbr -nt $$ber ]; then \ + echo "../../enber $$xbr > $$ber"; \ + ../../enber $$xbr > $$ber || exit $$?; \ + fi; \ + done From b3b90fd1b070ad3df85bb8ad19fbac0c38c373f8 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 14:28:36 +0000 Subject: [PATCH 0453/1469] indefinite length structure in extensions git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@453 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/data-62/data-62-29-L.ber | Bin 0 -> 28 bytes asn1c/tests/data-62/data-62-29-L.xbr | 12 ++++++++++++ 2 files changed, 12 insertions(+) create mode 100644 asn1c/tests/data-62/data-62-29-L.ber create mode 100644 asn1c/tests/data-62/data-62-29-L.xbr diff --git a/asn1c/tests/data-62/data-62-29-L.ber b/asn1c/tests/data-62/data-62-29-L.ber new file mode 100644 index 0000000000000000000000000000000000000000..108f257b7d8e698d3b9e9da8fa62da9ef617572e GIT binary patch literal 28 icmXqLU}9ul$R^BEl3HBC%J8t^VFLpYFf#sUU;qGSeFpyk literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-62/data-62-29-L.xbr b/asn1c/tests/data-62/data-62-29-L.xbr new file mode 100644 index 000000000..3f313d0dd --- /dev/null +++ b/asn1c/tests/data-62/data-62-29-L.xbr @@ -0,0 +1,12 @@ + +

    &x05;

    + +

    test

    +
    +

    -- extra component + -- another one + + + +

    &xff;

    -- and yet another +
    From eb4620d61b1bea7f36345dfef10f2e5d1a8efb3a Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 14:29:05 +0000 Subject: [PATCH 0454/1469] expect the whole buffer to be consumed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@454 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-62.c | 1 + 1 file changed, 1 insertion(+) diff --git a/asn1c/tests/check-62.c b/asn1c/tests/check-62.c index d9365d85b..2af2e5e0a 100644 --- a/asn1c/tests/check-62.c +++ b/asn1c/tests/check-62.c @@ -89,6 +89,7 @@ load_object(enum expectation expectation, char *fbuf, int size) { if(expectation != EXP_BROKEN) { assert(rval.code == RC_OK); + assert(fbuf_offset == size); } else { assert(rval.code != RC_OK); fprintf(stderr, "Failed, but this was expected\n"); From 2d69fbad130f1acfabf230c455f74eee2959a7b8 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 14:31:36 +0000 Subject: [PATCH 0455/1469] rearrangement git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@455 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/Makefile.am | 11 +++++------ asn1c/tests/Makefile.in | 12 ++++++------ libasn1parser/Makefile.in | 2 +- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/asn1c/tests/Makefile.am b/asn1c/tests/Makefile.am index 979161396..4a4b461e7 100644 --- a/asn1c/tests/Makefile.am +++ b/asn1c/tests/Makefile.am @@ -11,12 +11,11 @@ else TESTS = check-*.c endif -EXTRA_DIST = $(check_SCRIPTS) check-*.c* data-*/*.* +EXTRA_DIST = \ + $(check_SCRIPTS) \ + check-*.c* \ + data-*/Makefile \ + data-*/*.* clean: rm -rf test-* - -SUFFIXES = .xbr .ber - -.xbr.ber: - ../enber $< > $@ diff --git a/asn1c/tests/Makefile.in b/asn1c/tests/Makefile.in index 00336bf2e..91ad426ef 100644 --- a/asn1c/tests/Makefile.in +++ b/asn1c/tests/Makefile.in @@ -160,12 +160,15 @@ check_SCRIPTS = check-assembly.sh TESTS_ENVIRONMENT = CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" ./check-assembly.sh @CPLUSPLUS_FOUND_FALSE@TESTS = check-*.c @CPLUSPLUS_FOUND_TRUE@TESTS = check-*.c check-*.cc ## Include C++ test filed (.cc) -EXTRA_DIST = $(check_SCRIPTS) check-*.c* data-*/*.* -SUFFIXES = .xbr .ber +EXTRA_DIST = \ + $(check_SCRIPTS) \ + check-*.c* \ + data-*/Makefile \ + data-*/*.* + all: all-am .SUFFIXES: -.SUFFIXES: .xbr .ber $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -400,9 +403,6 @@ uninstall-am: uninstall-info-am clean: rm -rf test-* - -.xbr.ber: - ../enber $< > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index dc7abe835..cb9ebd03f 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -447,9 +447,9 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." - -rm -f asn1p_y.h -rm -f asn1p_l.c -rm -f asn1p_y.c + -rm -f asn1p_y.h clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ From d42578d4c9f3b91216718b4bec83d0300cc839ab Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 29 Sep 2004 14:37:57 +0000 Subject: [PATCH 0456/1469] XER stuff git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@456 59561ff5-6e30-0410-9f3c-9617f08c8826 --- TODO | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TODO b/TODO index 6d7b11ad6..16a102b4c 100644 --- a/TODO +++ b/TODO @@ -3,7 +3,7 @@ MAJOR: 1. Support for PER encoding. Requires advanced subtype constraints support, which is already completed. -2. Support for XER encoding. +2. Support for XER decoding (the BASIC-XER encoding is already implemented). 3. Support for Information Object Classes. Status: support for parsing IOCs is mostly present. Support for slicing From 446ab4d0583cfce42ef46b52f8331b30b92feb1c Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 30 Sep 2004 06:22:13 +0000 Subject: [PATCH 0457/1469] more robust parsing of module start sequence git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@457 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/clyx2asn1.pl | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/clyx2asn1.pl b/examples/clyx2asn1.pl index 83afbeb43..77251bf85 100755 --- a/examples/clyx2asn1.pl +++ b/examples/clyx2asn1.pl @@ -38,11 +38,12 @@ print O "\n"; } } else { - next unless $modules{$_}; - open(O, '> '.$modules{$_}); + /^([A-Za-z0-9-]+)(\s*{.*)?$/; + next unless $modules{$1}; + open(O, '> '.$modules{$1}); print O; $inmodule = 1; - delete $modules{$_}; + delete $modules{$1}; } } From 281d82ab0a0094bc82017c10a2b17a48c426e670 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 30 Sep 2004 06:38:21 +0000 Subject: [PATCH 0458/1469] removed unnecessary newline git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@458 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1print/asn1print.c | 4 +++- tests/04-enum-SE.asn1.-E | 1 - tests/07-int-OK.asn1.-EF | 1 - tests/14-resolver-OK.asn1.-EF | 1 - tests/16-constraint-OK.asn1.-EF | 1 - tests/19-param-OK.asn1.-EF | 1 - tests/20-constr-OK.asn1.-EF | 1 - tests/21-tags-OK.asn1.-EF | 1 - tests/22-tags-OK.asn1.-EF | 1 - tests/23-bits-OK.asn1.-EF | 1 - tests/24-sequence-OK.asn1.-EF | 1 - tests/31-set-of-OK.asn1.-EF | 1 - tests/32-sequence-of-OK.asn1.-EF | 1 - tests/34-class-OK.asn1.-EF | 1 - tests/37-indirect-choice-OK.asn1.-EF | 1 - tests/42-real-life-OK.asn1.-EF | 1 - ...ype-SE.asn1.-EFfknown-extern-type=KnownExt | 1 - tests/49-real-life-OK.asn1.-E | 1 - ...50-constraint-OK.asn1.-EFprint-constraints | Bin 7349 -> 7348 bytes tests/55-components-of-OK.asn1.-EF | 1 - tests/58-param-OK.asn1.-EF | 1 - tests/60-any-OK.asn1.-EF | 1 - tests/62-any-OK.asn1.-EF | 1 - 23 files changed, 3 insertions(+), 22 deletions(-) diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index 886c94921..4132204f0 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -31,6 +31,7 @@ static int asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, e int asn1print(asn1p_t *asn, enum asn1print_flags flags) { asn1p_module_t *mod; + int modno = 0; if(asn == NULL) { errno = EINVAL; @@ -38,6 +39,7 @@ asn1print(asn1p_t *asn, enum asn1print_flags flags) { } TQ_FOR(mod, &(asn->modules), mod_next) { + if(modno++) printf("\n"); asn1print_module(asn, mod, flags); } @@ -48,7 +50,7 @@ static int asn1print_module(asn1p_t *asn, asn1p_module_t *mod, enum asn1print_flags flags) { asn1p_expr_t *tc; - printf("\n%s ", mod->Identifier); + printf("%s ", mod->Identifier); if(mod->module_oid) { asn1print_oid(mod->module_oid, flags); printf("\n"); diff --git a/tests/04-enum-SE.asn1.-E b/tests/04-enum-SE.asn1.-E index c908ea5f3..19b431cc5 100644 --- a/tests/04-enum-SE.asn1.-E +++ b/tests/04-enum-SE.asn1.-E @@ -1,4 +1,3 @@ - ModuleTestEnum2 {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 4 } diff --git a/tests/07-int-OK.asn1.-EF b/tests/07-int-OK.asn1.-EF index 54faa1089..3b93cd37e 100644 --- a/tests/07-int-OK.asn1.-EF +++ b/tests/07-int-OK.asn1.-EF @@ -1,4 +1,3 @@ - ModuleTestInt1 {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 7 } diff --git a/tests/14-resolver-OK.asn1.-EF b/tests/14-resolver-OK.asn1.-EF index 7070bc8e4..31793f225 100644 --- a/tests/14-resolver-OK.asn1.-EF +++ b/tests/14-resolver-OK.asn1.-EF @@ -1,4 +1,3 @@ - ModuleTestResolver2 {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 14 1 } diff --git a/tests/16-constraint-OK.asn1.-EF b/tests/16-constraint-OK.asn1.-EF index 237fb5741..61d81227b 100644 --- a/tests/16-constraint-OK.asn1.-EF +++ b/tests/16-constraint-OK.asn1.-EF @@ -1,4 +1,3 @@ - ModuleTestConstraint {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 16 } diff --git a/tests/19-param-OK.asn1.-EF b/tests/19-param-OK.asn1.-EF index 624041433..f2daaf39b 100644 --- a/tests/19-param-OK.asn1.-EF +++ b/tests/19-param-OK.asn1.-EF @@ -1,4 +1,3 @@ - ModuleTestParam {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 19 } diff --git a/tests/20-constr-OK.asn1.-EF b/tests/20-constr-OK.asn1.-EF index dbbdacaef..fe61cfecd 100644 --- a/tests/20-constr-OK.asn1.-EF +++ b/tests/20-constr-OK.asn1.-EF @@ -1,4 +1,3 @@ - ModuleTestConstr {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 20 } diff --git a/tests/21-tags-OK.asn1.-EF b/tests/21-tags-OK.asn1.-EF index a8fd93c70..857c581f3 100644 --- a/tests/21-tags-OK.asn1.-EF +++ b/tests/21-tags-OK.asn1.-EF @@ -1,4 +1,3 @@ - ModuleTestTags1 {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 21 1 } diff --git a/tests/22-tags-OK.asn1.-EF b/tests/22-tags-OK.asn1.-EF index c6c97c99b..50fce1e8d 100644 --- a/tests/22-tags-OK.asn1.-EF +++ b/tests/22-tags-OK.asn1.-EF @@ -1,4 +1,3 @@ - ModuleTestTags3 {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 22 } diff --git a/tests/23-bits-OK.asn1.-EF b/tests/23-bits-OK.asn1.-EF index f65f3b369..45ff4da7a 100644 --- a/tests/23-bits-OK.asn1.-EF +++ b/tests/23-bits-OK.asn1.-EF @@ -1,4 +1,3 @@ - ModuleTestBitString {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 23 } diff --git a/tests/24-sequence-OK.asn1.-EF b/tests/24-sequence-OK.asn1.-EF index 87740d67d..e45e04aee 100644 --- a/tests/24-sequence-OK.asn1.-EF +++ b/tests/24-sequence-OK.asn1.-EF @@ -1,4 +1,3 @@ - ModuleTestSequence {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 24 } diff --git a/tests/31-set-of-OK.asn1.-EF b/tests/31-set-of-OK.asn1.-EF index 46a7dfbf0..692450b1a 100644 --- a/tests/31-set-of-OK.asn1.-EF +++ b/tests/31-set-of-OK.asn1.-EF @@ -1,4 +1,3 @@ - ModuleTestSetOfSimple {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 31 } diff --git a/tests/32-sequence-of-OK.asn1.-EF b/tests/32-sequence-of-OK.asn1.-EF index 543c2ab91..3697ef121 100644 --- a/tests/32-sequence-of-OK.asn1.-EF +++ b/tests/32-sequence-of-OK.asn1.-EF @@ -1,4 +1,3 @@ - ModuleTestSequenceSimple {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 32 } diff --git a/tests/34-class-OK.asn1.-EF b/tests/34-class-OK.asn1.-EF index 7a181c3bf..52ba86704 100644 --- a/tests/34-class-OK.asn1.-EF +++ b/tests/34-class-OK.asn1.-EF @@ -1,4 +1,3 @@ - ModuleTestClassSimple {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 34 } diff --git a/tests/37-indirect-choice-OK.asn1.-EF b/tests/37-indirect-choice-OK.asn1.-EF index 88f7b03b1..4f8c80b7c 100644 --- a/tests/37-indirect-choice-OK.asn1.-EF +++ b/tests/37-indirect-choice-OK.asn1.-EF @@ -1,4 +1,3 @@ - ModuleTestIndirectChoiceFine {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 37 } diff --git a/tests/42-real-life-OK.asn1.-EF b/tests/42-real-life-OK.asn1.-EF index c07dccf41..6b5249d86 100644 --- a/tests/42-real-life-OK.asn1.-EF +++ b/tests/42-real-life-OK.asn1.-EF @@ -1,4 +1,3 @@ - ModuleLAPStorage {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 42 } diff --git a/tests/45-undefined-type-SE.asn1.-EFfknown-extern-type=KnownExt b/tests/45-undefined-type-SE.asn1.-EFfknown-extern-type=KnownExt index 62dc0e373..99dcd60f5 100644 --- a/tests/45-undefined-type-SE.asn1.-EFfknown-extern-type=KnownExt +++ b/tests/45-undefined-type-SE.asn1.-EFfknown-extern-type=KnownExt @@ -1,4 +1,3 @@ - ModuleKnownExternType {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 45 } diff --git a/tests/49-real-life-OK.asn1.-E b/tests/49-real-life-OK.asn1.-E index 7439005c7..e3d9d351c 100644 --- a/tests/49-real-life-OK.asn1.-E +++ b/tests/49-real-life-OK.asn1.-E @@ -1,4 +1,3 @@ - ModuleSetChoiceExtensibility {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 49 } diff --git a/tests/50-constraint-OK.asn1.-EFprint-constraints b/tests/50-constraint-OK.asn1.-EFprint-constraints index 8fb42287a37bce51bb499db79915d675f2f72716..393826debc19315dfa975409058e6052c311a890 100644 GIT binary patch delta 8 PcmdmLxy5oL;}#hJ5Z?n{ delta 9 QcmdmDxz&=9Yr_^901__)X8-^I diff --git a/tests/55-components-of-OK.asn1.-EF b/tests/55-components-of-OK.asn1.-EF index e6655db83..1ace85937 100644 --- a/tests/55-components-of-OK.asn1.-EF +++ b/tests/55-components-of-OK.asn1.-EF @@ -1,4 +1,3 @@ - ModuleTestComponentsOf {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 55 } diff --git a/tests/58-param-OK.asn1.-EF b/tests/58-param-OK.asn1.-EF index 3f950bfb4..168b0577d 100644 --- a/tests/58-param-OK.asn1.-EF +++ b/tests/58-param-OK.asn1.-EF @@ -1,4 +1,3 @@ - ModuleTestParam {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 58 } diff --git a/tests/60-any-OK.asn1.-EF b/tests/60-any-OK.asn1.-EF index e2c89e686..064a0b9f4 100644 --- a/tests/60-any-OK.asn1.-EF +++ b/tests/60-any-OK.asn1.-EF @@ -1,4 +1,3 @@ - ModuleTestANY {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 60 } diff --git a/tests/62-any-OK.asn1.-EF b/tests/62-any-OK.asn1.-EF index bc08f0389..76549a699 100644 --- a/tests/62-any-OK.asn1.-EF +++ b/tests/62-any-OK.asn1.-EF @@ -1,4 +1,3 @@ - ModuleTestANYSyntax {iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 62 } From c3bfd8178ea54735d7ddcf3ec1a292a0665b8e25 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 30 Sep 2004 22:26:19 +0000 Subject: [PATCH 0459/1469] prettyfying git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@459 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-usage.lyx | 79 ++++++++++++++++++++++++++++++-------------- doc/asn1c-usage.pdf | Bin 71477 -> 108339 bytes 2 files changed, 55 insertions(+), 24 deletions(-) diff --git a/doc/asn1c-usage.lyx b/doc/asn1c-usage.lyx index 865d08b59..012503c0b 100644 --- a/doc/asn1c-usage.lyx +++ b/doc/asn1c-usage.lyx @@ -2,15 +2,24 @@ \lyxformat 221 \textclass book \begin_preamble -%\fancyhf{} -%\renewcommand{\chaptermark}[1]{\markboth{\thechapter.\ #1\ sdf}{}} -%\renewcommand{\sectionmark}[1]{\markright{\MakeUppercase{\thesection.\ #1}}} -%\fancyhead[LE,RO]{\thepage} -%\fancyhead[LO]{\rightmark} -%\fancyhead[RE]]{\leftmark} \usepackage{extramarks} \lhead{\firstxmark} \rfoot{\lastxmark} +\usepackage{color} +\definecolor{gray40}{gray}{.4} +\definecolor{urlblue}{rgb}{0,0,.6} +\usepackage[colorlinks=true, +linkcolor={gray40}, +urlcolor={urlblue}, +pdfauthor={Lev Walkin}, +pdftitle={Using the OpenSource ASN.1 Compiler}, +pdfkeywords={ASN.1,asn1c,compiler} +]{hyperref} +%\fancyhf{} +%\fancyhead[LE,RO]{\thepage} +%\fancyhead[LO]{\rightmark} +%\fancyhead[RE]{\leftmark} +%\fancyfoot[R]{\lastxmark} \end_preamble \language english \inputencoding latin1 @@ -25,8 +34,8 @@ \use_natbib 0 \use_numerical_citations 0 \paperorientation portrait -\secnumdepth 3 -\tocdepth 3 +\secnumdepth 2 +\tocdepth 2 \paragraph_separation indent \defskip medskip \quotes_language swedish @@ -37,12 +46,17 @@ \layout Title -Using the Open ASN.1 Compiler +Using the OpenSource ASN.1 Compiler \layout Author Lev Walkin < -\begin_inset LatexCommand \url{vlm@lionet.info} +\begin_inset ERT +status Collapsed + +\layout Standard +\backslash +href{mailto:vlm@lionet.info?Subject=asn1c}{vlm@lionet.info} \end_inset > @@ -55,7 +69,13 @@ status Open \layout Standard \backslash -extramarks{$Revision$ -- describes asn1c-0.9.6}{} +lhead{Document describes +\backslash +href{http://lionet.info/soft/asn1c-0.9.6.tar.gz}{asn1c-0.9.6}} +\layout Standard + +\backslash +rhead{$Revision$} \end_inset @@ -71,7 +91,7 @@ extramarks{$Revision$ -- describes asn1c-0.9.6}{} \begin_inset ERT -status Collapsed +status Open \layout Standard @@ -320,19 +340,19 @@ FruitId ::= ENUMERATED { apple(1), orange(2) } ComputerOSType ::= ENUMERATED { \layout LyX-Code - FreeBSD, -- will be 0 + FreeBSD, -- acquires value 0 \layout LyX-Code - Windows, -- will be 1 + Windows, -- acquires value 1 \layout LyX-Code - Solaris(5), -- will remain 5 + Solaris(5), -- remains 5 \layout LyX-Code - Linux, -- will be 6 + Linux, -- becomes 6 \layout LyX-Code - MacOS -- will be 7 + MacOS -- becomes 7 \layout LyX-Code } @@ -936,7 +956,7 @@ Address ::= SEQUENCE { -- The apartment number may be omitted \layout LyX-Code - apartmentNumber NumericString OPTIONAL, + apartmentNumber NumericString OPTIONAL, \layout LyX-Code streetName PrintableString, @@ -1322,7 +1342,7 @@ collapsed false \begin_inset Tabular - + @@ -1641,7 +1661,7 @@ Allow SIZE() constraint for INTEGER, ENUMERATED, and other types for which \size small Use the native machine's data types (int, double) whenever possible, instead - of the compound ASN.1 INTEGER_t, ENUMERATED_t and REAL_t types. + of the compound INTEGER_t, ENUMERATED_t and REAL_t types. \end_inset @@ -1701,11 +1721,13 @@ Enable unnamed unions in the definitions of target language's structures. \size small -Use only ASN.1:1988 embedded types. +Pretend to support only ASN.1:1988 embedded types. + Certain reserved words, such as UniversalString and BMPString, become ordinary + type references and may be redefined by the specification. \end_inset - + \begin_inset Text @@ -1877,7 +1899,16 @@ int main() \layout Section -Invoking the ASN.1 helper code from the application +Invoking the ASN.1 helper code from an application +\begin_inset OptArg +collapsed true + +\layout Standard + +Invoking the helper code +\end_inset + + \layout Standard First of all, you should to include one or more header files into your applicati @@ -2731,7 +2762,7 @@ free_struct The OpenSource ASN.1 Compiler. -\begin_inset LatexCommand \htmlurl{http://lionet.info/asn1/} +\begin_inset LatexCommand \htmlurl{http://lionet.info/asn1c/} \end_inset diff --git a/doc/asn1c-usage.pdf b/doc/asn1c-usage.pdf index e47e102981e8fa33d3007242e7f6a0182c87b8d0..df871b0c3cc688f9a355e1f9d1147ebd3270b099 100644 GIT binary patch literal 108339 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%0Dh!(UY<*3rkk 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
    f+I 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 delta 44741 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%0D>X5iWfKldK% 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%0Dq!;K^0z&%wMo7Hi)z(luXUZ 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 xm@)UEA)qm#(2#=%)%4XN{|B!F8NUDk From c55095fe2fdbe79ff817b5157f01888db93c001b Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 30 Sep 2004 22:45:58 +0000 Subject: [PATCH 0460/1469] prettyfying git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@460 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-usage.html | 84 ++++++++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 39 deletions(-) diff --git a/doc/asn1c-usage.html b/doc/asn1c-usage.html index ded6c7583..fcc2980c7 100644 --- a/doc/asn1c-usage.html +++ b/doc/asn1c-usage.html @@ -6,8 +6,8 @@ Jens Lippmann, Marek Rouchal, Martin Wilck and others --> -Using the Open ASN.1 Compiler - +Using the OpenSource ASN.1 Compiler + @@ -21,13 +21,16 @@

    -

    Using the Open ASN.1 Compiler

    +

    Using the OpenSource ASN.1 Compiler

    + +

    +Download the PDF version


    @@ -105,7 +108,7 @@

  • Recognizing compiler output
  • Invoking the ASN.1 helper code from the application + HREF="asn1c-usage.html#SECTION03330000000000000000">Invoking the ASN.1 helper code from an application
  • Table 1: The list of asn1c command line options
    -fall-defs-global -Normally the compiler hides the definitions (asn1_DEF_xxx) of the +Normally the compiler hides the definitions (asn_DEF_xxx) of the inner structure elements (members of SEQUENCE, SET and other types). This option makes all such definitions global. Enabling this option -may pollute the namespace by making lots of asn1_DEF_xxx structures +may pollute the namespace by making lots of asn_DEF_xxx structures globally visible, but will allow you to manipulate (encode and decode) the individual members of any complex ASN.1 structure.
    @@ -724,8 +727,8 @@

    +possible, instead of the compound INTEGER_t, ENUMERATED_t and REAL_t +types. +Pretend to support only ASN.1:1988 embedded types. Certain +reserved words, such as UniversalString and BMPString, become ordinary +type references and may be redefined by the specification. - - @@ -796,14 +802,14 @@

     cc -o rectangle *.c   # It could be that simple4.1
    +  HREF="#foot427">4.1
     

    -Invoking the ASN.1 helper code from the application +Invoking the ASN.1 helper code from an application

    @@ -845,7 +851,7 @@

    ber_decoder
    This is the generic restartable4.2 BER decoder (Basic Encoding Rules). This decoder would create + HREF="#foot253">4.2 BER decoder (Basic Encoding Rules). This decoder would create and/or fill the target structure for you. Please refer to Section [Decoding-BER].
    @@ -1101,7 +1107,7 @@


    4.3. + HREF="#foot329">4.3.

    Please look into der_encoder.h for the precise definition of der_encode() @@ -1284,61 +1290,61 @@

    <

    Bibliography

    ASN1C -
    The OpenSource ASN.1 Compiler. http://lionet.info/asn1/ +
    The OpenSource ASN.1 Compiler. http://lionet.info/asn1c/

    Dub00
    Olivier Dubuisson - ASN.1 Communication between heterogeneous -systems - Morgan Kaufmann Publishers, 2000. http://asn1.elibel.tm.fr/en/book/. +systems - Morgan Kaufmann Publishers, 2000. http://asn1.elibel.tm.fr/en/book/. ISBN:0-12-6333361-0.

    ITU-T/ASN.1 -
    ITU-T Study Group 17 - Languages for Telecommunication Systems http://www.itu.int/ITU-T/studygroups/com17/languages/
    +
    ITU-T Study Group 17 - Languages for Telecommunication Systems http://www.itu.int/ITU-T/studygroups/com17/languages/



    Footnotes

    -
    ... supported... supported2.1
    C++ is ''supported'' too, as long as an class-based approach is not a definitive factor.
    -
    ... this... this2.2
    -fnative-types compiler option is used to produce basic C int types instead of infinite width INTEGER_t structures. See Table 1.
    -
    ... binary... binary2.3
    BER, CER and DER encodings are binary. However, the XER encoding is text (XML) based.
    -
    ...asn1c...asn1c3.1
    The 1 symbol in asn1c is a digit, not an ''ell'' letter.
    -
    ... specification... specification3.2
    This is probably not what you want to try out right now - read through the rest of this chapter to find out about -P and -R options.
    -
    ...that simple...that simple4.1
    Provided that you've also created a .c file with the int main() routine.
    -
    ...restartable...restartable4.2
    Restartable means that if the decoder encounters the end of the buffer, it will fail, but may later be invoked again with the rest of the buffer to continue decoding.
    -
    ... encoding... encoding4.3
    It is actually faster too: the encoder might skip over some computations which aren't important for the size determination. @@ -1347,7 +1353,7 @@



    Lev Walkin -2004-09-29 +2004-09-30
    From 20971f9d188c1d0074c51c2c83cc31aa3041a933 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 2 Oct 2004 00:10:25 +0000 Subject: [PATCH 0461/1469] fixed limits accounting git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@461 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/asn1c.1 | 6 ++++-- asn1c/asn1c.c | 2 +- asn1c/unber.c | 13 +++++++++++-- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/asn1c/asn1c.1 b/asn1c/asn1c.1 index 7ac0015c8..b331d440e 100644 --- a/asn1c/asn1c.1 +++ b/asn1c/asn1c.1 @@ -80,7 +80,7 @@ an ASN.1 standard and compiler may fail to produce the meaningful code. .TP .B \-fnative-types Use the native machine's data types (int, double) whenever possible, -instead of the compound ASN.1 INTEGER_t, ENUMERATED_t and REAL_t types. +instead of the compound INTEGER_t, ENUMERATED_t and REAL_t types. .TP .B \-fno-constraints Do not generate ASN.1 subtype constraint checking code. This may make a shorter executable. @@ -89,7 +89,9 @@ Do not generate ASN.1 subtype constraint checking code. This may make a shorter Enable unnamed unions in the definitions of target language's structures. .TP .B \-ftypes88 -Use only ASN.1:1988 embedded types. +Pretend to support only ASN.1:1988 embedded types. Certain reserved words, +such as UniversalString and BMPString, become ordinary type references +and may be redefined by the specification. .SH OUTPUT OPTIONS .TP .B \-print-constraints diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index ad0cab43b..98a607aa0 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -313,7 +313,7 @@ usage(const char *av0) { " -fnative-types Use \"int\" instead of INTEGER_t whenever possible\n" " -fno-constraints Do not generate constraint checking code\n" " -funnamed-unions Enable unnamed unions in structures\n" -" -ftypes88 Use only ASN.1:1988 embedded types\n" +" -ftypes88 Pretend to support only ASN.1:1988 embedded types\n" "\n" " -print-constraints Explain subtype constraints (debug)\n" diff --git a/asn1c/unber.c b/asn1c/unber.c index bb52690f2..2ed9565ca 100644 --- a/asn1c/unber.c +++ b/asn1c/unber.c @@ -301,11 +301,17 @@ static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t * This is a constructed type. Process recursively. */ printf(">\n"); /* Close the opening tag */ + if(tlv_len != -1 && limit != -1) { + assert(limit >= tlv_len); + } pdc = process_deeper(fname, fp, level + 1, tlv_len == -1 ? limit : tlv_len, &dec, tlv_len == -1); if(pdc == PD_FAILED) return pdc; - if(limit != -1) limit -= dec; + if(limit != -1) { + assert(limit >= dec); + limit -= dec; + } *decoded += dec; if(tlv_len == -1) { tblen = 0; @@ -316,7 +322,10 @@ static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t if(print_V(fname, fp, tlv_tag, tlv_len)) return PD_FAILED; - limit -= tlv_len; + if(limit != -1) { + assert(limit >= tlv_len); + limit -= tlv_len; + } *decoded += tlv_len; } From 745fe25d337cb28e7ff2801d0f2cacfa626ebead Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 2 Oct 2004 00:12:11 +0000 Subject: [PATCH 0462/1469] version bump-up git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@462 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 5 +++++ configure | 2 +- configure.in | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 033a2acd9..ba7b5b81c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,9 @@ +0.9.6.1: 2004-Oct-01 + + * Fixed unber limits controlling logic. + * Removed C99'izm from the x509dump, now understood by older compilers. + 0.9.6: 2004-Sep-29 * Added several security firewalls: decoder's stack usage control diff --git a/configure b/configure index 794cd3efd..29c4d04e8 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.9.6 + VERSION=0.9.6.1 cat >>confdefs.h <<_ACEOF diff --git a/configure.in b/configure.in index a3362b0fc..009d99423 100644 --- a/configure.in +++ b/configure.in @@ -3,7 +3,7 @@ AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_BUILD AC_CANONICAL_TARGET AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.9.6) +AM_INIT_AUTOMAKE(asn1c, 0.9.6.1) AM_MAINTAINER_MODE From c35d34ac390d781dc08c3c52463a07b32a155a3e Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 2 Oct 2004 11:37:09 +0000 Subject: [PATCH 0463/1469] test for utf8 stuff git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@463 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/Makefile.am | 1 + skeletons/tests/Makefile.in | 23 +++++--- skeletons/tests/check-UTF8String.c | 84 ++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+), 7 deletions(-) create mode 100644 skeletons/tests/check-UTF8String.c diff --git a/skeletons/tests/Makefile.am b/skeletons/tests/Makefile.am index eb1f0187f..a58e469c1 100644 --- a/skeletons/tests/Makefile.am +++ b/skeletons/tests/Makefile.am @@ -5,6 +5,7 @@ check_PROGRAMS = \ check-length \ check-OIDs \ check-GeneralizedTime \ + check-UTF8String \ check-UTCTime \ check-INTEGER \ check-REAL diff --git a/skeletons/tests/Makefile.in b/skeletons/tests/Makefile.in index 0587cec74..835df71e4 100644 --- a/skeletons/tests/Makefile.in +++ b/skeletons/tests/Makefile.in @@ -13,7 +13,7 @@ # PARTICULAR PURPOSE. @SET_MAKE@ -SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c check-REAL.c check-UTCTime.c check-ber_tlv_tag.c check-length.c +SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c check-REAL.c check-UTCTime.c check-UTF8String.c check-ber_tlv_tag.c check-length.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ @@ -38,8 +38,8 @@ POST_UNINSTALL = : host_triplet = @host@ check_PROGRAMS = check-ber_tlv_tag$(EXEEXT) check-length$(EXEEXT) \ check-OIDs$(EXEEXT) check-GeneralizedTime$(EXEEXT) \ - check-UTCTime$(EXEEXT) check-INTEGER$(EXEEXT) \ - check-REAL$(EXEEXT) + check-UTF8String$(EXEEXT) check-UTCTime$(EXEEXT) \ + check-INTEGER$(EXEEXT) check-REAL$(EXEEXT) subdir = skeletons/tests DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -69,6 +69,10 @@ check_UTCTime_SOURCES = check-UTCTime.c check_UTCTime_OBJECTS = check-UTCTime.$(OBJEXT) check_UTCTime_LDADD = $(LDADD) check_UTCTime_DEPENDENCIES = +check_UTF8String_SOURCES = check-UTF8String.c +check_UTF8String_OBJECTS = check-UTF8String.$(OBJEXT) +check_UTF8String_LDADD = $(LDADD) +check_UTF8String_DEPENDENCIES = check_ber_tlv_tag_SOURCES = check-ber_tlv_tag.c check_ber_tlv_tag_OBJECTS = check-ber_tlv_tag.$(OBJEXT) check_ber_tlv_tag_LDADD = $(LDADD) @@ -85,6 +89,7 @@ am__depfiles_maybe = depfiles @AMDEP_TRUE@ ./$(DEPDIR)/check-OIDs.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-REAL.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-UTCTime.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/check-UTF8String.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-ber_tlv_tag.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-length.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ @@ -96,11 +101,11 @@ CCLD = $(CC) LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c \ - check-REAL.c check-UTCTime.c check-ber_tlv_tag.c \ - check-length.c + check-REAL.c check-UTCTime.c check-UTF8String.c \ + check-ber_tlv_tag.c check-length.c DIST_SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c \ - check-REAL.c check-UTCTime.c check-ber_tlv_tag.c \ - check-length.c + check-REAL.c check-UTCTime.c check-UTF8String.c \ + check-ber_tlv_tag.c check-length.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -271,6 +276,9 @@ check-REAL$(EXEEXT): $(check_REAL_OBJECTS) $(check_REAL_DEPENDENCIES) check-UTCTime$(EXEEXT): $(check_UTCTime_OBJECTS) $(check_UTCTime_DEPENDENCIES) @rm -f check-UTCTime$(EXEEXT) $(LINK) $(check_UTCTime_LDFLAGS) $(check_UTCTime_OBJECTS) $(check_UTCTime_LDADD) $(LIBS) +check-UTF8String$(EXEEXT): $(check_UTF8String_OBJECTS) $(check_UTF8String_DEPENDENCIES) + @rm -f check-UTF8String$(EXEEXT) + $(LINK) $(check_UTF8String_LDFLAGS) $(check_UTF8String_OBJECTS) $(check_UTF8String_LDADD) $(LIBS) check-ber_tlv_tag$(EXEEXT): $(check_ber_tlv_tag_OBJECTS) $(check_ber_tlv_tag_DEPENDENCIES) @rm -f check-ber_tlv_tag$(EXEEXT) $(LINK) $(check_ber_tlv_tag_LDFLAGS) $(check_ber_tlv_tag_OBJECTS) $(check_ber_tlv_tag_LDADD) $(LIBS) @@ -289,6 +297,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-OIDs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-REAL.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-UTCTime.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-UTF8String.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-ber_tlv_tag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-length.Po@am__quote@ diff --git a/skeletons/tests/check-UTF8String.c b/skeletons/tests/check-UTF8String.c new file mode 100644 index 000000000..be8c27371 --- /dev/null +++ b/skeletons/tests/check-UTF8String.c @@ -0,0 +1,84 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +static void +check(int expect_length, char *buf, int buflen) { + UTF8String_t st; + int ret; + + if(buflen < 0) buflen = strlen(buf); + + st.buf = (uint8_t *)buf; + st.size = buflen; + printf("["); + + for(ret = 0; ret < buflen; ret++) + printf("%c", buf[ret]); + ret = UTF8String_length(&st, 0, 0, 0); + printf("]: size=%d, expect=%d, got=%d\n", + buflen, expect_length, ret); + assert(ret == expect_length); +} + +static int +check_speed() { + int cycles = 1000000; + double start, stop; + struct timeval tv; + UTF8String_t st; + char long_test[] = + "a\303\237a\303\237a\303\237a\303\237" + "a\303\237a\303\237a\303\237a\303\237" + "a\303\237a\303\237a\303\237a\303\237" + "a\303\237a\303\237a\303\237a\303\237" + "a\303\237a\303\237a\303\237a\303\237"; + int ret; + int i; + + st.buf = long_test; + st.size = sizeof(long_test) - 1; + + ret = UTF8String_length(&st, 0, 0, 0); + assert(ret == 40); + printf("Now wait a bit...\n"); + + gettimeofday(&tv, 0); + start = tv.tv_sec + tv.tv_usec / 1000000.0; + for(i = 0; i < cycles; i++) { + ret += UTF8String_length(&st, 0, 0, 0); + } + gettimeofday(&tv, 0); + stop = tv.tv_sec + tv.tv_usec / 1000000.0; + + printf("%d cycles in %.3fms\n", cycles, stop - start); + + return ret; +} + +int +main() { + + check(0, "", 0); + check(1, "\0", 1); + check(-1, "\377", 1); + check(1, "a", 1); + check(2, "ab", 2); + check(3, "abc", 3); + assert(sizeof("a\303\237cd") == 6); + check(4, "a\303\237cd", 5); + check(-1, "a\303", 2); + check(-1, "a\370\200\200\200c", 5); + check(3, "a\370\201\200\201\257c", 7); + /* not yet check(-1, "a\370\200\200\200\257c", 7); */ + + check_speed(); + + return 0; +} + From 51283298ef7f0419fb7e5acf8e7b86b739c6179b Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 2 Oct 2004 11:37:38 +0000 Subject: [PATCH 0464/1469] fixed indexing bug; also rearranging and made more comments git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@464 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/UTF8String.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/skeletons/UTF8String.c b/skeletons/UTF8String.c index 7d3fcd2c1..c04577885 100644 --- a/skeletons/UTF8String.c +++ b/skeletons/UTF8String.c @@ -32,13 +32,20 @@ asn_TYPE_descriptor_t asn_DEF_UTF8String = { 0 /* No specifics */ }; -static int _UTF8String_h1[16] = { - 1, 1, 1, 1, 1, 1, 1, 1, /* 0x0 ... 0x7 */ - 0, 0, 0, 0, 2, 2, 3, -1 -}; -static int _UTF8String_h2[16] = { - 4, 4, 4, 4, 4, 4, 4, 4, /* 0xF0 .. 0xF7 */ - 5, 5, 5, 5, 6, 6, -1, -1 +/* + * This is the table of length expectations. + * The second half of this table is only applicable to the long sequentes. + */ +static int UTF8String_ht[2][16] = { + { /* 0x0 ... 0x7 */ + /* 0000..0111 */ + 1, 1, 1, 1, 1, 1, 1, 1, + /* 1000..1011(0), 1100..1101(2), 1110(3), 1111(-1) */ + 0, 0, 0, 0, 2, 2, 3, -1 }, + { /* 0xF0 .. 0xF7 */ + /* 11110000..11110111 */ + 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 6, 6, -1, -1 } }; int @@ -63,7 +70,7 @@ UTF8String_length(const UTF8String_t *st, const char *opt_type_name, for(want = 0; buf < end; buf++) { uint8_t ch = *buf; - int w = _UTF8String_h1[ch >> 4]; + int w = UTF8String_ht[0][ch >> 4]; if(want) { /* Continuation expected */ if(w) { _ASN_ERRLOG(app_errlog, app_key, @@ -78,11 +85,11 @@ UTF8String_length(const UTF8String_t *st, const char *opt_type_name, } else { switch(w) { case -1: /* Long UTF-8 */ - w = _UTF8String_h2[ch & 0xF0]; + w = UTF8String_ht[1][ch & 0x0F]; if(w != -1) break; /* Fall through */ - case 0: + case 0: /* But we should want something! */ _ASN_ERRLOG(app_errlog, app_key, "%s: UTF-8 expectation" "failed at byte %d (%s:%d)", From 36982eeb35afe59704cec1644fbc46d776c99aa5 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 2 Oct 2004 12:29:44 +0000 Subject: [PATCH 0465/1469] code made faster git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@465 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/UTF8String.c | 66 +++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 42 deletions(-) diff --git a/skeletons/UTF8String.c b/skeletons/UTF8String.c index c04577885..1c94645e7 100644 --- a/skeletons/UTF8String.c +++ b/skeletons/UTF8String.c @@ -63,52 +63,34 @@ UTF8String_length(const UTF8String_t *st, const char *opt_type_name, asn_app_consume_bytes_f *app_errlog, void *app_key) { if(st && st->buf) { - size_t length = 0; + size_t length; uint8_t *buf = st->buf; uint8_t *end = buf + st->size; - int want; /* Number of bytes wanted */ - for(want = 0; buf < end; buf++) { - uint8_t ch = *buf; - int w = UTF8String_ht[0][ch >> 4]; - if(want) { /* Continuation expected */ - if(w) { - _ASN_ERRLOG(app_errlog, app_key, - "%s: UTF-8 expectation " - "failed at byte %d (%s:%d)", - opt_type_name, - (buf - st->buf) + 1, - __FILE__, __LINE__); - return -1; - } - want--; - } else { - switch(w) { - case -1: /* Long UTF-8 */ - w = UTF8String_ht[1][ch & 0x0F]; - if(w != -1) - break; - /* Fall through */ - case 0: /* But we should want something! */ - _ASN_ERRLOG(app_errlog, app_key, - "%s: UTF-8 expectation" - "failed at byte %d (%s:%d)", - opt_type_name, - (buf - st->buf) + 1, - __FILE__, __LINE__); - return -1; - } - want = w - 1; /* Expect this much */ + for(length = 0; buf < end; length++) { + int ch = *buf; + int want = UTF8String_ht[0][ch >> 4]; + switch(want) { + case -1: /* Second half of the table, long sequence */ + want = UTF8String_ht[1][ch & 0x0F]; + if(want != -1) + break; /* Fine value */ + case 0: /* 10xxxxxx should not appear here */ + _ASN_ERRLOG(app_errlog, app_key, + "%s: UTF-8 expectation failed " + "at byte %d (%s:%d)", + opt_type_name, + (buf - st->buf) + 1, + __FILE__, __LINE__); + return -1; } - if(!want) length++; - } - - /* If still want something, then something is wrong */ - if(want) { - _ASN_ERRLOG(app_errlog, app_key, - "%s: truncated UTF-8 sequence (%s:%d)", - opt_type_name, __FILE__, __LINE__); - return -1; + if(buf + want > end) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: truncated UTF-8 sequence (%s:%d)", + opt_type_name, __FILE__, __LINE__); + return -1; + } + buf += want; } return length; From 09bdde68e8723676933a0223e127f9fa0f65c865 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 2 Oct 2004 12:29:52 +0000 Subject: [PATCH 0466/1469] added error logging git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@466 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/check-UTF8String.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/skeletons/tests/check-UTF8String.c b/skeletons/tests/check-UTF8String.c index be8c27371..78415ab3f 100644 --- a/skeletons/tests/check-UTF8String.c +++ b/skeletons/tests/check-UTF8String.c @@ -7,6 +7,11 @@ #include #include +static int errlog(const void *buf, size_t size, void *key) { + fwrite(buf, 1, size, stdout); + return 0; +} + static void check(int expect_length, char *buf, int buflen) { UTF8String_t st; @@ -20,7 +25,7 @@ check(int expect_length, char *buf, int buflen) { for(ret = 0; ret < buflen; ret++) printf("%c", buf[ret]); - ret = UTF8String_length(&st, 0, 0, 0); + ret = UTF8String_length(&st, 0, errlog, 0); printf("]: size=%d, expect=%d, got=%d\n", buflen, expect_length, ret); assert(ret == expect_length); @@ -44,14 +49,14 @@ check_speed() { st.buf = long_test; st.size = sizeof(long_test) - 1; - ret = UTF8String_length(&st, 0, 0, 0); + ret = UTF8String_length(&st, 0, errlog, 0); assert(ret == 40); printf("Now wait a bit...\n"); gettimeofday(&tv, 0); start = tv.tv_sec + tv.tv_usec / 1000000.0; for(i = 0; i < cycles; i++) { - ret += UTF8String_length(&st, 0, 0, 0); + ret += UTF8String_length(&st, 0, errlog, 0); } gettimeofday(&tv, 0); stop = tv.tv_sec + tv.tv_usec / 1000000.0; From d295c1c925bcf78ed9537289fb9cd21655b2f8d4 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 2 Oct 2004 15:54:09 +0000 Subject: [PATCH 0467/1469] more structured testing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@467 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/check-UTF8String.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/skeletons/tests/check-UTF8String.c b/skeletons/tests/check-UTF8String.c index 78415ab3f..149792191 100644 --- a/skeletons/tests/check-UTF8String.c +++ b/skeletons/tests/check-UTF8String.c @@ -7,11 +7,6 @@ #include #include -static int errlog(const void *buf, size_t size, void *key) { - fwrite(buf, 1, size, stdout); - return 0; -} - static void check(int expect_length, char *buf, int buflen) { UTF8String_t st; @@ -25,7 +20,7 @@ check(int expect_length, char *buf, int buflen) { for(ret = 0; ret < buflen; ret++) printf("%c", buf[ret]); - ret = UTF8String_length(&st, 0, errlog, 0); + ret = UTF8String_length(&st); printf("]: size=%d, expect=%d, got=%d\n", buflen, expect_length, ret); assert(ret == expect_length); @@ -49,14 +44,14 @@ check_speed() { st.buf = long_test; st.size = sizeof(long_test) - 1; - ret = UTF8String_length(&st, 0, errlog, 0); + ret = UTF8String_length(&st); assert(ret == 40); printf("Now wait a bit...\n"); gettimeofday(&tv, 0); start = tv.tv_sec + tv.tv_usec / 1000000.0; for(i = 0; i < cycles; i++) { - ret += UTF8String_length(&st, 0, errlog, 0); + ret += UTF8String_length(&st); } gettimeofday(&tv, 0); stop = tv.tv_sec + tv.tv_usec / 1000000.0; @@ -71,16 +66,23 @@ main() { check(0, "", 0); check(1, "\0", 1); - check(-1, "\377", 1); check(1, "a", 1); check(2, "ab", 2); check(3, "abc", 3); assert(sizeof("a\303\237cd") == 6); check(4, "a\303\237cd", 5); - check(-1, "a\303", 2); - check(-1, "a\370\200\200\200c", 5); - check(3, "a\370\201\200\201\257c", 7); - /* not yet check(-1, "a\370\200\200\200\257c", 7); */ + check(3, "a\370\211\200\201\257c", 7); + check(3, "\320\273\320\265\320\262", 6); + + check(-1, "a\303", 2); /* Truncated */ + check(-2, "\377", 1); /* Invalid UTF-8 sequence start */ + check(-2, "\200", 1); + check(-2, "\320\273\265\320\262", 5); + check(-3, "\320c", 2); /* Not continuation */ + check(-3, "a\370\200\200\200c", 6); + check(-4, "a\370\200\200\200\257c", 7); + check(-4, "\320\273\320\265\340\200\262", 7); + check(-5, 0, 0); check_speed(); From 1e10a100eb0ef133a2a1641965928aa9e66820c6 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 2 Oct 2004 15:55:07 +0000 Subject: [PATCH 0468/1469] check for the minimal encoding length git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@468 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/UTF8String.c | 98 ++++++++++++++++++++++++++++++------------ skeletons/UTF8String.h | 13 ++++-- 2 files changed, 80 insertions(+), 31 deletions(-) diff --git a/skeletons/UTF8String.c b/skeletons/UTF8String.c index 1c94645e7..934a424aa 100644 --- a/skeletons/UTF8String.c +++ b/skeletons/UTF8String.c @@ -47,20 +47,56 @@ static int UTF8String_ht[2][16] = { 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, -1, -1 } }; +static int32_t UTF8String_mv[7] = { 0, 0, + 0x00000080, + 0x00000800, + 0x00010000, + 0x00200000, + 0x04000000 +}; + +/* Internal aliases for return codes */ +#define U8E_TRUNC -1 /* UTF-8 sequence truncated */ +#define U8E_ILLSTART -2 /* Illegal UTF-8 sequence start */ +#define U8E_NOTCONT -3 /* Continuation expectation failed */ +#define U8E_NOTMIN -4 /* Not minimal length encoding */ +#define U8E_EINVAL -5 /* Invalid arguments */ int UTF8String_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { - ssize_t len; - len = UTF8String_length((const UTF8String_t *)sptr, td->name, - app_errlog, app_key); - if(len > 0) len = 0; - return len; + ssize_t len = UTF8String_length((const UTF8String_t *)sptr); + switch(len) { + case U8E_EINVAL: + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given", td->name); + break; + case U8E_TRUNC: + _ASN_ERRLOG(app_errlog, app_key, + "%s: truncated UTF-8 sequence (%s:%d)", + td->name, __FILE__, __LINE__); + break; + case U8E_ILLSTART: + _ASN_ERRLOG(app_errlog, app_key, + "%s: UTF-8 illegal start of encoding (%s:%d)", + td->name, __FILE__, __LINE__); + break; + case U8E_NOTCONT: + _ASN_ERRLOG(app_errlog, app_key, + "%s: UTF-8 not continuation (%s:%d)", + td->name, __FILE__, __LINE__); + break; + case U8E_NOTMIN: + _ASN_ERRLOG(app_errlog, app_key, + "%s: UTF-8 not minimal sequence (%s:%d)", + td->name, __FILE__, __LINE__); + break; + } + return (len < 0) ? -1 : 0; } ssize_t -UTF8String_length(const UTF8String_t *st, const char *opt_type_name, - asn_app_consume_bytes_f *app_errlog, void *app_key) { +UTF8String_length(const UTF8String_t *st) { if(st && st->buf) { size_t length; @@ -69,35 +105,41 @@ UTF8String_length(const UTF8String_t *st, const char *opt_type_name, for(length = 0; buf < end; length++) { int ch = *buf; - int want = UTF8String_ht[0][ch >> 4]; + uint8_t *cend; + int32_t value; + int want; + + /* Compute the sequence length */ + want = UTF8String_ht[0][ch >> 4]; switch(want) { - case -1: /* Second half of the table, long sequence */ + case -1: + /* Second half of the table, long sequence */ want = UTF8String_ht[1][ch & 0x0F]; - if(want != -1) - break; /* Fine value */ - case 0: /* 10xxxxxx should not appear here */ - _ASN_ERRLOG(app_errlog, app_key, - "%s: UTF-8 expectation failed " - "at byte %d (%s:%d)", - opt_type_name, - (buf - st->buf) + 1, - __FILE__, __LINE__); - return -1; + if(want != -1) break; + /* Fall through */ + case 0: + return U8E_ILLSTART; } - if(buf + want > end) { - _ASN_ERRLOG(app_errlog, app_key, - "%s: truncated UTF-8 sequence (%s:%d)", - opt_type_name, __FILE__, __LINE__); - return -1; + + /* assert(want >= 1 && want <= 6) */ + + /* Check character sequence length */ + if(buf + want > end) return U8E_TRUNC; + + value = ch & (0xff >> (want + 1)); + cend = buf + want; + for(buf++; buf < cend; buf++) { + ch = *buf; + if(ch < 0x80 || ch > 0xbf) return U8E_NOTCONT; + value = (value << 6) | (ch & 0x3F); } - buf += want; + if(value < UTF8String_mv[want]) + return U8E_NOTMIN; } return length; } else { - _ASN_ERRLOG(app_errlog, app_key, - "%s: value not given", opt_type_name); - return -1; + return U8E_EINVAL; } } diff --git a/skeletons/UTF8String.h b/skeletons/UTF8String.h index a1149e4fd..45801592e 100644 --- a/skeletons/UTF8String.h +++ b/skeletons/UTF8String.h @@ -14,8 +14,15 @@ extern asn_TYPE_descriptor_t asn_DEF_UTF8String; asn_struct_print_f UTF8String_print; asn_constr_check_f UTF8String_constraint; -/* Returns length of UTF-8 string in characters or -1 if error. */ -ssize_t UTF8String_length(const UTF8String_t *st, const char *opt_type_name, - asn_app_consume_bytes_f *app_errlog, void *app_key); +/* + * Returns length of the given UTF-8 string in characters, + * or a negative error code: + * -1: UTF-8 sequence truncated + * -2: Illegal UTF-8 sequence start + * -3: Continuation expectation failed + * -4: Not minimal length encoding + * -5: Invalid arguments + */ +ssize_t UTF8String_length(const UTF8String_t *st); #endif /* _UTF8String_H_ */ From ee5afb05283be3224727c7145ee516faf11ec942 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 2 Oct 2004 15:55:20 +0000 Subject: [PATCH 0469/1469] utf8 stuff git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@469 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index ba7b5b81c..1935511ff 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,10 @@ -0.9.6.1: 2004-Oct-01 +0.9.7: 2004-Oct-02 * Fixed unber limits controlling logic. * Removed C99'izm from the x509dump, now understood by older compilers. + * Enhanced UTF8String constraint validation, now it checks + for the minimal encoding length; API of UTF8String_length() changed. 0.9.6: 2004-Sep-29 From 1fca1ddf6e78cd3f476ef7c2a1af665e34a3eb72 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 2 Oct 2004 15:55:55 +0000 Subject: [PATCH 0470/1469] version bump-up git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@470 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure | 2 +- configure.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 29c4d04e8..f668e8576 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.9.6.1 + VERSION=0.9.7 cat >>confdefs.h <<_ACEOF diff --git a/configure.in b/configure.in index 009d99423..7a8aa9490 100644 --- a/configure.in +++ b/configure.in @@ -3,7 +3,7 @@ AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_BUILD AC_CANONICAL_TARGET AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.9.6.1) +AM_INIT_AUTOMAKE(asn1c, 0.9.7) AM_MAINTAINER_MODE From e4506a31c7b9cd91014f767730271a89c24868a5 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 2 Oct 2004 16:33:46 +0000 Subject: [PATCH 0471/1469] new UTF8String_length() semantics git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@471 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/50-constraint-OK.asn1 | 5 +++-- ...50-constraint-OK.asn1.-EFprint-constraints | Bin 7348 -> 7581 bytes tests/50-constraint-OK.asn1.-P | 18 ++++++++++++++---- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/tests/50-constraint-OK.asn1 b/tests/50-constraint-OK.asn1 index b8812bc84..d0692c539 100644 --- a/tests/50-constraint-OK.asn1 +++ b/tests/50-constraint-OK.asn1 @@ -45,8 +45,9 @@ BEGIN SIZE-and-FROM ::= PER-Visible (SIZE(1..4) ^ FROM("ABCD")) Neither-SIZE-nor-FROM ::= PER-Visible (SIZE(1..4) | FROM("ABCD",...)) - Utf8-3 ::= Utf8-2 (FROM("A".."Z"|"a".."z")) - Utf8-2 ::= Utf8-1 (SIZE(1..2)) + Utf8-4 ::= UTF8String (FROM("A".."Z"|"a".."z")) -- Alphabet + Utf8-3 ::= Utf8-2 (FROM("A".."Z"|"a".."z")) -- Alphabet and size + Utf8-2 ::= Utf8-1 (SIZE(1..2)) -- Size Utf8-1 ::= UTF8String VisibleIdentifier ::= Identifier diff --git a/tests/50-constraint-OK.asn1.-EFprint-constraints b/tests/50-constraint-OK.asn1.-EFprint-constraints index 393826debc19315dfa975409058e6052c311a890..3a6285850643baf9bcfa44932ee01a70a357f98e 100644 GIT binary patch delta 63 zcmdmDIoEnaoRFZ2f|Zr6LTHGaMQ}+`W?s6&h(C;#E)p1eaypV4HpAdlu` Teqlp46HO}x1%=JwLa|%`d#DmO delta 12 TcmbPhy~T1voX}=>;V>=$Ap!(b diff --git a/tests/50-constraint-OK.asn1.-P b/tests/50-constraint-OK.asn1.-P index b8c0c353e..f3370c246 100644 --- a/tests/50-constraint-OK.asn1.-P +++ b/tests/50-constraint-OK.asn1.-P @@ -2346,8 +2346,13 @@ Utf8_3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - size = UTF8String_length(st, td->name, app_errlog, app_key); - if(size == (size_t)-1) return -1; + size = UTF8String_length(st); + if(size < 0) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: UTF-8: broken encoding (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } if((size >= 1 && size <= 2) && !check_permitted_alphabet_12(sptr)) { @@ -2476,8 +2481,13 @@ Utf8_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - size = UTF8String_length(st, td->name, app_errlog, app_key); - if(size == (size_t)-1) return -1; + size = UTF8String_length(st); + if(size < 0) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: UTF-8: broken encoding (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } if((size >= 1 && size <= 2)) { /* Constraint check succeeded */ From 1ba42753e4b23ac5ca4369deb404bc70af19dd1c Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 2 Oct 2004 16:44:30 +0000 Subject: [PATCH 0472/1469] test for utf8 constraint code generation git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@472 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/50-constraint-OK.asn1 | 2 +- ...50-constraint-OK.asn1.-EFprint-constraints | Bin 7581 -> 7548 bytes tests/50-constraint-OK.asn1.-P | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/50-constraint-OK.asn1 b/tests/50-constraint-OK.asn1 index d0692c539..85997ea88 100644 --- a/tests/50-constraint-OK.asn1 +++ b/tests/50-constraint-OK.asn1 @@ -45,7 +45,7 @@ BEGIN SIZE-and-FROM ::= PER-Visible (SIZE(1..4) ^ FROM("ABCD")) Neither-SIZE-nor-FROM ::= PER-Visible (SIZE(1..4) | FROM("ABCD",...)) - Utf8-4 ::= UTF8String (FROM("A".."Z"|"a".."z")) -- Alphabet + Utf8-4 ::= UTF8String (FROM("A".."Z")) -- Alphabet Utf8-3 ::= Utf8-2 (FROM("A".."Z"|"a".."z")) -- Alphabet and size Utf8-2 ::= Utf8-1 (SIZE(1..2)) -- Size Utf8-1 ::= UTF8String diff --git a/tests/50-constraint-OK.asn1.-EFprint-constraints b/tests/50-constraint-OK.asn1.-EFprint-constraints index 3a6285850643baf9bcfa44932ee01a70a357f98e..b1b6e0ec1a0125bdd7ead6d58029632774d2fb8f 100644 GIT binary patch delta 37 tcmbPh{l{uUtet|E&%W%3y=T+ delta 40 vcmexkHP?DWtname, __FILE__, __LINE__); @@ -2482,7 +2482,7 @@ Utf8_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, } size = UTF8String_length(st); - if(size < 0) { + if((ssize_t)size < 0) { _ASN_ERRLOG(app_errlog, app_key, "%s: UTF-8: broken encoding (%s:%d)", td->name, __FILE__, __LINE__); From 2601675ec7923340b475f0ccdc338f78d4053843 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 2 Oct 2004 16:44:55 +0000 Subject: [PATCH 0473/1469] UTF8String_length() API change git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@473 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_constraint.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index 9a9e667e4..47469511f 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -310,7 +310,6 @@ asn1c_emit_constraint_tables(arg_t *arg, int got_size) { /* * UTF8String type is a special case in many respects. */ - assert(range_stop > 255); /* This one's unobvious */ if(got_size) { /* * Size has been already determined. @@ -337,9 +336,8 @@ asn1c_emit_constraint_tables(arg_t *arg, int got_size) { ct->_compile_mark); INDENT(+1); if(utf8_full_alphabet_check) { - OUT("if(UTF8String_length((UTF8String_t *)sptr, td->name, \n"); - OUT("\tapp_errlog, app_key) == -1)\n"); - OUT("\t\treturn -1; /* Alphabet (sic!) test failed. */\n"); + OUT("if(UTF8String_length((const UTF8String_t *)sptr) < 0)\n"); + OUT("\treturn -1; /* Alphabet (sic!) test failed. */\n"); OUT("\n"); } else { if(use_table) { @@ -511,8 +509,13 @@ emit_size_determination_code(arg_t *arg, asn1p_expr_type_e etype) { OUT("size = st->size >> 1;\t/* 2 byte per character */\n"); break; case ASN_STRING_UTF8String: - OUT("size = UTF8String_length(st, td->name, app_errlog, app_key);\n"); - OUT("if(size == (size_t)-1) return -1;\n"); + OUT("size = UTF8String_length(st);\n"); + OUT("if((ssize_t)size < 0) {\n"); + OUT("\t_ASN_ERRLOG(app_errlog, app_key,\n"); + OUT("\t\t\"%%s: UTF-8: broken encoding (%%s:%%d)\",\n"); + OUT("\t\ttd->name, __FILE__, __LINE__);\n"); + OUT("\treturn -1;\n"); + OUT("}\n"); break; case ASN_CONSTR_SET_OF: case ASN_CONSTR_SEQUENCE_OF: From 2955459824f39579e464065bc2822af16c9c1ab8 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 3 Oct 2004 09:10:40 +0000 Subject: [PATCH 0474/1469] CANONICAL-XER git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@474 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 4 +++- TODO | 16 +++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1935511ff..5adde5a53 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,10 +1,12 @@ -0.9.7: 2004-Oct-02 +0.9.7: 2004-Oct-03 * Fixed unber limits controlling logic. * Removed C99'izm from the x509dump, now understood by older compilers. * Enhanced UTF8String constraint validation, now it checks for the minimal encoding length; API of UTF8String_length() changed. + * Finished CANONICAL-XER implementation by adding SET and SET OF + canonical ordering support. 0.9.6: 2004-Sep-29 diff --git a/TODO b/TODO index 16a102b4c..e341a102e 100644 --- a/TODO +++ b/TODO @@ -1,16 +1,18 @@ MAJOR: -1. Support for PER encoding. Requires advanced subtype constraints support, -which is already completed. +1. Support for XER decoding. + Status: The BASIC-XER and CANONICAL-XER are implemented. + The XER decoding is not yet implemented. -2. Support for XER decoding (the BASIC-XER encoding is already implemented). +2. Support for PER encoding. Requires advanced subtype constraints support, +which is already completed. 3. Support for Information Object Classes. - Status: support for parsing IOCs is mostly present. Support for slicing - the IOCs to produce "views" is not yet designed. - + Status: Support for parsing IOCs is mostly present. + Support for slicing the IOCs to produce "views" + is not yet designed. MINOR: 1. Support for DEFAULT encoding and decoding, at least in INTEGER/ENUMERATED types. -2. Support for EXTERNAL, EMBEDDED-PDV and CHARACTER STRING types. +3. Support for EXTERNAL, EMBEDDED-PDV and CHARACTER STRING types. From a329666f880573ddf576006689e90e02d3bf1b97 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 3 Oct 2004 09:12:07 +0000 Subject: [PATCH 0475/1469] Support for canonical CANONICAL-XER ordering git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@475 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SET.c | 75 +++++++++++++++---------------- skeletons/constr_SET.h | 9 ++++ skeletons/constr_SET_OF.c | 94 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 138 insertions(+), 40 deletions(-) diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index d9f93c3b2..a64c2ff48 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -435,11 +435,11 @@ SET_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, */ asn_enc_rval_t SET_encode_der(asn_TYPE_descriptor_t *td, - void *ptr, int tag_mode, ber_tlv_tag_t tag, + void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn_SET_specifics_t *specs = (asn_SET_specifics_t *)td->specifics; size_t computed_size = 0; - asn_enc_rval_t my_erval; + asn_enc_rval_t er; int t2m_build_own = (specs->tag2el_count != td->elements_count); asn_TYPE_tag2member_t *t2m; int t2m_count; @@ -451,12 +451,7 @@ SET_encode_der(asn_TYPE_descriptor_t *td, */ if(t2m_build_own) { (void *)t2m = alloca(td->elements_count * sizeof(t2m[0])); - if(!t2m) { /* There are such platforms */ - my_erval.encoded = -1; - my_erval.failed_type = td; - my_erval.structure_ptr = ptr; - return my_erval; - } + if(!t2m) _ASN_ENCODE_FAILED; /* There are such platforms */ t2m_count = 0; } else { /* @@ -472,14 +467,14 @@ SET_encode_der(asn_TYPE_descriptor_t *td, */ for(edx = 0; edx < td->elements_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; - asn_enc_rval_t erval; + asn_enc_rval_t tmper; void *memb_ptr; /* * Compute the length of the encoding of this member. */ if(elm->flags & ATF_POINTER) { - memb_ptr = *(void **)((char *)ptr + elm->memb_offset); + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); if(!memb_ptr) { if(t2m_build_own) { t2m[t2m_count].el_no = edx; @@ -489,14 +484,14 @@ SET_encode_der(asn_TYPE_descriptor_t *td, continue; } } else { - memb_ptr = (void *)((char *)ptr + elm->memb_offset); + memb_ptr = (void *)((char *)sptr + elm->memb_offset); } - erval = elm->type->der_encoder(elm->type, memb_ptr, + tmper = elm->type->der_encoder(elm->type, memb_ptr, elm->tag_mode, elm->tag, 0, 0); - if(erval.encoded == -1) - return erval; - computed_size += erval.encoded; + if(tmper.encoded == -1) + return tmper; + computed_size += tmper.encoded; /* * Remember the outmost tag of this member. @@ -533,72 +528,74 @@ SET_encode_der(asn_TYPE_descriptor_t *td, * Encode the TLV for the sequence itself. */ ret = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key); - if(ret == -1) { - my_erval.encoded = -1; - my_erval.failed_type = td; - my_erval.structure_ptr = ptr; - return my_erval; - } - my_erval.encoded = computed_size + ret; + if(ret == -1) _ASN_ENCODE_FAILED; + er.encoded = computed_size + ret; - if(!cb) return my_erval; + if(!cb) return er; /* * Encode all members. */ for(edx = 0; edx < td->elements_count; edx++) { asn_TYPE_member_t *elm; - asn_enc_rval_t erval; + asn_enc_rval_t tmper; void *memb_ptr; /* Encode according to the tag order */ elm = &td->elements[t2m[edx].el_no]; if(elm->flags & ATF_POINTER) { - memb_ptr = *(void **)((char *)ptr + elm->memb_offset); + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); if(!memb_ptr) continue; } else { - memb_ptr = (void *)((char *)ptr + elm->memb_offset); + memb_ptr = (void *)((char *)sptr + elm->memb_offset); } - erval = elm->type->der_encoder(elm->type, memb_ptr, + tmper = elm->type->der_encoder(elm->type, memb_ptr, elm->tag_mode, elm->tag, cb, app_key); - if(erval.encoded == -1) - return erval; - computed_size -= erval.encoded; + if(tmper.encoded == -1) + return tmper; + computed_size -= tmper.encoded; } if(computed_size != 0) { /* * Encoded size is not equal to the computed size. */ - my_erval.encoded = -1; - my_erval.failed_type = td; - my_erval.structure_ptr = ptr; + _ASN_ENCODE_FAILED; } - return my_erval; + return er; } asn_enc_rval_t SET_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { + asn_SET_specifics_t *specs = (asn_SET_specifics_t *)td->specifics; asn_enc_rval_t er; int xcan = (flags & XER_F_CANONICAL); + asn_TYPE_tag2member_t *t2m = specs->tag2el_cxer; + int t2m_count = specs->tag2el_cxer_count; int edx; if(!sptr) _ASN_ENCODE_FAILED; + assert(t2m_count == td->elements_count); + er.encoded = 0; - for(edx = 0; edx < td->elements_count; edx++) { + for(edx = 0; edx < t2m_count; edx++) { asn_enc_rval_t tmper; - asn_TYPE_member_t *elm = &td->elements[edx]; + asn_TYPE_member_t *elm; void *memb_ptr; - const char *mname = elm->name; - unsigned int mlen = strlen(elm->name); + const char *mname; + unsigned int mlen; + + elm = &td->elements[t2m[edx].el_no]; + mname = elm->name; + mlen = strlen(elm->name); if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)sptr + elm->memb_offset); @@ -624,6 +621,8 @@ SET_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); return er; +cb_failed: + _ASN_ENCODE_FAILED; } int diff --git a/skeletons/constr_SET.h b/skeletons/constr_SET.h index 8f9b265cb..41d6a7fb9 100644 --- a/skeletons/constr_SET.h +++ b/skeletons/constr_SET.h @@ -18,10 +18,19 @@ typedef struct asn_SET_specifics_s { /* * Tags to members mapping table (sorted). + * Sometimes suitable for DER encoding (untagged CHOICE is present); + * if so, tag2el_count will be greater than td->elements_count. */ asn_TYPE_tag2member_t *tag2el; int tag2el_count; + /* + * Tags to members mapping table, second edition. + * Suitable for CANONICAL-XER encoding. + */ + asn_TYPE_tag2member_t *tag2el_cxer; + int tag2el_cxer_count; + /* * Extensions-related stuff. */ diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index 00c4cb3dd..c298cc297 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -5,6 +5,7 @@ #include #include #include +#include /* * Number of bytes left for this structure. @@ -449,6 +450,43 @@ SET_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, return erval; } +typedef struct xer_tmp_enc_s { + void *buffer; + size_t offset; + size_t size; +} xer_tmp_enc_t; +static int +SET_OF_encode_xer_callback(const void *buffer, size_t size, void *key) { + xer_tmp_enc_t *t = (xer_tmp_enc_t *)key; + if(t->offset + size >= t->size) { + size_t newsize = (t->size << 2) + size; + void *p = REALLOC(t->buffer, newsize); + if(!p) return -1; + t->buffer = p; + t->size = newsize; + } + memcpy((char *)t->buffer + t->offset, buffer, size); + t->offset += size; + return 0; +} +static int +SET_OF_xer_order(const void *aptr, const void *bptr) { + const xer_tmp_enc_t *a = (const xer_tmp_enc_t *)aptr; + const xer_tmp_enc_t *b = (const xer_tmp_enc_t *)bptr; + size_t minlen = a->offset; + int ret; + if(b->offset < minlen) minlen = b->offset; + /* Well-formed UTF-8 has this nice lexicographical property... */ + ret = memcmp(a->buffer, b->buffer, minlen); + if(ret != 0) return ret; + if(a->offset == b->offset) + return 0; + if(a->offset == minlen) + return -1; + return 1; +} + + asn_enc_rval_t SET_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, @@ -461,19 +499,36 @@ SET_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, ? 0 : ((*element->name) ? element->name : element->type->name); size_t mlen = mname ? strlen(mname) : 0; int xcan = (flags & XER_F_CANONICAL); + xer_tmp_enc_t *encs = 0; + size_t encs_count = 0; + void *original_app_key = app_key; + asn_app_consume_bytes_f *original_cb = cb; int i; if(!sptr) _ASN_ENCODE_FAILED; + (void *)list = sptr; + + if(xcan) { + encs = (xer_tmp_enc_t *)MALLOC(list->count * sizeof(encs[0])); + if(!encs) _ASN_ENCODE_FAILED; + cb = SET_OF_encode_xer_callback; + } + er.encoded = 0; - (void *)list = sptr; for(i = 0; i < list->count; i++) { asn_enc_rval_t tmper; void *memb_ptr = list->array[i]; if(!memb_ptr) continue; + if(encs) { + memset(&encs[encs_count], 0, sizeof(encs[0])); + app_key = &encs[encs_count]; + encs_count++; + } + if(mname) { if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel); _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); @@ -481,7 +536,11 @@ SET_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, tmper = element->type->xer_encoder(element->type, memb_ptr, ilevel + 1, flags, cb, app_key); - if(tmper.encoded == -1) return tmper; + if(tmper.encoded == -1) { + td = tmper.failed_type; + sptr = tmper.structure_ptr; + goto cb_failed; + } if(mname) { _ASN_CALLBACK3("", 1); @@ -493,6 +552,37 @@ SET_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); + if(encs) { + xer_tmp_enc_t *enc = encs; + xer_tmp_enc_t *end = encs + encs_count; + ssize_t control_size = 0; + + cb = original_cb; + app_key = original_app_key; + qsort(encs, encs_count, sizeof(encs[0]), SET_OF_xer_order); + + for(; enc < end; enc++) { + _ASN_CALLBACK(enc->buffer, enc->offset); + FREEMEM(enc->buffer); + enc->buffer = 0; + control_size += enc->offset; + } + assert(control_size == er.encoded); + } + + goto cleanup; +cb_failed: + er.encoded = -1; + er.failed_type = td; + er.structure_ptr = sptr; +cleanup: + if(encs) { + while(encs_count-- > 0) { + if(encs[encs_count].buffer) + FREEMEM(encs[encs_count].buffer); + } + free(encs); + } return er; } From 84d551b58bfd22825e1dae0acd468510507c9ff9 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 3 Oct 2004 09:13:02 +0000 Subject: [PATCH 0476/1469] allow local cleanup git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@476 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/BIT_STRING.c | 2 ++ skeletons/BOOLEAN.c | 2 ++ skeletons/OCTET_STRING.c | 13 ++++++------- skeletons/REAL.c | 2 +- skeletons/asn_internal.h | 4 ++-- skeletons/constr_CHOICE.c | 2 ++ skeletons/constr_SEQUENCE.c | 2 ++ skeletons/constr_SEQUENCE_OF.c | 2 ++ skeletons/xer_encoder.c | 13 +++++-------- 9 files changed, 24 insertions(+), 18 deletions(-) diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index b3b77d1f9..19c81e725 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -126,6 +126,8 @@ BIT_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); return er; +cb_failed: + _ASN_ENCODE_FAILED; } diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c index 992b9a892..43b890f2b 100644 --- a/skeletons/BOOLEAN.c +++ b/skeletons/BOOLEAN.c @@ -148,6 +148,8 @@ BOOLEAN_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, } return er; +cb_failed: + _ASN_ENCODE_FAILED; } int diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 2730fc4d7..e3b7a0aba 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -571,12 +571,8 @@ OCTET_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, uint8_t *end; size_t i; - if(!st || !st->buf) { - er.encoded = -1; - er.failed_type = td; - er.structure_ptr = sptr; - return er; - } + if(!st || !st->buf) + _ASN_ENCODE_FAILED; er.encoded = 0; @@ -621,6 +617,8 @@ OCTET_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, } return er; +cb_failed: + _ASN_ENCODE_FAILED; } asn_enc_rval_t @@ -636,7 +634,8 @@ OCTET_STRING_encode_xer_ascii(asn_TYPE_descriptor_t *td, void *sptr, if(!st || !st->buf) _ASN_ENCODE_FAILED; - _ASN_CALLBACK(st->buf, st->size); + if(cb(st->buf, st->size, app_key) < 0) + _ASN_ENCODE_FAILED; er.encoded = st->size; return er; diff --git a/skeletons/REAL.c b/skeletons/REAL.c index c6d90f332..6d3e55e6a 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -12,7 +12,7 @@ #undef INT_MAX #define INT_MAX ((int)(((unsigned int)-1) >> 1)) -static const double real_zero; +static volatile double real_zero = 0.0; #ifndef NAN #define NAN (real_zero/real_zero) #endif diff --git a/skeletons/asn_internal.h b/skeletons/asn_internal.h index e8a699391..a7690eb0c 100644 --- a/skeletons/asn_internal.h +++ b/skeletons/asn_internal.h @@ -46,9 +46,9 @@ static void ASN_DEBUG(const char *fmt, ...) { (void)fmt; }; /* * Invoke the application-supplied callback and fail, if something is wrong. */ -#define __ASN_E_cbc(buf, size) (cb((buf), (size), app_key) == -1) +#define __ASN_E_cbc(buf, size) (cb((buf), (size), app_key) < 0) #define _ASN_E_CALLBACK(foo) do { \ - if(foo) _ASN_ENCODE_FAILED; \ + if(foo) goto cb_failed; \ } while(0) #define _ASN_CALLBACK(buf, size) \ _ASN_E_CALLBACK(__ASN_E_cbc(buf, size)) diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 4db6d7b16..46fd5210a 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -588,6 +588,8 @@ CHOICE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, if(!(flags & XER_F_CANONICAL)) _i_ASN_TEXT_INDENT(1, ilevel - 1); return er; +cb_failed: + _ASN_ENCODE_FAILED; } int diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 07c777289..83da765e7 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -623,6 +623,8 @@ SEQUENCE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); return er; +cb_failed: + _ASN_ENCODE_FAILED; } int diff --git a/skeletons/constr_SEQUENCE_OF.c b/skeletons/constr_SEQUENCE_OF.c index b99831f94..3d526d011 100644 --- a/skeletons/constr_SEQUENCE_OF.c +++ b/skeletons/constr_SEQUENCE_OF.c @@ -128,5 +128,7 @@ SEQUENCE_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); return er; +cb_failed: + _ASN_ENCODE_FAILED; } diff --git a/skeletons/xer_encoder.c b/skeletons/xer_encoder.c index 3c97a8f7b..d3f04d66a 100644 --- a/skeletons/xer_encoder.c +++ b/skeletons/xer_encoder.c @@ -19,12 +19,7 @@ xer_encode(asn_TYPE_descriptor_t *td, void *sptr, size_t mlen; int xcan = (xer_flags & XER_F_CANONICAL) ? 1 : 2; - if(!td || !sptr) { - er.encoded = -1; - er.failed_type = td; - er.structure_ptr = sptr; - return er; - } + if(!td || !sptr) goto cb_failed; mname = td->name; mlen = strlen(mname); @@ -34,11 +29,13 @@ xer_encode(asn_TYPE_descriptor_t *td, void *sptr, tmper = td->xer_encoder(td, sptr, 1, xer_flags, cb, app_key); if(tmper.encoded == -1) return tmper; - _ASN_CALLBACK3("\n",xcan); + _ASN_CALLBACK3("\n", xcan); - er.encoded = 2 + (2 * xcan) + (2 * mlen) + tmper.encoded; + er.encoded = 4 + xcan + (2 * mlen) + tmper.encoded; return er; +cb_failed: + _ASN_ENCODE_FAILED; } /* From 940bc6b70ddad250b5bbd068d1cc2d298e1de902 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 3 Oct 2004 09:13:30 +0000 Subject: [PATCH 0477/1469] order tables for CANONICAL-XER git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@477 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 92 +++++++++++++++++++++++++++++---------- 1 file changed, 69 insertions(+), 23 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 4a34bd48c..c91a50ba4 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -17,8 +17,12 @@ typedef struct tag2el_s { asn1p_expr_t *from_expr; } tag2el_t; -static int _fill_tag2el_map(arg_t *arg, tag2el_t **tag2el, int *count, int el_no); -static int _add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no); +typedef enum fte { + FTE_ALLTAGS, + FTE_CANONICAL_XER, +} fte_e; +static int _fill_tag2el_map(arg_t *arg, tag2el_t **tag2el, int *count, int el_no, fte_e flags); +static int _add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no, fte_e flags); static int asn1c_lang_C_type_SEQUENCE_def(arg_t *arg); static int asn1c_lang_C_type_SET_def(arg_t *arg); @@ -30,7 +34,7 @@ static int expr_better_indirect(arg_t *arg, asn1p_expr_t *expr); static int expr_as_xmlvaluelist(arg_t *arg, asn1p_expr_t *expr); static int expr_elements_count(arg_t *arg, asn1p_expr_t *expr); static int emit_member_table(arg_t *arg, asn1p_expr_t *expr); -static int emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count); +static int emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count, const char *opt_modifier); enum tvm_compat { _TVM_SAME = 0, /* tags and all_tags are same */ @@ -163,7 +167,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { /* * Fetch every inner tag from the tag to elements map. */ - if(_fill_tag2el_map(arg, &tag2el, &tag2el_count, -1)) { + if(_fill_tag2el_map(arg, &tag2el, &tag2el_count, -1, FTE_ALLTAGS)) { if(tag2el) free(tag2el); return -1; } @@ -208,7 +212,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { /* * Tags to elements map. */ - emit_tag2member_map(arg, tag2el, tag2el_count); + emit_tag2member_map(arg, tag2el, tag2el_count, 0); p = MKID(expr->Identifier); OUT("static asn_SEQUENCE_specifics_t asn_DEF_%s_specs = {\n", p); @@ -309,6 +313,8 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { int elements; tag2el_t *tag2el = NULL; int tag2el_count = 0; + tag2el_t *tag2el_cxer = NULL; + int tag2el_cxer_count = 0; int tags_count; int all_tags_count; enum tvm_compat tv_mode; @@ -317,10 +323,20 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { /* * Fetch every inner tag from the tag to elements map. */ - if(_fill_tag2el_map(arg, &tag2el, &tag2el_count, -1)) { + if(_fill_tag2el_map(arg, &tag2el, &tag2el_count, -1, FTE_ALLTAGS)) { if(tag2el) free(tag2el); return -1; } + if(_fill_tag2el_map(arg, &tag2el_cxer, &tag2el_cxer_count, -1, FTE_CANONICAL_XER)) { + if(tag2el) free(tag2el); + if(tag2el_cxer) free(tag2el_cxer); + return -1; + } + if(tag2el_cxer_count == tag2el_count + && memcmp(tag2el, tag2el_cxer, tag2el_count) == 0) { + free(tag2el_cxer); + tag2el_cxer = 0; + } GEN_INCLUDE("constr_SET"); if(!arg->embed) @@ -362,7 +378,9 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { /* * Tags to elements map. */ - emit_tag2member_map(arg, tag2el, tag2el_count); + emit_tag2member_map(arg, tag2el, tag2el_count, 0); + if(tag2el_cxer) + emit_tag2member_map(arg, tag2el_cxer, tag2el_cxer_count, "_cxer"); /* * Emit a map of mandatory elements. @@ -404,6 +422,11 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { OUT("offsetof(struct %s, _presence_map),\n", p); OUT("asn_DEF_%s_tag2el,\n", p); OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); + if(tag2el_cxer) + OUT("asn_DEF_%s_tag2el_cxer,\n", p); + else + OUT("asn_DEF_%s_tag2el,\t/* Same as above */\n", p); + OUT("%d,\t/* Count of tags in the CANONICAL-XER map */\n", tag2el_cxer_count); OUT("%d,\t/* Whether extensible */\n", check_if_extensible(expr)); OUT("(unsigned int *)asn_DEF_%s_mmap\t/* Mandatory elements map */\n", p); @@ -617,7 +640,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { /* * Fetch every inner tag from the tag to elements map. */ - if(_fill_tag2el_map(arg, &tag2el, &tag2el_count, -1)) { + if(_fill_tag2el_map(arg, &tag2el, &tag2el_count, -1, FTE_ALLTAGS)) { if(tag2el) free(tag2el); return -1; } @@ -669,7 +692,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { /* * Tags to elements map. */ - emit_tag2member_map(arg, tag2el, tag2el_count); + emit_tag2member_map(arg, tag2el, tag2el_count, 0); p = MKID(expr->Identifier); OUT("static asn_CHOICE_specifics_t asn_DEF_%s_specs = {\n", p); @@ -1052,31 +1075,54 @@ _tag2el_cmp(const void *ap, const void *bp) { * } */ static int -_fill_tag2el_map(arg_t *arg, tag2el_t **tag2el, int *count, int el_no) { +_fill_tag2el_map(arg_t *arg, tag2el_t **tag2el, int *count, int el_no, fte_e flags) { asn1p_expr_t *expr = arg->expr; arg_t tmparg = *arg; asn1p_expr_t *v; int element = 0; + int original_count = *count; + int sort_until = -1; TQ_FOR(v, &(expr->members), next) { - if(v->expr_type == A1TC_EXTENSIBLE) + if(v->expr_type == A1TC_EXTENSIBLE) { + /* + * CANONICAL-XER mandates sorting + * only for the root part. + */ + if(flags == FTE_CANONICAL_XER + && sort_until == -1) + sort_until = *count; continue; + } tmparg.expr = v; if(_add_tag2el_member(&tmparg, tag2el, count, - (el_no==-1)?element:el_no)) { + (el_no==-1)?element:el_no, flags)) { return -1; } element++; } - /* - * Sort the map according to canonical order of their tags - * and element numbers. - */ - qsort(*tag2el, *count, sizeof(**tag2el), _tag2el_cmp); + + if(flags == FTE_CANONICAL_XER) { + if(sort_until == -1) sort_until = *count; + qsort((*tag2el) + original_count, + sort_until - original_count, + sizeof(**tag2el), _tag2el_cmp); + if(arg->expr->expr_type == ASN_CONSTR_CHOICE + && (sort_until - original_count) >= 1) { + /* Only take in account the root component */ + *count = original_count + 1; + } + } else { + /* + * Sort the map according to canonical order of their + * tags and element numbers. + */ + qsort(*tag2el, *count, sizeof(**tag2el), _tag2el_cmp); + } /* * Initialize .toff_{first|last} members. @@ -1105,7 +1151,7 @@ _fill_tag2el_map(arg_t *arg, tag2el_t **tag2el, int *count, int el_no) { } static int -_add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no) { +_add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no, fte_e flags) { struct asn1p_type_tag_s tag; int ret; @@ -1151,7 +1197,7 @@ _add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no) { * Iterate over members of CHOICE type. */ if(arg->expr->expr_type == ASN_CONSTR_CHOICE) { - return _fill_tag2el_map(arg, tag2el, count, el_no); + return _fill_tag2el_map(arg, tag2el, count, el_no, flags); } if(arg->expr->expr_type == A1TC_REFERENCE) { @@ -1162,7 +1208,7 @@ _add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no) { if(expr) { tmp.mod = expr->module; tmp.expr = expr; - return _add_tag2el_member(&tmp, tag2el, count, el_no); + return _add_tag2el_member(&tmp, tag2el, count, el_no, flags); } else { FATAL("Cannot dereference %s at line %d", arg->expr->Identifier, @@ -1179,11 +1225,11 @@ _add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no) { } static int -emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count) { +emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count, const char *opt_modifier) { asn1p_expr_t *expr = arg->expr; - OUT("static asn_TYPE_tag2member_t asn_DEF_%s_tag2el[] = {\n", - MKID(expr->Identifier)); + OUT("static asn_TYPE_tag2member_t asn_DEF_%s_tag2el%s[] = {\n", + MKID(expr->Identifier), opt_modifier?opt_modifier:""); if(tag2el_count) { int i; for(i = 0; i < tag2el_count; i++) { From ce0d4ad70c81f2d9378bb8450592359140e0bb3c Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 3 Oct 2004 09:14:32 +0000 Subject: [PATCH 0478/1469] additional UTF8 testing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@478 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/50-constraint-OK.asn1.-P | 152 +++++++++++++++++++++++++++++++-- 1 file changed, 144 insertions(+), 8 deletions(-) diff --git a/tests/50-constraint-OK.asn1.-P b/tests/50-constraint-OK.asn1.-P index 399868bf9..9eba46950 100644 --- a/tests/50-constraint-OK.asn1.-P +++ b/tests/50-constraint-OK.asn1.-P @@ -2283,6 +2283,142 @@ asn_TYPE_descriptor_t asn_DEF_Neither_SIZE_nor_FROM = { }; +/*** <<< INCLUDES [Utf8-4] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Utf8-4] >>> ***/ + + +typedef UTF8String_t Utf8_4_t; + +/*** <<< FUNC-DECLS [Utf8-4] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Utf8_4; +asn_struct_free_f Utf8_4_free; +asn_struct_print_f Utf8_4_print; +asn_constr_check_f Utf8_4_constraint; +ber_type_decoder_f Utf8_4_decode_ber; +der_type_encoder_f Utf8_4_encode_der; +xer_type_encoder_f Utf8_4_encode_xer; + +/*** <<< CTABLES [Utf8-4] >>> ***/ + +static int check_permitted_alphabet_12(const void *sptr) { + if(UTF8String_length((const UTF8String_t *)sptr) < 0) + return -1; /* Alphabet (sic!) test failed. */ + + return 0; +} + + +/*** <<< CODE [Utf8-4] >>> ***/ + +int +Utf8_4_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const UTF8String_t *st = sptr; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(!check_permitted_alphabet_12(sptr)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using UTF8String, + * so here we adjust the DEF accordingly. + */ +static void +Utf8_4_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_UTF8String.free_struct; + td->print_struct = asn_DEF_UTF8String.print_struct; + td->ber_decoder = asn_DEF_UTF8String.ber_decoder; + td->der_encoder = asn_DEF_UTF8String.der_encoder; + td->xer_decoder = asn_DEF_UTF8String.xer_decoder; + td->xer_encoder = asn_DEF_UTF8String.xer_encoder; + td->elements = asn_DEF_UTF8String.elements; + td->elements_count = asn_DEF_UTF8String.elements_count; + td->specifics = asn_DEF_UTF8String.specifics; +} + +void +Utf8_4_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Utf8_4_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Utf8_4_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_4_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +ber_dec_rval_t +Utf8_4_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, void *bufptr, size_t size, int tag_mode) { + Utf8_4_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Utf8_4_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_4_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_enc_rval_t +Utf8_4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_4_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + + +/*** <<< STAT-DEFS [Utf8-4] >>> ***/ + +static ber_tlv_tag_t asn_DEF_Utf8_4_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_Utf8_4 = { + "Utf8-4", + Utf8_4_free, + Utf8_4_print, + Utf8_4_constraint, + Utf8_4_decode_ber, + Utf8_4_encode_der, + 0, /* Not implemented yet */ + Utf8_4_encode_xer, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Utf8_4_tags, + sizeof(asn_DEF_Utf8_4_tags) + /sizeof(asn_DEF_Utf8_4_tags[0]), /* 1 */ + asn_DEF_Utf8_4_tags, /* Same as above */ + sizeof(asn_DEF_Utf8_4_tags) + /sizeof(asn_DEF_Utf8_4_tags[0]), /* 1 */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + /*** <<< INCLUDES [Utf8-3] >>> ***/ #include @@ -2304,7 +2440,7 @@ xer_type_encoder_f Utf8_3_encode_xer; /*** <<< CTABLES [Utf8-3] >>> ***/ -static int permitted_alphabet_table_12[128] = { +static int permitted_alphabet_table_13[128] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ @@ -2315,8 +2451,8 @@ static int permitted_alphabet_table_12[128] = { 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, /* pqrstuvwxyz */ }; -static int check_permitted_alphabet_12(const void *sptr) { - int *table = permitted_alphabet_table_12; +static int check_permitted_alphabet_13(const void *sptr) { + int *table = permitted_alphabet_table_13; /* The underlying type is UTF8String */ const UTF8String_t *st = sptr; const uint8_t *ch = st->buf; @@ -2355,7 +2491,7 @@ Utf8_3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, } if((size >= 1 && size <= 2) - && !check_permitted_alphabet_12(sptr)) { + && !check_permitted_alphabet_13(sptr)) { /* Constraint check succeeded */ return 0; } else { @@ -2640,7 +2776,7 @@ xer_type_encoder_f Identifier_encode_xer; /*** <<< CTABLES [Identifier] >>> ***/ -static int permitted_alphabet_table_14[256] = { +static int permitted_alphabet_table_15[256] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, /* $ */ @@ -2651,8 +2787,8 @@ static int permitted_alphabet_table_14[256] = { 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, /* pqrstuvwxyz */ }; -static int check_permitted_alphabet_14(const void *sptr) { - int *table = permitted_alphabet_table_14; +static int check_permitted_alphabet_15(const void *sptr) { + int *table = permitted_alphabet_table_15; /* The underlying type is VisibleString */ const VisibleString_t *st = sptr; const uint8_t *ch = st->buf; @@ -2684,7 +2820,7 @@ Identifier_constraint(asn_TYPE_descriptor_t *td, const void *sptr, size = st->size; if((size >= 1 && size <= 32) - && !check_permitted_alphabet_14(sptr)) { + && !check_permitted_alphabet_15(sptr)) { /* Constraint check succeeded */ return 0; } else { From 0789113c939d2ff6b827056fbdc81ad165739e3b Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 3 Oct 2004 09:14:49 +0000 Subject: [PATCH 0479/1469] CANONICAL-XER testing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@479 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-30.c | 66 +++++++++++++++---- asn1c/tests/check-31.c | 36 +++++++++++ asn1c/tests/check-35.c | 39 +++++++++++- tests/30-set-OK.asn1 | 6 +- tests/30-set-OK.asn1.-P | 109 +++++++++++++++++++++++++++++++ tests/31-set-of-OK.asn1 | 10 ++- tests/31-set-of-OK.asn1.-EF | 11 +++- tests/31-set-of-OK.asn1.-P | 117 +++++++++++++++++++++++++++++----- tests/43-recursion-OK.asn1.-P | 4 ++ tests/47-set-ext-OK.asn1.-P | 4 ++ 10 files changed, 364 insertions(+), 38 deletions(-) create mode 100644 tests/30-set-OK.asn1.-P diff --git a/asn1c/tests/check-30.c b/asn1c/tests/check-30.c index 3389d5391..c1528b9f5 100644 --- a/asn1c/tests/check-30.c +++ b/asn1c/tests/check-30.c @@ -53,12 +53,12 @@ uint8_t buf3[] = { 32 | 17, /* [UNIVERSAL 17], constructed */ 14, /* L */ - /* a INTEGER */ + /* INTEGER */ 64 | 3, /* [APPLICATION 3] */ 1, /* L */ 96, - /* b IA5String */ + /* IA5String */ 22, /* [UNIVERSAL 22] */ 3, /* L */ 'x', @@ -70,7 +70,7 @@ uint8_t buf3[] = { 1, /* L */ 96, - /* c [2] BOOLEAN */ + /* [2] BOOLEAN */ ((2 << 6) + 2), /* [2] */ 1, /* L */ 0xff @@ -115,12 +115,12 @@ uint8_t buf5[] = { 32 | 17, /* [UNIVERSAL 17], constructed */ 0x80, /* indefinite L */ - /* a INTEGER */ + /* INTEGER */ 64 | 3, /* [APPLICATION 3] */ 1, /* L */ 96, - /* b IA5String */ + /* IA5String */ 22, /* [UNIVERSAL 22] */ 3, /* L */ 'x', @@ -159,26 +159,61 @@ check(int is_ok, uint8_t *buf, int size, size_t consumed) { assert(rval.code == RC_OK); assert(rval.consumed == consumed); - assert(t.a.size == 1); - assert(t.a.buf[0] == 96); - assert(t.b.size == 3); - assert(strcmp(t.b.buf, "xyz") == 0); + assert(t.i.size == 1); + assert(t.i.buf[0] == 96); + assert(t.s.size == 3); + assert(strcmp(t.s.buf, "xyz") == 0); if(buf == buf3) { - assert(t.c); + assert(t.b); } else { - assert(t.c == 0); + assert(t.b == 0); } } else { if(rval.code == RC_OK) { - assert(t.a.size != 1 - || t.b.size != 3 - || !t.c + assert(t.i.size != 1 + || t.s.size != 3 + || !t.b ); } assert(rval.consumed <= consumed); } } + +static char xer_buf[128]; +static int xer_off; + +static int +xer_cb(const void *buffer, size_t size, void *key) { + (void)key; + assert(xer_off + size < sizeof(xer_buf)); + memcpy(xer_buf + xer_off, buffer, size); + xer_off += size; + return 0; +} + +static void +check_xer(uint8_t *buf, uint8_t size, char *xer_sample) { + T_t *tp = 0; + ber_dec_rval_t rval; + asn_enc_rval_t er; + int xer_sample_len = strlen(xer_sample); + + rval = ber_decode(0, &asn_DEF_T, (void **)&tp, buf, size); + assert(rval.code == RC_OK); + assert(rval.consumed == size); + assert(tp); + + xer_off = 0; + er = xer_encode(&asn_DEF_T, tp, XER_F_CANONICAL, xer_cb, 0); + assert(er.encoded == xer_off); + assert(xer_off); + xer_buf[xer_off] = 0; + printf("[%s] vs [%s]\n", xer_buf, xer_sample); + assert(xer_off = xer_sample_len); + assert(memcmp(xer_buf, xer_sample, xer_off) == 0); +} + static void try_corrupt(uint8_t *buf, int size) { uint8_t *tmp; @@ -219,6 +254,9 @@ main(int ac, char **av) { check(1, buf5, sizeof(buf5) + 1, sizeof(buf5)); check(0, buf5, sizeof(buf5) - 1, sizeof(buf5)); + check_xer(buf1, sizeof(buf1), "xyz96"); + check_xer(buf3, sizeof(buf3), "xyz96"); + fprintf(stderr, "\nPseudo-random buffer corruptions must fail\n"); try_corrupt(buf1, sizeof(buf1)); diff --git a/asn1c/tests/check-31.c b/asn1c/tests/check-31.c index 06ad6b556..5c5075c4f 100644 --- a/asn1c/tests/check-31.c +++ b/asn1c/tests/check-31.c @@ -141,6 +141,41 @@ check(int is_ok, uint8_t *buf, int size, size_t consumed) { asn_DEF_Forest.free_struct(&asn_DEF_Forest, &t, 1); } +static char xer_buf[512]; +static int xer_off; + +static int +xer_cb(const void *buffer, size_t size, void *key) { + (void)key; + assert(xer_off + size < sizeof(xer_buf)); + memcpy(xer_buf + xer_off, buffer, size); + xer_off += size; + return 0; +} + +static void +check_xer(uint8_t *buf, uint8_t size, char *xer_sample) { + Forest_t *tp = 0; + ber_dec_rval_t rval; + asn_enc_rval_t er; + int xer_sample_len = strlen(xer_sample); + + rval = ber_decode(0, &asn_DEF_Forest, (void **)&tp, buf, size); + assert(rval.code == RC_OK); + assert(rval.consumed == size); + assert(tp); + + xer_off = 0; + er = xer_encode(&asn_DEF_Forest, tp, XER_F_CANONICAL, xer_cb, 0); + assert(er.encoded == xer_off); + assert(xer_off); + xer_buf[xer_off] = 0; + printf("[%s] vs [%s]\n", xer_buf, xer_sample); + assert(xer_off = xer_sample_len); + assert(memcmp(xer_buf, xer_sample, xer_off) == 0); +} + + static void try_corrupt(uint8_t *buf, int size) { uint8_t *tmp; @@ -174,6 +209,7 @@ main(int ac, char **av) { (void)av; /* Unused argument */ check(1, buf1, sizeof(buf1), sizeof(buf1)); + check_xer(buf1, sizeof(buf1), "1008011082"); try_corrupt(buf1, sizeof(buf1)); check(1, buf1, sizeof(buf1) + 20, sizeof(buf1)); diff --git a/asn1c/tests/check-35.c b/asn1c/tests/check-35.c index f54045189..87994c917 100644 --- a/asn1c/tests/check-35.c +++ b/asn1c/tests/check-35.c @@ -203,7 +203,7 @@ partial_read(uint8_t *buf, size_t size) { /* * Divide the space (size) into three blocks in various combinations: * |<----->i1<----->i2<----->| - * ^ buf ^ buf+size + * ^ buf ^ buf+size * Try to read block by block. */ for(i1 = 0; i1 < size; i1++) { @@ -262,6 +262,41 @@ partial_read(uint8_t *buf, size_t size) { } } +static char xer_buf[128]; +static int xer_off; + +static int +xer_cb(const void *buffer, size_t size, void *key) { + (void)key; + assert(xer_off + size < sizeof(xer_buf)); + memcpy(xer_buf + xer_off, buffer, size); + xer_off += size; + return 0; +} + +static void +check_xer(uint8_t *buf, uint8_t size, char *xer_sample) { + T_t *tp = 0; + ber_dec_rval_t rval; + asn_enc_rval_t er; + int xer_sample_len = strlen(xer_sample); + + rval = ber_decode(0, &asn_DEF_T, (void **)&tp, buf, size); + assert(rval.code == RC_OK); + assert(rval.consumed == size); + assert(tp); + + xer_off = 0; + er = xer_encode(&asn_DEF_T, tp, XER_F_CANONICAL, xer_cb, 0); + assert(er.encoded == xer_off); + assert(xer_off); + xer_buf[xer_off] = 0; + printf("[%s] vs [%s]\n", xer_buf, xer_sample); + assert(xer_off = xer_sample_len); + assert(memcmp(xer_buf, xer_sample, xer_off) == 0); +} + + int main(int ac, char **av) { T_t t; @@ -272,10 +307,12 @@ main(int ac, char **av) { check(&t, buf1, sizeof(buf1) + 10, sizeof(buf1)); compare(&t, buf1_reconstr, sizeof(buf1_reconstr)); asn_DEF_T.free_struct(&asn_DEF_T, &t, 1); + check_xer(buf1, sizeof(buf1), "z
    ns85.79"); check(&t, buf2, sizeof(buf2) + 10, sizeof(buf2)); compare(&t, buf2_reconstr, sizeof(buf2_reconstr)); asn_DEF_T.free_struct(&asn_DEF_T, &t, 1); + check_xer(buf2, sizeof(buf2), "zns2.1"); /* Split the buffer in parts and check decoder restartability */ partial_read(buf1, sizeof(buf1)); diff --git a/tests/30-set-OK.asn1 b/tests/30-set-OK.asn1 index 2cd6a5a42..41ad52d33 100644 --- a/tests/30-set-OK.asn1 +++ b/tests/30-set-OK.asn1 @@ -12,10 +12,10 @@ ModuleTestSetSimple BEGIN T ::= SET { - a [APPLICATION 3] INTEGER, - b IA5String, + i [APPLICATION 3] INTEGER, + s IA5String, ..., - c [2] BOOLEAN + b [2] BOOLEAN } END diff --git a/tests/30-set-OK.asn1.-P b/tests/30-set-OK.asn1.-P new file mode 100644 index 000000000..1ffd9b4be --- /dev/null +++ b/tests/30-set-OK.asn1.-P @@ -0,0 +1,109 @@ + +/*** <<< INCLUDES [T] >>> ***/ + +#include +#include +#include +#include + +/*** <<< DEPS [T] >>> ***/ + + +/* + * Method of determining the components presence + */ +typedef enum T_PR { + T_PR_i, /* Member i is present */ + T_PR_s, /* Member s is present */ + T_PR_b, /* Member b is present */ +} T_PR; +extern asn_TYPE_descriptor_t asn_DEF_T; + +/*** <<< TYPE-DECLS [T] >>> ***/ + + +typedef struct T { + INTEGER_t i; + IA5String_t s; + /* + * This type is extensible, + * possible extensions are below. + */ + BOOLEAN_t *b; + + /* Presence bitmask: ASN_SET_ISPRESENT(pT, T_PR_x) */ + unsigned int _presence_map + [((3+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))]; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} T_t; + +/*** <<< STAT-DEFS [T] >>> ***/ + +static asn_TYPE_member_t asn_MBR_T[] = { + { ATF_NOFLAGS, 0, offsetof(struct T, i), + .tag = (ASN_TAG_CLASS_APPLICATION | (3 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn_DEF_INTEGER, + .memb_constraints = 0, /* Defer to actual type */ + .name = "i" + }, + { ATF_NOFLAGS, 0, offsetof(struct T, s), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), + .tag_mode = 0, + .type = (void *)&asn_DEF_IA5String, + .memb_constraints = 0, /* Defer to actual type */ + .name = "s" + }, + { ATF_POINTER, 0, offsetof(struct T, b), + .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn_DEF_BOOLEAN, + .memb_constraints = 0, /* Defer to actual type */ + .name = "b" + }, +}; +static ber_tlv_tag_t asn_DEF_T_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) +}; +static asn_TYPE_tag2member_t asn_DEF_T_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), 1, 0, 0 }, /* s at 16 */ + { (ASN_TAG_CLASS_APPLICATION | (3 << 2)), 0, 0, 0 }, /* i at 15 */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* b at 18 */ +}; +static uint8_t asn_DEF_T_mmap[(3 + (8 * sizeof(unsigned int)) - 1) / 8] = { + (1 << 7) | (1 << 6) | (0 << 5) +}; +static asn_SET_specifics_t asn_DEF_T_specs = { + sizeof(struct T), + offsetof(struct T, _asn_ctx), + offsetof(struct T, _presence_map), + asn_DEF_T_tag2el, + 3, /* Count of tags in the map */ + asn_DEF_T_tag2el, /* Same as above */ + 3, /* Count of tags in the CANONICAL-XER map */ + 1, /* Whether extensible */ + (unsigned int *)asn_DEF_T_mmap /* Mandatory elements map */ +}; +asn_TYPE_descriptor_t asn_DEF_T = { + "T", + SET_free, + SET_print, + SET_constraint, + SET_decode_ber, + SET_encode_der, + 0, /* Not implemented yet */ + SET_encode_xer, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_T_tags, + sizeof(asn_DEF_T_tags) + /sizeof(asn_DEF_T_tags[0]), /* 1 */ + asn_DEF_T_tags, /* Same as above */ + sizeof(asn_DEF_T_tags) + /sizeof(asn_DEF_T_tags[0]), /* 1 */ + asn_MBR_T, + 3, /* Elements count */ + &asn_DEF_T_specs /* Additional specs */ +}; + diff --git a/tests/31-set-of-OK.asn1 b/tests/31-set-of-OK.asn1 index 6f36c0172..c8fa51eb1 100644 --- a/tests/31-set-of-OK.asn1 +++ b/tests/31-set-of-OK.asn1 @@ -20,8 +20,14 @@ BEGIN -- The following clause tests OPTIONAL. Stuff ::= SET { - trees [0] SET OF Forest OPTIONAL, - anything [1] SET OF + trees [1] SET OF Forest OPTIONAL, + ..., + other CHOICE { + a [0] INTEGER, + b [3] INTEGER + }, + ..., + anything [2] SET OF SEQUENCE { cup-of-coffee BIT STRING, ... diff --git a/tests/31-set-of-OK.asn1.-EF b/tests/31-set-of-OK.asn1.-EF index 692450b1a..2efaccc5c 100644 --- a/tests/31-set-of-OK.asn1.-EF +++ b/tests/31-set-of-OK.asn1.-EF @@ -12,11 +12,16 @@ Tree ::= SEQUENCE { } Stuff ::= SET { - trees [0] IMPLICIT SET OF Forest OPTIONAL, - anything [1] IMPLICIT SET OF SEQUENCE { + trees [1] IMPLICIT SET OF Forest OPTIONAL, + anything [2] IMPLICIT SET OF SEQUENCE { cup-of-coffee BIT STRING, ... - } OPTIONAL + } OPTIONAL, + ..., + other CHOICE { + a [0] IMPLICIT INTEGER, + b [3] IMPLICIT INTEGER + } } END diff --git a/tests/31-set-of-OK.asn1.-P b/tests/31-set-of-OK.asn1.-P index 37533f006..143ab8c64 100644 --- a/tests/31-set-of-OK.asn1.-P +++ b/tests/31-set-of-OK.asn1.-P @@ -142,6 +142,8 @@ asn_TYPE_descriptor_t asn_DEF_Tree = { #include #include #include +#include +#include #include /*** <<< DEPS [Stuff] >>> ***/ @@ -153,7 +155,13 @@ asn_TYPE_descriptor_t asn_DEF_Tree = { typedef enum Stuff_PR { Stuff_PR_trees, /* Member trees is present */ Stuff_PR_anything, /* Member anything is present */ + Stuff_PR_other, /* Member other is present */ } Stuff_PR; +typedef enum other_PR { + other_PR_NOTHING, /* No components present */ + other_PR_a, + other_PR_b, +} other_PR; extern asn_TYPE_descriptor_t asn_DEF_Stuff; /*** <<< TYPE-DECLS [Stuff] >>> ***/ @@ -181,10 +189,24 @@ typedef struct Stuff { /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } *anything; + /* + * This type is extensible, + * possible extensions are below. + */ + struct other { + other_PR present; + union { + INTEGER_t a; + INTEGER_t b; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } *other; /* Presence bitmask: ASN_SET_ISPRESENT(pStuff, Stuff_PR_x) */ unsigned int _presence_map - [((2+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))]; + [((3+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))]; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; @@ -202,7 +224,7 @@ static asn_TYPE_member_t asn_MBR_trees[] = { }, }; static ber_tlv_tag_t asn_DEF_trees_tags[] = { - (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; static asn_SET_OF_specifics_t asn_DEF_trees_specs = { @@ -245,7 +267,7 @@ static ber_tlv_tag_t asn_DEF_anything_member_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_DEF_anything_member_tag2el[] = { - { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 0, 0, 0 }, /* cup-of-coffee at 26 */ + { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 0, 0, 0 }, /* cup-of-coffee at 32 */ }; static asn_SEQUENCE_specifics_t asn_DEF_anything_member_specs = { sizeof(struct anything_member), @@ -287,7 +309,7 @@ static asn_TYPE_member_t asn_MBR_anything[] = { }, }; static ber_tlv_tag_t asn_DEF_anything_tags[] = { - (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; static asn_SET_OF_specifics_t asn_DEF_anything_specs = { @@ -317,39 +339,104 @@ asn_TYPE_descriptor_t asn_DEF_anything = { &asn_DEF_anything_specs /* Additional specs */ }; -static asn_TYPE_member_t asn_MBR_Stuff[] = { - { ATF_POINTER, 2, offsetof(struct Stuff, trees), +static asn_TYPE_member_t asn_MBR_other[] = { + { ATF_NOFLAGS, 0, offsetof(struct other, choice.a), .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn_DEF_INTEGER, + .memb_constraints = 0, /* Defer to actual type */ + .name = "a" + }, + { ATF_NOFLAGS, 0, offsetof(struct other, choice.b), + .tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn_DEF_INTEGER, + .memb_constraints = 0, /* Defer to actual type */ + .name = "b" + }, +}; +static asn_TYPE_tag2member_t asn_DEF_other_tag2el[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* a at 26 */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 1, 0, 0 }, /* b at 28 */ +}; +static asn_CHOICE_specifics_t asn_DEF_other_specs = { + sizeof(struct other), + offsetof(struct other, _asn_ctx), + offsetof(struct other, present), + sizeof(((struct other *)0)->present), + asn_DEF_other_tag2el, + 2, /* Count of tags in the map */ + 0 /* Whether extensible */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_other = { + "other", + CHOICE_free, + CHOICE_print, + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + 0, /* Not implemented yet */ + CHOICE_encode_xer, + CHOICE_outmost_tag, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + asn_MBR_other, + 2, /* Elements count */ + &asn_DEF_other_specs /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_Stuff[] = { + { ATF_POINTER, 3, offsetof(struct Stuff, trees), + .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ .type = (void *)&asn_DEF_trees, .memb_constraints = 0, /* Defer to actual type */ .name = "trees" }, - { ATF_POINTER, 1, offsetof(struct Stuff, anything), - .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + { ATF_POINTER, 2, offsetof(struct Stuff, anything), + .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = (void *)&asn_DEF_anything, .memb_constraints = 0, /* Defer to actual type */ .name = "anything" }, + { ATF_POINTER, 0, offsetof(struct Stuff, other), + .tag = -1 /* Ambiguous tag (CHOICE?) */, + .tag_mode = 0, + .type = (void *)&asn_DEF_other, + .memb_constraints = 0, /* Defer to actual type */ + .name = "other" + }, }; static ber_tlv_tag_t asn_DEF_Stuff_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; static asn_TYPE_tag2member_t asn_DEF_Stuff_tag2el[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* trees at 23 */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* anything at 28 */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 2, 0, 0 }, /* a at 26 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* trees at 23 */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* anything at 34 */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* b at 28 */ +}; +static asn_TYPE_tag2member_t asn_DEF_Stuff_tag2el_cxer[] = { + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* trees at 23 */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* anything at 34 */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 2, 0, 0 }, /* a at 26 */ }; -static uint8_t asn_DEF_Stuff_mmap[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = { - (0 << 7) | (0 << 6) +static uint8_t asn_DEF_Stuff_mmap[(3 + (8 * sizeof(unsigned int)) - 1) / 8] = { + (0 << 7) | (0 << 6) | (0 << 5) }; static asn_SET_specifics_t asn_DEF_Stuff_specs = { sizeof(struct Stuff), offsetof(struct Stuff, _asn_ctx), offsetof(struct Stuff, _presence_map), asn_DEF_Stuff_tag2el, - 2, /* Count of tags in the map */ - 0, /* Whether extensible */ + 4, /* Count of tags in the map */ + asn_DEF_Stuff_tag2el_cxer, + 3, /* Count of tags in the CANONICAL-XER map */ + 1, /* Whether extensible */ (unsigned int *)asn_DEF_Stuff_mmap /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_Stuff = { @@ -369,7 +456,7 @@ asn_TYPE_descriptor_t asn_DEF_Stuff = { sizeof(asn_DEF_Stuff_tags) /sizeof(asn_DEF_Stuff_tags[0]), /* 1 */ asn_MBR_Stuff, - 2, /* Elements count */ + 3, /* Elements count */ &asn_DEF_Stuff_specs /* Additional specs */ }; diff --git a/tests/43-recursion-OK.asn1.-P b/tests/43-recursion-OK.asn1.-P index 885e6352d..7f03aad78 100644 --- a/tests/43-recursion-OK.asn1.-P +++ b/tests/43-recursion-OK.asn1.-P @@ -396,6 +396,8 @@ static asn_SET_specifics_t asn_DEF_Test_structure_2_specs = { offsetof(struct Test_structure_2, _presence_map), asn_DEF_Test_structure_2_tag2el, 1, /* Count of tags in the map */ + asn_DEF_Test_structure_2_tag2el, /* Same as above */ + 1, /* Count of tags in the CANONICAL-XER map */ 0, /* Whether extensible */ (unsigned int *)asn_DEF_Test_structure_2_mmap /* Mandatory elements map */ }; @@ -479,6 +481,8 @@ static asn_SET_specifics_t asn_DEF_Test_structure_3_specs = { offsetof(struct Test_structure_3, _presence_map), asn_DEF_Test_structure_3_tag2el, 1, /* Count of tags in the map */ + asn_DEF_Test_structure_3_tag2el, /* Same as above */ + 1, /* Count of tags in the CANONICAL-XER map */ 0, /* Whether extensible */ (unsigned int *)asn_DEF_Test_structure_3_mmap /* Mandatory elements map */ }; diff --git a/tests/47-set-ext-OK.asn1.-P b/tests/47-set-ext-OK.asn1.-P index 568caadcb..5aa2ce2d4 100644 --- a/tests/47-set-ext-OK.asn1.-P +++ b/tests/47-set-ext-OK.asn1.-P @@ -59,6 +59,8 @@ static asn_SET_specifics_t asn_DEF_T1_specs = { offsetof(struct T1, _presence_map), asn_DEF_T1_tag2el, 1, /* Count of tags in the map */ + asn_DEF_T1_tag2el, /* Same as above */ + 1, /* Count of tags in the CANONICAL-XER map */ 1, /* Whether extensible */ (unsigned int *)asn_DEF_T1_mmap /* Mandatory elements map */ }; @@ -144,6 +146,8 @@ static asn_SET_specifics_t asn_DEF_T2_specs = { offsetof(struct T2, _presence_map), asn_DEF_T2_tag2el, 1, /* Count of tags in the map */ + asn_DEF_T2_tag2el, /* Same as above */ + 1, /* Count of tags in the CANONICAL-XER map */ 1, /* Whether extensible */ (unsigned int *)asn_DEF_T2_mmap /* Mandatory elements map */ }; From 0bb7b8aa4ea42d38b6764a90850bc8215c437522 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 3 Oct 2004 10:54:05 +0000 Subject: [PATCH 0480/1469] typos git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@480 59561ff5-6e30-0410-9f3c-9617f08c8826 --- FAQ | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FAQ b/FAQ index 0873a248e..d652b7f8f 100644 --- a/FAQ +++ b/FAQ @@ -29,8 +29,8 @@ A: you have special requirements, we can work it out. However, the asn1c compiler is able to understand the newer PKIX1 - ASN.1 specs, contained in RFC3280, which obsole RFC2459. - Try this one out instead: + ASN.1 specs, contained in RFC3280, which obsoletes RFC2459. + To compile the sample X.509 certificate dump utility, try this out: cd ./examples/sample.source.PKIX1 make From 393a57a0a3de4f699d35336ee44f19b1d4892524 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 3 Oct 2004 10:54:25 +0000 Subject: [PATCH 0481/1469] added XML characters escaping git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@481 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OCTET_STRING.c | 82 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 2 deletions(-) diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index e3b7a0aba..af4159672 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -621,12 +621,68 @@ OCTET_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, _ASN_ENCODE_FAILED; } +static struct OCTET_STRING__xer_escape_table_s { + char *string; + int size; +} OCTET_STRING__xer_escape_table[] = { +#define OSXET(s) { s, sizeof(s) - 1 } + OSXET("\074\156\165\154\057\076"), /* */ + OSXET("\074\163\157\150\057\076"), /* */ + OSXET("\074\163\164\170\057\076"), /* */ + OSXET("\074\145\164\170\057\076"), /* */ + OSXET("\074\145\157\164\057\076"), /* */ + OSXET("\074\145\156\161\057\076"), /* */ + OSXET("\074\141\143\153\057\076"), /* */ + OSXET("\074\142\145\154\057\076"), /* */ + OSXET("\074\142\163\057\076"), /* */ + OSXET("\011"), /* \t */ + OSXET("\012"), /* \n */ + OSXET("\074\166\164\057\076"), /* */ + OSXET("\074\146\146\057\076"), /* */ + OSXET("\015"), /* \r */ + OSXET("\074\163\157\057\076"), /* */ + OSXET("\074\163\151\057\076"), /* */ + OSXET("\074\144\154\145\057\076"), /* */ + OSXET("\074\144\143\061\057\076"), /* */ + OSXET("\074\144\143\062\057\076"), /* */ + OSXET("\074\144\143\063\057\076"), /* */ + OSXET("\074\144\143\064\057\076"), /* */ + OSXET("\074\156\141\153\057\076"), /* */ + OSXET("\074\163\171\156\057\076"), /* */ + OSXET("\074\145\164\142\057\076"), /* */ + OSXET("\074\143\141\156\057\076"), /* */ + OSXET("\074\145\155\057\076"), /* */ + OSXET("\074\163\165\142\057\076"), /* */ + OSXET("\074\145\163\143\057\076"), /* */ + OSXET("\074\151\163\064\057\076"), /* */ + OSXET("\074\151\163\063\057\076"), /* */ + OSXET("\074\151\163\062\057\076"), /* */ + OSXET("\074\151\163\061\057\076"), /* */ + { 0, 0 }, /* " " */ + { 0, 0 }, /* ! */ + { 0, 0 }, /* \" */ + { 0, 0 }, /* # */ + { 0, 0 }, /* $ */ + { 0, 0 }, /* % */ + OSXET("\046\141\155\160\073"), /* & */ + { 0, 0 }, /* ' */ + {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* ()*+,-./ */ + {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* 01234567 */ + {0,0},{0,0},{0,0},{0,0}, /* 89:; */ + OSXET("\046\154\164\073"), /* < */ + { 0, 0 }, /* = */ + OSXET("\046\147\164\073"), /* > */ +}; + asn_enc_rval_t OCTET_STRING_encode_xer_ascii(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; asn_enc_rval_t er; + uint8_t *buf, *end; + uint8_t *ss; /* Sequence start */ + ssize_t encoded_len = 0; (void)ilevel; /* Unused argument */ (void)flags; /* Unused argument */ @@ -634,10 +690,32 @@ OCTET_STRING_encode_xer_ascii(asn_TYPE_descriptor_t *td, void *sptr, if(!st || !st->buf) _ASN_ENCODE_FAILED; - if(cb(st->buf, st->size, app_key) < 0) + buf = st->buf; + end = buf + st->size; + for(ss = buf; buf < end; buf++) { + int ch = *buf; + int s_len; /* Special encoding sequence length */ + + /* + * Escape certain characters: X.680/11.15 + */ + if(ch < sizeof(OCTET_STRING__xer_escape_table) + /sizeof(OCTET_STRING__xer_escape_table[0]) + && (s_len = OCTET_STRING__xer_escape_table[ch].size)) { + if(((buf - ss) && cb(ss, buf - ss, app_key) < 0) + || cb(OCTET_STRING__xer_escape_table[ch].string, s_len, + app_key) < 0) + _ASN_ENCODE_FAILED; + encoded_len += (buf - ss) + s_len; + ss = buf + 1; + } + } + + encoded_len += (buf - ss); + if((buf - ss) && cb(ss, buf - ss, app_key) < 0) _ASN_ENCODE_FAILED; - er.encoded = st->size; + er.encoded = encoded_len; return er; } From cfc7e4dba323a809f610fd56055904320e451601 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 3 Oct 2004 10:54:34 +0000 Subject: [PATCH 0482/1469] tests for XML escaping git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@482 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-30.c | 2 +- asn1c/tests/check-31.c | 2 +- asn1c/tests/check-35.c | 53 ++++++++++++++++++++++++------------------ 3 files changed, 33 insertions(+), 24 deletions(-) diff --git a/asn1c/tests/check-30.c b/asn1c/tests/check-30.c index c1528b9f5..6c3acb6bb 100644 --- a/asn1c/tests/check-30.c +++ b/asn1c/tests/check-30.c @@ -210,7 +210,7 @@ check_xer(uint8_t *buf, uint8_t size, char *xer_sample) { assert(xer_off); xer_buf[xer_off] = 0; printf("[%s] vs [%s]\n", xer_buf, xer_sample); - assert(xer_off = xer_sample_len); + assert(xer_off == xer_sample_len); assert(memcmp(xer_buf, xer_sample, xer_off) == 0); } diff --git a/asn1c/tests/check-31.c b/asn1c/tests/check-31.c index 5c5075c4f..3bdf4e636 100644 --- a/asn1c/tests/check-31.c +++ b/asn1c/tests/check-31.c @@ -171,7 +171,7 @@ check_xer(uint8_t *buf, uint8_t size, char *xer_sample) { assert(xer_off); xer_buf[xer_off] = 0; printf("[%s] vs [%s]\n", xer_buf, xer_sample); - assert(xer_off = xer_sample_len); + assert(xer_off == xer_sample_len); assert(memcmp(xer_buf, xer_sample, xer_off) == 0); } diff --git a/asn1c/tests/check-35.c b/asn1c/tests/check-35.c index 87994c917..7e2ffa597 100644 --- a/asn1c/tests/check-35.c +++ b/asn1c/tests/check-35.c @@ -9,7 +9,7 @@ uint8_t buf1[] = { 32 | 17, /* [UNIVERSAL 17], constructed */ - 13, /* L */ + 15, /* L */ /* b CHOICE { b2 ObjectDescriptor }*/ 7, /* [UNIVERSAL 7] */ @@ -22,9 +22,11 @@ uint8_t buf1[] = { /* a NumericString */ 18, /* [UNIVERSAL 18] */ - 2, /* L */ - 'n', - 's', + 4, /* L */ + '=', + '<', + '&', + '>', /* d.r-oid RELATIVE-OID */ 13, /* [UNIVERSAL 13] */ @@ -36,7 +38,7 @@ uint8_t buf1[] = { uint8_t buf1_reconstr[] = { 32 | 17, /* [UNIVERSAL 17], constructed */ - 14, /* L */ + 16, /* L */ /* c BOOLEAN */ 1, /* [UNIVERSAL 1] */ @@ -56,20 +58,24 @@ uint8_t buf1_reconstr[] = { /* a NumericString */ 18, /* [UNIVERSAL 18] */ - 2, /* L */ - 'n', - 's' + 4, /* L */ + '=', + '<', + '&', + '>', }; uint8_t buf2[] = { 32 | 17, /* [UNIVERSAL 17], constructed */ - 13, /* L */ + 15, /* L */ /* a NumericString */ 18, /* [UNIVERSAL 18] */ - 2, /* L */ - 'n', - 's', + 4, /* L */ + '=', + '<', + '&', + '>', /* c BOOLEAN */ 1, /* [UNIVERSAL 1] */ @@ -90,7 +96,7 @@ uint8_t buf2[] = { uint8_t buf2_reconstr[] = { 32 | 17, /* [UNIVERSAL 17], constructed */ - 13, /* L */ + 15, /* L */ /* c BOOLEAN */ 1, /* [UNIVERSAL 1] */ @@ -104,9 +110,11 @@ uint8_t buf2_reconstr[] = { /* a NumericString */ 18, /* [UNIVERSAL 18] */ - 2, /* L */ - 'n', - 's', + 4, /* L */ + '=', + '<', + '&', + '>', /* b CHOICE { b1 IA5String }*/ 22, /* [UNIVERSAL 22] */ @@ -128,7 +136,7 @@ check(T_t *tp, uint8_t *buf, int size, size_t consumed) { assert(rval.code == RC_OK); assert(rval.consumed == consumed); - assert(strcmp(tp->a.buf, "ns") == 0); + assert(strcmp(tp->a.buf, "=<&>") == 0); assert(strcmp(tp->b.choice.b1.buf, "z") == 0 && strcmp(tp->b.choice.b2.buf, "z") == 0); @@ -288,11 +296,12 @@ check_xer(uint8_t *buf, uint8_t size, char *xer_sample) { xer_off = 0; er = xer_encode(&asn_DEF_T, tp, XER_F_CANONICAL, xer_cb, 0); - assert(er.encoded == xer_off); assert(xer_off); xer_buf[xer_off] = 0; - printf("[%s] vs [%s]\n", xer_buf, xer_sample); - assert(xer_off = xer_sample_len); + printf("[%s] (%d/%d) vs [%s] (%d)\n", + xer_buf, er.encoded, xer_off, xer_sample, xer_sample_len); + assert(er.encoded == xer_off); + assert(xer_off == xer_sample_len); assert(memcmp(xer_buf, xer_sample, xer_off) == 0); } @@ -307,12 +316,12 @@ main(int ac, char **av) { check(&t, buf1, sizeof(buf1) + 10, sizeof(buf1)); compare(&t, buf1_reconstr, sizeof(buf1_reconstr)); asn_DEF_T.free_struct(&asn_DEF_T, &t, 1); - check_xer(buf1, sizeof(buf1), "zns85.79"); + check_xer(buf1, sizeof(buf1), "z=<&>85.79"); check(&t, buf2, sizeof(buf2) + 10, sizeof(buf2)); compare(&t, buf2_reconstr, sizeof(buf2_reconstr)); asn_DEF_T.free_struct(&asn_DEF_T, &t, 1); - check_xer(buf2, sizeof(buf2), "zns2.1"); + check_xer(buf2, sizeof(buf2), "z=<&>2.1"); /* Split the buffer in parts and check decoder restartability */ partial_read(buf1, sizeof(buf1)); From 17cbadbf4d73ebb440c51348f130bfb159ded292 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 3 Oct 2004 10:55:08 +0000 Subject: [PATCH 0483/1469] rearranging git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@483 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5adde5a53..42331026c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,12 +1,12 @@ 0.9.7: 2004-Oct-03 - * Fixed unber limits controlling logic. + * Finished CANONICAL-XER implementation by adding SET and SET OF + canonical ordering support. + * Fixed unber(1) limits controlling logic. * Removed C99'izm from the x509dump, now understood by older compilers. * Enhanced UTF8String constraint validation, now it checks for the minimal encoding length; API of UTF8String_length() changed. - * Finished CANONICAL-XER implementation by adding SET and SET OF - canonical ordering support. 0.9.6: 2004-Sep-29 From 66a67dd3e1d26c953d0688b9529a342311896af0 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 5 Oct 2004 06:34:07 +0000 Subject: [PATCH 0484/1469] new tests git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@484 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/data-62/Makefile | 2 +- asn1c/tests/data-62/data-62-30-L.ber | Bin 0 -> 29 bytes asn1c/tests/data-62/data-62-30-L.xbr | 8 ++++++++ asn1c/tests/data-62/data-62-31-D.ber | Bin 0 -> 31 bytes asn1c/tests/data-62/data-62-31-D.xbr | 8 ++++++++ 5 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 asn1c/tests/data-62/data-62-30-L.ber create mode 100644 asn1c/tests/data-62/data-62-30-L.xbr create mode 100644 asn1c/tests/data-62/data-62-31-D.ber create mode 100644 asn1c/tests/data-62/data-62-31-D.xbr diff --git a/asn1c/tests/data-62/Makefile b/asn1c/tests/data-62/Makefile index eb8d641d0..b901d72da 100644 --- a/asn1c/tests/data-62/Makefile +++ b/asn1c/tests/data-62/Makefile @@ -1,7 +1,7 @@ all: @for xbr in *.xbr; do \ - ber=`echo "$$xbr" | sed -e 's/\.xbr$$/\.ber/`; \ + ber=`echo "$$xbr" | sed -e 's/\.xbr$$/\.ber/'`; \ if [ $$xbr -nt $$ber ]; then \ echo "../../enber $$xbr > $$ber"; \ ../../enber $$xbr > $$ber || exit $$?; \ diff --git a/asn1c/tests/data-62/data-62-30-L.ber b/asn1c/tests/data-62/data-62-30-L.ber new file mode 100644 index 0000000000000000000000000000000000000000..b80bed39978ef2e0827bac4057e0695b8438d0ed GIT binary patch literal 29 kcmdnc(7 +

    &x37;&x39;

    +

    &x00;

    + +

    79023700808

    +
    +

    &x00;

    +
    diff --git a/asn1c/tests/data-62/data-62-31-D.ber b/asn1c/tests/data-62/data-62-31-D.ber new file mode 100644 index 0000000000000000000000000000000000000000..f1b74d0864f64fa6eb8e497cb3cfa59170ab655d GIT binary patch literal 31 mcmdnc(7 +

    &x37;&x39;

    +

    &x00;

    + +

    79023700808

    +
    +

    &x00;

    +
    From d7c2ef3f45c3612bab09f710a63fadc73eceaf3f Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 5 Oct 2004 06:35:31 +0000 Subject: [PATCH 0485/1469] ease comparison with signed sizeof() git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@485 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OCTET_STRING.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index af4159672..75f235e40 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -192,9 +192,8 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, rval = ber_check_tags(opt_codec_ctx, td, ctx, buf_ptr, size, tag_mode, -1, &ctx->left, &tlv_constr); - if(rval.code != RC_OK) { - RETURN(rval.code); - } + if(rval.code != RC_OK) + return rval; if(tlv_constr) { /* @@ -693,7 +692,7 @@ OCTET_STRING_encode_xer_ascii(asn_TYPE_descriptor_t *td, void *sptr, buf = st->buf; end = buf + st->size; for(ss = buf; buf < end; buf++) { - int ch = *buf; + unsigned int ch = *buf; int s_len; /* Special encoding sequence length */ /* From 4c0e87221fedb43acb40367bc6ab1a9ab4aec736 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 5 Oct 2004 06:35:43 +0000 Subject: [PATCH 0486/1469] logging git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@486 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ber_decoder.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c index f932b3b2f..cda6c16d1 100644 --- a/skeletons/ber_decoder.c +++ b/skeletons/ber_decoder.c @@ -145,13 +145,10 @@ ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, * Fetch and process T from TLV. */ tag_len = ber_fetch_tag(ptr, size, &tlv_tag); - ASN_DEBUG("Fetching tag from {%p,%ld} %02X..%02X: " - "len %ld, step %d, tag %s", + ASN_DEBUG("Fetching tag from {%p,%ld}: " + "len %ld, step %d, tagno %d got %s", ptr, (long)size, - size?*(uint8_t *)ptr:0, - ((size_t)tag_len0) - ?*((uint8_t *)ptr + tag_len):0, - (long)tag_len, step, + (long)tag_len, step, tagno, ber_tlv_tag_string(tlv_tag)); switch(tag_len) { case -1: RETURN(RC_FAIL); From e1ecb06e1342f2b4f8f51e0ce7fee7edb02859f2 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 5 Oct 2004 06:36:02 +0000 Subject: [PATCH 0487/1469] fixed reintroduced problem git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@487 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_CHOICE.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 46fd5210a..236b9ad5a 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -151,8 +151,7 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, if(rval.code != RC_OK) { ASN_DEBUG("%s tagging check failed: %d", td->name, rval.code); - consumed_myself += rval.consumed; - RETURN(rval.code); + return rval; } if(ctx->left >= 0) { @@ -330,6 +329,8 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, /* * Correctly finished with <0><0>. */ + ADVANCE(2); + ctx->left++; continue; } } else { @@ -338,8 +339,7 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, RETURN(RC_FAIL); } - ADVANCE(2); - ctx->left++; + /* UNREACHABLE */ } NEXT_PHASE(ctx); From a2c911abd344cb2e05fee8ced2996ee456184898 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 5 Oct 2004 06:36:29 +0000 Subject: [PATCH 0488/1469] new dependency git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@488 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/file-dependencies | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/file-dependencies b/skeletons/file-dependencies index 0f496cc5d..9018da073 100644 --- a/skeletons/file-dependencies +++ b/skeletons/file-dependencies @@ -38,7 +38,7 @@ asn_SEQUENCE_OF.h asn_SEQUENCE_OF.c asn_SET_OF.h asn_SET_OF.h asn_SET_OF.c constr_CHOICE.h constr_CHOICE.c constr_SEQUENCE.h constr_SEQUENCE.c -constr_SEQUENCE_OF.h constr_SEQUENCE_OF.c asn_SEQUENCE_OF.h +constr_SEQUENCE_OF.h constr_SEQUENCE_OF.c asn_SEQUENCE_OF.h constr_SET_OF.h constr_SET.h constr_SET.c constr_SET_OF.h constr_SET_OF.c asn_SET_OF.h From 2ebb08ceb646666bbff8927b486e26204c001eda Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 5 Oct 2004 06:36:44 +0000 Subject: [PATCH 0489/1469] refactoring git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@489 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SET.c | 3 +-- skeletons/constr_SET_OF.c | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index a64c2ff48..ce6afd6d9 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -150,8 +150,7 @@ SET_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, if(rval.code != RC_OK) { ASN_DEBUG("%s tagging check failed: %d", td->name, rval.code); - consumed_myself += rval.consumed; - RETURN(rval.code); + return rval; } if(ctx->left >= 0) diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index c298cc297..518713caf 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -118,8 +118,7 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, if(rval.code != RC_OK) { ASN_DEBUG("%s tagging check failed: %d", td->name, rval.code); - consumed_myself += rval.consumed; - RETURN(rval.code); + return rval; } if(ctx->left >= 0) From 1cc0f2e5b5f816043c599d48dcdba6f883ee288a Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 5 Oct 2004 06:36:57 +0000 Subject: [PATCH 0490/1469] different place for termination check git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@490 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SEQUENCE.c | 57 +++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 83da765e7..693ddd204 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -161,8 +161,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, if(rval.code != RC_OK) { ASN_DEBUG("%s tagging check failed: %d", td->name, rval.code); - consumed_myself += rval.consumed; - RETURN(rval.code); + return rval; } if(ctx->left >= 0) @@ -240,6 +239,35 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, case -1: RETURN(RC_FAIL); } + if(ctx->left < 0 && ((uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((uint8_t *)ptr)[1] == 0) { + ASN_DEBUG("edx = %d, opt = %d, ec=%d", + edx, elements[edx].optional, + td->elements_count); + if((edx + elements[edx].optional + == td->elements_count) + || (IN_EXTENSION_GROUP(specs, edx) + && specs->ext_before + > td->elements_count)) { + /* + * Yeah, baby! Found the terminator + * of the indefinite length structure. + */ + /* + * Proceed to the canonical + * finalization function. + * No advancing is necessary. + */ + goto phase3; + } + } + } + /* * Find the next available type with this tag. */ @@ -319,35 +347,14 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, * or an end of the indefinite-length structure. */ if(!IN_EXTENSION_GROUP(specs, edx)) { - ASN_DEBUG("Unexpected tag %s", - ber_tlv_tag_string(tlv_tag)); + ASN_DEBUG("Unexpected tag %s (at %d)", + ber_tlv_tag_string(tlv_tag), edx); ASN_DEBUG("Expected tag %s (%s)%s", ber_tlv_tag_string(elements[edx].tag), elements[edx].name, elements[edx].optional ?" or alternatives":""); RETURN(RC_FAIL); - } - - if(ctx->left < 0 - && ((uint8_t *)ptr)[0] == 0) { - if(LEFT < 2) { - if(SIZE_VIOLATION) - RETURN(RC_FAIL); - else - RETURN(RC_WMORE); - } else if(((uint8_t *)ptr)[1] == 0) { - /* - * Yeah, baby! Found the terminator - * of the indefinite length structure. - */ - /* - * Proceed to the canonical - * finalization function. - * No advancing is necessary. - */ - goto phase3; - } } else { /* Skip this tag */ ssize_t skip; From 26d6403d97fb519db7bf7c6fc8e09d964f216b24 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 5 Oct 2004 06:37:42 +0000 Subject: [PATCH 0491/1469] new subtype git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@491 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/62-any-OK.asn1 | 16 +++++++++++++++- tests/62-any-OK.asn1.-EF | 16 +++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/tests/62-any-OK.asn1 b/tests/62-any-OK.asn1 index 7c9991bd4..34d7e2433 100644 --- a/tests/62-any-OK.asn1 +++ b/tests/62-any-OK.asn1 @@ -11,10 +11,24 @@ ModuleTestANYSyntax DEFINITIONS IMPLICIT TAGS ::= BEGIN - T ::= SEQUENCE { + T ::= CHOICE { + s1 T1, + s2 T2 + } + + T1 ::= SEQUENCE { i INTEGER OPTIONAL, any [1] ANY, -- Converted into [1] EXPLICIT ANY ... } + T2 ::= [16] SEQUENCE { + m1 [0] NumericString, + m2 [1] BOOLEAN, + m3 [3] SEQUENCE OF NumericString, + o4 [4] BOOLEAN OPTIONAL, + o5 [5] BOOLEAN OPTIONAL, + o6 [6] BOOLEAN OPTIONAL + } + END diff --git a/tests/62-any-OK.asn1.-EF b/tests/62-any-OK.asn1.-EF index 76549a699..22a64bbee 100644 --- a/tests/62-any-OK.asn1.-EF +++ b/tests/62-any-OK.asn1.-EF @@ -4,10 +4,24 @@ ModuleTestANYSyntax {iso org(3) dod(6) internet(1) private(4) DEFINITIONS IMPLICIT TAGS ::= BEGIN -T ::= SEQUENCE { +T ::= CHOICE { + s1 T1, + s2 T2 +} + +T1 ::= SEQUENCE { i INTEGER OPTIONAL, any [1] EXPLICIT ANY, ... } +T2 ::= [16] IMPLICIT SEQUENCE { + m1 [0] IMPLICIT NumericString, + m2 [1] IMPLICIT BOOLEAN, + m3 [3] IMPLICIT SEQUENCE OF NumericString, + o4 [4] IMPLICIT BOOLEAN OPTIONAL, + o5 [5] IMPLICIT BOOLEAN OPTIONAL, + o6 [6] IMPLICIT BOOLEAN OPTIONAL +} + END From 2e2c09a70841bc97ebf2a5821165c8dfdad42d79 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 5 Oct 2004 06:38:19 +0000 Subject: [PATCH 0492/1469] recompiled git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@492 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.PKIX1/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index c4d3eacc4..b97d035c6 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -296,9 +296,9 @@ ASN_MODULE_HEADERS+=constr_SEQUENCE.h ASN_MODULE_SOURCES+=constr_SEQUENCE.c ASN_MODULE_HEADERS+=constr_SEQUENCE_OF.h ASN_MODULE_SOURCES+=constr_SEQUENCE_OF.c +ASN_MODULE_HEADERS+=constr_SET_OF.h ASN_MODULE_HEADERS+=constr_SET.h ASN_MODULE_SOURCES+=constr_SET.c -ASN_MODULE_HEADERS+=constr_SET_OF.h ASN_MODULE_SOURCES+=constr_SET_OF.c ASN_MODULE_HEADERS+=asn_application.h ASN_MODULE_HEADERS+=asn_internal.h From 22a55d2daa1a2b863dae14c9ca860fe0f8bfa939 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 5 Oct 2004 06:38:38 +0000 Subject: [PATCH 0493/1469] new code git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@493 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-62.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/asn1c/tests/check-62.c b/asn1c/tests/check-62.c index 2af2e5e0a..dd19013fe 100644 --- a/asn1c/tests/check-62.c +++ b/asn1c/tests/check-62.c @@ -14,6 +14,7 @@ enum expectation { EXP_OK, /* Encoding/decoding must succeed */ EXP_BROKEN, /* Decoding must fail */ EXP_RECLESS, /* Reconstruction is allowed to yield less data */ + EXP_DIFFERENT, /* Reconstruction will yield different encoding */ }; static unsigned char buf[4096]; @@ -115,12 +116,18 @@ process_data(enum expectation expectation, char *fbuf, int size) { assert(buf_offset < sizeof(buf)); assert(ret == 0); - if(expectation == EXP_RECLESS) { + switch(expectation) { + case EXP_RECLESS: assert(buf_offset > 0 && buf_offset < size); assert(memcmp(buf + 2, fbuf + 2, buf_offset - 2) == 0); - } else { + break; + case EXP_DIFFERENT: + assert(buf_offset > 0 && buf_offset < size); + break; + case EXP_BROKEN: assert(buf_offset == size); assert(memcmp(buf, fbuf, buf_offset) == 0); + break; } asn_DEF_T.free_struct(&asn_DEF_T, st, 0); @@ -144,6 +151,8 @@ process(const char *fname) { switch(ext[-1]) { case 'B': /* The file is intentionally broken */ expectation = EXP_BROKEN; break; + case 'D': /* Reconstructing should yield different data */ + expectation = EXP_DIFFERENT; break; case 'L': /* Extensions are present */ expectation = EXP_RECLESS; break; default: @@ -174,16 +183,19 @@ main() { DIR *dir; struct dirent *dent; int processed_files = 0; + char *str; dir = opendir("../data-62"); assert(dir); - while((dent = readdir(dir))) { - if(strncmp(dent->d_name, "data-62-", 8)) - continue; + str = getenv("DATA_62_FILE"); + if(str && strncmp(str, "data-62-", 8) == 0) + process(str); - if(process(dent->d_name)) - processed_files++; + while((dent = readdir(dir))) { + if(strncmp(dent->d_name, "data-62-", 8) == 0) + if(process(dent->d_name)) + processed_files++; } assert(processed_files); From 014aa24653d74569affb2cce5cde52be103c9a5a Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 5 Oct 2004 06:38:50 +0000 Subject: [PATCH 0494/1469] enber git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@494 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/README | 1 + 1 file changed, 1 insertion(+) diff --git a/asn1c/README b/asn1c/README index 8bec7b9e7..47541d916 100644 --- a/asn1c/README +++ b/asn1c/README @@ -1,2 +1,3 @@ asn1c - The ASN.1 Compiler unber - The ASN.1 BER Decoder +enber - Reverse unber(1) output back into BER From 5cb31d5f22d59e6fbe184052434d05bbd8015911 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 5 Oct 2004 06:39:35 +0000 Subject: [PATCH 0495/1469] SEQUENCE and CHOICE fixes, plus security terms descriptions git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@495 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 42331026c..37bae2f9e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9.7: 2004-Oct-03 +0.9.7: 2004-Oct-04 * Finished CANONICAL-XER implementation by adding SET and SET OF canonical ordering support. @@ -7,6 +7,12 @@ * Removed C99'izm from the x509dump, now understood by older compilers. * Enhanced UTF8String constraint validation, now it checks for the minimal encoding length; API of UTF8String_length() changed. + * Fixed SEQUENCE dealing with premature termination of the + optionals-laden indefinite length structure. The code was previously + refusing to parse such structures. + * Fixed CHOICE code spin when indefinite length structures appear + in the extensions (Severity: medium, Security impact: medium). + Reported by . 0.9.6: 2004-Sep-29 @@ -289,3 +295,29 @@ 0.1: 2003-Nov-28 * Programming started. + +=== Bug importance disclosure terms === + +SEVERITY. + This term applies to the frequence the particular construct is used + in the real world. The higher the frequency, the more chances of triggering + this bug. + low: The ASN.1 specifications which could trigger + this kind of bug are not widespread. + medium: The particular ASN.1 construct is used quite often, + so the chance of triggering an error is considerable. + high: This fix is considered urgent, or the particular ASN.1 + construct triggering this bug is in wide use. + +SECURITY IMPACT. + This term applies to the amount of potential damage a bug exploitation + could cause. + low: The local exploitation is unlikely; the remote exploitation + is impossible. + medium: The remote exploitation is possible when a particular ASN.1 + construct is being used. If possible, only hard failure, spin + or memory leak are the possible outcome: no shellcode + injection could possibly be carried by the attack. + high: The remote shellcode injection is possible, or the bug is + otherwise remotely exploitable for most specifications. + From f4be458773f75e9ac9145c1d2418502c222073ba Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 11 Oct 2004 09:50:41 +0000 Subject: [PATCH 0496/1469] makeing it run on the older versions of Perl CGI package git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@496 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/webcgi/asn1c.cgi | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/asn1c/webcgi/asn1c.cgi b/asn1c/webcgi/asn1c.cgi index 2dbab3c7c..8214e9e86 100755 --- a/asn1c/webcgi/asn1c.cgi +++ b/asn1c/webcgi/asn1c.cgi @@ -198,10 +198,12 @@ print LOG isoTime() . "\tIP=$ENV{REMOTE_ADDR}"; @gotSafeNames = (); @gotNames = param('file'); if($#gotNames != -1 && $gotNames[0] ne "") { + $gotFile = param('file'); @gotFiles = upload('file'); } else { @gotNames = (); @gotFiles = (); + $gotFile = undef; } if($#gotNames == -1) { @@ -237,22 +239,22 @@ if($#gotSafeNames >= 0) { my $sandbox = $sessionDir . '/' . $transactionDir; mkdir($sandbox, $DM) or bark($SandBoxInitFailed); - open(I, '> ' . $sandbox . '/+Names'); - print I join("\n", @gotNames); - open(I, '> ' . $sandbox . '/+safeNames'); - print I join("\n", @gotSafeNames); + open(O, '> ' . $sandbox . '/+Names'); + print O join("\n", @gotNames); + open(O, '> ' . $sandbox . '/+safeNames'); + print O join("\n", @gotSafeNames); for(my $i = 0; $i <= $#gotSafeNames; $i++) { local $name = $gotSafeNames[$i]; - open(I, '> ' . $sandbox . '/'. $name); + open(O, '> ' . $sandbox . '/'. $name); if($#gotFiles == -1) { - print I scalar(param('text')); + print O scalar(param('text')); } else { - while(<$gotFiles[$I]>) { - print I; + while(<$gotFile>) { + print O; } } - close(I); } + close(O); my $inChDir = makeSessionDirName("/", $session) . $transactionDir; my $options = ''; From 267b7fdcf0650abac1f7e8f5a76399765956f920 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 11 Oct 2004 11:43:08 +0000 Subject: [PATCH 0497/1469] fixed explicitly tagged ANY type handling git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@497 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 4 +++- libasn1fix/asn1fix_constr.c | 16 +++++--------- skeletons/OCTET_STRING.c | 43 ++++++++++++++++++++++++------------- 3 files changed, 36 insertions(+), 27 deletions(-) diff --git a/ChangeLog b/ChangeLog index 37bae2f9e..dc3f32ef0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9.7: 2004-Oct-04 +0.9.7: 2004-Oct-11 * Finished CANONICAL-XER implementation by adding SET and SET OF canonical ordering support. @@ -10,6 +10,8 @@ * Fixed SEQUENCE dealing with premature termination of the optionals-laden indefinite length structure. The code was previously refusing to parse such structures. + * Fixed explicitly tagged ANY type encoding and decoding + (Severity: medium, Secruity impact: low). * Fixed CHOICE code spin when indefinite length structures appear in the extensions (Severity: medium, Security impact: medium). Reported by . diff --git a/libasn1fix/asn1fix_constr.c b/libasn1fix/asn1fix_constr.c index d837f35d6..34970c915 100644 --- a/libasn1fix/asn1fix_constr.c +++ b/libasn1fix/asn1fix_constr.c @@ -250,20 +250,14 @@ asn1f_fix_constr_tag(arg_t *arg, int fix_top_level) { static int _asn1f_fix_type_tag(arg_t *arg, asn1p_expr_t *expr) { int must_explicit = _asn1f_check_if_tag_must_be_explicit(arg, expr); - int fl_impl_tags = (arg->mod->module_flags & MSF_IMPLICIT_TAGS); + int module_impl_tags = (arg->mod->module_flags & MSF_IMPLICIT_TAGS); int r_value = 0; - if(fl_impl_tags) { - if(expr->tag.tag_mode != TM_EXPLICIT) { - if(must_explicit) - expr->tag.tag_mode = TM_EXPLICIT; - else - expr->tag.tag_mode = TM_IMPLICIT; - } - } else { - if(expr->tag.tag_mode == TM_DEFAULT) { + if(expr->tag.tag_mode == TM_DEFAULT) { + if(must_explicit || module_impl_tags == 0) expr->tag.tag_mode = TM_EXPLICIT; - } + else + expr->tag.tag_mode = TM_IMPLICIT; } /* diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 75f235e40..3ba25abe5 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -85,6 +85,15 @@ asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { st->buf[st->size] = '\0'; \ } while(0) +/* + * Internal variant of the OCTET STRING. + */ +typedef enum OS_type { + _TT_GENERIC = 0, /* Just a random OCTET STRING */ + _TT_BIT_STRING = 1, /* BIT STRING type, a special case */ + _TT_ANY = 2, /* ANY type, a special case too */ +} OS_type_e; + /* * The main reason why ASN.1 is still alive is that too much time and effort * is necessary for learning it more or less adequately, thus creating a gut @@ -161,11 +170,7 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, struct _stack *stck; /* A stack structure */ struct _stack_el *sel = 0; /* Stack element */ int tlv_constr; - enum type_type_e { - _TT_GENERIC = 0, /* Just a random OCTET STRING */ - _TT_BIT_STRING = 1, /* BIT STRING type, a special case */ - _TT_ANY = 2, /* ANY type, a special case too */ - } type_type = (enum type_type_e)(int)td->specifics; + OS_type_e type_type = (OS_type_e)(int)td->specifics; ASN_DEBUG("Decoding %s as %s (frame %ld)", td->name, @@ -214,7 +219,7 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, * Jump into stackless primitive decoding. */ _CH_PHASE(ctx, 3); - if(type_type == _TT_ANY) + if(type_type == _TT_ANY && tag_mode != 1) APPEND(buf_ptr, rval.consumed); ADVANCE(rval.consumed); goto phase3; @@ -291,7 +296,9 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, ASN_DEBUG("Eat EOC; wn=%d--", sel->want_nulls); - if(type_type == _TT_ANY) APPEND("\0\0", 2); + if(type_type == _TT_ANY + && (tag_mode != 1 || sel->cont_level)) + APPEND("\0\0", 2); ADVANCE(2); sel->got += 2; @@ -377,7 +384,9 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, } else { sel->left = tlv_len; } - if(type_type == _TT_ANY) APPEND(buf_ptr, tlvl); + if(type_type == _TT_ANY + && (tag_mode != 1 || sel->cont_level)) + APPEND(buf_ptr, tlvl); sel->got += tlvl; ADVANCE(tlvl); @@ -492,8 +501,7 @@ OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *ptr, asn_enc_rval_t erval; OCTET_STRING_t *st = (OCTET_STRING_t *)ptr; int add_byte = 0; - int is_bit_str = (td->specifics == (void *)1); - int is_ANY_type = (td->specifics == (void *)2); + OS_type_e type_type = (OS_type_e)(int)td->specifics; ASN_DEBUG("%s %s as OCTET STRING", cb?"Estimating":"Encoding", td->name); @@ -501,7 +509,7 @@ OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *ptr, /* * Canonicalize BIT STRING. */ - if(is_bit_str && st->buf) { + if(type_type == _TT_BIT_STRING) { switch(st->size) { case 0: add_byte = 1; break; case 1: st->buf[0] = 0; break; @@ -511,16 +519,21 @@ OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *ptr, } } - if(is_ANY_type) { - erval.encoded = 0; - } else { + /* + * Write tags. + */ + if(type_type != _TT_ANY || tag_mode == 1) { erval.encoded = der_write_tags(td, st->size + add_byte, - tag_mode, 0, tag, cb, app_key); + tag_mode, type_type == _TT_ANY, tag, cb, app_key); if(erval.encoded == -1) { erval.failed_type = td; erval.structure_ptr = ptr; return erval; } + } else { + /* Disallow: [...] IMPLICIT ANY */ + assert(type_type != _TT_ANY || tag_mode != -1); + erval.encoded = 0; } if(cb) { From 0f1ab76b7f3bd1c8ff4609d2dbb1b5d54891ea5d Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 12 Oct 2004 05:57:23 +0000 Subject: [PATCH 0498/1469] BIT STRING now stores the number of unused octets in a separate field. git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@498 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 1 + asn1c/tests/check-25.c | 25 ++-- examples/sample.source.PKIX1/Makefile | 4 +- libasn1parser/Makefile.in | 2 +- skeletons/ANY.c | 9 +- skeletons/ANY.h | 2 +- skeletons/BIT_STRING.c | 36 +++-- skeletons/BIT_STRING.h | 11 +- skeletons/OCTET_STRING.c | 183 +++++++++++++------------- skeletons/OCTET_STRING.h | 27 +++- skeletons/constr_TYPE.h | 8 +- skeletons/file-dependencies | 2 +- skeletons/tests/check-length.c | 8 +- 13 files changed, 174 insertions(+), 144 deletions(-) diff --git a/ChangeLog b/ChangeLog index dc3f32ef0..9e9907418 100644 --- a/ChangeLog +++ b/ChangeLog @@ -15,6 +15,7 @@ * Fixed CHOICE code spin when indefinite length structures appear in the extensions (Severity: medium, Security impact: medium). Reported by . + * BIT STRING now stores the number of unused octets in a separate field. 0.9.6: 2004-Sep-29 diff --git a/asn1c/tests/check-25.c b/asn1c/tests/check-25.c index 9352a802d..f2145dab4 100644 --- a/asn1c/tests/check-25.c +++ b/asn1c/tests/check-25.c @@ -105,18 +105,19 @@ check(int is_ok, uint8_t *buf, int size, size_t consumed) { assert(strcmp(t.e->buf, "xyz") == 0); assert(strcmp(t.f->buf, "love_it") == 0); - assert(t.g->size == 3); - assert(t.g->buf[0] == 2); - assert(t.g->buf[1] == 147); - assert(t.g->buf[2] != 150); - assert(t.g->buf[2] == 148); + assert(t.g->size == 2); + assert(t.g->bits_unused == 2); + printf("%d %d\n", t.g->buf[0], t.g->buf[1]); + assert(t.g->buf[0] == 147); + assert(t.g->buf[1] != 150); + assert(t.g->buf[1] == 148); printf("%d\n", t.h->buf[3]); - assert(t.h->size == 4); - assert(t.h->buf[0] == 1); - assert(t.h->buf[1] == 140); - assert(t.h->buf[2] == 141); - assert(t.h->buf[3] == 142); + assert(t.h->size == 3); + assert(t.h->bits_unused == 1); + assert(t.h->buf[0] == 140); + assert(t.h->buf[1] == 141); + assert(t.h->buf[2] == 142); } else { if(rval.code == RC_OK) { assert(t.a.size != 2 @@ -127,9 +128,9 @@ check(int is_ok, uint8_t *buf, int size, size_t consumed) { || !t.f || t.f->size != 7 || !t.g - || t.g->size != 3 + || t.g->size != 2 || !t.h - || t.h->size != 4 + || t.h->size != 3 ); } fprintf(stderr, "%d %d\n", (int)rval.consumed, (int)consumed); diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index b97d035c6..949021a82 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -256,8 +256,6 @@ ASN_MODULE_HEADERS= \ ASN_MODULE_HEADERS+=ANY.h ASN_MODULE_SOURCES+=ANY.c -ASN_MODULE_HEADERS+=BIT_STRING.h -ASN_MODULE_SOURCES+=BIT_STRING.c ASN_MODULE_HEADERS+=BMPString.h ASN_MODULE_SOURCES+=BMPString.c ASN_MODULE_HEADERS+=BOOLEAN.h @@ -305,6 +303,8 @@ ASN_MODULE_HEADERS+=asn_internal.h ASN_MODULE_HEADERS+=asn_types.h ASN_MODULE_HEADERS+=OCTET_STRING.h ASN_MODULE_SOURCES+=OCTET_STRING.c +ASN_MODULE_HEADERS+=BIT_STRING.h +ASN_MODULE_SOURCES+=BIT_STRING.c ASN_MODULE_HEADERS+=ber_decoder.h ASN_MODULE_SOURCES+=ber_decoder.c ASN_MODULE_SOURCES+=ber_codec_prim.c diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index cb9ebd03f..76a6ef231 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -448,8 +448,8 @@ maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -rm -f asn1p_l.c - -rm -f asn1p_y.c -rm -f asn1p_y.h + -rm -f asn1p_y.c clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ diff --git a/skeletons/ANY.c b/skeletons/ANY.c index ae19ab5db..d501ca1a2 100644 --- a/skeletons/ANY.c +++ b/skeletons/ANY.c @@ -7,6 +7,11 @@ #include #include +static asn_OCTET_STRING_specifics_t asn_DEF_ANY_specs = { + sizeof(ANY_t), + offsetof(ANY_t, _asn_ctx), + 2 /* Special indicator that this is an ANY type */ +}; asn_TYPE_descriptor_t asn_DEF_ANY = { "ANY", OCTET_STRING_free, @@ -19,7 +24,7 @@ asn_TYPE_descriptor_t asn_DEF_ANY = { 0, /* Use generic outmost tag fetcher */ 0, 0, 0, 0, 0, 0, /* No members */ - (void *)2 /* Special indicator that this is an ANY type */ + &asn_DEF_ANY_specs, }; @@ -94,7 +99,7 @@ ANY_new_fromType(asn_TYPE_descriptor_t *td, void *sptr) { if(ANY_fromType(&tmp, td, sptr)) return 0; - st = (ANY_t *)MALLOC(sizeof(*st)); + st = (ANY_t *)CALLOC(1, sizeof(ANY_t *)); if(st) { *st = tmp; return st; diff --git a/skeletons/ANY.h b/skeletons/ANY.h index 588f2951f..cabc411b6 100644 --- a/skeletons/ANY.h +++ b/skeletons/ANY.h @@ -5,7 +5,7 @@ #ifndef ASN_TYPE_ANY_H #define ASN_TYPE_ANY_H -#include /* Implemented via OCTET SRING type */ +#include /* Implemented via OCTET STRING type */ typedef struct ANY { uint8_t *buf; /* BER-encoded ANY contents */ diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index 19c81e725..6c582a048 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -12,6 +12,11 @@ static ber_tlv_tag_t asn_DEF_BIT_STRING_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)) }; +static asn_OCTET_STRING_specifics_t asn_DEF_BIT_STRING_specs = { + sizeof(BIT_STRING_t), + offsetof(BIT_STRING_t, _asn_ctx), + 1, /* Special indicator that this is a BIT STRING type */ +}; asn_TYPE_descriptor_t asn_DEF_BIT_STRING = { "BIT STRING", OCTET_STRING_free, /* Implemented in terms of OCTET STRING */ @@ -29,7 +34,7 @@ asn_TYPE_descriptor_t asn_DEF_BIT_STRING = { sizeof(asn_DEF_BIT_STRING_tags) / sizeof(asn_DEF_BIT_STRING_tags[0]), 0, 0, /* No members */ - (void *)1 /* Special indicator that this is a BIT STRING */ + &asn_DEF_BIT_STRING_specs }; /* @@ -41,16 +46,9 @@ BIT_STRING_constraint(asn_TYPE_descriptor_t *td, const void *sptr, const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; if(st && st->buf) { - if(st->size) { - if(st->size == 1 && st->buf[0] != 0) { - _ASN_ERRLOG(app_errlog, app_key, - "%s: invalid padding byte (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } - } else { + if(st->size == 1 && st->bits_unused) { _ASN_ERRLOG(app_errlog, app_key, - "%s: no padding byte (%s:%d)", + "%s: invalid padding byte (%s:%d)", td->name, __FILE__, __LINE__); return -1; } @@ -93,9 +91,9 @@ BIT_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, /* * Binary dump */ - for(buf++; buf < end; buf++) { + for(; buf < end; buf++) { int v = *buf; - int nline = xcan?0:((((buf - st->buf) - 1) % 8) == 0); + int nline = xcan?0:(((buf - st->buf) % 8) == 0); if(p >= scend || nline) { er.encoded += p - scratch; _ASN_CALLBACK(scratch, p - scratch); @@ -107,7 +105,7 @@ BIT_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, p += 8; } - if(!xcan && (((buf - st->buf) - 1) % 8) == 0) + if(!xcan && ((buf - st->buf) % 8) == 0) _i_ASN_TEXT_INDENT(1, ilevel); er.encoded += p - scratch; _ASN_CALLBACK(scratch, p - scratch); @@ -115,9 +113,9 @@ BIT_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, if(buf == end) { int v = *buf; - int mbit = st->buf[0]; /* bits to skip from the right */ + int ubits = st->bits_unused; int i; - for(i = 7; i >= mbit; i--) + for(i = 7; i >= ubits; i--) *p++ = (v & (1 << i)) ? 0x31 : 0x30; er.encoded += p - scratch; _ASN_CALLBACK(scratch, p - scratch); @@ -156,9 +154,9 @@ BIT_STRING_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, /* * Hexadecimal dump. */ - for(buf++; buf < end; buf++) { - if(((buf - st->buf) - 1) % 16 == 0 && (st->size > 17) - && buf != st->buf+1) { + for(; buf < end; buf++) { + if((buf - st->buf) % 16 == 0 && (st->size > 16) + && buf != st->buf) { _i_INDENT(1); /* Dump the string */ if(cb(scratch, p - scratch, app_key) < 0) return -1; @@ -172,7 +170,7 @@ BIT_STRING_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, if(p > scratch) { p--; /* Eat the tailing space */ - if((st->size > 17)) { + if((st->size > 16)) { _i_INDENT(1); } diff --git a/skeletons/BIT_STRING.h b/skeletons/BIT_STRING.h index 665d036d2..1601231f9 100644 --- a/skeletons/BIT_STRING.h +++ b/skeletons/BIT_STRING.h @@ -5,9 +5,16 @@ #ifndef _BIT_STRING_H_ #define _BIT_STRING_H_ -#include +#include /* Some help from OCTET STRING */ -typedef OCTET_STRING_t BIT_STRING_t; /* Implemented via OCTET STRING */ +typedef struct BIT_STRING_s { + uint8_t *buf; /* BIT STRING body */ + int size; /* Size of the above buffer */ + + int bits_unused;/* Unused trailing bits in the last octet (0..7) */ + + asn_struct_ctx_t _asn_ctx; /* Parsing across buffer boundaries */ +} BIT_STRING_t; extern asn_TYPE_descriptor_t asn_DEF_BIT_STRING; diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 3ba25abe5..66f3a4ba9 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -4,6 +4,7 @@ */ #include #include +#include /* for .bits_unused member */ #include #include @@ -13,6 +14,11 @@ static ber_tlv_tag_t asn_DEF_OCTET_STRING_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) }; +static asn_OCTET_STRING_specifics_t asn_DEF_OCTET_STRING_specs = { + sizeof(OCTET_STRING_t), + offsetof(OCTET_STRING_t, _asn_ctx), + 0 +}; asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { "OCTET STRING", OCTET_STRING_free, @@ -30,7 +36,7 @@ asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { sizeof(asn_DEF_OCTET_STRING_tags) / sizeof(asn_DEF_OCTET_STRING_tags[0]), 0, 0, /* No members */ - 0 /* No specifics */ + &asn_DEF_OCTET_STRING_specs }; #undef _CH_PHASE @@ -148,12 +154,7 @@ OS__add_stack_el(struct _stack *st) { static struct _stack * _new_stack() { - struct _stack *st; - (void *)st = CALLOC(1, sizeof(struct _stack)); - if(st == NULL) - return NULL; - - return st; + return (struct _stack *)CALLOC(1, sizeof(struct _stack)); } /* @@ -163,31 +164,34 @@ ber_dec_rval_t OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **os_structure, void *buf_ptr, size_t size, int tag_mode) { - OCTET_STRING_t *st = (OCTET_STRING_t *)*os_structure; + asn_OCTET_STRING_specifics_t *specs = td->specifics + ? td->specifics : &asn_DEF_OCTET_STRING_specs; + BIT_STRING_t *st = (BIT_STRING_t *)*os_structure; ber_dec_rval_t rval; asn_struct_ctx_t *ctx; ssize_t consumed_myself = 0; - struct _stack *stck; /* A stack structure */ + struct _stack *stck; /* Expectations stack structure */ struct _stack_el *sel = 0; /* Stack element */ int tlv_constr; - OS_type_e type_type = (OS_type_e)(int)td->specifics; + OS_type_e type_variant = (OS_type_e)specs->subvariant; ASN_DEBUG("Decoding %s as %s (frame %ld)", td->name, - (type_type == _TT_GENERIC) ? "OCTET STRING" : "OS-SpecialCase", + (type_variant == _TT_GENERIC) ? + "OCTET STRING" : "OS-SpecialCase", (long)size); /* * Create the string if does not exist. */ if(st == NULL) { - (void *)st = *os_structure = CALLOC(1, sizeof(*st)); + (void *)st = *os_structure = CALLOC(1, specs->struct_size); if(st == NULL) RETURN(RC_FAIL); } /* Restore parsing context */ - ctx = &st->_asn_ctx; + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); switch(ctx->phase) { case 0: @@ -207,10 +211,6 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, ctx->ptr = _new_stack(); if(ctx->ptr) { (void *)stck = ctx->ptr; - if(type_type == _TT_BIT_STRING) { - /* Number of meaningless tail bits */ - APPEND("\0", 1); - } } else { RETURN(RC_FAIL); } @@ -219,7 +219,7 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, * Jump into stackless primitive decoding. */ _CH_PHASE(ctx, 3); - if(type_type == _TT_ANY && tag_mode != 1) + if(type_variant == _TT_ANY && tag_mode != 1) APPEND(buf_ptr, rval.consumed); ADVANCE(rval.consumed); goto phase3; @@ -296,7 +296,7 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, ASN_DEBUG("Eat EOC; wn=%d--", sel->want_nulls); - if(type_type == _TT_ANY + if(type_variant == _TT_ANY && (tag_mode != 1 || sel->cont_level)) APPEND("\0\0", 2); @@ -320,7 +320,7 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, * Set up expected tags, * depending on ASN.1 type being decoded. */ - switch(type_type) { + switch(type_variant) { case _TT_BIT_STRING: /* X.690: 8.6.4.1, NOTE 2 */ /* Fall through */ @@ -384,7 +384,7 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, } else { sel->left = tlv_len; } - if(type_type == _TT_ANY + if(type_variant == _TT_ANY && (tag_mode != 1 || sel->cont_level)) APPEND(buf_ptr, tlvl); sel->got += tlvl; @@ -417,16 +417,11 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, len = ((ber_tlv_len_t)size < sel->left) ? (ber_tlv_len_t)size : sel->left; if(len > 0) { - if(type_type == _TT_BIT_STRING + if(type_variant == _TT_BIT_STRING && sel->bits_chopped == 0) { - /* - * Finalize the previous chunk: - * strip down unused bits. - */ - st->buf[st->size-1] &= 0xff << st->buf[0]; - + /* Put the unused-bits-octet away */ + st->bits_unused = *(uint8_t *)buf_ptr; APPEND(((char *)buf_ptr+1), (len - 1)); - st->buf[0] = *(uint8_t *)buf_ptr; sel->bits_chopped = 1; } else { APPEND(buf_ptr, len); @@ -451,12 +446,27 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, /* * Primitive form, no stack required. */ + assert(ctx->left >= 0); + if(size < (size_t)ctx->left) { + if(!size) RETURN(RC_WMORE); + if(type_variant == _TT_BIT_STRING && ctx->step == 0) { + st->bits_unused = *(uint8_t *)buf_ptr; + ctx->left--; + ADVANCE(1); + } APPEND(buf_ptr, size); + assert(ctx->step); ctx->left -= size; ADVANCE(size); RETURN(RC_WMORE); } else { + if(type_variant == _TT_BIT_STRING + && ctx->step == 0 && ctx->left) { + st->bits_unused = *(uint8_t *)buf_ptr; + ctx->left--; + ADVANCE(1); + } APPEND(buf_ptr, ctx->left); ADVANCE(ctx->left); ctx->left = 0; @@ -478,14 +488,15 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, /* * BIT STRING-specific processing. */ - if(type_type == _TT_BIT_STRING && st->size >= 2) { + if(type_variant == _TT_BIT_STRING && st->size) { /* Finalize BIT STRING: zero out unused bits. */ - st->buf[st->size-1] &= 0xff << st->buf[0]; + st->buf[st->size-1] &= 0xff << st->bits_unused; } ASN_DEBUG("Took %d bytes to encode %s: [%s]:%d", consumed_myself, td->name, - (type_type == _TT_GENERIC) ? (char *)st->buf : "", st->size); + (type_variant == _TT_GENERIC) ? (char *)st->buf : "", + st->size); RETURN(RC_OK); @@ -495,79 +506,65 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, * Encode OCTET STRING type using DER. */ asn_enc_rval_t -OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *ptr, +OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - asn_enc_rval_t erval; - OCTET_STRING_t *st = (OCTET_STRING_t *)ptr; - int add_byte = 0; - OS_type_e type_type = (OS_type_e)(int)td->specifics; + asn_enc_rval_t er; + asn_OCTET_STRING_specifics_t *specs = td->specifics + ? td->specifics : &asn_DEF_OCTET_STRING_specs; + BIT_STRING_t *st = (BIT_STRING_t *)sptr; + OS_type_e type_variant = (OS_type_e)specs->subvariant; + int fix_last_byte = 0; ASN_DEBUG("%s %s as OCTET STRING", cb?"Estimating":"Encoding", td->name); /* - * Canonicalize BIT STRING. + * Write tags. */ - if(type_type == _TT_BIT_STRING) { - switch(st->size) { - case 0: add_byte = 1; break; - case 1: st->buf[0] = 0; break; - default: - /* Finalize BIT STRING: zero out unused bits. */ - st->buf[st->size-1] &= 0xff << st->buf[0]; + if(type_variant != _TT_ANY || tag_mode == 1) { + er.encoded = der_write_tags(td, + (type_variant == _TT_BIT_STRING) + st->size, + tag_mode, type_variant == _TT_ANY, tag, cb, app_key); + if(er.encoded == -1) { + er.failed_type = td; + er.structure_ptr = sptr; + return er; } + } else { + /* Disallow: [] IMPLICIT ANY */ + assert(type_variant != _TT_ANY || tag_mode != -1); + er.encoded = 0; + } + + if(!cb) { + er.encoded += (type_variant == _TT_BIT_STRING) + st->size; + return er; } /* - * Write tags. + * Prepare to deal with the last octet of BIT STRING. */ - if(type_type != _TT_ANY || tag_mode == 1) { - erval.encoded = der_write_tags(td, st->size + add_byte, - tag_mode, type_type == _TT_ANY, tag, cb, app_key); - if(erval.encoded == -1) { - erval.failed_type = td; - erval.structure_ptr = ptr; - return erval; - } - } else { - /* Disallow: [...] IMPLICIT ANY */ - assert(type_type != _TT_ANY || tag_mode != -1); - erval.encoded = 0; + if(type_variant == _TT_BIT_STRING) { + uint8_t b = st->bits_unused & 0x07; + if(b && st->size) fix_last_byte = 1; + _ASN_CALLBACK(&b, 1); + er.encoded++; } - if(cb) { - uint8_t zero; - uint8_t *buf; - int size; - - /* BIT STRING-aware handling */ - if(add_byte) { - zero = 0; - buf = &zero; - size = 1; - } else if(st->buf) { - buf = st->buf; - size = st->size; - } else { - assert(st->size == 0); - buf = 0; /* Not used */ - size = 0; - } + /* Invoke callback for the main part of the buffer */ + _ASN_CALLBACK(st->buf, st->size - fix_last_byte); - if(size) { - if(cb(buf, size, app_key) < 0) { - erval.encoded = -1; - erval.failed_type = td; - erval.structure_ptr = ptr; - return erval; - } - } + /* The last octet should be stripped off the unused bits */ + if(fix_last_byte) { + uint8_t b = st->buf[st->size-1] & (0xff << st->bits_unused); + _ASN_CALLBACK(&b, 1); } - erval.encoded += st->size + add_byte; - - return erval; + er.encoded += st->size; + return er; +cb_failed: + _ASN_ENCODE_FAILED; } asn_enc_rval_t @@ -790,7 +787,11 @@ OCTET_STRING_print_ascii(asn_TYPE_descriptor_t *td, const void *sptr, void OCTET_STRING_free(asn_TYPE_descriptor_t *td, void *sptr, int contents_only) { OCTET_STRING_t *st = (OCTET_STRING_t *)sptr; - struct _stack *stck = (struct _stack *)st->_asn_ctx.ptr; + asn_OCTET_STRING_specifics_t *specs = td->specifics + ? td->specifics : &asn_DEF_OCTET_STRING_specs; + asn_struct_ctx_t *ctx = (asn_struct_ctx_t *) + ((char *)st + specs->ctx_offset); + struct _stack *stck = ctx->ptr; if(!td || !st) return; @@ -860,10 +861,12 @@ OCTET_STRING_fromBuf(OCTET_STRING_t *st, const char *str, int len) { } OCTET_STRING_t * -OCTET_STRING_new_fromBuf(const char *str, int len) { +OCTET_STRING_new_fromBuf(asn_TYPE_descriptor_t *td, const char *str, int len) { + asn_OCTET_STRING_specifics_t *specs = td->specifics + ? td->specifics : &asn_DEF_OCTET_STRING_specs; OCTET_STRING_t *st; - (void *)st = CALLOC(1, sizeof(*st)); + st = (OCTET_STRING_t *)CALLOC(1, specs->struct_size); if(st && str && OCTET_STRING_fromBuf(st, str, len)) { free(st); st = NULL; diff --git a/skeletons/OCTET_STRING.h b/skeletons/OCTET_STRING.h index 7291585b9..dd5262e83 100644 --- a/skeletons/OCTET_STRING.h +++ b/skeletons/OCTET_STRING.h @@ -24,9 +24,9 @@ der_type_encoder_f OCTET_STRING_encode_der; xer_type_encoder_f OCTET_STRING_encode_xer; xer_type_encoder_f OCTET_STRING_encode_xer_ascii; -/*********************************** - * Some handy conversion routines. * - ***********************************/ +/****************************** + * Handy conversion routines. * + ******************************/ /* * This function clears the previous value of the OCTET STRING (if any) @@ -39,14 +39,29 @@ xer_type_encoder_f OCTET_STRING_encode_xer_ascii; */ int OCTET_STRING_fromBuf(OCTET_STRING_t *s, const char *str, int size); +/* Handy conversion from the C string into the OCTET STRING. */ +#define OCTET_STRING_fromString(s, str) OCTET_STRING_fromBuf(s, str, -1); + /* * Allocate and fill the new OCTET STRING and return a pointer to the newly * allocated object. NULL is permitted in str: the function will just allocate * empty OCTET STRING. */ -OCTET_STRING_t *OCTET_STRING_new_fromBuf(const char *str, int size); +OCTET_STRING_t *OCTET_STRING_new_fromBuf(asn_TYPE_descriptor_t *td, + const char *str, int size); -/* Handy conversion from the C string into the OCTET STRING. */ -#define OCTET_STRING_fromString(s, str) OCTET_STRING_fromBuf(s, str, -1); +/**************************** + * Internally useful stuff. * + ****************************/ + +typedef struct asn_OCTET_STRING_specifics_s { + /* + * Target structure description. + */ + int struct_size; /* Size of the structure */ + int ctx_offset; /* Offset of the asn_struct_ctx_t member */ + + int subvariant; /* {0,1,2} for O-S, BIT STRING or ANY */ +} asn_OCTET_STRING_specifics_t; #endif /* _OCTET_STRING_H_ */ diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index 937ef10e6..7e3254eda 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -133,14 +133,14 @@ typedef struct asn_TYPE_descriptor_s { int (*xer_decoder);/* PLACEHOLDER */ /* Free-form XER decoder */ xer_type_encoder_f *xer_encoder; /* [Canonical] XER encoder */ - /* - * Functions used internally. Should not be used by applications. - */ - asn_outmost_tag_f *outmost_tag; /* */ + /*********************************************************************** + * Internally useful members. Not to be used by applications directly. * + **********************************************************************/ /* * Tags that are expected to occur. */ + asn_outmost_tag_f *outmost_tag; /* */ ber_tlv_tag_t *tags; /* Effective tags sequence for this type */ int tags_count; /* Number of tags which are expected */ ber_tlv_tag_t *all_tags;/* Every tag for BER/containment */ diff --git a/skeletons/file-dependencies b/skeletons/file-dependencies index 9018da073..6b7ac6973 100644 --- a/skeletons/file-dependencies +++ b/skeletons/file-dependencies @@ -7,7 +7,6 @@ # ANY.h ANY.c -BIT_STRING.h BIT_STRING.c BMPString.h BMPString.c BOOLEAN.h BOOLEAN.c ENUMERATED.h ENUMERATED.c INTEGER.h @@ -47,6 +46,7 @@ asn_application.h asn_internal.h asn_types.h OCTET_STRING.h OCTET_STRING.c # This one is used too widely +BIT_STRING.h BIT_STRING.c # This one is necessary for the above one ber_decoder.h ber_decoder.c ber_codec_prim.c ber_codec_prim.h ber_tlv_length.h ber_tlv_length.c diff --git a/skeletons/tests/check-length.c b/skeletons/tests/check-length.c index c01c5dd02..d76902de0 100644 --- a/skeletons/tests/check-length.c +++ b/skeletons/tests/check-length.c @@ -40,7 +40,7 @@ check(int size) { ber_dec_rval_t rval; int i; - os = OCTET_STRING_new_fromBuf(0, size); + os = OCTET_STRING_new_fromBuf(&asn_DEF_OCTET_STRING, 0, size); assert(os); assert(os->size == 0); @@ -69,9 +69,9 @@ check(int size) { } if(0) { - printf("new(%d):", size); + fprintf(stderr, "new(%d):", size); for(i = 0; i < (buf_off<10?buf_off:10); i++) - printf(" %02x", buf[i]); + fprintf(stderr, " %02x", buf[i]); printf("\n"); } @@ -90,7 +90,7 @@ main() { int i; for(i = 0; i < 66000; i++) { - if(i == 4500) i = 64000; + if(i == 4500) i = 64000; /* Jump */ check(i); } From 0aa8690634882d19f1f3714c6dce777355d367e2 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 12 Oct 2004 23:26:53 +0000 Subject: [PATCH 0499/1469] small fixes git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@499 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 9 + TODO | 8 +- configure | 2 +- configure.in | 2 +- libasn1fix/asn1fix_constr.c | 6 +- libasn1parser/asn1p_y.c | 1747 ++++++++++++++++++----------------- libasn1parser/asn1p_y.y | 23 +- 7 files changed, 928 insertions(+), 869 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9e9907418..c4b1ab219 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,13 @@ +0.9.7.2: 2004-Oct-12 + + * Empty SEQUENCE and SET clauses are now allowed. + +0.9.7.1: 2004-Oct-12 + + * Fixed automatic tagging for extensions of compound types. + * Fixed ParametrizedReference parsing: {} are now recognized. + 0.9.7: 2004-Oct-11 * Finished CANONICAL-XER implementation by adding SET and SET OF diff --git a/TODO b/TODO index e341a102e..17784954a 100644 --- a/TODO +++ b/TODO @@ -12,7 +12,11 @@ which is already completed. Support for slicing the IOCs to produce "views" is not yet designed. -MINOR: +MEDIUM: 1. Support for DEFAULT encoding and decoding, at least in INTEGER/ENUMERATED types. -3. Support for EXTERNAL, EMBEDDED-PDV and CHARACTER STRING types. +2. Support for EXTERNAL, EMBEDDED-PDV and CHARACTER STRING types. + +MINOR: + +1. Parsing of CONSTRAINED BY clauses diff --git a/configure b/configure index f668e8576..78e1c9a9a 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.9.7 + VERSION=0.9.7.2 cat >>confdefs.h <<_ACEOF diff --git a/configure.in b/configure.in index 7a8aa9490..5c6a1e792 100644 --- a/configure.in +++ b/configure.in @@ -3,7 +3,7 @@ AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_BUILD AC_CANONICAL_TARGET AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.9.7) +AM_INIT_AUTOMAKE(asn1c, 0.9.7.2) AM_MAINTAINER_MODE diff --git a/libasn1fix/asn1fix_constr.c b/libasn1fix/asn1fix_constr.c index 34970c915..79fd0d865 100644 --- a/libasn1fix/asn1fix_constr.c +++ b/libasn1fix/asn1fix_constr.c @@ -302,8 +302,10 @@ asn1f_fix_constr_autotag(arg_t *arg) { TQ_FOR(v, &(expr->members), next) { int must_explicit; - if(v->expr_type == A1TC_EXTENSIBLE) - break; + if(v->expr_type == A1TC_EXTENSIBLE) { + /* 28.5, d) */ + continue; + } if(0) { /* This may be not true in case COMPONENTS OF */ diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index 02d618108..2c520f884 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -205,11 +205,11 @@ typedef union { -#define YYFINAL 402 +#define YYFINAL 407 #define YYFLAG -32768 #define YYNTBASE 115 -#define YYTRANSLATE(x) ((unsigned)(x) <= 355 ? yytranslate[x] : 212) +#define YYTRANSLATE(x) ((unsigned)(x) <= 355 ? yytranslate[x] : 213) static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -256,136 +256,137 @@ static const short yyprhs[] = { 0, 31, 33, 38, 40, 41, 43, 45, 48, 51, 54, 57, 60, 63, 64, 66, 68, 71, 73, 75, 77, 79, 81, 82, 86, 88, 92, 95, 97, 100, 105, - 107, 111, 113, 115, 119, 123, 126, 128, 132, 134, - 136, 143, 145, 147, 148, 150, 152, 156, 158, 160, - 165, 169, 173, 180, 182, 186, 188, 192, 196, 198, - 202, 204, 206, 208, 212, 216, 220, 222, 224, 228, - 231, 233, 239, 240, 242, 244, 248, 251, 256, 261, - 262, 264, 265, 272, 274, 277, 279, 281, 283, 287, - 291, 295, 297, 299, 304, 309, 314, 321, 328, 330, - 335, 340, 342, 346, 348, 352, 356, 360, 362, 366, - 368, 372, 374, 376, 378, 380, 385, 389, 390, 394, - 396, 398, 400, 402, 404, 406, 408, 410, 412, 416, - 418, 421, 423, 425, 427, 429, 432, 435, 437, 439, - 442, 445, 447, 449, 451, 453, 456, 458, 461, 463, - 465, 467, 469, 471, 473, 475, 477, 479, 481, 483, - 485, 487, 489, 491, 493, 495, 497, 499, 500, 502, - 504, 509, 513, 518, 520, 524, 530, 532, 536, 540, - 544, 549, 553, 555, 559, 563, 567, 571, 573, 575, - 577, 580, 583, 587, 589, 591, 593, 595, 597, 599, - 601, 607, 609, 613, 615, 619, 620, 622, 624, 626, - 628, 630, 632, 636, 641, 643, 647, 650, 654, 656, - 660, 661, 663, 665, 668, 671, 675, 677, 681, 683, - 688, 693, 695, 697, 699, 701, 702, 704, 706, 709, - 712, 714, 716, 718, 719, 721 + 107, 111, 113, 117, 119, 123, 127, 130, 132, 136, + 138, 142, 144, 151, 153, 155, 156, 158, 160, 164, + 166, 168, 173, 177, 181, 188, 190, 194, 196, 200, + 204, 206, 210, 212, 214, 215, 217, 219, 223, 227, + 231, 233, 235, 239, 242, 244, 250, 251, 253, 255, + 259, 262, 267, 272, 273, 275, 276, 283, 285, 288, + 290, 292, 294, 298, 302, 306, 308, 310, 315, 320, + 325, 332, 339, 341, 346, 351, 353, 357, 359, 363, + 367, 371, 373, 377, 379, 383, 385, 387, 389, 391, + 396, 400, 401, 405, 407, 409, 411, 413, 415, 417, + 419, 421, 423, 427, 429, 432, 434, 436, 438, 440, + 443, 446, 448, 450, 453, 456, 458, 460, 462, 464, + 467, 469, 472, 474, 476, 478, 480, 482, 484, 486, + 488, 490, 492, 494, 496, 498, 500, 502, 504, 506, + 508, 510, 511, 513, 515, 520, 524, 529, 531, 535, + 541, 543, 547, 551, 555, 560, 564, 566, 570, 574, + 578, 582, 584, 586, 588, 591, 594, 598, 600, 602, + 604, 606, 608, 610, 612, 618, 620, 624, 626, 630, + 631, 633, 635, 637, 639, 641, 643, 647, 652, 654, + 658, 661, 665, 667, 671, 672, 674, 676, 679, 682, + 686, 688, 692, 694, 699, 704, 706, 708, 710, 712, + 713, 715, 717, 720, 723, 725, 727, 729, 730, 732 }; static const short yyrhs[] = { 116, - 0, 117, 0, 116, 117, 0, 208, 118, 34, 122, + 0, 117, 0, 116, 117, 0, 209, 118, 34, 122, 3, 21, 125, 39, 0, 0, 119, 0, 104, 120, 105, 0, 104, 105, 0, 121, 0, 120, 121, 0, - 211, 0, 211, 106, 9, 107, 0, 9, 0, 0, + 212, 0, 212, 106, 9, 107, 0, 9, 0, 0, 123, 0, 124, 0, 123, 124, 0, 41, 84, 0, 52, 84, 0, 20, 84, 0, 43, 53, 0, 12, 57, 0, 0, 126, 0, 127, 0, 126, 127, 0, - 129, 0, 134, 0, 142, 0, 168, 0, 137, 0, - 0, 38, 12, 128, 0, 176, 0, 54, 130, 108, + 129, 0, 134, 0, 142, 0, 169, 0, 137, 0, + 0, 38, 12, 128, 0, 177, 0, 54, 130, 108, 0, 54, 46, 0, 131, 0, 130, 131, 0, 132, - 46, 208, 118, 0, 133, 0, 132, 109, 133, 0, - 208, 0, 211, 0, 42, 135, 108, 0, 42, 17, - 108, 0, 42, 108, 0, 136, 0, 135, 109, 136, - 0, 208, 0, 211, 0, 208, 138, 3, 104, 139, - 105, 0, 163, 0, 173, 0, 0, 140, 0, 141, - 0, 140, 109, 141, 0, 102, 0, 184, 0, 208, - 3, 206, 87, 0, 208, 3, 161, 0, 208, 3, - 151, 0, 208, 104, 143, 105, 3, 161, 0, 144, - 0, 143, 109, 144, 0, 208, 0, 208, 110, 211, - 0, 173, 110, 211, 0, 146, 0, 145, 109, 146, - 0, 161, 0, 211, 0, 148, 0, 147, 109, 148, - 0, 211, 161, 200, 0, 30, 68, 161, 0, 160, - 0, 150, 0, 149, 109, 150, 0, 211, 161, 0, - 160, 0, 28, 104, 153, 105, 155, 0, 0, 88, - 0, 154, 0, 153, 109, 154, 0, 166, 200, 0, - 166, 161, 200, 152, 0, 166, 166, 200, 152, 0, - 0, 156, 0, 0, 95, 82, 104, 157, 158, 105, - 0, 159, 0, 158, 159, 0, 4, 0, 166, 0, - 102, 0, 102, 111, 171, 0, 102, 111, 205, 0, - 206, 162, 180, 0, 175, 0, 176, 0, 27, 104, - 149, 105, 0, 78, 104, 147, 105, 0, 79, 104, - 147, 105, 0, 78, 180, 68, 210, 206, 162, 0, - 79, 180, 68, 210, 206, 162, 0, 18, 0, 18, - 35, 25, 211, 0, 208, 104, 145, 105, 0, 163, - 0, 56, 68, 163, 0, 11, 0, 11, 112, 208, - 0, 209, 112, 208, 0, 11, 112, 211, 0, 209, - 0, 209, 112, 164, 0, 165, 0, 164, 112, 165, - 0, 167, 0, 167, 0, 13, 0, 14, 0, 211, - 138, 3, 169, 0, 211, 110, 169, 0, 0, 104, - 170, 172, 0, 63, 0, 45, 0, 86, 0, 5, - 0, 7, 0, 6, 0, 205, 0, 171, 0, 211, - 0, 208, 112, 211, 0, 4, 0, 172, 4, 0, - 24, 0, 63, 0, 76, 0, 174, 0, 67, 81, - 0, 65, 51, 0, 77, 0, 44, 0, 36, 71, - 0, 26, 81, 0, 91, 0, 47, 0, 58, 0, - 40, 0, 22, 81, 0, 173, 0, 174, 202, 0, - 23, 0, 48, 0, 49, 0, 50, 0, 59, 0, - 64, 0, 74, 0, 83, 0, 85, 0, 90, 0, - 92, 0, 93, 0, 94, 0, 66, 0, 99, 0, - 100, 0, 97, 0, 98, 0, 96, 0, 0, 181, - 0, 182, 0, 80, 106, 183, 107, 0, 106, 183, - 107, 0, 182, 106, 183, 107, 0, 184, 0, 184, - 109, 102, 0, 184, 109, 102, 109, 184, 0, 185, - 0, 184, 177, 185, 0, 184, 178, 185, 0, 185, - 179, 185, 0, 187, 106, 183, 107, 0, 106, 183, - 107, 0, 188, 0, 188, 186, 188, 0, 61, 186, - 188, 0, 188, 186, 60, 0, 61, 186, 60, 0, - 194, 0, 189, 0, 101, 0, 101, 113, 0, 113, - 101, 0, 113, 101, 113, 0, 80, 0, 46, 0, - 205, 0, 211, 0, 6, 0, 45, 0, 86, 0, - 95, 30, 104, 190, 105, 0, 191, 0, 190, 109, - 191, 0, 102, 0, 211, 180, 192, 0, 0, 193, - 0, 73, 0, 15, 0, 69, 0, 195, 0, 196, - 0, 104, 208, 105, 0, 195, 104, 197, 105, 0, - 198, 0, 197, 109, 198, 0, 114, 199, 0, 114, - 112, 199, 0, 211, 0, 199, 112, 211, 0, 0, - 201, 0, 69, 0, 33, 169, 0, 104, 105, 0, - 104, 203, 105, 0, 204, 0, 203, 109, 204, 0, - 211, 0, 211, 106, 205, 107, 0, 211, 106, 171, - 107, 0, 205, 0, 102, 0, 9, 0, 10, 0, - 0, 207, 0, 103, 0, 103, 52, 0, 103, 41, - 0, 11, 0, 12, 0, 12, 0, 0, 211, 0, - 8, 0 + 46, 209, 118, 0, 133, 0, 132, 109, 133, 0, + 209, 0, 209, 104, 105, 0, 212, 0, 42, 135, + 108, 0, 42, 17, 108, 0, 42, 108, 0, 136, + 0, 135, 109, 136, 0, 209, 0, 209, 104, 105, + 0, 212, 0, 209, 138, 3, 104, 139, 105, 0, + 164, 0, 174, 0, 0, 140, 0, 141, 0, 140, + 109, 141, 0, 102, 0, 185, 0, 209, 3, 207, + 87, 0, 209, 3, 162, 0, 209, 3, 152, 0, + 209, 104, 143, 105, 3, 162, 0, 144, 0, 143, + 109, 144, 0, 209, 0, 209, 110, 212, 0, 174, + 110, 212, 0, 146, 0, 145, 109, 146, 0, 162, + 0, 212, 0, 0, 148, 0, 149, 0, 148, 109, + 149, 0, 212, 162, 201, 0, 30, 68, 162, 0, + 161, 0, 151, 0, 150, 109, 151, 0, 212, 162, + 0, 161, 0, 28, 104, 154, 105, 156, 0, 0, + 88, 0, 155, 0, 154, 109, 155, 0, 167, 201, + 0, 167, 162, 201, 153, 0, 167, 167, 201, 153, + 0, 0, 157, 0, 0, 95, 82, 104, 158, 159, + 105, 0, 160, 0, 159, 160, 0, 4, 0, 167, + 0, 102, 0, 102, 111, 172, 0, 102, 111, 206, + 0, 207, 163, 181, 0, 176, 0, 177, 0, 27, + 104, 150, 105, 0, 78, 104, 147, 105, 0, 79, + 104, 147, 105, 0, 78, 181, 68, 211, 207, 163, + 0, 79, 181, 68, 211, 207, 163, 0, 18, 0, + 18, 35, 25, 212, 0, 209, 104, 145, 105, 0, + 164, 0, 56, 68, 164, 0, 11, 0, 11, 112, + 209, 0, 210, 112, 209, 0, 11, 112, 212, 0, + 210, 0, 210, 112, 165, 0, 166, 0, 165, 112, + 166, 0, 168, 0, 168, 0, 13, 0, 14, 0, + 212, 138, 3, 170, 0, 212, 110, 170, 0, 0, + 104, 171, 173, 0, 63, 0, 45, 0, 86, 0, + 5, 0, 7, 0, 6, 0, 206, 0, 172, 0, + 212, 0, 209, 112, 212, 0, 4, 0, 173, 4, + 0, 24, 0, 63, 0, 76, 0, 175, 0, 67, + 81, 0, 65, 51, 0, 77, 0, 44, 0, 36, + 71, 0, 26, 81, 0, 91, 0, 47, 0, 58, + 0, 40, 0, 22, 81, 0, 174, 0, 175, 203, + 0, 23, 0, 48, 0, 49, 0, 50, 0, 59, + 0, 64, 0, 74, 0, 83, 0, 85, 0, 90, + 0, 92, 0, 93, 0, 94, 0, 66, 0, 99, + 0, 100, 0, 97, 0, 98, 0, 96, 0, 0, + 182, 0, 183, 0, 80, 106, 184, 107, 0, 106, + 184, 107, 0, 183, 106, 184, 107, 0, 185, 0, + 185, 109, 102, 0, 185, 109, 102, 109, 185, 0, + 186, 0, 185, 178, 186, 0, 185, 179, 186, 0, + 186, 180, 186, 0, 188, 106, 184, 107, 0, 106, + 184, 107, 0, 189, 0, 189, 187, 189, 0, 61, + 187, 189, 0, 189, 187, 60, 0, 61, 187, 60, + 0, 195, 0, 190, 0, 101, 0, 101, 113, 0, + 113, 101, 0, 113, 101, 113, 0, 80, 0, 46, + 0, 206, 0, 212, 0, 6, 0, 45, 0, 86, + 0, 95, 30, 104, 191, 105, 0, 192, 0, 191, + 109, 192, 0, 102, 0, 212, 181, 193, 0, 0, + 194, 0, 73, 0, 15, 0, 69, 0, 196, 0, + 197, 0, 104, 209, 105, 0, 196, 104, 198, 105, + 0, 199, 0, 198, 109, 199, 0, 114, 200, 0, + 114, 112, 200, 0, 212, 0, 200, 112, 212, 0, + 0, 202, 0, 69, 0, 33, 170, 0, 104, 105, + 0, 104, 204, 105, 0, 205, 0, 204, 109, 205, + 0, 212, 0, 212, 106, 206, 107, 0, 212, 106, + 172, 107, 0, 206, 0, 102, 0, 9, 0, 10, + 0, 0, 208, 0, 103, 0, 103, 52, 0, 103, + 41, 0, 11, 0, 12, 0, 12, 0, 0, 212, + 0, 8, 0 }; #endif #if YYDEBUG != 0 static const short yyrline[] = { 0, - 300, 306, 312, 328, 353, 355, 358, 362, 367, 374, - 382, 387, 391, 400, 402, 410, 414, 422, 426, 429, - 432, 436, 456, 458, 466, 470, 502, 506, 515, 522, - 535, 542, 544, 556, 569, 576, 581, 587, 593, 602, - 608, 614, 621, 629, 633, 636, 643, 649, 655, 662, - 671, 681, 689, 697, 699, 709, 712, 716, 719, 731, - 743, 749, 765, 774, 784, 794, 799, 806, 816, 822, - 828, 832, 844, 850, 856, 863, 870, 875, 881, 887, - 893, 898, 908, 910, 913, 921, 927, 936, 942, 959, - 961, 966, 970, 975, 980, 986, 990, 1001, 1010, 1019, - 1030, 1052, 1056, 1062, 1068, 1074, 1080, 1090, 1100, 1106, - 1120, 1144, 1151, 1165, 1174, 1184, 1194, 1204, 1212, 1233, - 1242, 1251, 1252, 1254, 1261, 1273, 1283, 1291, 1291, 1296, - 1301, 1306, 1311, 1315, 1319, 1323, 1326, 1331, 1343, 1359, - 1370, 1384, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, - 1394, 1395, 1396, 1402, 1404, 1405, 1408, 1415, 1427, 1429, - 1433, 1437, 1438, 1439, 1440, 1441, 1445, 1446, 1447, 1448, - 1452, 1453, 1460, 1460, 1461, 1461, 1462, 1464, 1466, 1471, - 1475, 1484, 1488, 1493, 1497, 1503, 1513, 1517, 1520, 1523, - 1528, 1537, 1545, 1551, 1558, 1566, 1574, 1583, 1586, 1591, - 1593, 1594, 1595, 1598, 1602, 1607, 1611, 1622, 1626, 1631, - 1638, 1644, 1648, 1653, 1659, 1671, 1673, 1676, 1680, 1683, - 1688, 1692, 1700, 1715, 1721, 1728, 1741, 1753, 1768, 1772, - 1789, 1794, 1797, 1802, 1824, 1829, 1834, 1840, 1846, 1854, - 1862, 1870, 1877, 1887, 1892, 1922, 1924, 1927, 1932, 1936, - 1942, 1947, 1954, 1961, 1963, 1967 + 301, 307, 313, 329, 354, 356, 359, 363, 368, 375, + 383, 388, 392, 401, 403, 411, 415, 423, 427, 430, + 433, 437, 457, 459, 467, 471, 503, 507, 516, 523, + 536, 543, 545, 557, 570, 577, 582, 588, 594, 603, + 609, 615, 622, 628, 636, 640, 643, 650, 656, 662, + 669, 675, 684, 694, 702, 710, 712, 722, 725, 729, + 732, 744, 756, 762, 778, 787, 797, 807, 812, 819, + 829, 835, 841, 845, 857, 859, 861, 867, 873, 880, + 887, 892, 898, 904, 910, 915, 925, 927, 930, 938, + 944, 953, 959, 976, 978, 983, 987, 992, 997, 1003, + 1007, 1018, 1027, 1036, 1047, 1069, 1073, 1079, 1085, 1091, + 1097, 1107, 1117, 1123, 1137, 1161, 1168, 1182, 1191, 1201, + 1211, 1221, 1229, 1250, 1259, 1268, 1269, 1271, 1278, 1290, + 1300, 1308, 1308, 1313, 1318, 1323, 1328, 1332, 1336, 1340, + 1343, 1348, 1360, 1376, 1387, 1401, 1403, 1404, 1405, 1406, + 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1419, 1421, 1422, + 1425, 1432, 1444, 1446, 1450, 1454, 1455, 1456, 1457, 1458, + 1462, 1463, 1464, 1465, 1469, 1470, 1477, 1477, 1478, 1478, + 1479, 1481, 1483, 1488, 1492, 1501, 1505, 1510, 1514, 1520, + 1530, 1534, 1537, 1540, 1545, 1554, 1562, 1568, 1575, 1583, + 1591, 1600, 1603, 1608, 1610, 1611, 1612, 1615, 1619, 1624, + 1628, 1639, 1643, 1648, 1655, 1661, 1665, 1670, 1676, 1688, + 1690, 1693, 1697, 1700, 1705, 1709, 1717, 1732, 1738, 1745, + 1758, 1770, 1785, 1789, 1806, 1811, 1814, 1819, 1841, 1846, + 1851, 1857, 1863, 1871, 1879, 1887, 1894, 1904, 1909, 1939, + 1941, 1944, 1949, 1953, 1959, 1964, 1971, 1978, 1980, 1984 }; #endif @@ -419,21 +420,21 @@ static const char * const yytname[] = { "$","error","$undefined.","TOK_PPEQ", "ImportsBundleSet","ImportsBundle","ImportsList","ImportsElement","ExportsDefinition", "ExportsBody","ExportsElement","ValueSetDefinition","DefinedTypeRef","optValueSetBody", "ValueSetBody","ValueSetElement","DataTypeReference","ParameterArgumentList", -"ParameterArgumentName","ActualParameterList","ActualParameter","ComponentTypeLists", -"ComponentType","AlternativeTypeLists","AlternativeType","ClassDeclaration", -"optUnique","ClassFieldList","ClassField","optWithSyntax","WithSyntax","@2", -"WithSyntaxFormat","WithSyntaxFormatToken","ExtensionAndException","Type","TypeDeclaration", -"ComplexTypeReference","ComplexTypeReferenceAmpList","ComplexTypeReferenceElement", -"ClassFieldIdentifier","ClassFieldName","ValueDefinition","Value","@3","DefinedValue", -"Opaque","BasicTypeId","BasicTypeId_UniverationCompatible","BasicType","BasicString", -"Union","Intersection","Except","optConstraints","Constraints","SetOfConstraints", -"ElementSetSpecs","ElementSetSpec","ConstraintSubtypeElement","ConstraintRangeSpec", -"ConstraintSpec","ConstraintValue","WithComponents","WithComponentsList","WithComponentsElement", -"optPresenceConstraint","PresenceConstraint","TableConstraint","SimpleTableConstraint", -"ComponentRelationConstraint","AtNotationList","AtNotationElement","ComponentIdList", -"optMarker","Marker","UniverationDefinition","UniverationList","UniverationElement", -"SignedNumber","optTag","Tag","TypeRefName","ObjectClassReference","optIdentifier", -"Identifier", NULL +"ParameterArgumentName","ActualParameterList","ActualParameter","optComponentTypeLists", +"ComponentTypeLists","ComponentType","AlternativeTypeLists","AlternativeType", +"ClassDeclaration","optUnique","ClassFieldList","ClassField","optWithSyntax", +"WithSyntax","@2","WithSyntaxFormat","WithSyntaxFormatToken","ExtensionAndException", +"Type","TypeDeclaration","ComplexTypeReference","ComplexTypeReferenceAmpList", +"ComplexTypeReferenceElement","ClassFieldIdentifier","ClassFieldName","ValueDefinition", +"Value","@3","DefinedValue","Opaque","BasicTypeId","BasicTypeId_UniverationCompatible", +"BasicType","BasicString","Union","Intersection","Except","optConstraints","Constraints", +"SetOfConstraints","ElementSetSpecs","ElementSetSpec","ConstraintSubtypeElement", +"ConstraintRangeSpec","ConstraintSpec","ConstraintValue","WithComponents","WithComponentsList", +"WithComponentsElement","optPresenceConstraint","PresenceConstraint","TableConstraint", +"SimpleTableConstraint","ComponentRelationConstraint","AtNotationList","AtNotationElement", +"ComponentIdList","optMarker","Marker","UniverationDefinition","UniverationList", +"UniverationElement","SignedNumber","optTag","Tag","TypeRefName","ObjectClassReference", +"optIdentifier","Identifier", NULL }; #endif @@ -442,28 +443,28 @@ static const short yyr1[] = { 0, 121, 121, 121, 122, 122, 123, 123, 124, 124, 124, 124, 124, 125, 125, 126, 126, 127, 127, 127, 127, 127, 128, 127, 127, 129, 129, 130, 130, 131, 132, - 132, 133, 133, 134, 134, 134, 135, 135, 136, 136, - 137, 138, 138, 139, 139, 140, 140, 141, 141, 142, - 142, 142, 142, 143, 143, 144, 144, 144, 145, 145, - 146, 146, 147, 147, 148, 148, 148, 149, 149, 150, - 150, 151, 152, 152, 153, 153, 154, 154, 154, 155, - 155, 157, 156, 158, 158, 159, 159, 160, 160, 160, - 161, 162, 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 163, 163, 163, 163, 163, 163, 164, - 164, 165, 166, 167, 167, 168, 169, 170, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 171, 171, 172, - 172, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 174, 174, 174, 175, 175, 176, 176, - 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, - 176, 176, 177, 177, 178, 178, 179, 180, 180, 181, - 181, 182, 182, 183, 183, 183, 184, 184, 184, 184, - 185, 185, 185, 185, 185, 185, 185, 185, 185, 186, - 186, 186, 186, 187, 187, 188, 188, 188, 188, 188, - 189, 190, 190, 191, 191, 192, 192, 193, 193, 193, - 194, 194, 195, 196, 197, 197, 198, 198, 199, 199, - 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, - 204, 204, 204, 205, 205, 206, 206, 207, 207, 207, - 208, 208, 209, 210, 210, 211 + 132, 133, 133, 133, 134, 134, 134, 135, 135, 136, + 136, 136, 137, 138, 138, 139, 139, 140, 140, 141, + 141, 142, 142, 142, 142, 143, 143, 144, 144, 144, + 145, 145, 146, 146, 147, 147, 148, 148, 149, 149, + 149, 150, 150, 151, 151, 152, 153, 153, 154, 154, + 155, 155, 155, 156, 156, 158, 157, 159, 159, 160, + 160, 161, 161, 161, 162, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 164, 164, 164, + 164, 164, 164, 165, 165, 166, 167, 168, 168, 169, + 170, 171, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 172, 172, 173, 173, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 175, 175, 175, + 176, 176, 177, 177, 177, 177, 177, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 178, 178, 179, 179, + 180, 181, 181, 182, 182, 183, 183, 184, 184, 184, + 185, 185, 185, 185, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 187, 187, 187, 187, 188, 188, 189, + 189, 189, 189, 189, 190, 191, 191, 192, 192, 193, + 193, 194, 194, 194, 195, 195, 196, 197, 198, 198, + 199, 199, 200, 200, 201, 201, 202, 202, 203, 203, + 204, 204, 205, 205, 205, 205, 205, 206, 206, 207, + 207, 208, 208, 208, 209, 209, 210, 211, 211, 212 }; static const short yyr2[] = { 0, @@ -471,280 +472,280 @@ static const short yyr2[] = { 0, 1, 4, 1, 0, 1, 1, 2, 2, 2, 2, 2, 2, 0, 1, 1, 2, 1, 1, 1, 1, 1, 0, 3, 1, 3, 2, 1, 2, 4, 1, - 3, 1, 1, 3, 3, 2, 1, 3, 1, 1, - 6, 1, 1, 0, 1, 1, 3, 1, 1, 4, - 3, 3, 6, 1, 3, 1, 3, 3, 1, 3, - 1, 1, 1, 3, 3, 3, 1, 1, 3, 2, - 1, 5, 0, 1, 1, 3, 2, 4, 4, 0, - 1, 0, 6, 1, 2, 1, 1, 1, 3, 3, - 3, 1, 1, 4, 4, 4, 6, 6, 1, 4, - 4, 1, 3, 1, 3, 3, 3, 1, 3, 1, - 3, 1, 1, 1, 1, 4, 3, 0, 3, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, - 2, 1, 1, 1, 1, 2, 2, 1, 1, 2, - 2, 1, 1, 1, 1, 2, 1, 2, 1, 1, + 3, 1, 3, 1, 3, 3, 2, 1, 3, 1, + 3, 1, 6, 1, 1, 0, 1, 1, 3, 1, + 1, 4, 3, 3, 6, 1, 3, 1, 3, 3, + 1, 3, 1, 1, 0, 1, 1, 3, 3, 3, + 1, 1, 3, 2, 1, 5, 0, 1, 1, 3, + 2, 4, 4, 0, 1, 0, 6, 1, 2, 1, + 1, 1, 3, 3, 3, 1, 1, 4, 4, 4, + 6, 6, 1, 4, 4, 1, 3, 1, 3, 3, + 3, 1, 3, 1, 3, 1, 1, 1, 1, 4, + 3, 0, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 1, 2, 1, 1, 1, 1, 2, + 2, 1, 1, 2, 2, 1, 1, 1, 1, 2, + 1, 2, 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, 0, 1, 1, - 4, 3, 4, 1, 3, 5, 1, 3, 3, 3, - 4, 3, 1, 3, 3, 3, 3, 1, 1, 1, - 2, 2, 3, 1, 1, 1, 1, 1, 1, 1, - 5, 1, 3, 1, 3, 0, 1, 1, 1, 1, - 1, 1, 3, 4, 1, 3, 2, 3, 1, 3, - 0, 1, 1, 2, 2, 3, 1, 3, 1, 4, - 4, 1, 1, 1, 1, 0, 1, 1, 2, 2, - 1, 1, 1, 0, 1, 1 + 1, 0, 1, 1, 4, 3, 4, 1, 3, 5, + 1, 3, 3, 3, 4, 3, 1, 3, 3, 3, + 3, 1, 1, 1, 2, 2, 3, 1, 1, 1, + 1, 1, 1, 1, 5, 1, 3, 1, 3, 0, + 1, 1, 1, 1, 1, 1, 3, 4, 1, 3, + 2, 3, 1, 3, 0, 1, 1, 2, 2, 3, + 1, 3, 1, 4, 4, 1, 1, 1, 1, 0, + 1, 1, 2, 2, 1, 1, 1, 0, 1, 1 }; static const short yydefact[] = { 0, - 251, 252, 1, 2, 5, 3, 0, 0, 6, 256, + 255, 256, 1, 2, 5, 3, 0, 0, 6, 260, 13, 8, 0, 9, 11, 14, 7, 10, 0, 0, 0, 0, 0, 0, 0, 15, 16, 0, 22, 20, - 18, 21, 19, 0, 17, 12, 23, 159, 0, 0, - 160, 161, 162, 0, 163, 164, 172, 165, 166, 167, - 168, 169, 170, 171, 0, 24, 25, 27, 28, 31, - 29, 30, 34, 0, 0, 32, 0, 46, 0, 47, - 49, 50, 36, 0, 37, 0, 40, 42, 43, 4, - 26, 246, 114, 253, 0, 142, 0, 0, 155, 149, - 153, 154, 143, 0, 0, 144, 148, 152, 0, 0, - 52, 53, 145, 118, 0, 33, 45, 44, 0, 35, - 38, 0, 0, 0, 248, 62, 61, 0, 247, 0, - 156, 151, 150, 147, 146, 0, 64, 0, 66, 0, - 0, 0, 48, 5, 41, 0, 250, 249, 114, 253, - 109, 0, 0, 178, 178, 60, 178, 112, 157, 145, - 102, 103, 0, 115, 117, 0, 0, 0, 0, 54, - 124, 125, 119, 120, 122, 116, 133, 135, 134, 244, - 245, 131, 130, 132, 128, 126, 137, 136, 0, 138, - 39, 0, 85, 246, 123, 0, 0, 0, 0, 0, - 0, 0, 179, 180, 0, 0, 101, 0, 158, 246, - 246, 65, 68, 67, 208, 209, 205, 0, 204, 210, - 0, 58, 0, 0, 0, 55, 56, 59, 187, 0, - 193, 199, 198, 221, 222, 206, 207, 0, 0, 0, - 0, 90, 0, 0, 233, 231, 231, 87, 232, 0, - 0, 98, 0, 78, 81, 246, 113, 0, 0, 0, - 73, 77, 246, 0, 184, 254, 0, 0, 254, 243, - 235, 0, 237, 242, 239, 0, 69, 71, 72, 63, - 200, 0, 0, 0, 0, 0, 51, 0, 175, 176, - 173, 174, 0, 0, 177, 0, 0, 0, 0, 121, - 140, 129, 139, 127, 0, 82, 91, 86, 234, 83, - 83, 110, 0, 104, 0, 80, 0, 246, 105, 0, - 231, 182, 0, 246, 255, 0, 106, 246, 236, 0, - 0, 111, 246, 201, 202, 197, 195, 0, 223, 192, - 57, 188, 189, 190, 0, 196, 194, 0, 0, 225, - 141, 0, 84, 88, 89, 99, 100, 138, 79, 181, - 76, 74, 75, 185, 0, 183, 0, 238, 0, 0, - 70, 203, 214, 0, 212, 178, 191, 0, 227, 229, - 224, 0, 92, 0, 107, 108, 241, 240, 211, 0, - 216, 228, 0, 226, 0, 186, 213, 219, 220, 218, - 215, 217, 230, 96, 0, 94, 97, 93, 95, 0, - 0, 0 + 18, 21, 19, 0, 17, 12, 23, 163, 0, 0, + 164, 165, 166, 0, 167, 168, 176, 169, 170, 171, + 172, 173, 174, 175, 0, 24, 25, 27, 28, 31, + 29, 30, 34, 0, 0, 32, 0, 47, 0, 48, + 50, 52, 36, 0, 37, 0, 40, 42, 44, 4, + 26, 250, 118, 257, 0, 146, 0, 0, 159, 153, + 157, 158, 147, 0, 0, 148, 152, 156, 0, 0, + 54, 55, 149, 122, 0, 33, 46, 45, 0, 0, + 35, 38, 0, 0, 0, 0, 252, 64, 63, 0, + 251, 0, 160, 155, 154, 151, 150, 0, 66, 0, + 68, 0, 0, 0, 49, 51, 5, 41, 43, 0, + 254, 253, 118, 257, 113, 0, 0, 182, 182, 62, + 182, 116, 161, 149, 106, 107, 0, 119, 121, 0, + 0, 0, 0, 56, 128, 129, 123, 124, 126, 120, + 137, 139, 138, 248, 249, 135, 134, 136, 132, 130, + 141, 140, 0, 142, 39, 0, 89, 250, 127, 0, + 0, 0, 0, 75, 0, 0, 183, 184, 75, 0, + 105, 0, 162, 250, 250, 67, 70, 69, 212, 213, + 209, 0, 208, 214, 0, 60, 0, 0, 0, 57, + 58, 61, 191, 0, 197, 203, 202, 225, 226, 210, + 211, 0, 0, 0, 0, 94, 0, 0, 237, 235, + 235, 91, 236, 0, 0, 102, 0, 82, 85, 250, + 117, 0, 0, 0, 76, 77, 81, 250, 0, 188, + 258, 0, 0, 258, 247, 239, 0, 241, 246, 243, + 0, 71, 73, 74, 65, 204, 0, 0, 0, 0, + 0, 53, 0, 179, 180, 177, 178, 0, 0, 181, + 0, 0, 0, 0, 125, 144, 133, 143, 131, 0, + 86, 95, 90, 238, 87, 87, 114, 0, 108, 0, + 84, 0, 250, 109, 0, 235, 186, 0, 250, 259, + 0, 110, 250, 240, 0, 0, 115, 250, 205, 206, + 201, 199, 0, 227, 196, 59, 192, 193, 194, 0, + 200, 198, 0, 0, 229, 145, 0, 88, 92, 93, + 103, 104, 142, 83, 185, 80, 78, 79, 189, 0, + 187, 0, 242, 0, 0, 72, 207, 218, 0, 216, + 182, 195, 0, 231, 233, 228, 0, 96, 0, 111, + 112, 245, 244, 215, 0, 220, 232, 0, 230, 0, + 190, 217, 223, 224, 222, 219, 221, 234, 100, 0, + 98, 101, 97, 99, 0, 0, 0 }; -static const short yydefgoto[] = { 400, +static const short yydefgoto[] = { 405, 3, 4, 8, 9, 13, 14, 25, 26, 27, 55, 56, 57, 106, 58, 74, 75, 76, 77, 59, 69, - 70, 60, 100, 215, 216, 217, 61, 126, 127, 266, - 267, 250, 251, 243, 244, 116, 344, 182, 183, 296, - 297, 385, 395, 396, 252, 268, 147, 148, 163, 164, - 184, 185, 62, 176, 229, 177, 292, 149, 103, 151, - 152, 283, 284, 286, 192, 193, 194, 254, 255, 219, - 273, 220, 221, 222, 364, 365, 391, 392, 223, 224, - 225, 339, 340, 369, 238, 239, 199, 262, 263, 226, - 240, 119, 179, 104, 314, 227 + 70, 60, 100, 219, 220, 221, 61, 128, 129, 271, + 272, 254, 255, 256, 247, 248, 118, 349, 186, 187, + 301, 302, 390, 400, 401, 257, 273, 151, 152, 167, + 168, 188, 189, 62, 180, 233, 181, 297, 153, 103, + 155, 156, 288, 289, 291, 196, 197, 198, 259, 260, + 223, 278, 224, 225, 226, 369, 370, 396, 397, 227, + 228, 229, 344, 345, 374, 242, 243, 203, 267, 268, + 230, 244, 121, 183, 104, 319, 231 }; -static const short yypact[] = { 93, --32768,-32768, 93,-32768, 65,-32768, 23, 78,-32768,-32768, --32768,-32768, 52,-32768, 68, 224,-32768,-32768, 118, 122, - 51, 59, 139, 113, 203, 224,-32768, 109,-32768,-32768, --32768,-32768,-32768, 201,-32768,-32768, 318,-32768, 220, 9, --32768,-32768,-32768, 173,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 198, 318,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 12, 532,-32768, 135,-32768, 46,-32768, --32768,-32768,-32768, 32,-32768, -11,-32768,-32768,-32768,-32768, --32768, -6, 149,-32768, 196,-32768, 207, 226,-32768,-32768, --32768,-32768,-32768, 223, 214,-32768,-32768,-32768, 549, 305, --32768,-32768,-32768, 200, 307,-32768,-32768,-32768, 252,-32768, --32768, 93, 252, 211, 30,-32768,-32768, 395,-32768, 252, --32768,-32768,-32768,-32768,-32768, -25,-32768, 208, 209, 216, - 293, 155,-32768, 65,-32768, 217,-32768,-32768, -5, 229, - 292, 231, 268, -23, 64,-32768, -55,-32768,-32768, 233, --32768,-32768, 234,-32768,-32768, 336, 549, 332, 332, 167, --32768,-32768, 230,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 232, 235, --32768, 77,-32768, 181,-32768, 321, 8, 280, 241, 39, - 248, 281,-32768, 242, 39, 282,-32768, 45,-32768, 21, - 250,-32768,-32768,-32768,-32768,-32768,-32768, 29,-32768,-32768, - 325,-32768, 93, 248, 246, 253,-32768, 225, 267, 258, - 29,-32768,-32768, 261,-32768,-32768,-32768, 217, 365, 332, - 155, 275, 217, 155,-32768, 17, 17,-32768,-32768, 472, - 332, 260, 112,-32768,-32768, 250,-32768, 248, 306, 146, --32768,-32768, 250, 271, 202, 332, 248, 161, 332,-32768, --32768, 163,-32768,-32768, 269, 170,-32768,-32768,-32768,-32768, - 266, 279, 86, 277, 278, 283,-32768, 167,-32768,-32768, --32768,-32768, 248, 248,-32768, 248, 248, 272, 273,-32768, --32768, 381,-32768,-32768, 304,-32768,-32768,-32768,-32768, 300, - 300,-32768, 193,-32768, 8,-32768, 284, 250,-32768, 39, - 17,-32768, 287, 250,-32768, 286,-32768, 250,-32768, 54, - 193,-32768, 21,-32768, 285,-32768,-32768, 37,-32768,-32768, --32768,-32768,-32768,-32768, 288,-32768,-32768, -4, 178,-32768, --32768, 290,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 291, 472,-32768, 472,-32768, 289, 295, --32768,-32768,-32768, 180,-32768, -55,-32768, 332, 297,-32768, --32768, 273,-32768, 248,-32768,-32768,-32768,-32768,-32768, 37, - 76, 297, 332,-32768, 185, 225,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 14,-32768,-32768,-32768,-32768, 397, - 399,-32768 +static const short yypact[] = { 203, +-32768,-32768, 203,-32768, -50,-32768, 27, 63,-32768,-32768, +-32768,-32768, 54,-32768, -40, 38,-32768,-32768, 79, 47, + 49, 73, 91, 80, 113, 38,-32768, 71,-32768,-32768, +-32768,-32768,-32768, 149,-32768,-32768, 334,-32768, 174, 34, +-32768,-32768,-32768, 135,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 150, 334,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 17, 327,-32768, 83,-32768, 190,-32768, + 102,-32768,-32768, 11,-32768, -22,-32768, 108,-32768,-32768, +-32768, 3, 117,-32768, 142,-32768, 158, 176,-32768,-32768, +-32768,-32768,-32768, 199, 185,-32768,-32768,-32768, 548, 265, +-32768,-32768,-32768, 175, 290,-32768,-32768,-32768, 197, 201, +-32768,-32768, 203, 197, 215, 198, 111,-32768,-32768, 411, +-32768, 197,-32768,-32768,-32768,-32768,-32768, -14,-32768, 213, + 214, 221, 278, 269,-32768,-32768, -50,-32768,-32768, 291, +-32768,-32768, 65, 223, 293, 225, 262, -3, 92,-32768, + -46,-32768,-32768, 230,-32768,-32768, 231,-32768,-32768, 337, + 548, 329, 329, 165,-32768,-32768, 232,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768, 235, 233,-32768, 116,-32768, 85,-32768, 323, + 32, 305, 244, 48, 227, 284,-32768, 248, 48, 288, +-32768, 60,-32768, 19, 256,-32768,-32768,-32768,-32768,-32768, +-32768, -69,-32768,-32768, 328,-32768, 203, 227, 257, 251, +-32768, 212, 268, 259, -69,-32768,-32768, 264,-32768,-32768, +-32768, 291, 357, 329, 269, 275, 291, 269,-32768, 67, + 67,-32768,-32768, 488, 329, 258, 125,-32768,-32768, 256, +-32768, 227, 311, 281, 271,-32768,-32768, 256, 280, 104, + 329, 227, 286, 329,-32768,-32768, 137,-32768,-32768, 283, + 144,-32768,-32768,-32768,-32768, 282, 295, 210, 297, 292, + 298,-32768, 165,-32768,-32768,-32768,-32768, 227, 227,-32768, + 227, 227, 255, 285,-32768,-32768, 398,-32768,-32768, 324, +-32768,-32768,-32768,-32768, 319, 319,-32768, 274,-32768, 32, +-32768, 302, 256,-32768, 48, 67,-32768, 308, 256,-32768, + 304,-32768, 256,-32768, 64, 274,-32768, 19,-32768, 299, +-32768,-32768, 39,-32768,-32768,-32768,-32768,-32768,-32768, 306, +-32768,-32768, 1, 147,-32768,-32768, 310,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 307, 488, +-32768, 488,-32768, 313, 314,-32768,-32768,-32768, 153,-32768, + -46,-32768, 329, 303,-32768,-32768, 285,-32768, 227,-32768, +-32768,-32768,-32768,-32768, 39, 23, 303, 329,-32768, 154, + 212,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 12, +-32768,-32768,-32768,-32768, 425, 430,-32768 }; static const short yypgoto[] = {-32768, --32768, 401, 294,-32768,-32768, 392,-32768,-32768, 388,-32768, --32768, 359,-32768,-32768,-32768, 342,-32768, 310,-32768,-32768, - 311,-32768, 360,-32768,-32768, 148,-32768,-32768, 270,-32768, - 101, 237, 119,-32768, 125,-32768, 132,-32768, 204,-32768, --32768,-32768,-32768, 41, -173, -75, -146, -52,-32768, 206, - -175, -90,-32768, -97,-32768, -231,-32768, 1, -117,-32768, - 31,-32768,-32768,-32768, -137,-32768,-32768, -61, -149, -38, - 219,-32768, -195,-32768,-32768, 58,-32768,-32768,-32768,-32768, --32768,-32768, 69, 79, -163,-32768,-32768,-32768, 126, -113, - -79,-32768, 2,-32768, 189, -7 +-32768, 428, 309,-32768,-32768, 419,-32768,-32768, 410,-32768, +-32768, 383,-32768,-32768,-32768, 366,-32768, 330,-32768,-32768, + 332,-32768, 377,-32768,-32768, 160,-32768,-32768, 287,-32768, + 121, 246,-32768, 138,-32768, 140,-32768, 146,-32768, 217, +-32768,-32768,-32768,-32768, 56, -179, -65, -209, -54,-32768, + 234, -183, -112,-32768, -55,-32768, -243,-32768, -51, -119, +-32768, 74,-32768,-32768,-32768, -147,-32768,-32768, -113, -157, + 6, 237,-32768, -133,-32768,-32768, 72,-32768,-32768,-32768, +-32768,-32768,-32768, 86, 95, -155,-32768,-32768,-32768, 139, + -126, -79,-32768, 15,-32768, 207, -7 }; -#define YYLAST 640 +#define YYLAST 639 static const short yytable[] = { 15, - 150, 5, 118, 10, 5, 15, 117, 196, 237, 197, - 218, 101, 101, 245, 82, 10, 10, 394, 178, 1, - 2, 114, 83, 84, 189, 67, 161, 162, 10, 65, - 10, 11, 72, 85, 112, 86, 79, 87, 64, 10, - 165, 71, 1, 2, 10, 78, 10, 88, 65, 234, - 191, 89, 10, 170, 171, 90, 189, 64, 91, 10, - 11, 10, 170, 171, 102, 102, 79, 63, 249, 92, - 137, 346, 300, 301, 93, 78, 94, 327, 95, 156, - 190, 138, 191, 157, 264, 235, 63, 96, 97, 359, - 388, 205, 337, 10, 170, 171, 115, 113, -251, 128, - 129, 72, 98, 1, 2, 79, 120, 368, 236, 242, - 71, 16, 155, 134, 78, 99, 68, 178, 398, 153, - 178, 154, 150, 115, 180, 270, 28, 12, 218, 271, - 206, 245, 166, 294, 30, 247, 299, 165, 363, 110, - 242, 272, 31, 189, 389, 326, 260, 353, 390, 261, - 203, 204, 276, 108, 109, 260, 17, 128, 129, 167, - 168, 169, 10, 170, 171, 1, 2, 195, 7, 191, - 306, 210, 205, 19, 10, 170, 171, 311, 29, 246, - 10, 232, 253, 1, 2, 233, 307, 253, 394, 347, - 265, 32, 269, 161, 162, 316, 33, 161, 162, 172, - 10, 170, 171, 1, 2, 34, 264, 360, 375, 397, - 376, 206, 207, 234, 275, 36, 304, 173, 73, 397, - 305, 37, 293, 180, 386, 335, 180, 208, 381, 161, - 162, 66, 351, 302, 355, 20, 80, 150, 357, 150, - 174, 153, 107, 21, 332, 333, 209, 334, 315, 235, - 309, 315, 210, 205, 310, 10, 170, 171, 175, 10, - 120, 211, 1, 2, 22, 317, 23, 319, 212, 310, - 213, 320, 214, 124, 322, 24, 121, 205, 323, 10, - 170, 171, 371, 115, 379, -231, 372, 122, 380, -231, - 83, 84, 206, 207, 125, 348, 123, 246, 279, 280, - 281, 282, 253, 1, 2, 161, 162, 130, 208, 132, - 313, 131, 265, 348, 136, 269, 206, 158, 159, 160, - 366, 279, 280, 281, 282, 10, 186, 209, 1, 2, - 370, 336, -252, 210, 187, 188, 198, 200, 201, 10, - 38, 228, 211, 230, 231, 241, 248, 257, 256, 259, - 277, 213, 115, 214, 274, 39, 153, 210, 153, 40, - 370, 278, 285, 287, 289, 41, 42, 43, 291, 295, - 303, 44, 366, 308, 321, 393, 45, 312, 324, 325, - 328, 46, 329, 47, 341, 342, 338, 343, 354, 330, - 350, 48, 356, 373, 367, 377, 401, 362, 402, 374, - 49, 378, 50, 6, 18, 139, 140, 51, 383, 52, - 53, 54, 141, 35, 81, 111, 85, 38, 86, 133, - 87, 142, 135, 361, 105, 331, 202, 181, 352, 349, - 88, 258, 345, 290, 89, 399, 298, 387, 90, 288, - 384, 91, 41, 42, 43, 358, 382, 318, 0, 0, - 143, 0, 92, 45, 0, 0, 0, 93, 46, 94, - 47, 95, 0, 0, 0, 0, 0, 0, 48, 0, - 96, 97, 144, 145, 0, 0, 0, 49, 0, 50, - 0, 146, 139, 140, 51, 98, 52, 53, 54, 141, - 0, 0, 0, 85, 38, 86, 0, 87, 142, 0, - 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, - 0, 89, 0, 0, 0, 90, 0, 0, 91, 41, - 42, 43, 0, 0, 0, 0, 0, 143, 0, 92, - 45, 0, 0, 0, 93, 46, 94, 47, 95, 0, - 0, 0, 83, 84, 0, 48, 0, 96, 97, 144, - 145, 0, 0, 85, 49, 86, 50, 87, 0, 1, - 2, 51, 98, 52, 53, 54, 0, 88, 0, 0, - 85, 89, 86, 0, 87, 90, 0, 0, 91, 0, - 0, 0, 0, 0, 88, 0, 0, 0, 89, 92, - 0, 0, 90, 0, 93, 91, 94, 0, 95, 0, - 0, 0, 0, 0, 0, 0, 92, 96, 97, 0, - 0, 93, 0, 94, 0, 95, 0, 0, 0, 0, - 0, 0, 98, 0, 96, 97, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 98 + 154, 200, 120, 201, 241, 15, 222, 182, 10, 101, + 101, 249, 102, 102, 5, 399, 119, 5, 10, 82, + 169, 1, 2, 113, 165, 166, 10, 83, 84, 65, + 116, 276, 72, 193, 10, 11, 79, 393, 85, 10, + 86, 10, 87, 277, 1, 2, 10, 130, 65, 20, + 67, 64, 88, 7, 71, 10, 89, 21, 78, 195, + 90, 10, 11, 91, 351, 19, 79, 10, 174, 175, + 64, 10, 174, 175, 92, 269, 193, 253, 22, 93, + 23, 94, 364, 95, 305, 306, 114, 28, 78, 24, + 160, 394, 96, 97, 161, 395, 16, 165, 166, 238, + 194, 72, 195, 29, 281, 117, 79, 98, 182, 130, + 63, 182, 373, 131, 159, 34, 403, 238, 111, 169, + 99, 117, 240, 71, 154, 222, 184, 137, 78, 63, + 249, 12, 30, 246, 157, 239, 158, 251, 312, 275, + 368, 68, 10, 32, 332, 1, 2, 170, 321, 246, + 380, 141, 381, 239, 207, 208, 31, 399, 17, 342, + 358, 265, 142, 33, 266, 265, 165, 166, -255, 37, + 209, 193, 10, 174, 175, 131, 122, 36, 340, 299, + 73, 352, 304, 250, 311, 66, 258, 117, 80, -235, + 107, 258, 316, -235, 270, 199, 274, 195, 269, 365, + 284, 285, 286, 287, 10, 110, 402, 1, 2, 210, + 211, 115, 318, 1, 2, 209, 402, 10, 174, 175, + 236, 391, 123, 386, 237, 212, 298, 184, 122, 309, + 184, 280, 209, 310, 10, 174, 175, 307, 124, 360, + 154, 324, 154, 362, 213, 325, 125, 356, 327, 126, + 214, 376, 328, 320, 210, 377, 320, 384, 157, 215, + 209, 385, 10, 174, 175, 127, 216, 132, 217, 331, + 218, 210, 211, 171, 172, 173, 10, 174, 175, 1, + 2, 10, 174, 175, 1, 2, 133, 212, 1, 2, + 165, 166, 134, 337, 338, 214, 339, 108, 109, 210, + 353, 140, 250, 165, 166, 136, 213, 258, 284, 285, + 286, 287, 214, 176, 341, 83, 84, 270, 353, 139, + 274, 215, 162, 163, 164, 371, -256, 190, 191, 192, + 217, 177, 218, 202, 204, 375, 10, 83, 84, 205, + 214, 10, 235, 232, 1, 2, 234, 245, 85, 252, + 86, 261, 87, 262, 178, 264, 38, 279, 117, 283, + 296, 282, 88, 290, 292, 375, 89, 294, 308, 300, + 90, 39, 179, 91, 157, 40, 157, 371, 313, 315, + 398, 41, 42, 43, 92, 314, 317, 44, 326, 93, + 322, 94, 45, 95, 329, 330, 334, 46, 343, 47, + 333, 346, 96, 97, 335, 347, 348, 48, 355, 359, + 361, 367, 372, 378, 388, 379, 49, 98, 50, 382, + 383, 143, 144, 51, 406, 52, 53, 54, 145, 407, + 6, 18, 85, 38, 86, 35, 87, 146, 81, 112, + 135, 105, 336, 138, 263, 185, 88, 206, 366, 354, + 89, 350, 357, 303, 90, 404, 392, 91, 41, 42, + 43, 293, 389, 363, 0, 295, 147, 387, 92, 45, + 323, 0, 0, 93, 46, 94, 47, 95, 0, 0, + 0, 0, 0, 0, 48, 0, 96, 97, 148, 149, + 0, 0, 0, 49, 0, 50, 0, 150, 143, 144, + 51, 98, 52, 53, 54, 145, 0, 0, 0, 85, + 38, 86, 0, 87, 146, 0, 0, 0, 0, 0, + 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, + 0, 90, 0, 0, 91, 41, 42, 43, 0, 0, + 0, 0, 0, 147, 0, 92, 45, 0, 0, 0, + 93, 46, 94, 47, 95, 0, 0, 0, 1, 2, + 0, 48, 0, 96, 97, 148, 149, 0, 0, 85, + 49, 86, 50, 87, 0, 0, 0, 51, 98, 52, + 53, 54, 0, 88, 0, 0, 0, 89, 0, 0, + 0, 90, 0, 0, 91, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 92, 0, 0, 0, 0, + 93, 0, 94, 0, 95, 0, 0, 0, 0, 0, + 0, 0, 0, 96, 97, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 98 }; static const short yycheck[] = { 7, - 118, 0, 82, 8, 3, 13, 82, 145, 184, 147, - 160, 64, 65, 187, 3, 8, 8, 4, 132, 11, - 12, 28, 11, 12, 80, 17, 13, 14, 8, 37, - 8, 9, 40, 22, 46, 24, 44, 26, 37, 8, - 131, 40, 11, 12, 8, 44, 8, 36, 56, 33, - 106, 40, 8, 9, 10, 44, 80, 56, 47, 8, - 9, 8, 9, 10, 64, 65, 74, 37, 30, 58, - 41, 303, 236, 237, 63, 74, 65, 273, 67, 105, - 104, 52, 106, 109, 198, 69, 56, 76, 77, 321, - 15, 6, 288, 8, 9, 10, 103, 109, 104, 99, - 99, 109, 91, 11, 12, 113, 112, 112, 184, 102, - 109, 34, 120, 112, 113, 104, 108, 231, 105, 118, - 234, 120, 240, 103, 132, 201, 9, 105, 278, 101, - 45, 305, 131, 231, 84, 188, 234, 228, 102, 108, - 102, 113, 84, 80, 69, 60, 102, 311, 73, 105, - 158, 159, 214, 108, 109, 102, 105, 157, 157, 5, - 6, 7, 8, 9, 10, 11, 12, 104, 104, 106, - 246, 86, 6, 106, 8, 9, 10, 253, 57, 187, - 8, 105, 190, 11, 12, 109, 248, 195, 4, 303, - 198, 53, 200, 13, 14, 257, 84, 13, 14, 45, - 8, 9, 10, 11, 12, 3, 320, 321, 355, 385, - 357, 45, 46, 33, 213, 107, 105, 63, 46, 395, - 109, 21, 230, 231, 374, 287, 234, 61, 366, 13, - 14, 12, 308, 241, 314, 12, 39, 355, 318, 357, - 86, 240, 108, 20, 283, 284, 80, 286, 256, 69, - 105, 259, 86, 6, 109, 8, 9, 10, 104, 8, - 112, 95, 11, 12, 41, 105, 43, 105, 102, 109, - 104, 109, 106, 51, 105, 52, 81, 6, 109, 8, - 9, 10, 105, 103, 105, 105, 109, 81, 109, 109, - 11, 12, 45, 46, 81, 303, 71, 305, 97, 98, - 99, 100, 310, 11, 12, 13, 14, 3, 61, 3, - 109, 112, 320, 321, 104, 323, 45, 110, 110, 104, - 328, 97, 98, 99, 100, 8, 35, 80, 11, 12, - 338, 60, 104, 86, 104, 68, 104, 104, 3, 8, - 23, 112, 95, 112, 110, 25, 106, 106, 68, 68, - 105, 104, 103, 106, 30, 38, 355, 86, 357, 42, - 368, 109, 96, 106, 104, 48, 49, 50, 4, 95, - 111, 54, 380, 68, 106, 383, 59, 107, 113, 101, - 104, 64, 105, 66, 4, 82, 114, 88, 102, 107, - 107, 74, 107, 104, 107, 107, 0, 113, 0, 109, - 83, 107, 85, 3, 13, 11, 12, 90, 112, 92, - 93, 94, 18, 26, 56, 74, 22, 23, 24, 109, - 26, 27, 113, 323, 65, 278, 157, 134, 310, 305, - 36, 195, 301, 228, 40, 395, 233, 380, 44, 221, - 372, 47, 48, 49, 50, 320, 368, 259, -1, -1, - 56, -1, 58, 59, -1, -1, -1, 63, 64, 65, - 66, 67, -1, -1, -1, -1, -1, -1, 74, -1, - 76, 77, 78, 79, -1, -1, -1, 83, -1, 85, - -1, 87, 11, 12, 90, 91, 92, 93, 94, 18, - -1, -1, -1, 22, 23, 24, -1, 26, 27, -1, - -1, -1, -1, -1, -1, -1, -1, 36, -1, -1, - -1, 40, -1, -1, -1, 44, -1, -1, 47, 48, - 49, 50, -1, -1, -1, -1, -1, 56, -1, 58, - 59, -1, -1, -1, 63, 64, 65, 66, 67, -1, - -1, -1, 11, 12, -1, 74, -1, 76, 77, 78, - 79, -1, -1, 22, 83, 24, 85, 26, -1, 11, - 12, 90, 91, 92, 93, 94, -1, 36, -1, -1, - 22, 40, 24, -1, 26, 44, -1, -1, 47, -1, - -1, -1, -1, -1, 36, -1, -1, -1, 40, 58, - -1, -1, 44, -1, 63, 47, 65, -1, 67, -1, - -1, -1, -1, -1, -1, -1, 58, 76, 77, -1, - -1, 63, -1, 65, -1, 67, -1, -1, -1, -1, - -1, -1, 91, -1, 76, 77, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 91 + 120, 149, 82, 151, 188, 13, 164, 134, 8, 64, + 65, 191, 64, 65, 0, 4, 82, 3, 8, 3, + 133, 11, 12, 46, 13, 14, 8, 11, 12, 37, + 28, 101, 40, 80, 8, 9, 44, 15, 22, 8, + 24, 8, 26, 113, 11, 12, 8, 99, 56, 12, + 17, 37, 36, 104, 40, 8, 40, 20, 44, 106, + 44, 8, 9, 47, 308, 106, 74, 8, 9, 10, + 56, 8, 9, 10, 58, 202, 80, 30, 41, 63, + 43, 65, 326, 67, 240, 241, 109, 9, 74, 52, + 105, 69, 76, 77, 109, 73, 34, 13, 14, 33, + 104, 109, 106, 57, 218, 103, 114, 91, 235, 161, + 37, 238, 112, 99, 122, 3, 105, 33, 108, 232, + 104, 103, 188, 109, 244, 283, 134, 113, 114, 56, + 310, 105, 84, 102, 120, 69, 122, 192, 252, 205, + 102, 108, 8, 53, 278, 11, 12, 133, 262, 102, + 360, 41, 362, 69, 162, 163, 84, 4, 105, 293, + 316, 102, 52, 84, 105, 102, 13, 14, 104, 21, + 6, 80, 8, 9, 10, 161, 112, 107, 292, 235, + 46, 308, 238, 191, 250, 12, 194, 103, 39, 105, + 108, 199, 258, 109, 202, 104, 204, 106, 325, 326, + 97, 98, 99, 100, 8, 104, 390, 11, 12, 45, + 46, 104, 109, 11, 12, 6, 400, 8, 9, 10, + 105, 379, 81, 371, 109, 61, 234, 235, 112, 105, + 238, 217, 6, 109, 8, 9, 10, 245, 81, 319, + 360, 105, 362, 323, 80, 109, 71, 313, 105, 51, + 86, 105, 109, 261, 45, 109, 264, 105, 244, 95, + 6, 109, 8, 9, 10, 81, 102, 3, 104, 60, + 106, 45, 46, 5, 6, 7, 8, 9, 10, 11, + 12, 8, 9, 10, 11, 12, 112, 61, 11, 12, + 13, 14, 3, 288, 289, 86, 291, 108, 109, 45, + 308, 104, 310, 13, 14, 105, 80, 315, 97, 98, + 99, 100, 86, 45, 60, 11, 12, 325, 326, 105, + 328, 95, 110, 110, 104, 333, 104, 35, 104, 68, + 104, 63, 106, 104, 104, 343, 8, 11, 12, 3, + 86, 8, 110, 112, 11, 12, 112, 25, 22, 106, + 24, 68, 26, 106, 86, 68, 23, 30, 103, 109, + 4, 105, 36, 96, 106, 373, 40, 104, 111, 95, + 44, 38, 104, 47, 360, 42, 362, 385, 68, 109, + 388, 48, 49, 50, 58, 105, 107, 54, 106, 63, + 105, 65, 59, 67, 113, 101, 105, 64, 114, 66, + 104, 4, 76, 77, 107, 82, 88, 74, 107, 102, + 107, 113, 107, 104, 112, 109, 83, 91, 85, 107, + 107, 11, 12, 90, 0, 92, 93, 94, 18, 0, + 3, 13, 22, 23, 24, 26, 26, 27, 56, 74, + 109, 65, 283, 114, 199, 137, 36, 161, 328, 310, + 40, 306, 315, 237, 44, 400, 385, 47, 48, 49, + 50, 225, 377, 325, -1, 232, 56, 373, 58, 59, + 264, -1, -1, 63, 64, 65, 66, 67, -1, -1, + -1, -1, -1, -1, 74, -1, 76, 77, 78, 79, + -1, -1, -1, 83, -1, 85, -1, 87, 11, 12, + 90, 91, 92, 93, 94, 18, -1, -1, -1, 22, + 23, 24, -1, 26, 27, -1, -1, -1, -1, -1, + -1, -1, -1, 36, -1, -1, -1, 40, -1, -1, + -1, 44, -1, -1, 47, 48, 49, 50, -1, -1, + -1, -1, -1, 56, -1, 58, 59, -1, -1, -1, + 63, 64, 65, 66, 67, -1, -1, -1, 11, 12, + -1, 74, -1, 76, 77, 78, 79, -1, -1, 22, + 83, 24, 85, 26, -1, -1, -1, 90, 91, 92, + 93, 94, -1, 36, -1, -1, -1, 40, -1, -1, + -1, 44, -1, -1, 47, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 58, -1, -1, -1, -1, + 63, -1, 65, -1, 67, -1, -1, -1, -1, -1, + -1, -1, -1, 76, 77, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 91 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/share/bison.simple" @@ -1290,13 +1291,13 @@ yyparse(YYPARSE_PARAM_ARG) switch (yyn) { case 1: -#line 301 "asn1p_y.y" +#line 302 "asn1p_y.y" { *(void **)param = yyvsp[0].a_grammar; ; break;} case 2: -#line 307 "asn1p_y.y" +#line 308 "asn1p_y.y" { yyval.a_grammar = asn1p_new(); checkmem(yyval.a_grammar); @@ -1304,14 +1305,14 @@ case 2: ; break;} case 3: -#line 312 "asn1p_y.y" +#line 313 "asn1p_y.y" { yyval.a_grammar = yyvsp[-1].a_grammar; TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); ; break;} case 4: -#line 333 "asn1p_y.y" +#line 334 "asn1p_y.y" { if(yyvsp[-1].a_module) { @@ -1328,27 +1329,27 @@ case 4: ; break;} case 5: -#line 354 "asn1p_y.y" +#line 355 "asn1p_y.y" { yyval.a_oid = 0; ; break;} case 6: -#line 355 "asn1p_y.y" +#line 356 "asn1p_y.y" { yyval.a_oid = yyvsp[0].a_oid; ; break;} case 7: -#line 359 "asn1p_y.y" +#line 360 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; ; break;} case 8: -#line 362 "asn1p_y.y" +#line 363 "asn1p_y.y" { yyval.a_oid = 0; ; break;} case 9: -#line 368 "asn1p_y.y" +#line 369 "asn1p_y.y" { yyval.a_oid = asn1p_oid_new(); asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1357,7 +1358,7 @@ case 9: ; break;} case 10: -#line 374 "asn1p_y.y" +#line 375 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1366,74 +1367,74 @@ case 10: ; break;} case 11: -#line 383 "asn1p_y.y" +#line 384 "asn1p_y.y" { /* iso */ yyval.a_oid_arc.name = yyvsp[0].tv_str; yyval.a_oid_arc.number = -1; ; break;} case 12: -#line 387 "asn1p_y.y" +#line 388 "asn1p_y.y" { /* iso(1) */ yyval.a_oid_arc.name = yyvsp[-3].tv_str; yyval.a_oid_arc.number = yyvsp[-1].a_int; ; break;} case 13: -#line 391 "asn1p_y.y" +#line 392 "asn1p_y.y" { /* 1 */ yyval.a_oid_arc.name = 0; yyval.a_oid_arc.number = yyvsp[0].a_int; ; break;} case 14: -#line 401 "asn1p_y.y" +#line 402 "asn1p_y.y" { yyval.a_module_flags = MSF_NOFLAGS; ; break;} case 15: -#line 402 "asn1p_y.y" +#line 403 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; ; break;} case 16: -#line 411 "asn1p_y.y" +#line 412 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; ; break;} case 17: -#line 414 "asn1p_y.y" +#line 415 "asn1p_y.y" { yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags; ; break;} case 18: -#line 423 "asn1p_y.y" +#line 424 "asn1p_y.y" { yyval.a_module_flags = MSF_EXPLICIT_TAGS; ; break;} case 19: -#line 426 "asn1p_y.y" +#line 427 "asn1p_y.y" { yyval.a_module_flags = MSF_IMPLICIT_TAGS; ; break;} case 20: -#line 429 "asn1p_y.y" +#line 430 "asn1p_y.y" { yyval.a_module_flags = MSF_AUTOMATIC_TAGS; ; break;} case 21: -#line 432 "asn1p_y.y" +#line 433 "asn1p_y.y" { yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED; ; break;} case 22: -#line 436 "asn1p_y.y" +#line 437 "asn1p_y.y" { /* X.680Amd1 specifies TAG and XER */ if(strcmp(yyvsp[-1].tv_str, "TAG") == 0) { @@ -1451,23 +1452,23 @@ case 22: ; break;} case 23: -#line 457 "asn1p_y.y" +#line 458 "asn1p_y.y" { yyval.a_module = 0; ; break;} case 24: -#line 458 "asn1p_y.y" +#line 459 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 25: -#line 467 "asn1p_y.y" +#line 468 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 26: -#line 470 "asn1p_y.y" +#line 471 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; @@ -1497,13 +1498,13 @@ case 26: ; break;} case 27: -#line 503 "asn1p_y.y" +#line 504 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 28: -#line 506 "asn1p_y.y" +#line 507 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1515,7 +1516,7 @@ case 28: ; break;} case 29: -#line 515 "asn1p_y.y" +#line 516 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1525,7 +1526,7 @@ case 29: ; break;} case 30: -#line 522 "asn1p_y.y" +#line 523 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1535,7 +1536,7 @@ case 30: ; break;} case 31: -#line 535 "asn1p_y.y" +#line 536 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1545,11 +1546,11 @@ case 31: ; break;} case 32: -#line 543 "asn1p_y.y" +#line 544 "asn1p_y.y" { asn1p_lexer_hack_push_encoding_control(); ; break;} case 33: -#line 544 "asn1p_y.y" +#line 545 "asn1p_y.y" { fprintf(stderr, "WARNING: ENCODING-CONTROL %s " @@ -1560,7 +1561,7 @@ case 33: ; break;} case 34: -#line 556 "asn1p_y.y" +#line 557 "asn1p_y.y" { return yyerror( "Attempt to redefine a standard basic type, " @@ -1569,19 +1570,19 @@ case 34: ; break;} case 35: -#line 570 "asn1p_y.y" +#line 571 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; ; break;} case 36: -#line 576 "asn1p_y.y" +#line 577 "asn1p_y.y" { return yyerror("Empty IMPORTS list"); ; break;} case 37: -#line 582 "asn1p_y.y" +#line 583 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1589,14 +1590,14 @@ case 37: ; break;} case 38: -#line 587 "asn1p_y.y" +#line 588 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); ; break;} case 39: -#line 594 "asn1p_y.y" +#line 595 "asn1p_y.y" { yyval.a_xports = yyvsp[-3].a_xports; yyval.a_xports->from = yyvsp[-1].tv_str; @@ -1605,7 +1606,7 @@ case 39: ; break;} case 40: -#line 603 "asn1p_y.y" +#line 604 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); @@ -1613,14 +1614,14 @@ case 40: ; break;} case 41: -#line 608 "asn1p_y.y" +#line 609 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} case 42: -#line 615 "asn1p_y.y" +#line 616 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1629,7 +1630,16 @@ case 42: ; break;} case 43: -#line 621 "asn1p_y.y" +#line 622 "asn1p_y.y" +{ /* Completely equivalent to above */ + yyval.a_expr = asn1p_expr_new(yylineno); + checkmem(yyval.a_expr); + yyval.a_expr->Identifier = yyvsp[-2].tv_str; + yyval.a_expr->expr_type = A1TC_REFERENCE; + ; + break;} +case 44: +#line 628 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1637,43 +1647,43 @@ case 43: yyval.a_expr->expr_type = A1TC_REFERENCE; ; break;} -case 44: -#line 630 "asn1p_y.y" +case 45: +#line 637 "asn1p_y.y" { yyval.a_xports = yyvsp[-1].a_xports; ; break;} -case 45: -#line 633 "asn1p_y.y" +case 46: +#line 640 "asn1p_y.y" { yyval.a_xports = 0; ; break;} -case 46: -#line 636 "asn1p_y.y" +case 47: +#line 643 "asn1p_y.y" { /* Empty EXPORTS clause effectively prohibits export. */ yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); ; break;} -case 47: -#line 644 "asn1p_y.y" +case 48: +#line 651 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); assert(yyval.a_xports); TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} -case 48: -#line 649 "asn1p_y.y" +case 49: +#line 656 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} -case 49: -#line 656 "asn1p_y.y" +case 50: +#line 663 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1681,8 +1691,17 @@ case 49: yyval.a_expr->expr_type = A1TC_EXPORTVAR; ; break;} -case 50: -#line 662 "asn1p_y.y" +case 51: +#line 669 "asn1p_y.y" +{ + yyval.a_expr = asn1p_expr_new(yylineno); + checkmem(yyval.a_expr); + yyval.a_expr->Identifier = yyvsp[-2].tv_str; + yyval.a_expr->expr_type = A1TC_EXPORTVAR; + ; + break;} +case 52: +#line 675 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1690,8 +1709,8 @@ case 50: yyval.a_expr->expr_type = A1TC_EXPORTVAR; ; break;} -case 51: -#line 672 "asn1p_y.y" +case 53: +#line 685 "asn1p_y.y" { yyval.a_expr = yyvsp[-4].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1700,8 +1719,8 @@ case 51: // take care of optValueSetBody ; break;} -case 52: -#line 682 "asn1p_y.y" +case 54: +#line 695 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1710,8 +1729,8 @@ case 52: yyval.a_expr->meta_type = AMT_TYPEREF; ; break;} -case 53: -#line 689 "asn1p_y.y" +case 55: +#line 702 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1719,37 +1738,37 @@ case 53: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 54: -#line 698 "asn1p_y.y" +case 56: +#line 711 "asn1p_y.y" { ; break;} -case 55: -#line 699 "asn1p_y.y" +case 57: +#line 712 "asn1p_y.y" { ; break;} -case 56: -#line 710 "asn1p_y.y" +case 58: +#line 723 "asn1p_y.y" { ; break;} -case 57: -#line 712 "asn1p_y.y" +case 59: +#line 725 "asn1p_y.y" { ; break;} -case 58: -#line 717 "asn1p_y.y" +case 60: +#line 730 "asn1p_y.y" { ; break;} -case 59: -#line 719 "asn1p_y.y" +case 61: +#line 732 "asn1p_y.y" { ; break;} -case 60: -#line 735 "asn1p_y.y" +case 62: +#line 748 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1759,8 +1778,8 @@ case 60: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 61: -#line 743 "asn1p_y.y" +case 63: +#line 756 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -1768,8 +1787,8 @@ case 61: assert(yyval.a_expr->meta_type); ; break;} -case 62: -#line 749 "asn1p_y.y" +case 64: +#line 762 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -1777,8 +1796,8 @@ case 62: assert(yyval.a_expr->meta_type == AMT_OBJECT); ; break;} -case 63: -#line 765 "asn1p_y.y" +case 65: +#line 778 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1787,8 +1806,8 @@ case 63: yyval.a_expr->meta_type = AMT_PARAMTYPE; ; break;} -case 64: -#line 775 "asn1p_y.y" +case 66: +#line 788 "asn1p_y.y" { int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); @@ -1799,8 +1818,8 @@ case 64: if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument); ; break;} -case 65: -#line 784 "asn1p_y.y" +case 67: +#line 797 "asn1p_y.y" { int ret; yyval.a_plist = yyvsp[-2].a_plist; @@ -1810,15 +1829,15 @@ case 65: if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument); ; break;} -case 66: -#line 795 "asn1p_y.y" +case 68: +#line 808 "asn1p_y.y" { yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} -case 67: -#line 799 "asn1p_y.y" +case 69: +#line 812 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1827,8 +1846,8 @@ case 67: yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} -case 68: -#line 806 "asn1p_y.y" +case 70: +#line 819 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1838,29 +1857,29 @@ case 68: yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} -case 69: -#line 817 "asn1p_y.y" +case 71: +#line 830 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 70: -#line 822 "asn1p_y.y" +case 72: +#line 835 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 71: -#line 829 "asn1p_y.y" +case 73: +#line 842 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} -case 72: -#line 832 "asn1p_y.y" +case 74: +#line 845 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1869,23 +1888,31 @@ case 72: yyval.a_expr->meta_type = AMT_VALUE; ; break;} -case 73: -#line 845 "asn1p_y.y" +case 75: +#line 858 "asn1p_y.y" +{ yyval.a_expr = asn1p_expr_new(yylineno); ; + break;} +case 76: +#line 859 "asn1p_y.y" +{ yyval.a_expr = yyvsp[0].a_expr; ; + break;} +case 77: +#line 862 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 74: -#line 850 "asn1p_y.y" +case 78: +#line 867 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 75: -#line 857 "asn1p_y.y" +case 79: +#line 874 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1893,8 +1920,8 @@ case 75: yyval.a_expr->marker = yyvsp[0].a_marker; ; break;} -case 76: -#line 863 "asn1p_y.y" +case 80: +#line 880 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1903,43 +1930,43 @@ case 76: asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 77: -#line 870 "asn1p_y.y" +case 81: +#line 887 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} -case 78: -#line 876 "asn1p_y.y" +case 82: +#line 893 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 79: -#line 881 "asn1p_y.y" +case 83: +#line 898 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 80: -#line 888 "asn1p_y.y" +case 84: +#line 905 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-1].tv_str; ; break;} -case 81: -#line 893 "asn1p_y.y" +case 85: +#line 910 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} -case 82: -#line 899 "asn1p_y.y" +case 86: +#line 916 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); @@ -1948,16 +1975,16 @@ case 82: assert(yyval.a_expr->meta_type == AMT_OBJECT); ; break;} -case 83: -#line 909 "asn1p_y.y" +case 87: +#line 926 "asn1p_y.y" { yyval.a_int = 0; ; break;} -case 84: -#line 910 "asn1p_y.y" +case 88: +#line 927 "asn1p_y.y" { yyval.a_int = 1; ; break;} -case 85: -#line 914 "asn1p_y.y" +case 89: +#line 931 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1966,15 +1993,15 @@ case 85: asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 86: -#line 921 "asn1p_y.y" +case 90: +#line 938 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 87: -#line 928 "asn1p_y.y" +case 91: +#line 945 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1984,8 +2011,8 @@ case 87: yyval.a_expr->marker = yyvsp[0].a_marker; ; break;} -case 88: -#line 936 "asn1p_y.y" +case 92: +#line 953 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; yyval.a_expr->Identifier = yyvsp[-3].a_refcomp.name; @@ -1993,8 +2020,8 @@ case 88: yyval.a_expr->unique = yyvsp[0].a_int; ; break;} -case 89: -#line 942 "asn1p_y.y" +case 93: +#line 959 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2011,48 +2038,48 @@ case 89: yyval.a_expr->unique = yyvsp[0].a_int; ; break;} -case 90: -#line 960 "asn1p_y.y" +case 94: +#line 977 "asn1p_y.y" { yyval.a_wsynt = 0; ; break;} -case 91: -#line 961 "asn1p_y.y" +case 95: +#line 978 "asn1p_y.y" { yyval.a_wsynt = yyvsp[0].a_wsynt; ; break;} -case 92: -#line 968 "asn1p_y.y" +case 96: +#line 985 "asn1p_y.y" { asn1p_lexer_hack_enable_with_syntax(); ; break;} -case 93: -#line 970 "asn1p_y.y" +case 97: +#line 987 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; ; break;} -case 94: -#line 976 "asn1p_y.y" +case 98: +#line 993 "asn1p_y.y" { yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} -case 95: -#line 980 "asn1p_y.y" +case 99: +#line 997 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} -case 96: -#line 987 "asn1p_y.y" +case 100: +#line 1004 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); ; break;} -case 97: -#line 990 "asn1p_y.y" +case 101: +#line 1007 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2063,8 +2090,8 @@ case 97: yyval.a_wchunk = asn1p_wsyntx_chunk_fromref(ref, 0); ; break;} -case 98: -#line 1002 "asn1p_y.y" +case 102: +#line 1019 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2074,8 +2101,8 @@ case 98: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 99: -#line 1010 "asn1p_y.y" +case 103: +#line 1027 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2086,8 +2113,8 @@ case 99: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 100: -#line 1019 "asn1p_y.y" +case 104: +#line 1036 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2098,8 +2125,8 @@ case 100: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 101: -#line 1031 "asn1p_y.y" +case 105: +#line 1048 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; yyval.a_expr->tag = yyvsp[-2].a_tag; @@ -2120,14 +2147,14 @@ case 101: } ; break;} -case 102: -#line 1053 "asn1p_y.y" +case 106: +#line 1070 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} -case 103: -#line 1056 "asn1p_y.y" +case 107: +#line 1073 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2135,8 +2162,8 @@ case 103: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 104: -#line 1062 "asn1p_y.y" +case 108: +#line 1079 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2144,8 +2171,8 @@ case 104: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 105: -#line 1068 "asn1p_y.y" +case 109: +#line 1085 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2153,8 +2180,8 @@ case 105: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 106: -#line 1074 "asn1p_y.y" +case 110: +#line 1091 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2162,8 +2189,8 @@ case 106: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 107: -#line 1080 "asn1p_y.y" +case 111: +#line 1097 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2175,8 +2202,8 @@ case 107: asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 108: -#line 1090 "asn1p_y.y" +case 112: +#line 1107 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2188,8 +2215,8 @@ case 108: asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 109: -#line 1100 "asn1p_y.y" +case 113: +#line 1117 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2197,8 +2224,8 @@ case 109: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 110: -#line 1106 "asn1p_y.y" +case 114: +#line 1123 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2211,8 +2238,8 @@ case 110: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 111: -#line 1120 "asn1p_y.y" +case 115: +#line 1137 "asn1p_y.y" { int ret; yyval.a_expr = yyvsp[-1].a_expr; @@ -2228,8 +2255,8 @@ case 111: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 112: -#line 1144 "asn1p_y.y" +case 116: +#line 1161 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2238,8 +2265,8 @@ case 112: yyval.a_expr->meta_type = AMT_TYPEREF; ; break;} -case 113: -#line 1151 "asn1p_y.y" +case 117: +#line 1168 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2248,8 +2275,8 @@ case 113: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 114: -#line 1166 "asn1p_y.y" +case 118: +#line 1183 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2259,8 +2286,8 @@ case 114: free(yyvsp[0].tv_str); ; break;} -case 115: -#line 1174 "asn1p_y.y" +case 119: +#line 1191 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2272,8 +2299,8 @@ case 115: free(yyvsp[-2].tv_str); ; break;} -case 116: -#line 1184 "asn1p_y.y" +case 120: +#line 1201 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2285,8 +2312,8 @@ case 116: free(yyvsp[-2].tv_str); ; break;} -case 117: -#line 1194 "asn1p_y.y" +case 121: +#line 1211 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2298,8 +2325,8 @@ case 117: free(yyvsp[-2].tv_str); ; break;} -case 118: -#line 1204 "asn1p_y.y" +case 122: +#line 1221 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2309,8 +2336,8 @@ case 118: checkmem(ret == 0); ; break;} -case 119: -#line 1212 "asn1p_y.y" +case 123: +#line 1229 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[0].a_ref; @@ -2331,8 +2358,8 @@ case 119: } ; break;} -case 120: -#line 1234 "asn1p_y.y" +case 124: +#line 1251 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2342,8 +2369,8 @@ case 120: checkmem(ret == 0); ; break;} -case 121: -#line 1242 "asn1p_y.y" +case 125: +#line 1259 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[-2].a_ref; @@ -2352,22 +2379,22 @@ case 121: checkmem(ret == 0); ; break;} -case 124: -#line 1256 "asn1p_y.y" +case 128: +#line 1273 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} -case 125: -#line 1261 "asn1p_y.y" +case 129: +#line 1278 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} -case 126: -#line 1274 "asn1p_y.y" +case 130: +#line 1291 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); @@ -2376,8 +2403,8 @@ case 126: yyval.a_expr->value = yyvsp[0].a_value; ; break;} -case 127: -#line 1284 "asn1p_y.y" +case 131: +#line 1301 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2386,77 +2413,77 @@ case 127: yyval.a_value->value.choice_identifier.value = yyvsp[0].a_value; ; break;} -case 128: -#line 1291 "asn1p_y.y" +case 132: +#line 1308 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} -case 129: -#line 1291 "asn1p_y.y" +case 133: +#line 1308 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); yyval.a_value->type = ATV_UNPARSED; ; break;} -case 130: -#line 1296 "asn1p_y.y" +case 134: +#line 1313 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_NULL; ; break;} -case 131: -#line 1301 "asn1p_y.y" +case 135: +#line 1318 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_FALSE; ; break;} -case 132: -#line 1306 "asn1p_y.y" +case 136: +#line 1323 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_TRUE; ; break;} -case 133: -#line 1311 "asn1p_y.y" +case 137: +#line 1328 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); ; break;} -case 134: -#line 1315 "asn1p_y.y" +case 138: +#line 1332 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); ; break;} -case 135: -#line 1319 "asn1p_y.y" +case 139: +#line 1336 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} -case 136: -#line 1323 "asn1p_y.y" +case 140: +#line 1340 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 137: -#line 1326 "asn1p_y.y" +case 141: +#line 1343 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 138: -#line 1332 "asn1p_y.y" +case 142: +#line 1349 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2469,8 +2496,8 @@ case 138: free(yyvsp[0].tv_str); ; break;} -case 139: -#line 1343 "asn1p_y.y" +case 143: +#line 1360 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2486,8 +2513,8 @@ case 139: free(yyvsp[0].tv_str); ; break;} -case 140: -#line 1360 "asn1p_y.y" +case 144: +#line 1377 "asn1p_y.y" { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 2; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); @@ -2499,8 +2526,8 @@ case 140: free(yyvsp[0].tv_opaque.buf); ; break;} -case 141: -#line 1370 "asn1p_y.y" +case 145: +#line 1387 "asn1p_y.y" { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); @@ -2514,68 +2541,68 @@ case 141: yyval.tv_opaque.len = newsize; ; break;} -case 142: -#line 1385 "asn1p_y.y" +case 146: +#line 1402 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BOOLEAN; ; break;} -case 143: -#line 1386 "asn1p_y.y" +case 147: +#line 1403 "asn1p_y.y" { yyval.a_type = ASN_BASIC_NULL; ; break;} -case 144: -#line 1387 "asn1p_y.y" +case 148: +#line 1404 "asn1p_y.y" { yyval.a_type = ASN_BASIC_REAL; ; break;} -case 145: -#line 1388 "asn1p_y.y" +case 149: +#line 1405 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} -case 146: -#line 1389 "asn1p_y.y" +case 150: +#line 1406 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OCTET_STRING; ; break;} -case 147: -#line 1390 "asn1p_y.y" +case 151: +#line 1407 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; break;} -case 148: -#line 1391 "asn1p_y.y" +case 152: +#line 1408 "asn1p_y.y" { yyval.a_type = ASN_BASIC_RELATIVE_OID; ; break;} -case 149: -#line 1392 "asn1p_y.y" +case 153: +#line 1409 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EXTERNAL; ; break;} -case 150: -#line 1393 "asn1p_y.y" +case 154: +#line 1410 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; break;} -case 151: -#line 1394 "asn1p_y.y" +case 155: +#line 1411 "asn1p_y.y" { yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; break;} -case 152: -#line 1395 "asn1p_y.y" +case 156: +#line 1412 "asn1p_y.y" { yyval.a_type = ASN_BASIC_UTCTime; ; break;} -case 153: -#line 1396 "asn1p_y.y" +case 157: +#line 1413 "asn1p_y.y" { yyval.a_type = ASN_BASIC_GeneralizedTime; ; break;} -case 154: -#line 1403 "asn1p_y.y" +case 158: +#line 1420 "asn1p_y.y" { yyval.a_type = ASN_BASIC_INTEGER; ; break;} -case 155: -#line 1404 "asn1p_y.y" +case 159: +#line 1421 "asn1p_y.y" { yyval.a_type = ASN_BASIC_ENUMERATED; ; break;} -case 156: -#line 1405 "asn1p_y.y" +case 160: +#line 1422 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BIT_STRING; ; break;} -case 157: -#line 1409 "asn1p_y.y" +case 161: +#line 1426 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2583,8 +2610,8 @@ case 157: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 158: -#line 1415 "asn1p_y.y" +case 162: +#line 1432 "asn1p_y.y" { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; @@ -2596,92 +2623,92 @@ case 158: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 159: -#line 1428 "asn1p_y.y" +case 163: +#line 1445 "asn1p_y.y" { yyval.a_type = ASN_STRING_BMPString; ; break;} -case 160: -#line 1429 "asn1p_y.y" +case 164: +#line 1446 "asn1p_y.y" { yyval.a_type = ASN_STRING_GeneralString; fprintf(stderr, "WARNING: GeneralString is not fully supported\n"); ; break;} -case 161: -#line 1433 "asn1p_y.y" +case 165: +#line 1450 "asn1p_y.y" { yyval.a_type = ASN_STRING_GraphicString; fprintf(stderr, "WARNING: GraphicString is not fully supported\n"); ; break;} -case 162: -#line 1437 "asn1p_y.y" +case 166: +#line 1454 "asn1p_y.y" { yyval.a_type = ASN_STRING_IA5String; ; break;} -case 163: -#line 1438 "asn1p_y.y" +case 167: +#line 1455 "asn1p_y.y" { yyval.a_type = ASN_STRING_ISO646String; ; break;} -case 164: -#line 1439 "asn1p_y.y" +case 168: +#line 1456 "asn1p_y.y" { yyval.a_type = ASN_STRING_NumericString; ; break;} -case 165: -#line 1440 "asn1p_y.y" +case 169: +#line 1457 "asn1p_y.y" { yyval.a_type = ASN_STRING_PrintableString; ; break;} -case 166: -#line 1441 "asn1p_y.y" +case 170: +#line 1458 "asn1p_y.y" { yyval.a_type = ASN_STRING_T61String; fprintf(stderr, "WARNING: T61String is not fully supported\n"); ; break;} -case 167: -#line 1445 "asn1p_y.y" +case 171: +#line 1462 "asn1p_y.y" { yyval.a_type = ASN_STRING_TeletexString; ; break;} -case 168: -#line 1446 "asn1p_y.y" +case 172: +#line 1463 "asn1p_y.y" { yyval.a_type = ASN_STRING_UniversalString; ; break;} -case 169: -#line 1447 "asn1p_y.y" +case 173: +#line 1464 "asn1p_y.y" { yyval.a_type = ASN_STRING_UTF8String; ; break;} -case 170: -#line 1448 "asn1p_y.y" +case 174: +#line 1465 "asn1p_y.y" { yyval.a_type = ASN_STRING_VideotexString; fprintf(stderr, "WARNING: VideotexString is not fully supported\n"); ; break;} -case 171: -#line 1452 "asn1p_y.y" +case 175: +#line 1469 "asn1p_y.y" { yyval.a_type = ASN_STRING_VisibleString; ; break;} -case 172: -#line 1453 "asn1p_y.y" +case 176: +#line 1470 "asn1p_y.y" { yyval.a_type = ASN_STRING_ObjectDescriptor; ; break;} -case 178: -#line 1465 "asn1p_y.y" +case 182: +#line 1482 "asn1p_y.y" { yyval.a_constr = 0; ; break;} -case 179: -#line 1466 "asn1p_y.y" +case 183: +#line 1483 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 180: -#line 1472 "asn1p_y.y" +case 184: +#line 1489 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); ; break;} -case 181: -#line 1475 "asn1p_y.y" +case 185: +#line 1492 "asn1p_y.y" { /* * This is a special case, for compatibility purposes. @@ -2690,26 +2717,26 @@ case 181: CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_SIZE, yyvsp[-1].a_constr, 0); ; break;} -case 182: -#line 1485 "asn1p_y.y" +case 186: +#line 1502 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; ; break;} -case 183: -#line 1488 "asn1p_y.y" +case 187: +#line 1505 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} -case 184: -#line 1494 "asn1p_y.y" +case 188: +#line 1511 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 185: -#line 1497 "asn1p_y.y" +case 189: +#line 1514 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2717,8 +2744,8 @@ case 185: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); ; break;} -case 186: -#line 1503 "asn1p_y.y" +case 190: +#line 1520 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2728,32 +2755,32 @@ case 186: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, ct, yyvsp[0].a_constr); ; break;} -case 187: -#line 1514 "asn1p_y.y" +case 191: +#line 1531 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 188: -#line 1517 "asn1p_y.y" +case 192: +#line 1534 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 189: -#line 1520 "asn1p_y.y" +case 193: +#line 1537 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 190: -#line 1523 "asn1p_y.y" +case 194: +#line 1540 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 191: -#line 1529 "asn1p_y.y" +case 195: +#line 1546 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2763,8 +2790,8 @@ case 191: checkmem(ret == 0); ; break;} -case 192: -#line 1537 "asn1p_y.y" +case 196: +#line 1554 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2774,8 +2801,8 @@ case 192: checkmem(ret == 0); ; break;} -case 193: -#line 1545 "asn1p_y.y" +case 197: +#line 1562 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2783,8 +2810,8 @@ case 193: yyval.a_constr->value = yyvsp[0].a_value; ; break;} -case 194: -#line 1551 "asn1p_y.y" +case 198: +#line 1568 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2793,8 +2820,8 @@ case 194: yyval.a_constr->range_stop = yyvsp[0].a_value; ; break;} -case 195: -#line 1558 "asn1p_y.y" +case 199: +#line 1575 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2804,8 +2831,8 @@ case 195: yyval.a_constr->range_start->type = ATV_MIN; ; break;} -case 196: -#line 1566 "asn1p_y.y" +case 200: +#line 1583 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2815,8 +2842,8 @@ case 196: yyval.a_constr->range_stop->type = ATV_MAX; ; break;} -case 197: -#line 1574 "asn1p_y.y" +case 201: +#line 1591 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2827,54 +2854,54 @@ case 197: yyval.a_constr->range_stop->type = ATV_MAX; ; break;} -case 198: -#line 1583 "asn1p_y.y" +case 202: +#line 1600 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 199: -#line 1586 "asn1p_y.y" +case 203: +#line 1603 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 200: -#line 1592 "asn1p_y.y" +case 204: +#line 1609 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RANGE; ; break;} -case 201: -#line 1593 "asn1p_y.y" +case 205: +#line 1610 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RLRANGE; ; break;} -case 202: -#line 1594 "asn1p_y.y" +case 206: +#line 1611 "asn1p_y.y" { yyval.a_ctype = ACT_EL_LLRANGE; ; break;} -case 203: -#line 1595 "asn1p_y.y" +case 207: +#line 1612 "asn1p_y.y" { yyval.a_ctype = ACT_EL_ULRANGE; ; break;} -case 204: -#line 1599 "asn1p_y.y" +case 208: +#line 1616 "asn1p_y.y" { yyval.a_ctype = ACT_CT_SIZE; ; break;} -case 205: -#line 1602 "asn1p_y.y" +case 209: +#line 1619 "asn1p_y.y" { yyval.a_ctype = ACT_CT_FROM; ; break;} -case 206: -#line 1608 "asn1p_y.y" +case 210: +#line 1625 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 207: -#line 1611 "asn1p_y.y" +case 211: +#line 1628 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2887,57 +2914,57 @@ case 207: free(yyvsp[0].tv_str); ; break;} -case 208: -#line 1622 "asn1p_y.y" +case 212: +#line 1639 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} -case 209: -#line 1626 "asn1p_y.y" +case 213: +#line 1643 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_FALSE; ; break;} -case 210: -#line 1631 "asn1p_y.y" +case 214: +#line 1648 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); yyval.a_value->type = ATV_TRUE; ; break;} -case 211: -#line 1639 "asn1p_y.y" +case 215: +#line 1656 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); ; break;} -case 212: -#line 1645 "asn1p_y.y" +case 216: +#line 1662 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 213: -#line 1648 "asn1p_y.y" +case 217: +#line 1665 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 214: -#line 1654 "asn1p_y.y" +case 218: +#line 1671 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_EXT; ; break;} -case 215: -#line 1659 "asn1p_y.y" +case 219: +#line 1676 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2946,46 +2973,46 @@ case 215: yyval.a_constr->presence = yyvsp[0].a_pres; ; break;} -case 216: -#line 1672 "asn1p_y.y" +case 220: +#line 1689 "asn1p_y.y" { yyval.a_pres = ACPRES_DEFAULT; ; break;} -case 217: -#line 1673 "asn1p_y.y" +case 221: +#line 1690 "asn1p_y.y" { yyval.a_pres = yyvsp[0].a_pres; ; break;} -case 218: -#line 1677 "asn1p_y.y" +case 222: +#line 1694 "asn1p_y.y" { yyval.a_pres = ACPRES_PRESENT; ; break;} -case 219: -#line 1680 "asn1p_y.y" +case 223: +#line 1697 "asn1p_y.y" { yyval.a_pres = ACPRES_ABSENT; ; break;} -case 220: -#line 1683 "asn1p_y.y" +case 224: +#line 1700 "asn1p_y.y" { yyval.a_pres = ACPRES_OPTIONAL; ; break;} -case 221: -#line 1689 "asn1p_y.y" +case 225: +#line 1706 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 222: -#line 1692 "asn1p_y.y" +case 226: +#line 1709 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 223: -#line 1701 "asn1p_y.y" +case 227: +#line 1718 "asn1p_y.y" { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; @@ -2999,14 +3026,14 @@ case 223: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, ct, 0); ; break;} -case 224: -#line 1716 "asn1p_y.y" +case 228: +#line 1733 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} -case 225: -#line 1722 "asn1p_y.y" +case 229: +#line 1739 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3014,8 +3041,8 @@ case 225: yyval.a_constr->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); ; break;} -case 226: -#line 1728 "asn1p_y.y" +case 230: +#line 1745 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3025,8 +3052,8 @@ case 226: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); ; break;} -case 227: -#line 1742 "asn1p_y.y" +case 231: +#line 1759 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; @@ -3039,8 +3066,8 @@ case 227: free(yyvsp[0].tv_str); ; break;} -case 228: -#line 1753 "asn1p_y.y" +case 232: +#line 1770 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; @@ -3054,14 +3081,14 @@ case 228: free(yyvsp[0].tv_str); ; break;} -case 229: -#line 1769 "asn1p_y.y" +case 233: +#line 1786 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 230: -#line 1772 "asn1p_y.y" +case 234: +#line 1789 "asn1p_y.y" { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); @@ -3072,61 +3099,61 @@ case 230: yyval.tv_str[l1 + 1 + l3] = '\0'; ; break;} -case 231: -#line 1790 "asn1p_y.y" +case 235: +#line 1807 "asn1p_y.y" { yyval.a_marker.flags = EM_NOMARK; yyval.a_marker.default_value = 0; ; break;} -case 232: -#line 1794 "asn1p_y.y" +case 236: +#line 1811 "asn1p_y.y" { yyval.a_marker = yyvsp[0].a_marker; ; break;} -case 233: -#line 1798 "asn1p_y.y" +case 237: +#line 1815 "asn1p_y.y" { yyval.a_marker.flags = EM_OPTIONAL; yyval.a_marker.default_value = 0; ; break;} -case 234: -#line 1802 "asn1p_y.y" +case 238: +#line 1819 "asn1p_y.y" { yyval.a_marker.flags = EM_DEFAULT; yyval.a_marker.default_value = yyvsp[0].a_value; ; break;} -case 235: -#line 1825 "asn1p_y.y" +case 239: +#line 1842 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); ; break;} -case 236: -#line 1829 "asn1p_y.y" +case 240: +#line 1846 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; ; break;} -case 237: -#line 1835 "asn1p_y.y" +case 241: +#line 1852 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 238: -#line 1840 "asn1p_y.y" +case 242: +#line 1857 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 239: -#line 1847 "asn1p_y.y" +case 243: +#line 1864 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3135,8 +3162,8 @@ case 239: yyval.a_expr->Identifier = yyvsp[0].tv_str; ; break;} -case 240: -#line 1854 "asn1p_y.y" +case 244: +#line 1871 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3146,8 +3173,8 @@ case 240: yyval.a_expr->value = yyvsp[-1].a_value; ; break;} -case 241: -#line 1862 "asn1p_y.y" +case 245: +#line 1879 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3157,8 +3184,8 @@ case 241: yyval.a_expr->value = yyvsp[-1].a_value; ; break;} -case 242: -#line 1870 "asn1p_y.y" +case 246: +#line 1887 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3167,8 +3194,8 @@ case 242: yyval.a_expr->value = yyvsp[0].a_value; ; break;} -case 243: -#line 1877 "asn1p_y.y" +case 247: +#line 1894 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3178,82 +3205,82 @@ case 243: yyval.a_expr->meta_type = AMT_VALUE; ; break;} -case 244: -#line 1888 "asn1p_y.y" +case 248: +#line 1905 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} -case 245: -#line 1892 "asn1p_y.y" +case 249: +#line 1909 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} -case 246: -#line 1923 "asn1p_y.y" +case 250: +#line 1940 "asn1p_y.y" { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; break;} -case 247: -#line 1924 "asn1p_y.y" +case 251: +#line 1941 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; ; break;} -case 248: -#line 1928 "asn1p_y.y" +case 252: +#line 1945 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; yyval.a_tag.tag_mode = TM_DEFAULT; ; break;} -case 249: -#line 1932 "asn1p_y.y" +case 253: +#line 1949 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_IMPLICIT; ; break;} -case 250: -#line 1936 "asn1p_y.y" +case 254: +#line 1953 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = TM_EXPLICIT; ; break;} -case 251: -#line 1943 "asn1p_y.y" +case 255: +#line 1960 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 252: -#line 1947 "asn1p_y.y" +case 256: +#line 1964 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 253: -#line 1955 "asn1p_y.y" +case 257: +#line 1972 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 254: -#line 1962 "asn1p_y.y" +case 258: +#line 1979 "asn1p_y.y" { yyval.tv_str = 0; ; break;} -case 255: -#line 1963 "asn1p_y.y" +case 259: +#line 1980 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 256: -#line 1968 "asn1p_y.y" +case 260: +#line 1985 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; @@ -3481,7 +3508,7 @@ case 256: } return 1; } -#line 1974 "asn1p_y.y" +#line 1991 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index 1fe3c910b..922f937a2 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -76,7 +76,7 @@ static asn1p_value_t * asn1p_paramlist_t *a_plist; /* A pargs list */ struct asn1p_expr_marker_s a_marker; /* OPTIONAL/DEFAULT */ enum asn1p_constr_pres_e a_pres; /* PRESENT/ABSENT/OPTIONAL */ - asn1_integer_t a_int; + asn1c_integer_t a_int; char *tv_str; struct { char *buf; @@ -239,6 +239,7 @@ static asn1p_value_t * %type Value %type DefinedValue %type SignedNumber +%type optComponentTypeLists %type ComponentTypeLists %type ComponentType %type AlternativeTypeLists @@ -618,6 +619,12 @@ ImportsElement: $$->Identifier = $1; $$->expr_type = A1TC_REFERENCE; } + | TypeRefName '{' '}' { /* Completely equivalent to above */ + $$ = asn1p_expr_new(yylineno); + checkmem($$); + $$->Identifier = $1; + $$->expr_type = A1TC_REFERENCE; + } | Identifier { $$ = asn1p_expr_new(yylineno); checkmem($$); @@ -659,6 +666,12 @@ ExportsElement: $$->Identifier = $1; $$->expr_type = A1TC_EXPORTVAR; } + | TypeRefName '{' '}' { + $$ = asn1p_expr_new(yylineno); + checkmem($$); + $$->Identifier = $1; + $$->expr_type = A1TC_EXPORTVAR; + } | Identifier { $$ = asn1p_expr_new(yylineno); checkmem($$); @@ -841,6 +854,10 @@ ActualParameter: /* * A collection of constructed data type members. */ +optComponentTypeLists: + { $$ = asn1p_expr_new(yylineno); } + | ComponentTypeLists { $$ = $1; }; + ComponentTypeLists: ComponentType { $$ = asn1p_expr_new(yylineno); @@ -1065,13 +1082,13 @@ TypeDeclaration: $$->expr_type = ASN_CONSTR_CHOICE; $$->meta_type = AMT_TYPE; } - | TOK_SEQUENCE '{' ComponentTypeLists '}' { + | TOK_SEQUENCE '{' optComponentTypeLists '}' { $$ = $3; assert($$->expr_type == A1TC_INVALID); $$->expr_type = ASN_CONSTR_SEQUENCE; $$->meta_type = AMT_TYPE; } - | TOK_SET '{' ComponentTypeLists '}' { + | TOK_SET '{' optComponentTypeLists '}' { $$ = $3; assert($$->expr_type == A1TC_INVALID); $$->expr_type = ASN_CONSTR_SET; From 60e7ef0c6207706a594a667efc533e52698d86dc Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 13 Oct 2004 09:13:56 +0000 Subject: [PATCH 0500/1469] -X for XML DTD git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@500 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 3 +- asn1c/asn1c.1 | 8 ++- asn1c/asn1c.c | 8 ++- configure | 2 +- configure.in | 2 +- doc/asn1c-usage.html | 3 + doc/asn1c-usage.lyx | 24 ++++++- doc/asn1c-usage.pdf | Bin 108339 -> 108373 bytes libasn1print/asn1print.c | 141 +++++++++++++++++++++++++++++++++++++-- libasn1print/asn1print.h | 1 + 10 files changed, 178 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index c4b1ab219..0a8030c26 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,7 @@ -0.9.7.2: 2004-Oct-12 +0.9.8: 2004-Oct-13 + * -X command line option added to asn1c to generate XML DTD. * Empty SEQUENCE and SET clauses are now allowed. 0.9.7.1: 2004-Oct-12 diff --git a/asn1c/asn1c.1 b/asn1c/asn1c.1 index b331d440e..7a6f87f5e 100644 --- a/asn1c/asn1c.1 +++ b/asn1c/asn1c.1 @@ -3,18 +3,19 @@ asn1c \- ASN.1 Compiler .SH SYNOPSIS asn1c [\fB\-E\fR [\fB-F\fR] | \fB\-P\fR | \fB\-R\fR] - [\fB\-S\fR\fIdir\fR] + [\fB\-S\fR\fIdir\fR] [\fB-X\fR] [\fB\-W\fR\fIdebug-\fR...] [\fB\-f\fR\fIoption\fR...] [\fB\-p\fR\fIrint-\fR...] \fIinfile\fR... .SH DESCRIPTION asn1c compiles the ASN.1 specifications into the set of -target language (C/C++) encoders and decoders for BER, DER, +target language (C/C++) encoders and decoders for BER, DER, XER, and other encoding standards. .SH OPTIONS .TP \fIOverall Options\fR \fB\-E \-F \-P \-R\fR .BI "\-S " directory +\fB\-X .TP \fIWarning Options\fR .br @@ -50,6 +51,9 @@ omitting the usual support code. .TP \fB\-S\fR \fIdirectory\fR Use the specified directory with ASN.1 skeleton files. +.TP +.B \-X +Generate the XML DTD schema for the specified ASN.1 files. .SH WARNING OPTIONS .TP .B \-Werror diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index 98a607aa0..32e6e7448 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -70,7 +70,7 @@ main(int ac, char **av) { /* * Process command-line options. */ - while((ch = getopt(ac, av, "EFf:hLPp:RS:vW:")) != -1) + while((ch = getopt(ac, av, "EFf:hLPp:RS:vW:X")) != -1) switch(ch) { case 'E': print_arg__print_out = 1; @@ -146,6 +146,11 @@ main(int ac, char **av) { exit(EX_USAGE); } break; + case 'X': + print_arg__print_out = 1; /* Implicit -E */ + print_arg__fix_n_print = 1; /* Implicit -F */ + asn1_printer_flags |= APF_PRINT_XML_DTD; + break; default: usage(av[0]); } @@ -299,6 +304,7 @@ usage(const char *av0) { " -R Restrict output (tables only, no support code)\n" " -S Directory with support (skeleton?) files\n" " (Default is \"%s\")\n" +" -X Generate and print the XML DTD\n" "\n" " -Werror Treat warnings as errors; abort if any warning\n" diff --git a/configure b/configure index 78e1c9a9a..750133762 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.9.7.2 + VERSION=0.9.8 cat >>confdefs.h <<_ACEOF diff --git a/configure.in b/configure.in index 5c6a1e792..ce67231d9 100644 --- a/configure.in +++ b/configure.in @@ -3,7 +3,7 @@ AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_BUILD AC_CANONICAL_TARGET AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.9.7.2) +AM_INIT_AUTOMAKE(asn1c, 0.9.8) AM_MAINTAINER_MODE diff --git a/doc/asn1c-usage.html b/doc/asn1c-usage.html index fcc2980c7..e9096bfc3 100644 --- a/doc/asn1c-usage.html +++ b/doc/asn1c-usage.html @@ -692,6 +692,9 @@

    + + diff --git a/doc/asn1c-usage.lyx b/doc/asn1c-usage.lyx index 012503c0b..c6b377f9c 100644 --- a/doc/asn1c-usage.lyx +++ b/doc/asn1c-usage.lyx @@ -71,7 +71,7 @@ status Open \backslash lhead{Document describes \backslash -href{http://lionet.info/soft/asn1c-0.9.6.tar.gz}{asn1c-0.9.6}} +href{http://lionet.info/asn1c}{asn1c-0.9.8}} \layout Standard \backslash @@ -1341,7 +1341,7 @@ collapsed false \begin_inset Tabular - + @@ -1452,7 +1452,7 @@ Restrict the compiler to generate only the ASN.1 tables, omit- ting the usual \end_inset - + \begin_inset Text @@ -1474,6 +1474,24 @@ Use the specified directory with ASN.1 skeleton files. \end_inset + + +\begin_inset Text + +\layout Standard + +-X +\end_inset + + +\begin_inset Text + +\layout Standard + +Generate the XML DTD for the specified ASN.1 modules. +\end_inset + + \begin_inset Text diff --git a/doc/asn1c-usage.pdf b/doc/asn1c-usage.pdf index df871b0c3cc688f9a355e1f9d1147ebd3270b099..bab14c4451be17afee8fae99e23f561afb6afd8c 100644 GIT binary patch delta 14669 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 delta 14581 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 diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index 4132204f0..a6c3edb5f 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -10,7 +10,7 @@ #include "asn1print.h" #define INDENT(fmt, args...) do { \ - int __i = level; while(__i--) putchar(' '); \ + int __i = level; while(__i--) printf(" "); \ printf(fmt, ##args); \ } while(0) @@ -22,8 +22,8 @@ static int asn1print_params(asn1p_paramlist_t *pl,enum asn1print_flags flags); static int asn1print_with_syntax(asn1p_wsyntx_t *wx, enum asn1print_flags flags); static int asn1print_constraint(asn1p_constraint_t *, enum asn1print_flags); static int asn1print_value(asn1p_value_t *val, enum asn1print_flags flags); -static int asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1print_flags flags, - int level); +static int asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1print_flags flags, int level); +static int asn1print_expr_dtd(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1print_flags flags, int level); /* * Print the contents of the parsed ASN tree. @@ -38,6 +38,9 @@ asn1print(asn1p_t *asn, enum asn1print_flags flags) { return -1; } + if(flags & APF_PRINT_XML_DTD) + printf("\n\n"); + TQ_FOR(mod, &(asn->modules), mod_next) { if(modno++) printf("\n"); asn1print_module(asn, mod, flags); @@ -50,12 +53,28 @@ static int asn1print_module(asn1p_t *asn, asn1p_module_t *mod, enum asn1print_flags flags) { asn1p_expr_t *tc; + if(flags & APF_PRINT_XML_DTD) + printf("\n\n"); + + TQ_FOR(tc, &(mod->members), next) { + asn1print_expr_dtd(asn, mod, tc, flags, 0); + } + + return 0; + } + printf("DEFINITIONS"); if(mod->module_flags & MSF_TAG_INSTRUCTIONS) @@ -442,7 +461,7 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri int SEQ_OF = 0; if(flags & APF_LINE_COMMENTS) - INDENT("-- #line %d\n", tc->_lineno); + INDENT("-- #line %d\n", tc->_lineno); if(tc->Identifier) INDENT("%s", tc->Identifier); @@ -539,7 +558,7 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri /* * Print the expression as it were a stand-alone type. */ - asn1print_expr(asn, mod, se, flags, level + 4); + asn1print_expr(asn, mod, se, flags, level + 1); if((se->marker.flags & EM_DEFAULT) == EM_DEFAULT) { printf(" DEFAULT "); asn1print_value(se->marker.default_value, flags); @@ -614,3 +633,115 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri return 0; } + +static int +asn1print_expr_dtd(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, enum asn1print_flags flags, int level) { + asn1p_expr_t *se; + int expr_unordered = 0; + + switch(expr->meta_type) { + case AMT_TYPE: + case AMT_TYPEREF: + break; + default: + if(expr->expr_type == A1TC_UNIVERVAL) + break; + return 0; + } + + if(!expr->Identifier) return 0; + + if(expr->expr_type == ASN_CONSTR_CHOICE + || expr->expr_type == ASN_CONSTR_SEQUENCE_OF + || expr->expr_type == ASN_CONSTR_SET_OF + || expr->expr_type == ASN_CONSTR_SET + || expr->expr_type == ASN_BASIC_INTEGER + || expr->expr_type == ASN_BASIC_ENUMERATED) { + expr_unordered = 1; + } + + if(flags & APF_LINE_COMMENTS) + INDENT("\n", expr->_lineno); + INDENT("Identifier); + + if(expr->expr_type == A1TC_REFERENCE) { + se = asn1f_find_terminal_type_ex(asn, expr); + if(!se) { + printf("(ANY)"); + return 0; + } + expr = se; + } + + if(TQ_FIRST(&expr->members)) { + int extensible = 0; + printf(" ("); + TQ_FOR(se, &(expr->members), next) { + if(se->expr_type == A1TC_EXTENSIBLE) { + extensible = 1; + continue; + } else if(!se->Identifier + && se->expr_type == A1TC_REFERENCE) { + asn1print_ref(se->reference, flags); + } else if(se->Identifier) { + printf("%s", se->Identifier); + } else { + printf("ANY"); + } + if(expr->expr_type != ASN_CONSTR_SET + && expr->expr_type != ASN_CONSTR_CHOICE + && expr->expr_type != ASN_BASIC_INTEGER + && expr->expr_type != ASN_BASIC_ENUMERATED) { + if(expr_unordered) + printf("*"); + else if(se->marker.flags) + printf("?"); + } + if(TQ_NEXT(se, next) + && TQ_NEXT(se, next)->expr_type != A1TC_EXTENSIBLE) { + printf(expr_unordered?"|":", "); + } + } + if(extensible) { + printf(expr_unordered?"|":", "); + printf("ANY"); + if(expr->expr_type != ASN_CONSTR_SET + && expr->expr_type != ASN_CONSTR_CHOICE + && expr->expr_type != ASN_BASIC_INTEGER + && expr->expr_type != ASN_BASIC_ENUMERATED) + printf("*"); + } + + printf(")"); + if(expr->expr_type == ASN_CONSTR_SET) + printf("*"); + + } else if((expr->expr_type & ASN_CONSTR_MASK) + || expr->expr_type == ASN_BASIC_NULL) { + printf(" EMPTY"); + } else if(expr->expr_type == A1TC_UNIVERVAL) { + printf(" EMPTY"); + } else if(expr->expr_type == ASN_TYPE_ANY) { + printf(" ANY"); + } else if(expr->expr_type == ASN_BASIC_BIT_STRING + || expr->expr_type == ASN_BASIC_OBJECT_IDENTIFIER + || expr->expr_type == ASN_BASIC_RELATIVE_OID + || expr->expr_type == ASN_BASIC_UTCTime + || expr->expr_type == ASN_BASIC_GeneralizedTime + ) { + printf(" (#CDATA)"); + } else { + printf(" (#PCDATA)"); + } + printf(">\n"); + + /* + * Display the descendants (children) of the current type. + */ + TQ_FOR(se, &(expr->members), next) { + if(se->expr_type == A1TC_EXTENSIBLE) continue; + asn1print_expr_dtd(asn, mod, se, flags, level + 1); + } + + return 0; +} diff --git a/libasn1print/asn1print.h b/libasn1print/asn1print.h index c24e58e87..51233e99e 100644 --- a/libasn1print/asn1print.h +++ b/libasn1print/asn1print.h @@ -5,6 +5,7 @@ enum asn1print_flags { APF_NOFLAGS, APF_LINE_COMMENTS = 0x01, /* Include line comments */ APF_DEBUG_CONSTRAINTS = 0x02, /* Explain constraints */ + APF_PRINT_XML_DTD = 0x04, /* Generate XML DTD */ }; /* From 3ab8d83dad89f7e1c1a70728dfb21a7f2066ad6d Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 13 Oct 2004 09:30:04 +0000 Subject: [PATCH 0501/1469] free git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@501 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/webcgi/asn1c.cgi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/asn1c/webcgi/asn1c.cgi b/asn1c/webcgi/asn1c.cgi index 8214e9e86..a7632a593 100755 --- a/asn1c/webcgi/asn1c.cgi +++ b/asn1c/webcgi/asn1c.cgi @@ -27,7 +27,7 @@ $myName = $ENV{SCRIPT_NAME}; # URL of this particular script (without args) $homePath = "" . "Home" . " >> asn1c" - . " >> Online ASN.1 Compiler" + . " >> Free Online ASN.1 Compiler" . "

    "; ################################################### @@ -436,7 +436,7 @@ print< -Online ASN.1 Compiler +Free Online ASN.1 Compiler From 6f4e6cfe52f542a1b89d70cc37bc85ad77ada3d8 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 14 Oct 2004 05:08:07 +0000 Subject: [PATCH 0502/1469] request free help git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@502 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/webcgi/asn1c.cgi | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/asn1c/webcgi/asn1c.cgi b/asn1c/webcgi/asn1c.cgi index a7632a593..29d28f7c9 100755 --- a/asn1c/webcgi/asn1c.cgi +++ b/asn1c/webcgi/asn1c.cgi @@ -376,6 +376,12 @@ foreach my $trans (sort { $b cmp $a } @transactions) { . "&trans=$f" . "&show=tgz\">" . "Fetch results (.tgz)"; + } else { + $results .= '
    Request free help'; } $history .= "

    " From 284e6845d692cf3bcf1c75da3bb45fbe825021b5 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 14 Oct 2004 05:08:50 +0000 Subject: [PATCH 0503/1469] automatic tagging test git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@503 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/67-embedded-choice-OK.asn1 | 35 ++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 tests/67-embedded-choice-OK.asn1 diff --git a/tests/67-embedded-choice-OK.asn1 b/tests/67-embedded-choice-OK.asn1 new file mode 100644 index 000000000..d3a195490 --- /dev/null +++ b/tests/67-embedded-choice-OK.asn1 @@ -0,0 +1,35 @@ + +-- OK: Everything is Fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .67 + +ModuleTestEmbeddedChoice + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 67 } + DEFINITIONS AUTOMATIC TAGS ::= +BEGIN + + A ::= CHOICE { + a NULL, + b NULL, + ... + } + + B ::= CHOICE { + a NULL, + b NULL, + ..., + other A -- Only AUTOMATIC TAGS make it right + } + + C ::= SET { + a NULL, + b NULL, + ..., + other1 A, + other2 B + } + +END From ceb9319e3e2a49377ca118c9d24e2e58f7b6707f Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 14 Oct 2004 05:11:25 +0000 Subject: [PATCH 0504/1469] better XML DTD generation git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@504 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1print/asn1print.c | 62 +++++++++++++++++++++++++++++----------- 1 file changed, 45 insertions(+), 17 deletions(-) diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index a6c3edb5f..a750d442f 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -638,6 +638,7 @@ static int asn1print_expr_dtd(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, enum asn1print_flags flags, int level) { asn1p_expr_t *se; int expr_unordered = 0; + int dont_involve_children = 0; switch(expr->meta_type) { case AMT_TYPE: @@ -667,10 +668,11 @@ asn1print_expr_dtd(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, enum a if(expr->expr_type == A1TC_REFERENCE) { se = asn1f_find_terminal_type_ex(asn, expr); if(!se) { - printf("(ANY)"); + printf(" (ANY)"); return 0; } expr = se; + dont_involve_children = 1; } if(TQ_FIRST(&expr->members)) { @@ -716,31 +718,57 @@ asn1print_expr_dtd(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, enum a if(expr->expr_type == ASN_CONSTR_SET) printf("*"); - } else if((expr->expr_type & ASN_CONSTR_MASK) - || expr->expr_type == ASN_BASIC_NULL) { - printf(" EMPTY"); - } else if(expr->expr_type == A1TC_UNIVERVAL) { + } else switch(expr->expr_type) { + case ASN_BASIC_BOOLEAN: + printf("(true|false)"); + break; + case ASN_CONSTR_CHOICE: + case ASN_CONSTR_SET: + case ASN_CONSTR_SET_OF: + case ASN_CONSTR_SEQUENCE: + case ASN_CONSTR_SEQUENCE_OF: + case ASN_BASIC_NULL: + case A1TC_UNIVERVAL: printf(" EMPTY"); - } else if(expr->expr_type == ASN_TYPE_ANY) { - printf(" ANY"); - } else if(expr->expr_type == ASN_BASIC_BIT_STRING - || expr->expr_type == ASN_BASIC_OBJECT_IDENTIFIER - || expr->expr_type == ASN_BASIC_RELATIVE_OID - || expr->expr_type == ASN_BASIC_UTCTime - || expr->expr_type == ASN_BASIC_GeneralizedTime - ) { + break; + case ASN_TYPE_ANY: + printf(" ANY"); + break; + case ASN_BASIC_BIT_STRING: + case ASN_BASIC_OCTET_STRING: + case ASN_BASIC_OBJECT_IDENTIFIER: + case ASN_BASIC_RELATIVE_OID: + case ASN_BASIC_UTCTime: + case ASN_BASIC_GeneralizedTime: + case ASN_BASIC_INTEGER: + case ASN_STRING_NumericString: + case ASN_STRING_PrintableString: printf(" (#CDATA)"); - } else { + break; + case ASN_STRING_VisibleString: + case ASN_STRING_ISO646String: + /* Entity references, but not XML elements may be present */ printf(" (#PCDATA)"); + break; + case ASN_BASIC_REAL: /* e.g. */ + case ASN_BASIC_ENUMERATED: /* e.g. */ + default: + /* + * XML elements are allowed. + * For example, a UTF8String may contain "". + */ + printf(" ANY"); } printf(">\n"); /* * Display the descendants (children) of the current type. */ - TQ_FOR(se, &(expr->members), next) { - if(se->expr_type == A1TC_EXTENSIBLE) continue; - asn1print_expr_dtd(asn, mod, se, flags, level + 1); + if(!dont_involve_children) { + TQ_FOR(se, &(expr->members), next) { + if(se->expr_type == A1TC_EXTENSIBLE) continue; + asn1print_expr_dtd(asn, mod, se, flags, level + 1); + } } return 0; From 40a69bf43c4362788cac08a632ac28fe80d173fd Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 15 Oct 2004 06:01:54 +0000 Subject: [PATCH 0505/1469] #CDATA is bogus git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@505 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1print/asn1print.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index a750d442f..c8d2eb57c 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -738,12 +738,12 @@ asn1print_expr_dtd(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, enum a case ASN_BASIC_OCTET_STRING: case ASN_BASIC_OBJECT_IDENTIFIER: case ASN_BASIC_RELATIVE_OID: + case ASN_BASIC_INTEGER: case ASN_BASIC_UTCTime: case ASN_BASIC_GeneralizedTime: - case ASN_BASIC_INTEGER: case ASN_STRING_NumericString: case ASN_STRING_PrintableString: - printf(" (#CDATA)"); + printf(" (#PCDATA)"); break; case ASN_STRING_VisibleString: case ASN_STRING_ISO646String: From 6534a8d43db3eb54bd584e87ebc78a2650f92d4c Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 20 Oct 2004 15:40:04 +0000 Subject: [PATCH 0506/1469] things necessary for Sun Solaris 9 @ sparc git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@506 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 6 ++-- asn1c/check-parsing.sh | 4 ++- asn1c/tests/Makefile.am | 2 +- asn1c/tests/Makefile.in | 2 +- asn1c/tests/check-assembly.sh | 11 ++++--- libasn1compiler/asn1c_out.c | 40 +++++++++++-------------- libasn1fix/asn1fix_misc.c | 8 +++-- skeletons/GeneralizedTime.c | 11 +++++-- skeletons/REAL.c | 4 +-- skeletons/asn_types.h | 16 ++++++++-- skeletons/tests/check-GeneralizedTime.c | 16 ++++++---- skeletons/tests/check-UTCTime.c | 8 ++--- 12 files changed, 76 insertions(+), 52 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0a8030c26..4bb7e7151 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,10 @@ -0.9.8: 2004-Oct-13 +0.9.8: 2004-Oct-20 * -X command line option added to asn1c to generate XML DTD. * Empty SEQUENCE and SET clauses are now allowed. + * Code compiled and tested on Sun Solaris 9 @ sparc. + Improved includes/defines of/for system headers. 0.9.7.1: 2004-Oct-12 @@ -200,7 +202,7 @@ * Compiler: fixed recursive ASN.1 types inclusion (Severity: low, Security impact: none). * Parser: IMPORTS/FROM fixes, now allowing multiple sections. - * Code compiled and checked on PowerPC (@MacOS X). No major portability + * Code compiled and tested on MacOS X (@ PowerPC). No major portability issues experienced. 0.8.7: 2004-Apr-11 T-version-0-8-7 diff --git a/asn1c/check-parsing.sh b/asn1c/check-parsing.sh index c5c2d6aa6..5480d0b93 100755 --- a/asn1c/check-parsing.sh +++ b/asn1c/check-parsing.sh @@ -2,6 +2,8 @@ tmpfile=".check-parsing.$$.tmp" +diff -a . . 2>/dev/null && diffArgs="-a" + ec=0 for ref in ../tests/*.asn1.-*; do @@ -10,7 +12,7 @@ for ref in ../tests/*.asn1.-*; do echo "Checking $src against $ref" ./asn1c "-$flags" "$src" > "$tmpfile" || ec=$? if [ $? = 0 ]; then - diff -a -u "$ref" "$tmpfile" || ec=$? + diff $diffArgs -u "$ref" "$tmpfile" || ec=$? fi if [ "$1" != "regenerate" ]; then rm -f "$tmpfile" diff --git a/asn1c/tests/Makefile.am b/asn1c/tests/Makefile.am index 4a4b461e7..a6ab54a37 100644 --- a/asn1c/tests/Makefile.am +++ b/asn1c/tests/Makefile.am @@ -3,7 +3,7 @@ AM_CFLAGS = @ADD_CFLAGS@ check_SCRIPTS = check-assembly.sh -TESTS_ENVIRONMENT= CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" ./check-assembly.sh +TESTS_ENVIRONMENT= CC="${CC}" CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" ./check-assembly.sh if CPLUSPLUS_FOUND TESTS = check-*.c check-*.cc ## Include C++ test filed (.cc) diff --git a/asn1c/tests/Makefile.in b/asn1c/tests/Makefile.in index 91ad426ef..80dcd2af4 100644 --- a/asn1c/tests/Makefile.in +++ b/asn1c/tests/Makefile.in @@ -157,7 +157,7 @@ target_os = @target_os@ target_vendor = @target_vendor@ AM_CFLAGS = @ADD_CFLAGS@ check_SCRIPTS = check-assembly.sh -TESTS_ENVIRONMENT = CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" ./check-assembly.sh +TESTS_ENVIRONMENT = CC="${CC}" CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" ./check-assembly.sh @CPLUSPLUS_FOUND_FALSE@TESTS = check-*.c @CPLUSPLUS_FOUND_TRUE@TESTS = check-*.c check-*.cc ## Include C++ test filed (.cc) EXTRA_DIST = \ diff --git a/asn1c/tests/check-assembly.sh b/asn1c/tests/check-assembly.sh index 43ce00128..2edc8f4f5 100755 --- a/asn1c/tests/check-assembly.sh +++ b/asn1c/tests/check-assembly.sh @@ -11,10 +11,10 @@ if [ "x$1" = "x" ]; then fi # Compute the .asn1 spec name by the given file name. -source=$(echo "$1" | sed -e 's/.*\///') +source=`echo "$1" | sed -e 's/.*\///'` testno=`echo "$source" | cut -f2 -d'-' | cut -f1 -d'.'` -args=$(echo "$source" | sed -e 's/\.c[c]*$//') +args=`echo "$source" | sed -e 's/\.c[c]*$//'` testdir=test-${args} OFS=$IFS @@ -30,9 +30,10 @@ if [ ! -d $testdir ]; then mkdir $testdir || exit $? fi cd $testdir || exit $? -ln -fs ../$source || exit $? +rm -f ./$source 2>/dev/null +ln -fns ../$source || exit $? -asn_module=$(echo ../../../tests/${testno}-*.asn1) +asn_module=`echo ../../../tests/${testno}-*.asn1` # Create a Makefile for the project. cat > Makefile <target->target) { @@ -48,35 +47,30 @@ asn1c_compiled_output(arg_t *arg, const char *fmt, ...) { if(lf_found) dst->indented = 0; - /* - * Estimate necessary size. - */ - buf = ""; - va_start(ap, fmt); - ret = vsnprintf(buf, 0, fmt, ap); - va_end(ap); - assert(ret >= 0); - /* * Allocate buffer. */ m = calloc(1, sizeof(out_chunk_t)); if(m == NULL) return -1; - m->len = ret + 1; - m->buf = malloc(ret + 1); - if(m->buf == NULL) { - free(m); - return -1; - } - /* - * Fill the buffer. - */ - va_start(ap, fmt); - ret = vsnprintf(m->buf, m->len, fmt, ap); - assert(ret < m->len); + m->len = 16; + do { + void *tmp; + m->len <<= 2; + tmp = realloc(m->buf, m->len); + if(tmp) { + m->buf = (char *)tmp; + } else { + free(m->buf); + free(m); + return -1; + } + va_start(ap, fmt); + ret = vsnprintf(m->buf, m->len, fmt, ap); + va_end(ap); + } while(ret >= (m->len - 1) || ret < 0); + m->len = ret; - va_end(ap); if(arg->target->target == OT_INCLUDES) { out_chunk_t *v; diff --git a/libasn1fix/asn1fix_misc.c b/libasn1fix/asn1fix_misc.c index b049d1ae9..e9d156cec 100644 --- a/libasn1fix/asn1fix_misc.c +++ b/libasn1fix/asn1fix_misc.c @@ -345,9 +345,11 @@ asn1f_make_known_external_type(const char *type_name) { int asn1f_check_known_external_type(const char *type_name) { - void *p = bsearch(&type_name, known_types, known_types_count, - sizeof(known_types[0]), _known_types_cmp); - if(p) return 0; + if(known_types_count) { + void *p = bsearch(&type_name, known_types, known_types_count, + sizeof(known_types[0]), _known_types_cmp); + if(p) return 0; + } errno = ESRCH; return -1; } diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 631f3ed6e..9d5fe4acd 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -2,6 +2,8 @@ * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#define _POSIX_PTHREAD_SEMANTICS /* for Sun */ +#define _REENTRANT /* for Sun */ #include #include #include @@ -34,10 +36,15 @@ static struct tm *gmtime_r(const time_t *tloc, struct tm *result) { } #define tzset() _tzset() +#define putenv() _putenv() #define _EMULATE_TIMEGM #endif /* WIN32 */ +#if defined(sun) +#define _EMULATE_TIMEGM +#endif + /* * Where to look for offset from GMT, Phase I. * Several platforms are known. @@ -87,7 +94,7 @@ static time_t timegm(struct tm *tm) { char *buf; tz = getenv("TZ"); - _putenv("TZ=UTC"); + putenv("TZ=UTC"); tzset(); tloc = mktime(tm); if (tz) { @@ -97,7 +104,7 @@ static time_t timegm(struct tm *tm) { } else { buf = "TZ="; } - _putenv(buf); + putenv(buf); tzset(); return tloc; } diff --git a/skeletons/REAL.c b/skeletons/REAL.c index 6d3e55e6a..d395c8487 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -57,7 +57,7 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) buf = ""; buflen = 15; return (cb(buf, buflen, app_key) < 0) ? -1 : buflen; - } else if(isinf(d)) { + } else if(!finite(d)) { if(copysign(1.0, d) < 0.0) { buf = ""; buflen = 17; @@ -416,7 +416,7 @@ asn_double2REAL(REAL_t *st, double dbl_value) { st->buf[0] = 0x42; /* NaN */ st->buf[1] = 0; st->size = 1; - } else if(isinf(dbl_value)) { + } else if(!finite(dbl_value)) { if(copysign(1.0, dbl_value) < 0.0) { st->buf[0] = 0x41; /* MINUS-INFINITY */ } else { diff --git a/skeletons/asn_types.h b/skeletons/asn_types.h index 81a00c348..cf5c87e46 100644 --- a/skeletons/asn_types.h +++ b/skeletons/asn_types.h @@ -12,7 +12,7 @@ #include "config.h" #endif -#include /* For fprintf() */ +#include /* For snprintf(3) */ #include /* For *alloc(3) */ #include /* For memcpy(3) */ #include /* For size_t */ @@ -21,13 +21,23 @@ #include /* C99 specifies this file */ +#if defined(sun) +#include /* for finite(3) */ +#endif + /* - * Earlier FreeBSD version didn't have , + * 1. Earlier FreeBSD version didn't have , * but was present. + * 2. Sun Solaris requires for alloca(3), + * but does not have . */ -#if !defined(__FreeBSD__) || !defined(_SYS_INTTYPES_H_) /* Workaround */ +#if (!defined(__FreeBSD__) || !defined(_SYS_INTTYPES_H_)) +#if defined(sun) +#include /* For alloca(3) */ +#else #include /* SUSv2+ and C99 specify this file, for uintXX_t */ #endif +#endif #ifdef WIN32 #define snprintf _snprintf diff --git a/skeletons/tests/check-GeneralizedTime.c b/skeletons/tests/check-GeneralizedTime.c index 6c35a1c22..0cec17d12 100644 --- a/skeletons/tests/check-GeneralizedTime.c +++ b/skeletons/tests/check-GeneralizedTime.c @@ -14,20 +14,24 @@ check(char *time_str, time_t expect, int as_gmt) { tloc = asn_GT2time(>, &tm, as_gmt); printf("%s: [%s] -> %ld == %ld\n", as_gmt?"GMT":"ofs", time_str, (long)tloc, (long)expect); - if(tloc != -1) - printf("\t%04d-%02d-%02dT%02d:%02d:%02d%+03ld%02ld\n", + + if(tloc != -1) { + printf("\t%04d-%02d-%02dT%02d:%02d:%02d%+03ld%02ld\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, - (tm.tm_gmtoff / 3600), - labs(tm.tm_gmtoff % 3600) - ); + (GMTOFF(tm) / 3600), + labs(GMTOFF(tm) % 3600) + ); + } assert(tloc == expect); - assert(tloc == -1 || as_gmt == 0 || tm.tm_gmtoff == 0); +#ifdef HAVE_TM_GMTOFF + assert(tloc == -1 || as_gmt == 0 || GMTOFF(tm) == 0); +#endif if(!as_gmt) check(time_str, expect, 1); } diff --git a/skeletons/tests/check-UTCTime.c b/skeletons/tests/check-UTCTime.c index d62635933..6762865f0 100644 --- a/skeletons/tests/check-UTCTime.c +++ b/skeletons/tests/check-UTCTime.c @@ -1,7 +1,7 @@ #define __NO_ASN_TABLE__ -#include -#define __NO_ASSERT_H__ #include +#define __NO_ASN_TABLE__ +#include #include static void @@ -23,11 +23,11 @@ check(char *time_str, time_t sample, int as_gmt) { tm.tm_hour, tm.tm_min, tm.tm_sec, - tm.tm_gmtoff + GMTOFF(tm) ); assert(tloc == sample); - assert(tloc == -1 || as_gmt == 0 || tm.tm_gmtoff == 0); + assert(tloc == -1 || as_gmt == 0 || GMTOFF(tm) == 0); if(as_gmt) check(time_str, sample, as_gmt); } From 29746506bfb0b25d4da9fca6ffa6bb1d224abbc9 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 20 Oct 2004 15:46:56 +0000 Subject: [PATCH 0507/1469] ber_dec_rval_t -> asn_dec_rval_t git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@507 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-22.c | 2 +- asn1c/tests/check-24.c | 2 +- asn1c/tests/check-25.c | 4 ++-- asn1c/tests/check-30.c | 4 ++-- asn1c/tests/check-31.c | 4 ++-- asn1c/tests/check-35.c | 6 +++--- asn1c/tests/check-41.c | 4 ++-- asn1c/tests/check-44.c | 2 +- asn1c/tests/check-46.c | 2 +- asn1c/tests/check-48.c | 2 +- asn1c/tests/check-62.c | 2 +- asn1c/tests/check-65.c | 4 ++-- 12 files changed, 19 insertions(+), 19 deletions(-) diff --git a/asn1c/tests/check-22.c b/asn1c/tests/check-22.c index 95f0c4aa2..f50286be7 100644 --- a/asn1c/tests/check-22.c +++ b/asn1c/tests/check-22.c @@ -47,7 +47,7 @@ buf2_fill(const void *buffer, size_t size, void *app_key) { static void check(int is_ok, uint8_t *buf, int size, size_t consumed) { T1_t t, *tp; - ber_dec_rval_t rval; + asn_dec_rval_t rval; asn_enc_rval_t erval; int ret; int i; diff --git a/asn1c/tests/check-24.c b/asn1c/tests/check-24.c index f50cbf64f..a60e7c137 100644 --- a/asn1c/tests/check-24.c +++ b/asn1c/tests/check-24.c @@ -36,7 +36,7 @@ uint8_t buf1[] = { static void check(int is_ok, uint8_t *buf, int size, size_t consumed) { T_t t, *tp; - ber_dec_rval_t rval; + asn_dec_rval_t rval; tp = memset(&t, 0, sizeof(t)); diff --git a/asn1c/tests/check-25.c b/asn1c/tests/check-25.c index f2145dab4..78c9fc62e 100644 --- a/asn1c/tests/check-25.c +++ b/asn1c/tests/check-25.c @@ -89,7 +89,7 @@ uint8_t buf1[] = { static void check(int is_ok, uint8_t *buf, int size, size_t consumed) { T_t t, *tp; - ber_dec_rval_t rval; + asn_dec_rval_t rval; tp = memset(&t, 0, sizeof(t)); @@ -173,7 +173,7 @@ try_corrupt(uint8_t *buf, int size, int allow_consume) { static void partial_read(uint8_t *buf, size_t size) { T_t t, *tp; - ber_dec_rval_t rval; + asn_dec_rval_t rval; size_t i1, i2; uint8_t *tbuf1 = alloca(size); uint8_t *tbuf2 = alloca(size); diff --git a/asn1c/tests/check-30.c b/asn1c/tests/check-30.c index 6c3acb6bb..e013b385c 100644 --- a/asn1c/tests/check-30.c +++ b/asn1c/tests/check-30.c @@ -144,7 +144,7 @@ uint8_t buf5[] = { static void check(int is_ok, uint8_t *buf, int size, size_t consumed) { T_t t, *tp; - ber_dec_rval_t rval; + asn_dec_rval_t rval; fprintf(stderr, "\nMust %s:\n", is_ok?"suceed":"fail"); @@ -195,7 +195,7 @@ xer_cb(const void *buffer, size_t size, void *key) { static void check_xer(uint8_t *buf, uint8_t size, char *xer_sample) { T_t *tp = 0; - ber_dec_rval_t rval; + asn_dec_rval_t rval; asn_enc_rval_t er; int xer_sample_len = strlen(xer_sample); diff --git a/asn1c/tests/check-31.c b/asn1c/tests/check-31.c index 3bdf4e636..53ccf5ab0 100644 --- a/asn1c/tests/check-31.c +++ b/asn1c/tests/check-31.c @@ -96,7 +96,7 @@ static int bytes_compare(const void *bufferp, size_t size, void *key) { static void check(int is_ok, uint8_t *buf, int size, size_t consumed) { Forest_t t, *tp; - ber_dec_rval_t rval; + asn_dec_rval_t rval; tp = memset(&t, 0, sizeof(t)); @@ -156,7 +156,7 @@ xer_cb(const void *buffer, size_t size, void *key) { static void check_xer(uint8_t *buf, uint8_t size, char *xer_sample) { Forest_t *tp = 0; - ber_dec_rval_t rval; + asn_dec_rval_t rval; asn_enc_rval_t er; int xer_sample_len = strlen(xer_sample); diff --git a/asn1c/tests/check-35.c b/asn1c/tests/check-35.c index 7e2ffa597..6ff4f9938 100644 --- a/asn1c/tests/check-35.c +++ b/asn1c/tests/check-35.c @@ -124,7 +124,7 @@ uint8_t buf2_reconstr[] = { static void check(T_t *tp, uint8_t *buf, int size, size_t consumed) { - ber_dec_rval_t rval; + asn_dec_rval_t rval; tp = memset(tp, 0, sizeof(*tp)); @@ -200,7 +200,7 @@ compare(T_t *tp, uint8_t *cmp_buf, int cmp_buf_size) { static void partial_read(uint8_t *buf, size_t size) { T_t t, *tp; - ber_dec_rval_t rval; + asn_dec_rval_t rval; size_t i1, i2; uint8_t *buf1 = alloca(size); uint8_t *buf2 = alloca(size); @@ -285,7 +285,7 @@ xer_cb(const void *buffer, size_t size, void *key) { static void check_xer(uint8_t *buf, uint8_t size, char *xer_sample) { T_t *tp = 0; - ber_dec_rval_t rval; + asn_dec_rval_t rval; asn_enc_rval_t er; int xer_sample_len = strlen(xer_sample); diff --git a/asn1c/tests/check-41.c b/asn1c/tests/check-41.c index be623fc91..217175816 100644 --- a/asn1c/tests/check-41.c +++ b/asn1c/tests/check-41.c @@ -131,7 +131,7 @@ uint8_t buf2_reconstr[] = { static void check(T_t *tp, uint8_t *buf, int size, size_t consumed) { - ber_dec_rval_t rval; + asn_dec_rval_t rval; int ret; tp = memset(tp, 0, sizeof(*tp)); @@ -216,7 +216,7 @@ compare(T_t *tp, uint8_t *cmp_buf, int cmp_buf_size) { static void partial_read(uint8_t *buf, size_t size) { T_t t, *tp; - ber_dec_rval_t rval; + asn_dec_rval_t rval; size_t i1, i2; uint8_t *buf1 = alloca(size); uint8_t *buf2 = alloca(size); diff --git a/asn1c/tests/check-44.c b/asn1c/tests/check-44.c index 3a175b3b9..21b1105a8 100644 --- a/asn1c/tests/check-44.c +++ b/asn1c/tests/check-44.c @@ -30,7 +30,7 @@ uint8_t buf2[] = { static void check(int is_ok, uint8_t *buf, int size, size_t consumed) { T_t t, *tp; - ber_dec_rval_t rval; + asn_dec_rval_t rval; tp = memset(&t, 0, sizeof(t)); diff --git a/asn1c/tests/check-46.c b/asn1c/tests/check-46.c index 4e8c33bb5..922ba5f1f 100644 --- a/asn1c/tests/check-46.c +++ b/asn1c/tests/check-46.c @@ -20,7 +20,7 @@ uint8_t buf1[] = { static void check(uint8_t *buf, int size, size_t consumed) { T_t t, *tp; - ber_dec_rval_t rval; + asn_dec_rval_t rval; tp = memset(&t, 0, sizeof(t)); diff --git a/asn1c/tests/check-48.c b/asn1c/tests/check-48.c index 71dd8b211..510a259ea 100644 --- a/asn1c/tests/check-48.c +++ b/asn1c/tests/check-48.c @@ -56,7 +56,7 @@ save_object(void *bs, asn_TYPE_descriptor_t *td) { static int load_object(void *bs, asn_TYPE_descriptor_t *td) { - ber_dec_rval_t rval; + asn_dec_rval_t rval; fprintf(stderr, "\nLOADING OBJECT OF SIZE %d\n", buf_offset); diff --git a/asn1c/tests/check-62.c b/asn1c/tests/check-62.c index dd19013fe..0694df8f1 100644 --- a/asn1c/tests/check-62.c +++ b/asn1c/tests/check-62.c @@ -58,7 +58,7 @@ save_object(T_t *st) { static T_t * load_object(enum expectation expectation, char *fbuf, int size) { - ber_dec_rval_t rval; + asn_dec_rval_t rval; T_t *st = 0; int csize; diff --git a/asn1c/tests/check-65.c b/asn1c/tests/check-65.c index 76295a7ce..22bf8a51c 100644 --- a/asn1c/tests/check-65.c +++ b/asn1c/tests/check-65.c @@ -54,7 +54,7 @@ uint8_t buf2[] = { static void check_1(int is_ok, uint8_t *buf, int size, size_t consumed) { asn_TYPE_descriptor_t *td = &asn_DEF_T1; - ber_dec_rval_t rval; + asn_dec_rval_t rval; T1_t t, *tp; tp = memset(&t, 0, sizeof(t)); @@ -77,7 +77,7 @@ check_1(int is_ok, uint8_t *buf, int size, size_t consumed) { static void check_2(int is_ok, uint8_t *buf, int size, size_t consumed) { asn_TYPE_descriptor_t *td = &asn_DEF_T; - ber_dec_rval_t rval; + asn_dec_rval_t rval; T_t t, *tp; tp = memset(&t, 0, sizeof(t)); From 399983b23e10fbd79ef5fe0f5304acc8afadbb1c Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 20 Oct 2004 15:48:09 +0000 Subject: [PATCH 0508/1469] just not tested git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@508 59561ff5-6e30-0410-9f3c-9617f08c8826 --- BUGS | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/BUGS b/BUGS index 2023fcffe..b921955a3 100644 --- a/BUGS +++ b/BUGS @@ -27,8 +27,5 @@ length, and encode its substructure member using indefinite length. The BER decoder is perfectly capable of decoding such sequences. 5. Encoding or decoding of structures with combined length greater than 16MB -is not tested. There are some size determination bugs lurking in the produced -code, which may cause integer overflow in certain edge cases. This restriction -should not cause a problem in the real world, as higher level protocol typically -have similar or tighter restrictions on the supported PDU size. +is not tested. From af2155e96f401576af8463179775dcdfaf706f49 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 20 Oct 2004 15:48:55 +0000 Subject: [PATCH 0509/1469] ber_dec -> asn_dec git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@509 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-usage.html | 4 ++-- doc/asn1c-usage.lyx | 8 ++++---- doc/asn1c-usage.pdf | Bin 108373 -> 108312 bytes 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/asn1c-usage.html b/doc/asn1c-usage.html index e9096bfc3..fd0fa9265 100644 --- a/doc/asn1c-usage.html +++ b/doc/asn1c-usage.html @@ -903,7 +903,7 @@

    Rectangle_t * simple_deserializer(const void *buffer, size_t buf_size) {     Rectangle_t *rect = 0;    /* Note this 0! */ -    ber_dec_rval_t rval; +    asn_dec_rval_t rval;       rval = asn_DEF_Rectangle->ber_decoder(0,           &asn_DEF_Rectangle, @@ -1022,7 +1022,7 @@


    ... other codes may be defined as well. -Together with the return code (.code) the ber_dec_rval_t type contains +Together with the return code (.code) the asn_dec_rval_t type contains the number of bytes which is consumed from the buffer. In the previous hypothetical example of two buffers (of 100 and 200 bytes), the first call to ber_decode() would return with .code = RC_WMORE and .consumed diff --git a/doc/asn1c-usage.lyx b/doc/asn1c-usage.lyx index c6b377f9c..59859d1dd 100644 --- a/doc/asn1c-usage.lyx +++ b/doc/asn1c-usage.lyx @@ -2087,7 +2087,7 @@ simple_deserializer(const void *buffer, size_t buf_size) { Rectangle_t *rect = 0; /* Note this 0! */ \layout LyX-Code - ber_dec_rval_t rval; + asn_dec_rval_t rval; \layout LyX-Code @@ -2279,7 +2279,7 @@ RC_FAIL: General failure to decode the buffer; other codes may be defined as well. \layout Standard -Together with the return code (.code) the ber_dec_rval_t type contains the +Together with the return code (.code) the asn_dec_rval_t type contains the number of bytes which is consumed from the buffer. In the previous hypothetical example of two buffers (of 100 and 200 bytes), the first call to ber_decode() would return with .code = RC_WMORE and .consumed @@ -2788,11 +2788,11 @@ The OpenSource ASN.1 Compiler. \layout Bibliography \bibitem [Dub00]{Dub00} -Olivier Dubuisson -- +Olivier Dubuisson --- \emph on ASN.1 Communication between heterogeneous systems \emph default - -- Morgan Kaufmann Publishers, 2000. + --- Morgan Kaufmann Publishers, 2000. \begin_inset LatexCommand \htmlurl{http://asn1.elibel.tm.fr/en/book/} diff --git a/doc/asn1c-usage.pdf b/doc/asn1c-usage.pdf index bab14c4451be17afee8fae99e23f561afb6afd8c..79e95272bfa5004f0eb808f9ee249b8f0c5f643c 100644 GIT binary patch delta 13337 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 delta 13405 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 From 93de4c1c80280ce7c5a0ad81fb0d9a34f617739d Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 20 Oct 2004 15:49:29 +0000 Subject: [PATCH 0510/1469] more skeletons git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@510 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.PKIX1/Makefile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index 949021a82..b14f6fe20 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -300,7 +300,8 @@ ASN_MODULE_SOURCES+=constr_SET.c ASN_MODULE_SOURCES+=constr_SET_OF.c ASN_MODULE_HEADERS+=asn_application.h ASN_MODULE_HEADERS+=asn_internal.h -ASN_MODULE_HEADERS+=asn_types.h +ASN_MODULE_HEADERS+=asn_codecs.h +ASN_MODULE_HEADERS+=asn_system.h ASN_MODULE_HEADERS+=OCTET_STRING.h ASN_MODULE_SOURCES+=OCTET_STRING.c ASN_MODULE_HEADERS+=BIT_STRING.h @@ -319,6 +320,10 @@ ASN_MODULE_HEADERS+=constraints.h ASN_MODULE_SOURCES+=constraints.c ASN_MODULE_HEADERS+=der_encoder.h ASN_MODULE_SOURCES+=der_encoder.c +ASN_MODULE_HEADERS+=xer_decoder.h +ASN_MODULE_SOURCES+=xer_decoder.c +ASN_MODULE_HEADERS+=xer_support.h +ASN_MODULE_SOURCES+=xer_support.c ASN_MODULE_HEADERS+=xer_encoder.h ASN_MODULE_SOURCES+=xer_encoder.c From 71abae72b544bf4595583bd9202889809b9c8918 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 20 Oct 2004 15:50:17 +0000 Subject: [PATCH 0511/1469] XER support removed from main targets: already in progress git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@511 59561ff5-6e30-0410-9f3c-9617f08c8826 --- TODO | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/TODO b/TODO index 17784954a..df25560ef 100644 --- a/TODO +++ b/TODO @@ -1,13 +1,9 @@ MAJOR: -1. Support for XER decoding. - Status: The BASIC-XER and CANONICAL-XER are implemented. - The XER decoding is not yet implemented. - -2. Support for PER encoding. Requires advanced subtype constraints support, +1. Support for PER encoding. Requires advanced subtype constraints support, which is already completed. -3. Support for Information Object Classes. +2. Support for Information Object Classes. Status: Support for parsing IOCs is mostly present. Support for slicing the IOCs to produce "views" is not yet designed. From 45ca0980288bc90902fb07a9dc1a1c55f98a517f Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 20 Oct 2004 15:50:23 +0000 Subject: [PATCH 0512/1469] api change git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@512 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/unber.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asn1c/unber.c b/asn1c/unber.c index 2ed9565ca..ecd2a1b0b 100644 --- a/asn1c/unber.c +++ b/asn1c/unber.c @@ -692,5 +692,5 @@ decode_tlv_from_string(const char *datastring) { /* * Dummy functions. */ -ber_dec_rval_t ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_struct_ctx_t *opt_ctx, void *ptr, size_t size, int tag_mode, int last_tag_form, ber_tlv_len_t *last_length, int *opt_tlv_form) { ber_dec_rval_t rv; (void)opt_codec_ctx; (void)td; (void)opt_ctx; (void)ptr; (void)size; (void)tag_mode; (void)last_tag_form; (void)last_length; (void)opt_tlv_form; return rv; } +asn_dec_rval_t ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_struct_ctx_t *opt_ctx, void *ptr, size_t size, int tag_mode, int last_tag_form, ber_tlv_len_t *last_length, int *opt_tlv_form) { asn_dec_rval_t rv; (void)opt_codec_ctx; (void)td; (void)opt_ctx; (void)ptr; (void)size; (void)tag_mode; (void)last_tag_form; (void)last_length; (void)opt_tlv_form; return rv; } ssize_t der_write_tags(asn_TYPE_descriptor_t *td, size_t slen, int tag_mode, int last_tag_form, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { (void)td; (void)slen; (void)tag_mode; (void)last_tag_form; (void)tag; (void)cb; (void)app_key; return -1; } From 9de248e72077ceaf204aacc3341f725e9d2b1bb5 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 20 Oct 2004 15:50:55 +0000 Subject: [PATCH 0513/1469] XER support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@513 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 6 +- skeletons/ANY.c | 5 +- skeletons/BIT_STRING.c | 3 +- skeletons/BMPString.c | 3 +- skeletons/BOOLEAN.c | 5 +- skeletons/ENUMERATED.c | 1 + skeletons/GeneralString.c | 7 +- skeletons/GeneralizedTime.c | 7 +- skeletons/GraphicString.c | 7 +- skeletons/IA5String.c | 9 +- skeletons/INTEGER.c | 1 + skeletons/ISO646String.c | 9 +- skeletons/NULL.c | 1 + skeletons/NativeEnumerated.c | 1 + skeletons/NativeInteger.c | 5 +- skeletons/NativeReal.c | 5 +- skeletons/NumericString.c | 9 +- skeletons/OBJECT_IDENTIFIER.c | 1 + skeletons/OCTET_STRING.c | 457 ++++++++++++++++++++- skeletons/OCTET_STRING.h | 7 +- skeletons/ObjectDescriptor.c | 9 +- skeletons/PrintableString.c | 11 +- skeletons/REAL.c | 1 + skeletons/RELATIVE-OID.c | 1 + skeletons/T61String.c | 7 +- skeletons/TeletexString.c | 7 +- skeletons/UTCTime.c | 5 +- skeletons/UTF8String.c | 7 +- skeletons/UniversalString.c | 3 +- skeletons/VideotexString.c | 7 +- skeletons/VisibleString.c | 9 +- skeletons/asn_SEQUENCE_OF.c | 1 - skeletons/asn_SET_OF.c | 1 - skeletons/asn_application.h | 3 +- skeletons/asn_codecs.h | 76 ++++ skeletons/asn_internal.h | 2 +- skeletons/{asn_types.h => asn_system.h} | 8 +- skeletons/ber_codec_prim.c | 4 +- skeletons/ber_decoder.c | 6 +- skeletons/ber_decoder.h | 27 +- skeletons/constr_CHOICE.c | 4 +- skeletons/constr_CHOICE.h | 2 +- skeletons/constr_SEQUENCE.c | 4 +- skeletons/constr_SEQUENCE_OF.c | 3 +- skeletons/constr_SET.c | 4 +- skeletons/constr_SET_OF.c | 7 +- skeletons/constr_TYPE.h | 68 +-- skeletons/constraints.h | 2 +- skeletons/file-dependencies | 4 +- skeletons/tests/Makefile.am | 4 +- skeletons/tests/Makefile.in | 38 +- skeletons/tests/check-GeneralizedTime.c | 2 +- skeletons/tests/check-OIDs.c | 4 +- skeletons/tests/check-UTCTime.c | 2 +- skeletons/tests/check-UTF8String.c | 2 + skeletons/tests/check-length.c | 4 +- skeletons/xer_decoder.c | 288 +++++++++++++ skeletons/xer_decoder.h | 82 ++++ skeletons/xer_encoder.c | 2 +- skeletons/xer_support.c | 234 +++++++++++ skeletons/xer_support.h | 45 ++ tests/19-param-OK.asn1.-P | 4 + tests/30-set-OK.asn1.-P | 1 + tests/31-set-of-OK.asn1.-P | 7 + tests/32-sequence-of-OK.asn1.-P | 3 + tests/39-sequence-of-OK.asn1.-P | 3 + tests/42-real-life-OK.asn1.-PR | 10 + tests/43-recursion-OK.asn1.-P | 7 + tests/44-choice-in-sequence-OK.asn1.-P | 4 + tests/46-redefine-OK.asn1.-PR | 4 +- tests/47-set-ext-OK.asn1.-P | 4 + tests/50-constraint-OK.asn1.-P | 60 ++- tests/60-any-OK.asn1.-P | 2 + tests/65-multi-tag-OK.asn1.-P | 19 +- tests/65-multi-tag-OK.asn1.-Pfnative-types | 19 +- tests/66-ref-simple-OK.asn1.-P | 4 +- 76 files changed, 1471 insertions(+), 229 deletions(-) create mode 100644 skeletons/asn_codecs.h rename skeletons/{asn_types.h => asn_system.h} (92%) create mode 100644 skeletons/xer_decoder.c create mode 100644 skeletons/xer_decoder.h create mode 100644 skeletons/xer_support.c create mode 100644 skeletons/xer_support.h diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index c91a50ba4..882ed507f 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -944,7 +944,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("\n"); p = MKID(expr->Identifier); - OUT("ber_dec_rval_t\n"); + OUT("asn_dec_rval_t\n"); OUT("%s_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,\n", p); INDENTED( OUT("\tvoid **structure, void *bufptr, size_t size, int tag_mode) {\n"); @@ -1472,6 +1472,9 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { return 0; } +/* + * Generate "asn_DEF_XXX" type definition. + */ static int emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_count, int all_tags_count, int elements_count, enum etd_spec spec) { char *p; @@ -1482,6 +1485,7 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ OUT("asn_TYPE_descriptor_t asn_DEF_%s = {\n", p); INDENT(+1); OUT("\"%s\",\n", expr->_anonymous_type?"":expr->Identifier); + OUT("\"%s\",\n", expr->_anonymous_type?"":expr->Identifier); if(expr->expr_type & ASN_CONSTR_MASK) { p = asn1c_type_name(arg, arg->expr, TNF_SAFE); diff --git a/skeletons/ANY.c b/skeletons/ANY.c index d501ca1a2..4c51963b0 100644 --- a/skeletons/ANY.c +++ b/skeletons/ANY.c @@ -13,13 +13,14 @@ static asn_OCTET_STRING_specifics_t asn_DEF_ANY_specs = { 2 /* Special indicator that this is an ANY type */ }; asn_TYPE_descriptor_t asn_DEF_ANY = { + "ANY", "ANY", OCTET_STRING_free, OCTET_STRING_print, asn_generic_no_constraint, OCTET_STRING_decode_ber, OCTET_STRING_encode_der, - 0, /* Not implemented yet */ + OCTET_STRING_decode_xer_hex, ANY_encode_xer, 0, /* Use generic outmost tag fetcher */ 0, 0, 0, 0, @@ -111,7 +112,7 @@ ANY_new_fromType(asn_TYPE_descriptor_t *td, void *sptr) { int ANY_to_type(ANY_t *st, asn_TYPE_descriptor_t *td, void **struct_ptr) { - ber_dec_rval_t rval; + asn_dec_rval_t rval; void *newst = 0; if(!st || !td || !struct_ptr) { diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index 6c582a048..e21594a51 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -19,12 +19,13 @@ static asn_OCTET_STRING_specifics_t asn_DEF_BIT_STRING_specs = { }; asn_TYPE_descriptor_t asn_DEF_BIT_STRING = { "BIT STRING", + "BIT_STRING", OCTET_STRING_free, /* Implemented in terms of OCTET STRING */ BIT_STRING_print, BIT_STRING_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - 0, /* Not implemented yet */ + OCTET_STRING_decode_xer_binary, BIT_STRING_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_BIT_STRING_tags, diff --git a/skeletons/BMPString.c b/skeletons/BMPString.c index e03d334d0..cca6e3c50 100644 --- a/skeletons/BMPString.c +++ b/skeletons/BMPString.c @@ -13,6 +13,7 @@ static ber_tlv_tag_t asn_DEF_BMPString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn_TYPE_descriptor_t asn_DEF_BMPString = { + "BMPString", "BMPString", OCTET_STRING_free, /* Implemented in terms of OCTET STRING */ BMPString_print, @@ -20,7 +21,7 @@ asn_TYPE_descriptor_t asn_DEF_BMPString = { OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ 0, /* Not implemented yet */ - BMPString_encode_xer, /* Conver to UTF8 */ + BMPString_encode_xer, /* Convert to UTF8 */ 0, /* Use generic outmost tag fetcher */ asn_DEF_BMPString_tags, sizeof(asn_DEF_BMPString_tags) diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c index 43b890f2b..61eb58fff 100644 --- a/skeletons/BOOLEAN.c +++ b/skeletons/BOOLEAN.c @@ -12,6 +12,7 @@ static ber_tlv_tag_t asn_DEF_BOOLEAN_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)) }; asn_TYPE_descriptor_t asn_DEF_BOOLEAN = { + "BOOLEAN", "BOOLEAN", BOOLEAN_free, BOOLEAN_print, @@ -32,13 +33,13 @@ asn_TYPE_descriptor_t asn_DEF_BOOLEAN = { /* * Decode BOOLEAN type. */ -ber_dec_rval_t +asn_dec_rval_t BOOLEAN_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **bool_value, void *buf_ptr, size_t size, int tag_mode) { BOOLEAN_t *st = (BOOLEAN_t *)*bool_value; - ber_dec_rval_t rval; + asn_dec_rval_t rval; ber_tlv_len_t length; ber_tlv_len_t lidx; diff --git a/skeletons/ENUMERATED.c b/skeletons/ENUMERATED.c index 13d7e0583..83a71d070 100644 --- a/skeletons/ENUMERATED.c +++ b/skeletons/ENUMERATED.c @@ -13,6 +13,7 @@ static ber_tlv_tag_t asn_DEF_ENUMERATED_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_ENUMERATED = { + "ENUMERATED", "ENUMERATED", ASN__PRIMITIVE_TYPE_free, INTEGER_print, /* Implemented in terms of INTEGER */ diff --git a/skeletons/GeneralString.c b/skeletons/GeneralString.c index f846c0268..e4ea6f8a5 100644 --- a/skeletons/GeneralString.c +++ b/skeletons/GeneralString.c @@ -13,14 +13,15 @@ static ber_tlv_tag_t asn_DEF_GeneralString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn_TYPE_descriptor_t asn_DEF_GeneralString = { + "GeneralString", "GeneralString", OCTET_STRING_free, OCTET_STRING_print, /* non-ascii string */ asn_generic_unknown_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - 0, /* Not implemented yet */ - OCTET_STRING_encode_xer, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, + OCTET_STRING_decode_xer_hex, + OCTET_STRING_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_GeneralString_tags, sizeof(asn_DEF_GeneralString_tags) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 9d5fe4acd..2a28d7344 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -122,13 +122,14 @@ static ber_tlv_tag_t asn_DEF_GeneralizedTime_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn_TYPE_descriptor_t asn_DEF_GeneralizedTime = { + "GeneralizedTime", "GeneralizedTime", OCTET_STRING_free, GeneralizedTime_print, GeneralizedTime_constraint, /* Check validity of time */ OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ - GeneralizedTime_encode_der, /* Implemented in terms of OCTET STRING */ - 0, /* Not implemented yet */ + GeneralizedTime_encode_der, + OCTET_STRING_decode_xer_utf8, GeneralizedTime_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_GeneralizedTime_tags, @@ -231,7 +232,7 @@ GeneralizedTime_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, sptr = &st; } - return OCTET_STRING_encode_xer_ascii(td, sptr, ilevel, flags, + return OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags, cb, app_key); } diff --git a/skeletons/GraphicString.c b/skeletons/GraphicString.c index 67442fc1c..c5d4a30b0 100644 --- a/skeletons/GraphicString.c +++ b/skeletons/GraphicString.c @@ -13,14 +13,15 @@ static ber_tlv_tag_t asn_DEF_GraphicString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn_TYPE_descriptor_t asn_DEF_GraphicString = { + "GraphicString", "GraphicString", OCTET_STRING_free, OCTET_STRING_print, /* non-ascii string */ asn_generic_unknown_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - 0, /* Not implemented yet */ - OCTET_STRING_encode_xer, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, + OCTET_STRING_decode_xer_hex, + OCTET_STRING_encode_xer, /* Can't expect it to be ASCII/UTF8 */ 0, /* Use generic outmost tag fetcher */ asn_DEF_GraphicString_tags, sizeof(asn_DEF_GraphicString_tags) diff --git a/skeletons/IA5String.c b/skeletons/IA5String.c index 42eb17c4a..32a7a7f82 100644 --- a/skeletons/IA5String.c +++ b/skeletons/IA5String.c @@ -13,14 +13,15 @@ static ber_tlv_tag_t asn_DEF_IA5String_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn_TYPE_descriptor_t asn_DEF_IA5String = { + "IA5String", "IA5String", OCTET_STRING_free, - OCTET_STRING_print_ascii, /* ASCII subset */ + OCTET_STRING_print_utf8, /* ASCII subset */ IA5String_constraint, /* Constraint on the alphabet */ OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - 0, /* Not implemented yet */ - OCTET_STRING_encode_xer_ascii,/* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, + OCTET_STRING_decode_xer_utf8, + OCTET_STRING_encode_xer_utf8, 0, /* Use generic outmost tag fetcher */ asn_DEF_IA5String_tags, sizeof(asn_DEF_IA5String_tags) diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index f485bacbc..fbd927243 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -15,6 +15,7 @@ static ber_tlv_tag_t asn_DEF_INTEGER_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_INTEGER = { + "INTEGER", "INTEGER", ASN__PRIMITIVE_TYPE_free, INTEGER_print, diff --git a/skeletons/ISO646String.c b/skeletons/ISO646String.c index 751139d8b..035734b56 100644 --- a/skeletons/ISO646String.c +++ b/skeletons/ISO646String.c @@ -13,14 +13,15 @@ static ber_tlv_tag_t asn_DEF_ISO646String_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn_TYPE_descriptor_t asn_DEF_ISO646String = { + "ISO646String", "ISO646String", OCTET_STRING_free, - OCTET_STRING_print_ascii, /* ASCII subset */ + OCTET_STRING_print_utf8, /* ASCII subset */ VisibleString_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - 0, /* Not implemented yet */ - OCTET_STRING_encode_xer_ascii,/* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, + OCTET_STRING_decode_xer_utf8, + OCTET_STRING_encode_xer_utf8, 0, /* Use generic outmost tag fetcher */ asn_DEF_ISO646String_tags, sizeof(asn_DEF_ISO646String_tags) diff --git a/skeletons/NULL.c b/skeletons/NULL.c index 7375d0fb0..3b41be2f3 100644 --- a/skeletons/NULL.c +++ b/skeletons/NULL.c @@ -13,6 +13,7 @@ static ber_tlv_tag_t asn_DEF_NULL_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NULL = { + "NULL", "NULL", BOOLEAN_free, NULL_print, diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c index 19c7559bf..191afb77d 100644 --- a/skeletons/NativeEnumerated.c +++ b/skeletons/NativeEnumerated.c @@ -20,6 +20,7 @@ static ber_tlv_tag_t asn_DEF_NativeEnumerated_tags[] = { }; asn_TYPE_descriptor_t asn_DEF_NativeEnumerated = { "ENUMERATED", /* The ASN.1 type is still ENUMERATED */ + "ENUMERATED", NativeInteger_free, NativeInteger_print, asn_generic_no_constraint, diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index ae71c044c..695b96316 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -22,6 +22,7 @@ static ber_tlv_tag_t asn_DEF_NativeInteger_tags[] = { }; asn_TYPE_descriptor_t asn_DEF_NativeInteger = { "INTEGER", /* The ASN.1 type is still INTEGER */ + "INTEGER", NativeInteger_free, NativeInteger_print, asn_generic_no_constraint, @@ -41,12 +42,12 @@ asn_TYPE_descriptor_t asn_DEF_NativeInteger = { /* * Decode INTEGER type. */ -ber_dec_rval_t +asn_dec_rval_t NativeInteger_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **int_ptr, void *buf_ptr, size_t size, int tag_mode) { int *Int = (int *)*int_ptr; - ber_dec_rval_t rval; + asn_dec_rval_t rval; ber_tlv_len_t length; /* diff --git a/skeletons/NativeReal.c b/skeletons/NativeReal.c index 83b1676e1..b8a4926df 100644 --- a/skeletons/NativeReal.c +++ b/skeletons/NativeReal.c @@ -22,6 +22,7 @@ static ber_tlv_tag_t asn_DEF_NativeReal_tags[] = { }; asn_TYPE_descriptor_t asn_DEF_NativeReal = { "REAL", /* The ASN.1 type is still REAL */ + "REAL", NativeReal_free, NativeReal_print, asn_generic_no_constraint, @@ -41,12 +42,12 @@ asn_TYPE_descriptor_t asn_DEF_NativeReal = { /* * Decode REAL type. */ -ber_dec_rval_t +asn_dec_rval_t NativeReal_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **dbl_ptr, void *buf_ptr, size_t size, int tag_mode) { double *Dbl = (double *)*dbl_ptr; - ber_dec_rval_t rval; + asn_dec_rval_t rval; ber_tlv_len_t length; /* diff --git a/skeletons/NumericString.c b/skeletons/NumericString.c index 7d471985c..dbff6e21f 100644 --- a/skeletons/NumericString.c +++ b/skeletons/NumericString.c @@ -13,14 +13,15 @@ static ber_tlv_tag_t asn_DEF_NumericString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn_TYPE_descriptor_t asn_DEF_NumericString = { + "NumericString", "NumericString", OCTET_STRING_free, - OCTET_STRING_print_ascii, /* ASCII subset */ + OCTET_STRING_print_utf8, /* ASCII subset */ NumericString_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - 0, /* Not implemented yet */ - OCTET_STRING_encode_xer_ascii,/* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, + OCTET_STRING_decode_xer_utf8, + OCTET_STRING_encode_xer_utf8, 0, /* Use generic outmost tag fetcher */ asn_DEF_NumericString_tags, sizeof(asn_DEF_NumericString_tags) diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index db2fd7a39..a08f18a95 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -16,6 +16,7 @@ static ber_tlv_tag_t asn_DEF_OBJECT_IDENTIFIER_tags[] = { }; asn_TYPE_descriptor_t asn_DEF_OBJECT_IDENTIFIER = { "OBJECT IDENTIFIER", + "OBJECT_IDENTIFIER", ASN__PRIMITIVE_TYPE_free, OBJECT_IDENTIFIER_print, OBJECT_IDENTIFIER_constraint, diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 66f3a4ba9..16d3a8958 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -20,13 +20,14 @@ static asn_OCTET_STRING_specifics_t asn_DEF_OCTET_STRING_specs = { 0 }; asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { - "OCTET STRING", + "OCTET STRING", /* Canonical name */ + "OCTET_STRING", /* XML tag name */ OCTET_STRING_free, OCTET_STRING_print, /* non-ascii stuff, generally */ asn_generic_no_constraint, OCTET_STRING_decode_ber, OCTET_STRING_encode_der, - 0, /* Not implemented yet */ + OCTET_STRING_decode_xer_hex, OCTET_STRING_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_OCTET_STRING_tags, @@ -160,14 +161,15 @@ _new_stack() { /* * Decode OCTET STRING type. */ -ber_dec_rval_t +asn_dec_rval_t OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **os_structure, void *buf_ptr, size_t size, int tag_mode) { asn_OCTET_STRING_specifics_t *specs = td->specifics - ? td->specifics : &asn_DEF_OCTET_STRING_specs; + ? (asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_DEF_OCTET_STRING_specs; BIT_STRING_t *st = (BIT_STRING_t *)*os_structure; - ber_dec_rval_t rval; + asn_dec_rval_t rval; asn_struct_ctx_t *ctx; ssize_t consumed_myself = 0; struct _stack *stck; /* Expectations stack structure */ @@ -511,7 +513,8 @@ OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *sptr, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t er; asn_OCTET_STRING_specifics_t *specs = td->specifics - ? td->specifics : &asn_DEF_OCTET_STRING_specs; + ? (asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_DEF_OCTET_STRING_specs; BIT_STRING_t *st = (BIT_STRING_t *)sptr; OS_type_e type_variant = (OS_type_e)specs->subvariant; int fix_last_byte = 0; @@ -683,8 +686,48 @@ static struct OCTET_STRING__xer_escape_table_s { OSXET("\046\147\164\073"), /* > */ }; +static int +OS__check_escaped_control_char(void *buf, int size) { + size_t i; + /* + * Inefficient algorithm which translates the escape sequences + * defined above into characters. Returns -1 if not found. + * TODO: replace by a faster algorithm (bsearch(), hash or + * nested table lookups). + */ + for(i = 0; i < 32 /* Don't spend time on the bottom half */; i++) { + struct OCTET_STRING__xer_escape_table_s *el; + el = &OCTET_STRING__xer_escape_table[i]; + if(el->size == size && memcmp(buf, el->string, size) == 0) + return i; + } + return -1; +} + +static int +OCTET_STRING__handle_control_chars(void *struct_ptr, void *chunk_buf, size_t chunk_size) { + /* + * This might be one of the escape sequences + * for control characters. Check it out. + * #11.15.5 + */ + int control_char = OS__check_escaped_control_char(chunk_buf,chunk_size); + if(control_char >= 0) { + OCTET_STRING_t *st = (OCTET_STRING_t *)struct_ptr; + void *p = REALLOC(st->buf, st->size + 2); + if(p) { + st->buf = (uint8_t *)p; + st->buf[st->size++] = control_char; + st->buf[st->size] = '\0'; /* nul-termination */ + return 0; + } + } + + return -1; /* No, it's not */ +} + asn_enc_rval_t -OCTET_STRING_encode_xer_ascii(asn_TYPE_descriptor_t *td, void *sptr, +OCTET_STRING_encode_xer_utf8(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; @@ -728,6 +771,396 @@ OCTET_STRING_encode_xer_ascii(asn_TYPE_descriptor_t *td, void *sptr, return er; } +/* + * Convert from hexadecimal format (cstring): "AB CD EF" + */ +static ssize_t OCTET_STRING__convert_hexadecimal(void *sptr, void *chunk_buf, size_t chunk_size, int have_more) { + OCTET_STRING_t *st = (OCTET_STRING_t *)sptr; + char *chunk_stop = (char *)chunk_buf; + char *p = chunk_stop; + char *pend = p + chunk_size; + unsigned int clv = 0; + int half = 0; /* Half bit */ + uint8_t *buf; + + /* Reallocate buffer according to high cap estimation */ + ssize_t _ns = st->size + (chunk_size + 1) / 2; + void *nptr = REALLOC(st->buf, _ns + 1); + if(!nptr) return -1; + st->buf = (uint8_t *)nptr; + buf = st->buf + st->size; + + /* + * If something like " a b c " appears here, the " a b":3 will be + * converted, and the rest skipped. That is, unless buf_size is greater + * than chunk_size, then it'll be equivalent to "ABC0". + */ + for(; p < pend; p++) { + int ch = *(unsigned char *)p; + switch(ch) { + case 0x09: case 0x0a: case 0x0c: case 0x0d: + case 0x20: + /* Ignore whitespace */ + continue; + case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: /*01234*/ + case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: /*56789*/ + clv = (clv << 4) + (ch - 0x30); + break; + case 0x41: case 0x42: case 0x43: /* ABC */ + case 0x44: case 0x45: case 0x46: /* DEF */ + clv = (clv << 4) + (ch - (0x41 + 10)); + break; + case 0x61: case 0x62: case 0x63: /* abc */ + case 0x64: case 0x65: case 0x66: /* def */ + clv = (clv << 4) + (ch - (0x61 + 10)); + break; + default: + *buf = 0; /* JIC */ + return -1; + } + if(half++) { + half = 0; + *buf++ = clv; + chunk_stop = p + 1; + } + } + + /* + * Check partial decoding. + */ + if(half) { + if(have_more) { + /* + * Partial specification is fine, + * because no more more PXER_TEXT data is available. + */ + *buf++ = clv << 4; + chunk_stop = p; + } + } else { + chunk_stop = p; + } + + st->size = buf - st->buf; /* Adjust the buffer size */ + assert(st->size <= _ns); + st->buf[st->size] = 0; /* Courtesy termination */ + + return (chunk_stop - (char *)chunk_buf); /* Converted size */ +} + +/* + * Convert from binary format: "00101011101" + */ +static ssize_t OCTET_STRING__convert_binary(void *sptr, void *chunk_buf, size_t chunk_size, int have_more) { + BIT_STRING_t *st = (BIT_STRING_t *)sptr; + char *p = (char *)chunk_buf; + char *pend = p + chunk_size; + int bits_unused = st->bits_unused & 0x7; + uint8_t *buf; + + /* Reallocate buffer according to high cap estimation */ + ssize_t _ns = st->size + (chunk_size + 7) / 8; + void *nptr = REALLOC(st->buf, _ns + 1); + if(!nptr) return -1; + st->buf = (uint8_t *)nptr; + buf = st->buf + st->size; + + (void)have_more; + + if(bits_unused == 0) + bits_unused = 8; + else if(st->size) + buf--; + + /* + * Convert series of 0 and 1 into the octet string. + */ + for(; p < pend; p++) { + int ch = *(unsigned char *)p; + switch(ch) { + case 0x09: case 0x0a: case 0x0c: case 0x0d: + case 0x20: + /* Ignore whitespace */ + break; + case 0x30: + case 0x31: + if(bits_unused-- <= 0) { + *++buf = 0; /* Clean the cell */ + bits_unused = 7; + } + *buf |= (ch&1) << bits_unused; + break; + default: + st->bits_unused = bits_unused; + return -1; + } + } + + if(bits_unused == 8) { + st->size = buf - st->buf; + st->bits_unused = 0; + } else { + st->size = buf - st->buf + 1; + st->bits_unused = bits_unused; + } + + assert(st->size <= _ns); + st->buf[st->size] = 0; /* Courtesy termination */ + + return chunk_size; /* Converted in full */ +} + +/* + * Something like strtod(), but with stricter rules. + */ +static int +OS__strtoent(int base, char *buf, char *end, long *return_value) { + long val = 0; + char *p; + + for(p = buf; p < end; p++) { + int ch = *p; + if((val * base + base) < 0) return -1; /* Strange huge value */ + switch(ch) { + case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: /*01234*/ + case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: /*56789*/ + val = val * base + (ch - 0x30); + break; + case 0x41: case 0x42: case 0x43: /* ABC */ + case 0x44: case 0x45: case 0x46: /* DEF */ + val = val * base + (ch - (0x41 + 10)); + break; + case 0x61: case 0x62: case 0x63: /* abc */ + case 0x64: case 0x65: case 0x66: /* def */ + val = val * base + (ch - (0x61 + 10)); + break; + case 0x3b: /* ';' */ + *return_value = val; + return (p - buf) + 1; + default: + return -1; /* Character set error */ + } + } + + /* Do not return value. It's an error we're talking about here. */ + return (p - buf); +} + +/* + * Convert from the plain UTF-8 format, expanding entity references: "2 < 3" + */ +static ssize_t OCTET_STRING__convert_entrefs(void *sptr, void *chunk_buf, size_t chunk_size, int have_more) { + OCTET_STRING_t *st = (OCTET_STRING_t *)sptr; + char *p = (char *)chunk_buf; + char *pend = p + chunk_size; + uint8_t *buf; + + /* Reallocate buffer */ + ssize_t _ns = st->size + chunk_size; + void *nptr = REALLOC(st->buf, _ns + 1); + if(!nptr) return -1; + st->buf = (uint8_t *)nptr; + buf = st->buf + st->size; + + /* + * Convert series of 0 and 1 into the octet string. + */ + for(; p < pend; p++) { + int ch = *(unsigned char *)p; + int len; /* Length of the rest of the chunk */ + + if(ch != 0x26 /* '&' */) { + *buf++ = ch; + continue; /* That was easy... */ + } + + /* + * Process entity reference. + */ + len = chunk_size - (p - (char *)chunk_buf); + if(len == 1 /* "&" */) goto want_more; + if(p[1] == 0x23 /* '#' */) { + char *pval; /* Pointer to start of digits */ + long val; /* Entity reference value */ + int base; + + if(len == 2 /* "&#" */) goto want_more; + if(p[2] == 0x78 /* 'x' */) + pval = p + 3, base = 16; + else + pval = p + 2, base = 10; + len = OS__strtoent(base, pval, p + len, &val); + if(len == -1) { + /* Invalid charset. Just copy verbatim. */ + *buf++ = ch; + continue; + } + if(!len || pval[len-1] != 0x3b) goto want_more; + assert(val > 0); + p += (pval - p) + len - 1; /* Advance past entref */ + + if(val < 0x80) { + *buf++ = (char)val; + } else if(val < 0x800) { + *buf++ = 0xc0 | ((val >> 6)); + *buf++ = 0x80 | ((val & 0x3f)); + } else if(val < 0x10000) { + *buf++ = 0xe0 | ((val >> 12)); + *buf++ = 0x80 | ((val >> 6) & 0x3f); + *buf++ = 0x80 | ((val & 0x3f)); + } else if(val < 0x200000) { + *buf++ = 0xf0 | ((val >> 18)); + *buf++ = 0x80 | ((val >> 12) & 0x3f); + *buf++ = 0x80 | ((val >> 6) & 0x3f); + *buf++ = 0x80 | ((val & 0x3f)); + } else if(val < 0x4000000) { + *buf++ = 0xf8 | ((val >> 24)); + *buf++ = 0x80 | ((val >> 18) & 0x3f); + *buf++ = 0x80 | ((val >> 12) & 0x3f); + *buf++ = 0x80 | ((val >> 6) & 0x3f); + *buf++ = 0x80 | ((val & 0x3f)); + } else { + *buf++ = 0xfc | ((val >> 30) & 0x1); + *buf++ = 0x80 | ((val >> 24) & 0x3f); + *buf++ = 0x80 | ((val >> 18) & 0x3f); + *buf++ = 0x80 | ((val >> 12) & 0x3f); + *buf++ = 0x80 | ((val >> 6) & 0x3f); + *buf++ = 0x80 | ((val & 0x3f)); + } + } else { + /* + * Ugly, limited parsing of & > < + */ + char *sc = (char *)memchr(p, 0x3b, len > 5 ? 5 : len); + if(!sc) goto want_more; + if((sc - p) == 4 + && p[1] == 0x61 /* 'a' */ + && p[2] == 0x6d /* 'm' */ + && p[3] == 0x70 /* 'p' */) { + *buf++ = 0x26; + p = sc; + continue; + } + if((sc - p) == 3) { + if(p[1] == 0x6c) { + *buf = 0x3c; /* '<' */ + } else if(p[1] == 0x67) { + *buf = 0x3e; /* '>' */ + } else { + /* Unsupported entity reference */ + *buf++ = ch; + continue; + } + if(p[2] != 0x74) { + /* Unsupported entity reference */ + *buf++ = ch; + continue; + } + buf++; + p = sc; + continue; + } + /* Unsupported entity reference */ + *buf++ = ch; + } + + continue; + want_more: + if(have_more) { + /* + * We know that no more data (of the same type) + * is coming. Copy the rest verbatim. + */ + *buf++ = ch; + continue; + } + *buf = 0; /* JIC */ + /* Processing stalled: need more data */ + return (p - (char *)chunk_buf); + } + + st->size = buf - st->buf; + assert(st->size <= _ns); + st->buf[st->size] = 0; /* Courtesy termination */ + + return chunk_size; /* Converted in full */ +} + +/* + * Decode OCTET STRING from the XML element's body. + */ +static asn_dec_rval_t +OCTET_STRING__decode_xer(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, + const char *opt_mname, void *buf_ptr, size_t size, + int (*opt_unexpected_tag_decoder) + (void *struct_ptr, void *chunk_buf, size_t chunk_size), + ssize_t (*body_receiver) + (void *struct_ptr, void *chunk_buf, size_t chunk_size, + int have_more) +) { + asn_OCTET_STRING_specifics_t *specs = td->specifics + ? (asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_DEF_OCTET_STRING_specs; + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + asn_struct_ctx_t *ctx; /* Per-structure parser context */ + + /* + * Create the string if does not exist. + */ + if(!*sptr) { + *sptr = CALLOC(1, specs->struct_size); + if(*sptr == NULL) { + asn_dec_rval_t rval; + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + } + + /* Restore parsing context */ + ctx = (asn_struct_ctx_t *)(((char *)*sptr) + specs->ctx_offset); + + return xer_decode_general(opt_codec_ctx, ctx, *sptr, xml_tag, + buf_ptr, size, opt_unexpected_tag_decoder, body_receiver); +} + +/* + * Decode OCTET STRING from the hexadecimal data. + */ +asn_dec_rval_t +OCTET_STRING_decode_xer_hex(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, + const char *opt_mname, void *buf_ptr, size_t size) { + return OCTET_STRING__decode_xer(opt_codec_ctx, td, sptr, opt_mname, + buf_ptr, size, 0, OCTET_STRING__convert_hexadecimal); +} + +/* + * Decode OCTET STRING from the binary (0/1) data. + */ +asn_dec_rval_t +OCTET_STRING_decode_xer_binary(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, + const char *opt_mname, void *buf_ptr, size_t size) { + return OCTET_STRING__decode_xer(opt_codec_ctx, td, sptr, opt_mname, + buf_ptr, size, 0, OCTET_STRING__convert_binary); +} + +/* + * Decode OCTET STRING from the string (ASCII/UTF-8) data. + */ +asn_dec_rval_t +OCTET_STRING_decode_xer_utf8(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, + const char *opt_mname, void *buf_ptr, size_t size) { + return OCTET_STRING__decode_xer(opt_codec_ctx, td, sptr, opt_mname, + buf_ptr, size, + OCTET_STRING__handle_control_chars, + OCTET_STRING__convert_entrefs); +} + + int OCTET_STRING_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { @@ -770,7 +1203,7 @@ OCTET_STRING_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, } int -OCTET_STRING_print_ascii(asn_TYPE_descriptor_t *td, const void *sptr, +OCTET_STRING_print_utf8(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; @@ -788,10 +1221,11 @@ void OCTET_STRING_free(asn_TYPE_descriptor_t *td, void *sptr, int contents_only) { OCTET_STRING_t *st = (OCTET_STRING_t *)sptr; asn_OCTET_STRING_specifics_t *specs = td->specifics - ? td->specifics : &asn_DEF_OCTET_STRING_specs; + ? (asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_DEF_OCTET_STRING_specs; asn_struct_ctx_t *ctx = (asn_struct_ctx_t *) ((char *)st + specs->ctx_offset); - struct _stack *stck = ctx->ptr; + struct _stack *stck = (struct _stack *)ctx->ptr; if(!td || !st) return; @@ -863,7 +1297,8 @@ OCTET_STRING_fromBuf(OCTET_STRING_t *st, const char *str, int len) { OCTET_STRING_t * OCTET_STRING_new_fromBuf(asn_TYPE_descriptor_t *td, const char *str, int len) { asn_OCTET_STRING_specifics_t *specs = td->specifics - ? td->specifics : &asn_DEF_OCTET_STRING_specs; + ? (asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_DEF_OCTET_STRING_specs; OCTET_STRING_t *st; st = (OCTET_STRING_t *)CALLOC(1, specs->struct_size); diff --git a/skeletons/OCTET_STRING.h b/skeletons/OCTET_STRING.h index dd5262e83..10816358e 100644 --- a/skeletons/OCTET_STRING.h +++ b/skeletons/OCTET_STRING.h @@ -18,11 +18,14 @@ extern asn_TYPE_descriptor_t asn_DEF_OCTET_STRING; asn_struct_free_f OCTET_STRING_free; asn_struct_print_f OCTET_STRING_print; -asn_struct_print_f OCTET_STRING_print_ascii; +asn_struct_print_f OCTET_STRING_print_utf8; ber_type_decoder_f OCTET_STRING_decode_ber; der_type_encoder_f OCTET_STRING_encode_der; +xer_type_decoder_f OCTET_STRING_decode_xer_hex; /* Hexadecimal */ +xer_type_decoder_f OCTET_STRING_decode_xer_binary; /* 01010111010 */ +xer_type_decoder_f OCTET_STRING_decode_xer_utf8; /* ASCII/UTF-8 */ xer_type_encoder_f OCTET_STRING_encode_xer; -xer_type_encoder_f OCTET_STRING_encode_xer_ascii; +xer_type_encoder_f OCTET_STRING_encode_xer_utf8; /****************************** * Handy conversion routines. * diff --git a/skeletons/ObjectDescriptor.c b/skeletons/ObjectDescriptor.c index 125e69599..9f52147e0 100644 --- a/skeletons/ObjectDescriptor.c +++ b/skeletons/ObjectDescriptor.c @@ -13,14 +13,15 @@ static ber_tlv_tag_t asn_DEF_ObjectDescriptor_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn_TYPE_descriptor_t asn_DEF_ObjectDescriptor = { + "ObjectDescriptor", "ObjectDescriptor", OCTET_STRING_free, - OCTET_STRING_print_ascii, /* Treat as ASCII subset (it's not) */ + OCTET_STRING_print_utf8, /* Treat as ASCII subset (it's not) */ asn_generic_unknown_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - 0, /* Not implemented yet */ - OCTET_STRING_encode_xer_ascii,/* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, + OCTET_STRING_decode_xer_utf8, + OCTET_STRING_encode_xer_utf8, 0, /* Use generic outmost tag fetcher */ asn_DEF_ObjectDescriptor_tags, sizeof(asn_DEF_ObjectDescriptor_tags) diff --git a/skeletons/PrintableString.c b/skeletons/PrintableString.c index dfe4f9c97..dc363d846 100644 --- a/skeletons/PrintableString.c +++ b/skeletons/PrintableString.c @@ -13,14 +13,15 @@ static ber_tlv_tag_t asn_DEF_PrintableString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn_TYPE_descriptor_t asn_DEF_PrintableString = { + "PrintableString", "PrintableString", OCTET_STRING_free, - OCTET_STRING_print_ascii, /* ASCII subset */ + OCTET_STRING_print_utf8, /* ASCII subset */ PrintableString_constraint, - OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - 0, /* Not implemented yet */ - OCTET_STRING_encode_xer_ascii,/* Implemented in terms of OCTET STRING */ + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, + OCTET_STRING_decode_xer_utf8, + OCTET_STRING_encode_xer_utf8, 0, /* Use generic outmost tag fetcher */ asn_DEF_PrintableString_tags, sizeof(asn_DEF_PrintableString_tags) diff --git a/skeletons/REAL.c b/skeletons/REAL.c index d395c8487..c61f72332 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -24,6 +24,7 @@ static ber_tlv_tag_t asn_DEF_REAL_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; asn_TYPE_descriptor_t asn_DEF_REAL = { + "REAL", "REAL", ASN__PRIMITIVE_TYPE_free, REAL_print, diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index 899e69c6e..eba1eaa40 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -17,6 +17,7 @@ static ber_tlv_tag_t asn_DEF_RELATIVE_OID_tags[] = { }; asn_TYPE_descriptor_t asn_DEF_RELATIVE_OID = { "RELATIVE-OID", + "RELATIVE_OID", ASN__PRIMITIVE_TYPE_free, RELATIVE_OID_print, asn_generic_no_constraint, diff --git a/skeletons/T61String.c b/skeletons/T61String.c index 41835c4b5..a37c176ed 100644 --- a/skeletons/T61String.c +++ b/skeletons/T61String.c @@ -13,14 +13,15 @@ static ber_tlv_tag_t asn_DEF_T61String_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn_TYPE_descriptor_t asn_DEF_T61String = { + "T61String", "T61String", OCTET_STRING_free, OCTET_STRING_print, /* non-ascii string */ asn_generic_unknown_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - 0, /* Not implemented yet */ - OCTET_STRING_encode_xer, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, + OCTET_STRING_decode_xer_hex, + OCTET_STRING_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_T61String_tags, sizeof(asn_DEF_T61String_tags) diff --git a/skeletons/TeletexString.c b/skeletons/TeletexString.c index aa8d2a907..47aad419d 100644 --- a/skeletons/TeletexString.c +++ b/skeletons/TeletexString.c @@ -13,14 +13,15 @@ static ber_tlv_tag_t asn_DEF_TeletexString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), /* ... OCTET STRING */ }; asn_TYPE_descriptor_t asn_DEF_TeletexString = { + "TeletexString", "TeletexString", OCTET_STRING_free, OCTET_STRING_print, /* non-ascii string */ asn_generic_unknown_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - 0, /* Not implemented yet */ - OCTET_STRING_encode_xer, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, + OCTET_STRING_decode_xer_hex, + OCTET_STRING_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_TeletexString_tags, sizeof(asn_DEF_TeletexString_tags) diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c index 045b172fd..f9de9dd35 100644 --- a/skeletons/UTCTime.c +++ b/skeletons/UTCTime.c @@ -20,13 +20,14 @@ static ber_tlv_tag_t asn_DEF_UTCTime_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn_TYPE_descriptor_t asn_DEF_UTCTime = { + "UTCTime", "UTCTime", OCTET_STRING_free, UTCTime_print, UTCTime_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - 0, /* Not implemented yet */ + OCTET_STRING_decode_xer_utf8, UTCTime_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_UTCTime_tags, @@ -88,7 +89,7 @@ UTCTime_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, sptr = &st; } - return OCTET_STRING_encode_xer_ascii(td, sptr, ilevel, flags, + return OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags, cb, app_key); } diff --git a/skeletons/UTF8String.c b/skeletons/UTF8String.c index 934a424aa..1c0c731d7 100644 --- a/skeletons/UTF8String.c +++ b/skeletons/UTF8String.c @@ -13,14 +13,15 @@ static ber_tlv_tag_t asn_DEF_UTF8String_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), /* ... OCTET STRING */ }; asn_TYPE_descriptor_t asn_DEF_UTF8String = { + "UTF8String", "UTF8String", OCTET_STRING_free, UTF8String_print, UTF8String_constraint, /* Check for invalid codes, etc. */ OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - 0, /* Not implemented yet */ - OCTET_STRING_encode_xer_ascii, /* Already in UTF-8 format */ + OCTET_STRING_encode_der, + OCTET_STRING_decode_xer_utf8, + OCTET_STRING_encode_xer_utf8, 0, /* Use generic outmost tag fetcher */ asn_DEF_UTF8String_tags, sizeof(asn_DEF_UTF8String_tags) diff --git a/skeletons/UniversalString.c b/skeletons/UniversalString.c index f43de182f..2221000f6 100644 --- a/skeletons/UniversalString.c +++ b/skeletons/UniversalString.c @@ -13,6 +13,7 @@ static ber_tlv_tag_t asn_DEF_UniversalString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn_TYPE_descriptor_t asn_DEF_UniversalString = { + "UniversalString", "UniversalString", OCTET_STRING_free, UniversalString_print, /* Convert into UTF8 and print */ @@ -20,7 +21,7 @@ asn_TYPE_descriptor_t asn_DEF_UniversalString = { OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ 0, /* Not implemented yet */ - UniversalString_encode_xer, /* Conver into UTF8 */ + UniversalString_encode_xer, /* Convert into UTF8 */ 0, /* Use generic outmost tag fetcher */ asn_DEF_UniversalString_tags, sizeof(asn_DEF_UniversalString_tags) diff --git a/skeletons/VideotexString.c b/skeletons/VideotexString.c index fa6892ec1..2a2baa81c 100644 --- a/skeletons/VideotexString.c +++ b/skeletons/VideotexString.c @@ -13,14 +13,15 @@ static ber_tlv_tag_t asn_DEF_VideotexString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn_TYPE_descriptor_t asn_DEF_VideotexString = { + "VideotexString", "VideotexString", OCTET_STRING_free, OCTET_STRING_print, /* non-ascii string */ asn_generic_unknown_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - 0, /* Not implemented yet */ - OCTET_STRING_encode_xer, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, + OCTET_STRING_decode_xer_hex, + OCTET_STRING_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_VideotexString_tags, sizeof(asn_DEF_VideotexString_tags) diff --git a/skeletons/VisibleString.c b/skeletons/VisibleString.c index 8e361e714..7170b542a 100644 --- a/skeletons/VisibleString.c +++ b/skeletons/VisibleString.c @@ -13,14 +13,15 @@ static ber_tlv_tag_t asn_DEF_VisibleString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; asn_TYPE_descriptor_t asn_DEF_VisibleString = { + "VisibleString", "VisibleString", OCTET_STRING_free, - OCTET_STRING_print_ascii, /* ASCII subset */ + OCTET_STRING_print_utf8, /* ASCII subset */ VisibleString_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - 0, /* Not implemented yet */ - OCTET_STRING_encode_xer_ascii,/* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, + OCTET_STRING_decode_xer_utf8, + OCTET_STRING_encode_xer_utf8, 0, /* Use generic outmost tag fetcher */ asn_DEF_VisibleString_tags, sizeof(asn_DEF_VisibleString_tags) diff --git a/skeletons/asn_SEQUENCE_OF.c b/skeletons/asn_SEQUENCE_OF.c index b2d5f1fa7..ec952fc99 100644 --- a/skeletons/asn_SEQUENCE_OF.c +++ b/skeletons/asn_SEQUENCE_OF.c @@ -3,7 +3,6 @@ * Redistribution and modifications are permitted subject to BSD license. */ #include -#include /* for MALLOC/REALLOC/FREEMEM */ #include typedef A_SEQUENCE_OF(void) asn_sequence; diff --git a/skeletons/asn_SET_OF.c b/skeletons/asn_SET_OF.c index 7aeafddb1..5e268c076 100644 --- a/skeletons/asn_SET_OF.c +++ b/skeletons/asn_SET_OF.c @@ -3,7 +3,6 @@ * Redistribution and modifications are permitted subject to BSD license. */ #include -#include /* for MALLOC/REALLOC/FREEMEM */ #include #include diff --git a/skeletons/asn_application.h b/skeletons/asn_application.h index 33de699a4..4987e5cd2 100644 --- a/skeletons/asn_application.h +++ b/skeletons/asn_application.h @@ -8,7 +8,8 @@ #ifndef _ASN_APPLICATION_H_ #define _ASN_APPLICATION_H_ -#include /* for platform-dependent types */ +#include /* for platform-dependent types */ +#include /* for ASN.1 codecs specifics */ /* * Generic type of an application-defined callback to return various diff --git a/skeletons/asn_codecs.h b/skeletons/asn_codecs.h new file mode 100644 index 000000000..2f8ed10b7 --- /dev/null +++ b/skeletons/asn_codecs.h @@ -0,0 +1,76 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _ASN_CODECS_H_ +#define _ASN_CODECS_H_ + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * This structure defines a context that may be passed to every ASN.1 encoder + * or decoder function. + * WARNING: if max_stack_size member is set, and you are calling the + * function pointers of the asn_TYPE_descriptor_t directly, + * this structure must be ALLOCATED ON THE STACK! + */ +typedef struct asn_codec_ctx_s { + /* + * Limit the decoder routines to use no (much) more stack than a given + * number of bytes. Most of decoders are stack-based, and this + * would protect against stack overflows if the number of nested + * encodings is high. + * The OCTET STRING, BIT STRING and ANY BER decoders are heap-based, + * and are safe from this kind of overflow. + * A value from getrlimit(RLIMIT_STACK) may be used to initialize + * this variable. Be careful in multithreaded environments, as the + * stack size is rather limited. + */ + size_t max_stack_size; /* 0 disables stack bounds checking */ +} asn_codec_ctx_t; + +/* + * Type of the return value of the encoding functions (der_encode, xer_encode). + */ +typedef struct asn_enc_rval_s { + /* + * Number of bytes encoded. + * -1 indicates failure to encode the structure. + * In this case, the members below this one are meaningful. + */ + ssize_t encoded; + + /* + * Members meaningful when (encoded == -1), for post mortem analysis. + */ + + /* Type which cannot be encoded */ + struct asn_TYPE_descriptor_s *failed_type; + + /* Pointer to the structure of that type */ + void *structure_ptr; +} asn_enc_rval_t; +#define _ASN_ENCODE_FAILED do { \ + asn_enc_rval_t __er = { -1, td, sptr }; \ + return __er; \ +} while(0) + +/* + * Type of the return value of the decoding functions (ber_decode, xer_decode) + * + * Please note that the number of consumed bytes is ALWAYS meaningful, + * even if code==RC_FAIL. This is to indicate the number of successfully + * decoded bytes, hence providing a possibility to fail with more diagnostics + * (i.e., print the offending remainder of the buffer). + */ +enum asn_dec_rval_code_e { + RC_OK, /* Decoded successfully */ + RC_WMORE, /* More data expected, call again */ + RC_FAIL /* Failure to decode data */ +}; +typedef struct asn_dec_rval_s { + enum asn_dec_rval_code_e code; /* Result code */ + size_t consumed; /* Number of bytes consumed */ +} asn_dec_rval_t; + +#endif /* _ASN_CODECS_H_ */ diff --git a/skeletons/asn_internal.h b/skeletons/asn_internal.h index a7690eb0c..c2aa9e514 100644 --- a/skeletons/asn_internal.h +++ b/skeletons/asn_internal.h @@ -8,7 +8,7 @@ #ifndef _ASN_INTERNAL_H_ #define _ASN_INTERNAL_H_ -#define ASN1C_ENVIRONMENT_VERSION 96 /* Compile-time version */ +#define ASN1C_ENVIRONMENT_VERSION 98 /* Compile-time version */ int get_asn1c_environment_version(void); /* Run-time version */ #include /* Application-visible API */ diff --git a/skeletons/asn_types.h b/skeletons/asn_system.h similarity index 92% rename from skeletons/asn_types.h rename to skeletons/asn_system.h index cf5c87e46..ee64a0ca9 100644 --- a/skeletons/asn_types.h +++ b/skeletons/asn_system.h @@ -5,8 +5,8 @@ /* * Miscellaneous system-dependent types. */ -#ifndef _ASN_TYPES_H_ -#define _ASN_TYPES_H_ +#ifndef _ASN_SYSTEM_H_ +#define _ASN_SYSTEM_H_ #ifdef HAVE_CONFIG_H #include "config.h" @@ -31,7 +31,7 @@ * 2. Sun Solaris requires for alloca(3), * but does not have . */ -#if (!defined(__FreeBSD__) || !defined(_SYS_INTTYPES_H_)) +#if (!defined(__FreeBSD__) || !defined(_SYS_INTSYSTEM_H_)) #if defined(sun) #include /* For alloca(3) */ #else @@ -62,4 +62,4 @@ #endif /* __GNUC__ */ #endif /* MIN */ -#endif /* _ASN_TYPES_H_ */ +#endif /* _ASN_SYSTEM_H_ */ diff --git a/skeletons/ber_codec_prim.c b/skeletons/ber_codec_prim.c index c4d06e16d..2c367aeaf 100644 --- a/skeletons/ber_codec_prim.c +++ b/skeletons/ber_codec_prim.c @@ -10,12 +10,12 @@ /* * Decode an always-primitive type. */ -ber_dec_rval_t +asn_dec_rval_t ber_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, void *buf_ptr, size_t size, int tag_mode) { ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)*sptr; - ber_dec_rval_t rval; + asn_dec_rval_t rval; ber_tlv_len_t length; /* diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c index cda6c16d1..c78cfee30 100644 --- a/skeletons/ber_decoder.c +++ b/skeletons/ber_decoder.c @@ -14,7 +14,7 @@ } while(0) #undef RETURN #define RETURN(_code) do { \ - ber_dec_rval_t rval; \ + asn_dec_rval_t rval; \ rval.code = _code; \ if(opt_ctx) opt_ctx->step = step; /* Save context */ \ if(_code == RC_OK || opt_ctx) \ @@ -27,7 +27,7 @@ /* * The BER decoder of any type. */ -ber_dec_rval_t +asn_dec_rval_t ber_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *type_descriptor, void **struct_ptr, void *ptr, size_t size) { @@ -55,7 +55,7 @@ ber_decode(asn_codec_ctx_t *opt_codec_ctx, /* * Check the set of >> tags matches the definition. */ -ber_dec_rval_t +asn_dec_rval_t ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_struct_ctx_t *opt_ctx, void *ptr, size_t size, int tag_mode, int last_tag_form, diff --git a/skeletons/ber_decoder.h b/skeletons/ber_decoder.h index 8499c6a1a..b835b0f53 100644 --- a/skeletons/ber_decoder.h +++ b/skeletons/ber_decoder.h @@ -10,30 +10,11 @@ struct asn_TYPE_descriptor_s; /* Forward declaration */ struct asn_codec_ctx_s; /* Forward declaration */ -/* - * This structure describes the return value common across the - * various BER decoders. - * - * Please note that the number of consumed bytes is ALWAYS meaningful, - * even if code!=RC_OK. This is so to indicate the number of successfully - * decoded bytes, hence provide a possibility, to fail with more diagnostics - * (i.e., print the offending remainder of the buffer). - */ - enum ber_dec_rval_code_e { - RC_OK, /* Decoded successfully */ - RC_WMORE, /* More data expected, call again */ - RC_FAIL /* Failure to decode data */ - }; -typedef struct ber_dec_rval_s { - enum ber_dec_rval_code_e code; /* Result code */ - size_t consumed; /* Number of bytes consumed */ -} ber_dec_rval_t; - /* * The BER decoder of any type. * This function may be invoked directly from the application. */ -ber_dec_rval_t ber_decode(struct asn_codec_ctx_s *opt_codec_ctx, +asn_dec_rval_t ber_decode(struct asn_codec_ctx_s *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, void **struct_ptr, /* Pointer to a target structure's pointer */ void *buffer, /* Data to be decoded */ @@ -43,10 +24,10 @@ ber_dec_rval_t ber_decode(struct asn_codec_ctx_s *opt_codec_ctx, /* * Type of generic function which decodes the byte stream into the structure. */ -typedef ber_dec_rval_t (ber_type_decoder_f)( +typedef asn_dec_rval_t (ber_type_decoder_f)( struct asn_codec_ctx_s *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, - void **type_structure, void *buf_ptr, size_t size, + void **struct_ptr, void *buf_ptr, size_t size, int tag_mode); /******************************* @@ -60,7 +41,7 @@ typedef ber_dec_rval_t (ber_type_decoder_f)( * "end of content" sequences. The number may only be negative if the * head->last_tag_form is non-zero. */ -ber_dec_rval_t ber_check_tags( +asn_dec_rval_t ber_check_tags( struct asn_codec_ctx_s *opt_codec_ctx, /* optional context */ struct asn_TYPE_descriptor_s *type_dsc, asn_struct_ctx_t *opt_ctx, /* saved decoding context */ diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 236b9ad5a..9305313ec 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -96,7 +96,7 @@ _search4tag(const void *ap, const void *bp) { /* * The decoder of the CHOICE type. */ -ber_dec_rval_t +asn_dec_rval_t CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, void *ptr, size_t size, int tag_mode) { /* @@ -113,7 +113,7 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ber_tlv_tag_t tlv_tag; /* T from TLV */ ssize_t tag_len; /* Length of TLV's T */ - ber_dec_rval_t rval; /* Return code from subparsers */ + asn_dec_rval_t rval; /* Return code from subparsers */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ diff --git a/skeletons/constr_CHOICE.h b/skeletons/constr_CHOICE.h index 8cd323a2c..2685134bb 100644 --- a/skeletons/constr_CHOICE.h +++ b/skeletons/constr_CHOICE.h @@ -12,7 +12,7 @@ typedef struct asn_CHOICE_specifics_s { * Target structure description. */ int struct_size; /* Size of the target structure. */ - int ctx_offset; /* Offset of the ber_dec_ctx_t member */ + int ctx_offset; /* Offset of the asn_codec_ctx_t member */ int pres_offset; /* Identifier of the present member */ int pres_size; /* Size of the identifier (enum) */ diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 693ddd204..fcca4799b 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -107,7 +107,7 @@ _t2e_cmp(const void *ap, const void *bp) { /* * The decoder of the SEQUENCE type. */ -ber_dec_rval_t +asn_dec_rval_t SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, void *ptr, size_t size, int tag_mode) { /* @@ -123,7 +123,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_struct_ctx_t *ctx; /* Decoder context */ ber_tlv_tag_t tlv_tag; /* T from TLV */ - ber_dec_rval_t rval; /* Return code from subparsers */ + asn_dec_rval_t rval; /* Return code from subparsers */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ int edx; /* SEQUENCE element's index */ diff --git a/skeletons/constr_SEQUENCE_OF.c b/skeletons/constr_SEQUENCE_OF.c index 3d526d011..f126d78a1 100644 --- a/skeletons/constr_SEQUENCE_OF.c +++ b/skeletons/constr_SEQUENCE_OF.c @@ -92,7 +92,8 @@ SEQUENCE_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, asn_TYPE_member_t *element = td->elements; A_SEQUENCE_OF(void) *list; const char *mname = specs->as_XMLValueList - ? 0 : ((*element->name) ? element->name : element->type->name); + ? 0 : ((*element->name) + ? element->name : element->type->xml_tag); unsigned int mlen = mname ? strlen(mname) : 0; int xcan = (flags & XER_F_CANONICAL); int i; diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index ce6afd6d9..be3601621 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -96,7 +96,7 @@ _t2e_cmp(const void *ap, const void *bp) { /* * The decoder of the SET type. */ -ber_dec_rval_t +asn_dec_rval_t SET_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, void *ptr, size_t size, int tag_mode) { /* @@ -112,7 +112,7 @@ SET_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_struct_ctx_t *ctx; /* Decoder context */ ber_tlv_tag_t tlv_tag; /* T from TLV */ - ber_dec_rval_t rval; /* Return code from subparsers */ + asn_dec_rval_t rval; /* Return code from subparsers */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ int edx; /* SET element's index */ diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index 518713caf..164668c85 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -65,7 +65,7 @@ /* * The decoder of the SET OF type. */ -ber_dec_rval_t +asn_dec_rval_t SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, void *ptr, size_t size, int tag_mode) { /* @@ -81,7 +81,7 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_struct_ctx_t *ctx; /* Decoder context */ ber_tlv_tag_t tlv_tag; /* T from TLV */ - ber_dec_rval_t rval; /* Return code from subparsers */ + asn_dec_rval_t rval; /* Return code from subparsers */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ @@ -495,7 +495,8 @@ SET_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, asn_TYPE_member_t *element = td->elements; A_SET_OF(void) *list; const char *mname = specs->as_XMLValueList - ? 0 : ((*element->name) ? element->name : element->type->name); + ? 0 : ((*element->name) + ? element->name : element->type->xml_tag); size_t mlen = mname ? strlen(mname) : 0; int xcan = (flags & XER_F_CANONICAL); xer_tmp_enc_t *encs = 0; diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index 7e3254eda..79bd0a268 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -8,8 +8,8 @@ * This structure even contains pointer to these encoding and decoding routines * for each defined ASN.1 type. */ -#ifndef _CONSTR_TYPE_H -#define _CONSTR_TYPE_H +#ifndef _CONSTR_TYPE_H_ +#define _CONSTR_TYPE_H_ #include #include @@ -29,58 +29,11 @@ typedef struct asn_struct_ctx_s { void *ptr; /* Decoder-specific stuff (stack elements) */ } asn_struct_ctx_t; -/* - * This structure defines a context that may be passed to every ASN.1 encoder - * or decoder function. - * WARNING: if max_stack_size member is set, and you are calling the - * function pointers of the asn_TYPE_descriptor_t directly, - * this structure must be ALLOCATED ON THE STACK! - */ -typedef struct asn_codec_ctx_s { - /* - * Limit the decoder routines to use no (much) more stack than a given - * number of bytes. Most of decoders are stack-based, and this - * would protect against stack overflows if the number of nested - * encodings is high. - * The OCTET STRING, BIT STRING and ANY BER decoders are heap-based, - * and are safe from this kind of overflow. - * A value from getrlimit(RLIMIT_STACK) may be used to initialize - * this variable. Be careful in multithreaded environments, as the - * stack size is rather limited. - */ - size_t max_stack_size; /* 0 disables stack bounds checking */ -} asn_codec_ctx_t; - -/* - * Type of the return value of the encoding functions (der_encode, xer_encode). - */ -typedef struct asn_enc_rval_s { - /* - * Number of bytes encoded. - * -1 indicates failure to encode the structure. - * In this case, the members below this one are meaningful. - */ - ssize_t encoded; - - /* - * Members meaningful when (encoded == -1), for post mortem analysis. - */ - - /* Type which cannot be encoded */ - struct asn_TYPE_descriptor_s *failed_type; - - /* Pointer to the structure of that type */ - void *structure_ptr; -} asn_enc_rval_t; -#define _ASN_ENCODE_FAILED do { \ - asn_enc_rval_t __er = { -1, td, sptr }; \ - return __er; \ -} while(0) - -#include -#include -#include -#include +#include /* Basic Encoding Rules decoder */ +#include /* Distinguished Encoding Rules encoder */ +#include /* Decoder of XER (XML, text) */ +#include /* Encoder into XER (XML, text) */ +#include /* Subtype constraints support */ /* * Free the structure according to its specification. @@ -119,7 +72,8 @@ asn_outmost_tag_f asn_TYPE_outmost_tag; * The definitive description of the destination language's structure. */ typedef struct asn_TYPE_descriptor_s { - char *name; /* A name of the ASN.1 type */ + char *name; /* A name of the ASN.1 type. "" in some cases. */ + char *xml_tag; /* Name used in XML tag */ /* * Generalized functions for dealing with the specific type. @@ -128,9 +82,9 @@ typedef struct asn_TYPE_descriptor_s { asn_struct_free_f *free_struct; /* Free the structure */ asn_struct_print_f *print_struct; /* Human readable output */ asn_constr_check_f *check_constraints; /* Constraints validator */ - ber_type_decoder_f *ber_decoder; /* Free-form BER decoder */ + ber_type_decoder_f *ber_decoder; /* Generic BER decoder */ der_type_encoder_f *der_encoder; /* Canonical DER encoder */ - int (*xer_decoder);/* PLACEHOLDER */ /* Free-form XER decoder */ + xer_type_decoder_f *xer_decoder; /* Generic XER decoder */ xer_type_encoder_f *xer_encoder; /* [Canonical] XER encoder */ /*********************************************************************** diff --git a/skeletons/constraints.h b/skeletons/constraints.h index 07eb8362e..d8434e4ea 100644 --- a/skeletons/constraints.h +++ b/skeletons/constraints.h @@ -5,7 +5,7 @@ #ifndef _ASN1_CONSTRAINTS_VALIDATOR_H_ #define _ASN1_CONSTRAINTS_VALIDATOR_H_ -#include /* System-dependent types */ +#include /* Platform-dependent types */ struct asn_TYPE_descriptor_s; /* Forward declaration */ diff --git a/skeletons/file-dependencies b/skeletons/file-dependencies index 6b7ac6973..a95d98bfe 100644 --- a/skeletons/file-dependencies +++ b/skeletons/file-dependencies @@ -44,7 +44,8 @@ constr_SET_OF.h constr_SET_OF.c asn_SET_OF.h COMMON-FILES: # This is a special section asn_application.h asn_internal.h -asn_types.h +asn_codecs.h +asn_system.h # Platform-dependent types OCTET_STRING.h OCTET_STRING.c # This one is used too widely BIT_STRING.h BIT_STRING.c # This one is necessary for the above one ber_decoder.h ber_decoder.c @@ -54,4 +55,5 @@ ber_tlv_tag.h ber_tlv_tag.c constr_TYPE.h constr_TYPE.c constraints.h constraints.c der_encoder.h der_encoder.c +xer_decoder.h xer_decoder.c xer_support.h xer_support.c # XER/XML decoding xer_encoder.h xer_encoder.c diff --git a/skeletons/tests/Makefile.am b/skeletons/tests/Makefile.am index a58e469c1..c374438da 100644 --- a/skeletons/tests/Makefile.am +++ b/skeletons/tests/Makefile.am @@ -5,10 +5,12 @@ check_PROGRAMS = \ check-length \ check-OIDs \ check-GeneralizedTime \ + check-OCTET_STRING \ check-UTF8String \ check-UTCTime \ check-INTEGER \ - check-REAL + check-REAL \ + check-XER LDADD = -lm diff --git a/skeletons/tests/Makefile.in b/skeletons/tests/Makefile.in index 835df71e4..f5a3c6894 100644 --- a/skeletons/tests/Makefile.in +++ b/skeletons/tests/Makefile.in @@ -13,7 +13,7 @@ # PARTICULAR PURPOSE. @SET_MAKE@ -SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c check-REAL.c check-UTCTime.c check-UTF8String.c check-ber_tlv_tag.c check-length.c +SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OCTET_STRING.c check-OIDs.c check-REAL.c check-UTCTime.c check-UTF8String.c check-XER.c check-ber_tlv_tag.c check-length.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ @@ -38,8 +38,9 @@ POST_UNINSTALL = : host_triplet = @host@ check_PROGRAMS = check-ber_tlv_tag$(EXEEXT) check-length$(EXEEXT) \ check-OIDs$(EXEEXT) check-GeneralizedTime$(EXEEXT) \ - check-UTF8String$(EXEEXT) check-UTCTime$(EXEEXT) \ - check-INTEGER$(EXEEXT) check-REAL$(EXEEXT) + check-OCTET_STRING$(EXEEXT) check-UTF8String$(EXEEXT) \ + check-UTCTime$(EXEEXT) check-INTEGER$(EXEEXT) \ + check-REAL$(EXEEXT) check-XER$(EXEEXT) subdir = skeletons/tests DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -57,6 +58,10 @@ check_INTEGER_SOURCES = check-INTEGER.c check_INTEGER_OBJECTS = check-INTEGER.$(OBJEXT) check_INTEGER_LDADD = $(LDADD) check_INTEGER_DEPENDENCIES = +check_OCTET_STRING_SOURCES = check-OCTET_STRING.c +check_OCTET_STRING_OBJECTS = check-OCTET_STRING.$(OBJEXT) +check_OCTET_STRING_LDADD = $(LDADD) +check_OCTET_STRING_DEPENDENCIES = check_OIDs_SOURCES = check-OIDs.c check_OIDs_OBJECTS = check-OIDs.$(OBJEXT) check_OIDs_LDADD = $(LDADD) @@ -73,6 +78,10 @@ check_UTF8String_SOURCES = check-UTF8String.c check_UTF8String_OBJECTS = check-UTF8String.$(OBJEXT) check_UTF8String_LDADD = $(LDADD) check_UTF8String_DEPENDENCIES = +check_XER_SOURCES = check-XER.c +check_XER_OBJECTS = check-XER.$(OBJEXT) +check_XER_LDADD = $(LDADD) +check_XER_DEPENDENCIES = check_ber_tlv_tag_SOURCES = check-ber_tlv_tag.c check_ber_tlv_tag_OBJECTS = check-ber_tlv_tag.$(OBJEXT) check_ber_tlv_tag_LDADD = $(LDADD) @@ -86,10 +95,12 @@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/check-GeneralizedTime.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-INTEGER.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/check-OCTET_STRING.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-OIDs.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-REAL.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-UTCTime.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-UTF8String.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/check-XER.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-ber_tlv_tag.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-length.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ @@ -100,12 +111,13 @@ LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ CCLD = $(CC) LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c \ - check-REAL.c check-UTCTime.c check-UTF8String.c \ - check-ber_tlv_tag.c check-length.c -DIST_SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c \ - check-REAL.c check-UTCTime.c check-UTF8String.c \ - check-ber_tlv_tag.c check-length.c +SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OCTET_STRING.c \ + check-OIDs.c check-REAL.c check-UTCTime.c check-UTF8String.c \ + check-XER.c check-ber_tlv_tag.c check-length.c +DIST_SOURCES = check-GeneralizedTime.c check-INTEGER.c \ + check-OCTET_STRING.c check-OIDs.c check-REAL.c check-UTCTime.c \ + check-UTF8String.c check-XER.c check-ber_tlv_tag.c \ + check-length.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -267,6 +279,9 @@ check-GeneralizedTime$(EXEEXT): $(check_GeneralizedTime_OBJECTS) $(check_General check-INTEGER$(EXEEXT): $(check_INTEGER_OBJECTS) $(check_INTEGER_DEPENDENCIES) @rm -f check-INTEGER$(EXEEXT) $(LINK) $(check_INTEGER_LDFLAGS) $(check_INTEGER_OBJECTS) $(check_INTEGER_LDADD) $(LIBS) +check-OCTET_STRING$(EXEEXT): $(check_OCTET_STRING_OBJECTS) $(check_OCTET_STRING_DEPENDENCIES) + @rm -f check-OCTET_STRING$(EXEEXT) + $(LINK) $(check_OCTET_STRING_LDFLAGS) $(check_OCTET_STRING_OBJECTS) $(check_OCTET_STRING_LDADD) $(LIBS) check-OIDs$(EXEEXT): $(check_OIDs_OBJECTS) $(check_OIDs_DEPENDENCIES) @rm -f check-OIDs$(EXEEXT) $(LINK) $(check_OIDs_LDFLAGS) $(check_OIDs_OBJECTS) $(check_OIDs_LDADD) $(LIBS) @@ -279,6 +294,9 @@ check-UTCTime$(EXEEXT): $(check_UTCTime_OBJECTS) $(check_UTCTime_DEPENDENCIES) check-UTF8String$(EXEEXT): $(check_UTF8String_OBJECTS) $(check_UTF8String_DEPENDENCIES) @rm -f check-UTF8String$(EXEEXT) $(LINK) $(check_UTF8String_LDFLAGS) $(check_UTF8String_OBJECTS) $(check_UTF8String_LDADD) $(LIBS) +check-XER$(EXEEXT): $(check_XER_OBJECTS) $(check_XER_DEPENDENCIES) + @rm -f check-XER$(EXEEXT) + $(LINK) $(check_XER_LDFLAGS) $(check_XER_OBJECTS) $(check_XER_LDADD) $(LIBS) check-ber_tlv_tag$(EXEEXT): $(check_ber_tlv_tag_OBJECTS) $(check_ber_tlv_tag_DEPENDENCIES) @rm -f check-ber_tlv_tag$(EXEEXT) $(LINK) $(check_ber_tlv_tag_LDFLAGS) $(check_ber_tlv_tag_OBJECTS) $(check_ber_tlv_tag_LDADD) $(LIBS) @@ -294,10 +312,12 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-GeneralizedTime.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-INTEGER.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-OCTET_STRING.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-OIDs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-REAL.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-UTCTime.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-UTF8String.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-XER.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-ber_tlv_tag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-length.Po@am__quote@ diff --git a/skeletons/tests/check-GeneralizedTime.c b/skeletons/tests/check-GeneralizedTime.c index 0cec17d12..ff20772b5 100644 --- a/skeletons/tests/check-GeneralizedTime.c +++ b/skeletons/tests/check-GeneralizedTime.c @@ -116,7 +116,7 @@ OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_ } asn_enc_rval_t -OCTET_STRING_encode_xer_ascii(asn_TYPE_descriptor_t *td, void *ptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { +OCTET_STRING_encode_xer_utf8(asn_TYPE_descriptor_t *td, void *ptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t erval; (void)td; diff --git a/skeletons/tests/check-OIDs.c b/skeletons/tests/check-OIDs.c index 0cd4d1406..436e01325 100644 --- a/skeletons/tests/check-OIDs.c +++ b/skeletons/tests/check-OIDs.c @@ -19,7 +19,7 @@ _print(const void *buffer, size_t size, void *app_key) { static void check_OID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { OBJECT_IDENTIFIER_t *oid; - ber_dec_rval_t rval; + asn_dec_rval_t rval; unsigned long arcs[10]; int alen; int i; @@ -66,7 +66,7 @@ check_OID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { static void check_ROID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { RELATIVE_OID_t *oid; - ber_dec_rval_t rval; + asn_dec_rval_t rval; unsigned long arcs[10]; int alen; int i; diff --git a/skeletons/tests/check-UTCTime.c b/skeletons/tests/check-UTCTime.c index 6762865f0..4c76858bb 100644 --- a/skeletons/tests/check-UTCTime.c +++ b/skeletons/tests/check-UTCTime.c @@ -79,7 +79,7 @@ OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_ } asn_enc_rval_t -OCTET_STRING_encode_xer_ascii(asn_TYPE_descriptor_t *td, void *ptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { +OCTET_STRING_encode_xer_utf8(asn_TYPE_descriptor_t *td, void *ptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t erval; (void)td; diff --git a/skeletons/tests/check-UTF8String.c b/skeletons/tests/check-UTF8String.c index 149792191..ae368eab0 100644 --- a/skeletons/tests/check-UTF8String.c +++ b/skeletons/tests/check-UTF8String.c @@ -4,6 +4,8 @@ #include #include #include +#include +#include #include #include diff --git a/skeletons/tests/check-length.c b/skeletons/tests/check-length.c index d76902de0..80064d50d 100644 --- a/skeletons/tests/check-length.c +++ b/skeletons/tests/check-length.c @@ -2,6 +2,8 @@ #include #include #include +#include +#include #include #undef ADVANCE #undef RETURN @@ -37,7 +39,7 @@ check(int size) { OCTET_STRING_t *os; OCTET_STRING_t *nos = 0; asn_enc_rval_t erval; - ber_dec_rval_t rval; + asn_dec_rval_t rval; int i; os = OCTET_STRING_new_fromBuf(&asn_DEF_OCTET_STRING, 0, size); diff --git a/skeletons/xer_decoder.c b/skeletons/xer_decoder.c new file mode 100644 index 000000000..39e830d04 --- /dev/null +++ b/skeletons/xer_decoder.c @@ -0,0 +1,288 @@ + +#include +#include +#include /* XER/XML parsing support */ +#include + + +/* + * Decode the XER encoding of a given type. + */ +asn_dec_rval_t +xer_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **struct_ptr, void *buffer, size_t size) { + asn_codec_ctx_t s_codec_ctx; + + /* + * Satisfy the requirement that the codec context + * must be allocated on the stack. + */ + if(opt_codec_ctx && opt_codec_ctx->max_stack_size) { + s_codec_ctx = *opt_codec_ctx; + opt_codec_ctx = &s_codec_ctx; + } + + /* + * Invoke type-specific decoder. + */ + return td->xer_decoder(opt_codec_ctx, td, struct_ptr, 0, buffer, size); +} + + + +struct xer__cb_arg { + pxml_chunk_type_e chunk_type; + size_t chunk_size; + void *chunk_buf; + int callback_not_invoked; +}; + +static int +xer__token_cb(pxml_chunk_type_e type, void *_chunk_data, size_t _chunk_size, void *key) { + struct xer__cb_arg *arg = (struct xer__cb_arg *)key; + arg->chunk_type = type; + arg->chunk_size = _chunk_size; + arg->chunk_buf = _chunk_data; + arg->callback_not_invoked = 0; + return -1; /* Terminate the XML parsing */ +} + +/* + * Fetch the next token from the XER/XML stream. + */ +ssize_t +xer_next_token(int *stateContext, void *buffer, size_t size, + pxer_chunk_type_e *ch_type) { + struct xer__cb_arg arg; + ssize_t ret; + + arg.callback_not_invoked = 1; + ret = pxml_parse(stateContext, buffer, size, xer__token_cb, &arg); + if(ret < 0) return -1; + if(arg.callback_not_invoked) { + assert(ret == 0); /* No data was consumed */ + return 0; /* Try again with more data */ + } else { + assert(arg.chunk_size); + assert(arg.chunk_buf == buffer); + } + + /* + * Translate the XML chunk types into more convenient ones. + */ + switch(arg.chunk_type) { + case PXML_TEXT: + *ch_type = PXER_TEXT; + break; + case PXML_TAG: return 0; /* Want more */ + case PXML_TAG_END: + *ch_type = PXER_TAG; + break; + case PXML_COMMENT: + case PXML_COMMENT_END: + *ch_type = PXER_COMMENT; + break; + } + + return arg.chunk_size; +} + +#define CSLASH 0x2f /* '/' */ +#define LANGLE 0x3c /* '<' */ +#define RANGLE 0x3e /* '>' */ + +xer_check_tag_e +xer_check_tag(const void *buf_ptr, int size, const char *need_tag) { + const char *buf = (const char *)buf_ptr; + const char *end; + xer_check_tag_e ct = XCT_OPENING; + + if(size < 2 || buf[0] != LANGLE || buf[size-1] != RANGLE) { + return XCT_BROKEN; + } + + /* + * Determine the tag class. + */ + if(buf[1] == CSLASH) { + buf += 2; /* advance past "" */ + ct = XCT_CLOSING; + if(size > 0 && buf[size-1] == CSLASH) + return XCT_BROKEN; /* */ + } else { + buf++; /* advance past "<" */ + size -= 2; /* strip "<" and ">" */ + if(size > 0 && buf[size-1] == CSLASH) { + ct = XCT_BOTH; + size--; /* One more, for "/" */ + } + } + + /* + * Determine the tag name. + */ + for(end = buf + size; buf < end; buf++, need_tag++) { + int b = *buf, n = *need_tag; + if(b != n) { + if(n == 0) { + switch(b) { + case 0x09: case 0x0a: case 0x0c: case 0x0d: + case 0x20: + /* "": whitespace is normal */ + return ct; + } + } + return XCT_UNEXPECTED; + } + if(b == 0) + return XCT_BROKEN; /* Embedded 0 in buf?! */ + } + if(*need_tag) return XCT_UNEXPECTED; + + return ct; +} + + +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = (num_bytes); \ + buf_ptr = ((char *)buf_ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself; \ + return rval; \ + } while(0) + +#define XER_GOT_BODY(chunk_buf, chunk_size) do { \ + ssize_t converted_size = body_receiver \ + (struct_ptr, chunk_buf, chunk_size, \ + (size_t)chunk_size < size); \ + if(converted_size == -1) RETURN(RC_FAIL); \ + chunk_size = converted_size; \ + } while(0) +#define XER_GOT_EMPTY() do { \ + ssize_t chunk_size = 0; \ + XER_GOT_BODY(0, chunk_size); \ + } while(0) + +/* + * Generalized function for decoding the primitive values. + */ +asn_dec_rval_t +xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, + asn_struct_ctx_t *ctx, /* Type decoder context */ + void *struct_ptr, /* The structure must be already allocated */ + const char *xml_tag, /* Expected XML tag */ + void *buf_ptr, size_t size, + int (*opt_unexpected_tag_decoder) + (void *struct_ptr, void *chunk_buf, size_t chunk_size), + ssize_t (*body_receiver) + (void *struct_ptr, void *chunk_buf, size_t chunk_size, + int have_more) + ) { + + asn_dec_rval_t rval; + ssize_t consumed_myself = 0; + pxer_chunk_type_e ch_type; /* XER chunk type */ + int xer_state; /* XER low level parsing context */ + + (void)opt_codec_ctx; + + /* + * Phases of XER/XML processing: + * Phase 0: Check that the opening tag matches our expectations. + * Phase 1: Processing body and reacting on closing tag. + */ + if(ctx->phase > 1) RETURN(RC_FAIL); + for(xer_state = ctx->step;;) { + ssize_t ch_size; /* Chunk size */ + xer_check_tag_e tcv; /* Tag check value */ + + /* + * Get the next part of the XML stream. + */ + ch_size = xer_next_token(&xer_state, buf_ptr, size, &ch_type); + switch(ch_size) { + case -1: RETURN(RC_FAIL); + case 0: + ctx->step = xer_state; + RETURN(RC_WMORE); + default: + switch(ch_type) { + case PXER_COMMENT: /* Got XML comment */ + ADVANCE(ch_size); /* Skip silently */ + continue; + case PXER_TEXT: + if(ctx->phase == 0) { + /* Unexpected data */ + /* TODO: ignore whitespace? */ + RETURN(RC_FAIL); + } + XER_GOT_BODY(buf_ptr, ch_size); + ADVANCE(ch_size); + continue; + case PXER_TAG: + break; /* Check the rest down there */ + } + } + + assert(ch_type == PXER_TAG && size); + + tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); + if(ctx->phase == 0) { + /* + * Expecting the opening tag + * for the type being processed. + */ + switch(tcv) { + case XCT_BOTH: + /* Finished decoding of an empty element */ + XER_GOT_EMPTY(); + ADVANCE(ch_size); + ctx->phase = 2; /* Phase out */ + RETURN(RC_OK); + case XCT_OPENING: + ADVANCE(ch_size); + ctx->phase = 1; /* Processing body phase */ + continue; + default: + break; /* Unexpected tag */ + } + } else { + /* + * Waiting for the closing XML tag. + */ + switch(tcv) { + case XCT_CLOSING: + ADVANCE(ch_size); + ctx->phase = 2; /* Phase out */ + RETURN(RC_OK); + case XCT_UNEXPECTED: + /* + * Certain tags in the body may be expected. + */ + if(opt_unexpected_tag_decoder + && opt_unexpected_tag_decoder(struct_ptr, + buf_ptr, ch_size) == 0) { + /* Tag's processed fine */ + ADVANCE(ch_size); + continue; + } + /* Fall through */ + default: + break; + } + ASN_DEBUG("Unexpected XML tag"); + } + break; /* Dark and mysterious things have just happened */ + } + + RETURN(RC_FAIL); +} + diff --git a/skeletons/xer_decoder.h b/skeletons/xer_decoder.h new file mode 100644 index 000000000..e258b5b86 --- /dev/null +++ b/skeletons/xer_decoder.h @@ -0,0 +1,82 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _XER_DECODER_H_ +#define _XER_DECODER_H_ + +#include + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * The XER decoder of any type. May be invoked by the application. + */ +asn_dec_rval_t xer_decode(struct asn_codec_ctx_s *opt_codec_ctx, + struct asn_TYPE_descriptor_s *type_descriptor, + void **struct_ptr, /* Pointer to a target structure's pointer */ + void *buffer, /* Data to be decoded */ + size_t size /* Size of that buffer */ + ); + +/* + * Type of the type-specific XER decoder function. + */ +typedef asn_dec_rval_t (xer_type_decoder_f)(asn_codec_ctx_t *opt_codec_ctx, + struct asn_TYPE_descriptor_s *type_descriptor, + void **struct_ptr, + const char *opt_mname, /* Member name */ + void *buf_ptr, size_t size + ); + +/******************************* + * INTERNALLY USEFUL FUNCTIONS * + *******************************/ + +/* + * Generalized function for decoding the primitive values. + * Used by more specialized functions, such as OCTET_STRING_decode_xer_utf8 + * and others. This function should not be used by applications, as its API + * is subject to changes. + */ +asn_dec_rval_t xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, + asn_struct_ctx_t *ctx, /* Type decoder context */ + void *struct_ptr, /* The structure must be already allocated */ + const char *xml_tag, /* Expected XML tag name */ + void *buf_ptr, size_t size, + int (*opt_unexpected_tag_decoder) + (void *struct_ptr, void *chunk_buf, size_t chunk_size), + ssize_t (*body_receiver) + (void *struct_ptr, void *chunk_buf, size_t chunk_size, + int have_more) + ); + + +/* + * Fetch the next XER (XML) token from the stream. + * The function returns the number of bytes occupied by the chunk type, + * returned in the _ch_type. The _ch_type is only set (and valid) when + * the return value is greater than 0. + */ + typedef enum pxer_chunk_type { + PXER_TAG, /* Complete XER tag */ + PXER_TEXT, /* Plain text between XER tags */ + PXER_COMMENT, /* A comment, may be part of */ + } pxer_chunk_type_e; +ssize_t xer_next_token(int *stateContext, void *buffer, size_t size, + pxer_chunk_type_e *_ch_type); + +/* + * This function checks the buffer against the tag name is expected to occur. + */ + typedef enum xer_check_tag { + XCT_BROKEN, /* The tag is broken */ + XCT_UNEXPECTED, /* The tag is fine, but unexpected */ + XCT_OPENING, /* This is the opening */ + XCT_CLOSING, /* This is the closing */ + XCT_BOTH, /* This is the opening and closing tag */ + } xer_check_tag_e; +xer_check_tag_e xer_check_tag(const void *buf_ptr, int size, + const char *need_tag); + +#endif /* _XER_DECODER_H_ */ diff --git a/skeletons/xer_encoder.c b/skeletons/xer_encoder.c index d3f04d66a..5fb0de689 100644 --- a/skeletons/xer_encoder.c +++ b/skeletons/xer_encoder.c @@ -21,7 +21,7 @@ xer_encode(asn_TYPE_descriptor_t *td, void *sptr, if(!td || !sptr) goto cb_failed; - mname = td->name; + mname = td->xml_tag; mlen = strlen(mname); _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); diff --git a/skeletons/xer_support.c b/skeletons/xer_support.c new file mode 100644 index 000000000..1fe59bc94 --- /dev/null +++ b/skeletons/xer_support.c @@ -0,0 +1,234 @@ +/* + * Copyright (c) 2003, 2004 X/IO Labs, xiolabs.com. + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include +#include + +#include + +/* Parser states */ +typedef enum { + ST_TEXT, + ST_TAG_START, + ST_TAG_BODY, + ST_TAG_QUOTE_WAIT, + ST_TAG_QUOTED_STRING, + ST_TAG_UNQUOTED_STRING, + ST_COMMENT_WAIT_DASH1, // ""[0] + ST_COMMENT_CLO_RT // "-->"[1] +} pstate_e; + +static pxml_chunk_type_e final_chunk_type[] = { + PXML_TEXT, + PXML_TAG_END, + PXML_COMMENT_END, + PXML_TAG_END, + PXML_COMMENT_END, +}; + + +static int +_charclass[256] = { + 0,0,0,0,0,0,0,0, 0,1,1,0,1,1,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2, 2,2,0,0,0,0,0,0, /* 01234567 89 */ + 0,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3, /* ABCDEFG HIJKLMNO */ + 3,3,3,3,3,3,3,3, 3,3,3,0,0,0,0,0, /* PQRSTUVW XYZ */ + 0,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3, /* abcdefg hijklmno */ + 3,3,3,3,3,3,3,3, 3,3,3,0,0,0,0,0 /* pqrstuvw xyz */ +}; +#define WHITESPACE(c) (_charclass[(unsigned char)(c)] == 1) +#define ALNUM(c) (_charclass[(unsigned char)(c)] >= 2) +#define ALPHA(c) (_charclass[(unsigned char)(c)] == 3) + +/* Aliases for characters, ASCII/UTF-8 */ +#define EXCLAM 0x21 /* '!' */ +#define CQUOTE 0x22 /* '"' */ +#define CDASH 0x2d /* '-' */ +#define CSLASH 0x2f /* '/' */ +#define LANGLE 0x3c /* '<' */ +#define CEQUAL 0x3d /* '=' */ +#define RANGLE 0x3e /* '>' */ + +/* Invoke token callback */ +#define TOKEN_CB_CALL(type, _ns, _current_too, _final) do { \ + int _ret; \ + pstate_e ns = _ns; \ + ssize_t _sz = (p - chunk_start) + _current_too; \ + if (!_sz) { \ + /* Shortcut */ \ + state = _ns; \ + break; \ + } \ + _ret = cb(type, chunk_start, _sz, key); \ + if(_ret < _sz) { \ + if(_current_too && _ret == -1) \ + state = ns; \ + goto finish; \ + } \ + chunk_start = p + _current_too; \ + state = ns; \ + } while(0) + +#define TOKEN_CB(_type, _ns, _current_too) \ + TOKEN_CB_CALL(_type, _ns, _current_too, 0) + +#define TOKEN_CB_FINAL(_type, _ns, _current_too) \ + TOKEN_CB_CALL(final_chunk_type[_type], _ns, _current_too, 1) + +/* + * Parser itself + */ +int pxml_parse(int *stateContext, void *xmlbuf, size_t size, pxml_callback_f *cb, void *key) { + pstate_e state = (pstate_e)*stateContext; + char *chunk_start = (char *)xmlbuf; + char *p = chunk_start; + char *end = p + size; + + for(; p < end; p++) { + int C = *(unsigned char *)p; + switch(state) { + case ST_TEXT: + /* + * Initial state: we're in the middle of some text, + * or just have started. + */ + if (C == LANGLE) + /* We're now in the tag, probably */ + TOKEN_CB(PXML_TEXT, ST_TAG_START, 0); + break; + case ST_TAG_START: + if (ALPHA(C) || (C == CSLASH)) + state = ST_TAG_BODY; + else if (C == EXCLAM) + state = ST_COMMENT_WAIT_DASH1; + else + /* + * Not characters and not whitespace. + * Must be something like "3 < 4". + */ + TOKEN_CB(PXML_TEXT, ST_TEXT, 1);/* Flush as data */ + break; + case ST_TAG_BODY: + switch(C) { + case RANGLE: + /* End of the tag */ + TOKEN_CB_FINAL(PXML_TAG, ST_TEXT, 1); + break; + case LANGLE: + /* + * The previous tag wasn't completed, but still + * recognized as valid. (Mozilla-compatible) + */ + TOKEN_CB_FINAL(PXML_TAG, ST_TAG_START, 0); + break; + case CEQUAL: + state = ST_TAG_QUOTE_WAIT; + break; + } + break; + case ST_TAG_QUOTE_WAIT: + /* + * State after the equal sign ("=") in the tag. + */ + switch(C) { + case CQUOTE: + state = ST_TAG_QUOTED_STRING; + break; + case RANGLE: + /* End of the tag */ + TOKEN_CB_FINAL(PXML_TAG, ST_TEXT, 1); + break; + default: + if(!WHITESPACE(C)) + /* Unquoted string value */ + state = ST_TAG_UNQUOTED_STRING; + } + break; + case ST_TAG_QUOTED_STRING: + /* + * Tag attribute's string value in quotes. + */ + if(C == CQUOTE) { + /* Return back to the tag state */ + state = ST_TAG_BODY; + } + break; + case ST_TAG_UNQUOTED_STRING: + if(C == RANGLE) { + /* End of the tag */ + TOKEN_CB_FINAL(PXML_TAG, ST_TEXT, 1); + } else if(WHITESPACE(C)) { + /* Return back to the tag state */ + state = ST_TAG_BODY; + } + break; + case ST_COMMENT_WAIT_DASH1: + if(C == CDASH) { + state = ST_COMMENT_WAIT_DASH2; + } else { + /* Some ordinary tag. */ + state = ST_TAG_BODY; + } + break; + case ST_COMMENT_WAIT_DASH2: + if(C == CDASH) { + /* Seen "<--" */ + state = ST_COMMENT; + } else { + /* Some ordinary tag */ + state = ST_TAG_BODY; + } + break; + case ST_COMMENT: + if(C == CDASH) { + state = ST_COMMENT_CLO_DASH2; + } + break; + case ST_COMMENT_CLO_DASH2: + if(C == CDASH) { + state = ST_COMMENT_CLO_RT; + } else { + /* This is not an end of a comment */ + state = ST_COMMENT; + } + break; + case ST_COMMENT_CLO_RT: + if(C == RANGLE) { + TOKEN_CB_FINAL(PXML_COMMENT, ST_TEXT, 1); + } else { + state = ST_COMMENT; + } + break; + } /* switch(*ptr) */ + } /* for() */ + + /* + * Flush the partially processed chunk, state permitting. + */ + if(p - chunk_start) { + switch (state) { + case ST_COMMENT: + TOKEN_CB(PXML_COMMENT, state, 0); + break; + case ST_TEXT: + TOKEN_CB(PXML_TEXT, state, 0); + break; + default: break; /* a no-op */ + } + } + +finish: + *stateContext = (int)state; + return chunk_start - (char *)xmlbuf; +} + diff --git a/skeletons/xer_support.h b/skeletons/xer_support.h new file mode 100644 index 000000000..a1a010c61 --- /dev/null +++ b/skeletons/xer_support.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2003, 2004 X/IO Labs, xiolabs.com. + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _XER_SUPPORT_H_ +#define _XER_SUPPORT_H_ + +/* + * Types of data transferred to the application. + */ +typedef enum { + PXML_TEXT, /* Plain text between XML tags. */ + PXML_TAG, /* A tag, starting with '<'. */ + PXML_COMMENT, /* An XML comment, including "". */ + /* + * The following chunk types are reported if the chunk + * terminates the specified XML element. + */ + PXML_TAG_END, /* Tag ended */ + PXML_COMMENT_END /* Comment ended */ +} pxml_chunk_type_e; + +/* + * Callback function that is called by the parser when parsed data is + * available. The _opaque is the pointer to a field containing opaque user + * data specified in pxml_create() call. The chunk type is _type and the text + * data is the piece of buffer identified by _bufid (as supplied to + * pxml_feed() call) starting at offset _offset and of _size bytes size. + * The chunk is NOT '\0'-terminated. + */ +typedef int (pxml_callback_f)(pxml_chunk_type_e _type, + void *_chunk_data, size_t _chunk_size, void *_key); + +/* + * Parse the given buffer as it were a chunk of XML data. + * Invoke the specified callback each time the meaninful data is found. + * This function returns number of bytes consumed from the bufer. + * It will always be lesser than or equal to the specified _size. + * The next invocation of this function must account the difference. + */ +ssize_t pxml_parse(int *_stateContext, void *_buf, size_t _size, + pxml_callback_f *cb, void *_key); + +#endif /* _XER_SUPPORT_H_ */ diff --git a/tests/19-param-OK.asn1.-P b/tests/19-param-OK.asn1.-P index 8c609e9de..0d07f8b29 100644 --- a/tests/19-param-OK.asn1.-P +++ b/tests/19-param-OK.asn1.-P @@ -107,6 +107,7 @@ static asn_SEQUENCE_specifics_t asn_DEF_toBeSigned_specs = { }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_toBeSigned = { + "toBeSigned", "toBeSigned", SEQUENCE_free, SEQUENCE_print, @@ -167,6 +168,7 @@ static asn_SEQUENCE_specifics_t asn_DEF_Certificate_specs = { -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Certificate = { + "Certificate", "Certificate", SEQUENCE_free, SEQUENCE_print, @@ -228,6 +230,7 @@ static asn_SET_OF_specifics_t asn_DEF_Name_specs = { 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_Name = { + "Name", "Name", SEQUENCE_OF_free, SEQUENCE_OF_print, @@ -344,6 +347,7 @@ static asn_SET_OF_specifics_t asn_DEF_RelativeDistinguishedName_specs = { 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_RelativeDistinguishedName = { + "RelativeDistinguishedName", "RelativeDistinguishedName", SET_OF_free, SET_OF_print, diff --git a/tests/30-set-OK.asn1.-P b/tests/30-set-OK.asn1.-P index 1ffd9b4be..f944af734 100644 --- a/tests/30-set-OK.asn1.-P +++ b/tests/30-set-OK.asn1.-P @@ -87,6 +87,7 @@ static asn_SET_specifics_t asn_DEF_T_specs = { (unsigned int *)asn_DEF_T_mmap /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_T = { + "T", "T", SET_free, SET_print, diff --git a/tests/31-set-of-OK.asn1.-P b/tests/31-set-of-OK.asn1.-P index 143ab8c64..c245bf880 100644 --- a/tests/31-set-of-OK.asn1.-P +++ b/tests/31-set-of-OK.asn1.-P @@ -39,6 +39,7 @@ static asn_SET_OF_specifics_t asn_DEF_Forest_specs = { 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_Forest = { + "Forest", "Forest", SET_OF_free, SET_OF_print, @@ -114,6 +115,7 @@ static asn_SEQUENCE_specifics_t asn_DEF_Tree_specs = { -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Tree = { + "Tree", "Tree", SEQUENCE_free, SEQUENCE_print, @@ -234,6 +236,7 @@ static asn_SET_OF_specifics_t asn_DEF_trees_specs = { }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_trees = { + "trees", "trees", SET_OF_free, SET_OF_print, @@ -279,6 +282,7 @@ static asn_SEQUENCE_specifics_t asn_DEF_anything_member_specs = { }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_anything_member = { + "", "", SEQUENCE_free, SEQUENCE_print, @@ -319,6 +323,7 @@ static asn_SET_OF_specifics_t asn_DEF_anything_specs = { }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_anything = { + "anything", "anything", SET_OF_free, SET_OF_print, @@ -370,6 +375,7 @@ static asn_CHOICE_specifics_t asn_DEF_other_specs = { }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_other = { + "other", "other", CHOICE_free, CHOICE_print, @@ -440,6 +446,7 @@ static asn_SET_specifics_t asn_DEF_Stuff_specs = { (unsigned int *)asn_DEF_Stuff_mmap /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_Stuff = { + "Stuff", "Stuff", SET_free, SET_print, diff --git a/tests/32-sequence-of-OK.asn1.-P b/tests/32-sequence-of-OK.asn1.-P index 508eb0516..5c2c9b294 100644 --- a/tests/32-sequence-of-OK.asn1.-P +++ b/tests/32-sequence-of-OK.asn1.-P @@ -39,6 +39,7 @@ static asn_SET_OF_specifics_t asn_DEF_Programming_specs = { 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_Programming = { + "Programming", "Programming", SEQUENCE_OF_free, SEQUENCE_OF_print, @@ -100,6 +101,7 @@ static asn_SET_OF_specifics_t asn_DEF_Fault_specs = { 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_Fault = { + "Fault", "Fault", SET_OF_free, SET_OF_print, @@ -158,6 +160,7 @@ static asn_SEQUENCE_specifics_t asn_DEF_Error_specs = { -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Error = { + "Error", "Error", SEQUENCE_free, SEQUENCE_print, diff --git a/tests/39-sequence-of-OK.asn1.-P b/tests/39-sequence-of-OK.asn1.-P index 6ef4a4f23..1fecb6f53 100644 --- a/tests/39-sequence-of-OK.asn1.-P +++ b/tests/39-sequence-of-OK.asn1.-P @@ -48,6 +48,7 @@ static asn_SET_OF_specifics_t asn_DEF_collection_specs = { }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_collection = { + "collection", "collection", SEQUENCE_OF_free, SEQUENCE_OF_print, @@ -100,6 +101,7 @@ static asn_SEQUENCE_specifics_t asn_DEF_T_specs = { -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_T = { + "T", "T", SEQUENCE_free, SEQUENCE_print, @@ -176,6 +178,7 @@ static asn_SEQUENCE_specifics_t asn_DEF_T2_specs = { -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_T2 = { + "T2", "T2", SEQUENCE_free, SEQUENCE_print, diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index 1bfd634df..951e66935 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -84,6 +84,7 @@ static asn_SET_OF_specifics_t asn_DEF_varsets_specs = { }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_varsets = { + "varsets", "varsets", SEQUENCE_OF_free, SEQUENCE_OF_print, @@ -136,6 +137,7 @@ static asn_SEQUENCE_specifics_t asn_DEF_LogLine_specs = { 3 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_LogLine = { + "LogLine", "LogLine", SEQUENCE_free, SEQUENCE_print, @@ -232,6 +234,7 @@ static asn_SET_OF_specifics_t asn_DEF_vparts_specs = { }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_vparts = { + "vparts", "vparts", SEQUENCE_OF_free, SEQUENCE_OF_print, @@ -284,6 +287,7 @@ static asn_SEQUENCE_specifics_t asn_DEF_VariablePartSet_specs = { 3 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_VariablePartSet = { + "VariablePartSet", "VariablePartSet", SEQUENCE_free, SEQUENCE_print, @@ -409,6 +413,7 @@ static asn_SET_OF_specifics_t asn_DEF_vset_specs = { }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_vset = { + "vset", "vset", SET_OF_free, SET_OF_print, @@ -462,6 +467,7 @@ static asn_SEQUENCE_specifics_t asn_DEF_vrange_specs = { }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_vrange = { + "vrange", "vrange", SEQUENCE_free, SEQUENCE_print, @@ -512,6 +518,7 @@ static asn_CHOICE_specifics_t asn_DEF_VariablePart_specs = { 1 /* Whether extensible */ }; asn_TYPE_descriptor_t asn_DEF_VariablePart = { + "VariablePart", "VariablePart", CHOICE_free, CHOICE_print, @@ -603,6 +610,7 @@ static asn_SET_OF_specifics_t asn_DEF_email_specs = { }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_email = { + "email", "email", SET_OF_free, SET_OF_print, @@ -656,6 +664,7 @@ static asn_SEQUENCE_specifics_t asn_DEF_notify_specs = { }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_notify = { + "notify", "notify", SEQUENCE_free, SEQUENCE_print, @@ -708,6 +717,7 @@ static asn_SEQUENCE_specifics_t asn_DEF_ActionItem_specs = { 3 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_ActionItem = { + "ActionItem", "ActionItem", SEQUENCE_free, SEQUENCE_print, diff --git a/tests/43-recursion-OK.asn1.-P b/tests/43-recursion-OK.asn1.-P index 7f03aad78..004e0f051 100644 --- a/tests/43-recursion-OK.asn1.-P +++ b/tests/43-recursion-OK.asn1.-P @@ -59,6 +59,7 @@ static asn_SET_OF_specifics_t asn_DEF_t_member1_specs = { }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_t_member1 = { + "t-member1", "t-member1", SET_OF_free, SET_OF_print, @@ -98,6 +99,7 @@ static asn_SET_OF_specifics_t asn_DEF_t_member2_specs = { }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_t_member2 = { + "t-member2", "t-member2", SEQUENCE_OF_free, SEQUENCE_OF_print, @@ -166,6 +168,7 @@ static asn_SEQUENCE_specifics_t asn_DEF_Test_structure_1_specs = { -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Test_structure_1 = { + "Test-structure-1", "Test-structure-1", SEQUENCE_free, SEQUENCE_print, @@ -253,6 +256,7 @@ static asn_SET_OF_specifics_t asn_DEF_or_specs = { }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_or = { + "or", "or", SET_OF_free, SET_OF_print, @@ -319,6 +323,7 @@ static asn_CHOICE_specifics_t asn_DEF_Choice_1_specs = { 0 /* Whether extensible */ }; asn_TYPE_descriptor_t asn_DEF_Choice_1 = { + "Choice-1", "Choice-1", CHOICE_free, CHOICE_print, @@ -402,6 +407,7 @@ static asn_SET_specifics_t asn_DEF_Test_structure_2_specs = { (unsigned int *)asn_DEF_Test_structure_2_mmap /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_Test_structure_2 = { + "Test-structure-2", "Test-structure-2", SET_free, SET_print, @@ -487,6 +493,7 @@ static asn_SET_specifics_t asn_DEF_Test_structure_3_specs = { (unsigned int *)asn_DEF_Test_structure_3_mmap /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_Test_structure_3 = { + "Test-structure-3", "Test-structure-3", SET_free, SET_print, diff --git a/tests/44-choice-in-sequence-OK.asn1.-P b/tests/44-choice-in-sequence-OK.asn1.-P index 8b3106d8d..bb51a570c 100644 --- a/tests/44-choice-in-sequence-OK.asn1.-P +++ b/tests/44-choice-in-sequence-OK.asn1.-P @@ -99,6 +99,7 @@ static asn_CHOICE_specifics_t asn_DEF_e_specs = { }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_e = { + "e", "e", CHOICE_free, CHOICE_print, @@ -148,6 +149,7 @@ static asn_CHOICE_specifics_t asn_DEF_h_specs = { }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_h = { + "h", "h", CHOICE_free, CHOICE_print, @@ -214,6 +216,7 @@ static asn_CHOICE_specifics_t asn_DEF_b_specs = { }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_b = { + "b", "b", CHOICE_free, CHOICE_print, @@ -269,6 +272,7 @@ static asn_SEQUENCE_specifics_t asn_DEF_T_specs = { -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_T = { + "T", "T", SEQUENCE_free, SEQUENCE_print, diff --git a/tests/46-redefine-OK.asn1.-PR b/tests/46-redefine-OK.asn1.-PR index 92a81cae5..4650b5131 100644 --- a/tests/46-redefine-OK.asn1.-PR +++ b/tests/46-redefine-OK.asn1.-PR @@ -63,6 +63,7 @@ static asn_SEQUENCE_specifics_t asn_DEF_ConstructedType_specs = { -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_ConstructedType = { + "ConstructedType", "ConstructedType", SEQUENCE_free, SEQUENCE_print, @@ -144,7 +145,7 @@ T_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t T_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T_inherit_TYPE_descriptor(td); @@ -175,6 +176,7 @@ static ber_tlv_tag_t asn_DEF_T_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; asn_TYPE_descriptor_t asn_DEF_T = { + "T", "T", T_free, T_print, diff --git a/tests/47-set-ext-OK.asn1.-P b/tests/47-set-ext-OK.asn1.-P index 5aa2ce2d4..8c2bc2706 100644 --- a/tests/47-set-ext-OK.asn1.-P +++ b/tests/47-set-ext-OK.asn1.-P @@ -65,6 +65,7 @@ static asn_SET_specifics_t asn_DEF_T1_specs = { (unsigned int *)asn_DEF_T1_mmap /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_T1 = { + "T1", "T1", SET_free, SET_print, @@ -152,6 +153,7 @@ static asn_SET_specifics_t asn_DEF_T2_specs = { (unsigned int *)asn_DEF_T2_mmap /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_T2 = { + "T2", "T2", SET_free, SET_print, @@ -228,6 +230,7 @@ static asn_CHOICE_specifics_t asn_DEF_T3_specs = { 1 /* Whether extensible */ }; asn_TYPE_descriptor_t asn_DEF_T3 = { + "T3", "T3", CHOICE_free, CHOICE_print, @@ -302,6 +305,7 @@ static asn_CHOICE_specifics_t asn_DEF_T4_specs = { 1 /* Whether extensible */ }; asn_TYPE_descriptor_t asn_DEF_T4 = { + "T4", "T4", CHOICE_free, CHOICE_print, diff --git a/tests/50-constraint-OK.asn1.-P b/tests/50-constraint-OK.asn1.-P index 9eba46950..6f4dac108 100644 --- a/tests/50-constraint-OK.asn1.-P +++ b/tests/50-constraint-OK.asn1.-P @@ -97,7 +97,7 @@ Int2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t Int2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Int2_inherit_TYPE_descriptor(td); @@ -127,6 +127,7 @@ static ber_tlv_tag_t asn_DEF_Int2_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Int2 = { + "Int2", "Int2", Int2_free, Int2_print, @@ -230,7 +231,7 @@ Int3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t Int3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Int3_inherit_TYPE_descriptor(td); @@ -260,6 +261,7 @@ static ber_tlv_tag_t asn_DEF_Int3_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Int3 = { + "Int3", "Int3", Int3_free, Int3_print, @@ -363,7 +365,7 @@ Int4_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t Int4_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Int4_inherit_TYPE_descriptor(td); @@ -393,6 +395,7 @@ static ber_tlv_tag_t asn_DEF_Int4_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Int4 = { + "Int4", "Int4", Int4_free, Int4_print, @@ -496,7 +499,7 @@ Int5_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t Int5_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Int5_inherit_TYPE_descriptor(td); @@ -526,6 +529,7 @@ static ber_tlv_tag_t asn_DEF_Int5_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Int5 = { + "Int5", "Int5", Int5_free, Int5_print, @@ -629,7 +633,7 @@ ExtensibleExtensions_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t ExtensibleExtensions_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { ExtensibleExtensions_inherit_TYPE_descriptor(td); @@ -659,6 +663,7 @@ static ber_tlv_tag_t asn_DEF_ExtensibleExtensions_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_ExtensibleExtensions = { + "ExtensibleExtensions", "ExtensibleExtensions", ExtensibleExtensions_free, ExtensibleExtensions_print, @@ -793,7 +798,7 @@ Str2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t Str2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Str2_inherit_TYPE_descriptor(td); @@ -823,6 +828,7 @@ static ber_tlv_tag_t asn_DEF_Str2_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Str2 = { + "Str2", "Str2", Str2_free, Str2_print, @@ -949,7 +955,7 @@ Str3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t Str3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Str3_inherit_TYPE_descriptor(td); @@ -979,6 +985,7 @@ static ber_tlv_tag_t asn_DEF_Str3_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Str3 = { + "Str3", "Str3", Str3_free, Str3_print, @@ -1091,7 +1098,7 @@ Str4_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t Str4_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Str4_inherit_TYPE_descriptor(td); @@ -1121,6 +1128,7 @@ static ber_tlv_tag_t asn_DEF_Str4_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Str4 = { + "Str4", "Str4", Str4_free, Str4_print, @@ -1233,7 +1241,7 @@ PER_Visible_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t PER_Visible_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { PER_Visible_inherit_TYPE_descriptor(td); @@ -1263,6 +1271,7 @@ static ber_tlv_tag_t asn_DEF_PER_Visible_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_PER_Visible = { + "PER-Visible", "PER-Visible", PER_Visible_free, PER_Visible_print, @@ -1375,7 +1384,7 @@ PER_Visible_2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t PER_Visible_2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { PER_Visible_2_inherit_TYPE_descriptor(td); @@ -1405,6 +1414,7 @@ static ber_tlv_tag_t asn_DEF_PER_Visible_2_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_PER_Visible_2 = { + "PER-Visible-2", "PER-Visible-2", PER_Visible_2_free, PER_Visible_2_print, @@ -1517,7 +1527,7 @@ Not_PER_Visible_1_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t Not_PER_Visible_1_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Not_PER_Visible_1_inherit_TYPE_descriptor(td); @@ -1547,6 +1557,7 @@ static ber_tlv_tag_t asn_DEF_Not_PER_Visible_1_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_1 = { + "Not-PER-Visible-1", "Not-PER-Visible-1", Not_PER_Visible_1_free, Not_PER_Visible_1_print, @@ -1659,7 +1670,7 @@ Not_PER_Visible_2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t Not_PER_Visible_2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Not_PER_Visible_2_inherit_TYPE_descriptor(td); @@ -1689,6 +1700,7 @@ static ber_tlv_tag_t asn_DEF_Not_PER_Visible_2_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_2 = { + "Not-PER-Visible-2", "Not-PER-Visible-2", Not_PER_Visible_2_free, Not_PER_Visible_2_print, @@ -1801,7 +1813,7 @@ Not_PER_Visible_3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t Not_PER_Visible_3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Not_PER_Visible_3_inherit_TYPE_descriptor(td); @@ -1831,6 +1843,7 @@ static ber_tlv_tag_t asn_DEF_Not_PER_Visible_3_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_3 = { + "Not-PER-Visible-3", "Not-PER-Visible-3", Not_PER_Visible_3_free, Not_PER_Visible_3_print, @@ -1946,7 +1959,7 @@ SIZE_but_not_FROM_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t SIZE_but_not_FROM_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { SIZE_but_not_FROM_inherit_TYPE_descriptor(td); @@ -1976,6 +1989,7 @@ static ber_tlv_tag_t asn_DEF_SIZE_but_not_FROM_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_SIZE_but_not_FROM = { + "SIZE-but-not-FROM", "SIZE-but-not-FROM", SIZE_but_not_FROM_free, SIZE_but_not_FROM_print, @@ -2091,7 +2105,7 @@ SIZE_and_FROM_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t SIZE_and_FROM_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { SIZE_and_FROM_inherit_TYPE_descriptor(td); @@ -2121,6 +2135,7 @@ static ber_tlv_tag_t asn_DEF_SIZE_and_FROM_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_SIZE_and_FROM = { + "SIZE-and-FROM", "SIZE-and-FROM", SIZE_and_FROM_free, SIZE_and_FROM_print, @@ -2233,7 +2248,7 @@ Neither_SIZE_nor_FROM_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t Neither_SIZE_nor_FROM_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Neither_SIZE_nor_FROM_inherit_TYPE_descriptor(td); @@ -2263,6 +2278,7 @@ static ber_tlv_tag_t asn_DEF_Neither_SIZE_nor_FROM_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Neither_SIZE_nor_FROM = { + "Neither-SIZE-nor-FROM", "Neither-SIZE-nor-FROM", Neither_SIZE_nor_FROM_free, Neither_SIZE_nor_FROM_print, @@ -2369,7 +2385,7 @@ Utf8_4_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t Utf8_4_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Utf8_4_inherit_TYPE_descriptor(td); @@ -2399,6 +2415,7 @@ static ber_tlv_tag_t asn_DEF_Utf8_4_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Utf8_4 = { + "Utf8-4", "Utf8-4", Utf8_4_free, Utf8_4_print, @@ -2533,7 +2550,7 @@ Utf8_3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t Utf8_3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Utf8_3_inherit_TYPE_descriptor(td); @@ -2563,6 +2580,7 @@ static ber_tlv_tag_t asn_DEF_Utf8_3_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Utf8_3 = { + "Utf8-3", "Utf8-3", Utf8_3_free, Utf8_3_print, @@ -2667,7 +2685,7 @@ Utf8_2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t Utf8_2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Utf8_2_inherit_TYPE_descriptor(td); @@ -2697,6 +2715,7 @@ static ber_tlv_tag_t asn_DEF_Utf8_2_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Utf8_2 = { + "Utf8-2", "Utf8-2", Utf8_2_free, Utf8_2_print, @@ -2862,7 +2881,7 @@ Identifier_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t Identifier_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { Identifier_inherit_TYPE_descriptor(td); @@ -2892,6 +2911,7 @@ static ber_tlv_tag_t asn_DEF_Identifier_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Identifier = { + "Identifier", "Identifier", Identifier_free, Identifier_print, diff --git a/tests/60-any-OK.asn1.-P b/tests/60-any-OK.asn1.-P index 59aa7b1db..f740e8a8a 100644 --- a/tests/60-any-OK.asn1.-P +++ b/tests/60-any-OK.asn1.-P @@ -53,6 +53,7 @@ static asn_SEQUENCE_specifics_t asn_DEF_T1_specs = { -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_T1 = { + "T1", "T1", SEQUENCE_free, SEQUENCE_print, @@ -129,6 +130,7 @@ static asn_SEQUENCE_specifics_t asn_DEF_T2_specs = { -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_T2 = { + "T2", "T2", SEQUENCE_free, SEQUENCE_print, diff --git a/tests/65-multi-tag-OK.asn1.-P b/tests/65-multi-tag-OK.asn1.-P index 995697ee7..4ffc4b20c 100644 --- a/tests/65-multi-tag-OK.asn1.-P +++ b/tests/65-multi-tag-OK.asn1.-P @@ -59,7 +59,7 @@ T1_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t T1_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T1_inherit_TYPE_descriptor(td); @@ -100,6 +100,7 @@ static ber_tlv_tag_t asn_DEF_T1_all_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; asn_TYPE_descriptor_t asn_DEF_T1 = { + "T1", "T1", T1_free, T1_print, @@ -180,7 +181,7 @@ T2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t T2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T2_inherit_TYPE_descriptor(td); @@ -219,6 +220,7 @@ static ber_tlv_tag_t asn_DEF_T2_all_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; asn_TYPE_descriptor_t asn_DEF_T2 = { + "T2", "T2", T2_free, T2_print, @@ -299,7 +301,7 @@ T3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t T3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T3_inherit_TYPE_descriptor(td); @@ -336,6 +338,7 @@ static ber_tlv_tag_t asn_DEF_T3_all_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; asn_TYPE_descriptor_t asn_DEF_T3 = { + "T3", "T3", T3_free, T3_print, @@ -416,7 +419,7 @@ T4_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t T4_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T4_inherit_TYPE_descriptor(td); @@ -448,6 +451,7 @@ static ber_tlv_tag_t asn_DEF_T4_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; asn_TYPE_descriptor_t asn_DEF_T4 = { + "T4", "T4", T4_free, T4_print, @@ -528,7 +532,7 @@ T5_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t T5_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T5_inherit_TYPE_descriptor(td); @@ -559,6 +563,7 @@ static ber_tlv_tag_t asn_DEF_T5_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; asn_TYPE_descriptor_t asn_DEF_T5 = { + "T5", "T5", T5_free, T5_print, @@ -658,7 +663,7 @@ T_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t T_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T_inherit_TYPE_descriptor(td); @@ -690,6 +695,7 @@ static ber_tlv_tag_t asn_DEF_T_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; asn_TYPE_descriptor_t asn_DEF_T = { + "T", "T", T_free, T_print, @@ -775,6 +781,7 @@ static asn_SEQUENCE_specifics_t asn_DEF_Ts_specs = { -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Ts = { + "Ts", "Ts", SEQUENCE_free, SEQUENCE_print, diff --git a/tests/65-multi-tag-OK.asn1.-Pfnative-types b/tests/65-multi-tag-OK.asn1.-Pfnative-types index faed7c666..796962aec 100644 --- a/tests/65-multi-tag-OK.asn1.-Pfnative-types +++ b/tests/65-multi-tag-OK.asn1.-Pfnative-types @@ -59,7 +59,7 @@ T1_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t T1_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T1_inherit_TYPE_descriptor(td); @@ -100,6 +100,7 @@ static ber_tlv_tag_t asn_DEF_T1_all_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; asn_TYPE_descriptor_t asn_DEF_T1 = { + "T1", "T1", T1_free, T1_print, @@ -180,7 +181,7 @@ T2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t T2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T2_inherit_TYPE_descriptor(td); @@ -219,6 +220,7 @@ static ber_tlv_tag_t asn_DEF_T2_all_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; asn_TYPE_descriptor_t asn_DEF_T2 = { + "T2", "T2", T2_free, T2_print, @@ -299,7 +301,7 @@ T3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t T3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T3_inherit_TYPE_descriptor(td); @@ -336,6 +338,7 @@ static ber_tlv_tag_t asn_DEF_T3_all_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; asn_TYPE_descriptor_t asn_DEF_T3 = { + "T3", "T3", T3_free, T3_print, @@ -416,7 +419,7 @@ T4_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t T4_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T4_inherit_TYPE_descriptor(td); @@ -448,6 +451,7 @@ static ber_tlv_tag_t asn_DEF_T4_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; asn_TYPE_descriptor_t asn_DEF_T4 = { + "T4", "T4", T4_free, T4_print, @@ -528,7 +532,7 @@ T5_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t T5_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T5_inherit_TYPE_descriptor(td); @@ -559,6 +563,7 @@ static ber_tlv_tag_t asn_DEF_T5_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; asn_TYPE_descriptor_t asn_DEF_T5 = { + "T5", "T5", T5_free, T5_print, @@ -658,7 +663,7 @@ T_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t T_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { T_inherit_TYPE_descriptor(td); @@ -690,6 +695,7 @@ static ber_tlv_tag_t asn_DEF_T_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; asn_TYPE_descriptor_t asn_DEF_T = { + "T", "T", T_free, T_print, @@ -775,6 +781,7 @@ static asn_SEQUENCE_specifics_t asn_DEF_Ts_specs = { -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Ts = { + "Ts", "Ts", SEQUENCE_free, SEQUENCE_print, diff --git a/tests/66-ref-simple-OK.asn1.-P b/tests/66-ref-simple-OK.asn1.-P index 025f7e953..0131c9194 100644 --- a/tests/66-ref-simple-OK.asn1.-P +++ b/tests/66-ref-simple-OK.asn1.-P @@ -39,6 +39,7 @@ static asn_SET_OF_specifics_t asn_DEF_T_specs = { 1, /* XER encoding is XMLValueList */ }; asn_TYPE_descriptor_t asn_DEF_T = { + "T", "T", SET_OF_free, SET_OF_print, @@ -128,7 +129,7 @@ SimpleType_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } -ber_dec_rval_t +asn_dec_rval_t SimpleType_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, void *bufptr, size_t size, int tag_mode) { SimpleType_inherit_TYPE_descriptor(td); @@ -158,6 +159,7 @@ static ber_tlv_tag_t asn_DEF_SimpleType_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_SimpleType = { + "SimpleType", "SimpleType", SimpleType_free, SimpleType_print, From 2d37a7d8935edd483aa17a45c332c5d04746227c Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 20 Oct 2004 15:51:16 +0000 Subject: [PATCH 0514/1469] XER support and type renaming git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@514 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ChangeLog b/ChangeLog index 4bb7e7151..4af203065 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,10 +1,12 @@ 0.9.8: 2004-Oct-20 + * Initial XER (XML) decoding implementation. * -X command line option added to asn1c to generate XML DTD. * Empty SEQUENCE and SET clauses are now allowed. * Code compiled and tested on Sun Solaris 9 @ sparc. Improved includes/defines of/for system headers. + * ber_dec_rval_t renamed into asn_dec_rval_t: more generality. 0.9.7.1: 2004-Oct-12 From 7950eab637443b32aa73c5f52a3f89d6437e5180 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 20 Oct 2004 15:54:02 +0000 Subject: [PATCH 0515/1469] new test git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@515 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/check-OCTET_STRING.c | 97 ++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 skeletons/tests/check-OCTET_STRING.c diff --git a/skeletons/tests/check-OCTET_STRING.c b/skeletons/tests/check-OCTET_STRING.c new file mode 100644 index 000000000..a69ee744f --- /dev/null +++ b/skeletons/tests/check-OCTET_STRING.c @@ -0,0 +1,97 @@ +#define EMIT_ASN_DEBUG 1 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define HEX 0 +#define BINARY 1 +#define UTF8 2 + +static void +check(int type, char *tagname, char *xmlbuf, char *verify) { + int xmllen = strlen(xmlbuf); + int verlen = verify ? strlen(verify) : 0; + asn_TYPE_descriptor_t *td = &asn_DEF_OCTET_STRING; + OCTET_STRING_t *st = 0; + asn_dec_rval_t rc; + xer_type_decoder_f *decoder = 0; + + switch(type) { + case HEX: decoder = OCTET_STRING_decode_xer_hex; break; + case BINARY: + td = &asn_DEF_BIT_STRING; + decoder = OCTET_STRING_decode_xer_binary; break; + case UTF8: decoder = OCTET_STRING_decode_xer_utf8; break; + } + + rc = decoder(0, td, (void **)&st, tagname, xmlbuf, xmllen); + printf("[%s] => [%s]:%d vs [%s]:%d, code %d\n", + xmlbuf, + st ? st->buf : 0, st ? st->size : 0, + verify, verlen, rc.code); + + if(verify) { + assert(rc.code == RC_OK); + assert(st); + assert(st->buf); + assert(st->size == verlen); + assert(!memcmp(st->buf, verify, verlen)); + } else { + assert(rc.code != RC_OK); + } +} + +int +main() { + + check(HEX, 0, "41424", + "AB@"); + + check(HEX, 0, "\n" + "41424", + "AB@"); + + check(HEX, 0, " 4 1 4 2 4 5 44 ", + "ABED"); + + /* Some hard cases */ + check(HEX, "z", "40", "@"); + check(HEX, "z", "40", "@"); + check(HEX, "z", ">40", 0); + check(HEX, "z", "40", "@"); + check(HEX, "z", ">40", 0); + + check(HEX, "tag", "4", "@"); + + check(BINARY, "tag", "", ""); + check(BINARY, "tag", "blah", 0); + check(BINARY, "tag", "01000001", "A"); + check(BINARY, "tag", "01000 00 101 00001", "AB"); + + check(UTF8, 0, "one, two, three", + "one, two, three"); + + check(UTF8, "z", "<&>", "<&>"); + check(UTF8, "z", "a<b&c>d", "ad"); + check(UTF8, "z", "a<", "a<"); + check(UTF8, "z", "a&sdfsdfsdf;b", "a&sdfsdfsdf;b"); + check(UTF8, "z", "a b", "a b"); + check(UTF8, "z", "a b", "a b"); + check(UTF8, "z", "a繃b", "a\347\271\203b"); + check(UTF8, "z", "a�b", "a�b"); + check(UTF8, "z", "", "aĬ"); + check(UTF8, "z", "a&#-300;", "a&#-300;"); + check(UTF8, "z", "ab", "a\014b"); + check(UTF8, "z", "ab", "a\001b"); + check(UTF8, "z", "a", "a\007"); + + return 0; +} + From a9f55e72a2bc92d529c880cc8156bb34016d4361 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 20 Oct 2004 15:55:52 +0000 Subject: [PATCH 0516/1469] XER checking git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@516 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/check-XER.c | 93 +++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 skeletons/tests/check-XER.c diff --git a/skeletons/tests/check-XER.c b/skeletons/tests/check-XER.c new file mode 100644 index 000000000..4b548975e --- /dev/null +++ b/skeletons/tests/check-XER.c @@ -0,0 +1,93 @@ +#include +#include +#include + +static void +check(char *tag, char *name, xer_check_tag_e value) { + xer_check_tag_e xct; + + xct = xer_check_tag(tag, strlen(tag), name); + printf("[%s] vs [%s]: %d == %d\n", + tag, name, xct, value); + assert(xct == value); +} + +static void +check_next(char *xerbuf, int expected_chunk_size, pxer_chunk_type_e expected_chunk_type) { + int stateContext = 0; + int xerbuf_len = strlen(xerbuf); + pxer_chunk_type_e ch_type; + ssize_t ch_size; + + if(expected_chunk_size == -1) + expected_chunk_size = xerbuf_len; + ch_size = xer_next_token(&stateContext, xerbuf, xerbuf_len, &ch_type); + + printf("[%s]:%d\n", xerbuf, xerbuf_len); + printf("chunk sizes: %d vs %d, chunk types: %d vs %d\n", + ch_size, expected_chunk_size, + ch_type, expected_chunk_type + ); + + if(expected_chunk_type == -1) { + assert(ch_size == 0); + } else { + assert(ch_size == expected_chunk_size); + assert(ch_type == expected_chunk_type); + } +} + +int +main() { + + check("", "", XCT_BROKEN); + check("<", "", XCT_BROKEN); + check(">", "", XCT_BROKEN); + check("", "", XCT_BROKEN); + + check("<>", "", XCT_OPENING); + check("", "", XCT_CLOSING); + + check("", "a", XCT_BROKEN); + check("<>", "a", XCT_UNEXPECTED); + check("", "a", XCT_UNEXPECTED); + + check("a", "a", XCT_BROKEN); + check("", "a", XCT_OPENING); + check("", "a", XCT_CLOSING); + check("", "a", XCT_BROKEN); + check("", "a", XCT_BOTH); + + check("", "a", XCT_OPENING); + check("", "a", XCT_CLOSING); + check("", "a", XCT_BROKEN); + check("", "a", XCT_BOTH); + + check("", "a", XCT_UNEXPECTED); + check("", "tag", XCT_OPENING); + check("", "tag", XCT_CLOSING); + check("", "tag", XCT_BROKEN); + check("", "tag", XCT_BOTH); + + + check("", "ta", XCT_UNEXPECTED); + check("", "ta", XCT_UNEXPECTED); + check("", "ta", XCT_UNEXPECTED); + check("", "ta", XCT_BROKEN); + check("", "ta", XCT_UNEXPECTED); + + check("", "tag", XCT_BOTH); + + check_next("", -1, PXER_TAG); + check_next("la", 5, PXER_TAG); + check_next("", -1, PXER_COMMENT); + + return 0; +} From 9daadb17d1cd486ba3a57405f351faab102ccc9e Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 20 Oct 2004 15:57:55 +0000 Subject: [PATCH 0517/1469] oops git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@517 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/check-OCTET_STRING.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/skeletons/tests/check-OCTET_STRING.c b/skeletons/tests/check-OCTET_STRING.c index a69ee744f..58da3874e 100644 --- a/skeletons/tests/check-OCTET_STRING.c +++ b/skeletons/tests/check-OCTET_STRING.c @@ -34,8 +34,8 @@ check(int type, char *tagname, char *xmlbuf, char *verify) { rc = decoder(0, td, (void **)&st, tagname, xmlbuf, xmllen); printf("[%s] => [%s]:%d vs [%s]:%d, code %d\n", xmlbuf, - st ? st->buf : 0, st ? st->size : 0, - verify, verlen, rc.code); + st ? st->buf : "", st ? st->size : 0, + verify ? verify : "", verlen, rc.code); if(verify) { assert(rc.code == RC_OK); From 7958f1136288036b775d8858a0fd3e0d2bf66278 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 21 Oct 2004 05:44:11 +0000 Subject: [PATCH 0518/1469] forward compatibility git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@518 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/check-OCTET_STRING.c | 4 +++- skeletons/xer_decoder.c | 12 ++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/skeletons/tests/check-OCTET_STRING.c b/skeletons/tests/check-OCTET_STRING.c index 58da3874e..059d24941 100644 --- a/skeletons/tests/check-OCTET_STRING.c +++ b/skeletons/tests/check-OCTET_STRING.c @@ -34,7 +34,7 @@ check(int type, char *tagname, char *xmlbuf, char *verify) { rc = decoder(0, td, (void **)&st, tagname, xmlbuf, xmllen); printf("[%s] => [%s]:%d vs [%s]:%d, code %d\n", xmlbuf, - st ? st->buf : "", st ? st->size : 0, + st ? (const char *)st->buf : "", st ? st->size : 0, verify ? verify : "", verlen, rc.code); if(verify) { @@ -68,6 +68,8 @@ main() { check(HEX, "z", "40", "@"); check(HEX, "z", ">40", 0); + check(HEX, "z", "ignored40stuff", "@"); + check(HEX, "tag", "4", "@"); check(BINARY, "tag", "", ""); diff --git a/skeletons/xer_decoder.c b/skeletons/xer_decoder.c index 39e830d04..96f72e9cc 100644 --- a/skeletons/xer_decoder.c +++ b/skeletons/xer_decoder.c @@ -220,11 +220,15 @@ xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, continue; case PXER_TEXT: if(ctx->phase == 0) { - /* Unexpected data */ - /* TODO: ignore whitespace? */ - RETURN(RC_FAIL); + /* + * We have to ignore whitespace here, + * but in order to be forward compatible + * with EXTENDED-XER (EMBED-VALUES, #25) + * any text is just ignored here. + */ + } else { + XER_GOT_BODY(buf_ptr, ch_size); } - XER_GOT_BODY(buf_ptr, ch_size); ADVANCE(ch_size); continue; case PXER_TAG: From 19c3a19af6c7a77f9530857f096fe92d728926e8 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 21 Oct 2004 11:19:51 +0000 Subject: [PATCH 0519/1469] more border cases git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@519 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/check-INTEGER.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/skeletons/tests/check-INTEGER.c b/skeletons/tests/check-INTEGER.c index 85e9b1116..ea686b434 100644 --- a/skeletons/tests/check-INTEGER.c +++ b/skeletons/tests/check-INTEGER.c @@ -1,9 +1,11 @@ #include -#include +#include #include #include #include #include +#include +#include #include static char *shared_scratch_start; @@ -44,6 +46,20 @@ check(uint8_t *buf, int size, long check_long, int check_ret) { assert(ret == check_ret); assert(rlong == check_long); + if(check_ret == 0) { + INTEGER_t val2; + long rlong2; + val2.buf = 0; + val2.size = 0; + ret = asn_long2INTEGER(&val2, rlong); + assert(ret == 0); + assert(val2.buf); + assert(val2.size <= val.size); /* At least as compact */ + ret = asn_INTEGER2long(&val, &rlong2); + assert(ret == 0); + assert(rlong == rlong2); + } + shared_scratch_start = scratch; ret = INTEGER_print(&asn_DEF_INTEGER, &val, 0, _print2buf, scratch); assert(shared_scratch_start < scratch + sizeof(scratch)); @@ -74,6 +90,9 @@ main(int ac, char **av) { uint8_t buf8[] = { 0x7f, 0x7e, 0x7d, 0x7c }; uint8_t buf9[] = { 0, 0x7f, 0x7e, 0x7d, 0x7c }; uint8_t buf10[] = { 0, 0, 0, 0, 0, 0, 0x7f, 0x7e, 0x7d, 0x7c }; + uint8_t buf11[] = { 0x80, 0, 0, 0 }; + uint8_t buf12[] = { 0x80, 0 }; + uint8_t buf13[] = { 0x80 }; #define CHECK(buf, val, ret) check(buf, sizeof(buf), val, ret) @@ -87,6 +106,9 @@ main(int ac, char **av) { CHECK(buf8, 0x7F7E7D7C, 0); CHECK(buf9, 0x7F7E7D7C, 0); CHECK(buf10, 0x7F7E7D7C, 0); + CHECK(buf11, 0x80000000, 0); + CHECK(buf12, -32768, 0); + CHECK(buf13, -128, 0); return 0; } From c4436cf9161a7f5aa39739b0ce3e3f09ccdbc9a7 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 21 Oct 2004 11:20:50 +0000 Subject: [PATCH 0520/1469] ber_codec_prim -> asn_codecs_prim git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@520 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_codecs_prim.c | 262 ++++++++++++++++++++++++++++++++++++ skeletons/asn_codecs_prim.h | 33 +++++ skeletons/ber_codec_prim.c | 133 ------------------ skeletons/ber_codec_prim.h | 19 --- 4 files changed, 295 insertions(+), 152 deletions(-) create mode 100644 skeletons/asn_codecs_prim.c create mode 100644 skeletons/asn_codecs_prim.h delete mode 100644 skeletons/ber_codec_prim.c delete mode 100644 skeletons/ber_codec_prim.h diff --git a/skeletons/asn_codecs_prim.c b/skeletons/asn_codecs_prim.c new file mode 100644 index 000000000..e0b545a53 --- /dev/null +++ b/skeletons/asn_codecs_prim.c @@ -0,0 +1,262 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include + +/* + * Decode an always-primitive type. + */ +asn_dec_rval_t +ber_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, + void **sptr, void *buf_ptr, size_t size, int tag_mode) { + ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)*sptr; + asn_dec_rval_t rval; + ber_tlv_len_t length; + + /* + * If the structure is not there, allocate it. + */ + if(st == NULL) { + (void *)st = *sptr = CALLOC(1, sizeof(*st)); + if(st == NULL) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + } + + ASN_DEBUG("Decoding %s as plain primitive (tm=%d)", + td->name, tag_mode); + + /* + * Check tags and extract value length. + */ + rval = ber_check_tags(opt_codec_ctx, td, 0, buf_ptr, size, + tag_mode, 0, &length, 0); + if(rval.code != RC_OK) + return rval; + + ASN_DEBUG("%s length is %d bytes", td->name, (int)length); + + /* + * Make sure we have this length. + */ + buf_ptr = ((char *)buf_ptr) + rval.consumed; + size -= rval.consumed; + if(length > (ber_tlv_len_t)size) { + rval.code = RC_WMORE; + rval.consumed = 0; + return rval; + } + + st->buf = (uint8_t *)MALLOC(length + 1); + if(st->buf) { + st->size = length; + } else { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + + memcpy(st->buf, buf_ptr, length); + st->buf[length] = '\0'; /* Just in case */ + + rval.code = RC_OK; + rval.consumed += length; + + ASN_DEBUG("Took %ld/%ld bytes to encode %s", + (long)rval.consumed, + (long)length, td->name); + + return rval; +} + +/* + * Encode an always-primitive type using DER. + */ +asn_enc_rval_t +der_encode_primitive(asn_TYPE_descriptor_t *td, void *sptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t erval; + ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)sptr; + + ASN_DEBUG("%s %s as a primitive type (tm=%d)", + cb?"Encoding":"Estimating", td->name, tag_mode); + + erval.encoded = der_write_tags(td, st->size, tag_mode, 0, tag, + cb, app_key); + ASN_DEBUG("%s wrote tags %d", td->name, (int)erval.encoded); + if(erval.encoded == -1) { + erval.failed_type = td; + erval.structure_ptr = sptr; + return erval; + } + + if(cb && st->buf) { + if(cb(st->buf, st->size, app_key) < 0) { + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = sptr; + return erval; + } + } else { + assert(st->buf || st->size == 0); + } + + erval.encoded += st->size; + + return erval; +} + +void +ASN__PRIMITIVE_TYPE_free(asn_TYPE_descriptor_t *td, void *sptr, + int contents_only) { + ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)sptr; + + if(!td || !sptr) + return; + + ASN_DEBUG("Freeing %s as a primitive type", td->name); + + if(st->buf) + FREEMEM(st->buf); + + if(!contents_only) + FREEMEM(st); +} + + +/* + * Local internal type passed around as an argument. + */ +struct xdp_arg_s { + ASN__PRIMITIVE_TYPE_t *sptr; + ssize_t (*prim_body_decode)(ASN__PRIMITIVE_TYPE_t *sptr, + void *chunk_buf, size_t chunk_size); + int decoded_something; + int want_more; +}; + +static int +xer_decode__unexpected_tag(void *key, void *chunk_buf, size_t chunk_size) { + struct xdp_arg_s *arg = (struct xdp_arg_s *)key; + ssize_t decoded; + + if(arg->decoded_something) { + /* + * Decoding was done once already. Prohibit doing it again. + */ + return -1; + } + + decoded = arg->prim_body_decode(arg->sptr, chunk_buf, chunk_size); + if(decoded < 0) { + return -1; + } else { + /* Tag decoded successfully */ + arg->decoded_something = 1; + return 0; + } +} + +static ssize_t +xer_decode__body(void *key, void *chunk_buf, size_t chunk_size, int have_more) { + struct xdp_arg_s *arg = (struct xdp_arg_s *)key; + ssize_t decoded; + + if(arg->decoded_something) { + /* + * Decoding was done once already. Prohibit doing it again. + */ + return -1; + } + + if(!have_more) { + /* + * If we've received something like "1", we can't really + * tell whether it is really `1` or `123`, until we know + * that there is no more data coming. + * The have_more argument will be set to 1 once something + * like this is available to the caller of this callback: + * "1want_more = 1; + return -1; + } + + decoded = arg->prim_body_decode(arg->sptr, chunk_buf, chunk_size); + if(decoded < 0) { + return -1; + } else { + arg->decoded_something = 1; + return decoded; + } +} + + +asn_dec_rval_t +xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, + ASN__PRIMITIVE_TYPE_t **sptr, + const char *opt_mname, + void *buf_ptr, size_t size, + ssize_t (*prim_body_decode)(ASN__PRIMITIVE_TYPE_t *sptr, + void *chunk_buf, size_t chunk_size) +) { + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + asn_struct_ctx_t s_ctx; + struct xdp_arg_s s_arg; + asn_dec_rval_t rc; + + /* + * Create the structure if does not exist. + */ + if(!*sptr) { + *sptr = CALLOC(1, sizeof(ASN__PRIMITIVE_TYPE_t)); + if(!*sptr) { + asn_dec_rval_t rval; + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + } + + memset(&s_ctx, 0, sizeof(s_ctx)); + s_arg.sptr = *sptr; + s_arg.prim_body_decode = prim_body_decode; + s_arg.decoded_something = 0; + s_arg.want_more = 0; + + rc = xer_decode_general(opt_codec_ctx, &s_ctx, &s_arg, + xml_tag, buf_ptr, size, + xer_decode__unexpected_tag, xer_decode__body); + switch(rc.code) { + case RC_OK: + if(!s_arg.decoded_something) { + /* Opportunity has come and gone. Where's the result? */ + rc.code = RC_FAIL; + rc.consumed = 0; + } + break; + case RC_WMORE: + /* + * Redo the whole thing later. + * We don't have a context to save intermediate parsing state. + */ + rc.consumed = 0; + break; + case RC_FAIL: + rc.consumed = 0; + if(s_arg.want_more) + rc.code = RC_WMORE; + break; + } + return rc; +} + diff --git a/skeletons/asn_codecs_prim.h b/skeletons/asn_codecs_prim.h new file mode 100644 index 000000000..69ee10697 --- /dev/null +++ b/skeletons/asn_codecs_prim.h @@ -0,0 +1,33 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_CODECS_PRIM_H +#define ASN_CODECS_PRIM_H + +#include + +typedef struct ASN__PRIMITIVE_TYPE_s { + uint8_t *buf; /* Buffer with consecutive primitive encoding bytes */ + int size; /* Size of the buffer */ +} ASN__PRIMITIVE_TYPE_t; /* Do not use this type directly! */ + +asn_struct_free_f ASN__PRIMITIVE_TYPE_free; +ber_type_decoder_f ber_decode_primitive; +der_type_encoder_f der_encode_primitive; + +/* + * Specific function to decode simple primitive values + * (INTEGER, ENUMERATED, REAL, OBJECT IDENTIFIER, etc). + * Also see xer_decode_general() in xer_decoder.h + */ +asn_dec_rval_t xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *type_descriptor, + ASN__PRIMITIVE_TYPE_t **struct_ptr, + const char *opt_mname, + void *buf_ptr, size_t size, + ssize_t (*prim_body_decode)(ASN__PRIMITIVE_TYPE_t *struct_ptr, + void *chunk_buf, size_t chunk_size) + ); + +#endif /* ASN_CODECS_PRIM_H */ diff --git a/skeletons/ber_codec_prim.c b/skeletons/ber_codec_prim.c deleted file mode 100644 index 2c367aeaf..000000000 --- a/skeletons/ber_codec_prim.c +++ /dev/null @@ -1,133 +0,0 @@ -/*- - * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#include -#include -#include -#include - -/* - * Decode an always-primitive type. - */ -asn_dec_rval_t -ber_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, - asn_TYPE_descriptor_t *td, - void **sptr, void *buf_ptr, size_t size, int tag_mode) { - ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)*sptr; - asn_dec_rval_t rval; - ber_tlv_len_t length; - - /* - * If the structure is not there, allocate it. - */ - if(st == NULL) { - (void *)st = *sptr = CALLOC(1, sizeof(*st)); - if(st == NULL) { - rval.code = RC_FAIL; - rval.consumed = 0; - return rval; - } - } - - ASN_DEBUG("Decoding %s as plain primitive (tm=%d)", - td->name, tag_mode); - - /* - * Check tags and extract value length. - */ - rval = ber_check_tags(opt_codec_ctx, td, 0, buf_ptr, size, - tag_mode, 0, &length, 0); - if(rval.code != RC_OK) - return rval; - - ASN_DEBUG("%s length is %d bytes", td->name, (int)length); - - /* - * Make sure we have this length. - */ - buf_ptr = ((char *)buf_ptr) + rval.consumed; - size -= rval.consumed; - if(length > (ber_tlv_len_t)size) { - rval.code = RC_WMORE; - rval.consumed = 0; - return rval; - } - - st->buf = (uint8_t *)MALLOC(length + 1); - if(st->buf) { - st->size = length; - } else { - rval.code = RC_FAIL; - rval.consumed = 0; - return rval; - } - - memcpy(st->buf, buf_ptr, length); - st->buf[length] = '\0'; /* Just in case */ - - rval.code = RC_OK; - rval.consumed += length; - - ASN_DEBUG("Took %ld/%ld bytes to encode %s", - (long)rval.consumed, - (long)length, td->name); - - return rval; -} - -/* - * Encode an always-primitive type using DER. - */ -asn_enc_rval_t -der_encode_primitive(asn_TYPE_descriptor_t *td, void *sptr, - int tag_mode, ber_tlv_tag_t tag, - asn_app_consume_bytes_f *cb, void *app_key) { - asn_enc_rval_t erval; - ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)sptr; - - ASN_DEBUG("%s %s as a primitive type (tm=%d)", - cb?"Encoding":"Estimating", td->name, tag_mode); - - erval.encoded = der_write_tags(td, st->size, tag_mode, 0, tag, - cb, app_key); - ASN_DEBUG("%s wrote tags %d", td->name, (int)erval.encoded); - if(erval.encoded == -1) { - erval.failed_type = td; - erval.structure_ptr = sptr; - return erval; - } - - if(cb && st->buf) { - if(cb(st->buf, st->size, app_key) < 0) { - erval.encoded = -1; - erval.failed_type = td; - erval.structure_ptr = sptr; - return erval; - } - } else { - assert(st->buf || st->size == 0); - } - - erval.encoded += st->size; - - return erval; -} - -void -ASN__PRIMITIVE_TYPE_free(asn_TYPE_descriptor_t *td, void *sptr, - int contents_only) { - ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)sptr; - - if(!td || !sptr) - return; - - ASN_DEBUG("Freeing %s as a primitive type", td->name); - - if(st->buf) - FREEMEM(st->buf); - - if(!contents_only) - FREEMEM(st); -} - diff --git a/skeletons/ber_codec_prim.h b/skeletons/ber_codec_prim.h deleted file mode 100644 index aa6a5c59d..000000000 --- a/skeletons/ber_codec_prim.h +++ /dev/null @@ -1,19 +0,0 @@ -/*- - * Copyright (c) 2004 Lev Walkin . All rights reserved. - * Redistribution and modifications are permitted subject to BSD license. - */ -#ifndef _BER_CODEC_of_PRIMITIVE_TYPE_H_ -#define _BER_CODEC_of_PRIMITIVE_TYPE_H_ - -#include - -typedef struct ASN__PRIMITIVE_TYPE_s { - uint8_t *buf; /* Buffer with consecutive primitive encoding bytes */ - int size; /* Size of the buffer */ -} ASN__PRIMITIVE_TYPE_t; /* Do not use this type directly! */ - -asn_struct_free_f ASN__PRIMITIVE_TYPE_free; -ber_type_decoder_f ber_decode_primitive; -der_type_encoder_f der_encode_primitive; - -#endif /* _BER_CODEC_of_PRIMITIVE_TYPE_H_ */ From a4799a6d15f8a6c1a3c75951a12325fe7b9707f4 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 21 Oct 2004 11:21:25 +0000 Subject: [PATCH 0521/1469] XER decoding and asn_long2INTEGER() git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@521 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/INTEGER.c | 129 ++++++++++++++++++++++++++++++++++++++++++-- skeletons/INTEGER.h | 5 +- 2 files changed, 130 insertions(+), 4 deletions(-) diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index fbd927243..c4fb97210 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -1,10 +1,10 @@ /*- - * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include -#include /* Encoder and decoder of a primitive */ +#include /* Encoder and decoder of a primitive type */ #include #include @@ -22,7 +22,7 @@ asn_TYPE_descriptor_t asn_DEF_INTEGER = { asn_generic_no_constraint, ber_decode_primitive, INTEGER_encode_der, - 0, /* Not implemented yet */ + INTEGER_decode_xer, INTEGER_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_INTEGER_tags, @@ -176,6 +176,84 @@ INTEGER_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, return (ret < 0) ? -1 : 0; } +/* + * Decode the chunk of XML text encoding INTEGER. + */ +static ssize_t +INTEGER__xer_body_decode(INTEGER_t *st, void *chunk_buf, size_t chunk_size) { + long sign = 1; + long value; + char *lstart = (char *)chunk_buf; + char *lstop = chunk_buf + chunk_size; + enum { + ST_SKIPSPACE, + ST_WAITDIGITS, + ST_DIGITS, + } state = ST_SKIPSPACE; + /* + * We may receive a tag here. But we aren't ready to deal with it yet. + * So, just use stroul()-like code and serialize the result. + */ + for(value = 0; lstart < lstop; lstart++) { + int lv = *lstart; + switch(lv) { + case 0x09: case 0x0a: case 0x0d: case 0x20: + if(state == ST_SKIPSPACE) continue; + break; + case 0x2d: /* '-' */ + if(state == ST_SKIPSPACE) { + sign = -1; + state = ST_WAITDIGITS; + continue; + } + break; + case 0x2b: /* '+' */ + if(state == ST_SKIPSPACE) { + state = ST_WAITDIGITS; + continue; + } + break; + case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: + case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: + if(state != ST_DIGITS) state = ST_DIGITS; + + value = value * 10 + (lv - 0x30); + /* Check for two's complement overflow */ + if(value < 0) { + /* Check whether it is a LONG_MIN */ + if(sign == -1 + && value == ~((unsigned long)-1 >> 1)) { + sign = 0; + } else { + /* Overflow */ + return -1; + } + } + continue; + } + } + + if(state != ST_DIGITS) + return -1; /* No digits */ + + value *= sign; /* Change sign, if needed */ + + if(asn_long2INTEGER(st, value)) + return -1; + + return lstop - lstart; +} + +asn_dec_rval_t +INTEGER_decode_xer(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, + void *buf_ptr, size_t size) { + + return xer_decode_primitive(opt_codec_ctx, td, + (ASN__PRIMITIVE_TYPE_t **)sptr, opt_mname, + buf_ptr, size, INTEGER__xer_body_decode); +} + asn_enc_rval_t INTEGER_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, @@ -254,3 +332,48 @@ asn_INTEGER2long(const INTEGER_t *iptr, long *lptr) { *lptr = l; return 0; } + +int +asn_long2INTEGER(INTEGER_t *st, long value) { + uint8_t *buf, *bp; + uint8_t *p; + uint8_t *pstart; + uint8_t *pend1; + + if(!st) { + errno = EINVAL; + return -1; + } + + buf = MALLOC(sizeof(value)); + if(!buf) return -1; + + pstart = (uint8_t *)&value; + pend1 = pstart + sizeof(value) - 1; + /* + * If the contents octet consists of more than one octet, + * then bits of the first octet and bit 8 of the second octet: + * a) shall not all be ones; and + * b) shall not all be zero. + */ + for(p = pstart; p < pend1; p++) { + switch(*p) { + case 0x00: if((p[1] & 0x80) == 0) + continue; + break; + case 0xff: if((p[1] & 0x80)) + continue; + break; + } + break; + } + /* Copy the integer body */ + for(pstart = p, bp = buf; p <= pend1;) + *bp++ = *p++; + + if(st->buf) FREEMEM(st->buf); + st->buf = buf; + st->size = p - pstart; + + return 0; +} diff --git a/skeletons/INTEGER.h b/skeletons/INTEGER.h index eb7e9c9fc..45259e239 100644 --- a/skeletons/INTEGER.h +++ b/skeletons/INTEGER.h @@ -6,7 +6,7 @@ #define _INTEGER_H_ #include -#include +#include typedef ASN__PRIMITIVE_TYPE_t INTEGER_t; @@ -15,6 +15,7 @@ extern asn_TYPE_descriptor_t asn_DEF_INTEGER; asn_struct_print_f INTEGER_print; ber_type_decoder_f INTEGER_decode_ber; der_type_encoder_f INTEGER_encode_der; +xer_type_decoder_f INTEGER_decode_xer; xer_type_encoder_f INTEGER_encode_xer; /*********************************** @@ -25,7 +26,9 @@ xer_type_encoder_f INTEGER_encode_xer; * Returns 0 if it was possible to convert, -1 otherwise. * -1/EINVAL: Mandatory argument missing * -1/ERANGE: Value encoded is out of range for long representation + * -1/ENOMEM: Memory allocation failed (in asn_long2INTEGER()). */ int asn_INTEGER2long(const INTEGER_t *i, long *l); +int asn_long2INTEGER(INTEGER_t *i, long l); #endif /* _INTEGER_H_ */ From 91e59f94de120f7222e52b8877e1e8795e0e1fb1 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 21 Oct 2004 11:21:43 +0000 Subject: [PATCH 0522/1469] comments and renaming git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@522 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/file-dependencies | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/skeletons/file-dependencies b/skeletons/file-dependencies index a95d98bfe..3e26fffbe 100644 --- a/skeletons/file-dependencies +++ b/skeletons/file-dependencies @@ -48,12 +48,13 @@ asn_codecs.h asn_system.h # Platform-dependent types OCTET_STRING.h OCTET_STRING.c # This one is used too widely BIT_STRING.h BIT_STRING.c # This one is necessary for the above one -ber_decoder.h ber_decoder.c -ber_codec_prim.c ber_codec_prim.h -ber_tlv_length.h ber_tlv_length.c -ber_tlv_tag.h ber_tlv_tag.c -constr_TYPE.h constr_TYPE.c -constraints.h constraints.c -der_encoder.h der_encoder.c -xer_decoder.h xer_decoder.c xer_support.h xer_support.c # XER/XML decoding -xer_encoder.h xer_encoder.c +asn_codecs_prim.c asn_codecs_prim.h # enc/decoders for primitive types +ber_tlv_length.h ber_tlv_length.c # BER TLV L (length) +ber_tlv_tag.h ber_tlv_tag.c # BER TLV T (tag) +ber_decoder.h ber_decoder.c # BER decoder support code +der_encoder.h der_encoder.c # DER encoder support code +constr_TYPE.h constr_TYPE.c # Description of a type +constraints.h constraints.c # Subtype constraints support +xer_support.h xer_support.c # XML parsing +xer_decoder.h xer_decoder.c # XER decoding support +xer_encoder.h xer_encoder.c # XER encoding support From 3b6e1122b674d563d8b8760e784a343892ae958b Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 21 Oct 2004 11:22:12 +0000 Subject: [PATCH 0523/1469] renaming git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@523 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ENUMERATED.c | 2 +- skeletons/OBJECT_IDENTIFIER.h | 2 +- skeletons/REAL.h | 2 +- skeletons/RELATIVE-OID.c | 2 +- skeletons/xer_decoder.c | 10 +++++----- skeletons/xer_decoder.h | 6 +++--- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/skeletons/ENUMERATED.c b/skeletons/ENUMERATED.c index 83a71d070..3d07c0100 100644 --- a/skeletons/ENUMERATED.c +++ b/skeletons/ENUMERATED.c @@ -4,7 +4,7 @@ */ #include #include -#include +#include /* Encoder and decoder of a primitive type */ /* * ENUMERATED basic type description. diff --git a/skeletons/OBJECT_IDENTIFIER.h b/skeletons/OBJECT_IDENTIFIER.h index 8945a32da..668bd495f 100644 --- a/skeletons/OBJECT_IDENTIFIER.h +++ b/skeletons/OBJECT_IDENTIFIER.h @@ -6,7 +6,7 @@ #define _OBJECT_IDENTIFIER_H_ #include -#include +#include typedef ASN__PRIMITIVE_TYPE_t OBJECT_IDENTIFIER_t; diff --git a/skeletons/REAL.h b/skeletons/REAL.h index bd5979940..86ae40f02 100644 --- a/skeletons/REAL.h +++ b/skeletons/REAL.h @@ -6,7 +6,7 @@ #define ASN_TYPE_REAL_H #include -#include +#include typedef ASN__PRIMITIVE_TYPE_t REAL_t; diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index eba1eaa40..13fa0e2be 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -4,7 +4,7 @@ */ #include #include -#include /* Encoder and decoder of a primitive */ +#include /* Encoder and decoder of a primitive type */ #include /* for CHAR_BIT */ #include #include diff --git a/skeletons/xer_decoder.c b/skeletons/xer_decoder.c index 96f72e9cc..9cbccf816 100644 --- a/skeletons/xer_decoder.c +++ b/skeletons/xer_decoder.c @@ -161,7 +161,7 @@ xer_check_tag(const void *buf_ptr, int size, const char *need_tag) { #define XER_GOT_BODY(chunk_buf, chunk_size) do { \ ssize_t converted_size = body_receiver \ - (struct_ptr, chunk_buf, chunk_size, \ + (struct_key, chunk_buf, chunk_size, \ (size_t)chunk_size < size); \ if(converted_size == -1) RETURN(RC_FAIL); \ chunk_size = converted_size; \ @@ -177,13 +177,13 @@ xer_check_tag(const void *buf_ptr, int size, const char *need_tag) { asn_dec_rval_t xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, asn_struct_ctx_t *ctx, /* Type decoder context */ - void *struct_ptr, /* The structure must be already allocated */ + void *struct_key, const char *xml_tag, /* Expected XML tag */ void *buf_ptr, size_t size, int (*opt_unexpected_tag_decoder) - (void *struct_ptr, void *chunk_buf, size_t chunk_size), + (void *struct_key, void *chunk_buf, size_t chunk_size), ssize_t (*body_receiver) - (void *struct_ptr, void *chunk_buf, size_t chunk_size, + (void *struct_key, void *chunk_buf, size_t chunk_size, int have_more) ) { @@ -272,7 +272,7 @@ xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, * Certain tags in the body may be expected. */ if(opt_unexpected_tag_decoder - && opt_unexpected_tag_decoder(struct_ptr, + && opt_unexpected_tag_decoder(struct_key, buf_ptr, ch_size) == 0) { /* Tag's processed fine */ ADVANCE(ch_size); diff --git a/skeletons/xer_decoder.h b/skeletons/xer_decoder.h index e258b5b86..b8aef662a 100644 --- a/skeletons/xer_decoder.h +++ b/skeletons/xer_decoder.h @@ -41,13 +41,13 @@ typedef asn_dec_rval_t (xer_type_decoder_f)(asn_codec_ctx_t *opt_codec_ctx, */ asn_dec_rval_t xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, asn_struct_ctx_t *ctx, /* Type decoder context */ - void *struct_ptr, /* The structure must be already allocated */ + void *struct_key, /* Treated as opaque pointer */ const char *xml_tag, /* Expected XML tag name */ void *buf_ptr, size_t size, int (*opt_unexpected_tag_decoder) - (void *struct_ptr, void *chunk_buf, size_t chunk_size), + (void *struct_key, void *chunk_buf, size_t chunk_size), ssize_t (*body_receiver) - (void *struct_ptr, void *chunk_buf, size_t chunk_size, + (void *struct_key, void *chunk_buf, size_t chunk_size, int have_more) ); From e3e88c743c044ff75b9386af6651e5813894a6de Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 21 Oct 2004 11:23:12 +0000 Subject: [PATCH 0524/1469] temporary using INTEGER XER decoding git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@524 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ENUMERATED.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/skeletons/ENUMERATED.c b/skeletons/ENUMERATED.c index 3d07c0100..12d4f6ebe 100644 --- a/skeletons/ENUMERATED.c +++ b/skeletons/ENUMERATED.c @@ -20,8 +20,8 @@ asn_TYPE_descriptor_t asn_DEF_ENUMERATED = { asn_generic_no_constraint, ber_decode_primitive, INTEGER_encode_der, /* Implemented in terms of INTEGER */ - 0, /* Not implemented yet */ - INTEGER_encode_xer, /* Implemented in terms of INTEGER */ + INTEGER_decode_xer, /* This is temporary! */ + INTEGER_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_ENUMERATED_tags, sizeof(asn_DEF_ENUMERATED_tags) / sizeof(asn_DEF_ENUMERATED_tags[0]), From e4f9cac8e2134d37ebd23ca7c090c74a73d5673b Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 21 Oct 2004 12:11:57 +0000 Subject: [PATCH 0525/1469] INTEGER XER decoding git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@525 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/INTEGER.c | 21 ++++++++--- skeletons/asn_codecs_prim.c | 28 +++++++++++++++ skeletons/tests/check-INTEGER.c | 63 +++++++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+), 5 deletions(-) diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index c4fb97210..1037bdd42 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -183,6 +183,7 @@ static ssize_t INTEGER__xer_body_decode(INTEGER_t *st, void *chunk_buf, size_t chunk_size) { long sign = 1; long value; + char *lp; char *lstart = (char *)chunk_buf; char *lstop = chunk_buf + chunk_size; enum { @@ -190,12 +191,13 @@ INTEGER__xer_body_decode(INTEGER_t *st, void *chunk_buf, size_t chunk_size) { ST_WAITDIGITS, ST_DIGITS, } state = ST_SKIPSPACE; + /* * We may receive a tag here. But we aren't ready to deal with it yet. * So, just use stroul()-like code and serialize the result. */ - for(value = 0; lstart < lstop; lstart++) { - int lv = *lstart; + for(value = 0, lp = lstart; lp < lstop; lp++) { + int lv = *lp; switch(lv) { case 0x09: case 0x0a: case 0x0d: case 0x20: if(state == ST_SKIPSPACE) continue; @@ -217,20 +219,29 @@ INTEGER__xer_body_decode(INTEGER_t *st, void *chunk_buf, size_t chunk_size) { case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: if(state != ST_DIGITS) state = ST_DIGITS; - value = value * 10 + (lv - 0x30); + { + long new_value = value * 10; + + if(new_value / 10 != value) + /* Overflow */ + return -1; + + value = new_value + (lv - 0x30); /* Check for two's complement overflow */ if(value < 0) { /* Check whether it is a LONG_MIN */ if(sign == -1 && value == ~((unsigned long)-1 >> 1)) { - sign = 0; + sign = 1; } else { /* Overflow */ return -1; } } + } continue; } + break; } if(state != ST_DIGITS) @@ -241,7 +252,7 @@ INTEGER__xer_body_decode(INTEGER_t *st, void *chunk_buf, size_t chunk_size) { if(asn_long2INTEGER(st, value)) return -1; - return lstop - lstart; + return lp - lstart; } asn_dec_rval_t diff --git a/skeletons/asn_codecs_prim.c b/skeletons/asn_codecs_prim.c index e0b545a53..879147563 100644 --- a/skeletons/asn_codecs_prim.c +++ b/skeletons/asn_codecs_prim.c @@ -143,12 +143,38 @@ struct xdp_arg_s { int want_more; }; +/* + * Check whether this buffer consists of entirely XER whitespace characters. + */ +static int +xer_decode__check_whitespace(void *chunk_buf, size_t chunk_size) { + char *p = (char *)chunk_buf; + char *pend = p + chunk_size; + for(; p < pend; p++) { + switch(*p) { + /* X.693, #8.1.4 + * HORISONTAL TAB (9) + * LINE FEED (10) + * CARRIAGE RETURN (13) + * SPACE (32) + */ + case 0x09: case 0x0a: case 0x0d: case 0x20: + break; + default: + return 0; + } + } + return 1; /* All whitespace */ +} + static int xer_decode__unexpected_tag(void *key, void *chunk_buf, size_t chunk_size) { struct xdp_arg_s *arg = (struct xdp_arg_s *)key; ssize_t decoded; if(arg->decoded_something) { + if(xer_decode__check_whitespace(chunk_buf, chunk_size)) + return chunk_size; /* * Decoding was done once already. Prohibit doing it again. */ @@ -171,6 +197,8 @@ xer_decode__body(void *key, void *chunk_buf, size_t chunk_size, int have_more) { ssize_t decoded; if(arg->decoded_something) { + if(xer_decode__check_whitespace(chunk_buf, chunk_size)) + return chunk_size; /* * Decoding was done once already. Prohibit doing it again. */ diff --git a/skeletons/tests/check-INTEGER.c b/skeletons/tests/check-INTEGER.c index ea686b434..81aae6e5e 100644 --- a/skeletons/tests/check-INTEGER.c +++ b/skeletons/tests/check-INTEGER.c @@ -78,6 +78,34 @@ check(uint8_t *buf, int size, long check_long, int check_ret) { } } +static void +check_xer(int tofail, char *xmldata, long orig_value) { + INTEGER_t *st = 0; + asn_dec_rval_t rc; + long value; + int ret; + + printf("[%s] vs %ld:\n", xmldata, orig_value); + + rc = xer_decode(0, &asn_DEF_INTEGER, (void *)&st, + xmldata, strlen(xmldata)); + if(rc.code != RC_OK) { + assert(tofail); + printf("\tfailed, as expected\n"); + return; + } + assert(!tofail); + + ret = asn_INTEGER2long(st, &value); + assert(ret == 0); + + printf("\t%ld\n", value); + + assert(value == orig_value); + + asn_DEF_INTEGER.free_struct(&asn_DEF_INTEGER, st, 0); +} + int main(int ac, char **av) { uint8_t buf1[] = { 1 }; @@ -110,5 +138,40 @@ main(int ac, char **av) { CHECK(buf12, -32768, 0); CHECK(buf13, -128, 0); + check_xer(-1, "", 0); + check_xer(-1, "", 0); + check_xer(-1, "-", 0); + check_xer(-1, "+", 0); + check_xer(-1, "+-", 0); + check_xer(0, "+0", 0); + check_xer(0, "-0", 0); + check_xer(0, "+1", 1); + check_xer(0, "-1", -1); + check_xer(0, "1", 1); + check_xer(0, "-15", -15); + check_xer(0, "+15", 15); + check_xer(0, "15", 15); + check_xer(0, " 15", 15); + check_xer(0, " 15 ", 15); + check_xer(0, "15 ", 15); + check_xer(0, " +15 ", 15); + check_xer(-1, " +15 -", 0); + check_xer(-1, " +15 1", 0); + check_xer(-1, "+ 15", 0); + check_xer(-1, "1234", 0); + check_xer(0, "1234", 1234); + check_xer(-1, "1234 5678", 0); + check_xer(0, "-2147483647", -2147483647); + check_xer(0, "-2147483648", -2147483648); + check_xer(0, "+2147483647", 2147483647); + check_xer(0, "2147483647", 2147483647); + check_xer(-1, "2147483648", 0); + check_xer(-1, "2147483649", 0); + check_xer(-1, "3147483649", 0); + check_xer(-1, "4147483649", 0); + check_xer(-1, "5147483649", 0); /* unobvious */ + check_xer(-1, "9147483649", 0); + check_xer(-1, "9999999999", 0); + return 0; } From ce3debb95f06b372c094a397cbe79fcf33723dc8 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 21 Oct 2004 12:21:54 +0000 Subject: [PATCH 0526/1469] API changes git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@526 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/unber.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/asn1c/unber.c b/asn1c/unber.c index ecd2a1b0b..90468b43a 100644 --- a/asn1c/unber.c +++ b/asn1c/unber.c @@ -46,7 +46,7 @@ #include #include #include -#include +#include static void usage(const char *av0); /* Print the Usage screen and exit */ static int process(const char *fname); /* Perform the BER decoding */ @@ -693,4 +693,8 @@ decode_tlv_from_string(const char *datastring) { * Dummy functions. */ asn_dec_rval_t ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_struct_ctx_t *opt_ctx, void *ptr, size_t size, int tag_mode, int last_tag_form, ber_tlv_len_t *last_length, int *opt_tlv_form) { asn_dec_rval_t rv; (void)opt_codec_ctx; (void)td; (void)opt_ctx; (void)ptr; (void)size; (void)tag_mode; (void)last_tag_form; (void)last_length; (void)opt_tlv_form; return rv; } + ssize_t der_write_tags(asn_TYPE_descriptor_t *td, size_t slen, int tag_mode, int last_tag_form, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { (void)td; (void)slen; (void)tag_mode; (void)last_tag_form; (void)tag; (void)cb; (void)app_key; return -1; } + +asn_dec_rval_t xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, asn_struct_ctx_t *ctx, void *struct_key, const char *xml_tag, void *buf_ptr, size_t size, int (*otd)(void *struct_key, void *chunk_buf, size_t chunk_size), ssize_t (*br)(void *struct_key, void *chunk_buf, size_t chunk_size, int have_more)) { asn_dec_rval_t rv; (void)opt_codec_ctx; (void)ctx; (void)struct_key; (void)xml_tag; (void)buf_ptr; (void)size; (void)otd; (void)br; return rv; } + From 485cd66288e2ec34ac216a6dbf9f46e9d80ca39b Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 21 Oct 2004 12:23:16 +0000 Subject: [PATCH 0527/1469] XER handling bug git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@527 59561ff5-6e30-0410-9f3c-9617f08c8826 --- BUGS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/BUGS b/BUGS index b921955a3..2d96f7573 100644 --- a/BUGS +++ b/BUGS @@ -29,3 +29,6 @@ decoder is perfectly capable of decoding such sequences. 5. Encoding or decoding of structures with combined length greater than 16MB is not tested. +6. XER decoding does not support integer (INTEGER, ENUMERATED) values +outside the signed long range. + From cdc58f433ffaeb49c0986572868cd32917190e3e Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 21 Oct 2004 12:23:41 +0000 Subject: [PATCH 0528/1469] just whitespace git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@528 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/check-INTEGER.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/skeletons/tests/check-INTEGER.c b/skeletons/tests/check-INTEGER.c index 81aae6e5e..9f9aecfed 100644 --- a/skeletons/tests/check-INTEGER.c +++ b/skeletons/tests/check-INTEGER.c @@ -85,7 +85,7 @@ check_xer(int tofail, char *xmldata, long orig_value) { long value; int ret; - printf("[%s] vs %ld:\n", xmldata, orig_value); + printf("[%s] vs %ld: ", xmldata, orig_value); rc = xer_decode(0, &asn_DEF_INTEGER, (void *)&st, xmldata, strlen(xmldata)); @@ -140,6 +140,7 @@ main(int ac, char **av) { check_xer(-1, "", 0); check_xer(-1, "", 0); + check_xer(-1, " ", 0); check_xer(-1, "-", 0); check_xer(-1, "+", 0); check_xer(-1, "+-", 0); From 69be6fa1e5d4b19b6cf35354132789943cee4389 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 21 Oct 2004 12:23:47 +0000 Subject: [PATCH 0529/1469] renaming git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@529 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/check-OIDs.c | 4 +++- skeletons/tests/check-REAL.c | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/skeletons/tests/check-OIDs.c b/skeletons/tests/check-OIDs.c index 436e01325..8033d7cc5 100644 --- a/skeletons/tests/check-OIDs.c +++ b/skeletons/tests/check-OIDs.c @@ -1,10 +1,12 @@ #include #include -#include +#include #include #include #include #include +#include +#include #include #include diff --git a/skeletons/tests/check-REAL.c b/skeletons/tests/check-REAL.c index 33f69182a..d0bf3fca4 100644 --- a/skeletons/tests/check-REAL.c +++ b/skeletons/tests/check-REAL.c @@ -1,10 +1,12 @@ #define EMIT_ASN_DEBUG 1 #include -#include +#include #include #include #include #include +#include +#include #include static char reconstructed[2][512]; From cce2ddbed4d0a80abb772552cd067e22057b4003 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 21 Oct 2004 13:37:57 +0000 Subject: [PATCH 0530/1469] XER decoding of a REAL git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@530 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/REAL.c | 106 +++++++++++++++++++++++++++++++---- skeletons/REAL.h | 1 + skeletons/tests/check-REAL.c | 70 +++++++++++++++++++++++ 3 files changed, 167 insertions(+), 10 deletions(-) diff --git a/skeletons/REAL.c b/skeletons/REAL.c index c61f72332..ace2f14ac 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -31,7 +31,7 @@ asn_TYPE_descriptor_t asn_DEF_REAL = { asn_generic_no_constraint, ber_decode_primitive, der_encode_primitive, - 0, /* Not implemented yet */ + REAL_decode_xer, REAL_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_REAL_tags, @@ -42,6 +42,23 @@ asn_TYPE_descriptor_t asn_DEF_REAL = { 0 /* No specifics */ }; +typedef enum specialRealValue { + SRV__NOT_A_NUMBER, + SRV__MINUS_INFINITY, + SRV__PLUS_INFINITY +} specialRealValue_e; +static struct specialRealValue_s { + char *string; + int length; + double dv; +} specialRealValue[] = { +#define SRV_SET(foo, val) { foo, sizeof(foo) - 1, val } + SRV_SET("", 0.0), + SRV_SET("", -1.0), + SRV_SET("", 1.0), +#undef SRV_SET +}; + ssize_t REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) { char local_buf[64]; @@ -55,16 +72,16 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) */ /* fpclassify(3) is not portable yet */ if(isnan(d)) { - buf = ""; - buflen = 15; + buf = specialRealValue[SRV__NOT_A_NUMBER].string; + buflen = specialRealValue[SRV__NOT_A_NUMBER].length; return (cb(buf, buflen, app_key) < 0) ? -1 : buflen; } else if(!finite(d)) { if(copysign(1.0, d) < 0.0) { - buf = ""; - buflen = 17; + buf = specialRealValue[SRV__MINUS_INFINITY].string; + buflen = specialRealValue[SRV__MINUS_INFINITY].length; } else { - buf = ""; - buflen = 16; + buf = specialRealValue[SRV__PLUS_INFINITY].string; + buflen = specialRealValue[SRV__PLUS_INFINITY].length; } return (cb(buf, buflen, app_key) < 0) ? -1 : buflen; } else if(ilogb(d) <= -INT_MAX) { @@ -99,12 +116,13 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) if(canonical) { /* * Transform the "[-]d.dddE+-dd" output into "[-]d.dddE[-]d" + * Check that snprintf() constructed the output correctly. */ char *dot, *E; char *end = buf + buflen; char *last_zero; - dot = (buf[0] == '-') ? (buf + 2) : (buf + 1); + dot = (buf[0] == 0x2d /* '-' */) ? (buf + 2) : (buf + 1); if(*dot >= 0x30) { errno = EINVAL; return -1; /* Not a dot, really */ @@ -116,7 +134,7 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) char *expptr = ++E; char *s = expptr; int sign; - if(*expptr == '+') { + if(*expptr == 0x2b /* '+' */) { /* Skip the "+" */ buflen -= 1; sign = 0; @@ -135,8 +153,12 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) } if(*last_zero == 0x30) { *last_zero = 0x45; /* E */ + buflen -= s - (last_zero + 1); s = last_zero + 1; - if(sign) *s++ = '-'; + if(sign) { + *s++ = 0x2d /* '-' */; + buflen++; + } } for(; expptr <= end; s++, expptr++) *s = *expptr; @@ -221,6 +243,69 @@ REAL_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, return er; } + +/* + * Decode the chunk of XML text encoding REAL. + */ +static ssize_t +REAL__xer_body_decode(REAL_t *st, void *chunk_buf, size_t chunk_size) { + double value; + char *xerdata = (char *)chunk_buf; + char *endptr = 0; + char *b; + + if(!chunk_size) return -1; + + /* + * Decode an XMLSpecialRealValue: , etc. + */ + if(xerdata[0] == 0x3c /* '<' */) { + size_t i; + for(i = 0; i < sizeof(specialRealValue) + / sizeof(specialRealValue[0]); i++) { + struct specialRealValue_s *srv = &specialRealValue[i]; + if(srv->length != chunk_size + || memcmp(srv->string, chunk_buf, chunk_size)) + continue; + + if(asn_double2REAL(st, srv->dv / real_zero)) + return -1; + + return chunk_size; + } + ASN_DEBUG("Unknown XMLSpecialRealValue"); + return -1; + } + + /* + * Copy chunk into the nul-terminated string, and run strtod. + */ + b = MALLOC(chunk_size + 1); + if(!b) return -1; + memcpy(b, chunk_buf, chunk_size); + b[chunk_size] = 0; + + value = strtod(b, &endptr); + free(b); + if(endptr == b) return -1; + + if(asn_double2REAL(st, value)) + return -1; + + return endptr - b; +} + +asn_dec_rval_t +REAL_decode_xer(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, + void *buf_ptr, size_t size) { + + return xer_decode_primitive(opt_codec_ctx, td, + (ASN__PRIMITIVE_TYPE_t **)sptr, opt_mname, + buf_ptr, size, REAL__xer_body_decode); +} + + int asn_REAL2double(const REAL_t *st, double *dbl_value) { unsigned int octv; @@ -344,6 +429,7 @@ asn_REAL2double(const REAL_t *st, double *dbl_value) { m = scalbn(m, 8) + *ptr; } + if(0) ASN_DEBUG("m=%.10f, scF=%d, bF=%d, expval=%d, ldexp()=%f, scalbn()=%f", m, scaleF, baseF, expval, ldexp(m, expval * baseF + scaleF), diff --git a/skeletons/REAL.h b/skeletons/REAL.h index 86ae40f02..114b7e564 100644 --- a/skeletons/REAL.h +++ b/skeletons/REAL.h @@ -13,6 +13,7 @@ typedef ASN__PRIMITIVE_TYPE_t REAL_t; extern asn_TYPE_descriptor_t asn_DEF_REAL; asn_struct_print_f REAL_print; +xer_type_decoder_f REAL_decode_xer; xer_type_encoder_f REAL_encode_xer; /*********************************** diff --git a/skeletons/tests/check-REAL.c b/skeletons/tests/check-REAL.c index d0bf3fca4..094017d2d 100644 --- a/skeletons/tests/check-REAL.c +++ b/skeletons/tests/check-REAL.c @@ -7,6 +7,7 @@ #include #include #include +#include #include static char reconstructed[2][512]; @@ -142,6 +143,64 @@ check_buf(uint8_t *buf, size_t bufsize, double verify, const char *sample, const check_str_repr(val, sample, canonical_sample); } +static void +check_xer(int fuzzy, double orig_value) { + asn_enc_rval_t er; + asn_dec_rval_t rc; + REAL_t st; + REAL_t *newst0 = 0; + REAL_t *newst1 = 0; + double value0, value1; + int ret; + + memset(&st, 0, sizeof(st)); + ret = asn_double2REAL(&st, orig_value); + assert(ret == 0); + + reconstr_lens[0] = 0; + reconstr_lens[1] = 0; + er = xer_encode(&asn_DEF_REAL, &st, + XER_F_BASIC, callback, 0); + assert(er.encoded == reconstr_lens[0]); + er = xer_encode(&asn_DEF_REAL, &st, + XER_F_CANONICAL, callback, (void *)1); + assert(er.encoded == reconstr_lens[1]); + reconstructed[0][reconstr_lens[0]] = 0; + reconstructed[1][reconstr_lens[1]] = 0; + + printf("%f vs (%d)[%s] & (%d)%s", + orig_value, + reconstr_lens[1], reconstructed[1], + reconstr_lens[0], reconstructed[0] + ); + + rc = xer_decode(0, &asn_DEF_REAL, (void **)&newst0, + reconstructed[0], reconstr_lens[0]); + assert(rc.code == RC_OK); + assert(rc.consumed < reconstr_lens[0]); + + rc = xer_decode(0, &asn_DEF_REAL, (void **)&newst1, + reconstructed[1], reconstr_lens[1]); + assert(rc.code == RC_OK); + assert(rc.consumed == reconstr_lens[1]); + + ret = asn_REAL2double(newst0, &value0); + assert(ret == 0); + ret = asn_REAL2double(newst1, &value1); + assert(ret == 0); + + assert(value0 == orig_value + || (isnan(value0) && isnan(orig_value)) + || fuzzy); + assert(value1 == orig_value + || (isnan(value1) && isnan(orig_value))); + + assert(newst0->size == st.size || fuzzy); + assert(newst1->size == st.size); + assert(fuzzy || memcmp(newst0->buf, st.buf, st.size) == 0); + assert(memcmp(newst1->buf, st.buf, st.size) == 0); +} + int main() { REAL_t rn; @@ -190,5 +249,16 @@ main() { check_buf(buf_mo1, sizeof(buf_mo1), -3.14, "-3.14", "-3.14E0"); check_buf(buf_mo2, sizeof(buf_mo2), 3.14, "3.14", "3.14E0"); + + check_xer(0, zero/zero); /* "" */ + check_xer(0, 1.0/zero); /* "" */ + check_xer(0, -1.0/zero); /* "" */ + check_xer(0, 1.0); + check_xer(0, -1.0); + check_xer(0, 1.5); + check_xer(0, 123); + check_xer(1, 0.0000000000000000000001); + check_xer(1, -0.0000000000000000000001); + return 0; } From b848b2a0bf15d23259d31ab07d6ae67ec2785d1e Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 21 Oct 2004 14:02:19 +0000 Subject: [PATCH 0531/1469] brushing up git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@531 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/INTEGER.c | 12 +++++++----- skeletons/NativeReal.c | 37 ++++++++++++++++++++++++++++++++++++- skeletons/NativeReal.h | 1 + skeletons/REAL.c | 11 ++++++----- skeletons/asn_codecs_prim.c | 17 +++++++++-------- skeletons/asn_codecs_prim.h | 7 +++---- 6 files changed, 62 insertions(+), 23 deletions(-) diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 1037bdd42..e855a4a03 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -180,12 +180,13 @@ INTEGER_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, * Decode the chunk of XML text encoding INTEGER. */ static ssize_t -INTEGER__xer_body_decode(INTEGER_t *st, void *chunk_buf, size_t chunk_size) { +INTEGER__xer_body_decode(void *sptr, void *chunk_buf, size_t chunk_size) { + INTEGER_t *st = (INTEGER_t *)sptr; long sign = 1; long value; char *lp; char *lstart = (char *)chunk_buf; - char *lstop = chunk_buf + chunk_size; + char *lstop = lstart + chunk_size; enum { ST_SKIPSPACE, ST_WAITDIGITS, @@ -231,7 +232,8 @@ INTEGER__xer_body_decode(INTEGER_t *st, void *chunk_buf, size_t chunk_size) { if(value < 0) { /* Check whether it is a LONG_MIN */ if(sign == -1 - && value == ~((unsigned long)-1 >> 1)) { + && (unsigned long)value + == ~((unsigned long)-1 >> 1)) { sign = 1; } else { /* Overflow */ @@ -261,7 +263,7 @@ INTEGER_decode_xer(asn_codec_ctx_t *opt_codec_ctx, void *buf_ptr, size_t size) { return xer_decode_primitive(opt_codec_ctx, td, - (ASN__PRIMITIVE_TYPE_t **)sptr, opt_mname, + sptr, sizeof(INTEGER_t), opt_mname, buf_ptr, size, INTEGER__xer_body_decode); } @@ -356,7 +358,7 @@ asn_long2INTEGER(INTEGER_t *st, long value) { return -1; } - buf = MALLOC(sizeof(value)); + buf = (uint8_t *)MALLOC(sizeof(value)); if(!buf) return -1; pstart = (uint8_t *)&value; diff --git a/skeletons/NativeReal.c b/skeletons/NativeReal.c index b8a4926df..09d3e2cd3 100644 --- a/skeletons/NativeReal.c +++ b/skeletons/NativeReal.c @@ -28,7 +28,7 @@ asn_TYPE_descriptor_t asn_DEF_NativeReal = { asn_generic_no_constraint, NativeReal_decode_ber, NativeReal_encode_der, - 0, /* Not implemented yet */ + NativeReal_decode_xer, NativeReal_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_NativeReal_tags, @@ -143,6 +143,41 @@ NativeReal_encode_der(asn_TYPE_descriptor_t *td, void *ptr, } + +/* + * Decode the chunk of XML text encoding REAL. + */ +asn_dec_rval_t +NativeReal_decode_xer(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, + void *buf_ptr, size_t size) { + asn_dec_rval_t rval; + REAL_t *st = 0; + double *Dbl = (double *)*sptr; + + if(!Dbl) { + (void *)Dbl = *sptr = CALLOC(1, sizeof(double)); + if(!Dbl) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + } + + rval = REAL_decode_xer(opt_codec_ctx, td, (void **)&st, opt_mname, + buf_ptr, size); + if(rval.code == RC_OK) { + if(asn_REAL2double(st, Dbl)) { + rval.code = RC_FAIL; + rval.consumed = 0; + } + } else { + rval.consumed = 0; + } + asn_DEF_REAL.free_struct(&asn_DEF_REAL, st, 0); + return rval; +} + asn_enc_rval_t NativeReal_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, diff --git a/skeletons/NativeReal.h b/skeletons/NativeReal.h index b1c58bf47..32dd7f61d 100644 --- a/skeletons/NativeReal.h +++ b/skeletons/NativeReal.h @@ -19,6 +19,7 @@ asn_struct_free_f NativeReal_free; asn_struct_print_f NativeReal_print; ber_type_decoder_f NativeReal_decode_ber; der_type_encoder_f NativeReal_encode_der; +xer_type_decoder_f NativeReal_decode_xer; xer_type_encoder_f NativeReal_encode_xer; #endif /* ASN_TYPE_NativeReal_H */ diff --git a/skeletons/REAL.c b/skeletons/REAL.c index ace2f14ac..a1608eeb9 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -49,7 +49,7 @@ typedef enum specialRealValue { } specialRealValue_e; static struct specialRealValue_s { char *string; - int length; + size_t length; double dv; } specialRealValue[] = { #define SRV_SET(foo, val) { foo, sizeof(foo) - 1, val } @@ -248,7 +248,8 @@ REAL_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, * Decode the chunk of XML text encoding REAL. */ static ssize_t -REAL__xer_body_decode(REAL_t *st, void *chunk_buf, size_t chunk_size) { +REAL__xer_body_decode(void *sptr, void *chunk_buf, size_t chunk_size) { + REAL_t *st = (REAL_t *)sptr; double value; char *xerdata = (char *)chunk_buf; char *endptr = 0; @@ -280,10 +281,10 @@ REAL__xer_body_decode(REAL_t *st, void *chunk_buf, size_t chunk_size) { /* * Copy chunk into the nul-terminated string, and run strtod. */ - b = MALLOC(chunk_size + 1); + b = (char *)MALLOC(chunk_size + 1); if(!b) return -1; memcpy(b, chunk_buf, chunk_size); - b[chunk_size] = 0; + b[chunk_size] = 0; /* nul-terminate */ value = strtod(b, &endptr); free(b); @@ -301,7 +302,7 @@ REAL_decode_xer(asn_codec_ctx_t *opt_codec_ctx, void *buf_ptr, size_t size) { return xer_decode_primitive(opt_codec_ctx, td, - (ASN__PRIMITIVE_TYPE_t **)sptr, opt_mname, + sptr, sizeof(REAL_t), opt_mname, buf_ptr, size, REAL__xer_body_decode); } diff --git a/skeletons/asn_codecs_prim.c b/skeletons/asn_codecs_prim.c index 879147563..e6725b371 100644 --- a/skeletons/asn_codecs_prim.c +++ b/skeletons/asn_codecs_prim.c @@ -136,8 +136,8 @@ ASN__PRIMITIVE_TYPE_free(asn_TYPE_descriptor_t *td, void *sptr, * Local internal type passed around as an argument. */ struct xdp_arg_s { - ASN__PRIMITIVE_TYPE_t *sptr; - ssize_t (*prim_body_decode)(ASN__PRIMITIVE_TYPE_t *sptr, + void *struct_key; + ssize_t (*prim_body_decode)(void *struct_key, void *chunk_buf, size_t chunk_size); int decoded_something; int want_more; @@ -181,7 +181,7 @@ xer_decode__unexpected_tag(void *key, void *chunk_buf, size_t chunk_size) { return -1; } - decoded = arg->prim_body_decode(arg->sptr, chunk_buf, chunk_size); + decoded = arg->prim_body_decode(arg->struct_key, chunk_buf, chunk_size); if(decoded < 0) { return -1; } else { @@ -218,7 +218,7 @@ xer_decode__body(void *key, void *chunk_buf, size_t chunk_size, int have_more) { return -1; } - decoded = arg->prim_body_decode(arg->sptr, chunk_buf, chunk_size); + decoded = arg->prim_body_decode(arg->struct_key, chunk_buf, chunk_size); if(decoded < 0) { return -1; } else { @@ -231,10 +231,11 @@ xer_decode__body(void *key, void *chunk_buf, size_t chunk_size, int have_more) { asn_dec_rval_t xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, - ASN__PRIMITIVE_TYPE_t **sptr, + void **sptr, + size_t struct_size, const char *opt_mname, void *buf_ptr, size_t size, - ssize_t (*prim_body_decode)(ASN__PRIMITIVE_TYPE_t *sptr, + ssize_t (*prim_body_decode)(void *struct_key, void *chunk_buf, size_t chunk_size) ) { const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; @@ -246,7 +247,7 @@ xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, * Create the structure if does not exist. */ if(!*sptr) { - *sptr = CALLOC(1, sizeof(ASN__PRIMITIVE_TYPE_t)); + *sptr = CALLOC(1, struct_size); if(!*sptr) { asn_dec_rval_t rval; rval.code = RC_FAIL; @@ -256,7 +257,7 @@ xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, } memset(&s_ctx, 0, sizeof(s_ctx)); - s_arg.sptr = *sptr; + s_arg.struct_key = *sptr; s_arg.prim_body_decode = prim_body_decode; s_arg.decoded_something = 0; s_arg.want_more = 0; diff --git a/skeletons/asn_codecs_prim.h b/skeletons/asn_codecs_prim.h index 69ee10697..c235f35b5 100644 --- a/skeletons/asn_codecs_prim.h +++ b/skeletons/asn_codecs_prim.h @@ -17,16 +17,15 @@ ber_type_decoder_f ber_decode_primitive; der_type_encoder_f der_encode_primitive; /* - * Specific function to decode simple primitive values - * (INTEGER, ENUMERATED, REAL, OBJECT IDENTIFIER, etc). + * Specific function to decode simple primitive types. * Also see xer_decode_general() in xer_decoder.h */ asn_dec_rval_t xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *type_descriptor, - ASN__PRIMITIVE_TYPE_t **struct_ptr, + void **struct_ptr, size_t struct_size, const char *opt_mname, void *buf_ptr, size_t size, - ssize_t (*prim_body_decode)(ASN__PRIMITIVE_TYPE_t *struct_ptr, + ssize_t (*prim_body_decode)(void *struct_ptr, void *chunk_buf, size_t chunk_size) ); From d52f9b5f64748a2a082871611af5447751b08e1b Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 21 Oct 2004 14:13:48 +0000 Subject: [PATCH 0532/1469] NativeInteger XER support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@532 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/NativeEnumerated.c | 2 +- skeletons/NativeInteger.c | 50 ++++++++++++++++++++++++++++++++++-- skeletons/NativeInteger.h | 1 + 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c index 191afb77d..8a524853b 100644 --- a/skeletons/NativeEnumerated.c +++ b/skeletons/NativeEnumerated.c @@ -26,7 +26,7 @@ asn_TYPE_descriptor_t asn_DEF_NativeEnumerated = { asn_generic_no_constraint, NativeInteger_decode_ber, NativeInteger_encode_der, - 0, /* Not implemented yet */ + NativeInteger_decode_xer, NativeInteger_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_NativeEnumerated_tags, diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index 695b96316..159d00d26 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -28,7 +28,7 @@ asn_TYPE_descriptor_t asn_DEF_NativeInteger = { asn_generic_no_constraint, NativeInteger_decode_ber, NativeInteger_encode_der, - 0, /* Not implemented yet */ + NativeInteger_decode_xer, NativeInteger_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_NativeInteger_tags, @@ -110,7 +110,7 @@ NativeInteger_decode_ber(asn_codec_ctx_t *opt_codec_ctx, * This expression hopefully will be optimized away * by compiler. */ - if(sizeof(int) != sizeof(long) && (*Int != l)) { + if(sizeof(int) != sizeof(long) && ((long)*Int != l)) { *Int = 0; /* Safe value */ rval.code = RC_FAIL; rval.consumed = 0; @@ -164,6 +164,52 @@ NativeInteger_encode_der(asn_TYPE_descriptor_t *sd, void *ptr, return erval; } +/* + * Decode the chunk of XML text encoding INTEGER. + */ +asn_dec_rval_t +NativeInteger_decode_xer(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, + void *buf_ptr, size_t size) { + asn_dec_rval_t rval; + INTEGER_t *st = 0; + int *Int = (int *)*sptr; + + if(!Int) { + (void *)Int = *sptr = CALLOC(1, sizeof(int)); + if(!Int) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + } + + rval = INTEGER_decode_xer(opt_codec_ctx, td, (void **)&st, opt_mname, + buf_ptr, size); + if(rval.code == RC_OK) { + long l; + if(asn_INTEGER2long(st, &l)) { + rval.code = RC_FAIL; + rval.consumed = 0; + } else { + *Int = l; + + /* int might be shorter than long */ + if(sizeof(int) != sizeof(long) && ((long)*Int != l)) { + *Int = 0; /* Safe value */ + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + } + } else { + rval.consumed = 0; + } + asn_DEF_INTEGER.free_struct(&asn_DEF_INTEGER, st, 0); + return rval; +} + + asn_enc_rval_t NativeInteger_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, diff --git a/skeletons/NativeInteger.h b/skeletons/NativeInteger.h index 4de0d66a0..777f8e65c 100644 --- a/skeletons/NativeInteger.h +++ b/skeletons/NativeInteger.h @@ -20,6 +20,7 @@ asn_struct_free_f NativeInteger_free; asn_struct_print_f NativeInteger_print; ber_type_decoder_f NativeInteger_decode_ber; der_type_encoder_f NativeInteger_encode_der; +xer_type_decoder_f NativeInteger_decode_xer; xer_type_encoder_f NativeInteger_encode_xer; #endif /* _NativeInteger_H_ */ From 480ce97262264cdc44ec6b6e98021ab6bd2af692 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 22 Oct 2004 08:11:25 +0000 Subject: [PATCH 0533/1469] BOOLEAN XER support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@533 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/BOOLEAN.c | 56 ++++++++++++++++++++++++++++++++++++++++++++- skeletons/BOOLEAN.h | 1 + 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c index 61eb58fff..cfecd491a 100644 --- a/skeletons/BOOLEAN.c +++ b/skeletons/BOOLEAN.c @@ -3,6 +3,7 @@ * Redistribution and modifications are permitted subject to BSD license. */ #include +#include #include /* @@ -19,7 +20,7 @@ asn_TYPE_descriptor_t asn_DEF_BOOLEAN = { asn_generic_no_constraint, BOOLEAN_decode_ber, BOOLEAN_encode_der, - 0, /* Not implemented yet */ + BOOLEAN_decode_xer, BOOLEAN_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_BOOLEAN_tags, @@ -128,6 +129,59 @@ BOOLEAN_encode_der(asn_TYPE_descriptor_t *td, void *sptr, return erval; } + +/* + * Decode the chunk of XML text encoding INTEGER. + */ +static ssize_t +BOOLEAN__xer_body_decode(void *sptr, void *chunk_buf, size_t chunk_size) { + BOOLEAN_t *st = (BOOLEAN_t *)sptr; + char *p = (char *)chunk_buf; + char *pend = p + chunk_size; + + if(chunk_size == 0) return -1; + + if(p[0] == 0x3c /* '<' */) { + switch(xer_check_tag(chunk_buf, chunk_size, "false")) { + case XCT_BOTH: + /* "" */ + *st = 0; + break; + case XCT_UNEXPECTED: + if(xer_check_tag(chunk_buf, chunk_size, "true") + != XCT_BOTH) + return -1; + /* "" */ + *st = 1; /* Or 0xff as in DER?.. */ + break; + default: + return -1; + } + } else { + for(; p < pend; p++) { + switch(*p) { + case 0x09: case 0x0a: case 0x0d: case 0x20: + break; + default: + return -1; /* Not whitespace */ + } + } + } + + return chunk_size; +} + + +asn_dec_rval_t +BOOLEAN_decode_xer(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, + void *buf_ptr, size_t size) { + + return xer_decode_primitive(opt_codec_ctx, td, + sptr, sizeof(BOOLEAN_t), opt_mname, buf_ptr, size, + BOOLEAN__xer_body_decode); +} + asn_enc_rval_t BOOLEAN_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, diff --git a/skeletons/BOOLEAN.h b/skeletons/BOOLEAN.h index 217d36f02..fd173d119 100644 --- a/skeletons/BOOLEAN.h +++ b/skeletons/BOOLEAN.h @@ -20,6 +20,7 @@ asn_struct_free_f BOOLEAN_free; asn_struct_print_f BOOLEAN_print; ber_type_decoder_f BOOLEAN_decode_ber; der_type_encoder_f BOOLEAN_encode_der; +xer_type_decoder_f BOOLEAN_decode_xer; xer_type_encoder_f BOOLEAN_encode_xer; #endif /* _BOOLEAN_H_ */ From 2a4245ffa4b1c0fd1498e9388a9fddc1f8ea8c3d Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 22 Oct 2004 08:17:16 +0000 Subject: [PATCH 0534/1469] xer_is_whitespace() git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@534 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/BOOLEAN.c | 11 ++--------- skeletons/asn_codecs_prim.c | 27 ++------------------------- skeletons/xer_decoder.c | 23 +++++++++++++++++++++++ skeletons/xer_decoder.h | 8 ++++++++ 4 files changed, 35 insertions(+), 34 deletions(-) diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c index cfecd491a..7473b6267 100644 --- a/skeletons/BOOLEAN.c +++ b/skeletons/BOOLEAN.c @@ -137,7 +137,6 @@ static ssize_t BOOLEAN__xer_body_decode(void *sptr, void *chunk_buf, size_t chunk_size) { BOOLEAN_t *st = (BOOLEAN_t *)sptr; char *p = (char *)chunk_buf; - char *pend = p + chunk_size; if(chunk_size == 0) return -1; @@ -158,14 +157,8 @@ BOOLEAN__xer_body_decode(void *sptr, void *chunk_buf, size_t chunk_size) { return -1; } } else { - for(; p < pend; p++) { - switch(*p) { - case 0x09: case 0x0a: case 0x0d: case 0x20: - break; - default: - return -1; /* Not whitespace */ - } - } + if(!xer_is_whitespace(chunk_buf, chunk_size)) + return -1; } return chunk_size; diff --git a/skeletons/asn_codecs_prim.c b/skeletons/asn_codecs_prim.c index e6725b371..089e54ee8 100644 --- a/skeletons/asn_codecs_prim.c +++ b/skeletons/asn_codecs_prim.c @@ -143,29 +143,6 @@ struct xdp_arg_s { int want_more; }; -/* - * Check whether this buffer consists of entirely XER whitespace characters. - */ -static int -xer_decode__check_whitespace(void *chunk_buf, size_t chunk_size) { - char *p = (char *)chunk_buf; - char *pend = p + chunk_size; - for(; p < pend; p++) { - switch(*p) { - /* X.693, #8.1.4 - * HORISONTAL TAB (9) - * LINE FEED (10) - * CARRIAGE RETURN (13) - * SPACE (32) - */ - case 0x09: case 0x0a: case 0x0d: case 0x20: - break; - default: - return 0; - } - } - return 1; /* All whitespace */ -} static int xer_decode__unexpected_tag(void *key, void *chunk_buf, size_t chunk_size) { @@ -173,7 +150,7 @@ xer_decode__unexpected_tag(void *key, void *chunk_buf, size_t chunk_size) { ssize_t decoded; if(arg->decoded_something) { - if(xer_decode__check_whitespace(chunk_buf, chunk_size)) + if(xer_is_whitespace(chunk_buf, chunk_size)) return chunk_size; /* * Decoding was done once already. Prohibit doing it again. @@ -197,7 +174,7 @@ xer_decode__body(void *key, void *chunk_buf, size_t chunk_size, int have_more) { ssize_t decoded; if(arg->decoded_something) { - if(xer_decode__check_whitespace(chunk_buf, chunk_size)) + if(xer_is_whitespace(chunk_buf, chunk_size)) return chunk_size; /* * Decoding was done once already. Prohibit doing it again. diff --git a/skeletons/xer_decoder.c b/skeletons/xer_decoder.c index 9cbccf816..b7bc83bbf 100644 --- a/skeletons/xer_decoder.c +++ b/skeletons/xer_decoder.c @@ -290,3 +290,26 @@ xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, RETURN(RC_FAIL); } + +int +xer_is_whitespace(void *chunk_buf, size_t chunk_size) { + char *p = (char *)chunk_buf; + char *pend = p + chunk_size; + + for(; p < pend; p++) { + switch(*p) { + /* X.693, #8.1.4 + * HORISONTAL TAB (9) + * LINE FEED (10) + * CARRIAGE RETURN (13) + * SPACE (32) + */ + case 0x09: case 0x0a: case 0x0d: case 0x20: + break; + default: + return 0; + } + } + return 1; /* All whitespace */ +} + diff --git a/skeletons/xer_decoder.h b/skeletons/xer_decoder.h index b8aef662a..1c26ef793 100644 --- a/skeletons/xer_decoder.h +++ b/skeletons/xer_decoder.h @@ -79,4 +79,12 @@ ssize_t xer_next_token(int *stateContext, void *buffer, size_t size, xer_check_tag_e xer_check_tag(const void *buf_ptr, int size, const char *need_tag); +/* + * Check whether this buffer consists of entirely XER whitespace characters. + * RETURN VALUES: + * 1: Whitespace or empty string + * 0: Non-whitespace + */ +int xer_is_whitespace(void *chunk_buf, size_t chunk_size); + #endif /* _XER_DECODER_H_ */ From 4114a864aa880acd994d7a5e2740d7d7b2b78149 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 22 Oct 2004 08:20:32 +0000 Subject: [PATCH 0535/1469] NULL XER encoding git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@535 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/NULL.c | 24 ++++++++++++++++++++++-- skeletons/NULL.h | 1 + 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/skeletons/NULL.c b/skeletons/NULL.c index 3b41be2f3..8cccc66c6 100644 --- a/skeletons/NULL.c +++ b/skeletons/NULL.c @@ -3,6 +3,7 @@ * Redistribution and modifications are permitted subject to BSD license. */ #include +#include #include #include /* Implemented in terms of BOOLEAN type */ @@ -20,8 +21,8 @@ asn_TYPE_descriptor_t asn_DEF_NULL = { asn_generic_no_constraint, BOOLEAN_decode_ber, /* Implemented in terms of BOOLEAN */ NULL_encode_der, /* Special handling of DER encoding */ - 0, /* Not implemented yet */ - NULL_encode_xer, /* Special handling of DER encoding */ + NULL_decode_xer, + NULL_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_NULL_tags, sizeof(asn_DEF_NULL_tags) / sizeof(asn_DEF_NULL_tags[0]), @@ -65,6 +66,25 @@ NULL_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, return er; } + +static ssize_t +NULL__xer_body_decode(void *sptr, void *chunk_buf, size_t chunk_size) { + (void)sptr; + if(xer_is_whitespace(chunk_buf, chunk_size)) + return chunk_size; + return -1; +} + +asn_dec_rval_t +NULL_decode_xer(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, + void *buf_ptr, size_t size) { + + return xer_decode_primitive(opt_codec_ctx, td, + sptr, sizeof(NULL_t), opt_mname, buf_ptr, size, + NULL__xer_body_decode); +} + int NULL_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { diff --git a/skeletons/NULL.h b/skeletons/NULL.h index 1a9f7030a..bce436bd7 100644 --- a/skeletons/NULL.h +++ b/skeletons/NULL.h @@ -17,6 +17,7 @@ extern asn_TYPE_descriptor_t asn_DEF_NULL; asn_struct_print_f NULL_print; der_type_encoder_f NULL_encode_der; +xer_type_decoder_f NULL_decode_xer; xer_type_encoder_f NULL_encode_xer; #endif /* NULL_H */ From e9a652d73bd3c0d631a87def205ac903187fc57d Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Oct 2004 10:16:07 +0000 Subject: [PATCH 0536/1469] empty string test git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@536 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/check-OCTET_STRING.c | 1 + 1 file changed, 1 insertion(+) diff --git a/skeletons/tests/check-OCTET_STRING.c b/skeletons/tests/check-OCTET_STRING.c index 059d24941..dd5d049d7 100644 --- a/skeletons/tests/check-OCTET_STRING.c +++ b/skeletons/tests/check-OCTET_STRING.c @@ -80,6 +80,7 @@ main() { check(UTF8, 0, "one, two, three", "one, two, three"); + check(UTF8, "z", "", ""); check(UTF8, "z", "<&>", "<&>"); check(UTF8, "z", "a<b&c>d", "ad"); check(UTF8, "z", "a<", "a<"); From 1f73df2af84eb9d538a7f179fca709867627250b Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Oct 2004 10:16:51 +0000 Subject: [PATCH 0537/1469] OBJECT IDENTIFIER and RELATIVE-OID XER decoding git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@537 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OBJECT_IDENTIFIER.c | 129 +++++++++++++++++++++++++++++++++- skeletons/OBJECT_IDENTIFIER.h | 51 ++++++++++---- skeletons/RELATIVE-OID.c | 46 +++++++++++- skeletons/RELATIVE-OID.h | 1 + skeletons/tests/check-OIDs.c | 80 +++++++++++++++++++++ 5 files changed, 292 insertions(+), 15 deletions(-) diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index a08f18a95..535e4e265 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -22,7 +22,7 @@ asn_TYPE_descriptor_t asn_DEF_OBJECT_IDENTIFIER = { OBJECT_IDENTIFIER_constraint, ber_decode_primitive, der_encode_primitive, - 0, /* Not implemented yet */ + OBJECT_IDENTIFIER_decode_xer, OBJECT_IDENTIFIER_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_OBJECT_IDENTIFIER_tags, @@ -263,6 +263,49 @@ OBJECT_IDENTIFIER__dump_body(const OBJECT_IDENTIFIER_t *st, asn_app_consume_byte return wrote_len; } +static ssize_t +OBJECT_IDENTIFIER__xer_body_decode(void *sptr, void *chunk_buf, size_t chunk_size) { + OBJECT_IDENTIFIER_t *st = (OBJECT_IDENTIFIER_t *)sptr; + char *endptr; + long s_arcs[10]; + long *arcs = s_arcs; + int arcs_count; + int ret; + + arcs_count = OBJECT_IDENTIFIER_parse_arcs( + (const char *)chunk_buf, chunk_size, arcs, 10, &endptr); + if(arcs_count <= 0) + return -1; /* Expecting more than zero arcs */ + if(arcs_count > 10) { + arcs = (long *)MALLOC(arcs_count * sizeof(long)); + if(!arcs) return -1; + ret = OBJECT_IDENTIFIER_parse_arcs( + (const char *)chunk_buf, chunk_size, + arcs, arcs_count, &endptr); + if(ret != arcs_count) + return -1; /* assert?.. */ + } + + /* + * Convert arcs into BER representation. + */ + ret = OBJECT_IDENTIFIER_set_arcs(st, arcs, sizeof(*arcs), arcs_count); + if(ret) return -1; + if(arcs != s_arcs) FREEMEM(arcs); + + return endptr - (char *)chunk_buf; +} + +asn_dec_rval_t +OBJECT_IDENTIFIER_decode_xer(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, + void *buf_ptr, size_t size) { + + return xer_decode_primitive(opt_codec_ctx, td, + sptr, sizeof(OBJECT_IDENTIFIER_t), opt_mname, + buf_ptr, size, OBJECT_IDENTIFIER__xer_body_decode); +} + asn_enc_rval_t OBJECT_IDENTIFIER_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, @@ -596,3 +639,87 @@ OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, unsigned int ar return 0; } + +int +OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length, + long *arcs, unsigned int arcs_slots, char **oid_text_end) { + unsigned int arcs_count = 0; + const char *oid_end; + long value = 0; + enum { + ST_SKIPSPACE, + ST_WAITDIGITS, /* Next character is expected to be a digit */ + ST_DIGITS, + } state = ST_SKIPSPACE; + + if(!oid_text || oid_txt_length < -1 || (arcs_slots && !arcs)) { + if(oid_text_end) (const char *)*oid_text_end = oid_text; + errno = EINVAL; + return -1; + } + + if(oid_txt_length == -1) + oid_txt_length = strlen(oid_text); + + for(oid_end = oid_text + oid_txt_length; oid_text=0: Number of arcs contained in the OBJECT IDENTIFIER + * + * WARNING: The function always returns the real number of arcs, + * even if there is no sufficient (_arc_slots) provided. */ int OBJECT_IDENTIFIER_get_arcs(OBJECT_IDENTIFIER_t *_oid, void *_arcs, /* i.e., unsigned int arcs[N] */ @@ -92,6 +83,40 @@ int OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *_oid, unsigned int _arc_type_size, /* i.e., sizeof(arcs[0]) */ unsigned int _arc_slots /* i.e., N */); +/* + * Print the specified OBJECT IDENTIFIER arc. + */ +int OBJECT_IDENTIFIER_print_arc(uint8_t *arcbuf, int arclen, + int add, /* Arbitrary offset, required to process the first two arcs */ + asn_app_consume_bytes_f *cb, void *app_key); + +/* Same as above, but returns the number of written digits, instead of 0 */ +ssize_t OBJECT_IDENTIFIER__dump_arc(uint8_t *arcbuf, int arclen, int add, + asn_app_consume_bytes_f *cb, void *app_key); + +/* + * Parse the OBJECT IDENTIFIER textual representation ("1.3.6.1.4.1.9363"). + * No arc can exceed the (0..signed_long_max) range (typically, 0..2G if L32). + * This function is not specific to OBJECT IDENTIFIER, it may be used to parse + * the RELATIVE-OID data, or any other data consisting of dot-separated + * series of numeric values. + * + * If (oid_txt_length == -1), the strlen() will be invoked to determine the + * size of the (oid_text) string. + * + * After return, the optional (oid_text_end) is set to the character after + * the last parsed one. (oid_text_end) is never less than (oid_text). + * + * RETURN VALUES: + * -1: Parse error. + * >= 0: Number of arcs contained in the OBJECT IDENTIFIER. + * + * WARNING: The function always returns the real number of arcs, + * even if there is no sufficient (_arc_slots) provided. + */ +int OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length, + long arcs[], unsigned int arcs_slots, char **oid_text_end); + /* * Internal functions. * Used by RELATIVE-OID implementation in particular. diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index 13fa0e2be..d36d1f78b 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -23,7 +23,7 @@ asn_TYPE_descriptor_t asn_DEF_RELATIVE_OID = { asn_generic_no_constraint, ber_decode_primitive, der_encode_primitive, - 0, /* Not implemented yet */ + RELATIVE_OID_decode_xer, RELATIVE_OID_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_RELATIVE_OID_tags, @@ -86,6 +86,50 @@ RELATIVE_OID_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, return (cb(" }", 2, app_key) < 0) ? -1 : 0; } +static ssize_t +RELATIVE_OID__xer_body_decode(void *sptr, void *chunk_buf, size_t chunk_size) { + RELATIVE_OID_t *st = (RELATIVE_OID_t *)sptr; + char *endptr; + long s_arcs[6]; + long *arcs = s_arcs; + int arcs_count; + int ret; + + arcs_count = OBJECT_IDENTIFIER_parse_arcs( + (const char *)chunk_buf, chunk_size, + arcs, 6, &endptr); + if(arcs_count < 0) + return -1; /* Expecting at least zero arcs */ + if(arcs_count > 6) { + arcs = (long *)MALLOC(arcs_count * sizeof(long)); + if(!arcs) return -1; + ret = OBJECT_IDENTIFIER_parse_arcs( + (const char *)chunk_buf, chunk_size, + arcs, arcs_count, &endptr); + if(ret != arcs_count) + return -1; /* assert?.. */ + } + + /* + * Convert arcs into BER representation. + */ + ret = RELATIVE_OID_set_arcs(st, arcs, sizeof(*arcs), arcs_count); + if(ret) return -1; + if(arcs != s_arcs) FREEMEM(arcs); + + return endptr - (char *)chunk_buf; +} + +asn_dec_rval_t +RELATIVE_OID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, + void *buf_ptr, size_t size) { + + return xer_decode_primitive(opt_codec_ctx, td, + sptr, sizeof(RELATIVE_OID_t), opt_mname, + buf_ptr, size, RELATIVE_OID__xer_body_decode); +} + asn_enc_rval_t RELATIVE_OID_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, diff --git a/skeletons/RELATIVE-OID.h b/skeletons/RELATIVE-OID.h index 943517213..2b7f13d30 100644 --- a/skeletons/RELATIVE-OID.h +++ b/skeletons/RELATIVE-OID.h @@ -13,6 +13,7 @@ typedef OBJECT_IDENTIFIER_t RELATIVE_OID_t; extern asn_TYPE_descriptor_t asn_DEF_RELATIVE_OID; asn_struct_print_f RELATIVE_OID_print; +xer_type_decoder_f RELATIVE_OID_decode_xer; xer_type_encoder_f RELATIVE_OID_encode_xer; /********************************** diff --git a/skeletons/tests/check-OIDs.c b/skeletons/tests/check-OIDs.c index 8033d7cc5..816eb5599 100644 --- a/skeletons/tests/check-OIDs.c +++ b/skeletons/tests/check-OIDs.c @@ -223,6 +223,50 @@ check_speed() { return 0; } +static void check_parse(const char *oid_txt, int retval) { + int ret; + long l[2]; + char *p; + + ret = OBJECT_IDENTIFIER_parse_arcs(oid_txt, -1, l, 2, &p); + printf("[%s] => %d == %d\n", oid_txt, ret, retval); + assert(ret == retval); + assert(p >= oid_txt); +} + +static void check_xer(int expect_arcs, char *xer) { + asn_dec_rval_t rc; + RELATIVE_OID_t *st = 0; + long arcs[10]; + int ret; + int i; + + printf("[%s] => ", xer); fflush(stdout); + rc = asn_DEF_RELATIVE_OID.xer_decoder(0, + &asn_DEF_RELATIVE_OID, (void **)&st, "t", + xer, strlen(xer)); + if(expect_arcs == -1) { + if(rc.code != RC_OK) + return; + } + assert(rc.code == RC_OK); + + ret = RELATIVE_OID_get_arcs(st, arcs, sizeof(arcs[0]), + sizeof(arcs)/sizeof(arcs[0])); + assert(ret < 10); + if(expect_arcs == -1) { + assert(ret == -1); + return; + } + for(i = 0; i < ret; i++) { + if(i) printf("."); + printf("%ld", arcs[i]); + assert(arcs[i] == i + 1); + } + printf(": %d == %d\n", ret, expect_arcs); + assert(ret == expect_arcs); +} + #define CHECK_OID(n) check_OID(buf ## n, sizeof(buf ## n), \ buf ## n ## _check, \ sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0])) @@ -334,6 +378,42 @@ main() { CHECK_REGEN_OID(19); CHECK_REGEN_OID(20); + check_parse("", 0); + check_parse(" ", 0); + check_parse(" ", 0); + check_parse(".", -1); + check_parse(" .", -1); + check_parse(" 1", 1); + check_parse(" 1.2", 2); + check_parse(" 1.", -1); + check_parse(" 1. ", -1); + check_parse("1. ", -1); + check_parse("1.2", 2); + check_parse("10.30.234.234", 4); + check_parse("10.30.234.234 ", 4); + check_parse("10.30.234. 234 ", -1); + check_parse("10.30.234.234.", -1); + check_parse("1.2000000000.3", 3); + check_parse("1.2147483647.3", 3); + if(sizeof(long) == 4) { + check_parse("1.2147483648.3", -1); /* overflow on ILP32 */ + check_parse("1.3000000000.3", -1); + check_parse("1.4000000000.3", -1); + check_parse("1.5000000000.3", -1); + check_parse("1.6000000000.3", -1); + check_parse("1.9000000000.3", -1); + } else { + check_parse("1.2147483648.3", 3); + } + check_parse("1.900a0000000.3", -1); + check_parse("1.900a.3", -1); + + check_xer(0, ""); + check_xer(2, "1.2"); + check_xer(3, "1.2.3"); + check_xer(3, " 1.2.3 "); + check_xer(-1, "1.2.3 1"); + for(i = 0; i < 100000; i++) { int bufA_check[3] = { 2, i, rand() }; int bufB_check[2] = { rand(), i * 121 }; From 1069dac8b1b3a25d3373d9b863fd863239e6055c Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Oct 2004 10:17:02 +0000 Subject: [PATCH 0538/1469] LP64 support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@538 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/check-INTEGER.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/skeletons/tests/check-INTEGER.c b/skeletons/tests/check-INTEGER.c index 9f9aecfed..17fa09914 100644 --- a/skeletons/tests/check-INTEGER.c +++ b/skeletons/tests/check-INTEGER.c @@ -166,13 +166,15 @@ main(int ac, char **av) { check_xer(0, "-2147483648", -2147483648); check_xer(0, "+2147483647", 2147483647); check_xer(0, "2147483647", 2147483647); - check_xer(-1, "2147483648", 0); - check_xer(-1, "2147483649", 0); - check_xer(-1, "3147483649", 0); - check_xer(-1, "4147483649", 0); - check_xer(-1, "5147483649", 0); /* unobvious */ - check_xer(-1, "9147483649", 0); - check_xer(-1, "9999999999", 0); + if(sizeof(long) == 4) { + check_xer(-1, "2147483648", 0); + check_xer(-1, "2147483649", 0); + check_xer(-1, "3147483649", 0); + check_xer(-1, "4147483649", 0); + check_xer(-1, "5147483649", 0); /* special */ + check_xer(-1, "9147483649", 0); + check_xer(-1, "9999999999", 0); + } return 0; } From f7de4de1d50ac3f55ac78ba227b9b7cca455d68e Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Oct 2004 10:17:34 +0000 Subject: [PATCH 0539/1469] always pass at least empty string git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@539 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_codecs_prim.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/skeletons/asn_codecs_prim.c b/skeletons/asn_codecs_prim.c index 089e54ee8..04a064dd0 100644 --- a/skeletons/asn_codecs_prim.c +++ b/skeletons/asn_codecs_prim.c @@ -246,8 +246,13 @@ xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, case RC_OK: if(!s_arg.decoded_something) { /* Opportunity has come and gone. Where's the result? */ - rc.code = RC_FAIL; - rc.consumed = 0; + if(prim_body_decode(s_arg.struct_key, "", 0) != 0) { + /* + * This decoder does not like empty stuff. + */ + rc.code = RC_FAIL; + rc.consumed = 0; + } } break; case RC_WMORE: From a56a9e89fcb90fc0adaa6562646e3f22a477c35d Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Oct 2004 10:20:27 +0000 Subject: [PATCH 0540/1469] empty strings git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@540 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OCTET_STRING.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 16d3a8958..89d5de0b4 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -1109,9 +1109,12 @@ OCTET_STRING__decode_xer(asn_codec_ctx_t *opt_codec_ctx, * Create the string if does not exist. */ if(!*sptr) { - *sptr = CALLOC(1, specs->struct_size); - if(*sptr == NULL) { + OCTET_STRING_t *st; + (void *)st = *sptr = CALLOC(1, specs->struct_size); + if(st) st->buf = (uint8_t *)CALLOC(1, 1); + if(!*sptr || !st->buf) { asn_dec_rval_t rval; + if(*sptr) FREEMEM(*sptr); rval.code = RC_FAIL; rval.consumed = 0; return rval; From 64f1ba231dc3989b341232c4fe42d840d096bbf4 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Oct 2004 11:19:43 +0000 Subject: [PATCH 0541/1469] play safe git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@541 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_codecs_prim.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/skeletons/asn_codecs_prim.c b/skeletons/asn_codecs_prim.c index 04a064dd0..f2d045aa0 100644 --- a/skeletons/asn_codecs_prim.c +++ b/skeletons/asn_codecs_prim.c @@ -245,8 +245,9 @@ xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, switch(rc.code) { case RC_OK: if(!s_arg.decoded_something) { + char ch; /* Opportunity has come and gone. Where's the result? */ - if(prim_body_decode(s_arg.struct_key, "", 0) != 0) { + if(prim_body_decode(s_arg.struct_key, &ch, 0) != 0) { /* * This decoder does not like empty stuff. */ From a29c5bb23e0b89279e7c5fb405af9d0eb8096280 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Oct 2004 11:20:06 +0000 Subject: [PATCH 0542/1469] XER decoding support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@542 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/BMPString.c | 77 +++++++++++++++++++++++++++-- skeletons/BMPString.h | 1 + skeletons/UTF8String.c | 98 ++++++++++++++++++++++--------------- skeletons/UTF8String.h | 13 +++++ skeletons/UniversalString.c | 68 +++++++++++++++++++++++-- skeletons/UniversalString.h | 1 + skeletons/file-dependencies | 4 +- 7 files changed, 210 insertions(+), 52 deletions(-) diff --git a/skeletons/BMPString.c b/skeletons/BMPString.c index cca6e3c50..3dd01d557 100644 --- a/skeletons/BMPString.c +++ b/skeletons/BMPString.c @@ -1,9 +1,11 @@ /*- - * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include +#include +#include /* * BMPString basic type description. @@ -18,10 +20,10 @@ asn_TYPE_descriptor_t asn_DEF_BMPString = { OCTET_STRING_free, /* Implemented in terms of OCTET STRING */ BMPString_print, asn_generic_no_constraint, /* No constraint by default */ - OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - 0, /* Not implemented yet */ - BMPString_encode_xer, /* Convert to UTF8 */ + OCTET_STRING_decode_ber, + OCTET_STRING_encode_der, + BMPString_decode_xer, /* Convert from UTF-8 */ + BMPString_encode_xer, /* Convert to UTF-8 */ 0, /* Use generic outmost tag fetcher */ asn_DEF_BMPString_tags, sizeof(asn_DEF_BMPString_tags) @@ -74,6 +76,71 @@ BMPString__dump(const BMPString_t *st, return wrote; } +asn_dec_rval_t +BMPString_decode_xer(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, + const char *opt_mname, void *buf_ptr, size_t size) { + asn_dec_rval_t rc; + + rc = OCTET_STRING_decode_xer_utf8(opt_codec_ctx, td, sptr, opt_mname, + buf_ptr, size); + if(rc.code == RC_OK) { + /* + * Now we have a whole string in UTF-8 format. + * Convert it into UCS-2. + */ + uint32_t *wcs; + size_t wcs_len; + UTF8String_t *st; + + assert(*sptr); + st = (UTF8String_t *)*sptr; + assert(st->buf); + wcs_len = UTF8String_to_wcs(st, 0, 0); + + wcs = (uint32_t *)MALLOC(4 * (wcs_len + 1)); + if(wcs == 0 || UTF8String_to_wcs(st, wcs, wcs_len) != wcs_len) { + rc.code = RC_FAIL; + rc.consumed = 0; + return rc; + } else { + wcs[wcs_len] = 0; /* nul-terminate */ + } + + if(1) { + /* Swap byte order and trim encoding to 2 bytes */ + uint32_t *wc = wcs; + uint32_t *wc_end = wcs + wcs_len + 1; + uint16_t *dstwc = (uint16_t *)wcs; + for(; wc < wc_end; wc++, dstwc++) { + uint32_t wch = *wc; + if(wch > 0xffff) { + FREEMEM(wcs); + rc.code = RC_FAIL; + rc.consumed = 0; + return rc; + } + *((uint8_t *)dstwc + 0) = wch >> 8; + *((uint8_t *)dstwc + 1) = wch; + } + dstwc = (uint16_t)REALLOC(wcs, 2 * (wcs_len + 1)); + if(!dstwc) { + FREEMEM(wcs); + rc.code = RC_FAIL; + rc.consumed = 0; + return rc; + } else { + wcs = (uint32_t *)dstwc; + } + } + + FREEMEM(st->buf); + st->buf = (uint8_t *)wcs; + st->size = 2 * wcs_len; + } + return rc; +} + asn_enc_rval_t BMPString_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, diff --git a/skeletons/BMPString.h b/skeletons/BMPString.h index 3ff2baf3a..cd515973a 100644 --- a/skeletons/BMPString.h +++ b/skeletons/BMPString.h @@ -12,6 +12,7 @@ typedef OCTET_STRING_t BMPString_t; /* Implemented via OCTET STRING */ extern asn_TYPE_descriptor_t asn_DEF_BMPString; asn_struct_print_f BMPString_print; /* Human-readable output */ +xer_type_decoder_f BMPString_decode_xer; xer_type_encoder_f BMPString_encode_xer; #endif /* _BMPString_H_ */ diff --git a/skeletons/UTF8String.c b/skeletons/UTF8String.c index 1c0c731d7..0a47f4593 100644 --- a/skeletons/UTF8String.c +++ b/skeletons/UTF8String.c @@ -96,54 +96,72 @@ UTF8String_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return (len < 0) ? -1 : 0; } -ssize_t -UTF8String_length(const UTF8String_t *st) { +static ssize_t +UTF8String__process(const UTF8String_t *st, uint32_t *dst, size_t dstlen) { + size_t length; + uint8_t *buf = st->buf; + uint8_t *end = buf + st->size; - if(st && st->buf) { - size_t length; - uint8_t *buf = st->buf; - uint8_t *end = buf + st->size; - - for(length = 0; buf < end; length++) { - int ch = *buf; - uint8_t *cend; - int32_t value; - int want; - - /* Compute the sequence length */ - want = UTF8String_ht[0][ch >> 4]; - switch(want) { - case -1: - /* Second half of the table, long sequence */ - want = UTF8String_ht[1][ch & 0x0F]; - if(want != -1) break; - /* Fall through */ - case 0: - return U8E_ILLSTART; - } - - /* assert(want >= 1 && want <= 6) */ - - /* Check character sequence length */ - if(buf + want > end) return U8E_TRUNC; - - value = ch & (0xff >> (want + 1)); - cend = buf + want; - for(buf++; buf < cend; buf++) { - ch = *buf; - if(ch < 0x80 || ch > 0xbf) return U8E_NOTCONT; - value = (value << 6) | (ch & 0x3F); - } - if(value < UTF8String_mv[want]) - return U8E_NOTMIN; + for(length = 0; buf < end; length++) { + int ch = *buf; + uint8_t *cend; + int32_t value; + int want; + + /* Compute the sequence length */ + want = UTF8String_ht[0][ch >> 4]; + switch(want) { + case -1: + /* Second half of the table, long sequence */ + want = UTF8String_ht[1][ch & 0x0F]; + if(want != -1) break; + /* Fall through */ + case 0: + return U8E_ILLSTART; } - return length; + /* assert(want >= 1 && want <= 6) */ + + /* Check character sequence length */ + if(buf + want > end) return U8E_TRUNC; + + value = ch & (0xff >> (want + 1)); + cend = buf + want; + for(buf++; buf < cend; buf++) { + ch = *buf; + if(ch < 0x80 || ch > 0xbf) return U8E_NOTCONT; + value = (value << 6) | (ch & 0x3F); + } + if(value < UTF8String_mv[want]) + return U8E_NOTMIN; + if(dstlen) *dst++ = value; /* Record value */ + } + + if(dstlen) *dst = 0; /* zero-terminate */ + + return length; +} + + +ssize_t +UTF8String_length(const UTF8String_t *st) { + if(st && st->buf) { + return UTF8String__process(st, 0, 0); } else { return U8E_EINVAL; } } +size_t +UTF8String_to_wcs(const UTF8String_t *st, uint32_t *dst, size_t dstlen) { + if(st && st->buf) { + ssize_t ret = UTF8String__process(st, dst, dstlen); + return (ret < 0) ? 0 : ret; + } else { + return 0; + } +} + int UTF8String_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { diff --git a/skeletons/UTF8String.h b/skeletons/UTF8String.h index 45801592e..84e6eaff8 100644 --- a/skeletons/UTF8String.h +++ b/skeletons/UTF8String.h @@ -25,4 +25,17 @@ asn_constr_check_f UTF8String_constraint; */ ssize_t UTF8String_length(const UTF8String_t *st); +/* + * Convert the UTF-8 string into a sequence of wide characters. + * Returns the number of characters necessary. + * Returned value might be greater than dstlen. + * In case of conversion error, 0 is returned. + * + * If st points to a valid UTF-8 string, calling + * UTF8String_to_wcs(st, 0, 0); + * is equivalent to + * UTF8String_length(const UTF8String_t *st); + */ +size_t UTF8String_to_wcs(const UTF8String_t *st, uint32_t *dst, size_t dstlen); + #endif /* _UTF8String_H_ */ diff --git a/skeletons/UniversalString.c b/skeletons/UniversalString.c index 2221000f6..f3279b409 100644 --- a/skeletons/UniversalString.c +++ b/skeletons/UniversalString.c @@ -1,9 +1,10 @@ /*- - * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include +#include /* * UniversalString basic type description. @@ -18,10 +19,10 @@ asn_TYPE_descriptor_t asn_DEF_UniversalString = { OCTET_STRING_free, UniversalString_print, /* Convert into UTF8 and print */ asn_generic_no_constraint, - OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - 0, /* Not implemented yet */ - UniversalString_encode_xer, /* Convert into UTF8 */ + OCTET_STRING_decode_ber, + OCTET_STRING_encode_der, + UniversalString_decode_xer, /* Convert from UTF-8 */ + UniversalString_encode_xer, /* Convert into UTF-8 */ 0, /* Use generic outmost tag fetcher */ asn_DEF_UniversalString_tags, sizeof(asn_DEF_UniversalString_tags) @@ -93,6 +94,63 @@ UniversalString__dump(const UniversalString_t *st, return wrote; } +asn_dec_rval_t +UniversalString_decode_xer(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, + const char *opt_mname, void *buf_ptr, size_t size) { + asn_dec_rval_t rc; + + rc = OCTET_STRING_decode_xer_utf8(opt_codec_ctx, td, sptr, opt_mname, + buf_ptr, size); + if(rc.code == RC_OK) { + /* + * Now we have a whole string in UTF-8 format. + * Convert it into UCS-4. + */ + uint32_t *wcs; + size_t wcs_len; + UTF8String_t *st; +#ifndef WORDS_BIGENDIAN + int little_endian = 1; +#endif + + assert(*sptr); + st = (UTF8String_t *)*sptr; + assert(st->buf); + wcs_len = UTF8String_to_wcs(st, 0, 0); + + wcs = (uint32_t *)MALLOC(4 * (wcs_len + 1)); + if(wcs == 0 || UTF8String_to_wcs(st, wcs, wcs_len) != wcs_len) { + rc.code = RC_FAIL; + rc.consumed = 0; + return rc; + } else { + wcs[wcs_len] = 0; /* nul-terminate */ + } + +#ifndef WORDS_BIGENDIAN + if(*(char *)&little_endian) { + /* Swap byte order in encoding */ + uint32_t *wc = wcs; + uint32_t *wc_end = wcs + wcs_len; + for(; wc < wc_end; wc++) { + /* *wc = htonl(*wc); */ + uint32_t wch = *wc; + *((uint8_t *)wc + 0) = wch >> 24; + *((uint8_t *)wc + 1) = wch >> 16; + *((uint8_t *)wc + 2) = wch >> 8; + *((uint8_t *)wc + 3) = wch; + } + } +#endif /* WORDS_BIGENDIAN */ + + FREEMEM(st->buf); + st->buf = (uint8_t *)wcs; + st->size = 4 * wcs_len; + } + return rc; +} + asn_enc_rval_t UniversalString_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, diff --git a/skeletons/UniversalString.h b/skeletons/UniversalString.h index 6d4a291f5..3be8cabdc 100644 --- a/skeletons/UniversalString.h +++ b/skeletons/UniversalString.h @@ -12,6 +12,7 @@ typedef OCTET_STRING_t UniversalString_t; /* Implemented via OCTET STRING */ extern asn_TYPE_descriptor_t asn_DEF_UniversalString; asn_struct_print_f UniversalString_print; /* Human-readable output */ +xer_type_decoder_f UniversalString_decode_xer; xer_type_encoder_f UniversalString_encode_xer; #endif /* _UniversalString_H_ */ diff --git a/skeletons/file-dependencies b/skeletons/file-dependencies index 3e26fffbe..3c8715fad 100644 --- a/skeletons/file-dependencies +++ b/skeletons/file-dependencies @@ -7,7 +7,7 @@ # ANY.h ANY.c -BMPString.h BMPString.c +BMPString.h BMPString.c UTF8String.h BOOLEAN.h BOOLEAN.c ENUMERATED.h ENUMERATED.c INTEGER.h GeneralString.h GeneralString.c @@ -30,7 +30,7 @@ T61String.h T61String.c TeletexString.h TeletexString.c UTCTime.h UTCTime.c GeneralizedTime.h UTF8String.h UTF8String.c -UniversalString.h UniversalString.c +UniversalString.h UniversalString.c UTF8String.h VideotexString.h VideotexString.c VisibleString.h VisibleString.c asn_SEQUENCE_OF.h asn_SEQUENCE_OF.c asn_SET_OF.h From 405fca6b80eef1fa433adadc8bfe408bddc1bc83 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Oct 2004 11:24:11 +0000 Subject: [PATCH 0543/1469] API changed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@543 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/unber.c | 1 + 1 file changed, 1 insertion(+) diff --git a/asn1c/unber.c b/asn1c/unber.c index 90468b43a..627c8bde9 100644 --- a/asn1c/unber.c +++ b/asn1c/unber.c @@ -698,3 +698,4 @@ ssize_t der_write_tags(asn_TYPE_descriptor_t *td, size_t slen, int tag_mode, int asn_dec_rval_t xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, asn_struct_ctx_t *ctx, void *struct_key, const char *xml_tag, void *buf_ptr, size_t size, int (*otd)(void *struct_key, void *chunk_buf, size_t chunk_size), ssize_t (*br)(void *struct_key, void *chunk_buf, size_t chunk_size, int have_more)) { asn_dec_rval_t rv; (void)opt_codec_ctx; (void)ctx; (void)struct_key; (void)xml_tag; (void)buf_ptr; (void)size; (void)otd; (void)br; return rv; } +int xer_is_whitespace(void *b, size_t s) { (void)b; (void)s; return 0; } From 9cb2b16324f0cf808ab7c6b48136cc638ea27e14 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Oct 2004 13:13:19 +0000 Subject: [PATCH 0544/1469] typos git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@544 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/BMPString.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/BMPString.c b/skeletons/BMPString.c index 3dd01d557..10469eda1 100644 --- a/skeletons/BMPString.c +++ b/skeletons/BMPString.c @@ -123,7 +123,7 @@ BMPString_decode_xer(asn_codec_ctx_t *opt_codec_ctx, *((uint8_t *)dstwc + 0) = wch >> 8; *((uint8_t *)dstwc + 1) = wch; } - dstwc = (uint16_t)REALLOC(wcs, 2 * (wcs_len + 1)); + dstwc = (uint16_t *)REALLOC(wcs, 2 * (wcs_len + 1)); if(!dstwc) { FREEMEM(wcs); rc.code = RC_FAIL; From 4fe6a5e97edca744897dda1930239b7c51dd79c9 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Oct 2004 13:13:28 +0000 Subject: [PATCH 0545/1469] assert() git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@545 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/UniversalString.c | 1 + 1 file changed, 1 insertion(+) diff --git a/skeletons/UniversalString.c b/skeletons/UniversalString.c index f3279b409..2918d070a 100644 --- a/skeletons/UniversalString.c +++ b/skeletons/UniversalString.c @@ -5,6 +5,7 @@ #include #include #include +#include /* * UniversalString basic type description. From a6af74c595c52a18ccec4a38494942cf7bb4d28b Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Oct 2004 13:26:56 +0000 Subject: [PATCH 0546/1469] XER decoders git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@546 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/46-redefine-OK.asn1.-PR | 10 +- tests/50-constraint-OK.asn1.-P | 200 ++++++++++++++++++--- tests/65-multi-tag-OK.asn1.-P | 60 ++++++- tests/65-multi-tag-OK.asn1.-Pfnative-types | 60 ++++++- tests/66-ref-simple-OK.asn1.-P | 10 +- 5 files changed, 306 insertions(+), 34 deletions(-) diff --git a/tests/46-redefine-OK.asn1.-PR b/tests/46-redefine-OK.asn1.-PR index 4650b5131..5ba6bccfb 100644 --- a/tests/46-redefine-OK.asn1.-PR +++ b/tests/46-redefine-OK.asn1.-PR @@ -102,6 +102,7 @@ asn_struct_print_f T_print; asn_constr_check_f T_constraint; ber_type_decoder_f T_decode_ber; der_type_encoder_f T_encode_der; +xer_type_decoder_f T_decode_xer; xer_type_encoder_f T_encode_xer; /*** <<< CODE [T] >>> ***/ @@ -160,6 +161,13 @@ T_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +T_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + T_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t T_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -183,7 +191,7 @@ asn_TYPE_descriptor_t asn_DEF_T = { T_constraint, T_decode_ber, T_encode_der, - 0, /* Not implemented yet */ + T_decode_xer, T_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_T_tags, diff --git a/tests/50-constraint-OK.asn1.-P b/tests/50-constraint-OK.asn1.-P index 6f4dac108..2700676b9 100644 --- a/tests/50-constraint-OK.asn1.-P +++ b/tests/50-constraint-OK.asn1.-P @@ -35,6 +35,7 @@ asn_struct_print_f Int2_print; asn_constr_check_f Int2_constraint; ber_type_decoder_f Int2_decode_ber; der_type_encoder_f Int2_encode_der; +xer_type_decoder_f Int2_decode_xer; xer_type_encoder_f Int2_encode_xer; /*** <<< CODE [Int2] >>> ***/ @@ -112,6 +113,13 @@ Int2_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +Int2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + Int2_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t Int2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -134,7 +142,7 @@ asn_TYPE_descriptor_t asn_DEF_Int2 = { Int2_constraint, Int2_decode_ber, Int2_encode_der, - 0, /* Not implemented yet */ + Int2_decode_xer, Int2_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_Int2_tags, @@ -165,6 +173,7 @@ asn_struct_print_f Int3_print; asn_constr_check_f Int3_constraint; ber_type_decoder_f Int3_decode_ber; der_type_encoder_f Int3_encode_der; +xer_type_decoder_f Int3_decode_xer; xer_type_encoder_f Int3_encode_xer; /*** <<< CODE [Int3] >>> ***/ @@ -246,6 +255,13 @@ Int3_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +Int3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + Int3_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t Int3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -268,7 +284,7 @@ asn_TYPE_descriptor_t asn_DEF_Int3 = { Int3_constraint, Int3_decode_ber, Int3_encode_der, - 0, /* Not implemented yet */ + Int3_decode_xer, Int3_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_Int3_tags, @@ -299,6 +315,7 @@ asn_struct_print_f Int4_print; asn_constr_check_f Int4_constraint; ber_type_decoder_f Int4_decode_ber; der_type_encoder_f Int4_encode_der; +xer_type_decoder_f Int4_decode_xer; xer_type_encoder_f Int4_encode_xer; /*** <<< CODE [Int4] >>> ***/ @@ -380,6 +397,13 @@ Int4_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +Int4_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + Int4_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t Int4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -402,7 +426,7 @@ asn_TYPE_descriptor_t asn_DEF_Int4 = { Int4_constraint, Int4_decode_ber, Int4_encode_der, - 0, /* Not implemented yet */ + Int4_decode_xer, Int4_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_Int4_tags, @@ -433,6 +457,7 @@ asn_struct_print_f Int5_print; asn_constr_check_f Int5_constraint; ber_type_decoder_f Int5_decode_ber; der_type_encoder_f Int5_encode_der; +xer_type_decoder_f Int5_decode_xer; xer_type_encoder_f Int5_encode_xer; /*** <<< CODE [Int5] >>> ***/ @@ -514,6 +539,13 @@ Int5_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +Int5_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + Int5_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t Int5_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -536,7 +568,7 @@ asn_TYPE_descriptor_t asn_DEF_Int5 = { Int5_constraint, Int5_decode_ber, Int5_encode_der, - 0, /* Not implemented yet */ + Int5_decode_xer, Int5_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_Int5_tags, @@ -567,6 +599,7 @@ asn_struct_print_f ExtensibleExtensions_print; asn_constr_check_f ExtensibleExtensions_constraint; ber_type_decoder_f ExtensibleExtensions_decode_ber; der_type_encoder_f ExtensibleExtensions_encode_der; +xer_type_decoder_f ExtensibleExtensions_decode_xer; xer_type_encoder_f ExtensibleExtensions_encode_xer; /*** <<< CODE [ExtensibleExtensions] >>> ***/ @@ -648,6 +681,13 @@ ExtensibleExtensions_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +ExtensibleExtensions_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + ExtensibleExtensions_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t ExtensibleExtensions_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -670,7 +710,7 @@ asn_TYPE_descriptor_t asn_DEF_ExtensibleExtensions = { ExtensibleExtensions_constraint, ExtensibleExtensions_decode_ber, ExtensibleExtensions_encode_der, - 0, /* Not implemented yet */ + ExtensibleExtensions_decode_xer, ExtensibleExtensions_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_ExtensibleExtensions_tags, @@ -720,6 +760,7 @@ asn_struct_print_f Str2_print; asn_constr_check_f Str2_constraint; ber_type_decoder_f Str2_decode_ber; der_type_encoder_f Str2_encode_der; +xer_type_decoder_f Str2_decode_xer; xer_type_encoder_f Str2_encode_xer; /*** <<< CTABLES [Str2] >>> ***/ @@ -813,6 +854,13 @@ Str2_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +Str2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + Str2_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t Str2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -835,7 +883,7 @@ asn_TYPE_descriptor_t asn_DEF_Str2 = { Str2_constraint, Str2_decode_ber, Str2_encode_der, - 0, /* Not implemented yet */ + Str2_decode_xer, Str2_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_Str2_tags, @@ -866,6 +914,7 @@ asn_struct_print_f Str3_print; asn_constr_check_f Str3_constraint; ber_type_decoder_f Str3_decode_ber; der_type_encoder_f Str3_encode_der; +xer_type_decoder_f Str3_decode_xer; xer_type_encoder_f Str3_encode_xer; /*** <<< CTABLES [Str3] >>> ***/ @@ -970,6 +1019,13 @@ Str3_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +Str3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + Str3_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t Str3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -992,7 +1048,7 @@ asn_TYPE_descriptor_t asn_DEF_Str3 = { Str3_constraint, Str3_decode_ber, Str3_encode_der, - 0, /* Not implemented yet */ + Str3_decode_xer, Str3_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_Str3_tags, @@ -1023,6 +1079,7 @@ asn_struct_print_f Str4_print; asn_constr_check_f Str4_constraint; ber_type_decoder_f Str4_decode_ber; der_type_encoder_f Str4_encode_der; +xer_type_decoder_f Str4_decode_xer; xer_type_encoder_f Str4_encode_xer; /*** <<< CTABLES [Str4] >>> ***/ @@ -1113,6 +1170,13 @@ Str4_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +Str4_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + Str4_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t Str4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -1135,7 +1199,7 @@ asn_TYPE_descriptor_t asn_DEF_Str4 = { Str4_constraint, Str4_decode_ber, Str4_encode_der, - 0, /* Not implemented yet */ + Str4_decode_xer, Str4_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_Str4_tags, @@ -1166,6 +1230,7 @@ asn_struct_print_f PER_Visible_print; asn_constr_check_f PER_Visible_constraint; ber_type_decoder_f PER_Visible_decode_ber; der_type_encoder_f PER_Visible_encode_der; +xer_type_decoder_f PER_Visible_decode_xer; xer_type_encoder_f PER_Visible_encode_xer; /*** <<< CTABLES [PER-Visible] >>> ***/ @@ -1256,6 +1321,13 @@ PER_Visible_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +PER_Visible_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + PER_Visible_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t PER_Visible_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -1278,7 +1350,7 @@ asn_TYPE_descriptor_t asn_DEF_PER_Visible = { PER_Visible_constraint, PER_Visible_decode_ber, PER_Visible_encode_der, - 0, /* Not implemented yet */ + PER_Visible_decode_xer, PER_Visible_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_PER_Visible_tags, @@ -1309,6 +1381,7 @@ asn_struct_print_f PER_Visible_2_print; asn_constr_check_f PER_Visible_2_constraint; ber_type_decoder_f PER_Visible_2_decode_ber; der_type_encoder_f PER_Visible_2_encode_der; +xer_type_decoder_f PER_Visible_2_decode_xer; xer_type_encoder_f PER_Visible_2_encode_xer; /*** <<< CTABLES [PER-Visible-2] >>> ***/ @@ -1399,6 +1472,13 @@ PER_Visible_2_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +PER_Visible_2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + PER_Visible_2_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t PER_Visible_2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -1421,7 +1501,7 @@ asn_TYPE_descriptor_t asn_DEF_PER_Visible_2 = { PER_Visible_2_constraint, PER_Visible_2_decode_ber, PER_Visible_2_encode_der, - 0, /* Not implemented yet */ + PER_Visible_2_decode_xer, PER_Visible_2_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_PER_Visible_2_tags, @@ -1452,6 +1532,7 @@ asn_struct_print_f Not_PER_Visible_1_print; asn_constr_check_f Not_PER_Visible_1_constraint; ber_type_decoder_f Not_PER_Visible_1_decode_ber; der_type_encoder_f Not_PER_Visible_1_encode_der; +xer_type_decoder_f Not_PER_Visible_1_decode_xer; xer_type_encoder_f Not_PER_Visible_1_encode_xer; /*** <<< CTABLES [Not-PER-Visible-1] >>> ***/ @@ -1542,6 +1623,13 @@ Not_PER_Visible_1_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +Not_PER_Visible_1_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + Not_PER_Visible_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t Not_PER_Visible_1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -1564,7 +1652,7 @@ asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_1 = { Not_PER_Visible_1_constraint, Not_PER_Visible_1_decode_ber, Not_PER_Visible_1_encode_der, - 0, /* Not implemented yet */ + Not_PER_Visible_1_decode_xer, Not_PER_Visible_1_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_Not_PER_Visible_1_tags, @@ -1595,6 +1683,7 @@ asn_struct_print_f Not_PER_Visible_2_print; asn_constr_check_f Not_PER_Visible_2_constraint; ber_type_decoder_f Not_PER_Visible_2_decode_ber; der_type_encoder_f Not_PER_Visible_2_encode_der; +xer_type_decoder_f Not_PER_Visible_2_decode_xer; xer_type_encoder_f Not_PER_Visible_2_encode_xer; /*** <<< CTABLES [Not-PER-Visible-2] >>> ***/ @@ -1685,6 +1774,13 @@ Not_PER_Visible_2_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +Not_PER_Visible_2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + Not_PER_Visible_2_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t Not_PER_Visible_2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -1707,7 +1803,7 @@ asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_2 = { Not_PER_Visible_2_constraint, Not_PER_Visible_2_decode_ber, Not_PER_Visible_2_encode_der, - 0, /* Not implemented yet */ + Not_PER_Visible_2_decode_xer, Not_PER_Visible_2_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_Not_PER_Visible_2_tags, @@ -1738,6 +1834,7 @@ asn_struct_print_f Not_PER_Visible_3_print; asn_constr_check_f Not_PER_Visible_3_constraint; ber_type_decoder_f Not_PER_Visible_3_decode_ber; der_type_encoder_f Not_PER_Visible_3_encode_der; +xer_type_decoder_f Not_PER_Visible_3_decode_xer; xer_type_encoder_f Not_PER_Visible_3_encode_xer; /*** <<< CTABLES [Not-PER-Visible-3] >>> ***/ @@ -1828,6 +1925,13 @@ Not_PER_Visible_3_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +Not_PER_Visible_3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + Not_PER_Visible_3_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t Not_PER_Visible_3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -1850,7 +1954,7 @@ asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_3 = { Not_PER_Visible_3_constraint, Not_PER_Visible_3_decode_ber, Not_PER_Visible_3_encode_der, - 0, /* Not implemented yet */ + Not_PER_Visible_3_decode_xer, Not_PER_Visible_3_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_Not_PER_Visible_3_tags, @@ -1881,6 +1985,7 @@ asn_struct_print_f SIZE_but_not_FROM_print; asn_constr_check_f SIZE_but_not_FROM_constraint; ber_type_decoder_f SIZE_but_not_FROM_decode_ber; der_type_encoder_f SIZE_but_not_FROM_encode_der; +xer_type_decoder_f SIZE_but_not_FROM_decode_xer; xer_type_encoder_f SIZE_but_not_FROM_encode_xer; /*** <<< CTABLES [SIZE-but-not-FROM] >>> ***/ @@ -1974,6 +2079,13 @@ SIZE_but_not_FROM_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +SIZE_but_not_FROM_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + SIZE_but_not_FROM_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t SIZE_but_not_FROM_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -1996,7 +2108,7 @@ asn_TYPE_descriptor_t asn_DEF_SIZE_but_not_FROM = { SIZE_but_not_FROM_constraint, SIZE_but_not_FROM_decode_ber, SIZE_but_not_FROM_encode_der, - 0, /* Not implemented yet */ + SIZE_but_not_FROM_decode_xer, SIZE_but_not_FROM_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_SIZE_but_not_FROM_tags, @@ -2027,6 +2139,7 @@ asn_struct_print_f SIZE_and_FROM_print; asn_constr_check_f SIZE_and_FROM_constraint; ber_type_decoder_f SIZE_and_FROM_decode_ber; der_type_encoder_f SIZE_and_FROM_encode_der; +xer_type_decoder_f SIZE_and_FROM_decode_xer; xer_type_encoder_f SIZE_and_FROM_encode_xer; /*** <<< CTABLES [SIZE-and-FROM] >>> ***/ @@ -2120,6 +2233,13 @@ SIZE_and_FROM_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +SIZE_and_FROM_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + SIZE_and_FROM_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t SIZE_and_FROM_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -2142,7 +2262,7 @@ asn_TYPE_descriptor_t asn_DEF_SIZE_and_FROM = { SIZE_and_FROM_constraint, SIZE_and_FROM_decode_ber, SIZE_and_FROM_encode_der, - 0, /* Not implemented yet */ + SIZE_and_FROM_decode_xer, SIZE_and_FROM_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_SIZE_and_FROM_tags, @@ -2173,6 +2293,7 @@ asn_struct_print_f Neither_SIZE_nor_FROM_print; asn_constr_check_f Neither_SIZE_nor_FROM_constraint; ber_type_decoder_f Neither_SIZE_nor_FROM_decode_ber; der_type_encoder_f Neither_SIZE_nor_FROM_encode_der; +xer_type_decoder_f Neither_SIZE_nor_FROM_decode_xer; xer_type_encoder_f Neither_SIZE_nor_FROM_encode_xer; /*** <<< CTABLES [Neither-SIZE-nor-FROM] >>> ***/ @@ -2263,6 +2384,13 @@ Neither_SIZE_nor_FROM_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +Neither_SIZE_nor_FROM_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + Neither_SIZE_nor_FROM_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t Neither_SIZE_nor_FROM_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -2285,7 +2413,7 @@ asn_TYPE_descriptor_t asn_DEF_Neither_SIZE_nor_FROM = { Neither_SIZE_nor_FROM_constraint, Neither_SIZE_nor_FROM_decode_ber, Neither_SIZE_nor_FROM_encode_der, - 0, /* Not implemented yet */ + Neither_SIZE_nor_FROM_decode_xer, Neither_SIZE_nor_FROM_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_Neither_SIZE_nor_FROM_tags, @@ -2316,6 +2444,7 @@ asn_struct_print_f Utf8_4_print; asn_constr_check_f Utf8_4_constraint; ber_type_decoder_f Utf8_4_decode_ber; der_type_encoder_f Utf8_4_encode_der; +xer_type_decoder_f Utf8_4_decode_xer; xer_type_encoder_f Utf8_4_encode_xer; /*** <<< CTABLES [Utf8-4] >>> ***/ @@ -2400,6 +2529,13 @@ Utf8_4_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +Utf8_4_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + Utf8_4_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t Utf8_4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -2422,7 +2558,7 @@ asn_TYPE_descriptor_t asn_DEF_Utf8_4 = { Utf8_4_constraint, Utf8_4_decode_ber, Utf8_4_encode_der, - 0, /* Not implemented yet */ + Utf8_4_decode_xer, Utf8_4_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_Utf8_4_tags, @@ -2453,6 +2589,7 @@ asn_struct_print_f Utf8_3_print; asn_constr_check_f Utf8_3_constraint; ber_type_decoder_f Utf8_3_decode_ber; der_type_encoder_f Utf8_3_encode_der; +xer_type_decoder_f Utf8_3_decode_xer; xer_type_encoder_f Utf8_3_encode_xer; /*** <<< CTABLES [Utf8-3] >>> ***/ @@ -2565,6 +2702,13 @@ Utf8_3_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +Utf8_3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + Utf8_3_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t Utf8_3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -2587,7 +2731,7 @@ asn_TYPE_descriptor_t asn_DEF_Utf8_3 = { Utf8_3_constraint, Utf8_3_decode_ber, Utf8_3_encode_der, - 0, /* Not implemented yet */ + Utf8_3_decode_xer, Utf8_3_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_Utf8_3_tags, @@ -2618,6 +2762,7 @@ asn_struct_print_f Utf8_2_print; asn_constr_check_f Utf8_2_constraint; ber_type_decoder_f Utf8_2_decode_ber; der_type_encoder_f Utf8_2_encode_der; +xer_type_decoder_f Utf8_2_decode_xer; xer_type_encoder_f Utf8_2_encode_xer; /*** <<< CODE [Utf8-2] >>> ***/ @@ -2700,6 +2845,13 @@ Utf8_2_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +Utf8_2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + Utf8_2_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t Utf8_2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -2722,7 +2874,7 @@ asn_TYPE_descriptor_t asn_DEF_Utf8_2 = { Utf8_2_constraint, Utf8_2_decode_ber, Utf8_2_encode_der, - 0, /* Not implemented yet */ + Utf8_2_decode_xer, Utf8_2_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_Utf8_2_tags, @@ -2791,6 +2943,7 @@ asn_struct_print_f Identifier_print; asn_constr_check_f Identifier_constraint; ber_type_decoder_f Identifier_decode_ber; der_type_encoder_f Identifier_encode_der; +xer_type_decoder_f Identifier_decode_xer; xer_type_encoder_f Identifier_encode_xer; /*** <<< CTABLES [Identifier] >>> ***/ @@ -2896,6 +3049,13 @@ Identifier_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +Identifier_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + Identifier_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t Identifier_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -2918,7 +3078,7 @@ asn_TYPE_descriptor_t asn_DEF_Identifier = { Identifier_constraint, Identifier_decode_ber, Identifier_encode_der, - 0, /* Not implemented yet */ + Identifier_decode_xer, Identifier_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_Identifier_tags, diff --git a/tests/65-multi-tag-OK.asn1.-P b/tests/65-multi-tag-OK.asn1.-P index 4ffc4b20c..5319d50e5 100644 --- a/tests/65-multi-tag-OK.asn1.-P +++ b/tests/65-multi-tag-OK.asn1.-P @@ -16,6 +16,7 @@ asn_struct_print_f T1_print; asn_constr_check_f T1_constraint; ber_type_decoder_f T1_decode_ber; der_type_encoder_f T1_encode_der; +xer_type_decoder_f T1_decode_xer; xer_type_encoder_f T1_encode_xer; /*** <<< CODE [T1] >>> ***/ @@ -74,6 +75,13 @@ T1_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +T1_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + T1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t T1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -107,7 +115,7 @@ asn_TYPE_descriptor_t asn_DEF_T1 = { T1_constraint, T1_decode_ber, T1_encode_der, - 0, /* Not implemented yet */ + T1_decode_xer, T1_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_T1_tags, @@ -138,6 +146,7 @@ asn_struct_print_f T2_print; asn_constr_check_f T2_constraint; ber_type_decoder_f T2_decode_ber; der_type_encoder_f T2_encode_der; +xer_type_decoder_f T2_decode_xer; xer_type_encoder_f T2_encode_xer; /*** <<< CODE [T2] >>> ***/ @@ -196,6 +205,13 @@ T2_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +T2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + T2_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t T2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -227,7 +243,7 @@ asn_TYPE_descriptor_t asn_DEF_T2 = { T2_constraint, T2_decode_ber, T2_encode_der, - 0, /* Not implemented yet */ + T2_decode_xer, T2_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_T2_tags, @@ -258,6 +274,7 @@ asn_struct_print_f T3_print; asn_constr_check_f T3_constraint; ber_type_decoder_f T3_decode_ber; der_type_encoder_f T3_encode_der; +xer_type_decoder_f T3_decode_xer; xer_type_encoder_f T3_encode_xer; /*** <<< CODE [T3] >>> ***/ @@ -316,6 +333,13 @@ T3_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +T3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + T3_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t T3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -345,7 +369,7 @@ asn_TYPE_descriptor_t asn_DEF_T3 = { T3_constraint, T3_decode_ber, T3_encode_der, - 0, /* Not implemented yet */ + T3_decode_xer, T3_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_T3_tags, @@ -376,6 +400,7 @@ asn_struct_print_f T4_print; asn_constr_check_f T4_constraint; ber_type_decoder_f T4_decode_ber; der_type_encoder_f T4_encode_der; +xer_type_decoder_f T4_decode_xer; xer_type_encoder_f T4_encode_xer; /*** <<< CODE [T4] >>> ***/ @@ -434,6 +459,13 @@ T4_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +T4_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + T4_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t T4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -458,7 +490,7 @@ asn_TYPE_descriptor_t asn_DEF_T4 = { T4_constraint, T4_decode_ber, T4_encode_der, - 0, /* Not implemented yet */ + T4_decode_xer, T4_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_T4_tags, @@ -489,6 +521,7 @@ asn_struct_print_f T5_print; asn_constr_check_f T5_constraint; ber_type_decoder_f T5_decode_ber; der_type_encoder_f T5_encode_der; +xer_type_decoder_f T5_decode_xer; xer_type_encoder_f T5_encode_xer; /*** <<< CODE [T5] >>> ***/ @@ -547,6 +580,13 @@ T5_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +T5_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + T5_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t T5_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -570,7 +610,7 @@ asn_TYPE_descriptor_t asn_DEF_T5 = { T5_constraint, T5_decode_ber, T5_encode_der, - 0, /* Not implemented yet */ + T5_decode_xer, T5_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_T5_tags, @@ -620,6 +660,7 @@ asn_struct_print_f T_print; asn_constr_check_f T_constraint; ber_type_decoder_f T_decode_ber; der_type_encoder_f T_encode_der; +xer_type_decoder_f T_decode_xer; xer_type_encoder_f T_encode_xer; /*** <<< CODE [T] >>> ***/ @@ -678,6 +719,13 @@ T_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +T_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + T_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t T_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -702,7 +750,7 @@ asn_TYPE_descriptor_t asn_DEF_T = { T_constraint, T_decode_ber, T_encode_der, - 0, /* Not implemented yet */ + T_decode_xer, T_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_T_tags, diff --git a/tests/65-multi-tag-OK.asn1.-Pfnative-types b/tests/65-multi-tag-OK.asn1.-Pfnative-types index 796962aec..eb2f1c41f 100644 --- a/tests/65-multi-tag-OK.asn1.-Pfnative-types +++ b/tests/65-multi-tag-OK.asn1.-Pfnative-types @@ -16,6 +16,7 @@ asn_struct_print_f T1_print; asn_constr_check_f T1_constraint; ber_type_decoder_f T1_decode_ber; der_type_encoder_f T1_encode_der; +xer_type_decoder_f T1_decode_xer; xer_type_encoder_f T1_encode_xer; /*** <<< CODE [T1] >>> ***/ @@ -74,6 +75,13 @@ T1_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +T1_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + T1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t T1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -107,7 +115,7 @@ asn_TYPE_descriptor_t asn_DEF_T1 = { T1_constraint, T1_decode_ber, T1_encode_der, - 0, /* Not implemented yet */ + T1_decode_xer, T1_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_T1_tags, @@ -138,6 +146,7 @@ asn_struct_print_f T2_print; asn_constr_check_f T2_constraint; ber_type_decoder_f T2_decode_ber; der_type_encoder_f T2_encode_der; +xer_type_decoder_f T2_decode_xer; xer_type_encoder_f T2_encode_xer; /*** <<< CODE [T2] >>> ***/ @@ -196,6 +205,13 @@ T2_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +T2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + T2_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t T2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -227,7 +243,7 @@ asn_TYPE_descriptor_t asn_DEF_T2 = { T2_constraint, T2_decode_ber, T2_encode_der, - 0, /* Not implemented yet */ + T2_decode_xer, T2_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_T2_tags, @@ -258,6 +274,7 @@ asn_struct_print_f T3_print; asn_constr_check_f T3_constraint; ber_type_decoder_f T3_decode_ber; der_type_encoder_f T3_encode_der; +xer_type_decoder_f T3_decode_xer; xer_type_encoder_f T3_encode_xer; /*** <<< CODE [T3] >>> ***/ @@ -316,6 +333,13 @@ T3_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +T3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + T3_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t T3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -345,7 +369,7 @@ asn_TYPE_descriptor_t asn_DEF_T3 = { T3_constraint, T3_decode_ber, T3_encode_der, - 0, /* Not implemented yet */ + T3_decode_xer, T3_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_T3_tags, @@ -376,6 +400,7 @@ asn_struct_print_f T4_print; asn_constr_check_f T4_constraint; ber_type_decoder_f T4_decode_ber; der_type_encoder_f T4_encode_der; +xer_type_decoder_f T4_decode_xer; xer_type_encoder_f T4_encode_xer; /*** <<< CODE [T4] >>> ***/ @@ -434,6 +459,13 @@ T4_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +T4_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + T4_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t T4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -458,7 +490,7 @@ asn_TYPE_descriptor_t asn_DEF_T4 = { T4_constraint, T4_decode_ber, T4_encode_der, - 0, /* Not implemented yet */ + T4_decode_xer, T4_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_T4_tags, @@ -489,6 +521,7 @@ asn_struct_print_f T5_print; asn_constr_check_f T5_constraint; ber_type_decoder_f T5_decode_ber; der_type_encoder_f T5_encode_der; +xer_type_decoder_f T5_decode_xer; xer_type_encoder_f T5_encode_xer; /*** <<< CODE [T5] >>> ***/ @@ -547,6 +580,13 @@ T5_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +T5_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + T5_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t T5_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -570,7 +610,7 @@ asn_TYPE_descriptor_t asn_DEF_T5 = { T5_constraint, T5_decode_ber, T5_encode_der, - 0, /* Not implemented yet */ + T5_decode_xer, T5_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_T5_tags, @@ -620,6 +660,7 @@ asn_struct_print_f T_print; asn_constr_check_f T_constraint; ber_type_decoder_f T_decode_ber; der_type_encoder_f T_encode_der; +xer_type_decoder_f T_decode_xer; xer_type_encoder_f T_encode_xer; /*** <<< CODE [T] >>> ***/ @@ -678,6 +719,13 @@ T_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +T_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + T_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t T_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -702,7 +750,7 @@ asn_TYPE_descriptor_t asn_DEF_T = { T_constraint, T_decode_ber, T_encode_der, - 0, /* Not implemented yet */ + T_decode_xer, T_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_T_tags, diff --git a/tests/66-ref-simple-OK.asn1.-P b/tests/66-ref-simple-OK.asn1.-P index 0131c9194..a2b3357e9 100644 --- a/tests/66-ref-simple-OK.asn1.-P +++ b/tests/66-ref-simple-OK.asn1.-P @@ -86,6 +86,7 @@ asn_struct_print_f SimpleType_print; asn_constr_check_f SimpleType_constraint; ber_type_decoder_f SimpleType_decode_ber; der_type_encoder_f SimpleType_encode_der; +xer_type_decoder_f SimpleType_decode_xer; xer_type_encoder_f SimpleType_encode_xer; /*** <<< CODE [SimpleType] >>> ***/ @@ -144,6 +145,13 @@ SimpleType_encode_der(asn_TYPE_descriptor_t *td, return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } +asn_dec_rval_t +SimpleType_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, void *bufptr, size_t size) { + SimpleType_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + asn_enc_rval_t SimpleType_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, @@ -166,7 +174,7 @@ asn_TYPE_descriptor_t asn_DEF_SimpleType = { SimpleType_constraint, SimpleType_decode_ber, SimpleType_encode_der, - 0, /* Not implemented yet */ + SimpleType_decode_xer, SimpleType_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_SimpleType_tags, From b840485078ab2215546d1a0ed0962f4cf03ab87f Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Oct 2004 13:27:03 +0000 Subject: [PATCH 0547/1469] refactoring git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@547 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/xer_decoder.c | 82 ++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 42 deletions(-) diff --git a/skeletons/xer_decoder.c b/skeletons/xer_decoder.c index b7bc83bbf..db27a4971 100644 --- a/skeletons/xer_decoder.c +++ b/skeletons/xer_decoder.c @@ -189,7 +189,6 @@ xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, asn_dec_rval_t rval; ssize_t consumed_myself = 0; - pxer_chunk_type_e ch_type; /* XER chunk type */ int xer_state; /* XER low level parsing context */ (void)opt_codec_ctx; @@ -201,8 +200,9 @@ xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, */ if(ctx->phase > 1) RETURN(RC_FAIL); for(xer_state = ctx->step;;) { - ssize_t ch_size; /* Chunk size */ - xer_check_tag_e tcv; /* Tag check value */ + pxer_chunk_type_e ch_type; /* XER chunk type */ + ssize_t ch_size; /* Chunk size */ + xer_check_tag_e tcv; /* Tag check value */ /* * Get the next part of the XML stream. @@ -239,51 +239,49 @@ xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, assert(ch_type == PXER_TAG && size); tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); - if(ctx->phase == 0) { + /* + * Phase 0: + * Expecting the opening tag + * for the type being processed. + * Phase 1: + * Waiting for the closing XML tag. + */ + switch(tcv) { + case XCT_BOTH: + if(ctx->phase) break; + /* Finished decoding of an empty element */ + XER_GOT_EMPTY(); + ADVANCE(ch_size); + ctx->phase = 2; /* Phase out */ + RETURN(RC_OK); + case XCT_OPENING: + if(ctx->phase) break; + ADVANCE(ch_size); + ctx->phase = 1; /* Processing body phase */ + continue; + case XCT_CLOSING: + if(!ctx->phase) break; + ADVANCE(ch_size); + ctx->phase = 2; /* Phase out */ + RETURN(RC_OK); + case XCT_UNEXPECTED: + if(!ctx->phase) break; /* - * Expecting the opening tag - * for the type being processed. + * Certain tags in the body may be expected. */ - switch(tcv) { - case XCT_BOTH: - /* Finished decoding of an empty element */ - XER_GOT_EMPTY(); - ADVANCE(ch_size); - ctx->phase = 2; /* Phase out */ - RETURN(RC_OK); - case XCT_OPENING: + if(opt_unexpected_tag_decoder + && opt_unexpected_tag_decoder(struct_key, + buf_ptr, ch_size) == 0) { + /* Tag's processed fine */ ADVANCE(ch_size); - ctx->phase = 1; /* Processing body phase */ continue; - default: - break; /* Unexpected tag */ - } - } else { - /* - * Waiting for the closing XML tag. - */ - switch(tcv) { - case XCT_CLOSING: - ADVANCE(ch_size); - ctx->phase = 2; /* Phase out */ - RETURN(RC_OK); - case XCT_UNEXPECTED: - /* - * Certain tags in the body may be expected. - */ - if(opt_unexpected_tag_decoder - && opt_unexpected_tag_decoder(struct_key, - buf_ptr, ch_size) == 0) { - /* Tag's processed fine */ - ADVANCE(ch_size); - continue; - } - /* Fall through */ - default: - break; } - ASN_DEBUG("Unexpected XML tag"); + /* Fall through */ + default: + break; /* Unexpected tag */ } + + ASN_DEBUG("Unexpected XML tag"); break; /* Dark and mysterious things have just happened */ } From e1adad56c3858f47da579e67f28830214600934f Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Oct 2004 13:27:30 +0000 Subject: [PATCH 0548/1469] initial XER decoder implementation git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@548 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SEQUENCE.c | 193 ++++++++++++++++++++++++++++++++++++ skeletons/constr_SEQUENCE.h | 1 + 2 files changed, 194 insertions(+) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index fcca4799b..f811ac5f7 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -588,6 +588,199 @@ SEQUENCE_encode_der(asn_TYPE_descriptor_t *td, return erval; } +#undef ADVANCE /* Just in case */ +#undef XER_ADVANCE +#define XER_ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + buf_ptr = ((char *)buf_ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +asn_dec_rval_t +SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **struct_ptr, const char *opt_mname, + void *buf_ptr, size_t size) { + /* + * Bring closer parts of structure description. + */ + asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics; + asn_TYPE_member_t *elements = td->elements; + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + asn_dec_rval_t rval; + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + int xer_state; /* XER low level parsing context */ + int edx; /* Element index */ + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) RETURN(RC_FAIL); + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + + /* + * Phases of XER/XML processing: + * Phase 0: Check that the opening tag matches our expectations. + * Phase 1: Processing body and reacting on closing tag. + * Phase 2: Processing inner type. + */ + + if(ctx->phase > 2) RETURN(RC_FAIL); + for(xer_state = ctx->left, edx = ctx->step;;) { + pxer_chunk_type_e ch_type; /* XER chunk type */ + ssize_t ch_size; /* Chunk size */ + xer_check_tag_e tcv; /* Tag check value */ + asn_TYPE_member_t *elm; + + /* + * Go inside the member. + */ + if(ctx->phase == 2) { + asn_dec_rval_t tmprval; + elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + tmprval = elm->type->xer_decoder(opt_codec_ctx, + elm->type, memb_ptr2, elm->name, + buf_ptr, size); + XER_ADVANCE(tmprval.consumed); + if(tmprval.code != RC_OK) + RETURN(tmprval.code); + ctx->phase = 1; + ctx->left = xer_state = 0; /* New, clean state */ + ctx->step = ++edx; + /* Fall through */ + } + + /* + * Get the next part of the XML stream. + */ + ch_size = xer_next_token(&xer_state, buf_ptr, size, &ch_type); + switch(ch_size) { + case -1: RETURN(RC_FAIL); + case 0: + ctx->left = xer_state; + RETURN(RC_WMORE); + default: + switch(ch_type) { + case PXER_COMMENT: /* Got XML comment */ + case PXER_TEXT: /* Ignore free-standing text */ + XER_ADVANCE(ch_size); /* Skip silently */ + continue; + case PXER_TAG: + break; /* Check the rest down there */ + } + } + + tcv = xer_check_tag(buf_ptr, size, xml_tag); + switch(tcv) { + case XCT_CLOSING: + if(ctx->phase == 0) break; + XER_ADVANCE(ch_size); + ctx->phase = 0; + /* Fall through */ + case XCT_BOTH: + if(ctx->phase == 0) { + if(edx >= td->elements_count + || + /* Explicit OPTIONAL specs reaches the end */ + (edx + elements[edx].optional + == td->elements_count) + || + /* All extensions are optional */ + (IN_EXTENSION_GROUP(specs, edx) + && specs->ext_before + > td->elements_count) + ) { + XER_ADVANCE(ch_size); + ctx->phase = 3; /* Phase out */ + continue; + } else { + ASN_DEBUG("Premature end of XER SEQUENCE"); + RETURN(RC_FAIL); + } + } + /* Fall through */ + case XCT_OPENING: + if(ctx->phase == 0) { + XER_ADVANCE(ch_size); + ctx->phase = 1; /* Processing body phase */ + continue; + } + case XCT_UNEXPECTED: { + int edx_end; + int n; + + if(!ctx->phase + || edx >= td->elements_count + || !IN_EXTENSION_GROUP(specs, td->elements_count)) + break; /* Really unexpected */ + + /* + * Search which member corresponds to this tag. + */ + edx_end = edx + elements[edx].optional + 1; + for(n = edx; n < edx_end; n++) { + elm = &td->elements[n]; + tcv = xer_check_tag(buf_ptr, size, elm->name); + switch(tcv) { + case XCT_BOTH: + case XCT_OPENING: + /* + * Process this member. + */ + ctx->step = edx = n; + ctx->phase = 2; + break; + case XCT_UNEXPECTED: + continue; /* or continue; */ + case XCT_CLOSING: + default: + n = edx_end; + break; /* Phase out */ + } + break; + } + if(n == edx_end) break; + continue; + } + default: + break; + } + + ASN_DEBUG("Unexpected XML tag in SEQUENCE"); + break; + } + + ctx->phase = 3; /* Phase out, just in case */ + RETURN(RC_FAIL); +} + asn_enc_rval_t SEQUENCE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, diff --git a/skeletons/constr_SEQUENCE.h b/skeletons/constr_SEQUENCE.h index 0b3607915..e7bb4fee9 100644 --- a/skeletons/constr_SEQUENCE.h +++ b/skeletons/constr_SEQUENCE.h @@ -36,6 +36,7 @@ asn_struct_print_f SEQUENCE_print; asn_constr_check_f SEQUENCE_constraint; ber_type_decoder_f SEQUENCE_decode_ber; der_type_encoder_f SEQUENCE_encode_der; +xer_type_decoder_f SEQUENCE_decode_xer; xer_type_encoder_f SEQUENCE_encode_xer; #endif /* _CONSTR_SEQUENCE_H_ */ From e03646bf146b1061d83be32d0a4baedb85ed51a9 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Oct 2004 13:34:00 +0000 Subject: [PATCH 0549/1469] some XER support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@549 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 882ed507f..5b9eae695 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -966,6 +966,17 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("}\n"); OUT("\n"); + p = MKID(expr->Identifier); + OUT("asn_dec_rval_t\n"); + OUT("%s_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,\n", p); + INDENTED( + OUT("\tvoid **structure, const char *opt_mname, void *bufptr, size_t size) {\n"); + OUT("%s_inherit_TYPE_descriptor(td);\n", p); + OUT("return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);\n"); + ); + OUT("}\n"); + OUT("\n"); + p = MKID(expr->Identifier); OUT("asn_enc_rval_t\n"); OUT("%s_encode_xer(asn_TYPE_descriptor_t *td, void *structure,\n", p); @@ -990,6 +1001,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("asn_constr_check_f %s_constraint;\n", p); OUT("ber_type_decoder_f %s_decode_ber;\n", p); OUT("der_type_encoder_f %s_encode_der;\n", p); + OUT("xer_type_decoder_f %s_decode_xer;\n", p); OUT("xer_type_encoder_f %s_encode_xer;\n", p); REDIR(OT_TYPE_DECLS); @@ -1496,7 +1508,11 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ OUT("%s_constraint,\n", p); OUT("%s_decode_ber,\n", p); OUT("%s_encode_der,\n", p); - OUT("0, /* Not implemented yet */\n"); + if(!(expr->expr_type & ASN_CONSTR_MASK) + && (expr->expr_type != ASN_CONSTR_SEQUENCE)) + OUT("%s_decode_xer,\n", p); + else + OUT("0,\t\t\t\t/* Not implemented yet */\n"); OUT("%s_encode_xer,\n", p); p = MKID(expr->Identifier); From 6fbdf97e2c2ba8f1be1241defce8d2b6ec05f1a5 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Oct 2004 14:57:50 +0000 Subject: [PATCH 0550/1469] CHOICE XER support, draft git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@550 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_CHOICE.c | 173 ++++++++++++++++++++++++++++++++++++++ skeletons/constr_CHOICE.h | 1 + 2 files changed, 174 insertions(+) diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 9305313ec..cbd857905 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -539,6 +539,179 @@ CHOICE_constraint(asn_TYPE_descriptor_t *td, const void *sptr, } } +#undef ADVANCE /* Just in case */ +#undef XER_ADVANCE +#define XER_ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + buf_ptr = ((char *)buf_ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +asn_dec_rval_t +CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **struct_ptr, const char *opt_mname, + void *buf_ptr, size_t size) { + /* + * Bring closer parts of structure description. + */ + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + asn_dec_rval_t rval; + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + int xer_state; /* XER low level parsing context */ + int edx; /* Element index */ + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) RETURN(RC_FAIL); + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + + /* + * Phases of XER/XML processing: + * Phase 0: Check that the opening tag matches our expectations. + * Phase 1: Processing body and reacting on closing tag. + * Phase 2: Processing inner type. + * Phase 3: Only waiting for closing tag + */ + + if(ctx->phase > 3) RETURN(RC_FAIL); + for(xer_state = ctx->left, edx = ctx->step;;) { + pxer_chunk_type_e ch_type; /* XER chunk type */ + ssize_t ch_size; /* Chunk size */ + xer_check_tag_e tcv; /* Tag check value */ + asn_TYPE_member_t *elm; + + /* + * Go inside the member. + */ + if(ctx->phase == 2) { + asn_dec_rval_t tmprval; + elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + tmprval = elm->type->xer_decoder(opt_codec_ctx, + elm->type, memb_ptr2, elm->name, + buf_ptr, size); + XER_ADVANCE(tmprval.consumed); + if(tmprval.code != RC_OK) + RETURN(tmprval.code); + ctx->left = xer_state = 0; /* New, clean state */ + ctx->phase = 3; + /* Fall through */ + } + + /* + * Get the next part of the XML stream. + */ + ch_size = xer_next_token(&xer_state, buf_ptr, size, &ch_type); + switch(ch_size) { + case -1: RETURN(RC_FAIL); + case 0: + ctx->left = xer_state; + RETURN(RC_WMORE); + default: + switch(ch_type) { + case PXER_COMMENT: /* Got XML comment */ + case PXER_TEXT: /* Ignore free-standing text */ + XER_ADVANCE(ch_size); /* Skip silently */ + continue; + case PXER_TAG: + break; /* Check the rest down there */ + } + } + + tcv = xer_check_tag(buf_ptr, size, xml_tag); + switch(tcv) { + case XCT_BOTH: + if(ctx->phase == 3) + break; + case XCT_CLOSING: + if(ctx->phase == 0) + break; + XER_ADVANCE(ch_size); + ctx->phase = 4; + RETURN(RC_OK); + case XCT_OPENING: + if(ctx->phase == 0) { + XER_ADVANCE(ch_size); + ctx->phase = 1; /* Processing body phase */ + continue; + } else if(ctx->phase == 3) { + /* But we're waiting for closing! */ + break; + } + /* Fall through */ + case XCT_UNEXPECTED: + + if(ctx->phase != 1) + break; /* Really unexpected */ + + /* + * Search which member corresponds to this tag. + */ + for(edx = 0; edx < td->elements_count; edx++) { + elm = &td->elements[edx]; + tcv = xer_check_tag(buf_ptr, size, elm->name); + switch(tcv) { + case XCT_BOTH: + case XCT_OPENING: + /* + * Process this member. + */ + ctx->step = edx; + ctx->phase = 2; + break; + case XCT_UNEXPECTED: + continue; /* or continue; */ + case XCT_CLOSING: + default: + edx = td->elements_count; + break; /* Phase out */ + } + break; + } + if(edx == td->elements_count) break; + continue; + default: + break; + } + + ASN_DEBUG("Unexpected XML tag in SEQUENCE"); + break; + } + + ctx->phase = 4; /* Phase out, just in case */ + RETURN(RC_FAIL); +} + + asn_enc_rval_t CHOICE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, diff --git a/skeletons/constr_CHOICE.h b/skeletons/constr_CHOICE.h index 2685134bb..ea32467c1 100644 --- a/skeletons/constr_CHOICE.h +++ b/skeletons/constr_CHOICE.h @@ -36,6 +36,7 @@ asn_struct_print_f CHOICE_print; asn_constr_check_f CHOICE_constraint; ber_type_decoder_f CHOICE_decode_ber; der_type_encoder_f CHOICE_encode_der; +xer_type_decoder_f CHOICE_decode_xer; xer_type_encoder_f CHOICE_encode_xer; asn_outmost_tag_f CHOICE_outmost_tag; From 22d3f5deaca87fc31832072e84f82ceea23940fb Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Oct 2004 14:58:15 +0000 Subject: [PATCH 0551/1469] removed check for extension group git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@551 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SEQUENCE.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index f811ac5f7..ca0766d3c 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -732,13 +732,13 @@ SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ctx->phase = 1; /* Processing body phase */ continue; } + /* Fall through */ case XCT_UNEXPECTED: { int edx_end; int n; if(!ctx->phase - || edx >= td->elements_count - || !IN_EXTENSION_GROUP(specs, td->elements_count)) + || edx >= td->elements_count) break; /* Really unexpected */ /* From 2dbab7c4202a35eeb0bbcb5f9edb3fc3e4ec78f2 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Oct 2004 15:07:45 +0000 Subject: [PATCH 0552/1469] CHOICE XER decoder git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@552 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 14 +++++++++----- tests/19-param-OK.asn1.-P | 4 ++-- tests/31-set-of-OK.asn1.-P | 6 +++--- tests/32-sequence-of-OK.asn1.-P | 2 +- tests/39-sequence-of-OK.asn1.-P | 4 ++-- tests/42-real-life-OK.asn1.-PR | 12 ++++++------ tests/43-recursion-OK.asn1.-P | 4 ++-- tests/44-choice-in-sequence-OK.asn1.-P | 8 ++++---- tests/46-redefine-OK.asn1.-PR | 2 +- tests/47-set-ext-OK.asn1.-P | 4 ++-- tests/60-any-OK.asn1.-P | 4 ++-- tests/65-multi-tag-OK.asn1.-P | 2 +- tests/65-multi-tag-OK.asn1.-Pfnative-types | 2 +- 13 files changed, 36 insertions(+), 32 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 5b9eae695..2cbe258c4 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1508,11 +1508,15 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ OUT("%s_constraint,\n", p); OUT("%s_decode_ber,\n", p); OUT("%s_encode_der,\n", p); - if(!(expr->expr_type & ASN_CONSTR_MASK) - && (expr->expr_type != ASN_CONSTR_SEQUENCE)) - OUT("%s_decode_xer,\n", p); - else - OUT("0,\t\t\t\t/* Not implemented yet */\n"); + switch(expr->expr_type) { + case ASN_CONSTR_SET: + case ASN_CONSTR_SET_OF: + case ASN_CONSTR_SEQUENCE_OF: + OUT("0,\t\t\t\t/* Not implemented yet */\n"); + break; + default: + OUT("%s_decode_xer,\n", p); + } OUT("%s_encode_xer,\n", p); p = MKID(expr->Identifier); diff --git a/tests/19-param-OK.asn1.-P b/tests/19-param-OK.asn1.-P index 0d07f8b29..fe64c7713 100644 --- a/tests/19-param-OK.asn1.-P +++ b/tests/19-param-OK.asn1.-P @@ -114,7 +114,7 @@ asn_TYPE_descriptor_t asn_DEF_toBeSigned = { SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - 0, /* Not implemented yet */ + SEQUENCE_decode_xer, SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_toBeSigned_tags, @@ -175,7 +175,7 @@ asn_TYPE_descriptor_t asn_DEF_Certificate = { SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - 0, /* Not implemented yet */ + SEQUENCE_decode_xer, SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_Certificate_tags, diff --git a/tests/31-set-of-OK.asn1.-P b/tests/31-set-of-OK.asn1.-P index c245bf880..e9ccac146 100644 --- a/tests/31-set-of-OK.asn1.-P +++ b/tests/31-set-of-OK.asn1.-P @@ -122,7 +122,7 @@ asn_TYPE_descriptor_t asn_DEF_Tree = { SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - 0, /* Not implemented yet */ + SEQUENCE_decode_xer, SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_Tree_tags, @@ -289,7 +289,7 @@ asn_TYPE_descriptor_t asn_DEF_anything_member = { SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - 0, /* Not implemented yet */ + SEQUENCE_decode_xer, SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_anything_member_tags, @@ -382,7 +382,7 @@ asn_TYPE_descriptor_t asn_DEF_other = { CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, - 0, /* Not implemented yet */ + CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ diff --git a/tests/32-sequence-of-OK.asn1.-P b/tests/32-sequence-of-OK.asn1.-P index 5c2c9b294..46c7ea82e 100644 --- a/tests/32-sequence-of-OK.asn1.-P +++ b/tests/32-sequence-of-OK.asn1.-P @@ -167,7 +167,7 @@ asn_TYPE_descriptor_t asn_DEF_Error = { SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - 0, /* Not implemented yet */ + SEQUENCE_decode_xer, SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_Error_tags, diff --git a/tests/39-sequence-of-OK.asn1.-P b/tests/39-sequence-of-OK.asn1.-P index 1fecb6f53..76aded237 100644 --- a/tests/39-sequence-of-OK.asn1.-P +++ b/tests/39-sequence-of-OK.asn1.-P @@ -108,7 +108,7 @@ asn_TYPE_descriptor_t asn_DEF_T = { SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - 0, /* Not implemented yet */ + SEQUENCE_decode_xer, SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_T_tags, @@ -185,7 +185,7 @@ asn_TYPE_descriptor_t asn_DEF_T2 = { SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - 0, /* Not implemented yet */ + SEQUENCE_decode_xer, SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_T2_tags, diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index 951e66935..974c0160a 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -144,7 +144,7 @@ asn_TYPE_descriptor_t asn_DEF_LogLine = { SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - 0, /* Not implemented yet */ + SEQUENCE_decode_xer, SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_LogLine_tags, @@ -294,7 +294,7 @@ asn_TYPE_descriptor_t asn_DEF_VariablePartSet = { SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - 0, /* Not implemented yet */ + SEQUENCE_decode_xer, SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_VariablePartSet_tags, @@ -474,7 +474,7 @@ asn_TYPE_descriptor_t asn_DEF_vrange = { SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - 0, /* Not implemented yet */ + SEQUENCE_decode_xer, SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_vrange_tags, @@ -525,7 +525,7 @@ asn_TYPE_descriptor_t asn_DEF_VariablePart = { CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, - 0, /* Not implemented yet */ + CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ @@ -671,7 +671,7 @@ asn_TYPE_descriptor_t asn_DEF_notify = { SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - 0, /* Not implemented yet */ + SEQUENCE_decode_xer, SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_notify_tags, @@ -724,7 +724,7 @@ asn_TYPE_descriptor_t asn_DEF_ActionItem = { SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - 0, /* Not implemented yet */ + SEQUENCE_decode_xer, SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_ActionItem_tags, diff --git a/tests/43-recursion-OK.asn1.-P b/tests/43-recursion-OK.asn1.-P index 004e0f051..9e8d40741 100644 --- a/tests/43-recursion-OK.asn1.-P +++ b/tests/43-recursion-OK.asn1.-P @@ -175,7 +175,7 @@ asn_TYPE_descriptor_t asn_DEF_Test_structure_1 = { SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - 0, /* Not implemented yet */ + SEQUENCE_decode_xer, SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_Test_structure_1_tags, @@ -330,7 +330,7 @@ asn_TYPE_descriptor_t asn_DEF_Choice_1 = { CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, - 0, /* Not implemented yet */ + CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ diff --git a/tests/44-choice-in-sequence-OK.asn1.-P b/tests/44-choice-in-sequence-OK.asn1.-P index bb51a570c..77886f101 100644 --- a/tests/44-choice-in-sequence-OK.asn1.-P +++ b/tests/44-choice-in-sequence-OK.asn1.-P @@ -106,7 +106,7 @@ asn_TYPE_descriptor_t asn_DEF_e = { CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, - 0, /* Not implemented yet */ + CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ @@ -156,7 +156,7 @@ asn_TYPE_descriptor_t asn_DEF_h = { CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, - 0, /* Not implemented yet */ + CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ @@ -223,7 +223,7 @@ asn_TYPE_descriptor_t asn_DEF_b = { CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, - 0, /* Not implemented yet */ + CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ @@ -279,7 +279,7 @@ asn_TYPE_descriptor_t asn_DEF_T = { SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - 0, /* Not implemented yet */ + SEQUENCE_decode_xer, SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_T_tags, diff --git a/tests/46-redefine-OK.asn1.-PR b/tests/46-redefine-OK.asn1.-PR index 5ba6bccfb..2dc369cd6 100644 --- a/tests/46-redefine-OK.asn1.-PR +++ b/tests/46-redefine-OK.asn1.-PR @@ -70,7 +70,7 @@ asn_TYPE_descriptor_t asn_DEF_ConstructedType = { SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - 0, /* Not implemented yet */ + SEQUENCE_decode_xer, SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_ConstructedType_tags, diff --git a/tests/47-set-ext-OK.asn1.-P b/tests/47-set-ext-OK.asn1.-P index 8c2bc2706..cdd6f5309 100644 --- a/tests/47-set-ext-OK.asn1.-P +++ b/tests/47-set-ext-OK.asn1.-P @@ -237,7 +237,7 @@ asn_TYPE_descriptor_t asn_DEF_T3 = { CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, - 0, /* Not implemented yet */ + CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ @@ -312,7 +312,7 @@ asn_TYPE_descriptor_t asn_DEF_T4 = { CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, - 0, /* Not implemented yet */ + CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ diff --git a/tests/60-any-OK.asn1.-P b/tests/60-any-OK.asn1.-P index f740e8a8a..4f55417c5 100644 --- a/tests/60-any-OK.asn1.-P +++ b/tests/60-any-OK.asn1.-P @@ -60,7 +60,7 @@ asn_TYPE_descriptor_t asn_DEF_T1 = { SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - 0, /* Not implemented yet */ + SEQUENCE_decode_xer, SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_T1_tags, @@ -137,7 +137,7 @@ asn_TYPE_descriptor_t asn_DEF_T2 = { SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - 0, /* Not implemented yet */ + SEQUENCE_decode_xer, SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_T2_tags, diff --git a/tests/65-multi-tag-OK.asn1.-P b/tests/65-multi-tag-OK.asn1.-P index 5319d50e5..4c3983437 100644 --- a/tests/65-multi-tag-OK.asn1.-P +++ b/tests/65-multi-tag-OK.asn1.-P @@ -836,7 +836,7 @@ asn_TYPE_descriptor_t asn_DEF_Ts = { SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - 0, /* Not implemented yet */ + SEQUENCE_decode_xer, SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_Ts_tags, diff --git a/tests/65-multi-tag-OK.asn1.-Pfnative-types b/tests/65-multi-tag-OK.asn1.-Pfnative-types index eb2f1c41f..557420350 100644 --- a/tests/65-multi-tag-OK.asn1.-Pfnative-types +++ b/tests/65-multi-tag-OK.asn1.-Pfnative-types @@ -836,7 +836,7 @@ asn_TYPE_descriptor_t asn_DEF_Ts = { SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, - 0, /* Not implemented yet */ + SEQUENCE_decode_xer, SEQUENCE_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_Ts_tags, From 8d0d396f1af9de80230352c24f497b650fa07a8d Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 25 Oct 2004 22:58:35 +0000 Subject: [PATCH 0553/1469] harm undone git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@553 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_system.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/asn_system.h b/skeletons/asn_system.h index ee64a0ca9..4626532b0 100644 --- a/skeletons/asn_system.h +++ b/skeletons/asn_system.h @@ -31,7 +31,7 @@ * 2. Sun Solaris requires for alloca(3), * but does not have . */ -#if (!defined(__FreeBSD__) || !defined(_SYS_INTSYSTEM_H_)) +#if (!defined(__FreeBSD__) || !defined(_SYS_INTTYPES_H_)) #if defined(sun) #include /* For alloca(3) */ #else From ba67bd1b22751e4a48238b16ae1240789327e43b Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 25 Oct 2004 22:58:49 +0000 Subject: [PATCH 0554/1469] Removed confusion between &xNN; and &#xNN; in enber and unber. git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@554 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 3 ++- asn1c/enber.c | 11 ++++++++--- asn1c/unber.c | 8 ++++---- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4af203065..ee63b011e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9.8: 2004-Oct-20 +0.9.8: 2004-Oct-25 * Initial XER (XML) decoding implementation. * -X command line option added to asn1c to generate XML DTD. @@ -7,6 +7,7 @@ * Code compiled and tested on Sun Solaris 9 @ sparc. Improved includes/defines of/for system headers. * ber_dec_rval_t renamed into asn_dec_rval_t: more generality. + * Removed confusion between &xNN; and &#xNN; in enber and unber. 0.9.7.1: 2004-Oct-12 diff --git a/asn1c/enber.c b/asn1c/enber.c index c6cadf7bb..2a2c8fb37 100644 --- a/asn1c/enber.c +++ b/asn1c/enber.c @@ -353,8 +353,13 @@ process_line(const char *fname, char *line, int lineno) { continue; } cl++; + if(*cl != '#') { + fputc(*cl, stdout); + continue; + } + cl++; if(*cl != 'x') { - fprintf(stderr, "%s: Expected \"&xNN;\" at line %d\n", + fprintf(stderr, "%s: Expected \"&#xNN;\" at line %d\n", fname, lineno); exit(EX_DATAERR); } @@ -373,7 +378,7 @@ process_line(const char *fname, char *line, int lineno) { v |= clv - 'a' + 10; break; default: fprintf(stderr, - "%s: Expected \"&xNN;\" at line %d (%c)\n", + "%s: Expected \"&#xNN;\" at line %d (%c)\n", fname, lineno, clv); exit(EX_DATAERR); } @@ -381,7 +386,7 @@ process_line(const char *fname, char *line, int lineno) { cl++; if(*cl != ';') { fprintf(stderr, - "%s: Expected \"&xNN;\" at line %d\n", + "%s: Expected \"&#xNN;\" at line %d\n", fname, lineno); exit(EX_DATAERR); } diff --git a/asn1c/unber.c b/asn1c/unber.c index 627c8bde9..ba0ae309d 100644 --- a/asn1c/unber.c +++ b/asn1c/unber.c @@ -480,14 +480,14 @@ print_V(const char *fname, FILE *fp, ber_tlv_tag_t tlv_tag, ber_tlv_len_t tlv_le } /* Fall through */ case '<': case '>': case '&': - printf("&x%02x;", ch); + printf("&#x%02x;", ch); } break; case ASN_BASIC_BOOLEAN: switch(ch) { case 0: printf(""); break; case 0xff: printf(""); break; - default: printf("", ch); + default: printf("", ch); } break; case ASN_BASIC_INTEGER: @@ -499,7 +499,7 @@ print_V(const char *fname, FILE *fp, ber_tlv_tag_t tlv_tag, ber_tlv_len_t tlv_le if(vbuf) { vbuf[i] = ch; } else { - printf("&x%02x;", ch); + printf("&#x%02x;", ch); } } } @@ -582,7 +582,7 @@ print_V(const char *fname, FILE *fp, ber_tlv_tag_t tlv_tag, ber_tlv_len_t tlv_le printf(">"); for(i = 0; i < tlv_len; i++) { if(binary > 0 || vbuf[i] < 0x20 || (vbuf[i] & 0x80)) - printf("&x%02x;", vbuf[i]); + printf("&#x%02x;", vbuf[i]); else printf("%c", vbuf[i]); } From 899ee7b609c6f779420610903380dffd6e3313f2 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Oct 2004 08:02:01 +0000 Subject: [PATCH 0555/1469] alpha64 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@555 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/check-OIDs.c | 6 +++--- skeletons/tests/check-length.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/skeletons/tests/check-OIDs.c b/skeletons/tests/check-OIDs.c index 816eb5599..791673076 100644 --- a/skeletons/tests/check-OIDs.c +++ b/skeletons/tests/check-OIDs.c @@ -139,8 +139,8 @@ check_REGEN(int *arcs, int acount) { printf("Encoded (R) {"); for(i = 0; i < alen; i++) { - printf(" %lu", tmp_arcs[i]); - assert((unsigned long)arcs[i] == tmp_arcs[i]); + printf(" %lu)", tmp_arcs[i]); + assert(arcs[i] == (int)tmp_arcs[i]); } printf(" }\n"); } @@ -177,7 +177,7 @@ check_REGEN_OID(int *arcs, int acount) { printf("Encoded (O) { "); for(i = 0; i < alen; i++) { printf("%lu ", tmp_arcs[i]); fflush(stdout); - assert((unsigned long)arcs[i] == tmp_arcs[i]); + assert(arcs[i] == (int)tmp_arcs[i]); } printf("}\n"); } diff --git a/skeletons/tests/check-length.c b/skeletons/tests/check-length.c index 80064d50d..3f5c0fe00 100644 --- a/skeletons/tests/check-length.c +++ b/skeletons/tests/check-length.c @@ -97,15 +97,15 @@ main() { } ret = ber_fetch_length(0, buf1, sizeof(buf1), &tlv_len); - printf("ret=%d, len=%d\n", ret, tlv_len); + printf("ret=%ld, len=%ld\n", (long)ret, (long)tlv_len); assert(ret == sizeof(buf1)); ret = ber_fetch_length(0, buf2, sizeof(buf2), &tlv_len); - printf("ret=%d, len=%d\n", ret, tlv_len); + printf("ret=%ld, len=%ld\n", (long)ret, (long)tlv_len); assert(ret == sizeof(buf2)); ret = ber_fetch_length(0, buf3, sizeof(buf3), &tlv_len); - printf("ret=%d\n", ret); + printf("ret=%ld\n", (long)ret); assert(ret == -1); return 0; From 96a4e46725055414a92ce37e0e6e29fc20a8ea83 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Oct 2004 08:20:46 +0000 Subject: [PATCH 0556/1469] endianness git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@556 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/INTEGER.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index e855a4a03..740f3a755 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -352,6 +352,8 @@ asn_long2INTEGER(INTEGER_t *st, long value) { uint8_t *p; uint8_t *pstart; uint8_t *pend1; + int littleEndian = 1; /* Run-time detection */ + int add; if(!st) { errno = EINVAL; @@ -361,15 +363,23 @@ asn_long2INTEGER(INTEGER_t *st, long value) { buf = (uint8_t *)MALLOC(sizeof(value)); if(!buf) return -1; - pstart = (uint8_t *)&value; - pend1 = pstart + sizeof(value) - 1; + if(*(char *)&littleEndian) { + pstart = (uint8_t *)&value + sizeof(value) - 1; + pend1 = (uint8_t *)&value; + add = -1; + } else { + pstart = (uint8_t *)&value; + pend1 = pstart + sizeof(value) - 1; + add = 1; + } + /* * If the contents octet consists of more than one octet, * then bits of the first octet and bit 8 of the second octet: * a) shall not all be ones; and * b) shall not all be zero. */ - for(p = pstart; p < pend1; p++) { + for(p = pstart; p < pend1; p += add) { switch(*p) { case 0x00: if((p[1] & 0x80) == 0) continue; From 6c59384a0fe0fa0189af855b4a61b16cd211b31c Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Oct 2004 09:03:31 +0000 Subject: [PATCH 0557/1469] alpha64 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@557 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/INTEGER.c | 12 ++++++------ skeletons/OCTET_STRING.c | 6 +++--- skeletons/REAL.c | 6 +++++- skeletons/ber_decoder.c | 4 ++-- skeletons/ber_tlv_length.c | 4 ++-- skeletons/tests/check-INTEGER.c | 3 ++- skeletons/tests/check-OCTET_STRING.c | 1 + skeletons/tests/check-length.c | 13 ++++++++++--- skeletons/xer_support.c | 2 +- 9 files changed, 32 insertions(+), 19 deletions(-) diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 740f3a755..db289cb29 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -379,24 +379,24 @@ asn_long2INTEGER(INTEGER_t *st, long value) { * a) shall not all be ones; and * b) shall not all be zero. */ - for(p = pstart; p < pend1; p += add) { + for(p = pstart; p != pend1; p += add) { switch(*p) { - case 0x00: if((p[1] & 0x80) == 0) + case 0x00: if((*(p+add) & 0x80) == 0) continue; break; - case 0xff: if((p[1] & 0x80)) + case 0xff: if((*(p+add) & 0x80)) continue; break; } break; } /* Copy the integer body */ - for(pstart = p, bp = buf; p <= pend1;) - *bp++ = *p++; + for(pstart = p, bp = buf, pend1 += add; p != pend1; p += add) + *bp++ = *p; if(st->buf) FREEMEM(st->buf); st->buf = buf; - st->size = p - pstart; + st->size = bp - buf; return 0; } diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 89d5de0b4..b44228c44 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -914,8 +914,8 @@ static ssize_t OCTET_STRING__convert_binary(void *sptr, void *chunk_buf, size_t * Something like strtod(), but with stricter rules. */ static int -OS__strtoent(int base, char *buf, char *end, long *return_value) { - long val = 0; +OS__strtoent(int base, char *buf, char *end, int32_t *return_value) { + int32_t val = 0; char *p; for(p = buf; p < end; p++) { @@ -981,7 +981,7 @@ static ssize_t OCTET_STRING__convert_entrefs(void *sptr, void *chunk_buf, size_t if(len == 1 /* "&" */) goto want_more; if(p[1] == 0x23 /* '#' */) { char *pval; /* Pointer to start of digits */ - long val; /* Entity reference value */ + int32_t val; /* Entity reference value */ int base; if(len == 2 /* "&#" */) goto want_more; diff --git a/skeletons/REAL.c b/skeletons/REAL.c index a1608eeb9..3316ee5a9 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -2,12 +2,16 @@ * Copyright (c) 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ +#if defined(__alpha) +#define _ISOC99_SOURCE /* For quiet NAN, indirectly through bits/nan.h */ +#define _BSD_SOURCE /* To reintroduce finite(3) */ +#endif #include -#include #include /* for strtod(3) */ #include #include #include +#include #undef INT_MAX #define INT_MAX ((int)(((unsigned int)-1) >> 1)) diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c index c78cfee30..a7543bb01 100644 --- a/skeletons/ber_decoder.c +++ b/skeletons/ber_decoder.c @@ -255,8 +255,8 @@ ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, * Inner TLV specifies length which is inconsistent * with the outer TLV's length value. */ - ASN_DEBUG("Outer TLV is %d and inner is %d", - limit_len, tlv_len); + ASN_DEBUG("Outer TLV is %ld and inner is %ld", + (long)limit_len, (long)tlv_len); RETURN(RC_FAIL); } diff --git a/skeletons/ber_tlv_length.c b/skeletons/ber_tlv_length.c index 10a9e1c38..1534d9b5d 100644 --- a/skeletons/ber_tlv_length.c +++ b/skeletons/ber_tlv_length.c @@ -54,8 +54,8 @@ ber_fetch_length(int _is_constructed, void *bufptr, size_t size, /* * Here length may be very close or equal to 2G. - * However, the arithmetics used in other decoders - * often add some (small) quantities to the length, + * However, the arithmetics used in some decoders + * may add some (small) quantities to the length, * to check the resulting value against some limits. * This may result in integer wrap-around. */ diff --git a/skeletons/tests/check-INTEGER.c b/skeletons/tests/check-INTEGER.c index 17fa09914..0b2fbf6fd 100644 --- a/skeletons/tests/check-INTEGER.c +++ b/skeletons/tests/check-INTEGER.c @@ -44,6 +44,7 @@ check(uint8_t *buf, int size, long check_long, int check_ret) { printf(" (%ld, %d) vs (%ld, %d)\n", rlong, ret, check_long, check_ret); assert(ret == check_ret); + printf("%ld %ld\n", rlong, check_long); assert(rlong == check_long); if(check_ret == 0) { @@ -134,7 +135,7 @@ main(int ac, char **av) { CHECK(buf8, 0x7F7E7D7C, 0); CHECK(buf9, 0x7F7E7D7C, 0); CHECK(buf10, 0x7F7E7D7C, 0); - CHECK(buf11, 0x80000000, 0); + CHECK(buf11, -2147483648, 0); /* 0x80000000 */ CHECK(buf12, -32768, 0); CHECK(buf13, -128, 0); diff --git a/skeletons/tests/check-OCTET_STRING.c b/skeletons/tests/check-OCTET_STRING.c index dd5d049d7..96c224aaf 100644 --- a/skeletons/tests/check-OCTET_STRING.c +++ b/skeletons/tests/check-OCTET_STRING.c @@ -89,6 +89,7 @@ main() { check(UTF8, "z", "a b", "a b"); check(UTF8, "z", "a繃b", "a\347\271\203b"); check(UTF8, "z", "a�b", "a�b"); + check(UTF8, "z", "a�b", "a�b"); check(UTF8, "z", "", "aĬ"); check(UTF8, "z", "a&#-300;", "a&#-300;"); check(UTF8, "z", "ab", "a\014b"); diff --git a/skeletons/tests/check-length.c b/skeletons/tests/check-length.c index 3f5c0fe00..9a6d8d67b 100644 --- a/skeletons/tests/check-length.c +++ b/skeletons/tests/check-length.c @@ -87,6 +87,7 @@ main() { uint8_t buf1[] = { 0x85, 0x00, 0x01, 0x02, 0x03, 0x04 }; uint8_t buf2[] = { 0x85, 0x00, 0x7f, 0xff, 0x03, 0x04 }; uint8_t buf3[] = { 0x85, 0x00, 0x7f, 0xff, 0xff, 0x04 }; + uint8_t buf4[] = { 0x89, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04 }; ber_tlv_len_t tlv_len; ssize_t ret; int i; @@ -104,9 +105,15 @@ main() { printf("ret=%ld, len=%ld\n", (long)ret, (long)tlv_len); assert(ret == sizeof(buf2)); - ret = ber_fetch_length(0, buf3, sizeof(buf3), &tlv_len); - printf("ret=%ld\n", (long)ret); - assert(ret == -1); + if(sizeof(tlv_len) == 4) { + ret = ber_fetch_length(0, buf3, sizeof(buf3), &tlv_len); + printf("ret=%ld\n", (long)ret); + assert(ret == -1); + } else if(sizeof(tlv_len) == 8) { + ret = ber_fetch_length(0, buf4, sizeof(buf4), &tlv_len); + printf("ret=%ld\n", (long)ret); + assert(ret == -1); + } return 0; } diff --git a/skeletons/xer_support.c b/skeletons/xer_support.c index 1fe59bc94..b2f542cdc 100644 --- a/skeletons/xer_support.c +++ b/skeletons/xer_support.c @@ -88,7 +88,7 @@ _charclass[256] = { /* * Parser itself */ -int pxml_parse(int *stateContext, void *xmlbuf, size_t size, pxml_callback_f *cb, void *key) { +ssize_t pxml_parse(int *stateContext, void *xmlbuf, size_t size, pxml_callback_f *cb, void *key) { pstate_e state = (pstate_e)*stateContext; char *chunk_start = (char *)xmlbuf; char *p = chunk_start; From b8ce6f05562b22ea2df84ca87bca7dec75e991f1 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Oct 2004 09:35:25 +0000 Subject: [PATCH 0558/1469] fight with signalling NANs and floating point exceptions on alpha64 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@558 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/REAL.c | 41 ++++++++++++++++++++++++++---------- skeletons/tests/check-REAL.c | 23 ++++++++++++++------ 2 files changed, 46 insertions(+), 18 deletions(-) diff --git a/skeletons/REAL.c b/skeletons/REAL.c index 3316ee5a9..9380c9d12 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -3,8 +3,9 @@ * Redistribution and modifications are permitted subject to BSD license. */ #if defined(__alpha) -#define _ISOC99_SOURCE /* For quiet NAN, indirectly through bits/nan.h */ -#define _BSD_SOURCE /* To reintroduce finite(3) */ +#define _ISOC99_SOURCE /* For quiet NAN, through bits/nan.h */ +#define _BSD_SOURCE /* To reintroduce finite(3) */ +#include /* For INFINITY */ #endif #include #include /* for strtod(3) */ @@ -16,10 +17,15 @@ #undef INT_MAX #define INT_MAX ((int)(((unsigned int)-1) >> 1)) -static volatile double real_zero = 0.0; +#if !(defined(NAN) || defined(INFINITY)) +static volatile double real_zero __attribute__ ((unused)) = 0.0; +#endif #ifndef NAN #define NAN (real_zero/real_zero) #endif +#ifndef INFINITY +#define INFINITY (1.0/real_zero) +#endif /* * REAL basic type description. @@ -54,12 +60,12 @@ typedef enum specialRealValue { static struct specialRealValue_s { char *string; size_t length; - double dv; + long dv; } specialRealValue[] = { #define SRV_SET(foo, val) { foo, sizeof(foo) - 1, val } - SRV_SET("", 0.0), - SRV_SET("", -1.0), - SRV_SET("", 1.0), + SRV_SET("", 0), + SRV_SET("", -1), + SRV_SET("", 1), #undef SRV_SET }; @@ -269,12 +275,25 @@ REAL__xer_body_decode(void *sptr, void *chunk_buf, size_t chunk_size) { for(i = 0; i < sizeof(specialRealValue) / sizeof(specialRealValue[0]); i++) { struct specialRealValue_s *srv = &specialRealValue[i]; + double dv; + if(srv->length != chunk_size || memcmp(srv->string, chunk_buf, chunk_size)) continue; - if(asn_double2REAL(st, srv->dv / real_zero)) - return -1; + /* + * It could've been done using + * (double)srv->dv / real_zero, + * but it summons fp exception on some platforms. + */ + switch(srv->dv) { + case -1: dv = - INFINITY; break; + case 0: dv = NAN; break; + case 1: dv = INFINITY; break; + default: return -1; + } + + if(asn_double2REAL(st, dv)) return -1; return chunk_size; } @@ -337,10 +356,10 @@ asn_REAL2double(const REAL_t *st, double *dbl_value) { switch(st->buf[0]) { case 0x40: /* 01000000: PLUS-INFINITY */ - *dbl_value = 1.0/real_zero; + *dbl_value = INFINITY; return 0; case 0x41: /* 01000001: MINUS-INFINITY */ - *dbl_value = -1.0/real_zero; + *dbl_value = - INFINITY; return 0; /* * The following cases are defined by diff --git a/skeletons/tests/check-REAL.c b/skeletons/tests/check-REAL.c index 094017d2d..dc8de2672 100644 --- a/skeletons/tests/check-REAL.c +++ b/skeletons/tests/check-REAL.c @@ -88,8 +88,8 @@ check(REAL_t *rn, double orig_dbl, const char *sample, const char *canonical_sam printf("%02x", *p); printf("] (ilogb %d)\n", ilogb(val)); - printf("%.12f vs %.12f\n", orig_dbl, val); - assert(orig_dbl == val || (isnan(orig_dbl) && isnan(val))); + printf("%.12f vs %.12f\n", val, orig_dbl); + assert((isnan(orig_dbl) && isnan(val)) || val == orig_dbl); printf("OK\n"); check_str_repr(val, sample, canonical_sample); @@ -98,7 +98,7 @@ check(REAL_t *rn, double orig_dbl, const char *sample, const char *canonical_sam uint8_t buf_1_0[] = { 0x80, 0xcc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; uint8_t buf_1_1[] = { 0x80, 0xcc, 0x11, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9a }; uint8_t buf_3_14[] = { 0x80, 0xcd, 0x19, 0x1e, 0xb8, 0x51, 0xeb, 0x85, 0x1f }; -/* These ones are very interesting! It checks mantissa overflow! */ +/* These ones are very interesting! They check mantissa overflow! */ uint8_t buf_mo1[] = { 0xC0, 0xc5, 0x19, 0x1e, 0xb8, 0x51, 0xeb, 0x85, 0x1f,3}; uint8_t buf_mo2[] = { 0x80, 0xbd, 0x19, 0x1e, 0xb8, 0x51, 0xeb, 0x85, 0x1f,3,2}; @@ -189,11 +189,11 @@ check_xer(int fuzzy, double orig_value) { ret = asn_REAL2double(newst1, &value1); assert(ret == 0); - assert(value0 == orig_value - || (isnan(value0) && isnan(orig_value)) + assert((isnan(value0) && isnan(orig_value)) + || value0 == orig_value || fuzzy); - assert(value1 == orig_value - || (isnan(value1) && isnan(orig_value))); + assert((isnan(value1) && isnan(orig_value)) + || value1 == orig_value); assert(newst0->size == st.size || fuzzy); assert(newst1->size == st.size); @@ -250,9 +250,18 @@ main() { check_buf(buf_mo2, sizeof(buf_mo2), 3.14, "3.14", "3.14E0"); +#ifdef NAN + check_xer(0, NAN); /* "" */ +#else check_xer(0, zero/zero); /* "" */ +#endif +#ifdef INFINITY + check_xer(0, INFINITY); /* "" */ + check_xer(0, -INFINITY); /* "" */ +#else check_xer(0, 1.0/zero); /* "" */ check_xer(0, -1.0/zero); /* "" */ +#endif check_xer(0, 1.0); check_xer(0, -1.0); check_xer(0, 1.5); From b882146047cf088288dd3b450ee01df3ca9ebaee Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Oct 2004 09:59:37 +0000 Subject: [PATCH 0559/1469] de-reserved name git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@559 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_codecs.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/skeletons/asn_codecs.h b/skeletons/asn_codecs.h index 2f8ed10b7..b08ce6538 100644 --- a/skeletons/asn_codecs.h +++ b/skeletons/asn_codecs.h @@ -51,8 +51,8 @@ typedef struct asn_enc_rval_s { void *structure_ptr; } asn_enc_rval_t; #define _ASN_ENCODE_FAILED do { \ - asn_enc_rval_t __er = { -1, td, sptr }; \ - return __er; \ + asn_enc_rval_t tmp_error = { -1, td, sptr }; \ + return tmp_error; \ } while(0) /* From 523def5da9d371b30c0682cd76eb4a106ea280c2 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Oct 2004 09:59:42 +0000 Subject: [PATCH 0560/1469] LP64 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@560 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/IA5String.c | 4 ++-- skeletons/NumericString.c | 4 ++-- skeletons/PrintableString.c | 4 ++-- skeletons/VisibleString.c | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/skeletons/IA5String.c b/skeletons/IA5String.c index 32a7a7f82..c4da875a5 100644 --- a/skeletons/IA5String.c +++ b/skeletons/IA5String.c @@ -48,10 +48,10 @@ IA5String_constraint(asn_TYPE_descriptor_t *td, const void *sptr, for(; buf < end; buf++) { if(*buf > 0x7F) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value byte %d out of range: " + "%s: value byte %ld out of range: " "%d > 127 (%s:%d)", td->name, - (buf - st->buf) + 1, + (long)((buf - st->buf) + 1), *buf, __FILE__, __LINE__); return -1; diff --git a/skeletons/NumericString.c b/skeletons/NumericString.c index dbff6e21f..39404c25e 100644 --- a/skeletons/NumericString.c +++ b/skeletons/NumericString.c @@ -54,10 +54,10 @@ NumericString_constraint(asn_TYPE_descriptor_t *td, const void *sptr, continue; } _ASN_ERRLOG(app_errlog, app_key, - "%s: value byte %d (%d) " + "%s: value byte %ld (%d) " "not in NumericString alphabet (%s:%d)", td->name, - (buf - st->buf) + 1, + (long)((buf - st->buf) + 1), *buf, __FILE__, __LINE__); return -1; diff --git a/skeletons/PrintableString.c b/skeletons/PrintableString.c index dc363d846..bc48c0f87 100644 --- a/skeletons/PrintableString.c +++ b/skeletons/PrintableString.c @@ -72,11 +72,11 @@ PrintableString_constraint(asn_TYPE_descriptor_t *td, const void *sptr, for(; buf < end; buf++) { if(!_PrintableString_alphabet[*buf]) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value byte %d (%d) " + "%s: value byte %ld (%d) " "not in PrintableString alphabet " "(%s:%d)", td->name, - (buf - st->buf) + 1, + (long)((buf - st->buf) + 1), *buf, __FILE__, __LINE__); return -1; diff --git a/skeletons/VisibleString.c b/skeletons/VisibleString.c index 7170b542a..30f294558 100644 --- a/skeletons/VisibleString.c +++ b/skeletons/VisibleString.c @@ -51,10 +51,10 @@ VisibleString_constraint(asn_TYPE_descriptor_t *td, const void *sptr, for(; buf < end; buf++) { if(*buf < 0x20 || *buf > 0x7e) { _ASN_ERRLOG(app_errlog, app_key, - "%s: value byte %d (%d) " + "%s: value byte %ld (%d) " "not in VisibleString alphabet (%s:%d)", td->name, - (buf - st->buf) + 1, + (long)((buf - st->buf) + 1), *buf, __FILE__, __LINE__); return -1; From a351c2b25f81c10166185c051528ed69a3fedb78 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Oct 2004 10:12:14 +0000 Subject: [PATCH 0561/1469] removed C99izm git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@561 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OCTET_STRING.c | 26 ++++++++++++++------------ skeletons/constr_CHOICE.c | 3 ++- skeletons/constr_SEQUENCE.c | 3 ++- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index b44228c44..b99bcbdea 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -246,10 +246,10 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, ?(ssize_t)size:sel->left); - ASN_DEBUG("%p, s->l=%d, s->wn=%d, s->g=%d\n", sel, - sel?sel->left:0, - sel?sel->want_nulls:0, - sel?sel->got:0 + ASN_DEBUG("%p, s->l=%ld, s->wn=%ld, s->g=%ld\n", sel, + (long)sel?sel->left:0, + (long)sel?sel->want_nulls:0, + (long)sel?sel->got:0 ); if(sel && sel->left <= 0 && sel->want_nulls == 0) { if(sel->prev) { @@ -271,9 +271,10 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, } tl = ber_fetch_tag(buf_ptr, Left, &tlv_tag); - ASN_DEBUG("fetch tag(size=%d,L=%d), %sstack, left=%d, wn=%d, tl=%d", - (int)size, Left, sel?"":"!", - sel?sel->left:0, sel?sel->want_nulls:0, tl); + ASN_DEBUG("fetch tag(size=%ld,L=%ld), %sstack, left=%ld, wn=%ld, tl=%ld", + (long)size, (long)Left, sel?"":"!", + (long)sel?sel->left:0, (long)sel?sel->want_nulls:0, + (long)tl); switch(tl) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); @@ -392,8 +393,9 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, sel->got += tlvl; ADVANCE(tlvl); - ASN_DEBUG("+EXPECT2 got=%d left=%d, wn=%d, clvl=%d", - sel->got, sel->left, sel->want_nulls, sel->cont_level); + ASN_DEBUG("+EXPECT2 got=%ld left=%ld, wn=%d, clvl=%d", + (long)sel->got, (long)sel->left, + sel->want_nulls, sel->cont_level); } while(tlv_constr); if(sel == NULL) { @@ -495,10 +497,10 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, st->buf[st->size-1] &= 0xff << st->bits_unused; } - ASN_DEBUG("Took %d bytes to encode %s: [%s]:%d", - consumed_myself, td->name, + ASN_DEBUG("Took %ld bytes to encode %s: [%s]:%ld", + (long)consumed_myself, td->name, (type_variant == _TT_GENERIC) ? (char *)st->buf : "", - st->size); + (long)st->size); RETURN(RC_OK); diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index cbd857905..fac93a52e 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -603,10 +603,11 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, */ if(ctx->phase == 2) { asn_dec_rval_t tmprval; - elm = &td->elements[edx]; void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ + elm = &td->elements[edx]; + if(elm->flags & ATF_POINTER) { /* Member is a pointer to another structure */ memb_ptr2 = (void **)((char *)st diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index ca0766d3c..1624abbd5 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -652,10 +652,11 @@ SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, */ if(ctx->phase == 2) { asn_dec_rval_t tmprval; - elm = &td->elements[edx]; void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ + elm = &td->elements[edx]; + if(elm->flags & ATF_POINTER) { /* Member is a pointer to another structure */ memb_ptr2 = (void **)((char *)st From 32d29a573a75829efbe06c27127b2d6a571c5e09 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Oct 2004 10:44:18 +0000 Subject: [PATCH 0562/1469] new platform: alpha64 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@562 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index ee63b011e..26c1d9ef0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,13 +1,18 @@ -0.9.8: 2004-Oct-25 - +0.9.8: 2004-Oct-26 + + * [NEW PLATFORM] Compiled and tested on Linux @ alpha64 (LP64). + Some code needed to be fixed regarding int-long conversions + (mostly inside the test suite), and floating point handling + code needed to be restructured to handle signalling NAN and + other floating point exceptions quietly. Smooth transition! + * [NEW PLATFORM] Compiled and tested on Sun Solaris 9 @ sparc. + Improved includes/defines of/for system headers. * Initial XER (XML) decoding implementation. * -X command line option added to asn1c to generate XML DTD. * Empty SEQUENCE and SET clauses are now allowed. - * Code compiled and tested on Sun Solaris 9 @ sparc. - Improved includes/defines of/for system headers. - * ber_dec_rval_t renamed into asn_dec_rval_t: more generality. * Removed confusion between &xNN; and &#xNN; in enber and unber. + * ber_dec_rval_t renamed into asn_dec_rval_t: more generality. 0.9.7.1: 2004-Oct-12 @@ -205,8 +210,8 @@ * Compiler: fixed recursive ASN.1 types inclusion (Severity: low, Security impact: none). * Parser: IMPORTS/FROM fixes, now allowing multiple sections. - * Code compiled and tested on MacOS X (@ PowerPC). No major portability - issues experienced. + * NEW PLATFORM: Compiled and tested on MacOS X (@ PowerPC). + No major portability issues experienced. 0.8.7: 2004-Apr-11 T-version-0-8-7 From 6f4cb6e817d09ab508991ebe212aa59b77f297f6 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Oct 2004 10:45:26 +0000 Subject: [PATCH 0563/1469] refining git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@563 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/webcgi/asn1c.cgi | 71 ++++++++++++++++++++++++++++++------------ 1 file changed, 51 insertions(+), 20 deletions(-) diff --git a/asn1c/webcgi/asn1c.cgi b/asn1c/webcgi/asn1c.cgi index 29d28f7c9..4042ec2c3 100755 --- a/asn1c/webcgi/asn1c.cgi +++ b/asn1c/webcgi/asn1c.cgi @@ -277,7 +277,7 @@ if($#gotSafeNames >= 0) { $form = "
    " . "Pick the ASN.1 module file:
    \n" -. "
    \n" +. "
    \n" . "Alternatively, enter the ASN.1 specification into the area below:
    \n" . "
    \n" . "

    " . "" -. "These options may be enabled to control the compiler's behavior:
    \n" +. "These options may be used to control the compiler's behavior:
    \n" . " Debug lexer (-Wdebug-lexer)
    \n" . " Just parse and dump (do not compile) (-E)
    \n" . " Parse, perform semantic checks, and dump (-E -F)
    \n" . " Employ native machine types (e.g. double instead of REAL_t) (-fnative-types)
    \n" . " Prevent name clashes in compiled output (-fcompound-names)
    \n" +. "... the command line ASN.1 compiler,
    asn1c, supports many other parameters." . "" . "

    \n" . "" @@ -487,8 +490,11 @@ foreach my $trans (sort { $b cmp $a } @transactions) { $results = "" . "Compiled OK
    \n"; } else { - $results = "" - . "Error during compilation: $ec
    \n"; + my $why = $ec; + $why = "Invalid input file" if $ec == 65; + $results = "" + . "ASN.1 compiler error: " + . "$why
    \n"; } $allowFetchResults = $ec eq "0" @@ -507,7 +513,7 @@ foreach my $trans (sort { $b cmp $a } @transactions) { . escapeHTML($origTime) . "&file=$f" . "&show=tgz\">" - . "Fetch results (.tgz)" + . "Fetch compiled C sources (.tgz)" if $allowFetchResults; if($ec ne "0") { local ($eml, @resp); @@ -533,6 +539,7 @@ foreach my $trans (sort { $b cmp $a } @transactions) { . "expect results in a few hours."; } else { $results .= '

    ' + . "To get free help, leave a return address:
    " . "
    " . "" . '' @@ -603,7 +610,7 @@ if($history) { . "Bottom line: ASN.1 compiler was unable to process some of the input files.
    " . "This is typically caused by syntax errors in the input files.\n" . "Such errors are normally fixed by removing or adding a couple of characters in the ASN.1 module.
    \n" - . "
    Please consider clicking on an appropriate "Help me fix it!" link above.
    \n" + . "
    Please consider clicking on the appropriate "Help me fix it!" button above.
    \n" . "An email will be sent to a person who will gladly fix the ASN.1 module for you. (The typical turn-around time is less than 24 hours.)\n" . "
    This is free, and highly advisable.\n" . "Your request will help us make a better compiler!\n" From 8e8eca7b3402d1f1921dd359bb2dc8a3642f9c64 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 18 Mar 2005 08:33:14 +0000 Subject: [PATCH 0815/1469] recognize comments git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@815 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/enber.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/asn1c/enber.c b/asn1c/enber.c index 714f46639..75286f353 100644 --- a/asn1c/enber.c +++ b/asn1c/enber.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Copyright (c) 2004, 2005 Lev Walkin . All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -35,7 +35,7 @@ #undef COPYRIGHT #define COPYRIGHT \ - "Copyright (c) 2004 Lev Walkin \n" + "Copyright (c) 2004, 2005 Lev Walkin \n" static void usage(const char *av0, int);/* Print the Usage screen and exit */ static int process(const char *fname); /* Perform the BER decoding */ @@ -58,9 +58,6 @@ main(int ac, char **av) { break; case 'v': usage(av[0], 1); - fprintf(stderr, "Convert unber(1)'s output back into BER, " - "v" VERSION "\n" COPYRIGHT); - exit(0); break; case 'h': default: @@ -209,14 +206,16 @@ process_line(const char *fname, char *line, int lineno) { } cl = line; if(*cl != '>') { - fprintf(stderr, "%s: Missing '>'\n", fname); + fprintf(stderr, "%s: Missing '>' at line %d\n", fname, lineno); exit(EX_DATAERR); } /* Ignore closing tags */ if(op[1] == '/') { if(strchr(cl, '<')) { /* We are not very robust */ - fprintf(stderr, "%s: Multiple tags per line\n", fname); + fprintf(stderr, + "%s: Multiple tags per line at line %d\n", + fname, lineno); exit(EX_DATAERR); } /* End-of-content octets */ @@ -228,20 +227,23 @@ process_line(const char *fname, char *line, int lineno) { } switch(op[1]) { + case '!': return 0; /* A comment */ + case '?': return 0; /* An XML preamble */ case 'C': constr = 1; break; case 'P': constr = 0; break; case 'I': constr = 2; break; default: fprintf(stderr, - "%s: Expected \"C\"/\"P\"/\"I\" as the XML tag name (%c)\n", - fname, op[1]); + "%s: Expected \"C\"/\"P\"/\"I\" as the XML tag name (%c) at line %d\n", + fname, op[1], lineno); exit(EX_DATAERR); } *cl = '\0'; if(cl[-1] == 'F') { - fprintf(stderr, "%s: Uses pretty-printing of values. " - "Use -p option to unber\n", fname); + fprintf(stderr, + "%s: Detected pretty-printing of primitive types at line %d. " + "Re-run `unber` with -p option to disable pretty-printing.\n", fname, lineno); exit(EX_DATAERR); } From c8bb2b19b8a83963350f31f5312aca0017ab533f Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 20 Mar 2005 11:07:34 +0000 Subject: [PATCH 0816/1469] string type compatibility git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@816 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_compat.c | 27 ++++++++++++++++++++++----- libasn1fix/asn1fix_value.c | 9 ++++++--- tests/77-str-default-OK.asn1 | 26 ++++++++++++++++++++++++++ tests/78-str-default-SE.asn1 | 21 +++++++++++++++++++++ 4 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 tests/77-str-default-OK.asn1 create mode 100644 tests/78-str-default-SE.asn1 diff --git a/libasn1fix/asn1fix_compat.c b/libasn1fix/asn1fix_compat.c index 2efa8e85f..064e38e52 100644 --- a/libasn1fix/asn1fix_compat.c +++ b/libasn1fix/asn1fix_compat.c @@ -23,25 +23,37 @@ asn1f_check_type_compatibility(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b) { assert(atype != A1TC_REFERENCE); assert(btype != A1TC_REFERENCE); + if(a == b) + return 0; /* Fairly obviously */ + if(atype != btype) { /* - * Limited compatibility. + * Limited cross-compatibility of integer types. */ if((atype == A1TC_UNIVERVAL && btype == ASN_BASIC_INTEGER) || (atype == A1TC_UNIVERVAL && btype == ASN_BASIC_ENUMERATED) ) return 0; + + /* Limited cross-compatibility of string types */ + if((atype & ASN_STRING_MASK) + && (btype & ASN_STRING_MASK)) { + /* X.680, B.5 */ + int akm = (atype & ASN_STRING_KM_MASK) + || atype == ASN_STRING_UTF8String; + int bkm = (btype & ASN_STRING_KM_MASK) + || btype == ASN_STRING_UTF8String; + return (akm == bkm) ? 0 : -1; + } + DEBUG("\t%s and %s are not compatible", a->Identifier, b->Identifier); return -1; /* Fairly obviously */ } - if(a == b) - return 0; /* Fairly obviously */ - switch(atype) { case ASN_BASIC_INTEGER: - /* All integers are compatible */ + /* All integers are compatible, X.680, B.4.5 */ return 0; case ASN_BASIC_ENUMERATED: /* @@ -55,6 +67,11 @@ asn1f_check_type_compatibility(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b) { } return 0; default: + if((atype & ASN_STRING_MASK) + && (btype & ASN_STRING_MASK)) { + /* String type is compatible with the same type */ + return 0; + } /* Compatibility is not defined yet */ DEBUG("\tCompatibility rule is not defined for %s and %s", a->Identifier, b->Identifier); diff --git a/libasn1fix/asn1fix_value.c b/libasn1fix/asn1fix_value.c index 161d9a38d..18d868665 100644 --- a/libasn1fix/asn1fix_value.c +++ b/libasn1fix/asn1fix_value.c @@ -79,6 +79,11 @@ asn1f_value_resolve(arg_t *arg, asn1p_expr_t *expr, const enum asn1p_constraint_ type_expr, val_type_expr); if(ret == -1) { switch(type_expr->expr_type) { + default: + if(!(type_expr->expr_type & ASN_STRING_MASK)) + break; + /* Compatibility rules are not defined */ + /* Fall through */ case ASN_BASIC_INTEGER: case ASN_BASIC_ENUMERATED: FATAL("Incompatible type of \"%s\" (%s) at line %d " @@ -96,10 +101,8 @@ asn1f_value_resolve(arg_t *arg, asn1p_expr_t *expr, const enum asn1p_constraint_ * We can't deal with OIDs inheritance properly yet. */ return 0; - default: - break; } - WARNING("Incompatible type of \"%s\" (%s) at line %d " + WARNING("Possibly incompatible type of \"%s\" (%s) at line %d " "with \"%s\" (%s) at line %d", type_expr->Identifier, ASN_EXPR_TYPE2STR(type_expr->expr_type), diff --git a/tests/77-str-default-OK.asn1 b/tests/77-str-default-OK.asn1 new file mode 100644 index 000000000..5a4edd0af --- /dev/null +++ b/tests/77-str-default-OK.asn1 @@ -0,0 +1,26 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .77 + +ModuleTestStringConstraint + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 77 } + DEFINITIONS AUTOMATIC TAGS ::= +BEGIN + + Type ::= SEQUENCE { + cntry PRString DEFAULT country1, + cntry1 PrintableString DEFAULT country1, + cntry2 UniversalString DEFAULT country2, + ... + } + + country1 PrintableString ::= "Rwanda" + country2 PRString ::= "United Kingdom" + + PRString ::= PrintableString + +END diff --git a/tests/78-str-default-SE.asn1 b/tests/78-str-default-SE.asn1 new file mode 100644 index 000000000..a158d5d0a --- /dev/null +++ b/tests/78-str-default-SE.asn1 @@ -0,0 +1,21 @@ + +-- SE: Semantic error + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .78 + +ModuleTestStringConstraint2 + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 78 } + DEFINITIONS AUTOMATIC TAGS ::= +BEGIN + + Type ::= SEQUENCE { + country UTF8String DEFAULT country1, + ... + } + + country1 GeneralString ::= "Cyprus" + +END From 5e2c4b961b8f5b06d1c61419fcbf45892910c1a4 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 20 Mar 2005 11:12:40 +0000 Subject: [PATCH 0817/1469] string value compatibility git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@817 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 1 + libasn1parser/asn1p_y.c | 931 ++++++++++++++++++++-------------------- libasn1parser/asn1p_y.y | 7 +- 3 files changed, 477 insertions(+), 462 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5e2953d4c..54ee8708d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,7 @@ * Added extra const qualifiers into the support code. * More RFC variations supported in crfc2asn1.pl. + * Refined string values compatibility. (Test cases 77, 78). 0.9.12: 2005-Mar-10 diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index 70d1a1087..82e1509d5 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -261,12 +261,12 @@ static const short yyprhs[] = { 0, 204, 208, 210, 214, 216, 218, 219, 221, 223, 227, 231, 235, 237, 239, 243, 246, 248, 254, 255, 257, 259, 263, 266, 271, 276, 277, 279, 280, 287, 289, - 292, 294, 296, 298, 302, 306, 310, 312, 314, 319, - 324, 329, 336, 343, 345, 350, 355, 357, 361, 363, - 367, 371, 375, 377, 381, 383, 387, 389, 391, 393, - 395, 400, 404, 405, 409, 411, 413, 415, 417, 419, - 421, 423, 425, 427, 431, 433, 436, 438, 440, 442, - 444, 447, 450, 452, 454, 457, 460, 462, 464, 466, + 292, 294, 296, 298, 302, 306, 310, 312, 317, 322, + 327, 334, 341, 343, 348, 353, 355, 359, 361, 365, + 369, 373, 375, 379, 381, 385, 387, 389, 391, 393, + 398, 402, 403, 407, 409, 411, 413, 415, 417, 419, + 421, 423, 425, 429, 431, 434, 436, 438, 440, 442, + 445, 448, 450, 452, 455, 458, 460, 462, 464, 466, 468, 471, 473, 476, 478, 480, 482, 484, 486, 488, 490, 492, 494, 496, 498, 500, 502, 504, 506, 508, 510, 512, 514, 515, 517, 519, 524, 528, 533, 535, @@ -312,22 +312,22 @@ static const short yyrhs[] = { 117, 82, 103, 159, 160, 104, 0, 161, 0, 160, 161, 0, 4, 0, 168, 0, 102, 0, 102, 110, 173, 0, 102, 110, 207, 0, 208, 164, 182, 0, 177, - 0, 178, 0, 27, 103, 151, 104, 0, 78, 103, - 148, 104, 0, 79, 103, 148, 104, 0, 78, 182, - 68, 215, 208, 164, 0, 79, 182, 68, 215, 208, - 164, 0, 18, 0, 18, 35, 25, 216, 0, 213, - 103, 146, 104, 0, 165, 0, 56, 68, 165, 0, - 11, 0, 11, 111, 213, 0, 214, 111, 213, 0, - 11, 111, 216, 0, 214, 0, 214, 111, 166, 0, - 167, 0, 166, 111, 167, 0, 169, 0, 169, 0, - 13, 0, 14, 0, 216, 139, 3, 171, 0, 216, - 109, 171, 0, 0, 103, 172, 174, 0, 63, 0, - 45, 0, 86, 0, 5, 0, 7, 0, 6, 0, - 207, 0, 173, 0, 216, 0, 213, 111, 216, 0, - 4, 0, 174, 4, 0, 24, 0, 63, 0, 76, - 0, 176, 0, 67, 81, 0, 65, 51, 0, 77, - 0, 44, 0, 36, 71, 0, 26, 81, 0, 91, - 0, 47, 0, 58, 0, 40, 0, 22, 81, 0, + 0, 27, 103, 151, 104, 0, 78, 103, 148, 104, + 0, 79, 103, 148, 104, 0, 78, 182, 68, 215, + 208, 164, 0, 79, 182, 68, 215, 208, 164, 0, + 18, 0, 18, 35, 25, 216, 0, 213, 103, 146, + 104, 0, 165, 0, 56, 68, 165, 0, 11, 0, + 11, 111, 213, 0, 214, 111, 213, 0, 11, 111, + 216, 0, 214, 0, 214, 111, 166, 0, 167, 0, + 166, 111, 167, 0, 169, 0, 169, 0, 13, 0, + 14, 0, 216, 139, 3, 171, 0, 216, 109, 171, + 0, 0, 103, 172, 174, 0, 63, 0, 45, 0, + 86, 0, 5, 0, 7, 0, 6, 0, 207, 0, + 173, 0, 216, 0, 213, 111, 216, 0, 4, 0, + 174, 4, 0, 24, 0, 63, 0, 76, 0, 176, + 0, 67, 81, 0, 65, 51, 0, 77, 0, 44, + 0, 36, 71, 0, 26, 81, 0, 91, 0, 47, + 0, 178, 0, 58, 0, 40, 0, 22, 81, 0, 175, 0, 176, 204, 0, 23, 0, 48, 0, 49, 0, 50, 0, 59, 0, 64, 0, 74, 0, 83, 0, 85, 0, 90, 0, 92, 0, 93, 0, 94, @@ -374,22 +374,22 @@ static const short yyrline[] = { 0, 898, 905, 910, 916, 922, 928, 933, 943, 945, 948, 956, 962, 971, 977, 994, 996, 1001, 1005, 1010, 1015, 1021, 1025, 1036, 1045, 1054, 1065, 1087, 1091, 1097, 1103, - 1109, 1115, 1125, 1135, 1141, 1155, 1179, 1186, 1200, 1209, - 1219, 1229, 1239, 1247, 1268, 1277, 1286, 1287, 1289, 1296, - 1308, 1318, 1326, 1326, 1331, 1336, 1341, 1346, 1350, 1354, - 1358, 1361, 1366, 1378, 1394, 1405, 1419, 1421, 1422, 1423, - 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, 1437, 1439, - 1440, 1443, 1450, 1462, 1464, 1468, 1472, 1473, 1474, 1475, - 1476, 1480, 1481, 1482, 1483, 1487, 1488, 1495, 1495, 1496, - 1496, 1497, 1499, 1501, 1506, 1510, 1519, 1523, 1528, 1532, - 1538, 1548, 1552, 1555, 1558, 1563, 1572, 1580, 1586, 1593, - 1601, 1609, 1618, 1621, 1626, 1628, 1629, 1630, 1633, 1637, - 1642, 1648, 1653, 1656, 1660, 1671, 1684, 1690, 1694, 1699, - 1705, 1717, 1719, 1722, 1726, 1729, 1734, 1738, 1746, 1761, - 1767, 1774, 1787, 1799, 1814, 1818, 1835, 1840, 1843, 1848, - 1870, 1875, 1880, 1886, 1892, 1900, 1908, 1916, 1923, 1933, - 1938, 1968, 1970, 1973, 1980, 1986, 1988, 1989, 1990, 1993, - 1995, 1996, 1999, 2004, 2011, 2018, 2020, 2024 + 1109, 1119, 1129, 1135, 1149, 1173, 1180, 1194, 1203, 1213, + 1223, 1233, 1241, 1262, 1271, 1280, 1281, 1283, 1290, 1302, + 1312, 1320, 1320, 1325, 1330, 1335, 1340, 1344, 1348, 1352, + 1355, 1360, 1372, 1388, 1399, 1413, 1415, 1416, 1417, 1418, + 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1432, 1434, + 1435, 1438, 1445, 1457, 1459, 1463, 1467, 1468, 1469, 1470, + 1471, 1475, 1476, 1477, 1478, 1482, 1483, 1490, 1490, 1491, + 1491, 1492, 1494, 1496, 1501, 1505, 1514, 1518, 1523, 1527, + 1533, 1543, 1547, 1550, 1553, 1558, 1567, 1575, 1581, 1588, + 1596, 1604, 1613, 1616, 1621, 1623, 1624, 1625, 1628, 1632, + 1637, 1643, 1648, 1651, 1655, 1666, 1679, 1685, 1689, 1694, + 1700, 1712, 1714, 1717, 1721, 1724, 1729, 1733, 1741, 1756, + 1762, 1769, 1782, 1794, 1809, 1813, 1830, 1835, 1838, 1843, + 1865, 1870, 1875, 1881, 1887, 1895, 1903, 1911, 1918, 1928, + 1933, 1963, 1965, 1968, 1975, 1981, 1983, 1984, 1985, 1988, + 1990, 1991, 1994, 1999, 2006, 2013, 2015, 2019 }; #endif @@ -453,10 +453,10 @@ static const short yyr1[] = { 0, 150, 150, 151, 151, 152, 152, 153, 154, 154, 155, 155, 156, 156, 156, 157, 157, 159, 158, 160, 160, 161, 161, 162, 162, 162, 163, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, 165, 165, - 165, 165, 165, 165, 166, 166, 167, 168, 169, 169, - 170, 171, 172, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 173, 173, 174, 174, 175, 175, 175, 175, + 164, 164, 164, 164, 164, 164, 164, 165, 165, 165, + 165, 165, 165, 166, 166, 167, 168, 169, 169, 170, + 171, 172, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 173, 173, 174, 174, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 176, 176, 176, 177, 177, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 179, 179, 180, @@ -482,12 +482,12 @@ static const short yyr2[] = { 0, 3, 1, 3, 1, 1, 0, 1, 1, 3, 3, 3, 1, 1, 3, 2, 1, 5, 0, 1, 1, 3, 2, 4, 4, 0, 1, 0, 6, 1, 2, - 1, 1, 1, 3, 3, 3, 1, 1, 4, 4, - 4, 6, 6, 1, 4, 4, 1, 3, 1, 3, - 3, 3, 1, 3, 1, 3, 1, 1, 1, 1, - 4, 3, 0, 3, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 1, 2, 1, 1, 1, 1, - 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, + 1, 1, 1, 3, 3, 3, 1, 4, 4, 4, + 6, 6, 1, 4, 4, 1, 3, 1, 3, 3, + 3, 1, 3, 1, 3, 1, 1, 1, 1, 4, + 3, 0, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 1, 2, 1, 1, 1, 1, 2, + 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 4, 3, 4, 1, 3, @@ -510,235 +510,251 @@ static const short yydefact[] = { 0, 173, 174, 175, 176, 0, 24, 25, 27, 28, 31, 29, 30, 34, 0, 0, 32, 0, 47, 0, 48, 50, 52, 36, 0, 37, 0, 40, 42, 44, 4, - 26, 252, 119, 265, 0, 147, 0, 0, 160, 154, - 158, 159, 148, 0, 0, 149, 153, 157, 0, 0, - 54, 55, 150, 123, 0, 33, 46, 45, 0, 0, - 35, 38, 0, 0, 0, 0, 256, 64, 63, 0, - 253, 260, 0, 161, 156, 155, 152, 151, 0, 66, - 0, 68, 0, 0, 0, 49, 51, 5, 41, 43, - 0, 258, 259, 257, 0, 119, 265, 114, 0, 0, - 183, 183, 62, 183, 117, 162, 150, 107, 108, 0, - 262, 261, 254, 120, 122, 0, 0, 0, 0, 56, - 129, 130, 124, 125, 127, 121, 138, 140, 139, 250, - 251, 136, 135, 137, 133, 131, 142, 141, 0, 143, - 39, 0, 90, 252, 128, 0, 0, 0, 0, 0, + 26, 252, 118, 265, 0, 146, 0, 0, 160, 153, + 157, 159, 147, 0, 0, 148, 152, 156, 0, 0, + 54, 55, 149, 158, 122, 0, 33, 46, 45, 0, + 0, 35, 38, 0, 0, 0, 0, 256, 64, 63, + 0, 253, 260, 0, 161, 155, 154, 151, 150, 0, + 66, 0, 68, 0, 0, 0, 49, 51, 5, 41, + 43, 0, 258, 259, 257, 0, 118, 265, 113, 0, + 0, 183, 183, 62, 183, 116, 162, 149, 107, 0, + 262, 261, 254, 119, 121, 0, 0, 0, 0, 56, + 128, 129, 123, 124, 126, 120, 137, 139, 138, 250, + 251, 135, 134, 136, 132, 130, 141, 140, 0, 142, + 39, 0, 90, 252, 127, 0, 0, 0, 0, 0, 76, 0, 0, 184, 185, 76, 0, 106, 0, 163, 252, 252, 67, 71, 70, 69, 214, 211, 210, 0, 209, 212, 0, 60, 0, 0, 0, 57, 58, 61, 192, 0, 198, 204, 203, 227, 228, 213, 216, 215, 0, 0, 0, 0, 95, 0, 0, 239, 88, 88, 92, 238, 0, 255, 0, 103, 0, 83, 86, 252, - 118, 0, 0, 0, 77, 78, 82, 252, 0, 189, + 117, 0, 0, 0, 77, 78, 82, 252, 0, 189, 266, 0, 0, 266, 249, 241, 0, 243, 248, 245, 0, 72, 74, 75, 65, 205, 0, 0, 0, 0, 0, 53, 0, 180, 181, 178, 179, 0, 0, 182, - 0, 0, 0, 0, 126, 145, 134, 144, 132, 0, - 87, 96, 91, 240, 89, 237, 237, 115, 0, 109, - 0, 85, 0, 252, 110, 0, 237, 187, 0, 252, - 267, 0, 111, 252, 242, 0, 0, 116, 252, 206, + 0, 0, 0, 0, 125, 144, 133, 143, 131, 0, + 87, 96, 91, 240, 89, 237, 237, 114, 0, 108, + 0, 85, 0, 252, 109, 0, 237, 187, 0, 252, + 267, 0, 110, 252, 242, 0, 0, 115, 252, 206, 207, 202, 200, 0, 229, 197, 59, 193, 194, 195, - 0, 201, 199, 0, 0, 231, 146, 0, 93, 94, - 104, 105, 143, 84, 186, 81, 79, 80, 190, 0, + 0, 201, 199, 0, 0, 231, 145, 0, 93, 94, + 104, 105, 142, 84, 186, 81, 79, 80, 190, 0, 188, 0, 244, 0, 0, 73, 208, 220, 0, 218, - 183, 196, 0, 233, 235, 230, 0, 97, 0, 112, - 113, 247, 246, 217, 0, 222, 234, 0, 232, 0, + 183, 196, 0, 233, 235, 230, 0, 97, 0, 111, + 112, 247, 246, 217, 0, 222, 234, 0, 232, 0, 191, 219, 225, 226, 224, 221, 223, 236, 101, 0, 99, 102, 98, 100, 0, 0, 0 }; static const short yydefgoto[] = { 415, 3, 4, 8, 9, 13, 14, 25, 26, 27, 55, - 56, 57, 106, 58, 74, 75, 76, 77, 59, 69, - 70, 60, 100, 227, 228, 229, 61, 129, 130, 281, - 282, 264, 265, 266, 257, 258, 118, 316, 192, 193, - 311, 312, 400, 410, 411, 267, 283, 154, 155, 173, - 174, 194, 195, 62, 186, 242, 187, 307, 156, 103, - 158, 159, 298, 299, 301, 203, 204, 205, 269, 270, + 56, 57, 107, 58, 74, 75, 76, 77, 59, 69, + 70, 60, 100, 227, 228, 229, 61, 130, 131, 281, + 282, 264, 265, 266, 257, 258, 119, 316, 192, 193, + 311, 312, 400, 410, 411, 267, 283, 155, 156, 173, + 174, 194, 195, 62, 186, 242, 187, 307, 157, 103, + 159, 104, 298, 299, 301, 203, 204, 205, 269, 270, 231, 288, 232, 233, 234, 379, 380, 406, 407, 235, 236, 237, 355, 356, 384, 251, 252, 210, 277, 278, - 238, 253, 121, 122, 145, 163, 239, 104, 330, 240 + 238, 253, 122, 123, 146, 163, 239, 105, 330, 240 }; -static const short yypact[] = { 148, --32768,-32768, 148,-32768, -58,-32768, 45, 43,-32768,-32768, --32768,-32768, 53,-32768, -13, 144,-32768,-32768, 97, 68, - 59, 83, 84, 95, 189, 144,-32768, 89,-32768,-32768, --32768,-32768,-32768, 180,-32768,-32768, 367,-32768, 191, 35, --32768,-32768,-32768, 201,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 167, 367,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 257, 581,-32768, 108,-32768, 69,-32768, - 114,-32768,-32768, 16,-32768, -23,-32768, 122,-32768,-32768, --32768, -10, 133,-32768, 160,-32768, 165, 181,-32768,-32768, --32768,-32768,-32768, 214, 190,-32768,-32768,-32768, 598, 271, --32768,-32768,-32768, 171, 277,-32768,-32768,-32768, 231, 183, --32768,-32768, 148, 231, 194, 182, 1,-32768,-32768, 444, --32768, 28, 231,-32768,-32768,-32768,-32768,-32768, 82,-32768, - 185, 186, 196, 350, 163,-32768,-32768, -58,-32768,-32768, - 170,-32768,-32768,-32768, 291, -8, 199, 275, 208, 245, - -17, 75,-32768, -55,-32768,-32768, 213,-32768,-32768, 215, --32768,-32768,-32768,-32768,-32768, 314, 598, 313, 231, 297, --32768,-32768, 212,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 216, 217, --32768, 127,-32768, 27,-32768, 220, 303, 7, 221, 226, - 51, 102, 268,-32768, 233, 51, 273,-32768, 48,-32768, - 6, 225,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -12, --32768,-32768, 315,-32768, 148, 102, 240, 238,-32768, 272, - 253, 251, -12,-32768,-32768, 254,-32768,-32768,-32768,-32768, - 170, 355, 313, 163, 270, 170, 163,-32768, 279, 279, --32768,-32768, 521,-32768, 313, 263, 153,-32768,-32768, 225, --32768, 102, 306, 276, 274,-32768,-32768, 225, 278, 130, - 313, 102, 281, 313,-32768,-32768, 154,-32768,-32768, 282, - 155,-32768,-32768,-32768,-32768, 269, 285, 210, 286, 289, - 288,-32768, 297,-32768,-32768,-32768,-32768, 102, 102,-32768, - 102, 102, 280, 283,-32768,-32768, 391,-32768,-32768, 316, --32768,-32768,-32768,-32768,-32768, 9, 9,-32768, 343,-32768, - 7,-32768, 298, 225,-32768, 51, 9,-32768, 295, 225, --32768, 300,-32768, 225,-32768, 56, 343,-32768, 6,-32768, - 296,-32768,-32768, 30,-32768,-32768,-32768,-32768,-32768,-32768, - 301,-32768,-32768, 11, 168,-32768,-32768, 307,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 304, 521, --32768, 521,-32768, 305, 308,-32768,-32768,-32768, 169,-32768, - -55,-32768, 313, 302,-32768,-32768, 283,-32768, 102,-32768, --32768,-32768,-32768,-32768, 30, 24, 302, 313,-32768, 125, - 272,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 22, --32768,-32768,-32768,-32768, 418, 419,-32768 +static const short yypact[] = { 152, +-32768,-32768, 152,-32768, -74,-32768, 12, 5,-32768,-32768, +-32768,-32768, 38,-32768, -16, 54,-32768,-32768, 44, 56, + 47, 72, 85, 81, 141, 54,-32768, 64,-32768,-32768, +-32768,-32768,-32768, 132,-32768,-32768, 407,-32768, 161, 33, +-32768,-32768,-32768, 53,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 156, 407,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 331, 636,-32768, 118,-32768, 105,-32768, + 124,-32768,-32768, 16,-32768, -23,-32768, 147,-32768,-32768, +-32768, -3, 140,-32768, 176,-32768, 182, 203,-32768,-32768, +-32768,-32768,-32768, 225, 198,-32768,-32768,-32768, 711, 278, +-32768,-32768,-32768,-32768, 171, 283,-32768,-32768,-32768, 65, + 189,-32768,-32768, 152, 65, 194, 200, 3,-32768,-32768, + 484,-32768, 84, 65,-32768,-32768,-32768,-32768,-32768, 67, +-32768, 192, 195, 204, 248, 210,-32768,-32768, -74,-32768, +-32768, 163,-32768,-32768,-32768, 306, -10, 213, 282, 215, + 253, -1, 69,-32768, -42,-32768,-32768, 219,-32768, 223, +-32768,-32768,-32768,-32768,-32768, 320, 711, 319, 65, 197, +-32768,-32768, 217,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 222, 226, +-32768, 82,-32768, 29,-32768, 216, 311, 7, 235, 233, + 10, 279, 271,-32768, 236, 10, 276,-32768, 46,-32768, + 1, 231,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 27, +-32768,-32768, 318,-32768, 152, 279, 245, 243,-32768, 211, + 256, 251, 27,-32768,-32768, 255,-32768,-32768,-32768,-32768, + 163, 356, 319, 210, 266, 163, 210,-32768, 274, 274, +-32768,-32768, 561,-32768, 319, 254, 88,-32768,-32768, 231, +-32768, 279, 295, 262, 261,-32768,-32768, 231, 264, 60, + 319, 279, 268, 319,-32768,-32768, 93,-32768,-32768, 272, + 130,-32768,-32768,-32768,-32768, 273, 285, 220, 270, 288, + 277,-32768, 197,-32768,-32768,-32768,-32768, 279, 279,-32768, + 279, 279, 260, 280,-32768,-32768, 383,-32768,-32768, 317, +-32768,-32768,-32768,-32768,-32768, 19, 19,-32768, 173,-32768, + 7,-32768, 294, 231,-32768, 10, 19,-32768, 300, 231, +-32768, 298,-32768, 231,-32768, 49, 173,-32768, 1,-32768, + 297,-32768,-32768, 52,-32768,-32768,-32768,-32768,-32768,-32768, + 304,-32768,-32768, 11, 131,-32768,-32768, 303,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 305, 561, +-32768, 561,-32768, 314, 321,-32768,-32768,-32768, 137,-32768, + -42,-32768, 319, 301,-32768,-32768, 280,-32768, 279,-32768, +-32768,-32768,-32768,-32768, 52, 17, 301, 319,-32768, 165, + 211,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 22, +-32768,-32768,-32768,-32768, 411, 417,-32768 }; static const short yypgoto[] = {-32768, --32768, 417, 284,-32768,-32768, 410,-32768,-32768, 398,-32768, --32768, 369,-32768,-32768,-32768, 353,-32768, 318,-32768,-32768, - 319,-32768, 364,-32768,-32768, 137,-32768,-32768, 267,-32768, - 96, 230,-32768, 111,-32768, 117,-32768, 192,-32768, 193, --32768,-32768,-32768,-32768, 33, -185, -79, -300, -53,-32768, - 203, -186, -124,-32768, -165,-32768, -246,-32768, -48, -119, --32768, 18,-32768,-32768,-32768, -147,-32768,-32768, -178, -166, - -200, 207,-32768, -259,-32768,-32768, 50,-32768,-32768,-32768, --32768,-32768,-32768, 60, 63, -295,-32768,-32768,-32768, 112, - -126, -80,-32768,-32768,-32768,-32768, 31,-32768, 175, -7 +-32768, 423, 289,-32768,-32768, 416,-32768,-32768, 405,-32768, +-32768, 376,-32768,-32768,-32768, 359,-32768, 322,-32768,-32768, + 325,-32768, 371,-32768,-32768, 145,-32768,-32768, 275,-32768, + 100, 234,-32768, 115,-32768, 122,-32768, 196,-32768, 201, +-32768,-32768,-32768,-32768, 34, -187, -80, -183, -52,-32768, + 207, -186, -121,-32768, -137,-32768, -237,-32768, -48, -118, +-32768, 35,-32768,-32768,-32768, -148,-32768,-32768, -178, -166, + -4, 218,-32768, -207,-32768,-32768, 55,-32768,-32768,-32768, +-32768,-32768,-32768, 66, 71, -247,-32768,-32768,-32768, 116, + -126, -81,-32768,-32768,-32768,-32768, 31,-32768, 184, -7 }; -#define YYLAST 689 +#define YYLAST 805 static const short yytable[] = { 15, - 157, 120, 119, 230, 207, 15, 208, 250, 188, 175, - 101, 101, 259, 10, 10, 102, 102, 116, 10, 142, - 359, 360, 113, 10, 200, 409, 1, 2, 343, 65, - 5, 368, 72, 5, 171, 172, 79, 10, 403, 171, - 172, 247, 10, 353, 7, 1, 2, 291, 65, 202, - 131, 67, 10, 11, 63, 10, 180, 181, 10, 247, - 10, 11, 200, 10, 180, 181, 79, 64, 161, 390, - 71, 391, 361, 63, 78, 143, 16, 248, 309, 162, - 263, 314, 279, 323, 114, 201, 64, 202, 286, 144, - 374, 19, 404, 332, -263, 248, 405, 348, 349, 287, - 350, 72, 123, 117, 78, 28, 79, 217, 256, 10, - 180, 181, 1, 2, 249, 165, 175, 188, 131, 117, - 188, 383, 111, 351, 29, 413, 230, 190, 409, 132, - -237, 378, 285, 157, -237, 259, 32, 171, 172, 71, - 117, 68, 30, 138, 78, 261, 218, 219, 12, 275, - 160, 276, 256, 164, 200, 20, 17, 275, 1, 2, - 214, 216, 220, 21, 176, 189, 31, 177, 178, 179, - 10, 180, 181, 1, 2, 108, 109, 206, 33, 202, - 322, 221, 171, 172, 22, 166, 23, 222, 327, 167, - 260, 34, 362, 268, 36, 24, 223, 132, 268, 215, - 37, 280, 66, 284, 225, 80, 226, 182, 10, 279, - 375, 1, 2, 412, 107, 217, 110, 10, 180, 181, - 1, 2, 401, 412, 115, 183, 294, 295, 296, 297, - 245, 83, 84, 396, 246, 308, 190, 329, 10, 190, - 124, 1, 2, 123, 366, 125, 73, 318, 184, 370, - 157, 126, 157, 372, 218, 290, 320, 335, 338, 82, - 321, 336, 339, 331, 127, 185, 331, 83, 84, 342, - 128, 386, 394, 133, 189, 387, 395, 189, 85, 135, - 86, 134, 87, 160, 141, 217, 137, 10, 180, 181, - 1, 2, 88, 168, 169, 222, 89, 140, 170, 196, - 90, -264, 217, 91, 10, 180, 181, 1, 2, 197, - 198, 363, 199, 260, 92, 209, 212, 211, 268, 93, - 10, 94, 241, 95, 218, 244, 243, 255, 280, 363, - 262, 284, 96, 97, 254, 271, 381, 272, 117, 352, - 274, 218, 219, 292, 289, 293, 385, 98, 300, 189, - 10, 180, 181, 1, 2, 302, 304, 220, 306, 99, - 1, 2, 171, 172, 310, 222, 315, 189, 294, 295, - 296, 297, 319, 324, 10, 385, 221, 1, 2, 325, - 340, 326, 222, 328, 333, 341, 337, 381, 344, 38, - 408, 223, 345, 346, 357, 354, 369, 358, 224, 225, - 160, 226, 160, 365, 39, 371, 382, 377, 40, 388, - 392, 389, 398, 393, 41, 42, 43, 416, 417, 6, - 44, 191, 18, 35, 81, 45, 112, 136, 105, 347, - 46, 139, 47, 213, 376, 273, 367, 364, 313, 303, - 48, 317, 414, 305, 402, 397, 399, 373, 334, 49, - 0, 50, 0, 0, 146, 147, 51, 0, 52, 53, - 54, 148, 0, 0, 0, 85, 38, 86, 0, 87, - 149, 0, 0, 0, 0, 0, 0, 0, 0, 88, + 121, 120, 158, 230, 207, 15, 208, 250, 10, 188, + 259, 101, 101, 175, 10, 102, 102, 10, 10, 10, + 11, 143, 114, 10, 117, 409, 1, 2, 7, 65, + 5, 403, 72, 5, 171, 172, 79, 200, 16, 263, + 10, 171, 172, 1, 2, 10, 11, 291, 65, 67, + 132, 247, 28, 10, 180, 181, 10, 180, 181, 10, + 10, 247, 202, 1, 2, 20, 79, 64, 359, 360, + 71, 63, 10, 21, 78, 1, 2, 144, 200, 368, + 343, 361, 279, 323, 115, 404, 64, 248, 19, 405, + 63, 145, -263, 332, 22, 353, 23, 248, 73, 374, + 124, 201, 72, 202, 78, 24, 309, 79, 256, 314, + 118, 256, 29, 249, 118, 12, 165, 188, 132, 175, + 188, 383, 112, 351, 161, 413, 230, 286, 190, 133, + 30, 285, -237, 259, 158, 162, -237, 32, 287, 68, + 71, 17, 118, 34, 139, 78, 261, 275, 200, 276, + 275, 160, 37, 378, 164, 31, 294, 295, 296, 297, + 214, 216, 1, 2, 33, 176, 189, 329, 409, 36, + 166, 206, 66, 202, 167, 171, 172, 171, 172, 322, + 10, 180, 181, 1, 2, 245, 390, 327, 391, 246, + 260, 320, 362, 268, 80, 321, 335, 133, 268, 215, + 336, 280, 217, 284, 10, 180, 181, 1, 2, 279, + 375, 109, 110, 412, 177, 178, 179, 10, 180, 181, + 1, 2, 401, 412, 108, 217, 111, 10, 180, 181, + 1, 2, 396, 338, 386, 308, 190, 339, 387, 190, + 394, 218, 219, 366, 395, 83, 84, 318, 370, 116, + 124, 158, 372, 158, 182, 290, 125, 220, 1, 2, + 171, 172, 126, 331, 218, 217, 331, 10, 180, 181, + 1, 2, 183, 127, 189, 128, 221, 189, 129, 342, + 134, 135, 222, 160, 217, 136, 10, 180, 181, 1, + 2, 223, 138, 348, 349, 184, 350, 141, 224, 225, + 168, 226, 142, 169, 218, 222, 170, 294, 295, 296, + 297, 363, 185, 260, 196, -264, 197, 198, 268, 352, + 199, 209, 212, 218, 219, 211, 10, 241, 280, 363, + 254, 284, 243, 82, 244, 255, 381, 262, 271, 220, + 272, 83, 84, 274, 118, 222, 385, 289, 292, 189, + 293, 300, 85, 38, 86, 302, 87, 304, 221, 306, + 310, 315, 324, 319, 222, 325, 88, 189, 326, 328, + 89, 333, 344, 223, 90, 385, 337, 91, 41, 42, + 43, 225, 346, 226, 340, 341, 357, 381, 92, 45, + 408, 345, 354, 93, 46, 94, 47, 95, 358, 365, + 160, 369, 160, 371, 48, 388, 96, 97, 377, 382, + 416, 398, 389, 49, 10, 50, 417, 1, 2, 392, + 51, 98, 52, 53, 54, 6, 393, 191, 18, 38, + 35, 81, 113, 99, 137, 106, 140, 347, 376, 273, + 367, 213, 364, 414, 39, 317, 313, 305, 40, 402, + 303, 373, 399, 397, 41, 42, 43, 334, 0, 0, + 44, 0, 0, 0, 0, 45, 0, 0, 0, 0, + 46, 0, 47, 0, 0, 0, 0, 0, 0, 0, + 48, 0, 0, 0, 0, 0, 0, 0, 0, 49, + 0, 50, 0, 0, 147, 148, 51, 0, 52, 53, + 54, 149, 0, 0, 0, 85, 38, 86, 0, 87, + 150, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 90, 0, 0, - 91, 41, 42, 43, 0, 0, 0, 0, 0, 150, + 91, 41, 42, 43, 0, 0, 0, 0, 0, 151, 0, 92, 45, 0, 0, 0, 93, 46, 94, 47, 95, 0, 0, 0, 0, 0, 0, 48, 0, 96, - 97, 151, 152, 0, 0, 0, 49, 0, 50, 0, - 153, 146, 147, 51, 98, 52, 53, 54, 148, 0, - 0, 0, 85, 38, 86, 0, 87, 149, 0, 0, + 97, 152, 153, 0, 0, 0, 49, 0, 50, 0, + 154, 147, 148, 51, 98, 52, 53, 54, 149, 0, + 0, 0, 85, 38, 86, 0, 87, 150, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 90, 0, 0, 91, 41, 42, - 43, 0, 0, 0, 0, 0, 150, 0, 92, 45, + 43, 0, 0, 0, 0, 0, 151, 0, 92, 45, 0, 0, 0, 93, 46, 94, 47, 95, 0, 0, - 0, 83, 84, 0, 48, 0, 96, 97, 151, 152, - 0, 0, 85, 49, 86, 50, 87, 0, 1, 2, - 51, 98, 52, 53, 54, 0, 88, 0, 0, 85, - 89, 86, 0, 87, 90, 0, 0, 91, 0, 0, - 0, 0, 0, 88, 0, 0, 0, 89, 92, 0, - 0, 90, 0, 93, 91, 94, 0, 95, 0, 0, - 0, 0, 0, 0, 0, 92, 96, 97, 0, 0, - 93, 0, 94, 0, 95, 0, 0, 0, 0, 0, - 0, 98, 0, 96, 97, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 98 + 0, 0, 0, 0, 48, 0, 96, 97, 152, 153, + 0, 0, 0, 49, 0, 50, 83, 84, 0, 0, + 51, 98, 52, 53, 54, 0, 0, 85, 38, 86, + 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 88, 0, 0, 0, 89, 0, 0, 0, 90, + 0, 0, 91, 41, 42, 43, 0, 0, 0, 0, + 0, 0, 0, 92, 45, 0, 0, 0, 93, 46, + 94, 47, 95, 0, 0, 0, 0, 0, 0, 48, + 0, 96, 97, 0, 0, 0, 0, 0, 49, 0, + 50, 1, 2, 0, 0, 51, 98, 52, 53, 54, + 0, 0, 85, 38, 86, 0, 87, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, + 89, 0, 0, 0, 90, 0, 0, 91, 41, 42, + 43, 0, 0, 0, 0, 0, 0, 0, 92, 45, + 0, 0, 0, 93, 46, 94, 47, 95, 0, 0, + 0, 0, 0, 0, 48, 0, 96, 97, 0, 0, + 0, 0, 0, 49, 0, 50, 0, 0, 0, 0, + 51, 98, 52, 53, 54 }; static const short yycheck[] = { 7, - 120, 82, 82, 170, 152, 13, 154, 194, 135, 134, - 64, 65, 198, 8, 8, 64, 65, 28, 8, 19, - 316, 317, 46, 8, 80, 4, 11, 12, 288, 37, - 0, 327, 40, 3, 13, 14, 44, 8, 15, 13, - 14, 33, 8, 303, 103, 11, 12, 226, 56, 105, - 99, 17, 8, 9, 37, 8, 9, 10, 8, 33, - 8, 9, 80, 8, 9, 10, 74, 37, 41, 370, - 40, 372, 319, 56, 44, 75, 34, 69, 244, 52, - 30, 247, 209, 262, 108, 103, 56, 105, 101, 89, - 337, 105, 69, 272, 103, 69, 73, 298, 299, 112, - 301, 109, 111, 114, 74, 9, 114, 6, 102, 8, - 9, 10, 11, 12, 194, 123, 241, 244, 167, 114, - 247, 111, 107, 302, 57, 104, 293, 135, 4, 99, - 104, 102, 212, 253, 108, 321, 53, 13, 14, 109, - 114, 107, 84, 113, 114, 199, 45, 46, 104, 102, - 120, 104, 102, 123, 80, 12, 104, 102, 11, 12, - 168, 169, 61, 20, 134, 135, 84, 5, 6, 7, - 8, 9, 10, 11, 12, 107, 108, 103, 84, 105, - 260, 80, 13, 14, 41, 104, 43, 86, 268, 108, - 198, 3, 319, 201, 106, 52, 95, 167, 206, 169, - 21, 209, 12, 211, 103, 39, 105, 45, 8, 336, - 337, 11, 12, 400, 107, 6, 103, 8, 9, 10, - 11, 12, 389, 410, 103, 63, 97, 98, 99, 100, - 104, 11, 12, 381, 108, 243, 244, 108, 8, 247, - 81, 11, 12, 111, 324, 81, 46, 255, 86, 330, - 370, 71, 372, 334, 45, 225, 104, 104, 104, 3, - 108, 108, 108, 271, 51, 103, 274, 11, 12, 60, - 81, 104, 104, 3, 244, 108, 108, 247, 22, 3, - 24, 111, 26, 253, 103, 6, 104, 8, 9, 10, - 11, 12, 36, 109, 109, 86, 40, 104, 103, 9, - 44, 103, 6, 47, 8, 9, 10, 11, 12, 35, - 103, 319, 68, 321, 58, 103, 3, 103, 326, 63, - 8, 65, 111, 67, 45, 109, 111, 25, 336, 337, - 105, 339, 76, 77, 115, 68, 344, 105, 114, 60, - 68, 45, 46, 104, 30, 108, 354, 91, 96, 319, - 8, 9, 10, 11, 12, 105, 103, 61, 4, 103, - 11, 12, 13, 14, 95, 86, 88, 337, 97, 98, - 99, 100, 110, 68, 8, 383, 80, 11, 12, 104, - 112, 108, 86, 106, 104, 101, 105, 395, 103, 23, - 398, 95, 104, 106, 4, 113, 102, 82, 102, 103, - 370, 105, 372, 106, 38, 106, 106, 112, 42, 103, - 106, 108, 111, 106, 48, 49, 50, 0, 0, 3, - 54, 138, 13, 26, 56, 59, 74, 109, 65, 293, - 64, 114, 66, 167, 339, 206, 326, 321, 246, 233, - 74, 250, 410, 241, 395, 383, 387, 336, 274, 83, + 82, 82, 121, 170, 153, 13, 155, 194, 8, 136, + 198, 64, 65, 135, 8, 64, 65, 8, 8, 8, + 9, 19, 46, 8, 28, 4, 11, 12, 103, 37, + 0, 15, 40, 3, 13, 14, 44, 80, 34, 30, + 8, 13, 14, 11, 12, 8, 9, 226, 56, 17, + 99, 33, 9, 8, 9, 10, 8, 9, 10, 8, + 8, 33, 105, 11, 12, 12, 74, 37, 316, 317, + 40, 37, 8, 20, 44, 11, 12, 75, 80, 327, + 288, 319, 209, 262, 108, 69, 56, 69, 105, 73, + 56, 89, 103, 272, 41, 303, 43, 69, 46, 337, + 111, 103, 110, 105, 74, 52, 244, 115, 102, 247, + 114, 102, 57, 194, 114, 104, 124, 244, 167, 241, + 247, 111, 107, 302, 41, 104, 293, 101, 136, 99, + 84, 212, 104, 321, 253, 52, 108, 53, 112, 107, + 110, 104, 114, 3, 114, 115, 199, 102, 80, 104, + 102, 121, 21, 102, 124, 84, 97, 98, 99, 100, + 168, 169, 11, 12, 84, 135, 136, 108, 4, 106, + 104, 103, 12, 105, 108, 13, 14, 13, 14, 260, + 8, 9, 10, 11, 12, 104, 370, 268, 372, 108, + 198, 104, 319, 201, 39, 108, 104, 167, 206, 169, + 108, 209, 6, 211, 8, 9, 10, 11, 12, 336, + 337, 107, 108, 400, 5, 6, 7, 8, 9, 10, + 11, 12, 389, 410, 107, 6, 103, 8, 9, 10, + 11, 12, 381, 104, 104, 243, 244, 108, 108, 247, + 104, 45, 46, 324, 108, 11, 12, 255, 330, 103, + 111, 370, 334, 372, 45, 225, 81, 61, 11, 12, + 13, 14, 81, 271, 45, 6, 274, 8, 9, 10, + 11, 12, 63, 71, 244, 51, 80, 247, 81, 60, + 3, 111, 86, 253, 6, 3, 8, 9, 10, 11, + 12, 95, 104, 298, 299, 86, 301, 104, 102, 103, + 109, 105, 103, 109, 45, 86, 103, 97, 98, 99, + 100, 319, 103, 321, 9, 103, 35, 103, 326, 60, + 68, 103, 3, 45, 46, 103, 8, 111, 336, 337, + 115, 339, 111, 3, 109, 25, 344, 105, 68, 61, + 105, 11, 12, 68, 114, 86, 354, 30, 104, 319, + 108, 96, 22, 23, 24, 105, 26, 103, 80, 4, + 95, 88, 68, 110, 86, 104, 36, 337, 108, 106, + 40, 104, 103, 95, 44, 383, 105, 47, 48, 49, + 50, 103, 106, 105, 112, 101, 4, 395, 58, 59, + 398, 104, 113, 63, 64, 65, 66, 67, 82, 106, + 370, 102, 372, 106, 74, 103, 76, 77, 112, 106, + 0, 111, 108, 83, 8, 85, 0, 11, 12, 106, + 90, 91, 92, 93, 94, 3, 106, 139, 13, 23, + 26, 56, 74, 103, 110, 65, 115, 293, 339, 206, + 326, 167, 321, 410, 38, 250, 246, 241, 42, 395, + 233, 336, 387, 383, 48, 49, 50, 274, -1, -1, + 54, -1, -1, -1, -1, 59, -1, -1, -1, -1, + 64, -1, 66, -1, -1, -1, -1, -1, -1, -1, + 74, -1, -1, -1, -1, -1, -1, -1, -1, 83, -1, 85, -1, -1, 11, 12, 90, -1, 92, 93, 94, 18, -1, -1, -1, 22, 23, 24, -1, 26, 27, -1, -1, -1, -1, -1, -1, -1, -1, 36, @@ -753,16 +769,24 @@ static const short yycheck[] = { 7, 40, -1, -1, -1, 44, -1, -1, 47, 48, 49, 50, -1, -1, -1, -1, -1, 56, -1, 58, 59, -1, -1, -1, 63, 64, 65, 66, 67, -1, -1, - -1, 11, 12, -1, 74, -1, 76, 77, 78, 79, - -1, -1, 22, 83, 24, 85, 26, -1, 11, 12, - 90, 91, 92, 93, 94, -1, 36, -1, -1, 22, - 40, 24, -1, 26, 44, -1, -1, 47, -1, -1, - -1, -1, -1, 36, -1, -1, -1, 40, 58, -1, - -1, 44, -1, 63, 47, 65, -1, 67, -1, -1, - -1, -1, -1, -1, -1, 58, 76, 77, -1, -1, - 63, -1, 65, -1, 67, -1, -1, -1, -1, -1, - -1, 91, -1, 76, 77, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 91 + -1, -1, -1, -1, 74, -1, 76, 77, 78, 79, + -1, -1, -1, 83, -1, 85, 11, 12, -1, -1, + 90, 91, 92, 93, 94, -1, -1, 22, 23, 24, + -1, 26, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 36, -1, -1, -1, 40, -1, -1, -1, 44, + -1, -1, 47, 48, 49, 50, -1, -1, -1, -1, + -1, -1, -1, 58, 59, -1, -1, -1, 63, 64, + 65, 66, 67, -1, -1, -1, -1, -1, -1, 74, + -1, 76, 77, -1, -1, -1, -1, -1, 83, -1, + 85, 11, 12, -1, -1, 90, 91, 92, 93, 94, + -1, -1, 22, 23, 24, -1, 26, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, + 40, -1, -1, -1, 44, -1, -1, 47, 48, 49, + 50, -1, -1, -1, -1, -1, -1, -1, 58, 59, + -1, -1, -1, 63, 64, 65, 66, 67, -1, -1, + -1, -1, -1, -1, 74, -1, 76, 77, -1, -1, + -1, -1, -1, 83, -1, 85, -1, -1, -1, -1, + 90, 91, 92, 93, 94 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/share/bison.simple" @@ -2183,9 +2207,9 @@ case 107: case 108: #line 1091 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); - checkmem(yyval.a_expr); - yyval.a_expr->expr_type = yyvsp[0].a_type; + yyval.a_expr = yyvsp[-1].a_expr; + assert(yyval.a_expr->expr_type == A1TC_INVALID); + yyval.a_expr->expr_type = ASN_CONSTR_CHOICE; yyval.a_expr->meta_type = AMT_TYPE; ; break;} @@ -2194,7 +2218,7 @@ case 109: { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); - yyval.a_expr->expr_type = ASN_CONSTR_CHOICE; + yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE; yyval.a_expr->meta_type = AMT_TYPE; ; break;} @@ -2203,21 +2227,12 @@ case 110: { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); - yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE; + yyval.a_expr->expr_type = ASN_CONSTR_SET; yyval.a_expr->meta_type = AMT_TYPE; ; break;} case 111: #line 1109 "asn1p_y.y" -{ - yyval.a_expr = yyvsp[-1].a_expr; - assert(yyval.a_expr->expr_type == A1TC_INVALID); - yyval.a_expr->expr_type = ASN_CONSTR_SET; - yyval.a_expr->meta_type = AMT_TYPE; - ; - break;} -case 112: -#line 1115 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2229,8 +2244,8 @@ case 112: asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 113: -#line 1125 "asn1p_y.y" +case 112: +#line 1119 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2242,8 +2257,8 @@ case 113: asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 114: -#line 1135 "asn1p_y.y" +case 113: +#line 1129 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2251,8 +2266,8 @@ case 114: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 115: -#line 1141 "asn1p_y.y" +case 114: +#line 1135 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2265,8 +2280,8 @@ case 115: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 116: -#line 1155 "asn1p_y.y" +case 115: +#line 1149 "asn1p_y.y" { int ret; yyval.a_expr = yyvsp[-1].a_expr; @@ -2282,8 +2297,8 @@ case 116: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 117: -#line 1179 "asn1p_y.y" +case 116: +#line 1173 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2292,8 +2307,8 @@ case 117: yyval.a_expr->meta_type = AMT_TYPEREF; ; break;} -case 118: -#line 1186 "asn1p_y.y" +case 117: +#line 1180 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2302,8 +2317,8 @@ case 118: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 119: -#line 1201 "asn1p_y.y" +case 118: +#line 1195 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2313,8 +2328,8 @@ case 119: free(yyvsp[0].tv_str); ; break;} -case 120: -#line 1209 "asn1p_y.y" +case 119: +#line 1203 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2326,8 +2341,8 @@ case 120: free(yyvsp[-2].tv_str); ; break;} -case 121: -#line 1219 "asn1p_y.y" +case 120: +#line 1213 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2339,8 +2354,8 @@ case 121: free(yyvsp[-2].tv_str); ; break;} -case 122: -#line 1229 "asn1p_y.y" +case 121: +#line 1223 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2352,8 +2367,8 @@ case 122: free(yyvsp[-2].tv_str); ; break;} -case 123: -#line 1239 "asn1p_y.y" +case 122: +#line 1233 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2363,8 +2378,8 @@ case 123: checkmem(ret == 0); ; break;} -case 124: -#line 1247 "asn1p_y.y" +case 123: +#line 1241 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[0].a_ref; @@ -2385,8 +2400,8 @@ case 124: } ; break;} -case 125: -#line 1269 "asn1p_y.y" +case 124: +#line 1263 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2396,8 +2411,8 @@ case 125: checkmem(ret == 0); ; break;} -case 126: -#line 1277 "asn1p_y.y" +case 125: +#line 1271 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[-2].a_ref; @@ -2406,22 +2421,22 @@ case 126: checkmem(ret == 0); ; break;} -case 129: -#line 1291 "asn1p_y.y" +case 128: +#line 1285 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} -case 130: -#line 1296 "asn1p_y.y" +case 129: +#line 1290 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} -case 131: -#line 1309 "asn1p_y.y" +case 130: +#line 1303 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); @@ -2430,8 +2445,8 @@ case 131: yyval.a_expr->value = yyvsp[0].a_value; ; break;} -case 132: -#line 1319 "asn1p_y.y" +case 131: +#line 1313 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2440,77 +2455,77 @@ case 132: yyval.a_value->value.choice_identifier.value = yyvsp[0].a_value; ; break;} -case 133: -#line 1326 "asn1p_y.y" +case 132: +#line 1320 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} -case 134: -#line 1326 "asn1p_y.y" +case 133: +#line 1320 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); yyval.a_value->type = ATV_UNPARSED; ; break;} -case 135: -#line 1331 "asn1p_y.y" +case 134: +#line 1325 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_NULL; ; break;} -case 136: -#line 1336 "asn1p_y.y" +case 135: +#line 1330 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_FALSE; ; break;} -case 137: -#line 1341 "asn1p_y.y" +case 136: +#line 1335 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_TRUE; ; break;} -case 138: -#line 1346 "asn1p_y.y" +case 137: +#line 1340 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); ; break;} -case 139: -#line 1350 "asn1p_y.y" +case 138: +#line 1344 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); ; break;} -case 140: -#line 1354 "asn1p_y.y" +case 139: +#line 1348 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} -case 141: -#line 1358 "asn1p_y.y" +case 140: +#line 1352 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 142: -#line 1361 "asn1p_y.y" +case 141: +#line 1355 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 143: -#line 1367 "asn1p_y.y" +case 142: +#line 1361 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2523,8 +2538,8 @@ case 143: free(yyvsp[0].tv_str); ; break;} -case 144: -#line 1378 "asn1p_y.y" +case 143: +#line 1372 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2540,8 +2555,8 @@ case 144: free(yyvsp[0].tv_str); ; break;} -case 145: -#line 1395 "asn1p_y.y" +case 144: +#line 1389 "asn1p_y.y" { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 2; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); @@ -2553,8 +2568,8 @@ case 145: free(yyvsp[0].tv_opaque.buf); ; break;} -case 146: -#line 1405 "asn1p_y.y" +case 145: +#line 1399 "asn1p_y.y" { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); @@ -2568,68 +2583,72 @@ case 146: yyval.tv_opaque.len = newsize; ; break;} -case 147: -#line 1420 "asn1p_y.y" +case 146: +#line 1414 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BOOLEAN; ; break;} -case 148: -#line 1421 "asn1p_y.y" +case 147: +#line 1415 "asn1p_y.y" { yyval.a_type = ASN_BASIC_NULL; ; break;} -case 149: -#line 1422 "asn1p_y.y" +case 148: +#line 1416 "asn1p_y.y" { yyval.a_type = ASN_BASIC_REAL; ; break;} -case 150: -#line 1423 "asn1p_y.y" +case 149: +#line 1417 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} -case 151: -#line 1424 "asn1p_y.y" +case 150: +#line 1418 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OCTET_STRING; ; break;} -case 152: -#line 1425 "asn1p_y.y" +case 151: +#line 1419 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; break;} -case 153: -#line 1426 "asn1p_y.y" +case 152: +#line 1420 "asn1p_y.y" { yyval.a_type = ASN_BASIC_RELATIVE_OID; ; break;} -case 154: -#line 1427 "asn1p_y.y" +case 153: +#line 1421 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EXTERNAL; ; break;} -case 155: -#line 1428 "asn1p_y.y" +case 154: +#line 1422 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; break;} -case 156: -#line 1429 "asn1p_y.y" +case 155: +#line 1423 "asn1p_y.y" { yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; break;} -case 157: -#line 1430 "asn1p_y.y" +case 156: +#line 1424 "asn1p_y.y" { yyval.a_type = ASN_BASIC_UTCTime; ; break;} -case 158: -#line 1431 "asn1p_y.y" +case 157: +#line 1425 "asn1p_y.y" { yyval.a_type = ASN_BASIC_GeneralizedTime; ; break;} +case 158: +#line 1426 "asn1p_y.y" +{ yyval.a_type = yyvsp[0].a_type; ; + break;} case 159: -#line 1438 "asn1p_y.y" +#line 1433 "asn1p_y.y" { yyval.a_type = ASN_BASIC_INTEGER; ; break;} case 160: -#line 1439 "asn1p_y.y" +#line 1434 "asn1p_y.y" { yyval.a_type = ASN_BASIC_ENUMERATED; ; break;} case 161: -#line 1440 "asn1p_y.y" +#line 1435 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BIT_STRING; ; break;} case 162: -#line 1444 "asn1p_y.y" +#line 1439 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2638,7 +2657,7 @@ case 162: ; break;} case 163: -#line 1450 "asn1p_y.y" +#line 1445 "asn1p_y.y" { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; @@ -2651,91 +2670,91 @@ case 163: ; break;} case 164: -#line 1463 "asn1p_y.y" +#line 1458 "asn1p_y.y" { yyval.a_type = ASN_STRING_BMPString; ; break;} case 165: -#line 1464 "asn1p_y.y" +#line 1459 "asn1p_y.y" { yyval.a_type = ASN_STRING_GeneralString; fprintf(stderr, "WARNING: GeneralString is not fully supported\n"); ; break;} case 166: -#line 1468 "asn1p_y.y" +#line 1463 "asn1p_y.y" { yyval.a_type = ASN_STRING_GraphicString; fprintf(stderr, "WARNING: GraphicString is not fully supported\n"); ; break;} case 167: -#line 1472 "asn1p_y.y" +#line 1467 "asn1p_y.y" { yyval.a_type = ASN_STRING_IA5String; ; break;} case 168: -#line 1473 "asn1p_y.y" +#line 1468 "asn1p_y.y" { yyval.a_type = ASN_STRING_ISO646String; ; break;} case 169: -#line 1474 "asn1p_y.y" +#line 1469 "asn1p_y.y" { yyval.a_type = ASN_STRING_NumericString; ; break;} case 170: -#line 1475 "asn1p_y.y" +#line 1470 "asn1p_y.y" { yyval.a_type = ASN_STRING_PrintableString; ; break;} case 171: -#line 1476 "asn1p_y.y" +#line 1471 "asn1p_y.y" { yyval.a_type = ASN_STRING_T61String; fprintf(stderr, "WARNING: T61String is not fully supported\n"); ; break;} case 172: -#line 1480 "asn1p_y.y" +#line 1475 "asn1p_y.y" { yyval.a_type = ASN_STRING_TeletexString; ; break;} case 173: -#line 1481 "asn1p_y.y" +#line 1476 "asn1p_y.y" { yyval.a_type = ASN_STRING_UniversalString; ; break;} case 174: -#line 1482 "asn1p_y.y" +#line 1477 "asn1p_y.y" { yyval.a_type = ASN_STRING_UTF8String; ; break;} case 175: -#line 1483 "asn1p_y.y" +#line 1478 "asn1p_y.y" { yyval.a_type = ASN_STRING_VideotexString; fprintf(stderr, "WARNING: VideotexString is not fully supported\n"); ; break;} case 176: -#line 1487 "asn1p_y.y" +#line 1482 "asn1p_y.y" { yyval.a_type = ASN_STRING_VisibleString; ; break;} case 177: -#line 1488 "asn1p_y.y" +#line 1483 "asn1p_y.y" { yyval.a_type = ASN_STRING_ObjectDescriptor; ; break;} case 183: -#line 1500 "asn1p_y.y" +#line 1495 "asn1p_y.y" { yyval.a_constr = 0; ; break;} case 184: -#line 1501 "asn1p_y.y" +#line 1496 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 185: -#line 1507 "asn1p_y.y" +#line 1502 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); ; break;} case 186: -#line 1510 "asn1p_y.y" +#line 1505 "asn1p_y.y" { /* * This is a special case, for compatibility purposes. @@ -2745,25 +2764,25 @@ case 186: ; break;} case 187: -#line 1520 "asn1p_y.y" +#line 1515 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; ; break;} case 188: -#line 1523 "asn1p_y.y" +#line 1518 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} case 189: -#line 1529 "asn1p_y.y" +#line 1524 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 190: -#line 1532 "asn1p_y.y" +#line 1527 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2772,7 +2791,7 @@ case 190: ; break;} case 191: -#line 1538 "asn1p_y.y" +#line 1533 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2783,31 +2802,31 @@ case 191: ; break;} case 192: -#line 1549 "asn1p_y.y" +#line 1544 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 193: -#line 1552 "asn1p_y.y" +#line 1547 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 194: -#line 1555 "asn1p_y.y" +#line 1550 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 195: -#line 1558 "asn1p_y.y" +#line 1553 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 196: -#line 1564 "asn1p_y.y" +#line 1559 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2818,7 +2837,7 @@ case 196: ; break;} case 197: -#line 1572 "asn1p_y.y" +#line 1567 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2829,7 +2848,7 @@ case 197: ; break;} case 198: -#line 1580 "asn1p_y.y" +#line 1575 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2838,7 +2857,7 @@ case 198: ; break;} case 199: -#line 1586 "asn1p_y.y" +#line 1581 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2848,7 +2867,7 @@ case 199: ; break;} case 200: -#line 1593 "asn1p_y.y" +#line 1588 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2859,7 +2878,7 @@ case 200: ; break;} case 201: -#line 1601 "asn1p_y.y" +#line 1596 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2870,7 +2889,7 @@ case 201: ; break;} case 202: -#line 1609 "asn1p_y.y" +#line 1604 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2882,47 +2901,47 @@ case 202: ; break;} case 203: -#line 1618 "asn1p_y.y" +#line 1613 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 204: -#line 1621 "asn1p_y.y" +#line 1616 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 205: -#line 1627 "asn1p_y.y" +#line 1622 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RANGE; ; break;} case 206: -#line 1628 "asn1p_y.y" +#line 1623 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RLRANGE; ; break;} case 207: -#line 1629 "asn1p_y.y" +#line 1624 "asn1p_y.y" { yyval.a_ctype = ACT_EL_LLRANGE; ; break;} case 208: -#line 1630 "asn1p_y.y" +#line 1625 "asn1p_y.y" { yyval.a_ctype = ACT_EL_ULRANGE; ; break;} case 209: -#line 1634 "asn1p_y.y" +#line 1629 "asn1p_y.y" { yyval.a_ctype = ACT_CT_SIZE; ; break;} case 210: -#line 1637 "asn1p_y.y" +#line 1632 "asn1p_y.y" { yyval.a_ctype = ACT_CT_FROM; ; break;} case 211: -#line 1643 "asn1p_y.y" +#line 1638 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2930,7 +2949,7 @@ case 211: ; break;} case 212: -#line 1648 "asn1p_y.y" +#line 1643 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); @@ -2938,20 +2957,20 @@ case 212: ; break;} case 213: -#line 1653 "asn1p_y.y" +#line 1648 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 214: -#line 1656 "asn1p_y.y" +#line 1651 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} case 215: -#line 1660 "asn1p_y.y" +#line 1655 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2965,7 +2984,7 @@ case 215: ; break;} case 216: -#line 1671 "asn1p_y.y" +#line 1666 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2979,25 +2998,25 @@ case 216: ; break;} case 217: -#line 1685 "asn1p_y.y" +#line 1680 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); ; break;} case 218: -#line 1691 "asn1p_y.y" +#line 1686 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 219: -#line 1694 "asn1p_y.y" +#line 1689 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 220: -#line 1700 "asn1p_y.y" +#line 1695 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3005,7 +3024,7 @@ case 220: ; break;} case 221: -#line 1705 "asn1p_y.y" +#line 1700 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3015,45 +3034,45 @@ case 221: ; break;} case 222: -#line 1718 "asn1p_y.y" +#line 1713 "asn1p_y.y" { yyval.a_pres = ACPRES_DEFAULT; ; break;} case 223: -#line 1719 "asn1p_y.y" +#line 1714 "asn1p_y.y" { yyval.a_pres = yyvsp[0].a_pres; ; break;} case 224: -#line 1723 "asn1p_y.y" +#line 1718 "asn1p_y.y" { yyval.a_pres = ACPRES_PRESENT; ; break;} case 225: -#line 1726 "asn1p_y.y" +#line 1721 "asn1p_y.y" { yyval.a_pres = ACPRES_ABSENT; ; break;} case 226: -#line 1729 "asn1p_y.y" +#line 1724 "asn1p_y.y" { yyval.a_pres = ACPRES_OPTIONAL; ; break;} case 227: -#line 1735 "asn1p_y.y" +#line 1730 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 228: -#line 1738 "asn1p_y.y" +#line 1733 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 229: -#line 1747 "asn1p_y.y" +#line 1742 "asn1p_y.y" { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; @@ -3068,13 +3087,13 @@ case 229: ; break;} case 230: -#line 1762 "asn1p_y.y" +#line 1757 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} case 231: -#line 1768 "asn1p_y.y" +#line 1763 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3083,7 +3102,7 @@ case 231: ; break;} case 232: -#line 1774 "asn1p_y.y" +#line 1769 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3094,7 +3113,7 @@ case 232: ; break;} case 233: -#line 1788 "asn1p_y.y" +#line 1783 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; @@ -3108,7 +3127,7 @@ case 233: ; break;} case 234: -#line 1799 "asn1p_y.y" +#line 1794 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; @@ -3123,13 +3142,13 @@ case 234: ; break;} case 235: -#line 1815 "asn1p_y.y" +#line 1810 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} case 236: -#line 1818 "asn1p_y.y" +#line 1813 "asn1p_y.y" { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); @@ -3141,45 +3160,45 @@ case 236: ; break;} case 237: -#line 1836 "asn1p_y.y" +#line 1831 "asn1p_y.y" { yyval.a_marker.flags = EM_NOMARK; yyval.a_marker.default_value = 0; ; break;} case 238: -#line 1840 "asn1p_y.y" +#line 1835 "asn1p_y.y" { yyval.a_marker = yyvsp[0].a_marker; ; break;} case 239: -#line 1844 "asn1p_y.y" +#line 1839 "asn1p_y.y" { yyval.a_marker.flags = EM_OPTIONAL; yyval.a_marker.default_value = 0; ; break;} case 240: -#line 1848 "asn1p_y.y" +#line 1843 "asn1p_y.y" { yyval.a_marker.flags = EM_DEFAULT; yyval.a_marker.default_value = yyvsp[0].a_value; ; break;} case 241: -#line 1871 "asn1p_y.y" +#line 1866 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); ; break;} case 242: -#line 1875 "asn1p_y.y" +#line 1870 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; ; break;} case 243: -#line 1881 "asn1p_y.y" +#line 1876 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3187,14 +3206,14 @@ case 243: ; break;} case 244: -#line 1886 "asn1p_y.y" +#line 1881 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 245: -#line 1893 "asn1p_y.y" +#line 1888 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3204,7 +3223,7 @@ case 245: ; break;} case 246: -#line 1900 "asn1p_y.y" +#line 1895 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3215,7 +3234,7 @@ case 246: ; break;} case 247: -#line 1908 "asn1p_y.y" +#line 1903 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3226,7 +3245,7 @@ case 247: ; break;} case 248: -#line 1916 "asn1p_y.y" +#line 1911 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3236,7 +3255,7 @@ case 248: ; break;} case 249: -#line 1923 "asn1p_y.y" +#line 1918 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3247,102 +3266,102 @@ case 249: ; break;} case 250: -#line 1934 "asn1p_y.y" +#line 1929 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} case 251: -#line 1938 "asn1p_y.y" +#line 1933 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} case 252: -#line 1969 "asn1p_y.y" +#line 1964 "asn1p_y.y" { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; break;} case 253: -#line 1970 "asn1p_y.y" +#line 1965 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; ; break;} case 254: -#line 1974 "asn1p_y.y" +#line 1969 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = yyvsp[0].a_tag.tag_mode; ; break;} case 255: -#line 1981 "asn1p_y.y" +#line 1976 "asn1p_y.y" { yyval.a_tag = yyvsp[-2].a_tag; yyval.a_tag.tag_value = yyvsp[-1].a_int; ; break;} case 256: -#line 1987 "asn1p_y.y" +#line 1982 "asn1p_y.y" { yyval.a_tag.tag_class = TC_CONTEXT_SPECIFIC; ; break;} case 257: -#line 1988 "asn1p_y.y" +#line 1983 "asn1p_y.y" { yyval.a_tag.tag_class = TC_UNIVERSAL; ; break;} case 258: -#line 1989 "asn1p_y.y" +#line 1984 "asn1p_y.y" { yyval.a_tag.tag_class = TC_APPLICATION; ; break;} case 259: -#line 1990 "asn1p_y.y" +#line 1985 "asn1p_y.y" { yyval.a_tag.tag_class = TC_PRIVATE; ; break;} case 260: -#line 1994 "asn1p_y.y" +#line 1989 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_DEFAULT; ; break;} case 261: -#line 1995 "asn1p_y.y" +#line 1990 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_IMPLICIT; ; break;} case 262: -#line 1996 "asn1p_y.y" +#line 1991 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_EXPLICIT; ; break;} case 263: -#line 2000 "asn1p_y.y" +#line 1995 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} case 264: -#line 2004 "asn1p_y.y" +#line 1999 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} case 265: -#line 2012 "asn1p_y.y" +#line 2007 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} case 266: -#line 2019 "asn1p_y.y" +#line 2014 "asn1p_y.y" { yyval.tv_str = 0; ; break;} case 267: -#line 2020 "asn1p_y.y" +#line 2015 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} case 268: -#line 2025 "asn1p_y.y" +#line 2020 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; @@ -3570,7 +3589,7 @@ case 268: } return 1; } -#line 2031 "asn1p_y.y" +#line 2026 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index e316119ab..9ae5017f2 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -1088,12 +1088,6 @@ TypeDeclaration: BasicType { $$ = $1; } - | BasicString { - $$ = asn1p_expr_new(yylineno); - checkmem($$); - $$->expr_type = $1; - $$->meta_type = AMT_TYPE; - } | TOK_CHOICE '{' AlternativeTypeLists '}' { $$ = $3; assert($$->expr_type == A1TC_INVALID); @@ -1429,6 +1423,7 @@ BasicTypeId: | TOK_CHARACTER TOK_STRING { $$ = ASN_BASIC_CHARACTER_STRING; } | TOK_UTCTime { $$ = ASN_BASIC_UTCTime; } | TOK_GeneralizedTime { $$ = ASN_BASIC_GeneralizedTime; } + | BasicString { $$ = $1; } ; /* From a71201f2049457b1171593db98e08dd124415591 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 20 Mar 2005 11:16:20 +0000 Subject: [PATCH 0818/1469] module name git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@818 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/77-str-default-OK.asn1 | 2 +- tests/78-str-default-SE.asn1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/77-str-default-OK.asn1 b/tests/77-str-default-OK.asn1 index 5a4edd0af..64c9137a2 100644 --- a/tests/77-str-default-OK.asn1 +++ b/tests/77-str-default-OK.asn1 @@ -5,7 +5,7 @@ -- .spelio.software.asn1c.test (9363.1.5.1) -- .77 -ModuleTestStringConstraint +ModuleTestStringDefault1 { iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 77 } DEFINITIONS AUTOMATIC TAGS ::= diff --git a/tests/78-str-default-SE.asn1 b/tests/78-str-default-SE.asn1 index a158d5d0a..787d61f31 100644 --- a/tests/78-str-default-SE.asn1 +++ b/tests/78-str-default-SE.asn1 @@ -5,7 +5,7 @@ -- .spelio.software.asn1c.test (9363.1.5.1) -- .78 -ModuleTestStringConstraint2 +ModuleTestStringDefault2 { iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 78 } DEFINITIONS AUTOMATIC TAGS ::= From c61052b1cfa671019377540ecc1afa7c9274017a Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 20 Mar 2005 11:17:57 +0000 Subject: [PATCH 0819/1469] new version bump-up git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@819 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure | 2 +- configure.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 840b4de97..dac27c136 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.9.12 + VERSION=0.9.13 cat >>confdefs.h <<_ACEOF diff --git a/configure.in b/configure.in index 3a0c9c175..912281d47 100644 --- a/configure.in +++ b/configure.in @@ -3,7 +3,7 @@ AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_BUILD AC_CANONICAL_TARGET AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.9.12) +AM_INIT_AUTOMAKE(asn1c, 0.9.13) AM_MAINTAINER_MODE From 9322638db3046d46d06256496506bc9b2f44b165 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 20 Mar 2005 11:27:19 +0000 Subject: [PATCH 0820/1469] calling conventions refactored git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@820 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_retrieve.c | 36 ++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/libasn1fix/asn1fix_retrieve.c b/libasn1fix/asn1fix_retrieve.c index f9e593bce..39a47c1d3 100644 --- a/libasn1fix/asn1fix_retrieve.c +++ b/libasn1fix/asn1fix_retrieve.c @@ -1,6 +1,11 @@ #include "asn1fix_internal.h" -static asn1p_expr_t *asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, int type_or_value); +enum ftt_what { + FTT_TYPE, /* Find the type of the given expression */ + FTT_VALUE, /* Find the value of the given expression */ +}; + +static asn1p_expr_t *asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, enum ftt_what); static int asn1f_compatible_with_exports(arg_t *arg, asn1p_module_t *mod, const char *name); @@ -290,37 +295,38 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { asn1p_expr_t * asn1f_find_terminal_type(arg_t *arg, asn1p_expr_t *expr) { - return asn1f_find_terminal_thing(arg, expr, 0); + return asn1f_find_terminal_thing(arg, expr, FTT_TYPE); } asn1p_expr_t * asn1f_find_terminal_value(arg_t *arg, asn1p_expr_t *expr) { - return asn1f_find_terminal_thing(arg, expr, 1); + return asn1f_find_terminal_thing(arg, expr, FTT_VALUE); } static asn1p_expr_t * -asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, int type_or_value) { +asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, enum ftt_what what) { asn1p_ref_t *ref; asn1p_expr_t *tc; - if(type_or_value) { - /* VALUE */ + switch(what) { + case FTT_TYPE: + /* Expression may be a terminal type itself */ + if(expr->expr_type != A1TC_REFERENCE) + return expr; + ref = expr->reference; + break; + case FTT_VALUE: assert(expr->meta_type == AMT_VALUE); assert(expr->value); /* Expression may be a terminal type itself */ if(expr->value->type != ATV_REFERENCED) return expr; ref = expr->value->value.reference; - } else { - /* TYPE */ - /* Expression may be a terminal type itself */ - if(expr->expr_type != A1TC_REFERENCE) - return expr; - ref = expr->reference; + break; } DEBUG("%s(%s->%s) for line %d", - type_or_value?"VALUE":"TYPE", + (what == FTT_VALUE)?"VALUE":"TYPE", expr->Identifier, asn1f_printable_reference(ref), expr->_lineno); @@ -329,7 +335,7 @@ asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, int type_or_value) { /* * Lookup inside the type itself (ENUMERATED, INTEGER, etc). */ - if(type_or_value) { + if(what == FTT_VALUE) { asn1p_expr_t *val_type_tc; val_type_tc = asn1f_find_terminal_type(arg, expr); if(val_type_tc @@ -365,7 +371,7 @@ asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, int type_or_value) { tc->_mark |= TM_RECURSION; WITH_MODULE(tc->module, - expr = asn1f_find_terminal_thing(arg, tc, type_or_value)); + expr = asn1f_find_terminal_thing(arg, tc, what)); tc->_mark &= ~TM_RECURSION; return expr; From 53832f1e5153ae0eaf241253582c5d05d6e8c64e Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 20 Mar 2005 12:57:21 +0000 Subject: [PATCH 0821/1469] ContainedSubtype constraints git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@821 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix.c | 3 +- libasn1fix/asn1fix_constraint.c | 100 +++++++++++++++++++++---- libasn1fix/asn1fix_constraint.h | 3 +- libasn1fix/asn1fix_constraint_compat.c | 2 + 4 files changed, 91 insertions(+), 17 deletions(-) diff --git a/libasn1fix/asn1fix.c b/libasn1fix/asn1fix.c index 6549a2a61..63cd148d9 100644 --- a/libasn1fix/asn1fix.c +++ b/libasn1fix/asn1fix.c @@ -381,8 +381,7 @@ asn1f_resolve_constraints(arg_t *arg) { DEBUG("(%s)", arg->expr->Identifier); - ret = asn1constraint_resolve(arg, arg->expr->module, - arg->expr->constraints, etype, 0); + ret = asn1constraint_resolve(arg, arg->expr->constraints, etype, 0); RET2RVAL(ret, rvalue); return rvalue; diff --git a/libasn1fix/asn1fix_constraint.c b/libasn1fix/asn1fix_constraint.c index 808f4e8a3..0faee51d5 100644 --- a/libasn1fix/asn1fix_constraint.c +++ b/libasn1fix/asn1fix_constraint.c @@ -2,12 +2,14 @@ #include "asn1fix_constraint.h" #include "asn1fix_crange.h" -static void _remove_exceptions(arg_t *arg, asn1p_constraint_t *ct); -static int constraint_value_resolve(arg_t *arg, asn1p_module_t *mod, asn1p_value_t **value, enum asn1p_constraint_type_e real_ctype); +static void _remove_extensions(arg_t *arg, asn1p_constraint_t *ct); +static int constraint_type_resolve(arg_t *arg, asn1p_constraint_t *ct); +static int constraint_value_resolve(arg_t *arg, asn1p_value_t **value, enum asn1p_constraint_type_e real_ctype); int asn1constraint_pullup(arg_t *arg) { asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *top_parent; asn1p_constraint_t *ct_parent; asn1p_constraint_t *ct_expr; int ret; @@ -63,6 +65,17 @@ asn1constraint_pullup(arg_t *arg) { if(!ct_parent && !ct_expr) return 0; /* No constraints to consider */ + /* + * Resolve constraints, if not already resolved. + */ + top_parent = asn1f_find_terminal_type(arg, arg->expr); + ret = asn1constraint_resolve(arg, ct_expr, + top_parent ? top_parent->expr_type : A1TC_INVALID, 0); + if(ret) return ret; + + /* + * Copy parent type constraints. + */ if(ct_parent) { ct_parent = asn1p_constraint_clone(ct_parent); assert(ct_parent); @@ -89,7 +102,7 @@ asn1constraint_pullup(arg_t *arg) { /* * If we have a parent, remove all the extensions (46.4). */ - _remove_exceptions(arg, ct_parent); + _remove_extensions(arg, ct_parent); expr->combined_constraints = ct_parent; if(ct_expr->type == ACT_CA_SET) { @@ -119,7 +132,7 @@ asn1constraint_pullup(arg_t *arg) { } int -asn1constraint_resolve(arg_t *arg, asn1p_module_t *mod, asn1p_constraint_t *ct, asn1p_expr_type_e etype, enum asn1p_constraint_type_e effective_type) { +asn1constraint_resolve(arg_t *arg, asn1p_constraint_t *ct, asn1p_expr_type_e etype, enum asn1p_constraint_type_e effective_type) { enum asn1p_constraint_type_e real_constraint_type; unsigned int el; int rvalue = 0; @@ -183,18 +196,23 @@ asn1constraint_resolve(arg_t *arg, asn1p_module_t *mod, asn1p_constraint_t *ct, /* * Resolve all possible references, wherever they occur. */ + if(ct->containedSubtype) { + assert(ct->containedSubtype->type == ATV_REFERENCED); + ret = constraint_type_resolve(arg, ct); + RET2RVAL(ret, rvalue); + } if(ct->value && ct->value->type == ATV_REFERENCED) { - ret = constraint_value_resolve(arg, mod, + ret = constraint_value_resolve(arg, &ct->value, real_constraint_type); RET2RVAL(ret, rvalue); } if(ct->range_start && ct->range_start->type == ATV_REFERENCED) { - ret = constraint_value_resolve(arg, mod, + ret = constraint_value_resolve(arg, &ct->range_start, real_constraint_type); RET2RVAL(ret, rvalue); } if(ct->range_stop && ct->range_stop->type == ATV_REFERENCED) { - ret = constraint_value_resolve(arg, mod, + ret = constraint_value_resolve(arg, &ct->range_stop, real_constraint_type); RET2RVAL(ret, rvalue); } @@ -203,7 +221,7 @@ asn1constraint_resolve(arg_t *arg, asn1p_module_t *mod, asn1p_constraint_t *ct, * Proceed recursively. */ for(el = 0; el < ct->el_count; el++) { - ret = asn1constraint_resolve(arg, mod, ct->elements[el], + ret = asn1constraint_resolve(arg, ct->elements[el], etype, effective_type); RET2RVAL(ret, rvalue); } @@ -212,13 +230,13 @@ asn1constraint_resolve(arg_t *arg, asn1p_module_t *mod, asn1p_constraint_t *ct, } static void -_remove_exceptions(arg_t *arg, asn1p_constraint_t *ct) { +_remove_extensions(arg_t *arg, asn1p_constraint_t *ct) { unsigned int i; for(i = 0; i < ct->el_count; i++) { if(ct->elements[i]->type == ACT_EL_EXT) break; - _remove_exceptions(arg, ct->elements[i]); + _remove_extensions(arg, ct->elements[i]); } /* Remove the elements at and after the extensibility mark */ @@ -232,17 +250,72 @@ _remove_exceptions(arg_t *arg, asn1p_constraint_t *ct) { ct->elements[i] = 0; } +static int +constraint_type_resolve(arg_t *arg, asn1p_constraint_t *ct) { + asn1p_expr_t *rtype; + arg_t tmparg; + int ret; + + DEBUG("(\"%s\")", asn1f_printable_value(ct->containedSubtype)); + + assert(ct->containedSubtype->type == ATV_REFERENCED); + + rtype = asn1f_lookup_symbol(arg, arg->expr->module, + ct->containedSubtype->value.reference); + if(!rtype) { + FATAL("Cannot find type \"%s\" in constraints at line %d", + asn1f_printable_value(ct->containedSubtype), + ct->_lineno); + return -1; + } + + + tmparg = *arg; + tmparg.expr = rtype; + tmparg.mod = rtype->module; + ret = asn1constraint_pullup(&tmparg); + if(ret) return ret; + + if(rtype->combined_constraints) { + asn1p_constraint_t *ct_expr; + ct_expr = asn1p_constraint_clone(rtype->combined_constraints); + assert(ct_expr); + + _remove_extensions(arg, ct_expr); + + if(ct_expr->type == ACT_CA_SET) { + unsigned int i; + for(i = 0; i < ct_expr->el_count; i++) { + if(asn1p_constraint_insert( + ct, ct_expr->elements[i])) { + asn1p_constraint_free(ct_expr); + return -1; + } else { + ct_expr->elements[i] = 0; + } + } + asn1p_constraint_free(ct_expr); + } else { + ret = asn1p_constraint_insert(ct, ct_expr); + assert(ret == 0); + } + + ct->type = ACT_CA_SET; + asn1p_value_free(ct->containedSubtype); + ct->containedSubtype = NULL; + } + + return 0; +} static int -constraint_value_resolve(arg_t *arg, asn1p_module_t *mod, +constraint_value_resolve(arg_t *arg, asn1p_value_t **value, enum asn1p_constraint_type_e real_ctype) { asn1p_expr_t static_expr; arg_t tmp_arg; int rvalue = 0; int ret; - (void)mod; - DEBUG("(\"%s\", within <%s>)", asn1f_printable_value(*value), asn1p_constraint_type2str(real_ctype)); @@ -260,3 +333,4 @@ constraint_value_resolve(arg_t *arg, asn1p_module_t *mod, return rvalue; } + diff --git a/libasn1fix/asn1fix_constraint.h b/libasn1fix/asn1fix_constraint.h index cc6621f99..9e692efab 100644 --- a/libasn1fix/asn1fix_constraint.h +++ b/libasn1fix/asn1fix_constraint.h @@ -4,8 +4,7 @@ /* * Resolve referenced values inside constraints. */ -int asn1constraint_resolve(arg_t *arg, asn1p_module_t *module, - asn1p_constraint_t *ct, +int asn1constraint_resolve(arg_t *arg, asn1p_constraint_t *ct, asn1p_expr_type_e topmost_parent_expression_type, enum asn1p_constraint_type_e effective_constraint_type); diff --git a/libasn1fix/asn1fix_constraint_compat.c b/libasn1fix/asn1fix_constraint_compat.c index 5eb93f0ba..17f398606 100644 --- a/libasn1fix/asn1fix_constraint_compat.c +++ b/libasn1fix/asn1fix_constraint_compat.c @@ -16,6 +16,8 @@ asn1constraint_compatible(asn1p_expr_type_e expr_type, switch(constr_type) { case ACT_INVALID: return 0; + case ACT_EL_TYPE: + return 1; case ACT_EL_VALUE: return 1; case ACT_EL_RANGE: From a6a12e384388ade22f18c10df1d4c4ab32f3e048 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 20 Mar 2005 12:58:00 +0000 Subject: [PATCH 0822/1469] ContainedSubtype support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@822 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 1 + TODO | 3 - libasn1parser/asn1p_constr.c | 11 +- libasn1parser/asn1p_constr.h | 6 +- libasn1parser/asn1p_y.c | 1382 +++++++++-------- libasn1parser/asn1p_y.y | 24 +- libasn1print/asn1print.c | 3 + tests/16-constraint-OK.asn1 | 6 +- tests/16-constraint-OK.asn1.-EF | 8 +- ...16-constraint-OK.asn1.-EFprint-constraints | Bin 0 -> 2141 bytes 10 files changed, 743 insertions(+), 701 deletions(-) create mode 100644 tests/16-constraint-OK.asn1.-EFprint-constraints diff --git a/ChangeLog b/ChangeLog index 54ee8708d..7f771b4c2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,7 @@ * Added extra const qualifiers into the support code. * More RFC variations supported in crfc2asn1.pl. * Refined string values compatibility. (Test cases 77, 78). + * Support for ContainedSubtype constraints. (Test case 16). 0.9.12: 2005-Mar-10 diff --git a/TODO b/TODO index 37f760766..a1414b78b 100644 --- a/TODO +++ b/TODO @@ -16,6 +16,3 @@ which is already completed. Also see #3.2. 3. MINOR: 3.1 Parsing of CONSTRAINED BY clauses - -3.2 Support for ContainedSubtype constraint. - diff --git a/libasn1parser/asn1p_constr.c b/libasn1parser/asn1p_constr.c index 7a38f3c14..69802698b 100644 --- a/libasn1parser/asn1p_constr.c +++ b/libasn1parser/asn1p_constr.c @@ -22,6 +22,8 @@ void asn1p_constraint_free(asn1p_constraint_t *ct) { if(ct) { + if(ct->containedSubtype) + asn1p_value_free(ct->containedSubtype); if(ct->value) asn1p_value_free(ct->value); if(ct->range_start) @@ -59,9 +61,10 @@ asn1p_constraint_clone(asn1p_constraint_t *src) { clone->type = src->type; clone->presence = src->presence; - CLONE(value, asn1p_value_clone); - CLONE(range_start, asn1p_value_clone); - CLONE(range_stop, asn1p_value_clone); + CLONE(containedSubtype, asn1p_value_clone); + CLONE(value, asn1p_value_clone); + CLONE(range_start, asn1p_value_clone); + CLONE(range_stop, asn1p_value_clone); for(i = 0; i < src->el_count; i++) { asn1p_constraint_t *t; @@ -115,6 +118,8 @@ asn1p_constraint_type2str(enum asn1p_constraint_type_e type) { switch(type) { case ACT_INVALID: return "INVALID"; + case ACT_EL_TYPE: + return "ContainedSubtype"; case ACT_EL_VALUE: return "SingleValue"; case ACT_EL_RANGE: diff --git a/libasn1parser/asn1p_constr.h b/libasn1parser/asn1p_constr.h index 27369fdda..90035d7cc 100644 --- a/libasn1parser/asn1p_constr.h +++ b/libasn1parser/asn1p_constr.h @@ -11,7 +11,8 @@ typedef struct asn1p_constraint_s { /* * Constraint elements. */ - ACT_EL_VALUE, /* 123, "A", T (elementary value) */ + ACT_EL_TYPE, /* T (contained subtype) */ + ACT_EL_VALUE, /* 123, "A", (elementary value) */ ACT_EL_RANGE, /* 1..2 (elementary range) */ ACT_EL_LLRANGE, /* 1<..2 (elementary range) */ ACT_EL_RLRANGE, /* 1..<2 (elementary range) */ @@ -43,8 +44,9 @@ typedef struct asn1p_constraint_s { } presence; /* - * A single values. + * Separate types and values. */ + asn1p_value_t *containedSubtype; asn1p_value_t *value; asn1p_value_t *range_start; asn1p_value_t *range_stop; diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index 82e1509d5..6aa198347 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -204,11 +204,11 @@ typedef union { -#define YYFINAL 417 +#define YYFINAL 418 #define YYFLAG -32768 #define YYNTBASE 116 -#define YYTRANSLATE(x) ((unsigned)(x) <= 354 ? yytranslate[x] : 217) +#define YYTRANSLATE(x) ((unsigned)(x) <= 354 ? yytranslate[x] : 218) static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -270,65 +270,65 @@ static const short yyprhs[] = { 0, 468, 471, 473, 476, 478, 480, 482, 484, 486, 488, 490, 492, 494, 496, 498, 500, 502, 504, 506, 508, 510, 512, 514, 515, 517, 519, 524, 528, 533, 535, - 539, 545, 547, 551, 555, 559, 564, 568, 570, 574, - 578, 582, 586, 588, 590, 592, 595, 598, 602, 604, - 606, 608, 610, 612, 614, 616, 618, 624, 626, 630, - 632, 636, 637, 639, 641, 643, 645, 647, 649, 653, - 658, 660, 664, 667, 671, 673, 677, 678, 680, 682, - 685, 688, 692, 694, 698, 700, 705, 710, 712, 714, - 716, 718, 719, 721, 724, 729, 730, 732, 734, 736, - 737, 739, 741, 743, 745, 747, 748, 750 + 539, 545, 547, 551, 555, 559, 564, 568, 570, 572, + 576, 580, 584, 588, 590, 592, 594, 597, 600, 604, + 606, 608, 610, 612, 614, 616, 618, 620, 626, 628, + 632, 634, 638, 639, 641, 643, 645, 647, 649, 651, + 655, 660, 662, 666, 669, 673, 675, 679, 680, 682, + 684, 687, 690, 694, 696, 700, 702, 707, 712, 714, + 716, 718, 720, 721, 723, 726, 731, 732, 734, 736, + 738, 739, 741, 743, 745, 747, 749, 750, 752 }; static const short yyrhs[] = { 117, - 0, 118, 0, 117, 118, 0, 213, 119, 34, 123, + 0, 118, 0, 117, 118, 0, 214, 119, 34, 123, 3, 21, 126, 39, 0, 0, 120, 0, 103, 121, 104, 0, 103, 104, 0, 122, 0, 121, 122, 0, - 216, 0, 216, 105, 9, 106, 0, 9, 0, 0, + 217, 0, 217, 105, 9, 106, 0, 9, 0, 0, 124, 0, 125, 0, 124, 125, 0, 41, 84, 0, 52, 84, 0, 20, 84, 0, 43, 53, 0, 12, 57, 0, 0, 127, 0, 128, 0, 127, 128, 0, 130, 0, 135, 0, 143, 0, 170, 0, 138, 0, 0, 38, 12, 129, 0, 178, 0, 54, 131, 107, 0, 54, 46, 0, 132, 0, 131, 132, 0, 133, - 46, 213, 119, 0, 134, 0, 133, 108, 134, 0, - 213, 0, 213, 103, 104, 0, 216, 0, 42, 136, + 46, 214, 119, 0, 134, 0, 133, 108, 134, 0, + 214, 0, 214, 103, 104, 0, 217, 0, 42, 136, 107, 0, 42, 17, 107, 0, 42, 107, 0, 137, - 0, 136, 108, 137, 0, 213, 0, 213, 103, 104, - 0, 216, 0, 213, 139, 3, 103, 140, 104, 0, + 0, 136, 108, 137, 0, 214, 0, 214, 103, 104, + 0, 217, 0, 214, 139, 3, 103, 140, 104, 0, 165, 0, 175, 0, 0, 141, 0, 142, 0, 141, - 108, 142, 0, 102, 0, 186, 0, 213, 3, 208, - 87, 0, 213, 3, 163, 0, 213, 3, 153, 0, - 213, 103, 144, 104, 3, 163, 0, 145, 0, 144, - 108, 145, 0, 213, 0, 213, 109, 216, 0, 213, - 109, 213, 0, 175, 109, 216, 0, 147, 0, 146, - 108, 147, 0, 163, 0, 216, 0, 0, 149, 0, - 150, 0, 149, 108, 150, 0, 216, 163, 202, 0, + 108, 142, 0, 102, 0, 186, 0, 214, 3, 209, + 87, 0, 214, 3, 163, 0, 214, 3, 153, 0, + 214, 103, 144, 104, 3, 163, 0, 145, 0, 144, + 108, 145, 0, 214, 0, 214, 109, 217, 0, 214, + 109, 214, 0, 175, 109, 217, 0, 147, 0, 146, + 108, 147, 0, 163, 0, 217, 0, 0, 149, 0, + 150, 0, 149, 108, 150, 0, 217, 163, 203, 0, 30, 68, 163, 0, 162, 0, 152, 0, 151, 108, - 152, 0, 216, 163, 0, 162, 0, 28, 103, 155, + 152, 0, 217, 163, 0, 162, 0, 28, 103, 155, 104, 157, 0, 0, 88, 0, 156, 0, 155, 108, - 156, 0, 168, 202, 0, 168, 163, 154, 202, 0, - 168, 168, 154, 202, 0, 0, 158, 0, 0, 95, + 156, 0, 168, 203, 0, 168, 163, 154, 203, 0, + 168, 168, 154, 203, 0, 0, 158, 0, 0, 95, 82, 103, 159, 160, 104, 0, 161, 0, 160, 161, 0, 4, 0, 168, 0, 102, 0, 102, 110, 173, - 0, 102, 110, 207, 0, 208, 164, 182, 0, 177, + 0, 102, 110, 208, 0, 209, 164, 182, 0, 177, 0, 27, 103, 151, 104, 0, 78, 103, 148, 104, - 0, 79, 103, 148, 104, 0, 78, 182, 68, 215, - 208, 164, 0, 79, 182, 68, 215, 208, 164, 0, - 18, 0, 18, 35, 25, 216, 0, 213, 103, 146, + 0, 79, 103, 148, 104, 0, 78, 182, 68, 216, + 209, 164, 0, 79, 182, 68, 216, 209, 164, 0, + 18, 0, 18, 35, 25, 217, 0, 214, 103, 146, 104, 0, 165, 0, 56, 68, 165, 0, 11, 0, - 11, 111, 213, 0, 214, 111, 213, 0, 11, 111, - 216, 0, 214, 0, 214, 111, 166, 0, 167, 0, + 11, 111, 214, 0, 215, 111, 214, 0, 11, 111, + 217, 0, 215, 0, 215, 111, 166, 0, 167, 0, 166, 111, 167, 0, 169, 0, 169, 0, 13, 0, - 14, 0, 216, 139, 3, 171, 0, 216, 109, 171, + 14, 0, 217, 139, 3, 171, 0, 217, 109, 171, 0, 0, 103, 172, 174, 0, 63, 0, 45, 0, - 86, 0, 5, 0, 7, 0, 6, 0, 207, 0, - 173, 0, 216, 0, 213, 111, 216, 0, 4, 0, + 86, 0, 5, 0, 7, 0, 6, 0, 208, 0, + 173, 0, 217, 0, 214, 111, 217, 0, 4, 0, 174, 4, 0, 24, 0, 63, 0, 76, 0, 176, 0, 67, 81, 0, 65, 51, 0, 77, 0, 44, 0, 36, 71, 0, 26, 81, 0, 91, 0, 47, 0, 178, 0, 58, 0, 40, 0, 22, 81, 0, - 175, 0, 176, 204, 0, 23, 0, 48, 0, 49, + 175, 0, 176, 205, 0, 23, 0, 48, 0, 49, 0, 50, 0, 59, 0, 64, 0, 74, 0, 83, 0, 85, 0, 90, 0, 92, 0, 93, 0, 94, 0, 66, 0, 99, 0, 100, 0, 97, 0, 98, @@ -337,59 +337,59 @@ static const short yyrhs[] = { 117, 106, 0, 186, 0, 186, 108, 102, 0, 186, 108, 102, 108, 186, 0, 187, 0, 186, 179, 187, 0, 186, 180, 187, 0, 187, 181, 187, 0, 189, 105, - 185, 106, 0, 105, 185, 106, 0, 190, 0, 190, - 188, 190, 0, 61, 188, 190, 0, 190, 188, 60, - 0, 61, 188, 60, 0, 196, 0, 191, 0, 101, - 0, 101, 112, 0, 112, 101, 0, 112, 101, 112, - 0, 80, 0, 46, 0, 45, 0, 86, 0, 207, - 0, 6, 0, 216, 0, 213, 0, 95, 30, 103, - 192, 104, 0, 193, 0, 192, 108, 193, 0, 102, - 0, 216, 182, 194, 0, 0, 195, 0, 73, 0, - 15, 0, 69, 0, 197, 0, 198, 0, 103, 213, - 104, 0, 197, 103, 199, 104, 0, 200, 0, 199, - 108, 200, 0, 113, 201, 0, 113, 111, 201, 0, - 216, 0, 201, 111, 216, 0, 0, 203, 0, 69, - 0, 33, 171, 0, 103, 104, 0, 103, 205, 104, - 0, 206, 0, 205, 108, 206, 0, 216, 0, 216, - 105, 207, 106, 0, 216, 105, 173, 106, 0, 207, - 0, 102, 0, 9, 0, 10, 0, 0, 209, 0, - 210, 212, 0, 114, 211, 9, 115, 0, 0, 89, - 0, 19, 0, 75, 0, 0, 52, 0, 41, 0, - 11, 0, 12, 0, 12, 0, 0, 216, 0, 8, - 0 + 185, 106, 0, 105, 185, 106, 0, 190, 0, 191, + 0, 190, 188, 190, 0, 61, 188, 190, 0, 190, + 188, 60, 0, 61, 188, 60, 0, 197, 0, 192, + 0, 101, 0, 101, 112, 0, 112, 101, 0, 112, + 101, 112, 0, 80, 0, 46, 0, 45, 0, 86, + 0, 208, 0, 6, 0, 217, 0, 214, 0, 95, + 30, 103, 193, 104, 0, 194, 0, 193, 108, 194, + 0, 102, 0, 217, 182, 195, 0, 0, 196, 0, + 73, 0, 15, 0, 69, 0, 198, 0, 199, 0, + 103, 214, 104, 0, 198, 103, 200, 104, 0, 201, + 0, 200, 108, 201, 0, 113, 202, 0, 113, 111, + 202, 0, 217, 0, 202, 111, 217, 0, 0, 204, + 0, 69, 0, 33, 171, 0, 103, 104, 0, 103, + 206, 104, 0, 207, 0, 206, 108, 207, 0, 217, + 0, 217, 105, 208, 106, 0, 217, 105, 173, 106, + 0, 208, 0, 102, 0, 9, 0, 10, 0, 0, + 210, 0, 211, 213, 0, 114, 212, 9, 115, 0, + 0, 89, 0, 19, 0, 75, 0, 0, 52, 0, + 41, 0, 11, 0, 12, 0, 12, 0, 0, 217, + 0, 8, 0 }; #endif #if YYDEBUG != 0 static const short yyrline[] = { 0, - 301, 307, 313, 329, 354, 356, 359, 363, 368, 375, - 383, 388, 392, 401, 403, 411, 415, 423, 427, 430, - 433, 437, 457, 459, 467, 471, 503, 507, 516, 523, - 536, 543, 545, 557, 570, 577, 582, 588, 594, 603, - 609, 615, 622, 628, 636, 640, 643, 650, 656, 662, - 669, 675, 684, 694, 702, 710, 712, 722, 725, 729, - 732, 744, 756, 762, 778, 787, 797, 807, 812, 819, - 826, 836, 842, 848, 852, 875, 877, 879, 885, 891, - 898, 905, 910, 916, 922, 928, 933, 943, 945, 948, - 956, 962, 971, 977, 994, 996, 1001, 1005, 1010, 1015, - 1021, 1025, 1036, 1045, 1054, 1065, 1087, 1091, 1097, 1103, - 1109, 1119, 1129, 1135, 1149, 1173, 1180, 1194, 1203, 1213, - 1223, 1233, 1241, 1262, 1271, 1280, 1281, 1283, 1290, 1302, - 1312, 1320, 1320, 1325, 1330, 1335, 1340, 1344, 1348, 1352, - 1355, 1360, 1372, 1388, 1399, 1413, 1415, 1416, 1417, 1418, - 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1432, 1434, - 1435, 1438, 1445, 1457, 1459, 1463, 1467, 1468, 1469, 1470, - 1471, 1475, 1476, 1477, 1478, 1482, 1483, 1490, 1490, 1491, - 1491, 1492, 1494, 1496, 1501, 1505, 1514, 1518, 1523, 1527, - 1533, 1543, 1547, 1550, 1553, 1558, 1567, 1575, 1581, 1588, - 1596, 1604, 1613, 1616, 1621, 1623, 1624, 1625, 1628, 1632, - 1637, 1643, 1648, 1651, 1655, 1666, 1679, 1685, 1689, 1694, - 1700, 1712, 1714, 1717, 1721, 1724, 1729, 1733, 1741, 1756, - 1762, 1769, 1782, 1794, 1809, 1813, 1830, 1835, 1838, 1843, - 1865, 1870, 1875, 1881, 1887, 1895, 1903, 1911, 1918, 1928, - 1933, 1963, 1965, 1968, 1975, 1981, 1983, 1984, 1985, 1988, - 1990, 1991, 1994, 1999, 2006, 2013, 2015, 2019 + 302, 308, 314, 330, 355, 357, 360, 364, 369, 376, + 384, 389, 393, 402, 404, 412, 416, 424, 428, 431, + 434, 438, 458, 460, 468, 472, 504, 508, 517, 524, + 537, 544, 546, 558, 571, 578, 583, 589, 595, 604, + 610, 616, 623, 629, 637, 641, 644, 651, 657, 663, + 670, 676, 685, 695, 703, 711, 713, 723, 726, 730, + 733, 745, 757, 763, 779, 788, 798, 808, 813, 820, + 827, 837, 843, 849, 853, 876, 878, 880, 886, 892, + 899, 906, 911, 917, 923, 929, 934, 944, 946, 949, + 957, 963, 972, 978, 995, 997, 1002, 1006, 1011, 1016, + 1022, 1026, 1037, 1046, 1055, 1066, 1088, 1092, 1098, 1104, + 1110, 1120, 1130, 1136, 1150, 1174, 1181, 1195, 1204, 1214, + 1224, 1234, 1242, 1263, 1272, 1281, 1282, 1284, 1291, 1303, + 1313, 1321, 1321, 1326, 1331, 1336, 1341, 1345, 1349, 1353, + 1356, 1361, 1373, 1389, 1400, 1414, 1416, 1417, 1418, 1419, + 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1427, 1433, 1435, + 1436, 1439, 1446, 1458, 1460, 1464, 1468, 1469, 1470, 1471, + 1472, 1476, 1477, 1478, 1479, 1483, 1484, 1491, 1491, 1492, + 1492, 1493, 1495, 1497, 1502, 1506, 1515, 1519, 1524, 1528, + 1534, 1544, 1548, 1551, 1554, 1559, 1568, 1576, 1582, 1588, + 1595, 1603, 1611, 1620, 1623, 1628, 1630, 1631, 1632, 1635, + 1639, 1644, 1650, 1655, 1658, 1662, 1675, 1689, 1695, 1699, + 1704, 1710, 1722, 1724, 1727, 1731, 1734, 1739, 1743, 1751, + 1766, 1772, 1779, 1792, 1804, 1819, 1823, 1840, 1845, 1848, + 1853, 1875, 1880, 1885, 1891, 1897, 1905, 1913, 1921, 1928, + 1938, 1943, 1973, 1975, 1978, 1985, 1991, 1993, 1994, 1995, + 1998, 2000, 2001, 2004, 2009, 2016, 2023, 2025, 2029 }; #endif @@ -432,12 +432,13 @@ static const char * const yytname[] = { "$","error","$undefined.","TOK_PPEQ", "Value","@3","DefinedValue","Opaque","BasicTypeId","BasicTypeId_UniverationCompatible", "BasicType","BasicString","Union","Intersection","Except","optConstraints","Constraints", "SetOfConstraints","ElementSetSpecs","ElementSetSpec","ConstraintSubtypeElement", -"ConstraintRangeSpec","ConstraintSpec","ConstraintValue","WithComponents","WithComponentsList", -"WithComponentsElement","optPresenceConstraint","PresenceConstraint","TableConstraint", -"SimpleTableConstraint","ComponentRelationConstraint","AtNotationList","AtNotationElement", -"ComponentIdList","optMarker","Marker","UniverationDefinition","UniverationList", -"UniverationElement","SignedNumber","optTag","Tag","TagTypeValue","TagClass", -"TagPlicit","TypeRefName","ObjectClassReference","optIdentifier","Identifier", NULL +"ConstraintRangeSpec","ConstraintSpec","SingleValue","ContainedSubtype","WithComponents", +"WithComponentsList","WithComponentsElement","optPresenceConstraint","PresenceConstraint", +"TableConstraint","SimpleTableConstraint","ComponentRelationConstraint","AtNotationList", +"AtNotationElement","ComponentIdList","optMarker","Marker","UniverationDefinition", +"UniverationList","UniverationElement","SignedNumber","optTag","Tag","TagTypeValue", +"TagClass","TagPlicit","TypeRefName","ObjectClassReference","optIdentifier", +"Identifier", NULL }; #endif @@ -462,13 +463,13 @@ static const short yyr1[] = { 0, 178, 178, 178, 178, 178, 178, 178, 179, 179, 180, 180, 181, 182, 182, 183, 183, 184, 184, 185, 185, 185, 186, 186, 186, 186, 187, 187, 187, 187, 187, - 187, 187, 187, 187, 188, 188, 188, 188, 189, 189, - 190, 190, 190, 190, 190, 190, 191, 192, 192, 193, - 193, 194, 194, 195, 195, 195, 196, 196, 197, 198, - 199, 199, 200, 200, 201, 201, 202, 202, 203, 203, - 204, 204, 205, 205, 206, 206, 206, 206, 206, 207, - 207, 208, 208, 209, 210, 211, 211, 211, 211, 212, - 212, 212, 213, 213, 214, 215, 215, 216 + 187, 187, 187, 187, 187, 188, 188, 188, 188, 189, + 189, 190, 190, 190, 190, 190, 191, 192, 193, 193, + 194, 194, 195, 195, 196, 196, 196, 197, 197, 198, + 199, 200, 200, 201, 201, 202, 202, 203, 203, 204, + 204, 205, 205, 206, 206, 207, 207, 207, 207, 207, + 208, 208, 209, 209, 210, 211, 212, 212, 212, 212, + 213, 213, 213, 214, 214, 215, 216, 216, 217 }; static const short yyr2[] = { 0, @@ -491,18 +492,18 @@ static const short yyr2[] = { 0, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 4, 3, 4, 1, 3, - 5, 1, 3, 3, 3, 4, 3, 1, 3, 3, - 3, 3, 1, 1, 1, 2, 2, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 5, 1, 3, 1, - 3, 0, 1, 1, 1, 1, 1, 1, 3, 4, - 1, 3, 2, 3, 1, 3, 0, 1, 1, 2, - 2, 3, 1, 3, 1, 4, 4, 1, 1, 1, - 1, 0, 1, 2, 4, 0, 1, 1, 1, 0, - 1, 1, 1, 1, 1, 0, 1, 1 + 5, 1, 3, 3, 3, 4, 3, 1, 1, 3, + 3, 3, 3, 1, 1, 1, 2, 2, 3, 1, + 1, 1, 1, 1, 1, 1, 1, 5, 1, 3, + 1, 3, 0, 1, 1, 1, 1, 1, 1, 3, + 4, 1, 3, 2, 3, 1, 3, 0, 1, 1, + 2, 2, 3, 1, 3, 1, 4, 4, 1, 1, + 1, 1, 0, 1, 2, 4, 0, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 0, 1, 1 }; static const short yydefact[] = { 0, - 263, 264, 1, 2, 5, 3, 0, 0, 6, 268, + 264, 265, 1, 2, 5, 3, 0, 0, 6, 269, 13, 8, 0, 9, 11, 14, 7, 10, 0, 0, 0, 0, 0, 0, 0, 15, 16, 0, 22, 20, 18, 21, 19, 0, 17, 12, 23, 164, 0, 0, @@ -510,283 +511,287 @@ static const short yydefact[] = { 0, 173, 174, 175, 176, 0, 24, 25, 27, 28, 31, 29, 30, 34, 0, 0, 32, 0, 47, 0, 48, 50, 52, 36, 0, 37, 0, 40, 42, 44, 4, - 26, 252, 118, 265, 0, 146, 0, 0, 160, 153, + 26, 253, 118, 266, 0, 146, 0, 0, 160, 153, 157, 159, 147, 0, 0, 148, 152, 156, 0, 0, 54, 55, 149, 158, 122, 0, 33, 46, 45, 0, - 0, 35, 38, 0, 0, 0, 0, 256, 64, 63, - 0, 253, 260, 0, 161, 155, 154, 151, 150, 0, + 0, 35, 38, 0, 0, 0, 0, 257, 64, 63, + 0, 254, 261, 0, 161, 155, 154, 151, 150, 0, 66, 0, 68, 0, 0, 0, 49, 51, 5, 41, - 43, 0, 258, 259, 257, 0, 118, 265, 113, 0, + 43, 0, 259, 260, 258, 0, 118, 266, 113, 0, 0, 183, 183, 62, 183, 116, 162, 149, 107, 0, - 262, 261, 254, 119, 121, 0, 0, 0, 0, 56, - 128, 129, 123, 124, 126, 120, 137, 139, 138, 250, - 251, 135, 134, 136, 132, 130, 141, 140, 0, 142, - 39, 0, 90, 252, 127, 0, 0, 0, 0, 0, + 263, 262, 255, 119, 121, 0, 0, 0, 0, 56, + 128, 129, 123, 124, 126, 120, 137, 139, 138, 251, + 252, 135, 134, 136, 132, 130, 141, 140, 0, 142, + 39, 0, 90, 253, 127, 0, 0, 0, 0, 0, 76, 0, 0, 184, 185, 76, 0, 106, 0, 163, - 252, 252, 67, 71, 70, 69, 214, 211, 210, 0, - 209, 212, 0, 60, 0, 0, 0, 57, 58, 61, - 192, 0, 198, 204, 203, 227, 228, 213, 216, 215, - 0, 0, 0, 0, 95, 0, 0, 239, 88, 88, - 92, 238, 0, 255, 0, 103, 0, 83, 86, 252, - 117, 0, 0, 0, 77, 78, 82, 252, 0, 189, - 266, 0, 0, 266, 249, 241, 0, 243, 248, 245, - 0, 72, 74, 75, 65, 205, 0, 0, 0, 0, - 0, 53, 0, 180, 181, 178, 179, 0, 0, 182, - 0, 0, 0, 0, 125, 144, 133, 143, 131, 0, - 87, 96, 91, 240, 89, 237, 237, 114, 0, 108, - 0, 85, 0, 252, 109, 0, 237, 187, 0, 252, - 267, 0, 110, 252, 242, 0, 0, 115, 252, 206, - 207, 202, 200, 0, 229, 197, 59, 193, 194, 195, - 0, 201, 199, 0, 0, 231, 145, 0, 93, 94, - 104, 105, 142, 84, 186, 81, 79, 80, 190, 0, - 188, 0, 244, 0, 0, 73, 208, 220, 0, 218, - 183, 196, 0, 233, 235, 230, 0, 97, 0, 111, - 112, 247, 246, 217, 0, 222, 234, 0, 232, 0, - 191, 219, 225, 226, 224, 221, 223, 236, 101, 0, - 99, 102, 98, 100, 0, 0, 0 + 253, 253, 67, 71, 70, 69, 215, 212, 211, 0, + 210, 213, 0, 60, 0, 0, 0, 57, 58, 61, + 192, 0, 198, 199, 205, 204, 228, 229, 214, 217, + 216, 0, 0, 0, 0, 95, 0, 0, 240, 88, + 88, 92, 239, 0, 256, 0, 103, 0, 83, 86, + 253, 117, 0, 0, 0, 77, 78, 82, 253, 0, + 189, 267, 0, 0, 267, 250, 242, 0, 244, 249, + 246, 0, 72, 74, 75, 65, 206, 0, 0, 0, + 0, 0, 53, 0, 180, 181, 178, 179, 0, 0, + 182, 0, 0, 0, 0, 125, 144, 133, 143, 131, + 0, 87, 96, 91, 241, 89, 238, 238, 114, 0, + 108, 0, 85, 0, 253, 109, 0, 238, 187, 0, + 253, 268, 0, 110, 253, 243, 0, 0, 115, 253, + 207, 208, 203, 201, 0, 230, 197, 59, 193, 194, + 195, 0, 202, 200, 0, 0, 232, 145, 0, 93, + 94, 104, 105, 142, 84, 186, 81, 79, 80, 190, + 0, 188, 0, 245, 0, 0, 73, 209, 221, 0, + 219, 183, 196, 0, 234, 236, 231, 0, 97, 0, + 111, 112, 248, 247, 218, 0, 223, 235, 0, 233, + 0, 191, 220, 226, 227, 225, 222, 224, 237, 101, + 0, 99, 102, 98, 100, 0, 0, 0 }; -static const short yydefgoto[] = { 415, +static const short yydefgoto[] = { 416, 3, 4, 8, 9, 13, 14, 25, 26, 27, 55, 56, 57, 107, 58, 74, 75, 76, 77, 59, 69, - 70, 60, 100, 227, 228, 229, 61, 130, 131, 281, - 282, 264, 265, 266, 257, 258, 119, 316, 192, 193, - 311, 312, 400, 410, 411, 267, 283, 155, 156, 173, - 174, 194, 195, 62, 186, 242, 187, 307, 157, 103, - 159, 104, 298, 299, 301, 203, 204, 205, 269, 270, - 231, 288, 232, 233, 234, 379, 380, 406, 407, 235, - 236, 237, 355, 356, 384, 251, 252, 210, 277, 278, - 238, 253, 122, 123, 146, 163, 239, 105, 330, 240 + 70, 60, 100, 227, 228, 229, 61, 130, 131, 282, + 283, 265, 266, 267, 258, 259, 119, 317, 192, 193, + 312, 313, 401, 411, 412, 268, 284, 155, 156, 173, + 174, 194, 195, 62, 186, 243, 187, 308, 157, 103, + 159, 104, 299, 300, 302, 203, 204, 205, 270, 271, + 231, 289, 232, 233, 234, 235, 380, 381, 407, 408, + 236, 237, 238, 356, 357, 385, 252, 253, 210, 278, + 279, 239, 254, 122, 123, 146, 163, 240, 105, 331, + 241 }; -static const short yypact[] = { 152, --32768,-32768, 152,-32768, -74,-32768, 12, 5,-32768,-32768, --32768,-32768, 38,-32768, -16, 54,-32768,-32768, 44, 56, - 47, 72, 85, 81, 141, 54,-32768, 64,-32768,-32768, --32768,-32768,-32768, 132,-32768,-32768, 407,-32768, 161, 33, --32768,-32768,-32768, 53,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 156, 407,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 331, 636,-32768, 118,-32768, 105,-32768, - 124,-32768,-32768, 16,-32768, -23,-32768, 147,-32768,-32768, --32768, -3, 140,-32768, 176,-32768, 182, 203,-32768,-32768, --32768,-32768,-32768, 225, 198,-32768,-32768,-32768, 711, 278, --32768,-32768,-32768,-32768, 171, 283,-32768,-32768,-32768, 65, - 189,-32768,-32768, 152, 65, 194, 200, 3,-32768,-32768, - 484,-32768, 84, 65,-32768,-32768,-32768,-32768,-32768, 67, --32768, 192, 195, 204, 248, 210,-32768,-32768, -74,-32768, --32768, 163,-32768,-32768,-32768, 306, -10, 213, 282, 215, - 253, -1, 69,-32768, -42,-32768,-32768, 219,-32768, 223, --32768,-32768,-32768,-32768,-32768, 320, 711, 319, 65, 197, --32768,-32768, 217,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 222, 226, --32768, 82,-32768, 29,-32768, 216, 311, 7, 235, 233, - 10, 279, 271,-32768, 236, 10, 276,-32768, 46,-32768, - 1, 231,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 27, --32768,-32768, 318,-32768, 152, 279, 245, 243,-32768, 211, - 256, 251, 27,-32768,-32768, 255,-32768,-32768,-32768,-32768, - 163, 356, 319, 210, 266, 163, 210,-32768, 274, 274, --32768,-32768, 561,-32768, 319, 254, 88,-32768,-32768, 231, --32768, 279, 295, 262, 261,-32768,-32768, 231, 264, 60, - 319, 279, 268, 319,-32768,-32768, 93,-32768,-32768, 272, - 130,-32768,-32768,-32768,-32768, 273, 285, 220, 270, 288, - 277,-32768, 197,-32768,-32768,-32768,-32768, 279, 279,-32768, - 279, 279, 260, 280,-32768,-32768, 383,-32768,-32768, 317, --32768,-32768,-32768,-32768,-32768, 19, 19,-32768, 173,-32768, - 7,-32768, 294, 231,-32768, 10, 19,-32768, 300, 231, --32768, 298,-32768, 231,-32768, 49, 173,-32768, 1,-32768, - 297,-32768,-32768, 52,-32768,-32768,-32768,-32768,-32768,-32768, - 304,-32768,-32768, 11, 131,-32768,-32768, 303,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 305, 561, --32768, 561,-32768, 314, 321,-32768,-32768,-32768, 137,-32768, - -42,-32768, 319, 301,-32768,-32768, 280,-32768, 279,-32768, --32768,-32768,-32768,-32768, 52, 17, 301, 319,-32768, 165, - 211,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 22, --32768,-32768,-32768,-32768, 411, 417,-32768 +static const short yypact[] = { 228, +-32768,-32768, 228,-32768, -71,-32768, 38, 59,-32768,-32768, +-32768,-32768, 49,-32768, -3, 58,-32768,-32768, 74, 54, + 60, 67, 112, 84, 136, 58,-32768, 82,-32768,-32768, +-32768,-32768,-32768, 152,-32768,-32768, 419,-32768, 178, 33, +-32768,-32768,-32768, 61,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 181, 419,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 332, 648,-32768, 121,-32768, 144,-32768, + 132,-32768,-32768, 17,-32768, -22,-32768, 143,-32768,-32768, +-32768, -17, 137,-32768, 183,-32768, 194, 186,-32768,-32768, +-32768,-32768,-32768, 208, 203,-32768,-32768,-32768, 723, 275, +-32768,-32768,-32768,-32768, 179, 288,-32768,-32768,-32768, 184, + 190,-32768,-32768, 228, 184, 191, 193, 20,-32768,-32768, + 496,-32768, 86, 184,-32768,-32768,-32768,-32768,-32768, 79, +-32768, 188, 195, 200, 258, 355,-32768,-32768, -71,-32768, +-32768, 260,-32768,-32768,-32768, 284, 53, 202, 263, 205, + 238, -15, -14,-32768, 55,-32768,-32768, 206,-32768, 207, +-32768,-32768,-32768,-32768,-32768, 308, 723, 304, 184, 197, +-32768,-32768, 210,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 211, 209, +-32768, 93,-32768, 29,-32768, 199, 292, 11, 269, 214, + 10, 221, 255,-32768, 220, 10, 259,-32768, 46,-32768, + 6, 215,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 62, +-32768,-32768, 298,-32768, 228, 221, 230, 224,-32768, 189, + 240, 232, 62,-32768,-32768,-32768, 236,-32768,-32768,-32768, +-32768, 260, 336, 304, 355, 246, 260, 355,-32768, 254, + 254,-32768,-32768, 573,-32768, 304, 235, 108,-32768,-32768, + 215,-32768, 221, 278, 243, 241,-32768,-32768, 215, 244, + 72, 304, 221, 248, 304,-32768,-32768, 109,-32768,-32768, + 252, 110,-32768,-32768,-32768,-32768, 247, 270, 71, 250, + 266, 267,-32768, 197,-32768,-32768,-32768,-32768, 221, 221, +-32768, 221, 221, 176, 261,-32768,-32768, 371,-32768,-32768, + 296,-32768,-32768,-32768,-32768,-32768, 15, 15,-32768, 167, +-32768, 11,-32768, 277, 215,-32768, 10, 15,-32768, 282, + 215,-32768, 279,-32768, 215,-32768, 13, 167,-32768, 6, +-32768, 274,-32768,-32768, 52,-32768,-32768,-32768,-32768,-32768, +-32768, 281,-32768,-32768, 12, 115,-32768,-32768, 285,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 286, + 573,-32768, 573,-32768, 287, 295,-32768,-32768,-32768, 118, +-32768, 55,-32768, 304, 294,-32768,-32768, 261,-32768, 221, +-32768,-32768,-32768,-32768,-32768, 52, 23, 294, 304,-32768, + 145, 189,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, + 22,-32768,-32768,-32768,-32768, 403, 407,-32768 }; static const short yypgoto[] = {-32768, --32768, 423, 289,-32768,-32768, 416,-32768,-32768, 405,-32768, --32768, 376,-32768,-32768,-32768, 359,-32768, 322,-32768,-32768, - 325,-32768, 371,-32768,-32768, 145,-32768,-32768, 275,-32768, - 100, 234,-32768, 115,-32768, 122,-32768, 196,-32768, 201, --32768,-32768,-32768,-32768, 34, -187, -80, -183, -52,-32768, - 207, -186, -121,-32768, -137,-32768, -237,-32768, -48, -118, --32768, 35,-32768,-32768,-32768, -148,-32768,-32768, -178, -166, - -4, 218,-32768, -207,-32768,-32768, 55,-32768,-32768,-32768, --32768,-32768,-32768, 66, 71, -247,-32768,-32768,-32768, 116, - -126, -81,-32768,-32768,-32768,-32768, 31,-32768, 184, -7 +-32768, 408, 271,-32768,-32768, 399,-32768,-32768, 387,-32768, +-32768, 358,-32768,-32768,-32768, 342,-32768, 305,-32768,-32768, + 309,-32768, 356,-32768,-32768, 134,-32768,-32768, 262,-32768, + 92, 227,-32768, 107,-32768, 114,-32768, 187,-32768, 192, +-32768,-32768,-32768,-32768, 26, -188, -80, -312, -52,-32768, + 198, -186, -120,-32768, -1,-32768, -244,-32768, -48, -118, +-32768, 69,-32768,-32768,-32768, -148,-32768,-32768, -199, -166, + -39, 212,-32768, -204,-32768,-32768,-32768, 47,-32768,-32768, +-32768,-32768,-32768,-32768, 56, 63, -265,-32768,-32768,-32768, + 111, -127, -81,-32768,-32768,-32768,-32768, 31,-32768, 171, + -7 }; -#define YYLAST 805 +#define YYLAST 817 static const short yytable[] = { 15, - 121, 120, 158, 230, 207, 15, 208, 250, 10, 188, - 259, 101, 101, 175, 10, 102, 102, 10, 10, 10, - 11, 143, 114, 10, 117, 409, 1, 2, 7, 65, - 5, 403, 72, 5, 171, 172, 79, 200, 16, 263, - 10, 171, 172, 1, 2, 10, 11, 291, 65, 67, - 132, 247, 28, 10, 180, 181, 10, 180, 181, 10, - 10, 247, 202, 1, 2, 20, 79, 64, 359, 360, - 71, 63, 10, 21, 78, 1, 2, 144, 200, 368, - 343, 361, 279, 323, 115, 404, 64, 248, 19, 405, - 63, 145, -263, 332, 22, 353, 23, 248, 73, 374, - 124, 201, 72, 202, 78, 24, 309, 79, 256, 314, - 118, 256, 29, 249, 118, 12, 165, 188, 132, 175, - 188, 383, 112, 351, 161, 413, 230, 286, 190, 133, - 30, 285, -237, 259, 158, 162, -237, 32, 287, 68, - 71, 17, 118, 34, 139, 78, 261, 275, 200, 276, - 275, 160, 37, 378, 164, 31, 294, 295, 296, 297, - 214, 216, 1, 2, 33, 176, 189, 329, 409, 36, - 166, 206, 66, 202, 167, 171, 172, 171, 172, 322, - 10, 180, 181, 1, 2, 245, 390, 327, 391, 246, - 260, 320, 362, 268, 80, 321, 335, 133, 268, 215, - 336, 280, 217, 284, 10, 180, 181, 1, 2, 279, - 375, 109, 110, 412, 177, 178, 179, 10, 180, 181, - 1, 2, 401, 412, 108, 217, 111, 10, 180, 181, - 1, 2, 396, 338, 386, 308, 190, 339, 387, 190, - 394, 218, 219, 366, 395, 83, 84, 318, 370, 116, - 124, 158, 372, 158, 182, 290, 125, 220, 1, 2, - 171, 172, 126, 331, 218, 217, 331, 10, 180, 181, - 1, 2, 183, 127, 189, 128, 221, 189, 129, 342, - 134, 135, 222, 160, 217, 136, 10, 180, 181, 1, - 2, 223, 138, 348, 349, 184, 350, 141, 224, 225, - 168, 226, 142, 169, 218, 222, 170, 294, 295, 296, - 297, 363, 185, 260, 196, -264, 197, 198, 268, 352, - 199, 209, 212, 218, 219, 211, 10, 241, 280, 363, - 254, 284, 243, 82, 244, 255, 381, 262, 271, 220, - 272, 83, 84, 274, 118, 222, 385, 289, 292, 189, - 293, 300, 85, 38, 86, 302, 87, 304, 221, 306, - 310, 315, 324, 319, 222, 325, 88, 189, 326, 328, - 89, 333, 344, 223, 90, 385, 337, 91, 41, 42, - 43, 225, 346, 226, 340, 341, 357, 381, 92, 45, - 408, 345, 354, 93, 46, 94, 47, 95, 358, 365, - 160, 369, 160, 371, 48, 388, 96, 97, 377, 382, - 416, 398, 389, 49, 10, 50, 417, 1, 2, 392, - 51, 98, 52, 53, 54, 6, 393, 191, 18, 38, - 35, 81, 113, 99, 137, 106, 140, 347, 376, 273, - 367, 213, 364, 414, 39, 317, 313, 305, 40, 402, - 303, 373, 399, 397, 41, 42, 43, 334, 0, 0, - 44, 0, 0, 0, 0, 45, 0, 0, 0, 0, - 46, 0, 47, 0, 0, 0, 0, 0, 0, 0, - 48, 0, 0, 0, 0, 0, 0, 0, 0, 49, - 0, 50, 0, 0, 147, 148, 51, 0, 52, 53, - 54, 149, 0, 0, 0, 85, 38, 86, 0, 87, - 150, 0, 0, 0, 0, 0, 0, 0, 0, 88, - 0, 0, 0, 89, 0, 0, 0, 90, 0, 0, - 91, 41, 42, 43, 0, 0, 0, 0, 0, 151, - 0, 92, 45, 0, 0, 0, 93, 46, 94, 47, - 95, 0, 0, 0, 0, 0, 0, 48, 0, 96, - 97, 152, 153, 0, 0, 0, 49, 0, 50, 0, - 154, 147, 148, 51, 98, 52, 53, 54, 149, 0, - 0, 0, 85, 38, 86, 0, 87, 150, 0, 0, - 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, - 89, 0, 0, 0, 90, 0, 0, 91, 41, 42, - 43, 0, 0, 0, 0, 0, 151, 0, 92, 45, - 0, 0, 0, 93, 46, 94, 47, 95, 0, 0, - 0, 0, 0, 0, 48, 0, 96, 97, 152, 153, - 0, 0, 0, 49, 0, 50, 83, 84, 0, 0, - 51, 98, 52, 53, 54, 0, 0, 85, 38, 86, - 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, + 121, 120, 158, 230, 207, 15, 208, 251, 188, 260, + 117, 101, 101, 10, 175, 102, 102, 10, 10, 10, + 10, 180, 181, 114, 10, 410, 292, 1, 2, 65, + 5, 7, 72, 5, 171, 172, 79, 404, 143, 264, + 10, 171, 172, 1, 2, 10, 11, 248, 65, 67, + 132, 360, 361, 10, 180, 181, 10, 11, 391, 10, + 392, 248, 369, 324, 200, 200, 79, 64, 10, 20, + 71, 1, 2, 333, 78, 362, 217, 21, 10, 180, + 181, 280, 28, 249, 344, 115, 64, 201, 206, 202, + 202, 405, 16, 375, 144, 406, 118, 249, 22, 354, + 23, 19, 72, 352, 78, 63, 73, 79, 145, 24, + 29, 257, 257, 250, 276, 218, 165, 188, 132, 118, + 188, 175, 384, 112, 63, 414, 161, 230, 190, 133, + 343, 286, -238, 260, 200, 158, -238, 162, 34, 68, + 71, 12, 118, 30, 139, 78, 262, 276, 410, 277, + 31, 160, 17, 379, 164, -264, 222, 171, 172, 202, + 214, 216, 287, 124, 32, 176, 189, 33, 295, 296, + 297, 298, 37, 288, 10, 180, 181, 1, 2, 330, + 323, 217, 166, 10, 180, 181, 167, 36, 328, 66, + 261, 10, 363, 269, 1, 2, 246, 133, 269, 215, + 247, 281, 217, 285, 10, 180, 181, 1, 2, 280, + 376, 321, 336, 339, 413, 322, 337, 340, 387, 80, + 218, 395, 388, 402, 413, 396, 217, 108, 10, 180, + 181, 1, 2, 397, 111, 353, 309, 190, 1, 2, + 190, 218, 219, 310, 367, 116, 315, 124, 319, 371, + 109, 110, 158, 373, 158, 291, 127, 220, 128, 349, + 350, 222, 351, 125, 332, 218, 219, 332, 1, 2, + 171, 172, 171, 172, 126, 189, 221, 134, 189, 83, + 84, 220, 222, 129, 160, 295, 296, 297, 298, 135, + 136, 223, 196, 138, 141, 142, 168, 197, 224, 225, + 221, 226, 170, 169, -265, 199, 222, 198, 209, 211, + 212, 10, 364, 255, 261, 223, 256, 245, 263, 269, + 242, 244, 272, 225, 273, 226, 275, 290, 118, 281, + 364, 294, 285, 293, 82, 301, 303, 382, 305, 307, + 311, 316, 83, 84, 320, 325, 326, 386, 327, 329, + 189, 334, 345, 85, 38, 86, 338, 87, 341, 177, + 178, 179, 10, 180, 181, 1, 2, 88, 189, 346, + 342, 89, 347, 355, 358, 90, 386, 359, 91, 41, + 42, 43, 366, 370, 372, 378, 383, 389, 382, 92, + 45, 409, 393, 390, 93, 46, 94, 47, 95, 182, + 394, 160, 417, 160, 399, 48, 418, 96, 97, 191, + 6, 18, 35, 81, 49, 113, 50, 183, 137, 140, + 106, 51, 98, 52, 53, 54, 10, 348, 213, 1, + 2, 377, 274, 368, 99, 365, 415, 318, 314, 306, + 184, 38, 403, 400, 304, 335, 398, 374, 0, 0, + 0, 0, 0, 0, 0, 0, 39, 185, 0, 0, + 40, 0, 0, 0, 0, 0, 41, 42, 43, 0, + 0, 0, 44, 0, 0, 0, 0, 45, 0, 0, + 0, 0, 46, 0, 47, 0, 0, 0, 0, 0, + 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, + 0, 49, 0, 50, 0, 0, 147, 148, 51, 0, + 52, 53, 54, 149, 0, 0, 0, 85, 38, 86, + 0, 87, 150, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 90, 0, 0, 91, 41, 42, 43, 0, 0, 0, 0, - 0, 0, 0, 92, 45, 0, 0, 0, 93, 46, + 0, 151, 0, 92, 45, 0, 0, 0, 93, 46, 94, 47, 95, 0, 0, 0, 0, 0, 0, 48, - 0, 96, 97, 0, 0, 0, 0, 0, 49, 0, - 50, 1, 2, 0, 0, 51, 98, 52, 53, 54, - 0, 0, 85, 38, 86, 0, 87, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, - 89, 0, 0, 0, 90, 0, 0, 91, 41, 42, - 43, 0, 0, 0, 0, 0, 0, 0, 92, 45, - 0, 0, 0, 93, 46, 94, 47, 95, 0, 0, - 0, 0, 0, 0, 48, 0, 96, 97, 0, 0, - 0, 0, 0, 49, 0, 50, 0, 0, 0, 0, - 51, 98, 52, 53, 54 + 0, 96, 97, 152, 153, 0, 0, 0, 49, 0, + 50, 0, 154, 147, 148, 51, 98, 52, 53, 54, + 149, 0, 0, 0, 85, 38, 86, 0, 87, 150, + 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, + 0, 0, 89, 0, 0, 0, 90, 0, 0, 91, + 41, 42, 43, 0, 0, 0, 0, 0, 151, 0, + 92, 45, 0, 0, 0, 93, 46, 94, 47, 95, + 0, 0, 0, 0, 0, 0, 48, 0, 96, 97, + 152, 153, 0, 0, 0, 49, 0, 50, 83, 84, + 0, 0, 51, 98, 52, 53, 54, 0, 0, 85, + 38, 86, 0, 87, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, + 0, 90, 0, 0, 91, 41, 42, 43, 0, 0, + 0, 0, 0, 0, 0, 92, 45, 0, 0, 0, + 93, 46, 94, 47, 95, 0, 0, 0, 0, 0, + 0, 48, 0, 96, 97, 0, 0, 0, 0, 0, + 49, 0, 50, 1, 2, 0, 0, 51, 98, 52, + 53, 54, 0, 0, 85, 38, 86, 0, 87, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, + 0, 0, 89, 0, 0, 0, 90, 0, 0, 91, + 41, 42, 43, 0, 0, 0, 0, 0, 0, 0, + 92, 45, 0, 0, 0, 93, 46, 94, 47, 95, + 0, 0, 0, 0, 0, 0, 48, 0, 96, 97, + 0, 0, 0, 0, 0, 49, 0, 50, 0, 0, + 0, 0, 51, 98, 52, 53, 54 }; static const short yycheck[] = { 7, - 82, 82, 121, 170, 153, 13, 155, 194, 8, 136, - 198, 64, 65, 135, 8, 64, 65, 8, 8, 8, - 9, 19, 46, 8, 28, 4, 11, 12, 103, 37, - 0, 15, 40, 3, 13, 14, 44, 80, 34, 30, - 8, 13, 14, 11, 12, 8, 9, 226, 56, 17, - 99, 33, 9, 8, 9, 10, 8, 9, 10, 8, - 8, 33, 105, 11, 12, 12, 74, 37, 316, 317, - 40, 37, 8, 20, 44, 11, 12, 75, 80, 327, - 288, 319, 209, 262, 108, 69, 56, 69, 105, 73, - 56, 89, 103, 272, 41, 303, 43, 69, 46, 337, - 111, 103, 110, 105, 74, 52, 244, 115, 102, 247, - 114, 102, 57, 194, 114, 104, 124, 244, 167, 241, - 247, 111, 107, 302, 41, 104, 293, 101, 136, 99, - 84, 212, 104, 321, 253, 52, 108, 53, 112, 107, - 110, 104, 114, 3, 114, 115, 199, 102, 80, 104, - 102, 121, 21, 102, 124, 84, 97, 98, 99, 100, - 168, 169, 11, 12, 84, 135, 136, 108, 4, 106, - 104, 103, 12, 105, 108, 13, 14, 13, 14, 260, - 8, 9, 10, 11, 12, 104, 370, 268, 372, 108, - 198, 104, 319, 201, 39, 108, 104, 167, 206, 169, - 108, 209, 6, 211, 8, 9, 10, 11, 12, 336, - 337, 107, 108, 400, 5, 6, 7, 8, 9, 10, - 11, 12, 389, 410, 107, 6, 103, 8, 9, 10, - 11, 12, 381, 104, 104, 243, 244, 108, 108, 247, - 104, 45, 46, 324, 108, 11, 12, 255, 330, 103, - 111, 370, 334, 372, 45, 225, 81, 61, 11, 12, - 13, 14, 81, 271, 45, 6, 274, 8, 9, 10, - 11, 12, 63, 71, 244, 51, 80, 247, 81, 60, - 3, 111, 86, 253, 6, 3, 8, 9, 10, 11, - 12, 95, 104, 298, 299, 86, 301, 104, 102, 103, - 109, 105, 103, 109, 45, 86, 103, 97, 98, 99, - 100, 319, 103, 321, 9, 103, 35, 103, 326, 60, - 68, 103, 3, 45, 46, 103, 8, 111, 336, 337, - 115, 339, 111, 3, 109, 25, 344, 105, 68, 61, - 105, 11, 12, 68, 114, 86, 354, 30, 104, 319, - 108, 96, 22, 23, 24, 105, 26, 103, 80, 4, - 95, 88, 68, 110, 86, 104, 36, 337, 108, 106, - 40, 104, 103, 95, 44, 383, 105, 47, 48, 49, - 50, 103, 106, 105, 112, 101, 4, 395, 58, 59, - 398, 104, 113, 63, 64, 65, 66, 67, 82, 106, - 370, 102, 372, 106, 74, 103, 76, 77, 112, 106, - 0, 111, 108, 83, 8, 85, 0, 11, 12, 106, - 90, 91, 92, 93, 94, 3, 106, 139, 13, 23, - 26, 56, 74, 103, 110, 65, 115, 293, 339, 206, - 326, 167, 321, 410, 38, 250, 246, 241, 42, 395, - 233, 336, 387, 383, 48, 49, 50, 274, -1, -1, - 54, -1, -1, -1, -1, 59, -1, -1, -1, -1, - 64, -1, 66, -1, -1, -1, -1, -1, -1, -1, - 74, -1, -1, -1, -1, -1, -1, -1, -1, 83, - -1, 85, -1, -1, 11, 12, 90, -1, 92, 93, - 94, 18, -1, -1, -1, 22, 23, 24, -1, 26, - 27, -1, -1, -1, -1, -1, -1, -1, -1, 36, - -1, -1, -1, 40, -1, -1, -1, 44, -1, -1, - 47, 48, 49, 50, -1, -1, -1, -1, -1, 56, - -1, 58, 59, -1, -1, -1, 63, 64, 65, 66, - 67, -1, -1, -1, -1, -1, -1, 74, -1, 76, - 77, 78, 79, -1, -1, -1, 83, -1, 85, -1, - 87, 11, 12, 90, 91, 92, 93, 94, 18, -1, - -1, -1, 22, 23, 24, -1, 26, 27, -1, -1, - -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, - 40, -1, -1, -1, 44, -1, -1, 47, 48, 49, - 50, -1, -1, -1, -1, -1, 56, -1, 58, 59, - -1, -1, -1, 63, 64, 65, 66, 67, -1, -1, - -1, -1, -1, -1, 74, -1, 76, 77, 78, 79, - -1, -1, -1, 83, -1, 85, 11, 12, -1, -1, - 90, 91, 92, 93, 94, -1, -1, 22, 23, 24, - -1, 26, -1, -1, -1, -1, -1, -1, -1, -1, + 82, 82, 121, 170, 153, 13, 155, 194, 136, 198, + 28, 64, 65, 8, 135, 64, 65, 8, 8, 8, + 8, 9, 10, 46, 8, 4, 226, 11, 12, 37, + 0, 103, 40, 3, 13, 14, 44, 15, 19, 30, + 8, 13, 14, 11, 12, 8, 9, 33, 56, 17, + 99, 317, 318, 8, 9, 10, 8, 9, 371, 8, + 373, 33, 328, 263, 80, 80, 74, 37, 8, 12, + 40, 11, 12, 273, 44, 320, 6, 20, 8, 9, + 10, 209, 9, 69, 289, 108, 56, 103, 103, 105, + 105, 69, 34, 338, 75, 73, 114, 69, 41, 304, + 43, 105, 110, 303, 74, 37, 46, 115, 89, 52, + 57, 102, 102, 194, 102, 45, 124, 245, 167, 114, + 248, 242, 111, 107, 56, 104, 41, 294, 136, 99, + 60, 212, 104, 322, 80, 254, 108, 52, 3, 107, + 110, 104, 114, 84, 114, 115, 199, 102, 4, 104, + 84, 121, 104, 102, 124, 103, 86, 13, 14, 105, + 168, 169, 101, 111, 53, 135, 136, 84, 97, 98, + 99, 100, 21, 112, 8, 9, 10, 11, 12, 108, + 261, 6, 104, 8, 9, 10, 108, 106, 269, 12, + 198, 8, 320, 201, 11, 12, 104, 167, 206, 169, + 108, 209, 6, 211, 8, 9, 10, 11, 12, 337, + 338, 104, 104, 104, 401, 108, 108, 108, 104, 39, + 45, 104, 108, 390, 411, 108, 6, 107, 8, 9, + 10, 11, 12, 382, 103, 60, 244, 245, 11, 12, + 248, 45, 46, 245, 325, 103, 248, 111, 256, 331, + 107, 108, 371, 335, 373, 225, 71, 61, 51, 299, + 300, 86, 302, 81, 272, 45, 46, 275, 11, 12, + 13, 14, 13, 14, 81, 245, 80, 3, 248, 11, + 12, 61, 86, 81, 254, 97, 98, 99, 100, 111, + 3, 95, 9, 104, 104, 103, 109, 35, 102, 103, + 80, 105, 103, 109, 103, 68, 86, 103, 103, 103, + 3, 8, 320, 115, 322, 95, 25, 109, 105, 327, + 111, 111, 68, 103, 105, 105, 68, 30, 114, 337, + 338, 108, 340, 104, 3, 96, 105, 345, 103, 4, + 95, 88, 11, 12, 110, 68, 104, 355, 108, 106, + 320, 104, 103, 22, 23, 24, 105, 26, 112, 5, + 6, 7, 8, 9, 10, 11, 12, 36, 338, 104, + 101, 40, 106, 113, 4, 44, 384, 82, 47, 48, + 49, 50, 106, 102, 106, 112, 106, 103, 396, 58, + 59, 399, 106, 108, 63, 64, 65, 66, 67, 45, + 106, 371, 0, 373, 111, 74, 0, 76, 77, 139, + 3, 13, 26, 56, 83, 74, 85, 63, 110, 115, + 65, 90, 91, 92, 93, 94, 8, 294, 167, 11, + 12, 340, 206, 327, 103, 322, 411, 251, 247, 242, + 86, 23, 396, 388, 233, 275, 384, 337, -1, -1, + -1, -1, -1, -1, -1, -1, 38, 103, -1, -1, + 42, -1, -1, -1, -1, -1, 48, 49, 50, -1, + -1, -1, 54, -1, -1, -1, -1, 59, -1, -1, + -1, -1, 64, -1, 66, -1, -1, -1, -1, -1, + -1, -1, 74, -1, -1, -1, -1, -1, -1, -1, + -1, 83, -1, 85, -1, -1, 11, 12, 90, -1, + 92, 93, 94, 18, -1, -1, -1, 22, 23, 24, + -1, 26, 27, -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, 40, -1, -1, -1, 44, -1, -1, 47, 48, 49, 50, -1, -1, -1, -1, - -1, -1, -1, 58, 59, -1, -1, -1, 63, 64, + -1, 56, -1, 58, 59, -1, -1, -1, 63, 64, 65, 66, 67, -1, -1, -1, -1, -1, -1, 74, - -1, 76, 77, -1, -1, -1, -1, -1, 83, -1, - 85, 11, 12, -1, -1, 90, 91, 92, 93, 94, - -1, -1, 22, 23, 24, -1, 26, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, - 40, -1, -1, -1, 44, -1, -1, 47, 48, 49, - 50, -1, -1, -1, -1, -1, -1, -1, 58, 59, - -1, -1, -1, 63, 64, 65, 66, 67, -1, -1, - -1, -1, -1, -1, 74, -1, 76, 77, -1, -1, - -1, -1, -1, 83, -1, 85, -1, -1, -1, -1, - 90, 91, 92, 93, 94 + -1, 76, 77, 78, 79, -1, -1, -1, 83, -1, + 85, -1, 87, 11, 12, 90, 91, 92, 93, 94, + 18, -1, -1, -1, 22, 23, 24, -1, 26, 27, + -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, + -1, -1, 40, -1, -1, -1, 44, -1, -1, 47, + 48, 49, 50, -1, -1, -1, -1, -1, 56, -1, + 58, 59, -1, -1, -1, 63, 64, 65, 66, 67, + -1, -1, -1, -1, -1, -1, 74, -1, 76, 77, + 78, 79, -1, -1, -1, 83, -1, 85, 11, 12, + -1, -1, 90, 91, 92, 93, 94, -1, -1, 22, + 23, 24, -1, 26, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 36, -1, -1, -1, 40, -1, -1, + -1, 44, -1, -1, 47, 48, 49, 50, -1, -1, + -1, -1, -1, -1, -1, 58, 59, -1, -1, -1, + 63, 64, 65, 66, 67, -1, -1, -1, -1, -1, + -1, 74, -1, 76, 77, -1, -1, -1, -1, -1, + 83, -1, 85, 11, 12, -1, -1, 90, 91, 92, + 93, 94, -1, -1, 22, 23, 24, -1, 26, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, + -1, -1, 40, -1, -1, -1, 44, -1, -1, 47, + 48, 49, 50, -1, -1, -1, -1, -1, -1, -1, + 58, 59, -1, -1, -1, 63, 64, 65, 66, 67, + -1, -1, -1, -1, -1, -1, 74, -1, 76, 77, + -1, -1, -1, -1, -1, 83, -1, 85, -1, -1, + -1, -1, 90, 91, 92, 93, 94 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/share/bison.simple" @@ -1332,13 +1337,13 @@ yyparse(YYPARSE_PARAM_ARG) switch (yyn) { case 1: -#line 302 "asn1p_y.y" +#line 303 "asn1p_y.y" { *(void **)param = yyvsp[0].a_grammar; ; break;} case 2: -#line 308 "asn1p_y.y" +#line 309 "asn1p_y.y" { yyval.a_grammar = asn1p_new(); checkmem(yyval.a_grammar); @@ -1346,14 +1351,14 @@ case 2: ; break;} case 3: -#line 313 "asn1p_y.y" +#line 314 "asn1p_y.y" { yyval.a_grammar = yyvsp[-1].a_grammar; TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); ; break;} case 4: -#line 334 "asn1p_y.y" +#line 335 "asn1p_y.y" { if(yyvsp[-1].a_module) { @@ -1370,27 +1375,27 @@ case 4: ; break;} case 5: -#line 355 "asn1p_y.y" +#line 356 "asn1p_y.y" { yyval.a_oid = 0; ; break;} case 6: -#line 356 "asn1p_y.y" +#line 357 "asn1p_y.y" { yyval.a_oid = yyvsp[0].a_oid; ; break;} case 7: -#line 360 "asn1p_y.y" +#line 361 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; ; break;} case 8: -#line 363 "asn1p_y.y" +#line 364 "asn1p_y.y" { yyval.a_oid = 0; ; break;} case 9: -#line 369 "asn1p_y.y" +#line 370 "asn1p_y.y" { yyval.a_oid = asn1p_oid_new(); asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1399,7 +1404,7 @@ case 9: ; break;} case 10: -#line 375 "asn1p_y.y" +#line 376 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1408,74 +1413,74 @@ case 10: ; break;} case 11: -#line 384 "asn1p_y.y" +#line 385 "asn1p_y.y" { /* iso */ yyval.a_oid_arc.name = yyvsp[0].tv_str; yyval.a_oid_arc.number = -1; ; break;} case 12: -#line 388 "asn1p_y.y" +#line 389 "asn1p_y.y" { /* iso(1) */ yyval.a_oid_arc.name = yyvsp[-3].tv_str; yyval.a_oid_arc.number = yyvsp[-1].a_int; ; break;} case 13: -#line 392 "asn1p_y.y" +#line 393 "asn1p_y.y" { /* 1 */ yyval.a_oid_arc.name = 0; yyval.a_oid_arc.number = yyvsp[0].a_int; ; break;} case 14: -#line 402 "asn1p_y.y" +#line 403 "asn1p_y.y" { yyval.a_module_flags = MSF_NOFLAGS; ; break;} case 15: -#line 403 "asn1p_y.y" +#line 404 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; ; break;} case 16: -#line 412 "asn1p_y.y" +#line 413 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; ; break;} case 17: -#line 415 "asn1p_y.y" +#line 416 "asn1p_y.y" { yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags; ; break;} case 18: -#line 424 "asn1p_y.y" +#line 425 "asn1p_y.y" { yyval.a_module_flags = MSF_EXPLICIT_TAGS; ; break;} case 19: -#line 427 "asn1p_y.y" +#line 428 "asn1p_y.y" { yyval.a_module_flags = MSF_IMPLICIT_TAGS; ; break;} case 20: -#line 430 "asn1p_y.y" +#line 431 "asn1p_y.y" { yyval.a_module_flags = MSF_AUTOMATIC_TAGS; ; break;} case 21: -#line 433 "asn1p_y.y" +#line 434 "asn1p_y.y" { yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED; ; break;} case 22: -#line 437 "asn1p_y.y" +#line 438 "asn1p_y.y" { /* X.680Amd1 specifies TAG and XER */ if(strcmp(yyvsp[-1].tv_str, "TAG") == 0) { @@ -1493,23 +1498,23 @@ case 22: ; break;} case 23: -#line 458 "asn1p_y.y" +#line 459 "asn1p_y.y" { yyval.a_module = 0; ; break;} case 24: -#line 459 "asn1p_y.y" +#line 460 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 25: -#line 468 "asn1p_y.y" +#line 469 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 26: -#line 471 "asn1p_y.y" +#line 472 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; @@ -1539,13 +1544,13 @@ case 26: ; break;} case 27: -#line 504 "asn1p_y.y" +#line 505 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 28: -#line 507 "asn1p_y.y" +#line 508 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1557,7 +1562,7 @@ case 28: ; break;} case 29: -#line 516 "asn1p_y.y" +#line 517 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1567,7 +1572,7 @@ case 29: ; break;} case 30: -#line 523 "asn1p_y.y" +#line 524 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1577,7 +1582,7 @@ case 30: ; break;} case 31: -#line 536 "asn1p_y.y" +#line 537 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1587,11 +1592,11 @@ case 31: ; break;} case 32: -#line 544 "asn1p_y.y" +#line 545 "asn1p_y.y" { asn1p_lexer_hack_push_encoding_control(); ; break;} case 33: -#line 545 "asn1p_y.y" +#line 546 "asn1p_y.y" { fprintf(stderr, "WARNING: ENCODING-CONTROL %s " @@ -1602,7 +1607,7 @@ case 33: ; break;} case 34: -#line 557 "asn1p_y.y" +#line 558 "asn1p_y.y" { return yyerror( "Attempt to redefine a standard basic type, " @@ -1611,19 +1616,19 @@ case 34: ; break;} case 35: -#line 571 "asn1p_y.y" +#line 572 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; ; break;} case 36: -#line 577 "asn1p_y.y" +#line 578 "asn1p_y.y" { return yyerror("Empty IMPORTS list"); ; break;} case 37: -#line 583 "asn1p_y.y" +#line 584 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1631,14 +1636,14 @@ case 37: ; break;} case 38: -#line 588 "asn1p_y.y" +#line 589 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); ; break;} case 39: -#line 595 "asn1p_y.y" +#line 596 "asn1p_y.y" { yyval.a_xports = yyvsp[-3].a_xports; yyval.a_xports->from = yyvsp[-1].tv_str; @@ -1647,7 +1652,7 @@ case 39: ; break;} case 40: -#line 604 "asn1p_y.y" +#line 605 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); @@ -1655,14 +1660,14 @@ case 40: ; break;} case 41: -#line 609 "asn1p_y.y" +#line 610 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} case 42: -#line 616 "asn1p_y.y" +#line 617 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1671,7 +1676,7 @@ case 42: ; break;} case 43: -#line 622 "asn1p_y.y" +#line 623 "asn1p_y.y" { /* Completely equivalent to above */ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1680,7 +1685,7 @@ case 43: ; break;} case 44: -#line 628 "asn1p_y.y" +#line 629 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1689,19 +1694,19 @@ case 44: ; break;} case 45: -#line 637 "asn1p_y.y" +#line 638 "asn1p_y.y" { yyval.a_xports = yyvsp[-1].a_xports; ; break;} case 46: -#line 640 "asn1p_y.y" +#line 641 "asn1p_y.y" { yyval.a_xports = 0; ; break;} case 47: -#line 643 "asn1p_y.y" +#line 644 "asn1p_y.y" { /* Empty EXPORTS clause effectively prohibits export. */ yyval.a_xports = asn1p_xports_new(); @@ -1709,7 +1714,7 @@ case 47: ; break;} case 48: -#line 651 "asn1p_y.y" +#line 652 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); assert(yyval.a_xports); @@ -1717,14 +1722,14 @@ case 48: ; break;} case 49: -#line 656 "asn1p_y.y" +#line 657 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} case 50: -#line 663 "asn1p_y.y" +#line 664 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1733,7 +1738,7 @@ case 50: ; break;} case 51: -#line 669 "asn1p_y.y" +#line 670 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1742,7 +1747,7 @@ case 51: ; break;} case 52: -#line 675 "asn1p_y.y" +#line 676 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1751,7 +1756,7 @@ case 52: ; break;} case 53: -#line 685 "asn1p_y.y" +#line 686 "asn1p_y.y" { yyval.a_expr = yyvsp[-4].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1761,7 +1766,7 @@ case 53: ; break;} case 54: -#line 695 "asn1p_y.y" +#line 696 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1771,7 +1776,7 @@ case 54: ; break;} case 55: -#line 702 "asn1p_y.y" +#line 703 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1780,36 +1785,36 @@ case 55: ; break;} case 56: -#line 711 "asn1p_y.y" +#line 712 "asn1p_y.y" { ; break;} case 57: -#line 712 "asn1p_y.y" +#line 713 "asn1p_y.y" { ; break;} case 58: -#line 723 "asn1p_y.y" +#line 724 "asn1p_y.y" { ; break;} case 59: -#line 725 "asn1p_y.y" +#line 726 "asn1p_y.y" { ; break;} case 60: -#line 730 "asn1p_y.y" +#line 731 "asn1p_y.y" { ; break;} case 61: -#line 732 "asn1p_y.y" +#line 733 "asn1p_y.y" { ; break;} case 62: -#line 748 "asn1p_y.y" +#line 749 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1820,7 +1825,7 @@ case 62: ; break;} case 63: -#line 756 "asn1p_y.y" +#line 757 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -1829,7 +1834,7 @@ case 63: ; break;} case 64: -#line 762 "asn1p_y.y" +#line 763 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -1838,7 +1843,7 @@ case 64: ; break;} case 65: -#line 778 "asn1p_y.y" +#line 779 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1848,7 +1853,7 @@ case 65: ; break;} case 66: -#line 788 "asn1p_y.y" +#line 789 "asn1p_y.y" { int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); @@ -1860,7 +1865,7 @@ case 66: ; break;} case 67: -#line 797 "asn1p_y.y" +#line 798 "asn1p_y.y" { int ret; yyval.a_plist = yyvsp[-2].a_plist; @@ -1871,14 +1876,14 @@ case 67: ; break;} case 68: -#line 808 "asn1p_y.y" +#line 809 "asn1p_y.y" { yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} case 69: -#line 812 "asn1p_y.y" +#line 813 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1888,7 +1893,7 @@ case 69: ; break;} case 70: -#line 819 "asn1p_y.y" +#line 820 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1898,7 +1903,7 @@ case 70: ; break;} case 71: -#line 826 "asn1p_y.y" +#line 827 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1909,7 +1914,7 @@ case 71: ; break;} case 72: -#line 837 "asn1p_y.y" +#line 838 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1917,20 +1922,20 @@ case 72: ; break;} case 73: -#line 842 "asn1p_y.y" +#line 843 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 74: -#line 849 "asn1p_y.y" +#line 850 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 75: -#line 852 "asn1p_y.y" +#line 853 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1940,15 +1945,15 @@ case 75: ; break;} case 76: -#line 876 "asn1p_y.y" +#line 877 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); ; break;} case 77: -#line 877 "asn1p_y.y" +#line 878 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 78: -#line 880 "asn1p_y.y" +#line 881 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1956,14 +1961,14 @@ case 78: ; break;} case 79: -#line 885 "asn1p_y.y" +#line 886 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 80: -#line 892 "asn1p_y.y" +#line 893 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1972,7 +1977,7 @@ case 80: ; break;} case 81: -#line 898 "asn1p_y.y" +#line 899 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1982,13 +1987,13 @@ case 81: ; break;} case 82: -#line 905 "asn1p_y.y" +#line 906 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 83: -#line 911 "asn1p_y.y" +#line 912 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1996,14 +2001,14 @@ case 83: ; break;} case 84: -#line 916 "asn1p_y.y" +#line 917 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 85: -#line 923 "asn1p_y.y" +#line 924 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -2011,13 +2016,13 @@ case 85: ; break;} case 86: -#line 928 "asn1p_y.y" +#line 929 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 87: -#line 934 "asn1p_y.y" +#line 935 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); @@ -2027,15 +2032,15 @@ case 87: ; break;} case 88: -#line 944 "asn1p_y.y" +#line 945 "asn1p_y.y" { yyval.a_int = 0; ; break;} case 89: -#line 945 "asn1p_y.y" +#line 946 "asn1p_y.y" { yyval.a_int = 1; ; break;} case 90: -#line 949 "asn1p_y.y" +#line 950 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2045,14 +2050,14 @@ case 90: ; break;} case 91: -#line 956 "asn1p_y.y" +#line 957 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 92: -#line 963 "asn1p_y.y" +#line 964 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2063,7 +2068,7 @@ case 92: ; break;} case 93: -#line 971 "asn1p_y.y" +#line 972 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; yyval.a_expr->Identifier = yyvsp[-3].a_refcomp.name; @@ -2072,7 +2077,7 @@ case 93: ; break;} case 94: -#line 977 "asn1p_y.y" +#line 978 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2090,47 +2095,47 @@ case 94: ; break;} case 95: -#line 995 "asn1p_y.y" +#line 996 "asn1p_y.y" { yyval.a_wsynt = 0; ; break;} case 96: -#line 996 "asn1p_y.y" +#line 997 "asn1p_y.y" { yyval.a_wsynt = yyvsp[0].a_wsynt; ; break;} case 97: -#line 1003 "asn1p_y.y" +#line 1004 "asn1p_y.y" { asn1p_lexer_hack_enable_with_syntax(); ; break;} case 98: -#line 1005 "asn1p_y.y" +#line 1006 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; ; break;} case 99: -#line 1011 "asn1p_y.y" +#line 1012 "asn1p_y.y" { yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} case 100: -#line 1015 "asn1p_y.y" +#line 1016 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} case 101: -#line 1022 "asn1p_y.y" +#line 1023 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); ; break;} case 102: -#line 1025 "asn1p_y.y" +#line 1026 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2142,7 +2147,7 @@ case 102: ; break;} case 103: -#line 1037 "asn1p_y.y" +#line 1038 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2153,7 +2158,7 @@ case 103: ; break;} case 104: -#line 1045 "asn1p_y.y" +#line 1046 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2165,7 +2170,7 @@ case 104: ; break;} case 105: -#line 1054 "asn1p_y.y" +#line 1055 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2177,7 +2182,7 @@ case 105: ; break;} case 106: -#line 1066 "asn1p_y.y" +#line 1067 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; yyval.a_expr->tag = yyvsp[-2].a_tag; @@ -2199,13 +2204,13 @@ case 106: ; break;} case 107: -#line 1088 "asn1p_y.y" +#line 1089 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 108: -#line 1091 "asn1p_y.y" +#line 1092 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2214,7 +2219,7 @@ case 108: ; break;} case 109: -#line 1097 "asn1p_y.y" +#line 1098 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2223,7 +2228,7 @@ case 109: ; break;} case 110: -#line 1103 "asn1p_y.y" +#line 1104 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2232,7 +2237,7 @@ case 110: ; break;} case 111: -#line 1109 "asn1p_y.y" +#line 1110 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2245,7 +2250,7 @@ case 111: ; break;} case 112: -#line 1119 "asn1p_y.y" +#line 1120 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2258,7 +2263,7 @@ case 112: ; break;} case 113: -#line 1129 "asn1p_y.y" +#line 1130 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2267,7 +2272,7 @@ case 113: ; break;} case 114: -#line 1135 "asn1p_y.y" +#line 1136 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2281,7 +2286,7 @@ case 114: ; break;} case 115: -#line 1149 "asn1p_y.y" +#line 1150 "asn1p_y.y" { int ret; yyval.a_expr = yyvsp[-1].a_expr; @@ -2298,7 +2303,7 @@ case 115: ; break;} case 116: -#line 1173 "asn1p_y.y" +#line 1174 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2308,7 +2313,7 @@ case 116: ; break;} case 117: -#line 1180 "asn1p_y.y" +#line 1181 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2318,7 +2323,7 @@ case 117: ; break;} case 118: -#line 1195 "asn1p_y.y" +#line 1196 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2329,7 +2334,7 @@ case 118: ; break;} case 119: -#line 1203 "asn1p_y.y" +#line 1204 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2342,7 +2347,7 @@ case 119: ; break;} case 120: -#line 1213 "asn1p_y.y" +#line 1214 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2355,7 +2360,7 @@ case 120: ; break;} case 121: -#line 1223 "asn1p_y.y" +#line 1224 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2368,7 +2373,7 @@ case 121: ; break;} case 122: -#line 1233 "asn1p_y.y" +#line 1234 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2379,7 +2384,7 @@ case 122: ; break;} case 123: -#line 1241 "asn1p_y.y" +#line 1242 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[0].a_ref; @@ -2401,7 +2406,7 @@ case 123: ; break;} case 124: -#line 1263 "asn1p_y.y" +#line 1264 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2412,7 +2417,7 @@ case 124: ; break;} case 125: -#line 1271 "asn1p_y.y" +#line 1272 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[-2].a_ref; @@ -2422,21 +2427,21 @@ case 125: ; break;} case 128: -#line 1285 "asn1p_y.y" +#line 1286 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} case 129: -#line 1290 "asn1p_y.y" +#line 1291 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} case 130: -#line 1303 "asn1p_y.y" +#line 1304 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); @@ -2446,7 +2451,7 @@ case 130: ; break;} case 131: -#line 1313 "asn1p_y.y" +#line 1314 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2456,11 +2461,11 @@ case 131: ; break;} case 132: -#line 1320 "asn1p_y.y" +#line 1321 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} case 133: -#line 1320 "asn1p_y.y" +#line 1321 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); @@ -2468,7 +2473,7 @@ case 133: ; break;} case 134: -#line 1325 "asn1p_y.y" +#line 1326 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2476,7 +2481,7 @@ case 134: ; break;} case 135: -#line 1330 "asn1p_y.y" +#line 1331 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2484,7 +2489,7 @@ case 135: ; break;} case 136: -#line 1335 "asn1p_y.y" +#line 1336 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2492,40 +2497,40 @@ case 136: ; break;} case 137: -#line 1340 "asn1p_y.y" +#line 1341 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); ; break;} case 138: -#line 1344 "asn1p_y.y" +#line 1345 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); ; break;} case 139: -#line 1348 "asn1p_y.y" +#line 1349 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} case 140: -#line 1352 "asn1p_y.y" +#line 1353 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 141: -#line 1355 "asn1p_y.y" +#line 1356 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 142: -#line 1361 "asn1p_y.y" +#line 1362 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2539,7 +2544,7 @@ case 142: ; break;} case 143: -#line 1372 "asn1p_y.y" +#line 1373 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2556,7 +2561,7 @@ case 143: ; break;} case 144: -#line 1389 "asn1p_y.y" +#line 1390 "asn1p_y.y" { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 2; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); @@ -2569,7 +2574,7 @@ case 144: ; break;} case 145: -#line 1399 "asn1p_y.y" +#line 1400 "asn1p_y.y" { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); @@ -2584,71 +2589,71 @@ case 145: ; break;} case 146: -#line 1414 "asn1p_y.y" +#line 1415 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BOOLEAN; ; break;} case 147: -#line 1415 "asn1p_y.y" +#line 1416 "asn1p_y.y" { yyval.a_type = ASN_BASIC_NULL; ; break;} case 148: -#line 1416 "asn1p_y.y" +#line 1417 "asn1p_y.y" { yyval.a_type = ASN_BASIC_REAL; ; break;} case 149: -#line 1417 "asn1p_y.y" +#line 1418 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} case 150: -#line 1418 "asn1p_y.y" +#line 1419 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OCTET_STRING; ; break;} case 151: -#line 1419 "asn1p_y.y" +#line 1420 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; break;} case 152: -#line 1420 "asn1p_y.y" +#line 1421 "asn1p_y.y" { yyval.a_type = ASN_BASIC_RELATIVE_OID; ; break;} case 153: -#line 1421 "asn1p_y.y" +#line 1422 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EXTERNAL; ; break;} case 154: -#line 1422 "asn1p_y.y" +#line 1423 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; break;} case 155: -#line 1423 "asn1p_y.y" +#line 1424 "asn1p_y.y" { yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; break;} case 156: -#line 1424 "asn1p_y.y" +#line 1425 "asn1p_y.y" { yyval.a_type = ASN_BASIC_UTCTime; ; break;} case 157: -#line 1425 "asn1p_y.y" +#line 1426 "asn1p_y.y" { yyval.a_type = ASN_BASIC_GeneralizedTime; ; break;} case 158: -#line 1426 "asn1p_y.y" +#line 1427 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} case 159: -#line 1433 "asn1p_y.y" +#line 1434 "asn1p_y.y" { yyval.a_type = ASN_BASIC_INTEGER; ; break;} case 160: -#line 1434 "asn1p_y.y" +#line 1435 "asn1p_y.y" { yyval.a_type = ASN_BASIC_ENUMERATED; ; break;} case 161: -#line 1435 "asn1p_y.y" +#line 1436 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BIT_STRING; ; break;} case 162: -#line 1439 "asn1p_y.y" +#line 1440 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2657,7 +2662,7 @@ case 162: ; break;} case 163: -#line 1445 "asn1p_y.y" +#line 1446 "asn1p_y.y" { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; @@ -2670,91 +2675,91 @@ case 163: ; break;} case 164: -#line 1458 "asn1p_y.y" +#line 1459 "asn1p_y.y" { yyval.a_type = ASN_STRING_BMPString; ; break;} case 165: -#line 1459 "asn1p_y.y" +#line 1460 "asn1p_y.y" { yyval.a_type = ASN_STRING_GeneralString; fprintf(stderr, "WARNING: GeneralString is not fully supported\n"); ; break;} case 166: -#line 1463 "asn1p_y.y" +#line 1464 "asn1p_y.y" { yyval.a_type = ASN_STRING_GraphicString; fprintf(stderr, "WARNING: GraphicString is not fully supported\n"); ; break;} case 167: -#line 1467 "asn1p_y.y" +#line 1468 "asn1p_y.y" { yyval.a_type = ASN_STRING_IA5String; ; break;} case 168: -#line 1468 "asn1p_y.y" +#line 1469 "asn1p_y.y" { yyval.a_type = ASN_STRING_ISO646String; ; break;} case 169: -#line 1469 "asn1p_y.y" +#line 1470 "asn1p_y.y" { yyval.a_type = ASN_STRING_NumericString; ; break;} case 170: -#line 1470 "asn1p_y.y" +#line 1471 "asn1p_y.y" { yyval.a_type = ASN_STRING_PrintableString; ; break;} case 171: -#line 1471 "asn1p_y.y" +#line 1472 "asn1p_y.y" { yyval.a_type = ASN_STRING_T61String; fprintf(stderr, "WARNING: T61String is not fully supported\n"); ; break;} case 172: -#line 1475 "asn1p_y.y" +#line 1476 "asn1p_y.y" { yyval.a_type = ASN_STRING_TeletexString; ; break;} case 173: -#line 1476 "asn1p_y.y" +#line 1477 "asn1p_y.y" { yyval.a_type = ASN_STRING_UniversalString; ; break;} case 174: -#line 1477 "asn1p_y.y" +#line 1478 "asn1p_y.y" { yyval.a_type = ASN_STRING_UTF8String; ; break;} case 175: -#line 1478 "asn1p_y.y" +#line 1479 "asn1p_y.y" { yyval.a_type = ASN_STRING_VideotexString; fprintf(stderr, "WARNING: VideotexString is not fully supported\n"); ; break;} case 176: -#line 1482 "asn1p_y.y" +#line 1483 "asn1p_y.y" { yyval.a_type = ASN_STRING_VisibleString; ; break;} case 177: -#line 1483 "asn1p_y.y" +#line 1484 "asn1p_y.y" { yyval.a_type = ASN_STRING_ObjectDescriptor; ; break;} case 183: -#line 1495 "asn1p_y.y" +#line 1496 "asn1p_y.y" { yyval.a_constr = 0; ; break;} case 184: -#line 1496 "asn1p_y.y" +#line 1497 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 185: -#line 1502 "asn1p_y.y" +#line 1503 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); ; break;} case 186: -#line 1505 "asn1p_y.y" +#line 1506 "asn1p_y.y" { /* * This is a special case, for compatibility purposes. @@ -2764,25 +2769,25 @@ case 186: ; break;} case 187: -#line 1515 "asn1p_y.y" +#line 1516 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; ; break;} case 188: -#line 1518 "asn1p_y.y" +#line 1519 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} case 189: -#line 1524 "asn1p_y.y" +#line 1525 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 190: -#line 1527 "asn1p_y.y" +#line 1528 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2791,7 +2796,7 @@ case 190: ; break;} case 191: -#line 1533 "asn1p_y.y" +#line 1534 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2802,31 +2807,31 @@ case 191: ; break;} case 192: -#line 1544 "asn1p_y.y" +#line 1545 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 193: -#line 1547 "asn1p_y.y" +#line 1548 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 194: -#line 1550 "asn1p_y.y" +#line 1551 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 195: -#line 1553 "asn1p_y.y" +#line 1554 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 196: -#line 1559 "asn1p_y.y" +#line 1560 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2837,7 +2842,7 @@ case 196: ; break;} case 197: -#line 1567 "asn1p_y.y" +#line 1568 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2848,7 +2853,7 @@ case 197: ; break;} case 198: -#line 1575 "asn1p_y.y" +#line 1576 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2857,7 +2862,16 @@ case 198: ; break;} case 199: -#line 1581 "asn1p_y.y" +#line 1582 "asn1p_y.y" +{ + yyval.a_constr = asn1p_constraint_new(yylineno); + checkmem(yyval.a_constr); + yyval.a_constr->type = ACT_EL_TYPE; + yyval.a_constr->containedSubtype = yyvsp[0].a_value; + ; + break;} +case 200: +#line 1588 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2866,8 +2880,8 @@ case 199: yyval.a_constr->range_stop = yyvsp[0].a_value; ; break;} -case 200: -#line 1588 "asn1p_y.y" +case 201: +#line 1595 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2877,8 +2891,8 @@ case 200: yyval.a_constr->range_start->type = ATV_MIN; ; break;} -case 201: -#line 1596 "asn1p_y.y" +case 202: +#line 1603 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2888,8 +2902,8 @@ case 201: yyval.a_constr->range_stop->type = ATV_MAX; ; break;} -case 202: -#line 1604 "asn1p_y.y" +case 203: +#line 1611 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2900,77 +2914,77 @@ case 202: yyval.a_constr->range_stop->type = ATV_MAX; ; break;} -case 203: -#line 1613 "asn1p_y.y" +case 204: +#line 1620 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 204: -#line 1616 "asn1p_y.y" +case 205: +#line 1623 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 205: -#line 1622 "asn1p_y.y" +case 206: +#line 1629 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RANGE; ; break;} -case 206: -#line 1623 "asn1p_y.y" +case 207: +#line 1630 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RLRANGE; ; break;} -case 207: -#line 1624 "asn1p_y.y" +case 208: +#line 1631 "asn1p_y.y" { yyval.a_ctype = ACT_EL_LLRANGE; ; break;} -case 208: -#line 1625 "asn1p_y.y" +case 209: +#line 1632 "asn1p_y.y" { yyval.a_ctype = ACT_EL_ULRANGE; ; break;} -case 209: -#line 1629 "asn1p_y.y" +case 210: +#line 1636 "asn1p_y.y" { yyval.a_ctype = ACT_CT_SIZE; ; break;} -case 210: -#line 1632 "asn1p_y.y" +case 211: +#line 1639 "asn1p_y.y" { yyval.a_ctype = ACT_CT_FROM; ; break;} -case 211: -#line 1638 "asn1p_y.y" +case 212: +#line 1645 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_FALSE; ; break;} -case 212: -#line 1643 "asn1p_y.y" +case 213: +#line 1650 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); yyval.a_value->type = ATV_TRUE; ; break;} -case 213: -#line 1648 "asn1p_y.y" +case 214: +#line 1655 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 214: -#line 1651 "asn1p_y.y" +case 215: +#line 1658 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} -case 215: -#line 1655 "asn1p_y.y" +case 216: +#line 1662 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2983,8 +2997,8 @@ case 215: free(yyvsp[0].tv_str); ; break;} -case 216: -#line 1666 "asn1p_y.y" +case 217: +#line 1676 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2997,34 +3011,34 @@ case 216: free(yyvsp[0].tv_str); ; break;} -case 217: -#line 1680 "asn1p_y.y" +case 218: +#line 1690 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); ; break;} -case 218: -#line 1686 "asn1p_y.y" +case 219: +#line 1696 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 219: -#line 1689 "asn1p_y.y" +case 220: +#line 1699 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 220: -#line 1695 "asn1p_y.y" +case 221: +#line 1705 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_EXT; ; break;} -case 221: -#line 1700 "asn1p_y.y" +case 222: +#line 1710 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3033,46 +3047,46 @@ case 221: yyval.a_constr->presence = yyvsp[0].a_pres; ; break;} -case 222: -#line 1713 "asn1p_y.y" +case 223: +#line 1723 "asn1p_y.y" { yyval.a_pres = ACPRES_DEFAULT; ; break;} -case 223: -#line 1714 "asn1p_y.y" +case 224: +#line 1724 "asn1p_y.y" { yyval.a_pres = yyvsp[0].a_pres; ; break;} -case 224: -#line 1718 "asn1p_y.y" +case 225: +#line 1728 "asn1p_y.y" { yyval.a_pres = ACPRES_PRESENT; ; break;} -case 225: -#line 1721 "asn1p_y.y" +case 226: +#line 1731 "asn1p_y.y" { yyval.a_pres = ACPRES_ABSENT; ; break;} -case 226: -#line 1724 "asn1p_y.y" +case 227: +#line 1734 "asn1p_y.y" { yyval.a_pres = ACPRES_OPTIONAL; ; break;} -case 227: -#line 1730 "asn1p_y.y" +case 228: +#line 1740 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 228: -#line 1733 "asn1p_y.y" +case 229: +#line 1743 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 229: -#line 1742 "asn1p_y.y" +case 230: +#line 1752 "asn1p_y.y" { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; @@ -3086,14 +3100,14 @@ case 229: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, ct, 0); ; break;} -case 230: -#line 1757 "asn1p_y.y" +case 231: +#line 1767 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} -case 231: -#line 1763 "asn1p_y.y" +case 232: +#line 1773 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3101,8 +3115,8 @@ case 231: yyval.a_constr->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); ; break;} -case 232: -#line 1769 "asn1p_y.y" +case 233: +#line 1779 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3112,8 +3126,8 @@ case 232: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); ; break;} -case 233: -#line 1783 "asn1p_y.y" +case 234: +#line 1793 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; @@ -3126,8 +3140,8 @@ case 233: free(yyvsp[0].tv_str); ; break;} -case 234: -#line 1794 "asn1p_y.y" +case 235: +#line 1804 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; @@ -3141,14 +3155,14 @@ case 234: free(yyvsp[0].tv_str); ; break;} -case 235: -#line 1810 "asn1p_y.y" +case 236: +#line 1820 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 236: -#line 1813 "asn1p_y.y" +case 237: +#line 1823 "asn1p_y.y" { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); @@ -3159,61 +3173,61 @@ case 236: yyval.tv_str[l1 + 1 + l3] = '\0'; ; break;} -case 237: -#line 1831 "asn1p_y.y" +case 238: +#line 1841 "asn1p_y.y" { yyval.a_marker.flags = EM_NOMARK; yyval.a_marker.default_value = 0; ; break;} -case 238: -#line 1835 "asn1p_y.y" +case 239: +#line 1845 "asn1p_y.y" { yyval.a_marker = yyvsp[0].a_marker; ; break;} -case 239: -#line 1839 "asn1p_y.y" +case 240: +#line 1849 "asn1p_y.y" { yyval.a_marker.flags = EM_OPTIONAL; yyval.a_marker.default_value = 0; ; break;} -case 240: -#line 1843 "asn1p_y.y" +case 241: +#line 1853 "asn1p_y.y" { yyval.a_marker.flags = EM_DEFAULT; yyval.a_marker.default_value = yyvsp[0].a_value; ; break;} -case 241: -#line 1866 "asn1p_y.y" +case 242: +#line 1876 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); ; break;} -case 242: -#line 1870 "asn1p_y.y" +case 243: +#line 1880 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; ; break;} -case 243: -#line 1876 "asn1p_y.y" +case 244: +#line 1886 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 244: -#line 1881 "asn1p_y.y" +case 245: +#line 1891 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 245: -#line 1888 "asn1p_y.y" +case 246: +#line 1898 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3222,8 +3236,8 @@ case 245: yyval.a_expr->Identifier = yyvsp[0].tv_str; ; break;} -case 246: -#line 1895 "asn1p_y.y" +case 247: +#line 1905 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3233,8 +3247,8 @@ case 246: yyval.a_expr->value = yyvsp[-1].a_value; ; break;} -case 247: -#line 1903 "asn1p_y.y" +case 248: +#line 1913 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3244,8 +3258,8 @@ case 247: yyval.a_expr->value = yyvsp[-1].a_value; ; break;} -case 248: -#line 1911 "asn1p_y.y" +case 249: +#line 1921 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3254,8 +3268,8 @@ case 248: yyval.a_expr->value = yyvsp[0].a_value; ; break;} -case 249: -#line 1918 "asn1p_y.y" +case 250: +#line 1928 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3265,103 +3279,103 @@ case 249: yyval.a_expr->meta_type = AMT_VALUE; ; break;} -case 250: -#line 1929 "asn1p_y.y" +case 251: +#line 1939 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} -case 251: -#line 1933 "asn1p_y.y" +case 252: +#line 1943 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} -case 252: -#line 1964 "asn1p_y.y" +case 253: +#line 1974 "asn1p_y.y" { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; break;} -case 253: -#line 1965 "asn1p_y.y" +case 254: +#line 1975 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; ; break;} -case 254: -#line 1969 "asn1p_y.y" +case 255: +#line 1979 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = yyvsp[0].a_tag.tag_mode; ; break;} -case 255: -#line 1976 "asn1p_y.y" +case 256: +#line 1986 "asn1p_y.y" { yyval.a_tag = yyvsp[-2].a_tag; yyval.a_tag.tag_value = yyvsp[-1].a_int; ; break;} -case 256: -#line 1982 "asn1p_y.y" +case 257: +#line 1992 "asn1p_y.y" { yyval.a_tag.tag_class = TC_CONTEXT_SPECIFIC; ; break;} -case 257: -#line 1983 "asn1p_y.y" +case 258: +#line 1993 "asn1p_y.y" { yyval.a_tag.tag_class = TC_UNIVERSAL; ; break;} -case 258: -#line 1984 "asn1p_y.y" +case 259: +#line 1994 "asn1p_y.y" { yyval.a_tag.tag_class = TC_APPLICATION; ; break;} -case 259: -#line 1985 "asn1p_y.y" +case 260: +#line 1995 "asn1p_y.y" { yyval.a_tag.tag_class = TC_PRIVATE; ; break;} -case 260: -#line 1989 "asn1p_y.y" +case 261: +#line 1999 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_DEFAULT; ; break;} -case 261: -#line 1990 "asn1p_y.y" +case 262: +#line 2000 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_IMPLICIT; ; break;} -case 262: -#line 1991 "asn1p_y.y" +case 263: +#line 2001 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_EXPLICIT; ; break;} -case 263: -#line 1995 "asn1p_y.y" +case 264: +#line 2005 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 264: -#line 1999 "asn1p_y.y" +case 265: +#line 2009 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 265: -#line 2007 "asn1p_y.y" +case 266: +#line 2017 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 266: -#line 2014 "asn1p_y.y" +case 267: +#line 2024 "asn1p_y.y" { yyval.tv_str = 0; ; break;} -case 267: -#line 2015 "asn1p_y.y" +case 268: +#line 2025 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 268: -#line 2020 "asn1p_y.y" +case 269: +#line 2030 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; @@ -3589,7 +3603,7 @@ case 268: } return 1; } -#line 2026 "asn1p_y.y" +#line 2036 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index 9ae5017f2..b3796675b 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -282,7 +282,8 @@ static asn1p_value_t * %type ComponentRelationConstraint %type AtNotationList %type AtNotationElement -%type ConstraintValue +%type SingleValue +%type ContainedSubtype %type ConstraintSpec %type ConstraintRangeSpec %type optWithSyntax @@ -1572,20 +1573,26 @@ ConstraintSubtypeElement: ret = asn1p_constraint_insert($$, $2); checkmem(ret == 0); } - | ConstraintValue { + | SingleValue { $$ = asn1p_constraint_new(yylineno); checkmem($$); $$->type = ACT_EL_VALUE; $$->value = $1; } - | ConstraintValue ConstraintRangeSpec ConstraintValue { + | ContainedSubtype { + $$ = asn1p_constraint_new(yylineno); + checkmem($$); + $$->type = ACT_EL_TYPE; + $$->containedSubtype = $1; + } + | SingleValue ConstraintRangeSpec SingleValue { $$ = asn1p_constraint_new(yylineno); checkmem($$); $$->type = $2; $$->range_start = $1; $$->range_stop = $3; } - | TOK_MIN ConstraintRangeSpec ConstraintValue { + | TOK_MIN ConstraintRangeSpec SingleValue { $$ = asn1p_constraint_new(yylineno); checkmem($$); $$->type = $2; @@ -1593,7 +1600,7 @@ ConstraintSubtypeElement: $$->range_stop = $3; $$->range_start->type = ATV_MIN; } - | ConstraintValue ConstraintRangeSpec TOK_MAX { + | SingleValue ConstraintRangeSpec TOK_MAX { $$ = asn1p_constraint_new(yylineno); checkmem($$); $$->type = $2; @@ -1634,7 +1641,7 @@ ConstraintSpec: } ; -ConstraintValue: +SingleValue: TOK_FALSE { $$ = asn1p_value_fromint(0); checkmem($$); @@ -1663,7 +1670,10 @@ ConstraintValue: checkmem($$); free($1); } - | TypeRefName { + ; + +ContainedSubtype: + TypeRefName { asn1p_ref_t *ref; int ret; ref = asn1p_ref_new(yylineno); diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index abef0b5ec..0cb730416 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -284,6 +284,9 @@ asn1print_constraint(asn1p_constraint_t *ct, enum asn1print_flags flags) { printf("("); switch(ct->type) { + case ACT_EL_TYPE: + asn1print_value(ct->value, flags); + break; case ACT_EL_VALUE: asn1print_value(ct->value, flags); break; diff --git a/tests/16-constraint-OK.asn1 b/tests/16-constraint-OK.asn1 index 5625d7fd7..50ee2e2c6 100644 --- a/tests/16-constraint-OK.asn1 +++ b/tests/16-constraint-OK.asn1 @@ -12,11 +12,15 @@ ModuleTestConstraint BEGIN -- external reference - Type1 ::= IA5String (SIZE(1..10,...))(FROM("a".."z"|"#")) + Type0 ::= IA5String (Type6) + Type1 ::= IA5String (SIZE(1..ten,...))(FROM("a".."z"|"#",...)) Type2 ::= IA5String (SIZE (MIN..4)|FROM ("abc")) Type3 ::= BMPString (SIZE(1)) Type4 ::= INTEGER (1..MAX) Type5 ::= BOOLEAN (TRUE|FALSE) + Type6 ::= IA5String (Type1) + + ten INTEGER ::= 10 v1 Type1 ::= "#value wi th ""double quotes""" diff --git a/tests/16-constraint-OK.asn1.-EF b/tests/16-constraint-OK.asn1.-EF index 9fae28c7e..305fc3e65 100644 --- a/tests/16-constraint-OK.asn1.-EF +++ b/tests/16-constraint-OK.asn1.-EF @@ -3,7 +3,9 @@ ModuleTestConstraint { iso org(3) dod(6) internet(1) private(4) enterprise(1) DEFINITIONS ::= BEGIN -Type1 ::= IA5String (SIZE(1..10,...))(FROM("a".."z" | "#")) +Type0 ::= IA5String (((SIZE(1..10))(FROM("a".."z" | "#")))) + +Type1 ::= IA5String (SIZE(1..10,...))(FROM("a".."z" | "#",...)) Type2 ::= IA5String (SIZE(MIN..4) | FROM("abc")) @@ -13,6 +15,10 @@ Type4 ::= INTEGER (1..MAX) Type5 ::= BOOLEAN (TRUE | FALSE) +Type6 ::= IA5String ((SIZE(1..10))(FROM("a".."z" | "#"))) + +ten INTEGER ::= 10 + v1 Type1 ::= "#value with ""double quotes""" END diff --git a/tests/16-constraint-OK.asn1.-EFprint-constraints b/tests/16-constraint-OK.asn1.-EFprint-constraints new file mode 100644 index 0000000000000000000000000000000000000000..f5f0ddfb79724d21ed342d8ce7615340896a17be GIT binary patch literal 2141 zcmb_dO>f#j5bd@86{F>{D;0|kV5vwwkYp2CiVXrPRlON|n_6;hYA-}>Q}vfu%6>Q@ zruGJ+a$|Sq`OTX*vq6z;Grr=LxG3^Ulu?=s_yuWIKvCY}A%Ubwutz|i^D^fGQv#bZ z-9>`q5dp4_<^PJy3+HXM;aOVX_d`!+R>c=_7nSM;qAI5`9upAqQ|f?v@Y}g$SAOWP z{8_k!$>f7`&aVB?aaKPze4q}%pN^NJO!Hg77%%vw;^D>G>8b{f41i+dWkw}3bx^6K2M4-V5YEnJTr>15o z&Do;AORIF9@&ALVHKKSS7@u)npo*20cQ(lw1tU&9rQDd$ zXC-|Qu9=OE+OydWn}%|SEIu;jv+2!}+4%hvXJI*3ETxC!R(+XcBUm%^4rijV)H)We zMcQN2EfsmKJ~EsC(MzXp+1Fq?g6H7Zu2Sz29cUA@Pk;<=^0s%QCEVFjP_K+x?5MYk rvMq Date: Sun, 20 Mar 2005 13:12:58 +0000 Subject: [PATCH 0823/1469] modules split git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@823 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/16-constraint-OK.asn1 | 20 ++++++++++++++---- tests/16-constraint-OK.asn1.-EF | 15 +++++++++---- ...16-constraint-OK.asn1.-EFprint-constraints | Bin 2141 -> 2301 bytes 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/tests/16-constraint-OK.asn1 b/tests/16-constraint-OK.asn1 index 50ee2e2c6..00ade3791 100644 --- a/tests/16-constraint-OK.asn1 +++ b/tests/16-constraint-OK.asn1 @@ -3,22 +3,34 @@ -- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) -- .spelio.software.asn1c.test (9363.1.5.1) --- .16 +-- .16 1 +-- .16 2 -ModuleTestConstraint +ModuleTestConstraint1 { iso org(3) dod(6) internet(1) private(4) enterprise(1) - spelio(9363) software(1) asn1c(5) test(1) 16 } + spelio(9363) software(1) asn1c(5) test(1) 16 1 } DEFINITIONS ::= BEGIN + IMPORTS Type1 FROM ModuleTestConstraint2; -- external reference Type0 ::= IA5String (Type6) + Type6 ::= IA5String (Type1) +END + +ModuleTestConstraint2 + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 16 2 } + DEFINITIONS ::= +BEGIN + EXPORTS Type1; + + -- external reference Type1 ::= IA5String (SIZE(1..ten,...))(FROM("a".."z"|"#",...)) Type2 ::= IA5String (SIZE (MIN..4)|FROM ("abc")) Type3 ::= BMPString (SIZE(1)) Type4 ::= INTEGER (1..MAX) Type5 ::= BOOLEAN (TRUE|FALSE) - Type6 ::= IA5String (Type1) ten INTEGER ::= 10 diff --git a/tests/16-constraint-OK.asn1.-EF b/tests/16-constraint-OK.asn1.-EF index 305fc3e65..a1f8e851b 100644 --- a/tests/16-constraint-OK.asn1.-EF +++ b/tests/16-constraint-OK.asn1.-EF @@ -1,10 +1,19 @@ -ModuleTestConstraint { iso org(3) dod(6) internet(1) private(4) enterprise(1) - spelio(9363) software(1) asn1c(5) test(1) 16 } +ModuleTestConstraint1 { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 16 1 } DEFINITIONS ::= BEGIN Type0 ::= IA5String (((SIZE(1..10))(FROM("a".."z" | "#")))) +Type6 ::= IA5String ((SIZE(1..10))(FROM("a".."z" | "#"))) + +END + +ModuleTestConstraint2 { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 16 2 } +DEFINITIONS ::= +BEGIN + Type1 ::= IA5String (SIZE(1..10,...))(FROM("a".."z" | "#",...)) Type2 ::= IA5String (SIZE(MIN..4) | FROM("abc")) @@ -15,8 +24,6 @@ Type4 ::= INTEGER (1..MAX) Type5 ::= BOOLEAN (TRUE | FALSE) -Type6 ::= IA5String ((SIZE(1..10))(FROM("a".."z" | "#"))) - ten INTEGER ::= 10 v1 Type1 ::= "#value with ""double quotes""" diff --git a/tests/16-constraint-OK.asn1.-EFprint-constraints b/tests/16-constraint-OK.asn1.-EFprint-constraints index f5f0ddfb79724d21ed342d8ce7615340896a17be..3806e1959d72a5e8d3f028be0293a99a5ed64972 100644 GIT binary patch delta 60 zcmcaB@K5BmTB delta 43 zcmV+`0M!5e5#11w6qEJ>Xp>+A9kHAw0Rb_Sumly8*aIoEyaNLSv%CQy0kgjcJ^^T< B4*viE From 2fb3f753f561841a70640c274c75151bdb796848 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 20 Mar 2005 13:17:48 +0000 Subject: [PATCH 0824/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@824 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_retrieve.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libasn1fix/asn1fix_retrieve.c b/libasn1fix/asn1fix_retrieve.c index 39a47c1d3..6b752792e 100644 --- a/libasn1fix/asn1fix_retrieve.c +++ b/libasn1fix/asn1fix_retrieve.c @@ -305,7 +305,7 @@ asn1f_find_terminal_value(arg_t *arg, asn1p_expr_t *expr) { static asn1p_expr_t * asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, enum ftt_what what) { - asn1p_ref_t *ref; + asn1p_ref_t *ref = 0; asn1p_expr_t *tc; switch(what) { From 3990f893558c3df01be11925f364da1d343c12fb Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 20 Mar 2005 13:26:08 +0000 Subject: [PATCH 0825/1469] build on Win32 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@825 59561ff5-6e30-0410-9f3c-9617f08c8826 --- FAQ | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/FAQ b/FAQ index 934e1d736..a2e4004b9 100644 --- a/FAQ +++ b/FAQ @@ -1,7 +1,17 @@ -Q: How to build a simplest BER (XER) encoder or decoder? -A: +1.Q: Is it possible to build the asn1c compiler on Win32? +1.A: + At this point, the asn1c source code is tied to GCC-specific + extensions in several key places. The CYGWIN environment with + gcc compiler may be what are you looking for. + Please also consider using the Online ASN.1 compiler at + http://lionet.info/asn1c + which generates platform-independent code. + + +2.Q: How to build a simplest BER (XER) encoder or decoder? +2.A: Please see "Examples" section of ./doc/asn1c-usage.pdf Also, try the following to build the X.509v3 parser: @@ -11,8 +21,8 @@ A: ./x509dump -h -Q: Your compiler supplies a der_encode() procedure. How do I encode BER? -A: +3.Q: Your compiler supplies a der_encode() procedure. How do I encode BER? +3.A: The DER (and CER) are stricter subsets of a more generic BER encoding method. If you encode data with DER or CER, all BER-conformant decoders will easily understand that. Hence, to encode data in the BER format, From 6611addbc20c3029da2622aa2d89b792d9f7770f Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 20 Mar 2005 14:28:32 +0000 Subject: [PATCH 0826/1469] parsing support for CONSTRAINED BY git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@826 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 1 + TODO | 6 +- libasn1fix/asn1fix_constraint_compat.c | 2 + libasn1parser/asn1p_constr.c | 2 + libasn1parser/asn1p_constr.h | 1 + libasn1parser/asn1p_l.c | 1771 ++++++++++++------------ libasn1parser/asn1p_l.l | 2 +- libasn1parser/asn1p_y.c | 1082 ++++++++------- libasn1parser/asn1p_y.y | 14 +- libasn1print/asn1print.c | 5 + tests/34-class-OK.asn1.-EF | 2 +- tests/79-constrained-by-OK.asn1 | 19 + 12 files changed, 1486 insertions(+), 1421 deletions(-) create mode 100644 tests/79-constrained-by-OK.asn1 diff --git a/ChangeLog b/ChangeLog index 7f771b4c2..31ba28184 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,7 @@ * More RFC variations supported in crfc2asn1.pl. * Refined string values compatibility. (Test cases 77, 78). * Support for ContainedSubtype constraints. (Test case 16). + * Parsing support for CONSTRAINED BY. (Test case 79). 0.9.12: 2005-Mar-10 diff --git a/TODO b/TODO index a1414b78b..179d59c79 100644 --- a/TODO +++ b/TODO @@ -10,9 +10,9 @@ which is already completed. Also see #3.2. 2. MEDIUM: -2.1 Support for DEFAULT encoding and decoding, at least in INTEGER/ENUMERATED types. -2.2 Support for EXTERNAL, EMBEDDED-PDV and CHARACTER STRING types. +2.1 Support for EXTERNAL, EMBEDDED-PDV and CHARACTER STRING types. + Requires something from 1.2 (Information Object Classes). 3. MINOR: -3.1 Parsing of CONSTRAINED BY clauses +3.1 Support for DEFAULT encoding and decoding, at least in INTEGER/ENUMERATED types. diff --git a/libasn1fix/asn1fix_constraint_compat.c b/libasn1fix/asn1fix_constraint_compat.c index 17f398606..a0e290bd8 100644 --- a/libasn1fix/asn1fix_constraint_compat.c +++ b/libasn1fix/asn1fix_constraint_compat.c @@ -77,6 +77,8 @@ asn1constraint_compatible(asn1p_expr_type_e expr_type, default: break; } return 0; + case ACT_CT_CTDBY: + return 1; case ACT_CA_SET: case ACT_CA_CRC: case ACT_CA_CSV: diff --git a/libasn1parser/asn1p_constr.c b/libasn1parser/asn1p_constr.c index 69802698b..9e5e6e6a3 100644 --- a/libasn1parser/asn1p_constr.c +++ b/libasn1parser/asn1p_constr.c @@ -137,6 +137,8 @@ asn1p_constraint_type2str(enum asn1p_constraint_type_e type) { return "SingleTypeConstraint"; case ACT_CT_WCOMPS: return "MultipleTypeConstraints"; + case ACT_CT_CTDBY: + return "UserDefinedConstraint"; case ACT_CA_SET: return "SET"; case ACT_CA_CRC: diff --git a/libasn1parser/asn1p_constr.h b/libasn1parser/asn1p_constr.h index 90035d7cc..324697ef4 100644 --- a/libasn1parser/asn1p_constr.h +++ b/libasn1parser/asn1p_constr.h @@ -25,6 +25,7 @@ typedef struct asn1p_constraint_s { ACT_CT_FROM, /* FROM constraint type */ ACT_CT_WCOMP, /* WITH COMPONENT */ ACT_CT_WCOMPS, /* WITH COMPONENTS */ + ACT_CT_CTDBY, /* CONSTRAINED BY */ /* * Arrays of constraints. */ diff --git a/libasn1parser/asn1p_l.c b/libasn1parser/asn1p_l.c index 8d4c7f6ac..9e33d8f10 100644 --- a/libasn1parser/asn1p_l.c +++ b/libasn1parser/asn1p_l.c @@ -314,7 +314,7 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); #define YY_NUM_RULES 129 #define YY_END_OF_BUFFER 130 -static yyconst short int yy_acclist[1259] = +static yyconst short int yy_acclist[1261] = { 0, 130, 128, 129, 121, 128, 129, 121, 129, 122, 128, 129, 15, 128, 129, 122, 128, 129, 128, 129, 122, @@ -434,29 +434,29 @@ static yyconst short int yy_acclist[1259] = 65, 117, 116, 117, 116, 117, 116, 117, 117, 116, 117, 117, 117, 116, 117, 117, 116, 117, 99, 117, 116, 117, 117, 106, 116, 117, 117, 117, 117, 117, - 21, 116, 117, 44, 116, 117, 45, 116, 117, 46, - 116, 117, 116, 117, 116, 117, 54, 116, 117, 116, - - 117, 117, 117, 117, 66, 116, 117, 116, 117, 116, - 117, 117, 116, 117, 117, 117, 116, 117, 117, 116, - 117, 116, 117, 117, 109, 117, 117, 117, 117, 21, - 33, 116, 117, 49, 116, 117, 116, 117, 116, 117, - 117, 117, 117, 116, 117, 116, 117, 117, 116, 117, - 117, 117, 116, 117, 117, 116, 117, 116, 117, 117, - 117, 117, 117, 21, 116, 117, 116, 117, 117, 117, - 117, 72, 116, 117, 74, 116, 117, 75, 117, 116, - 117, 117, 117, 116, 117, 117, 93, 116, 117, 116, - 117, 117, 117, 117, 117, 21, 116, 117, 58, 116, - - 117, 63, 117, 117, 64, 117, 116, 117, 80, 117, - 117, 88, 116, 117, 117, 116, 117, 101, 117, 117, - 117, 111, 117, 21, 116, 117, 117, 78, 116, 117, - 117, 117, 116, 117, 117, 110, 117, 21, 116, 117, - 62, 117, 117, 90, 117, 103, 116, 117, 107, 117, - 21, 52, 116, 117, 82, 117, 19, 21 + 21, 116, 117, 44, 116, 117, 116, 117, 46, 116, + 117, 116, 117, 116, 117, 54, 116, 117, 116, 117, + + 117, 117, 117, 66, 116, 117, 116, 117, 116, 117, + 117, 116, 117, 117, 117, 116, 117, 117, 116, 117, + 116, 117, 117, 109, 117, 117, 117, 117, 21, 33, + 116, 117, 45, 116, 117, 49, 116, 117, 116, 117, + 116, 117, 117, 117, 117, 116, 117, 116, 117, 117, + 116, 117, 117, 117, 116, 117, 117, 116, 117, 116, + 117, 117, 117, 117, 117, 21, 116, 117, 116, 117, + 117, 117, 117, 72, 116, 117, 74, 116, 117, 75, + 117, 116, 117, 117, 117, 116, 117, 117, 93, 116, + 117, 116, 117, 117, 117, 117, 117, 21, 116, 117, + + 58, 116, 117, 63, 117, 117, 64, 117, 116, 117, + 80, 117, 117, 88, 116, 117, 117, 116, 117, 101, + 117, 117, 117, 111, 117, 21, 116, 117, 117, 78, + 116, 117, 117, 117, 116, 117, 117, 110, 117, 21, + 116, 117, 62, 117, 117, 90, 117, 103, 116, 117, + 107, 117, 21, 52, 116, 117, 82, 117, 19, 21 } ; -static yyconst short int yy_accept[671] = +static yyconst short int yy_accept[672] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 7, 9, 12, @@ -519,18 +519,19 @@ static yyconst short int yy_accept[671] = 1025, 1028, 1030, 1033, 1036, 1038, 1040, 1042, 1044, 1046, 1048, 1049, 1050, 1051, 1053, 1055, 1057, 1059, 1060, 1062, 1063, 1064, 1066, 1067, 1069, 1071, 1073, 1074, 1077, 1078, - 1079, 1080, 1081, 1082, 1084, 1087, 1090, 1093, 1095, 1097, - 1100, 1102, 1103, 1104, 1105, 1108, 1110, 1112, 1113, 1115, - 1116, 1117, 1119, 1120, 1122, 1124, 1125, 1127, 1128, 1129, - 1130, 1131, 1134, 1137, 1139, 1141, 1142, 1143, 1144, 1146, - - 1148, 1149, 1151, 1152, 1153, 1155, 1156, 1158, 1160, 1161, - 1162, 1163, 1164, 1165, 1167, 1169, 1170, 1171, 1172, 1175, - 1178, 1180, 1182, 1183, 1184, 1186, 1187, 1190, 1192, 1193, - 1194, 1195, 1196, 1197, 1199, 1202, 1204, 1205, 1207, 1209, - 1211, 1212, 1215, 1216, 1218, 1220, 1221, 1222, 1224, 1225, - 1227, 1228, 1231, 1232, 1233, 1235, 1236, 1238, 1239, 1241, - 1243, 1244, 1246, 1249, 1251, 1252, 1255, 1257, 1259, 1259 + 1079, 1080, 1081, 1082, 1084, 1087, 1089, 1092, 1094, 1096, + 1099, 1101, 1102, 1103, 1104, 1107, 1109, 1111, 1112, 1114, + 1115, 1116, 1118, 1119, 1121, 1123, 1124, 1126, 1127, 1128, + 1129, 1130, 1133, 1136, 1139, 1141, 1143, 1144, 1145, 1146, + + 1148, 1150, 1151, 1153, 1154, 1155, 1157, 1158, 1160, 1162, + 1163, 1164, 1165, 1166, 1167, 1169, 1171, 1172, 1173, 1174, + 1177, 1180, 1182, 1184, 1185, 1186, 1188, 1189, 1192, 1194, + 1195, 1196, 1197, 1198, 1199, 1201, 1204, 1206, 1207, 1209, + 1211, 1213, 1214, 1217, 1218, 1220, 1222, 1223, 1224, 1226, + 1227, 1229, 1230, 1233, 1234, 1235, 1237, 1238, 1240, 1241, + 1243, 1245, 1246, 1248, 1251, 1253, 1254, 1257, 1259, 1261, + 1261 } ; static yyconst int yy_ec[256] = @@ -577,27 +578,27 @@ static yyconst int yy_meta[78] = 10, 10, 10, 10, 11, 1, 11 } ; -static yyconst short int yy_base[688] = +static yyconst short int yy_base[689] = { 0, 0, 0, 75, 77, 79, 80, 81, 88, 82, 92, 169, 246, 108, 119, 797, 777, 94, 97, 775, 774, - 316, 116, 4249, 117, 767, 99, 4249, 124, 751, 4249, + 316, 116, 4266, 117, 767, 99, 4266, 124, 751, 4266, 380, 173, 191, 120, 236, 254, 269, 188, 275, 430, 431, 447, 453, 468, 474, 490, 498, 514, 515, 762, - 0, 760, 0, 4249, 4249, 756, 4249, 4249, 753, 754, - 0, 0, 757, 0, 0, 740, 4249, 4249, 4249, 0, - 4249, 4249, 575, 651, 0, 148, 151, 256, 4249, 746, - 159, 0, 745, 743, 0, 95, 0, 325, 739, 4249, - 223, 733, 4249, 550, 715, 564, 565, 580, 593, 596, + 0, 760, 0, 4266, 4266, 756, 4266, 4266, 753, 754, + 0, 0, 757, 0, 0, 740, 4266, 4266, 4266, 0, + 4266, 4266, 575, 651, 0, 148, 151, 256, 4266, 746, + 159, 0, 745, 743, 0, 95, 0, 325, 739, 4266, + 223, 733, 4266, 550, 715, 564, 565, 580, 593, 596, 609, 0, 640, 643, 656, 669, 680, 696, 704, 717, 720, 733, 748, 754, 751, 769, 673, 684, 784, 787, 795, 810, 821, 832, 838, 849, 669, 862, 865, 878, 886, 669, 889, 902, 913, 926, 667, 942, 948, 959, 965, 976, 991, 992, 1007, 1008, 663, 1023, 1024, 663, - 58, 1039, 0, 0, 4249, 4249, 0, 4249, 0, 699, - 0, 681, 159, 0, 201, 4249, 706, 0, 0, 163, - 683, 1071, 4249, 4249, 1066, 1067, 1082, 1083, 1098, 1106, + 58, 1039, 0, 0, 4266, 4266, 0, 4266, 0, 699, + 0, 681, 159, 0, 201, 4266, 706, 0, 0, 163, + 683, 1071, 4266, 4266, 1066, 1067, 1082, 1083, 1098, 1106, 1109, 1122, 1130, 1138, 1146, 1159, 1167, 1170, 1191, 1192, 1207, 1213, 1224, 1230, 1241, 1247, 1258, 1269, 656, 645, @@ -605,137 +606,137 @@ static yyconst short int yy_base[688] = 654, 1356, 1371, 1377, 653, 1388, 1399, 1405, 1416, 1427, 639, 1438, 1444, 1455, 1461, 1476, 1477, 1492, 1503, 1509, 1524, 1530, 643, 1541, 1552, 1563, 627, 641, 636, 1574, - 4249, 162, 655, 640, 4249, 4249, 1585, 1591, 1602, 1608, - 1619, 1625, 1641, 1642, 1657, 1665, 1673, 1681, 1694, 1697, - 1710, 1721, 1727, 1738, 1744, 1755, 1766, 1781, 1787, 622, - 626, 1798, 1804, 1819, 1820, 1835, 1841, 1856, 1859, 1867, - 1880, 616, 1888, 1891, 1904, 622, 1912, 1928, 1927, 1944, - 600, 1945, 1960, 1973, 1981, 1984, 2002, 1999, 2005, 2020, - - 2023, 598, 2026, 2041, 2044, 2052, 2065, 610, 599, 601, - 2076, 187, 2089, 2092, 2110, 2113, 582, 2116, 2133, 2136, - 2144, 2157, 2160, 2168, 2181, 2189, 2202, 2210, 2218, 2226, - 2241, 2247, 2258, 2264, 2279, 595, 585, 576, 2280, 2300, - 2297, 2318, 2317, 2333, 2339, 2350, 2361, 2372, 582, 2378, - 2389, 2395, 570, 2406, 2417, 2423, 2434, 586, 2447, 2450, - 2458, 2471, 569, 2482, 573, 2488, 2503, 2504, 564, 2519, - 556, 553, 558, 227, 2525, 2541, 2547, 556, 2558, 2564, - 2575, 2581, 2592, 2598, 2609, 2620, 2626, 2643, 2649, 2660, - 2666, 2677, 2683, 2694, 2700, 2716, 552, 559, 552, 2717, - - 2732, 2738, 2749, 2755, 2770, 2776, 2787, 2802, 2808, 2819, - 557, 2830, 2836, 583, 2847, 2853, 2864, 2877, 553, 2885, - 2900, 2903, 2906, 534, 2921, 521, 2924, 2927, 536, 524, - 520, 522, 521, 539, 2942, 2955, 509, 2958, 2973, 2979, - 2990, 2996, 3007, 3013, 3024, 3035, 3041, 3052, 3058, 3069, - 3080, 3086, 3097, 105, 530, 507, 3103, 3114, 3125, 3131, - 3142, 3148, 3163, 3164, 3179, 3185, 3196, 528, 3202, 505, - 3213, 3224, 3230, 3241, 498, 3247, 3262, 493, 3268, 514, - 3284, 0, 495, 496, 473, 502, 251, 3285, 3300, 485, - 3306, 3317, 3330, 3338, 3341, 3356, 3362, 3377, 3359, 3383, - - 3394, 467, 459, 461, 470, 3400, 3411, 3417, 3428, 3434, - 3445, 459, 3456, 455, 3462, 453, 3473, 463, 3484, 3490, - 458, 3501, 441, 3507, 440, 436, 453, 420, 196, 3518, - 3524, 0, 3535, 3541, 3557, 3556, 3572, 3573, 3588, 3589, - 420, 429, 416, 0, 3604, 3612, 3627, 421, 3628, 412, - 417, 3643, 422, 3651, 0, 3659, 396, 3672, 403, 418, - 390, 391, 431, 3675, 3683, 3696, 3699, 3707, 3720, 3728, - 3736, 371, 375, 343, 3744, 3752, 3760, 338, 3768, 341, - 333, 3776, 323, 3784, 3792, 331, 0, 297, 268, 274, - 295, 3800, 3808, 3816, 3824, 267, 287, 265, 3837, 3845, - - 266, 3853, 254, 256, 3861, 248, 3874, 3877, 245, 238, - 243, 237, 255, 3885, 3898, 232, 227, 228, 3901, 3914, - 0, 3922, 227, 218, 3925, 222, 3942, 3943, 218, 210, - 201, 204, 217, 3958, 3959, 0, 171, 0, 3975, 0, - 162, 3976, 154, 3993, 0, 151, 149, 0, 146, 4001, - 127, 4009, 102, 105, 4017, 86, 0, 90, 4025, 0, - 40, 0, 4038, 0, 68, 4041, 0, 0, 4249, 4086, - 4097, 4108, 4119, 4130, 4141, 4152, 4162, 4164, 4174, 4185, - 4196, 4206, 4216, 4226, 4230, 4234, 4238 + 4266, 162, 655, 640, 4266, 4266, 1585, 1591, 1602, 1608, + 1619, 1625, 1641, 1642, 1657, 1665, 1673, 1689, 1686, 1697, + 1710, 1713, 1728, 1734, 1745, 1751, 1762, 1777, 1783, 622, + 626, 1794, 1800, 1815, 1816, 1831, 1837, 1852, 1855, 1863, + 1876, 616, 1884, 1887, 1900, 622, 1908, 1924, 1923, 1940, + 600, 1941, 1956, 1969, 1977, 1980, 1998, 1995, 2001, 2016, + + 2019, 598, 2022, 2037, 2040, 2048, 2061, 610, 599, 601, + 2072, 187, 2085, 2088, 2106, 2109, 582, 2112, 2129, 2132, + 2140, 2153, 2161, 2169, 2182, 2190, 2203, 2211, 2219, 2227, + 2242, 2248, 2259, 2265, 2280, 595, 585, 576, 2281, 2301, + 2298, 2319, 2318, 2334, 2340, 2351, 2362, 2373, 582, 2379, + 2390, 2396, 570, 2407, 2418, 2424, 2435, 586, 2448, 2451, + 2459, 2472, 569, 2483, 573, 2489, 2504, 2505, 564, 2520, + 556, 553, 558, 227, 2526, 2542, 2548, 556, 2559, 2565, + 2576, 2582, 2598, 2599, 2614, 2625, 2631, 2648, 2654, 2665, + 2671, 2682, 2688, 2699, 2705, 2721, 552, 559, 552, 2722, + + 2737, 2743, 2754, 2760, 2775, 2781, 2792, 2807, 2813, 2824, + 557, 2835, 2841, 583, 2852, 2858, 2869, 2882, 553, 2890, + 2905, 2908, 2911, 534, 2926, 521, 2929, 2932, 536, 524, + 520, 522, 521, 539, 2947, 2960, 509, 2963, 2978, 2984, + 2995, 3001, 3012, 3018, 3029, 3040, 3046, 3057, 3063, 3074, + 3085, 3091, 3102, 105, 530, 507, 3108, 3119, 3130, 3136, + 3147, 3153, 3168, 3169, 3184, 3190, 3201, 528, 3207, 505, + 3218, 3229, 3235, 3246, 498, 3252, 3267, 493, 3273, 514, + 3289, 0, 495, 496, 473, 502, 251, 3290, 3305, 485, + 3311, 3322, 3333, 3339, 3350, 3356, 3372, 3371, 3387, 3388, + + 3403, 467, 459, 461, 470, 3409, 3420, 3426, 3437, 3443, + 3454, 459, 3465, 455, 3471, 453, 3482, 463, 3493, 3499, + 458, 3510, 441, 3516, 440, 436, 453, 420, 196, 3527, + 3533, 0, 3544, 3550, 3565, 3566, 3581, 3582, 3597, 3598, + 420, 429, 416, 0, 3613, 3621, 3636, 421, 3637, 412, + 417, 3652, 422, 3660, 0, 3668, 396, 3681, 403, 418, + 390, 391, 431, 3684, 3692, 3705, 3708, 3716, 3729, 3737, + 3745, 371, 375, 343, 3753, 3761, 3769, 338, 3777, 341, + 333, 3785, 323, 3793, 3801, 331, 0, 297, 268, 274, + 295, 3809, 3817, 3825, 3833, 3841, 267, 287, 265, 3854, + + 3862, 266, 3870, 254, 256, 3878, 248, 3891, 3894, 245, + 238, 243, 237, 255, 3902, 3915, 232, 227, 228, 3918, + 3931, 0, 3939, 227, 218, 3942, 222, 3959, 3960, 218, + 210, 201, 204, 217, 3975, 3976, 0, 171, 0, 3992, + 0, 162, 3993, 154, 4010, 0, 151, 149, 0, 146, + 4018, 127, 4026, 102, 105, 4034, 86, 0, 90, 4042, + 0, 40, 0, 4055, 0, 68, 4058, 0, 0, 4266, + 4103, 4114, 4125, 4136, 4147, 4158, 4169, 4179, 4181, 4191, + 4202, 4213, 4223, 4233, 4243, 4247, 4251, 4255 } ; -static yyconst short int yy_def[688] = +static yyconst short int yy_def[689] = { 0, - 669, 1, 670, 670, 671, 671, 672, 672, 673, 673, - 674, 674, 675, 675, 669, 669, 669, 669, 669, 676, - 669, 677, 669, 669, 669, 669, 669, 669, 669, 669, - 669, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 669, - 678, 669, 679, 669, 669, 669, 669, 669, 669, 669, - 680, 680, 669, 681, 681, 669, 669, 669, 669, 682, - 669, 669, 683, 683, 684, 669, 669, 21, 669, 669, - 669, 676, 676, 669, 685, 669, 686, 677, 677, 669, - 669, 669, 669, 669, 669, 31, 31, 31, 31, 31, - - 31, 687, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 687, 687, 31, 31, - 31, 31, 31, 31, 31, 31, 687, 31, 31, 31, - 31, 687, 31, 31, 31, 31, 687, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 687, 31, 31, 687, - 687, 31, 678, 679, 669, 669, 680, 669, 681, 669, - 682, 74, 74, 684, 669, 669, 669, 685, 686, 669, - 669, 669, 669, 669, 31, 31, 31, 31, 31, 31, + 670, 1, 671, 671, 672, 672, 673, 673, 674, 674, + 675, 675, 676, 676, 670, 670, 670, 670, 670, 677, + 670, 678, 670, 670, 670, 670, 670, 670, 670, 670, + 670, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 670, + 679, 670, 680, 670, 670, 670, 670, 670, 670, 670, + 681, 681, 670, 682, 682, 670, 670, 670, 670, 683, + 670, 670, 684, 684, 685, 670, 670, 21, 670, 670, + 670, 677, 677, 670, 686, 670, 687, 678, 678, 670, + 670, 670, 670, 670, 670, 31, 31, 31, 31, 31, + + 31, 688, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 688, 688, 31, 31, + 31, 31, 31, 31, 31, 31, 688, 31, 31, 31, + 31, 688, 31, 31, 31, 31, 688, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 688, 31, 31, 688, + 688, 31, 679, 680, 670, 670, 681, 670, 682, 670, + 683, 74, 74, 685, 670, 670, 670, 686, 687, 670, + 670, 670, 670, 670, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 687, 687, + 31, 31, 31, 31, 31, 31, 31, 31, 688, 688, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 687, 31, 31, 31, 687, 31, 31, 31, 31, 31, - 687, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 687, 31, 31, 31, 687, 687, 687, 31, - 669, 74, 74, 669, 669, 669, 31, 31, 31, 31, + 688, 31, 31, 31, 688, 31, 31, 31, 31, 31, + 688, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 688, 31, 31, 31, 688, 688, 688, 31, + 670, 74, 74, 670, 670, 670, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 687, - 687, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 687, 31, 31, 31, 687, 31, 31, 31, 31, - 687, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 688, + 688, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 688, 31, 31, 31, 688, 31, 31, 31, 31, + 688, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 687, 31, 31, 31, 31, 31, 687, 687, 687, - 31, 74, 31, 31, 31, 31, 687, 31, 31, 31, + 31, 688, 31, 31, 31, 31, 31, 688, 688, 688, + 31, 74, 31, 31, 31, 31, 688, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 687, 687, 687, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 687, 31, - 31, 31, 687, 31, 31, 31, 31, 687, 31, 31, - 31, 31, 687, 31, 687, 31, 31, 31, 687, 31, - 687, 687, 687, 74, 31, 31, 31, 687, 31, 31, + 31, 31, 31, 31, 31, 688, 688, 688, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 688, 31, + 31, 31, 688, 31, 31, 31, 31, 688, 31, 31, + 31, 31, 688, 31, 688, 31, 31, 31, 688, 31, + 688, 688, 688, 74, 31, 31, 31, 688, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 687, 687, 687, 31, + 31, 31, 31, 31, 31, 31, 688, 688, 688, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 687, 31, 31, 687, 31, 31, 31, 31, 687, 31, - 31, 31, 31, 687, 31, 687, 31, 31, 687, 687, - 687, 687, 687, 74, 31, 31, 687, 31, 31, 31, + 688, 31, 31, 688, 31, 31, 31, 31, 688, 31, + 31, 31, 31, 688, 31, 688, 31, 31, 688, 688, + 688, 688, 688, 74, 31, 31, 688, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 687, 687, 687, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 687, 31, 687, - 31, 31, 31, 31, 687, 31, 31, 687, 31, 687, - 31, 687, 687, 687, 687, 687, 74, 31, 31, 687, + 31, 31, 31, 688, 688, 688, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 688, 31, 688, + 31, 31, 31, 31, 688, 31, 31, 688, 31, 688, + 31, 688, 688, 688, 688, 688, 74, 31, 31, 688, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 687, 687, 687, 687, 31, 31, 31, 31, 31, - 31, 687, 31, 687, 31, 687, 31, 687, 31, 31, - 687, 31, 687, 31, 687, 687, 687, 687, 74, 31, - 31, 687, 31, 31, 31, 31, 31, 31, 31, 31, - 687, 687, 687, 687, 31, 31, 31, 687, 31, 687, - 687, 31, 687, 31, 687, 31, 687, 31, 687, 687, - 687, 687, 682, 31, 31, 31, 31, 31, 31, 31, - 31, 687, 687, 687, 31, 31, 31, 687, 31, 687, - 687, 31, 687, 31, 31, 687, 687, 687, 687, 687, - 682, 31, 31, 31, 31, 687, 687, 687, 31, 31, - - 687, 31, 687, 687, 31, 687, 31, 31, 687, 687, - 687, 687, 682, 31, 31, 687, 687, 687, 31, 31, - 687, 31, 687, 687, 31, 687, 31, 31, 687, 687, - 687, 687, 682, 31, 31, 687, 687, 687, 31, 687, - 687, 31, 687, 31, 687, 687, 687, 687, 682, 31, - 687, 31, 687, 687, 31, 687, 687, 682, 31, 687, - 687, 687, 31, 687, 682, 31, 687, 682, 0, 669, - 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, - 669, 669, 669, 669, 669, 669, 669 + 31, 688, 688, 688, 688, 31, 31, 31, 31, 31, + 31, 688, 31, 688, 31, 688, 31, 688, 31, 31, + 688, 31, 688, 31, 688, 688, 688, 688, 74, 31, + 31, 688, 31, 31, 31, 31, 31, 31, 31, 31, + 688, 688, 688, 688, 31, 31, 31, 688, 31, 688, + 688, 31, 688, 31, 688, 31, 688, 31, 688, 688, + 688, 688, 683, 31, 31, 31, 31, 31, 31, 31, + 31, 688, 688, 688, 31, 31, 31, 688, 31, 688, + 688, 31, 688, 31, 31, 688, 688, 688, 688, 688, + 683, 31, 31, 31, 31, 31, 688, 688, 688, 31, + + 31, 688, 31, 688, 688, 31, 688, 31, 31, 688, + 688, 688, 688, 683, 31, 31, 688, 688, 688, 31, + 31, 688, 31, 688, 688, 31, 688, 31, 31, 688, + 688, 688, 688, 683, 31, 31, 688, 688, 688, 31, + 688, 688, 31, 688, 31, 688, 688, 688, 688, 683, + 31, 688, 31, 688, 688, 31, 688, 688, 683, 31, + 688, 688, 688, 31, 688, 683, 31, 688, 683, 0, + 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, + 670, 670, 670, 670, 670, 670, 670, 670 } ; -static yyconst short int yy_nxt[4327] = +static yyconst short int yy_nxt[4344] = { 0, 16, 17, 18, 17, 19, 20, 21, 22, 23, 16, 24, 25, 26, 27, 28, 28, 28, 28, 28, 28, @@ -748,43 +749,43 @@ static yyconst short int yy_nxt[4327] = 55, 58, 58, 62, 65, 56, 63, 56, 59, 59, 62, 60, 60, 63, 65, 81, 81, 81, 81, 81, - 81, 80, 66, 668, 80, 67, 80, 667, 93, 76, + 81, 80, 66, 669, 80, 67, 80, 668, 93, 76, 77, 76, 66, 238, 78, 67, 84, 88, 88, 88, - 76, 77, 76, 80, 80, 78, 239, 90, 665, 88, + 76, 77, 76, 80, 80, 78, 239, 90, 666, 88, 88, 91, 91, 91, 91, 91, 91, 94, 94, 94, - 94, 94, 94, 94, 664, 96, 86, 502, 111, 165, + 94, 94, 94, 94, 665, 96, 86, 502, 111, 165, 165, 165, 165, 165, 165, 96, 68, 96, 69, 96, - 81, 81, 81, 662, 96, 503, 68, 661, 69, 70, + 81, 81, 81, 663, 96, 503, 68, 662, 69, 70, 71, 72, 71, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 30, 660, 79, 242, 243, 658, 245, 70, + 70, 70, 30, 661, 79, 242, 243, 659, 245, 70, 70, 70, 70, 30, 246, 79, 162, 74, 96, 162, - 312, 103, 165, 165, 165, 104, 563, 657, 96, 105, - 96, 106, 96, 96, 374, 656, 96, 96, 654, 70, + 312, 103, 165, 165, 165, 104, 563, 658, 96, 105, + 96, 106, 96, 96, 374, 657, 96, 96, 655, 70, 70, 107, 108, 96, 162, 96, 109, 96, 96, 110, - 96, 653, 96, 162, 651, 96, 172, 172, 172, 172, + 96, 654, 96, 162, 652, 96, 172, 172, 172, 172, 172, 172, 172, 71, 70, 71, 70, 71, 72, 71, 70, 70, 70, 70, 70, 70, 70, 70, 70, 434, - 649, 96, 648, 669, 162, 647, 70, 70, 70, 70, - 646, 96, 112, 113, 74, 96, 645, 669, 115, 96, - 96, 529, 643, 114, 641, 640, 638, 637, 162, 96, - 636, 96, 633, 96, 96, 116, 70, 70, 96, 119, - - 96, 632, 120, 631, 96, 630, 96, 669, 96, 629, - 96, 121, 122, 96, 96, 626, 624, 123, 623, 96, - 71, 70, 71, 80, 621, 117, 88, 88, 88, 618, - 617, 616, 170, 613, 612, 611, 118, 84, 88, 88, + 650, 96, 649, 670, 162, 648, 70, 70, 70, 70, + 647, 96, 112, 113, 74, 96, 646, 670, 115, 96, + 96, 529, 644, 114, 642, 641, 639, 638, 162, 96, + 637, 96, 634, 96, 96, 116, 70, 70, 96, 119, + + 96, 633, 120, 632, 96, 631, 96, 670, 96, 630, + 96, 121, 122, 96, 96, 627, 625, 123, 624, 96, + 71, 70, 71, 80, 622, 117, 88, 88, 88, 619, + 618, 617, 170, 614, 613, 612, 118, 84, 88, 88, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 610, 86, 87, 87, + 85, 85, 85, 85, 85, 85, 611, 86, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 96, 609, 606, 96, 96, 96, 96, 96, 96, 96, + 96, 610, 607, 96, 96, 96, 96, 96, 96, 96, - 604, 603, 601, 598, 96, 97, 96, 96, 96, 96, + 605, 604, 602, 599, 96, 97, 96, 96, 96, 96, 96, 96, 96, 96, 96, 98, 96, 99, 96, 100, 96, 96, 96, 96, 101, 96, 96, 96, 96, 96, - 597, 596, 102, 102, 102, 102, 102, 102, 102, 102, + 598, 597, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 124, 96, 96, 591, 590, 589, 588, 587, 125, 586, 583, 96, 96, 96, 96, 96, @@ -823,399 +824,401 @@ static yyconst short int yy_nxt[4327] = 160, 96, 158, 93, 96, 156, 155, 80, 96, 80, 96, 95, 96, 96, 191, 192, 96, 96, 92, 96, 194, 83, 80, 96, 80, 96, 197, 96, 96, 96, - 96, 96, 193, 195, 96, 96, 669, 196, 96, 669, - - 669, 201, 669, 669, 96, 669, 96, 198, 96, 96, - 669, 669, 96, 96, 669, 202, 669, 669, 669, 96, - 96, 96, 96, 96, 96, 669, 96, 669, 96, 669, - 96, 96, 96, 669, 203, 96, 204, 669, 669, 96, - 669, 669, 669, 669, 669, 96, 96, 96, 669, 96, - 669, 669, 205, 206, 96, 669, 96, 96, 96, 207, - 96, 669, 669, 96, 669, 96, 669, 96, 669, 96, - 669, 96, 669, 96, 96, 209, 96, 96, 669, 208, - 669, 669, 96, 669, 210, 669, 96, 96, 96, 669, - 96, 669, 669, 96, 669, 212, 669, 96, 669, 96, - - 96, 96, 96, 96, 96, 669, 96, 669, 213, 96, - 669, 96, 669, 96, 96, 96, 669, 96, 669, 669, - 669, 96, 96, 96, 96, 96, 96, 96, 96, 214, - 96, 669, 216, 96, 669, 669, 669, 96, 96, 96, - 669, 96, 669, 669, 669, 669, 96, 217, 96, 669, - 96, 96, 96, 669, 219, 669, 669, 218, 220, 669, - 669, 96, 669, 96, 669, 96, 222, 96, 669, 669, - 96, 669, 669, 96, 669, 669, 669, 223, 669, 96, - 669, 96, 669, 96, 96, 96, 96, 96, 224, 669, - 96, 225, 96, 669, 96, 669, 96, 669, 96, 669, - - 96, 96, 96, 96, 96, 229, 227, 669, 226, 96, - 669, 96, 669, 228, 669, 96, 96, 96, 669, 669, - 96, 669, 230, 669, 669, 669, 96, 96, 96, 96, - 96, 96, 96, 96, 669, 96, 96, 669, 669, 669, - 669, 669, 96, 96, 96, 96, 96, 232, 96, 96, - 235, 231, 96, 236, 669, 234, 669, 669, 96, 96, - 96, 96, 96, 96, 96, 669, 669, 96, 96, 669, - 669, 669, 669, 669, 96, 669, 96, 669, 96, 669, - 669, 669, 240, 96, 172, 172, 172, 172, 172, 172, - 172, 96, 96, 669, 247, 669, 669, 669, 669, 669, - - 669, 96, 96, 96, 96, 96, 96, 96, 96, 669, - 96, 96, 669, 669, 669, 669, 669, 96, 248, 96, - 96, 96, 96, 96, 669, 669, 96, 96, 669, 669, - 669, 96, 669, 96, 96, 96, 249, 96, 250, 669, - 669, 96, 96, 96, 96, 96, 96, 96, 96, 669, - 96, 669, 669, 96, 669, 96, 669, 96, 669, 96, - 669, 96, 669, 96, 251, 252, 96, 96, 669, 96, - 669, 96, 669, 96, 96, 96, 669, 96, 254, 253, - 669, 96, 96, 96, 96, 96, 669, 669, 669, 669, - 96, 669, 96, 669, 96, 96, 96, 669, 96, 669, - - 669, 255, 96, 96, 96, 96, 256, 96, 669, 96, - 669, 96, 257, 258, 96, 259, 96, 96, 669, 669, - 261, 669, 669, 260, 669, 669, 96, 96, 96, 96, - 96, 96, 96, 669, 669, 96, 96, 669, 96, 669, - 669, 669, 96, 669, 96, 262, 96, 669, 96, 96, - 96, 96, 96, 669, 669, 96, 669, 96, 264, 96, - 263, 96, 669, 96, 669, 96, 96, 96, 96, 96, - 669, 669, 96, 669, 96, 267, 265, 669, 96, 266, - 96, 669, 96, 96, 96, 96, 96, 669, 669, 669, - 669, 96, 669, 96, 96, 96, 669, 96, 669, 669, - - 268, 669, 96, 669, 96, 269, 96, 96, 96, 669, - 669, 669, 669, 96, 669, 96, 669, 96, 96, 96, - 669, 96, 669, 669, 272, 96, 96, 273, 274, 96, - 96, 275, 96, 96, 96, 669, 96, 96, 669, 96, - 669, 669, 278, 276, 669, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 277, 96, 279, 96, 96, 669, - 96, 669, 669, 96, 669, 669, 669, 96, 669, 96, + 96, 96, 193, 195, 96, 96, 670, 196, 96, 670, + + 670, 201, 670, 670, 96, 670, 96, 198, 96, 96, + 670, 670, 96, 96, 670, 202, 670, 670, 670, 96, + 96, 96, 96, 96, 96, 670, 96, 670, 96, 670, + 96, 96, 96, 670, 203, 96, 204, 670, 670, 96, + 670, 670, 670, 670, 670, 96, 96, 96, 670, 96, + 670, 670, 205, 206, 96, 670, 96, 96, 96, 207, + 96, 670, 670, 96, 670, 96, 670, 96, 670, 96, + 670, 96, 670, 96, 96, 209, 96, 96, 670, 208, + 670, 670, 96, 670, 210, 670, 96, 96, 96, 670, + 96, 670, 670, 96, 670, 212, 670, 96, 670, 96, + + 96, 96, 96, 96, 96, 670, 96, 670, 213, 96, + 670, 96, 670, 96, 96, 96, 670, 96, 670, 670, + 670, 96, 96, 96, 96, 96, 96, 96, 96, 214, + 96, 670, 216, 96, 670, 670, 670, 96, 96, 96, + 670, 96, 670, 670, 670, 670, 96, 217, 96, 670, + 96, 96, 96, 670, 219, 670, 670, 218, 220, 670, + 670, 96, 670, 96, 670, 96, 222, 96, 670, 670, + 96, 670, 670, 96, 670, 670, 670, 223, 670, 96, + 670, 96, 670, 96, 96, 96, 96, 96, 224, 670, + 96, 225, 96, 670, 96, 670, 96, 670, 96, 670, + + 96, 96, 96, 96, 96, 229, 227, 670, 226, 96, + 670, 96, 670, 228, 670, 96, 96, 96, 670, 670, + 96, 670, 230, 670, 670, 670, 96, 96, 96, 96, + 96, 96, 96, 96, 670, 96, 96, 670, 670, 670, + 670, 670, 96, 96, 96, 96, 96, 232, 96, 96, + 235, 231, 96, 236, 670, 234, 670, 670, 96, 96, + 96, 96, 96, 96, 96, 670, 670, 96, 96, 670, + 670, 670, 670, 670, 96, 670, 96, 670, 96, 670, + 670, 670, 240, 96, 172, 172, 172, 172, 172, 172, + 172, 96, 96, 670, 247, 670, 670, 670, 670, 670, + + 670, 96, 96, 96, 96, 96, 96, 96, 96, 670, + 96, 96, 670, 670, 670, 670, 670, 96, 248, 96, + 96, 96, 96, 96, 670, 670, 96, 96, 670, 670, + 670, 96, 670, 96, 96, 96, 249, 96, 250, 670, + 670, 96, 96, 96, 96, 96, 96, 96, 96, 670, + 96, 670, 670, 96, 670, 96, 670, 96, 670, 96, + 670, 96, 670, 96, 251, 252, 96, 96, 670, 96, + 670, 96, 670, 96, 96, 96, 670, 96, 254, 253, + 670, 96, 96, 96, 96, 96, 670, 670, 670, 670, + 96, 670, 96, 670, 96, 96, 96, 670, 96, 670, + + 670, 255, 96, 96, 96, 96, 256, 96, 670, 96, + 670, 96, 257, 258, 96, 259, 96, 96, 670, 670, + 261, 670, 670, 260, 670, 670, 96, 96, 96, 96, + 96, 96, 96, 670, 670, 96, 96, 670, 96, 670, + 670, 670, 96, 670, 96, 262, 96, 670, 96, 96, + 96, 96, 96, 670, 670, 96, 670, 96, 264, 96, + 263, 96, 670, 96, 670, 96, 96, 96, 96, 96, + 670, 670, 96, 670, 96, 267, 265, 670, 96, 266, + 96, 670, 96, 96, 96, 96, 96, 670, 670, 670, + 670, 96, 670, 96, 96, 96, 670, 96, 670, 670, + + 268, 670, 96, 670, 96, 269, 96, 96, 96, 670, + 670, 670, 670, 96, 670, 96, 670, 96, 96, 96, + 670, 96, 670, 670, 272, 96, 96, 273, 274, 96, + 96, 275, 96, 96, 96, 670, 96, 96, 670, 96, + 670, 670, 278, 276, 670, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 277, 96, 279, 96, 96, 670, + 96, 670, 670, 96, 670, 670, 670, 96, 670, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 280, - 669, 96, 96, 669, 283, 669, 669, 669, 281, 669, - 96, 96, 96, 96, 669, 96, 96, 96, 669, 284, - - 96, 669, 96, 669, 669, 669, 96, 669, 96, 285, - 96, 669, 96, 96, 96, 96, 96, 669, 669, 669, - 669, 96, 669, 96, 96, 96, 669, 96, 669, 669, - 96, 287, 96, 669, 96, 669, 96, 669, 96, 669, - 96, 96, 96, 96, 96, 669, 669, 288, 669, 96, - 669, 96, 96, 96, 669, 96, 669, 669, 289, 669, - 96, 669, 96, 96, 96, 669, 96, 669, 293, 96, - 669, 96, 290, 292, 669, 96, 669, 96, 669, 96, - 96, 96, 96, 96, 669, 669, 96, 669, 96, 669, - 96, 669, 96, 669, 96, 669, 96, 669, 96, 294, - - 96, 96, 96, 669, 295, 96, 669, 669, 669, 296, - 669, 96, 96, 96, 96, 96, 96, 96, 669, 669, - 96, 96, 669, 669, 669, 669, 669, 96, 96, 96, - 669, 96, 669, 669, 96, 297, 96, 669, 96, 669, - 96, 669, 96, 669, 96, 298, 96, 96, 96, 96, - 669, 299, 300, 96, 669, 96, 669, 669, 301, 96, - 669, 96, 669, 96, 669, 96, 96, 96, 96, 96, - 669, 669, 669, 669, 96, 669, 96, 96, 96, 303, - 96, 304, 307, 669, 669, 96, 305, 96, 96, 96, - 669, 96, 669, 669, 669, 306, 96, 669, 96, 96, - - 96, 669, 96, 669, 669, 311, 669, 96, 669, 96, - 96, 96, 669, 96, 669, 669, 96, 669, 96, 669, - 96, 669, 313, 314, 96, 669, 96, 96, 96, 96, - 96, 669, 669, 96, 669, 96, 669, 96, 315, 96, - 669, 96, 669, 96, 96, 316, 96, 96, 669, 669, - 96, 669, 96, 318, 96, 669, 96, 669, 96, 669, - 96, 669, 96, 96, 96, 319, 96, 96, 320, 96, - 669, 669, 669, 669, 669, 669, 96, 96, 96, 96, - 96, 96, 96, 669, 669, 96, 96, 669, 317, 669, - 96, 669, 96, 669, 96, 669, 96, 669, 96, 321, - - 96, 96, 96, 322, 96, 324, 96, 669, 96, 96, - 96, 669, 96, 669, 323, 669, 96, 96, 96, 96, - 96, 669, 96, 669, 669, 96, 669, 669, 669, 96, - 669, 96, 96, 96, 326, 96, 96, 327, 325, 669, - 669, 96, 669, 669, 669, 96, 96, 96, 328, 96, - 669, 669, 96, 669, 96, 329, 96, 669, 96, 669, - 96, 669, 96, 96, 96, 96, 96, 669, 669, 96, - 669, 96, 669, 96, 669, 96, 331, 330, 669, 96, - 96, 96, 96, 96, 669, 669, 669, 669, 96, 669, - 96, 96, 96, 669, 96, 669, 332, 669, 669, 96, - - 669, 96, 669, 333, 669, 96, 96, 334, 669, 335, - 96, 669, 96, 669, 669, 669, 96, 669, 96, 669, - 96, 669, 96, 96, 96, 96, 96, 669, 669, 96, - 669, 96, 669, 96, 669, 96, 669, 96, 669, 96, - 669, 96, 96, 96, 96, 96, 669, 339, 96, 669, - 669, 340, 669, 669, 96, 96, 96, 96, 96, 96, - 96, 341, 669, 96, 96, 343, 96, 338, 669, 669, - 96, 669, 96, 669, 96, 347, 96, 669, 96, 342, - 96, 96, 344, 669, 96, 96, 345, 669, 669, 669, - 669, 96, 96, 96, 96, 96, 96, 346, 96, 669, - - 96, 669, 96, 96, 96, 96, 96, 669, 669, 348, - 669, 96, 669, 96, 350, 96, 96, 96, 669, 96, - 669, 669, 669, 96, 96, 96, 96, 96, 96, 96, - 96, 669, 96, 669, 351, 96, 669, 96, 355, 96, - 354, 96, 352, 96, 669, 669, 669, 96, 96, 96, - 669, 96, 96, 96, 669, 356, 96, 669, 669, 669, - 669, 669, 96, 96, 96, 96, 96, 96, 357, 96, - 96, 96, 96, 669, 669, 669, 669, 669, 669, 96, - 96, 96, 96, 96, 96, 96, 669, 669, 96, 96, - 669, 669, 669, 669, 669, 96, 669, 96, 96, 96, - - 669, 360, 669, 359, 96, 669, 96, 669, 96, 96, - 96, 669, 96, 669, 669, 669, 96, 96, 96, 96, - 96, 361, 669, 96, 96, 96, 362, 96, 96, 669, - 96, 669, 669, 364, 96, 669, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 669, 96, 96, - 669, 96, 669, 669, 669, 96, 669, 96, 96, 96, - 96, 96, 96, 366, 96, 96, 96, 96, 363, 96, - 96, 669, 368, 669, 669, 669, 96, 96, 96, 96, - 96, 96, 669, 96, 669, 367, 669, 96, 96, 96, - 96, 96, 669, 669, 669, 669, 96, 669, 669, 669, - - 96, 96, 96, 669, 96, 669, 669, 370, 669, 96, - 669, 96, 369, 96, 96, 96, 669, 96, 376, 669, - 96, 669, 669, 669, 96, 669, 96, 96, 96, 96, - 669, 96, 375, 96, 377, 96, 96, 669, 96, 669, - 379, 96, 669, 669, 669, 96, 669, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 669, 96, 96, 380, - 96, 96, 669, 669, 381, 669, 669, 669, 96, 96, - 96, 96, 96, 96, 669, 96, 669, 96, 669, 96, - 96, 96, 96, 96, 383, 96, 669, 669, 96, 669, - 669, 669, 96, 96, 382, 96, 96, 96, 669, 96, - - 384, 96, 669, 96, 96, 96, 96, 96, 669, 669, - 669, 669, 96, 669, 96, 669, 385, 386, 96, 669, - 96, 387, 669, 669, 96, 96, 96, 96, 96, 388, - 669, 669, 669, 96, 669, 96, 669, 96, 389, 96, - 669, 96, 390, 96, 669, 96, 96, 96, 669, 96, - 669, 96, 669, 96, 96, 96, 669, 96, 669, 391, - 669, 96, 96, 96, 669, 96, 96, 393, 669, 392, - 96, 669, 96, 669, 669, 669, 96, 669, 96, 669, - 96, 669, 96, 96, 96, 96, 96, 669, 669, 96, - 394, 96, 669, 96, 669, 96, 669, 96, 669, 96, - - 395, 396, 96, 96, 96, 96, 669, 669, 96, 669, - 669, 669, 400, 669, 96, 96, 96, 96, 96, 96, - 669, 669, 96, 96, 96, 96, 401, 669, 402, 669, - 669, 669, 96, 669, 96, 96, 96, 96, 669, 96, - 403, 96, 96, 96, 96, 404, 669, 669, 669, 669, - 669, 669, 96, 96, 405, 96, 96, 96, 96, 669, - 669, 96, 96, 669, 96, 669, 669, 407, 96, 669, - 96, 669, 96, 669, 96, 96, 96, 406, 96, 409, - 669, 669, 410, 96, 669, 96, 96, 96, 669, 96, - 669, 669, 408, 669, 96, 669, 96, 96, 96, 669, - - 96, 669, 669, 96, 669, 96, 669, 96, 669, 96, - 669, 96, 669, 96, 96, 96, 96, 96, 669, 669, - 96, 412, 96, 669, 96, 669, 96, 669, 96, 669, - 96, 96, 413, 96, 96, 669, 669, 669, 669, 96, - 669, 96, 96, 96, 669, 96, 669, 415, 96, 416, - 96, 669, 96, 669, 96, 669, 96, 669, 96, 96, - 417, 96, 96, 669, 669, 669, 669, 96, 669, 96, - 669, 96, 96, 96, 669, 96, 669, 418, 96, 420, - 669, 669, 96, 96, 96, 96, 96, 421, 422, 96, - 669, 96, 669, 96, 96, 96, 96, 96, 669, 669, - - 669, 669, 96, 669, 669, 669, 96, 96, 96, 669, - 96, 669, 669, 96, 425, 96, 669, 96, 423, 96, - 669, 96, 669, 96, 669, 96, 96, 96, 96, 96, - 669, 427, 96, 669, 669, 669, 669, 669, 96, 96, - 96, 96, 96, 96, 96, 428, 669, 96, 96, 669, - 96, 669, 669, 669, 96, 669, 96, 669, 96, 669, - 96, 669, 96, 96, 96, 435, 96, 669, 669, 96, - 669, 669, 96, 669, 669, 669, 96, 669, 96, 669, - 96, 669, 96, 96, 96, 96, 96, 669, 430, 96, - 436, 96, 669, 96, 669, 438, 669, 96, 669, 96, - - 96, 96, 96, 96, 669, 669, 96, 439, 96, 440, - 96, 669, 96, 669, 96, 669, 96, 96, 96, 96, - 96, 669, 669, 96, 441, 96, 669, 96, 669, 96, - 669, 96, 669, 96, 96, 442, 96, 96, 669, 669, - 669, 669, 96, 669, 96, 96, 96, 444, 96, 669, - 669, 96, 443, 96, 669, 96, 669, 96, 669, 96, - 669, 96, 669, 96, 96, 96, 669, 669, 96, 445, - 96, 446, 669, 669, 96, 669, 447, 669, 96, 669, - 96, 669, 96, 669, 96, 96, 96, 96, 96, 669, - 449, 96, 669, 96, 669, 96, 669, 448, 669, 96, - - 669, 96, 96, 96, 96, 96, 669, 669, 96, 669, - 96, 669, 96, 669, 96, 450, 96, 669, 96, 96, - 96, 96, 96, 669, 669, 96, 669, 96, 669, 96, - 669, 96, 452, 96, 669, 96, 451, 96, 96, 96, - 453, 96, 96, 669, 96, 669, 457, 669, 669, 669, - 669, 96, 96, 96, 96, 96, 96, 96, 669, 669, - 96, 96, 669, 96, 458, 459, 669, 96, 669, 96, - 669, 96, 669, 96, 96, 96, 96, 96, 669, 669, - 96, 669, 96, 461, 96, 669, 96, 669, 96, 669, - 96, 460, 96, 96, 96, 96, 462, 669, 669, 96, - - 669, 96, 463, 669, 669, 96, 669, 96, 669, 96, - 669, 96, 96, 96, 96, 96, 669, 669, 669, 669, - 96, 669, 96, 669, 96, 669, 96, 96, 464, 669, - 465, 96, 669, 96, 669, 669, 669, 96, 669, 96, - 669, 96, 669, 96, 96, 96, 96, 96, 669, 669, - 466, 467, 96, 669, 96, 96, 96, 669, 96, 669, - 469, 96, 669, 96, 669, 96, 669, 96, 669, 96, - 669, 96, 96, 96, 96, 96, 669, 669, 96, 669, - 96, 669, 96, 669, 471, 669, 96, 669, 96, 96, - 472, 96, 96, 669, 669, 669, 669, 96, 669, 96, - - 669, 96, 96, 96, 669, 474, 669, 473, 96, 669, - 96, 669, 96, 669, 96, 669, 96, 669, 669, 669, - 96, 96, 96, 669, 96, 96, 477, 669, 96, 96, - 476, 96, 669, 669, 669, 96, 669, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 479, 96, - 96, 669, 96, 669, 669, 669, 96, 669, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 481, - 669, 96, 669, 669, 669, 669, 669, 96, 669, 96, - 96, 96, 669, 96, 669, 488, 96, 489, 669, 669, - 96, 669, 96, 96, 96, 96, 669, 96, 96, 96, - - 669, 491, 96, 669, 96, 669, 669, 669, 96, 669, - 96, 669, 96, 669, 96, 96, 492, 96, 96, 669, - 669, 96, 669, 96, 669, 96, 669, 493, 494, 96, - 669, 96, 96, 96, 96, 96, 669, 669, 96, 669, - 96, 669, 96, 669, 96, 669, 96, 669, 96, 96, - 96, 96, 96, 669, 669, 669, 495, 96, 669, 96, - 96, 96, 496, 96, 669, 669, 96, 669, 96, 669, - 96, 669, 96, 669, 96, 669, 96, 96, 96, 96, - 96, 669, 497, 96, 669, 96, 669, 96, 669, 96, - 669, 96, 669, 96, 96, 96, 96, 96, 669, 669, - - 669, 498, 96, 669, 96, 96, 96, 669, 96, 669, - 669, 500, 499, 96, 669, 96, 669, 96, 669, 96, - 669, 96, 96, 96, 96, 96, 669, 669, 96, 669, - 96, 669, 501, 669, 96, 506, 96, 669, 96, 96, - 96, 96, 96, 669, 669, 669, 669, 96, 669, 96, - 96, 96, 669, 96, 669, 669, 96, 507, 96, 669, - 96, 669, 96, 669, 96, 669, 96, 96, 96, 96, - 96, 669, 669, 96, 669, 96, 509, 96, 669, 96, - 669, 96, 669, 96, 508, 96, 96, 96, 96, 96, - 669, 669, 96, 669, 669, 669, 669, 669, 96, 96, - - 96, 96, 96, 96, 96, 511, 510, 96, 96, 669, - 96, 669, 669, 669, 96, 669, 96, 669, 96, 669, - 96, 96, 96, 96, 96, 669, 669, 96, 669, 96, - 669, 96, 669, 513, 669, 96, 669, 515, 96, 96, - 96, 96, 669, 669, 669, 669, 96, 669, 96, 96, - 96, 669, 96, 517, 512, 96, 669, 96, 669, 96, - 669, 96, 669, 96, 669, 96, 96, 96, 96, 96, - 669, 669, 96, 669, 96, 519, 96, 669, 96, 669, - 96, 669, 96, 669, 96, 96, 96, 96, 669, 669, - 520, 96, 669, 96, 669, 669, 522, 96, 669, 96, - - 669, 96, 669, 96, 669, 96, 96, 96, 524, 96, - 96, 669, 96, 669, 669, 669, 669, 530, 669, 96, - 96, 96, 96, 96, 96, 96, 531, 669, 96, 96, - 669, 96, 669, 669, 669, 96, 669, 96, 669, 96, - 669, 96, 96, 96, 96, 96, 669, 533, 669, 669, - 96, 669, 96, 669, 96, 96, 96, 669, 535, 669, - 534, 96, 669, 96, 669, 96, 96, 96, 669, 96, - 669, 669, 538, 96, 96, 536, 96, 96, 96, 537, - 96, 96, 96, 669, 96, 96, 669, 96, 669, 669, - 669, 96, 669, 96, 96, 96, 96, 96, 96, 96, - - 96, 96, 96, 96, 669, 539, 96, 669, 96, 669, - 669, 669, 96, 669, 96, 540, 96, 669, 96, 96, - 96, 96, 96, 669, 669, 96, 669, 96, 545, 96, - 669, 96, 669, 96, 669, 96, 96, 96, 96, 96, - 669, 669, 96, 669, 96, 669, 96, 669, 96, 669, - 96, 669, 96, 96, 96, 96, 96, 669, 669, 96, - 669, 96, 669, 96, 669, 96, 546, 96, 669, 96, - 96, 96, 96, 96, 669, 669, 669, 669, 96, 669, - 96, 96, 96, 669, 96, 549, 669, 96, 547, 96, - 669, 96, 669, 96, 554, 96, 669, 96, 96, 96, - - 96, 96, 669, 669, 669, 552, 96, 669, 96, 96, - 96, 669, 96, 669, 669, 96, 669, 96, 669, 96, - 669, 96, 669, 96, 669, 96, 96, 96, 96, 96, - 669, 669, 96, 669, 96, 669, 96, 669, 556, 669, - 96, 669, 558, 96, 96, 96, 96, 669, 669, 96, - 669, 96, 669, 96, 669, 96, 564, 96, 669, 96, - 96, 96, 96, 96, 669, 669, 96, 669, 96, 669, - 96, 669, 96, 669, 96, 669, 96, 669, 96, 96, - 96, 96, 96, 565, 566, 96, 567, 669, 669, 669, - 669, 96, 96, 96, 96, 96, 96, 96, 96, 569, - - 96, 96, 669, 669, 669, 669, 669, 96, 96, 568, - 96, 96, 96, 96, 96, 570, 96, 96, 669, 669, - 669, 669, 669, 96, 571, 96, 96, 96, 96, 96, - 669, 669, 96, 96, 669, 669, 669, 96, 669, 96, - 669, 96, 669, 96, 669, 575, 669, 96, 96, 96, - 576, 96, 96, 96, 669, 669, 96, 669, 669, 577, - 579, 669, 96, 96, 96, 96, 96, 96, 96, 669, - 669, 96, 96, 669, 669, 669, 96, 669, 96, 669, - 582, 669, 96, 669, 96, 669, 96, 96, 96, 584, - 96, 669, 669, 669, 96, 96, 96, 96, 96, 669, - - 96, 669, 585, 96, 669, 669, 669, 96, 96, 96, - 96, 96, 592, 669, 96, 669, 96, 669, 96, 96, - 96, 96, 96, 669, 96, 669, 669, 96, 669, 669, - 669, 96, 96, 96, 96, 96, 96, 669, 96, 669, - 96, 669, 96, 96, 96, 96, 96, 669, 669, 593, - 669, 96, 669, 96, 669, 96, 669, 96, 594, 96, - 669, 96, 669, 96, 96, 96, 669, 96, 595, 96, - 669, 96, 96, 96, 669, 96, 669, 96, 669, 96, - 96, 96, 669, 96, 669, 96, 669, 96, 96, 599, - 669, 96, 669, 96, 669, 96, 96, 96, 600, 96, - - 669, 96, 669, 96, 96, 602, 669, 96, 605, 96, - 669, 96, 96, 96, 669, 96, 607, 96, 669, 96, - 96, 96, 669, 96, 608, 96, 669, 96, 96, 96, - 669, 96, 669, 96, 669, 96, 96, 96, 669, 96, - 669, 96, 669, 96, 96, 96, 669, 96, 669, 96, - 669, 96, 96, 614, 669, 96, 669, 669, 669, 96, - 96, 96, 96, 96, 669, 669, 669, 615, 96, 669, - 96, 669, 96, 669, 96, 669, 96, 669, 96, 619, - 96, 96, 620, 669, 96, 622, 96, 669, 96, 96, - 96, 669, 96, 669, 669, 669, 96, 96, 96, 96, - - 96, 627, 96, 669, 625, 96, 628, 669, 669, 96, - 96, 96, 96, 96, 96, 669, 96, 669, 96, 669, - 96, 96, 96, 96, 96, 669, 96, 669, 634, 96, - 669, 669, 669, 96, 669, 96, 96, 96, 96, 96, - 96, 669, 96, 669, 669, 96, 635, 96, 669, 96, - 96, 96, 669, 96, 669, 669, 669, 96, 96, 96, - 96, 96, 96, 669, 96, 639, 96, 96, 96, 96, - 669, 669, 669, 642, 669, 644, 669, 96, 96, 96, - 96, 96, 96, 96, 96, 669, 96, 96, 669, 669, - 669, 669, 669, 96, 96, 96, 96, 96, 96, 650, - - 96, 96, 96, 96, 669, 669, 669, 669, 669, 669, - 96, 96, 96, 96, 96, 96, 669, 669, 96, 96, - 96, 655, 669, 652, 669, 669, 96, 669, 96, 669, - 96, 669, 96, 669, 96, 669, 96, 96, 96, 659, - 96, 669, 96, 669, 96, 96, 96, 669, 96, 669, - 96, 669, 96, 96, 96, 669, 96, 669, 663, 669, - 666, 96, 96, 96, 96, 669, 96, 669, 669, 96, - 669, 669, 669, 96, 669, 96, 96, 96, 96, 669, - 96, 669, 96, 669, 669, 96, 53, 53, 53, 53, - 53, 53, 53, 53, 53, 53, 53, 57, 57, 57, - - 57, 57, 57, 57, 57, 57, 57, 57, 61, 61, - 61, 61, 61, 61, 61, 61, 61, 61, 61, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 82, 82, 82, 669, 82, 82, 82, 82, - 82, 82, 82, 89, 89, 669, 669, 89, 669, 89, - 153, 153, 669, 153, 154, 154, 669, 154, 154, 154, - 669, 154, 154, 154, 154, 157, 157, 157, 669, 157, - 157, 157, 157, 157, 157, 157, 159, 159, 159, 159, - - 159, 159, 159, 159, 669, 159, 161, 669, 669, 161, - 161, 161, 161, 161, 161, 161, 162, 669, 669, 162, - 162, 162, 162, 162, 162, 162, 164, 669, 669, 164, - 669, 164, 164, 164, 164, 164, 168, 168, 669, 168, - 169, 169, 669, 169, 102, 102, 669, 102, 15, 669, - 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, - 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, - 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, - 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, - 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, - - 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, - 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, - 669, 669, 669, 669, 669, 669 + 670, 96, 96, 670, 283, 670, 670, 670, 281, 670, + 96, 96, 96, 96, 670, 96, 96, 96, 670, 284, + + 96, 670, 96, 670, 670, 670, 96, 670, 96, 285, + 96, 670, 96, 96, 96, 96, 96, 670, 670, 670, + 670, 96, 670, 96, 96, 96, 670, 96, 670, 670, + 96, 287, 96, 670, 96, 670, 96, 670, 96, 670, + 96, 96, 96, 96, 96, 670, 670, 288, 670, 96, + 670, 96, 96, 96, 670, 96, 670, 670, 289, 670, + 96, 670, 96, 96, 96, 670, 96, 670, 293, 96, + 670, 96, 290, 292, 670, 96, 670, 96, 670, 96, + 96, 96, 96, 96, 670, 670, 96, 670, 96, 670, + 96, 670, 96, 670, 96, 670, 96, 670, 96, 294, + + 96, 96, 96, 670, 295, 96, 670, 670, 670, 296, + 670, 96, 96, 96, 96, 96, 96, 96, 670, 670, + 96, 96, 670, 670, 670, 670, 670, 96, 96, 96, + 670, 96, 670, 670, 96, 297, 96, 670, 96, 670, + 96, 670, 96, 670, 96, 298, 96, 96, 96, 96, + 670, 299, 300, 96, 670, 96, 670, 670, 301, 96, + 670, 96, 670, 96, 670, 96, 96, 96, 96, 96, + 670, 670, 670, 670, 96, 670, 96, 96, 96, 303, + 96, 304, 307, 670, 670, 96, 305, 96, 96, 96, + 670, 96, 670, 670, 670, 306, 96, 670, 96, 96, + + 96, 670, 96, 670, 670, 311, 670, 96, 670, 96, + 96, 96, 670, 96, 670, 670, 96, 670, 96, 670, + 96, 670, 313, 314, 96, 670, 96, 96, 96, 96, + 96, 670, 670, 96, 670, 96, 670, 96, 315, 96, + 670, 96, 670, 96, 96, 316, 96, 96, 670, 670, + 96, 670, 96, 318, 96, 670, 96, 670, 96, 670, + 96, 670, 96, 96, 96, 319, 96, 96, 320, 96, + 670, 670, 670, 670, 670, 670, 96, 96, 96, 96, + 96, 96, 96, 670, 670, 96, 96, 670, 317, 670, + 96, 670, 96, 670, 96, 670, 96, 670, 96, 321, + + 96, 96, 96, 322, 96, 670, 670, 670, 96, 96, + 96, 96, 96, 324, 96, 670, 323, 96, 670, 670, + 670, 96, 96, 96, 96, 96, 96, 670, 96, 670, + 325, 670, 96, 96, 326, 96, 96, 327, 96, 670, + 328, 96, 670, 670, 670, 96, 670, 96, 96, 96, + 96, 670, 96, 96, 96, 670, 329, 96, 670, 96, + 670, 670, 670, 96, 670, 96, 670, 96, 670, 96, + 96, 96, 96, 330, 670, 670, 96, 331, 96, 670, + 96, 670, 96, 670, 96, 670, 96, 96, 96, 96, + 96, 670, 332, 670, 670, 96, 670, 96, 670, 333, + + 670, 96, 96, 334, 670, 335, 96, 670, 96, 670, + 670, 670, 96, 670, 96, 670, 96, 670, 96, 96, + 96, 96, 96, 670, 670, 96, 670, 96, 670, 96, + 670, 96, 670, 96, 670, 96, 670, 96, 96, 96, + 96, 96, 670, 339, 96, 670, 670, 340, 670, 670, + 96, 96, 96, 96, 96, 96, 96, 341, 670, 96, + 96, 343, 96, 338, 670, 670, 96, 670, 96, 670, + 96, 347, 96, 670, 96, 342, 96, 96, 344, 670, + 96, 96, 345, 670, 670, 670, 670, 96, 96, 96, + 96, 96, 96, 346, 96, 670, 96, 670, 96, 96, + + 96, 96, 96, 670, 670, 348, 670, 96, 670, 96, + 350, 96, 96, 96, 670, 96, 670, 670, 670, 96, + 96, 96, 96, 96, 96, 96, 96, 670, 96, 670, + 351, 96, 670, 96, 355, 96, 354, 96, 352, 96, + 670, 670, 670, 96, 96, 96, 670, 96, 96, 96, + 670, 356, 96, 670, 670, 670, 670, 670, 96, 96, + 96, 96, 96, 96, 357, 96, 96, 96, 96, 670, + 670, 670, 670, 670, 670, 96, 96, 96, 96, 96, + 96, 96, 670, 670, 96, 96, 670, 670, 670, 670, + 670, 96, 670, 96, 96, 96, 670, 360, 670, 359, + + 96, 670, 96, 670, 96, 96, 96, 670, 96, 670, + 670, 670, 96, 96, 96, 96, 96, 361, 670, 96, + 96, 96, 362, 96, 96, 670, 96, 670, 670, 364, + 96, 670, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 670, 96, 96, 670, 96, 670, 670, + 670, 96, 670, 96, 96, 96, 96, 96, 96, 366, + 96, 96, 96, 96, 363, 96, 96, 670, 368, 670, + 670, 670, 96, 96, 96, 96, 96, 96, 670, 96, + 670, 367, 670, 96, 96, 96, 96, 96, 670, 670, + 670, 670, 96, 670, 670, 670, 96, 96, 96, 670, + + 96, 670, 670, 370, 670, 96, 670, 96, 369, 96, + 96, 96, 670, 96, 376, 670, 96, 670, 670, 670, + 96, 670, 96, 96, 96, 96, 670, 96, 375, 96, + 377, 96, 96, 670, 96, 670, 379, 96, 670, 670, + 670, 96, 670, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 670, 96, 96, 380, 96, 96, 670, 670, + 381, 670, 670, 670, 96, 96, 96, 96, 96, 96, + 670, 96, 670, 96, 670, 96, 96, 96, 96, 96, + 670, 670, 670, 670, 96, 670, 96, 670, 96, 670, + 382, 670, 96, 670, 96, 670, 96, 96, 96, 670, + + 96, 384, 383, 670, 96, 96, 96, 96, 96, 670, + 670, 670, 670, 96, 670, 96, 670, 385, 386, 96, + 670, 96, 387, 670, 670, 96, 96, 96, 96, 96, + 388, 670, 670, 670, 96, 670, 96, 670, 96, 389, + 96, 670, 96, 390, 96, 670, 96, 96, 96, 670, + 96, 670, 96, 670, 96, 96, 96, 670, 96, 670, + 391, 670, 96, 96, 96, 670, 96, 96, 393, 670, + 392, 96, 670, 96, 670, 670, 670, 96, 670, 96, + 670, 96, 670, 96, 96, 96, 96, 96, 670, 670, + 96, 394, 96, 670, 96, 670, 96, 670, 96, 670, + + 96, 395, 396, 96, 96, 96, 96, 670, 670, 96, + 670, 670, 670, 400, 670, 96, 96, 96, 96, 96, + 96, 670, 670, 96, 96, 96, 96, 401, 670, 402, + 670, 670, 670, 96, 670, 96, 96, 96, 96, 670, + 96, 403, 96, 96, 96, 96, 404, 670, 670, 670, + 670, 670, 670, 96, 96, 405, 96, 96, 96, 96, + 670, 670, 96, 96, 670, 96, 670, 670, 407, 96, + 670, 96, 670, 96, 670, 96, 96, 96, 406, 96, + 409, 670, 670, 410, 96, 670, 96, 96, 96, 670, + 96, 670, 670, 408, 670, 96, 670, 96, 96, 96, + + 670, 96, 670, 670, 96, 670, 96, 670, 96, 670, + 96, 670, 96, 670, 96, 96, 96, 96, 96, 670, + 670, 96, 412, 96, 670, 96, 670, 96, 670, 96, + 670, 96, 96, 413, 96, 96, 670, 670, 670, 670, + 96, 670, 96, 96, 96, 670, 96, 670, 415, 96, + 416, 96, 670, 96, 670, 96, 670, 96, 670, 96, + 96, 417, 96, 96, 670, 670, 670, 670, 96, 670, + 96, 670, 96, 96, 96, 670, 96, 670, 418, 96, + 420, 670, 670, 96, 96, 96, 96, 96, 421, 422, + 96, 670, 96, 670, 96, 96, 96, 96, 96, 670, + + 670, 670, 670, 96, 670, 670, 670, 96, 96, 96, + 670, 96, 670, 670, 96, 425, 96, 670, 96, 423, + 96, 670, 96, 670, 96, 670, 96, 96, 96, 96, + 96, 670, 427, 96, 670, 670, 670, 670, 670, 96, + 96, 96, 96, 96, 96, 96, 428, 670, 96, 96, + 670, 96, 670, 670, 670, 96, 670, 96, 670, 96, + 670, 96, 670, 96, 96, 96, 435, 96, 670, 670, + 96, 670, 670, 96, 670, 670, 670, 96, 670, 96, + 670, 96, 670, 96, 96, 96, 96, 96, 670, 430, + 96, 436, 96, 670, 96, 670, 438, 670, 96, 670, + + 96, 96, 96, 96, 96, 670, 670, 96, 439, 96, + 440, 96, 670, 96, 670, 96, 670, 96, 670, 96, + 96, 96, 441, 96, 96, 670, 96, 670, 670, 670, + 670, 670, 670, 96, 96, 96, 442, 96, 96, 96, + 670, 670, 96, 96, 670, 670, 670, 670, 670, 96, + 96, 96, 444, 96, 670, 670, 96, 443, 96, 670, + 96, 670, 96, 670, 96, 670, 96, 670, 96, 96, + 96, 670, 670, 96, 445, 96, 446, 670, 670, 96, + 670, 447, 670, 96, 670, 96, 670, 96, 670, 96, + 96, 96, 96, 96, 670, 449, 96, 670, 96, 670, + + 96, 670, 448, 670, 96, 670, 96, 96, 96, 96, + 96, 670, 670, 96, 670, 96, 670, 96, 670, 96, + 450, 96, 670, 96, 96, 96, 96, 96, 670, 670, + 96, 670, 96, 670, 96, 670, 96, 452, 96, 670, + 96, 451, 96, 96, 96, 453, 96, 96, 670, 96, + 670, 457, 670, 670, 670, 670, 96, 96, 96, 96, + 96, 96, 96, 670, 670, 96, 96, 670, 96, 458, + 459, 670, 96, 670, 96, 670, 96, 670, 96, 96, + 96, 96, 96, 670, 670, 96, 670, 96, 461, 96, + 670, 96, 670, 96, 670, 96, 460, 96, 96, 96, + + 96, 462, 670, 670, 96, 670, 96, 463, 670, 670, + 96, 670, 96, 670, 96, 670, 96, 96, 96, 96, + 96, 670, 670, 670, 670, 96, 670, 96, 670, 96, + 670, 96, 96, 464, 670, 465, 96, 670, 96, 670, + 670, 670, 96, 670, 96, 670, 96, 670, 96, 96, + 96, 96, 96, 670, 670, 466, 467, 96, 670, 96, + 96, 96, 670, 96, 670, 469, 96, 670, 96, 670, + 96, 670, 96, 670, 96, 670, 96, 96, 96, 96, + 96, 670, 670, 96, 670, 96, 670, 96, 670, 471, + 670, 96, 670, 96, 96, 472, 96, 96, 670, 670, + + 670, 670, 96, 670, 96, 670, 96, 96, 96, 670, + 474, 670, 473, 96, 670, 96, 670, 96, 670, 96, + 670, 96, 670, 670, 670, 96, 96, 96, 670, 96, + 96, 477, 670, 96, 96, 476, 96, 670, 670, 670, + 96, 670, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 479, 96, 96, 670, 96, 670, 670, + 670, 96, 670, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 481, 670, 96, 670, 670, 670, + 670, 670, 96, 670, 96, 96, 96, 670, 96, 670, + 488, 96, 489, 670, 670, 96, 670, 96, 96, 96, + + 96, 670, 96, 96, 96, 670, 491, 96, 670, 96, + 670, 670, 670, 96, 670, 96, 670, 96, 670, 96, + 96, 492, 96, 96, 670, 670, 96, 493, 96, 670, + 96, 670, 96, 494, 96, 670, 96, 96, 96, 96, + 96, 670, 670, 96, 670, 96, 670, 96, 670, 96, + 670, 96, 670, 96, 96, 96, 96, 96, 670, 670, + 670, 495, 96, 670, 96, 96, 96, 496, 96, 670, + 670, 96, 670, 96, 670, 96, 670, 96, 670, 96, + 670, 96, 96, 96, 96, 96, 670, 497, 96, 670, + 96, 670, 96, 670, 96, 670, 96, 670, 96, 96, + + 96, 96, 96, 670, 670, 670, 498, 96, 670, 96, + 96, 96, 670, 96, 670, 670, 500, 499, 96, 670, + 96, 670, 96, 670, 96, 670, 96, 96, 96, 96, + 96, 670, 670, 96, 670, 96, 670, 501, 670, 96, + 506, 96, 670, 96, 96, 96, 96, 96, 670, 670, + 670, 670, 96, 670, 96, 96, 96, 670, 96, 670, + 670, 96, 507, 96, 670, 96, 670, 96, 670, 96, + 670, 96, 96, 96, 96, 96, 670, 670, 96, 670, + 96, 509, 96, 670, 96, 670, 96, 670, 96, 508, + 96, 96, 96, 96, 96, 670, 670, 96, 670, 670, + + 670, 670, 670, 96, 96, 96, 96, 96, 96, 96, + 511, 510, 96, 96, 670, 96, 670, 670, 670, 96, + 670, 96, 670, 96, 670, 96, 96, 96, 96, 96, + 670, 670, 96, 670, 96, 670, 96, 670, 513, 670, + 96, 670, 515, 96, 96, 96, 96, 670, 670, 670, + 670, 96, 670, 96, 96, 96, 670, 96, 517, 512, + 96, 670, 96, 670, 96, 670, 96, 670, 96, 670, + 96, 96, 96, 96, 96, 670, 670, 96, 670, 96, + 519, 96, 670, 96, 670, 96, 670, 96, 670, 96, + 96, 96, 96, 670, 670, 520, 96, 670, 96, 670, + + 670, 522, 96, 670, 96, 670, 96, 670, 96, 670, + 96, 96, 96, 524, 96, 96, 670, 96, 670, 670, + 670, 670, 530, 670, 96, 96, 96, 96, 96, 96, + 96, 531, 670, 96, 96, 670, 96, 670, 670, 670, + 96, 670, 96, 670, 96, 670, 96, 96, 96, 96, + 96, 670, 533, 670, 670, 96, 670, 96, 96, 96, + 670, 96, 670, 670, 96, 534, 96, 670, 96, 670, + 535, 670, 96, 670, 96, 96, 536, 96, 96, 670, + 670, 96, 538, 96, 670, 96, 670, 96, 537, 96, + 670, 96, 670, 96, 96, 96, 96, 96, 670, 539, + + 96, 670, 670, 670, 670, 670, 96, 96, 96, 96, + 96, 96, 96, 96, 670, 96, 96, 670, 670, 670, + 540, 670, 96, 96, 96, 96, 96, 96, 96, 670, + 670, 96, 96, 670, 96, 670, 670, 545, 96, 670, + 96, 670, 96, 670, 96, 96, 96, 96, 96, 670, + 670, 96, 670, 96, 670, 96, 670, 96, 670, 96, + 670, 96, 96, 96, 96, 96, 670, 670, 96, 670, + 96, 670, 96, 670, 96, 546, 96, 670, 96, 96, + 96, 96, 96, 670, 670, 670, 670, 96, 670, 96, + 96, 96, 670, 96, 549, 670, 96, 547, 96, 670, + + 96, 670, 96, 554, 96, 670, 96, 96, 96, 96, + 96, 670, 670, 670, 552, 96, 670, 96, 96, 96, + 670, 96, 670, 670, 96, 670, 96, 670, 96, 670, + 96, 670, 96, 670, 96, 96, 96, 96, 96, 670, + 670, 96, 670, 96, 670, 96, 670, 556, 670, 96, + 670, 558, 96, 96, 96, 96, 670, 670, 96, 670, + 96, 670, 96, 670, 96, 564, 96, 670, 96, 96, + 96, 96, 96, 670, 670, 96, 670, 96, 670, 96, + 670, 96, 670, 96, 670, 96, 670, 96, 96, 96, + 96, 96, 565, 566, 96, 670, 567, 670, 670, 670, + + 96, 96, 96, 96, 96, 96, 96, 96, 569, 96, + 96, 670, 670, 670, 670, 670, 96, 96, 568, 96, + 96, 96, 96, 96, 570, 96, 96, 670, 670, 670, + 670, 670, 96, 571, 96, 96, 96, 96, 96, 670, + 670, 96, 96, 670, 670, 670, 96, 670, 96, 670, + 96, 670, 96, 670, 575, 670, 96, 96, 96, 576, + 96, 96, 96, 670, 670, 96, 670, 670, 577, 579, + 670, 96, 96, 96, 96, 96, 96, 96, 670, 670, + 96, 96, 670, 670, 670, 96, 670, 96, 670, 582, + 670, 96, 670, 96, 670, 96, 96, 96, 584, 96, + + 670, 670, 670, 96, 96, 96, 96, 96, 670, 96, + 670, 585, 96, 670, 670, 670, 96, 96, 96, 96, + 96, 592, 670, 96, 670, 96, 670, 96, 96, 96, + 96, 96, 593, 96, 670, 670, 96, 670, 670, 670, + 96, 96, 96, 96, 96, 96, 670, 96, 670, 96, + 670, 96, 96, 96, 96, 96, 670, 670, 594, 670, + 96, 670, 96, 670, 96, 670, 96, 595, 96, 670, + 96, 670, 96, 96, 96, 670, 96, 596, 96, 670, + 96, 96, 96, 670, 96, 670, 96, 670, 96, 96, + 96, 670, 96, 670, 96, 670, 96, 96, 600, 670, + + 96, 670, 96, 670, 96, 96, 96, 601, 96, 670, + 96, 670, 96, 96, 603, 670, 96, 606, 96, 670, + 96, 96, 96, 670, 96, 608, 96, 670, 96, 96, + 96, 670, 96, 609, 96, 670, 96, 96, 96, 670, + 96, 670, 96, 670, 96, 96, 96, 670, 96, 670, + 96, 670, 96, 96, 96, 670, 96, 670, 96, 670, + 96, 96, 96, 670, 96, 670, 96, 670, 96, 96, + 615, 670, 96, 670, 670, 670, 96, 96, 96, 96, + 96, 670, 670, 670, 616, 96, 670, 96, 670, 96, + 670, 96, 670, 96, 670, 96, 620, 96, 96, 621, + + 670, 96, 623, 96, 670, 96, 96, 96, 670, 96, + 670, 670, 670, 96, 96, 96, 96, 96, 628, 96, + 670, 626, 96, 629, 670, 670, 96, 96, 96, 96, + 96, 96, 670, 96, 670, 96, 670, 96, 96, 96, + 96, 96, 670, 96, 670, 635, 96, 670, 670, 670, + 96, 670, 96, 96, 96, 96, 96, 96, 670, 96, + 670, 670, 96, 636, 96, 670, 96, 96, 96, 670, + 96, 670, 670, 670, 96, 96, 96, 96, 96, 96, + 670, 96, 640, 96, 96, 96, 96, 670, 670, 670, + 643, 670, 645, 670, 96, 96, 96, 96, 96, 96, + + 96, 96, 670, 96, 96, 670, 670, 670, 670, 670, + 96, 96, 96, 96, 96, 96, 651, 96, 96, 96, + 96, 670, 670, 670, 670, 670, 670, 96, 96, 96, + 96, 96, 96, 670, 670, 96, 96, 96, 656, 670, + 653, 670, 670, 96, 670, 96, 670, 96, 670, 96, + 670, 96, 670, 96, 96, 96, 660, 96, 670, 96, + 670, 96, 96, 96, 670, 96, 670, 96, 670, 96, + 96, 96, 670, 96, 670, 664, 670, 667, 96, 96, + 96, 96, 670, 96, 670, 670, 96, 670, 670, 670, + 96, 670, 96, 96, 96, 96, 670, 96, 670, 96, + + 670, 670, 96, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 82, + 82, 82, 670, 82, 82, 82, 82, 82, 82, 82, + 89, 89, 670, 670, 89, 670, 89, 153, 153, 670, + 153, 154, 154, 670, 154, 154, 154, 670, 154, 154, + + 154, 154, 157, 157, 157, 670, 157, 157, 157, 157, + 157, 157, 157, 159, 159, 159, 159, 159, 159, 159, + 159, 670, 159, 161, 670, 670, 161, 161, 161, 161, + 161, 161, 161, 162, 670, 670, 162, 162, 162, 162, + 162, 162, 162, 164, 670, 670, 164, 670, 164, 164, + 164, 164, 164, 168, 168, 670, 168, 169, 169, 670, + 169, 102, 102, 670, 102, 15, 670, 670, 670, 670, + 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, + 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, + 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, + + 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, + 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, + 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, + 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, + 670, 670, 670 } ; -static yyconst short int yy_chk[4327] = +static yyconst short int yy_chk[4344] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -1228,32 +1231,32 @@ static yyconst short int yy_chk[4327] = 4, 5, 6, 7, 9, 3, 7, 4, 5, 6, 8, 5, 6, 8, 10, 17, 17, 17, 18, 18, - 18, 17, 9, 665, 18, 9, 26, 661, 26, 13, + 18, 17, 9, 666, 18, 9, 26, 662, 26, 13, 13, 13, 10, 151, 13, 10, 86, 22, 22, 22, - 14, 14, 14, 22, 24, 14, 151, 24, 658, 22, + 14, 14, 14, 22, 24, 14, 151, 24, 659, 22, 22, 24, 24, 24, 24, 24, 24, 28, 28, 28, - 28, 28, 28, 28, 656, 34, 86, 454, 34, 76, + 28, 28, 28, 28, 657, 34, 86, 454, 34, 76, 76, 76, 77, 77, 77, 34, 9, 34, 9, 34, - 81, 81, 81, 654, 34, 454, 10, 653, 10, 11, + 81, 81, 81, 655, 34, 454, 10, 654, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 13, 651, 13, 163, 163, 649, 170, 11, + 11, 11, 13, 652, 13, 163, 163, 650, 170, 11, 11, 11, 11, 14, 170, 14, 163, 11, 32, 242, - 242, 32, 165, 165, 165, 32, 529, 647, 32, 32, - 32, 32, 32, 38, 312, 646, 33, 32, 643, 11, + 242, 32, 165, 165, 165, 32, 529, 648, 32, 32, + 32, 32, 32, 38, 312, 647, 33, 32, 644, 11, 11, 32, 33, 38, 312, 38, 33, 38, 33, 33, - 33, 641, 38, 529, 637, 33, 91, 91, 91, 91, + 33, 642, 38, 529, 638, 33, 91, 91, 91, 91, 91, 91, 91, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 374, - 633, 35, 632, 78, 374, 631, 12, 12, 12, 12, - 630, 35, 35, 35, 12, 35, 629, 78, 36, 36, - 35, 487, 626, 35, 624, 623, 618, 617, 487, 36, - 616, 36, 613, 36, 37, 36, 12, 12, 36, 39, - - 39, 612, 39, 611, 37, 610, 37, 78, 37, 609, - 39, 39, 39, 37, 39, 606, 604, 39, 603, 39, - 12, 12, 12, 21, 601, 37, 88, 88, 88, 598, - 597, 596, 88, 591, 590, 589, 37, 21, 88, 88, + 634, 35, 633, 78, 374, 632, 12, 12, 12, 12, + 631, 35, 35, 35, 12, 35, 630, 78, 36, 36, + 35, 487, 627, 35, 625, 624, 619, 618, 487, 36, + 617, 36, 614, 36, 37, 36, 12, 12, 36, 39, + + 39, 613, 39, 612, 37, 611, 37, 78, 37, 610, + 39, 39, 39, 37, 39, 607, 605, 39, 604, 39, + 12, 12, 12, 21, 602, 37, 88, 88, 88, 599, + 598, 597, 88, 591, 590, 589, 37, 21, 88, 88, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 588, 21, 21, 21, @@ -1404,295 +1407,297 @@ static yyconst short int yy_chk[4327] = 253, 254, 255, 0, 0, 253, 254, 0, 251, 0, 256, 0, 255, 0, 255, 0, 255, 0, 257, 255, - 256, 255, 256, 256, 256, 258, 258, 0, 257, 256, - 257, 0, 257, 0, 257, 0, 258, 257, 258, 259, - 258, 0, 260, 0, 0, 258, 0, 0, 0, 259, - 0, 259, 260, 259, 260, 261, 260, 261, 259, 0, - 0, 260, 0, 0, 0, 261, 262, 261, 262, 261, - 0, 0, 263, 0, 261, 263, 262, 0, 262, 0, - 262, 0, 263, 264, 263, 262, 263, 0, 0, 265, - 0, 263, 0, 264, 0, 264, 265, 264, 0, 265, - 266, 265, 264, 265, 0, 0, 0, 0, 265, 0, - 266, 267, 266, 0, 266, 0, 266, 0, 0, 266, - - 0, 267, 0, 267, 0, 267, 268, 267, 0, 268, - 267, 0, 269, 0, 0, 0, 268, 0, 268, 0, - 268, 0, 269, 272, 269, 268, 269, 0, 0, 273, - 0, 269, 0, 272, 0, 272, 0, 272, 0, 273, - 0, 273, 272, 273, 274, 275, 0, 273, 273, 0, - 0, 274, 0, 0, 274, 275, 274, 275, 274, 275, - 276, 275, 0, 274, 275, 277, 277, 272, 0, 0, - 276, 0, 276, 0, 276, 279, 277, 0, 277, 276, - 277, 278, 277, 0, 279, 277, 278, 0, 0, 0, - 0, 278, 280, 278, 279, 278, 279, 278, 279, 0, - - 278, 0, 280, 279, 280, 281, 280, 0, 0, 280, - 0, 280, 0, 283, 283, 281, 284, 281, 0, 281, - 0, 0, 0, 283, 281, 283, 284, 283, 284, 285, - 284, 0, 283, 0, 284, 284, 0, 287, 288, 285, - 287, 285, 285, 285, 0, 0, 0, 287, 285, 287, - 0, 287, 289, 288, 0, 289, 287, 0, 0, 0, - 0, 0, 289, 288, 289, 288, 289, 288, 290, 290, - 292, 289, 288, 0, 0, 0, 0, 0, 0, 290, - 292, 290, 292, 290, 292, 293, 0, 0, 290, 292, - 0, 0, 0, 0, 0, 293, 0, 293, 294, 293, - - 0, 294, 0, 293, 293, 0, 295, 0, 294, 296, - 294, 0, 294, 0, 0, 0, 295, 294, 295, 296, - 295, 296, 0, 296, 298, 295, 297, 297, 296, 0, - 299, 0, 0, 301, 298, 0, 298, 297, 298, 297, - 299, 297, 299, 298, 299, 300, 297, 0, 301, 299, - 0, 303, 0, 0, 0, 300, 0, 300, 301, 300, - 301, 303, 301, 303, 300, 303, 304, 301, 298, 305, - 303, 0, 305, 0, 0, 0, 304, 306, 304, 305, - 304, 305, 0, 305, 0, 304, 0, 306, 305, 306, - 307, 306, 0, 0, 0, 0, 306, 0, 0, 0, - - 307, 311, 307, 0, 307, 0, 0, 307, 0, 307, - 0, 311, 306, 311, 313, 311, 0, 314, 314, 0, - 311, 0, 0, 0, 313, 0, 313, 314, 313, 314, - 0, 314, 313, 313, 315, 315, 314, 0, 316, 0, - 318, 318, 0, 0, 0, 315, 0, 315, 316, 315, - 316, 318, 316, 318, 315, 318, 0, 316, 319, 319, - 318, 320, 0, 0, 320, 0, 0, 0, 319, 321, - 319, 320, 319, 320, 0, 320, 0, 319, 0, 321, - 320, 321, 322, 321, 323, 323, 0, 0, 321, 0, - 0, 0, 322, 324, 322, 323, 322, 323, 0, 323, - - 324, 322, 0, 324, 323, 324, 325, 324, 0, 0, - 0, 0, 324, 0, 326, 0, 325, 326, 325, 0, - 325, 326, 0, 0, 326, 325, 326, 327, 326, 327, - 0, 0, 0, 326, 0, 328, 0, 327, 328, 327, - 0, 327, 328, 329, 0, 328, 327, 328, 0, 328, - 0, 330, 0, 329, 328, 329, 0, 329, 0, 329, - 0, 330, 329, 330, 0, 330, 331, 331, 0, 330, - 330, 0, 332, 0, 0, 0, 331, 0, 331, 0, - 331, 0, 332, 333, 332, 331, 332, 0, 0, 334, - 332, 332, 0, 333, 0, 333, 0, 333, 0, 334, - - 333, 334, 333, 334, 335, 339, 0, 0, 334, 0, - 0, 0, 339, 0, 335, 339, 335, 339, 335, 339, - 0, 0, 341, 335, 339, 340, 340, 0, 340, 0, - 0, 0, 341, 0, 341, 340, 341, 340, 0, 340, - 341, 341, 343, 342, 340, 342, 0, 0, 0, 0, - 0, 0, 343, 342, 343, 342, 343, 342, 344, 0, - 0, 343, 342, 0, 345, 0, 0, 345, 344, 0, - 344, 0, 344, 0, 345, 346, 345, 344, 345, 347, - 0, 0, 348, 345, 0, 346, 347, 346, 0, 346, - 0, 0, 346, 0, 346, 0, 347, 348, 347, 0, - - 347, 0, 0, 350, 0, 347, 0, 348, 0, 348, - 0, 348, 0, 350, 351, 350, 348, 350, 0, 0, - 352, 350, 350, 0, 351, 0, 351, 0, 351, 0, - 352, 354, 352, 351, 352, 0, 0, 0, 0, 352, - 0, 354, 355, 354, 0, 354, 0, 354, 356, 355, - 354, 0, 355, 0, 355, 0, 355, 0, 356, 357, - 356, 355, 356, 0, 0, 0, 0, 356, 0, 357, - 0, 357, 359, 357, 0, 360, 0, 357, 357, 359, - 0, 0, 359, 361, 359, 360, 359, 360, 361, 360, - 0, 359, 0, 361, 360, 361, 362, 361, 0, 0, - - 0, 0, 361, 0, 0, 0, 362, 364, 362, 0, - 362, 0, 0, 366, 364, 362, 0, 364, 362, 364, - 0, 364, 0, 366, 0, 366, 364, 366, 367, 368, - 0, 367, 366, 0, 0, 0, 0, 0, 367, 368, - 367, 368, 367, 368, 370, 368, 0, 367, 368, 0, - 375, 0, 0, 0, 370, 0, 370, 0, 370, 0, - 375, 0, 375, 370, 375, 376, 376, 0, 0, 375, - 0, 0, 377, 0, 0, 0, 376, 0, 376, 0, - 376, 0, 377, 379, 377, 376, 377, 0, 370, 380, - 377, 377, 0, 379, 0, 379, 0, 379, 0, 380, - - 381, 380, 379, 380, 0, 0, 382, 380, 380, 382, - 381, 0, 381, 0, 381, 0, 382, 383, 382, 381, - 382, 0, 0, 384, 383, 382, 0, 383, 0, 383, - 0, 383, 0, 384, 385, 384, 383, 384, 0, 0, - 0, 0, 384, 0, 385, 386, 385, 386, 385, 0, - 0, 387, 385, 385, 0, 386, 0, 386, 0, 386, - 0, 387, 0, 387, 386, 387, 0, 0, 388, 387, - 387, 388, 0, 0, 389, 0, 389, 0, 388, 0, - 388, 0, 388, 0, 389, 390, 389, 388, 389, 0, - 391, 391, 0, 389, 0, 390, 0, 390, 0, 390, - - 0, 391, 392, 391, 390, 391, 0, 0, 393, 0, - 391, 0, 392, 0, 392, 393, 392, 0, 393, 394, - 393, 392, 393, 0, 0, 395, 0, 393, 0, 394, - 0, 394, 395, 394, 0, 395, 394, 395, 394, 395, - 396, 396, 400, 0, 395, 0, 400, 0, 0, 0, - 0, 396, 400, 396, 400, 396, 400, 401, 0, 0, - 396, 400, 0, 402, 401, 402, 0, 401, 0, 401, - 0, 401, 0, 402, 403, 402, 401, 402, 0, 0, - 404, 0, 402, 404, 403, 0, 403, 0, 403, 0, - 404, 403, 404, 403, 404, 405, 405, 0, 0, 404, - - 0, 406, 406, 0, 0, 405, 0, 405, 0, 405, - 0, 406, 407, 406, 405, 406, 0, 0, 0, 0, - 406, 0, 407, 0, 407, 0, 407, 408, 407, 0, - 408, 407, 0, 409, 0, 0, 0, 408, 0, 408, - 0, 408, 0, 409, 410, 409, 408, 409, 0, 0, - 409, 410, 409, 0, 410, 412, 410, 0, 410, 0, - 413, 413, 0, 410, 0, 412, 0, 412, 0, 412, - 0, 413, 415, 413, 412, 413, 0, 0, 416, 0, - 413, 0, 415, 0, 415, 0, 415, 0, 416, 417, - 416, 415, 416, 0, 0, 0, 0, 416, 0, 417, - - 0, 417, 418, 417, 0, 418, 0, 417, 417, 0, - 420, 0, 418, 0, 418, 0, 418, 0, 0, 0, - 420, 418, 420, 0, 420, 421, 421, 0, 422, 420, - 420, 423, 0, 0, 0, 421, 0, 421, 422, 421, - 422, 423, 422, 423, 421, 423, 425, 422, 425, 427, - 423, 0, 428, 0, 0, 0, 425, 0, 425, 427, - 425, 427, 428, 427, 428, 425, 428, 435, 427, 428, - 0, 428, 0, 0, 0, 0, 0, 435, 0, 435, - 436, 435, 0, 438, 0, 435, 435, 436, 0, 0, - 436, 0, 436, 438, 436, 438, 0, 438, 439, 436, - - 0, 439, 438, 0, 440, 0, 0, 0, 439, 0, - 439, 0, 439, 0, 440, 441, 440, 439, 440, 0, - 0, 442, 0, 440, 0, 441, 0, 441, 442, 441, - 0, 442, 443, 442, 441, 442, 0, 0, 444, 0, - 442, 0, 443, 0, 443, 0, 443, 0, 444, 445, - 444, 443, 444, 0, 0, 0, 445, 444, 0, 445, - 446, 445, 446, 445, 0, 0, 447, 0, 445, 0, - 446, 0, 446, 0, 446, 0, 447, 448, 447, 446, - 447, 0, 448, 449, 0, 447, 0, 448, 0, 448, - 0, 448, 0, 449, 450, 449, 448, 449, 0, 0, - - 0, 449, 449, 0, 450, 451, 450, 0, 450, 0, - 0, 452, 450, 450, 0, 451, 0, 451, 0, 451, - 0, 452, 453, 452, 451, 452, 0, 0, 457, 0, - 452, 0, 453, 0, 453, 457, 453, 0, 457, 458, - 457, 453, 457, 0, 0, 0, 0, 457, 0, 458, - 459, 458, 0, 458, 0, 0, 460, 458, 458, 0, - 459, 0, 459, 0, 459, 0, 460, 461, 460, 459, - 460, 0, 0, 462, 0, 460, 462, 461, 0, 461, - 0, 461, 0, 462, 461, 462, 461, 462, 463, 464, - 0, 0, 462, 0, 0, 0, 0, 0, 463, 464, - - 463, 464, 463, 464, 465, 465, 463, 463, 464, 0, - 466, 0, 0, 0, 465, 0, 465, 0, 465, 0, - 466, 467, 466, 465, 466, 0, 0, 469, 0, 466, - 0, 467, 0, 467, 0, 467, 0, 469, 471, 469, - 467, 469, 0, 0, 0, 0, 469, 0, 471, 472, - 471, 0, 471, 472, 466, 473, 0, 471, 0, 472, - 0, 472, 0, 472, 0, 473, 474, 473, 472, 473, - 0, 0, 476, 0, 473, 476, 474, 0, 474, 0, - 474, 0, 476, 0, 476, 474, 476, 477, 0, 0, - 477, 476, 0, 479, 0, 0, 479, 477, 0, 477, - - 0, 477, 0, 479, 0, 479, 477, 479, 481, 481, - 488, 0, 479, 0, 0, 0, 0, 488, 0, 481, - 488, 481, 488, 481, 488, 489, 489, 0, 481, 488, - 0, 491, 0, 0, 0, 489, 0, 489, 0, 489, - 0, 491, 492, 491, 489, 491, 0, 491, 0, 0, - 491, 0, 492, 0, 492, 493, 492, 0, 493, 0, - 492, 492, 0, 494, 0, 493, 495, 493, 0, 493, - 0, 0, 497, 494, 493, 494, 495, 494, 495, 495, - 495, 496, 494, 0, 499, 495, 0, 497, 0, 0, - 0, 496, 0, 496, 499, 496, 499, 497, 499, 497, - - 496, 497, 498, 499, 0, 498, 497, 0, 500, 0, - 0, 0, 498, 0, 498, 500, 498, 0, 500, 501, - 500, 498, 500, 0, 0, 506, 0, 500, 506, 501, - 0, 501, 0, 501, 0, 506, 507, 506, 501, 506, - 0, 0, 508, 0, 506, 0, 507, 0, 507, 0, - 507, 0, 508, 509, 508, 507, 508, 0, 0, 510, - 0, 508, 0, 509, 0, 509, 510, 509, 0, 510, - 511, 510, 509, 510, 0, 0, 0, 0, 510, 0, - 511, 513, 511, 0, 511, 513, 0, 515, 511, 511, - 0, 513, 0, 513, 519, 513, 0, 515, 517, 515, - - 513, 515, 0, 0, 0, 517, 515, 0, 517, 519, - 517, 0, 517, 0, 0, 520, 0, 517, 0, 519, - 0, 519, 0, 519, 0, 520, 522, 520, 519, 520, - 0, 0, 524, 0, 520, 0, 522, 0, 522, 0, - 522, 0, 524, 530, 524, 522, 524, 0, 0, 531, - 0, 524, 0, 530, 0, 530, 530, 530, 0, 531, - 533, 531, 530, 531, 0, 0, 534, 0, 531, 0, - 533, 0, 533, 0, 533, 0, 534, 0, 534, 533, - 534, 536, 535, 534, 535, 534, 536, 0, 0, 0, - 0, 536, 535, 536, 535, 536, 535, 537, 538, 538, - - 536, 535, 0, 0, 0, 0, 0, 537, 538, 537, - 538, 537, 538, 539, 540, 539, 537, 538, 0, 0, - 0, 0, 0, 539, 540, 539, 540, 539, 540, 545, - 0, 0, 539, 540, 0, 0, 0, 546, 0, 545, - 0, 545, 0, 545, 0, 545, 0, 546, 545, 546, - 546, 546, 547, 549, 0, 0, 546, 0, 0, 547, - 549, 0, 547, 549, 547, 549, 547, 549, 552, 0, - 0, 547, 549, 0, 0, 0, 554, 0, 552, 0, - 552, 0, 552, 0, 556, 0, 554, 552, 554, 554, - 554, 0, 0, 0, 556, 554, 556, 558, 556, 0, - - 564, 0, 556, 556, 0, 0, 0, 558, 565, 558, - 564, 558, 564, 0, 564, 0, 558, 0, 565, 564, - 565, 566, 565, 0, 567, 0, 0, 565, 0, 0, - 0, 566, 568, 566, 567, 566, 567, 0, 567, 0, - 566, 0, 568, 567, 568, 569, 568, 0, 0, 568, - 0, 568, 0, 570, 0, 569, 0, 569, 569, 569, - 0, 571, 0, 570, 569, 570, 0, 570, 571, 575, - 0, 571, 570, 571, 0, 571, 0, 576, 0, 575, - 571, 575, 0, 575, 0, 577, 0, 576, 575, 576, - 0, 576, 0, 579, 0, 577, 576, 577, 577, 577, - - 0, 582, 0, 579, 577, 579, 0, 579, 582, 584, - 0, 582, 579, 582, 0, 582, 584, 585, 0, 584, - 582, 584, 0, 584, 585, 592, 0, 585, 584, 585, - 0, 585, 0, 593, 0, 592, 585, 592, 0, 592, - 0, 594, 0, 593, 592, 593, 0, 593, 0, 595, - 0, 594, 593, 594, 0, 594, 0, 0, 0, 595, - 594, 595, 599, 595, 0, 0, 0, 595, 595, 0, - 600, 0, 599, 0, 599, 0, 599, 0, 602, 599, - 600, 599, 600, 0, 600, 602, 605, 0, 602, 600, - 602, 0, 602, 0, 0, 0, 605, 602, 605, 607, - - 605, 607, 608, 0, 605, 605, 608, 0, 0, 607, - 614, 607, 608, 607, 608, 0, 608, 0, 607, 0, - 614, 608, 614, 615, 614, 0, 619, 0, 614, 614, - 0, 0, 0, 615, 0, 615, 619, 615, 619, 620, - 619, 0, 615, 0, 0, 619, 615, 622, 0, 620, - 625, 620, 0, 620, 0, 0, 0, 622, 620, 622, - 625, 622, 625, 0, 625, 622, 622, 627, 628, 625, - 0, 0, 0, 625, 0, 628, 0, 627, 628, 627, - 628, 627, 628, 634, 635, 0, 627, 628, 0, 0, - 0, 0, 0, 634, 635, 634, 635, 634, 635, 634, - - 639, 642, 634, 635, 0, 0, 0, 0, 0, 0, - 639, 642, 639, 642, 639, 642, 0, 0, 644, 639, - 642, 644, 0, 639, 0, 0, 650, 0, 644, 0, - 644, 0, 644, 0, 652, 0, 650, 644, 650, 650, - 650, 0, 655, 0, 652, 650, 652, 0, 652, 0, - 659, 0, 655, 652, 655, 0, 655, 0, 655, 0, - 659, 655, 659, 663, 659, 0, 666, 0, 0, 659, - 0, 0, 0, 663, 0, 663, 666, 663, 666, 0, - 666, 0, 663, 0, 0, 666, 670, 670, 670, 670, - 670, 670, 670, 670, 670, 670, 670, 671, 671, 671, - - 671, 671, 671, 671, 671, 671, 671, 671, 672, 672, - 672, 672, 672, 672, 672, 672, 672, 672, 672, 673, - 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, - 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, - 674, 675, 675, 675, 675, 675, 675, 675, 675, 675, - 675, 675, 676, 676, 676, 0, 676, 676, 676, 676, - 676, 676, 676, 677, 677, 0, 0, 677, 0, 677, - 678, 678, 0, 678, 679, 679, 0, 679, 679, 679, - 0, 679, 679, 679, 679, 680, 680, 680, 0, 680, - 680, 680, 680, 680, 680, 680, 681, 681, 681, 681, - - 681, 681, 681, 681, 0, 681, 682, 0, 0, 682, - 682, 682, 682, 682, 682, 682, 683, 0, 0, 683, - 683, 683, 683, 683, 683, 683, 684, 0, 0, 684, - 0, 684, 684, 684, 684, 684, 685, 685, 0, 685, - 686, 686, 0, 686, 687, 687, 0, 687, 669, 669, - 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, - 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, - 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, - 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, - 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, - - 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, - 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, - 669, 669, 669, 669, 669, 669 + 256, 255, 256, 256, 256, 0, 0, 0, 257, 256, + 257, 259, 257, 258, 258, 0, 257, 257, 0, 0, + 0, 259, 260, 259, 258, 259, 258, 0, 258, 0, + 259, 0, 260, 258, 260, 261, 260, 261, 262, 0, + 262, 260, 0, 0, 0, 261, 0, 261, 262, 261, + 262, 0, 262, 263, 261, 0, 263, 262, 0, 264, + 0, 0, 0, 263, 0, 263, 0, 263, 0, 264, + 265, 264, 263, 264, 0, 0, 266, 265, 264, 0, + 265, 0, 265, 0, 265, 0, 266, 267, 266, 265, + 266, 0, 266, 0, 0, 266, 0, 267, 0, 267, + + 0, 267, 268, 267, 0, 268, 267, 0, 269, 0, + 0, 0, 268, 0, 268, 0, 268, 0, 269, 272, + 269, 268, 269, 0, 0, 273, 0, 269, 0, 272, + 0, 272, 0, 272, 0, 273, 0, 273, 272, 273, + 274, 275, 0, 273, 273, 0, 0, 274, 0, 0, + 274, 275, 274, 275, 274, 275, 276, 275, 0, 274, + 275, 277, 277, 272, 0, 0, 276, 0, 276, 0, + 276, 279, 277, 0, 277, 276, 277, 278, 277, 0, + 279, 277, 278, 0, 0, 0, 0, 278, 280, 278, + 279, 278, 279, 278, 279, 0, 278, 0, 280, 279, + + 280, 281, 280, 0, 0, 280, 0, 280, 0, 283, + 283, 281, 284, 281, 0, 281, 0, 0, 0, 283, + 281, 283, 284, 283, 284, 285, 284, 0, 283, 0, + 284, 284, 0, 287, 288, 285, 287, 285, 285, 285, + 0, 0, 0, 287, 285, 287, 0, 287, 289, 288, + 0, 289, 287, 0, 0, 0, 0, 0, 289, 288, + 289, 288, 289, 288, 290, 290, 292, 289, 288, 0, + 0, 0, 0, 0, 0, 290, 292, 290, 292, 290, + 292, 293, 0, 0, 290, 292, 0, 0, 0, 0, + 0, 293, 0, 293, 294, 293, 0, 294, 0, 293, + + 293, 0, 295, 0, 294, 296, 294, 0, 294, 0, + 0, 0, 295, 294, 295, 296, 295, 296, 0, 296, + 298, 295, 297, 297, 296, 0, 299, 0, 0, 301, + 298, 0, 298, 297, 298, 297, 299, 297, 299, 298, + 299, 300, 297, 0, 301, 299, 0, 303, 0, 0, + 0, 300, 0, 300, 301, 300, 301, 303, 301, 303, + 300, 303, 304, 301, 298, 305, 303, 0, 305, 0, + 0, 0, 304, 306, 304, 305, 304, 305, 0, 305, + 0, 304, 0, 306, 305, 306, 307, 306, 0, 0, + 0, 0, 306, 0, 0, 0, 307, 311, 307, 0, + + 307, 0, 0, 307, 0, 307, 0, 311, 306, 311, + 313, 311, 0, 314, 314, 0, 311, 0, 0, 0, + 313, 0, 313, 314, 313, 314, 0, 314, 313, 313, + 315, 315, 314, 0, 316, 0, 318, 318, 0, 0, + 0, 315, 0, 315, 316, 315, 316, 318, 316, 318, + 315, 318, 0, 316, 319, 319, 318, 320, 0, 0, + 320, 0, 0, 0, 319, 321, 319, 320, 319, 320, + 0, 320, 0, 319, 0, 321, 320, 321, 322, 321, + 0, 0, 0, 0, 321, 0, 323, 0, 322, 0, + 322, 0, 322, 0, 324, 0, 323, 322, 323, 0, + + 323, 324, 323, 0, 324, 323, 324, 325, 324, 0, + 0, 0, 0, 324, 0, 326, 0, 325, 326, 325, + 0, 325, 326, 0, 0, 326, 325, 326, 327, 326, + 327, 0, 0, 0, 326, 0, 328, 0, 327, 328, + 327, 0, 327, 328, 329, 0, 328, 327, 328, 0, + 328, 0, 330, 0, 329, 328, 329, 0, 329, 0, + 329, 0, 330, 329, 330, 0, 330, 331, 331, 0, + 330, 330, 0, 332, 0, 0, 0, 331, 0, 331, + 0, 331, 0, 332, 333, 332, 331, 332, 0, 0, + 334, 332, 332, 0, 333, 0, 333, 0, 333, 0, + + 334, 333, 334, 333, 334, 335, 339, 0, 0, 334, + 0, 0, 0, 339, 0, 335, 339, 335, 339, 335, + 339, 0, 0, 341, 335, 339, 340, 340, 0, 340, + 0, 0, 0, 341, 0, 341, 340, 341, 340, 0, + 340, 341, 341, 343, 342, 340, 342, 0, 0, 0, + 0, 0, 0, 343, 342, 343, 342, 343, 342, 344, + 0, 0, 343, 342, 0, 345, 0, 0, 345, 344, + 0, 344, 0, 344, 0, 345, 346, 345, 344, 345, + 347, 0, 0, 348, 345, 0, 346, 347, 346, 0, + 346, 0, 0, 346, 0, 346, 0, 347, 348, 347, + + 0, 347, 0, 0, 350, 0, 347, 0, 348, 0, + 348, 0, 348, 0, 350, 351, 350, 348, 350, 0, + 0, 352, 350, 350, 0, 351, 0, 351, 0, 351, + 0, 352, 354, 352, 351, 352, 0, 0, 0, 0, + 352, 0, 354, 355, 354, 0, 354, 0, 354, 356, + 355, 354, 0, 355, 0, 355, 0, 355, 0, 356, + 357, 356, 355, 356, 0, 0, 0, 0, 356, 0, + 357, 0, 357, 359, 357, 0, 360, 0, 357, 357, + 359, 0, 0, 359, 361, 359, 360, 359, 360, 361, + 360, 0, 359, 0, 361, 360, 361, 362, 361, 0, + + 0, 0, 0, 361, 0, 0, 0, 362, 364, 362, + 0, 362, 0, 0, 366, 364, 362, 0, 364, 362, + 364, 0, 364, 0, 366, 0, 366, 364, 366, 367, + 368, 0, 367, 366, 0, 0, 0, 0, 0, 367, + 368, 367, 368, 367, 368, 370, 368, 0, 367, 368, + 0, 375, 0, 0, 0, 370, 0, 370, 0, 370, + 0, 375, 0, 375, 370, 375, 376, 376, 0, 0, + 375, 0, 0, 377, 0, 0, 0, 376, 0, 376, + 0, 376, 0, 377, 379, 377, 376, 377, 0, 370, + 380, 377, 377, 0, 379, 0, 379, 0, 379, 0, + + 380, 381, 380, 379, 380, 0, 0, 382, 380, 380, + 382, 381, 0, 381, 0, 381, 0, 382, 0, 382, + 381, 382, 383, 383, 384, 0, 382, 0, 0, 0, + 0, 0, 0, 383, 384, 383, 384, 383, 384, 385, + 0, 0, 383, 384, 0, 0, 0, 0, 0, 385, + 386, 385, 386, 385, 0, 0, 387, 385, 385, 0, + 386, 0, 386, 0, 386, 0, 387, 0, 387, 386, + 387, 0, 0, 388, 387, 387, 388, 0, 0, 389, + 0, 389, 0, 388, 0, 388, 0, 388, 0, 389, + 390, 389, 388, 389, 0, 391, 391, 0, 389, 0, + + 390, 0, 390, 0, 390, 0, 391, 392, 391, 390, + 391, 0, 0, 393, 0, 391, 0, 392, 0, 392, + 393, 392, 0, 393, 394, 393, 392, 393, 0, 0, + 395, 0, 393, 0, 394, 0, 394, 395, 394, 0, + 395, 394, 395, 394, 395, 396, 396, 400, 0, 395, + 0, 400, 0, 0, 0, 0, 396, 400, 396, 400, + 396, 400, 401, 0, 0, 396, 400, 0, 402, 401, + 402, 0, 401, 0, 401, 0, 401, 0, 402, 403, + 402, 401, 402, 0, 0, 404, 0, 402, 404, 403, + 0, 403, 0, 403, 0, 404, 403, 404, 403, 404, + + 405, 405, 0, 0, 404, 0, 406, 406, 0, 0, + 405, 0, 405, 0, 405, 0, 406, 407, 406, 405, + 406, 0, 0, 0, 0, 406, 0, 407, 0, 407, + 0, 407, 408, 407, 0, 408, 407, 0, 409, 0, + 0, 0, 408, 0, 408, 0, 408, 0, 409, 410, + 409, 408, 409, 0, 0, 409, 410, 409, 0, 410, + 412, 410, 0, 410, 0, 413, 413, 0, 410, 0, + 412, 0, 412, 0, 412, 0, 413, 415, 413, 412, + 413, 0, 0, 416, 0, 413, 0, 415, 0, 415, + 0, 415, 0, 416, 417, 416, 415, 416, 0, 0, + + 0, 0, 416, 0, 417, 0, 417, 418, 417, 0, + 418, 0, 417, 417, 0, 420, 0, 418, 0, 418, + 0, 418, 0, 0, 0, 420, 418, 420, 0, 420, + 421, 421, 0, 422, 420, 420, 423, 0, 0, 0, + 421, 0, 421, 422, 421, 422, 423, 422, 423, 421, + 423, 425, 422, 425, 427, 423, 0, 428, 0, 0, + 0, 425, 0, 425, 427, 425, 427, 428, 427, 428, + 425, 428, 435, 427, 428, 0, 428, 0, 0, 0, + 0, 0, 435, 0, 435, 436, 435, 0, 438, 0, + 435, 435, 436, 0, 0, 436, 0, 436, 438, 436, + + 438, 0, 438, 439, 436, 0, 439, 438, 0, 440, + 0, 0, 0, 439, 0, 439, 0, 439, 0, 440, + 441, 440, 439, 440, 0, 0, 442, 441, 440, 0, + 441, 0, 441, 442, 441, 0, 442, 443, 442, 441, + 442, 0, 0, 444, 0, 442, 0, 443, 0, 443, + 0, 443, 0, 444, 445, 444, 443, 444, 0, 0, + 0, 445, 444, 0, 445, 446, 445, 446, 445, 0, + 0, 447, 0, 445, 0, 446, 0, 446, 0, 446, + 0, 447, 448, 447, 446, 447, 0, 448, 449, 0, + 447, 0, 448, 0, 448, 0, 448, 0, 449, 450, + + 449, 448, 449, 0, 0, 0, 449, 449, 0, 450, + 451, 450, 0, 450, 0, 0, 452, 450, 450, 0, + 451, 0, 451, 0, 451, 0, 452, 453, 452, 451, + 452, 0, 0, 457, 0, 452, 0, 453, 0, 453, + 457, 453, 0, 457, 458, 457, 453, 457, 0, 0, + 0, 0, 457, 0, 458, 459, 458, 0, 458, 0, + 0, 460, 458, 458, 0, 459, 0, 459, 0, 459, + 0, 460, 461, 460, 459, 460, 0, 0, 462, 0, + 460, 462, 461, 0, 461, 0, 461, 0, 462, 461, + 462, 461, 462, 463, 464, 0, 0, 462, 0, 0, + + 0, 0, 0, 463, 464, 463, 464, 463, 464, 465, + 465, 463, 463, 464, 0, 466, 0, 0, 0, 465, + 0, 465, 0, 465, 0, 466, 467, 466, 465, 466, + 0, 0, 469, 0, 466, 0, 467, 0, 467, 0, + 467, 0, 469, 471, 469, 467, 469, 0, 0, 0, + 0, 469, 0, 471, 472, 471, 0, 471, 472, 466, + 473, 0, 471, 0, 472, 0, 472, 0, 472, 0, + 473, 474, 473, 472, 473, 0, 0, 476, 0, 473, + 476, 474, 0, 474, 0, 474, 0, 476, 0, 476, + 474, 476, 477, 0, 0, 477, 476, 0, 479, 0, + + 0, 479, 477, 0, 477, 0, 477, 0, 479, 0, + 479, 477, 479, 481, 481, 488, 0, 479, 0, 0, + 0, 0, 488, 0, 481, 488, 481, 488, 481, 488, + 489, 489, 0, 481, 488, 0, 491, 0, 0, 0, + 489, 0, 489, 0, 489, 0, 491, 492, 491, 489, + 491, 0, 491, 0, 0, 491, 0, 492, 493, 492, + 0, 492, 0, 0, 494, 492, 492, 0, 493, 0, + 493, 0, 493, 0, 494, 495, 494, 493, 494, 0, + 0, 496, 497, 494, 0, 495, 0, 495, 495, 495, + 0, 496, 0, 496, 495, 496, 498, 497, 0, 498, + + 496, 0, 0, 0, 0, 0, 498, 497, 498, 497, + 498, 497, 499, 500, 0, 498, 497, 0, 0, 0, + 500, 0, 499, 500, 499, 500, 499, 500, 501, 0, + 0, 499, 500, 0, 506, 0, 0, 506, 501, 0, + 501, 0, 501, 0, 506, 507, 506, 501, 506, 0, + 0, 508, 0, 506, 0, 507, 0, 507, 0, 507, + 0, 508, 509, 508, 507, 508, 0, 0, 510, 0, + 508, 0, 509, 0, 509, 510, 509, 0, 510, 511, + 510, 509, 510, 0, 0, 0, 0, 510, 0, 511, + 513, 511, 0, 511, 513, 0, 515, 511, 511, 0, + + 513, 0, 513, 519, 513, 0, 515, 517, 515, 513, + 515, 0, 0, 0, 517, 515, 0, 517, 519, 517, + 0, 517, 0, 0, 520, 0, 517, 0, 519, 0, + 519, 0, 519, 0, 520, 522, 520, 519, 520, 0, + 0, 524, 0, 520, 0, 522, 0, 522, 0, 522, + 0, 524, 530, 524, 522, 524, 0, 0, 531, 0, + 524, 0, 530, 0, 530, 530, 530, 0, 531, 533, + 531, 530, 531, 0, 0, 534, 0, 531, 0, 533, + 0, 533, 0, 533, 0, 534, 0, 534, 533, 534, + 535, 536, 534, 535, 534, 0, 536, 0, 0, 0, + + 535, 536, 535, 536, 535, 536, 537, 538, 538, 535, + 536, 0, 0, 0, 0, 0, 537, 538, 537, 538, + 537, 538, 539, 540, 539, 537, 538, 0, 0, 0, + 0, 0, 539, 540, 539, 540, 539, 540, 545, 0, + 0, 539, 540, 0, 0, 0, 546, 0, 545, 0, + 545, 0, 545, 0, 545, 0, 546, 545, 546, 546, + 546, 547, 549, 0, 0, 546, 0, 0, 547, 549, + 0, 547, 549, 547, 549, 547, 549, 552, 0, 0, + 547, 549, 0, 0, 0, 554, 0, 552, 0, 552, + 0, 552, 0, 556, 0, 554, 552, 554, 554, 554, + + 0, 0, 0, 556, 554, 556, 558, 556, 0, 564, + 0, 556, 556, 0, 0, 0, 558, 565, 558, 564, + 558, 564, 0, 564, 0, 558, 0, 565, 564, 565, + 566, 565, 566, 567, 0, 0, 565, 0, 0, 0, + 566, 568, 566, 567, 566, 567, 0, 567, 0, 566, + 0, 568, 567, 568, 569, 568, 0, 0, 568, 0, + 568, 0, 570, 0, 569, 0, 569, 569, 569, 0, + 571, 0, 570, 569, 570, 0, 570, 571, 575, 0, + 571, 570, 571, 0, 571, 0, 576, 0, 575, 571, + 575, 0, 575, 0, 577, 0, 576, 575, 576, 0, + + 576, 0, 579, 0, 577, 576, 577, 577, 577, 0, + 582, 0, 579, 577, 579, 0, 579, 582, 584, 0, + 582, 579, 582, 0, 582, 584, 585, 0, 584, 582, + 584, 0, 584, 585, 592, 0, 585, 584, 585, 0, + 585, 0, 593, 0, 592, 585, 592, 0, 592, 0, + 594, 0, 593, 592, 593, 0, 593, 0, 595, 0, + 594, 593, 594, 0, 594, 0, 596, 0, 595, 594, + 595, 0, 595, 0, 0, 0, 596, 595, 596, 600, + 596, 0, 0, 0, 596, 596, 0, 601, 0, 600, + 0, 600, 0, 600, 0, 603, 600, 601, 600, 601, + + 0, 601, 603, 606, 0, 603, 601, 603, 0, 603, + 0, 0, 0, 606, 603, 606, 608, 606, 608, 609, + 0, 606, 606, 609, 0, 0, 608, 615, 608, 609, + 608, 609, 0, 609, 0, 608, 0, 615, 609, 615, + 616, 615, 0, 620, 0, 615, 615, 0, 0, 0, + 616, 0, 616, 620, 616, 620, 621, 620, 0, 616, + 0, 0, 620, 616, 623, 0, 621, 626, 621, 0, + 621, 0, 0, 0, 623, 621, 623, 626, 623, 626, + 0, 626, 623, 623, 628, 629, 626, 0, 0, 0, + 626, 0, 629, 0, 628, 629, 628, 629, 628, 629, + + 635, 636, 0, 628, 629, 0, 0, 0, 0, 0, + 635, 636, 635, 636, 635, 636, 635, 640, 643, 635, + 636, 0, 0, 0, 0, 0, 0, 640, 643, 640, + 643, 640, 643, 0, 0, 645, 640, 643, 645, 0, + 640, 0, 0, 651, 0, 645, 0, 645, 0, 645, + 0, 653, 0, 651, 645, 651, 651, 651, 0, 656, + 0, 653, 651, 653, 0, 653, 0, 660, 0, 656, + 653, 656, 0, 656, 0, 656, 0, 660, 656, 660, + 664, 660, 0, 667, 0, 0, 660, 0, 0, 0, + 664, 0, 664, 667, 664, 667, 0, 667, 0, 664, + + 0, 0, 667, 671, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 672, 672, 672, 672, 672, 672, + 672, 672, 672, 672, 672, 673, 673, 673, 673, 673, + 673, 673, 673, 673, 673, 673, 674, 674, 674, 674, + 674, 674, 674, 674, 674, 674, 674, 675, 675, 675, + 675, 675, 675, 675, 675, 675, 675, 675, 676, 676, + 676, 676, 676, 676, 676, 676, 676, 676, 676, 677, + 677, 677, 0, 677, 677, 677, 677, 677, 677, 677, + 678, 678, 0, 0, 678, 0, 678, 679, 679, 0, + 679, 680, 680, 0, 680, 680, 680, 0, 680, 680, + + 680, 680, 681, 681, 681, 0, 681, 681, 681, 681, + 681, 681, 681, 682, 682, 682, 682, 682, 682, 682, + 682, 0, 682, 683, 0, 0, 683, 683, 683, 683, + 683, 683, 683, 684, 0, 0, 684, 684, 684, 684, + 684, 684, 684, 685, 0, 0, 685, 0, 685, 685, + 685, 685, 685, 686, 686, 0, 686, 687, 687, 0, + 687, 688, 688, 0, 688, 670, 670, 670, 670, 670, + 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, + 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, + 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, + + 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, + 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, + 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, + 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, + 670, 670, 670 } ; extern int yy_flex_debug; @@ -1827,7 +1832,7 @@ static asn1c_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */ /* Newline */ /* White-space */ -#line 1831 "asn1p_l.c" +#line 1836 "asn1p_l.c" /* Macros after this point can all be overridden by user definitions in * section 1. @@ -1981,7 +1986,7 @@ YY_DECL #line 101 "asn1p_l.l" -#line 1985 "asn1p_l.c" +#line 1990 "asn1p_l.c" if ( yy_init ) { @@ -2029,14 +2034,14 @@ YY_DECL while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 670 ) + if ( yy_current_state >= 671 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *yy_state_ptr++ = yy_current_state; ++yy_cp; } - while ( yy_base[yy_current_state] != 4249 ); + while ( yy_base[yy_current_state] != 4266 ); yy_find_action: yy_current_state = *--yy_state_ptr; @@ -2925,7 +2930,7 @@ YY_RULE_SETUP #line 460 "asn1p_l.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK -#line 2929 "asn1p_l.c" +#line 2934 "asn1p_l.c" case YY_END_OF_BUFFER: { @@ -3212,7 +3217,7 @@ static yy_state_type yy_get_previous_state() while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 670 ) + if ( yy_current_state >= 671 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -3242,11 +3247,11 @@ yy_state_type yy_current_state; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 670 ) + if ( yy_current_state >= 671 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 669); + yy_is_jam = (yy_current_state == 670); if ( ! yy_is_jam ) *yy_state_ptr++ = yy_current_state; diff --git a/libasn1parser/asn1p_l.l b/libasn1parser/asn1p_l.l index 07fa6767f..50a786c97 100644 --- a/libasn1parser/asn1p_l.l +++ b/libasn1parser/asn1p_l.l @@ -269,7 +269,7 @@ CHOICE return TOK_CHOICE; CLASS return TOK_CLASS; COMPONENT return TOK_COMPONENT; COMPONENTS return TOK_COMPONENTS; -CONSRAINED return TOK_CONSTRAINED; +CONSTRAINED return TOK_CONSTRAINED; CONTAINING return TOK_CONTAINING; DEFAULT return TOK_DEFAULT; DEFINED { diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index 6aa198347..04e713f56 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -204,11 +204,11 @@ typedef union { -#define YYFINAL 418 +#define YYFINAL 423 #define YYFLAG -32768 #define YYNTBASE 116 -#define YYTRANSLATE(x) ((unsigned)(x) <= 354 ? yytranslate[x] : 218) +#define YYTRANSLATE(x) ((unsigned)(x) <= 354 ? yytranslate[x] : 219) static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -271,64 +271,65 @@ static const short yyprhs[] = { 0, 490, 492, 494, 496, 498, 500, 502, 504, 506, 508, 510, 512, 514, 515, 517, 519, 524, 528, 533, 535, 539, 545, 547, 551, 555, 559, 564, 568, 570, 572, - 576, 580, 584, 588, 590, 592, 594, 597, 600, 604, - 606, 608, 610, 612, 614, 616, 618, 620, 626, 628, - 632, 634, 638, 639, 641, 643, 645, 647, 649, 651, - 655, 660, 662, 666, 669, 673, 675, 679, 680, 682, - 684, 687, 690, 694, 696, 700, 702, 707, 712, 714, - 716, 718, 720, 721, 723, 726, 731, 732, 734, 736, - 738, 739, 741, 743, 745, 747, 749, 750, 752 + 576, 580, 584, 588, 590, 592, 593, 599, 601, 604, + 607, 611, 613, 615, 617, 619, 621, 623, 625, 627, + 633, 635, 639, 641, 645, 646, 648, 650, 652, 654, + 656, 658, 662, 667, 669, 673, 676, 680, 682, 686, + 687, 689, 691, 694, 697, 701, 703, 707, 709, 714, + 719, 721, 723, 725, 727, 728, 730, 733, 738, 739, + 741, 743, 745, 746, 748, 750, 752, 754, 756, 757, + 759 }; static const short yyrhs[] = { 117, - 0, 118, 0, 117, 118, 0, 214, 119, 34, 123, + 0, 118, 0, 117, 118, 0, 215, 119, 34, 123, 3, 21, 126, 39, 0, 0, 120, 0, 103, 121, 104, 0, 103, 104, 0, 122, 0, 121, 122, 0, - 217, 0, 217, 105, 9, 106, 0, 9, 0, 0, + 218, 0, 218, 105, 9, 106, 0, 9, 0, 0, 124, 0, 125, 0, 124, 125, 0, 41, 84, 0, 52, 84, 0, 20, 84, 0, 43, 53, 0, 12, 57, 0, 0, 127, 0, 128, 0, 127, 128, 0, 130, 0, 135, 0, 143, 0, 170, 0, 138, 0, 0, 38, 12, 129, 0, 178, 0, 54, 131, 107, 0, 54, 46, 0, 132, 0, 131, 132, 0, 133, - 46, 214, 119, 0, 134, 0, 133, 108, 134, 0, - 214, 0, 214, 103, 104, 0, 217, 0, 42, 136, + 46, 215, 119, 0, 134, 0, 133, 108, 134, 0, + 215, 0, 215, 103, 104, 0, 218, 0, 42, 136, 107, 0, 42, 17, 107, 0, 42, 107, 0, 137, - 0, 136, 108, 137, 0, 214, 0, 214, 103, 104, - 0, 217, 0, 214, 139, 3, 103, 140, 104, 0, + 0, 136, 108, 137, 0, 215, 0, 215, 103, 104, + 0, 218, 0, 215, 139, 3, 103, 140, 104, 0, 165, 0, 175, 0, 0, 141, 0, 142, 0, 141, - 108, 142, 0, 102, 0, 186, 0, 214, 3, 209, - 87, 0, 214, 3, 163, 0, 214, 3, 153, 0, - 214, 103, 144, 104, 3, 163, 0, 145, 0, 144, - 108, 145, 0, 214, 0, 214, 109, 217, 0, 214, - 109, 214, 0, 175, 109, 217, 0, 147, 0, 146, - 108, 147, 0, 163, 0, 217, 0, 0, 149, 0, - 150, 0, 149, 108, 150, 0, 217, 163, 203, 0, + 108, 142, 0, 102, 0, 186, 0, 215, 3, 210, + 87, 0, 215, 3, 163, 0, 215, 3, 153, 0, + 215, 103, 144, 104, 3, 163, 0, 145, 0, 144, + 108, 145, 0, 215, 0, 215, 109, 218, 0, 215, + 109, 215, 0, 175, 109, 218, 0, 147, 0, 146, + 108, 147, 0, 163, 0, 218, 0, 0, 149, 0, + 150, 0, 149, 108, 150, 0, 218, 163, 204, 0, 30, 68, 163, 0, 162, 0, 152, 0, 151, 108, - 152, 0, 217, 163, 0, 162, 0, 28, 103, 155, + 152, 0, 218, 163, 0, 162, 0, 28, 103, 155, 104, 157, 0, 0, 88, 0, 156, 0, 155, 108, - 156, 0, 168, 203, 0, 168, 163, 154, 203, 0, - 168, 168, 154, 203, 0, 0, 158, 0, 0, 95, + 156, 0, 168, 204, 0, 168, 163, 154, 204, 0, + 168, 168, 154, 204, 0, 0, 158, 0, 0, 95, 82, 103, 159, 160, 104, 0, 161, 0, 160, 161, 0, 4, 0, 168, 0, 102, 0, 102, 110, 173, - 0, 102, 110, 208, 0, 209, 164, 182, 0, 177, + 0, 102, 110, 209, 0, 210, 164, 182, 0, 177, 0, 27, 103, 151, 104, 0, 78, 103, 148, 104, - 0, 79, 103, 148, 104, 0, 78, 182, 68, 216, - 209, 164, 0, 79, 182, 68, 216, 209, 164, 0, - 18, 0, 18, 35, 25, 217, 0, 214, 103, 146, + 0, 79, 103, 148, 104, 0, 78, 182, 68, 217, + 210, 164, 0, 79, 182, 68, 217, 210, 164, 0, + 18, 0, 18, 35, 25, 218, 0, 215, 103, 146, 104, 0, 165, 0, 56, 68, 165, 0, 11, 0, - 11, 111, 214, 0, 215, 111, 214, 0, 11, 111, - 217, 0, 215, 0, 215, 111, 166, 0, 167, 0, + 11, 111, 215, 0, 216, 111, 215, 0, 11, 111, + 218, 0, 216, 0, 216, 111, 166, 0, 167, 0, 166, 111, 167, 0, 169, 0, 169, 0, 13, 0, - 14, 0, 217, 139, 3, 171, 0, 217, 109, 171, + 14, 0, 218, 139, 3, 171, 0, 218, 109, 171, 0, 0, 103, 172, 174, 0, 63, 0, 45, 0, - 86, 0, 5, 0, 7, 0, 6, 0, 208, 0, - 173, 0, 217, 0, 214, 111, 217, 0, 4, 0, + 86, 0, 5, 0, 7, 0, 6, 0, 209, 0, + 173, 0, 218, 0, 215, 111, 218, 0, 4, 0, 174, 4, 0, 24, 0, 63, 0, 76, 0, 176, 0, 67, 81, 0, 65, 51, 0, 77, 0, 44, 0, 36, 71, 0, 26, 81, 0, 91, 0, 47, 0, 178, 0, 58, 0, 40, 0, 22, 81, 0, - 175, 0, 176, 205, 0, 23, 0, 48, 0, 49, + 175, 0, 176, 206, 0, 23, 0, 48, 0, 49, 0, 50, 0, 59, 0, 64, 0, 74, 0, 83, 0, 85, 0, 90, 0, 92, 0, 93, 0, 94, 0, 66, 0, 99, 0, 100, 0, 97, 0, 98, @@ -336,27 +337,27 @@ static const short yyrhs[] = { 117, 185, 106, 0, 105, 185, 106, 0, 184, 105, 185, 106, 0, 186, 0, 186, 108, 102, 0, 186, 108, 102, 108, 186, 0, 187, 0, 186, 179, 187, 0, - 186, 180, 187, 0, 187, 181, 187, 0, 189, 105, - 185, 106, 0, 105, 185, 106, 0, 190, 0, 191, - 0, 190, 188, 190, 0, 61, 188, 190, 0, 190, - 188, 60, 0, 61, 188, 60, 0, 197, 0, 192, - 0, 101, 0, 101, 112, 0, 112, 101, 0, 112, - 101, 112, 0, 80, 0, 46, 0, 45, 0, 86, - 0, 208, 0, 6, 0, 217, 0, 214, 0, 95, - 30, 103, 193, 104, 0, 194, 0, 193, 108, 194, - 0, 102, 0, 217, 182, 195, 0, 0, 196, 0, - 73, 0, 15, 0, 69, 0, 198, 0, 199, 0, - 103, 214, 104, 0, 198, 103, 200, 104, 0, 201, - 0, 200, 108, 201, 0, 113, 202, 0, 113, 111, - 202, 0, 217, 0, 202, 111, 217, 0, 0, 204, - 0, 69, 0, 33, 171, 0, 103, 104, 0, 103, - 206, 104, 0, 207, 0, 206, 108, 207, 0, 217, - 0, 217, 105, 208, 106, 0, 217, 105, 173, 106, - 0, 208, 0, 102, 0, 9, 0, 10, 0, 0, - 210, 0, 211, 213, 0, 114, 212, 9, 115, 0, - 0, 89, 0, 19, 0, 75, 0, 0, 52, 0, - 41, 0, 11, 0, 12, 0, 12, 0, 0, 217, - 0, 8, 0 + 186, 180, 187, 0, 187, 181, 187, 0, 190, 105, + 185, 106, 0, 105, 185, 106, 0, 191, 0, 192, + 0, 191, 189, 191, 0, 61, 189, 191, 0, 191, + 189, 60, 0, 61, 189, 60, 0, 198, 0, 193, + 0, 0, 31, 25, 103, 188, 174, 0, 101, 0, + 101, 112, 0, 112, 101, 0, 112, 101, 112, 0, + 80, 0, 46, 0, 45, 0, 86, 0, 209, 0, + 6, 0, 218, 0, 215, 0, 95, 30, 103, 194, + 104, 0, 195, 0, 194, 108, 195, 0, 102, 0, + 218, 182, 196, 0, 0, 197, 0, 73, 0, 15, + 0, 69, 0, 199, 0, 200, 0, 103, 215, 104, + 0, 199, 103, 201, 104, 0, 202, 0, 201, 108, + 202, 0, 113, 203, 0, 113, 111, 203, 0, 218, + 0, 203, 111, 218, 0, 0, 205, 0, 69, 0, + 33, 171, 0, 103, 104, 0, 103, 207, 104, 0, + 208, 0, 207, 108, 208, 0, 218, 0, 218, 105, + 209, 106, 0, 218, 105, 173, 106, 0, 209, 0, + 102, 0, 9, 0, 10, 0, 0, 211, 0, 212, + 214, 0, 114, 213, 9, 115, 0, 0, 89, 0, + 19, 0, 75, 0, 0, 52, 0, 41, 0, 11, + 0, 12, 0, 12, 0, 0, 218, 0, 8, 0 }; #endif @@ -377,19 +378,20 @@ static const short yyrline[] = { 0, 1110, 1120, 1130, 1136, 1150, 1174, 1181, 1195, 1204, 1214, 1224, 1234, 1242, 1263, 1272, 1281, 1282, 1284, 1291, 1303, 1313, 1321, 1321, 1326, 1331, 1336, 1341, 1345, 1349, 1353, - 1356, 1361, 1373, 1389, 1400, 1414, 1416, 1417, 1418, 1419, - 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1427, 1433, 1435, - 1436, 1439, 1446, 1458, 1460, 1464, 1468, 1469, 1470, 1471, - 1472, 1476, 1477, 1478, 1479, 1483, 1484, 1491, 1491, 1492, - 1492, 1493, 1495, 1497, 1502, 1506, 1515, 1519, 1524, 1528, - 1534, 1544, 1548, 1551, 1554, 1559, 1568, 1576, 1582, 1588, - 1595, 1603, 1611, 1620, 1623, 1628, 1630, 1631, 1632, 1635, - 1639, 1644, 1650, 1655, 1658, 1662, 1675, 1689, 1695, 1699, - 1704, 1710, 1722, 1724, 1727, 1731, 1734, 1739, 1743, 1751, - 1766, 1772, 1779, 1792, 1804, 1819, 1823, 1840, 1845, 1848, - 1853, 1875, 1880, 1885, 1891, 1897, 1905, 1913, 1921, 1928, - 1938, 1943, 1973, 1975, 1978, 1985, 1991, 1993, 1994, 1995, - 1998, 2000, 2001, 2004, 2009, 2016, 2023, 2025, 2029 + 1356, 1361, 1373, 1389, 1399, 1413, 1415, 1416, 1417, 1418, + 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1432, 1434, + 1435, 1438, 1445, 1457, 1459, 1463, 1467, 1468, 1469, 1470, + 1471, 1475, 1476, 1477, 1478, 1482, 1483, 1490, 1490, 1491, + 1491, 1492, 1494, 1496, 1501, 1505, 1514, 1518, 1523, 1527, + 1533, 1543, 1547, 1550, 1553, 1558, 1567, 1575, 1581, 1587, + 1594, 1602, 1610, 1619, 1622, 1625, 1626, 1636, 1638, 1639, + 1640, 1643, 1647, 1652, 1658, 1663, 1666, 1670, 1683, 1697, + 1703, 1707, 1712, 1718, 1730, 1732, 1735, 1739, 1742, 1747, + 1751, 1759, 1774, 1780, 1787, 1800, 1812, 1827, 1831, 1848, + 1853, 1856, 1861, 1883, 1888, 1893, 1899, 1905, 1913, 1921, + 1929, 1936, 1946, 1951, 1981, 1983, 1986, 1993, 1999, 2001, + 2002, 2003, 2006, 2008, 2009, 2012, 2017, 2024, 2031, 2033, + 2037 }; #endif @@ -432,13 +434,13 @@ static const char * const yytname[] = { "$","error","$undefined.","TOK_PPEQ", "Value","@3","DefinedValue","Opaque","BasicTypeId","BasicTypeId_UniverationCompatible", "BasicType","BasicString","Union","Intersection","Except","optConstraints","Constraints", "SetOfConstraints","ElementSetSpecs","ElementSetSpec","ConstraintSubtypeElement", -"ConstraintRangeSpec","ConstraintSpec","SingleValue","ContainedSubtype","WithComponents", -"WithComponentsList","WithComponentsElement","optPresenceConstraint","PresenceConstraint", -"TableConstraint","SimpleTableConstraint","ComponentRelationConstraint","AtNotationList", -"AtNotationElement","ComponentIdList","optMarker","Marker","UniverationDefinition", -"UniverationList","UniverationElement","SignedNumber","optTag","Tag","TagTypeValue", -"TagClass","TagPlicit","TypeRefName","ObjectClassReference","optIdentifier", -"Identifier", NULL +"@4","ConstraintRangeSpec","ConstraintSpec","SingleValue","ContainedSubtype", +"WithComponents","WithComponentsList","WithComponentsElement","optPresenceConstraint", +"PresenceConstraint","TableConstraint","SimpleTableConstraint","ComponentRelationConstraint", +"AtNotationList","AtNotationElement","ComponentIdList","optMarker","Marker", +"UniverationDefinition","UniverationList","UniverationElement","SignedNumber", +"optTag","Tag","TagTypeValue","TagClass","TagPlicit","TypeRefName","ObjectClassReference", +"optIdentifier","Identifier", NULL }; #endif @@ -463,13 +465,14 @@ static const short yyr1[] = { 0, 178, 178, 178, 178, 178, 178, 178, 179, 179, 180, 180, 181, 182, 182, 183, 183, 184, 184, 185, 185, 185, 186, 186, 186, 186, 187, 187, 187, 187, 187, - 187, 187, 187, 187, 187, 188, 188, 188, 188, 189, - 189, 190, 190, 190, 190, 190, 191, 192, 193, 193, - 194, 194, 195, 195, 196, 196, 196, 197, 197, 198, - 199, 200, 200, 201, 201, 202, 202, 203, 203, 204, - 204, 205, 205, 206, 206, 207, 207, 207, 207, 207, - 208, 208, 209, 209, 210, 211, 212, 212, 212, 212, - 213, 213, 213, 214, 214, 215, 216, 216, 217 + 187, 187, 187, 187, 187, 188, 187, 189, 189, 189, + 189, 190, 190, 191, 191, 191, 191, 191, 192, 193, + 194, 194, 195, 195, 196, 196, 197, 197, 197, 198, + 198, 199, 200, 201, 201, 202, 202, 203, 203, 204, + 204, 205, 205, 206, 206, 207, 207, 208, 208, 208, + 208, 208, 209, 209, 210, 210, 211, 212, 213, 213, + 213, 213, 214, 214, 214, 215, 215, 216, 217, 217, + 218 }; static const short yyr2[] = { 0, @@ -493,17 +496,18 @@ static const short yyr2[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 4, 3, 4, 1, 3, 5, 1, 3, 3, 3, 4, 3, 1, 1, 3, - 3, 3, 3, 1, 1, 1, 2, 2, 3, 1, - 1, 1, 1, 1, 1, 1, 1, 5, 1, 3, - 1, 3, 0, 1, 1, 1, 1, 1, 1, 3, - 4, 1, 3, 2, 3, 1, 3, 0, 1, 1, - 2, 2, 3, 1, 3, 1, 4, 4, 1, 1, - 1, 1, 0, 1, 2, 4, 0, 1, 1, 1, - 0, 1, 1, 1, 1, 1, 0, 1, 1 + 3, 3, 3, 1, 1, 0, 5, 1, 2, 2, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 5, + 1, 3, 1, 3, 0, 1, 1, 1, 1, 1, + 1, 3, 4, 1, 3, 2, 3, 1, 3, 0, + 1, 1, 2, 2, 3, 1, 3, 1, 4, 4, + 1, 1, 1, 1, 0, 1, 2, 4, 0, 1, + 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, + 1 }; static const short yydefact[] = { 0, - 264, 265, 1, 2, 5, 3, 0, 0, 6, 269, + 266, 267, 1, 2, 5, 3, 0, 0, 6, 271, 13, 8, 0, 9, 11, 14, 7, 10, 0, 0, 0, 0, 0, 0, 0, 15, 16, 0, 22, 20, 18, 21, 19, 0, 17, 12, 23, 164, 0, 0, @@ -511,287 +515,291 @@ static const short yydefact[] = { 0, 173, 174, 175, 176, 0, 24, 25, 27, 28, 31, 29, 30, 34, 0, 0, 32, 0, 47, 0, 48, 50, 52, 36, 0, 37, 0, 40, 42, 44, 4, - 26, 253, 118, 266, 0, 146, 0, 0, 160, 153, + 26, 255, 118, 268, 0, 146, 0, 0, 160, 153, 157, 159, 147, 0, 0, 148, 152, 156, 0, 0, 54, 55, 149, 158, 122, 0, 33, 46, 45, 0, - 0, 35, 38, 0, 0, 0, 0, 257, 64, 63, - 0, 254, 261, 0, 161, 155, 154, 151, 150, 0, + 0, 35, 38, 0, 0, 0, 0, 259, 64, 63, + 0, 256, 263, 0, 161, 155, 154, 151, 150, 0, 66, 0, 68, 0, 0, 0, 49, 51, 5, 41, - 43, 0, 259, 260, 258, 0, 118, 266, 113, 0, + 43, 0, 261, 262, 260, 0, 118, 268, 113, 0, 0, 183, 183, 62, 183, 116, 162, 149, 107, 0, - 263, 262, 255, 119, 121, 0, 0, 0, 0, 56, - 128, 129, 123, 124, 126, 120, 137, 139, 138, 251, - 252, 135, 134, 136, 132, 130, 141, 140, 0, 142, - 39, 0, 90, 253, 127, 0, 0, 0, 0, 0, + 265, 264, 257, 119, 121, 0, 0, 0, 0, 56, + 128, 129, 123, 124, 126, 120, 137, 139, 138, 253, + 254, 135, 134, 136, 132, 130, 141, 140, 0, 142, + 39, 0, 90, 255, 127, 0, 0, 0, 0, 0, 76, 0, 0, 184, 185, 76, 0, 106, 0, 163, - 253, 253, 67, 71, 70, 69, 215, 212, 211, 0, - 210, 213, 0, 60, 0, 0, 0, 57, 58, 61, - 192, 0, 198, 199, 205, 204, 228, 229, 214, 217, - 216, 0, 0, 0, 0, 95, 0, 0, 240, 88, - 88, 92, 239, 0, 256, 0, 103, 0, 83, 86, - 253, 117, 0, 0, 0, 77, 78, 82, 253, 0, - 189, 267, 0, 0, 267, 250, 242, 0, 244, 249, - 246, 0, 72, 74, 75, 65, 206, 0, 0, 0, - 0, 0, 53, 0, 180, 181, 178, 179, 0, 0, - 182, 0, 0, 0, 0, 125, 144, 133, 143, 131, - 0, 87, 96, 91, 241, 89, 238, 238, 114, 0, - 108, 0, 85, 0, 253, 109, 0, 238, 187, 0, - 253, 268, 0, 110, 253, 243, 0, 0, 115, 253, - 207, 208, 203, 201, 0, 230, 197, 59, 193, 194, - 195, 0, 202, 200, 0, 0, 232, 145, 0, 93, - 94, 104, 105, 142, 84, 186, 81, 79, 80, 190, - 0, 188, 0, 245, 0, 0, 73, 209, 221, 0, - 219, 183, 196, 0, 234, 236, 231, 0, 97, 0, - 111, 112, 248, 247, 218, 0, 223, 235, 0, 233, - 0, 191, 220, 226, 227, 225, 222, 224, 237, 101, - 0, 99, 102, 98, 100, 0, 0, 0 + 255, 255, 67, 71, 70, 69, 217, 0, 214, 213, + 0, 212, 215, 0, 60, 0, 0, 0, 57, 58, + 61, 192, 0, 198, 199, 205, 204, 230, 231, 216, + 219, 218, 0, 0, 0, 0, 95, 0, 0, 242, + 88, 88, 92, 241, 0, 258, 0, 103, 0, 83, + 86, 255, 117, 0, 0, 0, 77, 78, 82, 255, + 0, 189, 269, 0, 0, 269, 252, 244, 0, 246, + 251, 248, 0, 72, 74, 75, 65, 0, 208, 0, + 0, 0, 0, 0, 53, 0, 180, 181, 178, 179, + 0, 0, 182, 0, 0, 0, 0, 125, 144, 133, + 143, 131, 0, 87, 96, 91, 243, 89, 240, 240, + 114, 0, 108, 0, 85, 0, 255, 109, 0, 240, + 187, 0, 255, 270, 0, 110, 255, 245, 0, 0, + 115, 255, 206, 209, 210, 203, 201, 0, 232, 197, + 59, 193, 194, 195, 0, 202, 200, 0, 0, 234, + 145, 0, 93, 94, 104, 105, 142, 84, 186, 81, + 79, 80, 190, 0, 188, 0, 247, 0, 0, 73, + 0, 211, 223, 0, 221, 183, 196, 0, 236, 238, + 233, 0, 97, 0, 111, 112, 250, 249, 207, 220, + 0, 225, 237, 0, 235, 0, 191, 222, 228, 229, + 227, 224, 226, 239, 101, 0, 99, 102, 98, 100, + 0, 0, 0 }; -static const short yydefgoto[] = { 416, +static const short yydefgoto[] = { 421, 3, 4, 8, 9, 13, 14, 25, 26, 27, 55, 56, 57, 107, 58, 74, 75, 76, 77, 59, 69, - 70, 60, 100, 227, 228, 229, 61, 130, 131, 282, - 283, 265, 266, 267, 258, 259, 119, 317, 192, 193, - 312, 313, 401, 411, 412, 268, 284, 155, 156, 173, - 174, 194, 195, 62, 186, 243, 187, 308, 157, 103, - 159, 104, 299, 300, 302, 203, 204, 205, 270, 271, - 231, 289, 232, 233, 234, 235, 380, 381, 407, 408, - 236, 237, 238, 356, 357, 385, 252, 253, 210, 278, - 279, 239, 254, 122, 123, 146, 163, 240, 105, 331, - 241 + 70, 60, 100, 228, 229, 230, 61, 130, 131, 283, + 284, 266, 267, 268, 259, 260, 119, 319, 192, 193, + 314, 315, 406, 416, 417, 269, 285, 155, 156, 173, + 174, 194, 195, 62, 186, 244, 187, 310, 157, 103, + 159, 104, 301, 302, 304, 203, 204, 205, 271, 272, + 232, 381, 291, 233, 234, 235, 236, 384, 385, 412, + 413, 237, 238, 239, 359, 360, 389, 253, 254, 210, + 279, 280, 240, 255, 122, 123, 146, 163, 241, 105, + 333, 242 }; -static const short yypact[] = { 228, --32768,-32768, 228,-32768, -71,-32768, 38, 59,-32768,-32768, --32768,-32768, 49,-32768, -3, 58,-32768,-32768, 74, 54, - 60, 67, 112, 84, 136, 58,-32768, 82,-32768,-32768, --32768,-32768,-32768, 152,-32768,-32768, 419,-32768, 178, 33, --32768,-32768,-32768, 61,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 181, 419,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 332, 648,-32768, 121,-32768, 144,-32768, - 132,-32768,-32768, 17,-32768, -22,-32768, 143,-32768,-32768, --32768, -17, 137,-32768, 183,-32768, 194, 186,-32768,-32768, --32768,-32768,-32768, 208, 203,-32768,-32768,-32768, 723, 275, --32768,-32768,-32768,-32768, 179, 288,-32768,-32768,-32768, 184, - 190,-32768,-32768, 228, 184, 191, 193, 20,-32768,-32768, - 496,-32768, 86, 184,-32768,-32768,-32768,-32768,-32768, 79, --32768, 188, 195, 200, 258, 355,-32768,-32768, -71,-32768, --32768, 260,-32768,-32768,-32768, 284, 53, 202, 263, 205, - 238, -15, -14,-32768, 55,-32768,-32768, 206,-32768, 207, --32768,-32768,-32768,-32768,-32768, 308, 723, 304, 184, 197, --32768,-32768, 210,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 211, 209, --32768, 93,-32768, 29,-32768, 199, 292, 11, 269, 214, - 10, 221, 255,-32768, 220, 10, 259,-32768, 46,-32768, - 6, 215,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 62, --32768,-32768, 298,-32768, 228, 221, 230, 224,-32768, 189, - 240, 232, 62,-32768,-32768,-32768, 236,-32768,-32768,-32768, --32768, 260, 336, 304, 355, 246, 260, 355,-32768, 254, - 254,-32768,-32768, 573,-32768, 304, 235, 108,-32768,-32768, - 215,-32768, 221, 278, 243, 241,-32768,-32768, 215, 244, - 72, 304, 221, 248, 304,-32768,-32768, 109,-32768,-32768, - 252, 110,-32768,-32768,-32768,-32768, 247, 270, 71, 250, - 266, 267,-32768, 197,-32768,-32768,-32768,-32768, 221, 221, --32768, 221, 221, 176, 261,-32768,-32768, 371,-32768,-32768, - 296,-32768,-32768,-32768,-32768,-32768, 15, 15,-32768, 167, --32768, 11,-32768, 277, 215,-32768, 10, 15,-32768, 282, - 215,-32768, 279,-32768, 215,-32768, 13, 167,-32768, 6, --32768, 274,-32768,-32768, 52,-32768,-32768,-32768,-32768,-32768, --32768, 281,-32768,-32768, 12, 115,-32768,-32768, 285,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 286, - 573,-32768, 573,-32768, 287, 295,-32768,-32768,-32768, 118, --32768, 55,-32768, 304, 294,-32768,-32768, 261,-32768, 221, --32768,-32768,-32768,-32768,-32768, 52, 23, 294, 304,-32768, - 145, 189,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, - 22,-32768,-32768,-32768,-32768, 403, 407,-32768 +static const short yypact[] = { 247, +-32768,-32768, 247,-32768, -74,-32768, 46, 59,-32768,-32768, +-32768,-32768, 49,-32768, -66, 221,-32768,-32768, 57, 55, + 75, 83, 119, 104, 195, 221,-32768, 116,-32768,-32768, +-32768,-32768,-32768, 208,-32768,-32768, 427,-32768, 222, 24, +-32768,-32768,-32768, 86,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 209, 427,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 351, 656,-32768, 146,-32768, 189,-32768, + 162,-32768,-32768, 32,-32768, -1,-32768, 167,-32768,-32768, +-32768, -8, 171,-32768, 194,-32768, 203, 223,-32768,-32768, +-32768,-32768,-32768, 249, 225,-32768,-32768,-32768, 731, 299, +-32768,-32768,-32768,-32768, 196, 305,-32768,-32768,-32768, 232, + 205,-32768,-32768, 247, 232, 210, 213, 6,-32768,-32768, + 504,-32768, 18, 232,-32768,-32768,-32768,-32768,-32768, -3, +-32768, 202, 204, 216, 267, 200,-32768,-32768, -74,-32768, +-32768, 285,-32768,-32768,-32768, 303, -42, 218, 288, 224, + 257, -18, 68,-32768, 71,-32768,-32768, 226,-32768, 227, +-32768,-32768,-32768,-32768,-32768, 323, 731, 320, 232, 80, +-32768,-32768, 220,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 229, 228, +-32768, 61,-32768, 5,-32768, 219, 311, 26, 293, 233, + 52, 215, 274,-32768, 238, 52, 276,-32768, 43,-32768, + 8, 231,-32768,-32768,-32768,-32768,-32768, 321,-32768,-32768, + -2,-32768,-32768, 317,-32768, 247, 215, 244, 241,-32768, + 193, 256, 248, -2,-32768,-32768,-32768, 252,-32768,-32768, +-32768,-32768, 285, 352, 320, 200, 262, 285, 200,-32768, + 270, 270,-32768,-32768, 581,-32768, 320, 250, 66,-32768, +-32768, 231,-32768, 215, 291, 260, 253,-32768,-32768, 231, + 261, 81, 320, 215, 265, 320,-32768,-32768, 124,-32768, +-32768, 266, 143,-32768,-32768,-32768,-32768, 263, 258, 271, + 70, 273, 275, 272,-32768, 80,-32768,-32768,-32768,-32768, + 215, 215,-32768, 215, 215, 279, 269,-32768,-32768, 376, +-32768,-32768, 301,-32768,-32768,-32768,-32768,-32768, 31, 31, +-32768, 207,-32768, 26,-32768, 278, 231,-32768, 52, 31, +-32768, 283, 231,-32768, 280,-32768, 231,-32768, 38, 207, +-32768, 8,-32768,-32768, 277,-32768,-32768, 42,-32768,-32768, +-32768,-32768,-32768,-32768, 282,-32768,-32768, 7, 163,-32768, +-32768, 287,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768, 284, 581,-32768, 581,-32768, 290, 297,-32768, + 352,-32768,-32768, 164,-32768, 71,-32768, 320, 294,-32768, +-32768, 269,-32768, 215,-32768,-32768,-32768,-32768, 376,-32768, + 42, 2, 294, 320,-32768, 173, 193,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768, 10,-32768,-32768,-32768,-32768, + 393, 406,-32768 }; static const short yypgoto[] = {-32768, --32768, 408, 271,-32768,-32768, 399,-32768,-32768, 387,-32768, --32768, 358,-32768,-32768,-32768, 342,-32768, 305,-32768,-32768, - 309,-32768, 356,-32768,-32768, 134,-32768,-32768, 262,-32768, - 92, 227,-32768, 107,-32768, 114,-32768, 187,-32768, 192, --32768,-32768,-32768,-32768, 26, -188, -80, -312, -52,-32768, - 198, -186, -120,-32768, -1,-32768, -244,-32768, -48, -118, --32768, 69,-32768,-32768,-32768, -148,-32768,-32768, -199, -166, - -39, 212,-32768, -204,-32768,-32768,-32768, 47,-32768,-32768, --32768,-32768,-32768,-32768, 56, 63, -265,-32768,-32768,-32768, - 111, -127, -81,-32768,-32768,-32768,-32768, 31,-32768, 171, - -7 +-32768, 404, 281,-32768,-32768, 395,-32768,-32768, 385,-32768, +-32768, 356,-32768,-32768,-32768, 339,-32768, 304,-32768,-32768, + 312,-32768, 358,-32768,-32768, 125,-32768,-32768, 259,-32768, + 82, 234,-32768, 100,-32768, 106,-32768, 179,-32768, 184, +-32768,-32768,-32768,-32768, 17, -189, -78, -139, -53,-32768, + 206, -186, -122,-32768, -56,-32768, -185, 56, -43, -119, +-32768, 40,-32768,-32768,-32768, -150,-32768,-32768, -201, -163, + -101,-32768, 212,-32768, -264,-32768,-32768,-32768, 47,-32768, +-32768,-32768,-32768,-32768,-32768, 60, 63, -162,-32768,-32768, +-32768, 108, -126, -81,-32768,-32768,-32768,-32768, 28,-32768, + 177, -7 }; -#define YYLAST 817 +#define YYLAST 825 static const short yytable[] = { 15, - 121, 120, 158, 230, 207, 15, 208, 251, 188, 260, - 117, 101, 101, 10, 175, 102, 102, 10, 10, 10, - 10, 180, 181, 114, 10, 410, 292, 1, 2, 65, - 5, 7, 72, 5, 171, 172, 79, 404, 143, 264, - 10, 171, 172, 1, 2, 10, 11, 248, 65, 67, - 132, 360, 361, 10, 180, 181, 10, 11, 391, 10, - 392, 248, 369, 324, 200, 200, 79, 64, 10, 20, - 71, 1, 2, 333, 78, 362, 217, 21, 10, 180, - 181, 280, 28, 249, 344, 115, 64, 201, 206, 202, - 202, 405, 16, 375, 144, 406, 118, 249, 22, 354, - 23, 19, 72, 352, 78, 63, 73, 79, 145, 24, - 29, 257, 257, 250, 276, 218, 165, 188, 132, 118, - 188, 175, 384, 112, 63, 414, 161, 230, 190, 133, - 343, 286, -238, 260, 200, 158, -238, 162, 34, 68, - 71, 12, 118, 30, 139, 78, 262, 276, 410, 277, - 31, 160, 17, 379, 164, -264, 222, 171, 172, 202, - 214, 216, 287, 124, 32, 176, 189, 33, 295, 296, - 297, 298, 37, 288, 10, 180, 181, 1, 2, 330, - 323, 217, 166, 10, 180, 181, 167, 36, 328, 66, - 261, 10, 363, 269, 1, 2, 246, 133, 269, 215, - 247, 281, 217, 285, 10, 180, 181, 1, 2, 280, - 376, 321, 336, 339, 413, 322, 337, 340, 387, 80, - 218, 395, 388, 402, 413, 396, 217, 108, 10, 180, - 181, 1, 2, 397, 111, 353, 309, 190, 1, 2, - 190, 218, 219, 310, 367, 116, 315, 124, 319, 371, - 109, 110, 158, 373, 158, 291, 127, 220, 128, 349, - 350, 222, 351, 125, 332, 218, 219, 332, 1, 2, - 171, 172, 171, 172, 126, 189, 221, 134, 189, 83, - 84, 220, 222, 129, 160, 295, 296, 297, 298, 135, - 136, 223, 196, 138, 141, 142, 168, 197, 224, 225, - 221, 226, 170, 169, -265, 199, 222, 198, 209, 211, - 212, 10, 364, 255, 261, 223, 256, 245, 263, 269, - 242, 244, 272, 225, 273, 226, 275, 290, 118, 281, - 364, 294, 285, 293, 82, 301, 303, 382, 305, 307, - 311, 316, 83, 84, 320, 325, 326, 386, 327, 329, - 189, 334, 345, 85, 38, 86, 338, 87, 341, 177, - 178, 179, 10, 180, 181, 1, 2, 88, 189, 346, - 342, 89, 347, 355, 358, 90, 386, 359, 91, 41, - 42, 43, 366, 370, 372, 378, 383, 389, 382, 92, - 45, 409, 393, 390, 93, 46, 94, 47, 95, 182, - 394, 160, 417, 160, 399, 48, 418, 96, 97, 191, - 6, 18, 35, 81, 49, 113, 50, 183, 137, 140, - 106, 51, 98, 52, 53, 54, 10, 348, 213, 1, - 2, 377, 274, 368, 99, 365, 415, 318, 314, 306, - 184, 38, 403, 400, 304, 335, 398, 374, 0, 0, - 0, 0, 0, 0, 0, 0, 39, 185, 0, 0, - 40, 0, 0, 0, 0, 0, 41, 42, 43, 0, - 0, 0, 44, 0, 0, 0, 0, 45, 0, 0, - 0, 0, 46, 0, 47, 0, 0, 0, 0, 0, - 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, - 0, 49, 0, 50, 0, 0, 147, 148, 51, 0, - 52, 53, 54, 149, 0, 0, 0, 85, 38, 86, - 0, 87, 150, 0, 0, 0, 0, 0, 0, 0, + 121, 158, 207, 120, 208, 15, 231, 252, 261, 188, + 101, 101, 175, 415, 10, 10, 409, 171, 172, 117, + 102, 102, 171, 172, 143, 294, 347, 5, 7, 65, + 5, 10, 72, 10, 1, 2, 79, 249, 19, 10, + 67, 357, 1, 2, 114, 10, 180, 181, 65, 10, + 10, 180, 181, 10, 11, 132, 10, 11, 161, 10, + -266, 200, 326, 249, 64, 28, 79, 71, 124, 162, + 410, 78, 335, 250, 411, 217, 63, 10, 180, 181, + 144, 265, 281, 64, 201, 217, 202, 10, 180, 181, + 1, 2, 16, 10, 145, 63, 1, 2, 289, 250, + 166, 78, 72, 355, 167, 118, 115, 79, -240, 290, + 218, 29, -240, 419, 219, 251, 165, 388, 118, 188, + 175, 118, 188, 132, 219, 220, 133, 258, 190, 346, + 68, 73, 231, 287, 261, 158, 365, 71, 112, 277, + 221, 139, 78, 383, 277, 263, 278, 200, 160, 12, + 200, 164, 17, 258, 378, 223, 363, 364, 30, 222, + 214, 216, 176, 189, 247, 223, 31, 372, 248, 323, + 206, 32, 202, 324, 224, 202, 415, 297, 298, 299, + 300, 225, 226, 325, 227, 171, 172, 33, 332, 312, + 262, 330, 317, 270, 133, 366, 215, 34, 270, 352, + 353, 282, 354, 286, 177, 178, 179, 10, 180, 181, + 1, 2, 281, 379, 10, 180, 181, 1, 2, 418, + 217, 36, 10, 180, 181, 1, 2, 338, 37, 418, + 407, 339, 20, 66, 395, 402, 396, 311, 190, 10, + 21, 190, 1, 2, 182, 218, 341, 80, 370, 321, + 342, 374, 108, 293, 158, 376, 158, 1, 2, 219, + 220, 22, 183, 23, 111, 334, 391, 400, 334, 116, + 392, 401, 24, 189, 125, 221, 189, 1, 2, 171, + 172, 124, 160, 126, 217, 184, 10, 180, 181, 297, + 298, 299, 300, 127, 222, 109, 110, 171, 172, 128, + 223, 134, 185, 83, 84, 129, 135, 136, 138, 224, + 168, 196, 169, 141, 367, 142, 262, 226, 170, 227, + -267, 270, 197, 219, 199, 212, 198, 10, 209, 211, + 243, 282, 367, 256, 286, 257, 246, 264, 356, 245, + 386, 273, 274, 276, 118, 288, 292, 295, 296, 189, + 390, 303, 305, 82, 307, 309, 313, 318, 327, 322, + 329, 83, 84, 328, 223, 343, 331, 189, 336, 344, + 340, 345, 85, 38, 86, 348, 87, 350, 349, 361, + 390, 358, 362, 369, 373, 375, 88, 387, 382, 393, + 89, 394, 422, 386, 90, 397, 414, 91, 41, 42, + 43, 160, 398, 160, 404, 423, 6, 18, 92, 45, + 35, 81, 113, 93, 46, 94, 47, 95, 140, 191, + 351, 137, 106, 380, 48, 213, 96, 97, 371, 368, + 320, 316, 420, 49, 10, 50, 399, 1, 2, 275, + 51, 98, 52, 53, 54, 306, 377, 408, 308, 38, + 403, 405, 337, 99, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 39, 0, 0, 0, 40, 0, + 0, 0, 0, 0, 41, 42, 43, 0, 0, 0, + 44, 0, 0, 0, 0, 45, 0, 0, 0, 0, + 46, 0, 47, 0, 0, 0, 0, 0, 0, 0, + 48, 0, 0, 0, 0, 0, 0, 0, 0, 49, + 0, 50, 0, 0, 147, 148, 51, 0, 52, 53, + 54, 149, 0, 0, 0, 85, 38, 86, 0, 87, + 150, 0, 0, 0, 0, 0, 0, 0, 0, 88, + 0, 0, 0, 89, 0, 0, 0, 90, 0, 0, + 91, 41, 42, 43, 0, 0, 0, 0, 0, 151, + 0, 92, 45, 0, 0, 0, 93, 46, 94, 47, + 95, 0, 0, 0, 0, 0, 0, 48, 0, 96, + 97, 152, 153, 0, 0, 0, 49, 0, 50, 0, + 154, 147, 148, 51, 98, 52, 53, 54, 149, 0, + 0, 0, 85, 38, 86, 0, 87, 150, 0, 0, + 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, + 89, 0, 0, 0, 90, 0, 0, 91, 41, 42, + 43, 0, 0, 0, 0, 0, 151, 0, 92, 45, + 0, 0, 0, 93, 46, 94, 47, 95, 0, 0, + 0, 0, 0, 0, 48, 0, 96, 97, 152, 153, + 0, 0, 0, 49, 0, 50, 83, 84, 0, 0, + 51, 98, 52, 53, 54, 0, 0, 85, 38, 86, + 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 90, 0, 0, 91, 41, 42, 43, 0, 0, 0, 0, - 0, 151, 0, 92, 45, 0, 0, 0, 93, 46, + 0, 0, 0, 92, 45, 0, 0, 0, 93, 46, 94, 47, 95, 0, 0, 0, 0, 0, 0, 48, - 0, 96, 97, 152, 153, 0, 0, 0, 49, 0, - 50, 0, 154, 147, 148, 51, 98, 52, 53, 54, - 149, 0, 0, 0, 85, 38, 86, 0, 87, 150, - 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, - 0, 0, 89, 0, 0, 0, 90, 0, 0, 91, - 41, 42, 43, 0, 0, 0, 0, 0, 151, 0, - 92, 45, 0, 0, 0, 93, 46, 94, 47, 95, - 0, 0, 0, 0, 0, 0, 48, 0, 96, 97, - 152, 153, 0, 0, 0, 49, 0, 50, 83, 84, - 0, 0, 51, 98, 52, 53, 54, 0, 0, 85, - 38, 86, 0, 87, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, - 0, 90, 0, 0, 91, 41, 42, 43, 0, 0, - 0, 0, 0, 0, 0, 92, 45, 0, 0, 0, - 93, 46, 94, 47, 95, 0, 0, 0, 0, 0, - 0, 48, 0, 96, 97, 0, 0, 0, 0, 0, - 49, 0, 50, 1, 2, 0, 0, 51, 98, 52, - 53, 54, 0, 0, 85, 38, 86, 0, 87, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, - 0, 0, 89, 0, 0, 0, 90, 0, 0, 91, - 41, 42, 43, 0, 0, 0, 0, 0, 0, 0, - 92, 45, 0, 0, 0, 93, 46, 94, 47, 95, - 0, 0, 0, 0, 0, 0, 48, 0, 96, 97, - 0, 0, 0, 0, 0, 49, 0, 50, 0, 0, - 0, 0, 51, 98, 52, 53, 54 + 0, 96, 97, 0, 0, 0, 0, 0, 49, 0, + 50, 1, 2, 0, 0, 51, 98, 52, 53, 54, + 0, 0, 85, 38, 86, 0, 87, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, + 89, 0, 0, 0, 90, 0, 0, 91, 41, 42, + 43, 0, 0, 0, 0, 0, 0, 0, 92, 45, + 0, 0, 0, 93, 46, 94, 47, 95, 0, 0, + 0, 0, 0, 0, 48, 0, 96, 97, 0, 0, + 0, 0, 0, 49, 0, 50, 0, 0, 0, 0, + 51, 98, 52, 53, 54 }; static const short yycheck[] = { 7, - 82, 82, 121, 170, 153, 13, 155, 194, 136, 198, - 28, 64, 65, 8, 135, 64, 65, 8, 8, 8, - 8, 9, 10, 46, 8, 4, 226, 11, 12, 37, - 0, 103, 40, 3, 13, 14, 44, 15, 19, 30, - 8, 13, 14, 11, 12, 8, 9, 33, 56, 17, - 99, 317, 318, 8, 9, 10, 8, 9, 371, 8, - 373, 33, 328, 263, 80, 80, 74, 37, 8, 12, - 40, 11, 12, 273, 44, 320, 6, 20, 8, 9, - 10, 209, 9, 69, 289, 108, 56, 103, 103, 105, - 105, 69, 34, 338, 75, 73, 114, 69, 41, 304, - 43, 105, 110, 303, 74, 37, 46, 115, 89, 52, - 57, 102, 102, 194, 102, 45, 124, 245, 167, 114, - 248, 242, 111, 107, 56, 104, 41, 294, 136, 99, - 60, 212, 104, 322, 80, 254, 108, 52, 3, 107, - 110, 104, 114, 84, 114, 115, 199, 102, 4, 104, - 84, 121, 104, 102, 124, 103, 86, 13, 14, 105, - 168, 169, 101, 111, 53, 135, 136, 84, 97, 98, - 99, 100, 21, 112, 8, 9, 10, 11, 12, 108, - 261, 6, 104, 8, 9, 10, 108, 106, 269, 12, - 198, 8, 320, 201, 11, 12, 104, 167, 206, 169, - 108, 209, 6, 211, 8, 9, 10, 11, 12, 337, - 338, 104, 104, 104, 401, 108, 108, 108, 104, 39, - 45, 104, 108, 390, 411, 108, 6, 107, 8, 9, - 10, 11, 12, 382, 103, 60, 244, 245, 11, 12, - 248, 45, 46, 245, 325, 103, 248, 111, 256, 331, - 107, 108, 371, 335, 373, 225, 71, 61, 51, 299, - 300, 86, 302, 81, 272, 45, 46, 275, 11, 12, - 13, 14, 13, 14, 81, 245, 80, 3, 248, 11, - 12, 61, 86, 81, 254, 97, 98, 99, 100, 111, - 3, 95, 9, 104, 104, 103, 109, 35, 102, 103, - 80, 105, 103, 109, 103, 68, 86, 103, 103, 103, - 3, 8, 320, 115, 322, 95, 25, 109, 105, 327, - 111, 111, 68, 103, 105, 105, 68, 30, 114, 337, - 338, 108, 340, 104, 3, 96, 105, 345, 103, 4, - 95, 88, 11, 12, 110, 68, 104, 355, 108, 106, - 320, 104, 103, 22, 23, 24, 105, 26, 112, 5, - 6, 7, 8, 9, 10, 11, 12, 36, 338, 104, - 101, 40, 106, 113, 4, 44, 384, 82, 47, 48, - 49, 50, 106, 102, 106, 112, 106, 103, 396, 58, - 59, 399, 106, 108, 63, 64, 65, 66, 67, 45, - 106, 371, 0, 373, 111, 74, 0, 76, 77, 139, - 3, 13, 26, 56, 83, 74, 85, 63, 110, 115, - 65, 90, 91, 92, 93, 94, 8, 294, 167, 11, - 12, 340, 206, 327, 103, 322, 411, 251, 247, 242, - 86, 23, 396, 388, 233, 275, 384, 337, -1, -1, - -1, -1, -1, -1, -1, -1, 38, 103, -1, -1, - 42, -1, -1, -1, -1, -1, 48, 49, 50, -1, - -1, -1, 54, -1, -1, -1, -1, 59, -1, -1, - -1, -1, 64, -1, 66, -1, -1, -1, -1, -1, - -1, -1, 74, -1, -1, -1, -1, -1, -1, -1, - -1, 83, -1, 85, -1, -1, 11, 12, 90, -1, - 92, 93, 94, 18, -1, -1, -1, 22, 23, 24, - -1, 26, 27, -1, -1, -1, -1, -1, -1, -1, + 82, 121, 153, 82, 155, 13, 170, 194, 198, 136, + 64, 65, 135, 4, 8, 8, 15, 13, 14, 28, + 64, 65, 13, 14, 19, 227, 291, 0, 103, 37, + 3, 8, 40, 8, 11, 12, 44, 33, 105, 8, + 17, 306, 11, 12, 46, 8, 9, 10, 56, 8, + 8, 9, 10, 8, 9, 99, 8, 9, 41, 8, + 103, 80, 264, 33, 37, 9, 74, 40, 111, 52, + 69, 44, 274, 69, 73, 6, 37, 8, 9, 10, + 75, 30, 209, 56, 103, 6, 105, 8, 9, 10, + 11, 12, 34, 8, 89, 56, 11, 12, 101, 69, + 104, 74, 110, 305, 108, 114, 108, 115, 104, 112, + 31, 57, 108, 104, 45, 194, 124, 111, 114, 246, + 243, 114, 249, 167, 45, 46, 99, 102, 136, 60, + 107, 46, 296, 212, 324, 255, 322, 110, 107, 102, + 61, 114, 115, 102, 102, 199, 104, 80, 121, 104, + 80, 124, 104, 102, 340, 86, 319, 320, 84, 80, + 168, 169, 135, 136, 104, 86, 84, 330, 108, 104, + 103, 53, 105, 108, 95, 105, 4, 97, 98, 99, + 100, 102, 103, 262, 105, 13, 14, 84, 108, 246, + 198, 270, 249, 201, 167, 322, 169, 3, 206, 301, + 302, 209, 304, 211, 5, 6, 7, 8, 9, 10, + 11, 12, 339, 340, 8, 9, 10, 11, 12, 406, + 6, 106, 8, 9, 10, 11, 12, 104, 21, 416, + 394, 108, 12, 12, 374, 386, 376, 245, 246, 8, + 20, 249, 11, 12, 45, 31, 104, 39, 327, 257, + 108, 333, 107, 226, 374, 337, 376, 11, 12, 45, + 46, 41, 63, 43, 103, 273, 104, 104, 276, 103, + 108, 108, 52, 246, 81, 61, 249, 11, 12, 13, + 14, 111, 255, 81, 6, 86, 8, 9, 10, 97, + 98, 99, 100, 71, 80, 107, 108, 13, 14, 51, + 86, 3, 103, 11, 12, 81, 111, 3, 104, 95, + 109, 9, 109, 104, 322, 103, 324, 103, 103, 105, + 103, 329, 35, 45, 68, 3, 103, 8, 103, 103, + 111, 339, 340, 115, 342, 25, 109, 105, 60, 111, + 348, 68, 105, 68, 114, 25, 30, 104, 108, 322, + 358, 96, 105, 3, 103, 4, 95, 88, 68, 110, + 108, 11, 12, 104, 86, 103, 106, 340, 104, 112, + 105, 101, 22, 23, 24, 103, 26, 106, 104, 4, + 388, 113, 82, 106, 102, 106, 36, 106, 112, 103, + 40, 108, 0, 401, 44, 106, 404, 47, 48, 49, + 50, 374, 106, 376, 111, 0, 3, 13, 58, 59, + 26, 56, 74, 63, 64, 65, 66, 67, 115, 139, + 296, 110, 65, 342, 74, 167, 76, 77, 329, 324, + 252, 248, 416, 83, 8, 85, 381, 11, 12, 206, + 90, 91, 92, 93, 94, 234, 339, 401, 243, 23, + 388, 392, 276, 103, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 38, -1, -1, -1, 42, -1, + -1, -1, -1, -1, 48, 49, 50, -1, -1, -1, + 54, -1, -1, -1, -1, 59, -1, -1, -1, -1, + 64, -1, 66, -1, -1, -1, -1, -1, -1, -1, + 74, -1, -1, -1, -1, -1, -1, -1, -1, 83, + -1, 85, -1, -1, 11, 12, 90, -1, 92, 93, + 94, 18, -1, -1, -1, 22, 23, 24, -1, 26, + 27, -1, -1, -1, -1, -1, -1, -1, -1, 36, + -1, -1, -1, 40, -1, -1, -1, 44, -1, -1, + 47, 48, 49, 50, -1, -1, -1, -1, -1, 56, + -1, 58, 59, -1, -1, -1, 63, 64, 65, 66, + 67, -1, -1, -1, -1, -1, -1, 74, -1, 76, + 77, 78, 79, -1, -1, -1, 83, -1, 85, -1, + 87, 11, 12, 90, 91, 92, 93, 94, 18, -1, + -1, -1, 22, 23, 24, -1, 26, 27, -1, -1, + -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, + 40, -1, -1, -1, 44, -1, -1, 47, 48, 49, + 50, -1, -1, -1, -1, -1, 56, -1, 58, 59, + -1, -1, -1, 63, 64, 65, 66, 67, -1, -1, + -1, -1, -1, -1, 74, -1, 76, 77, 78, 79, + -1, -1, -1, 83, -1, 85, 11, 12, -1, -1, + 90, 91, 92, 93, 94, -1, -1, 22, 23, 24, + -1, 26, -1, -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, 40, -1, -1, -1, 44, -1, -1, 47, 48, 49, 50, -1, -1, -1, -1, - -1, 56, -1, 58, 59, -1, -1, -1, 63, 64, + -1, -1, -1, 58, 59, -1, -1, -1, 63, 64, 65, 66, 67, -1, -1, -1, -1, -1, -1, 74, - -1, 76, 77, 78, 79, -1, -1, -1, 83, -1, - 85, -1, 87, 11, 12, 90, 91, 92, 93, 94, - 18, -1, -1, -1, 22, 23, 24, -1, 26, 27, - -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, - -1, -1, 40, -1, -1, -1, 44, -1, -1, 47, - 48, 49, 50, -1, -1, -1, -1, -1, 56, -1, - 58, 59, -1, -1, -1, 63, 64, 65, 66, 67, - -1, -1, -1, -1, -1, -1, 74, -1, 76, 77, - 78, 79, -1, -1, -1, 83, -1, 85, 11, 12, - -1, -1, 90, 91, 92, 93, 94, -1, -1, 22, - 23, 24, -1, 26, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 36, -1, -1, -1, 40, -1, -1, - -1, 44, -1, -1, 47, 48, 49, 50, -1, -1, - -1, -1, -1, -1, -1, 58, 59, -1, -1, -1, - 63, 64, 65, 66, 67, -1, -1, -1, -1, -1, - -1, 74, -1, 76, 77, -1, -1, -1, -1, -1, - 83, -1, 85, 11, 12, -1, -1, 90, 91, 92, - 93, 94, -1, -1, 22, 23, 24, -1, 26, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, - -1, -1, 40, -1, -1, -1, 44, -1, -1, 47, - 48, 49, 50, -1, -1, -1, -1, -1, -1, -1, - 58, 59, -1, -1, -1, 63, 64, 65, 66, 67, - -1, -1, -1, -1, -1, -1, 74, -1, 76, 77, - -1, -1, -1, -1, -1, 83, -1, 85, -1, -1, - -1, -1, 90, 91, 92, 93, 94 + -1, 76, 77, -1, -1, -1, -1, -1, 83, -1, + 85, 11, 12, -1, -1, 90, 91, 92, 93, 94, + -1, -1, 22, 23, 24, -1, 26, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, + 40, -1, -1, -1, 44, -1, -1, 47, 48, 49, + 50, -1, -1, -1, -1, -1, -1, -1, 58, 59, + -1, -1, -1, 63, 64, 65, 66, 67, -1, -1, + -1, -1, -1, -1, 74, -1, 76, 77, -1, -1, + -1, -1, -1, 83, -1, 85, -1, -1, -1, -1, + 90, 91, 92, 93, 94 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/share/bison.simple" @@ -2563,18 +2571,17 @@ case 143: case 144: #line 1390 "asn1p_y.y" { - yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 2; + yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 1; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); checkmem(yyval.tv_opaque.buf); yyval.tv_opaque.buf[0] = '{'; - yyval.tv_opaque.buf[1] = ' '; - memcpy(yyval.tv_opaque.buf + 2, yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len); + memcpy(yyval.tv_opaque.buf + 1, yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len); yyval.tv_opaque.buf[yyval.tv_opaque.len] = '\0'; free(yyvsp[0].tv_opaque.buf); ; break;} case 145: -#line 1400 "asn1p_y.y" +#line 1399 "asn1p_y.y" { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); @@ -2589,71 +2596,71 @@ case 145: ; break;} case 146: -#line 1415 "asn1p_y.y" +#line 1414 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BOOLEAN; ; break;} case 147: -#line 1416 "asn1p_y.y" +#line 1415 "asn1p_y.y" { yyval.a_type = ASN_BASIC_NULL; ; break;} case 148: -#line 1417 "asn1p_y.y" +#line 1416 "asn1p_y.y" { yyval.a_type = ASN_BASIC_REAL; ; break;} case 149: -#line 1418 "asn1p_y.y" +#line 1417 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} case 150: -#line 1419 "asn1p_y.y" +#line 1418 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OCTET_STRING; ; break;} case 151: -#line 1420 "asn1p_y.y" +#line 1419 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; break;} case 152: -#line 1421 "asn1p_y.y" +#line 1420 "asn1p_y.y" { yyval.a_type = ASN_BASIC_RELATIVE_OID; ; break;} case 153: -#line 1422 "asn1p_y.y" +#line 1421 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EXTERNAL; ; break;} case 154: -#line 1423 "asn1p_y.y" +#line 1422 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; break;} case 155: -#line 1424 "asn1p_y.y" +#line 1423 "asn1p_y.y" { yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; break;} case 156: -#line 1425 "asn1p_y.y" +#line 1424 "asn1p_y.y" { yyval.a_type = ASN_BASIC_UTCTime; ; break;} case 157: -#line 1426 "asn1p_y.y" +#line 1425 "asn1p_y.y" { yyval.a_type = ASN_BASIC_GeneralizedTime; ; break;} case 158: -#line 1427 "asn1p_y.y" +#line 1426 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} case 159: -#line 1434 "asn1p_y.y" +#line 1433 "asn1p_y.y" { yyval.a_type = ASN_BASIC_INTEGER; ; break;} case 160: -#line 1435 "asn1p_y.y" +#line 1434 "asn1p_y.y" { yyval.a_type = ASN_BASIC_ENUMERATED; ; break;} case 161: -#line 1436 "asn1p_y.y" +#line 1435 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BIT_STRING; ; break;} case 162: -#line 1440 "asn1p_y.y" +#line 1439 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2662,7 +2669,7 @@ case 162: ; break;} case 163: -#line 1446 "asn1p_y.y" +#line 1445 "asn1p_y.y" { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; @@ -2675,91 +2682,91 @@ case 163: ; break;} case 164: -#line 1459 "asn1p_y.y" +#line 1458 "asn1p_y.y" { yyval.a_type = ASN_STRING_BMPString; ; break;} case 165: -#line 1460 "asn1p_y.y" +#line 1459 "asn1p_y.y" { yyval.a_type = ASN_STRING_GeneralString; fprintf(stderr, "WARNING: GeneralString is not fully supported\n"); ; break;} case 166: -#line 1464 "asn1p_y.y" +#line 1463 "asn1p_y.y" { yyval.a_type = ASN_STRING_GraphicString; fprintf(stderr, "WARNING: GraphicString is not fully supported\n"); ; break;} case 167: -#line 1468 "asn1p_y.y" +#line 1467 "asn1p_y.y" { yyval.a_type = ASN_STRING_IA5String; ; break;} case 168: -#line 1469 "asn1p_y.y" +#line 1468 "asn1p_y.y" { yyval.a_type = ASN_STRING_ISO646String; ; break;} case 169: -#line 1470 "asn1p_y.y" +#line 1469 "asn1p_y.y" { yyval.a_type = ASN_STRING_NumericString; ; break;} case 170: -#line 1471 "asn1p_y.y" +#line 1470 "asn1p_y.y" { yyval.a_type = ASN_STRING_PrintableString; ; break;} case 171: -#line 1472 "asn1p_y.y" +#line 1471 "asn1p_y.y" { yyval.a_type = ASN_STRING_T61String; fprintf(stderr, "WARNING: T61String is not fully supported\n"); ; break;} case 172: -#line 1476 "asn1p_y.y" +#line 1475 "asn1p_y.y" { yyval.a_type = ASN_STRING_TeletexString; ; break;} case 173: -#line 1477 "asn1p_y.y" +#line 1476 "asn1p_y.y" { yyval.a_type = ASN_STRING_UniversalString; ; break;} case 174: -#line 1478 "asn1p_y.y" +#line 1477 "asn1p_y.y" { yyval.a_type = ASN_STRING_UTF8String; ; break;} case 175: -#line 1479 "asn1p_y.y" +#line 1478 "asn1p_y.y" { yyval.a_type = ASN_STRING_VideotexString; fprintf(stderr, "WARNING: VideotexString is not fully supported\n"); ; break;} case 176: -#line 1483 "asn1p_y.y" +#line 1482 "asn1p_y.y" { yyval.a_type = ASN_STRING_VisibleString; ; break;} case 177: -#line 1484 "asn1p_y.y" +#line 1483 "asn1p_y.y" { yyval.a_type = ASN_STRING_ObjectDescriptor; ; break;} case 183: -#line 1496 "asn1p_y.y" +#line 1495 "asn1p_y.y" { yyval.a_constr = 0; ; break;} case 184: -#line 1497 "asn1p_y.y" +#line 1496 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 185: -#line 1503 "asn1p_y.y" +#line 1502 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); ; break;} case 186: -#line 1506 "asn1p_y.y" +#line 1505 "asn1p_y.y" { /* * This is a special case, for compatibility purposes. @@ -2769,25 +2776,25 @@ case 186: ; break;} case 187: -#line 1516 "asn1p_y.y" +#line 1515 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; ; break;} case 188: -#line 1519 "asn1p_y.y" +#line 1518 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} case 189: -#line 1525 "asn1p_y.y" +#line 1524 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 190: -#line 1528 "asn1p_y.y" +#line 1527 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2796,7 +2803,7 @@ case 190: ; break;} case 191: -#line 1534 "asn1p_y.y" +#line 1533 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2807,31 +2814,31 @@ case 191: ; break;} case 192: -#line 1545 "asn1p_y.y" +#line 1544 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 193: -#line 1548 "asn1p_y.y" +#line 1547 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 194: -#line 1551 "asn1p_y.y" +#line 1550 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 195: -#line 1554 "asn1p_y.y" +#line 1553 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 196: -#line 1560 "asn1p_y.y" +#line 1559 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2842,7 +2849,7 @@ case 196: ; break;} case 197: -#line 1568 "asn1p_y.y" +#line 1567 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2853,7 +2860,7 @@ case 197: ; break;} case 198: -#line 1576 "asn1p_y.y" +#line 1575 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2862,7 +2869,7 @@ case 198: ; break;} case 199: -#line 1582 "asn1p_y.y" +#line 1581 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2871,7 +2878,7 @@ case 199: ; break;} case 200: -#line 1588 "asn1p_y.y" +#line 1587 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2881,7 +2888,7 @@ case 200: ; break;} case 201: -#line 1595 "asn1p_y.y" +#line 1594 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2892,7 +2899,7 @@ case 201: ; break;} case 202: -#line 1603 "asn1p_y.y" +#line 1602 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2903,7 +2910,7 @@ case 202: ; break;} case 203: -#line 1611 "asn1p_y.y" +#line 1610 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2915,76 +2922,91 @@ case 203: ; break;} case 204: -#line 1620 "asn1p_y.y" +#line 1619 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 205: -#line 1623 "asn1p_y.y" +#line 1622 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 206: -#line 1629 "asn1p_y.y" -{ yyval.a_ctype = ACT_EL_RANGE; ; +#line 1626 "asn1p_y.y" +{ asn1p_lexer_hack_push_opaque_state(); ; break;} case 207: -#line 1630 "asn1p_y.y" -{ yyval.a_ctype = ACT_EL_RLRANGE; ; +#line 1626 "asn1p_y.y" +{ + yyval.a_constr = asn1p_constraint_new(yylineno); + checkmem(yyval.a_constr); + yyval.a_constr->type = ACT_CT_CTDBY; + yyval.a_constr->value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); + checkmem(yyval.a_constr->value); + yyval.a_constr->value->type = ATV_UNPARSED; + ; break;} case 208: -#line 1631 "asn1p_y.y" -{ yyval.a_ctype = ACT_EL_LLRANGE; ; +#line 1637 "asn1p_y.y" +{ yyval.a_ctype = ACT_EL_RANGE; ; break;} case 209: -#line 1632 "asn1p_y.y" -{ yyval.a_ctype = ACT_EL_ULRANGE; ; +#line 1638 "asn1p_y.y" +{ yyval.a_ctype = ACT_EL_RLRANGE; ; break;} case 210: -#line 1636 "asn1p_y.y" +#line 1639 "asn1p_y.y" +{ yyval.a_ctype = ACT_EL_LLRANGE; ; + break;} +case 211: +#line 1640 "asn1p_y.y" +{ yyval.a_ctype = ACT_EL_ULRANGE; ; + break;} +case 212: +#line 1644 "asn1p_y.y" { yyval.a_ctype = ACT_CT_SIZE; ; break;} -case 211: -#line 1639 "asn1p_y.y" +case 213: +#line 1647 "asn1p_y.y" { yyval.a_ctype = ACT_CT_FROM; ; break;} -case 212: -#line 1645 "asn1p_y.y" +case 214: +#line 1653 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_FALSE; ; break;} -case 213: -#line 1650 "asn1p_y.y" +case 215: +#line 1658 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); yyval.a_value->type = ATV_TRUE; ; break;} -case 214: -#line 1655 "asn1p_y.y" +case 216: +#line 1663 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 215: -#line 1658 "asn1p_y.y" +case 217: +#line 1666 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} -case 216: -#line 1662 "asn1p_y.y" +case 218: +#line 1670 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2997,8 +3019,8 @@ case 216: free(yyvsp[0].tv_str); ; break;} -case 217: -#line 1676 "asn1p_y.y" +case 219: +#line 1684 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3011,34 +3033,34 @@ case 217: free(yyvsp[0].tv_str); ; break;} -case 218: -#line 1690 "asn1p_y.y" +case 220: +#line 1698 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); ; break;} -case 219: -#line 1696 "asn1p_y.y" +case 221: +#line 1704 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 220: -#line 1699 "asn1p_y.y" +case 222: +#line 1707 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 221: -#line 1705 "asn1p_y.y" +case 223: +#line 1713 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_EXT; ; break;} -case 222: -#line 1710 "asn1p_y.y" +case 224: +#line 1718 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3047,46 +3069,46 @@ case 222: yyval.a_constr->presence = yyvsp[0].a_pres; ; break;} -case 223: -#line 1723 "asn1p_y.y" +case 225: +#line 1731 "asn1p_y.y" { yyval.a_pres = ACPRES_DEFAULT; ; break;} -case 224: -#line 1724 "asn1p_y.y" +case 226: +#line 1732 "asn1p_y.y" { yyval.a_pres = yyvsp[0].a_pres; ; break;} -case 225: -#line 1728 "asn1p_y.y" +case 227: +#line 1736 "asn1p_y.y" { yyval.a_pres = ACPRES_PRESENT; ; break;} -case 226: -#line 1731 "asn1p_y.y" +case 228: +#line 1739 "asn1p_y.y" { yyval.a_pres = ACPRES_ABSENT; ; break;} -case 227: -#line 1734 "asn1p_y.y" +case 229: +#line 1742 "asn1p_y.y" { yyval.a_pres = ACPRES_OPTIONAL; ; break;} -case 228: -#line 1740 "asn1p_y.y" +case 230: +#line 1748 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 229: -#line 1743 "asn1p_y.y" +case 231: +#line 1751 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 230: -#line 1752 "asn1p_y.y" +case 232: +#line 1760 "asn1p_y.y" { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; @@ -3100,14 +3122,14 @@ case 230: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, ct, 0); ; break;} -case 231: -#line 1767 "asn1p_y.y" +case 233: +#line 1775 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} -case 232: -#line 1773 "asn1p_y.y" +case 234: +#line 1781 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3115,8 +3137,8 @@ case 232: yyval.a_constr->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); ; break;} -case 233: -#line 1779 "asn1p_y.y" +case 235: +#line 1787 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3126,8 +3148,8 @@ case 233: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); ; break;} -case 234: -#line 1793 "asn1p_y.y" +case 236: +#line 1801 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; @@ -3140,8 +3162,8 @@ case 234: free(yyvsp[0].tv_str); ; break;} -case 235: -#line 1804 "asn1p_y.y" +case 237: +#line 1812 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; @@ -3155,14 +3177,14 @@ case 235: free(yyvsp[0].tv_str); ; break;} -case 236: -#line 1820 "asn1p_y.y" +case 238: +#line 1828 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 237: -#line 1823 "asn1p_y.y" +case 239: +#line 1831 "asn1p_y.y" { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); @@ -3173,61 +3195,61 @@ case 237: yyval.tv_str[l1 + 1 + l3] = '\0'; ; break;} -case 238: -#line 1841 "asn1p_y.y" +case 240: +#line 1849 "asn1p_y.y" { yyval.a_marker.flags = EM_NOMARK; yyval.a_marker.default_value = 0; ; break;} -case 239: -#line 1845 "asn1p_y.y" +case 241: +#line 1853 "asn1p_y.y" { yyval.a_marker = yyvsp[0].a_marker; ; break;} -case 240: -#line 1849 "asn1p_y.y" +case 242: +#line 1857 "asn1p_y.y" { yyval.a_marker.flags = EM_OPTIONAL; yyval.a_marker.default_value = 0; ; break;} -case 241: -#line 1853 "asn1p_y.y" +case 243: +#line 1861 "asn1p_y.y" { yyval.a_marker.flags = EM_DEFAULT; yyval.a_marker.default_value = yyvsp[0].a_value; ; break;} -case 242: -#line 1876 "asn1p_y.y" +case 244: +#line 1884 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); ; break;} -case 243: -#line 1880 "asn1p_y.y" +case 245: +#line 1888 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; ; break;} -case 244: -#line 1886 "asn1p_y.y" +case 246: +#line 1894 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 245: -#line 1891 "asn1p_y.y" +case 247: +#line 1899 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 246: -#line 1898 "asn1p_y.y" +case 248: +#line 1906 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3236,8 +3258,8 @@ case 246: yyval.a_expr->Identifier = yyvsp[0].tv_str; ; break;} -case 247: -#line 1905 "asn1p_y.y" +case 249: +#line 1913 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3247,8 +3269,8 @@ case 247: yyval.a_expr->value = yyvsp[-1].a_value; ; break;} -case 248: -#line 1913 "asn1p_y.y" +case 250: +#line 1921 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3258,8 +3280,8 @@ case 248: yyval.a_expr->value = yyvsp[-1].a_value; ; break;} -case 249: -#line 1921 "asn1p_y.y" +case 251: +#line 1929 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3268,8 +3290,8 @@ case 249: yyval.a_expr->value = yyvsp[0].a_value; ; break;} -case 250: -#line 1928 "asn1p_y.y" +case 252: +#line 1936 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3279,103 +3301,103 @@ case 250: yyval.a_expr->meta_type = AMT_VALUE; ; break;} -case 251: -#line 1939 "asn1p_y.y" +case 253: +#line 1947 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} -case 252: -#line 1943 "asn1p_y.y" +case 254: +#line 1951 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} -case 253: -#line 1974 "asn1p_y.y" +case 255: +#line 1982 "asn1p_y.y" { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; break;} -case 254: -#line 1975 "asn1p_y.y" +case 256: +#line 1983 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; ; break;} -case 255: -#line 1979 "asn1p_y.y" +case 257: +#line 1987 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = yyvsp[0].a_tag.tag_mode; ; break;} -case 256: -#line 1986 "asn1p_y.y" +case 258: +#line 1994 "asn1p_y.y" { yyval.a_tag = yyvsp[-2].a_tag; yyval.a_tag.tag_value = yyvsp[-1].a_int; ; break;} -case 257: -#line 1992 "asn1p_y.y" +case 259: +#line 2000 "asn1p_y.y" { yyval.a_tag.tag_class = TC_CONTEXT_SPECIFIC; ; break;} -case 258: -#line 1993 "asn1p_y.y" +case 260: +#line 2001 "asn1p_y.y" { yyval.a_tag.tag_class = TC_UNIVERSAL; ; break;} -case 259: -#line 1994 "asn1p_y.y" +case 261: +#line 2002 "asn1p_y.y" { yyval.a_tag.tag_class = TC_APPLICATION; ; break;} -case 260: -#line 1995 "asn1p_y.y" +case 262: +#line 2003 "asn1p_y.y" { yyval.a_tag.tag_class = TC_PRIVATE; ; break;} -case 261: -#line 1999 "asn1p_y.y" +case 263: +#line 2007 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_DEFAULT; ; break;} -case 262: -#line 2000 "asn1p_y.y" +case 264: +#line 2008 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_IMPLICIT; ; break;} -case 263: -#line 2001 "asn1p_y.y" +case 265: +#line 2009 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_EXPLICIT; ; break;} -case 264: -#line 2005 "asn1p_y.y" +case 266: +#line 2013 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 265: -#line 2009 "asn1p_y.y" +case 267: +#line 2017 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 266: -#line 2017 "asn1p_y.y" +case 268: +#line 2025 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 267: -#line 2024 "asn1p_y.y" +case 269: +#line 2032 "asn1p_y.y" { yyval.tv_str = 0; ; break;} -case 268: -#line 2025 "asn1p_y.y" +case 270: +#line 2033 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 269: -#line 2030 "asn1p_y.y" +case 271: +#line 2038 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; @@ -3603,7 +3625,7 @@ case 269: } return 1; } -#line 2036 "asn1p_y.y" +#line 2044 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index b3796675b..f9c7ed4fb 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -1388,12 +1388,11 @@ DefinedValue: Opaque: TOK_opaque { - $$.len = $1.len + 2; + $$.len = $1.len + 1; $$.buf = malloc($$.len + 1); checkmem($$.buf); $$.buf[0] = '{'; - $$.buf[1] = ' '; - memcpy($$.buf + 2, $1.buf, $1.len); + memcpy($$.buf + 1, $1.buf, $1.len); $$.buf[$$.len] = '\0'; free($1.buf); } @@ -1623,6 +1622,15 @@ ConstraintSubtypeElement: | WithComponents { $$ = $1; } + | TOK_CONSTRAINED TOK_BY '{' + { asn1p_lexer_hack_push_opaque_state(); } Opaque /* '}' */ { + $$ = asn1p_constraint_new(yylineno); + checkmem($$); + $$->type = ACT_CT_CTDBY; + $$->value = asn1p_value_frombuf($5.buf, $5.len, 0); + checkmem($$->value); + $$->value->type = ATV_UNPARSED; + } ; ConstraintRangeSpec: diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index 0cb730416..db9f10617 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -322,6 +322,11 @@ asn1print_constraint(asn1p_constraint_t *ct, enum asn1print_flags flags) { case ACT_CT_WCOMP: case ACT_CT_WCOMPS: printf("???"); + case ACT_CT_CTDBY: + printf("CONSTRAINED BY "); + assert(ct->value->type == ATV_UNPARSED); + fwrite(ct->value->value.string.buf, + 1, ct->value->value.string.size, stdout); break; case ACT_CA_SET: symno++; case ACT_CA_CRC: symno++; diff --git a/tests/34-class-OK.asn1.-EF b/tests/34-class-OK.asn1.-EF index d0e379fe7..340f12755 100644 --- a/tests/34-class-OK.asn1.-EF +++ b/tests/34-class-OK.asn1.-EF @@ -22,7 +22,7 @@ EXTENSION-ATTRIBUTE ::= CLASS { } WITH SYNTAX {&Type IDENTIFIED BY &id} -terminal-type EXTENSION-ATTRIBUTE ::= { TerminalType IDENTIFIED BY 23} +terminal-type EXTENSION-ATTRIBUTE ::= {TerminalType IDENTIFIED BY 23} ExtensionAttribute ::= SEQUENCE { extension-attribute-type [0] IMPLICIT EXTENSION-ATTRIBUTE.&id ({ExtensionAttributeTable}), diff --git a/tests/79-constrained-by-OK.asn1 b/tests/79-constrained-by-OK.asn1 new file mode 100644 index 000000000..abbcae5f5 --- /dev/null +++ b/tests/79-constrained-by-OK.asn1 @@ -0,0 +1,19 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .79 + +ModuleTestConstrainedBy + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 79 } + DEFINITIONS ::= +BEGIN + + Type ::= SEQUENCE { + int INTEGER, + ... + } (CONSTRAINED BY { -- nothing -- }) + +END From 76ffc60bc61e91f763048f8818a22e26505f0574 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 20 Mar 2005 14:31:11 +0000 Subject: [PATCH 0827/1469] up date git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@827 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 31ba28184..4f4a1535b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9.13: 2005-Mar-17 +0.9.13: 2005-Mar-20 * Added extra const qualifiers into the support code. * More RFC variations supported in crfc2asn1.pl. From cc9779dd1dd417fb4f1b90d6231134dd6bc8040f Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 20 Mar 2005 14:50:50 +0000 Subject: [PATCH 0828/1469] constrained by git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@828 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/79-constrained-by-OK.asn1.-EF | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 tests/79-constrained-by-OK.asn1.-EF diff --git a/tests/79-constrained-by-OK.asn1.-EF b/tests/79-constrained-by-OK.asn1.-EF new file mode 100644 index 000000000..0a91f340d --- /dev/null +++ b/tests/79-constrained-by-OK.asn1.-EF @@ -0,0 +1,11 @@ +ModuleTestConstrainedBy { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 79 } +DEFINITIONS ::= +BEGIN + +Type ::= SEQUENCE { + int INTEGER, + ... +} (CONSTRAINED BY { -- nothing -- }) + +END From 2566daf39cd1d3e53e96fa422f4acbe0e7d74d03 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 24 Mar 2005 03:30:13 +0000 Subject: [PATCH 0829/1469] SF#3063753 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@829 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/Makefile.am | 6 ++++-- doc/Makefile.in | 9 +++++++-- examples/Makefile.am | 18 +++++++++--------- examples/Makefile.in | 20 ++++++++++---------- libasn1parser/Makefile.in | 2 +- skeletons/Makefile.am | 4 +++- skeletons/Makefile.in | 5 ++++- 7 files changed, 38 insertions(+), 26 deletions(-) diff --git a/doc/Makefile.am b/doc/Makefile.am index 644f2ae48..6ee920a0a 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -1,8 +1,10 @@ docsdir = $(datadir)/doc/asn1c -docs_DATA = *.pdf *.html +docs_DATA = $(srcdir)/*.pdf \ + $(srcdir)/*.html -EXTRA_DIST = *.pdf *.html +EXTRA_DIST = $(srcdir)/*.pdf \ + $(srcdir)/*.html CLEANFILES = *.*~ diff --git a/doc/Makefile.in b/doc/Makefile.in index 7d105e259..666e28dce 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -160,8 +160,12 @@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ docsdir = $(datadir)/doc/asn1c -docs_DATA = *.pdf *.html -EXTRA_DIST = *.pdf *.html +docs_DATA = $(srcdir)/*.pdf \ + $(srcdir)/*.html + +EXTRA_DIST = $(srcdir)/*.pdf \ + $(srcdir)/*.html + CLEANFILES = *.*~ all: all-am @@ -230,6 +234,7 @@ CTAGS: distdir: $(DISTFILES) + $(mkdir_p) $(distdir)/$(srcdir) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ diff --git a/examples/Makefile.am b/examples/Makefile.am index 716ec2cfc..d280de0e3 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -11,15 +11,15 @@ all: $(ASN1_FILES_1) $(ASN1_FILES_1): crfc2asn1.pl $(ASN1_SOURCE_1) ./crfc2asn1.pl $(ASN1_SOURCE_1) -EXTRA_DIST = rfc*.txt \ - sample.source.PKIX1/README \ - sample.source.PKIX1/config.h \ - sample.source.PKIX1/Makefile \ - sample.source.PKIX1/regenerate.Makefile \ - sample.source.TAP3/README \ - sample.source.TAP3/config.h \ - sample.source.TAP3/Makefile \ - sample.source.TAP3/regenerate.Makefile +EXTRA_DIST = $(srcdir)/rfc*.txt \ + $(srcdir)/sample.source.PKIX1/README \ + $(srcdir)/sample.source.PKIX1/config.h \ + $(srcdir)/sample.source.PKIX1/Makefile \ + $(srcdir)/sample.source.PKIX1/regenerate.Makefile \ + $(srcdir)/sample.source.TAP3/README \ + $(srcdir)/sample.source.TAP3/config.h \ + $(srcdir)/sample.source.TAP3/Makefile \ + $(srcdir)/sample.source.TAP3/regenerate.Makefile CLEANFILES = $(ASN1_FILES_1) diff --git a/examples/Makefile.in b/examples/Makefile.in index 721d5fb30..07bc32630 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -166,15 +166,15 @@ ASN1_FILES_1 = \ rfc3280-PKIX1Explicit88.asn1 \ rfc3280-PKIX1Implicit88.asn1 -EXTRA_DIST = rfc*.txt \ - sample.source.PKIX1/README \ - sample.source.PKIX1/config.h \ - sample.source.PKIX1/Makefile \ - sample.source.PKIX1/regenerate.Makefile \ - sample.source.TAP3/README \ - sample.source.TAP3/config.h \ - sample.source.TAP3/Makefile \ - sample.source.TAP3/regenerate.Makefile +EXTRA_DIST = $(srcdir)/rfc*.txt \ + $(srcdir)/sample.source.PKIX1/README \ + $(srcdir)/sample.source.PKIX1/config.h \ + $(srcdir)/sample.source.PKIX1/Makefile \ + $(srcdir)/sample.source.PKIX1/regenerate.Makefile \ + $(srcdir)/sample.source.TAP3/README \ + $(srcdir)/sample.source.TAP3/config.h \ + $(srcdir)/sample.source.TAP3/Makefile \ + $(srcdir)/sample.source.TAP3/regenerate.Makefile CLEANFILES = $(ASN1_FILES_1) all: all-am @@ -246,7 +246,7 @@ CTAGS: distdir: $(DISTFILES) - $(mkdir_p) $(distdir)/sample.source.PKIX1 $(distdir)/sample.source.TAP3 + $(mkdir_p) $(distdir)/$(srcdir) $(distdir)/$(srcdir)/sample.source.PKIX1 $(distdir)/$(srcdir)/sample.source.TAP3 @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index cb9ebd03f..76a6ef231 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -448,8 +448,8 @@ maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -rm -f asn1p_l.c - -rm -f asn1p_y.c -rm -f asn1p_y.h + -rm -f asn1p_y.c clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ diff --git a/skeletons/Makefile.am b/skeletons/Makefile.am index a029345ca..4a07f704c 100644 --- a/skeletons/Makefile.am +++ b/skeletons/Makefile.am @@ -1,7 +1,9 @@ SUBDIRS = tests -dist_pkgdata_DATA = *.[ch] file-dependencies +dist_pkgdata_DATA = \ + $(srcdir)/*.[ch] \ + $(srcdir)/file-dependencies uninstall-local: -@echo -n " " -rm -f -r $(DESTDIR)$(pkgdatadir) diff --git a/skeletons/Makefile.in b/skeletons/Makefile.in index 15a236b17..502fdad6d 100644 --- a/skeletons/Makefile.in +++ b/skeletons/Makefile.in @@ -170,7 +170,10 @@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ SUBDIRS = tests -dist_pkgdata_DATA = *.[ch] file-dependencies +dist_pkgdata_DATA = \ + $(srcdir)/*.[ch] \ + $(srcdir)/file-dependencies + all: all-recursive .SUFFIXES: From e1e6ed87ee4dc0997ccc2cd807606a7472fc9c17 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 24 Mar 2005 14:26:38 +0000 Subject: [PATCH 0830/1469] Support for some CharsDefn git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@830 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 4 +- libasn1fix/asn1fix_crange.c | 5 + libasn1parser/asn1p_constr.h | 1 + libasn1parser/asn1p_value.c | 4 + libasn1parser/asn1p_value.h | 4 +- libasn1parser/asn1p_y.c | 1632 ++++++++++++++++++---------------- libasn1parser/asn1p_y.y | 46 +- libasn1print/asn1print.c | 21 +- tests/80-chardefs-OK.asn1 | 25 + 9 files changed, 945 insertions(+), 797 deletions(-) create mode 100644 tests/80-chardefs-OK.asn1 diff --git a/ChangeLog b/ChangeLog index 4f4a1535b..afa2f8f0c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,11 +1,13 @@ -0.9.13: 2005-Mar-20 +0.9.13: 2005-Mar-24 * Added extra const qualifiers into the support code. * More RFC variations supported in crfc2asn1.pl. * Refined string values compatibility. (Test cases 77, 78). * Support for ContainedSubtype constraints. (Test case 16). * Parsing support for CONSTRAINED BY. (Test case 79). + * Support for CharsDefn (Quadruple and Tuple, most used in + ASN1-CHARACTER-MODULE) (Test case 80). 0.9.12: 2005-Mar-10 diff --git a/libasn1fix/asn1fix_crange.c b/libasn1fix/asn1fix_crange.c index 1e6a0d080..23110a234 100644 --- a/libasn1fix/asn1fix_crange.c +++ b/libasn1fix/asn1fix_crange.c @@ -321,6 +321,11 @@ static int _range_fill(asn1p_value_t *val, const asn1cnst_range_t *minmax, asn1c edge->type = ARE_VALUE; edge->value = (val->type==ATV_TRUE); return 0; + case ATV_TUPLE: + case ATV_QUADRUPLE: + edge->type = ARE_VALUE; + edge->value = val->value.v_integer; + return 0; case ATV_STRING: if(type != ACT_CT_FROM) return 0; diff --git a/libasn1parser/asn1p_constr.h b/libasn1parser/asn1p_constr.h index 324697ef4..8dd547b85 100644 --- a/libasn1parser/asn1p_constr.h +++ b/libasn1parser/asn1p_constr.h @@ -35,6 +35,7 @@ typedef struct asn1p_constraint_s { ACT_CA_UNI, /* UNION (|) */ ACT_CA_INT, /* INTERSECTION (^) */ ACT_CA_EXC, /* EXCEPT */ + ACT_CA_AEX, /* ALL EXCEPT */ } type; enum asn1p_constr_pres_e { diff --git a/libasn1parser/asn1p_value.c b/libasn1parser/asn1p_value.c index f6c8c4911..1aacaf11f 100644 --- a/libasn1parser/asn1p_value.c +++ b/libasn1parser/asn1p_value.c @@ -123,6 +123,8 @@ asn1p_value_clone(asn1p_value_t *v) { case ATV_MAX: case ATV_FALSE: case ATV_TRUE: + case ATV_TUPLE: + case ATV_QUADRUPLE: clone = asn1p_value_fromint(v->value.v_integer); if(clone) clone->type = v->type; return clone; @@ -174,6 +176,8 @@ asn1p_value_free(asn1p_value_t *v) { case ATV_MAX: case ATV_FALSE: case ATV_TRUE: + case ATV_TUPLE: + case ATV_QUADRUPLE: /* No freeing necessary */ break; case ATV_STRING: diff --git a/libasn1parser/asn1p_value.h b/libasn1parser/asn1p_value.h index fa622d7fb..a0103413f 100644 --- a/libasn1parser/asn1p_value.h +++ b/libasn1parser/asn1p_value.h @@ -20,7 +20,9 @@ typedef struct asn1p_value_s { ATV_MIN, ATV_TRUE, ATV_FALSE, - ATV_STRING, + ATV_TUPLE, /* { 1, 15 } */ + ATV_QUADRUPLE, /* { 0, 14, 0, 255 } */ + ATV_STRING, /* "abcdef" */ ATV_UNPARSED, ATV_BITVECTOR, ATV_REFERENCED, /* Reference to a value defined elsewhere */ diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index 04e713f56..353c4fa44 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -204,11 +204,11 @@ typedef union { -#define YYFINAL 423 +#define YYFINAL 437 #define YYFLAG -32768 #define YYNTBASE 116 -#define YYTRANSLATE(x) ((unsigned)(x) <= 354 ? yytranslate[x] : 219) +#define YYTRANSLATE(x) ((unsigned)(x) <= 354 ? yytranslate[x] : 220) static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -265,133 +265,136 @@ static const short yyprhs[] = { 0, 327, 334, 341, 343, 348, 353, 355, 359, 361, 365, 369, 373, 375, 379, 381, 385, 387, 389, 391, 393, 398, 402, 403, 407, 409, 411, 413, 415, 417, 419, - 421, 423, 425, 429, 431, 434, 436, 438, 440, 442, - 445, 448, 450, 452, 455, 458, 460, 462, 464, 466, - 468, 471, 473, 476, 478, 480, 482, 484, 486, 488, - 490, 492, 494, 496, 498, 500, 502, 504, 506, 508, - 510, 512, 514, 515, 517, 519, 524, 528, 533, 535, - 539, 545, 547, 551, 555, 559, 564, 568, 570, 572, - 576, 580, 584, 588, 590, 592, 593, 599, 601, 604, - 607, 611, 613, 615, 617, 619, 621, 623, 625, 627, - 633, 635, 639, 641, 645, 646, 648, 650, 652, 654, - 656, 658, 662, 667, 669, 673, 676, 680, 682, 686, - 687, 689, 691, 694, 697, 701, 703, 707, 709, 714, - 719, 721, 723, 725, 727, 728, 730, 733, 738, 739, - 741, 743, 745, 746, 748, 750, 752, 754, 756, 757, - 759 + 421, 423, 425, 429, 431, 437, 447, 449, 452, 454, + 456, 458, 460, 463, 466, 468, 470, 473, 476, 478, + 480, 482, 484, 486, 489, 491, 494, 496, 498, 500, + 502, 504, 506, 508, 510, 512, 514, 516, 518, 520, + 522, 524, 526, 528, 530, 532, 533, 535, 537, 542, + 546, 551, 553, 557, 563, 565, 569, 573, 577, 581, + 586, 590, 592, 594, 598, 602, 606, 610, 612, 614, + 615, 621, 623, 626, 629, 633, 635, 637, 639, 641, + 643, 645, 647, 649, 655, 657, 661, 663, 667, 668, + 670, 672, 674, 676, 678, 680, 684, 689, 691, 695, + 698, 702, 704, 708, 709, 711, 713, 716, 719, 723, + 725, 729, 731, 736, 741, 743, 745, 747, 749, 750, + 752, 755, 760, 761, 763, 765, 767, 768, 770, 772, + 774, 776, 778, 779, 781 }; static const short yyrhs[] = { 117, - 0, 118, 0, 117, 118, 0, 215, 119, 34, 123, + 0, 118, 0, 117, 118, 0, 216, 119, 34, 123, 3, 21, 126, 39, 0, 0, 120, 0, 103, 121, 104, 0, 103, 104, 0, 122, 0, 121, 122, 0, - 218, 0, 218, 105, 9, 106, 0, 9, 0, 0, + 219, 0, 219, 105, 9, 106, 0, 9, 0, 0, 124, 0, 125, 0, 124, 125, 0, 41, 84, 0, 52, 84, 0, 20, 84, 0, 43, 53, 0, 12, 57, 0, 0, 127, 0, 128, 0, 127, 128, 0, 130, 0, 135, 0, 143, 0, 170, 0, 138, 0, - 0, 38, 12, 129, 0, 178, 0, 54, 131, 107, + 0, 38, 12, 129, 0, 179, 0, 54, 131, 107, 0, 54, 46, 0, 132, 0, 131, 132, 0, 133, - 46, 215, 119, 0, 134, 0, 133, 108, 134, 0, - 215, 0, 215, 103, 104, 0, 218, 0, 42, 136, + 46, 216, 119, 0, 134, 0, 133, 108, 134, 0, + 216, 0, 216, 103, 104, 0, 219, 0, 42, 136, 107, 0, 42, 17, 107, 0, 42, 107, 0, 137, - 0, 136, 108, 137, 0, 215, 0, 215, 103, 104, - 0, 218, 0, 215, 139, 3, 103, 140, 104, 0, - 165, 0, 175, 0, 0, 141, 0, 142, 0, 141, - 108, 142, 0, 102, 0, 186, 0, 215, 3, 210, - 87, 0, 215, 3, 163, 0, 215, 3, 153, 0, - 215, 103, 144, 104, 3, 163, 0, 145, 0, 144, - 108, 145, 0, 215, 0, 215, 109, 218, 0, 215, - 109, 215, 0, 175, 109, 218, 0, 147, 0, 146, - 108, 147, 0, 163, 0, 218, 0, 0, 149, 0, - 150, 0, 149, 108, 150, 0, 218, 163, 204, 0, + 0, 136, 108, 137, 0, 216, 0, 216, 103, 104, + 0, 219, 0, 216, 139, 3, 103, 140, 104, 0, + 165, 0, 176, 0, 0, 141, 0, 142, 0, 141, + 108, 142, 0, 102, 0, 187, 0, 216, 3, 211, + 87, 0, 216, 3, 163, 0, 216, 3, 153, 0, + 216, 103, 144, 104, 3, 163, 0, 145, 0, 144, + 108, 145, 0, 216, 0, 216, 109, 219, 0, 216, + 109, 216, 0, 176, 109, 219, 0, 147, 0, 146, + 108, 147, 0, 163, 0, 219, 0, 0, 149, 0, + 150, 0, 149, 108, 150, 0, 219, 163, 205, 0, 30, 68, 163, 0, 162, 0, 152, 0, 151, 108, - 152, 0, 218, 163, 0, 162, 0, 28, 103, 155, + 152, 0, 219, 163, 0, 162, 0, 28, 103, 155, 104, 157, 0, 0, 88, 0, 156, 0, 155, 108, - 156, 0, 168, 204, 0, 168, 163, 154, 204, 0, - 168, 168, 154, 204, 0, 0, 158, 0, 0, 95, + 156, 0, 168, 205, 0, 168, 163, 154, 205, 0, + 168, 168, 154, 205, 0, 0, 158, 0, 0, 95, 82, 103, 159, 160, 104, 0, 161, 0, 160, 161, 0, 4, 0, 168, 0, 102, 0, 102, 110, 173, - 0, 102, 110, 209, 0, 210, 164, 182, 0, 177, + 0, 102, 110, 210, 0, 211, 164, 183, 0, 178, 0, 27, 103, 151, 104, 0, 78, 103, 148, 104, - 0, 79, 103, 148, 104, 0, 78, 182, 68, 217, - 210, 164, 0, 79, 182, 68, 217, 210, 164, 0, - 18, 0, 18, 35, 25, 218, 0, 215, 103, 146, + 0, 79, 103, 148, 104, 0, 78, 183, 68, 218, + 211, 164, 0, 79, 183, 68, 218, 211, 164, 0, + 18, 0, 18, 35, 25, 219, 0, 216, 103, 146, 104, 0, 165, 0, 56, 68, 165, 0, 11, 0, - 11, 111, 215, 0, 216, 111, 215, 0, 11, 111, - 218, 0, 216, 0, 216, 111, 166, 0, 167, 0, + 11, 111, 216, 0, 217, 111, 216, 0, 11, 111, + 219, 0, 217, 0, 217, 111, 166, 0, 167, 0, 166, 111, 167, 0, 169, 0, 169, 0, 13, 0, - 14, 0, 218, 139, 3, 171, 0, 218, 109, 171, - 0, 0, 103, 172, 174, 0, 63, 0, 45, 0, - 86, 0, 5, 0, 7, 0, 6, 0, 209, 0, - 173, 0, 218, 0, 215, 111, 218, 0, 4, 0, - 174, 4, 0, 24, 0, 63, 0, 76, 0, 176, - 0, 67, 81, 0, 65, 51, 0, 77, 0, 44, - 0, 36, 71, 0, 26, 81, 0, 91, 0, 47, - 0, 178, 0, 58, 0, 40, 0, 22, 81, 0, - 175, 0, 176, 206, 0, 23, 0, 48, 0, 49, - 0, 50, 0, 59, 0, 64, 0, 74, 0, 83, - 0, 85, 0, 90, 0, 92, 0, 93, 0, 94, - 0, 66, 0, 99, 0, 100, 0, 97, 0, 98, - 0, 96, 0, 0, 183, 0, 184, 0, 80, 105, - 185, 106, 0, 105, 185, 106, 0, 184, 105, 185, - 106, 0, 186, 0, 186, 108, 102, 0, 186, 108, - 102, 108, 186, 0, 187, 0, 186, 179, 187, 0, - 186, 180, 187, 0, 187, 181, 187, 0, 190, 105, - 185, 106, 0, 105, 185, 106, 0, 191, 0, 192, - 0, 191, 189, 191, 0, 61, 189, 191, 0, 191, - 189, 60, 0, 61, 189, 60, 0, 198, 0, 193, - 0, 0, 31, 25, 103, 188, 174, 0, 101, 0, - 101, 112, 0, 112, 101, 0, 112, 101, 112, 0, - 80, 0, 46, 0, 45, 0, 86, 0, 209, 0, - 6, 0, 218, 0, 215, 0, 95, 30, 103, 194, - 104, 0, 195, 0, 194, 108, 195, 0, 102, 0, - 218, 182, 196, 0, 0, 197, 0, 73, 0, 15, - 0, 69, 0, 199, 0, 200, 0, 103, 215, 104, - 0, 199, 103, 201, 104, 0, 202, 0, 201, 108, - 202, 0, 113, 203, 0, 113, 111, 203, 0, 218, - 0, 203, 111, 218, 0, 0, 205, 0, 69, 0, - 33, 171, 0, 103, 104, 0, 103, 207, 104, 0, - 208, 0, 207, 108, 208, 0, 218, 0, 218, 105, - 209, 106, 0, 218, 105, 173, 106, 0, 209, 0, - 102, 0, 9, 0, 10, 0, 0, 211, 0, 212, - 214, 0, 114, 213, 9, 115, 0, 0, 89, 0, - 19, 0, 75, 0, 0, 52, 0, 41, 0, 11, - 0, 12, 0, 12, 0, 0, 218, 0, 8, 0 + 14, 0, 219, 139, 3, 171, 0, 219, 109, 171, + 0, 0, 103, 172, 175, 0, 63, 0, 45, 0, + 86, 0, 5, 0, 7, 0, 174, 0, 210, 0, + 173, 0, 219, 0, 216, 111, 219, 0, 6, 0, + 103, 9, 108, 9, 104, 0, 103, 9, 108, 9, + 108, 9, 108, 9, 104, 0, 4, 0, 175, 4, + 0, 24, 0, 63, 0, 76, 0, 177, 0, 67, + 81, 0, 65, 51, 0, 77, 0, 44, 0, 36, + 71, 0, 26, 81, 0, 91, 0, 47, 0, 179, + 0, 58, 0, 40, 0, 22, 81, 0, 176, 0, + 177, 207, 0, 23, 0, 48, 0, 49, 0, 50, + 0, 59, 0, 64, 0, 74, 0, 83, 0, 85, + 0, 90, 0, 92, 0, 93, 0, 94, 0, 66, + 0, 99, 0, 100, 0, 97, 0, 98, 0, 96, + 0, 0, 184, 0, 185, 0, 80, 105, 186, 106, + 0, 105, 186, 106, 0, 185, 105, 186, 106, 0, + 187, 0, 187, 108, 102, 0, 187, 108, 102, 108, + 187, 0, 188, 0, 17, 96, 188, 0, 187, 180, + 188, 0, 187, 181, 188, 0, 188, 182, 188, 0, + 191, 105, 186, 106, 0, 105, 186, 106, 0, 192, + 0, 193, 0, 192, 190, 192, 0, 61, 190, 192, + 0, 192, 190, 60, 0, 61, 190, 60, 0, 199, + 0, 194, 0, 0, 31, 25, 103, 189, 175, 0, + 101, 0, 101, 112, 0, 112, 101, 0, 112, 101, + 112, 0, 80, 0, 46, 0, 45, 0, 86, 0, + 210, 0, 174, 0, 219, 0, 216, 0, 95, 30, + 103, 195, 104, 0, 196, 0, 195, 108, 196, 0, + 102, 0, 219, 183, 197, 0, 0, 198, 0, 73, + 0, 15, 0, 69, 0, 200, 0, 201, 0, 103, + 216, 104, 0, 200, 103, 202, 104, 0, 203, 0, + 202, 108, 203, 0, 113, 204, 0, 113, 111, 204, + 0, 219, 0, 204, 111, 219, 0, 0, 206, 0, + 69, 0, 33, 171, 0, 103, 104, 0, 103, 208, + 104, 0, 209, 0, 208, 108, 209, 0, 219, 0, + 219, 105, 210, 106, 0, 219, 105, 173, 106, 0, + 210, 0, 102, 0, 9, 0, 10, 0, 0, 212, + 0, 213, 215, 0, 114, 214, 9, 115, 0, 0, + 89, 0, 19, 0, 75, 0, 0, 52, 0, 41, + 0, 11, 0, 12, 0, 12, 0, 0, 219, 0, + 8, 0 }; #endif #if YYDEBUG != 0 static const short yyrline[] = { 0, - 302, 308, 314, 330, 355, 357, 360, 364, 369, 376, - 384, 389, 393, 402, 404, 412, 416, 424, 428, 431, - 434, 438, 458, 460, 468, 472, 504, 508, 517, 524, - 537, 544, 546, 558, 571, 578, 583, 589, 595, 604, - 610, 616, 623, 629, 637, 641, 644, 651, 657, 663, - 670, 676, 685, 695, 703, 711, 713, 723, 726, 730, - 733, 745, 757, 763, 779, 788, 798, 808, 813, 820, - 827, 837, 843, 849, 853, 876, 878, 880, 886, 892, - 899, 906, 911, 917, 923, 929, 934, 944, 946, 949, - 957, 963, 972, 978, 995, 997, 1002, 1006, 1011, 1016, - 1022, 1026, 1037, 1046, 1055, 1066, 1088, 1092, 1098, 1104, - 1110, 1120, 1130, 1136, 1150, 1174, 1181, 1195, 1204, 1214, - 1224, 1234, 1242, 1263, 1272, 1281, 1282, 1284, 1291, 1303, - 1313, 1321, 1321, 1326, 1331, 1336, 1341, 1345, 1349, 1353, - 1356, 1361, 1373, 1389, 1399, 1413, 1415, 1416, 1417, 1418, - 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1432, 1434, - 1435, 1438, 1445, 1457, 1459, 1463, 1467, 1468, 1469, 1470, - 1471, 1475, 1476, 1477, 1478, 1482, 1483, 1490, 1490, 1491, - 1491, 1492, 1494, 1496, 1501, 1505, 1514, 1518, 1523, 1527, - 1533, 1543, 1547, 1550, 1553, 1558, 1567, 1575, 1581, 1587, - 1594, 1602, 1610, 1619, 1622, 1625, 1626, 1636, 1638, 1639, - 1640, 1643, 1647, 1652, 1658, 1663, 1666, 1670, 1683, 1697, - 1703, 1707, 1712, 1718, 1730, 1732, 1735, 1739, 1742, 1747, - 1751, 1759, 1774, 1780, 1787, 1800, 1812, 1827, 1831, 1848, - 1853, 1856, 1861, 1883, 1888, 1893, 1899, 1905, 1913, 1921, - 1929, 1936, 1946, 1951, 1981, 1983, 1986, 1993, 1999, 2001, - 2002, 2003, 2006, 2008, 2009, 2012, 2017, 2024, 2031, 2033, - 2037 + 303, 309, 315, 331, 356, 358, 361, 365, 370, 377, + 385, 390, 394, 403, 405, 413, 417, 425, 429, 432, + 435, 439, 459, 461, 469, 473, 505, 509, 518, 525, + 538, 545, 547, 559, 572, 579, 584, 590, 596, 605, + 611, 617, 624, 630, 638, 642, 645, 652, 658, 664, + 671, 677, 686, 696, 704, 712, 714, 724, 727, 731, + 734, 746, 758, 764, 780, 789, 799, 809, 814, 821, + 828, 838, 844, 850, 854, 877, 879, 881, 887, 893, + 900, 907, 912, 918, 924, 930, 935, 945, 947, 950, + 958, 964, 973, 979, 996, 998, 1003, 1007, 1012, 1017, + 1023, 1027, 1038, 1047, 1056, 1067, 1089, 1093, 1099, 1105, + 1111, 1121, 1131, 1137, 1151, 1175, 1182, 1196, 1205, 1215, + 1225, 1235, 1243, 1264, 1273, 1282, 1283, 1285, 1292, 1304, + 1314, 1322, 1322, 1327, 1332, 1337, 1342, 1346, 1350, 1353, + 1356, 1361, 1373, 1390, 1395, 1405, 1421, 1431, 1445, 1447, + 1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455, 1456, 1457, + 1458, 1464, 1466, 1467, 1470, 1477, 1489, 1491, 1495, 1499, + 1500, 1501, 1502, 1503, 1507, 1508, 1509, 1510, 1514, 1515, + 1522, 1522, 1523, 1523, 1524, 1526, 1528, 1533, 1537, 1546, + 1550, 1555, 1559, 1565, 1575, 1579, 1582, 1585, 1588, 1593, + 1602, 1610, 1616, 1622, 1629, 1637, 1645, 1654, 1657, 1660, + 1661, 1671, 1673, 1674, 1675, 1678, 1682, 1687, 1693, 1698, + 1701, 1704, 1717, 1731, 1737, 1741, 1746, 1752, 1764, 1766, + 1769, 1773, 1776, 1781, 1785, 1793, 1808, 1814, 1821, 1834, + 1846, 1861, 1865, 1882, 1887, 1890, 1895, 1917, 1922, 1927, + 1933, 1939, 1947, 1955, 1963, 1970, 1980, 1985, 2015, 2017, + 2020, 2027, 2033, 2035, 2036, 2037, 2040, 2042, 2043, 2046, + 2051, 2058, 2065, 2067, 2071 }; #endif @@ -431,16 +434,16 @@ static const char * const yytname[] = { "$","error","$undefined.","TOK_PPEQ", "WithSyntax","@2","WithSyntaxFormat","WithSyntaxFormatToken","ExtensionAndException", "Type","TypeDeclaration","ComplexTypeReference","ComplexTypeReferenceAmpList", "ComplexTypeReferenceElement","ClassFieldIdentifier","ClassFieldName","ValueDefinition", -"Value","@3","DefinedValue","Opaque","BasicTypeId","BasicTypeId_UniverationCompatible", -"BasicType","BasicString","Union","Intersection","Except","optConstraints","Constraints", -"SetOfConstraints","ElementSetSpecs","ElementSetSpec","ConstraintSubtypeElement", -"@4","ConstraintRangeSpec","ConstraintSpec","SingleValue","ContainedSubtype", -"WithComponents","WithComponentsList","WithComponentsElement","optPresenceConstraint", -"PresenceConstraint","TableConstraint","SimpleTableConstraint","ComponentRelationConstraint", -"AtNotationList","AtNotationElement","ComponentIdList","optMarker","Marker", -"UniverationDefinition","UniverationList","UniverationElement","SignedNumber", -"optTag","Tag","TagTypeValue","TagClass","TagPlicit","TypeRefName","ObjectClassReference", -"optIdentifier","Identifier", NULL +"Value","@3","DefinedValue","RestrictedCharacterStringValue","Opaque","BasicTypeId", +"BasicTypeId_UniverationCompatible","BasicType","BasicString","Union","Intersection", +"Except","optConstraints","Constraints","SetOfConstraints","ElementSetSpecs", +"ElementSetSpec","ConstraintSubtypeElement","@4","ConstraintRangeSpec","ConstraintSpec", +"SingleValue","ContainedSubtype","WithComponents","WithComponentsList","WithComponentsElement", +"optPresenceConstraint","PresenceConstraint","TableConstraint","SimpleTableConstraint", +"ComponentRelationConstraint","AtNotationList","AtNotationElement","ComponentIdList", +"optMarker","Marker","UniverationDefinition","UniverationList","UniverationElement", +"SignedNumber","optTag","Tag","TagTypeValue","TagClass","TagPlicit","TypeRefName", +"ObjectClassReference","optIdentifier","Identifier", NULL }; #endif @@ -459,20 +462,20 @@ static const short yyr1[] = { 0, 164, 164, 164, 164, 164, 164, 164, 165, 165, 165, 165, 165, 165, 166, 166, 167, 168, 169, 169, 170, 171, 172, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 173, 173, 174, 174, 175, 175, 175, 175, 175, - 175, 175, 175, 175, 175, 175, 175, 175, 176, 176, - 176, 177, 177, 178, 178, 178, 178, 178, 178, 178, - 178, 178, 178, 178, 178, 178, 178, 179, 179, 180, - 180, 181, 182, 182, 183, 183, 184, 184, 185, 185, - 185, 186, 186, 186, 186, 187, 187, 187, 187, 187, - 187, 187, 187, 187, 187, 188, 187, 189, 189, 189, - 189, 190, 190, 191, 191, 191, 191, 191, 192, 193, - 194, 194, 195, 195, 196, 196, 197, 197, 197, 198, - 198, 199, 200, 201, 201, 202, 202, 203, 203, 204, - 204, 205, 205, 206, 206, 207, 207, 208, 208, 208, - 208, 208, 209, 209, 210, 210, 211, 212, 213, 213, - 213, 213, 214, 214, 214, 215, 215, 216, 217, 217, - 218 + 171, 173, 173, 174, 174, 174, 175, 175, 176, 176, + 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, + 176, 177, 177, 177, 178, 178, 179, 179, 179, 179, + 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + 180, 180, 181, 181, 182, 183, 183, 184, 184, 185, + 185, 186, 186, 186, 187, 187, 187, 187, 187, 188, + 188, 188, 188, 188, 188, 188, 188, 188, 188, 189, + 188, 190, 190, 190, 190, 191, 191, 192, 192, 192, + 192, 192, 193, 194, 195, 195, 196, 196, 197, 197, + 198, 198, 198, 199, 199, 200, 201, 202, 202, 203, + 203, 204, 204, 205, 205, 206, 206, 207, 207, 208, + 208, 209, 209, 209, 209, 209, 210, 210, 211, 211, + 212, 213, 214, 214, 214, 214, 215, 215, 215, 216, + 216, 217, 218, 218, 219 }; static const short yyr2[] = { 0, @@ -490,316 +493,330 @@ static const short yyr2[] = { 0, 6, 6, 1, 4, 4, 1, 3, 1, 3, 3, 3, 1, 3, 1, 3, 1, 1, 1, 1, 4, 3, 0, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 3, 1, 2, 1, 1, 1, 1, 2, - 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, - 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 1, 5, 9, 1, 2, 1, 1, + 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, + 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 1, 1, 4, 3, 4, 1, 3, - 5, 1, 3, 3, 3, 4, 3, 1, 1, 3, - 3, 3, 3, 1, 1, 0, 5, 1, 2, 2, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 5, - 1, 3, 1, 3, 0, 1, 1, 1, 1, 1, - 1, 3, 4, 1, 3, 2, 3, 1, 3, 0, - 1, 1, 2, 2, 3, 1, 3, 1, 4, 4, - 1, 1, 1, 1, 0, 1, 2, 4, 0, 1, - 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, - 1 + 1, 1, 1, 1, 1, 0, 1, 1, 4, 3, + 4, 1, 3, 5, 1, 3, 3, 3, 3, 4, + 3, 1, 1, 3, 3, 3, 3, 1, 1, 0, + 5, 1, 2, 2, 3, 1, 1, 1, 1, 1, + 1, 1, 1, 5, 1, 3, 1, 3, 0, 1, + 1, 1, 1, 1, 1, 3, 4, 1, 3, 2, + 3, 1, 3, 0, 1, 1, 2, 2, 3, 1, + 3, 1, 4, 4, 1, 1, 1, 1, 0, 1, + 2, 4, 0, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 0, 1, 1 }; static const short yydefact[] = { 0, - 266, 267, 1, 2, 5, 3, 0, 0, 6, 271, + 270, 271, 1, 2, 5, 3, 0, 0, 6, 275, 13, 8, 0, 9, 11, 14, 7, 10, 0, 0, 0, 0, 0, 0, 0, 15, 16, 0, 22, 20, - 18, 21, 19, 0, 17, 12, 23, 164, 0, 0, - 165, 166, 167, 0, 168, 169, 177, 170, 171, 172, - 173, 174, 175, 176, 0, 24, 25, 27, 28, 31, + 18, 21, 19, 0, 17, 12, 23, 167, 0, 0, + 168, 169, 170, 0, 171, 172, 180, 173, 174, 175, + 176, 177, 178, 179, 0, 24, 25, 27, 28, 31, 29, 30, 34, 0, 0, 32, 0, 47, 0, 48, 50, 52, 36, 0, 37, 0, 40, 42, 44, 4, - 26, 255, 118, 268, 0, 146, 0, 0, 160, 153, - 157, 159, 147, 0, 0, 148, 152, 156, 0, 0, - 54, 55, 149, 158, 122, 0, 33, 46, 45, 0, - 0, 35, 38, 0, 0, 0, 0, 259, 64, 63, - 0, 256, 263, 0, 161, 155, 154, 151, 150, 0, + 26, 259, 118, 272, 0, 149, 0, 0, 163, 156, + 160, 162, 150, 0, 0, 151, 155, 159, 0, 0, + 54, 55, 152, 161, 122, 0, 33, 46, 45, 0, + 0, 35, 38, 0, 0, 0, 0, 263, 64, 63, + 0, 260, 267, 0, 164, 158, 157, 154, 153, 0, 66, 0, 68, 0, 0, 0, 49, 51, 5, 41, - 43, 0, 261, 262, 260, 0, 118, 268, 113, 0, - 0, 183, 183, 62, 183, 116, 162, 149, 107, 0, - 265, 264, 257, 119, 121, 0, 0, 0, 0, 56, - 128, 129, 123, 124, 126, 120, 137, 139, 138, 253, - 254, 135, 134, 136, 132, 130, 141, 140, 0, 142, - 39, 0, 90, 255, 127, 0, 0, 0, 0, 0, - 76, 0, 0, 184, 185, 76, 0, 106, 0, 163, - 255, 255, 67, 71, 70, 69, 217, 0, 214, 213, - 0, 212, 215, 0, 60, 0, 0, 0, 57, 58, - 61, 192, 0, 198, 199, 205, 204, 230, 231, 216, - 219, 218, 0, 0, 0, 0, 95, 0, 0, 242, - 88, 88, 92, 241, 0, 258, 0, 103, 0, 83, - 86, 255, 117, 0, 0, 0, 77, 78, 82, 255, - 0, 189, 269, 0, 0, 269, 252, 244, 0, 246, - 251, 248, 0, 72, 74, 75, 65, 0, 208, 0, - 0, 0, 0, 0, 53, 0, 180, 181, 178, 179, - 0, 0, 182, 0, 0, 0, 0, 125, 144, 133, - 143, 131, 0, 87, 96, 91, 243, 89, 240, 240, - 114, 0, 108, 0, 85, 0, 255, 109, 0, 240, - 187, 0, 255, 270, 0, 110, 255, 245, 0, 0, - 115, 255, 206, 209, 210, 203, 201, 0, 232, 197, - 59, 193, 194, 195, 0, 202, 200, 0, 0, 234, - 145, 0, 93, 94, 104, 105, 142, 84, 186, 81, - 79, 80, 190, 0, 188, 0, 247, 0, 0, 73, - 0, 211, 223, 0, 221, 183, 196, 0, 236, 238, - 233, 0, 97, 0, 111, 112, 250, 249, 207, 220, - 0, 225, 237, 0, 235, 0, 191, 222, 228, 229, - 227, 224, 226, 239, 101, 0, 99, 102, 98, 100, - 0, 0, 0 + 43, 0, 265, 266, 264, 0, 118, 272, 113, 0, + 0, 186, 186, 62, 186, 116, 165, 152, 107, 0, + 269, 268, 261, 119, 121, 0, 0, 0, 0, 56, + 128, 129, 123, 124, 126, 120, 137, 144, 138, 257, + 258, 135, 134, 136, 132, 130, 141, 139, 140, 0, + 142, 39, 0, 90, 259, 127, 0, 0, 0, 0, + 0, 76, 0, 0, 187, 188, 76, 0, 106, 0, + 166, 259, 259, 67, 71, 70, 69, 0, 0, 218, + 217, 0, 216, 219, 0, 60, 0, 0, 0, 57, + 58, 221, 61, 195, 0, 202, 203, 209, 208, 234, + 235, 220, 223, 222, 0, 0, 0, 0, 0, 95, + 0, 0, 246, 88, 88, 92, 245, 0, 262, 0, + 103, 0, 83, 86, 259, 117, 0, 0, 0, 77, + 78, 82, 259, 0, 192, 273, 0, 0, 273, 256, + 248, 0, 250, 255, 252, 0, 72, 74, 75, 65, + 0, 0, 212, 0, 0, 0, 0, 0, 53, 0, + 183, 184, 181, 182, 0, 0, 185, 0, 0, 0, + 0, 125, 0, 147, 133, 143, 131, 0, 87, 96, + 91, 247, 89, 244, 244, 114, 0, 108, 0, 85, + 0, 259, 109, 0, 244, 190, 0, 259, 274, 0, + 110, 259, 249, 0, 0, 115, 259, 196, 210, 213, + 214, 207, 0, 205, 0, 236, 201, 59, 197, 198, + 199, 0, 206, 204, 0, 0, 238, 0, 148, 0, + 93, 94, 104, 105, 142, 84, 189, 81, 79, 80, + 193, 0, 191, 0, 251, 0, 0, 73, 0, 215, + 227, 0, 225, 186, 200, 0, 240, 242, 237, 0, + 145, 0, 97, 0, 111, 112, 254, 253, 211, 224, + 0, 229, 241, 0, 239, 0, 0, 194, 226, 232, + 233, 231, 228, 230, 243, 0, 101, 0, 99, 102, + 0, 98, 100, 146, 0, 0, 0 }; -static const short yydefgoto[] = { 421, +static const short yydefgoto[] = { 435, 3, 4, 8, 9, 13, 14, 25, 26, 27, 55, 56, 57, 107, 58, 74, 75, 76, 77, 59, 69, - 70, 60, 100, 228, 229, 230, 61, 130, 131, 283, - 284, 266, 267, 268, 259, 260, 119, 319, 192, 193, - 314, 315, 406, 416, 417, 269, 285, 155, 156, 173, - 174, 194, 195, 62, 186, 244, 187, 310, 157, 103, - 159, 104, 301, 302, 304, 203, 204, 205, 271, 272, - 232, 381, 291, 233, 234, 235, 236, 384, 385, 412, - 413, 237, 238, 239, 359, 360, 389, 253, 254, 210, - 279, 280, 240, 255, 122, 123, 146, 163, 241, 105, - 333, 242 + 70, 60, 100, 229, 230, 231, 61, 130, 131, 286, + 287, 269, 270, 271, 262, 263, 119, 324, 193, 194, + 319, 320, 417, 428, 429, 272, 288, 155, 156, 173, + 174, 195, 196, 62, 186, 247, 187, 232, 315, 157, + 103, 159, 104, 305, 306, 308, 204, 205, 206, 274, + 275, 234, 389, 295, 235, 236, 237, 238, 392, 393, + 423, 424, 239, 240, 241, 366, 367, 397, 256, 257, + 211, 282, 283, 242, 258, 122, 123, 146, 163, 243, + 105, 338, 244 }; -static const short yypact[] = { 247, --32768,-32768, 247,-32768, -74,-32768, 46, 59,-32768,-32768, --32768,-32768, 49,-32768, -66, 221,-32768,-32768, 57, 55, - 75, 83, 119, 104, 195, 221,-32768, 116,-32768,-32768, --32768,-32768,-32768, 208,-32768,-32768, 427,-32768, 222, 24, --32768,-32768,-32768, 86,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 209, 427,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 351, 656,-32768, 146,-32768, 189,-32768, - 162,-32768,-32768, 32,-32768, -1,-32768, 167,-32768,-32768, --32768, -8, 171,-32768, 194,-32768, 203, 223,-32768,-32768, --32768,-32768,-32768, 249, 225,-32768,-32768,-32768, 731, 299, --32768,-32768,-32768,-32768, 196, 305,-32768,-32768,-32768, 232, - 205,-32768,-32768, 247, 232, 210, 213, 6,-32768,-32768, - 504,-32768, 18, 232,-32768,-32768,-32768,-32768,-32768, -3, --32768, 202, 204, 216, 267, 200,-32768,-32768, -74,-32768, --32768, 285,-32768,-32768,-32768, 303, -42, 218, 288, 224, - 257, -18, 68,-32768, 71,-32768,-32768, 226,-32768, 227, --32768,-32768,-32768,-32768,-32768, 323, 731, 320, 232, 80, --32768,-32768, 220,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 229, 228, --32768, 61,-32768, 5,-32768, 219, 311, 26, 293, 233, - 52, 215, 274,-32768, 238, 52, 276,-32768, 43,-32768, - 8, 231,-32768,-32768,-32768,-32768,-32768, 321,-32768,-32768, - -2,-32768,-32768, 317,-32768, 247, 215, 244, 241,-32768, - 193, 256, 248, -2,-32768,-32768,-32768, 252,-32768,-32768, --32768,-32768, 285, 352, 320, 200, 262, 285, 200,-32768, - 270, 270,-32768,-32768, 581,-32768, 320, 250, 66,-32768, --32768, 231,-32768, 215, 291, 260, 253,-32768,-32768, 231, - 261, 81, 320, 215, 265, 320,-32768,-32768, 124,-32768, --32768, 266, 143,-32768,-32768,-32768,-32768, 263, 258, 271, - 70, 273, 275, 272,-32768, 80,-32768,-32768,-32768,-32768, - 215, 215,-32768, 215, 215, 279, 269,-32768,-32768, 376, --32768,-32768, 301,-32768,-32768,-32768,-32768,-32768, 31, 31, --32768, 207,-32768, 26,-32768, 278, 231,-32768, 52, 31, --32768, 283, 231,-32768, 280,-32768, 231,-32768, 38, 207, --32768, 8,-32768,-32768, 277,-32768,-32768, 42,-32768,-32768, --32768,-32768,-32768,-32768, 282,-32768,-32768, 7, 163,-32768, --32768, 287,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768, 284, 581,-32768, 581,-32768, 290, 297,-32768, - 352,-32768,-32768, 164,-32768, 71,-32768, 320, 294,-32768, --32768, 269,-32768, 215,-32768,-32768,-32768,-32768, 376,-32768, - 42, 2, 294, 320,-32768, 173, 193,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768, 10,-32768,-32768,-32768,-32768, - 393, 406,-32768 +static const short yypact[] = { 203, +-32768,-32768, 203,-32768, -62,-32768, 39, 24,-32768,-32768, +-32768,-32768, 43,-32768, -31, 138,-32768,-32768, 75, 50, + 30, 38, 112, 87, 170, 138,-32768, 76,-32768,-32768, +-32768,-32768,-32768, 187,-32768,-32768, 490,-32768, 213, 9, +-32768,-32768,-32768, 155,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 172, 490,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 361, 719,-32768, 121,-32768, 149,-32768, + 143,-32768,-32768, 27,-32768, -22,-32768, 148,-32768,-32768, +-32768, -10, 123,-32768, 173,-32768, 177, 202,-32768,-32768, +-32768,-32768,-32768, 229, 200,-32768,-32768,-32768, 794, 284, +-32768,-32768,-32768,-32768, 179, 285,-32768,-32768,-32768, 186, + 198,-32768,-32768, 203, 186, 201, 205, 10,-32768,-32768, + 567,-32768, 54, 186,-32768,-32768,-32768,-32768,-32768, -21, +-32768, 194, 195, 206, 272, 460,-32768,-32768, -62,-32768, +-32768, 247,-32768,-32768,-32768, 297, 8, 207, 276, 210, + 244, 104, 107,-32768, -40,-32768,-32768, 212,-32768, 214, +-32768,-32768,-32768,-32768,-32768, 315, 794, 311, 186, 221, +-32768,-32768, 219,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 312,-32768,-32768,-32768,-32768, 220, + 216,-32768, -15,-32768, 31,-32768, 217, 308, 7, 259, + 230, 58, 283, 266,-32768, 231, 58, 271,-32768, 53, +-32768, 6, 227,-32768,-32768,-32768,-32768, 246, 320,-32768, +-32768, 68,-32768,-32768, 316,-32768, 238, 283, 243, 241, +-32768,-32768, 199, 254, 248, 68,-32768,-32768,-32768, 249, +-32768,-32768,-32768,-32768, 247, 251, 347, 311, 460, 260, + 247, 460,-32768, 268, 268,-32768,-32768, 644,-32768, 311, + 250, -3,-32768,-32768, 227,-32768, 283, 286, 253, 257, +-32768,-32768, 227, 256, 78, 311, 283, 262, 311,-32768, +-32768, 85,-32768,-32768, 263, 98,-32768,-32768,-32768,-32768, + 450, 264, 258, 270, 67, 273, 275, 269,-32768, 221, +-32768,-32768,-32768,-32768, 450, 450,-32768, 450, 283, 88, + 261,-32768, 368,-32768, 376,-32768,-32768, 299,-32768,-32768, +-32768,-32768,-32768, 1, 1,-32768, 267,-32768, 7,-32768, + 287, 227,-32768, 58, 1,-32768, 280, 227,-32768, 288, +-32768, 227,-32768, 70, 267,-32768, 6,-32768,-32768,-32768, + 278,-32768, 312,-32768, 47,-32768,-32768,-32768,-32768,-32768, +-32768, 289,-32768,-32768, 17, 116,-32768, 131,-32768, 293, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, + 291, 644,-32768, 644,-32768, 296, 300,-32768, 347,-32768, +-32768, 136,-32768, -40,-32768, 311, 281,-32768,-32768, 261, +-32768, 382,-32768, 283,-32768,-32768,-32768,-32768, 376,-32768, + 47, 95, 281, 311,-32768, 295, 209, 199,-32768,-32768, +-32768,-32768,-32768,-32768,-32768, 403,-32768, 55,-32768,-32768, + 309,-32768,-32768,-32768, 414, 415,-32768 }; static const short yypgoto[] = {-32768, --32768, 404, 281,-32768,-32768, 395,-32768,-32768, 385,-32768, --32768, 356,-32768,-32768,-32768, 339,-32768, 304,-32768,-32768, - 312,-32768, 358,-32768,-32768, 125,-32768,-32768, 259,-32768, - 82, 234,-32768, 100,-32768, 106,-32768, 179,-32768, 184, --32768,-32768,-32768,-32768, 17, -189, -78, -139, -53,-32768, - 206, -186, -122,-32768, -56,-32768, -185, 56, -43, -119, --32768, 40,-32768,-32768,-32768, -150,-32768,-32768, -201, -163, - -101,-32768, 212,-32768, -264,-32768,-32768,-32768, 47,-32768, --32768,-32768,-32768,-32768,-32768, 60, 63, -162,-32768,-32768, --32768, 108, -126, -81,-32768,-32768,-32768,-32768, 28,-32768, - 177, -7 +-32768, 413, 279,-32768,-32768, 404,-32768,-32768, 395,-32768, +-32768, 366,-32768,-32768,-32768, 349,-32768, 314,-32768,-32768, + 321,-32768, 365,-32768,-32768, 132,-32768,-32768, 274,-32768, + 86, 232,-32768, 100,-32768, 111,-32768, 181,-32768, 191, +-32768,-32768,-32768,-32768, 15, -187, -77, -228, -54,-32768, + 204, -191, -122,-32768, -206,-32768, -291, -108, 56, -42, + -120,-32768, -6,-32768,-32768,-32768, -146,-32768,-32768, -196, + -168, -87,-32768, 211,-32768, -268,-32768,-32768,-32768, 37, +-32768,-32768,-32768,-32768,-32768,-32768, 57, 77, -233,-32768, +-32768,-32768, 106, -128, -79,-32768,-32768,-32768,-32768, 16, +-32768, 184, -7 }; -#define YYLAST 825 +#define YYLAST 888 static const short yytable[] = { 15, - 121, 158, 207, 120, 208, 15, 231, 252, 261, 188, - 101, 101, 175, 415, 10, 10, 409, 171, 172, 117, - 102, 102, 171, 172, 143, 294, 347, 5, 7, 65, - 5, 10, 72, 10, 1, 2, 79, 249, 19, 10, - 67, 357, 1, 2, 114, 10, 180, 181, 65, 10, - 10, 180, 181, 10, 11, 132, 10, 11, 161, 10, - -266, 200, 326, 249, 64, 28, 79, 71, 124, 162, - 410, 78, 335, 250, 411, 217, 63, 10, 180, 181, - 144, 265, 281, 64, 201, 217, 202, 10, 180, 181, - 1, 2, 16, 10, 145, 63, 1, 2, 289, 250, - 166, 78, 72, 355, 167, 118, 115, 79, -240, 290, - 218, 29, -240, 419, 219, 251, 165, 388, 118, 188, - 175, 118, 188, 132, 219, 220, 133, 258, 190, 346, - 68, 73, 231, 287, 261, 158, 365, 71, 112, 277, - 221, 139, 78, 383, 277, 263, 278, 200, 160, 12, - 200, 164, 17, 258, 378, 223, 363, 364, 30, 222, - 214, 216, 176, 189, 247, 223, 31, 372, 248, 323, - 206, 32, 202, 324, 224, 202, 415, 297, 298, 299, - 300, 225, 226, 325, 227, 171, 172, 33, 332, 312, - 262, 330, 317, 270, 133, 366, 215, 34, 270, 352, - 353, 282, 354, 286, 177, 178, 179, 10, 180, 181, - 1, 2, 281, 379, 10, 180, 181, 1, 2, 418, - 217, 36, 10, 180, 181, 1, 2, 338, 37, 418, - 407, 339, 20, 66, 395, 402, 396, 311, 190, 10, - 21, 190, 1, 2, 182, 218, 341, 80, 370, 321, - 342, 374, 108, 293, 158, 376, 158, 1, 2, 219, - 220, 22, 183, 23, 111, 334, 391, 400, 334, 116, - 392, 401, 24, 189, 125, 221, 189, 1, 2, 171, - 172, 124, 160, 126, 217, 184, 10, 180, 181, 297, - 298, 299, 300, 127, 222, 109, 110, 171, 172, 128, - 223, 134, 185, 83, 84, 129, 135, 136, 138, 224, - 168, 196, 169, 141, 367, 142, 262, 226, 170, 227, - -267, 270, 197, 219, 199, 212, 198, 10, 209, 211, - 243, 282, 367, 256, 286, 257, 246, 264, 356, 245, - 386, 273, 274, 276, 118, 288, 292, 295, 296, 189, - 390, 303, 305, 82, 307, 309, 313, 318, 327, 322, - 329, 83, 84, 328, 223, 343, 331, 189, 336, 344, - 340, 345, 85, 38, 86, 348, 87, 350, 349, 361, - 390, 358, 362, 369, 373, 375, 88, 387, 382, 393, - 89, 394, 422, 386, 90, 397, 414, 91, 41, 42, - 43, 160, 398, 160, 404, 423, 6, 18, 92, 45, - 35, 81, 113, 93, 46, 94, 47, 95, 140, 191, - 351, 137, 106, 380, 48, 213, 96, 97, 371, 368, - 320, 316, 420, 49, 10, 50, 399, 1, 2, 275, - 51, 98, 52, 53, 54, 306, 377, 408, 308, 38, - 403, 405, 337, 99, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 39, 0, 0, 0, 40, 0, - 0, 0, 0, 0, 41, 42, 43, 0, 0, 0, - 44, 0, 0, 0, 0, 45, 0, 0, 0, 0, - 46, 0, 47, 0, 0, 0, 0, 0, 0, 0, - 48, 0, 0, 0, 0, 0, 0, 0, 0, 49, - 0, 50, 0, 0, 147, 148, 51, 0, 52, 53, + 158, 233, 121, 255, 120, 15, 208, 189, 209, 101, + 101, 264, 175, 10, 10, 5, 10, 117, 5, 1, + 2, 102, 102, 114, 10, 67, 354, 188, 143, 65, + 63, 298, 72, 252, 10, 373, 79, 1, 2, 201, + 7, 364, 317, 171, 172, 322, 10, 11, 65, 63, + 10, 11, 64, 386, 10, 71, 132, 16, 427, 78, + 10, 180, 181, 252, 203, 10, 79, 171, 172, 253, + 331, 64, 178, 19, 10, 180, 181, 10, 180, 181, + 340, 284, 166, 28, 144, 115, 167, 268, 250, 78, + 371, 372, 251, 178, 161, 10, 180, 181, 145, 253, + 328, 380, 72, 118, 329, 162, 29, 79, 261, 420, + -270, 220, 362, 30, 133, 68, 165, 254, 124, 118, + 189, 31, 175, 189, 132, 71, 352, 396, 191, 139, + 78, 233, 220, 112, -244, 290, 160, 158, -244, 164, + 188, 264, 12, 188, 118, 266, 17, 363, 391, 20, + 176, 190, 224, 405, 280, 406, 281, 21, 432, 261, + 215, 217, 10, 421, 32, 1, 2, 422, 293, 353, + 33, 280, 34, 224, 301, 302, 303, 304, 22, 294, + 23, 36, 133, 201, 216, 337, 201, 330, 343, 24, + 353, 265, 344, 10, 273, 335, 1, 2, 374, 273, + 73, 346, 285, 348, 289, 347, 202, 37, 203, 207, + 80, 203, 427, 1, 2, 284, 387, 359, 360, 399, + 361, 171, 172, 400, 66, 430, 178, 108, 10, 180, + 181, 1, 2, 124, 401, 418, 430, 218, 402, 410, + 316, 191, 297, 411, 191, 111, 246, 412, 1, 2, + 116, 219, 326, 125, 378, 109, 110, 126, 382, 171, + 172, 158, 384, 158, 190, 220, 221, 190, 339, 83, + 84, 339, 127, 160, 10, 180, 181, 1, 2, 128, + 129, 222, 1, 2, 171, 172, 134, 136, 178, 135, + 10, 180, 181, 1, 2, 301, 302, 303, 304, 218, + 223, 138, 168, 169, 141, 197, 224, 142, 170, -271, + 198, 200, 199, 219, 210, 225, 212, 213, 10, 375, + 246, 265, 226, 227, 249, 228, 273, 220, 221, 245, + 248, 259, 260, 276, 267, 277, 285, 375, 279, 289, + 118, 291, 190, 222, 292, 296, 299, 394, 300, 307, + 314, 311, 309, 332, 318, 323, 333, 398, 313, 327, + 190, 336, 223, 82, 334, 341, 349, 345, 224, 350, + 351, 83, 84, 365, 357, 355, 368, 225, 356, 369, + 370, 381, 85, 38, 86, 227, 87, 228, 398, 390, + 416, 414, 377, 383, 395, 403, 88, 160, 404, 160, + 89, 407, 426, 394, 90, 408, 425, 91, 41, 42, + 43, 431, 434, 436, 437, 6, 18, 192, 92, 45, + 35, 81, 113, 93, 46, 94, 47, 95, 140, 106, + 137, 358, 388, 379, 48, 325, 96, 97, 278, 376, + 214, 321, 433, 49, 409, 50, 310, 419, 312, 385, + 51, 98, 52, 53, 54, 178, 415, 10, 180, 181, + 1, 2, 342, 99, 177, 178, 179, 10, 180, 181, + 1, 2, 413, 0, 0, 0, 0, 0, 0, 0, + 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 220, 221, 0, 10, 0, 0, + 1, 2, 0, 0, 182, 0, 0, 0, 0, 0, + 222, 0, 38, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 0, 0, 0, 0, 39, 0, 223, + 0, 40, 0, 0, 0, 224, 0, 41, 42, 43, + 0, 0, 0, 44, 225, 184, 0, 0, 45, 0, + 0, 0, 227, 46, 228, 47, 0, 0, 0, 0, + 0, 0, 185, 48, 0, 0, 0, 0, 0, 0, + 0, 0, 49, 0, 50, 0, 0, 147, 148, 51, + 0, 52, 53, 54, 149, 0, 0, 0, 85, 38, + 86, 0, 87, 150, 0, 0, 0, 0, 0, 0, + 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, + 90, 0, 0, 91, 41, 42, 43, 0, 0, 0, + 0, 0, 151, 0, 92, 45, 0, 0, 0, 93, + 46, 94, 47, 95, 0, 0, 0, 0, 0, 0, + 48, 0, 96, 97, 152, 153, 0, 0, 0, 49, + 0, 50, 0, 154, 147, 148, 51, 98, 52, 53, 54, 149, 0, 0, 0, 85, 38, 86, 0, 87, 150, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 90, 0, 0, 91, 41, 42, 43, 0, 0, 0, 0, 0, 151, 0, 92, 45, 0, 0, 0, 93, 46, 94, 47, 95, 0, 0, 0, 0, 0, 0, 48, 0, 96, - 97, 152, 153, 0, 0, 0, 49, 0, 50, 0, - 154, 147, 148, 51, 98, 52, 53, 54, 149, 0, - 0, 0, 85, 38, 86, 0, 87, 150, 0, 0, - 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, - 89, 0, 0, 0, 90, 0, 0, 91, 41, 42, - 43, 0, 0, 0, 0, 0, 151, 0, 92, 45, - 0, 0, 0, 93, 46, 94, 47, 95, 0, 0, - 0, 0, 0, 0, 48, 0, 96, 97, 152, 153, - 0, 0, 0, 49, 0, 50, 83, 84, 0, 0, - 51, 98, 52, 53, 54, 0, 0, 85, 38, 86, - 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 88, 0, 0, 0, 89, 0, 0, 0, 90, - 0, 0, 91, 41, 42, 43, 0, 0, 0, 0, - 0, 0, 0, 92, 45, 0, 0, 0, 93, 46, - 94, 47, 95, 0, 0, 0, 0, 0, 0, 48, - 0, 96, 97, 0, 0, 0, 0, 0, 49, 0, - 50, 1, 2, 0, 0, 51, 98, 52, 53, 54, - 0, 0, 85, 38, 86, 0, 87, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, - 89, 0, 0, 0, 90, 0, 0, 91, 41, 42, - 43, 0, 0, 0, 0, 0, 0, 0, 92, 45, - 0, 0, 0, 93, 46, 94, 47, 95, 0, 0, - 0, 0, 0, 0, 48, 0, 96, 97, 0, 0, - 0, 0, 0, 49, 0, 50, 0, 0, 0, 0, - 51, 98, 52, 53, 54 + 97, 152, 153, 0, 0, 0, 49, 0, 50, 83, + 84, 0, 0, 51, 98, 52, 53, 54, 0, 0, + 85, 38, 86, 0, 87, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 0, 0, 0, 89, 0, + 0, 0, 90, 0, 0, 91, 41, 42, 43, 0, + 0, 0, 0, 0, 0, 0, 92, 45, 0, 0, + 0, 93, 46, 94, 47, 95, 0, 0, 0, 0, + 0, 0, 48, 0, 96, 97, 0, 0, 0, 0, + 0, 49, 0, 50, 1, 2, 0, 0, 51, 98, + 52, 53, 54, 0, 0, 85, 38, 86, 0, 87, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, + 0, 0, 0, 89, 0, 0, 0, 90, 0, 0, + 91, 41, 42, 43, 0, 0, 0, 0, 0, 0, + 0, 92, 45, 0, 0, 0, 93, 46, 94, 47, + 95, 0, 0, 0, 0, 0, 0, 48, 0, 96, + 97, 0, 0, 0, 0, 0, 49, 0, 50, 0, + 0, 0, 0, 51, 98, 52, 53, 54 }; static const short yycheck[] = { 7, - 82, 121, 153, 82, 155, 13, 170, 194, 198, 136, - 64, 65, 135, 4, 8, 8, 15, 13, 14, 28, - 64, 65, 13, 14, 19, 227, 291, 0, 103, 37, - 3, 8, 40, 8, 11, 12, 44, 33, 105, 8, - 17, 306, 11, 12, 46, 8, 9, 10, 56, 8, - 8, 9, 10, 8, 9, 99, 8, 9, 41, 8, - 103, 80, 264, 33, 37, 9, 74, 40, 111, 52, - 69, 44, 274, 69, 73, 6, 37, 8, 9, 10, - 75, 30, 209, 56, 103, 6, 105, 8, 9, 10, - 11, 12, 34, 8, 89, 56, 11, 12, 101, 69, - 104, 74, 110, 305, 108, 114, 108, 115, 104, 112, - 31, 57, 108, 104, 45, 194, 124, 111, 114, 246, - 243, 114, 249, 167, 45, 46, 99, 102, 136, 60, - 107, 46, 296, 212, 324, 255, 322, 110, 107, 102, - 61, 114, 115, 102, 102, 199, 104, 80, 121, 104, - 80, 124, 104, 102, 340, 86, 319, 320, 84, 80, - 168, 169, 135, 136, 104, 86, 84, 330, 108, 104, - 103, 53, 105, 108, 95, 105, 4, 97, 98, 99, - 100, 102, 103, 262, 105, 13, 14, 84, 108, 246, - 198, 270, 249, 201, 167, 322, 169, 3, 206, 301, - 302, 209, 304, 211, 5, 6, 7, 8, 9, 10, - 11, 12, 339, 340, 8, 9, 10, 11, 12, 406, - 6, 106, 8, 9, 10, 11, 12, 104, 21, 416, - 394, 108, 12, 12, 374, 386, 376, 245, 246, 8, - 20, 249, 11, 12, 45, 31, 104, 39, 327, 257, - 108, 333, 107, 226, 374, 337, 376, 11, 12, 45, - 46, 41, 63, 43, 103, 273, 104, 104, 276, 103, - 108, 108, 52, 246, 81, 61, 249, 11, 12, 13, - 14, 111, 255, 81, 6, 86, 8, 9, 10, 97, - 98, 99, 100, 71, 80, 107, 108, 13, 14, 51, - 86, 3, 103, 11, 12, 81, 111, 3, 104, 95, - 109, 9, 109, 104, 322, 103, 324, 103, 103, 105, - 103, 329, 35, 45, 68, 3, 103, 8, 103, 103, - 111, 339, 340, 115, 342, 25, 109, 105, 60, 111, - 348, 68, 105, 68, 114, 25, 30, 104, 108, 322, - 358, 96, 105, 3, 103, 4, 95, 88, 68, 110, - 108, 11, 12, 104, 86, 103, 106, 340, 104, 112, - 105, 101, 22, 23, 24, 103, 26, 106, 104, 4, - 388, 113, 82, 106, 102, 106, 36, 106, 112, 103, - 40, 108, 0, 401, 44, 106, 404, 47, 48, 49, - 50, 374, 106, 376, 111, 0, 3, 13, 58, 59, - 26, 56, 74, 63, 64, 65, 66, 67, 115, 139, - 296, 110, 65, 342, 74, 167, 76, 77, 329, 324, - 252, 248, 416, 83, 8, 85, 381, 11, 12, 206, - 90, 91, 92, 93, 94, 234, 339, 401, 243, 23, - 388, 392, 276, 103, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 38, -1, -1, -1, 42, -1, - -1, -1, -1, -1, 48, 49, 50, -1, -1, -1, - 54, -1, -1, -1, -1, 59, -1, -1, -1, -1, - 64, -1, 66, -1, -1, -1, -1, -1, -1, -1, - 74, -1, -1, -1, -1, -1, -1, -1, -1, 83, - -1, 85, -1, -1, 11, 12, 90, -1, 92, 93, + 121, 170, 82, 195, 82, 13, 153, 136, 155, 64, + 65, 199, 135, 8, 8, 0, 8, 28, 3, 11, + 12, 64, 65, 46, 8, 17, 295, 136, 19, 37, + 37, 228, 40, 33, 8, 327, 44, 11, 12, 80, + 103, 310, 249, 13, 14, 252, 8, 9, 56, 56, + 8, 9, 37, 345, 8, 40, 99, 34, 4, 44, + 8, 9, 10, 33, 105, 8, 74, 13, 14, 69, + 267, 56, 6, 105, 8, 9, 10, 8, 9, 10, + 277, 210, 104, 9, 75, 108, 108, 30, 104, 74, + 324, 325, 108, 6, 41, 8, 9, 10, 89, 69, + 104, 335, 110, 114, 108, 52, 57, 115, 102, 15, + 103, 45, 309, 84, 99, 107, 124, 195, 111, 114, + 249, 84, 245, 252, 167, 110, 60, 111, 136, 114, + 115, 300, 45, 107, 104, 213, 121, 258, 108, 124, + 249, 329, 104, 252, 114, 200, 104, 60, 102, 12, + 135, 136, 86, 382, 102, 384, 104, 20, 104, 102, + 168, 169, 8, 69, 53, 11, 12, 73, 101, 103, + 84, 102, 3, 86, 97, 98, 99, 100, 41, 112, + 43, 106, 167, 80, 169, 108, 80, 265, 104, 52, + 103, 199, 108, 8, 202, 273, 11, 12, 327, 207, + 46, 104, 210, 291, 212, 108, 103, 21, 105, 103, + 39, 105, 4, 11, 12, 344, 345, 305, 306, 104, + 308, 13, 14, 108, 12, 417, 6, 107, 8, 9, + 10, 11, 12, 111, 104, 404, 428, 17, 108, 104, + 248, 249, 227, 108, 252, 103, 9, 394, 11, 12, + 103, 31, 260, 81, 332, 107, 108, 81, 338, 13, + 14, 382, 342, 384, 249, 45, 46, 252, 276, 11, + 12, 279, 71, 258, 8, 9, 10, 11, 12, 51, + 81, 61, 11, 12, 13, 14, 3, 3, 6, 111, + 8, 9, 10, 11, 12, 97, 98, 99, 100, 17, + 80, 104, 109, 109, 104, 9, 86, 103, 103, 103, + 35, 68, 103, 31, 103, 95, 103, 3, 8, 327, + 9, 329, 102, 103, 109, 105, 334, 45, 46, 111, + 111, 115, 25, 68, 105, 105, 344, 345, 68, 347, + 114, 96, 327, 61, 25, 30, 104, 355, 108, 96, + 4, 103, 105, 68, 95, 88, 104, 365, 108, 110, + 345, 106, 80, 3, 108, 104, 103, 105, 86, 112, + 101, 11, 12, 113, 106, 103, 9, 95, 104, 4, + 82, 102, 22, 23, 24, 103, 26, 105, 396, 112, + 9, 111, 106, 106, 106, 103, 36, 382, 108, 384, + 40, 106, 108, 411, 44, 106, 414, 47, 48, 49, + 50, 9, 104, 0, 0, 3, 13, 139, 58, 59, + 26, 56, 74, 63, 64, 65, 66, 67, 115, 65, + 110, 300, 347, 334, 74, 255, 76, 77, 207, 329, + 167, 251, 428, 83, 389, 85, 236, 411, 245, 344, + 90, 91, 92, 93, 94, 6, 400, 8, 9, 10, + 11, 12, 279, 103, 5, 6, 7, 8, 9, 10, + 11, 12, 396, -1, -1, -1, -1, -1, -1, -1, + 31, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 45, 46, -1, 8, -1, -1, + 11, 12, -1, -1, 45, -1, -1, -1, -1, -1, + 61, -1, 23, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 63, -1, -1, -1, -1, 38, -1, 80, + -1, 42, -1, -1, -1, 86, -1, 48, 49, 50, + -1, -1, -1, 54, 95, 86, -1, -1, 59, -1, + -1, -1, 103, 64, 105, 66, -1, -1, -1, -1, + -1, -1, 103, 74, -1, -1, -1, -1, -1, -1, + -1, -1, 83, -1, 85, -1, -1, 11, 12, 90, + -1, 92, 93, 94, 18, -1, -1, -1, 22, 23, + 24, -1, 26, 27, -1, -1, -1, -1, -1, -1, + -1, -1, 36, -1, -1, -1, 40, -1, -1, -1, + 44, -1, -1, 47, 48, 49, 50, -1, -1, -1, + -1, -1, 56, -1, 58, 59, -1, -1, -1, 63, + 64, 65, 66, 67, -1, -1, -1, -1, -1, -1, + 74, -1, 76, 77, 78, 79, -1, -1, -1, 83, + -1, 85, -1, 87, 11, 12, 90, 91, 92, 93, 94, 18, -1, -1, -1, 22, 23, 24, -1, 26, 27, -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, 40, -1, -1, -1, 44, -1, -1, 47, 48, 49, 50, -1, -1, -1, -1, -1, 56, -1, 58, 59, -1, -1, -1, 63, 64, 65, 66, 67, -1, -1, -1, -1, -1, -1, 74, -1, 76, - 77, 78, 79, -1, -1, -1, 83, -1, 85, -1, - 87, 11, 12, 90, 91, 92, 93, 94, 18, -1, - -1, -1, 22, 23, 24, -1, 26, 27, -1, -1, - -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, - 40, -1, -1, -1, 44, -1, -1, 47, 48, 49, - 50, -1, -1, -1, -1, -1, 56, -1, 58, 59, - -1, -1, -1, 63, 64, 65, 66, 67, -1, -1, - -1, -1, -1, -1, 74, -1, 76, 77, 78, 79, - -1, -1, -1, 83, -1, 85, 11, 12, -1, -1, - 90, 91, 92, 93, 94, -1, -1, 22, 23, 24, - -1, 26, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 36, -1, -1, -1, 40, -1, -1, -1, 44, - -1, -1, 47, 48, 49, 50, -1, -1, -1, -1, - -1, -1, -1, 58, 59, -1, -1, -1, 63, 64, - 65, 66, 67, -1, -1, -1, -1, -1, -1, 74, - -1, 76, 77, -1, -1, -1, -1, -1, 83, -1, - 85, 11, 12, -1, -1, 90, 91, 92, 93, 94, - -1, -1, 22, 23, 24, -1, 26, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, - 40, -1, -1, -1, 44, -1, -1, 47, 48, 49, - 50, -1, -1, -1, -1, -1, -1, -1, 58, 59, - -1, -1, -1, 63, 64, 65, 66, 67, -1, -1, - -1, -1, -1, -1, 74, -1, 76, 77, -1, -1, - -1, -1, -1, 83, -1, 85, -1, -1, -1, -1, - 90, 91, 92, 93, 94 + 77, 78, 79, -1, -1, -1, 83, -1, 85, 11, + 12, -1, -1, 90, 91, 92, 93, 94, -1, -1, + 22, 23, 24, -1, 26, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 36, -1, -1, -1, 40, -1, + -1, -1, 44, -1, -1, 47, 48, 49, 50, -1, + -1, -1, -1, -1, -1, -1, 58, 59, -1, -1, + -1, 63, 64, 65, 66, 67, -1, -1, -1, -1, + -1, -1, 74, -1, 76, 77, -1, -1, -1, -1, + -1, 83, -1, 85, 11, 12, -1, -1, 90, 91, + 92, 93, 94, -1, -1, 22, 23, 24, -1, 26, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 36, + -1, -1, -1, 40, -1, -1, -1, 44, -1, -1, + 47, 48, 49, 50, -1, -1, -1, -1, -1, -1, + -1, 58, 59, -1, -1, -1, 63, 64, 65, 66, + 67, -1, -1, -1, -1, -1, -1, 74, -1, 76, + 77, -1, -1, -1, -1, -1, 83, -1, 85, -1, + -1, -1, -1, 90, 91, 92, 93, 94 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/share/bison.simple" @@ -1345,13 +1362,13 @@ yyparse(YYPARSE_PARAM_ARG) switch (yyn) { case 1: -#line 303 "asn1p_y.y" +#line 304 "asn1p_y.y" { *(void **)param = yyvsp[0].a_grammar; ; break;} case 2: -#line 309 "asn1p_y.y" +#line 310 "asn1p_y.y" { yyval.a_grammar = asn1p_new(); checkmem(yyval.a_grammar); @@ -1359,14 +1376,14 @@ case 2: ; break;} case 3: -#line 314 "asn1p_y.y" +#line 315 "asn1p_y.y" { yyval.a_grammar = yyvsp[-1].a_grammar; TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); ; break;} case 4: -#line 335 "asn1p_y.y" +#line 336 "asn1p_y.y" { if(yyvsp[-1].a_module) { @@ -1383,27 +1400,27 @@ case 4: ; break;} case 5: -#line 356 "asn1p_y.y" +#line 357 "asn1p_y.y" { yyval.a_oid = 0; ; break;} case 6: -#line 357 "asn1p_y.y" +#line 358 "asn1p_y.y" { yyval.a_oid = yyvsp[0].a_oid; ; break;} case 7: -#line 361 "asn1p_y.y" +#line 362 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; ; break;} case 8: -#line 364 "asn1p_y.y" +#line 365 "asn1p_y.y" { yyval.a_oid = 0; ; break;} case 9: -#line 370 "asn1p_y.y" +#line 371 "asn1p_y.y" { yyval.a_oid = asn1p_oid_new(); asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1412,7 +1429,7 @@ case 9: ; break;} case 10: -#line 376 "asn1p_y.y" +#line 377 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1421,74 +1438,74 @@ case 10: ; break;} case 11: -#line 385 "asn1p_y.y" +#line 386 "asn1p_y.y" { /* iso */ yyval.a_oid_arc.name = yyvsp[0].tv_str; yyval.a_oid_arc.number = -1; ; break;} case 12: -#line 389 "asn1p_y.y" +#line 390 "asn1p_y.y" { /* iso(1) */ yyval.a_oid_arc.name = yyvsp[-3].tv_str; yyval.a_oid_arc.number = yyvsp[-1].a_int; ; break;} case 13: -#line 393 "asn1p_y.y" +#line 394 "asn1p_y.y" { /* 1 */ yyval.a_oid_arc.name = 0; yyval.a_oid_arc.number = yyvsp[0].a_int; ; break;} case 14: -#line 403 "asn1p_y.y" +#line 404 "asn1p_y.y" { yyval.a_module_flags = MSF_NOFLAGS; ; break;} case 15: -#line 404 "asn1p_y.y" +#line 405 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; ; break;} case 16: -#line 413 "asn1p_y.y" +#line 414 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; ; break;} case 17: -#line 416 "asn1p_y.y" +#line 417 "asn1p_y.y" { yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags; ; break;} case 18: -#line 425 "asn1p_y.y" +#line 426 "asn1p_y.y" { yyval.a_module_flags = MSF_EXPLICIT_TAGS; ; break;} case 19: -#line 428 "asn1p_y.y" +#line 429 "asn1p_y.y" { yyval.a_module_flags = MSF_IMPLICIT_TAGS; ; break;} case 20: -#line 431 "asn1p_y.y" +#line 432 "asn1p_y.y" { yyval.a_module_flags = MSF_AUTOMATIC_TAGS; ; break;} case 21: -#line 434 "asn1p_y.y" +#line 435 "asn1p_y.y" { yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED; ; break;} case 22: -#line 438 "asn1p_y.y" +#line 439 "asn1p_y.y" { /* X.680Amd1 specifies TAG and XER */ if(strcmp(yyvsp[-1].tv_str, "TAG") == 0) { @@ -1506,23 +1523,23 @@ case 22: ; break;} case 23: -#line 459 "asn1p_y.y" +#line 460 "asn1p_y.y" { yyval.a_module = 0; ; break;} case 24: -#line 460 "asn1p_y.y" +#line 461 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 25: -#line 469 "asn1p_y.y" +#line 470 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 26: -#line 472 "asn1p_y.y" +#line 473 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; @@ -1552,13 +1569,13 @@ case 26: ; break;} case 27: -#line 505 "asn1p_y.y" +#line 506 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 28: -#line 508 "asn1p_y.y" +#line 509 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1570,7 +1587,7 @@ case 28: ; break;} case 29: -#line 517 "asn1p_y.y" +#line 518 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1580,7 +1597,7 @@ case 29: ; break;} case 30: -#line 524 "asn1p_y.y" +#line 525 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1590,7 +1607,7 @@ case 30: ; break;} case 31: -#line 537 "asn1p_y.y" +#line 538 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1600,11 +1617,11 @@ case 31: ; break;} case 32: -#line 545 "asn1p_y.y" +#line 546 "asn1p_y.y" { asn1p_lexer_hack_push_encoding_control(); ; break;} case 33: -#line 546 "asn1p_y.y" +#line 547 "asn1p_y.y" { fprintf(stderr, "WARNING: ENCODING-CONTROL %s " @@ -1615,7 +1632,7 @@ case 33: ; break;} case 34: -#line 558 "asn1p_y.y" +#line 559 "asn1p_y.y" { return yyerror( "Attempt to redefine a standard basic type, " @@ -1624,19 +1641,19 @@ case 34: ; break;} case 35: -#line 572 "asn1p_y.y" +#line 573 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; ; break;} case 36: -#line 578 "asn1p_y.y" +#line 579 "asn1p_y.y" { return yyerror("Empty IMPORTS list"); ; break;} case 37: -#line 584 "asn1p_y.y" +#line 585 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1644,14 +1661,14 @@ case 37: ; break;} case 38: -#line 589 "asn1p_y.y" +#line 590 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); ; break;} case 39: -#line 596 "asn1p_y.y" +#line 597 "asn1p_y.y" { yyval.a_xports = yyvsp[-3].a_xports; yyval.a_xports->from = yyvsp[-1].tv_str; @@ -1660,7 +1677,7 @@ case 39: ; break;} case 40: -#line 605 "asn1p_y.y" +#line 606 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); @@ -1668,14 +1685,14 @@ case 40: ; break;} case 41: -#line 610 "asn1p_y.y" +#line 611 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} case 42: -#line 617 "asn1p_y.y" +#line 618 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1684,7 +1701,7 @@ case 42: ; break;} case 43: -#line 623 "asn1p_y.y" +#line 624 "asn1p_y.y" { /* Completely equivalent to above */ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1693,7 +1710,7 @@ case 43: ; break;} case 44: -#line 629 "asn1p_y.y" +#line 630 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1702,19 +1719,19 @@ case 44: ; break;} case 45: -#line 638 "asn1p_y.y" +#line 639 "asn1p_y.y" { yyval.a_xports = yyvsp[-1].a_xports; ; break;} case 46: -#line 641 "asn1p_y.y" +#line 642 "asn1p_y.y" { yyval.a_xports = 0; ; break;} case 47: -#line 644 "asn1p_y.y" +#line 645 "asn1p_y.y" { /* Empty EXPORTS clause effectively prohibits export. */ yyval.a_xports = asn1p_xports_new(); @@ -1722,7 +1739,7 @@ case 47: ; break;} case 48: -#line 652 "asn1p_y.y" +#line 653 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); assert(yyval.a_xports); @@ -1730,14 +1747,14 @@ case 48: ; break;} case 49: -#line 657 "asn1p_y.y" +#line 658 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} case 50: -#line 664 "asn1p_y.y" +#line 665 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1746,7 +1763,7 @@ case 50: ; break;} case 51: -#line 670 "asn1p_y.y" +#line 671 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1755,7 +1772,7 @@ case 51: ; break;} case 52: -#line 676 "asn1p_y.y" +#line 677 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1764,7 +1781,7 @@ case 52: ; break;} case 53: -#line 686 "asn1p_y.y" +#line 687 "asn1p_y.y" { yyval.a_expr = yyvsp[-4].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1774,7 +1791,7 @@ case 53: ; break;} case 54: -#line 696 "asn1p_y.y" +#line 697 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1784,7 +1801,7 @@ case 54: ; break;} case 55: -#line 703 "asn1p_y.y" +#line 704 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1793,36 +1810,36 @@ case 55: ; break;} case 56: -#line 712 "asn1p_y.y" +#line 713 "asn1p_y.y" { ; break;} case 57: -#line 713 "asn1p_y.y" +#line 714 "asn1p_y.y" { ; break;} case 58: -#line 724 "asn1p_y.y" +#line 725 "asn1p_y.y" { ; break;} case 59: -#line 726 "asn1p_y.y" +#line 727 "asn1p_y.y" { ; break;} case 60: -#line 731 "asn1p_y.y" +#line 732 "asn1p_y.y" { ; break;} case 61: -#line 733 "asn1p_y.y" +#line 734 "asn1p_y.y" { ; break;} case 62: -#line 749 "asn1p_y.y" +#line 750 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1833,7 +1850,7 @@ case 62: ; break;} case 63: -#line 757 "asn1p_y.y" +#line 758 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -1842,7 +1859,7 @@ case 63: ; break;} case 64: -#line 763 "asn1p_y.y" +#line 764 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -1851,7 +1868,7 @@ case 64: ; break;} case 65: -#line 779 "asn1p_y.y" +#line 780 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1861,7 +1878,7 @@ case 65: ; break;} case 66: -#line 789 "asn1p_y.y" +#line 790 "asn1p_y.y" { int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); @@ -1873,7 +1890,7 @@ case 66: ; break;} case 67: -#line 798 "asn1p_y.y" +#line 799 "asn1p_y.y" { int ret; yyval.a_plist = yyvsp[-2].a_plist; @@ -1884,14 +1901,14 @@ case 67: ; break;} case 68: -#line 809 "asn1p_y.y" +#line 810 "asn1p_y.y" { yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} case 69: -#line 813 "asn1p_y.y" +#line 814 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1901,7 +1918,7 @@ case 69: ; break;} case 70: -#line 820 "asn1p_y.y" +#line 821 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1911,7 +1928,7 @@ case 70: ; break;} case 71: -#line 827 "asn1p_y.y" +#line 828 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1922,7 +1939,7 @@ case 71: ; break;} case 72: -#line 838 "asn1p_y.y" +#line 839 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1930,20 +1947,20 @@ case 72: ; break;} case 73: -#line 843 "asn1p_y.y" +#line 844 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 74: -#line 850 "asn1p_y.y" +#line 851 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 75: -#line 853 "asn1p_y.y" +#line 854 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1953,15 +1970,15 @@ case 75: ; break;} case 76: -#line 877 "asn1p_y.y" +#line 878 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); ; break;} case 77: -#line 878 "asn1p_y.y" +#line 879 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 78: -#line 881 "asn1p_y.y" +#line 882 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1969,14 +1986,14 @@ case 78: ; break;} case 79: -#line 886 "asn1p_y.y" +#line 887 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 80: -#line 893 "asn1p_y.y" +#line 894 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1985,7 +2002,7 @@ case 80: ; break;} case 81: -#line 899 "asn1p_y.y" +#line 900 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1995,13 +2012,13 @@ case 81: ; break;} case 82: -#line 906 "asn1p_y.y" +#line 907 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 83: -#line 912 "asn1p_y.y" +#line 913 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2009,14 +2026,14 @@ case 83: ; break;} case 84: -#line 917 "asn1p_y.y" +#line 918 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 85: -#line 924 "asn1p_y.y" +#line 925 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -2024,13 +2041,13 @@ case 85: ; break;} case 86: -#line 929 "asn1p_y.y" +#line 930 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 87: -#line 935 "asn1p_y.y" +#line 936 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); @@ -2040,15 +2057,15 @@ case 87: ; break;} case 88: -#line 945 "asn1p_y.y" +#line 946 "asn1p_y.y" { yyval.a_int = 0; ; break;} case 89: -#line 946 "asn1p_y.y" +#line 947 "asn1p_y.y" { yyval.a_int = 1; ; break;} case 90: -#line 950 "asn1p_y.y" +#line 951 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2058,14 +2075,14 @@ case 90: ; break;} case 91: -#line 957 "asn1p_y.y" +#line 958 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 92: -#line 964 "asn1p_y.y" +#line 965 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2076,7 +2093,7 @@ case 92: ; break;} case 93: -#line 972 "asn1p_y.y" +#line 973 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; yyval.a_expr->Identifier = yyvsp[-3].a_refcomp.name; @@ -2085,7 +2102,7 @@ case 93: ; break;} case 94: -#line 978 "asn1p_y.y" +#line 979 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2103,47 +2120,47 @@ case 94: ; break;} case 95: -#line 996 "asn1p_y.y" +#line 997 "asn1p_y.y" { yyval.a_wsynt = 0; ; break;} case 96: -#line 997 "asn1p_y.y" +#line 998 "asn1p_y.y" { yyval.a_wsynt = yyvsp[0].a_wsynt; ; break;} case 97: -#line 1004 "asn1p_y.y" +#line 1005 "asn1p_y.y" { asn1p_lexer_hack_enable_with_syntax(); ; break;} case 98: -#line 1006 "asn1p_y.y" +#line 1007 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; ; break;} case 99: -#line 1012 "asn1p_y.y" +#line 1013 "asn1p_y.y" { yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} case 100: -#line 1016 "asn1p_y.y" +#line 1017 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} case 101: -#line 1023 "asn1p_y.y" +#line 1024 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); ; break;} case 102: -#line 1026 "asn1p_y.y" +#line 1027 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2155,7 +2172,7 @@ case 102: ; break;} case 103: -#line 1038 "asn1p_y.y" +#line 1039 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2166,7 +2183,7 @@ case 103: ; break;} case 104: -#line 1046 "asn1p_y.y" +#line 1047 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2178,7 +2195,7 @@ case 104: ; break;} case 105: -#line 1055 "asn1p_y.y" +#line 1056 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2190,7 +2207,7 @@ case 105: ; break;} case 106: -#line 1067 "asn1p_y.y" +#line 1068 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; yyval.a_expr->tag = yyvsp[-2].a_tag; @@ -2212,13 +2229,13 @@ case 106: ; break;} case 107: -#line 1089 "asn1p_y.y" +#line 1090 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 108: -#line 1092 "asn1p_y.y" +#line 1093 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2227,7 +2244,7 @@ case 108: ; break;} case 109: -#line 1098 "asn1p_y.y" +#line 1099 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2236,7 +2253,7 @@ case 109: ; break;} case 110: -#line 1104 "asn1p_y.y" +#line 1105 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2245,7 +2262,7 @@ case 110: ; break;} case 111: -#line 1110 "asn1p_y.y" +#line 1111 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2258,7 +2275,7 @@ case 111: ; break;} case 112: -#line 1120 "asn1p_y.y" +#line 1121 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2271,7 +2288,7 @@ case 112: ; break;} case 113: -#line 1130 "asn1p_y.y" +#line 1131 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2280,7 +2297,7 @@ case 113: ; break;} case 114: -#line 1136 "asn1p_y.y" +#line 1137 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2294,7 +2311,7 @@ case 114: ; break;} case 115: -#line 1150 "asn1p_y.y" +#line 1151 "asn1p_y.y" { int ret; yyval.a_expr = yyvsp[-1].a_expr; @@ -2311,7 +2328,7 @@ case 115: ; break;} case 116: -#line 1174 "asn1p_y.y" +#line 1175 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2321,7 +2338,7 @@ case 116: ; break;} case 117: -#line 1181 "asn1p_y.y" +#line 1182 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2331,7 +2348,7 @@ case 117: ; break;} case 118: -#line 1196 "asn1p_y.y" +#line 1197 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2342,7 +2359,7 @@ case 118: ; break;} case 119: -#line 1204 "asn1p_y.y" +#line 1205 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2355,7 +2372,7 @@ case 119: ; break;} case 120: -#line 1214 "asn1p_y.y" +#line 1215 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2368,7 +2385,7 @@ case 120: ; break;} case 121: -#line 1224 "asn1p_y.y" +#line 1225 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2381,7 +2398,7 @@ case 121: ; break;} case 122: -#line 1234 "asn1p_y.y" +#line 1235 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2392,7 +2409,7 @@ case 122: ; break;} case 123: -#line 1242 "asn1p_y.y" +#line 1243 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[0].a_ref; @@ -2414,7 +2431,7 @@ case 123: ; break;} case 124: -#line 1264 "asn1p_y.y" +#line 1265 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2425,7 +2442,7 @@ case 124: ; break;} case 125: -#line 1272 "asn1p_y.y" +#line 1273 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[-2].a_ref; @@ -2435,21 +2452,21 @@ case 125: ; break;} case 128: -#line 1286 "asn1p_y.y" +#line 1287 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} case 129: -#line 1291 "asn1p_y.y" +#line 1292 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} case 130: -#line 1304 "asn1p_y.y" +#line 1305 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); @@ -2459,7 +2476,7 @@ case 130: ; break;} case 131: -#line 1314 "asn1p_y.y" +#line 1315 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2469,11 +2486,11 @@ case 131: ; break;} case 132: -#line 1321 "asn1p_y.y" +#line 1322 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} case 133: -#line 1321 "asn1p_y.y" +#line 1322 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); @@ -2481,7 +2498,7 @@ case 133: ; break;} case 134: -#line 1326 "asn1p_y.y" +#line 1327 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2489,7 +2506,7 @@ case 134: ; break;} case 135: -#line 1331 "asn1p_y.y" +#line 1332 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2497,7 +2514,7 @@ case 135: ; break;} case 136: -#line 1336 "asn1p_y.y" +#line 1337 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2505,24 +2522,23 @@ case 136: ; break;} case 137: -#line 1341 "asn1p_y.y" +#line 1342 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); ; break;} case 138: -#line 1345 "asn1p_y.y" +#line 1346 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); ; break;} case 139: -#line 1349 "asn1p_y.y" +#line 1350 "asn1p_y.y" { - yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); - checkmem(yyval.a_value); + yyval.a_value = yyval.a_value; ; break;} case 140: @@ -2569,7 +2585,44 @@ case 143: ; break;} case 144: -#line 1390 "asn1p_y.y" +#line 1391 "asn1p_y.y" +{ + yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); + checkmem(yyval.a_value); + ; + break;} +case 145: +#line 1395 "asn1p_y.y" +{ + asn1c_integer_t v = (yyvsp[-3].a_int << 4) + yyvsp[-1].a_int; + if(yyvsp[-3].a_int > 7) return yyerror("X.680:2003, #37.14 " + "mandates 0..7 range for Tuple's TableColumn"); + if(yyvsp[-1].a_int > 15) return yyerror("X.680:2003, #37.14 " + "mandates 0..15 range for Tuple's TableRow"); + yyval.a_value = asn1p_value_fromint(v); + checkmem(yyval.a_value); + yyval.a_value->type = ATV_TUPLE; + ; + break;} +case 146: +#line 1405 "asn1p_y.y" +{ + asn1c_integer_t v = (yyvsp[-7].a_int << 24) | (yyvsp[-5].a_int << 16) | (yyvsp[-3].a_int << 8) | yyvsp[-1].a_int; + if(yyvsp[-7].a_int > 127) return yyerror("X.680:2003, #37.12 " + "mandates 0..127 range for Quadruple's Group"); + if(yyvsp[-5].a_int > 255) return yyerror("X.680:2003, #37.12 " + "mandates 0..255 range for Quadruple's Plane"); + if(yyvsp[-3].a_int > 255) return yyerror("X.680:2003, #37.12 " + "mandates 0..255 range for Quadruple's Row"); + if(yyvsp[-1].a_int > 255) return yyerror("X.680:2003, #37.12 " + "mandates 0..255 range for Quadruple's Cell"); + yyval.a_value = asn1p_value_fromint(v); + checkmem(yyval.a_value); + yyval.a_value->type = ATV_QUADRUPLE; + ; + break;} +case 147: +#line 1422 "asn1p_y.y" { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 1; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); @@ -2580,8 +2633,8 @@ case 144: free(yyvsp[0].tv_opaque.buf); ; break;} -case 145: -#line 1399 "asn1p_y.y" +case 148: +#line 1431 "asn1p_y.y" { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); @@ -2595,72 +2648,72 @@ case 145: yyval.tv_opaque.len = newsize; ; break;} -case 146: -#line 1414 "asn1p_y.y" +case 149: +#line 1446 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BOOLEAN; ; break;} -case 147: -#line 1415 "asn1p_y.y" +case 150: +#line 1447 "asn1p_y.y" { yyval.a_type = ASN_BASIC_NULL; ; break;} -case 148: -#line 1416 "asn1p_y.y" +case 151: +#line 1448 "asn1p_y.y" { yyval.a_type = ASN_BASIC_REAL; ; break;} -case 149: -#line 1417 "asn1p_y.y" +case 152: +#line 1449 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} -case 150: -#line 1418 "asn1p_y.y" +case 153: +#line 1450 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OCTET_STRING; ; break;} -case 151: -#line 1419 "asn1p_y.y" +case 154: +#line 1451 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; break;} -case 152: -#line 1420 "asn1p_y.y" +case 155: +#line 1452 "asn1p_y.y" { yyval.a_type = ASN_BASIC_RELATIVE_OID; ; break;} -case 153: -#line 1421 "asn1p_y.y" +case 156: +#line 1453 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EXTERNAL; ; break;} -case 154: -#line 1422 "asn1p_y.y" +case 157: +#line 1454 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; break;} -case 155: -#line 1423 "asn1p_y.y" +case 158: +#line 1455 "asn1p_y.y" { yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; break;} -case 156: -#line 1424 "asn1p_y.y" +case 159: +#line 1456 "asn1p_y.y" { yyval.a_type = ASN_BASIC_UTCTime; ; break;} -case 157: -#line 1425 "asn1p_y.y" +case 160: +#line 1457 "asn1p_y.y" { yyval.a_type = ASN_BASIC_GeneralizedTime; ; break;} -case 158: -#line 1426 "asn1p_y.y" +case 161: +#line 1458 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} -case 159: -#line 1433 "asn1p_y.y" +case 162: +#line 1465 "asn1p_y.y" { yyval.a_type = ASN_BASIC_INTEGER; ; break;} -case 160: -#line 1434 "asn1p_y.y" +case 163: +#line 1466 "asn1p_y.y" { yyval.a_type = ASN_BASIC_ENUMERATED; ; break;} -case 161: -#line 1435 "asn1p_y.y" +case 164: +#line 1467 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BIT_STRING; ; break;} -case 162: -#line 1439 "asn1p_y.y" +case 165: +#line 1471 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2668,8 +2721,8 @@ case 162: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 163: -#line 1445 "asn1p_y.y" +case 166: +#line 1477 "asn1p_y.y" { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; @@ -2681,92 +2734,92 @@ case 163: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 164: -#line 1458 "asn1p_y.y" +case 167: +#line 1490 "asn1p_y.y" { yyval.a_type = ASN_STRING_BMPString; ; break;} -case 165: -#line 1459 "asn1p_y.y" +case 168: +#line 1491 "asn1p_y.y" { yyval.a_type = ASN_STRING_GeneralString; fprintf(stderr, "WARNING: GeneralString is not fully supported\n"); ; break;} -case 166: -#line 1463 "asn1p_y.y" +case 169: +#line 1495 "asn1p_y.y" { yyval.a_type = ASN_STRING_GraphicString; fprintf(stderr, "WARNING: GraphicString is not fully supported\n"); ; break;} -case 167: -#line 1467 "asn1p_y.y" +case 170: +#line 1499 "asn1p_y.y" { yyval.a_type = ASN_STRING_IA5String; ; break;} -case 168: -#line 1468 "asn1p_y.y" +case 171: +#line 1500 "asn1p_y.y" { yyval.a_type = ASN_STRING_ISO646String; ; break;} -case 169: -#line 1469 "asn1p_y.y" +case 172: +#line 1501 "asn1p_y.y" { yyval.a_type = ASN_STRING_NumericString; ; break;} -case 170: -#line 1470 "asn1p_y.y" +case 173: +#line 1502 "asn1p_y.y" { yyval.a_type = ASN_STRING_PrintableString; ; break;} -case 171: -#line 1471 "asn1p_y.y" +case 174: +#line 1503 "asn1p_y.y" { yyval.a_type = ASN_STRING_T61String; fprintf(stderr, "WARNING: T61String is not fully supported\n"); ; break;} -case 172: -#line 1475 "asn1p_y.y" +case 175: +#line 1507 "asn1p_y.y" { yyval.a_type = ASN_STRING_TeletexString; ; break;} -case 173: -#line 1476 "asn1p_y.y" +case 176: +#line 1508 "asn1p_y.y" { yyval.a_type = ASN_STRING_UniversalString; ; break;} -case 174: -#line 1477 "asn1p_y.y" +case 177: +#line 1509 "asn1p_y.y" { yyval.a_type = ASN_STRING_UTF8String; ; break;} -case 175: -#line 1478 "asn1p_y.y" +case 178: +#line 1510 "asn1p_y.y" { yyval.a_type = ASN_STRING_VideotexString; fprintf(stderr, "WARNING: VideotexString is not fully supported\n"); ; break;} -case 176: -#line 1482 "asn1p_y.y" +case 179: +#line 1514 "asn1p_y.y" { yyval.a_type = ASN_STRING_VisibleString; ; break;} -case 177: -#line 1483 "asn1p_y.y" +case 180: +#line 1515 "asn1p_y.y" { yyval.a_type = ASN_STRING_ObjectDescriptor; ; break;} -case 183: -#line 1495 "asn1p_y.y" +case 186: +#line 1527 "asn1p_y.y" { yyval.a_constr = 0; ; break;} -case 184: -#line 1496 "asn1p_y.y" +case 187: +#line 1528 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 185: -#line 1502 "asn1p_y.y" +case 188: +#line 1534 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); ; break;} -case 186: -#line 1505 "asn1p_y.y" +case 189: +#line 1537 "asn1p_y.y" { /* * This is a special case, for compatibility purposes. @@ -2775,26 +2828,26 @@ case 186: CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_SIZE, yyvsp[-1].a_constr, 0); ; break;} -case 187: -#line 1515 "asn1p_y.y" +case 190: +#line 1547 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; ; break;} -case 188: -#line 1518 "asn1p_y.y" +case 191: +#line 1550 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} -case 189: -#line 1524 "asn1p_y.y" +case 192: +#line 1556 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 190: -#line 1527 "asn1p_y.y" +case 193: +#line 1559 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2802,8 +2855,8 @@ case 190: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); ; break;} -case 191: -#line 1533 "asn1p_y.y" +case 194: +#line 1565 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2813,32 +2866,38 @@ case 191: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, ct, yyvsp[0].a_constr); ; break;} -case 192: -#line 1544 "asn1p_y.y" +case 195: +#line 1576 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 193: -#line 1547 "asn1p_y.y" +case 196: +#line 1579 "asn1p_y.y" +{ + CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_AEX, yyvsp[0].a_constr, 0); + ; + break;} +case 197: +#line 1582 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 194: -#line 1550 "asn1p_y.y" +case 198: +#line 1585 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 195: -#line 1553 "asn1p_y.y" +case 199: +#line 1588 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 196: -#line 1559 "asn1p_y.y" +case 200: +#line 1594 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2848,8 +2907,8 @@ case 196: checkmem(ret == 0); ; break;} -case 197: -#line 1567 "asn1p_y.y" +case 201: +#line 1602 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2859,8 +2918,8 @@ case 197: checkmem(ret == 0); ; break;} -case 198: -#line 1575 "asn1p_y.y" +case 202: +#line 1610 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2868,8 +2927,8 @@ case 198: yyval.a_constr->value = yyvsp[0].a_value; ; break;} -case 199: -#line 1581 "asn1p_y.y" +case 203: +#line 1616 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2877,8 +2936,8 @@ case 199: yyval.a_constr->containedSubtype = yyvsp[0].a_value; ; break;} -case 200: -#line 1587 "asn1p_y.y" +case 204: +#line 1622 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2887,8 +2946,8 @@ case 200: yyval.a_constr->range_stop = yyvsp[0].a_value; ; break;} -case 201: -#line 1594 "asn1p_y.y" +case 205: +#line 1629 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2898,8 +2957,8 @@ case 201: yyval.a_constr->range_start->type = ATV_MIN; ; break;} -case 202: -#line 1602 "asn1p_y.y" +case 206: +#line 1637 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2909,8 +2968,8 @@ case 202: yyval.a_constr->range_stop->type = ATV_MAX; ; break;} -case 203: -#line 1610 "asn1p_y.y" +case 207: +#line 1645 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2921,24 +2980,24 @@ case 203: yyval.a_constr->range_stop->type = ATV_MAX; ; break;} -case 204: -#line 1619 "asn1p_y.y" +case 208: +#line 1654 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 205: -#line 1622 "asn1p_y.y" +case 209: +#line 1657 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 206: -#line 1626 "asn1p_y.y" +case 210: +#line 1661 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} -case 207: -#line 1626 "asn1p_y.y" +case 211: +#line 1661 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2948,65 +3007,64 @@ case 207: yyval.a_constr->value->type = ATV_UNPARSED; ; break;} -case 208: -#line 1637 "asn1p_y.y" +case 212: +#line 1672 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RANGE; ; break;} -case 209: -#line 1638 "asn1p_y.y" +case 213: +#line 1673 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RLRANGE; ; break;} -case 210: -#line 1639 "asn1p_y.y" +case 214: +#line 1674 "asn1p_y.y" { yyval.a_ctype = ACT_EL_LLRANGE; ; break;} -case 211: -#line 1640 "asn1p_y.y" +case 215: +#line 1675 "asn1p_y.y" { yyval.a_ctype = ACT_EL_ULRANGE; ; break;} -case 212: -#line 1644 "asn1p_y.y" +case 216: +#line 1679 "asn1p_y.y" { yyval.a_ctype = ACT_CT_SIZE; ; break;} -case 213: -#line 1647 "asn1p_y.y" +case 217: +#line 1682 "asn1p_y.y" { yyval.a_ctype = ACT_CT_FROM; ; break;} -case 214: -#line 1653 "asn1p_y.y" +case 218: +#line 1688 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_FALSE; ; break;} -case 215: -#line 1658 "asn1p_y.y" +case 219: +#line 1693 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); yyval.a_value->type = ATV_TRUE; ; break;} -case 216: -#line 1663 "asn1p_y.y" +case 220: +#line 1698 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 217: -#line 1666 "asn1p_y.y" +case 221: +#line 1701 "asn1p_y.y" { - yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); - checkmem(yyval.a_value); + yyval.a_value = yyvsp[0].a_value; ; break;} -case 218: -#line 1670 "asn1p_y.y" +case 222: +#line 1704 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3019,8 +3077,8 @@ case 218: free(yyvsp[0].tv_str); ; break;} -case 219: -#line 1684 "asn1p_y.y" +case 223: +#line 1718 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3033,34 +3091,34 @@ case 219: free(yyvsp[0].tv_str); ; break;} -case 220: -#line 1698 "asn1p_y.y" +case 224: +#line 1732 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); ; break;} -case 221: -#line 1704 "asn1p_y.y" +case 225: +#line 1738 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 222: -#line 1707 "asn1p_y.y" +case 226: +#line 1741 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 223: -#line 1713 "asn1p_y.y" +case 227: +#line 1747 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_EXT; ; break;} -case 224: -#line 1718 "asn1p_y.y" +case 228: +#line 1752 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3069,46 +3127,46 @@ case 224: yyval.a_constr->presence = yyvsp[0].a_pres; ; break;} -case 225: -#line 1731 "asn1p_y.y" +case 229: +#line 1765 "asn1p_y.y" { yyval.a_pres = ACPRES_DEFAULT; ; break;} -case 226: -#line 1732 "asn1p_y.y" +case 230: +#line 1766 "asn1p_y.y" { yyval.a_pres = yyvsp[0].a_pres; ; break;} -case 227: -#line 1736 "asn1p_y.y" +case 231: +#line 1770 "asn1p_y.y" { yyval.a_pres = ACPRES_PRESENT; ; break;} -case 228: -#line 1739 "asn1p_y.y" +case 232: +#line 1773 "asn1p_y.y" { yyval.a_pres = ACPRES_ABSENT; ; break;} -case 229: -#line 1742 "asn1p_y.y" +case 233: +#line 1776 "asn1p_y.y" { yyval.a_pres = ACPRES_OPTIONAL; ; break;} -case 230: -#line 1748 "asn1p_y.y" +case 234: +#line 1782 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 231: -#line 1751 "asn1p_y.y" +case 235: +#line 1785 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 232: -#line 1760 "asn1p_y.y" +case 236: +#line 1794 "asn1p_y.y" { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; @@ -3122,14 +3180,14 @@ case 232: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, ct, 0); ; break;} -case 233: -#line 1775 "asn1p_y.y" +case 237: +#line 1809 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} -case 234: -#line 1781 "asn1p_y.y" +case 238: +#line 1815 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3137,8 +3195,8 @@ case 234: yyval.a_constr->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); ; break;} -case 235: -#line 1787 "asn1p_y.y" +case 239: +#line 1821 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3148,8 +3206,8 @@ case 235: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); ; break;} -case 236: -#line 1801 "asn1p_y.y" +case 240: +#line 1835 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; @@ -3162,8 +3220,8 @@ case 236: free(yyvsp[0].tv_str); ; break;} -case 237: -#line 1812 "asn1p_y.y" +case 241: +#line 1846 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; @@ -3177,14 +3235,14 @@ case 237: free(yyvsp[0].tv_str); ; break;} -case 238: -#line 1828 "asn1p_y.y" +case 242: +#line 1862 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 239: -#line 1831 "asn1p_y.y" +case 243: +#line 1865 "asn1p_y.y" { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); @@ -3195,61 +3253,61 @@ case 239: yyval.tv_str[l1 + 1 + l3] = '\0'; ; break;} -case 240: -#line 1849 "asn1p_y.y" +case 244: +#line 1883 "asn1p_y.y" { yyval.a_marker.flags = EM_NOMARK; yyval.a_marker.default_value = 0; ; break;} -case 241: -#line 1853 "asn1p_y.y" +case 245: +#line 1887 "asn1p_y.y" { yyval.a_marker = yyvsp[0].a_marker; ; break;} -case 242: -#line 1857 "asn1p_y.y" +case 246: +#line 1891 "asn1p_y.y" { yyval.a_marker.flags = EM_OPTIONAL; yyval.a_marker.default_value = 0; ; break;} -case 243: -#line 1861 "asn1p_y.y" +case 247: +#line 1895 "asn1p_y.y" { yyval.a_marker.flags = EM_DEFAULT; yyval.a_marker.default_value = yyvsp[0].a_value; ; break;} -case 244: -#line 1884 "asn1p_y.y" +case 248: +#line 1918 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); ; break;} -case 245: -#line 1888 "asn1p_y.y" +case 249: +#line 1922 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; ; break;} -case 246: -#line 1894 "asn1p_y.y" +case 250: +#line 1928 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 247: -#line 1899 "asn1p_y.y" +case 251: +#line 1933 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 248: -#line 1906 "asn1p_y.y" +case 252: +#line 1940 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3258,8 +3316,8 @@ case 248: yyval.a_expr->Identifier = yyvsp[0].tv_str; ; break;} -case 249: -#line 1913 "asn1p_y.y" +case 253: +#line 1947 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3269,8 +3327,8 @@ case 249: yyval.a_expr->value = yyvsp[-1].a_value; ; break;} -case 250: -#line 1921 "asn1p_y.y" +case 254: +#line 1955 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3280,8 +3338,8 @@ case 250: yyval.a_expr->value = yyvsp[-1].a_value; ; break;} -case 251: -#line 1929 "asn1p_y.y" +case 255: +#line 1963 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3290,8 +3348,8 @@ case 251: yyval.a_expr->value = yyvsp[0].a_value; ; break;} -case 252: -#line 1936 "asn1p_y.y" +case 256: +#line 1970 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3301,103 +3359,103 @@ case 252: yyval.a_expr->meta_type = AMT_VALUE; ; break;} -case 253: -#line 1947 "asn1p_y.y" +case 257: +#line 1981 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} -case 254: -#line 1951 "asn1p_y.y" +case 258: +#line 1985 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} -case 255: -#line 1982 "asn1p_y.y" +case 259: +#line 2016 "asn1p_y.y" { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; break;} -case 256: -#line 1983 "asn1p_y.y" +case 260: +#line 2017 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; ; break;} -case 257: -#line 1987 "asn1p_y.y" +case 261: +#line 2021 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = yyvsp[0].a_tag.tag_mode; ; break;} -case 258: -#line 1994 "asn1p_y.y" +case 262: +#line 2028 "asn1p_y.y" { yyval.a_tag = yyvsp[-2].a_tag; yyval.a_tag.tag_value = yyvsp[-1].a_int; ; break;} -case 259: -#line 2000 "asn1p_y.y" +case 263: +#line 2034 "asn1p_y.y" { yyval.a_tag.tag_class = TC_CONTEXT_SPECIFIC; ; break;} -case 260: -#line 2001 "asn1p_y.y" +case 264: +#line 2035 "asn1p_y.y" { yyval.a_tag.tag_class = TC_UNIVERSAL; ; break;} -case 261: -#line 2002 "asn1p_y.y" +case 265: +#line 2036 "asn1p_y.y" { yyval.a_tag.tag_class = TC_APPLICATION; ; break;} -case 262: -#line 2003 "asn1p_y.y" +case 266: +#line 2037 "asn1p_y.y" { yyval.a_tag.tag_class = TC_PRIVATE; ; break;} -case 263: -#line 2007 "asn1p_y.y" +case 267: +#line 2041 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_DEFAULT; ; break;} -case 264: -#line 2008 "asn1p_y.y" +case 268: +#line 2042 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_IMPLICIT; ; break;} -case 265: -#line 2009 "asn1p_y.y" +case 269: +#line 2043 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_EXPLICIT; ; break;} -case 266: -#line 2013 "asn1p_y.y" +case 270: +#line 2047 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 267: -#line 2017 "asn1p_y.y" +case 271: +#line 2051 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 268: -#line 2025 "asn1p_y.y" +case 272: +#line 2059 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 269: -#line 2032 "asn1p_y.y" +case 273: +#line 2066 "asn1p_y.y" { yyval.tv_str = 0; ; break;} -case 270: -#line 2033 "asn1p_y.y" +case 274: +#line 2067 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 271: -#line 2038 "asn1p_y.y" +case 275: +#line 2072 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; @@ -3625,7 +3683,7 @@ case 271: } return 1; } -#line 2044 "asn1p_y.y" +#line 2078 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index f9c7ed4fb..b6be6f6f6 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -286,6 +286,7 @@ static asn1p_value_t * %type ContainedSubtype %type ConstraintSpec %type ConstraintRangeSpec +%type RestrictedCharacterStringValue %type optWithSyntax %type WithSyntax %type WithSyntaxFormat @@ -1346,9 +1347,8 @@ Value: $$ = _convert_bitstring2binary($1, 'H'); checkmem($$); } - | TOK_cstring { - $$ = asn1p_value_frombuf($1.buf, $1.len, 0); - checkmem($$); + | RestrictedCharacterStringValue { + $$ = $$; } | SignedNumber { $$ = $1; @@ -1386,6 +1386,38 @@ DefinedValue: } ; + +RestrictedCharacterStringValue: + TOK_cstring { + $$ = asn1p_value_frombuf($1.buf, $1.len, 0); + checkmem($$); + } + | '{' TOK_number ',' TOK_number '}' { + asn1c_integer_t v = ($2 << 4) + $4; + if($2 > 7) return yyerror("X.680:2003, #37.14 " + "mandates 0..7 range for Tuple's TableColumn"); + if($4 > 15) return yyerror("X.680:2003, #37.14 " + "mandates 0..15 range for Tuple's TableRow"); + $$ = asn1p_value_fromint(v); + checkmem($$); + $$->type = ATV_TUPLE; + } + | '{' TOK_number ',' TOK_number ',' TOK_number ',' TOK_number '}' { + asn1c_integer_t v = ($2 << 24) | ($4 << 16) | ($6 << 8) | $8; + if($2 > 127) return yyerror("X.680:2003, #37.12 " + "mandates 0..127 range for Quadruple's Group"); + if($4 > 255) return yyerror("X.680:2003, #37.12 " + "mandates 0..255 range for Quadruple's Plane"); + if($6 > 255) return yyerror("X.680:2003, #37.12 " + "mandates 0..255 range for Quadruple's Row"); + if($8 > 255) return yyerror("X.680:2003, #37.12 " + "mandates 0..255 range for Quadruple's Cell"); + $$ = asn1p_value_fromint(v); + checkmem($$); + $$->type = ATV_QUADRUPLE; + } + ; + Opaque: TOK_opaque { $$.len = $1.len + 1; @@ -1544,6 +1576,9 @@ ElementSetSpec: ConstraintSubtypeElement { $$ = $1; } + | TOK_ALL TOK_EXCEPT ConstraintSubtypeElement { + CONSTRAINT_INSERT($$, ACT_CA_AEX, $3, 0); + } | ElementSetSpec Union ConstraintSubtypeElement { CONSTRAINT_INSERT($$, ACT_CA_UNI, $1, $3); } @@ -1663,9 +1698,8 @@ SingleValue: | SignedNumber { $$ = $1; } - | TOK_cstring { - $$ = asn1p_value_frombuf($1.buf, $1.len, 0); - checkmem($$); + | RestrictedCharacterStringValue { + $$ = $1; } | Identifier { asn1p_ref_t *ref; diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index db9f10617..ecb91f095 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -215,6 +215,19 @@ asn1print_value(asn1p_value_t *val, enum asn1print_flags flags) { case ATV_MAX: printf("MAX"); return 0; case ATV_FALSE: printf("FALSE"); return 0; case ATV_TRUE: printf("TRUE"); return 0; + case ATV_TUPLE: + printf("{%d, %d}", + (int)(val->value.v_integer >> 4), + (int)(val->value.v_integer & 0x0f)); + return 0; + case ATV_QUADRUPLE: + printf("{%d, %d, %d, %d}", + (int)((val->value.v_integer >> 24) & 0xff), + (int)((val->value.v_integer >> 16) & 0xff), + (int)((val->value.v_integer >> 8) & 0xff), + (int)((val->value.v_integer >> 0) & 0xff) + ); + return 0; case ATV_STRING: { char *p = val->value.string.buf; @@ -339,10 +352,9 @@ asn1print_constraint(asn1p_constraint_t *ct, enum asn1print_flags flags) { "", "(" }; unsigned int i; for(i = 0; i < ct->el_count; i++) { - enum asn1print_flags nflags = flags; if(i) fputs(symtable[symno], stdout); if(ct->type == ACT_CA_CRC) fputs("{", stdout); - asn1print_constraint(ct->elements[i], nflags); + asn1print_constraint(ct->elements[i], flags); if(ct->type == ACT_CA_CRC) fputs("}", stdout); if(i+1 < ct->el_count && ct->type == ACT_CA_SET) @@ -350,6 +362,11 @@ asn1print_constraint(asn1p_constraint_t *ct, enum asn1print_flags flags) { } } break; + case ACT_CA_AEX: + assert(ct->el_count == 1); + printf("ALL EXCEPT "); + asn1print_constraint(ct->elements[0], flags); + break; case ACT_INVALID: assert(ct->type != ACT_INVALID); break; diff --git a/tests/80-chardefs-OK.asn1 b/tests/80-chardefs-OK.asn1 new file mode 100644 index 000000000..52b0eda3e --- /dev/null +++ b/tests/80-chardefs-OK.asn1 @@ -0,0 +1,25 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .80 + +ModuleCharacterDefinitions + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 80 } + DEFINITIONS ::= +BEGIN + -- Elements taken from ASN1-CHARACTER-MODULE (X.680:07/2002) + -- { joint-iso-itu-t asn1(1) specification(0) modules(0) iso10646(0) } + nul IA5String ::= {0, 0} + null BMPString ::= {0, 0, 0, 0} + space BMPString ::= {0, 0, 0, 32} + tilde BMPString ::= {0, 0, 0, 126} + + BasicLatin ::= BMPString(FROM (space..tilde)) + BasicGreek ::= BMPString(FROM ({0, 0, 3, 112}..{0, 0, 3, 207})) + + NotSpace ::= BMPString (FROM(ALL EXCEPT space)) + +END From 700d29f2e74a8f59b2993294389449b4a3174d6c Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 24 Mar 2005 14:29:35 +0000 Subject: [PATCH 0831/1469] AEX git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@831 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_constr.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libasn1parser/asn1p_constr.c b/libasn1parser/asn1p_constr.c index 9e5e6e6a3..bce4272f2 100644 --- a/libasn1parser/asn1p_constr.c +++ b/libasn1parser/asn1p_constr.c @@ -151,6 +151,8 @@ asn1p_constraint_type2str(enum asn1p_constraint_type_e type) { return "INTERSECTION"; case ACT_CA_EXC: return "EXCEPT"; + case ACT_CA_AEX: + return "ALL EXCEPT"; } return "UNKNOWN"; } From 5e79ae6de6d77dfc2edd778d5daf4987d86e82da Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 24 Mar 2005 14:40:05 +0000 Subject: [PATCH 0832/1469] all except git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@832 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_constraint_compat.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libasn1fix/asn1fix_constraint_compat.c b/libasn1fix/asn1fix_constraint_compat.c index a0e290bd8..676717e1b 100644 --- a/libasn1fix/asn1fix_constraint_compat.c +++ b/libasn1fix/asn1fix_constraint_compat.c @@ -85,6 +85,7 @@ asn1constraint_compatible(asn1p_expr_type_e expr_type, case ACT_CA_UNI: case ACT_CA_INT: case ACT_CA_EXC: + case ACT_CA_AEX: return 1; } From 3fd792cb63d813fd6cecc60ecf8c914e049a7fff Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 24 Mar 2005 14:40:22 +0000 Subject: [PATCH 0833/1469] printing charsdefn values git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@833 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_misc.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/libasn1fix/asn1fix_misc.c b/libasn1fix/asn1fix_misc.c index 15a168606..b82afaee7 100644 --- a/libasn1fix/asn1fix_misc.c +++ b/libasn1fix/asn1fix_misc.c @@ -60,6 +60,22 @@ asn1f_printable_value(asn1p_value_t *v) { case ATV_MAX: return "MAX"; case ATV_FALSE: return "FALSE"; case ATV_TRUE: return "TRUE"; + case ATV_TUPLE: + ret = snprintf(buf, sizeof(buf), "{%d, %d}", + (int)(v->value.v_integer >> 4), + (int)(v->value.v_integer & 0xff)); + if(ret >= (ssize_t)sizeof(buf)) + memcpy(buf + sizeof(buf) - 4, "...", 4); + return buf; + case ATV_QUADRUPLE: + ret = snprintf(buf, sizeof(buf), "{%d, %d, %d, %d}", + (int)((v->value.v_integer >> 24) & 0xff), + (int)((v->value.v_integer >> 16) & 0xff), + (int)((v->value.v_integer >> 8) & 0xff), + (int)(v->value.v_integer & 0xff)); + if(ret >= (ssize_t)sizeof(buf)) + memcpy(buf + sizeof(buf) - 4, "...", 4); + return buf; case ATV_STRING: case ATV_UNPARSED: /* Buffer is guaranteed to be null-terminated */ From 2c8c44d4819f7bfecd270295d88daa418940540e Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 24 Mar 2005 16:22:35 +0000 Subject: [PATCH 0834/1469] reverting to a much more simplistic parsing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@834 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/asn1c.c | 2 +- libasn1parser/asn1p_l.c | 2822 ++++++++++++++++++++------------------- libasn1parser/asn1p_l.l | 101 +- libasn1parser/asn1p_y.c | 1664 ++++++++++++----------- libasn1parser/asn1p_y.h | 184 +-- libasn1parser/asn1p_y.y | 16 +- 6 files changed, 2501 insertions(+), 2288 deletions(-) diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index cf951af15..9340c7012 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -282,7 +282,7 @@ main(int ac, char **av) { exit(EX_SOFTWARE); } - return 0; + return 2; } /* diff --git a/libasn1parser/asn1p_l.c b/libasn1parser/asn1p_l.c index 9e33d8f10..858ee6aa9 100644 --- a/libasn1parser/asn1p_l.c +++ b/libasn1parser/asn1p_l.c @@ -312,226 +312,227 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 129 -#define YY_END_OF_BUFFER 130 -static yyconst short int yy_acclist[1261] = +#define YY_NUM_RULES 130 +#define YY_END_OF_BUFFER 131 +static yyconst short int yy_acclist[1259] = { 0, - 130, 128, 129, 121, 128, 129, 121, 129, 122, 128, - 129, 15, 128, 129, 122, 128, 129, 128, 129, 122, - 128, 129, 128, 129, 122, 128, 129, 128, 129, 29, - 128, 129, 28, 128, 129, 122, 128, 129, 128, 129, - 116, 117, 128, 129, 116, 117, 128, 129, 116, 117, - 128, 129, 116, 117, 128, 129, 116, 117, 128, 129, - 116, 117, 128, 129, 116, 117, 128, 129, 116, 117, - 128, 129, 116, 117, 128, 129, 116, 117, 128, 129, - 116, 117, 128, 129, 116, 117, 128, 129, 116, 117, - 128, 129, 116, 117, 128, 129, 116, 117, 128, 129, - - 116, 117, 128, 129, 116, 117, 128, 129, 116, 117, - 128, 129, 116, 117, 128, 129, 127, 128, 129, 115, - 128, 129, 122, 127, 128, 129, 5, 128, 129, 2, - 129, 2, 128, 129, 4, 128, 129, 7, 9, 128, - 129, 7, 129, 9, 128, 129, 9, 128, 129, 17, - 128, 129, 17, 129, 18, 128, 129, 12, 128, 129, - 12, 129, 14, 128, 129, 14, 128, 129, 10, 128, - 129, 11, 128, 129, 21, 23, 128, 129, 23, 128, - 129, 24, 129, 21, 22, 23, 128, 129, 21, 22, - 23, 128, 129, 124, 128, 129, 125, 128, 129, 125, - - 129, 128, 129, 126, 128, 129, 121, 15, 15, 113, - 114, 1, 27, 120, 6, 28, 116, 117, 116, 117, - 116, 117, 116, 117, 116, 117, 116, 117, 117, 116, - 117, 116, 117, 116, 117, 116, 117, 39, 116, 117, + 131, 129, 130, 124, 129, 130, 124, 130, 127, 129, + 130, 15, 129, 130, 127, 129, 130, 129, 130, 127, + 129, 130, 129, 130, 127, 129, 130, 129, 130, 29, + 129, 130, 28, 129, 130, 127, 129, 130, 129, 130, + 116, 117, 129, 130, 116, 117, 129, 130, 116, 117, + 129, 130, 116, 117, 129, 130, 116, 117, 129, 130, + 116, 117, 129, 130, 116, 117, 129, 130, 116, 117, + 129, 130, 116, 117, 129, 130, 116, 117, 129, 130, + 116, 117, 129, 130, 116, 117, 129, 130, 116, 117, + 129, 130, 116, 117, 129, 130, 116, 117, 129, 130, + + 116, 117, 129, 130, 116, 117, 129, 130, 116, 117, + 129, 130, 116, 117, 129, 130, 115, 129, 130, 127, + 129, 130, 5, 129, 130, 2, 130, 2, 129, 130, + 4, 129, 130, 7, 9, 129, 130, 7, 130, 9, + 129, 130, 9, 129, 130, 17, 129, 130, 17, 130, + 18, 129, 130, 12, 129, 130, 12, 130, 14, 129, + 130, 14, 129, 130, 10, 129, 130, 11, 129, 130, + 21, 23, 129, 130, 23, 129, 130, 24, 130, 21, + 22, 23, 129, 130, 21, 22, 23, 129, 130, 121, + 129, 130, 122, 129, 130, 122, 130, 129, 130, 123, + + 129, 130, 124, 15, 15, 113, 114, 1, 27, 120, + 6, 28, 116, 117, 116, 117, 116, 117, 116, 117, + 116, 117, 116, 117, 117, 116, 117, 116, 117, 116, + 117, 116, 117, 39, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, - 116, 117, 116, 117, 116, 117, 116, 117, 117, 117, + 116, 117, 116, 117, 117, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, - 116, 117, 116, 117, 116, 117, 117, 116, 117, 116, - 117, 84, 116, 117, 116, 117, 117, 116, 117, 116, - 117, 116, 117, 116, 117, 117, 116, 117, 116, 117, + 116, 117, 117, 116, 117, 116, 117, 84, 116, 117, + 116, 117, 117, 116, 117, 116, 117, 116, 117, 116, + 117, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, - 116, 117, 116, 117, 117, 116, 117, 116, 117, 117, - 117, 116, 117, 115, 5, 3, 8, 17, 16, 12, - 21, 21, 22, 21, 22, 124, 125, 123, 113, 114, - 27, 119, 118, 116, 117, 31, 116, 117, 32, 116, - 117, 116, 117, 116, 117, 116, 117, 36, 116, 117, + 117, 116, 117, 116, 117, 117, 117, 116, 117, 115, + 5, 3, 8, 17, 16, 12, 21, 21, 22, 21, + 22, 121, 122, 128, 113, 114, 27, 119, 118, 116, + 117, 31, 116, 117, 32, 116, 117, 116, 117, 116, + 117, 116, 117, 36, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, - 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, - 53, 116, 117, 116, 117, 116, 117, 116, 117, 116, - 117, 116, 117, 116, 117, 117, 117, 116, 117, 116, - + 116, 117, 116, 117, 116, 117, 53, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, - 117, 76, 116, 117, 77, 116, 117, 116, 117, 117, - 116, 117, 116, 117, 116, 117, 117, 116, 117, 87, + 117, 117, 117, 116, 117, 116, 117, 116, 117, 116, + + 117, 116, 117, 116, 117, 116, 117, 76, 116, 117, + 77, 116, 117, 116, 117, 117, 116, 117, 116, 117, + 116, 117, 117, 116, 117, 87, 116, 117, 116, 117, + 116, 117, 116, 117, 117, 116, 117, 116, 117, 116, + 117, 95, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 117, 116, - 117, 116, 117, 116, 117, 95, 116, 117, 116, 117, + 117, 116, 117, 116, 117, 117, 117, 117, 116, 117, + 13, 21, 22, 20, 21, 22, 26, 25, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, - 116, 117, 117, 116, 117, 116, 117, 116, 117, 117, - 117, 117, 116, 117, 13, 21, 22, 20, 21, 22, - 26, 25, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, - 116, 117, 116, 117, 116, 117, 61, 116, 117, 117, - 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, - 117, 116, 117, 116, 117, 116, 117, 116, 117, 79, - 116, 117, 117, 116, 117, 116, 117, 116, 117, 117, - 116, 117, 116, 117, 116, 117, 116, 117, 117, 92, - 116, 117, 116, 117, 116, 117, 96, 116, 117, 116, - 117, 116, 117, 116, 117, 100, 116, 117, 102, 116, - 117, 116, 117, 117, 116, 117, 116, 117, 116, 117, - - 116, 117, 116, 117, 117, 117, 117, 112, 116, 117, - 21, 22, 116, 117, 116, 117, 116, 117, 35, 116, - 117, 117, 116, 117, 116, 117, 116, 117, 42, 116, + 116, 117, 61, 116, 117, 117, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, - 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, - 117, 116, 117, 116, 117, 116, 117, 60, 116, 117, - 117, 117, 117, 116, 117, 116, 117, 116, 117, 116, - 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, - 117, 116, 117, 117, 116, 117, 83, 116, 117, 116, - 117, 117, 116, 117, 116, 117, 116, 117, 116, 117, - - 117, 116, 117, 116, 117, 116, 117, 116, 117, 117, - 116, 117, 117, 104, 116, 117, 116, 117, 116, 117, - 117, 116, 117, 117, 117, 117, 21, 22, 30, 116, + 117, 116, 117, 116, 117, 79, 116, 117, 117, 116, 117, 116, 117, 116, 117, 117, 116, 117, 116, 117, - 41, 116, 117, 116, 117, 116, 117, 116, 117, 116, + 116, 117, 116, 117, 117, 92, 116, 117, 116, 117, + 116, 117, 96, 116, 117, 116, 117, 116, 117, 116, + 117, 100, 116, 117, 102, 116, 117, 116, 117, 117, + 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, + + 117, 117, 117, 112, 116, 117, 21, 22, 116, 117, + 116, 117, 116, 117, 35, 116, 117, 117, 116, 117, + 116, 117, 116, 117, 42, 116, 117, 116, 117, 116, + 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, - 117, 116, 117, 55, 116, 117, 116, 117, 116, 117, - 116, 117, 116, 117, 117, 117, 117, 116, 117, 116, + 117, 116, 117, 60, 116, 117, 117, 117, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 117, + 116, 117, 83, 116, 117, 116, 117, 117, 116, 117, + 116, 117, 116, 117, 116, 117, 117, 116, 117, 116, - 81, 116, 117, 116, 117, 117, 116, 117, 116, 117, - 116, 117, 116, 117, 117, 116, 117, 116, 117, 97, - 116, 117, 98, 116, 117, 117, 116, 117, 117, 105, - 116, 117, 116, 117, 117, 117, 117, 117, 117, 21, - 22, 116, 117, 116, 117, 117, 38, 116, 117, 116, - 117, 116, 117, 116, 117, 116, 117, 47, 116, 117, - 48, 116, 117, 116, 117, 116, 117, 51, 116, 117, - 116, 117, 116, 117, 116, 117, 57, 116, 117, 116, - 117, 116, 117, 117, 117, 117, 116, 117, 116, 117, - 68, 116, 117, 69, 116, 117, 116, 117, 116, 117, - - 116, 117, 73, 116, 117, 116, 117, 116, 117, 116, - 117, 117, 116, 117, 117, 86, 116, 117, 116, 117, - 89, 116, 117, 91, 116, 117, 117, 116, 117, 116, - 117, 117, 116, 117, 117, 116, 117, 108, 117, 117, - 117, 117, 117, 21, 22, 116, 117, 116, 117, 117, + 117, 116, 117, 116, 117, 117, 116, 117, 117, 104, + 116, 117, 116, 117, 116, 117, 117, 116, 117, 117, + 117, 117, 125, 21, 22, 30, 116, 117, 116, 117, + 116, 117, 117, 116, 117, 116, 117, 41, 116, 117, + 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, + 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, + 55, 116, 117, 116, 117, 116, 117, 116, 117, 116, + 117, 117, 117, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, - 50, 116, 117, 116, 117, 116, 117, 56, 116, 117, - 116, 117, 59, 116, 117, 117, 117, 117, 117, 116, - 117, 67, 116, 117, 70, 116, 117, 71, 116, 117, - 116, 117, 116, 117, 117, 116, 117, 117, 85, 116, - - 117, 117, 116, 117, 117, 116, 117, 94, 116, 117, - 117, 116, 117, 117, 116, 117, 117, 117, 117, 117, - 21, 22, 116, 117, 34, 116, 117, 37, 117, 40, - 116, 117, 43, 116, 117, 116, 117, 116, 117, 116, - 117, 116, 117, 116, 117, 116, 117, 117, 117, 117, - 65, 117, 116, 117, 116, 117, 116, 117, 117, 116, - 117, 117, 117, 116, 117, 117, 116, 117, 99, 117, - 116, 117, 117, 106, 116, 117, 117, 117, 117, 117, - 21, 116, 117, 44, 116, 117, 116, 117, 46, 116, - 117, 116, 117, 116, 117, 54, 116, 117, 116, 117, - - 117, 117, 117, 66, 116, 117, 116, 117, 116, 117, - 117, 116, 117, 117, 117, 116, 117, 117, 116, 117, - 116, 117, 117, 109, 117, 117, 117, 117, 21, 33, - 116, 117, 45, 116, 117, 49, 116, 117, 116, 117, - 116, 117, 117, 117, 117, 116, 117, 116, 117, 117, - 116, 117, 117, 117, 116, 117, 117, 116, 117, 116, - 117, 117, 117, 117, 117, 21, 116, 117, 116, 117, - 117, 117, 117, 72, 116, 117, 74, 116, 117, 75, - 117, 116, 117, 117, 117, 116, 117, 117, 93, 116, - 117, 116, 117, 117, 117, 117, 117, 21, 116, 117, - - 58, 116, 117, 63, 117, 117, 64, 117, 116, 117, - 80, 117, 117, 88, 116, 117, 117, 116, 117, 101, - 117, 117, 117, 111, 117, 21, 116, 117, 117, 78, - 116, 117, 117, 117, 116, 117, 117, 110, 117, 21, - 116, 117, 62, 117, 117, 90, 117, 103, 116, 117, - 107, 117, 21, 52, 116, 117, 82, 117, 19, 21 + 116, 117, 116, 117, 116, 117, 117, 81, 116, 117, + + 116, 117, 117, 116, 117, 116, 117, 116, 117, 116, + 117, 117, 116, 117, 116, 117, 97, 116, 117, 98, + 116, 117, 117, 116, 117, 117, 105, 116, 117, 116, + 117, 117, 117, 117, 117, 117, 21, 22, 116, 117, + 116, 117, 117, 38, 116, 117, 116, 117, 116, 117, + 116, 117, 116, 117, 47, 116, 117, 48, 116, 117, + 116, 117, 116, 117, 51, 116, 117, 116, 117, 116, + 117, 116, 117, 57, 116, 117, 116, 117, 116, 117, + 117, 117, 117, 116, 117, 116, 117, 68, 116, 117, + 69, 116, 117, 116, 117, 116, 117, 116, 117, 73, + + 116, 117, 116, 117, 116, 117, 116, 117, 117, 116, + 117, 117, 86, 116, 117, 116, 117, 89, 116, 117, + 91, 116, 117, 117, 116, 117, 116, 117, 117, 116, + 117, 117, 116, 117, 108, 117, 117, 117, 117, 117, + 21, 22, 116, 117, 116, 117, 117, 116, 117, 116, + 117, 116, 117, 116, 117, 116, 117, 50, 116, 117, + 116, 117, 116, 117, 56, 116, 117, 116, 117, 59, + 116, 117, 117, 117, 117, 117, 116, 117, 67, 116, + 117, 70, 116, 117, 71, 116, 117, 116, 117, 116, + 117, 117, 116, 117, 117, 85, 116, 117, 117, 116, + + 117, 117, 116, 117, 94, 116, 117, 117, 116, 117, + 117, 116, 117, 117, 117, 117, 117, 21, 22, 116, + 117, 34, 116, 117, 37, 117, 40, 116, 117, 43, + 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, + 116, 117, 116, 117, 117, 117, 117, 65, 117, 116, + 117, 116, 117, 116, 117, 117, 116, 117, 117, 117, + 116, 117, 117, 116, 117, 99, 117, 116, 117, 117, + 106, 116, 117, 117, 117, 117, 117, 126, 21, 116, + 117, 44, 116, 117, 116, 117, 46, 116, 117, 116, + 117, 116, 117, 54, 116, 117, 116, 117, 117, 117, + + 117, 66, 116, 117, 116, 117, 116, 117, 117, 116, + 117, 117, 117, 116, 117, 117, 116, 117, 116, 117, + 117, 109, 117, 117, 117, 117, 21, 33, 116, 117, + 45, 116, 117, 49, 116, 117, 116, 117, 116, 117, + 117, 117, 117, 116, 117, 116, 117, 117, 116, 117, + 117, 117, 116, 117, 117, 116, 117, 116, 117, 117, + 117, 117, 117, 21, 116, 117, 116, 117, 117, 117, + 117, 72, 116, 117, 74, 116, 117, 75, 117, 116, + 117, 117, 117, 116, 117, 117, 93, 116, 117, 116, + 117, 117, 117, 117, 117, 21, 116, 117, 58, 116, + + 117, 63, 117, 117, 64, 117, 116, 117, 80, 117, + 117, 88, 116, 117, 117, 116, 117, 101, 117, 117, + 117, 111, 117, 21, 116, 117, 117, 78, 116, 117, + 117, 117, 116, 117, 117, 110, 117, 21, 116, 117, + 62, 117, 117, 90, 117, 103, 116, 117, 107, 117, + 21, 52, 116, 117, 82, 117, 19, 21 } ; -static yyconst short int yy_accept[672] = +static yyconst short int yy_accept[690] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 7, 9, 12, 15, 18, 20, 23, 25, 28, 30, 33, 36, 39, 41, 45, 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, 89, 93, 97, 101, 105, 109, 113, 117, - 120, 123, 127, 130, 132, 135, 138, 142, 144, 147, - 150, 153, 155, 158, 161, 163, 166, 169, 172, 175, - 179, 182, 184, 189, 194, 197, 200, 202, 204, 207, - 207, 208, 209, 210, 210, 211, 211, 212, 212, 212, - 213, 214, 215, 216, 217, 217, 219, 221, 223, 225, - - 227, 229, 230, 232, 234, 236, 238, 241, 243, 245, - 247, 249, 251, 253, 255, 257, 259, 260, 261, 263, - 265, 267, 269, 271, 273, 275, 277, 278, 280, 282, - 285, 287, 288, 290, 292, 294, 296, 297, 299, 301, - 303, 305, 307, 309, 311, 313, 315, 316, 318, 320, - 321, 322, 324, 325, 326, 327, 328, 329, 330, 331, - 331, 332, 334, 336, 337, 338, 339, 339, 340, 341, - 341, 341, 342, 343, 344, 346, 349, 352, 354, 356, - 358, 361, 363, 365, 367, 369, 371, 373, 375, 377, - 379, 381, 384, 386, 388, 390, 392, 394, 396, 397, - - 398, 400, 402, 404, 406, 408, 410, 412, 415, 418, - 420, 421, 423, 425, 427, 428, 430, 433, 435, 437, - 439, 440, 442, 444, 446, 449, 451, 453, 455, 457, - 459, 461, 463, 464, 466, 468, 470, 471, 472, 473, - 475, 476, 478, 481, 481, 482, 483, 485, 487, 489, - 491, 493, 495, 497, 499, 501, 503, 505, 507, 509, - 511, 513, 515, 517, 519, 521, 523, 525, 527, 530, - 531, 532, 534, 536, 538, 540, 542, 544, 546, 548, - 550, 553, 554, 556, 558, 560, 561, 563, 565, 567, - 569, 570, 573, 575, 577, 580, 582, 584, 586, 589, - - 592, 594, 595, 597, 599, 601, 603, 605, 606, 607, - 608, 611, 613, 615, 617, 619, 622, 623, 625, 627, - 629, 632, 634, 636, 638, 640, 642, 644, 646, 648, - 650, 652, 654, 656, 658, 661, 662, 663, 664, 666, - 668, 670, 672, 674, 676, 678, 680, 682, 684, 685, - 687, 690, 692, 693, 695, 697, 699, 701, 702, 704, - 706, 708, 710, 711, 713, 714, 717, 719, 721, 722, - 724, 725, 726, 727, 729, 732, 734, 736, 737, 739, - 741, 744, 746, 748, 750, 752, 754, 756, 758, 760, - 762, 764, 767, 769, 771, 773, 775, 776, 777, 778, - - 780, 782, 784, 786, 788, 790, 792, 794, 796, 798, - 800, 801, 804, 806, 807, 809, 811, 813, 815, 816, - 818, 820, 823, 826, 827, 829, 830, 833, 835, 836, - 837, 838, 839, 840, 842, 844, 846, 847, 850, 852, - 854, 856, 858, 861, 864, 866, 868, 871, 873, 875, - 877, 880, 882, 884, 885, 886, 887, 889, 891, 894, - 897, 899, 901, 903, 906, 908, 910, 912, 913, 915, - 916, 919, 921, 924, 927, 928, 930, 932, 933, 935, - 936, 938, 940, 941, 942, 943, 944, 946, 948, 950, - 951, 953, 955, 957, 959, 961, 964, 966, 968, 971, - - 973, 976, 977, 978, 979, 980, 982, 985, 988, 991, - 993, 995, 996, 998, 999, 1002, 1003, 1005, 1006, 1008, - 1011, 1012, 1014, 1015, 1017, 1018, 1019, 1020, 1021, 1023, - 1025, 1028, 1030, 1033, 1036, 1038, 1040, 1042, 1044, 1046, - 1048, 1049, 1050, 1051, 1053, 1055, 1057, 1059, 1060, 1062, - 1063, 1064, 1066, 1067, 1069, 1071, 1073, 1074, 1077, 1078, - 1079, 1080, 1081, 1082, 1084, 1087, 1089, 1092, 1094, 1096, - 1099, 1101, 1102, 1103, 1104, 1107, 1109, 1111, 1112, 1114, - 1115, 1116, 1118, 1119, 1121, 1123, 1124, 1126, 1127, 1128, - 1129, 1130, 1133, 1136, 1139, 1141, 1143, 1144, 1145, 1146, - - 1148, 1150, 1151, 1153, 1154, 1155, 1157, 1158, 1160, 1162, - 1163, 1164, 1165, 1166, 1167, 1169, 1171, 1172, 1173, 1174, - 1177, 1180, 1182, 1184, 1185, 1186, 1188, 1189, 1192, 1194, - 1195, 1196, 1197, 1198, 1199, 1201, 1204, 1206, 1207, 1209, - 1211, 1213, 1214, 1217, 1218, 1220, 1222, 1223, 1224, 1226, - 1227, 1229, 1230, 1233, 1234, 1235, 1237, 1238, 1240, 1241, - 1243, 1245, 1246, 1248, 1251, 1253, 1254, 1257, 1259, 1261, - 1261 + 120, 123, 126, 128, 131, 134, 138, 140, 143, 146, + 149, 151, 154, 157, 159, 162, 165, 168, 171, 175, + 178, 180, 185, 190, 193, 196, 198, 200, 203, 203, + 204, 205, 206, 206, 207, 207, 208, 208, 208, 209, + 210, 211, 212, 213, 213, 215, 217, 219, 221, 223, + + 225, 226, 228, 230, 232, 234, 237, 239, 241, 243, + 245, 247, 249, 251, 253, 255, 256, 257, 259, 261, + 263, 265, 267, 269, 271, 273, 274, 276, 278, 281, + 283, 284, 286, 288, 290, 292, 293, 295, 297, 299, + 301, 303, 305, 307, 309, 311, 312, 314, 316, 317, + 318, 320, 321, 321, 321, 321, 322, 323, 324, 325, + 326, 327, 327, 328, 330, 332, 333, 334, 335, 335, + 336, 337, 337, 337, 338, 339, 340, 342, 345, 348, + 350, 352, 354, 357, 359, 361, 363, 365, 367, 369, + 371, 373, 375, 377, 380, 382, 384, 386, 388, 390, + + 392, 393, 394, 396, 398, 400, 402, 404, 406, 408, + 411, 414, 416, 417, 419, 421, 423, 424, 426, 429, + 431, 433, 435, 436, 438, 440, 442, 445, 447, 449, + 451, 453, 455, 457, 459, 460, 462, 464, 466, 467, + 468, 469, 471, 471, 471, 472, 474, 477, 477, 478, + 479, 481, 483, 485, 487, 489, 491, 493, 495, 497, + 499, 501, 503, 505, 507, 509, 511, 513, 515, 517, + 519, 521, 523, 526, 527, 528, 530, 532, 534, 536, + 538, 540, 542, 544, 546, 549, 550, 552, 554, 556, + 557, 559, 561, 563, 565, 566, 569, 571, 573, 576, + + 578, 580, 582, 585, 588, 590, 591, 593, 595, 597, + 599, 601, 602, 603, 604, 607, 607, 607, 607, 607, + 609, 611, 613, 615, 618, 619, 621, 623, 625, 628, + 630, 632, 634, 636, 638, 640, 642, 644, 646, 648, + 650, 652, 654, 657, 658, 659, 660, 662, 664, 666, + 668, 670, 672, 674, 676, 678, 680, 681, 683, 686, + 688, 689, 691, 693, 695, 697, 698, 700, 702, 704, + 706, 707, 709, 710, 713, 715, 717, 718, 720, 721, + 722, 723, 723, 723, 724, 726, 729, 731, 733, 734, + 736, 738, 741, 743, 745, 747, 749, 751, 753, 755, + + 757, 759, 761, 764, 766, 768, 770, 772, 773, 774, + 775, 777, 779, 781, 783, 785, 787, 789, 791, 793, + 795, 797, 798, 801, 803, 804, 806, 808, 810, 812, + 813, 815, 817, 820, 823, 824, 826, 827, 830, 832, + 833, 834, 835, 836, 837, 837, 837, 839, 841, 843, + 844, 847, 849, 851, 853, 855, 858, 861, 863, 865, + 868, 870, 872, 874, 877, 879, 881, 882, 883, 884, + 886, 888, 891, 894, 896, 898, 900, 903, 905, 907, + 909, 910, 912, 913, 916, 918, 921, 924, 925, 927, + 929, 930, 932, 933, 935, 937, 938, 939, 940, 941, + + 941, 943, 945, 947, 948, 950, 952, 954, 956, 958, + 961, 963, 965, 968, 970, 973, 974, 975, 976, 977, + 979, 982, 985, 988, 990, 992, 993, 995, 996, 999, + 1000, 1002, 1003, 1005, 1008, 1009, 1011, 1012, 1014, 1015, + 1016, 1017, 1018, 1018, 1018, 1020, 1022, 1025, 1027, 1030, + 1033, 1035, 1037, 1039, 1041, 1043, 1045, 1046, 1047, 1048, + 1050, 1052, 1054, 1056, 1057, 1059, 1060, 1061, 1063, 1064, + 1066, 1068, 1070, 1071, 1074, 1075, 1076, 1077, 1078, 1078, + 1079, 1080, 1082, 1085, 1087, 1090, 1092, 1094, 1097, 1099, + 1100, 1101, 1102, 1105, 1107, 1109, 1110, 1112, 1113, 1114, + + 1116, 1117, 1119, 1121, 1122, 1124, 1125, 1126, 1127, 1128, + 1131, 1134, 1137, 1139, 1141, 1142, 1143, 1144, 1146, 1148, + 1149, 1151, 1152, 1153, 1155, 1156, 1158, 1160, 1161, 1162, + 1163, 1164, 1165, 1167, 1169, 1170, 1171, 1172, 1175, 1178, + 1180, 1182, 1183, 1184, 1186, 1187, 1190, 1192, 1193, 1194, + 1195, 1196, 1197, 1199, 1202, 1204, 1205, 1207, 1209, 1211, + 1212, 1215, 1216, 1218, 1220, 1221, 1222, 1224, 1225, 1227, + 1228, 1231, 1232, 1233, 1235, 1236, 1238, 1239, 1241, 1243, + 1244, 1246, 1249, 1251, 1252, 1255, 1257, 1259, 1259 } ; static yyconst int yy_ec[256] = @@ -540,16 +541,16 @@ static yyconst int yy_ec[256] = 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, 6, 1, 1, 1, 7, 8, 9, - 9, 10, 1, 9, 11, 12, 13, 14, 15, 16, - 16, 17, 18, 19, 16, 20, 16, 21, 22, 23, - 24, 1, 1, 9, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 9, 1, 51, 52, 1, 1, 53, 54, 55, 56, - - 57, 58, 59, 60, 61, 62, 58, 63, 64, 65, - 66, 67, 58, 68, 69, 70, 71, 72, 58, 73, - 58, 74, 75, 76, 77, 1, 1, 1, 1, 1, + 9, 10, 1, 11, 12, 13, 14, 15, 16, 17, + 17, 18, 19, 20, 17, 21, 22, 23, 24, 25, + 26, 1, 1, 9, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 9, 1, 53, 54, 1, 1, 55, 56, 57, 58, + + 59, 60, 61, 62, 63, 64, 60, 65, 66, 67, + 68, 69, 60, 70, 71, 72, 73, 74, 60, 75, + 60, 76, 77, 78, 79, 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, 1, 1, 1, @@ -566,659 +567,696 @@ static yyconst int yy_ec[256] = 1, 1, 1, 1, 1 } ; -static yyconst int yy_meta[78] = +static yyconst int yy_meta[80] = { 0, 1, 2, 3, 3, 1, 4, 5, 6, 1, 1, - 7, 1, 1, 8, 8, 8, 8, 8, 8, 8, - 9, 1, 1, 9, 8, 8, 8, 8, 8, 8, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 1, 1, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 11, 1, 11 + 7, 8, 1, 1, 9, 9, 9, 9, 9, 9, + 9, 9, 10, 1, 1, 10, 11, 11, 11, 11, + 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 1, 1, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 13, 1, 14 } ; -static yyconst short int yy_base[689] = +static yyconst short int yy_base[709] = { 0, - 0, 0, 75, 77, 79, 80, 81, 88, 82, 92, - 169, 246, 108, 119, 797, 777, 94, 97, 775, 774, - 316, 116, 4266, 117, 767, 99, 4266, 124, 751, 4266, - 380, 173, 191, 120, 236, 254, 269, 188, 275, 430, - 431, 447, 453, 468, 474, 490, 498, 514, 515, 762, - 0, 760, 0, 4266, 4266, 756, 4266, 4266, 753, 754, - 0, 0, 757, 0, 0, 740, 4266, 4266, 4266, 0, - 4266, 4266, 575, 651, 0, 148, 151, 256, 4266, 746, - 159, 0, 745, 743, 0, 95, 0, 325, 739, 4266, - 223, 733, 4266, 550, 715, 564, 565, 580, 593, 596, - - 609, 0, 640, 643, 656, 669, 680, 696, 704, 717, - 720, 733, 748, 754, 751, 769, 673, 684, 784, 787, - 795, 810, 821, 832, 838, 849, 669, 862, 865, 878, - 886, 669, 889, 902, 913, 926, 667, 942, 948, 959, - 965, 976, 991, 992, 1007, 1008, 663, 1023, 1024, 663, - 58, 1039, 0, 0, 4266, 4266, 0, 4266, 0, 699, - 0, 681, 159, 0, 201, 4266, 706, 0, 0, 163, - 683, 1071, 4266, 4266, 1066, 1067, 1082, 1083, 1098, 1106, - 1109, 1122, 1130, 1138, 1146, 1159, 1167, 1170, 1191, 1192, - 1207, 1213, 1224, 1230, 1241, 1247, 1258, 1269, 656, 645, - - 1282, 1290, 1293, 1308, 1311, 1314, 1338, 1332, 1335, 1353, - 654, 1356, 1371, 1377, 653, 1388, 1399, 1405, 1416, 1427, - 639, 1438, 1444, 1455, 1461, 1476, 1477, 1492, 1503, 1509, - 1524, 1530, 643, 1541, 1552, 1563, 627, 641, 636, 1574, - 4266, 162, 655, 640, 4266, 4266, 1585, 1591, 1602, 1608, - 1619, 1625, 1641, 1642, 1657, 1665, 1673, 1689, 1686, 1697, - 1710, 1713, 1728, 1734, 1745, 1751, 1762, 1777, 1783, 622, - 626, 1794, 1800, 1815, 1816, 1831, 1837, 1852, 1855, 1863, - 1876, 616, 1884, 1887, 1900, 622, 1908, 1924, 1923, 1940, - 600, 1941, 1956, 1969, 1977, 1980, 1998, 1995, 2001, 2016, - - 2019, 598, 2022, 2037, 2040, 2048, 2061, 610, 599, 601, - 2072, 187, 2085, 2088, 2106, 2109, 582, 2112, 2129, 2132, - 2140, 2153, 2161, 2169, 2182, 2190, 2203, 2211, 2219, 2227, - 2242, 2248, 2259, 2265, 2280, 595, 585, 576, 2281, 2301, - 2298, 2319, 2318, 2334, 2340, 2351, 2362, 2373, 582, 2379, - 2390, 2396, 570, 2407, 2418, 2424, 2435, 586, 2448, 2451, - 2459, 2472, 569, 2483, 573, 2489, 2504, 2505, 564, 2520, - 556, 553, 558, 227, 2526, 2542, 2548, 556, 2559, 2565, - 2576, 2582, 2598, 2599, 2614, 2625, 2631, 2648, 2654, 2665, - 2671, 2682, 2688, 2699, 2705, 2721, 552, 559, 552, 2722, - - 2737, 2743, 2754, 2760, 2775, 2781, 2792, 2807, 2813, 2824, - 557, 2835, 2841, 583, 2852, 2858, 2869, 2882, 553, 2890, - 2905, 2908, 2911, 534, 2926, 521, 2929, 2932, 536, 524, - 520, 522, 521, 539, 2947, 2960, 509, 2963, 2978, 2984, - 2995, 3001, 3012, 3018, 3029, 3040, 3046, 3057, 3063, 3074, - 3085, 3091, 3102, 105, 530, 507, 3108, 3119, 3130, 3136, - 3147, 3153, 3168, 3169, 3184, 3190, 3201, 528, 3207, 505, - 3218, 3229, 3235, 3246, 498, 3252, 3267, 493, 3273, 514, - 3289, 0, 495, 496, 473, 502, 251, 3290, 3305, 485, - 3311, 3322, 3333, 3339, 3350, 3356, 3372, 3371, 3387, 3388, - - 3403, 467, 459, 461, 470, 3409, 3420, 3426, 3437, 3443, - 3454, 459, 3465, 455, 3471, 453, 3482, 463, 3493, 3499, - 458, 3510, 441, 3516, 440, 436, 453, 420, 196, 3527, - 3533, 0, 3544, 3550, 3565, 3566, 3581, 3582, 3597, 3598, - 420, 429, 416, 0, 3613, 3621, 3636, 421, 3637, 412, - 417, 3652, 422, 3660, 0, 3668, 396, 3681, 403, 418, - 390, 391, 431, 3684, 3692, 3705, 3708, 3716, 3729, 3737, - 3745, 371, 375, 343, 3753, 3761, 3769, 338, 3777, 341, - 333, 3785, 323, 3793, 3801, 331, 0, 297, 268, 274, - 295, 3809, 3817, 3825, 3833, 3841, 267, 287, 265, 3854, - - 3862, 266, 3870, 254, 256, 3878, 248, 3891, 3894, 245, - 238, 243, 237, 255, 3902, 3915, 232, 227, 228, 3918, - 3931, 0, 3939, 227, 218, 3942, 222, 3959, 3960, 218, - 210, 201, 204, 217, 3975, 3976, 0, 171, 0, 3992, - 0, 162, 3993, 154, 4010, 0, 151, 149, 0, 146, - 4018, 127, 4026, 102, 105, 4034, 86, 0, 90, 4042, - 0, 40, 0, 4055, 0, 68, 4058, 0, 0, 4266, - 4103, 4114, 4125, 4136, 4147, 4158, 4169, 4179, 4181, 4191, - 4202, 4213, 4223, 4233, 4243, 4247, 4251, 4255 + 0, 0, 77, 79, 82, 83, 81, 92, 85, 91, + 170, 249, 120, 126, 852, 843, 97, 117, 837, 835, + 321, 132, 4544, 133, 828, 94, 4544, 170, 814, 4544, + 386, 178, 193, 239, 250, 266, 277, 118, 293, 436, + 437, 453, 459, 474, 480, 497, 500, 515, 523, 0, + 569, 0, 4544, 4544, 822, 4544, 4544, 811, 814, 0, + 0, 803, 0, 0, 784, 4544, 4544, 4544, 0, 4544, + 4544, 591, 669, 0, 135, 140, 107, 4544, 800, 208, + 0, 797, 791, 0, 174, 0, 604, 784, 4544, 606, + 778, 4544, 614, 764, 609, 610, 625, 659, 626, 658, + + 0, 674, 687, 690, 698, 713, 716, 734, 731, 747, + 755, 770, 776, 773, 791, 721, 731, 802, 808, 819, + 825, 836, 847, 853, 864, 718, 877, 880, 893, 901, + 718, 904, 917, 928, 941, 717, 957, 963, 974, 980, + 991, 997, 1008, 1014, 1025, 712, 1031, 1047, 705, 32, + 1046, 0, 1093, 1105, 1117, 0, 4544, 4544, 0, 4544, + 0, 741, 0, 726, 236, 0, 234, 4544, 753, 0, + 0, 78, 730, 1083, 4544, 4544, 1112, 1113, 1128, 1129, + 1144, 1152, 1155, 1168, 1176, 1184, 1192, 1205, 1213, 1216, + 1237, 1238, 1253, 1259, 1270, 1276, 1287, 1293, 1304, 1315, + + 693, 681, 1328, 1336, 1339, 1354, 1357, 1360, 1385, 1382, + 1388, 1403, 690, 1406, 1421, 1427, 689, 1438, 1449, 1455, + 1466, 1477, 679, 1488, 1494, 1505, 1511, 1526, 1527, 1542, + 1553, 1559, 1574, 1580, 683, 1591, 1602, 1615, 661, 672, + 661, 1618, 1664, 1672, 4544, 69, 680, 666, 4544, 4544, + 1631, 1667, 1673, 1688, 1689, 1706, 1705, 1722, 1728, 1739, + 1750, 1766, 1763, 1774, 1787, 1790, 1805, 1811, 1822, 1828, + 1839, 1854, 1860, 647, 651, 1871, 1877, 1892, 1893, 1908, + 1914, 1929, 1942, 1950, 1958, 641, 1973, 1976, 1989, 651, + 1997, 2012, 2015, 2033, 631, 2030, 2036, 2053, 2059, 2070, + + 2076, 2087, 2093, 2104, 2110, 619, 2125, 2126, 2143, 2142, + 2159, 631, 621, 632, 2160, 2206, 824, 2214, 2226, 86, + 2211, 2226, 2232, 2243, 615, 2249, 2264, 2267, 2275, 2288, + 2296, 2304, 2317, 2325, 2338, 2346, 2354, 2362, 2377, 2383, + 2394, 2400, 2415, 629, 608, 592, 2416, 2436, 2433, 2454, + 2453, 2469, 2475, 2486, 2492, 2507, 598, 2510, 2513, 2530, + 588, 2531, 2546, 2552, 2563, 604, 2576, 2579, 2587, 2600, + 588, 2611, 587, 2617, 2632, 2633, 577, 2648, 572, 569, + 575, 239, 2681, 4544, 78, 2666, 2683, 2686, 576, 2689, + 2706, 2707, 2727, 2733, 2744, 2750, 2765, 2771, 2788, 2794, + + 2805, 2811, 2822, 2828, 2839, 2845, 2861, 553, 556, 548, + 2862, 2877, 2883, 2894, 2900, 2915, 2921, 2932, 2947, 2953, + 2964, 553, 2975, 2981, 565, 2992, 2998, 3009, 3022, 538, + 3030, 3045, 3048, 3051, 530, 3066, 508, 3069, 3072, 523, + 511, 509, 520, 518, 3118, 3130, 536, 3115, 3128, 508, + 3131, 3146, 3152, 3163, 3169, 3180, 3186, 3197, 3208, 3214, + 3225, 3231, 3242, 3253, 3259, 3270, 159, 529, 502, 3276, + 3287, 3298, 3304, 3315, 3321, 3336, 3337, 3352, 3358, 3369, + 523, 3375, 507, 3386, 3397, 3403, 3414, 499, 3420, 3435, + 493, 3441, 514, 3457, 0, 491, 497, 475, 504, 3490, + + 126, 3485, 3486, 475, 3501, 3509, 3512, 3525, 3533, 3541, + 3554, 3562, 3570, 3578, 3586, 458, 447, 447, 452, 3599, + 3607, 3610, 3623, 3631, 3634, 437, 3647, 432, 3655, 427, + 3663, 437, 3676, 3679, 433, 3687, 420, 3700, 423, 423, + 435, 401, 3733, 466, 190, 3718, 3729, 0, 3735, 3746, + 3752, 3767, 3768, 3783, 3789, 3800, 402, 408, 396, 0, + 3806, 3817, 3828, 377, 3834, 369, 355, 3845, 366, 3856, + 0, 3862, 340, 3873, 348, 355, 327, 304, 530, 4544, + 317, 3879, 3890, 3901, 3907, 3918, 3929, 3940, 3946, 281, + 285, 279, 3957, 3963, 3974, 274, 3980, 276, 267, 3991, + + 262, 3997, 4008, 267, 0, 253, 252, 253, 273, 4014, + 4025, 4031, 4042, 4048, 245, 265, 242, 4059, 4065, 246, + 4080, 234, 236, 4083, 228, 4086, 4103, 229, 225, 228, + 220, 245, 4106, 4109, 223, 220, 221, 4126, 4127, 0, + 4142, 210, 200, 4143, 205, 4158, 4164, 203, 183, 178, + 183, 193, 4175, 4186, 0, 166, 0, 4192, 0, 154, + 4207, 148, 4210, 0, 147, 147, 0, 163, 4218, 141, + 4233, 101, 106, 4234, 102, 0, 116, 4249, 0, 62, + 0, 4255, 0, 69, 4266, 0, 0, 4544, 4313, 4327, + 4341, 4355, 4369, 4383, 4397, 4410, 4414, 4426, 4440, 4454, + + 4466, 4478, 4490, 4495, 4500, 4505, 4516, 4529 } ; -static yyconst short int yy_def[689] = +static yyconst short int yy_def[709] = { 0, - 670, 1, 671, 671, 672, 672, 673, 673, 674, 674, - 675, 675, 676, 676, 670, 670, 670, 670, 670, 677, - 670, 678, 670, 670, 670, 670, 670, 670, 670, 670, - 670, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 670, - 679, 670, 680, 670, 670, 670, 670, 670, 670, 670, - 681, 681, 670, 682, 682, 670, 670, 670, 670, 683, - 670, 670, 684, 684, 685, 670, 670, 21, 670, 670, - 670, 677, 677, 670, 686, 670, 687, 678, 678, 670, - 670, 670, 670, 670, 670, 31, 31, 31, 31, 31, - - 31, 688, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 688, 688, 31, 31, - 31, 31, 31, 31, 31, 31, 688, 31, 31, 31, - 31, 688, 31, 31, 31, 31, 688, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 688, 31, 31, 688, - 688, 31, 679, 680, 670, 670, 681, 670, 682, 670, - 683, 74, 74, 685, 670, 670, 670, 686, 687, 670, - 670, 670, 670, 670, 31, 31, 31, 31, 31, 31, + 688, 1, 689, 689, 690, 690, 691, 691, 692, 692, + 693, 693, 694, 694, 688, 688, 688, 688, 688, 695, + 688, 696, 688, 688, 688, 688, 688, 688, 688, 688, + 688, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 697, + 688, 698, 688, 688, 688, 688, 688, 688, 688, 699, + 699, 688, 700, 700, 688, 688, 688, 688, 701, 688, + 688, 702, 702, 703, 688, 688, 21, 688, 688, 688, + 695, 695, 688, 704, 688, 705, 696, 696, 688, 688, + 688, 688, 688, 688, 31, 31, 31, 31, 31, 31, + + 706, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 706, 706, 31, 31, 31, + 31, 31, 31, 31, 31, 706, 31, 31, 31, 31, + 706, 31, 31, 31, 31, 706, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 706, 31, 31, 706, 706, + 31, 697, 688, 688, 688, 698, 688, 688, 699, 688, + 700, 688, 701, 73, 73, 703, 688, 688, 688, 704, + 705, 688, 688, 688, 688, 688, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 688, 688, + 706, 706, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 706, 31, 31, 31, 706, 31, 31, 31, + 31, 31, 706, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 706, 31, 31, 31, 706, 706, + 706, 31, 688, 688, 688, 73, 73, 688, 688, 688, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 688, 31, 31, 31, 688, 31, 31, 31, 31, 31, - 688, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 688, 31, 31, 31, 688, 688, 688, 31, - 670, 74, 74, 670, 670, 670, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 688, - 688, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 688, 31, 31, 31, 688, 31, 31, 31, 31, - 688, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 706, 706, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 706, 31, 31, 31, 706, + 31, 31, 31, 31, 706, 31, 31, 31, 31, 31, - 31, 688, 31, 31, 31, 31, 31, 688, 688, 688, - 31, 74, 31, 31, 31, 31, 688, 31, 31, 31, + 31, 31, 31, 31, 31, 706, 31, 31, 31, 31, + 31, 706, 706, 706, 31, 688, 707, 688, 688, 73, + 31, 31, 31, 31, 706, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 688, 688, 688, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 688, 31, - 31, 31, 688, 31, 31, 31, 31, 688, 31, 31, - 31, 31, 688, 31, 688, 31, 31, 31, 688, 31, - 688, 688, 688, 74, 31, 31, 31, 688, 31, 31, + 31, 31, 31, 706, 706, 706, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 706, 31, 31, 31, + 706, 31, 31, 31, 31, 706, 31, 31, 31, 31, + 706, 31, 706, 31, 31, 31, 706, 31, 706, 706, + 706, 688, 688, 688, 73, 31, 31, 31, 706, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 688, 688, 688, 31, + 31, 31, 31, 31, 31, 31, 31, 706, 706, 706, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 688, 31, 31, 688, 31, 31, 31, 31, 688, 31, - 31, 31, 31, 688, 31, 688, 31, 31, 688, 688, - 688, 688, 688, 74, 31, 31, 688, 31, 31, 31, + 31, 706, 31, 31, 706, 31, 31, 31, 31, 706, + 31, 31, 31, 31, 706, 31, 706, 31, 31, 706, + 706, 706, 706, 706, 688, 688, 73, 31, 31, 706, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 688, 688, 688, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 688, 31, 688, - 31, 31, 31, 31, 688, 31, 31, 688, 31, 688, - 31, 688, 688, 688, 688, 688, 74, 31, 31, 688, + 31, 31, 31, 31, 31, 31, 706, 706, 706, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - - 31, 688, 688, 688, 688, 31, 31, 31, 31, 31, - 31, 688, 31, 688, 31, 688, 31, 688, 31, 31, - 688, 31, 688, 31, 688, 688, 688, 688, 74, 31, - 31, 688, 31, 31, 31, 31, 31, 31, 31, 31, - 688, 688, 688, 688, 31, 31, 31, 688, 31, 688, - 688, 31, 688, 31, 688, 31, 688, 31, 688, 688, - 688, 688, 683, 31, 31, 31, 31, 31, 31, 31, - 31, 688, 688, 688, 31, 31, 31, 688, 31, 688, - 688, 31, 688, 31, 31, 688, 688, 688, 688, 688, - 683, 31, 31, 31, 31, 31, 688, 688, 688, 31, - - 31, 688, 31, 688, 688, 31, 688, 31, 31, 688, - 688, 688, 688, 683, 31, 31, 688, 688, 688, 31, - 31, 688, 31, 688, 688, 31, 688, 31, 31, 688, - 688, 688, 688, 683, 31, 31, 688, 688, 688, 31, - 688, 688, 31, 688, 31, 688, 688, 688, 688, 683, - 31, 688, 31, 688, 688, 31, 688, 688, 683, 31, - 688, 688, 688, 31, 688, 683, 31, 688, 683, 0, - 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, - 670, 670, 670, 670, 670, 670, 670, 670 + 706, 31, 706, 31, 31, 31, 31, 706, 31, 31, + 706, 31, 706, 31, 706, 706, 706, 706, 706, 688, + + 73, 31, 31, 706, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 706, 706, 706, 706, 31, + 31, 31, 31, 31, 31, 706, 31, 706, 31, 706, + 31, 706, 31, 31, 706, 31, 706, 31, 706, 706, + 706, 706, 688, 708, 73, 31, 31, 706, 31, 31, + 31, 31, 31, 31, 31, 31, 706, 706, 706, 706, + 31, 31, 31, 706, 31, 706, 706, 31, 706, 31, + 706, 31, 706, 31, 706, 706, 706, 706, 688, 688, + 701, 31, 31, 31, 31, 31, 31, 31, 31, 706, + 706, 706, 31, 31, 31, 706, 31, 706, 706, 31, + + 706, 31, 31, 706, 706, 706, 706, 706, 701, 31, + 31, 31, 31, 31, 706, 706, 706, 31, 31, 706, + 31, 706, 706, 31, 706, 31, 31, 706, 706, 706, + 706, 701, 31, 31, 706, 706, 706, 31, 31, 706, + 31, 706, 706, 31, 706, 31, 31, 706, 706, 706, + 706, 701, 31, 31, 706, 706, 706, 31, 706, 706, + 31, 706, 31, 706, 706, 706, 706, 701, 31, 706, + 31, 706, 706, 31, 706, 706, 701, 31, 706, 706, + 706, 31, 706, 701, 31, 706, 701, 0, 688, 688, + 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, + + 688, 688, 688, 688, 688, 688, 688, 688 } ; -static yyconst short int yy_nxt[4344] = +static yyconst short int yy_nxt[4624] = { 0, 16, 17, 18, 17, 19, 20, 21, 22, 23, 16, - 24, 25, 26, 27, 28, 28, 28, 28, 28, 28, - 29, 19, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 38, 38, 38, 40, 41, 42, 43, - 38, 44, 45, 46, 47, 48, 49, 38, 38, 38, - 19, 50, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 23, 52, 23, 54, 55, 54, - 55, 58, 58, 62, 65, 56, 63, 56, 59, 59, - 62, 60, 60, 63, 65, 81, 81, 81, 81, 81, - - 81, 80, 66, 669, 80, 67, 80, 668, 93, 76, - 77, 76, 66, 238, 78, 67, 84, 88, 88, 88, - 76, 77, 76, 80, 80, 78, 239, 90, 666, 88, - 88, 91, 91, 91, 91, 91, 91, 94, 94, 94, - 94, 94, 94, 94, 665, 96, 86, 502, 111, 165, - 165, 165, 165, 165, 165, 96, 68, 96, 69, 96, - 81, 81, 81, 663, 96, 503, 68, 662, 69, 70, - 71, 72, 71, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 30, 661, 79, 242, 243, 659, 245, 70, - 70, 70, 70, 30, 246, 79, 162, 74, 96, 162, - - 312, 103, 165, 165, 165, 104, 563, 658, 96, 105, - 96, 106, 96, 96, 374, 657, 96, 96, 655, 70, - 70, 107, 108, 96, 162, 96, 109, 96, 96, 110, - 96, 654, 96, 162, 652, 96, 172, 172, 172, 172, - 172, 172, 172, 71, 70, 71, 70, 71, 72, 71, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 434, - 650, 96, 649, 670, 162, 648, 70, 70, 70, 70, - 647, 96, 112, 113, 74, 96, 646, 670, 115, 96, - 96, 529, 644, 114, 642, 641, 639, 638, 162, 96, - 637, 96, 634, 96, 96, 116, 70, 70, 96, 119, - - 96, 633, 120, 632, 96, 631, 96, 670, 96, 630, - 96, 121, 122, 96, 96, 627, 625, 123, 624, 96, - 71, 70, 71, 80, 622, 117, 88, 88, 88, 619, - 618, 617, 170, 614, 613, 612, 118, 84, 88, 88, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 611, 86, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 96, 610, 607, 96, 96, 96, 96, 96, 96, 96, - - 605, 604, 602, 599, 96, 97, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 98, 96, 99, 96, 100, - 96, 96, 96, 96, 101, 96, 96, 96, 96, 96, - 598, 597, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 124, 96, 96, 591, 590, 589, - 588, 587, 125, 586, 583, 96, 96, 96, 96, 96, - 96, 581, 128, 129, 96, 126, 130, 133, 96, 580, - 134, 578, 96, 574, 96, 573, 131, 572, 135, 562, - 96, 96, 96, 96, 136, 561, 138, 96, 560, 96, - - 132, 127, 139, 96, 559, 96, 140, 96, 143, 96, - 557, 96, 96, 96, 144, 96, 555, 141, 96, 553, - 137, 551, 142, 96, 550, 96, 548, 96, 544, 96, - 543, 145, 542, 96, 96, 148, 541, 96, 146, 96, - 96, 149, 96, 532, 528, 527, 147, 152, 526, 96, - 96, 96, 96, 96, 96, 525, 523, 521, 96, 96, - 518, 516, 150, 94, 94, 94, 94, 94, 94, 94, - 514, 505, 504, 490, 151, 161, 487, 486, 485, 161, - 161, 161, 161, 161, 161, 161, 161, 161, 484, 96, - 96, 483, 482, 480, 478, 161, 161, 161, 161, 96, - - 96, 96, 96, 96, 96, 96, 475, 175, 96, 96, - 470, 468, 456, 455, 454, 176, 437, 96, 96, 96, - 433, 96, 432, 431, 96, 161, 161, 429, 96, 426, - 96, 96, 96, 96, 96, 178, 424, 96, 419, 414, - 96, 177, 411, 399, 96, 398, 96, 397, 96, 378, - 161, 161, 179, 96, 373, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 372, 96, 371, 365, 96, 358, - 180, 161, 161, 161, 161, 96, 353, 96, 96, 96, - 96, 96, 96, 349, 96, 337, 181, 96, 163, 336, - 166, 96, 162, 96, 96, 182, 310, 309, 308, 302, - - 96, 161, 161, 291, 96, 96, 96, 183, 96, 286, - 282, 271, 270, 96, 246, 96, 244, 96, 162, 96, - 184, 96, 241, 237, 96, 233, 161, 221, 186, 96, - 215, 96, 211, 96, 185, 96, 200, 199, 174, 96, - 96, 96, 96, 96, 173, 96, 171, 167, 96, 189, - 166, 166, 96, 187, 188, 96, 96, 96, 190, 96, - 160, 96, 158, 93, 96, 156, 155, 80, 96, 80, - 96, 95, 96, 96, 191, 192, 96, 96, 92, 96, - 194, 83, 80, 96, 80, 96, 197, 96, 96, 96, - 96, 96, 193, 195, 96, 96, 670, 196, 96, 670, - - 670, 201, 670, 670, 96, 670, 96, 198, 96, 96, - 670, 670, 96, 96, 670, 202, 670, 670, 670, 96, - 96, 96, 96, 96, 96, 670, 96, 670, 96, 670, - 96, 96, 96, 670, 203, 96, 204, 670, 670, 96, - 670, 670, 670, 670, 670, 96, 96, 96, 670, 96, - 670, 670, 205, 206, 96, 670, 96, 96, 96, 207, - 96, 670, 670, 96, 670, 96, 670, 96, 670, 96, - 670, 96, 670, 96, 96, 209, 96, 96, 670, 208, - 670, 670, 96, 670, 210, 670, 96, 96, 96, 670, - 96, 670, 670, 96, 670, 212, 670, 96, 670, 96, - - 96, 96, 96, 96, 96, 670, 96, 670, 213, 96, - 670, 96, 670, 96, 96, 96, 670, 96, 670, 670, - 670, 96, 96, 96, 96, 96, 96, 96, 96, 214, - 96, 670, 216, 96, 670, 670, 670, 96, 96, 96, - 670, 96, 670, 670, 670, 670, 96, 217, 96, 670, - 96, 96, 96, 670, 219, 670, 670, 218, 220, 670, - 670, 96, 670, 96, 670, 96, 222, 96, 670, 670, - 96, 670, 670, 96, 670, 670, 670, 223, 670, 96, - 670, 96, 670, 96, 96, 96, 96, 96, 224, 670, - 96, 225, 96, 670, 96, 670, 96, 670, 96, 670, - - 96, 96, 96, 96, 96, 229, 227, 670, 226, 96, - 670, 96, 670, 228, 670, 96, 96, 96, 670, 670, - 96, 670, 230, 670, 670, 670, 96, 96, 96, 96, - 96, 96, 96, 96, 670, 96, 96, 670, 670, 670, - 670, 670, 96, 96, 96, 96, 96, 232, 96, 96, - 235, 231, 96, 236, 670, 234, 670, 670, 96, 96, - 96, 96, 96, 96, 96, 670, 670, 96, 96, 670, - 670, 670, 670, 670, 96, 670, 96, 670, 96, 670, - 670, 670, 240, 96, 172, 172, 172, 172, 172, 172, - 172, 96, 96, 670, 247, 670, 670, 670, 670, 670, - - 670, 96, 96, 96, 96, 96, 96, 96, 96, 670, - 96, 96, 670, 670, 670, 670, 670, 96, 248, 96, - 96, 96, 96, 96, 670, 670, 96, 96, 670, 670, - 670, 96, 670, 96, 96, 96, 249, 96, 250, 670, - 670, 96, 96, 96, 96, 96, 96, 96, 96, 670, - 96, 670, 670, 96, 670, 96, 670, 96, 670, 96, - 670, 96, 670, 96, 251, 252, 96, 96, 670, 96, - 670, 96, 670, 96, 96, 96, 670, 96, 254, 253, - 670, 96, 96, 96, 96, 96, 670, 670, 670, 670, - 96, 670, 96, 670, 96, 96, 96, 670, 96, 670, - - 670, 255, 96, 96, 96, 96, 256, 96, 670, 96, - 670, 96, 257, 258, 96, 259, 96, 96, 670, 670, - 261, 670, 670, 260, 670, 670, 96, 96, 96, 96, - 96, 96, 96, 670, 670, 96, 96, 670, 96, 670, - 670, 670, 96, 670, 96, 262, 96, 670, 96, 96, - 96, 96, 96, 670, 670, 96, 670, 96, 264, 96, - 263, 96, 670, 96, 670, 96, 96, 96, 96, 96, - 670, 670, 96, 670, 96, 267, 265, 670, 96, 266, - 96, 670, 96, 96, 96, 96, 96, 670, 670, 670, - 670, 96, 670, 96, 96, 96, 670, 96, 670, 670, - - 268, 670, 96, 670, 96, 269, 96, 96, 96, 670, - 670, 670, 670, 96, 670, 96, 670, 96, 96, 96, - 670, 96, 670, 670, 272, 96, 96, 273, 274, 96, - 96, 275, 96, 96, 96, 670, 96, 96, 670, 96, - 670, 670, 278, 276, 670, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 277, 96, 279, 96, 96, 670, - 96, 670, 670, 96, 670, 670, 670, 96, 670, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 280, - 670, 96, 96, 670, 283, 670, 670, 670, 281, 670, - 96, 96, 96, 96, 670, 96, 96, 96, 670, 284, - - 96, 670, 96, 670, 670, 670, 96, 670, 96, 285, - 96, 670, 96, 96, 96, 96, 96, 670, 670, 670, - 670, 96, 670, 96, 96, 96, 670, 96, 670, 670, - 96, 287, 96, 670, 96, 670, 96, 670, 96, 670, - 96, 96, 96, 96, 96, 670, 670, 288, 670, 96, - 670, 96, 96, 96, 670, 96, 670, 670, 289, 670, - 96, 670, 96, 96, 96, 670, 96, 670, 293, 96, - 670, 96, 290, 292, 670, 96, 670, 96, 670, 96, - 96, 96, 96, 96, 670, 670, 96, 670, 96, 670, - 96, 670, 96, 670, 96, 670, 96, 670, 96, 294, - - 96, 96, 96, 670, 295, 96, 670, 670, 670, 296, - 670, 96, 96, 96, 96, 96, 96, 96, 670, 670, - 96, 96, 670, 670, 670, 670, 670, 96, 96, 96, - 670, 96, 670, 670, 96, 297, 96, 670, 96, 670, - 96, 670, 96, 670, 96, 298, 96, 96, 96, 96, - 670, 299, 300, 96, 670, 96, 670, 670, 301, 96, - 670, 96, 670, 96, 670, 96, 96, 96, 96, 96, - 670, 670, 670, 670, 96, 670, 96, 96, 96, 303, - 96, 304, 307, 670, 670, 96, 305, 96, 96, 96, - 670, 96, 670, 670, 670, 306, 96, 670, 96, 96, - - 96, 670, 96, 670, 670, 311, 670, 96, 670, 96, - 96, 96, 670, 96, 670, 670, 96, 670, 96, 670, - 96, 670, 313, 314, 96, 670, 96, 96, 96, 96, - 96, 670, 670, 96, 670, 96, 670, 96, 315, 96, - 670, 96, 670, 96, 96, 316, 96, 96, 670, 670, - 96, 670, 96, 318, 96, 670, 96, 670, 96, 670, - 96, 670, 96, 96, 96, 319, 96, 96, 320, 96, - 670, 670, 670, 670, 670, 670, 96, 96, 96, 96, - 96, 96, 96, 670, 670, 96, 96, 670, 317, 670, - 96, 670, 96, 670, 96, 670, 96, 670, 96, 321, - - 96, 96, 96, 322, 96, 670, 670, 670, 96, 96, - 96, 96, 96, 324, 96, 670, 323, 96, 670, 670, - 670, 96, 96, 96, 96, 96, 96, 670, 96, 670, - 325, 670, 96, 96, 326, 96, 96, 327, 96, 670, - 328, 96, 670, 670, 670, 96, 670, 96, 96, 96, - 96, 670, 96, 96, 96, 670, 329, 96, 670, 96, - 670, 670, 670, 96, 670, 96, 670, 96, 670, 96, - 96, 96, 96, 330, 670, 670, 96, 331, 96, 670, - 96, 670, 96, 670, 96, 670, 96, 96, 96, 96, - 96, 670, 332, 670, 670, 96, 670, 96, 670, 333, - - 670, 96, 96, 334, 670, 335, 96, 670, 96, 670, - 670, 670, 96, 670, 96, 670, 96, 670, 96, 96, - 96, 96, 96, 670, 670, 96, 670, 96, 670, 96, - 670, 96, 670, 96, 670, 96, 670, 96, 96, 96, - 96, 96, 670, 339, 96, 670, 670, 340, 670, 670, - 96, 96, 96, 96, 96, 96, 96, 341, 670, 96, - 96, 343, 96, 338, 670, 670, 96, 670, 96, 670, - 96, 347, 96, 670, 96, 342, 96, 96, 344, 670, - 96, 96, 345, 670, 670, 670, 670, 96, 96, 96, - 96, 96, 96, 346, 96, 670, 96, 670, 96, 96, - - 96, 96, 96, 670, 670, 348, 670, 96, 670, 96, - 350, 96, 96, 96, 670, 96, 670, 670, 670, 96, - 96, 96, 96, 96, 96, 96, 96, 670, 96, 670, - 351, 96, 670, 96, 355, 96, 354, 96, 352, 96, - 670, 670, 670, 96, 96, 96, 670, 96, 96, 96, - 670, 356, 96, 670, 670, 670, 670, 670, 96, 96, - 96, 96, 96, 96, 357, 96, 96, 96, 96, 670, - 670, 670, 670, 670, 670, 96, 96, 96, 96, 96, - 96, 96, 670, 670, 96, 96, 670, 670, 670, 670, - 670, 96, 670, 96, 96, 96, 670, 360, 670, 359, - - 96, 670, 96, 670, 96, 96, 96, 670, 96, 670, - 670, 670, 96, 96, 96, 96, 96, 361, 670, 96, - 96, 96, 362, 96, 96, 670, 96, 670, 670, 364, - 96, 670, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 670, 96, 96, 670, 96, 670, 670, - 670, 96, 670, 96, 96, 96, 96, 96, 96, 366, - 96, 96, 96, 96, 363, 96, 96, 670, 368, 670, - 670, 670, 96, 96, 96, 96, 96, 96, 670, 96, - 670, 367, 670, 96, 96, 96, 96, 96, 670, 670, - 670, 670, 96, 670, 670, 670, 96, 96, 96, 670, - - 96, 670, 670, 370, 670, 96, 670, 96, 369, 96, - 96, 96, 670, 96, 376, 670, 96, 670, 670, 670, - 96, 670, 96, 96, 96, 96, 670, 96, 375, 96, - 377, 96, 96, 670, 96, 670, 379, 96, 670, 670, - 670, 96, 670, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 670, 96, 96, 380, 96, 96, 670, 670, - 381, 670, 670, 670, 96, 96, 96, 96, 96, 96, - 670, 96, 670, 96, 670, 96, 96, 96, 96, 96, - 670, 670, 670, 670, 96, 670, 96, 670, 96, 670, - 382, 670, 96, 670, 96, 670, 96, 96, 96, 670, - - 96, 384, 383, 670, 96, 96, 96, 96, 96, 670, - 670, 670, 670, 96, 670, 96, 670, 385, 386, 96, - 670, 96, 387, 670, 670, 96, 96, 96, 96, 96, - 388, 670, 670, 670, 96, 670, 96, 670, 96, 389, - 96, 670, 96, 390, 96, 670, 96, 96, 96, 670, - 96, 670, 96, 670, 96, 96, 96, 670, 96, 670, - 391, 670, 96, 96, 96, 670, 96, 96, 393, 670, - 392, 96, 670, 96, 670, 670, 670, 96, 670, 96, - 670, 96, 670, 96, 96, 96, 96, 96, 670, 670, - 96, 394, 96, 670, 96, 670, 96, 670, 96, 670, - - 96, 395, 396, 96, 96, 96, 96, 670, 670, 96, - 670, 670, 670, 400, 670, 96, 96, 96, 96, 96, - 96, 670, 670, 96, 96, 96, 96, 401, 670, 402, - 670, 670, 670, 96, 670, 96, 96, 96, 96, 670, - 96, 403, 96, 96, 96, 96, 404, 670, 670, 670, - 670, 670, 670, 96, 96, 405, 96, 96, 96, 96, - 670, 670, 96, 96, 670, 96, 670, 670, 407, 96, - 670, 96, 670, 96, 670, 96, 96, 96, 406, 96, - 409, 670, 670, 410, 96, 670, 96, 96, 96, 670, - 96, 670, 670, 408, 670, 96, 670, 96, 96, 96, - - 670, 96, 670, 670, 96, 670, 96, 670, 96, 670, - 96, 670, 96, 670, 96, 96, 96, 96, 96, 670, - 670, 96, 412, 96, 670, 96, 670, 96, 670, 96, - 670, 96, 96, 413, 96, 96, 670, 670, 670, 670, - 96, 670, 96, 96, 96, 670, 96, 670, 415, 96, - 416, 96, 670, 96, 670, 96, 670, 96, 670, 96, - 96, 417, 96, 96, 670, 670, 670, 670, 96, 670, - 96, 670, 96, 96, 96, 670, 96, 670, 418, 96, - 420, 670, 670, 96, 96, 96, 96, 96, 421, 422, - 96, 670, 96, 670, 96, 96, 96, 96, 96, 670, - - 670, 670, 670, 96, 670, 670, 670, 96, 96, 96, - 670, 96, 670, 670, 96, 425, 96, 670, 96, 423, - 96, 670, 96, 670, 96, 670, 96, 96, 96, 96, - 96, 670, 427, 96, 670, 670, 670, 670, 670, 96, - 96, 96, 96, 96, 96, 96, 428, 670, 96, 96, - 670, 96, 670, 670, 670, 96, 670, 96, 670, 96, - 670, 96, 670, 96, 96, 96, 435, 96, 670, 670, - 96, 670, 670, 96, 670, 670, 670, 96, 670, 96, - 670, 96, 670, 96, 96, 96, 96, 96, 670, 430, - 96, 436, 96, 670, 96, 670, 438, 670, 96, 670, - - 96, 96, 96, 96, 96, 670, 670, 96, 439, 96, - 440, 96, 670, 96, 670, 96, 670, 96, 670, 96, - 96, 96, 441, 96, 96, 670, 96, 670, 670, 670, - 670, 670, 670, 96, 96, 96, 442, 96, 96, 96, - 670, 670, 96, 96, 670, 670, 670, 670, 670, 96, - 96, 96, 444, 96, 670, 670, 96, 443, 96, 670, - 96, 670, 96, 670, 96, 670, 96, 670, 96, 96, - 96, 670, 670, 96, 445, 96, 446, 670, 670, 96, - 670, 447, 670, 96, 670, 96, 670, 96, 670, 96, - 96, 96, 96, 96, 670, 449, 96, 670, 96, 670, - - 96, 670, 448, 670, 96, 670, 96, 96, 96, 96, - 96, 670, 670, 96, 670, 96, 670, 96, 670, 96, - 450, 96, 670, 96, 96, 96, 96, 96, 670, 670, - 96, 670, 96, 670, 96, 670, 96, 452, 96, 670, - 96, 451, 96, 96, 96, 453, 96, 96, 670, 96, - 670, 457, 670, 670, 670, 670, 96, 96, 96, 96, - 96, 96, 96, 670, 670, 96, 96, 670, 96, 458, - 459, 670, 96, 670, 96, 670, 96, 670, 96, 96, - 96, 96, 96, 670, 670, 96, 670, 96, 461, 96, - 670, 96, 670, 96, 670, 96, 460, 96, 96, 96, - - 96, 462, 670, 670, 96, 670, 96, 463, 670, 670, - 96, 670, 96, 670, 96, 670, 96, 96, 96, 96, - 96, 670, 670, 670, 670, 96, 670, 96, 670, 96, - 670, 96, 96, 464, 670, 465, 96, 670, 96, 670, - 670, 670, 96, 670, 96, 670, 96, 670, 96, 96, - 96, 96, 96, 670, 670, 466, 467, 96, 670, 96, - 96, 96, 670, 96, 670, 469, 96, 670, 96, 670, - 96, 670, 96, 670, 96, 670, 96, 96, 96, 96, - 96, 670, 670, 96, 670, 96, 670, 96, 670, 471, - 670, 96, 670, 96, 96, 472, 96, 96, 670, 670, - - 670, 670, 96, 670, 96, 670, 96, 96, 96, 670, - 474, 670, 473, 96, 670, 96, 670, 96, 670, 96, - 670, 96, 670, 670, 670, 96, 96, 96, 670, 96, - 96, 477, 670, 96, 96, 476, 96, 670, 670, 670, - 96, 670, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 479, 96, 96, 670, 96, 670, 670, - 670, 96, 670, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 481, 670, 96, 670, 670, 670, - 670, 670, 96, 670, 96, 96, 96, 670, 96, 670, - 488, 96, 489, 670, 670, 96, 670, 96, 96, 96, - - 96, 670, 96, 96, 96, 670, 491, 96, 670, 96, - 670, 670, 670, 96, 670, 96, 670, 96, 670, 96, - 96, 492, 96, 96, 670, 670, 96, 493, 96, 670, - 96, 670, 96, 494, 96, 670, 96, 96, 96, 96, - 96, 670, 670, 96, 670, 96, 670, 96, 670, 96, - 670, 96, 670, 96, 96, 96, 96, 96, 670, 670, - 670, 495, 96, 670, 96, 96, 96, 496, 96, 670, - 670, 96, 670, 96, 670, 96, 670, 96, 670, 96, - 670, 96, 96, 96, 96, 96, 670, 497, 96, 670, - 96, 670, 96, 670, 96, 670, 96, 670, 96, 96, - - 96, 96, 96, 670, 670, 670, 498, 96, 670, 96, - 96, 96, 670, 96, 670, 670, 500, 499, 96, 670, - 96, 670, 96, 670, 96, 670, 96, 96, 96, 96, - 96, 670, 670, 96, 670, 96, 670, 501, 670, 96, - 506, 96, 670, 96, 96, 96, 96, 96, 670, 670, - 670, 670, 96, 670, 96, 96, 96, 670, 96, 670, - 670, 96, 507, 96, 670, 96, 670, 96, 670, 96, - 670, 96, 96, 96, 96, 96, 670, 670, 96, 670, - 96, 509, 96, 670, 96, 670, 96, 670, 96, 508, - 96, 96, 96, 96, 96, 670, 670, 96, 670, 670, - - 670, 670, 670, 96, 96, 96, 96, 96, 96, 96, - 511, 510, 96, 96, 670, 96, 670, 670, 670, 96, - 670, 96, 670, 96, 670, 96, 96, 96, 96, 96, - 670, 670, 96, 670, 96, 670, 96, 670, 513, 670, - 96, 670, 515, 96, 96, 96, 96, 670, 670, 670, - 670, 96, 670, 96, 96, 96, 670, 96, 517, 512, - 96, 670, 96, 670, 96, 670, 96, 670, 96, 670, - 96, 96, 96, 96, 96, 670, 670, 96, 670, 96, - 519, 96, 670, 96, 670, 96, 670, 96, 670, 96, - 96, 96, 96, 670, 670, 520, 96, 670, 96, 670, - - 670, 522, 96, 670, 96, 670, 96, 670, 96, 670, - 96, 96, 96, 524, 96, 96, 670, 96, 670, 670, - 670, 670, 530, 670, 96, 96, 96, 96, 96, 96, - 96, 531, 670, 96, 96, 670, 96, 670, 670, 670, - 96, 670, 96, 670, 96, 670, 96, 96, 96, 96, - 96, 670, 533, 670, 670, 96, 670, 96, 96, 96, - 670, 96, 670, 670, 96, 534, 96, 670, 96, 670, - 535, 670, 96, 670, 96, 96, 536, 96, 96, 670, - 670, 96, 538, 96, 670, 96, 670, 96, 537, 96, - 670, 96, 670, 96, 96, 96, 96, 96, 670, 539, - - 96, 670, 670, 670, 670, 670, 96, 96, 96, 96, - 96, 96, 96, 96, 670, 96, 96, 670, 670, 670, - 540, 670, 96, 96, 96, 96, 96, 96, 96, 670, - 670, 96, 96, 670, 96, 670, 670, 545, 96, 670, - 96, 670, 96, 670, 96, 96, 96, 96, 96, 670, - 670, 96, 670, 96, 670, 96, 670, 96, 670, 96, - 670, 96, 96, 96, 96, 96, 670, 670, 96, 670, - 96, 670, 96, 670, 96, 546, 96, 670, 96, 96, - 96, 96, 96, 670, 670, 670, 670, 96, 670, 96, - 96, 96, 670, 96, 549, 670, 96, 547, 96, 670, - - 96, 670, 96, 554, 96, 670, 96, 96, 96, 96, - 96, 670, 670, 670, 552, 96, 670, 96, 96, 96, - 670, 96, 670, 670, 96, 670, 96, 670, 96, 670, - 96, 670, 96, 670, 96, 96, 96, 96, 96, 670, - 670, 96, 670, 96, 670, 96, 670, 556, 670, 96, - 670, 558, 96, 96, 96, 96, 670, 670, 96, 670, - 96, 670, 96, 670, 96, 564, 96, 670, 96, 96, - 96, 96, 96, 670, 670, 96, 670, 96, 670, 96, - 670, 96, 670, 96, 670, 96, 670, 96, 96, 96, - 96, 96, 565, 566, 96, 670, 567, 670, 670, 670, - - 96, 96, 96, 96, 96, 96, 96, 96, 569, 96, - 96, 670, 670, 670, 670, 670, 96, 96, 568, 96, - 96, 96, 96, 96, 570, 96, 96, 670, 670, 670, - 670, 670, 96, 571, 96, 96, 96, 96, 96, 670, - 670, 96, 96, 670, 670, 670, 96, 670, 96, 670, - 96, 670, 96, 670, 575, 670, 96, 96, 96, 576, - 96, 96, 96, 670, 670, 96, 670, 670, 577, 579, - 670, 96, 96, 96, 96, 96, 96, 96, 670, 670, - 96, 96, 670, 670, 670, 96, 670, 96, 670, 582, - 670, 96, 670, 96, 670, 96, 96, 96, 584, 96, - - 670, 670, 670, 96, 96, 96, 96, 96, 670, 96, - 670, 585, 96, 670, 670, 670, 96, 96, 96, 96, - 96, 592, 670, 96, 670, 96, 670, 96, 96, 96, - 96, 96, 593, 96, 670, 670, 96, 670, 670, 670, - 96, 96, 96, 96, 96, 96, 670, 96, 670, 96, - 670, 96, 96, 96, 96, 96, 670, 670, 594, 670, - 96, 670, 96, 670, 96, 670, 96, 595, 96, 670, - 96, 670, 96, 96, 96, 670, 96, 596, 96, 670, - 96, 96, 96, 670, 96, 670, 96, 670, 96, 96, - 96, 670, 96, 670, 96, 670, 96, 96, 600, 670, - - 96, 670, 96, 670, 96, 96, 96, 601, 96, 670, - 96, 670, 96, 96, 603, 670, 96, 606, 96, 670, - 96, 96, 96, 670, 96, 608, 96, 670, 96, 96, - 96, 670, 96, 609, 96, 670, 96, 96, 96, 670, - 96, 670, 96, 670, 96, 96, 96, 670, 96, 670, - 96, 670, 96, 96, 96, 670, 96, 670, 96, 670, - 96, 96, 96, 670, 96, 670, 96, 670, 96, 96, - 615, 670, 96, 670, 670, 670, 96, 96, 96, 96, - 96, 670, 670, 670, 616, 96, 670, 96, 670, 96, - 670, 96, 670, 96, 670, 96, 620, 96, 96, 621, - - 670, 96, 623, 96, 670, 96, 96, 96, 670, 96, - 670, 670, 670, 96, 96, 96, 96, 96, 628, 96, - 670, 626, 96, 629, 670, 670, 96, 96, 96, 96, - 96, 96, 670, 96, 670, 96, 670, 96, 96, 96, - 96, 96, 670, 96, 670, 635, 96, 670, 670, 670, - 96, 670, 96, 96, 96, 96, 96, 96, 670, 96, - 670, 670, 96, 636, 96, 670, 96, 96, 96, 670, - 96, 670, 670, 670, 96, 96, 96, 96, 96, 96, - 670, 96, 640, 96, 96, 96, 96, 670, 670, 670, - 643, 670, 645, 670, 96, 96, 96, 96, 96, 96, - - 96, 96, 670, 96, 96, 670, 670, 670, 670, 670, - 96, 96, 96, 96, 96, 96, 651, 96, 96, 96, - 96, 670, 670, 670, 670, 670, 670, 96, 96, 96, - 96, 96, 96, 670, 670, 96, 96, 96, 656, 670, - 653, 670, 670, 96, 670, 96, 670, 96, 670, 96, - 670, 96, 670, 96, 96, 96, 660, 96, 670, 96, - 670, 96, 96, 96, 670, 96, 670, 96, 670, 96, - 96, 96, 670, 96, 670, 664, 670, 667, 96, 96, - 96, 96, 670, 96, 670, 670, 96, 670, 670, 670, - 96, 670, 96, 96, 96, 96, 670, 96, 670, 96, - - 670, 670, 96, 53, 53, 53, 53, 53, 53, 53, - 53, 53, 53, 53, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 61, 61, 61, 61, 61, - 61, 61, 61, 61, 61, 61, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 82, - 82, 82, 670, 82, 82, 82, 82, 82, 82, 82, - 89, 89, 670, 670, 89, 670, 89, 153, 153, 670, - 153, 154, 154, 670, 154, 154, 154, 670, 154, 154, - - 154, 154, 157, 157, 157, 670, 157, 157, 157, 157, - 157, 157, 157, 159, 159, 159, 159, 159, 159, 159, - 159, 670, 159, 161, 670, 670, 161, 161, 161, 161, - 161, 161, 161, 162, 670, 670, 162, 162, 162, 162, - 162, 162, 162, 164, 670, 670, 164, 670, 164, 164, - 164, 164, 164, 168, 168, 670, 168, 169, 169, 670, - 169, 102, 102, 670, 102, 15, 670, 670, 670, 670, - 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, - 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, - 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, - - 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, - 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, - 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, - 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, - 670, 670, 670 + 23, 24, 25, 26, 27, 28, 28, 28, 28, 28, + 28, 28, 29, 19, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 38, 38, 38, 40, 41, + 42, 43, 38, 44, 45, 46, 47, 48, 49, 38, + 38, 38, 19, 19, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 51, 19, 23, 53, + 54, 53, 54, 61, 57, 57, 62, 64, 55, 240, + 55, 58, 58, 64, 61, 59, 59, 62, 80, 80, + + 80, 79, 241, 92, 79, 249, 687, 65, 164, 320, + 66, 250, 447, 65, 688, 385, 66, 164, 80, 80, + 80, 75, 76, 75, 79, 164, 77, 75, 76, 75, + 688, 686, 77, 87, 87, 87, 167, 167, 167, 79, + 79, 167, 167, 167, 89, 95, 87, 87, 90, 90, + 90, 90, 90, 90, 90, 95, 684, 95, 545, 95, + 688, 67, 683, 68, 95, 164, 681, 67, 680, 68, + 69, 70, 71, 70, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 93, 93, 93, 93, 93, 93, + 93, 93, 69, 69, 69, 69, 30, 83, 78, 679, + + 73, 581, 30, 516, 78, 95, 677, 676, 102, 80, + 80, 80, 103, 675, 673, 95, 104, 95, 105, 95, + 95, 517, 69, 69, 95, 672, 107, 85, 106, 164, + 108, 670, 95, 109, 95, 167, 167, 167, 668, 95, + 382, 382, 382, 667, 666, 665, 70, 69, 70, 69, + 70, 71, 70, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 664, 246, 247, 95, 662, 660, 110, + 659, 69, 69, 69, 69, 164, 95, 95, 95, 73, + 95, 657, 656, 655, 652, 95, 651, 95, 111, 112, + 650, 95, 114, 95, 649, 648, 95, 645, 643, 113, + + 642, 69, 69, 95, 95, 95, 640, 95, 637, 115, + 636, 635, 95, 632, 95, 631, 95, 384, 95, 118, + 95, 630, 119, 95, 629, 70, 69, 70, 79, 628, + 95, 120, 121, 625, 95, 116, 623, 122, 622, 95, + 620, 617, 616, 615, 83, 609, 117, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 608, 85, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 95, 607, 606, + + 95, 95, 95, 95, 95, 95, 95, 95, 605, 604, + 601, 599, 95, 96, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 97, 95, 98, 95, 99, 95, 95, + 95, 95, 100, 95, 95, 95, 95, 95, 598, 596, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 123, 95, 95, 592, 591, 579, 579, 579, + 124, 590, 578, 95, 95, 95, 95, 95, 95, 577, + 127, 128, 95, 125, 129, 132, 95, 576, 133, 575, + 95, 573, 95, 571, 130, 569, 134, 567, 95, 95, + + 95, 95, 135, 566, 137, 95, 564, 95, 131, 126, + 138, 95, 560, 95, 139, 95, 142, 95, 559, 95, + 95, 95, 558, 143, 95, 140, 95, 95, 136, 557, + 141, 579, 579, 579, 95, 548, 95, 95, 95, 147, + 144, 95, 95, 95, 580, 148, 95, 145, 542, 541, + 95, 540, 95, 539, 95, 146, 95, 151, 537, 535, + 95, 95, 95, 532, 95, 530, 149, 528, 519, 95, + 153, 153, 153, 518, 504, 501, 499, 150, 498, 497, + 496, 495, 493, 154, 154, 154, 154, 154, 154, 155, + 155, 163, 491, 488, 483, 163, 163, 163, 163, 163, + + 163, 163, 163, 163, 163, 87, 87, 87, 580, 481, + 469, 172, 468, 163, 163, 163, 163, 467, 87, 87, + 174, 174, 174, 174, 174, 174, 174, 174, 93, 93, + 93, 93, 93, 93, 93, 93, 95, 95, 450, 444, + 443, 442, 440, 163, 163, 437, 95, 95, 95, 95, + 95, 95, 95, 95, 177, 95, 95, 435, 430, 425, + 422, 410, 178, 95, 95, 95, 95, 180, 163, 163, + 409, 95, 95, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 408, 389, 95, 95, 381, 380, 379, + 373, 163, 163, 163, 163, 95, 95, 95, 95, 95, + + 95, 95, 366, 181, 95, 95, 182, 361, 165, 179, + 357, 95, 345, 95, 95, 95, 344, 95, 168, 164, + 95, 163, 163, 314, 95, 95, 95, 95, 95, 95, + 313, 184, 183, 95, 312, 95, 95, 95, 185, 95, + 95, 306, 186, 95, 95, 295, 163, 290, 286, 275, + 95, 274, 95, 95, 95, 95, 187, 95, 95, 95, + 188, 95, 95, 250, 248, 164, 245, 239, 95, 189, + 190, 95, 95, 95, 95, 95, 235, 95, 191, 223, + 95, 217, 192, 213, 95, 202, 95, 201, 95, 176, + 175, 173, 95, 95, 95, 169, 95, 95, 193, 194, + + 95, 95, 168, 95, 196, 168, 162, 95, 160, 95, + 199, 95, 95, 95, 95, 95, 195, 197, 95, 95, + 203, 198, 95, 92, 158, 382, 382, 382, 95, 95, + 95, 200, 95, 157, 383, 95, 94, 95, 204, 95, + 91, 95, 82, 95, 79, 95, 95, 95, 95, 95, + 79, 688, 95, 206, 95, 688, 95, 688, 95, 688, + 205, 688, 95, 95, 95, 95, 95, 688, 688, 207, + 208, 95, 688, 95, 95, 95, 209, 95, 688, 688, + 95, 688, 95, 688, 95, 688, 95, 688, 95, 688, + 95, 95, 211, 95, 95, 688, 210, 688, 688, 95, + + 688, 212, 384, 95, 95, 95, 688, 95, 688, 688, + 95, 688, 214, 688, 95, 688, 95, 95, 95, 95, + 95, 95, 688, 95, 688, 215, 95, 688, 95, 688, + 95, 95, 95, 688, 95, 688, 688, 688, 95, 95, + 95, 95, 95, 95, 95, 95, 216, 95, 688, 218, + 95, 688, 688, 688, 95, 95, 95, 688, 95, 688, + 688, 688, 688, 95, 219, 95, 688, 95, 95, 95, + 688, 221, 688, 688, 220, 222, 688, 688, 95, 688, + 95, 688, 95, 224, 95, 688, 688, 95, 688, 688, + 95, 688, 688, 688, 225, 688, 95, 688, 95, 688, + + 95, 95, 95, 95, 95, 226, 688, 95, 227, 95, + 688, 95, 231, 95, 688, 95, 688, 95, 95, 95, + 95, 95, 688, 229, 95, 228, 95, 688, 95, 688, + 230, 688, 95, 688, 95, 95, 95, 95, 95, 688, + 232, 95, 688, 95, 688, 95, 688, 95, 688, 95, + 688, 95, 95, 95, 95, 95, 688, 688, 95, 688, + 233, 688, 95, 688, 95, 236, 234, 688, 95, 688, + 95, 95, 95, 95, 95, 237, 688, 95, 238, 688, + 688, 688, 688, 95, 95, 95, 95, 95, 95, 688, + 688, 242, 95, 95, 153, 153, 153, 174, 174, 174, + + 174, 174, 174, 174, 174, 688, 688, 154, 154, 154, + 154, 154, 154, 155, 155, 243, 688, 688, 688, 155, + 155, 155, 155, 155, 155, 155, 155, 244, 688, 688, + 688, 155, 155, 155, 155, 155, 155, 155, 155, 95, + 95, 688, 251, 688, 688, 688, 688, 688, 688, 95, + 95, 95, 95, 95, 95, 95, 95, 688, 95, 95, + 688, 688, 688, 688, 688, 95, 252, 95, 95, 95, + 95, 95, 688, 688, 95, 95, 688, 688, 688, 95, + 688, 95, 95, 95, 253, 95, 254, 688, 688, 95, + 95, 95, 95, 95, 95, 95, 95, 688, 95, 688, + + 688, 95, 688, 95, 688, 95, 688, 95, 688, 95, + 688, 95, 255, 256, 95, 95, 688, 95, 688, 95, + 688, 95, 95, 95, 688, 95, 258, 257, 688, 95, + 95, 95, 95, 95, 688, 688, 688, 688, 95, 688, + 95, 688, 95, 95, 95, 688, 95, 688, 688, 259, + 95, 95, 95, 95, 260, 95, 688, 95, 688, 95, + 261, 262, 95, 263, 95, 95, 688, 688, 265, 688, + 688, 264, 688, 688, 95, 95, 95, 95, 95, 95, + 95, 688, 688, 95, 95, 688, 95, 688, 688, 688, + 95, 688, 95, 266, 95, 688, 95, 95, 95, 95, + + 95, 688, 688, 95, 688, 95, 268, 95, 267, 95, + 688, 95, 688, 95, 95, 95, 95, 95, 688, 688, + 95, 688, 95, 271, 269, 688, 95, 270, 95, 688, + 95, 95, 95, 95, 95, 688, 688, 688, 688, 95, + 688, 95, 95, 95, 688, 95, 688, 688, 272, 688, + 95, 688, 95, 273, 95, 95, 95, 688, 688, 688, + 688, 95, 688, 95, 688, 95, 95, 95, 688, 95, + 688, 688, 276, 95, 95, 277, 278, 95, 95, 279, + 95, 95, 95, 688, 95, 95, 688, 95, 688, 688, + 282, 280, 688, 95, 95, 95, 95, 95, 95, 95, + + 95, 95, 281, 95, 283, 688, 95, 688, 688, 95, + 688, 688, 95, 688, 688, 95, 688, 688, 688, 95, + 688, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 688, 95, 284, 688, 287, 688, 688, 688, + 285, 688, 95, 95, 95, 95, 688, 95, 95, 95, + 688, 288, 95, 688, 95, 688, 688, 688, 95, 688, + 95, 289, 95, 688, 95, 95, 95, 95, 95, 688, + 688, 688, 688, 95, 688, 95, 95, 95, 688, 95, + 688, 688, 95, 291, 95, 688, 95, 688, 95, 688, + 95, 688, 95, 95, 95, 95, 95, 688, 688, 292, + + 688, 95, 688, 95, 95, 95, 688, 95, 688, 688, + 293, 688, 95, 688, 95, 95, 95, 688, 95, 688, + 297, 95, 688, 95, 294, 296, 688, 95, 688, 95, + 688, 95, 95, 95, 95, 95, 688, 688, 95, 688, + 95, 688, 95, 688, 95, 688, 95, 688, 95, 688, + 95, 298, 95, 95, 95, 688, 299, 95, 688, 688, + 688, 300, 688, 95, 95, 95, 95, 95, 95, 95, + 688, 688, 95, 95, 688, 688, 688, 688, 688, 95, + 95, 95, 688, 95, 688, 688, 95, 301, 95, 688, + 95, 688, 95, 688, 95, 688, 95, 302, 95, 95, + + 95, 95, 688, 303, 304, 95, 688, 95, 688, 688, + 305, 95, 688, 95, 688, 95, 688, 95, 95, 95, + 95, 95, 688, 688, 688, 688, 95, 688, 95, 95, + 95, 307, 95, 308, 688, 311, 688, 95, 309, 95, + 688, 95, 95, 95, 688, 95, 688, 310, 95, 688, + 688, 315, 95, 688, 95, 95, 95, 95, 95, 95, + 688, 95, 688, 688, 95, 316, 316, 316, 95, 688, + 321, 688, 95, 318, 318, 318, 688, 95, 317, 317, + 317, 317, 317, 317, 317, 317, 319, 319, 319, 319, + 319, 319, 319, 319, 95, 688, 688, 688, 688, 688, + + 95, 322, 688, 688, 95, 688, 95, 688, 95, 688, + 95, 323, 95, 95, 95, 95, 95, 688, 688, 95, + 688, 688, 688, 688, 688, 95, 95, 324, 95, 95, + 95, 327, 95, 95, 95, 95, 326, 688, 688, 688, + 688, 688, 95, 95, 95, 95, 95, 95, 688, 95, + 328, 95, 95, 688, 688, 95, 688, 688, 688, 95, + 325, 95, 688, 95, 688, 95, 95, 95, 95, 95, + 688, 688, 329, 688, 95, 688, 95, 95, 95, 330, + 95, 688, 688, 688, 688, 95, 688, 95, 688, 95, + 95, 95, 332, 95, 688, 331, 95, 688, 688, 688, + + 95, 95, 95, 95, 95, 95, 688, 95, 688, 333, + 688, 95, 95, 334, 95, 95, 335, 95, 688, 336, + 95, 688, 688, 688, 95, 688, 95, 95, 95, 95, + 688, 95, 95, 95, 688, 337, 95, 688, 95, 688, + 688, 688, 95, 688, 95, 688, 95, 688, 95, 95, + 95, 95, 338, 688, 688, 95, 339, 95, 688, 95, + 688, 95, 688, 95, 688, 95, 95, 95, 95, 95, + 688, 340, 688, 688, 95, 688, 95, 688, 341, 688, + 95, 95, 342, 688, 343, 95, 688, 95, 688, 688, + 688, 95, 688, 95, 688, 95, 688, 95, 95, 95, + + 95, 95, 688, 688, 95, 688, 95, 688, 95, 688, + 95, 688, 95, 688, 95, 688, 95, 95, 95, 95, + 95, 688, 347, 95, 688, 688, 348, 688, 688, 95, + 95, 95, 95, 95, 95, 95, 349, 688, 95, 95, + 351, 95, 346, 688, 688, 95, 688, 95, 688, 95, + 688, 95, 688, 95, 350, 95, 95, 352, 688, 355, + 95, 353, 688, 688, 688, 688, 95, 688, 95, 95, + 95, 688, 354, 688, 688, 95, 688, 95, 688, 95, + 688, 95, 688, 95, 688, 95, 688, 95, 95, 95, + 688, 95, 688, 688, 356, 95, 95, 95, 688, 95, + + 95, 358, 688, 95, 95, 688, 688, 688, 688, 688, + 95, 688, 95, 95, 95, 95, 95, 95, 688, 95, + 688, 359, 95, 363, 95, 688, 95, 362, 95, 360, + 95, 688, 688, 688, 95, 95, 95, 688, 95, 95, + 688, 688, 95, 95, 688, 364, 688, 688, 688, 95, + 688, 95, 95, 95, 95, 688, 95, 95, 95, 365, + 95, 95, 688, 95, 688, 688, 688, 95, 688, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 688, 95, + 95, 367, 95, 368, 688, 688, 95, 688, 688, 688, + 95, 688, 95, 688, 95, 688, 95, 95, 95, 95, + + 95, 688, 370, 95, 688, 95, 688, 95, 688, 369, + 688, 95, 688, 95, 95, 95, 95, 95, 688, 688, + 95, 372, 95, 688, 95, 688, 95, 688, 95, 688, + 95, 95, 95, 95, 95, 688, 688, 95, 688, 95, + 688, 95, 688, 95, 688, 95, 688, 95, 688, 95, + 95, 95, 95, 95, 688, 688, 95, 688, 371, 688, + 688, 688, 95, 95, 374, 95, 95, 95, 688, 95, + 95, 95, 375, 376, 688, 688, 688, 688, 688, 95, + 95, 95, 95, 95, 95, 688, 95, 95, 95, 95, + 688, 688, 688, 688, 688, 688, 95, 95, 95, 95, + + 95, 95, 688, 378, 377, 95, 95, 316, 316, 316, + 688, 688, 688, 688, 688, 318, 318, 318, 688, 688, + 317, 317, 317, 317, 317, 317, 317, 317, 319, 319, + 319, 319, 319, 319, 319, 319, 383, 688, 95, 688, + 319, 319, 319, 319, 319, 319, 319, 319, 95, 688, + 95, 688, 95, 95, 387, 688, 386, 95, 388, 95, + 688, 688, 688, 95, 688, 95, 688, 95, 688, 95, + 95, 95, 95, 95, 688, 390, 95, 688, 95, 688, + 95, 688, 95, 688, 95, 688, 95, 688, 95, 95, + 95, 95, 391, 688, 95, 95, 688, 392, 688, 688, + + 688, 95, 95, 95, 95, 95, 95, 688, 95, 688, + 95, 688, 95, 95, 95, 95, 95, 688, 688, 688, + 688, 95, 688, 95, 688, 95, 688, 393, 688, 95, + 688, 95, 688, 95, 95, 95, 688, 95, 395, 394, + 688, 95, 95, 95, 95, 95, 688, 688, 688, 688, + 95, 688, 95, 688, 396, 397, 95, 688, 95, 398, + 688, 688, 95, 95, 95, 95, 95, 399, 688, 688, + 688, 95, 688, 95, 688, 95, 400, 95, 688, 95, + 401, 95, 688, 95, 95, 95, 688, 95, 688, 95, + 688, 95, 95, 95, 688, 95, 688, 402, 688, 95, + + 95, 95, 688, 95, 95, 404, 688, 403, 95, 688, + 95, 688, 688, 688, 95, 688, 95, 688, 95, 688, + 95, 95, 95, 95, 95, 688, 688, 95, 405, 95, + 688, 95, 688, 95, 688, 95, 688, 95, 406, 407, + 95, 95, 95, 95, 688, 688, 95, 688, 688, 688, + 411, 688, 95, 95, 95, 95, 95, 95, 688, 688, + 95, 95, 95, 95, 412, 688, 413, 688, 688, 688, + 95, 688, 95, 95, 95, 95, 688, 95, 414, 95, + 95, 95, 95, 415, 688, 688, 688, 688, 688, 688, + 95, 95, 416, 95, 95, 95, 95, 688, 688, 95, + + 95, 688, 95, 688, 688, 418, 95, 688, 95, 688, + 95, 420, 95, 95, 95, 417, 95, 688, 421, 95, + 688, 95, 688, 95, 688, 95, 688, 95, 688, 95, + 419, 95, 95, 95, 95, 688, 688, 95, 95, 688, + 95, 688, 688, 688, 95, 688, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 423, 95, 95, 95, 95, + 688, 688, 688, 688, 688, 688, 688, 95, 95, 424, + 95, 95, 95, 95, 426, 688, 95, 95, 688, 95, + 427, 688, 688, 95, 688, 95, 688, 95, 688, 95, + 95, 428, 95, 95, 688, 688, 688, 688, 95, 688, + + 95, 688, 95, 95, 95, 688, 95, 688, 429, 95, + 431, 688, 688, 95, 95, 95, 95, 95, 432, 433, + 95, 688, 95, 688, 95, 95, 95, 95, 95, 688, + 688, 688, 688, 95, 688, 688, 688, 95, 95, 95, + 688, 95, 688, 688, 95, 436, 95, 688, 95, 434, + 95, 688, 95, 688, 95, 688, 95, 95, 95, 95, + 95, 688, 438, 95, 688, 688, 688, 688, 688, 95, + 95, 95, 95, 95, 95, 95, 439, 688, 95, 95, + 688, 688, 445, 445, 445, 95, 688, 95, 688, 95, + 688, 688, 688, 95, 95, 446, 446, 446, 446, 446, + + 446, 446, 446, 95, 688, 95, 688, 95, 688, 448, + 95, 688, 95, 95, 688, 688, 95, 688, 688, 441, + 95, 688, 95, 95, 95, 95, 95, 95, 451, 95, + 95, 449, 95, 95, 95, 95, 688, 688, 688, 688, + 688, 688, 688, 95, 95, 95, 95, 95, 95, 688, + 688, 452, 95, 95, 95, 688, 688, 453, 688, 454, + 95, 688, 688, 688, 95, 688, 95, 688, 95, 688, + 95, 95, 95, 95, 95, 688, 688, 95, 688, 95, + 688, 95, 688, 455, 688, 95, 688, 95, 688, 95, + 95, 95, 95, 688, 457, 456, 95, 688, 95, 688, + + 688, 688, 95, 688, 95, 688, 95, 688, 95, 688, + 95, 95, 95, 688, 688, 95, 458, 95, 459, 688, + 688, 95, 688, 460, 688, 95, 688, 95, 688, 95, + 688, 95, 95, 95, 95, 95, 688, 462, 95, 688, + 95, 688, 95, 688, 461, 688, 95, 688, 95, 95, + 95, 95, 95, 688, 688, 95, 688, 95, 688, 95, + 688, 95, 463, 95, 688, 95, 95, 95, 95, 95, + 688, 688, 95, 688, 95, 688, 95, 688, 95, 465, + 95, 688, 95, 464, 95, 95, 95, 466, 95, 95, + 688, 95, 688, 470, 688, 688, 688, 688, 95, 95, + + 95, 95, 95, 95, 95, 688, 688, 95, 95, 688, + 95, 471, 472, 688, 95, 688, 95, 688, 95, 688, + 95, 95, 95, 95, 95, 688, 688, 95, 688, 95, + 474, 95, 688, 95, 688, 95, 688, 95, 473, 95, + 95, 95, 95, 475, 688, 688, 95, 688, 95, 476, + 688, 688, 95, 688, 95, 688, 95, 688, 95, 95, + 95, 95, 95, 688, 688, 688, 688, 95, 688, 95, + 688, 95, 688, 95, 95, 477, 688, 478, 95, 688, + 95, 688, 688, 688, 95, 688, 95, 688, 95, 688, + 95, 95, 95, 95, 95, 688, 688, 479, 480, 95, + + 688, 95, 95, 95, 688, 95, 688, 482, 95, 688, + 95, 688, 95, 688, 95, 688, 95, 688, 95, 95, + 95, 95, 95, 688, 688, 95, 688, 95, 688, 95, + 688, 484, 688, 95, 688, 95, 95, 485, 95, 95, + 688, 688, 688, 688, 95, 688, 95, 688, 95, 95, + 95, 688, 487, 688, 486, 95, 688, 95, 688, 95, + 688, 95, 688, 95, 688, 688, 688, 95, 95, 95, + 688, 95, 95, 490, 688, 95, 95, 489, 95, 688, + 688, 688, 95, 688, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 492, 95, 95, 688, 95, + + 688, 688, 688, 95, 688, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 688, 95, 494, 688, 95, 445, + 445, 445, 688, 688, 688, 688, 688, 688, 688, 688, + 688, 688, 446, 446, 446, 446, 446, 446, 446, 446, + 500, 688, 95, 688, 446, 446, 446, 446, 446, 446, + 446, 446, 95, 688, 95, 95, 95, 688, 95, 688, + 502, 95, 503, 688, 688, 95, 688, 95, 95, 95, + 95, 688, 95, 95, 95, 688, 505, 95, 688, 95, + 688, 688, 688, 95, 688, 95, 688, 95, 688, 95, + 95, 506, 95, 95, 688, 688, 95, 507, 95, 688, + + 95, 688, 95, 508, 95, 688, 95, 95, 95, 95, + 95, 688, 688, 95, 688, 95, 688, 95, 688, 95, + 688, 95, 688, 95, 95, 95, 95, 95, 688, 688, + 688, 509, 95, 688, 95, 95, 95, 510, 95, 688, + 688, 95, 688, 95, 688, 95, 688, 95, 688, 95, + 688, 95, 95, 95, 95, 95, 688, 511, 95, 688, + 95, 688, 95, 688, 95, 688, 95, 688, 95, 95, + 95, 95, 95, 688, 688, 688, 512, 95, 688, 95, + 95, 95, 688, 95, 688, 688, 514, 513, 95, 688, + 95, 688, 95, 688, 95, 688, 95, 95, 95, 95, + + 95, 688, 688, 95, 688, 95, 688, 515, 688, 95, + 520, 95, 688, 95, 95, 95, 95, 95, 688, 688, + 688, 688, 95, 688, 95, 95, 95, 688, 95, 688, + 688, 95, 521, 95, 688, 95, 688, 95, 688, 95, + 688, 95, 95, 95, 95, 95, 688, 688, 95, 688, + 95, 523, 95, 688, 95, 688, 95, 688, 95, 522, + 95, 95, 95, 95, 95, 688, 688, 95, 688, 688, + 688, 688, 688, 95, 95, 95, 95, 95, 95, 95, + 525, 524, 95, 95, 688, 95, 688, 688, 688, 95, + 688, 95, 688, 95, 688, 95, 95, 95, 95, 95, + + 688, 688, 95, 688, 95, 688, 95, 688, 527, 688, + 95, 688, 529, 95, 95, 95, 95, 688, 688, 688, + 688, 95, 688, 95, 95, 95, 688, 95, 531, 526, + 95, 688, 95, 688, 95, 688, 95, 688, 95, 688, + 95, 95, 95, 95, 95, 688, 688, 95, 688, 95, + 533, 95, 688, 95, 688, 95, 688, 95, 688, 95, + 95, 95, 95, 688, 688, 534, 95, 688, 95, 688, + 688, 536, 95, 688, 95, 688, 95, 688, 95, 688, + 95, 95, 95, 538, 95, 688, 688, 95, 688, 688, + 688, 543, 543, 543, 95, 688, 95, 688, 95, 688, + + 688, 688, 688, 95, 544, 544, 544, 544, 544, 544, + 544, 544, 95, 95, 547, 688, 688, 688, 688, 546, + 688, 688, 95, 95, 95, 95, 95, 95, 95, 688, + 688, 95, 95, 688, 688, 688, 95, 688, 95, 95, + 95, 688, 95, 688, 549, 688, 95, 95, 95, 95, + 95, 551, 95, 95, 550, 95, 688, 688, 95, 688, + 95, 688, 95, 688, 552, 554, 95, 688, 95, 688, + 95, 95, 95, 553, 95, 688, 688, 688, 95, 95, + 95, 95, 95, 688, 688, 688, 688, 95, 688, 95, + 688, 95, 555, 95, 688, 95, 688, 95, 688, 95, + + 95, 95, 688, 95, 688, 95, 688, 95, 95, 95, + 688, 95, 556, 95, 688, 95, 95, 95, 688, 95, + 688, 688, 688, 95, 95, 95, 95, 95, 688, 561, + 688, 688, 95, 688, 95, 688, 95, 95, 95, 688, + 95, 688, 688, 688, 95, 95, 95, 95, 95, 95, + 95, 95, 688, 95, 688, 688, 95, 688, 95, 688, + 95, 95, 95, 688, 95, 562, 688, 688, 95, 95, + 95, 95, 95, 95, 95, 95, 688, 95, 565, 563, + 95, 688, 95, 688, 95, 688, 95, 570, 95, 688, + 95, 688, 95, 95, 95, 688, 95, 568, 688, 688, + + 95, 95, 95, 95, 95, 688, 95, 688, 688, 95, + 688, 688, 688, 95, 95, 95, 95, 95, 95, 688, + 95, 688, 95, 688, 95, 95, 572, 95, 95, 688, + 688, 688, 688, 95, 543, 543, 543, 574, 688, 95, + 688, 95, 688, 688, 688, 95, 95, 544, 544, 544, + 544, 544, 544, 544, 544, 95, 95, 95, 582, 95, + 688, 688, 95, 688, 95, 688, 95, 688, 95, 688, + 95, 688, 95, 95, 95, 95, 95, 688, 688, 95, + 688, 95, 584, 95, 688, 95, 688, 95, 688, 95, + 583, 95, 95, 95, 95, 95, 688, 688, 95, 585, + + 688, 688, 688, 688, 95, 95, 95, 586, 95, 95, + 95, 587, 688, 95, 95, 688, 95, 688, 588, 688, + 95, 688, 95, 688, 95, 688, 95, 95, 95, 95, + 95, 688, 688, 95, 688, 95, 688, 589, 688, 95, + 688, 95, 688, 95, 95, 95, 95, 95, 688, 593, + 688, 688, 95, 688, 95, 95, 95, 594, 95, 688, + 688, 95, 595, 95, 688, 95, 688, 95, 597, 95, + 688, 95, 95, 95, 95, 95, 688, 688, 688, 688, + 95, 688, 95, 95, 600, 688, 95, 688, 688, 95, + 688, 95, 688, 95, 688, 95, 602, 95, 688, 95, + + 95, 95, 95, 95, 688, 688, 95, 603, 95, 688, + 95, 688, 95, 688, 95, 688, 95, 95, 610, 95, + 95, 688, 688, 688, 688, 95, 688, 95, 95, 95, + 611, 95, 688, 688, 95, 688, 95, 688, 95, 688, + 95, 688, 95, 688, 95, 95, 95, 95, 95, 688, + 688, 688, 688, 95, 688, 95, 95, 95, 688, 95, + 688, 688, 612, 688, 95, 688, 95, 95, 95, 613, + 95, 688, 688, 95, 688, 95, 688, 95, 688, 95, + 614, 95, 688, 95, 95, 95, 95, 95, 688, 688, + 95, 688, 95, 688, 95, 688, 95, 688, 95, 688, + + 95, 95, 618, 95, 95, 688, 688, 95, 688, 95, + 688, 95, 688, 95, 619, 95, 688, 95, 95, 621, + 95, 95, 688, 688, 95, 624, 95, 688, 95, 688, + 95, 626, 95, 688, 95, 95, 95, 95, 95, 688, + 688, 95, 627, 95, 688, 95, 688, 95, 688, 95, + 688, 95, 95, 95, 95, 95, 688, 688, 95, 688, + 95, 688, 95, 688, 95, 688, 95, 688, 95, 95, + 95, 95, 95, 688, 688, 95, 688, 95, 688, 95, + 688, 633, 688, 95, 688, 95, 95, 95, 95, 95, + 688, 688, 95, 634, 95, 688, 95, 688, 95, 688, + + 95, 688, 95, 638, 639, 95, 95, 95, 688, 688, + 95, 95, 688, 95, 641, 646, 688, 95, 688, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 644, 95, + 95, 688, 95, 95, 647, 688, 95, 688, 688, 688, + 95, 688, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 653, 95, 95, 95, 95, 688, 688, 688, 654, + 688, 688, 688, 95, 95, 95, 95, 95, 95, 95, + 95, 688, 95, 95, 688, 688, 688, 688, 688, 95, + 95, 95, 95, 95, 95, 95, 688, 658, 95, 95, + 688, 95, 688, 661, 688, 95, 688, 95, 663, 95, + + 688, 95, 95, 95, 95, 95, 688, 688, 688, 688, + 95, 688, 95, 95, 95, 688, 95, 688, 669, 95, + 688, 95, 688, 95, 688, 95, 688, 95, 688, 95, + 688, 95, 95, 95, 95, 688, 688, 95, 95, 688, + 674, 688, 671, 688, 95, 95, 95, 95, 95, 95, + 688, 95, 688, 95, 688, 95, 95, 95, 678, 95, + 95, 95, 688, 688, 95, 688, 688, 688, 688, 688, + 95, 95, 95, 95, 95, 95, 95, 682, 688, 95, + 95, 688, 95, 688, 688, 688, 685, 688, 95, 688, + 95, 688, 95, 95, 95, 95, 95, 688, 688, 688, + + 688, 95, 688, 95, 688, 95, 688, 95, 688, 688, + 688, 688, 95, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 81, 81, 81, + + 688, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 88, 88, 688, 688, 88, 688, 688, 88, 688, + 88, 152, 152, 688, 152, 152, 156, 156, 688, 156, + 156, 156, 156, 688, 156, 156, 156, 156, 156, 156, + 159, 159, 159, 688, 159, 159, 159, 159, 159, 159, + 159, 159, 159, 159, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 688, 161, 161, 163, 688, 688, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 164, 688, + 688, 164, 164, 164, 164, 164, 164, 164, 164, 164, + 166, 688, 688, 166, 688, 166, 166, 166, 166, 166, + + 166, 166, 170, 170, 688, 170, 170, 171, 171, 688, + 171, 171, 101, 101, 688, 101, 101, 317, 317, 688, + 688, 688, 317, 688, 317, 688, 688, 688, 688, 317, + 544, 544, 688, 688, 688, 688, 688, 544, 688, 688, + 688, 688, 544, 15, 688, 688, 688, 688, 688, 688, + 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, + 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, + 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, + 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, + 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, + + 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, + 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, + 688, 688, 688 } ; -static yyconst short int yy_chk[4344] = +static yyconst short int yy_chk[4624] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -1227,483 +1265,514 @@ static yyconst short int yy_chk[4344] = 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, 1, 1, 1, 1, 1, 3, 3, 4, - 4, 5, 6, 7, 9, 3, 7, 4, 5, 6, - 8, 5, 6, 8, 10, 17, 17, 17, 18, 18, - - 18, 17, 9, 666, 18, 9, 26, 662, 26, 13, - 13, 13, 10, 151, 13, 10, 86, 22, 22, 22, - 14, 14, 14, 22, 24, 14, 151, 24, 659, 22, - 22, 24, 24, 24, 24, 24, 24, 28, 28, 28, - 28, 28, 28, 28, 657, 34, 86, 454, 34, 76, - 76, 76, 77, 77, 77, 34, 9, 34, 9, 34, - 81, 81, 81, 655, 34, 454, 10, 654, 10, 11, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 3, 4, 4, 7, 5, 6, 7, 9, 3, 150, + 4, 5, 6, 10, 8, 5, 6, 8, 17, 17, + + 17, 26, 150, 26, 17, 172, 684, 9, 246, 246, + 9, 172, 385, 10, 77, 320, 10, 385, 18, 18, + 18, 13, 13, 13, 18, 320, 13, 14, 14, 14, + 77, 680, 14, 22, 22, 22, 75, 75, 75, 22, + 24, 76, 76, 76, 24, 38, 22, 22, 24, 24, + 24, 24, 24, 24, 24, 38, 677, 38, 501, 38, + 77, 9, 675, 9, 38, 501, 673, 10, 672, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 13, 652, 13, 163, 163, 650, 170, 11, - 11, 11, 11, 14, 170, 14, 163, 11, 32, 242, - - 242, 32, 165, 165, 165, 32, 529, 648, 32, 32, - 32, 32, 32, 38, 312, 647, 33, 32, 644, 11, - 11, 32, 33, 38, 312, 38, 33, 38, 33, 33, - 33, 642, 38, 529, 638, 33, 91, 91, 91, 91, - 91, 91, 91, 11, 11, 11, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 374, - 634, 35, 633, 78, 374, 632, 12, 12, 12, 12, - 631, 35, 35, 35, 12, 35, 630, 78, 36, 36, - 35, 487, 627, 35, 625, 624, 619, 618, 487, 36, - 617, 36, 614, 36, 37, 36, 12, 12, 36, 39, - - 39, 613, 39, 612, 37, 611, 37, 78, 37, 610, - 39, 39, 39, 37, 39, 607, 605, 39, 604, 39, - 12, 12, 12, 21, 602, 37, 88, 88, 88, 599, - 598, 597, 88, 591, 590, 589, 37, 21, 88, 88, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 11, 11, 11, 11, 28, 28, 28, 28, 28, 28, + 28, 28, 11, 11, 11, 11, 13, 85, 13, 670, + + 11, 545, 14, 467, 14, 32, 668, 666, 32, 80, + 80, 80, 32, 665, 662, 32, 32, 32, 32, 32, + 33, 467, 11, 11, 32, 660, 33, 85, 32, 545, + 33, 656, 33, 33, 33, 167, 167, 167, 652, 33, + 382, 382, 382, 651, 650, 649, 11, 11, 11, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 648, 165, 165, 34, 645, 643, 34, + 642, 12, 12, 12, 12, 165, 34, 35, 34, 12, + 34, 637, 636, 635, 632, 34, 631, 35, 35, 35, + 630, 35, 36, 36, 629, 628, 35, 625, 623, 35, + + 622, 12, 12, 36, 37, 36, 620, 36, 617, 36, + 616, 615, 36, 609, 37, 608, 37, 382, 37, 39, + 39, 607, 39, 37, 606, 12, 12, 12, 21, 604, + 39, 39, 39, 601, 39, 37, 599, 39, 598, 39, + 596, 592, 591, 590, 21, 581, 37, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 588, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 578, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 31, 586, 583, 31, 31, 31, 31, 31, 31, 31, + 21, 21, 21, 21, 21, 21, 21, 31, 577, 576, - 581, 580, 578, 574, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 575, 573, + 569, 567, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 566, 564, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 573, 572, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 40, 40, 41, 563, 562, 561, - 560, 559, 40, 557, 553, 40, 41, 40, 41, 40, - 41, 551, 42, 42, 40, 41, 42, 43, 43, 550, - 43, 548, 42, 543, 42, 542, 42, 541, 43, 528, - 43, 42, 43, 44, 43, 527, 44, 43, 526, 45, - - 42, 41, 45, 44, 525, 44, 45, 44, 46, 45, - 523, 45, 44, 45, 46, 46, 521, 45, 45, 518, - 43, 516, 45, 47, 514, 46, 512, 46, 505, 46, - 504, 46, 503, 47, 46, 47, 502, 47, 46, 48, - 49, 47, 47, 490, 486, 485, 46, 49, 484, 48, - 49, 48, 49, 48, 49, 483, 480, 478, 48, 49, - 475, 470, 47, 94, 94, 94, 94, 94, 94, 94, - 468, 456, 455, 437, 48, 73, 434, 433, 432, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 431, 96, - 97, 430, 429, 426, 424, 73, 73, 73, 73, 96, - - 97, 96, 97, 96, 97, 98, 419, 97, 96, 97, - 414, 411, 399, 398, 397, 98, 378, 98, 99, 98, - 373, 100, 372, 371, 98, 73, 73, 369, 99, 365, - 99, 100, 99, 100, 101, 100, 363, 99, 358, 353, - 100, 99, 349, 338, 101, 337, 101, 336, 101, 317, - 73, 74, 101, 101, 310, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 309, 103, 308, 302, 104, 291, - 103, 74, 74, 74, 74, 103, 286, 103, 104, 103, - 104, 105, 104, 282, 103, 271, 104, 104, 74, 270, - 244, 105, 243, 105, 106, 105, 239, 238, 237, 233, - - 105, 74, 74, 221, 106, 107, 106, 106, 106, 215, - 211, 200, 199, 106, 171, 107, 167, 107, 162, 107, - 108, 108, 160, 150, 107, 147, 74, 137, 109, 109, - 132, 108, 127, 108, 108, 108, 118, 117, 95, 109, - 108, 109, 110, 109, 92, 111, 89, 84, 109, 111, - 83, 80, 110, 110, 110, 111, 110, 111, 112, 111, - 66, 110, 63, 60, 111, 59, 56, 52, 112, 50, - 112, 29, 112, 113, 113, 113, 115, 112, 25, 114, - 114, 20, 19, 113, 16, 113, 115, 113, 115, 114, - 115, 114, 113, 114, 116, 115, 15, 114, 114, 0, - - 0, 119, 0, 0, 116, 0, 116, 116, 116, 119, - 0, 0, 120, 116, 0, 120, 0, 0, 0, 119, - 121, 119, 120, 119, 120, 0, 120, 0, 119, 0, - 121, 120, 121, 0, 121, 122, 122, 0, 0, 121, - 0, 0, 0, 0, 0, 122, 123, 122, 0, 122, - 0, 0, 122, 122, 122, 0, 123, 124, 123, 123, - 123, 0, 0, 125, 0, 123, 0, 124, 0, 124, - 0, 124, 0, 125, 126, 125, 124, 125, 0, 124, - 0, 0, 125, 0, 126, 0, 126, 128, 126, 0, - 129, 0, 0, 126, 0, 128, 0, 128, 0, 128, - - 129, 128, 129, 130, 129, 0, 128, 0, 129, 129, - 0, 131, 0, 130, 133, 130, 0, 130, 0, 0, - 0, 131, 130, 131, 133, 131, 133, 134, 133, 131, - 131, 0, 133, 133, 0, 0, 0, 134, 135, 134, - 0, 134, 0, 0, 0, 0, 134, 134, 135, 0, - 135, 136, 135, 0, 136, 0, 0, 135, 136, 0, - 0, 136, 0, 136, 0, 136, 138, 138, 0, 0, - 136, 0, 0, 139, 0, 0, 0, 138, 0, 138, - 0, 138, 0, 139, 140, 139, 138, 139, 139, 0, - 141, 139, 139, 0, 140, 0, 140, 0, 140, 0, - - 141, 142, 141, 140, 141, 143, 141, 0, 140, 141, - 0, 142, 0, 142, 0, 142, 143, 144, 0, 0, - 142, 0, 144, 0, 0, 0, 143, 144, 143, 144, - 143, 144, 145, 146, 0, 143, 144, 0, 0, 0, - 0, 0, 145, 146, 145, 146, 145, 146, 148, 149, - 149, 145, 146, 149, 0, 148, 0, 0, 148, 149, - 148, 149, 148, 149, 152, 0, 0, 148, 149, 0, - 0, 0, 0, 0, 152, 0, 152, 0, 152, 0, - 0, 0, 152, 152, 172, 172, 172, 172, 172, 172, - 172, 175, 176, 0, 175, 0, 0, 0, 0, 0, - - 0, 175, 176, 175, 176, 175, 176, 177, 178, 0, - 175, 176, 0, 0, 0, 0, 0, 177, 178, 177, - 178, 177, 178, 179, 0, 0, 177, 178, 0, 0, - 0, 180, 0, 179, 181, 179, 179, 179, 180, 0, - 0, 180, 179, 180, 181, 180, 181, 182, 181, 0, - 180, 0, 0, 181, 0, 183, 0, 182, 0, 182, - 0, 182, 0, 184, 182, 183, 182, 183, 0, 183, - 0, 185, 0, 184, 183, 184, 0, 184, 185, 184, - 0, 185, 184, 185, 186, 185, 0, 0, 0, 0, - 185, 0, 187, 0, 186, 188, 186, 0, 186, 0, - - 0, 186, 187, 186, 187, 188, 187, 188, 0, 188, - 0, 187, 188, 188, 188, 189, 189, 190, 0, 0, - 190, 0, 0, 189, 0, 0, 189, 190, 189, 190, - 189, 190, 191, 0, 0, 189, 190, 0, 192, 0, - 0, 0, 191, 0, 191, 191, 191, 0, 192, 193, - 192, 191, 192, 0, 0, 194, 0, 192, 194, 193, - 193, 193, 0, 193, 0, 194, 195, 194, 193, 194, - 0, 0, 196, 0, 194, 196, 195, 0, 195, 195, - 195, 0, 196, 197, 196, 195, 196, 0, 0, 0, - 0, 196, 0, 197, 198, 197, 0, 197, 0, 0, - - 197, 0, 197, 0, 198, 198, 198, 201, 198, 0, - 0, 0, 0, 198, 0, 202, 0, 201, 203, 201, - 0, 201, 0, 0, 201, 202, 201, 202, 203, 202, - 203, 203, 203, 204, 202, 0, 205, 203, 0, 206, - 0, 0, 206, 204, 0, 204, 205, 204, 205, 206, - 205, 206, 204, 206, 205, 205, 207, 208, 206, 0, - 209, 0, 0, 207, 0, 0, 0, 208, 0, 208, - 209, 208, 209, 207, 209, 207, 208, 207, 210, 209, - 0, 212, 207, 0, 212, 0, 0, 0, 210, 0, - 210, 212, 210, 212, 0, 212, 213, 210, 0, 213, - - 212, 0, 214, 0, 0, 0, 213, 0, 213, 214, - 213, 0, 214, 216, 214, 213, 214, 0, 0, 0, - 0, 214, 0, 216, 217, 216, 0, 216, 0, 0, - 218, 216, 216, 0, 217, 0, 217, 0, 217, 0, - 218, 219, 218, 217, 218, 0, 0, 218, 0, 218, - 0, 219, 220, 219, 0, 219, 0, 0, 219, 0, - 219, 0, 220, 222, 220, 0, 220, 0, 223, 223, - 0, 220, 220, 222, 0, 222, 0, 222, 0, 223, - 224, 223, 222, 223, 0, 0, 225, 0, 223, 0, - 224, 0, 224, 0, 224, 0, 225, 0, 225, 224, - - 225, 226, 227, 0, 226, 225, 0, 0, 0, 227, - 0, 226, 227, 226, 227, 226, 227, 228, 0, 0, - 226, 227, 0, 0, 0, 0, 0, 228, 229, 228, - 0, 228, 0, 0, 230, 228, 228, 0, 229, 0, - 229, 0, 229, 0, 230, 229, 230, 229, 230, 231, - 0, 230, 231, 230, 0, 232, 0, 0, 232, 231, - 0, 231, 0, 231, 0, 232, 234, 232, 231, 232, - 0, 0, 0, 0, 232, 0, 234, 235, 234, 234, - 234, 234, 236, 0, 0, 234, 234, 235, 236, 235, - 0, 235, 0, 0, 0, 235, 235, 0, 236, 240, - - 236, 0, 236, 0, 0, 240, 0, 236, 0, 240, - 247, 240, 0, 240, 0, 0, 248, 0, 240, 0, - 247, 0, 247, 248, 247, 0, 248, 249, 248, 247, - 248, 0, 0, 250, 0, 248, 0, 249, 249, 249, - 0, 249, 0, 250, 251, 250, 249, 250, 0, 0, - 252, 0, 250, 252, 251, 0, 251, 0, 251, 0, - 252, 0, 252, 251, 252, 253, 253, 254, 254, 252, - 0, 0, 0, 0, 0, 0, 253, 254, 253, 254, - 253, 254, 255, 0, 0, 253, 254, 0, 251, 0, - 256, 0, 255, 0, 255, 0, 255, 0, 257, 255, - - 256, 255, 256, 256, 256, 0, 0, 0, 257, 256, - 257, 259, 257, 258, 258, 0, 257, 257, 0, 0, - 0, 259, 260, 259, 258, 259, 258, 0, 258, 0, - 259, 0, 260, 258, 260, 261, 260, 261, 262, 0, - 262, 260, 0, 0, 0, 261, 0, 261, 262, 261, - 262, 0, 262, 263, 261, 0, 263, 262, 0, 264, - 0, 0, 0, 263, 0, 263, 0, 263, 0, 264, - 265, 264, 263, 264, 0, 0, 266, 265, 264, 0, - 265, 0, 265, 0, 265, 0, 266, 267, 266, 265, - 266, 0, 266, 0, 0, 266, 0, 267, 0, 267, - - 0, 267, 268, 267, 0, 268, 267, 0, 269, 0, - 0, 0, 268, 0, 268, 0, 268, 0, 269, 272, - 269, 268, 269, 0, 0, 273, 0, 269, 0, 272, - 0, 272, 0, 272, 0, 273, 0, 273, 272, 273, - 274, 275, 0, 273, 273, 0, 0, 274, 0, 0, - 274, 275, 274, 275, 274, 275, 276, 275, 0, 274, - 275, 277, 277, 272, 0, 0, 276, 0, 276, 0, - 276, 279, 277, 0, 277, 276, 277, 278, 277, 0, - 279, 277, 278, 0, 0, 0, 0, 278, 280, 278, - 279, 278, 279, 278, 279, 0, 278, 0, 280, 279, - - 280, 281, 280, 0, 0, 280, 0, 280, 0, 283, - 283, 281, 284, 281, 0, 281, 0, 0, 0, 283, - 281, 283, 284, 283, 284, 285, 284, 0, 283, 0, - 284, 284, 0, 287, 288, 285, 287, 285, 285, 285, - 0, 0, 0, 287, 285, 287, 0, 287, 289, 288, - 0, 289, 287, 0, 0, 0, 0, 0, 289, 288, - 289, 288, 289, 288, 290, 290, 292, 289, 288, 0, - 0, 0, 0, 0, 0, 290, 292, 290, 292, 290, - 292, 293, 0, 0, 290, 292, 0, 0, 0, 0, - 0, 293, 0, 293, 294, 293, 0, 294, 0, 293, - - 293, 0, 295, 0, 294, 296, 294, 0, 294, 0, - 0, 0, 295, 294, 295, 296, 295, 296, 0, 296, - 298, 295, 297, 297, 296, 0, 299, 0, 0, 301, - 298, 0, 298, 297, 298, 297, 299, 297, 299, 298, - 299, 300, 297, 0, 301, 299, 0, 303, 0, 0, - 0, 300, 0, 300, 301, 300, 301, 303, 301, 303, - 300, 303, 304, 301, 298, 305, 303, 0, 305, 0, - 0, 0, 304, 306, 304, 305, 304, 305, 0, 305, - 0, 304, 0, 306, 305, 306, 307, 306, 0, 0, - 0, 0, 306, 0, 0, 0, 307, 311, 307, 0, - - 307, 0, 0, 307, 0, 307, 0, 311, 306, 311, - 313, 311, 0, 314, 314, 0, 311, 0, 0, 0, - 313, 0, 313, 314, 313, 314, 0, 314, 313, 313, - 315, 315, 314, 0, 316, 0, 318, 318, 0, 0, - 0, 315, 0, 315, 316, 315, 316, 318, 316, 318, - 315, 318, 0, 316, 319, 319, 318, 320, 0, 0, - 320, 0, 0, 0, 319, 321, 319, 320, 319, 320, - 0, 320, 0, 319, 0, 321, 320, 321, 322, 321, - 0, 0, 0, 0, 321, 0, 323, 0, 322, 0, - 322, 0, 322, 0, 324, 0, 323, 322, 323, 0, - - 323, 324, 323, 0, 324, 323, 324, 325, 324, 0, - 0, 0, 0, 324, 0, 326, 0, 325, 326, 325, - 0, 325, 326, 0, 0, 326, 325, 326, 327, 326, - 327, 0, 0, 0, 326, 0, 328, 0, 327, 328, - 327, 0, 327, 328, 329, 0, 328, 327, 328, 0, - 328, 0, 330, 0, 329, 328, 329, 0, 329, 0, - 329, 0, 330, 329, 330, 0, 330, 331, 331, 0, - 330, 330, 0, 332, 0, 0, 0, 331, 0, 331, - 0, 331, 0, 332, 333, 332, 331, 332, 0, 0, - 334, 332, 332, 0, 333, 0, 333, 0, 333, 0, - - 334, 333, 334, 333, 334, 335, 339, 0, 0, 334, - 0, 0, 0, 339, 0, 335, 339, 335, 339, 335, - 339, 0, 0, 341, 335, 339, 340, 340, 0, 340, - 0, 0, 0, 341, 0, 341, 340, 341, 340, 0, - 340, 341, 341, 343, 342, 340, 342, 0, 0, 0, - 0, 0, 0, 343, 342, 343, 342, 343, 342, 344, - 0, 0, 343, 342, 0, 345, 0, 0, 345, 344, - 0, 344, 0, 344, 0, 345, 346, 345, 344, 345, - 347, 0, 0, 348, 345, 0, 346, 347, 346, 0, - 346, 0, 0, 346, 0, 346, 0, 347, 348, 347, - - 0, 347, 0, 0, 350, 0, 347, 0, 348, 0, - 348, 0, 348, 0, 350, 351, 350, 348, 350, 0, - 0, 352, 350, 350, 0, 351, 0, 351, 0, 351, - 0, 352, 354, 352, 351, 352, 0, 0, 0, 0, - 352, 0, 354, 355, 354, 0, 354, 0, 354, 356, - 355, 354, 0, 355, 0, 355, 0, 355, 0, 356, - 357, 356, 355, 356, 0, 0, 0, 0, 356, 0, - 357, 0, 357, 359, 357, 0, 360, 0, 357, 357, - 359, 0, 0, 359, 361, 359, 360, 359, 360, 361, - 360, 0, 359, 0, 361, 360, 361, 362, 361, 0, - - 0, 0, 0, 361, 0, 0, 0, 362, 364, 362, - 0, 362, 0, 0, 366, 364, 362, 0, 364, 362, - 364, 0, 364, 0, 366, 0, 366, 364, 366, 367, - 368, 0, 367, 366, 0, 0, 0, 0, 0, 367, - 368, 367, 368, 367, 368, 370, 368, 0, 367, 368, - 0, 375, 0, 0, 0, 370, 0, 370, 0, 370, - 0, 375, 0, 375, 370, 375, 376, 376, 0, 0, - 375, 0, 0, 377, 0, 0, 0, 376, 0, 376, - 0, 376, 0, 377, 379, 377, 376, 377, 0, 370, - 380, 377, 377, 0, 379, 0, 379, 0, 379, 0, - - 380, 381, 380, 379, 380, 0, 0, 382, 380, 380, - 382, 381, 0, 381, 0, 381, 0, 382, 0, 382, - 381, 382, 383, 383, 384, 0, 382, 0, 0, 0, - 0, 0, 0, 383, 384, 383, 384, 383, 384, 385, - 0, 0, 383, 384, 0, 0, 0, 0, 0, 385, - 386, 385, 386, 385, 0, 0, 387, 385, 385, 0, - 386, 0, 386, 0, 386, 0, 387, 0, 387, 386, - 387, 0, 0, 388, 387, 387, 388, 0, 0, 389, - 0, 389, 0, 388, 0, 388, 0, 388, 0, 389, - 390, 389, 388, 389, 0, 391, 391, 0, 389, 0, - - 390, 0, 390, 0, 390, 0, 391, 392, 391, 390, - 391, 0, 0, 393, 0, 391, 0, 392, 0, 392, - 393, 392, 0, 393, 394, 393, 392, 393, 0, 0, - 395, 0, 393, 0, 394, 0, 394, 395, 394, 0, - 395, 394, 395, 394, 395, 396, 396, 400, 0, 395, - 0, 400, 0, 0, 0, 0, 396, 400, 396, 400, - 396, 400, 401, 0, 0, 396, 400, 0, 402, 401, - 402, 0, 401, 0, 401, 0, 401, 0, 402, 403, - 402, 401, 402, 0, 0, 404, 0, 402, 404, 403, - 0, 403, 0, 403, 0, 404, 403, 404, 403, 404, - - 405, 405, 0, 0, 404, 0, 406, 406, 0, 0, - 405, 0, 405, 0, 405, 0, 406, 407, 406, 405, - 406, 0, 0, 0, 0, 406, 0, 407, 0, 407, - 0, 407, 408, 407, 0, 408, 407, 0, 409, 0, - 0, 0, 408, 0, 408, 0, 408, 0, 409, 410, - 409, 408, 409, 0, 0, 409, 410, 409, 0, 410, - 412, 410, 0, 410, 0, 413, 413, 0, 410, 0, - 412, 0, 412, 0, 412, 0, 413, 415, 413, 412, - 413, 0, 0, 416, 0, 413, 0, 415, 0, 415, - 0, 415, 0, 416, 417, 416, 415, 416, 0, 0, - - 0, 0, 416, 0, 417, 0, 417, 418, 417, 0, - 418, 0, 417, 417, 0, 420, 0, 418, 0, 418, - 0, 418, 0, 0, 0, 420, 418, 420, 0, 420, - 421, 421, 0, 422, 420, 420, 423, 0, 0, 0, - 421, 0, 421, 422, 421, 422, 423, 422, 423, 421, - 423, 425, 422, 425, 427, 423, 0, 428, 0, 0, - 0, 425, 0, 425, 427, 425, 427, 428, 427, 428, - 425, 428, 435, 427, 428, 0, 428, 0, 0, 0, - 0, 0, 435, 0, 435, 436, 435, 0, 438, 0, - 435, 435, 436, 0, 0, 436, 0, 436, 438, 436, - - 438, 0, 438, 439, 436, 0, 439, 438, 0, 440, - 0, 0, 0, 439, 0, 439, 0, 439, 0, 440, - 441, 440, 439, 440, 0, 0, 442, 441, 440, 0, - 441, 0, 441, 442, 441, 0, 442, 443, 442, 441, - 442, 0, 0, 444, 0, 442, 0, 443, 0, 443, - 0, 443, 0, 444, 445, 444, 443, 444, 0, 0, - 0, 445, 444, 0, 445, 446, 445, 446, 445, 0, - 0, 447, 0, 445, 0, 446, 0, 446, 0, 446, - 0, 447, 448, 447, 446, 447, 0, 448, 449, 0, - 447, 0, 448, 0, 448, 0, 448, 0, 449, 450, - - 449, 448, 449, 0, 0, 0, 449, 449, 0, 450, - 451, 450, 0, 450, 0, 0, 452, 450, 450, 0, - 451, 0, 451, 0, 451, 0, 452, 453, 452, 451, - 452, 0, 0, 457, 0, 452, 0, 453, 0, 453, - 457, 453, 0, 457, 458, 457, 453, 457, 0, 0, - 0, 0, 457, 0, 458, 459, 458, 0, 458, 0, - 0, 460, 458, 458, 0, 459, 0, 459, 0, 459, - 0, 460, 461, 460, 459, 460, 0, 0, 462, 0, - 460, 462, 461, 0, 461, 0, 461, 0, 462, 461, - 462, 461, 462, 463, 464, 0, 0, 462, 0, 0, - - 0, 0, 0, 463, 464, 463, 464, 463, 464, 465, - 465, 463, 463, 464, 0, 466, 0, 0, 0, 465, - 0, 465, 0, 465, 0, 466, 467, 466, 465, 466, - 0, 0, 469, 0, 466, 0, 467, 0, 467, 0, - 467, 0, 469, 471, 469, 467, 469, 0, 0, 0, - 0, 469, 0, 471, 472, 471, 0, 471, 472, 466, - 473, 0, 471, 0, 472, 0, 472, 0, 472, 0, - 473, 474, 473, 472, 473, 0, 0, 476, 0, 473, - 476, 474, 0, 474, 0, 474, 0, 476, 0, 476, - 474, 476, 477, 0, 0, 477, 476, 0, 479, 0, - - 0, 479, 477, 0, 477, 0, 477, 0, 479, 0, - 479, 477, 479, 481, 481, 488, 0, 479, 0, 0, - 0, 0, 488, 0, 481, 488, 481, 488, 481, 488, - 489, 489, 0, 481, 488, 0, 491, 0, 0, 0, - 489, 0, 489, 0, 489, 0, 491, 492, 491, 489, - 491, 0, 491, 0, 0, 491, 0, 492, 493, 492, - 0, 492, 0, 0, 494, 492, 492, 0, 493, 0, - 493, 0, 493, 0, 494, 495, 494, 493, 494, 0, - 0, 496, 497, 494, 0, 495, 0, 495, 495, 495, - 0, 496, 0, 496, 495, 496, 498, 497, 0, 498, - - 496, 0, 0, 0, 0, 0, 498, 497, 498, 497, - 498, 497, 499, 500, 0, 498, 497, 0, 0, 0, - 500, 0, 499, 500, 499, 500, 499, 500, 501, 0, - 0, 499, 500, 0, 506, 0, 0, 506, 501, 0, - 501, 0, 501, 0, 506, 507, 506, 501, 506, 0, - 0, 508, 0, 506, 0, 507, 0, 507, 0, 507, - 0, 508, 509, 508, 507, 508, 0, 0, 510, 0, - 508, 0, 509, 0, 509, 510, 509, 0, 510, 511, - 510, 509, 510, 0, 0, 0, 0, 510, 0, 511, - 513, 511, 0, 511, 513, 0, 515, 511, 511, 0, - - 513, 0, 513, 519, 513, 0, 515, 517, 515, 513, - 515, 0, 0, 0, 517, 515, 0, 517, 519, 517, - 0, 517, 0, 0, 520, 0, 517, 0, 519, 0, - 519, 0, 519, 0, 520, 522, 520, 519, 520, 0, - 0, 524, 0, 520, 0, 522, 0, 522, 0, 522, - 0, 524, 530, 524, 522, 524, 0, 0, 531, 0, - 524, 0, 530, 0, 530, 530, 530, 0, 531, 533, - 531, 530, 531, 0, 0, 534, 0, 531, 0, 533, - 0, 533, 0, 533, 0, 534, 0, 534, 533, 534, - 535, 536, 534, 535, 534, 0, 536, 0, 0, 0, - - 535, 536, 535, 536, 535, 536, 537, 538, 538, 535, - 536, 0, 0, 0, 0, 0, 537, 538, 537, 538, - 537, 538, 539, 540, 539, 537, 538, 0, 0, 0, - 0, 0, 539, 540, 539, 540, 539, 540, 545, 0, - 0, 539, 540, 0, 0, 0, 546, 0, 545, 0, - 545, 0, 545, 0, 545, 0, 546, 545, 546, 546, - 546, 547, 549, 0, 0, 546, 0, 0, 547, 549, - 0, 547, 549, 547, 549, 547, 549, 552, 0, 0, - 547, 549, 0, 0, 0, 554, 0, 552, 0, 552, - 0, 552, 0, 556, 0, 554, 552, 554, 554, 554, - - 0, 0, 0, 556, 554, 556, 558, 556, 0, 564, - 0, 556, 556, 0, 0, 0, 558, 565, 558, 564, - 558, 564, 0, 564, 0, 558, 0, 565, 564, 565, - 566, 565, 566, 567, 0, 0, 565, 0, 0, 0, - 566, 568, 566, 567, 566, 567, 0, 567, 0, 566, - 0, 568, 567, 568, 569, 568, 0, 0, 568, 0, - 568, 0, 570, 0, 569, 0, 569, 569, 569, 0, - 571, 0, 570, 569, 570, 0, 570, 571, 575, 0, - 571, 570, 571, 0, 571, 0, 576, 0, 575, 571, - 575, 0, 575, 0, 577, 0, 576, 575, 576, 0, - - 576, 0, 579, 0, 577, 576, 577, 577, 577, 0, - 582, 0, 579, 577, 579, 0, 579, 582, 584, 0, - 582, 579, 582, 0, 582, 584, 585, 0, 584, 582, - 584, 0, 584, 585, 592, 0, 585, 584, 585, 0, - 585, 0, 593, 0, 592, 585, 592, 0, 592, 0, - 594, 0, 593, 592, 593, 0, 593, 0, 595, 0, - 594, 593, 594, 0, 594, 0, 596, 0, 595, 594, - 595, 0, 595, 0, 0, 0, 596, 595, 596, 600, - 596, 0, 0, 0, 596, 596, 0, 601, 0, 600, - 0, 600, 0, 600, 0, 603, 600, 601, 600, 601, - - 0, 601, 603, 606, 0, 603, 601, 603, 0, 603, - 0, 0, 0, 606, 603, 606, 608, 606, 608, 609, - 0, 606, 606, 609, 0, 0, 608, 615, 608, 609, - 608, 609, 0, 609, 0, 608, 0, 615, 609, 615, - 616, 615, 0, 620, 0, 615, 615, 0, 0, 0, - 616, 0, 616, 620, 616, 620, 621, 620, 0, 616, - 0, 0, 620, 616, 623, 0, 621, 626, 621, 0, - 621, 0, 0, 0, 623, 621, 623, 626, 623, 626, - 0, 626, 623, 623, 628, 629, 626, 0, 0, 0, - 626, 0, 629, 0, 628, 629, 628, 629, 628, 629, - - 635, 636, 0, 628, 629, 0, 0, 0, 0, 0, - 635, 636, 635, 636, 635, 636, 635, 640, 643, 635, - 636, 0, 0, 0, 0, 0, 0, 640, 643, 640, - 643, 640, 643, 0, 0, 645, 640, 643, 645, 0, - 640, 0, 0, 651, 0, 645, 0, 645, 0, 645, - 0, 653, 0, 651, 645, 651, 651, 651, 0, 656, - 0, 653, 651, 653, 0, 653, 0, 660, 0, 656, - 653, 656, 0, 656, 0, 656, 0, 660, 656, 660, - 664, 660, 0, 667, 0, 0, 660, 0, 0, 0, - 664, 0, 664, 667, 664, 667, 0, 667, 0, 664, - - 0, 0, 667, 671, 671, 671, 671, 671, 671, 671, - 671, 671, 671, 671, 672, 672, 672, 672, 672, 672, - 672, 672, 672, 672, 672, 673, 673, 673, 673, 673, - 673, 673, 673, 673, 673, 673, 674, 674, 674, 674, - 674, 674, 674, 674, 674, 674, 674, 675, 675, 675, - 675, 675, 675, 675, 675, 675, 675, 675, 676, 676, - 676, 676, 676, 676, 676, 676, 676, 676, 676, 677, - 677, 677, 0, 677, 677, 677, 677, 677, 677, 677, - 678, 678, 0, 0, 678, 0, 678, 679, 679, 0, - 679, 680, 680, 0, 680, 680, 680, 0, 680, 680, - - 680, 680, 681, 681, 681, 0, 681, 681, 681, 681, - 681, 681, 681, 682, 682, 682, 682, 682, 682, 682, - 682, 0, 682, 683, 0, 0, 683, 683, 683, 683, - 683, 683, 683, 684, 0, 0, 684, 684, 684, 684, - 684, 684, 684, 685, 0, 0, 685, 0, 685, 685, - 685, 685, 685, 686, 686, 0, 686, 687, 687, 0, - 687, 688, 688, 0, 688, 670, 670, 670, 670, 670, - 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, - 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, - 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, - - 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, - 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, - 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, - 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, - 670, 670, 670 + 31, 31, 40, 40, 41, 559, 558, 544, 544, 544, + 40, 557, 542, 40, 41, 40, 41, 40, 41, 541, + 42, 42, 40, 41, 42, 43, 43, 540, 43, 539, + 42, 537, 42, 535, 42, 532, 43, 530, 43, 42, + + 43, 44, 43, 528, 44, 43, 526, 45, 42, 41, + 45, 44, 519, 44, 45, 44, 46, 45, 518, 45, + 44, 45, 517, 46, 46, 45, 45, 47, 43, 516, + 45, 579, 579, 579, 46, 504, 46, 47, 46, 47, + 46, 47, 48, 46, 544, 47, 47, 46, 499, 498, + 49, 497, 48, 496, 48, 46, 48, 49, 493, 491, + 49, 48, 49, 488, 49, 483, 47, 481, 469, 49, + 51, 51, 51, 468, 450, 447, 444, 48, 443, 442, + 441, 440, 437, 51, 51, 51, 51, 51, 51, 51, + 51, 72, 435, 430, 425, 72, 72, 72, 72, 72, + + 72, 72, 72, 72, 72, 87, 87, 87, 579, 422, + 410, 87, 409, 72, 72, 72, 72, 408, 87, 87, + 90, 90, 90, 90, 90, 90, 90, 90, 93, 93, + 93, 93, 93, 93, 93, 93, 95, 96, 389, 381, + 380, 379, 377, 72, 72, 373, 95, 96, 95, 96, + 95, 96, 97, 99, 96, 95, 96, 371, 366, 361, + 357, 346, 97, 99, 97, 99, 97, 99, 72, 73, + 345, 97, 99, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 344, 325, 100, 98, 314, 313, 312, + 306, 73, 73, 73, 73, 100, 98, 100, 98, 100, + + 98, 102, 295, 100, 100, 98, 102, 290, 73, 98, + 286, 102, 275, 102, 103, 102, 274, 104, 248, 247, + 102, 73, 73, 241, 103, 105, 103, 104, 103, 104, + 240, 104, 103, 103, 239, 105, 104, 105, 105, 105, + 106, 235, 107, 107, 105, 223, 73, 217, 213, 202, + 106, 201, 106, 107, 106, 107, 107, 107, 109, 106, + 108, 108, 107, 173, 169, 164, 162, 149, 109, 109, + 109, 108, 109, 108, 110, 108, 146, 109, 110, 136, + 108, 131, 111, 126, 110, 117, 110, 116, 110, 94, + 91, 88, 111, 110, 111, 83, 111, 112, 112, 112, + + 114, 111, 82, 113, 113, 79, 65, 112, 62, 112, + 114, 112, 114, 113, 114, 113, 112, 113, 115, 114, + 118, 113, 113, 59, 58, 317, 317, 317, 115, 118, + 115, 115, 115, 55, 317, 119, 29, 115, 119, 118, + 25, 118, 20, 118, 19, 119, 120, 119, 118, 119, + 16, 15, 121, 121, 119, 0, 120, 0, 120, 0, + 120, 0, 121, 122, 121, 120, 121, 0, 0, 121, + 121, 121, 0, 122, 123, 122, 122, 122, 0, 0, + 124, 0, 122, 0, 123, 0, 123, 0, 123, 0, + 124, 125, 124, 123, 124, 0, 123, 0, 0, 124, + + 0, 125, 317, 125, 127, 125, 0, 128, 0, 0, + 125, 0, 127, 0, 127, 0, 127, 128, 127, 128, + 129, 128, 0, 127, 0, 128, 128, 0, 130, 0, + 129, 132, 129, 0, 129, 0, 0, 0, 130, 129, + 130, 132, 130, 132, 133, 132, 130, 130, 0, 132, + 132, 0, 0, 0, 133, 134, 133, 0, 133, 0, + 0, 0, 0, 133, 133, 134, 0, 134, 135, 134, + 0, 135, 0, 0, 134, 135, 0, 0, 135, 0, + 135, 0, 135, 137, 137, 0, 0, 135, 0, 0, + 138, 0, 0, 0, 137, 0, 137, 0, 137, 0, + + 138, 139, 138, 137, 138, 138, 0, 140, 138, 138, + 0, 139, 142, 139, 0, 139, 0, 140, 141, 140, + 139, 140, 0, 140, 142, 139, 140, 0, 141, 0, + 141, 0, 141, 0, 142, 143, 142, 141, 142, 0, + 143, 144, 0, 142, 0, 143, 0, 143, 0, 143, + 0, 144, 145, 144, 143, 144, 0, 0, 147, 0, + 144, 0, 145, 0, 145, 147, 145, 0, 147, 0, + 147, 145, 147, 151, 148, 148, 0, 147, 148, 0, + 0, 0, 0, 151, 148, 151, 148, 151, 148, 0, + 0, 151, 151, 148, 153, 153, 153, 174, 174, 174, + + 174, 174, 174, 174, 174, 0, 0, 153, 153, 153, + 153, 153, 153, 153, 153, 154, 0, 0, 0, 154, + 154, 154, 154, 154, 154, 154, 154, 155, 0, 0, + 0, 155, 155, 155, 155, 155, 155, 155, 155, 177, + 178, 0, 177, 0, 0, 0, 0, 0, 0, 177, + 178, 177, 178, 177, 178, 179, 180, 0, 177, 178, + 0, 0, 0, 0, 0, 179, 180, 179, 180, 179, + 180, 181, 0, 0, 179, 180, 0, 0, 0, 182, + 0, 181, 183, 181, 181, 181, 182, 0, 0, 182, + 181, 182, 183, 182, 183, 184, 183, 0, 182, 0, + + 0, 183, 0, 185, 0, 184, 0, 184, 0, 184, + 0, 186, 184, 185, 184, 185, 0, 185, 0, 187, + 0, 186, 185, 186, 0, 186, 187, 186, 0, 187, + 186, 187, 188, 187, 0, 0, 0, 0, 187, 0, + 189, 0, 188, 190, 188, 0, 188, 0, 0, 188, + 189, 188, 189, 190, 189, 190, 0, 190, 0, 189, + 190, 190, 190, 191, 191, 192, 0, 0, 192, 0, + 0, 191, 0, 0, 191, 192, 191, 192, 191, 192, + 193, 0, 0, 191, 192, 0, 194, 0, 0, 0, + 193, 0, 193, 193, 193, 0, 194, 195, 194, 193, + + 194, 0, 0, 196, 0, 194, 196, 195, 195, 195, + 0, 195, 0, 196, 197, 196, 195, 196, 0, 0, + 198, 0, 196, 198, 197, 0, 197, 197, 197, 0, + 198, 199, 198, 197, 198, 0, 0, 0, 0, 198, + 0, 199, 200, 199, 0, 199, 0, 0, 199, 0, + 199, 0, 200, 200, 200, 203, 200, 0, 0, 0, + 0, 200, 0, 204, 0, 203, 205, 203, 0, 203, + 0, 0, 203, 204, 203, 204, 205, 204, 205, 205, + 205, 206, 204, 0, 207, 205, 0, 208, 0, 0, + 208, 206, 0, 206, 207, 206, 207, 208, 207, 208, + + 206, 208, 207, 207, 209, 0, 208, 0, 0, 210, + 0, 0, 209, 0, 0, 211, 0, 0, 0, 210, + 0, 210, 209, 210, 209, 211, 209, 211, 210, 211, + 212, 209, 0, 214, 211, 0, 214, 0, 0, 0, + 212, 0, 212, 214, 212, 214, 0, 214, 215, 212, + 0, 215, 214, 0, 216, 0, 0, 0, 215, 0, + 215, 216, 215, 0, 216, 218, 216, 215, 216, 0, + 0, 0, 0, 216, 0, 218, 219, 218, 0, 218, + 0, 0, 220, 218, 218, 0, 219, 0, 219, 0, + 219, 0, 220, 221, 220, 219, 220, 0, 0, 220, + + 0, 220, 0, 221, 222, 221, 0, 221, 0, 0, + 221, 0, 221, 0, 222, 224, 222, 0, 222, 0, + 225, 225, 0, 222, 222, 224, 0, 224, 0, 224, + 0, 225, 226, 225, 224, 225, 0, 0, 227, 0, + 225, 0, 226, 0, 226, 0, 226, 0, 227, 0, + 227, 226, 227, 228, 229, 0, 228, 227, 0, 0, + 0, 229, 0, 228, 229, 228, 229, 228, 229, 230, + 0, 0, 228, 229, 0, 0, 0, 0, 0, 230, + 231, 230, 0, 230, 0, 0, 232, 230, 230, 0, + 231, 0, 231, 0, 231, 0, 232, 231, 232, 231, + + 232, 233, 0, 232, 233, 232, 0, 234, 0, 0, + 234, 233, 0, 233, 0, 233, 0, 234, 236, 234, + 233, 234, 0, 0, 0, 0, 234, 0, 236, 237, + 236, 236, 236, 236, 0, 238, 0, 236, 236, 237, + 0, 237, 238, 237, 0, 242, 0, 237, 237, 0, + 0, 242, 238, 0, 238, 242, 238, 242, 251, 242, + 0, 238, 0, 0, 242, 243, 243, 243, 251, 0, + 251, 0, 251, 244, 244, 244, 0, 251, 243, 243, + 243, 243, 243, 243, 243, 243, 244, 244, 244, 244, + 244, 244, 244, 244, 252, 0, 0, 0, 0, 0, + + 253, 252, 0, 0, 252, 0, 252, 0, 252, 0, + 253, 253, 253, 252, 253, 254, 255, 0, 0, 253, + 0, 0, 0, 0, 0, 254, 255, 254, 255, 254, + 255, 257, 257, 256, 254, 255, 256, 0, 0, 0, + 0, 0, 257, 256, 257, 256, 257, 256, 0, 258, + 258, 257, 256, 0, 0, 259, 0, 0, 0, 258, + 255, 258, 0, 258, 0, 259, 260, 259, 258, 259, + 0, 0, 259, 0, 259, 0, 260, 261, 260, 260, + 260, 0, 0, 0, 0, 260, 0, 261, 0, 261, + 263, 261, 262, 262, 0, 261, 261, 0, 0, 0, + + 263, 264, 263, 262, 263, 262, 0, 262, 0, 263, + 0, 264, 262, 264, 265, 264, 265, 266, 0, 266, + 264, 0, 0, 0, 265, 0, 265, 266, 265, 266, + 0, 266, 267, 265, 0, 267, 266, 0, 268, 0, + 0, 0, 267, 0, 267, 0, 267, 0, 268, 269, + 268, 267, 268, 0, 0, 270, 269, 268, 0, 269, + 0, 269, 0, 269, 0, 270, 271, 270, 269, 270, + 0, 270, 0, 0, 270, 0, 271, 0, 271, 0, + 271, 272, 271, 0, 272, 271, 0, 273, 0, 0, + 0, 272, 0, 272, 0, 272, 0, 273, 276, 273, + + 272, 273, 0, 0, 277, 0, 273, 0, 276, 0, + 276, 0, 276, 0, 277, 0, 277, 276, 277, 278, + 279, 0, 277, 277, 0, 0, 278, 0, 0, 278, + 279, 278, 279, 278, 279, 280, 279, 0, 278, 279, + 281, 281, 276, 0, 0, 280, 0, 280, 0, 280, + 0, 281, 0, 281, 280, 281, 282, 281, 0, 283, + 281, 282, 0, 0, 0, 0, 282, 0, 282, 283, + 282, 0, 282, 0, 0, 282, 0, 284, 0, 283, + 0, 283, 0, 283, 0, 285, 0, 284, 283, 284, + 0, 284, 0, 0, 284, 285, 284, 285, 0, 285, + + 287, 287, 0, 288, 285, 0, 0, 0, 0, 0, + 287, 0, 287, 288, 287, 288, 289, 288, 0, 287, + 0, 288, 288, 292, 291, 0, 289, 291, 289, 289, + 289, 0, 0, 0, 291, 289, 291, 0, 291, 292, + 0, 0, 293, 291, 0, 293, 0, 0, 0, 292, + 0, 292, 293, 292, 293, 0, 293, 296, 292, 294, + 294, 293, 0, 297, 0, 0, 0, 296, 0, 296, + 294, 296, 294, 297, 294, 297, 296, 297, 0, 294, + 298, 297, 297, 298, 0, 0, 299, 0, 0, 0, + 298, 0, 298, 0, 298, 0, 299, 300, 299, 298, + + 299, 0, 301, 301, 0, 299, 0, 300, 0, 300, + 0, 300, 0, 301, 302, 301, 300, 301, 0, 0, + 303, 305, 301, 0, 302, 0, 302, 0, 302, 0, + 303, 304, 303, 302, 303, 0, 0, 305, 0, 303, + 0, 304, 0, 304, 0, 304, 0, 305, 0, 305, + 304, 305, 307, 308, 0, 0, 305, 0, 302, 0, + 0, 0, 307, 308, 307, 308, 307, 308, 0, 310, + 309, 307, 308, 309, 0, 0, 0, 0, 0, 310, + 309, 310, 309, 310, 309, 0, 311, 315, 310, 309, + 0, 0, 0, 0, 0, 0, 311, 315, 311, 315, + + 311, 315, 0, 311, 310, 311, 315, 316, 316, 316, + 0, 0, 0, 0, 0, 318, 318, 318, 0, 0, + 316, 316, 316, 316, 316, 316, 316, 316, 318, 318, + 318, 318, 318, 318, 318, 318, 319, 0, 321, 0, + 319, 319, 319, 319, 319, 319, 319, 319, 321, 0, + 321, 0, 321, 322, 322, 0, 321, 321, 323, 323, + 0, 0, 0, 322, 0, 322, 0, 322, 0, 323, + 324, 323, 322, 323, 0, 326, 326, 0, 323, 0, + 324, 0, 324, 0, 324, 0, 326, 0, 326, 324, + 326, 327, 327, 0, 328, 326, 0, 328, 0, 0, + + 0, 327, 329, 327, 328, 327, 328, 0, 328, 0, + 327, 0, 329, 328, 329, 330, 329, 0, 0, 0, + 0, 329, 0, 331, 0, 330, 0, 330, 0, 330, + 0, 332, 0, 331, 330, 331, 0, 331, 332, 331, + 0, 332, 331, 332, 333, 332, 0, 0, 0, 0, + 332, 0, 334, 0, 333, 334, 333, 0, 333, 334, + 0, 0, 334, 333, 334, 335, 334, 335, 0, 0, + 0, 334, 0, 336, 0, 335, 336, 335, 0, 335, + 336, 337, 0, 336, 335, 336, 0, 336, 0, 338, + 0, 337, 336, 337, 0, 337, 0, 337, 0, 338, + + 337, 338, 0, 338, 339, 339, 0, 338, 338, 0, + 340, 0, 0, 0, 339, 0, 339, 0, 339, 0, + 340, 341, 340, 339, 340, 0, 0, 342, 340, 340, + 0, 341, 0, 341, 0, 341, 0, 342, 341, 342, + 341, 342, 343, 347, 0, 0, 342, 0, 0, 0, + 347, 0, 343, 347, 343, 347, 343, 347, 0, 0, + 349, 343, 347, 348, 348, 0, 348, 0, 0, 0, + 349, 0, 349, 348, 349, 348, 0, 348, 349, 349, + 351, 350, 348, 350, 0, 0, 0, 0, 0, 0, + 351, 350, 351, 350, 351, 350, 352, 0, 0, 351, + + 350, 0, 353, 0, 0, 353, 352, 0, 352, 0, + 352, 355, 353, 354, 353, 352, 353, 0, 356, 355, + 0, 353, 0, 354, 0, 354, 0, 354, 0, 355, + 354, 355, 354, 355, 356, 0, 0, 358, 355, 0, + 359, 0, 0, 0, 356, 0, 356, 358, 356, 358, + 359, 358, 359, 356, 359, 358, 358, 360, 362, 359, + 0, 0, 0, 0, 0, 0, 0, 360, 362, 360, + 362, 360, 362, 363, 362, 0, 360, 362, 0, 364, + 363, 0, 0, 363, 0, 363, 0, 363, 0, 364, + 365, 364, 363, 364, 0, 0, 0, 0, 364, 0, + + 365, 0, 365, 367, 365, 0, 368, 0, 365, 365, + 367, 0, 0, 367, 369, 367, 368, 367, 368, 369, + 368, 0, 367, 0, 369, 368, 369, 370, 369, 0, + 0, 0, 0, 369, 0, 0, 0, 370, 372, 370, + 0, 370, 0, 0, 374, 372, 370, 0, 372, 370, + 372, 0, 372, 0, 374, 0, 374, 372, 374, 375, + 376, 0, 375, 374, 0, 0, 0, 0, 0, 375, + 376, 375, 376, 375, 376, 378, 376, 0, 375, 376, + 0, 0, 383, 383, 383, 378, 0, 378, 0, 378, + 0, 0, 0, 386, 378, 383, 383, 383, 383, 383, + + 383, 383, 383, 386, 0, 386, 0, 386, 0, 387, + 387, 0, 386, 388, 0, 0, 390, 0, 0, 378, + 387, 0, 387, 388, 387, 388, 390, 388, 390, 387, + 390, 388, 388, 391, 392, 390, 0, 0, 0, 0, + 0, 0, 0, 391, 392, 391, 392, 391, 392, 0, + 0, 391, 391, 392, 393, 0, 0, 393, 0, 394, + 394, 0, 0, 0, 393, 0, 393, 0, 393, 0, + 394, 395, 394, 393, 394, 0, 0, 396, 0, 394, + 0, 395, 0, 395, 0, 395, 0, 396, 0, 396, + 395, 396, 397, 0, 397, 396, 396, 0, 398, 0, + + 0, 0, 397, 0, 397, 0, 397, 0, 398, 0, + 398, 397, 398, 0, 0, 399, 398, 398, 399, 0, + 0, 400, 0, 400, 0, 399, 0, 399, 0, 399, + 0, 400, 401, 400, 399, 400, 0, 402, 402, 0, + 400, 0, 401, 0, 401, 0, 401, 0, 402, 403, + 402, 401, 402, 0, 0, 404, 0, 402, 0, 403, + 0, 403, 404, 403, 0, 404, 405, 404, 403, 404, + 0, 0, 406, 0, 404, 0, 405, 0, 405, 406, + 405, 0, 406, 405, 406, 405, 406, 407, 407, 411, + 0, 406, 0, 411, 0, 0, 0, 0, 407, 411, + + 407, 411, 407, 411, 412, 0, 0, 407, 411, 0, + 413, 412, 413, 0, 412, 0, 412, 0, 412, 0, + 413, 414, 413, 412, 413, 0, 0, 415, 0, 413, + 415, 414, 0, 414, 0, 414, 0, 415, 414, 415, + 414, 415, 416, 416, 0, 0, 415, 0, 417, 417, + 0, 0, 416, 0, 416, 0, 416, 0, 417, 418, + 417, 416, 417, 0, 0, 0, 0, 417, 0, 418, + 0, 418, 0, 418, 419, 418, 0, 419, 418, 0, + 420, 0, 0, 0, 419, 0, 419, 0, 419, 0, + 420, 421, 420, 419, 420, 0, 0, 420, 421, 420, + + 0, 421, 423, 421, 0, 421, 0, 424, 424, 0, + 421, 0, 423, 0, 423, 0, 423, 0, 424, 426, + 424, 423, 424, 0, 0, 427, 0, 424, 0, 426, + 0, 426, 0, 426, 0, 427, 428, 427, 426, 427, + 0, 0, 0, 0, 427, 0, 428, 0, 428, 429, + 428, 0, 429, 0, 428, 428, 0, 431, 0, 429, + 0, 429, 0, 429, 0, 0, 0, 431, 429, 431, + 0, 431, 432, 432, 0, 433, 431, 431, 434, 0, + 0, 0, 432, 0, 432, 433, 432, 433, 434, 433, + 434, 432, 434, 436, 433, 436, 438, 434, 0, 439, + + 0, 0, 0, 436, 0, 436, 438, 436, 438, 439, + 438, 439, 436, 439, 0, 438, 439, 0, 439, 445, + 445, 445, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 445, 445, 445, 445, 445, 445, 445, 445, + 446, 0, 448, 0, 446, 446, 446, 446, 446, 446, + 446, 446, 448, 0, 448, 449, 448, 0, 451, 0, + 448, 448, 449, 0, 0, 449, 0, 449, 451, 449, + 451, 0, 451, 452, 449, 0, 452, 451, 0, 453, + 0, 0, 0, 452, 0, 452, 0, 452, 0, 453, + 454, 453, 452, 453, 0, 0, 455, 454, 453, 0, + + 454, 0, 454, 455, 454, 0, 455, 456, 455, 454, + 455, 0, 0, 457, 0, 455, 0, 456, 0, 456, + 0, 456, 0, 457, 458, 457, 456, 457, 0, 0, + 0, 458, 457, 0, 458, 459, 458, 459, 458, 0, + 0, 460, 0, 458, 0, 459, 0, 459, 0, 459, + 0, 460, 461, 460, 459, 460, 0, 461, 462, 0, + 460, 0, 461, 0, 461, 0, 461, 0, 462, 463, + 462, 461, 462, 0, 0, 0, 462, 462, 0, 463, + 464, 463, 0, 463, 0, 0, 465, 463, 463, 0, + 464, 0, 464, 0, 464, 0, 465, 466, 465, 464, + + 465, 0, 0, 470, 0, 465, 0, 466, 0, 466, + 470, 466, 0, 470, 471, 470, 466, 470, 0, 0, + 0, 0, 470, 0, 471, 472, 471, 0, 471, 0, + 0, 473, 471, 471, 0, 472, 0, 472, 0, 472, + 0, 473, 474, 473, 472, 473, 0, 0, 475, 0, + 473, 475, 474, 0, 474, 0, 474, 0, 475, 474, + 475, 474, 475, 476, 477, 0, 0, 475, 0, 0, + 0, 0, 0, 476, 477, 476, 477, 476, 477, 478, + 478, 476, 476, 477, 0, 479, 0, 0, 0, 478, + 0, 478, 0, 478, 0, 479, 480, 479, 478, 479, + + 0, 0, 482, 0, 479, 0, 480, 0, 480, 0, + 480, 0, 482, 484, 482, 480, 482, 0, 0, 0, + 0, 482, 0, 484, 485, 484, 0, 484, 485, 479, + 486, 0, 484, 0, 485, 0, 485, 0, 485, 0, + 486, 487, 486, 485, 486, 0, 0, 489, 0, 486, + 489, 487, 0, 487, 0, 487, 0, 489, 0, 489, + 487, 489, 490, 0, 0, 490, 489, 0, 492, 0, + 0, 492, 490, 0, 490, 0, 490, 0, 492, 0, + 492, 490, 492, 494, 494, 0, 0, 492, 0, 0, + 0, 500, 500, 500, 494, 0, 494, 0, 494, 0, + + 0, 0, 0, 494, 500, 500, 500, 500, 500, 500, + 500, 500, 502, 503, 503, 0, 0, 0, 0, 502, + 0, 0, 502, 503, 502, 503, 502, 503, 505, 0, + 0, 502, 503, 0, 0, 0, 506, 0, 505, 507, + 505, 0, 505, 0, 505, 0, 506, 505, 506, 507, + 506, 507, 508, 507, 506, 506, 0, 0, 507, 0, + 509, 0, 508, 0, 508, 511, 508, 0, 510, 0, + 509, 508, 509, 509, 509, 0, 0, 0, 510, 509, + 510, 511, 510, 0, 0, 0, 0, 510, 0, 512, + 0, 511, 512, 511, 0, 511, 0, 513, 0, 512, + + 511, 512, 0, 512, 0, 514, 0, 513, 512, 513, + 0, 513, 514, 515, 0, 514, 513, 514, 0, 514, + 0, 0, 0, 515, 514, 515, 520, 515, 0, 520, + 0, 0, 515, 0, 521, 0, 520, 522, 520, 0, + 520, 0, 0, 0, 521, 520, 521, 522, 521, 522, + 523, 522, 0, 521, 0, 0, 522, 0, 524, 0, + 523, 525, 523, 0, 523, 524, 0, 0, 524, 523, + 524, 525, 524, 525, 527, 525, 0, 524, 527, 525, + 525, 0, 529, 0, 527, 0, 527, 533, 527, 0, + 531, 0, 529, 527, 529, 0, 529, 531, 0, 0, + + 531, 529, 531, 533, 531, 0, 534, 0, 0, 531, + 0, 0, 0, 533, 536, 533, 534, 533, 534, 0, + 534, 0, 533, 0, 536, 534, 536, 538, 536, 0, + 0, 0, 0, 536, 543, 543, 543, 538, 0, 538, + 0, 538, 0, 0, 0, 546, 538, 543, 543, 543, + 543, 543, 543, 543, 543, 546, 547, 546, 546, 546, + 0, 0, 549, 0, 546, 0, 547, 0, 547, 0, + 547, 0, 549, 550, 549, 547, 549, 0, 0, 551, + 0, 549, 551, 550, 0, 550, 0, 550, 0, 551, + 550, 551, 550, 551, 552, 553, 0, 0, 551, 552, + + 0, 0, 0, 0, 552, 553, 552, 553, 552, 553, + 554, 554, 0, 552, 553, 0, 555, 0, 555, 0, + 554, 0, 554, 0, 554, 0, 555, 556, 555, 554, + 555, 0, 0, 561, 0, 555, 0, 556, 0, 556, + 0, 556, 0, 561, 562, 561, 556, 561, 0, 561, + 0, 0, 561, 0, 562, 563, 562, 562, 562, 0, + 0, 565, 563, 562, 0, 563, 0, 563, 565, 563, + 0, 565, 568, 565, 563, 565, 0, 0, 0, 0, + 565, 0, 568, 570, 568, 0, 568, 0, 0, 572, + 0, 568, 0, 570, 0, 570, 570, 570, 0, 572, + + 574, 572, 570, 572, 0, 0, 582, 572, 572, 0, + 574, 0, 574, 0, 574, 0, 582, 583, 582, 574, + 582, 0, 0, 0, 0, 582, 0, 583, 584, 583, + 584, 583, 0, 0, 585, 0, 583, 0, 584, 0, + 584, 0, 584, 0, 585, 586, 585, 584, 585, 0, + 0, 0, 0, 585, 0, 586, 587, 586, 0, 586, + 0, 0, 586, 0, 586, 0, 587, 588, 587, 587, + 587, 0, 0, 589, 0, 587, 0, 588, 0, 588, + 589, 588, 0, 589, 593, 589, 588, 589, 0, 0, + 594, 0, 589, 0, 593, 0, 593, 0, 593, 0, + + 594, 595, 594, 593, 594, 0, 0, 597, 0, 594, + 0, 595, 0, 595, 595, 595, 0, 597, 600, 597, + 595, 597, 0, 0, 602, 600, 597, 0, 600, 0, + 600, 602, 600, 0, 602, 603, 602, 600, 602, 0, + 0, 610, 603, 602, 0, 603, 0, 603, 0, 603, + 0, 610, 611, 610, 603, 610, 0, 0, 612, 0, + 610, 0, 611, 0, 611, 0, 611, 0, 612, 613, + 612, 611, 612, 0, 0, 614, 0, 612, 0, 613, + 0, 613, 0, 613, 0, 614, 618, 614, 613, 614, + 0, 0, 619, 614, 614, 0, 618, 0, 618, 0, + + 618, 0, 619, 618, 619, 618, 619, 621, 0, 0, + 624, 619, 0, 626, 621, 626, 0, 621, 0, 621, + 624, 621, 624, 626, 624, 626, 621, 626, 624, 624, + 627, 0, 626, 633, 627, 0, 634, 0, 0, 0, + 627, 0, 627, 633, 627, 633, 634, 633, 634, 627, + 634, 633, 633, 638, 639, 634, 0, 0, 0, 634, + 0, 0, 0, 638, 639, 638, 639, 638, 639, 641, + 644, 0, 638, 639, 0, 0, 0, 0, 0, 641, + 644, 641, 644, 641, 644, 646, 0, 641, 641, 644, + 0, 647, 0, 644, 0, 646, 0, 646, 647, 646, + + 0, 647, 653, 647, 646, 647, 0, 0, 0, 0, + 647, 0, 653, 654, 653, 0, 653, 0, 653, 658, + 0, 653, 0, 654, 0, 654, 0, 654, 0, 658, + 0, 658, 654, 658, 661, 0, 0, 663, 658, 0, + 663, 0, 658, 0, 661, 669, 661, 663, 661, 663, + 0, 663, 0, 661, 0, 669, 663, 669, 669, 669, + 671, 674, 0, 0, 669, 0, 0, 0, 0, 0, + 671, 674, 671, 674, 671, 674, 678, 674, 0, 671, + 674, 0, 682, 0, 0, 0, 678, 0, 678, 0, + 678, 0, 682, 685, 682, 678, 682, 0, 0, 0, + + 0, 682, 0, 685, 0, 685, 0, 685, 0, 0, + 0, 0, 685, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 689, 689, 689, 689, 690, 690, 690, + 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, + 690, 691, 691, 691, 691, 691, 691, 691, 691, 691, + 691, 691, 691, 691, 691, 692, 692, 692, 692, 692, + 692, 692, 692, 692, 692, 692, 692, 692, 692, 693, + 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, + 693, 693, 693, 694, 694, 694, 694, 694, 694, 694, + 694, 694, 694, 694, 694, 694, 694, 695, 695, 695, + + 0, 695, 695, 695, 695, 695, 695, 695, 695, 695, + 695, 696, 696, 0, 0, 696, 0, 0, 696, 0, + 696, 697, 697, 0, 697, 697, 698, 698, 0, 698, + 698, 698, 698, 0, 698, 698, 698, 698, 698, 698, + 699, 699, 699, 0, 699, 699, 699, 699, 699, 699, + 699, 699, 699, 699, 700, 700, 700, 700, 700, 700, + 700, 700, 700, 0, 700, 700, 701, 0, 0, 701, + 701, 701, 701, 701, 701, 701, 701, 701, 702, 0, + 0, 702, 702, 702, 702, 702, 702, 702, 702, 702, + 703, 0, 0, 703, 0, 703, 703, 703, 703, 703, + + 703, 703, 704, 704, 0, 704, 704, 705, 705, 0, + 705, 705, 706, 706, 0, 706, 706, 707, 707, 0, + 0, 0, 707, 0, 707, 0, 0, 0, 0, 707, + 708, 708, 0, 0, 0, 0, 0, 708, 0, 0, + 0, 0, 708, 688, 688, 688, 688, 688, 688, 688, + 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, + 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, + 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, + 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, + 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, + + 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, + 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, + 688, 688, 688 } ; extern int yy_flex_debug; int yy_flex_debug = 1; -static yyconst short int yy_rule_linenum[129] = +static yyconst short int yy_rule_linenum[130] = { 0, 103, 106, 108, 109, 110, 113, 115, 116, 117, 129, 136, 143, 149, 158, 166, 174, 175, 177, 196, 202, @@ -1718,7 +1787,7 @@ static yyconst short int yy_rule_linenum[129] = 336, 337, 338, 339, 340, 341, 342, 347, 348, 353, 354, 355, 358, 364, 371, 380, 391, 397, 399, 400, - 402, 404, 406, 419, 425, 431, 438, 440 + 404, 410, 416, 424, 427, 452, 496, 498, 509 } ; static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; @@ -1832,7 +1901,7 @@ static asn1c_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */ /* Newline */ /* White-space */ -#line 1836 "asn1p_l.c" +#line 1905 "asn1p_l.c" /* Macros after this point can all be overridden by user definitions in * section 1. @@ -1986,7 +2055,7 @@ YY_DECL #line 101 "asn1p_l.l" -#line 1990 "asn1p_l.c" +#line 2059 "asn1p_l.c" if ( yy_init ) { @@ -2034,14 +2103,14 @@ YY_DECL while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 671 ) + if ( yy_current_state >= 689 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *yy_state_ptr++ = yy_current_state; ++yy_cp; } - while ( yy_base[yy_current_state] != 4266 ); + while ( yy_base[yy_current_state] != 4544 ); yy_find_action: yy_current_state = *--yy_state_ptr; @@ -2078,13 +2147,13 @@ YY_DECL { if ( yy_act == 0 ) fprintf( stderr, "--scanner backing up\n" ); - else if ( yy_act < 129 ) + else if ( yy_act < 130 ) fprintf( stderr, "--accepting rule at line %d (\"%s\")\n", yy_rule_linenum[yy_act], yytext ); - else if ( yy_act == 129 ) + else if ( yy_act == 130 ) fprintf( stderr, "--accepting default rule (\"%s\")\n", yytext ); - else if ( yy_act == 130 ) + else if ( yy_act == 131 ) fprintf( stderr, "--(end of buffer or a NUL)\n" ); else fprintf( stderr, "--EOF (start condition %d)\n", YY_START ); @@ -2838,66 +2907,135 @@ YY_RULE_SETUP #line 400 "asn1p_l.l" return TOK_TwoDots; YY_BREAK + case 121: YY_RULE_SETUP -#line 402 "asn1p_l.l" -/* Ignore whitespace */ - YY_BREAK -case 122: -YY_RULE_SETUP #line 404 "asn1p_l.l" -return yytext[0]; - YY_BREAK -case 123: -YY_RULE_SETUP -#line 406 "asn1p_l.l" -{ - if(TYPE_LIFETIME(1994, 0)) - fprintf(stderr, "ERROR: "); - fprintf(stderr, - "Symbol '%c' at line %d is prohibited " - "by ASN.1:1994 and ASN.1:1997\n", - yytext[0], yylineno); - if(TYPE_LIFETIME(1994, 0)) - return -1; - } - YY_BREAK - -case 124: -YY_RULE_SETUP -#line 419 "asn1p_l.l" { asn1p_lval.tv_opaque.buf = strdup(yytext); asn1p_lval.tv_opaque.len = yyleng; return TOK_opaque; } YY_BREAK -case 125: +case 122: YY_RULE_SETUP -#line 425 "asn1p_l.l" +#line 410 "asn1p_l.l" { asn1p_lval.tv_opaque.buf = strdup(yytext); asn1p_lval.tv_opaque.len = yyleng; return TOK_opaque; } YY_BREAK -case 126: +case 123: YY_RULE_SETUP -#line 431 "asn1p_l.l" +#line 416 "asn1p_l.l" { yy_pop_state(); return '}'; } YY_BREAK +case 124: +YY_RULE_SETUP +#line 424 "asn1p_l.l" +/* Ignore whitespace */ + YY_BREAK +case 125: +YY_RULE_SETUP +#line 427 "asn1p_l.l" +{ + asn1c_integer_t v1 = -1, v2 = -1; + char *p; + for(p = yytext; *p; p++) + if(*p >= '0' && *p <= '9') + { v1 = asn1p_atoi(p); break; } + while(*p >= '0' && *p <= '9') p++; /* Skip digits */ + for(; *p; p++) if(*p >= '0' && *p <= '9') + { v2 = asn1p_atoi(p); break; } + if(v1 < 0 || v1 > 7) { + fprintf(stderr, "%s at line %d: X.680:2003, #37.14 " + "mandates 0..7 range for Tuple's TableColumn\n", + yytext, yylineno); + return -1; + } + if(v2 < 0 || v2 > 15) { + fprintf(stderr, "%s at line %d: X.680:2003, #37.14 " + "mandates 0..15 range for Tuple's TableRow\n", + yytext, yylineno); + return -1; + } + asn1p_lval.a_int = (v1 << 4) + v2; + return TOK_tuple; + } + YY_BREAK +case 126: +YY_RULE_SETUP +#line 452 "asn1p_l.l" +{ + asn1c_integer_t v1 = -1, v2 = -1, v3 = -1, v4 = -1; + char *p; + for(p = yytext; *p; p++) + if(*p >= '0' && *p <= '9') + { v1 = asn1p_atoi(p); break; } + while(*p >= '0' && *p <= '9') p++; /* Skip digits */ + for(; *p; p++) if(*p >= '0' && *p <= '9') + { v2 = asn1p_atoi(p); break; } + while(*p >= '0' && *p <= '9') p++; + for(; *p; p++) if(*p >= '0' && *p <= '9') + { v3 = asn1p_atoi(p); break; } + while(*p >= '0' && *p <= '9') p++; + for(; *p; p++) if(*p >= '0' && *p <= '9') + { v4 = asn1p_atoi(p); break; } + if(v1 < 0 || v1 > 127) { + fprintf(stderr, "%s at line %d: X.680:2003, #37.12 " + "mandates 0..127 range for Quadruple's Group\n", + yytext, yylineno); + return -1; + } + if(v2 < 0 || v2 > 255) { + fprintf(stderr, "%s at line %d: X.680:2003, #37.12 " + "mandates 0..255 range for Quadruple's Plane\n", + yytext, yylineno); + return -1; + } + if(v3 < 0 || v3 > 255) { + fprintf(stderr, "%s at line %d: X.680:2003, #37.12 " + "mandates 0..255 range for Quadruple's Row\n", + yytext, yylineno); + return -1; + } + if(v4 < 0 || v4 > 255) { + fprintf(stderr, "%s at line %d: X.680:2003, #37.12 " + "mandates 0..255 range for Quadruple's Cell\n", + yytext, yylineno); + return -1; + } + asn1p_lval.a_int = (v1 << 24) | (v2 << 16) | (v3 << 8) | v4; + return TOK_quadruple; + } + YY_BREAK case 127: YY_RULE_SETUP -#line 438 "asn1p_l.l" -return yytext[0]; /* Union, Intersection */ +#line 496 "asn1p_l.l" +return yytext[0]; YY_BREAK case 128: YY_RULE_SETUP -#line 440 "asn1p_l.l" +#line 498 "asn1p_l.l" +{ + if(TYPE_LIFETIME(1994, 0)) + fprintf(stderr, "ERROR: "); + fprintf(stderr, + "Symbol '%c' at line %d is prohibited " + "by ASN.1:1994 and ASN.1:1997\n", + yytext[0], yylineno); + if(TYPE_LIFETIME(1994, 0)) + return -1; + } + YY_BREAK +case 129: +YY_RULE_SETUP +#line 509 "asn1p_l.l" { fprintf(stderr, "Unexpected token at line %d: \"%s\"\n", @@ -2918,19 +3056,19 @@ case YY_STATE_EOF(quoted): case YY_STATE_EOF(opaque): case YY_STATE_EOF(encoding_control): case YY_STATE_EOF(with_syntax): -#line 453 "asn1p_l.l" +#line 522 "asn1p_l.l" { while(YYSTATE != INITIAL) yy_pop_state(); yyterminate(); } YY_BREAK -case 129: +case 130: YY_RULE_SETUP -#line 460 "asn1p_l.l" +#line 529 "asn1p_l.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK -#line 2934 "asn1p_l.c" +#line 3072 "asn1p_l.c" case YY_END_OF_BUFFER: { @@ -3217,7 +3355,7 @@ static yy_state_type yy_get_previous_state() while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 671 ) + if ( yy_current_state >= 689 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -3247,11 +3385,11 @@ yy_state_type yy_current_state; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 671 ) + if ( yy_current_state >= 689 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 670); + yy_is_jam = (yy_current_state == 688); if ( ! yy_is_jam ) *yy_state_ptr++ = yy_current_state; @@ -3812,7 +3950,7 @@ int main() return 0; } #endif -#line 460 "asn1p_l.l" +#line 529 "asn1p_l.l" /* diff --git a/libasn1parser/asn1p_l.l b/libasn1parser/asn1p_l.l index 50a786c97..458d66546 100644 --- a/libasn1parser/asn1p_l.l +++ b/libasn1parser/asn1p_l.l @@ -399,21 +399,6 @@ WITH return TOK_WITH; "..." return TOK_ThreeDots; ".." return TOK_TwoDots; -{WSP}+ /* Ignore whitespace */ - -[(){},;:|!.&@\[\]] return yytext[0]; - -[^A-Za-z0-9:=,{}<.@()[]'\"|&^*;!-] { - if(TYPE_LIFETIME(1994, 0)) - fprintf(stderr, "ERROR: "); - fprintf(stderr, - "Symbol '%c' at line %d is prohibited " - "by ASN.1:1994 and ASN.1:1997\n", - yytext[0], yylineno); - if(TYPE_LIFETIME(1994, 0)) - return -1; - } - { [^&{} \t\r\v\f\n]+ { @@ -435,7 +420,91 @@ WITH return TOK_WITH; } -[|^] return yytext[0]; /* Union, Intersection */ + +{WSP}+ /* Ignore whitespace */ + + +[{][\t\r\v\f\n ]*[0-7][,][\t\r\v\f\n ]*[0-9]+[\t\r\v\f\n ]*[}] { + asn1c_integer_t v1 = -1, v2 = -1; + char *p; + for(p = yytext; *p; p++) + if(*p >= '0' && *p <= '9') + { v1 = asn1p_atoi(p); break; } + while(*p >= '0' && *p <= '9') p++; /* Skip digits */ + for(; *p; p++) if(*p >= '0' && *p <= '9') + { v2 = asn1p_atoi(p); break; } + if(v1 < 0 || v1 > 7) { + fprintf(stderr, "%s at line %d: X.680:2003, #37.14 " + "mandates 0..7 range for Tuple's TableColumn\n", + yytext, yylineno); + return -1; + } + if(v2 < 0 || v2 > 15) { + fprintf(stderr, "%s at line %d: X.680:2003, #37.14 " + "mandates 0..15 range for Tuple's TableRow\n", + yytext, yylineno); + return -1; + } + asn1p_lval.a_int = (v1 << 4) + v2; + return TOK_tuple; + } + +[{][\t\r\v\f\n ]*[0-9]+[,][\t\r\v\f\n ]*[0-9]+[,][\t\r\v\f\n ]*[0-9]+[,][\t\r\v\f\n ]*[0-9]+[\t\r\v\f\n ]*[}] { + asn1c_integer_t v1 = -1, v2 = -1, v3 = -1, v4 = -1; + char *p; + for(p = yytext; *p; p++) + if(*p >= '0' && *p <= '9') + { v1 = asn1p_atoi(p); break; } + while(*p >= '0' && *p <= '9') p++; /* Skip digits */ + for(; *p; p++) if(*p >= '0' && *p <= '9') + { v2 = asn1p_atoi(p); break; } + while(*p >= '0' && *p <= '9') p++; + for(; *p; p++) if(*p >= '0' && *p <= '9') + { v3 = asn1p_atoi(p); break; } + while(*p >= '0' && *p <= '9') p++; + for(; *p; p++) if(*p >= '0' && *p <= '9') + { v4 = asn1p_atoi(p); break; } + if(v1 < 0 || v1 > 127) { + fprintf(stderr, "%s at line %d: X.680:2003, #37.12 " + "mandates 0..127 range for Quadruple's Group\n", + yytext, yylineno); + return -1; + } + if(v2 < 0 || v2 > 255) { + fprintf(stderr, "%s at line %d: X.680:2003, #37.12 " + "mandates 0..255 range for Quadruple's Plane\n", + yytext, yylineno); + return -1; + } + if(v3 < 0 || v3 > 255) { + fprintf(stderr, "%s at line %d: X.680:2003, #37.12 " + "mandates 0..255 range for Quadruple's Row\n", + yytext, yylineno); + return -1; + } + if(v4 < 0 || v4 > 255) { + fprintf(stderr, "%s at line %d: X.680:2003, #37.12 " + "mandates 0..255 range for Quadruple's Cell\n", + yytext, yylineno); + return -1; + } + asn1p_lval.a_int = (v1 << 24) | (v2 << 16) | (v3 << 8) | v4; + return TOK_quadruple; + } + + +[(){},;:|!.&@\[\]^] return yytext[0]; + +[^A-Za-z0-9:=,{}<.@()[]'\"|&^*;!-] { + if(TYPE_LIFETIME(1994, 0)) + fprintf(stderr, "ERROR: "); + fprintf(stderr, + "Symbol '%c' at line %d is prohibited " + "by ASN.1:1994 and ASN.1:1997\n", + yytext[0], yylineno); + if(TYPE_LIFETIME(1994, 0)) + return -1; + } <*>. { fprintf(stderr, diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index 353c4fa44..1f90ec350 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -18,97 +18,99 @@ #define TOK_hstring 261 #define TOK_identifier 262 #define TOK_number 263 -#define TOK_number_negative 264 -#define TOK_typereference 265 -#define TOK_capitalreference 266 -#define TOK_typefieldreference 267 -#define TOK_valuefieldreference 268 -#define TOK_ABSENT 269 -#define TOK_ABSTRACT_SYNTAX 270 -#define TOK_ALL 271 -#define TOK_ANY 272 -#define TOK_APPLICATION 273 -#define TOK_AUTOMATIC 274 -#define TOK_BEGIN 275 -#define TOK_BIT 276 -#define TOK_BMPString 277 -#define TOK_BOOLEAN 278 -#define TOK_BY 279 -#define TOK_CHARACTER 280 -#define TOK_CHOICE 281 -#define TOK_CLASS 282 -#define TOK_COMPONENT 283 -#define TOK_COMPONENTS 284 -#define TOK_CONSTRAINED 285 -#define TOK_CONTAINING 286 -#define TOK_DEFAULT 287 -#define TOK_DEFINITIONS 288 -#define TOK_DEFINED 289 -#define TOK_EMBEDDED 290 -#define TOK_ENCODED 291 -#define TOK_ENCODING_CONTROL 292 -#define TOK_END 293 -#define TOK_ENUMERATED 294 -#define TOK_EXPLICIT 295 -#define TOK_EXPORTS 296 -#define TOK_EXTENSIBILITY 297 -#define TOK_EXTERNAL 298 -#define TOK_FALSE 299 -#define TOK_FROM 300 -#define TOK_GeneralizedTime 301 -#define TOK_GeneralString 302 -#define TOK_GraphicString 303 -#define TOK_IA5String 304 -#define TOK_IDENTIFIER 305 -#define TOK_IMPLICIT 306 -#define TOK_IMPLIED 307 -#define TOK_IMPORTS 308 -#define TOK_INCLUDES 309 -#define TOK_INSTANCE 310 -#define TOK_INSTRUCTIONS 311 -#define TOK_INTEGER 312 -#define TOK_ISO646String 313 -#define TOK_MAX 314 -#define TOK_MIN 315 -#define TOK_MINUS_INFINITY 316 -#define TOK_NULL 317 -#define TOK_NumericString 318 -#define TOK_OBJECT 319 -#define TOK_ObjectDescriptor 320 -#define TOK_OCTET 321 -#define TOK_OF 322 -#define TOK_OPTIONAL 323 -#define TOK_PATTERN 324 -#define TOK_PDV 325 -#define TOK_PLUS_INFINITY 326 -#define TOK_PRESENT 327 -#define TOK_PrintableString 328 -#define TOK_PRIVATE 329 -#define TOK_REAL 330 -#define TOK_RELATIVE_OID 331 -#define TOK_SEQUENCE 332 -#define TOK_SET 333 -#define TOK_SIZE 334 -#define TOK_STRING 335 -#define TOK_SYNTAX 336 -#define TOK_T61String 337 -#define TOK_TAGS 338 -#define TOK_TeletexString 339 -#define TOK_TRUE 340 -#define TOK_TYPE_IDENTIFIER 341 -#define TOK_UNIQUE 342 -#define TOK_UNIVERSAL 343 -#define TOK_UniversalString 344 -#define TOK_UTCTime 345 -#define TOK_UTF8String 346 -#define TOK_VideotexString 347 -#define TOK_VisibleString 348 -#define TOK_WITH 349 -#define TOK_EXCEPT 350 -#define TOK_INTERSECTION 351 -#define TOK_UNION 352 -#define TOK_TwoDots 353 -#define TOK_ThreeDots 354 +#define TOK_tuple 264 +#define TOK_quadruple 265 +#define TOK_number_negative 266 +#define TOK_typereference 267 +#define TOK_capitalreference 268 +#define TOK_typefieldreference 269 +#define TOK_valuefieldreference 270 +#define TOK_ABSENT 271 +#define TOK_ABSTRACT_SYNTAX 272 +#define TOK_ALL 273 +#define TOK_ANY 274 +#define TOK_APPLICATION 275 +#define TOK_AUTOMATIC 276 +#define TOK_BEGIN 277 +#define TOK_BIT 278 +#define TOK_BMPString 279 +#define TOK_BOOLEAN 280 +#define TOK_BY 281 +#define TOK_CHARACTER 282 +#define TOK_CHOICE 283 +#define TOK_CLASS 284 +#define TOK_COMPONENT 285 +#define TOK_COMPONENTS 286 +#define TOK_CONSTRAINED 287 +#define TOK_CONTAINING 288 +#define TOK_DEFAULT 289 +#define TOK_DEFINITIONS 290 +#define TOK_DEFINED 291 +#define TOK_EMBEDDED 292 +#define TOK_ENCODED 293 +#define TOK_ENCODING_CONTROL 294 +#define TOK_END 295 +#define TOK_ENUMERATED 296 +#define TOK_EXPLICIT 297 +#define TOK_EXPORTS 298 +#define TOK_EXTENSIBILITY 299 +#define TOK_EXTERNAL 300 +#define TOK_FALSE 301 +#define TOK_FROM 302 +#define TOK_GeneralizedTime 303 +#define TOK_GeneralString 304 +#define TOK_GraphicString 305 +#define TOK_IA5String 306 +#define TOK_IDENTIFIER 307 +#define TOK_IMPLICIT 308 +#define TOK_IMPLIED 309 +#define TOK_IMPORTS 310 +#define TOK_INCLUDES 311 +#define TOK_INSTANCE 312 +#define TOK_INSTRUCTIONS 313 +#define TOK_INTEGER 314 +#define TOK_ISO646String 315 +#define TOK_MAX 316 +#define TOK_MIN 317 +#define TOK_MINUS_INFINITY 318 +#define TOK_NULL 319 +#define TOK_NumericString 320 +#define TOK_OBJECT 321 +#define TOK_ObjectDescriptor 322 +#define TOK_OCTET 323 +#define TOK_OF 324 +#define TOK_OPTIONAL 325 +#define TOK_PATTERN 326 +#define TOK_PDV 327 +#define TOK_PLUS_INFINITY 328 +#define TOK_PRESENT 329 +#define TOK_PrintableString 330 +#define TOK_PRIVATE 331 +#define TOK_REAL 332 +#define TOK_RELATIVE_OID 333 +#define TOK_SEQUENCE 334 +#define TOK_SET 335 +#define TOK_SIZE 336 +#define TOK_STRING 337 +#define TOK_SYNTAX 338 +#define TOK_T61String 339 +#define TOK_TAGS 340 +#define TOK_TeletexString 341 +#define TOK_TRUE 342 +#define TOK_TYPE_IDENTIFIER 343 +#define TOK_UNIQUE 344 +#define TOK_UNIVERSAL 345 +#define TOK_UniversalString 346 +#define TOK_UTCTime 347 +#define TOK_UTF8String 348 +#define TOK_VideotexString 349 +#define TOK_VisibleString 350 +#define TOK_WITH 351 +#define TOK_EXCEPT 352 +#define TOK_INTERSECTION 353 +#define TOK_UNION 354 +#define TOK_TwoDots 355 +#define TOK_ThreeDots 356 #line 1 "asn1p_y.y" @@ -204,26 +206,26 @@ typedef union { -#define YYFINAL 437 +#define YYFINAL 429 #define YYFLAG -32768 -#define YYNTBASE 116 +#define YYNTBASE 118 -#define YYTRANSLATE(x) ((unsigned)(x) <= 354 ? yytranslate[x] : 220) +#define YYTRANSLATE(x) ((unsigned)(x) <= 356 ? yytranslate[x] : 222) static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 110, 2, 2, 2, 2, 2, 2, 105, - 106, 2, 2, 108, 2, 111, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 109, 107, 112, - 2, 2, 2, 113, 2, 2, 2, 2, 2, 2, + 2, 2, 112, 2, 2, 2, 2, 2, 2, 107, + 108, 2, 2, 110, 2, 113, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 111, 109, 114, + 2, 2, 2, 115, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 114, 2, 115, 97, 2, 2, 2, 2, 2, 2, + 116, 2, 117, 99, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 103, 99, 104, 2, 2, 2, 2, 2, + 2, 2, 105, 101, 106, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -246,7 +248,7 @@ static const char yytranslate[] = { 0, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 98, 100, 101, 102 + 97, 98, 100, 102, 103, 104 }; #if YYDEBUG != 0 @@ -265,136 +267,134 @@ static const short yyprhs[] = { 0, 327, 334, 341, 343, 348, 353, 355, 359, 361, 365, 369, 373, 375, 379, 381, 385, 387, 389, 391, 393, 398, 402, 403, 407, 409, 411, 413, 415, 417, 419, - 421, 423, 425, 429, 431, 437, 447, 449, 452, 454, - 456, 458, 460, 463, 466, 468, 470, 473, 476, 478, - 480, 482, 484, 486, 489, 491, 494, 496, 498, 500, - 502, 504, 506, 508, 510, 512, 514, 516, 518, 520, - 522, 524, 526, 528, 530, 532, 533, 535, 537, 542, - 546, 551, 553, 557, 563, 565, 569, 573, 577, 581, - 586, 590, 592, 594, 598, 602, 606, 610, 612, 614, - 615, 621, 623, 626, 629, 633, 635, 637, 639, 641, - 643, 645, 647, 649, 655, 657, 661, 663, 667, 668, - 670, 672, 674, 676, 678, 680, 684, 689, 691, 695, - 698, 702, 704, 708, 709, 711, 713, 716, 719, 723, - 725, 729, 731, 736, 741, 743, 745, 747, 749, 750, - 752, 755, 760, 761, 763, 765, 767, 768, 770, 772, - 774, 776, 778, 779, 781 + 421, 423, 425, 429, 431, 433, 435, 437, 440, 442, + 444, 446, 448, 451, 454, 456, 458, 461, 464, 466, + 468, 470, 472, 474, 477, 479, 482, 484, 486, 488, + 490, 492, 494, 496, 498, 500, 502, 504, 506, 508, + 510, 512, 514, 516, 518, 520, 521, 523, 525, 530, + 534, 539, 541, 545, 551, 553, 557, 561, 565, 569, + 574, 578, 580, 582, 586, 590, 594, 598, 600, 602, + 603, 609, 611, 614, 617, 621, 623, 625, 627, 629, + 631, 633, 635, 637, 643, 645, 649, 651, 655, 656, + 658, 660, 662, 664, 666, 668, 672, 677, 679, 683, + 686, 690, 692, 696, 697, 699, 701, 704, 707, 711, + 713, 717, 719, 724, 729, 731, 733, 735, 737, 738, + 740, 743, 748, 749, 751, 753, 755, 756, 758, 760, + 762, 764, 766, 767, 769 }; -static const short yyrhs[] = { 117, - 0, 118, 0, 117, 118, 0, 216, 119, 34, 123, - 3, 21, 126, 39, 0, 0, 120, 0, 103, 121, - 104, 0, 103, 104, 0, 122, 0, 121, 122, 0, - 219, 0, 219, 105, 9, 106, 0, 9, 0, 0, - 124, 0, 125, 0, 124, 125, 0, 41, 84, 0, - 52, 84, 0, 20, 84, 0, 43, 53, 0, 12, - 57, 0, 0, 127, 0, 128, 0, 127, 128, 0, - 130, 0, 135, 0, 143, 0, 170, 0, 138, 0, - 0, 38, 12, 129, 0, 179, 0, 54, 131, 107, - 0, 54, 46, 0, 132, 0, 131, 132, 0, 133, - 46, 216, 119, 0, 134, 0, 133, 108, 134, 0, - 216, 0, 216, 103, 104, 0, 219, 0, 42, 136, - 107, 0, 42, 17, 107, 0, 42, 107, 0, 137, - 0, 136, 108, 137, 0, 216, 0, 216, 103, 104, - 0, 219, 0, 216, 139, 3, 103, 140, 104, 0, - 165, 0, 176, 0, 0, 141, 0, 142, 0, 141, - 108, 142, 0, 102, 0, 187, 0, 216, 3, 211, - 87, 0, 216, 3, 163, 0, 216, 3, 153, 0, - 216, 103, 144, 104, 3, 163, 0, 145, 0, 144, - 108, 145, 0, 216, 0, 216, 109, 219, 0, 216, - 109, 216, 0, 176, 109, 219, 0, 147, 0, 146, - 108, 147, 0, 163, 0, 219, 0, 0, 149, 0, - 150, 0, 149, 108, 150, 0, 219, 163, 205, 0, - 30, 68, 163, 0, 162, 0, 152, 0, 151, 108, - 152, 0, 219, 163, 0, 162, 0, 28, 103, 155, - 104, 157, 0, 0, 88, 0, 156, 0, 155, 108, - 156, 0, 168, 205, 0, 168, 163, 154, 205, 0, - 168, 168, 154, 205, 0, 0, 158, 0, 0, 95, - 82, 103, 159, 160, 104, 0, 161, 0, 160, 161, - 0, 4, 0, 168, 0, 102, 0, 102, 110, 173, - 0, 102, 110, 210, 0, 211, 164, 183, 0, 178, - 0, 27, 103, 151, 104, 0, 78, 103, 148, 104, - 0, 79, 103, 148, 104, 0, 78, 183, 68, 218, - 211, 164, 0, 79, 183, 68, 218, 211, 164, 0, - 18, 0, 18, 35, 25, 219, 0, 216, 103, 146, - 104, 0, 165, 0, 56, 68, 165, 0, 11, 0, - 11, 111, 216, 0, 217, 111, 216, 0, 11, 111, - 219, 0, 217, 0, 217, 111, 166, 0, 167, 0, - 166, 111, 167, 0, 169, 0, 169, 0, 13, 0, - 14, 0, 219, 139, 3, 171, 0, 219, 109, 171, - 0, 0, 103, 172, 175, 0, 63, 0, 45, 0, - 86, 0, 5, 0, 7, 0, 174, 0, 210, 0, - 173, 0, 219, 0, 216, 111, 219, 0, 6, 0, - 103, 9, 108, 9, 104, 0, 103, 9, 108, 9, - 108, 9, 108, 9, 104, 0, 4, 0, 175, 4, - 0, 24, 0, 63, 0, 76, 0, 177, 0, 67, - 81, 0, 65, 51, 0, 77, 0, 44, 0, 36, - 71, 0, 26, 81, 0, 91, 0, 47, 0, 179, - 0, 58, 0, 40, 0, 22, 81, 0, 176, 0, - 177, 207, 0, 23, 0, 48, 0, 49, 0, 50, - 0, 59, 0, 64, 0, 74, 0, 83, 0, 85, - 0, 90, 0, 92, 0, 93, 0, 94, 0, 66, - 0, 99, 0, 100, 0, 97, 0, 98, 0, 96, - 0, 0, 184, 0, 185, 0, 80, 105, 186, 106, - 0, 105, 186, 106, 0, 185, 105, 186, 106, 0, - 187, 0, 187, 108, 102, 0, 187, 108, 102, 108, - 187, 0, 188, 0, 17, 96, 188, 0, 187, 180, - 188, 0, 187, 181, 188, 0, 188, 182, 188, 0, - 191, 105, 186, 106, 0, 105, 186, 106, 0, 192, - 0, 193, 0, 192, 190, 192, 0, 61, 190, 192, - 0, 192, 190, 60, 0, 61, 190, 60, 0, 199, - 0, 194, 0, 0, 31, 25, 103, 189, 175, 0, - 101, 0, 101, 112, 0, 112, 101, 0, 112, 101, - 112, 0, 80, 0, 46, 0, 45, 0, 86, 0, - 210, 0, 174, 0, 219, 0, 216, 0, 95, 30, - 103, 195, 104, 0, 196, 0, 195, 108, 196, 0, - 102, 0, 219, 183, 197, 0, 0, 198, 0, 73, - 0, 15, 0, 69, 0, 200, 0, 201, 0, 103, - 216, 104, 0, 200, 103, 202, 104, 0, 203, 0, - 202, 108, 203, 0, 113, 204, 0, 113, 111, 204, - 0, 219, 0, 204, 111, 219, 0, 0, 206, 0, - 69, 0, 33, 171, 0, 103, 104, 0, 103, 208, - 104, 0, 209, 0, 208, 108, 209, 0, 219, 0, - 219, 105, 210, 106, 0, 219, 105, 173, 106, 0, - 210, 0, 102, 0, 9, 0, 10, 0, 0, 212, - 0, 213, 215, 0, 114, 214, 9, 115, 0, 0, - 89, 0, 19, 0, 75, 0, 0, 52, 0, 41, - 0, 11, 0, 12, 0, 12, 0, 0, 219, 0, - 8, 0 +static const short yyrhs[] = { 119, + 0, 120, 0, 119, 120, 0, 218, 121, 36, 125, + 3, 23, 128, 41, 0, 0, 122, 0, 105, 123, + 106, 0, 105, 106, 0, 124, 0, 123, 124, 0, + 221, 0, 221, 107, 9, 108, 0, 9, 0, 0, + 126, 0, 127, 0, 126, 127, 0, 43, 86, 0, + 54, 86, 0, 22, 86, 0, 45, 55, 0, 14, + 59, 0, 0, 129, 0, 130, 0, 129, 130, 0, + 132, 0, 137, 0, 145, 0, 172, 0, 140, 0, + 0, 40, 14, 131, 0, 181, 0, 56, 133, 109, + 0, 56, 48, 0, 134, 0, 133, 134, 0, 135, + 48, 218, 121, 0, 136, 0, 135, 110, 136, 0, + 218, 0, 218, 105, 106, 0, 221, 0, 44, 138, + 109, 0, 44, 19, 109, 0, 44, 109, 0, 139, + 0, 138, 110, 139, 0, 218, 0, 218, 105, 106, + 0, 221, 0, 218, 141, 3, 105, 142, 106, 0, + 167, 0, 178, 0, 0, 143, 0, 144, 0, 143, + 110, 144, 0, 104, 0, 189, 0, 218, 3, 213, + 89, 0, 218, 3, 165, 0, 218, 3, 155, 0, + 218, 105, 146, 106, 3, 165, 0, 147, 0, 146, + 110, 147, 0, 218, 0, 218, 111, 221, 0, 218, + 111, 218, 0, 178, 111, 221, 0, 149, 0, 148, + 110, 149, 0, 165, 0, 221, 0, 0, 151, 0, + 152, 0, 151, 110, 152, 0, 221, 165, 207, 0, + 32, 70, 165, 0, 164, 0, 154, 0, 153, 110, + 154, 0, 221, 165, 0, 164, 0, 30, 105, 157, + 106, 159, 0, 0, 90, 0, 158, 0, 157, 110, + 158, 0, 170, 207, 0, 170, 165, 156, 207, 0, + 170, 170, 156, 207, 0, 0, 160, 0, 0, 97, + 84, 105, 161, 162, 106, 0, 163, 0, 162, 163, + 0, 4, 0, 170, 0, 104, 0, 104, 112, 175, + 0, 104, 112, 212, 0, 213, 166, 185, 0, 180, + 0, 29, 105, 153, 106, 0, 80, 105, 150, 106, + 0, 81, 105, 150, 106, 0, 80, 185, 70, 220, + 213, 166, 0, 81, 185, 70, 220, 213, 166, 0, + 20, 0, 20, 37, 27, 221, 0, 218, 105, 148, + 106, 0, 167, 0, 58, 70, 167, 0, 13, 0, + 13, 113, 218, 0, 219, 113, 218, 0, 13, 113, + 221, 0, 219, 0, 219, 113, 168, 0, 169, 0, + 168, 113, 169, 0, 171, 0, 171, 0, 15, 0, + 16, 0, 221, 141, 3, 173, 0, 221, 111, 173, + 0, 0, 105, 174, 177, 0, 65, 0, 47, 0, + 88, 0, 5, 0, 7, 0, 176, 0, 212, 0, + 175, 0, 221, 0, 218, 113, 221, 0, 6, 0, + 10, 0, 11, 0, 4, 0, 177, 4, 0, 26, + 0, 65, 0, 78, 0, 179, 0, 69, 83, 0, + 67, 53, 0, 79, 0, 46, 0, 38, 73, 0, + 28, 83, 0, 93, 0, 49, 0, 181, 0, 60, + 0, 42, 0, 24, 83, 0, 178, 0, 179, 209, + 0, 25, 0, 50, 0, 51, 0, 52, 0, 61, + 0, 66, 0, 76, 0, 85, 0, 87, 0, 92, + 0, 94, 0, 95, 0, 96, 0, 68, 0, 101, + 0, 102, 0, 99, 0, 100, 0, 98, 0, 0, + 186, 0, 187, 0, 82, 107, 188, 108, 0, 107, + 188, 108, 0, 187, 107, 188, 108, 0, 189, 0, + 189, 110, 104, 0, 189, 110, 104, 110, 189, 0, + 190, 0, 19, 98, 190, 0, 189, 182, 190, 0, + 189, 183, 190, 0, 190, 184, 190, 0, 193, 107, + 188, 108, 0, 107, 188, 108, 0, 194, 0, 195, + 0, 194, 192, 194, 0, 63, 192, 194, 0, 194, + 192, 62, 0, 63, 192, 62, 0, 201, 0, 196, + 0, 0, 33, 27, 105, 191, 177, 0, 103, 0, + 103, 114, 0, 114, 103, 0, 114, 103, 114, 0, + 82, 0, 48, 0, 47, 0, 88, 0, 212, 0, + 176, 0, 221, 0, 218, 0, 97, 32, 105, 197, + 106, 0, 198, 0, 197, 110, 198, 0, 104, 0, + 221, 185, 199, 0, 0, 200, 0, 75, 0, 17, + 0, 71, 0, 202, 0, 203, 0, 105, 218, 106, + 0, 202, 105, 204, 106, 0, 205, 0, 204, 110, + 205, 0, 115, 206, 0, 115, 113, 206, 0, 221, + 0, 206, 113, 221, 0, 0, 208, 0, 71, 0, + 35, 173, 0, 105, 106, 0, 105, 210, 106, 0, + 211, 0, 210, 110, 211, 0, 221, 0, 221, 107, + 212, 108, 0, 221, 107, 175, 108, 0, 212, 0, + 104, 0, 9, 0, 12, 0, 0, 214, 0, 215, + 217, 0, 116, 216, 9, 117, 0, 0, 91, 0, + 21, 0, 77, 0, 0, 54, 0, 43, 0, 13, + 0, 14, 0, 14, 0, 0, 221, 0, 8, 0 }; #endif #if YYDEBUG != 0 static const short yyrline[] = { 0, - 303, 309, 315, 331, 356, 358, 361, 365, 370, 377, - 385, 390, 394, 403, 405, 413, 417, 425, 429, 432, - 435, 439, 459, 461, 469, 473, 505, 509, 518, 525, - 538, 545, 547, 559, 572, 579, 584, 590, 596, 605, - 611, 617, 624, 630, 638, 642, 645, 652, 658, 664, - 671, 677, 686, 696, 704, 712, 714, 724, 727, 731, - 734, 746, 758, 764, 780, 789, 799, 809, 814, 821, - 828, 838, 844, 850, 854, 877, 879, 881, 887, 893, - 900, 907, 912, 918, 924, 930, 935, 945, 947, 950, - 958, 964, 973, 979, 996, 998, 1003, 1007, 1012, 1017, - 1023, 1027, 1038, 1047, 1056, 1067, 1089, 1093, 1099, 1105, - 1111, 1121, 1131, 1137, 1151, 1175, 1182, 1196, 1205, 1215, - 1225, 1235, 1243, 1264, 1273, 1282, 1283, 1285, 1292, 1304, - 1314, 1322, 1322, 1327, 1332, 1337, 1342, 1346, 1350, 1353, - 1356, 1361, 1373, 1390, 1395, 1405, 1421, 1431, 1445, 1447, - 1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455, 1456, 1457, - 1458, 1464, 1466, 1467, 1470, 1477, 1489, 1491, 1495, 1499, - 1500, 1501, 1502, 1503, 1507, 1508, 1509, 1510, 1514, 1515, - 1522, 1522, 1523, 1523, 1524, 1526, 1528, 1533, 1537, 1546, - 1550, 1555, 1559, 1565, 1575, 1579, 1582, 1585, 1588, 1593, - 1602, 1610, 1616, 1622, 1629, 1637, 1645, 1654, 1657, 1660, - 1661, 1671, 1673, 1674, 1675, 1678, 1682, 1687, 1693, 1698, - 1701, 1704, 1717, 1731, 1737, 1741, 1746, 1752, 1764, 1766, - 1769, 1773, 1776, 1781, 1785, 1793, 1808, 1814, 1821, 1834, - 1846, 1861, 1865, 1882, 1887, 1890, 1895, 1917, 1922, 1927, - 1933, 1939, 1947, 1955, 1963, 1970, 1980, 1985, 2015, 2017, - 2020, 2027, 2033, 2035, 2036, 2037, 2040, 2042, 2043, 2046, - 2051, 2058, 2065, 2067, 2071 + 305, 311, 317, 333, 358, 360, 363, 367, 372, 379, + 387, 392, 396, 405, 407, 415, 419, 427, 431, 434, + 437, 441, 461, 463, 471, 475, 507, 511, 520, 527, + 540, 547, 549, 561, 574, 581, 586, 592, 598, 607, + 613, 619, 626, 632, 640, 644, 647, 654, 660, 666, + 673, 679, 688, 698, 706, 714, 716, 726, 729, 733, + 736, 748, 760, 766, 782, 791, 801, 811, 816, 823, + 830, 840, 846, 852, 856, 879, 881, 883, 889, 895, + 902, 909, 914, 920, 926, 932, 937, 947, 949, 952, + 960, 966, 975, 981, 998, 1000, 1005, 1009, 1014, 1019, + 1025, 1029, 1040, 1049, 1058, 1069, 1091, 1095, 1101, 1107, + 1113, 1123, 1133, 1139, 1153, 1177, 1184, 1198, 1207, 1217, + 1227, 1237, 1245, 1266, 1275, 1284, 1285, 1287, 1294, 1306, + 1316, 1324, 1324, 1329, 1334, 1339, 1344, 1348, 1352, 1355, + 1358, 1363, 1375, 1392, 1397, 1402, 1435, 1445, 1459, 1461, + 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, + 1472, 1478, 1480, 1481, 1484, 1491, 1503, 1505, 1509, 1513, + 1514, 1515, 1516, 1517, 1521, 1522, 1523, 1524, 1528, 1529, + 1536, 1536, 1537, 1537, 1538, 1540, 1542, 1547, 1551, 1560, + 1564, 1569, 1573, 1579, 1589, 1593, 1596, 1599, 1602, 1607, + 1616, 1624, 1630, 1636, 1643, 1651, 1659, 1668, 1671, 1674, + 1675, 1685, 1687, 1688, 1689, 1692, 1696, 1701, 1707, 1712, + 1715, 1718, 1731, 1745, 1751, 1755, 1760, 1766, 1778, 1780, + 1783, 1787, 1790, 1795, 1799, 1807, 1822, 1828, 1835, 1848, + 1860, 1875, 1879, 1896, 1901, 1904, 1909, 1931, 1936, 1941, + 1947, 1953, 1961, 1969, 1977, 1984, 1994, 1999, 2029, 2031, + 2034, 2041, 2047, 2049, 2050, 2051, 2054, 2056, 2057, 2060, + 2065, 2072, 2079, 2081, 2085 }; #endif @@ -403,36 +403,36 @@ static const short yyrline[] = { 0, static const char * const yytname[] = { "$","error","$undefined.","TOK_PPEQ", "TOK_opaque","TOK_bstring","TOK_cstring","TOK_hstring","TOK_identifier","TOK_number", -"TOK_number_negative","TOK_typereference","TOK_capitalreference","TOK_typefieldreference", -"TOK_valuefieldreference","TOK_ABSENT","TOK_ABSTRACT_SYNTAX","TOK_ALL","TOK_ANY", -"TOK_APPLICATION","TOK_AUTOMATIC","TOK_BEGIN","TOK_BIT","TOK_BMPString","TOK_BOOLEAN", -"TOK_BY","TOK_CHARACTER","TOK_CHOICE","TOK_CLASS","TOK_COMPONENT","TOK_COMPONENTS", -"TOK_CONSTRAINED","TOK_CONTAINING","TOK_DEFAULT","TOK_DEFINITIONS","TOK_DEFINED", -"TOK_EMBEDDED","TOK_ENCODED","TOK_ENCODING_CONTROL","TOK_END","TOK_ENUMERATED", -"TOK_EXPLICIT","TOK_EXPORTS","TOK_EXTENSIBILITY","TOK_EXTERNAL","TOK_FALSE", -"TOK_FROM","TOK_GeneralizedTime","TOK_GeneralString","TOK_GraphicString","TOK_IA5String", -"TOK_IDENTIFIER","TOK_IMPLICIT","TOK_IMPLIED","TOK_IMPORTS","TOK_INCLUDES","TOK_INSTANCE", -"TOK_INSTRUCTIONS","TOK_INTEGER","TOK_ISO646String","TOK_MAX","TOK_MIN","TOK_MINUS_INFINITY", -"TOK_NULL","TOK_NumericString","TOK_OBJECT","TOK_ObjectDescriptor","TOK_OCTET", -"TOK_OF","TOK_OPTIONAL","TOK_PATTERN","TOK_PDV","TOK_PLUS_INFINITY","TOK_PRESENT", -"TOK_PrintableString","TOK_PRIVATE","TOK_REAL","TOK_RELATIVE_OID","TOK_SEQUENCE", -"TOK_SET","TOK_SIZE","TOK_STRING","TOK_SYNTAX","TOK_T61String","TOK_TAGS","TOK_TeletexString", -"TOK_TRUE","TOK_TYPE_IDENTIFIER","TOK_UNIQUE","TOK_UNIVERSAL","TOK_UniversalString", -"TOK_UTCTime","TOK_UTF8String","TOK_VideotexString","TOK_VisibleString","TOK_WITH", -"TOK_EXCEPT","'^'","TOK_INTERSECTION","'|'","TOK_UNION","TOK_TwoDots","TOK_ThreeDots", -"'{'","'}'","'('","')'","';'","','","':'","'!'","'.'","'<'","'@'","'['","']'", -"ParsedGrammar","ModuleList","ModuleSpecification","optObjectIdentifier","ObjectIdentifier", -"ObjectIdentifierBody","ObjectIdentifierElement","optModuleSpecificationFlags", -"ModuleSpecificationFlags","ModuleSpecificationFlag","optModuleSpecificationBody", -"ModuleSpecificationBody","ModuleSpecificationElement","@1","ImportsDefinition", -"ImportsBundleSet","ImportsBundle","ImportsList","ImportsElement","ExportsDefinition", -"ExportsBody","ExportsElement","ValueSetDefinition","DefinedTypeRef","optValueSetBody", -"ValueSetBody","ValueSetElement","DataTypeReference","ParameterArgumentList", -"ParameterArgumentName","ActualParameterList","ActualParameter","optComponentTypeLists", -"ComponentTypeLists","ComponentType","AlternativeTypeLists","AlternativeType", -"ClassDeclaration","optUnique","ClassFieldList","ClassField","optWithSyntax", -"WithSyntax","@2","WithSyntaxFormat","WithSyntaxFormatToken","ExtensionAndException", -"Type","TypeDeclaration","ComplexTypeReference","ComplexTypeReferenceAmpList", +"TOK_tuple","TOK_quadruple","TOK_number_negative","TOK_typereference","TOK_capitalreference", +"TOK_typefieldreference","TOK_valuefieldreference","TOK_ABSENT","TOK_ABSTRACT_SYNTAX", +"TOK_ALL","TOK_ANY","TOK_APPLICATION","TOK_AUTOMATIC","TOK_BEGIN","TOK_BIT", +"TOK_BMPString","TOK_BOOLEAN","TOK_BY","TOK_CHARACTER","TOK_CHOICE","TOK_CLASS", +"TOK_COMPONENT","TOK_COMPONENTS","TOK_CONSTRAINED","TOK_CONTAINING","TOK_DEFAULT", +"TOK_DEFINITIONS","TOK_DEFINED","TOK_EMBEDDED","TOK_ENCODED","TOK_ENCODING_CONTROL", +"TOK_END","TOK_ENUMERATED","TOK_EXPLICIT","TOK_EXPORTS","TOK_EXTENSIBILITY", +"TOK_EXTERNAL","TOK_FALSE","TOK_FROM","TOK_GeneralizedTime","TOK_GeneralString", +"TOK_GraphicString","TOK_IA5String","TOK_IDENTIFIER","TOK_IMPLICIT","TOK_IMPLIED", +"TOK_IMPORTS","TOK_INCLUDES","TOK_INSTANCE","TOK_INSTRUCTIONS","TOK_INTEGER", +"TOK_ISO646String","TOK_MAX","TOK_MIN","TOK_MINUS_INFINITY","TOK_NULL","TOK_NumericString", +"TOK_OBJECT","TOK_ObjectDescriptor","TOK_OCTET","TOK_OF","TOK_OPTIONAL","TOK_PATTERN", +"TOK_PDV","TOK_PLUS_INFINITY","TOK_PRESENT","TOK_PrintableString","TOK_PRIVATE", +"TOK_REAL","TOK_RELATIVE_OID","TOK_SEQUENCE","TOK_SET","TOK_SIZE","TOK_STRING", +"TOK_SYNTAX","TOK_T61String","TOK_TAGS","TOK_TeletexString","TOK_TRUE","TOK_TYPE_IDENTIFIER", +"TOK_UNIQUE","TOK_UNIVERSAL","TOK_UniversalString","TOK_UTCTime","TOK_UTF8String", +"TOK_VideotexString","TOK_VisibleString","TOK_WITH","TOK_EXCEPT","'^'","TOK_INTERSECTION", +"'|'","TOK_UNION","TOK_TwoDots","TOK_ThreeDots","'{'","'}'","'('","')'","';'", +"','","':'","'!'","'.'","'<'","'@'","'['","']'","ParsedGrammar","ModuleList", +"ModuleSpecification","optObjectIdentifier","ObjectIdentifier","ObjectIdentifierBody", +"ObjectIdentifierElement","optModuleSpecificationFlags","ModuleSpecificationFlags", +"ModuleSpecificationFlag","optModuleSpecificationBody","ModuleSpecificationBody", +"ModuleSpecificationElement","@1","ImportsDefinition","ImportsBundleSet","ImportsBundle", +"ImportsList","ImportsElement","ExportsDefinition","ExportsBody","ExportsElement", +"ValueSetDefinition","DefinedTypeRef","optValueSetBody","ValueSetBody","ValueSetElement", +"DataTypeReference","ParameterArgumentList","ParameterArgumentName","ActualParameterList", +"ActualParameter","optComponentTypeLists","ComponentTypeLists","ComponentType", +"AlternativeTypeLists","AlternativeType","ClassDeclaration","optUnique","ClassFieldList", +"ClassField","optWithSyntax","WithSyntax","@2","WithSyntaxFormat","WithSyntaxFormatToken", +"ExtensionAndException","Type","TypeDeclaration","ComplexTypeReference","ComplexTypeReferenceAmpList", "ComplexTypeReferenceElement","ClassFieldIdentifier","ClassFieldName","ValueDefinition", "Value","@3","DefinedValue","RestrictedCharacterStringValue","Opaque","BasicTypeId", "BasicTypeId_UniverationCompatible","BasicType","BasicString","Union","Intersection", @@ -448,34 +448,34 @@ static const char * const yytname[] = { "$","error","$undefined.","TOK_PPEQ", #endif static const short yyr1[] = { 0, - 116, 117, 117, 118, 119, 119, 120, 120, 121, 121, - 122, 122, 122, 123, 123, 124, 124, 125, 125, 125, - 125, 125, 126, 126, 127, 127, 128, 128, 128, 128, - 128, 129, 128, 128, 130, 130, 131, 131, 132, 133, - 133, 134, 134, 134, 135, 135, 135, 136, 136, 137, - 137, 137, 138, 139, 139, 140, 140, 141, 141, 142, - 142, 143, 143, 143, 143, 144, 144, 145, 145, 145, - 145, 146, 146, 147, 147, 148, 148, 149, 149, 150, - 150, 150, 151, 151, 152, 152, 153, 154, 154, 155, - 155, 156, 156, 156, 157, 157, 159, 158, 160, 160, - 161, 161, 162, 162, 162, 163, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 165, 165, 165, - 165, 165, 165, 166, 166, 167, 168, 169, 169, 170, - 171, 172, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 173, 173, 174, 174, 174, 175, 175, 176, 176, - 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, - 176, 177, 177, 177, 178, 178, 179, 179, 179, 179, - 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, - 180, 180, 181, 181, 182, 183, 183, 184, 184, 185, - 185, 186, 186, 186, 187, 187, 187, 187, 187, 188, - 188, 188, 188, 188, 188, 188, 188, 188, 188, 189, - 188, 190, 190, 190, 190, 191, 191, 192, 192, 192, - 192, 192, 193, 194, 195, 195, 196, 196, 197, 197, - 198, 198, 198, 199, 199, 200, 201, 202, 202, 203, - 203, 204, 204, 205, 205, 206, 206, 207, 207, 208, - 208, 209, 209, 209, 209, 209, 210, 210, 211, 211, - 212, 213, 214, 214, 214, 214, 215, 215, 215, 216, - 216, 217, 218, 218, 219 + 118, 119, 119, 120, 121, 121, 122, 122, 123, 123, + 124, 124, 124, 125, 125, 126, 126, 127, 127, 127, + 127, 127, 128, 128, 129, 129, 130, 130, 130, 130, + 130, 131, 130, 130, 132, 132, 133, 133, 134, 135, + 135, 136, 136, 136, 137, 137, 137, 138, 138, 139, + 139, 139, 140, 141, 141, 142, 142, 143, 143, 144, + 144, 145, 145, 145, 145, 146, 146, 147, 147, 147, + 147, 148, 148, 149, 149, 150, 150, 151, 151, 152, + 152, 152, 153, 153, 154, 154, 155, 156, 156, 157, + 157, 158, 158, 158, 159, 159, 161, 160, 162, 162, + 163, 163, 164, 164, 164, 165, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 167, 167, 167, + 167, 167, 167, 168, 168, 169, 170, 171, 171, 172, + 173, 174, 173, 173, 173, 173, 173, 173, 173, 173, + 173, 175, 175, 176, 176, 176, 177, 177, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 179, 179, 179, 180, 180, 181, 181, 181, 181, + 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, + 182, 182, 183, 183, 184, 185, 185, 186, 186, 187, + 187, 188, 188, 188, 189, 189, 189, 189, 189, 190, + 190, 190, 190, 190, 190, 190, 190, 190, 190, 191, + 190, 192, 192, 192, 192, 193, 193, 194, 194, 194, + 194, 194, 195, 196, 197, 197, 198, 198, 199, 199, + 200, 200, 200, 201, 201, 202, 203, 204, 204, 205, + 205, 206, 206, 207, 207, 208, 208, 209, 209, 210, + 210, 211, 211, 211, 211, 211, 212, 212, 213, 213, + 214, 215, 216, 216, 216, 216, 217, 217, 217, 218, + 218, 219, 220, 220, 221 }; static const short yyr2[] = { 0, @@ -493,7 +493,7 @@ static const short yyr2[] = { 0, 6, 6, 1, 4, 4, 1, 3, 1, 3, 3, 3, 1, 3, 1, 3, 1, 1, 1, 1, 4, 3, 0, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 3, 1, 5, 9, 1, 2, 1, 1, + 1, 1, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -528,295 +528,299 @@ static const short yydefact[] = { 0, 0, 186, 186, 62, 186, 116, 165, 152, 107, 0, 269, 268, 261, 119, 121, 0, 0, 0, 0, 56, 128, 129, 123, 124, 126, 120, 137, 144, 138, 257, - 258, 135, 134, 136, 132, 130, 141, 139, 140, 0, - 142, 39, 0, 90, 259, 127, 0, 0, 0, 0, - 0, 76, 0, 0, 187, 188, 76, 0, 106, 0, - 166, 259, 259, 67, 71, 70, 69, 0, 0, 218, - 217, 0, 216, 219, 0, 60, 0, 0, 0, 57, - 58, 221, 61, 195, 0, 202, 203, 209, 208, 234, - 235, 220, 223, 222, 0, 0, 0, 0, 0, 95, - 0, 0, 246, 88, 88, 92, 245, 0, 262, 0, - 103, 0, 83, 86, 259, 117, 0, 0, 0, 77, - 78, 82, 259, 0, 192, 273, 0, 0, 273, 256, - 248, 0, 250, 255, 252, 0, 72, 74, 75, 65, - 0, 0, 212, 0, 0, 0, 0, 0, 53, 0, - 183, 184, 181, 182, 0, 0, 185, 0, 0, 0, - 0, 125, 0, 147, 133, 143, 131, 0, 87, 96, + 145, 146, 258, 135, 134, 136, 132, 130, 141, 139, + 140, 0, 142, 39, 0, 90, 259, 127, 0, 0, + 0, 0, 0, 76, 0, 0, 187, 188, 76, 0, + 106, 0, 166, 259, 259, 67, 71, 70, 69, 0, + 0, 218, 217, 0, 216, 219, 0, 60, 0, 0, + 0, 57, 58, 221, 61, 195, 0, 202, 203, 209, + 208, 234, 235, 220, 223, 222, 0, 0, 0, 0, + 95, 0, 0, 246, 88, 88, 92, 245, 0, 262, + 0, 103, 0, 83, 86, 259, 117, 0, 0, 0, + 77, 78, 82, 259, 0, 192, 273, 0, 0, 273, + 256, 248, 0, 250, 255, 252, 0, 72, 74, 75, + 65, 0, 0, 212, 0, 0, 0, 0, 0, 53, + 0, 183, 184, 181, 182, 0, 0, 185, 0, 0, + 0, 0, 125, 147, 133, 143, 131, 0, 87, 96, 91, 247, 89, 244, 244, 114, 0, 108, 0, 85, 0, 259, 109, 0, 244, 190, 0, 259, 274, 0, 110, 259, 249, 0, 0, 115, 259, 196, 210, 213, - 214, 207, 0, 205, 0, 236, 201, 59, 197, 198, - 199, 0, 206, 204, 0, 0, 238, 0, 148, 0, - 93, 94, 104, 105, 142, 84, 189, 81, 79, 80, - 193, 0, 191, 0, 251, 0, 0, 73, 0, 215, - 227, 0, 225, 186, 200, 0, 240, 242, 237, 0, - 145, 0, 97, 0, 111, 112, 254, 253, 211, 224, - 0, 229, 241, 0, 239, 0, 0, 194, 226, 232, - 233, 231, 228, 230, 243, 0, 101, 0, 99, 102, - 0, 98, 100, 146, 0, 0, 0 + 214, 207, 205, 0, 236, 201, 59, 197, 198, 199, + 0, 206, 204, 0, 0, 238, 148, 0, 93, 94, + 104, 105, 142, 84, 189, 81, 79, 80, 193, 0, + 191, 0, 251, 0, 0, 73, 0, 215, 227, 0, + 225, 186, 200, 0, 240, 242, 237, 0, 97, 0, + 111, 112, 254, 253, 211, 224, 0, 229, 241, 0, + 239, 0, 194, 226, 232, 233, 231, 228, 230, 243, + 101, 0, 99, 102, 98, 100, 0, 0, 0 }; -static const short yydefgoto[] = { 435, +static const short yydefgoto[] = { 427, 3, 4, 8, 9, 13, 14, 25, 26, 27, 55, 56, 57, 107, 58, 74, 75, 76, 77, 59, 69, - 70, 60, 100, 229, 230, 231, 61, 130, 131, 286, - 287, 269, 270, 271, 262, 263, 119, 324, 193, 194, - 319, 320, 417, 428, 429, 272, 288, 155, 156, 173, - 174, 195, 196, 62, 186, 247, 187, 232, 315, 157, - 103, 159, 104, 305, 306, 308, 204, 205, 206, 274, - 275, 234, 389, 295, 235, 236, 237, 238, 392, 393, - 423, 424, 239, 240, 241, 366, 367, 397, 256, 257, - 211, 282, 283, 242, 258, 122, 123, 146, 163, 243, - 105, 338, 244 + 70, 60, 100, 231, 232, 233, 61, 130, 131, 287, + 288, 270, 271, 272, 263, 264, 119, 324, 195, 196, + 319, 320, 412, 422, 423, 273, 289, 155, 156, 173, + 174, 197, 198, 62, 188, 248, 189, 234, 315, 157, + 103, 159, 104, 306, 307, 309, 206, 207, 208, 275, + 276, 236, 387, 296, 237, 238, 239, 240, 390, 391, + 418, 419, 241, 242, 243, 365, 366, 395, 257, 258, + 213, 283, 284, 244, 259, 122, 123, 146, 163, 245, + 105, 338, 246 }; -static const short yypact[] = { 203, --32768,-32768, 203,-32768, -62,-32768, 39, 24,-32768,-32768, --32768,-32768, 43,-32768, -31, 138,-32768,-32768, 75, 50, - 30, 38, 112, 87, 170, 138,-32768, 76,-32768,-32768, --32768,-32768,-32768, 187,-32768,-32768, 490,-32768, 213, 9, --32768,-32768,-32768, 155,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 172, 490,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 361, 719,-32768, 121,-32768, 149,-32768, - 143,-32768,-32768, 27,-32768, -22,-32768, 148,-32768,-32768, --32768, -10, 123,-32768, 173,-32768, 177, 202,-32768,-32768, --32768,-32768,-32768, 229, 200,-32768,-32768,-32768, 794, 284, --32768,-32768,-32768,-32768, 179, 285,-32768,-32768,-32768, 186, - 198,-32768,-32768, 203, 186, 201, 205, 10,-32768,-32768, - 567,-32768, 54, 186,-32768,-32768,-32768,-32768,-32768, -21, --32768, 194, 195, 206, 272, 460,-32768,-32768, -62,-32768, --32768, 247,-32768,-32768,-32768, 297, 8, 207, 276, 210, - 244, 104, 107,-32768, -40,-32768,-32768, 212,-32768, 214, --32768,-32768,-32768,-32768,-32768, 315, 794, 311, 186, 221, --32768,-32768, 219,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 312,-32768,-32768,-32768,-32768, 220, - 216,-32768, -15,-32768, 31,-32768, 217, 308, 7, 259, - 230, 58, 283, 266,-32768, 231, 58, 271,-32768, 53, --32768, 6, 227,-32768,-32768,-32768,-32768, 246, 320,-32768, --32768, 68,-32768,-32768, 316,-32768, 238, 283, 243, 241, --32768,-32768, 199, 254, 248, 68,-32768,-32768,-32768, 249, --32768,-32768,-32768,-32768, 247, 251, 347, 311, 460, 260, - 247, 460,-32768, 268, 268,-32768,-32768, 644,-32768, 311, - 250, -3,-32768,-32768, 227,-32768, 283, 286, 253, 257, --32768,-32768, 227, 256, 78, 311, 283, 262, 311,-32768, --32768, 85,-32768,-32768, 263, 98,-32768,-32768,-32768,-32768, - 450, 264, 258, 270, 67, 273, 275, 269,-32768, 221, --32768,-32768,-32768,-32768, 450, 450,-32768, 450, 283, 88, - 261,-32768, 368,-32768, 376,-32768,-32768, 299,-32768,-32768, --32768,-32768,-32768, 1, 1,-32768, 267,-32768, 7,-32768, - 287, 227,-32768, 58, 1,-32768, 280, 227,-32768, 288, --32768, 227,-32768, 70, 267,-32768, 6,-32768,-32768,-32768, - 278,-32768, 312,-32768, 47,-32768,-32768,-32768,-32768,-32768, --32768, 289,-32768,-32768, 17, 116,-32768, 131,-32768, 293, +static const short yypact[] = { 131, +-32768,-32768, 131,-32768, -60,-32768, 15, 25,-32768,-32768, +-32768,-32768, 27,-32768, -1, 141,-32768,-32768, 88, 79, + 62, 71, 65, 89, 188, 141,-32768, 101,-32768,-32768, +-32768,-32768,-32768, 200,-32768,-32768, 517,-32768, 215, 38, +-32768,-32768,-32768, 61,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 190, 517,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 355, 746,-32768, 146,-32768, 72,-32768, + 152,-32768,-32768, 34,-32768, -10,-32768, 156,-32768,-32768, +-32768, -3, 158,-32768, 182,-32768, 189, 216,-32768,-32768, +-32768,-32768,-32768, 242, 213,-32768,-32768,-32768, 821, 294, +-32768,-32768,-32768,-32768, 185, 296,-32768,-32768,-32768, 145, + 194,-32768,-32768, 131, 145, 196, 198, 5,-32768,-32768, + 594,-32768, 64, 145,-32768,-32768,-32768,-32768,-32768, -66, +-32768, 193, 195, 202, 235, 159,-32768,-32768, -60,-32768, +-32768, 237,-32768,-32768,-32768, 299, -11, 204, 273, 206, + 243, -27, -12,-32768, -6,-32768,-32768, 207,-32768, 209, +-32768,-32768,-32768,-32768,-32768, 302, 821, 309, 145, 268, +-32768,-32768, 205,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, - 291, 644,-32768, 644,-32768, 296, 300,-32768, 347,-32768, --32768, 136,-32768, -40,-32768, 311, 281,-32768,-32768, 261, --32768, 382,-32768, 283,-32768,-32768,-32768,-32768, 376,-32768, - 47, 95, 281, 311,-32768, 295, 209, 199,-32768,-32768, --32768,-32768,-32768,-32768,-32768, 403,-32768, 55,-32768,-32768, - 309,-32768,-32768,-32768, 414, 415,-32768 +-32768, 208, 212,-32768, -19,-32768, 6,-32768, 211, 292, + 42, 254, 217, 7, 453, 255,-32768, 219, 7, 260, +-32768, 50,-32768, 12, 218,-32768,-32768,-32768,-32768, 234, + 306,-32768,-32768, -4,-32768,-32768, 303,-32768, 131, 453, + 230, 229,-32768,-32768, 184, 244, 238, -4,-32768,-32768, +-32768, 236,-32768,-32768,-32768,-32768, 237, 342, 309, 159, + 251, 237, 159,-32768, 259, 259,-32768,-32768, 671,-32768, + 309, 239, 83,-32768,-32768, 218,-32768, 453, 283, 246, + 245,-32768,-32768, 218, 252, 126, 309, 453, 248, 309, +-32768,-32768, 102,-32768,-32768, 256, 110,-32768,-32768,-32768, +-32768, 465, 257, 250, 263, 168, 262, 253, 266,-32768, + 268,-32768,-32768,-32768,-32768, 465, 465,-32768, 465, 453, + 282, 261,-32768,-32768, 367,-32768,-32768, 293,-32768,-32768, +-32768,-32768,-32768, 8, 8,-32768, 225,-32768, 42,-32768, + 270, 218,-32768, 7, 8,-32768, 278, 218,-32768, 276, +-32768, 218,-32768, 56, 225,-32768, 12,-32768,-32768,-32768, + 271,-32768,-32768, 46,-32768,-32768,-32768,-32768,-32768,-32768, + 280,-32768,-32768, 1, 111,-32768,-32768, 281,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 279, 671, +-32768, 671,-32768, 284, 286,-32768, 342,-32768,-32768, 134, +-32768, -6,-32768, 309, 277,-32768,-32768, 261,-32768, 453, +-32768,-32768,-32768,-32768, 367,-32768, 46, 17, 277, 309, +-32768, 183, 184,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768, 13,-32768,-32768,-32768,-32768, 391, 395,-32768 }; static const short yypgoto[] = {-32768, --32768, 413, 279,-32768,-32768, 404,-32768,-32768, 395,-32768, --32768, 366,-32768,-32768,-32768, 349,-32768, 314,-32768,-32768, - 321,-32768, 365,-32768,-32768, 132,-32768,-32768, 274,-32768, - 86, 232,-32768, 100,-32768, 111,-32768, 181,-32768, 191, --32768,-32768,-32768,-32768, 15, -187, -77, -228, -54,-32768, - 204, -191, -122,-32768, -206,-32768, -291, -108, 56, -42, - -120,-32768, -6,-32768,-32768,-32768, -146,-32768,-32768, -196, - -168, -87,-32768, 211,-32768, -268,-32768,-32768,-32768, 37, --32768,-32768,-32768,-32768,-32768,-32768, 57, 77, -233,-32768, --32768,-32768, 106, -128, -79,-32768,-32768,-32768,-32768, 16, --32768, 184, -7 +-32768, 396, 269,-32768,-32768, 389,-32768,-32768, 383,-32768, +-32768, 354,-32768,-32768,-32768, 337,-32768, 297,-32768,-32768, + 304,-32768, 348,-32768,-32768, 116,-32768,-32768, 258,-32768, + 80, 210,-32768, 84,-32768, 97,-32768, 172,-32768, 177, +-32768,-32768,-32768,-32768, 10, -187, -74, -192, -53,-32768, + 191, -190, -122,-32768, -169,-32768, -256, -118, 43, -33, + -120,-32768, 48,-32768,-32768,-32768, -151,-32768,-32768, -205, + -165, -96,-32768, 197,-32768, -213,-32768,-32768,-32768, 29, +-32768,-32768,-32768,-32768,-32768,-32768, 39, 45, -121,-32768, +-32768,-32768, 99, -126, -79,-32768,-32768,-32768,-32768, 16, +-32768, 161, -7 }; -#define YYLAST 888 +#define YYLAST 917 static const short yytable[] = { 15, - 158, 233, 121, 255, 120, 15, 208, 189, 209, 101, - 101, 264, 175, 10, 10, 5, 10, 117, 5, 1, - 2, 102, 102, 114, 10, 67, 354, 188, 143, 65, - 63, 298, 72, 252, 10, 373, 79, 1, 2, 201, - 7, 364, 317, 171, 172, 322, 10, 11, 65, 63, - 10, 11, 64, 386, 10, 71, 132, 16, 427, 78, - 10, 180, 181, 252, 203, 10, 79, 171, 172, 253, - 331, 64, 178, 19, 10, 180, 181, 10, 180, 181, - 340, 284, 166, 28, 144, 115, 167, 268, 250, 78, - 371, 372, 251, 178, 161, 10, 180, 181, 145, 253, - 328, 380, 72, 118, 329, 162, 29, 79, 261, 420, - -270, 220, 362, 30, 133, 68, 165, 254, 124, 118, - 189, 31, 175, 189, 132, 71, 352, 396, 191, 139, - 78, 233, 220, 112, -244, 290, 160, 158, -244, 164, - 188, 264, 12, 188, 118, 266, 17, 363, 391, 20, - 176, 190, 224, 405, 280, 406, 281, 21, 432, 261, - 215, 217, 10, 421, 32, 1, 2, 422, 293, 353, - 33, 280, 34, 224, 301, 302, 303, 304, 22, 294, - 23, 36, 133, 201, 216, 337, 201, 330, 343, 24, - 353, 265, 344, 10, 273, 335, 1, 2, 374, 273, - 73, 346, 285, 348, 289, 347, 202, 37, 203, 207, - 80, 203, 427, 1, 2, 284, 387, 359, 360, 399, - 361, 171, 172, 400, 66, 430, 178, 108, 10, 180, - 181, 1, 2, 124, 401, 418, 430, 218, 402, 410, - 316, 191, 297, 411, 191, 111, 246, 412, 1, 2, - 116, 219, 326, 125, 378, 109, 110, 126, 382, 171, - 172, 158, 384, 158, 190, 220, 221, 190, 339, 83, - 84, 339, 127, 160, 10, 180, 181, 1, 2, 128, - 129, 222, 1, 2, 171, 172, 134, 136, 178, 135, - 10, 180, 181, 1, 2, 301, 302, 303, 304, 218, - 223, 138, 168, 169, 141, 197, 224, 142, 170, -271, - 198, 200, 199, 219, 210, 225, 212, 213, 10, 375, - 246, 265, 226, 227, 249, 228, 273, 220, 221, 245, - 248, 259, 260, 276, 267, 277, 285, 375, 279, 289, - 118, 291, 190, 222, 292, 296, 299, 394, 300, 307, - 314, 311, 309, 332, 318, 323, 333, 398, 313, 327, - 190, 336, 223, 82, 334, 341, 349, 345, 224, 350, - 351, 83, 84, 365, 357, 355, 368, 225, 356, 369, - 370, 381, 85, 38, 86, 227, 87, 228, 398, 390, - 416, 414, 377, 383, 395, 403, 88, 160, 404, 160, - 89, 407, 426, 394, 90, 408, 425, 91, 41, 42, - 43, 431, 434, 436, 437, 6, 18, 192, 92, 45, - 35, 81, 113, 93, 46, 94, 47, 95, 140, 106, - 137, 358, 388, 379, 48, 325, 96, 97, 278, 376, - 214, 321, 433, 49, 409, 50, 310, 419, 312, 385, - 51, 98, 52, 53, 54, 178, 415, 10, 180, 181, - 1, 2, 342, 99, 177, 178, 179, 10, 180, 181, - 1, 2, 413, 0, 0, 0, 0, 0, 0, 0, - 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 220, 221, 0, 10, 0, 0, - 1, 2, 0, 0, 182, 0, 0, 0, 0, 0, - 222, 0, 38, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 183, 0, 0, 0, 0, 39, 0, 223, - 0, 40, 0, 0, 0, 224, 0, 41, 42, 43, - 0, 0, 0, 44, 225, 184, 0, 0, 45, 0, - 0, 0, 227, 46, 228, 47, 0, 0, 0, 0, - 0, 0, 185, 48, 0, 0, 0, 0, 0, 0, - 0, 0, 49, 0, 50, 0, 0, 147, 148, 51, - 0, 52, 53, 54, 149, 0, 0, 0, 85, 38, - 86, 0, 87, 150, 0, 0, 0, 0, 0, 0, - 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, - 90, 0, 0, 91, 41, 42, 43, 0, 0, 0, - 0, 0, 151, 0, 92, 45, 0, 0, 0, 93, - 46, 94, 47, 95, 0, 0, 0, 0, 0, 0, - 48, 0, 96, 97, 152, 153, 0, 0, 0, 49, - 0, 50, 0, 154, 147, 148, 51, 98, 52, 53, - 54, 149, 0, 0, 0, 85, 38, 86, 0, 87, - 150, 0, 0, 0, 0, 0, 0, 0, 0, 88, - 0, 0, 0, 89, 0, 0, 0, 90, 0, 0, - 91, 41, 42, 43, 0, 0, 0, 0, 0, 151, - 0, 92, 45, 0, 0, 0, 93, 46, 94, 47, - 95, 0, 0, 0, 0, 0, 0, 48, 0, 96, - 97, 152, 153, 0, 0, 0, 49, 0, 50, 83, - 84, 0, 0, 51, 98, 52, 53, 54, 0, 0, - 85, 38, 86, 0, 87, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 88, 0, 0, 0, 89, 0, - 0, 0, 90, 0, 0, 91, 41, 42, 43, 0, - 0, 0, 0, 0, 0, 0, 92, 45, 0, 0, - 0, 93, 46, 94, 47, 95, 0, 0, 0, 0, - 0, 0, 48, 0, 96, 97, 0, 0, 0, 0, - 0, 49, 0, 50, 1, 2, 0, 0, 51, 98, - 52, 53, 54, 0, 0, 85, 38, 86, 0, 87, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, - 0, 0, 0, 89, 0, 0, 0, 90, 0, 0, - 91, 41, 42, 43, 0, 0, 0, 0, 0, 0, - 0, 92, 45, 0, 0, 0, 93, 46, 94, 47, - 95, 0, 0, 0, 0, 0, 0, 48, 0, 96, - 97, 0, 0, 0, 0, 0, 49, 0, 50, 0, - 0, 0, 0, 51, 98, 52, 53, 54 + 158, 210, 121, 211, 235, 15, 256, 120, 10, 191, + 101, 101, 175, 265, 10, 5, 421, 190, 5, 10, + 171, 172, 10, 11, 299, 143, 117, 171, 172, 65, + 102, 102, 72, 415, 10, 11, 79, 114, 269, 166, + 253, 10, 253, 167, 7, 10, 1, 2, 65, 10, + 1, 2, 64, 10, 203, 71, 67, 10, 180, 78, + 16, 183, 331, 10, 180, 132, 79, 183, 10, 203, + 371, 64, 340, 1, 2, 203, 254, 204, 254, 205, + 317, 144, 353, 322, 63, 285, 251, 416, 384, 78, + 252, 417, 209, -270, 205, 145, 28, 363, 294, 115, + 205, 124, 72, 63, 361, 19, 161, 79, 73, 295, + 262, -244, 118, 394, 133, -244, 165, 162, 425, 32, + 12, 118, 255, 191, 175, 71, 191, 118, 193, 139, + 78, 190, 17, 132, 190, 235, 160, 29, 158, 164, + 291, 265, 112, 1, 2, 262, 68, 30, 267, 389, + 176, 192, 10, 281, 20, 282, 31, 1, 2, 281, + 217, 219, 21, 177, 178, 179, 10, 180, 181, 182, + 183, 1, 2, 178, 33, 10, 180, 181, 182, 183, + 109, 110, 133, 22, 218, 23, 421, 401, 328, 402, + 34, 330, 329, 266, 24, 348, 274, 171, 172, 335, + 372, 274, 369, 370, 286, 184, 290, 343, 36, 358, + 359, 344, 360, 378, 222, 346, 397, 285, 385, 347, + 398, 424, 37, 185, 302, 303, 304, 305, 66, 352, + 80, 424, 10, 180, 413, 337, 183, 1, 2, 406, + 408, 316, 193, 407, 298, 193, 186, 1, 2, 171, + 172, 171, 172, 326, 108, 226, 111, 376, 380, 158, + 116, 158, 382, 187, 125, 192, 83, 84, 192, 339, + 124, 126, 339, 178, 160, 10, 180, 181, 182, 183, + 1, 2, 302, 303, 304, 305, 220, 178, 127, 10, + 180, 181, 182, 183, 128, 129, 134, 135, 136, 138, + 221, 141, 142, 168, 215, 169, 170, 199, -271, 200, + 201, 212, 202, 214, 222, 223, 10, 247, 261, 373, + 249, 266, 250, 268, 277, 278, 274, 260, 222, 280, + 224, 292, 293, 118, 297, 300, 286, 373, 301, 290, + 312, 308, 192, 362, 310, 314, 392, 318, 323, 225, + 327, 333, 332, 341, 334, 226, 396, 82, 355, 336, + 192, 349, 345, 350, 227, 351, 354, 83, 84, 226, + 367, 228, 229, 356, 230, 364, 368, 375, 85, 38, + 86, 379, 87, 381, 388, 399, 396, 393, 400, 410, + 428, 403, 88, 404, 429, 160, 89, 160, 6, 392, + 90, 18, 420, 91, 41, 42, 43, 194, 35, 81, + 113, 140, 106, 137, 92, 45, 357, 377, 279, 93, + 46, 94, 47, 95, 216, 374, 386, 325, 321, 405, + 48, 426, 96, 97, 311, 414, 411, 313, 409, 49, + 342, 50, 383, 0, 0, 0, 51, 98, 52, 53, + 54, 0, 0, 0, 0, 0, 0, 0, 178, 99, + 10, 180, 181, 182, 183, 1, 2, 0, 0, 0, + 178, 220, 10, 180, 181, 182, 183, 1, 2, 0, + 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 221, 0, 222, + 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 222, 223, 0, 0, 224, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 0, 0, 224, 0, 1, + 2, 0, 0, 0, 225, 0, 0, 0, 0, 0, + 226, 38, 0, 0, 0, 0, 225, 0, 0, 227, + 0, 0, 226, 0, 0, 0, 39, 229, 0, 230, + 40, 227, 0, 0, 0, 0, 41, 42, 43, 229, + 0, 230, 44, 0, 0, 0, 0, 45, 0, 0, + 0, 0, 46, 0, 47, 0, 0, 0, 0, 0, + 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, + 0, 49, 0, 50, 0, 0, 147, 148, 51, 0, + 52, 53, 54, 149, 0, 0, 0, 85, 38, 86, + 0, 87, 150, 0, 0, 0, 0, 0, 0, 0, + 0, 88, 0, 0, 0, 89, 0, 0, 0, 90, + 0, 0, 91, 41, 42, 43, 0, 0, 0, 0, + 0, 151, 0, 92, 45, 0, 0, 0, 93, 46, + 94, 47, 95, 0, 0, 0, 0, 0, 0, 48, + 0, 96, 97, 152, 153, 0, 0, 0, 49, 0, + 50, 0, 154, 147, 148, 51, 98, 52, 53, 54, + 149, 0, 0, 0, 85, 38, 86, 0, 87, 150, + 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, + 0, 0, 89, 0, 0, 0, 90, 0, 0, 91, + 41, 42, 43, 0, 0, 0, 0, 0, 151, 0, + 92, 45, 0, 0, 0, 93, 46, 94, 47, 95, + 0, 0, 0, 0, 0, 0, 48, 0, 96, 97, + 152, 153, 0, 0, 0, 49, 0, 50, 83, 84, + 0, 0, 51, 98, 52, 53, 54, 0, 0, 85, + 38, 86, 0, 87, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, + 0, 90, 0, 0, 91, 41, 42, 43, 0, 0, + 0, 0, 0, 0, 0, 92, 45, 0, 0, 0, + 93, 46, 94, 47, 95, 0, 0, 0, 0, 0, + 0, 48, 0, 96, 97, 0, 0, 0, 0, 0, + 49, 0, 50, 1, 2, 0, 0, 51, 98, 52, + 53, 54, 0, 0, 85, 38, 86, 0, 87, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, + 0, 0, 89, 0, 0, 0, 90, 0, 0, 91, + 41, 42, 43, 0, 0, 0, 0, 0, 0, 0, + 92, 45, 0, 0, 0, 93, 46, 94, 47, 95, + 0, 0, 0, 0, 0, 0, 48, 0, 96, 97, + 0, 0, 0, 0, 0, 49, 0, 50, 0, 0, + 0, 0, 51, 98, 52, 53, 54 }; static const short yycheck[] = { 7, - 121, 170, 82, 195, 82, 13, 153, 136, 155, 64, - 65, 199, 135, 8, 8, 0, 8, 28, 3, 11, - 12, 64, 65, 46, 8, 17, 295, 136, 19, 37, - 37, 228, 40, 33, 8, 327, 44, 11, 12, 80, - 103, 310, 249, 13, 14, 252, 8, 9, 56, 56, - 8, 9, 37, 345, 8, 40, 99, 34, 4, 44, - 8, 9, 10, 33, 105, 8, 74, 13, 14, 69, - 267, 56, 6, 105, 8, 9, 10, 8, 9, 10, - 277, 210, 104, 9, 75, 108, 108, 30, 104, 74, - 324, 325, 108, 6, 41, 8, 9, 10, 89, 69, - 104, 335, 110, 114, 108, 52, 57, 115, 102, 15, - 103, 45, 309, 84, 99, 107, 124, 195, 111, 114, - 249, 84, 245, 252, 167, 110, 60, 111, 136, 114, - 115, 300, 45, 107, 104, 213, 121, 258, 108, 124, - 249, 329, 104, 252, 114, 200, 104, 60, 102, 12, - 135, 136, 86, 382, 102, 384, 104, 20, 104, 102, - 168, 169, 8, 69, 53, 11, 12, 73, 101, 103, - 84, 102, 3, 86, 97, 98, 99, 100, 41, 112, - 43, 106, 167, 80, 169, 108, 80, 265, 104, 52, - 103, 199, 108, 8, 202, 273, 11, 12, 327, 207, - 46, 104, 210, 291, 212, 108, 103, 21, 105, 103, - 39, 105, 4, 11, 12, 344, 345, 305, 306, 104, - 308, 13, 14, 108, 12, 417, 6, 107, 8, 9, - 10, 11, 12, 111, 104, 404, 428, 17, 108, 104, - 248, 249, 227, 108, 252, 103, 9, 394, 11, 12, - 103, 31, 260, 81, 332, 107, 108, 81, 338, 13, - 14, 382, 342, 384, 249, 45, 46, 252, 276, 11, - 12, 279, 71, 258, 8, 9, 10, 11, 12, 51, - 81, 61, 11, 12, 13, 14, 3, 3, 6, 111, - 8, 9, 10, 11, 12, 97, 98, 99, 100, 17, - 80, 104, 109, 109, 104, 9, 86, 103, 103, 103, - 35, 68, 103, 31, 103, 95, 103, 3, 8, 327, - 9, 329, 102, 103, 109, 105, 334, 45, 46, 111, - 111, 115, 25, 68, 105, 105, 344, 345, 68, 347, - 114, 96, 327, 61, 25, 30, 104, 355, 108, 96, - 4, 103, 105, 68, 95, 88, 104, 365, 108, 110, - 345, 106, 80, 3, 108, 104, 103, 105, 86, 112, - 101, 11, 12, 113, 106, 103, 9, 95, 104, 4, - 82, 102, 22, 23, 24, 103, 26, 105, 396, 112, - 9, 111, 106, 106, 106, 103, 36, 382, 108, 384, - 40, 106, 108, 411, 44, 106, 414, 47, 48, 49, - 50, 9, 104, 0, 0, 3, 13, 139, 58, 59, - 26, 56, 74, 63, 64, 65, 66, 67, 115, 65, - 110, 300, 347, 334, 74, 255, 76, 77, 207, 329, - 167, 251, 428, 83, 389, 85, 236, 411, 245, 344, - 90, 91, 92, 93, 94, 6, 400, 8, 9, 10, - 11, 12, 279, 103, 5, 6, 7, 8, 9, 10, - 11, 12, 396, -1, -1, -1, -1, -1, -1, -1, - 31, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 45, 46, -1, 8, -1, -1, - 11, 12, -1, -1, 45, -1, -1, -1, -1, -1, - 61, -1, 23, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 63, -1, -1, -1, -1, 38, -1, 80, - -1, 42, -1, -1, -1, 86, -1, 48, 49, 50, - -1, -1, -1, 54, 95, 86, -1, -1, 59, -1, - -1, -1, 103, 64, 105, 66, -1, -1, -1, -1, - -1, -1, 103, 74, -1, -1, -1, -1, -1, -1, - -1, -1, 83, -1, 85, -1, -1, 11, 12, 90, - -1, 92, 93, 94, 18, -1, -1, -1, 22, 23, - 24, -1, 26, 27, -1, -1, -1, -1, -1, -1, - -1, -1, 36, -1, -1, -1, 40, -1, -1, -1, - 44, -1, -1, 47, 48, 49, 50, -1, -1, -1, - -1, -1, 56, -1, 58, 59, -1, -1, -1, 63, - 64, 65, 66, 67, -1, -1, -1, -1, -1, -1, - 74, -1, 76, 77, 78, 79, -1, -1, -1, 83, - -1, 85, -1, 87, 11, 12, 90, 91, 92, 93, - 94, 18, -1, -1, -1, 22, 23, 24, -1, 26, - 27, -1, -1, -1, -1, -1, -1, -1, -1, 36, - -1, -1, -1, 40, -1, -1, -1, 44, -1, -1, - 47, 48, 49, 50, -1, -1, -1, -1, -1, 56, - -1, 58, 59, -1, -1, -1, 63, 64, 65, 66, - 67, -1, -1, -1, -1, -1, -1, 74, -1, 76, - 77, 78, 79, -1, -1, -1, 83, -1, 85, 11, - 12, -1, -1, 90, 91, 92, 93, 94, -1, -1, - 22, 23, 24, -1, 26, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 36, -1, -1, -1, 40, -1, - -1, -1, 44, -1, -1, 47, 48, 49, 50, -1, - -1, -1, -1, -1, -1, -1, 58, 59, -1, -1, - -1, 63, 64, 65, 66, 67, -1, -1, -1, -1, - -1, -1, 74, -1, 76, 77, -1, -1, -1, -1, - -1, 83, -1, 85, 11, 12, -1, -1, 90, 91, - 92, 93, 94, -1, -1, 22, 23, 24, -1, 26, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 36, - -1, -1, -1, 40, -1, -1, -1, 44, -1, -1, - 47, 48, 49, 50, -1, -1, -1, -1, -1, -1, - -1, 58, 59, -1, -1, -1, 63, 64, 65, 66, - 67, -1, -1, -1, -1, -1, -1, 74, -1, 76, - 77, -1, -1, -1, -1, -1, 83, -1, 85, -1, - -1, -1, -1, 90, 91, 92, 93, 94 + 121, 153, 82, 155, 170, 13, 197, 82, 8, 136, + 64, 65, 135, 201, 8, 0, 4, 136, 3, 8, + 15, 16, 8, 9, 230, 21, 30, 15, 16, 37, + 64, 65, 40, 17, 8, 9, 44, 48, 32, 106, + 35, 8, 35, 110, 105, 8, 13, 14, 56, 8, + 13, 14, 37, 8, 82, 40, 19, 8, 9, 44, + 36, 12, 268, 8, 9, 99, 74, 12, 8, 82, + 327, 56, 278, 13, 14, 82, 71, 105, 71, 107, + 250, 77, 296, 253, 37, 212, 106, 71, 345, 74, + 110, 75, 105, 105, 107, 91, 9, 311, 103, 110, + 107, 113, 110, 56, 310, 107, 43, 115, 48, 114, + 104, 106, 116, 113, 99, 110, 124, 54, 106, 55, + 106, 116, 197, 250, 247, 110, 253, 116, 136, 114, + 115, 250, 106, 167, 253, 301, 121, 59, 259, 124, + 215, 329, 109, 13, 14, 104, 109, 86, 202, 104, + 135, 136, 8, 104, 14, 106, 86, 13, 14, 104, + 168, 169, 22, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 6, 86, 8, 9, 10, 11, 12, + 109, 110, 167, 43, 169, 45, 4, 380, 106, 382, + 3, 266, 110, 201, 54, 292, 204, 15, 16, 274, + 327, 209, 324, 325, 212, 47, 214, 106, 108, 306, + 307, 110, 309, 335, 47, 106, 106, 344, 345, 110, + 110, 412, 23, 65, 99, 100, 101, 102, 14, 62, + 41, 422, 8, 9, 400, 110, 12, 13, 14, 106, + 392, 249, 250, 110, 229, 253, 88, 13, 14, 15, + 16, 15, 16, 261, 109, 88, 105, 332, 338, 380, + 105, 382, 342, 105, 83, 250, 13, 14, 253, 277, + 113, 83, 280, 6, 259, 8, 9, 10, 11, 12, + 13, 14, 99, 100, 101, 102, 19, 6, 73, 8, + 9, 10, 11, 12, 53, 83, 3, 113, 3, 106, + 33, 106, 105, 111, 3, 111, 105, 9, 105, 37, + 105, 105, 70, 105, 47, 48, 8, 113, 27, 327, + 113, 329, 111, 107, 70, 107, 334, 117, 47, 70, + 63, 98, 27, 116, 32, 106, 344, 345, 110, 347, + 105, 98, 327, 62, 107, 4, 354, 97, 90, 82, + 112, 106, 70, 106, 110, 88, 364, 3, 106, 108, + 345, 105, 107, 114, 97, 103, 105, 13, 14, 88, + 4, 104, 105, 108, 107, 115, 84, 108, 24, 25, + 26, 104, 28, 108, 114, 105, 394, 108, 110, 113, + 0, 108, 38, 108, 0, 380, 42, 382, 3, 407, + 46, 13, 410, 49, 50, 51, 52, 139, 26, 56, + 74, 115, 65, 110, 60, 61, 301, 334, 209, 65, + 66, 67, 68, 69, 167, 329, 347, 256, 252, 387, + 76, 422, 78, 79, 238, 407, 398, 247, 394, 85, + 280, 87, 344, -1, -1, -1, 92, 93, 94, 95, + 96, -1, -1, -1, -1, -1, -1, -1, 6, 105, + 8, 9, 10, 11, 12, 13, 14, -1, -1, -1, + 6, 19, 8, 9, 10, 11, 12, 13, 14, -1, + -1, -1, -1, -1, -1, 33, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 33, -1, 47, + 48, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 47, 48, -1, -1, 63, -1, -1, -1, -1, + -1, -1, -1, -1, 8, -1, -1, 63, -1, 13, + 14, -1, -1, -1, 82, -1, -1, -1, -1, -1, + 88, 25, -1, -1, -1, -1, 82, -1, -1, 97, + -1, -1, 88, -1, -1, -1, 40, 105, -1, 107, + 44, 97, -1, -1, -1, -1, 50, 51, 52, 105, + -1, 107, 56, -1, -1, -1, -1, 61, -1, -1, + -1, -1, 66, -1, 68, -1, -1, -1, -1, -1, + -1, -1, 76, -1, -1, -1, -1, -1, -1, -1, + -1, 85, -1, 87, -1, -1, 13, 14, 92, -1, + 94, 95, 96, 20, -1, -1, -1, 24, 25, 26, + -1, 28, 29, -1, -1, -1, -1, -1, -1, -1, + -1, 38, -1, -1, -1, 42, -1, -1, -1, 46, + -1, -1, 49, 50, 51, 52, -1, -1, -1, -1, + -1, 58, -1, 60, 61, -1, -1, -1, 65, 66, + 67, 68, 69, -1, -1, -1, -1, -1, -1, 76, + -1, 78, 79, 80, 81, -1, -1, -1, 85, -1, + 87, -1, 89, 13, 14, 92, 93, 94, 95, 96, + 20, -1, -1, -1, 24, 25, 26, -1, 28, 29, + -1, -1, -1, -1, -1, -1, -1, -1, 38, -1, + -1, -1, 42, -1, -1, -1, 46, -1, -1, 49, + 50, 51, 52, -1, -1, -1, -1, -1, 58, -1, + 60, 61, -1, -1, -1, 65, 66, 67, 68, 69, + -1, -1, -1, -1, -1, -1, 76, -1, 78, 79, + 80, 81, -1, -1, -1, 85, -1, 87, 13, 14, + -1, -1, 92, 93, 94, 95, 96, -1, -1, 24, + 25, 26, -1, 28, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 38, -1, -1, -1, 42, -1, -1, + -1, 46, -1, -1, 49, 50, 51, 52, -1, -1, + -1, -1, -1, -1, -1, 60, 61, -1, -1, -1, + 65, 66, 67, 68, 69, -1, -1, -1, -1, -1, + -1, 76, -1, 78, 79, -1, -1, -1, -1, -1, + 85, -1, 87, 13, 14, -1, -1, 92, 93, 94, + 95, 96, -1, -1, 24, 25, 26, -1, 28, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 38, -1, + -1, -1, 42, -1, -1, -1, 46, -1, -1, 49, + 50, 51, 52, -1, -1, -1, -1, -1, -1, -1, + 60, 61, -1, -1, -1, 65, 66, 67, 68, 69, + -1, -1, -1, -1, -1, -1, 76, -1, 78, 79, + -1, -1, -1, -1, -1, 85, -1, 87, -1, -1, + -1, -1, 92, 93, 94, 95, 96 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/share/bison.simple" @@ -1362,13 +1366,13 @@ yyparse(YYPARSE_PARAM_ARG) switch (yyn) { case 1: -#line 304 "asn1p_y.y" +#line 306 "asn1p_y.y" { *(void **)param = yyvsp[0].a_grammar; ; break;} case 2: -#line 310 "asn1p_y.y" +#line 312 "asn1p_y.y" { yyval.a_grammar = asn1p_new(); checkmem(yyval.a_grammar); @@ -1376,14 +1380,14 @@ case 2: ; break;} case 3: -#line 315 "asn1p_y.y" +#line 317 "asn1p_y.y" { yyval.a_grammar = yyvsp[-1].a_grammar; TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); ; break;} case 4: -#line 336 "asn1p_y.y" +#line 338 "asn1p_y.y" { if(yyvsp[-1].a_module) { @@ -1400,27 +1404,27 @@ case 4: ; break;} case 5: -#line 357 "asn1p_y.y" +#line 359 "asn1p_y.y" { yyval.a_oid = 0; ; break;} case 6: -#line 358 "asn1p_y.y" +#line 360 "asn1p_y.y" { yyval.a_oid = yyvsp[0].a_oid; ; break;} case 7: -#line 362 "asn1p_y.y" +#line 364 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; ; break;} case 8: -#line 365 "asn1p_y.y" +#line 367 "asn1p_y.y" { yyval.a_oid = 0; ; break;} case 9: -#line 371 "asn1p_y.y" +#line 373 "asn1p_y.y" { yyval.a_oid = asn1p_oid_new(); asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1429,7 +1433,7 @@ case 9: ; break;} case 10: -#line 377 "asn1p_y.y" +#line 379 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1438,74 +1442,74 @@ case 10: ; break;} case 11: -#line 386 "asn1p_y.y" +#line 388 "asn1p_y.y" { /* iso */ yyval.a_oid_arc.name = yyvsp[0].tv_str; yyval.a_oid_arc.number = -1; ; break;} case 12: -#line 390 "asn1p_y.y" +#line 392 "asn1p_y.y" { /* iso(1) */ yyval.a_oid_arc.name = yyvsp[-3].tv_str; yyval.a_oid_arc.number = yyvsp[-1].a_int; ; break;} case 13: -#line 394 "asn1p_y.y" +#line 396 "asn1p_y.y" { /* 1 */ yyval.a_oid_arc.name = 0; yyval.a_oid_arc.number = yyvsp[0].a_int; ; break;} case 14: -#line 404 "asn1p_y.y" +#line 406 "asn1p_y.y" { yyval.a_module_flags = MSF_NOFLAGS; ; break;} case 15: -#line 405 "asn1p_y.y" +#line 407 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; ; break;} case 16: -#line 414 "asn1p_y.y" +#line 416 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; ; break;} case 17: -#line 417 "asn1p_y.y" +#line 419 "asn1p_y.y" { yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags; ; break;} case 18: -#line 426 "asn1p_y.y" +#line 428 "asn1p_y.y" { yyval.a_module_flags = MSF_EXPLICIT_TAGS; ; break;} case 19: -#line 429 "asn1p_y.y" +#line 431 "asn1p_y.y" { yyval.a_module_flags = MSF_IMPLICIT_TAGS; ; break;} case 20: -#line 432 "asn1p_y.y" +#line 434 "asn1p_y.y" { yyval.a_module_flags = MSF_AUTOMATIC_TAGS; ; break;} case 21: -#line 435 "asn1p_y.y" +#line 437 "asn1p_y.y" { yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED; ; break;} case 22: -#line 439 "asn1p_y.y" +#line 441 "asn1p_y.y" { /* X.680Amd1 specifies TAG and XER */ if(strcmp(yyvsp[-1].tv_str, "TAG") == 0) { @@ -1523,23 +1527,23 @@ case 22: ; break;} case 23: -#line 460 "asn1p_y.y" +#line 462 "asn1p_y.y" { yyval.a_module = 0; ; break;} case 24: -#line 461 "asn1p_y.y" +#line 463 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 25: -#line 470 "asn1p_y.y" +#line 472 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 26: -#line 473 "asn1p_y.y" +#line 475 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; @@ -1569,13 +1573,13 @@ case 26: ; break;} case 27: -#line 506 "asn1p_y.y" +#line 508 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 28: -#line 509 "asn1p_y.y" +#line 511 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1587,7 +1591,7 @@ case 28: ; break;} case 29: -#line 518 "asn1p_y.y" +#line 520 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1597,7 +1601,7 @@ case 29: ; break;} case 30: -#line 525 "asn1p_y.y" +#line 527 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1607,7 +1611,7 @@ case 30: ; break;} case 31: -#line 538 "asn1p_y.y" +#line 540 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1617,11 +1621,11 @@ case 31: ; break;} case 32: -#line 546 "asn1p_y.y" +#line 548 "asn1p_y.y" { asn1p_lexer_hack_push_encoding_control(); ; break;} case 33: -#line 547 "asn1p_y.y" +#line 549 "asn1p_y.y" { fprintf(stderr, "WARNING: ENCODING-CONTROL %s " @@ -1632,7 +1636,7 @@ case 33: ; break;} case 34: -#line 559 "asn1p_y.y" +#line 561 "asn1p_y.y" { return yyerror( "Attempt to redefine a standard basic type, " @@ -1641,19 +1645,19 @@ case 34: ; break;} case 35: -#line 573 "asn1p_y.y" +#line 575 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; ; break;} case 36: -#line 579 "asn1p_y.y" +#line 581 "asn1p_y.y" { return yyerror("Empty IMPORTS list"); ; break;} case 37: -#line 585 "asn1p_y.y" +#line 587 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1661,14 +1665,14 @@ case 37: ; break;} case 38: -#line 590 "asn1p_y.y" +#line 592 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); ; break;} case 39: -#line 597 "asn1p_y.y" +#line 599 "asn1p_y.y" { yyval.a_xports = yyvsp[-3].a_xports; yyval.a_xports->from = yyvsp[-1].tv_str; @@ -1677,7 +1681,7 @@ case 39: ; break;} case 40: -#line 606 "asn1p_y.y" +#line 608 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); @@ -1685,14 +1689,14 @@ case 40: ; break;} case 41: -#line 611 "asn1p_y.y" +#line 613 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} case 42: -#line 618 "asn1p_y.y" +#line 620 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1701,7 +1705,7 @@ case 42: ; break;} case 43: -#line 624 "asn1p_y.y" +#line 626 "asn1p_y.y" { /* Completely equivalent to above */ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1710,7 +1714,7 @@ case 43: ; break;} case 44: -#line 630 "asn1p_y.y" +#line 632 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1719,19 +1723,19 @@ case 44: ; break;} case 45: -#line 639 "asn1p_y.y" +#line 641 "asn1p_y.y" { yyval.a_xports = yyvsp[-1].a_xports; ; break;} case 46: -#line 642 "asn1p_y.y" +#line 644 "asn1p_y.y" { yyval.a_xports = 0; ; break;} case 47: -#line 645 "asn1p_y.y" +#line 647 "asn1p_y.y" { /* Empty EXPORTS clause effectively prohibits export. */ yyval.a_xports = asn1p_xports_new(); @@ -1739,7 +1743,7 @@ case 47: ; break;} case 48: -#line 653 "asn1p_y.y" +#line 655 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); assert(yyval.a_xports); @@ -1747,14 +1751,14 @@ case 48: ; break;} case 49: -#line 658 "asn1p_y.y" +#line 660 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} case 50: -#line 665 "asn1p_y.y" +#line 667 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1763,7 +1767,7 @@ case 50: ; break;} case 51: -#line 671 "asn1p_y.y" +#line 673 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1772,7 +1776,7 @@ case 51: ; break;} case 52: -#line 677 "asn1p_y.y" +#line 679 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1781,7 +1785,7 @@ case 52: ; break;} case 53: -#line 687 "asn1p_y.y" +#line 689 "asn1p_y.y" { yyval.a_expr = yyvsp[-4].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1791,7 +1795,7 @@ case 53: ; break;} case 54: -#line 697 "asn1p_y.y" +#line 699 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1801,7 +1805,7 @@ case 54: ; break;} case 55: -#line 704 "asn1p_y.y" +#line 706 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1810,36 +1814,36 @@ case 55: ; break;} case 56: -#line 713 "asn1p_y.y" +#line 715 "asn1p_y.y" { ; break;} case 57: -#line 714 "asn1p_y.y" +#line 716 "asn1p_y.y" { ; break;} case 58: -#line 725 "asn1p_y.y" +#line 727 "asn1p_y.y" { ; break;} case 59: -#line 727 "asn1p_y.y" +#line 729 "asn1p_y.y" { ; break;} case 60: -#line 732 "asn1p_y.y" +#line 734 "asn1p_y.y" { ; break;} case 61: -#line 734 "asn1p_y.y" +#line 736 "asn1p_y.y" { ; break;} case 62: -#line 750 "asn1p_y.y" +#line 752 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1850,7 +1854,7 @@ case 62: ; break;} case 63: -#line 758 "asn1p_y.y" +#line 760 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -1859,7 +1863,7 @@ case 63: ; break;} case 64: -#line 764 "asn1p_y.y" +#line 766 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -1868,7 +1872,7 @@ case 64: ; break;} case 65: -#line 780 "asn1p_y.y" +#line 782 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1878,7 +1882,7 @@ case 65: ; break;} case 66: -#line 790 "asn1p_y.y" +#line 792 "asn1p_y.y" { int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); @@ -1890,7 +1894,7 @@ case 66: ; break;} case 67: -#line 799 "asn1p_y.y" +#line 801 "asn1p_y.y" { int ret; yyval.a_plist = yyvsp[-2].a_plist; @@ -1901,14 +1905,14 @@ case 67: ; break;} case 68: -#line 810 "asn1p_y.y" +#line 812 "asn1p_y.y" { yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} case 69: -#line 814 "asn1p_y.y" +#line 816 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1918,7 +1922,7 @@ case 69: ; break;} case 70: -#line 821 "asn1p_y.y" +#line 823 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1928,7 +1932,7 @@ case 70: ; break;} case 71: -#line 828 "asn1p_y.y" +#line 830 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1939,7 +1943,7 @@ case 71: ; break;} case 72: -#line 839 "asn1p_y.y" +#line 841 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1947,20 +1951,20 @@ case 72: ; break;} case 73: -#line 844 "asn1p_y.y" +#line 846 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 74: -#line 851 "asn1p_y.y" +#line 853 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 75: -#line 854 "asn1p_y.y" +#line 856 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1970,15 +1974,15 @@ case 75: ; break;} case 76: -#line 878 "asn1p_y.y" +#line 880 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); ; break;} case 77: -#line 879 "asn1p_y.y" +#line 881 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 78: -#line 882 "asn1p_y.y" +#line 884 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1986,14 +1990,14 @@ case 78: ; break;} case 79: -#line 887 "asn1p_y.y" +#line 889 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 80: -#line 894 "asn1p_y.y" +#line 896 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -2002,7 +2006,7 @@ case 80: ; break;} case 81: -#line 900 "asn1p_y.y" +#line 902 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2012,13 +2016,13 @@ case 81: ; break;} case 82: -#line 907 "asn1p_y.y" +#line 909 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 83: -#line 913 "asn1p_y.y" +#line 915 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2026,14 +2030,14 @@ case 83: ; break;} case 84: -#line 918 "asn1p_y.y" +#line 920 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 85: -#line 925 "asn1p_y.y" +#line 927 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -2041,13 +2045,13 @@ case 85: ; break;} case 86: -#line 930 "asn1p_y.y" +#line 932 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 87: -#line 936 "asn1p_y.y" +#line 938 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); @@ -2057,15 +2061,15 @@ case 87: ; break;} case 88: -#line 946 "asn1p_y.y" +#line 948 "asn1p_y.y" { yyval.a_int = 0; ; break;} case 89: -#line 947 "asn1p_y.y" +#line 949 "asn1p_y.y" { yyval.a_int = 1; ; break;} case 90: -#line 951 "asn1p_y.y" +#line 953 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2075,14 +2079,14 @@ case 90: ; break;} case 91: -#line 958 "asn1p_y.y" +#line 960 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 92: -#line 965 "asn1p_y.y" +#line 967 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2093,7 +2097,7 @@ case 92: ; break;} case 93: -#line 973 "asn1p_y.y" +#line 975 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; yyval.a_expr->Identifier = yyvsp[-3].a_refcomp.name; @@ -2102,7 +2106,7 @@ case 93: ; break;} case 94: -#line 979 "asn1p_y.y" +#line 981 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2120,47 +2124,47 @@ case 94: ; break;} case 95: -#line 997 "asn1p_y.y" +#line 999 "asn1p_y.y" { yyval.a_wsynt = 0; ; break;} case 96: -#line 998 "asn1p_y.y" +#line 1000 "asn1p_y.y" { yyval.a_wsynt = yyvsp[0].a_wsynt; ; break;} case 97: -#line 1005 "asn1p_y.y" +#line 1007 "asn1p_y.y" { asn1p_lexer_hack_enable_with_syntax(); ; break;} case 98: -#line 1007 "asn1p_y.y" +#line 1009 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; ; break;} case 99: -#line 1013 "asn1p_y.y" +#line 1015 "asn1p_y.y" { yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} case 100: -#line 1017 "asn1p_y.y" +#line 1019 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} case 101: -#line 1024 "asn1p_y.y" +#line 1026 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); ; break;} case 102: -#line 1027 "asn1p_y.y" +#line 1029 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2172,7 +2176,7 @@ case 102: ; break;} case 103: -#line 1039 "asn1p_y.y" +#line 1041 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2183,7 +2187,7 @@ case 103: ; break;} case 104: -#line 1047 "asn1p_y.y" +#line 1049 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2195,7 +2199,7 @@ case 104: ; break;} case 105: -#line 1056 "asn1p_y.y" +#line 1058 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2207,7 +2211,7 @@ case 105: ; break;} case 106: -#line 1068 "asn1p_y.y" +#line 1070 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; yyval.a_expr->tag = yyvsp[-2].a_tag; @@ -2229,13 +2233,13 @@ case 106: ; break;} case 107: -#line 1090 "asn1p_y.y" +#line 1092 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 108: -#line 1093 "asn1p_y.y" +#line 1095 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2244,7 +2248,7 @@ case 108: ; break;} case 109: -#line 1099 "asn1p_y.y" +#line 1101 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2253,7 +2257,7 @@ case 109: ; break;} case 110: -#line 1105 "asn1p_y.y" +#line 1107 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2262,7 +2266,7 @@ case 110: ; break;} case 111: -#line 1111 "asn1p_y.y" +#line 1113 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2275,7 +2279,7 @@ case 111: ; break;} case 112: -#line 1121 "asn1p_y.y" +#line 1123 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2288,7 +2292,7 @@ case 112: ; break;} case 113: -#line 1131 "asn1p_y.y" +#line 1133 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2297,7 +2301,7 @@ case 113: ; break;} case 114: -#line 1137 "asn1p_y.y" +#line 1139 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2311,7 +2315,7 @@ case 114: ; break;} case 115: -#line 1151 "asn1p_y.y" +#line 1153 "asn1p_y.y" { int ret; yyval.a_expr = yyvsp[-1].a_expr; @@ -2328,7 +2332,7 @@ case 115: ; break;} case 116: -#line 1175 "asn1p_y.y" +#line 1177 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2338,7 +2342,7 @@ case 116: ; break;} case 117: -#line 1182 "asn1p_y.y" +#line 1184 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2348,7 +2352,7 @@ case 117: ; break;} case 118: -#line 1197 "asn1p_y.y" +#line 1199 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2359,7 +2363,7 @@ case 118: ; break;} case 119: -#line 1205 "asn1p_y.y" +#line 1207 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2372,7 +2376,7 @@ case 119: ; break;} case 120: -#line 1215 "asn1p_y.y" +#line 1217 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2385,7 +2389,7 @@ case 120: ; break;} case 121: -#line 1225 "asn1p_y.y" +#line 1227 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2398,7 +2402,7 @@ case 121: ; break;} case 122: -#line 1235 "asn1p_y.y" +#line 1237 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2409,7 +2413,7 @@ case 122: ; break;} case 123: -#line 1243 "asn1p_y.y" +#line 1245 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[0].a_ref; @@ -2431,7 +2435,7 @@ case 123: ; break;} case 124: -#line 1265 "asn1p_y.y" +#line 1267 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2442,7 +2446,7 @@ case 124: ; break;} case 125: -#line 1273 "asn1p_y.y" +#line 1275 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[-2].a_ref; @@ -2452,21 +2456,21 @@ case 125: ; break;} case 128: -#line 1287 "asn1p_y.y" +#line 1289 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} case 129: -#line 1292 "asn1p_y.y" +#line 1294 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} case 130: -#line 1305 "asn1p_y.y" +#line 1307 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); @@ -2476,7 +2480,7 @@ case 130: ; break;} case 131: -#line 1315 "asn1p_y.y" +#line 1317 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2486,11 +2490,11 @@ case 131: ; break;} case 132: -#line 1322 "asn1p_y.y" -{ asn1p_lexer_hack_push_opaque_state(); ; +#line 1324 "asn1p_y.y" +{ printf("push\n"); asn1p_lexer_hack_push_opaque_state(); ; break;} case 133: -#line 1322 "asn1p_y.y" +#line 1324 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); @@ -2498,7 +2502,7 @@ case 133: ; break;} case 134: -#line 1327 "asn1p_y.y" +#line 1329 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2506,7 +2510,7 @@ case 134: ; break;} case 135: -#line 1332 "asn1p_y.y" +#line 1334 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2514,7 +2518,7 @@ case 135: ; break;} case 136: -#line 1337 "asn1p_y.y" +#line 1339 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2522,39 +2526,39 @@ case 136: ; break;} case 137: -#line 1342 "asn1p_y.y" +#line 1344 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); ; break;} case 138: -#line 1346 "asn1p_y.y" +#line 1348 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); ; break;} case 139: -#line 1350 "asn1p_y.y" +#line 1352 "asn1p_y.y" { yyval.a_value = yyval.a_value; ; break;} case 140: -#line 1353 "asn1p_y.y" +#line 1355 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 141: -#line 1356 "asn1p_y.y" +#line 1358 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 142: -#line 1362 "asn1p_y.y" +#line 1364 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2568,7 +2572,7 @@ case 142: ; break;} case 143: -#line 1373 "asn1p_y.y" +#line 1375 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2585,44 +2589,30 @@ case 143: ; break;} case 144: -#line 1391 "asn1p_y.y" +#line 1393 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} case 145: -#line 1395 "asn1p_y.y" -{ - asn1c_integer_t v = (yyvsp[-3].a_int << 4) + yyvsp[-1].a_int; - if(yyvsp[-3].a_int > 7) return yyerror("X.680:2003, #37.14 " - "mandates 0..7 range for Tuple's TableColumn"); - if(yyvsp[-1].a_int > 15) return yyerror("X.680:2003, #37.14 " - "mandates 0..15 range for Tuple's TableRow"); - yyval.a_value = asn1p_value_fromint(v); +#line 1397 "asn1p_y.y" +{ + yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); yyval.a_value->type = ATV_TUPLE; ; break;} case 146: -#line 1405 "asn1p_y.y" -{ - asn1c_integer_t v = (yyvsp[-7].a_int << 24) | (yyvsp[-5].a_int << 16) | (yyvsp[-3].a_int << 8) | yyvsp[-1].a_int; - if(yyvsp[-7].a_int > 127) return yyerror("X.680:2003, #37.12 " - "mandates 0..127 range for Quadruple's Group"); - if(yyvsp[-5].a_int > 255) return yyerror("X.680:2003, #37.12 " - "mandates 0..255 range for Quadruple's Plane"); - if(yyvsp[-3].a_int > 255) return yyerror("X.680:2003, #37.12 " - "mandates 0..255 range for Quadruple's Row"); - if(yyvsp[-1].a_int > 255) return yyerror("X.680:2003, #37.12 " - "mandates 0..255 range for Quadruple's Cell"); - yyval.a_value = asn1p_value_fromint(v); +#line 1402 "asn1p_y.y" +{ + yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); yyval.a_value->type = ATV_QUADRUPLE; ; break;} case 147: -#line 1422 "asn1p_y.y" +#line 1436 "asn1p_y.y" { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 1; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); @@ -2634,7 +2624,7 @@ case 147: ; break;} case 148: -#line 1431 "asn1p_y.y" +#line 1445 "asn1p_y.y" { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); @@ -2649,71 +2639,71 @@ case 148: ; break;} case 149: -#line 1446 "asn1p_y.y" +#line 1460 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BOOLEAN; ; break;} case 150: -#line 1447 "asn1p_y.y" +#line 1461 "asn1p_y.y" { yyval.a_type = ASN_BASIC_NULL; ; break;} case 151: -#line 1448 "asn1p_y.y" +#line 1462 "asn1p_y.y" { yyval.a_type = ASN_BASIC_REAL; ; break;} case 152: -#line 1449 "asn1p_y.y" +#line 1463 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} case 153: -#line 1450 "asn1p_y.y" +#line 1464 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OCTET_STRING; ; break;} case 154: -#line 1451 "asn1p_y.y" +#line 1465 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; break;} case 155: -#line 1452 "asn1p_y.y" +#line 1466 "asn1p_y.y" { yyval.a_type = ASN_BASIC_RELATIVE_OID; ; break;} case 156: -#line 1453 "asn1p_y.y" +#line 1467 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EXTERNAL; ; break;} case 157: -#line 1454 "asn1p_y.y" +#line 1468 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; break;} case 158: -#line 1455 "asn1p_y.y" +#line 1469 "asn1p_y.y" { yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; break;} case 159: -#line 1456 "asn1p_y.y" +#line 1470 "asn1p_y.y" { yyval.a_type = ASN_BASIC_UTCTime; ; break;} case 160: -#line 1457 "asn1p_y.y" +#line 1471 "asn1p_y.y" { yyval.a_type = ASN_BASIC_GeneralizedTime; ; break;} case 161: -#line 1458 "asn1p_y.y" +#line 1472 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} case 162: -#line 1465 "asn1p_y.y" +#line 1479 "asn1p_y.y" { yyval.a_type = ASN_BASIC_INTEGER; ; break;} case 163: -#line 1466 "asn1p_y.y" +#line 1480 "asn1p_y.y" { yyval.a_type = ASN_BASIC_ENUMERATED; ; break;} case 164: -#line 1467 "asn1p_y.y" +#line 1481 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BIT_STRING; ; break;} case 165: -#line 1471 "asn1p_y.y" +#line 1485 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2722,7 +2712,7 @@ case 165: ; break;} case 166: -#line 1477 "asn1p_y.y" +#line 1491 "asn1p_y.y" { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; @@ -2735,91 +2725,91 @@ case 166: ; break;} case 167: -#line 1490 "asn1p_y.y" +#line 1504 "asn1p_y.y" { yyval.a_type = ASN_STRING_BMPString; ; break;} case 168: -#line 1491 "asn1p_y.y" +#line 1505 "asn1p_y.y" { yyval.a_type = ASN_STRING_GeneralString; fprintf(stderr, "WARNING: GeneralString is not fully supported\n"); ; break;} case 169: -#line 1495 "asn1p_y.y" +#line 1509 "asn1p_y.y" { yyval.a_type = ASN_STRING_GraphicString; fprintf(stderr, "WARNING: GraphicString is not fully supported\n"); ; break;} case 170: -#line 1499 "asn1p_y.y" +#line 1513 "asn1p_y.y" { yyval.a_type = ASN_STRING_IA5String; ; break;} case 171: -#line 1500 "asn1p_y.y" +#line 1514 "asn1p_y.y" { yyval.a_type = ASN_STRING_ISO646String; ; break;} case 172: -#line 1501 "asn1p_y.y" +#line 1515 "asn1p_y.y" { yyval.a_type = ASN_STRING_NumericString; ; break;} case 173: -#line 1502 "asn1p_y.y" +#line 1516 "asn1p_y.y" { yyval.a_type = ASN_STRING_PrintableString; ; break;} case 174: -#line 1503 "asn1p_y.y" +#line 1517 "asn1p_y.y" { yyval.a_type = ASN_STRING_T61String; fprintf(stderr, "WARNING: T61String is not fully supported\n"); ; break;} case 175: -#line 1507 "asn1p_y.y" +#line 1521 "asn1p_y.y" { yyval.a_type = ASN_STRING_TeletexString; ; break;} case 176: -#line 1508 "asn1p_y.y" +#line 1522 "asn1p_y.y" { yyval.a_type = ASN_STRING_UniversalString; ; break;} case 177: -#line 1509 "asn1p_y.y" +#line 1523 "asn1p_y.y" { yyval.a_type = ASN_STRING_UTF8String; ; break;} case 178: -#line 1510 "asn1p_y.y" +#line 1524 "asn1p_y.y" { yyval.a_type = ASN_STRING_VideotexString; fprintf(stderr, "WARNING: VideotexString is not fully supported\n"); ; break;} case 179: -#line 1514 "asn1p_y.y" +#line 1528 "asn1p_y.y" { yyval.a_type = ASN_STRING_VisibleString; ; break;} case 180: -#line 1515 "asn1p_y.y" +#line 1529 "asn1p_y.y" { yyval.a_type = ASN_STRING_ObjectDescriptor; ; break;} case 186: -#line 1527 "asn1p_y.y" +#line 1541 "asn1p_y.y" { yyval.a_constr = 0; ; break;} case 187: -#line 1528 "asn1p_y.y" +#line 1542 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 188: -#line 1534 "asn1p_y.y" +#line 1548 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); ; break;} case 189: -#line 1537 "asn1p_y.y" +#line 1551 "asn1p_y.y" { /* * This is a special case, for compatibility purposes. @@ -2829,25 +2819,25 @@ case 189: ; break;} case 190: -#line 1547 "asn1p_y.y" +#line 1561 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; ; break;} case 191: -#line 1550 "asn1p_y.y" +#line 1564 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} case 192: -#line 1556 "asn1p_y.y" +#line 1570 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 193: -#line 1559 "asn1p_y.y" +#line 1573 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2856,7 +2846,7 @@ case 193: ; break;} case 194: -#line 1565 "asn1p_y.y" +#line 1579 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2867,37 +2857,37 @@ case 194: ; break;} case 195: -#line 1576 "asn1p_y.y" +#line 1590 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 196: -#line 1579 "asn1p_y.y" +#line 1593 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_AEX, yyvsp[0].a_constr, 0); ; break;} case 197: -#line 1582 "asn1p_y.y" +#line 1596 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 198: -#line 1585 "asn1p_y.y" +#line 1599 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 199: -#line 1588 "asn1p_y.y" +#line 1602 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 200: -#line 1594 "asn1p_y.y" +#line 1608 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2908,7 +2898,7 @@ case 200: ; break;} case 201: -#line 1602 "asn1p_y.y" +#line 1616 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2919,7 +2909,7 @@ case 201: ; break;} case 202: -#line 1610 "asn1p_y.y" +#line 1624 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2928,7 +2918,7 @@ case 202: ; break;} case 203: -#line 1616 "asn1p_y.y" +#line 1630 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2937,7 +2927,7 @@ case 203: ; break;} case 204: -#line 1622 "asn1p_y.y" +#line 1636 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2947,7 +2937,7 @@ case 204: ; break;} case 205: -#line 1629 "asn1p_y.y" +#line 1643 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2958,7 +2948,7 @@ case 205: ; break;} case 206: -#line 1637 "asn1p_y.y" +#line 1651 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2969,7 +2959,7 @@ case 206: ; break;} case 207: -#line 1645 "asn1p_y.y" +#line 1659 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2981,23 +2971,23 @@ case 207: ; break;} case 208: -#line 1654 "asn1p_y.y" +#line 1668 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 209: -#line 1657 "asn1p_y.y" +#line 1671 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 210: -#line 1661 "asn1p_y.y" +#line 1675 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} case 211: -#line 1661 "asn1p_y.y" +#line 1675 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3008,35 +2998,35 @@ case 211: ; break;} case 212: -#line 1672 "asn1p_y.y" +#line 1686 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RANGE; ; break;} case 213: -#line 1673 "asn1p_y.y" +#line 1687 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RLRANGE; ; break;} case 214: -#line 1674 "asn1p_y.y" +#line 1688 "asn1p_y.y" { yyval.a_ctype = ACT_EL_LLRANGE; ; break;} case 215: -#line 1675 "asn1p_y.y" +#line 1689 "asn1p_y.y" { yyval.a_ctype = ACT_EL_ULRANGE; ; break;} case 216: -#line 1679 "asn1p_y.y" +#line 1693 "asn1p_y.y" { yyval.a_ctype = ACT_CT_SIZE; ; break;} case 217: -#line 1682 "asn1p_y.y" +#line 1696 "asn1p_y.y" { yyval.a_ctype = ACT_CT_FROM; ; break;} case 218: -#line 1688 "asn1p_y.y" +#line 1702 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -3044,7 +3034,7 @@ case 218: ; break;} case 219: -#line 1693 "asn1p_y.y" +#line 1707 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); @@ -3052,19 +3042,19 @@ case 219: ; break;} case 220: -#line 1698 "asn1p_y.y" +#line 1712 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 221: -#line 1701 "asn1p_y.y" +#line 1715 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 222: -#line 1704 "asn1p_y.y" +#line 1718 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3078,7 +3068,7 @@ case 222: ; break;} case 223: -#line 1718 "asn1p_y.y" +#line 1732 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3092,25 +3082,25 @@ case 223: ; break;} case 224: -#line 1732 "asn1p_y.y" +#line 1746 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); ; break;} case 225: -#line 1738 "asn1p_y.y" +#line 1752 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 226: -#line 1741 "asn1p_y.y" +#line 1755 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 227: -#line 1747 "asn1p_y.y" +#line 1761 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3118,7 +3108,7 @@ case 227: ; break;} case 228: -#line 1752 "asn1p_y.y" +#line 1766 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3128,45 +3118,45 @@ case 228: ; break;} case 229: -#line 1765 "asn1p_y.y" +#line 1779 "asn1p_y.y" { yyval.a_pres = ACPRES_DEFAULT; ; break;} case 230: -#line 1766 "asn1p_y.y" +#line 1780 "asn1p_y.y" { yyval.a_pres = yyvsp[0].a_pres; ; break;} case 231: -#line 1770 "asn1p_y.y" +#line 1784 "asn1p_y.y" { yyval.a_pres = ACPRES_PRESENT; ; break;} case 232: -#line 1773 "asn1p_y.y" +#line 1787 "asn1p_y.y" { yyval.a_pres = ACPRES_ABSENT; ; break;} case 233: -#line 1776 "asn1p_y.y" +#line 1790 "asn1p_y.y" { yyval.a_pres = ACPRES_OPTIONAL; ; break;} case 234: -#line 1782 "asn1p_y.y" +#line 1796 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 235: -#line 1785 "asn1p_y.y" +#line 1799 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 236: -#line 1794 "asn1p_y.y" +#line 1808 "asn1p_y.y" { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; @@ -3181,13 +3171,13 @@ case 236: ; break;} case 237: -#line 1809 "asn1p_y.y" +#line 1823 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} case 238: -#line 1815 "asn1p_y.y" +#line 1829 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3196,7 +3186,7 @@ case 238: ; break;} case 239: -#line 1821 "asn1p_y.y" +#line 1835 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3207,7 +3197,7 @@ case 239: ; break;} case 240: -#line 1835 "asn1p_y.y" +#line 1849 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; @@ -3221,7 +3211,7 @@ case 240: ; break;} case 241: -#line 1846 "asn1p_y.y" +#line 1860 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; @@ -3236,13 +3226,13 @@ case 241: ; break;} case 242: -#line 1862 "asn1p_y.y" +#line 1876 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} case 243: -#line 1865 "asn1p_y.y" +#line 1879 "asn1p_y.y" { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); @@ -3254,45 +3244,45 @@ case 243: ; break;} case 244: -#line 1883 "asn1p_y.y" +#line 1897 "asn1p_y.y" { yyval.a_marker.flags = EM_NOMARK; yyval.a_marker.default_value = 0; ; break;} case 245: -#line 1887 "asn1p_y.y" +#line 1901 "asn1p_y.y" { yyval.a_marker = yyvsp[0].a_marker; ; break;} case 246: -#line 1891 "asn1p_y.y" +#line 1905 "asn1p_y.y" { yyval.a_marker.flags = EM_OPTIONAL; yyval.a_marker.default_value = 0; ; break;} case 247: -#line 1895 "asn1p_y.y" +#line 1909 "asn1p_y.y" { yyval.a_marker.flags = EM_DEFAULT; yyval.a_marker.default_value = yyvsp[0].a_value; ; break;} case 248: -#line 1918 "asn1p_y.y" +#line 1932 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); ; break;} case 249: -#line 1922 "asn1p_y.y" +#line 1936 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; ; break;} case 250: -#line 1928 "asn1p_y.y" +#line 1942 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3300,14 +3290,14 @@ case 250: ; break;} case 251: -#line 1933 "asn1p_y.y" +#line 1947 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 252: -#line 1940 "asn1p_y.y" +#line 1954 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3317,7 +3307,7 @@ case 252: ; break;} case 253: -#line 1947 "asn1p_y.y" +#line 1961 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3328,7 +3318,7 @@ case 253: ; break;} case 254: -#line 1955 "asn1p_y.y" +#line 1969 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3339,7 +3329,7 @@ case 254: ; break;} case 255: -#line 1963 "asn1p_y.y" +#line 1977 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3349,7 +3339,7 @@ case 255: ; break;} case 256: -#line 1970 "asn1p_y.y" +#line 1984 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3360,102 +3350,102 @@ case 256: ; break;} case 257: -#line 1981 "asn1p_y.y" +#line 1995 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} case 258: -#line 1985 "asn1p_y.y" +#line 1999 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} case 259: -#line 2016 "asn1p_y.y" +#line 2030 "asn1p_y.y" { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; break;} case 260: -#line 2017 "asn1p_y.y" +#line 2031 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; ; break;} case 261: -#line 2021 "asn1p_y.y" +#line 2035 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = yyvsp[0].a_tag.tag_mode; ; break;} case 262: -#line 2028 "asn1p_y.y" +#line 2042 "asn1p_y.y" { yyval.a_tag = yyvsp[-2].a_tag; yyval.a_tag.tag_value = yyvsp[-1].a_int; ; break;} case 263: -#line 2034 "asn1p_y.y" +#line 2048 "asn1p_y.y" { yyval.a_tag.tag_class = TC_CONTEXT_SPECIFIC; ; break;} case 264: -#line 2035 "asn1p_y.y" +#line 2049 "asn1p_y.y" { yyval.a_tag.tag_class = TC_UNIVERSAL; ; break;} case 265: -#line 2036 "asn1p_y.y" +#line 2050 "asn1p_y.y" { yyval.a_tag.tag_class = TC_APPLICATION; ; break;} case 266: -#line 2037 "asn1p_y.y" +#line 2051 "asn1p_y.y" { yyval.a_tag.tag_class = TC_PRIVATE; ; break;} case 267: -#line 2041 "asn1p_y.y" +#line 2055 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_DEFAULT; ; break;} case 268: -#line 2042 "asn1p_y.y" +#line 2056 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_IMPLICIT; ; break;} case 269: -#line 2043 "asn1p_y.y" +#line 2057 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_EXPLICIT; ; break;} case 270: -#line 2047 "asn1p_y.y" +#line 2061 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} case 271: -#line 2051 "asn1p_y.y" +#line 2065 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} case 272: -#line 2059 "asn1p_y.y" +#line 2073 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} case 273: -#line 2066 "asn1p_y.y" +#line 2080 "asn1p_y.y" { yyval.tv_str = 0; ; break;} case 274: -#line 2067 "asn1p_y.y" +#line 2081 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} case 275: -#line 2072 "asn1p_y.y" +#line 2086 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; @@ -3683,7 +3673,7 @@ case 275: } return 1; } -#line 2078 "asn1p_y.y" +#line 2092 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.h b/libasn1parser/asn1p_y.h index 3b8d86de5..71417b360 100644 --- a/libasn1parser/asn1p_y.h +++ b/libasn1parser/asn1p_y.h @@ -37,97 +37,99 @@ typedef union { #define TOK_hstring 261 #define TOK_identifier 262 #define TOK_number 263 -#define TOK_number_negative 264 -#define TOK_typereference 265 -#define TOK_capitalreference 266 -#define TOK_typefieldreference 267 -#define TOK_valuefieldreference 268 -#define TOK_ABSENT 269 -#define TOK_ABSTRACT_SYNTAX 270 -#define TOK_ALL 271 -#define TOK_ANY 272 -#define TOK_APPLICATION 273 -#define TOK_AUTOMATIC 274 -#define TOK_BEGIN 275 -#define TOK_BIT 276 -#define TOK_BMPString 277 -#define TOK_BOOLEAN 278 -#define TOK_BY 279 -#define TOK_CHARACTER 280 -#define TOK_CHOICE 281 -#define TOK_CLASS 282 -#define TOK_COMPONENT 283 -#define TOK_COMPONENTS 284 -#define TOK_CONSTRAINED 285 -#define TOK_CONTAINING 286 -#define TOK_DEFAULT 287 -#define TOK_DEFINITIONS 288 -#define TOK_DEFINED 289 -#define TOK_EMBEDDED 290 -#define TOK_ENCODED 291 -#define TOK_ENCODING_CONTROL 292 -#define TOK_END 293 -#define TOK_ENUMERATED 294 -#define TOK_EXPLICIT 295 -#define TOK_EXPORTS 296 -#define TOK_EXTENSIBILITY 297 -#define TOK_EXTERNAL 298 -#define TOK_FALSE 299 -#define TOK_FROM 300 -#define TOK_GeneralizedTime 301 -#define TOK_GeneralString 302 -#define TOK_GraphicString 303 -#define TOK_IA5String 304 -#define TOK_IDENTIFIER 305 -#define TOK_IMPLICIT 306 -#define TOK_IMPLIED 307 -#define TOK_IMPORTS 308 -#define TOK_INCLUDES 309 -#define TOK_INSTANCE 310 -#define TOK_INSTRUCTIONS 311 -#define TOK_INTEGER 312 -#define TOK_ISO646String 313 -#define TOK_MAX 314 -#define TOK_MIN 315 -#define TOK_MINUS_INFINITY 316 -#define TOK_NULL 317 -#define TOK_NumericString 318 -#define TOK_OBJECT 319 -#define TOK_ObjectDescriptor 320 -#define TOK_OCTET 321 -#define TOK_OF 322 -#define TOK_OPTIONAL 323 -#define TOK_PATTERN 324 -#define TOK_PDV 325 -#define TOK_PLUS_INFINITY 326 -#define TOK_PRESENT 327 -#define TOK_PrintableString 328 -#define TOK_PRIVATE 329 -#define TOK_REAL 330 -#define TOK_RELATIVE_OID 331 -#define TOK_SEQUENCE 332 -#define TOK_SET 333 -#define TOK_SIZE 334 -#define TOK_STRING 335 -#define TOK_SYNTAX 336 -#define TOK_T61String 337 -#define TOK_TAGS 338 -#define TOK_TeletexString 339 -#define TOK_TRUE 340 -#define TOK_TYPE_IDENTIFIER 341 -#define TOK_UNIQUE 342 -#define TOK_UNIVERSAL 343 -#define TOK_UniversalString 344 -#define TOK_UTCTime 345 -#define TOK_UTF8String 346 -#define TOK_VideotexString 347 -#define TOK_VisibleString 348 -#define TOK_WITH 349 -#define TOK_EXCEPT 350 -#define TOK_INTERSECTION 351 -#define TOK_UNION 352 -#define TOK_TwoDots 353 -#define TOK_ThreeDots 354 +#define TOK_tuple 264 +#define TOK_quadruple 265 +#define TOK_number_negative 266 +#define TOK_typereference 267 +#define TOK_capitalreference 268 +#define TOK_typefieldreference 269 +#define TOK_valuefieldreference 270 +#define TOK_ABSENT 271 +#define TOK_ABSTRACT_SYNTAX 272 +#define TOK_ALL 273 +#define TOK_ANY 274 +#define TOK_APPLICATION 275 +#define TOK_AUTOMATIC 276 +#define TOK_BEGIN 277 +#define TOK_BIT 278 +#define TOK_BMPString 279 +#define TOK_BOOLEAN 280 +#define TOK_BY 281 +#define TOK_CHARACTER 282 +#define TOK_CHOICE 283 +#define TOK_CLASS 284 +#define TOK_COMPONENT 285 +#define TOK_COMPONENTS 286 +#define TOK_CONSTRAINED 287 +#define TOK_CONTAINING 288 +#define TOK_DEFAULT 289 +#define TOK_DEFINITIONS 290 +#define TOK_DEFINED 291 +#define TOK_EMBEDDED 292 +#define TOK_ENCODED 293 +#define TOK_ENCODING_CONTROL 294 +#define TOK_END 295 +#define TOK_ENUMERATED 296 +#define TOK_EXPLICIT 297 +#define TOK_EXPORTS 298 +#define TOK_EXTENSIBILITY 299 +#define TOK_EXTERNAL 300 +#define TOK_FALSE 301 +#define TOK_FROM 302 +#define TOK_GeneralizedTime 303 +#define TOK_GeneralString 304 +#define TOK_GraphicString 305 +#define TOK_IA5String 306 +#define TOK_IDENTIFIER 307 +#define TOK_IMPLICIT 308 +#define TOK_IMPLIED 309 +#define TOK_IMPORTS 310 +#define TOK_INCLUDES 311 +#define TOK_INSTANCE 312 +#define TOK_INSTRUCTIONS 313 +#define TOK_INTEGER 314 +#define TOK_ISO646String 315 +#define TOK_MAX 316 +#define TOK_MIN 317 +#define TOK_MINUS_INFINITY 318 +#define TOK_NULL 319 +#define TOK_NumericString 320 +#define TOK_OBJECT 321 +#define TOK_ObjectDescriptor 322 +#define TOK_OCTET 323 +#define TOK_OF 324 +#define TOK_OPTIONAL 325 +#define TOK_PATTERN 326 +#define TOK_PDV 327 +#define TOK_PLUS_INFINITY 328 +#define TOK_PRESENT 329 +#define TOK_PrintableString 330 +#define TOK_PRIVATE 331 +#define TOK_REAL 332 +#define TOK_RELATIVE_OID 333 +#define TOK_SEQUENCE 334 +#define TOK_SET 335 +#define TOK_SIZE 336 +#define TOK_STRING 337 +#define TOK_SYNTAX 338 +#define TOK_T61String 339 +#define TOK_TAGS 340 +#define TOK_TeletexString 341 +#define TOK_TRUE 342 +#define TOK_TYPE_IDENTIFIER 343 +#define TOK_UNIQUE 344 +#define TOK_UNIVERSAL 345 +#define TOK_UniversalString 346 +#define TOK_UTCTime 347 +#define TOK_UTF8String 348 +#define TOK_VideotexString 349 +#define TOK_VisibleString 350 +#define TOK_WITH 351 +#define TOK_EXCEPT 352 +#define TOK_INTERSECTION 353 +#define TOK_UNION 354 +#define TOK_TwoDots 355 +#define TOK_ThreeDots 356 extern YYSTYPE asn1p_lval; diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index b6be6f6f6..01e842fbc 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -98,6 +98,8 @@ static asn1p_value_t * %token TOK_hstring %token TOK_identifier %token TOK_number +%token TOK_tuple +%token TOK_quadruple %token TOK_number_negative %token TOK_typereference %token TOK_capitalreference /* "CLASS1" */ @@ -1319,7 +1321,7 @@ Value: $$->value.choice_identifier.identifier = $1; $$->value.choice_identifier.value = $3; } - | '{' { asn1p_lexer_hack_push_opaque_state(); } Opaque /* '}' */ { + | '{' { printf("push\n"); asn1p_lexer_hack_push_opaque_state(); } Opaque /* '}' */ { $$ = asn1p_value_frombuf($3.buf, $3.len, 0); checkmem($$); $$->type = ATV_UNPARSED; @@ -1392,6 +1394,17 @@ RestrictedCharacterStringValue: $$ = asn1p_value_frombuf($1.buf, $1.len, 0); checkmem($$); } + | TOK_tuple { + $$ = asn1p_value_fromint($1); + checkmem($$); + $$->type = ATV_TUPLE; + } + | TOK_quadruple { + $$ = asn1p_value_fromint($1); + checkmem($$); + $$->type = ATV_QUADRUPLE; + } + /* | '{' TOK_number ',' TOK_number '}' { asn1c_integer_t v = ($2 << 4) + $4; if($2 > 7) return yyerror("X.680:2003, #37.14 " @@ -1416,6 +1429,7 @@ RestrictedCharacterStringValue: checkmem($$); $$->type = ATV_QUADRUPLE; } + */ ; Opaque: From 2fdbfe81fccb34701676ae96f655d2f982408114 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 24 Mar 2005 16:24:47 +0000 Subject: [PATCH 0835/1469] complex DEFAULT git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@835 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/81-type-default-OK.asn1 | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 tests/81-type-default-OK.asn1 diff --git a/tests/81-type-default-OK.asn1 b/tests/81-type-default-OK.asn1 new file mode 100644 index 000000000..e1fe6a108 --- /dev/null +++ b/tests/81-type-default-OK.asn1 @@ -0,0 +1,20 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .81 + +ModuleTestTypeDefault1 + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 81 } + DEFINITIONS ::= +BEGIN + + Type ::= SEQUENCE { + other SEQUENCE { + member-1 INTEGER + } DEFAULT { member-1 5 } + } + +END From d30bc6c801baca11750913f7ebce9a95f8fe8aa5 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 24 Mar 2005 16:27:02 +0000 Subject: [PATCH 0836/1469] oops git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@836 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/asn1c.c | 2 +- libasn1parser/asn1p_y.c | 2 +- libasn1parser/asn1p_y.y | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index 9340c7012..cf951af15 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -282,7 +282,7 @@ main(int ac, char **av) { exit(EX_SOFTWARE); } - return 2; + return 0; } /* diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index 1f90ec350..a5cc4a8ac 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -2491,7 +2491,7 @@ case 131: break;} case 132: #line 1324 "asn1p_y.y" -{ printf("push\n"); asn1p_lexer_hack_push_opaque_state(); ; +{ asn1p_lexer_hack_push_opaque_state(); ; break;} case 133: #line 1324 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index 01e842fbc..815423daa 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -1321,7 +1321,7 @@ Value: $$->value.choice_identifier.identifier = $1; $$->value.choice_identifier.value = $3; } - | '{' { printf("push\n"); asn1p_lexer_hack_push_opaque_state(); } Opaque /* '}' */ { + | '{' { asn1p_lexer_hack_push_opaque_state(); } Opaque /* '}' */ { $$ = asn1p_value_frombuf($3.buf, $3.len, 0); checkmem($$); $$->type = ATV_UNPARSED; From 20e60ccdac59397c5816ad7ce283b76852e0989b Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 24 Mar 2005 16:35:24 +0000 Subject: [PATCH 0837/1469] better logging git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@837 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_value.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libasn1fix/asn1fix_value.c b/libasn1fix/asn1fix_value.c index 18d868665..60259421d 100644 --- a/libasn1fix/asn1fix_value.c +++ b/libasn1fix/asn1fix_value.c @@ -29,12 +29,14 @@ asn1f_value_resolve(arg_t *arg, asn1p_expr_t *expr, const enum asn1p_constraint_ type_expr = asn1f_find_terminal_type(arg, expr); DEBUG("terminal type %p", type_expr); if(type_expr == 0) { - FATAL("Terminal type for is %s not found", expr->Identifier); + FATAL("Terminal type for %s at line %d not found", + expr->Identifier, expr->_lineno); return -1; } if(asn1f_look_value_in_type(arg, type_expr, expr) == -1) { - FATAL("Value not found in type for %s", expr->Identifier); + FATAL("Value not found in type for %s at line %d", + expr->Identifier, expr->_lineno); return -1; } From 3b94853606cd016c63abe63229be822ce5bac554 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Mar 2005 07:50:06 +0000 Subject: [PATCH 0838/1469] preliminary WITH COMPONENTS printing support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@838 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1print/asn1print.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index ecb91f095..addfd9cc6 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -333,8 +333,11 @@ asn1print_constraint(asn1p_constraint_t *ct, enum asn1print_flags flags) { printf(")"); break; case ACT_CT_WCOMP: + printf("WITH COMPONENT ???"); + break; case ACT_CT_WCOMPS: - printf("???"); + printf("WITH COMPONENTS { ??? }"); + break; case ACT_CT_CTDBY: printf("CONSTRAINED BY "); assert(ct->value->type == ATV_UNPARSED); From 7bbdc9f651c48522a41d22dec0955253c3db9b8d Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Mar 2005 15:01:27 +0000 Subject: [PATCH 0839/1469] WITH COMPONENT[S] pretty-printing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@839 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 3 +- libasn1parser/asn1p_y.c | 719 ++++++++++++++++++++------------------- libasn1parser/asn1p_y.y | 13 +- libasn1print/asn1print.c | 32 +- 4 files changed, 404 insertions(+), 363 deletions(-) diff --git a/ChangeLog b/ChangeLog index afa2f8f0c..31e8c5fdf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9.13: 2005-Mar-24 +0.9.13: 2005-Mar-28 * Added extra const qualifiers into the support code. * More RFC variations supported in crfc2asn1.pl. @@ -8,6 +8,7 @@ * Parsing support for CONSTRAINED BY. (Test case 79). * Support for CharsDefn (Quadruple and Tuple, most used in ASN1-CHARACTER-MODULE) (Test case 80). + * Pretty-printing support for WITH COMPONENT[S]. (Test case 82). 0.9.12: 2005-Mar-10 diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index a5cc4a8ac..ae4e31a43 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -206,7 +206,7 @@ typedef union { -#define YYFINAL 429 +#define YYFINAL 431 #define YYFLAG -32768 #define YYNTBASE 118 @@ -275,12 +275,12 @@ static const short yyprhs[] = { 0, 534, 539, 541, 545, 551, 553, 557, 561, 565, 569, 574, 578, 580, 582, 586, 590, 594, 598, 600, 602, 603, 609, 611, 614, 617, 621, 623, 625, 627, 629, - 631, 633, 635, 637, 643, 645, 649, 651, 655, 656, - 658, 660, 662, 664, 666, 668, 672, 677, 679, 683, - 686, 690, 692, 696, 697, 699, 701, 704, 707, 711, - 713, 717, 719, 724, 729, 731, 733, 735, 737, 738, - 740, 743, 748, 749, 751, 753, 755, 756, 758, 760, - 762, 764, 766, 767, 769 + 631, 633, 635, 637, 641, 647, 649, 653, 655, 659, + 660, 662, 664, 666, 668, 670, 672, 676, 681, 683, + 687, 690, 694, 696, 700, 701, 703, 705, 708, 711, + 715, 717, 721, 723, 728, 733, 735, 737, 739, 741, + 742, 744, 747, 752, 753, 755, 757, 759, 760, 762, + 764, 766, 768, 770, 771, 773 }; static const short yyrhs[] = { 119, @@ -347,20 +347,21 @@ static const short yyrhs[] = { 119, 0, 0, 33, 27, 105, 191, 177, 0, 103, 0, 103, 114, 0, 114, 103, 0, 114, 103, 114, 0, 82, 0, 48, 0, 47, 0, 88, 0, 212, 0, - 176, 0, 221, 0, 218, 0, 97, 32, 105, 197, - 106, 0, 198, 0, 197, 110, 198, 0, 104, 0, - 221, 185, 199, 0, 0, 200, 0, 75, 0, 17, - 0, 71, 0, 202, 0, 203, 0, 105, 218, 106, - 0, 202, 105, 204, 106, 0, 205, 0, 204, 110, - 205, 0, 115, 206, 0, 115, 113, 206, 0, 221, - 0, 206, 113, 221, 0, 0, 208, 0, 71, 0, - 35, 173, 0, 105, 106, 0, 105, 210, 106, 0, - 211, 0, 210, 110, 211, 0, 221, 0, 221, 107, - 212, 108, 0, 221, 107, 175, 108, 0, 212, 0, - 104, 0, 9, 0, 12, 0, 0, 214, 0, 215, - 217, 0, 116, 216, 9, 117, 0, 0, 91, 0, - 21, 0, 77, 0, 0, 54, 0, 43, 0, 13, - 0, 14, 0, 14, 0, 0, 221, 0, 8, 0 + 176, 0, 221, 0, 218, 0, 97, 31, 187, 0, + 97, 32, 105, 197, 106, 0, 198, 0, 197, 110, + 198, 0, 104, 0, 221, 185, 199, 0, 0, 200, + 0, 75, 0, 17, 0, 71, 0, 202, 0, 203, + 0, 105, 218, 106, 0, 202, 105, 204, 106, 0, + 205, 0, 204, 110, 205, 0, 115, 206, 0, 115, + 113, 206, 0, 221, 0, 206, 113, 221, 0, 0, + 208, 0, 71, 0, 35, 173, 0, 105, 106, 0, + 105, 210, 106, 0, 211, 0, 210, 110, 211, 0, + 221, 0, 221, 107, 212, 108, 0, 221, 107, 175, + 108, 0, 212, 0, 104, 0, 9, 0, 12, 0, + 0, 214, 0, 215, 217, 0, 116, 216, 9, 117, + 0, 0, 91, 0, 21, 0, 77, 0, 0, 54, + 0, 43, 0, 13, 0, 14, 0, 14, 0, 0, + 221, 0, 8, 0 }; #endif @@ -389,12 +390,12 @@ static const short yyrline[] = { 0, 1564, 1569, 1573, 1579, 1589, 1593, 1596, 1599, 1602, 1607, 1616, 1624, 1630, 1636, 1643, 1651, 1659, 1668, 1671, 1674, 1675, 1685, 1687, 1688, 1689, 1692, 1696, 1701, 1707, 1712, - 1715, 1718, 1731, 1745, 1751, 1755, 1760, 1766, 1778, 1780, - 1783, 1787, 1790, 1795, 1799, 1807, 1822, 1828, 1835, 1848, - 1860, 1875, 1879, 1896, 1901, 1904, 1909, 1931, 1936, 1941, - 1947, 1953, 1961, 1969, 1977, 1984, 1994, 1999, 2029, 2031, - 2034, 2041, 2047, 2049, 2050, 2051, 2054, 2056, 2057, 2060, - 2065, 2072, 2079, 2081, 2085 + 1715, 1718, 1731, 1745, 1749, 1754, 1758, 1763, 1770, 1783, + 1785, 1788, 1792, 1795, 1800, 1804, 1812, 1827, 1833, 1840, + 1853, 1865, 1880, 1884, 1901, 1906, 1909, 1914, 1936, 1941, + 1946, 1952, 1958, 1966, 1974, 1982, 1989, 1999, 2004, 2034, + 2036, 2039, 2046, 2052, 2054, 2055, 2056, 2059, 2061, 2062, + 2065, 2070, 2077, 2084, 2086, 2090 }; #endif @@ -438,12 +439,12 @@ static const char * const yytname[] = { "$","error","$undefined.","TOK_PPEQ", "BasicTypeId_UniverationCompatible","BasicType","BasicString","Union","Intersection", "Except","optConstraints","Constraints","SetOfConstraints","ElementSetSpecs", "ElementSetSpec","ConstraintSubtypeElement","@4","ConstraintRangeSpec","ConstraintSpec", -"SingleValue","ContainedSubtype","WithComponents","WithComponentsList","WithComponentsElement", -"optPresenceConstraint","PresenceConstraint","TableConstraint","SimpleTableConstraint", -"ComponentRelationConstraint","AtNotationList","AtNotationElement","ComponentIdList", -"optMarker","Marker","UniverationDefinition","UniverationList","UniverationElement", -"SignedNumber","optTag","Tag","TagTypeValue","TagClass","TagPlicit","TypeRefName", -"ObjectClassReference","optIdentifier","Identifier", NULL +"SingleValue","ContainedSubtype","InnerTypeConstraint","WithComponentsList", +"WithComponentsElement","optPresenceConstraint","PresenceConstraint","TableConstraint", +"SimpleTableConstraint","ComponentRelationConstraint","AtNotationList","AtNotationElement", +"ComponentIdList","optMarker","Marker","UniverationDefinition","UniverationList", +"UniverationElement","SignedNumber","optTag","Tag","TagTypeValue","TagClass", +"TagPlicit","TypeRefName","ObjectClassReference","optIdentifier","Identifier", NULL }; #endif @@ -470,12 +471,12 @@ static const short yyr1[] = { 0, 187, 188, 188, 188, 189, 189, 189, 189, 189, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 191, 190, 192, 192, 192, 192, 193, 193, 194, 194, 194, - 194, 194, 195, 196, 197, 197, 198, 198, 199, 199, - 200, 200, 200, 201, 201, 202, 203, 204, 204, 205, - 205, 206, 206, 207, 207, 208, 208, 209, 209, 210, - 210, 211, 211, 211, 211, 211, 212, 212, 213, 213, - 214, 215, 216, 216, 216, 216, 217, 217, 217, 218, - 218, 219, 220, 220, 221 + 194, 194, 195, 196, 196, 197, 197, 198, 198, 199, + 199, 200, 200, 200, 201, 201, 202, 203, 204, 204, + 205, 205, 206, 206, 207, 207, 208, 208, 209, 209, + 210, 210, 211, 211, 211, 211, 211, 212, 212, 213, + 213, 214, 215, 216, 216, 216, 216, 217, 217, 217, + 218, 218, 219, 220, 220, 221 }; static const short yyr2[] = { 0, @@ -501,16 +502,16 @@ static const short yyr2[] = { 0, 4, 1, 3, 5, 1, 3, 3, 3, 3, 4, 3, 1, 1, 3, 3, 3, 3, 1, 1, 0, 5, 1, 2, 2, 3, 1, 1, 1, 1, 1, - 1, 1, 1, 5, 1, 3, 1, 3, 0, 1, - 1, 1, 1, 1, 1, 3, 4, 1, 3, 2, - 3, 1, 3, 0, 1, 1, 2, 2, 3, 1, - 3, 1, 4, 4, 1, 1, 1, 1, 0, 1, - 2, 4, 0, 1, 1, 1, 0, 1, 1, 1, - 1, 1, 0, 1, 1 + 1, 1, 1, 3, 5, 1, 3, 1, 3, 0, + 1, 1, 1, 1, 1, 1, 3, 4, 1, 3, + 2, 3, 1, 3, 0, 1, 1, 2, 2, 3, + 1, 3, 1, 4, 4, 1, 1, 1, 1, 0, + 1, 2, 4, 0, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 0, 1, 1 }; static const short yydefact[] = { 0, - 270, 271, 1, 2, 5, 3, 0, 0, 6, 275, + 271, 272, 1, 2, 5, 3, 0, 0, 6, 276, 13, 8, 0, 9, 11, 14, 7, 10, 0, 0, 0, 0, 0, 0, 0, 15, 16, 0, 22, 20, 18, 21, 19, 0, 17, 12, 23, 167, 0, 0, @@ -518,180 +519,181 @@ static const short yydefact[] = { 0, 176, 177, 178, 179, 0, 24, 25, 27, 28, 31, 29, 30, 34, 0, 0, 32, 0, 47, 0, 48, 50, 52, 36, 0, 37, 0, 40, 42, 44, 4, - 26, 259, 118, 272, 0, 149, 0, 0, 163, 156, + 26, 260, 118, 273, 0, 149, 0, 0, 163, 156, 160, 162, 150, 0, 0, 151, 155, 159, 0, 0, 54, 55, 152, 161, 122, 0, 33, 46, 45, 0, - 0, 35, 38, 0, 0, 0, 0, 263, 64, 63, - 0, 260, 267, 0, 164, 158, 157, 154, 153, 0, + 0, 35, 38, 0, 0, 0, 0, 264, 64, 63, + 0, 261, 268, 0, 164, 158, 157, 154, 153, 0, 66, 0, 68, 0, 0, 0, 49, 51, 5, 41, - 43, 0, 265, 266, 264, 0, 118, 272, 113, 0, + 43, 0, 266, 267, 265, 0, 118, 273, 113, 0, 0, 186, 186, 62, 186, 116, 165, 152, 107, 0, - 269, 268, 261, 119, 121, 0, 0, 0, 0, 56, - 128, 129, 123, 124, 126, 120, 137, 144, 138, 257, - 145, 146, 258, 135, 134, 136, 132, 130, 141, 139, - 140, 0, 142, 39, 0, 90, 259, 127, 0, 0, + 270, 269, 262, 119, 121, 0, 0, 0, 0, 56, + 128, 129, 123, 124, 126, 120, 137, 144, 138, 258, + 145, 146, 259, 135, 134, 136, 132, 130, 141, 139, + 140, 0, 142, 39, 0, 90, 260, 127, 0, 0, 0, 0, 0, 76, 0, 0, 187, 188, 76, 0, - 106, 0, 166, 259, 259, 67, 71, 70, 69, 0, + 106, 0, 166, 260, 260, 67, 71, 70, 69, 0, 0, 218, 217, 0, 216, 219, 0, 60, 0, 0, 0, 57, 58, 221, 61, 195, 0, 202, 203, 209, - 208, 234, 235, 220, 223, 222, 0, 0, 0, 0, - 95, 0, 0, 246, 88, 88, 92, 245, 0, 262, - 0, 103, 0, 83, 86, 259, 117, 0, 0, 0, - 77, 78, 82, 259, 0, 192, 273, 0, 0, 273, - 256, 248, 0, 250, 255, 252, 0, 72, 74, 75, - 65, 0, 0, 212, 0, 0, 0, 0, 0, 53, - 0, 183, 184, 181, 182, 0, 0, 185, 0, 0, - 0, 0, 125, 147, 133, 143, 131, 0, 87, 96, - 91, 247, 89, 244, 244, 114, 0, 108, 0, 85, - 0, 259, 109, 0, 244, 190, 0, 259, 274, 0, - 110, 259, 249, 0, 0, 115, 259, 196, 210, 213, - 214, 207, 205, 0, 236, 201, 59, 197, 198, 199, - 0, 206, 204, 0, 0, 238, 148, 0, 93, 94, - 104, 105, 142, 84, 189, 81, 79, 80, 193, 0, - 191, 0, 251, 0, 0, 73, 0, 215, 227, 0, - 225, 186, 200, 0, 240, 242, 237, 0, 97, 0, - 111, 112, 254, 253, 211, 224, 0, 229, 241, 0, - 239, 0, 194, 226, 232, 233, 231, 228, 230, 243, - 101, 0, 99, 102, 98, 100, 0, 0, 0 + 208, 235, 236, 220, 223, 222, 0, 0, 0, 0, + 95, 0, 0, 247, 88, 88, 92, 246, 0, 263, + 0, 103, 0, 83, 86, 260, 117, 0, 0, 0, + 77, 78, 82, 260, 0, 192, 274, 0, 0, 274, + 257, 249, 0, 251, 256, 253, 0, 72, 74, 75, + 65, 0, 0, 212, 0, 0, 0, 0, 0, 0, + 53, 0, 183, 184, 181, 182, 0, 0, 185, 0, + 0, 0, 0, 125, 147, 133, 143, 131, 0, 87, + 96, 91, 248, 89, 245, 245, 114, 0, 108, 0, + 85, 0, 260, 109, 0, 245, 190, 0, 260, 275, + 0, 110, 260, 250, 0, 0, 115, 260, 196, 210, + 213, 214, 207, 205, 224, 0, 237, 201, 59, 197, + 198, 199, 0, 206, 204, 0, 0, 239, 148, 0, + 93, 94, 104, 105, 142, 84, 189, 81, 79, 80, + 193, 0, 191, 0, 252, 0, 0, 73, 0, 215, + 228, 0, 226, 186, 200, 0, 241, 243, 238, 0, + 97, 0, 111, 112, 255, 254, 211, 225, 0, 230, + 242, 0, 240, 0, 194, 227, 233, 234, 232, 229, + 231, 244, 101, 0, 99, 102, 98, 100, 0, 0, + 0 }; -static const short yydefgoto[] = { 427, +static const short yydefgoto[] = { 429, 3, 4, 8, 9, 13, 14, 25, 26, 27, 55, 56, 57, 107, 58, 74, 75, 76, 77, 59, 69, 70, 60, 100, 231, 232, 233, 61, 130, 131, 287, - 288, 270, 271, 272, 263, 264, 119, 324, 195, 196, - 319, 320, 412, 422, 423, 273, 289, 155, 156, 173, - 174, 197, 198, 62, 188, 248, 189, 234, 315, 157, - 103, 159, 104, 306, 307, 309, 206, 207, 208, 275, - 276, 236, 387, 296, 237, 238, 239, 240, 390, 391, - 418, 419, 241, 242, 243, 365, 366, 395, 257, 258, + 288, 270, 271, 272, 263, 264, 119, 325, 195, 196, + 320, 321, 414, 424, 425, 273, 289, 155, 156, 173, + 174, 197, 198, 62, 188, 248, 189, 234, 316, 157, + 103, 159, 104, 307, 308, 310, 206, 207, 208, 275, + 276, 236, 389, 296, 237, 238, 239, 240, 392, 393, + 420, 421, 241, 242, 243, 367, 368, 397, 257, 258, 213, 283, 284, 244, 259, 122, 123, 146, 163, 245, - 105, 338, 246 + 105, 339, 246 }; -static const short yypact[] = { 131, --32768,-32768, 131,-32768, -60,-32768, 15, 25,-32768,-32768, --32768,-32768, 27,-32768, -1, 141,-32768,-32768, 88, 79, - 62, 71, 65, 89, 188, 141,-32768, 101,-32768,-32768, --32768,-32768,-32768, 200,-32768,-32768, 517,-32768, 215, 38, --32768,-32768,-32768, 61,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 190, 517,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 355, 746,-32768, 146,-32768, 72,-32768, - 152,-32768,-32768, 34,-32768, -10,-32768, 156,-32768,-32768, --32768, -3, 158,-32768, 182,-32768, 189, 216,-32768,-32768, --32768,-32768,-32768, 242, 213,-32768,-32768,-32768, 821, 294, --32768,-32768,-32768,-32768, 185, 296,-32768,-32768,-32768, 145, - 194,-32768,-32768, 131, 145, 196, 198, 5,-32768,-32768, - 594,-32768, 64, 145,-32768,-32768,-32768,-32768,-32768, -66, --32768, 193, 195, 202, 235, 159,-32768,-32768, -60,-32768, --32768, 237,-32768,-32768,-32768, 299, -11, 204, 273, 206, - 243, -27, -12,-32768, -6,-32768,-32768, 207,-32768, 209, --32768,-32768,-32768,-32768,-32768, 302, 821, 309, 145, 268, --32768,-32768, 205,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +static const short yypact[] = { 166, +-32768,-32768, 166,-32768, -69,-32768, 32, 14,-32768,-32768, +-32768,-32768, 60,-32768, -62, 132,-32768,-32768, 55, 42, + -13, 58, 65, 64, 125, 132,-32768, 96,-32768,-32768, +-32768,-32768,-32768, 135,-32768,-32768, 507,-32768, 158, 9, +-32768,-32768,-32768, 38,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 122, 507,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 357, 736,-32768, 100,-32768, 80,-32768, + 146,-32768,-32768, 34,-32768, -17,-32768, 147,-32768,-32768, +-32768, -4, 140,-32768, 178,-32768, 184, 159,-32768,-32768, +-32768,-32768,-32768, 215, 188,-32768,-32768,-32768, 811, 269, +-32768,-32768,-32768,-32768, 170, 282,-32768,-32768,-32768, 168, + 180,-32768,-32768, 166, 168, 182, 186, 8,-32768,-32768, + 584,-32768, 44, 168,-32768,-32768,-32768,-32768,-32768, -10, +-32768, 189, 191, 198, 225, 465,-32768,-32768, -69,-32768, +-32768, 204,-32768,-32768,-32768, 280, -8, 199, 256, 200, + 238, -25, -24,-32768, -44,-32768,-32768, 205,-32768, 206, +-32768,-32768,-32768,-32768,-32768, 309, 811, 305, 168, 202, +-32768,-32768, 201,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768, 208, 212,-32768, -19,-32768, 6,-32768, 211, 292, - 42, 254, 217, 7, 453, 255,-32768, 219, 7, 260, --32768, 50,-32768, 12, 218,-32768,-32768,-32768,-32768, 234, - 306,-32768,-32768, -4,-32768,-32768, 303,-32768, 131, 453, - 230, 229,-32768,-32768, 184, 244, 238, -4,-32768,-32768, --32768, 236,-32768,-32768,-32768,-32768, 237, 342, 309, 159, - 251, 237, 159,-32768, 259, 259,-32768,-32768, 671,-32768, - 309, 239, 83,-32768,-32768, 218,-32768, 453, 283, 246, - 245,-32768,-32768, 218, 252, 126, 309, 453, 248, 309, --32768,-32768, 102,-32768,-32768, 256, 110,-32768,-32768,-32768, --32768, 465, 257, 250, 263, 168, 262, 253, 266,-32768, - 268,-32768,-32768,-32768,-32768, 465, 465,-32768, 465, 453, - 282, 261,-32768,-32768, 367,-32768,-32768, 293,-32768,-32768, --32768,-32768,-32768, 8, 8,-32768, 225,-32768, 42,-32768, - 270, 218,-32768, 7, 8,-32768, 278, 218,-32768, 276, --32768, 218,-32768, 56, 225,-32768, 12,-32768,-32768,-32768, - 271,-32768,-32768, 46,-32768,-32768,-32768,-32768,-32768,-32768, - 280,-32768,-32768, 1, 111,-32768,-32768, 281,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 279, 671, --32768, 671,-32768, 284, 286,-32768, 342,-32768,-32768, 134, --32768, -6,-32768, 309, 277,-32768,-32768, 261,-32768, 453, --32768,-32768,-32768,-32768, 367,-32768, 46, 17, 277, 309, --32768, 183, 184,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768, 13,-32768,-32768,-32768,-32768, 391, 395,-32768 +-32768, 207, 208,-32768, 50,-32768, 39,-32768, 209, 290, + 12, 217, 211, 7, 268, 252,-32768, 218, 7, 254, +-32768, 53,-32768, 5, 213,-32768,-32768,-32768,-32768, 229, + 303,-32768,-32768, -1,-32768,-32768, 216,-32768, 166, 268, + 226, 224,-32768,-32768, 156, 237, 230, -1,-32768,-32768, +-32768, 231,-32768,-32768,-32768,-32768, 204, 336, 305, 465, + 245, 204, 465,-32768, 253, 253,-32768,-32768, 661,-32768, + 305, 233, 81,-32768,-32768, 213,-32768, 268, 276, 241, + 242,-32768,-32768, 213, 243, 68, 305, 268, 247, 305, +-32768,-32768, 82,-32768,-32768, 248, 89,-32768,-32768,-32768, +-32768, 455, 249, 244, 258, 286, 250, 259, 257, 260, +-32768, 202,-32768,-32768,-32768,-32768, 455, 455,-32768, 455, + 268, 448, 251,-32768,-32768, 363,-32768,-32768, 285,-32768, +-32768,-32768,-32768,-32768, 0, 0,-32768, 214,-32768, 12, +-32768, 264, 213,-32768, 7, 0,-32768, 272, 213,-32768, + 270,-32768, 213,-32768, 67, 214,-32768, 5,-32768,-32768, +-32768, 263,-32768,-32768, 218, 19,-32768,-32768,-32768,-32768, +-32768,-32768, 271,-32768,-32768, 6, 119,-32768,-32768, 275, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, + 274, 661,-32768, 661,-32768, 278, 279,-32768, 336,-32768, +-32768, 127,-32768, -44,-32768, 305, 277,-32768,-32768, 251, +-32768, 268,-32768,-32768,-32768,-32768, 363,-32768, 19, 17, + 277, 305,-32768, 149, 156,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 28,-32768,-32768,-32768,-32768, 388, 391, +-32768 }; static const short yypgoto[] = {-32768, --32768, 396, 269,-32768,-32768, 389,-32768,-32768, 383,-32768, --32768, 354,-32768,-32768,-32768, 337,-32768, 297,-32768,-32768, - 304,-32768, 348,-32768,-32768, 116,-32768,-32768, 258,-32768, - 80, 210,-32768, 84,-32768, 97,-32768, 172,-32768, 177, --32768,-32768,-32768,-32768, 10, -187, -74, -192, -53,-32768, - 191, -190, -122,-32768, -169,-32768, -256, -118, 43, -33, - -120,-32768, 48,-32768,-32768,-32768, -151,-32768,-32768, -205, - -165, -96,-32768, 197,-32768, -213,-32768,-32768,-32768, 29, --32768,-32768,-32768,-32768,-32768,-32768, 39, 45, -121,-32768, --32768,-32768, 99, -126, -79,-32768,-32768,-32768,-32768, 16, --32768, 161, -7 +-32768, 389, 255,-32768,-32768, 380,-32768,-32768, 370,-32768, +-32768, 341,-32768,-32768,-32768, 327,-32768, 289,-32768,-32768, + 300,-32768, 346,-32768,-32768, 110,-32768,-32768, 246,-32768, + 66, 210,-32768, 85,-32768, 86,-32768, 165,-32768, 163, +-32768,-32768,-32768,-32768, 3, -189, -73, -186, -54,-32768, + 181, -190, -114,-32768, -47,-32768, -251, -118, 40, -40, + -120,-32768, 33,-32768,-32768,-32768, -150,-32768, 133, -164, + -166, -201,-32768, 193,-32768, -218,-32768,-32768,-32768, 23, +-32768,-32768,-32768,-32768,-32768,-32768, 37, 43, -152,-32768, +-32768,-32768, 93, -128, -80,-32768,-32768,-32768,-32768, 16, +-32768, 154, -7 }; -#define YYLAST 917 +#define YYLAST 907 static const short yytable[] = { 15, - 158, 210, 121, 211, 235, 15, 256, 120, 10, 191, - 101, 101, 175, 265, 10, 5, 421, 190, 5, 10, - 171, 172, 10, 11, 299, 143, 117, 171, 172, 65, - 102, 102, 72, 415, 10, 11, 79, 114, 269, 166, - 253, 10, 253, 167, 7, 10, 1, 2, 65, 10, - 1, 2, 64, 10, 203, 71, 67, 10, 180, 78, - 16, 183, 331, 10, 180, 132, 79, 183, 10, 203, - 371, 64, 340, 1, 2, 203, 254, 204, 254, 205, - 317, 144, 353, 322, 63, 285, 251, 416, 384, 78, - 252, 417, 209, -270, 205, 145, 28, 363, 294, 115, - 205, 124, 72, 63, 361, 19, 161, 79, 73, 295, - 262, -244, 118, 394, 133, -244, 165, 162, 425, 32, - 12, 118, 255, 191, 175, 71, 191, 118, 193, 139, - 78, 190, 17, 132, 190, 235, 160, 29, 158, 164, - 291, 265, 112, 1, 2, 262, 68, 30, 267, 389, - 176, 192, 10, 281, 20, 282, 31, 1, 2, 281, - 217, 219, 21, 177, 178, 179, 10, 180, 181, 182, - 183, 1, 2, 178, 33, 10, 180, 181, 182, 183, - 109, 110, 133, 22, 218, 23, 421, 401, 328, 402, - 34, 330, 329, 266, 24, 348, 274, 171, 172, 335, - 372, 274, 369, 370, 286, 184, 290, 343, 36, 358, - 359, 344, 360, 378, 222, 346, 397, 285, 385, 347, - 398, 424, 37, 185, 302, 303, 304, 305, 66, 352, - 80, 424, 10, 180, 413, 337, 183, 1, 2, 406, - 408, 316, 193, 407, 298, 193, 186, 1, 2, 171, - 172, 171, 172, 326, 108, 226, 111, 376, 380, 158, - 116, 158, 382, 187, 125, 192, 83, 84, 192, 339, - 124, 126, 339, 178, 160, 10, 180, 181, 182, 183, - 1, 2, 302, 303, 304, 305, 220, 178, 127, 10, - 180, 181, 182, 183, 128, 129, 134, 135, 136, 138, - 221, 141, 142, 168, 215, 169, 170, 199, -271, 200, - 201, 212, 202, 214, 222, 223, 10, 247, 261, 373, - 249, 266, 250, 268, 277, 278, 274, 260, 222, 280, - 224, 292, 293, 118, 297, 300, 286, 373, 301, 290, - 312, 308, 192, 362, 310, 314, 392, 318, 323, 225, - 327, 333, 332, 341, 334, 226, 396, 82, 355, 336, - 192, 349, 345, 350, 227, 351, 354, 83, 84, 226, - 367, 228, 229, 356, 230, 364, 368, 375, 85, 38, - 86, 379, 87, 381, 388, 399, 396, 393, 400, 410, - 428, 403, 88, 404, 429, 160, 89, 160, 6, 392, - 90, 18, 420, 91, 41, 42, 43, 194, 35, 81, - 113, 140, 106, 137, 92, 45, 357, 377, 279, 93, - 46, 94, 47, 95, 216, 374, 386, 325, 321, 405, - 48, 426, 96, 97, 311, 414, 411, 313, 409, 49, - 342, 50, 383, 0, 0, 0, 51, 98, 52, 53, - 54, 0, 0, 0, 0, 0, 0, 0, 178, 99, - 10, 180, 181, 182, 183, 1, 2, 0, 0, 0, - 178, 220, 10, 180, 181, 182, 183, 1, 2, 0, - 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 221, 0, 222, - 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 222, 223, 0, 0, 224, 0, 0, 0, 0, - 0, 0, 0, 0, 10, 0, 0, 224, 0, 1, - 2, 0, 0, 0, 225, 0, 0, 0, 0, 0, - 226, 38, 0, 0, 0, 0, 225, 0, 0, 227, - 0, 0, 226, 0, 0, 0, 39, 229, 0, 230, - 40, 227, 0, 0, 0, 0, 41, 42, 43, 229, - 0, 230, 44, 0, 0, 0, 0, 45, 0, 0, + 158, 121, 210, 235, 211, 15, 256, 191, 120, 101, + 101, 265, 10, 10, 10, 5, 10, 190, 5, 10, + 175, 1, 2, 102, 102, 117, 10, 67, 143, 65, + 114, 423, 72, 417, 253, 7, 79, 203, 269, 10, + 11, 10, 171, 172, 19, 10, 1, 2, 65, 16, + 1, 2, 64, 171, 172, 71, 203, 203, 132, 78, + 10, 180, 205, 28, 183, 300, 79, 10, 11, 63, + 254, 64, 30, 253, 10, 180, 373, 354, 183, 204, + 209, 205, 205, 285, 144, 73, 161, 418, 63, 78, + 349, 419, 115, 365, 386, 166, -271, 162, 145, 167, + 29, 294, 72, 332, 124, 360, 361, 79, 362, 254, + 262, 118, 295, 341, 133, 262, 165, 68, 396, 32, + 118, 191, 391, 255, 191, 71, 132, 34, 193, 139, + 78, 190, 175, 427, 190, 235, 160, 12, 158, 164, + 265, 291, 112, 31, -245, 20, 363, 267, -245, 33, + 176, 192, 423, 21, 118, 251, 281, 37, 282, 252, + 217, 219, 80, 171, 172, 17, 303, 304, 305, 306, + 281, 66, 371, 372, 22, 10, 23, 338, 1, 2, + 1, 2, 133, 380, 218, 24, 329, 344, 109, 110, + 330, 345, 331, 266, 347, 403, 274, 404, 348, 374, + 336, 274, 318, 36, 286, 323, 290, 178, 108, 10, + 180, 181, 182, 183, 1, 2, 285, 387, 171, 172, + 220, 10, 180, 426, 399, 183, 1, 2, 400, 83, + 84, 127, 408, 426, 221, 415, 409, 1, 2, 171, + 172, 317, 193, 410, 299, 193, 297, 298, 222, 223, + 111, 116, 124, 327, 303, 304, 305, 306, 382, 378, + 125, 158, 384, 158, 224, 192, 126, 128, 192, 340, + 129, 134, 340, 178, 160, 10, 180, 181, 182, 183, + 1, 2, 135, 225, 136, 138, 220, 141, 199, 226, + 142, 178, 200, 10, 180, 181, 182, 183, 227, 168, + 221, 169, 170, -272, 201, 228, 229, 202, 230, 212, + 214, 215, 10, 247, 222, 223, 261, 268, 250, 249, + 375, 277, 266, 280, 278, 260, 292, 274, 118, 293, + 224, 301, 222, 302, 309, 313, 311, 286, 375, 315, + 290, 319, 324, 192, 328, 333, 334, 353, 394, 225, + 337, 335, 342, 350, 346, 226, 205, 351, 398, 82, + 352, 192, 357, 356, 227, 366, 369, 358, 370, 83, + 84, 377, 229, 226, 230, 381, 390, 383, 395, 401, + 85, 38, 86, 402, 87, 405, 406, 430, 398, 412, + 431, 6, 18, 194, 88, 35, 81, 160, 89, 160, + 113, 394, 90, 140, 422, 91, 41, 42, 43, 137, + 106, 359, 216, 388, 322, 376, 92, 45, 279, 379, + 326, 93, 46, 94, 47, 95, 428, 314, 407, 355, + 312, 416, 48, 343, 96, 97, 413, 385, 411, 0, + 0, 49, 0, 50, 0, 0, 0, 0, 51, 98, + 52, 53, 54, 178, 0, 10, 180, 181, 182, 183, + 178, 99, 10, 180, 181, 182, 183, 1, 2, 177, + 178, 179, 10, 180, 181, 182, 183, 1, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, + 0, 0, 0, 0, 222, 0, 0, 0, 0, 0, + 0, 222, 223, 0, 0, 0, 0, 0, 0, 364, + 0, 184, 0, 0, 10, 0, 0, 224, 0, 1, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 185, + 0, 38, 0, 0, 0, 226, 225, 0, 0, 0, + 0, 0, 226, 0, 0, 0, 39, 0, 0, 0, + 40, 227, 186, 0, 0, 0, 41, 42, 43, 229, + 0, 230, 44, 0, 0, 0, 0, 45, 0, 187, 0, 0, 46, 0, 47, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 50, 0, 0, 147, 148, 51, 0, @@ -729,64 +731,63 @@ static const short yytable[] = { 15, }; static const short yycheck[] = { 7, - 121, 153, 82, 155, 170, 13, 197, 82, 8, 136, - 64, 65, 135, 201, 8, 0, 4, 136, 3, 8, - 15, 16, 8, 9, 230, 21, 30, 15, 16, 37, - 64, 65, 40, 17, 8, 9, 44, 48, 32, 106, - 35, 8, 35, 110, 105, 8, 13, 14, 56, 8, - 13, 14, 37, 8, 82, 40, 19, 8, 9, 44, - 36, 12, 268, 8, 9, 99, 74, 12, 8, 82, - 327, 56, 278, 13, 14, 82, 71, 105, 71, 107, - 250, 77, 296, 253, 37, 212, 106, 71, 345, 74, - 110, 75, 105, 105, 107, 91, 9, 311, 103, 110, - 107, 113, 110, 56, 310, 107, 43, 115, 48, 114, - 104, 106, 116, 113, 99, 110, 124, 54, 106, 55, - 106, 116, 197, 250, 247, 110, 253, 116, 136, 114, - 115, 250, 106, 167, 253, 301, 121, 59, 259, 124, - 215, 329, 109, 13, 14, 104, 109, 86, 202, 104, - 135, 136, 8, 104, 14, 106, 86, 13, 14, 104, - 168, 169, 22, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 6, 86, 8, 9, 10, 11, 12, - 109, 110, 167, 43, 169, 45, 4, 380, 106, 382, - 3, 266, 110, 201, 54, 292, 204, 15, 16, 274, - 327, 209, 324, 325, 212, 47, 214, 106, 108, 306, - 307, 110, 309, 335, 47, 106, 106, 344, 345, 110, - 110, 412, 23, 65, 99, 100, 101, 102, 14, 62, - 41, 422, 8, 9, 400, 110, 12, 13, 14, 106, - 392, 249, 250, 110, 229, 253, 88, 13, 14, 15, - 16, 15, 16, 261, 109, 88, 105, 332, 338, 380, - 105, 382, 342, 105, 83, 250, 13, 14, 253, 277, - 113, 83, 280, 6, 259, 8, 9, 10, 11, 12, - 13, 14, 99, 100, 101, 102, 19, 6, 73, 8, - 9, 10, 11, 12, 53, 83, 3, 113, 3, 106, - 33, 106, 105, 111, 3, 111, 105, 9, 105, 37, - 105, 105, 70, 105, 47, 48, 8, 113, 27, 327, - 113, 329, 111, 107, 70, 107, 334, 117, 47, 70, - 63, 98, 27, 116, 32, 106, 344, 345, 110, 347, - 105, 98, 327, 62, 107, 4, 354, 97, 90, 82, - 112, 106, 70, 106, 110, 88, 364, 3, 106, 108, - 345, 105, 107, 114, 97, 103, 105, 13, 14, 88, - 4, 104, 105, 108, 107, 115, 84, 108, 24, 25, - 26, 104, 28, 108, 114, 105, 394, 108, 110, 113, - 0, 108, 38, 108, 0, 380, 42, 382, 3, 407, - 46, 13, 410, 49, 50, 51, 52, 139, 26, 56, - 74, 115, 65, 110, 60, 61, 301, 334, 209, 65, - 66, 67, 68, 69, 167, 329, 347, 256, 252, 387, - 76, 422, 78, 79, 238, 407, 398, 247, 394, 85, - 280, 87, 344, -1, -1, -1, 92, 93, 94, 95, - 96, -1, -1, -1, -1, -1, -1, -1, 6, 105, - 8, 9, 10, 11, 12, 13, 14, -1, -1, -1, - 6, 19, 8, 9, 10, 11, 12, 13, 14, -1, - -1, -1, -1, -1, -1, 33, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 33, -1, 47, - 48, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 47, 48, -1, -1, 63, -1, -1, -1, -1, - -1, -1, -1, -1, 8, -1, -1, 63, -1, 13, - 14, -1, -1, -1, 82, -1, -1, -1, -1, -1, - 88, 25, -1, -1, -1, -1, 82, -1, -1, 97, - -1, -1, 88, -1, -1, -1, 40, 105, -1, 107, - 44, 97, -1, -1, -1, -1, 50, 51, 52, 105, - -1, 107, 56, -1, -1, -1, -1, 61, -1, -1, + 121, 82, 153, 170, 155, 13, 197, 136, 82, 64, + 65, 201, 8, 8, 8, 0, 8, 136, 3, 8, + 135, 13, 14, 64, 65, 30, 8, 19, 21, 37, + 48, 4, 40, 17, 35, 105, 44, 82, 32, 8, + 9, 8, 15, 16, 107, 8, 13, 14, 56, 36, + 13, 14, 37, 15, 16, 40, 82, 82, 99, 44, + 8, 9, 107, 9, 12, 230, 74, 8, 9, 37, + 71, 56, 86, 35, 8, 9, 328, 296, 12, 105, + 105, 107, 107, 212, 77, 48, 43, 71, 56, 74, + 292, 75, 110, 312, 346, 106, 105, 54, 91, 110, + 59, 103, 110, 268, 113, 307, 308, 115, 310, 71, + 104, 116, 114, 278, 99, 104, 124, 109, 113, 55, + 116, 250, 104, 197, 253, 110, 167, 3, 136, 114, + 115, 250, 247, 106, 253, 302, 121, 106, 259, 124, + 330, 215, 109, 86, 106, 14, 311, 202, 110, 86, + 135, 136, 4, 22, 116, 106, 104, 23, 106, 110, + 168, 169, 41, 15, 16, 106, 99, 100, 101, 102, + 104, 14, 325, 326, 43, 8, 45, 110, 13, 14, + 13, 14, 167, 336, 169, 54, 106, 106, 109, 110, + 110, 110, 266, 201, 106, 382, 204, 384, 110, 328, + 274, 209, 250, 108, 212, 253, 214, 6, 109, 8, + 9, 10, 11, 12, 13, 14, 345, 346, 15, 16, + 19, 8, 9, 414, 106, 12, 13, 14, 110, 13, + 14, 73, 106, 424, 33, 402, 110, 13, 14, 15, + 16, 249, 250, 394, 229, 253, 31, 32, 47, 48, + 105, 105, 113, 261, 99, 100, 101, 102, 339, 333, + 83, 382, 343, 384, 63, 250, 83, 53, 253, 277, + 83, 3, 280, 6, 259, 8, 9, 10, 11, 12, + 13, 14, 113, 82, 3, 106, 19, 106, 9, 88, + 105, 6, 37, 8, 9, 10, 11, 12, 97, 111, + 33, 111, 105, 105, 105, 104, 105, 70, 107, 105, + 105, 3, 8, 113, 47, 48, 27, 107, 111, 113, + 328, 70, 330, 70, 107, 117, 98, 335, 116, 27, + 63, 106, 47, 110, 98, 105, 107, 345, 346, 4, + 348, 97, 90, 328, 112, 70, 106, 62, 356, 82, + 108, 110, 106, 105, 107, 88, 107, 114, 366, 3, + 103, 346, 106, 105, 97, 115, 4, 108, 84, 13, + 14, 108, 105, 88, 107, 104, 114, 108, 108, 105, + 24, 25, 26, 110, 28, 108, 108, 0, 396, 113, + 0, 3, 13, 139, 38, 26, 56, 382, 42, 384, + 74, 409, 46, 115, 412, 49, 50, 51, 52, 110, + 65, 302, 167, 348, 252, 330, 60, 61, 209, 335, + 256, 65, 66, 67, 68, 69, 424, 247, 389, 297, + 238, 409, 76, 280, 78, 79, 400, 345, 396, -1, + -1, 85, -1, 87, -1, -1, -1, -1, 92, 93, + 94, 95, 96, 6, -1, 8, 9, 10, 11, 12, + 6, 105, 8, 9, 10, 11, 12, 13, 14, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, -1, + -1, -1, -1, -1, -1, -1, -1, 33, -1, -1, + -1, -1, -1, -1, 47, -1, -1, -1, -1, -1, + -1, 47, 48, -1, -1, -1, -1, -1, -1, 62, + -1, 47, -1, -1, 8, -1, -1, 63, -1, 13, + 14, -1, -1, -1, -1, -1, -1, -1, -1, 65, + -1, 25, -1, -1, -1, 88, 82, -1, -1, -1, + -1, -1, 88, -1, -1, -1, 40, -1, -1, -1, + 44, 97, 88, -1, -1, -1, 50, 51, 52, 105, + -1, 107, 56, -1, -1, -1, -1, 61, -1, 105, -1, -1, 66, -1, 68, -1, -1, -1, -1, -1, -1, -1, 76, -1, -1, -1, -1, -1, -1, -1, -1, 85, -1, 87, -1, -1, 13, 14, 92, -1, @@ -3084,79 +3085,87 @@ case 223: case 224: #line 1746 "asn1p_y.y" { - CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); + CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMP, yyvsp[0].a_constr, 0); ; break;} case 225: -#line 1752 "asn1p_y.y" +#line 1749 "asn1p_y.y" { - yyval.a_constr = yyvsp[0].a_constr; + CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); ; break;} case 226: #line 1755 "asn1p_y.y" { - CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); + yyval.a_constr = yyvsp[0].a_constr; ; break;} case 227: -#line 1761 "asn1p_y.y" +#line 1758 "asn1p_y.y" +{ + CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); + ; + break;} +case 228: +#line 1764 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_EXT; + yyval.a_constr->value = asn1p_value_frombuf("...", 3, 0); ; break;} -case 228: -#line 1766 "asn1p_y.y" +case 229: +#line 1770 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); yyval.a_constr->type = ACT_EL_VALUE; yyval.a_constr->value = asn1p_value_frombuf(yyvsp[-2].tv_str, strlen(yyvsp[-2].tv_str), 0); yyval.a_constr->presence = yyvsp[0].a_pres; + if(yyvsp[-1].a_constr) asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr); ; break;} -case 229: -#line 1779 "asn1p_y.y" +case 230: +#line 1784 "asn1p_y.y" { yyval.a_pres = ACPRES_DEFAULT; ; break;} -case 230: -#line 1780 "asn1p_y.y" +case 231: +#line 1785 "asn1p_y.y" { yyval.a_pres = yyvsp[0].a_pres; ; break;} -case 231: -#line 1784 "asn1p_y.y" +case 232: +#line 1789 "asn1p_y.y" { yyval.a_pres = ACPRES_PRESENT; ; break;} -case 232: -#line 1787 "asn1p_y.y" +case 233: +#line 1792 "asn1p_y.y" { yyval.a_pres = ACPRES_ABSENT; ; break;} -case 233: -#line 1790 "asn1p_y.y" +case 234: +#line 1795 "asn1p_y.y" { yyval.a_pres = ACPRES_OPTIONAL; ; break;} -case 234: -#line 1796 "asn1p_y.y" +case 235: +#line 1801 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 235: -#line 1799 "asn1p_y.y" +case 236: +#line 1804 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 236: -#line 1808 "asn1p_y.y" +case 237: +#line 1813 "asn1p_y.y" { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; @@ -3170,14 +3179,14 @@ case 236: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, ct, 0); ; break;} -case 237: -#line 1823 "asn1p_y.y" +case 238: +#line 1828 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} -case 238: -#line 1829 "asn1p_y.y" +case 239: +#line 1834 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3185,8 +3194,8 @@ case 238: yyval.a_constr->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); ; break;} -case 239: -#line 1835 "asn1p_y.y" +case 240: +#line 1840 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3196,8 +3205,8 @@ case 239: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); ; break;} -case 240: -#line 1849 "asn1p_y.y" +case 241: +#line 1854 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; @@ -3210,8 +3219,8 @@ case 240: free(yyvsp[0].tv_str); ; break;} -case 241: -#line 1860 "asn1p_y.y" +case 242: +#line 1865 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; @@ -3225,14 +3234,14 @@ case 241: free(yyvsp[0].tv_str); ; break;} -case 242: -#line 1876 "asn1p_y.y" +case 243: +#line 1881 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 243: -#line 1879 "asn1p_y.y" +case 244: +#line 1884 "asn1p_y.y" { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); @@ -3243,61 +3252,61 @@ case 243: yyval.tv_str[l1 + 1 + l3] = '\0'; ; break;} -case 244: -#line 1897 "asn1p_y.y" +case 245: +#line 1902 "asn1p_y.y" { yyval.a_marker.flags = EM_NOMARK; yyval.a_marker.default_value = 0; ; break;} -case 245: -#line 1901 "asn1p_y.y" +case 246: +#line 1906 "asn1p_y.y" { yyval.a_marker = yyvsp[0].a_marker; ; break;} -case 246: -#line 1905 "asn1p_y.y" +case 247: +#line 1910 "asn1p_y.y" { yyval.a_marker.flags = EM_OPTIONAL; yyval.a_marker.default_value = 0; ; break;} -case 247: -#line 1909 "asn1p_y.y" +case 248: +#line 1914 "asn1p_y.y" { yyval.a_marker.flags = EM_DEFAULT; yyval.a_marker.default_value = yyvsp[0].a_value; ; break;} -case 248: -#line 1932 "asn1p_y.y" +case 249: +#line 1937 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); ; break;} -case 249: -#line 1936 "asn1p_y.y" +case 250: +#line 1941 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; ; break;} -case 250: -#line 1942 "asn1p_y.y" +case 251: +#line 1947 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 251: -#line 1947 "asn1p_y.y" +case 252: +#line 1952 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 252: -#line 1954 "asn1p_y.y" +case 253: +#line 1959 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3306,8 +3315,8 @@ case 252: yyval.a_expr->Identifier = yyvsp[0].tv_str; ; break;} -case 253: -#line 1961 "asn1p_y.y" +case 254: +#line 1966 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3317,8 +3326,8 @@ case 253: yyval.a_expr->value = yyvsp[-1].a_value; ; break;} -case 254: -#line 1969 "asn1p_y.y" +case 255: +#line 1974 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3328,8 +3337,8 @@ case 254: yyval.a_expr->value = yyvsp[-1].a_value; ; break;} -case 255: -#line 1977 "asn1p_y.y" +case 256: +#line 1982 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3338,8 +3347,8 @@ case 255: yyval.a_expr->value = yyvsp[0].a_value; ; break;} -case 256: -#line 1984 "asn1p_y.y" +case 257: +#line 1989 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3349,103 +3358,103 @@ case 256: yyval.a_expr->meta_type = AMT_VALUE; ; break;} -case 257: -#line 1995 "asn1p_y.y" +case 258: +#line 2000 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} -case 258: -#line 1999 "asn1p_y.y" +case 259: +#line 2004 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} -case 259: -#line 2030 "asn1p_y.y" +case 260: +#line 2035 "asn1p_y.y" { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; break;} -case 260: -#line 2031 "asn1p_y.y" +case 261: +#line 2036 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; ; break;} -case 261: -#line 2035 "asn1p_y.y" +case 262: +#line 2040 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = yyvsp[0].a_tag.tag_mode; ; break;} -case 262: -#line 2042 "asn1p_y.y" +case 263: +#line 2047 "asn1p_y.y" { yyval.a_tag = yyvsp[-2].a_tag; yyval.a_tag.tag_value = yyvsp[-1].a_int; ; break;} -case 263: -#line 2048 "asn1p_y.y" +case 264: +#line 2053 "asn1p_y.y" { yyval.a_tag.tag_class = TC_CONTEXT_SPECIFIC; ; break;} -case 264: -#line 2049 "asn1p_y.y" +case 265: +#line 2054 "asn1p_y.y" { yyval.a_tag.tag_class = TC_UNIVERSAL; ; break;} -case 265: -#line 2050 "asn1p_y.y" +case 266: +#line 2055 "asn1p_y.y" { yyval.a_tag.tag_class = TC_APPLICATION; ; break;} -case 266: -#line 2051 "asn1p_y.y" +case 267: +#line 2056 "asn1p_y.y" { yyval.a_tag.tag_class = TC_PRIVATE; ; break;} -case 267: -#line 2055 "asn1p_y.y" +case 268: +#line 2060 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_DEFAULT; ; break;} -case 268: -#line 2056 "asn1p_y.y" +case 269: +#line 2061 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_IMPLICIT; ; break;} -case 269: -#line 2057 "asn1p_y.y" +case 270: +#line 2062 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_EXPLICIT; ; break;} -case 270: -#line 2061 "asn1p_y.y" +case 271: +#line 2066 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 271: -#line 2065 "asn1p_y.y" +case 272: +#line 2070 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 272: -#line 2073 "asn1p_y.y" +case 273: +#line 2078 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 273: -#line 2080 "asn1p_y.y" +case 274: +#line 2085 "asn1p_y.y" { yyval.tv_str = 0; ; break;} -case 274: -#line 2081 "asn1p_y.y" +case 275: +#line 2086 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 275: -#line 2086 "asn1p_y.y" +case 276: +#line 2091 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; @@ -3673,7 +3682,7 @@ case 275: } return 1; } -#line 2092 "asn1p_y.y" +#line 2097 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index 815423daa..a4842e250 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -278,7 +278,7 @@ static asn1p_value_t * %type ConstraintSubtypeElement /* 1..2 */ %type SimpleTableConstraint %type TableConstraint -%type WithComponents +%type InnerTypeConstraint %type WithComponentsList %type WithComponentsElement %type ComponentRelationConstraint @@ -1668,7 +1668,7 @@ ConstraintSubtypeElement: | TableConstraint { $$ = $1; } - | WithComponents { + | InnerTypeConstraint { $$ = $1; } | TOK_CONSTRAINED TOK_BY '{' @@ -1742,8 +1742,11 @@ ContainedSubtype: } ; -WithComponents: - TOK_WITH TOK_COMPONENTS '{' WithComponentsList '}' { +InnerTypeConstraint: + TOK_WITH TOK_COMPONENT SetOfConstraints { + CONSTRAINT_INSERT($$, ACT_CT_WCOMP, $3, 0); + } + | TOK_WITH TOK_COMPONENTS '{' WithComponentsList '}' { CONSTRAINT_INSERT($$, ACT_CT_WCOMPS, $4, 0); } ; @@ -1762,6 +1765,7 @@ WithComponentsElement: $$ = asn1p_constraint_new(yylineno); checkmem($$); $$->type = ACT_EL_EXT; + $$->value = asn1p_value_frombuf("...", 3, 0); } | Identifier optConstraints optPresenceConstraint { $$ = asn1p_constraint_new(yylineno); @@ -1769,6 +1773,7 @@ WithComponentsElement: $$->type = ACT_EL_VALUE; $$->value = asn1p_value_frombuf($1, strlen($1), 0); $$->presence = $3; + if($2) asn1p_constraint_insert($$, $2); } ; diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index addfd9cc6..fc0e7b35b 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -333,10 +333,36 @@ asn1print_constraint(asn1p_constraint_t *ct, enum asn1print_flags flags) { printf(")"); break; case ACT_CT_WCOMP: - printf("WITH COMPONENT ???"); + assert(ct->el_count != 0); + assert(ct->el_count == 1); + printf("WITH COMPONENT ("); + asn1print_constraint(ct->elements[0], flags); + printf(")"); break; - case ACT_CT_WCOMPS: - printf("WITH COMPONENTS { ??? }"); + case ACT_CT_WCOMPS: { + unsigned int i; + printf("WITH COMPONENTS { "); + for(i = 0; i < ct->el_count; i++) { + asn1p_constraint_t *cel = ct->elements[i]; + if(i) printf(", "); + fwrite(cel->value->value.string.buf, + 1, cel->value->value.string.size, + stdout); + if(cel->el_count) { + assert(cel->el_count == 1); + printf(" "); + asn1print_constraint(cel->elements[0], + flags); + } + switch(cel->presence) { + case ACPRES_DEFAULT: break; + case ACPRES_PRESENT: printf(" PRESENT"); break; + case ACPRES_ABSENT: printf(" ABSENT"); break; + case ACPRES_OPTIONAL: printf(" OPTIONAL");break; + } + } + printf(" }"); + } break; case ACT_CT_CTDBY: printf("CONSTRAINED BY "); From 1eb4b83b2fa842cc53a1f530ff1a96cd3d8612b1 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Mar 2005 15:01:58 +0000 Subject: [PATCH 0840/1469] tests git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@840 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/82-with-comps-OK.asn1 | 21 +++++++++++++++++++++ tests/82-with-comps-OK.asn1.-EF | 14 ++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 tests/82-with-comps-OK.asn1 create mode 100644 tests/82-with-comps-OK.asn1.-EF diff --git a/tests/82-with-comps-OK.asn1 b/tests/82-with-comps-OK.asn1 new file mode 100644 index 000000000..adb44e0b6 --- /dev/null +++ b/tests/82-with-comps-OK.asn1 @@ -0,0 +1,21 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .82 + +ModuleTestWithComponents + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 82 } + DEFINITIONS ::= +BEGIN + + BunchOfStrings ::= SEQUENCE OF VisibleString + Address ::= BunchOfStrings (SIZE (1..6)) (WITH COMPONENT (SIZE (1..32))) + + Type ::= SEQUENCE { + one INTEGER DEFAULT 1 + } (WITH COMPONENTS { ..., one (1) PRESENT }) + +END diff --git a/tests/82-with-comps-OK.asn1.-EF b/tests/82-with-comps-OK.asn1.-EF new file mode 100644 index 000000000..34ea419ce --- /dev/null +++ b/tests/82-with-comps-OK.asn1.-EF @@ -0,0 +1,14 @@ +ModuleTestWithComponents { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 82 } +DEFINITIONS ::= +BEGIN + +BunchOfStrings ::= SEQUENCE OF VisibleString + +Address ::= BunchOfStrings (SIZE(1..6))(WITH COMPONENT (SIZE(1..32))) + +Type ::= SEQUENCE { + one INTEGER DEFAULT 1 +} (WITH COMPONENTS { ..., one (1) PRESENT }) + +END From 6037b237f94fea04cab6751c309ab679f93513a0 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Mar 2005 15:31:29 +0000 Subject: [PATCH 0841/1469] running arbitrary commands git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@841 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/webcgi/asn1c-suid-helper.c | 40 ++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/asn1c/webcgi/asn1c-suid-helper.c b/asn1c/webcgi/asn1c-suid-helper.c index 64390981b..9a878fe89 100644 --- a/asn1c/webcgi/asn1c-suid-helper.c +++ b/asn1c/webcgi/asn1c-suid-helper.c @@ -12,16 +12,17 @@ */ int main(int ac, char **av) { - char **argv; + char cmdPath[32]; char *envp[] = { NULL }; /* Empty environment */ int ret; int i; - if(ac < 3) { + if(ac < 4) { setgid(getgid()); setuid(getuid()); fprintf(stderr, - "Usage: %s [options]\n", av[0]); + "Usage: %s [options]\n", + av[0]); exit(EX_USAGE); } @@ -48,20 +49,34 @@ main(int ac, char **av) { exit(EX_DATAERR); } - argv = calloc(ac + 1, sizeof(*argv)); - if(argv) { - argv[0] = "asn1c"; - argv[1] = "-S/skeletons"; - memcpy(argv + 2, av + 3, (ac - 3) * sizeof(*argv)); + + /* + * Add an argument if this is an asn1c compiler. + */ + if(strcmp(av[3], "asn1c") == 0) { + ac -= 2; + av += 2; + av[0] = "asn1c"; + av[1] = "-S/skeletons"; + i = 2; + strcpy(cmdPath, "/bin/asn1c"); } else { - perror("malloc()"); - exit(EX_OSERR); + ac -= 3; + av += 3; + i = 0; + } + + if(strlen(av[0]) > sizeof(cmdPath)/2) { + fprintf(stderr, "Insecure command name: %s\n", av[0]); + exit(EX_DATAERR); } + memcpy(cmdPath, "/bin/", 5); + strcpy(cmdPath + 5, av[0]); /* * Check arguments for the permitted alphabet constraints. */ - for(i = 3; i < ac; i++) { + for(; i < ac; i++) { char *p; for(p = av[i];; p++) { switch(*p) { @@ -80,7 +95,8 @@ main(int ac, char **av) { } } - execve("/bin/asn1c", argv, envp); + execve(cmdPath, av, envp); + perror(cmdPath); exit(EX_UNAVAILABLE); } From 012ec39c93556a60e802fd585af3c9bbfb5ad948 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Mar 2005 15:39:35 +0000 Subject: [PATCH 0842/1469] enhancements git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@842 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/webcgi/asn1c.cgi | 377 +++++++++++++++++++++++++++-------------- 1 file changed, 247 insertions(+), 130 deletions(-) diff --git a/asn1c/webcgi/asn1c.cgi b/asn1c/webcgi/asn1c.cgi index 223741efe..07966774f 100755 --- a/asn1c/webcgi/asn1c.cgi +++ b/asn1c/webcgi/asn1c.cgi @@ -17,10 +17,12 @@ $HashProgramPath = 'md5'; # Program to hash the input $DM = 0750; # Directory mode for all mkdirs $MaxHistoryItems = 5; # Number of items in History $DynamicHistory = 'yes'; # Full/Short history -$safeFilename = '^[a-z0-9_-]+[.a-z0-9_-]*$'; # Safe filename +$safeFilenameRE = '[a-zA-Z0-9_]+[.a-zA-Z0-9_-]{0,200}'; # Safe filename regex +$safeTimeRE = '[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}'; $ASN1C_Page = 'http://lionet.info/asn1c'; $HelpEmail = 'asn1c@lionet.info'; $defaultUserEmail = 'your@email-for-reply'; +$DataERR = 65; # EX_DATAERR from $warn = '

    '; $unwarn = '
    '; @@ -52,7 +54,7 @@ my $content = ''; # Default content is empty sub IssueRedirect() { $redirect = ""; - $redirect_bottom = "

    This page will disappear in 5 seconds.
    " + $redirect_bottom = "

    This page will disappear in 5 seconds.
    " } # If something goes wrong, this function is invoked to display the error message @@ -64,8 +66,8 @@ sub bark($@) { # Make the directory name containing session files for the given Session ID sub makeSessionDirName($$) { - local $pfx = shift; # Prefix is the name of the top-level directory - local $sid = shift; # Session identifier (md5) + my $pfx = shift; # Prefix is the name of the top-level directory + my $sid = shift; # Session identifier (md5) $pfx . '/sessions/' . $sid . '/'; } @@ -73,7 +75,7 @@ sub makeSessionDirName($$) { my $cachedTime; sub isoTime() { return $cachedTime if $cachedTime; - local @tm = localtime(time); + my @tm = localtime(time); $tm[5] += 1900; $tm[4] += 1; @@ -132,9 +134,9 @@ sub prepareChrootEnvironment() { } sub makeArchive($$) { - local $TMPDIR = shift; - local $sandbox = shift; - local $archName = $sandbox . '/+Archive.tgz'; + my $TMPDIR = shift; + my $sandbox = shift; + my $archName = $sandbox . '/+Archive.tgz'; if(! -f $archName) { system("cd $sandbox && " @@ -174,7 +176,7 @@ if(defined($tmpEmail)) { } if($userEmail ne $previousEmail) { # Refresh cookie contents. - local $ck = cookie(-name=>'userEmail', + my $ck = cookie(-name=>'userEmail', -value=>$userEmail, -path=>'/', -expires=>'+1d'); print "Set-Cookie: " . $ck . "\n"; @@ -191,7 +193,7 @@ if (defined($tmpHSParam) && $tmpHSParam ne $HistoryShow && $tmpHSParam =~ /^(full|short)$/) { $HistoryShow = $tmpHSParam; - local $ck = cookie(-name=>'HistoryShow', + my $ck = cookie(-name=>'HistoryShow', -value=>$HistoryShow, -path=>'/', -expires=>'+1h'); print "Set-Cookie: " . $ck . "\n"; @@ -224,8 +226,7 @@ unless($session) { mkdir($sessionDir, $DM) or bark($SandBoxInitFailed); my $ck = cookie(-name=>'SessionID', -value=>$session, -path=>'/', -expires=>'+1y'); - print header(-expires=>'-1y', -cookie=>$ck); - $HTTPHeaderGenerated = 1; + print "Set-Cookie: " . $ck . "\n"; } else { $session =~ s/[^a-f0-9]//ig; bark("Nope, try again") if(length($session) != 32); # cool hacker? @@ -235,21 +236,28 @@ unless($session) { mkdir($sessionDir, $DM) or bark($SandBoxInitFailed) unless(-d $sessionDir); - local $t = param('time'); - local $file = param('file'); - local $fetch = param('fetch'); - local $show = param('show'); + my $t = param('time'); + my $file = param('file'); + my $fetch = param('fetch'); + my $show = param('show'); + my $remove = param('remove'); + unless(defined($t) && defined($file) - && $t =~ /^[0-9TZ:+-]{14,}$/ - && $file =~ /$safeFilename/i) { + && $t =~ /^${safeTimeRE}$/ + && $file =~ /^${safeFilenameRE}$/ + && ($fetch eq '' or $fetch =~ /^${safeFilenameRE}$/) + ) { + $file = ''; $fetch = ''; $show = ''; + $remove = ''; } - if($fetch =~ /$safeFilename/i || $show =~ /^(log|tgz)$/) { - local $sandbox = $sessionDir . '/' . $t . '--' . $file; + if($fetch ne '' or $show =~ /^(log|unber|tgz)$/ or $remove ne '') { + my $sandbox = $sessionDir . '/' . $t . '--' . $file; + my $targetFile = ''; if($show eq 'tgz') { - local $tarball = makeArchive($TMPDIR, $sandbox); + my $tarball = makeArchive($TMPDIR, $sandbox); defined $tarball or bark("Cannot create archive [$sandbox]"); @@ -257,20 +265,27 @@ unless($session) { printf("Content-Encoding: gzip\n\n"); exec("cat $tarball"); exit(0); - } - - if($show eq 'log') { - $sandbox .= '/+Compiler.Log'; + } elsif($show eq 'unber') { + $targetFile = $sandbox . '/+UNBER'; + } elsif($show eq 'log') { + $targetFile = $sandbox . '/+Compiler.Log'; + } elsif($remove ne '') { + print "Status: 303 See Other\n"; + print "Location: $myName\n"; + print "\n"; + rename($sandbox, + $sessionDir . '/' . $t . '-R--' . $file); + exit(0); } else { - $sandbox .= '/' . $fetch; + $targetFile = $sandbox . '/' . $fetch; } - open(I, "< " . $sandbox) - or bark("Invalid or outdated request: [$sandbox] [$show] $!"); - printf "Content-Type: text/plain\n\n"; - while() { - print; + if($targetFile ne '') { + open(I, '< ' . $targetFile) + or bark("Invalid or outdated request $!"); + printf "Content-Type: text/plain\n\n"; + print while ; + exit(0); } - exit(0); } } @@ -279,7 +294,7 @@ unless($session) { # $transHelp = param('transHelp'); if(defined($transHelp) -&& $transHelp =~ /^([0-9]+)--([0-9TZ:+-]{14,})--([_.a-zA-Z0-9-]+)$/) { +&& $transHelp =~ /^([0-9]+)--($safeTimeRE)--($safeFilenameRE)$/) { open(S, "| sendmail -it") or bark("Cannot perform help request, " . "please email to the address below"); @@ -326,11 +341,10 @@ if($#gotNames != -1 && $gotNames[0] ne "") { $gotFile = undef; } +my $asnText = param('text'); + if($#gotNames == -1) { - my $text = param('text'); - if($text) { - push(@gotNames, 'module.asn1'); - } + push(@gotNames, 'module.asn1') if $asnText; } # Make safe filenames @@ -339,7 +353,7 @@ foreach my $fname (@gotNames) { s/.*\///g; # Strip directory components s/.*\\//g; # Strip directory components (DOS version) s/^[.-]/_/g; # Don't allow filenames starting with a dot or a dash - s/[^._a-z0-9-]/_/gi; + s/[^._a-zA-Z0-9-]/_/g; if(!length($_)) { print LOG "\n"; bark("Too strange filename: \"$fname\""); @@ -364,14 +378,16 @@ if($#gotSafeNames >= 0) { open(O, '> ' . $sandbox . '/+safeNames'); print O join("\n", @gotSafeNames); for(my $i = 0; $i <= $#gotSafeNames; $i++) { - local $name = $gotSafeNames[$i]; + my $name = $gotSafeNames[$i]; open(O, '> ' . $sandbox . '/'. $name); if($#gotFiles == -1) { - print O scalar(param('text')); + print O $asnText; # param(text) + unlink $sessionDir . '/lastText'; + symlink $transactionDir . '/' . $name, + $sessionDir . '/lastText'; } else { - while(<$gotFile>) { - print O; - } + # Save the uploaded data into specified file + print O while <$gotFile>; } } close(O); @@ -391,53 +407,107 @@ if($#gotSafeNames >= 0) { $options .= " -fcompound-names" if(defined($optCN) && $optNT eq "on"); my $CompileASN = "$TMPDIR/bin/asn1c -v | sed -e 's/^/-- /'" . " > $sandbox/+Compiler.Log 2>&1" - . "; $SUIDHelper $TMPDIR $inChDir $options @gotSafeNames " + . "; $SUIDHelper $TMPDIR $inChDir asn1c $options @gotSafeNames " . " >> $sandbox/+Compiler.Log 2>&1" - . "; echo \$? > $sandbox/+ExitCode"; - system($CompileASN); - bark("Failed to initiate compilation process: $!") - if(!-r $sandbox . '/+ExitCode'); - makeArchive($TMPDIR, $sandbox); + . "; ec=\$?; echo \$ec > $sandbox/+ExitCode" + . "; exit \$ec"; + + my $ec = (256 * $DataERR); # Simulate EX_DATAERR + my $fType = param('fileType'); + + # Compile as ASN.1 text + if($fType ne 'ber') { + $ec = system($CompileASN); + bark("Failed to initiate compilation process: $!") + if(!-r $sandbox . '/+ExitCode'); + } + + if($ec == (256 * $DataERR) and $fType ne 'asn') { + # Unrecognized ASN.1 module format. + # Try out BER decoding. + my $uec = system("$SUIDHelper $TMPDIR $inChDir unber @gotSafeNames > $TMPDIR/$inChDir/+UNBER.tmp 2>&1"); + if(($uec == 0 or $fType eq 'ber') + and open(U, "> $TMPDIR/$inChDir/+UNBER")) { + my $fnames = escapeHTML(join(", ", @gotNames)); + open(T, "< $TMPDIR/$inChDir/+UNBER.tmp"); + print U "\n"; + print U while ; + close(U); + close(T); + } + unlink("$TMPDIR/$inChDir/+UNBER.tmp"); + } else { + makeArchive($TMPDIR, $sandbox); + } + if($ENV{REQUEST_METHOD} ne 'GET') { + print "Status: 303 See Other\n"; + print "Location: $myName\n"; + } } -#print join("
    \n", `env`); +my $rtt = ''; +if(-f $sessionDir . '/lastText') { + if(param('resetText')) { + unlink $sessionDir . '/lastText'; + } else { + $rtt = "
      [refill with sample ASN.1 module text]"; + } +} $form = "" -. "Pick the ASN.1 module file:
    \n" -. "
    \n" -. "Or enter the ASN.1 module text into the following area:
    \n" +. "

    Table 1: The list of asn1c command line options
    -fnative-types Use the native machine's data types (int, double) whenever -possible, instead of the compound ASN.1 INTEGER_t, ENUMERATED_t -and REAL_t types.
    -fno-constraints Do not generate ASN.1 subtype constraint checking code. This may make @@ -736,12 +739,15 @@

    structures.

    -ftypes88 -Use only ASN.1:1988 embedded types.
    Output Options Description
    -print-constraints +
    + +-print-constraints When -EF are also specified, this option forces the compiler to explain its internal understanding of subtype constraints.
    -S <directory> Use the specified directory with ASN.1 skeleton files.
    -X +Generate the XML DTD schema for the specified ASN.1 modules.
    Warning Options Description
     " +. "Pick the ASN.1 module or binary encoded data file:\n" +. "
    " +. "" +. "" +. "" +. "
     " +. "Or paste the ASN.1 text into the following area:$rtt\n" +. "
    " . "
    \n" -. "

    " -. "" +; +if(open(T, '< ' . $sessionDir . '/lastText')) { + $form .= escapeHTML($_) while ; + close(T); +} else { + $form .= "" + . "/*\n" + . " * This ASN.1 specification is given for illustrative purposes.\n" + . " * Your own ASN.1 module must be properly formed too!\n" + . " * (Make sure it has BEGIN/END statements, etc.)\n" + . " */\n" + . "TestModule DEFINITIONS ::= \n" + . "BEGIN\n" + . "\n" + . " TestType ::= SEQUENCE {\n" + . " num [PRIVATE 1] INTEGER,\n" + . " str UTF8String (SIZE(1..20)) OPTIONAL\n" + . " }\n" + . "\n" + . "END\n" + ; +} + +$form .= "\n" +. "

    \n" . "These options may be used to control the compiler's behavior:
    \n" . " Debug lexer (-Wdebug-lexer)
    \n" -. " Just parse and dump (do not compile) (-E)
    \n" -. " Parse, perform semantic checks, and dump (-E -F)
    \n" -. " Employ native machine types (e.g. double instead of REAL_t) (-fnative-types)
    \n" +. " Just parse and dump (do not verify) (-E)
    \n" +. " Parse, verify validity, and dump (-E -F)
    \n" +. " Use native machine types (e.g. double instead of REAL_t) (-fnative-types)
    \n" . " Prevent name clashes in compiled output (-fcompound-names)
    \n" . "... the command line ASN.1 compiler, asn1c, supports many other parameters." . "" -. "

    \n" +. "

    " . "" . " (What is ASN.1?)" -. ""; +. "
    "; # # Gather previous transactions to generate the history page. @@ -447,51 +517,70 @@ $form = # opendir(SD, $sessionDir) or bark("Cannot open sandbox: $!"); my @transactions = sort { $b cmp $a } - (grep {/^[0-9TZ:+-]{14,}--[_.a-zA-Z0-9-]+$/} + (grep {/^${safeTimeRE}(-R)?--${safeFilenameRE}?$/} readdir(SD)); my $CountHistoryItems = 0; +my $CountGlobalItems = 0; +my $CountShownItems = 0; my $fullresp = param("fullresp"); foreach my $trans (sort { $b cmp $a } @transactions) { - next unless($trans =~ /^([0-9TZ:+-]{14,})--([_.a-zA-Z0-9-]+)$/); + $CountGlobalItems++; + next unless($trans =~ /^($safeTimeRE)--($safeFilenameRE)$/); + $CountHistoryItems++; + next if($CountHistoryItems > $MaxHistoryItems + && $HistoryShow ne 'full'); + $CountShownItems++; - local ($t, $f) = ($1, $2); - local $origTime = $t; + my ($t, $f) = ($1, $2); + my $origTime = $t; $t =~ s/T/ /; # "1999-01-02T13:53:12" => "1999-01-02 13:53:12" # Global transaction number - local $tNum = 1 + $#transactions - $CountHistoryItems; + my $tNum = 2 + $#transactions - $CountGlobalItems; # Open the list of file names under which these files are known # at the remote system. open(I, '< ' . $sessionDir . '/' . $trans . '/+Names'); - local @Names = ; + my @Names = ; # Open the list of "safe" file names under which these files # are known to our file system. open(I, '< ' . $sessionDir . '/' . $trans . '/+safeNames'); - local @safeNames = ; + my @safeNames = ; # Create a list of real file names whith appropriate links to the # "safe" file names for subsequent file fetching. - local @markedNames = (); + my @markedNames = (); for(my $i = 0; $i <= $#Names; $i++) { local $_ = "$Names[$i]"; + . "&fetch=$safeNames[$i]\" ID=modrefs>" + . escapeHTML($Names[$i]) + . ""; @markedNames = (@markedNames, $_); } - local $ec = ''; + my $ec = ''; open(I, '< ' . $sessionDir . '/' . $trans . '/+ExitCode') and chop($ec = ); + my $resCode = "log"; + my $resText = "Show compiler log"; + if($ec eq "0") { $results = "" . "Compiled OK
    \n"; + } elsif(-f $sessionDir . '/' . $trans . '/+UNBER') { + my $msg = 'This looks like a BER-encoded data'; + $msg = "Treating input as BER-encoded data" if $ec eq ''; + $results = "$msg
    \n"; + $resText = "Show BER structure"; + $resCode = "unber"; + $ec = 0; } else { my $why = $ec; - $why = "Invalid input file" if $ec == 65; + $why = "Broken input file" if $ec == $DataERR; $results = "" . "ASN.1 compiler error: " . "$why
    \n"; @@ -503,20 +592,22 @@ foreach my $trans (sort { $b cmp $a } @transactions) { $results .= "" . ($allowFetchResults ? '1. ' : '') - . "" - . "Show compiler log"; + . "&show=$resCode\">" + . "$resText" + . ($ec ? ' ←' : '') + . ""; $results .= "
    \n" . "2. " - . "Fetch compiled C sources (.tgz)" + . "Fetch compiled C sources (.tgz) ←" if $allowFetchResults; if($ec ne "0") { - local ($eml, @resp); + my ($eml, @resp); open(H, '< ' . $sessionDir . '/' . $trans . '/+HelpResp') and @resp = ; open(H, '< ' . $sessionDir . '/' . $trans . '/+HelpReq') @@ -524,13 +615,17 @@ foreach my $trans (sort { $b cmp $a } @transactions) { if($#resp >= 0) { shift(@resp) while($resp[0] =~ /^$/); if($fullresp eq $tNum) { - $results .= "

    Analysis:

    "; - $results .= join("
    ", @resp); + my $r = join("
    ", @resp); + $r =~ s/ / /g; + $results .= "

    Analysis:"; + $results .= "
    (Hide full explanation)"; + $results .= "

    "; + $results .= $r; $results .= "
    "; - $results .= "(Hide full text)"; + $results .= "(Hide full explanation)"; } else { $results .= "

    Analysis: $resp[0]
    "; - $results .= "(Show full text)"; + $results .= "(Show full explanation)"; } } elsif($eml) { $results .= "

    " @@ -539,81 +634,77 @@ foreach my $trans (sort { $b cmp $a } @transactions) { . "expect results in a few hours."; } else { $results .= '

    ' - . "To get free help, leave a return address:
    " + . "To get free help, leave a return address:
    " . "
    " . "" . '' - . '' ; $atLeastOneError = 1; } } $trColor = ' BGCOLOR=#f8f8f8'; - $trColor = ' BGCOLOR=#d0ffe0' unless($CountHistoryItems); - $tNum = '' . $tNum . '' unless($CountHistoryItems); + $trColor = ' BGCOLOR=#d0ffe0' if $CountHistoryItems == 1; $history .= "

    @@ -557,7 +562,7 @@

    $tNum" + . "$tNum" + . "
    [×]" + . "
    " . join(", ", @markedNames) - . "
    " + . "" . $results . "
    " - . "" + . "" . "Show full history " . "($HistoryItemsHidden hidden $item)" - . "
    " - . "" + . "" . "Short history ($MaxHistoryItems $item)" - . "
    " + . "
    " . "\n" . "" - . "" - . "" - . "" + . "\n" . "\n" . $history . "
    NFiles processedResultNFiles processedResult

    \n"; if($atLeastOneError) { - $history .= "" - . "Bottom line: ASN.1 compiler was unable to process some of the input files.
    " + $history .= "" + . "Bottom line: ASN.1 compiler was unable to process some of the input.
    " . "This is typically caused by syntax errors in the input files.\n" . "Such errors are normally fixed by removing or adding a couple of characters in the ASN.1 module.
    \n" . "
    Please consider clicking on the appropriate "Help me fix it!" button above.
    \n" - . "An email will be sent to a person who will gladly fix the ASN.1 module for you. (The typical turn-around time is less than 24 hours.)\n" + . "An email will be sent to a live person who will fix the ASN.1 module for you. (The typical turn-around time is less than 24 hours.)\n" . "
    This is free, and highly advisable.\n" - . "Your request will help us make a better compiler!\n" + . "
    Your request will help us make a better compiler!\n" . "
    Thank you." . "
    "; } @@ -633,11 +724,10 @@ $content .= . "$form" . "
    $history \n" . "
    " - . "Privacy Note: this page is tailored " + . "Privacy Note: this page is tailored " . "to your browser using a cryprographically strong cookie. " . "Other users will see their own (different) data. " . "(Read more...)" - . "" . "
    "; $ua = $ENV{HTTP_USER_AGENT}; @@ -648,7 +738,7 @@ print LOG "\n"; # Finalize logging record PRINTOUT: -print header(-expires=>'-1y') unless($HTTPHeaderGenerated); +print header(-expires=>'-1y'); # If environment has never been set up completely, remove it. if($EnvironmentSetOK != 1 && $TMPDIR ne "/") { @@ -662,9 +752,36 @@ print< $redirect From 398105f3cb888a9e5379e22614e8c328a7d7b21f Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Mar 2005 17:52:43 +0000 Subject: [PATCH 0843/1469] better wrapping git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@843 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1print/asn1print.c | 4 ++-- tests/07-int-OK.asn1.-EF | 4 ++-- tests/14-resolver-OK.asn1.-EF | 4 ++-- tests/32-sequence-of-OK.asn1.-EF | 4 ++-- tests/55-components-of-OK.asn1.-EF | 4 ++-- tests/60-any-OK.asn1.-EF | 4 ++-- tests/74-int-enum-constraints-OK.asn1.-EFprint-constraints | 3 ++- tests/79-constrained-by-OK.asn1.-EF | 4 ++-- tests/82-with-comps-OK.asn1.-EF | 4 ++-- 9 files changed, 18 insertions(+), 17 deletions(-) diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index fc0e7b35b..082b3a3a5 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -126,9 +126,9 @@ asn1print_oid(int prior_len, asn1p_oid_t *oid, enum asn1print_flags flags) { for(ac = 0; ac < oid->arcs_count; ac++) { const char *arcname = oid->arcs[ac].name; - if(accum + strlen(arcname ? arcname : "") > 75) { + if(accum + strlen(arcname ? arcname : "") > 72) { printf("\n\t"); - accum = 0; + accum = 8; } else { accum += printf(" "); } diff --git a/tests/07-int-OK.asn1.-EF b/tests/07-int-OK.asn1.-EF index 86ee7f84f..2ec50fcd1 100644 --- a/tests/07-int-OK.asn1.-EF +++ b/tests/07-int-OK.asn1.-EF @@ -1,5 +1,5 @@ -ModuleTestInt1 { iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) - software(1) asn1c(5) test(1) 7 } +ModuleTestInt1 { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 7 } DEFINITIONS ::= BEGIN diff --git a/tests/14-resolver-OK.asn1.-EF b/tests/14-resolver-OK.asn1.-EF index 2ab60ee2a..8c3eb0fad 100644 --- a/tests/14-resolver-OK.asn1.-EF +++ b/tests/14-resolver-OK.asn1.-EF @@ -32,8 +32,8 @@ Enumeration ::= ENUMERATED { END -HiddenModule { iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) - software(1) asn1c(5) test(1) 14 3 } +HiddenModule { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 14 3 } DEFINITIONS ::= BEGIN diff --git a/tests/32-sequence-of-OK.asn1.-EF b/tests/32-sequence-of-OK.asn1.-EF index 9809141b7..1fa4e101b 100644 --- a/tests/32-sequence-of-OK.asn1.-EF +++ b/tests/32-sequence-of-OK.asn1.-EF @@ -1,5 +1,5 @@ -ModuleTestSequenceSimple { iso org(3) dod(6) internet(1) private(4) enterprise(1) - spelio(9363) software(1) asn1c(5) test(1) 32 } +ModuleTestSequenceSimple { iso org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 32 } DEFINITIONS IMPLICIT TAGS ::= BEGIN diff --git a/tests/55-components-of-OK.asn1.-EF b/tests/55-components-of-OK.asn1.-EF index 3251d432f..b7b227fe7 100644 --- a/tests/55-components-of-OK.asn1.-EF +++ b/tests/55-components-of-OK.asn1.-EF @@ -1,5 +1,5 @@ -ModuleTestComponentsOf { iso org(3) dod(6) internet(1) private(4) enterprise(1) - spelio(9363) software(1) asn1c(5) test(1) 55 } +ModuleTestComponentsOf { iso org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 55 } DEFINITIONS AUTOMATIC TAGS ::= BEGIN diff --git a/tests/60-any-OK.asn1.-EF b/tests/60-any-OK.asn1.-EF index 520c6c9f0..73c658fd8 100644 --- a/tests/60-any-OK.asn1.-EF +++ b/tests/60-any-OK.asn1.-EF @@ -1,5 +1,5 @@ -ModuleTestANY { iso org(3) dod(6) internet(1) private(4) enterprise(1) spelio(9363) - software(1) asn1c(5) test(1) 60 } +ModuleTestANY { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 60 } DEFINITIONS IMPLICIT TAGS ::= BEGIN diff --git a/tests/74-int-enum-constraints-OK.asn1.-EFprint-constraints b/tests/74-int-enum-constraints-OK.asn1.-EFprint-constraints index 45cb51564..8f9cc6ba8 100644 --- a/tests/74-int-enum-constraints-OK.asn1.-EFprint-constraints +++ b/tests/74-int-enum-constraints-OK.asn1.-EFprint-constraints @@ -1,5 +1,6 @@ ModuleTestIntegerAndEnumeratedConstraints { iso org(3) dod(6) internet(1) - private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 74 } + private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) + 74 } DEFINITIONS ::= BEGIN diff --git a/tests/79-constrained-by-OK.asn1.-EF b/tests/79-constrained-by-OK.asn1.-EF index 0a91f340d..f462be006 100644 --- a/tests/79-constrained-by-OK.asn1.-EF +++ b/tests/79-constrained-by-OK.asn1.-EF @@ -1,5 +1,5 @@ -ModuleTestConstrainedBy { iso org(3) dod(6) internet(1) private(4) enterprise(1) - spelio(9363) software(1) asn1c(5) test(1) 79 } +ModuleTestConstrainedBy { iso org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 79 } DEFINITIONS ::= BEGIN diff --git a/tests/82-with-comps-OK.asn1.-EF b/tests/82-with-comps-OK.asn1.-EF index 34ea419ce..f4fe9aaa7 100644 --- a/tests/82-with-comps-OK.asn1.-EF +++ b/tests/82-with-comps-OK.asn1.-EF @@ -1,5 +1,5 @@ -ModuleTestWithComponents { iso org(3) dod(6) internet(1) private(4) enterprise(1) - spelio(9363) software(1) asn1c(5) test(1) 82 } +ModuleTestWithComponents { iso org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 82 } DEFINITIONS ::= BEGIN From b9b8be46aea7fa9c1f3c836e51e4d96f903db554 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 29 Mar 2005 16:50:58 +0000 Subject: [PATCH 0844/1469] api change git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@844 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-70.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asn1c/tests/check-70.c b/asn1c/tests/check-70.c index adffe6151..50ef83fbd 100644 --- a/asn1c/tests/check-70.c +++ b/asn1c/tests/check-70.c @@ -80,7 +80,7 @@ static PDU_t * load_object_from(enum expectation expectation, char *fbuf, int size, enum der_or_xer how) { asn_dec_rval_t rval; asn_dec_rval_t (*zer_decode)(struct asn_codec_ctx_s *, - asn_TYPE_descriptor_t *, void **, void *, size_t); + asn_TYPE_descriptor_t *, void **, const void *, size_t); PDU_t *st = 0; int csize = 1; From 75fddccc5ef06f268ba05005bddf82bb26232503 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 29 Mar 2005 17:19:53 +0000 Subject: [PATCH 0845/1469] proper XER encoding of native enumerated type git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@845 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/INTEGER.c | 14 ++++++-------- skeletons/NativeEnumerated.c | 34 +++++++++++++++++++++++++++++++++- skeletons/NativeEnumerated.h | 4 +++- 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 2579153f6..e4e52d416 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -6,7 +6,6 @@ #include #include #include /* Encoder and decoder of a primitive type */ -#include #include /* @@ -93,8 +92,7 @@ INTEGER_encode_der(asn_TYPE_descriptor_t *td, void *sptr, return der_encode_primitive(td, sptr, tag_mode, tag, cb, app_key); } -static const asn_INTEGER_enum_map_t *INTEGER__map_value2enum(asn_INTEGER_specifics_t *specs, long value); -static const asn_INTEGER_enum_map_t *INTEGER__map_enum2value(asn_INTEGER_specifics_t *specs, const char *lstart, const char *lstop); +static const asn_INTEGER_enum_map_t *INTEGER_map_enum2value(asn_INTEGER_specifics_t *specs, const char *lstart, const char *lstop); /* * INTEGER specific human-readable output. @@ -139,7 +137,7 @@ INTEGER__dump(asn_TYPE_descriptor_t *td, const INTEGER_t *st, asn_app_consume_by accum = (accum << 8) | *buf; } - el = INTEGER__map_value2enum(specs, accum); + el = INTEGER_map_value2enum(specs, accum); if(el) { scrsize = el->enum_len + 32; scr = (char *)alloca(scrsize); @@ -240,7 +238,7 @@ INTEGER__compar_enum2value(const void *kp, const void *am) { } static const asn_INTEGER_enum_map_t * -INTEGER__map_enum2value(asn_INTEGER_specifics_t *specs, const char *lstart, const char *lstop) { +INTEGER_map_enum2value(asn_INTEGER_specifics_t *specs, const char *lstart, const char *lstop) { asn_INTEGER_enum_map_t *el_found; int count = specs ? specs->map_count : 0; struct e2v_key key; @@ -287,8 +285,8 @@ INTEGER__compar_value2enum(const void *kp, const void *am) { else return 1; } -static const asn_INTEGER_enum_map_t * -INTEGER__map_value2enum(asn_INTEGER_specifics_t *specs, long value) { +const asn_INTEGER_enum_map_t * +INTEGER_map_value2enum(asn_INTEGER_specifics_t *specs, long value) { int count = specs ? specs->map_count : 0; if(!count) return 0; return (asn_INTEGER_enum_map_t *)bsearch(&value, specs->value2enum, @@ -366,7 +364,7 @@ INTEGER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chun case 0x3c: /* '<' */ if(state == ST_SKIPSPACE) { const asn_INTEGER_enum_map_t *el; - el = INTEGER__map_enum2value( + el = INTEGER_map_enum2value( (asn_INTEGER_specifics_t *) td->specifics, lstart, lstop); if(el) { diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c index 8a524853b..fb77e06da 100644 --- a/skeletons/NativeEnumerated.c +++ b/skeletons/NativeEnumerated.c @@ -27,7 +27,7 @@ asn_TYPE_descriptor_t asn_DEF_NativeEnumerated = { NativeInteger_decode_ber, NativeInteger_encode_der, NativeInteger_decode_xer, - NativeInteger_encode_xer, + NativeEnumerated_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_NativeEnumerated_tags, sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]), @@ -37,3 +37,35 @@ asn_TYPE_descriptor_t asn_DEF_NativeEnumerated = { 0 /* No specifics */ }; +asn_enc_rval_t +NativeEnumerated_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; + asn_enc_rval_t er; + const long *native = (const long *)sptr; + const asn_INTEGER_enum_map_t *el; + + (void)ilevel; + (void)flags; + + if(!native) _ASN_ENCODE_FAILED; + + el = INTEGER_map_value2enum(specs, *native); + if(el) { + size_t srcsize = el->enum_len + 5; + char *src = (char *)alloca(srcsize); + + er.encoded = snprintf(src, srcsize, "<%s/>", el->enum_name); + assert(er.encoded > 0 && (size_t)er.encoded < srcsize); + if(cb(src, er.encoded, app_key) < 0) _ASN_ENCODE_FAILED; + return er; + } else { + ASN_DEBUG("ASN.1 forbids dealing with " + "unknown value of ENUMERATED type"); + _ASN_ENCODE_FAILED; + } + + return er; +} + diff --git a/skeletons/NativeEnumerated.h b/skeletons/NativeEnumerated.h index 2e6e1d0ac..16f1bfdd3 100644 --- a/skeletons/NativeEnumerated.h +++ b/skeletons/NativeEnumerated.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Copyright (c) 2004, 2005 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ /* @@ -16,4 +16,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NativeEnumerated; +xer_type_encoder_f NativeEnumerated_encode_xer; + #endif /* _NativeEnumerated_H_ */ From 5ec2fe174af73afdafbc8cac2dde2a8505138084 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 29 Mar 2005 17:21:14 +0000 Subject: [PATCH 0846/1469] globalized assert() git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@846 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ANY.c | 1 - skeletons/BMPString.c | 1 - skeletons/GeneralizedTime.c | 3 --- skeletons/INTEGER.h | 5 +++++ skeletons/NativeInteger.c | 3 +-- skeletons/NativeReal.c | 1 - skeletons/OBJECT_IDENTIFIER.c | 1 - skeletons/OCTET_STRING.c | 1 - skeletons/REAL.c | 1 - skeletons/RELATIVE-OID.c | 1 - skeletons/UTCTime.c | 1 - skeletons/UniversalString.c | 1 - skeletons/asn-decoder-template.c | 4 ++-- skeletons/asn_codecs_prim.c | 1 - skeletons/asn_system.h | 3 +++ skeletons/ber_decoder.c | 1 - skeletons/constr_CHOICE.c | 1 - skeletons/constr_SEQUENCE.c | 1 - skeletons/constr_SET.c | 1 - skeletons/constr_SET_OF.c | 1 - skeletons/der_encoder.c | 1 - skeletons/xer_decoder.c | 8 ++++---- 22 files changed, 15 insertions(+), 27 deletions(-) diff --git a/skeletons/ANY.c b/skeletons/ANY.c index 54cc9a781..73702444a 100644 --- a/skeletons/ANY.c +++ b/skeletons/ANY.c @@ -4,7 +4,6 @@ */ #include #include -#include #include static asn_OCTET_STRING_specifics_t asn_DEF_ANY_specs = { diff --git a/skeletons/BMPString.c b/skeletons/BMPString.c index 42b84f680..f3308bf7c 100644 --- a/skeletons/BMPString.c +++ b/skeletons/BMPString.c @@ -5,7 +5,6 @@ #include #include #include -#include /* * BMPString basic type description. diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 2a28d7344..f52aec746 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -8,9 +8,6 @@ #include #include #include -#ifndef __NO_ASSERT_H__ -#include -#endif /* __NO_ASSERT_H__ */ #if defined(WIN32) #warning PLEASE STOP AND READ! diff --git a/skeletons/INTEGER.h b/skeletons/INTEGER.h index dbc852572..416efd9ac 100644 --- a/skeletons/INTEGER.h +++ b/skeletons/INTEGER.h @@ -47,4 +47,9 @@ xer_type_encoder_f INTEGER_encode_xer; int asn_INTEGER2long(const INTEGER_t *i, long *l); int asn_long2INTEGER(INTEGER_t *i, long l); +/* + * Convert the integer value into the corresponding enumeration map entry. + */ +const asn_INTEGER_enum_map_t *INTEGER_map_value2enum(asn_INTEGER_specifics_t *specs, long value); + #endif /* _INTEGER_H_ */ diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index acdbff6f9..2b1361852 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Copyright (c) 2004, 2005 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ /* @@ -11,7 +11,6 @@ */ #include #include -#include /* * NativeInteger basic type description. diff --git a/skeletons/NativeReal.c b/skeletons/NativeReal.c index 5bc95b053..f2a3afceb 100644 --- a/skeletons/NativeReal.c +++ b/skeletons/NativeReal.c @@ -12,7 +12,6 @@ #include #include #include -#include /* * NativeReal basic type description. diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index f899ab08a..7c9c980f7 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -5,7 +5,6 @@ #include #include #include /* for CHAR_BIT */ -#include #include /* diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 207b52873..23118e33c 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -5,7 +5,6 @@ #include #include #include /* for .bits_unused member */ -#include #include /* diff --git a/skeletons/REAL.c b/skeletons/REAL.c index 6a5e7cd9d..92b42d2ad 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -11,7 +11,6 @@ #include /* for strtod(3) */ #include #include -#include #include #undef INT_MAX diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index b0be62285..0c9235db2 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -7,7 +7,6 @@ #include #include /* Encoder and decoder of a primitive type */ #include /* for CHAR_BIT */ -#include #include /* diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c index f9de9dd35..e650b7449 100644 --- a/skeletons/UTCTime.c +++ b/skeletons/UTCTime.c @@ -7,7 +7,6 @@ #include #include #include -#include #ifndef __NO_ASN_TABLE__ diff --git a/skeletons/UniversalString.c b/skeletons/UniversalString.c index 27f1cda4e..938bf07be 100644 --- a/skeletons/UniversalString.c +++ b/skeletons/UniversalString.c @@ -5,7 +5,6 @@ #include #include #include -#include /* * UniversalString basic type description. diff --git a/skeletons/asn-decoder-template.c b/skeletons/asn-decoder-template.c index e4760756d..4ff524c87 100644 --- a/skeletons/asn-decoder-template.c +++ b/skeletons/asn-decoder-template.c @@ -12,9 +12,9 @@ #include #include /* for getopt */ #include /* for strerror(3) */ -#include /* for errno */ -#include /* for assert(3) */ #include /* for EX_* exit codes */ +#include /* for assert(3) */ +#include /* for errno */ #include diff --git a/skeletons/asn_codecs_prim.c b/skeletons/asn_codecs_prim.c index afadb7212..4c66f39ae 100644 --- a/skeletons/asn_codecs_prim.c +++ b/skeletons/asn_codecs_prim.c @@ -4,7 +4,6 @@ */ #include #include -#include #include /* diff --git a/skeletons/asn_system.h b/skeletons/asn_system.h index 5a5eb9bfb..2f4d7980d 100644 --- a/skeletons/asn_system.h +++ b/skeletons/asn_system.h @@ -18,6 +18,9 @@ #include /* For size_t */ #include /* For va_start */ #include /* for offsetof and ptrdiff_t */ +#ifndef __NO_ASSERT_H__ +#include /* for assert() macro */ +#endif #ifdef WIN32 diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c index dc097fc58..bb7a09042 100644 --- a/skeletons/ber_decoder.c +++ b/skeletons/ber_decoder.c @@ -3,7 +3,6 @@ * Redistribution and modifications are permitted subject to BSD license. */ #include -#include #undef ADVANCE #define ADVANCE(num_bytes) do { \ diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index bcf4c1628..e49bc1afc 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -5,7 +5,6 @@ */ #include #include -#include /* * Number of bytes left for this structure. diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index d95266767..f5c33da87 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -5,7 +5,6 @@ */ #include #include -#include /* * Number of bytes left for this structure. diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index 1b2f85f83..a45d7f9fd 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -4,7 +4,6 @@ */ #include #include -#include /* for assert() */ #ifndef WIN32 #include /* for ntohl() */ diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index 84892e785..1bae1f971 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -5,7 +5,6 @@ #include #include #include -#include /* * Number of bytes left for this structure. diff --git a/skeletons/der_encoder.c b/skeletons/der_encoder.c index 62ad757ee..68dd24e65 100644 --- a/skeletons/der_encoder.c +++ b/skeletons/der_encoder.c @@ -3,7 +3,6 @@ * Redistribution and modifications are permitted subject to BSD license. */ #include -#include #include static ssize_t der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len, diff --git a/skeletons/xer_decoder.c b/skeletons/xer_decoder.c index d0a087833..b112a72d1 100644 --- a/skeletons/xer_decoder.c +++ b/skeletons/xer_decoder.c @@ -1,8 +1,10 @@ - +/* + * Copyright (c) 2004, 2005 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ #include #include #include /* XER/XML parsing support */ -#include /* @@ -346,5 +348,3 @@ xer_skip_unknown(xer_check_tag_e tcv, ber_tlv_len_t *depth) { return -1; } } - - From c86870cb43eb740d365e15a4b49c2db68d9b1265 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 29 Mar 2005 19:04:24 +0000 Subject: [PATCH 0847/1469] deeper validation git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@847 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 2 +- libasn1compiler/asn1c_constraint.c | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 7d66b1b19..a2a09f27f 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1067,7 +1067,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("td->elements_count = asn_DEF_%s.elements_count;\n", type_name); if(etd_spec != ETD_NO_SPECIFICS) { INDENT(-1); - OUT(" /* "); + OUT(" /* "); } OUT("td->specifics = asn_DEF_%s.specifics;", type_name); if(etd_spec == ETD_NO_SPECIFICS) { diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index 0729d08e9..78097838e 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -170,8 +170,17 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { INDENT(-1); OUT(") {\n"); INDENT(+1); - OUT("/* Constraint check succeeded */\n"); - OUT("return 0;\n"); + switch(etype) { + case ASN_CONSTR_SEQUENCE_OF: + OUT("/* SEQUENCE validation code is the same as SET */\n"); + case ASN_CONSTR_SET_OF: + OUT("/* Perform validation of the inner elements */\n"); + OUT("return SET_OF_constraint(td, list, app_errlog, app_key);\n"); + break; + default: + OUT("/* Constraint check succeeded */\n"); + OUT("return 0;\n"); + } INDENT(-1); OUT("} else {\n"); INDENT(+1); From 541def93b60986a75a643fbb452d4c91e0bc1821 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 29 Mar 2005 19:05:37 +0000 Subject: [PATCH 0848/1469] deeper validation; git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@848 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/42-real-life-OK.asn1.-PR | 11 ++++++----- tests/66-ref-simple-OK.asn1.-P | 2 +- tests/70-xer-test-OK.asn1.-P | 4 ++-- tests/73-circular-OK.asn1.-P | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index 304eac2bc..af71d814c 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -58,8 +58,9 @@ memb_varsets_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, } if((size >= 1)) { - /* Constraint check succeeded */ - return 0; + /* SEQUENCE validation code is the same as SET */ + /* Perform validation of the inner elements */ + return SET_OF_constraint(td, list, app_errlog, app_key); } else { _ASN_ERRLOG(app_errlog, app_key, "%s: constraint failed (%s:%d)", @@ -395,8 +396,8 @@ memb_vset_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, } if((size >= 1)) { - /* Constraint check succeeded */ - return 0; + /* Perform validation of the inner elements */ + return SET_OF_constraint(td, list, app_errlog, app_key); } else { _ASN_ERRLOG(app_errlog, app_key, "%s: constraint failed (%s:%d)", @@ -630,7 +631,7 @@ accept_as_2_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; - /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ + /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } static void diff --git a/tests/66-ref-simple-OK.asn1.-P b/tests/66-ref-simple-OK.asn1.-P index 0259fc09d..d269a7a1c 100644 --- a/tests/66-ref-simple-OK.asn1.-P +++ b/tests/66-ref-simple-OK.asn1.-P @@ -111,7 +111,7 @@ SimpleType_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; - /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ + /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } void diff --git a/tests/70-xer-test-OK.asn1.-P b/tests/70-xer-test-OK.asn1.-P index 0b1bbb36e..8186e9afe 100644 --- a/tests/70-xer-test-OK.asn1.-P +++ b/tests/70-xer-test-OK.asn1.-P @@ -432,7 +432,7 @@ enum_4_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; - /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ + /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } static void @@ -836,7 +836,7 @@ Member_2_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; - /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ + /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } static void diff --git a/tests/73-circular-OK.asn1.-P b/tests/73-circular-OK.asn1.-P index 49b3fcfc3..0def1eee3 100644 --- a/tests/73-circular-OK.asn1.-P +++ b/tests/73-circular-OK.asn1.-P @@ -683,7 +683,7 @@ EnumType_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; - /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ + /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } void From 0f7920b053586c0689906d50250b745a3f5c1b6c Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 29 Mar 2005 19:06:20 +0000 Subject: [PATCH 0849/1469] sptr git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@849 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_constraint.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index 78097838e..4550c52a5 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -175,7 +175,7 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { OUT("/* SEQUENCE validation code is the same as SET */\n"); case ASN_CONSTR_SET_OF: OUT("/* Perform validation of the inner elements */\n"); - OUT("return SET_OF_constraint(td, list, app_errlog, app_key);\n"); + OUT("return SET_OF_constraint(td, sptr, app_errlog, app_key);\n"); break; default: OUT("/* Constraint check succeeded */\n"); From 77fff67afd6834f5d4653681a3787cae014b1c1f Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 30 Mar 2005 05:14:26 +0000 Subject: [PATCH 0850/1469] ar for Solaris git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@850 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure | 40 ++++++++++++++++++++++++++++++++++++++++ configure.in | 1 + 2 files changed, 41 insertions(+) diff --git a/configure b/configure index dac27c136..810848cd0 100755 --- a/configure +++ b/configure @@ -21389,6 +21389,46 @@ fi if test "$LEX" = :; then LEX=${am_missing_run}flex fi +# Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $AR in + [\\/]* | ?:[\\/]*) + ac_cv_path_AR="$AR" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_dummy="$PATH:/usr/ucb:/usr/ccs/bin" +for as_dir in $as_dummy +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_AR="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_path_AR" && ac_cv_path_AR="ar" + ;; +esac +fi +AR=$ac_cv_path_AR + +if test -n "$AR"; then + echo "$as_me:$LINENO: result: $AR" >&5 +echo "${ECHO_T}$AR" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi case "$host_os" in cygwin*) diff --git a/configure.in b/configure.in index 912281d47..c2aed5c27 100644 --- a/configure.in +++ b/configure.in @@ -34,6 +34,7 @@ AC_PROG_LN_S AC_PROG_MAKE_SET AC_PROG_YACC AM_PROG_LEX +AC_PATH_PROG(AR, ar, ar, $PATH:/usr/ucb:/usr/ccs/bin) dnl for Solaris dnl *** Building mingw32 with cygwin compiler *** case "$host_os" in From 246a55fd0ae0f9f4407a3818f9a9c51c709c3101 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 30 Mar 2005 06:03:41 +0000 Subject: [PATCH 0851/1469] uniform checking git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@851 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_constraint.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index 4550c52a5..a5d5ab207 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -172,10 +172,9 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { INDENT(+1); switch(etype) { case ASN_CONSTR_SEQUENCE_OF: - OUT("/* SEQUENCE validation code is the same as SET */\n"); case ASN_CONSTR_SET_OF: OUT("/* Perform validation of the inner elements */\n"); - OUT("return SET_OF_constraint(td, sptr, app_errlog, app_key);\n"); + OUT("return td->check_constraints(td, sptr, app_errlog, app_key);\n"); break; default: OUT("/* Constraint check succeeded */\n"); From 7388db0fb7e52c7ee8ec577b27c58c40eeb3a62b Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 31 Mar 2005 21:48:13 +0000 Subject: [PATCH 0852/1469] opaque WITH SYNTAX git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@852 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_y.c | 1880 +++++++++++++++++++-------------------- libasn1parser/asn1p_y.y | 36 +- 2 files changed, 921 insertions(+), 995 deletions(-) diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index ae4e31a43..bc495515f 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -206,11 +206,11 @@ typedef union { -#define YYFINAL 431 +#define YYFINAL 425 #define YYFLAG -32768 #define YYNTBASE 118 -#define YYTRANSLATE(x) ((unsigned)(x) <= 356 ? yytranslate[x] : 222) +#define YYTRANSLATE(x) ((unsigned)(x) <= 356 ? yytranslate[x] : 220) static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -258,144 +258,143 @@ static const short yyprhs[] = { 0, 57, 60, 63, 64, 66, 68, 71, 73, 75, 77, 79, 81, 82, 86, 88, 92, 95, 97, 100, 105, 107, 111, 113, 117, 119, 123, 127, 130, 132, 136, - 138, 142, 144, 151, 153, 155, 156, 158, 160, 164, - 166, 168, 173, 177, 181, 188, 190, 194, 196, 200, - 204, 208, 210, 214, 216, 218, 219, 221, 223, 227, - 231, 235, 237, 239, 243, 246, 248, 254, 255, 257, - 259, 263, 266, 271, 276, 277, 279, 280, 287, 289, - 292, 294, 296, 298, 302, 306, 310, 312, 317, 322, - 327, 334, 341, 343, 348, 353, 355, 359, 361, 365, - 369, 373, 375, 379, 381, 385, 387, 389, 391, 393, - 398, 402, 403, 407, 409, 411, 413, 415, 417, 419, - 421, 423, 425, 429, 431, 433, 435, 437, 440, 442, - 444, 446, 448, 451, 454, 456, 458, 461, 464, 466, - 468, 470, 472, 474, 477, 479, 482, 484, 486, 488, - 490, 492, 494, 496, 498, 500, 502, 504, 506, 508, - 510, 512, 514, 516, 518, 520, 521, 523, 525, 530, - 534, 539, 541, 545, 551, 553, 557, 561, 565, 569, - 574, 578, 580, 582, 586, 590, 594, 598, 600, 602, - 603, 609, 611, 614, 617, 621, 623, 625, 627, 629, - 631, 633, 635, 637, 641, 647, 649, 653, 655, 659, - 660, 662, 664, 666, 668, 670, 672, 676, 681, 683, - 687, 690, 694, 696, 700, 701, 703, 705, 708, 711, - 715, 717, 721, 723, 728, 733, 735, 737, 739, 741, - 742, 744, 747, 752, 753, 755, 757, 759, 760, 762, - 764, 766, 768, 770, 771, 773 + 138, 142, 144, 145, 152, 154, 156, 161, 165, 169, + 176, 178, 182, 184, 188, 192, 196, 198, 202, 204, + 206, 207, 209, 211, 215, 219, 223, 225, 227, 231, + 234, 236, 242, 243, 245, 247, 251, 254, 259, 264, + 265, 267, 268, 275, 277, 280, 282, 284, 286, 290, + 294, 298, 300, 305, 310, 315, 322, 329, 331, 336, + 341, 343, 347, 349, 353, 357, 361, 363, 367, 369, + 373, 375, 377, 379, 381, 386, 390, 391, 395, 397, + 399, 401, 403, 405, 407, 409, 411, 413, 417, 419, + 421, 423, 425, 428, 430, 432, 434, 436, 439, 442, + 444, 446, 449, 452, 454, 456, 458, 460, 462, 465, + 467, 470, 472, 474, 476, 478, 480, 482, 484, 486, + 488, 490, 492, 494, 496, 498, 500, 502, 504, 506, + 508, 509, 511, 513, 518, 522, 527, 529, 533, 539, + 541, 545, 549, 553, 557, 562, 566, 568, 570, 574, + 578, 582, 586, 588, 590, 591, 597, 599, 602, 605, + 609, 611, 613, 615, 617, 619, 621, 623, 625, 629, + 635, 637, 641, 643, 647, 648, 650, 652, 654, 656, + 658, 660, 664, 669, 671, 675, 678, 682, 684, 688, + 689, 691, 693, 696, 699, 703, 705, 709, 711, 716, + 721, 723, 725, 727, 729, 730, 732, 735, 740, 741, + 743, 745, 747, 748, 750, 752, 754, 756, 758, 759, + 761 }; static const short yyrhs[] = { 119, - 0, 120, 0, 119, 120, 0, 218, 121, 36, 125, + 0, 120, 0, 119, 120, 0, 216, 121, 36, 125, 3, 23, 128, 41, 0, 0, 122, 0, 105, 123, 106, 0, 105, 106, 0, 124, 0, 123, 124, 0, - 221, 0, 221, 107, 9, 108, 0, 9, 0, 0, + 219, 0, 219, 107, 9, 108, 0, 9, 0, 0, 126, 0, 127, 0, 126, 127, 0, 43, 86, 0, 54, 86, 0, 22, 86, 0, 45, 55, 0, 14, 59, 0, 0, 129, 0, 130, 0, 129, 130, 0, - 132, 0, 137, 0, 145, 0, 172, 0, 140, 0, - 0, 40, 14, 131, 0, 181, 0, 56, 133, 109, + 132, 0, 137, 0, 143, 0, 170, 0, 140, 0, + 0, 40, 14, 131, 0, 179, 0, 56, 133, 109, 0, 56, 48, 0, 134, 0, 133, 134, 0, 135, - 48, 218, 121, 0, 136, 0, 135, 110, 136, 0, - 218, 0, 218, 105, 106, 0, 221, 0, 44, 138, + 48, 216, 121, 0, 136, 0, 135, 110, 136, 0, + 216, 0, 216, 105, 106, 0, 219, 0, 44, 138, 109, 0, 44, 19, 109, 0, 44, 109, 0, 139, - 0, 138, 110, 139, 0, 218, 0, 218, 105, 106, - 0, 221, 0, 218, 141, 3, 105, 142, 106, 0, - 167, 0, 178, 0, 0, 143, 0, 144, 0, 143, - 110, 144, 0, 104, 0, 189, 0, 218, 3, 213, - 89, 0, 218, 3, 165, 0, 218, 3, 155, 0, - 218, 105, 146, 106, 3, 165, 0, 147, 0, 146, - 110, 147, 0, 218, 0, 218, 111, 221, 0, 218, - 111, 218, 0, 178, 111, 221, 0, 149, 0, 148, - 110, 149, 0, 165, 0, 221, 0, 0, 151, 0, - 152, 0, 151, 110, 152, 0, 221, 165, 207, 0, - 32, 70, 165, 0, 164, 0, 154, 0, 153, 110, - 154, 0, 221, 165, 0, 164, 0, 30, 105, 157, - 106, 159, 0, 0, 90, 0, 158, 0, 157, 110, - 158, 0, 170, 207, 0, 170, 165, 156, 207, 0, - 170, 170, 156, 207, 0, 0, 160, 0, 0, 97, - 84, 105, 161, 162, 106, 0, 163, 0, 162, 163, - 0, 4, 0, 170, 0, 104, 0, 104, 112, 175, - 0, 104, 112, 212, 0, 213, 166, 185, 0, 180, - 0, 29, 105, 153, 106, 0, 80, 105, 150, 106, - 0, 81, 105, 150, 106, 0, 80, 185, 70, 220, - 213, 166, 0, 81, 185, 70, 220, 213, 166, 0, - 20, 0, 20, 37, 27, 221, 0, 218, 105, 148, - 106, 0, 167, 0, 58, 70, 167, 0, 13, 0, - 13, 113, 218, 0, 219, 113, 218, 0, 13, 113, - 221, 0, 219, 0, 219, 113, 168, 0, 169, 0, - 168, 113, 169, 0, 171, 0, 171, 0, 15, 0, - 16, 0, 221, 141, 3, 173, 0, 221, 111, 173, - 0, 0, 105, 174, 177, 0, 65, 0, 47, 0, - 88, 0, 5, 0, 7, 0, 176, 0, 212, 0, - 175, 0, 221, 0, 218, 113, 221, 0, 6, 0, - 10, 0, 11, 0, 4, 0, 177, 4, 0, 26, - 0, 65, 0, 78, 0, 179, 0, 69, 83, 0, - 67, 53, 0, 79, 0, 46, 0, 38, 73, 0, - 28, 83, 0, 93, 0, 49, 0, 181, 0, 60, - 0, 42, 0, 24, 83, 0, 178, 0, 179, 209, - 0, 25, 0, 50, 0, 51, 0, 52, 0, 61, - 0, 66, 0, 76, 0, 85, 0, 87, 0, 92, - 0, 94, 0, 95, 0, 96, 0, 68, 0, 101, - 0, 102, 0, 99, 0, 100, 0, 98, 0, 0, - 186, 0, 187, 0, 82, 107, 188, 108, 0, 107, - 188, 108, 0, 187, 107, 188, 108, 0, 189, 0, - 189, 110, 104, 0, 189, 110, 104, 110, 189, 0, - 190, 0, 19, 98, 190, 0, 189, 182, 190, 0, - 189, 183, 190, 0, 190, 184, 190, 0, 193, 107, - 188, 108, 0, 107, 188, 108, 0, 194, 0, 195, - 0, 194, 192, 194, 0, 63, 192, 194, 0, 194, - 192, 62, 0, 63, 192, 62, 0, 201, 0, 196, - 0, 0, 33, 27, 105, 191, 177, 0, 103, 0, - 103, 114, 0, 114, 103, 0, 114, 103, 114, 0, - 82, 0, 48, 0, 47, 0, 88, 0, 212, 0, - 176, 0, 221, 0, 218, 0, 97, 31, 187, 0, - 97, 32, 105, 197, 106, 0, 198, 0, 197, 110, - 198, 0, 104, 0, 221, 185, 199, 0, 0, 200, - 0, 75, 0, 17, 0, 71, 0, 202, 0, 203, - 0, 105, 218, 106, 0, 202, 105, 204, 106, 0, - 205, 0, 204, 110, 205, 0, 115, 206, 0, 115, - 113, 206, 0, 221, 0, 206, 113, 221, 0, 0, - 208, 0, 71, 0, 35, 173, 0, 105, 106, 0, - 105, 210, 106, 0, 211, 0, 210, 110, 211, 0, - 221, 0, 221, 107, 212, 108, 0, 221, 107, 175, - 108, 0, 212, 0, 104, 0, 9, 0, 12, 0, - 0, 214, 0, 215, 217, 0, 116, 216, 9, 117, - 0, 0, 91, 0, 21, 0, 77, 0, 0, 54, - 0, 43, 0, 13, 0, 14, 0, 14, 0, 0, - 221, 0, 8, 0 + 0, 138, 110, 139, 0, 216, 0, 216, 105, 106, + 0, 219, 0, 0, 216, 142, 3, 105, 141, 175, + 0, 165, 0, 176, 0, 216, 3, 211, 89, 0, + 216, 3, 163, 0, 216, 3, 153, 0, 216, 105, + 144, 106, 3, 163, 0, 145, 0, 144, 110, 145, + 0, 216, 0, 216, 111, 219, 0, 216, 111, 216, + 0, 176, 111, 219, 0, 147, 0, 146, 110, 147, + 0, 163, 0, 219, 0, 0, 149, 0, 150, 0, + 149, 110, 150, 0, 219, 163, 205, 0, 32, 70, + 163, 0, 162, 0, 152, 0, 151, 110, 152, 0, + 219, 163, 0, 162, 0, 30, 105, 155, 106, 157, + 0, 0, 90, 0, 156, 0, 155, 110, 156, 0, + 168, 205, 0, 168, 163, 154, 205, 0, 168, 168, + 154, 205, 0, 0, 158, 0, 0, 97, 84, 105, + 159, 160, 106, 0, 161, 0, 160, 161, 0, 4, + 0, 168, 0, 104, 0, 104, 112, 173, 0, 104, + 112, 210, 0, 211, 164, 183, 0, 178, 0, 29, + 105, 151, 106, 0, 80, 105, 148, 106, 0, 81, + 105, 148, 106, 0, 80, 183, 70, 218, 211, 164, + 0, 81, 183, 70, 218, 211, 164, 0, 20, 0, + 20, 37, 27, 219, 0, 216, 105, 146, 106, 0, + 165, 0, 58, 70, 165, 0, 13, 0, 13, 113, + 216, 0, 217, 113, 216, 0, 13, 113, 219, 0, + 217, 0, 217, 113, 166, 0, 167, 0, 166, 113, + 167, 0, 169, 0, 169, 0, 15, 0, 16, 0, + 219, 142, 3, 171, 0, 219, 111, 171, 0, 0, + 105, 172, 175, 0, 65, 0, 47, 0, 88, 0, + 5, 0, 7, 0, 174, 0, 210, 0, 173, 0, + 219, 0, 216, 113, 219, 0, 6, 0, 10, 0, + 11, 0, 4, 0, 175, 4, 0, 26, 0, 65, + 0, 78, 0, 177, 0, 69, 83, 0, 67, 53, + 0, 79, 0, 46, 0, 38, 73, 0, 28, 83, + 0, 93, 0, 49, 0, 179, 0, 60, 0, 42, + 0, 24, 83, 0, 176, 0, 177, 207, 0, 25, + 0, 50, 0, 51, 0, 52, 0, 61, 0, 66, + 0, 76, 0, 85, 0, 87, 0, 92, 0, 94, + 0, 95, 0, 96, 0, 68, 0, 101, 0, 102, + 0, 99, 0, 100, 0, 98, 0, 0, 184, 0, + 185, 0, 82, 107, 186, 108, 0, 107, 186, 108, + 0, 185, 107, 186, 108, 0, 187, 0, 187, 110, + 104, 0, 187, 110, 104, 110, 187, 0, 188, 0, + 19, 98, 188, 0, 187, 180, 188, 0, 187, 181, + 188, 0, 188, 182, 188, 0, 191, 107, 186, 108, + 0, 107, 186, 108, 0, 192, 0, 193, 0, 192, + 190, 192, 0, 63, 190, 192, 0, 192, 190, 62, + 0, 63, 190, 62, 0, 199, 0, 194, 0, 0, + 33, 27, 105, 189, 175, 0, 103, 0, 103, 114, + 0, 114, 103, 0, 114, 103, 114, 0, 82, 0, + 48, 0, 47, 0, 88, 0, 210, 0, 174, 0, + 219, 0, 216, 0, 97, 31, 185, 0, 97, 32, + 105, 195, 106, 0, 196, 0, 195, 110, 196, 0, + 104, 0, 219, 183, 197, 0, 0, 198, 0, 75, + 0, 17, 0, 71, 0, 200, 0, 201, 0, 105, + 216, 106, 0, 200, 105, 202, 106, 0, 203, 0, + 202, 110, 203, 0, 115, 204, 0, 115, 113, 204, + 0, 219, 0, 204, 113, 219, 0, 0, 206, 0, + 71, 0, 35, 171, 0, 105, 106, 0, 105, 208, + 106, 0, 209, 0, 208, 110, 209, 0, 219, 0, + 219, 107, 210, 108, 0, 219, 107, 173, 108, 0, + 210, 0, 104, 0, 9, 0, 12, 0, 0, 212, + 0, 213, 215, 0, 116, 214, 9, 117, 0, 0, + 91, 0, 21, 0, 77, 0, 0, 54, 0, 43, + 0, 13, 0, 14, 0, 14, 0, 0, 219, 0, + 8, 0 }; #endif #if YYDEBUG != 0 static const short yyrline[] = { 0, - 305, 311, 317, 333, 358, 360, 363, 367, 372, 379, - 387, 392, 396, 405, 407, 415, 419, 427, 431, 434, - 437, 441, 461, 463, 471, 475, 507, 511, 520, 527, - 540, 547, 549, 561, 574, 581, 586, 592, 598, 607, - 613, 619, 626, 632, 640, 644, 647, 654, 660, 666, - 673, 679, 688, 698, 706, 714, 716, 726, 729, 733, - 736, 748, 760, 766, 782, 791, 801, 811, 816, 823, - 830, 840, 846, 852, 856, 879, 881, 883, 889, 895, - 902, 909, 914, 920, 926, 932, 937, 947, 949, 952, - 960, 966, 975, 981, 998, 1000, 1005, 1009, 1014, 1019, - 1025, 1029, 1040, 1049, 1058, 1069, 1091, 1095, 1101, 1107, - 1113, 1123, 1133, 1139, 1153, 1177, 1184, 1198, 1207, 1217, - 1227, 1237, 1245, 1266, 1275, 1284, 1285, 1287, 1294, 1306, - 1316, 1324, 1324, 1329, 1334, 1339, 1344, 1348, 1352, 1355, - 1358, 1363, 1375, 1392, 1397, 1402, 1435, 1445, 1459, 1461, - 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, - 1472, 1478, 1480, 1481, 1484, 1491, 1503, 1505, 1509, 1513, - 1514, 1515, 1516, 1517, 1521, 1522, 1523, 1524, 1528, 1529, - 1536, 1536, 1537, 1537, 1538, 1540, 1542, 1547, 1551, 1560, - 1564, 1569, 1573, 1579, 1589, 1593, 1596, 1599, 1602, 1607, - 1616, 1624, 1630, 1636, 1643, 1651, 1659, 1668, 1671, 1674, - 1675, 1685, 1687, 1688, 1689, 1692, 1696, 1701, 1707, 1712, - 1715, 1718, 1731, 1745, 1749, 1754, 1758, 1763, 1770, 1783, - 1785, 1788, 1792, 1795, 1800, 1804, 1812, 1827, 1833, 1840, - 1853, 1865, 1880, 1884, 1901, 1906, 1909, 1914, 1936, 1941, - 1946, 1952, 1958, 1966, 1974, 1982, 1989, 1999, 2004, 2034, - 2036, 2039, 2046, 2052, 2054, 2055, 2056, 2059, 2061, 2062, - 2065, 2070, 2077, 2084, 2086, 2090 + 302, 308, 314, 330, 355, 357, 360, 364, 369, 376, + 384, 389, 393, 402, 404, 412, 416, 424, 428, 431, + 434, 438, 458, 460, 468, 472, 504, 508, 517, 524, + 537, 544, 546, 558, 571, 578, 583, 589, 595, 604, + 610, 616, 623, 629, 637, 641, 644, 651, 657, 663, + 670, 676, 685, 687, 696, 704, 718, 730, 736, 752, + 761, 771, 781, 786, 793, 800, 810, 816, 822, 826, + 849, 851, 853, 859, 865, 872, 879, 884, 890, 896, + 902, 907, 917, 919, 922, 930, 936, 945, 951, 968, + 970, 975, 979, 984, 989, 995, 999, 1010, 1019, 1028, + 1039, 1061, 1065, 1071, 1077, 1083, 1093, 1103, 1109, 1123, + 1147, 1154, 1168, 1177, 1187, 1197, 1207, 1215, 1236, 1245, + 1254, 1255, 1257, 1264, 1276, 1286, 1294, 1294, 1299, 1304, + 1309, 1314, 1318, 1322, 1325, 1328, 1333, 1345, 1362, 1367, + 1372, 1405, 1415, 1429, 1431, 1432, 1433, 1434, 1435, 1436, + 1437, 1438, 1439, 1440, 1441, 1442, 1448, 1450, 1451, 1454, + 1461, 1473, 1475, 1479, 1483, 1484, 1485, 1486, 1487, 1491, + 1492, 1493, 1494, 1498, 1499, 1506, 1506, 1507, 1507, 1508, + 1510, 1512, 1517, 1521, 1530, 1534, 1539, 1543, 1549, 1559, + 1563, 1566, 1569, 1572, 1577, 1586, 1594, 1600, 1606, 1613, + 1621, 1629, 1638, 1641, 1644, 1645, 1655, 1657, 1658, 1659, + 1662, 1666, 1671, 1677, 1682, 1685, 1688, 1701, 1715, 1719, + 1724, 1728, 1733, 1740, 1753, 1755, 1758, 1762, 1765, 1770, + 1774, 1782, 1797, 1803, 1810, 1823, 1835, 1850, 1854, 1871, + 1876, 1879, 1884, 1906, 1911, 1916, 1922, 1928, 1936, 1944, + 1952, 1959, 1969, 1974, 2004, 2006, 2009, 2016, 2022, 2024, + 2025, 2026, 2029, 2031, 2032, 2035, 2040, 2047, 2054, 2056, + 2060 }; #endif @@ -428,17 +427,17 @@ static const char * const yytname[] = { "$","error","$undefined.","TOK_PPEQ", "ModuleSpecificationFlag","optModuleSpecificationBody","ModuleSpecificationBody", "ModuleSpecificationElement","@1","ImportsDefinition","ImportsBundleSet","ImportsBundle", "ImportsList","ImportsElement","ExportsDefinition","ExportsBody","ExportsElement", -"ValueSetDefinition","DefinedTypeRef","optValueSetBody","ValueSetBody","ValueSetElement", -"DataTypeReference","ParameterArgumentList","ParameterArgumentName","ActualParameterList", -"ActualParameter","optComponentTypeLists","ComponentTypeLists","ComponentType", -"AlternativeTypeLists","AlternativeType","ClassDeclaration","optUnique","ClassFieldList", -"ClassField","optWithSyntax","WithSyntax","@2","WithSyntaxFormat","WithSyntaxFormatToken", -"ExtensionAndException","Type","TypeDeclaration","ComplexTypeReference","ComplexTypeReferenceAmpList", +"ValueSetDefinition","@2","DefinedTypeRef","DataTypeReference","ParameterArgumentList", +"ParameterArgumentName","ActualParameterList","ActualParameter","optComponentTypeLists", +"ComponentTypeLists","ComponentType","AlternativeTypeLists","AlternativeType", +"ClassDeclaration","optUnique","ClassFieldList","ClassField","optWithSyntax", +"WithSyntax","@3","WithSyntaxFormat","WithSyntaxFormatToken","ExtensionAndException", +"Type","TypeDeclaration","ComplexTypeReference","ComplexTypeReferenceAmpList", "ComplexTypeReferenceElement","ClassFieldIdentifier","ClassFieldName","ValueDefinition", -"Value","@3","DefinedValue","RestrictedCharacterStringValue","Opaque","BasicTypeId", +"Value","@4","DefinedValue","RestrictedCharacterStringValue","Opaque","BasicTypeId", "BasicTypeId_UniverationCompatible","BasicType","BasicString","Union","Intersection", "Except","optConstraints","Constraints","SetOfConstraints","ElementSetSpecs", -"ElementSetSpec","ConstraintSubtypeElement","@4","ConstraintRangeSpec","ConstraintSpec", +"ElementSetSpec","ConstraintSubtypeElement","@5","ConstraintRangeSpec","ConstraintSpec", "SingleValue","ContainedSubtype","InnerTypeConstraint","WithComponentsList", "WithComponentsElement","optPresenceConstraint","PresenceConstraint","TableConstraint", "SimpleTableConstraint","ComponentRelationConstraint","AtNotationList","AtNotationElement", @@ -454,29 +453,29 @@ static const short yyr1[] = { 0, 127, 127, 128, 128, 129, 129, 130, 130, 130, 130, 130, 131, 130, 130, 132, 132, 133, 133, 134, 135, 135, 136, 136, 136, 137, 137, 137, 138, 138, 139, - 139, 139, 140, 141, 141, 142, 142, 143, 143, 144, - 144, 145, 145, 145, 145, 146, 146, 147, 147, 147, - 147, 148, 148, 149, 149, 150, 150, 151, 151, 152, - 152, 152, 153, 153, 154, 154, 155, 156, 156, 157, - 157, 158, 158, 158, 159, 159, 161, 160, 162, 162, - 163, 163, 164, 164, 164, 165, 166, 166, 166, 166, - 166, 166, 166, 166, 166, 166, 166, 167, 167, 167, - 167, 167, 167, 168, 168, 169, 170, 171, 171, 172, - 173, 174, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 175, 175, 176, 176, 176, 177, 177, 178, 178, - 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, - 178, 179, 179, 179, 180, 180, 181, 181, 181, 181, - 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, - 182, 182, 183, 183, 184, 185, 185, 186, 186, 187, - 187, 188, 188, 188, 189, 189, 189, 189, 189, 190, - 190, 190, 190, 190, 190, 190, 190, 190, 190, 191, - 190, 192, 192, 192, 192, 193, 193, 194, 194, 194, - 194, 194, 195, 196, 196, 197, 197, 198, 198, 199, - 199, 200, 200, 200, 201, 201, 202, 203, 204, 204, - 205, 205, 206, 206, 207, 207, 208, 208, 209, 209, - 210, 210, 211, 211, 211, 211, 211, 212, 212, 213, - 213, 214, 215, 216, 216, 216, 216, 217, 217, 217, - 218, 218, 219, 220, 220, 221 + 139, 139, 141, 140, 142, 142, 143, 143, 143, 143, + 144, 144, 145, 145, 145, 145, 146, 146, 147, 147, + 148, 148, 149, 149, 150, 150, 150, 151, 151, 152, + 152, 153, 154, 154, 155, 155, 156, 156, 156, 157, + 157, 159, 158, 160, 160, 161, 161, 162, 162, 162, + 163, 164, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 165, 165, 165, 165, 165, 165, 166, 166, + 167, 168, 169, 169, 170, 171, 172, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 173, 173, 174, 174, + 174, 175, 175, 176, 176, 176, 176, 176, 176, 176, + 176, 176, 176, 176, 176, 176, 177, 177, 177, 178, + 178, 179, 179, 179, 179, 179, 179, 179, 179, 179, + 179, 179, 179, 179, 179, 180, 180, 181, 181, 182, + 183, 183, 184, 184, 185, 185, 186, 186, 186, 187, + 187, 187, 187, 187, 188, 188, 188, 188, 188, 188, + 188, 188, 188, 188, 189, 188, 190, 190, 190, 190, + 191, 191, 192, 192, 192, 192, 192, 193, 194, 194, + 195, 195, 196, 196, 197, 197, 198, 198, 198, 199, + 199, 200, 201, 202, 202, 203, 203, 204, 204, 205, + 205, 206, 206, 207, 207, 208, 208, 209, 209, 209, + 209, 209, 210, 210, 211, 211, 212, 213, 214, 214, + 214, 214, 215, 215, 215, 216, 216, 217, 218, 218, + 219 }; static const short yyr2[] = { 0, @@ -485,343 +484,325 @@ static const short yyr2[] = { 0, 2, 2, 0, 1, 1, 2, 1, 1, 1, 1, 1, 0, 3, 1, 3, 2, 1, 2, 4, 1, 3, 1, 3, 1, 3, 3, 2, 1, 3, 1, - 3, 1, 6, 1, 1, 0, 1, 1, 3, 1, - 1, 4, 3, 3, 6, 1, 3, 1, 3, 3, - 3, 1, 3, 1, 1, 0, 1, 1, 3, 3, - 3, 1, 1, 3, 2, 1, 5, 0, 1, 1, - 3, 2, 4, 4, 0, 1, 0, 6, 1, 2, - 1, 1, 1, 3, 3, 3, 1, 4, 4, 4, - 6, 6, 1, 4, 4, 1, 3, 1, 3, 3, - 3, 1, 3, 1, 3, 1, 1, 1, 1, 4, - 3, 0, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 3, 1, 1, 1, 1, 2, 1, 1, - 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, - 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, + 3, 1, 0, 6, 1, 1, 4, 3, 3, 6, + 1, 3, 1, 3, 3, 3, 1, 3, 1, 1, + 0, 1, 1, 3, 3, 3, 1, 1, 3, 2, + 1, 5, 0, 1, 1, 3, 2, 4, 4, 0, + 1, 0, 6, 1, 2, 1, 1, 1, 3, 3, + 3, 1, 4, 4, 4, 6, 6, 1, 4, 4, + 1, 3, 1, 3, 3, 3, 1, 3, 1, 3, + 1, 1, 1, 1, 4, 3, 0, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 2, 2, 1, + 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 0, 1, 1, 4, 3, - 4, 1, 3, 5, 1, 3, 3, 3, 3, 4, - 3, 1, 1, 3, 3, 3, 3, 1, 1, 0, - 5, 1, 2, 2, 3, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 5, 1, 3, 1, 3, 0, - 1, 1, 1, 1, 1, 1, 3, 4, 1, 3, - 2, 3, 1, 3, 0, 1, 1, 2, 2, 3, - 1, 3, 1, 4, 4, 1, 1, 1, 1, 0, - 1, 2, 4, 0, 1, 1, 1, 0, 1, 1, - 1, 1, 1, 0, 1, 1 + 0, 1, 1, 4, 3, 4, 1, 3, 5, 1, + 3, 3, 3, 3, 4, 3, 1, 1, 3, 3, + 3, 3, 1, 1, 0, 5, 1, 2, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, + 1, 3, 1, 3, 0, 1, 1, 1, 1, 1, + 1, 3, 4, 1, 3, 2, 3, 1, 3, 0, + 1, 1, 2, 2, 3, 1, 3, 1, 4, 4, + 1, 1, 1, 1, 0, 1, 2, 4, 0, 1, + 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, + 1 }; static const short yydefact[] = { 0, - 271, 272, 1, 2, 5, 3, 0, 0, 6, 276, + 266, 267, 1, 2, 5, 3, 0, 0, 6, 271, 13, 8, 0, 9, 11, 14, 7, 10, 0, 0, 0, 0, 0, 0, 0, 15, 16, 0, 22, 20, - 18, 21, 19, 0, 17, 12, 23, 167, 0, 0, - 168, 169, 170, 0, 171, 172, 180, 173, 174, 175, - 176, 177, 178, 179, 0, 24, 25, 27, 28, 31, + 18, 21, 19, 0, 17, 12, 23, 162, 0, 0, + 163, 164, 165, 0, 166, 167, 175, 168, 169, 170, + 171, 172, 173, 174, 0, 24, 25, 27, 28, 31, 29, 30, 34, 0, 0, 32, 0, 47, 0, 48, 50, 52, 36, 0, 37, 0, 40, 42, 44, 4, - 26, 260, 118, 273, 0, 149, 0, 0, 163, 156, - 160, 162, 150, 0, 0, 151, 155, 159, 0, 0, - 54, 55, 152, 161, 122, 0, 33, 46, 45, 0, - 0, 35, 38, 0, 0, 0, 0, 264, 64, 63, - 0, 261, 268, 0, 164, 158, 157, 154, 153, 0, - 66, 0, 68, 0, 0, 0, 49, 51, 5, 41, - 43, 0, 266, 267, 265, 0, 118, 273, 113, 0, - 0, 186, 186, 62, 186, 116, 165, 152, 107, 0, - 270, 269, 262, 119, 121, 0, 0, 0, 0, 56, - 128, 129, 123, 124, 126, 120, 137, 144, 138, 258, - 145, 146, 259, 135, 134, 136, 132, 130, 141, 139, - 140, 0, 142, 39, 0, 90, 260, 127, 0, 0, - 0, 0, 0, 76, 0, 0, 187, 188, 76, 0, - 106, 0, 166, 260, 260, 67, 71, 70, 69, 0, - 0, 218, 217, 0, 216, 219, 0, 60, 0, 0, - 0, 57, 58, 221, 61, 195, 0, 202, 203, 209, - 208, 235, 236, 220, 223, 222, 0, 0, 0, 0, - 95, 0, 0, 247, 88, 88, 92, 246, 0, 263, - 0, 103, 0, 83, 86, 260, 117, 0, 0, 0, - 77, 78, 82, 260, 0, 192, 274, 0, 0, 274, - 257, 249, 0, 251, 256, 253, 0, 72, 74, 75, - 65, 0, 0, 212, 0, 0, 0, 0, 0, 0, - 53, 0, 183, 184, 181, 182, 0, 0, 185, 0, - 0, 0, 0, 125, 147, 133, 143, 131, 0, 87, - 96, 91, 248, 89, 245, 245, 114, 0, 108, 0, - 85, 0, 260, 109, 0, 245, 190, 0, 260, 275, - 0, 110, 260, 250, 0, 0, 115, 260, 196, 210, - 213, 214, 207, 205, 224, 0, 237, 201, 59, 197, - 198, 199, 0, 206, 204, 0, 0, 239, 148, 0, - 93, 94, 104, 105, 142, 84, 189, 81, 79, 80, - 193, 0, 191, 0, 252, 0, 0, 73, 0, 215, - 228, 0, 226, 186, 200, 0, 241, 243, 238, 0, - 97, 0, 111, 112, 255, 254, 211, 225, 0, 230, - 242, 0, 240, 0, 194, 227, 233, 234, 232, 229, - 231, 244, 101, 0, 99, 102, 98, 100, 0, 0, - 0 + 26, 255, 113, 268, 0, 144, 0, 0, 158, 151, + 155, 157, 145, 0, 0, 146, 150, 154, 0, 0, + 55, 56, 147, 156, 117, 0, 33, 46, 45, 0, + 0, 35, 38, 0, 0, 0, 0, 259, 59, 58, + 0, 256, 263, 0, 159, 153, 152, 149, 148, 0, + 61, 0, 63, 0, 0, 0, 49, 51, 5, 41, + 43, 0, 261, 262, 260, 0, 113, 268, 108, 0, + 0, 181, 181, 57, 181, 111, 160, 147, 102, 0, + 265, 264, 257, 114, 116, 0, 0, 0, 0, 53, + 123, 124, 118, 119, 121, 115, 132, 139, 133, 253, + 140, 141, 254, 130, 129, 131, 127, 125, 136, 134, + 135, 0, 137, 39, 0, 85, 255, 122, 0, 0, + 0, 0, 0, 71, 0, 0, 182, 183, 71, 0, + 101, 0, 161, 255, 255, 62, 66, 65, 64, 0, + 0, 0, 0, 0, 90, 0, 0, 242, 83, 83, + 87, 241, 0, 258, 0, 98, 0, 78, 81, 255, + 112, 0, 0, 0, 72, 73, 77, 255, 0, 0, + 213, 212, 0, 211, 214, 0, 0, 0, 216, 0, + 187, 190, 0, 197, 198, 204, 203, 230, 231, 215, + 218, 217, 269, 0, 0, 269, 252, 244, 0, 246, + 251, 248, 0, 67, 69, 70, 60, 142, 54, 120, + 128, 138, 126, 0, 82, 91, 86, 243, 84, 240, + 240, 109, 0, 103, 0, 80, 0, 255, 104, 0, + 240, 0, 0, 207, 0, 0, 0, 0, 0, 0, + 185, 178, 179, 176, 177, 0, 0, 0, 180, 0, + 0, 0, 0, 255, 270, 0, 105, 255, 245, 0, + 0, 110, 255, 143, 0, 88, 89, 99, 100, 137, + 79, 184, 76, 74, 75, 191, 205, 208, 209, 202, + 200, 219, 0, 232, 196, 188, 192, 193, 194, 0, + 201, 199, 0, 0, 234, 0, 186, 0, 247, 0, + 0, 68, 92, 0, 210, 223, 0, 221, 181, 0, + 195, 0, 236, 238, 233, 0, 106, 107, 250, 249, + 0, 206, 220, 0, 225, 189, 237, 0, 235, 96, + 0, 94, 97, 222, 228, 229, 227, 224, 226, 239, + 93, 95, 0, 0, 0 }; -static const short yydefgoto[] = { 429, +static const short yydefgoto[] = { 423, 3, 4, 8, 9, 13, 14, 25, 26, 27, 55, 56, 57, 107, 58, 74, 75, 76, 77, 59, 69, - 70, 60, 100, 231, 232, 233, 61, 130, 131, 287, - 288, 270, 271, 272, 263, 264, 119, 325, 195, 196, - 320, 321, 414, 424, 425, 273, 289, 155, 156, 173, - 174, 197, 198, 62, 188, 248, 189, 234, 316, 157, - 103, 159, 104, 307, 308, 310, 206, 207, 208, 275, - 276, 236, 389, 296, 237, 238, 239, 240, 392, 393, - 420, 421, 241, 242, 243, 367, 368, 397, 257, 258, - 213, 283, 284, 244, 259, 122, 123, 146, 163, 245, - 105, 339, 246 + 70, 60, 220, 100, 61, 130, 131, 283, 284, 244, + 245, 246, 237, 238, 119, 300, 195, 196, 295, 296, + 401, 411, 412, 247, 285, 155, 156, 173, 174, 197, + 198, 62, 188, 222, 189, 259, 289, 157, 103, 159, + 104, 327, 328, 330, 206, 207, 208, 260, 261, 262, + 384, 316, 263, 264, 265, 266, 387, 388, 418, 419, + 267, 268, 269, 374, 375, 393, 231, 232, 213, 279, + 280, 270, 233, 122, 123, 146, 163, 271, 105, 334, + 272 }; -static const short yypact[] = { 166, --32768,-32768, 166,-32768, -69,-32768, 32, 14,-32768,-32768, --32768,-32768, 60,-32768, -62, 132,-32768,-32768, 55, 42, - -13, 58, 65, 64, 125, 132,-32768, 96,-32768,-32768, --32768,-32768,-32768, 135,-32768,-32768, 507,-32768, 158, 9, --32768,-32768,-32768, 38,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 122, 507,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 357, 736,-32768, 100,-32768, 80,-32768, - 146,-32768,-32768, 34,-32768, -17,-32768, 147,-32768,-32768, --32768, -4, 140,-32768, 178,-32768, 184, 159,-32768,-32768, --32768,-32768,-32768, 215, 188,-32768,-32768,-32768, 811, 269, --32768,-32768,-32768,-32768, 170, 282,-32768,-32768,-32768, 168, - 180,-32768,-32768, 166, 168, 182, 186, 8,-32768,-32768, - 584,-32768, 44, 168,-32768,-32768,-32768,-32768,-32768, -10, --32768, 189, 191, 198, 225, 465,-32768,-32768, -69,-32768, --32768, 204,-32768,-32768,-32768, 280, -8, 199, 256, 200, - 238, -25, -24,-32768, -44,-32768,-32768, 205,-32768, 206, --32768,-32768,-32768,-32768,-32768, 309, 811, 305, 168, 202, --32768,-32768, 201,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +static const short yypact[] = { 228, +-32768,-32768, 228,-32768, -83,-32768, 30, 43,-32768,-32768, +-32768,-32768, 36,-32768, -14, 181,-32768,-32768, 132, 85, + 68, 73, 109, 95, 193, 181,-32768, 93,-32768,-32768, +-32768,-32768,-32768, 189,-32768,-32768, 429,-32768, 209, 21, +-32768,-32768,-32768, 144,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 184, 429,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 354, 658,-32768, 118,-32768, 190,-32768, + 134,-32768,-32768, 18,-32768, -27,-32768, 156,-32768,-32768, +-32768, -12, 150,-32768, 182,-32768, 204, 195,-32768,-32768, +-32768,-32768,-32768, 236, 212,-32768,-32768,-32768, 733, 299, +-32768,-32768,-32768,-32768, 205, 316,-32768,-32768,-32768, 185, + 216,-32768,-32768, 228, 185, 217, 219, 25,-32768,-32768, + 506,-32768, 117, 185,-32768,-32768,-32768,-32768,-32768, -55, +-32768, 210, 214, 223, 266, 63,-32768,-32768, -83,-32768, +-32768, 268,-32768,-32768,-32768, 321, 34, 226, 295, 232, + 269, -18, -17,-32768, -2,-32768,-32768, 233,-32768, 235, +-32768,-32768,-32768,-32768,-32768, 338, 733, 334, 185,-32768, +-32768,-32768, 234,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768, 207, 208,-32768, 50,-32768, 39,-32768, 209, 290, - 12, 217, 211, 7, 268, 252,-32768, 218, 7, 254, --32768, 53,-32768, 5, 213,-32768,-32768,-32768,-32768, 229, - 303,-32768,-32768, -1,-32768,-32768, 216,-32768, 166, 268, - 226, 224,-32768,-32768, 156, 237, 230, -1,-32768,-32768, --32768, 231,-32768,-32768,-32768,-32768, 204, 336, 305, 465, - 245, 204, 465,-32768, 253, 253,-32768,-32768, 661,-32768, - 305, 233, 81,-32768,-32768, 213,-32768, 268, 276, 241, - 242,-32768,-32768, 213, 243, 68, 305, 268, 247, 305, --32768,-32768, 82,-32768,-32768, 248, 89,-32768,-32768,-32768, --32768, 455, 249, 244, 258, 286, 250, 259, 257, 260, --32768, 202,-32768,-32768,-32768,-32768, 455, 455,-32768, 455, - 268, 448, 251,-32768,-32768, 363,-32768,-32768, 285,-32768, --32768,-32768,-32768,-32768, 0, 0,-32768, 214,-32768, 12, --32768, 264, 213,-32768, 7, 0,-32768, 272, 213,-32768, - 270,-32768, 213,-32768, 67, 214,-32768, 5,-32768,-32768, --32768, 263,-32768,-32768, 218, 19,-32768,-32768,-32768,-32768, --32768,-32768, 271,-32768,-32768, 6, 119,-32768,-32768, 275, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, - 274, 661,-32768, 661,-32768, 278, 279,-32768, 336,-32768, --32768, 127,-32768, -44,-32768, 305, 277,-32768,-32768, 251, --32768, 268,-32768,-32768,-32768,-32768, 363,-32768, 19, 17, - 277, 305,-32768, 149, 156,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 28,-32768,-32768,-32768,-32768, 388, 391, --32768 +-32768, 237, 242,-32768, 81,-32768, 27,-32768, 231, 322, + 11, 240, 247, 49, 238, 285,-32768, 251, 49, 289, +-32768, 44,-32768, 7, 244,-32768,-32768,-32768,-32768, 358, + 268, 358, 334, 63, 267, 268, 63,-32768, 273, 273, +-32768,-32768, 583,-32768, 334, 253, 98,-32768,-32768, 244, +-32768, 238, 302, 270, 263,-32768,-32768, 244, 276, 348, +-32768,-32768, 64,-32768,-32768, 275, 228, 238,-32768, 279, + 130, 283, 277, 64,-32768,-32768,-32768, 272,-32768,-32768, +-32768,-32768, 334, 238, 284, 334,-32768,-32768, 100,-32768, +-32768, 286, 105,-32768,-32768,-32768,-32768,-32768, 379,-32768, + 379,-32768,-32768, 305,-32768,-32768,-32768,-32768,-32768, -10, + -10,-32768, 296,-32768, 11,-32768, 287, 244,-32768, 49, + -10, 264, 293, 280, 288, 174, 292, 297, 301, 300, +-32768,-32768,-32768,-32768,-32768, 306, 264, 264,-32768, 264, + 238, 282, 294, 244,-32768, 303,-32768, 244,-32768, 51, + 296,-32768, 7,-32768, 307,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 304,-32768, +-32768, 251, 28,-32768,-32768, 314,-32768,-32768,-32768, 308, +-32768,-32768, 6, 112,-32768, 583,-32768, 583,-32768, 309, + 317,-32768,-32768, 358,-32768,-32768, 154,-32768, -2, 238, +-32768, 334, 313,-32768,-32768, 294,-32768,-32768,-32768,-32768, + 159, 379,-32768, 28, 24, 215, 313, 334,-32768,-32768, + 12,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768, 413, 427,-32768 }; static const short yypgoto[] = {-32768, --32768, 389, 255,-32768,-32768, 380,-32768,-32768, 370,-32768, --32768, 341,-32768,-32768,-32768, 327,-32768, 289,-32768,-32768, - 300,-32768, 346,-32768,-32768, 110,-32768,-32768, 246,-32768, - 66, 210,-32768, 85,-32768, 86,-32768, 165,-32768, 163, --32768,-32768,-32768,-32768, 3, -189, -73, -186, -54,-32768, - 181, -190, -114,-32768, -47,-32768, -251, -118, 40, -40, - -120,-32768, 33,-32768,-32768,-32768, -150,-32768, 133, -164, - -166, -201,-32768, 193,-32768, -218,-32768,-32768,-32768, 23, --32768,-32768,-32768,-32768,-32768,-32768, 37, 43, -152,-32768, --32768,-32768, 93, -128, -80,-32768,-32768,-32768,-32768, 16, --32768, 154, -7 +-32768, 425, 290,-32768,-32768, 418,-32768,-32768, 408,-32768, +-32768, 380,-32768,-32768,-32768, 361,-32768, 323,-32768,-32768, + 330,-32768,-32768, 386,-32768,-32768, 278,-32768, 101, 243, +-32768, 143,-32768, 151,-32768, 225,-32768, 239,-32768,-32768, +-32768,-32768, 46, -184, -75, -284, -53,-32768, 241, -192, + -115,-32768, -89,-32768, -255, -58, -214, -41, -120,-32768, + 45,-32768,-32768,-32768, -151,-32768, 141, -86, 70, -216, +-32768, 197,-32768, -225,-32768,-32768,-32768, 59,-32768,-32768, +-32768,-32768,-32768,-32768, 71, 72, -111,-32768,-32768,-32768, + 126, -127, -79,-32768,-32768,-32768,-32768, 10,-32768, 192, + -7 }; -#define YYLAST 907 +#define YYLAST 829 static const short yytable[] = { 15, - 158, 121, 210, 235, 211, 15, 256, 191, 120, 101, - 101, 265, 10, 10, 10, 5, 10, 190, 5, 10, - 175, 1, 2, 102, 102, 117, 10, 67, 143, 65, - 114, 423, 72, 417, 253, 7, 79, 203, 269, 10, - 11, 10, 171, 172, 19, 10, 1, 2, 65, 16, - 1, 2, 64, 171, 172, 71, 203, 203, 132, 78, - 10, 180, 205, 28, 183, 300, 79, 10, 11, 63, - 254, 64, 30, 253, 10, 180, 373, 354, 183, 204, - 209, 205, 205, 285, 144, 73, 161, 418, 63, 78, - 349, 419, 115, 365, 386, 166, -271, 162, 145, 167, - 29, 294, 72, 332, 124, 360, 361, 79, 362, 254, - 262, 118, 295, 341, 133, 262, 165, 68, 396, 32, - 118, 191, 391, 255, 191, 71, 132, 34, 193, 139, - 78, 190, 175, 427, 190, 235, 160, 12, 158, 164, - 265, 291, 112, 31, -245, 20, 363, 267, -245, 33, - 176, 192, 423, 21, 118, 251, 281, 37, 282, 252, - 217, 219, 80, 171, 172, 17, 303, 304, 305, 306, - 281, 66, 371, 372, 22, 10, 23, 338, 1, 2, - 1, 2, 133, 380, 218, 24, 329, 344, 109, 110, - 330, 345, 331, 266, 347, 403, 274, 404, 348, 374, - 336, 274, 318, 36, 286, 323, 290, 178, 108, 10, - 180, 181, 182, 183, 1, 2, 285, 387, 171, 172, - 220, 10, 180, 426, 399, 183, 1, 2, 400, 83, - 84, 127, 408, 426, 221, 415, 409, 1, 2, 171, - 172, 317, 193, 410, 299, 193, 297, 298, 222, 223, - 111, 116, 124, 327, 303, 304, 305, 306, 382, 378, - 125, 158, 384, 158, 224, 192, 126, 128, 192, 340, - 129, 134, 340, 178, 160, 10, 180, 181, 182, 183, - 1, 2, 135, 225, 136, 138, 220, 141, 199, 226, - 142, 178, 200, 10, 180, 181, 182, 183, 227, 168, - 221, 169, 170, -272, 201, 228, 229, 202, 230, 212, - 214, 215, 10, 247, 222, 223, 261, 268, 250, 249, - 375, 277, 266, 280, 278, 260, 292, 274, 118, 293, - 224, 301, 222, 302, 309, 313, 311, 286, 375, 315, - 290, 319, 324, 192, 328, 333, 334, 353, 394, 225, - 337, 335, 342, 350, 346, 226, 205, 351, 398, 82, - 352, 192, 357, 356, 227, 366, 369, 358, 370, 83, - 84, 377, 229, 226, 230, 381, 390, 383, 395, 401, - 85, 38, 86, 402, 87, 405, 406, 430, 398, 412, - 431, 6, 18, 194, 88, 35, 81, 160, 89, 160, - 113, 394, 90, 140, 422, 91, 41, 42, 43, 137, - 106, 359, 216, 388, 322, 376, 92, 45, 279, 379, - 326, 93, 46, 94, 47, 95, 428, 314, 407, 355, - 312, 416, 48, 343, 96, 97, 413, 385, 411, 0, - 0, 49, 0, 50, 0, 0, 0, 0, 51, 98, - 52, 53, 54, 178, 0, 10, 180, 181, 182, 183, - 178, 99, 10, 180, 181, 182, 183, 1, 2, 177, - 178, 179, 10, 180, 181, 182, 183, 1, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, - 0, 0, 0, 0, 222, 0, 0, 0, 0, 0, - 0, 222, 223, 0, 0, 0, 0, 0, 0, 364, - 0, 184, 0, 0, 10, 0, 0, 224, 0, 1, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 185, - 0, 38, 0, 0, 0, 226, 225, 0, 0, 0, - 0, 0, 226, 0, 0, 0, 39, 0, 0, 0, - 40, 227, 186, 0, 0, 0, 41, 42, 43, 229, - 0, 230, 44, 0, 0, 0, 0, 45, 0, 187, - 0, 0, 46, 0, 47, 0, 0, 0, 0, 0, - 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, - 0, 49, 0, 50, 0, 0, 147, 148, 51, 0, - 52, 53, 54, 149, 0, 0, 0, 85, 38, 86, - 0, 87, 150, 0, 0, 0, 0, 0, 0, 0, - 0, 88, 0, 0, 0, 89, 0, 0, 0, 90, - 0, 0, 91, 41, 42, 43, 0, 0, 0, 0, - 0, 151, 0, 92, 45, 0, 0, 0, 93, 46, - 94, 47, 95, 0, 0, 0, 0, 0, 0, 48, - 0, 96, 97, 152, 153, 0, 0, 0, 49, 0, - 50, 0, 154, 147, 148, 51, 98, 52, 53, 54, - 149, 0, 0, 0, 85, 38, 86, 0, 87, 150, - 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, - 0, 0, 89, 0, 0, 0, 90, 0, 0, 91, - 41, 42, 43, 0, 0, 0, 0, 0, 151, 0, - 92, 45, 0, 0, 0, 93, 46, 94, 47, 95, - 0, 0, 0, 0, 0, 0, 48, 0, 96, 97, - 152, 153, 0, 0, 0, 49, 0, 50, 83, 84, - 0, 0, 51, 98, 52, 53, 54, 0, 0, 85, - 38, 86, 0, 87, 0, 0, 0, 0, 0, 0, + 158, 210, 121, 211, 230, 15, 120, 291, 191, 5, + 101, 101, 5, 10, 10, 410, 239, 117, 10, 175, + 114, 7, 102, 102, 227, 10, 171, 172, 10, 65, + 1, 2, 72, 1, 2, 10, 79, 10, 11, 67, + 415, 171, 172, 10, 11, 143, 64, 348, 65, 71, + 166, 10, 180, 78, 167, 183, 10, 132, 10, 180, + 228, 227, 183, 203, 203, 64, 79, 177, 178, 179, + 10, 180, 181, 182, 183, 1, 2, 190, 16, 203, + 243, 63, 115, 78, 281, 380, 204, 209, 205, 205, + 361, 397, 19, 398, 416, 356, 191, 228, 417, 191, + 63, 144, 72, 118, 205, 175, 372, 79, 133, 184, + 367, 368, 158, 369, 236, 145, 165, 421, 392, 71, + 239, 229, 118, 139, 78, 132, 112, 185, 193, 68, + 160, 386, -240, 164, 293, 12, -240, 298, -266, 287, + 28, 17, 118, 29, 176, 192, 124, 277, 241, 278, + 186, 10, 236, 30, 277, 307, 1, 2, 31, 161, + 217, 219, 410, 32, 306, 190, 314, 187, 190, 402, + 162, 320, 311, 171, 172, 349, 133, 315, 218, 178, + 33, 10, 180, 181, 182, 183, 225, 336, 346, 347, + 226, 73, 10, 240, 20, 34, 248, 1, 2, 355, + 36, 248, 21, 304, 282, 339, 286, 305, 413, 340, + 342, 37, 281, 381, 343, 292, 193, 395, 413, 193, + 251, 396, 66, 22, 80, 23, 108, 302, 322, 323, + 324, 325, 353, 192, 24, 360, 192, 405, 111, 326, + 1, 2, 160, 178, 370, 10, 180, 181, 182, 183, + 1, 2, 83, 84, 376, 158, 249, 158, 378, 403, + 116, 255, 124, 404, 125, 335, 319, 127, 335, 178, + 250, 10, 180, 181, 182, 183, 1, 2, 1, 2, + 171, 172, 171, 172, 251, 252, 126, 178, 128, 10, + 180, 181, 182, 183, 129, 350, 250, 240, 109, 110, + 253, 134, 248, 10, 180, 317, 318, 183, 1, 2, + 251, 252, 192, 322, 323, 324, 325, 135, 136, 254, + 168, 138, 141, 142, 169, 255, 253, 170, 251, 199, + -267, 200, 282, 350, 256, 286, 201, 212, 202, 214, + 215, 10, 257, 371, 258, 254, 221, 234, 235, 223, + 192, 255, 224, 242, 273, 389, 82, 274, 276, 118, + 256, 288, 299, 294, 303, 394, 83, 84, 257, 255, + 258, 308, 310, 312, 313, 309, 333, 85, 38, 86, + 329, 87, 344, 331, 394, 160, 321, 160, 345, 337, + 359, 88, 341, 358, 352, 89, 389, 357, 205, 90, + 420, 363, 91, 41, 42, 43, 364, 365, 373, 366, + 377, 383, 424, 92, 45, 391, 399, 385, 93, 46, + 94, 47, 95, 390, 400, 408, 425, 6, 194, 48, + 18, 96, 97, 35, 113, 81, 10, 140, 49, 137, + 50, 1, 2, 382, 216, 51, 98, 52, 53, 54, + 106, 275, 354, 38, 301, 351, 422, 362, 99, 406, + 332, 290, 414, 407, 297, 379, 409, 338, 39, 0, + 0, 0, 40, 0, 0, 0, 0, 0, 41, 42, + 43, 0, 0, 0, 44, 0, 0, 0, 0, 45, + 0, 0, 0, 0, 46, 0, 47, 0, 0, 0, + 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, + 0, 0, 0, 49, 0, 50, 0, 0, 147, 148, + 51, 0, 52, 53, 54, 149, 0, 0, 0, 85, + 38, 86, 0, 87, 150, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 90, 0, 0, 91, 41, 42, 43, 0, 0, - 0, 0, 0, 0, 0, 92, 45, 0, 0, 0, + 0, 0, 0, 151, 0, 92, 45, 0, 0, 0, 93, 46, 94, 47, 95, 0, 0, 0, 0, 0, - 0, 48, 0, 96, 97, 0, 0, 0, 0, 0, - 49, 0, 50, 1, 2, 0, 0, 51, 98, 52, - 53, 54, 0, 0, 85, 38, 86, 0, 87, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, - 0, 0, 89, 0, 0, 0, 90, 0, 0, 91, - 41, 42, 43, 0, 0, 0, 0, 0, 0, 0, - 92, 45, 0, 0, 0, 93, 46, 94, 47, 95, - 0, 0, 0, 0, 0, 0, 48, 0, 96, 97, - 0, 0, 0, 0, 0, 49, 0, 50, 0, 0, - 0, 0, 51, 98, 52, 53, 54 + 0, 48, 0, 96, 97, 152, 153, 0, 0, 0, + 49, 0, 50, 0, 154, 147, 148, 51, 98, 52, + 53, 54, 149, 0, 0, 0, 85, 38, 86, 0, + 87, 150, 0, 0, 0, 0, 0, 0, 0, 0, + 88, 0, 0, 0, 89, 0, 0, 0, 90, 0, + 0, 91, 41, 42, 43, 0, 0, 0, 0, 0, + 151, 0, 92, 45, 0, 0, 0, 93, 46, 94, + 47, 95, 0, 0, 0, 0, 0, 0, 48, 0, + 96, 97, 152, 153, 0, 0, 0, 49, 0, 50, + 83, 84, 0, 0, 51, 98, 52, 53, 54, 0, + 0, 85, 38, 86, 0, 87, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 88, 0, 0, 0, 89, + 0, 0, 0, 90, 0, 0, 91, 41, 42, 43, + 0, 0, 0, 0, 0, 0, 0, 92, 45, 0, + 0, 0, 93, 46, 94, 47, 95, 0, 0, 0, + 0, 0, 0, 48, 0, 96, 97, 0, 0, 0, + 0, 0, 49, 0, 50, 1, 2, 0, 0, 51, + 98, 52, 53, 54, 0, 0, 85, 38, 86, 0, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 88, 0, 0, 0, 89, 0, 0, 0, 90, 0, + 0, 91, 41, 42, 43, 0, 0, 0, 0, 0, + 0, 0, 92, 45, 0, 0, 0, 93, 46, 94, + 47, 95, 0, 0, 0, 0, 0, 0, 48, 0, + 96, 97, 0, 0, 0, 0, 0, 49, 0, 50, + 0, 0, 0, 0, 51, 98, 52, 53, 54 }; static const short yycheck[] = { 7, - 121, 82, 153, 170, 155, 13, 197, 136, 82, 64, - 65, 201, 8, 8, 8, 0, 8, 136, 3, 8, - 135, 13, 14, 64, 65, 30, 8, 19, 21, 37, - 48, 4, 40, 17, 35, 105, 44, 82, 32, 8, - 9, 8, 15, 16, 107, 8, 13, 14, 56, 36, - 13, 14, 37, 15, 16, 40, 82, 82, 99, 44, - 8, 9, 107, 9, 12, 230, 74, 8, 9, 37, - 71, 56, 86, 35, 8, 9, 328, 296, 12, 105, - 105, 107, 107, 212, 77, 48, 43, 71, 56, 74, - 292, 75, 110, 312, 346, 106, 105, 54, 91, 110, - 59, 103, 110, 268, 113, 307, 308, 115, 310, 71, - 104, 116, 114, 278, 99, 104, 124, 109, 113, 55, - 116, 250, 104, 197, 253, 110, 167, 3, 136, 114, - 115, 250, 247, 106, 253, 302, 121, 106, 259, 124, - 330, 215, 109, 86, 106, 14, 311, 202, 110, 86, - 135, 136, 4, 22, 116, 106, 104, 23, 106, 110, - 168, 169, 41, 15, 16, 106, 99, 100, 101, 102, - 104, 14, 325, 326, 43, 8, 45, 110, 13, 14, - 13, 14, 167, 336, 169, 54, 106, 106, 109, 110, - 110, 110, 266, 201, 106, 382, 204, 384, 110, 328, - 274, 209, 250, 108, 212, 253, 214, 6, 109, 8, - 9, 10, 11, 12, 13, 14, 345, 346, 15, 16, - 19, 8, 9, 414, 106, 12, 13, 14, 110, 13, - 14, 73, 106, 424, 33, 402, 110, 13, 14, 15, - 16, 249, 250, 394, 229, 253, 31, 32, 47, 48, - 105, 105, 113, 261, 99, 100, 101, 102, 339, 333, - 83, 382, 343, 384, 63, 250, 83, 53, 253, 277, - 83, 3, 280, 6, 259, 8, 9, 10, 11, 12, - 13, 14, 113, 82, 3, 106, 19, 106, 9, 88, - 105, 6, 37, 8, 9, 10, 11, 12, 97, 111, - 33, 111, 105, 105, 105, 104, 105, 70, 107, 105, - 105, 3, 8, 113, 47, 48, 27, 107, 111, 113, - 328, 70, 330, 70, 107, 117, 98, 335, 116, 27, - 63, 106, 47, 110, 98, 105, 107, 345, 346, 4, - 348, 97, 90, 328, 112, 70, 106, 62, 356, 82, - 108, 110, 106, 105, 107, 88, 107, 114, 366, 3, - 103, 346, 106, 105, 97, 115, 4, 108, 84, 13, - 14, 108, 105, 88, 107, 104, 114, 108, 108, 105, - 24, 25, 26, 110, 28, 108, 108, 0, 396, 113, - 0, 3, 13, 139, 38, 26, 56, 382, 42, 384, - 74, 409, 46, 115, 412, 49, 50, 51, 52, 110, - 65, 302, 167, 348, 252, 330, 60, 61, 209, 335, - 256, 65, 66, 67, 68, 69, 424, 247, 389, 297, - 238, 409, 76, 280, 78, 79, 400, 345, 396, -1, - -1, 85, -1, 87, -1, -1, -1, -1, 92, 93, - 94, 95, 96, 6, -1, 8, 9, 10, 11, 12, - 6, 105, 8, 9, 10, 11, 12, 13, 14, 5, - 6, 7, 8, 9, 10, 11, 12, 13, 14, -1, - -1, -1, -1, -1, -1, -1, -1, 33, -1, -1, - -1, -1, -1, -1, 47, -1, -1, -1, -1, -1, - -1, 47, 48, -1, -1, -1, -1, -1, -1, 62, - -1, 47, -1, -1, 8, -1, -1, 63, -1, 13, - 14, -1, -1, -1, -1, -1, -1, -1, -1, 65, - -1, 25, -1, -1, -1, 88, 82, -1, -1, -1, - -1, -1, 88, -1, -1, -1, 40, -1, -1, -1, - 44, 97, 88, -1, -1, -1, 50, 51, 52, 105, - -1, 107, 56, -1, -1, -1, -1, 61, -1, 105, - -1, -1, 66, -1, 68, -1, -1, -1, -1, -1, - -1, -1, 76, -1, -1, -1, -1, -1, -1, -1, - -1, 85, -1, 87, -1, -1, 13, 14, 92, -1, - 94, 95, 96, 20, -1, -1, -1, 24, 25, 26, - -1, 28, 29, -1, -1, -1, -1, -1, -1, -1, - -1, 38, -1, -1, -1, 42, -1, -1, -1, 46, - -1, -1, 49, 50, 51, 52, -1, -1, -1, -1, - -1, 58, -1, 60, 61, -1, -1, -1, 65, 66, - 67, 68, 69, -1, -1, -1, -1, -1, -1, 76, - -1, 78, 79, 80, 81, -1, -1, -1, 85, -1, - 87, -1, 89, 13, 14, 92, 93, 94, 95, 96, - 20, -1, -1, -1, 24, 25, 26, -1, 28, 29, - -1, -1, -1, -1, -1, -1, -1, -1, 38, -1, - -1, -1, 42, -1, -1, -1, 46, -1, -1, 49, - 50, 51, 52, -1, -1, -1, -1, -1, 58, -1, - 60, 61, -1, -1, -1, 65, 66, 67, 68, 69, - -1, -1, -1, -1, -1, -1, 76, -1, 78, 79, - 80, 81, -1, -1, -1, 85, -1, 87, 13, 14, - -1, -1, 92, 93, 94, 95, 96, -1, -1, 24, - 25, 26, -1, 28, -1, -1, -1, -1, -1, -1, + 121, 153, 82, 155, 197, 13, 82, 222, 136, 0, + 64, 65, 3, 8, 8, 4, 201, 30, 8, 135, + 48, 105, 64, 65, 35, 8, 15, 16, 8, 37, + 13, 14, 40, 13, 14, 8, 44, 8, 9, 19, + 17, 15, 16, 8, 9, 21, 37, 303, 56, 40, + 106, 8, 9, 44, 110, 12, 8, 99, 8, 9, + 71, 35, 12, 82, 82, 56, 74, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 136, 36, 82, + 32, 37, 110, 74, 212, 341, 105, 105, 107, 107, + 316, 376, 107, 378, 71, 312, 224, 71, 75, 227, + 56, 77, 110, 116, 107, 221, 332, 115, 99, 47, + 327, 328, 233, 330, 104, 91, 124, 106, 113, 110, + 305, 197, 116, 114, 115, 167, 109, 65, 136, 109, + 121, 104, 106, 124, 224, 106, 110, 227, 105, 215, + 9, 106, 116, 59, 135, 136, 113, 104, 202, 106, + 88, 8, 104, 86, 104, 242, 13, 14, 86, 43, + 168, 169, 4, 55, 240, 224, 103, 105, 227, 384, + 54, 258, 248, 15, 16, 303, 167, 114, 169, 6, + 86, 8, 9, 10, 11, 12, 106, 274, 300, 301, + 110, 48, 8, 201, 14, 3, 204, 13, 14, 311, + 108, 209, 22, 106, 212, 106, 214, 110, 401, 110, + 106, 23, 340, 341, 110, 223, 224, 106, 411, 227, + 47, 110, 14, 43, 41, 45, 109, 235, 99, 100, + 101, 102, 308, 224, 54, 62, 227, 389, 105, 110, + 13, 14, 233, 6, 331, 8, 9, 10, 11, 12, + 13, 14, 13, 14, 334, 376, 19, 378, 338, 106, + 105, 88, 113, 110, 83, 273, 257, 73, 276, 6, + 33, 8, 9, 10, 11, 12, 13, 14, 13, 14, + 15, 16, 15, 16, 47, 48, 83, 6, 53, 8, + 9, 10, 11, 12, 83, 303, 33, 305, 109, 110, + 63, 3, 310, 8, 9, 31, 32, 12, 13, 14, + 47, 48, 303, 99, 100, 101, 102, 113, 3, 82, + 111, 106, 106, 105, 111, 88, 63, 105, 47, 9, + 105, 37, 340, 341, 97, 343, 105, 105, 70, 105, + 3, 8, 105, 62, 107, 82, 113, 117, 27, 113, + 341, 88, 111, 107, 70, 363, 3, 107, 70, 116, + 97, 4, 90, 97, 112, 373, 13, 14, 105, 88, + 107, 70, 110, 98, 27, 106, 105, 24, 25, 26, + 98, 28, 4, 107, 392, 376, 108, 378, 84, 106, + 103, 38, 107, 114, 108, 42, 404, 105, 107, 46, + 408, 105, 49, 50, 51, 52, 106, 108, 115, 104, + 108, 105, 0, 60, 61, 108, 108, 114, 65, 66, + 67, 68, 69, 110, 108, 113, 0, 3, 139, 76, + 13, 78, 79, 26, 74, 56, 8, 115, 85, 110, + 87, 13, 14, 343, 167, 92, 93, 94, 95, 96, + 65, 209, 310, 25, 230, 305, 411, 317, 105, 390, + 264, 221, 404, 392, 226, 340, 396, 276, 40, -1, + -1, -1, 44, -1, -1, -1, -1, -1, 50, 51, + 52, -1, -1, -1, 56, -1, -1, -1, -1, 61, + -1, -1, -1, -1, 66, -1, 68, -1, -1, -1, + -1, -1, -1, -1, 76, -1, -1, -1, -1, -1, + -1, -1, -1, 85, -1, 87, -1, -1, 13, 14, + 92, -1, 94, 95, 96, 20, -1, -1, -1, 24, + 25, 26, -1, 28, 29, -1, -1, -1, -1, -1, -1, -1, -1, 38, -1, -1, -1, 42, -1, -1, -1, 46, -1, -1, 49, 50, 51, 52, -1, -1, - -1, -1, -1, -1, -1, 60, 61, -1, -1, -1, + -1, -1, -1, 58, -1, 60, 61, -1, -1, -1, 65, 66, 67, 68, 69, -1, -1, -1, -1, -1, - -1, 76, -1, 78, 79, -1, -1, -1, -1, -1, - 85, -1, 87, 13, 14, -1, -1, 92, 93, 94, - 95, 96, -1, -1, 24, 25, 26, -1, 28, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 38, -1, - -1, -1, 42, -1, -1, -1, 46, -1, -1, 49, - 50, 51, 52, -1, -1, -1, -1, -1, -1, -1, - 60, 61, -1, -1, -1, 65, 66, 67, 68, 69, - -1, -1, -1, -1, -1, -1, 76, -1, 78, 79, - -1, -1, -1, -1, -1, 85, -1, 87, -1, -1, - -1, -1, 92, 93, 94, 95, 96 + -1, 76, -1, 78, 79, 80, 81, -1, -1, -1, + 85, -1, 87, -1, 89, 13, 14, 92, 93, 94, + 95, 96, 20, -1, -1, -1, 24, 25, 26, -1, + 28, 29, -1, -1, -1, -1, -1, -1, -1, -1, + 38, -1, -1, -1, 42, -1, -1, -1, 46, -1, + -1, 49, 50, 51, 52, -1, -1, -1, -1, -1, + 58, -1, 60, 61, -1, -1, -1, 65, 66, 67, + 68, 69, -1, -1, -1, -1, -1, -1, 76, -1, + 78, 79, 80, 81, -1, -1, -1, 85, -1, 87, + 13, 14, -1, -1, 92, 93, 94, 95, 96, -1, + -1, 24, 25, 26, -1, 28, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 38, -1, -1, -1, 42, + -1, -1, -1, 46, -1, -1, 49, 50, 51, 52, + -1, -1, -1, -1, -1, -1, -1, 60, 61, -1, + -1, -1, 65, 66, 67, 68, 69, -1, -1, -1, + -1, -1, -1, 76, -1, 78, 79, -1, -1, -1, + -1, -1, 85, -1, 87, 13, 14, -1, -1, 92, + 93, 94, 95, 96, -1, -1, 24, 25, 26, -1, + 28, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 38, -1, -1, -1, 42, -1, -1, -1, 46, -1, + -1, 49, 50, 51, 52, -1, -1, -1, -1, -1, + -1, -1, 60, 61, -1, -1, -1, 65, 66, 67, + 68, 69, -1, -1, -1, -1, -1, -1, 76, -1, + 78, 79, -1, -1, -1, -1, -1, 85, -1, 87, + -1, -1, -1, -1, 92, 93, 94, 95, 96 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/share/bison.simple" @@ -1367,13 +1348,13 @@ yyparse(YYPARSE_PARAM_ARG) switch (yyn) { case 1: -#line 306 "asn1p_y.y" +#line 303 "asn1p_y.y" { *(void **)param = yyvsp[0].a_grammar; ; break;} case 2: -#line 312 "asn1p_y.y" +#line 309 "asn1p_y.y" { yyval.a_grammar = asn1p_new(); checkmem(yyval.a_grammar); @@ -1381,14 +1362,14 @@ case 2: ; break;} case 3: -#line 317 "asn1p_y.y" +#line 314 "asn1p_y.y" { yyval.a_grammar = yyvsp[-1].a_grammar; TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); ; break;} case 4: -#line 338 "asn1p_y.y" +#line 335 "asn1p_y.y" { if(yyvsp[-1].a_module) { @@ -1405,27 +1386,27 @@ case 4: ; break;} case 5: -#line 359 "asn1p_y.y" +#line 356 "asn1p_y.y" { yyval.a_oid = 0; ; break;} case 6: -#line 360 "asn1p_y.y" +#line 357 "asn1p_y.y" { yyval.a_oid = yyvsp[0].a_oid; ; break;} case 7: -#line 364 "asn1p_y.y" +#line 361 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; ; break;} case 8: -#line 367 "asn1p_y.y" +#line 364 "asn1p_y.y" { yyval.a_oid = 0; ; break;} case 9: -#line 373 "asn1p_y.y" +#line 370 "asn1p_y.y" { yyval.a_oid = asn1p_oid_new(); asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1434,7 +1415,7 @@ case 9: ; break;} case 10: -#line 379 "asn1p_y.y" +#line 376 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1443,74 +1424,74 @@ case 10: ; break;} case 11: -#line 388 "asn1p_y.y" +#line 385 "asn1p_y.y" { /* iso */ yyval.a_oid_arc.name = yyvsp[0].tv_str; yyval.a_oid_arc.number = -1; ; break;} case 12: -#line 392 "asn1p_y.y" +#line 389 "asn1p_y.y" { /* iso(1) */ yyval.a_oid_arc.name = yyvsp[-3].tv_str; yyval.a_oid_arc.number = yyvsp[-1].a_int; ; break;} case 13: -#line 396 "asn1p_y.y" +#line 393 "asn1p_y.y" { /* 1 */ yyval.a_oid_arc.name = 0; yyval.a_oid_arc.number = yyvsp[0].a_int; ; break;} case 14: -#line 406 "asn1p_y.y" +#line 403 "asn1p_y.y" { yyval.a_module_flags = MSF_NOFLAGS; ; break;} case 15: -#line 407 "asn1p_y.y" +#line 404 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; ; break;} case 16: -#line 416 "asn1p_y.y" +#line 413 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; ; break;} case 17: -#line 419 "asn1p_y.y" +#line 416 "asn1p_y.y" { yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags; ; break;} case 18: -#line 428 "asn1p_y.y" +#line 425 "asn1p_y.y" { yyval.a_module_flags = MSF_EXPLICIT_TAGS; ; break;} case 19: -#line 431 "asn1p_y.y" +#line 428 "asn1p_y.y" { yyval.a_module_flags = MSF_IMPLICIT_TAGS; ; break;} case 20: -#line 434 "asn1p_y.y" +#line 431 "asn1p_y.y" { yyval.a_module_flags = MSF_AUTOMATIC_TAGS; ; break;} case 21: -#line 437 "asn1p_y.y" +#line 434 "asn1p_y.y" { yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED; ; break;} case 22: -#line 441 "asn1p_y.y" +#line 438 "asn1p_y.y" { /* X.680Amd1 specifies TAG and XER */ if(strcmp(yyvsp[-1].tv_str, "TAG") == 0) { @@ -1528,23 +1509,23 @@ case 22: ; break;} case 23: -#line 462 "asn1p_y.y" +#line 459 "asn1p_y.y" { yyval.a_module = 0; ; break;} case 24: -#line 463 "asn1p_y.y" +#line 460 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 25: -#line 472 "asn1p_y.y" +#line 469 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 26: -#line 475 "asn1p_y.y" +#line 472 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; @@ -1574,13 +1555,13 @@ case 26: ; break;} case 27: -#line 508 "asn1p_y.y" +#line 505 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 28: -#line 511 "asn1p_y.y" +#line 508 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1592,7 +1573,7 @@ case 28: ; break;} case 29: -#line 520 "asn1p_y.y" +#line 517 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1602,7 +1583,7 @@ case 29: ; break;} case 30: -#line 527 "asn1p_y.y" +#line 524 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1612,7 +1593,7 @@ case 30: ; break;} case 31: -#line 540 "asn1p_y.y" +#line 537 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1622,11 +1603,11 @@ case 31: ; break;} case 32: -#line 548 "asn1p_y.y" +#line 545 "asn1p_y.y" { asn1p_lexer_hack_push_encoding_control(); ; break;} case 33: -#line 549 "asn1p_y.y" +#line 546 "asn1p_y.y" { fprintf(stderr, "WARNING: ENCODING-CONTROL %s " @@ -1637,7 +1618,7 @@ case 33: ; break;} case 34: -#line 561 "asn1p_y.y" +#line 558 "asn1p_y.y" { return yyerror( "Attempt to redefine a standard basic type, " @@ -1646,19 +1627,19 @@ case 34: ; break;} case 35: -#line 575 "asn1p_y.y" +#line 572 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; ; break;} case 36: -#line 581 "asn1p_y.y" +#line 578 "asn1p_y.y" { return yyerror("Empty IMPORTS list"); ; break;} case 37: -#line 587 "asn1p_y.y" +#line 584 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1666,14 +1647,14 @@ case 37: ; break;} case 38: -#line 592 "asn1p_y.y" +#line 589 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); ; break;} case 39: -#line 599 "asn1p_y.y" +#line 596 "asn1p_y.y" { yyval.a_xports = yyvsp[-3].a_xports; yyval.a_xports->from = yyvsp[-1].tv_str; @@ -1682,7 +1663,7 @@ case 39: ; break;} case 40: -#line 608 "asn1p_y.y" +#line 605 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); @@ -1690,14 +1671,14 @@ case 40: ; break;} case 41: -#line 613 "asn1p_y.y" +#line 610 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} case 42: -#line 620 "asn1p_y.y" +#line 617 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1706,7 +1687,7 @@ case 42: ; break;} case 43: -#line 626 "asn1p_y.y" +#line 623 "asn1p_y.y" { /* Completely equivalent to above */ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1715,7 +1696,7 @@ case 43: ; break;} case 44: -#line 632 "asn1p_y.y" +#line 629 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1724,19 +1705,19 @@ case 44: ; break;} case 45: -#line 641 "asn1p_y.y" +#line 638 "asn1p_y.y" { yyval.a_xports = yyvsp[-1].a_xports; ; break;} case 46: -#line 644 "asn1p_y.y" +#line 641 "asn1p_y.y" { yyval.a_xports = 0; ; break;} case 47: -#line 647 "asn1p_y.y" +#line 644 "asn1p_y.y" { /* Empty EXPORTS clause effectively prohibits export. */ yyval.a_xports = asn1p_xports_new(); @@ -1744,7 +1725,7 @@ case 47: ; break;} case 48: -#line 655 "asn1p_y.y" +#line 652 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); assert(yyval.a_xports); @@ -1752,14 +1733,14 @@ case 48: ; break;} case 49: -#line 660 "asn1p_y.y" +#line 657 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} case 50: -#line 667 "asn1p_y.y" +#line 664 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1768,7 +1749,7 @@ case 50: ; break;} case 51: -#line 673 "asn1p_y.y" +#line 670 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1777,7 +1758,7 @@ case 51: ; break;} case 52: -#line 679 "asn1p_y.y" +#line 676 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1786,17 +1767,21 @@ case 52: ; break;} case 53: -#line 689 "asn1p_y.y" +#line 687 "asn1p_y.y" +{ asn1p_lexer_hack_push_opaque_state(); ; + break;} +case 54: +#line 687 "asn1p_y.y" { yyval.a_expr = yyvsp[-4].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-5].tv_str; yyval.a_expr->meta_type = AMT_VALUESET; - // take care of optValueSetBody + // take care of ValueSet body ; break;} -case 54: -#line 699 "asn1p_y.y" +case 55: +#line 697 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1805,8 +1790,8 @@ case 54: yyval.a_expr->meta_type = AMT_TYPEREF; ; break;} -case 55: -#line 706 "asn1p_y.y" +case 56: +#line 704 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1814,37 +1799,8 @@ case 55: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 56: -#line 715 "asn1p_y.y" -{ ; - break;} case 57: -#line 716 "asn1p_y.y" -{ - ; - break;} -case 58: -#line 727 "asn1p_y.y" -{ - ; - break;} -case 59: -#line 729 "asn1p_y.y" -{ - ; - break;} -case 60: -#line 734 "asn1p_y.y" -{ - ; - break;} -case 61: -#line 736 "asn1p_y.y" -{ - ; - break;} -case 62: -#line 752 "asn1p_y.y" +#line 722 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1854,8 +1810,8 @@ case 62: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 63: -#line 760 "asn1p_y.y" +case 58: +#line 730 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -1863,8 +1819,8 @@ case 63: assert(yyval.a_expr->meta_type); ; break;} -case 64: -#line 766 "asn1p_y.y" +case 59: +#line 736 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -1872,8 +1828,8 @@ case 64: assert(yyval.a_expr->meta_type == AMT_OBJECT); ; break;} -case 65: -#line 782 "asn1p_y.y" +case 60: +#line 752 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1882,8 +1838,8 @@ case 65: yyval.a_expr->meta_type = AMT_PARAMTYPE; ; break;} -case 66: -#line 792 "asn1p_y.y" +case 61: +#line 762 "asn1p_y.y" { int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); @@ -1894,8 +1850,8 @@ case 66: if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument); ; break;} -case 67: -#line 801 "asn1p_y.y" +case 62: +#line 771 "asn1p_y.y" { int ret; yyval.a_plist = yyvsp[-2].a_plist; @@ -1905,15 +1861,15 @@ case 67: if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument); ; break;} -case 68: -#line 812 "asn1p_y.y" +case 63: +#line 782 "asn1p_y.y" { yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} -case 69: -#line 816 "asn1p_y.y" +case 64: +#line 786 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1922,8 +1878,8 @@ case 69: yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} -case 70: -#line 823 "asn1p_y.y" +case 65: +#line 793 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1932,8 +1888,8 @@ case 70: yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} -case 71: -#line 830 "asn1p_y.y" +case 66: +#line 800 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1943,29 +1899,29 @@ case 71: yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} -case 72: -#line 841 "asn1p_y.y" +case 67: +#line 811 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 73: -#line 846 "asn1p_y.y" +case 68: +#line 816 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 74: -#line 853 "asn1p_y.y" +case 69: +#line 823 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} -case 75: -#line 856 "asn1p_y.y" +case 70: +#line 826 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1974,31 +1930,31 @@ case 75: yyval.a_expr->meta_type = AMT_VALUE; ; break;} -case 76: -#line 880 "asn1p_y.y" +case 71: +#line 850 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); ; break;} -case 77: -#line 881 "asn1p_y.y" +case 72: +#line 851 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} -case 78: -#line 884 "asn1p_y.y" +case 73: +#line 854 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 79: -#line 889 "asn1p_y.y" +case 74: +#line 859 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 80: -#line 896 "asn1p_y.y" +case 75: +#line 866 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -2006,8 +1962,8 @@ case 80: yyval.a_expr->marker = yyvsp[0].a_marker; ; break;} -case 81: -#line 902 "asn1p_y.y" +case 76: +#line 872 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2016,43 +1972,43 @@ case 81: asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 82: -#line 909 "asn1p_y.y" +case 77: +#line 879 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} -case 83: -#line 915 "asn1p_y.y" +case 78: +#line 885 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 84: -#line 920 "asn1p_y.y" +case 79: +#line 890 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 85: -#line 927 "asn1p_y.y" +case 80: +#line 897 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-1].tv_str; ; break;} -case 86: -#line 932 "asn1p_y.y" +case 81: +#line 902 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} -case 87: -#line 938 "asn1p_y.y" +case 82: +#line 908 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); @@ -2061,16 +2017,16 @@ case 87: assert(yyval.a_expr->meta_type == AMT_OBJECT); ; break;} -case 88: -#line 948 "asn1p_y.y" +case 83: +#line 918 "asn1p_y.y" { yyval.a_int = 0; ; break;} -case 89: -#line 949 "asn1p_y.y" +case 84: +#line 919 "asn1p_y.y" { yyval.a_int = 1; ; break;} -case 90: -#line 953 "asn1p_y.y" +case 85: +#line 923 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2079,15 +2035,15 @@ case 90: asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 91: -#line 960 "asn1p_y.y" +case 86: +#line 930 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 92: -#line 967 "asn1p_y.y" +case 87: +#line 937 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2097,8 +2053,8 @@ case 92: yyval.a_expr->marker = yyvsp[0].a_marker; ; break;} -case 93: -#line 975 "asn1p_y.y" +case 88: +#line 945 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; yyval.a_expr->Identifier = yyvsp[-3].a_refcomp.name; @@ -2106,8 +2062,8 @@ case 93: yyval.a_expr->unique = yyvsp[-1].a_int; ; break;} -case 94: -#line 981 "asn1p_y.y" +case 89: +#line 951 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2124,48 +2080,48 @@ case 94: yyval.a_expr->unique = yyvsp[-1].a_int; ; break;} -case 95: -#line 999 "asn1p_y.y" +case 90: +#line 969 "asn1p_y.y" { yyval.a_wsynt = 0; ; break;} -case 96: -#line 1000 "asn1p_y.y" +case 91: +#line 970 "asn1p_y.y" { yyval.a_wsynt = yyvsp[0].a_wsynt; ; break;} -case 97: -#line 1007 "asn1p_y.y" +case 92: +#line 977 "asn1p_y.y" { asn1p_lexer_hack_enable_with_syntax(); ; break;} -case 98: -#line 1009 "asn1p_y.y" +case 93: +#line 979 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; ; break;} -case 99: -#line 1015 "asn1p_y.y" +case 94: +#line 985 "asn1p_y.y" { yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} -case 100: -#line 1019 "asn1p_y.y" +case 95: +#line 989 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} -case 101: -#line 1026 "asn1p_y.y" +case 96: +#line 996 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); ; break;} -case 102: -#line 1029 "asn1p_y.y" +case 97: +#line 999 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2176,8 +2132,8 @@ case 102: yyval.a_wchunk = asn1p_wsyntx_chunk_fromref(ref, 0); ; break;} -case 103: -#line 1041 "asn1p_y.y" +case 98: +#line 1011 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2187,8 +2143,8 @@ case 103: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 104: -#line 1049 "asn1p_y.y" +case 99: +#line 1019 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2199,8 +2155,8 @@ case 104: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 105: -#line 1058 "asn1p_y.y" +case 100: +#line 1028 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2211,8 +2167,8 @@ case 105: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 106: -#line 1070 "asn1p_y.y" +case 101: +#line 1040 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; yyval.a_expr->tag = yyvsp[-2].a_tag; @@ -2233,14 +2189,14 @@ case 106: } ; break;} -case 107: -#line 1092 "asn1p_y.y" +case 102: +#line 1062 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} -case 108: -#line 1095 "asn1p_y.y" +case 103: +#line 1065 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2248,8 +2204,8 @@ case 108: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 109: -#line 1101 "asn1p_y.y" +case 104: +#line 1071 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2257,8 +2213,8 @@ case 109: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 110: -#line 1107 "asn1p_y.y" +case 105: +#line 1077 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2266,8 +2222,8 @@ case 110: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 111: -#line 1113 "asn1p_y.y" +case 106: +#line 1083 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2279,8 +2235,8 @@ case 111: asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 112: -#line 1123 "asn1p_y.y" +case 107: +#line 1093 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2292,8 +2248,8 @@ case 112: asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 113: -#line 1133 "asn1p_y.y" +case 108: +#line 1103 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2301,8 +2257,8 @@ case 113: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 114: -#line 1139 "asn1p_y.y" +case 109: +#line 1109 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2315,8 +2271,8 @@ case 114: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 115: -#line 1153 "asn1p_y.y" +case 110: +#line 1123 "asn1p_y.y" { int ret; yyval.a_expr = yyvsp[-1].a_expr; @@ -2332,8 +2288,8 @@ case 115: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 116: -#line 1177 "asn1p_y.y" +case 111: +#line 1147 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2342,8 +2298,8 @@ case 116: yyval.a_expr->meta_type = AMT_TYPEREF; ; break;} -case 117: -#line 1184 "asn1p_y.y" +case 112: +#line 1154 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2352,8 +2308,8 @@ case 117: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 118: -#line 1199 "asn1p_y.y" +case 113: +#line 1169 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2363,8 +2319,8 @@ case 118: free(yyvsp[0].tv_str); ; break;} -case 119: -#line 1207 "asn1p_y.y" +case 114: +#line 1177 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2376,8 +2332,8 @@ case 119: free(yyvsp[-2].tv_str); ; break;} -case 120: -#line 1217 "asn1p_y.y" +case 115: +#line 1187 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2389,8 +2345,8 @@ case 120: free(yyvsp[-2].tv_str); ; break;} -case 121: -#line 1227 "asn1p_y.y" +case 116: +#line 1197 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2402,8 +2358,8 @@ case 121: free(yyvsp[-2].tv_str); ; break;} -case 122: -#line 1237 "asn1p_y.y" +case 117: +#line 1207 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2413,8 +2369,8 @@ case 122: checkmem(ret == 0); ; break;} -case 123: -#line 1245 "asn1p_y.y" +case 118: +#line 1215 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[0].a_ref; @@ -2435,8 +2391,8 @@ case 123: } ; break;} -case 124: -#line 1267 "asn1p_y.y" +case 119: +#line 1237 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2446,8 +2402,8 @@ case 124: checkmem(ret == 0); ; break;} -case 125: -#line 1275 "asn1p_y.y" +case 120: +#line 1245 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[-2].a_ref; @@ -2456,22 +2412,22 @@ case 125: checkmem(ret == 0); ; break;} -case 128: -#line 1289 "asn1p_y.y" +case 123: +#line 1259 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} -case 129: -#line 1294 "asn1p_y.y" +case 124: +#line 1264 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} -case 130: -#line 1307 "asn1p_y.y" +case 125: +#line 1277 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); @@ -2480,8 +2436,8 @@ case 130: yyval.a_expr->value = yyvsp[0].a_value; ; break;} -case 131: -#line 1317 "asn1p_y.y" +case 126: +#line 1287 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2490,76 +2446,76 @@ case 131: yyval.a_value->value.choice_identifier.value = yyvsp[0].a_value; ; break;} -case 132: -#line 1324 "asn1p_y.y" +case 127: +#line 1294 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} -case 133: -#line 1324 "asn1p_y.y" +case 128: +#line 1294 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); yyval.a_value->type = ATV_UNPARSED; ; break;} -case 134: -#line 1329 "asn1p_y.y" +case 129: +#line 1299 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_NULL; ; break;} -case 135: -#line 1334 "asn1p_y.y" +case 130: +#line 1304 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_FALSE; ; break;} -case 136: -#line 1339 "asn1p_y.y" +case 131: +#line 1309 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_TRUE; ; break;} -case 137: -#line 1344 "asn1p_y.y" +case 132: +#line 1314 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); ; break;} -case 138: -#line 1348 "asn1p_y.y" +case 133: +#line 1318 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); ; break;} -case 139: -#line 1352 "asn1p_y.y" +case 134: +#line 1322 "asn1p_y.y" { yyval.a_value = yyval.a_value; ; break;} -case 140: -#line 1355 "asn1p_y.y" +case 135: +#line 1325 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 141: -#line 1358 "asn1p_y.y" +case 136: +#line 1328 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 142: -#line 1364 "asn1p_y.y" +case 137: +#line 1334 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2572,8 +2528,8 @@ case 142: free(yyvsp[0].tv_str); ; break;} -case 143: -#line 1375 "asn1p_y.y" +case 138: +#line 1345 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2589,31 +2545,31 @@ case 143: free(yyvsp[0].tv_str); ; break;} -case 144: -#line 1393 "asn1p_y.y" +case 139: +#line 1363 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} -case 145: -#line 1397 "asn1p_y.y" +case 140: +#line 1367 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); yyval.a_value->type = ATV_TUPLE; ; break;} -case 146: -#line 1402 "asn1p_y.y" +case 141: +#line 1372 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); yyval.a_value->type = ATV_QUADRUPLE; ; break;} -case 147: -#line 1436 "asn1p_y.y" +case 142: +#line 1406 "asn1p_y.y" { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 1; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); @@ -2624,8 +2580,8 @@ case 147: free(yyvsp[0].tv_opaque.buf); ; break;} -case 148: -#line 1445 "asn1p_y.y" +case 143: +#line 1415 "asn1p_y.y" { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); @@ -2639,72 +2595,72 @@ case 148: yyval.tv_opaque.len = newsize; ; break;} -case 149: -#line 1460 "asn1p_y.y" +case 144: +#line 1430 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BOOLEAN; ; break;} -case 150: -#line 1461 "asn1p_y.y" +case 145: +#line 1431 "asn1p_y.y" { yyval.a_type = ASN_BASIC_NULL; ; break;} -case 151: -#line 1462 "asn1p_y.y" +case 146: +#line 1432 "asn1p_y.y" { yyval.a_type = ASN_BASIC_REAL; ; break;} -case 152: -#line 1463 "asn1p_y.y" +case 147: +#line 1433 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} -case 153: -#line 1464 "asn1p_y.y" +case 148: +#line 1434 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OCTET_STRING; ; break;} -case 154: -#line 1465 "asn1p_y.y" +case 149: +#line 1435 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; break;} -case 155: -#line 1466 "asn1p_y.y" +case 150: +#line 1436 "asn1p_y.y" { yyval.a_type = ASN_BASIC_RELATIVE_OID; ; break;} -case 156: -#line 1467 "asn1p_y.y" +case 151: +#line 1437 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EXTERNAL; ; break;} -case 157: -#line 1468 "asn1p_y.y" +case 152: +#line 1438 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; break;} -case 158: -#line 1469 "asn1p_y.y" +case 153: +#line 1439 "asn1p_y.y" { yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; break;} -case 159: -#line 1470 "asn1p_y.y" +case 154: +#line 1440 "asn1p_y.y" { yyval.a_type = ASN_BASIC_UTCTime; ; break;} -case 160: -#line 1471 "asn1p_y.y" +case 155: +#line 1441 "asn1p_y.y" { yyval.a_type = ASN_BASIC_GeneralizedTime; ; break;} -case 161: -#line 1472 "asn1p_y.y" +case 156: +#line 1442 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} -case 162: -#line 1479 "asn1p_y.y" +case 157: +#line 1449 "asn1p_y.y" { yyval.a_type = ASN_BASIC_INTEGER; ; break;} -case 163: -#line 1480 "asn1p_y.y" +case 158: +#line 1450 "asn1p_y.y" { yyval.a_type = ASN_BASIC_ENUMERATED; ; break;} -case 164: -#line 1481 "asn1p_y.y" +case 159: +#line 1451 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BIT_STRING; ; break;} -case 165: -#line 1485 "asn1p_y.y" +case 160: +#line 1455 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2712,8 +2668,8 @@ case 165: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 166: -#line 1491 "asn1p_y.y" +case 161: +#line 1461 "asn1p_y.y" { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; @@ -2725,92 +2681,92 @@ case 166: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 167: -#line 1504 "asn1p_y.y" +case 162: +#line 1474 "asn1p_y.y" { yyval.a_type = ASN_STRING_BMPString; ; break;} -case 168: -#line 1505 "asn1p_y.y" +case 163: +#line 1475 "asn1p_y.y" { yyval.a_type = ASN_STRING_GeneralString; fprintf(stderr, "WARNING: GeneralString is not fully supported\n"); ; break;} -case 169: -#line 1509 "asn1p_y.y" +case 164: +#line 1479 "asn1p_y.y" { yyval.a_type = ASN_STRING_GraphicString; fprintf(stderr, "WARNING: GraphicString is not fully supported\n"); ; break;} -case 170: -#line 1513 "asn1p_y.y" +case 165: +#line 1483 "asn1p_y.y" { yyval.a_type = ASN_STRING_IA5String; ; break;} -case 171: -#line 1514 "asn1p_y.y" +case 166: +#line 1484 "asn1p_y.y" { yyval.a_type = ASN_STRING_ISO646String; ; break;} -case 172: -#line 1515 "asn1p_y.y" +case 167: +#line 1485 "asn1p_y.y" { yyval.a_type = ASN_STRING_NumericString; ; break;} -case 173: -#line 1516 "asn1p_y.y" +case 168: +#line 1486 "asn1p_y.y" { yyval.a_type = ASN_STRING_PrintableString; ; break;} -case 174: -#line 1517 "asn1p_y.y" +case 169: +#line 1487 "asn1p_y.y" { yyval.a_type = ASN_STRING_T61String; fprintf(stderr, "WARNING: T61String is not fully supported\n"); ; break;} -case 175: -#line 1521 "asn1p_y.y" +case 170: +#line 1491 "asn1p_y.y" { yyval.a_type = ASN_STRING_TeletexString; ; break;} -case 176: -#line 1522 "asn1p_y.y" +case 171: +#line 1492 "asn1p_y.y" { yyval.a_type = ASN_STRING_UniversalString; ; break;} -case 177: -#line 1523 "asn1p_y.y" +case 172: +#line 1493 "asn1p_y.y" { yyval.a_type = ASN_STRING_UTF8String; ; break;} -case 178: -#line 1524 "asn1p_y.y" +case 173: +#line 1494 "asn1p_y.y" { yyval.a_type = ASN_STRING_VideotexString; fprintf(stderr, "WARNING: VideotexString is not fully supported\n"); ; break;} -case 179: -#line 1528 "asn1p_y.y" +case 174: +#line 1498 "asn1p_y.y" { yyval.a_type = ASN_STRING_VisibleString; ; break;} -case 180: -#line 1529 "asn1p_y.y" +case 175: +#line 1499 "asn1p_y.y" { yyval.a_type = ASN_STRING_ObjectDescriptor; ; break;} -case 186: -#line 1541 "asn1p_y.y" +case 181: +#line 1511 "asn1p_y.y" { yyval.a_constr = 0; ; break;} -case 187: -#line 1542 "asn1p_y.y" +case 182: +#line 1512 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 188: -#line 1548 "asn1p_y.y" +case 183: +#line 1518 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); ; break;} -case 189: -#line 1551 "asn1p_y.y" +case 184: +#line 1521 "asn1p_y.y" { /* * This is a special case, for compatibility purposes. @@ -2819,26 +2775,26 @@ case 189: CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_SIZE, yyvsp[-1].a_constr, 0); ; break;} -case 190: -#line 1561 "asn1p_y.y" +case 185: +#line 1531 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; ; break;} -case 191: -#line 1564 "asn1p_y.y" +case 186: +#line 1534 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} -case 192: -#line 1570 "asn1p_y.y" +case 187: +#line 1540 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 193: -#line 1573 "asn1p_y.y" +case 188: +#line 1543 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2846,8 +2802,8 @@ case 193: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); ; break;} -case 194: -#line 1579 "asn1p_y.y" +case 189: +#line 1549 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2857,38 +2813,38 @@ case 194: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, ct, yyvsp[0].a_constr); ; break;} -case 195: -#line 1590 "asn1p_y.y" +case 190: +#line 1560 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 196: -#line 1593 "asn1p_y.y" +case 191: +#line 1563 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_AEX, yyvsp[0].a_constr, 0); ; break;} -case 197: -#line 1596 "asn1p_y.y" +case 192: +#line 1566 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 198: -#line 1599 "asn1p_y.y" +case 193: +#line 1569 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 199: -#line 1602 "asn1p_y.y" +case 194: +#line 1572 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 200: -#line 1608 "asn1p_y.y" +case 195: +#line 1578 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2898,8 +2854,8 @@ case 200: checkmem(ret == 0); ; break;} -case 201: -#line 1616 "asn1p_y.y" +case 196: +#line 1586 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2909,8 +2865,8 @@ case 201: checkmem(ret == 0); ; break;} -case 202: -#line 1624 "asn1p_y.y" +case 197: +#line 1594 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2918,8 +2874,8 @@ case 202: yyval.a_constr->value = yyvsp[0].a_value; ; break;} -case 203: -#line 1630 "asn1p_y.y" +case 198: +#line 1600 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2927,8 +2883,8 @@ case 203: yyval.a_constr->containedSubtype = yyvsp[0].a_value; ; break;} -case 204: -#line 1636 "asn1p_y.y" +case 199: +#line 1606 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2937,8 +2893,8 @@ case 204: yyval.a_constr->range_stop = yyvsp[0].a_value; ; break;} -case 205: -#line 1643 "asn1p_y.y" +case 200: +#line 1613 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2948,8 +2904,8 @@ case 205: yyval.a_constr->range_start->type = ATV_MIN; ; break;} -case 206: -#line 1651 "asn1p_y.y" +case 201: +#line 1621 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2959,8 +2915,8 @@ case 206: yyval.a_constr->range_stop->type = ATV_MAX; ; break;} -case 207: -#line 1659 "asn1p_y.y" +case 202: +#line 1629 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2971,24 +2927,24 @@ case 207: yyval.a_constr->range_stop->type = ATV_MAX; ; break;} -case 208: -#line 1668 "asn1p_y.y" +case 203: +#line 1638 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 209: -#line 1671 "asn1p_y.y" +case 204: +#line 1641 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 210: -#line 1675 "asn1p_y.y" +case 205: +#line 1645 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} -case 211: -#line 1675 "asn1p_y.y" +case 206: +#line 1645 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2998,64 +2954,64 @@ case 211: yyval.a_constr->value->type = ATV_UNPARSED; ; break;} -case 212: -#line 1686 "asn1p_y.y" +case 207: +#line 1656 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RANGE; ; break;} -case 213: -#line 1687 "asn1p_y.y" +case 208: +#line 1657 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RLRANGE; ; break;} -case 214: -#line 1688 "asn1p_y.y" +case 209: +#line 1658 "asn1p_y.y" { yyval.a_ctype = ACT_EL_LLRANGE; ; break;} -case 215: -#line 1689 "asn1p_y.y" +case 210: +#line 1659 "asn1p_y.y" { yyval.a_ctype = ACT_EL_ULRANGE; ; break;} -case 216: -#line 1693 "asn1p_y.y" +case 211: +#line 1663 "asn1p_y.y" { yyval.a_ctype = ACT_CT_SIZE; ; break;} -case 217: -#line 1696 "asn1p_y.y" +case 212: +#line 1666 "asn1p_y.y" { yyval.a_ctype = ACT_CT_FROM; ; break;} -case 218: -#line 1702 "asn1p_y.y" +case 213: +#line 1672 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_FALSE; ; break;} -case 219: -#line 1707 "asn1p_y.y" +case 214: +#line 1677 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); yyval.a_value->type = ATV_TRUE; ; break;} -case 220: -#line 1712 "asn1p_y.y" +case 215: +#line 1682 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 221: -#line 1715 "asn1p_y.y" +case 216: +#line 1685 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 222: -#line 1718 "asn1p_y.y" +case 217: +#line 1688 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3068,8 +3024,8 @@ case 222: free(yyvsp[0].tv_str); ; break;} -case 223: -#line 1732 "asn1p_y.y" +case 218: +#line 1702 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3082,32 +3038,32 @@ case 223: free(yyvsp[0].tv_str); ; break;} -case 224: -#line 1746 "asn1p_y.y" +case 219: +#line 1716 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMP, yyvsp[0].a_constr, 0); ; break;} -case 225: -#line 1749 "asn1p_y.y" +case 220: +#line 1719 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); ; break;} -case 226: -#line 1755 "asn1p_y.y" +case 221: +#line 1725 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 227: -#line 1758 "asn1p_y.y" +case 222: +#line 1728 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 228: -#line 1764 "asn1p_y.y" +case 223: +#line 1734 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3115,8 +3071,8 @@ case 228: yyval.a_constr->value = asn1p_value_frombuf("...", 3, 0); ; break;} -case 229: -#line 1770 "asn1p_y.y" +case 224: +#line 1740 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3126,46 +3082,46 @@ case 229: if(yyvsp[-1].a_constr) asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr); ; break;} -case 230: -#line 1784 "asn1p_y.y" +case 225: +#line 1754 "asn1p_y.y" { yyval.a_pres = ACPRES_DEFAULT; ; break;} -case 231: -#line 1785 "asn1p_y.y" +case 226: +#line 1755 "asn1p_y.y" { yyval.a_pres = yyvsp[0].a_pres; ; break;} -case 232: -#line 1789 "asn1p_y.y" +case 227: +#line 1759 "asn1p_y.y" { yyval.a_pres = ACPRES_PRESENT; ; break;} -case 233: -#line 1792 "asn1p_y.y" +case 228: +#line 1762 "asn1p_y.y" { yyval.a_pres = ACPRES_ABSENT; ; break;} -case 234: -#line 1795 "asn1p_y.y" +case 229: +#line 1765 "asn1p_y.y" { yyval.a_pres = ACPRES_OPTIONAL; ; break;} -case 235: -#line 1801 "asn1p_y.y" +case 230: +#line 1771 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 236: -#line 1804 "asn1p_y.y" +case 231: +#line 1774 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 237: -#line 1813 "asn1p_y.y" +case 232: +#line 1783 "asn1p_y.y" { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; @@ -3179,14 +3135,14 @@ case 237: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, ct, 0); ; break;} -case 238: -#line 1828 "asn1p_y.y" +case 233: +#line 1798 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} -case 239: -#line 1834 "asn1p_y.y" +case 234: +#line 1804 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3194,8 +3150,8 @@ case 239: yyval.a_constr->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); ; break;} -case 240: -#line 1840 "asn1p_y.y" +case 235: +#line 1810 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3205,8 +3161,8 @@ case 240: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); ; break;} -case 241: -#line 1854 "asn1p_y.y" +case 236: +#line 1824 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; @@ -3219,8 +3175,8 @@ case 241: free(yyvsp[0].tv_str); ; break;} -case 242: -#line 1865 "asn1p_y.y" +case 237: +#line 1835 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; @@ -3234,14 +3190,14 @@ case 242: free(yyvsp[0].tv_str); ; break;} -case 243: -#line 1881 "asn1p_y.y" +case 238: +#line 1851 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 244: -#line 1884 "asn1p_y.y" +case 239: +#line 1854 "asn1p_y.y" { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); @@ -3252,61 +3208,61 @@ case 244: yyval.tv_str[l1 + 1 + l3] = '\0'; ; break;} -case 245: -#line 1902 "asn1p_y.y" +case 240: +#line 1872 "asn1p_y.y" { yyval.a_marker.flags = EM_NOMARK; yyval.a_marker.default_value = 0; ; break;} -case 246: -#line 1906 "asn1p_y.y" +case 241: +#line 1876 "asn1p_y.y" { yyval.a_marker = yyvsp[0].a_marker; ; break;} -case 247: -#line 1910 "asn1p_y.y" +case 242: +#line 1880 "asn1p_y.y" { yyval.a_marker.flags = EM_OPTIONAL; yyval.a_marker.default_value = 0; ; break;} -case 248: -#line 1914 "asn1p_y.y" +case 243: +#line 1884 "asn1p_y.y" { yyval.a_marker.flags = EM_DEFAULT; yyval.a_marker.default_value = yyvsp[0].a_value; ; break;} -case 249: -#line 1937 "asn1p_y.y" +case 244: +#line 1907 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); ; break;} -case 250: -#line 1941 "asn1p_y.y" +case 245: +#line 1911 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; ; break;} -case 251: -#line 1947 "asn1p_y.y" +case 246: +#line 1917 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 252: -#line 1952 "asn1p_y.y" +case 247: +#line 1922 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 253: -#line 1959 "asn1p_y.y" +case 248: +#line 1929 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3315,8 +3271,8 @@ case 253: yyval.a_expr->Identifier = yyvsp[0].tv_str; ; break;} -case 254: -#line 1966 "asn1p_y.y" +case 249: +#line 1936 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3326,8 +3282,8 @@ case 254: yyval.a_expr->value = yyvsp[-1].a_value; ; break;} -case 255: -#line 1974 "asn1p_y.y" +case 250: +#line 1944 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3337,8 +3293,8 @@ case 255: yyval.a_expr->value = yyvsp[-1].a_value; ; break;} -case 256: -#line 1982 "asn1p_y.y" +case 251: +#line 1952 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3347,8 +3303,8 @@ case 256: yyval.a_expr->value = yyvsp[0].a_value; ; break;} -case 257: -#line 1989 "asn1p_y.y" +case 252: +#line 1959 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3358,103 +3314,103 @@ case 257: yyval.a_expr->meta_type = AMT_VALUE; ; break;} -case 258: -#line 2000 "asn1p_y.y" +case 253: +#line 1970 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} -case 259: -#line 2004 "asn1p_y.y" +case 254: +#line 1974 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} -case 260: -#line 2035 "asn1p_y.y" +case 255: +#line 2005 "asn1p_y.y" { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; break;} -case 261: -#line 2036 "asn1p_y.y" +case 256: +#line 2006 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; ; break;} -case 262: -#line 2040 "asn1p_y.y" +case 257: +#line 2010 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = yyvsp[0].a_tag.tag_mode; ; break;} -case 263: -#line 2047 "asn1p_y.y" +case 258: +#line 2017 "asn1p_y.y" { yyval.a_tag = yyvsp[-2].a_tag; yyval.a_tag.tag_value = yyvsp[-1].a_int; ; break;} -case 264: -#line 2053 "asn1p_y.y" +case 259: +#line 2023 "asn1p_y.y" { yyval.a_tag.tag_class = TC_CONTEXT_SPECIFIC; ; break;} -case 265: -#line 2054 "asn1p_y.y" +case 260: +#line 2024 "asn1p_y.y" { yyval.a_tag.tag_class = TC_UNIVERSAL; ; break;} -case 266: -#line 2055 "asn1p_y.y" +case 261: +#line 2025 "asn1p_y.y" { yyval.a_tag.tag_class = TC_APPLICATION; ; break;} -case 267: -#line 2056 "asn1p_y.y" +case 262: +#line 2026 "asn1p_y.y" { yyval.a_tag.tag_class = TC_PRIVATE; ; break;} -case 268: -#line 2060 "asn1p_y.y" +case 263: +#line 2030 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_DEFAULT; ; break;} -case 269: -#line 2061 "asn1p_y.y" +case 264: +#line 2031 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_IMPLICIT; ; break;} -case 270: -#line 2062 "asn1p_y.y" +case 265: +#line 2032 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_EXPLICIT; ; break;} -case 271: -#line 2066 "asn1p_y.y" +case 266: +#line 2036 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 272: -#line 2070 "asn1p_y.y" +case 267: +#line 2040 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 273: -#line 2078 "asn1p_y.y" +case 268: +#line 2048 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 274: -#line 2085 "asn1p_y.y" +case 269: +#line 2055 "asn1p_y.y" { yyval.tv_str = 0; ; break;} -case 275: -#line 2086 "asn1p_y.y" +case 270: +#line 2056 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 276: -#line 2091 "asn1p_y.y" +case 271: +#line 2061 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; @@ -3682,7 +3638,7 @@ case 276: } return 1; } -#line 2097 "asn1p_y.y" +#line 2067 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index a4842e250..da06b4cf3 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -234,9 +234,6 @@ static asn1p_value_t * %type DefinedTypeRef %type ValueSetDefinition /* Val INTEGER ::= {1|2} */ %type ValueDefinition /* val INTEGER ::= 1*/ -%type optValueSetBody -%type ValueSetBody -%type ValueSetElement %type Value %type DefinedValue %type SignedNumber @@ -686,12 +683,13 @@ ExportsElement: ValueSetDefinition: - TypeRefName DefinedTypeRef TOK_PPEQ '{' optValueSetBody '}' { + TypeRefName DefinedTypeRef TOK_PPEQ + '{' { asn1p_lexer_hack_push_opaque_state(); } Opaque /* '}' */ { $$ = $2; assert($$->Identifier == 0); $$->Identifier = $1; $$->meta_type = AMT_VALUESET; - // take care of optValueSetBody + // take care of ValueSet body } ; @@ -711,40 +709,12 @@ DefinedTypeRef: } ; -optValueSetBody: - { } - | ValueSetBody { - } - ; - -/* - * X.680 does not permit ElementSetSpecs starting with ellipsis, - * i.e. (..., A, B). This is very strange: the ElementSetSpecs is used - * inside ValueSet, and ValueSets "in the wild" tend to have the first - * ellipsis. - */ -ValueSetBody: - ValueSetElement { - } - | ValueSetBody ',' ValueSetElement { - } - ; - -ValueSetElement: - TOK_ThreeDots { - } - | ElementSetSpec { - } - ; - - /* * Data Type Reference. * === EXAMPLE === * Type3 ::= CHOICE { a Type1, b Type 2 } * === EOF === */ - DataTypeReference: /* * Optionally tagged type definition. From 481c8ede9d23380d7a3d22ee446112d92af40457 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 31 Mar 2005 21:52:53 +0000 Subject: [PATCH 0853/1469] uniform constraints checking git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@853 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/42-real-life-OK.asn1.-PR | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index af71d814c..279e5dc2f 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -58,9 +58,8 @@ memb_varsets_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, } if((size >= 1)) { - /* SEQUENCE validation code is the same as SET */ /* Perform validation of the inner elements */ - return SET_OF_constraint(td, list, app_errlog, app_key); + return td->check_constraints(td, sptr, app_errlog, app_key); } else { _ASN_ERRLOG(app_errlog, app_key, "%s: constraint failed (%s:%d)", @@ -397,7 +396,7 @@ memb_vset_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, if((size >= 1)) { /* Perform validation of the inner elements */ - return SET_OF_constraint(td, list, app_errlog, app_key); + return td->check_constraints(td, sptr, app_errlog, app_key); } else { _ASN_ERRLOG(app_errlog, app_key, "%s: constraint failed (%s:%d)", From 70034ced0d830364c7378982f66b970a595bd3dd Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 4 Apr 2005 21:10:06 +0000 Subject: [PATCH 0854/1469] highlight optionality git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@854 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OBJECT_IDENTIFIER.c | 6 +++--- skeletons/OBJECT_IDENTIFIER.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index 7c9c980f7..0c16bfddf 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -652,7 +652,7 @@ OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, unsigned int ar int OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length, - long *arcs, unsigned int arcs_slots, const char **oid_text_end) { + long *arcs, unsigned int arcs_slots, const char **opt_oid_text_end) { unsigned int arcs_count = 0; const char *oid_end; long value = 0; @@ -663,7 +663,7 @@ OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length, } state = ST_SKIPSPACE; if(!oid_text || oid_txt_length < -1 || (arcs_slots && !arcs)) { - if(oid_text_end) *oid_text_end = oid_text; + if(opt_oid_text_end) *opt_oid_text_end = oid_text; errno = EINVAL; return -1; } @@ -715,7 +715,7 @@ OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length, } /* for() */ - if(oid_text_end) *oid_text_end = oid_text; + if(opt_oid_text_end) *opt_oid_text_end = oid_text; /* Finalize last arc */ switch(state) { diff --git a/skeletons/OBJECT_IDENTIFIER.h b/skeletons/OBJECT_IDENTIFIER.h index e32ecefc4..c1c9e2cf9 100644 --- a/skeletons/OBJECT_IDENTIFIER.h +++ b/skeletons/OBJECT_IDENTIFIER.h @@ -105,8 +105,8 @@ ssize_t OBJECT_IDENTIFIER__dump_arc(uint8_t *arcbuf, int arclen, int add, * If (oid_txt_length == -1), the strlen() will be invoked to determine the * size of the (oid_text) string. * - * After return, the optional (oid_text_end) is set to the character after - * the last parsed one. (oid_text_end) is never less than (oid_text). + * After return, the optional (opt_oid_text_end) is set to the character after + * the last parsed one. (opt_oid_text_end) is never less than (oid_text). * * RETURN VALUES: * -1: Parse error. @@ -117,7 +117,7 @@ ssize_t OBJECT_IDENTIFIER__dump_arc(uint8_t *arcbuf, int arclen, int add, * This is useful for (_arc_slots) value estimation. */ int OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length, - long arcs[], unsigned int arcs_slots, const char **oid_text_end); + long arcs[], unsigned int arcs_slots, const char **opt_oid_text_end); /* * Internal functions. From 86912f0bd3a7d631f2398b5d58af8a3d8e335278 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 5 Apr 2005 08:46:22 +0000 Subject: [PATCH 0855/1469] vendor -> author git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@855 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_l.c | 2 +- libasn1parser/asn1p_l.l | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libasn1parser/asn1p_l.c b/libasn1parser/asn1p_l.c index 858ee6aa9..8fabc2425 100644 --- a/libasn1parser/asn1p_l.c +++ b/libasn1parser/asn1p_l.c @@ -4020,7 +4020,7 @@ asn1p_atoi(char *ptr) { if(errno == ERANGE) { fprintf(stderr, "Value \"%s\" at line %d is too large " - "for this compiler! Please contact the vendor.", + "for this compiler! Please contact the asn1c author.\n", ptr, yylineno); errno = ERANGE; /* Restore potentially clobbered errno */ } diff --git a/libasn1parser/asn1p_l.l b/libasn1parser/asn1p_l.l index 458d66546..b37010450 100644 --- a/libasn1parser/asn1p_l.l +++ b/libasn1parser/asn1p_l.l @@ -595,7 +595,7 @@ asn1p_atoi(char *ptr) { if(errno == ERANGE) { fprintf(stderr, "Value \"%s\" at line %d is too large " - "for this compiler! Please contact the vendor.", + "for this compiler! Please contact the asn1c author.\n", ptr, yylineno); errno = ERANGE; /* Restore potentially clobbered errno */ } From 34818584d6d1a2c18b0ac78d04c017d03cc80330 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 8 Apr 2005 04:36:06 +0000 Subject: [PATCH 0856/1469] TL is really optional git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@856 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/enber.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/asn1c/enber.c b/asn1c/enber.c index 75286f353..4e3825126 100644 --- a/asn1c/enber.c +++ b/asn1c/enber.c @@ -167,15 +167,15 @@ process_line(const char *fname, char *line, int lineno) { char buf[32]; char *op; /* '<' */ char *cl; /* '>' */ - char *tcl_pos; /* tag class position */ - char *tl_pos; - char *v_pos; + char *tcl_pos; /* tag class (T=") position */ + char *tl_pos; /* tag length (TL=") position */ + char *v_pos; /* value length (V=") position */ int constr; ber_tlv_tag_t tag_value; ber_tlv_tag_t tag_class; ber_tlv_tag_t tlv_tag; ber_tlv_len_t tlv_len; - ber_tlv_len_t tl_len; + ber_tlv_len_t opt_tl_len; /* optional TL length */ ssize_t ret; (void)fname; @@ -250,20 +250,20 @@ process_line(const char *fname, char *line, int lineno) { tcl_pos = strstr(op, "T=\"["); tl_pos = strstr(op, "TL=\""); v_pos = strstr(op, "V=\""); - if(!tcl_pos || !tl_pos || (!v_pos && constr != 2)) { + if(!tcl_pos || (!v_pos && constr != 2)) { fprintf(stderr, "%s: Mandatory attribute %s is not found at line %d\n", - fname, (!tcl_pos)?"T":((!v_pos)?"V":"TL"), lineno); + fname, (!tcl_pos)?"T":"V", lineno); exit(EX_DATAERR); } errno = 0; - tl_len = strtoul(tl_pos + 4, 0, 10); + opt_tl_len = tl_pos ? strtoul(tl_pos + 4, 0, 10) : 0; if(constr == 2) { tlv_len = 0; } else { tlv_len = strtoul(v_pos + 3, 0, 10); } - if(errno || tl_len < 2 || tlv_len < 0) { + if(errno || (opt_tl_len && opt_tl_len < 2) || tlv_len < 0) { fprintf(stderr, "%s: Invalid TL or V value at line %d\n", fname, lineno); exit(EX_DATAERR); @@ -316,14 +316,14 @@ process_line(const char *fname, char *line, int lineno) { buf + ret, sizeof(buf) - ret); assert(ret >= 2 && (size_t)ret < sizeof(buf)); } - if(ret != tl_len) { + if(opt_tl_len && ret != opt_tl_len) { fprintf(stderr, "%s: Cannot encode TL at line %d " "in the given number of bytes (%ld!=%ld)\n", - fname, lineno, (long)ret, (long)tl_len); + fname, lineno, (long)ret, (long)opt_tl_len); exit(EX_DATAERR); } if(constr) *buf |= 0x20; /* Enable "constructed" bit */ - fwrite(buf, 1, tl_len, stdout); + fwrite(buf, 1, ret, stdout); if(!constr) { ber_tlv_len_t len; From 4b7adae1579cd35f3e875d69aca82ac192e47939 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 8 Apr 2005 04:43:06 +0000 Subject: [PATCH 0857/1469] ASN_DECODER_TEMPLATE is used explicitly git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@857 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.PKIX1/Makefile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index 9a046468f..c625ed8c5 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -363,8 +363,9 @@ Attribute.c: regenerate.Makefile @touch Attribute.c make -$(TARGET).o: ../../skeletons/asn-decoder-template.c - $(CC) $(CFLAGS) -o $(TARGET).o -c $< +ASN_DECODER_TEMPLATE=../../skeletons/asn-decoder-template.c +$(TARGET).o: $(ASN_DECODER_TEMPLATE) + $(CC) $(CFLAGS) -o $(TARGET).o -c $(ASN_DECODER_TEMPLATE) distclean: clean rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) From a38de5a4efd17924a41085ff3e44c05f68ff63ca Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 8 Apr 2005 04:45:36 +0000 Subject: [PATCH 0858/1469] regenerated git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@858 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.TAP3/Makefile | 747 +++++++++++++++++---------- 1 file changed, 470 insertions(+), 277 deletions(-) diff --git a/examples/sample.source.TAP3/Makefile b/examples/sample.source.TAP3/Makefile index b6a6c9a5e..3914c7a41 100644 --- a/examples/sample.source.TAP3/Makefile +++ b/examples/sample.source.TAP3/Makefile @@ -1,4 +1,6 @@ ASN_MODULE_SOURCES= \ + DateTime.c \ + LocalTimeStamp.c \ DataInterChange.c \ TransferBatch.c \ Notification.c \ @@ -7,307 +9,401 @@ ASN_MODULE_SOURCES= \ BatchControlInfo.c \ AccountingInfo.c \ NetworkInfo.c \ - MessageDescriptionInfoList.c \ + VasInfo.c \ + MessageDescriptionInfo.c \ MobileOriginatedCall.c \ MobileTerminatedCall.c \ SupplServiceEvent.c \ ServiceCentreUsage.c \ + ValueAddedService.c \ GprsCall.c \ ContentTransaction.c \ LocationService.c \ AuditControlInfo.c \ + ThreeGCamelDestination.c \ AccessPointNameNI.c \ AccessPointNameOI.c \ - ActualDeliveryTimeStamp.c \ + AccessPointName.c \ + AiurRequested.c \ + BasicHSCSDParameters.c \ AddressStringDigits.c \ - AdvisedCharge.c \ - AdvisedChargeCurrency.c \ - AdvisedChargeInformation.c \ AgeOfLocation.c \ BasicService.c \ BasicServiceCode.c \ BasicServiceCodeList.c \ - BasicServiceUsed.c \ BasicServiceUsedList.c \ + BasicServiceUsed.c \ BearerServiceCode.c \ - CalledNumber.c \ + CalledNumAnalysis.c \ + CalledNumAnalysisCode.c \ + CalledNumAnalysisList.c \ + CallOriginator.c \ CalledPlace.c \ - CalledRegion.c \ CallEventDetailsCount.c \ CallEventStartTimeStamp.c \ - CallingNumber.c \ - CallOriginator.c \ CallReference.c \ + CalledRegion.c \ + CallType.c \ + CallTypeSubtype.c \ CallTypeGroup.c \ CallTypeLevel1.c \ CallTypeLevel2.c \ CallTypeLevel3.c \ - CamelDestinationNumber.c \ - CamelInvocationFee.c \ + CalledCountryCode.c \ + CamelCallReference.c \ + CamelCallReferenceNumber.c \ + CamelDestination.c \ + CamelInitiatedCFIndicator.c \ + CamelModification.c \ + CamelServerAddress.c \ + CamelModificationList.c \ CamelServiceKey.c \ CamelServiceLevel.c \ CamelServiceUsed.c \ CauseForTerm.c \ CellId.c \ + ChannelCoding.c \ + ChannelCodingsAcceptable.c \ Charge.c \ - ChargeableSubscriber.c \ - ChargeableUnits.c \ ChargeDetail.c \ ChargeDetailList.c \ - ChargeDetailTimeStamp.c \ + ChargeableSubscriber.c \ + ChargeableUnits.c \ ChargedItem.c \ - ChargedPartyEquipment.c \ - ChargedPartyHomeIdentification.c \ - ChargedPartyHomeIdList.c \ - ChargedPartyIdentification.c \ - ChargedPartyIdentifier.c \ - ChargedPartyIdList.c \ - ChargedPartyIdType.c \ - ChargedPartyInformation.c \ - ChargedPartyLocation.c \ - ChargedPartyLocationList.c \ ChargedPartyStatus.c \ ChargedUnits.c \ ChargeInformation.c \ ChargeInformationList.c \ - ChargeRefundIndicator.c \ ChargeType.c \ + ChargingCharacteristics.c \ ChargingId.c \ ChargingPoint.c \ ChargingTimeStamp.c \ ClirIndicator.c \ - Commission.c \ CompletionTimeStamp.c \ - ContentChargingPoint.c \ - ContentProvider.c \ - ContentProviderIdentifier.c \ - ContentProviderIdList.c \ ContentProviderIdType.c \ - ContentProviderName.c \ - ContentServiceUsed.c \ - ContentServiceUsedList.c \ - ContentTransactionBasicInfo.c \ - ContentTransactionCode.c \ - ContentTransactionType.c \ + ContentProviderIdentifier.c \ + CountryCode.c \ + CountryCodeTable.c \ CseInformation.c \ CurrencyConversion.c \ - CurrencyConversionList.c \ - CustomerIdentifier.c \ CustomerIdType.c \ + CustomerIdentifier.c \ DataVolume.c \ DataVolumeIncoming.c \ DataVolumeOutgoing.c \ - DateTime.c \ + DataVolumeReference.c \ DateTimeLong.c \ + DayCategory.c \ + DayCategorySubtype.c \ DefaultCallHandlingIndicator.c \ DepositTimeStamp.c \ Destination.c \ DestinationNetwork.c \ DialledDigits.c \ - Discount.c \ - DiscountableAmount.c \ - DiscountApplied.c \ DiscountCode.c \ - DiscountInformation.c \ - Discounting.c \ - DiscountingList.c \ DiscountRate.c \ DiscountValue.c \ + DiscountApplied.c \ + DiscountDefinition.c \ + Discounting.c \ + DiscountInformation.c \ + DiscountInformationList.c \ DistanceChargeBandCode.c \ + DualServiceCode.c \ + DualBearerServiceCode.c \ + DualTeleServiceCode.c \ EarliestCallTimeStamp.c \ - EquipmentId.c \ - EquipmentIdType.c \ + EquipmentInformation.c \ Esn.c \ ExchangeRate.c \ ExchangeRateCode.c \ + ExchangeRateDefinition.c \ FileAvailableTimeStamp.c \ FileCreationTimeStamp.c \ FileSequenceNumber.c \ FileTypeIndicator.c \ - FixedDiscountValue.c \ Fnur.c \ + FraudMonitorIndicator.c \ GeographicalLocation.c \ GprsBasicCallInformation.c \ GprsChargeableSubscriber.c \ GprsDestination.c \ GprsLocationInformation.c \ GprsNetworkLocation.c \ + GprsServiceUsage.c \ + GprsServiceUsageList.c \ GprsServiceUsed.c \ GsmChargeableSubscriber.c \ - GuaranteedBitRate.c \ + GsnAddress.c \ HomeBid.c \ - HomeIdentifier.c \ - HomeIdType.c \ - HomeLocationDescription.c \ HomeLocationInformation.c \ HorizontalAccuracyDelivered.c \ HorizontalAccuracyRequested.c \ - HSCSDIndicator.c \ + HSCSDInformation.c \ + HSCSDParameterModification.c \ + HSCSDParameterModificationList.c \ + Iac.c \ + IacTable.c \ Imei.c \ ImeiOrEsn.c \ Imsi.c \ - IMSSignallingContext.c \ - InternetServiceProvider.c \ - InternetServiceProviderIdList.c \ - IspIdentifier.c \ - IspIdType.c \ + InitiatingParty.c \ ISPList.c \ - NetworkIdType.c \ - NetworkIdentifier.c \ - Network.c \ - NetworkList.c \ + IpAddress.c \ + IPTextV4Address.c \ + IPTextV6Address.c \ LatestCallTimeStamp.c \ + Latitude.c \ + LocalCurrency.c \ + LocationArea.c \ + LocationDescription.c \ + LocationInformation.c \ + Longitude.c \ LCSQosDelivered.c \ LCSQosRequested.c \ LCSRequestTimestamp.c \ - LCSSPIdentification.c \ - LCSSPIdentificationList.c \ LCSSPInformation.c \ + LCSSPIdentificationList.c \ + LCSSPIdentification.c \ LCSTransactionStatus.c \ - LocalCurrency.c \ - LocalTimeStamp.c \ - LocationArea.c \ - LocationDescription.c \ - LocationIdentifier.c \ - LocationIdType.c \ - LocationInformation.c \ LocationServiceUsage.c \ - MaximumBitRate.c \ Mdn.c \ - MessageDescription.c \ + MinChargeableSubscriber.c \ MessageDescriptionCode.c \ - MessageDescriptionInformation.c \ + MessageDescription.c \ + MessageDescriptionDefinition.c \ MessageStatus.c \ MessageType.c \ Min.c \ - MinChargeableSubscriber.c \ MoBasicCallInformation.c \ + MobileStationClassMark.c \ + ModificationIndicator.c \ + ModificationTimestamp.c \ + MscId.c \ Msisdn.c \ MtBasicCallInformation.c \ - NetworkAccessIdentifier.c \ + MultiRateIndicator.c \ NetworkId.c \ - NetworkInitPDPContext.c \ NetworkLocation.c \ - NonChargedNumber.c \ + NetworkInitPDPContext.c \ + NetworkType.c \ + NonChargedParty.c \ NumberOfDecimalPlaces.c \ + NumberingPlan.c \ + NumberOfChannels.c \ ObjectType.c \ - OperatorSpecInfoList.c \ OperatorSpecInformation.c \ - OrderPlacedTimeStamp.c \ + OperatorSpecInfoList.c \ OriginatingNetwork.c \ PacketDataProtocolAddress.c \ - PaidIndicator.c \ PartialTypeIndicator.c \ - PaymentMethod.c \ PdpAddress.c \ PDPContextStartTimestamp.c \ + PdpType.c \ PlmnId.c \ PositioningMethod.c \ PriorityCode.c \ + QoSInformation.c \ + QoSDelay.c \ + QoSGuaranteedBitRateDownlink.c \ + QoSGuaranteedBitRateUplink.c \ + QoSMeanThroughput.c \ + QoSPeakThroughput.c \ + QoSPrecedence.c \ + QoSReliability.c \ + RadioChannelRequested.c \ + RadioChannelUsed.c \ + QoSAllocRetenPriority.c \ + QoSDeliveryOrder.c \ + QoSErroneousSDUs.c \ + QoSHandlingpriority.c \ + QoSMaxBitRate.c \ + QoSMaxBitRateUplink.c \ + QoSMaxBitRateDownlink.c \ + QoSMaxSDUsize.c \ + QoSResidualBER.c \ + QoSSDUErrorRatio.c \ + QoSTrafficClass.c \ + QoSTransferDelay.c \ + GSMQoSRequested.c \ + GSMQoSUsed.c \ + QoSRequestedV37.c \ + QoSUsedV37.c \ + QoSRequestedV38.c \ + QoSUsedV38.c \ + UMTSQoSInformation.c \ + UMTSQoSRequested.c \ + UMTSQoSUsed.c \ + UserProtocolIndicator.c \ RapFileSequenceNumber.c \ + Recipient.c \ + RecEntityDefinition.c \ RecEntityCode.c \ RecEntityCodeList.c \ - RecEntityId.c \ - RecEntityInfoList.c \ - RecEntityInformation.c \ RecEntityType.c \ - Recipient.c \ + RecEntityId.c \ + RecEntityTable.c \ ReleaseVersionNumber.c \ - RequestedDeliveryTimeStamp.c \ + RemotePdpAddressList.c \ ResponseTime.c \ ResponseTimeCategory.c \ ScuBasicInformation.c \ ScuChargeType.c \ ScuTimeStamps.c \ - ScuChargeableSubscriber.c \ + ScuVasChargeableSubscriber.c \ Sender.c \ + ServiceCentreIdentity.c \ ServingBid.c \ - ServingLocationDescription.c \ ServingNetwork.c \ - ServingPartiesInformation.c \ SimChargeableSubscriber.c \ SimToolkitIndicator.c \ - SMSDestinationNumber.c \ - SMSOriginator.c \ SpecificationVersionNumber.c \ + SpeechVersionRequested.c \ + SpeechVersionUsed.c \ + SpeechVersion.c \ SsParameters.c \ + SupplServiceUsed.c \ + SupplServiceUsedList.c \ SupplServiceActionCode.c \ SupplServiceCode.c \ - SupplServiceUsed.c \ TapCurrency.c \ - TapDecimalPlaces.c \ - TaxableAmount.c \ Taxation.c \ - TaxationList.c \ TaxCode.c \ + TapDecimalPlaces.c \ TaxInformation.c \ TaxInformationList.c \ + TaxValue10.c \ TaxRate.c \ + TaxableAmount.c \ + TaxRateDefinition.c \ TaxType.c \ - TaxValue.c \ TeleServiceCode.c \ ThirdPartyInformation.c \ - ThirdPartyNumber.c \ - ThreeGcamelDestination.c \ - TotalAdvisedCharge.c \ - TotalAdvisedChargeRefund.c \ - TotalAdvisedChargeValue.c \ - TotalAdvisedChargeValueList.c \ + TimeBand.c \ + TimeBandSubtype.c \ + TotalChargeValue.c \ TotalCallEventDuration.c \ - TotalCharge.c \ - TotalChargeRefund.c \ - TotalCommission.c \ - TotalCommissionRefund.c \ - TotalDataVolume.c \ - TotalDiscountRefund.c \ + TotalChargeValueList.c \ TotalDiscountValue.c \ - TotalTaxRefund.c \ TotalTaxValue.c \ - TotalTransactionDuration.c \ - TrackedCustomerEquipment.c \ - TrackedCustomerHomeId.c \ - TrackedCustomerHomeIdList.c \ - TrackedCustomerIdentification.c \ - TrackedCustomerIdList.c \ TrackedCustomerInformation.c \ - TrackedCustomerLocation.c \ + TrackedCustomerIdList.c \ + TrackedCustomerIdentification.c \ + TrackedCustomerHomeIdList.c \ + TrackedCustomerHomeId.c \ + HomeIdentifier.c \ TrackedCustomerLocList.c \ - TrackingCustomerEquipment.c \ - TrackingCustomerHomeId.c \ - TrackingCustomerHomeIdList.c \ - TrackingCustomerIdentification.c \ - TrackingCustomerIdList.c \ + TrackedCustomerLocation.c \ + TrackedCustomerEquipment.c \ TrackingCustomerInformation.c \ - TrackingCustomerLocation.c \ + TrackingCustomerIdList.c \ + TrackingCustomerIdentification.c \ + TrackingCustomerHomeIdList.c \ + TrackingCustomerHomeId.c \ TrackingCustomerLocList.c \ + TrackingCustomerLocation.c \ + TrackingCustomerEquipment.c \ TrackingFrequency.c \ TrackingPeriod.c \ - TransactionAuthCode.c \ - TransactionDescriptionSupp.c \ - TransactionDetailDescription.c \ - TransactionIdentifier.c \ - TransactionShortDescription.c \ - TransactionStatus.c \ TransferCutOffTimeStamp.c \ TransparencyIndicator.c \ - UserProtocolIndicator.c \ + TypeOfControllingNode.c \ + TypeOfNumber.c \ UtcTimeOffset.c \ UtcTimeOffsetCode.c \ + UtcTimeOffsetDefinition.c \ UtcTimeOffsetInfo.c \ - UtcTimeOffsetInfoList.c \ + ValueAddedServiceUsedList.c \ + ValueAddedServiceUsed.c \ + VasCode.c \ + VasDefinition.c \ + VasDescription.c \ + VasShortDescription.c \ VerticalAccuracyDelivered.c \ VerticalAccuracyRequested.c \ AbsoluteAmount.c \ Bid.c \ Code.c \ + Currency.c \ AsciiString.c \ + Description.c \ + TapHexString.c \ + PercentageRate.c \ BCDString.c \ - Currency.c \ - HexString.c \ - NumberString.c \ - PercentageRate.c + OrderPlacementTimeStamp.c \ + RequestedDeliveryTimeStamp.c \ + ActualDeliveryTimeStamp.c \ + TransactionStatus.c \ + ContentTransactionBasicInfo.c \ + ChargedPartyIdType.c \ + LoginName.c \ + AccountNumber.c \ + EmailAddress.c \ + ChargedPartyIdentification.c \ + ChargedPartyId.c \ + ChargedPartyIdList.c \ + HomeIdType.c \ + Name.c \ + ChargedPartyHomeId.c \ + ChargedPartyHomeIdList.c \ + LocationIdType.c \ + LocationIdentifier.c \ + CountryName.c \ + CountryAsciCode.c \ + TapRegion.c \ + Place.c \ + ChargedPartyLocation.c \ + ChargedPartyLocationList.c \ + EquipmentIdType.c \ + EquipmentId.c \ + ChargedPartyEquipment.c \ + ChargedPartyInformation.c \ + ProviderIdType.c \ + Url.c \ + ProviderId.c \ + ContentProviderId.c \ + ContentProviderIdList.c \ + InternetServiceProviderId.c \ + InternetServiceProviderIdList.c \ + NetworkIdType.c \ + NetworkDesc.c \ + NetworkIdentifier.c \ + NetworkIdGroup.c \ + NetworkIdList.c \ + ContentProviderName.c \ + ServingPartiesInformation.c \ + ContentTransactionCode.c \ + ContentTransactionType.c \ + TransactionDescriptionSupp.c \ + TransactionDetailDescription.c \ + TransactionShortDescription.c \ + TransactionIdentifier.c \ + TransactionAuthCode.c \ + TotalDataVolume.c \ + ChargeRefundIndicator.c \ + ContentChargingPoint.c \ + PaidIndicator.c \ + PaymentMethod.c \ + AdvisedChargeCurrency.c \ + AdvisedCharge.c \ + Commission.c \ + AdvisedChargeInformation.c \ + ContentServiceUsed.c \ + ContentServiceUsedList.c \ + TotalTaxRefund.c \ + TotalDiscountRefund.c \ + TotalChargeRefund.c \ + TotalAdvisedCharge.c \ + TotalAdvisedChargeRefund.c \ + TotalCommission.c \ + TotalCommissionRefund.c \ + TotalAdvisedChargeValue.c \ + TotalAdvisedChargeValueList.c ASN_MODULE_HEADERS= \ + DateTime.h \ + LocalTimeStamp.h \ DataInterChange.h \ TransferBatch.h \ Notification.h \ @@ -316,308 +412,404 @@ ASN_MODULE_HEADERS= \ BatchControlInfo.h \ AccountingInfo.h \ NetworkInfo.h \ - MessageDescriptionInfoList.h \ + VasInfo.h \ + MessageDescriptionInfo.h \ MobileOriginatedCall.h \ MobileTerminatedCall.h \ SupplServiceEvent.h \ ServiceCentreUsage.h \ + ValueAddedService.h \ GprsCall.h \ ContentTransaction.h \ LocationService.h \ AuditControlInfo.h \ + ThreeGCamelDestination.h \ AccessPointNameNI.h \ AccessPointNameOI.h \ - ActualDeliveryTimeStamp.h \ + AccessPointName.h \ + AiurRequested.h \ + BasicHSCSDParameters.h \ AddressStringDigits.h \ - AdvisedCharge.h \ - AdvisedChargeCurrency.h \ - AdvisedChargeInformation.h \ AgeOfLocation.h \ BasicService.h \ BasicServiceCode.h \ BasicServiceCodeList.h \ - BasicServiceUsed.h \ BasicServiceUsedList.h \ + BasicServiceUsed.h \ BearerServiceCode.h \ - CalledNumber.h \ + CalledNumAnalysis.h \ + CalledNumAnalysisCode.h \ + CalledNumAnalysisList.h \ + CallOriginator.h \ CalledPlace.h \ - CalledRegion.h \ CallEventDetailsCount.h \ CallEventStartTimeStamp.h \ - CallingNumber.h \ - CallOriginator.h \ CallReference.h \ + CalledRegion.h \ + CallType.h \ + CallTypeSubtype.h \ CallTypeGroup.h \ CallTypeLevel1.h \ CallTypeLevel2.h \ CallTypeLevel3.h \ - CamelDestinationNumber.h \ - CamelInvocationFee.h \ + CalledCountryCode.h \ + CamelCallReference.h \ + CamelCallReferenceNumber.h \ + CamelDestination.h \ + CamelInitiatedCFIndicator.h \ + CamelModification.h \ + CamelServerAddress.h \ + CamelModificationList.h \ CamelServiceKey.h \ CamelServiceLevel.h \ CamelServiceUsed.h \ CauseForTerm.h \ CellId.h \ + ChannelCoding.h \ + ChannelCodingsAcceptable.h \ Charge.h \ - ChargeableSubscriber.h \ - ChargeableUnits.h \ ChargeDetail.h \ ChargeDetailList.h \ - ChargeDetailTimeStamp.h \ + ChargeableSubscriber.h \ + ChargeableUnits.h \ ChargedItem.h \ - ChargedPartyEquipment.h \ - ChargedPartyHomeIdentification.h \ - ChargedPartyHomeIdList.h \ - ChargedPartyIdentification.h \ - ChargedPartyIdentifier.h \ - ChargedPartyIdList.h \ - ChargedPartyIdType.h \ - ChargedPartyInformation.h \ - ChargedPartyLocation.h \ - ChargedPartyLocationList.h \ ChargedPartyStatus.h \ ChargedUnits.h \ ChargeInformation.h \ ChargeInformationList.h \ - ChargeRefundIndicator.h \ ChargeType.h \ + ChargingCharacteristics.h \ ChargingId.h \ ChargingPoint.h \ ChargingTimeStamp.h \ ClirIndicator.h \ - Commission.h \ CompletionTimeStamp.h \ - ContentChargingPoint.h \ - ContentProvider.h \ - ContentProviderIdentifier.h \ - ContentProviderIdList.h \ ContentProviderIdType.h \ - ContentProviderName.h \ - ContentServiceUsed.h \ - ContentServiceUsedList.h \ - ContentTransactionBasicInfo.h \ - ContentTransactionCode.h \ - ContentTransactionType.h \ + ContentProviderIdentifier.h \ + CountryCode.h \ + CountryCodeTable.h \ CseInformation.h \ CurrencyConversion.h \ - CurrencyConversionList.h \ - CustomerIdentifier.h \ CustomerIdType.h \ + CustomerIdentifier.h \ DataVolume.h \ DataVolumeIncoming.h \ DataVolumeOutgoing.h \ - DateTime.h \ + DataVolumeReference.h \ DateTimeLong.h \ + DayCategory.h \ + DayCategorySubtype.h \ DefaultCallHandlingIndicator.h \ DepositTimeStamp.h \ Destination.h \ DestinationNetwork.h \ DialledDigits.h \ - Discount.h \ - DiscountableAmount.h \ - DiscountApplied.h \ DiscountCode.h \ - DiscountInformation.h \ - Discounting.h \ - DiscountingList.h \ DiscountRate.h \ DiscountValue.h \ + DiscountApplied.h \ + DiscountDefinition.h \ + Discounting.h \ + DiscountInformation.h \ + DiscountInformationList.h \ DistanceChargeBandCode.h \ + DualServiceCode.h \ + DualBearerServiceCode.h \ + DualTeleServiceCode.h \ EarliestCallTimeStamp.h \ - EquipmentId.h \ - EquipmentIdType.h \ + EquipmentInformation.h \ Esn.h \ ExchangeRate.h \ ExchangeRateCode.h \ + ExchangeRateDefinition.h \ FileAvailableTimeStamp.h \ FileCreationTimeStamp.h \ FileSequenceNumber.h \ FileTypeIndicator.h \ - FixedDiscountValue.h \ Fnur.h \ + FraudMonitorIndicator.h \ GeographicalLocation.h \ GprsBasicCallInformation.h \ GprsChargeableSubscriber.h \ GprsDestination.h \ GprsLocationInformation.h \ GprsNetworkLocation.h \ + GprsServiceUsage.h \ + GprsServiceUsageList.h \ GprsServiceUsed.h \ GsmChargeableSubscriber.h \ - GuaranteedBitRate.h \ + GsnAddress.h \ HomeBid.h \ - HomeIdentifier.h \ - HomeIdType.h \ - HomeLocationDescription.h \ HomeLocationInformation.h \ HorizontalAccuracyDelivered.h \ HorizontalAccuracyRequested.h \ - HSCSDIndicator.h \ + HSCSDInformation.h \ + HSCSDParameterModification.h \ + HSCSDParameterModificationList.h \ + Iac.h \ + IacTable.h \ Imei.h \ ImeiOrEsn.h \ Imsi.h \ - IMSSignallingContext.h \ - InternetServiceProvider.h \ - InternetServiceProviderIdList.h \ - IspIdentifier.h \ - IspIdType.h \ + InitiatingParty.h \ ISPList.h \ - NetworkIdType.h \ - NetworkIdentifier.h \ - Network.h \ - NetworkList.h \ + IpAddress.h \ + IPTextV4Address.h \ + IPTextV6Address.h \ LatestCallTimeStamp.h \ + Latitude.h \ + LocalCurrency.h \ + LocationArea.h \ + LocationDescription.h \ + LocationInformation.h \ + Longitude.h \ LCSQosDelivered.h \ LCSQosRequested.h \ LCSRequestTimestamp.h \ - LCSSPIdentification.h \ - LCSSPIdentificationList.h \ LCSSPInformation.h \ + LCSSPIdentificationList.h \ + LCSSPIdentification.h \ LCSTransactionStatus.h \ - LocalCurrency.h \ - LocalTimeStamp.h \ - LocationArea.h \ - LocationDescription.h \ - LocationIdentifier.h \ - LocationIdType.h \ - LocationInformation.h \ LocationServiceUsage.h \ - MaximumBitRate.h \ Mdn.h \ - MessageDescription.h \ + MinChargeableSubscriber.h \ MessageDescriptionCode.h \ - MessageDescriptionInformation.h \ + MessageDescription.h \ + MessageDescriptionDefinition.h \ MessageStatus.h \ MessageType.h \ Min.h \ - MinChargeableSubscriber.h \ MoBasicCallInformation.h \ + MobileStationClassMark.h \ + ModificationIndicator.h \ + ModificationTimestamp.h \ + MscId.h \ Msisdn.h \ MtBasicCallInformation.h \ - NetworkAccessIdentifier.h \ + MultiRateIndicator.h \ NetworkId.h \ - NetworkInitPDPContext.h \ NetworkLocation.h \ - NonChargedNumber.h \ + NetworkInitPDPContext.h \ + NetworkType.h \ + NonChargedParty.h \ NumberOfDecimalPlaces.h \ + NumberingPlan.h \ + NumberOfChannels.h \ ObjectType.h \ - OperatorSpecInfoList.h \ OperatorSpecInformation.h \ - OrderPlacedTimeStamp.h \ + OperatorSpecInfoList.h \ OriginatingNetwork.h \ PacketDataProtocolAddress.h \ - PaidIndicator.h \ PartialTypeIndicator.h \ - PaymentMethod.h \ PdpAddress.h \ PDPContextStartTimestamp.h \ + PdpType.h \ PlmnId.h \ PositioningMethod.h \ PriorityCode.h \ + QoSInformation.h \ + QoSDelay.h \ + QoSGuaranteedBitRateDownlink.h \ + QoSGuaranteedBitRateUplink.h \ + QoSMeanThroughput.h \ + QoSPeakThroughput.h \ + QoSPrecedence.h \ + QoSReliability.h \ + RadioChannelRequested.h \ + RadioChannelUsed.h \ + QoSAllocRetenPriority.h \ + QoSDeliveryOrder.h \ + QoSErroneousSDUs.h \ + QoSHandlingpriority.h \ + QoSMaxBitRate.h \ + QoSMaxBitRateUplink.h \ + QoSMaxBitRateDownlink.h \ + QoSMaxSDUsize.h \ + QoSResidualBER.h \ + QoSSDUErrorRatio.h \ + QoSTrafficClass.h \ + QoSTransferDelay.h \ + GSMQoSRequested.h \ + GSMQoSUsed.h \ + QoSRequestedV37.h \ + QoSUsedV37.h \ + QoSRequestedV38.h \ + QoSUsedV38.h \ + UMTSQoSInformation.h \ + UMTSQoSRequested.h \ + UMTSQoSUsed.h \ + UserProtocolIndicator.h \ RapFileSequenceNumber.h \ + Recipient.h \ + RecEntityDefinition.h \ RecEntityCode.h \ RecEntityCodeList.h \ - RecEntityId.h \ - RecEntityInfoList.h \ - RecEntityInformation.h \ RecEntityType.h \ - Recipient.h \ + RecEntityId.h \ + RecEntityTable.h \ ReleaseVersionNumber.h \ - RequestedDeliveryTimeStamp.h \ + RemotePdpAddressList.h \ ResponseTime.h \ ResponseTimeCategory.h \ ScuBasicInformation.h \ ScuChargeType.h \ ScuTimeStamps.h \ - ScuChargeableSubscriber.h \ + ScuVasChargeableSubscriber.h \ Sender.h \ + ServiceCentreIdentity.h \ ServingBid.h \ - ServingLocationDescription.h \ ServingNetwork.h \ - ServingPartiesInformation.h \ SimChargeableSubscriber.h \ SimToolkitIndicator.h \ - SMSDestinationNumber.h \ - SMSOriginator.h \ SpecificationVersionNumber.h \ + SpeechVersionRequested.h \ + SpeechVersionUsed.h \ + SpeechVersion.h \ SsParameters.h \ + SupplServiceUsed.h \ + SupplServiceUsedList.h \ SupplServiceActionCode.h \ SupplServiceCode.h \ - SupplServiceUsed.h \ TapCurrency.h \ - TapDecimalPlaces.h \ - TaxableAmount.h \ Taxation.h \ - TaxationList.h \ TaxCode.h \ + TapDecimalPlaces.h \ TaxInformation.h \ TaxInformationList.h \ + TaxValue10.h \ TaxRate.h \ + TaxableAmount.h \ + TaxRateDefinition.h \ TaxType.h \ - TaxValue.h \ TeleServiceCode.h \ ThirdPartyInformation.h \ - ThirdPartyNumber.h \ - ThreeGcamelDestination.h \ - TotalAdvisedCharge.h \ - TotalAdvisedChargeRefund.h \ - TotalAdvisedChargeValue.h \ - TotalAdvisedChargeValueList.h \ + TimeBand.h \ + TimeBandSubtype.h \ + TotalChargeValue.h \ TotalCallEventDuration.h \ - TotalCharge.h \ - TotalChargeRefund.h \ - TotalCommission.h \ - TotalCommissionRefund.h \ - TotalDataVolume.h \ - TotalDiscountRefund.h \ + TotalChargeValueList.h \ TotalDiscountValue.h \ - TotalTaxRefund.h \ TotalTaxValue.h \ - TotalTransactionDuration.h \ - TrackedCustomerEquipment.h \ - TrackedCustomerHomeId.h \ - TrackedCustomerHomeIdList.h \ - TrackedCustomerIdentification.h \ - TrackedCustomerIdList.h \ TrackedCustomerInformation.h \ - TrackedCustomerLocation.h \ + TrackedCustomerIdList.h \ + TrackedCustomerIdentification.h \ + TrackedCustomerHomeIdList.h \ + TrackedCustomerHomeId.h \ + HomeIdentifier.h \ TrackedCustomerLocList.h \ - TrackingCustomerEquipment.h \ - TrackingCustomerHomeId.h \ - TrackingCustomerHomeIdList.h \ - TrackingCustomerIdentification.h \ - TrackingCustomerIdList.h \ + TrackedCustomerLocation.h \ + TrackedCustomerEquipment.h \ TrackingCustomerInformation.h \ - TrackingCustomerLocation.h \ + TrackingCustomerIdList.h \ + TrackingCustomerIdentification.h \ + TrackingCustomerHomeIdList.h \ + TrackingCustomerHomeId.h \ TrackingCustomerLocList.h \ + TrackingCustomerLocation.h \ + TrackingCustomerEquipment.h \ TrackingFrequency.h \ TrackingPeriod.h \ - TransactionAuthCode.h \ - TransactionDescriptionSupp.h \ - TransactionDetailDescription.h \ - TransactionIdentifier.h \ - TransactionShortDescription.h \ - TransactionStatus.h \ TransferCutOffTimeStamp.h \ TransparencyIndicator.h \ - UserProtocolIndicator.h \ + TypeOfControllingNode.h \ + TypeOfNumber.h \ UtcTimeOffset.h \ UtcTimeOffsetCode.h \ + UtcTimeOffsetDefinition.h \ UtcTimeOffsetInfo.h \ - UtcTimeOffsetInfoList.h \ + ValueAddedServiceUsedList.h \ + ValueAddedServiceUsed.h \ + VasCode.h \ + VasDefinition.h \ + VasDescription.h \ + VasShortDescription.h \ VerticalAccuracyDelivered.h \ VerticalAccuracyRequested.h \ AbsoluteAmount.h \ Bid.h \ Code.h \ + Currency.h \ AsciiString.h \ + Description.h \ + TapHexString.h \ + PercentageRate.h \ BCDString.h \ - Currency.h \ - HexString.h \ - NumberString.h \ - PercentageRate.h + OrderPlacementTimeStamp.h \ + RequestedDeliveryTimeStamp.h \ + ActualDeliveryTimeStamp.h \ + TransactionStatus.h \ + ContentTransactionBasicInfo.h \ + ChargedPartyIdType.h \ + LoginName.h \ + AccountNumber.h \ + EmailAddress.h \ + ChargedPartyIdentification.h \ + ChargedPartyId.h \ + ChargedPartyIdList.h \ + HomeIdType.h \ + Name.h \ + ChargedPartyHomeId.h \ + ChargedPartyHomeIdList.h \ + LocationIdType.h \ + LocationIdentifier.h \ + CountryName.h \ + CountryAsciCode.h \ + TapRegion.h \ + Place.h \ + ChargedPartyLocation.h \ + ChargedPartyLocationList.h \ + EquipmentIdType.h \ + EquipmentId.h \ + ChargedPartyEquipment.h \ + ChargedPartyInformation.h \ + ProviderIdType.h \ + Url.h \ + ProviderId.h \ + ContentProviderId.h \ + ContentProviderIdList.h \ + InternetServiceProviderId.h \ + InternetServiceProviderIdList.h \ + NetworkIdType.h \ + NetworkDesc.h \ + NetworkIdentifier.h \ + NetworkIdGroup.h \ + NetworkIdList.h \ + ContentProviderName.h \ + ServingPartiesInformation.h \ + ContentTransactionCode.h \ + ContentTransactionType.h \ + TransactionDescriptionSupp.h \ + TransactionDetailDescription.h \ + TransactionShortDescription.h \ + TransactionIdentifier.h \ + TransactionAuthCode.h \ + TotalDataVolume.h \ + ChargeRefundIndicator.h \ + ContentChargingPoint.h \ + PaidIndicator.h \ + PaymentMethod.h \ + AdvisedChargeCurrency.h \ + AdvisedCharge.h \ + Commission.h \ + AdvisedChargeInformation.h \ + ContentServiceUsed.h \ + ContentServiceUsedList.h \ + TotalTaxRefund.h \ + TotalDiscountRefund.h \ + TotalChargeRefund.h \ + TotalAdvisedCharge.h \ + TotalAdvisedChargeRefund.h \ + TotalCommission.h \ + TotalCommissionRefund.h \ + TotalAdvisedChargeValue.h \ + TotalAdvisedChargeValueList.h ASN_MODULE_HEADERS+=INTEGER.h ASN_MODULE_SOURCES+=INTEGER.c +ASN_MODULE_HEADERS+=NumericString.h +ASN_MODULE_SOURCES+=NumericString.c +ASN_MODULE_HEADERS+=VisibleString.h +ASN_MODULE_SOURCES+=VisibleString.c ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h ASN_MODULE_SOURCES+=asn_SEQUENCE_OF.c ASN_MODULE_HEADERS+=asn_SET_OF.h @@ -687,21 +879,22 @@ clean: regen: regenerate-from-asn1-source regenerate-from-asn1-source: - ../../asn1c/asn1c -S ../../skeletons ../tap3.asn1 + ../../asn1c/asn1c -S ../../skeletons ../tap310-m.asn -../tap3.asn1: +../tap310-m.asn: @echo The ../tap3.asn1 file is not yet present. @echo Please read the README file on how to obtain this file. @exit 42 -DataInterChange.c: ../tap3.asn1 regenerate.Makefile +DataInterChange.c: ../tap310-m.asn regenerate.Makefile ./regenerate.Makefile @touch DataInterChange.c make -$(TARGET).o: ../../skeletons/asn-decoder-template.c - $(CC) $(CFLAGS) -o $(TARGET).o -c $< +ASN_DECODER_TEMPLATE=../../skeletons/asn-decoder-template.c +$(TARGET).o: $(ASN_DECODER_TEMPLATE) + $(CC) $(CFLAGS) -o $(TARGET).o -c $(ASN_DECODER_TEMPLATE) distclean: clean rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) From 42f9ee4177e23f3d9f51a8638f996d56d05dd3e3 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 8 Apr 2005 04:46:57 +0000 Subject: [PATCH 0859/1469] oops git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@859 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.TAP3/Makefile | 742 ++++++++++----------------- 1 file changed, 275 insertions(+), 467 deletions(-) diff --git a/examples/sample.source.TAP3/Makefile b/examples/sample.source.TAP3/Makefile index 3914c7a41..fcc51262d 100644 --- a/examples/sample.source.TAP3/Makefile +++ b/examples/sample.source.TAP3/Makefile @@ -1,6 +1,4 @@ ASN_MODULE_SOURCES= \ - DateTime.c \ - LocalTimeStamp.c \ DataInterChange.c \ TransferBatch.c \ Notification.c \ @@ -9,401 +7,307 @@ ASN_MODULE_SOURCES= \ BatchControlInfo.c \ AccountingInfo.c \ NetworkInfo.c \ - VasInfo.c \ - MessageDescriptionInfo.c \ + MessageDescriptionInfoList.c \ MobileOriginatedCall.c \ MobileTerminatedCall.c \ SupplServiceEvent.c \ ServiceCentreUsage.c \ - ValueAddedService.c \ GprsCall.c \ ContentTransaction.c \ LocationService.c \ AuditControlInfo.c \ - ThreeGCamelDestination.c \ AccessPointNameNI.c \ AccessPointNameOI.c \ - AccessPointName.c \ - AiurRequested.c \ - BasicHSCSDParameters.c \ + ActualDeliveryTimeStamp.c \ AddressStringDigits.c \ + AdvisedCharge.c \ + AdvisedChargeCurrency.c \ + AdvisedChargeInformation.c \ AgeOfLocation.c \ BasicService.c \ BasicServiceCode.c \ BasicServiceCodeList.c \ - BasicServiceUsedList.c \ BasicServiceUsed.c \ + BasicServiceUsedList.c \ BearerServiceCode.c \ - CalledNumAnalysis.c \ - CalledNumAnalysisCode.c \ - CalledNumAnalysisList.c \ - CallOriginator.c \ + CalledNumber.c \ CalledPlace.c \ + CalledRegion.c \ CallEventDetailsCount.c \ CallEventStartTimeStamp.c \ + CallingNumber.c \ + CallOriginator.c \ CallReference.c \ - CalledRegion.c \ - CallType.c \ - CallTypeSubtype.c \ CallTypeGroup.c \ CallTypeLevel1.c \ CallTypeLevel2.c \ CallTypeLevel3.c \ - CalledCountryCode.c \ - CamelCallReference.c \ - CamelCallReferenceNumber.c \ - CamelDestination.c \ - CamelInitiatedCFIndicator.c \ - CamelModification.c \ - CamelServerAddress.c \ - CamelModificationList.c \ + CamelDestinationNumber.c \ + CamelInvocationFee.c \ CamelServiceKey.c \ CamelServiceLevel.c \ CamelServiceUsed.c \ CauseForTerm.c \ CellId.c \ - ChannelCoding.c \ - ChannelCodingsAcceptable.c \ Charge.c \ - ChargeDetail.c \ - ChargeDetailList.c \ ChargeableSubscriber.c \ ChargeableUnits.c \ + ChargeDetail.c \ + ChargeDetailList.c \ + ChargeDetailTimeStamp.c \ ChargedItem.c \ + ChargedPartyEquipment.c \ + ChargedPartyHomeIdentification.c \ + ChargedPartyHomeIdList.c \ + ChargedPartyIdentification.c \ + ChargedPartyIdentifier.c \ + ChargedPartyIdList.c \ + ChargedPartyIdType.c \ + ChargedPartyInformation.c \ + ChargedPartyLocation.c \ + ChargedPartyLocationList.c \ ChargedPartyStatus.c \ ChargedUnits.c \ ChargeInformation.c \ ChargeInformationList.c \ + ChargeRefundIndicator.c \ ChargeType.c \ - ChargingCharacteristics.c \ ChargingId.c \ ChargingPoint.c \ ChargingTimeStamp.c \ ClirIndicator.c \ + Commission.c \ CompletionTimeStamp.c \ - ContentProviderIdType.c \ + ContentChargingPoint.c \ + ContentProvider.c \ ContentProviderIdentifier.c \ - CountryCode.c \ - CountryCodeTable.c \ + ContentProviderIdList.c \ + ContentProviderIdType.c \ + ContentProviderName.c \ + ContentServiceUsed.c \ + ContentServiceUsedList.c \ + ContentTransactionBasicInfo.c \ + ContentTransactionCode.c \ + ContentTransactionType.c \ CseInformation.c \ CurrencyConversion.c \ - CustomerIdType.c \ + CurrencyConversionList.c \ CustomerIdentifier.c \ + CustomerIdType.c \ DataVolume.c \ DataVolumeIncoming.c \ DataVolumeOutgoing.c \ - DataVolumeReference.c \ + DateTime.c \ DateTimeLong.c \ - DayCategory.c \ - DayCategorySubtype.c \ DefaultCallHandlingIndicator.c \ DepositTimeStamp.c \ Destination.c \ DestinationNetwork.c \ DialledDigits.c \ + Discount.c \ + DiscountableAmount.c \ + DiscountApplied.c \ DiscountCode.c \ + DiscountInformation.c \ + Discounting.c \ + DiscountingList.c \ DiscountRate.c \ DiscountValue.c \ - DiscountApplied.c \ - DiscountDefinition.c \ - Discounting.c \ - DiscountInformation.c \ - DiscountInformationList.c \ DistanceChargeBandCode.c \ - DualServiceCode.c \ - DualBearerServiceCode.c \ - DualTeleServiceCode.c \ EarliestCallTimeStamp.c \ - EquipmentInformation.c \ + EquipmentId.c \ + EquipmentIdType.c \ Esn.c \ ExchangeRate.c \ ExchangeRateCode.c \ - ExchangeRateDefinition.c \ FileAvailableTimeStamp.c \ FileCreationTimeStamp.c \ FileSequenceNumber.c \ FileTypeIndicator.c \ + FixedDiscountValue.c \ Fnur.c \ - FraudMonitorIndicator.c \ GeographicalLocation.c \ GprsBasicCallInformation.c \ GprsChargeableSubscriber.c \ GprsDestination.c \ GprsLocationInformation.c \ GprsNetworkLocation.c \ - GprsServiceUsage.c \ - GprsServiceUsageList.c \ GprsServiceUsed.c \ GsmChargeableSubscriber.c \ - GsnAddress.c \ + GuaranteedBitRate.c \ HomeBid.c \ + HomeIdentifier.c \ + HomeIdType.c \ + HomeLocationDescription.c \ HomeLocationInformation.c \ HorizontalAccuracyDelivered.c \ HorizontalAccuracyRequested.c \ - HSCSDInformation.c \ - HSCSDParameterModification.c \ - HSCSDParameterModificationList.c \ - Iac.c \ - IacTable.c \ + HSCSDIndicator.c \ Imei.c \ ImeiOrEsn.c \ Imsi.c \ - InitiatingParty.c \ + IMSSignallingContext.c \ + InternetServiceProvider.c \ + InternetServiceProviderIdList.c \ + IspIdentifier.c \ + IspIdType.c \ ISPList.c \ - IpAddress.c \ - IPTextV4Address.c \ - IPTextV6Address.c \ + NetworkIdType.c \ + NetworkIdentifier.c \ + Network.c \ + NetworkList.c \ LatestCallTimeStamp.c \ - Latitude.c \ - LocalCurrency.c \ - LocationArea.c \ - LocationDescription.c \ - LocationInformation.c \ - Longitude.c \ LCSQosDelivered.c \ LCSQosRequested.c \ LCSRequestTimestamp.c \ - LCSSPInformation.c \ - LCSSPIdentificationList.c \ LCSSPIdentification.c \ + LCSSPIdentificationList.c \ + LCSSPInformation.c \ LCSTransactionStatus.c \ + LocalCurrency.c \ + LocalTimeStamp.c \ + LocationArea.c \ + LocationDescription.c \ + LocationIdentifier.c \ + LocationIdType.c \ + LocationInformation.c \ LocationServiceUsage.c \ + MaximumBitRate.c \ Mdn.c \ - MinChargeableSubscriber.c \ - MessageDescriptionCode.c \ MessageDescription.c \ - MessageDescriptionDefinition.c \ + MessageDescriptionCode.c \ + MessageDescriptionInformation.c \ MessageStatus.c \ MessageType.c \ Min.c \ + MinChargeableSubscriber.c \ MoBasicCallInformation.c \ - MobileStationClassMark.c \ - ModificationIndicator.c \ - ModificationTimestamp.c \ - MscId.c \ Msisdn.c \ MtBasicCallInformation.c \ - MultiRateIndicator.c \ + NetworkAccessIdentifier.c \ NetworkId.c \ - NetworkLocation.c \ NetworkInitPDPContext.c \ - NetworkType.c \ - NonChargedParty.c \ + NetworkLocation.c \ + NonChargedNumber.c \ NumberOfDecimalPlaces.c \ - NumberingPlan.c \ - NumberOfChannels.c \ ObjectType.c \ - OperatorSpecInformation.c \ OperatorSpecInfoList.c \ + OperatorSpecInformation.c \ + OrderPlacedTimeStamp.c \ OriginatingNetwork.c \ PacketDataProtocolAddress.c \ + PaidIndicator.c \ PartialTypeIndicator.c \ + PaymentMethod.c \ PdpAddress.c \ PDPContextStartTimestamp.c \ - PdpType.c \ PlmnId.c \ PositioningMethod.c \ PriorityCode.c \ - QoSInformation.c \ - QoSDelay.c \ - QoSGuaranteedBitRateDownlink.c \ - QoSGuaranteedBitRateUplink.c \ - QoSMeanThroughput.c \ - QoSPeakThroughput.c \ - QoSPrecedence.c \ - QoSReliability.c \ - RadioChannelRequested.c \ - RadioChannelUsed.c \ - QoSAllocRetenPriority.c \ - QoSDeliveryOrder.c \ - QoSErroneousSDUs.c \ - QoSHandlingpriority.c \ - QoSMaxBitRate.c \ - QoSMaxBitRateUplink.c \ - QoSMaxBitRateDownlink.c \ - QoSMaxSDUsize.c \ - QoSResidualBER.c \ - QoSSDUErrorRatio.c \ - QoSTrafficClass.c \ - QoSTransferDelay.c \ - GSMQoSRequested.c \ - GSMQoSUsed.c \ - QoSRequestedV37.c \ - QoSUsedV37.c \ - QoSRequestedV38.c \ - QoSUsedV38.c \ - UMTSQoSInformation.c \ - UMTSQoSRequested.c \ - UMTSQoSUsed.c \ - UserProtocolIndicator.c \ RapFileSequenceNumber.c \ - Recipient.c \ - RecEntityDefinition.c \ RecEntityCode.c \ RecEntityCodeList.c \ - RecEntityType.c \ RecEntityId.c \ - RecEntityTable.c \ + RecEntityInfoList.c \ + RecEntityInformation.c \ + RecEntityType.c \ + Recipient.c \ ReleaseVersionNumber.c \ - RemotePdpAddressList.c \ + RequestedDeliveryTimeStamp.c \ ResponseTime.c \ ResponseTimeCategory.c \ ScuBasicInformation.c \ ScuChargeType.c \ ScuTimeStamps.c \ - ScuVasChargeableSubscriber.c \ + ScuChargeableSubscriber.c \ Sender.c \ - ServiceCentreIdentity.c \ ServingBid.c \ + ServingLocationDescription.c \ ServingNetwork.c \ + ServingPartiesInformation.c \ SimChargeableSubscriber.c \ SimToolkitIndicator.c \ + SMSDestinationNumber.c \ + SMSOriginator.c \ SpecificationVersionNumber.c \ - SpeechVersionRequested.c \ - SpeechVersionUsed.c \ - SpeechVersion.c \ SsParameters.c \ - SupplServiceUsed.c \ - SupplServiceUsedList.c \ SupplServiceActionCode.c \ SupplServiceCode.c \ + SupplServiceUsed.c \ TapCurrency.c \ + TapDecimalPlaces.c \ + TaxableAmount.c \ Taxation.c \ + TaxationList.c \ TaxCode.c \ - TapDecimalPlaces.c \ TaxInformation.c \ TaxInformationList.c \ - TaxValue10.c \ TaxRate.c \ - TaxableAmount.c \ - TaxRateDefinition.c \ TaxType.c \ + TaxValue.c \ TeleServiceCode.c \ ThirdPartyInformation.c \ - TimeBand.c \ - TimeBandSubtype.c \ - TotalChargeValue.c \ + ThirdPartyNumber.c \ + ThreeGcamelDestination.c \ + TotalAdvisedCharge.c \ + TotalAdvisedChargeRefund.c \ + TotalAdvisedChargeValue.c \ + TotalAdvisedChargeValueList.c \ TotalCallEventDuration.c \ - TotalChargeValueList.c \ + TotalCharge.c \ + TotalChargeRefund.c \ + TotalCommission.c \ + TotalCommissionRefund.c \ + TotalDataVolume.c \ + TotalDiscountRefund.c \ TotalDiscountValue.c \ + TotalTaxRefund.c \ TotalTaxValue.c \ - TrackedCustomerInformation.c \ - TrackedCustomerIdList.c \ - TrackedCustomerIdentification.c \ - TrackedCustomerHomeIdList.c \ + TotalTransactionDuration.c \ + TrackedCustomerEquipment.c \ TrackedCustomerHomeId.c \ - HomeIdentifier.c \ - TrackedCustomerLocList.c \ + TrackedCustomerHomeIdList.c \ + TrackedCustomerIdentification.c \ + TrackedCustomerIdList.c \ + TrackedCustomerInformation.c \ TrackedCustomerLocation.c \ - TrackedCustomerEquipment.c \ - TrackingCustomerInformation.c \ - TrackingCustomerIdList.c \ - TrackingCustomerIdentification.c \ - TrackingCustomerHomeIdList.c \ + TrackedCustomerLocList.c \ + TrackingCustomerEquipment.c \ TrackingCustomerHomeId.c \ - TrackingCustomerLocList.c \ + TrackingCustomerHomeIdList.c \ + TrackingCustomerIdentification.c \ + TrackingCustomerIdList.c \ + TrackingCustomerInformation.c \ TrackingCustomerLocation.c \ - TrackingCustomerEquipment.c \ + TrackingCustomerLocList.c \ TrackingFrequency.c \ TrackingPeriod.c \ + TransactionAuthCode.c \ + TransactionDescriptionSupp.c \ + TransactionDetailDescription.c \ + TransactionIdentifier.c \ + TransactionShortDescription.c \ + TransactionStatus.c \ TransferCutOffTimeStamp.c \ TransparencyIndicator.c \ - TypeOfControllingNode.c \ - TypeOfNumber.c \ + UserProtocolIndicator.c \ UtcTimeOffset.c \ UtcTimeOffsetCode.c \ - UtcTimeOffsetDefinition.c \ UtcTimeOffsetInfo.c \ - ValueAddedServiceUsedList.c \ - ValueAddedServiceUsed.c \ - VasCode.c \ - VasDefinition.c \ - VasDescription.c \ - VasShortDescription.c \ + UtcTimeOffsetInfoList.c \ VerticalAccuracyDelivered.c \ VerticalAccuracyRequested.c \ AbsoluteAmount.c \ Bid.c \ Code.c \ - Currency.c \ AsciiString.c \ - Description.c \ - TapHexString.c \ - PercentageRate.c \ BCDString.c \ - OrderPlacementTimeStamp.c \ - RequestedDeliveryTimeStamp.c \ - ActualDeliveryTimeStamp.c \ - TransactionStatus.c \ - ContentTransactionBasicInfo.c \ - ChargedPartyIdType.c \ - LoginName.c \ - AccountNumber.c \ - EmailAddress.c \ - ChargedPartyIdentification.c \ - ChargedPartyId.c \ - ChargedPartyIdList.c \ - HomeIdType.c \ - Name.c \ - ChargedPartyHomeId.c \ - ChargedPartyHomeIdList.c \ - LocationIdType.c \ - LocationIdentifier.c \ - CountryName.c \ - CountryAsciCode.c \ - TapRegion.c \ - Place.c \ - ChargedPartyLocation.c \ - ChargedPartyLocationList.c \ - EquipmentIdType.c \ - EquipmentId.c \ - ChargedPartyEquipment.c \ - ChargedPartyInformation.c \ - ProviderIdType.c \ - Url.c \ - ProviderId.c \ - ContentProviderId.c \ - ContentProviderIdList.c \ - InternetServiceProviderId.c \ - InternetServiceProviderIdList.c \ - NetworkIdType.c \ - NetworkDesc.c \ - NetworkIdentifier.c \ - NetworkIdGroup.c \ - NetworkIdList.c \ - ContentProviderName.c \ - ServingPartiesInformation.c \ - ContentTransactionCode.c \ - ContentTransactionType.c \ - TransactionDescriptionSupp.c \ - TransactionDetailDescription.c \ - TransactionShortDescription.c \ - TransactionIdentifier.c \ - TransactionAuthCode.c \ - TotalDataVolume.c \ - ChargeRefundIndicator.c \ - ContentChargingPoint.c \ - PaidIndicator.c \ - PaymentMethod.c \ - AdvisedChargeCurrency.c \ - AdvisedCharge.c \ - Commission.c \ - AdvisedChargeInformation.c \ - ContentServiceUsed.c \ - ContentServiceUsedList.c \ - TotalTaxRefund.c \ - TotalDiscountRefund.c \ - TotalChargeRefund.c \ - TotalAdvisedCharge.c \ - TotalAdvisedChargeRefund.c \ - TotalCommission.c \ - TotalCommissionRefund.c \ - TotalAdvisedChargeValue.c \ - TotalAdvisedChargeValueList.c + Currency.c \ + HexString.c \ + NumberString.c \ + PercentageRate.c ASN_MODULE_HEADERS= \ - DateTime.h \ - LocalTimeStamp.h \ DataInterChange.h \ TransferBatch.h \ Notification.h \ @@ -412,404 +316,308 @@ ASN_MODULE_HEADERS= \ BatchControlInfo.h \ AccountingInfo.h \ NetworkInfo.h \ - VasInfo.h \ - MessageDescriptionInfo.h \ + MessageDescriptionInfoList.h \ MobileOriginatedCall.h \ MobileTerminatedCall.h \ SupplServiceEvent.h \ ServiceCentreUsage.h \ - ValueAddedService.h \ GprsCall.h \ ContentTransaction.h \ LocationService.h \ AuditControlInfo.h \ - ThreeGCamelDestination.h \ AccessPointNameNI.h \ AccessPointNameOI.h \ - AccessPointName.h \ - AiurRequested.h \ - BasicHSCSDParameters.h \ + ActualDeliveryTimeStamp.h \ AddressStringDigits.h \ + AdvisedCharge.h \ + AdvisedChargeCurrency.h \ + AdvisedChargeInformation.h \ AgeOfLocation.h \ BasicService.h \ BasicServiceCode.h \ BasicServiceCodeList.h \ - BasicServiceUsedList.h \ BasicServiceUsed.h \ + BasicServiceUsedList.h \ BearerServiceCode.h \ - CalledNumAnalysis.h \ - CalledNumAnalysisCode.h \ - CalledNumAnalysisList.h \ - CallOriginator.h \ + CalledNumber.h \ CalledPlace.h \ + CalledRegion.h \ CallEventDetailsCount.h \ CallEventStartTimeStamp.h \ + CallingNumber.h \ + CallOriginator.h \ CallReference.h \ - CalledRegion.h \ - CallType.h \ - CallTypeSubtype.h \ CallTypeGroup.h \ CallTypeLevel1.h \ CallTypeLevel2.h \ CallTypeLevel3.h \ - CalledCountryCode.h \ - CamelCallReference.h \ - CamelCallReferenceNumber.h \ - CamelDestination.h \ - CamelInitiatedCFIndicator.h \ - CamelModification.h \ - CamelServerAddress.h \ - CamelModificationList.h \ + CamelDestinationNumber.h \ + CamelInvocationFee.h \ CamelServiceKey.h \ CamelServiceLevel.h \ CamelServiceUsed.h \ CauseForTerm.h \ CellId.h \ - ChannelCoding.h \ - ChannelCodingsAcceptable.h \ Charge.h \ - ChargeDetail.h \ - ChargeDetailList.h \ ChargeableSubscriber.h \ ChargeableUnits.h \ + ChargeDetail.h \ + ChargeDetailList.h \ + ChargeDetailTimeStamp.h \ ChargedItem.h \ + ChargedPartyEquipment.h \ + ChargedPartyHomeIdentification.h \ + ChargedPartyHomeIdList.h \ + ChargedPartyIdentification.h \ + ChargedPartyIdentifier.h \ + ChargedPartyIdList.h \ + ChargedPartyIdType.h \ + ChargedPartyInformation.h \ + ChargedPartyLocation.h \ + ChargedPartyLocationList.h \ ChargedPartyStatus.h \ ChargedUnits.h \ ChargeInformation.h \ ChargeInformationList.h \ + ChargeRefundIndicator.h \ ChargeType.h \ - ChargingCharacteristics.h \ ChargingId.h \ ChargingPoint.h \ ChargingTimeStamp.h \ ClirIndicator.h \ + Commission.h \ CompletionTimeStamp.h \ - ContentProviderIdType.h \ + ContentChargingPoint.h \ + ContentProvider.h \ ContentProviderIdentifier.h \ - CountryCode.h \ - CountryCodeTable.h \ + ContentProviderIdList.h \ + ContentProviderIdType.h \ + ContentProviderName.h \ + ContentServiceUsed.h \ + ContentServiceUsedList.h \ + ContentTransactionBasicInfo.h \ + ContentTransactionCode.h \ + ContentTransactionType.h \ CseInformation.h \ CurrencyConversion.h \ - CustomerIdType.h \ + CurrencyConversionList.h \ CustomerIdentifier.h \ + CustomerIdType.h \ DataVolume.h \ DataVolumeIncoming.h \ DataVolumeOutgoing.h \ - DataVolumeReference.h \ + DateTime.h \ DateTimeLong.h \ - DayCategory.h \ - DayCategorySubtype.h \ DefaultCallHandlingIndicator.h \ DepositTimeStamp.h \ Destination.h \ DestinationNetwork.h \ DialledDigits.h \ + Discount.h \ + DiscountableAmount.h \ + DiscountApplied.h \ DiscountCode.h \ + DiscountInformation.h \ + Discounting.h \ + DiscountingList.h \ DiscountRate.h \ DiscountValue.h \ - DiscountApplied.h \ - DiscountDefinition.h \ - Discounting.h \ - DiscountInformation.h \ - DiscountInformationList.h \ DistanceChargeBandCode.h \ - DualServiceCode.h \ - DualBearerServiceCode.h \ - DualTeleServiceCode.h \ EarliestCallTimeStamp.h \ - EquipmentInformation.h \ + EquipmentId.h \ + EquipmentIdType.h \ Esn.h \ ExchangeRate.h \ ExchangeRateCode.h \ - ExchangeRateDefinition.h \ FileAvailableTimeStamp.h \ FileCreationTimeStamp.h \ FileSequenceNumber.h \ FileTypeIndicator.h \ + FixedDiscountValue.h \ Fnur.h \ - FraudMonitorIndicator.h \ GeographicalLocation.h \ GprsBasicCallInformation.h \ GprsChargeableSubscriber.h \ GprsDestination.h \ GprsLocationInformation.h \ GprsNetworkLocation.h \ - GprsServiceUsage.h \ - GprsServiceUsageList.h \ GprsServiceUsed.h \ GsmChargeableSubscriber.h \ - GsnAddress.h \ + GuaranteedBitRate.h \ HomeBid.h \ + HomeIdentifier.h \ + HomeIdType.h \ + HomeLocationDescription.h \ HomeLocationInformation.h \ HorizontalAccuracyDelivered.h \ HorizontalAccuracyRequested.h \ - HSCSDInformation.h \ - HSCSDParameterModification.h \ - HSCSDParameterModificationList.h \ - Iac.h \ - IacTable.h \ + HSCSDIndicator.h \ Imei.h \ ImeiOrEsn.h \ Imsi.h \ - InitiatingParty.h \ + IMSSignallingContext.h \ + InternetServiceProvider.h \ + InternetServiceProviderIdList.h \ + IspIdentifier.h \ + IspIdType.h \ ISPList.h \ - IpAddress.h \ - IPTextV4Address.h \ - IPTextV6Address.h \ + NetworkIdType.h \ + NetworkIdentifier.h \ + Network.h \ + NetworkList.h \ LatestCallTimeStamp.h \ - Latitude.h \ - LocalCurrency.h \ - LocationArea.h \ - LocationDescription.h \ - LocationInformation.h \ - Longitude.h \ LCSQosDelivered.h \ LCSQosRequested.h \ LCSRequestTimestamp.h \ - LCSSPInformation.h \ - LCSSPIdentificationList.h \ LCSSPIdentification.h \ + LCSSPIdentificationList.h \ + LCSSPInformation.h \ LCSTransactionStatus.h \ + LocalCurrency.h \ + LocalTimeStamp.h \ + LocationArea.h \ + LocationDescription.h \ + LocationIdentifier.h \ + LocationIdType.h \ + LocationInformation.h \ LocationServiceUsage.h \ + MaximumBitRate.h \ Mdn.h \ - MinChargeableSubscriber.h \ - MessageDescriptionCode.h \ MessageDescription.h \ - MessageDescriptionDefinition.h \ + MessageDescriptionCode.h \ + MessageDescriptionInformation.h \ MessageStatus.h \ MessageType.h \ Min.h \ + MinChargeableSubscriber.h \ MoBasicCallInformation.h \ - MobileStationClassMark.h \ - ModificationIndicator.h \ - ModificationTimestamp.h \ - MscId.h \ Msisdn.h \ MtBasicCallInformation.h \ - MultiRateIndicator.h \ + NetworkAccessIdentifier.h \ NetworkId.h \ - NetworkLocation.h \ NetworkInitPDPContext.h \ - NetworkType.h \ - NonChargedParty.h \ + NetworkLocation.h \ + NonChargedNumber.h \ NumberOfDecimalPlaces.h \ - NumberingPlan.h \ - NumberOfChannels.h \ ObjectType.h \ - OperatorSpecInformation.h \ OperatorSpecInfoList.h \ + OperatorSpecInformation.h \ + OrderPlacedTimeStamp.h \ OriginatingNetwork.h \ PacketDataProtocolAddress.h \ + PaidIndicator.h \ PartialTypeIndicator.h \ + PaymentMethod.h \ PdpAddress.h \ PDPContextStartTimestamp.h \ - PdpType.h \ PlmnId.h \ PositioningMethod.h \ PriorityCode.h \ - QoSInformation.h \ - QoSDelay.h \ - QoSGuaranteedBitRateDownlink.h \ - QoSGuaranteedBitRateUplink.h \ - QoSMeanThroughput.h \ - QoSPeakThroughput.h \ - QoSPrecedence.h \ - QoSReliability.h \ - RadioChannelRequested.h \ - RadioChannelUsed.h \ - QoSAllocRetenPriority.h \ - QoSDeliveryOrder.h \ - QoSErroneousSDUs.h \ - QoSHandlingpriority.h \ - QoSMaxBitRate.h \ - QoSMaxBitRateUplink.h \ - QoSMaxBitRateDownlink.h \ - QoSMaxSDUsize.h \ - QoSResidualBER.h \ - QoSSDUErrorRatio.h \ - QoSTrafficClass.h \ - QoSTransferDelay.h \ - GSMQoSRequested.h \ - GSMQoSUsed.h \ - QoSRequestedV37.h \ - QoSUsedV37.h \ - QoSRequestedV38.h \ - QoSUsedV38.h \ - UMTSQoSInformation.h \ - UMTSQoSRequested.h \ - UMTSQoSUsed.h \ - UserProtocolIndicator.h \ RapFileSequenceNumber.h \ - Recipient.h \ - RecEntityDefinition.h \ RecEntityCode.h \ RecEntityCodeList.h \ - RecEntityType.h \ RecEntityId.h \ - RecEntityTable.h \ + RecEntityInfoList.h \ + RecEntityInformation.h \ + RecEntityType.h \ + Recipient.h \ ReleaseVersionNumber.h \ - RemotePdpAddressList.h \ + RequestedDeliveryTimeStamp.h \ ResponseTime.h \ ResponseTimeCategory.h \ ScuBasicInformation.h \ ScuChargeType.h \ ScuTimeStamps.h \ - ScuVasChargeableSubscriber.h \ + ScuChargeableSubscriber.h \ Sender.h \ - ServiceCentreIdentity.h \ ServingBid.h \ + ServingLocationDescription.h \ ServingNetwork.h \ + ServingPartiesInformation.h \ SimChargeableSubscriber.h \ SimToolkitIndicator.h \ + SMSDestinationNumber.h \ + SMSOriginator.h \ SpecificationVersionNumber.h \ - SpeechVersionRequested.h \ - SpeechVersionUsed.h \ - SpeechVersion.h \ SsParameters.h \ - SupplServiceUsed.h \ - SupplServiceUsedList.h \ SupplServiceActionCode.h \ SupplServiceCode.h \ + SupplServiceUsed.h \ TapCurrency.h \ + TapDecimalPlaces.h \ + TaxableAmount.h \ Taxation.h \ + TaxationList.h \ TaxCode.h \ - TapDecimalPlaces.h \ TaxInformation.h \ TaxInformationList.h \ - TaxValue10.h \ TaxRate.h \ - TaxableAmount.h \ - TaxRateDefinition.h \ TaxType.h \ + TaxValue.h \ TeleServiceCode.h \ ThirdPartyInformation.h \ - TimeBand.h \ - TimeBandSubtype.h \ - TotalChargeValue.h \ + ThirdPartyNumber.h \ + ThreeGcamelDestination.h \ + TotalAdvisedCharge.h \ + TotalAdvisedChargeRefund.h \ + TotalAdvisedChargeValue.h \ + TotalAdvisedChargeValueList.h \ TotalCallEventDuration.h \ - TotalChargeValueList.h \ + TotalCharge.h \ + TotalChargeRefund.h \ + TotalCommission.h \ + TotalCommissionRefund.h \ + TotalDataVolume.h \ + TotalDiscountRefund.h \ TotalDiscountValue.h \ + TotalTaxRefund.h \ TotalTaxValue.h \ - TrackedCustomerInformation.h \ - TrackedCustomerIdList.h \ - TrackedCustomerIdentification.h \ - TrackedCustomerHomeIdList.h \ + TotalTransactionDuration.h \ + TrackedCustomerEquipment.h \ TrackedCustomerHomeId.h \ - HomeIdentifier.h \ - TrackedCustomerLocList.h \ + TrackedCustomerHomeIdList.h \ + TrackedCustomerIdentification.h \ + TrackedCustomerIdList.h \ + TrackedCustomerInformation.h \ TrackedCustomerLocation.h \ - TrackedCustomerEquipment.h \ - TrackingCustomerInformation.h \ - TrackingCustomerIdList.h \ - TrackingCustomerIdentification.h \ - TrackingCustomerHomeIdList.h \ + TrackedCustomerLocList.h \ + TrackingCustomerEquipment.h \ TrackingCustomerHomeId.h \ - TrackingCustomerLocList.h \ + TrackingCustomerHomeIdList.h \ + TrackingCustomerIdentification.h \ + TrackingCustomerIdList.h \ + TrackingCustomerInformation.h \ TrackingCustomerLocation.h \ - TrackingCustomerEquipment.h \ + TrackingCustomerLocList.h \ TrackingFrequency.h \ TrackingPeriod.h \ + TransactionAuthCode.h \ + TransactionDescriptionSupp.h \ + TransactionDetailDescription.h \ + TransactionIdentifier.h \ + TransactionShortDescription.h \ + TransactionStatus.h \ TransferCutOffTimeStamp.h \ TransparencyIndicator.h \ - TypeOfControllingNode.h \ - TypeOfNumber.h \ + UserProtocolIndicator.h \ UtcTimeOffset.h \ UtcTimeOffsetCode.h \ - UtcTimeOffsetDefinition.h \ UtcTimeOffsetInfo.h \ - ValueAddedServiceUsedList.h \ - ValueAddedServiceUsed.h \ - VasCode.h \ - VasDefinition.h \ - VasDescription.h \ - VasShortDescription.h \ + UtcTimeOffsetInfoList.h \ VerticalAccuracyDelivered.h \ VerticalAccuracyRequested.h \ AbsoluteAmount.h \ Bid.h \ Code.h \ - Currency.h \ AsciiString.h \ - Description.h \ - TapHexString.h \ - PercentageRate.h \ BCDString.h \ - OrderPlacementTimeStamp.h \ - RequestedDeliveryTimeStamp.h \ - ActualDeliveryTimeStamp.h \ - TransactionStatus.h \ - ContentTransactionBasicInfo.h \ - ChargedPartyIdType.h \ - LoginName.h \ - AccountNumber.h \ - EmailAddress.h \ - ChargedPartyIdentification.h \ - ChargedPartyId.h \ - ChargedPartyIdList.h \ - HomeIdType.h \ - Name.h \ - ChargedPartyHomeId.h \ - ChargedPartyHomeIdList.h \ - LocationIdType.h \ - LocationIdentifier.h \ - CountryName.h \ - CountryAsciCode.h \ - TapRegion.h \ - Place.h \ - ChargedPartyLocation.h \ - ChargedPartyLocationList.h \ - EquipmentIdType.h \ - EquipmentId.h \ - ChargedPartyEquipment.h \ - ChargedPartyInformation.h \ - ProviderIdType.h \ - Url.h \ - ProviderId.h \ - ContentProviderId.h \ - ContentProviderIdList.h \ - InternetServiceProviderId.h \ - InternetServiceProviderIdList.h \ - NetworkIdType.h \ - NetworkDesc.h \ - NetworkIdentifier.h \ - NetworkIdGroup.h \ - NetworkIdList.h \ - ContentProviderName.h \ - ServingPartiesInformation.h \ - ContentTransactionCode.h \ - ContentTransactionType.h \ - TransactionDescriptionSupp.h \ - TransactionDetailDescription.h \ - TransactionShortDescription.h \ - TransactionIdentifier.h \ - TransactionAuthCode.h \ - TotalDataVolume.h \ - ChargeRefundIndicator.h \ - ContentChargingPoint.h \ - PaidIndicator.h \ - PaymentMethod.h \ - AdvisedChargeCurrency.h \ - AdvisedCharge.h \ - Commission.h \ - AdvisedChargeInformation.h \ - ContentServiceUsed.h \ - ContentServiceUsedList.h \ - TotalTaxRefund.h \ - TotalDiscountRefund.h \ - TotalChargeRefund.h \ - TotalAdvisedCharge.h \ - TotalAdvisedChargeRefund.h \ - TotalCommission.h \ - TotalCommissionRefund.h \ - TotalAdvisedChargeValue.h \ - TotalAdvisedChargeValueList.h + Currency.h \ + HexString.h \ + NumberString.h \ + PercentageRate.h ASN_MODULE_HEADERS+=INTEGER.h ASN_MODULE_SOURCES+=INTEGER.c -ASN_MODULE_HEADERS+=NumericString.h -ASN_MODULE_SOURCES+=NumericString.c -ASN_MODULE_HEADERS+=VisibleString.h -ASN_MODULE_SOURCES+=VisibleString.c ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h ASN_MODULE_SOURCES+=asn_SEQUENCE_OF.c ASN_MODULE_HEADERS+=asn_SET_OF.h @@ -879,15 +687,15 @@ clean: regen: regenerate-from-asn1-source regenerate-from-asn1-source: - ../../asn1c/asn1c -S ../../skeletons ../tap310-m.asn + ../../asn1c/asn1c -S ../../skeletons ../tap3.asn1 -../tap310-m.asn: +../tap3.asn1: @echo The ../tap3.asn1 file is not yet present. @echo Please read the README file on how to obtain this file. @exit 42 -DataInterChange.c: ../tap310-m.asn regenerate.Makefile +DataInterChange.c: ../tap3.asn1 regenerate.Makefile ./regenerate.Makefile @touch DataInterChange.c make From 0b43112c6063eb76cd55daf23b5e0104629fdf84 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 8 Apr 2005 10:12:40 +0000 Subject: [PATCH 0860/1469] not always true git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@860 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1parser.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libasn1parser/asn1parser.c b/libasn1parser/asn1parser.c index c820cc4ae..45f60c317 100644 --- a/libasn1parser/asn1parser.c +++ b/libasn1parser/asn1parser.c @@ -111,7 +111,8 @@ asn1p_parse_file(const char *filename, enum asn1p_flags flags) { if(_asn1p_fix_modules(a, filename)) return NULL; /* FIXME: destroy (a) */ } else { - assert(a == NULL); + /* Not always true: assert(a == NULL); */ + a = NULL; } return a; From 1bc7563ab3b1cdc127e8cc0094ad298e8b568153 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 8 Apr 2005 10:14:30 +0000 Subject: [PATCH 0861/1469] proper freeing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@861 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1parser.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libasn1parser/asn1parser.c b/libasn1parser/asn1parser.c index 45f60c317..f6221a565 100644 --- a/libasn1parser/asn1parser.c +++ b/libasn1parser/asn1parser.c @@ -54,8 +54,9 @@ asn1p_parse_buffer(const char *buffer, int size /* = -1 */, enum asn1p_flags fla assert(a); if(_asn1p_fix_modules(a, "-")) return NULL; /* FIXME: destroy (a) */ - } else { - assert(a == NULL); + } else if(a) { + asn1p_free(a); + a = NULL; } return a; @@ -110,8 +111,8 @@ asn1p_parse_file(const char *filename, enum asn1p_flags flags) { assert(a); if(_asn1p_fix_modules(a, filename)) return NULL; /* FIXME: destroy (a) */ - } else { - /* Not always true: assert(a == NULL); */ + } else if(a) { + asn1p_free(a); a = NULL; } From e0fb9ce1fd567ae4fe5fa5459fbe18b01cec4160 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 8 Apr 2005 19:28:18 +0000 Subject: [PATCH 0862/1469] macro to enable default output git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@862 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn-decoder-template.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/skeletons/asn-decoder-template.c b/skeletons/asn-decoder-template.c index 4ff524c87..76559d10d 100644 --- a/skeletons/asn-decoder-template.c +++ b/skeletons/asn-decoder-template.c @@ -76,6 +76,7 @@ main(int ac, char **av) { } break; case 'p': + opt_toxml = 0; /* Override '-x' */ opt_print++; break; case 's': @@ -88,6 +89,7 @@ main(int ac, char **av) { } break; case 'x': + opt_print = 0; /* Override '-p' */ opt_toxml++; break; case 'h': @@ -101,7 +103,11 @@ main(int ac, char **av) { " -n Process files times\n" " -s Set the stack usage limit\n" " -p Print out the decoded contents\n" - " -x Print out as XML\n" + " -x Print out as XML" +#ifdef ASN_DECODER_DEFAULT_OUTPUT_XML + " (default)" +#endif + "\n" , av[0], (long)suggested_bufsize); exit(EX_USAGE); } @@ -114,6 +120,10 @@ main(int ac, char **av) { exit(EX_USAGE); } +#ifdef ASN_DECODER_DEFAULT_OUTPUT_XML + if(!opt_print) opt_toxml++; +#endif + setvbuf(stdout, 0, _IOLBF, 0); for(num = 0; num < number_of_iterations; num++) { From cfd23ac6dc9eeb4df2b322c9ae935a911311dd82 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 12 Apr 2005 17:46:30 +0000 Subject: [PATCH 0863/1469] wording git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@863 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_retrieve.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libasn1fix/asn1fix_retrieve.c b/libasn1fix/asn1fix_retrieve.c index 6b752792e..d7eeed21c 100644 --- a/libasn1fix/asn1fix_retrieve.c +++ b/libasn1fix/asn1fix_retrieve.c @@ -56,8 +56,9 @@ asn1f_lookup_in_imports(arg_t *arg, asn1p_module_t *mod, const char *name) { /* Conditional debug */ if(!(arg->expr->_mark & TM_BROKEN)) { arg->expr->_mark |= TM_BROKEN; - FATAL("Cannot find module %s " - "mentioned for %s at line %d", + FATAL("Cannot find external module \"%s\" " + "mentioned for " + "\"%s\" at line %d", xp->from, name, arg->expr->_lineno); } /* ENOENT/ETOOMANYREFS */ From 867475be5d5b10271b936bd4d7c0390ffaa0bcc7 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 13 Apr 2005 12:02:54 +0000 Subject: [PATCH 0864/1469] generalization git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@864 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.PKIX1/Makefile | 6 +++--- examples/sample.source.PKIX1/config.h | 2 -- examples/sample.source.TAP3/Makefile | 2 +- examples/sample.source.TAP3/config.h | 2 -- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index c625ed8c5..8125af7c9 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -358,14 +358,14 @@ regenerate-from-asn1-source: ../../asn1c/asn1c -S ../../skeletons ../rfc3280-PKIX1Explicit88.asn1 ../rfc3280-PKIX1Implicit88.asn1 -Attribute.c: regenerate.Makefile +Certificate.c: regenerate.Makefile ./regenerate.Makefile - @touch Attribute.c + @touch Certificate.c make ASN_DECODER_TEMPLATE=../../skeletons/asn-decoder-template.c $(TARGET).o: $(ASN_DECODER_TEMPLATE) - $(CC) $(CFLAGS) -o $(TARGET).o -c $(ASN_DECODER_TEMPLATE) + $(CC) $(CFLAGS) -Dasn_DEF=asn_DEF_Certificate -o $(TARGET).o -c $(ASN_DECODER_TEMPLATE) distclean: clean rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) diff --git a/examples/sample.source.PKIX1/config.h b/examples/sample.source.PKIX1/config.h index 2f6a3921e..2dda9297a 100644 --- a/examples/sample.source.PKIX1/config.h +++ b/examples/sample.source.PKIX1/config.h @@ -8,5 +8,3 @@ extern int opt_debug; __FILE__, __LINE__); \ } while(0) -/* Which type is the PDU; for ../../skeletons/asn-decoder-template.c */ -#define asn_DEF asn_DEF_Certificate diff --git a/examples/sample.source.TAP3/Makefile b/examples/sample.source.TAP3/Makefile index fcc51262d..f990b6d5d 100644 --- a/examples/sample.source.TAP3/Makefile +++ b/examples/sample.source.TAP3/Makefile @@ -702,7 +702,7 @@ DataInterChange.c: ../tap3.asn1 regenerate.Makefile ASN_DECODER_TEMPLATE=../../skeletons/asn-decoder-template.c $(TARGET).o: $(ASN_DECODER_TEMPLATE) - $(CC) $(CFLAGS) -o $(TARGET).o -c $(ASN_DECODER_TEMPLATE) + $(CC) $(CFLAGS) -Dasn_DEF=asn_DEF_DataInterChange -o $(TARGET).o -c $(ASN_DECODER_TEMPLATE) distclean: clean rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) diff --git a/examples/sample.source.TAP3/config.h b/examples/sample.source.TAP3/config.h index 30728e12f..2dda9297a 100644 --- a/examples/sample.source.TAP3/config.h +++ b/examples/sample.source.TAP3/config.h @@ -8,5 +8,3 @@ extern int opt_debug; __FILE__, __LINE__); \ } while(0) -/* Which type is the PDU; for ../../skeletons/asn-decoder-template.c */ -#define asn_DEF asn_DEF_DataInterChange From b1c68c5894e5e469812de99c37ea8168d29340d5 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 13 Apr 2005 12:29:49 +0000 Subject: [PATCH 0865/1469] some problem git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@865 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/83-with-comps-OK.asn1 | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 tests/83-with-comps-OK.asn1 diff --git a/tests/83-with-comps-OK.asn1 b/tests/83-with-comps-OK.asn1 new file mode 100644 index 000000000..7202c5cbf --- /dev/null +++ b/tests/83-with-comps-OK.asn1 @@ -0,0 +1,20 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .83 + +ModuleTestWithComponents2 + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 83 } + DEFINITIONS ::= +BEGIN + + Type1 ::= SET {} + + Type2 ::= SET { + COMPONENTS OF Type1 (WITH COMPONENTS { ... }) + } + +END From 938c104231b646d16522255bfb347fb348dd79ee Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 13 Apr 2005 12:47:35 +0000 Subject: [PATCH 0866/1469] fixed BIT STRING value cloning git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@866 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_value.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libasn1parser/asn1p_value.c b/libasn1parser/asn1p_value.c index 1aacaf11f..d6d300776 100644 --- a/libasn1parser/asn1p_value.c +++ b/libasn1parser/asn1p_value.c @@ -139,7 +139,7 @@ asn1p_value_clone(asn1p_value_t *v) { if(clone) clone->type = ATV_UNPARSED; return clone; case ATV_BITVECTOR: - return asn1p_value_frombuf(v->value.binary_vector.bits, + return asn1p_value_frombits(v->value.binary_vector.bits, v->value.binary_vector.size_in_bits, 1); case ATV_REFERENCED: return asn1p_value_fromref(v->value.reference, 1); From 318bc270bea690e37a06b875f73fdb5e207c8a99 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 13 Apr 2005 13:20:20 +0000 Subject: [PATCH 0867/1469] don't free for now git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@867 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_constr.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libasn1fix/asn1fix_constr.c b/libasn1fix/asn1fix_constr.c index 794845b73..e16c9e041 100644 --- a/libasn1fix/asn1fix_constr.c +++ b/libasn1fix/asn1fix_constr.c @@ -62,7 +62,11 @@ asn1f_pull_components_of(arg_t *arg) { coft = asn1p_expr_clone(terminal, 1 /* Skip extensions */); if(!coft) return -1; /* ENOMEM */ - asn1p_expr_free(memb); /* Don't need it anymore*/ + if(0) { + asn1p_expr_free(memb); /* Don't need it anymore*/ + } else { + /* Actual removal clashes with constraints... skip. */ + } /* * Move all components of the cloned structure From df9d0beda3255071cb0a25fa16f278b648e9e858 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 13 Apr 2005 13:22:31 +0000 Subject: [PATCH 0868/1469] MHEG5 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@868 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/README | 3 + examples/sample.source.MHEG5/Makefile | 479 ++++++++++++++++++++++++++ examples/sample.source.MHEG5/README | 48 +++ 3 files changed, 530 insertions(+) create mode 100644 examples/sample.source.MHEG5/Makefile create mode 100644 examples/sample.source.MHEG5/README diff --git a/examples/README b/examples/README index ae7ee79ac..fa1388057 100644 --- a/examples/README +++ b/examples/README @@ -12,3 +12,6 @@ To compile the files using asn1c, try 1. The ./sample.source.PKIX1 directory contains the X.509 Certificate decoder. 2. The ./sample.source.TAP3 directory contains the GSM TAP3 decoder. Please read the README file in that directory first. +3. The ./sample.source.MHEG5 directory contains the decoder for +ISO 13522 MHEG-5/ITU-T T.172 (Multimedia Hypermedia Experts Group, +Multimedia Presentations). diff --git a/examples/sample.source.MHEG5/Makefile b/examples/sample.source.MHEG5/Makefile new file mode 100644 index 000000000..e84e400fb --- /dev/null +++ b/examples/sample.source.MHEG5/Makefile @@ -0,0 +1,479 @@ +ASN_MODULE_SOURCES= \ + InterchangedObject.c \ + RootClass.c \ + GroupClass.c \ + StandardIdentifier.c \ + GroupItem.c \ + ApplicationClass.c \ + DefaultAttribute.c \ + FontBody.c \ + SceneClass.c \ + SceneCoordinateSystem.c \ + AspectRatio.c \ + NextScene.c \ + IngredientClass.c \ + ContentBody.c \ + ReferencedContent.c \ + LinkClass.c \ + LinkCondition.c \ + EventType.c \ + EventData.c \ + ProgramClass.c \ + ResidentProgramClass.c \ + RemoteProgramClass.c \ + InterchangedProgramClass.c \ + PaletteClass.c \ + FontClass.c \ + CursorShapeClass.c \ + VariableClass.c \ + OriginalValue.c \ + BooleanVariableClass.c \ + IntegerVariableClass.c \ + OctetStringVariableClass.c \ + ObjectRefVariableClass.c \ + ContentRefVariableClass.c \ + PresentableClass.c \ + TokenManagerClass.c \ + Movement.c \ + TokenGroupClass.c \ + TokenGroupItem.c \ + ActionSlot.c \ + ListGroupClass.c \ + VisibleClass.c \ + OriginalBoxSize.c \ + BitmapClass.c \ + LineArtClass.c \ + RectangleClass.c \ + DynamicLineArtClass.c \ + TextClass.c \ + Justification.c \ + LineOrientation.c \ + StartCorner.c \ + StreamClass.c \ + StreamComponent.c \ + Storage.c \ + AudioClass.c \ + VideoClass.c \ + Termination.c \ + RTGraphicsClass.c \ + InteractibleClass.c \ + SliderClass.c \ + Orientation.c \ + SliderStyle.c \ + EntryFieldClass.c \ + InputType.c \ + HyperTextClass.c \ + ButtonClass.c \ + HotspotClass.c \ + PushButtonClass.c \ + SwitchButtonClass.c \ + ButtonStyle.c \ + ActionClass.c \ + ElementaryAction.c \ + Add.c \ + AddItem.c \ + Append.c \ + Call.c \ + CallActionSlot.c \ + Clone.c \ + CloseConnection.c \ + DelItem.c \ + DeselectItem.c \ + Divide.c \ + DrawArc.c \ + DrawLine.c \ + DrawOval.c \ + DrawPolygon.c \ + DrawPolyline.c \ + DrawRectangle.c \ + DrawSector.c \ + Fork.c \ + GetAvailabilityStatus.c \ + GetBoxSize.c \ + GetCellItem.c \ + GetCursorPosition.c \ + GetEngineSupport.c \ + GetEntryPoint.c \ + GetFillColour.c \ + GetFirstItem.c \ + GetHighlightStatus.c \ + GetInteractionStatus.c \ + GetItemStatus.c \ + GetLabel.c \ + GetLastAnchorFired.c \ + GetLineColour.c \ + GetLineStyle.c \ + GetLineWidth.c \ + GetListItem.c \ + GetListSize.c \ + GetOverwriteMode.c \ + GetPortion.c \ + GetPosition.c \ + GetRunningStatus.c \ + GetSelectionStatus.c \ + GetSliderValue.c \ + GetTextContent.c \ + GetTextData.c \ + GetTokenPosition.c \ + GetVolume.c \ + Modulo.c \ + Move.c \ + MoveTo.c \ + Multiply.c \ + OpenConnection.c \ + PutBefore.c \ + PutBehind.c \ + ReadPersistent.c \ + ScaleBitmap.c \ + ScaleVideo.c \ + ScrollItems.c \ + SelectItem.c \ + SendEvent.c \ + SetBoxSize.c \ + SetCachePriority.c \ + SetCounterEndPosition.c \ + SetCounterPosition.c \ + SetCounterTrigger.c \ + SetCursorPosition.c \ + SetCursorShape.c \ + SetData.c \ + SetEntryPoint.c \ + SetFillColour.c \ + SetFirstItem.c \ + SetFontRef.c \ + SetHighlightStatus.c \ + SetInteractionStatus.c \ + SetLabel.c \ + SetLineColour.c \ + SetLineStyle.c \ + SetLineWidth.c \ + SetOverwriteMode.c \ + SetPaletteRef.c \ + SetPortion.c \ + SetPosition.c \ + SetSliderValue.c \ + SetSpeed.c \ + SetTimer.c \ + NewTimer.c \ + SetTransparency.c \ + SetVariable.c \ + SetVolume.c \ + Step.c \ + StorePersistent.c \ + Subtract.c \ + TestVariable.c \ + ToggleItem.c \ + TransitionTo.c \ + ConnectionTagOrNull.c \ + ComparisonValue.c \ + EmulatedEventData.c \ + NewColour.c \ + NewContent.c \ + NewFont.c \ + NewReferencedContent.c \ + NewContentSize.c \ + NewVariableValue.c \ + Parameter.c \ + Point.c \ + Rational.c \ + ObjectReference.c \ + ExternalReference.c \ + IndirectReference.c \ + ContentReference.c \ + GenericObjectReference.c \ + GenericContentReference.c \ + GenericInteger.c \ + GenericBoolean.c \ + GenericOctetString.c \ + Colour.c \ + XYPosition.c + +ASN_MODULE_HEADERS= \ + InterchangedObject.h \ + RootClass.h \ + GroupClass.h \ + StandardIdentifier.h \ + GroupItem.h \ + ApplicationClass.h \ + DefaultAttribute.h \ + FontBody.h \ + SceneClass.h \ + SceneCoordinateSystem.h \ + AspectRatio.h \ + NextScene.h \ + IngredientClass.h \ + ContentBody.h \ + ReferencedContent.h \ + LinkClass.h \ + LinkCondition.h \ + EventType.h \ + EventData.h \ + ProgramClass.h \ + ResidentProgramClass.h \ + RemoteProgramClass.h \ + InterchangedProgramClass.h \ + PaletteClass.h \ + FontClass.h \ + CursorShapeClass.h \ + VariableClass.h \ + OriginalValue.h \ + BooleanVariableClass.h \ + IntegerVariableClass.h \ + OctetStringVariableClass.h \ + ObjectRefVariableClass.h \ + ContentRefVariableClass.h \ + PresentableClass.h \ + TokenManagerClass.h \ + Movement.h \ + TokenGroupClass.h \ + TokenGroupItem.h \ + ActionSlot.h \ + ListGroupClass.h \ + VisibleClass.h \ + OriginalBoxSize.h \ + BitmapClass.h \ + LineArtClass.h \ + RectangleClass.h \ + DynamicLineArtClass.h \ + TextClass.h \ + Justification.h \ + LineOrientation.h \ + StartCorner.h \ + StreamClass.h \ + StreamComponent.h \ + Storage.h \ + AudioClass.h \ + VideoClass.h \ + Termination.h \ + RTGraphicsClass.h \ + InteractibleClass.h \ + SliderClass.h \ + Orientation.h \ + SliderStyle.h \ + EntryFieldClass.h \ + InputType.h \ + HyperTextClass.h \ + ButtonClass.h \ + HotspotClass.h \ + PushButtonClass.h \ + SwitchButtonClass.h \ + ButtonStyle.h \ + ActionClass.h \ + ElementaryAction.h \ + Add.h \ + AddItem.h \ + Append.h \ + Call.h \ + CallActionSlot.h \ + Clone.h \ + CloseConnection.h \ + DelItem.h \ + DeselectItem.h \ + Divide.h \ + DrawArc.h \ + DrawLine.h \ + DrawOval.h \ + DrawPolygon.h \ + DrawPolyline.h \ + DrawRectangle.h \ + DrawSector.h \ + Fork.h \ + GetAvailabilityStatus.h \ + GetBoxSize.h \ + GetCellItem.h \ + GetCursorPosition.h \ + GetEngineSupport.h \ + GetEntryPoint.h \ + GetFillColour.h \ + GetFirstItem.h \ + GetHighlightStatus.h \ + GetInteractionStatus.h \ + GetItemStatus.h \ + GetLabel.h \ + GetLastAnchorFired.h \ + GetLineColour.h \ + GetLineStyle.h \ + GetLineWidth.h \ + GetListItem.h \ + GetListSize.h \ + GetOverwriteMode.h \ + GetPortion.h \ + GetPosition.h \ + GetRunningStatus.h \ + GetSelectionStatus.h \ + GetSliderValue.h \ + GetTextContent.h \ + GetTextData.h \ + GetTokenPosition.h \ + GetVolume.h \ + Modulo.h \ + Move.h \ + MoveTo.h \ + Multiply.h \ + OpenConnection.h \ + PutBefore.h \ + PutBehind.h \ + ReadPersistent.h \ + ScaleBitmap.h \ + ScaleVideo.h \ + ScrollItems.h \ + SelectItem.h \ + SendEvent.h \ + SetBoxSize.h \ + SetCachePriority.h \ + SetCounterEndPosition.h \ + SetCounterPosition.h \ + SetCounterTrigger.h \ + SetCursorPosition.h \ + SetCursorShape.h \ + SetData.h \ + SetEntryPoint.h \ + SetFillColour.h \ + SetFirstItem.h \ + SetFontRef.h \ + SetHighlightStatus.h \ + SetInteractionStatus.h \ + SetLabel.h \ + SetLineColour.h \ + SetLineStyle.h \ + SetLineWidth.h \ + SetOverwriteMode.h \ + SetPaletteRef.h \ + SetPortion.h \ + SetPosition.h \ + SetSliderValue.h \ + SetSpeed.h \ + SetTimer.h \ + NewTimer.h \ + SetTransparency.h \ + SetVariable.h \ + SetVolume.h \ + Step.h \ + StorePersistent.h \ + Subtract.h \ + TestVariable.h \ + ToggleItem.h \ + TransitionTo.h \ + ConnectionTagOrNull.h \ + ComparisonValue.h \ + EmulatedEventData.h \ + NewColour.h \ + NewContent.h \ + NewFont.h \ + NewReferencedContent.h \ + NewContentSize.h \ + NewVariableValue.h \ + Parameter.h \ + Point.h \ + Rational.h \ + ObjectReference.h \ + ExternalReference.h \ + IndirectReference.h \ + ContentReference.h \ + GenericObjectReference.h \ + GenericContentReference.h \ + GenericInteger.h \ + GenericBoolean.h \ + GenericOctetString.h \ + Colour.h \ + XYPosition.h + +ASN_MODULE_HEADERS+=BOOLEAN.h +ASN_MODULE_SOURCES+=BOOLEAN.c +ASN_MODULE_HEADERS+=ENUMERATED.h +ASN_MODULE_SOURCES+=ENUMERATED.c +ASN_MODULE_HEADERS+=INTEGER.h +ASN_MODULE_SOURCES+=INTEGER.c +ASN_MODULE_HEADERS+=NULL.h +ASN_MODULE_SOURCES+=NULL.c +ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h +ASN_MODULE_SOURCES+=asn_SEQUENCE_OF.c +ASN_MODULE_HEADERS+=asn_SET_OF.h +ASN_MODULE_SOURCES+=asn_SET_OF.c +ASN_MODULE_HEADERS+=constr_CHOICE.h +ASN_MODULE_SOURCES+=constr_CHOICE.c +ASN_MODULE_HEADERS+=constr_SEQUENCE.h +ASN_MODULE_SOURCES+=constr_SEQUENCE.c +ASN_MODULE_HEADERS+=constr_SEQUENCE_OF.h +ASN_MODULE_SOURCES+=constr_SEQUENCE_OF.c +ASN_MODULE_HEADERS+=constr_SET_OF.h +ASN_MODULE_HEADERS+=constr_SET.h +ASN_MODULE_SOURCES+=constr_SET.c +ASN_MODULE_SOURCES+=constr_SET_OF.c +ASN_MODULE_HEADERS+=asn_application.h +ASN_MODULE_HEADERS+=asn_system.h +ASN_MODULE_HEADERS+=asn_codecs.h +ASN_MODULE_HEADERS+=asn_internal.h +ASN_MODULE_HEADERS+=OCTET_STRING.h +ASN_MODULE_SOURCES+=OCTET_STRING.c +ASN_MODULE_HEADERS+=BIT_STRING.h +ASN_MODULE_SOURCES+=BIT_STRING.c +ASN_MODULE_SOURCES+=asn_codecs_prim.c +ASN_MODULE_HEADERS+=asn_codecs_prim.h +ASN_MODULE_HEADERS+=ber_tlv_length.h +ASN_MODULE_SOURCES+=ber_tlv_length.c +ASN_MODULE_HEADERS+=ber_tlv_tag.h +ASN_MODULE_SOURCES+=ber_tlv_tag.c +ASN_MODULE_HEADERS+=ber_decoder.h +ASN_MODULE_SOURCES+=ber_decoder.c +ASN_MODULE_HEADERS+=der_encoder.h +ASN_MODULE_SOURCES+=der_encoder.c +ASN_MODULE_HEADERS+=constr_TYPE.h +ASN_MODULE_SOURCES+=constr_TYPE.c +ASN_MODULE_HEADERS+=constraints.h +ASN_MODULE_SOURCES+=constraints.c +ASN_MODULE_HEADERS+=xer_support.h +ASN_MODULE_SOURCES+=xer_support.c +ASN_MODULE_HEADERS+=xer_decoder.h +ASN_MODULE_SOURCES+=xer_decoder.c +ASN_MODULE_HEADERS+=xer_encoder.h +ASN_MODULE_SOURCES+=xer_encoder.c + + +lib_LTLIBRARIES=libsomething.la +libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) + +# This file may be used as an input for make(3) +# Remove the lines below to convert it into a pure .am file +TARGET = mheg5dump +CFLAGS += -I. -DHAVE_CONFIG_H +OBJS=${ASN_MODULE_SOURCES:.c=.o} $(TARGET).o + +all: $(TARGET) + +$(TARGET): ${OBJS} + $(CC) $(CFLAGS) -o $(TARGET) ${OBJS} $(LDFLAGS) $(LIBS) + +.SUFFIXES: +.SUFFIXES: .c .o + +.c.o: + $(CC) $(CFLAGS) -o $@ -c $< + +clean: + rm -f $(TARGET) + rm -f $(OBJS) + +regen: regenerate-from-asn1-source + +regenerate-from-asn1-source: + ../../asn1c/asn1c -S ../../skeletons -fcompound-names ../ISO13522-MHEG-5.asn + + +../ISO13522-MHEG-5.asn: + @echo The ../ISO13522-MHEG-5.asn file is not yet present. + @echo Please read the README file on how to obtain this file. + @exit 42 + +InterchangedObject.c: ../ISO13522-MHEG-5.asn regenerate.Makefile + ./regenerate.Makefile + @touch InterchangedObject.c + make + +ASN_DECODER_TEMPLATE=../../skeletons/asn-decoder-template.c +$(TARGET).o: $(ASN_DECODER_TEMPLATE) + $(CC) $(CFLAGS) -Dasn_DEF=asn_DEF_InterchangedObject -o $(TARGET).o -c $(ASN_DECODER_TEMPLATE) + +distclean: clean + rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) + rm -f Makefile.am.sample diff --git a/examples/sample.source.MHEG5/README b/examples/sample.source.MHEG5/README new file mode 100644 index 000000000..2fe89c1e8 --- /dev/null +++ b/examples/sample.source.MHEG5/README @@ -0,0 +1,48 @@ + +GENERAL INFORMATION +=================== + +The ISO MHEG-5 (Multimedia Hypermedia Experts Group, +Multimedia Presentations) decoder. + +Invoking `make` will compile the ASN.1 specifications from the +../ISO13522-MHEG-5.asn file. + +THERE IS NO ISO13522-MHEG-5.asn FILE THERE YET! + +OBTAINING THE MHEG-5 SPECIFICATION +================================== + +To obtain the MHEG-5 ASN.1 specification, you should go to + http://www.itu.int/ITU-T/asn1/database/itu-t/t/t172 +and select the latest "Text" version of the corresponding ASN.1 module. + +After obtaining the ISO13522-MHEG-5.asn, type `make` in the directory +containing this README file. + +mheg5dump USAGE +=============== + +The mheg5dump utility may be used to dump the contents of the BER-encoded +MHEG-5 data record file: + + ./mheg5dump -x tapfile.der # Print as XML (BASIC-XER) + +If necessary, a straightforward modification of the + ../../skeletons/asn-decoder-template.c +will allow you to build a converter from the XML (XER) MHEG-5 format +back into binary (BER). + +The full list of recognized command line options may be obtained with + + > ./mheg5dump -h + Usage: ./mheg5dump [options] ... + Where options are: + -b Set the i/o buffer size (default is 8192) + -c Check ASN.1 constraints after decoding + -d Enable debugging (-dd is even better) + -n Process files times + -s Set the stack usage limit + -p Print out the decoded contents + -x Print out as XML + From f3a30d3da0085f6749378c9f9fddc12e1d80f5af Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 13 Apr 2005 13:29:10 +0000 Subject: [PATCH 0869/1469] this also git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@869 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.MHEG5/config.h | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 examples/sample.source.MHEG5/config.h diff --git a/examples/sample.source.MHEG5/config.h b/examples/sample.source.MHEG5/config.h new file mode 100644 index 000000000..2dda9297a --- /dev/null +++ b/examples/sample.source.MHEG5/config.h @@ -0,0 +1,10 @@ + +extern int opt_debug; + +#define ASN_DEBUG(fmt, args...) do { \ + if(opt_debug < 2) break; \ + fprintf(stderr, fmt, ##args); \ + fprintf(stderr, " (%s:%d)\n", \ + __FILE__, __LINE__); \ + } while(0) + From 1d7a3d8db207c4b44f12ab4c684e574a2cc25cbe Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 13 Apr 2005 14:53:04 +0000 Subject: [PATCH 0870/1469] not supported variadic macros git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@870 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/GeneralizedTime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index f52aec746..9c0ed7dc3 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -33,7 +33,7 @@ static struct tm *gmtime_r(const time_t *tloc, struct tm *result) { } #define tzset() _tzset() -#define putenv() _putenv() +#define putenv _putenv #define _EMULATE_TIMEGM #endif /* WIN32 */ From 711e8d28a7247bc6014eeaeda8fee8835d4fa16c Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 15 Apr 2005 08:48:27 +0000 Subject: [PATCH 0871/1469] no explicit assert git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@871 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/xer_encoder.c | 1 - 1 file changed, 1 deletion(-) diff --git a/skeletons/xer_encoder.c b/skeletons/xer_encoder.c index 5fb0de689..5207d28e3 100644 --- a/skeletons/xer_encoder.c +++ b/skeletons/xer_encoder.c @@ -4,7 +4,6 @@ */ #include #include -#include #include /* From 2169592d64c2f24327d03bb8efe15f7acd0b0447 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 15 Apr 2005 08:49:32 +0000 Subject: [PATCH 0872/1469] no explicit assert.h inclusion git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@872 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/xer_support.c | 1 - 1 file changed, 1 deletion(-) diff --git a/skeletons/xer_support.c b/skeletons/xer_support.c index 14daffb8b..5ba60a040 100644 --- a/skeletons/xer_support.c +++ b/skeletons/xer_support.c @@ -4,7 +4,6 @@ * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ -#include #include #include #include From fa8b7948b93a751bd1828fa40c0184283aba72aa Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 18 Apr 2005 05:41:08 +0000 Subject: [PATCH 0873/1469] removed semicolon to be able to use it in conditional statements git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@873 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OCTET_STRING.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/OCTET_STRING.h b/skeletons/OCTET_STRING.h index 10816358e..a4d5e41fc 100644 --- a/skeletons/OCTET_STRING.h +++ b/skeletons/OCTET_STRING.h @@ -43,7 +43,7 @@ xer_type_encoder_f OCTET_STRING_encode_xer_utf8; int OCTET_STRING_fromBuf(OCTET_STRING_t *s, const char *str, int size); /* Handy conversion from the C string into the OCTET STRING. */ -#define OCTET_STRING_fromString(s, str) OCTET_STRING_fromBuf(s, str, -1); +#define OCTET_STRING_fromString(s, str) OCTET_STRING_fromBuf(s, str, -1) /* * Allocate and fill the new OCTET STRING and return a pointer to the newly From ad96ab21937aa48cbd121998900dc5c278323aa6 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 19 Apr 2005 09:19:17 +0000 Subject: [PATCH 0874/1469] assert.h only for internal files git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@874 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_internal.h | 4 ++++ skeletons/asn_system.h | 3 --- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/skeletons/asn_internal.h b/skeletons/asn_internal.h index c2aa9e514..22011efa9 100644 --- a/skeletons/asn_internal.h +++ b/skeletons/asn_internal.h @@ -13,6 +13,10 @@ int get_asn1c_environment_version(void); /* Run-time version */ #include /* Application-visible API */ +#ifndef __NO_ASSERT_H__ /* Include assert.h only for internal use. */ +#include /* for assert() macro */ +#endif + #define CALLOC(nmemb, size) calloc(nmemb, size) #define MALLOC(size) malloc(size) #define REALLOC(oldptr, size) realloc(oldptr, size) diff --git a/skeletons/asn_system.h b/skeletons/asn_system.h index 2f4d7980d..5a5eb9bfb 100644 --- a/skeletons/asn_system.h +++ b/skeletons/asn_system.h @@ -18,9 +18,6 @@ #include /* For size_t */ #include /* For va_start */ #include /* for offsetof and ptrdiff_t */ -#ifndef __NO_ASSERT_H__ -#include /* for assert() macro */ -#endif #ifdef WIN32 From 82abba82cd105665c41b5dd76844bab8a38e8d2a Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 25 Apr 2005 19:38:21 +0000 Subject: [PATCH 0875/1469] streamed OCTET STRING allocation problem git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@875 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 51 ++++++++++++++++++---------------- skeletons/OCTET_STRING.c | 60 +++++++++++++++++++++------------------- 2 files changed, 59 insertions(+), 52 deletions(-) diff --git a/ChangeLog b/ChangeLog index 31e8c5fdf..2ddf62d64 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9.13: 2005-Mar-28 +0.9.13: 2005-Apr-24 * Added extra const qualifiers into the support code. * More RFC variations supported in crfc2asn1.pl. @@ -9,6 +9,9 @@ * Support for CharsDefn (Quadruple and Tuple, most used in ASN1-CHARACTER-MODULE) (Test case 80). * Pretty-printing support for WITH COMPONENT[S]. (Test case 82). + * Streamed OCTET STRING decoding of large values: fixed allocation + problem introduced in 0.9.9. (Severity: high; Security impact: medium) + Reported by Yann Grossel . 0.9.12: 2005-Mar-10 @@ -19,12 +22,12 @@ * Relaxed XER processing rules to skip extra whitespace in some more places. It also skips XML comments (although XML comments in XER are prohibited by X.693, #8.2.1). - (Test case 70) (Severity: medium, Security impact: none) + (Test case 70) (Severity: medium; Security impact: none) Reported by . * Constraints on primitive types being defined are now supported. - (Test case 74) (Severity: low, Security impact: none) + (Test case 74) (Severity: low; Security impact: none) * XMLValueList generation fixed for CHOICE type. - (Severity: medium, Security impact: none) + (Severity: medium; Security impact: none) * Added the GSM TAP3 decoder into ./examples/sample.source.TAP3 0.9.11: 2005-Mar-04 @@ -75,10 +78,10 @@ identifiers (./tests/68-*-OK.asn1). * ber_dec_rval_t renamed into asn_dec_rval_t: more generality. * Extensions in CHOICE types are properly marked as non-pointers - (Test case 59) (Severity: medium, Security impact: medium) + (Test case 59) (Severity: medium; Security impact: medium) Reported by . * Tagged CHOICE type is now supported again. - (Test case 59) (Severity: low, Security impact: low) + (Test case 59) (Severity: low; Security impact: low) Reported by . * Implemented der_encode_to_buffer() procedure. @@ -99,9 +102,9 @@ optionals-laden indefinite length structure. The code was previously refusing to parse such structures. * Fixed explicitly tagged ANY type encoding and decoding - (Severity: medium, Security impact: low). + (Severity: medium; Security impact: low). * Fixed CHOICE code spin when indefinite length structures appear - in the extensions (Severity: medium, Security impact: medium). + in the extensions (Severity: medium; Security impact: medium). Reported by . * BIT STRING now stores the number of unused octets in a separate field. @@ -117,11 +120,11 @@ * Added -fno-constraints option to asn1c, which disabled generation of ASN.1 subtype constraints checking code. * Added ASN1C_ENVIRONMENT_VERSION and get_asn1c_environment_version(). - * Fixed ANY type decoding (Severity: high, Security impact: low). + * Fixed ANY type decoding (Severity: high; Security impact: low). * Fixed BER decoder restartability problem with certain primitive types (BOOLEAN, INTEGER, and REAL). The problem occured when the encoding of such type is split between several bytes. - (Severity: high, Security impact: low) + (Severity: high; Security impact: low) * Support for cross-referencing type definitions (updated ./tests/43-*). * Fixed pretty-printing of the REAL type. Added lots of test cases. * Renamed asn1_* into asn_* in function and type names. @@ -134,7 +137,7 @@ encoding must be tagged by stripping off the outer tag for each subsequent containment level. See also X.690: 8.21.5.4 and the "Spouse" case in A.3. - (Severity: medium, Security impact: low) + (Severity: medium; Security impact: low) * Added converters between any generic type and the ANY type. * Parser fixed: Information Object Class fields may be taged. * Parser fixed: tagged types inside SEQUENCE OF/SET OF support. @@ -153,7 +156,7 @@ * Explicit support for ANY type decoding. * Refactored tags processing code. * Fixed constraints checking code: non-exploitable buffer overflow. - (Severity: medium, Security impact: low) + (Severity: medium; Security impact: low) 0.9.3: 2004-Sep-07 @@ -189,7 +192,7 @@ 0.8.19: 2004-Aug-18 * Fixed BER encoder (problem encoding large tag values) - (Severity: medium, Security impact: low) + (Severity: medium; Security impact: low) 0.8.18: 2004-Aug-12 @@ -205,16 +208,16 @@ 0.8.16: 2004-Jul-22 * Fixed application-level problem in SET OF/SEQUENCE OF array cleanup. - (Severity: medium, Security impact: low) + (Severity: medium; Security impact: low) * Improved asn_GT2time() and added asn_time2{GT,UT}() functions. * BIT STRING pretty-printing. 0.8.15: 2004-Jul-20 * Fixed parser: memory leak in free_struct code for SET OF/SEQUENCE OF. - (Severity: high, Security impact: medium) + (Severity: high; Security impact: medium) * Fixed parser: invalid memory reference in code constructing tags. - (Test case 48) (Severity: high, Security impact: medium) + (Test case 48) (Severity: high; Security impact: medium) When encoding data for certain ASN.1 specifications containing explicit tags, the tag is always written incorrectly due to incorrect memory reference. The encoding will almost always produce @@ -231,13 +234,13 @@ * Fixed compiler: extensibility of CHOICE and SET type has not been taken into account during table construction. - (Test case 47) (Severity: high, Security impact: low) + (Test case 47) (Severity: high; Security impact: low) 0.8.13: 2004-Jun-29 * Fixed compiler: the skip values for IMPLICIT tagging were broken in some complex cases where one type is defined using another. - (Test case 46) (Severity: medium, Security impact: low). + (Test case 46) (Severity: medium; Security impact: low). * Added -fknown-extern-type command line parameter to asn1c. * Removed -N command line flag and underlying functionality to honor KISS principle. @@ -249,7 +252,7 @@ size of an integer must be provided explicitly. See {OBJECT_IDENTIFIER|RELATIVE_OID}_{get|set}_arcs(). * SEQUENCE BER decoder fixed again for complex CHOICE case - (Test case 44) (Severity: medium, Security impact: low). + (Test case 44) (Severity: medium; Security impact: low). 0.8.11: 2004-Jun-05 @@ -274,7 +277,7 @@ * Fixed compiler. If the last member of the SEQUENCE is OPTIONAL and absent in the encoding, and the type is extensible (...) or EXTENSIBILITY IMPLIED flag is set, then the structure could not - be correctly decoded. (Severity: high, Security impact: low). + be correctly decoded. (Severity: high; Security impact: low). * Compiler: fixed recursive ASN.1 types inclusion (Severity: low, Security impact: none). * Parser: IMPORTS/FROM fixes, now allowing multiple sections. @@ -285,7 +288,7 @@ * Fixed SEQUENCE BER decoder: if the last member of the SEQUENCE is OPTIONAL and absent in the encoding, RC_FAIL was returned instead - of RC_OK (Severity: high, Security impact: low). + of RC_OK (Severity: high; Security impact: low). * Added test case to check the above problem. * Added test case to check -fnative-integers mode. @@ -295,7 +298,7 @@ 0.8.5: 2004-Mar-28 T-version-0-8-5 - * Fixed ber_tlv_length() computation problem (Severity: blocker, + * Fixed ber_tlv_length() computation problem (Severity: high, Security impact: none). Reported by @@ -307,9 +310,9 @@ 0.8.3: 2004-Mar-14 T-version-0-8-3 * Fixed SET::BER decoder: restart after reaching a buffer boundary - weas broken (Severity: blocker, Security impact: low). + weas broken (Severity: high; Security impact: low). * Fixed OCTET STRING::BER decoder: restart after reaching a buffer - boundary was broken (Severity: blocker, Security impact: low). + boundary was broken (Severity: high; Security impact: low). Reported by * Added test cases to check decoders restartability. * Slightly more general INTEGER2long decoder. diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 23118e33c..57e17afea 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -1,5 +1,6 @@ /*- - * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Copyright (c) 2003, 2004, 2005 Lev Walkin . + * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include @@ -42,53 +43,56 @@ asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { #undef _CH_PHASE #undef NEXT_PHASE #undef PREV_PHASE -#define _CH_PHASE(ctx, inc) do { \ - if(ctx->phase == 0) \ - ctx->step = 0; \ - ctx->phase += inc; \ +#define _CH_PHASE(ctx, inc) do { \ + if(ctx->phase == 0) \ + ctx->context = 0; \ + ctx->phase += inc; \ } while(0) #define NEXT_PHASE(ctx) _CH_PHASE(ctx, +1) #define PREV_PHASE(ctx) _CH_PHASE(ctx, -1) #undef ADVANCE -#define ADVANCE(num_bytes) do { \ - size_t num = (num_bytes); \ - buf_ptr = ((const char *)buf_ptr) + num;\ - size -= num; \ - consumed_myself += num; \ +#define ADVANCE(num_bytes) do { \ + size_t num = (num_bytes); \ + buf_ptr = ((const char *)buf_ptr) + num; \ + size -= num; \ + consumed_myself += num; \ } while(0) #undef RETURN -#define RETURN(_code) do { \ - rval.code = _code; \ - rval.consumed = consumed_myself;\ - return rval; \ +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself; \ + return rval; \ } while(0) #undef APPEND #define APPEND(bufptr, bufsize) do { \ - size_t _bs = (bufsize); \ - size_t _ns = ctx->step; /* Allocated */ \ - if(_ns <= (size_t)(st->size + _bs)) { \ + size_t _bs = (bufsize); /* Append size */ \ + size_t _ns = ctx->context; /* Allocated now */ \ + size_t _es = st->size + _bs; /* Expected size */ \ + /* int is really a typeof(st->size): */ \ + if((int)_es < 0) RETURN(RC_FAIL); \ + if(_ns <= _es) { \ void *ptr; \ /* Be nice and round to the memory allocator */ \ - do { _ns = _ns ? _ns<<2 : 16; } \ - while(_ns <= (size_t)(st->size + _bs)); \ + do { _ns = _ns ? _ns << 1 : 16; } \ + while(_ns <= _es); \ + /* int is really a typeof(st->size): */ \ + if((int)_ns < 0) RETURN(RC_FAIL); \ ptr = REALLOC(st->buf, _ns); \ if(ptr) { \ st->buf = (uint8_t *)ptr; \ - ctx->step = _ns; \ + ctx->context = _ns; \ } else { \ RETURN(RC_FAIL); \ } \ + ASN_DEBUG("Reallocating into %ld", _ns); \ } \ memcpy(st->buf + st->size, bufptr, _bs); \ - st->size += _bs; \ - if(st->size < 0) \ - /* Why even care?.. JIC */ \ - RETURN(RC_FAIL); \ /* Convenient nul-termination */ \ - st->buf[st->size] = '\0'; \ + st->buf[_es] = '\0'; \ + st->size = _es; \ } while(0) /* @@ -455,19 +459,19 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, if(size < (size_t)ctx->left) { if(!size) RETURN(RC_WMORE); - if(type_variant == _TT_BIT_STRING && ctx->step == 0) { + if(type_variant == _TT_BIT_STRING && !ctx->context) { st->bits_unused = *(const uint8_t *)buf_ptr; ctx->left--; ADVANCE(1); } APPEND(buf_ptr, size); - assert(ctx->step); + assert(ctx->context > 0); ctx->left -= size; ADVANCE(size); RETURN(RC_WMORE); } else { if(type_variant == _TT_BIT_STRING - && ctx->step == 0 && ctx->left) { + && !ctx->context && ctx->left) { st->bits_unused = *(const uint8_t *)buf_ptr; ctx->left--; ADVANCE(1); From 0919fcca82378c887236bde972992ee52ad9127d Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 25 Apr 2005 21:08:25 +0000 Subject: [PATCH 0876/1469] BASIC-XER value printing fixed for REAL values git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@876 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 1 + skeletons/REAL.c | 14 +++++++++++--- skeletons/tests/check-REAL.c | 33 +++++++++++++++++++++++---------- 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2ddf62d64..f32766b43 100644 --- a/ChangeLog +++ b/ChangeLog @@ -12,6 +12,7 @@ * Streamed OCTET STRING decoding of large values: fixed allocation problem introduced in 0.9.9. (Severity: high; Security impact: medium) Reported by Yann Grossel . + * Fixed BASIC-XER encoding of REAL numbers. 0.9.12: 2005-Mar-10 diff --git a/skeletons/REAL.c b/skeletons/REAL.c index 92b42d2ad..6ec6b6e90 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -187,16 +187,24 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) */ char *end = buf + buflen; char *last_zero = end; + int stoplooking = 0; char *z; for(z = end - 1; z > buf; z--) { switch(*z) { - case 0x030: - last_zero = z; + case 0x30: + if(!stoplooking) + last_zero = z; + continue; case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: + stoplooking = 1; continue; default: /* Catch dot and other separators */ - *z = 0x2e; /* Replace possible comma */ + /* + * Replace possible comma (which may even + * be not a comma at all: locale-defined). + */ + *z = 0x2e; if(last_zero == z + 1) { /* leave x.0 */ last_zero++; } diff --git a/skeletons/tests/check-REAL.c b/skeletons/tests/check-REAL.c index dc8de2672..e29df5009 100644 --- a/skeletons/tests/check-REAL.c +++ b/skeletons/tests/check-REAL.c @@ -44,24 +44,26 @@ check_str_repr(double d, const char *sample, const char *canonical_sample) { reconstructed[1][s2] = '\0'; if(sample) { - printf("Checking [%s] against [%s]\n", - reconstructed[0], sample); + printf("Checking %f->[%s] against [%s]%s\n", + d, reconstructed[0], sample, + canonical_sample ? " (canonical follows...)" : "" + ); assert(!strcmp(reconstructed[0], sample)); } if(canonical_sample) { - printf("Checking [%s] against [%s] (canonical)\n", - reconstructed[1], canonical_sample); + printf("Checking %f->[%s] against [%s] (canonical)\n", + d, reconstructed[1], canonical_sample); assert(!strcmp(reconstructed[1], canonical_sample)); } } static void -check(REAL_t *rn, double orig_dbl, const char *sample, const char *canonical_sample) { +check_impl(REAL_t *rn, double orig_dbl, const char *sample, const char *canonical_sample, int line) { double val; uint8_t *p, *end; int ret; - printf("double value %.12f [", orig_dbl); + printf("Line %d: double value %.12f [", line, orig_dbl); for(p = (uint8_t *)&orig_dbl, end = p + sizeof(double); p < end ; p++) printf("%02x", *p); printf("] (ilogb %d)\n", ilogb(orig_dbl)); @@ -201,6 +203,9 @@ check_xer(int fuzzy, double orig_value) { assert(memcmp(newst1->buf, st.buf, st.size) == 0); } +#define check(rn, d, str1, str2) \ + check_impl(rn, d, str1, str2, __LINE__) + int main() { REAL_t rn; @@ -215,8 +220,11 @@ main() { check(&rn, -1.0/zero, "", ""); check(&rn, 1.0, "1.0", "1.0E0"); check(&rn, -1.0, "-1.0", "-1.0E0"); - check(&rn, 1.5, "1.5", "1.5E0"); check(&rn, 0.1, "0.1", "1.0E-1"); + check(&rn, 0.01, "0.01", "1.0E-2"); + check(&rn, 0.02, "0.02", "2.0E-2"); + check(&rn, 0.09, "0.09", "9.0E-2"); + check(&rn, 1.5, "1.5", "1.5E0"); check(&rn, 0.33333, "0.33333", "3.3333E-1"); check(&rn, 2, "2.0", "2.0E0"); check(&rn, 2.1, "2.1", "2.1E0"); @@ -229,9 +237,14 @@ main() { check(&rn, -3.14159265, "-3.14159265", "-3.14159265E0"); check(&rn, 14159265.0, "14159265.0", "1.4159265E7"); check(&rn, -123456789123456789.0, "-123456789123456784.0", "-1.234567891234568E17"); - check(&rn, 0.00000000001, "0.0", "9.999999999999999E-12"); - check(&rn, 0.00000000002, "0.0", "2.0E-11"); - check(&rn, 0.00000000009, "0.0", "9.0E-11"); + check(&rn, 0.00000000001, "0.00000000001", "9.999999999999999E-12"); + check(&rn, 0.00000000002, "0.00000000002", "2.0E-11"); + check(&rn, 0.00000000009, "0.00000000009", "9.0E-11"); + check(&rn, 0.000000000002, "0.000000000002", "2.0E-12"); + check(&rn, 0.0000000000002, "0.0000000000002", "2.0E-13"); + check(&rn, 0.00000000000002, "0.00000000000002", "2.0E-14"); + check(&rn, 0.000000000000002, "0.000000000000002", "2.0E-15"); + check(&rn, 0.0000000000000002, "0.0", "2.0E-16"); check(&rn, 0.0000000000000000000001, "0.0", "1.0E-22"); check(&rn, 0.000000000000000000000000000001, "0.0", "1.0E-30"); /* proved 2B a problem */ check(&rn,-0.000000000000000000000000000001, "-0.0", "-1.0E-30"); /* proved 2B a problem */ From 48c3cc33a46edab03cc093ea7ef56956e1d802f0 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 28 Apr 2005 02:55:35 +0000 Subject: [PATCH 0877/1469] binary decoders git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@877 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/webcgi/asn1c.cgi | 141 +++++++++++++++++++++++++++++++++-------- 1 file changed, 115 insertions(+), 26 deletions(-) diff --git a/asn1c/webcgi/asn1c.cgi b/asn1c/webcgi/asn1c.cgi index 07966774f..3a39df0fa 100755 --- a/asn1c/webcgi/asn1c.cgi +++ b/asn1c/webcgi/asn1c.cgi @@ -47,6 +47,56 @@ use CGI qw/param cookie header upload escapeHTML/; $|=1; # Enable AutoFlush (for older versions of Perl) +my %binaryDecoders = ( + x509 => { order => 1, + type => 'X.509 Certificate', + typeExt => 'X.509 Certificate', + exe => 'x509dump', + cmdopts => '-x', + msg => '' + }, + + tap0311 => { order => 2, + type => TAP3, + typeExt => 'GSM TAP3-11 data', + exe => 'tap3dump-11', + cmdopts => '-x', + msg => '' + }, + + tap0310 => { order => 3, + type => TAP3, + typeExt => 'GSM TAP3-10 data', + exe => 'tap3dump-10', + cmdopts => '-x', + msg => '' + }, + + tap0309 => { order => 4, + type => TAP3, + typeExt => 'GSM TAP3-09 data', + exe => 'tap3dump-09', + cmdopts => '-x', + msg => '' + }, + + mheg5 => { order => 5, + type => 'MHEG-5', + typeExt => 'ISO MHEG-5 data', + exe => 'mheg5dump', + cmdopts => '-x', + msg => '' + }, + + ber => { order => 6, + type => BER, + typeExt => 'BER encoded data', + exe => 'unber', + cmdopts => '', + msg => "\n" + } +); + my $redirect = ''; # No redirection by default my $redirect_bottom = ''; # No redirection text by default my $content = ''; # Default content is empty @@ -412,33 +462,54 @@ if($#gotSafeNames >= 0) { . "; ec=\$?; echo \$ec > $sandbox/+ExitCode" . "; exit \$ec"; - my $ec = (256 * $DataERR); # Simulate EX_DATAERR my $fType = param('fileType'); + $fType = 'auto' unless $fType; # Compile as ASN.1 text - if($fType ne 'ber') { - $ec = system($CompileASN); + if($fType eq 'auto' || $fType eq 'asn1') { + my $ec = system($CompileASN); bark("Failed to initiate compilation process: $!") if(!-r $sandbox . '/+ExitCode'); + if($ec != (256 * $DataERR)) { + makeArchive($TMPDIR, $sandbox) unless $ec; + goto REGET; # Issue a clean GET request. + } } - if($ec == (256 * $DataERR) and $fType ne 'asn') { - # Unrecognized ASN.1 module format. - # Try out BER decoding. - my $uec = system("$SUIDHelper $TMPDIR $inChDir unber @gotSafeNames > $TMPDIR/$inChDir/+UNBER.tmp 2>&1"); - if(($uec == 0 or $fType eq 'ber') - and open(U, "> $TMPDIR/$inChDir/+UNBER")) { - my $fnames = escapeHTML(join(", ", @gotNames)); - open(T, "< $TMPDIR/$inChDir/+UNBER.tmp"); - print U "\n"; - print U while ; + # Unrecognized ASN.1 module format. + # Try out several BER decoders. + foreach my $t (sort { $binaryDecoders{$a} cmp $binaryDecoders{$b} } + keys %binaryDecoders) { + next unless ($fType eq 'auto' or $fType eq $t); + my %dec = %{$binaryDecoders{$t}}; + my $ec = system("$SUIDHelper $TMPDIR $inChDir $dec{exe} $dec{cmdopts} @gotSafeNames > $TMPDIR/$inChDir/+UNBER.tmp 2>&1"); + next if ($ec != 0 and $t ne $fType + and (-s "$TMPDIR/$inChDir/+UNBER.tmp" < 1000)); + last unless open(U, "> $TMPDIR/$inChDir/+UNBER"); + my $fnames = escapeHTML(join(", ", @gotNames)); + print U "\n" + . $dec{msg}; + open(T, "< $TMPDIR/$inChDir/+UNBER.tmp"); + print U while ; + close(U); + close(T); + open(U, "> $TMPDIR/$inChDir/+UNBER.TYPE"); + print U $dec{typeExt}; + close(U); + if($ec) { + # Indicate unclean exit. + open(U, "> $TMPDIR/$inChDir/+UNBER.EXIT"); + print U $ec; close(U); - close(T); } - unlink("$TMPDIR/$inChDir/+UNBER.tmp"); - } else { - makeArchive($TMPDIR, $sandbox); + last; } + unlink("$TMPDIR/$inChDir/+UNBER.tmp"); + +REGET: + if($ENV{REQUEST_METHOD} ne 'GET') { print "Status: 303 See Other\n"; print "Location: $myName\n"; @@ -461,8 +532,13 @@ $form = . "" . "" . "" . "" @@ -571,13 +647,26 @@ foreach my $trans (sort { $b cmp $a } @transactions) { if($ec eq "0") { $results = "" . "Compiled OK
    \n"; - } elsif(-f $sessionDir . '/' . $trans . '/+UNBER') { - my $msg = 'This looks like a BER-encoded data'; - $msg = "Treating input as BER-encoded data" if $ec eq ''; + } elsif(open(U, $sessionDir . '/' . $trans . '/+UNBER.TYPE')) { + my $type = ; close(U); + my $msg; + if($ec eq '') { + $msg = 'Treating input as ' . $type; + } else { + $msg = 'This looks like ' . $type; + } $results = "$msg
    \n"; - $resText = "Show BER structure"; + if(-f $sessionDir . '/' . $trans . '/+UNBER.EXIT') { + $results = "" + . "$type: " + . "Broken encoding
    \n"; + $ec = 'broken-input'; + $resText = "Show $type decoding attempt"; + } else { + $ec = 0; + $resText = "Show $type contents"; + } $resCode = "unber"; - $ec = 0; } else { my $why = $ec; $why = "Broken input file" if $ec == $DataERR; @@ -648,7 +737,7 @@ foreach my $trans (sort { $b cmp $a } @transactions) { $history .= "" . "$tNum" - . "
    [[Bottom line: ASN.1 compiler was unable to process some of the input.
    " . "This is typically caused by syntax errors in the input files.\n" . "Such errors are normally fixed by removing or adding a couple of characters in the ASN.1 module.
    \n" - . "
    Please consider clicking on the appropriate "Help me fix it!" button above.
    \n" + . "
    ⇒ Please consider clicking on the appropriate "Help me fix it!" button above.
    \n" . "An email will be sent to a live person who will fix the ASN.1 module for you. (The typical turn-around time is less than 24 hours.)\n" . "
    This is free, and highly advisable.\n" . "
    Your request will help us make a better compiler!\n" @@ -725,7 +814,7 @@ $content .= . "$history \n" . "" . "Privacy Note: this page is tailored " - . "to your browser using a cryprographically strong cookie. " + . "to your browser. " . "Other users will see their own (different) data. " . "(
    Read more...)" . ""; From ceb458ff2461911034d92367748afef2d8ab0204 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 28 Apr 2005 02:59:51 +0000 Subject: [PATCH 0878/1469] reorganizing output method git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@878 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn-decoder-template.c | 36 +++++++++++++++++++------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/skeletons/asn-decoder-template.c b/skeletons/asn-decoder-template.c index 76559d10d..4a53bc94d 100644 --- a/skeletons/asn-decoder-template.c +++ b/skeletons/asn-decoder-template.c @@ -30,7 +30,11 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *asnTypeOfPDU, static int opt_check; /* -c */ static int opt_print; /* -p */ static int opt_stack; /* -s */ -static int opt_toxml; /* -x */ +static enum output_method { + OUT_NONE, /* No pretty-printing */ + OUT_PRINT, /* -p flag */ + OUT_XML, /* -x flag */ +} opt_ometh; /* -p or -x */ #define DEBUG(fmt, args...) do { \ if(!opt_debug) break; \ @@ -76,8 +80,7 @@ main(int ac, char **av) { } break; case 'p': - opt_toxml = 0; /* Override '-x' */ - opt_print++; + opt_ometh = OUT_PRINT; break; case 's': opt_stack = atoi(optarg); @@ -89,8 +92,7 @@ main(int ac, char **av) { } break; case 'x': - opt_print = 0; /* Override '-p' */ - opt_toxml++; + opt_ometh = OUT_XML; break; case 'h': default: @@ -121,7 +123,7 @@ main(int ac, char **av) { } #ifdef ASN_DECODER_DEFAULT_OUTPUT_XML - if(!opt_print) opt_toxml++; + if(opt_ometh == OUT_NONE) opt_ometh = OUT_XML; #endif setvbuf(stdout, 0, _IOLBF, 0); @@ -145,14 +147,20 @@ main(int ac, char **av) { exit(EX_DATAERR); } - fprintf(stderr, "%s: decoded successfully\n", fname); - - if(opt_print) asn_fprint(stdout, pduType, structure); - - if(opt_toxml - && xer_fprint(stdout, pduType, structure)) { - fprintf(stderr, "%s: Cannot convert into XML\n", fname); - exit(EX_UNAVAILABLE); + switch(opt_ometh) { + case OUT_NONE: + fprintf(stderr, "%s: decoded successfully\n", fname); + break; + case OUT_PRINT: /* -p */ + asn_fprint(stdout, pduType, structure); + break; + case OUT_XML: /* -x */ + if(xer_fprint(stdout, pduType, structure)) { + fprintf(stderr, "%s: Cannot convert into XML\n", + fname); + exit(EX_UNAVAILABLE); + } + break; } /* Check ASN.1 constraints */ From 551126778f24ba820a0928cb0184d278b4fe7070 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 28 Apr 2005 03:05:55 +0000 Subject: [PATCH 0879/1469] autodependency git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@879 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.PKIX1/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index 8125af7c9..f123183e8 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -337,7 +337,7 @@ TARGET = x509dump CFLAGS += -I. -DHAVE_CONFIG_H OBJS=${ASN_MODULE_SOURCES:.c=.o} $(TARGET).o -all: $(TARGET) +all: Certificate.c $(TARGET) $(TARGET): ${OBJS} $(CC) $(CFLAGS) -o $(TARGET) ${OBJS} $(LDFLAGS) $(LIBS) From 22312193a9560f3ab9e7e76aa714961d8b60a36c Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 28 Apr 2005 03:07:58 +0000 Subject: [PATCH 0880/1469] proper dependency git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@880 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.MHEG5/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/sample.source.MHEG5/Makefile b/examples/sample.source.MHEG5/Makefile index e84e400fb..c61e043db 100644 --- a/examples/sample.source.MHEG5/Makefile +++ b/examples/sample.source.MHEG5/Makefile @@ -439,7 +439,7 @@ TARGET = mheg5dump CFLAGS += -I. -DHAVE_CONFIG_H OBJS=${ASN_MODULE_SOURCES:.c=.o} $(TARGET).o -all: $(TARGET) +all: InterchangedObject.c $(TARGET) $(TARGET): ${OBJS} $(CC) $(CFLAGS) -o $(TARGET) ${OBJS} $(LDFLAGS) $(LIBS) From 6c86bc8deec782e6cdf432db93502a0a26056e8d Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 28 Apr 2005 03:09:34 +0000 Subject: [PATCH 0881/1469] proper deps git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@881 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.TAP3/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/sample.source.TAP3/Makefile b/examples/sample.source.TAP3/Makefile index f990b6d5d..abd99c9fc 100644 --- a/examples/sample.source.TAP3/Makefile +++ b/examples/sample.source.TAP3/Makefile @@ -669,7 +669,7 @@ TARGET = tap3dump CFLAGS += -I. -DHAVE_CONFIG_H OBJS=${ASN_MODULE_SOURCES:.c=.o} $(TARGET).o -all: $(TARGET) +all: DataInterChange.c $(TARGET) $(TARGET): ${OBJS} $(CC) $(CFLAGS) -o $(TARGET) ${OBJS} $(LDFLAGS) $(LIBS) From e4e13e5eb2c0e73c2001f80776b74716349b34e8 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 28 Apr 2005 22:56:36 +0000 Subject: [PATCH 0882/1469] scalbn() -> ldexp() for portability git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@882 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/REAL.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/skeletons/REAL.c b/skeletons/REAL.c index 6ec6b6e90..b0086bc8b 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -460,20 +460,20 @@ asn_REAL2double(const REAL_t *st, double *dbl_value) { end = st->buf + st->size; if(ptr < end) { for(; ptr < end; ptr++) - m = scalbn(m, 8) + *ptr; + m = ldexp(m, 8) + *ptr; } if(0) - ASN_DEBUG("m=%.10f, scF=%d, bF=%d, expval=%d, ldexp()=%f, scalbn()=%f", + ASN_DEBUG("m=%.10f, scF=%d, bF=%d, expval=%d, ldexp()=%f, ldexp()=%f", m, scaleF, baseF, expval, ldexp(m, expval * baseF + scaleF), - scalbn(m, scaleF) * pow(pow(2, baseF), expval) + ldexp(m, scaleF) * pow(pow(2, baseF), expval) ); /* * (S * N * 2^F) * B^E * Essentially: - m = scalbn(m, scaleF) * pow(pow(2, base), expval); + m = ldexp(m, scaleF) * pow(pow(2, base), expval); */ m = ldexp(m, expval * baseF + scaleF); if(finite(m)) { From fca0fe4e48060a3faf15541a32c0927557df298c Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Apr 2005 18:55:12 +0000 Subject: [PATCH 0883/1469] fixed test git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@883 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ChangeLog b/ChangeLog index f32766b43..64fada348 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,9 @@ +0.9.14: 2005-Apr-29 + + * Fixed check-70.-fnative-integers.c test (it was failing + when no test directory was found). + 0.9.13: 2005-Apr-24 * Added extra const qualifiers into the support code. From 43ead20222eebd8e3e080f17e8ba416fef1aabfc Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Apr 2005 18:56:52 +0000 Subject: [PATCH 0884/1469] version git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@884 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure | 2 +- configure.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 810848cd0..bc9e6aed4 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.9.13 + VERSION=0.9.14 cat >>confdefs.h <<_ACEOF diff --git a/configure.in b/configure.in index c2aed5c27..3f22f9913 100644 --- a/configure.in +++ b/configure.in @@ -3,7 +3,7 @@ AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_BUILD AC_CANONICAL_TARGET AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.9.13) +AM_INIT_AUTOMAKE(asn1c, 0.9.14) AM_MAINTAINER_MODE From e6c8973b6bff2fdb11b46d3dcbaa24de38aa392e Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 17 May 2005 21:46:18 +0000 Subject: [PATCH 0885/1469] overflow detection git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@885 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 5 +++++ libasn1fix/asn1fix_crange.c | 21 +++++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 64fada348..69c409cc1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,9 @@ +0.9.15: 2005-May-17 + + * Compiler now checks 64-bit overflows in constraints range handling + code. No effect on the code produced by the compiler. + 0.9.14: 2005-Apr-29 * Fixed check-70.-fnative-integers.c test (it was failing diff --git a/libasn1fix/asn1fix_crange.c b/libasn1fix/asn1fix_crange.c index 23110a234..5975bc1a3 100644 --- a/libasn1fix/asn1fix_crange.c +++ b/libasn1fix/asn1fix_crange.c @@ -453,28 +453,40 @@ _range_split(asn1cnst_range_t *ra, const asn1cnst_range_t *rb) { * L: |---... * R: |--.. */ - if(ll < 0) { + while(ll < 0) { nr->left = ra->left; nr->right = rb->left; - if(nr->right.type == ARE_VALUE) + if(nr->right.type == ARE_VALUE) { + if(nr->right.value - 1 >= nr->right.value) { + /* We've hit the limit here. */ + break; + } nr->right.value--; + } _range_insert(range, nr); nr = _range_new(); assert(nr); + break; } /* * L: ...---| * R: ..--| */ - if(rr > 0) { + while(rr > 0) { nr->left = rb->right; nr->right = ra->right; - if(nr->left.type == ARE_VALUE) + if(nr->left.type == ARE_VALUE) { + if(nr->left.value + 1 <= nr->left.value) { + /* We've hit the limit here. */ + break; + } nr->left.value++; + } _range_insert(range, nr); nr = _range_new(); assert(nr); + break; } /* @@ -556,6 +568,7 @@ _range_intersection(asn1cnst_range_t *range, const asn1cnst_range_t *with, int s wel = with; } else { wel = with->elements[j]; + assert(!wel->el_count); /* non-compound item! */ } r = _range_split(range->elements[i], wel); From 5a0e88981ba7ba21437345b49274f7f635f9312b Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 26 May 2005 19:25:53 +0000 Subject: [PATCH 0886/1469] more robust comments parsing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@886 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/xer_support.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/skeletons/xer_support.c b/skeletons/xer_support.c index 5ba60a040..b3833b588 100644 --- a/skeletons/xer_support.c +++ b/skeletons/xer_support.c @@ -206,6 +206,8 @@ ssize_t pxml_parse(int *stateContext, const void *xmlbuf, size_t size, pxml_call case ST_COMMENT_CLO_RT: if(C == RANGLE) { TOKEN_CB_FINAL(PXML_COMMENT, ST_TEXT, 1); + } else if(C == CDASH) { + /* Maintain current state, still waiting for '>' */ } else { state = ST_COMMENT; } From 0b56940efc1670696b5a093f09315b41411c6768 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 27 May 2005 20:56:08 +0000 Subject: [PATCH 0887/1469] win32 compatibility git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@887 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_system.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/skeletons/asn_system.h b/skeletons/asn_system.h index 5a5eb9bfb..fe7e5a8fe 100644 --- a/skeletons/asn_system.h +++ b/skeletons/asn_system.h @@ -25,6 +25,18 @@ #define vsnprintf _vsnprintf #define alloca(size) _alloca(size) +#ifdef _MSC_VER /* MSVS.Net */ +#define ssize_t SSIZE_T +typedef char int8_t; +typedef short int16_t; +typedef int int32_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +#define WIN32_LEAN_AND_MEAN +#include +#endif /* _MSC_VER */ + #else /* !WIN32 */ #include /* C99 specifies this file */ From 46121b46e14c3c8f97fd727252c574d380df2f42 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 27 May 2005 21:58:41 +0000 Subject: [PATCH 0888/1469] omitting the empty map git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@888 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/32-sequence-of-OK.asn1.-P | 6 +-- tests/60-any-OK.asn1 | 5 +++ tests/60-any-OK.asn1.-EF | 5 +++ tests/60-any-OK.asn1.-P | 71 ++++++++++++++++++++++++++++++ tests/69-reserved-words-OK.asn1.-P | 2 - 5 files changed, 83 insertions(+), 6 deletions(-) diff --git a/tests/32-sequence-of-OK.asn1.-P b/tests/32-sequence-of-OK.asn1.-P index 9d4a44542..e7ba2bd88 100644 --- a/tests/32-sequence-of-OK.asn1.-P +++ b/tests/32-sequence-of-OK.asn1.-P @@ -160,13 +160,11 @@ extern asn_TYPE_descriptor_t asn_DEF_Error; static ber_tlv_tag_t asn_DEF_Error_1_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Error_1_tag2el[] = { -}; static asn_SEQUENCE_specifics_t asn_SPC_Error_1_specs = { sizeof(struct Error), offsetof(struct Error, _asn_ctx), - asn_MAP_Error_1_tag2el, - 0, /* Count of tags in the map */ + 0, /* No top level tags */ + 0, /* No tags in the map */ -1, /* Start extensions */ -1 /* Stop extensions */ }; diff --git a/tests/60-any-OK.asn1 b/tests/60-any-OK.asn1 index 51723d9de..e10c421b2 100644 --- a/tests/60-any-OK.asn1 +++ b/tests/60-any-OK.asn1 @@ -21,4 +21,9 @@ BEGIN any [0] ANY OPTIONAL } + T3 ::= SEQUENCE { + any1 ANY, + any2 ANY + } + END diff --git a/tests/60-any-OK.asn1.-EF b/tests/60-any-OK.asn1.-EF index 73c658fd8..89fa31d7c 100644 --- a/tests/60-any-OK.asn1.-EF +++ b/tests/60-any-OK.asn1.-EF @@ -13,4 +13,9 @@ T2 ::= SEQUENCE { any [0] EXPLICIT ANY OPTIONAL } +T3 ::= SEQUENCE { + any1 ANY, + any2 ANY +} + END diff --git a/tests/60-any-OK.asn1.-P b/tests/60-any-OK.asn1.-P index ed2334004..3f80bdef6 100644 --- a/tests/60-any-OK.asn1.-P +++ b/tests/60-any-OK.asn1.-P @@ -149,3 +149,74 @@ asn_TYPE_descriptor_t asn_DEF_T2 = { &asn_SPC_T2_1_specs /* Additional specs */ }; + +/*** <<< INCLUDES [T3] >>> ***/ + +#include +#include + +/*** <<< TYPE-DECLS [T3] >>> ***/ + +typedef struct T3 { + ANY_t any1; + ANY_t any2; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} T3_t; + +/*** <<< FUNC-DECLS [T3] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_T3; + +/*** <<< STAT-DEFS [T3] >>> ***/ + +static asn_TYPE_member_t asn_MBR_T3_1[] = { + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct T3, any1), + .tag = -1 /* Ambiguous tag (ANY?) */, + .tag_mode = 0, + .type = (void *)&asn_DEF_ANY, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "any1" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct T3, any2), + .tag = -1 /* Ambiguous tag (ANY?) */, + .tag_mode = 0, + .type = (void *)&asn_DEF_ANY, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "any2" + }, +}; +static ber_tlv_tag_t asn_DEF_T3_1_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SEQUENCE_specifics_t asn_SPC_T3_1_specs = { + sizeof(struct T3), + offsetof(struct T3, _asn_ctx), + 0, /* No top level tags */ + 0, /* No tags in the map */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_T3 = { + "T3", + "T3", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_T3_1_tags, + sizeof(asn_DEF_T3_1_tags) + /sizeof(asn_DEF_T3_1_tags[0]), /* 1 */ + asn_DEF_T3_1_tags, /* Same as above */ + sizeof(asn_DEF_T3_1_tags) + /sizeof(asn_DEF_T3_1_tags[0]), /* 1 */ + asn_MBR_T3_1, + 2, /* Elements count */ + &asn_SPC_T3_1_specs /* Additional specs */ +}; + diff --git a/tests/69-reserved-words-OK.asn1.-P b/tests/69-reserved-words-OK.asn1.-P index 96bf95157..33db670ba 100644 --- a/tests/69-reserved-words-OK.asn1.-P +++ b/tests/69-reserved-words-OK.asn1.-P @@ -78,8 +78,6 @@ memb_char_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, static ber_tlv_tag_t asn_DEF_class_4_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_class_4_tag2el[] = { -}; static uint8_t asn_MAP_class_4_mmap[(0 + (8 * sizeof(unsigned int)) - 1) / 8] = { 0 }; From 611bc330a3b355509edcda8c043bff3bfc2a0720 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 27 May 2005 21:58:52 +0000 Subject: [PATCH 0889/1469] no empty maps git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@889 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index 69c409cc1..27ee63828 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,7 @@ * Compiler now checks 64-bit overflows in constraints range handling code. No effect on the code produced by the compiler. + * Empty tags to element map avoided. 0.9.14: 2005-Apr-29 From 14ad25d36da77ea7400e606f30cd95f1cb81031e Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 1 Jun 2005 18:26:38 +0000 Subject: [PATCH 0890/1469] C90 comments git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@890 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/xer_support.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/skeletons/xer_support.c b/skeletons/xer_support.c index b3833b588..1d0b42c5a 100644 --- a/skeletons/xer_support.c +++ b/skeletons/xer_support.c @@ -19,11 +19,11 @@ typedef enum { ST_TAG_QUOTE_WAIT, ST_TAG_QUOTED_STRING, ST_TAG_UNQUOTED_STRING, - ST_COMMENT_WAIT_DASH1, // ""[0] - ST_COMMENT_CLO_RT // "-->"[1] + ST_COMMENT_CLO_DASH2, /* "-->"[0] */ + ST_COMMENT_CLO_RT /* "-->"[1] */ } pstate_e; static pxml_chunk_type_e final_chunk_type[] = { From f0f8b734705fcef37a7510018649dcf09351c43c Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 2 Jun 2005 03:32:53 +0000 Subject: [PATCH 0891/1469] completed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@891 59561ff5-6e30-0410-9f3c-9617f08c8826 --- TODO | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TODO b/TODO index 179d59c79..058b1d617 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,7 @@ 1. MAJOR: 1.1 Support for PER encoding. Requires advanced subtype constraints support, -which is already completed. Also see #3.2. +which is already completed. 1.2 Support for Information Object Classes. Status: Support for parsing IOCs is mostly present. From a750ca4c90066d8f6bdf49bdce65345e1544458f Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 2 Jun 2005 04:06:24 +0000 Subject: [PATCH 0892/1469] special printing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@892 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1print/asn1print.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index 082b3a3a5..1a44ef0f2 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -594,9 +594,11 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri break; } + /* + * Put the name of the referred type. + */ if(tc->reference) { - if(!(flags & APF_NOINDENT)) - printf(" "); + printf(" "); asn1print_ref(tc->reference, flags); } From fbd6d9e9d47c6d8d0a9c39078c839fe5f782b36e Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 2 Jun 2005 05:21:37 +0000 Subject: [PATCH 0893/1469] no empty maps git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@893 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 44 ++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index a2a09f27f..a8c9f65ea 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -315,9 +315,15 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { OUT("sizeof(struct "); out_name_chain(arg, 1); OUT("),\n"); OUT("offsetof(struct "); out_name_chain(arg, 1); OUT(", _asn_ctx),\n"); - OUT("asn_MAP_%s_%d_tag2el,\n", - MKID(expr->Identifier), expr->_type_unique_index); - OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); + if(tag2el_count) { + OUT("asn_MAP_%s_%d_tag2el,\n", + MKID(expr->Identifier), + expr->_type_unique_index); + OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); + } else { + OUT("0,\t/* No top level tags */\n"); + OUT("0,\t/* No tags in the map */\n"); + } OUT("%d,\t/* Start extensions */\n", ext_start); OUT("%d\t/* Stop extensions */\n", @@ -1425,29 +1431,29 @@ _add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no, fte_e f static int emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count, const char *opt_modifier) { asn1p_expr_t *expr = arg->expr; + int i; + + if(!tag2el_count) return 0; /* No top level tags */ OUT("static asn_TYPE_tag2member_t asn_MAP_%s_%d_tag2el%s[] = {\n", MKID(expr->Identifier), expr->_type_unique_index, opt_modifier?opt_modifier:""); - if(tag2el_count) { - int i; - for(i = 0; i < tag2el_count; i++) { - OUT(" { "); - _print_tag(arg, &tag2el[i].el_tag); - OUT(", "); - OUT("%d, ", tag2el[i].el_no); - OUT("%d, ", tag2el[i].toff_first); - OUT("%d ", tag2el[i].toff_last); - OUT("}%s /* %s at %d */\n", - (i + 1 < tag2el_count) ? "," : "", - tag2el[i].from_expr->Identifier, - tag2el[i].from_expr->_lineno - ); - } + for(i = 0; i < tag2el_count; i++) { + OUT(" { "); + _print_tag(arg, &tag2el[i].el_tag); + OUT(", "); + OUT("%d, ", tag2el[i].el_no); + OUT("%d, ", tag2el[i].toff_first); + OUT("%d ", tag2el[i].toff_last); + OUT("}%s /* %s at %d */\n", + (i + 1 < tag2el_count) ? "," : "", + tag2el[i].from_expr->Identifier, + tag2el[i].from_expr->_lineno + ); } OUT("};\n"); - return 0;; + return 0; } static enum tvm_compat From 5b1030361c2100febd63bba5c0178543d37e19cc Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 2 Jun 2005 05:21:53 +0000 Subject: [PATCH 0894/1469] Compiler support for tagged parametrized members. git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@894 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 3 ++- libasn1fix/asn1fix_constr.c | 7 +++++++ libasn1fix/asn1fix_param.c | 10 ++++++++++ libasn1parser/asn1p_expr.c | 38 +++++++++++++++++++++++++++++++++++++ libasn1parser/asn1p_expr.h | 3 +++ libasn1print/asn1print.c | 22 +-------------------- 6 files changed, 61 insertions(+), 22 deletions(-) diff --git a/ChangeLog b/ChangeLog index 27ee63828..3103354c5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,9 @@ -0.9.15: 2005-May-17 +0.9.15: 2005-June-01 * Compiler now checks 64-bit overflows in constraints range handling code. No effect on the code produced by the compiler. + * Compiler support for tagged parametrized members. * Empty tags to element map avoided. 0.9.14: 2005-Apr-29 diff --git a/libasn1fix/asn1fix_constr.c b/libasn1fix/asn1fix_constr.c index e16c9e041..b71d874cd 100644 --- a/libasn1fix/asn1fix_constr.c +++ b/libasn1fix/asn1fix_constr.c @@ -419,6 +419,7 @@ _asn1f_compare_tags(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b) { || ta.tag_value == -1 /* Spread IMAGINARY ANY tag... */ || tb.tag_value == -1 /* ...it is an evil virus, fear it! */ ) { + char tagbuf[2][TAG2STRING_BUFFER_SIZE]; char *p = (a->expr_type == A1TC_EXTENSIBLE) ?"potentially ":""; FATAL("Processing %s at line %d: component \"%s\" at line %d %shas the same tag " @@ -431,6 +432,12 @@ _asn1f_compare_tags(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b) { b->Identifier, b->_lineno ); + DEBUG("Tags: %s %s vs. %s %s", + asn1p_tag2string(&ta, tagbuf[0]), + a->Identifier, + asn1p_tag2string(&tb, tagbuf[1]), + b->Identifier + ); if((arg->mod->module_flags & MSF_EXTENSIBILITY_IMPLIED) && (a->expr_type == A1TC_EXTENSIBLE) && (b->expr_type == A1TC_EXTENSIBLE)) { diff --git a/libasn1fix/asn1fix_param.c b/libasn1fix/asn1fix_param.c index 3fdaf3076..8c9ce41af 100644 --- a/libasn1fix/asn1fix_param.c +++ b/libasn1fix/asn1fix_param.c @@ -60,12 +60,22 @@ asn1f_fix_parametrized_assignment(arg_t *arg) { #define SUBSTITUTE(to, from) do { \ asn1p_expr_t tmp, *__v; \ + if((to)->tag.tag_class \ + && (from)->tag.tag_class) { \ + FATAL("Layered tagging " \ + "in parametrization " \ + "is not yet supported, " \ + "contact asn1c author for"); \ + return -1; \ + } \ tmp = *(to); \ *(to) = *(from); \ TQ_MOVE(&(to)->members, &(from)->members); \ *(from) = tmp; \ (to)->next = tmp.next; \ (to)->parent_expr = tmp.parent_expr; \ + if(tmp.tag.tag_class) \ + (to)->tag = tmp.tag; \ memset(&((from)->next), 0, \ sizeof((from)->next)); \ memset(&((from)->members), 0, \ diff --git a/libasn1parser/asn1p_expr.c b/libasn1parser/asn1p_expr.c index c3c31f2c3..5e2aa34e3 100644 --- a/libasn1parser/asn1p_expr.c +++ b/libasn1parser/asn1p_expr.c @@ -142,3 +142,41 @@ asn1p_expr_free(asn1p_expr_t *expr) { } } + +char *asn1p_tag2string(struct asn1p_type_tag_s *tag, char *buf) { + static buf_stat[TAG2STRING_BUFFER_SIZE]; + char *start; + char *end; + + if(!buf) buf = buf_stat; + start = buf; + end = buf + TAG2STRING_BUFFER_SIZE; + + if(tag->tag_class == TC_NOCLASS) { + *buf = 0; + return buf; + } + + strcpy(buf, "["); + switch(tag->tag_class) { + case TC_NOCLASS: + assert(tag->tag_class != TC_NOCLASS); + break; + case TC_UNIVERSAL: strcat(buf, "UNIVERSAL "); break; + case TC_PRIVATE: strcat(buf, "PRIVATE "); break; + case TC_APPLICATION: strcat(buf, "APPLICATION "); break; + case TC_CONTEXT_SPECIFIC: + break; + } + buf += snprintf(buf + strlen(buf), end - buf, + "%" PRIdASN "]", tag->tag_value); + assert((buf - end) > sizeof(" IMPLICIT ")); + + switch(tag->tag_mode) { + case TM_DEFAULT: break; + case TM_IMPLICIT: strcat(buf, " IMPLICIT"); break; + case TM_EXPLICIT: strcat(buf, " EXPLICIT"); break; + } + + return start; +} diff --git a/libasn1parser/asn1p_expr.h b/libasn1parser/asn1p_expr.h index 34a9e7aac..18692c17c 100644 --- a/libasn1parser/asn1p_expr.h +++ b/libasn1parser/asn1p_expr.h @@ -242,4 +242,7 @@ asn1p_expr_t *asn1p_expr_clone(asn1p_expr_t *, int skip_extensions); void asn1p_expr_add(asn1p_expr_t *to, asn1p_expr_t *what); void asn1p_expr_free(asn1p_expr_t *expr); +#define TAG2STRING_BUFFER_SIZE 64 /* buf should be at least this big */ +char *asn1p_tag2string(struct asn1p_type_tag_s *tag, char *opt_buf); + #endif /* ASN1_PARSER_EXPR_H */ diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index 1a44ef0f2..0a0737896 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -168,27 +168,7 @@ asn1print_tag(asn1p_expr_t *tc, enum asn1print_flags flags) { (void)flags; /* Unused argument */ - if(tag->tag_class == TC_NOCLASS) - return 0; - - printf("["); - switch(tag->tag_class) { - case TC_NOCLASS: - assert(tag->tag_class != TC_NOCLASS); - break; - case TC_UNIVERSAL: printf("UNIVERSAL "); break; - case TC_PRIVATE: printf("PRIVATE "); break; - case TC_APPLICATION: printf("APPLICATION "); break; - case TC_CONTEXT_SPECIFIC: - break; - } - printf("%" PRIdASN "]", tag->tag_value); - - switch(tag->tag_mode) { - case TM_DEFAULT: break; - case TM_IMPLICIT: printf(" IMPLICIT"); break; - case TM_EXPLICIT: printf(" EXPLICIT"); break; - } + printf("%s", asn1p_tag2string(tag, 0)); return 0; } From 2ec1e2335204142b15c6bb5e412af89a48c875c6 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 2 Jun 2005 17:40:32 +0000 Subject: [PATCH 0895/1469] typo git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@895 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_expr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libasn1parser/asn1p_expr.h b/libasn1parser/asn1p_expr.h index 18692c17c..2751c9301 100644 --- a/libasn1parser/asn1p_expr.h +++ b/libasn1parser/asn1p_expr.h @@ -149,7 +149,7 @@ typedef struct asn1p_expr_s { asn1p_value_t *value; /* - * The WITH SYHTAX clause. + * The WITH SYNTAX clause. */ asn1p_wsyntx_t *with_syntax; From 1457c0d1c26e9ec5494a48f36bdeae07a2940e47 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 2 Jun 2005 17:53:17 +0000 Subject: [PATCH 0896/1469] marked parametrized members git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@896 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 2 +- asn1c/enber.c | 6 ++-- libasn1fix/asn1fix_param.c | 72 ++++++++++++++++++++++++-------------- 3 files changed, 50 insertions(+), 30 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3103354c5..4f61d4c72 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,7 +3,7 @@ * Compiler now checks 64-bit overflows in constraints range handling code. No effect on the code produced by the compiler. - * Compiler support for tagged parametrized members. + * Compiler support for tagged and marked parametrized members. * Empty tags to element map avoided. 0.9.14: 2005-Apr-29 diff --git a/asn1c/enber.c b/asn1c/enber.c index 4e3825126..1ecef6f5d 100644 --- a/asn1c/enber.c +++ b/asn1c/enber.c @@ -377,9 +377,9 @@ process_line(const char *fname, char *line, int lineno) { if(len != tlv_len) { if(no_validation) fprintf(stderr, "Warning: "); fprintf(stderr, - "%s: Could not encode value of %d chars " - "at line %d in %d bytes\n", - fname, len, lineno, tlv_len); + "%s: Could not encode value of %ld chars " + "at line %d in %ld bytes\n", + fname, (long)len, lineno, (long)tlv_len); if(!no_validation) exit(EX_DATAERR); } } diff --git a/libasn1fix/asn1fix_param.c b/libasn1fix/asn1fix_param.c index 8c9ce41af..ba624cb84 100644 --- a/libasn1fix/asn1fix_param.c +++ b/libasn1fix/asn1fix_param.c @@ -59,33 +59,53 @@ asn1f_fix_parametrized_assignment(arg_t *arg) { } #define SUBSTITUTE(to, from) do { \ - asn1p_expr_t tmp, *__v; \ - if((to)->tag.tag_class \ - && (from)->tag.tag_class) { \ - FATAL("Layered tagging " \ - "in parametrization " \ - "is not yet supported, " \ - "contact asn1c author for"); \ - return -1; \ + asn1p_expr_t tmp, *__v; \ + if((to)->tag.tag_class \ + && (from)->tag.tag_class) { \ + FATAL("Layered tagging in parametrization " \ + "is not yet supported, " \ + "contact asn1c author for assistance with"); \ + return -1; \ + } \ + /* This code shall not be invoked too early */ \ + assert((to)->combined_constraints == NULL); \ + assert((from)->combined_constraints == NULL); \ + /* Copy stuff, and merge some parameters */ \ + tmp = *(to); \ + *(to) = *(from); \ + TQ_MOVE(&(to)->members, &(from)->members); \ + *(from) = tmp; \ + (to)->next = tmp.next; \ + (to)->parent_expr = tmp.parent_expr; \ + assert((to)->marker.flags == EM_NOMARK); \ + (to)->marker = tmp.marker; \ + if(tmp.tag.tag_class) \ + (to)->tag = tmp.tag; \ + if(tmp.constraints) { \ + if((to)->constraints) { \ + asn1p_constraint_t *ct; \ + ct = asn1p_constraint_new( \ + (to)->constraints->_lineno); \ + ct->type = ACT_CA_SET; \ + asn1p_constraint_insert(ct, \ + (to)->constraints); \ + asn1p_constraint_insert(ct, \ + tmp.constraints); \ + (to)->constraints = ct; \ + } else { \ + (to)->constraints = tmp.constraints; \ } \ - tmp = *(to); \ - *(to) = *(from); \ - TQ_MOVE(&(to)->members, &(from)->members); \ - *(from) = tmp; \ - (to)->next = tmp.next; \ - (to)->parent_expr = tmp.parent_expr; \ - if(tmp.tag.tag_class) \ - (to)->tag = tmp.tag; \ - memset(&((from)->next), 0, \ - sizeof((from)->next)); \ - memset(&((from)->members), 0, \ - sizeof((from)->members)); \ - asn1p_expr_free(from); \ - TQ_FOR(__v, &((to)->members), next) { \ - assert(__v->parent_expr == (from)); \ - __v->parent_expr = (to); \ - } \ - } while(0) + } \ + (from)->constraints = 0; \ + (from)->marker.default_value = 0; \ + memset(&((from)->next), 0, sizeof((from)->next)); \ + memset(&((from)->members), 0, sizeof((from)->members)); \ + asn1p_expr_free(from); \ + TQ_FOR(__v, &((to)->members), next) { \ + assert(__v->parent_expr == (from)); \ + __v->parent_expr = (to); \ + } \ +} while(0) static int asn1f_parametrize(arg_t *arg, asn1p_expr_t *expr, asn1p_expr_t *ptype) { From 14a1e8950674ad73d0bbce669908b245c480c9ad Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 4 Jun 2005 01:08:32 +0000 Subject: [PATCH 0897/1469] honor known-extern-type git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@897 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_value.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/libasn1fix/asn1fix_value.c b/libasn1fix/asn1fix_value.c index 60259421d..50d8da20c 100644 --- a/libasn1fix/asn1fix_value.c +++ b/libasn1fix/asn1fix_value.c @@ -27,11 +27,16 @@ asn1f_value_resolve(arg_t *arg, asn1p_expr_t *expr, const enum asn1p_constraint_ * 1. Find the terminal type for this assignment. */ type_expr = asn1f_find_terminal_type(arg, expr); - DEBUG("terminal type %p", type_expr); if(type_expr == 0) { - FATAL("Terminal type for %s at line %d not found", - expr->Identifier, expr->_lineno); - return -1; + if(errno == EEXIST) { + DEBUG("External type for %s at line %d", + expr->Identifier, expr->_lineno); + return 0; + } else { + FATAL("Terminal type for %s at line %d not found", + expr->Identifier, expr->_lineno); + return -1; + } } if(asn1f_look_value_in_type(arg, type_expr, expr) == -1) { From 57f5c127511aecbc0e901eb8f1145cf9a30b5ed5 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 5 Jun 2005 09:42:42 +0000 Subject: [PATCH 0898/1469] updated manual page git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@898 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/asn1c.1 | 20 ++++++++++++++++++-- asn1c/asn1c.c | 2 +- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/asn1c/asn1c.1 b/asn1c/asn1c.1 index 7a6f87f5e..408b79f93 100644 --- a/asn1c/asn1c.1 +++ b/asn1c/asn1c.1 @@ -23,7 +23,9 @@ and other encoding standards. .TP \fILanguage Options\fR .br -\fB\-fall-defs-global \-fbless-SIZE \-fnative-types \-fno-constraints \-funnamed-unions \-ftypes88\fR +\fB\-fall-defs-global \-fbless-SIZE \-fcompound-names +.BI "\-fknown-extern-type=" +\fB\-fnative-types \-fno-constraints \-fno-include-deps \-funnamed-unions \-ftypes88\fR .TP \fIOutput Options\fR .br @@ -80,7 +82,17 @@ structures globally visible, but will allow you to manipulate .B \-fbless-SIZE Allow SIZE() constraint for INTEGER, ENUMERATED, and other types for which this constraint is normally prohibited by the standard. This is a violation of -an ASN.1 standard and compiler may fail to produce the meaningful code. +an ASN.1 standard and compiler may fail to produce meaningful code. +.TP +.B \-fcompound-names +Using this switch prevents name collisions in the target source code +by using complex names for target language structures. (Name collisions +may occur if the ASN.1 module reuses the same identifiers in multiple +contexts). +.TP +.BI "\-fknown-extern-type=" +Pretend the specified type is known. The compiler will assume the target +language source files for the given type are provided manually. .TP .B \-fnative-types Use the native machine's data types (int, double) whenever possible, @@ -89,6 +101,10 @@ instead of the compound INTEGER_t, ENUMERATED_t and REAL_t types. .B \-fno-constraints Do not generate ASN.1 subtype constraint checking code. This may make a shorter executable. .TP +.B \-fno-include-deps +Do not generate courtesy #include lines for non-critical type dependencies. +Helps prevent namespace collisions. +.TP .B \-funnamed-unions Enable unnamed unions in the definitions of target language's structures. .TP diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index cf951af15..3d08c3097 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -313,7 +313,7 @@ usage(const char *av0) { " -fall-defs-global Don't make the asn1_DEF_'s of structure members \"static\"\n" " -fbless-SIZE Allow SIZE() constraint for INTEGER etc (non-std.)\n" " -fcompound-names Disambiguate C's struct NAME's inside top-level types\n" -" -fknown-extern-type= Pretend this type is known\n" +" -fknown-extern-type= Pretend the specified type is known\n" " -fnative-types Use \"long\" instead of INTEGER_t whenever possible, etc.\n" " -fno-constraints Do not generate constraint checking code\n" " -fno-include-deps Do not generate courtesy #includes for dependencies\n" From 47da9a86109960b21f3bd3824e4f9cbd65c54f29 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 6 Jun 2005 08:28:46 +0000 Subject: [PATCH 0899/1469] 0.9.15 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@899 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure | 2 +- configure.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index bc9e6aed4..46674e3a0 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.9.14 + VERSION=0.9.15 cat >>confdefs.h <<_ACEOF diff --git a/configure.in b/configure.in index 3f22f9913..424c8a8f2 100644 --- a/configure.in +++ b/configure.in @@ -3,7 +3,7 @@ AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_BUILD AC_CANONICAL_TARGET AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.9.14) +AM_INIT_AUTOMAKE(asn1c, 0.9.15) AM_MAINTAINER_MODE From a5b977d609836efb228eed20ca380accf6a9c5b2 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 6 Jun 2005 08:28:58 +0000 Subject: [PATCH 0900/1469] fixes git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@900 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_param.c | 3 ++- libasn1parser/asn1p_expr.c | 4 ++-- libasn1parser/asn1p_y.c | 10 +++++----- libasn1parser/asn1p_y.y | 1 + 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/libasn1fix/asn1fix_param.c b/libasn1fix/asn1fix_param.c index ba624cb84..159dbbc29 100644 --- a/libasn1fix/asn1fix_param.c +++ b/libasn1fix/asn1fix_param.c @@ -64,7 +64,8 @@ asn1f_fix_parametrized_assignment(arg_t *arg) { && (from)->tag.tag_class) { \ FATAL("Layered tagging in parametrization " \ "is not yet supported, " \ - "contact asn1c author for assistance with"); \ + "contact asn1c author for assistance " \ + "with line %d", (to)->_lineno); \ return -1; \ } \ /* This code shall not be invoked too early */ \ diff --git a/libasn1parser/asn1p_expr.c b/libasn1parser/asn1p_expr.c index 5e2aa34e3..f5626a7b6 100644 --- a/libasn1parser/asn1p_expr.c +++ b/libasn1parser/asn1p_expr.c @@ -144,7 +144,7 @@ asn1p_expr_free(asn1p_expr_t *expr) { char *asn1p_tag2string(struct asn1p_type_tag_s *tag, char *buf) { - static buf_stat[TAG2STRING_BUFFER_SIZE]; + static char buf_stat[TAG2STRING_BUFFER_SIZE]; char *start; char *end; @@ -170,7 +170,7 @@ char *asn1p_tag2string(struct asn1p_type_tag_s *tag, char *buf) { } buf += snprintf(buf + strlen(buf), end - buf, "%" PRIdASN "]", tag->tag_value); - assert((buf - end) > sizeof(" IMPLICIT ")); + assert((unsigned int)(buf - end) > sizeof(" IMPLICIT ")); switch(tag->tag_mode) { case TM_DEFAULT: break; diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index bc495515f..5b3c4ad74 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -394,7 +394,7 @@ static const short yyrline[] = { 0, 1876, 1879, 1884, 1906, 1911, 1916, 1922, 1928, 1936, 1944, 1952, 1959, 1969, 1974, 2004, 2006, 2009, 2016, 2022, 2024, 2025, 2026, 2029, 2031, 2032, 2035, 2040, 2047, 2054, 2056, - 2060 + 2061 }; #endif @@ -3410,7 +3410,7 @@ case 270: ; break;} case 271: -#line 2061 "asn1p_y.y" +#line 2062 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; @@ -3490,7 +3490,7 @@ case 271: count = 0; /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ for (x = (yyn < 0 ? -yyn : 0); - x < (ssize_t)(sizeof(yytname) / sizeof(char *)); x++) + x < (sizeof(yytname) / sizeof(char *)); x++) if (yycheck[x + yyn] == x) size += strlen(yytname[x]) + 15, count++; msg = (char *) malloc(size + 15); @@ -3502,7 +3502,7 @@ case 271: { count = 0; for (x = (yyn < 0 ? -yyn : 0); - x < (ssize_t)(sizeof(yytname) / sizeof(char *)); x++) + x < (sizeof(yytname) / sizeof(char *)); x++) if (yycheck[x + yyn] == x) { strcat(msg, count == 0 ? ", expecting `" : " or `"); @@ -3638,7 +3638,7 @@ case 271: } return 1; } -#line 2067 "asn1p_y.y" +#line 2068 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index da06b4cf3..e7ff05124 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -2056,6 +2056,7 @@ optIdentifier: | Identifier { $$ = $1; } + ; Identifier: TOK_identifier { From fbf6bf64d7dec90b5d89ed162e8798428b751614 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 7 Jun 2005 21:25:42 +0000 Subject: [PATCH 0901/1469] fix git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@901 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_y.y | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index e7ff05124..a9b7804bb 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -9,10 +9,12 @@ #include "asn1parser.h" #define YYPARSE_PARAM param +#define YYPARSE_PARAM_TYPE void ** #define YYERROR_VERBOSE int yylex(void); int yyerror(const char *msg); +int yyparse(void **param); void asn1p_lexer_hack_push_opaque_state(void); void asn1p_lexer_hack_enable_with_syntax(void); void asn1p_lexer_hack_push_encoding_control(void); From d2f8760205ad4e2740dea653a778532cfb6701de Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 7 Jun 2005 21:32:16 +0000 Subject: [PATCH 0902/1469] courtesy prototype for byacc git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@902 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_y.y | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index a9b7804bb..8c714f1a8 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -14,7 +14,9 @@ int yylex(void); int yyerror(const char *msg); -int yyparse(void **param); +#ifdef YYBYACC +int yyparse(void **param); /* byacc does not produce a prototype */ +#endif void asn1p_lexer_hack_push_opaque_state(void); void asn1p_lexer_hack_enable_with_syntax(void); void asn1p_lexer_hack_push_encoding_control(void); From 03630c56e3b15603c1f005c051defafd5f24860d Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 7 Jun 2005 21:43:32 +0000 Subject: [PATCH 0903/1469] use explicit signedness conversion git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@903 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_y.c | 596 ++++++++++++++++++++-------------------- 1 file changed, 300 insertions(+), 296 deletions(-) diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index 5b3c4ad74..9656f1731 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -124,10 +124,14 @@ #include "asn1parser.h" #define YYPARSE_PARAM param +#define YYPARSE_PARAM_TYPE void ** #define YYERROR_VERBOSE int yylex(void); int yyerror(const char *msg); +#ifdef YYBYACC +int yyparse(void **param); /* byacc does not produce a prototype */ +#endif void asn1p_lexer_hack_push_opaque_state(void); void asn1p_lexer_hack_enable_with_syntax(void); void asn1p_lexer_hack_push_encoding_control(void); @@ -163,7 +167,7 @@ static asn1p_value_t * } while(0) -#line 58 "asn1p_y.y" +#line 62 "asn1p_y.y" typedef union { asn1p_t *a_grammar; asn1p_module_flags_e a_module_flags; @@ -367,34 +371,34 @@ static const short yyrhs[] = { 119, #if YYDEBUG != 0 static const short yyrline[] = { 0, - 302, 308, 314, 330, 355, 357, 360, 364, 369, 376, - 384, 389, 393, 402, 404, 412, 416, 424, 428, 431, - 434, 438, 458, 460, 468, 472, 504, 508, 517, 524, - 537, 544, 546, 558, 571, 578, 583, 589, 595, 604, - 610, 616, 623, 629, 637, 641, 644, 651, 657, 663, - 670, 676, 685, 687, 696, 704, 718, 730, 736, 752, - 761, 771, 781, 786, 793, 800, 810, 816, 822, 826, - 849, 851, 853, 859, 865, 872, 879, 884, 890, 896, - 902, 907, 917, 919, 922, 930, 936, 945, 951, 968, - 970, 975, 979, 984, 989, 995, 999, 1010, 1019, 1028, - 1039, 1061, 1065, 1071, 1077, 1083, 1093, 1103, 1109, 1123, - 1147, 1154, 1168, 1177, 1187, 1197, 1207, 1215, 1236, 1245, - 1254, 1255, 1257, 1264, 1276, 1286, 1294, 1294, 1299, 1304, - 1309, 1314, 1318, 1322, 1325, 1328, 1333, 1345, 1362, 1367, - 1372, 1405, 1415, 1429, 1431, 1432, 1433, 1434, 1435, 1436, - 1437, 1438, 1439, 1440, 1441, 1442, 1448, 1450, 1451, 1454, - 1461, 1473, 1475, 1479, 1483, 1484, 1485, 1486, 1487, 1491, - 1492, 1493, 1494, 1498, 1499, 1506, 1506, 1507, 1507, 1508, - 1510, 1512, 1517, 1521, 1530, 1534, 1539, 1543, 1549, 1559, - 1563, 1566, 1569, 1572, 1577, 1586, 1594, 1600, 1606, 1613, - 1621, 1629, 1638, 1641, 1644, 1645, 1655, 1657, 1658, 1659, - 1662, 1666, 1671, 1677, 1682, 1685, 1688, 1701, 1715, 1719, - 1724, 1728, 1733, 1740, 1753, 1755, 1758, 1762, 1765, 1770, - 1774, 1782, 1797, 1803, 1810, 1823, 1835, 1850, 1854, 1871, - 1876, 1879, 1884, 1906, 1911, 1916, 1922, 1928, 1936, 1944, - 1952, 1959, 1969, 1974, 2004, 2006, 2009, 2016, 2022, 2024, - 2025, 2026, 2029, 2031, 2032, 2035, 2040, 2047, 2054, 2056, - 2061 + 306, 312, 318, 334, 359, 361, 364, 368, 373, 380, + 388, 393, 397, 406, 408, 416, 420, 428, 432, 435, + 438, 442, 462, 464, 472, 476, 508, 512, 521, 528, + 541, 548, 550, 562, 575, 582, 587, 593, 599, 608, + 614, 620, 627, 633, 641, 645, 648, 655, 661, 667, + 674, 680, 689, 691, 700, 708, 722, 734, 740, 756, + 765, 775, 785, 790, 797, 804, 814, 820, 826, 830, + 853, 855, 857, 863, 869, 876, 883, 888, 894, 900, + 906, 911, 921, 923, 926, 934, 940, 949, 955, 972, + 974, 979, 983, 988, 993, 999, 1003, 1014, 1023, 1032, + 1043, 1065, 1069, 1075, 1081, 1087, 1097, 1107, 1113, 1127, + 1151, 1158, 1172, 1181, 1191, 1201, 1211, 1219, 1240, 1249, + 1258, 1259, 1261, 1268, 1280, 1290, 1298, 1298, 1303, 1308, + 1313, 1318, 1322, 1326, 1329, 1332, 1337, 1349, 1366, 1371, + 1376, 1409, 1419, 1433, 1435, 1436, 1437, 1438, 1439, 1440, + 1441, 1442, 1443, 1444, 1445, 1446, 1452, 1454, 1455, 1458, + 1465, 1477, 1479, 1483, 1487, 1488, 1489, 1490, 1491, 1495, + 1496, 1497, 1498, 1502, 1503, 1510, 1510, 1511, 1511, 1512, + 1514, 1516, 1521, 1525, 1534, 1538, 1543, 1547, 1553, 1563, + 1567, 1570, 1573, 1576, 1581, 1590, 1598, 1604, 1610, 1617, + 1625, 1633, 1642, 1645, 1648, 1649, 1659, 1661, 1662, 1663, + 1666, 1670, 1675, 1681, 1686, 1689, 1692, 1705, 1719, 1723, + 1728, 1732, 1737, 1744, 1757, 1759, 1762, 1766, 1769, 1774, + 1778, 1786, 1801, 1807, 1814, 1827, 1839, 1854, 1858, 1875, + 1880, 1883, 1888, 1910, 1915, 1920, 1926, 1932, 1940, 1948, + 1956, 1963, 1973, 1978, 2008, 2010, 2013, 2020, 2026, 2028, + 2029, 2030, 2033, 2035, 2036, 2039, 2044, 2051, 2058, 2060, + 2065 }; #endif @@ -1348,13 +1352,13 @@ yyparse(YYPARSE_PARAM_ARG) switch (yyn) { case 1: -#line 303 "asn1p_y.y" +#line 307 "asn1p_y.y" { *(void **)param = yyvsp[0].a_grammar; ; break;} case 2: -#line 309 "asn1p_y.y" +#line 313 "asn1p_y.y" { yyval.a_grammar = asn1p_new(); checkmem(yyval.a_grammar); @@ -1362,14 +1366,14 @@ case 2: ; break;} case 3: -#line 314 "asn1p_y.y" +#line 318 "asn1p_y.y" { yyval.a_grammar = yyvsp[-1].a_grammar; TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); ; break;} case 4: -#line 335 "asn1p_y.y" +#line 339 "asn1p_y.y" { if(yyvsp[-1].a_module) { @@ -1386,27 +1390,27 @@ case 4: ; break;} case 5: -#line 356 "asn1p_y.y" +#line 360 "asn1p_y.y" { yyval.a_oid = 0; ; break;} case 6: -#line 357 "asn1p_y.y" +#line 361 "asn1p_y.y" { yyval.a_oid = yyvsp[0].a_oid; ; break;} case 7: -#line 361 "asn1p_y.y" +#line 365 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; ; break;} case 8: -#line 364 "asn1p_y.y" +#line 368 "asn1p_y.y" { yyval.a_oid = 0; ; break;} case 9: -#line 370 "asn1p_y.y" +#line 374 "asn1p_y.y" { yyval.a_oid = asn1p_oid_new(); asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1415,7 +1419,7 @@ case 9: ; break;} case 10: -#line 376 "asn1p_y.y" +#line 380 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1424,74 +1428,74 @@ case 10: ; break;} case 11: -#line 385 "asn1p_y.y" +#line 389 "asn1p_y.y" { /* iso */ yyval.a_oid_arc.name = yyvsp[0].tv_str; yyval.a_oid_arc.number = -1; ; break;} case 12: -#line 389 "asn1p_y.y" +#line 393 "asn1p_y.y" { /* iso(1) */ yyval.a_oid_arc.name = yyvsp[-3].tv_str; yyval.a_oid_arc.number = yyvsp[-1].a_int; ; break;} case 13: -#line 393 "asn1p_y.y" +#line 397 "asn1p_y.y" { /* 1 */ yyval.a_oid_arc.name = 0; yyval.a_oid_arc.number = yyvsp[0].a_int; ; break;} case 14: -#line 403 "asn1p_y.y" +#line 407 "asn1p_y.y" { yyval.a_module_flags = MSF_NOFLAGS; ; break;} case 15: -#line 404 "asn1p_y.y" +#line 408 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; ; break;} case 16: -#line 413 "asn1p_y.y" +#line 417 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; ; break;} case 17: -#line 416 "asn1p_y.y" +#line 420 "asn1p_y.y" { yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags; ; break;} case 18: -#line 425 "asn1p_y.y" +#line 429 "asn1p_y.y" { yyval.a_module_flags = MSF_EXPLICIT_TAGS; ; break;} case 19: -#line 428 "asn1p_y.y" +#line 432 "asn1p_y.y" { yyval.a_module_flags = MSF_IMPLICIT_TAGS; ; break;} case 20: -#line 431 "asn1p_y.y" +#line 435 "asn1p_y.y" { yyval.a_module_flags = MSF_AUTOMATIC_TAGS; ; break;} case 21: -#line 434 "asn1p_y.y" +#line 438 "asn1p_y.y" { yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED; ; break;} case 22: -#line 438 "asn1p_y.y" +#line 442 "asn1p_y.y" { /* X.680Amd1 specifies TAG and XER */ if(strcmp(yyvsp[-1].tv_str, "TAG") == 0) { @@ -1509,23 +1513,23 @@ case 22: ; break;} case 23: -#line 459 "asn1p_y.y" +#line 463 "asn1p_y.y" { yyval.a_module = 0; ; break;} case 24: -#line 460 "asn1p_y.y" +#line 464 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 25: -#line 469 "asn1p_y.y" +#line 473 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 26: -#line 472 "asn1p_y.y" +#line 476 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; @@ -1555,13 +1559,13 @@ case 26: ; break;} case 27: -#line 505 "asn1p_y.y" +#line 509 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 28: -#line 508 "asn1p_y.y" +#line 512 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1573,7 +1577,7 @@ case 28: ; break;} case 29: -#line 517 "asn1p_y.y" +#line 521 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1583,7 +1587,7 @@ case 29: ; break;} case 30: -#line 524 "asn1p_y.y" +#line 528 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1593,7 +1597,7 @@ case 30: ; break;} case 31: -#line 537 "asn1p_y.y" +#line 541 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1603,11 +1607,11 @@ case 31: ; break;} case 32: -#line 545 "asn1p_y.y" +#line 549 "asn1p_y.y" { asn1p_lexer_hack_push_encoding_control(); ; break;} case 33: -#line 546 "asn1p_y.y" +#line 550 "asn1p_y.y" { fprintf(stderr, "WARNING: ENCODING-CONTROL %s " @@ -1618,7 +1622,7 @@ case 33: ; break;} case 34: -#line 558 "asn1p_y.y" +#line 562 "asn1p_y.y" { return yyerror( "Attempt to redefine a standard basic type, " @@ -1627,19 +1631,19 @@ case 34: ; break;} case 35: -#line 572 "asn1p_y.y" +#line 576 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; ; break;} case 36: -#line 578 "asn1p_y.y" +#line 582 "asn1p_y.y" { return yyerror("Empty IMPORTS list"); ; break;} case 37: -#line 584 "asn1p_y.y" +#line 588 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1647,14 +1651,14 @@ case 37: ; break;} case 38: -#line 589 "asn1p_y.y" +#line 593 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); ; break;} case 39: -#line 596 "asn1p_y.y" +#line 600 "asn1p_y.y" { yyval.a_xports = yyvsp[-3].a_xports; yyval.a_xports->from = yyvsp[-1].tv_str; @@ -1663,7 +1667,7 @@ case 39: ; break;} case 40: -#line 605 "asn1p_y.y" +#line 609 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); @@ -1671,14 +1675,14 @@ case 40: ; break;} case 41: -#line 610 "asn1p_y.y" +#line 614 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} case 42: -#line 617 "asn1p_y.y" +#line 621 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1687,7 +1691,7 @@ case 42: ; break;} case 43: -#line 623 "asn1p_y.y" +#line 627 "asn1p_y.y" { /* Completely equivalent to above */ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1696,7 +1700,7 @@ case 43: ; break;} case 44: -#line 629 "asn1p_y.y" +#line 633 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1705,19 +1709,19 @@ case 44: ; break;} case 45: -#line 638 "asn1p_y.y" +#line 642 "asn1p_y.y" { yyval.a_xports = yyvsp[-1].a_xports; ; break;} case 46: -#line 641 "asn1p_y.y" +#line 645 "asn1p_y.y" { yyval.a_xports = 0; ; break;} case 47: -#line 644 "asn1p_y.y" +#line 648 "asn1p_y.y" { /* Empty EXPORTS clause effectively prohibits export. */ yyval.a_xports = asn1p_xports_new(); @@ -1725,7 +1729,7 @@ case 47: ; break;} case 48: -#line 652 "asn1p_y.y" +#line 656 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); assert(yyval.a_xports); @@ -1733,14 +1737,14 @@ case 48: ; break;} case 49: -#line 657 "asn1p_y.y" +#line 661 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} case 50: -#line 664 "asn1p_y.y" +#line 668 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1749,7 +1753,7 @@ case 50: ; break;} case 51: -#line 670 "asn1p_y.y" +#line 674 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1758,7 +1762,7 @@ case 51: ; break;} case 52: -#line 676 "asn1p_y.y" +#line 680 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1767,11 +1771,11 @@ case 52: ; break;} case 53: -#line 687 "asn1p_y.y" +#line 691 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} case 54: -#line 687 "asn1p_y.y" +#line 691 "asn1p_y.y" { yyval.a_expr = yyvsp[-4].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1781,7 +1785,7 @@ case 54: ; break;} case 55: -#line 697 "asn1p_y.y" +#line 701 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1791,7 +1795,7 @@ case 55: ; break;} case 56: -#line 704 "asn1p_y.y" +#line 708 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1800,7 +1804,7 @@ case 56: ; break;} case 57: -#line 722 "asn1p_y.y" +#line 726 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1811,7 +1815,7 @@ case 57: ; break;} case 58: -#line 730 "asn1p_y.y" +#line 734 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -1820,7 +1824,7 @@ case 58: ; break;} case 59: -#line 736 "asn1p_y.y" +#line 740 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -1829,7 +1833,7 @@ case 59: ; break;} case 60: -#line 752 "asn1p_y.y" +#line 756 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1839,7 +1843,7 @@ case 60: ; break;} case 61: -#line 762 "asn1p_y.y" +#line 766 "asn1p_y.y" { int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); @@ -1851,7 +1855,7 @@ case 61: ; break;} case 62: -#line 771 "asn1p_y.y" +#line 775 "asn1p_y.y" { int ret; yyval.a_plist = yyvsp[-2].a_plist; @@ -1862,14 +1866,14 @@ case 62: ; break;} case 63: -#line 782 "asn1p_y.y" +#line 786 "asn1p_y.y" { yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} case 64: -#line 786 "asn1p_y.y" +#line 790 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1879,7 +1883,7 @@ case 64: ; break;} case 65: -#line 793 "asn1p_y.y" +#line 797 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1889,7 +1893,7 @@ case 65: ; break;} case 66: -#line 800 "asn1p_y.y" +#line 804 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1900,7 +1904,7 @@ case 66: ; break;} case 67: -#line 811 "asn1p_y.y" +#line 815 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1908,20 +1912,20 @@ case 67: ; break;} case 68: -#line 816 "asn1p_y.y" +#line 820 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 69: -#line 823 "asn1p_y.y" +#line 827 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 70: -#line 826 "asn1p_y.y" +#line 830 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1931,15 +1935,15 @@ case 70: ; break;} case 71: -#line 850 "asn1p_y.y" +#line 854 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); ; break;} case 72: -#line 851 "asn1p_y.y" +#line 855 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 73: -#line 854 "asn1p_y.y" +#line 858 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1947,14 +1951,14 @@ case 73: ; break;} case 74: -#line 859 "asn1p_y.y" +#line 863 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 75: -#line 866 "asn1p_y.y" +#line 870 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1963,7 +1967,7 @@ case 75: ; break;} case 76: -#line 872 "asn1p_y.y" +#line 876 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1973,13 +1977,13 @@ case 76: ; break;} case 77: -#line 879 "asn1p_y.y" +#line 883 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 78: -#line 885 "asn1p_y.y" +#line 889 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1987,14 +1991,14 @@ case 78: ; break;} case 79: -#line 890 "asn1p_y.y" +#line 894 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 80: -#line 897 "asn1p_y.y" +#line 901 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -2002,13 +2006,13 @@ case 80: ; break;} case 81: -#line 902 "asn1p_y.y" +#line 906 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 82: -#line 908 "asn1p_y.y" +#line 912 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); @@ -2018,15 +2022,15 @@ case 82: ; break;} case 83: -#line 918 "asn1p_y.y" +#line 922 "asn1p_y.y" { yyval.a_int = 0; ; break;} case 84: -#line 919 "asn1p_y.y" +#line 923 "asn1p_y.y" { yyval.a_int = 1; ; break;} case 85: -#line 923 "asn1p_y.y" +#line 927 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2036,14 +2040,14 @@ case 85: ; break;} case 86: -#line 930 "asn1p_y.y" +#line 934 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 87: -#line 937 "asn1p_y.y" +#line 941 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2054,7 +2058,7 @@ case 87: ; break;} case 88: -#line 945 "asn1p_y.y" +#line 949 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; yyval.a_expr->Identifier = yyvsp[-3].a_refcomp.name; @@ -2063,7 +2067,7 @@ case 88: ; break;} case 89: -#line 951 "asn1p_y.y" +#line 955 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2081,47 +2085,47 @@ case 89: ; break;} case 90: -#line 969 "asn1p_y.y" +#line 973 "asn1p_y.y" { yyval.a_wsynt = 0; ; break;} case 91: -#line 970 "asn1p_y.y" +#line 974 "asn1p_y.y" { yyval.a_wsynt = yyvsp[0].a_wsynt; ; break;} case 92: -#line 977 "asn1p_y.y" +#line 981 "asn1p_y.y" { asn1p_lexer_hack_enable_with_syntax(); ; break;} case 93: -#line 979 "asn1p_y.y" +#line 983 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; ; break;} case 94: -#line 985 "asn1p_y.y" +#line 989 "asn1p_y.y" { yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} case 95: -#line 989 "asn1p_y.y" +#line 993 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} case 96: -#line 996 "asn1p_y.y" +#line 1000 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); ; break;} case 97: -#line 999 "asn1p_y.y" +#line 1003 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2133,7 +2137,7 @@ case 97: ; break;} case 98: -#line 1011 "asn1p_y.y" +#line 1015 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2144,7 +2148,7 @@ case 98: ; break;} case 99: -#line 1019 "asn1p_y.y" +#line 1023 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2156,7 +2160,7 @@ case 99: ; break;} case 100: -#line 1028 "asn1p_y.y" +#line 1032 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2168,7 +2172,7 @@ case 100: ; break;} case 101: -#line 1040 "asn1p_y.y" +#line 1044 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; yyval.a_expr->tag = yyvsp[-2].a_tag; @@ -2190,13 +2194,13 @@ case 101: ; break;} case 102: -#line 1062 "asn1p_y.y" +#line 1066 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 103: -#line 1065 "asn1p_y.y" +#line 1069 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2205,7 +2209,7 @@ case 103: ; break;} case 104: -#line 1071 "asn1p_y.y" +#line 1075 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2214,7 +2218,7 @@ case 104: ; break;} case 105: -#line 1077 "asn1p_y.y" +#line 1081 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2223,7 +2227,7 @@ case 105: ; break;} case 106: -#line 1083 "asn1p_y.y" +#line 1087 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2236,7 +2240,7 @@ case 106: ; break;} case 107: -#line 1093 "asn1p_y.y" +#line 1097 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2249,7 +2253,7 @@ case 107: ; break;} case 108: -#line 1103 "asn1p_y.y" +#line 1107 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2258,7 +2262,7 @@ case 108: ; break;} case 109: -#line 1109 "asn1p_y.y" +#line 1113 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2272,7 +2276,7 @@ case 109: ; break;} case 110: -#line 1123 "asn1p_y.y" +#line 1127 "asn1p_y.y" { int ret; yyval.a_expr = yyvsp[-1].a_expr; @@ -2289,7 +2293,7 @@ case 110: ; break;} case 111: -#line 1147 "asn1p_y.y" +#line 1151 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2299,7 +2303,7 @@ case 111: ; break;} case 112: -#line 1154 "asn1p_y.y" +#line 1158 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2309,7 +2313,7 @@ case 112: ; break;} case 113: -#line 1169 "asn1p_y.y" +#line 1173 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2320,7 +2324,7 @@ case 113: ; break;} case 114: -#line 1177 "asn1p_y.y" +#line 1181 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2333,7 +2337,7 @@ case 114: ; break;} case 115: -#line 1187 "asn1p_y.y" +#line 1191 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2346,7 +2350,7 @@ case 115: ; break;} case 116: -#line 1197 "asn1p_y.y" +#line 1201 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2359,7 +2363,7 @@ case 116: ; break;} case 117: -#line 1207 "asn1p_y.y" +#line 1211 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2370,7 +2374,7 @@ case 117: ; break;} case 118: -#line 1215 "asn1p_y.y" +#line 1219 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[0].a_ref; @@ -2392,7 +2396,7 @@ case 118: ; break;} case 119: -#line 1237 "asn1p_y.y" +#line 1241 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2403,7 +2407,7 @@ case 119: ; break;} case 120: -#line 1245 "asn1p_y.y" +#line 1249 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[-2].a_ref; @@ -2413,21 +2417,21 @@ case 120: ; break;} case 123: -#line 1259 "asn1p_y.y" +#line 1263 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} case 124: -#line 1264 "asn1p_y.y" +#line 1268 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} case 125: -#line 1277 "asn1p_y.y" +#line 1281 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); @@ -2437,7 +2441,7 @@ case 125: ; break;} case 126: -#line 1287 "asn1p_y.y" +#line 1291 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2447,11 +2451,11 @@ case 126: ; break;} case 127: -#line 1294 "asn1p_y.y" +#line 1298 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} case 128: -#line 1294 "asn1p_y.y" +#line 1298 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); @@ -2459,7 +2463,7 @@ case 128: ; break;} case 129: -#line 1299 "asn1p_y.y" +#line 1303 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2467,7 +2471,7 @@ case 129: ; break;} case 130: -#line 1304 "asn1p_y.y" +#line 1308 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2475,7 +2479,7 @@ case 130: ; break;} case 131: -#line 1309 "asn1p_y.y" +#line 1313 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2483,39 +2487,39 @@ case 131: ; break;} case 132: -#line 1314 "asn1p_y.y" +#line 1318 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); ; break;} case 133: -#line 1318 "asn1p_y.y" +#line 1322 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); ; break;} case 134: -#line 1322 "asn1p_y.y" +#line 1326 "asn1p_y.y" { yyval.a_value = yyval.a_value; ; break;} case 135: -#line 1325 "asn1p_y.y" +#line 1329 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 136: -#line 1328 "asn1p_y.y" +#line 1332 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 137: -#line 1334 "asn1p_y.y" +#line 1338 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2529,7 +2533,7 @@ case 137: ; break;} case 138: -#line 1345 "asn1p_y.y" +#line 1349 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2546,14 +2550,14 @@ case 138: ; break;} case 139: -#line 1363 "asn1p_y.y" +#line 1367 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} case 140: -#line 1367 "asn1p_y.y" +#line 1371 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); @@ -2561,7 +2565,7 @@ case 140: ; break;} case 141: -#line 1372 "asn1p_y.y" +#line 1376 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); @@ -2569,7 +2573,7 @@ case 141: ; break;} case 142: -#line 1406 "asn1p_y.y" +#line 1410 "asn1p_y.y" { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 1; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); @@ -2581,7 +2585,7 @@ case 142: ; break;} case 143: -#line 1415 "asn1p_y.y" +#line 1419 "asn1p_y.y" { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); @@ -2596,71 +2600,71 @@ case 143: ; break;} case 144: -#line 1430 "asn1p_y.y" +#line 1434 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BOOLEAN; ; break;} case 145: -#line 1431 "asn1p_y.y" +#line 1435 "asn1p_y.y" { yyval.a_type = ASN_BASIC_NULL; ; break;} case 146: -#line 1432 "asn1p_y.y" +#line 1436 "asn1p_y.y" { yyval.a_type = ASN_BASIC_REAL; ; break;} case 147: -#line 1433 "asn1p_y.y" +#line 1437 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} case 148: -#line 1434 "asn1p_y.y" +#line 1438 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OCTET_STRING; ; break;} case 149: -#line 1435 "asn1p_y.y" +#line 1439 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; break;} case 150: -#line 1436 "asn1p_y.y" +#line 1440 "asn1p_y.y" { yyval.a_type = ASN_BASIC_RELATIVE_OID; ; break;} case 151: -#line 1437 "asn1p_y.y" +#line 1441 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EXTERNAL; ; break;} case 152: -#line 1438 "asn1p_y.y" +#line 1442 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; break;} case 153: -#line 1439 "asn1p_y.y" +#line 1443 "asn1p_y.y" { yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; break;} case 154: -#line 1440 "asn1p_y.y" +#line 1444 "asn1p_y.y" { yyval.a_type = ASN_BASIC_UTCTime; ; break;} case 155: -#line 1441 "asn1p_y.y" +#line 1445 "asn1p_y.y" { yyval.a_type = ASN_BASIC_GeneralizedTime; ; break;} case 156: -#line 1442 "asn1p_y.y" +#line 1446 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} case 157: -#line 1449 "asn1p_y.y" +#line 1453 "asn1p_y.y" { yyval.a_type = ASN_BASIC_INTEGER; ; break;} case 158: -#line 1450 "asn1p_y.y" +#line 1454 "asn1p_y.y" { yyval.a_type = ASN_BASIC_ENUMERATED; ; break;} case 159: -#line 1451 "asn1p_y.y" +#line 1455 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BIT_STRING; ; break;} case 160: -#line 1455 "asn1p_y.y" +#line 1459 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2669,7 +2673,7 @@ case 160: ; break;} case 161: -#line 1461 "asn1p_y.y" +#line 1465 "asn1p_y.y" { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; @@ -2682,91 +2686,91 @@ case 161: ; break;} case 162: -#line 1474 "asn1p_y.y" +#line 1478 "asn1p_y.y" { yyval.a_type = ASN_STRING_BMPString; ; break;} case 163: -#line 1475 "asn1p_y.y" +#line 1479 "asn1p_y.y" { yyval.a_type = ASN_STRING_GeneralString; fprintf(stderr, "WARNING: GeneralString is not fully supported\n"); ; break;} case 164: -#line 1479 "asn1p_y.y" +#line 1483 "asn1p_y.y" { yyval.a_type = ASN_STRING_GraphicString; fprintf(stderr, "WARNING: GraphicString is not fully supported\n"); ; break;} case 165: -#line 1483 "asn1p_y.y" +#line 1487 "asn1p_y.y" { yyval.a_type = ASN_STRING_IA5String; ; break;} case 166: -#line 1484 "asn1p_y.y" +#line 1488 "asn1p_y.y" { yyval.a_type = ASN_STRING_ISO646String; ; break;} case 167: -#line 1485 "asn1p_y.y" +#line 1489 "asn1p_y.y" { yyval.a_type = ASN_STRING_NumericString; ; break;} case 168: -#line 1486 "asn1p_y.y" +#line 1490 "asn1p_y.y" { yyval.a_type = ASN_STRING_PrintableString; ; break;} case 169: -#line 1487 "asn1p_y.y" +#line 1491 "asn1p_y.y" { yyval.a_type = ASN_STRING_T61String; fprintf(stderr, "WARNING: T61String is not fully supported\n"); ; break;} case 170: -#line 1491 "asn1p_y.y" +#line 1495 "asn1p_y.y" { yyval.a_type = ASN_STRING_TeletexString; ; break;} case 171: -#line 1492 "asn1p_y.y" +#line 1496 "asn1p_y.y" { yyval.a_type = ASN_STRING_UniversalString; ; break;} case 172: -#line 1493 "asn1p_y.y" +#line 1497 "asn1p_y.y" { yyval.a_type = ASN_STRING_UTF8String; ; break;} case 173: -#line 1494 "asn1p_y.y" +#line 1498 "asn1p_y.y" { yyval.a_type = ASN_STRING_VideotexString; fprintf(stderr, "WARNING: VideotexString is not fully supported\n"); ; break;} case 174: -#line 1498 "asn1p_y.y" +#line 1502 "asn1p_y.y" { yyval.a_type = ASN_STRING_VisibleString; ; break;} case 175: -#line 1499 "asn1p_y.y" +#line 1503 "asn1p_y.y" { yyval.a_type = ASN_STRING_ObjectDescriptor; ; break;} case 181: -#line 1511 "asn1p_y.y" +#line 1515 "asn1p_y.y" { yyval.a_constr = 0; ; break;} case 182: -#line 1512 "asn1p_y.y" +#line 1516 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 183: -#line 1518 "asn1p_y.y" +#line 1522 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); ; break;} case 184: -#line 1521 "asn1p_y.y" +#line 1525 "asn1p_y.y" { /* * This is a special case, for compatibility purposes. @@ -2776,25 +2780,25 @@ case 184: ; break;} case 185: -#line 1531 "asn1p_y.y" +#line 1535 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; ; break;} case 186: -#line 1534 "asn1p_y.y" +#line 1538 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} case 187: -#line 1540 "asn1p_y.y" +#line 1544 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 188: -#line 1543 "asn1p_y.y" +#line 1547 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2803,7 +2807,7 @@ case 188: ; break;} case 189: -#line 1549 "asn1p_y.y" +#line 1553 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2814,37 +2818,37 @@ case 189: ; break;} case 190: -#line 1560 "asn1p_y.y" +#line 1564 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 191: -#line 1563 "asn1p_y.y" +#line 1567 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_AEX, yyvsp[0].a_constr, 0); ; break;} case 192: -#line 1566 "asn1p_y.y" +#line 1570 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 193: -#line 1569 "asn1p_y.y" +#line 1573 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 194: -#line 1572 "asn1p_y.y" +#line 1576 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 195: -#line 1578 "asn1p_y.y" +#line 1582 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2855,7 +2859,7 @@ case 195: ; break;} case 196: -#line 1586 "asn1p_y.y" +#line 1590 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2866,7 +2870,7 @@ case 196: ; break;} case 197: -#line 1594 "asn1p_y.y" +#line 1598 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2875,7 +2879,7 @@ case 197: ; break;} case 198: -#line 1600 "asn1p_y.y" +#line 1604 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2884,7 +2888,7 @@ case 198: ; break;} case 199: -#line 1606 "asn1p_y.y" +#line 1610 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2894,7 +2898,7 @@ case 199: ; break;} case 200: -#line 1613 "asn1p_y.y" +#line 1617 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2905,7 +2909,7 @@ case 200: ; break;} case 201: -#line 1621 "asn1p_y.y" +#line 1625 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2916,7 +2920,7 @@ case 201: ; break;} case 202: -#line 1629 "asn1p_y.y" +#line 1633 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2928,23 +2932,23 @@ case 202: ; break;} case 203: -#line 1638 "asn1p_y.y" +#line 1642 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 204: -#line 1641 "asn1p_y.y" +#line 1645 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 205: -#line 1645 "asn1p_y.y" +#line 1649 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} case 206: -#line 1645 "asn1p_y.y" +#line 1649 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2955,35 +2959,35 @@ case 206: ; break;} case 207: -#line 1656 "asn1p_y.y" +#line 1660 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RANGE; ; break;} case 208: -#line 1657 "asn1p_y.y" +#line 1661 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RLRANGE; ; break;} case 209: -#line 1658 "asn1p_y.y" +#line 1662 "asn1p_y.y" { yyval.a_ctype = ACT_EL_LLRANGE; ; break;} case 210: -#line 1659 "asn1p_y.y" +#line 1663 "asn1p_y.y" { yyval.a_ctype = ACT_EL_ULRANGE; ; break;} case 211: -#line 1663 "asn1p_y.y" +#line 1667 "asn1p_y.y" { yyval.a_ctype = ACT_CT_SIZE; ; break;} case 212: -#line 1666 "asn1p_y.y" +#line 1670 "asn1p_y.y" { yyval.a_ctype = ACT_CT_FROM; ; break;} case 213: -#line 1672 "asn1p_y.y" +#line 1676 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2991,7 +2995,7 @@ case 213: ; break;} case 214: -#line 1677 "asn1p_y.y" +#line 1681 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); @@ -2999,19 +3003,19 @@ case 214: ; break;} case 215: -#line 1682 "asn1p_y.y" +#line 1686 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 216: -#line 1685 "asn1p_y.y" +#line 1689 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 217: -#line 1688 "asn1p_y.y" +#line 1692 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3025,7 +3029,7 @@ case 217: ; break;} case 218: -#line 1702 "asn1p_y.y" +#line 1706 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3039,31 +3043,31 @@ case 218: ; break;} case 219: -#line 1716 "asn1p_y.y" +#line 1720 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMP, yyvsp[0].a_constr, 0); ; break;} case 220: -#line 1719 "asn1p_y.y" +#line 1723 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); ; break;} case 221: -#line 1725 "asn1p_y.y" +#line 1729 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 222: -#line 1728 "asn1p_y.y" +#line 1732 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 223: -#line 1734 "asn1p_y.y" +#line 1738 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3072,7 +3076,7 @@ case 223: ; break;} case 224: -#line 1740 "asn1p_y.y" +#line 1744 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3083,45 +3087,45 @@ case 224: ; break;} case 225: -#line 1754 "asn1p_y.y" +#line 1758 "asn1p_y.y" { yyval.a_pres = ACPRES_DEFAULT; ; break;} case 226: -#line 1755 "asn1p_y.y" +#line 1759 "asn1p_y.y" { yyval.a_pres = yyvsp[0].a_pres; ; break;} case 227: -#line 1759 "asn1p_y.y" +#line 1763 "asn1p_y.y" { yyval.a_pres = ACPRES_PRESENT; ; break;} case 228: -#line 1762 "asn1p_y.y" +#line 1766 "asn1p_y.y" { yyval.a_pres = ACPRES_ABSENT; ; break;} case 229: -#line 1765 "asn1p_y.y" +#line 1769 "asn1p_y.y" { yyval.a_pres = ACPRES_OPTIONAL; ; break;} case 230: -#line 1771 "asn1p_y.y" +#line 1775 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 231: -#line 1774 "asn1p_y.y" +#line 1778 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 232: -#line 1783 "asn1p_y.y" +#line 1787 "asn1p_y.y" { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; @@ -3136,13 +3140,13 @@ case 232: ; break;} case 233: -#line 1798 "asn1p_y.y" +#line 1802 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} case 234: -#line 1804 "asn1p_y.y" +#line 1808 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3151,7 +3155,7 @@ case 234: ; break;} case 235: -#line 1810 "asn1p_y.y" +#line 1814 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3162,7 +3166,7 @@ case 235: ; break;} case 236: -#line 1824 "asn1p_y.y" +#line 1828 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; @@ -3176,7 +3180,7 @@ case 236: ; break;} case 237: -#line 1835 "asn1p_y.y" +#line 1839 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; @@ -3191,13 +3195,13 @@ case 237: ; break;} case 238: -#line 1851 "asn1p_y.y" +#line 1855 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} case 239: -#line 1854 "asn1p_y.y" +#line 1858 "asn1p_y.y" { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); @@ -3209,45 +3213,45 @@ case 239: ; break;} case 240: -#line 1872 "asn1p_y.y" +#line 1876 "asn1p_y.y" { yyval.a_marker.flags = EM_NOMARK; yyval.a_marker.default_value = 0; ; break;} case 241: -#line 1876 "asn1p_y.y" +#line 1880 "asn1p_y.y" { yyval.a_marker = yyvsp[0].a_marker; ; break;} case 242: -#line 1880 "asn1p_y.y" +#line 1884 "asn1p_y.y" { yyval.a_marker.flags = EM_OPTIONAL; yyval.a_marker.default_value = 0; ; break;} case 243: -#line 1884 "asn1p_y.y" +#line 1888 "asn1p_y.y" { yyval.a_marker.flags = EM_DEFAULT; yyval.a_marker.default_value = yyvsp[0].a_value; ; break;} case 244: -#line 1907 "asn1p_y.y" +#line 1911 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); ; break;} case 245: -#line 1911 "asn1p_y.y" +#line 1915 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; ; break;} case 246: -#line 1917 "asn1p_y.y" +#line 1921 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3255,14 +3259,14 @@ case 246: ; break;} case 247: -#line 1922 "asn1p_y.y" +#line 1926 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 248: -#line 1929 "asn1p_y.y" +#line 1933 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3272,7 +3276,7 @@ case 248: ; break;} case 249: -#line 1936 "asn1p_y.y" +#line 1940 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3283,7 +3287,7 @@ case 249: ; break;} case 250: -#line 1944 "asn1p_y.y" +#line 1948 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3294,7 +3298,7 @@ case 250: ; break;} case 251: -#line 1952 "asn1p_y.y" +#line 1956 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3304,7 +3308,7 @@ case 251: ; break;} case 252: -#line 1959 "asn1p_y.y" +#line 1963 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3315,102 +3319,102 @@ case 252: ; break;} case 253: -#line 1970 "asn1p_y.y" +#line 1974 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} case 254: -#line 1974 "asn1p_y.y" +#line 1978 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} case 255: -#line 2005 "asn1p_y.y" +#line 2009 "asn1p_y.y" { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; break;} case 256: -#line 2006 "asn1p_y.y" +#line 2010 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; ; break;} case 257: -#line 2010 "asn1p_y.y" +#line 2014 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = yyvsp[0].a_tag.tag_mode; ; break;} case 258: -#line 2017 "asn1p_y.y" +#line 2021 "asn1p_y.y" { yyval.a_tag = yyvsp[-2].a_tag; yyval.a_tag.tag_value = yyvsp[-1].a_int; ; break;} case 259: -#line 2023 "asn1p_y.y" +#line 2027 "asn1p_y.y" { yyval.a_tag.tag_class = TC_CONTEXT_SPECIFIC; ; break;} case 260: -#line 2024 "asn1p_y.y" +#line 2028 "asn1p_y.y" { yyval.a_tag.tag_class = TC_UNIVERSAL; ; break;} case 261: -#line 2025 "asn1p_y.y" +#line 2029 "asn1p_y.y" { yyval.a_tag.tag_class = TC_APPLICATION; ; break;} case 262: -#line 2026 "asn1p_y.y" +#line 2030 "asn1p_y.y" { yyval.a_tag.tag_class = TC_PRIVATE; ; break;} case 263: -#line 2030 "asn1p_y.y" +#line 2034 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_DEFAULT; ; break;} case 264: -#line 2031 "asn1p_y.y" +#line 2035 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_IMPLICIT; ; break;} case 265: -#line 2032 "asn1p_y.y" +#line 2036 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_EXPLICIT; ; break;} case 266: -#line 2036 "asn1p_y.y" +#line 2040 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} case 267: -#line 2040 "asn1p_y.y" +#line 2044 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} case 268: -#line 2048 "asn1p_y.y" +#line 2052 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} case 269: -#line 2055 "asn1p_y.y" +#line 2059 "asn1p_y.y" { yyval.tv_str = 0; ; break;} case 270: -#line 2056 "asn1p_y.y" +#line 2060 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} case 271: -#line 2062 "asn1p_y.y" +#line 2066 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; @@ -3490,7 +3494,7 @@ case 271: count = 0; /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) + x < (int)(sizeof(yytname) / sizeof(char *)); x++) if (yycheck[x + yyn] == x) size += strlen(yytname[x]) + 15, count++; msg = (char *) malloc(size + 15); @@ -3502,7 +3506,7 @@ case 271: { count = 0; for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) + x < (int)(sizeof(yytname) / sizeof(char *)); x++) if (yycheck[x + yyn] == x) { strcat(msg, count == 0 ? ", expecting `" : " or `"); @@ -3638,7 +3642,7 @@ case 271: } return 1; } -#line 2068 "asn1p_y.y" +#line 2072 "asn1p_y.y" From 160b015cd620e693219530400405e435b077801d Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 8 Jun 2005 00:06:59 +0000 Subject: [PATCH 0904/1469] offset printing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@904 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/enber.1 | 8 +++--- asn1c/enber.c | 8 ++++-- asn1c/unber.1 | 43 ++++++++++++++++-------------- asn1c/unber.c | 72 ++++++++++++++++++++++++++++++--------------------- 4 files changed, 76 insertions(+), 55 deletions(-) diff --git a/asn1c/enber.1 b/asn1c/enber.1 index 4a9edfc22..365bc46a3 100644 --- a/asn1c/enber.1 +++ b/asn1c/enber.1 @@ -12,7 +12,7 @@ .SH NAME enber \- Convert the unber XML output back into BER .SH SYNOPSIS -enber [\fB-n\fR] [\fB-\fR] \fIinfile\fR... +enber [\fB-n\fR] [\fB-\fR] [\fIinfile\fR...] .SH DESCRIPTION enber takes the XML-formatted files produced by \fIunber\fR\|(1) and converts them back into the BER format. @@ -39,9 +39,9 @@ The following example demostrates the use of comments: .Vb \& \& -\& -- -\& # Do not terminate: -\& # the absence of end-of-content octets is intentional! +\& \fB--\fR
    +\& \fB#\fR Do not terminate: +\& \fB#\fR the absence of end-of-content octets is intentional! \& .Ve .SH SEE ALSO diff --git a/asn1c/enber.c b/asn1c/enber.c index 1ecef6f5d..12dae96e9 100644 --- a/asn1c/enber.c +++ b/asn1c/enber.c @@ -179,8 +179,10 @@ process_line(const char *fname, char *line, int lineno) { ssize_t ret; (void)fname; - /* Find a tag opening angle bracket */ + /* Skip the whitespace */ for(; *line == ' ' || *line == '\t'; line++); + + /* Find a tag opening angle bracket */ op = line; switch(*op) { case '<': /* That's what we want! A tag opening */ @@ -192,7 +194,9 @@ process_line(const char *fname, char *line, int lineno) { case '#': /* This is a comment */ return 0; default: - fprintf(stderr, "%s: Missing '<' after whitespace at line %d\n", fname, lineno); + fprintf(stderr, + "%s: Missing '<' after whitespace at line %d\n", + fname, lineno); exit(EX_DATAERR); } diff --git a/asn1c/unber.1 b/asn1c/unber.1 index a31fabd1d..7f203d0bd 100644 --- a/asn1c/unber.1 +++ b/asn1c/unber.1 @@ -12,7 +12,7 @@ .SH NAME unber \- ASN.1 BER Decoder .SH SYNOPSIS -unber [\fB-1\fR] [\fB-i\fRindent] [\fB-p\fR] [\fB\-t\fR\fIdata-string\fR] [\fB-\fR] \fIinfile\fR... +unber [\fB-1\fR] [\fB-i\fRindent] [\fB-p\fR] [\fB\-t\fR\fIdata-string\fR] [\fB-\fR] [\fIinfile\fR...] .SH DESCRIPTION unber takes the BER-encoded files and dumps their internal structure as human readable text. A single dash represents the standard input. @@ -41,36 +41,39 @@ information from the underlying binary encoding. .P The XML opening tag format is as follows: .Vb -\& <\fItform\fR T="\fItag\fR" TL="\fItl_len\fR" V="{Indefinite|\fIv_len\fR}" [A="\fItype\fR"] [\fIF\fR]> +\&<\fBtform\fR O="\fBoff\fR" T="\fBtag\fR" TL="\fBtl_len\fR" V="{Indefinite|\fBv_len\fR}" [A="\fBtype\fR"] [\fBF\fR]> .Ve Where: .TP -\fItform\fR +\fBtform\fR Which form the value is in: primitive ("P") or constructed ("C") or constructed with indefinite length ("I") .TP -\fItag\fR -The tag class and value +\fBoff\fR +Offset of the encoded element in the unber input stream. .TP -\fItl_len\fR -The length of the TL (BER Tag and Length) encoding +\fBtag\fR +The tag class and value in human readable form. .TP -\fIv_len\fR -The length of the value (V, encoded by the L), may be "Indefinite" +\fBtl_len\fR +The length of the TL (BER Tag and Length) encoding. .TP -\fItype\fR -Likely name of the underlying ASN.1 type (for UNIVERSAL tags) +\fBv_len\fR +The length of the value (V, encoded by the L), may be "Indefinite". .TP -[\fIF\fR] -Indicates that the value was reformatted (pretty-printed) +\fBtype\fR +Likely name of the underlying ASN.1 type (for UNIVERSAL tags). +.TP +[\fBF\fR] +Indicates that the value was reformatted (pretty-printed). This may only appear in the output as long \fB-p\fR command line option is \fInot\fR specified. .P Sample XML output: .Vb -\& -\&

    US

    -\& -\&

    832970823

    -\&
    -\&
    +\& +\&

    US

    +\& +\&

    832970823

    +\&
    +\&
    .Ve .SH EXAMPLES Decode the given Tag/Length sequence given in hexadecimal form: @@ -87,7 +90,7 @@ Decode the binary stream taken from the standard input: .Ve Decode the binary stream into the same stream (see \&\fIenber\fR\|(1)): .Vb -\& cat \fI...\fR | unber \fB-p\fR \fB-\fR | enber \fB-\fR > filename.ber\fI\fR +\& cat \fI...\fR | unber \fB-p\fR \fB-\fR | enber \fB-\fR > \fIfilename.ber\fR .Ve .SH FOOTNOTES The constructed XML output is not necessarily well-formed. diff --git a/asn1c/unber.c b/asn1c/unber.c index 4a68c685d..db00157f8 100644 --- a/asn1c/unber.c +++ b/asn1c/unber.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Copyright (c) 2004, 2005 Lev Walkin . All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -38,7 +38,7 @@ #undef COPYRIGHT #define COPYRIGHT \ - "Copyright (c) 2004 Lev Walkin \n" + "Copyright (c) 2004, 2005 Lev Walkin \n" static void usage(const char *av0); /* Print the Usage screen and exit */ static int process(const char *fname); /* Perform the BER decoding */ @@ -128,10 +128,11 @@ usage(const char *av0) { " -t Decode the given tag[/length] sequence (e.g. -t \"bf20\")\n" "\n" "The XML opening tag format is as follows:\n" -" \n" +" \n" "Where:\n" " tform Which form the value is in: constructed (\"C\", \"I\") or primitive (\"P\")\n" -" tag The tag class and value\n" +" off Offset of the encoded element in the unber input stream\n" +" tag The tag class and value in human readable form\n" " tl_len The length of the TL (BER Tag and Length) encoding\n" " v_len The length of the value (V, encoded by the L), may be \"Indefinite\"\n" " type Likely name of the underlying ASN.1 type (for [UNIVERSAL n] tags)\n" @@ -146,8 +147,8 @@ typedef enum pd_code { PD_FINISHED = 0, PD_EOF = 1, } pd_code_e; -static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t limit, ssize_t *decoded, int expect_eoc); -static void print_TL(int fin, int level, int constr, ssize_t tlen, ber_tlv_tag_t, ber_tlv_len_t); +static pd_code_e process_deeper(const char *fname, FILE *fp, asn1c_integer_t *offset, int level, ssize_t limit, ssize_t *frame_size, int expect_eoc); +static void print_TL(int fin, asn1c_integer_t offset, int level, int constr, ssize_t tlen, ber_tlv_tag_t, ber_tlv_len_t); static int print_V(const char *fname, FILE *fp, ber_tlv_tag_t, ber_tlv_len_t); /* @@ -157,7 +158,8 @@ static int process(const char *fname) { FILE *fp; pd_code_e pdc; - ssize_t decoded = 0; + asn1c_integer_t offset = 0; /* Stream decoding position */ + ssize_t frame_size = 0; /* Single frame size */ if(strcmp(fname, "-")) { fp = fopen(fname, "r"); @@ -173,7 +175,7 @@ process(const char *fname) { * Fetch out BER-encoded data until EOF or error. */ do { - pdc = process_deeper(fname, fp, 0, -1, &decoded, 0); + pdc = process_deeper(fname, fp, &offset, 0, -1, &frame_size, 0); } while(pdc == PD_FINISHED && !single_type_decoding); if(fp != stdin) @@ -187,7 +189,7 @@ process(const char *fname) { /* * Process the TLV recursively. */ -static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t limit, ssize_t *decoded, int expect_eoc) { +static pd_code_e process_deeper(const char *fname, FILE *fp, asn1c_integer_t *offset, int level, ssize_t limit, ssize_t *frame_size, int expect_eoc) { unsigned char tagbuf[32]; ssize_t tblen = 0; pd_code_e pdc = PD_FINISHED; @@ -205,18 +207,21 @@ static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t if(limit >= 0 && tblen >= limit) { fprintf(stderr, - "%s: Too long TL sequence (%ld >= %ld). " - "Dangerous file\n", - fname, (long)tblen, (long)limit); + "%s: Too long TL sequence (%ld >= %ld)" + " at %" PRIdASN ". " + "Broken or maliciously constructed file\n", + fname, (long)tblen, (long)limit, *offset); return PD_FAILED; } + /* Get the next byte from the input stream */ ch = fgetc(fp); if(ch == -1) { - if(tblen) { + if(tblen || limit) { fprintf(stderr, - "%s: Unexpected end of file (TL)\n", - fname); + "%s: Unexpected end of file (TL)" + " at %" PRIdASN "\n", + fname, *offset); return PD_FAILED; } else { return PD_EOF; @@ -231,8 +236,9 @@ static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t t_len = ber_fetch_tag(tagbuf, tblen, &tlv_tag); switch(t_len) { case -1: - fprintf(stderr, "%s: Fatal error deciphering tag\n", - fname); + fprintf(stderr, "%s: Fatal error decoding tag" + " at %" PRIdASN "+%ld\n", + fname, *offset, (long)tblen); return PD_FAILED; case 0: /* More data expected */ @@ -247,8 +253,10 @@ static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t tagbuf + t_len, tblen - t_len, &tlv_len); switch(l_len) { case -1: - fprintf(stderr, "%s: Fatal error deciphering length\n", - fname); + fprintf(stderr, + "%s: Fatal error decoding value length" + " at %" PRIdASN "\n", + fname, *offset + t_len); return PD_FAILED; case 0: /* More data expected */ @@ -259,7 +267,7 @@ static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t assert((t_len + l_len) == tblen); if(!expect_eoc || tagbuf[0] || tagbuf[1]) - print_TL(0, level, constr, tblen, tlv_tag, tlv_len); + print_TL(0, *offset, level, constr, tblen, tlv_tag, tlv_len); if(limit != -1) { /* If limit is set, account for the TL sequence */ @@ -275,11 +283,12 @@ static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t } } - *decoded += t_len + l_len; + *offset += t_len + l_len; + *frame_size += t_len + l_len; if(expect_eoc && tagbuf[0] == '\0' && tagbuf[1] == '\0') { /* End of content octets */ - print_TL(1, level - 1, 1, 2, 0, -1); + print_TL(1, *offset, level - 1, 1, 2, 0, -1); return PD_FINISHED; } @@ -292,7 +301,7 @@ static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t if(tlv_len != -1 && limit != -1) { assert(limit >= tlv_len); } - pdc = process_deeper(fname, fp, level + 1, + pdc = process_deeper(fname, fp, offset, level + 1, tlv_len == -1 ? limit : tlv_len, &dec, tlv_len == -1); if(pdc == PD_FAILED) return pdc; @@ -300,7 +309,7 @@ static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t assert(limit >= dec); limit -= dec; } - *decoded += dec; + *frame_size += dec; if(tlv_len == -1) { tblen = 0; continue; @@ -314,10 +323,11 @@ static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t assert(limit >= tlv_len); limit -= tlv_len; } - *decoded += tlv_len; + *offset += tlv_len; + *frame_size += tlv_len; } - print_TL(1, level, constr, tblen, tlv_tag, tlv_len); + print_TL(1, *offset, level, constr, tblen, tlv_tag, tlv_len); tblen = 0; } while(1); @@ -326,7 +336,7 @@ static pd_code_e process_deeper(const char *fname, FILE *fp, int level, ssize_t } static void -print_TL(int fin, int level, int constr, ssize_t tlen, ber_tlv_tag_t tlv_tag, ber_tlv_len_t tlv_len) { +print_TL(int fin, asn1c_integer_t offset, int level, int constr, ssize_t tlen, ber_tlv_tag_t tlv_tag, ber_tlv_len_t tlv_len) { if(fin && !constr) { printf("

    \n"); @@ -338,6 +348,10 @@ print_TL(int fin, int level, int constr, ssize_t tlen, ber_tlv_tag_t tlv_tag, be printf(constr ? ((tlv_len == -1) ? "I" : "C") : "P"); + /* In case of

    832970823

    \& -\&

    , , , print out the offset */ + if(fin == 0 || tlv_len == -1) + printf(" O=\"%" PRIdASN "\"", offset); + printf(" T=\""); ber_tlv_tag_fwrite(tlv_tag, stdout); printf("\""); @@ -645,7 +659,7 @@ decode_tlv_from_string(const char *datastring) { len = ber_fetch_tag(data, dsize, &tlv_tag); switch(len) { case -1: - fprintf(stderr, "TAG: Fatal error deciphering tag\n"); + fprintf(stderr, "TAG: Fatal error decoding tag\n"); return -1; case 0: fprintf(stderr, "TAG: More data expected\n"); @@ -675,7 +689,7 @@ decode_tlv_from_string(const char *datastring) { switch(len) { case -1: fprintf(stderr, - "LEN: Fatal error deciphering length\n"); + "LEN: Fatal error decoding length\n"); return -1; case 0: fprintf(stderr, "LEN: More data expected\n"); From 23abf75f53157e879b29ca4f474c9878a5361fe4 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 8 Jun 2005 00:12:00 +0000 Subject: [PATCH 0905/1469] offset for is displayed too git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@905 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/unber.1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asn1c/unber.1 b/asn1c/unber.1 index 7f203d0bd..b67c87b48 100644 --- a/asn1c/unber.1 +++ b/asn1c/unber.1 @@ -73,7 +73,7 @@ Sample XML output: \& \&

    +\& .Ve .SH EXAMPLES Decode the given Tag/Length sequence given in hexadecimal form: From 8a8f657a5dea32b53836bc935a971d7f3e1ab7dc Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 8 Jun 2005 00:40:39 +0000 Subject: [PATCH 0906/1469] indefinite length should not cause this git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@906 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/unber.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asn1c/unber.c b/asn1c/unber.c index db00157f8..73004363b 100644 --- a/asn1c/unber.c +++ b/asn1c/unber.c @@ -217,7 +217,7 @@ static pd_code_e process_deeper(const char *fname, FILE *fp, asn1c_integer_t *of /* Get the next byte from the input stream */ ch = fgetc(fp); if(ch == -1) { - if(tblen || limit) { + if(tblen || limit > 0) { fprintf(stderr, "%s: Unexpected end of file (TL)" " at %" PRIdASN "\n", From d0137e1e172d18dc5a324bc303f5da8b3e3c0cb1 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Jun 2005 18:12:48 +0000 Subject: [PATCH 0907/1469] proper constants git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@907 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_fdeps.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/libasn1compiler/asn1c_fdeps.c b/libasn1compiler/asn1c_fdeps.c index 68a090da8..0066f51a3 100644 --- a/libasn1compiler/asn1c_fdeps.c +++ b/libasn1compiler/asn1c_fdeps.c @@ -6,7 +6,7 @@ static int asn1c_dep_add(asn1c_fdeps_t *deps, asn1c_fdeps_t *d); int asn1c_activate_dependency(asn1c_fdeps_t *deps, asn1c_fdeps_t *cur, const char *data) { - char *fname; + const char *fname; int i; if(!deps || !data || !*data) @@ -16,7 +16,7 @@ asn1c_activate_dependency(asn1c_fdeps_t *deps, asn1c_fdeps_t *cur, const char *d if(cur->used_somewhere) return 1; /* Already activated */ - (const char *)fname = data; + fname = data; if(*data == '#') { const char *start = data; const char *end = 0; @@ -27,9 +27,10 @@ asn1c_activate_dependency(asn1c_fdeps_t *deps, asn1c_fdeps_t *cur, const char *d end = strchr(start, '>'); } if(end) { - fname = alloca((end - start) + 1); - memcpy(fname, start, end - start); - fname[end-start] = '\0'; + char *p = alloca((end - start) + 1); + memcpy(p, start, end - start); + p[end-start] = '\0'; + fname = p; } else { return 0; } From 55289c1ee79378e70579e11f1ee50b1abb585320 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Jun 2005 18:41:50 +0000 Subject: [PATCH 0908/1469] fixes for gcc 4.x git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@908 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/unber.c | 4 ++-- libasn1fix/asn1fix_cstring.c | 2 +- libasn1fix/asn1fix_misc.c | 2 +- libasn1parser/asn1p_value.c | 6 +++--- libasn1print/asn1print.c | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/asn1c/unber.c b/asn1c/unber.c index 73004363b..28087d4f0 100644 --- a/asn1c/unber.c +++ b/asn1c/unber.c @@ -708,10 +708,10 @@ decode_tlv_from_string(const char *datastring) { /* * Dummy functions. */ -asn_dec_rval_t ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_struct_ctx_t *opt_ctx, const void *ptr, size_t size, int tag_mode, int last_tag_form, ber_tlv_len_t *last_length, int *opt_tlv_form) { asn_dec_rval_t rv; (void)opt_codec_ctx; (void)td; (void)opt_ctx; (void)ptr; (void)size; (void)tag_mode; (void)last_tag_form; (void)last_length; (void)opt_tlv_form; return rv; } +asn_dec_rval_t ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_struct_ctx_t *opt_ctx, const void *ptr, size_t size, int tag_mode, int last_tag_form, ber_tlv_len_t *last_length, int *opt_tlv_form) { asn_dec_rval_t rv = { 0, 0 }; (void)opt_codec_ctx; (void)td; (void)opt_ctx; (void)ptr; (void)size; (void)tag_mode; (void)last_tag_form; (void)last_length; (void)opt_tlv_form; return rv; } ssize_t der_write_tags(asn_TYPE_descriptor_t *td, size_t slen, int tag_mode, int last_tag_form, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { (void)td; (void)slen; (void)tag_mode; (void)last_tag_form; (void)tag; (void)cb; (void)app_key; return -1; } -asn_dec_rval_t xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, asn_struct_ctx_t *ctx, void *struct_key, const char *xml_tag, const void *buf_ptr, size_t size, int (*otd)(void *struct_key, const void *chunk_buf, size_t chunk_size), ssize_t (*br)(void *struct_key, const void *chunk_buf, size_t chunk_size, int have_more)) { asn_dec_rval_t rv; (void)opt_codec_ctx; (void)ctx; (void)struct_key; (void)xml_tag; (void)buf_ptr; (void)size; (void)otd; (void)br; return rv; } +asn_dec_rval_t xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, asn_struct_ctx_t *ctx, void *struct_key, const char *xml_tag, const void *buf_ptr, size_t size, int (*otd)(void *struct_key, const void *chunk_buf, size_t chunk_size), ssize_t (*br)(void *struct_key, const void *chunk_buf, size_t chunk_size, int have_more)) { asn_dec_rval_t rv = { 0, 0 }; (void)opt_codec_ctx; (void)ctx; (void)struct_key; (void)xml_tag; (void)buf_ptr; (void)size; (void)otd; (void)br; return rv; } int xer_is_whitespace(const void *b, size_t s) { (void)b; (void)s; return 0; } diff --git a/libasn1fix/asn1fix_cstring.c b/libasn1fix/asn1fix_cstring.c index 215336b7e..f4e760435 100644 --- a/libasn1fix/asn1fix_cstring.c +++ b/libasn1fix/asn1fix_cstring.c @@ -13,7 +13,7 @@ asn1f_fix_cstring(arg_t *arg) { if(expr->value && expr->value->type == ATV_STRING) { struct _cstring_pattern cp; - char *buf = expr->value->value.string.buf; + char *buf = (char *)expr->value->value.string.buf; int buflen = expr->value->value.string.size; int start = 0; diff --git a/libasn1fix/asn1fix_misc.c b/libasn1fix/asn1fix_misc.c index b82afaee7..b28a58a2e 100644 --- a/libasn1fix/asn1fix_misc.c +++ b/libasn1fix/asn1fix_misc.c @@ -80,7 +80,7 @@ asn1f_printable_value(asn1p_value_t *v) { case ATV_UNPARSED: /* Buffer is guaranteed to be null-terminated */ assert(v->value.string.buf[v->value.string.size] == '\0'); - return v->value.string.buf; + return (char *)v->value.string.buf; case ATV_BITVECTOR: { uint8_t *bitvector; diff --git a/libasn1parser/asn1p_value.c b/libasn1parser/asn1p_value.c index d6d300776..2242e3f2a 100644 --- a/libasn1parser/asn1p_value.c +++ b/libasn1parser/asn1p_value.c @@ -76,7 +76,7 @@ asn1p_value_frombuf(char *buffer, int size, int do_copy) { } v->value.string.buf = p; } else { - v->value.string.buf = buffer; + v->value.string.buf = (uint8_t *)buffer; } v->value.string.size = size; v->type = ATV_STRING; @@ -129,12 +129,12 @@ asn1p_value_clone(asn1p_value_t *v) { if(clone) clone->type = v->type; return clone; case ATV_STRING: - clone = asn1p_value_frombuf(v->value.string.buf, + clone = asn1p_value_frombuf((char *)v->value.string.buf, v->value.string.size, 1); if(clone) clone->type = v->type; return clone; case ATV_UNPARSED: - clone = asn1p_value_frombuf(v->value.string.buf, + clone = asn1p_value_frombuf((char *)v->value.string.buf, v->value.string.size, 1); if(clone) clone->type = ATV_UNPARSED; return clone; diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index 0a0737896..01e21ead6 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -210,7 +210,7 @@ asn1print_value(asn1p_value_t *val, enum asn1print_flags flags) { return 0; case ATV_STRING: { - char *p = val->value.string.buf; + char *p = (char *)val->value.string.buf; putchar('"'); if(strchr(p, '"')) { /* Mask quotes */ @@ -226,7 +226,7 @@ asn1print_value(asn1p_value_t *val, enum asn1print_flags flags) { } return 0; case ATV_UNPARSED: - fputs(val->value.string.buf, stdout); + fputs((char *)val->value.string.buf, stdout); return 0; case ATV_BITVECTOR: { From 73a781ab5fc29a072ec398c7c83fe2c4c2c30964 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 15 Jun 2005 19:01:45 +0000 Subject: [PATCH 0909/1469] WIN32 portability changes git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@909 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/GeneralizedTime.c | 16 ++++++++-------- skeletons/REAL.c | 8 ++++++++ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 9c0ed7dc3..770a30438 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -10,13 +10,13 @@ #include #if defined(WIN32) -#warning PLEASE STOP AND READ! -#warning localtime_r is implemented via localtime(), which may be not thread-safe. -#warning gmtime_r is implemented via gmtime(), which may be not thread-safe. -#warning -#warning You must fix the code by inserting appropriate locking -#warning if you want to use asn_GT2time() or asn_UT2time(). -#warning PLEASE STOP AND READ! +#pragma message( "PLEASE STOP AND READ!") +#pragma message( " localtime_r is implemented via localtime(), which may be not thread-safe.") +#pragma message( " gmtime_r is implemented via gmtime(), which may be not thread-safe.") +#pragma message( " ") +#pragma message( " You must fix the code by inserting appropriate locking") +#pragma message( " if you want to use asn_GT2time() or asn_UT2time().") +#pragma message( "PLEASE STOP AND READ! ") static struct tm *localtime_r(const time_t *tloc, struct tm *result) { struct tm *tm; @@ -33,7 +33,7 @@ static struct tm *gmtime_r(const time_t *tloc, struct tm *result) { } #define tzset() _tzset() -#define putenv _putenv +#define putenv(c) _putenv(c) #define _EMULATE_TIMEGM #endif /* WIN32 */ diff --git a/skeletons/REAL.c b/skeletons/REAL.c index b0086bc8b..a36b68136 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -13,6 +13,14 @@ #include #include +#ifdef WIN32 +#include +#define copysign _copysign +#define isnan _isnan +#define finite _finite +#define ilogb _logb +#endif + #undef INT_MAX #define INT_MAX ((int)(((unsigned int)-1) >> 1)) From cb4aaa786804682bf7f629269c41dcf24c8f675f Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 1 Jul 2005 08:28:18 +0000 Subject: [PATCH 0910/1469] floating point defines moved to asn_system.h from REAL.c git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@910 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/REAL.c | 10 +--------- skeletons/asn_system.h | 5 +++++ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/skeletons/REAL.c b/skeletons/REAL.c index a36b68136..7447aae99 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -13,14 +13,6 @@ #include #include -#ifdef WIN32 -#include -#define copysign _copysign -#define isnan _isnan -#define finite _finite -#define ilogb _logb -#endif - #undef INT_MAX #define INT_MAX ((int)(((unsigned int)-1) >> 1)) @@ -528,7 +520,7 @@ asn_double2REAL(REAL_t *st, double dbl_value) { /* * ilogb(+-0) returns -INT_MAX or INT_MIN (platform-dependent) - * ilogb(+-inf) returns INT_MAX + * ilogb(+-inf) returns INT_MAX, logb(+-inf) returns +inf * ilogb(NaN) returns INT_MIN or INT_MAX (platform-dependent) */ expval = ilogb(dbl_value); diff --git a/skeletons/asn_system.h b/skeletons/asn_system.h index fe7e5a8fe..74cccaf4a 100644 --- a/skeletons/asn_system.h +++ b/skeletons/asn_system.h @@ -35,6 +35,11 @@ typedef unsigned short uint16_t; typedef unsigned int uint32_t; #define WIN32_LEAN_AND_MEAN #include +#include +#define isnan _isnan +#define finite _finite +#define copysign _copysign +#define ilogb _logb #endif /* _MSC_VER */ #else /* !WIN32 */ From 41dee121964f340245bbda3b00fd28e0fff27f28 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 2 Jul 2005 08:19:17 +0000 Subject: [PATCH 0911/1469] adjusted definitions to include gcc 4.x into the supported compilers list git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@911 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/NativeInteger.c | 8 +++++++- skeletons/NativeReal.c | 8 +++++++- skeletons/asn-decoder-template.c | 1 - skeletons/asn_SET_OF.c | 8 +++----- skeletons/asn_internal.h | 12 ++++++++++++ skeletons/constr_SEQUENCE_OF.c | 6 ++---- skeletons/constr_SET_OF.c | 23 +++++++---------------- 7 files changed, 38 insertions(+), 28 deletions(-) diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index 2b1361852..96c787569 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -91,8 +91,14 @@ NativeInteger_decode_ber(asn_codec_ctx_t *opt_codec_ctx, */ { INTEGER_t tmp; + union { + const void *constbuf; + void *nonconstbuf; + } unconst_buf; long l; - (const uint8_t *)tmp.buf = (const uint8_t *)buf_ptr; + + unconst_buf.constbuf = buf_ptr; + tmp.buf = (uint8_t *)unconst_buf.nonconstbuf; tmp.size = length; if(asn_INTEGER2long(&tmp, &l)) { diff --git a/skeletons/NativeReal.c b/skeletons/NativeReal.c index f2a3afceb..f7755db16 100644 --- a/skeletons/NativeReal.c +++ b/skeletons/NativeReal.c @@ -93,8 +93,14 @@ NativeReal_decode_ber(asn_codec_ctx_t *opt_codec_ctx, */ { REAL_t tmp; + union { + const void *constbuf; + void *nonconstbuf; + } unconst_buf; double d; - (const uint8_t *)tmp.buf = (const uint8_t *)buf_ptr; + + unconst_buf.constbuf = buf_ptr; + tmp.buf = (uint8_t *)unconst_buf.nonconstbuf; tmp.size = length; if(asn_REAL2double(&tmp, &d)) { diff --git a/skeletons/asn-decoder-template.c b/skeletons/asn-decoder-template.c index 4a53bc94d..5116529d8 100644 --- a/skeletons/asn-decoder-template.c +++ b/skeletons/asn-decoder-template.c @@ -28,7 +28,6 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *asnTypeOfPDU, int opt_debug; /* -d */ static int opt_check; /* -c */ -static int opt_print; /* -p */ static int opt_stack; /* -s */ static enum output_method { OUT_NONE, /* No pretty-printing */ diff --git a/skeletons/asn_SET_OF.c b/skeletons/asn_SET_OF.c index 5e268c076..367067747 100644 --- a/skeletons/asn_SET_OF.c +++ b/skeletons/asn_SET_OF.c @@ -6,14 +6,12 @@ #include #include -typedef A_SET_OF(void) asn_set; - /* * Add another element into the set. */ int asn_set_add(void *asn_set_of_x, void *ptr) { - asn_set *as = (asn_set *)asn_set_of_x; + asn_anonymous_set_ *as = _A_SET_FROM_VOID(asn_set_of_x); if(as == 0 || ptr == 0) { errno = EINVAL; /* Invalid arguments */ @@ -43,7 +41,7 @@ asn_set_add(void *asn_set_of_x, void *ptr) { void asn_set_del(void *asn_set_of_x, int number, int _do_free) { - asn_set *as = (asn_set *)asn_set_of_x; + asn_anonymous_set_ *as = _A_SET_FROM_VOID(asn_set_of_x); if(as) { void *ptr; @@ -71,7 +69,7 @@ asn_set_del(void *asn_set_of_x, int number, int _do_free) { */ void asn_set_empty(void *asn_set_of_x) { - asn_set *as = (asn_set *)asn_set_of_x; + asn_anonymous_set_ *as = _A_SET_FROM_VOID(asn_set_of_x); if(as) { if(as->array) { diff --git a/skeletons/asn_internal.h b/skeletons/asn_internal.h index 22011efa9..4c16dc9ea 100644 --- a/skeletons/asn_internal.h +++ b/skeletons/asn_internal.h @@ -80,4 +80,16 @@ static void ASN_DEBUG(const char *fmt, ...) { (void)fmt; }; if(cb(" ", 4, app_key) < 0) return -1; \ } while(0) +/* + * Cope with implicit conversions to/from void. + */ +#include +#include +typedef A_SEQUENCE_OF(void) asn_anonymous_sequence_; +typedef A_SET_OF(void) asn_anonymous_set_; +#define _A_SET_FROM_VOID(ptr) ((asn_anonymous_set_ *)(ptr)) +#define _A_CSET_FROM_VOID(ptr) ((const asn_anonymous_set_ *)(ptr)) +#define _A_SEQUENCE_FROM_VOID(ptr) ((asn_anonymous_sequence_ *)(ptr)) +#define _A_CSEQUENCE_FROM_VOID(ptr) ((const asn_anonymous_sequence_ *)(ptr)) + #endif /* _ASN_INTERNAL_H_ */ diff --git a/skeletons/constr_SEQUENCE_OF.c b/skeletons/constr_SEQUENCE_OF.c index 027f5ecce..d9763fc65 100644 --- a/skeletons/constr_SEQUENCE_OF.c +++ b/skeletons/constr_SEQUENCE_OF.c @@ -14,7 +14,7 @@ SEQUENCE_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn_TYPE_member_t *elm = td->elements; - A_SEQUENCE_OF(void) *list; + asn_anonymous_sequence_ *list = _A_SEQUENCE_FROM_VOID(ptr); size_t computed_size = 0; ssize_t encoding_size = 0; asn_enc_rval_t erval; @@ -25,7 +25,6 @@ SEQUENCE_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, /* * Gather the length of the underlying members sequence. */ - (void *)list = ptr; for(edx = 0; edx < list->count; edx++) { void *memb_ptr = list->array[edx]; erval = elm->type->der_encoder(elm->type, memb_ptr, @@ -90,7 +89,7 @@ SEQUENCE_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, asn_enc_rval_t er; asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; asn_TYPE_member_t *element = td->elements; - A_SEQUENCE_OF(void) *list; + asn_anonymous_sequence_ *list = _A_SEQUENCE_FROM_VOID(sptr); const char *mname = specs->as_XMLValueList ? 0 : ((*element->name) ? element->name : element->type->xml_tag); @@ -102,7 +101,6 @@ SEQUENCE_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, er.encoded = 0; - (void *)list = sptr; for(i = 0; i < list->count; i++) { asn_enc_rval_t tmper; diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index 1bae1f971..2d72fca70 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -212,8 +212,7 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, switch(rval.code) { case RC_OK: { - A_SET_OF(void) *list; - (void *)list = (void *)st; + asn_anonymous_set_ *list = _A_SET_FROM_VOID(st); if(ASN_SET_ADD(list, ctx->ptr) != 0) RETURN(RC_FAIL); else @@ -314,7 +313,7 @@ SET_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, asn_TYPE_member_t *elm = td->elements; asn_TYPE_descriptor_t *elm_type = elm->type; der_type_encoder_f *der_encoder = elm_type->der_encoder; - A_SET_OF(void) *list; + asn_anonymous_set_ *list = _A_SET_FROM_VOID(ptr); size_t computed_size = 0; ssize_t encoding_size = 0; struct _el_buffer *encoded_els; @@ -328,7 +327,6 @@ SET_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, /* * Gather the length of the underlying members sequence. */ - (void *)list = ptr; for(edx = 0; edx < list->count; edx++) { void *memb_ptr = list->array[edx]; erval = der_encoder(elm_type, memb_ptr, 0, elm->tag, 0, 0); @@ -516,8 +514,7 @@ SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, element->type, &ctx->ptr, elm_tag, buf_ptr, size); if(tmprval.code == RC_OK) { - A_SET_OF(void) *list; - (void *)list = (void *)st; + asn_anonymous_set_ *list = _A_SET_FROM_VOID(st); if(ASN_SET_ADD(list, ctx->ptr) != 0) RETURN(RC_FAIL); ctx->ptr = 0; @@ -642,7 +639,7 @@ SET_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, asn_enc_rval_t er; asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; asn_TYPE_member_t *element = td->elements; - A_SET_OF(void) *list; + asn_anonymous_set_ *list = _A_SET_FROM_VOID(sptr); const char *mname = specs->as_XMLValueList ? 0 : ((*element->name) ? element->name : element->type->xml_tag); @@ -656,8 +653,6 @@ SET_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, if(!sptr) _ASN_ENCODE_FAILED; - (void *)list = sptr; - if(xcan) { encs = (xer_tmp_enc_t *)MALLOC(list->count * sizeof(encs[0])); if(!encs) _ASN_ENCODE_FAILED; @@ -747,7 +742,7 @@ int SET_OF_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { asn_TYPE_member_t *element = td->elements; - const A_SET_OF(void) *list; + const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr); int ret; int i; @@ -758,7 +753,6 @@ SET_OF_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, || cb(" ::= {", 6, app_key) < 0) return -1; - (const void *)list = sptr; for(i = 0; i < list->count; i++) { const void *memb_ptr = list->array[i]; if(!memb_ptr) continue; @@ -780,14 +774,13 @@ void SET_OF_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { if(td && ptr) { asn_TYPE_member_t *element = td->elements; - A_SET_OF(void) *list; + asn_anonymous_set_ *list = _A_SET_FROM_VOID(ptr); int i; /* * Could not use set_of_empty() because of (*free) * incompatibility. */ - (void *)list = ptr; for(i = 0; i < list->count; i++) { void *memb_ptr = list->array[i]; if(memb_ptr) @@ -808,7 +801,7 @@ SET_OF_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { asn_TYPE_member_t *element = td->elements; asn_constr_check_f *constr; - const A_SET_OF(void) *list; + const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr); int i; if(!sptr) { @@ -818,8 +811,6 @@ SET_OF_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - (const void *)list = sptr; - constr = element->memb_constraints; if(!constr) constr = element->type->check_constraints; From 67b528d8665cb33470fc87ca0ca8a2ca4dda81a6 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 2 Jul 2005 08:19:26 +0000 Subject: [PATCH 0912/1469] gcc 4.x git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@912 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 4f61d4c72..dec866b6c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,10 +1,11 @@ -0.9.15: 2005-June-01 +0.9.15: 2005-July-02 * Compiler now checks 64-bit overflows in constraints range handling code. No effect on the code produced by the compiler. * Compiler support for tagged and marked parametrized members. * Empty tags to element map avoided. + * Compiled code GCC 4.x compatibility. 0.9.14: 2005-Apr-29 From f06c2148f06ef8f48108456d7092babaf3f9d321 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 2 Jul 2005 20:22:20 +0000 Subject: [PATCH 0913/1469] conversions git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@913 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_SEQUENCE_OF.h | 8 ++++++++ skeletons/asn_SET_OF.h | 8 ++++++++ skeletons/asn_internal.h | 12 ------------ 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/skeletons/asn_SEQUENCE_OF.h b/skeletons/asn_SEQUENCE_OF.h index e99673403..1109f2385 100644 --- a/skeletons/asn_SEQUENCE_OF.h +++ b/skeletons/asn_SEQUENCE_OF.h @@ -33,4 +33,12 @@ */ void asn_sequence_del(void *asn_sequence_of_x, int number, int _do_free); +/* + * Cope with different conversions requirements to/from void in C and C++. + * This is mostly useful for support library. + */ +typedef A_SEQUENCE_OF(void) asn_anonymous_sequence_; +#define _A_SEQUENCE_FROM_VOID(ptr) ((asn_anonymous_sequence_ *)(ptr)) +#define _A_CSEQUENCE_FROM_VOID(ptr) ((const asn_anonymous_sequence_ *)(ptr)) + #endif /* ASN_SEQUENCE_OF_H */ diff --git a/skeletons/asn_SET_OF.h b/skeletons/asn_SET_OF.h index 1443a7b81..774549fc6 100644 --- a/skeletons/asn_SET_OF.h +++ b/skeletons/asn_SET_OF.h @@ -43,4 +43,12 @@ void asn_set_del(void *asn_set_of_x, int number, int _do_free); */ void asn_set_empty(void *asn_set_of_x); +/* + * Cope with different conversions requirements to/from void in C and C++. + * This is mostly useful for support library. + */ +typedef A_SET_OF(void) asn_anonymous_set_; +#define _A_SET_FROM_VOID(ptr) ((asn_anonymous_set_ *)(ptr)) +#define _A_CSET_FROM_VOID(ptr) ((const asn_anonymous_set_ *)(ptr)) + #endif /* ASN_SET_OF_H */ diff --git a/skeletons/asn_internal.h b/skeletons/asn_internal.h index 4c16dc9ea..22011efa9 100644 --- a/skeletons/asn_internal.h +++ b/skeletons/asn_internal.h @@ -80,16 +80,4 @@ static void ASN_DEBUG(const char *fmt, ...) { (void)fmt; }; if(cb(" ", 4, app_key) < 0) return -1; \ } while(0) -/* - * Cope with implicit conversions to/from void. - */ -#include -#include -typedef A_SEQUENCE_OF(void) asn_anonymous_sequence_; -typedef A_SET_OF(void) asn_anonymous_set_; -#define _A_SET_FROM_VOID(ptr) ((asn_anonymous_set_ *)(ptr)) -#define _A_CSET_FROM_VOID(ptr) ((const asn_anonymous_set_ *)(ptr)) -#define _A_SEQUENCE_FROM_VOID(ptr) ((asn_anonymous_sequence_ *)(ptr)) -#define _A_CSEQUENCE_FROM_VOID(ptr) ((const asn_anonymous_sequence_ *)(ptr)) - #endif /* _ASN_INTERNAL_H_ */ From 9309d57390e00bbf46905040f17d04de9d069e6b Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 2 Jul 2005 20:24:27 +0000 Subject: [PATCH 0914/1469] proper format character git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@914 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OCTET_STRING.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 57e17afea..19ae95dbf 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -87,7 +87,7 @@ asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { } else { \ RETURN(RC_FAIL); \ } \ - ASN_DEBUG("Reallocating into %ld", _ns); \ + ASN_DEBUG("Reallocating into %ld", (long)_ns); \ } \ memcpy(st->buf + st->size, bufptr, _bs); \ /* Convenient nul-termination */ \ From b5abdc9cc79854ebe59f3e2b085d21dcadfbe68d Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 2 Jul 2005 21:42:40 +0000 Subject: [PATCH 0915/1469] Better ambigous comments handling. git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@915 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 5 + libasn1parser/asn1p_l.c | 3404 ++++++++++++++++++------------------- libasn1parser/asn1p_l.l | 72 +- tests/85-comments-OK.asn1 | 23 + 4 files changed, 1697 insertions(+), 1807 deletions(-) create mode 100644 tests/85-comments-OK.asn1 diff --git a/ChangeLog b/ChangeLog index dec866b6c..fc9f87b51 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,9 @@ +0.9.16: 2005-July-02 + + * ASN.1 parser has been tweaked to allow parsing something like + "SEQUENCE--- comment ---", which is ambiguous for many reasons. + 0.9.15: 2005-July-02 * Compiler now checks 64-bit overflows in constraints range handling diff --git a/libasn1parser/asn1p_l.c b/libasn1parser/asn1p_l.c index 8fabc2425..6cc0cb9ff 100644 --- a/libasn1parser/asn1p_l.c +++ b/libasn1parser/asn1p_l.c @@ -312,245 +312,249 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 130 -#define YY_END_OF_BUFFER 131 -static yyconst short int yy_acclist[1259] = +#define YY_NUM_RULES 133 +#define YY_END_OF_BUFFER 134 +static yyconst short int yy_acclist[1263] = { 0, - 131, 129, 130, 124, 129, 130, 124, 130, 127, 129, - 130, 15, 129, 130, 127, 129, 130, 129, 130, 127, - 129, 130, 129, 130, 127, 129, 130, 129, 130, 29, - 129, 130, 28, 129, 130, 127, 129, 130, 129, 130, - 116, 117, 129, 130, 116, 117, 129, 130, 116, 117, - 129, 130, 116, 117, 129, 130, 116, 117, 129, 130, - 116, 117, 129, 130, 116, 117, 129, 130, 116, 117, - 129, 130, 116, 117, 129, 130, 116, 117, 129, 130, - 116, 117, 129, 130, 116, 117, 129, 130, 116, 117, - 129, 130, 116, 117, 129, 130, 116, 117, 129, 130, - - 116, 117, 129, 130, 116, 117, 129, 130, 116, 117, - 129, 130, 116, 117, 129, 130, 115, 129, 130, 127, - 129, 130, 5, 129, 130, 2, 130, 2, 129, 130, - 4, 129, 130, 7, 9, 129, 130, 7, 130, 9, - 129, 130, 9, 129, 130, 17, 129, 130, 17, 130, - 18, 129, 130, 12, 129, 130, 12, 130, 14, 129, - 130, 14, 129, 130, 10, 129, 130, 11, 129, 130, - 21, 23, 129, 130, 23, 129, 130, 24, 130, 21, - 22, 23, 129, 130, 21, 22, 23, 129, 130, 121, - 129, 130, 122, 129, 130, 122, 130, 129, 130, 123, - - 129, 130, 124, 15, 15, 113, 114, 1, 27, 120, - 6, 28, 116, 117, 116, 117, 116, 117, 116, 117, - 116, 117, 116, 117, 117, 116, 117, 116, 117, 116, - 117, 116, 117, 39, 116, 117, 116, 117, 116, 117, - 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, - 116, 117, 116, 117, 117, 117, 116, 117, 116, 117, - 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, - 116, 117, 117, 116, 117, 116, 117, 84, 116, 117, - 116, 117, 117, 116, 117, 116, 117, 116, 117, 116, - 117, 117, 116, 117, 116, 117, 116, 117, 116, 117, - - 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, - 117, 116, 117, 116, 117, 117, 117, 116, 117, 115, - 5, 3, 8, 17, 16, 12, 21, 21, 22, 21, - 22, 121, 122, 128, 113, 114, 27, 119, 118, 116, - 117, 31, 116, 117, 32, 116, 117, 116, 117, 116, - 117, 116, 117, 36, 116, 117, 116, 117, 116, 117, - 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, - 116, 117, 116, 117, 116, 117, 53, 116, 117, 116, - 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, - 117, 117, 117, 116, 117, 116, 117, 116, 117, 116, - - 117, 116, 117, 116, 117, 116, 117, 76, 116, 117, - 77, 116, 117, 116, 117, 117, 116, 117, 116, 117, - 116, 117, 117, 116, 117, 87, 116, 117, 116, 117, - 116, 117, 116, 117, 117, 116, 117, 116, 117, 116, - 117, 95, 116, 117, 116, 117, 116, 117, 116, 117, - 116, 117, 116, 117, 116, 117, 116, 117, 117, 116, - 117, 116, 117, 116, 117, 117, 117, 117, 116, 117, - 13, 21, 22, 20, 21, 22, 26, 25, 116, 117, - 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, - 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, - - 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, - 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, - 116, 117, 61, 116, 117, 117, 117, 116, 117, 116, - 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, - 117, 116, 117, 116, 117, 79, 116, 117, 117, 116, - 117, 116, 117, 116, 117, 117, 116, 117, 116, 117, - 116, 117, 116, 117, 117, 92, 116, 117, 116, 117, - 116, 117, 96, 116, 117, 116, 117, 116, 117, 116, - 117, 100, 116, 117, 102, 116, 117, 116, 117, 117, - 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, - - 117, 117, 117, 112, 116, 117, 21, 22, 116, 117, - 116, 117, 116, 117, 35, 116, 117, 117, 116, 117, - 116, 117, 116, 117, 42, 116, 117, 116, 117, 116, - 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, - 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, - 117, 116, 117, 60, 116, 117, 117, 117, 117, 116, - 117, 116, 117, 116, 117, 116, 117, 116, 117, 116, - 117, 116, 117, 116, 117, 116, 117, 116, 117, 117, - 116, 117, 83, 116, 117, 116, 117, 117, 116, 117, - 116, 117, 116, 117, 116, 117, 117, 116, 117, 116, - - 117, 116, 117, 116, 117, 117, 116, 117, 117, 104, - 116, 117, 116, 117, 116, 117, 117, 116, 117, 117, - 117, 117, 125, 21, 22, 30, 116, 117, 116, 117, - 116, 117, 117, 116, 117, 116, 117, 41, 116, 117, - 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, - 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, - 55, 116, 117, 116, 117, 116, 117, 116, 117, 116, - 117, 117, 117, 117, 116, 117, 116, 117, 116, 117, - 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, - 116, 117, 116, 117, 116, 117, 117, 81, 116, 117, - - 116, 117, 117, 116, 117, 116, 117, 116, 117, 116, - 117, 117, 116, 117, 116, 117, 97, 116, 117, 98, - 116, 117, 117, 116, 117, 117, 105, 116, 117, 116, - 117, 117, 117, 117, 117, 117, 21, 22, 116, 117, - 116, 117, 117, 38, 116, 117, 116, 117, 116, 117, - 116, 117, 116, 117, 47, 116, 117, 48, 116, 117, - 116, 117, 116, 117, 51, 116, 117, 116, 117, 116, - 117, 116, 117, 57, 116, 117, 116, 117, 116, 117, - 117, 117, 117, 116, 117, 116, 117, 68, 116, 117, - 69, 116, 117, 116, 117, 116, 117, 116, 117, 73, - - 116, 117, 116, 117, 116, 117, 116, 117, 117, 116, - 117, 117, 86, 116, 117, 116, 117, 89, 116, 117, - 91, 116, 117, 117, 116, 117, 116, 117, 117, 116, - 117, 117, 116, 117, 108, 117, 117, 117, 117, 117, - 21, 22, 116, 117, 116, 117, 117, 116, 117, 116, - 117, 116, 117, 116, 117, 116, 117, 50, 116, 117, - 116, 117, 116, 117, 56, 116, 117, 116, 117, 59, - 116, 117, 117, 117, 117, 117, 116, 117, 67, 116, - 117, 70, 116, 117, 71, 116, 117, 116, 117, 116, - 117, 117, 116, 117, 117, 85, 116, 117, 117, 116, - - 117, 117, 116, 117, 94, 116, 117, 117, 116, 117, - 117, 116, 117, 117, 117, 117, 117, 21, 22, 116, - 117, 34, 116, 117, 37, 117, 40, 116, 117, 43, - 116, 117, 116, 117, 116, 117, 116, 117, 116, 117, - 116, 117, 116, 117, 117, 117, 117, 65, 117, 116, - 117, 116, 117, 116, 117, 117, 116, 117, 117, 117, - 116, 117, 117, 116, 117, 99, 117, 116, 117, 117, - 106, 116, 117, 117, 117, 117, 117, 126, 21, 116, - 117, 44, 116, 117, 116, 117, 46, 116, 117, 116, - 117, 116, 117, 54, 116, 117, 116, 117, 117, 117, - - 117, 66, 116, 117, 116, 117, 116, 117, 117, 116, - 117, 117, 117, 116, 117, 117, 116, 117, 116, 117, - 117, 109, 117, 117, 117, 117, 21, 33, 116, 117, - 45, 116, 117, 49, 116, 117, 116, 117, 116, 117, - 117, 117, 117, 116, 117, 116, 117, 117, 116, 117, - 117, 117, 116, 117, 117, 116, 117, 116, 117, 117, - 117, 117, 117, 21, 116, 117, 116, 117, 117, 117, - 117, 72, 116, 117, 74, 116, 117, 75, 117, 116, - 117, 117, 117, 116, 117, 117, 93, 116, 117, 116, - 117, 117, 117, 117, 117, 21, 116, 117, 58, 116, - - 117, 63, 117, 117, 64, 117, 116, 117, 80, 117, - 117, 88, 116, 117, 117, 116, 117, 101, 117, 117, - 117, 111, 117, 21, 116, 117, 117, 78, 116, 117, - 117, 117, 116, 117, 117, 110, 117, 21, 116, 117, - 62, 117, 117, 90, 117, 103, 116, 117, 107, 117, - 21, 52, 116, 117, 82, 117, 19, 21 + 134, 132, 133, 127, 132, 133, 127, 133, 130, 132, + 133, 18, 132, 133, 130, 132, 133, 132, 133, 130, + 132, 133, 132, 133, 130, 132, 133, 132, 133, 32, + 132, 133, 31, 132, 133, 130, 132, 133, 132, 133, + 119, 120, 132, 133, 119, 120, 132, 133, 119, 120, + 132, 133, 119, 120, 132, 133, 119, 120, 132, 133, + 119, 120, 132, 133, 119, 120, 132, 133, 119, 120, + 132, 133, 119, 120, 132, 133, 119, 120, 132, 133, + 119, 120, 132, 133, 119, 120, 132, 133, 119, 120, + 132, 133, 119, 120, 132, 133, 119, 120, 132, 133, + + 119, 120, 132, 133, 119, 120, 132, 133, 119, 120, + 132, 133, 119, 120, 132, 133, 118, 132, 133, 130, + 132, 133, 8, 132, 133, 5, 133, 5, 132, 133, + 7, 132, 133, 7, 132, 133, 10, 12, 132, 133, + 10, 133, 12, 132, 133, 12, 132, 133, 20, 132, + 133, 20, 133, 21, 132, 133, 15, 132, 133, 15, + 133, 17, 132, 133, 17, 132, 133, 13, 132, 133, + 14, 132, 133, 24, 26, 132, 133, 26, 132, 133, + 27, 133, 24, 25, 26, 132, 133, 24, 25, 26, + 132, 133, 124, 132, 133, 125, 132, 133, 125, 133, + + 132, 133, 126, 132, 133, 127, 18, 18, 116, 117, + 4, 30, 123, 9, 31, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 119, 120, 120, 119, 120, + 119, 120, 119, 120, 119, 120, 42, 119, 120, 119, + 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 119, 120, 120, 120, 119, + 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 120, 119, 120, 119, 120, + 87, 119, 120, 119, 120, 120, 119, 120, 119, 120, + 119, 120, 119, 120, 120, 119, 120, 119, 120, 119, + + 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 120, 119, 120, 119, 120, 120, 120, + 119, 120, 118, 8, 6, 6, 11, 20, 19, 15, + 24, 24, 25, 24, 25, 124, 125, 131, 116, 117, + 30, 122, 121, 119, 120, 120, 119, 120, 34, 119, + 120, 35, 119, 120, 119, 120, 119, 120, 119, 120, + 39, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 56, 119, 120, 119, 120, 119, 120, + 119, 120, 119, 120, 119, 120, 119, 120, 120, 120, + + 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, + 119, 120, 119, 120, 79, 119, 120, 80, 119, 120, + 119, 120, 120, 119, 120, 119, 120, 119, 120, 120, + 119, 120, 90, 119, 120, 119, 120, 119, 120, 119, + 120, 120, 119, 120, 119, 120, 119, 120, 98, 119, + 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 120, 119, 120, 119, 120, + 119, 120, 120, 120, 120, 119, 120, 118, 3, 16, + 24, 25, 23, 24, 25, 116, 117, 29, 28, 2, + 1, 119, 120, 119, 120, 119, 120, 119, 120, 119, + + 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 64, 119, 120, 120, 120, + 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, + 119, 120, 119, 120, 119, 120, 119, 120, 82, 119, + 120, 120, 119, 120, 119, 120, 119, 120, 120, 119, + 120, 119, 120, 119, 120, 119, 120, 120, 95, 119, + 120, 119, 120, 119, 120, 99, 119, 120, 119, 120, + 119, 120, 119, 120, 103, 119, 120, 105, 119, 120, + + 119, 120, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 120, 120, 120, 115, 119, 120, 3, + 24, 25, 119, 120, 119, 120, 119, 120, 38, 119, + 120, 120, 119, 120, 119, 120, 119, 120, 45, 119, + 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 119, 120, 63, 119, 120, + 120, 120, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 120, 119, 120, 86, 119, 120, 119, + + 120, 120, 119, 120, 119, 120, 119, 120, 120, 119, + 120, 119, 120, 119, 120, 119, 120, 120, 120, 107, + 119, 120, 119, 120, 119, 120, 120, 119, 120, 120, + 120, 120, 128, 24, 25, 33, 119, 120, 119, 120, + 119, 120, 120, 119, 120, 119, 120, 44, 119, 120, + 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, + 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, + 58, 119, 120, 119, 120, 119, 120, 119, 120, 119, + 120, 120, 120, 120, 119, 120, 119, 120, 119, 120, + 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, + + 119, 120, 119, 120, 120, 84, 119, 120, 119, 120, + 120, 119, 120, 119, 120, 119, 120, 119, 120, 120, + 119, 120, 119, 120, 100, 119, 120, 101, 119, 120, + 120, 119, 120, 120, 108, 119, 120, 119, 120, 120, + 120, 120, 120, 120, 24, 25, 119, 120, 119, 120, + 120, 41, 119, 120, 119, 120, 119, 120, 119, 120, + 119, 120, 50, 119, 120, 51, 119, 120, 119, 120, + 119, 120, 54, 119, 120, 119, 120, 119, 120, 119, + 120, 60, 119, 120, 119, 120, 119, 120, 120, 120, + 120, 119, 120, 119, 120, 71, 119, 120, 72, 119, + + 120, 119, 120, 119, 120, 119, 120, 76, 119, 120, + 119, 120, 119, 120, 119, 120, 120, 119, 120, 120, + 89, 119, 120, 119, 120, 92, 119, 120, 94, 119, + 120, 120, 119, 120, 119, 120, 120, 119, 120, 120, + 119, 120, 111, 120, 120, 120, 120, 120, 24, 25, + 119, 120, 119, 120, 120, 119, 120, 119, 120, 119, + 120, 119, 120, 119, 120, 53, 119, 120, 119, 120, + 119, 120, 59, 119, 120, 119, 120, 62, 119, 120, + 120, 120, 120, 120, 119, 120, 70, 119, 120, 73, + 119, 120, 74, 119, 120, 119, 120, 119, 120, 120, + + 119, 120, 120, 88, 119, 120, 120, 119, 120, 120, + 119, 120, 97, 119, 120, 120, 119, 120, 120, 119, + 120, 120, 120, 120, 120, 24, 25, 119, 120, 37, + 119, 120, 40, 120, 43, 119, 120, 46, 119, 120, + 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, + 120, 120, 120, 68, 120, 119, 120, 119, 120, 119, + 120, 120, 119, 120, 120, 120, 119, 120, 120, 102, + 120, 119, 120, 120, 109, 119, 120, 120, 120, 120, + 120, 129, 24, 119, 120, 47, 119, 120, 119, 120, + 49, 119, 120, 119, 120, 119, 120, 57, 119, 120, + + 119, 120, 120, 120, 120, 69, 119, 120, 119, 120, + 119, 120, 120, 119, 120, 120, 120, 119, 120, 120, + 119, 120, 119, 120, 120, 112, 120, 120, 120, 120, + 24, 36, 119, 120, 48, 119, 120, 52, 119, 120, + 119, 120, 119, 120, 120, 120, 120, 119, 120, 119, + 120, 120, 119, 120, 120, 120, 119, 120, 120, 119, + 120, 119, 120, 120, 120, 120, 120, 24, 119, 120, + 119, 120, 120, 120, 120, 75, 119, 120, 77, 119, + 120, 78, 120, 119, 120, 120, 120, 119, 120, 120, + 96, 119, 120, 119, 120, 120, 120, 120, 120, 24, + + 119, 120, 61, 119, 120, 66, 120, 120, 67, 120, + 119, 120, 83, 120, 120, 91, 119, 120, 120, 119, + 120, 104, 120, 120, 120, 114, 120, 24, 119, 120, + 120, 81, 119, 120, 120, 120, 119, 120, 120, 113, + 120, 24, 119, 120, 65, 120, 120, 93, 120, 106, + 119, 120, 110, 120, 24, 55, 119, 120, 85, 120, + 22, 24 } ; -static yyconst short int yy_accept[690] = +static yyconst short int yy_accept[710] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 4, 7, 9, 12, - 15, 18, 20, 23, 25, 28, 30, 33, 36, 39, - 41, 45, 49, 53, 57, 61, 65, 69, 73, 77, - 81, 85, 89, 93, 97, 101, 105, 109, 113, 117, - 120, 123, 126, 128, 131, 134, 138, 140, 143, 146, - 149, 151, 154, 157, 159, 162, 165, 168, 171, 175, - 178, 180, 185, 190, 193, 196, 198, 200, 203, 203, - 204, 205, 206, 206, 207, 207, 208, 208, 208, 209, - 210, 211, 212, 213, 213, 215, 217, 219, 221, 223, - - 225, 226, 228, 230, 232, 234, 237, 239, 241, 243, - 245, 247, 249, 251, 253, 255, 256, 257, 259, 261, - 263, 265, 267, 269, 271, 273, 274, 276, 278, 281, - 283, 284, 286, 288, 290, 292, 293, 295, 297, 299, - 301, 303, 305, 307, 309, 311, 312, 314, 316, 317, - 318, 320, 321, 321, 321, 321, 322, 323, 324, 325, - 326, 327, 327, 328, 330, 332, 333, 334, 335, 335, - 336, 337, 337, 337, 338, 339, 340, 342, 345, 348, - 350, 352, 354, 357, 359, 361, 363, 365, 367, 369, - 371, 373, 375, 377, 380, 382, 384, 386, 388, 390, - - 392, 393, 394, 396, 398, 400, 402, 404, 406, 408, - 411, 414, 416, 417, 419, 421, 423, 424, 426, 429, - 431, 433, 435, 436, 438, 440, 442, 445, 447, 449, - 451, 453, 455, 457, 459, 460, 462, 464, 466, 467, - 468, 469, 471, 471, 471, 472, 474, 477, 477, 478, - 479, 481, 483, 485, 487, 489, 491, 493, 495, 497, - 499, 501, 503, 505, 507, 509, 511, 513, 515, 517, - 519, 521, 523, 526, 527, 528, 530, 532, 534, 536, - 538, 540, 542, 544, 546, 549, 550, 552, 554, 556, - 557, 559, 561, 563, 565, 566, 569, 571, 573, 576, - - 578, 580, 582, 585, 588, 590, 591, 593, 595, 597, - 599, 601, 602, 603, 604, 607, 607, 607, 607, 607, - 609, 611, 613, 615, 618, 619, 621, 623, 625, 628, - 630, 632, 634, 636, 638, 640, 642, 644, 646, 648, - 650, 652, 654, 657, 658, 659, 660, 662, 664, 666, - 668, 670, 672, 674, 676, 678, 680, 681, 683, 686, - 688, 689, 691, 693, 695, 697, 698, 700, 702, 704, - 706, 707, 709, 710, 713, 715, 717, 718, 720, 721, - 722, 723, 723, 723, 724, 726, 729, 731, 733, 734, - 736, 738, 741, 743, 745, 747, 749, 751, 753, 755, - - 757, 759, 761, 764, 766, 768, 770, 772, 773, 774, - 775, 777, 779, 781, 783, 785, 787, 789, 791, 793, - 795, 797, 798, 801, 803, 804, 806, 808, 810, 812, - 813, 815, 817, 820, 823, 824, 826, 827, 830, 832, - 833, 834, 835, 836, 837, 837, 837, 839, 841, 843, - 844, 847, 849, 851, 853, 855, 858, 861, 863, 865, - 868, 870, 872, 874, 877, 879, 881, 882, 883, 884, - 886, 888, 891, 894, 896, 898, 900, 903, 905, 907, - 909, 910, 912, 913, 916, 918, 921, 924, 925, 927, - 929, 930, 932, 933, 935, 937, 938, 939, 940, 941, - - 941, 943, 945, 947, 948, 950, 952, 954, 956, 958, - 961, 963, 965, 968, 970, 973, 974, 975, 976, 977, - 979, 982, 985, 988, 990, 992, 993, 995, 996, 999, - 1000, 1002, 1003, 1005, 1008, 1009, 1011, 1012, 1014, 1015, - 1016, 1017, 1018, 1018, 1018, 1020, 1022, 1025, 1027, 1030, - 1033, 1035, 1037, 1039, 1041, 1043, 1045, 1046, 1047, 1048, - 1050, 1052, 1054, 1056, 1057, 1059, 1060, 1061, 1063, 1064, - 1066, 1068, 1070, 1071, 1074, 1075, 1076, 1077, 1078, 1078, - 1079, 1080, 1082, 1085, 1087, 1090, 1092, 1094, 1097, 1099, - 1100, 1101, 1102, 1105, 1107, 1109, 1110, 1112, 1113, 1114, - - 1116, 1117, 1119, 1121, 1122, 1124, 1125, 1126, 1127, 1128, - 1131, 1134, 1137, 1139, 1141, 1142, 1143, 1144, 1146, 1148, - 1149, 1151, 1152, 1153, 1155, 1156, 1158, 1160, 1161, 1162, - 1163, 1164, 1165, 1167, 1169, 1170, 1171, 1172, 1175, 1178, - 1180, 1182, 1183, 1184, 1186, 1187, 1190, 1192, 1193, 1194, - 1195, 1196, 1197, 1199, 1202, 1204, 1205, 1207, 1209, 1211, - 1212, 1215, 1216, 1218, 1220, 1221, 1222, 1224, 1225, 1227, - 1228, 1231, 1232, 1233, 1235, 1236, 1238, 1239, 1241, 1243, - 1244, 1246, 1249, 1251, 1252, 1255, 1257, 1259, 1259 + 1, 1, 1, 1, 1, 1, 1, 2, 4, 7, + 9, 12, 15, 18, 20, 23, 25, 28, 30, 33, + 36, 39, 41, 45, 49, 53, 57, 61, 65, 69, + 73, 77, 81, 85, 89, 93, 97, 101, 105, 109, + 113, 117, 120, 123, 126, 128, 131, 134, 137, 141, + 143, 146, 149, 152, 154, 157, 160, 162, 165, 168, + 171, 174, 178, 181, 183, 188, 193, 196, 199, 201, + 203, 206, 206, 207, 208, 209, 209, 210, 210, 211, + 211, 211, 212, 213, 214, 215, 216, 216, 216, 218, + + 220, 222, 224, 226, 228, 229, 231, 233, 235, 237, + 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, + 259, 260, 262, 264, 266, 268, 270, 272, 274, 276, + 277, 279, 281, 284, 286, 287, 289, 291, 293, 295, + 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, + 315, 317, 319, 320, 321, 323, 323, 324, 324, 324, + 324, 325, 326, 327, 328, 329, 330, 331, 331, 332, + 334, 336, 337, 338, 339, 339, 339, 340, 340, 341, + 341, 341, 341, 342, 343, 344, 346, 347, 349, 352, + 355, 357, 359, 359, 361, 364, 366, 368, 370, 372, + + 374, 376, 378, 380, 382, 384, 387, 389, 391, 393, + 395, 397, 399, 400, 401, 403, 405, 407, 409, 411, + 413, 415, 418, 421, 423, 424, 426, 428, 430, 431, + 433, 436, 438, 440, 442, 443, 445, 447, 449, 452, + 454, 456, 458, 460, 462, 464, 466, 467, 469, 471, + 473, 474, 475, 476, 478, 479, 479, 479, 480, 481, + 483, 486, 486, 487, 488, 489, 490, 491, 492, 492, + 494, 496, 498, 500, 502, 504, 506, 508, 510, 512, + 514, 516, 518, 520, 522, 524, 526, 528, 530, 532, + 534, 536, 539, 540, 541, 543, 545, 547, 549, 551, + + 553, 555, 557, 559, 562, 563, 565, 567, 569, 570, + 572, 574, 576, 578, 579, 582, 584, 586, 589, 591, + 593, 595, 598, 601, 603, 604, 606, 608, 610, 612, + 614, 615, 616, 617, 620, 620, 620, 620, 620, 621, + 623, 625, 627, 629, 632, 633, 635, 637, 639, 642, + 644, 646, 648, 650, 652, 654, 656, 658, 660, 662, + 664, 666, 668, 671, 672, 673, 674, 676, 678, 680, + 682, 684, 686, 688, 690, 692, 694, 695, 697, 700, + 702, 703, 705, 705, 707, 709, 710, 712, 714, 716, + 718, 719, 719, 720, 723, 725, 727, 728, 730, 731, + + 732, 733, 733, 733, 734, 736, 739, 741, 743, 744, + 746, 748, 751, 753, 755, 757, 759, 761, 763, 765, + 767, 769, 771, 774, 776, 778, 780, 782, 783, 784, + 785, 787, 789, 791, 793, 795, 797, 799, 801, 803, + 805, 805, 806, 809, 811, 812, 814, 816, 818, 820, + 821, 823, 825, 828, 831, 832, 834, 835, 838, 840, + 841, 842, 843, 844, 845, 845, 845, 847, 849, 851, + 852, 855, 857, 859, 861, 863, 866, 869, 871, 873, + 876, 878, 880, 882, 885, 887, 889, 890, 891, 892, + 894, 896, 899, 902, 904, 906, 908, 911, 913, 915, + + 917, 918, 920, 921, 924, 926, 929, 932, 933, 935, + 937, 938, 940, 941, 943, 945, 946, 947, 948, 949, + 949, 951, 953, 955, 956, 958, 960, 962, 964, 966, + 969, 971, 973, 976, 978, 981, 982, 983, 984, 985, + 987, 990, 993, 996, 998, 1000, 1001, 1003, 1004, 1007, + 1008, 1010, 1011, 1013, 1016, 1017, 1019, 1020, 1022, 1023, + 1024, 1025, 1026, 1026, 1026, 1028, 1030, 1033, 1035, 1038, + 1041, 1043, 1045, 1047, 1047, 1049, 1051, 1052, 1053, 1054, + 1056, 1058, 1060, 1062, 1063, 1065, 1066, 1067, 1069, 1070, + 1070, 1072, 1074, 1075, 1078, 1079, 1080, 1081, 1082, 1082, + + 1083, 1084, 1086, 1089, 1091, 1094, 1096, 1098, 1101, 1103, + 1104, 1105, 1106, 1109, 1111, 1113, 1114, 1116, 1117, 1118, + 1120, 1121, 1123, 1125, 1126, 1128, 1129, 1130, 1131, 1132, + 1135, 1138, 1141, 1143, 1145, 1146, 1147, 1148, 1150, 1152, + 1153, 1155, 1156, 1157, 1159, 1160, 1162, 1164, 1165, 1166, + 1167, 1168, 1169, 1171, 1173, 1174, 1175, 1176, 1179, 1182, + 1184, 1186, 1187, 1188, 1190, 1191, 1194, 1196, 1197, 1198, + 1199, 1200, 1201, 1203, 1206, 1208, 1209, 1211, 1213, 1215, + 1216, 1219, 1220, 1222, 1224, 1225, 1226, 1228, 1229, 1231, + 1232, 1235, 1236, 1237, 1239, 1240, 1242, 1243, 1245, 1247, + + 1248, 1250, 1253, 1255, 1256, 1259, 1261, 1263, 1263 } ; static yyconst int yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, + 4, 4, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 5, 6, 1, 1, 1, 7, 8, 9, - 9, 10, 1, 11, 12, 13, 14, 15, 16, 17, - 17, 18, 19, 20, 17, 21, 22, 23, 24, 25, - 26, 1, 1, 9, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 9, 1, 53, 54, 1, 1, 55, 56, 57, 58, - - 59, 60, 61, 62, 63, 64, 60, 65, 66, 67, - 68, 69, 60, 70, 71, 72, 73, 74, 60, 75, - 60, 76, 77, 78, 79, 1, 1, 1, 1, 1, + 1, 2, 6, 7, 1, 1, 1, 8, 9, 10, + 10, 11, 1, 12, 13, 14, 15, 16, 17, 18, + 18, 19, 20, 21, 18, 22, 23, 24, 25, 26, + 27, 1, 1, 10, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 10, 1, 54, 55, 1, 1, 56, 57, 58, 59, + + 60, 61, 62, 63, 64, 65, 61, 66, 67, 68, + 69, 70, 61, 71, 72, 73, 74, 75, 61, 76, + 61, 77, 78, 79, 80, 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, 1, 1, 1, @@ -567,696 +571,660 @@ static yyconst int yy_ec[256] = 1, 1, 1, 1, 1 } ; -static yyconst int yy_meta[80] = +static yyconst int yy_meta[81] = { 0, - 1, 2, 3, 3, 1, 4, 5, 6, 1, 1, - 7, 8, 1, 1, 9, 9, 9, 9, 9, 9, - 9, 9, 10, 1, 1, 10, 11, 11, 11, 11, - 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 1, 1, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 13, 1, 14 + 1, 2, 3, 3, 3, 1, 4, 5, 6, 1, + 1, 1, 7, 1, 1, 8, 8, 8, 8, 8, + 8, 8, 8, 9, 1, 1, 9, 10, 10, 10, + 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 1, 1, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 12, 1, 12 } ; -static yyconst short int yy_base[709] = +static yyconst short int yy_base[737] = { 0, - 0, 0, 77, 79, 82, 83, 81, 92, 85, 91, - 170, 249, 120, 126, 852, 843, 97, 117, 837, 835, - 321, 132, 4544, 133, 828, 94, 4544, 170, 814, 4544, - 386, 178, 193, 239, 250, 266, 277, 118, 293, 436, - 437, 453, 459, 474, 480, 497, 500, 515, 523, 0, - 569, 0, 4544, 4544, 822, 4544, 4544, 811, 814, 0, - 0, 803, 0, 0, 784, 4544, 4544, 4544, 0, 4544, - 4544, 591, 669, 0, 135, 140, 107, 4544, 800, 208, - 0, 797, 791, 0, 174, 0, 604, 784, 4544, 606, - 778, 4544, 614, 764, 609, 610, 625, 659, 626, 658, - - 0, 674, 687, 690, 698, 713, 716, 734, 731, 747, - 755, 770, 776, 773, 791, 721, 731, 802, 808, 819, - 825, 836, 847, 853, 864, 718, 877, 880, 893, 901, - 718, 904, 917, 928, 941, 717, 957, 963, 974, 980, - 991, 997, 1008, 1014, 1025, 712, 1031, 1047, 705, 32, - 1046, 0, 1093, 1105, 1117, 0, 4544, 4544, 0, 4544, - 0, 741, 0, 726, 236, 0, 234, 4544, 753, 0, - 0, 78, 730, 1083, 4544, 4544, 1112, 1113, 1128, 1129, - 1144, 1152, 1155, 1168, 1176, 1184, 1192, 1205, 1213, 1216, - 1237, 1238, 1253, 1259, 1270, 1276, 1287, 1293, 1304, 1315, - - 693, 681, 1328, 1336, 1339, 1354, 1357, 1360, 1385, 1382, - 1388, 1403, 690, 1406, 1421, 1427, 689, 1438, 1449, 1455, - 1466, 1477, 679, 1488, 1494, 1505, 1511, 1526, 1527, 1542, - 1553, 1559, 1574, 1580, 683, 1591, 1602, 1615, 661, 672, - 661, 1618, 1664, 1672, 4544, 69, 680, 666, 4544, 4544, - 1631, 1667, 1673, 1688, 1689, 1706, 1705, 1722, 1728, 1739, - 1750, 1766, 1763, 1774, 1787, 1790, 1805, 1811, 1822, 1828, - 1839, 1854, 1860, 647, 651, 1871, 1877, 1892, 1893, 1908, - 1914, 1929, 1942, 1950, 1958, 641, 1973, 1976, 1989, 651, - 1997, 2012, 2015, 2033, 631, 2030, 2036, 2053, 2059, 2070, - - 2076, 2087, 2093, 2104, 2110, 619, 2125, 2126, 2143, 2142, - 2159, 631, 621, 632, 2160, 2206, 824, 2214, 2226, 86, - 2211, 2226, 2232, 2243, 615, 2249, 2264, 2267, 2275, 2288, - 2296, 2304, 2317, 2325, 2338, 2346, 2354, 2362, 2377, 2383, - 2394, 2400, 2415, 629, 608, 592, 2416, 2436, 2433, 2454, - 2453, 2469, 2475, 2486, 2492, 2507, 598, 2510, 2513, 2530, - 588, 2531, 2546, 2552, 2563, 604, 2576, 2579, 2587, 2600, - 588, 2611, 587, 2617, 2632, 2633, 577, 2648, 572, 569, - 575, 239, 2681, 4544, 78, 2666, 2683, 2686, 576, 2689, - 2706, 2707, 2727, 2733, 2744, 2750, 2765, 2771, 2788, 2794, - - 2805, 2811, 2822, 2828, 2839, 2845, 2861, 553, 556, 548, - 2862, 2877, 2883, 2894, 2900, 2915, 2921, 2932, 2947, 2953, - 2964, 553, 2975, 2981, 565, 2992, 2998, 3009, 3022, 538, - 3030, 3045, 3048, 3051, 530, 3066, 508, 3069, 3072, 523, - 511, 509, 520, 518, 3118, 3130, 536, 3115, 3128, 508, - 3131, 3146, 3152, 3163, 3169, 3180, 3186, 3197, 3208, 3214, - 3225, 3231, 3242, 3253, 3259, 3270, 159, 529, 502, 3276, - 3287, 3298, 3304, 3315, 3321, 3336, 3337, 3352, 3358, 3369, - 523, 3375, 507, 3386, 3397, 3403, 3414, 499, 3420, 3435, - 493, 3441, 514, 3457, 0, 491, 497, 475, 504, 3490, - - 126, 3485, 3486, 475, 3501, 3509, 3512, 3525, 3533, 3541, - 3554, 3562, 3570, 3578, 3586, 458, 447, 447, 452, 3599, - 3607, 3610, 3623, 3631, 3634, 437, 3647, 432, 3655, 427, - 3663, 437, 3676, 3679, 433, 3687, 420, 3700, 423, 423, - 435, 401, 3733, 466, 190, 3718, 3729, 0, 3735, 3746, - 3752, 3767, 3768, 3783, 3789, 3800, 402, 408, 396, 0, - 3806, 3817, 3828, 377, 3834, 369, 355, 3845, 366, 3856, - 0, 3862, 340, 3873, 348, 355, 327, 304, 530, 4544, - 317, 3879, 3890, 3901, 3907, 3918, 3929, 3940, 3946, 281, - 285, 279, 3957, 3963, 3974, 274, 3980, 276, 267, 3991, - - 262, 3997, 4008, 267, 0, 253, 252, 253, 273, 4014, - 4025, 4031, 4042, 4048, 245, 265, 242, 4059, 4065, 246, - 4080, 234, 236, 4083, 228, 4086, 4103, 229, 225, 228, - 220, 245, 4106, 4109, 223, 220, 221, 4126, 4127, 0, - 4142, 210, 200, 4143, 205, 4158, 4164, 203, 183, 178, - 183, 193, 4175, 4186, 0, 166, 0, 4192, 0, 154, - 4207, 148, 4210, 0, 147, 147, 0, 163, 4218, 141, - 4233, 101, 106, 4234, 102, 0, 116, 4249, 0, 62, - 0, 4255, 0, 69, 4266, 0, 0, 4544, 4313, 4327, - 4341, 4355, 4369, 4383, 4397, 4410, 4414, 4426, 4440, 4454, - - 4466, 4478, 4490, 4495, 4500, 4505, 4516, 4529 + 0, 0, 78, 81, 84, 95, 90, 92, 89, 99, + 87, 101, 181, 261, 119, 131, 1569, 1559, 138, 146, + 1557, 1553, 333, 154, 4166, 155, 1546, 101, 4166, 198, + 1535, 4166, 398, 198, 255, 263, 204, 279, 447, 183, + 304, 453, 280, 469, 491, 492, 509, 525, 540, 543, + 561, 1545, 608, 0, 4166, 4166, 1544, 1538, 4166, 4166, + 1532, 1534, 0, 0, 1537, 0, 0, 1519, 4166, 4166, + 4166, 0, 4166, 4166, 631, 710, 0, 113, 127, 223, + 4166, 1534, 198, 0, 1531, 1528, 1516, 155, 1514, 645, + 1517, 1512, 598, 1509, 4166, 647, 1493, 734, 648, 649, + + 664, 700, 665, 699, 1495, 715, 728, 731, 739, 783, + 786, 804, 801, 817, 825, 840, 846, 843, 861, 185, + 96, 872, 878, 889, 895, 906, 917, 923, 934, 156, + 947, 950, 963, 971, 191, 974, 987, 998, 1011, 215, + 1027, 1033, 1044, 1050, 1061, 1067, 1078, 1084, 1095, 100, + 1101, 1117, 216, 241, 1116, 0, 1493, 0, 1150, 1162, + 0, 4166, 1492, 4166, 0, 4166, 0, 1477, 0, 1461, + 295, 0, 420, 4166, 1488, 0, 1486, 0, 1485, 91, + 1461, 141, 1170, 4166, 4166, 1181, 1480, 1166, 1167, 1182, + 1183, 1230, 1467, 1238, 1241, 1254, 1262, 1270, 1278, 1291, + + 1299, 1302, 1323, 1324, 1339, 1345, 1356, 1362, 1373, 1379, + 1390, 1401, 229, 212, 1414, 1422, 1425, 1440, 1443, 1446, + 1471, 1468, 1474, 1489, 245, 1492, 1507, 1513, 270, 1524, + 1535, 1541, 1552, 1563, 244, 1574, 1580, 1591, 1597, 1612, + 1613, 1628, 1639, 1645, 1660, 1666, 278, 1677, 1688, 1701, + 338, 286, 439, 1704, 1463, 475, 511, 1461, 4166, 96, + 1430, 1405, 1445, 1443, 4166, 4166, 4166, 4166, 480, 1712, + 1725, 1736, 1742, 1753, 1759, 1775, 1776, 1791, 1799, 1807, + 1823, 1820, 1831, 1844, 1847, 1862, 1868, 1879, 1885, 1896, + 1911, 1917, 288, 268, 1928, 1934, 1949, 1950, 1965, 1971, + + 1986, 1999, 2007, 2015, 316, 2030, 2033, 2046, 297, 2054, + 2069, 2072, 2090, 264, 2087, 2093, 2110, 2116, 2127, 2133, + 2144, 2150, 2161, 2167, 471, 2182, 2183, 2200, 2199, 2216, + 440, 343, 492, 2217, 590, 670, 631, 2254, 1439, 456, + 2239, 2254, 2260, 2271, 496, 2277, 2292, 2295, 2303, 2316, + 2324, 2332, 2345, 2353, 2366, 2374, 2382, 2390, 2405, 2411, + 2422, 2428, 2443, 106, 478, 530, 2444, 2464, 2461, 2482, + 2481, 2497, 2503, 2514, 2520, 2535, 491, 2538, 2541, 2558, + 498, 2559, 321, 2574, 2580, 304, 2595, 2596, 2611, 2612, + 534, 493, 514, 2627, 2633, 2644, 585, 2655, 552, 586, + + 510, 697, 728, 4166, 312, 2661, 2677, 2683, 663, 2694, + 2700, 2711, 2717, 2733, 2734, 2749, 2760, 2766, 2783, 2789, + 2800, 2806, 2817, 2823, 2834, 2840, 2856, 512, 538, 702, + 2857, 2872, 2878, 2889, 2895, 2910, 2916, 2927, 2942, 2948, + 524, 545, 2959, 2975, 640, 2972, 1407, 2983, 2996, 696, + 3004, 3019, 3022, 3025, 749, 1414, 238, 3040, 3043, 515, + 609, 701, 546, 638, 781, 3078, 1398, 3063, 3076, 748, + 3079, 3094, 3100, 3111, 3117, 3128, 3134, 3145, 3156, 3162, + 3173, 3179, 3190, 3201, 3207, 3218, 775, 713, 806, 3224, + 3235, 3246, 3252, 3263, 3269, 3284, 3285, 3300, 3306, 1396, + + 805, 3317, 807, 3323, 1402, 3334, 3345, 840, 3351, 3366, + 810, 1394, 849, 3372, 1410, 835, 824, 822, 850, 1029, + 119, 3383, 3398, 846, 3404, 3415, 3426, 3432, 3443, 3449, + 3464, 3467, 3475, 3488, 3491, 804, 668, 884, 899, 3506, + 3512, 3523, 3529, 3540, 3546, 901, 1380, 910, 3557, 844, + 1370, 909, 3577, 3574, 916, 1348, 914, 3580, 926, 942, + 961, 972, 1149, 1214, 892, 3595, 3601, 1370, 3612, 3618, + 3633, 3634, 3649, 550, 3655, 3666, 938, 988, 954, 1362, + 3672, 3683, 3694, 1007, 1333, 967, 986, 1305, 983, 1011, + 1331, 1286, 992, 3700, 1052, 1036, 1038, 1045, 1320, 4166, + + 1299, 3711, 3717, 3732, 3733, 3748, 1254, 3749, 3764, 1054, + 1010, 1065, 3770, 3781, 3792, 1073, 1251, 1075, 1051, 1230, + 1047, 1228, 1193, 1135, 1215, 1088, 1162, 1163, 1159, 3798, + 3809, 3815, 1159, 3826, 1164, 1081, 1200, 3837, 3843, 1223, + 1161, 1207, 1248, 1088, 1189, 1102, 1098, 1222, 1191, 1252, + 1293, 1064, 1056, 3858, 1274, 1263, 1295, 3859, 3874, 1048, + 1010, 1345, 1029, 929, 1291, 0, 934, 1347, 1360, 1322, + 1363, 912, 908, 3875, 937, 1221, 931, 888, 918, 1190, + 0, 1364, 829, 842, 1366, 1385, 825, 791, 713, 1357, + 0, 1285, 1415, 639, 1433, 670, 637, 621, 576, 1379, + + 336, 0, 236, 122, 0, 132, 0, 4166, 3923, 3935, + 3947, 3959, 3971, 3983, 3995, 4006, 4010, 4021, 4033, 4045, + 4056, 4067, 4078, 4083, 4088, 4092, 4097, 4101, 4105, 4109, + 4120, 4126, 4136, 4143, 4150, 4157 } ; -static yyconst short int yy_def[709] = +static yyconst short int yy_def[737] = { 0, - 688, 1, 689, 689, 690, 690, 691, 691, 692, 692, - 693, 693, 694, 694, 688, 688, 688, 688, 688, 695, - 688, 696, 688, 688, 688, 688, 688, 688, 688, 688, - 688, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 697, - 688, 698, 688, 688, 688, 688, 688, 688, 688, 699, - 699, 688, 700, 700, 688, 688, 688, 688, 701, 688, - 688, 702, 702, 703, 688, 688, 21, 688, 688, 688, - 695, 695, 688, 704, 688, 705, 696, 696, 688, 688, - 688, 688, 688, 688, 31, 31, 31, 31, 31, 31, - - 706, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 706, 706, 31, 31, 31, - 31, 31, 31, 31, 31, 706, 31, 31, 31, 31, - 706, 31, 31, 31, 31, 706, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 706, 31, 31, 706, 706, - 31, 697, 688, 688, 688, 698, 688, 688, 699, 688, - 700, 688, 701, 73, 73, 703, 688, 688, 688, 704, - 705, 688, 688, 688, 688, 688, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - - 706, 706, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 706, 31, 31, 31, 706, 31, 31, 31, - 31, 31, 706, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 706, 31, 31, 31, 706, 706, - 706, 31, 688, 688, 688, 73, 73, 688, 688, 688, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 706, 706, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 706, 31, 31, 31, 706, - 31, 31, 31, 31, 706, 31, 31, 31, 31, 31, - - 31, 31, 31, 31, 31, 706, 31, 31, 31, 31, - 31, 706, 706, 706, 31, 688, 707, 688, 688, 73, - 31, 31, 31, 31, 706, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 706, 706, 706, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 706, 31, 31, 31, - 706, 31, 31, 31, 31, 706, 31, 31, 31, 31, - 706, 31, 706, 31, 31, 31, 706, 31, 706, 706, - 706, 688, 688, 688, 73, 31, 31, 31, 706, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - - 31, 31, 31, 31, 31, 31, 31, 706, 706, 706, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 706, 31, 31, 706, 31, 31, 31, 31, 706, - 31, 31, 31, 31, 706, 31, 706, 31, 31, 706, - 706, 706, 706, 706, 688, 688, 73, 31, 31, 706, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 706, 706, 706, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 706, 31, 706, 31, 31, 31, 31, 706, 31, 31, - 706, 31, 706, 31, 706, 706, 706, 706, 706, 688, - - 73, 31, 31, 706, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 706, 706, 706, 706, 31, - 31, 31, 31, 31, 31, 706, 31, 706, 31, 706, - 31, 706, 31, 31, 706, 31, 706, 31, 706, 706, - 706, 706, 688, 708, 73, 31, 31, 706, 31, 31, - 31, 31, 31, 31, 31, 31, 706, 706, 706, 706, - 31, 31, 31, 706, 31, 706, 706, 31, 706, 31, - 706, 31, 706, 31, 706, 706, 706, 706, 688, 688, - 701, 31, 31, 31, 31, 31, 31, 31, 31, 706, - 706, 706, 31, 31, 31, 706, 31, 706, 706, 31, - - 706, 31, 31, 706, 706, 706, 706, 706, 701, 31, - 31, 31, 31, 31, 706, 706, 706, 31, 31, 706, - 31, 706, 706, 31, 706, 31, 31, 706, 706, 706, - 706, 701, 31, 31, 706, 706, 706, 31, 31, 706, - 31, 706, 706, 31, 706, 31, 31, 706, 706, 706, - 706, 701, 31, 31, 706, 706, 706, 31, 706, 706, - 31, 706, 31, 706, 706, 706, 706, 701, 31, 706, - 31, 706, 706, 31, 706, 706, 701, 31, 706, 706, - 706, 31, 706, 701, 31, 706, 701, 0, 688, 688, - 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, - - 688, 688, 688, 688, 688, 688, 688, 688 + 708, 1, 709, 709, 709, 709, 710, 710, 711, 711, + 712, 712, 713, 713, 714, 714, 708, 708, 708, 708, + 708, 715, 708, 716, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 717, 708, 718, 708, 708, 708, 708, 708, 708, + 708, 708, 719, 719, 708, 720, 720, 708, 708, 708, + 708, 721, 708, 708, 722, 722, 723, 708, 708, 23, + 708, 708, 708, 715, 715, 708, 724, 708, 725, 716, + 716, 708, 708, 708, 708, 708, 708, 726, 33, 33, + + 33, 33, 33, 33, 727, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 727, + 727, 33, 33, 33, 33, 33, 33, 33, 33, 727, + 33, 33, 33, 33, 727, 33, 33, 33, 33, 727, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 727, + 33, 33, 727, 727, 33, 728, 717, 53, 708, 708, + 718, 708, 708, 708, 719, 708, 720, 708, 721, 76, + 76, 723, 708, 708, 708, 729, 724, 730, 725, 708, + 708, 731, 708, 708, 708, 726, 732, 33, 33, 33, + 33, 33, 732, 33, 33, 33, 33, 33, 33, 33, + + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 727, 727, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 727, 33, 33, 33, 727, 33, + 33, 33, 33, 33, 727, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 727, 33, 33, 33, + 727, 727, 727, 33, 728, 733, 734, 708, 708, 76, + 76, 708, 729, 730, 708, 708, 708, 708, 731, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 727, 727, 33, 33, 33, 33, 33, 33, + + 33, 33, 33, 33, 727, 33, 33, 33, 727, 33, + 33, 33, 33, 727, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 727, 33, 33, 33, 33, 33, + 727, 727, 727, 33, 733, 733, 734, 708, 708, 76, + 33, 33, 33, 33, 727, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 727, 727, 727, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 727, 33, 33, 33, + 727, 33, 186, 33, 33, 727, 33, 33, 33, 33, + 727, 186, 727, 33, 33, 33, 727, 33, 727, 727, + + 727, 708, 735, 708, 76, 33, 33, 33, 727, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 727, 727, 727, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 186, 727, 33, 33, 727, 33, 186, 33, 33, 727, + 33, 33, 33, 33, 727, 186, 727, 33, 33, 727, + 727, 727, 727, 727, 735, 708, 76, 33, 33, 727, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 727, 727, 727, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 186, + + 727, 33, 727, 33, 186, 33, 33, 727, 33, 33, + 727, 186, 727, 33, 727, 727, 727, 727, 727, 736, + 76, 33, 33, 727, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 727, 727, 727, 727, 33, + 33, 33, 33, 33, 33, 727, 186, 727, 33, 727, + 186, 727, 33, 33, 727, 186, 727, 33, 727, 727, + 727, 727, 736, 736, 76, 33, 33, 727, 33, 33, + 33, 33, 33, 186, 33, 33, 727, 727, 727, 727, + 33, 33, 33, 727, 186, 727, 727, 186, 727, 186, + 727, 186, 727, 33, 727, 727, 727, 727, 708, 708, + + 721, 33, 33, 33, 33, 33, 186, 33, 33, 727, + 727, 727, 33, 33, 33, 727, 186, 727, 727, 186, + 727, 186, 186, 727, 727, 727, 727, 727, 721, 33, + 33, 33, 186, 33, 727, 727, 727, 33, 33, 727, + 186, 727, 727, 186, 727, 186, 186, 727, 727, 727, + 727, 721, 186, 33, 727, 727, 727, 33, 33, 727, + 186, 727, 727, 186, 727, 186, 186, 727, 727, 727, + 727, 721, 186, 33, 727, 727, 727, 186, 727, 727, + 186, 727, 186, 727, 727, 727, 727, 721, 186, 727, + 186, 727, 727, 186, 727, 727, 721, 186, 727, 727, + + 727, 186, 727, 721, 186, 727, 721, 0, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708 } ; -static yyconst short int yy_nxt[4624] = +static yyconst short int yy_nxt[4247] = { 0, - 16, 17, 18, 17, 19, 20, 21, 22, 23, 16, - 23, 24, 25, 26, 27, 28, 28, 28, 28, 28, - 28, 28, 29, 19, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 38, 38, 38, 40, 41, - 42, 43, 38, 44, 45, 46, 47, 48, 49, 38, - 38, 38, 19, 19, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 51, 19, 23, 53, - 54, 53, 54, 61, 57, 57, 62, 64, 55, 240, - 55, 58, 58, 64, 61, 59, 59, 62, 80, 80, - - 80, 79, 241, 92, 79, 249, 687, 65, 164, 320, - 66, 250, 447, 65, 688, 385, 66, 164, 80, 80, - 80, 75, 76, 75, 79, 164, 77, 75, 76, 75, - 688, 686, 77, 87, 87, 87, 167, 167, 167, 79, - 79, 167, 167, 167, 89, 95, 87, 87, 90, 90, - 90, 90, 90, 90, 90, 95, 684, 95, 545, 95, - 688, 67, 683, 68, 95, 164, 681, 67, 680, 68, - 69, 70, 71, 70, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 93, 93, 93, 93, 93, 93, - 93, 93, 69, 69, 69, 69, 30, 83, 78, 679, - - 73, 581, 30, 516, 78, 95, 677, 676, 102, 80, - 80, 80, 103, 675, 673, 95, 104, 95, 105, 95, - 95, 517, 69, 69, 95, 672, 107, 85, 106, 164, - 108, 670, 95, 109, 95, 167, 167, 167, 668, 95, - 382, 382, 382, 667, 666, 665, 70, 69, 70, 69, - 70, 71, 70, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 664, 246, 247, 95, 662, 660, 110, - 659, 69, 69, 69, 69, 164, 95, 95, 95, 73, - 95, 657, 656, 655, 652, 95, 651, 95, 111, 112, - 650, 95, 114, 95, 649, 648, 95, 645, 643, 113, - - 642, 69, 69, 95, 95, 95, 640, 95, 637, 115, - 636, 635, 95, 632, 95, 631, 95, 384, 95, 118, - 95, 630, 119, 95, 629, 70, 69, 70, 79, 628, - 95, 120, 121, 625, 95, 116, 623, 122, 622, 95, - 620, 617, 616, 615, 83, 609, 117, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 608, 85, 86, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 86, 95, 607, 606, - - 95, 95, 95, 95, 95, 95, 95, 95, 605, 604, - 601, 599, 95, 96, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 97, 95, 98, 95, 99, 95, 95, - 95, 95, 100, 95, 95, 95, 95, 95, 598, 596, - 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 123, 95, 95, 592, 591, 579, 579, 579, - 124, 590, 578, 95, 95, 95, 95, 95, 95, 577, - 127, 128, 95, 125, 129, 132, 95, 576, 133, 575, - 95, 573, 95, 571, 130, 569, 134, 567, 95, 95, - - 95, 95, 135, 566, 137, 95, 564, 95, 131, 126, - 138, 95, 560, 95, 139, 95, 142, 95, 559, 95, - 95, 95, 558, 143, 95, 140, 95, 95, 136, 557, - 141, 579, 579, 579, 95, 548, 95, 95, 95, 147, - 144, 95, 95, 95, 580, 148, 95, 145, 542, 541, - 95, 540, 95, 539, 95, 146, 95, 151, 537, 535, - 95, 95, 95, 532, 95, 530, 149, 528, 519, 95, - 153, 153, 153, 518, 504, 501, 499, 150, 498, 497, - 496, 495, 493, 154, 154, 154, 154, 154, 154, 155, - 155, 163, 491, 488, 483, 163, 163, 163, 163, 163, - - 163, 163, 163, 163, 163, 87, 87, 87, 580, 481, - 469, 172, 468, 163, 163, 163, 163, 467, 87, 87, - 174, 174, 174, 174, 174, 174, 174, 174, 93, 93, - 93, 93, 93, 93, 93, 93, 95, 95, 450, 444, - 443, 442, 440, 163, 163, 437, 95, 95, 95, 95, - 95, 95, 95, 95, 177, 95, 95, 435, 430, 425, - 422, 410, 178, 95, 95, 95, 95, 180, 163, 163, - 409, 95, 95, 163, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 408, 389, 95, 95, 381, 380, 379, - 373, 163, 163, 163, 163, 95, 95, 95, 95, 95, - - 95, 95, 366, 181, 95, 95, 182, 361, 165, 179, - 357, 95, 345, 95, 95, 95, 344, 95, 168, 164, - 95, 163, 163, 314, 95, 95, 95, 95, 95, 95, - 313, 184, 183, 95, 312, 95, 95, 95, 185, 95, - 95, 306, 186, 95, 95, 295, 163, 290, 286, 275, - 95, 274, 95, 95, 95, 95, 187, 95, 95, 95, - 188, 95, 95, 250, 248, 164, 245, 239, 95, 189, - 190, 95, 95, 95, 95, 95, 235, 95, 191, 223, - 95, 217, 192, 213, 95, 202, 95, 201, 95, 176, - 175, 173, 95, 95, 95, 169, 95, 95, 193, 194, - - 95, 95, 168, 95, 196, 168, 162, 95, 160, 95, - 199, 95, 95, 95, 95, 95, 195, 197, 95, 95, - 203, 198, 95, 92, 158, 382, 382, 382, 95, 95, - 95, 200, 95, 157, 383, 95, 94, 95, 204, 95, - 91, 95, 82, 95, 79, 95, 95, 95, 95, 95, - 79, 688, 95, 206, 95, 688, 95, 688, 95, 688, - 205, 688, 95, 95, 95, 95, 95, 688, 688, 207, - 208, 95, 688, 95, 95, 95, 209, 95, 688, 688, - 95, 688, 95, 688, 95, 688, 95, 688, 95, 688, - 95, 95, 211, 95, 95, 688, 210, 688, 688, 95, - - 688, 212, 384, 95, 95, 95, 688, 95, 688, 688, - 95, 688, 214, 688, 95, 688, 95, 95, 95, 95, - 95, 95, 688, 95, 688, 215, 95, 688, 95, 688, - 95, 95, 95, 688, 95, 688, 688, 688, 95, 95, - 95, 95, 95, 95, 95, 95, 216, 95, 688, 218, - 95, 688, 688, 688, 95, 95, 95, 688, 95, 688, - 688, 688, 688, 95, 219, 95, 688, 95, 95, 95, - 688, 221, 688, 688, 220, 222, 688, 688, 95, 688, - 95, 688, 95, 224, 95, 688, 688, 95, 688, 688, - 95, 688, 688, 688, 225, 688, 95, 688, 95, 688, - - 95, 95, 95, 95, 95, 226, 688, 95, 227, 95, - 688, 95, 231, 95, 688, 95, 688, 95, 95, 95, - 95, 95, 688, 229, 95, 228, 95, 688, 95, 688, - 230, 688, 95, 688, 95, 95, 95, 95, 95, 688, - 232, 95, 688, 95, 688, 95, 688, 95, 688, 95, - 688, 95, 95, 95, 95, 95, 688, 688, 95, 688, - 233, 688, 95, 688, 95, 236, 234, 688, 95, 688, - 95, 95, 95, 95, 95, 237, 688, 95, 238, 688, - 688, 688, 688, 95, 95, 95, 95, 95, 95, 688, - 688, 242, 95, 95, 153, 153, 153, 174, 174, 174, - - 174, 174, 174, 174, 174, 688, 688, 154, 154, 154, - 154, 154, 154, 155, 155, 243, 688, 688, 688, 155, - 155, 155, 155, 155, 155, 155, 155, 244, 688, 688, - 688, 155, 155, 155, 155, 155, 155, 155, 155, 95, - 95, 688, 251, 688, 688, 688, 688, 688, 688, 95, - 95, 95, 95, 95, 95, 95, 95, 688, 95, 95, - 688, 688, 688, 688, 688, 95, 252, 95, 95, 95, - 95, 95, 688, 688, 95, 95, 688, 688, 688, 95, - 688, 95, 95, 95, 253, 95, 254, 688, 688, 95, - 95, 95, 95, 95, 95, 95, 95, 688, 95, 688, - - 688, 95, 688, 95, 688, 95, 688, 95, 688, 95, - 688, 95, 255, 256, 95, 95, 688, 95, 688, 95, - 688, 95, 95, 95, 688, 95, 258, 257, 688, 95, - 95, 95, 95, 95, 688, 688, 688, 688, 95, 688, - 95, 688, 95, 95, 95, 688, 95, 688, 688, 259, - 95, 95, 95, 95, 260, 95, 688, 95, 688, 95, - 261, 262, 95, 263, 95, 95, 688, 688, 265, 688, - 688, 264, 688, 688, 95, 95, 95, 95, 95, 95, - 95, 688, 688, 95, 95, 688, 95, 688, 688, 688, - 95, 688, 95, 266, 95, 688, 95, 95, 95, 95, - - 95, 688, 688, 95, 688, 95, 268, 95, 267, 95, - 688, 95, 688, 95, 95, 95, 95, 95, 688, 688, - 95, 688, 95, 271, 269, 688, 95, 270, 95, 688, - 95, 95, 95, 95, 95, 688, 688, 688, 688, 95, - 688, 95, 95, 95, 688, 95, 688, 688, 272, 688, - 95, 688, 95, 273, 95, 95, 95, 688, 688, 688, - 688, 95, 688, 95, 688, 95, 95, 95, 688, 95, - 688, 688, 276, 95, 95, 277, 278, 95, 95, 279, - 95, 95, 95, 688, 95, 95, 688, 95, 688, 688, - 282, 280, 688, 95, 95, 95, 95, 95, 95, 95, - - 95, 95, 281, 95, 283, 688, 95, 688, 688, 95, - 688, 688, 95, 688, 688, 95, 688, 688, 688, 95, - 688, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 688, 95, 284, 688, 287, 688, 688, 688, - 285, 688, 95, 95, 95, 95, 688, 95, 95, 95, - 688, 288, 95, 688, 95, 688, 688, 688, 95, 688, - 95, 289, 95, 688, 95, 95, 95, 95, 95, 688, - 688, 688, 688, 95, 688, 95, 95, 95, 688, 95, - 688, 688, 95, 291, 95, 688, 95, 688, 95, 688, - 95, 688, 95, 95, 95, 95, 95, 688, 688, 292, - - 688, 95, 688, 95, 95, 95, 688, 95, 688, 688, - 293, 688, 95, 688, 95, 95, 95, 688, 95, 688, - 297, 95, 688, 95, 294, 296, 688, 95, 688, 95, - 688, 95, 95, 95, 95, 95, 688, 688, 95, 688, - 95, 688, 95, 688, 95, 688, 95, 688, 95, 688, - 95, 298, 95, 95, 95, 688, 299, 95, 688, 688, - 688, 300, 688, 95, 95, 95, 95, 95, 95, 95, - 688, 688, 95, 95, 688, 688, 688, 688, 688, 95, - 95, 95, 688, 95, 688, 688, 95, 301, 95, 688, - 95, 688, 95, 688, 95, 688, 95, 302, 95, 95, - - 95, 95, 688, 303, 304, 95, 688, 95, 688, 688, - 305, 95, 688, 95, 688, 95, 688, 95, 95, 95, - 95, 95, 688, 688, 688, 688, 95, 688, 95, 95, - 95, 307, 95, 308, 688, 311, 688, 95, 309, 95, - 688, 95, 95, 95, 688, 95, 688, 310, 95, 688, - 688, 315, 95, 688, 95, 95, 95, 95, 95, 95, - 688, 95, 688, 688, 95, 316, 316, 316, 95, 688, - 321, 688, 95, 318, 318, 318, 688, 95, 317, 317, - 317, 317, 317, 317, 317, 317, 319, 319, 319, 319, - 319, 319, 319, 319, 95, 688, 688, 688, 688, 688, - - 95, 322, 688, 688, 95, 688, 95, 688, 95, 688, - 95, 323, 95, 95, 95, 95, 95, 688, 688, 95, - 688, 688, 688, 688, 688, 95, 95, 324, 95, 95, - 95, 327, 95, 95, 95, 95, 326, 688, 688, 688, - 688, 688, 95, 95, 95, 95, 95, 95, 688, 95, - 328, 95, 95, 688, 688, 95, 688, 688, 688, 95, - 325, 95, 688, 95, 688, 95, 95, 95, 95, 95, - 688, 688, 329, 688, 95, 688, 95, 95, 95, 330, - 95, 688, 688, 688, 688, 95, 688, 95, 688, 95, - 95, 95, 332, 95, 688, 331, 95, 688, 688, 688, - - 95, 95, 95, 95, 95, 95, 688, 95, 688, 333, - 688, 95, 95, 334, 95, 95, 335, 95, 688, 336, - 95, 688, 688, 688, 95, 688, 95, 95, 95, 95, - 688, 95, 95, 95, 688, 337, 95, 688, 95, 688, - 688, 688, 95, 688, 95, 688, 95, 688, 95, 95, - 95, 95, 338, 688, 688, 95, 339, 95, 688, 95, - 688, 95, 688, 95, 688, 95, 95, 95, 95, 95, - 688, 340, 688, 688, 95, 688, 95, 688, 341, 688, - 95, 95, 342, 688, 343, 95, 688, 95, 688, 688, - 688, 95, 688, 95, 688, 95, 688, 95, 95, 95, - - 95, 95, 688, 688, 95, 688, 95, 688, 95, 688, - 95, 688, 95, 688, 95, 688, 95, 95, 95, 95, - 95, 688, 347, 95, 688, 688, 348, 688, 688, 95, - 95, 95, 95, 95, 95, 95, 349, 688, 95, 95, - 351, 95, 346, 688, 688, 95, 688, 95, 688, 95, - 688, 95, 688, 95, 350, 95, 95, 352, 688, 355, - 95, 353, 688, 688, 688, 688, 95, 688, 95, 95, - 95, 688, 354, 688, 688, 95, 688, 95, 688, 95, - 688, 95, 688, 95, 688, 95, 688, 95, 95, 95, - 688, 95, 688, 688, 356, 95, 95, 95, 688, 95, - - 95, 358, 688, 95, 95, 688, 688, 688, 688, 688, - 95, 688, 95, 95, 95, 95, 95, 95, 688, 95, - 688, 359, 95, 363, 95, 688, 95, 362, 95, 360, - 95, 688, 688, 688, 95, 95, 95, 688, 95, 95, - 688, 688, 95, 95, 688, 364, 688, 688, 688, 95, - 688, 95, 95, 95, 95, 688, 95, 95, 95, 365, - 95, 95, 688, 95, 688, 688, 688, 95, 688, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 688, 95, - 95, 367, 95, 368, 688, 688, 95, 688, 688, 688, - 95, 688, 95, 688, 95, 688, 95, 95, 95, 95, - - 95, 688, 370, 95, 688, 95, 688, 95, 688, 369, - 688, 95, 688, 95, 95, 95, 95, 95, 688, 688, - 95, 372, 95, 688, 95, 688, 95, 688, 95, 688, - 95, 95, 95, 95, 95, 688, 688, 95, 688, 95, - 688, 95, 688, 95, 688, 95, 688, 95, 688, 95, - 95, 95, 95, 95, 688, 688, 95, 688, 371, 688, - 688, 688, 95, 95, 374, 95, 95, 95, 688, 95, - 95, 95, 375, 376, 688, 688, 688, 688, 688, 95, - 95, 95, 95, 95, 95, 688, 95, 95, 95, 95, - 688, 688, 688, 688, 688, 688, 95, 95, 95, 95, - - 95, 95, 688, 378, 377, 95, 95, 316, 316, 316, - 688, 688, 688, 688, 688, 318, 318, 318, 688, 688, - 317, 317, 317, 317, 317, 317, 317, 317, 319, 319, - 319, 319, 319, 319, 319, 319, 383, 688, 95, 688, - 319, 319, 319, 319, 319, 319, 319, 319, 95, 688, - 95, 688, 95, 95, 387, 688, 386, 95, 388, 95, - 688, 688, 688, 95, 688, 95, 688, 95, 688, 95, - 95, 95, 95, 95, 688, 390, 95, 688, 95, 688, - 95, 688, 95, 688, 95, 688, 95, 688, 95, 95, - 95, 95, 391, 688, 95, 95, 688, 392, 688, 688, - - 688, 95, 95, 95, 95, 95, 95, 688, 95, 688, - 95, 688, 95, 95, 95, 95, 95, 688, 688, 688, - 688, 95, 688, 95, 688, 95, 688, 393, 688, 95, - 688, 95, 688, 95, 95, 95, 688, 95, 395, 394, - 688, 95, 95, 95, 95, 95, 688, 688, 688, 688, - 95, 688, 95, 688, 396, 397, 95, 688, 95, 398, - 688, 688, 95, 95, 95, 95, 95, 399, 688, 688, - 688, 95, 688, 95, 688, 95, 400, 95, 688, 95, - 401, 95, 688, 95, 95, 95, 688, 95, 688, 95, - 688, 95, 95, 95, 688, 95, 688, 402, 688, 95, - - 95, 95, 688, 95, 95, 404, 688, 403, 95, 688, - 95, 688, 688, 688, 95, 688, 95, 688, 95, 688, - 95, 95, 95, 95, 95, 688, 688, 95, 405, 95, - 688, 95, 688, 95, 688, 95, 688, 95, 406, 407, - 95, 95, 95, 95, 688, 688, 95, 688, 688, 688, - 411, 688, 95, 95, 95, 95, 95, 95, 688, 688, - 95, 95, 95, 95, 412, 688, 413, 688, 688, 688, - 95, 688, 95, 95, 95, 95, 688, 95, 414, 95, - 95, 95, 95, 415, 688, 688, 688, 688, 688, 688, - 95, 95, 416, 95, 95, 95, 95, 688, 688, 95, - - 95, 688, 95, 688, 688, 418, 95, 688, 95, 688, - 95, 420, 95, 95, 95, 417, 95, 688, 421, 95, - 688, 95, 688, 95, 688, 95, 688, 95, 688, 95, - 419, 95, 95, 95, 95, 688, 688, 95, 95, 688, - 95, 688, 688, 688, 95, 688, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 423, 95, 95, 95, 95, - 688, 688, 688, 688, 688, 688, 688, 95, 95, 424, - 95, 95, 95, 95, 426, 688, 95, 95, 688, 95, - 427, 688, 688, 95, 688, 95, 688, 95, 688, 95, - 95, 428, 95, 95, 688, 688, 688, 688, 95, 688, - - 95, 688, 95, 95, 95, 688, 95, 688, 429, 95, - 431, 688, 688, 95, 95, 95, 95, 95, 432, 433, - 95, 688, 95, 688, 95, 95, 95, 95, 95, 688, - 688, 688, 688, 95, 688, 688, 688, 95, 95, 95, - 688, 95, 688, 688, 95, 436, 95, 688, 95, 434, - 95, 688, 95, 688, 95, 688, 95, 95, 95, 95, - 95, 688, 438, 95, 688, 688, 688, 688, 688, 95, - 95, 95, 95, 95, 95, 95, 439, 688, 95, 95, - 688, 688, 445, 445, 445, 95, 688, 95, 688, 95, - 688, 688, 688, 95, 95, 446, 446, 446, 446, 446, - - 446, 446, 446, 95, 688, 95, 688, 95, 688, 448, - 95, 688, 95, 95, 688, 688, 95, 688, 688, 441, - 95, 688, 95, 95, 95, 95, 95, 95, 451, 95, - 95, 449, 95, 95, 95, 95, 688, 688, 688, 688, - 688, 688, 688, 95, 95, 95, 95, 95, 95, 688, - 688, 452, 95, 95, 95, 688, 688, 453, 688, 454, - 95, 688, 688, 688, 95, 688, 95, 688, 95, 688, - 95, 95, 95, 95, 95, 688, 688, 95, 688, 95, - 688, 95, 688, 455, 688, 95, 688, 95, 688, 95, - 95, 95, 95, 688, 457, 456, 95, 688, 95, 688, - - 688, 688, 95, 688, 95, 688, 95, 688, 95, 688, - 95, 95, 95, 688, 688, 95, 458, 95, 459, 688, - 688, 95, 688, 460, 688, 95, 688, 95, 688, 95, - 688, 95, 95, 95, 95, 95, 688, 462, 95, 688, - 95, 688, 95, 688, 461, 688, 95, 688, 95, 95, - 95, 95, 95, 688, 688, 95, 688, 95, 688, 95, - 688, 95, 463, 95, 688, 95, 95, 95, 95, 95, - 688, 688, 95, 688, 95, 688, 95, 688, 95, 465, - 95, 688, 95, 464, 95, 95, 95, 466, 95, 95, - 688, 95, 688, 470, 688, 688, 688, 688, 95, 95, - - 95, 95, 95, 95, 95, 688, 688, 95, 95, 688, - 95, 471, 472, 688, 95, 688, 95, 688, 95, 688, - 95, 95, 95, 95, 95, 688, 688, 95, 688, 95, - 474, 95, 688, 95, 688, 95, 688, 95, 473, 95, - 95, 95, 95, 475, 688, 688, 95, 688, 95, 476, - 688, 688, 95, 688, 95, 688, 95, 688, 95, 95, - 95, 95, 95, 688, 688, 688, 688, 95, 688, 95, - 688, 95, 688, 95, 95, 477, 688, 478, 95, 688, - 95, 688, 688, 688, 95, 688, 95, 688, 95, 688, - 95, 95, 95, 95, 95, 688, 688, 479, 480, 95, - - 688, 95, 95, 95, 688, 95, 688, 482, 95, 688, - 95, 688, 95, 688, 95, 688, 95, 688, 95, 95, - 95, 95, 95, 688, 688, 95, 688, 95, 688, 95, - 688, 484, 688, 95, 688, 95, 95, 485, 95, 95, - 688, 688, 688, 688, 95, 688, 95, 688, 95, 95, - 95, 688, 487, 688, 486, 95, 688, 95, 688, 95, - 688, 95, 688, 95, 688, 688, 688, 95, 95, 95, - 688, 95, 95, 490, 688, 95, 95, 489, 95, 688, - 688, 688, 95, 688, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 492, 95, 95, 688, 95, - - 688, 688, 688, 95, 688, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 688, 95, 494, 688, 95, 445, - 445, 445, 688, 688, 688, 688, 688, 688, 688, 688, - 688, 688, 446, 446, 446, 446, 446, 446, 446, 446, - 500, 688, 95, 688, 446, 446, 446, 446, 446, 446, - 446, 446, 95, 688, 95, 95, 95, 688, 95, 688, - 502, 95, 503, 688, 688, 95, 688, 95, 95, 95, - 95, 688, 95, 95, 95, 688, 505, 95, 688, 95, - 688, 688, 688, 95, 688, 95, 688, 95, 688, 95, - 95, 506, 95, 95, 688, 688, 95, 507, 95, 688, - - 95, 688, 95, 508, 95, 688, 95, 95, 95, 95, - 95, 688, 688, 95, 688, 95, 688, 95, 688, 95, - 688, 95, 688, 95, 95, 95, 95, 95, 688, 688, - 688, 509, 95, 688, 95, 95, 95, 510, 95, 688, - 688, 95, 688, 95, 688, 95, 688, 95, 688, 95, - 688, 95, 95, 95, 95, 95, 688, 511, 95, 688, - 95, 688, 95, 688, 95, 688, 95, 688, 95, 95, - 95, 95, 95, 688, 688, 688, 512, 95, 688, 95, - 95, 95, 688, 95, 688, 688, 514, 513, 95, 688, - 95, 688, 95, 688, 95, 688, 95, 95, 95, 95, - - 95, 688, 688, 95, 688, 95, 688, 515, 688, 95, - 520, 95, 688, 95, 95, 95, 95, 95, 688, 688, - 688, 688, 95, 688, 95, 95, 95, 688, 95, 688, - 688, 95, 521, 95, 688, 95, 688, 95, 688, 95, - 688, 95, 95, 95, 95, 95, 688, 688, 95, 688, - 95, 523, 95, 688, 95, 688, 95, 688, 95, 522, - 95, 95, 95, 95, 95, 688, 688, 95, 688, 688, - 688, 688, 688, 95, 95, 95, 95, 95, 95, 95, - 525, 524, 95, 95, 688, 95, 688, 688, 688, 95, - 688, 95, 688, 95, 688, 95, 95, 95, 95, 95, - - 688, 688, 95, 688, 95, 688, 95, 688, 527, 688, - 95, 688, 529, 95, 95, 95, 95, 688, 688, 688, - 688, 95, 688, 95, 95, 95, 688, 95, 531, 526, - 95, 688, 95, 688, 95, 688, 95, 688, 95, 688, - 95, 95, 95, 95, 95, 688, 688, 95, 688, 95, - 533, 95, 688, 95, 688, 95, 688, 95, 688, 95, - 95, 95, 95, 688, 688, 534, 95, 688, 95, 688, - 688, 536, 95, 688, 95, 688, 95, 688, 95, 688, - 95, 95, 95, 538, 95, 688, 688, 95, 688, 688, - 688, 543, 543, 543, 95, 688, 95, 688, 95, 688, - - 688, 688, 688, 95, 544, 544, 544, 544, 544, 544, - 544, 544, 95, 95, 547, 688, 688, 688, 688, 546, - 688, 688, 95, 95, 95, 95, 95, 95, 95, 688, - 688, 95, 95, 688, 688, 688, 95, 688, 95, 95, - 95, 688, 95, 688, 549, 688, 95, 95, 95, 95, - 95, 551, 95, 95, 550, 95, 688, 688, 95, 688, - 95, 688, 95, 688, 552, 554, 95, 688, 95, 688, - 95, 95, 95, 553, 95, 688, 688, 688, 95, 95, - 95, 95, 95, 688, 688, 688, 688, 95, 688, 95, - 688, 95, 555, 95, 688, 95, 688, 95, 688, 95, - - 95, 95, 688, 95, 688, 95, 688, 95, 95, 95, - 688, 95, 556, 95, 688, 95, 95, 95, 688, 95, - 688, 688, 688, 95, 95, 95, 95, 95, 688, 561, - 688, 688, 95, 688, 95, 688, 95, 95, 95, 688, - 95, 688, 688, 688, 95, 95, 95, 95, 95, 95, - 95, 95, 688, 95, 688, 688, 95, 688, 95, 688, - 95, 95, 95, 688, 95, 562, 688, 688, 95, 95, - 95, 95, 95, 95, 95, 95, 688, 95, 565, 563, - 95, 688, 95, 688, 95, 688, 95, 570, 95, 688, - 95, 688, 95, 95, 95, 688, 95, 568, 688, 688, - - 95, 95, 95, 95, 95, 688, 95, 688, 688, 95, - 688, 688, 688, 95, 95, 95, 95, 95, 95, 688, - 95, 688, 95, 688, 95, 95, 572, 95, 95, 688, - 688, 688, 688, 95, 543, 543, 543, 574, 688, 95, - 688, 95, 688, 688, 688, 95, 95, 544, 544, 544, - 544, 544, 544, 544, 544, 95, 95, 95, 582, 95, - 688, 688, 95, 688, 95, 688, 95, 688, 95, 688, - 95, 688, 95, 95, 95, 95, 95, 688, 688, 95, - 688, 95, 584, 95, 688, 95, 688, 95, 688, 95, - 583, 95, 95, 95, 95, 95, 688, 688, 95, 585, - - 688, 688, 688, 688, 95, 95, 95, 586, 95, 95, - 95, 587, 688, 95, 95, 688, 95, 688, 588, 688, - 95, 688, 95, 688, 95, 688, 95, 95, 95, 95, - 95, 688, 688, 95, 688, 95, 688, 589, 688, 95, - 688, 95, 688, 95, 95, 95, 95, 95, 688, 593, - 688, 688, 95, 688, 95, 95, 95, 594, 95, 688, - 688, 95, 595, 95, 688, 95, 688, 95, 597, 95, - 688, 95, 95, 95, 95, 95, 688, 688, 688, 688, - 95, 688, 95, 95, 600, 688, 95, 688, 688, 95, - 688, 95, 688, 95, 688, 95, 602, 95, 688, 95, - - 95, 95, 95, 95, 688, 688, 95, 603, 95, 688, - 95, 688, 95, 688, 95, 688, 95, 95, 610, 95, - 95, 688, 688, 688, 688, 95, 688, 95, 95, 95, - 611, 95, 688, 688, 95, 688, 95, 688, 95, 688, - 95, 688, 95, 688, 95, 95, 95, 95, 95, 688, - 688, 688, 688, 95, 688, 95, 95, 95, 688, 95, - 688, 688, 612, 688, 95, 688, 95, 95, 95, 613, - 95, 688, 688, 95, 688, 95, 688, 95, 688, 95, - 614, 95, 688, 95, 95, 95, 95, 95, 688, 688, - 95, 688, 95, 688, 95, 688, 95, 688, 95, 688, - - 95, 95, 618, 95, 95, 688, 688, 95, 688, 95, - 688, 95, 688, 95, 619, 95, 688, 95, 95, 621, - 95, 95, 688, 688, 95, 624, 95, 688, 95, 688, - 95, 626, 95, 688, 95, 95, 95, 95, 95, 688, - 688, 95, 627, 95, 688, 95, 688, 95, 688, 95, - 688, 95, 95, 95, 95, 95, 688, 688, 95, 688, - 95, 688, 95, 688, 95, 688, 95, 688, 95, 95, - 95, 95, 95, 688, 688, 95, 688, 95, 688, 95, - 688, 633, 688, 95, 688, 95, 95, 95, 95, 95, - 688, 688, 95, 634, 95, 688, 95, 688, 95, 688, - - 95, 688, 95, 638, 639, 95, 95, 95, 688, 688, - 95, 95, 688, 95, 641, 646, 688, 95, 688, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 644, 95, - 95, 688, 95, 95, 647, 688, 95, 688, 688, 688, - 95, 688, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 653, 95, 95, 95, 95, 688, 688, 688, 654, - 688, 688, 688, 95, 95, 95, 95, 95, 95, 95, - 95, 688, 95, 95, 688, 688, 688, 688, 688, 95, - 95, 95, 95, 95, 95, 95, 688, 658, 95, 95, - 688, 95, 688, 661, 688, 95, 688, 95, 663, 95, - - 688, 95, 95, 95, 95, 95, 688, 688, 688, 688, - 95, 688, 95, 95, 95, 688, 95, 688, 669, 95, - 688, 95, 688, 95, 688, 95, 688, 95, 688, 95, - 688, 95, 95, 95, 95, 688, 688, 95, 95, 688, - 674, 688, 671, 688, 95, 95, 95, 95, 95, 95, - 688, 95, 688, 95, 688, 95, 95, 95, 678, 95, - 95, 95, 688, 688, 95, 688, 688, 688, 688, 688, - 95, 95, 95, 95, 95, 95, 95, 682, 688, 95, - 95, 688, 95, 688, 688, 688, 685, 688, 95, 688, - 95, 688, 95, 95, 95, 95, 95, 688, 688, 688, - - 688, 95, 688, 95, 688, 95, 688, 95, 688, 688, - 688, 688, 95, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, - 56, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63, 63, 63, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 81, 81, 81, - - 688, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 88, 88, 688, 688, 88, 688, 688, 88, 688, - 88, 152, 152, 688, 152, 152, 156, 156, 688, 156, - 156, 156, 156, 688, 156, 156, 156, 156, 156, 156, - 159, 159, 159, 688, 159, 159, 159, 159, 159, 159, - 159, 159, 159, 159, 161, 161, 161, 161, 161, 161, - 161, 161, 161, 688, 161, 161, 163, 688, 688, 163, - 163, 163, 163, 163, 163, 163, 163, 163, 164, 688, - 688, 164, 164, 164, 164, 164, 164, 164, 164, 164, - 166, 688, 688, 166, 688, 166, 166, 166, 166, 166, - - 166, 166, 170, 170, 688, 170, 170, 171, 171, 688, - 171, 171, 101, 101, 688, 101, 101, 317, 317, 688, - 688, 688, 317, 688, 317, 688, 688, 688, 688, 317, - 544, 544, 688, 688, 688, 688, 688, 544, 688, 688, - 688, 688, 544, 15, 688, 688, 688, 688, 688, 688, - 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, - 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, - 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, - 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, - 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, - - 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, - 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, - 688, 688, 688 + 18, 19, 20, 19, 19, 21, 22, 23, 24, 25, + 18, 25, 26, 27, 28, 29, 30, 30, 30, 30, + 30, 30, 30, 31, 21, 32, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 40, 40, 40, 42, + 43, 44, 45, 40, 46, 47, 48, 49, 50, 51, + 40, 40, 40, 21, 21, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 53, 21, 25, + 55, 56, 56, 55, 56, 56, 55, 56, 56, 67, + 57, 64, 60, 57, 60, 65, 58, 55, 56, 56, + + 61, 64, 61, 67, 62, 65, 62, 58, 193, 82, + 68, 95, 193, 69, 173, 173, 173, 173, 193, 265, + 78, 79, 78, 78, 68, 266, 80, 69, 173, 173, + 173, 173, 78, 79, 78, 78, 170, 340, 80, 83, + 83, 83, 83, 268, 193, 268, 82, 83, 83, 83, + 83, 214, 565, 269, 82, 90, 90, 90, 90, 170, + 707, 428, 82, 82, 70, 247, 71, 92, 193, 90, + 90, 93, 93, 93, 93, 93, 93, 93, 70, 86, + 71, 72, 73, 74, 73, 73, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 32, 193, 81, 83, + + 83, 83, 83, 193, 72, 72, 72, 72, 32, 88, + 81, 99, 76, 96, 96, 96, 96, 96, 96, 96, + 96, 99, 225, 99, 193, 99, 99, 193, 193, 106, + 99, 708, 99, 107, 72, 72, 99, 108, 99, 109, + 99, 193, 99, 115, 116, 99, 99, 708, 193, 110, + 193, 99, 213, 193, 117, 229, 193, 193, 73, 72, + 73, 72, 73, 74, 73, 73, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 193, 708, 235, 251, + 193, 294, 193, 99, 72, 72, 72, 72, 293, 111, + 193, 99, 76, 112, 114, 99, 113, 99, 193, 252, + + 193, 99, 99, 99, 305, 99, 118, 99, 99, 193, + 99, 314, 253, 513, 72, 72, 193, 99, 99, 99, + 99, 99, 99, 119, 260, 261, 99, 129, 193, 309, + 365, 122, 99, 708, 123, 170, 386, 325, 73, 72, + 73, 82, 99, 124, 125, 332, 99, 467, 193, 126, + 193, 99, 170, 130, 381, 193, 447, 86, 364, 450, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 377, 88, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 98, 400, 331, 99, 99, 99, 99, 99, 99, 99, + 99, 173, 173, 173, 173, 99, 100, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 101, 99, 102, 99, + 103, 99, 99, 99, 99, 104, 99, 99, 99, 99, + 99, 193, 193, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 99, 335, 335, 335, 335, + 127, 99, 268, 193, 268, 99, 405, 99, 128, 99, + 193, 99, 269, 99, 99, 99, 170, 131, 132, 399, + + 99, 133, 333, 193, 193, 708, 120, 99, 193, 99, + 193, 134, 337, 337, 337, 337, 99, 121, 136, 99, + 99, 137, 193, 141, 193, 135, 193, 193, 456, 138, + 99, 99, 99, 99, 99, 139, 708, 99, 99, 99, + 142, 429, 193, 393, 143, 146, 193, 99, 401, 99, + 193, 99, 147, 99, 442, 144, 99, 193, 193, 500, + 145, 140, 708, 99, 193, 99, 409, 99, 99, 148, + 445, 99, 99, 457, 515, 464, 149, 487, 99, 607, + 151, 99, 99, 99, 150, 99, 152, 99, 193, 99, + 99, 335, 335, 335, 335, 488, 155, 193, 193, 99, + + 430, 99, 501, 99, 455, 518, 154, 153, 99, 158, + 158, 158, 158, 183, 183, 183, 183, 183, 183, 183, + 183, 193, 462, 159, 159, 159, 159, 159, 159, 160, + 160, 169, 337, 337, 337, 337, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 90, 90, 90, 90, + 193, 460, 193, 180, 169, 169, 169, 169, 463, 705, + 90, 90, 96, 96, 96, 96, 96, 96, 96, 96, + 503, 402, 402, 402, 402, 193, 99, 99, 704, 516, + 193, 403, 193, 702, 169, 169, 99, 99, 99, 99, + 99, 99, 99, 99, 188, 99, 99, 519, 402, 402, + + 402, 402, 189, 99, 99, 99, 99, 191, 193, 169, + 169, 99, 99, 193, 193, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 193, 470, 99, 99, 465, + 465, 465, 465, 169, 169, 169, 169, 99, 99, 99, + 99, 99, 99, 99, 578, 192, 99, 99, 194, 404, + 171, 190, 508, 99, 698, 99, 99, 99, 538, 99, + 193, 193, 99, 169, 169, 489, 99, 99, 99, 99, + 99, 99, 517, 196, 195, 99, 404, 99, 99, 99, + 197, 99, 465, 465, 465, 465, 99, 193, 169, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 99, 511, 198, 99, 524, 193, 193, 193, 193, + 536, 99, 193, 99, 99, 99, 99, 199, 99, 99, + 99, 200, 99, 99, 193, 697, 193, 193, 537, 99, + 201, 202, 99, 99, 99, 99, 99, 193, 99, 203, + 548, 99, 193, 204, 193, 99, 193, 99, 193, 99, + 694, 193, 193, 99, 99, 99, 550, 99, 99, 205, + 206, 99, 99, 539, 99, 208, 577, 555, 99, 560, + 99, 211, 99, 99, 99, 99, 99, 207, 209, 99, + 99, 215, 210, 99, 557, 562, 193, 561, 559, 99, + + 99, 99, 212, 99, 601, 552, 99, 568, 99, 216, + 99, 193, 99, 193, 99, 587, 99, 99, 99, 99, + 99, 193, 193, 99, 218, 99, 193, 99, 193, 99, + 193, 217, 170, 99, 99, 99, 99, 99, 193, 691, + 219, 220, 99, 193, 99, 99, 99, 221, 99, 193, + 193, 99, 689, 99, 193, 99, 579, 99, 688, 99, + 580, 99, 99, 223, 99, 99, 193, 222, 589, 683, + 99, 584, 224, 193, 99, 99, 99, 591, 99, 193, + 681, 99, 586, 226, 193, 99, 593, 99, 99, 99, + 99, 99, 99, 595, 99, 193, 227, 99, 193, 99, + + 193, 99, 99, 99, 193, 99, 597, 596, 610, 99, + 99, 99, 99, 99, 99, 99, 99, 228, 99, 193, + 230, 99, 193, 708, 612, 99, 99, 99, 621, 99, + 563, 563, 563, 563, 99, 231, 99, 618, 99, 99, + 99, 193, 233, 619, 598, 232, 234, 611, 193, 99, + 193, 99, 622, 99, 236, 99, 678, 193, 99, 193, + 193, 99, 624, 193, 193, 237, 193, 99, 636, 99, + 616, 99, 99, 99, 99, 99, 238, 193, 99, 239, + 99, 626, 99, 243, 99, 193, 99, 193, 99, 99, + 99, 99, 99, 193, 241, 99, 240, 99, 680, 99, + + 193, 242, 673, 99, 672, 99, 99, 99, 99, 99, + 627, 244, 99, 625, 99, 628, 99, 635, 99, 645, + 99, 643, 99, 99, 99, 99, 99, 656, 637, 99, + 667, 245, 666, 99, 664, 99, 248, 246, 642, 99, + 640, 99, 99, 99, 99, 99, 249, 193, 99, 250, + 563, 563, 563, 563, 99, 99, 99, 99, 99, 99, + 649, 256, 254, 99, 99, 160, 160, 160, 160, 160, + 160, 160, 160, 257, 193, 193, 193, 160, 160, 160, + 160, 160, 160, 160, 160, 183, 183, 183, 183, 183, + 183, 183, 183, 98, 99, 99, 661, 270, 648, 653, + + 652, 193, 193, 193, 99, 99, 99, 99, 99, 99, + 99, 99, 193, 99, 99, 599, 599, 599, 599, 193, + 99, 271, 99, 99, 99, 99, 651, 193, 647, 99, + 99, 655, 650, 193, 193, 193, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 99, 665, + 193, 669, 692, 646, 193, 644, 99, 657, 99, 99, + 99, 272, 99, 273, 662, 193, 99, 99, 99, 99, + 99, 99, 99, 99, 660, 99, 193, 690, 99, 668, + 99, 641, 99, 600, 99, 633, 99, 193, 99, 274, + + 275, 99, 99, 193, 99, 193, 99, 193, 99, 99, + 99, 663, 99, 277, 276, 670, 99, 99, 99, 99, + 99, 599, 599, 599, 599, 99, 676, 99, 629, 99, + 99, 99, 623, 99, 193, 675, 278, 99, 99, 99, + 99, 279, 99, 193, 99, 620, 99, 280, 281, 99, + 282, 99, 99, 700, 682, 284, 677, 193, 283, 193, + 671, 99, 99, 99, 99, 99, 99, 99, 617, 193, + 99, 99, 193, 99, 193, 193, 193, 99, 193, 99, + 285, 99, 193, 99, 99, 99, 99, 99, 592, 686, + 99, 193, 99, 287, 99, 286, 99, 193, 99, 600, + + 99, 99, 99, 99, 99, 588, 679, 99, 684, 99, + 290, 288, 585, 99, 289, 99, 699, 99, 99, 99, + 99, 99, 193, 685, 687, 556, 99, 193, 99, 99, + 99, 693, 99, 695, 551, 291, 547, 99, 521, 99, + 292, 99, 99, 99, 512, 193, 696, 505, 99, 706, + 99, 339, 99, 99, 99, 178, 99, 176, 174, 295, + 99, 99, 296, 297, 99, 99, 298, 99, 99, 99, + 170, 99, 99, 339, 99, 156, 701, 301, 299, 708, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 300, + 99, 302, 193, 99, 703, 266, 99, 178, 176, 99, + + 262, 170, 99, 259, 258, 156, 99, 193, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 185, + 99, 303, 184, 306, 182, 181, 178, 304, 176, 99, + 99, 99, 99, 175, 99, 99, 99, 174, 307, 99, + 174, 99, 168, 166, 95, 99, 164, 99, 308, 99, + 163, 99, 99, 99, 99, 99, 162, 156, 97, 94, + 99, 85, 99, 99, 99, 82, 99, 82, 708, 99, + 310, 99, 708, 99, 708, 99, 708, 99, 708, 99, + 99, 99, 99, 99, 708, 708, 311, 708, 99, 708, + 99, 99, 99, 708, 99, 708, 708, 312, 708, 99, + + 708, 99, 99, 99, 708, 99, 708, 316, 99, 708, + 99, 313, 315, 708, 99, 708, 99, 708, 99, 99, + 99, 99, 99, 708, 708, 99, 708, 99, 708, 99, + 708, 99, 708, 99, 708, 99, 708, 99, 317, 99, + 99, 99, 708, 318, 99, 708, 708, 708, 319, 708, + 99, 99, 99, 99, 99, 99, 99, 708, 708, 99, + 99, 708, 708, 708, 708, 708, 99, 99, 99, 708, + 99, 708, 708, 99, 320, 99, 708, 99, 708, 99, + 708, 99, 708, 99, 321, 99, 99, 99, 99, 708, + 322, 323, 99, 708, 99, 708, 708, 324, 99, 708, + + 99, 708, 99, 708, 99, 99, 99, 99, 99, 708, + 708, 708, 708, 99, 708, 99, 99, 99, 326, 99, + 327, 708, 330, 708, 99, 328, 99, 708, 99, 99, + 99, 708, 99, 708, 329, 99, 708, 708, 334, 99, + 99, 99, 99, 99, 99, 708, 99, 708, 99, 708, + 99, 99, 341, 99, 99, 708, 708, 708, 708, 99, + 342, 708, 708, 99, 99, 99, 708, 99, 708, 708, + 99, 708, 99, 708, 99, 343, 99, 708, 99, 708, + 99, 99, 344, 99, 99, 708, 708, 99, 708, 99, + 346, 99, 708, 99, 708, 99, 708, 99, 708, 99, + + 99, 99, 347, 99, 99, 348, 99, 708, 708, 708, + 708, 708, 708, 99, 99, 99, 99, 99, 99, 99, + 708, 708, 99, 99, 708, 345, 708, 99, 708, 99, + 708, 99, 708, 99, 708, 99, 349, 99, 99, 99, + 350, 99, 708, 708, 708, 99, 99, 99, 99, 99, + 352, 99, 708, 351, 99, 708, 708, 708, 99, 99, + 99, 99, 99, 99, 708, 99, 708, 353, 708, 99, + 99, 354, 99, 99, 355, 99, 708, 356, 99, 708, + 708, 708, 99, 708, 99, 99, 99, 99, 708, 99, + 99, 99, 708, 357, 99, 708, 99, 708, 708, 708, + + 99, 708, 99, 708, 99, 708, 99, 99, 99, 99, + 358, 708, 708, 99, 359, 99, 708, 99, 708, 99, + 708, 99, 708, 99, 99, 99, 99, 99, 708, 360, + 708, 708, 99, 708, 99, 708, 361, 708, 99, 99, + 362, 708, 363, 99, 708, 99, 708, 708, 708, 99, + 708, 99, 708, 99, 708, 99, 99, 99, 99, 99, + 708, 708, 99, 708, 99, 708, 99, 708, 99, 708, + 99, 708, 99, 708, 99, 99, 99, 99, 99, 708, + 367, 99, 708, 708, 368, 708, 708, 99, 99, 99, + 99, 99, 99, 99, 369, 708, 99, 99, 371, 99, + + 366, 708, 708, 99, 708, 99, 708, 99, 708, 99, + 708, 99, 370, 99, 99, 372, 708, 375, 99, 373, + 708, 708, 708, 708, 99, 708, 99, 99, 99, 708, + 374, 708, 708, 99, 708, 99, 708, 99, 708, 99, + 708, 99, 708, 99, 708, 99, 99, 99, 708, 99, + 708, 708, 376, 99, 99, 99, 708, 99, 99, 378, + 708, 99, 99, 708, 708, 708, 708, 708, 99, 708, + 99, 99, 99, 99, 99, 99, 708, 99, 708, 379, + 99, 383, 99, 708, 99, 382, 99, 380, 99, 708, + 708, 708, 99, 99, 99, 708, 99, 99, 708, 708, + + 99, 99, 708, 384, 708, 708, 708, 99, 708, 99, + 99, 99, 99, 708, 99, 99, 99, 385, 99, 99, + 708, 99, 708, 708, 708, 99, 708, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 708, 99, 99, 387, + 99, 388, 708, 708, 99, 708, 708, 708, 99, 708, + 99, 708, 99, 708, 99, 99, 99, 99, 99, 708, + 390, 99, 708, 99, 708, 99, 708, 389, 708, 99, + 708, 99, 99, 99, 99, 99, 708, 708, 99, 392, + 99, 708, 99, 708, 99, 708, 99, 708, 99, 99, + 99, 99, 99, 708, 708, 99, 708, 99, 708, 99, + + 708, 99, 708, 99, 708, 99, 708, 99, 99, 99, + 99, 99, 708, 708, 99, 708, 391, 708, 708, 708, + 99, 99, 394, 99, 99, 99, 708, 99, 99, 99, + 395, 396, 708, 708, 708, 708, 708, 99, 99, 99, + 99, 99, 99, 708, 99, 99, 99, 99, 708, 708, + 708, 708, 708, 708, 99, 99, 99, 99, 99, 99, + 708, 398, 397, 99, 99, 403, 708, 99, 708, 338, + 338, 338, 338, 338, 338, 338, 338, 99, 708, 99, + 708, 99, 99, 407, 708, 406, 99, 408, 99, 708, + 708, 708, 99, 708, 99, 708, 99, 708, 99, 99, + + 99, 99, 99, 708, 410, 99, 708, 99, 708, 99, + 708, 99, 708, 99, 708, 99, 708, 99, 99, 99, + 99, 411, 708, 99, 99, 708, 412, 708, 708, 708, + 99, 99, 99, 99, 99, 99, 708, 99, 708, 99, + 708, 99, 99, 99, 99, 99, 708, 708, 708, 708, + 99, 708, 99, 708, 99, 708, 413, 708, 99, 708, + 99, 708, 99, 99, 99, 708, 99, 415, 414, 708, + 99, 99, 99, 99, 99, 708, 708, 708, 708, 99, + 708, 99, 708, 416, 417, 99, 708, 99, 418, 708, + 708, 99, 99, 99, 99, 99, 419, 708, 708, 708, + + 99, 708, 99, 708, 99, 420, 99, 708, 99, 421, + 99, 708, 99, 99, 99, 708, 99, 708, 99, 708, + 99, 99, 99, 708, 99, 708, 422, 708, 99, 99, + 99, 708, 99, 99, 424, 708, 423, 99, 708, 99, + 708, 708, 708, 99, 708, 99, 708, 99, 708, 99, + 99, 99, 99, 99, 708, 708, 99, 425, 99, 708, + 99, 708, 99, 708, 99, 708, 99, 426, 427, 99, + 99, 99, 99, 708, 708, 99, 708, 708, 708, 431, + 708, 99, 99, 99, 99, 99, 99, 708, 708, 99, + 99, 99, 99, 432, 708, 433, 708, 708, 708, 99, + + 708, 99, 99, 99, 99, 708, 99, 434, 99, 99, + 99, 99, 435, 708, 708, 708, 708, 708, 708, 99, + 99, 436, 99, 99, 99, 99, 708, 708, 99, 99, + 708, 99, 708, 708, 438, 99, 708, 99, 708, 99, + 440, 99, 99, 99, 437, 99, 708, 441, 99, 708, + 99, 708, 99, 708, 99, 708, 99, 708, 99, 439, + 99, 99, 99, 99, 708, 708, 99, 99, 708, 99, + 708, 708, 708, 99, 708, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 443, 99, 99, 99, 99, 708, + 708, 708, 708, 708, 708, 708, 99, 99, 444, 99, + + 99, 99, 99, 446, 708, 99, 99, 708, 99, 708, + 708, 708, 99, 708, 448, 708, 99, 708, 99, 708, + 99, 99, 99, 99, 99, 708, 449, 99, 708, 708, + 451, 708, 708, 99, 99, 99, 452, 99, 99, 99, + 99, 708, 99, 99, 453, 708, 708, 708, 708, 99, + 99, 99, 99, 99, 99, 99, 708, 708, 99, 99, + 708, 99, 454, 708, 458, 99, 708, 99, 708, 99, + 708, 99, 99, 99, 99, 99, 708, 708, 708, 708, + 99, 708, 99, 99, 99, 708, 99, 708, 459, 99, + 708, 99, 708, 99, 708, 99, 708, 99, 708, 99, + + 708, 99, 99, 99, 468, 99, 708, 708, 99, 708, + 708, 99, 708, 708, 708, 99, 708, 99, 708, 99, + 708, 99, 99, 99, 99, 99, 708, 461, 99, 469, + 99, 708, 99, 708, 471, 708, 99, 708, 99, 99, + 99, 99, 99, 708, 708, 99, 472, 99, 473, 99, + 708, 99, 708, 99, 708, 99, 708, 99, 99, 99, + 474, 99, 99, 708, 99, 708, 708, 708, 708, 708, + 708, 99, 99, 99, 475, 99, 99, 99, 708, 708, + 99, 99, 708, 708, 708, 708, 708, 99, 99, 99, + 477, 99, 708, 708, 99, 476, 99, 708, 99, 708, + + 99, 708, 99, 708, 99, 708, 99, 99, 99, 708, + 708, 99, 478, 99, 479, 708, 708, 99, 708, 480, + 708, 99, 708, 99, 708, 99, 708, 99, 99, 99, + 99, 99, 708, 482, 99, 708, 99, 708, 99, 708, + 481, 708, 99, 708, 99, 99, 99, 99, 99, 708, + 708, 99, 708, 99, 708, 99, 708, 99, 483, 99, + 708, 99, 99, 99, 99, 99, 708, 708, 99, 708, + 99, 708, 99, 708, 99, 485, 99, 708, 99, 484, + 99, 99, 99, 486, 99, 99, 708, 99, 708, 490, + 708, 708, 708, 708, 99, 99, 99, 99, 99, 99, + + 99, 708, 708, 99, 99, 708, 99, 491, 492, 708, + 99, 708, 99, 708, 99, 708, 99, 99, 99, 99, + 99, 708, 708, 99, 708, 99, 494, 99, 708, 99, + 708, 99, 708, 99, 493, 99, 99, 99, 99, 495, + 708, 708, 99, 708, 99, 496, 708, 708, 99, 708, + 99, 708, 99, 708, 99, 99, 99, 99, 99, 708, + 708, 708, 708, 99, 708, 99, 708, 99, 708, 99, + 99, 497, 708, 498, 99, 708, 99, 708, 708, 708, + 99, 708, 99, 708, 99, 708, 99, 99, 99, 99, + 99, 708, 708, 499, 708, 99, 708, 99, 708, 99, + + 99, 99, 502, 99, 708, 708, 99, 708, 708, 708, + 99, 99, 504, 99, 99, 99, 708, 99, 708, 99, + 708, 99, 99, 99, 99, 99, 708, 507, 708, 506, + 99, 708, 99, 708, 99, 708, 99, 708, 99, 708, + 708, 708, 99, 99, 99, 708, 99, 99, 510, 708, + 99, 99, 509, 99, 708, 708, 708, 99, 708, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 708, 99, 99, 708, 708, 708, 708, 708, 99, 708, + 99, 99, 99, 99, 708, 99, 708, 99, 514, 520, + 99, 99, 708, 466, 466, 466, 466, 466, 466, 466, + + 466, 99, 708, 99, 99, 99, 708, 99, 708, 522, + 99, 523, 708, 708, 99, 708, 99, 99, 99, 99, + 708, 99, 99, 99, 708, 525, 99, 708, 99, 708, + 708, 708, 99, 708, 99, 708, 99, 708, 99, 99, + 526, 99, 99, 708, 708, 99, 527, 99, 708, 99, + 708, 99, 528, 99, 708, 99, 99, 99, 99, 99, + 708, 708, 99, 708, 99, 708, 99, 708, 99, 708, + 99, 708, 99, 99, 99, 99, 99, 708, 708, 708, + 529, 99, 708, 99, 99, 99, 530, 99, 708, 708, + 99, 708, 99, 708, 99, 708, 99, 708, 99, 708, + + 99, 99, 99, 99, 99, 708, 531, 99, 708, 99, + 708, 99, 708, 99, 708, 99, 708, 99, 99, 99, + 99, 99, 708, 708, 708, 532, 99, 708, 99, 99, + 99, 708, 99, 708, 708, 534, 533, 99, 708, 99, + 708, 99, 708, 99, 708, 99, 99, 99, 99, 99, + 708, 708, 99, 708, 99, 708, 535, 708, 99, 540, + 99, 708, 99, 99, 99, 99, 99, 708, 708, 708, + 708, 99, 708, 99, 99, 99, 708, 99, 708, 708, + 99, 541, 99, 708, 99, 708, 99, 708, 99, 708, + 99, 99, 99, 99, 99, 708, 708, 99, 708, 99, + + 543, 99, 708, 99, 708, 99, 708, 99, 542, 99, + 99, 99, 99, 99, 708, 708, 99, 708, 708, 708, + 708, 708, 99, 99, 99, 99, 99, 99, 99, 545, + 544, 99, 99, 708, 99, 708, 708, 708, 99, 708, + 99, 708, 99, 708, 99, 99, 99, 99, 99, 708, + 708, 99, 708, 99, 708, 549, 708, 99, 708, 99, + 708, 99, 99, 99, 99, 99, 708, 708, 708, 708, + 99, 708, 99, 99, 99, 708, 99, 708, 546, 99, + 708, 99, 553, 99, 708, 99, 708, 99, 708, 99, + 708, 99, 99, 99, 99, 708, 708, 554, 99, 558, + + 99, 708, 708, 708, 99, 708, 99, 708, 99, 708, + 99, 99, 99, 99, 99, 708, 708, 708, 566, 99, + 708, 99, 708, 99, 708, 99, 99, 567, 708, 708, + 99, 708, 99, 708, 708, 708, 99, 708, 99, 708, + 99, 708, 99, 99, 99, 99, 99, 708, 569, 708, + 708, 99, 708, 99, 99, 99, 708, 99, 708, 708, + 99, 570, 99, 708, 99, 708, 571, 708, 99, 708, + 99, 99, 572, 99, 99, 708, 574, 99, 708, 99, + 708, 99, 708, 99, 573, 99, 708, 99, 708, 99, + 99, 99, 99, 708, 708, 99, 99, 708, 575, 708, + + 708, 708, 99, 99, 99, 99, 99, 99, 708, 99, + 708, 99, 708, 99, 99, 99, 99, 99, 708, 99, + 708, 708, 99, 576, 708, 708, 99, 708, 99, 99, + 99, 99, 708, 99, 99, 99, 708, 581, 99, 708, + 99, 708, 708, 708, 99, 708, 99, 708, 99, 708, + 99, 99, 99, 99, 99, 708, 708, 99, 708, 99, + 708, 99, 708, 99, 708, 99, 708, 99, 99, 99, + 99, 99, 708, 708, 99, 582, 99, 708, 99, 708, + 99, 708, 99, 708, 99, 99, 99, 99, 99, 590, + 708, 708, 583, 99, 708, 99, 708, 99, 708, 99, + + 708, 708, 99, 708, 99, 99, 708, 708, 99, 708, + 708, 708, 99, 708, 99, 99, 99, 99, 594, 99, + 99, 99, 99, 99, 99, 708, 708, 99, 708, 99, + 708, 708, 708, 99, 708, 99, 602, 99, 708, 99, + 99, 99, 99, 99, 708, 708, 99, 708, 99, 708, + 99, 708, 99, 708, 99, 708, 99, 708, 99, 99, + 99, 99, 99, 603, 604, 99, 708, 605, 708, 708, + 708, 99, 99, 99, 99, 99, 99, 99, 708, 708, + 99, 99, 708, 99, 708, 608, 708, 99, 708, 606, + 708, 99, 708, 99, 99, 99, 99, 99, 708, 708, + + 99, 708, 99, 708, 609, 708, 99, 708, 99, 708, + 99, 99, 99, 99, 99, 708, 613, 708, 708, 99, + 708, 99, 99, 99, 614, 99, 708, 708, 99, 615, + 99, 708, 99, 708, 99, 708, 99, 708, 99, 99, + 99, 99, 99, 708, 708, 99, 708, 99, 708, 99, + 708, 630, 708, 99, 708, 99, 708, 99, 99, 99, + 99, 99, 631, 708, 99, 708, 708, 708, 708, 708, + 99, 99, 99, 99, 99, 99, 99, 99, 708, 99, + 99, 708, 708, 708, 708, 708, 99, 99, 99, 99, + 99, 99, 99, 632, 708, 99, 99, 708, 99, 634, + + 708, 708, 99, 708, 99, 708, 99, 708, 99, 99, + 99, 99, 99, 708, 708, 708, 708, 99, 708, 99, + 99, 638, 708, 99, 708, 708, 99, 708, 99, 708, + 99, 708, 99, 639, 99, 708, 99, 99, 99, 99, + 99, 708, 708, 99, 708, 99, 708, 99, 708, 99, + 708, 99, 708, 99, 99, 99, 99, 99, 708, 708, + 708, 708, 99, 708, 99, 99, 99, 708, 99, 708, + 708, 99, 654, 99, 708, 99, 708, 99, 708, 99, + 708, 99, 658, 659, 99, 99, 99, 99, 708, 708, + 99, 708, 708, 708, 708, 708, 99, 99, 99, 99, + + 99, 99, 99, 99, 708, 99, 99, 708, 708, 674, + 708, 708, 99, 99, 99, 99, 99, 99, 708, 708, + 708, 99, 99, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 84, 84, 84, 708, 84, + + 84, 84, 84, 84, 84, 84, 84, 91, 91, 708, + 708, 91, 708, 91, 708, 91, 157, 157, 708, 157, + 157, 161, 161, 708, 161, 161, 161, 708, 161, 161, + 161, 161, 161, 165, 165, 165, 708, 165, 165, 165, + 165, 165, 165, 165, 165, 167, 167, 167, 167, 167, + 167, 167, 167, 708, 167, 167, 169, 708, 708, 169, + 169, 169, 169, 169, 169, 169, 169, 170, 708, 708, + 170, 170, 170, 170, 170, 170, 170, 170, 172, 708, + 708, 172, 708, 172, 172, 172, 172, 172, 172, 177, + 177, 708, 177, 177, 179, 179, 708, 179, 179, 186, + + 708, 186, 186, 105, 105, 708, 105, 105, 255, 708, + 255, 255, 263, 708, 263, 263, 264, 708, 264, 264, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 187, 187, 708, 187, 187, 336, 336, 708, + 708, 708, 708, 336, 338, 338, 708, 708, 708, 708, + 338, 466, 466, 708, 708, 708, 708, 466, 564, 564, + 708, 708, 708, 708, 564, 17, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708 } ; -static yyconst short int yy_chk[4624] = +static yyconst short int yy_chk[4247] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -1265,529 +1233,488 @@ static yyconst short int yy_chk[4624] = 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, 1, 1, 1, 1, 1, 1, 1, 3, - 3, 4, 4, 7, 5, 6, 7, 9, 3, 150, - 4, 5, 6, 10, 8, 5, 6, 8, 17, 17, - - 17, 26, 150, 26, 17, 172, 684, 9, 246, 246, - 9, 172, 385, 10, 77, 320, 10, 385, 18, 18, - 18, 13, 13, 13, 18, 320, 13, 14, 14, 14, - 77, 680, 14, 22, 22, 22, 75, 75, 75, 22, - 24, 76, 76, 76, 24, 38, 22, 22, 24, 24, - 24, 24, 24, 24, 24, 38, 677, 38, 501, 38, - 77, 9, 675, 9, 38, 501, 673, 10, 672, 10, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 28, 28, 28, 28, 28, 28, - 28, 28, 11, 11, 11, 11, 13, 85, 13, 670, - - 11, 545, 14, 467, 14, 32, 668, 666, 32, 80, - 80, 80, 32, 665, 662, 32, 32, 32, 32, 32, - 33, 467, 11, 11, 32, 660, 33, 85, 32, 545, - 33, 656, 33, 33, 33, 167, 167, 167, 652, 33, - 382, 382, 382, 651, 650, 649, 11, 11, 11, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 648, 165, 165, 34, 645, 643, 34, - 642, 12, 12, 12, 12, 165, 34, 35, 34, 12, - 34, 637, 636, 635, 632, 34, 631, 35, 35, 35, - 630, 35, 36, 36, 629, 628, 35, 625, 623, 35, - - 622, 12, 12, 36, 37, 36, 620, 36, 617, 36, - 616, 615, 36, 609, 37, 608, 37, 382, 37, 39, - 39, 607, 39, 37, 606, 12, 12, 12, 21, 604, - 39, 39, 39, 601, 39, 37, 599, 39, 598, 39, - 596, 592, 591, 590, 21, 581, 37, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 578, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 31, 577, 576, - - 31, 31, 31, 31, 31, 31, 31, 31, 575, 573, - 569, 567, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 566, 564, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 40, 40, 41, 559, 558, 544, 544, 544, - 40, 557, 542, 40, 41, 40, 41, 40, 41, 541, - 42, 42, 40, 41, 42, 43, 43, 540, 43, 539, - 42, 537, 42, 535, 42, 532, 43, 530, 43, 42, - - 43, 44, 43, 528, 44, 43, 526, 45, 42, 41, - 45, 44, 519, 44, 45, 44, 46, 45, 518, 45, - 44, 45, 517, 46, 46, 45, 45, 47, 43, 516, - 45, 579, 579, 579, 46, 504, 46, 47, 46, 47, - 46, 47, 48, 46, 544, 47, 47, 46, 499, 498, - 49, 497, 48, 496, 48, 46, 48, 49, 493, 491, - 49, 48, 49, 488, 49, 483, 47, 481, 469, 49, - 51, 51, 51, 468, 450, 447, 444, 48, 443, 442, - 441, 440, 437, 51, 51, 51, 51, 51, 51, 51, - 51, 72, 435, 430, 425, 72, 72, 72, 72, 72, - - 72, 72, 72, 72, 72, 87, 87, 87, 579, 422, - 410, 87, 409, 72, 72, 72, 72, 408, 87, 87, - 90, 90, 90, 90, 90, 90, 90, 90, 93, 93, - 93, 93, 93, 93, 93, 93, 95, 96, 389, 381, - 380, 379, 377, 72, 72, 373, 95, 96, 95, 96, - 95, 96, 97, 99, 96, 95, 96, 371, 366, 361, - 357, 346, 97, 99, 97, 99, 97, 99, 72, 73, - 345, 97, 99, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 344, 325, 100, 98, 314, 313, 312, - 306, 73, 73, 73, 73, 100, 98, 100, 98, 100, - - 98, 102, 295, 100, 100, 98, 102, 290, 73, 98, - 286, 102, 275, 102, 103, 102, 274, 104, 248, 247, - 102, 73, 73, 241, 103, 105, 103, 104, 103, 104, - 240, 104, 103, 103, 239, 105, 104, 105, 105, 105, - 106, 235, 107, 107, 105, 223, 73, 217, 213, 202, - 106, 201, 106, 107, 106, 107, 107, 107, 109, 106, - 108, 108, 107, 173, 169, 164, 162, 149, 109, 109, - 109, 108, 109, 108, 110, 108, 146, 109, 110, 136, - 108, 131, 111, 126, 110, 117, 110, 116, 110, 94, - 91, 88, 111, 110, 111, 83, 111, 112, 112, 112, - - 114, 111, 82, 113, 113, 79, 65, 112, 62, 112, - 114, 112, 114, 113, 114, 113, 112, 113, 115, 114, - 118, 113, 113, 59, 58, 317, 317, 317, 115, 118, - 115, 115, 115, 55, 317, 119, 29, 115, 119, 118, - 25, 118, 20, 118, 19, 119, 120, 119, 118, 119, - 16, 15, 121, 121, 119, 0, 120, 0, 120, 0, - 120, 0, 121, 122, 121, 120, 121, 0, 0, 121, - 121, 121, 0, 122, 123, 122, 122, 122, 0, 0, - 124, 0, 122, 0, 123, 0, 123, 0, 123, 0, - 124, 125, 124, 123, 124, 0, 123, 0, 0, 124, - - 0, 125, 317, 125, 127, 125, 0, 128, 0, 0, - 125, 0, 127, 0, 127, 0, 127, 128, 127, 128, - 129, 128, 0, 127, 0, 128, 128, 0, 130, 0, - 129, 132, 129, 0, 129, 0, 0, 0, 130, 129, - 130, 132, 130, 132, 133, 132, 130, 130, 0, 132, - 132, 0, 0, 0, 133, 134, 133, 0, 133, 0, - 0, 0, 0, 133, 133, 134, 0, 134, 135, 134, - 0, 135, 0, 0, 134, 135, 0, 0, 135, 0, - 135, 0, 135, 137, 137, 0, 0, 135, 0, 0, - 138, 0, 0, 0, 137, 0, 137, 0, 137, 0, - - 138, 139, 138, 137, 138, 138, 0, 140, 138, 138, - 0, 139, 142, 139, 0, 139, 0, 140, 141, 140, - 139, 140, 0, 140, 142, 139, 140, 0, 141, 0, - 141, 0, 141, 0, 142, 143, 142, 141, 142, 0, - 143, 144, 0, 142, 0, 143, 0, 143, 0, 143, - 0, 144, 145, 144, 143, 144, 0, 0, 147, 0, - 144, 0, 145, 0, 145, 147, 145, 0, 147, 0, - 147, 145, 147, 151, 148, 148, 0, 147, 148, 0, - 0, 0, 0, 151, 148, 151, 148, 151, 148, 0, - 0, 151, 151, 148, 153, 153, 153, 174, 174, 174, - - 174, 174, 174, 174, 174, 0, 0, 153, 153, 153, - 153, 153, 153, 153, 153, 154, 0, 0, 0, 154, - 154, 154, 154, 154, 154, 154, 154, 155, 0, 0, - 0, 155, 155, 155, 155, 155, 155, 155, 155, 177, - 178, 0, 177, 0, 0, 0, 0, 0, 0, 177, - 178, 177, 178, 177, 178, 179, 180, 0, 177, 178, - 0, 0, 0, 0, 0, 179, 180, 179, 180, 179, - 180, 181, 0, 0, 179, 180, 0, 0, 0, 182, - 0, 181, 183, 181, 181, 181, 182, 0, 0, 182, - 181, 182, 183, 182, 183, 184, 183, 0, 182, 0, - - 0, 183, 0, 185, 0, 184, 0, 184, 0, 184, - 0, 186, 184, 185, 184, 185, 0, 185, 0, 187, - 0, 186, 185, 186, 0, 186, 187, 186, 0, 187, - 186, 187, 188, 187, 0, 0, 0, 0, 187, 0, - 189, 0, 188, 190, 188, 0, 188, 0, 0, 188, - 189, 188, 189, 190, 189, 190, 0, 190, 0, 189, - 190, 190, 190, 191, 191, 192, 0, 0, 192, 0, - 0, 191, 0, 0, 191, 192, 191, 192, 191, 192, - 193, 0, 0, 191, 192, 0, 194, 0, 0, 0, - 193, 0, 193, 193, 193, 0, 194, 195, 194, 193, - - 194, 0, 0, 196, 0, 194, 196, 195, 195, 195, - 0, 195, 0, 196, 197, 196, 195, 196, 0, 0, - 198, 0, 196, 198, 197, 0, 197, 197, 197, 0, - 198, 199, 198, 197, 198, 0, 0, 0, 0, 198, - 0, 199, 200, 199, 0, 199, 0, 0, 199, 0, - 199, 0, 200, 200, 200, 203, 200, 0, 0, 0, - 0, 200, 0, 204, 0, 203, 205, 203, 0, 203, - 0, 0, 203, 204, 203, 204, 205, 204, 205, 205, - 205, 206, 204, 0, 207, 205, 0, 208, 0, 0, - 208, 206, 0, 206, 207, 206, 207, 208, 207, 208, - - 206, 208, 207, 207, 209, 0, 208, 0, 0, 210, - 0, 0, 209, 0, 0, 211, 0, 0, 0, 210, - 0, 210, 209, 210, 209, 211, 209, 211, 210, 211, - 212, 209, 0, 214, 211, 0, 214, 0, 0, 0, - 212, 0, 212, 214, 212, 214, 0, 214, 215, 212, - 0, 215, 214, 0, 216, 0, 0, 0, 215, 0, - 215, 216, 215, 0, 216, 218, 216, 215, 216, 0, - 0, 0, 0, 216, 0, 218, 219, 218, 0, 218, - 0, 0, 220, 218, 218, 0, 219, 0, 219, 0, - 219, 0, 220, 221, 220, 219, 220, 0, 0, 220, - - 0, 220, 0, 221, 222, 221, 0, 221, 0, 0, - 221, 0, 221, 0, 222, 224, 222, 0, 222, 0, - 225, 225, 0, 222, 222, 224, 0, 224, 0, 224, - 0, 225, 226, 225, 224, 225, 0, 0, 227, 0, - 225, 0, 226, 0, 226, 0, 226, 0, 227, 0, - 227, 226, 227, 228, 229, 0, 228, 227, 0, 0, - 0, 229, 0, 228, 229, 228, 229, 228, 229, 230, - 0, 0, 228, 229, 0, 0, 0, 0, 0, 230, - 231, 230, 0, 230, 0, 0, 232, 230, 230, 0, - 231, 0, 231, 0, 231, 0, 232, 231, 232, 231, - - 232, 233, 0, 232, 233, 232, 0, 234, 0, 0, - 234, 233, 0, 233, 0, 233, 0, 234, 236, 234, - 233, 234, 0, 0, 0, 0, 234, 0, 236, 237, - 236, 236, 236, 236, 0, 238, 0, 236, 236, 237, - 0, 237, 238, 237, 0, 242, 0, 237, 237, 0, - 0, 242, 238, 0, 238, 242, 238, 242, 251, 242, - 0, 238, 0, 0, 242, 243, 243, 243, 251, 0, - 251, 0, 251, 244, 244, 244, 0, 251, 243, 243, - 243, 243, 243, 243, 243, 243, 244, 244, 244, 244, - 244, 244, 244, 244, 252, 0, 0, 0, 0, 0, - - 253, 252, 0, 0, 252, 0, 252, 0, 252, 0, - 253, 253, 253, 252, 253, 254, 255, 0, 0, 253, - 0, 0, 0, 0, 0, 254, 255, 254, 255, 254, - 255, 257, 257, 256, 254, 255, 256, 0, 0, 0, - 0, 0, 257, 256, 257, 256, 257, 256, 0, 258, - 258, 257, 256, 0, 0, 259, 0, 0, 0, 258, - 255, 258, 0, 258, 0, 259, 260, 259, 258, 259, - 0, 0, 259, 0, 259, 0, 260, 261, 260, 260, - 260, 0, 0, 0, 0, 260, 0, 261, 0, 261, - 263, 261, 262, 262, 0, 261, 261, 0, 0, 0, - - 263, 264, 263, 262, 263, 262, 0, 262, 0, 263, - 0, 264, 262, 264, 265, 264, 265, 266, 0, 266, - 264, 0, 0, 0, 265, 0, 265, 266, 265, 266, - 0, 266, 267, 265, 0, 267, 266, 0, 268, 0, - 0, 0, 267, 0, 267, 0, 267, 0, 268, 269, - 268, 267, 268, 0, 0, 270, 269, 268, 0, 269, - 0, 269, 0, 269, 0, 270, 271, 270, 269, 270, - 0, 270, 0, 0, 270, 0, 271, 0, 271, 0, - 271, 272, 271, 0, 272, 271, 0, 273, 0, 0, - 0, 272, 0, 272, 0, 272, 0, 273, 276, 273, - - 272, 273, 0, 0, 277, 0, 273, 0, 276, 0, - 276, 0, 276, 0, 277, 0, 277, 276, 277, 278, - 279, 0, 277, 277, 0, 0, 278, 0, 0, 278, - 279, 278, 279, 278, 279, 280, 279, 0, 278, 279, - 281, 281, 276, 0, 0, 280, 0, 280, 0, 280, - 0, 281, 0, 281, 280, 281, 282, 281, 0, 283, - 281, 282, 0, 0, 0, 0, 282, 0, 282, 283, - 282, 0, 282, 0, 0, 282, 0, 284, 0, 283, - 0, 283, 0, 283, 0, 285, 0, 284, 283, 284, - 0, 284, 0, 0, 284, 285, 284, 285, 0, 285, - - 287, 287, 0, 288, 285, 0, 0, 0, 0, 0, - 287, 0, 287, 288, 287, 288, 289, 288, 0, 287, - 0, 288, 288, 292, 291, 0, 289, 291, 289, 289, - 289, 0, 0, 0, 291, 289, 291, 0, 291, 292, - 0, 0, 293, 291, 0, 293, 0, 0, 0, 292, - 0, 292, 293, 292, 293, 0, 293, 296, 292, 294, - 294, 293, 0, 297, 0, 0, 0, 296, 0, 296, - 294, 296, 294, 297, 294, 297, 296, 297, 0, 294, - 298, 297, 297, 298, 0, 0, 299, 0, 0, 0, - 298, 0, 298, 0, 298, 0, 299, 300, 299, 298, - - 299, 0, 301, 301, 0, 299, 0, 300, 0, 300, - 0, 300, 0, 301, 302, 301, 300, 301, 0, 0, - 303, 305, 301, 0, 302, 0, 302, 0, 302, 0, - 303, 304, 303, 302, 303, 0, 0, 305, 0, 303, - 0, 304, 0, 304, 0, 304, 0, 305, 0, 305, - 304, 305, 307, 308, 0, 0, 305, 0, 302, 0, - 0, 0, 307, 308, 307, 308, 307, 308, 0, 310, - 309, 307, 308, 309, 0, 0, 0, 0, 0, 310, - 309, 310, 309, 310, 309, 0, 311, 315, 310, 309, - 0, 0, 0, 0, 0, 0, 311, 315, 311, 315, - - 311, 315, 0, 311, 310, 311, 315, 316, 316, 316, - 0, 0, 0, 0, 0, 318, 318, 318, 0, 0, - 316, 316, 316, 316, 316, 316, 316, 316, 318, 318, - 318, 318, 318, 318, 318, 318, 319, 0, 321, 0, - 319, 319, 319, 319, 319, 319, 319, 319, 321, 0, - 321, 0, 321, 322, 322, 0, 321, 321, 323, 323, - 0, 0, 0, 322, 0, 322, 0, 322, 0, 323, - 324, 323, 322, 323, 0, 326, 326, 0, 323, 0, - 324, 0, 324, 0, 324, 0, 326, 0, 326, 324, - 326, 327, 327, 0, 328, 326, 0, 328, 0, 0, - - 0, 327, 329, 327, 328, 327, 328, 0, 328, 0, - 327, 0, 329, 328, 329, 330, 329, 0, 0, 0, - 0, 329, 0, 331, 0, 330, 0, 330, 0, 330, - 0, 332, 0, 331, 330, 331, 0, 331, 332, 331, - 0, 332, 331, 332, 333, 332, 0, 0, 0, 0, - 332, 0, 334, 0, 333, 334, 333, 0, 333, 334, - 0, 0, 334, 333, 334, 335, 334, 335, 0, 0, - 0, 334, 0, 336, 0, 335, 336, 335, 0, 335, - 336, 337, 0, 336, 335, 336, 0, 336, 0, 338, - 0, 337, 336, 337, 0, 337, 0, 337, 0, 338, - - 337, 338, 0, 338, 339, 339, 0, 338, 338, 0, - 340, 0, 0, 0, 339, 0, 339, 0, 339, 0, - 340, 341, 340, 339, 340, 0, 0, 342, 340, 340, - 0, 341, 0, 341, 0, 341, 0, 342, 341, 342, - 341, 342, 343, 347, 0, 0, 342, 0, 0, 0, - 347, 0, 343, 347, 343, 347, 343, 347, 0, 0, - 349, 343, 347, 348, 348, 0, 348, 0, 0, 0, - 349, 0, 349, 348, 349, 348, 0, 348, 349, 349, - 351, 350, 348, 350, 0, 0, 0, 0, 0, 0, - 351, 350, 351, 350, 351, 350, 352, 0, 0, 351, - - 350, 0, 353, 0, 0, 353, 352, 0, 352, 0, - 352, 355, 353, 354, 353, 352, 353, 0, 356, 355, - 0, 353, 0, 354, 0, 354, 0, 354, 0, 355, - 354, 355, 354, 355, 356, 0, 0, 358, 355, 0, - 359, 0, 0, 0, 356, 0, 356, 358, 356, 358, - 359, 358, 359, 356, 359, 358, 358, 360, 362, 359, - 0, 0, 0, 0, 0, 0, 0, 360, 362, 360, - 362, 360, 362, 363, 362, 0, 360, 362, 0, 364, - 363, 0, 0, 363, 0, 363, 0, 363, 0, 364, - 365, 364, 363, 364, 0, 0, 0, 0, 364, 0, - - 365, 0, 365, 367, 365, 0, 368, 0, 365, 365, - 367, 0, 0, 367, 369, 367, 368, 367, 368, 369, - 368, 0, 367, 0, 369, 368, 369, 370, 369, 0, - 0, 0, 0, 369, 0, 0, 0, 370, 372, 370, - 0, 370, 0, 0, 374, 372, 370, 0, 372, 370, - 372, 0, 372, 0, 374, 0, 374, 372, 374, 375, - 376, 0, 375, 374, 0, 0, 0, 0, 0, 375, - 376, 375, 376, 375, 376, 378, 376, 0, 375, 376, - 0, 0, 383, 383, 383, 378, 0, 378, 0, 378, - 0, 0, 0, 386, 378, 383, 383, 383, 383, 383, - - 383, 383, 383, 386, 0, 386, 0, 386, 0, 387, - 387, 0, 386, 388, 0, 0, 390, 0, 0, 378, - 387, 0, 387, 388, 387, 388, 390, 388, 390, 387, - 390, 388, 388, 391, 392, 390, 0, 0, 0, 0, - 0, 0, 0, 391, 392, 391, 392, 391, 392, 0, - 0, 391, 391, 392, 393, 0, 0, 393, 0, 394, - 394, 0, 0, 0, 393, 0, 393, 0, 393, 0, - 394, 395, 394, 393, 394, 0, 0, 396, 0, 394, - 0, 395, 0, 395, 0, 395, 0, 396, 0, 396, - 395, 396, 397, 0, 397, 396, 396, 0, 398, 0, - - 0, 0, 397, 0, 397, 0, 397, 0, 398, 0, - 398, 397, 398, 0, 0, 399, 398, 398, 399, 0, - 0, 400, 0, 400, 0, 399, 0, 399, 0, 399, - 0, 400, 401, 400, 399, 400, 0, 402, 402, 0, - 400, 0, 401, 0, 401, 0, 401, 0, 402, 403, - 402, 401, 402, 0, 0, 404, 0, 402, 0, 403, - 0, 403, 404, 403, 0, 404, 405, 404, 403, 404, - 0, 0, 406, 0, 404, 0, 405, 0, 405, 406, - 405, 0, 406, 405, 406, 405, 406, 407, 407, 411, - 0, 406, 0, 411, 0, 0, 0, 0, 407, 411, - - 407, 411, 407, 411, 412, 0, 0, 407, 411, 0, - 413, 412, 413, 0, 412, 0, 412, 0, 412, 0, - 413, 414, 413, 412, 413, 0, 0, 415, 0, 413, - 415, 414, 0, 414, 0, 414, 0, 415, 414, 415, - 414, 415, 416, 416, 0, 0, 415, 0, 417, 417, - 0, 0, 416, 0, 416, 0, 416, 0, 417, 418, - 417, 416, 417, 0, 0, 0, 0, 417, 0, 418, - 0, 418, 0, 418, 419, 418, 0, 419, 418, 0, - 420, 0, 0, 0, 419, 0, 419, 0, 419, 0, - 420, 421, 420, 419, 420, 0, 0, 420, 421, 420, - - 0, 421, 423, 421, 0, 421, 0, 424, 424, 0, - 421, 0, 423, 0, 423, 0, 423, 0, 424, 426, - 424, 423, 424, 0, 0, 427, 0, 424, 0, 426, - 0, 426, 0, 426, 0, 427, 428, 427, 426, 427, - 0, 0, 0, 0, 427, 0, 428, 0, 428, 429, - 428, 0, 429, 0, 428, 428, 0, 431, 0, 429, - 0, 429, 0, 429, 0, 0, 0, 431, 429, 431, - 0, 431, 432, 432, 0, 433, 431, 431, 434, 0, - 0, 0, 432, 0, 432, 433, 432, 433, 434, 433, - 434, 432, 434, 436, 433, 436, 438, 434, 0, 439, - - 0, 0, 0, 436, 0, 436, 438, 436, 438, 439, - 438, 439, 436, 439, 0, 438, 439, 0, 439, 445, - 445, 445, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 445, 445, 445, 445, 445, 445, 445, 445, - 446, 0, 448, 0, 446, 446, 446, 446, 446, 446, - 446, 446, 448, 0, 448, 449, 448, 0, 451, 0, - 448, 448, 449, 0, 0, 449, 0, 449, 451, 449, - 451, 0, 451, 452, 449, 0, 452, 451, 0, 453, - 0, 0, 0, 452, 0, 452, 0, 452, 0, 453, - 454, 453, 452, 453, 0, 0, 455, 454, 453, 0, - - 454, 0, 454, 455, 454, 0, 455, 456, 455, 454, - 455, 0, 0, 457, 0, 455, 0, 456, 0, 456, - 0, 456, 0, 457, 458, 457, 456, 457, 0, 0, - 0, 458, 457, 0, 458, 459, 458, 459, 458, 0, - 0, 460, 0, 458, 0, 459, 0, 459, 0, 459, - 0, 460, 461, 460, 459, 460, 0, 461, 462, 0, - 460, 0, 461, 0, 461, 0, 461, 0, 462, 463, - 462, 461, 462, 0, 0, 0, 462, 462, 0, 463, - 464, 463, 0, 463, 0, 0, 465, 463, 463, 0, - 464, 0, 464, 0, 464, 0, 465, 466, 465, 464, - - 465, 0, 0, 470, 0, 465, 0, 466, 0, 466, - 470, 466, 0, 470, 471, 470, 466, 470, 0, 0, - 0, 0, 470, 0, 471, 472, 471, 0, 471, 0, - 0, 473, 471, 471, 0, 472, 0, 472, 0, 472, - 0, 473, 474, 473, 472, 473, 0, 0, 475, 0, - 473, 475, 474, 0, 474, 0, 474, 0, 475, 474, - 475, 474, 475, 476, 477, 0, 0, 475, 0, 0, - 0, 0, 0, 476, 477, 476, 477, 476, 477, 478, - 478, 476, 476, 477, 0, 479, 0, 0, 0, 478, - 0, 478, 0, 478, 0, 479, 480, 479, 478, 479, - - 0, 0, 482, 0, 479, 0, 480, 0, 480, 0, - 480, 0, 482, 484, 482, 480, 482, 0, 0, 0, - 0, 482, 0, 484, 485, 484, 0, 484, 485, 479, - 486, 0, 484, 0, 485, 0, 485, 0, 485, 0, - 486, 487, 486, 485, 486, 0, 0, 489, 0, 486, - 489, 487, 0, 487, 0, 487, 0, 489, 0, 489, - 487, 489, 490, 0, 0, 490, 489, 0, 492, 0, - 0, 492, 490, 0, 490, 0, 490, 0, 492, 0, - 492, 490, 492, 494, 494, 0, 0, 492, 0, 0, - 0, 500, 500, 500, 494, 0, 494, 0, 494, 0, - - 0, 0, 0, 494, 500, 500, 500, 500, 500, 500, - 500, 500, 502, 503, 503, 0, 0, 0, 0, 502, - 0, 0, 502, 503, 502, 503, 502, 503, 505, 0, - 0, 502, 503, 0, 0, 0, 506, 0, 505, 507, - 505, 0, 505, 0, 505, 0, 506, 505, 506, 507, - 506, 507, 508, 507, 506, 506, 0, 0, 507, 0, - 509, 0, 508, 0, 508, 511, 508, 0, 510, 0, - 509, 508, 509, 509, 509, 0, 0, 0, 510, 509, - 510, 511, 510, 0, 0, 0, 0, 510, 0, 512, - 0, 511, 512, 511, 0, 511, 0, 513, 0, 512, - - 511, 512, 0, 512, 0, 514, 0, 513, 512, 513, - 0, 513, 514, 515, 0, 514, 513, 514, 0, 514, - 0, 0, 0, 515, 514, 515, 520, 515, 0, 520, - 0, 0, 515, 0, 521, 0, 520, 522, 520, 0, - 520, 0, 0, 0, 521, 520, 521, 522, 521, 522, - 523, 522, 0, 521, 0, 0, 522, 0, 524, 0, - 523, 525, 523, 0, 523, 524, 0, 0, 524, 523, - 524, 525, 524, 525, 527, 525, 0, 524, 527, 525, - 525, 0, 529, 0, 527, 0, 527, 533, 527, 0, - 531, 0, 529, 527, 529, 0, 529, 531, 0, 0, - - 531, 529, 531, 533, 531, 0, 534, 0, 0, 531, - 0, 0, 0, 533, 536, 533, 534, 533, 534, 0, - 534, 0, 533, 0, 536, 534, 536, 538, 536, 0, - 0, 0, 0, 536, 543, 543, 543, 538, 0, 538, - 0, 538, 0, 0, 0, 546, 538, 543, 543, 543, - 543, 543, 543, 543, 543, 546, 547, 546, 546, 546, - 0, 0, 549, 0, 546, 0, 547, 0, 547, 0, - 547, 0, 549, 550, 549, 547, 549, 0, 0, 551, - 0, 549, 551, 550, 0, 550, 0, 550, 0, 551, - 550, 551, 550, 551, 552, 553, 0, 0, 551, 552, - - 0, 0, 0, 0, 552, 553, 552, 553, 552, 553, - 554, 554, 0, 552, 553, 0, 555, 0, 555, 0, - 554, 0, 554, 0, 554, 0, 555, 556, 555, 554, - 555, 0, 0, 561, 0, 555, 0, 556, 0, 556, - 0, 556, 0, 561, 562, 561, 556, 561, 0, 561, - 0, 0, 561, 0, 562, 563, 562, 562, 562, 0, - 0, 565, 563, 562, 0, 563, 0, 563, 565, 563, - 0, 565, 568, 565, 563, 565, 0, 0, 0, 0, - 565, 0, 568, 570, 568, 0, 568, 0, 0, 572, - 0, 568, 0, 570, 0, 570, 570, 570, 0, 572, - - 574, 572, 570, 572, 0, 0, 582, 572, 572, 0, - 574, 0, 574, 0, 574, 0, 582, 583, 582, 574, - 582, 0, 0, 0, 0, 582, 0, 583, 584, 583, - 584, 583, 0, 0, 585, 0, 583, 0, 584, 0, - 584, 0, 584, 0, 585, 586, 585, 584, 585, 0, - 0, 0, 0, 585, 0, 586, 587, 586, 0, 586, - 0, 0, 586, 0, 586, 0, 587, 588, 587, 587, - 587, 0, 0, 589, 0, 587, 0, 588, 0, 588, - 589, 588, 0, 589, 593, 589, 588, 589, 0, 0, - 594, 0, 589, 0, 593, 0, 593, 0, 593, 0, - - 594, 595, 594, 593, 594, 0, 0, 597, 0, 594, - 0, 595, 0, 595, 595, 595, 0, 597, 600, 597, - 595, 597, 0, 0, 602, 600, 597, 0, 600, 0, - 600, 602, 600, 0, 602, 603, 602, 600, 602, 0, - 0, 610, 603, 602, 0, 603, 0, 603, 0, 603, - 0, 610, 611, 610, 603, 610, 0, 0, 612, 0, - 610, 0, 611, 0, 611, 0, 611, 0, 612, 613, - 612, 611, 612, 0, 0, 614, 0, 612, 0, 613, - 0, 613, 0, 613, 0, 614, 618, 614, 613, 614, - 0, 0, 619, 614, 614, 0, 618, 0, 618, 0, - - 618, 0, 619, 618, 619, 618, 619, 621, 0, 0, - 624, 619, 0, 626, 621, 626, 0, 621, 0, 621, - 624, 621, 624, 626, 624, 626, 621, 626, 624, 624, - 627, 0, 626, 633, 627, 0, 634, 0, 0, 0, - 627, 0, 627, 633, 627, 633, 634, 633, 634, 627, - 634, 633, 633, 638, 639, 634, 0, 0, 0, 634, - 0, 0, 0, 638, 639, 638, 639, 638, 639, 641, - 644, 0, 638, 639, 0, 0, 0, 0, 0, 641, - 644, 641, 644, 641, 644, 646, 0, 641, 641, 644, - 0, 647, 0, 644, 0, 646, 0, 646, 647, 646, - - 0, 647, 653, 647, 646, 647, 0, 0, 0, 0, - 647, 0, 653, 654, 653, 0, 653, 0, 653, 658, - 0, 653, 0, 654, 0, 654, 0, 654, 0, 658, - 0, 658, 654, 658, 661, 0, 0, 663, 658, 0, - 663, 0, 658, 0, 661, 669, 661, 663, 661, 663, - 0, 663, 0, 661, 0, 669, 663, 669, 669, 669, - 671, 674, 0, 0, 669, 0, 0, 0, 0, 0, - 671, 674, 671, 674, 671, 674, 678, 674, 0, 671, - 674, 0, 682, 0, 0, 0, 678, 0, 678, 0, - 678, 0, 682, 685, 682, 678, 682, 0, 0, 0, - - 0, 682, 0, 685, 0, 685, 0, 685, 0, 0, - 0, 0, 685, 689, 689, 689, 689, 689, 689, 689, - 689, 689, 689, 689, 689, 689, 689, 690, 690, 690, - 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, - 690, 691, 691, 691, 691, 691, 691, 691, 691, 691, - 691, 691, 691, 691, 691, 692, 692, 692, 692, 692, - 692, 692, 692, 692, 692, 692, 692, 692, 692, 693, - 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, - 693, 693, 693, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 695, 695, 695, - - 0, 695, 695, 695, 695, 695, 695, 695, 695, 695, - 695, 696, 696, 0, 0, 696, 0, 0, 696, 0, - 696, 697, 697, 0, 697, 697, 698, 698, 0, 698, - 698, 698, 698, 0, 698, 698, 698, 698, 698, 698, - 699, 699, 699, 0, 699, 699, 699, 699, 699, 699, - 699, 699, 699, 699, 700, 700, 700, 700, 700, 700, - 700, 700, 700, 0, 700, 700, 701, 0, 0, 701, - 701, 701, 701, 701, 701, 701, 701, 701, 702, 0, - 0, 702, 702, 702, 702, 702, 702, 702, 702, 702, - 703, 0, 0, 703, 0, 703, 703, 703, 703, 703, - - 703, 703, 704, 704, 0, 704, 704, 705, 705, 0, - 705, 705, 706, 706, 0, 706, 706, 707, 707, 0, - 0, 0, 707, 0, 707, 0, 0, 0, 0, 707, - 708, 708, 0, 0, 0, 0, 0, 708, 0, 0, - 0, 0, 708, 688, 688, 688, 688, 688, 688, 688, - 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, - 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, - 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, - 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, - 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, - - 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, - 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, - 688, 688, 688 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 3, 3, 4, 4, 4, 5, 5, 5, 11, + 3, 9, 7, 4, 8, 9, 5, 6, 6, 6, + + 7, 10, 8, 12, 7, 10, 8, 6, 121, 28, + 11, 28, 150, 11, 78, 78, 78, 78, 364, 180, + 15, 15, 15, 15, 12, 180, 15, 12, 79, 79, + 79, 79, 16, 16, 16, 16, 260, 260, 16, 19, + 19, 19, 19, 182, 706, 182, 19, 20, 20, 20, + 20, 121, 521, 182, 20, 24, 24, 24, 24, 521, + 704, 364, 24, 26, 11, 150, 11, 26, 130, 24, + 24, 26, 26, 26, 26, 26, 26, 26, 12, 88, + 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 15, 120, 15, 83, + + 83, 83, 83, 135, 13, 13, 13, 13, 16, 88, + 16, 40, 13, 30, 30, 30, 30, 30, 30, 30, + 30, 40, 130, 40, 214, 40, 34, 140, 153, 34, + 40, 80, 37, 34, 13, 13, 34, 34, 34, 34, + 34, 213, 37, 37, 37, 34, 37, 80, 703, 34, + 457, 37, 120, 154, 37, 135, 235, 225, 13, 13, + 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 314, 80, 140, 153, + 294, 214, 229, 35, 14, 14, 14, 14, 213, 35, + 247, 36, 14, 35, 36, 35, 35, 35, 252, 154, + + 293, 36, 35, 36, 225, 36, 38, 38, 43, 309, + 36, 235, 154, 457, 14, 14, 386, 38, 43, 38, + 43, 38, 43, 38, 171, 171, 38, 43, 305, 229, + 294, 41, 41, 383, 41, 171, 314, 247, 14, 14, + 14, 23, 41, 41, 41, 252, 41, 405, 701, 41, + 251, 41, 405, 43, 309, 332, 383, 23, 293, 386, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 305, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 33, 332, 251, 33, 33, 33, 33, 33, 33, 33, + 33, 173, 173, 173, 173, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 253, 331, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 39, 256, 256, 256, 256, + 42, 42, 269, 325, 269, 39, 340, 39, 42, 39, + 365, 42, 269, 42, 39, 42, 340, 44, 44, 331, + + 42, 44, 253, 377, 333, 392, 39, 44, 345, 44, + 381, 44, 257, 257, 257, 257, 44, 39, 45, 45, + 46, 45, 401, 46, 428, 44, 393, 460, 392, 45, + 46, 45, 46, 45, 46, 45, 441, 47, 45, 46, + 47, 365, 366, 325, 47, 48, 391, 47, 333, 47, + 429, 47, 48, 48, 377, 47, 47, 442, 463, 441, + 47, 45, 574, 48, 399, 48, 345, 48, 49, 48, + 381, 50, 48, 393, 460, 401, 48, 428, 49, 574, + 49, 50, 49, 50, 48, 50, 49, 49, 699, 51, + 50, 335, 335, 335, 335, 429, 51, 397, 400, 51, + + 366, 51, 442, 51, 391, 463, 50, 49, 51, 53, + 53, 53, 53, 93, 93, 93, 93, 93, 93, 93, + 93, 461, 399, 53, 53, 53, 53, 53, 53, 53, + 53, 75, 337, 337, 337, 337, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 90, 90, 90, 90, + 464, 397, 445, 90, 75, 75, 75, 75, 400, 698, + 90, 90, 96, 96, 96, 96, 96, 96, 96, 96, + 445, 336, 336, 336, 336, 409, 99, 100, 697, 461, + 537, 336, 696, 694, 75, 75, 99, 100, 99, 100, + 99, 100, 101, 103, 100, 99, 100, 464, 402, 402, + + 402, 402, 101, 103, 101, 103, 101, 103, 450, 75, + 76, 101, 103, 462, 430, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 488, 409, 104, 102, 403, + 403, 403, 403, 76, 76, 76, 76, 104, 102, 104, + 102, 104, 102, 106, 537, 104, 104, 102, 106, 336, + 76, 102, 450, 106, 689, 106, 107, 106, 488, 108, + 470, 455, 106, 76, 76, 430, 107, 109, 107, 108, + 107, 108, 462, 108, 107, 107, 402, 109, 108, 109, + 109, 109, 465, 465, 465, 465, 109, 487, 76, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 110, 455, 111, 111, 470, 536, 501, 489, 503, + 487, 110, 511, 110, 111, 110, 111, 111, 111, 113, + 110, 112, 112, 111, 518, 688, 517, 687, 487, 113, + 113, 113, 112, 113, 112, 114, 112, 516, 113, 114, + 501, 112, 508, 115, 684, 114, 550, 114, 524, 114, + 683, 513, 519, 115, 114, 115, 503, 115, 116, 116, + 116, 118, 115, 489, 117, 117, 536, 511, 116, 517, + 116, 118, 116, 118, 117, 118, 117, 116, 117, 119, + 118, 122, 117, 117, 513, 519, 538, 518, 516, 119, + + 122, 119, 119, 119, 565, 508, 123, 524, 119, 123, + 122, 539, 122, 546, 122, 550, 123, 124, 123, 122, + 123, 552, 548, 125, 125, 123, 557, 124, 555, 124, + 679, 124, 565, 125, 126, 125, 124, 125, 559, 678, + 125, 125, 125, 677, 126, 127, 126, 126, 126, 675, + 577, 128, 673, 126, 560, 127, 538, 127, 672, 127, + 539, 128, 129, 128, 127, 128, 579, 127, 552, 667, + 128, 546, 129, 561, 129, 131, 129, 555, 132, 586, + 664, 129, 548, 131, 562, 131, 557, 131, 132, 131, + 132, 133, 132, 559, 131, 589, 132, 132, 587, 134, + + 578, 133, 136, 133, 593, 133, 561, 560, 577, 134, + 133, 134, 136, 134, 136, 137, 136, 134, 134, 584, + 136, 136, 611, 590, 579, 137, 138, 137, 589, 137, + 520, 520, 520, 520, 137, 137, 138, 586, 138, 139, + 138, 663, 139, 587, 562, 138, 139, 578, 596, 139, + 597, 139, 590, 139, 141, 141, 661, 598, 139, 621, + 660, 142, 593, 619, 595, 141, 610, 141, 611, 141, + 584, 142, 143, 142, 141, 142, 142, 612, 144, 142, + 142, 596, 143, 146, 143, 616, 143, 618, 144, 145, + 144, 143, 144, 636, 144, 146, 143, 144, 663, 145, + + 626, 145, 653, 145, 652, 146, 147, 146, 145, 146, + 597, 147, 148, 595, 146, 598, 147, 610, 147, 621, + 147, 619, 148, 149, 148, 147, 148, 636, 612, 151, + 647, 148, 646, 149, 644, 149, 151, 149, 618, 151, + 616, 151, 149, 151, 155, 152, 152, 624, 151, 152, + 563, 563, 563, 563, 155, 152, 155, 152, 155, 152, + 626, 159, 155, 155, 152, 159, 159, 159, 159, 159, + 159, 159, 159, 160, 627, 628, 635, 160, 160, 160, + 160, 160, 160, 160, 160, 183, 183, 183, 183, 183, + 183, 183, 183, 186, 188, 189, 641, 188, 624, 633, + + 629, 645, 680, 649, 188, 189, 188, 189, 188, 189, + 190, 191, 637, 188, 189, 564, 564, 564, 564, 642, + 190, 191, 190, 191, 190, 191, 628, 625, 623, 190, + 191, 635, 627, 676, 648, 640, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, 192, 645, + 643, 649, 680, 622, 650, 620, 194, 637, 192, 195, + 192, 192, 192, 194, 642, 656, 194, 192, 194, 195, + 194, 195, 196, 195, 640, 194, 655, 676, 195, 648, + 197, 617, 196, 564, 196, 607, 196, 692, 198, 196, + + 197, 196, 197, 665, 197, 651, 199, 657, 198, 197, + 198, 643, 198, 199, 198, 650, 199, 198, 199, 200, + 199, 599, 599, 599, 599, 199, 656, 201, 601, 200, + 202, 200, 592, 200, 670, 655, 200, 201, 200, 201, + 202, 201, 202, 591, 202, 588, 201, 202, 202, 202, + 203, 203, 204, 692, 665, 204, 657, 662, 203, 668, + 651, 203, 204, 203, 204, 203, 204, 205, 585, 690, + 203, 204, 669, 206, 580, 671, 682, 205, 685, 205, + 205, 205, 568, 206, 207, 206, 205, 206, 556, 670, + 208, 700, 206, 208, 207, 207, 207, 686, 207, 599, + + 208, 209, 208, 207, 208, 551, 662, 210, 668, 208, + 210, 209, 547, 209, 209, 209, 690, 210, 211, 210, + 209, 210, 515, 669, 671, 512, 210, 693, 211, 212, + 211, 682, 211, 685, 505, 211, 500, 211, 467, 212, + 212, 212, 215, 212, 456, 695, 686, 447, 212, 700, + 216, 339, 215, 217, 215, 264, 215, 263, 262, 215, + 216, 215, 216, 217, 216, 217, 217, 217, 218, 216, + 261, 219, 217, 258, 220, 255, 693, 220, 218, 193, + 218, 219, 218, 219, 220, 219, 220, 218, 220, 219, + 219, 221, 187, 220, 695, 181, 222, 179, 177, 221, + + 175, 170, 223, 168, 163, 157, 222, 105, 222, 221, + 222, 221, 223, 221, 223, 222, 223, 224, 221, 97, + 226, 223, 94, 226, 92, 91, 89, 224, 87, 224, + 226, 224, 226, 86, 226, 227, 224, 85, 227, 226, + 82, 228, 68, 65, 62, 227, 61, 227, 228, 227, + 58, 228, 230, 228, 227, 228, 57, 52, 31, 27, + 228, 22, 230, 231, 230, 21, 230, 18, 17, 232, + 230, 230, 0, 231, 0, 231, 0, 231, 0, 232, + 233, 232, 231, 232, 0, 0, 232, 0, 232, 0, + 233, 234, 233, 0, 233, 0, 0, 233, 0, 233, + + 0, 234, 236, 234, 0, 234, 0, 237, 237, 0, + 234, 234, 236, 0, 236, 0, 236, 0, 237, 238, + 237, 236, 237, 0, 0, 239, 0, 237, 0, 238, + 0, 238, 0, 238, 0, 239, 0, 239, 238, 239, + 240, 241, 0, 240, 239, 0, 0, 0, 241, 0, + 240, 241, 240, 241, 240, 241, 242, 0, 0, 240, + 241, 0, 0, 0, 0, 0, 242, 243, 242, 0, + 242, 0, 0, 244, 242, 242, 0, 243, 0, 243, + 0, 243, 0, 244, 243, 244, 243, 244, 245, 0, + 244, 245, 244, 0, 246, 0, 0, 246, 245, 0, + + 245, 0, 245, 0, 246, 248, 246, 245, 246, 0, + 0, 0, 0, 246, 0, 248, 249, 248, 248, 248, + 248, 0, 250, 0, 248, 248, 249, 0, 249, 250, + 249, 0, 254, 0, 249, 249, 0, 0, 254, 250, + 270, 250, 254, 250, 254, 0, 254, 0, 250, 0, + 270, 254, 270, 271, 270, 0, 0, 0, 0, 270, + 271, 0, 0, 271, 272, 271, 0, 271, 0, 0, + 273, 0, 271, 0, 272, 272, 272, 0, 272, 0, + 273, 274, 273, 272, 273, 0, 0, 275, 0, 273, + 275, 274, 0, 274, 0, 274, 0, 275, 0, 275, + + 274, 275, 276, 276, 277, 277, 275, 0, 0, 0, + 0, 0, 0, 276, 277, 276, 277, 276, 277, 278, + 0, 0, 276, 277, 0, 274, 0, 279, 0, 278, + 0, 278, 0, 278, 0, 280, 278, 279, 278, 279, + 279, 279, 0, 0, 0, 280, 279, 280, 282, 280, + 281, 281, 0, 280, 280, 0, 0, 0, 282, 283, + 282, 281, 282, 281, 0, 281, 0, 282, 0, 283, + 281, 283, 284, 283, 284, 285, 0, 285, 283, 0, + 0, 0, 284, 0, 284, 285, 284, 285, 0, 285, + 286, 284, 0, 286, 285, 0, 287, 0, 0, 0, + + 286, 0, 286, 0, 286, 0, 287, 288, 287, 286, + 287, 0, 0, 289, 288, 287, 0, 288, 0, 288, + 0, 288, 0, 289, 290, 289, 288, 289, 0, 289, + 0, 0, 289, 0, 290, 0, 290, 0, 290, 291, + 290, 0, 291, 290, 0, 292, 0, 0, 0, 291, + 0, 291, 0, 291, 0, 292, 295, 292, 291, 292, + 0, 0, 296, 0, 292, 0, 295, 0, 295, 0, + 295, 0, 296, 0, 296, 295, 296, 297, 298, 0, + 296, 296, 0, 0, 297, 0, 0, 297, 298, 297, + 298, 297, 298, 299, 298, 0, 297, 298, 300, 300, + + 295, 0, 0, 299, 0, 299, 0, 299, 0, 300, + 0, 300, 299, 300, 301, 300, 0, 302, 300, 301, + 0, 0, 0, 0, 301, 0, 301, 302, 301, 0, + 301, 0, 0, 301, 0, 303, 0, 302, 0, 302, + 0, 302, 0, 304, 0, 303, 302, 303, 0, 303, + 0, 0, 303, 304, 303, 304, 0, 304, 306, 306, + 0, 307, 304, 0, 0, 0, 0, 0, 306, 0, + 306, 307, 306, 307, 308, 307, 0, 306, 0, 307, + 307, 311, 310, 0, 308, 310, 308, 308, 308, 0, + 0, 0, 310, 308, 310, 0, 310, 311, 0, 0, + + 312, 310, 0, 312, 0, 0, 0, 311, 0, 311, + 312, 311, 312, 0, 312, 315, 311, 313, 313, 312, + 0, 316, 0, 0, 0, 315, 0, 315, 313, 315, + 313, 316, 313, 316, 315, 316, 0, 313, 317, 316, + 316, 317, 0, 0, 318, 0, 0, 0, 317, 0, + 317, 0, 317, 0, 318, 319, 318, 317, 318, 0, + 320, 320, 0, 318, 0, 319, 0, 319, 0, 319, + 0, 320, 321, 320, 319, 320, 0, 0, 322, 324, + 320, 0, 321, 0, 321, 0, 321, 0, 322, 323, + 322, 321, 322, 0, 0, 324, 0, 322, 0, 323, + + 0, 323, 0, 323, 0, 324, 0, 324, 323, 324, + 326, 327, 0, 0, 324, 0, 321, 0, 0, 0, + 326, 327, 326, 327, 326, 327, 0, 329, 328, 326, + 327, 328, 0, 0, 0, 0, 0, 329, 328, 329, + 328, 329, 328, 0, 330, 334, 329, 328, 0, 0, + 0, 0, 0, 0, 330, 334, 330, 334, 330, 334, + 0, 330, 329, 330, 334, 338, 0, 341, 0, 338, + 338, 338, 338, 338, 338, 338, 338, 341, 0, 341, + 0, 341, 342, 342, 0, 341, 341, 343, 343, 0, + 0, 0, 342, 0, 342, 0, 342, 0, 343, 344, + + 343, 342, 343, 0, 346, 346, 0, 343, 0, 344, + 0, 344, 0, 344, 0, 346, 0, 346, 344, 346, + 347, 347, 0, 348, 346, 0, 348, 0, 0, 0, + 347, 349, 347, 348, 347, 348, 0, 348, 0, 347, + 0, 349, 348, 349, 350, 349, 0, 0, 0, 0, + 349, 0, 351, 0, 350, 0, 350, 0, 350, 0, + 352, 0, 351, 350, 351, 0, 351, 352, 351, 0, + 352, 351, 352, 353, 352, 0, 0, 0, 0, 352, + 0, 354, 0, 353, 354, 353, 0, 353, 354, 0, + 0, 354, 353, 354, 355, 354, 355, 0, 0, 0, + + 354, 0, 356, 0, 355, 356, 355, 0, 355, 356, + 357, 0, 356, 355, 356, 0, 356, 0, 358, 0, + 357, 356, 357, 0, 357, 0, 357, 0, 358, 357, + 358, 0, 358, 359, 359, 0, 358, 358, 0, 360, + 0, 0, 0, 359, 0, 359, 0, 359, 0, 360, + 361, 360, 359, 360, 0, 0, 362, 360, 360, 0, + 361, 0, 361, 0, 361, 0, 362, 361, 362, 361, + 362, 363, 367, 0, 0, 362, 0, 0, 0, 367, + 0, 363, 367, 363, 367, 363, 367, 0, 0, 369, + 363, 367, 368, 368, 0, 368, 0, 0, 0, 369, + + 0, 369, 368, 369, 368, 0, 368, 369, 369, 371, + 370, 368, 370, 0, 0, 0, 0, 0, 0, 371, + 370, 371, 370, 371, 370, 372, 0, 0, 371, 370, + 0, 373, 0, 0, 373, 372, 0, 372, 0, 372, + 375, 373, 374, 373, 372, 373, 0, 376, 375, 0, + 373, 0, 374, 0, 374, 0, 374, 0, 375, 374, + 375, 374, 375, 376, 0, 0, 378, 375, 0, 379, + 0, 0, 0, 376, 0, 376, 378, 376, 378, 379, + 378, 379, 376, 379, 378, 378, 380, 382, 379, 0, + 0, 0, 0, 0, 0, 0, 380, 382, 380, 382, + + 380, 382, 384, 382, 0, 380, 382, 0, 385, 0, + 0, 0, 384, 0, 384, 0, 384, 0, 385, 0, + 385, 384, 385, 387, 388, 0, 385, 385, 0, 0, + 387, 0, 0, 387, 388, 387, 388, 387, 388, 389, + 390, 0, 387, 388, 389, 0, 0, 0, 0, 389, + 390, 389, 390, 389, 390, 394, 0, 0, 389, 390, + 0, 395, 390, 0, 395, 394, 0, 394, 0, 394, + 0, 395, 396, 395, 394, 395, 0, 0, 0, 0, + 395, 0, 396, 398, 396, 0, 396, 0, 396, 406, + 0, 396, 0, 398, 0, 398, 0, 398, 0, 406, + + 0, 406, 398, 406, 407, 407, 0, 0, 406, 0, + 0, 408, 0, 0, 0, 407, 0, 407, 0, 407, + 0, 408, 410, 408, 407, 408, 0, 398, 411, 408, + 408, 0, 410, 0, 410, 0, 410, 0, 411, 412, + 411, 410, 411, 0, 0, 413, 411, 411, 413, 412, + 0, 412, 0, 412, 0, 413, 0, 413, 412, 413, + 414, 414, 415, 0, 413, 0, 0, 0, 0, 0, + 0, 414, 415, 414, 415, 414, 415, 416, 0, 0, + 414, 415, 0, 0, 0, 0, 0, 416, 417, 416, + 417, 416, 0, 0, 418, 416, 416, 0, 417, 0, + + 417, 0, 417, 0, 418, 0, 418, 417, 418, 0, + 0, 419, 418, 418, 419, 0, 0, 420, 0, 420, + 0, 419, 0, 419, 0, 419, 0, 420, 421, 420, + 419, 420, 0, 422, 422, 0, 420, 0, 421, 0, + 421, 0, 421, 0, 422, 423, 422, 421, 422, 0, + 0, 424, 0, 422, 0, 423, 0, 423, 424, 423, + 0, 424, 425, 424, 423, 424, 0, 0, 426, 0, + 424, 0, 425, 0, 425, 426, 425, 0, 426, 425, + 426, 425, 426, 427, 427, 431, 0, 426, 0, 431, + 0, 0, 0, 0, 427, 431, 427, 431, 427, 431, + + 432, 0, 0, 427, 431, 0, 433, 432, 433, 0, + 432, 0, 432, 0, 432, 0, 433, 434, 433, 432, + 433, 0, 0, 435, 0, 433, 435, 434, 0, 434, + 0, 434, 0, 435, 434, 435, 434, 435, 436, 436, + 0, 0, 435, 0, 437, 437, 0, 0, 436, 0, + 436, 0, 436, 0, 437, 438, 437, 436, 437, 0, + 0, 0, 0, 437, 0, 438, 0, 438, 0, 438, + 439, 438, 0, 439, 438, 0, 440, 0, 0, 0, + 439, 0, 439, 0, 439, 0, 440, 443, 440, 439, + 440, 0, 0, 440, 0, 440, 0, 443, 0, 443, + + 446, 443, 444, 444, 0, 0, 443, 0, 0, 0, + 446, 448, 446, 444, 446, 444, 0, 444, 0, 446, + 0, 448, 444, 448, 449, 448, 0, 449, 0, 448, + 448, 0, 451, 0, 449, 0, 449, 0, 449, 0, + 0, 0, 451, 449, 451, 0, 451, 452, 452, 0, + 453, 451, 451, 454, 0, 0, 0, 452, 0, 452, + 453, 452, 453, 454, 453, 454, 452, 454, 458, 453, + 0, 459, 454, 0, 0, 0, 0, 0, 458, 0, + 458, 459, 458, 459, 0, 459, 0, 458, 459, 466, + 459, 468, 0, 466, 466, 466, 466, 466, 466, 466, + + 466, 468, 0, 468, 469, 468, 0, 471, 0, 468, + 468, 469, 0, 0, 469, 0, 469, 471, 469, 471, + 0, 471, 472, 469, 0, 472, 471, 0, 473, 0, + 0, 0, 472, 0, 472, 0, 472, 0, 473, 474, + 473, 472, 473, 0, 0, 475, 474, 473, 0, 474, + 0, 474, 475, 474, 0, 475, 476, 475, 474, 475, + 0, 0, 477, 0, 475, 0, 476, 0, 476, 0, + 476, 0, 477, 478, 477, 476, 477, 0, 0, 0, + 478, 477, 0, 478, 479, 478, 479, 478, 0, 0, + 480, 0, 478, 0, 479, 0, 479, 0, 479, 0, + + 480, 481, 480, 479, 480, 0, 481, 482, 0, 480, + 0, 481, 0, 481, 0, 481, 0, 482, 483, 482, + 481, 482, 0, 0, 0, 482, 482, 0, 483, 484, + 483, 0, 483, 0, 0, 485, 483, 483, 0, 484, + 0, 484, 0, 484, 0, 485, 486, 485, 484, 485, + 0, 0, 490, 0, 485, 0, 486, 0, 486, 490, + 486, 0, 490, 491, 490, 486, 490, 0, 0, 0, + 0, 490, 0, 491, 492, 491, 0, 491, 0, 0, + 493, 491, 491, 0, 492, 0, 492, 0, 492, 0, + 493, 494, 493, 492, 493, 0, 0, 495, 0, 493, + + 495, 494, 0, 494, 0, 494, 0, 495, 494, 495, + 494, 495, 496, 497, 0, 0, 495, 0, 0, 0, + 0, 0, 496, 497, 496, 497, 496, 497, 498, 498, + 496, 496, 497, 0, 499, 0, 0, 0, 498, 0, + 498, 0, 498, 0, 499, 502, 499, 498, 499, 0, + 0, 504, 0, 499, 0, 502, 0, 502, 0, 502, + 0, 504, 506, 504, 502, 504, 0, 0, 0, 0, + 504, 0, 506, 507, 506, 0, 506, 0, 499, 509, + 0, 506, 509, 507, 0, 507, 0, 507, 0, 509, + 0, 509, 507, 509, 510, 0, 0, 510, 509, 514, + + 514, 0, 0, 0, 510, 0, 510, 0, 510, 0, + 514, 522, 514, 510, 514, 0, 0, 0, 522, 514, + 0, 522, 0, 522, 0, 522, 523, 523, 0, 0, + 522, 0, 525, 0, 0, 0, 523, 0, 523, 0, + 523, 0, 525, 526, 525, 523, 525, 0, 525, 0, + 0, 525, 0, 526, 527, 526, 0, 526, 0, 0, + 528, 526, 526, 0, 527, 0, 527, 0, 527, 0, + 528, 529, 528, 527, 528, 0, 531, 530, 0, 528, + 0, 529, 0, 529, 529, 529, 0, 530, 0, 530, + 529, 530, 531, 0, 0, 532, 530, 0, 532, 0, + + 0, 0, 531, 533, 531, 532, 531, 532, 0, 532, + 0, 531, 0, 533, 532, 533, 534, 533, 0, 535, + 0, 0, 533, 534, 0, 0, 534, 0, 534, 535, + 534, 535, 0, 535, 540, 534, 0, 540, 535, 0, + 541, 0, 0, 0, 540, 0, 540, 0, 540, 0, + 541, 542, 541, 540, 541, 0, 0, 543, 0, 541, + 0, 542, 0, 542, 0, 542, 0, 543, 544, 543, + 542, 543, 0, 0, 545, 544, 543, 0, 544, 0, + 544, 0, 544, 0, 545, 549, 545, 544, 545, 553, + 0, 0, 545, 545, 0, 549, 0, 549, 0, 549, + + 0, 0, 554, 0, 549, 553, 0, 0, 558, 0, + 0, 0, 554, 0, 554, 553, 554, 553, 558, 553, + 558, 554, 558, 566, 553, 0, 0, 558, 0, 567, + 0, 0, 0, 566, 0, 566, 566, 566, 0, 567, + 569, 567, 566, 567, 0, 0, 570, 0, 567, 0, + 569, 0, 569, 0, 569, 0, 570, 0, 570, 569, + 570, 571, 572, 570, 571, 570, 0, 572, 0, 0, + 0, 571, 572, 571, 572, 571, 572, 573, 0, 0, + 571, 572, 0, 575, 0, 575, 0, 573, 0, 573, + 0, 573, 0, 575, 576, 575, 573, 575, 0, 0, + + 581, 0, 575, 0, 576, 0, 576, 0, 576, 0, + 581, 582, 581, 576, 581, 0, 581, 0, 0, 581, + 0, 582, 583, 582, 582, 582, 0, 0, 594, 583, + 582, 0, 583, 0, 583, 0, 583, 0, 594, 602, + 594, 583, 594, 0, 0, 603, 0, 594, 0, 602, + 0, 602, 0, 602, 0, 603, 0, 603, 602, 603, + 604, 605, 604, 0, 603, 0, 0, 0, 0, 0, + 604, 605, 604, 605, 604, 605, 606, 608, 0, 604, + 605, 0, 0, 0, 0, 0, 606, 608, 606, 608, + 606, 608, 609, 606, 0, 606, 608, 0, 613, 609, + + 0, 0, 609, 0, 609, 0, 609, 0, 613, 614, + 613, 609, 613, 0, 0, 0, 0, 613, 0, 614, + 615, 614, 0, 614, 0, 0, 630, 0, 614, 0, + 615, 0, 615, 615, 615, 0, 630, 631, 630, 615, + 630, 0, 0, 632, 0, 630, 0, 631, 0, 631, + 0, 631, 0, 632, 634, 632, 631, 632, 0, 0, + 0, 0, 632, 0, 634, 638, 634, 0, 634, 0, + 0, 639, 634, 634, 0, 638, 0, 638, 0, 638, + 0, 639, 638, 639, 638, 639, 654, 658, 0, 0, + 639, 0, 0, 0, 0, 0, 654, 658, 654, 658, + + 654, 658, 659, 674, 0, 654, 658, 0, 0, 654, + 0, 0, 659, 674, 659, 674, 659, 674, 0, 0, + 0, 659, 674, 709, 709, 709, 709, 709, 709, 709, + 709, 709, 709, 709, 709, 710, 710, 710, 710, 710, + 710, 710, 710, 710, 710, 710, 710, 711, 711, 711, + 711, 711, 711, 711, 711, 711, 711, 711, 711, 712, + 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, + 712, 713, 713, 713, 713, 713, 713, 713, 713, 713, + 713, 713, 713, 714, 714, 714, 714, 714, 714, 714, + 714, 714, 714, 714, 714, 715, 715, 715, 0, 715, + + 715, 715, 715, 715, 715, 715, 715, 716, 716, 0, + 0, 716, 0, 716, 0, 716, 717, 717, 0, 717, + 717, 718, 718, 0, 718, 718, 718, 0, 718, 718, + 718, 718, 718, 719, 719, 719, 0, 719, 719, 719, + 719, 719, 719, 719, 719, 720, 720, 720, 720, 720, + 720, 720, 720, 0, 720, 720, 721, 0, 0, 721, + 721, 721, 721, 721, 721, 721, 721, 722, 0, 0, + 722, 722, 722, 722, 722, 722, 722, 722, 723, 0, + 0, 723, 0, 723, 723, 723, 723, 723, 723, 724, + 724, 0, 724, 724, 725, 725, 0, 725, 725, 726, + + 0, 726, 726, 727, 727, 0, 727, 727, 728, 0, + 728, 728, 729, 0, 729, 729, 730, 0, 730, 730, + 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, + 731, 731, 732, 732, 0, 732, 732, 733, 733, 0, + 0, 0, 0, 733, 734, 734, 0, 0, 0, 0, + 734, 735, 735, 0, 0, 0, 0, 735, 736, 736, + 0, 0, 0, 0, 736, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 708, 708 } ; extern int yy_flex_debug; int yy_flex_debug = 1; -static yyconst short int yy_rule_linenum[130] = +static yyconst short int yy_rule_linenum[133] = { 0, - 103, 106, 108, 109, 110, 113, 115, 116, 117, 129, - 136, 143, 149, 158, 166, 174, 175, 177, 196, 202, - 203, 204, 205, 206, 209, 215, 222, 229, 236, 243, - 247, 248, 256, 257, 258, 259, 260, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, 284, 285, - 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, - - 336, 337, 338, 339, 340, 341, 342, 347, 348, 353, - 354, 355, 358, 364, 371, 380, 391, 397, 399, 400, - 404, 410, 416, 424, 427, 452, 496, 498, 509 + 92, 93, 95, 98, 101, 103, 104, 105, 108, 110, + 111, 112, 124, 131, 138, 144, 153, 161, 169, 170, + 172, 191, 197, 198, 199, 200, 201, 204, 210, 217, + 224, 231, 238, 242, 243, 251, 252, 253, 254, 255, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 342, 343, 348, 349, 350, 353, 358, 364, 372, 382, + 387, 389, 390, 394, 400, 406, 414, 417, 442, 486, + 488, 499 } ; static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; @@ -1831,7 +1758,6 @@ void asn1p_lexer_hack_push_encoding_control(void); /* Used in .y */ int asn1p_lexer_pedantic_1990 = 0; int asn1p_lexer_types_year = 0; int asn1p_lexer_constructs_year = 0; -static int _check_dashes(char *ptr); static asn1c_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */ /* @@ -1851,17 +1777,6 @@ static asn1c_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */ || (fyr && fyr <= asn1p_lexer_constructs_year) \ || (lyr && lyr > asn1p_lexer_constructs_year)) -/* - * Make sure that the label is compliant with the naming rules. - */ -#define CHECK_DASHES do { \ - if(_check_dashes(yytext)) { \ - fprintf(stderr, \ - "%s: Identifier format invalid: " \ - "Improper dash location\n", yytext); \ - return -1; \ - } } while(0) - /* * Append quoted string. */ @@ -1889,19 +1804,21 @@ static asn1c_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */ /* Controlled from within application */ #define dash_comment 1 -#define cpp_comment 2 +#define idash_comment 2 + +#define cpp_comment 3 -#define quoted 3 +#define quoted 4 -#define opaque 4 +#define opaque 5 -#define encoding_control 5 +#define encoding_control 6 -#define with_syntax 6 +#define with_syntax 7 /* Newline */ /* White-space */ -#line 1905 "asn1p_l.c" +#line 1822 "asn1p_l.c" /* Macros after this point can all be overridden by user definitions in * section 1. @@ -2052,10 +1969,10 @@ YY_DECL register char *yy_cp, *yy_bp; register int yy_act; -#line 101 "asn1p_l.l" +#line 90 "asn1p_l.l" -#line 2059 "asn1p_l.c" +#line 1976 "asn1p_l.c" if ( yy_init ) { @@ -2103,14 +2020,14 @@ YY_DECL while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 689 ) + if ( yy_current_state >= 709 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *yy_state_ptr++ = yy_current_state; ++yy_cp; } - while ( yy_base[yy_current_state] != 4544 ); + while ( yy_base[yy_current_state] != 4166 ); yy_find_action: yy_current_state = *--yy_state_ptr; @@ -2147,13 +2064,13 @@ YY_DECL { if ( yy_act == 0 ) fprintf( stderr, "--scanner backing up\n" ); - else if ( yy_act < 130 ) + else if ( yy_act < 133 ) fprintf( stderr, "--accepting rule at line %d (\"%s\")\n", yy_rule_linenum[yy_act], yytext ); - else if ( yy_act == 130 ) + else if ( yy_act == 133 ) fprintf( stderr, "--accepting default rule (\"%s\")\n", yytext ); - else if ( yy_act == 131 ) + else if ( yy_act == 134 ) fprintf( stderr, "--(end of buffer or a NUL)\n" ); else fprintf( stderr, "--EOF (start condition %d)\n", YY_START ); @@ -2162,51 +2079,74 @@ YY_DECL switch ( yy_act ) { /* beginning of action switch */ case 1: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP -#line 103 "asn1p_l.l" +#line 92 "asn1p_l.l" +/* Immediately terminated long comment */ + YY_BREAK +case 2: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 93 "asn1p_l.l" +yy_push_state(idash_comment); /* Incorrect, but acceptable */ + YY_BREAK + +case 3: +YY_RULE_SETUP +#line 95 "asn1p_l.l" +yy_pop_state(); /* Acceptable end of comment */ + YY_BREAK + +case 4: +YY_RULE_SETUP +#line 98 "asn1p_l.l" yy_push_state(dash_comment); YY_BREAK -case 2: +case 5: YY_RULE_SETUP -#line 106 "asn1p_l.l" +#line 101 "asn1p_l.l" yy_pop_state(); YY_BREAK -case 3: +case 6: YY_RULE_SETUP -#line 108 "asn1p_l.l" +#line 103 "asn1p_l.l" yy_pop_state(); /* End of comment */ YY_BREAK -case 4: +case 7: YY_RULE_SETUP -#line 109 "asn1p_l.l" +#line 104 "asn1p_l.l" /* Eat single dash */ YY_BREAK -case 5: +case 8: YY_RULE_SETUP -#line 110 "asn1p_l.l" +#line 105 "asn1p_l.l" /* Eat */ YY_BREAK -case 6: +case 9: YY_RULE_SETUP -#line 113 "asn1p_l.l" +#line 108 "asn1p_l.l" yy_push_state(cpp_comment); YY_BREAK -case 7: +case 10: YY_RULE_SETUP -#line 115 "asn1p_l.l" +#line 110 "asn1p_l.l" /* Eat */ YY_BREAK -case 8: +case 11: YY_RULE_SETUP -#line 116 "asn1p_l.l" +#line 111 "asn1p_l.l" yy_pop_state(); YY_BREAK -case 9: +case 12: YY_RULE_SETUP -#line 117 "asn1p_l.l" +#line 112 "asn1p_l.l" /* Eat */ YY_BREAK @@ -2217,9 +2157,9 @@ YY_RULE_SETUP * everything for later processing. */ -case 10: +case 13: YY_RULE_SETUP -#line 129 "asn1p_l.l" +#line 124 "asn1p_l.l" { yy_push_state(opaque); asn1p_lval.tv_opaque.buf = strdup(yytext); @@ -2227,9 +2167,9 @@ YY_RULE_SETUP return TOK_opaque; } YY_BREAK -case 11: +case 14: YY_RULE_SETUP -#line 136 "asn1p_l.l" +#line 131 "asn1p_l.l" { yy_pop_state(); asn1p_lval.tv_opaque.buf = strdup(yytext); @@ -2237,18 +2177,18 @@ YY_RULE_SETUP return TOK_opaque; } YY_BREAK -case 12: +case 15: YY_RULE_SETUP -#line 143 "asn1p_l.l" +#line 138 "asn1p_l.l" { asn1p_lval.tv_opaque.buf = strdup(yytext); asn1p_lval.tv_opaque.len = yyleng; return TOK_opaque; } YY_BREAK -case 13: +case 16: YY_RULE_SETUP -#line 149 "asn1p_l.l" +#line 144 "asn1p_l.l" { fprintf(stderr, "ASN.1 Parser syncronization failure: " @@ -2258,9 +2198,9 @@ YY_RULE_SETUP return -1; } YY_BREAK -case 14: +case 17: YY_RULE_SETUP -#line 158 "asn1p_l.l" +#line 153 "asn1p_l.l" { asn1p_lval.tv_opaque.buf = strdup(yytext); asn1p_lval.tv_opaque.len = yyleng; @@ -2268,9 +2208,9 @@ YY_RULE_SETUP } YY_BREAK -case 15: +case 18: YY_RULE_SETUP -#line 166 "asn1p_l.l" +#line 161 "asn1p_l.l" { asn1p_lval.tv_opaque.buf = 0; asn1p_lval.tv_opaque.len = 0; @@ -2279,19 +2219,19 @@ YY_RULE_SETUP } YY_BREAK -case 16: +case 19: YY_RULE_SETUP -#line 174 "asn1p_l.l" +#line 169 "asn1p_l.l" { QAPPEND(yytext, yyleng-1); } /* Add a single quote */ YY_BREAK -case 17: +case 20: YY_RULE_SETUP -#line 175 "asn1p_l.l" +#line 170 "asn1p_l.l" { QAPPEND(yytext, yyleng); } YY_BREAK -case 18: +case 21: YY_RULE_SETUP -#line 177 "asn1p_l.l" +#line 172 "asn1p_l.l" { yy_pop_state(); /* Do not append last quote: @@ -2310,9 +2250,9 @@ YY_RULE_SETUP YY_BREAK -case 19: +case 22: YY_RULE_SETUP -#line 196 "asn1p_l.l" +#line 191 "asn1p_l.l" { const char *s = "ENCODING-CONTROL"; const char *p = s + sizeof("ENCODING-CONTROL") - 2; @@ -2320,53 +2260,53 @@ YY_RULE_SETUP yy_pop_state(); } YY_BREAK -case 20: +case 23: YY_RULE_SETUP -#line 202 "asn1p_l.l" +#line 197 "asn1p_l.l" unput('D'); unput('N'); unput('E'); yy_pop_state(); YY_BREAK -case 21: +case 24: YY_RULE_SETUP -#line 203 "asn1p_l.l" +#line 198 "asn1p_l.l" YY_BREAK -case 22: +case 25: YY_RULE_SETUP -#line 204 "asn1p_l.l" +#line 199 "asn1p_l.l" YY_BREAK -case 23: +case 26: YY_RULE_SETUP -#line 205 "asn1p_l.l" +#line 200 "asn1p_l.l" /* Eat everything else */ YY_BREAK -case 24: +case 27: YY_RULE_SETUP -#line 206 "asn1p_l.l" +#line 201 "asn1p_l.l" YY_BREAK -case 25: +case 28: YY_RULE_SETUP -#line 209 "asn1p_l.l" +#line 204 "asn1p_l.l" { /* " \t\r\n" weren't allowed in ASN.1:1990. */ asn1p_lval.tv_str = yytext; return TOK_hstring; } YY_BREAK -case 26: +case 29: YY_RULE_SETUP -#line 215 "asn1p_l.l" +#line 210 "asn1p_l.l" { /* " \t\r\n" weren't allowed in ASN.1:1990. */ asn1p_lval.tv_str = strdup(yytext); return TOK_bstring; } YY_BREAK -case 27: +case 30: YY_RULE_SETUP -#line 222 "asn1p_l.l" +#line 217 "asn1p_l.l" { asn1p_lval.a_int = asn1p_atoi(yytext); if(errno == ERANGE) @@ -2374,9 +2314,9 @@ YY_RULE_SETUP return TOK_number_negative; } YY_BREAK -case 28: +case 31: YY_RULE_SETUP -#line 229 "asn1p_l.l" +#line 224 "asn1p_l.l" { asn1p_lval.a_int = asn1p_atoi(yytext); if(errno == ERANGE) @@ -2384,9 +2324,9 @@ YY_RULE_SETUP return TOK_number; } YY_BREAK -case 29: +case 32: YY_RULE_SETUP -#line 236 "asn1p_l.l" +#line 231 "asn1p_l.l" { asn1p_lval.a_int = asn1p_atoi(yytext); if(errno == ERANGE) @@ -2394,22 +2334,22 @@ YY_RULE_SETUP return TOK_number; } YY_BREAK -case 30: +case 33: YY_RULE_SETUP -#line 243 "asn1p_l.l" +#line 238 "asn1p_l.l" return TOK_ABSENT; YY_BREAK /* ABSTRACT-SYNTAX return TOK_ABSTRACT_SYNTAX; */ -case 31: +case 34: YY_RULE_SETUP -#line 247 "asn1p_l.l" +#line 242 "asn1p_l.l" return TOK_ALL; YY_BREAK -case 32: +case 35: YY_RULE_SETUP -#line 248 "asn1p_l.l" +#line 243 "asn1p_l.l" { /* Appeared in 1990, removed in 1997 */ if(TYPE_LIFETIME(1990, 1997)) @@ -2419,88 +2359,88 @@ YY_RULE_SETUP REJECT; } YY_BREAK -case 33: +case 36: YY_RULE_SETUP -#line 256 "asn1p_l.l" +#line 251 "asn1p_l.l" return TOK_APPLICATION; YY_BREAK -case 34: +case 37: YY_RULE_SETUP -#line 257 "asn1p_l.l" +#line 252 "asn1p_l.l" return TOK_AUTOMATIC; YY_BREAK -case 35: +case 38: YY_RULE_SETUP -#line 258 "asn1p_l.l" +#line 253 "asn1p_l.l" return TOK_BEGIN; YY_BREAK -case 36: +case 39: YY_RULE_SETUP -#line 259 "asn1p_l.l" +#line 254 "asn1p_l.l" return TOK_BIT; YY_BREAK -case 37: +case 40: YY_RULE_SETUP -#line 260 "asn1p_l.l" +#line 255 "asn1p_l.l" { if(TYPE_LIFETIME(1994, 0)) return TOK_BMPString; REJECT; } YY_BREAK -case 38: +case 41: YY_RULE_SETUP -#line 265 "asn1p_l.l" +#line 260 "asn1p_l.l" return TOK_BOOLEAN; YY_BREAK -case 39: +case 42: YY_RULE_SETUP -#line 266 "asn1p_l.l" +#line 261 "asn1p_l.l" return TOK_BY; YY_BREAK -case 40: +case 43: YY_RULE_SETUP -#line 267 "asn1p_l.l" +#line 262 "asn1p_l.l" return TOK_CHARACTER; YY_BREAK -case 41: +case 44: YY_RULE_SETUP -#line 268 "asn1p_l.l" +#line 263 "asn1p_l.l" return TOK_CHOICE; YY_BREAK -case 42: +case 45: YY_RULE_SETUP -#line 269 "asn1p_l.l" +#line 264 "asn1p_l.l" return TOK_CLASS; YY_BREAK -case 43: +case 46: YY_RULE_SETUP -#line 270 "asn1p_l.l" +#line 265 "asn1p_l.l" return TOK_COMPONENT; YY_BREAK -case 44: +case 47: YY_RULE_SETUP -#line 271 "asn1p_l.l" +#line 266 "asn1p_l.l" return TOK_COMPONENTS; YY_BREAK -case 45: +case 48: YY_RULE_SETUP -#line 272 "asn1p_l.l" +#line 267 "asn1p_l.l" return TOK_CONSTRAINED; YY_BREAK -case 46: +case 49: YY_RULE_SETUP -#line 273 "asn1p_l.l" +#line 268 "asn1p_l.l" return TOK_CONTAINING; YY_BREAK -case 47: +case 50: YY_RULE_SETUP -#line 274 "asn1p_l.l" +#line 269 "asn1p_l.l" return TOK_DEFAULT; YY_BREAK -case 48: +case 51: YY_RULE_SETUP -#line 275 "asn1p_l.l" +#line 270 "asn1p_l.l" { /* Appeared in 1990, removed in 1997 */ if(TYPE_LIFETIME(1990, 1997)) @@ -2511,357 +2451,354 @@ YY_RULE_SETUP REJECT; } YY_BREAK -case 49: +case 52: YY_RULE_SETUP -#line 284 "asn1p_l.l" +#line 279 "asn1p_l.l" return TOK_DEFINITIONS; YY_BREAK -case 50: +case 53: YY_RULE_SETUP -#line 285 "asn1p_l.l" +#line 280 "asn1p_l.l" return TOK_EMBEDDED; YY_BREAK -case 51: +case 54: YY_RULE_SETUP -#line 286 "asn1p_l.l" +#line 281 "asn1p_l.l" return TOK_ENCODED; YY_BREAK -case 52: +case 55: YY_RULE_SETUP -#line 287 "asn1p_l.l" +#line 282 "asn1p_l.l" return TOK_ENCODING_CONTROL; YY_BREAK -case 53: +case 56: YY_RULE_SETUP -#line 288 "asn1p_l.l" +#line 283 "asn1p_l.l" return TOK_END; YY_BREAK -case 54: +case 57: YY_RULE_SETUP -#line 289 "asn1p_l.l" +#line 284 "asn1p_l.l" return TOK_ENUMERATED; YY_BREAK -case 55: +case 58: YY_RULE_SETUP -#line 290 "asn1p_l.l" +#line 285 "asn1p_l.l" return TOK_EXCEPT; YY_BREAK -case 56: +case 59: YY_RULE_SETUP -#line 291 "asn1p_l.l" +#line 286 "asn1p_l.l" return TOK_EXPLICIT; YY_BREAK -case 57: +case 60: YY_RULE_SETUP -#line 292 "asn1p_l.l" +#line 287 "asn1p_l.l" return TOK_EXPORTS; YY_BREAK -case 58: +case 61: YY_RULE_SETUP -#line 293 "asn1p_l.l" +#line 288 "asn1p_l.l" return TOK_EXTENSIBILITY; YY_BREAK -case 59: +case 62: YY_RULE_SETUP -#line 294 "asn1p_l.l" +#line 289 "asn1p_l.l" return TOK_EXTERNAL; YY_BREAK -case 60: +case 63: YY_RULE_SETUP -#line 295 "asn1p_l.l" +#line 290 "asn1p_l.l" return TOK_FALSE; YY_BREAK -case 61: +case 64: YY_RULE_SETUP -#line 296 "asn1p_l.l" +#line 291 "asn1p_l.l" return TOK_FROM; YY_BREAK -case 62: +case 65: YY_RULE_SETUP -#line 297 "asn1p_l.l" +#line 292 "asn1p_l.l" return TOK_GeneralizedTime; YY_BREAK -case 63: +case 66: YY_RULE_SETUP -#line 298 "asn1p_l.l" +#line 293 "asn1p_l.l" return TOK_GeneralString; YY_BREAK -case 64: +case 67: YY_RULE_SETUP -#line 299 "asn1p_l.l" +#line 294 "asn1p_l.l" return TOK_GraphicString; YY_BREAK -case 65: +case 68: YY_RULE_SETUP -#line 300 "asn1p_l.l" +#line 295 "asn1p_l.l" return TOK_IA5String; YY_BREAK -case 66: +case 69: YY_RULE_SETUP -#line 301 "asn1p_l.l" +#line 296 "asn1p_l.l" return TOK_IDENTIFIER; YY_BREAK -case 67: +case 70: YY_RULE_SETUP -#line 302 "asn1p_l.l" +#line 297 "asn1p_l.l" return TOK_IMPLICIT; YY_BREAK -case 68: +case 71: YY_RULE_SETUP -#line 303 "asn1p_l.l" +#line 298 "asn1p_l.l" return TOK_IMPLIED; YY_BREAK -case 69: +case 72: YY_RULE_SETUP -#line 304 "asn1p_l.l" +#line 299 "asn1p_l.l" return TOK_IMPORTS; YY_BREAK -case 70: +case 73: YY_RULE_SETUP -#line 305 "asn1p_l.l" +#line 300 "asn1p_l.l" return TOK_INCLUDES; YY_BREAK -case 71: +case 74: YY_RULE_SETUP -#line 306 "asn1p_l.l" +#line 301 "asn1p_l.l" return TOK_INSTANCE; YY_BREAK -case 72: +case 75: YY_RULE_SETUP -#line 307 "asn1p_l.l" +#line 302 "asn1p_l.l" return TOK_INSTRUCTIONS; YY_BREAK -case 73: +case 76: YY_RULE_SETUP -#line 308 "asn1p_l.l" +#line 303 "asn1p_l.l" return TOK_INTEGER; YY_BREAK -case 74: +case 77: YY_RULE_SETUP -#line 309 "asn1p_l.l" +#line 304 "asn1p_l.l" return TOK_INTERSECTION; YY_BREAK -case 75: +case 78: YY_RULE_SETUP -#line 310 "asn1p_l.l" +#line 305 "asn1p_l.l" return TOK_ISO646String; YY_BREAK -case 76: +case 79: YY_RULE_SETUP -#line 311 "asn1p_l.l" +#line 306 "asn1p_l.l" return TOK_MAX; YY_BREAK -case 77: +case 80: YY_RULE_SETUP -#line 312 "asn1p_l.l" +#line 307 "asn1p_l.l" return TOK_MIN; YY_BREAK -case 78: +case 81: YY_RULE_SETUP -#line 313 "asn1p_l.l" +#line 308 "asn1p_l.l" return TOK_MINUS_INFINITY; YY_BREAK -case 79: +case 82: YY_RULE_SETUP -#line 314 "asn1p_l.l" +#line 309 "asn1p_l.l" return TOK_NULL; YY_BREAK -case 80: +case 83: YY_RULE_SETUP -#line 315 "asn1p_l.l" +#line 310 "asn1p_l.l" return TOK_NumericString; YY_BREAK -case 81: +case 84: YY_RULE_SETUP -#line 316 "asn1p_l.l" +#line 311 "asn1p_l.l" return TOK_OBJECT; YY_BREAK -case 82: +case 85: YY_RULE_SETUP -#line 317 "asn1p_l.l" +#line 312 "asn1p_l.l" return TOK_ObjectDescriptor; YY_BREAK -case 83: +case 86: YY_RULE_SETUP -#line 318 "asn1p_l.l" +#line 313 "asn1p_l.l" return TOK_OCTET; YY_BREAK -case 84: +case 87: YY_RULE_SETUP -#line 319 "asn1p_l.l" +#line 314 "asn1p_l.l" return TOK_OF; YY_BREAK -case 85: +case 88: YY_RULE_SETUP -#line 320 "asn1p_l.l" +#line 315 "asn1p_l.l" return TOK_OPTIONAL; YY_BREAK -case 86: +case 89: YY_RULE_SETUP -#line 321 "asn1p_l.l" +#line 316 "asn1p_l.l" return TOK_PATTERN; YY_BREAK -case 87: +case 90: YY_RULE_SETUP -#line 322 "asn1p_l.l" +#line 317 "asn1p_l.l" return TOK_PDV; YY_BREAK -case 88: +case 91: YY_RULE_SETUP -#line 323 "asn1p_l.l" +#line 318 "asn1p_l.l" return TOK_PLUS_INFINITY; YY_BREAK -case 89: +case 92: YY_RULE_SETUP -#line 324 "asn1p_l.l" +#line 319 "asn1p_l.l" return TOK_PRESENT; YY_BREAK -case 90: +case 93: YY_RULE_SETUP -#line 325 "asn1p_l.l" +#line 320 "asn1p_l.l" return TOK_PrintableString; YY_BREAK -case 91: +case 94: YY_RULE_SETUP -#line 326 "asn1p_l.l" +#line 321 "asn1p_l.l" return TOK_PRIVATE; YY_BREAK -case 92: +case 95: YY_RULE_SETUP -#line 327 "asn1p_l.l" +#line 322 "asn1p_l.l" return TOK_REAL; YY_BREAK -case 93: +case 96: YY_RULE_SETUP -#line 328 "asn1p_l.l" +#line 323 "asn1p_l.l" return TOK_RELATIVE_OID; YY_BREAK -case 94: +case 97: YY_RULE_SETUP -#line 329 "asn1p_l.l" +#line 324 "asn1p_l.l" return TOK_SEQUENCE; YY_BREAK -case 95: +case 98: YY_RULE_SETUP -#line 330 "asn1p_l.l" +#line 325 "asn1p_l.l" return TOK_SET; YY_BREAK -case 96: +case 99: YY_RULE_SETUP -#line 331 "asn1p_l.l" +#line 326 "asn1p_l.l" return TOK_SIZE; YY_BREAK -case 97: +case 100: YY_RULE_SETUP -#line 332 "asn1p_l.l" +#line 327 "asn1p_l.l" return TOK_STRING; YY_BREAK -case 98: +case 101: YY_RULE_SETUP -#line 333 "asn1p_l.l" +#line 328 "asn1p_l.l" return TOK_SYNTAX; YY_BREAK -case 99: +case 102: YY_RULE_SETUP -#line 334 "asn1p_l.l" +#line 329 "asn1p_l.l" return TOK_T61String; YY_BREAK -case 100: +case 103: YY_RULE_SETUP -#line 335 "asn1p_l.l" +#line 330 "asn1p_l.l" return TOK_TAGS; YY_BREAK -case 101: +case 104: YY_RULE_SETUP -#line 336 "asn1p_l.l" +#line 331 "asn1p_l.l" return TOK_TeletexString; YY_BREAK -case 102: +case 105: YY_RULE_SETUP -#line 337 "asn1p_l.l" +#line 332 "asn1p_l.l" return TOK_TRUE; YY_BREAK -case 103: +case 106: YY_RULE_SETUP -#line 338 "asn1p_l.l" +#line 333 "asn1p_l.l" return TOK_TYPE_IDENTIFIER; YY_BREAK -case 104: +case 107: YY_RULE_SETUP -#line 339 "asn1p_l.l" +#line 334 "asn1p_l.l" return TOK_UNION; YY_BREAK -case 105: +case 108: YY_RULE_SETUP -#line 340 "asn1p_l.l" +#line 335 "asn1p_l.l" return TOK_UNIQUE; YY_BREAK -case 106: +case 109: YY_RULE_SETUP -#line 341 "asn1p_l.l" +#line 336 "asn1p_l.l" return TOK_UNIVERSAL; YY_BREAK -case 107: +case 110: YY_RULE_SETUP -#line 342 "asn1p_l.l" +#line 337 "asn1p_l.l" { if(TYPE_LIFETIME(1994, 0)) return TOK_UniversalString; REJECT; } YY_BREAK -case 108: +case 111: YY_RULE_SETUP -#line 347 "asn1p_l.l" +#line 342 "asn1p_l.l" return TOK_UTCTime; YY_BREAK -case 109: +case 112: YY_RULE_SETUP -#line 348 "asn1p_l.l" +#line 343 "asn1p_l.l" { if(TYPE_LIFETIME(1994, 0)) return TOK_UTF8String; REJECT; } YY_BREAK -case 110: +case 113: YY_RULE_SETUP -#line 353 "asn1p_l.l" +#line 348 "asn1p_l.l" return TOK_VideotexString; YY_BREAK -case 111: +case 114: YY_RULE_SETUP -#line 354 "asn1p_l.l" +#line 349 "asn1p_l.l" return TOK_VisibleString; YY_BREAK -case 112: +case 115: YY_RULE_SETUP -#line 355 "asn1p_l.l" +#line 350 "asn1p_l.l" return TOK_WITH; YY_BREAK -case 113: +case 116: YY_RULE_SETUP -#line 358 "asn1p_l.l" +#line 353 "asn1p_l.l" { - CHECK_DASHES; asn1p_lval.tv_str = strdup(yytext); return TOK_typefieldreference; } YY_BREAK -case 114: +case 117: YY_RULE_SETUP -#line 364 "asn1p_l.l" +#line 358 "asn1p_l.l" { - CHECK_DASHES; asn1p_lval.tv_str = strdup(yytext); return TOK_valuefieldreference; } YY_BREAK -case 115: +case 118: YY_RULE_SETUP -#line 371 "asn1p_l.l" +#line 364 "asn1p_l.l" { - CHECK_DASHES; asn1p_lval.tv_str = strdup(yytext); return TOK_identifier; } @@ -2869,11 +2806,10 @@ YY_RULE_SETUP /* * objectclassreference */ -case 116: +case 119: YY_RULE_SETUP -#line 380 "asn1p_l.l" +#line 372 "asn1p_l.l" { - CHECK_DASHES; asn1p_lval.tv_str = strdup(yytext); return TOK_capitalreference; } @@ -2883,66 +2819,65 @@ YY_RULE_SETUP * NOTE: TOK_objectclassreference must be combined * with this token to produce true typereference. */ -case 117: +case 120: YY_RULE_SETUP -#line 391 "asn1p_l.l" +#line 382 "asn1p_l.l" { - CHECK_DASHES; asn1p_lval.tv_str = strdup(yytext); return TOK_typereference; } YY_BREAK -case 118: +case 121: YY_RULE_SETUP -#line 397 "asn1p_l.l" +#line 387 "asn1p_l.l" return TOK_PPEQ; YY_BREAK -case 119: +case 122: YY_RULE_SETUP -#line 399 "asn1p_l.l" +#line 389 "asn1p_l.l" return TOK_ThreeDots; YY_BREAK -case 120: +case 123: YY_RULE_SETUP -#line 400 "asn1p_l.l" +#line 390 "asn1p_l.l" return TOK_TwoDots; YY_BREAK -case 121: +case 124: YY_RULE_SETUP -#line 404 "asn1p_l.l" +#line 394 "asn1p_l.l" { asn1p_lval.tv_opaque.buf = strdup(yytext); asn1p_lval.tv_opaque.len = yyleng; return TOK_opaque; } YY_BREAK -case 122: +case 125: YY_RULE_SETUP -#line 410 "asn1p_l.l" +#line 400 "asn1p_l.l" { asn1p_lval.tv_opaque.buf = strdup(yytext); asn1p_lval.tv_opaque.len = yyleng; return TOK_opaque; } YY_BREAK -case 123: +case 126: YY_RULE_SETUP -#line 416 "asn1p_l.l" +#line 406 "asn1p_l.l" { yy_pop_state(); return '}'; } YY_BREAK -case 124: +case 127: YY_RULE_SETUP -#line 424 "asn1p_l.l" +#line 414 "asn1p_l.l" /* Ignore whitespace */ YY_BREAK -case 125: +case 128: YY_RULE_SETUP -#line 427 "asn1p_l.l" +#line 417 "asn1p_l.l" { asn1c_integer_t v1 = -1, v2 = -1; char *p; @@ -2968,9 +2903,9 @@ YY_RULE_SETUP return TOK_tuple; } YY_BREAK -case 126: +case 129: YY_RULE_SETUP -#line 452 "asn1p_l.l" +#line 442 "asn1p_l.l" { asn1c_integer_t v1 = -1, v2 = -1, v3 = -1, v4 = -1; char *p; @@ -3014,14 +2949,14 @@ YY_RULE_SETUP return TOK_quadruple; } YY_BREAK -case 127: +case 130: YY_RULE_SETUP -#line 496 "asn1p_l.l" +#line 486 "asn1p_l.l" return yytext[0]; YY_BREAK -case 128: +case 131: YY_RULE_SETUP -#line 498 "asn1p_l.l" +#line 488 "asn1p_l.l" { if(TYPE_LIFETIME(1994, 0)) fprintf(stderr, "ERROR: "); @@ -3033,9 +2968,9 @@ YY_RULE_SETUP return -1; } YY_BREAK -case 129: +case 132: YY_RULE_SETUP -#line 509 "asn1p_l.l" +#line 499 "asn1p_l.l" { fprintf(stderr, "Unexpected token at line %d: \"%s\"\n", @@ -3051,24 +2986,25 @@ YY_RULE_SETUP YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(dash_comment): +case YY_STATE_EOF(idash_comment): case YY_STATE_EOF(cpp_comment): case YY_STATE_EOF(quoted): case YY_STATE_EOF(opaque): case YY_STATE_EOF(encoding_control): case YY_STATE_EOF(with_syntax): -#line 522 "asn1p_l.l" +#line 512 "asn1p_l.l" { while(YYSTATE != INITIAL) yy_pop_state(); yyterminate(); } YY_BREAK -case 130: +case 133: YY_RULE_SETUP -#line 529 "asn1p_l.l" +#line 519 "asn1p_l.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK -#line 3072 "asn1p_l.c" +#line 3008 "asn1p_l.c" case YY_END_OF_BUFFER: { @@ -3355,7 +3291,7 @@ static yy_state_type yy_get_previous_state() while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 689 ) + if ( yy_current_state >= 709 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -3385,11 +3321,11 @@ yy_state_type yy_current_state; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 689 ) + if ( yy_current_state >= 709 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 688); + yy_is_jam = (yy_current_state == 708); if ( ! yy_is_jam ) *yy_state_ptr++ = yy_current_state; @@ -3950,7 +3886,7 @@ int main() return 0; } #endif -#line 529 "asn1p_l.l" +#line 519 "asn1p_l.l" /* @@ -3968,38 +3904,6 @@ void asn1p_lexer_hack_push_encoding_control() { yy_push_state(encoding_control); } -/* - * Check that a token does not end with dash and does not contain - * several dashes in succession. - * "Name", "Type-Id", "T-y-p-e-i-d" are OK - * "end-", "vustom--value" are INVALID - */ -static int -_check_dashes(char *ptr) { - int prev_dash = 0; - - assert(*ptr != '-'); - - for(;; ptr++) { - switch(*ptr) { - case '-': - if(prev_dash++) /* No double dashes */ - return -1; - continue; - case '\0': - if(prev_dash) /* No dashes at the end */ - return -1; - break; - default: - prev_dash = 0; - continue; - } - break; - } - - return 0; -} - static asn1c_integer_t asn1p_atoi(char *ptr) { asn1c_integer_t value; diff --git a/libasn1parser/asn1p_l.l b/libasn1parser/asn1p_l.l index b37010450..04a550469 100644 --- a/libasn1parser/asn1p_l.l +++ b/libasn1parser/asn1p_l.l @@ -23,7 +23,6 @@ void asn1p_lexer_hack_push_encoding_control(void); /* Used in .y */ int asn1p_lexer_pedantic_1990 = 0; int asn1p_lexer_types_year = 0; int asn1p_lexer_constructs_year = 0; -static int _check_dashes(char *ptr); static asn1c_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */ /* @@ -43,17 +42,6 @@ static asn1c_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */ || (fyr && fyr <= asn1p_lexer_constructs_year) \ || (lyr && lyr > asn1p_lexer_constructs_year)) -/* - * Make sure that the label is compliant with the naming rules. - */ -#define CHECK_DASHES do { \ - if(_check_dashes(yytext)) { \ - fprintf(stderr, \ - "%s: Identifier format invalid: " \ - "Improper dash location\n", yytext); \ - return -1; \ - } } while(0) - /* * Append quoted string. */ @@ -87,6 +75,7 @@ static asn1c_integer_t asn1p_atoi(char *ptr); /* errno is either 0 or ERANGE */ %pointer %x dash_comment +%x idash_comment %x cpp_comment %x quoted %x opaque @@ -100,16 +89,22 @@ WSP [\t\r\v\f\n ] %% -"--" yy_push_state(dash_comment); -{ +-{3,}/[\r\n] /* Immediately terminated long comment */ +-{3,}/[^-\r\n] yy_push_state(idash_comment); /* Incorrect, but acceptable */ +{ + -{3,} yy_pop_state(); /* Acceptable end of comment */ +} + +-- yy_push_state(dash_comment); +{ {NL} yy_pop_state(); -- yy_pop_state(); /* End of comment */ - /* Eat single dash */ [^\r\v\f\n-]+ /* Eat */ - } + "/*" yy_push_state(cpp_comment); { [^*/] /* Eat */ @@ -355,21 +350,18 @@ VisibleString return TOK_VisibleString; WITH return TOK_WITH; -&[A-Z][A-Za-z0-9-]* { - CHECK_DASHES; +&[A-Z][A-Za-z0-9]*([-][A-Za-z0-9]+)* { asn1p_lval.tv_str = strdup(yytext); return TOK_typefieldreference; } -&[a-z][a-zA-Z0-9-]* { - CHECK_DASHES; +&[a-z][a-zA-Z0-9]*([-][a-zA-Z0-9]+)* { asn1p_lval.tv_str = strdup(yytext); return TOK_valuefieldreference; } -[a-z][a-zA-Z0-9-]* { - CHECK_DASHES; +[a-z][a-zA-Z0-9]*([-][a-zA-Z0-9]+)* { asn1p_lval.tv_str = strdup(yytext); return TOK_identifier; } @@ -377,8 +369,7 @@ WITH return TOK_WITH; /* * objectclassreference */ -[A-Z][A-Z0-9-]* { - CHECK_DASHES; +[A-Z][A-Z0-9]*([-][A-Z0-9]+)* { asn1p_lval.tv_str = strdup(yytext); return TOK_capitalreference; } @@ -388,8 +379,7 @@ WITH return TOK_WITH; * NOTE: TOK_objectclassreference must be combined * with this token to produce true typereference. */ -[A-Z][A-Za-z0-9-]* { - CHECK_DASHES; +[A-Z][A-Za-z0-9]*([-][A-Za-z0-9]+)* { asn1p_lval.tv_str = strdup(yytext); return TOK_typereference; } @@ -543,38 +533,6 @@ void asn1p_lexer_hack_push_encoding_control() { yy_push_state(encoding_control); } -/* - * Check that a token does not end with dash and does not contain - * several dashes in succession. - * "Name", "Type-Id", "T-y-p-e-i-d" are OK - * "end-", "vustom--value" are INVALID - */ -static int -_check_dashes(char *ptr) { - int prev_dash = 0; - - assert(*ptr != '-'); - - for(;; ptr++) { - switch(*ptr) { - case '-': - if(prev_dash++) /* No double dashes */ - return -1; - continue; - case '\0': - if(prev_dash) /* No dashes at the end */ - return -1; - break; - default: - prev_dash = 0; - continue; - } - break; - } - - return 0; -} - static asn1c_integer_t asn1p_atoi(char *ptr) { asn1c_integer_t value; diff --git a/tests/85-comments-OK.asn1 b/tests/85-comments-OK.asn1 new file mode 100644 index 000000000..883eadbfd --- /dev/null +++ b/tests/85-comments-OK.asn1 @@ -0,0 +1,23 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .85 + +ModuleTestComments + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 85 } + DEFINITIONS ::= +BEGIN + + T1 ::= SEQUENCE-- This is a comment-- { ... } + T2 ::= SEQUENCE--- This is a comment --- { ... } + + ----- Another ambiguous comment --- + + -- Immediately terminating ambiguous comment ---- + ------------- + -- cmt1 ---- cmt2 ---- + +END From 1a854eda0a12e09de2a98c508722df28605f361f Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 2 Jul 2005 21:45:01 +0000 Subject: [PATCH 0916/1469] version bump git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@916 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure | 2 +- configure.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 46674e3a0..9fe32ae20 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.9.15 + VERSION=0.9.16 cat >>confdefs.h <<_ACEOF diff --git a/configure.in b/configure.in index 424c8a8f2..daeba6a79 100644 --- a/configure.in +++ b/configure.in @@ -3,7 +3,7 @@ AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_BUILD AC_CANONICAL_TARGET AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.9.15) +AM_INIT_AUTOMAKE(asn1c, 0.9.16) AM_MAINTAINER_MODE From 5e89a2fcdd60d0eb20fe5554540c0f156ff6b3f7 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 3 Jul 2005 05:21:42 +0000 Subject: [PATCH 0917/1469] New tests git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@917 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/data-70/README | 4 ++++ asn1c/tests/data-70/data-70-39.in | 5 +++++ asn1c/tests/data-70/data-70-40-D.in | 6 ++++++ asn1c/tests/data-70/data-70-41-D.in | 6 ++++++ asn1c/tests/data-70/data-70-42-E.in | 1 + asn1c/tests/data-70/data-70-43-E.in | 1 + asn1c/tests/data-70/data-70-44-X.in | 1 + asn1c/tests/data-70/data-70-45-X.in | 1 + asn1c/tests/data-70/data-70-46-X.in | 1 + 9 files changed, 26 insertions(+) create mode 100644 asn1c/tests/data-70/data-70-39.in create mode 100644 asn1c/tests/data-70/data-70-40-D.in create mode 100644 asn1c/tests/data-70/data-70-41-D.in create mode 100644 asn1c/tests/data-70/data-70-42-E.in create mode 100644 asn1c/tests/data-70/data-70-43-E.in create mode 100644 asn1c/tests/data-70/data-70-44-X.in create mode 100644 asn1c/tests/data-70/data-70-45-X.in create mode 100644 asn1c/tests/data-70/data-70-46-X.in diff --git a/asn1c/tests/data-70/README b/asn1c/tests/data-70/README index f6b54baad..4a47a5108 100644 --- a/asn1c/tests/data-70/README +++ b/asn1c/tests/data-70/README @@ -8,3 +8,7 @@ Naming conventions: *-B.in - The file is intentionally broken *-D.in - Reconstructing should yield different data +*-E.in - CXER reconstruction should yield byte-wise identical data. +*-X.in - CXER reconstruction should yield non-identical data. + +Otherwise, a reconstructed buffer should loosely match the original. diff --git a/asn1c/tests/data-70/data-70-39.in b/asn1c/tests/data-70/data-70-39.in new file mode 100644 index 000000000..f6485575a --- /dev/null +++ b/asn1c/tests/data-70/data-70-39.in @@ -0,0 +1,5 @@ + + + 123 + + diff --git a/asn1c/tests/data-70/data-70-40-D.in b/asn1c/tests/data-70/data-70-40-D.in new file mode 100644 index 000000000..b23feff10 --- /dev/null +++ b/asn1c/tests/data-70/data-70-40-D.in @@ -0,0 +1,6 @@ + + + 123 + one two + + diff --git a/asn1c/tests/data-70/data-70-41-D.in b/asn1c/tests/data-70/data-70-41-D.in new file mode 100644 index 000000000..84e79efa2 --- /dev/null +++ b/asn1c/tests/data-70/data-70-41-D.in @@ -0,0 +1,6 @@ + + + + + + diff --git a/asn1c/tests/data-70/data-70-42-E.in b/asn1c/tests/data-70/data-70-42-E.in new file mode 100644 index 000000000..f346c9249 --- /dev/null +++ b/asn1c/tests/data-70/data-70-42-E.in @@ -0,0 +1 @@ +20040512224355Z diff --git a/asn1c/tests/data-70/data-70-43-E.in b/asn1c/tests/data-70/data-70-43-E.in new file mode 100644 index 000000000..cddc3c7fe --- /dev/null +++ b/asn1c/tests/data-70/data-70-43-E.in @@ -0,0 +1 @@ +20040512224355.123Z diff --git a/asn1c/tests/data-70/data-70-44-X.in b/asn1c/tests/data-70/data-70-44-X.in new file mode 100644 index 000000000..00d66ace7 --- /dev/null +++ b/asn1c/tests/data-70/data-70-44-X.in @@ -0,0 +1 @@ +20040512224355,123Z diff --git a/asn1c/tests/data-70/data-70-45-X.in b/asn1c/tests/data-70/data-70-45-X.in new file mode 100644 index 000000000..fb4f52402 --- /dev/null +++ b/asn1c/tests/data-70/data-70-45-X.in @@ -0,0 +1 @@ +20040512224355.120Z diff --git a/asn1c/tests/data-70/data-70-46-X.in b/asn1c/tests/data-70/data-70-46-X.in new file mode 100644 index 000000000..1b26840b5 --- /dev/null +++ b/asn1c/tests/data-70/data-70-46-X.in @@ -0,0 +1 @@ +20040512224355+0000 From 79f84707e88b3c8306cd1a1e14c2d38aea6bfe53 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 3 Jul 2005 05:21:52 +0000 Subject: [PATCH 0918/1469] tests for CXER encoding git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@918 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-70.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/asn1c/tests/check-70.c b/asn1c/tests/check-70.c index 50ef83fbd..403369e7f 100644 --- a/asn1c/tests/check-70.c +++ b/asn1c/tests/check-70.c @@ -18,6 +18,8 @@ enum expectation { EXP_OK, /* Encoding/decoding must succeed */ + EXP_CXER_EXACT, /* Encoding/decoding using CXER must be exact */ + EXP_CXER_DIFF, /* Encoding/decoding using CXER must be different */ EXP_BROKEN, /* Decoding must fail */ EXP_DIFFERENT, /* Reconstruction will yield different encoding */ }; @@ -44,6 +46,7 @@ _buf_writer(const void *buffer, size_t size, void *app_key) { enum der_or_xer { AS_DER, AS_XER, + AS_CXER, }; static void @@ -64,6 +67,10 @@ save_object_as(PDU_t *st, enum der_or_xer how) { rval = xer_encode(&asn_DEF_PDU, st, XER_F_BASIC, _buf_writer, 0); break; + case AS_CXER: + rval = xer_encode(&asn_DEF_PDU, st, XER_F_CANONICAL, + _buf_writer, 0); + break; } if (rval.encoded == -1) { fprintf(stderr, @@ -197,7 +204,10 @@ process_XER_data(enum expectation expectation, char *fbuf, int size) { st = load_object_from(expectation, buf, buf_offset, AS_DER); assert(st); - save_object_as(st, AS_XER); + save_object_as(st, + (expectation == EXP_CXER_EXACT + || expectation == EXP_CXER_DIFF) + ? AS_CXER : AS_XER); fprintf(stderr, "=== original ===\n"); fwrite(fbuf, 1, size, stderr); fprintf(stderr, "=== re-encoded ===\n"); @@ -211,6 +221,16 @@ process_XER_data(enum expectation expectation, char *fbuf, int size) { case EXP_BROKEN: assert(!xer_encoding_equal(fbuf, size, buf, buf_offset)); break; + case EXP_CXER_EXACT: + buf[buf_offset++] = '\n'; + assert(size == buf_offset); + assert(memcmp(fbuf, buf, size) == 0); + break; + case EXP_CXER_DIFF: + buf[buf_offset++] = '\n'; + assert(size != buf_offset + || memcmp(fbuf, buf, size)); + break; case EXP_OK: assert(xer_encoding_equal(fbuf, size, buf, buf_offset)); break; @@ -239,6 +259,10 @@ process(const char *fname) { expectation = EXP_BROKEN; break; case 'D': /* Reconstructing should yield different data */ expectation = EXP_DIFFERENT; break; + case 'E': /* Byte to byte exact reconstruction */ + expectation = EXP_CXER_EXACT; break; + case 'X': /* Should fail byte-to-byte comparison */ + expectation = EXP_CXER_DIFF; break; default: expectation = EXP_OK; break; } @@ -271,8 +295,10 @@ main() { /* Process a specific test file */ str = getenv("DATA_70_FILE"); - if(str && strncmp(str, "data-70-", 8) == 0) + if(str && strncmp(str, "data-70-", 8) == 0) { process(str); + return 0; + } dir = opendir("../data-70"); assert(dir); From 4c255bbde1c793dee25b03fa1cd1f998d80444a5 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 3 Jul 2005 05:25:09 +0000 Subject: [PATCH 0919/1469] actually, correct git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@919 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/data-70/data-70-20-D.in | 6 ++++++ asn1c/tests/data-70/data-70-22-D.in | 7 +++++++ 2 files changed, 13 insertions(+) create mode 100644 asn1c/tests/data-70/data-70-20-D.in create mode 100644 asn1c/tests/data-70/data-70-22-D.in diff --git a/asn1c/tests/data-70/data-70-20-D.in b/asn1c/tests/data-70/data-70-20-D.in new file mode 100644 index 000000000..33920d803 --- /dev/null +++ b/asn1c/tests/data-70/data-70-20-D.in @@ -0,0 +1,6 @@ + + + 123 + one two + + diff --git a/asn1c/tests/data-70/data-70-22-D.in b/asn1c/tests/data-70/data-70-22-D.in new file mode 100644 index 000000000..2a12a5a72 --- /dev/null +++ b/asn1c/tests/data-70/data-70-22-D.in @@ -0,0 +1,7 @@ + + + 0 + in improper place + one two + + From 1a9741ee996923b212f328fac00ea41f28baa5aa Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 3 Jul 2005 05:27:19 +0000 Subject: [PATCH 0920/1469] new tests for parametrization git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@920 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/70-xer-test-OK.asn1 | 8 + tests/70-xer-test-OK.asn1.-EF | 14 +- tests/70-xer-test-OK.asn1.-P | 147 ++++++++-- tests/84-param-tags-OK.asn1 | 41 +++ tests/84-param-tags-OK.asn1.-EF | 39 +++ tests/84-param-tags-OK.asn1.-P | 468 ++++++++++++++++++++++++++++++++ 6 files changed, 691 insertions(+), 26 deletions(-) create mode 100644 tests/84-param-tags-OK.asn1 create mode 100644 tests/84-param-tags-OK.asn1.-EF create mode 100644 tests/84-param-tags-OK.asn1.-P diff --git a/tests/70-xer-test-OK.asn1 b/tests/70-xer-test-OK.asn1 index 60fe5a499..1a19ca26d 100644 --- a/tests/70-xer-test-OK.asn1 +++ b/tests/70-xer-test-OK.asn1 @@ -22,6 +22,7 @@ BEGIN sequenceOf SequenceOf, extensibleSet ExtensibleSet, extensibleSequence ExtensibleSequence, + extensibleSequence2 ExtensibleSequence2, setOfNULL SetOfNULL, setOfEnums SetOfEnums, seqOfZuka SeqOfZuka, @@ -47,6 +48,13 @@ BEGIN } ExtensibleSequence ::= SEQUENCE { + string UTF8String OPTIONAL, + ..., + integer INTEGER OPTIONAL, + gtime GeneralizedTime + } + + ExtensibleSequence2 ::= SEQUENCE { string UTF8String OPTIONAL, ..., integer INTEGER OPTIONAL diff --git a/tests/70-xer-test-OK.asn1.-EF b/tests/70-xer-test-OK.asn1.-EF index ecc230969..adc34d4bf 100644 --- a/tests/70-xer-test-OK.asn1.-EF +++ b/tests/70-xer-test-OK.asn1.-EF @@ -10,9 +10,10 @@ PDU ::= CHOICE { sequenceOf [3] IMPLICIT SequenceOf, extensibleSet [4] IMPLICIT ExtensibleSet, extensibleSequence [5] IMPLICIT ExtensibleSequence, - setOfNULL [6] IMPLICIT SetOfNULL, - setOfEnums [7] IMPLICIT SetOfEnums, - seqOfZuka [8] IMPLICIT SeqOfZuka, + extensibleSequence2 [6] IMPLICIT ExtensibleSequence2, + setOfNULL [7] IMPLICIT SetOfNULL, + setOfEnums [8] IMPLICIT SetOfEnums, + seqOfZuka [9] IMPLICIT SeqOfZuka, ... } @@ -38,6 +39,13 @@ ExtensibleSet ::= SET { } ExtensibleSequence ::= SEQUENCE { + string [0] IMPLICIT UTF8String OPTIONAL, + ..., + integer [1] IMPLICIT INTEGER OPTIONAL, + gtime [2] IMPLICIT GeneralizedTime +} + +ExtensibleSequence2 ::= SEQUENCE { string [0] IMPLICIT UTF8String OPTIONAL, ..., integer [1] IMPLICIT INTEGER OPTIONAL diff --git a/tests/70-xer-test-OK.asn1.-P b/tests/70-xer-test-OK.asn1.-P index 8186e9afe..26c651a86 100644 --- a/tests/70-xer-test-OK.asn1.-P +++ b/tests/70-xer-test-OK.asn1.-P @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -22,6 +23,7 @@ typedef enum PDU_PR { PDU_PR_sequenceOf, PDU_PR_extensibleSet, PDU_PR_extensibleSequence, + PDU_PR_extensibleSequence2, PDU_PR_setOfNULL, PDU_PR_setOfEnums, PDU_PR_seqOfZuka, @@ -39,6 +41,7 @@ typedef struct PDU { SequenceOf_t sequenceOf; ExtensibleSet_t extensibleSet; ExtensibleSequence_t extensibleSequence; + ExtensibleSequence2_t extensibleSequence2; SetOfNULL_t setOfNULL; SetOfEnums_t setOfEnums; SeqOfZuka_t seqOfZuka; @@ -101,22 +104,29 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .memb_constraints = 0, /* Defer constraints checking to the member type */ .name = "extensibleSequence" }, - { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.setOfNULL), + { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.extensibleSequence2), .tag = (ASN_TAG_CLASS_CONTEXT | (6 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn_DEF_ExtensibleSequence2, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "extensibleSequence2" + }, + { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.setOfNULL), + .tag = (ASN_TAG_CLASS_CONTEXT | (7 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ .type = (void *)&asn_DEF_SetOfNULL, .memb_constraints = 0, /* Defer constraints checking to the member type */ .name = "setOfNULL" }, { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.setOfEnums), - .tag = (ASN_TAG_CLASS_CONTEXT | (7 << 2)), + .tag = (ASN_TAG_CLASS_CONTEXT | (8 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = (void *)&asn_DEF_SetOfEnums, .memb_constraints = 0, /* Defer constraints checking to the member type */ .name = "setOfEnums" }, { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.seqOfZuka), - .tag = (ASN_TAG_CLASS_CONTEXT | (8 << 2)), + .tag = (ASN_TAG_CLASS_CONTEXT | (9 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = (void *)&asn_DEF_SeqOfZuka, .memb_constraints = 0, /* Defer constraints checking to the member type */ @@ -130,9 +140,10 @@ static asn_TYPE_tag2member_t asn_MAP_PDU_1_tag2el[] = { { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* sequenceOf at 22 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* extensibleSet at 23 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* extensibleSequence at 24 */ - { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* setOfNULL at 25 */ - { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* setOfEnums at 26 */ - { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 } /* seqOfZuka at 27 */ + { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* extensibleSequence2 at 25 */ + { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* setOfNULL at 26 */ + { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 }, /* setOfEnums at 27 */ + { (ASN_TAG_CLASS_CONTEXT | (9 << 2)), 9, 0, 0 } /* seqOfZuka at 28 */ }; static asn_CHOICE_specifics_t asn_SPC_PDU_1_specs = { sizeof(struct PDU), @@ -140,7 +151,7 @@ static asn_CHOICE_specifics_t asn_SPC_PDU_1_specs = { offsetof(struct PDU, present), sizeof(((struct PDU *)0)->present), asn_MAP_PDU_1_tag2el, - 9, /* Count of tags in the map */ + 10, /* Count of tags in the map */ 1 /* Whether extensible */ }; asn_TYPE_descriptor_t asn_DEF_PDU = { @@ -159,7 +170,7 @@ asn_TYPE_descriptor_t asn_DEF_PDU = { 0, /* No tags (pointer) */ 0, /* No tags (count) */ asn_MBR_PDU_1, - 9, /* Elements count */ + 10, /* Elements count */ &asn_SPC_PDU_1_specs /* Additional specs */ }; @@ -231,10 +242,10 @@ static ber_tlv_tag_t asn_DEF_Sequence_1_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Sequence_1_tag2el[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* integer at 32 */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* sequence at 33 */ - { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* bits at 34 */ - { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* string at 35 */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* integer at 33 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* sequence at 34 */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* bits at 35 */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* string at 36 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Sequence_1_specs = { sizeof(struct Sequence), @@ -324,8 +335,8 @@ static ber_tlv_tag_t asn_DEF_Set_1_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Set_1_tag2el[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* roid at 39 */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* opaque at 40 */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* roid at 40 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* opaque at 41 */ }; static uint8_t asn_MAP_Set_1_mmap[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = { (1 << 7) | (0 << 6) @@ -543,8 +554,8 @@ static ber_tlv_tag_t asn_DEF_ExtensibleSet_1_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_ExtensibleSet_1_tag2el[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* string at 44 */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* enum at 46 */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* string at 45 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* enum at 47 */ }; static uint8_t asn_MAP_ExtensibleSet_1_mmap[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = { (0 << 7) | (0 << 6) @@ -587,6 +598,7 @@ asn_TYPE_descriptor_t asn_DEF_ExtensibleSet = { #include #include +#include #include /*** <<< TYPE-DECLS [ExtensibleSequence] >>> ***/ @@ -598,6 +610,7 @@ typedef struct ExtensibleSequence { * possible extensions are below. */ INTEGER_t *integer /* OPTIONAL */; + GeneralizedTime_t *gtime; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; @@ -610,35 +623,43 @@ extern asn_TYPE_descriptor_t asn_DEF_ExtensibleSequence; /*** <<< STAT-DEFS [ExtensibleSequence] >>> ***/ static asn_TYPE_member_t asn_MBR_ExtensibleSequence_1[] = { - { ATF_POINTER, 2, offsetof(struct ExtensibleSequence, string), + { ATF_POINTER, 3, offsetof(struct ExtensibleSequence, string), .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = (void *)&asn_DEF_UTF8String, .memb_constraints = 0, /* Defer constraints checking to the member type */ .name = "string" }, - { ATF_POINTER, 1, offsetof(struct ExtensibleSequence, integer), + { ATF_POINTER, 2, offsetof(struct ExtensibleSequence, integer), .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = (void *)&asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ .name = "integer" }, + { ATF_POINTER, 0, offsetof(struct ExtensibleSequence, gtime), + .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn_DEF_GeneralizedTime, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "gtime" + }, }; static ber_tlv_tag_t asn_DEF_ExtensibleSequence_1_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_ExtensibleSequence_1_tag2el[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* string at 50 */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* integer at 52 */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* string at 51 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* integer at 53 */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* gtime at 54 */ }; static asn_SEQUENCE_specifics_t asn_SPC_ExtensibleSequence_1_specs = { sizeof(struct ExtensibleSequence), offsetof(struct ExtensibleSequence, _asn_ctx), asn_MAP_ExtensibleSequence_1_tag2el, - 2, /* Count of tags in the map */ + 3, /* Count of tags in the map */ 0, /* Start extensions */ - 3 /* Stop extensions */ + 4 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_ExtensibleSequence = { "ExtensibleSequence", @@ -658,11 +679,91 @@ asn_TYPE_descriptor_t asn_DEF_ExtensibleSequence = { sizeof(asn_DEF_ExtensibleSequence_1_tags) /sizeof(asn_DEF_ExtensibleSequence_1_tags[0]), /* 1 */ asn_MBR_ExtensibleSequence_1, - 2, /* Elements count */ + 3, /* Elements count */ &asn_SPC_ExtensibleSequence_1_specs /* Additional specs */ }; +/*** <<< INCLUDES [ExtensibleSequence2] >>> ***/ + +#include +#include +#include + +/*** <<< TYPE-DECLS [ExtensibleSequence2] >>> ***/ + +typedef struct ExtensibleSequence2 { + UTF8String_t *string /* OPTIONAL */; + /* + * This type is extensible, + * possible extensions are below. + */ + INTEGER_t *integer /* OPTIONAL */; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ExtensibleSequence2_t; + +/*** <<< FUNC-DECLS [ExtensibleSequence2] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_ExtensibleSequence2; + +/*** <<< STAT-DEFS [ExtensibleSequence2] >>> ***/ + +static asn_TYPE_member_t asn_MBR_ExtensibleSequence2_1[] = { + { ATF_POINTER, 2, offsetof(struct ExtensibleSequence2, string), + .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn_DEF_UTF8String, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "string" + }, + { ATF_POINTER, 1, offsetof(struct ExtensibleSequence2, integer), + .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn_DEF_INTEGER, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "integer" + }, +}; +static ber_tlv_tag_t asn_DEF_ExtensibleSequence2_1_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_TYPE_tag2member_t asn_MAP_ExtensibleSequence2_1_tag2el[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* string at 58 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* integer at 60 */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_ExtensibleSequence2_1_specs = { + sizeof(struct ExtensibleSequence2), + offsetof(struct ExtensibleSequence2, _asn_ctx), + asn_MAP_ExtensibleSequence2_1_tag2el, + 2, /* Count of tags in the map */ + 0, /* Start extensions */ + 3 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_ExtensibleSequence2 = { + "ExtensibleSequence2", + "ExtensibleSequence2", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_ExtensibleSequence2_1_tags, + sizeof(asn_DEF_ExtensibleSequence2_1_tags) + /sizeof(asn_DEF_ExtensibleSequence2_1_tags[0]), /* 1 */ + asn_DEF_ExtensibleSequence2_1_tags, /* Same as above */ + sizeof(asn_DEF_ExtensibleSequence2_1_tags) + /sizeof(asn_DEF_ExtensibleSequence2_1_tags[0]), /* 1 */ + asn_MBR_ExtensibleSequence2_1, + 2, /* Elements count */ + &asn_SPC_ExtensibleSequence2_1_specs /* Additional specs */ +}; + + /*** <<< INCLUDES [SetOf] >>> ***/ #include diff --git a/tests/84-param-tags-OK.asn1 b/tests/84-param-tags-OK.asn1 new file mode 100644 index 000000000..3cedc419a --- /dev/null +++ b/tests/84-param-tags-OK.asn1 @@ -0,0 +1,41 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .84 1 +-- .84 2 + +ModuleTestParametrizationTags1 + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 84 1 } + DEFINITIONS ::= +BEGIN + + TestType {Parameter} ::= SEQUENCE { + common Parameter DEFAULT 0 + } + + TestChoice ::= CHOICE { + type1 TestType {INTEGER (1..10)}, + type2 [0] IMPLICIT TestType {BOOLEAN} + } + +END + +ModuleTestParametrizationTagsAuto2 + { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 84 2 } + DEFINITIONS AUTOMATIC TAGS ::= +BEGIN + + AutoType {Parameter} ::= SEQUENCE { + common Parameter (0) + } + + AutoChoice ::= CHOICE { + type1 AutoType {INTEGER (0..1)}, + type2 AutoType {BOOLEAN} + } + +END diff --git a/tests/84-param-tags-OK.asn1.-EF b/tests/84-param-tags-OK.asn1.-EF new file mode 100644 index 000000000..0a902fb07 --- /dev/null +++ b/tests/84-param-tags-OK.asn1.-EF @@ -0,0 +1,39 @@ +ModuleTestParametrizationTags1 { iso org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 84 1 } +DEFINITIONS ::= +BEGIN + +TestType{Parameter} ::= SEQUENCE { + common Parameter DEFAULT 0 +} + +TestChoice ::= CHOICE { + type1 SEQUENCE { + common INTEGER (1..10) DEFAULT 0 + }, + type2 [0] IMPLICIT SEQUENCE { + common BOOLEAN DEFAULT 0 + } +} + +END + +ModuleTestParametrizationTagsAuto2 { iso org(3) dod(6) internet(1) private(4) + enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 84 2 } +DEFINITIONS AUTOMATIC TAGS ::= +BEGIN + +AutoType{Parameter} ::= SEQUENCE { + common Parameter (0) +} + +AutoChoice ::= CHOICE { + type1 [0] IMPLICIT SEQUENCE { + common [0] IMPLICIT INTEGER ((0..1))((0)) + }, + type2 [1] IMPLICIT SEQUENCE { + common [0] IMPLICIT BOOLEAN (0) + } +} + +END diff --git a/tests/84-param-tags-OK.asn1.-P b/tests/84-param-tags-OK.asn1.-P new file mode 100644 index 000000000..b191b564e --- /dev/null +++ b/tests/84-param-tags-OK.asn1.-P @@ -0,0 +1,468 @@ + +/*** <<< INCLUDES [TestChoice] >>> ***/ + +#include +#include +#include +#include + +/*** <<< DEPS [TestChoice] >>> ***/ + +typedef enum TestChoice_PR { + TestChoice_PR_NOTHING, /* No components present */ + TestChoice_PR_type1, + TestChoice_PR_type2, +} TestChoice_PR; + +/*** <<< TYPE-DECLS [TestChoice] >>> ***/ + +typedef struct TestChoice { + TestChoice_PR present; + union { + struct type1 { + INTEGER_t *common /* DEFAULT 0 */; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } type1; + struct type2 { + BOOLEAN_t *common /* DEFAULT 0 */; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } type2; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} TestChoice_t; + +/*** <<< FUNC-DECLS [TestChoice] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_TestChoice; + +/*** <<< CODE [TestChoice] >>> ***/ + +static int +memb_common_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= 1 && value <= 10)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + + +/*** <<< STAT-DEFS [TestChoice] >>> ***/ + +static asn_TYPE_member_t asn_MBR_type1_2[] = { + { ATF_POINTER, 1, offsetof(struct type1, common), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = (void *)&asn_DEF_INTEGER, + .memb_constraints = memb_common_2_constraint, + .name = "common" + }, +}; +static ber_tlv_tag_t asn_DEF_type1_2_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_TYPE_tag2member_t asn_MAP_type1_2_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 } /* common at 20 */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_type1_2_specs = { + sizeof(struct type1), + offsetof(struct type1, _asn_ctx), + asn_MAP_type1_2_tag2el, + 1, /* Count of tags in the map */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_type1_2 = { + "type1", + "type1", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_type1_2_tags, + sizeof(asn_DEF_type1_2_tags) + /sizeof(asn_DEF_type1_2_tags[0]), /* 1 */ + asn_DEF_type1_2_tags, /* Same as above */ + sizeof(asn_DEF_type1_2_tags) + /sizeof(asn_DEF_type1_2_tags[0]), /* 1 */ + asn_MBR_type1_2, + 1, /* Elements count */ + &asn_SPC_type1_2_specs /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_type2_4[] = { + { ATF_POINTER, 1, offsetof(struct type2, common), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), + .tag_mode = 0, + .type = (void *)&asn_DEF_BOOLEAN, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "common" + }, +}; +static ber_tlv_tag_t asn_DEF_type2_4_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_TYPE_tag2member_t asn_MAP_type2_4_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 0, 0, 0 } /* common at 21 */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_type2_4_specs = { + sizeof(struct type2), + offsetof(struct type2, _asn_ctx), + asn_MAP_type2_4_tag2el, + 1, /* Count of tags in the map */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_type2_4 = { + "type2", + "type2", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_type2_4_tags, + sizeof(asn_DEF_type2_4_tags) + /sizeof(asn_DEF_type2_4_tags[0]) - 1, /* 1 */ + asn_DEF_type2_4_tags, /* Same as above */ + sizeof(asn_DEF_type2_4_tags) + /sizeof(asn_DEF_type2_4_tags[0]), /* 2 */ + asn_MBR_type2_4, + 1, /* Elements count */ + &asn_SPC_type2_4_specs /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_TestChoice_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct TestChoice, choice.type1), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + .tag_mode = 0, + .type = (void *)&asn_DEF_type1_2, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "type1" + }, + { ATF_NOFLAGS, 0, offsetof(struct TestChoice, choice.type2), + .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn_DEF_type2_4, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "type2" + }, +}; +static asn_TYPE_tag2member_t asn_MAP_TestChoice_1_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 }, /* type1 at 16 */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 } /* type2 at 16 */ +}; +static asn_CHOICE_specifics_t asn_SPC_TestChoice_1_specs = { + sizeof(struct TestChoice), + offsetof(struct TestChoice, _asn_ctx), + offsetof(struct TestChoice, present), + sizeof(((struct TestChoice *)0)->present), + asn_MAP_TestChoice_1_tag2el, + 2, /* Count of tags in the map */ + 0 /* Whether extensible */ +}; +asn_TYPE_descriptor_t asn_DEF_TestChoice = { + "TestChoice", + "TestChoice", + CHOICE_free, + CHOICE_print, + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_decode_xer, + CHOICE_encode_xer, + CHOICE_outmost_tag, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + asn_MBR_TestChoice_1, + 2, /* Elements count */ + &asn_SPC_TestChoice_1_specs /* Additional specs */ +}; + + +/*** <<< INCLUDES [AutoChoice] >>> ***/ + +#include +#include +#include +#include + +/*** <<< DEPS [AutoChoice] >>> ***/ + +typedef enum AutoChoice_PR { + AutoChoice_PR_NOTHING, /* No components present */ + AutoChoice_PR_type1, + AutoChoice_PR_type2, +} AutoChoice_PR; + +/*** <<< TYPE-DECLS [AutoChoice] >>> ***/ + +typedef struct AutoChoice { + AutoChoice_PR present; + union { + struct type1 { + INTEGER_t common; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } type1; + struct type2 { + BOOLEAN_t common; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } type2; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} AutoChoice_t; + +/*** <<< FUNC-DECLS [AutoChoice] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_AutoChoice; + +/*** <<< CODE [AutoChoice] >>> ***/ + +static int +memb_common_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value == 0)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_common_4_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + BOOLEAN_t value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = (*(const long *)sptr) ? 1 : 0; + + if((value <= 0)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + + +/*** <<< STAT-DEFS [AutoChoice] >>> ***/ + +static asn_TYPE_member_t asn_MBR_type1_2[] = { + { ATF_NOFLAGS, 0, offsetof(struct type1, common), + .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn_DEF_INTEGER, + .memb_constraints = memb_common_2_constraint, + .name = "common" + }, +}; +static ber_tlv_tag_t asn_DEF_type1_2_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_TYPE_tag2member_t asn_MAP_type1_2_tag2el[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* common at 37 */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_type1_2_specs = { + sizeof(struct type1), + offsetof(struct type1, _asn_ctx), + asn_MAP_type1_2_tag2el, + 1, /* Count of tags in the map */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_type1_2 = { + "type1", + "type1", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_type1_2_tags, + sizeof(asn_DEF_type1_2_tags) + /sizeof(asn_DEF_type1_2_tags[0]) - 1, /* 1 */ + asn_DEF_type1_2_tags, /* Same as above */ + sizeof(asn_DEF_type1_2_tags) + /sizeof(asn_DEF_type1_2_tags[0]), /* 2 */ + asn_MBR_type1_2, + 1, /* Elements count */ + &asn_SPC_type1_2_specs /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_type2_4[] = { + { ATF_NOFLAGS, 0, offsetof(struct type2, common), + .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn_DEF_BOOLEAN, + .memb_constraints = memb_common_4_constraint, + .name = "common" + }, +}; +static ber_tlv_tag_t asn_DEF_type2_4_tags[] = { + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_TYPE_tag2member_t asn_MAP_type2_4_tag2el[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* common at 38 */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_type2_4_specs = { + sizeof(struct type2), + offsetof(struct type2, _asn_ctx), + asn_MAP_type2_4_tag2el, + 1, /* Count of tags in the map */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_type2_4 = { + "type2", + "type2", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_type2_4_tags, + sizeof(asn_DEF_type2_4_tags) + /sizeof(asn_DEF_type2_4_tags[0]) - 1, /* 1 */ + asn_DEF_type2_4_tags, /* Same as above */ + sizeof(asn_DEF_type2_4_tags) + /sizeof(asn_DEF_type2_4_tags[0]), /* 2 */ + asn_MBR_type2_4, + 1, /* Elements count */ + &asn_SPC_type2_4_specs /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_AutoChoice_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct AutoChoice, choice.type1), + .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn_DEF_type1_2, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "type1" + }, + { ATF_NOFLAGS, 0, offsetof(struct AutoChoice, choice.type2), + .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = (void *)&asn_DEF_type2_4, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "type2" + }, +}; +static asn_TYPE_tag2member_t asn_MAP_AutoChoice_1_tag2el[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* type1 at 34 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* type2 at 34 */ +}; +static asn_CHOICE_specifics_t asn_SPC_AutoChoice_1_specs = { + sizeof(struct AutoChoice), + offsetof(struct AutoChoice, _asn_ctx), + offsetof(struct AutoChoice, present), + sizeof(((struct AutoChoice *)0)->present), + asn_MAP_AutoChoice_1_tag2el, + 2, /* Count of tags in the map */ + 0 /* Whether extensible */ +}; +asn_TYPE_descriptor_t asn_DEF_AutoChoice = { + "AutoChoice", + "AutoChoice", + CHOICE_free, + CHOICE_print, + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_decode_xer, + CHOICE_encode_xer, + CHOICE_outmost_tag, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + asn_MBR_AutoChoice_1, + 2, /* Elements count */ + &asn_SPC_AutoChoice_1_specs /* Additional specs */ +}; + From 4df95e540ba3c8984e41016759e3aa431b1a7109 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 3 Jul 2005 05:28:29 +0000 Subject: [PATCH 0921/1469] avoid gcc 4.x warnings git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@921 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_codecs_prim.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/skeletons/asn_codecs_prim.c b/skeletons/asn_codecs_prim.c index 4c66f39ae..b599bdfae 100644 --- a/skeletons/asn_codecs_prim.c +++ b/skeletons/asn_codecs_prim.c @@ -119,7 +119,8 @@ der_encode_primitive(asn_TYPE_descriptor_t *td, void *sptr, } erval.encoded += st->size; - + erval.structure_ptr = 0; + erval.failed_type = 0; return erval; } From 9f6366449df5b3b94966df2e4fa1fd6f8babfcd9 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 3 Jul 2005 05:29:36 +0000 Subject: [PATCH 0922/1469] stricter encoding git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@922 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/UTCTime.c | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c index e650b7449..c2079fbdc 100644 --- a/skeletons/UTCTime.c +++ b/skeletons/UTCTime.c @@ -8,7 +8,7 @@ #include #include -#ifndef __NO_ASN_TABLE__ +#ifndef __ASN_INTERNAL_TEST_MODE__ /* * UTCTime basic type description. @@ -39,7 +39,7 @@ asn_TYPE_descriptor_t asn_DEF_UTCTime = { 0 /* No specifics */ }; -#endif /* __NO_ASN_TABLE__ */ +#endif /* __ASN_INTERNAL_TEST_MODE__ */ /* * Check that the time looks like the time. @@ -62,36 +62,39 @@ UTCTime_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return 0; } +#ifndef __ASN_INTERNAL_TEST_MODE__ + asn_enc_rval_t UTCTime_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { - OCTET_STRING_t st; if(flags & XER_F_CANONICAL) { - char buf[32]; + asn_enc_rval_t rv; + UTCTime_t *ut; struct tm tm; - ssize_t ret; errno = EPERM; if(asn_UT2time((UTCTime_t *)sptr, &tm, 1) == -1 && errno != EPERM) _ASN_ENCODE_FAILED; - - ret = snprintf(buf, sizeof(buf), "%02d%02d%02d%02d%02d%02dZ", - tm.tm_year % 100, tm.tm_mon + 1, tm.tm_mday, - tm.tm_hour, tm.tm_min, tm.tm_sec); - assert(ret > 0 && ret < (int)sizeof(buf)); - - st.buf = (uint8_t *)buf; - st.size = ret; - sptr = &st; - } - return OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags, - cb, app_key); + /* Fractions are not allowed in UTCTime */ + ut = asn_time2GT(0, 0, 1); + if(!ut) _ASN_ENCODE_FAILED; + + rv = OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags, + cb, app_key); + OCTET_STRING_free(&asn_DEF_UTCTime, ut, 0); + return rv; + } else { + return OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags, + cb, app_key); + } } +#endif /* __ASN_INTERNAL_TEST_MODE__ */ + int UTCTime_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { @@ -110,7 +113,7 @@ UTCTime_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, return (cb("", 11, app_key) < 0) ? -1 : 0; ret = snprintf(buf, sizeof(buf), - "%04d-%02d-%02d %02d:%02d%02d (GMT)", + "%04d-%02d-%02d %02d:%02d:%02d (GMT)", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); assert(ret > 0 && ret < (int)sizeof(buf)); @@ -122,11 +125,11 @@ UTCTime_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, time_t asn_UT2time(const UTCTime_t *st, struct tm *_tm, int as_gmt) { - char buf[17+2]; /* "AAMMJJhhmmss+hhmm" = 17, + 2 = 19 */ + char buf[24]; /* "AAMMJJhhmmss+hhmm" + cushion */ GeneralizedTime_t gt; if(!st || !st->buf - || st->size < 11 || st->size > ((int)sizeof(buf) - 2)) { + || st->size < 11 || st->size >= ((int)sizeof(buf) - 2)) { errno = EINVAL; return -1; } From 6b11c60e605c18c4aba47a102ce97d760a749b98 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 3 Jul 2005 05:30:15 +0000 Subject: [PATCH 0923/1469] removed wild guessed gcc warning git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@923 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OCTET_STRING.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 19ae95dbf..581845595 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -927,7 +927,11 @@ OS__strtoent(int base, const char *buf, const char *end, int32_t *ret_value) { for(p = buf; p < end; p++) { int ch = *p; - if((val * base + base) < 0) return -1; /* Strange huge value */ + + /* Strange huge value */ + if((val * base + base) < 0) + return -1; + switch(ch) { case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: /*01234*/ case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: /*56789*/ @@ -949,7 +953,7 @@ OS__strtoent(int base, const char *buf, const char *end, int32_t *ret_value) { } } - /* Do not return value. It's an error we're talking about here. */ + *ret_value = -1; return (p - buf); } From d960a86991f2625fdd7e2cd22f9e8208c2fc8a45 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 3 Jul 2005 05:31:02 +0000 Subject: [PATCH 0924/1469] better handling of not-yet-present extensions git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@924 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SEQUENCE.c | 72 ++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 32 deletions(-) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index f5c33da87..aefd94b5d 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -764,46 +764,54 @@ SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, case XCT_UNKNOWN_OP: case XCT_UNKNOWN_BO: - ASN_DEBUG("XER/SEQUENCE: tcv=%d, ph=%d", - tcv, ctx->phase); - if(ctx->phase != 1 - || edx >= td->elements_count) + ASN_DEBUG("XER/SEQUENCE: tcv=%d, ph=%d, edx=%d", + tcv, ctx->phase, edx); + if(ctx->phase != 1) { break; /* Really unexpected */ + } - /* - * Search which member corresponds to this tag. - */ - edx_end = edx + elements[edx].optional + 1; - if(edx_end > td->elements_count) - edx_end = td->elements_count; - for(n = edx; n < edx_end; n++) { - elm = &td->elements[n]; - tcv = xer_check_tag(buf_ptr,ch_size,elm->name); - switch(tcv) { - case XCT_BOTH: - case XCT_OPENING: - /* - * Process this member. - */ - ctx->step = edx = n; - ctx->phase = 2; + if(edx < td->elements_count) { + /* + * Search which member corresponds to this tag. + */ + edx_end = edx + elements[edx].optional + 1; + if(edx_end > td->elements_count) + edx_end = td->elements_count; + for(n = edx; n < edx_end; n++) { + elm = &td->elements[n]; + tcv = xer_check_tag(buf_ptr, + ch_size, elm->name); + switch(tcv) { + case XCT_BOTH: + case XCT_OPENING: + /* + * Process this member. + */ + ctx->step = edx = n; + ctx->phase = 2; + break; + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + continue; + default: + n = edx_end; + break; /* Phase out */ + } break; - case XCT_UNKNOWN_OP: - case XCT_UNKNOWN_BO: - continue; - default: - n = edx_end; - break; /* Phase out */ } - break; + if(n != edx_end) + continue; + } else { + ASN_DEBUG("Out of defined members: %d/%d", + edx, td->elements_count); } - if(n != edx_end) - continue; /* It is expected extension */ if(IN_EXTENSION_GROUP(specs, - edx + elements[edx].optional)) { - ASN_DEBUG("Got anticipated extension at %d", edx); + edx + (edx < td->elements_count + ? elements[edx].optional : 0))) { + ASN_DEBUG("Got anticipated extension at %d", + edx); /* * Check for (XCT_BOTH or XCT_UNKNOWN_BO) * By using a mask. Only record a pure From 5ea810e1af6f4de2ff04e92cd92ae8dfa03f5cb1 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 3 Jul 2005 05:32:40 +0000 Subject: [PATCH 0925/1469] API extended to support fractions of seconds git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@925 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/GeneralizedTime.c | 166 ++++++++++++++++-------- skeletons/GeneralizedTime.h | 13 +- skeletons/tests/check-GeneralizedTime.c | 113 +++++++++++----- skeletons/tests/check-UTCTime.c | 5 +- skeletons/tests/check-UTF8String.c | 2 +- 5 files changed, 204 insertions(+), 95 deletions(-) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 770a30438..45a082bd3 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -108,7 +108,7 @@ static time_t timegm(struct tm *tm) { #endif /* _EMULATE_TIMEGM */ -#ifndef __NO_ASN_TABLE__ +#ifndef __ASN_INTERNAL_TEST_MODE__ /* * GeneralizedTime basic type description. @@ -139,7 +139,7 @@ asn_TYPE_descriptor_t asn_DEF_GeneralizedTime = { 0 /* No specifics */ }; -#endif /* __NO_ASN_TABLE__ */ +#endif /* __ASN_INTERNAL_TEST_MODE__ */ /* * Check that the time looks like the time. @@ -163,76 +163,70 @@ GeneralizedTime_constraint(asn_TYPE_descriptor_t *td, const void *sptr, } asn_enc_rval_t -GeneralizedTime_encode_der(asn_TYPE_descriptor_t *td, void *ptr, +GeneralizedTime_encode_der(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - GeneralizedTime_t *st = (GeneralizedTime_t *)ptr; + GeneralizedTime_t *st = (GeneralizedTime_t *)sptr; asn_enc_rval_t erval; + long fv, fb; /* seconds fraction value and base */ + struct tm tm; + time_t tloc; - /* If not canonical DER, re-encode into canonical DER. */ - if(st->size && st->buf[st->size-1] != 0x5a) { - struct tm tm; - time_t tloc; + /* + * Encode as a canonical DER. + */ + errno = EPERM; + tloc = asn_GT2time_frac(st, &fv, &fb, &tm, 1); /* Recognize time */ + if(tloc == -1 && errno != EPERM) + /* Failed to recognize time. Fail completely. */ + _ASN_ENCODE_FAILED; - errno = EPERM; - tloc = asn_GT2time(st, &tm, 1); /* Recognize time */ - if(tloc == -1 && errno != EPERM) { - /* Failed to recognize time. Fail completely. */ - erval.encoded = -1; - erval.failed_type = td; - erval.structure_ptr = ptr; - return erval; - } - st = asn_time2GT(0, &tm, 1); /* Save time canonically */ - if(!st) { - /* Memory allocation failure. */ - erval.encoded = -1; - erval.failed_type = td; - erval.structure_ptr = ptr; - return erval; - } - } + st = asn_time2GT_frac(0, &tm, fv, fb, 1); /* Save time canonically */ + if(!st) _ASN_ENCODE_FAILED; /* Memory allocation failure. */ erval = OCTET_STRING_encode_der(td, st, tag_mode, tag, cb, app_key); - if(st != ptr) { - FREEMEM(st->buf); - FREEMEM(st); - } + FREEMEM(st->buf); + FREEMEM(st); return erval; } +#ifndef __ASN_INTERNAL_TEST_MODE__ + asn_enc_rval_t GeneralizedTime_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { - OCTET_STRING_t st; if(flags & XER_F_CANONICAL) { - char buf[32]; + GeneralizedTime_t *gt; + asn_enc_rval_t rv; + long fv, fb; /* fractional parts */ struct tm tm; - ssize_t ret; errno = EPERM; - if(asn_GT2time((GeneralizedTime_t *)sptr, &tm, 1) == -1 + if(asn_GT2time_frac((GeneralizedTime_t *)sptr, + &fv, &fb, &tm, 1) == -1 && errno != EPERM) _ASN_ENCODE_FAILED; + + gt = asn_time2GT_frac(0, &tm, fv, fb, 1); + if(!gt) _ASN_ENCODE_FAILED; - ret = snprintf(buf, sizeof(buf), "%04d%02d%02d%02d%02d%02dZ", - tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, - tm.tm_hour, tm.tm_min, tm.tm_sec); - assert(ret > 0 && ret < (int)sizeof(buf)); - - st.buf = (uint8_t *)buf; - st.size = ret; - sptr = &st; + rv = OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags, + cb, app_key); + asn_DEF_GeneralizedTime.free_struct(&asn_DEF_GeneralizedTime, + gt, 0); + return rv; + } else { + return OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags, + cb, app_key); } - - return OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags, - cb, app_key); } +#endif /* __ASN_INTERNAL_TEST_MODE__ */ + int GeneralizedTime_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { @@ -251,7 +245,7 @@ GeneralizedTime_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, return (cb("", 11, app_key) < 0) ? -1 : 0; ret = snprintf(buf, sizeof(buf), - "%04d-%02d-%02d %02d:%02d%02d (GMT)", + "%04d-%02d-%02d %02d:%02d:%02d (GMT)", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); assert(ret > 0 && ret < (int)sizeof(buf)); @@ -263,6 +257,11 @@ GeneralizedTime_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, time_t asn_GT2time(const GeneralizedTime_t *st, struct tm *ret_tm, int as_gmt) { + return asn_GT2time_frac(st, 0, 0, ret_tm, as_gmt); +} + +time_t +asn_GT2time_frac(const GeneralizedTime_t *st, long *frac_value, long *frac_base, struct tm *ret_tm, int as_gmt) { struct tm tm_s; uint8_t *buf; uint8_t *end; @@ -270,6 +269,8 @@ asn_GT2time(const GeneralizedTime_t *st, struct tm *ret_tm, int as_gmt) { int gmtoff_m = 0; int gmtoff = 0; /* h + m */ int offset_specified = 0; + long fvalue = 0; + long fbase = 1; time_t tloc; if(!st || !st->buf) { @@ -365,13 +366,21 @@ asn_GT2time(const GeneralizedTime_t *st, struct tm *ret_tm, int as_gmt) { * ^ ^ */ switch(*buf) { - case 0x2C: case 0x2E: /* (.|,) */ - /* Fractions of seconds are not supported - * by time_t or struct tm. Skip them */ + case 0x2C: case 0x2E: /* (.|,) */ + /* + * Process fractions of seconds. + */ for(buf++; buf < end; buf++) { - switch(*buf) { + int v = *buf; + switch(v) { case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: + if((fbase * 10 / fbase) != 10) { + /* Not enough precision, ignore */ + } else { + fbase *= 10; + fvalue = fvalue * 10 + (v - 0x30); + } continue; default: break; @@ -479,15 +488,29 @@ asn_GT2time(const GeneralizedTime_t *st, struct tm *ret_tm, int as_gmt) { } } + /* Fractions of seconds */ + if(frac_value) *frac_value = fvalue; + if(frac_base) *frac_base = fbase; + return tloc; } - GeneralizedTime_t * asn_time2GT(GeneralizedTime_t *opt_gt, const struct tm *tm, int force_gmt) { + return asn_time2GT_frac(opt_gt, tm, 0, 0, force_gmt); +} + +GeneralizedTime_t * +asn_time2GT_frac(GeneralizedTime_t *opt_gt, const struct tm *tm, long frac_value, long frac_base, int force_gmt) { struct tm tm_s; long gmtoff; - const unsigned int buf_size = 24; /* 4+2+2 +2+2+2 +4 + cushion */ + const unsigned int buf_size = + 4 + 2 + 2 /* yyyymmdd */ + + 2 + 2 + 2 /* hhmmss */ + + 1 + 6 /* .ffffff */ + + 1 + 4 /* +hhmm */ + + 1 /* '\0' */ + ; char *buf; char *p; int size; @@ -524,17 +547,48 @@ asn_time2GT(GeneralizedTime_t *opt_gt, const struct tm *tm, int force_gmt) { tm->tm_min, tm->tm_sec ); - assert(size == 14); + if(size != 14) { + /* Could be assert(size == 14); */ + FREEMEM(buf); + errno = EINVAL; + return 0; + } p = buf + size; + + /* + * Deal with fractions. + */ + if(frac_base >= 10 && frac_value > 0) { + char *end = p + 1 + 6; /* '.' + maximum 6 digits */ + char *z; + *p++ = '.'; + do { + int digit; + frac_base /= 10; + digit = frac_value / frac_base; + frac_value %= frac_base; + *p++ = digit + 0x30; + } while(frac_base >= 10 && frac_value > 0 && p < end); + for(z = p - 1; *z == 0x30; --z); /* Strip zeroes */ + p = z + (*z != '.'); + size = p - buf; + } + if(force_gmt) { *p++ = 0x5a; /* "Z" */ *p++ = 0; size++; } else { - int ret = snprintf(p, buf_size - size, "%+03ld%02ld", - gmtoff / 3600, gmtoff % 3600); - assert(ret >= 5 && ret <= 7); + int ret; + gmtoff %= 86400; + ret = snprintf(p, buf_size - size, "%+03ld%02ld", + gmtoff / 3600, labs(gmtoff % 3600)); + if(ret != 5) { + FREEMEM(buf); + errno = EINVAL; + return 0; + } size += ret; } diff --git a/skeletons/GeneralizedTime.h b/skeletons/GeneralizedTime.h index 21a680cbf..90f7e0893 100644 --- a/skeletons/GeneralizedTime.h +++ b/skeletons/GeneralizedTime.h @@ -32,14 +32,21 @@ struct tm; /* */ time_t asn_GT2time(const GeneralizedTime_t *, struct tm *_optional_tm4fill, int as_gmt); +/* A version of the above function also returning the fractions of seconds */ +time_t asn_GT2time_frac(const GeneralizedTime_t *, + long *frac_value, long *frac_base, /* (value/base) */ + struct tm *_optional_tm4fill, int as_gmt); + /* * Convert a struct tm into GeneralizedTime. - * If __opt_gt is not given, this function will try to allocate one. + * If _optional_gt is not given, this function will try to allocate one. * If force_gmt is given, the resulting GeneralizedTime will be forced * into a GMT time zone (encoding ends with a "Z"). * On error, this function returns 0 and sets errno. */ -GeneralizedTime_t *asn_time2GT(GeneralizedTime_t *__opt_gt, const struct tm *, - int force_gmt); +GeneralizedTime_t *asn_time2GT(GeneralizedTime_t *_optional_gt, + const struct tm *, int force_gmt); +GeneralizedTime_t *asn_time2GT_frac(GeneralizedTime_t *_optional_gt, + const struct tm *, long frac_value, long frac_base, int force_gmt); #endif /* _GeneralizedTime_H_ */ diff --git a/skeletons/tests/check-GeneralizedTime.c b/skeletons/tests/check-GeneralizedTime.c index ff20772b5..abd44b0f7 100644 --- a/skeletons/tests/check-GeneralizedTime.c +++ b/skeletons/tests/check-GeneralizedTime.c @@ -1,31 +1,34 @@ -#define __NO_ASN_TABLE__ +#define __ASN_INTERNAL_TEST_MODE__ #include #include static void -check(char *time_str, time_t expect, int as_gmt) { +recognize(char *time_str, time_t expect, int as_gmt) { GeneralizedTime_t gt; struct tm tm; time_t tloc; + long fv, fb; - gt.buf = time_str; + gt.buf = (uint8_t *)time_str; gt.size = strlen(time_str); - tloc = asn_GT2time(>, &tm, as_gmt); + tloc = asn_GT2time_frac(>, &fv, &fb, &tm, as_gmt); printf("%s: [%s] -> %ld == %ld\n", as_gmt?"GMT":"ofs", time_str, (long)tloc, (long)expect); if(tloc != -1) { - printf("\t%04d-%02d-%02dT%02d:%02d:%02d%+03ld%02ld\n", + printf("\t%04d-%02d-%02dT%02d:%02d:%02d(.%ld/%ld)%+03ld%02ld\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, + fv, fb, (GMTOFF(tm) / 3600), labs(GMTOFF(tm) % 3600) ); + assert(fb < 100 || (fb % 100) == 0); } assert(tloc == expect); @@ -33,11 +36,11 @@ check(char *time_str, time_t expect, int as_gmt) { assert(tloc == -1 || as_gmt == 0 || GMTOFF(tm) == 0); #endif - if(!as_gmt) check(time_str, expect, 1); + if(!as_gmt) recognize(time_str, expect, 1); } static void -rcheck(time_t tloc, const char *expect, int force_gmt) { +encode(time_t tloc, const char *expect, int force_gmt) { GeneralizedTime_t *gt; struct tm tm, *tmp; @@ -49,51 +52,97 @@ rcheck(time_t tloc, const char *expect, int force_gmt) { assert(expect); printf("[%s] vs [%s] (%d)\n", gt->buf, expect, force_gmt); - assert(gt->size == (int)strlen(gt->buf)); - assert(!strcmp(gt->buf, expect)); + assert(gt->size == (int)strlen((char *)gt->buf)); + assert(!strcmp((char *)gt->buf, expect)); } else { assert(!expect); } } + +static void +recode(char *time_str, const char *expect) { + long frac_value, frac_base; + GeneralizedTime_t gt; + struct tm tm; + time_t tloc; + + gt.buf = (uint8_t *)time_str; + gt.size = strlen(time_str); + + tloc = asn_GT2time_frac(>, &frac_value, &frac_base, &tm, 1); + assert(tloc != -1); + + gt.buf = 0; + asn_time2GT_frac(>, &tm, frac_value, frac_base, 1); + assert(gt.buf); + + printf("[%s] => [%s] == [%s]\n", time_str, gt.buf, expect); + + assert(strcmp((char *)gt.buf, expect) == 0); + FREEMEM(gt.buf); +} + int main(int ac, char **av) { (void)av; - check("200401250", -1, 0); - check("2004012509300", -1, 0); - check("20040125093000-", -1, 0); - check("20040125093007-0", -1, 0); - check("20040125093007-080", -1, 0); - check("200401250930.01Z", -1, 0); + recognize("200401250", -1, 0); + recognize("2004012509300", -1, 0); + recognize("20040125093000-", -1, 0); + recognize("20040125093007-0", -1, 0); + recognize("20040125093007-080", -1, 0); + recognize("200401250930.01Z", -1, 0); /* These six are from X.690:11.7.5 */ - check("19920520240000Z", -1, 0); /* midnight represented incorrectly */ - //check("19920622123421.0Z", -1, 0); /* spurious trailing zeros */ - //check("19920722132100.30Z", -1, 0); /* spurious trailing zeros */ - check("19920521000000Z", 706406400, 0); - check("19920622123421Z", 709216461, 0); - check("19920722132100.3Z", 711811260, 0); + recognize("19920520240000Z", -1, 0); /* midnight represented incorrectly */ + recognize("19920622123421.0Z", 709216461, 0); /* spurious trailing zeros */ + recognize("19920722132100.30Z", 711811260, 0); /* spurious trailing zeros */ + recognize("19920521000000Z", 706406400, 0); + recognize("19920622123421Z", 709216461, 0); + recognize("19920722132100.3Z", 711811260, 0); + + recognize("20040125093007Z", 1075023007, 0); + recognize("20040125093007+00", 1075023007, 0); + recognize("20040125093007.01+0000", 1075023007, 0); + recognize("20040125093007,1+0000", 1075023007, 0); + recognize("20040125093007-0800", 1075051807, 0); - check("20040125093007Z", 1075023007, 0); - check("20040125093007+00", 1075023007, 0); - check("20040125093007.01+0000", 1075023007, 0); - check("20040125093007,1+0000", 1075023007, 0); - check("20040125093007-0800", 1075051807, 0); + recognize("19920722132100.123000123Z", 711811260, 0); + recognize("19920722132100.1230000123Z", 711811260, 0); + recognize("19920722132100.12300000123Z", 711811260, 0); - rcheck(1075023007, "20040125093007Z", 1); + encode(1075023007, "20040125093007Z", 1); if(ac > 1) { /* These will be valid only inside PST time zone */ - check("20040125093007", 1075051807, 0); - check("200401250930", 1075051800, 0); - check("20040125093000,01", 1075051800, 0); - check("20040125093000,1234", 1075051800, 0); + recognize("20040125093007", 1075051807, 0); + recognize("200401250930", 1075051800, 0); + recognize("20040125093000,01", 1075051800, 0); + recognize("20040125093000,1234", 1075051800, 0); - rcheck(1075023007, "20040125013007-0800", 0); + encode(1075023007, "20040125013007-0800", 0); + recode("20050702123312", "20050702193312Z"); } + recode("20050702123312Z", "20050702123312Z"); + recode("20050702123312+01", "20050702113312Z"); + recode("20050702123312,0+01", "20050702113312Z"); + recode("20050702123312,1+01", "20050702113312.1Z"); + recode("20050702123312.01+01", "20050702113312.01Z"); + recode("20050702123312.00+01", "20050702113312Z"); + recode("20050702123312.30+01", "20050702113312.3Z"); + recode("20050702123312,30000+01", "20050702113312.3Z"); + recode("20050702123312,300000000+01", "20050702113312.3Z"); + recode("20050702123312.123456+01", "20050702113312.123456Z"); + recode("20050702123312.1234567+01", "20050702113312.123456Z"); + recode("20050702123312.12345678+01", "20050702113312.123456Z"); + recode("20050702123312.123456789+01", "20050702113312.123456Z"); + recode("20050702123312.000001+01", "20050702113312.000001Z"); + recode("20050702123312.0000001Z", "20050702123312Z"); + recode("20050702123312.0080010+1056", "20050702013712.008001Z"); + return 0; } diff --git a/skeletons/tests/check-UTCTime.c b/skeletons/tests/check-UTCTime.c index 4c76858bb..96803ad67 100644 --- a/skeletons/tests/check-UTCTime.c +++ b/skeletons/tests/check-UTCTime.c @@ -1,6 +1,5 @@ -#define __NO_ASN_TABLE__ +#define __ASN_INTERNAL_TEST_MODE__ #include -#define __NO_ASN_TABLE__ #include #include @@ -10,7 +9,7 @@ check(char *time_str, time_t sample, int as_gmt) { struct tm tm; time_t tloc; - gt.buf = time_str; + gt.buf = (uint8_t *)time_str; gt.size = strlen(time_str); tloc = asn_UT2time(>, &tm, as_gmt); diff --git a/skeletons/tests/check-UTF8String.c b/skeletons/tests/check-UTF8String.c index ae368eab0..10592a192 100644 --- a/skeletons/tests/check-UTF8String.c +++ b/skeletons/tests/check-UTF8String.c @@ -43,7 +43,7 @@ check_speed() { int ret; int i; - st.buf = long_test; + st.buf = (uint8_t *)long_test; st.size = sizeof(long_test) - 1; ret = UTF8String_length(&st); From 50f0a17d09d2e863475d15f6d6c0d02bf15df5db Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 3 Jul 2005 05:32:55 +0000 Subject: [PATCH 0926/1469] fractions of seconds git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@926 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ChangeLog b/ChangeLog index fc9f87b51..748d602c9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,11 @@ 0.9.16: 2005-July-02 + * GeneralizedTime API now supports fractions of seconds. + Thanks to Bent Nicolaisen for support. * ASN.1 parser has been tweaked to allow parsing something like "SEQUENCE--- comment ---", which is ambiguous for many reasons. + * XER decoder better handles not-yet-defined future extensions. 0.9.15: 2005-July-02 From 9d53193a139035f81087c6f849fc63edac833ddb Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 4 Jul 2005 01:44:01 +0000 Subject: [PATCH 0927/1469] ignoring non-normalized values git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@927 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/GeneralizedTime.c | 17 +++++--- skeletons/tests/check-GeneralizedTime.c | 56 +++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 6 deletions(-) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 45a082bd3..e9aa4781b 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -559,18 +559,23 @@ asn_time2GT_frac(GeneralizedTime_t *opt_gt, const struct tm *tm, long frac_value /* * Deal with fractions. */ - if(frac_base >= 10 && frac_value > 0) { + if(frac_base >= 10 + && frac_value > 0 + /* 1001 ms? should ignore or adjust seconds */ + && (frac_value/frac_base) == 0 + ) { char *end = p + 1 + 6; /* '.' + maximum 6 digits */ - char *z; - *p++ = '.'; + char *z = p; + *z++ = '.'; + frac_value %= frac_base; do { int digit; frac_base /= 10; digit = frac_value / frac_base; frac_value %= frac_base; - *p++ = digit + 0x30; - } while(frac_base >= 10 && frac_value > 0 && p < end); - for(z = p - 1; *z == 0x30; --z); /* Strip zeroes */ + *z++ = digit + 0x30; + } while(frac_base >= 10 && frac_value > 0 && z < end); + for(--z; *z == 0x30; --z); /* Strip zeroes */ p = z + (*z != '.'); size = p - buf; } diff --git a/skeletons/tests/check-GeneralizedTime.c b/skeletons/tests/check-GeneralizedTime.c index abd44b0f7..c39904e7e 100644 --- a/skeletons/tests/check-GeneralizedTime.c +++ b/skeletons/tests/check-GeneralizedTime.c @@ -83,11 +83,67 @@ recode(char *time_str, const char *expect) { FREEMEM(gt.buf); } +static void +check_fractions() { + GeneralizedTime_t *gt = 0; + struct tm tm; + + memset(&tm, 0, sizeof tm); + tm.tm_year = 70; + tm.tm_mday = 1; + + gt = asn_time2GT_frac(gt, &tm, -1, -1, 1); + assert(gt); + printf("[%s]\n", gt->buf); + assert(strcmp((char *)gt->buf, "19700101000000Z") == 0); + + gt = asn_time2GT_frac(gt, &tm, 0, 0, 1); + assert(gt); + printf("[%s]\n", gt->buf); + assert(strcmp((char *)gt->buf, "19700101000000Z") == 0); + + gt = asn_time2GT_frac(gt, &tm, 0, -1, 1); + assert(gt); + printf("[%s]\n", gt->buf); + assert(strcmp((char *)gt->buf, "19700101000000Z") == 0); + + gt = asn_time2GT_frac(gt, &tm, -1, 0, 1); + assert(gt); + printf("[%s]\n", gt->buf); + assert(strcmp((char *)gt->buf, "19700101000000Z") == 0); + + gt = asn_time2GT_frac(gt, &tm, 10, 0, 1); + assert(gt); + printf("[%s]\n", gt->buf); + assert(strcmp((char *)gt->buf, "19700101000000Z") == 0); + + /* Normalization should happen prior calling the _frac() */ + gt = asn_time2GT_frac(gt, &tm, 55, 10, 1); + assert(gt); + printf("[%s]\n", gt->buf); + assert(strcmp((char *)gt->buf, "19700101000000Z") == 0); + + gt = asn_time2GT_frac(gt, &tm, 10, 20, 1); + assert(gt); + printf("[%s]\n", gt->buf); + assert(strcmp((char *)gt->buf, "19700101000000.5Z") == 0); + + gt = asn_time2GT_frac(gt, &tm, -10, 20, 1); + assert(gt); + printf("[%s]\n", gt->buf); + assert(strcmp((char *)gt->buf, "19700101000000Z") == 0); + + FREEMEM(gt->buf); + FREEMEM(gt); +} + int main(int ac, char **av) { (void)av; + check_fractions(); + recognize("200401250", -1, 0); recognize("2004012509300", -1, 0); recognize("20040125093000-", -1, 0); From 547b77ad6f45b67487bfcbdaf40d86f71c4eb3ca Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 4 Jul 2005 02:01:03 +0000 Subject: [PATCH 0928/1469] some gcc 4.x compatibility in constraints checking code git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@928 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_constraint.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index a5d5ab207..d75313d24 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -524,14 +524,9 @@ emit_size_determination_code(arg_t *arg, asn1p_expr_type_e etype) { break; case ASN_CONSTR_SET_OF: case ASN_CONSTR_SEQUENCE_OF: - OUT("{ /* Determine the number of elements */\n"); - INDENT(+1); - OUT("const A_%s_OF(void) *list;\n", - etype==ASN_CONSTR_SET_OF?"SET":"SEQUENCE"); - OUT("(const void *)list = sptr;\n"); - OUT("size = list->count;\n"); - INDENT(-1); - OUT("}\n"); + OUT("/* Determine the number of elements */\n"); + OUT("size = _A_C%s_FROM_VOID(sptr)->count;\n", + etype==ASN_CONSTR_SET_OF?"SET":"SEQUENCE"); break; case ASN_BASIC_OCTET_STRING: OUT("size = st->size;\n"); From 754a90fb7a78374b6e2652004910b09b1d24f5e8 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 4 Jul 2005 02:03:57 +0000 Subject: [PATCH 0929/1469] more heuristics testing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@929 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 2 +- tests/42-real-life-OK.asn1.-PR | 14 ++++---------- tests/85-comments-OK.asn1 | 7 +++++-- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index 748d602c9..3c6a83424 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,7 +4,7 @@ * GeneralizedTime API now supports fractions of seconds. Thanks to Bent Nicolaisen for support. * ASN.1 parser has been tweaked to allow parsing something like - "SEQUENCE--- comment ---", which is ambiguous for many reasons. + "SEQUENCE----comment----", which is ambiguous for many reasons. * XER decoder better handles not-yet-defined future extensions. 0.9.15: 2005-July-02 diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index 279e5dc2f..09aed561f 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -51,11 +51,8 @@ memb_varsets_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - { /* Determine the number of elements */ - const A_SEQUENCE_OF(void) *list; - (const void *)list = sptr; - size = list->count; - } + /* Determine the number of elements */ + size = _A_CSEQUENCE_FROM_VOID(sptr)->count; if((size >= 1)) { /* Perform validation of the inner elements */ @@ -388,11 +385,8 @@ memb_vset_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - { /* Determine the number of elements */ - const A_SET_OF(void) *list; - (const void *)list = sptr; - size = list->count; - } + /* Determine the number of elements */ + size = _A_CSET_FROM_VOID(sptr)->count; if((size >= 1)) { /* Perform validation of the inner elements */ diff --git a/tests/85-comments-OK.asn1 b/tests/85-comments-OK.asn1 index 883eadbfd..f1f4a8cb9 100644 --- a/tests/85-comments-OK.asn1 +++ b/tests/85-comments-OK.asn1 @@ -11,8 +11,11 @@ ModuleTestComments DEFINITIONS ::= BEGIN - T1 ::= SEQUENCE-- This is a comment-- { ... } - T2 ::= SEQUENCE--- This is a comment --- { ... } + T1 ::= SEQUENCE--comment-- { ... } + T2 ::= SEQUENCE-- comment-- { ... } + T3 ::= SEQUENCE--- comment --- { ... } + T4 ::= SEQUENCE----comment---- { ... } + T5 ::= SEQUENCE---- comment ---- { ... } ----- Another ambiguous comment --- From c42470fc06bd06b68e352fee3c63008539f82206 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 4 Jul 2005 02:04:36 +0000 Subject: [PATCH 0930/1469] changed date git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@930 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 3c6a83424..e6c05a8b4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9.16: 2005-July-02 +0.9.16: 2005-July-03 * GeneralizedTime API now supports fractions of seconds. Thanks to Bent Nicolaisen for support. From 008a0485fe928f3dc7b1a64f221a9c6d2cb31224 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 4 Jul 2005 02:20:26 +0000 Subject: [PATCH 0931/1469] even more tests for invalid fractions git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@931 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/GeneralizedTime.c | 3 +-- skeletons/tests/check-GeneralizedTime.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index e9aa4781b..4e60f6a29 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -561,8 +561,7 @@ asn_time2GT_frac(GeneralizedTime_t *opt_gt, const struct tm *tm, long frac_value */ if(frac_base >= 10 && frac_value > 0 - /* 1001 ms? should ignore or adjust seconds */ - && (frac_value/frac_base) == 0 + && (frac_value/(frac_base/10)) < 10 /* 98/99 */ ) { char *end = p + 1 + 6; /* '.' + maximum 6 digits */ char *z = p; diff --git a/skeletons/tests/check-GeneralizedTime.c b/skeletons/tests/check-GeneralizedTime.c index c39904e7e..7a805b071 100644 --- a/skeletons/tests/check-GeneralizedTime.c +++ b/skeletons/tests/check-GeneralizedTime.c @@ -133,6 +133,21 @@ check_fractions() { printf("[%s]\n", gt->buf); assert(strcmp((char *)gt->buf, "19700101000000Z") == 0); + gt = asn_time2GT_frac(gt, &tm, 98, 99, 1); + assert(gt); + printf("[%s]\n", gt->buf); + assert(strcmp((char *)gt->buf, "19700101000000Z") == 0); + + gt = asn_time2GT_frac(gt, &tm, 90, 91, 1); + assert(gt); + printf("[%s]\n", gt->buf); + assert(strcmp((char *)gt->buf, "19700101000000Z") == 0); + + gt = asn_time2GT_frac(gt, &tm, 89, 91, 1); + assert(gt); + printf("[%s]\n", gt->buf); + assert(strcmp((char *)gt->buf, "19700101000000.9Z") == 0); + FREEMEM(gt->buf); FREEMEM(gt); } From baf858b2bac39894fcf07c12ece45abb07f7b77a Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 4 Jul 2005 02:29:36 +0000 Subject: [PATCH 0932/1469] even more strict checking git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@932 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/GeneralizedTime.c | 11 +++++++---- skeletons/tests/check-GeneralizedTime.c | 17 ++++++++++++++++- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 4e60f6a29..510704066 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -561,7 +561,7 @@ asn_time2GT_frac(GeneralizedTime_t *opt_gt, const struct tm *tm, long frac_value */ if(frac_base >= 10 && frac_value > 0 - && (frac_value/(frac_base/10)) < 10 /* 98/99 */ + && (frac_value/frac_base) == 0 ) { char *end = p + 1 + 6; /* '.' + maximum 6 digits */ char *z = p; @@ -571,12 +571,15 @@ asn_time2GT_frac(GeneralizedTime_t *opt_gt, const struct tm *tm, long frac_value int digit; frac_base /= 10; digit = frac_value / frac_base; + if(digit > 9) { z = 0; break; } frac_value %= frac_base; *z++ = digit + 0x30; } while(frac_base >= 10 && frac_value > 0 && z < end); - for(--z; *z == 0x30; --z); /* Strip zeroes */ - p = z + (*z != '.'); - size = p - buf; + if(z && (frac_base == 1 || frac_base >= 10)) { + for(--z; *z == 0x30; --z); /* Strip zeroes */ + p = z + (*z != '.'); + size = p - buf; + } } if(force_gmt) { diff --git a/skeletons/tests/check-GeneralizedTime.c b/skeletons/tests/check-GeneralizedTime.c index 7a805b071..4b9f26616 100644 --- a/skeletons/tests/check-GeneralizedTime.c +++ b/skeletons/tests/check-GeneralizedTime.c @@ -126,6 +126,11 @@ check_fractions() { gt = asn_time2GT_frac(gt, &tm, 10, 20, 1); assert(gt); printf("[%s]\n", gt->buf); + assert(strcmp((char *)gt->buf, "19700101000000Z") == 0); + + gt = asn_time2GT_frac(gt, &tm, 10000000, 20000000, 1); + assert(gt); + printf("[%s]\n", gt->buf); assert(strcmp((char *)gt->buf, "19700101000000.5Z") == 0); gt = asn_time2GT_frac(gt, &tm, -10, 20, 1); @@ -138,6 +143,11 @@ check_fractions() { printf("[%s]\n", gt->buf); assert(strcmp((char *)gt->buf, "19700101000000Z") == 0); + gt = asn_time2GT_frac(gt, &tm, 988, 999, 1); + assert(gt); + printf("[%s]\n", gt->buf); + assert(strcmp((char *)gt->buf, "19700101000000Z") == 0); + gt = asn_time2GT_frac(gt, &tm, 90, 91, 1); assert(gt); printf("[%s]\n", gt->buf); @@ -146,7 +156,12 @@ check_fractions() { gt = asn_time2GT_frac(gt, &tm, 89, 91, 1); assert(gt); printf("[%s]\n", gt->buf); - assert(strcmp((char *)gt->buf, "19700101000000.9Z") == 0); + assert(strcmp((char *)gt->buf, "19700101000000Z") == 0); + + gt = asn_time2GT_frac(gt, &tm, 89000000, 91000000, 1); + assert(gt); + printf("[%s]\n", gt->buf); + assert(strcmp((char *)gt->buf, "19700101000000.978021Z") == 0); FREEMEM(gt->buf); FREEMEM(gt); From 90e20900e4c1a5644613adcc474fd1f93926d460 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 4 Jul 2005 12:19:53 +0000 Subject: [PATCH 0933/1469] proper format qualifiers git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@933 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/check-XER.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/skeletons/tests/check-XER.c b/skeletons/tests/check-XER.c index 9254dbc1b..10b0a3173 100644 --- a/skeletons/tests/check-XER.c +++ b/skeletons/tests/check-XER.c @@ -24,9 +24,9 @@ check_next(char *xerbuf, int expected_chunk_size, pxer_chunk_type_e expected_chu ch_size = xer_next_token(&state, xerbuf, xerbuf_len, &ch_type); printf("[%s]:%d\n", xerbuf, xerbuf_len); - printf("chunk sizes: %d vs %d, chunk types: %d vs %d\n", - ch_size, expected_chunk_size, - ch_type, expected_chunk_type + printf("chunk sizes: %ld vs %ld, chunk types: %d vs %ld\n", + (long)ch_size, (long)expected_chunk_size, + ch_type, (long)expected_chunk_type ); if(expected_chunk_type == -1) { From aa1169655f2f080fc2a7bfd3a9a2a0446a157d9d Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 4 Jul 2005 12:21:51 +0000 Subject: [PATCH 0934/1469] new decimal point paradigm git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@934 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/GeneralizedTime.c | 87 +++++++++++++++------- skeletons/GeneralizedTime.h | 13 +++- skeletons/tests/check-GeneralizedTime.c | 96 +++++++++++++++---------- 3 files changed, 131 insertions(+), 65 deletions(-) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 510704066..9103455dd 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -168,7 +168,7 @@ GeneralizedTime_encode_der(asn_TYPE_descriptor_t *td, void *sptr, asn_app_consume_bytes_f *cb, void *app_key) { GeneralizedTime_t *st = (GeneralizedTime_t *)sptr; asn_enc_rval_t erval; - long fv, fb; /* seconds fraction value and base */ + int fv, fd; /* seconds fraction value and number of digits */ struct tm tm; time_t tloc; @@ -176,12 +176,12 @@ GeneralizedTime_encode_der(asn_TYPE_descriptor_t *td, void *sptr, * Encode as a canonical DER. */ errno = EPERM; - tloc = asn_GT2time_frac(st, &fv, &fb, &tm, 1); /* Recognize time */ + tloc = asn_GT2time_frac(st, &fv, &fd, &tm, 1); /* Recognize time */ if(tloc == -1 && errno != EPERM) /* Failed to recognize time. Fail completely. */ _ASN_ENCODE_FAILED; - st = asn_time2GT_frac(0, &tm, fv, fb, 1); /* Save time canonically */ + st = asn_time2GT_frac(0, &tm, fv, fd, 1); /* Save time canonically */ if(!st) _ASN_ENCODE_FAILED; /* Memory allocation failure. */ erval = OCTET_STRING_encode_der(td, st, tag_mode, tag, cb, app_key); @@ -202,16 +202,16 @@ GeneralizedTime_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, if(flags & XER_F_CANONICAL) { GeneralizedTime_t *gt; asn_enc_rval_t rv; - long fv, fb; /* fractional parts */ + int fv, fd; /* fractional parts */ struct tm tm; errno = EPERM; if(asn_GT2time_frac((GeneralizedTime_t *)sptr, - &fv, &fb, &tm, 1) == -1 + &fv, &fd, &tm, 1) == -1 && errno != EPERM) _ASN_ENCODE_FAILED; - gt = asn_time2GT_frac(0, &tm, fv, fb, 1); + gt = asn_time2GT_frac(0, &tm, fv, fd, 1); if(!gt) _ASN_ENCODE_FAILED; rv = OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags, @@ -261,7 +261,37 @@ asn_GT2time(const GeneralizedTime_t *st, struct tm *ret_tm, int as_gmt) { } time_t -asn_GT2time_frac(const GeneralizedTime_t *st, long *frac_value, long *frac_base, struct tm *ret_tm, int as_gmt) { +asn_GT2time_prec(const GeneralizedTime_t *st, int *frac_value, int frac_digits, struct tm *ret_tm, int as_gmt) { + time_t tloc; + int fv, fd = 0; + + if(frac_value) + tloc = asn_GT2time_frac(st, &fv, &fd, ret_tm, as_gmt); + else + return asn_GT2time_frac(st, 0, 0, ret_tm, as_gmt); + if(fd == 0 || frac_digits <= 0) { + *frac_value = 0; + } else { + while(fd > frac_digits) + fv /= 10, fd--; + while(fd < frac_digits) { + int new_fv = fv * 10; + if(new_fv / 10 != fv) { + /* Too long precision request */ + fv = 0; + break; + } + fv = new_fv, fd++; + } + + *frac_value = fv; + } + + return tloc; +} + +time_t +asn_GT2time_frac(const GeneralizedTime_t *st, int *frac_value, int *frac_digits, struct tm *ret_tm, int as_gmt) { struct tm tm_s; uint8_t *buf; uint8_t *end; @@ -269,8 +299,8 @@ asn_GT2time_frac(const GeneralizedTime_t *st, long *frac_value, long *frac_base, int gmtoff_m = 0; int gmtoff = 0; /* h + m */ int offset_specified = 0; - long fvalue = 0; - long fbase = 1; + int fvalue = 0; + int fdigits = 0; time_t tloc; if(!st || !st->buf) { @@ -372,14 +402,16 @@ asn_GT2time_frac(const GeneralizedTime_t *st, long *frac_value, long *frac_base, */ for(buf++; buf < end; buf++) { int v = *buf; + int new_fvalue; switch(v) { case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: - if((fbase * 10 / fbase) != 10) { + new_fvalue = fvalue * 10 + (v - 0x30); + if(new_fvalue / 10 != fvalue) { /* Not enough precision, ignore */ } else { - fbase *= 10; - fvalue = fvalue * 10 + (v - 0x30); + fvalue = new_fvalue; + fdigits++; } continue; default: @@ -490,7 +522,7 @@ asn_GT2time_frac(const GeneralizedTime_t *st, long *frac_value, long *frac_base, /* Fractions of seconds */ if(frac_value) *frac_value = fvalue; - if(frac_base) *frac_base = fbase; + if(frac_digits) *frac_digits = fdigits; return tloc; } @@ -501,7 +533,7 @@ asn_time2GT(GeneralizedTime_t *opt_gt, const struct tm *tm, int force_gmt) { } GeneralizedTime_t * -asn_time2GT_frac(GeneralizedTime_t *opt_gt, const struct tm *tm, long frac_value, long frac_base, int force_gmt) { +asn_time2GT_frac(GeneralizedTime_t *opt_gt, const struct tm *tm, int frac_value, int frac_digits, int force_gmt) { struct tm tm_s; long gmtoff; const unsigned int buf_size = @@ -559,23 +591,28 @@ asn_time2GT_frac(GeneralizedTime_t *opt_gt, const struct tm *tm, long frac_value /* * Deal with fractions. */ - if(frac_base >= 10 - && frac_value > 0 - && (frac_value/frac_base) == 0 - ) { + if(frac_value > 0 && frac_digits > 0) { char *end = p + 1 + 6; /* '.' + maximum 6 digits */ char *z = p; + long fbase; *z++ = '.'; - frac_value %= frac_base; + + /* Place bounds on precision */ + while(frac_digits-- > 6) + frac_value /= 10; + + /* emulate fbase = pow(10, frac_digits) */ + for(fbase = 1; frac_digits--;) + fbase *= 10; + do { - int digit; - frac_base /= 10; - digit = frac_value / frac_base; + int digit = frac_value / fbase; if(digit > 9) { z = 0; break; } - frac_value %= frac_base; *z++ = digit + 0x30; - } while(frac_base >= 10 && frac_value > 0 && z < end); - if(z && (frac_base == 1 || frac_base >= 10)) { + frac_value %= fbase; + fbase /= 10; + } while(fbase > 0 && frac_value > 0 && z < end); + if(z) { for(--z; *z == 0x30; --z); /* Strip zeroes */ p = z + (*z != '.'); size = p - buf; diff --git a/skeletons/GeneralizedTime.h b/skeletons/GeneralizedTime.h index 90f7e0893..6b4c1ecc4 100644 --- a/skeletons/GeneralizedTime.h +++ b/skeletons/GeneralizedTime.h @@ -34,7 +34,16 @@ time_t asn_GT2time(const GeneralizedTime_t *, struct tm *_optional_tm4fill, /* A version of the above function also returning the fractions of seconds */ time_t asn_GT2time_frac(const GeneralizedTime_t *, - long *frac_value, long *frac_base, /* (value/base) */ + int *frac_value, int *frac_digits, /* (value / (10 ^ digits)) */ + struct tm *_optional_tm4fill, int as_gmt); + +/* + * Another version returning fractions with defined precision + * For example, parsing of the time ending with ".1" seconds + * with frac_digits=3 (msec) would yield frac_value = 100. + */ +time_t asn_GT2time_prec(const GeneralizedTime_t *, + int *frac_value, int frac_digits, struct tm *_optional_tm4fill, int as_gmt); /* @@ -47,6 +56,6 @@ time_t asn_GT2time_frac(const GeneralizedTime_t *, GeneralizedTime_t *asn_time2GT(GeneralizedTime_t *_optional_gt, const struct tm *, int force_gmt); GeneralizedTime_t *asn_time2GT_frac(GeneralizedTime_t *_optional_gt, - const struct tm *, long frac_value, long frac_base, int force_gmt); + const struct tm *, int frac_value, int frac_digits, int force_gmt); #endif /* _GeneralizedTime_H_ */ diff --git a/skeletons/tests/check-GeneralizedTime.c b/skeletons/tests/check-GeneralizedTime.c index 4b9f26616..245e9408d 100644 --- a/skeletons/tests/check-GeneralizedTime.c +++ b/skeletons/tests/check-GeneralizedTime.c @@ -1,34 +1,34 @@ #define __ASN_INTERNAL_TEST_MODE__ #include #include +#include /* for pow(3) */ static void recognize(char *time_str, time_t expect, int as_gmt) { GeneralizedTime_t gt; struct tm tm; time_t tloc; - long fv, fb; + int fv, fp; gt.buf = (uint8_t *)time_str; gt.size = strlen(time_str); - tloc = asn_GT2time_frac(>, &fv, &fb, &tm, as_gmt); + tloc = asn_GT2time_frac(>, &fv, &fp, &tm, as_gmt); printf("%s: [%s] -> %ld == %ld\n", as_gmt?"GMT":"ofs", time_str, (long)tloc, (long)expect); if(tloc != -1) { - printf("\t%04d-%02d-%02dT%02d:%02d:%02d(.%ld/%ld)%+03ld%02ld\n", + printf("\t%04d-%02d-%02dT%02d:%02d:%02d.%f(%d/%d)%+03ld%02ld\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, - fv, fb, + (double)fv * pow(0.1, fp), fv, fp, (GMTOFF(tm) / 3600), labs(GMTOFF(tm) % 3600) ); - assert(fb < 100 || (fb % 100) == 0); } assert(tloc == expect); @@ -62,7 +62,7 @@ encode(time_t tloc, const char *expect, int force_gmt) { static void recode(char *time_str, const char *expect) { - long frac_value, frac_base; + int frac_value, frac_digits; GeneralizedTime_t gt; struct tm tm; time_t tloc; @@ -70,14 +70,15 @@ recode(char *time_str, const char *expect) { gt.buf = (uint8_t *)time_str; gt.size = strlen(time_str); - tloc = asn_GT2time_frac(>, &frac_value, &frac_base, &tm, 1); + tloc = asn_GT2time_frac(>, &frac_value, &frac_digits, &tm, 1); assert(tloc != -1); gt.buf = 0; - asn_time2GT_frac(>, &tm, frac_value, frac_base, 1); + asn_time2GT_frac(>, &tm, frac_value, frac_digits, 1); assert(gt.buf); - printf("[%s] => [%s] == [%s]\n", time_str, gt.buf, expect); + printf("[%s] => [%s] == [%s] (%d, %d)\n", + time_str, gt.buf, expect, frac_value, frac_digits); assert(strcmp((char *)gt.buf, expect) == 0); FREEMEM(gt.buf); @@ -87,6 +88,8 @@ static void check_fractions() { GeneralizedTime_t *gt = 0; struct tm tm; + int fv, fd; + time_t tloc; memset(&tm, 0, sizeof tm); tm.tm_year = 70; @@ -117,51 +120,61 @@ check_fractions() { printf("[%s]\n", gt->buf); assert(strcmp((char *)gt->buf, "19700101000000Z") == 0); - /* Normalization should happen prior calling the _frac() */ - gt = asn_time2GT_frac(gt, &tm, 55, 10, 1); - assert(gt); - printf("[%s]\n", gt->buf); - assert(strcmp((char *)gt->buf, "19700101000000Z") == 0); - - gt = asn_time2GT_frac(gt, &tm, 10, 20, 1); + /* Normalization should happen prior to calling the _frac() */ + gt = asn_time2GT_frac(gt, &tm, 55, 2, 1); assert(gt); printf("[%s]\n", gt->buf); - assert(strcmp((char *)gt->buf, "19700101000000Z") == 0); + assert(strcmp((char *)gt->buf, "19700101000000.55Z") == 0); - gt = asn_time2GT_frac(gt, &tm, 10000000, 20000000, 1); + gt = asn_time2GT_frac(gt, &tm, 5, 2, 1); assert(gt); printf("[%s]\n", gt->buf); - assert(strcmp((char *)gt->buf, "19700101000000.5Z") == 0); + assert(strcmp((char *)gt->buf, "19700101000000.05Z") == 0); - gt = asn_time2GT_frac(gt, &tm, -10, 20, 1); + /* Normalization should happen prior calling the _frac() */ + gt = asn_time2GT_frac(gt, &tm, 900, 2, 1); assert(gt); printf("[%s]\n", gt->buf); assert(strcmp((char *)gt->buf, "19700101000000Z") == 0); - gt = asn_time2GT_frac(gt, &tm, 98, 99, 1); + gt = asn_time2GT_frac(gt, &tm, 90, 2, 1); assert(gt); printf("[%s]\n", gt->buf); - assert(strcmp((char *)gt->buf, "19700101000000Z") == 0); + assert(strcmp((char *)gt->buf, "19700101000000.9Z") == 0); - gt = asn_time2GT_frac(gt, &tm, 988, 999, 1); - assert(gt); - printf("[%s]\n", gt->buf); - assert(strcmp((char *)gt->buf, "19700101000000Z") == 0); + tloc = asn_GT2time_prec(gt, &fv, 0, 0, 1); + assert(tloc == 0); + assert(fv == 0); - gt = asn_time2GT_frac(gt, &tm, 90, 91, 1); - assert(gt); - printf("[%s]\n", gt->buf); - assert(strcmp((char *)gt->buf, "19700101000000Z") == 0); + tloc = asn_GT2time_prec(gt, &fv, 1, 0, 1); + assert(tloc == 0); + assert(fv == 9); - gt = asn_time2GT_frac(gt, &tm, 89, 91, 1); - assert(gt); - printf("[%s]\n", gt->buf); - assert(strcmp((char *)gt->buf, "19700101000000Z") == 0); + tloc = asn_GT2time_prec(gt, &fv, 2, 0, 1); + assert(tloc == 0); + assert(fv == 90); - gt = asn_time2GT_frac(gt, &tm, 89000000, 91000000, 1); - assert(gt); - printf("[%s]\n", gt->buf); - assert(strcmp((char *)gt->buf, "19700101000000.978021Z") == 0); + tloc = asn_GT2time_frac(gt, &fv, &fd, 0, 1); + assert(tloc == 0); + assert(fv == 9); + assert(fd == 1); + + gt->buf[gt->size-1] = '0'; + gt->buf[gt->size++] = 'Z'; + gt->buf[gt->size] = '\0'; + + tloc = asn_GT2time_frac(gt, &fv, &fd, 0, 1); + assert(tloc == 0); + assert(fd == 2); + assert(fv == 90); + + tloc = asn_GT2time_prec(gt, &fv, 1, 0, 1); + assert(tloc == 0); + assert(fv == 9); + + tloc = asn_GT2time_prec(gt, &fv, 100, 0, 1); + assert(tloc == 0); + assert(fv == 0); FREEMEM(gt->buf); FREEMEM(gt); @@ -225,6 +238,13 @@ main(int ac, char **av) { recode("20050702123312.1234567+01", "20050702113312.123456Z"); recode("20050702123312.12345678+01", "20050702113312.123456Z"); recode("20050702123312.123456789+01", "20050702113312.123456Z"); + recode("20050702123312.2000000000+01", "20050702113312.2Z"); + recode("20050702123312.3000000000+01", "20050702113312.3Z"); + recode("20050702123312.4000000000+01", "20050702113312.4Z"); + recode("20050702123312.5000000000+01", "20050702113312.5Z"); + recode("20050702123312.5000000001+01", "20050702113312.5Z"); + recode("20050702123312.5000010001+01", "20050702113312.500001Z"); + recode("20050702123312.5000001001+01", "20050702113312.5Z"); recode("20050702123312.000001+01", "20050702113312.000001Z"); recode("20050702123312.0000001Z", "20050702123312Z"); recode("20050702123312.0080010+1056", "20050702013712.008001Z"); From 6d222841b5e80a2c19467028aaf8bbad644bb22d Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 4 Jul 2005 13:39:33 +0000 Subject: [PATCH 0935/1469] new date git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@935 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index e6c05a8b4..24075190b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9.16: 2005-July-03 +0.9.16: 2005-July-04 * GeneralizedTime API now supports fractions of seconds. Thanks to Bent Nicolaisen for support. From ffc488540ee8b83020944029f2faa34fb05755c8 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 8 Jul 2005 18:36:51 +0000 Subject: [PATCH 0936/1469] oops: bug1234780 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@936 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SET.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/constr_SET.h b/skeletons/constr_SET.h index afe0c7c59..7e8af9749 100644 --- a/skeletons/constr_SET.h +++ b/skeletons/constr_SET.h @@ -58,7 +58,7 @@ xer_type_encoder_f SET_encode_xer; * It is very simple bitfield test, despite its visual complexity. */ #define ASN_SET_ISPRESENT(set_ptr, PR_x) \ - ASN_SET_ISPRESENT2(&((set_ptr)->_presence_map)) + ASN_SET_ISPRESENT2(&((set_ptr)->_presence_map), PR_x) #define ASN_SET_ISPRESENT2(map_ptr, PR_x) \ (((unsigned int *)(map_ptr)) \ [(PR_x) / (8 * sizeof(unsigned int))] \ From 0e874795ded4e3b4985b27f3014f0b910b1f6daf Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 15 Jul 2005 18:49:41 +0000 Subject: [PATCH 0937/1469] #includes moved out of __cplusplus git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@937 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_save.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c index 8fc0fcf13..8a67e26e8 100644 --- a/libasn1compiler/asn1c_save.c +++ b/libasn1compiler/asn1c_save.c @@ -227,9 +227,7 @@ asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *deps) { "#define\t_%s_H_\n" "\n", header_id, header_id); - fprintf(fp_h, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n"); - - fprintf(fp_h, "#include \n"); + fprintf(fp_h, "\n#include \n"); #define SAVE_STREAM(fp, idx, msg, actdep) do { \ if(TQ_FIRST(&(cs->destination[idx].chunks)) && *msg) \ @@ -241,6 +239,9 @@ asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *deps) { } while(0) SAVE_STREAM(fp_h, OT_INCLUDES, "Including external dependencies", 1); + + fprintf(fp_h, "\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n"); + SAVE_STREAM(fp_h, OT_DEPS, "Dependencies", 0); SAVE_STREAM(fp_h, OT_FWD_DECLS, "Forward declarations", 0); SAVE_STREAM(fp_h, OT_TYPE_DECLS, expr->Identifier, 0); From b012da8fa08fe9cdbdce04ecd0c84e0c55ec8f52 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 21 Jul 2005 01:18:19 +0000 Subject: [PATCH 0938/1469] tagging mode is implicit if automatic tags environment is used git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@938 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 7 ++++++- configure | 2 +- configure.in | 2 +- libasn1fix/asn1fix_constr.c | 3 ++- tests/55-components-of-OK.asn1.-EF | 2 +- tests/86-atags-OK.asn1 | 20 ++++++++++++++++++++ tests/86-atags-OK.asn1.-EF | 28 ++++++++++++++++++++++++++++ 7 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 tests/86-atags-OK.asn1 create mode 100644 tests/86-atags-OK.asn1.-EF diff --git a/ChangeLog b/ChangeLog index 24075190b..927f6ae89 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ -0.9.16: 2005-July-04 +0.9.17: 2005-July-20 + + * Tagging mode is implicitly IMPLICIT if AUTOMATIC TAGS is used, #30.6. + (Test cases 55, 86). + +0.9.16: 2005-July-04 * GeneralizedTime API now supports fractions of seconds. Thanks to Bent Nicolaisen for support. diff --git a/configure b/configure index 9fe32ae20..3c4b2041b 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.9.16 + VERSION=0.9.17 cat >>confdefs.h <<_ACEOF diff --git a/configure.in b/configure.in index daeba6a79..ce9bd2ed1 100644 --- a/configure.in +++ b/configure.in @@ -3,7 +3,7 @@ AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_BUILD AC_CANONICAL_TARGET AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.9.16) +AM_INIT_AUTOMAKE(asn1c, 0.9.17) AM_MAINTAINER_MODE diff --git a/libasn1fix/asn1fix_constr.c b/libasn1fix/asn1fix_constr.c index b71d874cd..588c08e8a 100644 --- a/libasn1fix/asn1fix_constr.c +++ b/libasn1fix/asn1fix_constr.c @@ -252,7 +252,8 @@ asn1f_fix_constr_tag(arg_t *arg, int fix_top_level) { static int _asn1f_fix_type_tag(arg_t *arg, asn1p_expr_t *expr) { int must_explicit = _asn1f_check_if_tag_must_be_explicit(arg, expr); - int module_impl_tags = (arg->mod->module_flags & MSF_IMPLICIT_TAGS); + int module_impl_tags = (arg->mod->module_flags + & (MSF_IMPLICIT_TAGS | MSF_AUTOMATIC_TAGS)); int r_value = 0; if(expr->tag.tag_mode == TM_DEFAULT) { diff --git a/tests/55-components-of-OK.asn1.-EF b/tests/55-components-of-OK.asn1.-EF index b7b227fe7..fb2f76df7 100644 --- a/tests/55-components-of-OK.asn1.-EF +++ b/tests/55-components-of-OK.asn1.-EF @@ -5,7 +5,7 @@ BEGIN OneType ::= SEQUENCE { one-1 INTEGER, - one-2 [1] EXPLICIT BOOLEAN, + one-2 [1] IMPLICIT BOOLEAN, one-3 SEQUENCE { alpha [0] IMPLICIT INTEGER, beta [1] IMPLICIT INTEGER, diff --git a/tests/86-atags-OK.asn1 b/tests/86-atags-OK.asn1 new file mode 100644 index 000000000..afd058565 --- /dev/null +++ b/tests/86-atags-OK.asn1 @@ -0,0 +1,20 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .86 + +ModuleAutoTags + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 86 } + DEFINITIONS AUTOMATIC TAGS ::= +BEGIN + + A ::= SEQUENCE { a INTEGER } + B ::= SEQUENCE { a [0] INTEGER } + C ::= SEQUENCE { a [0] IMPLICIT INTEGER } + D ::= SEQUENCE { a [0] EXPLICIT INTEGER } + E ::= SEQUENCE { a [0] CHOICE { b INTEGER } } + +END diff --git a/tests/86-atags-OK.asn1.-EF b/tests/86-atags-OK.asn1.-EF new file mode 100644 index 000000000..ebadd3a5e --- /dev/null +++ b/tests/86-atags-OK.asn1.-EF @@ -0,0 +1,28 @@ +ModuleAutoTags { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 86 } +DEFINITIONS AUTOMATIC TAGS ::= +BEGIN + +A ::= SEQUENCE { + a [0] IMPLICIT INTEGER +} + +B ::= SEQUENCE { + a [0] IMPLICIT INTEGER +} + +C ::= SEQUENCE { + a [0] IMPLICIT INTEGER +} + +D ::= SEQUENCE { + a [0] EXPLICIT INTEGER +} + +E ::= SEQUENCE { + a [0] EXPLICIT CHOICE { + b [0] IMPLICIT INTEGER + } +} + +END From 8a0261a96d445491b2e58779e974dbf3bf9327e7 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 21 Jul 2005 09:16:27 +0000 Subject: [PATCH 0939/1469] removed extra comma git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@939 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_codecs_prim.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/asn_codecs_prim.h b/skeletons/asn_codecs_prim.h index b928b1a67..67658f473 100644 --- a/skeletons/asn_codecs_prim.h +++ b/skeletons/asn_codecs_prim.h @@ -24,7 +24,7 @@ enum xer_pbd_rval { XPBD_DECODER_LIMIT, /* Hit some decoder limitation or deficiency */ XPBD_BROKEN_ENCODING, /* Encoding of a primitive body is broken */ XPBD_NOT_BODY_IGNORE, /* Not a body format, but safe to ignore */ - XPBD_BODY_CONSUMED, /* Body is recognized and consumed */ + XPBD_BODY_CONSUMED /* Body is recognized and consumed */ }; typedef enum xer_pbd_rval (xer_primitive_body_decoder_f) (asn_TYPE_descriptor_t *td, void *struct_ptr, From e66fd8a7165dca954c0d82ca74688c8e414cdf20 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 21 Jul 2005 09:32:49 +0000 Subject: [PATCH 0940/1469] tried -pedantic git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@940 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/INTEGER.c | 2 +- skeletons/OBJECT_IDENTIFIER.c | 2 +- skeletons/OCTET_STRING.c | 2 +- skeletons/asn-decoder-template.c | 2 +- skeletons/asn_internal.h | 6 +----- 5 files changed, 5 insertions(+), 9 deletions(-) diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index e4e52d416..b47705609 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -309,7 +309,7 @@ INTEGER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chun ST_SKIPSPACE, ST_WAITDIGITS, ST_DIGITS, - ST_EXTRASTUFF, + ST_EXTRASTUFF } state = ST_SKIPSPACE; /* diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index 0c16bfddf..cb9ff5756 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -659,7 +659,7 @@ OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length, enum { ST_SKIPSPACE, ST_WAITDIGITS, /* Next character is expected to be a digit */ - ST_DIGITS, + ST_DIGITS } state = ST_SKIPSPACE; if(!oid_text || oid_txt_length < -1 || (arcs_slots && !arcs)) { diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 581845595..b43c18fe1 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -101,7 +101,7 @@ asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { typedef enum OS_type { _TT_GENERIC = 0, /* Just a random OCTET STRING */ _TT_BIT_STRING = 1, /* BIT STRING type, a special case */ - _TT_ANY = 2, /* ANY type, a special case too */ + _TT_ANY = 2 /* ANY type, a special case too */ } OS_type_e; /* diff --git a/skeletons/asn-decoder-template.c b/skeletons/asn-decoder-template.c index 5116529d8..16a6f4ae2 100644 --- a/skeletons/asn-decoder-template.c +++ b/skeletons/asn-decoder-template.c @@ -32,7 +32,7 @@ static int opt_stack; /* -s */ static enum output_method { OUT_NONE, /* No pretty-printing */ OUT_PRINT, /* -p flag */ - OUT_XML, /* -x flag */ + OUT_XML /* -x flag */ } opt_ometh; /* -p or -x */ #define DEBUG(fmt, args...) do { \ diff --git a/skeletons/asn_internal.h b/skeletons/asn_internal.h index 22011efa9..84d692acc 100644 --- a/skeletons/asn_internal.h +++ b/skeletons/asn_internal.h @@ -39,11 +39,7 @@ void ASN_DEBUG_f(const char *fmt, ...); #define ASN_DEBUG ASN_DEBUG_f #endif /* __GNUC__ */ #else /* EMIT_ASN_DEBUG != 1 */ -#ifdef __GNUC__ -#define ASN_DEBUG(fmt, args...) ((void)0) /* Emit a no-op operator */ -#else /* __GNUC__ */ -static void ASN_DEBUG(const char *fmt, ...) { (void)fmt; }; -#endif /* __GNUC__ */ +static inline void ASN_DEBUG(const char *fmt, ...) { (void)fmt; } #endif /* EMIT_ASN_DEBUG */ #endif /* ASN_DEBUG */ From dae8e61278dd15b9233f1293d29f4935652049bd Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 21 Jul 2005 18:45:37 +0000 Subject: [PATCH 0941/1469] fopen("w") -> fopen("wb") git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@941 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-usage.html | 2 +- doc/asn1c-usage.lyx | 2 +- doc/asn1c-usage.pdf | Bin 132117 -> 132038 bytes 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/asn1c-usage.html b/doc/asn1c-usage.html index 8bd76d681..b16e7889a 100644 --- a/doc/asn1c-usage.html +++ b/doc/asn1c-usage.html @@ -1051,7 +1051,7 @@

          fprintf(stderr, ''Specify filename for BER output\n'');     } else {       const char *filename = av[1];     FILE *fp = fopen(filename, ''w'');   /* for BER output */     FILE *fp = fopen(filename, ''wb'');   /* for BER output */         if(!fp) {         perror(filename); diff --git a/doc/asn1c-usage.lyx b/doc/asn1c-usage.lyx index f000c895b..51445f350 100644 --- a/doc/asn1c-usage.lyx +++ b/doc/asn1c-usage.lyx @@ -2296,7 +2296,7 @@ n \begin_inset Quotes sld \end_inset -w +wb \begin_inset Quotes srd \end_inset diff --git a/doc/asn1c-usage.pdf b/doc/asn1c-usage.pdf index 90168cd81e12bc188231ad3134d218d07601a74a..621c1cb2f133ce1342145fdd5bfd921426e236b9 100644 GIT binary patch delta 10551 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 delta 10305 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 Zo)+$&zV6mGP&fkoz@b;J+|*Qr{y$YVLi_*# From 4cc4572eb5b4f7e4dd1244512595cc5a6f540921 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 24 Jul 2005 08:28:39 +0000 Subject: [PATCH 0942/1469] -findirect-choice git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@942 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/asn1c.1 | 11 +++- asn1c/asn1c.c | 3 ++ doc/asn1c-usage.html | 13 +++++ doc/asn1c-usage.lyx | 93 +++++++++++++++++++++------------ doc/asn1c-usage.pdf | Bin 132038 -> 132123 bytes libasn1compiler/asn1c_C.c | 5 ++ libasn1compiler/asn1compiler.h | 4 ++ 7 files changed, 95 insertions(+), 34 deletions(-) diff --git a/asn1c/asn1c.1 b/asn1c/asn1c.1 index 408b79f93..893d5995e 100644 --- a/asn1c/asn1c.1 +++ b/asn1c/asn1c.1 @@ -23,7 +23,7 @@ and other encoding standards. .TP \fILanguage Options\fR .br -\fB\-fall-defs-global \-fbless-SIZE \-fcompound-names +\fB\-fall-defs-global \-fbless-SIZE \-fcompound-names \-findirect-choice .BI "\-fknown-extern-type=" \fB\-fnative-types \-fno-constraints \-fno-include-deps \-funnamed-unions \-ftypes88\fR .TP @@ -90,9 +90,16 @@ by using complex names for target language structures. (Name collisions may occur if the ASN.1 module reuses the same identifiers in multiple contexts). .TP +.B \-findirect-choice +When generating code for a CHOICE type, compile the CHOICE members as indirect +pointers instead of declaring them inline. Consider using this option +together with +.B \-fno-include-deps +to prevent circular references. +.TP .BI "\-fknown-extern-type=" Pretend the specified type is known. The compiler will assume the target -language source files for the given type are provided manually. +language source files for the given type have been provided manually. .TP .B \-fnative-types Use the native machine's data types (int, double) whenever possible, diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index 3d08c3097..11559de3f 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -77,6 +77,8 @@ main(int ac, char **av) { asn1_fixer_flags |= A1F_EXTENDED_SizeConstraint; } else if(strcmp(optarg, "compound-names") == 0) { asn1_compiler_flags |= A1C_COMPOUND_NAMES; + } else if(strcmp(optarg, "indirect-choice") == 0) { + asn1_compiler_flags |= A1C_INDIRECT_CHOICE; } else if(strncmp(optarg, "known-extern-type=", 18) == 0) { char *known_type = optarg + 18; ret = asn1f_make_known_external_type(known_type); @@ -313,6 +315,7 @@ usage(const char *av0) { " -fall-defs-global Don't make the asn1_DEF_'s of structure members \"static\"\n" " -fbless-SIZE Allow SIZE() constraint for INTEGER etc (non-std.)\n" " -fcompound-names Disambiguate C's struct NAME's inside top-level types\n" +" -findirect-choice Compile members of CHOICE as indirect pointers\n" " -fknown-extern-type= Pretend the specified type is known\n" " -fnative-types Use \"long\" instead of INTEGER_t whenever possible, etc.\n" " -fno-constraints Do not generate constraint checking code\n" diff --git a/doc/asn1c-usage.html b/doc/asn1c-usage.html index b16e7889a..03bfd4bfa 100644 --- a/doc/asn1c-usage.html +++ b/doc/asn1c-usage.html @@ -400,6 +400,19 @@

    name clashes in case the module reuses the same identifiers in multiple contexts. +-findirect-choice +When generating code for a CHOICE type, compile +the CHOICE members as indirect pointers instead of +declaring them inline. Consider using this option +together with -fno-include-deps to prevent circular references. + + +-fknown-extern-type=<name> +Pretend the specified type is known. The compiler will +assume the target language source files for the given +type have been provided manually. + + -fnative-types Use the native machine's data types (int, double) whenever possible, instead of the compound INTEGER_t, ENUMERATED_t and REAL_t diff --git a/doc/asn1c-usage.lyx b/doc/asn1c-usage.lyx index 51445f350..4e9750ff8 100644 --- a/doc/asn1c-usage.lyx +++ b/doc/asn1c-usage.lyx @@ -71,7 +71,7 @@ status Open \backslash lhead{This document describes \backslash -href{http://lionet.info/asn1c}{asn1c-0.9.11}} +href{http://lionet.info/asn1c}{asn1c-0.9.17}} \layout Standard \backslash @@ -169,7 +169,7 @@ END The compiler would read this ASN.1 definition and produce the following C type \begin_inset Foot -collapsed true +collapsed false \layout Standard @@ -182,8 +182,8 @@ collapsed true int \emph default types instead of infinite width INTEGER_t structures. - See Table -\begin_inset LatexCommand \vref{cap:asn1c-cmdopts} + See Section +\begin_inset LatexCommand \vref{sec:Command-line-options} \end_inset @@ -240,7 +240,7 @@ ell \emph default command may be used to compile the ASN.1 module \begin_inset Foot -collapsed true +collapsed false \layout Standard @@ -249,8 +249,8 @@ This is probably not \series default what you want to try out right now -- read through the rest of this chapter - and check the Table -\begin_inset LatexCommand \vref{cap:asn1c-cmdopts} + and check the Section +\begin_inset LatexCommand \vref{sec:Command-line-options} \end_inset @@ -438,28 +438,20 @@ int main() routine. \layout Section -Command line options -\layout Standard -The Table -\begin_inset LatexCommand \vref{cap:asn1c-cmdopts} +\begin_inset LatexCommand \label{sec:Command-line-options} \end_inset - summarizes various options affecting the compiler's behavior. +Command line options \layout Standard - -\begin_inset Float table -placement h -wide false -collapsed false - +The following table summarizes the asn1c command line options. \layout Standard \begin_inset Tabular - + @@ -716,7 +708,7 @@ Enable lexer debugging during the ASN.1 parsing stage. \end_inset - + \begin_inset Text @@ -844,6 +836,54 @@ Use complex names for C structures. \layout Standard +-findirect-choice +\end_inset + + +\begin_inset Text + +\layout Standard + +When generating code for a CHOICE type, compile the CHOICE members as indirect + pointers instead of declaring them inline. + Consider using this option together with +\series bold +-fno-include-deps +\series default + to prevent circular references. + +\end_inset + + + + +\begin_inset Text + +\layout Standard + +-fknown-extern-type= +\emph on + +\end_inset + + +\begin_inset Text + +\layout Standard + +Pretend the specified type is known. + The compiler will assume the target language source files for the given + type have been provided manually. + +\end_inset + + + + +\begin_inset Text + +\layout Standard + \size small -fnative-types @@ -953,7 +993,7 @@ Pretend to support only ASN.1:1988 embedded types. \end_inset - + \begin_inset Text @@ -1027,17 +1067,6 @@ Generate "-- #line" comments in -E output. \end_inset -\layout Caption - - -\begin_inset LatexCommand \label{cap:asn1c-cmdopts} - -\end_inset - -The list of asn1c command line options -\end_inset - - \layout Chapter Using the ASN.1 Compiler diff --git a/doc/asn1c-usage.pdf b/doc/asn1c-usage.pdf index 621c1cb2f133ce1342145fdd5bfd921426e236b9..bd3f3f62e02a351e8ab0f407544a799bc14dd1db 100644 GIT binary patch delta 32427 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 Nvf47*^DRtd{|~(|;ZXnp delta 32447 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 != A1TC_REFERENCE) return 0; + /* -findirect-choice compiles members of CHOICE as indirect pointers */ + if((arg->flags & A1C_INDIRECT_CHOICE) + && arg->expr->expr_type == ASN_CONSTR_CHOICE) + return 1; + /* Rewind to the topmost parent expression */ if((top_parent = expr->parent_expr)) { while(top_parent->parent_expr) diff --git a/libasn1compiler/asn1compiler.h b/libasn1compiler/asn1compiler.h index 4fa4a9f09..e688018ad 100644 --- a/libasn1compiler/asn1compiler.h +++ b/libasn1compiler/asn1compiler.h @@ -47,6 +47,10 @@ enum asn1c_flags { * Do not generate courtesy #includes for external dependencies. */ A1C_NO_INCLUDE_DEPS = 0x0200, + /* + * Compile members of CHOICE as indirect pointers. + */ + A1C_INDIRECT_CHOICE = 0x0400, }; /* From 3a4175855e87788b6edac82564440cbae1b6d763 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 24 Jul 2005 09:03:44 +0000 Subject: [PATCH 0943/1469] extern "C" used in skeletons git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@943 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 5 ++++- skeletons/ANY.h | 8 ++++++++ skeletons/BIT_STRING.h | 8 ++++++++ skeletons/BMPString.h | 8 ++++++++ skeletons/BOOLEAN.h | 8 ++++++++ skeletons/ENUMERATED.h | 8 ++++++++ skeletons/GeneralString.h | 8 ++++++++ skeletons/GeneralizedTime.h | 8 ++++++++ skeletons/GraphicString.h | 8 ++++++++ skeletons/IA5String.h | 8 ++++++++ skeletons/INTEGER.h | 8 ++++++++ skeletons/ISO646String.h | 8 ++++++++ skeletons/NULL.h | 8 ++++++++ skeletons/NativeEnumerated.h | 8 ++++++++ skeletons/NativeInteger.h | 8 ++++++++ skeletons/NativeReal.h | 8 ++++++++ skeletons/NumericString.h | 8 ++++++++ skeletons/OBJECT_IDENTIFIER.h | 8 ++++++++ skeletons/OCTET_STRING.h | 8 ++++++++ skeletons/ObjectDescriptor.h | 8 ++++++++ skeletons/PrintableString.h | 8 ++++++++ skeletons/REAL.h | 8 ++++++++ skeletons/RELATIVE-OID.h | 8 ++++++++ skeletons/T61String.h | 8 ++++++++ skeletons/TeletexString.h | 8 ++++++++ skeletons/UTCTime.h | 8 ++++++++ skeletons/UTF8String.h | 8 ++++++++ skeletons/UniversalString.h | 8 ++++++++ skeletons/VideotexString.h | 8 ++++++++ skeletons/VisibleString.h | 8 ++++++++ skeletons/asn_SEQUENCE_OF.h | 8 ++++++++ skeletons/asn_SET_OF.h | 8 ++++++++ skeletons/asn_application.h | 8 ++++++++ skeletons/asn_codecs.h | 13 ++++++++++++- skeletons/asn_codecs_prim.h | 8 ++++++++ skeletons/ber_decoder.h | 8 ++++++++ skeletons/ber_tlv_length.h | 8 ++++++++ skeletons/ber_tlv_tag.h | 8 ++++++++ skeletons/constr_CHOICE.h | 8 ++++++++ skeletons/constr_SEQUENCE.h | 8 ++++++++ skeletons/constr_SEQUENCE_OF.h | 8 ++++++++ skeletons/constr_SET.h | 8 ++++++++ skeletons/constr_SET_OF.h | 8 ++++++++ skeletons/constr_TYPE.h | 8 ++++++++ skeletons/constraints.h | 8 ++++++++ skeletons/der_encoder.h | 8 ++++++++ skeletons/xer_decoder.h | 8 ++++++++ skeletons/xer_encoder.h | 8 ++++++++ skeletons/xer_support.h | 8 ++++++++ 49 files changed, 392 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 927f6ae89..ab91083c5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,11 @@ -0.9.17: 2005-July-20 +0.9.17: 2005-July-24 * Tagging mode is implicitly IMPLICIT if AUTOMATIC TAGS is used, #30.6. (Test cases 55, 86). + * Started to use extern "C" {} in skeleton headers. + * Introduced -finline-choice command line option to fix + yet another class of circular references. 0.9.16: 2005-July-04 diff --git a/skeletons/ANY.h b/skeletons/ANY.h index cabc411b6..c9b17dbfb 100644 --- a/skeletons/ANY.h +++ b/skeletons/ANY.h @@ -7,6 +7,10 @@ #include /* Implemented via OCTET STRING type */ +#ifdef __cplusplus +extern "C" { +#endif + typedef struct ANY { uint8_t *buf; /* BER-encoded ANY contents */ int size; /* Size of the above buffer */ @@ -36,4 +40,8 @@ int ANY_to_type(ANY_t *, asn_TYPE_descriptor_t *td, void **struct_ptr); #define ANY_fromBuf(s, buf, size) OCTET_STRING_fromBuf((s), (buf), (size)) #define ANY_new_fromBuf(buf, size) OCTET_STRING_new_fromBuf((buf), (size)) +#ifdef __cplusplus +} +#endif + #endif /* ASN_TYPE_ANY_H */ diff --git a/skeletons/BIT_STRING.h b/skeletons/BIT_STRING.h index 1601231f9..732e878bc 100644 --- a/skeletons/BIT_STRING.h +++ b/skeletons/BIT_STRING.h @@ -7,6 +7,10 @@ #include /* Some help from OCTET STRING */ +#ifdef __cplusplus +extern "C" { +#endif + typedef struct BIT_STRING_s { uint8_t *buf; /* BIT STRING body */ int size; /* Size of the above buffer */ @@ -22,4 +26,8 @@ asn_struct_print_f BIT_STRING_print; /* Human-readable output */ asn_constr_check_f BIT_STRING_constraint; xer_type_encoder_f BIT_STRING_encode_xer; +#ifdef __cplusplus +} +#endif + #endif /* _BIT_STRING_H_ */ diff --git a/skeletons/BMPString.h b/skeletons/BMPString.h index cd515973a..a4725fa48 100644 --- a/skeletons/BMPString.h +++ b/skeletons/BMPString.h @@ -7,6 +7,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef OCTET_STRING_t BMPString_t; /* Implemented via OCTET STRING */ extern asn_TYPE_descriptor_t asn_DEF_BMPString; @@ -15,4 +19,8 @@ asn_struct_print_f BMPString_print; /* Human-readable output */ xer_type_decoder_f BMPString_decode_xer; xer_type_encoder_f BMPString_encode_xer; +#ifdef __cplusplus +} +#endif + #endif /* _BMPString_H_ */ diff --git a/skeletons/BOOLEAN.h b/skeletons/BOOLEAN.h index fd173d119..ec4dbac88 100644 --- a/skeletons/BOOLEAN.h +++ b/skeletons/BOOLEAN.h @@ -7,6 +7,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + /* * The underlying integer may contain various values, but everything * non-zero is capped to 0xff by the DER encoder. The BER decoder may @@ -23,4 +27,8 @@ der_type_encoder_f BOOLEAN_encode_der; xer_type_decoder_f BOOLEAN_decode_xer; xer_type_encoder_f BOOLEAN_encode_xer; +#ifdef __cplusplus +} +#endif + #endif /* _BOOLEAN_H_ */ diff --git a/skeletons/ENUMERATED.h b/skeletons/ENUMERATED.h index 45733cb25..53cc273e4 100644 --- a/skeletons/ENUMERATED.h +++ b/skeletons/ENUMERATED.h @@ -7,8 +7,16 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef INTEGER_t ENUMERATED_t; /* Implemented via INTEGER */ extern asn_TYPE_descriptor_t asn_DEF_ENUMERATED; +#ifdef __cplusplus +} +#endif + #endif /* _ENUMERATED_H_ */ diff --git a/skeletons/GeneralString.h b/skeletons/GeneralString.h index d284674a7..70ef1ab1b 100644 --- a/skeletons/GeneralString.h +++ b/skeletons/GeneralString.h @@ -7,8 +7,16 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef OCTET_STRING_t GeneralString_t; /* Implemented via OCTET STRING */ extern asn_TYPE_descriptor_t asn_DEF_GeneralString; +#ifdef __cplusplus +} +#endif + #endif /* _GeneralString_H_ */ diff --git a/skeletons/GeneralizedTime.h b/skeletons/GeneralizedTime.h index 6b4c1ecc4..1ea06b068 100644 --- a/skeletons/GeneralizedTime.h +++ b/skeletons/GeneralizedTime.h @@ -7,6 +7,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef OCTET_STRING_t GeneralizedTime_t; /* Implemented via OCTET STRING */ extern asn_TYPE_descriptor_t asn_DEF_GeneralizedTime; @@ -58,4 +62,8 @@ GeneralizedTime_t *asn_time2GT(GeneralizedTime_t *_optional_gt, GeneralizedTime_t *asn_time2GT_frac(GeneralizedTime_t *_optional_gt, const struct tm *, int frac_value, int frac_digits, int force_gmt); +#ifdef __cplusplus +} +#endif + #endif /* _GeneralizedTime_H_ */ diff --git a/skeletons/GraphicString.h b/skeletons/GraphicString.h index ac78f3eb8..7bc9492c7 100644 --- a/skeletons/GraphicString.h +++ b/skeletons/GraphicString.h @@ -7,8 +7,16 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef OCTET_STRING_t GraphicString_t; /* Implemented via OCTET STRING */ extern asn_TYPE_descriptor_t asn_DEF_GraphicString; +#ifdef __cplusplus +} +#endif + #endif /* _GraphicString_H_ */ diff --git a/skeletons/IA5String.h b/skeletons/IA5String.h index c20bc6b32..e2a909dd5 100644 --- a/skeletons/IA5String.h +++ b/skeletons/IA5String.h @@ -7,6 +7,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef OCTET_STRING_t IA5String_t; /* Implemented via OCTET STRING */ /* @@ -16,4 +20,8 @@ extern asn_TYPE_descriptor_t asn_DEF_IA5String; asn_constr_check_f IA5String_constraint; +#ifdef __cplusplus +} +#endif + #endif /* _IA5String_H_ */ diff --git a/skeletons/INTEGER.h b/skeletons/INTEGER.h index 416efd9ac..165c055f3 100644 --- a/skeletons/INTEGER.h +++ b/skeletons/INTEGER.h @@ -8,6 +8,10 @@ #include #include +#ifdef __cplusplus +extern "C" { +#endif + typedef ASN__PRIMITIVE_TYPE_t INTEGER_t; extern asn_TYPE_descriptor_t asn_DEF_INTEGER; @@ -52,4 +56,8 @@ int asn_long2INTEGER(INTEGER_t *i, long l); */ const asn_INTEGER_enum_map_t *INTEGER_map_value2enum(asn_INTEGER_specifics_t *specs, long value); +#ifdef __cplusplus +} +#endif + #endif /* _INTEGER_H_ */ diff --git a/skeletons/ISO646String.h b/skeletons/ISO646String.h index 5c3c73a51..b42dd0d04 100644 --- a/skeletons/ISO646String.h +++ b/skeletons/ISO646String.h @@ -8,8 +8,16 @@ #include #include +#ifdef __cplusplus +extern "C" { +#endif + typedef VisibleString_t ISO646String_t; /* Implemented using VisibleString */ extern asn_TYPE_descriptor_t asn_DEF_ISO646String; +#ifdef __cplusplus +} +#endif + #endif /* _ISO646String_H_ */ diff --git a/skeletons/NULL.h b/skeletons/NULL.h index bce436bd7..28a3630e1 100644 --- a/skeletons/NULL.h +++ b/skeletons/NULL.h @@ -7,6 +7,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + /* * The value of the NULL type is meaningless: see BOOLEAN if you want to * carry true/false semantics. @@ -20,4 +24,8 @@ der_type_encoder_f NULL_encode_der; xer_type_decoder_f NULL_decode_xer; xer_type_encoder_f NULL_encode_xer; +#ifdef __cplusplus +} +#endif + #endif /* NULL_H */ diff --git a/skeletons/NativeEnumerated.h b/skeletons/NativeEnumerated.h index 16f1bfdd3..7e2bb1b93 100644 --- a/skeletons/NativeEnumerated.h +++ b/skeletons/NativeEnumerated.h @@ -14,8 +14,16 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + extern asn_TYPE_descriptor_t asn_DEF_NativeEnumerated; xer_type_encoder_f NativeEnumerated_encode_xer; +#ifdef __cplusplus +} +#endif + #endif /* _NativeEnumerated_H_ */ diff --git a/skeletons/NativeInteger.h b/skeletons/NativeInteger.h index b66d29ad2..f38fd477c 100644 --- a/skeletons/NativeInteger.h +++ b/skeletons/NativeInteger.h @@ -15,6 +15,10 @@ #include #include +#ifdef __cplusplus +extern "C" { +#endif + extern asn_TYPE_descriptor_t asn_DEF_NativeInteger; asn_struct_free_f NativeInteger_free; @@ -24,4 +28,8 @@ der_type_encoder_f NativeInteger_encode_der; xer_type_decoder_f NativeInteger_decode_xer; xer_type_encoder_f NativeInteger_encode_xer; +#ifdef __cplusplus +} +#endif + #endif /* _NativeInteger_H_ */ diff --git a/skeletons/NativeReal.h b/skeletons/NativeReal.h index 32dd7f61d..1f5266cc8 100644 --- a/skeletons/NativeReal.h +++ b/skeletons/NativeReal.h @@ -13,6 +13,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + extern asn_TYPE_descriptor_t asn_DEF_NativeReal; asn_struct_free_f NativeReal_free; @@ -22,4 +26,8 @@ der_type_encoder_f NativeReal_encode_der; xer_type_decoder_f NativeReal_decode_xer; xer_type_encoder_f NativeReal_encode_xer; +#ifdef __cplusplus +} +#endif + #endif /* ASN_TYPE_NativeReal_H */ diff --git a/skeletons/NumericString.h b/skeletons/NumericString.h index 5ace1dda8..51e24e834 100644 --- a/skeletons/NumericString.h +++ b/skeletons/NumericString.h @@ -7,10 +7,18 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef OCTET_STRING_t NumericString_t; /* Implemented via OCTET STRING */ extern asn_TYPE_descriptor_t asn_DEF_NumericString; asn_constr_check_f NumericString_constraint; +#ifdef __cplusplus +} +#endif + #endif /* _NumericString_H_ */ diff --git a/skeletons/OBJECT_IDENTIFIER.h b/skeletons/OBJECT_IDENTIFIER.h index c1c9e2cf9..56a1f76af 100644 --- a/skeletons/OBJECT_IDENTIFIER.h +++ b/skeletons/OBJECT_IDENTIFIER.h @@ -9,6 +9,10 @@ #include #include +#ifdef __cplusplus +extern "C" { +#endif + typedef ASN__PRIMITIVE_TYPE_t OBJECT_IDENTIFIER_t; extern asn_TYPE_descriptor_t asn_DEF_OBJECT_IDENTIFIER; @@ -128,4 +132,8 @@ int OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, int OBJECT_IDENTIFIER_set_single_arc(uint8_t *arcbuf, void *arcval, unsigned int arcval_size, int _prepared_order); +#ifdef __cplusplus +} +#endif + #endif /* _OBJECT_IDENTIFIER_H_ */ diff --git a/skeletons/OCTET_STRING.h b/skeletons/OCTET_STRING.h index a4d5e41fc..94c19a0b2 100644 --- a/skeletons/OCTET_STRING.h +++ b/skeletons/OCTET_STRING.h @@ -7,6 +7,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef struct OCTET_STRING { uint8_t *buf; /* Buffer with consecutive OCTET_STRING bits */ int size; /* Size of the buffer */ @@ -67,4 +71,8 @@ typedef struct asn_OCTET_STRING_specifics_s { int subvariant; /* {0,1,2} for O-S, BIT STRING or ANY */ } asn_OCTET_STRING_specifics_t; +#ifdef __cplusplus +} +#endif + #endif /* _OCTET_STRING_H_ */ diff --git a/skeletons/ObjectDescriptor.h b/skeletons/ObjectDescriptor.h index 54a0000fe..fa1753ec8 100644 --- a/skeletons/ObjectDescriptor.h +++ b/skeletons/ObjectDescriptor.h @@ -7,8 +7,16 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef GraphicString_t ObjectDescriptor_t; /* Implemented via GraphicString */ extern asn_TYPE_descriptor_t asn_DEF_ObjectDescriptor; +#ifdef __cplusplus +} +#endif + #endif /* _ObjectDescriptor_H_ */ diff --git a/skeletons/PrintableString.h b/skeletons/PrintableString.h index e4a230de3..2ece440ee 100644 --- a/skeletons/PrintableString.h +++ b/skeletons/PrintableString.h @@ -7,10 +7,18 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef OCTET_STRING_t PrintableString_t; /* Implemented via OCTET STRING */ extern asn_TYPE_descriptor_t asn_DEF_PrintableString; asn_constr_check_f PrintableString_constraint; +#ifdef __cplusplus +} +#endif + #endif /* _PrintableString_H_ */ diff --git a/skeletons/REAL.h b/skeletons/REAL.h index 114b7e564..28ccf28df 100644 --- a/skeletons/REAL.h +++ b/skeletons/REAL.h @@ -8,6 +8,10 @@ #include #include +#ifdef __cplusplus +extern "C" { +#endif + typedef ASN__PRIMITIVE_TYPE_t REAL_t; extern asn_TYPE_descriptor_t asn_DEF_REAL; @@ -31,4 +35,8 @@ ssize_t REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *a int asn_REAL2double(const REAL_t *real_ptr, double *d); int asn_double2REAL(REAL_t *real_ptr, double d); +#ifdef __cplusplus +} +#endif + #endif /* ASN_TYPE_REAL_H */ diff --git a/skeletons/RELATIVE-OID.h b/skeletons/RELATIVE-OID.h index 2b7f13d30..2235cfddf 100644 --- a/skeletons/RELATIVE-OID.h +++ b/skeletons/RELATIVE-OID.h @@ -7,6 +7,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + /* Implemented via OBJECT IDENTIFIER */ typedef OBJECT_IDENTIFIER_t RELATIVE_OID_t; @@ -28,4 +32,8 @@ int RELATIVE_OID_get_arcs(RELATIVE_OID_t *_roid, int RELATIVE_OID_set_arcs(RELATIVE_OID_t *_roid, void *arcs, unsigned int arc_type_size, unsigned int arcs_slots); +#ifdef __cplusplus +} +#endif + #endif /* _RELATIVE_OID_H_ */ diff --git a/skeletons/T61String.h b/skeletons/T61String.h index 46b12ceb5..f706338d7 100644 --- a/skeletons/T61String.h +++ b/skeletons/T61String.h @@ -7,8 +7,16 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef OCTET_STRING_t T61String_t; /* Implemented via OCTET STRING */ extern asn_TYPE_descriptor_t asn_DEF_T61String; +#ifdef __cplusplus +} +#endif + #endif /* _T61String_H_ */ diff --git a/skeletons/TeletexString.h b/skeletons/TeletexString.h index a408d5841..ffd0f52e0 100644 --- a/skeletons/TeletexString.h +++ b/skeletons/TeletexString.h @@ -7,8 +7,16 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef OCTET_STRING_t TeletexString_t; /* Implemented via OCTET STRING */ extern asn_TYPE_descriptor_t asn_DEF_TeletexString; +#ifdef __cplusplus +} +#endif + #endif /* _TeletexString_H_ */ diff --git a/skeletons/UTCTime.h b/skeletons/UTCTime.h index 6d26807b8..8035b3456 100644 --- a/skeletons/UTCTime.h +++ b/skeletons/UTCTime.h @@ -7,6 +7,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef OCTET_STRING_t UTCTime_t; /* Implemented via OCTET STRING */ extern asn_TYPE_descriptor_t asn_DEF_UTCTime; @@ -27,4 +31,8 @@ time_t asn_UT2time(const UTCTime_t *, struct tm *_optional_tm4fill, int as_gmt); /* See asn_time2GT() in GeneralizedTime.h */ UTCTime_t *asn_time2UT(UTCTime_t *__opt_ut, const struct tm *, int force_gmt); +#ifdef __cplusplus +} +#endif + #endif /* _UTCTime_H_ */ diff --git a/skeletons/UTF8String.h b/skeletons/UTF8String.h index 84e6eaff8..3bc8ea69d 100644 --- a/skeletons/UTF8String.h +++ b/skeletons/UTF8String.h @@ -7,6 +7,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef OCTET_STRING_t UTF8String_t; /* Implemented via OCTET STRING */ extern asn_TYPE_descriptor_t asn_DEF_UTF8String; @@ -38,4 +42,8 @@ ssize_t UTF8String_length(const UTF8String_t *st); */ size_t UTF8String_to_wcs(const UTF8String_t *st, uint32_t *dst, size_t dstlen); +#ifdef __cplusplus +} +#endif + #endif /* _UTF8String_H_ */ diff --git a/skeletons/UniversalString.h b/skeletons/UniversalString.h index 3be8cabdc..1476a6f14 100644 --- a/skeletons/UniversalString.h +++ b/skeletons/UniversalString.h @@ -7,6 +7,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef OCTET_STRING_t UniversalString_t; /* Implemented via OCTET STRING */ extern asn_TYPE_descriptor_t asn_DEF_UniversalString; @@ -15,4 +19,8 @@ asn_struct_print_f UniversalString_print; /* Human-readable output */ xer_type_decoder_f UniversalString_decode_xer; xer_type_encoder_f UniversalString_encode_xer; +#ifdef __cplusplus +} +#endif + #endif /* _UniversalString_H_ */ diff --git a/skeletons/VideotexString.h b/skeletons/VideotexString.h index 0a156e247..3b551c336 100644 --- a/skeletons/VideotexString.h +++ b/skeletons/VideotexString.h @@ -7,8 +7,16 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef OCTET_STRING_t VideotexString_t; /* Implemented via OCTET STRING */ extern asn_TYPE_descriptor_t asn_DEF_VideotexString; +#ifdef __cplusplus +} +#endif + #endif /* _VideotexString_H_ */ diff --git a/skeletons/VisibleString.h b/skeletons/VisibleString.h index ca05beafe..20ba8cc50 100644 --- a/skeletons/VisibleString.h +++ b/skeletons/VisibleString.h @@ -7,10 +7,18 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef OCTET_STRING_t VisibleString_t; /* Implemented via OCTET STRING */ extern asn_TYPE_descriptor_t asn_DEF_VisibleString; asn_constr_check_f VisibleString_constraint; +#ifdef __cplusplus +} +#endif + #endif /* _VisibleString_H_ */ diff --git a/skeletons/asn_SEQUENCE_OF.h b/skeletons/asn_SEQUENCE_OF.h index 1109f2385..e678f0347 100644 --- a/skeletons/asn_SEQUENCE_OF.h +++ b/skeletons/asn_SEQUENCE_OF.h @@ -7,6 +7,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + /* * SEQUENCE OF is the same as SET OF with a tiny difference: * the delete operation preserves the initial order of elements @@ -41,4 +45,8 @@ typedef A_SEQUENCE_OF(void) asn_anonymous_sequence_; #define _A_SEQUENCE_FROM_VOID(ptr) ((asn_anonymous_sequence_ *)(ptr)) #define _A_CSEQUENCE_FROM_VOID(ptr) ((const asn_anonymous_sequence_ *)(ptr)) +#ifdef __cplusplus +} +#endif + #endif /* ASN_SEQUENCE_OF_H */ diff --git a/skeletons/asn_SET_OF.h b/skeletons/asn_SET_OF.h index 774549fc6..7edf14b51 100644 --- a/skeletons/asn_SET_OF.h +++ b/skeletons/asn_SET_OF.h @@ -5,6 +5,10 @@ #ifndef ASN_SET_OF_H #define ASN_SET_OF_H +#ifdef __cplusplus +extern "C" { +#endif + #define A_SET_OF(type) \ struct { \ type **array; \ @@ -51,4 +55,8 @@ typedef A_SET_OF(void) asn_anonymous_set_; #define _A_SET_FROM_VOID(ptr) ((asn_anonymous_set_ *)(ptr)) #define _A_CSET_FROM_VOID(ptr) ((const asn_anonymous_set_ *)(ptr)) +#ifdef __cplusplus +} +#endif + #endif /* ASN_SET_OF_H */ diff --git a/skeletons/asn_application.h b/skeletons/asn_application.h index 4987e5cd2..d6393416f 100644 --- a/skeletons/asn_application.h +++ b/skeletons/asn_application.h @@ -11,6 +11,10 @@ #include /* for platform-dependent types */ #include /* for ASN.1 codecs specifics */ +#ifdef __cplusplus +extern "C" { +#endif + /* * Generic type of an application-defined callback to return various * types of data to the application. @@ -23,4 +27,8 @@ typedef int (asn_app_consume_bytes_f)(const void *buffer, size_t size, #include /* for asn_TYPE_descriptor_t */ +#ifdef __cplusplus +} +#endif + #endif /* _ASN_APPLICATION_H_ */ diff --git a/skeletons/asn_codecs.h b/skeletons/asn_codecs.h index b08ce6538..9250adab2 100644 --- a/skeletons/asn_codecs.h +++ b/skeletons/asn_codecs.h @@ -5,6 +5,10 @@ #ifndef _ASN_CODECS_H_ #define _ASN_CODECS_H_ +#ifdef __cplusplus +extern "C" { +#endif + struct asn_TYPE_descriptor_s; /* Forward declaration */ /* @@ -51,7 +55,10 @@ typedef struct asn_enc_rval_s { void *structure_ptr; } asn_enc_rval_t; #define _ASN_ENCODE_FAILED do { \ - asn_enc_rval_t tmp_error = { -1, td, sptr }; \ + asn_enc_rval_t tmp_error; \ + tmp_error.encoded = -1; \ + tmp_error.failed_type = td; \ + tmp_error.structure_ptr = sptr; \ return tmp_error; \ } while(0) @@ -73,4 +80,8 @@ typedef struct asn_dec_rval_s { size_t consumed; /* Number of bytes consumed */ } asn_dec_rval_t; +#ifdef __cplusplus +} +#endif + #endif /* _ASN_CODECS_H_ */ diff --git a/skeletons/asn_codecs_prim.h b/skeletons/asn_codecs_prim.h index 67658f473..0f683fdd0 100644 --- a/skeletons/asn_codecs_prim.h +++ b/skeletons/asn_codecs_prim.h @@ -7,6 +7,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef struct ASN__PRIMITIVE_TYPE_s { uint8_t *buf; /* Buffer with consecutive primitive encoding bytes */ int size; /* Size of the buffer */ @@ -42,4 +46,8 @@ asn_dec_rval_t xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, xer_primitive_body_decoder_f *prim_body_decoder ); +#ifdef __cplusplus +} +#endif + #endif /* ASN_CODECS_PRIM_H */ diff --git a/skeletons/ber_decoder.h b/skeletons/ber_decoder.h index af8d8e381..fc259843d 100644 --- a/skeletons/ber_decoder.h +++ b/skeletons/ber_decoder.h @@ -7,6 +7,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + struct asn_TYPE_descriptor_s; /* Forward declaration */ struct asn_codec_ctx_s; /* Forward declaration */ @@ -52,4 +56,8 @@ asn_dec_rval_t ber_check_tags( int *opt_tlv_form /* optional tag form */ ); +#ifdef __cplusplus +} +#endif + #endif /* _BER_DECODER_H_ */ diff --git a/skeletons/ber_tlv_length.h b/skeletons/ber_tlv_length.h index b7d6f747d..d91270617 100644 --- a/skeletons/ber_tlv_length.h +++ b/skeletons/ber_tlv_length.h @@ -5,6 +5,10 @@ #ifndef _BER_TLV_LENGTH_H_ #define _BER_TLV_LENGTH_H_ +#ifdef __cplusplus +extern "C" { +#endif + typedef ssize_t ber_tlv_len_t; /* @@ -40,4 +44,8 @@ ssize_t ber_skip_length( */ size_t der_tlv_length_serialize(ber_tlv_len_t len, void *bufptr, size_t size); +#ifdef __cplusplus +} +#endif + #endif /* _BER_TLV_LENGTH_H_ */ diff --git a/skeletons/ber_tlv_tag.h b/skeletons/ber_tlv_tag.h index 51c9a081e..60e866861 100644 --- a/skeletons/ber_tlv_tag.h +++ b/skeletons/ber_tlv_tag.h @@ -5,6 +5,10 @@ #ifndef _BER_TLV_TAG_H_ #define _BER_TLV_TAG_H_ +#ifdef __cplusplus +extern "C" { +#endif + enum asn_tag_class { ASN_TAG_CLASS_UNIVERSAL = 0, /* 0b00 */ ASN_TAG_CLASS_APPLICATION = 1, /* 0b01 */ @@ -49,4 +53,8 @@ ssize_t ber_fetch_tag(const void *bufptr, size_t size, ber_tlv_tag_t *tag_r); */ size_t ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufptr, size_t size); +#ifdef __cplusplus +} +#endif + #endif /* _BER_TLV_TAG_H_ */ diff --git a/skeletons/constr_CHOICE.h b/skeletons/constr_CHOICE.h index ea32467c1..859c53296 100644 --- a/skeletons/constr_CHOICE.h +++ b/skeletons/constr_CHOICE.h @@ -7,6 +7,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef struct asn_CHOICE_specifics_s { /* * Target structure description. @@ -40,4 +44,8 @@ xer_type_decoder_f CHOICE_decode_xer; xer_type_encoder_f CHOICE_encode_xer; asn_outmost_tag_f CHOICE_outmost_tag; +#ifdef __cplusplus +} +#endif + #endif /* _CONSTR_CHOICE_H_ */ diff --git a/skeletons/constr_SEQUENCE.h b/skeletons/constr_SEQUENCE.h index e7bb4fee9..ab8a8ec1d 100644 --- a/skeletons/constr_SEQUENCE.h +++ b/skeletons/constr_SEQUENCE.h @@ -7,6 +7,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef struct asn_SEQUENCE_specifics_s { /* * Target structure description. @@ -39,4 +43,8 @@ der_type_encoder_f SEQUENCE_encode_der; xer_type_decoder_f SEQUENCE_decode_xer; xer_type_encoder_f SEQUENCE_encode_xer; +#ifdef __cplusplus +} +#endif + #endif /* _CONSTR_SEQUENCE_H_ */ diff --git a/skeletons/constr_SEQUENCE_OF.h b/skeletons/constr_SEQUENCE_OF.h index 684ec2642..94b04cdcb 100644 --- a/skeletons/constr_SEQUENCE_OF.h +++ b/skeletons/constr_SEQUENCE_OF.h @@ -8,6 +8,10 @@ #include #include /* Implemented using SET OF */ +#ifdef __cplusplus +extern "C" { +#endif + /* * A set specialized functions dealing with the SEQUENCE OF type. * Generally implemented using SET OF. @@ -20,4 +24,8 @@ der_type_encoder_f SEQUENCE_OF_encode_der; xer_type_encoder_f SEQUENCE_OF_encode_xer; +#ifdef __cplusplus +} +#endif + #endif /* _CONSTR_SET_OF_H_ */ diff --git a/skeletons/constr_SET.h b/skeletons/constr_SET.h index 7e8af9749..3adfb3367 100644 --- a/skeletons/constr_SET.h +++ b/skeletons/constr_SET.h @@ -7,6 +7,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef struct asn_SET_specifics_s { /* @@ -71,4 +75,8 @@ xer_type_encoder_f SET_encode_xer; |= (1 << ((8 * sizeof(unsigned int)) - 1 \ - ((PR_x) % (8 * sizeof(unsigned int)))))) +#ifdef __cplusplus +} +#endif + #endif /* _CONSTR_SET_H_ */ diff --git a/skeletons/constr_SET_OF.h b/skeletons/constr_SET_OF.h index 8d2fb500b..410be26b0 100644 --- a/skeletons/constr_SET_OF.h +++ b/skeletons/constr_SET_OF.h @@ -7,6 +7,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + typedef struct asn_SET_OF_specifics_s { /* * Target structure description. @@ -29,4 +33,8 @@ der_type_encoder_f SET_OF_encode_der; xer_type_decoder_f SET_OF_decode_xer; xer_type_encoder_f SET_OF_encode_xer; +#ifdef __cplusplus +} +#endif + #endif /* _CONSTR_SET_OF_H_ */ diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index e36f2932d..90b6578ce 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -14,6 +14,10 @@ #include #include +#ifdef __cplusplus +extern "C" { +#endif + struct asn_TYPE_descriptor_s; /* Forward declaration */ struct asn_TYPE_member_s; /* Forward declaration */ @@ -157,4 +161,8 @@ int asn_fprint(FILE *stream, /* Destination stream descriptor */ asn_TYPE_descriptor_t *td, /* ASN.1 type descriptor */ const void *struct_ptr); /* Structure to be printed */ +#ifdef __cplusplus +} +#endif + #endif /* _CONSTR_TYPE_H_ */ diff --git a/skeletons/constraints.h b/skeletons/constraints.h index d8434e4ea..51fad8ed5 100644 --- a/skeletons/constraints.h +++ b/skeletons/constraints.h @@ -7,6 +7,10 @@ #include /* Platform-dependent types */ +#ifdef __cplusplus +extern "C" { +#endif + struct asn_TYPE_descriptor_s; /* Forward declaration */ /* @@ -51,4 +55,8 @@ asn_constr_check_f asn_generic_unknown_constraint; /* Not fully supported */ void _asn_i_log_error(asn_app_consume_bytes_f *, void *key, const char *fmt, ...) __attribute__ ((format(printf, 3, 4))); +#ifdef __cplusplus +} +#endif + #endif /* _ASN1_CONSTRAINTS_VALIDATOR_H_ */ diff --git a/skeletons/der_encoder.h b/skeletons/der_encoder.h index cb784d194..9e7867dab 100644 --- a/skeletons/der_encoder.h +++ b/skeletons/der_encoder.h @@ -7,6 +7,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + struct asn_TYPE_descriptor_s; /* Forward declaration */ /* @@ -56,4 +60,8 @@ ssize_t der_write_tags( void *app_key ); +#ifdef __cplusplus +} +#endif + #endif /* _DER_ENCODER_H_ */ diff --git a/skeletons/xer_decoder.h b/skeletons/xer_decoder.h index e372bbd68..349f349ec 100644 --- a/skeletons/xer_decoder.h +++ b/skeletons/xer_decoder.h @@ -7,6 +7,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + struct asn_TYPE_descriptor_s; /* Forward declaration */ /* @@ -95,4 +99,8 @@ int xer_is_whitespace(const void *chunk_buf, size_t chunk_size); */ int xer_skip_unknown(xer_check_tag_e tcv, ber_tlv_len_t *depth); +#ifdef __cplusplus +} +#endif + #endif /* _XER_DECODER_H_ */ diff --git a/skeletons/xer_encoder.h b/skeletons/xer_encoder.h index 5f9bbf2cb..96d87b8ad 100644 --- a/skeletons/xer_encoder.h +++ b/skeletons/xer_encoder.h @@ -7,6 +7,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + struct asn_TYPE_descriptor_s; /* Forward declaration */ /* Flags used by the xer_encode() and (*xer_type_encoder_f), defined below */ @@ -48,4 +52,8 @@ typedef asn_enc_rval_t (xer_type_encoder_f)( void *app_key /* Arbitrary callback argument */ ); +#ifdef __cplusplus +} +#endif + #endif /* _XER_ENCODER_H_ */ diff --git a/skeletons/xer_support.h b/skeletons/xer_support.h index e25678c0d..8b01944ab 100644 --- a/skeletons/xer_support.h +++ b/skeletons/xer_support.h @@ -8,6 +8,10 @@ #include /* Platform-specific types */ +#ifdef __cplusplus +extern "C" { +#endif + /* * Types of data transferred to the application. */ @@ -44,4 +48,8 @@ typedef int (pxml_callback_f)(pxml_chunk_type_e _type, ssize_t pxml_parse(int *_stateContext, const void *_buf, size_t _size, pxml_callback_f *cb, void *_key); +#ifdef __cplusplus +} +#endif + #endif /* _XER_SUPPORT_H_ */ From c1e72a99f393bb713d18caad70aa6a662cbcf612 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 28 Jul 2005 08:39:46 +0000 Subject: [PATCH 0944/1469] extern "C" added git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@944 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_internal.h | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/skeletons/asn_internal.h b/skeletons/asn_internal.h index 84d692acc..0f8c029f4 100644 --- a/skeletons/asn_internal.h +++ b/skeletons/asn_internal.h @@ -8,15 +8,19 @@ #ifndef _ASN_INTERNAL_H_ #define _ASN_INTERNAL_H_ -#define ASN1C_ENVIRONMENT_VERSION 98 /* Compile-time version */ -int get_asn1c_environment_version(void); /* Run-time version */ - #include /* Application-visible API */ #ifndef __NO_ASSERT_H__ /* Include assert.h only for internal use. */ #include /* for assert() macro */ #endif +#ifdef __cplusplus +extern "C" { +#endif + +#define ASN1C_ENVIRONMENT_VERSION 98 /* Compile-time version */ +int get_asn1c_environment_version(void); /* Run-time version */ + #define CALLOC(nmemb, size) calloc(nmemb, size) #define MALLOC(size) malloc(size) #define REALLOC(oldptr, size) realloc(oldptr, size) @@ -76,4 +80,8 @@ static inline void ASN_DEBUG(const char *fmt, ...) { (void)fmt; } if(cb(" ", 4, app_key) < 0) return -1; \ } while(0) +#ifdef __cplusplus +} +#endif + #endif /* _ASN_INTERNAL_H_ */ From d98cbfbf6cc7582f8e5cf0f74e6dfef4ad39273e Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 3 Aug 2005 07:01:32 +0000 Subject: [PATCH 0945/1469] copyright year changed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@945 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_internal.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/skeletons/asn_internal.h b/skeletons/asn_internal.h index 0f8c029f4..781f10bc3 100644 --- a/skeletons/asn_internal.h +++ b/skeletons/asn_internal.h @@ -1,5 +1,6 @@ /*- - * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Copyright (c) 2003, 2004, 2005 Lev Walkin . + * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ /* From ed18fe1576fd17e87a0e8a5fd699abe1a83d18c0 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 8 Aug 2005 01:34:03 +0000 Subject: [PATCH 0946/1469] aug7 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@946 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index ab91083c5..9395c005d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9.17: 2005-July-24 +0.9.17: 2005-Aug-07 * Tagging mode is implicitly IMPLICIT if AUTOMATIC TAGS is used, #30.6. (Test cases 55, 86). From 6ddd2e4578810ea1a66b10cf092bfa708db6d8c9 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 9 Aug 2005 15:20:41 +0000 Subject: [PATCH 0947/1469] further dependency git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@947 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/Makefile.am | 2 ++ libasn1parser/Makefile.in | 2 ++ 2 files changed, 4 insertions(+) diff --git a/libasn1parser/Makefile.am b/libasn1parser/Makefile.am index 8e4700ff0..f90a2462b 100644 --- a/libasn1parser/Makefile.am +++ b/libasn1parser/Makefile.am @@ -22,6 +22,8 @@ libasn1parser_la_SOURCES = \ asn1p_ref.c asn1p_ref.h \ asn1p_list.h +asn1p_expr.h: asn1p_expr_str.h + asn1p_expr_str.h: expr-h.pl asn1p_expr.h ./expr-h.pl asn1p_expr.h > $@ diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index 76a6ef231..e9e6e070b 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -514,6 +514,8 @@ uninstall-am: uninstall-info-am uninstall-info-am +asn1p_expr.h: asn1p_expr_str.h + asn1p_expr_str.h: expr-h.pl asn1p_expr.h ./expr-h.pl asn1p_expr.h > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. From 22de793597d0026545b7d202273d983ec2f52472 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 12 Aug 2005 05:05:59 +0000 Subject: [PATCH 0948/1469] proper dependency git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@948 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/Makefile.am | 2 +- libasn1parser/Makefile.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libasn1parser/Makefile.am b/libasn1parser/Makefile.am index f90a2462b..a1455f4d4 100644 --- a/libasn1parser/Makefile.am +++ b/libasn1parser/Makefile.am @@ -22,7 +22,7 @@ libasn1parser_la_SOURCES = \ asn1p_ref.c asn1p_ref.h \ asn1p_list.h -asn1p_expr.h: asn1p_expr_str.h +asn1parser.h: asn1p_expr_str.h asn1p_expr_str.h: expr-h.pl asn1p_expr.h ./expr-h.pl asn1p_expr.h > $@ diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index e9e6e070b..3171cc516 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -514,7 +514,7 @@ uninstall-am: uninstall-info-am uninstall-info-am -asn1p_expr.h: asn1p_expr_str.h +asn1parser.h: asn1p_expr_str.h asn1p_expr_str.h: expr-h.pl asn1p_expr.h ./expr-h.pl asn1p_expr.h > $@ From 131ba38663692daeef2bbbdace98d78f083e23c7 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 12 Aug 2005 05:13:35 +0000 Subject: [PATCH 0949/1469] version bump-up git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@949 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 4 ++++ configure | 2 +- configure.in | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9395c005d..5e15d9685 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,8 @@ +0.9.17: 2005-Aug-11 + + * ... + 0.9.17: 2005-Aug-07 * Tagging mode is implicitly IMPLICIT if AUTOMATIC TAGS is used, #30.6. diff --git a/configure b/configure index 3c4b2041b..c114cb2b5 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.9.17 + VERSION=0.9.18 cat >>confdefs.h <<_ACEOF diff --git a/configure.in b/configure.in index ce9bd2ed1..70d06ab81 100644 --- a/configure.in +++ b/configure.in @@ -3,7 +3,7 @@ AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_BUILD AC_CANONICAL_TARGET AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.9.17) +AM_INIT_AUTOMAKE(asn1c, 0.9.18) AM_MAINTAINER_MODE From 04a08da36ab101f41ca6b2dcb42d608b69dbad15 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 12 Aug 2005 10:06:17 +0000 Subject: [PATCH 0950/1469] preliminary stupid things git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@950 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_y.y | 98 ++++++++++++++++++++++++----------------- 1 file changed, 58 insertions(+), 40 deletions(-) diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index 8c714f1a8..a2f31a8b2 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -23,32 +23,37 @@ void asn1p_lexer_hack_push_encoding_control(void); #define yylineno asn1p_lineno extern int asn1p_lineno; +/* + * This temporary variable is used to solve the shortcomings of 1-lookahead + * parser. + */ +static struct AssignedIdentifier *saved_aid; static asn1p_value_t * _convert_bitstring2binary(char *str, int base); -#define checkmem(ptr) do { \ - if(!(ptr)) \ - return yyerror("Memory failure"); \ +#define checkmem(ptr) do { \ + if(!(ptr)) \ + return yyerror("Memory failure"); \ } while(0) -#define CONSTRAINT_INSERT(root, constr_type, arg1, arg2) do { \ - if(arg1->type != constr_type) { \ - int __ret; \ - root = asn1p_constraint_new(yylineno); \ - checkmem(root); \ - root->type = constr_type; \ - __ret = asn1p_constraint_insert(root, \ - arg1); \ - checkmem(__ret == 0); \ - } else { \ - root = arg1; \ - } \ - if(arg2) { \ - int __ret \ - = asn1p_constraint_insert(root, arg2); \ - checkmem(__ret == 0); \ - } \ +#define CONSTRAINT_INSERT(root, lloc, constr_type, arg1, arg2) do { \ + if(arg1->type != constr_type) { \ + int __ret; \ + root = asn1p_constraint_new(yylineno); \ + checkmem(root); \ + root->type = constr_type; \ + __ret = asn1p_constraint_insert(root, \ + arg1); \ + checkmem(__ret == 0); \ + } else { \ + root = arg1; \ + } \ + if(arg2) { \ + int __ret \ + = asn1p_constraint_insert(root, arg2); \ + checkmem(__ret == 0); \ + } \ } while(0) %} @@ -68,6 +73,7 @@ static asn1p_value_t * asn1p_constraint_t *a_constr; /* Constraint */ enum asn1p_constraint_type_e a_ctype;/* Constraint type */ asn1p_xports_t *a_xports; /* IMports/EXports */ + struct AssignedIdentifier a_aid; /* Assigned Identifier */ asn1p_oid_t *a_oid; /* Object Identifier */ asn1p_oid_arc_t a_oid_arc; /* Single OID's arc */ struct asn1p_type_tag_s a_tag; /* A tag */ @@ -258,6 +264,7 @@ static asn1p_value_t * %type ParameterArgumentList %type ActualParameter %type ActualParameterList +%type AssignedIdentifier /* OID/DefinedValue */ %type ObjectIdentifier /* OID */ %type optObjectIdentifier /* Optional OID */ %type ObjectIdentifierBody @@ -346,7 +353,7 @@ ModuleSpecification: } checkmem($$); - $$->Identifier = $1; + $$->ModuleName = $1; $$->module_oid = $2; $$->module_flags = $4; } @@ -574,6 +581,10 @@ ModuleSpecificationElement: */ ImportsDefinition: TOK_IMPORTS ImportsBundleSet ';' { + if(!saved_aid && 0) + return yyerror("Unterminated IMPORTS FROM, " + "expected semicolon ';'"); + saved_aid = 0; $$ = $2; } /* @@ -596,11 +607,18 @@ ImportsBundleSet: } ; +AssignedIdentifier: + { memset(&$$, 0, sizeof($$)); } + | ObjectIdentifier { $$.oid = $1; }; + /* | DefinedValue { $$.value = $1; }; // Handled through saved_aid */ + ImportsBundle: - ImportsList TOK_FROM TypeRefName optObjectIdentifier { + ImportsList TOK_FROM TypeRefName AssignedIdentifier { $$ = $1; - $$->from = $3; - $$->from_oid = $4; + $$->fromModuleName = $3; + $$->identifier = $4; + /* This stupid thing is used for look-back hack. */ + saved_aid = $$->identifier.oid ? 0 : &($$->identifier); checkmem($$); } ; @@ -1520,14 +1538,14 @@ optConstraints: Constraints: SetOfConstraints { - CONSTRAINT_INSERT($$, ACT_CA_SET, $1, 0); + CONSTRAINT_INSERT($$, @1, ACT_CA_SET, $1, 0); } | TOK_SIZE '(' ElementSetSpecs ')' { /* * This is a special case, for compatibility purposes. * It goes without parentheses. */ - CONSTRAINT_INSERT($$, ACT_CT_SIZE, $3, 0); + CONSTRAINT_INSERT($$, @1, ACT_CT_SIZE, $3, 0); } ; @@ -1536,7 +1554,7 @@ SetOfConstraints: $$ = $2; } | SetOfConstraints '(' ElementSetSpecs ')' { - CONSTRAINT_INSERT($$, ACT_CA_SET, $1, $3); + CONSTRAINT_INSERT($$, @1, ACT_CA_SET, $1, $3); } ; @@ -1548,15 +1566,15 @@ ElementSetSpecs: asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); ct->type = ACT_EL_EXT; - CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct); + CONSTRAINT_INSERT($$, @1, ACT_CA_CSV, $1, ct); } | ElementSetSpec ',' TOK_ThreeDots ',' ElementSetSpec { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); ct->type = ACT_EL_EXT; - CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct); + CONSTRAINT_INSERT($$, @1, ACT_CA_CSV, $1, ct); ct = $$; - CONSTRAINT_INSERT($$, ACT_CA_CSV, ct, $5); + CONSTRAINT_INSERT($$, @1, ACT_CA_CSV, ct, $5); } ; @@ -1565,16 +1583,16 @@ ElementSetSpec: $$ = $1; } | TOK_ALL TOK_EXCEPT ConstraintSubtypeElement { - CONSTRAINT_INSERT($$, ACT_CA_AEX, $3, 0); + CONSTRAINT_INSERT($$, @1, ACT_CA_AEX, $3, 0); } | ElementSetSpec Union ConstraintSubtypeElement { - CONSTRAINT_INSERT($$, ACT_CA_UNI, $1, $3); + CONSTRAINT_INSERT($$, @1, ACT_CA_UNI, $1, $3); } | ElementSetSpec Intersection ConstraintSubtypeElement { - CONSTRAINT_INSERT($$, ACT_CA_INT, $1, $3); + CONSTRAINT_INSERT($$, @1, ACT_CA_INT, $1, $3); } | ConstraintSubtypeElement Except ConstraintSubtypeElement { - CONSTRAINT_INSERT($$, ACT_CA_EXC, $1, $3); + CONSTRAINT_INSERT($$, @1, ACT_CA_EXC, $1, $3); } ; @@ -1718,10 +1736,10 @@ ContainedSubtype: InnerTypeConstraint: TOK_WITH TOK_COMPONENT SetOfConstraints { - CONSTRAINT_INSERT($$, ACT_CT_WCOMP, $3, 0); + CONSTRAINT_INSERT($$, @1, ACT_CT_WCOMP, $3, 0); } | TOK_WITH TOK_COMPONENTS '{' WithComponentsList '}' { - CONSTRAINT_INSERT($$, ACT_CT_WCOMPS, $4, 0); + CONSTRAINT_INSERT($$, @1, ACT_CT_WCOMPS, $4, 0); } ; @@ -1730,7 +1748,7 @@ WithComponentsList: $$ = $1; } | WithComponentsList ',' WithComponentsElement { - CONSTRAINT_INSERT($$, ACT_CT_WCOMPS, $1, $3); + CONSTRAINT_INSERT($$, @1, ACT_CT_WCOMPS, $1, $3); } ; @@ -1794,13 +1812,13 @@ SimpleTableConstraint: checkmem($$); ct->type = ACT_EL_VALUE; ct->value = asn1p_value_fromref(ref, 0); - CONSTRAINT_INSERT($$, ACT_CA_CRC, ct, 0); + CONSTRAINT_INSERT($$, @1, ACT_CA_CRC, ct, 0); } ; ComponentRelationConstraint: SimpleTableConstraint '{' AtNotationList '}' { - CONSTRAINT_INSERT($$, ACT_CA_CRC, $1, $3); + CONSTRAINT_INSERT($$, @1, ACT_CA_CRC, $1, $3); } ; @@ -1817,7 +1835,7 @@ AtNotationList: checkmem(ct); ct->type = ACT_EL_VALUE; ct->value = asn1p_value_fromref($3, 0); - CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct); + CONSTRAINT_INSERT($$, @1, ACT_CA_CSV, $1, ct); } ; From 9fe7c92008c995a2bfaddd8dc7c02e1c7b5db56c Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 12 Aug 2005 10:08:45 +0000 Subject: [PATCH 0951/1469] removed no-op git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@951 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_y.y | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index a2f31a8b2..f7df754e4 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -37,7 +37,7 @@ static asn1p_value_t * return yyerror("Memory failure"); \ } while(0) -#define CONSTRAINT_INSERT(root, lloc, constr_type, arg1, arg2) do { \ +#define CONSTRAINT_INSERT(root, constr_type, arg1, arg2) do { \ if(arg1->type != constr_type) { \ int __ret; \ root = asn1p_constraint_new(yylineno); \ @@ -1538,14 +1538,14 @@ optConstraints: Constraints: SetOfConstraints { - CONSTRAINT_INSERT($$, @1, ACT_CA_SET, $1, 0); + CONSTRAINT_INSERT($$, ACT_CA_SET, $1, 0); } | TOK_SIZE '(' ElementSetSpecs ')' { /* * This is a special case, for compatibility purposes. * It goes without parentheses. */ - CONSTRAINT_INSERT($$, @1, ACT_CT_SIZE, $3, 0); + CONSTRAINT_INSERT($$, ACT_CT_SIZE, $3, 0); } ; @@ -1554,7 +1554,7 @@ SetOfConstraints: $$ = $2; } | SetOfConstraints '(' ElementSetSpecs ')' { - CONSTRAINT_INSERT($$, @1, ACT_CA_SET, $1, $3); + CONSTRAINT_INSERT($$, ACT_CA_SET, $1, $3); } ; @@ -1566,15 +1566,15 @@ ElementSetSpecs: asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); ct->type = ACT_EL_EXT; - CONSTRAINT_INSERT($$, @1, ACT_CA_CSV, $1, ct); + CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct); } | ElementSetSpec ',' TOK_ThreeDots ',' ElementSetSpec { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); ct->type = ACT_EL_EXT; - CONSTRAINT_INSERT($$, @1, ACT_CA_CSV, $1, ct); + CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct); ct = $$; - CONSTRAINT_INSERT($$, @1, ACT_CA_CSV, ct, $5); + CONSTRAINT_INSERT($$, ACT_CA_CSV, ct, $5); } ; @@ -1583,16 +1583,16 @@ ElementSetSpec: $$ = $1; } | TOK_ALL TOK_EXCEPT ConstraintSubtypeElement { - CONSTRAINT_INSERT($$, @1, ACT_CA_AEX, $3, 0); + CONSTRAINT_INSERT($$, ACT_CA_AEX, $3, 0); } | ElementSetSpec Union ConstraintSubtypeElement { - CONSTRAINT_INSERT($$, @1, ACT_CA_UNI, $1, $3); + CONSTRAINT_INSERT($$, ACT_CA_UNI, $1, $3); } | ElementSetSpec Intersection ConstraintSubtypeElement { - CONSTRAINT_INSERT($$, @1, ACT_CA_INT, $1, $3); + CONSTRAINT_INSERT($$, ACT_CA_INT, $1, $3); } | ConstraintSubtypeElement Except ConstraintSubtypeElement { - CONSTRAINT_INSERT($$, @1, ACT_CA_EXC, $1, $3); + CONSTRAINT_INSERT($$, ACT_CA_EXC, $1, $3); } ; @@ -1736,10 +1736,10 @@ ContainedSubtype: InnerTypeConstraint: TOK_WITH TOK_COMPONENT SetOfConstraints { - CONSTRAINT_INSERT($$, @1, ACT_CT_WCOMP, $3, 0); + CONSTRAINT_INSERT($$, ACT_CT_WCOMP, $3, 0); } | TOK_WITH TOK_COMPONENTS '{' WithComponentsList '}' { - CONSTRAINT_INSERT($$, @1, ACT_CT_WCOMPS, $4, 0); + CONSTRAINT_INSERT($$, ACT_CT_WCOMPS, $4, 0); } ; @@ -1748,7 +1748,7 @@ WithComponentsList: $$ = $1; } | WithComponentsList ',' WithComponentsElement { - CONSTRAINT_INSERT($$, @1, ACT_CT_WCOMPS, $1, $3); + CONSTRAINT_INSERT($$, ACT_CT_WCOMPS, $1, $3); } ; @@ -1812,13 +1812,13 @@ SimpleTableConstraint: checkmem($$); ct->type = ACT_EL_VALUE; ct->value = asn1p_value_fromref(ref, 0); - CONSTRAINT_INSERT($$, @1, ACT_CA_CRC, ct, 0); + CONSTRAINT_INSERT($$, ACT_CA_CRC, ct, 0); } ; ComponentRelationConstraint: SimpleTableConstraint '{' AtNotationList '}' { - CONSTRAINT_INSERT($$, @1, ACT_CA_CRC, $1, $3); + CONSTRAINT_INSERT($$, ACT_CA_CRC, $1, $3); } ; @@ -1835,7 +1835,7 @@ AtNotationList: checkmem(ct); ct->type = ACT_EL_VALUE; ct->value = asn1p_value_fromref($3, 0); - CONSTRAINT_INSERT($$, @1, ACT_CA_CSV, $1, ct); + CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct); } ; From 931aeede61f4688cc52d9a63fe482dd75b89d888 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 12 Aug 2005 10:09:10 +0000 Subject: [PATCH 0952/1469] restructured member variable names git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@952 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_save.c | 4 +- libasn1fix/asn1fix.c | 20 +- libasn1fix/asn1fix_constr.c | 2 +- libasn1fix/asn1fix_retrieve.c | 24 +- libasn1parser/asn1p_module.c | 4 +- libasn1parser/asn1p_module.h | 4 +- libasn1parser/asn1p_xports.c | 8 +- libasn1parser/asn1p_xports.h | 7 +- libasn1parser/asn1p_y.c | 1962 +++++++++++++++++---------------- libasn1parser/asn1p_y.h | 1 + libasn1print/asn1print.c | 4 +- 11 files changed, 1032 insertions(+), 1008 deletions(-) diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c index 8a67e26e8..0ab81563f 100644 --- a/libasn1compiler/asn1c_save.c +++ b/libasn1compiler/asn1c_save.c @@ -208,7 +208,7 @@ asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *deps) { " * From ASN.1 module \"%s\"\n" " * \tfound in \"%s\"\n" " */\n\n", - arg->mod->Identifier, + arg->mod->ModuleName, arg->mod->source_file_name ); fprintf(fp_h, @@ -217,7 +217,7 @@ asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *deps) { " * From ASN.1 module \"%s\"\n" " * \tfound in \"%s\"\n" " */\n\n", - arg->mod->Identifier, + arg->mod->ModuleName, arg->mod->source_file_name ); diff --git a/libasn1fix/asn1fix.c b/libasn1fix/asn1fix.c index 63cd148d9..1d06dbab7 100644 --- a/libasn1fix/asn1fix.c +++ b/libasn1fix/asn1fix.c @@ -118,7 +118,7 @@ asn1f_fix_module__phase_1(arg_t *arg) { TQ_FOR(omod, &arg->asn->modules, mod_next) { int sameNames; if(omod == arg->mod) break; - sameNames = strcmp(omod->Identifier, arg->mod->Identifier)?0:1; + sameNames = strcmp(omod->ModuleName, arg->mod->ModuleName)?0:1; if(omod->module_oid && arg->mod->module_oid) { /* Compare only the OID. */ if(asn1p_oid_compare(omod->module_oid, @@ -126,18 +126,18 @@ asn1f_fix_module__phase_1(arg_t *arg) { FATAL("ASN.1 module %s in %s " "has the same OBJECT IDENTIFIER" " as module %s", - omod->Identifier, + omod->ModuleName, omod->source_file_name, - arg->mod->Identifier + arg->mod->ModuleName ); RET2RVAL(-1, rvalue); } else if(sameNames) { - WARNING("ASN.1 module %s is defined more than once, with different OIDs", omod->Identifier); + WARNING("ASN.1 module %s is defined more than once, with different OIDs", omod->ModuleName); RET2RVAL(1, rvalue); } } else if(sameNames) { FATAL("ASN.1 module %s is defined more than once", - omod->Identifier); + omod->ModuleName); RET2RVAL(-1, rvalue); } } @@ -150,7 +150,7 @@ asn1f_fix_module__phase_1(arg_t *arg) { break; default: FATAL("Module %s defined with ambiguous global tagging mode", - arg->mod->Identifier); + arg->mod->ModuleName); RET2RVAL(-1, rvalue); } @@ -162,7 +162,7 @@ asn1f_fix_module__phase_1(arg_t *arg) { break; case MSF_unk_INSTRUCTIONS: WARNING("Module %s defined with unrecognized " - "encoding reference", arg->mod->Identifier); + "encoding reference", arg->mod->ModuleName); RET2RVAL(1, rvalue); /* Fall through */ case MSF_TAG_INSTRUCTIONS: @@ -170,7 +170,7 @@ asn1f_fix_module__phase_1(arg_t *arg) { break; default: FATAL("Module %s defined with ambiguous encoding reference", - arg->mod->Identifier); + arg->mod->ModuleName); RET2RVAL(-1, rvalue); } @@ -452,10 +452,10 @@ asn1f_check_duplicate(arg_t *arg) { "Please rename either instance to resolve the conflict", arg->expr->Identifier, arg->expr->_lineno, - arg->mod->Identifier, + arg->mod->ModuleName, tmparg.expr->Identifier, tmparg.expr->_lineno, - tmparg.mod->Identifier, + tmparg.mod->ModuleName, diff_files ? " (" : "", diff_files ? tmparg.mod->source_file_name : "", diff_files ? ")" : "" diff --git a/libasn1fix/asn1fix_constr.c b/libasn1fix/asn1fix_constr.c index 588c08e8a..7adbcaca6 100644 --- a/libasn1fix/asn1fix_constr.c +++ b/libasn1fix/asn1fix_constr.c @@ -446,7 +446,7 @@ _asn1f_compare_tags(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b) { "improper use of " "EXTENSIBILITY IMPLIED flag " "of module %s", - arg->mod->Identifier); + arg->mod->ModuleName); } return -1; } else { diff --git a/libasn1fix/asn1fix_retrieve.c b/libasn1fix/asn1fix_retrieve.c index d7eeed21c..730c8618e 100644 --- a/libasn1fix/asn1fix_retrieve.c +++ b/libasn1fix/asn1fix_retrieve.c @@ -51,7 +51,7 @@ asn1f_lookup_in_imports(arg_t *arg, asn1p_module_t *mod, const char *name) { * Okay, right now we have a module name and, hopefully, an OID. * Search the arg->asn for the specified module. */ - mod = asn1f_lookup_module(arg, xp->from, xp->from_oid); + mod = asn1f_lookup_module(arg, xp->fromModuleName, xp->identifier.oid); if(mod == NULL) { /* Conditional debug */ if(!(arg->expr->_mark & TM_BROKEN)) { @@ -59,7 +59,7 @@ asn1f_lookup_in_imports(arg_t *arg, asn1p_module_t *mod, const char *name) { FATAL("Cannot find external module \"%s\" " "mentioned for " "\"%s\" at line %d", - xp->from, name, arg->expr->_lineno); + xp->fromModuleName, name, arg->expr->_lineno); } /* ENOENT/ETOOMANYREFS */ return NULL; @@ -97,7 +97,7 @@ asn1f_lookup_module(arg_t *arg, const char *module_name, asn1p_oid_t *oid) { * somewhere in the IMPORTS section AND OID is given. */ TQ_FOR(xp, &(arg->mod->imports), xp_next) { - if(strcmp(module_name, xp->from)) + if(strcmp(module_name, xp->fromModuleName)) continue; if(oid) { FATAL("Ambiguous reference: " @@ -111,7 +111,7 @@ asn1f_lookup_module(arg_t *arg, const char *module_name, asn1p_oid_t *oid) { * Yes, there is a renaming. * Make lookup use OID instead. */ - oid = xp->from_oid; + oid = xp->identifier.oid; } } @@ -134,7 +134,7 @@ asn1f_lookup_module(arg_t *arg, const char *module_name, asn1p_oid_t *oid) { } } - if(strcmp(module_name, mod->Identifier) == 0) + if(strcmp(module_name, mod->ModuleName) == 0) return mod; } @@ -167,7 +167,7 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { DEBUG("(%s) in %s for line %d", asn1f_printable_reference(ref), - mod->Identifier, + mod->ModuleName, ref->_lineno); if(ref->comp_count == 1) { @@ -251,16 +251,16 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { if(modulename) { FATAL("Module %s referred by %s in module %s " "does not contain the requested symbol", - imports_from->Identifier, + imports_from->ModuleName, asn1f_printable_reference(ref), - mod->Identifier); + mod->ModuleName); } else { FATAL("Module %s referred in IMPORTS section " "for %s of module %s does not contain " "the requested symbol", - imports_from->Identifier, + imports_from->ModuleName, asn1f_printable_reference(ref), - mod->Identifier); + mod->ModuleName); } } return expr; @@ -277,7 +277,7 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { if(ref_tc == NULL) { DEBUG("Module \"%s\" does not contain \"%s\" " "mentioned at line %d: %s", - mod->Identifier, + mod->ModuleName, identifier, ref->_lineno, strerror(errno) @@ -406,7 +406,7 @@ asn1f_compatible_with_exports(arg_t *arg, asn1p_module_t *mod, const char *name) arg->expr->_mark |= TM_BROKEN; FATAL("EXPORTS section of module %s in %s " "does not mention %s at line %d", - mod->Identifier, mod->source_file_name, name, + mod->ModuleName, mod->source_file_name, name, arg->expr->_lineno); } diff --git a/libasn1parser/asn1p_module.c b/libasn1parser/asn1p_module.c index d430844e0..0202f0ff3 100644 --- a/libasn1parser/asn1p_module.c +++ b/libasn1parser/asn1p_module.c @@ -27,8 +27,8 @@ asn1p_module_free(asn1p_module_t *mod) { if(mod) { asn1p_expr_t *expr; - if(mod->Identifier) - free(mod->Identifier); + if(mod->ModuleName) + free(mod->ModuleName); if(mod->module_oid) asn1p_oid_free(mod->module_oid); diff --git a/libasn1parser/asn1p_module.h b/libasn1parser/asn1p_module.h index 7d8bcc629..e34ffde95 100644 --- a/libasn1parser/asn1p_module.h +++ b/libasn1parser/asn1p_module.h @@ -36,9 +36,9 @@ typedef struct asn1p_module_s { char *source_file_name; /* - * Human-readable module identifier. + * Human-readable module reference. */ - char *Identifier; /* Module name */ + char *ModuleName; /* * Unique module identifier, OID. diff --git a/libasn1parser/asn1p_xports.c b/libasn1parser/asn1p_xports.c index cfc9fa4fa..abe123291 100644 --- a/libasn1parser/asn1p_xports.c +++ b/libasn1parser/asn1p_xports.c @@ -25,10 +25,10 @@ asn1p_xports_new() { void asn1p_xports_free(asn1p_xports_t *xp) { if(xp) { - if(xp->from) - free(xp->from); - if(xp->from_oid) - asn1p_oid_free(xp->from_oid); + if(xp->fromModuleName) + free(xp->fromModuleName); + if(xp->identifier.oid) + asn1p_oid_free(xp->identifier.oid); free(xp); } } diff --git a/libasn1parser/asn1p_xports.h b/libasn1parser/asn1p_xports.h index 8f4fade33..da90de558 100644 --- a/libasn1parser/asn1p_xports.h +++ b/libasn1parser/asn1p_xports.h @@ -17,8 +17,11 @@ typedef struct asn1p_xports_s { /* * Module name and optional OID, occur after FROM. */ - char *from; /* Name of the module */ - asn1p_oid_t *from_oid; /* Optional OID of the module */ + char *fromModuleName; /* Name of the module */ + struct AssignedIdentifier { + asn1p_oid_t *oid; /* Optional OID of the module */ + asn1p_value_t *value; /* DefinedValue */ + } identifier; /* * Number of entities to import. diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index 9656f1731..6c4e9ffaa 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -138,36 +138,41 @@ void asn1p_lexer_hack_push_encoding_control(void); #define yylineno asn1p_lineno extern int asn1p_lineno; +/* + * This temporary variable is used to solve the shortcomings of 1-lookahead + * parser. + */ +static struct AssignedIdentifier *saved_aid; static asn1p_value_t * _convert_bitstring2binary(char *str, int base); -#define checkmem(ptr) do { \ - if(!(ptr)) \ - return yyerror("Memory failure"); \ +#define checkmem(ptr) do { \ + if(!(ptr)) \ + return yyerror("Memory failure"); \ } while(0) -#define CONSTRAINT_INSERT(root, constr_type, arg1, arg2) do { \ - if(arg1->type != constr_type) { \ - int __ret; \ - root = asn1p_constraint_new(yylineno); \ - checkmem(root); \ - root->type = constr_type; \ - __ret = asn1p_constraint_insert(root, \ - arg1); \ - checkmem(__ret == 0); \ - } else { \ - root = arg1; \ - } \ - if(arg2) { \ - int __ret \ - = asn1p_constraint_insert(root, arg2); \ - checkmem(__ret == 0); \ - } \ +#define CONSTRAINT_INSERT(root, constr_type, arg1, arg2) do { \ + if(arg1->type != constr_type) { \ + int __ret; \ + root = asn1p_constraint_new(yylineno); \ + checkmem(root); \ + root->type = constr_type; \ + __ret = asn1p_constraint_insert(root, \ + arg1); \ + checkmem(__ret == 0); \ + } else { \ + root = arg1; \ + } \ + if(arg2) { \ + int __ret \ + = asn1p_constraint_insert(root, arg2); \ + checkmem(__ret == 0); \ + } \ } while(0) -#line 62 "asn1p_y.y" +#line 67 "asn1p_y.y" typedef union { asn1p_t *a_grammar; asn1p_module_flags_e a_module_flags; @@ -177,6 +182,7 @@ typedef union { asn1p_constraint_t *a_constr; /* Constraint */ enum asn1p_constraint_type_e a_ctype;/* Constraint type */ asn1p_xports_t *a_xports; /* IMports/EXports */ + struct AssignedIdentifier a_aid; /* Assigned Identifier */ asn1p_oid_t *a_oid; /* Object Identifier */ asn1p_oid_arc_t a_oid_arc; /* Single OID's arc */ struct asn1p_type_tag_s a_tag; /* A tag */ @@ -210,11 +216,11 @@ typedef union { -#define YYFINAL 425 +#define YYFINAL 426 #define YYFLAG -32768 #define YYNTBASE 118 -#define YYTRANSLATE(x) ((unsigned)(x) <= 356 ? yytranslate[x] : 220) +#define YYTRANSLATE(x) ((unsigned)(x) <= 356 ? yytranslate[x] : 221) static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -260,145 +266,145 @@ static const short yyprhs[] = { 0, 0, 2, 4, 7, 16, 17, 19, 23, 26, 28, 31, 33, 38, 40, 41, 43, 45, 48, 51, 54, 57, 60, 63, 64, 66, 68, 71, 73, 75, 77, - 79, 81, 82, 86, 88, 92, 95, 97, 100, 105, - 107, 111, 113, 117, 119, 123, 127, 130, 132, 136, - 138, 142, 144, 145, 152, 154, 156, 161, 165, 169, - 176, 178, 182, 184, 188, 192, 196, 198, 202, 204, - 206, 207, 209, 211, 215, 219, 223, 225, 227, 231, - 234, 236, 242, 243, 245, 247, 251, 254, 259, 264, - 265, 267, 268, 275, 277, 280, 282, 284, 286, 290, - 294, 298, 300, 305, 310, 315, 322, 329, 331, 336, - 341, 343, 347, 349, 353, 357, 361, 363, 367, 369, - 373, 375, 377, 379, 381, 386, 390, 391, 395, 397, - 399, 401, 403, 405, 407, 409, 411, 413, 417, 419, - 421, 423, 425, 428, 430, 432, 434, 436, 439, 442, - 444, 446, 449, 452, 454, 456, 458, 460, 462, 465, - 467, 470, 472, 474, 476, 478, 480, 482, 484, 486, - 488, 490, 492, 494, 496, 498, 500, 502, 504, 506, - 508, 509, 511, 513, 518, 522, 527, 529, 533, 539, - 541, 545, 549, 553, 557, 562, 566, 568, 570, 574, - 578, 582, 586, 588, 590, 591, 597, 599, 602, 605, - 609, 611, 613, 615, 617, 619, 621, 623, 625, 629, - 635, 637, 641, 643, 647, 648, 650, 652, 654, 656, - 658, 660, 664, 669, 671, 675, 678, 682, 684, 688, - 689, 691, 693, 696, 699, 703, 705, 709, 711, 716, - 721, 723, 725, 727, 729, 730, 732, 735, 740, 741, - 743, 745, 747, 748, 750, 752, 754, 756, 758, 759, - 761 + 79, 81, 82, 86, 88, 92, 95, 97, 100, 101, + 103, 108, 110, 114, 116, 120, 122, 126, 130, 133, + 135, 139, 141, 145, 147, 148, 155, 157, 159, 164, + 168, 172, 179, 181, 185, 187, 191, 195, 199, 201, + 205, 207, 209, 210, 212, 214, 218, 222, 226, 228, + 230, 234, 237, 239, 245, 246, 248, 250, 254, 257, + 262, 267, 268, 270, 271, 278, 280, 283, 285, 287, + 289, 293, 297, 301, 303, 308, 313, 318, 325, 332, + 334, 339, 344, 346, 350, 352, 356, 360, 364, 366, + 370, 372, 376, 378, 380, 382, 384, 389, 393, 394, + 398, 400, 402, 404, 406, 408, 410, 412, 414, 416, + 420, 422, 424, 426, 428, 431, 433, 435, 437, 439, + 442, 445, 447, 449, 452, 455, 457, 459, 461, 463, + 465, 468, 470, 473, 475, 477, 479, 481, 483, 485, + 487, 489, 491, 493, 495, 497, 499, 501, 503, 505, + 507, 509, 511, 512, 514, 516, 521, 525, 530, 532, + 536, 542, 544, 548, 552, 556, 560, 565, 569, 571, + 573, 577, 581, 585, 589, 591, 593, 594, 600, 602, + 605, 608, 612, 614, 616, 618, 620, 622, 624, 626, + 628, 632, 638, 640, 644, 646, 650, 651, 653, 655, + 657, 659, 661, 663, 667, 672, 674, 678, 681, 685, + 687, 691, 692, 694, 696, 699, 702, 706, 708, 712, + 714, 719, 724, 726, 728, 730, 732, 733, 735, 738, + 743, 744, 746, 748, 750, 751, 753, 755, 757, 759, + 761, 762, 764 }; static const short yyrhs[] = { 119, - 0, 120, 0, 119, 120, 0, 216, 121, 36, 125, + 0, 120, 0, 119, 120, 0, 217, 121, 36, 125, 3, 23, 128, 41, 0, 0, 122, 0, 105, 123, 106, 0, 105, 106, 0, 124, 0, 123, 124, 0, - 219, 0, 219, 107, 9, 108, 0, 9, 0, 0, + 220, 0, 220, 107, 9, 108, 0, 9, 0, 0, 126, 0, 127, 0, 126, 127, 0, 43, 86, 0, 54, 86, 0, 22, 86, 0, 45, 55, 0, 14, 59, 0, 0, 129, 0, 130, 0, 129, 130, 0, - 132, 0, 137, 0, 143, 0, 170, 0, 140, 0, - 0, 40, 14, 131, 0, 179, 0, 56, 133, 109, - 0, 56, 48, 0, 134, 0, 133, 134, 0, 135, - 48, 216, 121, 0, 136, 0, 135, 110, 136, 0, - 216, 0, 216, 105, 106, 0, 219, 0, 44, 138, - 109, 0, 44, 19, 109, 0, 44, 109, 0, 139, - 0, 138, 110, 139, 0, 216, 0, 216, 105, 106, - 0, 219, 0, 0, 216, 142, 3, 105, 141, 175, - 0, 165, 0, 176, 0, 216, 3, 211, 89, 0, - 216, 3, 163, 0, 216, 3, 153, 0, 216, 105, - 144, 106, 3, 163, 0, 145, 0, 144, 110, 145, - 0, 216, 0, 216, 111, 219, 0, 216, 111, 216, - 0, 176, 111, 219, 0, 147, 0, 146, 110, 147, - 0, 163, 0, 219, 0, 0, 149, 0, 150, 0, - 149, 110, 150, 0, 219, 163, 205, 0, 32, 70, - 163, 0, 162, 0, 152, 0, 151, 110, 152, 0, - 219, 163, 0, 162, 0, 30, 105, 155, 106, 157, - 0, 0, 90, 0, 156, 0, 155, 110, 156, 0, - 168, 205, 0, 168, 163, 154, 205, 0, 168, 168, - 154, 205, 0, 0, 158, 0, 0, 97, 84, 105, - 159, 160, 106, 0, 161, 0, 160, 161, 0, 4, - 0, 168, 0, 104, 0, 104, 112, 173, 0, 104, - 112, 210, 0, 211, 164, 183, 0, 178, 0, 29, - 105, 151, 106, 0, 80, 105, 148, 106, 0, 81, - 105, 148, 106, 0, 80, 183, 70, 218, 211, 164, - 0, 81, 183, 70, 218, 211, 164, 0, 20, 0, - 20, 37, 27, 219, 0, 216, 105, 146, 106, 0, - 165, 0, 58, 70, 165, 0, 13, 0, 13, 113, - 216, 0, 217, 113, 216, 0, 13, 113, 219, 0, - 217, 0, 217, 113, 166, 0, 167, 0, 166, 113, - 167, 0, 169, 0, 169, 0, 15, 0, 16, 0, - 219, 142, 3, 171, 0, 219, 111, 171, 0, 0, - 105, 172, 175, 0, 65, 0, 47, 0, 88, 0, - 5, 0, 7, 0, 174, 0, 210, 0, 173, 0, - 219, 0, 216, 113, 219, 0, 6, 0, 10, 0, - 11, 0, 4, 0, 175, 4, 0, 26, 0, 65, - 0, 78, 0, 177, 0, 69, 83, 0, 67, 53, - 0, 79, 0, 46, 0, 38, 73, 0, 28, 83, - 0, 93, 0, 49, 0, 179, 0, 60, 0, 42, - 0, 24, 83, 0, 176, 0, 177, 207, 0, 25, - 0, 50, 0, 51, 0, 52, 0, 61, 0, 66, - 0, 76, 0, 85, 0, 87, 0, 92, 0, 94, - 0, 95, 0, 96, 0, 68, 0, 101, 0, 102, - 0, 99, 0, 100, 0, 98, 0, 0, 184, 0, - 185, 0, 82, 107, 186, 108, 0, 107, 186, 108, - 0, 185, 107, 186, 108, 0, 187, 0, 187, 110, - 104, 0, 187, 110, 104, 110, 187, 0, 188, 0, - 19, 98, 188, 0, 187, 180, 188, 0, 187, 181, - 188, 0, 188, 182, 188, 0, 191, 107, 186, 108, - 0, 107, 186, 108, 0, 192, 0, 193, 0, 192, - 190, 192, 0, 63, 190, 192, 0, 192, 190, 62, - 0, 63, 190, 62, 0, 199, 0, 194, 0, 0, - 33, 27, 105, 189, 175, 0, 103, 0, 103, 114, - 0, 114, 103, 0, 114, 103, 114, 0, 82, 0, - 48, 0, 47, 0, 88, 0, 210, 0, 174, 0, - 219, 0, 216, 0, 97, 31, 185, 0, 97, 32, - 105, 195, 106, 0, 196, 0, 195, 110, 196, 0, - 104, 0, 219, 183, 197, 0, 0, 198, 0, 75, - 0, 17, 0, 71, 0, 200, 0, 201, 0, 105, - 216, 106, 0, 200, 105, 202, 106, 0, 203, 0, - 202, 110, 203, 0, 115, 204, 0, 115, 113, 204, - 0, 219, 0, 204, 113, 219, 0, 0, 206, 0, - 71, 0, 35, 171, 0, 105, 106, 0, 105, 208, - 106, 0, 209, 0, 208, 110, 209, 0, 219, 0, - 219, 107, 210, 108, 0, 219, 107, 173, 108, 0, - 210, 0, 104, 0, 9, 0, 12, 0, 0, 212, - 0, 213, 215, 0, 116, 214, 9, 117, 0, 0, - 91, 0, 21, 0, 77, 0, 0, 54, 0, 43, - 0, 13, 0, 14, 0, 14, 0, 0, 219, 0, - 8, 0 + 132, 0, 138, 0, 144, 0, 171, 0, 141, 0, + 0, 40, 14, 131, 0, 180, 0, 56, 133, 109, + 0, 56, 48, 0, 135, 0, 133, 135, 0, 0, + 122, 0, 136, 48, 217, 134, 0, 137, 0, 136, + 110, 137, 0, 217, 0, 217, 105, 106, 0, 220, + 0, 44, 139, 109, 0, 44, 19, 109, 0, 44, + 109, 0, 140, 0, 139, 110, 140, 0, 217, 0, + 217, 105, 106, 0, 220, 0, 0, 217, 143, 3, + 105, 142, 176, 0, 166, 0, 177, 0, 217, 3, + 212, 89, 0, 217, 3, 164, 0, 217, 3, 154, + 0, 217, 105, 145, 106, 3, 164, 0, 146, 0, + 145, 110, 146, 0, 217, 0, 217, 111, 220, 0, + 217, 111, 217, 0, 177, 111, 220, 0, 148, 0, + 147, 110, 148, 0, 164, 0, 220, 0, 0, 150, + 0, 151, 0, 150, 110, 151, 0, 220, 164, 206, + 0, 32, 70, 164, 0, 163, 0, 153, 0, 152, + 110, 153, 0, 220, 164, 0, 163, 0, 30, 105, + 156, 106, 158, 0, 0, 90, 0, 157, 0, 156, + 110, 157, 0, 169, 206, 0, 169, 164, 155, 206, + 0, 169, 169, 155, 206, 0, 0, 159, 0, 0, + 97, 84, 105, 160, 161, 106, 0, 162, 0, 161, + 162, 0, 4, 0, 169, 0, 104, 0, 104, 112, + 174, 0, 104, 112, 211, 0, 212, 165, 184, 0, + 179, 0, 29, 105, 152, 106, 0, 80, 105, 149, + 106, 0, 81, 105, 149, 106, 0, 80, 184, 70, + 219, 212, 165, 0, 81, 184, 70, 219, 212, 165, + 0, 20, 0, 20, 37, 27, 220, 0, 217, 105, + 147, 106, 0, 166, 0, 58, 70, 166, 0, 13, + 0, 13, 113, 217, 0, 218, 113, 217, 0, 13, + 113, 220, 0, 218, 0, 218, 113, 167, 0, 168, + 0, 167, 113, 168, 0, 170, 0, 170, 0, 15, + 0, 16, 0, 220, 143, 3, 172, 0, 220, 111, + 172, 0, 0, 105, 173, 176, 0, 65, 0, 47, + 0, 88, 0, 5, 0, 7, 0, 175, 0, 211, + 0, 174, 0, 220, 0, 217, 113, 220, 0, 6, + 0, 10, 0, 11, 0, 4, 0, 176, 4, 0, + 26, 0, 65, 0, 78, 0, 178, 0, 69, 83, + 0, 67, 53, 0, 79, 0, 46, 0, 38, 73, + 0, 28, 83, 0, 93, 0, 49, 0, 180, 0, + 60, 0, 42, 0, 24, 83, 0, 177, 0, 178, + 208, 0, 25, 0, 50, 0, 51, 0, 52, 0, + 61, 0, 66, 0, 76, 0, 85, 0, 87, 0, + 92, 0, 94, 0, 95, 0, 96, 0, 68, 0, + 101, 0, 102, 0, 99, 0, 100, 0, 98, 0, + 0, 185, 0, 186, 0, 82, 107, 187, 108, 0, + 107, 187, 108, 0, 186, 107, 187, 108, 0, 188, + 0, 188, 110, 104, 0, 188, 110, 104, 110, 188, + 0, 189, 0, 19, 98, 189, 0, 188, 181, 189, + 0, 188, 182, 189, 0, 189, 183, 189, 0, 192, + 107, 187, 108, 0, 107, 187, 108, 0, 193, 0, + 194, 0, 193, 191, 193, 0, 63, 191, 193, 0, + 193, 191, 62, 0, 63, 191, 62, 0, 200, 0, + 195, 0, 0, 33, 27, 105, 190, 176, 0, 103, + 0, 103, 114, 0, 114, 103, 0, 114, 103, 114, + 0, 82, 0, 48, 0, 47, 0, 88, 0, 211, + 0, 175, 0, 220, 0, 217, 0, 97, 31, 186, + 0, 97, 32, 105, 196, 106, 0, 197, 0, 196, + 110, 197, 0, 104, 0, 220, 184, 198, 0, 0, + 199, 0, 75, 0, 17, 0, 71, 0, 201, 0, + 202, 0, 105, 217, 106, 0, 201, 105, 203, 106, + 0, 204, 0, 203, 110, 204, 0, 115, 205, 0, + 115, 113, 205, 0, 220, 0, 205, 113, 220, 0, + 0, 207, 0, 71, 0, 35, 172, 0, 105, 106, + 0, 105, 209, 106, 0, 210, 0, 209, 110, 210, + 0, 220, 0, 220, 107, 211, 108, 0, 220, 107, + 174, 108, 0, 211, 0, 104, 0, 9, 0, 12, + 0, 0, 213, 0, 214, 216, 0, 116, 215, 9, + 117, 0, 0, 91, 0, 21, 0, 77, 0, 0, + 54, 0, 43, 0, 13, 0, 14, 0, 14, 0, + 0, 220, 0, 8, 0 }; #endif #if YYDEBUG != 0 static const short yyrline[] = { 0, - 306, 312, 318, 334, 359, 361, 364, 368, 373, 380, - 388, 393, 397, 406, 408, 416, 420, 428, 432, 435, - 438, 442, 462, 464, 472, 476, 508, 512, 521, 528, - 541, 548, 550, 562, 575, 582, 587, 593, 599, 608, - 614, 620, 627, 633, 641, 645, 648, 655, 661, 667, - 674, 680, 689, 691, 700, 708, 722, 734, 740, 756, - 765, 775, 785, 790, 797, 804, 814, 820, 826, 830, - 853, 855, 857, 863, 869, 876, 883, 888, 894, 900, - 906, 911, 921, 923, 926, 934, 940, 949, 955, 972, - 974, 979, 983, 988, 993, 999, 1003, 1014, 1023, 1032, - 1043, 1065, 1069, 1075, 1081, 1087, 1097, 1107, 1113, 1127, - 1151, 1158, 1172, 1181, 1191, 1201, 1211, 1219, 1240, 1249, - 1258, 1259, 1261, 1268, 1280, 1290, 1298, 1298, 1303, 1308, - 1313, 1318, 1322, 1326, 1329, 1332, 1337, 1349, 1366, 1371, - 1376, 1409, 1419, 1433, 1435, 1436, 1437, 1438, 1439, 1440, - 1441, 1442, 1443, 1444, 1445, 1446, 1452, 1454, 1455, 1458, - 1465, 1477, 1479, 1483, 1487, 1488, 1489, 1490, 1491, 1495, - 1496, 1497, 1498, 1502, 1503, 1510, 1510, 1511, 1511, 1512, - 1514, 1516, 1521, 1525, 1534, 1538, 1543, 1547, 1553, 1563, - 1567, 1570, 1573, 1576, 1581, 1590, 1598, 1604, 1610, 1617, - 1625, 1633, 1642, 1645, 1648, 1649, 1659, 1661, 1662, 1663, - 1666, 1670, 1675, 1681, 1686, 1689, 1692, 1705, 1719, 1723, - 1728, 1732, 1737, 1744, 1757, 1759, 1762, 1766, 1769, 1774, - 1778, 1786, 1801, 1807, 1814, 1827, 1839, 1854, 1858, 1875, - 1880, 1883, 1888, 1910, 1915, 1920, 1926, 1932, 1940, 1948, - 1956, 1963, 1973, 1978, 2008, 2010, 2013, 2020, 2026, 2028, - 2029, 2030, 2033, 2035, 2036, 2039, 2044, 2051, 2058, 2060, - 2065 + 313, 319, 325, 341, 366, 368, 371, 375, 380, 387, + 395, 400, 404, 413, 415, 423, 427, 435, 439, 442, + 445, 449, 469, 471, 479, 483, 515, 519, 528, 535, + 548, 555, 557, 569, 582, 593, 598, 604, 610, 612, + 615, 626, 632, 638, 645, 651, 659, 663, 666, 673, + 679, 685, 692, 698, 707, 709, 718, 726, 740, 752, + 758, 774, 783, 793, 803, 808, 815, 822, 832, 838, + 844, 848, 871, 873, 875, 881, 887, 894, 901, 906, + 912, 918, 924, 929, 939, 941, 944, 952, 958, 967, + 973, 990, 992, 997, 1001, 1006, 1011, 1017, 1021, 1032, + 1041, 1050, 1061, 1083, 1087, 1093, 1099, 1105, 1115, 1125, + 1131, 1145, 1169, 1176, 1190, 1199, 1209, 1219, 1229, 1237, + 1258, 1267, 1276, 1277, 1279, 1286, 1298, 1308, 1316, 1316, + 1321, 1326, 1331, 1336, 1340, 1344, 1347, 1350, 1355, 1367, + 1384, 1389, 1394, 1427, 1437, 1451, 1453, 1454, 1455, 1456, + 1457, 1458, 1459, 1460, 1461, 1462, 1463, 1464, 1470, 1472, + 1473, 1476, 1483, 1495, 1497, 1501, 1505, 1506, 1507, 1508, + 1509, 1513, 1514, 1515, 1516, 1520, 1521, 1528, 1528, 1529, + 1529, 1530, 1532, 1534, 1539, 1543, 1552, 1556, 1561, 1565, + 1571, 1581, 1585, 1588, 1591, 1594, 1599, 1608, 1616, 1622, + 1628, 1635, 1643, 1651, 1660, 1663, 1666, 1667, 1677, 1679, + 1680, 1681, 1684, 1688, 1693, 1699, 1704, 1707, 1710, 1723, + 1737, 1741, 1746, 1750, 1755, 1762, 1775, 1777, 1780, 1784, + 1787, 1792, 1796, 1804, 1819, 1825, 1832, 1845, 1857, 1872, + 1876, 1893, 1898, 1901, 1906, 1928, 1933, 1938, 1944, 1950, + 1958, 1966, 1974, 1981, 1991, 1996, 2026, 2028, 2031, 2038, + 2044, 2046, 2047, 2048, 2051, 2053, 2054, 2057, 2062, 2069, + 2076, 2078, 2083 }; #endif @@ -429,14 +435,14 @@ static const char * const yytname[] = { "$","error","$undefined.","TOK_PPEQ", "ModuleSpecification","optObjectIdentifier","ObjectIdentifier","ObjectIdentifierBody", "ObjectIdentifierElement","optModuleSpecificationFlags","ModuleSpecificationFlags", "ModuleSpecificationFlag","optModuleSpecificationBody","ModuleSpecificationBody", -"ModuleSpecificationElement","@1","ImportsDefinition","ImportsBundleSet","ImportsBundle", -"ImportsList","ImportsElement","ExportsDefinition","ExportsBody","ExportsElement", -"ValueSetDefinition","@2","DefinedTypeRef","DataTypeReference","ParameterArgumentList", -"ParameterArgumentName","ActualParameterList","ActualParameter","optComponentTypeLists", -"ComponentTypeLists","ComponentType","AlternativeTypeLists","AlternativeType", -"ClassDeclaration","optUnique","ClassFieldList","ClassField","optWithSyntax", -"WithSyntax","@3","WithSyntaxFormat","WithSyntaxFormatToken","ExtensionAndException", -"Type","TypeDeclaration","ComplexTypeReference","ComplexTypeReferenceAmpList", +"ModuleSpecificationElement","@1","ImportsDefinition","ImportsBundleSet","AssignedIdentifier", +"ImportsBundle","ImportsList","ImportsElement","ExportsDefinition","ExportsBody", +"ExportsElement","ValueSetDefinition","@2","DefinedTypeRef","DataTypeReference", +"ParameterArgumentList","ParameterArgumentName","ActualParameterList","ActualParameter", +"optComponentTypeLists","ComponentTypeLists","ComponentType","AlternativeTypeLists", +"AlternativeType","ClassDeclaration","optUnique","ClassFieldList","ClassField", +"optWithSyntax","WithSyntax","@3","WithSyntaxFormat","WithSyntaxFormatToken", +"ExtensionAndException","Type","TypeDeclaration","ComplexTypeReference","ComplexTypeReferenceAmpList", "ComplexTypeReferenceElement","ClassFieldIdentifier","ClassFieldName","ValueDefinition", "Value","@4","DefinedValue","RestrictedCharacterStringValue","Opaque","BasicTypeId", "BasicTypeId_UniverationCompatible","BasicType","BasicString","Union","Intersection", @@ -455,358 +461,358 @@ static const short yyr1[] = { 0, 118, 119, 119, 120, 121, 121, 122, 122, 123, 123, 124, 124, 124, 125, 125, 126, 126, 127, 127, 127, 127, 127, 128, 128, 129, 129, 130, 130, 130, 130, - 130, 131, 130, 130, 132, 132, 133, 133, 134, 135, - 135, 136, 136, 136, 137, 137, 137, 138, 138, 139, - 139, 139, 141, 140, 142, 142, 143, 143, 143, 143, - 144, 144, 145, 145, 145, 145, 146, 146, 147, 147, - 148, 148, 149, 149, 150, 150, 150, 151, 151, 152, - 152, 153, 154, 154, 155, 155, 156, 156, 156, 157, - 157, 159, 158, 160, 160, 161, 161, 162, 162, 162, - 163, 164, 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 165, 165, 165, 165, 165, 165, 166, 166, - 167, 168, 169, 169, 170, 171, 172, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 173, 173, 174, 174, - 174, 175, 175, 176, 176, 176, 176, 176, 176, 176, - 176, 176, 176, 176, 176, 176, 177, 177, 177, 178, - 178, 179, 179, 179, 179, 179, 179, 179, 179, 179, - 179, 179, 179, 179, 179, 180, 180, 181, 181, 182, - 183, 183, 184, 184, 185, 185, 186, 186, 186, 187, - 187, 187, 187, 187, 188, 188, 188, 188, 188, 188, - 188, 188, 188, 188, 189, 188, 190, 190, 190, 190, - 191, 191, 192, 192, 192, 192, 192, 193, 194, 194, - 195, 195, 196, 196, 197, 197, 198, 198, 198, 199, - 199, 200, 201, 202, 202, 203, 203, 204, 204, 205, - 205, 206, 206, 207, 207, 208, 208, 209, 209, 209, - 209, 209, 210, 210, 211, 211, 212, 213, 214, 214, - 214, 214, 215, 215, 215, 216, 216, 217, 218, 218, - 219 + 130, 131, 130, 130, 132, 132, 133, 133, 134, 134, + 135, 136, 136, 137, 137, 137, 138, 138, 138, 139, + 139, 140, 140, 140, 142, 141, 143, 143, 144, 144, + 144, 144, 145, 145, 146, 146, 146, 146, 147, 147, + 148, 148, 149, 149, 150, 150, 151, 151, 151, 152, + 152, 153, 153, 154, 155, 155, 156, 156, 157, 157, + 157, 158, 158, 160, 159, 161, 161, 162, 162, 163, + 163, 163, 164, 165, 165, 165, 165, 165, 165, 165, + 165, 165, 165, 165, 166, 166, 166, 166, 166, 166, + 167, 167, 168, 169, 170, 170, 171, 172, 173, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 174, 174, + 175, 175, 175, 176, 176, 177, 177, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 177, 177, 178, 178, + 178, 179, 179, 180, 180, 180, 180, 180, 180, 180, + 180, 180, 180, 180, 180, 180, 180, 181, 181, 182, + 182, 183, 184, 184, 185, 185, 186, 186, 187, 187, + 187, 188, 188, 188, 188, 188, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 190, 189, 191, 191, + 191, 191, 192, 192, 193, 193, 193, 193, 193, 194, + 195, 195, 196, 196, 197, 197, 198, 198, 199, 199, + 199, 200, 200, 201, 202, 203, 203, 204, 204, 205, + 205, 206, 206, 207, 207, 208, 208, 209, 209, 210, + 210, 210, 210, 210, 211, 211, 212, 212, 213, 214, + 215, 215, 215, 215, 216, 216, 216, 217, 217, 218, + 219, 219, 220 }; static const short yyr2[] = { 0, 1, 1, 2, 8, 0, 1, 3, 2, 1, 2, 1, 4, 1, 0, 1, 1, 2, 2, 2, 2, 2, 2, 0, 1, 1, 2, 1, 1, 1, 1, - 1, 0, 3, 1, 3, 2, 1, 2, 4, 1, - 3, 1, 3, 1, 3, 3, 2, 1, 3, 1, - 3, 1, 0, 6, 1, 1, 4, 3, 3, 6, - 1, 3, 1, 3, 3, 3, 1, 3, 1, 1, - 0, 1, 1, 3, 3, 3, 1, 1, 3, 2, - 1, 5, 0, 1, 1, 3, 2, 4, 4, 0, - 1, 0, 6, 1, 2, 1, 1, 1, 3, 3, - 3, 1, 4, 4, 4, 6, 6, 1, 4, 4, - 1, 3, 1, 3, 3, 3, 1, 3, 1, 3, - 1, 1, 1, 1, 4, 3, 0, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, - 1, 1, 2, 1, 1, 1, 1, 2, 2, 1, - 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 3, 1, 3, 2, 1, 2, 0, 1, + 4, 1, 3, 1, 3, 1, 3, 3, 2, 1, + 3, 1, 3, 1, 0, 6, 1, 1, 4, 3, + 3, 6, 1, 3, 1, 3, 3, 3, 1, 3, + 1, 1, 0, 1, 1, 3, 3, 3, 1, 1, + 3, 2, 1, 5, 0, 1, 1, 3, 2, 4, + 4, 0, 1, 0, 6, 1, 2, 1, 1, 1, + 3, 3, 3, 1, 4, 4, 4, 6, 6, 1, + 4, 4, 1, 3, 1, 3, 3, 3, 1, 3, + 1, 3, 1, 1, 1, 1, 4, 3, 0, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, + 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, + 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 1, 1, 4, 3, 4, 1, 3, 5, 1, - 3, 3, 3, 3, 4, 3, 1, 1, 3, 3, - 3, 3, 1, 1, 0, 5, 1, 2, 2, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, - 1, 3, 1, 3, 0, 1, 1, 1, 1, 1, - 1, 3, 4, 1, 3, 2, 3, 1, 3, 0, - 1, 1, 2, 2, 3, 1, 3, 1, 4, 4, - 1, 1, 1, 1, 0, 1, 2, 4, 0, 1, - 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, - 1 + 1, 1, 0, 1, 1, 4, 3, 4, 1, 3, + 5, 1, 3, 3, 3, 3, 4, 3, 1, 1, + 3, 3, 3, 3, 1, 1, 0, 5, 1, 2, + 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 5, 1, 3, 1, 3, 0, 1, 1, 1, + 1, 1, 1, 3, 4, 1, 3, 2, 3, 1, + 3, 0, 1, 1, 2, 2, 3, 1, 3, 1, + 4, 4, 1, 1, 1, 1, 0, 1, 2, 4, + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, + 0, 1, 1 }; static const short yydefact[] = { 0, - 266, 267, 1, 2, 5, 3, 0, 0, 6, 271, + 268, 269, 1, 2, 5, 3, 0, 0, 6, 273, 13, 8, 0, 9, 11, 14, 7, 10, 0, 0, 0, 0, 0, 0, 0, 15, 16, 0, 22, 20, - 18, 21, 19, 0, 17, 12, 23, 162, 0, 0, - 163, 164, 165, 0, 166, 167, 175, 168, 169, 170, - 171, 172, 173, 174, 0, 24, 25, 27, 28, 31, - 29, 30, 34, 0, 0, 32, 0, 47, 0, 48, - 50, 52, 36, 0, 37, 0, 40, 42, 44, 4, - 26, 255, 113, 268, 0, 144, 0, 0, 158, 151, - 155, 157, 145, 0, 0, 146, 150, 154, 0, 0, - 55, 56, 147, 156, 117, 0, 33, 46, 45, 0, - 0, 35, 38, 0, 0, 0, 0, 259, 59, 58, - 0, 256, 263, 0, 159, 153, 152, 149, 148, 0, - 61, 0, 63, 0, 0, 0, 49, 51, 5, 41, - 43, 0, 261, 262, 260, 0, 113, 268, 108, 0, - 0, 181, 181, 57, 181, 111, 160, 147, 102, 0, - 265, 264, 257, 114, 116, 0, 0, 0, 0, 53, - 123, 124, 118, 119, 121, 115, 132, 139, 133, 253, - 140, 141, 254, 130, 129, 131, 127, 125, 136, 134, - 135, 0, 137, 39, 0, 85, 255, 122, 0, 0, - 0, 0, 0, 71, 0, 0, 182, 183, 71, 0, - 101, 0, 161, 255, 255, 62, 66, 65, 64, 0, - 0, 0, 0, 0, 90, 0, 0, 242, 83, 83, - 87, 241, 0, 258, 0, 98, 0, 78, 81, 255, - 112, 0, 0, 0, 72, 73, 77, 255, 0, 0, - 213, 212, 0, 211, 214, 0, 0, 0, 216, 0, - 187, 190, 0, 197, 198, 204, 203, 230, 231, 215, - 218, 217, 269, 0, 0, 269, 252, 244, 0, 246, - 251, 248, 0, 67, 69, 70, 60, 142, 54, 120, - 128, 138, 126, 0, 82, 91, 86, 243, 84, 240, - 240, 109, 0, 103, 0, 80, 0, 255, 104, 0, - 240, 0, 0, 207, 0, 0, 0, 0, 0, 0, - 185, 178, 179, 176, 177, 0, 0, 0, 180, 0, - 0, 0, 0, 255, 270, 0, 105, 255, 245, 0, - 0, 110, 255, 143, 0, 88, 89, 99, 100, 137, - 79, 184, 76, 74, 75, 191, 205, 208, 209, 202, - 200, 219, 0, 232, 196, 188, 192, 193, 194, 0, - 201, 199, 0, 0, 234, 0, 186, 0, 247, 0, - 0, 68, 92, 0, 210, 223, 0, 221, 181, 0, - 195, 0, 236, 238, 233, 0, 106, 107, 250, 249, - 0, 206, 220, 0, 225, 189, 237, 0, 235, 96, - 0, 94, 97, 222, 228, 229, 227, 224, 226, 239, - 93, 95, 0, 0, 0 + 18, 21, 19, 0, 17, 12, 23, 164, 0, 0, + 165, 166, 167, 0, 168, 169, 177, 170, 171, 172, + 173, 174, 175, 176, 0, 24, 25, 27, 28, 31, + 29, 30, 34, 0, 0, 32, 0, 49, 0, 50, + 52, 54, 36, 0, 37, 0, 42, 44, 46, 4, + 26, 257, 115, 270, 0, 146, 0, 0, 160, 153, + 157, 159, 147, 0, 0, 148, 152, 156, 0, 0, + 57, 58, 149, 158, 119, 0, 33, 48, 47, 0, + 0, 35, 38, 0, 0, 0, 0, 261, 61, 60, + 0, 258, 265, 0, 161, 155, 154, 151, 150, 0, + 63, 0, 65, 0, 0, 0, 51, 53, 39, 43, + 45, 0, 263, 264, 262, 0, 115, 270, 110, 0, + 0, 183, 183, 59, 183, 113, 162, 149, 104, 0, + 267, 266, 259, 116, 118, 0, 0, 0, 0, 55, + 125, 126, 120, 121, 123, 117, 134, 141, 135, 255, + 142, 143, 256, 132, 131, 133, 129, 127, 138, 136, + 137, 0, 139, 40, 41, 0, 87, 257, 124, 0, + 0, 0, 0, 0, 73, 0, 0, 184, 185, 73, + 0, 103, 0, 163, 257, 257, 64, 68, 67, 66, + 0, 0, 0, 0, 0, 92, 0, 0, 244, 85, + 85, 89, 243, 0, 260, 0, 100, 0, 80, 83, + 257, 114, 0, 0, 0, 74, 75, 79, 257, 0, + 0, 215, 214, 0, 213, 216, 0, 0, 0, 218, + 0, 189, 192, 0, 199, 200, 206, 205, 232, 233, + 217, 220, 219, 271, 0, 0, 271, 254, 246, 0, + 248, 253, 250, 0, 69, 71, 72, 62, 144, 56, + 122, 130, 140, 128, 0, 84, 93, 88, 245, 86, + 242, 242, 111, 0, 105, 0, 82, 0, 257, 106, + 0, 242, 0, 0, 209, 0, 0, 0, 0, 0, + 0, 187, 180, 181, 178, 179, 0, 0, 0, 182, + 0, 0, 0, 0, 257, 272, 0, 107, 257, 247, + 0, 0, 112, 257, 145, 0, 90, 91, 101, 102, + 139, 81, 186, 78, 76, 77, 193, 207, 210, 211, + 204, 202, 221, 0, 234, 198, 190, 194, 195, 196, + 0, 203, 201, 0, 0, 236, 0, 188, 0, 249, + 0, 0, 70, 94, 0, 212, 225, 0, 223, 183, + 0, 197, 0, 238, 240, 235, 0, 108, 109, 252, + 251, 0, 208, 222, 0, 227, 191, 239, 0, 237, + 98, 0, 96, 99, 224, 230, 231, 229, 226, 228, + 241, 95, 97, 0, 0, 0 }; -static const short yydefgoto[] = { 423, +static const short yydefgoto[] = { 424, 3, 4, 8, 9, 13, 14, 25, 26, 27, 55, - 56, 57, 107, 58, 74, 75, 76, 77, 59, 69, - 70, 60, 220, 100, 61, 130, 131, 283, 284, 244, - 245, 246, 237, 238, 119, 300, 195, 196, 295, 296, - 401, 411, 412, 247, 285, 155, 156, 173, 174, 197, - 198, 62, 188, 222, 189, 259, 289, 157, 103, 159, - 104, 327, 328, 330, 206, 207, 208, 260, 261, 262, - 384, 316, 263, 264, 265, 266, 387, 388, 418, 419, - 267, 268, 269, 374, 375, 393, 231, 232, 213, 279, - 280, 270, 233, 122, 123, 146, 163, 271, 105, 334, - 272 + 56, 57, 107, 58, 74, 195, 75, 76, 77, 59, + 69, 70, 60, 221, 100, 61, 130, 131, 284, 285, + 245, 246, 247, 238, 239, 119, 301, 196, 197, 296, + 297, 402, 412, 413, 248, 286, 155, 156, 173, 174, + 198, 199, 62, 188, 223, 189, 260, 290, 157, 103, + 159, 104, 328, 329, 331, 207, 208, 209, 261, 262, + 263, 385, 317, 264, 265, 266, 267, 388, 389, 419, + 420, 268, 269, 270, 375, 376, 394, 232, 233, 214, + 280, 281, 271, 234, 122, 123, 146, 163, 272, 105, + 335, 273 }; -static const short yypact[] = { 228, --32768,-32768, 228,-32768, -83,-32768, 30, 43,-32768,-32768, --32768,-32768, 36,-32768, -14, 181,-32768,-32768, 132, 85, - 68, 73, 109, 95, 193, 181,-32768, 93,-32768,-32768, --32768,-32768,-32768, 189,-32768,-32768, 429,-32768, 209, 21, --32768,-32768,-32768, 144,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 184, 429,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 354, 658,-32768, 118,-32768, 190,-32768, - 134,-32768,-32768, 18,-32768, -27,-32768, 156,-32768,-32768, --32768, -12, 150,-32768, 182,-32768, 204, 195,-32768,-32768, --32768,-32768,-32768, 236, 212,-32768,-32768,-32768, 733, 299, --32768,-32768,-32768,-32768, 205, 316,-32768,-32768,-32768, 185, - 216,-32768,-32768, 228, 185, 217, 219, 25,-32768,-32768, - 506,-32768, 117, 185,-32768,-32768,-32768,-32768,-32768, -55, --32768, 210, 214, 223, 266, 63,-32768,-32768, -83,-32768, --32768, 268,-32768,-32768,-32768, 321, 34, 226, 295, 232, - 269, -18, -17,-32768, -2,-32768,-32768, 233,-32768, 235, --32768,-32768,-32768,-32768,-32768, 338, 733, 334, 185,-32768, --32768,-32768, 234,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +static const short yypact[] = { 87, +-32768,-32768, 87,-32768, -69,-32768, 35, 82,-32768,-32768, +-32768,-32768, 37,-32768, -78, 156,-32768,-32768, 114, -6, + 89, 108, 147, 125, 151, 156,-32768, 106,-32768,-32768, +-32768,-32768,-32768, 196,-32768,-32768, 430,-32768, 213, 44, +-32768,-32768,-32768, 56,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 193, 430,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 355, 659,-32768, 137,-32768, -86,-32768, + 159,-32768,-32768, 18,-32768, -23,-32768, 161,-32768,-32768, +-32768, 32, 168,-32768, 199,-32768, 200, 215,-32768,-32768, +-32768,-32768,-32768, 232, 207,-32768,-32768,-32768, 734, 293, +-32768,-32768,-32768,-32768, 187, 298,-32768,-32768,-32768, 212, + 197,-32768,-32768, 87, 212, 203, 205, 14,-32768,-32768, + 507,-32768, 112, 212,-32768,-32768,-32768,-32768,-32768, -8, +-32768, 204, 218, 221, 304, 68,-32768,-32768, -69,-32768, +-32768, 122,-32768,-32768,-32768, 302, 55, 226, 295, 233, + 263, 58, 75,-32768, -14,-32768,-32768, 234,-32768, 235, +-32768,-32768,-32768,-32768,-32768, 338, 734, 334, 212,-32768, +-32768,-32768, 230,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768, 237, 242,-32768, 81,-32768, 27,-32768, 231, 322, - 11, 240, 247, 49, 238, 285,-32768, 251, 49, 289, --32768, 44,-32768, 7, 244,-32768,-32768,-32768,-32768, 358, - 268, 358, 334, 63, 267, 268, 63,-32768, 273, 273, --32768,-32768, 583,-32768, 334, 253, 98,-32768,-32768, 244, --32768, 238, 302, 270, 263,-32768,-32768, 244, 276, 348, --32768,-32768, 64,-32768,-32768, 275, 228, 238,-32768, 279, - 130, 283, 277, 64,-32768,-32768,-32768, 272,-32768,-32768, --32768,-32768, 334, 238, 284, 334,-32768,-32768, 100,-32768, --32768, 286, 105,-32768,-32768,-32768,-32768,-32768, 379,-32768, - 379,-32768,-32768, 305,-32768,-32768,-32768,-32768,-32768, -10, - -10,-32768, 296,-32768, 11,-32768, 287, 244,-32768, 49, - -10, 264, 293, 280, 288, 174, 292, 297, 301, 300, --32768,-32768,-32768,-32768,-32768, 306, 264, 264,-32768, 264, - 238, 282, 294, 244,-32768, 303,-32768, 244,-32768, 51, - 296,-32768, 7,-32768, 307,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 304,-32768, --32768, 251, 28,-32768,-32768, 314,-32768,-32768,-32768, 308, --32768,-32768, 6, 112,-32768, 583,-32768, 583,-32768, 309, - 317,-32768,-32768, 358,-32768,-32768, 154,-32768, -2, 238, --32768, 334, 313,-32768,-32768, 294,-32768,-32768,-32768,-32768, - 159, 379,-32768, 28, 24, 215, 313, 334,-32768,-32768, - 12,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768, 413, 427,-32768 +-32768, 236, 237,-32768,-32768, 61,-32768, 26,-32768, 238, + 323, 7, 241, 244, 40, 239, 284,-32768, 249, 40, + 289,-32768, 77,-32768, 6, 245,-32768,-32768,-32768,-32768, + 356, 122, 356, 334, 68, 266, 122, 68,-32768, 274, + 274,-32768,-32768, 584,-32768, 334, 253, 78,-32768,-32768, + 245,-32768, 239, 296, 267, 264,-32768,-32768, 245, 277, + 349,-32768,-32768, -20,-32768,-32768, 231, 87, 239,-32768, + 269, 206, 280, 275, -20,-32768,-32768,-32768, 279,-32768, +-32768,-32768,-32768, 334, 239, 282, 334,-32768,-32768, 94, +-32768,-32768, 278, 99,-32768,-32768,-32768,-32768,-32768, 386, +-32768, 386,-32768,-32768, 307,-32768,-32768,-32768,-32768,-32768, + 64, 64,-32768, 228,-32768, 7,-32768, 286, 245,-32768, + 40, 64, 265, 287, 281, 297, 181, 292, 291, 303, + 300,-32768,-32768,-32768,-32768,-32768, 299, 265, 265,-32768, + 265, 239, 283, 310, 245,-32768, 305,-32768, 245,-32768, + 47, 228,-32768, 6,-32768, 306,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 312, +-32768,-32768, 249, 12,-32768,-32768, 308,-32768,-32768,-32768, + 309,-32768,-32768, 13, 155,-32768, 584,-32768, 584,-32768, + 311, 319,-32768,-32768, 356,-32768,-32768, 174,-32768, -14, + 239,-32768, 334, 301,-32768,-32768, 310,-32768,-32768,-32768, +-32768, 143, 386,-32768, 12, 17, 223, 301, 334,-32768, +-32768, 24,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 410, 412,-32768 }; static const short yypgoto[] = {-32768, --32768, 425, 290,-32768,-32768, 418,-32768,-32768, 408,-32768, --32768, 380,-32768,-32768,-32768, 361,-32768, 323,-32768,-32768, - 330,-32768,-32768, 386,-32768,-32768, 278,-32768, 101, 243, --32768, 143,-32768, 151,-32768, 225,-32768, 239,-32768,-32768, --32768,-32768, 46, -184, -75, -284, -53,-32768, 241, -192, - -115,-32768, -89,-32768, -255, -58, -214, -41, -120,-32768, - 45,-32768,-32768,-32768, -151,-32768, 141, -86, 70, -216, --32768, 197,-32768, -225,-32768,-32768,-32768, 59,-32768,-32768, --32768,-32768,-32768,-32768, 71, 72, -111,-32768,-32768,-32768, - 126, -127, -79,-32768,-32768,-32768,-32768, 10,-32768, 192, - -7 +-32768, 425,-32768, 290,-32768, 417,-32768,-32768, 406,-32768, +-32768, 379,-32768,-32768,-32768,-32768, 362,-32768, 322,-32768, +-32768, 329,-32768,-32768, 376,-32768,-32768, 285,-32768, 101, + 243,-32768, 135,-32768, 148,-32768, 225,-32768, 240,-32768, +-32768,-32768,-32768, 45, -193, -77, -203, -53,-32768, 242, + -190, -116,-32768, -12,-32768, -277, -76, -216, -48, -120, +-32768, 34,-32768,-32768,-32768, -151,-32768, 140, -147, 70, + -98,-32768, 194,-32768, -295,-32768,-32768,-32768, 57,-32768, +-32768,-32768,-32768,-32768,-32768, 66, 72, -105,-32768,-32768, +-32768, 127, -118, -79,-32768,-32768,-32768,-32768, 10,-32768, + 189, -7 }; -#define YYLAST 829 +#define YYLAST 830 static const short yytable[] = { 15, - 158, 210, 121, 211, 230, 15, 120, 291, 191, 5, - 101, 101, 5, 10, 10, 410, 239, 117, 10, 175, - 114, 7, 102, 102, 227, 10, 171, 172, 10, 65, - 1, 2, 72, 1, 2, 10, 79, 10, 11, 67, - 415, 171, 172, 10, 11, 143, 64, 348, 65, 71, - 166, 10, 180, 78, 167, 183, 10, 132, 10, 180, - 228, 227, 183, 203, 203, 64, 79, 177, 178, 179, - 10, 180, 181, 182, 183, 1, 2, 190, 16, 203, - 243, 63, 115, 78, 281, 380, 204, 209, 205, 205, - 361, 397, 19, 398, 416, 356, 191, 228, 417, 191, - 63, 144, 72, 118, 205, 175, 372, 79, 133, 184, - 367, 368, 158, 369, 236, 145, 165, 421, 392, 71, - 239, 229, 118, 139, 78, 132, 112, 185, 193, 68, - 160, 386, -240, 164, 293, 12, -240, 298, -266, 287, - 28, 17, 118, 29, 176, 192, 124, 277, 241, 278, - 186, 10, 236, 30, 277, 307, 1, 2, 31, 161, - 217, 219, 410, 32, 306, 190, 314, 187, 190, 402, - 162, 320, 311, 171, 172, 349, 133, 315, 218, 178, - 33, 10, 180, 181, 182, 183, 225, 336, 346, 347, - 226, 73, 10, 240, 20, 34, 248, 1, 2, 355, - 36, 248, 21, 304, 282, 339, 286, 305, 413, 340, - 342, 37, 281, 381, 343, 292, 193, 395, 413, 193, - 251, 396, 66, 22, 80, 23, 108, 302, 322, 323, - 324, 325, 353, 192, 24, 360, 192, 405, 111, 326, - 1, 2, 160, 178, 370, 10, 180, 181, 182, 183, - 1, 2, 83, 84, 376, 158, 249, 158, 378, 403, - 116, 255, 124, 404, 125, 335, 319, 127, 335, 178, - 250, 10, 180, 181, 182, 183, 1, 2, 1, 2, - 171, 172, 171, 172, 251, 252, 126, 178, 128, 10, - 180, 181, 182, 183, 129, 350, 250, 240, 109, 110, - 253, 134, 248, 10, 180, 317, 318, 183, 1, 2, - 251, 252, 192, 322, 323, 324, 325, 135, 136, 254, - 168, 138, 141, 142, 169, 255, 253, 170, 251, 199, - -267, 200, 282, 350, 256, 286, 201, 212, 202, 214, - 215, 10, 257, 371, 258, 254, 221, 234, 235, 223, - 192, 255, 224, 242, 273, 389, 82, 274, 276, 118, - 256, 288, 299, 294, 303, 394, 83, 84, 257, 255, - 258, 308, 310, 312, 313, 309, 333, 85, 38, 86, - 329, 87, 344, 331, 394, 160, 321, 160, 345, 337, - 359, 88, 341, 358, 352, 89, 389, 357, 205, 90, - 420, 363, 91, 41, 42, 43, 364, 365, 373, 366, - 377, 383, 424, 92, 45, 391, 399, 385, 93, 46, - 94, 47, 95, 390, 400, 408, 425, 6, 194, 48, - 18, 96, 97, 35, 113, 81, 10, 140, 49, 137, - 50, 1, 2, 382, 216, 51, 98, 52, 53, 54, - 106, 275, 354, 38, 301, 351, 422, 362, 99, 406, - 332, 290, 414, 407, 297, 379, 409, 338, 39, 0, - 0, 0, 40, 0, 0, 0, 0, 0, 41, 42, - 43, 0, 0, 0, 44, 0, 0, 0, 0, 45, - 0, 0, 0, 0, 46, 0, 47, 0, 0, 0, - 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, - 0, 0, 0, 49, 0, 50, 0, 0, 147, 148, - 51, 0, 52, 53, 54, 149, 0, 0, 0, 85, - 38, 86, 0, 87, 150, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, - 0, 90, 0, 0, 91, 41, 42, 43, 0, 0, - 0, 0, 0, 151, 0, 92, 45, 0, 0, 0, - 93, 46, 94, 47, 95, 0, 0, 0, 0, 0, - 0, 48, 0, 96, 97, 152, 153, 0, 0, 0, - 49, 0, 50, 0, 154, 147, 148, 51, 98, 52, - 53, 54, 149, 0, 0, 0, 85, 38, 86, 0, - 87, 150, 0, 0, 0, 0, 0, 0, 0, 0, - 88, 0, 0, 0, 89, 0, 0, 0, 90, 0, - 0, 91, 41, 42, 43, 0, 0, 0, 0, 0, - 151, 0, 92, 45, 0, 0, 0, 93, 46, 94, - 47, 95, 0, 0, 0, 0, 0, 0, 48, 0, - 96, 97, 152, 153, 0, 0, 0, 49, 0, 50, - 83, 84, 0, 0, 51, 98, 52, 53, 54, 0, - 0, 85, 38, 86, 0, 87, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 88, 0, 0, 0, 89, - 0, 0, 0, 90, 0, 0, 91, 41, 42, 43, - 0, 0, 0, 0, 0, 0, 0, 92, 45, 0, - 0, 0, 93, 46, 94, 47, 95, 0, 0, 0, - 0, 0, 0, 48, 0, 96, 97, 0, 0, 0, - 0, 0, 49, 0, 50, 1, 2, 0, 0, 51, - 98, 52, 53, 54, 0, 0, 85, 38, 86, 0, - 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 88, 0, 0, 0, 89, 0, 0, 0, 90, 0, - 0, 91, 41, 42, 43, 0, 0, 0, 0, 0, - 0, 0, 92, 45, 0, 0, 0, 93, 46, 94, - 47, 95, 0, 0, 0, 0, 0, 0, 48, 0, - 96, 97, 0, 0, 0, 0, 0, 49, 0, 50, - 0, 0, 0, 0, 51, 98, 52, 53, 54 + 158, 211, 121, 212, 120, 15, 292, 231, 240, 5, + 101, 101, 5, 10, 10, 102, 102, 191, 175, 10, + 10, 362, 109, 110, 114, 10, 349, 411, 19, 65, + 1, 2, 72, 416, 143, 7, 79, 373, 171, 172, + 171, 172, 10, 11, 10, 11, 64, 10, 65, 71, + 132, 10, 29, 78, 10, 180, 1, 2, 183, 190, + 228, 117, 67, 10, 381, 64, 79, 204, 1, 2, + 63, 244, 177, 178, 179, 10, 180, 181, 182, 183, + 1, 2, 315, 78, 10, 180, 115, 417, 183, 63, + 144, 418, 206, 316, 282, 308, 229, 166, 228, 1, + 2, 167, 72, 73, 145, 175, 191, 79, 133, 191, + 237, 321, 240, 158, 184, 387, 165, 16, 132, 71, + 230, 118, 28, 139, 78, 393, 112, 337, 193, 422, + 160, -242, 185, 164, 229, -242, 171, 172, 288, 204, + 12, 118, 17, 237, 176, 192, 411, 118, 190, 242, + 278, 190, 68, 34, 161, 186, 204, 171, 172, -268, + 218, 220, 205, 307, 206, 162, 226, 124, 403, 20, + 227, 312, 187, 398, 30, 399, 133, 21, 219, 210, + 278, 206, 279, 305, 371, 350, 178, 306, 10, 180, + 181, 182, 183, 31, 241, 347, 348, 249, 22, 340, + 23, 32, 249, 341, 343, 283, 356, 287, 344, 24, + 33, 414, 294, 36, 357, 299, 293, 193, 37, 10, + 193, 414, 282, 382, 1, 2, 66, 252, 303, 368, + 369, 354, 370, 80, 192, 10, 180, 192, 406, 183, + 1, 2, 361, 160, 178, 108, 10, 180, 181, 182, + 183, 1, 2, 83, 84, 377, 158, 250, 158, 379, + 396, 318, 319, 111, 397, 116, 336, 320, 256, 336, + 178, 251, 10, 180, 181, 182, 183, 1, 2, 404, + 124, 125, 126, 405, 128, 252, 253, 127, 178, 129, + 10, 180, 181, 182, 183, 134, 351, 251, 241, 135, + 136, 254, 138, 249, 323, 324, 325, 326, 141, 142, + 200, 252, 253, 192, 168, 327, 1, 2, 171, 172, + 255, 323, 324, 325, 326, 170, 256, 254, 169, 252, + -269, 201, 203, 283, 351, 257, 287, 202, 213, 215, + 216, 10, 222, 258, 372, 259, 255, 225, 224, 236, + 243, 192, 256, 274, 235, 275, 390, 82, 277, 289, + 118, 257, 295, 300, 304, 309, 395, 83, 84, 258, + 256, 259, 310, 311, 313, 314, 322, 330, 85, 38, + 86, 332, 87, 334, 342, 395, 160, 338, 160, 345, + 346, 358, 88, 353, 359, 364, 89, 390, 206, 360, + 90, 421, 367, 91, 41, 42, 43, 366, 365, 425, + 384, 426, 378, 409, 92, 45, 392, 391, 400, 93, + 46, 94, 47, 95, 374, 386, 401, 6, 194, 18, + 48, 35, 96, 97, 81, 113, 140, 10, 137, 49, + 106, 50, 1, 2, 383, 355, 51, 98, 52, 53, + 54, 217, 276, 352, 38, 302, 423, 363, 333, 99, + 407, 415, 410, 291, 408, 339, 298, 380, 0, 39, + 0, 0, 0, 40, 0, 0, 0, 0, 0, 41, + 42, 43, 0, 0, 0, 44, 0, 0, 0, 0, + 45, 0, 0, 0, 0, 46, 0, 47, 0, 0, + 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, + 0, 0, 0, 0, 49, 0, 50, 0, 0, 147, + 148, 51, 0, 52, 53, 54, 149, 0, 0, 0, + 85, 38, 86, 0, 87, 150, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 0, 0, 0, 89, 0, + 0, 0, 90, 0, 0, 91, 41, 42, 43, 0, + 0, 0, 0, 0, 151, 0, 92, 45, 0, 0, + 0, 93, 46, 94, 47, 95, 0, 0, 0, 0, + 0, 0, 48, 0, 96, 97, 152, 153, 0, 0, + 0, 49, 0, 50, 0, 154, 147, 148, 51, 98, + 52, 53, 54, 149, 0, 0, 0, 85, 38, 86, + 0, 87, 150, 0, 0, 0, 0, 0, 0, 0, + 0, 88, 0, 0, 0, 89, 0, 0, 0, 90, + 0, 0, 91, 41, 42, 43, 0, 0, 0, 0, + 0, 151, 0, 92, 45, 0, 0, 0, 93, 46, + 94, 47, 95, 0, 0, 0, 0, 0, 0, 48, + 0, 96, 97, 152, 153, 0, 0, 0, 49, 0, + 50, 83, 84, 0, 0, 51, 98, 52, 53, 54, + 0, 0, 85, 38, 86, 0, 87, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, + 89, 0, 0, 0, 90, 0, 0, 91, 41, 42, + 43, 0, 0, 0, 0, 0, 0, 0, 92, 45, + 0, 0, 0, 93, 46, 94, 47, 95, 0, 0, + 0, 0, 0, 0, 48, 0, 96, 97, 0, 0, + 0, 0, 0, 49, 0, 50, 1, 2, 0, 0, + 51, 98, 52, 53, 54, 0, 0, 85, 38, 86, + 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 88, 0, 0, 0, 89, 0, 0, 0, 90, + 0, 0, 91, 41, 42, 43, 0, 0, 0, 0, + 0, 0, 0, 92, 45, 0, 0, 0, 93, 46, + 94, 47, 95, 0, 0, 0, 0, 0, 0, 48, + 0, 96, 97, 0, 0, 0, 0, 0, 49, 0, + 50, 0, 0, 0, 0, 51, 98, 52, 53, 54 }; static const short yycheck[] = { 7, - 121, 153, 82, 155, 197, 13, 82, 222, 136, 0, - 64, 65, 3, 8, 8, 4, 201, 30, 8, 135, - 48, 105, 64, 65, 35, 8, 15, 16, 8, 37, - 13, 14, 40, 13, 14, 8, 44, 8, 9, 19, - 17, 15, 16, 8, 9, 21, 37, 303, 56, 40, - 106, 8, 9, 44, 110, 12, 8, 99, 8, 9, - 71, 35, 12, 82, 82, 56, 74, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 136, 36, 82, - 32, 37, 110, 74, 212, 341, 105, 105, 107, 107, - 316, 376, 107, 378, 71, 312, 224, 71, 75, 227, - 56, 77, 110, 116, 107, 221, 332, 115, 99, 47, - 327, 328, 233, 330, 104, 91, 124, 106, 113, 110, - 305, 197, 116, 114, 115, 167, 109, 65, 136, 109, - 121, 104, 106, 124, 224, 106, 110, 227, 105, 215, - 9, 106, 116, 59, 135, 136, 113, 104, 202, 106, - 88, 8, 104, 86, 104, 242, 13, 14, 86, 43, - 168, 169, 4, 55, 240, 224, 103, 105, 227, 384, - 54, 258, 248, 15, 16, 303, 167, 114, 169, 6, - 86, 8, 9, 10, 11, 12, 106, 274, 300, 301, - 110, 48, 8, 201, 14, 3, 204, 13, 14, 311, - 108, 209, 22, 106, 212, 106, 214, 110, 401, 110, - 106, 23, 340, 341, 110, 223, 224, 106, 411, 227, - 47, 110, 14, 43, 41, 45, 109, 235, 99, 100, - 101, 102, 308, 224, 54, 62, 227, 389, 105, 110, - 13, 14, 233, 6, 331, 8, 9, 10, 11, 12, - 13, 14, 13, 14, 334, 376, 19, 378, 338, 106, - 105, 88, 113, 110, 83, 273, 257, 73, 276, 6, - 33, 8, 9, 10, 11, 12, 13, 14, 13, 14, - 15, 16, 15, 16, 47, 48, 83, 6, 53, 8, - 9, 10, 11, 12, 83, 303, 33, 305, 109, 110, - 63, 3, 310, 8, 9, 31, 32, 12, 13, 14, - 47, 48, 303, 99, 100, 101, 102, 113, 3, 82, - 111, 106, 106, 105, 111, 88, 63, 105, 47, 9, - 105, 37, 340, 341, 97, 343, 105, 105, 70, 105, - 3, 8, 105, 62, 107, 82, 113, 117, 27, 113, - 341, 88, 111, 107, 70, 363, 3, 107, 70, 116, - 97, 4, 90, 97, 112, 373, 13, 14, 105, 88, - 107, 70, 110, 98, 27, 106, 105, 24, 25, 26, - 98, 28, 4, 107, 392, 376, 108, 378, 84, 106, - 103, 38, 107, 114, 108, 42, 404, 105, 107, 46, - 408, 105, 49, 50, 51, 52, 106, 108, 115, 104, - 108, 105, 0, 60, 61, 108, 108, 114, 65, 66, - 67, 68, 69, 110, 108, 113, 0, 3, 139, 76, - 13, 78, 79, 26, 74, 56, 8, 115, 85, 110, - 87, 13, 14, 343, 167, 92, 93, 94, 95, 96, - 65, 209, 310, 25, 230, 305, 411, 317, 105, 390, - 264, 221, 404, 392, 226, 340, 396, 276, 40, -1, - -1, -1, 44, -1, -1, -1, -1, -1, 50, 51, - 52, -1, -1, -1, 56, -1, -1, -1, -1, 61, - -1, -1, -1, -1, 66, -1, 68, -1, -1, -1, - -1, -1, -1, -1, 76, -1, -1, -1, -1, -1, - -1, -1, -1, 85, -1, 87, -1, -1, 13, 14, - 92, -1, 94, 95, 96, 20, -1, -1, -1, 24, - 25, 26, -1, 28, 29, -1, -1, -1, -1, -1, - -1, -1, -1, 38, -1, -1, -1, 42, -1, -1, - -1, 46, -1, -1, 49, 50, 51, 52, -1, -1, - -1, -1, -1, 58, -1, 60, 61, -1, -1, -1, - 65, 66, 67, 68, 69, -1, -1, -1, -1, -1, - -1, 76, -1, 78, 79, 80, 81, -1, -1, -1, - 85, -1, 87, -1, 89, 13, 14, 92, 93, 94, - 95, 96, 20, -1, -1, -1, 24, 25, 26, -1, - 28, 29, -1, -1, -1, -1, -1, -1, -1, -1, - 38, -1, -1, -1, 42, -1, -1, -1, 46, -1, - -1, 49, 50, 51, 52, -1, -1, -1, -1, -1, - 58, -1, 60, 61, -1, -1, -1, 65, 66, 67, - 68, 69, -1, -1, -1, -1, -1, -1, 76, -1, - 78, 79, 80, 81, -1, -1, -1, 85, -1, 87, - 13, 14, -1, -1, 92, 93, 94, 95, 96, -1, - -1, 24, 25, 26, -1, 28, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 38, -1, -1, -1, 42, - -1, -1, -1, 46, -1, -1, 49, 50, 51, 52, - -1, -1, -1, -1, -1, -1, -1, 60, 61, -1, - -1, -1, 65, 66, 67, 68, 69, -1, -1, -1, - -1, -1, -1, 76, -1, 78, 79, -1, -1, -1, - -1, -1, 85, -1, 87, 13, 14, -1, -1, 92, - 93, 94, 95, 96, -1, -1, 24, 25, 26, -1, - 28, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 38, -1, -1, -1, 42, -1, -1, -1, 46, -1, - -1, 49, 50, 51, 52, -1, -1, -1, -1, -1, - -1, -1, 60, 61, -1, -1, -1, 65, 66, 67, - 68, 69, -1, -1, -1, -1, -1, -1, 76, -1, - 78, 79, -1, -1, -1, -1, -1, 85, -1, 87, - -1, -1, -1, -1, 92, 93, 94, 95, 96 + 121, 153, 82, 155, 82, 13, 223, 198, 202, 0, + 64, 65, 3, 8, 8, 64, 65, 136, 135, 8, + 8, 317, 109, 110, 48, 8, 304, 4, 107, 37, + 13, 14, 40, 17, 21, 105, 44, 333, 15, 16, + 15, 16, 8, 9, 8, 9, 37, 8, 56, 40, + 99, 8, 59, 44, 8, 9, 13, 14, 12, 136, + 35, 30, 19, 8, 342, 56, 74, 82, 13, 14, + 37, 32, 5, 6, 7, 8, 9, 10, 11, 12, + 13, 14, 103, 74, 8, 9, 110, 71, 12, 56, + 77, 75, 107, 114, 213, 243, 71, 106, 35, 13, + 14, 110, 110, 48, 91, 222, 225, 115, 99, 228, + 104, 259, 306, 234, 47, 104, 124, 36, 167, 110, + 198, 116, 9, 114, 115, 113, 109, 275, 136, 106, + 121, 106, 65, 124, 71, 110, 15, 16, 216, 82, + 106, 116, 106, 104, 135, 136, 4, 116, 225, 203, + 104, 228, 109, 3, 43, 88, 82, 15, 16, 105, + 168, 169, 105, 241, 107, 54, 106, 113, 385, 14, + 110, 249, 105, 377, 86, 379, 167, 22, 169, 105, + 104, 107, 106, 106, 332, 304, 6, 110, 8, 9, + 10, 11, 12, 86, 202, 301, 302, 205, 43, 106, + 45, 55, 210, 110, 106, 213, 312, 215, 110, 54, + 86, 402, 225, 108, 313, 228, 224, 225, 23, 8, + 228, 412, 341, 342, 13, 14, 14, 47, 236, 328, + 329, 309, 331, 41, 225, 8, 9, 228, 390, 12, + 13, 14, 62, 234, 6, 109, 8, 9, 10, 11, + 12, 13, 14, 13, 14, 335, 377, 19, 379, 339, + 106, 31, 32, 105, 110, 105, 274, 258, 88, 277, + 6, 33, 8, 9, 10, 11, 12, 13, 14, 106, + 113, 83, 83, 110, 53, 47, 48, 73, 6, 83, + 8, 9, 10, 11, 12, 3, 304, 33, 306, 113, + 3, 63, 106, 311, 99, 100, 101, 102, 106, 105, + 9, 47, 48, 304, 111, 110, 13, 14, 15, 16, + 82, 99, 100, 101, 102, 105, 88, 63, 111, 47, + 105, 37, 70, 341, 342, 97, 344, 105, 105, 105, + 3, 8, 113, 105, 62, 107, 82, 111, 113, 27, + 107, 342, 88, 70, 117, 107, 364, 3, 70, 4, + 116, 97, 97, 90, 112, 70, 374, 13, 14, 105, + 88, 107, 106, 110, 98, 27, 108, 98, 24, 25, + 26, 107, 28, 105, 107, 393, 377, 106, 379, 4, + 84, 105, 38, 108, 114, 105, 42, 405, 107, 103, + 46, 409, 104, 49, 50, 51, 52, 108, 106, 0, + 105, 0, 108, 113, 60, 61, 108, 110, 108, 65, + 66, 67, 68, 69, 115, 114, 108, 3, 139, 13, + 76, 26, 78, 79, 56, 74, 115, 8, 110, 85, + 65, 87, 13, 14, 344, 311, 92, 93, 94, 95, + 96, 167, 210, 306, 25, 231, 412, 318, 265, 105, + 391, 405, 397, 222, 393, 277, 227, 341, -1, 40, + -1, -1, -1, 44, -1, -1, -1, -1, -1, 50, + 51, 52, -1, -1, -1, 56, -1, -1, -1, -1, + 61, -1, -1, -1, -1, 66, -1, 68, -1, -1, + -1, -1, -1, -1, -1, 76, -1, -1, -1, -1, + -1, -1, -1, -1, 85, -1, 87, -1, -1, 13, + 14, 92, -1, 94, 95, 96, 20, -1, -1, -1, + 24, 25, 26, -1, 28, 29, -1, -1, -1, -1, + -1, -1, -1, -1, 38, -1, -1, -1, 42, -1, + -1, -1, 46, -1, -1, 49, 50, 51, 52, -1, + -1, -1, -1, -1, 58, -1, 60, 61, -1, -1, + -1, 65, 66, 67, 68, 69, -1, -1, -1, -1, + -1, -1, 76, -1, 78, 79, 80, 81, -1, -1, + -1, 85, -1, 87, -1, 89, 13, 14, 92, 93, + 94, 95, 96, 20, -1, -1, -1, 24, 25, 26, + -1, 28, 29, -1, -1, -1, -1, -1, -1, -1, + -1, 38, -1, -1, -1, 42, -1, -1, -1, 46, + -1, -1, 49, 50, 51, 52, -1, -1, -1, -1, + -1, 58, -1, 60, 61, -1, -1, -1, 65, 66, + 67, 68, 69, -1, -1, -1, -1, -1, -1, 76, + -1, 78, 79, 80, 81, -1, -1, -1, 85, -1, + 87, 13, 14, -1, -1, 92, 93, 94, 95, 96, + -1, -1, 24, 25, 26, -1, 28, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 38, -1, -1, -1, + 42, -1, -1, -1, 46, -1, -1, 49, 50, 51, + 52, -1, -1, -1, -1, -1, -1, -1, 60, 61, + -1, -1, -1, 65, 66, 67, 68, 69, -1, -1, + -1, -1, -1, -1, 76, -1, 78, 79, -1, -1, + -1, -1, -1, 85, -1, 87, 13, 14, -1, -1, + 92, 93, 94, 95, 96, -1, -1, 24, 25, 26, + -1, 28, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 38, -1, -1, -1, 42, -1, -1, -1, 46, + -1, -1, 49, 50, 51, 52, -1, -1, -1, -1, + -1, -1, -1, 60, 61, -1, -1, -1, 65, 66, + 67, 68, 69, -1, -1, -1, -1, -1, -1, 76, + -1, 78, 79, -1, -1, -1, -1, -1, 85, -1, + 87, -1, -1, -1, -1, 92, 93, 94, 95, 96 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/share/bison.simple" @@ -1352,13 +1358,13 @@ yyparse(YYPARSE_PARAM_ARG) switch (yyn) { case 1: -#line 307 "asn1p_y.y" +#line 314 "asn1p_y.y" { *(void **)param = yyvsp[0].a_grammar; ; break;} case 2: -#line 313 "asn1p_y.y" +#line 320 "asn1p_y.y" { yyval.a_grammar = asn1p_new(); checkmem(yyval.a_grammar); @@ -1366,14 +1372,14 @@ case 2: ; break;} case 3: -#line 318 "asn1p_y.y" +#line 325 "asn1p_y.y" { yyval.a_grammar = yyvsp[-1].a_grammar; TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); ; break;} case 4: -#line 339 "asn1p_y.y" +#line 346 "asn1p_y.y" { if(yyvsp[-1].a_module) { @@ -1384,33 +1390,33 @@ case 4: } checkmem(yyval.a_module); - yyval.a_module->Identifier = yyvsp[-7].tv_str; + yyval.a_module->ModuleName = yyvsp[-7].tv_str; yyval.a_module->module_oid = yyvsp[-6].a_oid; yyval.a_module->module_flags = yyvsp[-4].a_module_flags; ; break;} case 5: -#line 360 "asn1p_y.y" +#line 367 "asn1p_y.y" { yyval.a_oid = 0; ; break;} case 6: -#line 361 "asn1p_y.y" +#line 368 "asn1p_y.y" { yyval.a_oid = yyvsp[0].a_oid; ; break;} case 7: -#line 365 "asn1p_y.y" +#line 372 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; ; break;} case 8: -#line 368 "asn1p_y.y" +#line 375 "asn1p_y.y" { yyval.a_oid = 0; ; break;} case 9: -#line 374 "asn1p_y.y" +#line 381 "asn1p_y.y" { yyval.a_oid = asn1p_oid_new(); asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1419,7 +1425,7 @@ case 9: ; break;} case 10: -#line 380 "asn1p_y.y" +#line 387 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1428,74 +1434,74 @@ case 10: ; break;} case 11: -#line 389 "asn1p_y.y" +#line 396 "asn1p_y.y" { /* iso */ yyval.a_oid_arc.name = yyvsp[0].tv_str; yyval.a_oid_arc.number = -1; ; break;} case 12: -#line 393 "asn1p_y.y" +#line 400 "asn1p_y.y" { /* iso(1) */ yyval.a_oid_arc.name = yyvsp[-3].tv_str; yyval.a_oid_arc.number = yyvsp[-1].a_int; ; break;} case 13: -#line 397 "asn1p_y.y" +#line 404 "asn1p_y.y" { /* 1 */ yyval.a_oid_arc.name = 0; yyval.a_oid_arc.number = yyvsp[0].a_int; ; break;} case 14: -#line 407 "asn1p_y.y" +#line 414 "asn1p_y.y" { yyval.a_module_flags = MSF_NOFLAGS; ; break;} case 15: -#line 408 "asn1p_y.y" +#line 415 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; ; break;} case 16: -#line 417 "asn1p_y.y" +#line 424 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; ; break;} case 17: -#line 420 "asn1p_y.y" +#line 427 "asn1p_y.y" { yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags; ; break;} case 18: -#line 429 "asn1p_y.y" +#line 436 "asn1p_y.y" { yyval.a_module_flags = MSF_EXPLICIT_TAGS; ; break;} case 19: -#line 432 "asn1p_y.y" +#line 439 "asn1p_y.y" { yyval.a_module_flags = MSF_IMPLICIT_TAGS; ; break;} case 20: -#line 435 "asn1p_y.y" +#line 442 "asn1p_y.y" { yyval.a_module_flags = MSF_AUTOMATIC_TAGS; ; break;} case 21: -#line 438 "asn1p_y.y" +#line 445 "asn1p_y.y" { yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED; ; break;} case 22: -#line 442 "asn1p_y.y" +#line 449 "asn1p_y.y" { /* X.680Amd1 specifies TAG and XER */ if(strcmp(yyvsp[-1].tv_str, "TAG") == 0) { @@ -1513,23 +1519,23 @@ case 22: ; break;} case 23: -#line 463 "asn1p_y.y" +#line 470 "asn1p_y.y" { yyval.a_module = 0; ; break;} case 24: -#line 464 "asn1p_y.y" +#line 471 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 25: -#line 473 "asn1p_y.y" +#line 480 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 26: -#line 476 "asn1p_y.y" +#line 483 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; @@ -1559,13 +1565,13 @@ case 26: ; break;} case 27: -#line 509 "asn1p_y.y" +#line 516 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; ; break;} case 28: -#line 512 "asn1p_y.y" +#line 519 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1577,7 +1583,7 @@ case 28: ; break;} case 29: -#line 521 "asn1p_y.y" +#line 528 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1587,7 +1593,7 @@ case 29: ; break;} case 30: -#line 528 "asn1p_y.y" +#line 535 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1597,7 +1603,7 @@ case 30: ; break;} case 31: -#line 541 "asn1p_y.y" +#line 548 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1607,11 +1613,11 @@ case 31: ; break;} case 32: -#line 549 "asn1p_y.y" +#line 556 "asn1p_y.y" { asn1p_lexer_hack_push_encoding_control(); ; break;} case 33: -#line 550 "asn1p_y.y" +#line 557 "asn1p_y.y" { fprintf(stderr, "WARNING: ENCODING-CONTROL %s " @@ -1622,7 +1628,7 @@ case 33: ; break;} case 34: -#line 562 "asn1p_y.y" +#line 569 "asn1p_y.y" { return yyerror( "Attempt to redefine a standard basic type, " @@ -1631,19 +1637,23 @@ case 34: ; break;} case 35: -#line 576 "asn1p_y.y" +#line 583 "asn1p_y.y" { + if(!saved_aid && 0) + return yyerror("Unterminated IMPORTS FROM, " + "expected semicolon ';'"); + saved_aid = 0; yyval.a_module = yyvsp[-1].a_module; ; break;} case 36: -#line 582 "asn1p_y.y" +#line 593 "asn1p_y.y" { return yyerror("Empty IMPORTS list"); ; break;} case 37: -#line 588 "asn1p_y.y" +#line 599 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1651,38 +1661,48 @@ case 37: ; break;} case 38: -#line 593 "asn1p_y.y" +#line 604 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); ; break;} case 39: -#line 600 "asn1p_y.y" +#line 611 "asn1p_y.y" +{ memset(&yyval.a_aid, 0, sizeof(yyval.a_aid)); ; + break;} +case 40: +#line 612 "asn1p_y.y" +{ yyval.a_aid.oid = yyvsp[0].a_oid; ; + break;} +case 41: +#line 616 "asn1p_y.y" { yyval.a_xports = yyvsp[-3].a_xports; - yyval.a_xports->from = yyvsp[-1].tv_str; - yyval.a_xports->from_oid = yyvsp[0].a_oid; + yyval.a_xports->fromModuleName = yyvsp[-1].tv_str; + yyval.a_xports->identifier = yyvsp[0].a_aid; + /* This stupid thing is used for look-back hack. */ + saved_aid = yyval.a_xports->identifier.oid ? 0 : &(yyval.a_xports->identifier); checkmem(yyval.a_xports); ; break;} -case 40: -#line 609 "asn1p_y.y" +case 42: +#line 627 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} -case 41: -#line 614 "asn1p_y.y" +case 43: +#line 632 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} -case 42: -#line 621 "asn1p_y.y" +case 44: +#line 639 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1690,8 +1710,8 @@ case 42: yyval.a_expr->expr_type = A1TC_REFERENCE; ; break;} -case 43: -#line 627 "asn1p_y.y" +case 45: +#line 645 "asn1p_y.y" { /* Completely equivalent to above */ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1699,8 +1719,8 @@ case 43: yyval.a_expr->expr_type = A1TC_REFERENCE; ; break;} -case 44: -#line 633 "asn1p_y.y" +case 46: +#line 651 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1708,43 +1728,43 @@ case 44: yyval.a_expr->expr_type = A1TC_REFERENCE; ; break;} -case 45: -#line 642 "asn1p_y.y" +case 47: +#line 660 "asn1p_y.y" { yyval.a_xports = yyvsp[-1].a_xports; ; break;} -case 46: -#line 645 "asn1p_y.y" +case 48: +#line 663 "asn1p_y.y" { yyval.a_xports = 0; ; break;} -case 47: -#line 648 "asn1p_y.y" +case 49: +#line 666 "asn1p_y.y" { /* Empty EXPORTS clause effectively prohibits export. */ yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); ; break;} -case 48: -#line 656 "asn1p_y.y" +case 50: +#line 674 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); assert(yyval.a_xports); TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} -case 49: -#line 661 "asn1p_y.y" +case 51: +#line 679 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} -case 50: -#line 668 "asn1p_y.y" +case 52: +#line 686 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1752,8 +1772,8 @@ case 50: yyval.a_expr->expr_type = A1TC_EXPORTVAR; ; break;} -case 51: -#line 674 "asn1p_y.y" +case 53: +#line 692 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1761,8 +1781,8 @@ case 51: yyval.a_expr->expr_type = A1TC_EXPORTVAR; ; break;} -case 52: -#line 680 "asn1p_y.y" +case 54: +#line 698 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1770,12 +1790,12 @@ case 52: yyval.a_expr->expr_type = A1TC_EXPORTVAR; ; break;} -case 53: -#line 691 "asn1p_y.y" +case 55: +#line 709 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} -case 54: -#line 691 "asn1p_y.y" +case 56: +#line 709 "asn1p_y.y" { yyval.a_expr = yyvsp[-4].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1784,8 +1804,8 @@ case 54: // take care of ValueSet body ; break;} -case 55: -#line 701 "asn1p_y.y" +case 57: +#line 719 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1794,8 +1814,8 @@ case 55: yyval.a_expr->meta_type = AMT_TYPEREF; ; break;} -case 56: -#line 708 "asn1p_y.y" +case 58: +#line 726 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1803,8 +1823,8 @@ case 56: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 57: -#line 726 "asn1p_y.y" +case 59: +#line 744 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1814,8 +1834,8 @@ case 57: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 58: -#line 734 "asn1p_y.y" +case 60: +#line 752 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -1823,8 +1843,8 @@ case 58: assert(yyval.a_expr->meta_type); ; break;} -case 59: -#line 740 "asn1p_y.y" +case 61: +#line 758 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -1832,8 +1852,8 @@ case 59: assert(yyval.a_expr->meta_type == AMT_OBJECT); ; break;} -case 60: -#line 756 "asn1p_y.y" +case 62: +#line 774 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1842,8 +1862,8 @@ case 60: yyval.a_expr->meta_type = AMT_PARAMTYPE; ; break;} -case 61: -#line 766 "asn1p_y.y" +case 63: +#line 784 "asn1p_y.y" { int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); @@ -1854,8 +1874,8 @@ case 61: if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument); ; break;} -case 62: -#line 775 "asn1p_y.y" +case 64: +#line 793 "asn1p_y.y" { int ret; yyval.a_plist = yyvsp[-2].a_plist; @@ -1865,15 +1885,15 @@ case 62: if(yyvsp[0].a_parg.argument) free(yyvsp[0].a_parg.argument); ; break;} -case 63: -#line 786 "asn1p_y.y" +case 65: +#line 804 "asn1p_y.y" { yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} -case 64: -#line 790 "asn1p_y.y" +case 66: +#line 808 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1882,8 +1902,8 @@ case 64: yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} -case 65: -#line 797 "asn1p_y.y" +case 67: +#line 815 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1892,8 +1912,8 @@ case 65: yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} -case 66: -#line 804 "asn1p_y.y" +case 68: +#line 822 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1903,29 +1923,29 @@ case 66: yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} -case 67: -#line 815 "asn1p_y.y" +case 69: +#line 833 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 68: -#line 820 "asn1p_y.y" +case 70: +#line 838 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 69: -#line 827 "asn1p_y.y" +case 71: +#line 845 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} -case 70: -#line 830 "asn1p_y.y" +case 72: +#line 848 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1934,31 +1954,31 @@ case 70: yyval.a_expr->meta_type = AMT_VALUE; ; break;} -case 71: -#line 854 "asn1p_y.y" +case 73: +#line 872 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); ; break;} -case 72: -#line 855 "asn1p_y.y" +case 74: +#line 873 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} -case 73: -#line 858 "asn1p_y.y" +case 75: +#line 876 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 74: -#line 863 "asn1p_y.y" +case 76: +#line 881 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 75: -#line 870 "asn1p_y.y" +case 77: +#line 888 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1966,8 +1986,8 @@ case 75: yyval.a_expr->marker = yyvsp[0].a_marker; ; break;} -case 76: -#line 876 "asn1p_y.y" +case 78: +#line 894 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1976,43 +1996,43 @@ case 76: asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 77: -#line 883 "asn1p_y.y" +case 79: +#line 901 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} -case 78: -#line 889 "asn1p_y.y" +case 80: +#line 907 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 79: -#line 894 "asn1p_y.y" +case 81: +#line 912 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 80: -#line 901 "asn1p_y.y" +case 82: +#line 919 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); yyval.a_expr->Identifier = yyvsp[-1].tv_str; ; break;} -case 81: -#line 906 "asn1p_y.y" +case 83: +#line 924 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} -case 82: -#line 912 "asn1p_y.y" +case 84: +#line 930 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); @@ -2021,16 +2041,16 @@ case 82: assert(yyval.a_expr->meta_type == AMT_OBJECT); ; break;} -case 83: -#line 922 "asn1p_y.y" +case 85: +#line 940 "asn1p_y.y" { yyval.a_int = 0; ; break;} -case 84: -#line 923 "asn1p_y.y" +case 86: +#line 941 "asn1p_y.y" { yyval.a_int = 1; ; break;} -case 85: -#line 927 "asn1p_y.y" +case 87: +#line 945 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2039,15 +2059,15 @@ case 85: asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 86: -#line 934 "asn1p_y.y" +case 88: +#line 952 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 87: -#line 941 "asn1p_y.y" +case 89: +#line 959 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2057,8 +2077,8 @@ case 87: yyval.a_expr->marker = yyvsp[0].a_marker; ; break;} -case 88: -#line 949 "asn1p_y.y" +case 90: +#line 967 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; yyval.a_expr->Identifier = yyvsp[-3].a_refcomp.name; @@ -2066,8 +2086,8 @@ case 88: yyval.a_expr->unique = yyvsp[-1].a_int; ; break;} -case 89: -#line 955 "asn1p_y.y" +case 91: +#line 973 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2084,48 +2104,48 @@ case 89: yyval.a_expr->unique = yyvsp[-1].a_int; ; break;} -case 90: -#line 973 "asn1p_y.y" +case 92: +#line 991 "asn1p_y.y" { yyval.a_wsynt = 0; ; break;} -case 91: -#line 974 "asn1p_y.y" +case 93: +#line 992 "asn1p_y.y" { yyval.a_wsynt = yyvsp[0].a_wsynt; ; break;} -case 92: -#line 981 "asn1p_y.y" +case 94: +#line 999 "asn1p_y.y" { asn1p_lexer_hack_enable_with_syntax(); ; break;} -case 93: -#line 983 "asn1p_y.y" +case 95: +#line 1001 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; ; break;} -case 94: -#line 989 "asn1p_y.y" +case 96: +#line 1007 "asn1p_y.y" { yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} -case 95: -#line 993 "asn1p_y.y" +case 97: +#line 1011 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} -case 96: -#line 1000 "asn1p_y.y" +case 98: +#line 1018 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); ; break;} -case 97: -#line 1003 "asn1p_y.y" +case 99: +#line 1021 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2136,8 +2156,8 @@ case 97: yyval.a_wchunk = asn1p_wsyntx_chunk_fromref(ref, 0); ; break;} -case 98: -#line 1015 "asn1p_y.y" +case 100: +#line 1033 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2147,8 +2167,8 @@ case 98: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 99: -#line 1023 "asn1p_y.y" +case 101: +#line 1041 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2159,8 +2179,8 @@ case 99: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 100: -#line 1032 "asn1p_y.y" +case 102: +#line 1050 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2171,8 +2191,8 @@ case 100: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 101: -#line 1044 "asn1p_y.y" +case 103: +#line 1062 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; yyval.a_expr->tag = yyvsp[-2].a_tag; @@ -2193,14 +2213,14 @@ case 101: } ; break;} -case 102: -#line 1066 "asn1p_y.y" +case 104: +#line 1084 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} -case 103: -#line 1069 "asn1p_y.y" +case 105: +#line 1087 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2208,8 +2228,8 @@ case 103: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 104: -#line 1075 "asn1p_y.y" +case 106: +#line 1093 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2217,8 +2237,8 @@ case 104: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 105: -#line 1081 "asn1p_y.y" +case 107: +#line 1099 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2226,8 +2246,8 @@ case 105: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 106: -#line 1087 "asn1p_y.y" +case 108: +#line 1105 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2239,8 +2259,8 @@ case 106: asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 107: -#line 1097 "asn1p_y.y" +case 109: +#line 1115 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2252,8 +2272,8 @@ case 107: asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 108: -#line 1107 "asn1p_y.y" +case 110: +#line 1125 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2261,8 +2281,8 @@ case 108: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 109: -#line 1113 "asn1p_y.y" +case 111: +#line 1131 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2275,8 +2295,8 @@ case 109: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 110: -#line 1127 "asn1p_y.y" +case 112: +#line 1145 "asn1p_y.y" { int ret; yyval.a_expr = yyvsp[-1].a_expr; @@ -2292,8 +2312,8 @@ case 110: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 111: -#line 1151 "asn1p_y.y" +case 113: +#line 1169 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2302,8 +2322,8 @@ case 111: yyval.a_expr->meta_type = AMT_TYPEREF; ; break;} -case 112: -#line 1158 "asn1p_y.y" +case 114: +#line 1176 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2312,8 +2332,8 @@ case 112: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 113: -#line 1173 "asn1p_y.y" +case 115: +#line 1191 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2323,8 +2343,8 @@ case 113: free(yyvsp[0].tv_str); ; break;} -case 114: -#line 1181 "asn1p_y.y" +case 116: +#line 1199 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2336,8 +2356,8 @@ case 114: free(yyvsp[-2].tv_str); ; break;} -case 115: -#line 1191 "asn1p_y.y" +case 117: +#line 1209 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2349,8 +2369,8 @@ case 115: free(yyvsp[-2].tv_str); ; break;} -case 116: -#line 1201 "asn1p_y.y" +case 118: +#line 1219 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2362,8 +2382,8 @@ case 116: free(yyvsp[-2].tv_str); ; break;} -case 117: -#line 1211 "asn1p_y.y" +case 119: +#line 1229 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2373,8 +2393,8 @@ case 117: checkmem(ret == 0); ; break;} -case 118: -#line 1219 "asn1p_y.y" +case 120: +#line 1237 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[0].a_ref; @@ -2395,8 +2415,8 @@ case 118: } ; break;} -case 119: -#line 1241 "asn1p_y.y" +case 121: +#line 1259 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2406,8 +2426,8 @@ case 119: checkmem(ret == 0); ; break;} -case 120: -#line 1249 "asn1p_y.y" +case 122: +#line 1267 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[-2].a_ref; @@ -2416,22 +2436,22 @@ case 120: checkmem(ret == 0); ; break;} -case 123: -#line 1263 "asn1p_y.y" +case 125: +#line 1281 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} -case 124: -#line 1268 "asn1p_y.y" +case 126: +#line 1286 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} -case 125: -#line 1281 "asn1p_y.y" +case 127: +#line 1299 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); @@ -2440,8 +2460,8 @@ case 125: yyval.a_expr->value = yyvsp[0].a_value; ; break;} -case 126: -#line 1291 "asn1p_y.y" +case 128: +#line 1309 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2450,76 +2470,76 @@ case 126: yyval.a_value->value.choice_identifier.value = yyvsp[0].a_value; ; break;} -case 127: -#line 1298 "asn1p_y.y" +case 129: +#line 1316 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} -case 128: -#line 1298 "asn1p_y.y" +case 130: +#line 1316 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); yyval.a_value->type = ATV_UNPARSED; ; break;} -case 129: -#line 1303 "asn1p_y.y" +case 131: +#line 1321 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_NULL; ; break;} -case 130: -#line 1308 "asn1p_y.y" +case 132: +#line 1326 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_FALSE; ; break;} -case 131: -#line 1313 "asn1p_y.y" +case 133: +#line 1331 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_TRUE; ; break;} -case 132: -#line 1318 "asn1p_y.y" +case 134: +#line 1336 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); ; break;} -case 133: -#line 1322 "asn1p_y.y" +case 135: +#line 1340 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); ; break;} -case 134: -#line 1326 "asn1p_y.y" +case 136: +#line 1344 "asn1p_y.y" { yyval.a_value = yyval.a_value; ; break;} -case 135: -#line 1329 "asn1p_y.y" +case 137: +#line 1347 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 136: -#line 1332 "asn1p_y.y" +case 138: +#line 1350 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 137: -#line 1338 "asn1p_y.y" +case 139: +#line 1356 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2532,8 +2552,8 @@ case 137: free(yyvsp[0].tv_str); ; break;} -case 138: -#line 1349 "asn1p_y.y" +case 140: +#line 1367 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2549,31 +2569,31 @@ case 138: free(yyvsp[0].tv_str); ; break;} -case 139: -#line 1367 "asn1p_y.y" +case 141: +#line 1385 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} -case 140: -#line 1371 "asn1p_y.y" +case 142: +#line 1389 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); yyval.a_value->type = ATV_TUPLE; ; break;} -case 141: -#line 1376 "asn1p_y.y" +case 143: +#line 1394 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); yyval.a_value->type = ATV_QUADRUPLE; ; break;} -case 142: -#line 1410 "asn1p_y.y" +case 144: +#line 1428 "asn1p_y.y" { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 1; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); @@ -2584,8 +2604,8 @@ case 142: free(yyvsp[0].tv_opaque.buf); ; break;} -case 143: -#line 1419 "asn1p_y.y" +case 145: +#line 1437 "asn1p_y.y" { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); @@ -2599,72 +2619,72 @@ case 143: yyval.tv_opaque.len = newsize; ; break;} -case 144: -#line 1434 "asn1p_y.y" +case 146: +#line 1452 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BOOLEAN; ; break;} -case 145: -#line 1435 "asn1p_y.y" +case 147: +#line 1453 "asn1p_y.y" { yyval.a_type = ASN_BASIC_NULL; ; break;} -case 146: -#line 1436 "asn1p_y.y" +case 148: +#line 1454 "asn1p_y.y" { yyval.a_type = ASN_BASIC_REAL; ; break;} -case 147: -#line 1437 "asn1p_y.y" +case 149: +#line 1455 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} -case 148: -#line 1438 "asn1p_y.y" +case 150: +#line 1456 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OCTET_STRING; ; break;} -case 149: -#line 1439 "asn1p_y.y" +case 151: +#line 1457 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; break;} -case 150: -#line 1440 "asn1p_y.y" +case 152: +#line 1458 "asn1p_y.y" { yyval.a_type = ASN_BASIC_RELATIVE_OID; ; break;} -case 151: -#line 1441 "asn1p_y.y" +case 153: +#line 1459 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EXTERNAL; ; break;} -case 152: -#line 1442 "asn1p_y.y" +case 154: +#line 1460 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; break;} -case 153: -#line 1443 "asn1p_y.y" +case 155: +#line 1461 "asn1p_y.y" { yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; break;} -case 154: -#line 1444 "asn1p_y.y" +case 156: +#line 1462 "asn1p_y.y" { yyval.a_type = ASN_BASIC_UTCTime; ; break;} -case 155: -#line 1445 "asn1p_y.y" +case 157: +#line 1463 "asn1p_y.y" { yyval.a_type = ASN_BASIC_GeneralizedTime; ; break;} -case 156: -#line 1446 "asn1p_y.y" +case 158: +#line 1464 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} -case 157: -#line 1453 "asn1p_y.y" +case 159: +#line 1471 "asn1p_y.y" { yyval.a_type = ASN_BASIC_INTEGER; ; break;} -case 158: -#line 1454 "asn1p_y.y" +case 160: +#line 1472 "asn1p_y.y" { yyval.a_type = ASN_BASIC_ENUMERATED; ; break;} -case 159: -#line 1455 "asn1p_y.y" +case 161: +#line 1473 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BIT_STRING; ; break;} -case 160: -#line 1459 "asn1p_y.y" +case 162: +#line 1477 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2672,8 +2692,8 @@ case 160: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 161: -#line 1465 "asn1p_y.y" +case 163: +#line 1483 "asn1p_y.y" { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; @@ -2685,92 +2705,92 @@ case 161: yyval.a_expr->meta_type = AMT_TYPE; ; break;} -case 162: -#line 1478 "asn1p_y.y" +case 164: +#line 1496 "asn1p_y.y" { yyval.a_type = ASN_STRING_BMPString; ; break;} -case 163: -#line 1479 "asn1p_y.y" +case 165: +#line 1497 "asn1p_y.y" { yyval.a_type = ASN_STRING_GeneralString; fprintf(stderr, "WARNING: GeneralString is not fully supported\n"); ; break;} -case 164: -#line 1483 "asn1p_y.y" +case 166: +#line 1501 "asn1p_y.y" { yyval.a_type = ASN_STRING_GraphicString; fprintf(stderr, "WARNING: GraphicString is not fully supported\n"); ; break;} -case 165: -#line 1487 "asn1p_y.y" +case 167: +#line 1505 "asn1p_y.y" { yyval.a_type = ASN_STRING_IA5String; ; break;} -case 166: -#line 1488 "asn1p_y.y" +case 168: +#line 1506 "asn1p_y.y" { yyval.a_type = ASN_STRING_ISO646String; ; break;} -case 167: -#line 1489 "asn1p_y.y" +case 169: +#line 1507 "asn1p_y.y" { yyval.a_type = ASN_STRING_NumericString; ; break;} -case 168: -#line 1490 "asn1p_y.y" +case 170: +#line 1508 "asn1p_y.y" { yyval.a_type = ASN_STRING_PrintableString; ; break;} -case 169: -#line 1491 "asn1p_y.y" +case 171: +#line 1509 "asn1p_y.y" { yyval.a_type = ASN_STRING_T61String; fprintf(stderr, "WARNING: T61String is not fully supported\n"); ; break;} -case 170: -#line 1495 "asn1p_y.y" +case 172: +#line 1513 "asn1p_y.y" { yyval.a_type = ASN_STRING_TeletexString; ; break;} -case 171: -#line 1496 "asn1p_y.y" +case 173: +#line 1514 "asn1p_y.y" { yyval.a_type = ASN_STRING_UniversalString; ; break;} -case 172: -#line 1497 "asn1p_y.y" +case 174: +#line 1515 "asn1p_y.y" { yyval.a_type = ASN_STRING_UTF8String; ; break;} -case 173: -#line 1498 "asn1p_y.y" +case 175: +#line 1516 "asn1p_y.y" { yyval.a_type = ASN_STRING_VideotexString; fprintf(stderr, "WARNING: VideotexString is not fully supported\n"); ; break;} -case 174: -#line 1502 "asn1p_y.y" +case 176: +#line 1520 "asn1p_y.y" { yyval.a_type = ASN_STRING_VisibleString; ; break;} -case 175: -#line 1503 "asn1p_y.y" +case 177: +#line 1521 "asn1p_y.y" { yyval.a_type = ASN_STRING_ObjectDescriptor; ; break;} -case 181: -#line 1515 "asn1p_y.y" +case 183: +#line 1533 "asn1p_y.y" { yyval.a_constr = 0; ; break;} -case 182: -#line 1516 "asn1p_y.y" +case 184: +#line 1534 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 183: -#line 1522 "asn1p_y.y" +case 185: +#line 1540 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); ; break;} -case 184: -#line 1525 "asn1p_y.y" +case 186: +#line 1543 "asn1p_y.y" { /* * This is a special case, for compatibility purposes. @@ -2779,26 +2799,26 @@ case 184: CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_SIZE, yyvsp[-1].a_constr, 0); ; break;} -case 185: -#line 1535 "asn1p_y.y" +case 187: +#line 1553 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; ; break;} -case 186: -#line 1538 "asn1p_y.y" +case 188: +#line 1556 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} -case 187: -#line 1544 "asn1p_y.y" +case 189: +#line 1562 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 188: -#line 1547 "asn1p_y.y" +case 190: +#line 1565 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2806,8 +2826,8 @@ case 188: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); ; break;} -case 189: -#line 1553 "asn1p_y.y" +case 191: +#line 1571 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2817,38 +2837,38 @@ case 189: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, ct, yyvsp[0].a_constr); ; break;} -case 190: -#line 1564 "asn1p_y.y" +case 192: +#line 1582 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 191: -#line 1567 "asn1p_y.y" +case 193: +#line 1585 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_AEX, yyvsp[0].a_constr, 0); ; break;} -case 192: -#line 1570 "asn1p_y.y" +case 194: +#line 1588 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 193: -#line 1573 "asn1p_y.y" +case 195: +#line 1591 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 194: -#line 1576 "asn1p_y.y" +case 196: +#line 1594 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 195: -#line 1582 "asn1p_y.y" +case 197: +#line 1600 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2858,8 +2878,8 @@ case 195: checkmem(ret == 0); ; break;} -case 196: -#line 1590 "asn1p_y.y" +case 198: +#line 1608 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2869,8 +2889,8 @@ case 196: checkmem(ret == 0); ; break;} -case 197: -#line 1598 "asn1p_y.y" +case 199: +#line 1616 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2878,8 +2898,8 @@ case 197: yyval.a_constr->value = yyvsp[0].a_value; ; break;} -case 198: -#line 1604 "asn1p_y.y" +case 200: +#line 1622 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2887,8 +2907,8 @@ case 198: yyval.a_constr->containedSubtype = yyvsp[0].a_value; ; break;} -case 199: -#line 1610 "asn1p_y.y" +case 201: +#line 1628 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2897,8 +2917,8 @@ case 199: yyval.a_constr->range_stop = yyvsp[0].a_value; ; break;} -case 200: -#line 1617 "asn1p_y.y" +case 202: +#line 1635 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2908,8 +2928,8 @@ case 200: yyval.a_constr->range_start->type = ATV_MIN; ; break;} -case 201: -#line 1625 "asn1p_y.y" +case 203: +#line 1643 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2919,8 +2939,8 @@ case 201: yyval.a_constr->range_stop->type = ATV_MAX; ; break;} -case 202: -#line 1633 "asn1p_y.y" +case 204: +#line 1651 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2931,24 +2951,24 @@ case 202: yyval.a_constr->range_stop->type = ATV_MAX; ; break;} -case 203: -#line 1642 "asn1p_y.y" +case 205: +#line 1660 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 204: -#line 1645 "asn1p_y.y" +case 206: +#line 1663 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 205: -#line 1649 "asn1p_y.y" +case 207: +#line 1667 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} -case 206: -#line 1649 "asn1p_y.y" +case 208: +#line 1667 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2958,64 +2978,64 @@ case 206: yyval.a_constr->value->type = ATV_UNPARSED; ; break;} -case 207: -#line 1660 "asn1p_y.y" +case 209: +#line 1678 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RANGE; ; break;} -case 208: -#line 1661 "asn1p_y.y" +case 210: +#line 1679 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RLRANGE; ; break;} -case 209: -#line 1662 "asn1p_y.y" +case 211: +#line 1680 "asn1p_y.y" { yyval.a_ctype = ACT_EL_LLRANGE; ; break;} -case 210: -#line 1663 "asn1p_y.y" +case 212: +#line 1681 "asn1p_y.y" { yyval.a_ctype = ACT_EL_ULRANGE; ; break;} -case 211: -#line 1667 "asn1p_y.y" +case 213: +#line 1685 "asn1p_y.y" { yyval.a_ctype = ACT_CT_SIZE; ; break;} -case 212: -#line 1670 "asn1p_y.y" +case 214: +#line 1688 "asn1p_y.y" { yyval.a_ctype = ACT_CT_FROM; ; break;} -case 213: -#line 1676 "asn1p_y.y" +case 215: +#line 1694 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); yyval.a_value->type = ATV_FALSE; ; break;} -case 214: -#line 1681 "asn1p_y.y" +case 216: +#line 1699 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); yyval.a_value->type = ATV_TRUE; ; break;} -case 215: -#line 1686 "asn1p_y.y" +case 217: +#line 1704 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 216: -#line 1689 "asn1p_y.y" +case 218: +#line 1707 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} -case 217: -#line 1692 "asn1p_y.y" +case 219: +#line 1710 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3028,8 +3048,8 @@ case 217: free(yyvsp[0].tv_str); ; break;} -case 218: -#line 1706 "asn1p_y.y" +case 220: +#line 1724 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3042,32 +3062,32 @@ case 218: free(yyvsp[0].tv_str); ; break;} -case 219: -#line 1720 "asn1p_y.y" +case 221: +#line 1738 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMP, yyvsp[0].a_constr, 0); ; break;} -case 220: -#line 1723 "asn1p_y.y" +case 222: +#line 1741 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); ; break;} -case 221: -#line 1729 "asn1p_y.y" +case 223: +#line 1747 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 222: -#line 1732 "asn1p_y.y" +case 224: +#line 1750 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} -case 223: -#line 1738 "asn1p_y.y" +case 225: +#line 1756 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3075,8 +3095,8 @@ case 223: yyval.a_constr->value = asn1p_value_frombuf("...", 3, 0); ; break;} -case 224: -#line 1744 "asn1p_y.y" +case 226: +#line 1762 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3086,46 +3106,46 @@ case 224: if(yyvsp[-1].a_constr) asn1p_constraint_insert(yyval.a_constr, yyvsp[-1].a_constr); ; break;} -case 225: -#line 1758 "asn1p_y.y" +case 227: +#line 1776 "asn1p_y.y" { yyval.a_pres = ACPRES_DEFAULT; ; break;} -case 226: -#line 1759 "asn1p_y.y" +case 228: +#line 1777 "asn1p_y.y" { yyval.a_pres = yyvsp[0].a_pres; ; break;} -case 227: -#line 1763 "asn1p_y.y" +case 229: +#line 1781 "asn1p_y.y" { yyval.a_pres = ACPRES_PRESENT; ; break;} -case 228: -#line 1766 "asn1p_y.y" +case 230: +#line 1784 "asn1p_y.y" { yyval.a_pres = ACPRES_ABSENT; ; break;} -case 229: -#line 1769 "asn1p_y.y" +case 231: +#line 1787 "asn1p_y.y" { yyval.a_pres = ACPRES_OPTIONAL; ; break;} -case 230: -#line 1775 "asn1p_y.y" +case 232: +#line 1793 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 231: -#line 1778 "asn1p_y.y" +case 233: +#line 1796 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} -case 232: -#line 1787 "asn1p_y.y" +case 234: +#line 1805 "asn1p_y.y" { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; @@ -3139,14 +3159,14 @@ case 232: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, ct, 0); ; break;} -case 233: -#line 1802 "asn1p_y.y" +case 235: +#line 1820 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} -case 234: -#line 1808 "asn1p_y.y" +case 236: +#line 1826 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3154,8 +3174,8 @@ case 234: yyval.a_constr->value = asn1p_value_fromref(yyvsp[0].a_ref, 0); ; break;} -case 235: -#line 1814 "asn1p_y.y" +case 237: +#line 1832 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3165,8 +3185,8 @@ case 235: CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct); ; break;} -case 236: -#line 1828 "asn1p_y.y" +case 238: +#line 1846 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; @@ -3179,8 +3199,8 @@ case 236: free(yyvsp[0].tv_str); ; break;} -case 237: -#line 1839 "asn1p_y.y" +case 239: +#line 1857 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; @@ -3194,14 +3214,14 @@ case 237: free(yyvsp[0].tv_str); ; break;} -case 238: -#line 1855 "asn1p_y.y" +case 240: +#line 1873 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 239: -#line 1858 "asn1p_y.y" +case 241: +#line 1876 "asn1p_y.y" { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); @@ -3212,61 +3232,61 @@ case 239: yyval.tv_str[l1 + 1 + l3] = '\0'; ; break;} -case 240: -#line 1876 "asn1p_y.y" +case 242: +#line 1894 "asn1p_y.y" { yyval.a_marker.flags = EM_NOMARK; yyval.a_marker.default_value = 0; ; break;} -case 241: -#line 1880 "asn1p_y.y" +case 243: +#line 1898 "asn1p_y.y" { yyval.a_marker = yyvsp[0].a_marker; ; break;} -case 242: -#line 1884 "asn1p_y.y" +case 244: +#line 1902 "asn1p_y.y" { yyval.a_marker.flags = EM_OPTIONAL; yyval.a_marker.default_value = 0; ; break;} -case 243: -#line 1888 "asn1p_y.y" +case 245: +#line 1906 "asn1p_y.y" { yyval.a_marker.flags = EM_DEFAULT; yyval.a_marker.default_value = yyvsp[0].a_value; ; break;} -case 244: -#line 1911 "asn1p_y.y" +case 246: +#line 1929 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); ; break;} -case 245: -#line 1915 "asn1p_y.y" +case 247: +#line 1933 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; ; break;} -case 246: -#line 1921 "asn1p_y.y" +case 248: +#line 1939 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 247: -#line 1926 "asn1p_y.y" +case 249: +#line 1944 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} -case 248: -#line 1933 "asn1p_y.y" +case 250: +#line 1951 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3275,8 +3295,8 @@ case 248: yyval.a_expr->Identifier = yyvsp[0].tv_str; ; break;} -case 249: -#line 1940 "asn1p_y.y" +case 251: +#line 1958 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3286,8 +3306,8 @@ case 249: yyval.a_expr->value = yyvsp[-1].a_value; ; break;} -case 250: -#line 1948 "asn1p_y.y" +case 252: +#line 1966 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3297,8 +3317,8 @@ case 250: yyval.a_expr->value = yyvsp[-1].a_value; ; break;} -case 251: -#line 1956 "asn1p_y.y" +case 253: +#line 1974 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3307,8 +3327,8 @@ case 251: yyval.a_expr->value = yyvsp[0].a_value; ; break;} -case 252: -#line 1963 "asn1p_y.y" +case 254: +#line 1981 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3318,103 +3338,103 @@ case 252: yyval.a_expr->meta_type = AMT_VALUE; ; break;} -case 253: -#line 1974 "asn1p_y.y" +case 255: +#line 1992 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} -case 254: -#line 1978 "asn1p_y.y" +case 256: +#line 1996 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} -case 255: -#line 2009 "asn1p_y.y" +case 257: +#line 2027 "asn1p_y.y" { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; break;} -case 256: -#line 2010 "asn1p_y.y" +case 258: +#line 2028 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; ; break;} -case 257: -#line 2014 "asn1p_y.y" +case 259: +#line 2032 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = yyvsp[0].a_tag.tag_mode; ; break;} -case 258: -#line 2021 "asn1p_y.y" +case 260: +#line 2039 "asn1p_y.y" { yyval.a_tag = yyvsp[-2].a_tag; yyval.a_tag.tag_value = yyvsp[-1].a_int; ; break;} -case 259: -#line 2027 "asn1p_y.y" +case 261: +#line 2045 "asn1p_y.y" { yyval.a_tag.tag_class = TC_CONTEXT_SPECIFIC; ; break;} -case 260: -#line 2028 "asn1p_y.y" +case 262: +#line 2046 "asn1p_y.y" { yyval.a_tag.tag_class = TC_UNIVERSAL; ; break;} -case 261: -#line 2029 "asn1p_y.y" +case 263: +#line 2047 "asn1p_y.y" { yyval.a_tag.tag_class = TC_APPLICATION; ; break;} -case 262: -#line 2030 "asn1p_y.y" +case 264: +#line 2048 "asn1p_y.y" { yyval.a_tag.tag_class = TC_PRIVATE; ; break;} -case 263: -#line 2034 "asn1p_y.y" +case 265: +#line 2052 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_DEFAULT; ; break;} -case 264: -#line 2035 "asn1p_y.y" +case 266: +#line 2053 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_IMPLICIT; ; break;} -case 265: -#line 2036 "asn1p_y.y" +case 267: +#line 2054 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_EXPLICIT; ; break;} -case 266: -#line 2040 "asn1p_y.y" +case 268: +#line 2058 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 267: -#line 2044 "asn1p_y.y" +case 269: +#line 2062 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 268: -#line 2052 "asn1p_y.y" +case 270: +#line 2070 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 269: -#line 2059 "asn1p_y.y" +case 271: +#line 2077 "asn1p_y.y" { yyval.tv_str = 0; ; break;} -case 270: -#line 2060 "asn1p_y.y" +case 272: +#line 2078 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} -case 271: -#line 2066 "asn1p_y.y" +case 273: +#line 2084 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; @@ -3642,7 +3662,7 @@ case 271: } return 1; } -#line 2072 "asn1p_y.y" +#line 2090 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.h b/libasn1parser/asn1p_y.h index 71417b360..2862195a7 100644 --- a/libasn1parser/asn1p_y.h +++ b/libasn1parser/asn1p_y.h @@ -7,6 +7,7 @@ typedef union { asn1p_constraint_t *a_constr; /* Constraint */ enum asn1p_constraint_type_e a_ctype;/* Constraint type */ asn1p_xports_t *a_xports; /* IMports/EXports */ + struct AssignedIdentifier a_aid; /* Assigned Identifier */ asn1p_oid_t *a_oid; /* Object Identifier */ asn1p_oid_arc_t a_oid_arc; /* Single OID's arc */ struct asn1p_type_tag_s a_tag; /* A tag */ diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index 01e21ead6..f9a01e179 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -65,9 +65,9 @@ asn1print_module(asn1p_t *asn, asn1p_module_t *mod, enum asn1print_flags flags) if(flags & APF_PRINT_XML_DTD) printf(" - + diff --git a/asn1c/tests/data-70/data-70-10.in b/asn1c/tests/data-70/data-70-10.in index cdb0967b6..a1750910e 100644 --- a/asn1c/tests/data-70/data-70-10.in +++ b/asn1c/tests/data-70/data-70-10.in @@ -1 +1 @@ - + diff --git a/asn1c/tests/data-70/data-70-47.in b/asn1c/tests/data-70/data-70-47.in new file mode 100644 index 000000000..5a5725619 --- /dev/null +++ b/asn1c/tests/data-70/data-70-47.in @@ -0,0 +1,6 @@ + + + + + + diff --git a/asn1c/tests/data-70/data-70-48.in b/asn1c/tests/data-70/data-70-48.in new file mode 100644 index 000000000..269247da3 --- /dev/null +++ b/asn1c/tests/data-70/data-70-48.in @@ -0,0 +1,5 @@ + + + 1.0 + + diff --git a/asn1c/tests/data-70/data-70-49.in b/asn1c/tests/data-70/data-70-49.in new file mode 100644 index 000000000..d3a83442c --- /dev/null +++ b/asn1c/tests/data-70/data-70-49.in @@ -0,0 +1 @@ + 1.0 diff --git a/tests/70-xer-test-OK.asn1 b/tests/70-xer-test-OK.asn1 index 1a19ca26d..330b91375 100644 --- a/tests/70-xer-test-OK.asn1 +++ b/tests/70-xer-test-OK.asn1 @@ -18,13 +18,16 @@ BEGIN PDU ::= CHOICE { sequence Sequence, set Set, - setOf SetOf, sequenceOf SequenceOf, extensibleSet ExtensibleSet, extensibleSequence ExtensibleSequence, extensibleSequence2 ExtensibleSequence2, setOfNULL SetOfNULL, + setOfREAL SetOfREAL, setOfEnums SetOfEnums, + namedSetOfNULL NamedSetOfNULL, + namedSetOfREAL NamedSetOfREAL, + namedSetOfEnums NamedSetOfEnums, seqOfZuka SeqOfZuka, ... } @@ -60,9 +63,12 @@ BEGIN integer INTEGER OPTIONAL } - SetOf ::= SET OF REAL SetOfNULL ::= SET OF NULL + SetOfREAL ::= SET OF REAL SetOfEnums ::= SET OF ENUMERATED { one, oneMore } + NamedSetOfNULL ::= SET OF y NULL + NamedSetOfREAL ::= SET OF name REAL + NamedSetOfEnums ::= SET OF name ENUMERATED { one, oneMore } SequenceOf ::= SEQUENCE OF id INTEGER { one(1), two(2) } SeqOfZuka ::= SEQUENCE OF zuka NULL From fbc0bbb19235338c9c6c0aaf337cb92b2b277aa4 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 7 Nov 2005 15:26:47 +0000 Subject: [PATCH 0992/1469] new test for Choice git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@992 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/70-xer-test-OK.asn1 | 6 + tests/70-xer-test-OK.asn1.-EF | 41 +- tests/70-xer-test-OK.asn1.-P | 765 +++++++++++++++++++++++++++++----- 3 files changed, 709 insertions(+), 103 deletions(-) diff --git a/tests/70-xer-test-OK.asn1 b/tests/70-xer-test-OK.asn1 index 330b91375..2c23f5221 100644 --- a/tests/70-xer-test-OK.asn1 +++ b/tests/70-xer-test-OK.asn1 @@ -29,6 +29,8 @@ BEGIN namedSetOfREAL NamedSetOfREAL, namedSetOfEnums NamedSetOfEnums, seqOfZuka SeqOfZuka, + setOfChoice SetOfChoice, + namedSetOfChoice NamedSetOfChoice, ... } @@ -71,5 +73,9 @@ BEGIN NamedSetOfEnums ::= SET OF name ENUMERATED { one, oneMore } SequenceOf ::= SEQUENCE OF id INTEGER { one(1), two(2) } SeqOfZuka ::= SEQUENCE OF zuka NULL + SetOfChoice ::= SET OF SimpleChoice + NamedSetOfChoice ::= SET OF whatever SimpleChoice + + SimpleChoice ::= CHOICE { a NULL, b INTEGER } END diff --git a/tests/70-xer-test-OK.asn1.-EF b/tests/70-xer-test-OK.asn1.-EF index adc34d4bf..983f40afc 100644 --- a/tests/70-xer-test-OK.asn1.-EF +++ b/tests/70-xer-test-OK.asn1.-EF @@ -6,14 +6,19 @@ BEGIN PDU ::= CHOICE { sequence [0] IMPLICIT Sequence, set [1] IMPLICIT Set, - setOf [2] IMPLICIT SetOf, - sequenceOf [3] IMPLICIT SequenceOf, - extensibleSet [4] IMPLICIT ExtensibleSet, - extensibleSequence [5] IMPLICIT ExtensibleSequence, - extensibleSequence2 [6] IMPLICIT ExtensibleSequence2, - setOfNULL [7] IMPLICIT SetOfNULL, + sequenceOf [2] IMPLICIT SequenceOf, + extensibleSet [3] IMPLICIT ExtensibleSet, + extensibleSequence [4] IMPLICIT ExtensibleSequence, + extensibleSequence2 [5] IMPLICIT ExtensibleSequence2, + setOfNULL [6] IMPLICIT SetOfNULL, + setOfREAL [7] IMPLICIT SetOfREAL, setOfEnums [8] IMPLICIT SetOfEnums, - seqOfZuka [9] IMPLICIT SeqOfZuka, + namedSetOfNULL [9] IMPLICIT NamedSetOfNULL, + namedSetOfREAL [10] IMPLICIT NamedSetOfREAL, + namedSetOfEnums [11] IMPLICIT NamedSetOfEnums, + seqOfZuka [12] IMPLICIT SeqOfZuka, + setOfChoice [13] IMPLICIT SetOfChoice, + namedSetOfChoice [14] IMPLICIT NamedSetOfChoice, ... } @@ -51,15 +56,24 @@ ExtensibleSequence2 ::= SEQUENCE { integer [1] IMPLICIT INTEGER OPTIONAL } -SetOf ::= SET OF REAL - SetOfNULL ::= SET OF NULL +SetOfREAL ::= SET OF REAL + SetOfEnums ::= SET OF ENUMERATED { one(0), oneMore(1) } +NamedSetOfNULL ::= SET OF y NULL + +NamedSetOfREAL ::= SET OF name REAL + +NamedSetOfEnums ::= SET OF name ENUMERATED { + one(0), + oneMore(1) + } + SequenceOf ::= SEQUENCE OF id INTEGER { one(1), two(2) @@ -67,4 +81,13 @@ SequenceOf ::= SEQUENCE OF id INTEGER { SeqOfZuka ::= SEQUENCE OF zuka NULL +SetOfChoice ::= SET OF SimpleChoice + +NamedSetOfChoice ::= SET OF whatever SimpleChoice + +SimpleChoice ::= CHOICE { + a [0] IMPLICIT NULL, + b [1] IMPLICIT INTEGER +} + END diff --git a/tests/70-xer-test-OK.asn1.-P b/tests/70-xer-test-OK.asn1.-P index 25a5a4fa6..a0e273c16 100644 --- a/tests/70-xer-test-OK.asn1.-P +++ b/tests/70-xer-test-OK.asn1.-P @@ -3,14 +3,19 @@ #include #include -#include #include #include #include #include #include +#include #include +#include +#include +#include #include +#include +#include #include /*** <<< DEPS [PDU] >>> ***/ @@ -19,14 +24,19 @@ typedef enum PDU_PR { PDU_PR_NOTHING, /* No components present */ PDU_PR_sequence, PDU_PR_set, - PDU_PR_setOf, PDU_PR_sequenceOf, PDU_PR_extensibleSet, PDU_PR_extensibleSequence, PDU_PR_extensibleSequence2, PDU_PR_setOfNULL, + PDU_PR_setOfREAL, PDU_PR_setOfEnums, + PDU_PR_namedSetOfNULL, + PDU_PR_namedSetOfREAL, + PDU_PR_namedSetOfEnums, PDU_PR_seqOfZuka, + PDU_PR_setOfChoice, + PDU_PR_namedSetOfChoice, /* Extensions may appear below */ } PDU_PR; @@ -37,14 +47,19 @@ typedef struct PDU { union PDU_u { Sequence_t sequence; Set_t set; - SetOf_t setOf; SequenceOf_t sequenceOf; ExtensibleSet_t extensibleSet; ExtensibleSequence_t extensibleSequence; ExtensibleSequence2_t extensibleSequence2; SetOfNULL_t setOfNULL; + SetOfREAL_t setOfREAL; SetOfEnums_t setOfEnums; + NamedSetOfNULL_t namedSetOfNULL; + NamedSetOfREAL_t namedSetOfREAL; + NamedSetOfEnums_t namedSetOfEnums; SeqOfZuka_t seqOfZuka; + SetOfChoice_t setOfChoice; + NamedSetOfChoice_t namedSetOfChoice; /* * This type is extensible, * possible extensions are below. @@ -76,48 +91,48 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .memb_constraints = 0, /* Defer constraints checking to the member type */ .name = "set" }, - { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.setOf), - .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), - .tag_mode = -1, /* IMPLICIT tag at current level */ - .type = &asn_DEF_SetOf, - .memb_constraints = 0, /* Defer constraints checking to the member type */ - .name = "setOf" - }, { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.sequenceOf), - .tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_SequenceOf, .memb_constraints = 0, /* Defer constraints checking to the member type */ .name = "sequenceOf" }, { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.extensibleSet), - .tag = (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + .tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_ExtensibleSet, .memb_constraints = 0, /* Defer constraints checking to the member type */ .name = "extensibleSet" }, { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.extensibleSequence), - .tag = (ASN_TAG_CLASS_CONTEXT | (5 << 2)), + .tag = (ASN_TAG_CLASS_CONTEXT | (4 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_ExtensibleSequence, .memb_constraints = 0, /* Defer constraints checking to the member type */ .name = "extensibleSequence" }, { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.extensibleSequence2), - .tag = (ASN_TAG_CLASS_CONTEXT | (6 << 2)), + .tag = (ASN_TAG_CLASS_CONTEXT | (5 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_ExtensibleSequence2, .memb_constraints = 0, /* Defer constraints checking to the member type */ .name = "extensibleSequence2" }, { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.setOfNULL), - .tag = (ASN_TAG_CLASS_CONTEXT | (7 << 2)), + .tag = (ASN_TAG_CLASS_CONTEXT | (6 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_SetOfNULL, .memb_constraints = 0, /* Defer constraints checking to the member type */ .name = "setOfNULL" }, + { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.setOfREAL), + .tag = (ASN_TAG_CLASS_CONTEXT | (7 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_SetOfREAL, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "setOfREAL" + }, { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.setOfEnums), .tag = (ASN_TAG_CLASS_CONTEXT | (8 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ @@ -125,25 +140,65 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .memb_constraints = 0, /* Defer constraints checking to the member type */ .name = "setOfEnums" }, - { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.seqOfZuka), + { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.namedSetOfNULL), .tag = (ASN_TAG_CLASS_CONTEXT | (9 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_NamedSetOfNULL, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "namedSetOfNULL" + }, + { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.namedSetOfREAL), + .tag = (ASN_TAG_CLASS_CONTEXT | (10 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_NamedSetOfREAL, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "namedSetOfREAL" + }, + { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.namedSetOfEnums), + .tag = (ASN_TAG_CLASS_CONTEXT | (11 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_NamedSetOfEnums, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "namedSetOfEnums" + }, + { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.seqOfZuka), + .tag = (ASN_TAG_CLASS_CONTEXT | (12 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_SeqOfZuka, .memb_constraints = 0, /* Defer constraints checking to the member type */ .name = "seqOfZuka" }, + { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.setOfChoice), + .tag = (ASN_TAG_CLASS_CONTEXT | (13 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_SetOfChoice, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "setOfChoice" + }, + { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.namedSetOfChoice), + .tag = (ASN_TAG_CLASS_CONTEXT | (14 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_NamedSetOfChoice, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "namedSetOfChoice" + }, }; static asn_TYPE_tag2member_t asn_MAP_PDU_1_tag2el[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* sequence at 19 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* set at 20 */ - { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* setOf at 21 */ - { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* sequenceOf at 22 */ - { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* extensibleSet at 23 */ - { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* extensibleSequence at 24 */ - { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* extensibleSequence2 at 25 */ - { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* setOfNULL at 26 */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* sequenceOf at 21 */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* extensibleSet at 22 */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* extensibleSequence at 23 */ + { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* extensibleSequence2 at 24 */ + { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* setOfNULL at 25 */ + { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* setOfREAL at 26 */ { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 }, /* setOfEnums at 27 */ - { (ASN_TAG_CLASS_CONTEXT | (9 << 2)), 9, 0, 0 } /* seqOfZuka at 28 */ + { (ASN_TAG_CLASS_CONTEXT | (9 << 2)), 9, 0, 0 }, /* namedSetOfNULL at 28 */ + { (ASN_TAG_CLASS_CONTEXT | (10 << 2)), 10, 0, 0 }, /* namedSetOfREAL at 29 */ + { (ASN_TAG_CLASS_CONTEXT | (11 << 2)), 11, 0, 0 }, /* namedSetOfEnums at 30 */ + { (ASN_TAG_CLASS_CONTEXT | (12 << 2)), 12, 0, 0 }, /* seqOfZuka at 31 */ + { (ASN_TAG_CLASS_CONTEXT | (13 << 2)), 13, 0, 0 }, /* setOfChoice at 32 */ + { (ASN_TAG_CLASS_CONTEXT | (14 << 2)), 14, 0, 0 } /* namedSetOfChoice at 33 */ }; static asn_CHOICE_specifics_t asn_SPC_PDU_1_specs = { sizeof(struct PDU), @@ -151,7 +206,7 @@ static asn_CHOICE_specifics_t asn_SPC_PDU_1_specs = { offsetof(struct PDU, present), sizeof(((struct PDU *)0)->present), asn_MAP_PDU_1_tag2el, - 10, /* Count of tags in the map */ + 15, /* Count of tags in the map */ 1 /* Whether extensible */ }; asn_TYPE_descriptor_t asn_DEF_PDU = { @@ -170,7 +225,7 @@ asn_TYPE_descriptor_t asn_DEF_PDU = { 0, /* No tags (pointer) */ 0, /* No tags (count) */ asn_MBR_PDU_1, - 10, /* Elements count */ + 15, /* Elements count */ &asn_SPC_PDU_1_specs /* Additional specs */ }; @@ -242,10 +297,10 @@ static ber_tlv_tag_t asn_DEF_Sequence_1_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Sequence_1_tag2el[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* integer at 33 */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* sequence at 34 */ - { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* bits at 35 */ - { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* string at 36 */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* integer at 38 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* sequence at 39 */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* bits at 40 */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* string at 41 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Sequence_1_specs = { sizeof(struct Sequence), @@ -335,8 +390,8 @@ static ber_tlv_tag_t asn_DEF_Set_1_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Set_1_tag2el[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* roid at 40 */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* opaque at 41 */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* roid at 45 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* opaque at 46 */ }; static uint8_t asn_MAP_Set_1_mmap[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = { (1 << 7) | (0 << 6) @@ -554,8 +609,8 @@ static ber_tlv_tag_t asn_DEF_ExtensibleSet_1_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_ExtensibleSet_1_tag2el[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* string at 45 */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* enum at 47 */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* string at 50 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* enum at 52 */ }; static uint8_t asn_MAP_ExtensibleSet_1_mmap[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = { (0 << 7) | (0 << 6) @@ -649,9 +704,9 @@ static ber_tlv_tag_t asn_DEF_ExtensibleSequence_1_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_ExtensibleSequence_1_tag2el[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* string at 51 */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* integer at 53 */ - { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* gtime at 54 */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* string at 56 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* integer at 58 */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* gtime at 59 */ }; static asn_SEQUENCE_specifics_t asn_SPC_ExtensibleSequence_1_specs = { sizeof(struct ExtensibleSequence), @@ -730,8 +785,8 @@ static ber_tlv_tag_t asn_DEF_ExtensibleSequence2_1_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_ExtensibleSequence2_1_tag2el[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* string at 58 */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* integer at 60 */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* string at 63 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* integer at 65 */ }; static asn_SEQUENCE_specifics_t asn_SPC_ExtensibleSequence2_1_specs = { sizeof(struct ExtensibleSequence2), @@ -764,47 +819,47 @@ asn_TYPE_descriptor_t asn_DEF_ExtensibleSequence2 = { }; -/*** <<< INCLUDES [SetOf] >>> ***/ +/*** <<< INCLUDES [SetOfNULL] >>> ***/ -#include +#include #include #include -/*** <<< TYPE-DECLS [SetOf] >>> ***/ +/*** <<< TYPE-DECLS [SetOfNULL] >>> ***/ -typedef struct SetOf { - A_SET_OF(REAL_t) list; +typedef struct SetOfNULL { + A_SET_OF(NULL_t) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} SetOf_t; +} SetOfNULL_t; -/*** <<< FUNC-DECLS [SetOf] >>> ***/ +/*** <<< FUNC-DECLS [SetOfNULL] >>> ***/ -extern asn_TYPE_descriptor_t asn_DEF_SetOf; +extern asn_TYPE_descriptor_t asn_DEF_SetOfNULL; -/*** <<< STAT-DEFS [SetOf] >>> ***/ +/*** <<< STAT-DEFS [SetOfNULL] >>> ***/ -static asn_TYPE_member_t asn_MBR_SetOf_1[] = { +static asn_TYPE_member_t asn_MBR_SetOfNULL_1[] = { { ATF_POINTER, 0, 0, - .tag = (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)), .tag_mode = 0, - .type = &asn_DEF_REAL, + .type = &asn_DEF_NULL, .memb_constraints = 0, /* Defer constraints checking to the member type */ .name = "" }, }; -static ber_tlv_tag_t asn_DEF_SetOf_1_tags[] = { +static ber_tlv_tag_t asn_DEF_SetOfNULL_1_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_SetOf_1_specs = { - sizeof(struct SetOf), - offsetof(struct SetOf, _asn_ctx), - 0, /* XER encoding is XMLDelimitedItemList */ +static asn_SET_OF_specifics_t asn_SPC_SetOfNULL_1_specs = { + sizeof(struct SetOfNULL), + offsetof(struct SetOfNULL, _asn_ctx), + 1, /* XER encoding is XMLValueList */ }; -asn_TYPE_descriptor_t asn_DEF_SetOf = { - "SetOf", - "SetOf", +asn_TYPE_descriptor_t asn_DEF_SetOfNULL = { + "SetOfNULL", + "SetOfNULL", SET_OF_free, SET_OF_print, SET_OF_constraint, @@ -813,59 +868,59 @@ asn_TYPE_descriptor_t asn_DEF_SetOf = { SET_OF_decode_xer, SET_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn_DEF_SetOf_1_tags, - sizeof(asn_DEF_SetOf_1_tags) - /sizeof(asn_DEF_SetOf_1_tags[0]), /* 1 */ - asn_DEF_SetOf_1_tags, /* Same as above */ - sizeof(asn_DEF_SetOf_1_tags) - /sizeof(asn_DEF_SetOf_1_tags[0]), /* 1 */ - asn_MBR_SetOf_1, + asn_DEF_SetOfNULL_1_tags, + sizeof(asn_DEF_SetOfNULL_1_tags) + /sizeof(asn_DEF_SetOfNULL_1_tags[0]), /* 1 */ + asn_DEF_SetOfNULL_1_tags, /* Same as above */ + sizeof(asn_DEF_SetOfNULL_1_tags) + /sizeof(asn_DEF_SetOfNULL_1_tags[0]), /* 1 */ + asn_MBR_SetOfNULL_1, 1, /* Single element */ - &asn_SPC_SetOf_1_specs /* Additional specs */ + &asn_SPC_SetOfNULL_1_specs /* Additional specs */ }; -/*** <<< INCLUDES [SetOfNULL] >>> ***/ +/*** <<< INCLUDES [SetOfREAL] >>> ***/ -#include +#include #include #include -/*** <<< TYPE-DECLS [SetOfNULL] >>> ***/ +/*** <<< TYPE-DECLS [SetOfREAL] >>> ***/ -typedef struct SetOfNULL { - A_SET_OF(NULL_t) list; +typedef struct SetOfREAL { + A_SET_OF(REAL_t) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} SetOfNULL_t; +} SetOfREAL_t; -/*** <<< FUNC-DECLS [SetOfNULL] >>> ***/ +/*** <<< FUNC-DECLS [SetOfREAL] >>> ***/ -extern asn_TYPE_descriptor_t asn_DEF_SetOfNULL; +extern asn_TYPE_descriptor_t asn_DEF_SetOfREAL; -/*** <<< STAT-DEFS [SetOfNULL] >>> ***/ +/*** <<< STAT-DEFS [SetOfREAL] >>> ***/ -static asn_TYPE_member_t asn_MBR_SetOfNULL_1[] = { +static asn_TYPE_member_t asn_MBR_SetOfREAL_1[] = { { ATF_POINTER, 0, 0, - .tag = (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)), .tag_mode = 0, - .type = &asn_DEF_NULL, + .type = &asn_DEF_REAL, .memb_constraints = 0, /* Defer constraints checking to the member type */ .name = "" }, }; -static ber_tlv_tag_t asn_DEF_SetOfNULL_1_tags[] = { +static ber_tlv_tag_t asn_DEF_SetOfREAL_1_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_SetOfNULL_1_specs = { - sizeof(struct SetOfNULL), - offsetof(struct SetOfNULL, _asn_ctx), - 1, /* XER encoding is XMLValueList */ +static asn_SET_OF_specifics_t asn_SPC_SetOfREAL_1_specs = { + sizeof(struct SetOfREAL), + offsetof(struct SetOfREAL, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_SetOfNULL = { - "SetOfNULL", - "SetOfNULL", +asn_TYPE_descriptor_t asn_DEF_SetOfREAL = { + "SetOfREAL", + "SetOfREAL", SET_OF_free, SET_OF_print, SET_OF_constraint, @@ -874,15 +929,15 @@ asn_TYPE_descriptor_t asn_DEF_SetOfNULL = { SET_OF_decode_xer, SET_OF_encode_xer, 0, /* Use generic outmost tag fetcher */ - asn_DEF_SetOfNULL_1_tags, - sizeof(asn_DEF_SetOfNULL_1_tags) - /sizeof(asn_DEF_SetOfNULL_1_tags[0]), /* 1 */ - asn_DEF_SetOfNULL_1_tags, /* Same as above */ - sizeof(asn_DEF_SetOfNULL_1_tags) - /sizeof(asn_DEF_SetOfNULL_1_tags[0]), /* 1 */ - asn_MBR_SetOfNULL_1, + asn_DEF_SetOfREAL_1_tags, + sizeof(asn_DEF_SetOfREAL_1_tags) + /sizeof(asn_DEF_SetOfREAL_1_tags[0]), /* 1 */ + asn_DEF_SetOfREAL_1_tags, /* Same as above */ + sizeof(asn_DEF_SetOfREAL_1_tags) + /sizeof(asn_DEF_SetOfREAL_1_tags[0]), /* 1 */ + asn_MBR_SetOfREAL_1, 1, /* Single element */ - &asn_SPC_SetOfNULL_1_specs /* Additional specs */ + &asn_SPC_SetOfREAL_1_specs /* Additional specs */ }; @@ -1067,6 +1122,309 @@ asn_TYPE_descriptor_t asn_DEF_SetOfEnums = { }; +/*** <<< INCLUDES [NamedSetOfNULL] >>> ***/ + +#include +#include +#include + +/*** <<< TYPE-DECLS [NamedSetOfNULL] >>> ***/ + +typedef struct NamedSetOfNULL { + A_SET_OF(NULL_t) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} NamedSetOfNULL_t; + +/*** <<< FUNC-DECLS [NamedSetOfNULL] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_NamedSetOfNULL; + +/*** <<< STAT-DEFS [NamedSetOfNULL] >>> ***/ + +static asn_TYPE_member_t asn_MBR_NamedSetOfNULL_1[] = { + { ATF_POINTER, 0, 0, + .tag = (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)), + .tag_mode = 0, + .type = &asn_DEF_NULL, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "y" + }, +}; +static ber_tlv_tag_t asn_DEF_NamedSetOfNULL_1_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_NamedSetOfNULL_1_specs = { + sizeof(struct NamedSetOfNULL), + offsetof(struct NamedSetOfNULL, _asn_ctx), + 1, /* XER encoding is XMLValueList */ +}; +asn_TYPE_descriptor_t asn_DEF_NamedSetOfNULL = { + "NamedSetOfNULL", + "NamedSetOfNULL", + SET_OF_free, + SET_OF_print, + SET_OF_constraint, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_decode_xer, + SET_OF_encode_xer, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_NamedSetOfNULL_1_tags, + sizeof(asn_DEF_NamedSetOfNULL_1_tags) + /sizeof(asn_DEF_NamedSetOfNULL_1_tags[0]), /* 1 */ + asn_DEF_NamedSetOfNULL_1_tags, /* Same as above */ + sizeof(asn_DEF_NamedSetOfNULL_1_tags) + /sizeof(asn_DEF_NamedSetOfNULL_1_tags[0]), /* 1 */ + asn_MBR_NamedSetOfNULL_1, + 1, /* Single element */ + &asn_SPC_NamedSetOfNULL_1_specs /* Additional specs */ +}; + + +/*** <<< INCLUDES [NamedSetOfREAL] >>> ***/ + +#include +#include +#include + +/*** <<< TYPE-DECLS [NamedSetOfREAL] >>> ***/ + +typedef struct NamedSetOfREAL { + A_SET_OF(REAL_t) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} NamedSetOfREAL_t; + +/*** <<< FUNC-DECLS [NamedSetOfREAL] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_NamedSetOfREAL; + +/*** <<< STAT-DEFS [NamedSetOfREAL] >>> ***/ + +static asn_TYPE_member_t asn_MBR_NamedSetOfREAL_1[] = { + { ATF_POINTER, 0, 0, + .tag = (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)), + .tag_mode = 0, + .type = &asn_DEF_REAL, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "name" + }, +}; +static ber_tlv_tag_t asn_DEF_NamedSetOfREAL_1_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_NamedSetOfREAL_1_specs = { + sizeof(struct NamedSetOfREAL), + offsetof(struct NamedSetOfREAL, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_NamedSetOfREAL = { + "NamedSetOfREAL", + "NamedSetOfREAL", + SET_OF_free, + SET_OF_print, + SET_OF_constraint, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_decode_xer, + SET_OF_encode_xer, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_NamedSetOfREAL_1_tags, + sizeof(asn_DEF_NamedSetOfREAL_1_tags) + /sizeof(asn_DEF_NamedSetOfREAL_1_tags[0]), /* 1 */ + asn_DEF_NamedSetOfREAL_1_tags, /* Same as above */ + sizeof(asn_DEF_NamedSetOfREAL_1_tags) + /sizeof(asn_DEF_NamedSetOfREAL_1_tags[0]), /* 1 */ + asn_MBR_NamedSetOfREAL_1, + 1, /* Single element */ + &asn_SPC_NamedSetOfREAL_1_specs /* Additional specs */ +}; + + +/*** <<< INCLUDES [NamedSetOfEnums] >>> ***/ + +#include +#include +#include + +/*** <<< DEPS [NamedSetOfEnums] >>> ***/ + +typedef enum name { + name_one = 0, + name_oneMore = 1 +} name_e; + +/*** <<< TYPE-DECLS [NamedSetOfEnums] >>> ***/ + +typedef struct NamedSetOfEnums { + A_SET_OF(ENUMERATED_t) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} NamedSetOfEnums_t; + +/*** <<< FUNC-DECLS [NamedSetOfEnums] >>> ***/ + +/* extern asn_TYPE_descriptor_t asn_DEF_name_2; // (Use -fall-defs-global to expose) */ +extern asn_TYPE_descriptor_t asn_DEF_NamedSetOfEnums; + +/*** <<< CODE [NamedSetOfEnums] >>> ***/ + +static int +name_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + /* Replace with underlying type checker */ + td->check_constraints = asn_DEF_ENUMERATED.check_constraints; + return td->check_constraints(td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using ENUMERATED, + * so here we adjust the DEF accordingly. + */ +static void +name_2_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_ENUMERATED.free_struct; + td->print_struct = asn_DEF_ENUMERATED.print_struct; + td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; + td->der_encoder = asn_DEF_ENUMERATED.der_encoder; + td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; + td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; + td->elements = asn_DEF_ENUMERATED.elements; + td->elements_count = asn_DEF_ENUMERATED.elements_count; + /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ +} + +static void +name_2_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + name_2_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +static int +name_2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + name_2_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +static asn_dec_rval_t +name_2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + name_2_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +static asn_enc_rval_t +name_2_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + name_2_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +static asn_dec_rval_t +name_2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + name_2_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +static asn_enc_rval_t +name_2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + name_2_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + + +/*** <<< STAT-DEFS [NamedSetOfEnums] >>> ***/ + +static asn_INTEGER_enum_map_t asn_MAP_name_2_value2enum[] = { + { 0, 3, "one" }, + { 1, 7, "oneMore" } +}; +static unsigned int asn_MAP_name_2_enum2value[] = { + 0, /* one(0) */ + 1 /* oneMore(1) */ +}; +static asn_INTEGER_specifics_t asn_SPC_name_2_specs = { + asn_MAP_name_2_value2enum, /* "tag" => N; sorted by tag */ + asn_MAP_name_2_enum2value, /* N => "tag"; sorted by N */ + 2, /* Number of elements in the maps */ + 0, /* Enumeration is not extensible */ + 1 /* Strict enumeration */ +}; +static ber_tlv_tag_t asn_DEF_name_2_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_name_2 = { + "", + "", + name_2_free, + name_2_print, + name_2_constraint, + name_2_decode_ber, + name_2_encode_der, + name_2_decode_xer, + name_2_encode_xer, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_name_2_tags, + sizeof(asn_DEF_name_2_tags) + /sizeof(asn_DEF_name_2_tags[0]), /* 1 */ + asn_DEF_name_2_tags, /* Same as above */ + sizeof(asn_DEF_name_2_tags) + /sizeof(asn_DEF_name_2_tags[0]), /* 1 */ + 0, 0, /* Defined elsewhere */ + &asn_SPC_name_2_specs /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_NamedSetOfEnums_1[] = { + { ATF_POINTER, 0, 0, + .tag = (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + .tag_mode = 0, + .type = &asn_DEF_name_2, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "name" + }, +}; +static ber_tlv_tag_t asn_DEF_NamedSetOfEnums_1_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_NamedSetOfEnums_1_specs = { + sizeof(struct NamedSetOfEnums), + offsetof(struct NamedSetOfEnums, _asn_ctx), + 1, /* XER encoding is XMLValueList */ +}; +asn_TYPE_descriptor_t asn_DEF_NamedSetOfEnums = { + "NamedSetOfEnums", + "NamedSetOfEnums", + SET_OF_free, + SET_OF_print, + SET_OF_constraint, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_decode_xer, + SET_OF_encode_xer, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_NamedSetOfEnums_1_tags, + sizeof(asn_DEF_NamedSetOfEnums_1_tags) + /sizeof(asn_DEF_NamedSetOfEnums_1_tags[0]), /* 1 */ + asn_DEF_NamedSetOfEnums_1_tags, /* Same as above */ + sizeof(asn_DEF_NamedSetOfEnums_1_tags) + /sizeof(asn_DEF_NamedSetOfEnums_1_tags[0]), /* 1 */ + asn_MBR_NamedSetOfEnums_1, + 1, /* Single element */ + &asn_SPC_NamedSetOfEnums_1_specs /* Additional specs */ +}; + + /*** <<< INCLUDES [SequenceOf] >>> ***/ #include @@ -1188,3 +1546,222 @@ asn_TYPE_descriptor_t asn_DEF_SeqOfZuka = { &asn_SPC_SeqOfZuka_1_specs /* Additional specs */ }; + +/*** <<< INCLUDES [SetOfChoice] >>> ***/ + +#include +#include + +/*** <<< FWD-DECLS [SetOfChoice] >>> ***/ + +struct SimpleChoice; + +/*** <<< TYPE-DECLS [SetOfChoice] >>> ***/ + +typedef struct SetOfChoice { + A_SET_OF(struct SimpleChoice) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} SetOfChoice_t; + +/*** <<< FUNC-DECLS [SetOfChoice] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_SetOfChoice; + +/*** <<< POST-INCLUDE [SetOfChoice] >>> ***/ + +#include + +/*** <<< STAT-DEFS [SetOfChoice] >>> ***/ + +static asn_TYPE_member_t asn_MBR_SetOfChoice_1[] = { + { ATF_POINTER, 0, 0, + .tag = -1 /* Ambiguous tag (CHOICE?) */, + .tag_mode = 0, + .type = &asn_DEF_SimpleChoice, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "" + }, +}; +static ber_tlv_tag_t asn_DEF_SetOfChoice_1_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_SetOfChoice_1_specs = { + sizeof(struct SetOfChoice), + offsetof(struct SetOfChoice, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_SetOfChoice = { + "SetOfChoice", + "SetOfChoice", + SET_OF_free, + SET_OF_print, + SET_OF_constraint, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_decode_xer, + SET_OF_encode_xer, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_SetOfChoice_1_tags, + sizeof(asn_DEF_SetOfChoice_1_tags) + /sizeof(asn_DEF_SetOfChoice_1_tags[0]), /* 1 */ + asn_DEF_SetOfChoice_1_tags, /* Same as above */ + sizeof(asn_DEF_SetOfChoice_1_tags) + /sizeof(asn_DEF_SetOfChoice_1_tags[0]), /* 1 */ + asn_MBR_SetOfChoice_1, + 1, /* Single element */ + &asn_SPC_SetOfChoice_1_specs /* Additional specs */ +}; + + +/*** <<< INCLUDES [NamedSetOfChoice] >>> ***/ + +#include +#include + +/*** <<< FWD-DECLS [NamedSetOfChoice] >>> ***/ + +struct SimpleChoice; + +/*** <<< TYPE-DECLS [NamedSetOfChoice] >>> ***/ + +typedef struct NamedSetOfChoice { + A_SET_OF(struct SimpleChoice) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} NamedSetOfChoice_t; + +/*** <<< FUNC-DECLS [NamedSetOfChoice] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_NamedSetOfChoice; + +/*** <<< POST-INCLUDE [NamedSetOfChoice] >>> ***/ + +#include + +/*** <<< STAT-DEFS [NamedSetOfChoice] >>> ***/ + +static asn_TYPE_member_t asn_MBR_NamedSetOfChoice_1[] = { + { ATF_POINTER, 0, 0, + .tag = -1 /* Ambiguous tag (CHOICE?) */, + .tag_mode = 0, + .type = &asn_DEF_SimpleChoice, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "whatever" + }, +}; +static ber_tlv_tag_t asn_DEF_NamedSetOfChoice_1_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_NamedSetOfChoice_1_specs = { + sizeof(struct NamedSetOfChoice), + offsetof(struct NamedSetOfChoice, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_NamedSetOfChoice = { + "NamedSetOfChoice", + "NamedSetOfChoice", + SET_OF_free, + SET_OF_print, + SET_OF_constraint, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_decode_xer, + SET_OF_encode_xer, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_NamedSetOfChoice_1_tags, + sizeof(asn_DEF_NamedSetOfChoice_1_tags) + /sizeof(asn_DEF_NamedSetOfChoice_1_tags[0]), /* 1 */ + asn_DEF_NamedSetOfChoice_1_tags, /* Same as above */ + sizeof(asn_DEF_NamedSetOfChoice_1_tags) + /sizeof(asn_DEF_NamedSetOfChoice_1_tags[0]), /* 1 */ + asn_MBR_NamedSetOfChoice_1, + 1, /* Single element */ + &asn_SPC_NamedSetOfChoice_1_specs /* Additional specs */ +}; + + +/*** <<< INCLUDES [SimpleChoice] >>> ***/ + +#include +#include +#include + +/*** <<< DEPS [SimpleChoice] >>> ***/ + +typedef enum SimpleChoice_PR { + SimpleChoice_PR_NOTHING, /* No components present */ + SimpleChoice_PR_a, + SimpleChoice_PR_b, +} SimpleChoice_PR; + +/*** <<< TYPE-DECLS [SimpleChoice] >>> ***/ + +typedef struct SimpleChoice { + SimpleChoice_PR present; + union SimpleChoice_u { + NULL_t a; + INTEGER_t b; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} SimpleChoice_t; + +/*** <<< FUNC-DECLS [SimpleChoice] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_SimpleChoice; + +/*** <<< STAT-DEFS [SimpleChoice] >>> ***/ + +static asn_TYPE_member_t asn_MBR_SimpleChoice_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct SimpleChoice, choice.a), + .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_NULL, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "a" + }, + { ATF_NOFLAGS, 0, offsetof(struct SimpleChoice, choice.b), + .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_INTEGER, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .name = "b" + }, +}; +static asn_TYPE_tag2member_t asn_MAP_SimpleChoice_1_tag2el[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* a at 79 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* b at 79 */ +}; +static asn_CHOICE_specifics_t asn_SPC_SimpleChoice_1_specs = { + sizeof(struct SimpleChoice), + offsetof(struct SimpleChoice, _asn_ctx), + offsetof(struct SimpleChoice, present), + sizeof(((struct SimpleChoice *)0)->present), + asn_MAP_SimpleChoice_1_tag2el, + 2, /* Count of tags in the map */ + 0 /* Whether extensible */ +}; +asn_TYPE_descriptor_t asn_DEF_SimpleChoice = { + "SimpleChoice", + "SimpleChoice", + CHOICE_free, + CHOICE_print, + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_decode_xer, + CHOICE_encode_xer, + CHOICE_outmost_tag, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + asn_MBR_SimpleChoice_1, + 2, /* Elements count */ + &asn_SPC_SimpleChoice_1_specs /* Additional specs */ +}; + From 6d44a544c597ecdd3dc068565f128037688795ec Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 8 Nov 2005 03:06:16 +0000 Subject: [PATCH 0993/1469] SET OF/SEQUENCE OF interaction with named and unnamed CHOICE git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@993 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 6 + asn1c/tests/check-assembly.sh | 2 +- asn1c/tests/data-70/data-70-27.in | 2 +- asn1c/tests/data-70/data-70-50.in | 5 + asn1c/tests/data-70/data-70-51.in | 6 + asn1c/tests/data-70/data-70-52-D.in | 6 + asn1c/tests/data-70/data-70-53.in | 6 + asn1c/tests/data-70/data-70-54-D.in | 6 + libasn1compiler/asn1c_C.c | 17 +- skeletons/OCTET_STRING.c | 4 + skeletons/asn-decoder-template.c | 179 +++++++++++------- skeletons/asn_internal.h | 2 +- skeletons/constr_CHOICE.c | 18 +- skeletons/constr_SEQUENCE_OF.c | 7 +- skeletons/constr_SET_OF.c | 23 ++- skeletons/tests/check-XER.c | 4 +- skeletons/xer_decoder.c | 4 + tests/42-real-life-OK.asn1.-PR | 2 +- tests/43-recursion-OK.asn1.-P | 2 +- tests/70-xer-test-OK.asn1.-P | 4 +- tests/92-circular-loops-OK.asn1.-P | 2 +- ...-circular-loops-OK.asn1.-Pfindirect-choice | 2 +- 22 files changed, 216 insertions(+), 93 deletions(-) create mode 100644 asn1c/tests/data-70/data-70-50.in create mode 100644 asn1c/tests/data-70/data-70-51.in create mode 100644 asn1c/tests/data-70/data-70-52-D.in create mode 100644 asn1c/tests/data-70/data-70-53.in create mode 100644 asn1c/tests/data-70/data-70-54-D.in diff --git a/ChangeLog b/ChangeLog index f59da1799..742ae5074 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,10 @@ +0.9.20: 2005-Nov-07 + + * SET OF CHOICE, SEQUENCE OF CHOICE and a certain named S/O types + are represented differently in XER. THIS IS AN ICOMPATIBLE CHANGE. + (Test case 70) (Severity: low; Security impact: low) + 0.9.19: 2005-Oct-06 * A proper solution to circular references. No kludge flags diff --git a/asn1c/tests/check-assembly.sh b/asn1c/tests/check-assembly.sh index 4eb22d2aa..d3a5251bc 100755 --- a/asn1c/tests/check-assembly.sh +++ b/asn1c/tests/check-assembly.sh @@ -64,7 +64,7 @@ check-succeeded: check-executable check: check-succeeded clean: - @rm -f *.o + @rm -f *.o check-executable EOM # Perform building and checking diff --git a/asn1c/tests/data-70/data-70-27.in b/asn1c/tests/data-70/data-70-27.in index a2bb84a33..f02101c6c 100644 --- a/asn1c/tests/data-70/data-70-27.in +++ b/asn1c/tests/data-70/data-70-27.in @@ -1,5 +1,5 @@ - + diff --git a/asn1c/tests/data-70/data-70-50.in b/asn1c/tests/data-70/data-70-50.in new file mode 100644 index 000000000..21233c5d6 --- /dev/null +++ b/asn1c/tests/data-70/data-70-50.in @@ -0,0 +1,5 @@ + + + + + diff --git a/asn1c/tests/data-70/data-70-51.in b/asn1c/tests/data-70/data-70-51.in new file mode 100644 index 000000000..106bbb803 --- /dev/null +++ b/asn1c/tests/data-70/data-70-51.in @@ -0,0 +1,6 @@ + + + + 1 + + diff --git a/asn1c/tests/data-70/data-70-52-D.in b/asn1c/tests/data-70/data-70-52-D.in new file mode 100644 index 000000000..0a35d3d75 --- /dev/null +++ b/asn1c/tests/data-70/data-70-52-D.in @@ -0,0 +1,6 @@ + + + + 1 + + diff --git a/asn1c/tests/data-70/data-70-53.in b/asn1c/tests/data-70/data-70-53.in new file mode 100644 index 000000000..20940b68e --- /dev/null +++ b/asn1c/tests/data-70/data-70-53.in @@ -0,0 +1,6 @@ + + + + 1 + + diff --git a/asn1c/tests/data-70/data-70-54-D.in b/asn1c/tests/data-70/data-70-54-D.in new file mode 100644 index 000000000..365026dea --- /dev/null +++ b/asn1c/tests/data-70/data-70-54-D.in @@ -0,0 +1,6 @@ + + + + 1 + + diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 9884bdfa7..4df99188d 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -734,11 +734,12 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { OUT("offsetof(struct "); out_name_chain(arg, ONC_avoid_keywords); OUT(", _asn_ctx),\n"); - - if(expr_as_xmlvaluelist(arg, v)) - OUT("1,\t/* XER encoding is XMLValueList */\n"); - else - OUT("0,\t/* XER encoding is XMLDelimitedItemList */\n"); + { + int as_xvl = expr_as_xmlvaluelist(arg, v); + OUT("%d,\t/* XER encoding is %s */\n", + as_xvl, + as_xvl ? "XMLValueList" : "XMLDelimitedItemList"); + } ); OUT("};\n"); @@ -1866,12 +1867,16 @@ expr_as_xmlvaluelist(arg_t *arg, asn1p_expr_t *expr) { expr = asn1f_find_terminal_type_ex(arg->asn, expr); if(!expr) return 0; - /* X.680, 25.5, Table 5 */ + /* + * X.680, 25.5, Table 5 + */ switch(expr->expr_type) { case ASN_BASIC_BOOLEAN: case ASN_BASIC_ENUMERATED: case ASN_BASIC_NULL: return 1; + case ASN_CONSTR_CHOICE: + return 2; default: return 0; } diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index b43c18fe1..de53c1dbb 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -549,6 +549,8 @@ OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *sptr, if(!cb) { er.encoded += (type_variant == _TT_BIT_STRING) + st->size; + er.structure_ptr = 0; + er.failed_type = 0; return er; } @@ -572,6 +574,8 @@ OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *sptr, } er.encoded += st->size; + er.structure_ptr = 0; + er.failed_type = 0; return er; cb_failed: _ASN_ENCODE_FAILED; diff --git a/skeletons/asn-decoder-template.c b/skeletons/asn-decoder-template.c index 0febbf46a..348c3731d 100644 --- a/skeletons/asn-decoder-template.c +++ b/skeletons/asn-decoder-template.c @@ -1,5 +1,5 @@ /* - * Generic BER decoder template for any defined ASN.1 type. + * Generic decoder template for a selected ASN.1 type. * Copyright (c) 2005 Lev Walkin . All rights reserved. * * To compile with your own ASN.1 type, please redefine the asn_DEF as shown: @@ -21,21 +21,32 @@ #include extern asn_TYPE_descriptor_t asn_DEF; /* ASN.1 type to be decoded */ +static asn_TYPE_descriptor_t *pduType = &asn_DEF; /* * Open file and parse its contens. */ static void *data_decode_from_file(asn_TYPE_descriptor_t *asnTypeOfPDU, const char *fname, ssize_t suggested_bufsize); +static int write_out(const void *buffer, size_t size, void *key); int opt_debug; /* -d */ static int opt_check; /* -c */ static int opt_stack; /* -s */ -static enum output_method { - OUT_NONE, /* No pretty-printing */ - OUT_PRINT, /* -p flag */ - OUT_XML /* -x flag */ -} opt_ometh; /* -p or -x */ + +/* Input data format selector */ +static enum input_format { + INP_BER, /* -iber: BER input */ + INP_XER /* -ixer: XER input */ +} iform; /* -i */ + +/* Output data format selector */ +static enum output_format { + OUT_XER, /* -oxer: XER (XML) output */ + OUT_DER, /* -oder: DER output */ + OUT_TEXT, /* -otext: semi-structured text */ + OUT_NULL /* -onull: No pretty-printing */ +} oform; /* -o */ #define DEBUG(fmt, args...) do { \ if(!opt_debug) break; \ @@ -46,7 +57,6 @@ static enum output_method { int main(int ac, char **av) { ssize_t suggested_bufsize = 8192; /* close or equal to stdio buffer */ - asn_TYPE_descriptor_t *pduType = &asn_DEF; int number_of_iterations = 1; int num; int ch; @@ -54,8 +64,22 @@ main(int ac, char **av) { /* * Pocess the command-line argments. */ - while((ch = getopt(ac, av, "b:cdn:hps:x")) != -1) + while((ch = getopt(ac, av, "i:o:b:cdn:hs:")) != -1) switch(ch) { + case 'i': + if(optarg[0] == 'b') { iform = INP_BER; break; } + if(optarg[0] == 'x') { iform = INP_XER; break; } + fprintf(stderr, "-i: '%s': improper format selector", + optarg); + exit(EX_UNAVAILABLE); + case 'o': + if(optarg[0] == 'd') { oform = OUT_DER; break; } + if(optarg[0] == 'x') { oform = OUT_XER; break; } + if(optarg[0] == 't') { oform = OUT_TEXT; break; } + if(optarg[0] == 'n') { oform = OUT_NULL; break; } + fprintf(stderr, "-o: '%s': improper format selector", + optarg); + exit(EX_UNAVAILABLE); case 'b': suggested_bufsize = atoi(optarg); if(suggested_bufsize < 1 @@ -80,9 +104,6 @@ main(int ac, char **av) { exit(EX_UNAVAILABLE); } break; - case 'p': - opt_ometh = OUT_PRINT; - break; case 's': opt_stack = atoi(optarg); if(opt_stack <= 0) { @@ -92,25 +113,22 @@ main(int ac, char **av) { exit(EX_UNAVAILABLE); } break; - case 'x': - opt_ometh = OUT_XML; - break; case 'h': default: fprintf(stderr, "Usage: %s [options] ...\n" "Where options are:\n" + " -iber (I) Input is in BER (Basic Encoding Rules)\n" + " -ixer Input is in XER (XML Encoding Rules)\n" + " -oder Output in DER (Distinguished Encoding Rules)\n" + " -oxer (O) Output in XER (XML Encoding Rules)\n" + " -otext Output in plain semi-structured text (dump)\n" + " -onull Verify (decode) input, but do not output\n" " -b Set the i/o buffer size (default is %ld)\n" " -c Check ASN.1 constraints after decoding\n" " -d Enable debugging (-dd is even better)\n" " -n Process files times\n" " -s Set the stack usage limit\n" - " -p Print out the decoded contents\n" - " -x Print out as XML" -#ifdef ASN_DECODER_DEFAULT_OUTPUT_XML - " (default)" -#endif - "\n" , av[0], (long)suggested_bufsize); exit(EX_USAGE); } @@ -119,14 +137,12 @@ main(int ac, char **av) { av += optind; if(ac < 1) { - fprintf(stderr, "Error: missing filename\n"); + fprintf(stderr, "%s: No input files specified. " + "Try '-h' for more information\n", + av[-optind]); exit(EX_USAGE); } -#ifdef ASN_DECODER_DEFAULT_OUTPUT_XML - if(opt_ometh == OUT_NONE) opt_ometh = OUT_XML; -#endif - setvbuf(stdout, 0, _IOLBF, 0); for(num = 0; num < number_of_iterations; num++) { @@ -137,6 +153,7 @@ main(int ac, char **av) { for(ac_i = 0; ac_i < ac; ac_i++) { char *fname = av[ac_i]; void *structure; + asn_enc_rval_t erv; /* * Decode the encoded structure from file. @@ -148,32 +165,40 @@ main(int ac, char **av) { exit(EX_DATAERR); } - switch(opt_ometh) { - case OUT_NONE: + /* Check ASN.1 constraints */ + if(opt_check) { + char errbuf[128]; + size_t errlen = sizeof(errbuf); + if(asn_check_constraints(pduType, structure, + errbuf, &errlen)) { + fprintf(stderr, "%s: ASN.1 constraint " + "check failed: %s\n", fname, errbuf); + exit(EX_DATAERR); + } + } + + switch(oform) { + case OUT_NULL: fprintf(stderr, "%s: decoded successfully\n", fname); break; - case OUT_PRINT: /* -p */ + case OUT_TEXT: /* -otext */ asn_fprint(stdout, pduType, structure); break; - case OUT_XML: /* -x */ + case OUT_XER: /* -oxer */ if(xer_fprint(stdout, pduType, structure)) { fprintf(stderr, "%s: Cannot convert into XML\n", fname); exit(EX_UNAVAILABLE); } break; - } - - /* Check ASN.1 constraints */ - if(opt_check) { - char errbuf[128]; - size_t errlen = sizeof(errbuf); - if(asn_check_constraints(pduType, structure, - errbuf, &errlen)) { - fprintf(stderr, "%s: ASN.1 constraint " - "check failed: %s\n", fname, errbuf); - exit(EX_DATAERR); + case OUT_DER: + erv = der_encode(pduType, structure, write_out, stdout); + if(erv.encoded < 0) { + fprintf(stderr, "%s: Cannot convert into DER\n", + fname); + exit(EX_UNAVAILABLE); } + break; } pduType->free_struct(pduType, structure, 0); @@ -183,6 +208,10 @@ main(int ac, char **av) { return 0; } +/* Dump the buffer */ +static int write_out(const void *buffer, size_t size, void *key) { + return (fwrite(buffer, 1, size, key) == size) ? 0 : -1; +} static char *buffer; static size_t buf_offset; /* Offset from the start */ @@ -194,7 +223,7 @@ static off_t buf_shifted; /* Number of bytes ever shifted */ #define bufend (buffer + buf_offset + buf_len) /* - * Ensure that the buffer contains at least this amoount of free space. + * Ensure that the buffer contains at least this amount of free space. */ static void buf_extend(size_t bySize) { @@ -231,6 +260,7 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *f static asn_codec_ctx_t s_codec_ctx; asn_codec_ctx_t *opt_codec_ctx = 0; void *structure = 0; + asn_dec_rval_t rval; size_t rd; FILE *fp; @@ -239,9 +269,14 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *f opt_codec_ctx = &s_codec_ctx; } - DEBUG("Processing file %s", fname); - - fp = fopen(fname, "r"); + if(strcmp(fname, "-")) { + DEBUG("Processing file %s", fname); + fp = fopen(fname, "r"); + } else { + DEBUG("Processing standard input"); + fname = "stdin"; + fp = stdin; + } if(!fp) { fprintf(stderr, "%s: %s\n", fname, strerror(errno)); @@ -262,9 +297,13 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *f buf_offset = 0; buf_len = 0; + /* Pretend immediate EOF */ + rval.code = RC_WMORE; + rval.consumed = 0; + while((rd = fread(fbuf, 1, fbuf_size, fp)) || !feof(fp)) { - asn_dec_rval_t rval; - int using_local_buf; + char *i_bptr; + size_t i_size; /* * Copy the data over, or use the original buffer. @@ -275,26 +314,27 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *f memcpy(bufend, fbuf, rd); buf_len += rd; - rval = ber_decode(opt_codec_ctx, pduType, - (void **)&structure, bufptr, buf_len); - DEBUG("ber_decode(%ld) consumed %ld, code %d", - (long)buf_len, (long)rval.consumed, rval.code); - - /* - * Adjust position inside the source buffer. - */ - assert(rval.consumed <= buf_len); - buf_offset += rval.consumed; - buf_len -= rval.consumed; + i_bptr = bufptr; + i_size = buf_len; } else { - using_local_buf = 1; + i_bptr = fbuf; + i_size = rd; + } - /* Feed the chunk of data into a decoder routine */ + switch(iform) { + case INP_BER: rval = ber_decode(opt_codec_ctx, pduType, - (void **)&structure, fbuf, rd); - DEBUG("ber_decode(%ld) consumed %ld, code %d", - (long)rd, (long)rval.consumed, rval.code); + (void **)&structure, i_bptr, i_size); + break; + case INP_XER: + rval = xer_decode(opt_codec_ctx, pduType, + (void **)&structure, i_bptr, i_size); + break; + } + DEBUG("decode(%ld) consumed %ld, code %d", + (long)buf_len, (long)rval.consumed, rval.code); + if(buf_len == 0) { /* * Switch the remainder into the intermediate buffer. */ @@ -310,10 +350,16 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *f switch(rval.code) { case RC_OK: DEBUG("RC_OK, finishing up"); - fclose(fp); + if(fp != stdin) fclose(fp); return structure; case RC_WMORE: DEBUG("RC_WMORE, continuing..."); + /* + * Adjust position inside the source buffer. + */ + buf_offset += rval.consumed; + buf_len -= rval.consumed; + rval.consumed = 0; continue; case RC_FAIL: break; @@ -327,8 +373,11 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *f pduType->free_struct(pduType, structure, 0); fprintf(stderr, "%s: " - "Decode failed past %lld byte\n", - fname, (long long)(buf_shifted + buf_offset)); + "Decode failed past byte %ld: %s\n", + fname, (long)(buf_shifted + buf_offset + rval.consumed), + (rval.code == RC_WMORE) + ? "Unexpected end of input" + : "Input processing error"); return 0; } diff --git a/skeletons/asn_internal.h b/skeletons/asn_internal.h index 09d407c55..4a86141dd 100644 --- a/skeletons/asn_internal.h +++ b/skeletons/asn_internal.h @@ -20,7 +20,7 @@ extern "C" { #endif /* Environment version might be used to avoid running with the old library */ -#define ASN1C_ENVIRONMENT_VERSION 919 /* Compile-time version */ +#define ASN1C_ENVIRONMENT_VERSION 920 /* Compile-time version */ int get_asn1c_environment_version(void); /* Run-time version */ #define CALLOC(nmemb, size) calloc(nmemb, size) diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index b3af333a2..f832812a2 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -572,7 +572,8 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, * Restore parsing context. */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); - + if(ctx->phase == 0 && !*xml_tag) + ctx->phase = 1; /* Skip the outer tag checking phase */ /* * Phases of XER/XML processing: @@ -625,6 +626,12 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, /* Fall through */ } + /* No need to wait for closing tag; special mode. */ + if(ctx->phase == 3 && !*xml_tag) { + ctx->phase = 5; /* Phase out */ + RETURN(RC_OK); + } + /* * Get the next part of the XML stream. */ @@ -644,6 +651,12 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); + ASN_DEBUG("XER/CHOICE checked [%c%c%c%c] vs [%s], tcv=%d", + ch_size>0?((uint8_t *)buf_ptr)[0]:'?', + ch_size>1?((uint8_t *)buf_ptr)[1]:'?', + ch_size>2?((uint8_t *)buf_ptr)[2]:'?', + ch_size>3?((uint8_t *)buf_ptr)[3]:'?', + xml_tag, tcv); /* Skip the extensions section */ if(ctx->phase == 4) { @@ -739,7 +752,8 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, break; } - ASN_DEBUG("Unexpected XML tag in CHOICE"); + ASN_DEBUG("Unexpected XML tag in CHOICE (ph=%d, tag=%s)", + ctx->phase, xml_tag); break; } diff --git a/skeletons/constr_SEQUENCE_OF.c b/skeletons/constr_SEQUENCE_OF.c index 55307649e..12233a6c1 100644 --- a/skeletons/constr_SEQUENCE_OF.c +++ b/skeletons/constr_SEQUENCE_OF.c @@ -51,6 +51,8 @@ SEQUENCE_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, computed_size += encoding_size; if(!cb) { erval.encoded = computed_size; + erval.structure_ptr = 0; + erval.failed_type = 0; return erval; } @@ -79,6 +81,8 @@ SEQUENCE_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, erval.structure_ptr = ptr; } else { erval.encoded = computed_size; + erval.structure_ptr = 0; + erval.failed_type = 0; } return erval; @@ -116,8 +120,7 @@ SEQUENCE_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, ilevel + 1, flags, cb, app_key); if(tmper.encoded == -1) return tmper; if(tmper.encoded == 0 && specs->as_XMLValueList) { - const char *name = (*elm->name) - ? elm->name : elm->type->xml_tag; + const char *name = elm->type->xml_tag; size_t len = strlen(name); if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel + 1); _ASN_CALLBACK3("<", 1, name, len, "/>", 2); diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index e578ccbb2..bd25b3d8a 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -471,8 +471,7 @@ SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, */ asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; asn_TYPE_member_t *element = td->elements; - const char *elm_tag = ((*element->name) - ? element->name : element->type->xml_tag); + const char *elm_tag; const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; /* @@ -492,6 +491,14 @@ SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, if(st == 0) RETURN(RC_FAIL); } + /* Which tag is expected for the downstream */ + if(specs->as_XMLValueList) { + elm_tag = (specs->as_XMLValueList == 1) ? 0 : ""; + } else { + elm_tag = (*element->name) + ? element->name : element->type->xml_tag; + } + /* * Restore parsing context. */ @@ -515,6 +522,7 @@ SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_dec_rval_t tmprval; /* Invoke the inner type decoder, m.b. multiple times */ + ASN_DEBUG("XER/SET OF element [%s]", elm_tag); tmprval = element->type->xer_decoder(opt_codec_ctx, element->type, &ctx->ptr, elm_tag, buf_ptr, size); @@ -553,7 +561,8 @@ SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); - ASN_DEBUG("XER/SET OF: tcv = %d, ph=%d", tcv, ctx->phase); + ASN_DEBUG("XER/SET OF: tcv = %d, ph=%d t=%s", + tcv, ctx->phase, xml_tag); switch(tcv) { case XCT_CLOSING: if(ctx->phase == 0) break; @@ -682,18 +691,18 @@ SET_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); } - if(!xcan && specs->as_XMLValueList) + if(!xcan && specs->as_XMLValueList == 1) _i_ASN_TEXT_INDENT(1, ilevel + 1); tmper = elm->type->xer_encoder(elm->type, memb_ptr, - ilevel + 1, flags, cb, app_key); + ilevel + (specs->as_XMLValueList != 2), + flags, cb, app_key); if(tmper.encoded == -1) { td = tmper.failed_type; sptr = tmper.structure_ptr; goto cb_failed; } if(tmper.encoded == 0 && specs->as_XMLValueList) { - const char *name = (*elm->name) - ? elm->name : elm->type->xml_tag; + const char *name = elm->type->xml_tag; size_t len = strlen(name); _ASN_CALLBACK3("<", 1, name, len, "/>", 2); } diff --git a/skeletons/tests/check-XER.c b/skeletons/tests/check-XER.c index 10b0a3173..6e2f1ce5a 100644 --- a/skeletons/tests/check-XER.c +++ b/skeletons/tests/check-XER.c @@ -46,8 +46,8 @@ main() { check("", "", XCT_BROKEN); - check("<>", "", XCT_OPENING); - check("", "", XCT_CLOSING); + check("<>", "", XCT_UNKNOWN_OP); + check("", "", XCT_UNKNOWN_CL); check("", "a", XCT_BROKEN); check("<>", "a", XCT_UNKNOWN_OP); diff --git a/skeletons/xer_decoder.c b/skeletons/xer_decoder.c index b112a72d1..e48a5ed0e 100644 --- a/skeletons/xer_decoder.c +++ b/skeletons/xer_decoder.c @@ -124,6 +124,10 @@ xer_check_tag(const void *buf_ptr, int size, const char *need_tag) { } } + /* Sometimes we don't care about the tag */ + if(!need_tag || !*need_tag) + return (xer_check_tag_e)(XCT__UNK__MASK | ct); + /* * Determine the tag name. */ diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index 6bc0c227b..cd4626319 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -239,7 +239,7 @@ static ber_tlv_tag_t asn_DEF_vparts_2_tags[] = { static asn_SET_OF_specifics_t asn_SPC_vparts_2_specs = { sizeof(struct vparts), offsetof(struct vparts, _asn_ctx), - 0, /* XER encoding is XMLDelimitedItemList */ + 2, /* XER encoding is XMLValueList */ }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_vparts_2 = { diff --git a/tests/43-recursion-OK.asn1.-P b/tests/43-recursion-OK.asn1.-P index 6416d4bdd..a3480364f 100644 --- a/tests/43-recursion-OK.asn1.-P +++ b/tests/43-recursion-OK.asn1.-P @@ -261,7 +261,7 @@ static ber_tlv_tag_t asn_DEF_or_3_tags[] = { static asn_SET_OF_specifics_t asn_SPC_or_3_specs = { sizeof(struct or), offsetof(struct or, _asn_ctx), - 0, /* XER encoding is XMLDelimitedItemList */ + 2, /* XER encoding is XMLValueList */ }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_or_3 = { diff --git a/tests/70-xer-test-OK.asn1.-P b/tests/70-xer-test-OK.asn1.-P index a0e273c16..72483fd65 100644 --- a/tests/70-xer-test-OK.asn1.-P +++ b/tests/70-xer-test-OK.asn1.-P @@ -1590,7 +1590,7 @@ static ber_tlv_tag_t asn_DEF_SetOfChoice_1_tags[] = { static asn_SET_OF_specifics_t asn_SPC_SetOfChoice_1_specs = { sizeof(struct SetOfChoice), offsetof(struct SetOfChoice, _asn_ctx), - 0, /* XER encoding is XMLDelimitedItemList */ + 2, /* XER encoding is XMLValueList */ }; asn_TYPE_descriptor_t asn_DEF_SetOfChoice = { "SetOfChoice", @@ -1658,7 +1658,7 @@ static ber_tlv_tag_t asn_DEF_NamedSetOfChoice_1_tags[] = { static asn_SET_OF_specifics_t asn_SPC_NamedSetOfChoice_1_specs = { sizeof(struct NamedSetOfChoice), offsetof(struct NamedSetOfChoice, _asn_ctx), - 0, /* XER encoding is XMLDelimitedItemList */ + 2, /* XER encoding is XMLValueList */ }; asn_TYPE_descriptor_t asn_DEF_NamedSetOfChoice = { "NamedSetOfChoice", diff --git a/tests/92-circular-loops-OK.asn1.-P b/tests/92-circular-loops-OK.asn1.-P index 4bfcab5c7..a45b9bf13 100644 --- a/tests/92-circular-loops-OK.asn1.-P +++ b/tests/92-circular-loops-OK.asn1.-P @@ -472,7 +472,7 @@ static ber_tlv_tag_t asn_DEF_c_5_tags[] = { static asn_SET_OF_specifics_t asn_SPC_c_5_specs = { sizeof(struct c), offsetof(struct c, _asn_ctx), - 0, /* XER encoding is XMLDelimitedItemList */ + 2, /* XER encoding is XMLValueList */ }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_c_5 = { diff --git a/tests/92-circular-loops-OK.asn1.-Pfindirect-choice b/tests/92-circular-loops-OK.asn1.-Pfindirect-choice index fd06d8267..391ca9113 100644 --- a/tests/92-circular-loops-OK.asn1.-Pfindirect-choice +++ b/tests/92-circular-loops-OK.asn1.-Pfindirect-choice @@ -473,7 +473,7 @@ static ber_tlv_tag_t asn_DEF_c_5_tags[] = { static asn_SET_OF_specifics_t asn_SPC_c_5_specs = { sizeof(struct c), offsetof(struct c, _asn_ctx), - 0, /* XER encoding is XMLDelimitedItemList */ + 2, /* XER encoding is XMLValueList */ }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_c_5 = { From a72bbf14f4e7081c9105086a979cf48c2058a01a Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 13 Nov 2005 09:12:23 +0000 Subject: [PATCH 0994/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@994 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_CHOICE.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index f832812a2..6ab4a0bdb 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -446,8 +446,8 @@ CHOICE_outmost_tag(asn_TYPE_descriptor_t *td, const void *ptr, int tag_mode, ber asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; int present; - assert(tag_mode == 0); - assert(tag == 0); + assert(tag_mode == 0); (void)tag_mode; + assert(tag == 0); (void)tag; /* * Figure out which CHOICE element is encoded. @@ -652,10 +652,10 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); ASN_DEBUG("XER/CHOICE checked [%c%c%c%c] vs [%s], tcv=%d", - ch_size>0?((uint8_t *)buf_ptr)[0]:'?', - ch_size>1?((uint8_t *)buf_ptr)[1]:'?', - ch_size>2?((uint8_t *)buf_ptr)[2]:'?', - ch_size>3?((uint8_t *)buf_ptr)[3]:'?', + ch_size>0?((const uint8_t *)buf_ptr)[0]:'?', + ch_size>1?((const uint8_t *)buf_ptr)[1]:'?', + ch_size>2?((const uint8_t *)buf_ptr)[2]:'?', + ch_size>3?((const uint8_t *)buf_ptr)[3]:'?', xml_tag, tcv); /* Skip the extensions section */ From c47074424bc6dec8dc12ec1dba6a3c730b6ee835 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 13 Nov 2005 09:19:11 +0000 Subject: [PATCH 0995/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@995 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/OBJECT_IDENTIFIER.c | 2 ++ skeletons/RELATIVE-OID.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index cb9ff5756..e815d480b 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -332,6 +332,8 @@ OBJECT_IDENTIFIER_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, er.encoded = OBJECT_IDENTIFIER__dump_body(st, cb, app_key); if(er.encoded < 0) _ASN_ENCODE_FAILED; + er.structure_ptr = 0; + er.failed_type = 0; return er; } diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index 0c9235db2..2b32315eb 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -156,6 +156,8 @@ RELATIVE_OID_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, er.encoded = RELATIVE_OID__dump_body(st, cb, app_key); if(er.encoded < 0) _ASN_ENCODE_FAILED; + er.structure_ptr = 0; + er.failed_type = 0; return er; } From dcb9abb8c62c01c9498b6ac4ad3565d40447384e Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 13 Nov 2005 09:49:05 +0000 Subject: [PATCH 0996/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@996 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/BIT_STRING.c | 2 ++ skeletons/INTEGER.c | 2 ++ skeletons/OCTET_STRING.c | 4 ++++ skeletons/REAL.c | 2 ++ skeletons/tests/check-GeneralizedTime.c | 2 ++ skeletons/tests/check-UTCTime.c | 2 ++ skeletons/xer_encoder.c | 2 ++ 7 files changed, 16 insertions(+) diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index e21594a51..8c83d6896 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -124,6 +124,8 @@ BIT_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); + er.structure_ptr = 0; + er.failed_type = 0; return er; cb_failed: _ASN_ENCODE_FAILED; diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index b47705609..d2a66b5d6 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -430,6 +430,8 @@ INTEGER_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, er.encoded = INTEGER__dump(td, st, cb, app_key, 1); if(er.encoded < 0) _ASN_ENCODE_FAILED; + er.structure_ptr = 0; + er.failed_type = 0; return er; } diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index de53c1dbb..447b2425b 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -639,6 +639,8 @@ OCTET_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, } } + er.structure_ptr = 0; + er.failed_type = 0; return er; cb_failed: _ASN_ENCODE_FAILED; @@ -779,6 +781,8 @@ OCTET_STRING_encode_xer_utf8(asn_TYPE_descriptor_t *td, void *sptr, _ASN_ENCODE_FAILED; er.encoded = encoded_len; + er.structure_ptr = 0; + er.failed_type = 0; return er; } diff --git a/skeletons/REAL.c b/skeletons/REAL.c index 7447aae99..c48015389 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -257,6 +257,8 @@ REAL_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, er.encoded = REAL__dump(d, flags & XER_F_CANONICAL, cb, app_key); if(er.encoded < 0) _ASN_ENCODE_FAILED; + er.structure_ptr = 0; + er.failed_type = 0; return er; } diff --git a/skeletons/tests/check-GeneralizedTime.c b/skeletons/tests/check-GeneralizedTime.c index 245e9408d..9eabb69fa 100644 --- a/skeletons/tests/check-GeneralizedTime.c +++ b/skeletons/tests/check-GeneralizedTime.c @@ -267,6 +267,7 @@ OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_ (void)cb; (void)app_key; + memset(&erval, 0, sizeof(erval)); return erval; } @@ -281,5 +282,6 @@ OCTET_STRING_encode_xer_utf8(asn_TYPE_descriptor_t *td, void *ptr, int ilevel, e (void)cb; (void)app_key; + memset(&erval, 0, sizeof(erval)); return erval; } diff --git a/skeletons/tests/check-UTCTime.c b/skeletons/tests/check-UTCTime.c index 96803ad67..81dde5600 100644 --- a/skeletons/tests/check-UTCTime.c +++ b/skeletons/tests/check-UTCTime.c @@ -74,6 +74,7 @@ OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_ (void)cb; (void)app_key; + memset(&erval, 0, sizeof(erval)); return erval; } @@ -88,5 +89,6 @@ OCTET_STRING_encode_xer_utf8(asn_TYPE_descriptor_t *td, void *ptr, int ilevel, e (void)cb; (void)app_key; + memset(&erval, 0, sizeof(erval)); return erval; } diff --git a/skeletons/xer_encoder.c b/skeletons/xer_encoder.c index 5207d28e3..3ee62cb87 100644 --- a/skeletons/xer_encoder.c +++ b/skeletons/xer_encoder.c @@ -32,6 +32,8 @@ xer_encode(asn_TYPE_descriptor_t *td, void *sptr, er.encoded = 4 + xcan + (2 * mlen) + tmper.encoded; + er.structure_ptr = 0; + er.failed_type = 0; return er; cb_failed: _ASN_ENCODE_FAILED; From 347bcfdfddaa7bb790a5251d3ea24186142e1705 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 21 Nov 2005 09:17:43 +0000 Subject: [PATCH 0997/1469] asn1c-quick.pdf git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@997 59561ff5-6e30-0410-9f3c-9617f08c8826 --- README | 7 ++++--- doc/asn1c-quick.pdf | Bin 0 -> 48142 bytes 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 doc/asn1c-quick.pdf diff --git a/README b/README index be74c6ba7..9dc8a2176 100644 --- a/README +++ b/README @@ -7,7 +7,8 @@ a short installation guide. For the list of asn1c command line options, see `asn1c -h` or `man asn1c`. For more complete documentation on this compiler and on using the -results of compilation phase, please look into asn1c-usage.{pdf,html}. +results of compilation phase, please look into asn1c-quick.pdf and +asn1c-usage.{pdf,html}. If you are building the compiler from the sources, these documents reside in the ./doc directory, otherwise they lie nearby the README file you're reading right now. @@ -17,8 +18,8 @@ Please also read the FAQ file. An excellent book on ASN.1 is written by Olivier Dubuisson: "ASN.1 Communication between heterogeneous systems", ISBN:0-12-6333361-0. -QUICK START -=========== +QUICK START (also check out asn1c-quick.pdf) +============================================ After building [and installing] the compiler (see INSTALL), you may use the asn1c command to compile the ASN.1 specification: diff --git a/doc/asn1c-quick.pdf b/doc/asn1c-quick.pdf new file mode 100644 index 0000000000000000000000000000000000000000..da70a35920006b37a129d9d76eb389e5ee2195c3 GIT binary patch literal 48142 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 TyiGtzC1G9wBcrUE9N_-|-g86n literal 0 HcmV?d00001 From c8b4bc317fb8350d0eecb6b90dc463faa5243e03 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 21 Nov 2005 09:18:18 +0000 Subject: [PATCH 0998/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@998 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-usage.html | 5 ----- doc/asn1c-usage.lyx | 30 +++--------------------------- doc/asn1c-usage.pdf | Bin 131795 -> 131974 bytes 3 files changed, 3 insertions(+), 32 deletions(-) diff --git a/doc/asn1c-usage.html b/doc/asn1c-usage.html index 239e77f44..b6b484b04 100644 --- a/doc/asn1c-usage.html +++ b/doc/asn1c-usage.html @@ -433,11 +433,6 @@

    -fskeletons-copy Copy support files rather than symlink them. --ftypes88 -Pretend to support only ASN.1:1988 embedded types. Certain -reserved words, such as UniversalString and BMPString, become ordinary -type references and may be redefined by the specification. - Output Options Description diff --git a/doc/asn1c-usage.lyx b/doc/asn1c-usage.lyx index 205b9dc87..9dbae7d8d 100644 --- a/doc/asn1c-usage.lyx +++ b/doc/asn1c-usage.lyx @@ -71,7 +71,7 @@ status Open \backslash lhead{This document describes \backslash -href{http://lionet.info/asn1c}{asn1c-0.9.19}} +href{http://lionet.info/asn1c}{asn1c-0.9.20}} \layout Standard \backslash @@ -451,7 +451,7 @@ The following table summarizes the asn1c command line options. \begin_inset Tabular - + @@ -977,7 +977,7 @@ Enable unnamed unions in the definitions of target language's structures. \end_inset - + \begin_inset Text @@ -999,30 +999,6 @@ Copy support files rather than symlink them. \end_inset - - -\begin_inset Text - -\layout Standard - - -\size small --ftypes88 -\end_inset - - -\begin_inset Text - -\layout Standard - - -\size small -Pretend to support only ASN.1:1988 embedded types. - Certain reserved words, such as UniversalString and BMPString, become ordinary - type references and may be redefined by the specification. -\end_inset - - \begin_inset Text diff --git a/doc/asn1c-usage.pdf b/doc/asn1c-usage.pdf index 3d188cff2c46444c3390aae219cad14da6dced2a..de80368956e6d691c2abcc1a555ca61853132e6a 100644 GIT binary patch delta 16108 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 delta 15796 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 U`z2dAU`fQ|;KIVHx@z$M2d=zE+yDRo From 6d9761090df2bf3aac2f1fcaf9570590a570eb7d Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 21 Nov 2005 09:31:30 +0000 Subject: [PATCH 0999/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@999 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-quick.pdf | Bin 48142 -> 48107 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/asn1c-quick.pdf b/doc/asn1c-quick.pdf index da70a35920006b37a129d9d76eb389e5ee2195c3..5d9811820c2c79f185734c644db69cebcc0bbe8b 100644 GIT binary patch delta 39589 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 delta 39715 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
    5|dIjz$*4K1$ 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 Vy>Xrnjvxe@DgsDMOv6AE^k3i;KS%%o From edd9ede80d7d01b808e6442f51d3515c231e1d92 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 21 Nov 2005 12:40:32 +0000 Subject: [PATCH 1000/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1000 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-quick.pdf | Bin 48107 -> 102633 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/asn1c-quick.pdf b/doc/asn1c-quick.pdf index 5d9811820c2c79f185734c644db69cebcc0bbe8b..dead4b49529ecd889666b989ae6ecdca1486e53e 100644 GIT binary patch delta 90277 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 delta 36227 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 E2MWPF_5c6? From e75537906557a93b8b1a23315a940f31e3137118 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 21 Nov 2005 12:57:16 +0000 Subject: [PATCH 1001/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1001 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-quick.pdf | Bin 102633 -> 102513 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/asn1c-quick.pdf b/doc/asn1c-quick.pdf index dead4b49529ecd889666b989ae6ecdca1486e53e..8d270d0232269d8fdbc90204aef0f4a5f35d31c1 100644 GIT binary patch delta 59979 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 UEUmz3K2ae!n4MigLlOM{04X2iQvd(} delta 60081 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 StpGg0Uwat9$S9>O4fub9L*K&y From 0031f3fd03e18aa3493219c140b7558c035da771 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 21 Nov 2005 12:59:27 +0000 Subject: [PATCH 1002/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1002 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-quick.pdf | Bin 102513 -> 102506 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/asn1c-quick.pdf b/doc/asn1c-quick.pdf index 8d270d0232269d8fdbc90204aef0f4a5f35d31c1..2d4db0e58a432e4407e15d7e60fb83fa55e10d4c 100644 GIT binary patch delta 55885 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®#k~8ds1wv6<*?J@(}&4< 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

    sAN?`SvuyvS_i^swIYaP>S9YdkX8f^=YcWN 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 OLl8h=VO5>$!2baTDu=cJ delta 55951 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 From d1537d33b6bbbb745ac67117878b73f0772df4cb Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 21 Nov 2005 13:02:33 +0000 Subject: [PATCH 1003/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1003 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-quick.pdf | Bin 102506 -> 102513 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/asn1c-quick.pdf b/doc/asn1c-quick.pdf index 2d4db0e58a432e4407e15d7e60fb83fa55e10d4c..13e047bb41e1b257c17023e71b50bf732fdd6015 100644 GIT binary patch delta 55617 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%0A&c>$h?219#5wX!Z-=((aKd@8m+HuCkI%& z_V$-&8---kizr>$x6h@Tj1`yDt&DmEF1^~CGrA9!4YvLqU=&ux;UGMCH-913uY5xQ zo#A`=8GX0H&QpiW&)NbPkTr5*Hq()v54Tx9!Dx?_?Ghe!x)jw96PFgyXNG!zgo#`A zyU*1<{B}*f5c+H$}@|n@MT0=BOxG@f8Fq|8@N08C@z* zzNf;n|o?F+tUN(Bt%(4;?BdQiz8Jdg?i78LAtp6O32&B3~G zUg*GOQ4|~jx-H|Z#&W{x3jE_S=ky)p`z>x+6PumQH5}72hvn&=HLn++tyL5~n9>?o zz<9PyhGF!RwU3nGe3#-`>(^#-jdxd+c-U!3lP&j8h69<0ZmsJc64uQQpN?(Z)u}#0 zv)AlRY88eF@kul)T%aLMXw`32pI{q=Mvl#NDw;n=c^&P(1oJ&w^^aPwmVIeavTvKN z$mQ{<<9Xnrgra-LOX{~+OxAF@_`#4F?x5 ziSpXIquowhp4l(8@BIt*mz(TYt8E9*2Q4YSTv`fq#?3V?Rk5$Lt_lyZCz7z!LCD58 z=JvHS-`QJy&Suz;bq~s8PG-`Rq24ij^p+79)I1_ErpaQFiR06G^EAnKMA9yDz1Y63 zA+m+8*`0jPGwxL`P|(4cD?#nK8#2wY;fIzX|2xr>$GCHceC+F=DcszDAW7^J+}4yy zh+EtNXQ6qc5{fZ^G<16>8#|VtGEIib7ZHDLxiEVuBGiU-op%A2>{FPVk#ZFbU=}02 zrkWen^(c0(8nrZV%P^gMCwG4OXwqoraoN6C@?2?+Tife) zW}+tkFDER-U%pLW+`LAP@!ufkD83 zL-1)kCck?s7P zIQ*L&3JgV@#^4|*m|SOO_)QQBfuc|Z!zc>mSr`I@AS6an2*{wwWd0@vgdt$$BJ%GT z9QLykd$4+Mk)Pj3|jM1cOlATZz`x)A6e)PbNdFuB#q zZ+?(>1t$+|CSQa%(G*;EC=d#DnvS0>R8G?if*}46n+VwduJv!Y$ToqeZGxZ#*(eHT zER@XgDQ93Pa@w83$mN<-7z}~#>0l`6VC=h9b0fJCK2*OqdAoc%>aGU>p$HT+Z%H7k)-PR63Him*g0Q~$)TFQX` E0YTMe=>Px# delta 55445 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∨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 Date: Mon, 21 Nov 2005 13:09:36 +0000 Subject: [PATCH 1004/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1004 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-quick.pdf | Bin 102513 -> 102522 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/asn1c-quick.pdf b/doc/asn1c-quick.pdf index 13e047bb41e1b257c17023e71b50bf732fdd6015..4ff3f274c2c954089139fb9b6ed39fb3287189f5 100644 GIT binary patch delta 54710 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 z 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%0Ak4IgJ^?Tp*lVJVC)aZroi`6aZFLq%}G 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

  • mc8u(yK0& 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 b7%y*YPj5d@dj|l85DkR_u3S;p!T|mUciB)l From 7ae07e5e595ddd05ff6940d737c57c90797c5d25 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 21 Nov 2005 13:16:45 +0000 Subject: [PATCH 1005/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1005 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-quick.pdf | Bin 102522 -> 102514 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/asn1c-quick.pdf b/doc/asn1c-quick.pdf index 4ff3f274c2c954089139fb9b6ed39fb3287189f5..32b7e9b6ddfb558fffae1e7ec28357b2de7a52f7 100644 GIT binary patch delta 55700 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 Uwy*>fu8)Ny!Mwb3>Nmmv2N1op5C8xG delta 55729 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 From 2a54bd8846f4062ff2ac8a8575b520e7c4d78066 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 21 Nov 2005 13:24:31 +0000 Subject: [PATCH 1006/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1006 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-quick.pdf | Bin 102514 -> 47901 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/asn1c-quick.pdf b/doc/asn1c-quick.pdf index 32b7e9b6ddfb558fffae1e7ec28357b2de7a52f7..d157437249a90e44d4f3c11f1bcf543f4af90c81 100644 GIT binary patch delta 40804 zcmYhhb8zQD)2|)lm(*rs+qP{x**MwQHoviL+t$Xmxk)y*Z71)2Kj%58-m0mo?wQZj z)ci9&eNErx!{j_c#H#@B&KoVrU-$s@n`+8P;H{rWW@$vV3ELtUl6C2+oEgh8s;QnY z(qZhKG0*3Arz{Ft99X$3>S)94-rc@Y!@o}f|7YCKgfEFa13V}_g7W+@^25K-((+6X zc!C$SUb5UxU9aS)m7H@^(lhF8q^;qk$YD)8DIf)S|AQ%5+hAY?d_E_5JKJjTw0(zf zKvq;xNxs)wml(5dm$;6xkF_nQ(DZrkuoOBU*UIGHaMS1KG$p3shB)mV&d6v6oGz%$ zXV;kZWa-6HL75Ul;Og9(hW#r&dvIHu+0pGW>wjnI>vI-_O2#jcTHM1;2PY~7hU5wu%@ct}hGfjx!d~1) z%)=s}U2~=Dy3^*3c>lnquI9JR7dQP>MIc6V9`V9tPK^i&)JolWTMo>g9};nPSrQB1 zMuFTX8gGu=7w{HBU}TolX~_iHL?U4Vit-i+N2|1$8`vCm zO9nyYz5u`f5~<1aqS<`Z&blk+q)bUl{2Yo4ch{xAIWfalLBlDO;WZw3_Fl+exG}bZrNqw z6`-i$)9OH}r;z3By=xO)7a2kLVLPBX7CLj_U_h_YOJ$lC&)#_%K;GK7GvTqtYFBc) z+p|_0C6;=fw!s97@^NU#UvvRk3Iu@ z^i&Si(+|d#mz_`QQ=|H$-t1gG9E~Ot8B9}J%3QN%n34>3!XUoLrP$gxYgRgul(tb+ zFU=hCK|+HKIP#ey${K{{&Fd%FaExFg4@EpWct4P`Xy~6=u{5tzFh(9I9;pb(fTN~7 zVJ4U^CZ%C-&aI0r4e6RNFZB_)Q0nv0GLv(-;BKT}nMOjscxggIq$Bbn;wGH~B#D~d ztdQtJoKOs*_3DHgVLUZ=k^wnl_~p#b1F=W;DINvvvm?RHnEZ%T<%VV$mXyqg=~h)( z8d3*^@S(|Vt4krx|MSoQNb04=Ph3&V z#2I~;0BzZE^!4Ro7?>)*cjUj-V6kg;9H(v1sh-Wq(FH2JivINgvL7ISGN=t{*@4;X55n^A# z_Lu1{P@IPCM-|})pq$5G@jq<5@hh}yo$15hygKg%6>lNyw;roHbG z6NlkYR;XOc2_P|kqcj>0B^1OllI+fDKT$j{5u}&~7V4SN6?ekH{|JVJW@;TifMQmO z4z2IW&=7yKP*al62NB$Lnc8^`*Yk?6o$76=PrCE36UvJK_Bk0u8{tn|oioAN;xat{ zH1&E2C5p56)*dM`$nGluF z5=~yQ^E>cAU>etdmvyd75bIVy$;NX$mc5@%QVL$0V5>sC8oSEfGAmg&BPpyG#&e4g zO@$Oz8^t;qNeoL-_@Av}Ba6CZv=71s+&Te=gy_s;Gxxzu)l|phtKv@Lz&sB(aPd_difILNO(Rx!af9}kqM;fQpW(dOUt87!Ax%n&lbdwlF5nd6 z7K5@EejcgV(#7*Im6J!nWui*u+xgE_B(P*~AhMIjvYkZyR<8cxl&`=ug6Kc2UY86I z$hpCv|6!c~nf*hUnI^hnNYwo`z7MM%mt{$?F2QE`?8ur!#~3L^JM-HK+)U`zp;ddU zkh4WmEu(sNVMQhedi5$?svd0T!g(VezT zz02^V8OY{qhJhhW;h8O|{1;W0;*WNKL?N^pgw#;KiI4v+o$|VsLZ1K3-NvnOIsFgn z^*^j&N(DI}AFQV^8rG#2$5b>LTyq*t;z@y>A2SU|lBB^Pq)M%Htp+R+tz*Mn%_zq1 zM^@FP2S+2eY1HAe;|)vbp9R(U{<>O_3@30)Jtgsm!@p9Lg#?Fq&?>&4D3DbFR&y>V4!ZC4K8IlX}(km5j=UL=aI!XsEJt%ISbplU|+24t8ET!a;x+t(|%Uydp@z= z9-ZXlbhKkGbcRownFSw~IiG_kVXiqhrI^fTO6ZSC7ucUDirra|a3^3|sfw|G(6?@Y zL?4zYN1V~T#&<&hL`j_3Z-z@CK6OJu`b%2Q59XHo82MFb>ed5~G1g5QmtmAmA zGaIKY?g0^yXZ6YFI+eN~ts2Hd*uv$lkA0$`SVI@q4~TuCGvcuLR5G}pJGE$*}lwpmk5RZ@Z&CSpdoQk%NtlGl+A~;({hYDqg zjF3AG;Ayq1(RT8FFi2x+6)E7^rhUlK_ubNqWGX#_zSvL(Zq2|3+xqGzvR0>*9ZGj- z7^*l{&?r?T61ew0wYOL)9W_CMC3RNL^GoC3%RNKA*-MK=Dc3->k+;w@t{>t*QHs{* zZQ5fqc6p3*QLbP3c{7XQSSHLR$hFpX86Z?P_yS&&b^^nO^2wkG1ro!=qucS zhK_|olhrr;$GKr|T?>1+*6!{mzvn8qbBp06Z*>zx|%JGcg0716UEG| z17vrV5s6b2xOG{$-8x3b-q*tS_Z1GtJiZMgRi77EzhU6ywN~~i?NYAc%vk*U?!fZR zSd+LJGoNW|mYHV(&u4NEfqBaUA0|+hh~ScS!d{T-0;$O-R&j$UY2inWTd)J#zKgpU z^Kqu%Uq`v@kPqT!I%$K^;(9;6tC6bqoNbW`v`gX#6Nzz4o!&Bs0lV|(OTPx`5aA3- zY6M%IaAd&Trj@=dS!qT^1R5R%M!_@LknAiFTOph-i!-bidQA1snSM5teKU;uU2LXkp&1Zt9l4-^}j##6XmmYAuG@>3A6;+}}1jim?Xy z9-b{NJuW@h=`Uh3_T(EF_<288K05csPq*TeM4l*p{q^GGXv$eV!8xtP&Tu^V$aeGF zUaaa8*iJ?68awpE%T< zs7`-BqwGt(*w~dV-^j{mJvk;!s@Qp;BgAMXILlP0e={7@4x;&=uPuW>!`WAe#{tD$ z;zosmgkWJw62_oR+QIvobWtHdz)Zv_YiZ(4q(k&Sdw}$a{&N^pI}>{&D-a87l42!u z(hVLuID49k8@M3Qk(Op3N#aT!SuCbpC>2pC$4_^DsFD3b9hGaW(}X`-p+{@E=G^gAaCLKFrH(#%Av6E;=q{o9+7 zuq7qGaHjkCsv4_7)6Bb4$W}<@A$p!B%2U`6m&pOWuM#i(l-3b?3?oQ z4Y8S*KwH51OOjIG8+=Wp0FTT0ijy!>(Dz*#!hnLz<8*gXw(RTi-$@)?gf2w?*dWo) zch)PcMV(0J`|f?5K_%TS0CoukKUFwmDlo(Vu4W1GPs$cZc?KQLQx7cq7I{G}kK-lx zW!vvZUq!&&7eupn8l%sdEX493&y9W&;QX;Ad=Tm@LW>^E7PaJYd+%;N~p4M^F{wVch( zHBR9zn7DtMpeh+VFMrTvWp4MTS8LNQPt2&&E_XfNEL5m7m~QX(pQc!CX_LcZ%nm&6 z7#X=%;@GMwYE+?Pg$+7#d1t54MBjw-4v;>p z)PkYtB+6AQ?}5OmpA1!RbD87o??r>t`wJ}KJ zod=%vH=pcGut-6UzDz0RS#Wp>{T(dQML7hzq_(Z$yaE2Ga9sWD&5y8i*r#ZLiNgIs zK_O0QKW|{eB1ubjAJA#@TJ!mkR`95puBUvV85mi4PAMSSiO>|+F5Bg2aV*0~Hh|z$ z2v<28g$kZ@AJM@ixzz^*qu=FhLb69UQtiozLzdBJHjT7;GWzo#MXW|t04;9l8)x9m zTadnl5qqWvn-M^Vvq82#d2_?B6D z6J561$TKLBCFLo7JIuNoEva%y_<|;1@?Bs-^8Tg5K6aluGKQ0vwF+2lt05h7>k3dZ z2YII|N66w*o}*pO zlDZX!&DPK&8@76!_XGzq9nz;lVe`K6I#e-NfFtD=q49_M>T?=6z-W_a(`ofprdWDi zgA~pZG=gbqx{}epl|OYCxaha;Co=tL@Frty9E33#g_g&aPzcrnVB1_nlJa*;c!4P~ zCKCuvY>Vm6g?2ce<3#)x+Vf za)cAHGL8bJt#GJoXl6e@iQ+I#yrK5Z}9Fb&g5q1 z3b0#i&G5hKe4(L`AJ%QpKXvEE4!tmj^5{xTF2%UyBwo^DUdH&rrkEIwn%fx~NQh1P>K27d*7$RaJXiT(@6s=dUJe-`&+a!dl7QW6YbmQ&!MS zf4e!B`kM`NSBHX}L4Z z*A0HusY$AJ1JTjlSiO(h^!u5Pj$_?O7rS7L{P_rep%DCz!UymfAWo4eaQ7d0o?RY3t}A+0)%|vDb?)BggO6yB)|BGRlcH$COYn z+1prPLWoa5=`neNB9s94r1{ObW8nzd zBLY>J5*4>K1L_k#|H}mQC~VZC;IhLw?2$dQjZKhQ30Fk4L2@D@oM!yYftA@HX%&>v z!8i8v4crIbisvtrBDHWj*dpbp2q8WB*`o;nk!{@fR7`{rAeaB$`ZeR;e{Y$2qqlac zwoF@TS@{rJdKXDSmz(^!y?E%`=%|&()K&+;4Dyu$Jb_pNqoe+#z6b8sZL`t?`da_? z#b8Ea5UIeac5t!UVC|NrcZ79wG4dJuvjWY$nx%7pHr{(>lLUJXDE)3?qgV|`2rvVF zzP`@#t%0VE4YVt_J$n+S_>}ATUroA?h(p)X23=>$;OH<`#Bxk1+S}@tI!D4{`lmf?7+c?-+N(_h;DbuOl=x8XBH8^UaVw(iDf4PZ5T@b-n0R0Tuol*=pmaa1TT9FKLMap0;D2}dMV!zS&qKVS{i-kbh`f-ygx0VH>_aOKkzuJ z#TV1vcEo%5Mb@i4SdHAi5vEmCBtE=E(!S^~pR!TZ%mvz`=fM%`7visqM%|jG$-&{8 zz~F44eoNGH8z|j0GUHpTJZdNnMeXp=dBmE?tAI(;OP_=;wl0qdodsTmS1v3f+gI$B z0;qqvqnTthrS$!CbjI7GI7+HxyB|NG4?ZiE;44jx$GLSw98zP2h-FKZBoM_U2&@7p zm?xSFTGzZu>AQj*uPY?&#pS(lkh$RBHYVgQ$bwxxf-!`~s|mDmA-UA6Fnz84n}lH$ z;zAV9FvJt-!RU4ncMV|UZ8-B?Z=DJ^v98P~oU@%jORh~K81IKk4D2R|?i(W}lz6kh9^}@}X1;WA-;Wb-Ev)SRHHIFmoPSTYYyv(1<}JnRIBdUz&0?Mo zCsNP3=AJbA&TZOeMt8zC=xSmWwoh-8e4gWrB=%EO%zCl6LSxfXK^WkMEvOmx|q z_aQRj?C-F%s4BLa`(v{*eaOkK9g6?m@*ed6`%?*RE>+KE*03fcWWeJIeECobhASET zhpEk{dtZ^!XAB^LoT?cNEAHNpUu?mM#VfxY!2zE`QLtDn&(@P$XHHR3a}6_}El=HO z#}Gzo;v5cSmZzVHD(}f%fH@^#Mg#on58`AF)FBE|rG- zwO~evm?7AhR8?U9bb1hihS#DjC-#EWkJaFMLrH99tpdDJ9aN4yNw18tS(Q)31bEGd zFCA8m?%n-;ejxR_-@E^mInp?^$4JTDOzwTQx$K0`=}w!g_$9*WqpN{K!cWC(>-=sY zu(F-exC|5^XsGW);YPs7-Hukq)%~!mxzhj6E&iTupHX6aqm+*|z-WZz?}7@0lJB_K zRa#Gh3GMH>}HMqqSRZ46(QNuz9p9Y1x zRAXmjN={QI=@_eQo$|}jCehb!*(@_zQrJO1$fIw_Mkf+UhMh{3I0%(Z7VXnnAal^* zx?8>iq9C%xdB!tv&d{5ji6rZh^){a!36mnWlcqbyJ8Pt8VlbJ=I;ygMQlPxtF)^_L zd@K?=dzSmZMYi<>&x$n-*os%k_oLi`YNg-OTr59pB!=)>pu-Ibj1GnWDN_4fqgfyL zGLK=hSwLT;9=(n=i9y!Y zV#8;xop=4Zx@NTgIM0;s^{F!VrpBNJY_HqZCGY)s5~O;!6Cn+ew>>XP81Xnq0BO>T z&J&)V=QI2B7+#48oc%Dr#&_9}Pku9FQ4&8p$4^{bb-Rb$ZBCL0%wj2oxj#Z~%#`Ek zN45(HB?B}jgc}G`2y=b`4}DE+$?)ZhbNnV4XQXnm(ZYHBR84uuHr!9^KOUO_J$<5k zCPhpih4?BqsXXJ4DZ<903ypTVXY`&NgPm{baDp#^TI?SIpJXBQ_^ z!~e1VC*l7urTDMG#>B$;|0uwJamRlL`S_9|Z;8?pLcxE*NJ(pmi%F+lhJx#%viu*; z@&DrnoUM9c;CbNxR|OFPPJ+zxztlv-(!|BWnTUlmjXeTf5`u**DFGW5?SIjSoT;6; zi^YHF2Nx43OPak4I0>-i?fF}6sr#Gzc}puXWBh_u+HAX(tjUBF!Gt1M93niN&gkb) zs=#u%^5iFCbs6w|m7ma#)Fhxkkv6s@ONH}xcYk56Y?lg4BW*M9?&oEgH$DW8r-Cp4 z^lop*IXpSf@*g|*oO8Rwkq29h>xq%A;-*fut5>5^797b3e|G@8PlsD|*X^!I#1GOU z!LS$`Z#Cr37p<|BVloBY_d1+4x=PQ(IJ^_RM8!uh1Fz0Uk3Vp4c|~wIin{HHY1nEC zAx$~-9d;8B-M{X!C3z>xl>FXHb?nlU?w}P=7s8Ln3(1|Yy3{vG_!Oj6p(nPoj_ESK zGwjAysp8BJb?gDH7G3S~7uE^Rg09`=^`mXC3Uv=rDnIh7%F2%to5dl~c@TSfMTO!p%67_y6G80ms1DmzA3q9u0Cyx(XuQ#0^_wwQwngKH&E%)%U0+a@Hij7+#{ZH>QGK zyKn*b&9xeD8X&dk4ay~_odfu5$dD3YEfF&0k7N`J?LZkb-wM0*aq$XoI@O)1yWv~} zpLwHJaVoG!j>&lWvg3Tp@+va1QIr&wE7Y$+0m;Z8DEh%)Hc zTUayccUT~7+v9#t&Jg8elb|@f7BLqS>hhK}PYTAN+M8@a;#c$+iqtIXg$Sjdi2h)c zsSAO(44p(TY)HhO)dF=7X>!6KRUNVQ35{h~y{e{vA_i@Ho&bq%R9Oq0ya|g|Nwd^& z9}xG=++#$GK0*^q6H2SAd5_`9+f7K%s7g*P+7ZdeV5eLQZRS45FLd3B2sEOVPbcLL z$=UaBs|2fKS@UQ?U0@{Yh_Q3+Qf1Mb*}|#}BT`2-s(G08Hv1n0riKgCqpw4Ma z|AM5AT|5(>Iz_(YPn@Vs2EpS>({zP)10pApp59Fw^3PvZp>>UWjfE@ucUR;|PiMcp z01hrL%Z>x3see@tSLmW=-6~W!FEcA|$%iwUOWYDIo( zI;Oc)4vMH|U%K#kHHwZvp4#X${;qyn()O1i|)#leSd8UT!SheT_D}#+fU39W6 zO^kU|1(u9%{uuvaHH$uh!==01Pkn5lv{XLUGXTn5d#6=Waqq)Fd{*p$*J;=z{ZVKf z^6R4y>jICqtdm^%85vav3<8yTNvL6ZSe^8yELREr}xq3qs#~$=16u8 zn$V_N6`qlIYKey2L@i@>9f^_}=E)o8(EaXi!lx&kOAv*3(0sDu1qkt!la(L)*K8`r z-k2BFs7}e)er=hLsdObkQ|z-z&!#5z%IX#pE`mD!Pgl(&u~MBpQM-r+RXj*vz*Dni z!BYDVImk4^>7F7*pBy`~iAV0P{=+;-S$r~C`;T^2zE#*b^SmWmogR&p*Q7^{zMA!L z>Nf2oO-K)wR`CKx9(U1v`O-Mauc8m%sB&7A>d0G+ZX&uOf*NHY>f4h?hoqP8*TU@_ zX3FZFN|G{Z3R+Sl%B=-9Et)Kea@9n&DN!2)NK;Tr%8=a#+2-|Oz$wd;pTC6R`9s(~ zk?gguasfrTgus>w?(Y?+brc%RQaeGn^v_9kikecXfbI>6G^r&Kl#Z!1@f)->KB+QvnQD#wvXTQ>D^0h|uE;Xdx6!T6GWS!v zFSladto~QCTC*nZPTj$#S1I}szXy5?-Sgdl@7T@&%)bX-LavHmi}^K+8zX7Do6r{f ztNYlyA$>!?&>n-53h#>55olCPHuMN1XF)amd$*q ze&Moz-6I0*KCD?=Le`d`Zs9Ek!r|?r*Uu0=;#~Fef^+B9{8=SkF|@)f)3}DR=6^a? zjW|+T36gg-H85!!749l!+YVht$1g&035x*a7{7d?Z$v?U-6*CrDro+QS+^K}H$U<(J7(_Vg< znECbQmtbveRTrGJl?&SOQ+&BsNT1Fns*I%yP+Y$$I7c(A@$dI;j2EbJY5!B1E4$VFrTj?o`p>fINIYzfEM$UB;cJF(=^6A;GSw4>>1}D5);4l^ z-wwe3^7av!756NlLxBq&?Ejsvk1fG~269rB#Y!$X-ws1W{jFy^W40EO5%?3mGg3P3 zxM^>zc$WOkyRap>oO&LWrj1`eucfeS;dkj#rBX>{A;~n^(rK(dYS!<@_SxKVQOJ^H zTF6{mERCVB*8WHfQadRAFBy+0xB&}NeJH@7z(A&i>EZDa`%R5b`FWZM|1a#rh!ob*O+yYY*^^6jp}XR8b{hlz$%WI`0tUW937Vah^^pt9smAilQ<0JvFjF zZ59AWVL*1|C=QcoSDdT)Z*lt?zDajznh9kb?RPUGR)yiA8PR!NG`erW+lJxE-G2&z z5(tvel0;I|q2p)5H_O|Y-HO^&bSpHm-~Eh&H1{6TGRPG@O9#*pa3d>deygD5FkCc* zkn4rigr7_%E&W@Oo4xHJ5REIylXWYKnDk*XZWJVK`UX`fxt9Krp%b!A%AmEBa zN(%Bc1tTax^7HXnFRe|w-e~>eotyGt33_IAt{Oitn4&SoxLTthlk z(k*pubWJxbHugOJzNlHH83SkJ*6ufQhZ&$vr(^Ikp(%0gh6`6kwfB;CNj^a9kDwP5 z=+PRqKDc~XGD(kX%u9=;hJkG(llX+W>Jp)r8Bvhi17j?zkG4B|BOwUJ%-L z)};D0^``BY5&PBQ+TA>2hyeV^>eNYkn07i_uS=W#{Cd9Q&Z{#qnYyfvTV9#_VU^Fr zGdpQh)gA=70GbQN_!^J4F;381Kg96f`?autwZ#4R2X%phl>8aR>FC#HLfT(O>0vMT z3iZYeAF&FAU%Ybc`uOwfEGahktlb%lzL-y4b&SqkvqYS|xuAASzg7U!uVg}VC+Hq` zi_9#%p?-s@dvJa4Ycx+lFilQ}unsWzIAPcL)7!i5nr*|2pS^sWuK3P zf1YIgyF5%g>e@Q0S_E-dj*m)X1cK~ms_*!rsRvsfn($}!Y0X5B0!M*MHYVch1~bD? zMN)BTzN06iUm|e!OMxO8A7b!iswoamD)5Ju)YbE;G0Np9p)IbKKrE>Ru)(UkRPIG zKLY#(uLPdq)p>*T(*_A$Cd_$!`-P~`;5_e1NH7vi$IwERU(quhbZ3HDHQEl8`$}zZ zP%V=la4gAm8WBcI%u3DHFxD~3da|@lI|U!b&LR#}w}3R8O?KF`C-27|IkrT&OqrM= zE;+?c?Z0ZDt%m$15sa+-{Yh7!C9qjG>@6J*@@;mWk9Ti53@JTh`RWKMJ;fr((zHfm zb?kr7@G2-6cwxNWL(9*)pia|x!Hfrg2A77aNtQpMRAl6j1RmUAkcH($CGp9nfp8p; zv0JP7#DM42wAVeJnu^`$)`_x1QI~_&mdE`_$eH3%!n%ek^a2p;Q}4>kV*OpaUmfGc z!>fqGD`UwI>jpvbGL>?rj=p{BR-~-&AQv)gh90L%pR2*ygGDEE+V*MykKGS+~hLW*OAMTQ7;-^jGB{c1nJ$Bp!H=h@+KRMvH$8IK zr(61i$DyH`HK|1S?Ct)m#I;$m zjs67mGEf_^uB+@Ii&ps5;Vij_C1Zj8?-V57jko%)YiQ7iYm)v3qbPkIV2SE-USD6g z+}h`EoP=guear5NuHZUie-_E>4Jt0v-#oFsTa`E?sp*kwEY+T0L#tR`;))Rm+RX-q zoShl5`oP-z94sw}#&i8*L70E0XuLykbz+JmGW0KQK&7b#_7a&c!J#`S3{A8uo_r^s z&}4|nN?YS)E>@3i9hF1q=1D|J6wa&3rDvh#roYt7qjMvoD`ZC{zv$5s$#9xuUDmF+ zR#r|ypm_|mc*S}On3jkZp`HbR_qWR`oBE#U2cj|F!PsUz=@bEBZq3|Ncxi6o=U)Fp zKDUJ;7HS8DUQGMQmdQr>7S*PzPh9@exm1>VnH+Q2(ZleMm;gjA=wPQ-7#Va#`c3-Y z&z0UW`}xYR-i5#ac>(Y{9jtEF;UQB@e%{5M*l?j@tPu-(D#)Ie<*D!h|K2P3(gh7N z^y9y+P{^Aa2Q4w-7ageSj`ekv;{+~{V9hJdBBRu!hSe+83)fW5Sf$*WdZg%syJhH= zPaxLd=3yncr=PHrUc2L8>%kBRzCF*cyMM@SY1TtdrFrtCAuzw)$;R0NHl6f(-~-L? z#I-BYxj#G=w%@J;ng9S0W*M(Iq)nwK)I5Y-AP#@&A`|>r%yXNxHx*%+e50TugljsE+~0;;89laK5xT@AC!B5=XgesjIu@Uzo4royAB zYlSfS*DDV0IxPfvhxPd&J1M2hm!#*^hxK;7M_(^nj#^}|Mdn=NFQ+li={!!Lzt1*0 zuU(~U7W?*HFJJZ|fG4(m>nDQCqd+u8E1Vv3pT~2OJTBiY=)s1y5bxhUlHf-CAK5_54 z+LL<^l@BA$<&-lc3yl!;y=Al-J#H05m(O7MG{VDAc-&1S?`x3}0^9sfOa_CdS&& zW$-a;+Y5Nzm_6_17j}4~{ZNr+(>$l4zV$txNI_!M`#QMyp6y|M>Jc&}(gPNfBNgQT zNyL3WJ!;G_G_>XVIGnFD#7+Ln^(*80iH+H6c6OD`>etb41RV941Lw!yeHSey`L}HC z%<-)H|?XCf<+$nh>2{$cB!Q$5njheHcVaY_`+GupM97o zEABEkYA_HY4L=d1?gxb{kq36mb*NGWS4V7Hob4U6Y_mQhG#3aEp!s2V7@$N&1x)T1 zegj0y3gjbaq7pi}Fl9!c?hc=y>Ta0}?&5aM_7ZlL_T7#-epR=Ip9K31zG=5*Z+V9@ zh3(C=M6cZvIZ_=H$=$1RDi6hU0yA$Y%ixm(9)QE06=OIgZ$PTgZ07#^W@NnoO3@1M%edqw)RQYsJXePvf5(6fbD;#1zkN`G)K%7#R zq94-;cNb~0ZccaTI4T&zu$NC-A^bn#cAy%HN78QqKf;Stpf_)!wO->w!4dtbGPHV} z0!G{Fu>uJT4zVaxzEuPnr`ZsW;!=_aunq# zKh-rShej|-3Sbpk;@nf$69L{%J3&a8C&h+)aNO2^8X>Od(lyujp<>T=mO{DUyJfKv z<8|H6@TxA+8}!*I`&QHy5k8czu0nz=4AI_z85X5G zfc@RHoY>j4*i-Yb+(WHl`Yrx!G%}|$r+`rMSrZAP_u!P{Y(mfUPlpTg{K%xyUIZ$K z6)qKz^-Zp04jf?1h4D?1!^DxDZ{u(}uB?sbt>CIn+T|u9 zvdeFM2W}k1LIwS&KGqWVBJJu|+i#7MG1zwN{5Y2btKj3`#eyLZ0Mo*!REk9%5%Er$ zWKVSR9q$I}kc>!jzIa4eu20Mzb25yyzfTasrC5N_xLh%7f&l2tH#2=)xEMB}QaXKT zZY9KA?4~_QEs=N!n#K=g^1Muabkq}S7fc~=-ib%k8!ct6|!d)bQ;#D2OcG*GSiSmCtW z$Yoyl!-3cMqcv@Nqeke+%W>6dzaQ}VyyY#V$?BE;0r)+3YzWr+CKe@UG^5-~1PMo> zSLK4%s-P~__L15K(k4erTMVz+f`pcq|qNhLOjAEx%RJaUAs8zZ2LyL z_I>aX^t8gUzI(&EA4fTJZv37BY@B*a#+r?)oT^RdU}w?h?p1lmkjR3-5}GUi*{FB*YRd9=yP&h5Z_YGvDbcQY32QH zYZZ5RXIjPRB5D*?-D`F~XAG7*|3;F=KDg{W2I6@-BfShjB1zl$-=xD}bnx7ToiL-IZ! zAd2WIiPk~`2>YmfKOF5^@El2L<_F_UVi1{k7y}{b*l8oFEqK7^0xqPXAs%+lkC`2` zDLcp4=`4fBsTDH~YxnU=#QyQ5!<%JQranp{xfwg*BL0uJ-hKNG^sc}0@3m`*zx~sy z@*P;x`Rg-`)v<9V^ChI{h(ry#YXjsXoi zeGF6DaXd0MYC@YtRB`@W$>pp>br7Hb8tllej6Fp5o-y5`F@(=xW+jzS!6k-^gH6)C zIl+QXjJ{(}O{n17cz1`UX6`v6T&!IDSTjatnZbq8iDdkTsexxK|Mzs1ZE534rx7LUJp? zwd7p+=_>RGXWueGafco`nJ?df-VkM;?iBrO-tjE?(O?-!qv$c<$ z-7NFohv$H+|NKAW*M=3%PXSa(=x2QfwxFAF_eB%|Y(~O;z5Qgp2s)RYMaV0A#eAU%s!rXIYfu0w8@zQPT=mHK zMr`ay4Rfyu6&+ku`wKw#(Krkj!0)`!0Ed6*C?l&dmxY>~^6K9&9Dk63Vh2K|ZYbQgaQJCufocyoH-h}^; zt9J~pEb7{JlXOQrso1uSj%}xtj&0lAvC*+@+qP|I$F_O;eZS{9=d1H)RL!b6=lZc~ z)f)GhmKmG}`WNwsFm99ay zY!7BUiGo@`ZPW^QQGF;;U31w2Ygu=6SIMV7W>c)<;MBx0@x^X@3^$y0PnK{Q-K`kj z1i+7RolYr^5JM_@Sb!}mBMD<`2+!!x3hpnIW3poPuLagj+gR#sz`iFzCtl7sMIE|i z>vQAL5bs}3T3S~(3~ghWQ7@Ygt!)a`>P-gzyc_u89cxhfODp{`8WdOi$DIZB><2-* z9{q1kU+NYa<#G$v<|WF1l-XF(Sx*V}3GNr3N?f*vZSRHNg@9Q?QI^N(VsgqdX+92f z9@j(70w$`!zHB56Yp>7fDlNThnl8@U&zZwjt~)S%M-DPP3RL zXoKRsM+`L^4#aoP54eK+jc(aJ{M9nhY!eEf8tzOnUt$n>0kMTA>IqYZ<479F9F3(6 zkSbvu6{fhSxlt8x#O_Sdr|=zxgIiB4@FZ)(9vFbKJAm)UbBCXR?2Efq{2{a&i0$}DUy0oHu8(_@qMXgAiRE!%9i00%<4 z7~$jfnf3s}Gg9PHr*z9)1rie_G2IL;u^76mFM*iP)jPE*w_7MTTlBjfKihaxjB(&9 z+#IV(J>c7_d;|7JZt(g&S&=rv?ZJdZ=?9{SO~C`+AWS_n=>(+%+X2OJYc8~yHo>?r zvOB%KK#xKFl-DnTTJ74YKLMg6tn}_z&5~@%?%g)>G$@xYoHgGwJf@r4*A0wPvL9p7 zS(uBtlo&AT^j=r${LRFROdrWS%mY4wdeW|yd@^Q71SCea4Fz=(7Lp|-mqCLs1P@cs zwK3P=3DL8$=fq9d{@SnnZ@eK-a@vGkNSOz}fsJ-z@1~7*Lhl%o@m0BXIk`K^C(mea ze8IjQTwAApx`1D5=pL|_?{nRR|H5|k6N6;+kJ=28UWT7R___QX9jtz$^ZM4PM!pV;E61;;cONnoBc`QNa-zaw;T{hN&rRQtQR|IWq-+NcF`oCw}dCNJx2vkxZ% zd%3K&XB82B?xd>uXy zLzhKzupKh4?<({T$#a?iXHqi-W zF0<68G+p1V?7sJ2{6oAjAz6k6%`duv5jRXdbqpLX52;7*%UkyYqGSmgzcVTkQs=`f z8t7f(4Rwy&@t0XT_@;c4P6I#ZwaakBc+;%N?)|16gS?P_-FM9kQML*mTIP;7cB8lt z!n`MeHGoa$4+XX}EC#iuKriQ6E)ondgyfk)Xxk!R;X?U2qHrAzocvZmo)6gv;!pWt z+lM(wrU-VsvOPbbcP2;1G>3Sj$bk0}OT-X!en8B?mjwTSy^V1;;bma#KGI?}X{iy$n zlr8Kp>+RuW8r72VDB0gLZ8x5)Cy%X;{n>x(HjrJ;=G`rUceQptBJkM=Y@$aE=fks~ zE&8tW9uR&@Wkf=Ft3Rgj5}EY-*N6ArANim{;gCfw4_Vh2TS)1zmij@3=`TB*V51(~ z+ofyb&$6i<8lGu>Aqv|FAxPT~%Fa2v-d{>o1z3`bxy?8_mJBtT6TR`f@zF+rV~B z^IDUTJ$8HVoUy4v)Rsp~(WpXhpG(3{u1hx(JS!%E_G4Y zDUXrPmMq?;1`3;@hwhg>aaggIz0~?o{}niiZ5Q$7&Rzz3wg&DZ67U?si9#SNP!aXe zUc=^X5k3Te_nj1hHyco%kW1-Kn}CI+)Miw?!oa;$i^s`0bVLgRDrRS(yT`8`9y-ZW zX+A<33tG5$t%&bmryL)wV}8CSQSqf9 z-0m1Lnh*fWDyI;mHqAOor%U!XKhkOv<_qHm`rS?#&q4Gae=xZDW>UpZF)t#wE_I*G zi9I#}J!ijW@`JQ214!2k=PCbHX?7$cO%w@!K~Er8c(NgU+-877)PbpeIMlK@^@91o zlR~87;t$HDt_v>{isaBvEryIOw6h&kGr|gt?gZR7a9AF8LVo98`Gz<#*nj||?ZOCg zozsW%mn%S(6^U<&#Pz1j^_BXevyp?0Cko%$>1LA$=mh2WV$4%$4qu!15MBn$Pc3!& zatL6}_U%x17%)-1aQ!Lc7oXF0k$d47U#))yks6j0d0UWy*}A-Myv>2x+OJtv2rEPs zTtmuP7>HF}M$;Kmgd8{K;&m@(2tqBEsOnhon)q(1Yh*wdIL8kkCt={1cm)6OP znlE#P^GWihiNa`xwTq;1C_zigRs$x|KG8@}3H&=T*;bxWxu&OKe3QHF!l^n^zLZ

    -fD8;!nf9`Ma;rSs1LUOB0eE9qR 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 z z^cO8^)UUdGCQAbJ+sfmIFPxdc{xwxvbb9iiif->ZIv z9iVl{?>2lQ5;WBr1pUaM?en+%ck(<6Ok6zWWye8V)Hr@(ce>EaVNioJgMOR6l!8q{ zd~6esqFy^L7Fm@M;<1Y4Yf6olo6|nzrDmakP}^r44mty`#`HZwP~->V@v0hKhexAh zz!fIZuLI)qF5m6)BA+4E7?O9qWIdn$6~KkLYW2IA?~oP{5##HMc;H{gCtW$B@+iEGk?ZP>%|jF#S>d71Hawb z%7_{ZqvsMJXC%`lS+M-q;yO0^_ej&^e5K?`T>VgC*$r`*MZ098i8@1g<@C_PkL7RZ zZSn+2R*%(Qn01AlZ&pe)HwPhx^79#Fr1LO5CJF6mS`#vhfkb}7ZW0tpis!7B3~N+v z#kx3N5wnOY%th?ck=a+pLtVcGfRH^dt06TzpI~Zp+Gg*YPu9-)j_eIbL$m4{Nwy$E zv$Wa`N3AsKRdJU4uu2Drb5DR4bO-Z-bWTDM`kTIBQW4EV+8uKr=jcZr{(bWd=;oV; zUsLQ4FT{;#zxdxi)UrBAHL2iC?sf|60DwqRN$Ajz5Kn1ahw zh!%~mlI{j`$dh7O9v|Jde(Bd z{pUu0hKggXWOniQ7Zmrx9jiyI5hVWw#|D^HIm38K(~5UO1&!`h6{>h^|A|+Tv?I?r zCO?KT%=rUHg(mJu;G>ZWM3uOLXKhq{TIX?Y5weRu5*X-^T~Dr67g8Sb;u2grPiwW zXd#9exH4NEi(gafdC{)N<87<@d{Sk(DmRWkmbbPN)8ggWPybB#YQRw<$bfB@d{$r0 zhP%Herd{MrD;2DQ{zmIf1y59%5|1g5h<_Y4ffm^OX~)kKlSd!?o6!d1sp3O3sZ9bz zk?p*n#KX-eI~)#xs6wH`=^wn@lgwdvHE1^Pz}WfE#O%-2s2gazKz_cbqNBJEh_2?i zu}D>w!rXXi=FC6%>UfPbr898T`DD`V53&kCOjjP*`9tFABsP|?*+ zV$U$=XB>;8diy6q^06sgp*un_gZAR@=s=xfio^C$CaRV|3EQHQb4fl(n9& zKCnBlD+dNdbqn!z9|aR@PMa&J$f>eoS*Xpu-uuH@{G}e_#a8vv95io~-l%^6)BY&y z*4%{9xu^|bJHG_~gp#_u-+O7Oxwn|S%M+Y*#Bu(;6Kw2QCZK6+8sdXbBA25|`;_$JUq~-b(ylM;UUru=kSYzJ zc#%J6^2jESsd=0|mF>mNvh>#yMn$zOzjyIoGO|pp zt|9``>i#jB>!QpqR%bF*I4CJv#p1KuMDS+w0GH>VEk*aGqt<_;SH()4@d{NRC-n_} zz)Y|A`;?BkM~JSTrWeRt#i=%6S0+m;iAG`)qwnu_NI;?qm84HTxEgqZI{P5zPOQoU z^R_J*PvyjgdP_nsY-eLEWsAm3a2m5+?<|3Z$~ZisDyGL&2Pn4UP8#7p}1m`%e6Si~+%_t^9M7&U%%j`oN-#_-o#4ppA2{mt}P?;4ds zm-||OLVCG>-tvhj^}=LNVkrR7=7&s-(}WmNF_5HaI1api2n)<+C4yvdxJgY=og=u6 z>m~M?4IA0aoy1L;wO0rnDCMX%o4661XrjbqU9<7uFb{O8Ud)LWO%6ude-_Go=AW$B z6~~i{u~j8ErZmv3m}gi=+eUk)Z)>eLo{$AgNaHJ= z*gkR(T^Bz0c5vOb-qo)<@4vTUBf2FGk+c@q8ToZgPkXraC@t_XZdg;=Zp)@zK!SYa z+98>_AXlz!oRPTsXq$wu&QH8bciwdF%xAe?vRooSDp1H-$V< z@#e8gb(}bn9jZW&o(JXyCd8rBQ_kSwz*y$<@srq`;EP*75enQ2xMd(GL_6#v5SaFubU;gPr`a*25);P#PG)|N#GM|Xs`-ZK#zY@s=_UfCu!$`iR2F3w`O#JVj1jM84LkSU69e|-gGM7%tNafZ1S z=n|!-M^cd0t9uHkL1$@Q7UwQHp5a~k0`YY$Xjwq;1$l+3eQTcL<%7Xo}=?z8x83=!fr#7SWx0m6k^QgKchk}D*c7$>&=1xyO6G(G-w5h__wg1fR z!w&t9YBiIMb1doB5Lr}aN|z5I>nWoLuDPv|er>>)XcwC7I93+fkj7Kd`1Ie^?tpH* z+LseK2ogQ14CrcapC_#N4boWM>Cwegis3^uvhZW-Kh;u(ciSlGHAMIU#-m55V>F?G z?_dC--EhPA3X6UXv=lU0coi@jSXFQ1=c!|g+b~A)`Uc|`Q54FQ)S`JWF13C@9Q}8e z3A1qWl%WN2H5T+wNFRB*9{Ls1{j;<|WX1}5rBkX)QAfR zy}O>*$VdZp@aMss;2~Ks-dKWsoqhr-=+Ba>Y?}^1dm-hHn_tXhEgw!+gf0A|Wc*xd zaGa(A(y|opC*{sHYJK@X*SjMCD;CC?FUt&pHoi`6$^&NwEl*I?yhoJz3)k%*|PMv;e z((X-M&dGv{TlvSuA4y`n9;3zOPom{4H|TEQ(;P3zAW<1aVlv&=6Vn*e5Yr4q?T9ZA zjXeHxizsrfnI~)=n|1IZEu||4<><-Jo#c+=CeArHAx$SzlnVmK7c8CYD}BnP{tRBU z&-04h!ykczx8Iq>t%3pKV8g~^oS_g0g$;X?mp%W@oR!Yb(}?EF^_MJ{Lm+AV$@{v3 zH(Sb~JEhC%;L)a_TARts^5o!@=TIN$?~toM{G0wMN3d9`t%Ia*@L8a~h6=atw4RwI z)t)qax7RBmtx}Z2q{3llO1(Pl)6d1lwLmj1_F}Qi=Bo$xJm=TW2|F8|x3&h7(t5$}4XW*K;S!GC38u zbJQps&TM_{e|($fa3a=lbuI3wGBX;MB)`hAW(~M>P?jr-KK9~A&y-dZ*{O;n zrR2uQkB2t`^A3|HWd^a$(xjMA`9!N9)R*t(ZP}(%X8|s#m)ZS{O@f}D9v;E1{w1eS9l|6CPBVRa zbNWHOX(Cc00{f%M_Uee&1MJz(QJ(zGf2mNm80aKMtVG1=3Oh$|rJ1a3v<(Ilui>`06;hFegq!o@pIJF7fJEkdulU!+Q5x8%^QlKd)n;ijYy? zNv@Ou5B2MTS+|nm$)hc1Zl=c4!lp)lasR_fQ-SJO?dxdM;C^}hu1H!+`}=Ggd1Cop z5pafFR;aH!GuGxeWJ^8GZZ2>p@8*<9h{!1o`jH#_rwz57DE51bwD7i3Ywl~eAlU@0 zSfH=nzpeWa7mm4 z7^w+z;KiMe4LmzYIMSCvfjQEvMe33y%RrhYKM@xN*RXfh^U9uELdL`+8G!s)ed_USC4&s4$ggkonIQ>_)of0TT&8;Sy05Boo`E17%>18GyK8Dv^7D43uFN zv<2+hV~|St{-Q#dEea4{bK5wkM40N|S5x>|HN)}d>T+Ry0fFa|XLA~4l*6}uBVIu# zt+{ofDY1EaZoBm4oU@A3;Kd8(bunqeu2Rb(RiaX=*fz0G-8{$8NrN_q8D5i`jq`LB z(^@Z2Zlw=llN8X@QAoe*Xw^;|2?XpFNk_=fB({w2i#mpa@S|!Ag?49sp^HzX4msFv z#;Z1*nH33xKS#MlUJbb&4huD`XL=A&J`B8P2tKCtu;A37Z+mIc&VeK6Ad+gk*51pQ zmKTnF8yvKk2j-V#vUV1Zkvi-h;$rInh&s0D^luAI%O|oK;8v^F+NM+v#ABK&I_L;DzhWN7 zgn^}nmsyddgaI`DHgh|1+HfE|4WVJE9|)Z{OOGwDiJARF_`C6p@gI4sa!Y8OLsiJi zJ8yGq8*1*88mVpuU?I1zNEv-q(5{4sQB+$|5Wg4obdxUK=ULXR`=23w87jeE(;LJ{ z+$xd8Qo6M$dG!hU{koXM;I4^p;3o3y;GEovrAT9uRI^;GTwB2tyik!+0(*j1wlNNg z8N&wVbUaaopJEqZUvtF$%z10`$IandMnl~t11s0naEYET@LU$i&`B%%_kQ135 zZ6ZAc z>bc{;F@3IqXNgDNw&Be1Kt?*f(9^%aOog*&IX*XlZGuVZ7ahm-m&Vf<4i7))Z^Zlz zqYCeLB@|9}MzV64vq=2KaL-DnkT^YSrtCo`NgS%w)ae#2t#w6|!L?21+Cj;VGyBI< z8sTkLjg6z_fBxp*N~--bagwEKU?oj7ET?;DlC)F?$W%h+?-||ti1{zTCQM?`}Q z8<9mRc^+mwI&XB|uQv@DH!!&^og%1vV&kmt@)Pj=In6s!O5px1;5B+mD&ar5t(GF& z+nLM&$Q!NWtXof$={4IbKgEY8b*MJ15Ij2J^#`LX7BAea`X1JBs&g3_<>{3+D^EJk zI_$3S%A`G$B8h8^FJf4uZB{JbeP_`CHcOptWZ%XR zg0W}&trm0l^puifey0dCnSji*Ty?adVZDC_DmtX2FFEqv%r2I?Z>_#!!CCAOTL%~* zsBQA0$VyypSeINO?Tt{i^wvLk>(=qS(*x_$EQ@@$(V|WbdbPqWD$2gpslCo)JAL4H zdg@!Qg+clO4vSTx=jshp6E6bDx0o-^w+iH(t&sKI5{`cHy55utnT#K9!S$F z*q39$E|wWmUxrynue8(#w=ys4%=KPHG2#<=Zto(` zEOVB!hzL=x+9KIq?_YSNWCVv(qQm4f8Xt8(>?W5DyYK?O4kC;6akw=V6RF{z@urMz zKn*AqG9rdl;L3MLpzlxGFZbSLE!5upc^X$xgGE9DbVvcce^e;{`Lt!MT7v_2ju|#? z7b>+4e8^Yr4bH;fg2gX_Hss#BBzclBD-f`3Jg_sPukE&8UhUGb94DX7FefX|oF~=R zv(k0jLRdqbp;&d>ax8t5=|E;G_*Hu@r*p)|bz@%4$3aKuw$Kz235|3I$t|L+T3M^R za>X-gm6oDCxNZ>PR^U6KYUe=O#RZGTbk{Ie$1e>&ZA@%$H$r*k-$~u@b>dL(o8k@L z1b&FRLR>{s*tKvBW{vf~-@zGx==p^nqz_qSCI*@WD$py`#Q1R1^FSr)Iivj;u9^!w zcSrfyFM$RYwvH_OGR3k2hT-r0b^u{wG*0;ElD4(nd6L98rNYHl!Nkg>wg2r**JW{OM#7bGIOqCw0xFJLHIUpGnkn=TvE8&COOub zKZ~gFE6TQ=VS@QyvCIHf`3T&1-X~9Z1GH|v9WmO!HGn&3hqZ|Kxb%{#EPhvjzx}gq z=cTe!kE;hH?Sz^}>aq?Yj-0GJq1(?zT!bL%k2zE+6F%UT{QKTeiU2zky4Au#_5oxG z4YKQ0m@v3@N?X67n=Lcn4!lIxh#P|QzHjf5+aHF*SpI)D6vV)^$zGzQXsn?#Y3ZJbR4AMvV8_mmD{5WZn`ViWfQRVyn5Fxrj0i6FKZR#pAko zMdNVZGnP5#UJn4>wJh6-TfhJD4r2ii^t*`GiBTp5f)FJ!IS(9(oRVR4a{+WpH4@y^ zW>xM=&}#TnML=27)p6FF^YPw4lp(IyZF@7R8@(l=K)|1jodFj@(D=H4SE$$QZMr%^ zx4V(a_}r5`oIP!hW>u4u49zOX_hMZ=igokaX}dMUz64OL(>wK4OUEPBsf!SljjGx! z^h*NB+f+dkNMlO)6kuB=LTl1vp?FSLFidgZ$SC7Ts)-I`eWA*Pc1SjJ#d+d-m6)Nn zaf4oayI;fnaV6Yw^Wq_-AYAa=#UXN5rG8u|5N~vWxD4|pq{W1xYsCLnD4J1Q>PRWC zd}L>5`vRsEXo`5;zQ?;5P%ptC&K3W>zbN16ndL-f#ruM6z?Nh%#Cx=tW<8#c)>pH= zE-3C5s@~94_djk{!uc!$pG)!#Ofp8Nf|E}AyV6fH zruYZdhGezETKavvr-PIjzMZT3J?t2(m|md2`T*&=UBhfKi5D}M5dt+_$2{l^YRQz8 zNG>yIWVbT5l$u8RX5Ec@*YRdD56cKV5n0KwAIR$z%6FNcS>fzH86N4r>CXmN22aLU z#u}QIq*O6R=}frk{~luhxjw?%q`5r0S~;!b>0mI0w;Oj7w1s}0Tah%xFE3Ik*`%kb41@L zcciC;uqZ`gVZX?v*ePkuyCOe+Ldr5x9RQ@I;IuxJK~iM&m&NQQzBeuaSqj7O4+3e zlcAjGZ&Jj>f%W)ChoLe%^-Ru|9@2b0a89m!TZ_g3r+i*hv%L6|rGOfl`@BK55ZDoN z``jkczU04IYx-v<`>*U=UFn`-voQGj*Kt)fG)bAAtH;})6uqw3D+QirJf1j#({Drd zgD6LxF&(j4vdLhR8C&r7X5>&zU4f-;-z|QK|81G?e_j-78?o8a2e}a(S}fq_p_&{j zp5hTM1ZP^)WVv6par1=L=+M;8ah+^Zi-!8n#8m6XsKK^cz__;v4qw_ie~YaYL5&Q5SnFq)+(1 zlI?8KH`Km_+|Gi~`pzrNvLD#=ggtvL7*BJ`uKkHbZ!kxG)0(MPAb??7h5UFj4kAgC z&paxNaZJz-RbKo8avwJ!n=?q0E9{DN5wTIQ5p-UL7_&`BRH&1ykLH0c@0St$7@X=$ ze9s8&IqCYxq_MiEpYglbKgNJ@&?JQR@RVVa4ql-M&q@E`6v+)C&DXY2hC8lcL*YB?Nz8M#!u^$gtQWHxlJAGlNE%Ev53j8U*}zU(D5Z?xIv z?quIz!zAoTsS7(TenkD!{(PR9gu=!iPK)H%Uy7P$Fk~m#GX;NEb;UKO8@Tu@9Ia$< z1|?Q|?I13u7pfz8%ryY%ACiLk{CCIB;2%@;osp?dPaotP2uRIhm8b?wrBbR%KGguz zK$%MqZ*x+zgR~^yl4$)%GJF6{Z8uU<7^7PRef-9>KJb#wG-uGdK~3hH_;)sb4+5Wn zFj*&ayx!FL9H}^wsjql}vq6kQSk2tM%($CUKt6Wo%zWkE4r6^%qwhRG(s!Cm81caa zk*#pwmM>b50BnsW3V0)I9)dS(xohpdv+LuIuuIhfD$_wSti*D0bl<8%M(CC)y$P<6 z%Q8`wuxi1-M4olHnBIZcI7m)`?eBuhzZj zTKiN;Yx?6km;11^S(0Ag#^K2!n4|`-t*;?4B>AnpQO6m2P1M9#8>6KwpDtKB7Pg_U ztaKu!;=mA%!+XU(v|Mj0CGL1_eUa{$8zhDw!0<_7Rnc|O+Xf}-K-z5^Yf&9;Ch~ew6b-jTm|`gL-}neNVt4rgb{26bs^Kc zzAG1@cH)DTsfsO?xniB@5Jr(kGpQM(vxMdZT8GtPiT|}T$auM$FrNV}!gX$f7G;zB zszMSH&?D3GE3+c|+o=hi%6oO;c?V5hAy@+ee2v;wUB@P2k*dL~!~E(DTG1%vzQRNA z#04TYjLAvC2$gBb@n34^sOMN3n0%cUbgO*}5BG3cvZw)Xaqz1?QmjtC(uYqMMXQFHJhLbqoNtNuxd8< z6T!R3{T~K2Ptf0sKa*xK0|g}FO{@Yg)ZM63YAnJ!(XCx*u8t@kEIj@I7!qWgcrKcO z8&nILJ6JMgihHU8o+(RoDJMhHSdzCB9dysdCFeV{G0EnFmcxEv~1x zv#*Zoq~ry8QjZnxpgB&Ojf7l-zdx^YQ0sFKP~CkHeBpFu6pY|sUX2fdB0a;~&J(*> z&uLMk-ex0)={Kbz0-K;Y?ItMYNr3}V8`AG(!?7UuiQp!pJd7L80;0p_uk)`HV-!E7 z$>6FMHQv6*840uUQ3~v5iejg9x3Lve8?y5{S8h3`D&uHtc)mg&<0ZT08vZgK3r<_E z>V4H|M~fBhrsp@+4l@x_5U{b z#o5Dm_L}r<(H32@L|GmTwC5AB25~eX){u(=dn5|>N-T&r!WHstH~f-^$7}%K#|8b^ zzrpjZjVt;JLYQn%9NXq(su($5UM2Ro?7`r*8iSF=$Dkbab%hWKnKv8YL{{c6znAg2 zR%||U`Td|OD!VV72ng3+`u_BonO1_-r*7OkMRr90OpOUg>iDZau6!D@|EOFN6Lz}k z{T2|Dff_xfiD8{xv5|=0@Oj)eg9_UuaC|kCkt~Wljx7HDYiO^F``xnIC-Um7sXd#g z0$J()Qct;K(_!3^A*L*_q{pH~MR2Q6$Iy4KrIrsEAc*oa9g(?F!4 zqDl{KOahW*5+TDsXCj`NgZwJ{aiaCrO@T;EYyHVj@MODl{ojPsVY0CBYnUJjqsaz3 z+2B4t_Sd)16~@yS?idqQ>l+0%XWt4)U8I~zW8MbC^_F14{!kpiRvaM)?o0i|_yCuc z;1e4;I1$}TX-b$G{Rahk*K3Mnv!AmIO14Qz!1niC7r5j8Yw0cJShJIlabSIdgkl%$ zK96D-%03T~l&k-cZ-A#l{zgLSBk2j=o^uJLr_@qo(w;{mf!MRse?L-*ZbFWD{VSy3 z&b|vSL7q6(IRRLbg~$z65}&E0G`pNB2EHewRi&*kPGo)?ETx|?*_8d2QKHK{#%zWh zJfw-nhQq46AWKDF?V7|~U9y$L9%rGe>&v{0n?V1(3Z1p;t~YmGUtrV>e(ivN2S#+P;pC`mkjAe4 zpxwo;^=LmZ}RslWU2BE?)k7T<5a5#-?Q* z`~`dq9^hR)Hw6Q)*os`rT*Ux|kCZFh^1~jCjDF9Bh+;&2#sIHe^nxdKknk=tW}L2X zag#qcQ!ug$g>9t7p6Wa;`e1{VQ zrIH!hsvr9(tu7={^!2I-RS zmXhv}xapSeE&-8l5a|vn6_9R`?uKuC-tT$eSDtUJf7WoXn?3uSz3=P9IpgbbJ%f2J zPYZDs`v#@XbyCBsJZ)gLO6mY{RrQ5V0`e&z5oz9*LH^+3x9mZzb-D^;VMw-q}(t49iv zY(GzpF!CGG2EDCPnL$x>Sg$+(y#TEfMHM$kU%^yDU={-8bR+qX92Qb?=bf%RoOV8CBaIRG&s;A}Ax8GP$jCHN2d(CTOm=oQY1Db%X-`P9^}fKffvp z0kNBS#?dNQy7Zr+D9xEN%5=;x>bzyCimSwrY1-iP_ytu~cNI}DZ{Q+73912}hhhi| zX)2OIHysIgx(ncm{x5HWPd;4^80N;_m>1bMTy4DimK`OaDRt@Klf{wrgn!S!$xE$p zkg+e%r{HHr7Drq^3yz5)?$#0D?q_Y#+FD6mVZg~|)kPkj12^zg8EB5dNG=wyN4Z## zt1nR}oPGG~wVu2{uMXjn8ndGkVbq~8TW3_N*ko|c7f1iF1y!2nNAJmStpldf)qF{w zc3GG=aK?)?gr(2P*Se?%k__eyjrnp8n`m}?xr|yD8&YjQLHrt#!g(SMpf^0xv?3gH zK4ZwE^C!tGXl3!ncbkQki;E9WQEZ!T-5(s=V|z@+%zidX2U=$#XNp+68VgNy$IX`r z-6e`(B}Y_3PDGd)1FjZV%x>bypAOs z-+=04>c*ky(pTSB-li}902pYk2Cj3eD{{5fYUzH=qfflVyhqZ zAaVXI=T`FoVbt(Ix^~IJ%USBPkrNw&lPXpH{yP|SMY#{ zWbxo+owd`2&~nHxc>Q$cSa1f@)O(zkLA)5VBpFu|7Xw!eN7ql@X9{dPkhW)99aYZy z)t**{Do#Dk^Ed!Pa_fHI@^qksGlsk}Zrj!k97wPvwMQvK2-q4XZC6(gGm#!NeV?5k z4i|Z5;N=#ykCWmvJV-&qtc{Si=dVBG|20DLsYkg!?V`j#Fa5}-bwX>Fd(X%-w?@(I z%lYJ&(Ly_4kV{FQPw6adiGl`t9T?&LADhkEuoHkXXZ36Rg{eT=3WSp6V@S>&}tp zEZ+?f#yfp22>o0kYpMnbpR3E}TGYhO*d+Fh16Yw=Ne!5ZNfCbai5q)Moj+fhK;?B) zTS2pWomaL7MJu;F({qoO$-VRJC>O^N36<>$tJ_h&#HDB&7yWCshi*G-Je@L?TIYK4 z`i#chUaH;Ij*niS;&XWLjO?Mkz`@9wH+<=3(Gt&*nwKGVSLF4WA7fsND3lPP>${<;CbR>5<FGjl;`D*Q9SQ3+ zj{)1hk(MVLPz?<6yz!$q{yjK5KGW~crZLs1Mbh|v_8jWRgQYPwE=2eLtpnvy$8oHeYn#soW5a;KPpDq&Vx1l;@Q{N+nK)8sCD;u z?#=YI1D6RML#$0<$LkV{$#%B5UpGX#2uo3RoQ|ft$-8&EY!IAd8%GZf(rgoLWw>bj zyW*F^#*8-blQn8Jzq2F`m=3rTek9amCSn>U@@(N!Zz}E7urFL`GLP0Q<5%LA#s5Y= zepTSyDEHx$^n9VfYjyo2vUv_!*i-Osg-ivnDgdk6;@b>b{b(gM{rJ+c=U6WHkYz$< zg7VC=x>XgYk0r_+)kqcNNQOXfBo)LHPEehZ$$=O*7%z}*$Z^uN{0iE%(XKe^&Tg5G znU=Grx&5Vwbt@;~`*r9RlxTBnE`7sRyK>7NmYNC1V7*{|vA@{T6m$ELd26?%TDU4A z5D+7l?vCC!LVd%C-$z((U5ZQ&K-fT<@cj`4|NDU@BxsQSsS$-n)KdcMTn%T4KW8)O zMk2;f!1wZ<XSDy>&mtQa@Ux~(0(P{ zKw4044-IJFHL8W9Rr-47bYFG$Yk)?g0stR=Z5MsuAS40h>88njtQ*-SD&Hq^w#sY0 z`YKKV3n&XH7+f*VfE>j6wCG{Si4^5(7PlKK_eiU2=aEvV*|qpzc2#2@QY|-QcHi)* zDnk4<^9WXeY53`8mSum&E~gC5~IMh(ADf za3l03hmV8}w@;wbFU$0yTT@w+%!*yKN0&?AZU6KpEr8|oYxneN)mm$ z=%yj*xuu&_54NQiSLOn@D^SL*#X;s(gWlm+;9%WL)GOpI#Q()^;#D#*(PzQC%bD>u zUOLjcn|g)t0894(B#`N995pn?23o#FFS~}=tcxC?Hau`+d!kr8hqXfBs@5$na%Ks8 zmHmzCKs^LAbBKNbx390g{*|y;aCt8=tH5%}b=)Q6S$)Loo5SOX!`x0_bnXXeA3gIfvl zB4?y-(8ja__iz+nu(p?)4$lux&$edPKeX5t^KuD#|NU@%V(;vDMo+ZVPc@plSU9vx zv?)Elm<}=6A_1sItHx}KkMW-U`FbXQ)wQaug^}j{ zA}w-;nddO3RXQwC$@6z0n3!&D#(%|l-tA$c*M`*^{^I*%Ts5S94s-IJy>!0dbh!ez=oc}S3w{~}L9qcpgHKeZ+irAP;pa76gK{4eAj#`$vJS&rmt(4xZW z90sx76Pc!^HJ*OY>1tZd>_MLidd50AR9O4E@I$vQM@NJx!}Dw9eI7H12o3ByS_K=t zAzX(!ZSb&u0pbl;BTJh~_s1$gYm3@MW4&Ox=&2=Ngz_-EGZO}7KUuM9ZK^;rGnYRU zpWR&+&)E(1m5l>l9(UrzfK6837T%Vdv}%)E{Dl7E)-M-IWiID1r@-H{MfYQO)ly3a z<>gulhj*MnY zZ3mxKUNi4dI(90u`6Y9C5{$~5|D<*p8{h~Ul2mORls?SKCubXn&&DCxQYAit=B}OT zb56n&BWPDF6fDfIw&xzR3A2W9Xqb{VksKABiWxpP7yjTyvsutGoob!0Yd3-y4uT-o z-+t;U&Rr{fNS(e*YFPsuXLA-$L8?-}X)XSWlu|7jobQ$)I?(GY2&|CWBesBJV_6aF zExrY7nWT41(Kkx5i_tU3ze~x&6R()$@#|`TSFFmZTB%wz-mkj$)tiwWEI>_grY&(a zEM>lR_bzk)yi=9Ec=h(CTT<8=hbJ;*9S-w4P{mZQ(Sbx8b7T7S4$VZsy6XV zf<)@E!+fSgW}U&g{nWT$n` z`0D7lyf-sYySjy>dSyEusF$e>ReqAuOcsMEDYAs5V@&yH@M!h2EDBxULd&MCJM7ZPE(j%^5%Nz((PY}~C3LniJ*2FDNtH}!<@Rcn^fuuJ zMr9ZKWIOz^a%Z3)S|H9EPKomk35K#LfBsf^&gsAJVi!G6k>T$sD8S6St9zT!!d zQ30^xfX7J3L%l;-H@+|JB0Px}A$(9?b;H%;rpMS*#x7!s-Xp9s*Y3;I=T27k zbVxykNL`9JaShy9?sbSYOM2&lR+iNqn;}j^W)W);;WlIY%ajSBQXq9!ND{lY`3t6; zVFjgZzd;N1GX5q02~!Zm>PQ~>NwxxFO9^;<8TazFhupjVuF>xV+1M2$)Ge$tDK`?) zrFrO?e0U0k!?xSk*`w=0^Dd_-^QFxZwOgxS))8LE_30I&4)fu= z4LpKK5^QoW@f6u60de^%$$eO(7RG#n7ut7=S7j5{y6az9GmHy1rKhU6nIdY71F8To zu`^kNry2Q9t#xFJZ`?}b*T{ZMSyVG-w41M1Yo;&;)C_i2mNxBAsU;-hsF&?`w6g>d{+&xMCI+V13bp>X_3^?$?L-VeeSr_K3Z-rOU(l#z=E;qKNB< zA!{HW?Uky-Cb3-|*_zo`2rtzpq@*3N95n1gZPw}3DAHwW8Q_*z4du0usJ$vm`j9T5 z^ywgwGkCY#czLh0}i{dhb zHS2x49yrLPOA9vWyv+MNam+#xmXXC{(6m!bBiX(2gp4ebFQKN6my*?)f8yH^K%;l_ zdTEAOl(+=(4sR}(i#CAPzayYSeYy0AIA7}VyT}D2)#@&tP)_yle*P|?2mP<_UEuFV ziCiZ%b$GQ;8;>XIff7thts+lHXKcnbHnxjFzufQ}*zLKBv@*%Jzv+hBegtb3$`yYr zFAidxruadaT%03%T3`HW3!=Wu53E2soyL=2MMh>lX89p}O;U&XE&ZH+Oyg-zm9;NH zX(^9YUy%!=bC=`__ZyRl+8He?j!mjvy6TA##d(wMX?AC->Tsg*I=xg+Uvr$XHxHK@ z9yFqO80UKp?K0QdWIeW!nc!3y-^IG>AYz`Cd2-VdQg%%DpEVHW-)RqEziE|!Cqsa+ z!;qBL|6;U;L6B=8`B+U$7Ib-01$Bwoa7&4oe=TPIdl>}#JCA}E6%71e?9H&>Sq^?z z`CshKFixaQ@ptlqScKIvDvUE0Y%TG>m3vx~;=+D2^8Sa$7si34@nvTGt0qOzf0(Ob z|3{hx7(CYLsQ|FFx~fDV`b&{OG9*VN8c#I&t$HnmS64`8=ubo~=d@kgkD3{b3?3t) z+8Wj(0*etAjTxu~hoj`D#-vK)bW3OJl#*H1`vHj{wC@ei%AEwk`eH%V)1mZZH@7nb zL00sIg$}!jTRz@(kK5by+uLFKY=0a-URhTNGFjpn1O$u)2^~C%gTK;!+y3OnyIBg; z^U06&NY+fmtqY^BJMNE(EOK6l9sJ1d%m#<(*2ISob-cEY#y$Xiumdb%nnWS+1u}w6PQx?6mGyECpD=)J$q05nj9yvDP_+z^ZW(euXjmon)Dhd(0XqzQs zqqcaDXd3w=S z6zoGhGPJ3Om-}Jz;}&$C#t%_O8u%6#Vm+dT<#B_Jl}pa%tNMQ-l#!Q z{WuDUv}b5}zMfzDMOHN`QUm&&*DbYpLuNWX%Q;YP!h}WGMY2j2j`9+D{&?m|qFixv zMJ1jN3Y|=hOtHce=pNI_qLPD!<6BC1Xu6DuLX-?0etE>N7vUvqC*;~`e(`igXuaMv zW@oaGHK_d1@0m~#@YP|;AB=A5ySyplR+gX#ibeXR)Q`F^#*a3R2aYrXZj?1#Fh%-y z-ktXGte}_g`Ei1SF#R50gX3LNACW7xH9nWjO{dVHwW{U3SyG3G!#)-9b-6Wb;#uy~MB(d=~9k-oUa;y5UU& z%=&KlI>~U$ec(yD>Y!E9o&rhO+tx!Rq`&u?HN-vYeiQ!o%*drNuE{*uM6L7djToow zbs0T2CFVI-0NhNMLs?W4P)aN`ke4j5nXrJV5KOW88eRxC==nLli-LG~cN}wK)?=Vd zEP%$IN#tgUNqIjTz8BYYkFxwh?0Y6nAR|TyEm@J~XLg&QHf9eK|Gk<=_Q`ocY^EzM z@y8R6vMWtbYiGY%*Y+tZLjm5{Ay-13>ry=q$BWDq>cd@Dm6thY#A)Wi4asOhr>{;G z6l+$GYlxJxmirQmK&&8IW^JK-3U9(nW?nOW3buw7FG3kbi=*I~y@Dhe1r!MiJS7 zWidR?7WQp!Av5EJuOqLd(FBR@1WtBgQB8afX$bGl7H&) z>;+qk6wt{3>?1j;UVi+n>DqyC39?`t19= zucP)&DNWa9rqo!iXIvc%fL zn1M@&q@;_UQGQ!U4vedeCrYGb2b)Ogf7LDDLIiKP1@l%pH8Cu4hJ2qSypNt|oa&g9 zH9jhV0*x^tW%7=dd6YP!*2-Xef;Op(Q7uG3i_+g=N3m}bV|?*hjm~e}{o9*9F{#)(=LY{fI$ zX%G<7&GR8TJYq=NReWdEhUGfhUm5Xg(08_~e9|(^PQ^c`*84cOb@zTdL3V_dlKwQo zB&>@#*LUjh3oZKdZTYv^R%QV2nAYJERA5ymB|JVvV&axjI~wd7N^njQ39 zQb_gPGB@Zn9#~3`Z*%o1A0uHhqTxLrNkrEj1Mxu`!H61pkXr}8&Q18BbP@5Rl#EIJ zL_VBDGb>$5<@+R#kOsRT=@H6%zaqcOQ_^)iE}`5ghWBh-%`Rqt2z4f?uET6p7}=iu z3<_MEl&}IT))A2i&-<|n4WV%kDoNomv>x?&e|;q#0=(r*zPCQyWu#MZ->ms+VTzy-;Te?8Ew!>-MPE1~Y4Bj2a z7L5*1IXp|_ZCyr)t+kQhLqU}J);2!Zk8-GNO9!?0oF2{*K*w`s5B$Lcn|7h#wTB&T zLt{xsv;gbyAEiDlBVbM%1RW*wm*l_wY%Y7q_u_1t$2TMEQBvG3EC}mOMBDPq5Xbxi zt0A9{RLH!XUJFq($%B&yx`}C579Pt2TxfgZy>x4h$5$P~pFbY+5sHA@p41P;p?SWr z#s>gT#;-2oeo!pk^qb^QBs)oOWlzW0xDuk8hTT-Smq@!bhIPw(7!CO758jhP(Sud$ zDSmxUC4?{VM$zgfOm@zao>O5j{4nJBRqu-m0!7qtx#H=g9llGMEbN*k-NLcpk_v)L zo@mq)ufV661Qs$pBRG!Lj3dQwvU4tTbTEK19E-J~(h>c~Eq~eXOD0X-MT<2B;&>G25j&hUWt$9%I!OcQ@tcJ} zNZ|09_34&+=%;xb`4DDRmnX_9`cez(Gil!SA?GX1Lmm(}vh2nW(ZL_+^2BJue3Hz? zTBF4ddSCyf5w_)QqfPO5HzLDs#+$sxJU4bEuzmditH6KzT-SNU-&)rwmCT>hwwknZ zG^F}8FJaYP@s(yU;aHn~BhKcFrO%VefIzd0nc41slY2o>ajCYcY3V@GJmu~)w(wWv z6jnBre7x+<@;mw=Y-eh6=w8pFDD*UGKQwh{V{pHL zN(1*8In@w~BCqkBJ_-0icsG}8`ry~`Z4&+NM~?)?W1P=%YIbkHS#P@Pk8zvp%-6LYznWlEqAfeJ_c2!Aw_L4%DS$yxZm7KAkpp2}|TOxfF3zc!m#)OiV1IBIS`Gy3sn+Mm@d zH0HV0W->4D*cS?nWgT-5YhKwh-9=Fq8zsNb@6}63dCc~~wtS=dx zzJ#M%9hD5--l~Bu;A-TUR@*t=-R9q1<@Hsvg5UIc8S~n@x?d?%#;|+baUChHga1RE z4&KiGm*ts?XLC&7doK;6*oa3!l?jX2tyQ9^=pnMhPtIz)Yn<*|K1IJ=e>-oXCb;o?+#i8r*QP(FD?S6Kl4ac0P1hVcelAyT*gC0E@l(R zF~gd?j&hu5(#{a?_I9&2&rUvOO2BuB>CLt8U3}PKBiwSI=?)Y|ZC|>WfEBe*dbZez z{2Z2uev)P3v$ZA{^KoW64_hi=qSvdQsGcbMnr0)w^v$za`OG}`z87D`8^}q5_}vw{ zGuD&HFSotlrU3CoeY}I?piKM~Qqbsn!@X1YE8<&YYGx0GEgYgwAZBR{`c+V(@ zZP{YGqkNc1R=F?g0krh#`Cpg5_F>%ec`EO%n;WGv7%QD_gze_dD?veX+3RKRO->io zYfvdj!4UQ{cfX5sWA|2?DqfbG3eFLX%CcYj1l=^vpCs+cgOW9l=J)F$L24WlzKTQU z2h_LNnebSB76KyJ-@7x&%^CQ=0~5bDXP9EESyVCP)TQJ#q+@Ydb@2a+3j7h7Kva3N zW}^J9Ll36Gh5flf1N*%}LlNr?WN7$e*W7{F#MljvLg{j2B-cs1&4y~ znr8=dLjN=m1|!R||Ld`V|Fjr87)cX&r$TllKL04p0p+@j1(XB&JKXh$Gf)UJedrz8 zzcl_!4?y0-AaLm2*7}`$6mh38I|m$m7cHdhA4ZUd|A7orhPeB1NT;E|T@R5x0&&*} zlmiC63o8_f;9aLVkvpY#kwMD-*=3Qj#Q(MNpRULWfw12-3}fd4-*pfvgWNR&gMfbz z^53t2_Zj4Ph5S-$I2Kyay{G&po>>urp9HZ=aJ0Tp-1-}b5f*rwi zw;v%OU@#oGV+4Wp`fj@;An<=Q2?E(K?>dN-!SAAl;DjLVqJ`k(`1bhW3 z!d(C8{Rjlo#k)=;5O;?xa!O;rI};#faAacKf1~PXZ}28Iyz&15aCRy-MH?GODku`S z-(g-!YZDu)-yr_=j|i0(6)ysA0{uObk$;9TE)F9Y%!mtuKyVnt;RYNCs3AY-|F1%& gLxqeLJ2)EHJG$B%n}CoGAvice81(d_uf#zA1B!0 Date: Mon, 21 Nov 2005 13:29:39 +0000 Subject: [PATCH 1007/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1007 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-quick.pdf | Bin 47901 -> 48916 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/asn1c-quick.pdf b/doc/asn1c-quick.pdf index d157437249a90e44d4f3c11f1bcf543f4af90c81..69137b53b8441bf713f7a2b2189ef98a44ca3e24 100644 GIT binary patch delta 40702 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 Wx1XntEdT<8!6g8^yb4;1fd2;o3=pRP delta 39978 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 E0PSpjG5`Po From e7881a5b751b9e443fdc989d19fb1c3fcd5c59ef Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 21 Nov 2005 13:40:22 +0000 Subject: [PATCH 1008/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1008 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-quick.pdf | Bin 48916 -> 48921 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/asn1c-quick.pdf b/doc/asn1c-quick.pdf index 69137b53b8441bf713f7a2b2189ef98a44ca3e24..1f349850e5d5282813ded92204bac5fc0f961b28 100644 GIT binary patch delta 39522 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 delta 39399 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 XcTXR8Ya0M@O~b_jyu9+73V{CsXo;H# From 6270d54ff0b738a6503bb639570ce98ad7955e6f Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 22 Nov 2005 04:06:48 +0000 Subject: [PATCH 1009/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1009 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-quick.pdf | Bin 48921 -> 102940 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/asn1c-quick.pdf b/doc/asn1c-quick.pdf index 1f349850e5d5282813ded92204bac5fc0f961b28..4b17caca79b4f7d282d884d3e44516bda760b32d 100644 GIT binary patch delta 95149 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 Date: Sat, 26 Nov 2005 11:21:55 +0000 Subject: [PATCH 1010/1469] upgrade git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1010 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_expr.h | 3 +- libasn1parser/asn1p_y.c | 531 ++++++++++++++++++------------------- libasn1parser/asn1p_y.y | 7 +- libasn1parser/asn1parser.c | 16 -- libasn1parser/asn1parser.h | 10 +- 5 files changed, 271 insertions(+), 296 deletions(-) diff --git a/libasn1parser/asn1p_expr.h b/libasn1parser/asn1p_expr.h index 42a2a1169..c44e10328 100644 --- a/libasn1parser/asn1p_expr.h +++ b/libasn1parser/asn1p_expr.h @@ -176,7 +176,7 @@ typedef struct asn1p_expr_s { enum asn1p_expr_marker_e { EM_NOMARK, EM_INDIRECT = 0x01, /* 00001 Represent as pointer */ - EM_OMITABLE = 0x03, /* 00011 May be absent in encoding */ + EM_OMITABLE = 0x02, /* 00010 May be absent in encoding */ EM_OPTIONAL = 0x07, /* 00111 Optional member */ EM_DEFAULT = 0x0F, /* 01111 default_value */ EM_UNRECURSE = 0x10, /* 10000 Use safe naming */ @@ -225,6 +225,7 @@ typedef struct asn1p_expr_s { */ int _anonymous_type; /* This type is unnamed */ int _type_unique_index; /* A per top-level-type unique index */ + int _type_referenced; /* This type is referenced from another place */ /* * Opaque data may be attached to this structure, diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index 419cae45b..058a7c849 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -386,31 +386,31 @@ static const short yyrline[] = { 0, 320, 326, 332, 348, 373, 375, 378, 382, 387, 394, 402, 407, 411, 420, 422, 430, 434, 442, 446, 449, 452, 456, 476, 478, 486, 490, 522, 526, 535, 542, - 555, 562, 564, 576, 589, 600, 605, 611, 617, 619, - 622, 633, 639, 645, 652, 658, 666, 670, 673, 680, - 686, 692, 699, 705, 714, 716, 725, 733, 747, 759, - 765, 781, 790, 800, 810, 815, 822, 829, 839, 845, - 851, 855, 878, 880, 882, 888, 894, 902, 908, 915, - 920, 926, 932, 938, 941, 947, 957, 959, 962, 970, - 976, 985, 991, 1008, 1010, 1015, 1019, 1024, 1029, 1035, - 1039, 1050, 1059, 1068, 1079, 1101, 1108, 1127, 1131, 1137, - 1143, 1149, 1159, 1169, 1175, 1189, 1213, 1220, 1234, 1243, - 1253, 1263, 1273, 1281, 1302, 1311, 1320, 1321, 1323, 1330, - 1342, 1352, 1360, 1360, 1365, 1370, 1375, 1380, 1384, 1388, - 1391, 1394, 1399, 1411, 1428, 1433, 1438, 1471, 1481, 1495, - 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, - 1507, 1508, 1514, 1516, 1517, 1520, 1527, 1539, 1541, 1545, - 1549, 1550, 1551, 1552, 1553, 1557, 1558, 1559, 1560, 1564, - 1565, 1572, 1572, 1573, 1573, 1574, 1576, 1578, 1583, 1587, - 1596, 1600, 1605, 1609, 1615, 1625, 1629, 1632, 1635, 1638, - 1643, 1652, 1660, 1666, 1672, 1679, 1687, 1695, 1704, 1707, - 1710, 1711, 1721, 1723, 1724, 1725, 1728, 1732, 1737, 1743, - 1748, 1751, 1754, 1767, 1781, 1785, 1790, 1794, 1799, 1806, - 1819, 1821, 1824, 1828, 1831, 1836, 1840, 1848, 1863, 1869, - 1876, 1889, 1901, 1916, 1920, 1937, 1942, 1945, 1950, 1972, - 1977, 1982, 1988, 1994, 2002, 2010, 2018, 2025, 2035, 2040, - 2070, 2072, 2075, 2082, 2088, 2090, 2091, 2092, 2095, 2097, - 2098, 2101, 2106, 2113, 2120, 2122, 2127 + 555, 562, 564, 576, 588, 599, 604, 610, 616, 618, + 621, 632, 638, 644, 651, 657, 665, 669, 672, 679, + 685, 691, 698, 704, 713, 715, 724, 732, 746, 758, + 764, 780, 789, 799, 809, 814, 821, 828, 838, 844, + 850, 854, 877, 879, 881, 887, 893, 901, 907, 914, + 919, 925, 931, 937, 940, 946, 956, 958, 961, 969, + 975, 984, 990, 1007, 1009, 1014, 1018, 1023, 1028, 1034, + 1038, 1049, 1058, 1067, 1078, 1100, 1107, 1126, 1130, 1136, + 1142, 1148, 1158, 1168, 1174, 1188, 1212, 1219, 1233, 1242, + 1252, 1262, 1272, 1280, 1301, 1310, 1319, 1320, 1322, 1329, + 1341, 1351, 1359, 1359, 1364, 1369, 1374, 1379, 1383, 1387, + 1390, 1393, 1398, 1410, 1427, 1432, 1437, 1470, 1480, 1494, + 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, + 1506, 1507, 1513, 1515, 1516, 1519, 1526, 1538, 1540, 1544, + 1548, 1549, 1550, 1551, 1552, 1556, 1557, 1558, 1559, 1563, + 1564, 1571, 1571, 1572, 1572, 1573, 1575, 1577, 1582, 1586, + 1595, 1599, 1604, 1608, 1614, 1624, 1628, 1631, 1634, 1637, + 1642, 1651, 1659, 1665, 1671, 1678, 1686, 1694, 1703, 1706, + 1709, 1710, 1720, 1722, 1723, 1724, 1727, 1731, 1736, 1742, + 1747, 1750, 1753, 1766, 1780, 1784, 1789, 1793, 1798, 1805, + 1818, 1820, 1823, 1827, 1830, 1835, 1839, 1847, 1862, 1868, + 1875, 1888, 1900, 1915, 1919, 1936, 1941, 1944, 1949, 1971, + 1976, 1981, 1987, 1993, 2001, 2009, 2017, 2024, 2034, 2039, + 2069, 2071, 2074, 2081, 2087, 2089, 2090, 2091, 2094, 2096, + 2097, 2100, 2105, 2112, 2119, 2121, 2126 }; #endif @@ -1624,13 +1624,12 @@ case 34: #line 576 "asn1p_y.y" { return yyerror( - "Attempt to redefine a standard basic type, " - "use -ftypesXY to switch back " - "to older version of ASN.1 standard"); + "Attempt to redefine a standard basic string type, " + "please comment out or remove this type redefinition."); ; break;} case 35: -#line 590 "asn1p_y.y" +#line 589 "asn1p_y.y" { if(!saved_aid && 0) return yyerror("Unterminated IMPORTS FROM, " @@ -1640,13 +1639,13 @@ case 35: ; break;} case 36: -#line 600 "asn1p_y.y" +#line 599 "asn1p_y.y" { return yyerror("Empty IMPORTS list"); ; break;} case 37: -#line 606 "asn1p_y.y" +#line 605 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -1654,22 +1653,22 @@ case 37: ; break;} case 38: -#line 611 "asn1p_y.y" +#line 610 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); ; break;} case 39: -#line 618 "asn1p_y.y" +#line 617 "asn1p_y.y" { memset(&yyval.a_aid, 0, sizeof(yyval.a_aid)); ; break;} case 40: -#line 619 "asn1p_y.y" +#line 618 "asn1p_y.y" { yyval.a_aid.oid = yyvsp[0].a_oid; ; break;} case 41: -#line 623 "asn1p_y.y" +#line 622 "asn1p_y.y" { yyval.a_xports = yyvsp[-3].a_xports; yyval.a_xports->fromModuleName = yyvsp[-1].tv_str; @@ -1680,7 +1679,7 @@ case 41: ; break;} case 42: -#line 634 "asn1p_y.y" +#line 633 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); @@ -1688,14 +1687,14 @@ case 42: ; break;} case 43: -#line 639 "asn1p_y.y" +#line 638 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} case 44: -#line 646 "asn1p_y.y" +#line 645 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1704,7 +1703,7 @@ case 44: ; break;} case 45: -#line 652 "asn1p_y.y" +#line 651 "asn1p_y.y" { /* Completely equivalent to above */ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1713,7 +1712,7 @@ case 45: ; break;} case 46: -#line 658 "asn1p_y.y" +#line 657 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1722,19 +1721,19 @@ case 46: ; break;} case 47: -#line 667 "asn1p_y.y" +#line 666 "asn1p_y.y" { yyval.a_xports = yyvsp[-1].a_xports; ; break;} case 48: -#line 670 "asn1p_y.y" +#line 669 "asn1p_y.y" { yyval.a_xports = 0; ; break;} case 49: -#line 673 "asn1p_y.y" +#line 672 "asn1p_y.y" { /* Empty EXPORTS clause effectively prohibits export. */ yyval.a_xports = asn1p_xports_new(); @@ -1742,7 +1741,7 @@ case 49: ; break;} case 50: -#line 681 "asn1p_y.y" +#line 680 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); assert(yyval.a_xports); @@ -1750,14 +1749,14 @@ case 50: ; break;} case 51: -#line 686 "asn1p_y.y" +#line 685 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); ; break;} case 52: -#line 693 "asn1p_y.y" +#line 692 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1766,7 +1765,7 @@ case 52: ; break;} case 53: -#line 699 "asn1p_y.y" +#line 698 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1775,7 +1774,7 @@ case 53: ; break;} case 54: -#line 705 "asn1p_y.y" +#line 704 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1784,11 +1783,11 @@ case 54: ; break;} case 55: -#line 716 "asn1p_y.y" +#line 715 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} case 56: -#line 716 "asn1p_y.y" +#line 715 "asn1p_y.y" { yyval.a_expr = yyvsp[-4].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1798,7 +1797,7 @@ case 56: ; break;} case 57: -#line 726 "asn1p_y.y" +#line 725 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1808,7 +1807,7 @@ case 57: ; break;} case 58: -#line 733 "asn1p_y.y" +#line 732 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1817,7 +1816,7 @@ case 58: ; break;} case 59: -#line 751 "asn1p_y.y" +#line 750 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1828,7 +1827,7 @@ case 59: ; break;} case 60: -#line 759 "asn1p_y.y" +#line 758 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -1837,7 +1836,7 @@ case 60: ; break;} case 61: -#line 765 "asn1p_y.y" +#line 764 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -1846,7 +1845,7 @@ case 61: ; break;} case 62: -#line 781 "asn1p_y.y" +#line 780 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1856,7 +1855,7 @@ case 62: ; break;} case 63: -#line 791 "asn1p_y.y" +#line 790 "asn1p_y.y" { int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); @@ -1868,7 +1867,7 @@ case 63: ; break;} case 64: -#line 800 "asn1p_y.y" +#line 799 "asn1p_y.y" { int ret; yyval.a_plist = yyvsp[-2].a_plist; @@ -1879,14 +1878,14 @@ case 64: ; break;} case 65: -#line 811 "asn1p_y.y" +#line 810 "asn1p_y.y" { yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; ; break;} case 66: -#line 815 "asn1p_y.y" +#line 814 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1896,7 +1895,7 @@ case 66: ; break;} case 67: -#line 822 "asn1p_y.y" +#line 821 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1906,7 +1905,7 @@ case 67: ; break;} case 68: -#line 829 "asn1p_y.y" +#line 828 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -1917,7 +1916,7 @@ case 68: ; break;} case 69: -#line 840 "asn1p_y.y" +#line 839 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1925,20 +1924,20 @@ case 69: ; break;} case 70: -#line 845 "asn1p_y.y" +#line 844 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 71: -#line 852 "asn1p_y.y" +#line 851 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 72: -#line 855 "asn1p_y.y" +#line 854 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1948,15 +1947,15 @@ case 72: ; break;} case 73: -#line 879 "asn1p_y.y" +#line 878 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); ; break;} case 74: -#line 880 "asn1p_y.y" +#line 879 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 75: -#line 883 "asn1p_y.y" +#line 882 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -1964,14 +1963,14 @@ case 75: ; break;} case 76: -#line 888 "asn1p_y.y" +#line 887 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 77: -#line 895 "asn1p_y.y" +#line 894 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -1981,7 +1980,7 @@ case 77: ; break;} case 78: -#line 902 "asn1p_y.y" +#line 901 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; yyvsp[0].a_marker.flags |= yyval.a_expr->marker.flags; @@ -1990,7 +1989,7 @@ case 78: ; break;} case 79: -#line 908 "asn1p_y.y" +#line 907 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2000,13 +1999,13 @@ case 79: ; break;} case 80: -#line 915 "asn1p_y.y" +#line 914 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 81: -#line 921 "asn1p_y.y" +#line 920 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2014,14 +2013,14 @@ case 81: ; break;} case 82: -#line 926 "asn1p_y.y" +#line 925 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 83: -#line 933 "asn1p_y.y" +#line 932 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -2029,20 +2028,20 @@ case 83: ; break;} case 84: -#line 938 "asn1p_y.y" +#line 937 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 85: -#line 941 "asn1p_y.y" +#line 940 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; _fixup_anonymous_identifier(yyval.a_expr); ; break;} case 86: -#line 948 "asn1p_y.y" +#line 947 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); @@ -2052,15 +2051,15 @@ case 86: ; break;} case 87: -#line 958 "asn1p_y.y" +#line 957 "asn1p_y.y" { yyval.a_int = 0; ; break;} case 88: -#line 959 "asn1p_y.y" +#line 958 "asn1p_y.y" { yyval.a_int = 1; ; break;} case 89: -#line 963 "asn1p_y.y" +#line 962 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2070,14 +2069,14 @@ case 89: ; break;} case 90: -#line 970 "asn1p_y.y" +#line 969 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 91: -#line 977 "asn1p_y.y" +#line 976 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2088,7 +2087,7 @@ case 91: ; break;} case 92: -#line 985 "asn1p_y.y" +#line 984 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; yyval.a_expr->Identifier = yyvsp[-3].a_refcomp.name; @@ -2097,7 +2096,7 @@ case 92: ; break;} case 93: -#line 991 "asn1p_y.y" +#line 990 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2115,47 +2114,47 @@ case 93: ; break;} case 94: -#line 1009 "asn1p_y.y" +#line 1008 "asn1p_y.y" { yyval.a_wsynt = 0; ; break;} case 95: -#line 1010 "asn1p_y.y" +#line 1009 "asn1p_y.y" { yyval.a_wsynt = yyvsp[0].a_wsynt; ; break;} case 96: -#line 1017 "asn1p_y.y" +#line 1016 "asn1p_y.y" { asn1p_lexer_hack_enable_with_syntax(); ; break;} case 97: -#line 1019 "asn1p_y.y" +#line 1018 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; ; break;} case 98: -#line 1025 "asn1p_y.y" +#line 1024 "asn1p_y.y" { yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} case 99: -#line 1029 "asn1p_y.y" +#line 1028 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); ; break;} case 100: -#line 1036 "asn1p_y.y" +#line 1035 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); ; break;} case 101: -#line 1039 "asn1p_y.y" +#line 1038 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2167,7 +2166,7 @@ case 101: ; break;} case 102: -#line 1051 "asn1p_y.y" +#line 1050 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2178,7 +2177,7 @@ case 102: ; break;} case 103: -#line 1059 "asn1p_y.y" +#line 1058 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2190,7 +2189,7 @@ case 103: ; break;} case 104: -#line 1068 "asn1p_y.y" +#line 1067 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2202,7 +2201,7 @@ case 104: ; break;} case 105: -#line 1080 "asn1p_y.y" +#line 1079 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; yyval.a_expr->tag = yyvsp[-2].a_tag; @@ -2224,14 +2223,14 @@ case 105: ; break;} case 106: -#line 1102 "asn1p_y.y" +#line 1101 "asn1p_y.y" { yyval.a_int = asn1p_as_pointer ? EM_INDIRECT : 0; asn1p_as_pointer = 0; ; break;} case 107: -#line 1109 "asn1p_y.y" +#line 1108 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->marker.flags |= yyvsp[-1].a_int; @@ -2250,13 +2249,13 @@ case 107: ; break;} case 108: -#line 1128 "asn1p_y.y" +#line 1127 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; ; break;} case 109: -#line 1131 "asn1p_y.y" +#line 1130 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2265,7 +2264,7 @@ case 109: ; break;} case 110: -#line 1137 "asn1p_y.y" +#line 1136 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2274,7 +2273,7 @@ case 110: ; break;} case 111: -#line 1143 "asn1p_y.y" +#line 1142 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2283,7 +2282,7 @@ case 111: ; break;} case 112: -#line 1149 "asn1p_y.y" +#line 1148 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2296,7 +2295,7 @@ case 112: ; break;} case 113: -#line 1159 "asn1p_y.y" +#line 1158 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2309,7 +2308,7 @@ case 113: ; break;} case 114: -#line 1169 "asn1p_y.y" +#line 1168 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2318,7 +2317,7 @@ case 114: ; break;} case 115: -#line 1175 "asn1p_y.y" +#line 1174 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2332,7 +2331,7 @@ case 115: ; break;} case 116: -#line 1189 "asn1p_y.y" +#line 1188 "asn1p_y.y" { int ret; yyval.a_expr = yyvsp[-1].a_expr; @@ -2349,7 +2348,7 @@ case 116: ; break;} case 117: -#line 1213 "asn1p_y.y" +#line 1212 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2359,7 +2358,7 @@ case 117: ; break;} case 118: -#line 1220 "asn1p_y.y" +#line 1219 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2369,7 +2368,7 @@ case 118: ; break;} case 119: -#line 1235 "asn1p_y.y" +#line 1234 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2380,7 +2379,7 @@ case 119: ; break;} case 120: -#line 1243 "asn1p_y.y" +#line 1242 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2393,7 +2392,7 @@ case 120: ; break;} case 121: -#line 1253 "asn1p_y.y" +#line 1252 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2406,7 +2405,7 @@ case 121: ; break;} case 122: -#line 1263 "asn1p_y.y" +#line 1262 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2419,7 +2418,7 @@ case 122: ; break;} case 123: -#line 1273 "asn1p_y.y" +#line 1272 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2430,7 +2429,7 @@ case 123: ; break;} case 124: -#line 1281 "asn1p_y.y" +#line 1280 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[0].a_ref; @@ -2452,7 +2451,7 @@ case 124: ; break;} case 125: -#line 1303 "asn1p_y.y" +#line 1302 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -2463,7 +2462,7 @@ case 125: ; break;} case 126: -#line 1311 "asn1p_y.y" +#line 1310 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[-2].a_ref; @@ -2473,21 +2472,21 @@ case 126: ; break;} case 129: -#line 1325 "asn1p_y.y" +#line 1324 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} case 130: -#line 1330 "asn1p_y.y" +#line 1329 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; ; break;} case 131: -#line 1343 "asn1p_y.y" +#line 1342 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); @@ -2497,7 +2496,7 @@ case 131: ; break;} case 132: -#line 1353 "asn1p_y.y" +#line 1352 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2507,11 +2506,11 @@ case 132: ; break;} case 133: -#line 1360 "asn1p_y.y" +#line 1359 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} case 134: -#line 1360 "asn1p_y.y" +#line 1359 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); @@ -2519,7 +2518,7 @@ case 134: ; break;} case 135: -#line 1365 "asn1p_y.y" +#line 1364 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2527,7 +2526,7 @@ case 135: ; break;} case 136: -#line 1370 "asn1p_y.y" +#line 1369 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2535,7 +2534,7 @@ case 136: ; break;} case 137: -#line 1375 "asn1p_y.y" +#line 1374 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -2543,39 +2542,39 @@ case 137: ; break;} case 138: -#line 1380 "asn1p_y.y" +#line 1379 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); ; break;} case 139: -#line 1384 "asn1p_y.y" +#line 1383 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); ; break;} case 140: -#line 1388 "asn1p_y.y" +#line 1387 "asn1p_y.y" { yyval.a_value = yyval.a_value; ; break;} case 141: -#line 1391 "asn1p_y.y" +#line 1390 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 142: -#line 1394 "asn1p_y.y" +#line 1393 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 143: -#line 1400 "asn1p_y.y" +#line 1399 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2589,7 +2588,7 @@ case 143: ; break;} case 144: -#line 1411 "asn1p_y.y" +#line 1410 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -2606,14 +2605,14 @@ case 144: ; break;} case 145: -#line 1429 "asn1p_y.y" +#line 1428 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); ; break;} case 146: -#line 1433 "asn1p_y.y" +#line 1432 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); @@ -2621,7 +2620,7 @@ case 146: ; break;} case 147: -#line 1438 "asn1p_y.y" +#line 1437 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); @@ -2629,7 +2628,7 @@ case 147: ; break;} case 148: -#line 1472 "asn1p_y.y" +#line 1471 "asn1p_y.y" { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 1; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); @@ -2641,7 +2640,7 @@ case 148: ; break;} case 149: -#line 1481 "asn1p_y.y" +#line 1480 "asn1p_y.y" { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); @@ -2656,71 +2655,71 @@ case 149: ; break;} case 150: -#line 1496 "asn1p_y.y" +#line 1495 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BOOLEAN; ; break;} case 151: -#line 1497 "asn1p_y.y" +#line 1496 "asn1p_y.y" { yyval.a_type = ASN_BASIC_NULL; ; break;} case 152: -#line 1498 "asn1p_y.y" +#line 1497 "asn1p_y.y" { yyval.a_type = ASN_BASIC_REAL; ; break;} case 153: -#line 1499 "asn1p_y.y" +#line 1498 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} case 154: -#line 1500 "asn1p_y.y" +#line 1499 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OCTET_STRING; ; break;} case 155: -#line 1501 "asn1p_y.y" +#line 1500 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ; break;} case 156: -#line 1502 "asn1p_y.y" +#line 1501 "asn1p_y.y" { yyval.a_type = ASN_BASIC_RELATIVE_OID; ; break;} case 157: -#line 1503 "asn1p_y.y" +#line 1502 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EXTERNAL; ; break;} case 158: -#line 1504 "asn1p_y.y" +#line 1503 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ; break;} case 159: -#line 1505 "asn1p_y.y" +#line 1504 "asn1p_y.y" { yyval.a_type = ASN_BASIC_CHARACTER_STRING; ; break;} case 160: -#line 1506 "asn1p_y.y" +#line 1505 "asn1p_y.y" { yyval.a_type = ASN_BASIC_UTCTime; ; break;} case 161: -#line 1507 "asn1p_y.y" +#line 1506 "asn1p_y.y" { yyval.a_type = ASN_BASIC_GeneralizedTime; ; break;} case 162: -#line 1508 "asn1p_y.y" +#line 1507 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; ; break;} case 163: -#line 1515 "asn1p_y.y" +#line 1514 "asn1p_y.y" { yyval.a_type = ASN_BASIC_INTEGER; ; break;} case 164: -#line 1516 "asn1p_y.y" +#line 1515 "asn1p_y.y" { yyval.a_type = ASN_BASIC_ENUMERATED; ; break;} case 165: -#line 1517 "asn1p_y.y" +#line 1516 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BIT_STRING; ; break;} case 166: -#line 1521 "asn1p_y.y" +#line 1520 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2729,7 +2728,7 @@ case 166: ; break;} case 167: -#line 1527 "asn1p_y.y" +#line 1526 "asn1p_y.y" { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; @@ -2742,91 +2741,91 @@ case 167: ; break;} case 168: -#line 1540 "asn1p_y.y" +#line 1539 "asn1p_y.y" { yyval.a_type = ASN_STRING_BMPString; ; break;} case 169: -#line 1541 "asn1p_y.y" +#line 1540 "asn1p_y.y" { yyval.a_type = ASN_STRING_GeneralString; fprintf(stderr, "WARNING: GeneralString is not fully supported\n"); ; break;} case 170: -#line 1545 "asn1p_y.y" +#line 1544 "asn1p_y.y" { yyval.a_type = ASN_STRING_GraphicString; fprintf(stderr, "WARNING: GraphicString is not fully supported\n"); ; break;} case 171: -#line 1549 "asn1p_y.y" +#line 1548 "asn1p_y.y" { yyval.a_type = ASN_STRING_IA5String; ; break;} case 172: -#line 1550 "asn1p_y.y" +#line 1549 "asn1p_y.y" { yyval.a_type = ASN_STRING_ISO646String; ; break;} case 173: -#line 1551 "asn1p_y.y" +#line 1550 "asn1p_y.y" { yyval.a_type = ASN_STRING_NumericString; ; break;} case 174: -#line 1552 "asn1p_y.y" +#line 1551 "asn1p_y.y" { yyval.a_type = ASN_STRING_PrintableString; ; break;} case 175: -#line 1553 "asn1p_y.y" +#line 1552 "asn1p_y.y" { yyval.a_type = ASN_STRING_T61String; fprintf(stderr, "WARNING: T61String is not fully supported\n"); ; break;} case 176: -#line 1557 "asn1p_y.y" +#line 1556 "asn1p_y.y" { yyval.a_type = ASN_STRING_TeletexString; ; break;} case 177: -#line 1558 "asn1p_y.y" +#line 1557 "asn1p_y.y" { yyval.a_type = ASN_STRING_UniversalString; ; break;} case 178: -#line 1559 "asn1p_y.y" +#line 1558 "asn1p_y.y" { yyval.a_type = ASN_STRING_UTF8String; ; break;} case 179: -#line 1560 "asn1p_y.y" +#line 1559 "asn1p_y.y" { yyval.a_type = ASN_STRING_VideotexString; fprintf(stderr, "WARNING: VideotexString is not fully supported\n"); ; break;} case 180: -#line 1564 "asn1p_y.y" +#line 1563 "asn1p_y.y" { yyval.a_type = ASN_STRING_VisibleString; ; break;} case 181: -#line 1565 "asn1p_y.y" +#line 1564 "asn1p_y.y" { yyval.a_type = ASN_STRING_ObjectDescriptor; ; break;} case 187: -#line 1577 "asn1p_y.y" +#line 1576 "asn1p_y.y" { yyval.a_constr = 0; ; break;} case 188: -#line 1578 "asn1p_y.y" +#line 1577 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 189: -#line 1584 "asn1p_y.y" +#line 1583 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); ; break;} case 190: -#line 1587 "asn1p_y.y" +#line 1586 "asn1p_y.y" { /* * This is a special case, for compatibility purposes. @@ -2836,25 +2835,25 @@ case 190: ; break;} case 191: -#line 1597 "asn1p_y.y" +#line 1596 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; ; break;} case 192: -#line 1600 "asn1p_y.y" +#line 1599 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} case 193: -#line 1606 "asn1p_y.y" +#line 1605 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 194: -#line 1609 "asn1p_y.y" +#line 1608 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2863,7 +2862,7 @@ case 194: ; break;} case 195: -#line 1615 "asn1p_y.y" +#line 1614 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -2874,37 +2873,37 @@ case 195: ; break;} case 196: -#line 1626 "asn1p_y.y" +#line 1625 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 197: -#line 1629 "asn1p_y.y" +#line 1628 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_AEX, yyvsp[0].a_constr, 0); ; break;} case 198: -#line 1632 "asn1p_y.y" +#line 1631 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 199: -#line 1635 "asn1p_y.y" +#line 1634 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 200: -#line 1638 "asn1p_y.y" +#line 1637 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 201: -#line 1644 "asn1p_y.y" +#line 1643 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2915,7 +2914,7 @@ case 201: ; break;} case 202: -#line 1652 "asn1p_y.y" +#line 1651 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -2926,7 +2925,7 @@ case 202: ; break;} case 203: -#line 1660 "asn1p_y.y" +#line 1659 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2935,7 +2934,7 @@ case 203: ; break;} case 204: -#line 1666 "asn1p_y.y" +#line 1665 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2944,7 +2943,7 @@ case 204: ; break;} case 205: -#line 1672 "asn1p_y.y" +#line 1671 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2954,7 +2953,7 @@ case 205: ; break;} case 206: -#line 1679 "asn1p_y.y" +#line 1678 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2965,7 +2964,7 @@ case 206: ; break;} case 207: -#line 1687 "asn1p_y.y" +#line 1686 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2976,7 +2975,7 @@ case 207: ; break;} case 208: -#line 1695 "asn1p_y.y" +#line 1694 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -2988,23 +2987,23 @@ case 208: ; break;} case 209: -#line 1704 "asn1p_y.y" +#line 1703 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 210: -#line 1707 "asn1p_y.y" +#line 1706 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 211: -#line 1711 "asn1p_y.y" +#line 1710 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); ; break;} case 212: -#line 1711 "asn1p_y.y" +#line 1710 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3015,35 +3014,35 @@ case 212: ; break;} case 213: -#line 1722 "asn1p_y.y" +#line 1721 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RANGE; ; break;} case 214: -#line 1723 "asn1p_y.y" +#line 1722 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RLRANGE; ; break;} case 215: -#line 1724 "asn1p_y.y" +#line 1723 "asn1p_y.y" { yyval.a_ctype = ACT_EL_LLRANGE; ; break;} case 216: -#line 1725 "asn1p_y.y" +#line 1724 "asn1p_y.y" { yyval.a_ctype = ACT_EL_ULRANGE; ; break;} case 217: -#line 1729 "asn1p_y.y" +#line 1728 "asn1p_y.y" { yyval.a_ctype = ACT_CT_SIZE; ; break;} case 218: -#line 1732 "asn1p_y.y" +#line 1731 "asn1p_y.y" { yyval.a_ctype = ACT_CT_FROM; ; break;} case 219: -#line 1738 "asn1p_y.y" +#line 1737 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -3051,7 +3050,7 @@ case 219: ; break;} case 220: -#line 1743 "asn1p_y.y" +#line 1742 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); @@ -3059,19 +3058,19 @@ case 220: ; break;} case 221: -#line 1748 "asn1p_y.y" +#line 1747 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 222: -#line 1751 "asn1p_y.y" +#line 1750 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; ; break;} case 223: -#line 1754 "asn1p_y.y" +#line 1753 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3085,7 +3084,7 @@ case 223: ; break;} case 224: -#line 1768 "asn1p_y.y" +#line 1767 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3099,31 +3098,31 @@ case 224: ; break;} case 225: -#line 1782 "asn1p_y.y" +#line 1781 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMP, yyvsp[0].a_constr, 0); ; break;} case 226: -#line 1785 "asn1p_y.y" +#line 1784 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); ; break;} case 227: -#line 1791 "asn1p_y.y" +#line 1790 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 228: -#line 1794 "asn1p_y.y" +#line 1793 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); ; break;} case 229: -#line 1800 "asn1p_y.y" +#line 1799 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3132,7 +3131,7 @@ case 229: ; break;} case 230: -#line 1806 "asn1p_y.y" +#line 1805 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3143,45 +3142,45 @@ case 230: ; break;} case 231: -#line 1820 "asn1p_y.y" +#line 1819 "asn1p_y.y" { yyval.a_pres = ACPRES_DEFAULT; ; break;} case 232: -#line 1821 "asn1p_y.y" +#line 1820 "asn1p_y.y" { yyval.a_pres = yyvsp[0].a_pres; ; break;} case 233: -#line 1825 "asn1p_y.y" +#line 1824 "asn1p_y.y" { yyval.a_pres = ACPRES_PRESENT; ; break;} case 234: -#line 1828 "asn1p_y.y" +#line 1827 "asn1p_y.y" { yyval.a_pres = ACPRES_ABSENT; ; break;} case 235: -#line 1831 "asn1p_y.y" +#line 1830 "asn1p_y.y" { yyval.a_pres = ACPRES_OPTIONAL; ; break;} case 236: -#line 1837 "asn1p_y.y" +#line 1836 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 237: -#line 1840 "asn1p_y.y" +#line 1839 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; ; break;} case 238: -#line 1849 "asn1p_y.y" +#line 1848 "asn1p_y.y" { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; @@ -3196,13 +3195,13 @@ case 238: ; break;} case 239: -#line 1864 "asn1p_y.y" +#line 1863 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); ; break;} case 240: -#line 1870 "asn1p_y.y" +#line 1869 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3211,7 +3210,7 @@ case 240: ; break;} case 241: -#line 1876 "asn1p_y.y" +#line 1875 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3222,7 +3221,7 @@ case 241: ; break;} case 242: -#line 1890 "asn1p_y.y" +#line 1889 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; @@ -3236,7 +3235,7 @@ case 242: ; break;} case 243: -#line 1901 "asn1p_y.y" +#line 1900 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; @@ -3251,13 +3250,13 @@ case 243: ; break;} case 244: -#line 1917 "asn1p_y.y" +#line 1916 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} case 245: -#line 1920 "asn1p_y.y" +#line 1919 "asn1p_y.y" { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); @@ -3269,45 +3268,45 @@ case 245: ; break;} case 246: -#line 1938 "asn1p_y.y" +#line 1937 "asn1p_y.y" { yyval.a_marker.flags = EM_NOMARK; yyval.a_marker.default_value = 0; ; break;} case 247: -#line 1942 "asn1p_y.y" +#line 1941 "asn1p_y.y" { yyval.a_marker = yyvsp[0].a_marker; ; break;} case 248: -#line 1946 "asn1p_y.y" +#line 1945 "asn1p_y.y" { - yyval.a_marker.flags = EM_OPTIONAL; + yyval.a_marker.flags = EM_OPTIONAL | EM_INDIRECT; yyval.a_marker.default_value = 0; ; break;} case 249: -#line 1950 "asn1p_y.y" +#line 1949 "asn1p_y.y" { yyval.a_marker.flags = EM_DEFAULT; yyval.a_marker.default_value = yyvsp[0].a_value; ; break;} case 250: -#line 1973 "asn1p_y.y" +#line 1972 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); ; break;} case 251: -#line 1977 "asn1p_y.y" +#line 1976 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; ; break;} case 252: -#line 1983 "asn1p_y.y" +#line 1982 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3315,14 +3314,14 @@ case 252: ; break;} case 253: -#line 1988 "asn1p_y.y" +#line 1987 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); ; break;} case 254: -#line 1995 "asn1p_y.y" +#line 1994 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3332,7 +3331,7 @@ case 254: ; break;} case 255: -#line 2002 "asn1p_y.y" +#line 2001 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3343,7 +3342,7 @@ case 255: ; break;} case 256: -#line 2010 "asn1p_y.y" +#line 2009 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3354,7 +3353,7 @@ case 256: ; break;} case 257: -#line 2018 "asn1p_y.y" +#line 2017 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3364,7 +3363,7 @@ case 257: ; break;} case 258: -#line 2025 "asn1p_y.y" +#line 2024 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3375,102 +3374,102 @@ case 258: ; break;} case 259: -#line 2036 "asn1p_y.y" +#line 2035 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} case 260: -#line 2040 "asn1p_y.y" +#line 2039 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); ; break;} case 261: -#line 2071 "asn1p_y.y" +#line 2070 "asn1p_y.y" { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ; break;} case 262: -#line 2072 "asn1p_y.y" +#line 2071 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; ; break;} case 263: -#line 2076 "asn1p_y.y" +#line 2075 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = yyvsp[0].a_tag.tag_mode; ; break;} case 264: -#line 2083 "asn1p_y.y" +#line 2082 "asn1p_y.y" { yyval.a_tag = yyvsp[-2].a_tag; yyval.a_tag.tag_value = yyvsp[-1].a_int; ; break;} case 265: -#line 2089 "asn1p_y.y" +#line 2088 "asn1p_y.y" { yyval.a_tag.tag_class = TC_CONTEXT_SPECIFIC; ; break;} case 266: -#line 2090 "asn1p_y.y" +#line 2089 "asn1p_y.y" { yyval.a_tag.tag_class = TC_UNIVERSAL; ; break;} case 267: -#line 2091 "asn1p_y.y" +#line 2090 "asn1p_y.y" { yyval.a_tag.tag_class = TC_APPLICATION; ; break;} case 268: -#line 2092 "asn1p_y.y" +#line 2091 "asn1p_y.y" { yyval.a_tag.tag_class = TC_PRIVATE; ; break;} case 269: -#line 2096 "asn1p_y.y" +#line 2095 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_DEFAULT; ; break;} case 270: -#line 2097 "asn1p_y.y" +#line 2096 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_IMPLICIT; ; break;} case 271: -#line 2098 "asn1p_y.y" +#line 2097 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_EXPLICIT; ; break;} case 272: -#line 2102 "asn1p_y.y" +#line 2101 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} case 273: -#line 2106 "asn1p_y.y" +#line 2105 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} case 274: -#line 2114 "asn1p_y.y" +#line 2113 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; ; break;} case 275: -#line 2121 "asn1p_y.y" +#line 2120 "asn1p_y.y" { yyval.tv_str = 0; ; break;} case 276: -#line 2122 "asn1p_y.y" +#line 2121 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; ; break;} case 277: -#line 2128 "asn1p_y.y" +#line 2127 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; @@ -3698,7 +3697,7 @@ case 277: } return 1; } -#line 2134 "asn1p_y.y" +#line 2133 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index 812b2d839..b070f2afd 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -575,9 +575,8 @@ ModuleSpecificationElement: */ | BasicString { return yyerror( - "Attempt to redefine a standard basic type, " - "use -ftypesXY to switch back " - "to older version of ASN.1 standard"); + "Attempt to redefine a standard basic string type, " + "please comment out or remove this type redefinition."); } ; @@ -1944,7 +1943,7 @@ optMarker: Marker: TOK_OPTIONAL { - $$.flags = EM_OPTIONAL; + $$.flags = EM_OPTIONAL | EM_INDIRECT; $$.default_value = 0; } | TOK_DEFAULT Value { diff --git a/libasn1parser/asn1parser.c b/libasn1parser/asn1parser.c index f6221a565..f59d1afec 100644 --- a/libasn1parser/asn1parser.c +++ b/libasn1parser/asn1parser.c @@ -138,22 +138,6 @@ _asn1p_set_flags(enum asn1p_flags flags) { asn1p__flex_debug = 1; } - /* - * Restrict embedded types to ASN.1:1988 version of standard. - */ - if(flags & A1P_TYPES_RESTRICT_TO_1988) { - flags &= ~A1P_TYPES_RESTRICT_TO_1988; - asn1p_lexer_types_year = 1988; - } - - /* - * Restrict embedded types to ASN.1:1988 version of standard. - */ - if(flags & A1P_TYPES_RESTRICT_TO_1988) { - flags &= ~A1P_TYPES_RESTRICT_TO_1988; - asn1p_lexer_types_year = 1988; - } - /* * Check that we haven't missed an unknown flag. */ diff --git a/libasn1parser/asn1parser.h b/libasn1parser/asn1parser.h index d5a09a90f..fc8de37ef 100644 --- a/libasn1parser/asn1parser.h +++ b/libasn1parser/asn1parser.h @@ -57,15 +57,7 @@ enum asn1p_flags { /* * Enable verbose debugging output from lexer. */ - A1P_LEXER_DEBUG = 0x0001, - /* - * Embedded types restricted to ASN.1:1988 - */ - A1P_TYPES_RESTRICT_TO_1988 = 0x0010, - /* - * Embedded constructs (concepts) restricted to ASN.1:1990 - */ - A1P_CONSTRUCTS_RESTRICT_TO_1990 = 0x0020, + A1P_LEXER_DEBUG = 0x0001 }; /* From 337167ed3c51b7db276d05b18bdd5ded810f66a0 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 26 Nov 2005 11:25:14 +0000 Subject: [PATCH 1011/1469] upgrade: PER related changes git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1011 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 4 +- TODO | 7 +- asn1c/asn1c.1 | 15 +- asn1c/asn1c.c | 30 +- asn1c/tests/check-25.c | 4 +- asn1c/tests/check-70.c | 8 +- libasn1compiler/asn1c_C.c | 709 ++- libasn1compiler/asn1c_constraint.c | 2 +- libasn1compiler/asn1c_fdeps.c | 27 +- libasn1compiler/asn1c_save.c | 68 +- libasn1compiler/asn1compiler.h | 10 + libasn1fix/asn1fix_constr.c | 12 +- libasn1fix/asn1fix_retrieve.c | 1 + libasn1fix/asn1fix_tags.c | 56 +- libasn1fix/asn1fix_tags.h | 3 +- skeletons/ANY.c | 2 + skeletons/BIT_STRING.c | 6 +- skeletons/BMPString.c | 4 +- skeletons/BOOLEAN.c | 38 +- skeletons/BOOLEAN.h | 1 + skeletons/ENUMERATED.c | 24 +- skeletons/ENUMERATED.h | 4 +- skeletons/GeneralString.c | 2 + skeletons/GeneralizedTime.c | 2 + skeletons/GraphicString.c | 2 + skeletons/IA5String.c | 2 + skeletons/INTEGER.c | 101 +- skeletons/INTEGER.h | 3 +- skeletons/ISO646String.c | 2 + skeletons/NULL.c | 37 +- skeletons/NULL.h | 1 + skeletons/NativeEnumerated.c | 58 +- skeletons/NativeEnumerated.h | 1 + skeletons/NativeInteger.c | 75 +- skeletons/NativeInteger.h | 1 + skeletons/NativeReal.c | 4 +- skeletons/NumericString.c | 2 + skeletons/OBJECT_IDENTIFIER.c | 6 +- skeletons/OCTET_STRING.c | 131 +- skeletons/OCTET_STRING.h | 1 + skeletons/ObjectDescriptor.c | 2 + skeletons/PrintableString.c | 2 + skeletons/README | 10 +- skeletons/REAL.c | 6 +- skeletons/RELATIVE-OID.c | 6 +- skeletons/T61String.c | 2 + skeletons/TeletexString.c | 2 + skeletons/UTCTime.c | 2 + skeletons/UTF8String.c | 2 + skeletons/UniversalString.c | 4 +- skeletons/VideotexString.c | 2 + skeletons/VisibleString.c | 2 + skeletons/asn-decoder-template.c | 63 +- skeletons/asn_codecs.h | 14 +- skeletons/asn_codecs_prim.c | 4 +- skeletons/constr_CHOICE.c | 95 +- skeletons/constr_CHOICE.h | 9 +- skeletons/constr_SEQUENCE.c | 138 +- skeletons/constr_SEQUENCE.h | 13 +- skeletons/constr_SEQUENCE_OF.c | 6 +- skeletons/constr_SEQUENCE_OF.h | 1 + skeletons/constr_SET.c | 6 +- skeletons/constr_SET_OF.c | 94 +- skeletons/constr_SET_OF.h | 1 + skeletons/constr_TYPE.h | 9 +- skeletons/file-dependencies | 8 +- skeletons/per_decoder.c | 2 + skeletons/per_decoder.h | 55 + skeletons/per_support.c | 148 + skeletons/per_support.h | 54 + skeletons/tests/Makefile.am | 3 +- skeletons/tests/Makefile.in | 23 +- skeletons/tests/check-INTEGER.c | 1 + skeletons/tests/check-OCTET_STRING.c | 1 + skeletons/tests/check-PER.c | 105 + skeletons/tests/check-UTF8String.c | 1 + skeletons/tests/check-length.c | 1 + skeletons/xer_encoder.c | 4 +- skeletons/xer_support.c | 6 +- tests/19-param-OK.asn1.-P | 114 +- tests/30-set-OK.asn1.-P | 36 +- tests/31-set-of-OK.asn1 | 2 + tests/31-set-of-OK.asn1.-EF | 2 + tests/31-set-of-OK.asn1.-P | 346 +- tests/32-sequence-of-OK.asn1.-P | 65 +- tests/39-sequence-of-OK.asn1.-P | 80 +- tests/42-real-life-OK.asn1.-PR | 295 +- tests/43-recursion-OK.asn1.-P | 184 +- tests/44-choice-in-sequence-OK.asn1.-P | 84 +- tests/46-redefine-OK.asn1.-PR | 65 +- tests/47-set-ext-OK.asn1.-P | 94 +- tests/50-constraint-OK.asn1 | 19 +- ...50-constraint-OK.asn1.-EFprint-constraints | Bin 7548 -> 9898 bytes tests/50-constraint-OK.asn1.-P | 1230 ++++- tests/50-constraint-OK.asn1.-Pgen-PER | 4739 +++++++++++++++++ tests/59-choice-extended-OK.asn1.-P | 33 +- tests/60-any-OK.asn1.-P | 83 +- tests/65-multi-tag-OK.asn1.-P | 170 +- tests/65-multi-tag-OK.asn1.-Pfnative-types | 170 +- tests/66-ref-simple-OK.asn1.-P | 53 +- tests/69-reserved-words-OK.asn1.-P | 65 +- tests/70-xer-test-OK.asn1.-P | 542 +- tests/72-same-names-OK.asn1.-P | 268 +- tests/73-circular-OK.asn1.-P | 233 +- tests/84-param-tags-OK.asn1.-P | 186 +- tests/88-integer-enum-OK.asn1.-P | 19 +- tests/89-bit-string-enum-OK.asn1.-P | 15 +- ...-bit-string-enum-OK.asn1.-Pfcompound-names | 15 +- tests/90-cond-int-type-OK.asn1.-P | 342 +- .../90-cond-int-type-OK.asn1.-Pfnative-types | 342 +- tests/90-cond-int-type-OK.asn1.-Pgen-PER | 2744 ++++++++++ ...1-cond-int-blessSize-OK.asn1.-Pfbless-SIZE | 95 +- tests/92-circular-loops-OK.asn1.-P | 474 +- ...-circular-loops-OK.asn1.-Pfindirect-choice | 474 +- tests/93-asn1c-controls-OK.asn1.-P | 104 +- tests/94-set-optionals-OK.asn1.-P | 50 +- tests/95-choice-per-order-OK.asn1 | 30 + tests/95-choice-per-order-OK.asn1.-P | 284 + tests/95-choice-per-order-OK.asn1.-Pgen-PER | 302 ++ 119 files changed, 14517 insertions(+), 2304 deletions(-) create mode 100644 skeletons/per_decoder.c create mode 100644 skeletons/per_decoder.h create mode 100644 skeletons/per_support.c create mode 100644 skeletons/per_support.h create mode 100644 skeletons/tests/check-PER.c create mode 100644 tests/50-constraint-OK.asn1.-Pgen-PER create mode 100644 tests/90-cond-int-type-OK.asn1.-Pgen-PER create mode 100644 tests/95-choice-per-order-OK.asn1 create mode 100644 tests/95-choice-per-order-OK.asn1.-P create mode 100644 tests/95-choice-per-order-OK.asn1.-Pgen-PER diff --git a/ChangeLog b/ChangeLog index 742ae5074..cbd8a34fd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,9 +1,11 @@ -0.9.20: 2005-Nov-07 +0.9.20: 2005-Nov-13 * SET OF CHOICE, SEQUENCE OF CHOICE and a certain named S/O types are represented differently in XER. THIS IS AN ICOMPATIBLE CHANGE. (Test case 70) (Severity: low; Security impact: low) + * PER implementation has started + * asn1c: Removed -ftypes88 command line option. 0.9.19: 2005-Oct-06 diff --git a/TODO b/TODO index 058b1d617..d75352b95 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,6 @@ 1. MAJOR: -1.1 Support for PER encoding. Requires advanced subtype constraints support, -which is already completed. +1.1 Support for PER encoding. PER decoding is already supported. 1.2 Support for Information Object Classes. Status: Support for parsing IOCs is mostly present. @@ -12,7 +11,3 @@ which is already completed. 2.1 Support for EXTERNAL, EMBEDDED-PDV and CHARACTER STRING types. Requires something from 1.2 (Information Object Classes). - -3. MINOR: - -3.1 Support for DEFAULT encoding and decoding, at least in INTEGER/ENUMERATED types. diff --git a/asn1c/asn1c.1 b/asn1c/asn1c.1 index a42893552..3c07ec7fd 100644 --- a/asn1c/asn1c.1 +++ b/asn1c/asn1c.1 @@ -4,7 +4,7 @@ asn1c \- ASN.1 Compiler .SH SYNOPSIS asn1c [\fB\-E\fR [\fB-F\fR] | \fB\-P\fR | \fB\-R\fR] [\fB\-S\fR\fIdir\fR] [\fB-X\fR] - [\fB\-W\fR\fIdebug-\fR...] [\fB\-f\fR\fIoption\fR...] [\fB\-p\fR\fIrint-\fR...] + [\fB\-W\fR\fIdebug-\fR...] [\fB\-f\fR\fIoption\fR] [\fB\-gen-\fR\fIoption\fR] [\fB\-print-\fR\fIoption\fR] \fIinfile\fR... .SH DESCRIPTION asn1c compiles the ASN.1 specifications into the set of @@ -25,7 +25,11 @@ and other encoding standards. .br \fB\-fall-defs-global \-fbless-SIZE \-fcompound-names \-findirect-choice .BI "\-fknown-extern-type=" -\fB\-fnative-types \-fno-constraints \-fno-include-deps \-funnamed-unions \-fskeletons-copy \-ftypes88\fR +\fB\-fnative-types \-fno-constraints \-fno-include-deps \-funnamed-unions \-fskeletons-copy +.TP +\fICodecs Generation Options\fR +.br +.B \-gen-PER .TP \fIOutput Options\fR .br @@ -117,11 +121,10 @@ Enable unnamed unions in the definitions of target language's structures. .TP .B \-fskeletons-copy Copy support files (skeletons) rather than symlink them. +.SH CODECS GENERATION OPTIONS .TP -.B \-ftypes88 -Pretend to support only ASN.1:1988 embedded types. Certain reserved words, -such as UniversalString and BMPString, become ordinary type references -and may be redefined by the specification. +.B \-gen-PER +Generate Packed Encoding Rules (PER) support code. .SH OUTPUT OPTIONS .TP .B \-print-constraints diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index ce1342f86..fa9773ced 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -62,7 +62,7 @@ main(int ac, char **av) { /* * Process command-line options. */ - while((ch = getopt(ac, av, "EFf:hLPp:RS:vW:X")) != -1) + while((ch = getopt(ac, av, "EFf:g:hLPp:RS:vW:X")) != -1) switch(ch) { case 'E': print_arg__print_out = 1; @@ -95,13 +95,19 @@ main(int ac, char **av) { asn1_compiler_flags |= A1C_UNNAMED_UNIONS; } else if(strcmp(optarg, "skeletons-copy") == 0) { asn1_compiler_flags |= A1C_SKELETONS_COPY; - } else if(strcmp(optarg, "types88") == 0) { - asn1_parser_flags |= A1P_TYPES_RESTRICT_TO_1988; } else { fprintf(stderr, "-f%s: Invalid argument\n", optarg); exit(EX_USAGE); } break; + case 'g': + if(strcmp(optarg, "en-PER") == 0) { + asn1_compiler_flags |= A1C_GEN_PER; + } else { + fprintf(stderr, "-g%s: Invalid argument\n", optarg); + exit(EX_USAGE); + } + break; case 'h': usage(av[0]); case 'P': @@ -109,7 +115,15 @@ main(int ac, char **av) { asn1_compiler_flags &= ~A1C_NO_C99; break; case 'p': - if(strcmp(optarg, "rint-constraints") == 0) { + if(strncmp(optarg, "du=", 3) == 0) { + char *pduname = optarg + 3; + if(strcmp(pduname, "auto")) { + fprintf(stderr, "-pdu=%s: expected -pdu=auto\n", + pduname); + exit(EX_USAGE); + } + asn1_compiler_flags |= A1C_PDU_AUTO; + } else if(strcmp(optarg, "rint-constraints") == 0) { asn1_printer_flags |= APF_DEBUG_CONSTRAINTS; } else if(strcmp(optarg, "rint-lines") == 0) { asn1_printer_flags |= APF_LINE_COMMENTS; @@ -250,7 +264,8 @@ main(int ac, char **av) { /* * Make sure the skeleton directory is out there. */ - if(skeletons_dir == NULL) { + if((asn1_compiler_flags & A1C_OMIT_SUPPORT_CODE) == 0 + && skeletons_dir == NULL) { struct stat sb; skeletons_dir = DATADIR; if((av[-optind][0] == '.' || av[-optind][1] == '/') @@ -326,7 +341,10 @@ usage(const char *av0) { " -fno-include-deps Do not generate courtesy #includes for dependencies\n" " -funnamed-unions Enable unnamed unions in structures\n" " -fskeletons-copy Force copying the support files\n" -" -ftypes88 Pretend to support only ASN.1:1988 embedded types\n" +"\n" + +" -gen-PER Generate PER support code\n" +" -pdu=auto Generate PDU table (discover PDUs automatically)\n" "\n" " -print-constraints Explain subtype constraints (debug)\n" diff --git a/asn1c/tests/check-25.c b/asn1c/tests/check-25.c index 90db5d0a6..38c3580fa 100644 --- a/asn1c/tests/check-25.c +++ b/asn1c/tests/check-25.c @@ -102,8 +102,8 @@ check(int is_ok, uint8_t *buf, int size, size_t consumed) { assert(rval.code == RC_OK); assert(rval.consumed == consumed); - assert(strcmp(t.e->buf, "xyz") == 0); - assert(strcmp(t.f->buf, "love_it") == 0); + assert(strcmp((char *)t.e->buf, "xyz") == 0); + assert(strcmp((char *)t.f->buf, "love_it") == 0); assert(t.g->size == 2); assert(t.g->bits_unused == 2); diff --git a/asn1c/tests/check-70.c b/asn1c/tests/check-70.c index 403369e7f..4b51065f3 100644 --- a/asn1c/tests/check-70.c +++ b/asn1c/tests/check-70.c @@ -36,8 +36,12 @@ _buf_writer(const void *buffer, size_t size, void *app_key) { b = buf + buf_offset; bend = b + size; fprintf(stderr, "=> ["); - for(; b < bend; b++) - fprintf(stderr, "%c", *b); + for(; b < bend; b++) { + if(*b >= 32 && *b < 127 && *b != '%') + fprintf(stderr, "%c", *b); + else + fprintf(stderr, "%%02x", *b); + } fprintf(stderr, "]:%ld\n", (long)size); buf_offset += size; return 0; diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 4df99188d..8bce90288 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -7,7 +7,8 @@ #include "asn1c_constraint.h" #include "asn1c_out.h" #include "asn1c_misc.h" -#include /* Stuff exported by libasn1fix */ +#include /* constraint groker from libasn1fix */ +#include /* other exportables from libasn1fix */ typedef struct tag2el_s { struct asn1p_type_tag_s el_tag; @@ -35,16 +36,22 @@ static int asn1c_lang_C_type_SET_def(arg_t *arg); static int asn1c_lang_C_type_CHOICE_def(arg_t *arg); static int asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of); static int _print_tag(arg_t *arg, struct asn1p_type_tag_s *tag_p); -static int check_if_extensible(asn1p_expr_t *expr); +static int compute_extensions_start(asn1p_expr_t *expr); static int expr_break_recursion(arg_t *arg, asn1p_expr_t *expr); static int expr_as_xmlvaluelist(arg_t *arg, asn1p_expr_t *expr); static int expr_elements_count(arg_t *arg, asn1p_expr_t *expr); +static int emit_single_member_PER_constraint(arg_t *arg, asn1cnst_range_t *range, char *type); +static int emit_single_member_PER_constraints(arg_t *arg, asn1p_expr_t *expr); +static int emit_members_PER_constraints(arg_t *arg); static int emit_member_table(arg_t *arg, asn1p_expr_t *expr); static int emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count, const char *opt_modifier); static int emit_include_dependencies(arg_t *arg); static asn1p_expr_t *terminal_structable(arg_t *arg, asn1p_expr_t *expr); static int expr_defined_recursively(arg_t *arg, asn1p_expr_t *expr); static int asn1c_recurse(arg_t *arg, asn1p_expr_t *expr, int (*callback)(arg_t *arg, void *key), void *key); +static asn1p_expr_type_e expr_get_type(arg_t *arg, asn1p_expr_t *expr); +static int try_inline_default(arg_t *arg, asn1p_expr_t *expr, int out); +static int *compute_canonical_members_order(arg_t *arg, int el_count); enum tvm_compat { _TVM_SAME = 0, /* tags and all_tags are same */ @@ -78,8 +85,9 @@ static int emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode } while(0) /* MKID_safe() without checking for reserved keywords */ -#define MKID(id) asn1c_make_identifier(0, (id), 0) -#define MKID_safe(id) asn1c_make_identifier(AMI_CHECK_RESERVED, (id), 0) +#define MKID(id) ((id)?asn1c_make_identifier(0, (id), 0):"Member") +#define MKID_safe(id) ((id)?asn1c_make_identifier(AMI_CHECK_RESERVED, \ + (id), 0):"Member") int asn1c_lang_C_type_REAL(arg_t *arg) { @@ -112,7 +120,7 @@ asn1c_lang_C_type_common_INTEGER(arg_t *arg) { asn1p_expr_t *v; int el_count = expr_elements_count(arg, expr); struct value2enum *v2e; - int map_is_extensible = (expr->expr_type == ASN_BASIC_INTEGER); + int map_extensions = (expr->expr_type == ASN_BASIC_INTEGER); int eidx; v2e = alloca((el_count + 1) * sizeof(*v2e)); @@ -144,7 +152,8 @@ asn1c_lang_C_type_common_INTEGER(arg_t *arg) { OUT("\t/*\n"); OUT("\t * Enumeration is extensible\n"); OUT("\t */\n"); - map_is_extensible = 1; + if(!map_extensions) + map_extensions = eidx + 1; break; default: return -1; @@ -168,7 +177,7 @@ asn1c_lang_C_type_common_INTEGER(arg_t *arg) { */ REDIR(OT_STAT_DEFS); - OUT("static asn_INTEGER_enum_map_t asn_MAP_%s_%d_value2enum[] = {\n", + OUT("static asn_INTEGER_enum_map_t asn_MAP_%s_value2enum_%d[] = {\n", MKID(expr->Identifier), expr->_type_unique_index); qsort(v2e, el_count, sizeof(v2e[0]), compar_enumMap_byValue); for(eidx = 0; eidx < el_count; eidx++) { @@ -178,11 +187,11 @@ asn1c_lang_C_type_common_INTEGER(arg_t *arg) { (long)strlen(v2e[eidx].name), v2e[eidx].name, (eidx + 1 < el_count) ? "," : ""); } - if(map_is_extensible) + if(map_extensions) OUT("\t/* This list is extensible */\n"); OUT("};\n"); - OUT("static unsigned int asn_MAP_%s_%d_enum2value[] = {\n", + OUT("static unsigned int asn_MAP_%s_enum2value_%d[] = {\n", MKID(expr->Identifier), expr->_type_unique_index); qsort(v2e, el_count, sizeof(v2e[0]), compar_enumMap_byName); for(eidx = 0; eidx < el_count; eidx++) { @@ -191,25 +200,29 @@ asn1c_lang_C_type_common_INTEGER(arg_t *arg) { (eidx + 1 < el_count) ? "," : "", v2e[eidx].name, v2e[eidx].value); } - if(map_is_extensible) + if(map_extensions) OUT("\t/* This list is extensible */\n"); OUT("};\n"); - OUT("static asn_INTEGER_specifics_t asn_SPC_%s_%d_specs = {\n", + OUT("static asn_INTEGER_specifics_t asn_SPC_%s_specs_%d = {\n", MKID(expr->Identifier), expr->_type_unique_index); INDENT(+1); - OUT("asn_MAP_%s_%d_value2enum,\t" + OUT("asn_MAP_%s_value2enum_%d,\t" "/* \"tag\" => N; sorted by tag */\n", MKID(expr->Identifier), expr->_type_unique_index); - OUT("asn_MAP_%s_%d_enum2value,\t" + OUT("asn_MAP_%s_enum2value_%d,\t" "/* N => \"tag\"; sorted by N */\n", MKID(expr->Identifier), expr->_type_unique_index); OUT("%d,\t/* Number of elements in the maps */\n", el_count); - OUT("%d,\t/* Enumeration is %sextensible */\n", - map_is_extensible, map_is_extensible ? "": "not "); + if(map_extensions) { + OUT("%d,\t/* Extensions before this member */\n", + map_extensions); + } else { + OUT("0,\t/* Enumeration is not extensible */\n"); + } if(expr->expr_type == ASN_BASIC_ENUMERATED) OUT("1\t/* Strict enumeration */\n"); else @@ -277,7 +290,8 @@ asn1c_lang_C_type_SEQUENCE(arg_t *arg) { if(v->expr_type == A1TC_EXTENSIBLE) if(comp_mode < 3) comp_mode++; if(comp_mode == 1) - v->marker.flags |= EM_OMITABLE; + v->marker.flags |= EM_OMITABLE | EM_INDIRECT; + try_inline_default(arg, v, 1); EMBED(v); } @@ -304,6 +318,8 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { int tags_count; int all_tags_count; enum tvm_compat tv_mode; + int roms_count; /* Root optional members */ + int aoms_count; /* Additions optional members */ /* * Fetch every inner tag from the tag to elements map. @@ -320,15 +336,19 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { REDIR(OT_STAT_DEFS); /* - * Print out the table according to which the parsing is performed. + * Print out the table according to which parsing is performed. */ if(expr_elements_count(arg, expr)) { int comp_mode = 0; /* {root,ext=1,root,root,...} */ + if(emit_members_PER_constraints(arg)) + return -1; OUT("static asn_TYPE_member_t asn_MBR_%s_%d[] = {\n", MKID(expr->Identifier), expr->_type_unique_index); elements = 0; + roms_count = 0; + aoms_count = 0; INDENTED(TQ_FOR(v, &(expr->members), next) { if(v->expr_type == A1TC_EXTENSIBLE) { if((++comp_mode) == 1) @@ -337,14 +357,62 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { ext_stop = elements - 1; continue; } - if(comp_mode == 1) - v->marker.flags |= EM_OMITABLE; + if(v->marker.flags & EM_OMITABLE) + comp_mode == 1 ? ++aoms_count : ++roms_count; emit_member_table(arg, v); elements++; }); OUT("};\n"); + + if((roms_count + aoms_count) && (arg->flags & A1C_GEN_PER)) { + int elm = 0; + int comma = 0; + comp_mode = 0; + OUT("static int asn_MAP_%s_oms_%d[] = {", + MKID(expr->Identifier), + expr->_type_unique_index); + TQ_FOR(v, &(expr->members), next) { + if(v->expr_type == A1TC_EXTENSIBLE) { + ++comp_mode; + continue; + } + if((v->marker.flags & EM_OMITABLE) + && comp_mode != 1) { + if(!comma) comma++; + else OUT(","); + OUT(" %d", elm); + } + ++elm; + } + elm = 0; + comp_mode = 0; + TQ_FOR(v, &(expr->members), next) { + if(v->expr_type == A1TC_EXTENSIBLE) { + ++comp_mode; + continue; + } + if((v->marker.flags & EM_OMITABLE) + && comp_mode == 1) { + if(!comma) comma++; + else OUT(","); + OUT(" %d", elm); + } + ++elm; + } + OUT(" };\n"); + if(roms_count > 65536) + FATAL("Too many optional elements in %s " + "at line %d!", + arg->expr->Identifier, + arg->expr->_lineno); + } else { + roms_count = 0; + aoms_count = 0; + } } else { elements = 0; + roms_count = 0; + aoms_count = 0; } /* @@ -357,26 +425,35 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { */ emit_tag2member_map(arg, tag2el, tag2el_count, 0); - OUT("static asn_SEQUENCE_specifics_t asn_SPC_%s_%d_specs = {\n", + OUT("static asn_SEQUENCE_specifics_t asn_SPC_%s_specs_%d = {\n", MKID(expr->Identifier), expr->_type_unique_index); - INDENTED( - OUT("sizeof(struct "); out_name_chain(arg, ONC_avoid_keywords); OUT("),\n"); - OUT("offsetof(struct "); out_name_chain(arg, ONC_avoid_keywords); OUT(", _asn_ctx),\n"); + INDENT(+1); + OUT("sizeof(struct "); + out_name_chain(arg, ONC_avoid_keywords); OUT("),\n"); + OUT("offsetof(struct "); + out_name_chain(arg, ONC_avoid_keywords); OUT(", _asn_ctx),\n"); - if(tag2el_count) { - OUT("asn_MAP_%s_%d_tag2el,\n", - MKID(expr->Identifier), - expr->_type_unique_index); - OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); - } else { - OUT("0,\t/* No top level tags */\n"); - OUT("0,\t/* No tags in the map */\n"); - } - OUT("%d,\t/* Start extensions */\n", + if(tag2el_count) { + OUT("asn_MAP_%s_tag2el_%d,\n", + MKID(expr->Identifier), + expr->_type_unique_index); + OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); + } else { + OUT("0,\t/* No top level tags */\n"); + OUT("0,\t/* No tags in the map */\n"); + } + if(roms_count + aoms_count) { + OUT("asn_MAP_%s_oms_%d,\t/* Optional members */\n", + MKID(expr->Identifier), expr->_type_unique_index); + OUT("%d, %d,\t/* Root/Additions */\n", roms_count, aoms_count); + } else { + OUT("0, 0, 0,\t/* Optional elements (not needed) */\n"); + } + OUT("%d,\t/* Start extensions */\n", ext_start); - OUT("%d\t/* Stop extensions */\n", + OUT("%d\t/* Stop extensions */\n", (ext_stopIdentifier)); + OUT("typedef struct %s {\n", + MKID_safe(expr->Identifier)); } TQ_FOR(v, &(expr->members), next) { - if(v->expr_type == A1TC_EXTENSIBLE) { + if(v->expr_type == A1TC_EXTENSIBLE) if(comp_mode < 3) comp_mode++; - } if(comp_mode == 1) - v->marker.flags |= EM_OMITABLE; + v->marker.flags |= EM_OMITABLE | EM_INDIRECT; + try_inline_default(arg, v, 1); EMBED(v); } @@ -498,11 +576,13 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { REDIR(OT_STAT_DEFS); /* - * Print out the table according to which the parsing is performed. + * Print out the table according to which parsing is performed. */ if(expr_elements_count(arg, expr)) { int comp_mode = 0; /* {root,ext=1,root,root,...} */ + if(emit_members_PER_constraints(arg)) + return -1; OUT("static asn_TYPE_member_t asn_MBR_%s_%d[] = {\n", MKID(expr->Identifier), expr->_type_unique_index); @@ -511,8 +591,6 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { if(v->expr_type == A1TC_EXTENSIBLE) { if(comp_mode < 3) comp_mode++; } else { - if(comp_mode == 1) - v->marker.flags |= EM_OMITABLE; emit_member_table(arg, v); elements++; } @@ -537,7 +615,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { /* * Emit a map of mandatory elements. */ - OUT("static uint8_t asn_MAP_%s_%d_mmap", + OUT("static uint8_t asn_MAP_%s_mmap_%d", MKID(expr->Identifier), expr->_type_unique_index); p = MKID_safe(expr->Identifier); OUT("[(%d + (8 * sizeof(unsigned int)) - 1) / 8]", elements); @@ -565,7 +643,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { OUT("\n"); OUT("};\n"); - OUT("static asn_SET_specifics_t asn_SPC_%s_%d_specs = {\n", + OUT("static asn_SET_specifics_t asn_SPC_%s_specs_%d = {\n", MKID(expr->Identifier), expr->_type_unique_index); INDENTED( OUT("sizeof(struct "); @@ -578,19 +656,19 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { out_name_chain(arg, ONC_avoid_keywords); OUT(", _presence_map),\n"); p = MKID(expr->Identifier); - OUT("asn_MAP_%s_%d_tag2el,\n", p, expr->_type_unique_index); + OUT("asn_MAP_%s_tag2el_%d,\n", p, expr->_type_unique_index); OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); if(tag2el_cxer) - OUT("asn_MAP_%s_%d_tag2el_cxer,\n", + OUT("asn_MAP_%s_tag2el_cxer_%d,\n", p, expr->_type_unique_index); else - OUT("asn_MAP_%s_%d_tag2el,\t/* Same as above */\n", + OUT("asn_MAP_%s_tag2el_%d,\t/* Same as above */\n", p, expr->_type_unique_index); OUT("%d,\t/* Count of tags in the CXER map */\n", tag2el_cxer_count); OUT("%d,\t/* Whether extensible */\n", - check_if_extensible(expr)); - OUT("(unsigned int *)asn_MAP_%s_%d_mmap\t/* Mandatory elements map */\n", + compute_extensions_start(expr) == -1 ? 0 : 1); + OUT("(unsigned int *)asn_MAP_%s_mmap_%d\t/* Mandatory elements map */\n", p, expr->_type_unique_index); ); OUT("};\n"); @@ -690,7 +768,7 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { enum tvm_compat tv_mode; /* - * Print out the table according to which the parsing is performed. + * Print out the table according to which parsing is performed. */ if(seq_of) { GEN_INCLUDE("constr_SEQUENCE_OF"); @@ -703,8 +781,10 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { REDIR(OT_STAT_DEFS); /* - * Print out the table according to which the parsing is performed. + * Print out the table according to which parsing is performed. */ + if(emit_members_PER_constraints(arg)) + return -1; OUT("static asn_TYPE_member_t asn_MBR_%s_%d[] = {\n", MKID(expr->Identifier), expr->_type_unique_index); INDENT(+1); @@ -725,7 +805,7 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { */ tv_mode = emit_tags_vectors(arg, expr, &tags_count, &all_tags_count); - OUT("static asn_SET_OF_specifics_t asn_SPC_%s_%d_specs = {\n", + OUT("static asn_SET_OF_specifics_t asn_SPC_%s_specs_%d = {\n", MKID(expr->Identifier), expr->_type_unique_index); INDENTED( OUT("sizeof(struct "); @@ -828,6 +908,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { int tags_count; int all_tags_count; enum tvm_compat tv_mode; + int *cmap = 0; /* * Fetch every inner tag from the tag to elements map. @@ -844,10 +925,12 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { REDIR(OT_STAT_DEFS); /* - * Print out the table according to which the parsing is performed. + * Print out the table according to which parsing is performed. */ if(expr_elements_count(arg, expr)) { + if(emit_members_PER_constraints(arg)) + return -1; OUT("static asn_TYPE_member_t asn_MBR_%s_%d[] = {\n", MKID(expr->Identifier), expr->_type_unique_index); @@ -863,6 +946,22 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { elements = 0; } + /* Create a canonical elements map */ + if(elements && (arg->flags & A1C_GEN_PER)) { + int i; + cmap = compute_canonical_members_order(arg, elements); + if(cmap) { + OUT("static int asn_MAP_%s_cmap_%d[] = {", + MKID(expr->Identifier), + expr->_type_unique_index); + for(i = 0; i < elements; i++) { + if(i) OUT(","); + OUT(" %d", cmap[i]); + } + OUT(" };\n"); + free(cmap); + } + } if(arg->embed) { /* @@ -880,7 +979,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { */ emit_tag2member_map(arg, tag2el, tag2el_count, 0); - OUT("static asn_CHOICE_specifics_t asn_SPC_%s_%d_specs = {\n", + OUT("static asn_CHOICE_specifics_t asn_SPC_%s_specs_%d = {\n", MKID(expr->Identifier), expr->_type_unique_index); INDENTED( OUT("sizeof(struct "); @@ -895,11 +994,16 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { OUT("sizeof(((struct "); out_name_chain(arg, ONC_avoid_keywords); OUT(" *)0)->present),\n"); - OUT("asn_MAP_%s_%d_tag2el,\n", + OUT("asn_MAP_%s_tag2el_%d,\n", MKID(expr->Identifier), expr->_type_unique_index); OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); - OUT("%d\t/* Whether extensible */\n", - check_if_extensible(expr)); + if(C99_MODE) OUT(".canonical_order = "); + if(cmap) OUT("asn_MAP_%s_cmap_%d,\t/* Canonically sorted */\n", + MKID(expr->Identifier), expr->_type_unique_index); + else OUT("0,\n"); + if(C99_MODE) OUT(".ext_start = "); + OUT("%d\t/* Extensions start */\n", + compute_extensions_start(expr)); ); OUT("};\n"); @@ -989,11 +1093,13 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { if(!expr->_anonymous_type) { OUT("%s", (expr->marker.flags&EM_INDIRECT)?"\t*":"\t "); OUT("%s", MKID_safe(expr->Identifier)); - if((expr->marker.flags & EM_DEFAULT) == EM_DEFAULT) + if((expr->marker.flags & (EM_DEFAULT & ~EM_INDIRECT)) + == (EM_DEFAULT & ~EM_INDIRECT)) OUT("\t/* DEFAULT %s */", asn1f_printable_value( expr->marker.default_value)); - else if((expr->marker.flags & EM_OPTIONAL) == EM_OPTIONAL) + else if((expr->marker.flags & EM_OPTIONAL) + == EM_OPTIONAL) OUT("\t/* OPTIONAL */"); } @@ -1113,6 +1219,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("td->der_encoder = asn_DEF_%s.der_encoder;\n", type_name); OUT("td->xer_decoder = asn_DEF_%s.xer_decoder;\n", type_name); OUT("td->xer_encoder = asn_DEF_%s.xer_encoder;\n", type_name); + OUT("td->uper_decoder = asn_DEF_%s.uper_decoder;\n", type_name); if(!terminal && !tags_count) { OUT("/* The next four lines are here because of -fknown-extern-type */\n"); OUT("td->tags = asn_DEF_%s.tags;\n", type_name); @@ -1121,6 +1228,9 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("td->all_tags_count = asn_DEF_%s.all_tags_count;\n",type_name); OUT("/* End of these lines */\n"); } + OUT("if(!td->per_constraints)\n"); + OUT("\ttd->per_constraints = asn_DEF_%s.per_constraints;\n", + type_name); OUT("td->elements = asn_DEF_%s.elements;\n", type_name); OUT("td->elements_count = asn_DEF_%s.elements_count;\n", type_name); if(etd_spec != ETD_NO_SPECIFICS) { @@ -1230,6 +1340,23 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("}\n"); OUT("\n"); + if(arg->flags & A1C_GEN_PER) { + p = MKID(expr->Identifier); + if(HIDE_INNER_DEFS) OUT("static "); + OUT("asn_dec_rval_t\n"); + OUT("%s", p); + if(HIDE_INNER_DEFS) OUT("_%d", expr->_type_unique_index); + OUT("_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,\n"); + INDENTED( + OUT("\tasn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {\n"); + OUT("%s_%d_inherit_TYPE_descriptor(td);\n", + p, expr->_type_unique_index); + OUT("return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);\n"); + ); + OUT("}\n"); + OUT("\n"); + } + REDIR(OT_FUNC_DECLS); p = MKID(expr->Identifier); @@ -1246,6 +1373,8 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("der_type_encoder_f %s_encode_der;\n", p); OUT("xer_type_decoder_f %s_decode_xer;\n", p); OUT("xer_type_encoder_f %s_encode_xer;\n", p); + if(arg->flags & A1C_GEN_PER) + OUT("per_type_decoder_f %s_decode_uper;\n", p); } REDIR(OT_TYPE_DECLS); @@ -1264,12 +1393,16 @@ asn1c_lang_C_type_EXTENSIBLE(arg_t *arg) { return 0; } -static int check_if_extensible(asn1p_expr_t *expr) { +static int +compute_extensions_start(asn1p_expr_t *expr) { asn1p_expr_t *v; + int eidx = 0; TQ_FOR(v, &(expr->members), next) { - if(v->expr_type == A1TC_EXTENSIBLE) return 1; + if(v->expr_type == A1TC_EXTENSIBLE) + return eidx; + eidx++; } - return 0; + return -1; } static int @@ -1414,7 +1547,7 @@ _add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no, fte_e f assert(el_no >= 0); ret = asn1f_fetch_outmost_tag(arg->asn, arg->expr->module, - arg->expr, &tag, 1); + arg->expr, &tag, AFT_IMAGINARY_ANY); if(ret == 0) { tag2el_t *te; int new_count = (*count) + 1; @@ -1486,9 +1619,9 @@ emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count, const char * if(!tag2el_count) return 0; /* No top level tags */ - OUT("static asn_TYPE_tag2member_t asn_MAP_%s_%d_tag2el%s[] = {\n", - MKID(expr->Identifier), expr->_type_unique_index, - opt_modifier?opt_modifier:""); + OUT("static asn_TYPE_tag2member_t asn_MAP_%s_tag2el%s_%d[] = {\n", + MKID(expr->Identifier), opt_modifier?opt_modifier:"", + expr->_type_unique_index); for(i = 0; i < tag2el_count; i++) { OUT(" { "); _print_tag(arg, &tag2el[i].el_tag); @@ -1551,9 +1684,9 @@ emit_tags_vectors(arg_t *arg, asn1p_expr_t *expr, int *tags_count_r, int *all_ta } #define EMIT_TAGS_TABLE(name, tags, tags_count) do { \ - OUT("static ber_tlv_tag_t asn_DEF_%s_%d%s_tags[] = {\n",\ - MKID(expr->Identifier), \ - expr->_type_unique_index, name); \ + OUT("static ber_tlv_tag_t asn_DEF_%s%s_tags_%d[] = {\n",\ + MKID(expr->Identifier), name, \ + expr->_type_unique_index); \ INDENT(+1); \ /* Print the array of collected tags */ \ for(i = 0; i < tags_count; i++) { \ @@ -1608,6 +1741,246 @@ expr_elements_count(arg_t *arg, asn1p_expr_t *expr) { return elements; } +static asn1p_expr_type_e +expr_get_type(arg_t *arg, asn1p_expr_t *expr) { + asn1p_expr_t *terminal; + terminal = asn1f_find_terminal_type_ex(arg->asn, expr); + if(terminal) return terminal->expr_type; + return A1TC_INVALID; +} + +static int +emit_single_member_PER_constraint(arg_t *arg, asn1cnst_range_t *range, char *type) { + if(!range || range->incompatible || range->not_PER_visible) { + OUT("{ APC_UNCONSTRAINED,\t-1, -1, 0, 0 }"); + return 0; + } + + if(range->left.type == ARE_VALUE) { + if(range->right.type == ARE_VALUE) { + asn1c_integer_t cover = 1; + asn1c_integer_t r = 1 + range->right.value + - range->left.value; + int rbits, ebits; + + if(range->empty_constraint) + r = 0; + + /* Compute real constraint */ + for(rbits = 0; rbits < (8 * sizeof(r)); rbits++) { + if(r <= cover) + break; + cover *= 2; /* Can't do shifting */ + if(cover < 0) { + FATAL("Constraint at line %d too wide " + "for %d-bits integer type", + arg->expr->_lineno, + sizeof(r) * 8); + rbits = sizeof(r); + break; + } + } + + if(1) { + /* X.691, #10.9.4.1 */ + for(ebits = 0; ebits <= 16; ebits++) + if(r <= 1 << ebits) break; + if(ebits == 17 + || range->right.value >= 65536) + ebits = -1; + } else { + /* X.691, #10.5.7.1 */ + for(ebits = 0; ebits <= 8; ebits++) + if(r <= 1 << ebits) break; + if(ebits == 9) { + if(r <= 65536) + ebits = 16; + else + ebits = -1; + } + } + OUT("{ APC_CONSTRAINED%s,%s% d, % d, ", + range->extensible + ? " | APC_EXTENSIBLE" : "", + range->extensible ? " " : "\t", rbits, ebits); + } else { + if(range->extensible) { + OUT("{ APC_SEMI_CONSTRAINED | APC_EXTENSIBLE, " + "-1, "); + } else { + OUT("{ APC_SEMI_CONSTRAINED,\t-1, -1, "); + } + } + OUT("% " PRIdASN ", % " PRIdASN " }", + range->left.value, range->right.value); + } else { + OUT("{ APC_UNCONSTRAINED,\t-1, -1, 0, 0 }"); + } + + /* + * Print some courtesy debug information. + */ + if(range->left.type == ARE_VALUE + || range->right.type == ARE_VALUE) { + OUT("\t/* "); + if(type) OUT("(%s", type); + OUT("("); + if(range->left.type == ARE_VALUE) + OUT("%" PRIdASN, range->left.value); + else + OUT("MIN"); + OUT(".."); + if(range->right.type == ARE_VALUE) + OUT("%" PRIdASN, range->right.value); + else + OUT("MAX"); + if(range->extensible) OUT(",..."); + if(type) OUT(")"); + OUT(") */"); + } + + return 0; +} + +static int +emit_single_member_PER_constraints(arg_t *arg, asn1p_expr_t *expr) { + asn1cnst_range_t *range; + asn1p_expr_type_e etype; + + etype = expr_get_type(arg, expr); + + INDENT(+1); + + /* + * ENUMERATED and CHOICE are special. + */ + if(etype == ASN_BASIC_ENUMERATED + || etype == ASN_CONSTR_CHOICE) { + asn1cnst_range_t tmprng; + asn1p_expr_t *v; + int extensible = 0; + int eidx = -1; + + expr = asn1f_find_terminal_type_ex(arg->asn, expr); + assert(expr); + + TQ_FOR(v, &(expr->members), next) { + if(v->expr_type == A1TC_EXTENSIBLE) { + extensible++; + break; + } + eidx++; + } + + memset(&tmprng, 0, sizeof (tmprng)); + tmprng.extensible = extensible; + if(eidx < 0) tmprng.empty_constraint = 1; + tmprng.left.type = ARE_VALUE; + tmprng.left.value = 0; + tmprng.right.type = ARE_VALUE; + tmprng.right.value = eidx < 0 ? 0 : eidx; + if(emit_single_member_PER_constraint(arg, &tmprng, 0)) + return -1; + } else { + range = asn1constraint_compute_PER_range(etype, + expr->combined_constraints, ACT_EL_RANGE, + 0, 0, 0); + if(emit_single_member_PER_constraint(arg, range, 0)) + return -1; + asn1constraint_range_free(range); + } + OUT(",\n"); + + range = asn1constraint_compute_PER_range(etype, + expr->combined_constraints, ACT_CT_SIZE, 0, 0, 0); + if(emit_single_member_PER_constraint(arg, range, "SIZE")) + return -1; + asn1constraint_range_free(range); + OUT("\n"); + + INDENT(-1); + + return 0; +} + +static int +emit_members_PER_constraints(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *v; + + if(!(arg->flags & A1C_GEN_PER)) + return 0; + + TQ_FOR(v, &(expr->members), next) { + if(v->constraints + || v->expr_type == ASN_BASIC_ENUMERATED + || v->expr_type == ASN_CONSTR_CHOICE) { + OUT("static asn_per_constraints_t " + "asn_PER_memb_%s_constr_%d = {\n", + MKID(v->Identifier), v->_type_unique_index); + if(emit_single_member_PER_constraints(arg, v)) + return -1; + OUT("};\n"); + } + } + + return 0; +} + +static int +try_inline_default(arg_t *arg, asn1p_expr_t *expr, int out) { + int save_target = arg->target->target; + asn1p_expr_type_e etype = expr_get_type(arg, expr); + int fits_long = 0; + + switch(etype) { + case ASN_BASIC_BOOLEAN: + fits_long = 1; + case ASN_BASIC_INTEGER: + case ASN_BASIC_ENUMERATED: + if(expr->marker.default_value == NULL + || expr->marker.default_value->type != ATV_INTEGER) + break; + if(!fits_long) + fits_long = asn1c_type_fits_long(arg, expr)!=FL_NOTFIT; + if(fits_long && !expr->marker.default_value->value.v_integer) + expr->marker.flags &= ~EM_INDIRECT; + if(!out) return 1; + REDIR(OT_STAT_DEFS); + OUT("static int asn_DFL_%d_set_%" PRIdASN "(void **sptr) {\n", + expr->_type_unique_index, + expr->marker.default_value->value.v_integer); + INDENT(+1); + OUT("%s *st = *sptr;\n", asn1c_type_name(arg, expr, TNF_CTYPE)); + OUT("\n"); + OUT("if(!st) {\n"); + OUT("\tst = (*sptr = CALLOC(1, sizeof(*st)));\n"); + OUT("\tif(!st) return -1;\n"); + OUT("}\n"); + OUT("\n"); + OUT("/* Install default value %" PRIdASN " */\n", + expr->marker.default_value->value.v_integer); + if(fits_long) { + OUT("*st = %" PRIdASN ";\n", + expr->marker.default_value->value.v_integer); + OUT("return 0;\n"); + } else { + OUT("return asn_long2INTEGER(st, %" PRIdASN ");\n", + expr->marker.default_value->value.v_integer); + } + INDENT(-1); + OUT("}\n"); + REDIR(save_target); + return 1; + case ASN_BASIC_NULL: + //expr->marker.flags &= ~EM_INDIRECT; + return 0; + default: + break; + } + return 0; +} + static int emit_member_table(arg_t *arg, asn1p_expr_t *expr) { int save_target; @@ -1618,7 +1991,8 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { char *p; if(asn1f_fetch_outmost_tag(arg->asn, - expr->module, expr, &outmost_tag_s, 1)) { + expr->module, expr, &outmost_tag_s, + AFT_IMAGINARY_ANY)) { outmost_tag = 0; } else { outmost_tag = &outmost_tag_s; @@ -1702,20 +2076,41 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { if(expr->_anonymous_type && !strcmp(expr->Identifier, "Member")) id = asn1c_type_name(arg, expr, TNF_SAFE); - OUT("memb_%s_%d_constraint,\n", id, + OUT("memb_%s_constraint_%d,\n", id, arg->expr->_type_unique_index); } } else { OUT("0,\t/* Defer constraints checking to the member type */\n"); } + if(C99_MODE) OUT(".per_constraints = "); + if(arg->flags & A1C_GEN_PER) { + if(expr->constraints + || expr->expr_type == ASN_BASIC_ENUMERATED + || expr->expr_type == ASN_CONSTR_CHOICE) { + OUT("&asn_PER_memb_%s_constr_%d,\n", + MKID(expr->Identifier), + expr->_type_unique_index); + } else { + OUT("0,\t/* No PER visible constraints */\n"); + } + } else { + OUT("0,\t/* PER is not compiled, use -gen-PER */\n"); + } + if(C99_MODE) OUT(".default_value = "); + if(try_inline_default(arg, expr, 0)) { + OUT("asn_DFL_%d_set_%" PRIdASN + ",\t/* DEFAULT %" PRIdASN " */\n", + expr->_type_unique_index, + expr->marker.default_value->value.v_integer, + expr->marker.default_value->value.v_integer); + } else { + OUT("0,\n"); + } if(C99_MODE) OUT(".name = "); - if(1) { - if(expr->_anonymous_type && !strcmp(expr->Identifier, "Member")) - OUT("\"\"\n"); - else - OUT("\"%s\"\n", expr->Identifier); + if(expr->_anonymous_type && !strcmp(expr->Identifier, "Member")) { + OUT("\"\"\n"); } else { - OUT("\"%s\"\n", expr->_anonymous_type ? "" : expr->Identifier); + OUT("\"%s\"\n", expr->Identifier); } OUT("},\n"); INDENT(-1); @@ -1731,7 +2126,7 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { else p = MKID(expr->Identifier); OUT("static int\n"); - OUT("memb_%s_%d_constraint(asn_TYPE_descriptor_t *td, const void *sptr,\n", p, arg->expr->_type_unique_index); + OUT("memb_%s_constraint_%d(asn_TYPE_descriptor_t *td, const void *sptr,\n", p, arg->expr->_type_unique_index); INDENT(+1); OUT("\t\tasn_app_consume_bytes_f *app_errlog, void *app_key) {\n"); tmp_arg = *arg; @@ -1755,21 +2150,41 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { static int emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_count, int all_tags_count, int elements_count, enum etd_spec spec) { int using_type_name = 0; - char *p; + char *p = MKID(expr->Identifier); + + if((arg->flags & A1C_GEN_PER) + && (expr->constraints + || expr->expr_type == ASN_BASIC_ENUMERATED + || expr->expr_type == ASN_CONSTR_CHOICE) + ) { + OUT("static asn_per_constraints_t asn_PER_%s_constr_%d = {\n", + p, expr->_type_unique_index); + if(emit_single_member_PER_constraints(arg, expr)) + return -1; + OUT("};\n"); + } if(HIDE_INNER_DEFS) OUT("static /* Use -fall-defs-global to expose */\n"); - OUT("asn_TYPE_descriptor_t asn_DEF_%s", MKID(expr->Identifier)); + OUT("asn_TYPE_descriptor_t asn_DEF_%s", p); if(HIDE_INNER_DEFS) OUT("_%d", expr->_type_unique_index); OUT(" = {\n"); - p = MKID(expr->Identifier); INDENT(+1); - OUT("\"%s\",\n", expr->_anonymous_type?"":expr->Identifier); - OUT("\"%s\",\n", expr->_anonymous_type?"":expr->Identifier); + + if(expr->_anonymous_type) { + p = ASN_EXPR_TYPE2STR(expr->expr_type); + OUT("\"%s\",\n", p?p:""); + OUT("\"%s\",\n", MKID(p?p:"")); + } else { + OUT("\"%s\",\n", expr->Identifier); + OUT("\"%s\",\n", expr->Identifier); + } if(expr->expr_type & ASN_CONSTR_MASK) { using_type_name = 1; p = asn1c_type_name(arg, arg->expr, TNF_SAFE); + } else { + p = MKID(expr->Identifier); } #define FUNCREF(foo) do { \ @@ -1786,6 +2201,10 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ FUNCREF(encode_der); FUNCREF(decode_xer); FUNCREF(encode_xer); + if(arg->flags & A1C_GEN_PER) + FUNCREF(decode_uper); + else + OUT("0,\t/* No PER decoder, -gen-PER to enable */\n"); if(expr->expr_type == ASN_CONSTR_CHOICE) { OUT("CHOICE_outmost_tag,\n"); @@ -1795,11 +2214,11 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ p = MKID(expr->Identifier); if(tags_count) { - OUT("asn_DEF_%s_%d_tags,\n", + OUT("asn_DEF_%s_tags_%d,\n", p, expr->_type_unique_index); - OUT("sizeof(asn_DEF_%s_%d_tags)\n", + OUT("sizeof(asn_DEF_%s_tags_%d)\n", p, expr->_type_unique_index); - OUT("\t/sizeof(asn_DEF_%s_%d_tags[0])", + OUT("\t/sizeof(asn_DEF_%s_tags_%d[0])", p, expr->_type_unique_index); if(tv_mode == _TVM_SUBSET && tags_count != all_tags_count) @@ -1811,24 +2230,37 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ } if(all_tags_count && tv_mode == _TVM_DIFFERENT) { - OUT("asn_DEF_%s_%d_all_tags,\n", + OUT("asn_DEF_%s_all_tags_%d,\n", p, expr->_type_unique_index); - OUT("sizeof(asn_DEF_%s_%d_all_tags)\n", + OUT("sizeof(asn_DEF_%s_all_tags_%d)\n", p, expr->_type_unique_index); - OUT("\t/sizeof(asn_DEF_%s_%d_all_tags[0]), /* %d */\n", + OUT("\t/sizeof(asn_DEF_%s_all_tags_%d[0]), /* %d */\n", p, expr->_type_unique_index, all_tags_count); } else if(all_tags_count) { - OUT("asn_DEF_%s_%d_tags,\t/* Same as above */\n", + OUT("asn_DEF_%s_tags_%d,\t/* Same as above */\n", p, expr->_type_unique_index); - OUT("sizeof(asn_DEF_%s_%d_tags)\n", + OUT("sizeof(asn_DEF_%s_tags_%d)\n", p, expr->_type_unique_index); - OUT("\t/sizeof(asn_DEF_%s_%d_tags[0]), /* %d */\n", + OUT("\t/sizeof(asn_DEF_%s_tags_%d[0]), /* %d */\n", p, expr->_type_unique_index, all_tags_count); } else { OUT("0,\t/* No tags (pointer) */\n"); OUT("0,\t/* No tags (count) */\n"); } + if(arg->flags & A1C_GEN_PER) { + if(expr->constraints + || expr->expr_type == ASN_BASIC_ENUMERATED + || expr->expr_type == ASN_CONSTR_CHOICE) { + OUT("&asn_PER_%s_constr_%d,\n", + p, expr->_type_unique_index); + } else { + OUT("0,\t/* No PER visible constraints */\n"); + } + } else { + OUT("0,\t/* No PER visible constraints */\n"); + } + if(elements_count) { OUT("asn_MBR_%s_%d,\n", p, expr->_type_unique_index); if(expr->expr_type == ASN_CONSTR_SEQUENCE_OF @@ -1852,7 +2284,7 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ OUT("0\t/* No specifics */\n"); break; case ETD_HAS_SPECIFICS: - OUT("&asn_SPC_%s_%d_specs\t/* Additional specs */\n", + OUT("&asn_SPC_%s_specs_%d\t/* Additional specs */\n", p, expr->_type_unique_index); } INDENT(-1); @@ -1864,13 +2296,10 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ static int expr_as_xmlvaluelist(arg_t *arg, asn1p_expr_t *expr) { - expr = asn1f_find_terminal_type_ex(arg->asn, expr); - if(!expr) return 0; - /* * X.680, 25.5, Table 5 */ - switch(expr->expr_type) { + switch(expr_get_type(arg, expr)) { case ASN_BASIC_BOOLEAN: case ASN_BASIC_ENUMERATED: case ASN_BASIC_NULL: @@ -1966,19 +2395,15 @@ emit_include_dependencies(arg_t *arg) { */ static int expr_break_recursion(arg_t *arg, asn1p_expr_t *expr) { - asn1p_expr_t *terminal; int ret; if(expr->marker.flags & EM_UNRECURSE) return 1; /* Already broken */ - terminal = asn1f_find_terminal_type_ex(arg->asn, expr); - /* -findirect-choice compiles members of CHOICE as indirect pointers */ if((arg->flags & A1C_INDIRECT_CHOICE) && arg->expr->expr_type == ASN_CONSTR_CHOICE - && terminal - && (terminal->expr_type & ASN_CONSTR_MASK) + && (expr_get_type(arg, expr) & ASN_CONSTR_MASK) ) { /* Break cross-reference */ expr->marker.flags |= EM_INDIRECT | EM_UNRECURSE; @@ -2094,3 +2519,83 @@ expr_defined_recursively(arg_t *arg, asn1p_expr_t *expr) { /* Look inside the terminal type if it mentions the parent expression */ return asn1c_recurse(arg, terminal, check_is_refer_to, topmost); } + +struct canonical_map_element { + int eidx; + asn1p_expr_t *expr; +}; +static int compar_cameo(const void *ap, const void *bp); +static arg_t *cameo_arg; +static int * +compute_canonical_members_order(arg_t *arg, int el_count) { + struct canonical_map_element *cmap; + int *rmap; + asn1p_expr_t *v; + int eidx = 0; + int ext_start = -1; + int nextmax = -1; + int already_sorted = 1; + + cmap = calloc(el_count, sizeof *cmap); + assert(cmap); + + TQ_FOR(v, &(arg->expr->members), next) { + if(v->expr_type != A1TC_EXTENSIBLE) { + cmap[eidx].eidx = eidx; + cmap[eidx].expr = v; + eidx++; + } else if(ext_start == -1) + ext_start = eidx; + } + + cameo_arg = arg; + if(ext_start == -1) { + /* Sort the whole thing */ + qsort(cmap, el_count, sizeof(*cmap), compar_cameo); + } else { + /* Sort root and extensions independently */ + qsort(cmap, ext_start, sizeof(*cmap), compar_cameo); + qsort(cmap + ext_start, el_count - ext_start, + sizeof(*cmap), compar_cameo); + } + + /* move data back to a simpler map */ + rmap = calloc(el_count, sizeof *rmap); + assert(rmap); + for(eidx = 0; eidx < el_count; eidx++) { + rmap[eidx] = cmap[eidx].eidx; + if(rmap[eidx] <= nextmax) + already_sorted = 0; + else + nextmax = rmap[eidx]; + } + free(cmap); + + if(already_sorted) { free(rmap); rmap = 0; } + return rmap; +} +static int compar_cameo(const void *ap, const void *bp) { + const struct canonical_map_element *a = (const void *)ap; + const struct canonical_map_element *b = (const void *)bp; + struct asn1p_type_tag_s atag, btag; + arg_t *arg = cameo_arg; + + if(asn1f_fetch_outmost_tag(arg->asn, a->expr->module, a->expr, + &atag, AFT_IMAGINARY_ANY | AFT_CANON_CHOICE)) + return 1; + + if(asn1f_fetch_outmost_tag(arg->asn, b->expr->module, b->expr, + &btag, AFT_IMAGINARY_ANY | AFT_CANON_CHOICE)) + return -1; + + if(atag.tag_class < btag.tag_class) + return -1; + if(atag.tag_class > btag.tag_class) + return 1; + if(atag.tag_value < btag.tag_value) + return -1; + if(atag.tag_value > btag.tag_value) + return 1; + return 0; + +} diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index 8af5e3687..5388bb3dc 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -4,7 +4,7 @@ #include "asn1c_out.h" #include /* constraint groker from libasn1fix */ -#include /* other exportable stuff from libasn1fix */ +#include /* other exportables from libasn1fix */ static int asn1c_emit_constraint_tables(arg_t *arg, int got_size); static int emit_alphabet_check_loop(arg_t *arg, asn1cnst_range_t *range); diff --git a/libasn1compiler/asn1c_fdeps.c b/libasn1compiler/asn1c_fdeps.c index 0066f51a3..80ba2f68b 100644 --- a/libasn1compiler/asn1c_fdeps.c +++ b/libasn1compiler/asn1c_fdeps.c @@ -66,7 +66,12 @@ asn1c_read_file_dependencies(arg_t *arg, const char *datadir) { asn1c_fdeps_t *cur; char buf[4096]; FILE *f; - int hit_COMMON_FILES = 0; + enum { + SS_DYNAMIC, /* Dynamic list of dependencies */ + SS_CODEC_PER, /* Use contents only if -gen-PER */ + SS_COMMON_FILES, /* Section for dependencies */ + SS_IGNORE /* Ignore contents of this section */ + } special_section = SS_DYNAMIC; (void)arg; @@ -91,17 +96,27 @@ asn1c_read_file_dependencies(arg_t *arg, const char *datadir) { for(p = strtok(buf, " \t\r\n"); p; p = strtok(NULL, " \t\r\n")) { asn1c_fdeps_t *d; + /* - * If hit "COMMON-FILES:", treat everything else - * as a huge dependency. + * Special "prefix" section. */ - if(strcmp(p, "COMMON-FILES:") == 0) { - hit_COMMON_FILES = 1; + if(strchr(p, ':')) { + special_section = SS_IGNORE; + if(strcmp(p, "COMMON-FILES:") == 0) { + special_section = SS_COMMON_FILES; + } else if((arg->flags & A1C_GEN_PER) + && strcmp(p, "CODEC-PER:") == 0) { + special_section = SS_CODEC_PER; + } break; } + + if(special_section == SS_IGNORE) + continue; + d = asn1c_new_dep(p); assert(d); - d->used_somewhere = hit_COMMON_FILES; + d->used_somewhere = special_section; if(asn1c_dep_add(cur, d) == 1) cur = d; diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c index d35db940d..dca0cf1b4 100644 --- a/libasn1compiler/asn1c_save.c +++ b/libasn1compiler/asn1c_save.c @@ -11,6 +11,7 @@ static int asn1c_print_streams(arg_t *arg); static int asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *); static int asn1c_copy_over(arg_t *arg, char *path); static int identical_files(const char *fname1, const char *fname2); +static int generate_pdu_collection_file(arg_t *arg); int asn1c_save_compiled_output(arg_t *arg, const char *datadir, @@ -18,7 +19,7 @@ asn1c_save_compiled_output(arg_t *arg, const char *datadir, asn1c_fdeps_t *deps = 0; asn1c_fdeps_t *dlist; asn1p_module_t *mod; - FILE *mkf; + FILE *mkf; /* Makefile.am.sample */ int i; deps = asn1c_read_file_dependencies(arg, datadir); @@ -108,6 +109,12 @@ asn1c_save_compiled_output(arg_t *arg, const char *datadir, } } + if(arg->flags & A1C_PDU_AUTO) { + fprintf(mkf, "ASN_MODULE_SOURCES+=pdu_collection.c\n"); + if(generate_pdu_collection_file(arg)) + return -1; + } + fprintf(mkf, "\n\n" "lib_LTLIBRARIES=libsomething.la\n" "libsomething_la_SOURCES=" @@ -438,3 +445,62 @@ asn1c_copy_over(arg_t *arg, char *path) { return 1; } + +static int +generate_pdu_collection_file(arg_t *arg) { + asn1p_module_t *mod; + FILE *fp; + + fp = asn1c_open_file("pdu_collection", ".c", 0); + if(fp == NULL) { + perror("pdu_collection.c"); + return -1; + } + + fprintf(fp, + "/*\n" + " * Generated by asn1c-" VERSION " (http://lionet.info/asn1c)\n" + " */\n\n"); + fprintf(fp, "struct asn_TYPE_descriptor_s;\t" + "/* Forward declaration */\n\n"); + + TQ_FOR(mod, &(arg->asn->modules), mod_next) { + TQ_FOR(arg->expr, &(mod->members), next) { + if(arg->expr->_type_referenced + || !asn1_lang_map[arg->expr->meta_type] + [arg->expr->expr_type].type_cb) + continue; + fprintf(fp, "extern struct asn_TYPE_descriptor_s " + "asn_DEF_%s;\n", + asn1c_make_identifier(0, arg->expr->Identifier, + NULL)); + } + } + + fprintf(fp, "\n\n"); + fprintf(fp, "struct asn_TYPE_descriptor_s *asn_pdu_collection[] = {\n"); + TQ_FOR(mod, &(arg->asn->modules), mod_next) { + int mod_printed = 0; + TQ_FOR(arg->expr, &(mod->members), next) { + if(arg->expr->_type_referenced + || !asn1_lang_map[arg->expr->meta_type] + [arg->expr->expr_type].type_cb) + continue; + if(!mod_printed++) + fprintf(fp, "\t/* From module %s in %s */\n", + arg->expr->module->ModuleName, + arg->expr->module->source_file_name); + fprintf(fp, "\t&asn_DEF_%s,\t\n", + asn1c_make_identifier(0, arg->expr->Identifier, + NULL)); + } + } + + fprintf(fp, "\t0\n};\n\n"); + + fclose(fp); + fprintf(stderr, "Generated pdu_collection.c\n"); + + return 0; +} + diff --git a/libasn1compiler/asn1compiler.h b/libasn1compiler/asn1compiler.h index 847300ff5..e33628f8a 100644 --- a/libasn1compiler/asn1compiler.h +++ b/libasn1compiler/asn1compiler.h @@ -56,6 +56,16 @@ enum asn1c_flags { * Copy support files rather than symlink them. */ A1C_SKELETONS_COPY = 0x0800, + /* + * -gen-PER + * Generate PER support code + */ + A1C_GEN_PER = 0x1000, + /* + * -pdu=auto + * Generate PDU table + */ + A1C_PDU_AUTO = 0x2000 }; /* diff --git a/libasn1fix/asn1fix_constr.c b/libasn1fix/asn1fix_constr.c index 7adbcaca6..ea2fcf1f6 100644 --- a/libasn1fix/asn1fix_constr.c +++ b/libasn1fix/asn1fix_constr.c @@ -1,7 +1,5 @@ #include "asn1fix_internal.h" -#define AFT_MAGIC_ANY 1 /* _fetch_tag() flag */ - static int _asn1f_check_if_tag_must_be_explicit(arg_t *arg, asn1p_expr_t *v); static int _asn1f_compare_tags(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b); static int _asn1f_fix_type_tag(arg_t *arg, asn1p_expr_t *expr); @@ -337,6 +335,7 @@ asn1f_check_constr_tags_distinct(arg_t *arg) { case ASN_CONSTR_SEQUENCE: case ASN_CONSTR_SET: case ASN_CONSTR_CHOICE: + DEBUG("Checking tags of members of constructed types"); break; default: return 0; @@ -353,6 +352,8 @@ asn1f_check_constr_tags_distinct(arg_t *arg) { if(expr->expr_type != ASN_CONSTR_SEQUENCE || v->marker.flags) { asn1p_expr_t *nv; for(nv = v; (nv = TQ_NEXT(nv, next));) { + DEBUG("S/C comparing tags %s s. %s", + v->Identifier, nv->Identifier); if(_asn1f_compare_tags(arg, v, nv)) r_value = -1; if(expr->expr_type == ASN_CONSTR_SEQUENCE @@ -404,12 +405,15 @@ _asn1f_compare_tags(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b) { int ra, rb; int ret; - ra = asn1f_fetch_outmost_tag(arg->asn, arg->mod, a, &ta, AFT_MAGIC_ANY); - rb = asn1f_fetch_outmost_tag(arg->asn, arg->mod, b, &tb, AFT_MAGIC_ANY); + ra = asn1f_fetch_outmost_tag(arg->asn, arg->mod, a, + &ta, AFT_IMAGINARY_ANY); + rb = asn1f_fetch_outmost_tag(arg->asn, arg->mod, b, + &tb, AFT_IMAGINARY_ANY); /* * If both tags are explicitly or implicitly given, use them. */ + DEBUG("Fetching outmost tags: %d, %d", ra, rb); if(ra == 0 && rb == 0) { /* * Simple case: fetched both tags. diff --git a/libasn1fix/asn1fix_retrieve.c b/libasn1fix/asn1fix_retrieve.c index 730c8618e..423685822 100644 --- a/libasn1fix/asn1fix_retrieve.c +++ b/libasn1fix/asn1fix_retrieve.c @@ -370,6 +370,7 @@ asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, enum ftt_what what) { return NULL; } + tc->_type_referenced = 1; tc->_mark |= TM_RECURSION; WITH_MODULE(tc->module, expr = asn1f_find_terminal_thing(arg, tc, what)); diff --git a/libasn1fix/asn1fix_tags.c b/libasn1fix/asn1fix_tags.c index ff662cc38..dfda44100 100644 --- a/libasn1fix/asn1fix_tags.c +++ b/libasn1fix/asn1fix_tags.c @@ -18,6 +18,9 @@ if((flags & AFT_FETCH_OUTMOST)) return count; \ } while(0) +/* X.691, #22.2 */ +static int asn1f_fetch_minimal_choice_root_tag(arg_t *arg, struct asn1p_type_tag_s *tag, enum asn1f_aft_flags_e flags); + static int asn1f_fetch_tags_impl(arg_t *arg, struct asn1p_type_tag_s **tags, int count, int skip, enum asn1f_aft_flags_e flags) { asn1p_expr_t *expr = arg->expr; @@ -44,9 +47,13 @@ asn1f_fetch_tags_impl(arg_t *arg, struct asn1p_type_tag_s **tags, int count, int if(expr->expr_type == ASN_TYPE_ANY && (flags & AFT_IMAGINARY_ANY)) tt.tag_value = -1; - else if(expr->expr_type == ASN_CONSTR_CHOICE) - return count ? count : -1; - else + else if(expr->expr_type != ASN_CONSTR_CHOICE) + return -1; + else if(count) return count; + else if((flags & AFT_CANON_CHOICE) == 0) + return -1; + else if(asn1f_fetch_minimal_choice_root_tag(arg, + &tt, flags)) return -1; } ADD_TAG(skip, tt); @@ -55,6 +62,7 @@ asn1f_fetch_tags_impl(arg_t *arg, struct asn1p_type_tag_s **tags, int count, int if(expr->meta_type == AMT_TYPEREF) { asn1p_expr_t *nexpr; + DEBUG("Following the reference %s", expr->Identifier); nexpr = asn1f_lookup_symbol(arg, expr->module, expr->reference); if(nexpr == NULL) { if(errno != EEXIST) /* -fknown-extern-type */ @@ -87,18 +95,52 @@ asn1f_fetch_tags_impl(arg_t *arg, struct asn1p_type_tag_s **tags, int count, int return count; } + DEBUG("No tags discovered for type %d", expr->expr_type); + return -1; } +static int +asn1f_fetch_minimal_choice_root_tag(arg_t *arg, struct asn1p_type_tag_s *tag, enum asn1f_aft_flags_e flags) { + struct asn1p_type_tag_s min_tag; + asn1p_expr_t *v; + + memset(&min_tag, 0, sizeof(min_tag)); + min_tag.tag_class = TC_PRIVATE + 1; + + TQ_FOR(v, &(arg->expr->members), next) { + arg_t tmparg = *arg; + struct asn1p_type_tag_s *tags = 0; + int count; + + if(v->expr_type == A1TC_EXTENSIBLE) + break; /* Search only within extension root */ + + tmparg.expr = v; + count = asn1f_fetch_tags_impl(&tmparg, &tags, 0, 0, flags); + if(count <= 0) continue; + + if(tags[0].tag_class < min_tag.tag_class) + min_tag = tags[0]; + else if(tags[0].tag_class == min_tag.tag_class + && tags[0].tag_value < min_tag.tag_value) + min_tag = tags[0]; + free(tags); + } + + if(min_tag.tag_class == TC_PRIVATE + 1) + return -1; + else + *tag = min_tag; + return 0; +} int -asn1f_fetch_outmost_tag(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag, int _aft_imaginary_any) { +asn1f_fetch_outmost_tag(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag, enum asn1f_aft_flags_e flags) { struct asn1p_type_tag_s *tags; - enum asn1f_aft_flags_e flags; int count; - flags = AFT_FETCH_OUTMOST; - flags |= AFT_IMAGINARY_ANY * _aft_imaginary_any; + flags |= AFT_FETCH_OUTMOST; count = asn1f_fetch_tags(asn, mod, expr, &tags, flags); if(count <= 0) return count; diff --git a/libasn1fix/asn1fix_tags.h b/libasn1fix/asn1fix_tags.h index a4c31ad90..0fbbefec1 100644 --- a/libasn1fix/asn1fix_tags.h +++ b/libasn1fix/asn1fix_tags.h @@ -5,6 +5,7 @@ enum asn1f_aft_flags_e { AFT_IMAGINARY_ANY = 0x01, /* Treat ANY tag as [IMAGINARY ANY] */ AFT_FETCH_OUTMOST = 0x02, /* Fetch only outmost tag */ AFT_FULL_COLLECT = 0x04, /* Collect all tags */ + AFT_CANON_CHOICE = 0x08, /* Fetch the minimal CHOICE root tag */ }; /* @@ -24,6 +25,6 @@ int asn1f_fetch_tags(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, * Type3 ::= SEQUENCE { ... } * Will yield [2] for Type1. */ -int asn1f_fetch_outmost_tag(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag, int _aft_imaginary_any); +int asn1f_fetch_outmost_tag(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag, enum asn1f_aft_flags_e); #endif /* _ASN1FIX_TAGS_H_ */ diff --git a/skeletons/ANY.c b/skeletons/ANY.c index 73702444a..b1e35bf04 100644 --- a/skeletons/ANY.c +++ b/skeletons/ANY.c @@ -21,8 +21,10 @@ asn_TYPE_descriptor_t asn_DEF_ANY = { OCTET_STRING_encode_der, OCTET_STRING_decode_xer_hex, ANY_encode_xer, + 0, 0, /* Use generic outmost tag fetcher */ 0, 0, 0, 0, + 0, /* No PER visible constraints */ 0, 0, /* No members */ &asn_DEF_ANY_specs, }; diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index 8c83d6896..900f41db9 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -27,6 +27,7 @@ asn_TYPE_descriptor_t asn_DEF_BIT_STRING = { OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ OCTET_STRING_decode_xer_binary, BIT_STRING_encode_xer, + OCTET_STRING_decode_uper, /* Unaligned PER decoder */ 0, /* Use generic outmost tag fetcher */ asn_DEF_BIT_STRING_tags, sizeof(asn_DEF_BIT_STRING_tags) @@ -34,6 +35,7 @@ asn_TYPE_descriptor_t asn_DEF_BIT_STRING = { asn_DEF_BIT_STRING_tags, /* Same as above */ sizeof(asn_DEF_BIT_STRING_tags) / sizeof(asn_DEF_BIT_STRING_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ &asn_DEF_BIT_STRING_specs }; @@ -124,9 +126,7 @@ BIT_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); - er.structure_ptr = 0; - er.failed_type = 0; - return er; + _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } diff --git a/skeletons/BMPString.c b/skeletons/BMPString.c index f3308bf7c..10fd05e08 100644 --- a/skeletons/BMPString.c +++ b/skeletons/BMPString.c @@ -23,6 +23,7 @@ asn_TYPE_descriptor_t asn_DEF_BMPString = { OCTET_STRING_encode_der, BMPString_decode_xer, /* Convert from UTF-8 */ BMPString_encode_xer, /* Convert to UTF-8 */ + 0, 0, /* Use generic outmost tag fetcher */ asn_DEF_BMPString_tags, sizeof(asn_DEF_BMPString_tags) @@ -30,6 +31,7 @@ asn_TYPE_descriptor_t asn_DEF_BMPString = { asn_DEF_BMPString_tags, sizeof(asn_DEF_BMPString_tags) / sizeof(asn_DEF_BMPString_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -156,7 +158,7 @@ BMPString_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, er.encoded = BMPString__dump(st, cb, app_key); if(er.encoded < 0) _ASN_ENCODE_FAILED; - return er; + _ASN_ENCODED_OK(er); } int diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c index 360b6643d..84e578584 100644 --- a/skeletons/BOOLEAN.c +++ b/skeletons/BOOLEAN.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Copyright (c) 2003, 2005 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include @@ -22,11 +22,13 @@ asn_TYPE_descriptor_t asn_DEF_BOOLEAN = { BOOLEAN_encode_der, BOOLEAN_decode_xer, BOOLEAN_encode_xer, + BOOLEAN_decode_uper, /* Unaligned PER decoder */ 0, /* Use generic outmost tag fetcher */ asn_DEF_BOOLEAN_tags, sizeof(asn_DEF_BOOLEAN_tags) / sizeof(asn_DEF_BOOLEAN_tags[0]), asn_DEF_BOOLEAN_tags, /* Same as above */ sizeof(asn_DEF_BOOLEAN_tags) / sizeof(asn_DEF_BOOLEAN_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -126,7 +128,7 @@ BOOLEAN_encode_der(asn_TYPE_descriptor_t *td, void *sptr, erval.encoded += 1; - return erval; + _ASN_ENCODED_OK(erval); } @@ -196,7 +198,7 @@ BOOLEAN_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, er.encoded = 8; } - return er; + _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } @@ -234,3 +236,33 @@ BOOLEAN_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { } } +asn_dec_rval_t +BOOLEAN_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_dec_rval_t rv; + BOOLEAN_t *st = (BOOLEAN_t *)*sptr; + + (void)opt_codec_ctx; + (void)constraints; + + if(!st) { + st = (BOOLEAN_t *)(*sptr = MALLOC(sizeof(*st))); + if(!st) _ASN_DECODE_FAILED; + } + + /* + * Extract a single bit + */ + switch(per_get_few_bits(pd, 1)) { + case 1: *st = 1; break; + case 0: *st = 0; break; + case -1: default: _ASN_DECODE_FAILED; + } + + ASN_DEBUG("%s decoded as %s", td->name, *st ? "TRUE" : "FALSE"); + + rv.code = RC_OK; + rv.consumed = 1; + return rv; +} + diff --git a/skeletons/BOOLEAN.h b/skeletons/BOOLEAN.h index ec4dbac88..1cf19803a 100644 --- a/skeletons/BOOLEAN.h +++ b/skeletons/BOOLEAN.h @@ -26,6 +26,7 @@ ber_type_decoder_f BOOLEAN_decode_ber; der_type_encoder_f BOOLEAN_encode_der; xer_type_decoder_f BOOLEAN_decode_xer; xer_type_encoder_f BOOLEAN_encode_xer; +per_type_decoder_f BOOLEAN_decode_uper; #ifdef __cplusplus } diff --git a/skeletons/ENUMERATED.c b/skeletons/ENUMERATED.c index 12d4f6ebe..c51f9265a 100644 --- a/skeletons/ENUMERATED.c +++ b/skeletons/ENUMERATED.c @@ -1,9 +1,10 @@ /*- - * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Copyright (c) 2003, 2005 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include +#include #include /* Encoder and decoder of a primitive type */ /* @@ -22,12 +23,33 @@ asn_TYPE_descriptor_t asn_DEF_ENUMERATED = { INTEGER_encode_der, /* Implemented in terms of INTEGER */ INTEGER_decode_xer, /* This is temporary! */ INTEGER_encode_xer, + ENUMERATED_decode_uper, /* Unaligned PER decoder */ 0, /* Use generic outmost tag fetcher */ asn_DEF_ENUMERATED_tags, sizeof(asn_DEF_ENUMERATED_tags) / sizeof(asn_DEF_ENUMERATED_tags[0]), asn_DEF_ENUMERATED_tags, /* Same as above */ sizeof(asn_DEF_ENUMERATED_tags) / sizeof(asn_DEF_ENUMERATED_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; +asn_dec_rval_t +ENUMERATED_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_dec_rval_t rval; + ENUMERATED_t *st = (ENUMERATED_t *)*sptr; + long value, *vptr = &value; + + if(!st) { + st = (ENUMERATED_t *)(*sptr = CALLOC(1, sizeof(*st))); + if(!st) _ASN_DECODE_FAILED; + } + + rval = NativeEnumerated_decode_uper(opt_codec_ctx, td, constraints, + (void **)&vptr, pd); + if(rval.code == RC_OK) + if(asn_long2INTEGER(st, value)) + rval.code = RC_FAIL; + return rval; +} diff --git a/skeletons/ENUMERATED.h b/skeletons/ENUMERATED.h index 53cc273e4..e65a15af8 100644 --- a/skeletons/ENUMERATED.h +++ b/skeletons/ENUMERATED.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Copyright (c) 2003, 2005 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _ENUMERATED_H_ @@ -15,6 +15,8 @@ typedef INTEGER_t ENUMERATED_t; /* Implemented via INTEGER */ extern asn_TYPE_descriptor_t asn_DEF_ENUMERATED; +per_type_decoder_f ENUMERATED_decode_uper; + #ifdef __cplusplus } #endif diff --git a/skeletons/GeneralString.c b/skeletons/GeneralString.c index e4ea6f8a5..c1a8823ed 100644 --- a/skeletons/GeneralString.c +++ b/skeletons/GeneralString.c @@ -22,6 +22,7 @@ asn_TYPE_descriptor_t asn_DEF_GeneralString = { OCTET_STRING_encode_der, OCTET_STRING_decode_xer_hex, OCTET_STRING_encode_xer, + 0, 0, /* Use generic outmost tag fetcher */ asn_DEF_GeneralString_tags, sizeof(asn_DEF_GeneralString_tags) @@ -29,6 +30,7 @@ asn_TYPE_descriptor_t asn_DEF_GeneralString = { asn_DEF_GeneralString_tags, sizeof(asn_DEF_GeneralString_tags) / sizeof(asn_DEF_GeneralString_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 9103455dd..aabe66d69 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -128,6 +128,7 @@ asn_TYPE_descriptor_t asn_DEF_GeneralizedTime = { GeneralizedTime_encode_der, OCTET_STRING_decode_xer_utf8, GeneralizedTime_encode_xer, + 0, 0, /* Use generic outmost tag fetcher */ asn_DEF_GeneralizedTime_tags, sizeof(asn_DEF_GeneralizedTime_tags) @@ -135,6 +136,7 @@ asn_TYPE_descriptor_t asn_DEF_GeneralizedTime = { asn_DEF_GeneralizedTime_tags, sizeof(asn_DEF_GeneralizedTime_tags) / sizeof(asn_DEF_GeneralizedTime_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/GraphicString.c b/skeletons/GraphicString.c index c5d4a30b0..0c3ad47cc 100644 --- a/skeletons/GraphicString.c +++ b/skeletons/GraphicString.c @@ -22,6 +22,7 @@ asn_TYPE_descriptor_t asn_DEF_GraphicString = { OCTET_STRING_encode_der, OCTET_STRING_decode_xer_hex, OCTET_STRING_encode_xer, /* Can't expect it to be ASCII/UTF8 */ + 0, 0, /* Use generic outmost tag fetcher */ asn_DEF_GraphicString_tags, sizeof(asn_DEF_GraphicString_tags) @@ -29,6 +30,7 @@ asn_TYPE_descriptor_t asn_DEF_GraphicString = { asn_DEF_GraphicString_tags, sizeof(asn_DEF_GraphicString_tags) / sizeof(asn_DEF_GraphicString_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/IA5String.c b/skeletons/IA5String.c index c4da875a5..a4d7ff84a 100644 --- a/skeletons/IA5String.c +++ b/skeletons/IA5String.c @@ -22,6 +22,7 @@ asn_TYPE_descriptor_t asn_DEF_IA5String = { OCTET_STRING_encode_der, OCTET_STRING_decode_xer_utf8, OCTET_STRING_encode_xer_utf8, + 0, 0, /* Use generic outmost tag fetcher */ asn_DEF_IA5String_tags, sizeof(asn_DEF_IA5String_tags) @@ -29,6 +30,7 @@ asn_TYPE_descriptor_t asn_DEF_IA5String = { asn_DEF_IA5String_tags, sizeof(asn_DEF_IA5String_tags) / sizeof(asn_DEF_IA5String_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index d2a66b5d6..dbb148598 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -24,11 +24,13 @@ asn_TYPE_descriptor_t asn_DEF_INTEGER = { INTEGER_encode_der, INTEGER_decode_xer, INTEGER_encode_xer, + INTEGER_decode_uper, /* Unaligned PER decoder */ 0, /* Use generic outmost tag fetcher */ asn_DEF_INTEGER_tags, sizeof(asn_DEF_INTEGER_tags) / sizeof(asn_DEF_INTEGER_tags[0]), asn_DEF_INTEGER_tags, /* Same as above */ sizeof(asn_DEF_INTEGER_tags) / sizeof(asn_DEF_INTEGER_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -430,9 +432,102 @@ INTEGER_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, er.encoded = INTEGER__dump(td, st, cb, app_key, 1); if(er.encoded < 0) _ASN_ENCODE_FAILED; - er.structure_ptr = 0; - er.failed_type = 0; - return er; + _ASN_ENCODED_OK(er); +} + +asn_dec_rval_t +INTEGER_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_dec_rval_t rval = { RC_OK, 0 }; + INTEGER_t *st = (INTEGER_t *)*sptr; + asn_per_constraint_t *ct; + int repeat; + + (void)opt_codec_ctx; + + if(!st) { + st = (INTEGER_t *)(*sptr = CALLOC(1, sizeof(*st))); + if(!st) _ASN_DECODE_FAILED; + } + + if(!constraints) constraints = td->per_constraints; + ct = constraints ? &constraints->value : 0; + + if(ct && ct->flags & APC_EXTENSIBLE) { + int inext = per_get_few_bits(pd, 1); + if(inext < 0) _ASN_DECODE_FAILED; + if(inext) ct = 0; + } + + FREEMEM(st->buf); + if(ct) { + if(ct->flags & APC_SEMI_CONSTRAINED) { + st->buf = (uint8_t *)CALLOC(1, 2); + if(!st->buf) _ASN_DECODE_FAILED; + st->size = 1; + } else if(ct->flags & APC_CONSTRAINED && ct->range_bits >= 0) { + size_t size = (ct->range_bits + 7) >> 3; + st->buf = (uint8_t *)MALLOC(1 + size + 1); + if(!st->buf) _ASN_DECODE_FAILED; + st->size = size; + } else { + st->size = 0; + } + } else { + st->size = 0; + } + + /* X.691, #12.2.2 */ + if(ct && ct->flags != APC_UNCONSTRAINED) { + /* #10.5.6 */ + ASN_DEBUG("Integer with range %d bits", ct->range_bits); + if(ct->range_bits >= 0) { + long value = per_get_few_bits(pd, ct->range_bits); + if(value < 0) _ASN_DECODE_FAILED; + ASN_DEBUG("Got value %ld + low %ld", + value, ct->lower_bound); + value += ct->lower_bound; + if(asn_long2INTEGER(st, value)) + _ASN_DECODE_FAILED; + return rval; + } + } else { + ASN_DEBUG("Decoding unconstrained integer %s", td->name); + } + + /* X.691, #12.2.3, #12.2.4 */ + do { + ssize_t len; + void *p; + int ret; + + /* Get the PER length */ + len = uper_get_length(pd, -1, &repeat); + if(len < 0) _ASN_DECODE_FAILED; + + p = REALLOC(st->buf, st->size + len + 1); + if(!p) _ASN_DECODE_FAILED; + st->buf = (uint8_t *)p; + + ret = per_get_many_bits(pd, &st->buf[st->size], 0, 8 * len); + if(ret < 0) _ASN_DECODE_FAILED; + st->size += len; + } while(repeat); + st->buf[st->size] = 0; /* JIC */ + + /* #12.2.3 */ + if(ct && ct->lower_bound) { + /* + * TODO: replace by in-place arithmetics. + */ + long value; + if(asn_INTEGER2long(st, &value)) + _ASN_DECODE_FAILED; + if(asn_long2INTEGER(st, value + ct->lower_bound)) + _ASN_DECODE_FAILED; + } + + return rval; } int diff --git a/skeletons/INTEGER.h b/skeletons/INTEGER.h index 165c055f3..410fbe900 100644 --- a/skeletons/INTEGER.h +++ b/skeletons/INTEGER.h @@ -28,7 +28,7 @@ typedef struct asn_INTEGER_specifics_s { asn_INTEGER_enum_map_t *value2enum; /* N -> "tag"; sorted by N */ unsigned int *enum2value; /* "tag" => N; sorted by tag */ int map_count; /* Elements in either map */ - int extensible; /* This map is extensible */ + int extension; /* This map is extensible */ int strict_enumeration; /* Enumeration set is fixed */ } asn_INTEGER_specifics_t; @@ -37,6 +37,7 @@ ber_type_decoder_f INTEGER_decode_ber; der_type_encoder_f INTEGER_encode_der; xer_type_decoder_f INTEGER_decode_xer; xer_type_encoder_f INTEGER_encode_xer; +per_type_decoder_f INTEGER_decode_uper; /*********************************** * Some handy conversion routines. * diff --git a/skeletons/ISO646String.c b/skeletons/ISO646String.c index 035734b56..829af3282 100644 --- a/skeletons/ISO646String.c +++ b/skeletons/ISO646String.c @@ -22,6 +22,7 @@ asn_TYPE_descriptor_t asn_DEF_ISO646String = { OCTET_STRING_encode_der, OCTET_STRING_decode_xer_utf8, OCTET_STRING_encode_xer_utf8, + 0, 0, /* Use generic outmost tag fetcher */ asn_DEF_ISO646String_tags, sizeof(asn_DEF_ISO646String_tags) @@ -29,6 +30,7 @@ asn_TYPE_descriptor_t asn_DEF_ISO646String = { asn_DEF_ISO646String_tags, sizeof(asn_DEF_ISO646String_tags) / sizeof(asn_DEF_ISO646String_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/NULL.c b/skeletons/NULL.c index 5b0351e30..504be9545 100644 --- a/skeletons/NULL.c +++ b/skeletons/NULL.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Copyright (c) 2003, 2005 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include @@ -23,11 +23,13 @@ asn_TYPE_descriptor_t asn_DEF_NULL = { NULL_encode_der, /* Special handling of DER encoding */ NULL_decode_xer, NULL_encode_xer, + NULL_decode_uper, /* Unaligned PER decoder */ 0, /* Use generic outmost tag fetcher */ asn_DEF_NULL_tags, sizeof(asn_DEF_NULL_tags) / sizeof(asn_DEF_NULL_tags[0]), asn_DEF_NULL_tags, /* Same as above */ sizeof(asn_DEF_NULL_tags) / sizeof(asn_DEF_NULL_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -44,7 +46,7 @@ NULL_encode_der(asn_TYPE_descriptor_t *td, void *ptr, erval.structure_ptr = ptr; } - return erval; + _ASN_ENCODED_OK(erval); } asn_enc_rval_t @@ -62,8 +64,7 @@ NULL_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, /* XMLNullValue is empty */ er.encoded = 0; - - return er; + _ASN_ENCODED_OK(er); } @@ -101,3 +102,31 @@ NULL_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, return (cb("", 8, app_key) < 0) ? -1 : 0; } } + +asn_dec_rval_t +NULL_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_dec_rval_t rv; + + (void)opt_codec_ctx; + (void)td; + (void)constraints; + (void)pd; + + if(!*sptr) { + *sptr = MALLOC(sizeof(NULL_t)); + if(*sptr) { + *(NULL_t *)*sptr = 0; + } else { + _ASN_DECODE_FAILED; + } + } + + /* + * NULL type does not have content octets. + */ + + rv.code = RC_OK; + rv.consumed = 0; + return rv; +} diff --git a/skeletons/NULL.h b/skeletons/NULL.h index 28a3630e1..7126e1df8 100644 --- a/skeletons/NULL.h +++ b/skeletons/NULL.h @@ -23,6 +23,7 @@ asn_struct_print_f NULL_print; der_type_encoder_f NULL_encode_der; xer_type_decoder_f NULL_decode_xer; xer_type_encoder_f NULL_encode_xer; +per_type_decoder_f NULL_decode_uper; #ifdef __cplusplus } diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c index fb77e06da..e130749fc 100644 --- a/skeletons/NativeEnumerated.c +++ b/skeletons/NativeEnumerated.c @@ -28,11 +28,13 @@ asn_TYPE_descriptor_t asn_DEF_NativeEnumerated = { NativeInteger_encode_der, NativeInteger_decode_xer, NativeEnumerated_encode_xer, + NativeEnumerated_decode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_NativeEnumerated_tags, sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]), asn_DEF_NativeEnumerated_tags, /* Same as above */ sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -59,13 +61,65 @@ NativeEnumerated_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, er.encoded = snprintf(src, srcsize, "<%s/>", el->enum_name); assert(er.encoded > 0 && (size_t)er.encoded < srcsize); if(cb(src, er.encoded, app_key) < 0) _ASN_ENCODE_FAILED; - return er; + _ASN_ENCODED_OK(er); } else { ASN_DEBUG("ASN.1 forbids dealing with " "unknown value of ENUMERATED type"); _ASN_ENCODE_FAILED; } +} + +asn_dec_rval_t +NativeEnumerated_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_INTEGER_specifics_t *specs = (asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval = { RC_OK, 0 }; + long *native = (long *)*sptr; + asn_per_constraint_t *ct; + long value; + + (void)opt_codec_ctx; + + if(constraints) ct = &constraints->value; + else if(td->per_constraints) ct = &td->per_constraints->value; + else _ASN_DECODE_FAILED; /* Mandatory! */ + if(!specs) _ASN_DECODE_FAILED; + + if(!native) { + native = (long *)(*sptr = CALLOC(1, sizeof(*native))); + if(!native) _ASN_DECODE_FAILED; + } + + ASN_DEBUG("Decoding %s as NativeEnumerated", td->name); + + if(ct->flags & APC_EXTENSIBLE) { + int inext = per_get_few_bits(pd, 1); + if(inext < 0) _ASN_DECODE_FAILED; + if(inext) ct = 0; + } + + if(ct && ct->range_bits >= 0) { + value = per_get_few_bits(pd, ct->range_bits); + if(value < 0) _ASN_DECODE_FAILED; + if(value >= (specs->extension + ? specs->extension - 1 : specs->map_count)) + _ASN_DECODE_FAILED; + } else { + if(!specs->extension) + _ASN_DECODE_FAILED; + /* + * X.691, #10.6: normally small non-negative whole number; + */ + value = uper_get_nsnnwn(pd); + if(value < 0) _ASN_DECODE_FAILED; + value += specs->extension - 1; + if(value >= specs->map_count) + _ASN_DECODE_FAILED; + } + + *native = specs->value2enum[value].nat_value; + ASN_DEBUG("Decoded %s = %ld", td->name, *native); - return er; + return rval; } diff --git a/skeletons/NativeEnumerated.h b/skeletons/NativeEnumerated.h index 7e2bb1b93..5792beed2 100644 --- a/skeletons/NativeEnumerated.h +++ b/skeletons/NativeEnumerated.h @@ -21,6 +21,7 @@ extern "C" { extern asn_TYPE_descriptor_t asn_DEF_NativeEnumerated; xer_type_encoder_f NativeEnumerated_encode_xer; +per_type_decoder_f NativeEnumerated_decode_uper; #ifdef __cplusplus } diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index 96c787569..2e44eaa69 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -28,11 +28,13 @@ asn_TYPE_descriptor_t asn_DEF_NativeInteger = { NativeInteger_encode_der, NativeInteger_decode_xer, NativeInteger_encode_xer, + NativeInteger_decode_uper, /* Unaligned PER decoder */ 0, /* Use generic outmost tag fetcher */ asn_DEF_NativeInteger_tags, sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]), asn_DEF_NativeInteger_tags, /* Same as above */ sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -108,18 +110,6 @@ NativeInteger_decode_ber(asn_codec_ctx_t *opt_codec_ctx, } *native = l; - - /* - * Note that native integer size might be other than long. - * This expression hopefully will be optimized away - * by compiler. - */ - if(sizeof(*native) != sizeof(long) && ((long)*native != l)) { - *native = 0; /* Safe value */ - rval.code = RC_FAIL; - rval.consumed = 0; - return rval; - } } rval.code = RC_OK; @@ -176,38 +166,25 @@ NativeInteger_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, const void *buf_ptr, size_t size) { asn_dec_rval_t rval; - INTEGER_t *st = 0; + INTEGER_t st; void *st_ptr = (void *)&st; long *native = (long *)*sptr; if(!native) { - *sptr = CALLOC(1, sizeof(int)); - native = (long *)*sptr; - if(!native) { - rval.code = RC_FAIL; - rval.consumed = 0; - return rval; - } + native = (long *)(*sptr = CALLOC(1, sizeof(*native))); + if(!native) _ASN_DECODE_FAILED; } - rval = INTEGER_decode_xer(opt_codec_ctx, td, (void **)st_ptr, + memset(&st, 0, sizeof(st)); + rval = INTEGER_decode_xer(opt_codec_ctx, td, &st_ptr, opt_mname, buf_ptr, size); if(rval.code == RC_OK) { long l; - if(asn_INTEGER2long(st, &l)) { + if(asn_INTEGER2long(&st, &l)) { rval.code = RC_FAIL; rval.consumed = 0; } else { *native = l; - - /* Native type might be shorter than long */ - if(sizeof(*native) != sizeof(long) - && ((long)*native != l)) { - *native = 0; /* Safe value */ - rval.code = RC_FAIL; - rval.consumed = 0; - return rval; - } } } else { /* @@ -217,7 +194,7 @@ NativeInteger_decode_xer(asn_codec_ctx_t *opt_codec_ctx, */ rval.consumed = 0; } - asn_DEF_INTEGER.free_struct(&asn_DEF_INTEGER, st, 0); + asn_DEF_INTEGER.free_struct(&asn_DEF_INTEGER, &st, 1); return rval; } @@ -240,7 +217,39 @@ NativeInteger_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, || cb(scratch, er.encoded, app_key) < 0) _ASN_ENCODE_FAILED; - return er; + _ASN_ENCODED_OK(er); +} + +asn_dec_rval_t +NativeInteger_decode_uper(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + + asn_dec_rval_t rval; + long *native = (long *)*sptr; + INTEGER_t tmpint; + void *tmpintptr = &tmpint; + + (void)opt_codec_ctx; + ASN_DEBUG("Decoding NativeInteger %s (UPER)", td->name); + + if(!native) { + native = (long *)(*sptr = CALLOC(1, sizeof(*native))); + if(!native) _ASN_DECODE_FAILED; + } + + memset(&tmpint, 0, sizeof tmpint); + rval = INTEGER_decode_uper(opt_codec_ctx, td, constraints, + &tmpintptr, pd); + if(rval.code == RC_OK) + if(asn_INTEGER2long(&tmpint, native)) + rval.code = RC_FAIL; + else + ASN_DEBUG("NativeInteger %s got value %ld", + td->name, *native); + asn_DEF_INTEGER.free_struct(&asn_DEF_INTEGER, &tmpint, 1); + + return rval; } /* diff --git a/skeletons/NativeInteger.h b/skeletons/NativeInteger.h index f38fd477c..e2ce22e94 100644 --- a/skeletons/NativeInteger.h +++ b/skeletons/NativeInteger.h @@ -27,6 +27,7 @@ ber_type_decoder_f NativeInteger_decode_ber; der_type_encoder_f NativeInteger_encode_der; xer_type_decoder_f NativeInteger_decode_xer; xer_type_encoder_f NativeInteger_encode_xer; +per_type_decoder_f NativeInteger_decode_uper; #ifdef __cplusplus } diff --git a/skeletons/NativeReal.c b/skeletons/NativeReal.c index f7755db16..9b303681f 100644 --- a/skeletons/NativeReal.c +++ b/skeletons/NativeReal.c @@ -29,11 +29,13 @@ asn_TYPE_descriptor_t asn_DEF_NativeReal = { NativeReal_encode_der, NativeReal_decode_xer, NativeReal_encode_xer, + 0, 0, /* Use generic outmost tag fetcher */ asn_DEF_NativeReal_tags, sizeof(asn_DEF_NativeReal_tags) / sizeof(asn_DEF_NativeReal_tags[0]), asn_DEF_NativeReal_tags, /* Same as above */ sizeof(asn_DEF_NativeReal_tags) / sizeof(asn_DEF_NativeReal_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -206,7 +208,7 @@ NativeReal_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, er.encoded = REAL__dump(*Dbl, flags & XER_F_CANONICAL, cb, app_key); if(er.encoded < 0) _ASN_ENCODE_FAILED; - return er; + _ASN_ENCODED_OK(er); } /* diff --git a/skeletons/NumericString.c b/skeletons/NumericString.c index 39404c25e..e3302c6a7 100644 --- a/skeletons/NumericString.c +++ b/skeletons/NumericString.c @@ -22,6 +22,7 @@ asn_TYPE_descriptor_t asn_DEF_NumericString = { OCTET_STRING_encode_der, OCTET_STRING_decode_xer_utf8, OCTET_STRING_encode_xer_utf8, + 0, 0, /* Use generic outmost tag fetcher */ asn_DEF_NumericString_tags, sizeof(asn_DEF_NumericString_tags) @@ -29,6 +30,7 @@ asn_TYPE_descriptor_t asn_DEF_NumericString = { asn_DEF_NumericString_tags, sizeof(asn_DEF_NumericString_tags) / sizeof(asn_DEF_NumericString_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index e815d480b..0c45e4d93 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -23,6 +23,7 @@ asn_TYPE_descriptor_t asn_DEF_OBJECT_IDENTIFIER = { der_encode_primitive, OBJECT_IDENTIFIER_decode_xer, OBJECT_IDENTIFIER_encode_xer, + 0, 0, /* Use generic outmost tag fetcher */ asn_DEF_OBJECT_IDENTIFIER_tags, sizeof(asn_DEF_OBJECT_IDENTIFIER_tags) @@ -30,6 +31,7 @@ asn_TYPE_descriptor_t asn_DEF_OBJECT_IDENTIFIER = { asn_DEF_OBJECT_IDENTIFIER_tags, /* Same as above */ sizeof(asn_DEF_OBJECT_IDENTIFIER_tags) / sizeof(asn_DEF_OBJECT_IDENTIFIER_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -332,9 +334,7 @@ OBJECT_IDENTIFIER_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, er.encoded = OBJECT_IDENTIFIER__dump_body(st, cb, app_key); if(er.encoded < 0) _ASN_ENCODE_FAILED; - er.structure_ptr = 0; - er.failed_type = 0; - return er; + _ASN_ENCODED_OK(er); } int diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 447b2425b..fe29f83f6 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -19,6 +19,9 @@ static asn_OCTET_STRING_specifics_t asn_DEF_OCTET_STRING_specs = { offsetof(OCTET_STRING_t, _asn_ctx), 0 }; +static asn_per_constraint_t asn_DEF_OCTET_STRING_constraint = { + APC_SEMI_CONSTRAINED, -1, 0, 0, 0 +}; asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { "OCTET STRING", /* Canonical name */ "OCTET_STRING", /* XML tag name */ @@ -29,6 +32,7 @@ asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { OCTET_STRING_encode_der, OCTET_STRING_decode_xer_hex, OCTET_STRING_encode_xer, + OCTET_STRING_decode_uper, /* Unaligned PER decoder */ 0, /* Use generic outmost tag fetcher */ asn_DEF_OCTET_STRING_tags, sizeof(asn_DEF_OCTET_STRING_tags) @@ -36,6 +40,7 @@ asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { asn_DEF_OCTET_STRING_tags, /* Same as above */ sizeof(asn_DEF_OCTET_STRING_tags) / sizeof(asn_DEF_OCTET_STRING_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ &asn_DEF_OCTET_STRING_specs }; @@ -61,9 +66,10 @@ asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { #undef RETURN #define RETURN(_code) do { \ - rval.code = _code; \ - rval.consumed = consumed_myself; \ - return rval; \ + asn_dec_rval_t tmprval; \ + tmprval.code = _code; \ + tmprval.consumed = consumed_myself; \ + return tmprval; \ } while(0) #undef APPEND @@ -167,11 +173,11 @@ _new_stack() { asn_dec_rval_t OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, - void **os_structure, const void *buf_ptr, size_t size, int tag_mode) { + void **sptr, const void *buf_ptr, size_t size, int tag_mode) { asn_OCTET_STRING_specifics_t *specs = td->specifics ? (asn_OCTET_STRING_specifics_t *)td->specifics : &asn_DEF_OCTET_STRING_specs; - BIT_STRING_t *st = (BIT_STRING_t *)*os_structure; + BIT_STRING_t *st = (BIT_STRING_t *)*sptr; asn_dec_rval_t rval; asn_struct_ctx_t *ctx; ssize_t consumed_myself = 0; @@ -190,10 +196,8 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, * Create the string if does not exist. */ if(st == NULL) { - *os_structure = CALLOC(1, specs->struct_size); - st = (BIT_STRING_t *)*os_structure; - if(st == NULL) - RETURN(RC_FAIL); + st = (BIT_STRING_t *)(*sptr = CALLOC(1, specs->struct_size)); + if(st == NULL) RETURN(RC_FAIL); } /* Restore parsing context */ @@ -549,9 +553,7 @@ OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *sptr, if(!cb) { er.encoded += (type_variant == _TT_BIT_STRING) + st->size; - er.structure_ptr = 0; - er.failed_type = 0; - return er; + _ASN_ENCODED_OK(er); } /* @@ -574,9 +576,7 @@ OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *sptr, } er.encoded += st->size; - er.structure_ptr = 0; - er.failed_type = 0; - return er; + _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } @@ -639,9 +639,7 @@ OCTET_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, } } - er.structure_ptr = 0; - er.failed_type = 0; - return er; + _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } @@ -781,9 +779,7 @@ OCTET_STRING_encode_xer_utf8(asn_TYPE_descriptor_t *td, void *sptr, _ASN_ENCODE_FAILED; er.encoded = encoded_len; - er.structure_ptr = 0; - er.failed_type = 0; - return er; + _ASN_ENCODED_OK(er); } /* @@ -1200,6 +1196,99 @@ OCTET_STRING_decode_xer_utf8(asn_codec_ctx_t *opt_codec_ctx, OCTET_STRING__convert_entrefs); } +asn_dec_rval_t +OCTET_STRING_decode_uper(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, + void **sptr, asn_per_data_t *pd) { + + asn_OCTET_STRING_specifics_t *specs = td->specifics + ? (asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_DEF_OCTET_STRING_specs; + asn_per_constraint_t *ct = constraints ? &constraints->size + : (td->per_constraints + ? &td->per_constraints->size + : &asn_DEF_OCTET_STRING_constraint); + asn_dec_rval_t rval = { RC_OK, 0 }; + BIT_STRING_t *st = (BIT_STRING_t *)*sptr; + ssize_t consumed_myself = 0; + int repeat; + int unit_bits = (specs->subvariant != 1) * 7 + 1; + + (void)opt_codec_ctx; + + /* + * Allocate the string. + */ + if(!st) { + st = (BIT_STRING_t *)(*sptr = CALLOC(1, specs->struct_size)); + if(!st) RETURN(RC_FAIL); + } + + if(ct->flags & APC_EXTENSIBLE) { + int inext = per_get_few_bits(pd, 1); + if(inext < 0) RETURN(RC_FAIL); + if(inext) ct = &asn_DEF_OCTET_STRING_constraint; + consumed_myself = 0; + } + + if(ct->effective_bits >= 0 + && (!st->buf || st->size < ct->upper_bound)) { + FREEMEM(st->buf); + if(unit_bits == 1) { + st->size = (ct->upper_bound + 7) >> 3; + } else { + st->size = ct->upper_bound; + } + st->buf = (uint8_t *)MALLOC(st->size + 1); + if(!st->buf) { st->size = 0; RETURN(RC_FAIL); } + } + + /* X.691, #16.5: zero-length encoding */ + /* X.691, #16.6: short fixed length encoding (up to 2 octets) */ + /* X.691, #16.7: long fixed length encoding (up to 64K octets) */ + if(ct->effective_bits == 0) { + int ret = per_get_many_bits(pd, st->buf, 0, + unit_bits * ct->upper_bound); + if(ret < 0) RETURN(RC_FAIL); + consumed_myself += unit_bits * ct->upper_bound; + st->buf[st->size] = 0; + if(unit_bits == 1 && (ct->upper_bound & 0x7)) + st->bits_unused = 8 - (ct->upper_bound & 0x7); + RETURN(RC_OK); + } + + st->size = 0; + do { + ssize_t len_bytes; + ssize_t len_bits; + void *p; + int ret; + + /* Get the PER length */ + len_bits = uper_get_length(pd, ct->effective_bits, &repeat); + if(len_bits < 0) RETURN(RC_FAIL); + + if(unit_bits == 1) { + len_bytes = (len_bits + 7) >> 3; + if(len_bits & 0x7) + st->bits_unused = 8 - (len_bits & 0x7); + /* len_bits be multiple of 16K if repeat is set */ + } else { + len_bytes = len_bits; + len_bits = len_bytes << 3; + } + p = REALLOC(st->buf, st->size + len_bytes + 1); + if(!p) RETURN(RC_FAIL); + st->buf = (uint8_t *)p; + + ret = per_get_many_bits(pd, &st->buf[st->size], 0, len_bits); + if(ret < 0) RETURN(RC_FAIL); + st->size += len_bytes; + } while(repeat); + st->buf[st->size] = 0; /* nul-terminate */ + + return rval; +} int OCTET_STRING_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, diff --git a/skeletons/OCTET_STRING.h b/skeletons/OCTET_STRING.h index 94c19a0b2..22bd6272b 100644 --- a/skeletons/OCTET_STRING.h +++ b/skeletons/OCTET_STRING.h @@ -30,6 +30,7 @@ xer_type_decoder_f OCTET_STRING_decode_xer_binary; /* 01010111010 */ xer_type_decoder_f OCTET_STRING_decode_xer_utf8; /* ASCII/UTF-8 */ xer_type_encoder_f OCTET_STRING_encode_xer; xer_type_encoder_f OCTET_STRING_encode_xer_utf8; +per_type_decoder_f OCTET_STRING_decode_uper; /****************************** * Handy conversion routines. * diff --git a/skeletons/ObjectDescriptor.c b/skeletons/ObjectDescriptor.c index 9f52147e0..37f51e8cc 100644 --- a/skeletons/ObjectDescriptor.c +++ b/skeletons/ObjectDescriptor.c @@ -22,6 +22,7 @@ asn_TYPE_descriptor_t asn_DEF_ObjectDescriptor = { OCTET_STRING_encode_der, OCTET_STRING_decode_xer_utf8, OCTET_STRING_encode_xer_utf8, + 0, 0, /* Use generic outmost tag fetcher */ asn_DEF_ObjectDescriptor_tags, sizeof(asn_DEF_ObjectDescriptor_tags) @@ -29,6 +30,7 @@ asn_TYPE_descriptor_t asn_DEF_ObjectDescriptor = { asn_DEF_ObjectDescriptor_tags, sizeof(asn_DEF_ObjectDescriptor_tags) / sizeof(asn_DEF_ObjectDescriptor_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/PrintableString.c b/skeletons/PrintableString.c index bc48c0f87..57f65731c 100644 --- a/skeletons/PrintableString.c +++ b/skeletons/PrintableString.c @@ -22,6 +22,7 @@ asn_TYPE_descriptor_t asn_DEF_PrintableString = { OCTET_STRING_encode_der, OCTET_STRING_decode_xer_utf8, OCTET_STRING_encode_xer_utf8, + 0, 0, /* Use generic outmost tag fetcher */ asn_DEF_PrintableString_tags, sizeof(asn_DEF_PrintableString_tags) @@ -29,6 +30,7 @@ asn_TYPE_descriptor_t asn_DEF_PrintableString = { asn_DEF_PrintableString_tags, sizeof(asn_DEF_PrintableString_tags) / sizeof(asn_DEF_PrintableString_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/README b/skeletons/README index 29dbae634..92201ed93 100644 --- a/skeletons/README +++ b/skeletons/README @@ -1,6 +1,4 @@ - -Here are the canonical encoder/decoder algorithms that work with the tables -constructed by the compiler. The compiler itself does not generate code, -it just creates those tables and then copies (links) over these files -which contain generic algorithms. - +This directory contains encoder/decoder code for various encoding rules +(PER, DER, BER, XER) that work with the tables constructed by the compiler. +The compiler itself does not generate much code. It creates parsing tables +and then copies (links) over these files which contain generic codecs. diff --git a/skeletons/REAL.c b/skeletons/REAL.c index c48015389..689b05ec6 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -42,11 +42,13 @@ asn_TYPE_descriptor_t asn_DEF_REAL = { der_encode_primitive, REAL_decode_xer, REAL_encode_xer, + 0, 0, /* Use generic outmost tag fetcher */ asn_DEF_REAL_tags, sizeof(asn_DEF_REAL_tags) / sizeof(asn_DEF_REAL_tags[0]), asn_DEF_REAL_tags, /* Same as above */ sizeof(asn_DEF_REAL_tags) / sizeof(asn_DEF_REAL_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -257,9 +259,7 @@ REAL_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, er.encoded = REAL__dump(d, flags & XER_F_CANONICAL, cb, app_key); if(er.encoded < 0) _ASN_ENCODE_FAILED; - er.structure_ptr = 0; - er.failed_type = 0; - return er; + _ASN_ENCODED_OK(er); } diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index 2b32315eb..74511b7b8 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -25,6 +25,7 @@ asn_TYPE_descriptor_t asn_DEF_RELATIVE_OID = { der_encode_primitive, RELATIVE_OID_decode_xer, RELATIVE_OID_encode_xer, + 0, 0, /* Use generic outmost tag fetcher */ asn_DEF_RELATIVE_OID_tags, sizeof(asn_DEF_RELATIVE_OID_tags) @@ -32,6 +33,7 @@ asn_TYPE_descriptor_t asn_DEF_RELATIVE_OID = { asn_DEF_RELATIVE_OID_tags, /* Same as above */ sizeof(asn_DEF_RELATIVE_OID_tags) / sizeof(asn_DEF_RELATIVE_OID_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -156,9 +158,7 @@ RELATIVE_OID_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, er.encoded = RELATIVE_OID__dump_body(st, cb, app_key); if(er.encoded < 0) _ASN_ENCODE_FAILED; - er.structure_ptr = 0; - er.failed_type = 0; - return er; + _ASN_ENCODED_OK(er); } int diff --git a/skeletons/T61String.c b/skeletons/T61String.c index a37c176ed..4157a6b21 100644 --- a/skeletons/T61String.c +++ b/skeletons/T61String.c @@ -22,6 +22,7 @@ asn_TYPE_descriptor_t asn_DEF_T61String = { OCTET_STRING_encode_der, OCTET_STRING_decode_xer_hex, OCTET_STRING_encode_xer, + 0, 0, /* Use generic outmost tag fetcher */ asn_DEF_T61String_tags, sizeof(asn_DEF_T61String_tags) @@ -29,6 +30,7 @@ asn_TYPE_descriptor_t asn_DEF_T61String = { asn_DEF_T61String_tags, sizeof(asn_DEF_T61String_tags) / sizeof(asn_DEF_T61String_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/TeletexString.c b/skeletons/TeletexString.c index 47aad419d..11f570330 100644 --- a/skeletons/TeletexString.c +++ b/skeletons/TeletexString.c @@ -22,6 +22,7 @@ asn_TYPE_descriptor_t asn_DEF_TeletexString = { OCTET_STRING_encode_der, OCTET_STRING_decode_xer_hex, OCTET_STRING_encode_xer, + 0, 0, /* Use generic outmost tag fetcher */ asn_DEF_TeletexString_tags, sizeof(asn_DEF_TeletexString_tags) @@ -29,6 +30,7 @@ asn_TYPE_descriptor_t asn_DEF_TeletexString = { asn_DEF_TeletexString_tags, sizeof(asn_DEF_TeletexString_tags) / sizeof(asn_DEF_TeletexString_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c index c2079fbdc..9032dbd66 100644 --- a/skeletons/UTCTime.c +++ b/skeletons/UTCTime.c @@ -28,6 +28,7 @@ asn_TYPE_descriptor_t asn_DEF_UTCTime = { OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ OCTET_STRING_decode_xer_utf8, UTCTime_encode_xer, + 0, 0, /* Use generic outmost tag fetcher */ asn_DEF_UTCTime_tags, sizeof(asn_DEF_UTCTime_tags) @@ -35,6 +36,7 @@ asn_TYPE_descriptor_t asn_DEF_UTCTime = { asn_DEF_UTCTime_tags, sizeof(asn_DEF_UTCTime_tags) / sizeof(asn_DEF_UTCTime_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/UTF8String.c b/skeletons/UTF8String.c index 64b3a712c..5d0334f97 100644 --- a/skeletons/UTF8String.c +++ b/skeletons/UTF8String.c @@ -22,6 +22,7 @@ asn_TYPE_descriptor_t asn_DEF_UTF8String = { OCTET_STRING_encode_der, OCTET_STRING_decode_xer_utf8, OCTET_STRING_encode_xer_utf8, + 0, 0, /* Use generic outmost tag fetcher */ asn_DEF_UTF8String_tags, sizeof(asn_DEF_UTF8String_tags) @@ -29,6 +30,7 @@ asn_TYPE_descriptor_t asn_DEF_UTF8String = { asn_DEF_UTF8String_tags, sizeof(asn_DEF_UTF8String_tags) / sizeof(asn_DEF_UTF8String_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/UniversalString.c b/skeletons/UniversalString.c index 938bf07be..0fab915f9 100644 --- a/skeletons/UniversalString.c +++ b/skeletons/UniversalString.c @@ -23,6 +23,7 @@ asn_TYPE_descriptor_t asn_DEF_UniversalString = { OCTET_STRING_encode_der, UniversalString_decode_xer, /* Convert from UTF-8 */ UniversalString_encode_xer, /* Convert into UTF-8 */ + 0, 0, /* Use generic outmost tag fetcher */ asn_DEF_UniversalString_tags, sizeof(asn_DEF_UniversalString_tags) @@ -30,6 +31,7 @@ asn_TYPE_descriptor_t asn_DEF_UniversalString = { asn_DEF_UniversalString_tags, sizeof(asn_DEF_UniversalString_tags) / sizeof(asn_DEF_UniversalString_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -167,7 +169,7 @@ UniversalString_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, er.encoded = UniversalString__dump(st, cb, app_key); if(er.encoded < 0) _ASN_ENCODE_FAILED; - return er; + _ASN_ENCODED_OK(er); } int diff --git a/skeletons/VideotexString.c b/skeletons/VideotexString.c index 2a2baa81c..c51c31aa5 100644 --- a/skeletons/VideotexString.c +++ b/skeletons/VideotexString.c @@ -22,6 +22,7 @@ asn_TYPE_descriptor_t asn_DEF_VideotexString = { OCTET_STRING_encode_der, OCTET_STRING_decode_xer_hex, OCTET_STRING_encode_xer, + 0, 0, /* Use generic outmost tag fetcher */ asn_DEF_VideotexString_tags, sizeof(asn_DEF_VideotexString_tags) @@ -29,6 +30,7 @@ asn_TYPE_descriptor_t asn_DEF_VideotexString = { asn_DEF_VideotexString_tags, sizeof(asn_DEF_VideotexString_tags) / sizeof(asn_DEF_VideotexString_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/VisibleString.c b/skeletons/VisibleString.c index 30f294558..2a88169d2 100644 --- a/skeletons/VisibleString.c +++ b/skeletons/VisibleString.c @@ -22,6 +22,7 @@ asn_TYPE_descriptor_t asn_DEF_VisibleString = { OCTET_STRING_encode_der, OCTET_STRING_decode_xer_utf8, OCTET_STRING_encode_xer_utf8, + 0, 0, /* Use generic outmost tag fetcher */ asn_DEF_VisibleString_tags, sizeof(asn_DEF_VisibleString_tags) @@ -29,6 +30,7 @@ asn_TYPE_descriptor_t asn_DEF_VisibleString = { asn_DEF_VisibleString_tags, sizeof(asn_DEF_VisibleString_tags) / sizeof(asn_DEF_VisibleString_tags[0]), + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/skeletons/asn-decoder-template.c b/skeletons/asn-decoder-template.c index 348c3731d..c50d8b9c1 100644 --- a/skeletons/asn-decoder-template.c +++ b/skeletons/asn-decoder-template.c @@ -21,7 +21,9 @@ #include extern asn_TYPE_descriptor_t asn_DEF; /* ASN.1 type to be decoded */ -static asn_TYPE_descriptor_t *pduType = &asn_DEF; +#ifdef ASN_PDU_COLLECTION /* Generated by asn1c: -pdu=... */ +extern asn_TYPE_descriptor_t *asn_pdu_collection[]; +#endif /* * Open file and parse its contens. @@ -37,7 +39,8 @@ static int opt_stack; /* -s */ /* Input data format selector */ static enum input_format { INP_BER, /* -iber: BER input */ - INP_XER /* -ixer: XER input */ + INP_XER, /* -ixer: XER input */ + INP_PER /* -iper: Unaligned PER input */ } iform; /* -i */ /* Output data format selector */ @@ -56,19 +59,26 @@ static enum output_format { int main(int ac, char **av) { + static asn_TYPE_descriptor_t *pduType = &asn_DEF; ssize_t suggested_bufsize = 8192; /* close or equal to stdio buffer */ int number_of_iterations = 1; int num; int ch; + /* Figure out if Unaligned PER needs to be default */ + if(pduType->uper_decoder) + iform = INP_PER; + /* * Pocess the command-line argments. */ - while((ch = getopt(ac, av, "i:o:b:cdn:hs:")) != -1) + while((ch = getopt(ac, av, "i:o:b:cdn:p:hs:")) != -1) switch(ch) { case 'i': if(optarg[0] == 'b') { iform = INP_BER; break; } if(optarg[0] == 'x') { iform = INP_XER; break; } + if(pduType->uper_decoder + && optarg[0] == 'p') { iform = INP_PER; break; } fprintf(stderr, "-i: '%s': improper format selector", optarg); exit(EX_UNAVAILABLE); @@ -80,6 +90,21 @@ main(int ac, char **av) { fprintf(stderr, "-o: '%s': improper format selector", optarg); exit(EX_UNAVAILABLE); + case 'p': +#ifdef ASN_PDU_COLLECTION + { + asn_TYPE_descriptor_t **pdu = asn_pdu_collection; + if(optarg[0] < 'A' || optarg[0] > 'Z') { + fprintf(stderr, "Available PDU types:\n"); + for(; *pdu; pdu++) printf("%s\n", (*pdu)->name); + exit(0); + } + while(*pdu && strcmp((*pdu)->name, optarg)) pdu++; + if(*pdu) { pduType = *pdu; break; } + } +#endif /* ASN_PDU_COLLECTION */ + fprintf(stderr, "-p %s: Unrecognized PDU\n", optarg); + exit(EX_UNAVAILABLE); case 'b': suggested_bufsize = atoi(optarg); if(suggested_bufsize < 1 @@ -115,21 +140,32 @@ main(int ac, char **av) { break; case 'h': default: + fprintf(stderr, "Usage: %s [options] ...\n", av[0]); + fprintf(stderr, "Where options are:\n"); + if(pduType->uper_decoder) + fprintf(stderr, + " -iper (I) Input is in Unaligned PER (Packed Encoding Rules)\n"); + fprintf(stderr, + " -iber %s Input is in BER (Basic Encoding Rules)\n", + iform == INP_PER ? " " : "(I)"); fprintf(stderr, - "Usage: %s [options] ...\n" - "Where options are:\n" - " -iber (I) Input is in BER (Basic Encoding Rules)\n" " -ixer Input is in XER (XML Encoding Rules)\n" " -oder Output in DER (Distinguished Encoding Rules)\n" " -oxer (O) Output in XER (XML Encoding Rules)\n" " -otext Output in plain semi-structured text (dump)\n" - " -onull Verify (decode) input, but do not output\n" + " -onull Verify (decode) input, but do not output\n"); +#ifdef ASN_PDU_COLLECTION + fprintf(stderr, + " -p Specify PDU type to decode\n" + " -p list List available PDUs\n"); +#endif /* ASN_PDU_COLLECTION */ + fprintf(stderr, " -b Set the i/o buffer size (default is %ld)\n" " -c Check ASN.1 constraints after decoding\n" " -d Enable debugging (-dd is even better)\n" " -n Process files times\n" " -s Set the stack usage limit\n" - , av[0], (long)suggested_bufsize); + , (long)suggested_bufsize); exit(EX_USAGE); } @@ -210,7 +246,8 @@ main(int ac, char **av) { /* Dump the buffer */ static int write_out(const void *buffer, size_t size, void *key) { - return (fwrite(buffer, 1, size, key) == size) ? 0 : -1; + FILE *fp = (FILE *)key; + return (fwrite(buffer, 1, size, fp) == size) ? 0 : -1; } static char *buffer; @@ -302,6 +339,7 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *f rval.consumed = 0; while((rd = fread(fbuf, 1, fbuf_size, fp)) || !feof(fp)) { + asn_per_data_t pd; char *i_bptr; size_t i_size; @@ -330,6 +368,13 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *f rval = xer_decode(opt_codec_ctx, pduType, (void **)&structure, i_bptr, i_size); break; + case INP_PER: + pd.buffer = (uint8_t *)i_bptr; + pd.nboff = 0; + pd.nbits = i_size * 8; + rval = pduType->uper_decoder(opt_codec_ctx, pduType, 0, + (void **)&structure, &pd); + break; } DEBUG("decode(%ld) consumed %ld, code %d", (long)buf_len, (long)rval.consumed, rval.code); diff --git a/skeletons/asn_codecs.h b/skeletons/asn_codecs.h index 9250adab2..f25a79757 100644 --- a/skeletons/asn_codecs.h +++ b/skeletons/asn_codecs.h @@ -1,5 +1,6 @@ /*- - * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Copyright (c) 2003, 2004, 2005 Lev Walkin . + * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _ASN_CODECS_H_ @@ -61,6 +62,11 @@ typedef struct asn_enc_rval_s { tmp_error.structure_ptr = sptr; \ return tmp_error; \ } while(0) +#define _ASN_ENCODED_OK(rval) do { \ + rval.structure_ptr = 0; \ + rval.failed_type = 0; \ + return rval; \ +} while(0) /* * Type of the return value of the decoding functions (ber_decode, xer_decode) @@ -79,6 +85,12 @@ typedef struct asn_dec_rval_s { enum asn_dec_rval_code_e code; /* Result code */ size_t consumed; /* Number of bytes consumed */ } asn_dec_rval_t; +#define _ASN_DECODE_FAILED do { \ + asn_dec_rval_t tmp_error; \ + tmp_error.code = RC_FAIL; \ + tmp_error.consumed = 0; \ + return tmp_error; \ +} while(0) #ifdef __cplusplus } diff --git a/skeletons/asn_codecs_prim.c b/skeletons/asn_codecs_prim.c index b599bdfae..97dc22aff 100644 --- a/skeletons/asn_codecs_prim.c +++ b/skeletons/asn_codecs_prim.c @@ -119,9 +119,7 @@ der_encode_primitive(asn_TYPE_descriptor_t *td, void *sptr, } erval.encoded += st->size; - erval.structure_ptr = 0; - erval.failed_type = 0; - return erval; + _ASN_ENCODED_OK(erval); } void diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 6ab4a0bdb..d3738df37 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -118,7 +118,7 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ ASN_DEBUG("Decoding %s as CHOICE", td->name); - + /* * Create the target structure if it is not present already. */ @@ -196,7 +196,7 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, NEXT_PHASE(ctx); ctx->step = t2m->el_no; break; - } else if(specs->extensible == 0) { + } else if(specs->ext_start == -1) { ASN_DEBUG("Unexpected tag %s " "in non-extensible CHOICE %s", ber_tlv_tag_string(tlv_tag), td->name); @@ -252,16 +252,16 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, memb_ptr = (char *)st + elm->memb_offset; memb_ptr2 = &memb_ptr; } + /* Set presence to be able to free it properly at any time */ + _set_present_idx(st, specs->pres_offset, + specs->pres_size, ctx->step + 1); /* * Invoke the member fetch routine according to member's type */ rval = elm->type->ber_decoder(opt_codec_ctx, elm->type, - memb_ptr2, ptr, LEFT, - elm->tag_mode); + memb_ptr2, ptr, LEFT, elm->tag_mode); switch(rval.code) { case RC_OK: - _set_present_idx(st, specs->pres_offset, - specs->pres_size, ctx->step + 1); break; case RC_WMORE: /* More data expected */ if(!SIZE_VIOLATION) { @@ -377,7 +377,7 @@ CHOICE_encode_der(asn_TYPE_descriptor_t *td, void *sptr, if(present == 0 && td->elements_count == 0) { /* The CHOICE is empty?! */ erval.encoded = 0; - return erval; + _ASN_ENCODED_OK(erval); } _ASN_ENCODE_FAILED; } @@ -391,7 +391,7 @@ CHOICE_encode_der(asn_TYPE_descriptor_t *td, void *sptr, if(memb_ptr == 0) { if(elm->optional) { erval.encoded = 0; - return erval; + _ASN_ENCODED_OK(erval); } /* Mandatory element absent */ _ASN_ENCODE_FAILED; @@ -729,7 +729,7 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, continue; /* It is expected extension */ - if(specs->extensible) { + if(specs->ext_start != -1) { ASN_DEBUG("Got anticipated extension"); /* * Check for (XCT_BOTH or XCT_UNKNOWN_BO) @@ -810,11 +810,86 @@ CHOICE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, if(!(flags & XER_F_CANONICAL)) _i_ASN_TEXT_INDENT(1, ilevel - 1); - return er; + _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } +asn_dec_rval_t +CHOICE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + asn_dec_rval_t rv; + asn_per_constraint_t *ct; + asn_TYPE_member_t *elm; /* CHOICE's element */ + void *memb_ptr; + void **memb_ptr2; + void *st = *sptr; + int value; + + /* + * Create the target structure if it is not present already. + */ + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) _ASN_DECODE_FAILED; + } + + if(constraints) ct = &constraints->value; + else if(td->per_constraints) ct = &td->per_constraints->value; + else ct = 0; + + if(ct && ct->flags & APC_EXTENSIBLE) { + value = per_get_few_bits(pd, 1); + if(value < 0) _ASN_DECODE_FAILED; + if(value) ct = 0; /* Not restricted */ + } + + if(ct && ct->range_bits >= 0) { + value = per_get_few_bits(pd, ct->range_bits); + if(value < 0) _ASN_DECODE_FAILED; + if(value > ct->upper_bound) + _ASN_DECODE_FAILED; + ASN_DEBUG("CHOICE %s got index %d in range %d", + td->name, value, ct->range_bits); + } else { + if(specs->ext_start == -1) + _ASN_DECODE_FAILED; + value = uper_get_nsnnwn(pd); + if(value < 0) _ASN_DECODE_FAILED; + value += specs->ext_start; + if(value >= td->elements_count) + _ASN_DECODE_FAILED; + ASN_DEBUG("NOT IMPLEMENTED YET"); + _ASN_DECODE_FAILED; + } + + /* Adjust if canonical order is different from natural order */ + if(specs->canonical_order) + value = specs->canonical_order[value]; + + /* Set presence to be able to free it later */ + _set_present_idx(st, specs->pres_offset, specs->pres_size, value + 1); + + elm = &td->elements[value]; + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + ASN_DEBUG("Discovered CHOICE %s encodes %s", td->name, elm->name); + + rv = elm->type->uper_decoder(opt_codec_ctx, elm->type, + elm->per_constraints, memb_ptr2, pd); + if(rv.code != RC_OK) + ASN_DEBUG("Failed to decode %s in %s (CHOICE)", + elm->name, td->name); + return rv; +} + + int CHOICE_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { diff --git a/skeletons/constr_CHOICE.h b/skeletons/constr_CHOICE.h index 859c53296..6276d7e4b 100644 --- a/skeletons/constr_CHOICE.h +++ b/skeletons/constr_CHOICE.h @@ -1,5 +1,6 @@ /*- - * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Copyright (c) 2003, 2004, 2005 Lev Walkin . + * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _CONSTR_CHOICE_H_ @@ -26,10 +27,13 @@ typedef struct asn_CHOICE_specifics_s { asn_TYPE_tag2member_t *tag2el; int tag2el_count; + /* Canonical ordering of CHOICE elements, for PER */ + int *canonical_order; + /* * Extensions-related stuff. */ - int extensible; /* Whether CHOICE is extensible */ + int ext_start; /* First member of extensions, or -1 */ } asn_CHOICE_specifics_t; /* @@ -42,6 +46,7 @@ ber_type_decoder_f CHOICE_decode_ber; der_type_encoder_f CHOICE_encode_der; xer_type_decoder_f CHOICE_decode_xer; xer_type_encoder_f CHOICE_encode_xer; +per_type_decoder_f CHOICE_decode_uper; asn_outmost_tag_f CHOICE_outmost_tag; #ifdef __cplusplus diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 7dcb5da1e..e3dfd1d48 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -551,7 +551,7 @@ SEQUENCE_encode_der(asn_TYPE_descriptor_t *td, _ASN_ENCODE_FAILED; erval.encoded = computed_size + ret; - if(!cb) return erval; + if(!cb) _ASN_ENCODED_OK(erval); /* * Encode all members. @@ -583,7 +583,7 @@ SEQUENCE_encode_der(asn_TYPE_descriptor_t *td, */ _ASN_ENCODE_FAILED; - return erval; + _ASN_ENCODED_OK(erval); } @@ -883,7 +883,7 @@ SEQUENCE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); - return er; + _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } @@ -1014,3 +1014,135 @@ SEQUENCE_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return 0; } + +asn_dec_rval_t +SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics; + void *st = *sptr; /* Target structure. */ + int extpresent = 0; /* Extension additions are present */ + uint8_t *opres; /* Presence of optional root members */ + asn_per_data_t opmd; + asn_dec_rval_t rv; + int edx; + + (void)constraints; + + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) _ASN_DECODE_FAILED; + } + + ASN_DEBUG("Decoding %s as SEQUENCE (UPER)", td->name); + + /* Handle extensions */ + if(specs->ext_before >= 0) { + extpresent = per_get_few_bits(pd, 1); + if(extpresent < 0) _ASN_DECODE_FAILED; + } + + /* Prepare a place and read-in the presence bitmap */ + if(specs->roms_count) { + opres = (uint8_t *)MALLOC(((specs->roms_count + 7) >> 3) + 1); + if(!opres) _ASN_DECODE_FAILED; + /* Get the presence map */ + if(per_get_many_bits(pd, opres, 0, specs->roms_count)) { + FREEMEM(opres); + _ASN_DECODE_FAILED; + } + opmd.buffer = opres; + opmd.nboff = 0; + opmd.nbits = specs->roms_count; + ASN_DEBUG("Read in presence bitmap for %s of %d bits (%x..)", + td->name, specs->roms_count, *opres); + } else { + opres = 0; + memset(&opmd, 0, sizeof opmd); + } + + /* + * Get the sequence ROOT elements. + */ + for(edx = 0; edx < ((specs->ext_before < 0) + ? td->elements_count : specs->ext_before + 1); edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + /* Deal with optionality */ + if(elm->optional) { + int present = per_get_few_bits(&opmd, 1); + ASN_DEBUG("Member %s->%s is optional, p=%d (%d->%d)", + td->name, elm->name, present, + (int)opmd.nboff, (int)opmd.nbits); + if(present == 0) { + /* This element is not present */ + if(elm->default_value) { + /* Fill-in DEFAULT */ + if(elm->default_value(memb_ptr2)) { + FREEMEM(opres); + _ASN_DECODE_FAILED; + } + } + /* The member is just not present */ + continue; + } + /* Fall through */ + } + + /* Fetch the member from the stream */ + ASN_DEBUG("Decoding member %s in %s", elm->name, td->name); + rv = elm->type->uper_decoder(opt_codec_ctx, elm->type, + elm->per_constraints, memb_ptr2, pd); + if(rv.code != RC_OK) { + ASN_DEBUG("Failed decode %s in %s", + elm->name, td->name); + FREEMEM(opres); + return rv; + } + } + + /* + * Deal with extensions. + */ + if(extpresent) { + ASN_DEBUG("Extensibility for %s: NOT IMPLEMENTED", td->name); + _ASN_DECODE_FAILED; + } else { + for(edx = specs->roms_count; edx < specs->roms_count + + specs->aoms_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + if(!elm->default_value) continue; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + /* Set default value */ + if(elm->default_value(memb_ptr2)) { + FREEMEM(opres); + _ASN_DECODE_FAILED; + } + } + } + + rv.consumed = 0; + rv.code = RC_OK; + return rv; +} + diff --git a/skeletons/constr_SEQUENCE.h b/skeletons/constr_SEQUENCE.h index ab8a8ec1d..b4ee47f91 100644 --- a/skeletons/constr_SEQUENCE.h +++ b/skeletons/constr_SEQUENCE.h @@ -24,11 +24,19 @@ typedef struct asn_SEQUENCE_specifics_s { asn_TYPE_tag2member_t *tag2el; int tag2el_count; + /* + * Optional members of the extensions root (roms) or additions (aoms). + * Meaningful for PER. + */ + int *oms; /* Optional MemberS */ + int roms_count; /* Root optional members count */ + int aoms_count; /* Additions optional members count */ + /* * Description of an extensions group. */ - int ext_after; /* Extensions start after this member */ - int ext_before; /* Extensions stop before this member */ + int ext_after; /* Extensions start after this member */ + int ext_before; /* Extensions stop before this member */ } asn_SEQUENCE_specifics_t; @@ -42,6 +50,7 @@ ber_type_decoder_f SEQUENCE_decode_ber; der_type_encoder_f SEQUENCE_encode_der; xer_type_decoder_f SEQUENCE_decode_xer; xer_type_encoder_f SEQUENCE_encode_xer; +per_type_decoder_f SEQUENCE_decode_uper; #ifdef __cplusplus } diff --git a/skeletons/constr_SEQUENCE_OF.c b/skeletons/constr_SEQUENCE_OF.c index 12233a6c1..3ddd5a398 100644 --- a/skeletons/constr_SEQUENCE_OF.c +++ b/skeletons/constr_SEQUENCE_OF.c @@ -51,9 +51,7 @@ SEQUENCE_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, computed_size += encoding_size; if(!cb) { erval.encoded = computed_size; - erval.structure_ptr = 0; - erval.failed_type = 0; - return erval; + _ASN_ENCODED_OK(erval); } ASN_DEBUG("Encoding members of SEQUENCE OF %s", td->name); @@ -136,7 +134,7 @@ SEQUENCE_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); - return er; + _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } diff --git a/skeletons/constr_SEQUENCE_OF.h b/skeletons/constr_SEQUENCE_OF.h index 94b04cdcb..32078cb35 100644 --- a/skeletons/constr_SEQUENCE_OF.h +++ b/skeletons/constr_SEQUENCE_OF.h @@ -21,6 +21,7 @@ extern "C" { #define SEQUENCE_OF_constraint SET_OF_constraint #define SEQUENCE_OF_decode_ber SET_OF_decode_ber #define SEQUENCE_OF_decode_xer SET_OF_decode_xer +#define SEQUENCE_OF_decode_uper SET_OF_decode_uper der_type_encoder_f SEQUENCE_OF_encode_der; xer_type_encoder_f SEQUENCE_OF_encode_xer; diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index f99d66f49..e83abd78a 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -536,7 +536,7 @@ SET_encode_der(asn_TYPE_descriptor_t *td, if(ret == -1) _ASN_ENCODE_FAILED; er.encoded = computed_size + ret; - if(!cb) return er; + if(!cb) _ASN_ENCODED_OK(er); /* * Encode all members. @@ -570,7 +570,7 @@ SET_encode_der(asn_TYPE_descriptor_t *td, _ASN_ENCODE_FAILED; } - return er; + _ASN_ENCODED_OK(er); } #undef XER_ADVANCE @@ -857,7 +857,7 @@ SET_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); - return er; + _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index bd25b3d8a..251da390e 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -1,5 +1,6 @@ /*- - * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Copyright (c) 2003, 2004, 2005 Lev Walkin . + * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include @@ -356,7 +357,7 @@ SET_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, if(!cb) { erval.encoded = computed_size; - return erval; + _ASN_ENCODED_OK(erval); } /* @@ -448,7 +449,7 @@ SET_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, erval.encoded = computed_size; } - return erval; + _ASN_ENCODED_OK(erval); } #undef XER_ADVANCE @@ -748,7 +749,7 @@ SET_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, } free(encs); } - return er; + _ASN_ENCODED_OK(er); } int @@ -850,3 +851,88 @@ SET_OF_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return 0; } + +asn_dec_rval_t +SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_dec_rval_t rv; + asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; + asn_TYPE_member_t *elm = td->elements; /* Single one */ + void *st = *sptr; + asn_anonymous_set_ *list; + asn_per_constraint_t *ct; + int repeat = 0; + ssize_t nelems; + + /* + * Create the target structure if it is not present already. + */ + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) _ASN_DECODE_FAILED; + } + list = _A_SET_FROM_VOID(st); + + /* Figure out which constraints to use */ + if(constraints) ct = &constraints->size; + else if(td->per_constraints) ct = &td->per_constraints->size; + else ct = 0; + + if(ct && ct->flags & APC_EXTENSIBLE) { + int value = per_get_few_bits(pd, 1); + if(value < 0) _ASN_DECODE_FAILED; + if(value) ct = 0; /* Not restricted! */ + } + + if(ct && ct->effective_bits >= 0) { + /* X.691, #19.5: No length determinant */ + nelems = per_get_few_bits(pd, ct->effective_bits); + ASN_DEBUG("Preparing to fetch %ld+%ld elements from %s", + (long)nelems, ct->lower_bound, td->name); + if(nelems < 0) _ASN_DECODE_FAILED; + nelems += ct->lower_bound; + } else { + nelems = -1; + } + + do { + int i; + if(nelems < 0) { + nelems = uper_get_length(pd, + ct ? ct->effective_bits : -1, &repeat); + ASN_DEBUG("Got to decode %d elements (eff %d)", + nelems, ct ? ct->effective_bits : -1); + if(nelems < 0) _ASN_DECODE_FAILED; + } + + for(i = 0; i < nelems; i++) { + void *ptr = 0; + ASN_DEBUG("SET OF %s decoding", elm->type->name); + rv = elm->type->uper_decoder(opt_codec_ctx, elm->type, + elm->per_constraints, &ptr, pd); + ASN_DEBUG("%s SET OF %s decoded %d, %p", + td->name, elm->type->name, rv.code, ptr); + if(rv.code == RC_OK) { + if(ASN_SET_ADD(list, ptr) == 0) + continue; + ASN_DEBUG("Failed to add element into %s", + td->name); + /* Fall through */ + } else { + ASN_DEBUG("Failed decoding %s of %s (SET OF)", + elm->type->name, td->name); + } + if(ptr) elm->type->free_struct(elm->type, ptr, 0); + _ASN_DECODE_FAILED; + } + + nelems = -1; /* Allow uper_get_length() */ + } while(repeat); + + ASN_DEBUG("Decoded %s as SET OF", td->name); + + rv.code = RC_OK; + rv.consumed = 0; + return rv; +} + diff --git a/skeletons/constr_SET_OF.h b/skeletons/constr_SET_OF.h index 410be26b0..142093169 100644 --- a/skeletons/constr_SET_OF.h +++ b/skeletons/constr_SET_OF.h @@ -32,6 +32,7 @@ ber_type_decoder_f SET_OF_decode_ber; der_type_encoder_f SET_OF_encode_der; xer_type_decoder_f SET_OF_decode_xer; xer_type_encoder_f SET_OF_encode_xer; +per_type_decoder_f SET_OF_decode_uper; #ifdef __cplusplus } diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index 90b6578ce..37d21f6d9 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -1,5 +1,6 @@ /*- - * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Copyright (c) 2003, 2004, 2005 Lev Walkin . + * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ /* @@ -38,6 +39,7 @@ typedef struct asn_struct_ctx_s { #include /* Distinguished Encoding Rules encoder */ #include /* Decoder of XER (XML, text) */ #include /* Encoder into XER (XML, text) */ +#include /* Packet Encoding Rules decoder */ #include /* Subtype constraints support */ /* @@ -91,6 +93,7 @@ typedef struct asn_TYPE_descriptor_s { der_type_encoder_f *der_encoder; /* Canonical DER encoder */ xer_type_decoder_f *xer_decoder; /* Generic XER decoder */ xer_type_encoder_f *xer_encoder; /* [Canonical] XER encoder */ + per_type_decoder_f *uper_decoder; /* Unaligned PER decoder */ /*********************************************************************** * Internally useful members. Not to be used by applications directly. * @@ -105,6 +108,8 @@ typedef struct asn_TYPE_descriptor_s { ber_tlv_tag_t *all_tags;/* Every tag for BER/containment */ int all_tags_count; /* Number of tags */ + asn_per_constraints_t *per_constraints; /* PER compiled constraints */ + /* * An ASN.1 production type members (members of SEQUENCE, SET, CHOICE). */ @@ -135,6 +140,8 @@ typedef struct asn_TYPE_member_s { int tag_mode; /* IMPLICIT/no/EXPLICIT tag at current level */ asn_TYPE_descriptor_t *type; /* Member type descriptor */ asn_constr_check_f *memb_constraints; /* Constraints validator */ + asn_per_constraints_t *per_constraints; /* PER compiled constraints */ + int (*default_value)(void **sptr); /* DEFAULT */ char *name; /* ASN.1 identifier of the element */ } asn_TYPE_member_t; diff --git a/skeletons/file-dependencies b/skeletons/file-dependencies index ce9c00105..87e960981 100644 --- a/skeletons/file-dependencies +++ b/skeletons/file-dependencies @@ -9,7 +9,7 @@ ANY.h ANY.c BMPString.h BMPString.c UTF8String.h BOOLEAN.h BOOLEAN.c -ENUMERATED.h ENUMERATED.c INTEGER.h +ENUMERATED.h ENUMERATED.c INTEGER.h NativeEnumerated.h GeneralString.h GeneralString.c GeneralizedTime.h GeneralizedTime.c GraphicString.h GraphicString.c @@ -58,4 +58,10 @@ constraints.h constraints.c # Subtype constraints support xer_support.h xer_support.c # XML parsing xer_decoder.h xer_decoder.c # XER decoding support xer_encoder.h xer_encoder.c # XER encoding support +per_decoder.h per_support.h # PER declarations, just in case #asn-decoder-template.c # Template for quick decoder creation + +CODEC-PER: # THIS IS A SPECIAL SECTION +per_support.h per_support.c # PER parsing +per_decoder.h per_decoder.c # PER decoding support + diff --git a/skeletons/per_decoder.c b/skeletons/per_decoder.c new file mode 100644 index 000000000..55c04cb5d --- /dev/null +++ b/skeletons/per_decoder.c @@ -0,0 +1,2 @@ +#include +#include diff --git a/skeletons/per_decoder.h b/skeletons/per_decoder.h new file mode 100644 index 000000000..6303b3cf6 --- /dev/null +++ b/skeletons/per_decoder.h @@ -0,0 +1,55 @@ +/*- + * Copyright (c) 2005 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _PER_DECODER_H_ +#define _PER_DECODER_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/* + * Pre-computed PER constraints. + */ + enum asn_per_constraint_flags { + APC_UNCONSTRAINED = 0x0, /* No PER visible constraints */ + APC_SEMI_CONSTRAINED = 0x1, /* Constrained at "lb" */ + APC_CONSTRAINED = 0x2, /* Fully constrained */ + APC_EXTENSIBLE = 0x4 /* May have extension */ + }; +typedef struct asn_per_constraint_s { + + enum asn_per_constraint_flags flags; + int range_bits; /* Full number of bits in the range */ + int effective_bits; /* Effective bits */ + long lower_bound; /* "lb" value */ + long upper_bound; /* "ub" value */ +} asn_per_constraint_t; +typedef struct asn_per_constraints_s { + asn_per_constraint_t value; + asn_per_constraint_t size; +} asn_per_constraints_t; + + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * Type of the type-specific PER decoder function. + */ +typedef asn_dec_rval_t (per_type_decoder_f)(asn_codec_ctx_t *opt_codec_ctx, + struct asn_TYPE_descriptor_s *type_descriptor, + asn_per_constraints_t *constraints, + void **struct_ptr, + asn_per_data_t *per_data + ); + +#ifdef __cplusplus +} +#endif + +#endif /* _PER_DECODER_H_ */ diff --git a/skeletons/per_support.c b/skeletons/per_support.c new file mode 100644 index 000000000..506ca780a --- /dev/null +++ b/skeletons/per_support.c @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2005 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * Extract a small number of bits (<= 24) from the specified PER data pointer. + */ +int32_t +per_get_few_bits(asn_per_data_t *pd, int nbits) { + size_t off; /* Next after last bit offset */ + uint32_t accum; + uint8_t *buf; + + if(nbits < 0 || pd->nboff + nbits > pd->nbits) + return -1; + if(nbits == 0) + return 0; + + /* + * Normalize position indicator. + */ + if(pd->nboff >= 8) { + pd->buffer += (pd->nboff >> 3); + pd->nbits -= (pd->nboff & ~0x07); + pd->nboff &= 0x07; + } + off = (pd->nboff += nbits); + buf = pd->buffer; + + /* + * Extract specified number of bits. + */ + if(off <= 8) + accum = (buf[0]) >> (8 - off); + else if(off <= 16) + accum = ((buf[0] << 8) + buf[1]) >> (16 - off); + else if(off <= 24) + accum = ((buf[0] << 16) + (buf[1] << 8) + buf[2]) >> (24 - off); + else if(off <= 31) + accum = ((buf[0] << 24) + (buf[1] << 16) + + (buf[2] << 8) + (buf[3])) >> (32 - off); + else { + pd->nboff -= nbits; /* Oops, revert back */ + return -1; + } + + return (accum & ((1 << nbits) - 1)); +} + +/* + * Extract a large number of bits from the specified PER data pointer. + */ +int +per_get_many_bits(asn_per_data_t *pd, uint8_t *dst, int alright, int nbits) { + int32_t value; + + if(alright && (nbits & 7)) { + /* Perform right alignment of a first few bits */ + value = per_get_few_bits(pd, nbits & 0x07); + if(value < 0) return -1; + *dst++ = value; /* value is already right-aligned */ + nbits &= ~7; + } + + while(nbits) { + if(nbits >= 24) { + value = per_get_few_bits(pd, 24); + if(value < 0) return -1; + *(dst++) = value >> 16; + *(dst++) = value >> 8; + *(dst++) = value; + nbits -= 24; + } else { + value = per_get_few_bits(pd, nbits); + if(value < 0) return -1; + if(nbits & 7) { /* implies alright */ + value <<= 8 - (nbits & 7), + nbits += 8 - (nbits & 7); + if(nbits > 24) + *dst++ = value >> 24; + } + if(nbits > 16) + *dst++ = value >> 16; + if(nbits > 8) + *dst++ = value >> 8; + *dst++ = value; + break; + } + } + + return 0; +} + +/* + * Get the length "n" from the stream. + */ +ssize_t +uper_get_length(asn_per_data_t *pd, int ebits, int *repeat) { + ssize_t value; + + *repeat = 0; + + if(ebits >= 0) return per_get_few_bits(pd, ebits); + + value = per_get_few_bits(pd, 8); + if(value < 0) return -1; + if((value & 128) == 0) /* #10.9.3.6 */ + return (value & 0x7F); + if((value & 64) == 0) { /* #10.9.3.7 */ + value = ((value & 63) << 8) | per_get_few_bits(pd, 8); + if(value < 0) return -1; + return value; + } + value &= 63; /* this is "m" from X.691, #10.9.3.8 */ + if(value < 1 || value > 4) + return -1; + *repeat = 1; + return (16384 * value); +} + +/* + * Get the normally small non-negative whole number. + * X.691, #10.6 + */ +ssize_t +uper_get_nsnnwn(asn_per_data_t *pd) { + ssize_t value; + + value = per_get_few_bits(pd, 7); + if(value & 64) { /* implicit (value < 0) */ + value &= 63; + value <<= 2; + value |= per_get_few_bits(pd, 2); + if(value & 128) /* implicit (value < 0) */ + return -1; + if(value == 0) + return 0; + if(value >= 3) + return -1; + value = per_get_few_bits(pd, 8 * value); + return value; + } + + return value; +} diff --git a/skeletons/per_support.h b/skeletons/per_support.h new file mode 100644 index 000000000..25c925665 --- /dev/null +++ b/skeletons/per_support.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2005 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _PER_SUPPORT_H_ +#define _PER_SUPPORT_H_ + +#include /* Platform-specific types */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * This structure describes a position inside a PER bit stream. + */ +typedef struct asn_per_data_s { + uint8_t *buffer; /* Pointer to the octet stream */ + size_t nboff; /* Bit offset to the meaningful bit */ + size_t nbits; /* Number of bits in the stream */ +} asn_per_data_t; + +/* + * Extract a small number of bits (<= 24) from the specified PER data pointer. + * This function returns -1 if the specified number of bits could not be + * extracted due to EOD or other conditions. + */ +int32_t per_get_few_bits(asn_per_data_t *per_data, int get_nbits); + +/* + * Extract a large number of bits from the specified PER data pointer. + * This function returns -1 if the specified number of bits could not be + * extracted due to EOD or other conditions. + */ +int per_get_many_bits(asn_per_data_t *pd, uint8_t *dst, int right_align, + int get_nbits); + +/* + * Get the length "n" from the Unaligned PER stream. + */ +ssize_t uper_get_length(asn_per_data_t *pd, + int effective_bound_bits, + int *repeat); + +/* + * Get the normally small non-negative whole number. + */ +ssize_t uper_get_nsnnwn(asn_per_data_t *pd); + +#ifdef __cplusplus +} +#endif + +#endif /* _PER_SUPPORT_H_ */ diff --git a/skeletons/tests/Makefile.am b/skeletons/tests/Makefile.am index c374438da..a664a6f61 100644 --- a/skeletons/tests/Makefile.am +++ b/skeletons/tests/Makefile.am @@ -10,7 +10,8 @@ check_PROGRAMS = \ check-UTCTime \ check-INTEGER \ check-REAL \ - check-XER + check-XER \ + check-PER LDADD = -lm diff --git a/skeletons/tests/Makefile.in b/skeletons/tests/Makefile.in index f5a3c6894..d0f980f2e 100644 --- a/skeletons/tests/Makefile.in +++ b/skeletons/tests/Makefile.in @@ -13,7 +13,7 @@ # PARTICULAR PURPOSE. @SET_MAKE@ -SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OCTET_STRING.c check-OIDs.c check-REAL.c check-UTCTime.c check-UTF8String.c check-XER.c check-ber_tlv_tag.c check-length.c +SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OCTET_STRING.c check-OIDs.c check-PER.c check-REAL.c check-UTCTime.c check-UTF8String.c check-XER.c check-ber_tlv_tag.c check-length.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ @@ -40,7 +40,7 @@ check_PROGRAMS = check-ber_tlv_tag$(EXEEXT) check-length$(EXEEXT) \ check-OIDs$(EXEEXT) check-GeneralizedTime$(EXEEXT) \ check-OCTET_STRING$(EXEEXT) check-UTF8String$(EXEEXT) \ check-UTCTime$(EXEEXT) check-INTEGER$(EXEEXT) \ - check-REAL$(EXEEXT) check-XER$(EXEEXT) + check-REAL$(EXEEXT) check-XER$(EXEEXT) check-PER$(EXEEXT) subdir = skeletons/tests DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -66,6 +66,10 @@ check_OIDs_SOURCES = check-OIDs.c check_OIDs_OBJECTS = check-OIDs.$(OBJEXT) check_OIDs_LDADD = $(LDADD) check_OIDs_DEPENDENCIES = +check_PER_SOURCES = check-PER.c +check_PER_OBJECTS = check-PER.$(OBJEXT) +check_PER_LDADD = $(LDADD) +check_PER_DEPENDENCIES = check_REAL_SOURCES = check-REAL.c check_REAL_OBJECTS = check-REAL.$(OBJEXT) check_REAL_LDADD = $(LDADD) @@ -96,7 +100,7 @@ am__depfiles_maybe = depfiles @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/check-GeneralizedTime.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-INTEGER.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-OCTET_STRING.Po \ -@AMDEP_TRUE@ ./$(DEPDIR)/check-OIDs.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/check-OIDs.Po ./$(DEPDIR)/check-PER.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-REAL.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-UTCTime.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/check-UTF8String.Po \ @@ -112,12 +116,13 @@ CCLD = $(CC) LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OCTET_STRING.c \ - check-OIDs.c check-REAL.c check-UTCTime.c check-UTF8String.c \ - check-XER.c check-ber_tlv_tag.c check-length.c -DIST_SOURCES = check-GeneralizedTime.c check-INTEGER.c \ - check-OCTET_STRING.c check-OIDs.c check-REAL.c check-UTCTime.c \ + check-OIDs.c check-PER.c check-REAL.c check-UTCTime.c \ check-UTF8String.c check-XER.c check-ber_tlv_tag.c \ check-length.c +DIST_SOURCES = check-GeneralizedTime.c check-INTEGER.c \ + check-OCTET_STRING.c check-OIDs.c check-PER.c check-REAL.c \ + check-UTCTime.c check-UTF8String.c check-XER.c \ + check-ber_tlv_tag.c check-length.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -285,6 +290,9 @@ check-OCTET_STRING$(EXEEXT): $(check_OCTET_STRING_OBJECTS) $(check_OCTET_STRING_ check-OIDs$(EXEEXT): $(check_OIDs_OBJECTS) $(check_OIDs_DEPENDENCIES) @rm -f check-OIDs$(EXEEXT) $(LINK) $(check_OIDs_LDFLAGS) $(check_OIDs_OBJECTS) $(check_OIDs_LDADD) $(LIBS) +check-PER$(EXEEXT): $(check_PER_OBJECTS) $(check_PER_DEPENDENCIES) + @rm -f check-PER$(EXEEXT) + $(LINK) $(check_PER_LDFLAGS) $(check_PER_OBJECTS) $(check_PER_LDADD) $(LIBS) check-REAL$(EXEEXT): $(check_REAL_OBJECTS) $(check_REAL_DEPENDENCIES) @rm -f check-REAL$(EXEEXT) $(LINK) $(check_REAL_LDFLAGS) $(check_REAL_OBJECTS) $(check_REAL_LDADD) $(LIBS) @@ -314,6 +322,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-INTEGER.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-OCTET_STRING.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-OIDs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-PER.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-REAL.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-UTCTime.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-UTF8String.Po@am__quote@ diff --git a/skeletons/tests/check-INTEGER.c b/skeletons/tests/check-INTEGER.c index bb692c505..fccce287e 100644 --- a/skeletons/tests/check-INTEGER.c +++ b/skeletons/tests/check-INTEGER.c @@ -6,6 +6,7 @@ #include #include #include +#include #include static char *shared_scratch_start; diff --git a/skeletons/tests/check-OCTET_STRING.c b/skeletons/tests/check-OCTET_STRING.c index 51f6eb3bc..b3e298f11 100644 --- a/skeletons/tests/check-OCTET_STRING.c +++ b/skeletons/tests/check-OCTET_STRING.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include diff --git a/skeletons/tests/check-PER.c b/skeletons/tests/check-PER.c new file mode 100644 index 000000000..94f5fe428 --- /dev/null +++ b/skeletons/tests/check-PER.c @@ -0,0 +1,105 @@ +#include +#include + +int +main() { + uint8_t buf[] = { 0xB7, 0x19, 0x2F, 0xEE, 0xAD }; + uint8_t tmpbuf[10]; + int32_t z; + asn_per_data_t pos; + + pos.buffer = buf; + pos.nboff = 0; + pos.nbits = sizeof(buf) * 8; + + z = per_get_few_bits(&pos, 32); + assert(z == -1); + + z = per_get_few_bits(&pos, 0); + assert(z == 0); + assert(pos.nboff == 0); + + z = per_get_few_bits(&pos, 1); + assert(z == 1); + assert(pos.nboff == 1); + + z = per_get_few_bits(&pos, 2); + assert(z == 1); + assert(pos.nboff == 3); + + z = per_get_few_bits(&pos, 2); + assert(z == 2); + assert(pos.nboff == 5); + + z = per_get_few_bits(&pos, 3); + assert(z == 7); + assert(pos.nboff == 8); + assert(pos.nbits == sizeof(buf) * 8); + + z = per_get_few_bits(&pos, 8); + assert(z == 0x19); + assert(pos.nboff == 8); + assert(pos.nbits == (sizeof(buf) - 1) * 8); + + z = per_get_few_bits(&pos, 1); + assert(z == 0); + assert(pos.nboff == 1); + assert(pos.nbits == (sizeof(buf) - 2) * 8); + + z = per_get_few_bits(&pos, 3); + assert(z == 2); + assert(pos.nboff == 4); + assert(pos.nbits == (sizeof(buf) - 2) * 8); + + z = per_get_few_bits(&pos, 8); + assert(z == 254); + assert(pos.nboff == 12); + + pos.buffer = buf; + pos.nboff = 2; + pos.nbits = sizeof(buf) * 8; + z = per_get_few_bits(&pos, 24); + assert(z == 14443711); + + pos.buffer = buf; + pos.nboff = 0; + pos.nbits = sizeof(buf) * 8; + z = per_get_many_bits(&pos, tmpbuf, 0, sizeof(buf) * 8); + assert(z == 0); + assert(buf[0] == tmpbuf[0]); + assert(buf[1] == tmpbuf[1]); + assert(buf[2] == tmpbuf[2]); + assert(buf[3] == tmpbuf[3]); + assert(buf[4] == tmpbuf[4]); + + pos.buffer = buf; + pos.nboff = 1; + pos.nbits = sizeof(buf) * 8; + z = per_get_many_bits(&pos, tmpbuf, 0, sizeof(buf) * 8); + assert(z == -1); + + pos.buffer = buf; + pos.nboff = 1; + pos.nbits = sizeof(buf) * 8; + z = per_get_many_bits(&pos, tmpbuf, 0, sizeof(buf) * 8 - 1); + assert(z == 0); + assert(tmpbuf[0] == 110); + assert(tmpbuf[1] == 50); + assert(tmpbuf[2] == 95); + assert(tmpbuf[3] == 221); + assert(tmpbuf[4] == 90); + + pos.buffer = buf; + pos.nboff = 1; + pos.nbits = sizeof(buf) * 8; + z = per_get_many_bits(&pos, tmpbuf, 1, sizeof(buf) * 8 - 1); + assert(z == 0); + assert(tmpbuf[0] == 55); + assert(tmpbuf[0] != buf[0]); + assert(tmpbuf[1] == buf[1]); + assert(tmpbuf[2] == buf[2]); + assert(tmpbuf[3] == buf[3]); + assert(tmpbuf[4] == buf[4]); + + return 0; +} diff --git a/skeletons/tests/check-UTF8String.c b/skeletons/tests/check-UTF8String.c index 10592a192..8a90b2426 100644 --- a/skeletons/tests/check-UTF8String.c +++ b/skeletons/tests/check-UTF8String.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include diff --git a/skeletons/tests/check-length.c b/skeletons/tests/check-length.c index 9a6d8d67b..cf1040507 100644 --- a/skeletons/tests/check-length.c +++ b/skeletons/tests/check-length.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #undef ADVANCE #undef RETURN diff --git a/skeletons/xer_encoder.c b/skeletons/xer_encoder.c index 3ee62cb87..aa7cf040a 100644 --- a/skeletons/xer_encoder.c +++ b/skeletons/xer_encoder.c @@ -32,9 +32,7 @@ xer_encode(asn_TYPE_descriptor_t *td, void *sptr, er.encoded = 4 + xcan + (2 * mlen) + tmper.encoded; - er.structure_ptr = 0; - er.failed_type = 0; - return er; + _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } diff --git a/skeletons/xer_support.c b/skeletons/xer_support.c index 1d0b42c5a..9e34e6923 100644 --- a/skeletons/xer_support.c +++ b/skeletons/xer_support.c @@ -4,11 +4,7 @@ * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ -#include -#include -#include -#include - +#include #include /* Parser states */ diff --git a/tests/19-param-OK.asn1.-P b/tests/19-param-OK.asn1.-P index 8ffd6179d..321e71a2b 100644 --- a/tests/19-param-OK.asn1.-P +++ b/tests/19-param-OK.asn1.-P @@ -32,7 +32,7 @@ extern asn_TYPE_descriptor_t asn_DEF_Certificate; /*** <<< CODE [Certificate] >>> ***/ static int -memb_signature_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, +memb_signature_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; @@ -71,6 +71,8 @@ static asn_TYPE_member_t asn_MBR_toBeSigned_2[] = { .tag_mode = 0, .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "version" }, { ATF_NOFLAGS, 0, offsetof(struct toBeSigned, signature), @@ -78,6 +80,8 @@ static asn_TYPE_member_t asn_MBR_toBeSigned_2[] = { .tag_mode = 0, .type = &asn_DEF_OBJECT_IDENTIFIER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "signature" }, { ATF_NOFLAGS, 0, offsetof(struct toBeSigned, issuer), @@ -85,22 +89,25 @@ static asn_TYPE_member_t asn_MBR_toBeSigned_2[] = { .tag_mode = 0, .type = &asn_DEF_Name, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "issuer" }, }; -static ber_tlv_tag_t asn_DEF_toBeSigned_2_tags[] = { +static ber_tlv_tag_t asn_DEF_toBeSigned_tags_2[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_toBeSigned_2_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_toBeSigned_tag2el_2[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* version at 21 */ { (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)), 1, 0, 0 }, /* signature at 22 */ { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, 0, 0 } /* issuer at 24 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_toBeSigned_2_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_toBeSigned_specs_2 = { sizeof(struct toBeSigned), offsetof(struct toBeSigned, _asn_ctx), - asn_MAP_toBeSigned_2_tag2el, + asn_MAP_toBeSigned_tag2el_2, 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -115,16 +122,18 @@ asn_TYPE_descriptor_t asn_DEF_toBeSigned_2 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_toBeSigned_2_tags, - sizeof(asn_DEF_toBeSigned_2_tags) - /sizeof(asn_DEF_toBeSigned_2_tags[0]), /* 1 */ - asn_DEF_toBeSigned_2_tags, /* Same as above */ - sizeof(asn_DEF_toBeSigned_2_tags) - /sizeof(asn_DEF_toBeSigned_2_tags[0]), /* 1 */ + asn_DEF_toBeSigned_tags_2, + sizeof(asn_DEF_toBeSigned_tags_2) + /sizeof(asn_DEF_toBeSigned_tags_2[0]), /* 1 */ + asn_DEF_toBeSigned_tags_2, /* Same as above */ + sizeof(asn_DEF_toBeSigned_tags_2) + /sizeof(asn_DEF_toBeSigned_tags_2[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_toBeSigned_2, 3, /* Elements count */ - &asn_SPC_toBeSigned_2_specs /* Additional specs */ + &asn_SPC_toBeSigned_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_Certificate_1[] = { @@ -133,6 +142,8 @@ static asn_TYPE_member_t asn_MBR_Certificate_1[] = { .tag_mode = 0, .type = &asn_DEF_toBeSigned_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "toBeSigned" }, { ATF_NOFLAGS, 0, offsetof(struct Certificate, algorithm), @@ -140,29 +151,34 @@ static asn_TYPE_member_t asn_MBR_Certificate_1[] = { .tag_mode = 0, .type = &asn_DEF_OBJECT_IDENTIFIER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "algorithm" }, { ATF_NOFLAGS, 0, offsetof(struct Certificate, signature), .tag = (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), .tag_mode = 0, .type = &asn_DEF_BIT_STRING, - .memb_constraints = memb_signature_1_constraint, + .memb_constraints = memb_signature_constraint_1, + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "signature" }, }; -static ber_tlv_tag_t asn_DEF_Certificate_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Certificate_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Certificate_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Certificate_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 2, 0, 0 }, /* signature at 17 */ { (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)), 1, 0, 0 }, /* algorithm at 16 */ { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* toBeSigned at 21 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Certificate_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Certificate_specs_1 = { sizeof(struct Certificate), offsetof(struct Certificate, _asn_ctx), - asn_MAP_Certificate_1_tag2el, + asn_MAP_Certificate_tag2el_1, 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -176,16 +192,18 @@ asn_TYPE_descriptor_t asn_DEF_Certificate = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Certificate_1_tags, - sizeof(asn_DEF_Certificate_1_tags) - /sizeof(asn_DEF_Certificate_1_tags[0]), /* 1 */ - asn_DEF_Certificate_1_tags, /* Same as above */ - sizeof(asn_DEF_Certificate_1_tags) - /sizeof(asn_DEF_Certificate_1_tags[0]), /* 1 */ + asn_DEF_Certificate_tags_1, + sizeof(asn_DEF_Certificate_tags_1) + /sizeof(asn_DEF_Certificate_tags_1[0]), /* 1 */ + asn_DEF_Certificate_tags_1, /* Same as above */ + sizeof(asn_DEF_Certificate_tags_1) + /sizeof(asn_DEF_Certificate_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Certificate_1, 3, /* Elements count */ - &asn_SPC_Certificate_1_specs /* Additional specs */ + &asn_SPC_Certificate_specs_1 /* Additional specs */ }; @@ -223,13 +241,15 @@ static asn_TYPE_member_t asn_MBR_Name_1[] = { .tag_mode = 0, .type = &asn_DEF_RelativeDistinguishedName, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_Name_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Name_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_Name_1_specs = { +static asn_SET_OF_specifics_t asn_SPC_Name_specs_1 = { sizeof(struct Name), offsetof(struct Name, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ @@ -244,16 +264,18 @@ asn_TYPE_descriptor_t asn_DEF_Name = { SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Name_1_tags, - sizeof(asn_DEF_Name_1_tags) - /sizeof(asn_DEF_Name_1_tags[0]), /* 1 */ - asn_DEF_Name_1_tags, /* Same as above */ - sizeof(asn_DEF_Name_1_tags) - /sizeof(asn_DEF_Name_1_tags[0]), /* 1 */ + asn_DEF_Name_tags_1, + sizeof(asn_DEF_Name_tags_1) + /sizeof(asn_DEF_Name_tags_1[0]), /* 1 */ + asn_DEF_Name_tags_1, /* Same as above */ + sizeof(asn_DEF_Name_tags_1) + /sizeof(asn_DEF_Name_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Name_1, 1, /* Single element */ - &asn_SPC_Name_1_specs /* Additional specs */ + &asn_SPC_Name_specs_1 /* Additional specs */ }; @@ -307,7 +329,7 @@ static int check_permitted_alphabet_2(const void *sptr) { /*** <<< CODE [RelativeDistinguishedName] >>> ***/ static int -memb_IA5String_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, +memb_IA5String_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const IA5String_t *st = (const IA5String_t *)sptr; @@ -338,14 +360,16 @@ static asn_TYPE_member_t asn_MBR_RelativeDistinguishedName_1[] = { .tag = (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), .tag_mode = 0, .type = &asn_DEF_IA5String, - .memb_constraints = memb_IA5String_1_constraint, + .memb_constraints = memb_IA5String_constraint_1, + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_RelativeDistinguishedName_1_tags[] = { +static ber_tlv_tag_t asn_DEF_RelativeDistinguishedName_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_RelativeDistinguishedName_1_specs = { +static asn_SET_OF_specifics_t asn_SPC_RelativeDistinguishedName_specs_1 = { sizeof(struct RelativeDistinguishedName), offsetof(struct RelativeDistinguishedName, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ @@ -360,15 +384,17 @@ asn_TYPE_descriptor_t asn_DEF_RelativeDistinguishedName = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_RelativeDistinguishedName_1_tags, - sizeof(asn_DEF_RelativeDistinguishedName_1_tags) - /sizeof(asn_DEF_RelativeDistinguishedName_1_tags[0]), /* 1 */ - asn_DEF_RelativeDistinguishedName_1_tags, /* Same as above */ - sizeof(asn_DEF_RelativeDistinguishedName_1_tags) - /sizeof(asn_DEF_RelativeDistinguishedName_1_tags[0]), /* 1 */ + asn_DEF_RelativeDistinguishedName_tags_1, + sizeof(asn_DEF_RelativeDistinguishedName_tags_1) + /sizeof(asn_DEF_RelativeDistinguishedName_tags_1[0]), /* 1 */ + asn_DEF_RelativeDistinguishedName_tags_1, /* Same as above */ + sizeof(asn_DEF_RelativeDistinguishedName_tags_1) + /sizeof(asn_DEF_RelativeDistinguishedName_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_RelativeDistinguishedName_1, 1, /* Single element */ - &asn_SPC_RelativeDistinguishedName_1_specs /* Additional specs */ + &asn_SPC_RelativeDistinguishedName_specs_1 /* Additional specs */ }; diff --git a/tests/30-set-OK.asn1.-P b/tests/30-set-OK.asn1.-P index 439f0de4a..652508848 100644 --- a/tests/30-set-OK.asn1.-P +++ b/tests/30-set-OK.asn1.-P @@ -49,6 +49,8 @@ static asn_TYPE_member_t asn_MBR_T_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "i" }, { ATF_NOFLAGS, 0, offsetof(struct T, s), @@ -56,6 +58,8 @@ static asn_TYPE_member_t asn_MBR_T_1[] = { .tag_mode = 0, .type = &asn_DEF_IA5String, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "s" }, { ATF_POINTER, 1, offsetof(struct T, b), @@ -63,30 +67,32 @@ static asn_TYPE_member_t asn_MBR_T_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_BOOLEAN, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "b" }, }; -static ber_tlv_tag_t asn_DEF_T_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_T_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_T_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), 1, 0, 0 }, /* s at 16 */ { (ASN_TAG_CLASS_APPLICATION | (3 << 2)), 0, 0, 0 }, /* i at 15 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* b at 18 */ }; -static uint8_t asn_MAP_T_1_mmap[(3 + (8 * sizeof(unsigned int)) - 1) / 8] = { +static uint8_t asn_MAP_T_mmap_1[(3 + (8 * sizeof(unsigned int)) - 1) / 8] = { (1 << 7) | (1 << 6) | (0 << 5) }; -static asn_SET_specifics_t asn_SPC_T_1_specs = { +static asn_SET_specifics_t asn_SPC_T_specs_1 = { sizeof(struct T), offsetof(struct T, _asn_ctx), offsetof(struct T, _presence_map), - asn_MAP_T_1_tag2el, + asn_MAP_T_tag2el_1, 3, /* Count of tags in the map */ - asn_MAP_T_1_tag2el, /* Same as above */ + asn_MAP_T_tag2el_1, /* Same as above */ 3, /* Count of tags in the CXER map */ 1, /* Whether extensible */ - (unsigned int *)asn_MAP_T_1_mmap /* Mandatory elements map */ + (unsigned int *)asn_MAP_T_mmap_1 /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_T = { "T", @@ -98,15 +104,17 @@ asn_TYPE_descriptor_t asn_DEF_T = { SET_encode_der, SET_decode_xer, SET_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T_1_tags, - sizeof(asn_DEF_T_1_tags) - /sizeof(asn_DEF_T_1_tags[0]), /* 1 */ - asn_DEF_T_1_tags, /* Same as above */ - sizeof(asn_DEF_T_1_tags) - /sizeof(asn_DEF_T_1_tags[0]), /* 1 */ + asn_DEF_T_tags_1, + sizeof(asn_DEF_T_tags_1) + /sizeof(asn_DEF_T_tags_1[0]), /* 1 */ + asn_DEF_T_tags_1, /* Same as above */ + sizeof(asn_DEF_T_tags_1) + /sizeof(asn_DEF_T_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_T_1, 3, /* Elements count */ - &asn_SPC_T_1_specs /* Additional specs */ + &asn_SPC_T_specs_1 /* Additional specs */ }; diff --git a/tests/31-set-of-OK.asn1 b/tests/31-set-of-OK.asn1 index c8fa51eb1..ddfe51c7d 100644 --- a/tests/31-set-of-OK.asn1 +++ b/tests/31-set-of-OK.asn1 @@ -37,4 +37,6 @@ BEGIN -- not to the SET OF's embedded SEQUENCE! } + SSS ::= SEQUENCE OF SET OF SEQUENCE OF BIT STRING + END diff --git a/tests/31-set-of-OK.asn1.-EF b/tests/31-set-of-OK.asn1.-EF index f97ce2a30..bf6f99d84 100644 --- a/tests/31-set-of-OK.asn1.-EF +++ b/tests/31-set-of-OK.asn1.-EF @@ -23,4 +23,6 @@ Stuff ::= SET { } } +SSS ::= SEQUENCE OF SET OF SEQUENCE OF BIT STRING + END diff --git a/tests/31-set-of-OK.asn1.-P b/tests/31-set-of-OK.asn1.-P index d1e5c82e1..23cf7f0d0 100644 --- a/tests/31-set-of-OK.asn1.-P +++ b/tests/31-set-of-OK.asn1.-P @@ -33,13 +33,15 @@ static asn_TYPE_member_t asn_MBR_Forest_1[] = { .tag_mode = 0, .type = &asn_DEF_Tree, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_Forest_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Forest_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_Forest_1_specs = { +static asn_SET_OF_specifics_t asn_SPC_Forest_specs_1 = { sizeof(struct Forest), offsetof(struct Forest, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ @@ -54,16 +56,18 @@ asn_TYPE_descriptor_t asn_DEF_Forest = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Forest_1_tags, - sizeof(asn_DEF_Forest_1_tags) - /sizeof(asn_DEF_Forest_1_tags[0]), /* 1 */ - asn_DEF_Forest_1_tags, /* Same as above */ - sizeof(asn_DEF_Forest_1_tags) - /sizeof(asn_DEF_Forest_1_tags[0]), /* 1 */ + asn_DEF_Forest_tags_1, + sizeof(asn_DEF_Forest_tags_1) + /sizeof(asn_DEF_Forest_tags_1[0]), /* 1 */ + asn_DEF_Forest_tags_1, /* Same as above */ + sizeof(asn_DEF_Forest_tags_1) + /sizeof(asn_DEF_Forest_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Forest_1, 1, /* Single element */ - &asn_SPC_Forest_1_specs /* Additional specs */ + &asn_SPC_Forest_specs_1 /* Additional specs */ }; @@ -94,6 +98,8 @@ static asn_TYPE_member_t asn_MBR_Tree_1[] = { .tag_mode = 0, .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "height" }, { ATF_NOFLAGS, 0, offsetof(struct Tree, width), @@ -101,21 +107,24 @@ static asn_TYPE_member_t asn_MBR_Tree_1[] = { .tag_mode = 0, .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "width" }, }; -static ber_tlv_tag_t asn_DEF_Tree_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Tree_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Tree_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Tree_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 1 }, /* height at 17 */ { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, -1, 0 } /* width at 19 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Tree_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Tree_specs_1 = { sizeof(struct Tree), offsetof(struct Tree, _asn_ctx), - asn_MAP_Tree_1_tag2el, + asn_MAP_Tree_tag2el_1, 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -129,16 +138,18 @@ asn_TYPE_descriptor_t asn_DEF_Tree = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Tree_1_tags, - sizeof(asn_DEF_Tree_1_tags) - /sizeof(asn_DEF_Tree_1_tags[0]), /* 1 */ - asn_DEF_Tree_1_tags, /* Same as above */ - sizeof(asn_DEF_Tree_1_tags) - /sizeof(asn_DEF_Tree_1_tags[0]), /* 1 */ + asn_DEF_Tree_tags_1, + sizeof(asn_DEF_Tree_tags_1) + /sizeof(asn_DEF_Tree_tags_1[0]), /* 1 */ + asn_DEF_Tree_tags_1, /* Same as above */ + sizeof(asn_DEF_Tree_tags_1) + /sizeof(asn_DEF_Tree_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Tree_1, 2, /* Elements count */ - &asn_SPC_Tree_1_specs /* Additional specs */ + &asn_SPC_Tree_specs_1 /* Additional specs */ }; @@ -236,14 +247,16 @@ static asn_TYPE_member_t asn_MBR_trees_2[] = { .tag_mode = 0, .type = &asn_DEF_Forest, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_trees_2_tags[] = { +static ber_tlv_tag_t asn_DEF_trees_tags_2[] = { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_trees_2_specs = { +static asn_SET_OF_specifics_t asn_SPC_trees_specs_2 = { sizeof(struct trees), offsetof(struct trees, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ @@ -259,16 +272,18 @@ asn_TYPE_descriptor_t asn_DEF_trees_2 = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_trees_2_tags, - sizeof(asn_DEF_trees_2_tags) - /sizeof(asn_DEF_trees_2_tags[0]) - 1, /* 1 */ - asn_DEF_trees_2_tags, /* Same as above */ - sizeof(asn_DEF_trees_2_tags) - /sizeof(asn_DEF_trees_2_tags[0]), /* 2 */ + asn_DEF_trees_tags_2, + sizeof(asn_DEF_trees_tags_2) + /sizeof(asn_DEF_trees_tags_2[0]) - 1, /* 1 */ + asn_DEF_trees_tags_2, /* Same as above */ + sizeof(asn_DEF_trees_tags_2) + /sizeof(asn_DEF_trees_tags_2[0]), /* 2 */ + 0, /* No PER visible constraints */ asn_MBR_trees_2, 1, /* Single element */ - &asn_SPC_trees_2_specs /* Additional specs */ + &asn_SPC_trees_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_Member_5[] = { @@ -277,27 +292,30 @@ static asn_TYPE_member_t asn_MBR_Member_5[] = { .tag_mode = 0, .type = &asn_DEF_BIT_STRING, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "cup-of-coffee" }, }; -static ber_tlv_tag_t asn_DEF_Member_5_tags[] = { +static ber_tlv_tag_t asn_DEF_Member_tags_5[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Member_5_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Member_tag2el_5[] = { { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 0, 0, 0 } /* cup-of-coffee at 32 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Member_5_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_5 = { sizeof(struct Member), offsetof(struct Member, _asn_ctx), - asn_MAP_Member_5_tag2el, + asn_MAP_Member_tag2el_5, 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ 0, /* Start extensions */ 2 /* Stop extensions */ }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_Member_5 = { - "", - "", + "SEQUENCE", + "SEQUENCE", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, @@ -305,16 +323,18 @@ asn_TYPE_descriptor_t asn_DEF_Member_5 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Member_5_tags, - sizeof(asn_DEF_Member_5_tags) - /sizeof(asn_DEF_Member_5_tags[0]), /* 1 */ - asn_DEF_Member_5_tags, /* Same as above */ - sizeof(asn_DEF_Member_5_tags) - /sizeof(asn_DEF_Member_5_tags[0]), /* 1 */ + asn_DEF_Member_tags_5, + sizeof(asn_DEF_Member_tags_5) + /sizeof(asn_DEF_Member_tags_5[0]), /* 1 */ + asn_DEF_Member_tags_5, /* Same as above */ + sizeof(asn_DEF_Member_tags_5) + /sizeof(asn_DEF_Member_tags_5[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Member_5, 1, /* Elements count */ - &asn_SPC_Member_5_specs /* Additional specs */ + &asn_SPC_Member_specs_5 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_anything_4[] = { @@ -323,14 +343,16 @@ static asn_TYPE_member_t asn_MBR_anything_4[] = { .tag_mode = 0, .type = &asn_DEF_Member_5, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_anything_4_tags[] = { +static ber_tlv_tag_t asn_DEF_anything_tags_4[] = { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_anything_4_specs = { +static asn_SET_OF_specifics_t asn_SPC_anything_specs_4 = { sizeof(struct anything), offsetof(struct anything, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ @@ -346,16 +368,18 @@ asn_TYPE_descriptor_t asn_DEF_anything_4 = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_anything_4_tags, - sizeof(asn_DEF_anything_4_tags) - /sizeof(asn_DEF_anything_4_tags[0]) - 1, /* 1 */ - asn_DEF_anything_4_tags, /* Same as above */ - sizeof(asn_DEF_anything_4_tags) - /sizeof(asn_DEF_anything_4_tags[0]), /* 2 */ + asn_DEF_anything_tags_4, + sizeof(asn_DEF_anything_tags_4) + /sizeof(asn_DEF_anything_tags_4[0]) - 1, /* 1 */ + asn_DEF_anything_tags_4, /* Same as above */ + sizeof(asn_DEF_anything_tags_4) + /sizeof(asn_DEF_anything_tags_4[0]), /* 2 */ + 0, /* No PER visible constraints */ asn_MBR_anything_4, 1, /* Single element */ - &asn_SPC_anything_4_specs /* Additional specs */ + &asn_SPC_anything_specs_4 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_other_9[] = { @@ -364,6 +388,8 @@ static asn_TYPE_member_t asn_MBR_other_9[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "a" }, { ATF_NOFLAGS, 0, offsetof(struct other, choice.b), @@ -371,21 +397,24 @@ static asn_TYPE_member_t asn_MBR_other_9[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "b" }, }; -static asn_TYPE_tag2member_t asn_MAP_other_9_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_other_tag2el_9[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* a at 26 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 1, 0, 0 } /* b at 28 */ }; -static asn_CHOICE_specifics_t asn_SPC_other_9_specs = { +static asn_CHOICE_specifics_t asn_SPC_other_specs_9 = { sizeof(struct other), offsetof(struct other, _asn_ctx), offsetof(struct other, present), sizeof(((struct other *)0)->present), - asn_MAP_other_9_tag2el, + asn_MAP_other_tag2el_9, 2, /* Count of tags in the map */ - 0 /* Whether extensible */ + .canonical_order = 0, + .ext_start = -1 /* Extensions start */ }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_other_9 = { @@ -398,14 +427,16 @@ asn_TYPE_descriptor_t asn_DEF_other_9 = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_other_9, 2, /* Elements count */ - &asn_SPC_other_9_specs /* Additional specs */ + &asn_SPC_other_specs_9 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_Stuff_1[] = { @@ -414,6 +445,8 @@ static asn_TYPE_member_t asn_MBR_Stuff_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_trees_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "trees" }, { ATF_POINTER, 2, offsetof(struct Stuff, anything), @@ -421,6 +454,8 @@ static asn_TYPE_member_t asn_MBR_Stuff_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_anything_4, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "anything" }, { ATF_POINTER, 1, offsetof(struct Stuff, other), @@ -428,36 +463,38 @@ static asn_TYPE_member_t asn_MBR_Stuff_1[] = { .tag_mode = 0, .type = &asn_DEF_other_9, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "other" }, }; -static ber_tlv_tag_t asn_DEF_Stuff_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Stuff_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Stuff_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Stuff_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 2, 0, 0 }, /* a at 26 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* trees at 23 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* anything at 34 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 } /* b at 28 */ }; -static asn_TYPE_tag2member_t asn_MAP_Stuff_1_tag2el_cxer[] = { +static asn_TYPE_tag2member_t asn_MAP_Stuff_tag2el_cxer_1[] = { { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* trees at 23 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* anything at 34 */ { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 2, 0, 0 } /* a at 26 */ }; -static uint8_t asn_MAP_Stuff_1_mmap[(3 + (8 * sizeof(unsigned int)) - 1) / 8] = { +static uint8_t asn_MAP_Stuff_mmap_1[(3 + (8 * sizeof(unsigned int)) - 1) / 8] = { (0 << 7) | (0 << 6) | (0 << 5) }; -static asn_SET_specifics_t asn_SPC_Stuff_1_specs = { +static asn_SET_specifics_t asn_SPC_Stuff_specs_1 = { sizeof(struct Stuff), offsetof(struct Stuff, _asn_ctx), offsetof(struct Stuff, _presence_map), - asn_MAP_Stuff_1_tag2el, + asn_MAP_Stuff_tag2el_1, 4, /* Count of tags in the map */ - asn_MAP_Stuff_1_tag2el_cxer, + asn_MAP_Stuff_tag2el_cxer_1, 3, /* Count of tags in the CXER map */ 1, /* Whether extensible */ - (unsigned int *)asn_MAP_Stuff_1_mmap /* Mandatory elements map */ + (unsigned int *)asn_MAP_Stuff_mmap_1 /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_Stuff = { "Stuff", @@ -469,15 +506,182 @@ asn_TYPE_descriptor_t asn_DEF_Stuff = { SET_encode_der, SET_decode_xer, SET_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Stuff_1_tags, - sizeof(asn_DEF_Stuff_1_tags) - /sizeof(asn_DEF_Stuff_1_tags[0]), /* 1 */ - asn_DEF_Stuff_1_tags, /* Same as above */ - sizeof(asn_DEF_Stuff_1_tags) - /sizeof(asn_DEF_Stuff_1_tags[0]), /* 1 */ + asn_DEF_Stuff_tags_1, + sizeof(asn_DEF_Stuff_tags_1) + /sizeof(asn_DEF_Stuff_tags_1[0]), /* 1 */ + asn_DEF_Stuff_tags_1, /* Same as above */ + sizeof(asn_DEF_Stuff_tags_1) + /sizeof(asn_DEF_Stuff_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Stuff_1, 3, /* Elements count */ - &asn_SPC_Stuff_1_specs /* Additional specs */ + &asn_SPC_Stuff_specs_1 /* Additional specs */ +}; + + +/*** <<< INCLUDES [SSS] >>> ***/ + +#include +#include +#include +#include +#include + +/*** <<< TYPE-DECLS [SSS] >>> ***/ + +typedef struct SSS { + A_SEQUENCE_OF(struct Member { + A_SET_OF(struct Member { + A_SEQUENCE_OF(BIT_STRING_t) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } ) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } ) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} SSS_t; + +/*** <<< FUNC-DECLS [SSS] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_SSS; + +/*** <<< STAT-DEFS [SSS] >>> ***/ + +static asn_TYPE_member_t asn_MBR_Member_3[] = { + { ATF_POINTER, 0, 0, + .tag = (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), + .tag_mode = 0, + .type = &asn_DEF_BIT_STRING, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "" + }, +}; +static ber_tlv_tag_t asn_DEF_Member_tags_3[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_Member_specs_3 = { + sizeof(struct Member), + offsetof(struct Member, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_Member_3 = { + "SEQUENCE OF", + "SEQUENCE_OF", + SEQUENCE_OF_free, + SEQUENCE_OF_print, + SEQUENCE_OF_constraint, + SEQUENCE_OF_decode_ber, + SEQUENCE_OF_encode_der, + SEQUENCE_OF_decode_xer, + SEQUENCE_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Member_tags_3, + sizeof(asn_DEF_Member_tags_3) + /sizeof(asn_DEF_Member_tags_3[0]), /* 1 */ + asn_DEF_Member_tags_3, /* Same as above */ + sizeof(asn_DEF_Member_tags_3) + /sizeof(asn_DEF_Member_tags_3[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_Member_3, + 1, /* Single element */ + &asn_SPC_Member_specs_3 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_Member_2[] = { + { ATF_POINTER, 0, 0, + .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + .tag_mode = 0, + .type = &asn_DEF_Member_3, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "" + }, +}; +static ber_tlv_tag_t asn_DEF_Member_tags_2[] = { + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_Member_specs_2 = { + sizeof(struct Member), + offsetof(struct Member, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_Member_2 = { + "SET OF", + "SET_OF", + SET_OF_free, + SET_OF_print, + SET_OF_constraint, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_decode_xer, + SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Member_tags_2, + sizeof(asn_DEF_Member_tags_2) + /sizeof(asn_DEF_Member_tags_2[0]), /* 1 */ + asn_DEF_Member_tags_2, /* Same as above */ + sizeof(asn_DEF_Member_tags_2) + /sizeof(asn_DEF_Member_tags_2[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_Member_2, + 1, /* Single element */ + &asn_SPC_Member_specs_2 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_SSS_1[] = { + { ATF_POINTER, 0, 0, + .tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), + .tag_mode = 0, + .type = &asn_DEF_Member_2, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "" + }, +}; +static ber_tlv_tag_t asn_DEF_SSS_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_SSS_specs_1 = { + sizeof(struct SSS), + offsetof(struct SSS, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_SSS = { + "SSS", + "SSS", + SEQUENCE_OF_free, + SEQUENCE_OF_print, + SEQUENCE_OF_constraint, + SEQUENCE_OF_decode_ber, + SEQUENCE_OF_encode_der, + SEQUENCE_OF_decode_xer, + SEQUENCE_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_SSS_tags_1, + sizeof(asn_DEF_SSS_tags_1) + /sizeof(asn_DEF_SSS_tags_1[0]), /* 1 */ + asn_DEF_SSS_tags_1, /* Same as above */ + sizeof(asn_DEF_SSS_tags_1) + /sizeof(asn_DEF_SSS_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_SSS_1, + 1, /* Single element */ + &asn_SPC_SSS_specs_1 /* Additional specs */ }; diff --git a/tests/32-sequence-of-OK.asn1.-P b/tests/32-sequence-of-OK.asn1.-P index 3e2354bd4..fd34d5f45 100644 --- a/tests/32-sequence-of-OK.asn1.-P +++ b/tests/32-sequence-of-OK.asn1.-P @@ -33,13 +33,15 @@ static asn_TYPE_member_t asn_MBR_Programming_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Fault, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_Programming_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Programming_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_Programming_1_specs = { +static asn_SET_OF_specifics_t asn_SPC_Programming_specs_1 = { sizeof(struct Programming), offsetof(struct Programming, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ @@ -54,16 +56,18 @@ asn_TYPE_descriptor_t asn_DEF_Programming = { SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Programming_1_tags, - sizeof(asn_DEF_Programming_1_tags) - /sizeof(asn_DEF_Programming_1_tags[0]), /* 1 */ - asn_DEF_Programming_1_tags, /* Same as above */ - sizeof(asn_DEF_Programming_1_tags) - /sizeof(asn_DEF_Programming_1_tags[0]), /* 1 */ + asn_DEF_Programming_tags_1, + sizeof(asn_DEF_Programming_tags_1) + /sizeof(asn_DEF_Programming_tags_1[0]), /* 1 */ + asn_DEF_Programming_tags_1, /* Same as above */ + sizeof(asn_DEF_Programming_tags_1) + /sizeof(asn_DEF_Programming_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Programming_1, 1, /* Single element */ - &asn_SPC_Programming_1_specs /* Additional specs */ + &asn_SPC_Programming_specs_1 /* Additional specs */ }; @@ -101,13 +105,15 @@ static asn_TYPE_member_t asn_MBR_Fault_1[] = { .tag_mode = 0, .type = &asn_DEF_Error, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_Fault_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Fault_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_Fault_1_specs = { +static asn_SET_OF_specifics_t asn_SPC_Fault_specs_1 = { sizeof(struct Fault), offsetof(struct Fault, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ @@ -122,16 +128,18 @@ asn_TYPE_descriptor_t asn_DEF_Fault = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Fault_1_tags, - sizeof(asn_DEF_Fault_1_tags) - /sizeof(asn_DEF_Fault_1_tags[0]), /* 1 */ - asn_DEF_Fault_1_tags, /* Same as above */ - sizeof(asn_DEF_Fault_1_tags) - /sizeof(asn_DEF_Fault_1_tags[0]), /* 1 */ + asn_DEF_Fault_tags_1, + sizeof(asn_DEF_Fault_tags_1) + /sizeof(asn_DEF_Fault_tags_1[0]), /* 1 */ + asn_DEF_Fault_tags_1, /* Same as above */ + sizeof(asn_DEF_Fault_tags_1) + /sizeof(asn_DEF_Fault_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Fault_1, 1, /* Single element */ - &asn_SPC_Fault_1_specs /* Additional specs */ + &asn_SPC_Fault_specs_1 /* Additional specs */ }; @@ -157,14 +165,15 @@ extern asn_TYPE_descriptor_t asn_DEF_Error; /*** <<< STAT-DEFS [Error] >>> ***/ -static ber_tlv_tag_t asn_DEF_Error_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Error_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_SEQUENCE_specifics_t asn_SPC_Error_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Error_specs_1 = { sizeof(struct Error), offsetof(struct Error, _asn_ctx), 0, /* No top level tags */ 0, /* No tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -178,14 +187,16 @@ asn_TYPE_descriptor_t asn_DEF_Error = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Error_1_tags, - sizeof(asn_DEF_Error_1_tags) - /sizeof(asn_DEF_Error_1_tags[0]), /* 1 */ - asn_DEF_Error_1_tags, /* Same as above */ - sizeof(asn_DEF_Error_1_tags) - /sizeof(asn_DEF_Error_1_tags[0]), /* 1 */ + asn_DEF_Error_tags_1, + sizeof(asn_DEF_Error_tags_1) + /sizeof(asn_DEF_Error_tags_1[0]), /* 1 */ + asn_DEF_Error_tags_1, /* Same as above */ + sizeof(asn_DEF_Error_tags_1) + /sizeof(asn_DEF_Error_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ - &asn_SPC_Error_1_specs /* Additional specs */ + &asn_SPC_Error_specs_1 /* Additional specs */ }; diff --git a/tests/39-sequence-of-OK.asn1.-P b/tests/39-sequence-of-OK.asn1.-P index 6339c4bf5..0e4691cf1 100644 --- a/tests/39-sequence-of-OK.asn1.-P +++ b/tests/39-sequence-of-OK.asn1.-P @@ -41,13 +41,15 @@ static asn_TYPE_member_t asn_MBR_collection_3[] = { .tag_mode = 0, .type = &asn_DEF_T2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_collection_3_tags[] = { +static ber_tlv_tag_t asn_DEF_collection_tags_3[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_collection_3_specs = { +static asn_SET_OF_specifics_t asn_SPC_collection_specs_3 = { sizeof(struct collection), offsetof(struct collection, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ @@ -63,16 +65,18 @@ asn_TYPE_descriptor_t asn_DEF_collection_3 = { SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_collection_3_tags, - sizeof(asn_DEF_collection_3_tags) - /sizeof(asn_DEF_collection_3_tags[0]), /* 1 */ - asn_DEF_collection_3_tags, /* Same as above */ - sizeof(asn_DEF_collection_3_tags) - /sizeof(asn_DEF_collection_3_tags[0]), /* 1 */ + asn_DEF_collection_tags_3, + sizeof(asn_DEF_collection_tags_3) + /sizeof(asn_DEF_collection_tags_3[0]), /* 1 */ + asn_DEF_collection_tags_3, /* Same as above */ + sizeof(asn_DEF_collection_tags_3) + /sizeof(asn_DEF_collection_tags_3[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_collection_3, 1, /* Single element */ - &asn_SPC_collection_3_specs /* Additional specs */ + &asn_SPC_collection_specs_3 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_T_1[] = { @@ -81,6 +85,8 @@ static asn_TYPE_member_t asn_MBR_T_1[] = { .tag_mode = 0, .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "int" }, { ATF_NOFLAGS, 0, offsetof(struct T, collection), @@ -88,21 +94,24 @@ static asn_TYPE_member_t asn_MBR_T_1[] = { .tag_mode = 0, .type = &asn_DEF_collection_3, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "collection" }, }; -static ber_tlv_tag_t asn_DEF_T_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_T_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_T_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* int at 15 */ { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 } /* collection at 17 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_T_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_T_specs_1 = { sizeof(struct T), offsetof(struct T, _asn_ctx), - asn_MAP_T_1_tag2el, + asn_MAP_T_tag2el_1, 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -116,16 +125,18 @@ asn_TYPE_descriptor_t asn_DEF_T = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T_1_tags, - sizeof(asn_DEF_T_1_tags) - /sizeof(asn_DEF_T_1_tags[0]), /* 1 */ - asn_DEF_T_1_tags, /* Same as above */ - sizeof(asn_DEF_T_1_tags) - /sizeof(asn_DEF_T_1_tags[0]), /* 1 */ + asn_DEF_T_tags_1, + sizeof(asn_DEF_T_tags_1) + /sizeof(asn_DEF_T_tags_1[0]), /* 1 */ + asn_DEF_T_tags_1, /* Same as above */ + sizeof(asn_DEF_T_tags_1) + /sizeof(asn_DEF_T_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_T_1, 2, /* Elements count */ - &asn_SPC_T_1_specs /* Additional specs */ + &asn_SPC_T_specs_1 /* Additional specs */ }; @@ -157,6 +168,8 @@ static asn_TYPE_member_t asn_MBR_T2_1[] = { .tag_mode = 0, .type = &asn_DEF_BOOLEAN, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "flag" }, { ATF_NOFLAGS, 0, offsetof(struct T2, str), @@ -164,21 +177,24 @@ static asn_TYPE_member_t asn_MBR_T2_1[] = { .tag_mode = 0, .type = &asn_DEF_UTF8String, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "str" }, }; -static ber_tlv_tag_t asn_DEF_T2_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T2_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_T2_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_T2_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 0, 0, 0 }, /* flag at 20 */ { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), 1, 0, 0 } /* str at 21 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_T2_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_T2_specs_1 = { sizeof(struct T2), offsetof(struct T2, _asn_ctx), - asn_MAP_T2_1_tag2el, + asn_MAP_T2_tag2el_1, 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -192,15 +208,17 @@ asn_TYPE_descriptor_t asn_DEF_T2 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T2_1_tags, - sizeof(asn_DEF_T2_1_tags) - /sizeof(asn_DEF_T2_1_tags[0]), /* 1 */ - asn_DEF_T2_1_tags, /* Same as above */ - sizeof(asn_DEF_T2_1_tags) - /sizeof(asn_DEF_T2_1_tags[0]), /* 1 */ + asn_DEF_T2_tags_1, + sizeof(asn_DEF_T2_tags_1) + /sizeof(asn_DEF_T2_tags_1[0]), /* 1 */ + asn_DEF_T2_tags_1, /* Same as above */ + sizeof(asn_DEF_T2_tags_1) + /sizeof(asn_DEF_T2_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_T2_1, 2, /* Elements count */ - &asn_SPC_T2_1_specs /* Additional specs */ + &asn_SPC_T2_specs_1 /* Additional specs */ }; diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index cd4626319..4c41f5339 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -40,7 +40,7 @@ extern asn_TYPE_descriptor_t asn_DEF_LogLine; /*** <<< CODE [LogLine] >>> ***/ static int -memb_varsets_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, +memb_varsets_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { size_t size; @@ -74,13 +74,15 @@ static asn_TYPE_member_t asn_MBR_varsets_3[] = { .tag_mode = 0, .type = &asn_DEF_VariablePartSet, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_varsets_3_tags[] = { +static ber_tlv_tag_t asn_DEF_varsets_tags_3[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_varsets_3_specs = { +static asn_SET_OF_specifics_t asn_SPC_varsets_specs_3 = { sizeof(struct varsets), offsetof(struct varsets, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ @@ -96,16 +98,18 @@ asn_TYPE_descriptor_t asn_DEF_varsets_3 = { SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_varsets_3_tags, - sizeof(asn_DEF_varsets_3_tags) - /sizeof(asn_DEF_varsets_3_tags[0]), /* 1 */ - asn_DEF_varsets_3_tags, /* Same as above */ - sizeof(asn_DEF_varsets_3_tags) - /sizeof(asn_DEF_varsets_3_tags[0]), /* 1 */ + asn_DEF_varsets_tags_3, + sizeof(asn_DEF_varsets_tags_3) + /sizeof(asn_DEF_varsets_tags_3[0]), /* 1 */ + asn_DEF_varsets_tags_3, /* Same as above */ + sizeof(asn_DEF_varsets_tags_3) + /sizeof(asn_DEF_varsets_tags_3[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_varsets_3, 1, /* Single element */ - &asn_SPC_varsets_3_specs /* Additional specs */ + &asn_SPC_varsets_specs_3 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_LogLine_1[] = { @@ -114,28 +118,33 @@ static asn_TYPE_member_t asn_MBR_LogLine_1[] = { .tag_mode = 0, .type = &asn_DEF_IA5String, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "line-digest" }, { ATF_NOFLAGS, 0, offsetof(struct LogLine, varsets), .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, .type = &asn_DEF_varsets_3, - .memb_constraints = memb_varsets_1_constraint, + .memb_constraints = memb_varsets_constraint_1, + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "varsets" }, }; -static ber_tlv_tag_t asn_DEF_LogLine_1_tags[] = { +static ber_tlv_tag_t asn_DEF_LogLine_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_LogLine_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_LogLine_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* varsets at 25 */ { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), 0, 0, 0 } /* line-digest at 23 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_LogLine_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_LogLine_specs_1 = { sizeof(struct LogLine), offsetof(struct LogLine, _asn_ctx), - asn_MAP_LogLine_1_tag2el, + asn_MAP_LogLine_tag2el_1, 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ 1, /* Start extensions */ 3 /* Stop extensions */ }; @@ -149,16 +158,18 @@ asn_TYPE_descriptor_t asn_DEF_LogLine = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_LogLine_1_tags, - sizeof(asn_DEF_LogLine_1_tags) - /sizeof(asn_DEF_LogLine_1_tags[0]), /* 1 */ - asn_DEF_LogLine_1_tags, /* Same as above */ - sizeof(asn_DEF_LogLine_1_tags) - /sizeof(asn_DEF_LogLine_1_tags[0]), /* 1 */ + asn_DEF_LogLine_tags_1, + sizeof(asn_DEF_LogLine_tags_1) + /sizeof(asn_DEF_LogLine_tags_1[0]), /* 1 */ + asn_DEF_LogLine_tags_1, /* Same as above */ + sizeof(asn_DEF_LogLine_tags_1) + /sizeof(asn_DEF_LogLine_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_LogLine_1, 2, /* Elements count */ - &asn_SPC_LogLine_1_specs /* Additional specs */ + &asn_SPC_LogLine_specs_1 /* Additional specs */ }; @@ -203,7 +214,7 @@ extern asn_TYPE_descriptor_t asn_DEF_VariablePartSet; /*** <<< CODE [VariablePartSet] >>> ***/ static int -memb_vparts_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, +memb_vparts_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { if(!sptr) { @@ -230,13 +241,15 @@ static asn_TYPE_member_t asn_MBR_vparts_2[] = { .tag_mode = 0, .type = &asn_DEF_VariablePart, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_vparts_2_tags[] = { +static ber_tlv_tag_t asn_DEF_vparts_tags_2[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_vparts_2_specs = { +static asn_SET_OF_specifics_t asn_SPC_vparts_specs_2 = { sizeof(struct vparts), offsetof(struct vparts, _asn_ctx), 2, /* XER encoding is XMLValueList */ @@ -252,16 +265,18 @@ asn_TYPE_descriptor_t asn_DEF_vparts_2 = { SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_vparts_2_tags, - sizeof(asn_DEF_vparts_2_tags) - /sizeof(asn_DEF_vparts_2_tags[0]), /* 1 */ - asn_DEF_vparts_2_tags, /* Same as above */ - sizeof(asn_DEF_vparts_2_tags) - /sizeof(asn_DEF_vparts_2_tags[0]), /* 1 */ + asn_DEF_vparts_tags_2, + sizeof(asn_DEF_vparts_tags_2) + /sizeof(asn_DEF_vparts_tags_2[0]), /* 1 */ + asn_DEF_vparts_tags_2, /* Same as above */ + sizeof(asn_DEF_vparts_tags_2) + /sizeof(asn_DEF_vparts_tags_2[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_vparts_2, 1, /* Single element */ - &asn_SPC_vparts_2_specs /* Additional specs */ + &asn_SPC_vparts_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_VariablePartSet_1[] = { @@ -269,7 +284,9 @@ static asn_TYPE_member_t asn_MBR_VariablePartSet_1[] = { .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), .tag_mode = 0, .type = &asn_DEF_vparts_2, - .memb_constraints = memb_vparts_1_constraint, + .memb_constraints = memb_vparts_constraint_1, + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "vparts" }, { ATF_NOFLAGS, 0, offsetof(struct VariablePartSet, resolution), @@ -277,21 +294,24 @@ static asn_TYPE_member_t asn_MBR_VariablePartSet_1[] = { .tag_mode = 0, .type = &asn_DEF_ActionItem, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "resolution" }, }; -static ber_tlv_tag_t asn_DEF_VariablePartSet_1_tags[] = { +static ber_tlv_tag_t asn_DEF_VariablePartSet_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_VariablePartSet_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_VariablePartSet_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* vparts at 33 */ { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 0 } /* resolution at 35 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_VariablePartSet_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_VariablePartSet_specs_1 = { sizeof(struct VariablePartSet), offsetof(struct VariablePartSet, _asn_ctx), - asn_MAP_VariablePartSet_1_tag2el, + asn_MAP_VariablePartSet_tag2el_1, 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ 1, /* Start extensions */ 3 /* Stop extensions */ }; @@ -305,16 +325,18 @@ asn_TYPE_descriptor_t asn_DEF_VariablePartSet = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_VariablePartSet_1_tags, - sizeof(asn_DEF_VariablePartSet_1_tags) - /sizeof(asn_DEF_VariablePartSet_1_tags[0]), /* 1 */ - asn_DEF_VariablePartSet_1_tags, /* Same as above */ - sizeof(asn_DEF_VariablePartSet_1_tags) - /sizeof(asn_DEF_VariablePartSet_1_tags[0]), /* 1 */ + asn_DEF_VariablePartSet_tags_1, + sizeof(asn_DEF_VariablePartSet_tags_1) + /sizeof(asn_DEF_VariablePartSet_tags_1[0]), /* 1 */ + asn_DEF_VariablePartSet_tags_1, /* Same as above */ + sizeof(asn_DEF_VariablePartSet_tags_1) + /sizeof(asn_DEF_VariablePartSet_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_VariablePartSet_1, 2, /* Elements count */ - &asn_SPC_VariablePartSet_1_specs /* Additional specs */ + &asn_SPC_VariablePartSet_specs_1 /* Additional specs */ }; @@ -374,7 +396,7 @@ extern asn_TYPE_descriptor_t asn_DEF_VariablePart; /*** <<< CODE [VariablePart] >>> ***/ static int -memb_vset_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, +memb_vset_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { size_t size; @@ -408,13 +430,15 @@ static asn_TYPE_member_t asn_MBR_vset_2[] = { .tag_mode = 0, .type = &asn_DEF_VisibleString, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_vset_2_tags[] = { +static ber_tlv_tag_t asn_DEF_vset_tags_2[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_vset_2_specs = { +static asn_SET_OF_specifics_t asn_SPC_vset_specs_2 = { sizeof(struct vset), offsetof(struct vset, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ @@ -430,16 +454,18 @@ asn_TYPE_descriptor_t asn_DEF_vset_2 = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_vset_2_tags, - sizeof(asn_DEF_vset_2_tags) - /sizeof(asn_DEF_vset_2_tags[0]), /* 1 */ - asn_DEF_vset_2_tags, /* Same as above */ - sizeof(asn_DEF_vset_2_tags) - /sizeof(asn_DEF_vset_2_tags[0]), /* 1 */ + asn_DEF_vset_tags_2, + sizeof(asn_DEF_vset_tags_2) + /sizeof(asn_DEF_vset_tags_2[0]), /* 1 */ + asn_DEF_vset_tags_2, /* Same as above */ + sizeof(asn_DEF_vset_tags_2) + /sizeof(asn_DEF_vset_tags_2[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_vset_2, 1, /* Single element */ - &asn_SPC_vset_2_specs /* Additional specs */ + &asn_SPC_vset_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_vrange_4[] = { @@ -448,6 +474,8 @@ static asn_TYPE_member_t asn_MBR_vrange_4[] = { .tag_mode = 0, .type = &asn_DEF_VisibleString, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "from" }, { ATF_NOFLAGS, 0, offsetof(struct vrange, to), @@ -455,21 +483,24 @@ static asn_TYPE_member_t asn_MBR_vrange_4[] = { .tag_mode = 0, .type = &asn_DEF_VisibleString, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "to" }, }; -static ber_tlv_tag_t asn_DEF_vrange_4_tags[] = { +static ber_tlv_tag_t asn_DEF_vrange_tags_4[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_vrange_4_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_vrange_tag2el_4[] = { { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), 0, 0, 1 }, /* from at 45 */ { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), 1, -1, 0 } /* to at 46 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_vrange_4_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_vrange_specs_4 = { sizeof(struct vrange), offsetof(struct vrange, _asn_ctx), - asn_MAP_vrange_4_tag2el, + asn_MAP_vrange_tag2el_4, 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ 1, /* Start extensions */ 3 /* Stop extensions */ }; @@ -484,16 +515,18 @@ asn_TYPE_descriptor_t asn_DEF_vrange_4 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_vrange_4_tags, - sizeof(asn_DEF_vrange_4_tags) - /sizeof(asn_DEF_vrange_4_tags[0]), /* 1 */ - asn_DEF_vrange_4_tags, /* Same as above */ - sizeof(asn_DEF_vrange_4_tags) - /sizeof(asn_DEF_vrange_4_tags[0]), /* 1 */ + asn_DEF_vrange_tags_4, + sizeof(asn_DEF_vrange_tags_4) + /sizeof(asn_DEF_vrange_tags_4[0]), /* 1 */ + asn_DEF_vrange_tags_4, /* Same as above */ + sizeof(asn_DEF_vrange_tags_4) + /sizeof(asn_DEF_vrange_tags_4[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_vrange_4, 2, /* Elements count */ - &asn_SPC_vrange_4_specs /* Additional specs */ + &asn_SPC_vrange_specs_4 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_VariablePart_1[] = { @@ -501,7 +534,9 @@ static asn_TYPE_member_t asn_MBR_VariablePart_1[] = { .tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), .tag_mode = 0, .type = &asn_DEF_vset_2, - .memb_constraints = memb_vset_1_constraint, + .memb_constraints = memb_vset_constraint_1, + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "vset" }, { ATF_NOFLAGS, 0, offsetof(struct VariablePart, choice.vrange), @@ -509,21 +544,24 @@ static asn_TYPE_member_t asn_MBR_VariablePart_1[] = { .tag_mode = 0, .type = &asn_DEF_vrange_4, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "vrange" }, }; -static asn_TYPE_tag2member_t asn_MAP_VariablePart_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_VariablePart_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* vrange at 45 */ { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0, 0, 0 } /* vset at 42 */ }; -static asn_CHOICE_specifics_t asn_SPC_VariablePart_1_specs = { +static asn_CHOICE_specifics_t asn_SPC_VariablePart_specs_1 = { sizeof(struct VariablePart), offsetof(struct VariablePart, _asn_ctx), offsetof(struct VariablePart, present), sizeof(((struct VariablePart *)0)->present), - asn_MAP_VariablePart_1_tag2el, + asn_MAP_VariablePart_tag2el_1, 2, /* Count of tags in the map */ - 1 /* Whether extensible */ + .canonical_order = 0, + .ext_start = 2 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_VariablePart = { "VariablePart", @@ -535,14 +573,16 @@ asn_TYPE_descriptor_t asn_DEF_VariablePart = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_VariablePart_1, 2, /* Elements count */ - &asn_SPC_VariablePart_1_specs /* Additional specs */ + &asn_SPC_VariablePart_specs_1 /* Additional specs */ }; @@ -622,6 +662,9 @@ accept_as_2_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; + td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ @@ -674,26 +717,26 @@ accept_as_2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [ActionItem] >>> ***/ -static asn_INTEGER_enum_map_t asn_MAP_accept_as_2_value2enum[] = { +static asn_INTEGER_enum_map_t asn_MAP_accept_as_value2enum_2[] = { { 0, 7, "unknown" }, { 1, 4, "safe" }, { 2, 6, "unsafe" } /* This list is extensible */ }; -static unsigned int asn_MAP_accept_as_2_enum2value[] = { +static unsigned int asn_MAP_accept_as_enum2value_2[] = { 1, /* safe(1) */ 0, /* unknown(0) */ 2 /* unsafe(2) */ /* This list is extensible */ }; -static asn_INTEGER_specifics_t asn_SPC_accept_as_2_specs = { - asn_MAP_accept_as_2_value2enum, /* "tag" => N; sorted by tag */ - asn_MAP_accept_as_2_enum2value, /* N => "tag"; sorted by N */ +static asn_INTEGER_specifics_t asn_SPC_accept_as_specs_2 = { + asn_MAP_accept_as_value2enum_2, /* "tag" => N; sorted by tag */ + asn_MAP_accept_as_enum2value_2, /* N => "tag"; sorted by N */ 3, /* Number of elements in the maps */ - 1, /* Enumeration is extensible */ + 4, /* Extensions before this member */ 1 /* Strict enumeration */ }; -static ber_tlv_tag_t asn_DEF_accept_as_2_tags[] = { +static ber_tlv_tag_t asn_DEF_accept_as_tags_2[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; static /* Use -fall-defs-global to expose */ @@ -707,15 +750,17 @@ asn_TYPE_descriptor_t asn_DEF_accept_as_2 = { accept_as_2_encode_der, accept_as_2_decode_xer, accept_as_2_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_accept_as_2_tags, - sizeof(asn_DEF_accept_as_2_tags) - /sizeof(asn_DEF_accept_as_2_tags[0]), /* 1 */ - asn_DEF_accept_as_2_tags, /* Same as above */ - sizeof(asn_DEF_accept_as_2_tags) - /sizeof(asn_DEF_accept_as_2_tags[0]), /* 1 */ + asn_DEF_accept_as_tags_2, + sizeof(asn_DEF_accept_as_tags_2) + /sizeof(asn_DEF_accept_as_tags_2[0]), /* 1 */ + asn_DEF_accept_as_tags_2, /* Same as above */ + sizeof(asn_DEF_accept_as_tags_2) + /sizeof(asn_DEF_accept_as_tags_2[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* Defined elsewhere */ - &asn_SPC_accept_as_2_specs /* Additional specs */ + &asn_SPC_accept_as_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_email_9[] = { @@ -724,13 +769,15 @@ static asn_TYPE_member_t asn_MBR_email_9[] = { .tag_mode = 0, .type = &asn_DEF_VisibleString, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_email_9_tags[] = { +static ber_tlv_tag_t asn_DEF_email_tags_9[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_email_9_specs = { +static asn_SET_OF_specifics_t asn_SPC_email_specs_9 = { sizeof(struct email), offsetof(struct email, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ @@ -746,16 +793,18 @@ asn_TYPE_descriptor_t asn_DEF_email_9 = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_email_9_tags, - sizeof(asn_DEF_email_9_tags) - /sizeof(asn_DEF_email_9_tags[0]), /* 1 */ - asn_DEF_email_9_tags, /* Same as above */ - sizeof(asn_DEF_email_9_tags) - /sizeof(asn_DEF_email_9_tags[0]), /* 1 */ + asn_DEF_email_tags_9, + sizeof(asn_DEF_email_tags_9) + /sizeof(asn_DEF_email_tags_9[0]), /* 1 */ + asn_DEF_email_tags_9, /* Same as above */ + sizeof(asn_DEF_email_tags_9) + /sizeof(asn_DEF_email_tags_9[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_email_9, 1, /* Single element */ - &asn_SPC_email_9_specs /* Additional specs */ + &asn_SPC_email_specs_9 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_notify_7[] = { @@ -764,6 +813,8 @@ static asn_TYPE_member_t asn_MBR_notify_7[] = { .tag_mode = 0, .type = &asn_DEF_BOOLEAN, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "critical" }, { ATF_NOFLAGS, 0, offsetof(struct notify, email), @@ -771,21 +822,24 @@ static asn_TYPE_member_t asn_MBR_notify_7[] = { .tag_mode = 0, .type = &asn_DEF_email_9, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "email" }, }; -static ber_tlv_tag_t asn_DEF_notify_7_tags[] = { +static ber_tlv_tag_t asn_DEF_notify_tags_7[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_notify_7_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_notify_tag2el_7[] = { { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 0, 0, 0 }, /* critical at 61 */ { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 1, 0, 0 } /* email at 62 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_notify_7_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_notify_specs_7 = { sizeof(struct notify), offsetof(struct notify, _asn_ctx), - asn_MAP_notify_7_tag2el, + asn_MAP_notify_tag2el_7, 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ 1, /* Start extensions */ 3 /* Stop extensions */ }; @@ -800,16 +854,18 @@ asn_TYPE_descriptor_t asn_DEF_notify_7 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_notify_7_tags, - sizeof(asn_DEF_notify_7_tags) - /sizeof(asn_DEF_notify_7_tags[0]), /* 1 */ - asn_DEF_notify_7_tags, /* Same as above */ - sizeof(asn_DEF_notify_7_tags) - /sizeof(asn_DEF_notify_7_tags[0]), /* 1 */ + asn_DEF_notify_tags_7, + sizeof(asn_DEF_notify_tags_7) + /sizeof(asn_DEF_notify_tags_7[0]), /* 1 */ + asn_DEF_notify_tags_7, /* Same as above */ + sizeof(asn_DEF_notify_tags_7) + /sizeof(asn_DEF_notify_tags_7[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_notify_7, 2, /* Elements count */ - &asn_SPC_notify_7_specs /* Additional specs */ + &asn_SPC_notify_specs_7 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_ActionItem_1[] = { @@ -818,6 +874,8 @@ static asn_TYPE_member_t asn_MBR_ActionItem_1[] = { .tag_mode = 0, .type = &asn_DEF_accept_as_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "accept-as" }, { ATF_POINTER, 1, offsetof(struct ActionItem, notify), @@ -825,21 +883,24 @@ static asn_TYPE_member_t asn_MBR_ActionItem_1[] = { .tag_mode = 0, .type = &asn_DEF_notify_7, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "notify" }, }; -static ber_tlv_tag_t asn_DEF_ActionItem_1_tags[] = { +static ber_tlv_tag_t asn_DEF_ActionItem_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_ActionItem_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_ActionItem_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, 0, 0 }, /* accept-as at 55 */ { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 } /* notify at 61 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_ActionItem_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_ActionItem_specs_1 = { sizeof(struct ActionItem), offsetof(struct ActionItem, _asn_ctx), - asn_MAP_ActionItem_1_tag2el, + asn_MAP_ActionItem_tag2el_1, 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ 1, /* Start extensions */ 3 /* Stop extensions */ }; @@ -853,15 +914,17 @@ asn_TYPE_descriptor_t asn_DEF_ActionItem = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_ActionItem_1_tags, - sizeof(asn_DEF_ActionItem_1_tags) - /sizeof(asn_DEF_ActionItem_1_tags[0]), /* 1 */ - asn_DEF_ActionItem_1_tags, /* Same as above */ - sizeof(asn_DEF_ActionItem_1_tags) - /sizeof(asn_DEF_ActionItem_1_tags[0]), /* 1 */ + asn_DEF_ActionItem_tags_1, + sizeof(asn_DEF_ActionItem_tags_1) + /sizeof(asn_DEF_ActionItem_tags_1[0]), /* 1 */ + asn_DEF_ActionItem_tags_1, /* Same as above */ + sizeof(asn_DEF_ActionItem_tags_1) + /sizeof(asn_DEF_ActionItem_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_ActionItem_1, 2, /* Elements count */ - &asn_SPC_ActionItem_1_specs /* Additional specs */ + &asn_SPC_ActionItem_specs_1 /* Additional specs */ }; diff --git a/tests/43-recursion-OK.asn1.-P b/tests/43-recursion-OK.asn1.-P index a3480364f..2c4f3c777 100644 --- a/tests/43-recursion-OK.asn1.-P +++ b/tests/43-recursion-OK.asn1.-P @@ -50,13 +50,15 @@ static asn_TYPE_member_t asn_MBR_t_member1_2[] = { .tag_mode = 0, .type = &asn_DEF_Test_structure_1, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_t_member1_2_tags[] = { +static ber_tlv_tag_t asn_DEF_t_member1_tags_2[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_t_member1_2_specs = { +static asn_SET_OF_specifics_t asn_SPC_t_member1_specs_2 = { sizeof(struct t_member1), offsetof(struct t_member1, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ @@ -72,16 +74,18 @@ asn_TYPE_descriptor_t asn_DEF_t_member1_2 = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_t_member1_2_tags, - sizeof(asn_DEF_t_member1_2_tags) - /sizeof(asn_DEF_t_member1_2_tags[0]), /* 1 */ - asn_DEF_t_member1_2_tags, /* Same as above */ - sizeof(asn_DEF_t_member1_2_tags) - /sizeof(asn_DEF_t_member1_2_tags[0]), /* 1 */ + asn_DEF_t_member1_tags_2, + sizeof(asn_DEF_t_member1_tags_2) + /sizeof(asn_DEF_t_member1_tags_2[0]), /* 1 */ + asn_DEF_t_member1_tags_2, /* Same as above */ + sizeof(asn_DEF_t_member1_tags_2) + /sizeof(asn_DEF_t_member1_tags_2[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_t_member1_2, 1, /* Single element */ - &asn_SPC_t_member1_2_specs /* Additional specs */ + &asn_SPC_t_member1_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_t_member2_4[] = { @@ -90,13 +94,15 @@ static asn_TYPE_member_t asn_MBR_t_member2_4[] = { .tag_mode = 0, .type = &asn_DEF_Test_structure_1, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_t_member2_4_tags[] = { +static ber_tlv_tag_t asn_DEF_t_member2_tags_4[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_t_member2_4_specs = { +static asn_SET_OF_specifics_t asn_SPC_t_member2_specs_4 = { sizeof(struct t_member2), offsetof(struct t_member2, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ @@ -112,16 +118,18 @@ asn_TYPE_descriptor_t asn_DEF_t_member2_4 = { SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_t_member2_4_tags, - sizeof(asn_DEF_t_member2_4_tags) - /sizeof(asn_DEF_t_member2_4_tags[0]), /* 1 */ - asn_DEF_t_member2_4_tags, /* Same as above */ - sizeof(asn_DEF_t_member2_4_tags) - /sizeof(asn_DEF_t_member2_4_tags[0]), /* 1 */ + asn_DEF_t_member2_tags_4, + sizeof(asn_DEF_t_member2_tags_4) + /sizeof(asn_DEF_t_member2_tags_4[0]), /* 1 */ + asn_DEF_t_member2_tags_4, /* Same as above */ + sizeof(asn_DEF_t_member2_tags_4) + /sizeof(asn_DEF_t_member2_tags_4[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_t_member2_4, 1, /* Single element */ - &asn_SPC_t_member2_4_specs /* Additional specs */ + &asn_SPC_t_member2_specs_4 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_Test_structure_1_1[] = { @@ -130,6 +138,8 @@ static asn_TYPE_member_t asn_MBR_Test_structure_1_1[] = { .tag_mode = 0, .type = &asn_DEF_t_member1_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "t-member1" }, { ATF_NOFLAGS, 0, offsetof(struct Test_structure_1, t_member2), @@ -137,6 +147,8 @@ static asn_TYPE_member_t asn_MBR_Test_structure_1_1[] = { .tag_mode = 0, .type = &asn_DEF_t_member2_4, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "t-member2" }, { ATF_POINTER, 1, offsetof(struct Test_structure_1, t_member3), @@ -144,6 +156,8 @@ static asn_TYPE_member_t asn_MBR_Test_structure_1_1[] = { .tag_mode = 0, .type = &asn_DEF_Test_structure_1, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "t-member3" }, { ATF_NOFLAGS, 0, offsetof(struct Test_structure_1, t_member4), @@ -151,23 +165,26 @@ static asn_TYPE_member_t asn_MBR_Test_structure_1_1[] = { .tag_mode = 0, .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "t-member4" }, }; -static ber_tlv_tag_t asn_DEF_Test_structure_1_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Test_structure_1_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Test_structure_1_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Test_structure_1_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 3, 0, 0 }, /* t-member4 at 19 */ { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 1 }, /* t-member2 at 16 */ { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 0 }, /* t-member3 at 17 */ { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0, 0, 0 } /* t-member1 at 15 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Test_structure_1_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Test_structure_1_specs_1 = { sizeof(struct Test_structure_1), offsetof(struct Test_structure_1, _asn_ctx), - asn_MAP_Test_structure_1_1_tag2el, + asn_MAP_Test_structure_1_tag2el_1, 4, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -181,16 +198,18 @@ asn_TYPE_descriptor_t asn_DEF_Test_structure_1 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Test_structure_1_1_tags, - sizeof(asn_DEF_Test_structure_1_1_tags) - /sizeof(asn_DEF_Test_structure_1_1_tags[0]), /* 1 */ - asn_DEF_Test_structure_1_1_tags, /* Same as above */ - sizeof(asn_DEF_Test_structure_1_1_tags) - /sizeof(asn_DEF_Test_structure_1_1_tags[0]), /* 1 */ + asn_DEF_Test_structure_1_tags_1, + sizeof(asn_DEF_Test_structure_1_tags_1) + /sizeof(asn_DEF_Test_structure_1_tags_1[0]), /* 1 */ + asn_DEF_Test_structure_1_tags_1, /* Same as above */ + sizeof(asn_DEF_Test_structure_1_tags_1) + /sizeof(asn_DEF_Test_structure_1_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Test_structure_1_1, 4, /* Elements count */ - &asn_SPC_Test_structure_1_1_specs /* Additional specs */ + &asn_SPC_Test_structure_1_specs_1 /* Additional specs */ }; @@ -251,14 +270,16 @@ static asn_TYPE_member_t asn_MBR_or_3[] = { .tag_mode = 0, .type = &asn_DEF_Choice_1, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_or_3_tags[] = { +static ber_tlv_tag_t asn_DEF_or_tags_3[] = { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_or_3_specs = { +static asn_SET_OF_specifics_t asn_SPC_or_specs_3 = { sizeof(struct or), offsetof(struct or, _asn_ctx), 2, /* XER encoding is XMLValueList */ @@ -274,16 +295,18 @@ asn_TYPE_descriptor_t asn_DEF_or_3 = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_or_3_tags, - sizeof(asn_DEF_or_3_tags) - /sizeof(asn_DEF_or_3_tags[0]) - 1, /* 1 */ - asn_DEF_or_3_tags, /* Same as above */ - sizeof(asn_DEF_or_3_tags) - /sizeof(asn_DEF_or_3_tags[0]), /* 2 */ + asn_DEF_or_tags_3, + sizeof(asn_DEF_or_tags_3) + /sizeof(asn_DEF_or_tags_3[0]) - 1, /* 1 */ + asn_DEF_or_tags_3, /* Same as above */ + sizeof(asn_DEF_or_tags_3) + /sizeof(asn_DEF_or_tags_3[0]), /* 2 */ + 0, /* No PER visible constraints */ asn_MBR_or_3, 1, /* Single element */ - &asn_SPC_or_3_specs /* Additional specs */ + &asn_SPC_or_specs_3 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_Choice_1_1[] = { @@ -292,6 +315,8 @@ static asn_TYPE_member_t asn_MBR_Choice_1_1[] = { .tag_mode = +1, /* EXPLICIT tag at current level */ .type = &asn_DEF_Choice_1, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "and" }, { ATF_NOFLAGS, 0, offsetof(struct Choice_1, choice.or), @@ -299,6 +324,8 @@ static asn_TYPE_member_t asn_MBR_Choice_1_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_or_3, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "or" }, { ATF_POINTER, 0, offsetof(struct Choice_1, choice.not), @@ -306,6 +333,8 @@ static asn_TYPE_member_t asn_MBR_Choice_1_1[] = { .tag_mode = +1, /* EXPLICIT tag at current level */ .type = &asn_DEF_Choice_1, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "not" }, { ATF_NOFLAGS, 0, offsetof(struct Choice_1, choice.other), @@ -313,23 +342,26 @@ static asn_TYPE_member_t asn_MBR_Choice_1_1[] = { .tag_mode = +1, /* EXPLICIT tag at current level */ .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "other" }, }; -static asn_TYPE_tag2member_t asn_MAP_Choice_1_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Choice_1_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* and at 22 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* or at 23 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* not at 24 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 3, 0, 0 } /* other at 26 */ }; -static asn_CHOICE_specifics_t asn_SPC_Choice_1_1_specs = { +static asn_CHOICE_specifics_t asn_SPC_Choice_1_specs_1 = { sizeof(struct Choice_1), offsetof(struct Choice_1, _asn_ctx), offsetof(struct Choice_1, present), sizeof(((struct Choice_1 *)0)->present), - asn_MAP_Choice_1_1_tag2el, + asn_MAP_Choice_1_tag2el_1, 4, /* Count of tags in the map */ - 0 /* Whether extensible */ + .canonical_order = 0, + .ext_start = -1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_Choice_1 = { "Choice-1", @@ -341,14 +373,16 @@ asn_TYPE_descriptor_t asn_DEF_Choice_1 = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_Choice_1_1, 4, /* Elements count */ - &asn_SPC_Choice_1_1_specs /* Additional specs */ + &asn_SPC_Choice_1_specs_1 /* Additional specs */ }; @@ -399,28 +433,30 @@ static asn_TYPE_member_t asn_MBR_Test_structure_2_1[] = { .tag_mode = 0, .type = &asn_DEF_Test_structure_3, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m1" }, }; -static ber_tlv_tag_t asn_DEF_Test_structure_2_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Test_structure_2_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Test_structure_2_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Test_structure_2_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0, 0, 0 } /* m1 at 28 */ }; -static uint8_t asn_MAP_Test_structure_2_1_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { +static uint8_t asn_MAP_Test_structure_2_mmap_1[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { (0 << 7) }; -static asn_SET_specifics_t asn_SPC_Test_structure_2_1_specs = { +static asn_SET_specifics_t asn_SPC_Test_structure_2_specs_1 = { sizeof(struct Test_structure_2), offsetof(struct Test_structure_2, _asn_ctx), offsetof(struct Test_structure_2, _presence_map), - asn_MAP_Test_structure_2_1_tag2el, + asn_MAP_Test_structure_2_tag2el_1, 1, /* Count of tags in the map */ - asn_MAP_Test_structure_2_1_tag2el, /* Same as above */ + asn_MAP_Test_structure_2_tag2el_1, /* Same as above */ 1, /* Count of tags in the CXER map */ 0, /* Whether extensible */ - (unsigned int *)asn_MAP_Test_structure_2_1_mmap /* Mandatory elements map */ + (unsigned int *)asn_MAP_Test_structure_2_mmap_1 /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_Test_structure_2 = { "Test-structure-2", @@ -432,16 +468,18 @@ asn_TYPE_descriptor_t asn_DEF_Test_structure_2 = { SET_encode_der, SET_decode_xer, SET_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Test_structure_2_1_tags, - sizeof(asn_DEF_Test_structure_2_1_tags) - /sizeof(asn_DEF_Test_structure_2_1_tags[0]), /* 1 */ - asn_DEF_Test_structure_2_1_tags, /* Same as above */ - sizeof(asn_DEF_Test_structure_2_1_tags) - /sizeof(asn_DEF_Test_structure_2_1_tags[0]), /* 1 */ + asn_DEF_Test_structure_2_tags_1, + sizeof(asn_DEF_Test_structure_2_tags_1) + /sizeof(asn_DEF_Test_structure_2_tags_1[0]), /* 1 */ + asn_DEF_Test_structure_2_tags_1, /* Same as above */ + sizeof(asn_DEF_Test_structure_2_tags_1) + /sizeof(asn_DEF_Test_structure_2_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Test_structure_2_1, 1, /* Elements count */ - &asn_SPC_Test_structure_2_1_specs /* Additional specs */ + &asn_SPC_Test_structure_2_specs_1 /* Additional specs */ }; @@ -492,28 +530,30 @@ static asn_TYPE_member_t asn_MBR_Test_structure_3_1[] = { .tag_mode = 0, .type = &asn_DEF_Test_structure_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m1" }, }; -static ber_tlv_tag_t asn_DEF_Test_structure_3_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Test_structure_3_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Test_structure_3_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Test_structure_3_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0, 0, 0 } /* m1 at 29 */ }; -static uint8_t asn_MAP_Test_structure_3_1_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { +static uint8_t asn_MAP_Test_structure_3_mmap_1[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { (0 << 7) }; -static asn_SET_specifics_t asn_SPC_Test_structure_3_1_specs = { +static asn_SET_specifics_t asn_SPC_Test_structure_3_specs_1 = { sizeof(struct Test_structure_3), offsetof(struct Test_structure_3, _asn_ctx), offsetof(struct Test_structure_3, _presence_map), - asn_MAP_Test_structure_3_1_tag2el, + asn_MAP_Test_structure_3_tag2el_1, 1, /* Count of tags in the map */ - asn_MAP_Test_structure_3_1_tag2el, /* Same as above */ + asn_MAP_Test_structure_3_tag2el_1, /* Same as above */ 1, /* Count of tags in the CXER map */ 0, /* Whether extensible */ - (unsigned int *)asn_MAP_Test_structure_3_1_mmap /* Mandatory elements map */ + (unsigned int *)asn_MAP_Test_structure_3_mmap_1 /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_Test_structure_3 = { "Test-structure-3", @@ -525,15 +565,17 @@ asn_TYPE_descriptor_t asn_DEF_Test_structure_3 = { SET_encode_der, SET_decode_xer, SET_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Test_structure_3_1_tags, - sizeof(asn_DEF_Test_structure_3_1_tags) - /sizeof(asn_DEF_Test_structure_3_1_tags[0]), /* 1 */ - asn_DEF_Test_structure_3_1_tags, /* Same as above */ - sizeof(asn_DEF_Test_structure_3_1_tags) - /sizeof(asn_DEF_Test_structure_3_1_tags[0]), /* 1 */ + asn_DEF_Test_structure_3_tags_1, + sizeof(asn_DEF_Test_structure_3_tags_1) + /sizeof(asn_DEF_Test_structure_3_tags_1[0]), /* 1 */ + asn_DEF_Test_structure_3_tags_1, /* Same as above */ + sizeof(asn_DEF_Test_structure_3_tags_1) + /sizeof(asn_DEF_Test_structure_3_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Test_structure_3_1, 1, /* Elements count */ - &asn_SPC_Test_structure_3_1_specs /* Additional specs */ + &asn_SPC_Test_structure_3_specs_1 /* Additional specs */ }; diff --git a/tests/44-choice-in-sequence-OK.asn1.-P b/tests/44-choice-in-sequence-OK.asn1.-P index 28578eef1..012140713 100644 --- a/tests/44-choice-in-sequence-OK.asn1.-P +++ b/tests/44-choice-in-sequence-OK.asn1.-P @@ -76,6 +76,8 @@ static asn_TYPE_member_t asn_MBR_e_6[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_NULL, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "f" }, { ATF_NOFLAGS, 0, offsetof(struct e, choice.g), @@ -83,21 +85,24 @@ static asn_TYPE_member_t asn_MBR_e_6[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_NULL, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "g" }, }; -static asn_TYPE_tag2member_t asn_MAP_e_6_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_e_tag2el_6[] = { { (ASN_TAG_CLASS_PRIVATE | (7 << 2)), 0, 0, 0 }, /* f at 20 */ { (ASN_TAG_CLASS_PRIVATE | (8 << 2)), 1, 0, 0 } /* g at 21 */ }; -static asn_CHOICE_specifics_t asn_SPC_e_6_specs = { +static asn_CHOICE_specifics_t asn_SPC_e_specs_6 = { sizeof(struct e), offsetof(struct e, _asn_ctx), offsetof(struct e, present), sizeof(((struct e *)0)->present), - asn_MAP_e_6_tag2el, + asn_MAP_e_tag2el_6, 2, /* Count of tags in the map */ - 0 /* Whether extensible */ + .canonical_order = 0, + .ext_start = -1 /* Extensions start */ }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_e_6 = { @@ -110,14 +115,16 @@ asn_TYPE_descriptor_t asn_DEF_e_6 = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_e_6, 2, /* Elements count */ - &asn_SPC_e_6_specs /* Additional specs */ + &asn_SPC_e_specs_6 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_h_9[] = { @@ -126,6 +133,8 @@ static asn_TYPE_member_t asn_MBR_h_9[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_NULL, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "i" }, { ATF_NOFLAGS, 0, offsetof(struct h, choice.j), @@ -133,21 +142,24 @@ static asn_TYPE_member_t asn_MBR_h_9[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_NULL, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "j" }, }; -static asn_TYPE_tag2member_t asn_MAP_h_9_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_h_tag2el_9[] = { { (ASN_TAG_CLASS_PRIVATE | (1 << 2)), 0, 0, 0 }, /* i at 24 */ { (ASN_TAG_CLASS_PRIVATE | (2 << 2)), 1, 0, 0 } /* j at 25 */ }; -static asn_CHOICE_specifics_t asn_SPC_h_9_specs = { +static asn_CHOICE_specifics_t asn_SPC_h_specs_9 = { sizeof(struct h), offsetof(struct h, _asn_ctx), offsetof(struct h, present), sizeof(((struct h *)0)->present), - asn_MAP_h_9_tag2el, + asn_MAP_h_tag2el_9, 2, /* Count of tags in the map */ - 0 /* Whether extensible */ + .canonical_order = 0, + .ext_start = -1 /* Extensions start */ }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_h_9 = { @@ -160,14 +172,16 @@ asn_TYPE_descriptor_t asn_DEF_h_9 = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_h_9, 2, /* Elements count */ - &asn_SPC_h_9_specs /* Additional specs */ + &asn_SPC_h_specs_9 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_b_3[] = { @@ -176,6 +190,8 @@ static asn_TYPE_member_t asn_MBR_b_3[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_NULL, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "c" }, { ATF_NOFLAGS, 0, offsetof(struct b, choice.d), @@ -183,6 +199,8 @@ static asn_TYPE_member_t asn_MBR_b_3[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_NULL, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "d" }, { ATF_NOFLAGS, 0, offsetof(struct b, choice.e), @@ -190,6 +208,8 @@ static asn_TYPE_member_t asn_MBR_b_3[] = { .tag_mode = 0, .type = &asn_DEF_e_6, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "e" }, { ATF_NOFLAGS, 0, offsetof(struct b, choice.h), @@ -197,24 +217,27 @@ static asn_TYPE_member_t asn_MBR_b_3[] = { .tag_mode = +1, /* EXPLICIT tag at current level */ .type = &asn_DEF_h_9, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "h" }, }; -static asn_TYPE_tag2member_t asn_MAP_b_3_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_b_tag2el_3[] = { { (ASN_TAG_CLASS_PRIVATE | (5 << 2)), 0, 0, 0 }, /* c at 17 */ { (ASN_TAG_CLASS_PRIVATE | (6 << 2)), 1, 0, 0 }, /* d at 18 */ { (ASN_TAG_CLASS_PRIVATE | (7 << 2)), 2, 0, 0 }, /* f at 20 */ { (ASN_TAG_CLASS_PRIVATE | (8 << 2)), 2, 0, 0 }, /* g at 21 */ { (ASN_TAG_CLASS_PRIVATE | (9 << 2)), 3, 0, 0 } /* h at 24 */ }; -static asn_CHOICE_specifics_t asn_SPC_b_3_specs = { +static asn_CHOICE_specifics_t asn_SPC_b_specs_3 = { sizeof(struct b), offsetof(struct b, _asn_ctx), offsetof(struct b, present), sizeof(((struct b *)0)->present), - asn_MAP_b_3_tag2el, + asn_MAP_b_tag2el_3, 5, /* Count of tags in the map */ - 0 /* Whether extensible */ + .canonical_order = 0, + .ext_start = -1 /* Extensions start */ }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_b_3 = { @@ -227,14 +250,16 @@ asn_TYPE_descriptor_t asn_DEF_b_3 = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_b_3, 4, /* Elements count */ - &asn_SPC_b_3_specs /* Additional specs */ + &asn_SPC_b_specs_3 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_T_1[] = { @@ -243,6 +268,8 @@ static asn_TYPE_member_t asn_MBR_T_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_NULL, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "a" }, { ATF_NOFLAGS, 0, offsetof(struct T, b), @@ -250,14 +277,16 @@ static asn_TYPE_member_t asn_MBR_T_1[] = { .tag_mode = 0, .type = &asn_DEF_b_3, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "b" }, }; -static ber_tlv_tag_t asn_DEF_T_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T_tags_1[] = { (ASN_TAG_CLASS_PRIVATE | (1 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_T_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_T_tag2el_1[] = { { (ASN_TAG_CLASS_PRIVATE | (2 << 2)), 0, 0, 0 }, /* a at 15 */ { (ASN_TAG_CLASS_PRIVATE | (5 << 2)), 1, 0, 0 }, /* c at 17 */ { (ASN_TAG_CLASS_PRIVATE | (6 << 2)), 1, 0, 0 }, /* d at 18 */ @@ -265,11 +294,12 @@ static asn_TYPE_tag2member_t asn_MAP_T_1_tag2el[] = { { (ASN_TAG_CLASS_PRIVATE | (8 << 2)), 1, 0, 0 }, /* g at 21 */ { (ASN_TAG_CLASS_PRIVATE | (9 << 2)), 1, 0, 0 } /* h at 24 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_T_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_T_specs_1 = { sizeof(struct T), offsetof(struct T, _asn_ctx), - asn_MAP_T_1_tag2el, + asn_MAP_T_tag2el_1, 6, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -283,15 +313,17 @@ asn_TYPE_descriptor_t asn_DEF_T = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T_1_tags, - sizeof(asn_DEF_T_1_tags) - /sizeof(asn_DEF_T_1_tags[0]) - 1, /* 1 */ - asn_DEF_T_1_tags, /* Same as above */ - sizeof(asn_DEF_T_1_tags) - /sizeof(asn_DEF_T_1_tags[0]), /* 2 */ + asn_DEF_T_tags_1, + sizeof(asn_DEF_T_tags_1) + /sizeof(asn_DEF_T_tags_1[0]) - 1, /* 1 */ + asn_DEF_T_tags_1, /* Same as above */ + sizeof(asn_DEF_T_tags_1) + /sizeof(asn_DEF_T_tags_1[0]), /* 2 */ + 0, /* No PER visible constraints */ asn_MBR_T_1, 2, /* Elements count */ - &asn_SPC_T_1_specs /* Additional specs */ + &asn_SPC_T_specs_1 /* Additional specs */ }; diff --git a/tests/46-redefine-OK.asn1.-PR b/tests/46-redefine-OK.asn1.-PR index 9521de29a..449707e2b 100644 --- a/tests/46-redefine-OK.asn1.-PR +++ b/tests/46-redefine-OK.asn1.-PR @@ -40,6 +40,9 @@ PrimitiveType_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_OCTET_STRING.der_encoder; td->xer_decoder = asn_DEF_OCTET_STRING.xer_decoder; td->xer_encoder = asn_DEF_OCTET_STRING.xer_encoder; + td->uper_decoder = asn_DEF_OCTET_STRING.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_OCTET_STRING.per_constraints; td->elements = asn_DEF_OCTET_STRING.elements; td->elements_count = asn_DEF_OCTET_STRING.elements_count; td->specifics = asn_DEF_OCTET_STRING.specifics; @@ -92,7 +95,7 @@ PrimitiveType_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [PrimitiveType] >>> ***/ -static ber_tlv_tag_t asn_DEF_PrimitiveType_1_tags[] = { +static ber_tlv_tag_t asn_DEF_PrimitiveType_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) }; asn_TYPE_descriptor_t asn_DEF_PrimitiveType = { @@ -105,13 +108,15 @@ asn_TYPE_descriptor_t asn_DEF_PrimitiveType = { PrimitiveType_encode_der, PrimitiveType_decode_xer, PrimitiveType_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_PrimitiveType_1_tags, - sizeof(asn_DEF_PrimitiveType_1_tags) - /sizeof(asn_DEF_PrimitiveType_1_tags[0]), /* 1 */ - asn_DEF_PrimitiveType_1_tags, /* Same as above */ - sizeof(asn_DEF_PrimitiveType_1_tags) - /sizeof(asn_DEF_PrimitiveType_1_tags[0]), /* 1 */ + asn_DEF_PrimitiveType_tags_1, + sizeof(asn_DEF_PrimitiveType_tags_1) + /sizeof(asn_DEF_PrimitiveType_tags_1[0]), /* 1 */ + asn_DEF_PrimitiveType_tags_1, /* Same as above */ + sizeof(asn_DEF_PrimitiveType_tags_1) + /sizeof(asn_DEF_PrimitiveType_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -143,20 +148,23 @@ static asn_TYPE_member_t asn_MBR_ConstructedType_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_PrimitiveType, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "field" }, }; -static ber_tlv_tag_t asn_DEF_ConstructedType_1_tags[] = { +static ber_tlv_tag_t asn_DEF_ConstructedType_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_ConstructedType_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_ConstructedType_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 0, 0, 0 } /* field at 18 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_ConstructedType_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_ConstructedType_specs_1 = { sizeof(struct ConstructedType), offsetof(struct ConstructedType, _asn_ctx), - asn_MAP_ConstructedType_1_tag2el, + asn_MAP_ConstructedType_tag2el_1, 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -170,16 +178,18 @@ asn_TYPE_descriptor_t asn_DEF_ConstructedType = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_ConstructedType_1_tags, - sizeof(asn_DEF_ConstructedType_1_tags) - /sizeof(asn_DEF_ConstructedType_1_tags[0]), /* 1 */ - asn_DEF_ConstructedType_1_tags, /* Same as above */ - sizeof(asn_DEF_ConstructedType_1_tags) - /sizeof(asn_DEF_ConstructedType_1_tags[0]), /* 1 */ + asn_DEF_ConstructedType_tags_1, + sizeof(asn_DEF_ConstructedType_tags_1) + /sizeof(asn_DEF_ConstructedType_tags_1[0]), /* 1 */ + asn_DEF_ConstructedType_tags_1, /* Same as above */ + sizeof(asn_DEF_ConstructedType_tags_1) + /sizeof(asn_DEF_ConstructedType_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_ConstructedType_1, 1, /* Elements count */ - &asn_SPC_ConstructedType_1_specs /* Additional specs */ + &asn_SPC_ConstructedType_specs_1 /* Additional specs */ }; @@ -224,6 +234,9 @@ T_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_ConstructedType.der_encoder; td->xer_decoder = asn_DEF_ConstructedType.xer_decoder; td->xer_encoder = asn_DEF_ConstructedType.xer_encoder; + td->uper_decoder = asn_DEF_ConstructedType.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_ConstructedType.per_constraints; td->elements = asn_DEF_ConstructedType.elements; td->elements_count = asn_DEF_ConstructedType.elements_count; td->specifics = asn_DEF_ConstructedType.specifics; @@ -276,7 +289,7 @@ T_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T] >>> ***/ -static ber_tlv_tag_t asn_DEF_T_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; @@ -290,13 +303,15 @@ asn_TYPE_descriptor_t asn_DEF_T = { T_encode_der, T_decode_xer, T_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T_1_tags, - sizeof(asn_DEF_T_1_tags) - /sizeof(asn_DEF_T_1_tags[0]) - 1, /* 1 */ - asn_DEF_T_1_tags, /* Same as above */ - sizeof(asn_DEF_T_1_tags) - /sizeof(asn_DEF_T_1_tags[0]), /* 2 */ + asn_DEF_T_tags_1, + sizeof(asn_DEF_T_tags_1) + /sizeof(asn_DEF_T_tags_1[0]) - 1, /* 1 */ + asn_DEF_T_tags_1, /* Same as above */ + sizeof(asn_DEF_T_tags_1) + /sizeof(asn_DEF_T_tags_1[0]), /* 2 */ + 0, /* No PER visible constraints */ 0, 0, /* Defined elsewhere */ 0 /* No specifics */ }; diff --git a/tests/47-set-ext-OK.asn1.-P b/tests/47-set-ext-OK.asn1.-P index 6c04656f4..16863b91e 100644 --- a/tests/47-set-ext-OK.asn1.-P +++ b/tests/47-set-ext-OK.asn1.-P @@ -43,28 +43,30 @@ static asn_TYPE_member_t asn_MBR_T1_1[] = { .tag_mode = 0, .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "i" }, }; -static ber_tlv_tag_t asn_DEF_T1_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T1_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_T1_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_T1_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 } /* i at 14 */ }; -static uint8_t asn_MAP_T1_1_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { +static uint8_t asn_MAP_T1_mmap_1[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { (1 << 7) }; -static asn_SET_specifics_t asn_SPC_T1_1_specs = { +static asn_SET_specifics_t asn_SPC_T1_specs_1 = { sizeof(struct T1), offsetof(struct T1, _asn_ctx), offsetof(struct T1, _presence_map), - asn_MAP_T1_1_tag2el, + asn_MAP_T1_tag2el_1, 1, /* Count of tags in the map */ - asn_MAP_T1_1_tag2el, /* Same as above */ + asn_MAP_T1_tag2el_1, /* Same as above */ 1, /* Count of tags in the CXER map */ 1, /* Whether extensible */ - (unsigned int *)asn_MAP_T1_1_mmap /* Mandatory elements map */ + (unsigned int *)asn_MAP_T1_mmap_1 /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_T1 = { "T1", @@ -76,16 +78,18 @@ asn_TYPE_descriptor_t asn_DEF_T1 = { SET_encode_der, SET_decode_xer, SET_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T1_1_tags, - sizeof(asn_DEF_T1_1_tags) - /sizeof(asn_DEF_T1_1_tags[0]), /* 1 */ - asn_DEF_T1_1_tags, /* Same as above */ - sizeof(asn_DEF_T1_1_tags) - /sizeof(asn_DEF_T1_1_tags[0]), /* 1 */ + asn_DEF_T1_tags_1, + sizeof(asn_DEF_T1_tags_1) + /sizeof(asn_DEF_T1_tags_1[0]), /* 1 */ + asn_DEF_T1_tags_1, /* Same as above */ + sizeof(asn_DEF_T1_tags_1) + /sizeof(asn_DEF_T1_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_T1_1, 1, /* Elements count */ - &asn_SPC_T1_1_specs /* Additional specs */ + &asn_SPC_T1_specs_1 /* Additional specs */ }; @@ -133,28 +137,30 @@ static asn_TYPE_member_t asn_MBR_T2_1[] = { .tag_mode = 0, .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "i" }, }; -static ber_tlv_tag_t asn_DEF_T2_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T2_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_T2_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_T2_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 } /* i at 15 */ }; -static uint8_t asn_MAP_T2_1_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { +static uint8_t asn_MAP_T2_mmap_1[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { (1 << 7) }; -static asn_SET_specifics_t asn_SPC_T2_1_specs = { +static asn_SET_specifics_t asn_SPC_T2_specs_1 = { sizeof(struct T2), offsetof(struct T2, _asn_ctx), offsetof(struct T2, _presence_map), - asn_MAP_T2_1_tag2el, + asn_MAP_T2_tag2el_1, 1, /* Count of tags in the map */ - asn_MAP_T2_1_tag2el, /* Same as above */ + asn_MAP_T2_tag2el_1, /* Same as above */ 1, /* Count of tags in the CXER map */ 1, /* Whether extensible */ - (unsigned int *)asn_MAP_T2_1_mmap /* Mandatory elements map */ + (unsigned int *)asn_MAP_T2_mmap_1 /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_T2 = { "T2", @@ -166,16 +172,18 @@ asn_TYPE_descriptor_t asn_DEF_T2 = { SET_encode_der, SET_decode_xer, SET_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T2_1_tags, - sizeof(asn_DEF_T2_1_tags) - /sizeof(asn_DEF_T2_1_tags[0]), /* 1 */ - asn_DEF_T2_1_tags, /* Same as above */ - sizeof(asn_DEF_T2_1_tags) - /sizeof(asn_DEF_T2_1_tags[0]), /* 1 */ + asn_DEF_T2_tags_1, + sizeof(asn_DEF_T2_tags_1) + /sizeof(asn_DEF_T2_tags_1[0]), /* 1 */ + asn_DEF_T2_tags_1, /* Same as above */ + sizeof(asn_DEF_T2_tags_1) + /sizeof(asn_DEF_T2_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_T2_1, 1, /* Elements count */ - &asn_SPC_T2_1_specs /* Additional specs */ + &asn_SPC_T2_specs_1 /* Additional specs */ }; @@ -220,20 +228,23 @@ static asn_TYPE_member_t asn_MBR_T3_1[] = { .tag_mode = 0, .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "i" }, }; -static asn_TYPE_tag2member_t asn_MAP_T3_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_T3_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 } /* i at 16 */ }; -static asn_CHOICE_specifics_t asn_SPC_T3_1_specs = { +static asn_CHOICE_specifics_t asn_SPC_T3_specs_1 = { sizeof(struct T3), offsetof(struct T3, _asn_ctx), offsetof(struct T3, present), sizeof(((struct T3 *)0)->present), - asn_MAP_T3_1_tag2el, + asn_MAP_T3_tag2el_1, 1, /* Count of tags in the map */ - 1 /* Whether extensible */ + .canonical_order = 0, + .ext_start = 1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_T3 = { "T3", @@ -245,14 +256,16 @@ asn_TYPE_descriptor_t asn_DEF_T3 = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_T3_1, 1, /* Elements count */ - &asn_SPC_T3_1_specs /* Additional specs */ + &asn_SPC_T3_specs_1 /* Additional specs */ }; @@ -297,20 +310,23 @@ static asn_TYPE_member_t asn_MBR_T4_1[] = { .tag_mode = 0, .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "i" }, }; -static asn_TYPE_tag2member_t asn_MAP_T4_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_T4_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 } /* i at 17 */ }; -static asn_CHOICE_specifics_t asn_SPC_T4_1_specs = { +static asn_CHOICE_specifics_t asn_SPC_T4_specs_1 = { sizeof(struct T4), offsetof(struct T4, _asn_ctx), offsetof(struct T4, present), sizeof(((struct T4 *)0)->present), - asn_MAP_T4_1_tag2el, + asn_MAP_T4_tag2el_1, 1, /* Count of tags in the map */ - 1 /* Whether extensible */ + .canonical_order = 0, + .ext_start = 1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_T4 = { "T4", @@ -322,13 +338,15 @@ asn_TYPE_descriptor_t asn_DEF_T4 = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_T4_1, 1, /* Elements count */ - &asn_SPC_T4_1_specs /* Additional specs */ + &asn_SPC_T4_specs_1 /* Additional specs */ }; diff --git a/tests/50-constraint-OK.asn1 b/tests/50-constraint-OK.asn1 index 85997ea88..62c4fdffb 100644 --- a/tests/50-constraint-OK.asn1 +++ b/tests/50-constraint-OK.asn1 @@ -16,7 +16,7 @@ BEGIN Int1 ::= INTEGER Int2 ::= Int1 (0..MAX) -- X.680-0207::41.4.4 Int3 ::= Int2 (MIN..ten) -- Means (0..10) - Int4 ::= Int3 (5..MAX,...,1..4) -- Means (5..10,...,1..4) + Int4 ::= Int3 (5..MAX,...,1..4) -- Means (1..10,...) Int5 ::= Int4 (MIN..5) -- Means (5) -- Int6 ::= INTEGER (Int5) -- -- Not yet supported @@ -52,6 +52,23 @@ BEGIN VisibleIdentifier ::= Identifier + Sequence ::= SEQUENCE { + int1-c Int1 (-2..MAX) DEFAULT 3, + int4 [2] Int4, + int4-c Int4 (MIN..7), + bool BOOLEAN DEFAULT 1, + enum-c ENUMERATED { one(1), two(2), ..., three(3) }, + ..., + int5-c Int5 (5) OPTIONAL, + ..., + null NULL OPTIONAL + } + + SequenceOf ::= SEQUENCE (SIZE(1..2)) OF Sequence + + Enum0 ::= ENUMERATED { one, two } + Enum1 ::= ENUMERATED { one, two } (one) + END diff --git a/tests/50-constraint-OK.asn1.-EFprint-constraints b/tests/50-constraint-OK.asn1.-EFprint-constraints index a3adae02709abd0df3e2fcb34f5a9e1f5fcbd29b..2ac128529fd8d0f56f6c5b63b9148130128d12bb 100644 GIT binary patch delta 1043 zcmb_b!EVz)5S8P!brPi_QV&rQ=y0G~OUV+uNh?{3z_c65l4A#wNL3LRDpw#Chg6Ar zs4DRZ!2Sg%Bz^#XfPdf*_y7*-V!VO<$W_RYzn|y z9K&uiL+BLXx%&dx(J%}Sf-!=1_>Xd(KQ=b_yWC}MnW=kqfDD3&(tTbrJ!7ALwHhCD zR=$fTGt;gKi@j9c%jxv208ipLWPZfIS@k@geE8n%qqRMawaU*?)k(T|gI!rP8L(&m zm>ufTar|kT5C^-j3r`^NnX%naF1E)MIV3vsiz#tsuJCm3L*?GerIfA|zdBD6vWw-` z9DNN?$pQf(J6+*`>x#4(aYuQpL#olz#hG}RXcC54w1J_9ZEGLt$HQ?DM}DYkkXfc% zSF6zl!ta>99O-Hy_*;{ft_zFEsZrEhq&qyywo1gvJqzR0Ki7DA?MmWykR;Ufcxa!~DJ8zpn)?Ce&|BMz{1w?b|EbZ!NW#kA#}5{a9*V zy4GAiOnpuE5L)d?M{rcTt@lwder_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -92,7 +95,7 @@ Int1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Int1] >>> ***/ -static ber_tlv_tag_t asn_DEF_Int1_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Int1_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Int1 = { @@ -105,13 +108,15 @@ asn_TYPE_descriptor_t asn_DEF_Int1 = { Int1_encode_der, Int1_decode_xer, Int1_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Int1_1_tags, - sizeof(asn_DEF_Int1_1_tags) - /sizeof(asn_DEF_Int1_1_tags[0]), /* 1 */ - asn_DEF_Int1_1_tags, /* Same as above */ - sizeof(asn_DEF_Int1_1_tags) - /sizeof(asn_DEF_Int1_1_tags[0]), /* 1 */ + asn_DEF_Int1_tags_1, + sizeof(asn_DEF_Int1_tags_1) + /sizeof(asn_DEF_Int1_tags_1[0]), /* 1 */ + asn_DEF_Int1_tags_1, /* Same as above */ + sizeof(asn_DEF_Int1_tags_1) + /sizeof(asn_DEF_Int1_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -177,6 +182,9 @@ Int2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_Int1.der_encoder; td->xer_decoder = asn_DEF_Int1.xer_decoder; td->xer_encoder = asn_DEF_Int1.xer_encoder; + td->uper_decoder = asn_DEF_Int1.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Int1.per_constraints; td->elements = asn_DEF_Int1.elements; td->elements_count = asn_DEF_Int1.elements_count; td->specifics = asn_DEF_Int1.specifics; @@ -229,7 +237,7 @@ Int2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Int2] >>> ***/ -static ber_tlv_tag_t asn_DEF_Int2_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Int2_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Int2 = { @@ -242,13 +250,15 @@ asn_TYPE_descriptor_t asn_DEF_Int2 = { Int2_encode_der, Int2_decode_xer, Int2_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Int2_1_tags, - sizeof(asn_DEF_Int2_1_tags) - /sizeof(asn_DEF_Int2_1_tags[0]), /* 1 */ - asn_DEF_Int2_1_tags, /* Same as above */ - sizeof(asn_DEF_Int2_1_tags) - /sizeof(asn_DEF_Int2_1_tags[0]), /* 1 */ + asn_DEF_Int2_tags_1, + sizeof(asn_DEF_Int2_tags_1) + /sizeof(asn_DEF_Int2_tags_1[0]), /* 1 */ + asn_DEF_Int2_tags_1, /* Same as above */ + sizeof(asn_DEF_Int2_tags_1) + /sizeof(asn_DEF_Int2_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -318,6 +328,9 @@ Int3_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_Int2.der_encoder; td->xer_decoder = asn_DEF_Int2.xer_decoder; td->xer_encoder = asn_DEF_Int2.xer_encoder; + td->uper_decoder = asn_DEF_Int2.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Int2.per_constraints; td->elements = asn_DEF_Int2.elements; td->elements_count = asn_DEF_Int2.elements_count; td->specifics = asn_DEF_Int2.specifics; @@ -370,7 +383,7 @@ Int3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Int3] >>> ***/ -static ber_tlv_tag_t asn_DEF_Int3_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Int3_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Int3 = { @@ -383,13 +396,15 @@ asn_TYPE_descriptor_t asn_DEF_Int3 = { Int3_encode_der, Int3_decode_xer, Int3_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Int3_1_tags, - sizeof(asn_DEF_Int3_1_tags) - /sizeof(asn_DEF_Int3_1_tags[0]), /* 1 */ - asn_DEF_Int3_1_tags, /* Same as above */ - sizeof(asn_DEF_Int3_1_tags) - /sizeof(asn_DEF_Int3_1_tags[0]), /* 1 */ + asn_DEF_Int3_tags_1, + sizeof(asn_DEF_Int3_tags_1) + /sizeof(asn_DEF_Int3_tags_1[0]), /* 1 */ + asn_DEF_Int3_tags_1, /* Same as above */ + sizeof(asn_DEF_Int3_tags_1) + /sizeof(asn_DEF_Int3_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -459,6 +474,9 @@ Int4_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_Int3.der_encoder; td->xer_decoder = asn_DEF_Int3.xer_decoder; td->xer_encoder = asn_DEF_Int3.xer_encoder; + td->uper_decoder = asn_DEF_Int3.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Int3.per_constraints; td->elements = asn_DEF_Int3.elements; td->elements_count = asn_DEF_Int3.elements_count; td->specifics = asn_DEF_Int3.specifics; @@ -511,7 +529,7 @@ Int4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Int4] >>> ***/ -static ber_tlv_tag_t asn_DEF_Int4_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Int4_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Int4 = { @@ -524,13 +542,15 @@ asn_TYPE_descriptor_t asn_DEF_Int4 = { Int4_encode_der, Int4_decode_xer, Int4_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Int4_1_tags, - sizeof(asn_DEF_Int4_1_tags) - /sizeof(asn_DEF_Int4_1_tags[0]), /* 1 */ - asn_DEF_Int4_1_tags, /* Same as above */ - sizeof(asn_DEF_Int4_1_tags) - /sizeof(asn_DEF_Int4_1_tags[0]), /* 1 */ + asn_DEF_Int4_tags_1, + sizeof(asn_DEF_Int4_tags_1) + /sizeof(asn_DEF_Int4_tags_1[0]), /* 1 */ + asn_DEF_Int4_tags_1, /* Same as above */ + sizeof(asn_DEF_Int4_tags_1) + /sizeof(asn_DEF_Int4_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -600,6 +620,9 @@ Int5_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_Int4.der_encoder; td->xer_decoder = asn_DEF_Int4.xer_decoder; td->xer_encoder = asn_DEF_Int4.xer_encoder; + td->uper_decoder = asn_DEF_Int4.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Int4.per_constraints; td->elements = asn_DEF_Int4.elements; td->elements_count = asn_DEF_Int4.elements_count; td->specifics = asn_DEF_Int4.specifics; @@ -652,7 +675,7 @@ Int5_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Int5] >>> ***/ -static ber_tlv_tag_t asn_DEF_Int5_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Int5_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Int5 = { @@ -665,13 +688,15 @@ asn_TYPE_descriptor_t asn_DEF_Int5 = { Int5_encode_der, Int5_decode_xer, Int5_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Int5_1_tags, - sizeof(asn_DEF_Int5_1_tags) - /sizeof(asn_DEF_Int5_1_tags[0]), /* 1 */ - asn_DEF_Int5_1_tags, /* Same as above */ - sizeof(asn_DEF_Int5_1_tags) - /sizeof(asn_DEF_Int5_1_tags[0]), /* 1 */ + asn_DEF_Int5_tags_1, + sizeof(asn_DEF_Int5_tags_1) + /sizeof(asn_DEF_Int5_tags_1[0]), /* 1 */ + asn_DEF_Int5_tags_1, /* Same as above */ + sizeof(asn_DEF_Int5_tags_1) + /sizeof(asn_DEF_Int5_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -741,6 +766,9 @@ ExtensibleExtensions_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -793,7 +821,7 @@ ExtensibleExtensions_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [ExtensibleExtensions] >>> ***/ -static ber_tlv_tag_t asn_DEF_ExtensibleExtensions_1_tags[] = { +static ber_tlv_tag_t asn_DEF_ExtensibleExtensions_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_ExtensibleExtensions = { @@ -806,13 +834,15 @@ asn_TYPE_descriptor_t asn_DEF_ExtensibleExtensions = { ExtensibleExtensions_encode_der, ExtensibleExtensions_decode_xer, ExtensibleExtensions_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_ExtensibleExtensions_1_tags, - sizeof(asn_DEF_ExtensibleExtensions_1_tags) - /sizeof(asn_DEF_ExtensibleExtensions_1_tags[0]), /* 1 */ - asn_DEF_ExtensibleExtensions_1_tags, /* Same as above */ - sizeof(asn_DEF_ExtensibleExtensions_1_tags) - /sizeof(asn_DEF_ExtensibleExtensions_1_tags[0]), /* 1 */ + asn_DEF_ExtensibleExtensions_tags_1, + sizeof(asn_DEF_ExtensibleExtensions_tags_1) + /sizeof(asn_DEF_ExtensibleExtensions_tags_1[0]), /* 1 */ + asn_DEF_ExtensibleExtensions_tags_1, /* Same as above */ + sizeof(asn_DEF_ExtensibleExtensions_tags_1) + /sizeof(asn_DEF_ExtensibleExtensions_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -859,6 +889,9 @@ Str1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_IA5String.der_encoder; td->xer_decoder = asn_DEF_IA5String.xer_decoder; td->xer_encoder = asn_DEF_IA5String.xer_encoder; + td->uper_decoder = asn_DEF_IA5String.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_IA5String.per_constraints; td->elements = asn_DEF_IA5String.elements; td->elements_count = asn_DEF_IA5String.elements_count; td->specifics = asn_DEF_IA5String.specifics; @@ -911,7 +944,7 @@ Str1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Str1] >>> ***/ -static ber_tlv_tag_t asn_DEF_Str1_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Str1_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Str1 = { @@ -924,13 +957,15 @@ asn_TYPE_descriptor_t asn_DEF_Str1 = { Str1_encode_der, Str1_decode_xer, Str1_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Str1_1_tags, - sizeof(asn_DEF_Str1_1_tags) - /sizeof(asn_DEF_Str1_1_tags[0]), /* 1 */ - asn_DEF_Str1_1_tags, /* Same as above */ - sizeof(asn_DEF_Str1_1_tags) - /sizeof(asn_DEF_Str1_1_tags[0]), /* 1 */ + asn_DEF_Str1_tags_1, + sizeof(asn_DEF_Str1_tags_1) + /sizeof(asn_DEF_Str1_tags_1[0]), /* 1 */ + asn_DEF_Str1_tags_1, /* Same as above */ + sizeof(asn_DEF_Str1_tags_1) + /sizeof(asn_DEF_Str1_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1012,6 +1047,9 @@ Str2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_Str1.der_encoder; td->xer_decoder = asn_DEF_Str1.xer_decoder; td->xer_encoder = asn_DEF_Str1.xer_encoder; + td->uper_decoder = asn_DEF_Str1.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Str1.per_constraints; td->elements = asn_DEF_Str1.elements; td->elements_count = asn_DEF_Str1.elements_count; td->specifics = asn_DEF_Str1.specifics; @@ -1064,7 +1102,7 @@ Str2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Str2] >>> ***/ -static ber_tlv_tag_t asn_DEF_Str2_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Str2_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Str2 = { @@ -1077,13 +1115,15 @@ asn_TYPE_descriptor_t asn_DEF_Str2 = { Str2_encode_der, Str2_decode_xer, Str2_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Str2_1_tags, - sizeof(asn_DEF_Str2_1_tags) - /sizeof(asn_DEF_Str2_1_tags[0]), /* 1 */ - asn_DEF_Str2_1_tags, /* Same as above */ - sizeof(asn_DEF_Str2_1_tags) - /sizeof(asn_DEF_Str2_1_tags[0]), /* 1 */ + asn_DEF_Str2_tags_1, + sizeof(asn_DEF_Str2_tags_1) + /sizeof(asn_DEF_Str2_tags_1[0]), /* 1 */ + asn_DEF_Str2_tags_1, /* Same as above */ + sizeof(asn_DEF_Str2_tags_1) + /sizeof(asn_DEF_Str2_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1176,6 +1216,9 @@ Str3_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_Str2.der_encoder; td->xer_decoder = asn_DEF_Str2.xer_decoder; td->xer_encoder = asn_DEF_Str2.xer_encoder; + td->uper_decoder = asn_DEF_Str2.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Str2.per_constraints; td->elements = asn_DEF_Str2.elements; td->elements_count = asn_DEF_Str2.elements_count; td->specifics = asn_DEF_Str2.specifics; @@ -1228,7 +1271,7 @@ Str3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Str3] >>> ***/ -static ber_tlv_tag_t asn_DEF_Str3_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Str3_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Str3 = { @@ -1241,13 +1284,15 @@ asn_TYPE_descriptor_t asn_DEF_Str3 = { Str3_encode_der, Str3_decode_xer, Str3_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Str3_1_tags, - sizeof(asn_DEF_Str3_1_tags) - /sizeof(asn_DEF_Str3_1_tags[0]), /* 1 */ - asn_DEF_Str3_1_tags, /* Same as above */ - sizeof(asn_DEF_Str3_1_tags) - /sizeof(asn_DEF_Str3_1_tags[0]), /* 1 */ + asn_DEF_Str3_tags_1, + sizeof(asn_DEF_Str3_tags_1) + /sizeof(asn_DEF_Str3_tags_1[0]), /* 1 */ + asn_DEF_Str3_tags_1, /* Same as above */ + sizeof(asn_DEF_Str3_tags_1) + /sizeof(asn_DEF_Str3_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1326,6 +1371,9 @@ Str4_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_IA5String.der_encoder; td->xer_decoder = asn_DEF_IA5String.xer_decoder; td->xer_encoder = asn_DEF_IA5String.xer_encoder; + td->uper_decoder = asn_DEF_IA5String.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_IA5String.per_constraints; td->elements = asn_DEF_IA5String.elements; td->elements_count = asn_DEF_IA5String.elements_count; td->specifics = asn_DEF_IA5String.specifics; @@ -1378,7 +1426,7 @@ Str4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Str4] >>> ***/ -static ber_tlv_tag_t asn_DEF_Str4_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Str4_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Str4 = { @@ -1391,13 +1439,15 @@ asn_TYPE_descriptor_t asn_DEF_Str4 = { Str4_encode_der, Str4_decode_xer, Str4_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Str4_1_tags, - sizeof(asn_DEF_Str4_1_tags) - /sizeof(asn_DEF_Str4_1_tags[0]), /* 1 */ - asn_DEF_Str4_1_tags, /* Same as above */ - sizeof(asn_DEF_Str4_1_tags) - /sizeof(asn_DEF_Str4_1_tags[0]), /* 1 */ + asn_DEF_Str4_tags_1, + sizeof(asn_DEF_Str4_tags_1) + /sizeof(asn_DEF_Str4_tags_1[0]), /* 1 */ + asn_DEF_Str4_tags_1, /* Same as above */ + sizeof(asn_DEF_Str4_tags_1) + /sizeof(asn_DEF_Str4_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1476,6 +1526,9 @@ PER_Visible_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_IA5String.der_encoder; td->xer_decoder = asn_DEF_IA5String.xer_decoder; td->xer_encoder = asn_DEF_IA5String.xer_encoder; + td->uper_decoder = asn_DEF_IA5String.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_IA5String.per_constraints; td->elements = asn_DEF_IA5String.elements; td->elements_count = asn_DEF_IA5String.elements_count; td->specifics = asn_DEF_IA5String.specifics; @@ -1528,7 +1581,7 @@ PER_Visible_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [PER-Visible] >>> ***/ -static ber_tlv_tag_t asn_DEF_PER_Visible_1_tags[] = { +static ber_tlv_tag_t asn_DEF_PER_Visible_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_PER_Visible = { @@ -1541,13 +1594,15 @@ asn_TYPE_descriptor_t asn_DEF_PER_Visible = { PER_Visible_encode_der, PER_Visible_decode_xer, PER_Visible_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_PER_Visible_1_tags, - sizeof(asn_DEF_PER_Visible_1_tags) - /sizeof(asn_DEF_PER_Visible_1_tags[0]), /* 1 */ - asn_DEF_PER_Visible_1_tags, /* Same as above */ - sizeof(asn_DEF_PER_Visible_1_tags) - /sizeof(asn_DEF_PER_Visible_1_tags[0]), /* 1 */ + asn_DEF_PER_Visible_tags_1, + sizeof(asn_DEF_PER_Visible_tags_1) + /sizeof(asn_DEF_PER_Visible_tags_1[0]), /* 1 */ + asn_DEF_PER_Visible_tags_1, /* Same as above */ + sizeof(asn_DEF_PER_Visible_tags_1) + /sizeof(asn_DEF_PER_Visible_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1626,6 +1681,9 @@ PER_Visible_2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_PER_Visible.der_encoder; td->xer_decoder = asn_DEF_PER_Visible.xer_decoder; td->xer_encoder = asn_DEF_PER_Visible.xer_encoder; + td->uper_decoder = asn_DEF_PER_Visible.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_PER_Visible.per_constraints; td->elements = asn_DEF_PER_Visible.elements; td->elements_count = asn_DEF_PER_Visible.elements_count; td->specifics = asn_DEF_PER_Visible.specifics; @@ -1678,7 +1736,7 @@ PER_Visible_2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [PER-Visible-2] >>> ***/ -static ber_tlv_tag_t asn_DEF_PER_Visible_2_1_tags[] = { +static ber_tlv_tag_t asn_DEF_PER_Visible_2_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_PER_Visible_2 = { @@ -1691,13 +1749,15 @@ asn_TYPE_descriptor_t asn_DEF_PER_Visible_2 = { PER_Visible_2_encode_der, PER_Visible_2_decode_xer, PER_Visible_2_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_PER_Visible_2_1_tags, - sizeof(asn_DEF_PER_Visible_2_1_tags) - /sizeof(asn_DEF_PER_Visible_2_1_tags[0]), /* 1 */ - asn_DEF_PER_Visible_2_1_tags, /* Same as above */ - sizeof(asn_DEF_PER_Visible_2_1_tags) - /sizeof(asn_DEF_PER_Visible_2_1_tags[0]), /* 1 */ + asn_DEF_PER_Visible_2_tags_1, + sizeof(asn_DEF_PER_Visible_2_tags_1) + /sizeof(asn_DEF_PER_Visible_2_tags_1[0]), /* 1 */ + asn_DEF_PER_Visible_2_tags_1, /* Same as above */ + sizeof(asn_DEF_PER_Visible_2_tags_1) + /sizeof(asn_DEF_PER_Visible_2_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1776,6 +1836,9 @@ Not_PER_Visible_1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_PER_Visible.der_encoder; td->xer_decoder = asn_DEF_PER_Visible.xer_decoder; td->xer_encoder = asn_DEF_PER_Visible.xer_encoder; + td->uper_decoder = asn_DEF_PER_Visible.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_PER_Visible.per_constraints; td->elements = asn_DEF_PER_Visible.elements; td->elements_count = asn_DEF_PER_Visible.elements_count; td->specifics = asn_DEF_PER_Visible.specifics; @@ -1828,7 +1891,7 @@ Not_PER_Visible_1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Not-PER-Visible-1] >>> ***/ -static ber_tlv_tag_t asn_DEF_Not_PER_Visible_1_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Not_PER_Visible_1_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_1 = { @@ -1841,13 +1904,15 @@ asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_1 = { Not_PER_Visible_1_encode_der, Not_PER_Visible_1_decode_xer, Not_PER_Visible_1_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Not_PER_Visible_1_1_tags, - sizeof(asn_DEF_Not_PER_Visible_1_1_tags) - /sizeof(asn_DEF_Not_PER_Visible_1_1_tags[0]), /* 1 */ - asn_DEF_Not_PER_Visible_1_1_tags, /* Same as above */ - sizeof(asn_DEF_Not_PER_Visible_1_1_tags) - /sizeof(asn_DEF_Not_PER_Visible_1_1_tags[0]), /* 1 */ + asn_DEF_Not_PER_Visible_1_tags_1, + sizeof(asn_DEF_Not_PER_Visible_1_tags_1) + /sizeof(asn_DEF_Not_PER_Visible_1_tags_1[0]), /* 1 */ + asn_DEF_Not_PER_Visible_1_tags_1, /* Same as above */ + sizeof(asn_DEF_Not_PER_Visible_1_tags_1) + /sizeof(asn_DEF_Not_PER_Visible_1_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1926,6 +1991,9 @@ Not_PER_Visible_2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_PER_Visible.der_encoder; td->xer_decoder = asn_DEF_PER_Visible.xer_decoder; td->xer_encoder = asn_DEF_PER_Visible.xer_encoder; + td->uper_decoder = asn_DEF_PER_Visible.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_PER_Visible.per_constraints; td->elements = asn_DEF_PER_Visible.elements; td->elements_count = asn_DEF_PER_Visible.elements_count; td->specifics = asn_DEF_PER_Visible.specifics; @@ -1978,7 +2046,7 @@ Not_PER_Visible_2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Not-PER-Visible-2] >>> ***/ -static ber_tlv_tag_t asn_DEF_Not_PER_Visible_2_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Not_PER_Visible_2_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_2 = { @@ -1991,13 +2059,15 @@ asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_2 = { Not_PER_Visible_2_encode_der, Not_PER_Visible_2_decode_xer, Not_PER_Visible_2_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Not_PER_Visible_2_1_tags, - sizeof(asn_DEF_Not_PER_Visible_2_1_tags) - /sizeof(asn_DEF_Not_PER_Visible_2_1_tags[0]), /* 1 */ - asn_DEF_Not_PER_Visible_2_1_tags, /* Same as above */ - sizeof(asn_DEF_Not_PER_Visible_2_1_tags) - /sizeof(asn_DEF_Not_PER_Visible_2_1_tags[0]), /* 1 */ + asn_DEF_Not_PER_Visible_2_tags_1, + sizeof(asn_DEF_Not_PER_Visible_2_tags_1) + /sizeof(asn_DEF_Not_PER_Visible_2_tags_1[0]), /* 1 */ + asn_DEF_Not_PER_Visible_2_tags_1, /* Same as above */ + sizeof(asn_DEF_Not_PER_Visible_2_tags_1) + /sizeof(asn_DEF_Not_PER_Visible_2_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -2076,6 +2146,9 @@ Not_PER_Visible_3_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_PER_Visible.der_encoder; td->xer_decoder = asn_DEF_PER_Visible.xer_decoder; td->xer_encoder = asn_DEF_PER_Visible.xer_encoder; + td->uper_decoder = asn_DEF_PER_Visible.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_PER_Visible.per_constraints; td->elements = asn_DEF_PER_Visible.elements; td->elements_count = asn_DEF_PER_Visible.elements_count; td->specifics = asn_DEF_PER_Visible.specifics; @@ -2128,7 +2201,7 @@ Not_PER_Visible_3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Not-PER-Visible-3] >>> ***/ -static ber_tlv_tag_t asn_DEF_Not_PER_Visible_3_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Not_PER_Visible_3_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_3 = { @@ -2141,13 +2214,15 @@ asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_3 = { Not_PER_Visible_3_encode_der, Not_PER_Visible_3_decode_xer, Not_PER_Visible_3_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Not_PER_Visible_3_1_tags, - sizeof(asn_DEF_Not_PER_Visible_3_1_tags) - /sizeof(asn_DEF_Not_PER_Visible_3_1_tags[0]), /* 1 */ - asn_DEF_Not_PER_Visible_3_1_tags, /* Same as above */ - sizeof(asn_DEF_Not_PER_Visible_3_1_tags) - /sizeof(asn_DEF_Not_PER_Visible_3_1_tags[0]), /* 1 */ + asn_DEF_Not_PER_Visible_3_tags_1, + sizeof(asn_DEF_Not_PER_Visible_3_tags_1) + /sizeof(asn_DEF_Not_PER_Visible_3_tags_1[0]), /* 1 */ + asn_DEF_Not_PER_Visible_3_tags_1, /* Same as above */ + sizeof(asn_DEF_Not_PER_Visible_3_tags_1) + /sizeof(asn_DEF_Not_PER_Visible_3_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -2229,6 +2304,9 @@ SIZE_but_not_FROM_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_PER_Visible.der_encoder; td->xer_decoder = asn_DEF_PER_Visible.xer_decoder; td->xer_encoder = asn_DEF_PER_Visible.xer_encoder; + td->uper_decoder = asn_DEF_PER_Visible.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_PER_Visible.per_constraints; td->elements = asn_DEF_PER_Visible.elements; td->elements_count = asn_DEF_PER_Visible.elements_count; td->specifics = asn_DEF_PER_Visible.specifics; @@ -2281,7 +2359,7 @@ SIZE_but_not_FROM_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [SIZE-but-not-FROM] >>> ***/ -static ber_tlv_tag_t asn_DEF_SIZE_but_not_FROM_1_tags[] = { +static ber_tlv_tag_t asn_DEF_SIZE_but_not_FROM_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_SIZE_but_not_FROM = { @@ -2294,13 +2372,15 @@ asn_TYPE_descriptor_t asn_DEF_SIZE_but_not_FROM = { SIZE_but_not_FROM_encode_der, SIZE_but_not_FROM_decode_xer, SIZE_but_not_FROM_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_SIZE_but_not_FROM_1_tags, - sizeof(asn_DEF_SIZE_but_not_FROM_1_tags) - /sizeof(asn_DEF_SIZE_but_not_FROM_1_tags[0]), /* 1 */ - asn_DEF_SIZE_but_not_FROM_1_tags, /* Same as above */ - sizeof(asn_DEF_SIZE_but_not_FROM_1_tags) - /sizeof(asn_DEF_SIZE_but_not_FROM_1_tags[0]), /* 1 */ + asn_DEF_SIZE_but_not_FROM_tags_1, + sizeof(asn_DEF_SIZE_but_not_FROM_tags_1) + /sizeof(asn_DEF_SIZE_but_not_FROM_tags_1[0]), /* 1 */ + asn_DEF_SIZE_but_not_FROM_tags_1, /* Same as above */ + sizeof(asn_DEF_SIZE_but_not_FROM_tags_1) + /sizeof(asn_DEF_SIZE_but_not_FROM_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -2382,6 +2462,9 @@ SIZE_and_FROM_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_PER_Visible.der_encoder; td->xer_decoder = asn_DEF_PER_Visible.xer_decoder; td->xer_encoder = asn_DEF_PER_Visible.xer_encoder; + td->uper_decoder = asn_DEF_PER_Visible.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_PER_Visible.per_constraints; td->elements = asn_DEF_PER_Visible.elements; td->elements_count = asn_DEF_PER_Visible.elements_count; td->specifics = asn_DEF_PER_Visible.specifics; @@ -2434,7 +2517,7 @@ SIZE_and_FROM_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [SIZE-and-FROM] >>> ***/ -static ber_tlv_tag_t asn_DEF_SIZE_and_FROM_1_tags[] = { +static ber_tlv_tag_t asn_DEF_SIZE_and_FROM_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_SIZE_and_FROM = { @@ -2447,13 +2530,15 @@ asn_TYPE_descriptor_t asn_DEF_SIZE_and_FROM = { SIZE_and_FROM_encode_der, SIZE_and_FROM_decode_xer, SIZE_and_FROM_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_SIZE_and_FROM_1_tags, - sizeof(asn_DEF_SIZE_and_FROM_1_tags) - /sizeof(asn_DEF_SIZE_and_FROM_1_tags[0]), /* 1 */ - asn_DEF_SIZE_and_FROM_1_tags, /* Same as above */ - sizeof(asn_DEF_SIZE_and_FROM_1_tags) - /sizeof(asn_DEF_SIZE_and_FROM_1_tags[0]), /* 1 */ + asn_DEF_SIZE_and_FROM_tags_1, + sizeof(asn_DEF_SIZE_and_FROM_tags_1) + /sizeof(asn_DEF_SIZE_and_FROM_tags_1[0]), /* 1 */ + asn_DEF_SIZE_and_FROM_tags_1, /* Same as above */ + sizeof(asn_DEF_SIZE_and_FROM_tags_1) + /sizeof(asn_DEF_SIZE_and_FROM_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -2532,6 +2617,9 @@ Neither_SIZE_nor_FROM_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_PER_Visible.der_encoder; td->xer_decoder = asn_DEF_PER_Visible.xer_decoder; td->xer_encoder = asn_DEF_PER_Visible.xer_encoder; + td->uper_decoder = asn_DEF_PER_Visible.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_PER_Visible.per_constraints; td->elements = asn_DEF_PER_Visible.elements; td->elements_count = asn_DEF_PER_Visible.elements_count; td->specifics = asn_DEF_PER_Visible.specifics; @@ -2584,7 +2672,7 @@ Neither_SIZE_nor_FROM_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Neither-SIZE-nor-FROM] >>> ***/ -static ber_tlv_tag_t asn_DEF_Neither_SIZE_nor_FROM_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Neither_SIZE_nor_FROM_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Neither_SIZE_nor_FROM = { @@ -2597,13 +2685,15 @@ asn_TYPE_descriptor_t asn_DEF_Neither_SIZE_nor_FROM = { Neither_SIZE_nor_FROM_encode_der, Neither_SIZE_nor_FROM_decode_xer, Neither_SIZE_nor_FROM_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Neither_SIZE_nor_FROM_1_tags, - sizeof(asn_DEF_Neither_SIZE_nor_FROM_1_tags) - /sizeof(asn_DEF_Neither_SIZE_nor_FROM_1_tags[0]), /* 1 */ - asn_DEF_Neither_SIZE_nor_FROM_1_tags, /* Same as above */ - sizeof(asn_DEF_Neither_SIZE_nor_FROM_1_tags) - /sizeof(asn_DEF_Neither_SIZE_nor_FROM_1_tags[0]), /* 1 */ + asn_DEF_Neither_SIZE_nor_FROM_tags_1, + sizeof(asn_DEF_Neither_SIZE_nor_FROM_tags_1) + /sizeof(asn_DEF_Neither_SIZE_nor_FROM_tags_1[0]), /* 1 */ + asn_DEF_Neither_SIZE_nor_FROM_tags_1, /* Same as above */ + sizeof(asn_DEF_Neither_SIZE_nor_FROM_tags_1) + /sizeof(asn_DEF_Neither_SIZE_nor_FROM_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -2676,6 +2766,9 @@ Utf8_4_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_UTF8String.der_encoder; td->xer_decoder = asn_DEF_UTF8String.xer_decoder; td->xer_encoder = asn_DEF_UTF8String.xer_encoder; + td->uper_decoder = asn_DEF_UTF8String.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_UTF8String.per_constraints; td->elements = asn_DEF_UTF8String.elements; td->elements_count = asn_DEF_UTF8String.elements_count; td->specifics = asn_DEF_UTF8String.specifics; @@ -2728,7 +2821,7 @@ Utf8_4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Utf8-4] >>> ***/ -static ber_tlv_tag_t asn_DEF_Utf8_4_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Utf8_4_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Utf8_4 = { @@ -2741,13 +2834,15 @@ asn_TYPE_descriptor_t asn_DEF_Utf8_4 = { Utf8_4_encode_der, Utf8_4_decode_xer, Utf8_4_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Utf8_4_1_tags, - sizeof(asn_DEF_Utf8_4_1_tags) - /sizeof(asn_DEF_Utf8_4_1_tags[0]), /* 1 */ - asn_DEF_Utf8_4_1_tags, /* Same as above */ - sizeof(asn_DEF_Utf8_4_1_tags) - /sizeof(asn_DEF_Utf8_4_1_tags[0]), /* 1 */ + asn_DEF_Utf8_4_tags_1, + sizeof(asn_DEF_Utf8_4_tags_1) + /sizeof(asn_DEF_Utf8_4_tags_1[0]), /* 1 */ + asn_DEF_Utf8_4_tags_1, /* Same as above */ + sizeof(asn_DEF_Utf8_4_tags_1) + /sizeof(asn_DEF_Utf8_4_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -2848,6 +2943,9 @@ Utf8_3_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_Utf8_2.der_encoder; td->xer_decoder = asn_DEF_Utf8_2.xer_decoder; td->xer_encoder = asn_DEF_Utf8_2.xer_encoder; + td->uper_decoder = asn_DEF_Utf8_2.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Utf8_2.per_constraints; td->elements = asn_DEF_Utf8_2.elements; td->elements_count = asn_DEF_Utf8_2.elements_count; td->specifics = asn_DEF_Utf8_2.specifics; @@ -2900,7 +2998,7 @@ Utf8_3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Utf8-3] >>> ***/ -static ber_tlv_tag_t asn_DEF_Utf8_3_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Utf8_3_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Utf8_3 = { @@ -2913,13 +3011,15 @@ asn_TYPE_descriptor_t asn_DEF_Utf8_3 = { Utf8_3_encode_der, Utf8_3_decode_xer, Utf8_3_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Utf8_3_1_tags, - sizeof(asn_DEF_Utf8_3_1_tags) - /sizeof(asn_DEF_Utf8_3_1_tags[0]), /* 1 */ - asn_DEF_Utf8_3_1_tags, /* Same as above */ - sizeof(asn_DEF_Utf8_3_1_tags) - /sizeof(asn_DEF_Utf8_3_1_tags[0]), /* 1 */ + asn_DEF_Utf8_3_tags_1, + sizeof(asn_DEF_Utf8_3_tags_1) + /sizeof(asn_DEF_Utf8_3_tags_1[0]), /* 1 */ + asn_DEF_Utf8_3_tags_1, /* Same as above */ + sizeof(asn_DEF_Utf8_3_tags_1) + /sizeof(asn_DEF_Utf8_3_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -2990,6 +3090,9 @@ Utf8_2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_Utf8_1.der_encoder; td->xer_decoder = asn_DEF_Utf8_1.xer_decoder; td->xer_encoder = asn_DEF_Utf8_1.xer_encoder; + td->uper_decoder = asn_DEF_Utf8_1.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Utf8_1.per_constraints; td->elements = asn_DEF_Utf8_1.elements; td->elements_count = asn_DEF_Utf8_1.elements_count; td->specifics = asn_DEF_Utf8_1.specifics; @@ -3042,7 +3145,7 @@ Utf8_2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Utf8-2] >>> ***/ -static ber_tlv_tag_t asn_DEF_Utf8_2_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Utf8_2_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Utf8_2 = { @@ -3055,13 +3158,15 @@ asn_TYPE_descriptor_t asn_DEF_Utf8_2 = { Utf8_2_encode_der, Utf8_2_decode_xer, Utf8_2_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Utf8_2_1_tags, - sizeof(asn_DEF_Utf8_2_1_tags) - /sizeof(asn_DEF_Utf8_2_1_tags[0]), /* 1 */ - asn_DEF_Utf8_2_1_tags, /* Same as above */ - sizeof(asn_DEF_Utf8_2_1_tags) - /sizeof(asn_DEF_Utf8_2_1_tags[0]), /* 1 */ + asn_DEF_Utf8_2_tags_1, + sizeof(asn_DEF_Utf8_2_tags_1) + /sizeof(asn_DEF_Utf8_2_tags_1[0]), /* 1 */ + asn_DEF_Utf8_2_tags_1, /* Same as above */ + sizeof(asn_DEF_Utf8_2_tags_1) + /sizeof(asn_DEF_Utf8_2_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -3108,6 +3213,9 @@ Utf8_1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_UTF8String.der_encoder; td->xer_decoder = asn_DEF_UTF8String.xer_decoder; td->xer_encoder = asn_DEF_UTF8String.xer_encoder; + td->uper_decoder = asn_DEF_UTF8String.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_UTF8String.per_constraints; td->elements = asn_DEF_UTF8String.elements; td->elements_count = asn_DEF_UTF8String.elements_count; td->specifics = asn_DEF_UTF8String.specifics; @@ -3160,7 +3268,7 @@ Utf8_1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Utf8-1] >>> ***/ -static ber_tlv_tag_t asn_DEF_Utf8_1_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Utf8_1_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Utf8_1 = { @@ -3173,13 +3281,15 @@ asn_TYPE_descriptor_t asn_DEF_Utf8_1 = { Utf8_1_encode_der, Utf8_1_decode_xer, Utf8_1_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Utf8_1_1_tags, - sizeof(asn_DEF_Utf8_1_1_tags) - /sizeof(asn_DEF_Utf8_1_1_tags[0]), /* 1 */ - asn_DEF_Utf8_1_1_tags, /* Same as above */ - sizeof(asn_DEF_Utf8_1_1_tags) - /sizeof(asn_DEF_Utf8_1_1_tags[0]), /* 1 */ + asn_DEF_Utf8_1_tags_1, + sizeof(asn_DEF_Utf8_1_tags_1) + /sizeof(asn_DEF_Utf8_1_tags_1[0]), /* 1 */ + asn_DEF_Utf8_1_tags_1, /* Same as above */ + sizeof(asn_DEF_Utf8_1_tags_1) + /sizeof(asn_DEF_Utf8_1_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -3273,6 +3383,9 @@ VisibleIdentifier_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_Identifier.der_encoder; td->xer_decoder = asn_DEF_Identifier.xer_decoder; td->xer_encoder = asn_DEF_Identifier.xer_encoder; + td->uper_decoder = asn_DEF_Identifier.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Identifier.per_constraints; td->elements = asn_DEF_Identifier.elements; td->elements_count = asn_DEF_Identifier.elements_count; td->specifics = asn_DEF_Identifier.specifics; @@ -3325,7 +3438,7 @@ VisibleIdentifier_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [VisibleIdentifier] >>> ***/ -static ber_tlv_tag_t asn_DEF_VisibleIdentifier_1_tags[] = { +static ber_tlv_tag_t asn_DEF_VisibleIdentifier_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)) }; asn_TYPE_descriptor_t asn_DEF_VisibleIdentifier = { @@ -3338,18 +3451,794 @@ asn_TYPE_descriptor_t asn_DEF_VisibleIdentifier = { VisibleIdentifier_encode_der, VisibleIdentifier_decode_xer, VisibleIdentifier_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_VisibleIdentifier_1_tags, - sizeof(asn_DEF_VisibleIdentifier_1_tags) - /sizeof(asn_DEF_VisibleIdentifier_1_tags[0]), /* 1 */ - asn_DEF_VisibleIdentifier_1_tags, /* Same as above */ - sizeof(asn_DEF_VisibleIdentifier_1_tags) - /sizeof(asn_DEF_VisibleIdentifier_1_tags[0]), /* 1 */ + asn_DEF_VisibleIdentifier_tags_1, + sizeof(asn_DEF_VisibleIdentifier_tags_1) + /sizeof(asn_DEF_VisibleIdentifier_tags_1[0]), /* 1 */ + asn_DEF_VisibleIdentifier_tags_1, /* Same as above */ + sizeof(asn_DEF_VisibleIdentifier_tags_1) + /sizeof(asn_DEF_VisibleIdentifier_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; +/*** <<< INCLUDES [Sequence] >>> ***/ + +#include +#include +#include +#include +#include +#include +#include + +/*** <<< DEPS [Sequence] >>> ***/ + +typedef enum enum_c { + enum_c_one = 1, + enum_c_two = 2, + /* + * Enumeration is extensible + */ + enum_c_three = 3 +} enum_c_e; + +/*** <<< TYPE-DECLS [Sequence] >>> ***/ + +typedef struct Sequence { + Int1_t *int1_c /* DEFAULT 3 */; + Int4_t int4; + Int4_t int4_c; + BOOLEAN_t *bool /* DEFAULT 1 */; + ENUMERATED_t enum_c; + NULL_t *null /* OPTIONAL */; + /* + * This type is extensible, + * possible extensions are below. + */ + Int5_t *int5_c /* OPTIONAL */; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} Sequence_t; + +/*** <<< FUNC-DECLS [Sequence] >>> ***/ + +/* extern asn_TYPE_descriptor_t asn_DEF_enum_c_6; // (Use -fall-defs-global to expose) */ +extern asn_TYPE_descriptor_t asn_DEF_Sequence; + +/*** <<< CODE [Sequence] >>> ***/ + +static int +enum_c_6_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + /* Replace with underlying type checker */ + td->check_constraints = asn_DEF_ENUMERATED.check_constraints; + return td->check_constraints(td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using ENUMERATED, + * so here we adjust the DEF accordingly. + */ +static void +enum_c_6_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_ENUMERATED.free_struct; + td->print_struct = asn_DEF_ENUMERATED.print_struct; + td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; + td->der_encoder = asn_DEF_ENUMERATED.der_encoder; + td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; + td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; + td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_ENUMERATED.per_constraints; + td->elements = asn_DEF_ENUMERATED.elements; + td->elements_count = asn_DEF_ENUMERATED.elements_count; + /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ +} + +static void +enum_c_6_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + enum_c_6_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +static int +enum_c_6_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + enum_c_6_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +static asn_dec_rval_t +enum_c_6_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + enum_c_6_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +static asn_enc_rval_t +enum_c_6_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + enum_c_6_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +static asn_dec_rval_t +enum_c_6_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + enum_c_6_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +static asn_enc_rval_t +enum_c_6_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + enum_c_6_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +static int +memb_int1_c_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const Int1_t *st = (const Int1_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= -2)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_int4_c_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const Int4_t *st = (const Int4_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= 5 && value <= 7)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_int5_c_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const Int5_t *st = (const Int5_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value == 5)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + + +/*** <<< STAT-DEFS [Sequence] >>> ***/ + +static int asn_DFL_2_set_3(void **sptr) { + Int1_t *st = *sptr; + + if(!st) { + st = (*sptr = CALLOC(1, sizeof(*st))); + if(!st) return -1; + } + + /* Install default value 3 */ + return asn_long2INTEGER(st, 3); +} +static int asn_DFL_5_set_1(void **sptr) { + BOOLEAN_t *st = *sptr; + + if(!st) { + st = (*sptr = CALLOC(1, sizeof(*st))); + if(!st) return -1; + } + + /* Install default value 1 */ + *st = 1; + return 0; +} +static asn_INTEGER_enum_map_t asn_MAP_enum_c_value2enum_6[] = { + { 1, 3, "one" }, + { 2, 3, "two" }, + { 3, 5, "three" } + /* This list is extensible */ +}; +static unsigned int asn_MAP_enum_c_enum2value_6[] = { + 0, /* one(1) */ + 2, /* three(3) */ + 1 /* two(2) */ + /* This list is extensible */ +}; +static asn_INTEGER_specifics_t asn_SPC_enum_c_specs_6 = { + asn_MAP_enum_c_value2enum_6, /* "tag" => N; sorted by tag */ + asn_MAP_enum_c_enum2value_6, /* N => "tag"; sorted by N */ + 3, /* Number of elements in the maps */ + 3, /* Extensions before this member */ + 1 /* Strict enumeration */ +}; +static ber_tlv_tag_t asn_DEF_enum_c_tags_6[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_enum_c_6 = { + "enum-c", + "enum-c", + enum_c_6_free, + enum_c_6_print, + enum_c_6_constraint, + enum_c_6_decode_ber, + enum_c_6_encode_der, + enum_c_6_decode_xer, + enum_c_6_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_enum_c_tags_6, + sizeof(asn_DEF_enum_c_tags_6) + /sizeof(asn_DEF_enum_c_tags_6[0]), /* 1 */ + asn_DEF_enum_c_tags_6, /* Same as above */ + sizeof(asn_DEF_enum_c_tags_6) + /sizeof(asn_DEF_enum_c_tags_6[0]), /* 1 */ + 0, /* No PER visible constraints */ + 0, 0, /* Defined elsewhere */ + &asn_SPC_enum_c_specs_6 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_Sequence_1[] = { + { ATF_POINTER, 1, offsetof(struct Sequence, int1_c), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = &asn_DEF_Int1, + .memb_constraints = memb_int1_c_constraint_1, + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = asn_DFL_2_set_3, /* DEFAULT 3 */ + .name = "int1-c" + }, + { ATF_NOFLAGS, 0, offsetof(struct Sequence, int4), + .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + .tag_mode = +1, /* EXPLICIT tag at current level */ + .type = &asn_DEF_Int4, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "int4" + }, + { ATF_NOFLAGS, 0, offsetof(struct Sequence, int4_c), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = &asn_DEF_Int4, + .memb_constraints = memb_int4_c_constraint_1, + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "int4-c" + }, + { ATF_POINTER, 1, offsetof(struct Sequence, bool), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), + .tag_mode = 0, + .type = &asn_DEF_BOOLEAN, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = asn_DFL_5_set_1, /* DEFAULT 1 */ + .name = "bool" + }, + { ATF_NOFLAGS, 0, offsetof(struct Sequence, enum_c), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + .tag_mode = 0, + .type = &asn_DEF_enum_c_6, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "enum-c" + }, + { ATF_POINTER, 2, offsetof(struct Sequence, null), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)), + .tag_mode = 0, + .type = &asn_DEF_NULL, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "null" + }, + { ATF_POINTER, 1, offsetof(struct Sequence, int5_c), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = &asn_DEF_Int5, + .memb_constraints = memb_int5_c_constraint_1, + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "int5-c" + }, +}; +static ber_tlv_tag_t asn_DEF_Sequence_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_TYPE_tag2member_t asn_MAP_Sequence_tag2el_1[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 3, 0, 0 }, /* bool at 59 */ + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 2 }, /* int1-c at 56 */ + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 2, -1, 1 }, /* int4-c at 58 */ + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 6, -2, 0 }, /* int5-c at 62 */ + { (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)), 5, 0, 0 }, /* null at 64 */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 4, 0, 0 }, /* enum-c at 60 */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 } /* int4 at 57 */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_Sequence_specs_1 = { + sizeof(struct Sequence), + offsetof(struct Sequence, _asn_ctx), + asn_MAP_Sequence_tag2el_1, + 7, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 5, /* Start extensions */ + 8 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_Sequence = { + "Sequence", + "Sequence", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Sequence_tags_1, + sizeof(asn_DEF_Sequence_tags_1) + /sizeof(asn_DEF_Sequence_tags_1[0]), /* 1 */ + asn_DEF_Sequence_tags_1, /* Same as above */ + sizeof(asn_DEF_Sequence_tags_1) + /sizeof(asn_DEF_Sequence_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_Sequence_1, + 7, /* Elements count */ + &asn_SPC_Sequence_specs_1 /* Additional specs */ +}; + + +/*** <<< INCLUDES [SequenceOf] >>> ***/ + +#include +#include + +/*** <<< FWD-DECLS [SequenceOf] >>> ***/ + +struct Sequence; + +/*** <<< TYPE-DECLS [SequenceOf] >>> ***/ + +typedef struct SequenceOf { + A_SEQUENCE_OF(struct Sequence) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} SequenceOf_t; + +/*** <<< FUNC-DECLS [SequenceOf] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_SequenceOf; + +/*** <<< POST-INCLUDE [SequenceOf] >>> ***/ + +#include + +/*** <<< STAT-DEFS [SequenceOf] >>> ***/ + +static asn_TYPE_member_t asn_MBR_SequenceOf_1[] = { + { ATF_POINTER, 0, 0, + .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + .tag_mode = 0, + .type = &asn_DEF_Sequence, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "" + }, +}; +static ber_tlv_tag_t asn_DEF_SequenceOf_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_SequenceOf_specs_1 = { + sizeof(struct SequenceOf), + offsetof(struct SequenceOf, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_SequenceOf = { + "SequenceOf", + "SequenceOf", + SEQUENCE_OF_free, + SEQUENCE_OF_print, + SEQUENCE_OF_constraint, + SEQUENCE_OF_decode_ber, + SEQUENCE_OF_encode_der, + SEQUENCE_OF_decode_xer, + SEQUENCE_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_SequenceOf_tags_1, + sizeof(asn_DEF_SequenceOf_tags_1) + /sizeof(asn_DEF_SequenceOf_tags_1[0]), /* 1 */ + asn_DEF_SequenceOf_tags_1, /* Same as above */ + sizeof(asn_DEF_SequenceOf_tags_1) + /sizeof(asn_DEF_SequenceOf_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_SequenceOf_1, + 1, /* Single element */ + &asn_SPC_SequenceOf_specs_1 /* Additional specs */ +}; + + +/*** <<< INCLUDES [Enum0] >>> ***/ + +#include + +/*** <<< DEPS [Enum0] >>> ***/ + +typedef enum Enum0 { + Enum0_one = 0, + Enum0_two = 1 +} Enum0_e; + +/*** <<< TYPE-DECLS [Enum0] >>> ***/ + +typedef ENUMERATED_t Enum0_t; + +/*** <<< FUNC-DECLS [Enum0] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Enum0; +asn_struct_free_f Enum0_free; +asn_struct_print_f Enum0_print; +asn_constr_check_f Enum0_constraint; +ber_type_decoder_f Enum0_decode_ber; +der_type_encoder_f Enum0_encode_der; +xer_type_decoder_f Enum0_decode_xer; +xer_type_encoder_f Enum0_encode_xer; + +/*** <<< CODE [Enum0] >>> ***/ + +int +Enum0_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + /* Replace with underlying type checker */ + td->check_constraints = asn_DEF_ENUMERATED.check_constraints; + return td->check_constraints(td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using ENUMERATED, + * so here we adjust the DEF accordingly. + */ +static void +Enum0_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_ENUMERATED.free_struct; + td->print_struct = asn_DEF_ENUMERATED.print_struct; + td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; + td->der_encoder = asn_DEF_ENUMERATED.der_encoder; + td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; + td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; + td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_ENUMERATED.per_constraints; + td->elements = asn_DEF_ENUMERATED.elements; + td->elements_count = asn_DEF_ENUMERATED.elements_count; + /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ +} + +void +Enum0_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Enum0_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Enum0_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Enum0_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Enum0_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Enum0_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Enum0_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Enum0_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Enum0_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Enum0_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Enum0_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Enum0_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + + +/*** <<< STAT-DEFS [Enum0] >>> ***/ + +static asn_INTEGER_enum_map_t asn_MAP_Enum0_value2enum_1[] = { + { 0, 3, "one" }, + { 1, 3, "two" } +}; +static unsigned int asn_MAP_Enum0_enum2value_1[] = { + 0, /* one(0) */ + 1 /* two(1) */ +}; +static asn_INTEGER_specifics_t asn_SPC_Enum0_specs_1 = { + asn_MAP_Enum0_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_Enum0_enum2value_1, /* N => "tag"; sorted by N */ + 2, /* Number of elements in the maps */ + 0, /* Enumeration is not extensible */ + 1 /* Strict enumeration */ +}; +static ber_tlv_tag_t asn_DEF_Enum0_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_Enum0 = { + "Enum0", + "Enum0", + Enum0_free, + Enum0_print, + Enum0_constraint, + Enum0_decode_ber, + Enum0_encode_der, + Enum0_decode_xer, + Enum0_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Enum0_tags_1, + sizeof(asn_DEF_Enum0_tags_1) + /sizeof(asn_DEF_Enum0_tags_1[0]), /* 1 */ + asn_DEF_Enum0_tags_1, /* Same as above */ + sizeof(asn_DEF_Enum0_tags_1) + /sizeof(asn_DEF_Enum0_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + 0, 0, /* Defined elsewhere */ + &asn_SPC_Enum0_specs_1 /* Additional specs */ +}; + + +/*** <<< INCLUDES [Enum1] >>> ***/ + +#include + +/*** <<< DEPS [Enum1] >>> ***/ + +typedef enum Enum1 { + Enum1_one = 0, + Enum1_two = 1 +} Enum1_e; + +/*** <<< TYPE-DECLS [Enum1] >>> ***/ + +typedef long Enum1_t; + +/*** <<< FUNC-DECLS [Enum1] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Enum1; +asn_struct_free_f Enum1_free; +asn_struct_print_f Enum1_print; +asn_constr_check_f Enum1_constraint; +ber_type_decoder_f Enum1_decode_ber; +der_type_encoder_f Enum1_encode_der; +xer_type_decoder_f Enum1_decode_xer; +xer_type_encoder_f Enum1_encode_xer; + +/*** <<< CODE [Enum1] >>> ***/ + +int +Enum1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value == 0)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static void +Enum1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_NativeEnumerated.free_struct; + td->print_struct = asn_DEF_NativeEnumerated.print_struct; + td->ber_decoder = asn_DEF_NativeEnumerated.ber_decoder; + td->der_encoder = asn_DEF_NativeEnumerated.der_encoder; + td->xer_decoder = asn_DEF_NativeEnumerated.xer_decoder; + td->xer_encoder = asn_DEF_NativeEnumerated.xer_encoder; + td->uper_decoder = asn_DEF_NativeEnumerated.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeEnumerated.per_constraints; + td->elements = asn_DEF_NativeEnumerated.elements; + td->elements_count = asn_DEF_NativeEnumerated.elements_count; + /* td->specifics = asn_DEF_NativeEnumerated.specifics; // Defined explicitly */ +} + +void +Enum1_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Enum1_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Enum1_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Enum1_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Enum1_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Enum1_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Enum1_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Enum1_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Enum1_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Enum1_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Enum1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Enum1_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + + +/*** <<< STAT-DEFS [Enum1] >>> ***/ + +static asn_INTEGER_enum_map_t asn_MAP_Enum1_value2enum_1[] = { + { 0, 3, "one" }, + { 1, 3, "two" } +}; +static unsigned int asn_MAP_Enum1_enum2value_1[] = { + 0, /* one(0) */ + 1 /* two(1) */ +}; +static asn_INTEGER_specifics_t asn_SPC_Enum1_specs_1 = { + asn_MAP_Enum1_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_Enum1_enum2value_1, /* N => "tag"; sorted by N */ + 2, /* Number of elements in the maps */ + 0, /* Enumeration is not extensible */ + 1 /* Strict enumeration */ +}; +static ber_tlv_tag_t asn_DEF_Enum1_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_Enum1 = { + "Enum1", + "Enum1", + Enum1_free, + Enum1_print, + Enum1_constraint, + Enum1_decode_ber, + Enum1_encode_der, + Enum1_decode_xer, + Enum1_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Enum1_tags_1, + sizeof(asn_DEF_Enum1_tags_1) + /sizeof(asn_DEF_Enum1_tags_1[0]), /* 1 */ + asn_DEF_Enum1_tags_1, /* Same as above */ + sizeof(asn_DEF_Enum1_tags_1) + /sizeof(asn_DEF_Enum1_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + 0, 0, /* Defined elsewhere */ + &asn_SPC_Enum1_specs_1 /* Additional specs */ +}; + + /*** <<< INCLUDES [Identifier] >>> ***/ #include @@ -3438,6 +4327,9 @@ Identifier_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_VisibleString.der_encoder; td->xer_decoder = asn_DEF_VisibleString.xer_decoder; td->xer_encoder = asn_DEF_VisibleString.xer_encoder; + td->uper_decoder = asn_DEF_VisibleString.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_VisibleString.per_constraints; td->elements = asn_DEF_VisibleString.elements; td->elements_count = asn_DEF_VisibleString.elements_count; td->specifics = asn_DEF_VisibleString.specifics; @@ -3490,7 +4382,7 @@ Identifier_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [Identifier] >>> ***/ -static ber_tlv_tag_t asn_DEF_Identifier_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Identifier_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Identifier = { @@ -3503,13 +4395,15 @@ asn_TYPE_descriptor_t asn_DEF_Identifier = { Identifier_encode_der, Identifier_decode_xer, Identifier_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Identifier_1_tags, - sizeof(asn_DEF_Identifier_1_tags) - /sizeof(asn_DEF_Identifier_1_tags[0]), /* 1 */ - asn_DEF_Identifier_1_tags, /* Same as above */ - sizeof(asn_DEF_Identifier_1_tags) - /sizeof(asn_DEF_Identifier_1_tags[0]), /* 1 */ + asn_DEF_Identifier_tags_1, + sizeof(asn_DEF_Identifier_tags_1) + /sizeof(asn_DEF_Identifier_tags_1[0]), /* 1 */ + asn_DEF_Identifier_tags_1, /* Same as above */ + sizeof(asn_DEF_Identifier_tags_1) + /sizeof(asn_DEF_Identifier_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/tests/50-constraint-OK.asn1.-Pgen-PER b/tests/50-constraint-OK.asn1.-Pgen-PER new file mode 100644 index 000000000..a5c37ad46 --- /dev/null +++ b/tests/50-constraint-OK.asn1.-Pgen-PER @@ -0,0 +1,4739 @@ + +/*** <<< INCLUDES [Int1] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Int1] >>> ***/ + +typedef INTEGER_t Int1_t; + +/*** <<< FUNC-DECLS [Int1] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Int1; +asn_struct_free_f Int1_free; +asn_struct_print_f Int1_print; +asn_constr_check_f Int1_constraint; +ber_type_decoder_f Int1_decode_ber; +der_type_encoder_f Int1_encode_der; +xer_type_decoder_f Int1_decode_xer; +xer_type_encoder_f Int1_encode_xer; +per_type_decoder_f Int1_decode_uper; + +/*** <<< CODE [Int1] >>> ***/ + +int +Int1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + /* Replace with underlying type checker */ + td->check_constraints = asn_DEF_INTEGER.check_constraints; + return td->check_constraints(td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using INTEGER, + * so here we adjust the DEF accordingly. + */ +static void +Int1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_INTEGER.free_struct; + td->print_struct = asn_DEF_INTEGER.print_struct; + td->ber_decoder = asn_DEF_INTEGER.ber_decoder; + td->der_encoder = asn_DEF_INTEGER.der_encoder; + td->xer_decoder = asn_DEF_INTEGER.xer_decoder; + td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; + td->elements = asn_DEF_INTEGER.elements; + td->elements_count = asn_DEF_INTEGER.elements_count; + td->specifics = asn_DEF_INTEGER.specifics; +} + +void +Int1_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Int1_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Int1_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Int1_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Int1_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Int1_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Int1_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Int1_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Int1_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Int1_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Int1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Int1_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +Int1_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + Int1_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [Int1] >>> ***/ + +static ber_tlv_tag_t asn_DEF_Int1_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_Int1 = { + "Int1", + "Int1", + Int1_free, + Int1_print, + Int1_constraint, + Int1_decode_ber, + Int1_encode_der, + Int1_decode_xer, + Int1_encode_xer, + Int1_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Int1_tags_1, + sizeof(asn_DEF_Int1_tags_1) + /sizeof(asn_DEF_Int1_tags_1[0]), /* 1 */ + asn_DEF_Int1_tags_1, /* Same as above */ + sizeof(asn_DEF_Int1_tags_1) + /sizeof(asn_DEF_Int1_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Int2] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Int2] >>> ***/ + +typedef Int1_t Int2_t; + +/*** <<< FUNC-DECLS [Int2] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Int2; +asn_struct_free_f Int2_free; +asn_struct_print_f Int2_print; +asn_constr_check_f Int2_constraint; +ber_type_decoder_f Int2_decode_ber; +der_type_encoder_f Int2_encode_der; +xer_type_decoder_f Int2_decode_xer; +xer_type_encoder_f Int2_encode_xer; +per_type_decoder_f Int2_decode_uper; + +/*** <<< CODE [Int2] >>> ***/ + +int +Int2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const Int1_t *st = (const Int1_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* Check if the sign bit is present */ + value = st->buf ? ((st->buf[0] & 0x80) ? -1 : 1) : 0; + + if((value >= 0)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using Int1, + * so here we adjust the DEF accordingly. + */ +static void +Int2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Int1.free_struct; + td->print_struct = asn_DEF_Int1.print_struct; + td->ber_decoder = asn_DEF_Int1.ber_decoder; + td->der_encoder = asn_DEF_Int1.der_encoder; + td->xer_decoder = asn_DEF_Int1.xer_decoder; + td->xer_encoder = asn_DEF_Int1.xer_encoder; + td->uper_decoder = asn_DEF_Int1.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Int1.per_constraints; + td->elements = asn_DEF_Int1.elements; + td->elements_count = asn_DEF_Int1.elements_count; + td->specifics = asn_DEF_Int1.specifics; +} + +void +Int2_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Int2_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Int2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Int2_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Int2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Int2_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Int2_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Int2_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Int2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Int2_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Int2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Int2_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +Int2_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + Int2_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [Int2] >>> ***/ + +static ber_tlv_tag_t asn_DEF_Int2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static asn_per_constraints_t asn_PER_Int2_constr_1 = { + { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 } /* (0..MAX) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_Int2 = { + "Int2", + "Int2", + Int2_free, + Int2_print, + Int2_constraint, + Int2_decode_ber, + Int2_encode_der, + Int2_decode_xer, + Int2_encode_xer, + Int2_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Int2_tags_1, + sizeof(asn_DEF_Int2_tags_1) + /sizeof(asn_DEF_Int2_tags_1[0]), /* 1 */ + asn_DEF_Int2_tags_1, /* Same as above */ + sizeof(asn_DEF_Int2_tags_1) + /sizeof(asn_DEF_Int2_tags_1[0]), /* 1 */ + &asn_PER_Int2_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Int3] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Int3] >>> ***/ + +typedef Int2_t Int3_t; + +/*** <<< FUNC-DECLS [Int3] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Int3; +asn_struct_free_f Int3_free; +asn_struct_print_f Int3_print; +asn_constr_check_f Int3_constraint; +ber_type_decoder_f Int3_decode_ber; +der_type_encoder_f Int3_encode_der; +xer_type_decoder_f Int3_decode_xer; +xer_type_encoder_f Int3_encode_xer; +per_type_decoder_f Int3_decode_uper; + +/*** <<< CODE [Int3] >>> ***/ + +int +Int3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const Int2_t *st = (const Int2_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= 0 && value <= 10)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using Int2, + * so here we adjust the DEF accordingly. + */ +static void +Int3_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Int2.free_struct; + td->print_struct = asn_DEF_Int2.print_struct; + td->ber_decoder = asn_DEF_Int2.ber_decoder; + td->der_encoder = asn_DEF_Int2.der_encoder; + td->xer_decoder = asn_DEF_Int2.xer_decoder; + td->xer_encoder = asn_DEF_Int2.xer_encoder; + td->uper_decoder = asn_DEF_Int2.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Int2.per_constraints; + td->elements = asn_DEF_Int2.elements; + td->elements_count = asn_DEF_Int2.elements_count; + td->specifics = asn_DEF_Int2.specifics; +} + +void +Int3_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Int3_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Int3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Int3_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Int3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Int3_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Int3_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Int3_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Int3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Int3_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Int3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Int3_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +Int3_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + Int3_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [Int3] >>> ***/ + +static ber_tlv_tag_t asn_DEF_Int3_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static asn_per_constraints_t asn_PER_Int3_constr_1 = { + { APC_CONSTRAINED, 4, 4, 0, 10 } /* (0..10) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_Int3 = { + "Int3", + "Int3", + Int3_free, + Int3_print, + Int3_constraint, + Int3_decode_ber, + Int3_encode_der, + Int3_decode_xer, + Int3_encode_xer, + Int3_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Int3_tags_1, + sizeof(asn_DEF_Int3_tags_1) + /sizeof(asn_DEF_Int3_tags_1[0]), /* 1 */ + asn_DEF_Int3_tags_1, /* Same as above */ + sizeof(asn_DEF_Int3_tags_1) + /sizeof(asn_DEF_Int3_tags_1[0]), /* 1 */ + &asn_PER_Int3_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Int4] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Int4] >>> ***/ + +typedef Int3_t Int4_t; + +/*** <<< FUNC-DECLS [Int4] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Int4; +asn_struct_free_f Int4_free; +asn_struct_print_f Int4_print; +asn_constr_check_f Int4_constraint; +ber_type_decoder_f Int4_decode_ber; +der_type_encoder_f Int4_encode_der; +xer_type_decoder_f Int4_decode_xer; +xer_type_encoder_f Int4_encode_xer; +per_type_decoder_f Int4_decode_uper; + +/*** <<< CODE [Int4] >>> ***/ + +int +Int4_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const Int3_t *st = (const Int3_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= 1 && value <= 10)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using Int3, + * so here we adjust the DEF accordingly. + */ +static void +Int4_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Int3.free_struct; + td->print_struct = asn_DEF_Int3.print_struct; + td->ber_decoder = asn_DEF_Int3.ber_decoder; + td->der_encoder = asn_DEF_Int3.der_encoder; + td->xer_decoder = asn_DEF_Int3.xer_decoder; + td->xer_encoder = asn_DEF_Int3.xer_encoder; + td->uper_decoder = asn_DEF_Int3.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Int3.per_constraints; + td->elements = asn_DEF_Int3.elements; + td->elements_count = asn_DEF_Int3.elements_count; + td->specifics = asn_DEF_Int3.specifics; +} + +void +Int4_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Int4_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Int4_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Int4_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Int4_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Int4_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Int4_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Int4_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Int4_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Int4_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Int4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Int4_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +Int4_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + Int4_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [Int4] >>> ***/ + +static ber_tlv_tag_t asn_DEF_Int4_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static asn_per_constraints_t asn_PER_Int4_constr_1 = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 4, 4, 1, 10 } /* (1..10,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_Int4 = { + "Int4", + "Int4", + Int4_free, + Int4_print, + Int4_constraint, + Int4_decode_ber, + Int4_encode_der, + Int4_decode_xer, + Int4_encode_xer, + Int4_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Int4_tags_1, + sizeof(asn_DEF_Int4_tags_1) + /sizeof(asn_DEF_Int4_tags_1[0]), /* 1 */ + asn_DEF_Int4_tags_1, /* Same as above */ + sizeof(asn_DEF_Int4_tags_1) + /sizeof(asn_DEF_Int4_tags_1[0]), /* 1 */ + &asn_PER_Int4_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Int5] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Int5] >>> ***/ + +typedef Int4_t Int5_t; + +/*** <<< FUNC-DECLS [Int5] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Int5; +asn_struct_free_f Int5_free; +asn_struct_print_f Int5_print; +asn_constr_check_f Int5_constraint; +ber_type_decoder_f Int5_decode_ber; +der_type_encoder_f Int5_encode_der; +xer_type_decoder_f Int5_decode_xer; +xer_type_encoder_f Int5_encode_xer; +per_type_decoder_f Int5_decode_uper; + +/*** <<< CODE [Int5] >>> ***/ + +int +Int5_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const Int4_t *st = (const Int4_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value == 5)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using Int4, + * so here we adjust the DEF accordingly. + */ +static void +Int5_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Int4.free_struct; + td->print_struct = asn_DEF_Int4.print_struct; + td->ber_decoder = asn_DEF_Int4.ber_decoder; + td->der_encoder = asn_DEF_Int4.der_encoder; + td->xer_decoder = asn_DEF_Int4.xer_decoder; + td->xer_encoder = asn_DEF_Int4.xer_encoder; + td->uper_decoder = asn_DEF_Int4.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Int4.per_constraints; + td->elements = asn_DEF_Int4.elements; + td->elements_count = asn_DEF_Int4.elements_count; + td->specifics = asn_DEF_Int4.specifics; +} + +void +Int5_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Int5_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Int5_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Int5_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Int5_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Int5_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Int5_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Int5_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Int5_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Int5_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Int5_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Int5_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +Int5_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + Int5_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [Int5] >>> ***/ + +static ber_tlv_tag_t asn_DEF_Int5_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static asn_per_constraints_t asn_PER_Int5_constr_1 = { + { APC_CONSTRAINED, 0, 0, 5, 5 } /* (5..5) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_Int5 = { + "Int5", + "Int5", + Int5_free, + Int5_print, + Int5_constraint, + Int5_decode_ber, + Int5_encode_der, + Int5_decode_xer, + Int5_encode_xer, + Int5_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Int5_tags_1, + sizeof(asn_DEF_Int5_tags_1) + /sizeof(asn_DEF_Int5_tags_1[0]), /* 1 */ + asn_DEF_Int5_tags_1, /* Same as above */ + sizeof(asn_DEF_Int5_tags_1) + /sizeof(asn_DEF_Int5_tags_1[0]), /* 1 */ + &asn_PER_Int5_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [ExtensibleExtensions] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [ExtensibleExtensions] >>> ***/ + +typedef INTEGER_t ExtensibleExtensions_t; + +/*** <<< FUNC-DECLS [ExtensibleExtensions] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_ExtensibleExtensions; +asn_struct_free_f ExtensibleExtensions_free; +asn_struct_print_f ExtensibleExtensions_print; +asn_constr_check_f ExtensibleExtensions_constraint; +ber_type_decoder_f ExtensibleExtensions_decode_ber; +der_type_encoder_f ExtensibleExtensions_encode_der; +xer_type_decoder_f ExtensibleExtensions_decode_xer; +xer_type_encoder_f ExtensibleExtensions_encode_xer; +per_type_decoder_f ExtensibleExtensions_decode_uper; + +/*** <<< CODE [ExtensibleExtensions] >>> ***/ + +int +ExtensibleExtensions_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= 1 && value <= 256)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using INTEGER, + * so here we adjust the DEF accordingly. + */ +static void +ExtensibleExtensions_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_INTEGER.free_struct; + td->print_struct = asn_DEF_INTEGER.print_struct; + td->ber_decoder = asn_DEF_INTEGER.ber_decoder; + td->der_encoder = asn_DEF_INTEGER.der_encoder; + td->xer_decoder = asn_DEF_INTEGER.xer_decoder; + td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; + td->elements = asn_DEF_INTEGER.elements; + td->elements_count = asn_DEF_INTEGER.elements_count; + td->specifics = asn_DEF_INTEGER.specifics; +} + +void +ExtensibleExtensions_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + ExtensibleExtensions_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +ExtensibleExtensions_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + ExtensibleExtensions_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +ExtensibleExtensions_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + ExtensibleExtensions_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +ExtensibleExtensions_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + ExtensibleExtensions_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +ExtensibleExtensions_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + ExtensibleExtensions_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +ExtensibleExtensions_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + ExtensibleExtensions_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +ExtensibleExtensions_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + ExtensibleExtensions_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [ExtensibleExtensions] >>> ***/ + +static ber_tlv_tag_t asn_DEF_ExtensibleExtensions_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static asn_per_constraints_t asn_PER_ExtensibleExtensions_constr_1 = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 8, 8, 1, 256 } /* (1..256,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_ExtensibleExtensions = { + "ExtensibleExtensions", + "ExtensibleExtensions", + ExtensibleExtensions_free, + ExtensibleExtensions_print, + ExtensibleExtensions_constraint, + ExtensibleExtensions_decode_ber, + ExtensibleExtensions_encode_der, + ExtensibleExtensions_decode_xer, + ExtensibleExtensions_encode_xer, + ExtensibleExtensions_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_ExtensibleExtensions_tags_1, + sizeof(asn_DEF_ExtensibleExtensions_tags_1) + /sizeof(asn_DEF_ExtensibleExtensions_tags_1[0]), /* 1 */ + asn_DEF_ExtensibleExtensions_tags_1, /* Same as above */ + sizeof(asn_DEF_ExtensibleExtensions_tags_1) + /sizeof(asn_DEF_ExtensibleExtensions_tags_1[0]), /* 1 */ + &asn_PER_ExtensibleExtensions_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Str1] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Str1] >>> ***/ + +typedef IA5String_t Str1_t; + +/*** <<< FUNC-DECLS [Str1] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Str1; +asn_struct_free_f Str1_free; +asn_struct_print_f Str1_print; +asn_constr_check_f Str1_constraint; +ber_type_decoder_f Str1_decode_ber; +der_type_encoder_f Str1_encode_der; +xer_type_decoder_f Str1_decode_xer; +xer_type_encoder_f Str1_encode_xer; +per_type_decoder_f Str1_decode_uper; + +/*** <<< CODE [Str1] >>> ***/ + +int +Str1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + /* Replace with underlying type checker */ + td->check_constraints = asn_DEF_IA5String.check_constraints; + return td->check_constraints(td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using IA5String, + * so here we adjust the DEF accordingly. + */ +static void +Str1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_IA5String.free_struct; + td->print_struct = asn_DEF_IA5String.print_struct; + td->ber_decoder = asn_DEF_IA5String.ber_decoder; + td->der_encoder = asn_DEF_IA5String.der_encoder; + td->xer_decoder = asn_DEF_IA5String.xer_decoder; + td->xer_encoder = asn_DEF_IA5String.xer_encoder; + td->uper_decoder = asn_DEF_IA5String.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_IA5String.per_constraints; + td->elements = asn_DEF_IA5String.elements; + td->elements_count = asn_DEF_IA5String.elements_count; + td->specifics = asn_DEF_IA5String.specifics; +} + +void +Str1_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Str1_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Str1_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Str1_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Str1_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Str1_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Str1_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Str1_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Str1_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Str1_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Str1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Str1_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +Str1_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + Str1_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [Str1] >>> ***/ + +static ber_tlv_tag_t asn_DEF_Str1_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_Str1 = { + "Str1", + "Str1", + Str1_free, + Str1_print, + Str1_constraint, + Str1_decode_ber, + Str1_encode_der, + Str1_decode_xer, + Str1_encode_xer, + Str1_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Str1_tags_1, + sizeof(asn_DEF_Str1_tags_1) + /sizeof(asn_DEF_Str1_tags_1[0]), /* 1 */ + asn_DEF_Str1_tags_1, /* Same as above */ + sizeof(asn_DEF_Str1_tags_1) + /sizeof(asn_DEF_Str1_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Str2] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Str2] >>> ***/ + +typedef Str1_t Str2_t; + +/*** <<< FUNC-DECLS [Str2] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Str2; +asn_struct_free_f Str2_free; +asn_struct_print_f Str2_print; +asn_constr_check_f Str2_constraint; +ber_type_decoder_f Str2_decode_ber; +der_type_encoder_f Str2_encode_der; +xer_type_decoder_f Str2_decode_xer; +xer_type_encoder_f Str2_encode_xer; +per_type_decoder_f Str2_decode_uper; + +/*** <<< CTABLES [Str2] >>> ***/ + +static int check_permitted_alphabet_1(const void *sptr) { + /* The underlying type is IA5String */ + const IA5String_t *st = (const IA5String_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!(cv <= 127)) return -1; + } + return 0; +} + + +/*** <<< CODE [Str2] >>> ***/ + +int +Str2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const Str1_t *st = (const Str1_t *)sptr; + size_t size; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if(((size <= 20) || (size >= 25 && size <= 30)) + && !check_permitted_alphabet_1(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using Str1, + * so here we adjust the DEF accordingly. + */ +static void +Str2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Str1.free_struct; + td->print_struct = asn_DEF_Str1.print_struct; + td->ber_decoder = asn_DEF_Str1.ber_decoder; + td->der_encoder = asn_DEF_Str1.der_encoder; + td->xer_decoder = asn_DEF_Str1.xer_decoder; + td->xer_encoder = asn_DEF_Str1.xer_encoder; + td->uper_decoder = asn_DEF_Str1.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Str1.per_constraints; + td->elements = asn_DEF_Str1.elements; + td->elements_count = asn_DEF_Str1.elements_count; + td->specifics = asn_DEF_Str1.specifics; +} + +void +Str2_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Str2_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Str2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Str2_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Str2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Str2_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Str2_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Str2_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Str2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Str2_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Str2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Str2_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +Str2_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + Str2_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [Str2] >>> ***/ + +static ber_tlv_tag_t asn_DEF_Str2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) +}; +static asn_per_constraints_t asn_PER_Str2_constr_1 = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 5, 5, 0, 30 } /* (SIZE(0..30)) */ +}; +asn_TYPE_descriptor_t asn_DEF_Str2 = { + "Str2", + "Str2", + Str2_free, + Str2_print, + Str2_constraint, + Str2_decode_ber, + Str2_encode_der, + Str2_decode_xer, + Str2_encode_xer, + Str2_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Str2_tags_1, + sizeof(asn_DEF_Str2_tags_1) + /sizeof(asn_DEF_Str2_tags_1[0]), /* 1 */ + asn_DEF_Str2_tags_1, /* Same as above */ + sizeof(asn_DEF_Str2_tags_1) + /sizeof(asn_DEF_Str2_tags_1[0]), /* 1 */ + &asn_PER_Str2_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Str3] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Str3] >>> ***/ + +typedef Str2_t Str3_t; + +/*** <<< FUNC-DECLS [Str3] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Str3; +asn_struct_free_f Str3_free; +asn_struct_print_f Str3_print; +asn_constr_check_f Str3_constraint; +ber_type_decoder_f Str3_decode_ber; +der_type_encoder_f Str3_encode_der; +xer_type_decoder_f Str3_decode_xer; +xer_type_encoder_f Str3_encode_xer; +per_type_decoder_f Str3_decode_uper; + +/*** <<< CTABLES [Str3] >>> ***/ + +static int permitted_alphabet_table_1[256] = { +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, /* ABC */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0, /* def */ +}; + +static int check_permitted_alphabet_1(const void *sptr) { + int *table = permitted_alphabet_table_1; + /* The underlying type is IA5String */ + const IA5String_t *st = (const IA5String_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!table[cv]) return -1; + } + return 0; +} + + +/*** <<< CODE [Str3] >>> ***/ + +int +Str3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const Str2_t *st = (const Str2_t *)sptr; + size_t size; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if(((size >= 10 && size <= 20) || (size >= 25 && size <= 27)) + && !check_permitted_alphabet_1(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using Str2, + * so here we adjust the DEF accordingly. + */ +static void +Str3_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Str2.free_struct; + td->print_struct = asn_DEF_Str2.print_struct; + td->ber_decoder = asn_DEF_Str2.ber_decoder; + td->der_encoder = asn_DEF_Str2.der_encoder; + td->xer_decoder = asn_DEF_Str2.xer_decoder; + td->xer_encoder = asn_DEF_Str2.xer_encoder; + td->uper_decoder = asn_DEF_Str2.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Str2.per_constraints; + td->elements = asn_DEF_Str2.elements; + td->elements_count = asn_DEF_Str2.elements_count; + td->specifics = asn_DEF_Str2.specifics; +} + +void +Str3_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Str3_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Str3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Str3_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Str3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Str3_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Str3_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Str3_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Str3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Str3_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Str3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Str3_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +Str3_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + Str3_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [Str3] >>> ***/ + +static ber_tlv_tag_t asn_DEF_Str3_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) +}; +static asn_per_constraints_t asn_PER_Str3_constr_1 = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 5, 5, 10, 27 } /* (SIZE(10..27)) */ +}; +asn_TYPE_descriptor_t asn_DEF_Str3 = { + "Str3", + "Str3", + Str3_free, + Str3_print, + Str3_constraint, + Str3_decode_ber, + Str3_encode_der, + Str3_decode_xer, + Str3_encode_xer, + Str3_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Str3_tags_1, + sizeof(asn_DEF_Str3_tags_1) + /sizeof(asn_DEF_Str3_tags_1[0]), /* 1 */ + asn_DEF_Str3_tags_1, /* Same as above */ + sizeof(asn_DEF_Str3_tags_1) + /sizeof(asn_DEF_Str3_tags_1[0]), /* 1 */ + &asn_PER_Str3_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Str4] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Str4] >>> ***/ + +typedef IA5String_t Str4_t; + +/*** <<< FUNC-DECLS [Str4] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Str4; +asn_struct_free_f Str4_free; +asn_struct_print_f Str4_print; +asn_constr_check_f Str4_constraint; +ber_type_decoder_f Str4_decode_ber; +der_type_encoder_f Str4_encode_der; +xer_type_decoder_f Str4_decode_xer; +xer_type_encoder_f Str4_encode_xer; +per_type_decoder_f Str4_decode_uper; + +/*** <<< CTABLES [Str4] >>> ***/ + +static int check_permitted_alphabet_1(const void *sptr) { + /* The underlying type is IA5String */ + const IA5String_t *st = (const IA5String_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!(cv <= 127)) return -1; + } + return 0; +} + + +/*** <<< CODE [Str4] >>> ***/ + +int +Str4_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const IA5String_t *st = (const IA5String_t *)sptr; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(!check_permitted_alphabet_1(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using IA5String, + * so here we adjust the DEF accordingly. + */ +static void +Str4_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_IA5String.free_struct; + td->print_struct = asn_DEF_IA5String.print_struct; + td->ber_decoder = asn_DEF_IA5String.ber_decoder; + td->der_encoder = asn_DEF_IA5String.der_encoder; + td->xer_decoder = asn_DEF_IA5String.xer_decoder; + td->xer_encoder = asn_DEF_IA5String.xer_encoder; + td->uper_decoder = asn_DEF_IA5String.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_IA5String.per_constraints; + td->elements = asn_DEF_IA5String.elements; + td->elements_count = asn_DEF_IA5String.elements_count; + td->specifics = asn_DEF_IA5String.specifics; +} + +void +Str4_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Str4_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Str4_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Str4_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Str4_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Str4_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Str4_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Str4_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Str4_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Str4_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Str4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Str4_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +Str4_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + Str4_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [Str4] >>> ***/ + +static ber_tlv_tag_t asn_DEF_Str4_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) +}; +static asn_per_constraints_t asn_PER_Str4_constr_1 = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 } /* (SIZE(0..MAX)) */ +}; +asn_TYPE_descriptor_t asn_DEF_Str4 = { + "Str4", + "Str4", + Str4_free, + Str4_print, + Str4_constraint, + Str4_decode_ber, + Str4_encode_der, + Str4_decode_xer, + Str4_encode_xer, + Str4_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Str4_tags_1, + sizeof(asn_DEF_Str4_tags_1) + /sizeof(asn_DEF_Str4_tags_1[0]), /* 1 */ + asn_DEF_Str4_tags_1, /* Same as above */ + sizeof(asn_DEF_Str4_tags_1) + /sizeof(asn_DEF_Str4_tags_1[0]), /* 1 */ + &asn_PER_Str4_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [PER-Visible] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [PER-Visible] >>> ***/ + +typedef IA5String_t PER_Visible_t; + +/*** <<< FUNC-DECLS [PER-Visible] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_PER_Visible; +asn_struct_free_f PER_Visible_free; +asn_struct_print_f PER_Visible_print; +asn_constr_check_f PER_Visible_constraint; +ber_type_decoder_f PER_Visible_decode_ber; +der_type_encoder_f PER_Visible_encode_der; +xer_type_decoder_f PER_Visible_decode_xer; +xer_type_encoder_f PER_Visible_encode_xer; +per_type_decoder_f PER_Visible_decode_uper; + +/*** <<< CTABLES [PER-Visible] >>> ***/ + +static int check_permitted_alphabet_1(const void *sptr) { + /* The underlying type is IA5String */ + const IA5String_t *st = (const IA5String_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!(cv >= 65 && cv <= 70)) return -1; + } + return 0; +} + + +/*** <<< CODE [PER-Visible] >>> ***/ + +int +PER_Visible_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const IA5String_t *st = (const IA5String_t *)sptr; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(!check_permitted_alphabet_1(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using IA5String, + * so here we adjust the DEF accordingly. + */ +static void +PER_Visible_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_IA5String.free_struct; + td->print_struct = asn_DEF_IA5String.print_struct; + td->ber_decoder = asn_DEF_IA5String.ber_decoder; + td->der_encoder = asn_DEF_IA5String.der_encoder; + td->xer_decoder = asn_DEF_IA5String.xer_decoder; + td->xer_encoder = asn_DEF_IA5String.xer_encoder; + td->uper_decoder = asn_DEF_IA5String.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_IA5String.per_constraints; + td->elements = asn_DEF_IA5String.elements; + td->elements_count = asn_DEF_IA5String.elements_count; + td->specifics = asn_DEF_IA5String.specifics; +} + +void +PER_Visible_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + PER_Visible_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +PER_Visible_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + PER_Visible_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +PER_Visible_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + PER_Visible_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +PER_Visible_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + PER_Visible_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +PER_Visible_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + PER_Visible_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +PER_Visible_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + PER_Visible_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +PER_Visible_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + PER_Visible_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [PER-Visible] >>> ***/ + +static ber_tlv_tag_t asn_DEF_PER_Visible_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) +}; +static asn_per_constraints_t asn_PER_PER_Visible_constr_1 = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 } /* (SIZE(0..MAX)) */ +}; +asn_TYPE_descriptor_t asn_DEF_PER_Visible = { + "PER-Visible", + "PER-Visible", + PER_Visible_free, + PER_Visible_print, + PER_Visible_constraint, + PER_Visible_decode_ber, + PER_Visible_encode_der, + PER_Visible_decode_xer, + PER_Visible_encode_xer, + PER_Visible_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_PER_Visible_tags_1, + sizeof(asn_DEF_PER_Visible_tags_1) + /sizeof(asn_DEF_PER_Visible_tags_1[0]), /* 1 */ + asn_DEF_PER_Visible_tags_1, /* Same as above */ + sizeof(asn_DEF_PER_Visible_tags_1) + /sizeof(asn_DEF_PER_Visible_tags_1[0]), /* 1 */ + &asn_PER_PER_Visible_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [PER-Visible-2] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [PER-Visible-2] >>> ***/ + +typedef PER_Visible_t PER_Visible_2_t; + +/*** <<< FUNC-DECLS [PER-Visible-2] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_PER_Visible_2; +asn_struct_free_f PER_Visible_2_free; +asn_struct_print_f PER_Visible_2_print; +asn_constr_check_f PER_Visible_2_constraint; +ber_type_decoder_f PER_Visible_2_decode_ber; +der_type_encoder_f PER_Visible_2_encode_der; +xer_type_decoder_f PER_Visible_2_decode_xer; +xer_type_encoder_f PER_Visible_2_encode_xer; +per_type_decoder_f PER_Visible_2_decode_uper; + +/*** <<< CTABLES [PER-Visible-2] >>> ***/ + +static int check_permitted_alphabet_1(const void *sptr) { + /* The underlying type is IA5String */ + const IA5String_t *st = (const IA5String_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!(cv >= 69 && cv <= 70)) return -1; + } + return 0; +} + + +/*** <<< CODE [PER-Visible-2] >>> ***/ + +int +PER_Visible_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const PER_Visible_t *st = (const PER_Visible_t *)sptr; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(!check_permitted_alphabet_1(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using PER_Visible, + * so here we adjust the DEF accordingly. + */ +static void +PER_Visible_2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_PER_Visible.free_struct; + td->print_struct = asn_DEF_PER_Visible.print_struct; + td->ber_decoder = asn_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn_DEF_PER_Visible.der_encoder; + td->xer_decoder = asn_DEF_PER_Visible.xer_decoder; + td->xer_encoder = asn_DEF_PER_Visible.xer_encoder; + td->uper_decoder = asn_DEF_PER_Visible.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_PER_Visible.per_constraints; + td->elements = asn_DEF_PER_Visible.elements; + td->elements_count = asn_DEF_PER_Visible.elements_count; + td->specifics = asn_DEF_PER_Visible.specifics; +} + +void +PER_Visible_2_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + PER_Visible_2_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +PER_Visible_2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + PER_Visible_2_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +PER_Visible_2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + PER_Visible_2_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +PER_Visible_2_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + PER_Visible_2_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +PER_Visible_2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + PER_Visible_2_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +PER_Visible_2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + PER_Visible_2_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +PER_Visible_2_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + PER_Visible_2_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [PER-Visible-2] >>> ***/ + +static ber_tlv_tag_t asn_DEF_PER_Visible_2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) +}; +static asn_per_constraints_t asn_PER_PER_Visible_2_constr_1 = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 } /* (SIZE(0..MAX)) */ +}; +asn_TYPE_descriptor_t asn_DEF_PER_Visible_2 = { + "PER-Visible-2", + "PER-Visible-2", + PER_Visible_2_free, + PER_Visible_2_print, + PER_Visible_2_constraint, + PER_Visible_2_decode_ber, + PER_Visible_2_encode_der, + PER_Visible_2_decode_xer, + PER_Visible_2_encode_xer, + PER_Visible_2_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_PER_Visible_2_tags_1, + sizeof(asn_DEF_PER_Visible_2_tags_1) + /sizeof(asn_DEF_PER_Visible_2_tags_1[0]), /* 1 */ + asn_DEF_PER_Visible_2_tags_1, /* Same as above */ + sizeof(asn_DEF_PER_Visible_2_tags_1) + /sizeof(asn_DEF_PER_Visible_2_tags_1[0]), /* 1 */ + &asn_PER_PER_Visible_2_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Not-PER-Visible-1] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Not-PER-Visible-1] >>> ***/ + +typedef PER_Visible_t Not_PER_Visible_1_t; + +/*** <<< FUNC-DECLS [Not-PER-Visible-1] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_1; +asn_struct_free_f Not_PER_Visible_1_free; +asn_struct_print_f Not_PER_Visible_1_print; +asn_constr_check_f Not_PER_Visible_1_constraint; +ber_type_decoder_f Not_PER_Visible_1_decode_ber; +der_type_encoder_f Not_PER_Visible_1_encode_der; +xer_type_decoder_f Not_PER_Visible_1_decode_xer; +xer_type_encoder_f Not_PER_Visible_1_encode_xer; +per_type_decoder_f Not_PER_Visible_1_decode_uper; + +/*** <<< CTABLES [Not-PER-Visible-1] >>> ***/ + +static int check_permitted_alphabet_1(const void *sptr) { + /* The underlying type is IA5String */ + const IA5String_t *st = (const IA5String_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!(cv >= 65 && cv <= 70)) return -1; + } + return 0; +} + + +/*** <<< CODE [Not-PER-Visible-1] >>> ***/ + +int +Not_PER_Visible_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const PER_Visible_t *st = (const PER_Visible_t *)sptr; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(!check_permitted_alphabet_1(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using PER_Visible, + * so here we adjust the DEF accordingly. + */ +static void +Not_PER_Visible_1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_PER_Visible.free_struct; + td->print_struct = asn_DEF_PER_Visible.print_struct; + td->ber_decoder = asn_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn_DEF_PER_Visible.der_encoder; + td->xer_decoder = asn_DEF_PER_Visible.xer_decoder; + td->xer_encoder = asn_DEF_PER_Visible.xer_encoder; + td->uper_decoder = asn_DEF_PER_Visible.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_PER_Visible.per_constraints; + td->elements = asn_DEF_PER_Visible.elements; + td->elements_count = asn_DEF_PER_Visible.elements_count; + td->specifics = asn_DEF_PER_Visible.specifics; +} + +void +Not_PER_Visible_1_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Not_PER_Visible_1_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Not_PER_Visible_1_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Not_PER_Visible_1_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Not_PER_Visible_1_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Not_PER_Visible_1_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Not_PER_Visible_1_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Not_PER_Visible_1_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Not_PER_Visible_1_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Not_PER_Visible_1_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Not_PER_Visible_1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Not_PER_Visible_1_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +Not_PER_Visible_1_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + Not_PER_Visible_1_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [Not-PER-Visible-1] >>> ***/ + +static ber_tlv_tag_t asn_DEF_Not_PER_Visible_1_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) +}; +static asn_per_constraints_t asn_PER_Not_PER_Visible_1_constr_1 = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 } /* (SIZE(0..MAX)) */ +}; +asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_1 = { + "Not-PER-Visible-1", + "Not-PER-Visible-1", + Not_PER_Visible_1_free, + Not_PER_Visible_1_print, + Not_PER_Visible_1_constraint, + Not_PER_Visible_1_decode_ber, + Not_PER_Visible_1_encode_der, + Not_PER_Visible_1_decode_xer, + Not_PER_Visible_1_encode_xer, + Not_PER_Visible_1_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Not_PER_Visible_1_tags_1, + sizeof(asn_DEF_Not_PER_Visible_1_tags_1) + /sizeof(asn_DEF_Not_PER_Visible_1_tags_1[0]), /* 1 */ + asn_DEF_Not_PER_Visible_1_tags_1, /* Same as above */ + sizeof(asn_DEF_Not_PER_Visible_1_tags_1) + /sizeof(asn_DEF_Not_PER_Visible_1_tags_1[0]), /* 1 */ + &asn_PER_Not_PER_Visible_1_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Not-PER-Visible-2] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Not-PER-Visible-2] >>> ***/ + +typedef PER_Visible_t Not_PER_Visible_2_t; + +/*** <<< FUNC-DECLS [Not-PER-Visible-2] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_2; +asn_struct_free_f Not_PER_Visible_2_free; +asn_struct_print_f Not_PER_Visible_2_print; +asn_constr_check_f Not_PER_Visible_2_constraint; +ber_type_decoder_f Not_PER_Visible_2_decode_ber; +der_type_encoder_f Not_PER_Visible_2_encode_der; +xer_type_decoder_f Not_PER_Visible_2_decode_xer; +xer_type_encoder_f Not_PER_Visible_2_encode_xer; +per_type_decoder_f Not_PER_Visible_2_decode_uper; + +/*** <<< CTABLES [Not-PER-Visible-2] >>> ***/ + +static int check_permitted_alphabet_1(const void *sptr) { + /* The underlying type is IA5String */ + const IA5String_t *st = (const IA5String_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!(cv >= 65 && cv <= 66)) return -1; + } + return 0; +} + + +/*** <<< CODE [Not-PER-Visible-2] >>> ***/ + +int +Not_PER_Visible_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const PER_Visible_t *st = (const PER_Visible_t *)sptr; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(!check_permitted_alphabet_1(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using PER_Visible, + * so here we adjust the DEF accordingly. + */ +static void +Not_PER_Visible_2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_PER_Visible.free_struct; + td->print_struct = asn_DEF_PER_Visible.print_struct; + td->ber_decoder = asn_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn_DEF_PER_Visible.der_encoder; + td->xer_decoder = asn_DEF_PER_Visible.xer_decoder; + td->xer_encoder = asn_DEF_PER_Visible.xer_encoder; + td->uper_decoder = asn_DEF_PER_Visible.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_PER_Visible.per_constraints; + td->elements = asn_DEF_PER_Visible.elements; + td->elements_count = asn_DEF_PER_Visible.elements_count; + td->specifics = asn_DEF_PER_Visible.specifics; +} + +void +Not_PER_Visible_2_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Not_PER_Visible_2_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Not_PER_Visible_2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Not_PER_Visible_2_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Not_PER_Visible_2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Not_PER_Visible_2_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Not_PER_Visible_2_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Not_PER_Visible_2_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Not_PER_Visible_2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Not_PER_Visible_2_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Not_PER_Visible_2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Not_PER_Visible_2_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +Not_PER_Visible_2_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + Not_PER_Visible_2_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [Not-PER-Visible-2] >>> ***/ + +static ber_tlv_tag_t asn_DEF_Not_PER_Visible_2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) +}; +static asn_per_constraints_t asn_PER_Not_PER_Visible_2_constr_1 = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 } /* (SIZE(0..MAX)) */ +}; +asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_2 = { + "Not-PER-Visible-2", + "Not-PER-Visible-2", + Not_PER_Visible_2_free, + Not_PER_Visible_2_print, + Not_PER_Visible_2_constraint, + Not_PER_Visible_2_decode_ber, + Not_PER_Visible_2_encode_der, + Not_PER_Visible_2_decode_xer, + Not_PER_Visible_2_encode_xer, + Not_PER_Visible_2_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Not_PER_Visible_2_tags_1, + sizeof(asn_DEF_Not_PER_Visible_2_tags_1) + /sizeof(asn_DEF_Not_PER_Visible_2_tags_1[0]), /* 1 */ + asn_DEF_Not_PER_Visible_2_tags_1, /* Same as above */ + sizeof(asn_DEF_Not_PER_Visible_2_tags_1) + /sizeof(asn_DEF_Not_PER_Visible_2_tags_1[0]), /* 1 */ + &asn_PER_Not_PER_Visible_2_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Not-PER-Visible-3] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Not-PER-Visible-3] >>> ***/ + +typedef PER_Visible_t Not_PER_Visible_3_t; + +/*** <<< FUNC-DECLS [Not-PER-Visible-3] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_3; +asn_struct_free_f Not_PER_Visible_3_free; +asn_struct_print_f Not_PER_Visible_3_print; +asn_constr_check_f Not_PER_Visible_3_constraint; +ber_type_decoder_f Not_PER_Visible_3_decode_ber; +der_type_encoder_f Not_PER_Visible_3_encode_der; +xer_type_decoder_f Not_PER_Visible_3_decode_xer; +xer_type_encoder_f Not_PER_Visible_3_encode_xer; +per_type_decoder_f Not_PER_Visible_3_decode_uper; + +/*** <<< CTABLES [Not-PER-Visible-3] >>> ***/ + +static int check_permitted_alphabet_1(const void *sptr) { + /* The underlying type is IA5String */ + const IA5String_t *st = (const IA5String_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!(cv >= 65 && cv <= 66)) return -1; + } + return 0; +} + + +/*** <<< CODE [Not-PER-Visible-3] >>> ***/ + +int +Not_PER_Visible_3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const PER_Visible_t *st = (const PER_Visible_t *)sptr; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(!check_permitted_alphabet_1(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using PER_Visible, + * so here we adjust the DEF accordingly. + */ +static void +Not_PER_Visible_3_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_PER_Visible.free_struct; + td->print_struct = asn_DEF_PER_Visible.print_struct; + td->ber_decoder = asn_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn_DEF_PER_Visible.der_encoder; + td->xer_decoder = asn_DEF_PER_Visible.xer_decoder; + td->xer_encoder = asn_DEF_PER_Visible.xer_encoder; + td->uper_decoder = asn_DEF_PER_Visible.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_PER_Visible.per_constraints; + td->elements = asn_DEF_PER_Visible.elements; + td->elements_count = asn_DEF_PER_Visible.elements_count; + td->specifics = asn_DEF_PER_Visible.specifics; +} + +void +Not_PER_Visible_3_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Not_PER_Visible_3_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Not_PER_Visible_3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Not_PER_Visible_3_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Not_PER_Visible_3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Not_PER_Visible_3_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Not_PER_Visible_3_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Not_PER_Visible_3_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Not_PER_Visible_3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Not_PER_Visible_3_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Not_PER_Visible_3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Not_PER_Visible_3_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +Not_PER_Visible_3_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + Not_PER_Visible_3_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [Not-PER-Visible-3] >>> ***/ + +static ber_tlv_tag_t asn_DEF_Not_PER_Visible_3_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) +}; +static asn_per_constraints_t asn_PER_Not_PER_Visible_3_constr_1 = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 } /* (SIZE(0..MAX)) */ +}; +asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_3 = { + "Not-PER-Visible-3", + "Not-PER-Visible-3", + Not_PER_Visible_3_free, + Not_PER_Visible_3_print, + Not_PER_Visible_3_constraint, + Not_PER_Visible_3_decode_ber, + Not_PER_Visible_3_encode_der, + Not_PER_Visible_3_decode_xer, + Not_PER_Visible_3_encode_xer, + Not_PER_Visible_3_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Not_PER_Visible_3_tags_1, + sizeof(asn_DEF_Not_PER_Visible_3_tags_1) + /sizeof(asn_DEF_Not_PER_Visible_3_tags_1[0]), /* 1 */ + asn_DEF_Not_PER_Visible_3_tags_1, /* Same as above */ + sizeof(asn_DEF_Not_PER_Visible_3_tags_1) + /sizeof(asn_DEF_Not_PER_Visible_3_tags_1[0]), /* 1 */ + &asn_PER_Not_PER_Visible_3_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [SIZE-but-not-FROM] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [SIZE-but-not-FROM] >>> ***/ + +typedef PER_Visible_t SIZE_but_not_FROM_t; + +/*** <<< FUNC-DECLS [SIZE-but-not-FROM] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_SIZE_but_not_FROM; +asn_struct_free_f SIZE_but_not_FROM_free; +asn_struct_print_f SIZE_but_not_FROM_print; +asn_constr_check_f SIZE_but_not_FROM_constraint; +ber_type_decoder_f SIZE_but_not_FROM_decode_ber; +der_type_encoder_f SIZE_but_not_FROM_encode_der; +xer_type_decoder_f SIZE_but_not_FROM_decode_xer; +xer_type_encoder_f SIZE_but_not_FROM_encode_xer; +per_type_decoder_f SIZE_but_not_FROM_decode_uper; + +/*** <<< CTABLES [SIZE-but-not-FROM] >>> ***/ + +static int check_permitted_alphabet_1(const void *sptr) { + /* The underlying type is IA5String */ + const IA5String_t *st = (const IA5String_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!(cv >= 65 && cv <= 68)) return -1; + } + return 0; +} + + +/*** <<< CODE [SIZE-but-not-FROM] >>> ***/ + +int +SIZE_but_not_FROM_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const PER_Visible_t *st = (const PER_Visible_t *)sptr; + size_t size; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size >= 1 && size <= 4) + && !check_permitted_alphabet_1(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using PER_Visible, + * so here we adjust the DEF accordingly. + */ +static void +SIZE_but_not_FROM_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_PER_Visible.free_struct; + td->print_struct = asn_DEF_PER_Visible.print_struct; + td->ber_decoder = asn_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn_DEF_PER_Visible.der_encoder; + td->xer_decoder = asn_DEF_PER_Visible.xer_decoder; + td->xer_encoder = asn_DEF_PER_Visible.xer_encoder; + td->uper_decoder = asn_DEF_PER_Visible.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_PER_Visible.per_constraints; + td->elements = asn_DEF_PER_Visible.elements; + td->elements_count = asn_DEF_PER_Visible.elements_count; + td->specifics = asn_DEF_PER_Visible.specifics; +} + +void +SIZE_but_not_FROM_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + SIZE_but_not_FROM_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +SIZE_but_not_FROM_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + SIZE_but_not_FROM_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +SIZE_but_not_FROM_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + SIZE_but_not_FROM_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +SIZE_but_not_FROM_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + SIZE_but_not_FROM_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +SIZE_but_not_FROM_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + SIZE_but_not_FROM_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +SIZE_but_not_FROM_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + SIZE_but_not_FROM_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +SIZE_but_not_FROM_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + SIZE_but_not_FROM_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [SIZE-but-not-FROM] >>> ***/ + +static ber_tlv_tag_t asn_DEF_SIZE_but_not_FROM_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) +}; +static asn_per_constraints_t asn_PER_SIZE_but_not_FROM_constr_1 = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 2, 2, 1, 4 } /* (SIZE(1..4)) */ +}; +asn_TYPE_descriptor_t asn_DEF_SIZE_but_not_FROM = { + "SIZE-but-not-FROM", + "SIZE-but-not-FROM", + SIZE_but_not_FROM_free, + SIZE_but_not_FROM_print, + SIZE_but_not_FROM_constraint, + SIZE_but_not_FROM_decode_ber, + SIZE_but_not_FROM_encode_der, + SIZE_but_not_FROM_decode_xer, + SIZE_but_not_FROM_encode_xer, + SIZE_but_not_FROM_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_SIZE_but_not_FROM_tags_1, + sizeof(asn_DEF_SIZE_but_not_FROM_tags_1) + /sizeof(asn_DEF_SIZE_but_not_FROM_tags_1[0]), /* 1 */ + asn_DEF_SIZE_but_not_FROM_tags_1, /* Same as above */ + sizeof(asn_DEF_SIZE_but_not_FROM_tags_1) + /sizeof(asn_DEF_SIZE_but_not_FROM_tags_1[0]), /* 1 */ + &asn_PER_SIZE_but_not_FROM_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [SIZE-and-FROM] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [SIZE-and-FROM] >>> ***/ + +typedef PER_Visible_t SIZE_and_FROM_t; + +/*** <<< FUNC-DECLS [SIZE-and-FROM] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_SIZE_and_FROM; +asn_struct_free_f SIZE_and_FROM_free; +asn_struct_print_f SIZE_and_FROM_print; +asn_constr_check_f SIZE_and_FROM_constraint; +ber_type_decoder_f SIZE_and_FROM_decode_ber; +der_type_encoder_f SIZE_and_FROM_encode_der; +xer_type_decoder_f SIZE_and_FROM_decode_xer; +xer_type_encoder_f SIZE_and_FROM_encode_xer; +per_type_decoder_f SIZE_and_FROM_decode_uper; + +/*** <<< CTABLES [SIZE-and-FROM] >>> ***/ + +static int check_permitted_alphabet_1(const void *sptr) { + /* The underlying type is IA5String */ + const IA5String_t *st = (const IA5String_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!(cv >= 65 && cv <= 68)) return -1; + } + return 0; +} + + +/*** <<< CODE [SIZE-and-FROM] >>> ***/ + +int +SIZE_and_FROM_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const PER_Visible_t *st = (const PER_Visible_t *)sptr; + size_t size; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size >= 1 && size <= 4) + && !check_permitted_alphabet_1(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using PER_Visible, + * so here we adjust the DEF accordingly. + */ +static void +SIZE_and_FROM_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_PER_Visible.free_struct; + td->print_struct = asn_DEF_PER_Visible.print_struct; + td->ber_decoder = asn_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn_DEF_PER_Visible.der_encoder; + td->xer_decoder = asn_DEF_PER_Visible.xer_decoder; + td->xer_encoder = asn_DEF_PER_Visible.xer_encoder; + td->uper_decoder = asn_DEF_PER_Visible.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_PER_Visible.per_constraints; + td->elements = asn_DEF_PER_Visible.elements; + td->elements_count = asn_DEF_PER_Visible.elements_count; + td->specifics = asn_DEF_PER_Visible.specifics; +} + +void +SIZE_and_FROM_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + SIZE_and_FROM_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +SIZE_and_FROM_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + SIZE_and_FROM_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +SIZE_and_FROM_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + SIZE_and_FROM_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +SIZE_and_FROM_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + SIZE_and_FROM_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +SIZE_and_FROM_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + SIZE_and_FROM_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +SIZE_and_FROM_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + SIZE_and_FROM_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +SIZE_and_FROM_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + SIZE_and_FROM_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [SIZE-and-FROM] >>> ***/ + +static ber_tlv_tag_t asn_DEF_SIZE_and_FROM_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) +}; +static asn_per_constraints_t asn_PER_SIZE_and_FROM_constr_1 = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 2, 2, 1, 4 } /* (SIZE(1..4)) */ +}; +asn_TYPE_descriptor_t asn_DEF_SIZE_and_FROM = { + "SIZE-and-FROM", + "SIZE-and-FROM", + SIZE_and_FROM_free, + SIZE_and_FROM_print, + SIZE_and_FROM_constraint, + SIZE_and_FROM_decode_ber, + SIZE_and_FROM_encode_der, + SIZE_and_FROM_decode_xer, + SIZE_and_FROM_encode_xer, + SIZE_and_FROM_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_SIZE_and_FROM_tags_1, + sizeof(asn_DEF_SIZE_and_FROM_tags_1) + /sizeof(asn_DEF_SIZE_and_FROM_tags_1[0]), /* 1 */ + asn_DEF_SIZE_and_FROM_tags_1, /* Same as above */ + sizeof(asn_DEF_SIZE_and_FROM_tags_1) + /sizeof(asn_DEF_SIZE_and_FROM_tags_1[0]), /* 1 */ + &asn_PER_SIZE_and_FROM_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Neither-SIZE-nor-FROM] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Neither-SIZE-nor-FROM] >>> ***/ + +typedef PER_Visible_t Neither_SIZE_nor_FROM_t; + +/*** <<< FUNC-DECLS [Neither-SIZE-nor-FROM] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Neither_SIZE_nor_FROM; +asn_struct_free_f Neither_SIZE_nor_FROM_free; +asn_struct_print_f Neither_SIZE_nor_FROM_print; +asn_constr_check_f Neither_SIZE_nor_FROM_constraint; +ber_type_decoder_f Neither_SIZE_nor_FROM_decode_ber; +der_type_encoder_f Neither_SIZE_nor_FROM_encode_der; +xer_type_decoder_f Neither_SIZE_nor_FROM_decode_xer; +xer_type_encoder_f Neither_SIZE_nor_FROM_encode_xer; +per_type_decoder_f Neither_SIZE_nor_FROM_decode_uper; + +/*** <<< CTABLES [Neither-SIZE-nor-FROM] >>> ***/ + +static int check_permitted_alphabet_1(const void *sptr) { + /* The underlying type is IA5String */ + const IA5String_t *st = (const IA5String_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!(cv >= 65 && cv <= 70)) return -1; + } + return 0; +} + + +/*** <<< CODE [Neither-SIZE-nor-FROM] >>> ***/ + +int +Neither_SIZE_nor_FROM_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const PER_Visible_t *st = (const PER_Visible_t *)sptr; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(!check_permitted_alphabet_1(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using PER_Visible, + * so here we adjust the DEF accordingly. + */ +static void +Neither_SIZE_nor_FROM_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_PER_Visible.free_struct; + td->print_struct = asn_DEF_PER_Visible.print_struct; + td->ber_decoder = asn_DEF_PER_Visible.ber_decoder; + td->der_encoder = asn_DEF_PER_Visible.der_encoder; + td->xer_decoder = asn_DEF_PER_Visible.xer_decoder; + td->xer_encoder = asn_DEF_PER_Visible.xer_encoder; + td->uper_decoder = asn_DEF_PER_Visible.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_PER_Visible.per_constraints; + td->elements = asn_DEF_PER_Visible.elements; + td->elements_count = asn_DEF_PER_Visible.elements_count; + td->specifics = asn_DEF_PER_Visible.specifics; +} + +void +Neither_SIZE_nor_FROM_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Neither_SIZE_nor_FROM_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Neither_SIZE_nor_FROM_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Neither_SIZE_nor_FROM_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Neither_SIZE_nor_FROM_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Neither_SIZE_nor_FROM_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Neither_SIZE_nor_FROM_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Neither_SIZE_nor_FROM_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Neither_SIZE_nor_FROM_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Neither_SIZE_nor_FROM_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Neither_SIZE_nor_FROM_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Neither_SIZE_nor_FROM_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +Neither_SIZE_nor_FROM_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + Neither_SIZE_nor_FROM_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [Neither-SIZE-nor-FROM] >>> ***/ + +static ber_tlv_tag_t asn_DEF_Neither_SIZE_nor_FROM_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)) +}; +static asn_per_constraints_t asn_PER_Neither_SIZE_nor_FROM_constr_1 = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 } /* (SIZE(0..MAX)) */ +}; +asn_TYPE_descriptor_t asn_DEF_Neither_SIZE_nor_FROM = { + "Neither-SIZE-nor-FROM", + "Neither-SIZE-nor-FROM", + Neither_SIZE_nor_FROM_free, + Neither_SIZE_nor_FROM_print, + Neither_SIZE_nor_FROM_constraint, + Neither_SIZE_nor_FROM_decode_ber, + Neither_SIZE_nor_FROM_encode_der, + Neither_SIZE_nor_FROM_decode_xer, + Neither_SIZE_nor_FROM_encode_xer, + Neither_SIZE_nor_FROM_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Neither_SIZE_nor_FROM_tags_1, + sizeof(asn_DEF_Neither_SIZE_nor_FROM_tags_1) + /sizeof(asn_DEF_Neither_SIZE_nor_FROM_tags_1[0]), /* 1 */ + asn_DEF_Neither_SIZE_nor_FROM_tags_1, /* Same as above */ + sizeof(asn_DEF_Neither_SIZE_nor_FROM_tags_1) + /sizeof(asn_DEF_Neither_SIZE_nor_FROM_tags_1[0]), /* 1 */ + &asn_PER_Neither_SIZE_nor_FROM_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Utf8-4] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Utf8-4] >>> ***/ + +typedef UTF8String_t Utf8_4_t; + +/*** <<< FUNC-DECLS [Utf8-4] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Utf8_4; +asn_struct_free_f Utf8_4_free; +asn_struct_print_f Utf8_4_print; +asn_constr_check_f Utf8_4_constraint; +ber_type_decoder_f Utf8_4_decode_ber; +der_type_encoder_f Utf8_4_encode_der; +xer_type_decoder_f Utf8_4_decode_xer; +xer_type_encoder_f Utf8_4_encode_xer; +per_type_decoder_f Utf8_4_decode_uper; + +/*** <<< CTABLES [Utf8-4] >>> ***/ + +static int check_permitted_alphabet_1(const void *sptr) { + if(UTF8String_length((const UTF8String_t *)sptr) < 0) + return -1; /* Alphabet (sic!) test failed. */ + + return 0; +} + + +/*** <<< CODE [Utf8-4] >>> ***/ + +int +Utf8_4_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const UTF8String_t *st = (const UTF8String_t *)sptr; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(!check_permitted_alphabet_1(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using UTF8String, + * so here we adjust the DEF accordingly. + */ +static void +Utf8_4_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_UTF8String.free_struct; + td->print_struct = asn_DEF_UTF8String.print_struct; + td->ber_decoder = asn_DEF_UTF8String.ber_decoder; + td->der_encoder = asn_DEF_UTF8String.der_encoder; + td->xer_decoder = asn_DEF_UTF8String.xer_decoder; + td->xer_encoder = asn_DEF_UTF8String.xer_encoder; + td->uper_decoder = asn_DEF_UTF8String.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_UTF8String.per_constraints; + td->elements = asn_DEF_UTF8String.elements; + td->elements_count = asn_DEF_UTF8String.elements_count; + td->specifics = asn_DEF_UTF8String.specifics; +} + +void +Utf8_4_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Utf8_4_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Utf8_4_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_4_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Utf8_4_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Utf8_4_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Utf8_4_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_4_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Utf8_4_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Utf8_4_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Utf8_4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_4_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +Utf8_4_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + Utf8_4_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [Utf8-4] >>> ***/ + +static ber_tlv_tag_t asn_DEF_Utf8_4_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)) +}; +static asn_per_constraints_t asn_PER_Utf8_4_constr_1 = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_Utf8_4 = { + "Utf8-4", + "Utf8-4", + Utf8_4_free, + Utf8_4_print, + Utf8_4_constraint, + Utf8_4_decode_ber, + Utf8_4_encode_der, + Utf8_4_decode_xer, + Utf8_4_encode_xer, + Utf8_4_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Utf8_4_tags_1, + sizeof(asn_DEF_Utf8_4_tags_1) + /sizeof(asn_DEF_Utf8_4_tags_1[0]), /* 1 */ + asn_DEF_Utf8_4_tags_1, /* Same as above */ + sizeof(asn_DEF_Utf8_4_tags_1) + /sizeof(asn_DEF_Utf8_4_tags_1[0]), /* 1 */ + &asn_PER_Utf8_4_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Utf8-3] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Utf8-3] >>> ***/ + +typedef Utf8_2_t Utf8_3_t; + +/*** <<< FUNC-DECLS [Utf8-3] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Utf8_3; +asn_struct_free_f Utf8_3_free; +asn_struct_print_f Utf8_3_print; +asn_constr_check_f Utf8_3_constraint; +ber_type_decoder_f Utf8_3_decode_ber; +der_type_encoder_f Utf8_3_encode_der; +xer_type_decoder_f Utf8_3_decode_xer; +xer_type_encoder_f Utf8_3_encode_xer; +per_type_decoder_f Utf8_3_decode_uper; + +/*** <<< CTABLES [Utf8-3] >>> ***/ + +static int permitted_alphabet_table_1[128] = { +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ABCDEFGHIJKLMNO */ +1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, /* PQRSTUVWXYZ */ +0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* abcdefghijklmno */ +1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, /* pqrstuvwxyz */ +}; + +static int check_permitted_alphabet_1(const void *sptr) { + int *table = permitted_alphabet_table_1; + /* The underlying type is UTF8String */ + const UTF8String_t *st = (const UTF8String_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(cv >= 0x80) return -1; + if(!table[cv]) return -1; + } + return 0; +} + + +/*** <<< CODE [Utf8-3] >>> ***/ + +int +Utf8_3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const Utf8_2_t *st = (const Utf8_2_t *)sptr; + size_t size; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = UTF8String_length(st); + if((ssize_t)size < 0) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: UTF-8: broken encoding (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((size >= 1 && size <= 2) + && !check_permitted_alphabet_1(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using Utf8_2, + * so here we adjust the DEF accordingly. + */ +static void +Utf8_3_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Utf8_2.free_struct; + td->print_struct = asn_DEF_Utf8_2.print_struct; + td->ber_decoder = asn_DEF_Utf8_2.ber_decoder; + td->der_encoder = asn_DEF_Utf8_2.der_encoder; + td->xer_decoder = asn_DEF_Utf8_2.xer_decoder; + td->xer_encoder = asn_DEF_Utf8_2.xer_encoder; + td->uper_decoder = asn_DEF_Utf8_2.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Utf8_2.per_constraints; + td->elements = asn_DEF_Utf8_2.elements; + td->elements_count = asn_DEF_Utf8_2.elements_count; + td->specifics = asn_DEF_Utf8_2.specifics; +} + +void +Utf8_3_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Utf8_3_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Utf8_3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_3_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Utf8_3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Utf8_3_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Utf8_3_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_3_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Utf8_3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Utf8_3_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Utf8_3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_3_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +Utf8_3_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + Utf8_3_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [Utf8-3] >>> ***/ + +static ber_tlv_tag_t asn_DEF_Utf8_3_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)) +}; +static asn_per_constraints_t asn_PER_Utf8_3_constr_1 = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_Utf8_3 = { + "Utf8-3", + "Utf8-3", + Utf8_3_free, + Utf8_3_print, + Utf8_3_constraint, + Utf8_3_decode_ber, + Utf8_3_encode_der, + Utf8_3_decode_xer, + Utf8_3_encode_xer, + Utf8_3_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Utf8_3_tags_1, + sizeof(asn_DEF_Utf8_3_tags_1) + /sizeof(asn_DEF_Utf8_3_tags_1[0]), /* 1 */ + asn_DEF_Utf8_3_tags_1, /* Same as above */ + sizeof(asn_DEF_Utf8_3_tags_1) + /sizeof(asn_DEF_Utf8_3_tags_1[0]), /* 1 */ + &asn_PER_Utf8_3_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Utf8-2] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Utf8-2] >>> ***/ + +typedef Utf8_1_t Utf8_2_t; + +/*** <<< FUNC-DECLS [Utf8-2] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Utf8_2; +asn_struct_free_f Utf8_2_free; +asn_struct_print_f Utf8_2_print; +asn_constr_check_f Utf8_2_constraint; +ber_type_decoder_f Utf8_2_decode_ber; +der_type_encoder_f Utf8_2_encode_der; +xer_type_decoder_f Utf8_2_decode_xer; +xer_type_encoder_f Utf8_2_encode_xer; +per_type_decoder_f Utf8_2_decode_uper; + +/*** <<< CODE [Utf8-2] >>> ***/ + +int +Utf8_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const Utf8_1_t *st = (const Utf8_1_t *)sptr; + size_t size; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = UTF8String_length(st); + if((ssize_t)size < 0) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: UTF-8: broken encoding (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((size >= 1 && size <= 2)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using Utf8_1, + * so here we adjust the DEF accordingly. + */ +static void +Utf8_2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Utf8_1.free_struct; + td->print_struct = asn_DEF_Utf8_1.print_struct; + td->ber_decoder = asn_DEF_Utf8_1.ber_decoder; + td->der_encoder = asn_DEF_Utf8_1.der_encoder; + td->xer_decoder = asn_DEF_Utf8_1.xer_decoder; + td->xer_encoder = asn_DEF_Utf8_1.xer_encoder; + td->uper_decoder = asn_DEF_Utf8_1.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Utf8_1.per_constraints; + td->elements = asn_DEF_Utf8_1.elements; + td->elements_count = asn_DEF_Utf8_1.elements_count; + td->specifics = asn_DEF_Utf8_1.specifics; +} + +void +Utf8_2_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Utf8_2_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Utf8_2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_2_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Utf8_2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Utf8_2_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Utf8_2_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_2_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Utf8_2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Utf8_2_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Utf8_2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_2_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +Utf8_2_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + Utf8_2_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [Utf8-2] >>> ***/ + +static ber_tlv_tag_t asn_DEF_Utf8_2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)) +}; +static asn_per_constraints_t asn_PER_Utf8_2_constr_1 = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_Utf8_2 = { + "Utf8-2", + "Utf8-2", + Utf8_2_free, + Utf8_2_print, + Utf8_2_constraint, + Utf8_2_decode_ber, + Utf8_2_encode_der, + Utf8_2_decode_xer, + Utf8_2_encode_xer, + Utf8_2_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Utf8_2_tags_1, + sizeof(asn_DEF_Utf8_2_tags_1) + /sizeof(asn_DEF_Utf8_2_tags_1[0]), /* 1 */ + asn_DEF_Utf8_2_tags_1, /* Same as above */ + sizeof(asn_DEF_Utf8_2_tags_1) + /sizeof(asn_DEF_Utf8_2_tags_1[0]), /* 1 */ + &asn_PER_Utf8_2_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Utf8-1] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Utf8-1] >>> ***/ + +typedef UTF8String_t Utf8_1_t; + +/*** <<< FUNC-DECLS [Utf8-1] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Utf8_1; +asn_struct_free_f Utf8_1_free; +asn_struct_print_f Utf8_1_print; +asn_constr_check_f Utf8_1_constraint; +ber_type_decoder_f Utf8_1_decode_ber; +der_type_encoder_f Utf8_1_encode_der; +xer_type_decoder_f Utf8_1_decode_xer; +xer_type_encoder_f Utf8_1_encode_xer; +per_type_decoder_f Utf8_1_decode_uper; + +/*** <<< CODE [Utf8-1] >>> ***/ + +int +Utf8_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + /* Replace with underlying type checker */ + td->check_constraints = asn_DEF_UTF8String.check_constraints; + return td->check_constraints(td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using UTF8String, + * so here we adjust the DEF accordingly. + */ +static void +Utf8_1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_UTF8String.free_struct; + td->print_struct = asn_DEF_UTF8String.print_struct; + td->ber_decoder = asn_DEF_UTF8String.ber_decoder; + td->der_encoder = asn_DEF_UTF8String.der_encoder; + td->xer_decoder = asn_DEF_UTF8String.xer_decoder; + td->xer_encoder = asn_DEF_UTF8String.xer_encoder; + td->uper_decoder = asn_DEF_UTF8String.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_UTF8String.per_constraints; + td->elements = asn_DEF_UTF8String.elements; + td->elements_count = asn_DEF_UTF8String.elements_count; + td->specifics = asn_DEF_UTF8String.specifics; +} + +void +Utf8_1_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Utf8_1_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Utf8_1_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_1_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Utf8_1_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Utf8_1_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Utf8_1_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_1_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Utf8_1_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Utf8_1_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Utf8_1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Utf8_1_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +Utf8_1_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + Utf8_1_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [Utf8-1] >>> ***/ + +static ber_tlv_tag_t asn_DEF_Utf8_1_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_Utf8_1 = { + "Utf8-1", + "Utf8-1", + Utf8_1_free, + Utf8_1_print, + Utf8_1_constraint, + Utf8_1_decode_ber, + Utf8_1_encode_der, + Utf8_1_decode_xer, + Utf8_1_encode_xer, + Utf8_1_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Utf8_1_tags_1, + sizeof(asn_DEF_Utf8_1_tags_1) + /sizeof(asn_DEF_Utf8_1_tags_1[0]), /* 1 */ + asn_DEF_Utf8_1_tags_1, /* Same as above */ + sizeof(asn_DEF_Utf8_1_tags_1) + /sizeof(asn_DEF_Utf8_1_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [VisibleIdentifier] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [VisibleIdentifier] >>> ***/ + +typedef Identifier_t VisibleIdentifier_t; + +/*** <<< FUNC-DECLS [VisibleIdentifier] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_VisibleIdentifier; +asn_struct_free_f VisibleIdentifier_free; +asn_struct_print_f VisibleIdentifier_print; +asn_constr_check_f VisibleIdentifier_constraint; +ber_type_decoder_f VisibleIdentifier_decode_ber; +der_type_encoder_f VisibleIdentifier_encode_der; +xer_type_decoder_f VisibleIdentifier_decode_xer; +xer_type_encoder_f VisibleIdentifier_encode_xer; +per_type_decoder_f VisibleIdentifier_decode_uper; + +/*** <<< CTABLES [VisibleIdentifier] >>> ***/ + +static int permitted_alphabet_table_1[256] = { +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, /* $ */ +1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, /* 0123456789 */ +0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ABCDEFGHIJKLMNO */ +1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1, /* PQRSTUVWXYZ _ */ +0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* abcdefghijklmno */ +1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, /* pqrstuvwxyz */ +}; + +static int check_permitted_alphabet_1(const void *sptr) { + int *table = permitted_alphabet_table_1; + /* The underlying type is VisibleString */ + const VisibleString_t *st = (const VisibleString_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!table[cv]) return -1; + } + return 0; +} + + +/*** <<< CODE [VisibleIdentifier] >>> ***/ + +int +VisibleIdentifier_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const Identifier_t *st = (const Identifier_t *)sptr; + size_t size; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size >= 1 && size <= 32) + && !check_permitted_alphabet_1(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using Identifier, + * so here we adjust the DEF accordingly. + */ +static void +VisibleIdentifier_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Identifier.free_struct; + td->print_struct = asn_DEF_Identifier.print_struct; + td->ber_decoder = asn_DEF_Identifier.ber_decoder; + td->der_encoder = asn_DEF_Identifier.der_encoder; + td->xer_decoder = asn_DEF_Identifier.xer_decoder; + td->xer_encoder = asn_DEF_Identifier.xer_encoder; + td->uper_decoder = asn_DEF_Identifier.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Identifier.per_constraints; + td->elements = asn_DEF_Identifier.elements; + td->elements_count = asn_DEF_Identifier.elements_count; + td->specifics = asn_DEF_Identifier.specifics; +} + +void +VisibleIdentifier_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + VisibleIdentifier_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +VisibleIdentifier_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + VisibleIdentifier_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +VisibleIdentifier_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + VisibleIdentifier_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +VisibleIdentifier_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + VisibleIdentifier_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +VisibleIdentifier_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + VisibleIdentifier_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +VisibleIdentifier_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + VisibleIdentifier_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +VisibleIdentifier_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + VisibleIdentifier_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [VisibleIdentifier] >>> ***/ + +static ber_tlv_tag_t asn_DEF_VisibleIdentifier_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_VisibleIdentifier = { + "VisibleIdentifier", + "VisibleIdentifier", + VisibleIdentifier_free, + VisibleIdentifier_print, + VisibleIdentifier_constraint, + VisibleIdentifier_decode_ber, + VisibleIdentifier_encode_der, + VisibleIdentifier_decode_xer, + VisibleIdentifier_encode_xer, + VisibleIdentifier_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_VisibleIdentifier_tags_1, + sizeof(asn_DEF_VisibleIdentifier_tags_1) + /sizeof(asn_DEF_VisibleIdentifier_tags_1[0]), /* 1 */ + asn_DEF_VisibleIdentifier_tags_1, /* Same as above */ + sizeof(asn_DEF_VisibleIdentifier_tags_1) + /sizeof(asn_DEF_VisibleIdentifier_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Sequence] >>> ***/ + +#include +#include +#include +#include +#include +#include +#include + +/*** <<< DEPS [Sequence] >>> ***/ + +typedef enum enum_c { + enum_c_one = 1, + enum_c_two = 2, + /* + * Enumeration is extensible + */ + enum_c_three = 3 +} enum_c_e; + +/*** <<< TYPE-DECLS [Sequence] >>> ***/ + +typedef struct Sequence { + Int1_t *int1_c /* DEFAULT 3 */; + Int4_t int4; + Int4_t int4_c; + BOOLEAN_t *bool /* DEFAULT 1 */; + ENUMERATED_t enum_c; + NULL_t *null /* OPTIONAL */; + /* + * This type is extensible, + * possible extensions are below. + */ + Int5_t *int5_c /* OPTIONAL */; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} Sequence_t; + +/*** <<< FUNC-DECLS [Sequence] >>> ***/ + +/* extern asn_TYPE_descriptor_t asn_DEF_enum_c_6; // (Use -fall-defs-global to expose) */ +extern asn_TYPE_descriptor_t asn_DEF_Sequence; + +/*** <<< CODE [Sequence] >>> ***/ + +static int +enum_c_6_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + /* Replace with underlying type checker */ + td->check_constraints = asn_DEF_ENUMERATED.check_constraints; + return td->check_constraints(td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using ENUMERATED, + * so here we adjust the DEF accordingly. + */ +static void +enum_c_6_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_ENUMERATED.free_struct; + td->print_struct = asn_DEF_ENUMERATED.print_struct; + td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; + td->der_encoder = asn_DEF_ENUMERATED.der_encoder; + td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; + td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; + td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_ENUMERATED.per_constraints; + td->elements = asn_DEF_ENUMERATED.elements; + td->elements_count = asn_DEF_ENUMERATED.elements_count; + /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ +} + +static void +enum_c_6_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + enum_c_6_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +static int +enum_c_6_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + enum_c_6_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +static asn_dec_rval_t +enum_c_6_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + enum_c_6_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +static asn_enc_rval_t +enum_c_6_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + enum_c_6_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +static asn_dec_rval_t +enum_c_6_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + enum_c_6_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +static asn_enc_rval_t +enum_c_6_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + enum_c_6_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +static asn_dec_rval_t +enum_c_6_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + enum_c_6_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + +static int +memb_int1_c_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const Int1_t *st = (const Int1_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= -2)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_int4_c_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const Int4_t *st = (const Int4_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= 5 && value <= 7)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_int5_c_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const Int5_t *st = (const Int5_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value == 5)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + + +/*** <<< STAT-DEFS [Sequence] >>> ***/ + +static int asn_DFL_2_set_3(void **sptr) { + Int1_t *st = *sptr; + + if(!st) { + st = (*sptr = CALLOC(1, sizeof(*st))); + if(!st) return -1; + } + + /* Install default value 3 */ + return asn_long2INTEGER(st, 3); +} +static int asn_DFL_5_set_1(void **sptr) { + BOOLEAN_t *st = *sptr; + + if(!st) { + st = (*sptr = CALLOC(1, sizeof(*st))); + if(!st) return -1; + } + + /* Install default value 1 */ + *st = 1; + return 0; +} +static asn_INTEGER_enum_map_t asn_MAP_enum_c_value2enum_6[] = { + { 1, 3, "one" }, + { 2, 3, "two" }, + { 3, 5, "three" } + /* This list is extensible */ +}; +static unsigned int asn_MAP_enum_c_enum2value_6[] = { + 0, /* one(1) */ + 2, /* three(3) */ + 1 /* two(2) */ + /* This list is extensible */ +}; +static asn_INTEGER_specifics_t asn_SPC_enum_c_specs_6 = { + asn_MAP_enum_c_value2enum_6, /* "tag" => N; sorted by tag */ + asn_MAP_enum_c_enum2value_6, /* N => "tag"; sorted by N */ + 3, /* Number of elements in the maps */ + 3, /* Extensions before this member */ + 1 /* Strict enumeration */ +}; +static ber_tlv_tag_t asn_DEF_enum_c_tags_6[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +static asn_per_constraints_t asn_PER_enum_c_constr_6 = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_enum_c_6 = { + "enum-c", + "enum-c", + enum_c_6_free, + enum_c_6_print, + enum_c_6_constraint, + enum_c_6_decode_ber, + enum_c_6_encode_der, + enum_c_6_decode_xer, + enum_c_6_encode_xer, + enum_c_6_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_enum_c_tags_6, + sizeof(asn_DEF_enum_c_tags_6) + /sizeof(asn_DEF_enum_c_tags_6[0]), /* 1 */ + asn_DEF_enum_c_tags_6, /* Same as above */ + sizeof(asn_DEF_enum_c_tags_6) + /sizeof(asn_DEF_enum_c_tags_6[0]), /* 1 */ + &asn_PER_enum_c_constr_6, + 0, 0, /* Defined elsewhere */ + &asn_SPC_enum_c_specs_6 /* Additional specs */ +}; + +static asn_per_constraints_t asn_PER_memb_int1_c_constr_2 = { + { APC_SEMI_CONSTRAINED, -1, -1, -2, 0 } /* (-2..MAX) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +static asn_per_constraints_t asn_PER_memb_int4_c_constr_4 = { + { APC_CONSTRAINED, 2, 2, 5, 7 } /* (5..7) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +static asn_per_constraints_t asn_PER_memb_enum_c_constr_6 = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +static asn_per_constraints_t asn_PER_memb_int5_c_constr_13 = { + { APC_CONSTRAINED, 0, 0, 5, 5 } /* (5..5) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +static asn_TYPE_member_t asn_MBR_Sequence_1[] = { + { ATF_POINTER, 1, offsetof(struct Sequence, int1_c), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = &asn_DEF_Int1, + .memb_constraints = memb_int1_c_constraint_1, + .per_constraints = &asn_PER_memb_int1_c_constr_2, + .default_value = asn_DFL_2_set_3, /* DEFAULT 3 */ + .name = "int1-c" + }, + { ATF_NOFLAGS, 0, offsetof(struct Sequence, int4), + .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + .tag_mode = +1, /* EXPLICIT tag at current level */ + .type = &asn_DEF_Int4, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* No PER visible constraints */ + .default_value = 0, + .name = "int4" + }, + { ATF_NOFLAGS, 0, offsetof(struct Sequence, int4_c), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = &asn_DEF_Int4, + .memb_constraints = memb_int4_c_constraint_1, + .per_constraints = &asn_PER_memb_int4_c_constr_4, + .default_value = 0, + .name = "int4-c" + }, + { ATF_POINTER, 1, offsetof(struct Sequence, bool), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), + .tag_mode = 0, + .type = &asn_DEF_BOOLEAN, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* No PER visible constraints */ + .default_value = asn_DFL_5_set_1, /* DEFAULT 1 */ + .name = "bool" + }, + { ATF_NOFLAGS, 0, offsetof(struct Sequence, enum_c), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + .tag_mode = 0, + .type = &asn_DEF_enum_c_6, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = &asn_PER_memb_enum_c_constr_6, + .default_value = 0, + .name = "enum-c" + }, + { ATF_POINTER, 2, offsetof(struct Sequence, null), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)), + .tag_mode = 0, + .type = &asn_DEF_NULL, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* No PER visible constraints */ + .default_value = 0, + .name = "null" + }, + { ATF_POINTER, 1, offsetof(struct Sequence, int5_c), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = &asn_DEF_Int5, + .memb_constraints = memb_int5_c_constraint_1, + .per_constraints = &asn_PER_memb_int5_c_constr_13, + .default_value = 0, + .name = "int5-c" + }, +}; +static int asn_MAP_Sequence_oms_1[] = { 0, 3, 5, 6 }; +static ber_tlv_tag_t asn_DEF_Sequence_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_TYPE_tag2member_t asn_MAP_Sequence_tag2el_1[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 3, 0, 0 }, /* bool at 59 */ + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 2 }, /* int1-c at 56 */ + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 2, -1, 1 }, /* int4-c at 58 */ + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 6, -2, 0 }, /* int5-c at 62 */ + { (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)), 5, 0, 0 }, /* null at 64 */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 4, 0, 0 }, /* enum-c at 60 */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 } /* int4 at 57 */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_Sequence_specs_1 = { + sizeof(struct Sequence), + offsetof(struct Sequence, _asn_ctx), + asn_MAP_Sequence_tag2el_1, + 7, /* Count of tags in the map */ + asn_MAP_Sequence_oms_1, /* Optional members */ + 3, 1, /* Root/Additions */ + 5, /* Start extensions */ + 8 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_Sequence = { + "Sequence", + "Sequence", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + SEQUENCE_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Sequence_tags_1, + sizeof(asn_DEF_Sequence_tags_1) + /sizeof(asn_DEF_Sequence_tags_1[0]), /* 1 */ + asn_DEF_Sequence_tags_1, /* Same as above */ + sizeof(asn_DEF_Sequence_tags_1) + /sizeof(asn_DEF_Sequence_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_Sequence_1, + 7, /* Elements count */ + &asn_SPC_Sequence_specs_1 /* Additional specs */ +}; + + +/*** <<< INCLUDES [SequenceOf] >>> ***/ + +#include +#include + +/*** <<< FWD-DECLS [SequenceOf] >>> ***/ + +struct Sequence; + +/*** <<< TYPE-DECLS [SequenceOf] >>> ***/ + +typedef struct SequenceOf { + A_SEQUENCE_OF(struct Sequence) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} SequenceOf_t; + +/*** <<< FUNC-DECLS [SequenceOf] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_SequenceOf; + +/*** <<< POST-INCLUDE [SequenceOf] >>> ***/ + +#include + +/*** <<< STAT-DEFS [SequenceOf] >>> ***/ + +static asn_TYPE_member_t asn_MBR_SequenceOf_1[] = { + { ATF_POINTER, 0, 0, + .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + .tag_mode = 0, + .type = &asn_DEF_Sequence, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* No PER visible constraints */ + .default_value = 0, + .name = "" + }, +}; +static ber_tlv_tag_t asn_DEF_SequenceOf_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_SequenceOf_specs_1 = { + sizeof(struct SequenceOf), + offsetof(struct SequenceOf, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +static asn_per_constraints_t asn_PER_SequenceOf_constr_1 = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 1, 1, 1, 2 } /* (SIZE(1..2)) */ +}; +asn_TYPE_descriptor_t asn_DEF_SequenceOf = { + "SequenceOf", + "SequenceOf", + SEQUENCE_OF_free, + SEQUENCE_OF_print, + SEQUENCE_OF_constraint, + SEQUENCE_OF_decode_ber, + SEQUENCE_OF_encode_der, + SEQUENCE_OF_decode_xer, + SEQUENCE_OF_encode_xer, + SEQUENCE_OF_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_SequenceOf_tags_1, + sizeof(asn_DEF_SequenceOf_tags_1) + /sizeof(asn_DEF_SequenceOf_tags_1[0]), /* 1 */ + asn_DEF_SequenceOf_tags_1, /* Same as above */ + sizeof(asn_DEF_SequenceOf_tags_1) + /sizeof(asn_DEF_SequenceOf_tags_1[0]), /* 1 */ + &asn_PER_SequenceOf_constr_1, + asn_MBR_SequenceOf_1, + 1, /* Single element */ + &asn_SPC_SequenceOf_specs_1 /* Additional specs */ +}; + + +/*** <<< INCLUDES [Enum0] >>> ***/ + +#include + +/*** <<< DEPS [Enum0] >>> ***/ + +typedef enum Enum0 { + Enum0_one = 0, + Enum0_two = 1 +} Enum0_e; + +/*** <<< TYPE-DECLS [Enum0] >>> ***/ + +typedef ENUMERATED_t Enum0_t; + +/*** <<< FUNC-DECLS [Enum0] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Enum0; +asn_struct_free_f Enum0_free; +asn_struct_print_f Enum0_print; +asn_constr_check_f Enum0_constraint; +ber_type_decoder_f Enum0_decode_ber; +der_type_encoder_f Enum0_encode_der; +xer_type_decoder_f Enum0_decode_xer; +xer_type_encoder_f Enum0_encode_xer; +per_type_decoder_f Enum0_decode_uper; + +/*** <<< CODE [Enum0] >>> ***/ + +int +Enum0_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + /* Replace with underlying type checker */ + td->check_constraints = asn_DEF_ENUMERATED.check_constraints; + return td->check_constraints(td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using ENUMERATED, + * so here we adjust the DEF accordingly. + */ +static void +Enum0_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_ENUMERATED.free_struct; + td->print_struct = asn_DEF_ENUMERATED.print_struct; + td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; + td->der_encoder = asn_DEF_ENUMERATED.der_encoder; + td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; + td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; + td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_ENUMERATED.per_constraints; + td->elements = asn_DEF_ENUMERATED.elements; + td->elements_count = asn_DEF_ENUMERATED.elements_count; + /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ +} + +void +Enum0_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Enum0_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Enum0_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Enum0_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Enum0_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Enum0_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Enum0_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Enum0_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Enum0_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Enum0_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Enum0_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Enum0_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +Enum0_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + Enum0_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [Enum0] >>> ***/ + +static asn_INTEGER_enum_map_t asn_MAP_Enum0_value2enum_1[] = { + { 0, 3, "one" }, + { 1, 3, "two" } +}; +static unsigned int asn_MAP_Enum0_enum2value_1[] = { + 0, /* one(0) */ + 1 /* two(1) */ +}; +static asn_INTEGER_specifics_t asn_SPC_Enum0_specs_1 = { + asn_MAP_Enum0_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_Enum0_enum2value_1, /* N => "tag"; sorted by N */ + 2, /* Number of elements in the maps */ + 0, /* Enumeration is not extensible */ + 1 /* Strict enumeration */ +}; +static ber_tlv_tag_t asn_DEF_Enum0_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +static asn_per_constraints_t asn_PER_Enum0_constr_1 = { + { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_Enum0 = { + "Enum0", + "Enum0", + Enum0_free, + Enum0_print, + Enum0_constraint, + Enum0_decode_ber, + Enum0_encode_der, + Enum0_decode_xer, + Enum0_encode_xer, + Enum0_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Enum0_tags_1, + sizeof(asn_DEF_Enum0_tags_1) + /sizeof(asn_DEF_Enum0_tags_1[0]), /* 1 */ + asn_DEF_Enum0_tags_1, /* Same as above */ + sizeof(asn_DEF_Enum0_tags_1) + /sizeof(asn_DEF_Enum0_tags_1[0]), /* 1 */ + &asn_PER_Enum0_constr_1, + 0, 0, /* Defined elsewhere */ + &asn_SPC_Enum0_specs_1 /* Additional specs */ +}; + + +/*** <<< INCLUDES [Enum1] >>> ***/ + +#include + +/*** <<< DEPS [Enum1] >>> ***/ + +typedef enum Enum1 { + Enum1_one = 0, + Enum1_two = 1 +} Enum1_e; + +/*** <<< TYPE-DECLS [Enum1] >>> ***/ + +typedef long Enum1_t; + +/*** <<< FUNC-DECLS [Enum1] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Enum1; +asn_struct_free_f Enum1_free; +asn_struct_print_f Enum1_print; +asn_constr_check_f Enum1_constraint; +ber_type_decoder_f Enum1_decode_ber; +der_type_encoder_f Enum1_encode_der; +xer_type_decoder_f Enum1_decode_xer; +xer_type_encoder_f Enum1_encode_xer; +per_type_decoder_f Enum1_decode_uper; + +/*** <<< CODE [Enum1] >>> ***/ + +int +Enum1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value == 0)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static void +Enum1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_NativeEnumerated.free_struct; + td->print_struct = asn_DEF_NativeEnumerated.print_struct; + td->ber_decoder = asn_DEF_NativeEnumerated.ber_decoder; + td->der_encoder = asn_DEF_NativeEnumerated.der_encoder; + td->xer_decoder = asn_DEF_NativeEnumerated.xer_decoder; + td->xer_encoder = asn_DEF_NativeEnumerated.xer_encoder; + td->uper_decoder = asn_DEF_NativeEnumerated.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeEnumerated.per_constraints; + td->elements = asn_DEF_NativeEnumerated.elements; + td->elements_count = asn_DEF_NativeEnumerated.elements_count; + /* td->specifics = asn_DEF_NativeEnumerated.specifics; // Defined explicitly */ +} + +void +Enum1_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Enum1_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Enum1_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Enum1_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Enum1_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Enum1_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Enum1_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Enum1_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Enum1_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Enum1_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Enum1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Enum1_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +Enum1_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + Enum1_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [Enum1] >>> ***/ + +static asn_INTEGER_enum_map_t asn_MAP_Enum1_value2enum_1[] = { + { 0, 3, "one" }, + { 1, 3, "two" } +}; +static unsigned int asn_MAP_Enum1_enum2value_1[] = { + 0, /* one(0) */ + 1 /* two(1) */ +}; +static asn_INTEGER_specifics_t asn_SPC_Enum1_specs_1 = { + asn_MAP_Enum1_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_Enum1_enum2value_1, /* N => "tag"; sorted by N */ + 2, /* Number of elements in the maps */ + 0, /* Enumeration is not extensible */ + 1 /* Strict enumeration */ +}; +static ber_tlv_tag_t asn_DEF_Enum1_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +static asn_per_constraints_t asn_PER_Enum1_constr_1 = { + { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_Enum1 = { + "Enum1", + "Enum1", + Enum1_free, + Enum1_print, + Enum1_constraint, + Enum1_decode_ber, + Enum1_encode_der, + Enum1_decode_xer, + Enum1_encode_xer, + Enum1_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Enum1_tags_1, + sizeof(asn_DEF_Enum1_tags_1) + /sizeof(asn_DEF_Enum1_tags_1[0]), /* 1 */ + asn_DEF_Enum1_tags_1, /* Same as above */ + sizeof(asn_DEF_Enum1_tags_1) + /sizeof(asn_DEF_Enum1_tags_1[0]), /* 1 */ + &asn_PER_Enum1_constr_1, + 0, 0, /* Defined elsewhere */ + &asn_SPC_Enum1_specs_1 /* Additional specs */ +}; + + +/*** <<< INCLUDES [Identifier] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [Identifier] >>> ***/ + +typedef VisibleString_t Identifier_t; + +/*** <<< FUNC-DECLS [Identifier] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Identifier; +asn_struct_free_f Identifier_free; +asn_struct_print_f Identifier_print; +asn_constr_check_f Identifier_constraint; +ber_type_decoder_f Identifier_decode_ber; +der_type_encoder_f Identifier_encode_der; +xer_type_decoder_f Identifier_decode_xer; +xer_type_encoder_f Identifier_encode_xer; +per_type_decoder_f Identifier_decode_uper; + +/*** <<< CTABLES [Identifier] >>> ***/ + +static int permitted_alphabet_table_1[256] = { +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* */ +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, /* $ */ +1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, /* 0123456789 */ +0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ABCDEFGHIJKLMNO */ +1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1, /* PQRSTUVWXYZ _ */ +0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* abcdefghijklmno */ +1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, /* pqrstuvwxyz */ +}; + +static int check_permitted_alphabet_1(const void *sptr) { + int *table = permitted_alphabet_table_1; + /* The underlying type is VisibleString */ + const VisibleString_t *st = (const VisibleString_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!table[cv]) return -1; + } + return 0; +} + + +/*** <<< CODE [Identifier] >>> ***/ + +int +Identifier_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const VisibleString_t *st = (const VisibleString_t *)sptr; + size_t size; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size >= 1 && size <= 32) + && !check_permitted_alphabet_1(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using VisibleString, + * so here we adjust the DEF accordingly. + */ +static void +Identifier_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_VisibleString.free_struct; + td->print_struct = asn_DEF_VisibleString.print_struct; + td->ber_decoder = asn_DEF_VisibleString.ber_decoder; + td->der_encoder = asn_DEF_VisibleString.der_encoder; + td->xer_decoder = asn_DEF_VisibleString.xer_decoder; + td->xer_encoder = asn_DEF_VisibleString.xer_encoder; + td->uper_decoder = asn_DEF_VisibleString.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_VisibleString.per_constraints; + td->elements = asn_DEF_VisibleString.elements; + td->elements_count = asn_DEF_VisibleString.elements_count; + td->specifics = asn_DEF_VisibleString.specifics; +} + +void +Identifier_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Identifier_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Identifier_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Identifier_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Identifier_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Identifier_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Identifier_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Identifier_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Identifier_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Identifier_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Identifier_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Identifier_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +Identifier_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + Identifier_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [Identifier] >>> ***/ + +static ber_tlv_tag_t asn_DEF_Identifier_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)) +}; +static asn_per_constraints_t asn_PER_Identifier_constr_1 = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 5, 5, 1, 32 } /* (SIZE(1..32)) */ +}; +asn_TYPE_descriptor_t asn_DEF_Identifier = { + "Identifier", + "Identifier", + Identifier_free, + Identifier_print, + Identifier_constraint, + Identifier_decode_ber, + Identifier_encode_der, + Identifier_decode_xer, + Identifier_encode_xer, + Identifier_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Identifier_tags_1, + sizeof(asn_DEF_Identifier_tags_1) + /sizeof(asn_DEF_Identifier_tags_1[0]), /* 1 */ + asn_DEF_Identifier_tags_1, /* Same as above */ + sizeof(asn_DEF_Identifier_tags_1) + /sizeof(asn_DEF_Identifier_tags_1[0]), /* 1 */ + &asn_PER_Identifier_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/tests/59-choice-extended-OK.asn1.-P b/tests/59-choice-extended-OK.asn1.-P index 2590eab1f..ad44cdd7c 100644 --- a/tests/59-choice-extended-OK.asn1.-P +++ b/tests/59-choice-extended-OK.asn1.-P @@ -52,6 +52,8 @@ static asn_TYPE_member_t asn_MBR_Choice_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "a" }, { ATF_NOFLAGS, 0, offsetof(struct Choice, choice.b), @@ -59,6 +61,8 @@ static asn_TYPE_member_t asn_MBR_Choice_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "b" }, { ATF_POINTER, 0, offsetof(struct Choice, choice.c), @@ -66,25 +70,28 @@ static asn_TYPE_member_t asn_MBR_Choice_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Choice, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "c" }, }; -static ber_tlv_tag_t asn_DEF_Choice_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Choice_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (123 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Choice_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Choice_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* a at 15 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* b at 17 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* c at 19 */ }; -static asn_CHOICE_specifics_t asn_SPC_Choice_1_specs = { +static asn_CHOICE_specifics_t asn_SPC_Choice_specs_1 = { sizeof(struct Choice), offsetof(struct Choice, _asn_ctx), offsetof(struct Choice, present), sizeof(((struct Choice *)0)->present), - asn_MAP_Choice_1_tag2el, + asn_MAP_Choice_tag2el_1, 3, /* Count of tags in the map */ - 1 /* Whether extensible */ + .canonical_order = 0, + .ext_start = 1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_Choice = { "Choice", @@ -96,15 +103,17 @@ asn_TYPE_descriptor_t asn_DEF_Choice = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, - asn_DEF_Choice_1_tags, - sizeof(asn_DEF_Choice_1_tags) - /sizeof(asn_DEF_Choice_1_tags[0]), /* 1 */ - asn_DEF_Choice_1_tags, /* Same as above */ - sizeof(asn_DEF_Choice_1_tags) - /sizeof(asn_DEF_Choice_1_tags[0]), /* 1 */ + asn_DEF_Choice_tags_1, + sizeof(asn_DEF_Choice_tags_1) + /sizeof(asn_DEF_Choice_tags_1[0]), /* 1 */ + asn_DEF_Choice_tags_1, /* Same as above */ + sizeof(asn_DEF_Choice_tags_1) + /sizeof(asn_DEF_Choice_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Choice_1, 3, /* Elements count */ - &asn_SPC_Choice_1_specs /* Additional specs */ + &asn_SPC_Choice_specs_1 /* Additional specs */ }; diff --git a/tests/60-any-OK.asn1.-P b/tests/60-any-OK.asn1.-P index 4d2f7e872..d385a4e14 100644 --- a/tests/60-any-OK.asn1.-P +++ b/tests/60-any-OK.asn1.-P @@ -27,6 +27,8 @@ static asn_TYPE_member_t asn_MBR_T1_1[] = { .tag_mode = 0, .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "i" }, { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct T1, any), @@ -34,20 +36,23 @@ static asn_TYPE_member_t asn_MBR_T1_1[] = { .tag_mode = 0, .type = &asn_DEF_ANY, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "any" }, }; -static ber_tlv_tag_t asn_DEF_T1_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T1_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_T1_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_T1_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 } /* i at 15 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_T1_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_T1_specs_1 = { sizeof(struct T1), offsetof(struct T1, _asn_ctx), - asn_MAP_T1_1_tag2el, + asn_MAP_T1_tag2el_1, 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -61,16 +66,18 @@ asn_TYPE_descriptor_t asn_DEF_T1 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T1_1_tags, - sizeof(asn_DEF_T1_1_tags) - /sizeof(asn_DEF_T1_1_tags[0]), /* 1 */ - asn_DEF_T1_1_tags, /* Same as above */ - sizeof(asn_DEF_T1_1_tags) - /sizeof(asn_DEF_T1_1_tags[0]), /* 1 */ + asn_DEF_T1_tags_1, + sizeof(asn_DEF_T1_tags_1) + /sizeof(asn_DEF_T1_tags_1[0]), /* 1 */ + asn_DEF_T1_tags_1, /* Same as above */ + sizeof(asn_DEF_T1_tags_1) + /sizeof(asn_DEF_T1_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_T1_1, 2, /* Elements count */ - &asn_SPC_T1_1_specs /* Additional specs */ + &asn_SPC_T1_specs_1 /* Additional specs */ }; @@ -102,6 +109,8 @@ static asn_TYPE_member_t asn_MBR_T2_1[] = { .tag_mode = 0, .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "i" }, { ATF_POINTER, 1, offsetof(struct T2, any), @@ -109,21 +118,24 @@ static asn_TYPE_member_t asn_MBR_T2_1[] = { .tag_mode = +1, /* EXPLICIT tag at current level */ .type = &asn_DEF_ANY, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "any" }, }; -static ber_tlv_tag_t asn_DEF_T2_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T2_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_T2_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_T2_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 20 */ { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 } /* any at 21 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_T2_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_T2_specs_1 = { sizeof(struct T2), offsetof(struct T2, _asn_ctx), - asn_MAP_T2_1_tag2el, + asn_MAP_T2_tag2el_1, 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -137,16 +149,18 @@ asn_TYPE_descriptor_t asn_DEF_T2 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T2_1_tags, - sizeof(asn_DEF_T2_1_tags) - /sizeof(asn_DEF_T2_1_tags[0]), /* 1 */ - asn_DEF_T2_1_tags, /* Same as above */ - sizeof(asn_DEF_T2_1_tags) - /sizeof(asn_DEF_T2_1_tags[0]), /* 1 */ + asn_DEF_T2_tags_1, + sizeof(asn_DEF_T2_tags_1) + /sizeof(asn_DEF_T2_tags_1[0]), /* 1 */ + asn_DEF_T2_tags_1, /* Same as above */ + sizeof(asn_DEF_T2_tags_1) + /sizeof(asn_DEF_T2_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_T2_1, 2, /* Elements count */ - &asn_SPC_T2_1_specs /* Additional specs */ + &asn_SPC_T2_specs_1 /* Additional specs */ }; @@ -177,6 +191,8 @@ static asn_TYPE_member_t asn_MBR_T3_1[] = { .tag_mode = 0, .type = &asn_DEF_ANY, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "any1" }, { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct T3, any2), @@ -184,17 +200,20 @@ static asn_TYPE_member_t asn_MBR_T3_1[] = { .tag_mode = 0, .type = &asn_DEF_ANY, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "any2" }, }; -static ber_tlv_tag_t asn_DEF_T3_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T3_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_SEQUENCE_specifics_t asn_SPC_T3_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_T3_specs_1 = { sizeof(struct T3), offsetof(struct T3, _asn_ctx), 0, /* No top level tags */ 0, /* No tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -208,15 +227,17 @@ asn_TYPE_descriptor_t asn_DEF_T3 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T3_1_tags, - sizeof(asn_DEF_T3_1_tags) - /sizeof(asn_DEF_T3_1_tags[0]), /* 1 */ - asn_DEF_T3_1_tags, /* Same as above */ - sizeof(asn_DEF_T3_1_tags) - /sizeof(asn_DEF_T3_1_tags[0]), /* 1 */ + asn_DEF_T3_tags_1, + sizeof(asn_DEF_T3_tags_1) + /sizeof(asn_DEF_T3_tags_1[0]), /* 1 */ + asn_DEF_T3_tags_1, /* Same as above */ + sizeof(asn_DEF_T3_tags_1) + /sizeof(asn_DEF_T3_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_T3_1, 2, /* Elements count */ - &asn_SPC_T3_1_specs /* Additional specs */ + &asn_SPC_T3_specs_1 /* Additional specs */ }; diff --git a/tests/65-multi-tag-OK.asn1.-P b/tests/65-multi-tag-OK.asn1.-P index 25a449d07..f4b390779 100644 --- a/tests/65-multi-tag-OK.asn1.-P +++ b/tests/65-multi-tag-OK.asn1.-P @@ -40,6 +40,9 @@ T1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_T2.der_encoder; td->xer_decoder = asn_DEF_T2.xer_decoder; td->xer_encoder = asn_DEF_T2.xer_encoder; + td->uper_decoder = asn_DEF_T2.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_T2.per_constraints; td->elements = asn_DEF_T2.elements; td->elements_count = asn_DEF_T2.elements_count; td->specifics = asn_DEF_T2.specifics; @@ -92,13 +95,13 @@ T1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T1] >>> ***/ -static ber_tlv_tag_t asn_DEF_T1_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T1_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)) }; -static ber_tlv_tag_t asn_DEF_T1_1_all_tags[] = { +static ber_tlv_tag_t asn_DEF_T1_all_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), @@ -116,13 +119,15 @@ asn_TYPE_descriptor_t asn_DEF_T1 = { T1_encode_der, T1_decode_xer, T1_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T1_1_tags, - sizeof(asn_DEF_T1_1_tags) - /sizeof(asn_DEF_T1_1_tags[0]), /* 4 */ - asn_DEF_T1_1_all_tags, - sizeof(asn_DEF_T1_1_all_tags) - /sizeof(asn_DEF_T1_1_all_tags[0]), /* 6 */ + asn_DEF_T1_tags_1, + sizeof(asn_DEF_T1_tags_1) + /sizeof(asn_DEF_T1_tags_1[0]), /* 4 */ + asn_DEF_T1_all_tags_1, + sizeof(asn_DEF_T1_all_tags_1) + /sizeof(asn_DEF_T1_all_tags_1[0]), /* 6 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -169,6 +174,9 @@ T2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_T3.der_encoder; td->xer_decoder = asn_DEF_T3.xer_decoder; td->xer_encoder = asn_DEF_T3.xer_encoder; + td->uper_decoder = asn_DEF_T3.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_T3.per_constraints; td->elements = asn_DEF_T3.elements; td->elements_count = asn_DEF_T3.elements_count; td->specifics = asn_DEF_T3.specifics; @@ -221,12 +229,12 @@ T2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T2] >>> ***/ -static ber_tlv_tag_t asn_DEF_T2_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T2_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)) }; -static ber_tlv_tag_t asn_DEF_T2_1_all_tags[] = { +static ber_tlv_tag_t asn_DEF_T2_all_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), @@ -243,13 +251,15 @@ asn_TYPE_descriptor_t asn_DEF_T2 = { T2_encode_der, T2_decode_xer, T2_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T2_1_tags, - sizeof(asn_DEF_T2_1_tags) - /sizeof(asn_DEF_T2_1_tags[0]), /* 3 */ - asn_DEF_T2_1_all_tags, - sizeof(asn_DEF_T2_1_all_tags) - /sizeof(asn_DEF_T2_1_all_tags[0]), /* 5 */ + asn_DEF_T2_tags_1, + sizeof(asn_DEF_T2_tags_1) + /sizeof(asn_DEF_T2_tags_1[0]), /* 3 */ + asn_DEF_T2_all_tags_1, + sizeof(asn_DEF_T2_all_tags_1) + /sizeof(asn_DEF_T2_all_tags_1[0]), /* 5 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -296,6 +306,9 @@ T3_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_T4.der_encoder; td->xer_decoder = asn_DEF_T4.xer_decoder; td->xer_encoder = asn_DEF_T4.xer_encoder; + td->uper_decoder = asn_DEF_T4.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_T4.per_constraints; td->elements = asn_DEF_T4.elements; td->elements_count = asn_DEF_T4.elements_count; td->specifics = asn_DEF_T4.specifics; @@ -348,11 +361,11 @@ T3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T3] >>> ***/ -static ber_tlv_tag_t asn_DEF_T3_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T3_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)) }; -static ber_tlv_tag_t asn_DEF_T3_1_all_tags[] = { +static ber_tlv_tag_t asn_DEF_T3_all_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), @@ -368,13 +381,15 @@ asn_TYPE_descriptor_t asn_DEF_T3 = { T3_encode_der, T3_decode_xer, T3_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T3_1_tags, - sizeof(asn_DEF_T3_1_tags) - /sizeof(asn_DEF_T3_1_tags[0]), /* 2 */ - asn_DEF_T3_1_all_tags, - sizeof(asn_DEF_T3_1_all_tags) - /sizeof(asn_DEF_T3_1_all_tags[0]), /* 4 */ + asn_DEF_T3_tags_1, + sizeof(asn_DEF_T3_tags_1) + /sizeof(asn_DEF_T3_tags_1[0]), /* 2 */ + asn_DEF_T3_all_tags_1, + sizeof(asn_DEF_T3_all_tags_1) + /sizeof(asn_DEF_T3_all_tags_1[0]), /* 4 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -421,6 +436,9 @@ T4_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_T5.der_encoder; td->xer_decoder = asn_DEF_T5.xer_decoder; td->xer_encoder = asn_DEF_T5.xer_encoder; + td->uper_decoder = asn_DEF_T5.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_T5.per_constraints; td->elements = asn_DEF_T5.elements; td->elements_count = asn_DEF_T5.elements_count; td->specifics = asn_DEF_T5.specifics; @@ -473,7 +491,7 @@ T4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T4] >>> ***/ -static ber_tlv_tag_t asn_DEF_T4_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T4_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) @@ -488,13 +506,15 @@ asn_TYPE_descriptor_t asn_DEF_T4 = { T4_encode_der, T4_decode_xer, T4_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T4_1_tags, - sizeof(asn_DEF_T4_1_tags) - /sizeof(asn_DEF_T4_1_tags[0]) - 1, /* 2 */ - asn_DEF_T4_1_tags, /* Same as above */ - sizeof(asn_DEF_T4_1_tags) - /sizeof(asn_DEF_T4_1_tags[0]), /* 3 */ + asn_DEF_T4_tags_1, + sizeof(asn_DEF_T4_tags_1) + /sizeof(asn_DEF_T4_tags_1[0]) - 1, /* 2 */ + asn_DEF_T4_tags_1, /* Same as above */ + sizeof(asn_DEF_T4_tags_1) + /sizeof(asn_DEF_T4_tags_1[0]), /* 3 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -541,6 +561,9 @@ T5_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_T6.der_encoder; td->xer_decoder = asn_DEF_T6.xer_decoder; td->xer_encoder = asn_DEF_T6.xer_encoder; + td->uper_decoder = asn_DEF_T6.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_T6.per_constraints; td->elements = asn_DEF_T6.elements; td->elements_count = asn_DEF_T6.elements_count; td->specifics = asn_DEF_T6.specifics; @@ -593,7 +616,7 @@ T5_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T5] >>> ***/ -static ber_tlv_tag_t asn_DEF_T5_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T5_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; @@ -607,13 +630,15 @@ asn_TYPE_descriptor_t asn_DEF_T5 = { T5_encode_der, T5_decode_xer, T5_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T5_1_tags, - sizeof(asn_DEF_T5_1_tags) - /sizeof(asn_DEF_T5_1_tags[0]) - 1, /* 1 */ - asn_DEF_T5_1_tags, /* Same as above */ - sizeof(asn_DEF_T5_1_tags) - /sizeof(asn_DEF_T5_1_tags[0]), /* 2 */ + asn_DEF_T5_tags_1, + sizeof(asn_DEF_T5_tags_1) + /sizeof(asn_DEF_T5_tags_1[0]) - 1, /* 1 */ + asn_DEF_T5_tags_1, /* Same as above */ + sizeof(asn_DEF_T5_tags_1) + /sizeof(asn_DEF_T5_tags_1[0]), /* 2 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -660,6 +685,9 @@ T6_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_REAL.der_encoder; td->xer_decoder = asn_DEF_REAL.xer_decoder; td->xer_encoder = asn_DEF_REAL.xer_encoder; + td->uper_decoder = asn_DEF_REAL.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_REAL.per_constraints; td->elements = asn_DEF_REAL.elements; td->elements_count = asn_DEF_REAL.elements_count; td->specifics = asn_DEF_REAL.specifics; @@ -712,7 +740,7 @@ T6_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T6] >>> ***/ -static ber_tlv_tag_t asn_DEF_T6_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T6_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; asn_TYPE_descriptor_t asn_DEF_T6 = { @@ -725,13 +753,15 @@ asn_TYPE_descriptor_t asn_DEF_T6 = { T6_encode_der, T6_decode_xer, T6_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T6_1_tags, - sizeof(asn_DEF_T6_1_tags) - /sizeof(asn_DEF_T6_1_tags[0]), /* 1 */ - asn_DEF_T6_1_tags, /* Same as above */ - sizeof(asn_DEF_T6_1_tags) - /sizeof(asn_DEF_T6_1_tags[0]), /* 1 */ + asn_DEF_T6_tags_1, + sizeof(asn_DEF_T6_tags_1) + /sizeof(asn_DEF_T6_tags_1[0]), /* 1 */ + asn_DEF_T6_tags_1, /* Same as above */ + sizeof(asn_DEF_T6_tags_1) + /sizeof(asn_DEF_T6_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -778,6 +808,9 @@ T_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_Ts.der_encoder; td->xer_decoder = asn_DEF_Ts.xer_decoder; td->xer_encoder = asn_DEF_Ts.xer_encoder; + td->uper_decoder = asn_DEF_Ts.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Ts.per_constraints; td->elements = asn_DEF_Ts.elements; td->elements_count = asn_DEF_Ts.elements_count; td->specifics = asn_DEF_Ts.specifics; @@ -830,7 +863,7 @@ T_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T] >>> ***/ -static ber_tlv_tag_t asn_DEF_T_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), (ASN_TAG_CLASS_CONTEXT | (123 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) @@ -845,13 +878,15 @@ asn_TYPE_descriptor_t asn_DEF_T = { T_encode_der, T_decode_xer, T_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T_1_tags, - sizeof(asn_DEF_T_1_tags) - /sizeof(asn_DEF_T_1_tags[0]) - 2, /* 1 */ - asn_DEF_T_1_tags, /* Same as above */ - sizeof(asn_DEF_T_1_tags) - /sizeof(asn_DEF_T_1_tags[0]), /* 3 */ + asn_DEF_T_tags_1, + sizeof(asn_DEF_T_tags_1) + /sizeof(asn_DEF_T_tags_1[0]) - 2, /* 1 */ + asn_DEF_T_tags_1, /* Same as above */ + sizeof(asn_DEF_T_tags_1) + /sizeof(asn_DEF_T_tags_1[0]), /* 3 */ + 0, /* No PER visible constraints */ 0, 0, /* Defined elsewhere */ 0 /* No specifics */ }; @@ -886,6 +921,8 @@ static asn_TYPE_member_t asn_MBR_Ts_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_T2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m1" }, { ATF_POINTER, 1, offsetof(struct Ts, m2), @@ -893,6 +930,8 @@ static asn_TYPE_member_t asn_MBR_Ts_1[] = { .tag_mode = +1, /* EXPLICIT tag at current level */ .type = &asn_DEF_T3, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m2" }, { ATF_NOFLAGS, 0, offsetof(struct Ts, m3), @@ -900,23 +939,26 @@ static asn_TYPE_member_t asn_MBR_Ts_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_T3, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m3" }, }; -static ber_tlv_tag_t asn_DEF_Ts_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Ts_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (123 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Ts_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Ts_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* m1 at 24 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* m2 at 25 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 } /* m3 at 27 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Ts_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Ts_specs_1 = { sizeof(struct Ts), offsetof(struct Ts, _asn_ctx), - asn_MAP_Ts_1_tag2el, + asn_MAP_Ts_tag2el_1, 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -930,15 +972,17 @@ asn_TYPE_descriptor_t asn_DEF_Ts = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Ts_1_tags, - sizeof(asn_DEF_Ts_1_tags) - /sizeof(asn_DEF_Ts_1_tags[0]) - 1, /* 1 */ - asn_DEF_Ts_1_tags, /* Same as above */ - sizeof(asn_DEF_Ts_1_tags) - /sizeof(asn_DEF_Ts_1_tags[0]), /* 2 */ + asn_DEF_Ts_tags_1, + sizeof(asn_DEF_Ts_tags_1) + /sizeof(asn_DEF_Ts_tags_1[0]) - 1, /* 1 */ + asn_DEF_Ts_tags_1, /* Same as above */ + sizeof(asn_DEF_Ts_tags_1) + /sizeof(asn_DEF_Ts_tags_1[0]), /* 2 */ + 0, /* No PER visible constraints */ asn_MBR_Ts_1, 3, /* Elements count */ - &asn_SPC_Ts_1_specs /* Additional specs */ + &asn_SPC_Ts_specs_1 /* Additional specs */ }; diff --git a/tests/65-multi-tag-OK.asn1.-Pfnative-types b/tests/65-multi-tag-OK.asn1.-Pfnative-types index 04a044e99..fd5b46fbf 100644 --- a/tests/65-multi-tag-OK.asn1.-Pfnative-types +++ b/tests/65-multi-tag-OK.asn1.-Pfnative-types @@ -40,6 +40,9 @@ T1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_T2.der_encoder; td->xer_decoder = asn_DEF_T2.xer_decoder; td->xer_encoder = asn_DEF_T2.xer_encoder; + td->uper_decoder = asn_DEF_T2.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_T2.per_constraints; td->elements = asn_DEF_T2.elements; td->elements_count = asn_DEF_T2.elements_count; td->specifics = asn_DEF_T2.specifics; @@ -92,13 +95,13 @@ T1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T1] >>> ***/ -static ber_tlv_tag_t asn_DEF_T1_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T1_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)) }; -static ber_tlv_tag_t asn_DEF_T1_1_all_tags[] = { +static ber_tlv_tag_t asn_DEF_T1_all_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), @@ -116,13 +119,15 @@ asn_TYPE_descriptor_t asn_DEF_T1 = { T1_encode_der, T1_decode_xer, T1_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T1_1_tags, - sizeof(asn_DEF_T1_1_tags) - /sizeof(asn_DEF_T1_1_tags[0]), /* 4 */ - asn_DEF_T1_1_all_tags, - sizeof(asn_DEF_T1_1_all_tags) - /sizeof(asn_DEF_T1_1_all_tags[0]), /* 6 */ + asn_DEF_T1_tags_1, + sizeof(asn_DEF_T1_tags_1) + /sizeof(asn_DEF_T1_tags_1[0]), /* 4 */ + asn_DEF_T1_all_tags_1, + sizeof(asn_DEF_T1_all_tags_1) + /sizeof(asn_DEF_T1_all_tags_1[0]), /* 6 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -169,6 +174,9 @@ T2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_T3.der_encoder; td->xer_decoder = asn_DEF_T3.xer_decoder; td->xer_encoder = asn_DEF_T3.xer_encoder; + td->uper_decoder = asn_DEF_T3.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_T3.per_constraints; td->elements = asn_DEF_T3.elements; td->elements_count = asn_DEF_T3.elements_count; td->specifics = asn_DEF_T3.specifics; @@ -221,12 +229,12 @@ T2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T2] >>> ***/ -static ber_tlv_tag_t asn_DEF_T2_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T2_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)) }; -static ber_tlv_tag_t asn_DEF_T2_1_all_tags[] = { +static ber_tlv_tag_t asn_DEF_T2_all_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), @@ -243,13 +251,15 @@ asn_TYPE_descriptor_t asn_DEF_T2 = { T2_encode_der, T2_decode_xer, T2_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T2_1_tags, - sizeof(asn_DEF_T2_1_tags) - /sizeof(asn_DEF_T2_1_tags[0]), /* 3 */ - asn_DEF_T2_1_all_tags, - sizeof(asn_DEF_T2_1_all_tags) - /sizeof(asn_DEF_T2_1_all_tags[0]), /* 5 */ + asn_DEF_T2_tags_1, + sizeof(asn_DEF_T2_tags_1) + /sizeof(asn_DEF_T2_tags_1[0]), /* 3 */ + asn_DEF_T2_all_tags_1, + sizeof(asn_DEF_T2_all_tags_1) + /sizeof(asn_DEF_T2_all_tags_1[0]), /* 5 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -296,6 +306,9 @@ T3_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_T4.der_encoder; td->xer_decoder = asn_DEF_T4.xer_decoder; td->xer_encoder = asn_DEF_T4.xer_encoder; + td->uper_decoder = asn_DEF_T4.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_T4.per_constraints; td->elements = asn_DEF_T4.elements; td->elements_count = asn_DEF_T4.elements_count; td->specifics = asn_DEF_T4.specifics; @@ -348,11 +361,11 @@ T3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T3] >>> ***/ -static ber_tlv_tag_t asn_DEF_T3_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T3_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)) }; -static ber_tlv_tag_t asn_DEF_T3_1_all_tags[] = { +static ber_tlv_tag_t asn_DEF_T3_all_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), @@ -368,13 +381,15 @@ asn_TYPE_descriptor_t asn_DEF_T3 = { T3_encode_der, T3_decode_xer, T3_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T3_1_tags, - sizeof(asn_DEF_T3_1_tags) - /sizeof(asn_DEF_T3_1_tags[0]), /* 2 */ - asn_DEF_T3_1_all_tags, - sizeof(asn_DEF_T3_1_all_tags) - /sizeof(asn_DEF_T3_1_all_tags[0]), /* 4 */ + asn_DEF_T3_tags_1, + sizeof(asn_DEF_T3_tags_1) + /sizeof(asn_DEF_T3_tags_1[0]), /* 2 */ + asn_DEF_T3_all_tags_1, + sizeof(asn_DEF_T3_all_tags_1) + /sizeof(asn_DEF_T3_all_tags_1[0]), /* 4 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -421,6 +436,9 @@ T4_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_T5.der_encoder; td->xer_decoder = asn_DEF_T5.xer_decoder; td->xer_encoder = asn_DEF_T5.xer_encoder; + td->uper_decoder = asn_DEF_T5.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_T5.per_constraints; td->elements = asn_DEF_T5.elements; td->elements_count = asn_DEF_T5.elements_count; td->specifics = asn_DEF_T5.specifics; @@ -473,7 +491,7 @@ T4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T4] >>> ***/ -static ber_tlv_tag_t asn_DEF_T4_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T4_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) @@ -488,13 +506,15 @@ asn_TYPE_descriptor_t asn_DEF_T4 = { T4_encode_der, T4_decode_xer, T4_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T4_1_tags, - sizeof(asn_DEF_T4_1_tags) - /sizeof(asn_DEF_T4_1_tags[0]) - 1, /* 2 */ - asn_DEF_T4_1_tags, /* Same as above */ - sizeof(asn_DEF_T4_1_tags) - /sizeof(asn_DEF_T4_1_tags[0]), /* 3 */ + asn_DEF_T4_tags_1, + sizeof(asn_DEF_T4_tags_1) + /sizeof(asn_DEF_T4_tags_1[0]) - 1, /* 2 */ + asn_DEF_T4_tags_1, /* Same as above */ + sizeof(asn_DEF_T4_tags_1) + /sizeof(asn_DEF_T4_tags_1[0]), /* 3 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -541,6 +561,9 @@ T5_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_T6.der_encoder; td->xer_decoder = asn_DEF_T6.xer_decoder; td->xer_encoder = asn_DEF_T6.xer_encoder; + td->uper_decoder = asn_DEF_T6.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_T6.per_constraints; td->elements = asn_DEF_T6.elements; td->elements_count = asn_DEF_T6.elements_count; td->specifics = asn_DEF_T6.specifics; @@ -593,7 +616,7 @@ T5_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T5] >>> ***/ -static ber_tlv_tag_t asn_DEF_T5_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T5_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; @@ -607,13 +630,15 @@ asn_TYPE_descriptor_t asn_DEF_T5 = { T5_encode_der, T5_decode_xer, T5_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T5_1_tags, - sizeof(asn_DEF_T5_1_tags) - /sizeof(asn_DEF_T5_1_tags[0]) - 1, /* 1 */ - asn_DEF_T5_1_tags, /* Same as above */ - sizeof(asn_DEF_T5_1_tags) - /sizeof(asn_DEF_T5_1_tags[0]), /* 2 */ + asn_DEF_T5_tags_1, + sizeof(asn_DEF_T5_tags_1) + /sizeof(asn_DEF_T5_tags_1[0]) - 1, /* 1 */ + asn_DEF_T5_tags_1, /* Same as above */ + sizeof(asn_DEF_T5_tags_1) + /sizeof(asn_DEF_T5_tags_1[0]), /* 2 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -660,6 +685,9 @@ T6_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_NativeReal.der_encoder; td->xer_decoder = asn_DEF_NativeReal.xer_decoder; td->xer_encoder = asn_DEF_NativeReal.xer_encoder; + td->uper_decoder = asn_DEF_NativeReal.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeReal.per_constraints; td->elements = asn_DEF_NativeReal.elements; td->elements_count = asn_DEF_NativeReal.elements_count; td->specifics = asn_DEF_NativeReal.specifics; @@ -712,7 +740,7 @@ T6_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T6] >>> ***/ -static ber_tlv_tag_t asn_DEF_T6_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T6_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)) }; asn_TYPE_descriptor_t asn_DEF_T6 = { @@ -725,13 +753,15 @@ asn_TYPE_descriptor_t asn_DEF_T6 = { T6_encode_der, T6_decode_xer, T6_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T6_1_tags, - sizeof(asn_DEF_T6_1_tags) - /sizeof(asn_DEF_T6_1_tags[0]), /* 1 */ - asn_DEF_T6_1_tags, /* Same as above */ - sizeof(asn_DEF_T6_1_tags) - /sizeof(asn_DEF_T6_1_tags[0]), /* 1 */ + asn_DEF_T6_tags_1, + sizeof(asn_DEF_T6_tags_1) + /sizeof(asn_DEF_T6_tags_1[0]), /* 1 */ + asn_DEF_T6_tags_1, /* Same as above */ + sizeof(asn_DEF_T6_tags_1) + /sizeof(asn_DEF_T6_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -778,6 +808,9 @@ T_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_Ts.der_encoder; td->xer_decoder = asn_DEF_Ts.xer_decoder; td->xer_encoder = asn_DEF_Ts.xer_encoder; + td->uper_decoder = asn_DEF_Ts.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Ts.per_constraints; td->elements = asn_DEF_Ts.elements; td->elements_count = asn_DEF_Ts.elements_count; td->specifics = asn_DEF_Ts.specifics; @@ -830,7 +863,7 @@ T_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T] >>> ***/ -static ber_tlv_tag_t asn_DEF_T_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), (ASN_TAG_CLASS_CONTEXT | (123 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) @@ -845,13 +878,15 @@ asn_TYPE_descriptor_t asn_DEF_T = { T_encode_der, T_decode_xer, T_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T_1_tags, - sizeof(asn_DEF_T_1_tags) - /sizeof(asn_DEF_T_1_tags[0]) - 2, /* 1 */ - asn_DEF_T_1_tags, /* Same as above */ - sizeof(asn_DEF_T_1_tags) - /sizeof(asn_DEF_T_1_tags[0]), /* 3 */ + asn_DEF_T_tags_1, + sizeof(asn_DEF_T_tags_1) + /sizeof(asn_DEF_T_tags_1[0]) - 2, /* 1 */ + asn_DEF_T_tags_1, /* Same as above */ + sizeof(asn_DEF_T_tags_1) + /sizeof(asn_DEF_T_tags_1[0]), /* 3 */ + 0, /* No PER visible constraints */ 0, 0, /* Defined elsewhere */ 0 /* No specifics */ }; @@ -886,6 +921,8 @@ static asn_TYPE_member_t asn_MBR_Ts_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_T2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m1" }, { ATF_POINTER, 1, offsetof(struct Ts, m2), @@ -893,6 +930,8 @@ static asn_TYPE_member_t asn_MBR_Ts_1[] = { .tag_mode = +1, /* EXPLICIT tag at current level */ .type = &asn_DEF_T3, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m2" }, { ATF_NOFLAGS, 0, offsetof(struct Ts, m3), @@ -900,23 +939,26 @@ static asn_TYPE_member_t asn_MBR_Ts_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_T3, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m3" }, }; -static ber_tlv_tag_t asn_DEF_Ts_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Ts_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (123 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Ts_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Ts_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* m1 at 24 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* m2 at 25 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 } /* m3 at 27 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Ts_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Ts_specs_1 = { sizeof(struct Ts), offsetof(struct Ts, _asn_ctx), - asn_MAP_Ts_1_tag2el, + asn_MAP_Ts_tag2el_1, 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -930,15 +972,17 @@ asn_TYPE_descriptor_t asn_DEF_Ts = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Ts_1_tags, - sizeof(asn_DEF_Ts_1_tags) - /sizeof(asn_DEF_Ts_1_tags[0]) - 1, /* 1 */ - asn_DEF_Ts_1_tags, /* Same as above */ - sizeof(asn_DEF_Ts_1_tags) - /sizeof(asn_DEF_Ts_1_tags[0]), /* 2 */ + asn_DEF_Ts_tags_1, + sizeof(asn_DEF_Ts_tags_1) + /sizeof(asn_DEF_Ts_tags_1[0]) - 1, /* 1 */ + asn_DEF_Ts_tags_1, /* Same as above */ + sizeof(asn_DEF_Ts_tags_1) + /sizeof(asn_DEF_Ts_tags_1[0]), /* 2 */ + 0, /* No PER visible constraints */ asn_MBR_Ts_1, 3, /* Elements count */ - &asn_SPC_Ts_1_specs /* Additional specs */ + &asn_SPC_Ts_specs_1 /* Additional specs */ }; diff --git a/tests/66-ref-simple-OK.asn1.-P b/tests/66-ref-simple-OK.asn1.-P index 121e6c869..1e6f4ed81 100644 --- a/tests/66-ref-simple-OK.asn1.-P +++ b/tests/66-ref-simple-OK.asn1.-P @@ -26,13 +26,15 @@ static asn_TYPE_member_t asn_MBR_T_1[] = { .tag_mode = 0, .type = &asn_DEF_SimpleType, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "named" }, }; -static ber_tlv_tag_t asn_DEF_T_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_T_1_specs = { +static asn_SET_OF_specifics_t asn_SPC_T_specs_1 = { sizeof(struct T), offsetof(struct T, _asn_ctx), 1, /* XER encoding is XMLValueList */ @@ -47,16 +49,18 @@ asn_TYPE_descriptor_t asn_DEF_T = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T_1_tags, - sizeof(asn_DEF_T_1_tags) - /sizeof(asn_DEF_T_1_tags[0]), /* 1 */ - asn_DEF_T_1_tags, /* Same as above */ - sizeof(asn_DEF_T_1_tags) - /sizeof(asn_DEF_T_1_tags[0]), /* 1 */ + asn_DEF_T_tags_1, + sizeof(asn_DEF_T_tags_1) + /sizeof(asn_DEF_T_tags_1[0]), /* 1 */ + asn_DEF_T_tags_1, /* Same as above */ + sizeof(asn_DEF_T_tags_1) + /sizeof(asn_DEF_T_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_T_1, 1, /* Single element */ - &asn_SPC_T_1_specs /* Additional specs */ + &asn_SPC_T_specs_1 /* Additional specs */ }; @@ -109,6 +113,9 @@ SimpleType_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; + td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ @@ -161,24 +168,24 @@ SimpleType_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [SimpleType] >>> ***/ -static asn_INTEGER_enum_map_t asn_MAP_SimpleType_1_value2enum[] = { +static asn_INTEGER_enum_map_t asn_MAP_SimpleType_value2enum_1[] = { { 0, 3, "one" }, { 1, 3, "two" }, { 2, 5, "three" } }; -static unsigned int asn_MAP_SimpleType_1_enum2value[] = { +static unsigned int asn_MAP_SimpleType_enum2value_1[] = { 0, /* one(0) */ 2, /* three(2) */ 1 /* two(1) */ }; -static asn_INTEGER_specifics_t asn_SPC_SimpleType_1_specs = { - asn_MAP_SimpleType_1_value2enum, /* "tag" => N; sorted by tag */ - asn_MAP_SimpleType_1_enum2value, /* N => "tag"; sorted by N */ +static asn_INTEGER_specifics_t asn_SPC_SimpleType_specs_1 = { + asn_MAP_SimpleType_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_SimpleType_enum2value_1, /* N => "tag"; sorted by N */ 3, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ 1 /* Strict enumeration */ }; -static ber_tlv_tag_t asn_DEF_SimpleType_1_tags[] = { +static ber_tlv_tag_t asn_DEF_SimpleType_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_SimpleType = { @@ -191,14 +198,16 @@ asn_TYPE_descriptor_t asn_DEF_SimpleType = { SimpleType_encode_der, SimpleType_decode_xer, SimpleType_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_SimpleType_1_tags, - sizeof(asn_DEF_SimpleType_1_tags) - /sizeof(asn_DEF_SimpleType_1_tags[0]), /* 1 */ - asn_DEF_SimpleType_1_tags, /* Same as above */ - sizeof(asn_DEF_SimpleType_1_tags) - /sizeof(asn_DEF_SimpleType_1_tags[0]), /* 1 */ + asn_DEF_SimpleType_tags_1, + sizeof(asn_DEF_SimpleType_tags_1) + /sizeof(asn_DEF_SimpleType_tags_1[0]), /* 1 */ + asn_DEF_SimpleType_tags_1, /* Same as above */ + sizeof(asn_DEF_SimpleType_tags_1) + /sizeof(asn_DEF_SimpleType_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* Defined elsewhere */ - &asn_SPC_SimpleType_1_specs /* Additional specs */ + &asn_SPC_SimpleType_specs_1 /* Additional specs */ }; diff --git a/tests/69-reserved-words-OK.asn1.-P b/tests/69-reserved-words-OK.asn1.-P index d7582cd16..897295d79 100644 --- a/tests/69-reserved-words-OK.asn1.-P +++ b/tests/69-reserved-words-OK.asn1.-P @@ -47,7 +47,7 @@ extern asn_TYPE_descriptor_t asn_DEF_T; /*** <<< CODE [T] >>> ***/ static int -memb_char_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, +memb_char_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; size_t size; @@ -75,22 +75,22 @@ memb_char_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, /*** <<< STAT-DEFS [T] >>> ***/ -static ber_tlv_tag_t asn_DEF_class_4_tags[] = { +static ber_tlv_tag_t asn_DEF_class_tags_4[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static uint8_t asn_MAP_class_4_mmap[(0 + (8 * sizeof(unsigned int)) - 1) / 8] = { +static uint8_t asn_MAP_class_mmap_4[(0 + (8 * sizeof(unsigned int)) - 1) / 8] = { 0 }; -static asn_SET_specifics_t asn_SPC_class_4_specs = { +static asn_SET_specifics_t asn_SPC_class_specs_4 = { sizeof(struct Class), offsetof(struct Class, _asn_ctx), offsetof(struct Class, _presence_map), - asn_MAP_class_4_tag2el, + asn_MAP_class_tag2el_4, 0, /* Count of tags in the map */ - asn_MAP_class_4_tag2el, /* Same as above */ + asn_MAP_class_tag2el_4, /* Same as above */ 0, /* Count of tags in the CXER map */ 1, /* Whether extensible */ - (unsigned int *)asn_MAP_class_4_mmap /* Mandatory elements map */ + (unsigned int *)asn_MAP_class_mmap_4 /* Mandatory elements map */ }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_class_4 = { @@ -103,15 +103,17 @@ asn_TYPE_descriptor_t asn_DEF_class_4 = { SET_encode_der, SET_decode_xer, SET_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_class_4_tags, - sizeof(asn_DEF_class_4_tags) - /sizeof(asn_DEF_class_4_tags[0]), /* 1 */ - asn_DEF_class_4_tags, /* Same as above */ - sizeof(asn_DEF_class_4_tags) - /sizeof(asn_DEF_class_4_tags[0]), /* 1 */ + asn_DEF_class_tags_4, + sizeof(asn_DEF_class_tags_4) + /sizeof(asn_DEF_class_tags_4[0]), /* 1 */ + asn_DEF_class_tags_4, /* Same as above */ + sizeof(asn_DEF_class_tags_4) + /sizeof(asn_DEF_class_tags_4[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ - &asn_SPC_class_4_specs /* Additional specs */ + &asn_SPC_class_specs_4 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_T_1[] = { @@ -120,13 +122,17 @@ static asn_TYPE_member_t asn_MBR_T_1[] = { .tag_mode = 0, .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "int" }, { ATF_NOFLAGS, 0, offsetof(struct T, Char), .tag = (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), .tag_mode = 0, .type = &asn_DEF_OCTET_STRING, - .memb_constraints = memb_char_1_constraint, + .memb_constraints = memb_char_constraint_1, + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "char" }, { ATF_NOFLAGS, 0, offsetof(struct T, Class), @@ -134,6 +140,8 @@ static asn_TYPE_member_t asn_MBR_T_1[] = { .tag_mode = 0, .type = &asn_DEF_class_4, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "class" }, { ATF_NOFLAGS, 0, offsetof(struct T, Double), @@ -141,23 +149,26 @@ static asn_TYPE_member_t asn_MBR_T_1[] = { .tag_mode = 0, .type = &asn_DEF_REAL, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "double" }, }; -static ber_tlv_tag_t asn_DEF_T_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_T_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_T_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* int at 15 */ { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 1, 0, 0 }, /* char at 16 */ { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)), 3, 0, 0 }, /* double at 18 */ { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 2, 0, 0 } /* class at 17 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_T_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_T_specs_1 = { sizeof(struct T), offsetof(struct T, _asn_ctx), - asn_MAP_T_1_tag2el, + asn_MAP_T_tag2el_1, 4, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -171,15 +182,17 @@ asn_TYPE_descriptor_t asn_DEF_T = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T_1_tags, - sizeof(asn_DEF_T_1_tags) - /sizeof(asn_DEF_T_1_tags[0]), /* 1 */ - asn_DEF_T_1_tags, /* Same as above */ - sizeof(asn_DEF_T_1_tags) - /sizeof(asn_DEF_T_1_tags[0]), /* 1 */ + asn_DEF_T_tags_1, + sizeof(asn_DEF_T_tags_1) + /sizeof(asn_DEF_T_tags_1[0]), /* 1 */ + asn_DEF_T_tags_1, /* Same as above */ + sizeof(asn_DEF_T_tags_1) + /sizeof(asn_DEF_T_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_T_1, 4, /* Elements count */ - &asn_SPC_T_1_specs /* Additional specs */ + &asn_SPC_T_specs_1 /* Additional specs */ }; diff --git a/tests/70-xer-test-OK.asn1.-P b/tests/70-xer-test-OK.asn1.-P index 72483fd65..45d6a6997 100644 --- a/tests/70-xer-test-OK.asn1.-P +++ b/tests/70-xer-test-OK.asn1.-P @@ -82,6 +82,8 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Sequence, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "sequence" }, { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.set), @@ -89,6 +91,8 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Set, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "set" }, { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.sequenceOf), @@ -96,6 +100,8 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_SequenceOf, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "sequenceOf" }, { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.extensibleSet), @@ -103,6 +109,8 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_ExtensibleSet, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "extensibleSet" }, { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.extensibleSequence), @@ -110,6 +118,8 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_ExtensibleSequence, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "extensibleSequence" }, { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.extensibleSequence2), @@ -117,6 +127,8 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_ExtensibleSequence2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "extensibleSequence2" }, { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.setOfNULL), @@ -124,6 +136,8 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_SetOfNULL, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "setOfNULL" }, { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.setOfREAL), @@ -131,6 +145,8 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_SetOfREAL, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "setOfREAL" }, { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.setOfEnums), @@ -138,6 +154,8 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_SetOfEnums, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "setOfEnums" }, { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.namedSetOfNULL), @@ -145,6 +163,8 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_NamedSetOfNULL, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "namedSetOfNULL" }, { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.namedSetOfREAL), @@ -152,6 +172,8 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_NamedSetOfREAL, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "namedSetOfREAL" }, { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.namedSetOfEnums), @@ -159,6 +181,8 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_NamedSetOfEnums, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "namedSetOfEnums" }, { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.seqOfZuka), @@ -166,6 +190,8 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_SeqOfZuka, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "seqOfZuka" }, { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.setOfChoice), @@ -173,6 +199,8 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_SetOfChoice, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "setOfChoice" }, { ATF_NOFLAGS, 0, offsetof(struct PDU, choice.namedSetOfChoice), @@ -180,10 +208,12 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_NamedSetOfChoice, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "namedSetOfChoice" }, }; -static asn_TYPE_tag2member_t asn_MAP_PDU_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_PDU_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* sequence at 19 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* set at 20 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* sequenceOf at 21 */ @@ -200,14 +230,15 @@ static asn_TYPE_tag2member_t asn_MAP_PDU_1_tag2el[] = { { (ASN_TAG_CLASS_CONTEXT | (13 << 2)), 13, 0, 0 }, /* setOfChoice at 32 */ { (ASN_TAG_CLASS_CONTEXT | (14 << 2)), 14, 0, 0 } /* namedSetOfChoice at 33 */ }; -static asn_CHOICE_specifics_t asn_SPC_PDU_1_specs = { +static asn_CHOICE_specifics_t asn_SPC_PDU_specs_1 = { sizeof(struct PDU), offsetof(struct PDU, _asn_ctx), offsetof(struct PDU, present), sizeof(((struct PDU *)0)->present), - asn_MAP_PDU_1_tag2el, + asn_MAP_PDU_tag2el_1, 15, /* Count of tags in the map */ - 1 /* Whether extensible */ + .canonical_order = 0, + .ext_start = 15 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_PDU = { "PDU", @@ -219,14 +250,16 @@ asn_TYPE_descriptor_t asn_DEF_PDU = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_PDU_1, 15, /* Elements count */ - &asn_SPC_PDU_1_specs /* Additional specs */ + &asn_SPC_PDU_specs_1 /* Additional specs */ }; @@ -269,6 +302,8 @@ static asn_TYPE_member_t asn_MBR_Sequence_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "integer" }, { ATF_POINTER, 2, offsetof(struct Sequence, sequence), @@ -276,6 +311,8 @@ static asn_TYPE_member_t asn_MBR_Sequence_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Sequence, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "sequence" }, { ATF_POINTER, 1, offsetof(struct Sequence, bits), @@ -283,6 +320,8 @@ static asn_TYPE_member_t asn_MBR_Sequence_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_BIT_STRING, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "bits" }, { ATF_NOFLAGS, 0, offsetof(struct Sequence, string), @@ -290,23 +329,26 @@ static asn_TYPE_member_t asn_MBR_Sequence_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_UTF8String, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "string" }, }; -static ber_tlv_tag_t asn_DEF_Sequence_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Sequence_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Sequence_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Sequence_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* integer at 38 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* sequence at 39 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* bits at 40 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* string at 41 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Sequence_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Sequence_specs_1 = { sizeof(struct Sequence), offsetof(struct Sequence, _asn_ctx), - asn_MAP_Sequence_1_tag2el, + asn_MAP_Sequence_tag2el_1, 4, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -320,16 +362,18 @@ asn_TYPE_descriptor_t asn_DEF_Sequence = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Sequence_1_tags, - sizeof(asn_DEF_Sequence_1_tags) - /sizeof(asn_DEF_Sequence_1_tags[0]), /* 1 */ - asn_DEF_Sequence_1_tags, /* Same as above */ - sizeof(asn_DEF_Sequence_1_tags) - /sizeof(asn_DEF_Sequence_1_tags[0]), /* 1 */ + asn_DEF_Sequence_tags_1, + sizeof(asn_DEF_Sequence_tags_1) + /sizeof(asn_DEF_Sequence_tags_1[0]), /* 1 */ + asn_DEF_Sequence_tags_1, /* Same as above */ + sizeof(asn_DEF_Sequence_tags_1) + /sizeof(asn_DEF_Sequence_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Sequence_1, 4, /* Elements count */ - &asn_SPC_Sequence_1_specs /* Additional specs */ + &asn_SPC_Sequence_specs_1 /* Additional specs */ }; @@ -376,6 +420,8 @@ static asn_TYPE_member_t asn_MBR_Set_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_RELATIVE_OID, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "roid" }, { ATF_POINTER, 1, offsetof(struct Set, opaque), @@ -383,29 +429,31 @@ static asn_TYPE_member_t asn_MBR_Set_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_OCTET_STRING, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "opaque" }, }; -static ber_tlv_tag_t asn_DEF_Set_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Set_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Set_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Set_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* roid at 45 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* opaque at 46 */ }; -static uint8_t asn_MAP_Set_1_mmap[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = { +static uint8_t asn_MAP_Set_mmap_1[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = { (1 << 7) | (0 << 6) }; -static asn_SET_specifics_t asn_SPC_Set_1_specs = { +static asn_SET_specifics_t asn_SPC_Set_specs_1 = { sizeof(struct Set), offsetof(struct Set, _asn_ctx), offsetof(struct Set, _presence_map), - asn_MAP_Set_1_tag2el, + asn_MAP_Set_tag2el_1, 2, /* Count of tags in the map */ - asn_MAP_Set_1_tag2el, /* Same as above */ + asn_MAP_Set_tag2el_1, /* Same as above */ 2, /* Count of tags in the CXER map */ 0, /* Whether extensible */ - (unsigned int *)asn_MAP_Set_1_mmap /* Mandatory elements map */ + (unsigned int *)asn_MAP_Set_mmap_1 /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_Set = { "Set", @@ -417,16 +465,18 @@ asn_TYPE_descriptor_t asn_DEF_Set = { SET_encode_der, SET_decode_xer, SET_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Set_1_tags, - sizeof(asn_DEF_Set_1_tags) - /sizeof(asn_DEF_Set_1_tags[0]), /* 1 */ - asn_DEF_Set_1_tags, /* Same as above */ - sizeof(asn_DEF_Set_1_tags) - /sizeof(asn_DEF_Set_1_tags[0]), /* 1 */ + asn_DEF_Set_tags_1, + sizeof(asn_DEF_Set_tags_1) + /sizeof(asn_DEF_Set_tags_1[0]), /* 1 */ + asn_DEF_Set_tags_1, /* Same as above */ + sizeof(asn_DEF_Set_tags_1) + /sizeof(asn_DEF_Set_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Set_1, 2, /* Elements count */ - &asn_SPC_Set_1_specs /* Additional specs */ + &asn_SPC_Set_specs_1 /* Additional specs */ }; @@ -496,6 +546,9 @@ enum_4_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; + td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ @@ -548,22 +601,22 @@ enum_4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [ExtensibleSet] >>> ***/ -static asn_INTEGER_enum_map_t asn_MAP_enum_4_value2enum[] = { +static asn_INTEGER_enum_map_t asn_MAP_enum_value2enum_4[] = { { 0, 1, "b" }, { 1, 1, "a" } }; -static unsigned int asn_MAP_enum_4_enum2value[] = { +static unsigned int asn_MAP_enum_enum2value_4[] = { 1, /* a(1) */ 0 /* b(0) */ }; -static asn_INTEGER_specifics_t asn_SPC_enum_4_specs = { - asn_MAP_enum_4_value2enum, /* "tag" => N; sorted by tag */ - asn_MAP_enum_4_enum2value, /* N => "tag"; sorted by N */ +static asn_INTEGER_specifics_t asn_SPC_enum_specs_4 = { + asn_MAP_enum_value2enum_4, /* "tag" => N; sorted by tag */ + asn_MAP_enum_enum2value_4, /* N => "tag"; sorted by N */ 2, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ 1 /* Strict enumeration */ }; -static ber_tlv_tag_t asn_DEF_enum_4_tags[] = { +static ber_tlv_tag_t asn_DEF_enum_tags_4[] = { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; @@ -578,15 +631,17 @@ asn_TYPE_descriptor_t asn_DEF_enum_4 = { enum_4_encode_der, enum_4_decode_xer, enum_4_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_enum_4_tags, - sizeof(asn_DEF_enum_4_tags) - /sizeof(asn_DEF_enum_4_tags[0]) - 1, /* 1 */ - asn_DEF_enum_4_tags, /* Same as above */ - sizeof(asn_DEF_enum_4_tags) - /sizeof(asn_DEF_enum_4_tags[0]), /* 2 */ + asn_DEF_enum_tags_4, + sizeof(asn_DEF_enum_tags_4) + /sizeof(asn_DEF_enum_tags_4[0]) - 1, /* 1 */ + asn_DEF_enum_tags_4, /* Same as above */ + sizeof(asn_DEF_enum_tags_4) + /sizeof(asn_DEF_enum_tags_4[0]), /* 2 */ + 0, /* No PER visible constraints */ 0, 0, /* Defined elsewhere */ - &asn_SPC_enum_4_specs /* Additional specs */ + &asn_SPC_enum_specs_4 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_ExtensibleSet_1[] = { @@ -595,6 +650,8 @@ static asn_TYPE_member_t asn_MBR_ExtensibleSet_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_UTF8String, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "string" }, { ATF_POINTER, 1, offsetof(struct ExtensibleSet, Enum), @@ -602,29 +659,31 @@ static asn_TYPE_member_t asn_MBR_ExtensibleSet_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_enum_4, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "enum" }, }; -static ber_tlv_tag_t asn_DEF_ExtensibleSet_1_tags[] = { +static ber_tlv_tag_t asn_DEF_ExtensibleSet_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_ExtensibleSet_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_ExtensibleSet_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* string at 50 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* enum at 52 */ }; -static uint8_t asn_MAP_ExtensibleSet_1_mmap[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = { +static uint8_t asn_MAP_ExtensibleSet_mmap_1[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = { (0 << 7) | (0 << 6) }; -static asn_SET_specifics_t asn_SPC_ExtensibleSet_1_specs = { +static asn_SET_specifics_t asn_SPC_ExtensibleSet_specs_1 = { sizeof(struct ExtensibleSet), offsetof(struct ExtensibleSet, _asn_ctx), offsetof(struct ExtensibleSet, _presence_map), - asn_MAP_ExtensibleSet_1_tag2el, + asn_MAP_ExtensibleSet_tag2el_1, 2, /* Count of tags in the map */ - asn_MAP_ExtensibleSet_1_tag2el, /* Same as above */ + asn_MAP_ExtensibleSet_tag2el_1, /* Same as above */ 2, /* Count of tags in the CXER map */ 1, /* Whether extensible */ - (unsigned int *)asn_MAP_ExtensibleSet_1_mmap /* Mandatory elements map */ + (unsigned int *)asn_MAP_ExtensibleSet_mmap_1 /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_ExtensibleSet = { "ExtensibleSet", @@ -636,16 +695,18 @@ asn_TYPE_descriptor_t asn_DEF_ExtensibleSet = { SET_encode_der, SET_decode_xer, SET_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_ExtensibleSet_1_tags, - sizeof(asn_DEF_ExtensibleSet_1_tags) - /sizeof(asn_DEF_ExtensibleSet_1_tags[0]), /* 1 */ - asn_DEF_ExtensibleSet_1_tags, /* Same as above */ - sizeof(asn_DEF_ExtensibleSet_1_tags) - /sizeof(asn_DEF_ExtensibleSet_1_tags[0]), /* 1 */ + asn_DEF_ExtensibleSet_tags_1, + sizeof(asn_DEF_ExtensibleSet_tags_1) + /sizeof(asn_DEF_ExtensibleSet_tags_1[0]), /* 1 */ + asn_DEF_ExtensibleSet_tags_1, /* Same as above */ + sizeof(asn_DEF_ExtensibleSet_tags_1) + /sizeof(asn_DEF_ExtensibleSet_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_ExtensibleSet_1, 2, /* Elements count */ - &asn_SPC_ExtensibleSet_1_specs /* Additional specs */ + &asn_SPC_ExtensibleSet_specs_1 /* Additional specs */ }; @@ -683,6 +744,8 @@ static asn_TYPE_member_t asn_MBR_ExtensibleSequence_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_UTF8String, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "string" }, { ATF_POINTER, 2, offsetof(struct ExtensibleSequence, integer), @@ -690,6 +753,8 @@ static asn_TYPE_member_t asn_MBR_ExtensibleSequence_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "integer" }, { ATF_POINTER, 1, offsetof(struct ExtensibleSequence, gtime), @@ -697,22 +762,25 @@ static asn_TYPE_member_t asn_MBR_ExtensibleSequence_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_GeneralizedTime, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "gtime" }, }; -static ber_tlv_tag_t asn_DEF_ExtensibleSequence_1_tags[] = { +static ber_tlv_tag_t asn_DEF_ExtensibleSequence_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_ExtensibleSequence_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_ExtensibleSequence_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* string at 56 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* integer at 58 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* gtime at 59 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_ExtensibleSequence_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_ExtensibleSequence_specs_1 = { sizeof(struct ExtensibleSequence), offsetof(struct ExtensibleSequence, _asn_ctx), - asn_MAP_ExtensibleSequence_1_tag2el, + asn_MAP_ExtensibleSequence_tag2el_1, 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ 0, /* Start extensions */ 4 /* Stop extensions */ }; @@ -726,16 +794,18 @@ asn_TYPE_descriptor_t asn_DEF_ExtensibleSequence = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_ExtensibleSequence_1_tags, - sizeof(asn_DEF_ExtensibleSequence_1_tags) - /sizeof(asn_DEF_ExtensibleSequence_1_tags[0]), /* 1 */ - asn_DEF_ExtensibleSequence_1_tags, /* Same as above */ - sizeof(asn_DEF_ExtensibleSequence_1_tags) - /sizeof(asn_DEF_ExtensibleSequence_1_tags[0]), /* 1 */ + asn_DEF_ExtensibleSequence_tags_1, + sizeof(asn_DEF_ExtensibleSequence_tags_1) + /sizeof(asn_DEF_ExtensibleSequence_tags_1[0]), /* 1 */ + asn_DEF_ExtensibleSequence_tags_1, /* Same as above */ + sizeof(asn_DEF_ExtensibleSequence_tags_1) + /sizeof(asn_DEF_ExtensibleSequence_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_ExtensibleSequence_1, 3, /* Elements count */ - &asn_SPC_ExtensibleSequence_1_specs /* Additional specs */ + &asn_SPC_ExtensibleSequence_specs_1 /* Additional specs */ }; @@ -771,6 +841,8 @@ static asn_TYPE_member_t asn_MBR_ExtensibleSequence2_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_UTF8String, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "string" }, { ATF_POINTER, 1, offsetof(struct ExtensibleSequence2, integer), @@ -778,21 +850,24 @@ static asn_TYPE_member_t asn_MBR_ExtensibleSequence2_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "integer" }, }; -static ber_tlv_tag_t asn_DEF_ExtensibleSequence2_1_tags[] = { +static ber_tlv_tag_t asn_DEF_ExtensibleSequence2_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_ExtensibleSequence2_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_ExtensibleSequence2_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* string at 63 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* integer at 65 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_ExtensibleSequence2_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_ExtensibleSequence2_specs_1 = { sizeof(struct ExtensibleSequence2), offsetof(struct ExtensibleSequence2, _asn_ctx), - asn_MAP_ExtensibleSequence2_1_tag2el, + asn_MAP_ExtensibleSequence2_tag2el_1, 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ 0, /* Start extensions */ 3 /* Stop extensions */ }; @@ -806,16 +881,18 @@ asn_TYPE_descriptor_t asn_DEF_ExtensibleSequence2 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_ExtensibleSequence2_1_tags, - sizeof(asn_DEF_ExtensibleSequence2_1_tags) - /sizeof(asn_DEF_ExtensibleSequence2_1_tags[0]), /* 1 */ - asn_DEF_ExtensibleSequence2_1_tags, /* Same as above */ - sizeof(asn_DEF_ExtensibleSequence2_1_tags) - /sizeof(asn_DEF_ExtensibleSequence2_1_tags[0]), /* 1 */ + asn_DEF_ExtensibleSequence2_tags_1, + sizeof(asn_DEF_ExtensibleSequence2_tags_1) + /sizeof(asn_DEF_ExtensibleSequence2_tags_1[0]), /* 1 */ + asn_DEF_ExtensibleSequence2_tags_1, /* Same as above */ + sizeof(asn_DEF_ExtensibleSequence2_tags_1) + /sizeof(asn_DEF_ExtensibleSequence2_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_ExtensibleSequence2_1, 2, /* Elements count */ - &asn_SPC_ExtensibleSequence2_1_specs /* Additional specs */ + &asn_SPC_ExtensibleSequence2_specs_1 /* Additional specs */ }; @@ -846,13 +923,15 @@ static asn_TYPE_member_t asn_MBR_SetOfNULL_1[] = { .tag_mode = 0, .type = &asn_DEF_NULL, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_SetOfNULL_1_tags[] = { +static ber_tlv_tag_t asn_DEF_SetOfNULL_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_SetOfNULL_1_specs = { +static asn_SET_OF_specifics_t asn_SPC_SetOfNULL_specs_1 = { sizeof(struct SetOfNULL), offsetof(struct SetOfNULL, _asn_ctx), 1, /* XER encoding is XMLValueList */ @@ -867,16 +946,18 @@ asn_TYPE_descriptor_t asn_DEF_SetOfNULL = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_SetOfNULL_1_tags, - sizeof(asn_DEF_SetOfNULL_1_tags) - /sizeof(asn_DEF_SetOfNULL_1_tags[0]), /* 1 */ - asn_DEF_SetOfNULL_1_tags, /* Same as above */ - sizeof(asn_DEF_SetOfNULL_1_tags) - /sizeof(asn_DEF_SetOfNULL_1_tags[0]), /* 1 */ + asn_DEF_SetOfNULL_tags_1, + sizeof(asn_DEF_SetOfNULL_tags_1) + /sizeof(asn_DEF_SetOfNULL_tags_1[0]), /* 1 */ + asn_DEF_SetOfNULL_tags_1, /* Same as above */ + sizeof(asn_DEF_SetOfNULL_tags_1) + /sizeof(asn_DEF_SetOfNULL_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_SetOfNULL_1, 1, /* Single element */ - &asn_SPC_SetOfNULL_1_specs /* Additional specs */ + &asn_SPC_SetOfNULL_specs_1 /* Additional specs */ }; @@ -907,13 +988,15 @@ static asn_TYPE_member_t asn_MBR_SetOfREAL_1[] = { .tag_mode = 0, .type = &asn_DEF_REAL, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_SetOfREAL_1_tags[] = { +static ber_tlv_tag_t asn_DEF_SetOfREAL_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_SetOfREAL_1_specs = { +static asn_SET_OF_specifics_t asn_SPC_SetOfREAL_specs_1 = { sizeof(struct SetOfREAL), offsetof(struct SetOfREAL, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ @@ -928,16 +1011,18 @@ asn_TYPE_descriptor_t asn_DEF_SetOfREAL = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_SetOfREAL_1_tags, - sizeof(asn_DEF_SetOfREAL_1_tags) - /sizeof(asn_DEF_SetOfREAL_1_tags[0]), /* 1 */ - asn_DEF_SetOfREAL_1_tags, /* Same as above */ - sizeof(asn_DEF_SetOfREAL_1_tags) - /sizeof(asn_DEF_SetOfREAL_1_tags[0]), /* 1 */ + asn_DEF_SetOfREAL_tags_1, + sizeof(asn_DEF_SetOfREAL_tags_1) + /sizeof(asn_DEF_SetOfREAL_tags_1[0]), /* 1 */ + asn_DEF_SetOfREAL_tags_1, /* Same as above */ + sizeof(asn_DEF_SetOfREAL_tags_1) + /sizeof(asn_DEF_SetOfREAL_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_SetOfREAL_1, 1, /* Single element */ - &asn_SPC_SetOfREAL_1_specs /* Additional specs */ + &asn_SPC_SetOfREAL_specs_1 /* Additional specs */ }; @@ -990,6 +1075,9 @@ Member_2_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; + td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ @@ -1042,28 +1130,28 @@ Member_2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [SetOfEnums] >>> ***/ -static asn_INTEGER_enum_map_t asn_MAP_Member_2_value2enum[] = { +static asn_INTEGER_enum_map_t asn_MAP_Member_value2enum_2[] = { { 0, 3, "one" }, { 1, 7, "oneMore" } }; -static unsigned int asn_MAP_Member_2_enum2value[] = { +static unsigned int asn_MAP_Member_enum2value_2[] = { 0, /* one(0) */ 1 /* oneMore(1) */ }; -static asn_INTEGER_specifics_t asn_SPC_Member_2_specs = { - asn_MAP_Member_2_value2enum, /* "tag" => N; sorted by tag */ - asn_MAP_Member_2_enum2value, /* N => "tag"; sorted by N */ +static asn_INTEGER_specifics_t asn_SPC_Member_specs_2 = { + asn_MAP_Member_value2enum_2, /* "tag" => N; sorted by tag */ + asn_MAP_Member_enum2value_2, /* N => "tag"; sorted by N */ 2, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ 1 /* Strict enumeration */ }; -static ber_tlv_tag_t asn_DEF_Member_2_tags[] = { +static ber_tlv_tag_t asn_DEF_Member_tags_2[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_Member_2 = { - "", - "", + "ENUMERATED", + "ENUMERATED", Member_2_free, Member_2_print, Member_2_constraint, @@ -1071,15 +1159,17 @@ asn_TYPE_descriptor_t asn_DEF_Member_2 = { Member_2_encode_der, Member_2_decode_xer, Member_2_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Member_2_tags, - sizeof(asn_DEF_Member_2_tags) - /sizeof(asn_DEF_Member_2_tags[0]), /* 1 */ - asn_DEF_Member_2_tags, /* Same as above */ - sizeof(asn_DEF_Member_2_tags) - /sizeof(asn_DEF_Member_2_tags[0]), /* 1 */ + asn_DEF_Member_tags_2, + sizeof(asn_DEF_Member_tags_2) + /sizeof(asn_DEF_Member_tags_2[0]), /* 1 */ + asn_DEF_Member_tags_2, /* Same as above */ + sizeof(asn_DEF_Member_tags_2) + /sizeof(asn_DEF_Member_tags_2[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* Defined elsewhere */ - &asn_SPC_Member_2_specs /* Additional specs */ + &asn_SPC_Member_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_SetOfEnums_1[] = { @@ -1088,13 +1178,15 @@ static asn_TYPE_member_t asn_MBR_SetOfEnums_1[] = { .tag_mode = 0, .type = &asn_DEF_Member_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_SetOfEnums_1_tags[] = { +static ber_tlv_tag_t asn_DEF_SetOfEnums_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_SetOfEnums_1_specs = { +static asn_SET_OF_specifics_t asn_SPC_SetOfEnums_specs_1 = { sizeof(struct SetOfEnums), offsetof(struct SetOfEnums, _asn_ctx), 1, /* XER encoding is XMLValueList */ @@ -1109,16 +1201,18 @@ asn_TYPE_descriptor_t asn_DEF_SetOfEnums = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_SetOfEnums_1_tags, - sizeof(asn_DEF_SetOfEnums_1_tags) - /sizeof(asn_DEF_SetOfEnums_1_tags[0]), /* 1 */ - asn_DEF_SetOfEnums_1_tags, /* Same as above */ - sizeof(asn_DEF_SetOfEnums_1_tags) - /sizeof(asn_DEF_SetOfEnums_1_tags[0]), /* 1 */ + asn_DEF_SetOfEnums_tags_1, + sizeof(asn_DEF_SetOfEnums_tags_1) + /sizeof(asn_DEF_SetOfEnums_tags_1[0]), /* 1 */ + asn_DEF_SetOfEnums_tags_1, /* Same as above */ + sizeof(asn_DEF_SetOfEnums_tags_1) + /sizeof(asn_DEF_SetOfEnums_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_SetOfEnums_1, 1, /* Single element */ - &asn_SPC_SetOfEnums_1_specs /* Additional specs */ + &asn_SPC_SetOfEnums_specs_1 /* Additional specs */ }; @@ -1149,13 +1243,15 @@ static asn_TYPE_member_t asn_MBR_NamedSetOfNULL_1[] = { .tag_mode = 0, .type = &asn_DEF_NULL, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "y" }, }; -static ber_tlv_tag_t asn_DEF_NamedSetOfNULL_1_tags[] = { +static ber_tlv_tag_t asn_DEF_NamedSetOfNULL_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_NamedSetOfNULL_1_specs = { +static asn_SET_OF_specifics_t asn_SPC_NamedSetOfNULL_specs_1 = { sizeof(struct NamedSetOfNULL), offsetof(struct NamedSetOfNULL, _asn_ctx), 1, /* XER encoding is XMLValueList */ @@ -1170,16 +1266,18 @@ asn_TYPE_descriptor_t asn_DEF_NamedSetOfNULL = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_NamedSetOfNULL_1_tags, - sizeof(asn_DEF_NamedSetOfNULL_1_tags) - /sizeof(asn_DEF_NamedSetOfNULL_1_tags[0]), /* 1 */ - asn_DEF_NamedSetOfNULL_1_tags, /* Same as above */ - sizeof(asn_DEF_NamedSetOfNULL_1_tags) - /sizeof(asn_DEF_NamedSetOfNULL_1_tags[0]), /* 1 */ + asn_DEF_NamedSetOfNULL_tags_1, + sizeof(asn_DEF_NamedSetOfNULL_tags_1) + /sizeof(asn_DEF_NamedSetOfNULL_tags_1[0]), /* 1 */ + asn_DEF_NamedSetOfNULL_tags_1, /* Same as above */ + sizeof(asn_DEF_NamedSetOfNULL_tags_1) + /sizeof(asn_DEF_NamedSetOfNULL_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_NamedSetOfNULL_1, 1, /* Single element */ - &asn_SPC_NamedSetOfNULL_1_specs /* Additional specs */ + &asn_SPC_NamedSetOfNULL_specs_1 /* Additional specs */ }; @@ -1210,13 +1308,15 @@ static asn_TYPE_member_t asn_MBR_NamedSetOfREAL_1[] = { .tag_mode = 0, .type = &asn_DEF_REAL, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "name" }, }; -static ber_tlv_tag_t asn_DEF_NamedSetOfREAL_1_tags[] = { +static ber_tlv_tag_t asn_DEF_NamedSetOfREAL_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_NamedSetOfREAL_1_specs = { +static asn_SET_OF_specifics_t asn_SPC_NamedSetOfREAL_specs_1 = { sizeof(struct NamedSetOfREAL), offsetof(struct NamedSetOfREAL, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ @@ -1231,16 +1331,18 @@ asn_TYPE_descriptor_t asn_DEF_NamedSetOfREAL = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_NamedSetOfREAL_1_tags, - sizeof(asn_DEF_NamedSetOfREAL_1_tags) - /sizeof(asn_DEF_NamedSetOfREAL_1_tags[0]), /* 1 */ - asn_DEF_NamedSetOfREAL_1_tags, /* Same as above */ - sizeof(asn_DEF_NamedSetOfREAL_1_tags) - /sizeof(asn_DEF_NamedSetOfREAL_1_tags[0]), /* 1 */ + asn_DEF_NamedSetOfREAL_tags_1, + sizeof(asn_DEF_NamedSetOfREAL_tags_1) + /sizeof(asn_DEF_NamedSetOfREAL_tags_1[0]), /* 1 */ + asn_DEF_NamedSetOfREAL_tags_1, /* Same as above */ + sizeof(asn_DEF_NamedSetOfREAL_tags_1) + /sizeof(asn_DEF_NamedSetOfREAL_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_NamedSetOfREAL_1, 1, /* Single element */ - &asn_SPC_NamedSetOfREAL_1_specs /* Additional specs */ + &asn_SPC_NamedSetOfREAL_specs_1 /* Additional specs */ }; @@ -1293,6 +1395,9 @@ name_2_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; + td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ @@ -1345,28 +1450,28 @@ name_2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NamedSetOfEnums] >>> ***/ -static asn_INTEGER_enum_map_t asn_MAP_name_2_value2enum[] = { +static asn_INTEGER_enum_map_t asn_MAP_name_value2enum_2[] = { { 0, 3, "one" }, { 1, 7, "oneMore" } }; -static unsigned int asn_MAP_name_2_enum2value[] = { +static unsigned int asn_MAP_name_enum2value_2[] = { 0, /* one(0) */ 1 /* oneMore(1) */ }; -static asn_INTEGER_specifics_t asn_SPC_name_2_specs = { - asn_MAP_name_2_value2enum, /* "tag" => N; sorted by tag */ - asn_MAP_name_2_enum2value, /* N => "tag"; sorted by N */ +static asn_INTEGER_specifics_t asn_SPC_name_specs_2 = { + asn_MAP_name_value2enum_2, /* "tag" => N; sorted by tag */ + asn_MAP_name_enum2value_2, /* N => "tag"; sorted by N */ 2, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ 1 /* Strict enumeration */ }; -static ber_tlv_tag_t asn_DEF_name_2_tags[] = { +static ber_tlv_tag_t asn_DEF_name_tags_2[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_name_2 = { - "", - "", + "ENUMERATED", + "ENUMERATED", name_2_free, name_2_print, name_2_constraint, @@ -1374,15 +1479,17 @@ asn_TYPE_descriptor_t asn_DEF_name_2 = { name_2_encode_der, name_2_decode_xer, name_2_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_name_2_tags, - sizeof(asn_DEF_name_2_tags) - /sizeof(asn_DEF_name_2_tags[0]), /* 1 */ - asn_DEF_name_2_tags, /* Same as above */ - sizeof(asn_DEF_name_2_tags) - /sizeof(asn_DEF_name_2_tags[0]), /* 1 */ + asn_DEF_name_tags_2, + sizeof(asn_DEF_name_tags_2) + /sizeof(asn_DEF_name_tags_2[0]), /* 1 */ + asn_DEF_name_tags_2, /* Same as above */ + sizeof(asn_DEF_name_tags_2) + /sizeof(asn_DEF_name_tags_2[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* Defined elsewhere */ - &asn_SPC_name_2_specs /* Additional specs */ + &asn_SPC_name_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_NamedSetOfEnums_1[] = { @@ -1391,13 +1498,15 @@ static asn_TYPE_member_t asn_MBR_NamedSetOfEnums_1[] = { .tag_mode = 0, .type = &asn_DEF_name_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "name" }, }; -static ber_tlv_tag_t asn_DEF_NamedSetOfEnums_1_tags[] = { +static ber_tlv_tag_t asn_DEF_NamedSetOfEnums_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_NamedSetOfEnums_1_specs = { +static asn_SET_OF_specifics_t asn_SPC_NamedSetOfEnums_specs_1 = { sizeof(struct NamedSetOfEnums), offsetof(struct NamedSetOfEnums, _asn_ctx), 1, /* XER encoding is XMLValueList */ @@ -1412,16 +1521,18 @@ asn_TYPE_descriptor_t asn_DEF_NamedSetOfEnums = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_NamedSetOfEnums_1_tags, - sizeof(asn_DEF_NamedSetOfEnums_1_tags) - /sizeof(asn_DEF_NamedSetOfEnums_1_tags[0]), /* 1 */ - asn_DEF_NamedSetOfEnums_1_tags, /* Same as above */ - sizeof(asn_DEF_NamedSetOfEnums_1_tags) - /sizeof(asn_DEF_NamedSetOfEnums_1_tags[0]), /* 1 */ + asn_DEF_NamedSetOfEnums_tags_1, + sizeof(asn_DEF_NamedSetOfEnums_tags_1) + /sizeof(asn_DEF_NamedSetOfEnums_tags_1[0]), /* 1 */ + asn_DEF_NamedSetOfEnums_tags_1, /* Same as above */ + sizeof(asn_DEF_NamedSetOfEnums_tags_1) + /sizeof(asn_DEF_NamedSetOfEnums_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_NamedSetOfEnums_1, 1, /* Single element */ - &asn_SPC_NamedSetOfEnums_1_specs /* Additional specs */ + &asn_SPC_NamedSetOfEnums_specs_1 /* Additional specs */ }; @@ -1452,13 +1563,15 @@ static asn_TYPE_member_t asn_MBR_SequenceOf_1[] = { .tag_mode = 0, .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "id" }, }; -static ber_tlv_tag_t asn_DEF_SequenceOf_1_tags[] = { +static ber_tlv_tag_t asn_DEF_SequenceOf_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_SequenceOf_1_specs = { +static asn_SET_OF_specifics_t asn_SPC_SequenceOf_specs_1 = { sizeof(struct SequenceOf), offsetof(struct SequenceOf, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ @@ -1473,16 +1586,18 @@ asn_TYPE_descriptor_t asn_DEF_SequenceOf = { SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_SequenceOf_1_tags, - sizeof(asn_DEF_SequenceOf_1_tags) - /sizeof(asn_DEF_SequenceOf_1_tags[0]), /* 1 */ - asn_DEF_SequenceOf_1_tags, /* Same as above */ - sizeof(asn_DEF_SequenceOf_1_tags) - /sizeof(asn_DEF_SequenceOf_1_tags[0]), /* 1 */ + asn_DEF_SequenceOf_tags_1, + sizeof(asn_DEF_SequenceOf_tags_1) + /sizeof(asn_DEF_SequenceOf_tags_1[0]), /* 1 */ + asn_DEF_SequenceOf_tags_1, /* Same as above */ + sizeof(asn_DEF_SequenceOf_tags_1) + /sizeof(asn_DEF_SequenceOf_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_SequenceOf_1, 1, /* Single element */ - &asn_SPC_SequenceOf_1_specs /* Additional specs */ + &asn_SPC_SequenceOf_specs_1 /* Additional specs */ }; @@ -1513,13 +1628,15 @@ static asn_TYPE_member_t asn_MBR_SeqOfZuka_1[] = { .tag_mode = 0, .type = &asn_DEF_NULL, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "zuka" }, }; -static ber_tlv_tag_t asn_DEF_SeqOfZuka_1_tags[] = { +static ber_tlv_tag_t asn_DEF_SeqOfZuka_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_SeqOfZuka_1_specs = { +static asn_SET_OF_specifics_t asn_SPC_SeqOfZuka_specs_1 = { sizeof(struct SeqOfZuka), offsetof(struct SeqOfZuka, _asn_ctx), 1, /* XER encoding is XMLValueList */ @@ -1534,16 +1651,18 @@ asn_TYPE_descriptor_t asn_DEF_SeqOfZuka = { SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_SeqOfZuka_1_tags, - sizeof(asn_DEF_SeqOfZuka_1_tags) - /sizeof(asn_DEF_SeqOfZuka_1_tags[0]), /* 1 */ - asn_DEF_SeqOfZuka_1_tags, /* Same as above */ - sizeof(asn_DEF_SeqOfZuka_1_tags) - /sizeof(asn_DEF_SeqOfZuka_1_tags[0]), /* 1 */ + asn_DEF_SeqOfZuka_tags_1, + sizeof(asn_DEF_SeqOfZuka_tags_1) + /sizeof(asn_DEF_SeqOfZuka_tags_1[0]), /* 1 */ + asn_DEF_SeqOfZuka_tags_1, /* Same as above */ + sizeof(asn_DEF_SeqOfZuka_tags_1) + /sizeof(asn_DEF_SeqOfZuka_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_SeqOfZuka_1, 1, /* Single element */ - &asn_SPC_SeqOfZuka_1_specs /* Additional specs */ + &asn_SPC_SeqOfZuka_specs_1 /* Additional specs */ }; @@ -1581,13 +1700,15 @@ static asn_TYPE_member_t asn_MBR_SetOfChoice_1[] = { .tag_mode = 0, .type = &asn_DEF_SimpleChoice, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_SetOfChoice_1_tags[] = { +static ber_tlv_tag_t asn_DEF_SetOfChoice_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_SetOfChoice_1_specs = { +static asn_SET_OF_specifics_t asn_SPC_SetOfChoice_specs_1 = { sizeof(struct SetOfChoice), offsetof(struct SetOfChoice, _asn_ctx), 2, /* XER encoding is XMLValueList */ @@ -1602,16 +1723,18 @@ asn_TYPE_descriptor_t asn_DEF_SetOfChoice = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_SetOfChoice_1_tags, - sizeof(asn_DEF_SetOfChoice_1_tags) - /sizeof(asn_DEF_SetOfChoice_1_tags[0]), /* 1 */ - asn_DEF_SetOfChoice_1_tags, /* Same as above */ - sizeof(asn_DEF_SetOfChoice_1_tags) - /sizeof(asn_DEF_SetOfChoice_1_tags[0]), /* 1 */ + asn_DEF_SetOfChoice_tags_1, + sizeof(asn_DEF_SetOfChoice_tags_1) + /sizeof(asn_DEF_SetOfChoice_tags_1[0]), /* 1 */ + asn_DEF_SetOfChoice_tags_1, /* Same as above */ + sizeof(asn_DEF_SetOfChoice_tags_1) + /sizeof(asn_DEF_SetOfChoice_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_SetOfChoice_1, 1, /* Single element */ - &asn_SPC_SetOfChoice_1_specs /* Additional specs */ + &asn_SPC_SetOfChoice_specs_1 /* Additional specs */ }; @@ -1649,13 +1772,15 @@ static asn_TYPE_member_t asn_MBR_NamedSetOfChoice_1[] = { .tag_mode = 0, .type = &asn_DEF_SimpleChoice, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "whatever" }, }; -static ber_tlv_tag_t asn_DEF_NamedSetOfChoice_1_tags[] = { +static ber_tlv_tag_t asn_DEF_NamedSetOfChoice_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_NamedSetOfChoice_1_specs = { +static asn_SET_OF_specifics_t asn_SPC_NamedSetOfChoice_specs_1 = { sizeof(struct NamedSetOfChoice), offsetof(struct NamedSetOfChoice, _asn_ctx), 2, /* XER encoding is XMLValueList */ @@ -1670,16 +1795,18 @@ asn_TYPE_descriptor_t asn_DEF_NamedSetOfChoice = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_NamedSetOfChoice_1_tags, - sizeof(asn_DEF_NamedSetOfChoice_1_tags) - /sizeof(asn_DEF_NamedSetOfChoice_1_tags[0]), /* 1 */ - asn_DEF_NamedSetOfChoice_1_tags, /* Same as above */ - sizeof(asn_DEF_NamedSetOfChoice_1_tags) - /sizeof(asn_DEF_NamedSetOfChoice_1_tags[0]), /* 1 */ + asn_DEF_NamedSetOfChoice_tags_1, + sizeof(asn_DEF_NamedSetOfChoice_tags_1) + /sizeof(asn_DEF_NamedSetOfChoice_tags_1[0]), /* 1 */ + asn_DEF_NamedSetOfChoice_tags_1, /* Same as above */ + sizeof(asn_DEF_NamedSetOfChoice_tags_1) + /sizeof(asn_DEF_NamedSetOfChoice_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_NamedSetOfChoice_1, 1, /* Single element */ - &asn_SPC_NamedSetOfChoice_1_specs /* Additional specs */ + &asn_SPC_NamedSetOfChoice_specs_1 /* Additional specs */ }; @@ -1722,6 +1849,8 @@ static asn_TYPE_member_t asn_MBR_SimpleChoice_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_NULL, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "a" }, { ATF_NOFLAGS, 0, offsetof(struct SimpleChoice, choice.b), @@ -1729,21 +1858,24 @@ static asn_TYPE_member_t asn_MBR_SimpleChoice_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "b" }, }; -static asn_TYPE_tag2member_t asn_MAP_SimpleChoice_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_SimpleChoice_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* a at 79 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* b at 79 */ }; -static asn_CHOICE_specifics_t asn_SPC_SimpleChoice_1_specs = { +static asn_CHOICE_specifics_t asn_SPC_SimpleChoice_specs_1 = { sizeof(struct SimpleChoice), offsetof(struct SimpleChoice, _asn_ctx), offsetof(struct SimpleChoice, present), sizeof(((struct SimpleChoice *)0)->present), - asn_MAP_SimpleChoice_1_tag2el, + asn_MAP_SimpleChoice_tag2el_1, 2, /* Count of tags in the map */ - 0 /* Whether extensible */ + .canonical_order = 0, + .ext_start = -1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_SimpleChoice = { "SimpleChoice", @@ -1755,13 +1887,15 @@ asn_TYPE_descriptor_t asn_DEF_SimpleChoice = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_SimpleChoice_1, 2, /* Elements count */ - &asn_SPC_SimpleChoice_1_specs /* Additional specs */ + &asn_SPC_SimpleChoice_specs_1 /* Additional specs */ }; diff --git a/tests/72-same-names-OK.asn1.-P b/tests/72-same-names-OK.asn1.-P index b183aeb7c..e4d210c01 100644 --- a/tests/72-same-names-OK.asn1.-P +++ b/tests/72-same-names-OK.asn1.-P @@ -34,6 +34,8 @@ static asn_TYPE_member_t asn_MBR_Member_2[] = { .tag_mode = 0, .type = &asn_DEF_Type1, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "t1" }, { ATF_NOFLAGS, 0, offsetof(struct Member, t2), @@ -41,29 +43,32 @@ static asn_TYPE_member_t asn_MBR_Member_2[] = { .tag_mode = 0, .type = &asn_DEF_Type2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "t2" }, }; -static ber_tlv_tag_t asn_DEF_Member_2_tags[] = { +static ber_tlv_tag_t asn_DEF_Member_tags_2[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Member_2_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = { { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* t1 at 21 */ { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 0 }, /* one-name at 37 */ { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 1, 0, 0 } /* two-name at 43 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Member_2_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = { sizeof(struct Member), offsetof(struct Member, _asn_ctx), - asn_MAP_Member_2_tag2el, + asn_MAP_Member_tag2el_2, 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_Member_2 = { - "", - "", + "SEQUENCE", + "SEQUENCE", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, @@ -71,16 +76,18 @@ asn_TYPE_descriptor_t asn_DEF_Member_2 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Member_2_tags, - sizeof(asn_DEF_Member_2_tags) - /sizeof(asn_DEF_Member_2_tags[0]), /* 1 */ - asn_DEF_Member_2_tags, /* Same as above */ - sizeof(asn_DEF_Member_2_tags) - /sizeof(asn_DEF_Member_2_tags[0]), /* 1 */ + asn_DEF_Member_tags_2, + sizeof(asn_DEF_Member_tags_2) + /sizeof(asn_DEF_Member_tags_2[0]), /* 1 */ + asn_DEF_Member_tags_2, /* Same as above */ + sizeof(asn_DEF_Member_tags_2) + /sizeof(asn_DEF_Member_tags_2[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Member_2, 2, /* Elements count */ - &asn_SPC_Member_2_specs /* Additional specs */ + &asn_SPC_Member_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_Type_1[] = { @@ -89,13 +96,15 @@ static asn_TYPE_member_t asn_MBR_Type_1[] = { .tag_mode = 0, .type = &asn_DEF_Member_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_Type_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Type_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_Type_1_specs = { +static asn_SET_OF_specifics_t asn_SPC_Type_specs_1 = { sizeof(struct Type), offsetof(struct Type, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ @@ -110,16 +119,18 @@ asn_TYPE_descriptor_t asn_DEF_Type = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Type_1_tags, - sizeof(asn_DEF_Type_1_tags) - /sizeof(asn_DEF_Type_1_tags[0]), /* 1 */ - asn_DEF_Type_1_tags, /* Same as above */ - sizeof(asn_DEF_Type_1_tags) - /sizeof(asn_DEF_Type_1_tags[0]), /* 1 */ + asn_DEF_Type_tags_1, + sizeof(asn_DEF_Type_tags_1) + /sizeof(asn_DEF_Type_tags_1[0]), /* 1 */ + asn_DEF_Type_tags_1, /* Same as above */ + sizeof(asn_DEF_Type_tags_1) + /sizeof(asn_DEF_Type_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Type_1, 1, /* Single element */ - &asn_SPC_Type_1_specs /* Additional specs */ + &asn_SPC_Type_specs_1 /* Additional specs */ }; @@ -171,6 +182,8 @@ static asn_TYPE_member_t asn_MBR_another_name_3[] = { .tag_mode = 0, .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "a" }, { ATF_NOFLAGS, 0, offsetof(struct another_name, b), @@ -178,21 +191,24 @@ static asn_TYPE_member_t asn_MBR_another_name_3[] = { .tag_mode = 0, .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "b" }, }; -static ber_tlv_tag_t asn_DEF_another_name_3_tags[] = { +static ber_tlv_tag_t asn_DEF_another_name_tags_3[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_another_name_3_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_another_name_tag2el_3[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 1 }, /* a at 27 */ { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, -1, 0 } /* b at 27 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_another_name_3_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_another_name_specs_3 = { sizeof(struct another_name), offsetof(struct another_name, _asn_ctx), - asn_MAP_another_name_3_tag2el, + asn_MAP_another_name_tag2el_3, 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -207,16 +223,18 @@ asn_TYPE_descriptor_t asn_DEF_another_name_3 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_another_name_3_tags, - sizeof(asn_DEF_another_name_3_tags) - /sizeof(asn_DEF_another_name_3_tags[0]), /* 1 */ - asn_DEF_another_name_3_tags, /* Same as above */ - sizeof(asn_DEF_another_name_3_tags) - /sizeof(asn_DEF_another_name_3_tags[0]), /* 1 */ + asn_DEF_another_name_tags_3, + sizeof(asn_DEF_another_name_tags_3) + /sizeof(asn_DEF_another_name_tags_3[0]), /* 1 */ + asn_DEF_another_name_tags_3, /* Same as above */ + sizeof(asn_DEF_another_name_tags_3) + /sizeof(asn_DEF_another_name_tags_3[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_another_name_3, 2, /* Elements count */ - &asn_SPC_another_name_3_specs /* Additional specs */ + &asn_SPC_another_name_specs_3 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_one_name_2[] = { @@ -225,20 +243,23 @@ static asn_TYPE_member_t asn_MBR_one_name_2[] = { .tag_mode = 0, .type = &asn_DEF_another_name_3, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "another-name" }, }; -static asn_TYPE_tag2member_t asn_MAP_one_name_2_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_one_name_tag2el_2[] = { { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* another-name at 27 */ }; -static asn_CHOICE_specifics_t asn_SPC_one_name_2_specs = { +static asn_CHOICE_specifics_t asn_SPC_one_name_specs_2 = { sizeof(struct one_name), offsetof(struct one_name, _asn_ctx), offsetof(struct one_name, present), sizeof(((struct one_name *)0)->present), - asn_MAP_one_name_2_tag2el, + asn_MAP_one_name_tag2el_2, 1, /* Count of tags in the map */ - 0 /* Whether extensible */ + .canonical_order = 0, + .ext_start = -1 /* Extensions start */ }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_one_name_2 = { @@ -251,14 +272,16 @@ asn_TYPE_descriptor_t asn_DEF_one_name_2 = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_one_name_2, 1, /* Elements count */ - &asn_SPC_one_name_2_specs /* Additional specs */ + &asn_SPC_one_name_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_Type1_1[] = { @@ -267,20 +290,23 @@ static asn_TYPE_member_t asn_MBR_Type1_1[] = { .tag_mode = 0, .type = &asn_DEF_one_name_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "one-name" }, }; -static ber_tlv_tag_t asn_DEF_Type1_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Type1_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Type1_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Type1_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* another-name at 27 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Type1_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Type1_specs_1 = { sizeof(struct Type1), offsetof(struct Type1, _asn_ctx), - asn_MAP_Type1_1_tag2el, + asn_MAP_Type1_tag2el_1, 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -294,16 +320,18 @@ asn_TYPE_descriptor_t asn_DEF_Type1 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Type1_1_tags, - sizeof(asn_DEF_Type1_1_tags) - /sizeof(asn_DEF_Type1_1_tags[0]), /* 1 */ - asn_DEF_Type1_1_tags, /* Same as above */ - sizeof(asn_DEF_Type1_1_tags) - /sizeof(asn_DEF_Type1_1_tags[0]), /* 1 */ + asn_DEF_Type1_tags_1, + sizeof(asn_DEF_Type1_tags_1) + /sizeof(asn_DEF_Type1_tags_1[0]), /* 1 */ + asn_DEF_Type1_tags_1, /* Same as above */ + sizeof(asn_DEF_Type1_tags_1) + /sizeof(asn_DEF_Type1_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Type1_1, 1, /* Elements count */ - &asn_SPC_Type1_1_specs /* Additional specs */ + &asn_SPC_Type1_specs_1 /* Additional specs */ }; @@ -382,7 +410,7 @@ extern asn_TYPE_descriptor_t asn_DEF_Type2; /*** <<< CODE [Type2] >>> ***/ static int -memb_a_3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, +memb_a_constraint_3(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; @@ -413,7 +441,7 @@ memb_a_3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, } static int -memb_a_8_constraint(asn_TYPE_descriptor_t *td, const void *sptr, +memb_a_constraint_8(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; @@ -451,7 +479,9 @@ static asn_TYPE_member_t asn_MBR_another_name_3[] = { .tag = (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), .tag_mode = 0, .type = &asn_DEF_BIT_STRING, - .memb_constraints = memb_a_3_constraint, + .memb_constraints = memb_a_constraint_3, + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "a" }, { ATF_NOFLAGS, 0, offsetof(struct another_name, b), @@ -459,21 +489,24 @@ static asn_TYPE_member_t asn_MBR_another_name_3[] = { .tag_mode = 0, .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "b" }, }; -static ber_tlv_tag_t asn_DEF_another_name_3_tags[] = { +static ber_tlv_tag_t asn_DEF_another_name_tags_3[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_another_name_3_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_another_name_tag2el_3[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* b at 36 */ { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 0, 0, 0 } /* a at 34 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_another_name_3_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_another_name_specs_3 = { sizeof(struct another_name), offsetof(struct another_name, _asn_ctx), - asn_MAP_another_name_3_tag2el, + asn_MAP_another_name_tag2el_3, 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -488,16 +521,18 @@ asn_TYPE_descriptor_t asn_DEF_another_name_3 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_another_name_3_tags, - sizeof(asn_DEF_another_name_3_tags) - /sizeof(asn_DEF_another_name_3_tags[0]), /* 1 */ - asn_DEF_another_name_3_tags, /* Same as above */ - sizeof(asn_DEF_another_name_3_tags) - /sizeof(asn_DEF_another_name_3_tags[0]), /* 1 */ + asn_DEF_another_name_tags_3, + sizeof(asn_DEF_another_name_tags_3) + /sizeof(asn_DEF_another_name_tags_3[0]), /* 1 */ + asn_DEF_another_name_tags_3, /* Same as above */ + sizeof(asn_DEF_another_name_tags_3) + /sizeof(asn_DEF_another_name_tags_3[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_another_name_3, 2, /* Elements count */ - &asn_SPC_another_name_3_specs /* Additional specs */ + &asn_SPC_another_name_specs_3 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_one_name_2[] = { @@ -506,20 +541,23 @@ static asn_TYPE_member_t asn_MBR_one_name_2[] = { .tag_mode = 0, .type = &asn_DEF_another_name_3, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "another-name" }, }; -static ber_tlv_tag_t asn_DEF_one_name_2_tags[] = { +static ber_tlv_tag_t asn_DEF_one_name_tags_2[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_one_name_2_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_one_name_tag2el_2[] = { { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* another-name at 34 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_one_name_2_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_one_name_specs_2 = { sizeof(struct one_name), offsetof(struct one_name, _asn_ctx), - asn_MAP_one_name_2_tag2el, + asn_MAP_one_name_tag2el_2, 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -534,16 +572,18 @@ asn_TYPE_descriptor_t asn_DEF_one_name_2 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_one_name_2_tags, - sizeof(asn_DEF_one_name_2_tags) - /sizeof(asn_DEF_one_name_2_tags[0]), /* 1 */ - asn_DEF_one_name_2_tags, /* Same as above */ - sizeof(asn_DEF_one_name_2_tags) - /sizeof(asn_DEF_one_name_2_tags[0]), /* 1 */ + asn_DEF_one_name_tags_2, + sizeof(asn_DEF_one_name_tags_2) + /sizeof(asn_DEF_one_name_tags_2[0]), /* 1 */ + asn_DEF_one_name_tags_2, /* Same as above */ + sizeof(asn_DEF_one_name_tags_2) + /sizeof(asn_DEF_one_name_tags_2[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_one_name_2, 1, /* Elements count */ - &asn_SPC_one_name_2_specs /* Additional specs */ + &asn_SPC_one_name_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_another_name_8[] = { @@ -551,7 +591,9 @@ static asn_TYPE_member_t asn_MBR_another_name_8[] = { .tag = (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), .tag_mode = 0, .type = &asn_DEF_BIT_STRING, - .memb_constraints = memb_a_8_constraint, + .memb_constraints = memb_a_constraint_8, + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "a" }, { ATF_NOFLAGS, 0, offsetof(struct another_name, b), @@ -559,21 +601,24 @@ static asn_TYPE_member_t asn_MBR_another_name_8[] = { .tag_mode = 0, .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "b" }, }; -static ber_tlv_tag_t asn_DEF_another_name_8_tags[] = { +static ber_tlv_tag_t asn_DEF_another_name_tags_8[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_another_name_8_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_another_name_tag2el_8[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* b at 42 */ { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 0, 0, 0 } /* a at 40 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_another_name_8_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_another_name_specs_8 = { sizeof(struct another_name), offsetof(struct another_name, _asn_ctx), - asn_MAP_another_name_8_tag2el, + asn_MAP_another_name_tag2el_8, 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -588,16 +633,18 @@ asn_TYPE_descriptor_t asn_DEF_another_name_8 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_another_name_8_tags, - sizeof(asn_DEF_another_name_8_tags) - /sizeof(asn_DEF_another_name_8_tags[0]), /* 1 */ - asn_DEF_another_name_8_tags, /* Same as above */ - sizeof(asn_DEF_another_name_8_tags) - /sizeof(asn_DEF_another_name_8_tags[0]), /* 1 */ + asn_DEF_another_name_tags_8, + sizeof(asn_DEF_another_name_tags_8) + /sizeof(asn_DEF_another_name_tags_8[0]), /* 1 */ + asn_DEF_another_name_tags_8, /* Same as above */ + sizeof(asn_DEF_another_name_tags_8) + /sizeof(asn_DEF_another_name_tags_8[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_another_name_8, 2, /* Elements count */ - &asn_SPC_another_name_8_specs /* Additional specs */ + &asn_SPC_another_name_specs_8 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_two_name_7[] = { @@ -606,28 +653,30 @@ static asn_TYPE_member_t asn_MBR_two_name_7[] = { .tag_mode = 0, .type = &asn_DEF_another_name_8, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "another-name" }, }; -static ber_tlv_tag_t asn_DEF_two_name_7_tags[] = { +static ber_tlv_tag_t asn_DEF_two_name_tags_7[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_two_name_7_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_two_name_tag2el_7[] = { { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* another-name at 40 */ }; -static uint8_t asn_MAP_two_name_7_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { +static uint8_t asn_MAP_two_name_mmap_7[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { (1 << 7) }; -static asn_SET_specifics_t asn_SPC_two_name_7_specs = { +static asn_SET_specifics_t asn_SPC_two_name_specs_7 = { sizeof(struct two_name), offsetof(struct two_name, _asn_ctx), offsetof(struct two_name, _presence_map), - asn_MAP_two_name_7_tag2el, + asn_MAP_two_name_tag2el_7, 1, /* Count of tags in the map */ - asn_MAP_two_name_7_tag2el, /* Same as above */ + asn_MAP_two_name_tag2el_7, /* Same as above */ 1, /* Count of tags in the CXER map */ 0, /* Whether extensible */ - (unsigned int *)asn_MAP_two_name_7_mmap /* Mandatory elements map */ + (unsigned int *)asn_MAP_two_name_mmap_7 /* Mandatory elements map */ }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_two_name_7 = { @@ -640,16 +689,18 @@ asn_TYPE_descriptor_t asn_DEF_two_name_7 = { SET_encode_der, SET_decode_xer, SET_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_two_name_7_tags, - sizeof(asn_DEF_two_name_7_tags) - /sizeof(asn_DEF_two_name_7_tags[0]), /* 1 */ - asn_DEF_two_name_7_tags, /* Same as above */ - sizeof(asn_DEF_two_name_7_tags) - /sizeof(asn_DEF_two_name_7_tags[0]), /* 1 */ + asn_DEF_two_name_tags_7, + sizeof(asn_DEF_two_name_tags_7) + /sizeof(asn_DEF_two_name_tags_7[0]), /* 1 */ + asn_DEF_two_name_tags_7, /* Same as above */ + sizeof(asn_DEF_two_name_tags_7) + /sizeof(asn_DEF_two_name_tags_7[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_two_name_7, 1, /* Elements count */ - &asn_SPC_two_name_7_specs /* Additional specs */ + &asn_SPC_two_name_specs_7 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_Type2_1[] = { @@ -658,6 +709,8 @@ static asn_TYPE_member_t asn_MBR_Type2_1[] = { .tag_mode = 0, .type = &asn_DEF_one_name_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "one-name" }, { ATF_NOFLAGS, 0, offsetof(struct Type2, choice.two_name), @@ -665,21 +718,24 @@ static asn_TYPE_member_t asn_MBR_Type2_1[] = { .tag_mode = 0, .type = &asn_DEF_two_name_7, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "two-name" }, }; -static asn_TYPE_tag2member_t asn_MAP_Type2_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Type2_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 }, /* one-name at 37 */ { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 1, 0, 0 } /* two-name at 43 */ }; -static asn_CHOICE_specifics_t asn_SPC_Type2_1_specs = { +static asn_CHOICE_specifics_t asn_SPC_Type2_specs_1 = { sizeof(struct Type2), offsetof(struct Type2, _asn_ctx), offsetof(struct Type2, present), sizeof(((struct Type2 *)0)->present), - asn_MAP_Type2_1_tag2el, + asn_MAP_Type2_tag2el_1, 2, /* Count of tags in the map */ - 0 /* Whether extensible */ + .canonical_order = 0, + .ext_start = -1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_Type2 = { "Type2", @@ -691,13 +747,15 @@ asn_TYPE_descriptor_t asn_DEF_Type2 = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_Type2_1, 2, /* Elements count */ - &asn_SPC_Type2_1_specs /* Additional specs */ + &asn_SPC_Type2_specs_1 /* Additional specs */ }; diff --git a/tests/73-circular-OK.asn1.-P b/tests/73-circular-OK.asn1.-P index 596163da7..4e29c9bb4 100644 --- a/tests/73-circular-OK.asn1.-P +++ b/tests/73-circular-OK.asn1.-P @@ -39,13 +39,15 @@ static asn_TYPE_member_t asn_MBR_data_2[] = { .tag_mode = 0, .type = &asn_DEF_EpytRef, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_data_2_tags[] = { +static ber_tlv_tag_t asn_DEF_data_tags_2[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_data_2_specs = { +static asn_SET_OF_specifics_t asn_SPC_data_specs_2 = { sizeof(struct data), offsetof(struct data, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ @@ -61,16 +63,18 @@ asn_TYPE_descriptor_t asn_DEF_data_2 = { SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_data_2_tags, - sizeof(asn_DEF_data_2_tags) - /sizeof(asn_DEF_data_2_tags[0]), /* 1 */ - asn_DEF_data_2_tags, /* Same as above */ - sizeof(asn_DEF_data_2_tags) - /sizeof(asn_DEF_data_2_tags[0]), /* 1 */ + asn_DEF_data_tags_2, + sizeof(asn_DEF_data_tags_2) + /sizeof(asn_DEF_data_tags_2[0]), /* 1 */ + asn_DEF_data_tags_2, /* Same as above */ + sizeof(asn_DEF_data_tags_2) + /sizeof(asn_DEF_data_tags_2[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_data_2, 1, /* Single element */ - &asn_SPC_data_2_specs /* Additional specs */ + &asn_SPC_data_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_Type_1[] = { @@ -79,20 +83,23 @@ static asn_TYPE_member_t asn_MBR_Type_1[] = { .tag_mode = 0, .type = &asn_DEF_data_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "data" }, }; -static ber_tlv_tag_t asn_DEF_Type_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Type_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Type_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Type_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* data at 16 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Type_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Type_specs_1 = { sizeof(struct Type), offsetof(struct Type, _asn_ctx), - asn_MAP_Type_1_tag2el, + asn_MAP_Type_tag2el_1, 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -106,16 +113,18 @@ asn_TYPE_descriptor_t asn_DEF_Type = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Type_1_tags, - sizeof(asn_DEF_Type_1_tags) - /sizeof(asn_DEF_Type_1_tags[0]), /* 1 */ - asn_DEF_Type_1_tags, /* Same as above */ - sizeof(asn_DEF_Type_1_tags) - /sizeof(asn_DEF_Type_1_tags[0]), /* 1 */ + asn_DEF_Type_tags_1, + sizeof(asn_DEF_Type_tags_1) + /sizeof(asn_DEF_Type_tags_1[0]), /* 1 */ + asn_DEF_Type_tags_1, /* Same as above */ + sizeof(asn_DEF_Type_tags_1) + /sizeof(asn_DEF_Type_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Type_1, 1, /* Elements count */ - &asn_SPC_Type_1_specs /* Additional specs */ + &asn_SPC_Type_specs_1 /* Additional specs */ }; @@ -160,6 +169,9 @@ EpytRef_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_Epyt.der_encoder; td->xer_decoder = asn_DEF_Epyt.xer_decoder; td->xer_encoder = asn_DEF_Epyt.xer_encoder; + td->uper_decoder = asn_DEF_Epyt.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Epyt.per_constraints; td->elements = asn_DEF_Epyt.elements; td->elements_count = asn_DEF_Epyt.elements_count; td->specifics = asn_DEF_Epyt.specifics; @@ -212,7 +224,7 @@ EpytRef_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [EpytRef] >>> ***/ -static ber_tlv_tag_t asn_DEF_EpytRef_1_tags[] = { +static ber_tlv_tag_t asn_DEF_EpytRef_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; asn_TYPE_descriptor_t asn_DEF_EpytRef = { @@ -225,13 +237,15 @@ asn_TYPE_descriptor_t asn_DEF_EpytRef = { EpytRef_encode_der, EpytRef_decode_xer, EpytRef_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_EpytRef_1_tags, - sizeof(asn_DEF_EpytRef_1_tags) - /sizeof(asn_DEF_EpytRef_1_tags[0]), /* 1 */ - asn_DEF_EpytRef_1_tags, /* Same as above */ - sizeof(asn_DEF_EpytRef_1_tags) - /sizeof(asn_DEF_EpytRef_1_tags[0]), /* 1 */ + asn_DEF_EpytRef_tags_1, + sizeof(asn_DEF_EpytRef_tags_1) + /sizeof(asn_DEF_EpytRef_tags_1[0]), /* 1 */ + asn_DEF_EpytRef_tags_1, /* Same as above */ + sizeof(asn_DEF_EpytRef_tags_1) + /sizeof(asn_DEF_EpytRef_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* Defined elsewhere */ 0 /* No specifics */ }; @@ -281,13 +295,15 @@ static asn_TYPE_member_t asn_MBR_stype_2[] = { .tag_mode = 0, .type = &asn_DEF_Type, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_stype_2_tags[] = { +static ber_tlv_tag_t asn_DEF_stype_tags_2[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_stype_2_specs = { +static asn_SET_OF_specifics_t asn_SPC_stype_specs_2 = { sizeof(struct stype), offsetof(struct stype, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ @@ -303,16 +319,18 @@ asn_TYPE_descriptor_t asn_DEF_stype_2 = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_stype_2_tags, - sizeof(asn_DEF_stype_2_tags) - /sizeof(asn_DEF_stype_2_tags[0]), /* 1 */ - asn_DEF_stype_2_tags, /* Same as above */ - sizeof(asn_DEF_stype_2_tags) - /sizeof(asn_DEF_stype_2_tags[0]), /* 1 */ + asn_DEF_stype_tags_2, + sizeof(asn_DEF_stype_tags_2) + /sizeof(asn_DEF_stype_tags_2[0]), /* 1 */ + asn_DEF_stype_tags_2, /* Same as above */ + sizeof(asn_DEF_stype_tags_2) + /sizeof(asn_DEF_stype_tags_2[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_stype_2, 1, /* Single element */ - &asn_SPC_stype_2_specs /* Additional specs */ + &asn_SPC_stype_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_Epyt_1[] = { @@ -321,6 +339,8 @@ static asn_TYPE_member_t asn_MBR_Epyt_1[] = { .tag_mode = 0, .type = &asn_DEF_stype_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "stype" }, { ATF_POINTER, 2, offsetof(struct Epyt, type), @@ -328,6 +348,8 @@ static asn_TYPE_member_t asn_MBR_Epyt_1[] = { .tag_mode = 0, .type = &asn_DEF_Type, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "type" }, { ATF_POINTER, 1, offsetof(struct Epyt, ypet), @@ -335,22 +357,25 @@ static asn_TYPE_member_t asn_MBR_Epyt_1[] = { .tag_mode = 0, .type = &asn_DEF_Ypet, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "ypet" }, }; -static ber_tlv_tag_t asn_DEF_Epyt_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Epyt_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Epyt_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Epyt_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* type at 22 */ { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0, 0, 1 }, /* stype at 21 */ { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 2, -1, 0 } /* ypet at 23 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Epyt_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Epyt_specs_1 = { sizeof(struct Epyt), offsetof(struct Epyt, _asn_ctx), - asn_MAP_Epyt_1_tag2el, + asn_MAP_Epyt_tag2el_1, 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -364,16 +389,18 @@ asn_TYPE_descriptor_t asn_DEF_Epyt = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Epyt_1_tags, - sizeof(asn_DEF_Epyt_1_tags) - /sizeof(asn_DEF_Epyt_1_tags[0]), /* 1 */ - asn_DEF_Epyt_1_tags, /* Same as above */ - sizeof(asn_DEF_Epyt_1_tags) - /sizeof(asn_DEF_Epyt_1_tags[0]), /* 1 */ + asn_DEF_Epyt_tags_1, + sizeof(asn_DEF_Epyt_tags_1) + /sizeof(asn_DEF_Epyt_tags_1[0]), /* 1 */ + asn_DEF_Epyt_tags_1, /* Same as above */ + sizeof(asn_DEF_Epyt_tags_1) + /sizeof(asn_DEF_Epyt_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Epyt_1, 3, /* Elements count */ - &asn_SPC_Epyt_1_specs /* Additional specs */ + &asn_SPC_Epyt_specs_1 /* Additional specs */ }; @@ -466,7 +493,7 @@ static int check_permitted_alphabet_7(const void *sptr) { /*** <<< CODE [Ypet] >>> ***/ static int -memb_patest1_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, +memb_patest1_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const IA5String_t *st = (const IA5String_t *)sptr; @@ -490,7 +517,7 @@ memb_patest1_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, } static int -memb_patest2_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, +memb_patest2_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { const IA5String_t *st = (const IA5String_t *)sptr; @@ -516,19 +543,32 @@ memb_patest2_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, /*** <<< STAT-DEFS [Ypet] >>> ***/ +static int asn_DFL_3_set_7(void **sptr) { + INTEGER_t *st = *sptr; + + if(!st) { + st = (*sptr = CALLOC(1, sizeof(*st))); + if(!st) return -1; + } + + /* Install default value 7 */ + return asn_long2INTEGER(st, 7); +} static asn_TYPE_member_t asn_MBR_senums_4[] = { { ATF_POINTER, 0, 0, .tag = (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), .tag_mode = 0, .type = &asn_DEF_EnumType, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_senums_4_tags[] = { +static ber_tlv_tag_t asn_DEF_senums_tags_4[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_senums_4_specs = { +static asn_SET_OF_specifics_t asn_SPC_senums_specs_4 = { sizeof(struct senums), offsetof(struct senums, _asn_ctx), 1, /* XER encoding is XMLValueList */ @@ -544,16 +584,18 @@ asn_TYPE_descriptor_t asn_DEF_senums_4 = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_senums_4_tags, - sizeof(asn_DEF_senums_4_tags) - /sizeof(asn_DEF_senums_4_tags[0]), /* 1 */ - asn_DEF_senums_4_tags, /* Same as above */ - sizeof(asn_DEF_senums_4_tags) - /sizeof(asn_DEF_senums_4_tags[0]), /* 1 */ + asn_DEF_senums_tags_4, + sizeof(asn_DEF_senums_tags_4) + /sizeof(asn_DEF_senums_tags_4[0]), /* 1 */ + asn_DEF_senums_tags_4, /* Same as above */ + sizeof(asn_DEF_senums_tags_4) + /sizeof(asn_DEF_senums_tags_4[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_senums_4, 1, /* Single element */ - &asn_SPC_senums_4_specs /* Additional specs */ + &asn_SPC_senums_specs_4 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_Ypet_1[] = { @@ -562,6 +604,8 @@ static asn_TYPE_member_t asn_MBR_Ypet_1[] = { .tag_mode = 0, .type = &asn_DEF_Epyt, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "epyt" }, { ATF_POINTER, 1, offsetof(struct Ypet, plain), @@ -569,6 +613,8 @@ static asn_TYPE_member_t asn_MBR_Ypet_1[] = { .tag_mode = 0, .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = asn_DFL_3_set_7, /* DEFAULT 7 */ .name = "plain" }, { ATF_NOFLAGS, 0, offsetof(struct Ypet, senums), @@ -576,46 +622,52 @@ static asn_TYPE_member_t asn_MBR_Ypet_1[] = { .tag_mode = 0, .type = &asn_DEF_senums_4, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "senums" }, { ATF_NOFLAGS, 0, offsetof(struct Ypet, patest1), .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), .tag_mode = +1, /* EXPLICIT tag at current level */ .type = &asn_DEF_IA5String, - .memb_constraints = memb_patest1_1_constraint, + .memb_constraints = memb_patest1_constraint_1, + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "patest1" }, { ATF_NOFLAGS, 0, offsetof(struct Ypet, patest2), .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), .tag_mode = +1, /* EXPLICIT tag at current level */ .type = &asn_DEF_IA5String, - .memb_constraints = memb_patest2_1_constraint, + .memb_constraints = memb_patest2_constraint_1, + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "patest2" }, }; -static ber_tlv_tag_t asn_DEF_Ypet_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Ypet_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Ypet_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Ypet_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* plain at 28 */ { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 }, /* epyt at 27 */ { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 2, 0, 0 }, /* senums at 29 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 3, 0, 0 }, /* patest1 at 30 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 4, 0, 0 } /* patest2 at 31 */ }; -static uint8_t asn_MAP_Ypet_1_mmap[(5 + (8 * sizeof(unsigned int)) - 1) / 8] = { +static uint8_t asn_MAP_Ypet_mmap_1[(5 + (8 * sizeof(unsigned int)) - 1) / 8] = { (1 << 7) | (0 << 6) | (1 << 5) | (1 << 4) | (1 << 3) }; -static asn_SET_specifics_t asn_SPC_Ypet_1_specs = { +static asn_SET_specifics_t asn_SPC_Ypet_specs_1 = { sizeof(struct Ypet), offsetof(struct Ypet, _asn_ctx), offsetof(struct Ypet, _presence_map), - asn_MAP_Ypet_1_tag2el, + asn_MAP_Ypet_tag2el_1, 5, /* Count of tags in the map */ - asn_MAP_Ypet_1_tag2el, /* Same as above */ + asn_MAP_Ypet_tag2el_1, /* Same as above */ 5, /* Count of tags in the CXER map */ 0, /* Whether extensible */ - (unsigned int *)asn_MAP_Ypet_1_mmap /* Mandatory elements map */ + (unsigned int *)asn_MAP_Ypet_mmap_1 /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_Ypet = { "Ypet", @@ -627,16 +679,18 @@ asn_TYPE_descriptor_t asn_DEF_Ypet = { SET_encode_der, SET_decode_xer, SET_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Ypet_1_tags, - sizeof(asn_DEF_Ypet_1_tags) - /sizeof(asn_DEF_Ypet_1_tags[0]), /* 1 */ - asn_DEF_Ypet_1_tags, /* Same as above */ - sizeof(asn_DEF_Ypet_1_tags) - /sizeof(asn_DEF_Ypet_1_tags[0]), /* 1 */ + asn_DEF_Ypet_tags_1, + sizeof(asn_DEF_Ypet_tags_1) + /sizeof(asn_DEF_Ypet_tags_1[0]), /* 1 */ + asn_DEF_Ypet_tags_1, /* Same as above */ + sizeof(asn_DEF_Ypet_tags_1) + /sizeof(asn_DEF_Ypet_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Ypet_1, 5, /* Elements count */ - &asn_SPC_Ypet_1_specs /* Additional specs */ + &asn_SPC_Ypet_specs_1 /* Additional specs */ }; @@ -688,6 +742,9 @@ EnumType_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; + td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ @@ -740,22 +797,22 @@ EnumType_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [EnumType] >>> ***/ -static asn_INTEGER_enum_map_t asn_MAP_EnumType_1_value2enum[] = { +static asn_INTEGER_enum_map_t asn_MAP_EnumType_value2enum_1[] = { { 0, 3, "one" }, { 1, 3, "two" } }; -static unsigned int asn_MAP_EnumType_1_enum2value[] = { +static unsigned int asn_MAP_EnumType_enum2value_1[] = { 0, /* one(0) */ 1 /* two(1) */ }; -static asn_INTEGER_specifics_t asn_SPC_EnumType_1_specs = { - asn_MAP_EnumType_1_value2enum, /* "tag" => N; sorted by tag */ - asn_MAP_EnumType_1_enum2value, /* N => "tag"; sorted by N */ +static asn_INTEGER_specifics_t asn_SPC_EnumType_specs_1 = { + asn_MAP_EnumType_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_EnumType_enum2value_1, /* N => "tag"; sorted by N */ 2, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ 1 /* Strict enumeration */ }; -static ber_tlv_tag_t asn_DEF_EnumType_1_tags[] = { +static ber_tlv_tag_t asn_DEF_EnumType_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_EnumType = { @@ -768,14 +825,16 @@ asn_TYPE_descriptor_t asn_DEF_EnumType = { EnumType_encode_der, EnumType_decode_xer, EnumType_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_EnumType_1_tags, - sizeof(asn_DEF_EnumType_1_tags) - /sizeof(asn_DEF_EnumType_1_tags[0]), /* 1 */ - asn_DEF_EnumType_1_tags, /* Same as above */ - sizeof(asn_DEF_EnumType_1_tags) - /sizeof(asn_DEF_EnumType_1_tags[0]), /* 1 */ + asn_DEF_EnumType_tags_1, + sizeof(asn_DEF_EnumType_tags_1) + /sizeof(asn_DEF_EnumType_tags_1[0]), /* 1 */ + asn_DEF_EnumType_tags_1, /* Same as above */ + sizeof(asn_DEF_EnumType_tags_1) + /sizeof(asn_DEF_EnumType_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* Defined elsewhere */ - &asn_SPC_EnumType_1_specs /* Additional specs */ + &asn_SPC_EnumType_specs_1 /* Additional specs */ }; diff --git a/tests/84-param-tags-OK.asn1.-P b/tests/84-param-tags-OK.asn1.-P index 65987642e..f7353dbff 100644 --- a/tests/84-param-tags-OK.asn1.-P +++ b/tests/84-param-tags-OK.asn1.-P @@ -20,13 +20,13 @@ typedef struct TestChoice { TestChoice_PR present; union TestChoice_u { struct type1 { - long *common /* DEFAULT 0 */; + long common /* DEFAULT 0 */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } type1; struct type2 { - BOOLEAN_t *common /* DEFAULT 0 */; + BOOLEAN_t common /* DEFAULT 0 */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; @@ -44,7 +44,7 @@ extern asn_TYPE_descriptor_t asn_DEF_TestChoice; /*** <<< CODE [TestChoice] >>> ***/ static int -memb_common_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, +memb_common_constraint_2(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { long value; @@ -71,26 +71,41 @@ memb_common_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, /*** <<< STAT-DEFS [TestChoice] >>> ***/ +static int asn_DFL_3_set_0(void **sptr) { + long *st = *sptr; + + if(!st) { + st = (*sptr = CALLOC(1, sizeof(*st))); + if(!st) return -1; + } + + /* Install default value 0 */ + *st = 0; + return 0; +} static asn_TYPE_member_t asn_MBR_type1_2[] = { - { ATF_POINTER, 1, offsetof(struct type1, common), + { ATF_NOFLAGS, 1, offsetof(struct type1, common), .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), .tag_mode = 0, .type = &asn_DEF_NativeInteger, - .memb_constraints = memb_common_2_constraint, + .memb_constraints = memb_common_constraint_2, + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = asn_DFL_3_set_0, /* DEFAULT 0 */ .name = "common" }, }; -static ber_tlv_tag_t asn_DEF_type1_2_tags[] = { +static ber_tlv_tag_t asn_DEF_type1_tags_2[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_type1_2_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_type1_tag2el_2[] = { { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 } /* common at 20 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_type1_2_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_type1_specs_2 = { sizeof(struct type1), offsetof(struct type1, _asn_ctx), - asn_MAP_type1_2_tag2el, + asn_MAP_type1_tag2el_2, 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -105,39 +120,56 @@ asn_TYPE_descriptor_t asn_DEF_type1_2 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_type1_2_tags, - sizeof(asn_DEF_type1_2_tags) - /sizeof(asn_DEF_type1_2_tags[0]), /* 1 */ - asn_DEF_type1_2_tags, /* Same as above */ - sizeof(asn_DEF_type1_2_tags) - /sizeof(asn_DEF_type1_2_tags[0]), /* 1 */ + asn_DEF_type1_tags_2, + sizeof(asn_DEF_type1_tags_2) + /sizeof(asn_DEF_type1_tags_2[0]), /* 1 */ + asn_DEF_type1_tags_2, /* Same as above */ + sizeof(asn_DEF_type1_tags_2) + /sizeof(asn_DEF_type1_tags_2[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_type1_2, 1, /* Elements count */ - &asn_SPC_type1_2_specs /* Additional specs */ + &asn_SPC_type1_specs_2 /* Additional specs */ }; +static int asn_DFL_5_set_0(void **sptr) { + BOOLEAN_t *st = *sptr; + + if(!st) { + st = (*sptr = CALLOC(1, sizeof(*st))); + if(!st) return -1; + } + + /* Install default value 0 */ + *st = 0; + return 0; +} static asn_TYPE_member_t asn_MBR_type2_4[] = { - { ATF_POINTER, 1, offsetof(struct type2, common), + { ATF_NOFLAGS, 1, offsetof(struct type2, common), .tag = (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), .tag_mode = 0, .type = &asn_DEF_BOOLEAN, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = asn_DFL_5_set_0, /* DEFAULT 0 */ .name = "common" }, }; -static ber_tlv_tag_t asn_DEF_type2_4_tags[] = { +static ber_tlv_tag_t asn_DEF_type2_tags_4[] = { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_type2_4_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_type2_tag2el_4[] = { { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 0, 0, 0 } /* common at 21 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_type2_4_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_type2_specs_4 = { sizeof(struct type2), offsetof(struct type2, _asn_ctx), - asn_MAP_type2_4_tag2el, + asn_MAP_type2_tag2el_4, 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -152,16 +184,18 @@ asn_TYPE_descriptor_t asn_DEF_type2_4 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_type2_4_tags, - sizeof(asn_DEF_type2_4_tags) - /sizeof(asn_DEF_type2_4_tags[0]) - 1, /* 1 */ - asn_DEF_type2_4_tags, /* Same as above */ - sizeof(asn_DEF_type2_4_tags) - /sizeof(asn_DEF_type2_4_tags[0]), /* 2 */ + asn_DEF_type2_tags_4, + sizeof(asn_DEF_type2_tags_4) + /sizeof(asn_DEF_type2_tags_4[0]) - 1, /* 1 */ + asn_DEF_type2_tags_4, /* Same as above */ + sizeof(asn_DEF_type2_tags_4) + /sizeof(asn_DEF_type2_tags_4[0]), /* 2 */ + 0, /* No PER visible constraints */ asn_MBR_type2_4, 1, /* Elements count */ - &asn_SPC_type2_4_specs /* Additional specs */ + &asn_SPC_type2_specs_4 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_TestChoice_1[] = { @@ -170,6 +204,8 @@ static asn_TYPE_member_t asn_MBR_TestChoice_1[] = { .tag_mode = 0, .type = &asn_DEF_type1_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "type1" }, { ATF_NOFLAGS, 0, offsetof(struct TestChoice, choice.type2), @@ -177,21 +213,24 @@ static asn_TYPE_member_t asn_MBR_TestChoice_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_type2_4, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "type2" }, }; -static asn_TYPE_tag2member_t asn_MAP_TestChoice_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_TestChoice_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 }, /* type1 at 16 */ { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 } /* type2 at 16 */ }; -static asn_CHOICE_specifics_t asn_SPC_TestChoice_1_specs = { +static asn_CHOICE_specifics_t asn_SPC_TestChoice_specs_1 = { sizeof(struct TestChoice), offsetof(struct TestChoice, _asn_ctx), offsetof(struct TestChoice, present), sizeof(((struct TestChoice *)0)->present), - asn_MAP_TestChoice_1_tag2el, + asn_MAP_TestChoice_tag2el_1, 2, /* Count of tags in the map */ - 0 /* Whether extensible */ + .canonical_order = 0, + .ext_start = -1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_TestChoice = { "TestChoice", @@ -203,14 +242,16 @@ asn_TYPE_descriptor_t asn_DEF_TestChoice = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_TestChoice_1, 2, /* Elements count */ - &asn_SPC_TestChoice_1_specs /* Additional specs */ + &asn_SPC_TestChoice_specs_1 /* Additional specs */ }; @@ -259,7 +300,7 @@ extern asn_TYPE_descriptor_t asn_DEF_AutoChoice; /*** <<< CODE [AutoChoice] >>> ***/ static int -memb_common_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, +memb_common_constraint_2(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { long value; @@ -284,7 +325,7 @@ memb_common_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, } static int -memb_common_4_constraint(asn_TYPE_descriptor_t *td, const void *sptr, +memb_common_constraint_4(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_consume_bytes_f *app_errlog, void *app_key) { BOOLEAN_t value; @@ -316,22 +357,25 @@ static asn_TYPE_member_t asn_MBR_type1_2[] = { .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_NativeInteger, - .memb_constraints = memb_common_2_constraint, + .memb_constraints = memb_common_constraint_2, + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "common" }, }; -static ber_tlv_tag_t asn_DEF_type1_2_tags[] = { +static ber_tlv_tag_t asn_DEF_type1_tags_2[] = { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_type1_2_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_type1_tag2el_2[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* common at 37 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_type1_2_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_type1_specs_2 = { sizeof(struct type1), offsetof(struct type1, _asn_ctx), - asn_MAP_type1_2_tag2el, + asn_MAP_type1_tag2el_2, 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -346,16 +390,18 @@ asn_TYPE_descriptor_t asn_DEF_type1_2 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_type1_2_tags, - sizeof(asn_DEF_type1_2_tags) - /sizeof(asn_DEF_type1_2_tags[0]) - 1, /* 1 */ - asn_DEF_type1_2_tags, /* Same as above */ - sizeof(asn_DEF_type1_2_tags) - /sizeof(asn_DEF_type1_2_tags[0]), /* 2 */ + asn_DEF_type1_tags_2, + sizeof(asn_DEF_type1_tags_2) + /sizeof(asn_DEF_type1_tags_2[0]) - 1, /* 1 */ + asn_DEF_type1_tags_2, /* Same as above */ + sizeof(asn_DEF_type1_tags_2) + /sizeof(asn_DEF_type1_tags_2[0]), /* 2 */ + 0, /* No PER visible constraints */ asn_MBR_type1_2, 1, /* Elements count */ - &asn_SPC_type1_2_specs /* Additional specs */ + &asn_SPC_type1_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_type2_4[] = { @@ -363,22 +409,25 @@ static asn_TYPE_member_t asn_MBR_type2_4[] = { .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_BOOLEAN, - .memb_constraints = memb_common_4_constraint, + .memb_constraints = memb_common_constraint_4, + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "common" }, }; -static ber_tlv_tag_t asn_DEF_type2_4_tags[] = { +static ber_tlv_tag_t asn_DEF_type2_tags_4[] = { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_type2_4_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_type2_tag2el_4[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* common at 38 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_type2_4_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_type2_specs_4 = { sizeof(struct type2), offsetof(struct type2, _asn_ctx), - asn_MAP_type2_4_tag2el, + asn_MAP_type2_tag2el_4, 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -393,16 +442,18 @@ asn_TYPE_descriptor_t asn_DEF_type2_4 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_type2_4_tags, - sizeof(asn_DEF_type2_4_tags) - /sizeof(asn_DEF_type2_4_tags[0]) - 1, /* 1 */ - asn_DEF_type2_4_tags, /* Same as above */ - sizeof(asn_DEF_type2_4_tags) - /sizeof(asn_DEF_type2_4_tags[0]), /* 2 */ + asn_DEF_type2_tags_4, + sizeof(asn_DEF_type2_tags_4) + /sizeof(asn_DEF_type2_tags_4[0]) - 1, /* 1 */ + asn_DEF_type2_tags_4, /* Same as above */ + sizeof(asn_DEF_type2_tags_4) + /sizeof(asn_DEF_type2_tags_4[0]), /* 2 */ + 0, /* No PER visible constraints */ asn_MBR_type2_4, 1, /* Elements count */ - &asn_SPC_type2_4_specs /* Additional specs */ + &asn_SPC_type2_specs_4 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_AutoChoice_1[] = { @@ -411,6 +462,8 @@ static asn_TYPE_member_t asn_MBR_AutoChoice_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_type1_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "type1" }, { ATF_NOFLAGS, 0, offsetof(struct AutoChoice, choice.type2), @@ -418,21 +471,24 @@ static asn_TYPE_member_t asn_MBR_AutoChoice_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_type2_4, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "type2" }, }; -static asn_TYPE_tag2member_t asn_MAP_AutoChoice_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_AutoChoice_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* type1 at 34 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* type2 at 34 */ }; -static asn_CHOICE_specifics_t asn_SPC_AutoChoice_1_specs = { +static asn_CHOICE_specifics_t asn_SPC_AutoChoice_specs_1 = { sizeof(struct AutoChoice), offsetof(struct AutoChoice, _asn_ctx), offsetof(struct AutoChoice, present), sizeof(((struct AutoChoice *)0)->present), - asn_MAP_AutoChoice_1_tag2el, + asn_MAP_AutoChoice_tag2el_1, 2, /* Count of tags in the map */ - 0 /* Whether extensible */ + .canonical_order = 0, + .ext_start = -1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_AutoChoice = { "AutoChoice", @@ -444,13 +500,15 @@ asn_TYPE_descriptor_t asn_DEF_AutoChoice = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_AutoChoice_1, 2, /* Elements count */ - &asn_SPC_AutoChoice_1_specs /* Additional specs */ + &asn_SPC_AutoChoice_specs_1 /* Additional specs */ }; diff --git a/tests/88-integer-enum-OK.asn1.-P b/tests/88-integer-enum-OK.asn1.-P index d87bda5e5..6b73d313f 100644 --- a/tests/88-integer-enum-OK.asn1.-P +++ b/tests/88-integer-enum-OK.asn1.-P @@ -47,6 +47,9 @@ T_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -99,7 +102,7 @@ T_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [T] >>> ***/ -static ber_tlv_tag_t asn_DEF_T_1_tags[] = { +static ber_tlv_tag_t asn_DEF_T_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_T = { @@ -112,13 +115,15 @@ asn_TYPE_descriptor_t asn_DEF_T = { T_encode_der, T_decode_xer, T_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_T_1_tags, - sizeof(asn_DEF_T_1_tags) - /sizeof(asn_DEF_T_1_tags[0]), /* 1 */ - asn_DEF_T_1_tags, /* Same as above */ - sizeof(asn_DEF_T_1_tags) - /sizeof(asn_DEF_T_1_tags[0]), /* 1 */ + asn_DEF_T_tags_1, + sizeof(asn_DEF_T_tags_1) + /sizeof(asn_DEF_T_tags_1[0]), /* 1 */ + asn_DEF_T_tags_1, /* Same as above */ + sizeof(asn_DEF_T_tags_1) + /sizeof(asn_DEF_T_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* Defined elsewhere */ 0 /* No specifics */ }; diff --git a/tests/89-bit-string-enum-OK.asn1.-P b/tests/89-bit-string-enum-OK.asn1.-P index 158a4449c..0514dadc1 100644 --- a/tests/89-bit-string-enum-OK.asn1.-P +++ b/tests/89-bit-string-enum-OK.asn1.-P @@ -39,20 +39,23 @@ static asn_TYPE_member_t asn_MBR_T_1[] = { .tag_mode = 0, .type = &asn_DEF_BIT_STRING, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "bs" }, }; -static asn_TYPE_tag2member_t asn_MAP_T_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_T_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 0, 0, 0 } /* bs at 15 */ }; -static asn_CHOICE_specifics_t asn_SPC_T_1_specs = { +static asn_CHOICE_specifics_t asn_SPC_T_specs_1 = { sizeof(struct T), offsetof(struct T, _asn_ctx), offsetof(struct T, present), sizeof(((struct T *)0)->present), - asn_MAP_T_1_tag2el, + asn_MAP_T_tag2el_1, 1, /* Count of tags in the map */ - 0 /* Whether extensible */ + .canonical_order = 0, + .ext_start = -1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_T = { "T", @@ -64,13 +67,15 @@ asn_TYPE_descriptor_t asn_DEF_T = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_T_1, 1, /* Elements count */ - &asn_SPC_T_1_specs /* Additional specs */ + &asn_SPC_T_specs_1 /* Additional specs */ }; diff --git a/tests/89-bit-string-enum-OK.asn1.-Pfcompound-names b/tests/89-bit-string-enum-OK.asn1.-Pfcompound-names index 8f5d06c3e..dbea3a304 100644 --- a/tests/89-bit-string-enum-OK.asn1.-Pfcompound-names +++ b/tests/89-bit-string-enum-OK.asn1.-Pfcompound-names @@ -39,20 +39,23 @@ static asn_TYPE_member_t asn_MBR_T_1[] = { .tag_mode = 0, .type = &asn_DEF_BIT_STRING, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "bs" }, }; -static asn_TYPE_tag2member_t asn_MAP_T_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_T_tag2el_1[] = { { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 0, 0, 0 } /* bs at 15 */ }; -static asn_CHOICE_specifics_t asn_SPC_T_1_specs = { +static asn_CHOICE_specifics_t asn_SPC_T_specs_1 = { sizeof(struct T), offsetof(struct T, _asn_ctx), offsetof(struct T, present), sizeof(((struct T *)0)->present), - asn_MAP_T_1_tag2el, + asn_MAP_T_tag2el_1, 1, /* Count of tags in the map */ - 0 /* Whether extensible */ + .canonical_order = 0, + .ext_start = -1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_T = { "T", @@ -64,13 +67,15 @@ asn_TYPE_descriptor_t asn_DEF_T = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_T_1, 1, /* Elements count */ - &asn_SPC_T_1_specs /* Additional specs */ + &asn_SPC_T_specs_1 /* Additional specs */ }; diff --git a/tests/90-cond-int-type-OK.asn1.-P b/tests/90-cond-int-type-OK.asn1.-P index 89acc3fb7..9e03bc231 100644 --- a/tests/90-cond-int-type-OK.asn1.-P +++ b/tests/90-cond-int-type-OK.asn1.-P @@ -40,6 +40,9 @@ CN_IntegerUnlimited_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -92,7 +95,7 @@ CN_IntegerUnlimited_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [CN-IntegerUnlimited] >>> ***/ -static ber_tlv_tag_t asn_DEF_CN_IntegerUnlimited_1_tags[] = { +static ber_tlv_tag_t asn_DEF_CN_IntegerUnlimited_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_CN_IntegerUnlimited = { @@ -105,13 +108,15 @@ asn_TYPE_descriptor_t asn_DEF_CN_IntegerUnlimited = { CN_IntegerUnlimited_encode_der, CN_IntegerUnlimited_decode_xer, CN_IntegerUnlimited_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_CN_IntegerUnlimited_1_tags, - sizeof(asn_DEF_CN_IntegerUnlimited_1_tags) - /sizeof(asn_DEF_CN_IntegerUnlimited_1_tags[0]), /* 1 */ - asn_DEF_CN_IntegerUnlimited_1_tags, /* Same as above */ - sizeof(asn_DEF_CN_IntegerUnlimited_1_tags) - /sizeof(asn_DEF_CN_IntegerUnlimited_1_tags[0]), /* 1 */ + asn_DEF_CN_IntegerUnlimited_tags_1, + sizeof(asn_DEF_CN_IntegerUnlimited_tags_1) + /sizeof(asn_DEF_CN_IntegerUnlimited_tags_1[0]), /* 1 */ + asn_DEF_CN_IntegerUnlimited_tags_1, /* Same as above */ + sizeof(asn_DEF_CN_IntegerUnlimited_tags_1) + /sizeof(asn_DEF_CN_IntegerUnlimited_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -172,6 +177,9 @@ CN_IntegerMinMax_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -224,7 +232,7 @@ CN_IntegerMinMax_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [CN-IntegerMinMax] >>> ***/ -static ber_tlv_tag_t asn_DEF_CN_IntegerMinMax_1_tags[] = { +static ber_tlv_tag_t asn_DEF_CN_IntegerMinMax_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_CN_IntegerMinMax = { @@ -237,13 +245,15 @@ asn_TYPE_descriptor_t asn_DEF_CN_IntegerMinMax = { CN_IntegerMinMax_encode_der, CN_IntegerMinMax_decode_xer, CN_IntegerMinMax_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_CN_IntegerMinMax_1_tags, - sizeof(asn_DEF_CN_IntegerMinMax_1_tags) - /sizeof(asn_DEF_CN_IntegerMinMax_1_tags[0]), /* 1 */ - asn_DEF_CN_IntegerMinMax_1_tags, /* Same as above */ - sizeof(asn_DEF_CN_IntegerMinMax_1_tags) - /sizeof(asn_DEF_CN_IntegerMinMax_1_tags[0]), /* 1 */ + asn_DEF_CN_IntegerMinMax_tags_1, + sizeof(asn_DEF_CN_IntegerMinMax_tags_1) + /sizeof(asn_DEF_CN_IntegerMinMax_tags_1[0]), /* 1 */ + asn_DEF_CN_IntegerMinMax_tags_1, /* Same as above */ + sizeof(asn_DEF_CN_IntegerMinMax_tags_1) + /sizeof(asn_DEF_CN_IntegerMinMax_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -313,6 +323,9 @@ CN_IntegerMinLow_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -365,7 +378,7 @@ CN_IntegerMinLow_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [CN-IntegerMinLow] >>> ***/ -static ber_tlv_tag_t asn_DEF_CN_IntegerMinLow_1_tags[] = { +static ber_tlv_tag_t asn_DEF_CN_IntegerMinLow_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_CN_IntegerMinLow = { @@ -378,13 +391,15 @@ asn_TYPE_descriptor_t asn_DEF_CN_IntegerMinLow = { CN_IntegerMinLow_encode_der, CN_IntegerMinLow_decode_xer, CN_IntegerMinLow_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_CN_IntegerMinLow_1_tags, - sizeof(asn_DEF_CN_IntegerMinLow_1_tags) - /sizeof(asn_DEF_CN_IntegerMinLow_1_tags[0]), /* 1 */ - asn_DEF_CN_IntegerMinLow_1_tags, /* Same as above */ - sizeof(asn_DEF_CN_IntegerMinLow_1_tags) - /sizeof(asn_DEF_CN_IntegerMinLow_1_tags[0]), /* 1 */ + asn_DEF_CN_IntegerMinLow_tags_1, + sizeof(asn_DEF_CN_IntegerMinLow_tags_1) + /sizeof(asn_DEF_CN_IntegerMinLow_tags_1[0]), /* 1 */ + asn_DEF_CN_IntegerMinLow_tags_1, /* Same as above */ + sizeof(asn_DEF_CN_IntegerMinLow_tags_1) + /sizeof(asn_DEF_CN_IntegerMinLow_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -454,6 +469,9 @@ NO_IntegerMinHigh_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -506,7 +524,7 @@ NO_IntegerMinHigh_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerMinHigh] >>> ***/ -static ber_tlv_tag_t asn_DEF_NO_IntegerMinHigh_1_tags[] = { +static ber_tlv_tag_t asn_DEF_NO_IntegerMinHigh_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NO_IntegerMinHigh = { @@ -519,13 +537,15 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerMinHigh = { NO_IntegerMinHigh_encode_der, NO_IntegerMinHigh_decode_xer, NO_IntegerMinHigh_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_NO_IntegerMinHigh_1_tags, - sizeof(asn_DEF_NO_IntegerMinHigh_1_tags) - /sizeof(asn_DEF_NO_IntegerMinHigh_1_tags[0]), /* 1 */ - asn_DEF_NO_IntegerMinHigh_1_tags, /* Same as above */ - sizeof(asn_DEF_NO_IntegerMinHigh_1_tags) - /sizeof(asn_DEF_NO_IntegerMinHigh_1_tags[0]), /* 1 */ + asn_DEF_NO_IntegerMinHigh_tags_1, + sizeof(asn_DEF_NO_IntegerMinHigh_tags_1) + /sizeof(asn_DEF_NO_IntegerMinHigh_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerMinHigh_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerMinHigh_tags_1) + /sizeof(asn_DEF_NO_IntegerMinHigh_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -595,6 +615,9 @@ NO_IntegerLowHigh_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -647,7 +670,7 @@ NO_IntegerLowHigh_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerLowHigh] >>> ***/ -static ber_tlv_tag_t asn_DEF_NO_IntegerLowHigh_1_tags[] = { +static ber_tlv_tag_t asn_DEF_NO_IntegerLowHigh_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NO_IntegerLowHigh = { @@ -660,13 +683,15 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerLowHigh = { NO_IntegerLowHigh_encode_der, NO_IntegerLowHigh_decode_xer, NO_IntegerLowHigh_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_NO_IntegerLowHigh_1_tags, - sizeof(asn_DEF_NO_IntegerLowHigh_1_tags) - /sizeof(asn_DEF_NO_IntegerLowHigh_1_tags[0]), /* 1 */ - asn_DEF_NO_IntegerLowHigh_1_tags, /* Same as above */ - sizeof(asn_DEF_NO_IntegerLowHigh_1_tags) - /sizeof(asn_DEF_NO_IntegerLowHigh_1_tags[0]), /* 1 */ + asn_DEF_NO_IntegerLowHigh_tags_1, + sizeof(asn_DEF_NO_IntegerLowHigh_tags_1) + /sizeof(asn_DEF_NO_IntegerLowHigh_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerLowHigh_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerLowHigh_tags_1) + /sizeof(asn_DEF_NO_IntegerLowHigh_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -736,6 +761,9 @@ CN_IntegerLowMax_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -788,7 +816,7 @@ CN_IntegerLowMax_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [CN-IntegerLowMax] >>> ***/ -static ber_tlv_tag_t asn_DEF_CN_IntegerLowMax_1_tags[] = { +static ber_tlv_tag_t asn_DEF_CN_IntegerLowMax_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_CN_IntegerLowMax = { @@ -801,13 +829,15 @@ asn_TYPE_descriptor_t asn_DEF_CN_IntegerLowMax = { CN_IntegerLowMax_encode_der, CN_IntegerLowMax_decode_xer, CN_IntegerLowMax_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_CN_IntegerLowMax_1_tags, - sizeof(asn_DEF_CN_IntegerLowMax_1_tags) - /sizeof(asn_DEF_CN_IntegerLowMax_1_tags[0]), /* 1 */ - asn_DEF_CN_IntegerLowMax_1_tags, /* Same as above */ - sizeof(asn_DEF_CN_IntegerLowMax_1_tags) - /sizeof(asn_DEF_CN_IntegerLowMax_1_tags[0]), /* 1 */ + asn_DEF_CN_IntegerLowMax_tags_1, + sizeof(asn_DEF_CN_IntegerLowMax_tags_1) + /sizeof(asn_DEF_CN_IntegerLowMax_tags_1[0]), /* 1 */ + asn_DEF_CN_IntegerLowMax_tags_1, /* Same as above */ + sizeof(asn_DEF_CN_IntegerLowMax_tags_1) + /sizeof(asn_DEF_CN_IntegerLowMax_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -877,6 +907,9 @@ NO_IntegerHighMax_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -929,7 +962,7 @@ NO_IntegerHighMax_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerHighMax] >>> ***/ -static ber_tlv_tag_t asn_DEF_NO_IntegerHighMax_1_tags[] = { +static ber_tlv_tag_t asn_DEF_NO_IntegerHighMax_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NO_IntegerHighMax = { @@ -942,13 +975,15 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerHighMax = { NO_IntegerHighMax_encode_der, NO_IntegerHighMax_decode_xer, NO_IntegerHighMax_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_NO_IntegerHighMax_1_tags, - sizeof(asn_DEF_NO_IntegerHighMax_1_tags) - /sizeof(asn_DEF_NO_IntegerHighMax_1_tags[0]), /* 1 */ - asn_DEF_NO_IntegerHighMax_1_tags, /* Same as above */ - sizeof(asn_DEF_NO_IntegerHighMax_1_tags) - /sizeof(asn_DEF_NO_IntegerHighMax_1_tags[0]), /* 1 */ + asn_DEF_NO_IntegerHighMax_tags_1, + sizeof(asn_DEF_NO_IntegerHighMax_tags_1) + /sizeof(asn_DEF_NO_IntegerHighMax_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerHighMax_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerHighMax_tags_1) + /sizeof(asn_DEF_NO_IntegerHighMax_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1018,6 +1053,9 @@ NO_IntegerLowestMax_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -1070,7 +1108,7 @@ NO_IntegerLowestMax_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerLowestMax] >>> ***/ -static ber_tlv_tag_t asn_DEF_NO_IntegerLowestMax_1_tags[] = { +static ber_tlv_tag_t asn_DEF_NO_IntegerLowestMax_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NO_IntegerLowestMax = { @@ -1083,13 +1121,15 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerLowestMax = { NO_IntegerLowestMax_encode_der, NO_IntegerLowestMax_decode_xer, NO_IntegerLowestMax_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_NO_IntegerLowestMax_1_tags, - sizeof(asn_DEF_NO_IntegerLowestMax_1_tags) - /sizeof(asn_DEF_NO_IntegerLowestMax_1_tags[0]), /* 1 */ - asn_DEF_NO_IntegerLowestMax_1_tags, /* Same as above */ - sizeof(asn_DEF_NO_IntegerLowestMax_1_tags) - /sizeof(asn_DEF_NO_IntegerLowestMax_1_tags[0]), /* 1 */ + asn_DEF_NO_IntegerLowestMax_tags_1, + sizeof(asn_DEF_NO_IntegerLowestMax_tags_1) + /sizeof(asn_DEF_NO_IntegerLowestMax_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerLowestMax_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerLowestMax_tags_1) + /sizeof(asn_DEF_NO_IntegerLowestMax_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1159,6 +1199,9 @@ NO_IntegerOutRange_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -1211,7 +1254,7 @@ NO_IntegerOutRange_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerOutRange] >>> ***/ -static ber_tlv_tag_t asn_DEF_NO_IntegerOutRange_1_tags[] = { +static ber_tlv_tag_t asn_DEF_NO_IntegerOutRange_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NO_IntegerOutRange = { @@ -1224,13 +1267,15 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerOutRange = { NO_IntegerOutRange_encode_der, NO_IntegerOutRange_decode_xer, NO_IntegerOutRange_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_NO_IntegerOutRange_1_tags, - sizeof(asn_DEF_NO_IntegerOutRange_1_tags) - /sizeof(asn_DEF_NO_IntegerOutRange_1_tags[0]), /* 1 */ - asn_DEF_NO_IntegerOutRange_1_tags, /* Same as above */ - sizeof(asn_DEF_NO_IntegerOutRange_1_tags) - /sizeof(asn_DEF_NO_IntegerOutRange_1_tags[0]), /* 1 */ + asn_DEF_NO_IntegerOutRange_tags_1, + sizeof(asn_DEF_NO_IntegerOutRange_tags_1) + /sizeof(asn_DEF_NO_IntegerOutRange_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerOutRange_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerOutRange_tags_1) + /sizeof(asn_DEF_NO_IntegerOutRange_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1300,6 +1345,9 @@ NO_IntegerOutValue_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -1352,7 +1400,7 @@ NO_IntegerOutValue_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerOutValue] >>> ***/ -static ber_tlv_tag_t asn_DEF_NO_IntegerOutValue_1_tags[] = { +static ber_tlv_tag_t asn_DEF_NO_IntegerOutValue_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NO_IntegerOutValue = { @@ -1365,13 +1413,15 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerOutValue = { NO_IntegerOutValue_encode_der, NO_IntegerOutValue_decode_xer, NO_IntegerOutValue_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_NO_IntegerOutValue_1_tags, - sizeof(asn_DEF_NO_IntegerOutValue_1_tags) - /sizeof(asn_DEF_NO_IntegerOutValue_1_tags[0]), /* 1 */ - asn_DEF_NO_IntegerOutValue_1_tags, /* Same as above */ - sizeof(asn_DEF_NO_IntegerOutValue_1_tags) - /sizeof(asn_DEF_NO_IntegerOutValue_1_tags[0]), /* 1 */ + asn_DEF_NO_IntegerOutValue_tags_1, + sizeof(asn_DEF_NO_IntegerOutValue_tags_1) + /sizeof(asn_DEF_NO_IntegerOutValue_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerOutValue_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerOutValue_tags_1) + /sizeof(asn_DEF_NO_IntegerOutValue_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1435,6 +1485,9 @@ OK_IntegerInRange1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; @@ -1487,7 +1540,7 @@ OK_IntegerInRange1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [OK-IntegerInRange1] >>> ***/ -static ber_tlv_tag_t asn_DEF_OK_IntegerInRange1_1_tags[] = { +static ber_tlv_tag_t asn_DEF_OK_IntegerInRange1_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange1 = { @@ -1500,13 +1553,15 @@ asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange1 = { OK_IntegerInRange1_encode_der, OK_IntegerInRange1_decode_xer, OK_IntegerInRange1_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_OK_IntegerInRange1_1_tags, - sizeof(asn_DEF_OK_IntegerInRange1_1_tags) - /sizeof(asn_DEF_OK_IntegerInRange1_1_tags[0]), /* 1 */ - asn_DEF_OK_IntegerInRange1_1_tags, /* Same as above */ - sizeof(asn_DEF_OK_IntegerInRange1_1_tags) - /sizeof(asn_DEF_OK_IntegerInRange1_1_tags[0]), /* 1 */ + asn_DEF_OK_IntegerInRange1_tags_1, + sizeof(asn_DEF_OK_IntegerInRange1_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange1_tags_1[0]), /* 1 */ + asn_DEF_OK_IntegerInRange1_tags_1, /* Same as above */ + sizeof(asn_DEF_OK_IntegerInRange1_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange1_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1570,6 +1625,9 @@ OK_IntegerInRange2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; @@ -1622,7 +1680,7 @@ OK_IntegerInRange2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [OK-IntegerInRange2] >>> ***/ -static ber_tlv_tag_t asn_DEF_OK_IntegerInRange2_1_tags[] = { +static ber_tlv_tag_t asn_DEF_OK_IntegerInRange2_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange2 = { @@ -1635,13 +1693,15 @@ asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange2 = { OK_IntegerInRange2_encode_der, OK_IntegerInRange2_decode_xer, OK_IntegerInRange2_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_OK_IntegerInRange2_1_tags, - sizeof(asn_DEF_OK_IntegerInRange2_1_tags) - /sizeof(asn_DEF_OK_IntegerInRange2_1_tags[0]), /* 1 */ - asn_DEF_OK_IntegerInRange2_1_tags, /* Same as above */ - sizeof(asn_DEF_OK_IntegerInRange2_1_tags) - /sizeof(asn_DEF_OK_IntegerInRange2_1_tags[0]), /* 1 */ + asn_DEF_OK_IntegerInRange2_tags_1, + sizeof(asn_DEF_OK_IntegerInRange2_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange2_tags_1[0]), /* 1 */ + asn_DEF_OK_IntegerInRange2_tags_1, /* Same as above */ + sizeof(asn_DEF_OK_IntegerInRange2_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange2_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1705,6 +1765,9 @@ OK_IntegerInRange3_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; @@ -1757,7 +1820,7 @@ OK_IntegerInRange3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [OK-IntegerInRange3] >>> ***/ -static ber_tlv_tag_t asn_DEF_OK_IntegerInRange3_1_tags[] = { +static ber_tlv_tag_t asn_DEF_OK_IntegerInRange3_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange3 = { @@ -1770,13 +1833,15 @@ asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange3 = { OK_IntegerInRange3_encode_der, OK_IntegerInRange3_decode_xer, OK_IntegerInRange3_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_OK_IntegerInRange3_1_tags, - sizeof(asn_DEF_OK_IntegerInRange3_1_tags) - /sizeof(asn_DEF_OK_IntegerInRange3_1_tags[0]), /* 1 */ - asn_DEF_OK_IntegerInRange3_1_tags, /* Same as above */ - sizeof(asn_DEF_OK_IntegerInRange3_1_tags) - /sizeof(asn_DEF_OK_IntegerInRange3_1_tags[0]), /* 1 */ + asn_DEF_OK_IntegerInRange3_tags_1, + sizeof(asn_DEF_OK_IntegerInRange3_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange3_tags_1[0]), /* 1 */ + asn_DEF_OK_IntegerInRange3_tags_1, /* Same as above */ + sizeof(asn_DEF_OK_IntegerInRange3_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange3_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1840,6 +1905,9 @@ OK_IntegerInRange4_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; @@ -1892,7 +1960,7 @@ OK_IntegerInRange4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [OK-IntegerInRange4] >>> ***/ -static ber_tlv_tag_t asn_DEF_OK_IntegerInRange4_1_tags[] = { +static ber_tlv_tag_t asn_DEF_OK_IntegerInRange4_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange4 = { @@ -1905,13 +1973,15 @@ asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange4 = { OK_IntegerInRange4_encode_der, OK_IntegerInRange4_decode_xer, OK_IntegerInRange4_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_OK_IntegerInRange4_1_tags, - sizeof(asn_DEF_OK_IntegerInRange4_1_tags) - /sizeof(asn_DEF_OK_IntegerInRange4_1_tags[0]), /* 1 */ - asn_DEF_OK_IntegerInRange4_1_tags, /* Same as above */ - sizeof(asn_DEF_OK_IntegerInRange4_1_tags) - /sizeof(asn_DEF_OK_IntegerInRange4_1_tags[0]), /* 1 */ + asn_DEF_OK_IntegerInRange4_tags_1, + sizeof(asn_DEF_OK_IntegerInRange4_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange4_tags_1[0]), /* 1 */ + asn_DEF_OK_IntegerInRange4_tags_1, /* Same as above */ + sizeof(asn_DEF_OK_IntegerInRange4_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange4_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1981,6 +2051,9 @@ OK_IntegerInRange5_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -2033,7 +2106,7 @@ OK_IntegerInRange5_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [OK-IntegerInRange5] >>> ***/ -static ber_tlv_tag_t asn_DEF_OK_IntegerInRange5_1_tags[] = { +static ber_tlv_tag_t asn_DEF_OK_IntegerInRange5_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange5 = { @@ -2046,13 +2119,15 @@ asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange5 = { OK_IntegerInRange5_encode_der, OK_IntegerInRange5_decode_xer, OK_IntegerInRange5_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_OK_IntegerInRange5_1_tags, - sizeof(asn_DEF_OK_IntegerInRange5_1_tags) - /sizeof(asn_DEF_OK_IntegerInRange5_1_tags[0]), /* 1 */ - asn_DEF_OK_IntegerInRange5_1_tags, /* Same as above */ - sizeof(asn_DEF_OK_IntegerInRange5_1_tags) - /sizeof(asn_DEF_OK_IntegerInRange5_1_tags[0]), /* 1 */ + asn_DEF_OK_IntegerInRange5_tags_1, + sizeof(asn_DEF_OK_IntegerInRange5_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange5_tags_1[0]), /* 1 */ + asn_DEF_OK_IntegerInRange5_tags_1, /* Same as above */ + sizeof(asn_DEF_OK_IntegerInRange5_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange5_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -2122,6 +2197,9 @@ NO_IntegerInRange6_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -2174,7 +2252,7 @@ NO_IntegerInRange6_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerInRange6] >>> ***/ -static ber_tlv_tag_t asn_DEF_NO_IntegerInRange6_1_tags[] = { +static ber_tlv_tag_t asn_DEF_NO_IntegerInRange6_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NO_IntegerInRange6 = { @@ -2187,13 +2265,15 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerInRange6 = { NO_IntegerInRange6_encode_der, NO_IntegerInRange6_decode_xer, NO_IntegerInRange6_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_NO_IntegerInRange6_1_tags, - sizeof(asn_DEF_NO_IntegerInRange6_1_tags) - /sizeof(asn_DEF_NO_IntegerInRange6_1_tags[0]), /* 1 */ - asn_DEF_NO_IntegerInRange6_1_tags, /* Same as above */ - sizeof(asn_DEF_NO_IntegerInRange6_1_tags) - /sizeof(asn_DEF_NO_IntegerInRange6_1_tags[0]), /* 1 */ + asn_DEF_NO_IntegerInRange6_tags_1, + sizeof(asn_DEF_NO_IntegerInRange6_tags_1) + /sizeof(asn_DEF_NO_IntegerInRange6_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerInRange6_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerInRange6_tags_1) + /sizeof(asn_DEF_NO_IntegerInRange6_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -2247,6 +2327,9 @@ CN_IntegerEnumerated1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -2299,7 +2382,7 @@ CN_IntegerEnumerated1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [CN-IntegerEnumerated1] >>> ***/ -static ber_tlv_tag_t asn_DEF_CN_IntegerEnumerated1_1_tags[] = { +static ber_tlv_tag_t asn_DEF_CN_IntegerEnumerated1_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_CN_IntegerEnumerated1 = { @@ -2312,13 +2395,15 @@ asn_TYPE_descriptor_t asn_DEF_CN_IntegerEnumerated1 = { CN_IntegerEnumerated1_encode_der, CN_IntegerEnumerated1_decode_xer, CN_IntegerEnumerated1_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_CN_IntegerEnumerated1_1_tags, - sizeof(asn_DEF_CN_IntegerEnumerated1_1_tags) - /sizeof(asn_DEF_CN_IntegerEnumerated1_1_tags[0]), /* 1 */ - asn_DEF_CN_IntegerEnumerated1_1_tags, /* Same as above */ - sizeof(asn_DEF_CN_IntegerEnumerated1_1_tags) - /sizeof(asn_DEF_CN_IntegerEnumerated1_1_tags[0]), /* 1 */ + asn_DEF_CN_IntegerEnumerated1_tags_1, + sizeof(asn_DEF_CN_IntegerEnumerated1_tags_1) + /sizeof(asn_DEF_CN_IntegerEnumerated1_tags_1[0]), /* 1 */ + asn_DEF_CN_IntegerEnumerated1_tags_1, /* Same as above */ + sizeof(asn_DEF_CN_IntegerEnumerated1_tags_1) + /sizeof(asn_DEF_CN_IntegerEnumerated1_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* Defined elsewhere */ 0 /* No specifics */ }; @@ -2372,6 +2457,9 @@ NO_IntegerEnumerated2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -2424,7 +2512,7 @@ NO_IntegerEnumerated2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerEnumerated2] >>> ***/ -static ber_tlv_tag_t asn_DEF_NO_IntegerEnumerated2_1_tags[] = { +static ber_tlv_tag_t asn_DEF_NO_IntegerEnumerated2_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NO_IntegerEnumerated2 = { @@ -2437,13 +2525,15 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerEnumerated2 = { NO_IntegerEnumerated2_encode_der, NO_IntegerEnumerated2_decode_xer, NO_IntegerEnumerated2_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_NO_IntegerEnumerated2_1_tags, - sizeof(asn_DEF_NO_IntegerEnumerated2_1_tags) - /sizeof(asn_DEF_NO_IntegerEnumerated2_1_tags[0]), /* 1 */ - asn_DEF_NO_IntegerEnumerated2_1_tags, /* Same as above */ - sizeof(asn_DEF_NO_IntegerEnumerated2_1_tags) - /sizeof(asn_DEF_NO_IntegerEnumerated2_1_tags[0]), /* 1 */ + asn_DEF_NO_IntegerEnumerated2_tags_1, + sizeof(asn_DEF_NO_IntegerEnumerated2_tags_1) + /sizeof(asn_DEF_NO_IntegerEnumerated2_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerEnumerated2_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerEnumerated2_tags_1) + /sizeof(asn_DEF_NO_IntegerEnumerated2_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* Defined elsewhere */ 0 /* No specifics */ }; diff --git a/tests/90-cond-int-type-OK.asn1.-Pfnative-types b/tests/90-cond-int-type-OK.asn1.-Pfnative-types index eaf0f53ca..240c70b18 100644 --- a/tests/90-cond-int-type-OK.asn1.-Pfnative-types +++ b/tests/90-cond-int-type-OK.asn1.-Pfnative-types @@ -40,6 +40,9 @@ CN_IntegerUnlimited_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; @@ -92,7 +95,7 @@ CN_IntegerUnlimited_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [CN-IntegerUnlimited] >>> ***/ -static ber_tlv_tag_t asn_DEF_CN_IntegerUnlimited_1_tags[] = { +static ber_tlv_tag_t asn_DEF_CN_IntegerUnlimited_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_CN_IntegerUnlimited = { @@ -105,13 +108,15 @@ asn_TYPE_descriptor_t asn_DEF_CN_IntegerUnlimited = { CN_IntegerUnlimited_encode_der, CN_IntegerUnlimited_decode_xer, CN_IntegerUnlimited_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_CN_IntegerUnlimited_1_tags, - sizeof(asn_DEF_CN_IntegerUnlimited_1_tags) - /sizeof(asn_DEF_CN_IntegerUnlimited_1_tags[0]), /* 1 */ - asn_DEF_CN_IntegerUnlimited_1_tags, /* Same as above */ - sizeof(asn_DEF_CN_IntegerUnlimited_1_tags) - /sizeof(asn_DEF_CN_IntegerUnlimited_1_tags[0]), /* 1 */ + asn_DEF_CN_IntegerUnlimited_tags_1, + sizeof(asn_DEF_CN_IntegerUnlimited_tags_1) + /sizeof(asn_DEF_CN_IntegerUnlimited_tags_1[0]), /* 1 */ + asn_DEF_CN_IntegerUnlimited_tags_1, /* Same as above */ + sizeof(asn_DEF_CN_IntegerUnlimited_tags_1) + /sizeof(asn_DEF_CN_IntegerUnlimited_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -171,6 +176,9 @@ CN_IntegerMinMax_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; @@ -223,7 +231,7 @@ CN_IntegerMinMax_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [CN-IntegerMinMax] >>> ***/ -static ber_tlv_tag_t asn_DEF_CN_IntegerMinMax_1_tags[] = { +static ber_tlv_tag_t asn_DEF_CN_IntegerMinMax_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_CN_IntegerMinMax = { @@ -236,13 +244,15 @@ asn_TYPE_descriptor_t asn_DEF_CN_IntegerMinMax = { CN_IntegerMinMax_encode_der, CN_IntegerMinMax_decode_xer, CN_IntegerMinMax_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_CN_IntegerMinMax_1_tags, - sizeof(asn_DEF_CN_IntegerMinMax_1_tags) - /sizeof(asn_DEF_CN_IntegerMinMax_1_tags[0]), /* 1 */ - asn_DEF_CN_IntegerMinMax_1_tags, /* Same as above */ - sizeof(asn_DEF_CN_IntegerMinMax_1_tags) - /sizeof(asn_DEF_CN_IntegerMinMax_1_tags[0]), /* 1 */ + asn_DEF_CN_IntegerMinMax_tags_1, + sizeof(asn_DEF_CN_IntegerMinMax_tags_1) + /sizeof(asn_DEF_CN_IntegerMinMax_tags_1[0]), /* 1 */ + asn_DEF_CN_IntegerMinMax_tags_1, /* Same as above */ + sizeof(asn_DEF_CN_IntegerMinMax_tags_1) + /sizeof(asn_DEF_CN_IntegerMinMax_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -306,6 +316,9 @@ CN_IntegerMinLow_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; @@ -358,7 +371,7 @@ CN_IntegerMinLow_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [CN-IntegerMinLow] >>> ***/ -static ber_tlv_tag_t asn_DEF_CN_IntegerMinLow_1_tags[] = { +static ber_tlv_tag_t asn_DEF_CN_IntegerMinLow_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_CN_IntegerMinLow = { @@ -371,13 +384,15 @@ asn_TYPE_descriptor_t asn_DEF_CN_IntegerMinLow = { CN_IntegerMinLow_encode_der, CN_IntegerMinLow_decode_xer, CN_IntegerMinLow_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_CN_IntegerMinLow_1_tags, - sizeof(asn_DEF_CN_IntegerMinLow_1_tags) - /sizeof(asn_DEF_CN_IntegerMinLow_1_tags[0]), /* 1 */ - asn_DEF_CN_IntegerMinLow_1_tags, /* Same as above */ - sizeof(asn_DEF_CN_IntegerMinLow_1_tags) - /sizeof(asn_DEF_CN_IntegerMinLow_1_tags[0]), /* 1 */ + asn_DEF_CN_IntegerMinLow_tags_1, + sizeof(asn_DEF_CN_IntegerMinLow_tags_1) + /sizeof(asn_DEF_CN_IntegerMinLow_tags_1[0]), /* 1 */ + asn_DEF_CN_IntegerMinLow_tags_1, /* Same as above */ + sizeof(asn_DEF_CN_IntegerMinLow_tags_1) + /sizeof(asn_DEF_CN_IntegerMinLow_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -447,6 +462,9 @@ NO_IntegerMinHigh_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -499,7 +517,7 @@ NO_IntegerMinHigh_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerMinHigh] >>> ***/ -static ber_tlv_tag_t asn_DEF_NO_IntegerMinHigh_1_tags[] = { +static ber_tlv_tag_t asn_DEF_NO_IntegerMinHigh_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NO_IntegerMinHigh = { @@ -512,13 +530,15 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerMinHigh = { NO_IntegerMinHigh_encode_der, NO_IntegerMinHigh_decode_xer, NO_IntegerMinHigh_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_NO_IntegerMinHigh_1_tags, - sizeof(asn_DEF_NO_IntegerMinHigh_1_tags) - /sizeof(asn_DEF_NO_IntegerMinHigh_1_tags[0]), /* 1 */ - asn_DEF_NO_IntegerMinHigh_1_tags, /* Same as above */ - sizeof(asn_DEF_NO_IntegerMinHigh_1_tags) - /sizeof(asn_DEF_NO_IntegerMinHigh_1_tags[0]), /* 1 */ + asn_DEF_NO_IntegerMinHigh_tags_1, + sizeof(asn_DEF_NO_IntegerMinHigh_tags_1) + /sizeof(asn_DEF_NO_IntegerMinHigh_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerMinHigh_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerMinHigh_tags_1) + /sizeof(asn_DEF_NO_IntegerMinHigh_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -588,6 +608,9 @@ NO_IntegerLowHigh_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -640,7 +663,7 @@ NO_IntegerLowHigh_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerLowHigh] >>> ***/ -static ber_tlv_tag_t asn_DEF_NO_IntegerLowHigh_1_tags[] = { +static ber_tlv_tag_t asn_DEF_NO_IntegerLowHigh_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NO_IntegerLowHigh = { @@ -653,13 +676,15 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerLowHigh = { NO_IntegerLowHigh_encode_der, NO_IntegerLowHigh_decode_xer, NO_IntegerLowHigh_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_NO_IntegerLowHigh_1_tags, - sizeof(asn_DEF_NO_IntegerLowHigh_1_tags) - /sizeof(asn_DEF_NO_IntegerLowHigh_1_tags[0]), /* 1 */ - asn_DEF_NO_IntegerLowHigh_1_tags, /* Same as above */ - sizeof(asn_DEF_NO_IntegerLowHigh_1_tags) - /sizeof(asn_DEF_NO_IntegerLowHigh_1_tags[0]), /* 1 */ + asn_DEF_NO_IntegerLowHigh_tags_1, + sizeof(asn_DEF_NO_IntegerLowHigh_tags_1) + /sizeof(asn_DEF_NO_IntegerLowHigh_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerLowHigh_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerLowHigh_tags_1) + /sizeof(asn_DEF_NO_IntegerLowHigh_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -723,6 +748,9 @@ CN_IntegerLowMax_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; @@ -775,7 +803,7 @@ CN_IntegerLowMax_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [CN-IntegerLowMax] >>> ***/ -static ber_tlv_tag_t asn_DEF_CN_IntegerLowMax_1_tags[] = { +static ber_tlv_tag_t asn_DEF_CN_IntegerLowMax_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_CN_IntegerLowMax = { @@ -788,13 +816,15 @@ asn_TYPE_descriptor_t asn_DEF_CN_IntegerLowMax = { CN_IntegerLowMax_encode_der, CN_IntegerLowMax_decode_xer, CN_IntegerLowMax_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_CN_IntegerLowMax_1_tags, - sizeof(asn_DEF_CN_IntegerLowMax_1_tags) - /sizeof(asn_DEF_CN_IntegerLowMax_1_tags[0]), /* 1 */ - asn_DEF_CN_IntegerLowMax_1_tags, /* Same as above */ - sizeof(asn_DEF_CN_IntegerLowMax_1_tags) - /sizeof(asn_DEF_CN_IntegerLowMax_1_tags[0]), /* 1 */ + asn_DEF_CN_IntegerLowMax_tags_1, + sizeof(asn_DEF_CN_IntegerLowMax_tags_1) + /sizeof(asn_DEF_CN_IntegerLowMax_tags_1[0]), /* 1 */ + asn_DEF_CN_IntegerLowMax_tags_1, /* Same as above */ + sizeof(asn_DEF_CN_IntegerLowMax_tags_1) + /sizeof(asn_DEF_CN_IntegerLowMax_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -864,6 +894,9 @@ NO_IntegerHighMax_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -916,7 +949,7 @@ NO_IntegerHighMax_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerHighMax] >>> ***/ -static ber_tlv_tag_t asn_DEF_NO_IntegerHighMax_1_tags[] = { +static ber_tlv_tag_t asn_DEF_NO_IntegerHighMax_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NO_IntegerHighMax = { @@ -929,13 +962,15 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerHighMax = { NO_IntegerHighMax_encode_der, NO_IntegerHighMax_decode_xer, NO_IntegerHighMax_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_NO_IntegerHighMax_1_tags, - sizeof(asn_DEF_NO_IntegerHighMax_1_tags) - /sizeof(asn_DEF_NO_IntegerHighMax_1_tags[0]), /* 1 */ - asn_DEF_NO_IntegerHighMax_1_tags, /* Same as above */ - sizeof(asn_DEF_NO_IntegerHighMax_1_tags) - /sizeof(asn_DEF_NO_IntegerHighMax_1_tags[0]), /* 1 */ + asn_DEF_NO_IntegerHighMax_tags_1, + sizeof(asn_DEF_NO_IntegerHighMax_tags_1) + /sizeof(asn_DEF_NO_IntegerHighMax_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerHighMax_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerHighMax_tags_1) + /sizeof(asn_DEF_NO_IntegerHighMax_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1005,6 +1040,9 @@ NO_IntegerLowestMax_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -1057,7 +1095,7 @@ NO_IntegerLowestMax_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerLowestMax] >>> ***/ -static ber_tlv_tag_t asn_DEF_NO_IntegerLowestMax_1_tags[] = { +static ber_tlv_tag_t asn_DEF_NO_IntegerLowestMax_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NO_IntegerLowestMax = { @@ -1070,13 +1108,15 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerLowestMax = { NO_IntegerLowestMax_encode_der, NO_IntegerLowestMax_decode_xer, NO_IntegerLowestMax_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_NO_IntegerLowestMax_1_tags, - sizeof(asn_DEF_NO_IntegerLowestMax_1_tags) - /sizeof(asn_DEF_NO_IntegerLowestMax_1_tags[0]), /* 1 */ - asn_DEF_NO_IntegerLowestMax_1_tags, /* Same as above */ - sizeof(asn_DEF_NO_IntegerLowestMax_1_tags) - /sizeof(asn_DEF_NO_IntegerLowestMax_1_tags[0]), /* 1 */ + asn_DEF_NO_IntegerLowestMax_tags_1, + sizeof(asn_DEF_NO_IntegerLowestMax_tags_1) + /sizeof(asn_DEF_NO_IntegerLowestMax_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerLowestMax_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerLowestMax_tags_1) + /sizeof(asn_DEF_NO_IntegerLowestMax_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1146,6 +1186,9 @@ NO_IntegerOutRange_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -1198,7 +1241,7 @@ NO_IntegerOutRange_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerOutRange] >>> ***/ -static ber_tlv_tag_t asn_DEF_NO_IntegerOutRange_1_tags[] = { +static ber_tlv_tag_t asn_DEF_NO_IntegerOutRange_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NO_IntegerOutRange = { @@ -1211,13 +1254,15 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerOutRange = { NO_IntegerOutRange_encode_der, NO_IntegerOutRange_decode_xer, NO_IntegerOutRange_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_NO_IntegerOutRange_1_tags, - sizeof(asn_DEF_NO_IntegerOutRange_1_tags) - /sizeof(asn_DEF_NO_IntegerOutRange_1_tags[0]), /* 1 */ - asn_DEF_NO_IntegerOutRange_1_tags, /* Same as above */ - sizeof(asn_DEF_NO_IntegerOutRange_1_tags) - /sizeof(asn_DEF_NO_IntegerOutRange_1_tags[0]), /* 1 */ + asn_DEF_NO_IntegerOutRange_tags_1, + sizeof(asn_DEF_NO_IntegerOutRange_tags_1) + /sizeof(asn_DEF_NO_IntegerOutRange_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerOutRange_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerOutRange_tags_1) + /sizeof(asn_DEF_NO_IntegerOutRange_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1287,6 +1332,9 @@ NO_IntegerOutValue_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -1339,7 +1387,7 @@ NO_IntegerOutValue_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerOutValue] >>> ***/ -static ber_tlv_tag_t asn_DEF_NO_IntegerOutValue_1_tags[] = { +static ber_tlv_tag_t asn_DEF_NO_IntegerOutValue_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NO_IntegerOutValue = { @@ -1352,13 +1400,15 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerOutValue = { NO_IntegerOutValue_encode_der, NO_IntegerOutValue_decode_xer, NO_IntegerOutValue_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_NO_IntegerOutValue_1_tags, - sizeof(asn_DEF_NO_IntegerOutValue_1_tags) - /sizeof(asn_DEF_NO_IntegerOutValue_1_tags[0]), /* 1 */ - asn_DEF_NO_IntegerOutValue_1_tags, /* Same as above */ - sizeof(asn_DEF_NO_IntegerOutValue_1_tags) - /sizeof(asn_DEF_NO_IntegerOutValue_1_tags[0]), /* 1 */ + asn_DEF_NO_IntegerOutValue_tags_1, + sizeof(asn_DEF_NO_IntegerOutValue_tags_1) + /sizeof(asn_DEF_NO_IntegerOutValue_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerOutValue_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerOutValue_tags_1) + /sizeof(asn_DEF_NO_IntegerOutValue_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1422,6 +1472,9 @@ OK_IntegerInRange1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; @@ -1474,7 +1527,7 @@ OK_IntegerInRange1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [OK-IntegerInRange1] >>> ***/ -static ber_tlv_tag_t asn_DEF_OK_IntegerInRange1_1_tags[] = { +static ber_tlv_tag_t asn_DEF_OK_IntegerInRange1_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange1 = { @@ -1487,13 +1540,15 @@ asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange1 = { OK_IntegerInRange1_encode_der, OK_IntegerInRange1_decode_xer, OK_IntegerInRange1_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_OK_IntegerInRange1_1_tags, - sizeof(asn_DEF_OK_IntegerInRange1_1_tags) - /sizeof(asn_DEF_OK_IntegerInRange1_1_tags[0]), /* 1 */ - asn_DEF_OK_IntegerInRange1_1_tags, /* Same as above */ - sizeof(asn_DEF_OK_IntegerInRange1_1_tags) - /sizeof(asn_DEF_OK_IntegerInRange1_1_tags[0]), /* 1 */ + asn_DEF_OK_IntegerInRange1_tags_1, + sizeof(asn_DEF_OK_IntegerInRange1_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange1_tags_1[0]), /* 1 */ + asn_DEF_OK_IntegerInRange1_tags_1, /* Same as above */ + sizeof(asn_DEF_OK_IntegerInRange1_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange1_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1557,6 +1612,9 @@ OK_IntegerInRange2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; @@ -1609,7 +1667,7 @@ OK_IntegerInRange2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [OK-IntegerInRange2] >>> ***/ -static ber_tlv_tag_t asn_DEF_OK_IntegerInRange2_1_tags[] = { +static ber_tlv_tag_t asn_DEF_OK_IntegerInRange2_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange2 = { @@ -1622,13 +1680,15 @@ asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange2 = { OK_IntegerInRange2_encode_der, OK_IntegerInRange2_decode_xer, OK_IntegerInRange2_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_OK_IntegerInRange2_1_tags, - sizeof(asn_DEF_OK_IntegerInRange2_1_tags) - /sizeof(asn_DEF_OK_IntegerInRange2_1_tags[0]), /* 1 */ - asn_DEF_OK_IntegerInRange2_1_tags, /* Same as above */ - sizeof(asn_DEF_OK_IntegerInRange2_1_tags) - /sizeof(asn_DEF_OK_IntegerInRange2_1_tags[0]), /* 1 */ + asn_DEF_OK_IntegerInRange2_tags_1, + sizeof(asn_DEF_OK_IntegerInRange2_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange2_tags_1[0]), /* 1 */ + asn_DEF_OK_IntegerInRange2_tags_1, /* Same as above */ + sizeof(asn_DEF_OK_IntegerInRange2_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange2_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1692,6 +1752,9 @@ OK_IntegerInRange3_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; @@ -1744,7 +1807,7 @@ OK_IntegerInRange3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [OK-IntegerInRange3] >>> ***/ -static ber_tlv_tag_t asn_DEF_OK_IntegerInRange3_1_tags[] = { +static ber_tlv_tag_t asn_DEF_OK_IntegerInRange3_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange3 = { @@ -1757,13 +1820,15 @@ asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange3 = { OK_IntegerInRange3_encode_der, OK_IntegerInRange3_decode_xer, OK_IntegerInRange3_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_OK_IntegerInRange3_1_tags, - sizeof(asn_DEF_OK_IntegerInRange3_1_tags) - /sizeof(asn_DEF_OK_IntegerInRange3_1_tags[0]), /* 1 */ - asn_DEF_OK_IntegerInRange3_1_tags, /* Same as above */ - sizeof(asn_DEF_OK_IntegerInRange3_1_tags) - /sizeof(asn_DEF_OK_IntegerInRange3_1_tags[0]), /* 1 */ + asn_DEF_OK_IntegerInRange3_tags_1, + sizeof(asn_DEF_OK_IntegerInRange3_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange3_tags_1[0]), /* 1 */ + asn_DEF_OK_IntegerInRange3_tags_1, /* Same as above */ + sizeof(asn_DEF_OK_IntegerInRange3_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange3_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1827,6 +1892,9 @@ OK_IntegerInRange4_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; @@ -1879,7 +1947,7 @@ OK_IntegerInRange4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [OK-IntegerInRange4] >>> ***/ -static ber_tlv_tag_t asn_DEF_OK_IntegerInRange4_1_tags[] = { +static ber_tlv_tag_t asn_DEF_OK_IntegerInRange4_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange4 = { @@ -1892,13 +1960,15 @@ asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange4 = { OK_IntegerInRange4_encode_der, OK_IntegerInRange4_decode_xer, OK_IntegerInRange4_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_OK_IntegerInRange4_1_tags, - sizeof(asn_DEF_OK_IntegerInRange4_1_tags) - /sizeof(asn_DEF_OK_IntegerInRange4_1_tags[0]), /* 1 */ - asn_DEF_OK_IntegerInRange4_1_tags, /* Same as above */ - sizeof(asn_DEF_OK_IntegerInRange4_1_tags) - /sizeof(asn_DEF_OK_IntegerInRange4_1_tags[0]), /* 1 */ + asn_DEF_OK_IntegerInRange4_tags_1, + sizeof(asn_DEF_OK_IntegerInRange4_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange4_tags_1[0]), /* 1 */ + asn_DEF_OK_IntegerInRange4_tags_1, /* Same as above */ + sizeof(asn_DEF_OK_IntegerInRange4_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange4_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -1962,6 +2032,9 @@ OK_IntegerInRange5_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; @@ -2014,7 +2087,7 @@ OK_IntegerInRange5_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [OK-IntegerInRange5] >>> ***/ -static ber_tlv_tag_t asn_DEF_OK_IntegerInRange5_1_tags[] = { +static ber_tlv_tag_t asn_DEF_OK_IntegerInRange5_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange5 = { @@ -2027,13 +2100,15 @@ asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange5 = { OK_IntegerInRange5_encode_der, OK_IntegerInRange5_decode_xer, OK_IntegerInRange5_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_OK_IntegerInRange5_1_tags, - sizeof(asn_DEF_OK_IntegerInRange5_1_tags) - /sizeof(asn_DEF_OK_IntegerInRange5_1_tags[0]), /* 1 */ - asn_DEF_OK_IntegerInRange5_1_tags, /* Same as above */ - sizeof(asn_DEF_OK_IntegerInRange5_1_tags) - /sizeof(asn_DEF_OK_IntegerInRange5_1_tags[0]), /* 1 */ + asn_DEF_OK_IntegerInRange5_tags_1, + sizeof(asn_DEF_OK_IntegerInRange5_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange5_tags_1[0]), /* 1 */ + asn_DEF_OK_IntegerInRange5_tags_1, /* Same as above */ + sizeof(asn_DEF_OK_IntegerInRange5_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange5_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -2103,6 +2178,9 @@ NO_IntegerInRange6_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -2155,7 +2233,7 @@ NO_IntegerInRange6_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerInRange6] >>> ***/ -static ber_tlv_tag_t asn_DEF_NO_IntegerInRange6_1_tags[] = { +static ber_tlv_tag_t asn_DEF_NO_IntegerInRange6_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NO_IntegerInRange6 = { @@ -2168,13 +2246,15 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerInRange6 = { NO_IntegerInRange6_encode_der, NO_IntegerInRange6_decode_xer, NO_IntegerInRange6_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_NO_IntegerInRange6_1_tags, - sizeof(asn_DEF_NO_IntegerInRange6_1_tags) - /sizeof(asn_DEF_NO_IntegerInRange6_1_tags[0]), /* 1 */ - asn_DEF_NO_IntegerInRange6_1_tags, /* Same as above */ - sizeof(asn_DEF_NO_IntegerInRange6_1_tags) - /sizeof(asn_DEF_NO_IntegerInRange6_1_tags[0]), /* 1 */ + asn_DEF_NO_IntegerInRange6_tags_1, + sizeof(asn_DEF_NO_IntegerInRange6_tags_1) + /sizeof(asn_DEF_NO_IntegerInRange6_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerInRange6_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerInRange6_tags_1) + /sizeof(asn_DEF_NO_IntegerInRange6_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -2228,6 +2308,9 @@ CN_IntegerEnumerated1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; @@ -2280,7 +2363,7 @@ CN_IntegerEnumerated1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [CN-IntegerEnumerated1] >>> ***/ -static ber_tlv_tag_t asn_DEF_CN_IntegerEnumerated1_1_tags[] = { +static ber_tlv_tag_t asn_DEF_CN_IntegerEnumerated1_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_CN_IntegerEnumerated1 = { @@ -2293,13 +2376,15 @@ asn_TYPE_descriptor_t asn_DEF_CN_IntegerEnumerated1 = { CN_IntegerEnumerated1_encode_der, CN_IntegerEnumerated1_decode_xer, CN_IntegerEnumerated1_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_CN_IntegerEnumerated1_1_tags, - sizeof(asn_DEF_CN_IntegerEnumerated1_1_tags) - /sizeof(asn_DEF_CN_IntegerEnumerated1_1_tags[0]), /* 1 */ - asn_DEF_CN_IntegerEnumerated1_1_tags, /* Same as above */ - sizeof(asn_DEF_CN_IntegerEnumerated1_1_tags) - /sizeof(asn_DEF_CN_IntegerEnumerated1_1_tags[0]), /* 1 */ + asn_DEF_CN_IntegerEnumerated1_tags_1, + sizeof(asn_DEF_CN_IntegerEnumerated1_tags_1) + /sizeof(asn_DEF_CN_IntegerEnumerated1_tags_1[0]), /* 1 */ + asn_DEF_CN_IntegerEnumerated1_tags_1, /* Same as above */ + sizeof(asn_DEF_CN_IntegerEnumerated1_tags_1) + /sizeof(asn_DEF_CN_IntegerEnumerated1_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* Defined elsewhere */ 0 /* No specifics */ }; @@ -2353,6 +2438,9 @@ NO_IntegerEnumerated2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -2405,7 +2493,7 @@ NO_IntegerEnumerated2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerEnumerated2] >>> ***/ -static ber_tlv_tag_t asn_DEF_NO_IntegerEnumerated2_1_tags[] = { +static ber_tlv_tag_t asn_DEF_NO_IntegerEnumerated2_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NO_IntegerEnumerated2 = { @@ -2418,13 +2506,15 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerEnumerated2 = { NO_IntegerEnumerated2_encode_der, NO_IntegerEnumerated2_decode_xer, NO_IntegerEnumerated2_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_NO_IntegerEnumerated2_1_tags, - sizeof(asn_DEF_NO_IntegerEnumerated2_1_tags) - /sizeof(asn_DEF_NO_IntegerEnumerated2_1_tags[0]), /* 1 */ - asn_DEF_NO_IntegerEnumerated2_1_tags, /* Same as above */ - sizeof(asn_DEF_NO_IntegerEnumerated2_1_tags) - /sizeof(asn_DEF_NO_IntegerEnumerated2_1_tags[0]), /* 1 */ + asn_DEF_NO_IntegerEnumerated2_tags_1, + sizeof(asn_DEF_NO_IntegerEnumerated2_tags_1) + /sizeof(asn_DEF_NO_IntegerEnumerated2_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerEnumerated2_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerEnumerated2_tags_1) + /sizeof(asn_DEF_NO_IntegerEnumerated2_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* Defined elsewhere */ 0 /* No specifics */ }; diff --git a/tests/90-cond-int-type-OK.asn1.-Pgen-PER b/tests/90-cond-int-type-OK.asn1.-Pgen-PER new file mode 100644 index 000000000..e0951e4f2 --- /dev/null +++ b/tests/90-cond-int-type-OK.asn1.-Pgen-PER @@ -0,0 +1,2744 @@ + +/*** <<< INCLUDES [CN-IntegerUnlimited] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [CN-IntegerUnlimited] >>> ***/ + +typedef INTEGER_t CN_IntegerUnlimited_t; + +/*** <<< FUNC-DECLS [CN-IntegerUnlimited] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_CN_IntegerUnlimited; +asn_struct_free_f CN_IntegerUnlimited_free; +asn_struct_print_f CN_IntegerUnlimited_print; +asn_constr_check_f CN_IntegerUnlimited_constraint; +ber_type_decoder_f CN_IntegerUnlimited_decode_ber; +der_type_encoder_f CN_IntegerUnlimited_encode_der; +xer_type_decoder_f CN_IntegerUnlimited_decode_xer; +xer_type_encoder_f CN_IntegerUnlimited_encode_xer; +per_type_decoder_f CN_IntegerUnlimited_decode_uper; + +/*** <<< CODE [CN-IntegerUnlimited] >>> ***/ + +int +CN_IntegerUnlimited_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + /* Replace with underlying type checker */ + td->check_constraints = asn_DEF_INTEGER.check_constraints; + return td->check_constraints(td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using INTEGER, + * so here we adjust the DEF accordingly. + */ +static void +CN_IntegerUnlimited_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_INTEGER.free_struct; + td->print_struct = asn_DEF_INTEGER.print_struct; + td->ber_decoder = asn_DEF_INTEGER.ber_decoder; + td->der_encoder = asn_DEF_INTEGER.der_encoder; + td->xer_decoder = asn_DEF_INTEGER.xer_decoder; + td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; + td->elements = asn_DEF_INTEGER.elements; + td->elements_count = asn_DEF_INTEGER.elements_count; + td->specifics = asn_DEF_INTEGER.specifics; +} + +void +CN_IntegerUnlimited_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + CN_IntegerUnlimited_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +CN_IntegerUnlimited_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + CN_IntegerUnlimited_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +CN_IntegerUnlimited_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + CN_IntegerUnlimited_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +CN_IntegerUnlimited_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + CN_IntegerUnlimited_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +CN_IntegerUnlimited_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + CN_IntegerUnlimited_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +CN_IntegerUnlimited_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + CN_IntegerUnlimited_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +CN_IntegerUnlimited_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + CN_IntegerUnlimited_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [CN-IntegerUnlimited] >>> ***/ + +static ber_tlv_tag_t asn_DEF_CN_IntegerUnlimited_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_CN_IntegerUnlimited = { + "CN-IntegerUnlimited", + "CN-IntegerUnlimited", + CN_IntegerUnlimited_free, + CN_IntegerUnlimited_print, + CN_IntegerUnlimited_constraint, + CN_IntegerUnlimited_decode_ber, + CN_IntegerUnlimited_encode_der, + CN_IntegerUnlimited_decode_xer, + CN_IntegerUnlimited_encode_xer, + CN_IntegerUnlimited_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_CN_IntegerUnlimited_tags_1, + sizeof(asn_DEF_CN_IntegerUnlimited_tags_1) + /sizeof(asn_DEF_CN_IntegerUnlimited_tags_1[0]), /* 1 */ + asn_DEF_CN_IntegerUnlimited_tags_1, /* Same as above */ + sizeof(asn_DEF_CN_IntegerUnlimited_tags_1) + /sizeof(asn_DEF_CN_IntegerUnlimited_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [CN-IntegerMinMax] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [CN-IntegerMinMax] >>> ***/ + +typedef INTEGER_t CN_IntegerMinMax_t; + +/*** <<< FUNC-DECLS [CN-IntegerMinMax] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_CN_IntegerMinMax; +asn_struct_free_f CN_IntegerMinMax_free; +asn_struct_print_f CN_IntegerMinMax_print; +asn_constr_check_f CN_IntegerMinMax_constraint; +ber_type_decoder_f CN_IntegerMinMax_decode_ber; +der_type_encoder_f CN_IntegerMinMax_encode_der; +xer_type_decoder_f CN_IntegerMinMax_decode_xer; +xer_type_encoder_f CN_IntegerMinMax_encode_xer; +per_type_decoder_f CN_IntegerMinMax_decode_uper; + +/*** <<< CODE [CN-IntegerMinMax] >>> ***/ + +int +CN_IntegerMinMax_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + /* Replace with underlying type checker */ + td->check_constraints = asn_DEF_INTEGER.check_constraints; + return td->check_constraints(td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using INTEGER, + * so here we adjust the DEF accordingly. + */ +static void +CN_IntegerMinMax_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_INTEGER.free_struct; + td->print_struct = asn_DEF_INTEGER.print_struct; + td->ber_decoder = asn_DEF_INTEGER.ber_decoder; + td->der_encoder = asn_DEF_INTEGER.der_encoder; + td->xer_decoder = asn_DEF_INTEGER.xer_decoder; + td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; + td->elements = asn_DEF_INTEGER.elements; + td->elements_count = asn_DEF_INTEGER.elements_count; + td->specifics = asn_DEF_INTEGER.specifics; +} + +void +CN_IntegerMinMax_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + CN_IntegerMinMax_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +CN_IntegerMinMax_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + CN_IntegerMinMax_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +CN_IntegerMinMax_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + CN_IntegerMinMax_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +CN_IntegerMinMax_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + CN_IntegerMinMax_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +CN_IntegerMinMax_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + CN_IntegerMinMax_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +CN_IntegerMinMax_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + CN_IntegerMinMax_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +CN_IntegerMinMax_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + CN_IntegerMinMax_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [CN-IntegerMinMax] >>> ***/ + +static ber_tlv_tag_t asn_DEF_CN_IntegerMinMax_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static asn_per_constraints_t asn_PER_CN_IntegerMinMax_constr_1 = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_CN_IntegerMinMax = { + "CN-IntegerMinMax", + "CN-IntegerMinMax", + CN_IntegerMinMax_free, + CN_IntegerMinMax_print, + CN_IntegerMinMax_constraint, + CN_IntegerMinMax_decode_ber, + CN_IntegerMinMax_encode_der, + CN_IntegerMinMax_decode_xer, + CN_IntegerMinMax_encode_xer, + CN_IntegerMinMax_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_CN_IntegerMinMax_tags_1, + sizeof(asn_DEF_CN_IntegerMinMax_tags_1) + /sizeof(asn_DEF_CN_IntegerMinMax_tags_1[0]), /* 1 */ + asn_DEF_CN_IntegerMinMax_tags_1, /* Same as above */ + sizeof(asn_DEF_CN_IntegerMinMax_tags_1) + /sizeof(asn_DEF_CN_IntegerMinMax_tags_1[0]), /* 1 */ + &asn_PER_CN_IntegerMinMax_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [CN-IntegerMinLow] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [CN-IntegerMinLow] >>> ***/ + +typedef INTEGER_t CN_IntegerMinLow_t; + +/*** <<< FUNC-DECLS [CN-IntegerMinLow] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_CN_IntegerMinLow; +asn_struct_free_f CN_IntegerMinLow_free; +asn_struct_print_f CN_IntegerMinLow_print; +asn_constr_check_f CN_IntegerMinLow_constraint; +ber_type_decoder_f CN_IntegerMinLow_decode_ber; +der_type_encoder_f CN_IntegerMinLow_encode_der; +xer_type_decoder_f CN_IntegerMinLow_decode_xer; +xer_type_encoder_f CN_IntegerMinLow_encode_xer; +per_type_decoder_f CN_IntegerMinLow_decode_uper; + +/*** <<< CODE [CN-IntegerMinLow] >>> ***/ + +int +CN_IntegerMinLow_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value <= 1)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using INTEGER, + * so here we adjust the DEF accordingly. + */ +static void +CN_IntegerMinLow_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_INTEGER.free_struct; + td->print_struct = asn_DEF_INTEGER.print_struct; + td->ber_decoder = asn_DEF_INTEGER.ber_decoder; + td->der_encoder = asn_DEF_INTEGER.der_encoder; + td->xer_decoder = asn_DEF_INTEGER.xer_decoder; + td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; + td->elements = asn_DEF_INTEGER.elements; + td->elements_count = asn_DEF_INTEGER.elements_count; + td->specifics = asn_DEF_INTEGER.specifics; +} + +void +CN_IntegerMinLow_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + CN_IntegerMinLow_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +CN_IntegerMinLow_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + CN_IntegerMinLow_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +CN_IntegerMinLow_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + CN_IntegerMinLow_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +CN_IntegerMinLow_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + CN_IntegerMinLow_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +CN_IntegerMinLow_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + CN_IntegerMinLow_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +CN_IntegerMinLow_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + CN_IntegerMinLow_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +CN_IntegerMinLow_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + CN_IntegerMinLow_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [CN-IntegerMinLow] >>> ***/ + +static ber_tlv_tag_t asn_DEF_CN_IntegerMinLow_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static asn_per_constraints_t asn_PER_CN_IntegerMinLow_constr_1 = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 } /* (MIN..1) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_CN_IntegerMinLow = { + "CN-IntegerMinLow", + "CN-IntegerMinLow", + CN_IntegerMinLow_free, + CN_IntegerMinLow_print, + CN_IntegerMinLow_constraint, + CN_IntegerMinLow_decode_ber, + CN_IntegerMinLow_encode_der, + CN_IntegerMinLow_decode_xer, + CN_IntegerMinLow_encode_xer, + CN_IntegerMinLow_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_CN_IntegerMinLow_tags_1, + sizeof(asn_DEF_CN_IntegerMinLow_tags_1) + /sizeof(asn_DEF_CN_IntegerMinLow_tags_1[0]), /* 1 */ + asn_DEF_CN_IntegerMinLow_tags_1, /* Same as above */ + sizeof(asn_DEF_CN_IntegerMinLow_tags_1) + /sizeof(asn_DEF_CN_IntegerMinLow_tags_1[0]), /* 1 */ + &asn_PER_CN_IntegerMinLow_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [NO-IntegerMinHigh] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [NO-IntegerMinHigh] >>> ***/ + +typedef INTEGER_t NO_IntegerMinHigh_t; + +/*** <<< FUNC-DECLS [NO-IntegerMinHigh] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_NO_IntegerMinHigh; +asn_struct_free_f NO_IntegerMinHigh_free; +asn_struct_print_f NO_IntegerMinHigh_print; +asn_constr_check_f NO_IntegerMinHigh_constraint; +ber_type_decoder_f NO_IntegerMinHigh_decode_ber; +der_type_encoder_f NO_IntegerMinHigh_encode_der; +xer_type_decoder_f NO_IntegerMinHigh_decode_xer; +xer_type_encoder_f NO_IntegerMinHigh_encode_xer; +per_type_decoder_f NO_IntegerMinHigh_decode_uper; + +/*** <<< CODE [NO-IntegerMinHigh] >>> ***/ + +int +NO_IntegerMinHigh_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value <= 3000000000)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using INTEGER, + * so here we adjust the DEF accordingly. + */ +static void +NO_IntegerMinHigh_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_INTEGER.free_struct; + td->print_struct = asn_DEF_INTEGER.print_struct; + td->ber_decoder = asn_DEF_INTEGER.ber_decoder; + td->der_encoder = asn_DEF_INTEGER.der_encoder; + td->xer_decoder = asn_DEF_INTEGER.xer_decoder; + td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; + td->elements = asn_DEF_INTEGER.elements; + td->elements_count = asn_DEF_INTEGER.elements_count; + td->specifics = asn_DEF_INTEGER.specifics; +} + +void +NO_IntegerMinHigh_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + NO_IntegerMinHigh_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +NO_IntegerMinHigh_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerMinHigh_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerMinHigh_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + NO_IntegerMinHigh_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +NO_IntegerMinHigh_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerMinHigh_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerMinHigh_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + NO_IntegerMinHigh_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +NO_IntegerMinHigh_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerMinHigh_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerMinHigh_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + NO_IntegerMinHigh_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [NO-IntegerMinHigh] >>> ***/ + +static ber_tlv_tag_t asn_DEF_NO_IntegerMinHigh_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static asn_per_constraints_t asn_PER_NO_IntegerMinHigh_constr_1 = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 } /* (MIN..3000000000) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_NO_IntegerMinHigh = { + "NO-IntegerMinHigh", + "NO-IntegerMinHigh", + NO_IntegerMinHigh_free, + NO_IntegerMinHigh_print, + NO_IntegerMinHigh_constraint, + NO_IntegerMinHigh_decode_ber, + NO_IntegerMinHigh_encode_der, + NO_IntegerMinHigh_decode_xer, + NO_IntegerMinHigh_encode_xer, + NO_IntegerMinHigh_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_NO_IntegerMinHigh_tags_1, + sizeof(asn_DEF_NO_IntegerMinHigh_tags_1) + /sizeof(asn_DEF_NO_IntegerMinHigh_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerMinHigh_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerMinHigh_tags_1) + /sizeof(asn_DEF_NO_IntegerMinHigh_tags_1[0]), /* 1 */ + &asn_PER_NO_IntegerMinHigh_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [NO-IntegerLowHigh] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [NO-IntegerLowHigh] >>> ***/ + +typedef INTEGER_t NO_IntegerLowHigh_t; + +/*** <<< FUNC-DECLS [NO-IntegerLowHigh] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_NO_IntegerLowHigh; +asn_struct_free_f NO_IntegerLowHigh_free; +asn_struct_print_f NO_IntegerLowHigh_print; +asn_constr_check_f NO_IntegerLowHigh_constraint; +ber_type_decoder_f NO_IntegerLowHigh_decode_ber; +der_type_encoder_f NO_IntegerLowHigh_encode_der; +xer_type_decoder_f NO_IntegerLowHigh_decode_xer; +xer_type_encoder_f NO_IntegerLowHigh_encode_xer; +per_type_decoder_f NO_IntegerLowHigh_decode_uper; + +/*** <<< CODE [NO-IntegerLowHigh] >>> ***/ + +int +NO_IntegerLowHigh_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= 1 && value <= 3000000000)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using INTEGER, + * so here we adjust the DEF accordingly. + */ +static void +NO_IntegerLowHigh_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_INTEGER.free_struct; + td->print_struct = asn_DEF_INTEGER.print_struct; + td->ber_decoder = asn_DEF_INTEGER.ber_decoder; + td->der_encoder = asn_DEF_INTEGER.der_encoder; + td->xer_decoder = asn_DEF_INTEGER.xer_decoder; + td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; + td->elements = asn_DEF_INTEGER.elements; + td->elements_count = asn_DEF_INTEGER.elements_count; + td->specifics = asn_DEF_INTEGER.specifics; +} + +void +NO_IntegerLowHigh_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + NO_IntegerLowHigh_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +NO_IntegerLowHigh_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerLowHigh_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerLowHigh_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + NO_IntegerLowHigh_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +NO_IntegerLowHigh_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerLowHigh_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerLowHigh_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + NO_IntegerLowHigh_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +NO_IntegerLowHigh_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerLowHigh_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerLowHigh_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + NO_IntegerLowHigh_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [NO-IntegerLowHigh] >>> ***/ + +static ber_tlv_tag_t asn_DEF_NO_IntegerLowHigh_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static asn_per_constraints_t asn_PER_NO_IntegerLowHigh_constr_1 = { + { APC_CONSTRAINED, 32, -1, 1, 3000000000 } /* (1..3000000000) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_NO_IntegerLowHigh = { + "NO-IntegerLowHigh", + "NO-IntegerLowHigh", + NO_IntegerLowHigh_free, + NO_IntegerLowHigh_print, + NO_IntegerLowHigh_constraint, + NO_IntegerLowHigh_decode_ber, + NO_IntegerLowHigh_encode_der, + NO_IntegerLowHigh_decode_xer, + NO_IntegerLowHigh_encode_xer, + NO_IntegerLowHigh_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_NO_IntegerLowHigh_tags_1, + sizeof(asn_DEF_NO_IntegerLowHigh_tags_1) + /sizeof(asn_DEF_NO_IntegerLowHigh_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerLowHigh_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerLowHigh_tags_1) + /sizeof(asn_DEF_NO_IntegerLowHigh_tags_1[0]), /* 1 */ + &asn_PER_NO_IntegerLowHigh_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [CN-IntegerLowMax] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [CN-IntegerLowMax] >>> ***/ + +typedef INTEGER_t CN_IntegerLowMax_t; + +/*** <<< FUNC-DECLS [CN-IntegerLowMax] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_CN_IntegerLowMax; +asn_struct_free_f CN_IntegerLowMax_free; +asn_struct_print_f CN_IntegerLowMax_print; +asn_constr_check_f CN_IntegerLowMax_constraint; +ber_type_decoder_f CN_IntegerLowMax_decode_ber; +der_type_encoder_f CN_IntegerLowMax_encode_der; +xer_type_decoder_f CN_IntegerLowMax_decode_xer; +xer_type_encoder_f CN_IntegerLowMax_encode_xer; +per_type_decoder_f CN_IntegerLowMax_decode_uper; + +/*** <<< CODE [CN-IntegerLowMax] >>> ***/ + +int +CN_IntegerLowMax_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= 1)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using INTEGER, + * so here we adjust the DEF accordingly. + */ +static void +CN_IntegerLowMax_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_INTEGER.free_struct; + td->print_struct = asn_DEF_INTEGER.print_struct; + td->ber_decoder = asn_DEF_INTEGER.ber_decoder; + td->der_encoder = asn_DEF_INTEGER.der_encoder; + td->xer_decoder = asn_DEF_INTEGER.xer_decoder; + td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; + td->elements = asn_DEF_INTEGER.elements; + td->elements_count = asn_DEF_INTEGER.elements_count; + td->specifics = asn_DEF_INTEGER.specifics; +} + +void +CN_IntegerLowMax_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + CN_IntegerLowMax_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +CN_IntegerLowMax_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + CN_IntegerLowMax_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +CN_IntegerLowMax_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + CN_IntegerLowMax_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +CN_IntegerLowMax_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + CN_IntegerLowMax_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +CN_IntegerLowMax_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + CN_IntegerLowMax_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +CN_IntegerLowMax_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + CN_IntegerLowMax_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +CN_IntegerLowMax_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + CN_IntegerLowMax_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [CN-IntegerLowMax] >>> ***/ + +static ber_tlv_tag_t asn_DEF_CN_IntegerLowMax_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static asn_per_constraints_t asn_PER_CN_IntegerLowMax_constr_1 = { + { APC_SEMI_CONSTRAINED, -1, -1, 1, 0 } /* (1..MAX) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_CN_IntegerLowMax = { + "CN-IntegerLowMax", + "CN-IntegerLowMax", + CN_IntegerLowMax_free, + CN_IntegerLowMax_print, + CN_IntegerLowMax_constraint, + CN_IntegerLowMax_decode_ber, + CN_IntegerLowMax_encode_der, + CN_IntegerLowMax_decode_xer, + CN_IntegerLowMax_encode_xer, + CN_IntegerLowMax_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_CN_IntegerLowMax_tags_1, + sizeof(asn_DEF_CN_IntegerLowMax_tags_1) + /sizeof(asn_DEF_CN_IntegerLowMax_tags_1[0]), /* 1 */ + asn_DEF_CN_IntegerLowMax_tags_1, /* Same as above */ + sizeof(asn_DEF_CN_IntegerLowMax_tags_1) + /sizeof(asn_DEF_CN_IntegerLowMax_tags_1[0]), /* 1 */ + &asn_PER_CN_IntegerLowMax_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [NO-IntegerHighMax] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [NO-IntegerHighMax] >>> ***/ + +typedef INTEGER_t NO_IntegerHighMax_t; + +/*** <<< FUNC-DECLS [NO-IntegerHighMax] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_NO_IntegerHighMax; +asn_struct_free_f NO_IntegerHighMax_free; +asn_struct_print_f NO_IntegerHighMax_print; +asn_constr_check_f NO_IntegerHighMax_constraint; +ber_type_decoder_f NO_IntegerHighMax_decode_ber; +der_type_encoder_f NO_IntegerHighMax_encode_der; +xer_type_decoder_f NO_IntegerHighMax_decode_xer; +xer_type_encoder_f NO_IntegerHighMax_encode_xer; +per_type_decoder_f NO_IntegerHighMax_decode_uper; + +/*** <<< CODE [NO-IntegerHighMax] >>> ***/ + +int +NO_IntegerHighMax_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= 3000000000)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using INTEGER, + * so here we adjust the DEF accordingly. + */ +static void +NO_IntegerHighMax_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_INTEGER.free_struct; + td->print_struct = asn_DEF_INTEGER.print_struct; + td->ber_decoder = asn_DEF_INTEGER.ber_decoder; + td->der_encoder = asn_DEF_INTEGER.der_encoder; + td->xer_decoder = asn_DEF_INTEGER.xer_decoder; + td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; + td->elements = asn_DEF_INTEGER.elements; + td->elements_count = asn_DEF_INTEGER.elements_count; + td->specifics = asn_DEF_INTEGER.specifics; +} + +void +NO_IntegerHighMax_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + NO_IntegerHighMax_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +NO_IntegerHighMax_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerHighMax_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerHighMax_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + NO_IntegerHighMax_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +NO_IntegerHighMax_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerHighMax_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerHighMax_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + NO_IntegerHighMax_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +NO_IntegerHighMax_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerHighMax_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerHighMax_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + NO_IntegerHighMax_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [NO-IntegerHighMax] >>> ***/ + +static ber_tlv_tag_t asn_DEF_NO_IntegerHighMax_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static asn_per_constraints_t asn_PER_NO_IntegerHighMax_constr_1 = { + { APC_SEMI_CONSTRAINED, -1, -1, 3000000000, 0 } /* (3000000000..MAX) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_NO_IntegerHighMax = { + "NO-IntegerHighMax", + "NO-IntegerHighMax", + NO_IntegerHighMax_free, + NO_IntegerHighMax_print, + NO_IntegerHighMax_constraint, + NO_IntegerHighMax_decode_ber, + NO_IntegerHighMax_encode_der, + NO_IntegerHighMax_decode_xer, + NO_IntegerHighMax_encode_xer, + NO_IntegerHighMax_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_NO_IntegerHighMax_tags_1, + sizeof(asn_DEF_NO_IntegerHighMax_tags_1) + /sizeof(asn_DEF_NO_IntegerHighMax_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerHighMax_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerHighMax_tags_1) + /sizeof(asn_DEF_NO_IntegerHighMax_tags_1[0]), /* 1 */ + &asn_PER_NO_IntegerHighMax_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [NO-IntegerLowestMax] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [NO-IntegerLowestMax] >>> ***/ + +typedef INTEGER_t NO_IntegerLowestMax_t; + +/*** <<< FUNC-DECLS [NO-IntegerLowestMax] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_NO_IntegerLowestMax; +asn_struct_free_f NO_IntegerLowestMax_free; +asn_struct_print_f NO_IntegerLowestMax_print; +asn_constr_check_f NO_IntegerLowestMax_constraint; +ber_type_decoder_f NO_IntegerLowestMax_decode_ber; +der_type_encoder_f NO_IntegerLowestMax_encode_der; +xer_type_decoder_f NO_IntegerLowestMax_decode_xer; +xer_type_encoder_f NO_IntegerLowestMax_encode_xer; +per_type_decoder_f NO_IntegerLowestMax_decode_uper; + +/*** <<< CODE [NO-IntegerLowestMax] >>> ***/ + +int +NO_IntegerLowestMax_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= -3000000000)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using INTEGER, + * so here we adjust the DEF accordingly. + */ +static void +NO_IntegerLowestMax_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_INTEGER.free_struct; + td->print_struct = asn_DEF_INTEGER.print_struct; + td->ber_decoder = asn_DEF_INTEGER.ber_decoder; + td->der_encoder = asn_DEF_INTEGER.der_encoder; + td->xer_decoder = asn_DEF_INTEGER.xer_decoder; + td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; + td->elements = asn_DEF_INTEGER.elements; + td->elements_count = asn_DEF_INTEGER.elements_count; + td->specifics = asn_DEF_INTEGER.specifics; +} + +void +NO_IntegerLowestMax_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + NO_IntegerLowestMax_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +NO_IntegerLowestMax_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerLowestMax_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerLowestMax_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + NO_IntegerLowestMax_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +NO_IntegerLowestMax_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerLowestMax_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerLowestMax_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + NO_IntegerLowestMax_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +NO_IntegerLowestMax_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerLowestMax_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerLowestMax_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + NO_IntegerLowestMax_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [NO-IntegerLowestMax] >>> ***/ + +static ber_tlv_tag_t asn_DEF_NO_IntegerLowestMax_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static asn_per_constraints_t asn_PER_NO_IntegerLowestMax_constr_1 = { + { APC_SEMI_CONSTRAINED, -1, -1, -3000000000, 0 } /* (-3000000000..MAX) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_NO_IntegerLowestMax = { + "NO-IntegerLowestMax", + "NO-IntegerLowestMax", + NO_IntegerLowestMax_free, + NO_IntegerLowestMax_print, + NO_IntegerLowestMax_constraint, + NO_IntegerLowestMax_decode_ber, + NO_IntegerLowestMax_encode_der, + NO_IntegerLowestMax_decode_xer, + NO_IntegerLowestMax_encode_xer, + NO_IntegerLowestMax_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_NO_IntegerLowestMax_tags_1, + sizeof(asn_DEF_NO_IntegerLowestMax_tags_1) + /sizeof(asn_DEF_NO_IntegerLowestMax_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerLowestMax_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerLowestMax_tags_1) + /sizeof(asn_DEF_NO_IntegerLowestMax_tags_1[0]), /* 1 */ + &asn_PER_NO_IntegerLowestMax_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [NO-IntegerOutRange] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [NO-IntegerOutRange] >>> ***/ + +typedef INTEGER_t NO_IntegerOutRange_t; + +/*** <<< FUNC-DECLS [NO-IntegerOutRange] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_NO_IntegerOutRange; +asn_struct_free_f NO_IntegerOutRange_free; +asn_struct_print_f NO_IntegerOutRange_print; +asn_constr_check_f NO_IntegerOutRange_constraint; +ber_type_decoder_f NO_IntegerOutRange_decode_ber; +der_type_encoder_f NO_IntegerOutRange_encode_der; +xer_type_decoder_f NO_IntegerOutRange_decode_xer; +xer_type_encoder_f NO_IntegerOutRange_encode_xer; +per_type_decoder_f NO_IntegerOutRange_decode_uper; + +/*** <<< CODE [NO-IntegerOutRange] >>> ***/ + +int +NO_IntegerOutRange_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= 3000000000 && value <= 3000000001)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using INTEGER, + * so here we adjust the DEF accordingly. + */ +static void +NO_IntegerOutRange_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_INTEGER.free_struct; + td->print_struct = asn_DEF_INTEGER.print_struct; + td->ber_decoder = asn_DEF_INTEGER.ber_decoder; + td->der_encoder = asn_DEF_INTEGER.der_encoder; + td->xer_decoder = asn_DEF_INTEGER.xer_decoder; + td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; + td->elements = asn_DEF_INTEGER.elements; + td->elements_count = asn_DEF_INTEGER.elements_count; + td->specifics = asn_DEF_INTEGER.specifics; +} + +void +NO_IntegerOutRange_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + NO_IntegerOutRange_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +NO_IntegerOutRange_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerOutRange_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerOutRange_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + NO_IntegerOutRange_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +NO_IntegerOutRange_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerOutRange_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerOutRange_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + NO_IntegerOutRange_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +NO_IntegerOutRange_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerOutRange_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerOutRange_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + NO_IntegerOutRange_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [NO-IntegerOutRange] >>> ***/ + +static ber_tlv_tag_t asn_DEF_NO_IntegerOutRange_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static asn_per_constraints_t asn_PER_NO_IntegerOutRange_constr_1 = { + { APC_CONSTRAINED, 1, -1, 3000000000, 3000000001 } /* (3000000000..3000000001) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_NO_IntegerOutRange = { + "NO-IntegerOutRange", + "NO-IntegerOutRange", + NO_IntegerOutRange_free, + NO_IntegerOutRange_print, + NO_IntegerOutRange_constraint, + NO_IntegerOutRange_decode_ber, + NO_IntegerOutRange_encode_der, + NO_IntegerOutRange_decode_xer, + NO_IntegerOutRange_encode_xer, + NO_IntegerOutRange_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_NO_IntegerOutRange_tags_1, + sizeof(asn_DEF_NO_IntegerOutRange_tags_1) + /sizeof(asn_DEF_NO_IntegerOutRange_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerOutRange_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerOutRange_tags_1) + /sizeof(asn_DEF_NO_IntegerOutRange_tags_1[0]), /* 1 */ + &asn_PER_NO_IntegerOutRange_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [NO-IntegerOutValue] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [NO-IntegerOutValue] >>> ***/ + +typedef INTEGER_t NO_IntegerOutValue_t; + +/*** <<< FUNC-DECLS [NO-IntegerOutValue] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_NO_IntegerOutValue; +asn_struct_free_f NO_IntegerOutValue_free; +asn_struct_print_f NO_IntegerOutValue_print; +asn_constr_check_f NO_IntegerOutValue_constraint; +ber_type_decoder_f NO_IntegerOutValue_decode_ber; +der_type_encoder_f NO_IntegerOutValue_encode_der; +xer_type_decoder_f NO_IntegerOutValue_decode_xer; +xer_type_encoder_f NO_IntegerOutValue_encode_xer; +per_type_decoder_f NO_IntegerOutValue_decode_uper; + +/*** <<< CODE [NO-IntegerOutValue] >>> ***/ + +int +NO_IntegerOutValue_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value == 3000000000)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using INTEGER, + * so here we adjust the DEF accordingly. + */ +static void +NO_IntegerOutValue_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_INTEGER.free_struct; + td->print_struct = asn_DEF_INTEGER.print_struct; + td->ber_decoder = asn_DEF_INTEGER.ber_decoder; + td->der_encoder = asn_DEF_INTEGER.der_encoder; + td->xer_decoder = asn_DEF_INTEGER.xer_decoder; + td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; + td->elements = asn_DEF_INTEGER.elements; + td->elements_count = asn_DEF_INTEGER.elements_count; + td->specifics = asn_DEF_INTEGER.specifics; +} + +void +NO_IntegerOutValue_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + NO_IntegerOutValue_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +NO_IntegerOutValue_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerOutValue_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerOutValue_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + NO_IntegerOutValue_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +NO_IntegerOutValue_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerOutValue_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerOutValue_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + NO_IntegerOutValue_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +NO_IntegerOutValue_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerOutValue_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerOutValue_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + NO_IntegerOutValue_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [NO-IntegerOutValue] >>> ***/ + +static ber_tlv_tag_t asn_DEF_NO_IntegerOutValue_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static asn_per_constraints_t asn_PER_NO_IntegerOutValue_constr_1 = { + { APC_CONSTRAINED, 0, -1, 3000000000, 3000000000 } /* (3000000000..3000000000) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_NO_IntegerOutValue = { + "NO-IntegerOutValue", + "NO-IntegerOutValue", + NO_IntegerOutValue_free, + NO_IntegerOutValue_print, + NO_IntegerOutValue_constraint, + NO_IntegerOutValue_decode_ber, + NO_IntegerOutValue_encode_der, + NO_IntegerOutValue_decode_xer, + NO_IntegerOutValue_encode_xer, + NO_IntegerOutValue_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_NO_IntegerOutValue_tags_1, + sizeof(asn_DEF_NO_IntegerOutValue_tags_1) + /sizeof(asn_DEF_NO_IntegerOutValue_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerOutValue_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerOutValue_tags_1) + /sizeof(asn_DEF_NO_IntegerOutValue_tags_1[0]), /* 1 */ + &asn_PER_NO_IntegerOutValue_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [OK-IntegerInRange1] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [OK-IntegerInRange1] >>> ***/ + +typedef long OK_IntegerInRange1_t; + +/*** <<< FUNC-DECLS [OK-IntegerInRange1] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange1; +asn_struct_free_f OK_IntegerInRange1_free; +asn_struct_print_f OK_IntegerInRange1_print; +asn_constr_check_f OK_IntegerInRange1_constraint; +ber_type_decoder_f OK_IntegerInRange1_decode_ber; +der_type_encoder_f OK_IntegerInRange1_encode_der; +xer_type_decoder_f OK_IntegerInRange1_decode_xer; +xer_type_encoder_f OK_IntegerInRange1_encode_xer; +per_type_decoder_f OK_IntegerInRange1_decode_uper; + +/*** <<< CODE [OK-IntegerInRange1] >>> ***/ + +int +OK_IntegerInRange1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= -100 && value <= 100)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static void +OK_IntegerInRange1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_NativeInteger.free_struct; + td->print_struct = asn_DEF_NativeInteger.print_struct; + td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; + td->der_encoder = asn_DEF_NativeInteger.der_encoder; + td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; + td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; + td->elements = asn_DEF_NativeInteger.elements; + td->elements_count = asn_DEF_NativeInteger.elements_count; + td->specifics = asn_DEF_NativeInteger.specifics; +} + +void +OK_IntegerInRange1_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + OK_IntegerInRange1_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +OK_IntegerInRange1_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + OK_IntegerInRange1_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +OK_IntegerInRange1_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + OK_IntegerInRange1_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +OK_IntegerInRange1_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + OK_IntegerInRange1_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +OK_IntegerInRange1_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + OK_IntegerInRange1_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +OK_IntegerInRange1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + OK_IntegerInRange1_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +OK_IntegerInRange1_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + OK_IntegerInRange1_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [OK-IntegerInRange1] >>> ***/ + +static ber_tlv_tag_t asn_DEF_OK_IntegerInRange1_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static asn_per_constraints_t asn_PER_OK_IntegerInRange1_constr_1 = { + { APC_CONSTRAINED, 8, 8, -100, 100 } /* (-100..100) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange1 = { + "OK-IntegerInRange1", + "OK-IntegerInRange1", + OK_IntegerInRange1_free, + OK_IntegerInRange1_print, + OK_IntegerInRange1_constraint, + OK_IntegerInRange1_decode_ber, + OK_IntegerInRange1_encode_der, + OK_IntegerInRange1_decode_xer, + OK_IntegerInRange1_encode_xer, + OK_IntegerInRange1_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_OK_IntegerInRange1_tags_1, + sizeof(asn_DEF_OK_IntegerInRange1_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange1_tags_1[0]), /* 1 */ + asn_DEF_OK_IntegerInRange1_tags_1, /* Same as above */ + sizeof(asn_DEF_OK_IntegerInRange1_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange1_tags_1[0]), /* 1 */ + &asn_PER_OK_IntegerInRange1_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [OK-IntegerInRange2] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [OK-IntegerInRange2] >>> ***/ + +typedef long OK_IntegerInRange2_t; + +/*** <<< FUNC-DECLS [OK-IntegerInRange2] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange2; +asn_struct_free_f OK_IntegerInRange2_free; +asn_struct_print_f OK_IntegerInRange2_print; +asn_constr_check_f OK_IntegerInRange2_constraint; +ber_type_decoder_f OK_IntegerInRange2_decode_ber; +der_type_encoder_f OK_IntegerInRange2_encode_der; +xer_type_decoder_f OK_IntegerInRange2_decode_xer; +xer_type_encoder_f OK_IntegerInRange2_encode_xer; +per_type_decoder_f OK_IntegerInRange2_decode_uper; + +/*** <<< CODE [OK-IntegerInRange2] >>> ***/ + +int +OK_IntegerInRange2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if(((value == -100) || (value == 100))) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static void +OK_IntegerInRange2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_NativeInteger.free_struct; + td->print_struct = asn_DEF_NativeInteger.print_struct; + td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; + td->der_encoder = asn_DEF_NativeInteger.der_encoder; + td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; + td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; + td->elements = asn_DEF_NativeInteger.elements; + td->elements_count = asn_DEF_NativeInteger.elements_count; + td->specifics = asn_DEF_NativeInteger.specifics; +} + +void +OK_IntegerInRange2_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + OK_IntegerInRange2_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +OK_IntegerInRange2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + OK_IntegerInRange2_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +OK_IntegerInRange2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + OK_IntegerInRange2_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +OK_IntegerInRange2_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + OK_IntegerInRange2_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +OK_IntegerInRange2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + OK_IntegerInRange2_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +OK_IntegerInRange2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + OK_IntegerInRange2_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +OK_IntegerInRange2_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + OK_IntegerInRange2_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [OK-IntegerInRange2] >>> ***/ + +static ber_tlv_tag_t asn_DEF_OK_IntegerInRange2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static asn_per_constraints_t asn_PER_OK_IntegerInRange2_constr_1 = { + { APC_CONSTRAINED, 8, 8, -100, 100 } /* (-100..100) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange2 = { + "OK-IntegerInRange2", + "OK-IntegerInRange2", + OK_IntegerInRange2_free, + OK_IntegerInRange2_print, + OK_IntegerInRange2_constraint, + OK_IntegerInRange2_decode_ber, + OK_IntegerInRange2_encode_der, + OK_IntegerInRange2_decode_xer, + OK_IntegerInRange2_encode_xer, + OK_IntegerInRange2_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_OK_IntegerInRange2_tags_1, + sizeof(asn_DEF_OK_IntegerInRange2_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange2_tags_1[0]), /* 1 */ + asn_DEF_OK_IntegerInRange2_tags_1, /* Same as above */ + sizeof(asn_DEF_OK_IntegerInRange2_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange2_tags_1[0]), /* 1 */ + &asn_PER_OK_IntegerInRange2_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [OK-IntegerInRange3] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [OK-IntegerInRange3] >>> ***/ + +typedef long OK_IntegerInRange3_t; + +/*** <<< FUNC-DECLS [OK-IntegerInRange3] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange3; +asn_struct_free_f OK_IntegerInRange3_free; +asn_struct_print_f OK_IntegerInRange3_print; +asn_constr_check_f OK_IntegerInRange3_constraint; +ber_type_decoder_f OK_IntegerInRange3_decode_ber; +der_type_encoder_f OK_IntegerInRange3_encode_der; +xer_type_decoder_f OK_IntegerInRange3_decode_xer; +xer_type_encoder_f OK_IntegerInRange3_encode_xer; +per_type_decoder_f OK_IntegerInRange3_decode_uper; + +/*** <<< CODE [OK-IntegerInRange3] >>> ***/ + +int +OK_IntegerInRange3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= -2147483648 && value <= 2147483647)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static void +OK_IntegerInRange3_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_NativeInteger.free_struct; + td->print_struct = asn_DEF_NativeInteger.print_struct; + td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; + td->der_encoder = asn_DEF_NativeInteger.der_encoder; + td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; + td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; + td->elements = asn_DEF_NativeInteger.elements; + td->elements_count = asn_DEF_NativeInteger.elements_count; + td->specifics = asn_DEF_NativeInteger.specifics; +} + +void +OK_IntegerInRange3_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + OK_IntegerInRange3_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +OK_IntegerInRange3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + OK_IntegerInRange3_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +OK_IntegerInRange3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + OK_IntegerInRange3_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +OK_IntegerInRange3_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + OK_IntegerInRange3_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +OK_IntegerInRange3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + OK_IntegerInRange3_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +OK_IntegerInRange3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + OK_IntegerInRange3_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +OK_IntegerInRange3_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + OK_IntegerInRange3_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [OK-IntegerInRange3] >>> ***/ + +static ber_tlv_tag_t asn_DEF_OK_IntegerInRange3_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static asn_per_constraints_t asn_PER_OK_IntegerInRange3_constr_1 = { + { APC_CONSTRAINED, 32, -1, -2147483648, 2147483647 } /* (-2147483648..2147483647) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange3 = { + "OK-IntegerInRange3", + "OK-IntegerInRange3", + OK_IntegerInRange3_free, + OK_IntegerInRange3_print, + OK_IntegerInRange3_constraint, + OK_IntegerInRange3_decode_ber, + OK_IntegerInRange3_encode_der, + OK_IntegerInRange3_decode_xer, + OK_IntegerInRange3_encode_xer, + OK_IntegerInRange3_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_OK_IntegerInRange3_tags_1, + sizeof(asn_DEF_OK_IntegerInRange3_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange3_tags_1[0]), /* 1 */ + asn_DEF_OK_IntegerInRange3_tags_1, /* Same as above */ + sizeof(asn_DEF_OK_IntegerInRange3_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange3_tags_1[0]), /* 1 */ + &asn_PER_OK_IntegerInRange3_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [OK-IntegerInRange4] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [OK-IntegerInRange4] >>> ***/ + +typedef long OK_IntegerInRange4_t; + +/*** <<< FUNC-DECLS [OK-IntegerInRange4] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange4; +asn_struct_free_f OK_IntegerInRange4_free; +asn_struct_print_f OK_IntegerInRange4_print; +asn_constr_check_f OK_IntegerInRange4_constraint; +ber_type_decoder_f OK_IntegerInRange4_decode_ber; +der_type_encoder_f OK_IntegerInRange4_encode_der; +xer_type_decoder_f OK_IntegerInRange4_decode_xer; +xer_type_encoder_f OK_IntegerInRange4_encode_xer; +per_type_decoder_f OK_IntegerInRange4_decode_uper; + +/*** <<< CODE [OK-IntegerInRange4] >>> ***/ + +int +OK_IntegerInRange4_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if(((value == -2147483648) || (value == 2147483647))) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static void +OK_IntegerInRange4_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_NativeInteger.free_struct; + td->print_struct = asn_DEF_NativeInteger.print_struct; + td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; + td->der_encoder = asn_DEF_NativeInteger.der_encoder; + td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; + td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; + td->elements = asn_DEF_NativeInteger.elements; + td->elements_count = asn_DEF_NativeInteger.elements_count; + td->specifics = asn_DEF_NativeInteger.specifics; +} + +void +OK_IntegerInRange4_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + OK_IntegerInRange4_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +OK_IntegerInRange4_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + OK_IntegerInRange4_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +OK_IntegerInRange4_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + OK_IntegerInRange4_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +OK_IntegerInRange4_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + OK_IntegerInRange4_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +OK_IntegerInRange4_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + OK_IntegerInRange4_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +OK_IntegerInRange4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + OK_IntegerInRange4_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +OK_IntegerInRange4_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + OK_IntegerInRange4_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [OK-IntegerInRange4] >>> ***/ + +static ber_tlv_tag_t asn_DEF_OK_IntegerInRange4_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static asn_per_constraints_t asn_PER_OK_IntegerInRange4_constr_1 = { + { APC_CONSTRAINED, 32, -1, -2147483648, 2147483647 } /* (-2147483648..2147483647) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange4 = { + "OK-IntegerInRange4", + "OK-IntegerInRange4", + OK_IntegerInRange4_free, + OK_IntegerInRange4_print, + OK_IntegerInRange4_constraint, + OK_IntegerInRange4_decode_ber, + OK_IntegerInRange4_encode_der, + OK_IntegerInRange4_decode_xer, + OK_IntegerInRange4_encode_xer, + OK_IntegerInRange4_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_OK_IntegerInRange4_tags_1, + sizeof(asn_DEF_OK_IntegerInRange4_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange4_tags_1[0]), /* 1 */ + asn_DEF_OK_IntegerInRange4_tags_1, /* Same as above */ + sizeof(asn_DEF_OK_IntegerInRange4_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange4_tags_1[0]), /* 1 */ + &asn_PER_OK_IntegerInRange4_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [OK-IntegerInRange5] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [OK-IntegerInRange5] >>> ***/ + +typedef INTEGER_t OK_IntegerInRange5_t; + +/*** <<< FUNC-DECLS [OK-IntegerInRange5] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange5; +asn_struct_free_f OK_IntegerInRange5_free; +asn_struct_print_f OK_IntegerInRange5_print; +asn_constr_check_f OK_IntegerInRange5_constraint; +ber_type_decoder_f OK_IntegerInRange5_decode_ber; +der_type_encoder_f OK_IntegerInRange5_encode_der; +xer_type_decoder_f OK_IntegerInRange5_decode_xer; +xer_type_encoder_f OK_IntegerInRange5_encode_xer; +per_type_decoder_f OK_IntegerInRange5_decode_uper; + +/*** <<< CODE [OK-IntegerInRange5] >>> ***/ + +int +OK_IntegerInRange5_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(((value == -2147483648) || (value == 2147483647))) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using INTEGER, + * so here we adjust the DEF accordingly. + */ +static void +OK_IntegerInRange5_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_INTEGER.free_struct; + td->print_struct = asn_DEF_INTEGER.print_struct; + td->ber_decoder = asn_DEF_INTEGER.ber_decoder; + td->der_encoder = asn_DEF_INTEGER.der_encoder; + td->xer_decoder = asn_DEF_INTEGER.xer_decoder; + td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; + td->elements = asn_DEF_INTEGER.elements; + td->elements_count = asn_DEF_INTEGER.elements_count; + td->specifics = asn_DEF_INTEGER.specifics; +} + +void +OK_IntegerInRange5_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + OK_IntegerInRange5_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +OK_IntegerInRange5_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + OK_IntegerInRange5_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +OK_IntegerInRange5_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + OK_IntegerInRange5_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +OK_IntegerInRange5_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + OK_IntegerInRange5_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +OK_IntegerInRange5_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + OK_IntegerInRange5_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +OK_IntegerInRange5_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + OK_IntegerInRange5_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +OK_IntegerInRange5_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + OK_IntegerInRange5_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [OK-IntegerInRange5] >>> ***/ + +static ber_tlv_tag_t asn_DEF_OK_IntegerInRange5_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static asn_per_constraints_t asn_PER_OK_IntegerInRange5_constr_1 = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 32, -1, -2147483648, 2147483647 } /* (-2147483648..2147483647,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange5 = { + "OK-IntegerInRange5", + "OK-IntegerInRange5", + OK_IntegerInRange5_free, + OK_IntegerInRange5_print, + OK_IntegerInRange5_constraint, + OK_IntegerInRange5_decode_ber, + OK_IntegerInRange5_encode_der, + OK_IntegerInRange5_decode_xer, + OK_IntegerInRange5_encode_xer, + OK_IntegerInRange5_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_OK_IntegerInRange5_tags_1, + sizeof(asn_DEF_OK_IntegerInRange5_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange5_tags_1[0]), /* 1 */ + asn_DEF_OK_IntegerInRange5_tags_1, /* Same as above */ + sizeof(asn_DEF_OK_IntegerInRange5_tags_1) + /sizeof(asn_DEF_OK_IntegerInRange5_tags_1[0]), /* 1 */ + &asn_PER_OK_IntegerInRange5_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [NO-IntegerInRange6] >>> ***/ + +#include + +/*** <<< TYPE-DECLS [NO-IntegerInRange6] >>> ***/ + +typedef INTEGER_t NO_IntegerInRange6_t; + +/*** <<< FUNC-DECLS [NO-IntegerInRange6] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_NO_IntegerInRange6; +asn_struct_free_f NO_IntegerInRange6_free; +asn_struct_print_f NO_IntegerInRange6_print; +asn_constr_check_f NO_IntegerInRange6_constraint; +ber_type_decoder_f NO_IntegerInRange6_decode_ber; +der_type_encoder_f NO_IntegerInRange6_encode_der; +xer_type_decoder_f NO_IntegerInRange6_decode_xer; +xer_type_encoder_f NO_IntegerInRange6_encode_xer; +per_type_decoder_f NO_IntegerInRange6_decode_uper; + +/*** <<< CODE [NO-IntegerInRange6] >>> ***/ + +int +NO_IntegerInRange6_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + _ASN_ERRLOG(app_errlog, app_key, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= 0 && value <= 4294967295)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_ERRLOG(app_errlog, app_key, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using INTEGER, + * so here we adjust the DEF accordingly. + */ +static void +NO_IntegerInRange6_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_INTEGER.free_struct; + td->print_struct = asn_DEF_INTEGER.print_struct; + td->ber_decoder = asn_DEF_INTEGER.ber_decoder; + td->der_encoder = asn_DEF_INTEGER.der_encoder; + td->xer_decoder = asn_DEF_INTEGER.xer_decoder; + td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; + td->elements = asn_DEF_INTEGER.elements; + td->elements_count = asn_DEF_INTEGER.elements_count; + td->specifics = asn_DEF_INTEGER.specifics; +} + +void +NO_IntegerInRange6_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + NO_IntegerInRange6_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +NO_IntegerInRange6_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerInRange6_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerInRange6_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + NO_IntegerInRange6_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +NO_IntegerInRange6_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerInRange6_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerInRange6_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + NO_IntegerInRange6_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +NO_IntegerInRange6_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerInRange6_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerInRange6_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + NO_IntegerInRange6_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [NO-IntegerInRange6] >>> ***/ + +static ber_tlv_tag_t asn_DEF_NO_IntegerInRange6_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static asn_per_constraints_t asn_PER_NO_IntegerInRange6_constr_1 = { + { APC_CONSTRAINED, 32, -1, 0, 4294967295 } /* (0..4294967295) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_NO_IntegerInRange6 = { + "NO-IntegerInRange6", + "NO-IntegerInRange6", + NO_IntegerInRange6_free, + NO_IntegerInRange6_print, + NO_IntegerInRange6_constraint, + NO_IntegerInRange6_decode_ber, + NO_IntegerInRange6_encode_der, + NO_IntegerInRange6_decode_xer, + NO_IntegerInRange6_encode_xer, + NO_IntegerInRange6_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_NO_IntegerInRange6_tags_1, + sizeof(asn_DEF_NO_IntegerInRange6_tags_1) + /sizeof(asn_DEF_NO_IntegerInRange6_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerInRange6_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerInRange6_tags_1) + /sizeof(asn_DEF_NO_IntegerInRange6_tags_1[0]), /* 1 */ + &asn_PER_NO_IntegerInRange6_constr_1, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [CN-IntegerEnumerated1] >>> ***/ + +#include + +/*** <<< DEPS [CN-IntegerEnumerated1] >>> ***/ + +typedef enum CN_IntegerEnumerated1 { + CN_IntegerEnumerated1_a = 1, + CN_IntegerEnumerated1_b = 2 +} CN_IntegerEnumerated1_e; + +/*** <<< TYPE-DECLS [CN-IntegerEnumerated1] >>> ***/ + +typedef INTEGER_t CN_IntegerEnumerated1_t; + +/*** <<< FUNC-DECLS [CN-IntegerEnumerated1] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_CN_IntegerEnumerated1; +asn_struct_free_f CN_IntegerEnumerated1_free; +asn_struct_print_f CN_IntegerEnumerated1_print; +asn_constr_check_f CN_IntegerEnumerated1_constraint; +ber_type_decoder_f CN_IntegerEnumerated1_decode_ber; +der_type_encoder_f CN_IntegerEnumerated1_encode_der; +xer_type_decoder_f CN_IntegerEnumerated1_decode_xer; +xer_type_encoder_f CN_IntegerEnumerated1_encode_xer; +per_type_decoder_f CN_IntegerEnumerated1_decode_uper; + +/*** <<< CODE [CN-IntegerEnumerated1] >>> ***/ + +int +CN_IntegerEnumerated1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + /* Replace with underlying type checker */ + td->check_constraints = asn_DEF_INTEGER.check_constraints; + return td->check_constraints(td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using INTEGER, + * so here we adjust the DEF accordingly. + */ +static void +CN_IntegerEnumerated1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_INTEGER.free_struct; + td->print_struct = asn_DEF_INTEGER.print_struct; + td->ber_decoder = asn_DEF_INTEGER.ber_decoder; + td->der_encoder = asn_DEF_INTEGER.der_encoder; + td->xer_decoder = asn_DEF_INTEGER.xer_decoder; + td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; + td->elements = asn_DEF_INTEGER.elements; + td->elements_count = asn_DEF_INTEGER.elements_count; + td->specifics = asn_DEF_INTEGER.specifics; +} + +void +CN_IntegerEnumerated1_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + CN_IntegerEnumerated1_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +CN_IntegerEnumerated1_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + CN_IntegerEnumerated1_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +CN_IntegerEnumerated1_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + CN_IntegerEnumerated1_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +CN_IntegerEnumerated1_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + CN_IntegerEnumerated1_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +CN_IntegerEnumerated1_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + CN_IntegerEnumerated1_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +CN_IntegerEnumerated1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + CN_IntegerEnumerated1_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +CN_IntegerEnumerated1_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + CN_IntegerEnumerated1_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [CN-IntegerEnumerated1] >>> ***/ + +static ber_tlv_tag_t asn_DEF_CN_IntegerEnumerated1_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_CN_IntegerEnumerated1 = { + "CN-IntegerEnumerated1", + "CN-IntegerEnumerated1", + CN_IntegerEnumerated1_free, + CN_IntegerEnumerated1_print, + CN_IntegerEnumerated1_constraint, + CN_IntegerEnumerated1_decode_ber, + CN_IntegerEnumerated1_encode_der, + CN_IntegerEnumerated1_decode_xer, + CN_IntegerEnumerated1_encode_xer, + CN_IntegerEnumerated1_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_CN_IntegerEnumerated1_tags_1, + sizeof(asn_DEF_CN_IntegerEnumerated1_tags_1) + /sizeof(asn_DEF_CN_IntegerEnumerated1_tags_1[0]), /* 1 */ + asn_DEF_CN_IntegerEnumerated1_tags_1, /* Same as above */ + sizeof(asn_DEF_CN_IntegerEnumerated1_tags_1) + /sizeof(asn_DEF_CN_IntegerEnumerated1_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + 0, 0, /* Defined elsewhere */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [NO-IntegerEnumerated2] >>> ***/ + +#include + +/*** <<< DEPS [NO-IntegerEnumerated2] >>> ***/ + +typedef enum NO_IntegerEnumerated2 { + NO_IntegerEnumerated2_a = 1, + NO_IntegerEnumerated2_b = 3000000000 +} NO_IntegerEnumerated2_e; + +/*** <<< TYPE-DECLS [NO-IntegerEnumerated2] >>> ***/ + +typedef INTEGER_t NO_IntegerEnumerated2_t; + +/*** <<< FUNC-DECLS [NO-IntegerEnumerated2] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_NO_IntegerEnumerated2; +asn_struct_free_f NO_IntegerEnumerated2_free; +asn_struct_print_f NO_IntegerEnumerated2_print; +asn_constr_check_f NO_IntegerEnumerated2_constraint; +ber_type_decoder_f NO_IntegerEnumerated2_decode_ber; +der_type_encoder_f NO_IntegerEnumerated2_encode_der; +xer_type_decoder_f NO_IntegerEnumerated2_decode_xer; +xer_type_encoder_f NO_IntegerEnumerated2_encode_xer; +per_type_decoder_f NO_IntegerEnumerated2_decode_uper; + +/*** <<< CODE [NO-IntegerEnumerated2] >>> ***/ + +int +NO_IntegerEnumerated2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *app_errlog, void *app_key) { + /* Replace with underlying type checker */ + td->check_constraints = asn_DEF_INTEGER.check_constraints; + return td->check_constraints(td, sptr, app_errlog, app_key); +} + +/* + * This type is implemented using INTEGER, + * so here we adjust the DEF accordingly. + */ +static void +NO_IntegerEnumerated2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_INTEGER.free_struct; + td->print_struct = asn_DEF_INTEGER.print_struct; + td->ber_decoder = asn_DEF_INTEGER.ber_decoder; + td->der_encoder = asn_DEF_INTEGER.der_encoder; + td->xer_decoder = asn_DEF_INTEGER.xer_decoder; + td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; + td->elements = asn_DEF_INTEGER.elements; + td->elements_count = asn_DEF_INTEGER.elements_count; + td->specifics = asn_DEF_INTEGER.specifics; +} + +void +NO_IntegerEnumerated2_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + NO_IntegerEnumerated2_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +NO_IntegerEnumerated2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerEnumerated2_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerEnumerated2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + NO_IntegerEnumerated2_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +NO_IntegerEnumerated2_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerEnumerated2_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerEnumerated2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + NO_IntegerEnumerated2_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +NO_IntegerEnumerated2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + NO_IntegerEnumerated2_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +asn_dec_rval_t +NO_IntegerEnumerated2_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + NO_IntegerEnumerated2_1_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + + +/*** <<< STAT-DEFS [NO-IntegerEnumerated2] >>> ***/ + +static ber_tlv_tag_t asn_DEF_NO_IntegerEnumerated2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_NO_IntegerEnumerated2 = { + "NO-IntegerEnumerated2", + "NO-IntegerEnumerated2", + NO_IntegerEnumerated2_free, + NO_IntegerEnumerated2_print, + NO_IntegerEnumerated2_constraint, + NO_IntegerEnumerated2_decode_ber, + NO_IntegerEnumerated2_encode_der, + NO_IntegerEnumerated2_decode_xer, + NO_IntegerEnumerated2_encode_xer, + NO_IntegerEnumerated2_decode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_NO_IntegerEnumerated2_tags_1, + sizeof(asn_DEF_NO_IntegerEnumerated2_tags_1) + /sizeof(asn_DEF_NO_IntegerEnumerated2_tags_1[0]), /* 1 */ + asn_DEF_NO_IntegerEnumerated2_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_IntegerEnumerated2_tags_1) + /sizeof(asn_DEF_NO_IntegerEnumerated2_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + 0, 0, /* Defined elsewhere */ + 0 /* No specifics */ +}; + diff --git a/tests/91-cond-int-blessSize-OK.asn1.-Pfbless-SIZE b/tests/91-cond-int-blessSize-OK.asn1.-Pfbless-SIZE index 5fe0bd3c1..1164e4189 100644 --- a/tests/91-cond-int-blessSize-OK.asn1.-Pfbless-SIZE +++ b/tests/91-cond-int-blessSize-OK.asn1.-Pfbless-SIZE @@ -53,6 +53,9 @@ OK_Integer1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; @@ -105,7 +108,7 @@ OK_Integer1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [OK-Integer1] >>> ***/ -static ber_tlv_tag_t asn_DEF_OK_Integer1_1_tags[] = { +static ber_tlv_tag_t asn_DEF_OK_Integer1_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_OK_Integer1 = { @@ -118,13 +121,15 @@ asn_TYPE_descriptor_t asn_DEF_OK_Integer1 = { OK_Integer1_encode_der, OK_Integer1_decode_xer, OK_Integer1_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_OK_Integer1_1_tags, - sizeof(asn_DEF_OK_Integer1_1_tags) - /sizeof(asn_DEF_OK_Integer1_1_tags[0]), /* 1 */ - asn_DEF_OK_Integer1_1_tags, /* Same as above */ - sizeof(asn_DEF_OK_Integer1_1_tags) - /sizeof(asn_DEF_OK_Integer1_1_tags[0]), /* 1 */ + asn_DEF_OK_Integer1_tags_1, + sizeof(asn_DEF_OK_Integer1_tags_1) + /sizeof(asn_DEF_OK_Integer1_tags_1[0]), /* 1 */ + asn_DEF_OK_Integer1_tags_1, /* Same as above */ + sizeof(asn_DEF_OK_Integer1_tags_1) + /sizeof(asn_DEF_OK_Integer1_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -184,6 +189,9 @@ OK_Integer2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; @@ -236,7 +244,7 @@ OK_Integer2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [OK-Integer2] >>> ***/ -static ber_tlv_tag_t asn_DEF_OK_Integer2_1_tags[] = { +static ber_tlv_tag_t asn_DEF_OK_Integer2_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_OK_Integer2 = { @@ -249,13 +257,15 @@ asn_TYPE_descriptor_t asn_DEF_OK_Integer2 = { OK_Integer2_encode_der, OK_Integer2_decode_xer, OK_Integer2_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_OK_Integer2_1_tags, - sizeof(asn_DEF_OK_Integer2_1_tags) - /sizeof(asn_DEF_OK_Integer2_1_tags[0]), /* 1 */ - asn_DEF_OK_Integer2_1_tags, /* Same as above */ - sizeof(asn_DEF_OK_Integer2_1_tags) - /sizeof(asn_DEF_OK_Integer2_1_tags[0]), /* 1 */ + asn_DEF_OK_Integer2_tags_1, + sizeof(asn_DEF_OK_Integer2_tags_1) + /sizeof(asn_DEF_OK_Integer2_tags_1[0]), /* 1 */ + asn_DEF_OK_Integer2_tags_1, /* Same as above */ + sizeof(asn_DEF_OK_Integer2_tags_1) + /sizeof(asn_DEF_OK_Integer2_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -315,6 +325,9 @@ OK_Integer3_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; @@ -367,7 +380,7 @@ OK_Integer3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [OK-Integer3] >>> ***/ -static ber_tlv_tag_t asn_DEF_OK_Integer3_1_tags[] = { +static ber_tlv_tag_t asn_DEF_OK_Integer3_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_OK_Integer3 = { @@ -380,13 +393,15 @@ asn_TYPE_descriptor_t asn_DEF_OK_Integer3 = { OK_Integer3_encode_der, OK_Integer3_decode_xer, OK_Integer3_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_OK_Integer3_1_tags, - sizeof(asn_DEF_OK_Integer3_1_tags) - /sizeof(asn_DEF_OK_Integer3_1_tags[0]), /* 1 */ - asn_DEF_OK_Integer3_1_tags, /* Same as above */ - sizeof(asn_DEF_OK_Integer3_1_tags) - /sizeof(asn_DEF_OK_Integer3_1_tags[0]), /* 1 */ + asn_DEF_OK_Integer3_tags_1, + sizeof(asn_DEF_OK_Integer3_tags_1) + /sizeof(asn_DEF_OK_Integer3_tags_1[0]), /* 1 */ + asn_DEF_OK_Integer3_tags_1, /* Same as above */ + sizeof(asn_DEF_OK_Integer3_tags_1) + /sizeof(asn_DEF_OK_Integer3_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -446,6 +461,9 @@ OK_Integer4_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; @@ -498,7 +516,7 @@ OK_Integer4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [OK-Integer4] >>> ***/ -static ber_tlv_tag_t asn_DEF_OK_Integer4_1_tags[] = { +static ber_tlv_tag_t asn_DEF_OK_Integer4_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_OK_Integer4 = { @@ -511,13 +529,15 @@ asn_TYPE_descriptor_t asn_DEF_OK_Integer4 = { OK_Integer4_encode_der, OK_Integer4_decode_xer, OK_Integer4_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_OK_Integer4_1_tags, - sizeof(asn_DEF_OK_Integer4_1_tags) - /sizeof(asn_DEF_OK_Integer4_1_tags[0]), /* 1 */ - asn_DEF_OK_Integer4_1_tags, /* Same as above */ - sizeof(asn_DEF_OK_Integer4_1_tags) - /sizeof(asn_DEF_OK_Integer4_1_tags[0]), /* 1 */ + asn_DEF_OK_Integer4_tags_1, + sizeof(asn_DEF_OK_Integer4_tags_1) + /sizeof(asn_DEF_OK_Integer4_tags_1[0]), /* 1 */ + asn_DEF_OK_Integer4_tags_1, /* Same as above */ + sizeof(asn_DEF_OK_Integer4_tags_1) + /sizeof(asn_DEF_OK_Integer4_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; @@ -578,6 +598,9 @@ NO_Integer5_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; + td->uper_decoder = asn_DEF_INTEGER.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; @@ -630,7 +653,7 @@ NO_Integer5_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-Integer5] >>> ***/ -static ber_tlv_tag_t asn_DEF_NO_Integer5_1_tags[] = { +static ber_tlv_tag_t asn_DEF_NO_Integer5_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NO_Integer5 = { @@ -643,13 +666,15 @@ asn_TYPE_descriptor_t asn_DEF_NO_Integer5 = { NO_Integer5_encode_der, NO_Integer5_decode_xer, NO_Integer5_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_NO_Integer5_1_tags, - sizeof(asn_DEF_NO_Integer5_1_tags) - /sizeof(asn_DEF_NO_Integer5_1_tags[0]), /* 1 */ - asn_DEF_NO_Integer5_1_tags, /* Same as above */ - sizeof(asn_DEF_NO_Integer5_1_tags) - /sizeof(asn_DEF_NO_Integer5_1_tags[0]), /* 1 */ + asn_DEF_NO_Integer5_tags_1, + sizeof(asn_DEF_NO_Integer5_tags_1) + /sizeof(asn_DEF_NO_Integer5_tags_1[0]), /* 1 */ + asn_DEF_NO_Integer5_tags_1, /* Same as above */ + sizeof(asn_DEF_NO_Integer5_tags_1) + /sizeof(asn_DEF_NO_Integer5_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; diff --git a/tests/92-circular-loops-OK.asn1.-P b/tests/92-circular-loops-OK.asn1.-P index a45b9bf13..5e161af1c 100644 --- a/tests/92-circular-loops-OK.asn1.-P +++ b/tests/92-circular-loops-OK.asn1.-P @@ -52,6 +52,8 @@ static asn_TYPE_member_t asn_MBR_Everything_1[] = { .tag_mode = +1, /* EXPLICIT tag at current level */ .type = &asn_DEF_Choice1, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "ch1" }, { ATF_POINTER, 0, offsetof(struct Everything, ch2), @@ -59,6 +61,8 @@ static asn_TYPE_member_t asn_MBR_Everything_1[] = { .tag_mode = +1, /* EXPLICIT tag at current level */ .type = &asn_DEF_Choice2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "ch2" }, { ATF_POINTER, 0, offsetof(struct Everything, ch3), @@ -66,6 +70,8 @@ static asn_TYPE_member_t asn_MBR_Everything_1[] = { .tag_mode = +1, /* EXPLICIT tag at current level */ .type = &asn_DEF_Choice3, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "ch3" }, { ATF_NOFLAGS, 0, offsetof(struct Everything, set), @@ -73,6 +79,8 @@ static asn_TYPE_member_t asn_MBR_Everything_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Set, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "set" }, { ATF_NOFLAGS, 0, offsetof(struct Everything, a), @@ -80,6 +88,8 @@ static asn_TYPE_member_t asn_MBR_Everything_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Alpha, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "a" }, { ATF_NOFLAGS, 0, offsetof(struct Everything, b), @@ -87,6 +97,8 @@ static asn_TYPE_member_t asn_MBR_Everything_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Beta, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "b" }, { ATF_NOFLAGS, 0, offsetof(struct Everything, g), @@ -94,6 +106,8 @@ static asn_TYPE_member_t asn_MBR_Everything_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Gamma, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "g" }, { ATF_NOFLAGS, 0, offsetof(struct Everything, ot), @@ -101,6 +115,8 @@ static asn_TYPE_member_t asn_MBR_Everything_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_OneTwo, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "ot" }, { ATF_NOFLAGS, 0, offsetof(struct Everything, tt), @@ -108,6 +124,8 @@ static asn_TYPE_member_t asn_MBR_Everything_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_TwoThree, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "tt" }, { ATF_NOFLAGS, 0, offsetof(struct Everything, to), @@ -115,13 +133,15 @@ static asn_TYPE_member_t asn_MBR_Everything_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_ThreeOne, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "to" }, }; -static ber_tlv_tag_t asn_DEF_Everything_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Everything_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Everything_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Everything_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ch1 at 15 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ch2 at 16 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ch3 at 17 */ @@ -133,11 +153,12 @@ static asn_TYPE_tag2member_t asn_MAP_Everything_1_tag2el[] = { { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 }, /* tt at 23 */ { (ASN_TAG_CLASS_CONTEXT | (9 << 2)), 9, 0, 0 } /* to at 25 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Everything_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Everything_specs_1 = { sizeof(struct Everything), offsetof(struct Everything, _asn_ctx), - asn_MAP_Everything_1_tag2el, + asn_MAP_Everything_tag2el_1, 10, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -151,16 +172,18 @@ asn_TYPE_descriptor_t asn_DEF_Everything = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Everything_1_tags, - sizeof(asn_DEF_Everything_1_tags) - /sizeof(asn_DEF_Everything_1_tags[0]), /* 1 */ - asn_DEF_Everything_1_tags, /* Same as above */ - sizeof(asn_DEF_Everything_1_tags) - /sizeof(asn_DEF_Everything_1_tags[0]), /* 1 */ + asn_DEF_Everything_tags_1, + sizeof(asn_DEF_Everything_tags_1) + /sizeof(asn_DEF_Everything_tags_1[0]), /* 1 */ + asn_DEF_Everything_tags_1, /* Same as above */ + sizeof(asn_DEF_Everything_tags_1) + /sizeof(asn_DEF_Everything_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Everything_1, 10, /* Elements count */ - &asn_SPC_Everything_1_specs /* Additional specs */ + &asn_SPC_Everything_specs_1 /* Additional specs */ }; @@ -214,6 +237,8 @@ static asn_TYPE_member_t asn_MBR_Choice1_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Everything, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "something" }, { ATF_POINTER, 0, offsetof(struct Choice1, choice.some2), @@ -221,21 +246,24 @@ static asn_TYPE_member_t asn_MBR_Choice1_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Everything, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "some2" }, }; -static asn_TYPE_tag2member_t asn_MAP_Choice1_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Choice1_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* something at 29 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* some2 at 32 */ }; -static asn_CHOICE_specifics_t asn_SPC_Choice1_1_specs = { +static asn_CHOICE_specifics_t asn_SPC_Choice1_specs_1 = { sizeof(struct Choice1), offsetof(struct Choice1, _asn_ctx), offsetof(struct Choice1, present), sizeof(((struct Choice1 *)0)->present), - asn_MAP_Choice1_1_tag2el, + asn_MAP_Choice1_tag2el_1, 2, /* Count of tags in the map */ - 1 /* Whether extensible */ + .canonical_order = 0, + .ext_start = 1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_Choice1 = { "Choice1", @@ -247,14 +275,16 @@ asn_TYPE_descriptor_t asn_DEF_Choice1 = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_Choice1_1, 2, /* Elements count */ - &asn_SPC_Choice1_1_specs /* Additional specs */ + &asn_SPC_Choice1_specs_1 /* Additional specs */ }; @@ -309,6 +339,8 @@ static asn_TYPE_member_t asn_MBR_Choice2_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_TypeRef, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "typeref" }, { ATF_POINTER, 0, offsetof(struct Choice2, choice.some3), @@ -316,21 +348,24 @@ static asn_TYPE_member_t asn_MBR_Choice2_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Everything, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "some3" }, }; -static asn_TYPE_tag2member_t asn_MAP_Choice2_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Choice2_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* typeref at 35 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* some3 at 38 */ }; -static asn_CHOICE_specifics_t asn_SPC_Choice2_1_specs = { +static asn_CHOICE_specifics_t asn_SPC_Choice2_specs_1 = { sizeof(struct Choice2), offsetof(struct Choice2, _asn_ctx), offsetof(struct Choice2, present), sizeof(((struct Choice2 *)0)->present), - asn_MAP_Choice2_1_tag2el, + asn_MAP_Choice2_tag2el_1, 2, /* Count of tags in the map */ - 1 /* Whether extensible */ + .canonical_order = 0, + .ext_start = 1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_Choice2 = { "Choice2", @@ -342,14 +377,16 @@ asn_TYPE_descriptor_t asn_DEF_Choice2 = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_Choice2_1, 2, /* Elements count */ - &asn_SPC_Choice2_1_specs /* Additional specs */ + &asn_SPC_Choice2_specs_1 /* Additional specs */ }; @@ -415,21 +452,24 @@ static asn_TYPE_member_t asn_MBR_a_2[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Everything, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "aa" }, }; -static ber_tlv_tag_t asn_DEF_a_2_tags[] = { +static ber_tlv_tag_t asn_DEF_a_tags_2[] = { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_a_2_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_a_tag2el_2[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* aa at 43 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_a_2_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_a_specs_2 = { sizeof(struct a), offsetof(struct a, _asn_ctx), - asn_MAP_a_2_tag2el, + asn_MAP_a_tag2el_2, 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -444,16 +484,18 @@ asn_TYPE_descriptor_t asn_DEF_a_2 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_a_2_tags, - sizeof(asn_DEF_a_2_tags) - /sizeof(asn_DEF_a_2_tags[0]) - 1, /* 1 */ - asn_DEF_a_2_tags, /* Same as above */ - sizeof(asn_DEF_a_2_tags) - /sizeof(asn_DEF_a_2_tags[0]), /* 2 */ + asn_DEF_a_tags_2, + sizeof(asn_DEF_a_tags_2) + /sizeof(asn_DEF_a_tags_2[0]) - 1, /* 1 */ + asn_DEF_a_tags_2, /* Same as above */ + sizeof(asn_DEF_a_tags_2) + /sizeof(asn_DEF_a_tags_2[0]), /* 2 */ + 0, /* No PER visible constraints */ asn_MBR_a_2, 1, /* Elements count */ - &asn_SPC_a_2_specs /* Additional specs */ + &asn_SPC_a_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_c_5[] = { @@ -462,14 +504,16 @@ static asn_TYPE_member_t asn_MBR_c_5[] = { .tag_mode = 0, .type = &asn_DEF_Choice3, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_c_5_tags[] = { +static ber_tlv_tag_t asn_DEF_c_tags_5[] = { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_c_5_specs = { +static asn_SET_OF_specifics_t asn_SPC_c_specs_5 = { sizeof(struct c), offsetof(struct c, _asn_ctx), 2, /* XER encoding is XMLValueList */ @@ -485,16 +529,18 @@ asn_TYPE_descriptor_t asn_DEF_c_5 = { SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_c_5_tags, - sizeof(asn_DEF_c_5_tags) - /sizeof(asn_DEF_c_5_tags[0]) - 1, /* 1 */ - asn_DEF_c_5_tags, /* Same as above */ - sizeof(asn_DEF_c_5_tags) - /sizeof(asn_DEF_c_5_tags[0]), /* 2 */ + asn_DEF_c_tags_5, + sizeof(asn_DEF_c_tags_5) + /sizeof(asn_DEF_c_tags_5[0]) - 1, /* 1 */ + asn_DEF_c_tags_5, /* Same as above */ + sizeof(asn_DEF_c_tags_5) + /sizeof(asn_DEF_c_tags_5[0]), /* 2 */ + 0, /* No PER visible constraints */ asn_MBR_c_5, 1, /* Single element */ - &asn_SPC_c_5_specs /* Additional specs */ + &asn_SPC_c_specs_5 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_Choice3_1[] = { @@ -503,6 +549,8 @@ static asn_TYPE_member_t asn_MBR_Choice3_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_a_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "a" }, { ATF_POINTER, 0, offsetof(struct Choice3, choice.b), @@ -510,6 +558,8 @@ static asn_TYPE_member_t asn_MBR_Choice3_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Everything, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "b" }, { ATF_NOFLAGS, 0, offsetof(struct Choice3, choice.c), @@ -517,22 +567,25 @@ static asn_TYPE_member_t asn_MBR_Choice3_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_c_5, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "c" }, }; -static asn_TYPE_tag2member_t asn_MAP_Choice3_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Choice3_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* a at 43 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* b at 44 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* c at 46 */ }; -static asn_CHOICE_specifics_t asn_SPC_Choice3_1_specs = { +static asn_CHOICE_specifics_t asn_SPC_Choice3_specs_1 = { sizeof(struct Choice3), offsetof(struct Choice3, _asn_ctx), offsetof(struct Choice3, present), sizeof(((struct Choice3 *)0)->present), - asn_MAP_Choice3_1_tag2el, + asn_MAP_Choice3_tag2el_1, 3, /* Count of tags in the map */ - 0 /* Whether extensible */ + .canonical_order = 0, + .ext_start = -1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_Choice3 = { "Choice3", @@ -544,14 +597,16 @@ asn_TYPE_descriptor_t asn_DEF_Choice3 = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_Choice3_1, 3, /* Elements count */ - &asn_SPC_Choice3_1_specs /* Additional specs */ + &asn_SPC_Choice3_specs_1 /* Additional specs */ }; @@ -606,6 +661,8 @@ static asn_TYPE_member_t asn_MBR_Member_2[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "int" }, { ATF_POINTER, 0, offsetof(struct Member, set), @@ -613,6 +670,8 @@ static asn_TYPE_member_t asn_MBR_Member_2[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Set, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "set" }, { ATF_POINTER, 0, offsetof(struct Member, seq), @@ -620,6 +679,8 @@ static asn_TYPE_member_t asn_MBR_Member_2[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Sequence, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "seq" }, { ATF_POINTER, 2, offsetof(struct Member, set2), @@ -627,6 +688,8 @@ static asn_TYPE_member_t asn_MBR_Member_2[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Set, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "set2" }, { ATF_POINTER, 1, offsetof(struct Member, set3), @@ -634,31 +697,34 @@ static asn_TYPE_member_t asn_MBR_Member_2[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Set, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "set3" }, }; -static ber_tlv_tag_t asn_DEF_Member_2_tags[] = { +static ber_tlv_tag_t asn_DEF_Member_tags_2[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Member_2_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* int at 49 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* set at 50 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* seq at 51 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* set2 at 52 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* set3 at 55 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Member_2_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = { sizeof(struct Member), offsetof(struct Member, _asn_ctx), - asn_MAP_Member_2_tag2el, + asn_MAP_Member_tag2el_2, 5, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ 3, /* Start extensions */ 6 /* Stop extensions */ }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_Member_2 = { - "", - "", + "SEQUENCE", + "SEQUENCE", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, @@ -666,16 +732,18 @@ asn_TYPE_descriptor_t asn_DEF_Member_2 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Member_2_tags, - sizeof(asn_DEF_Member_2_tags) - /sizeof(asn_DEF_Member_2_tags[0]), /* 1 */ - asn_DEF_Member_2_tags, /* Same as above */ - sizeof(asn_DEF_Member_2_tags) - /sizeof(asn_DEF_Member_2_tags[0]), /* 1 */ + asn_DEF_Member_tags_2, + sizeof(asn_DEF_Member_tags_2) + /sizeof(asn_DEF_Member_tags_2[0]), /* 1 */ + asn_DEF_Member_tags_2, /* Same as above */ + sizeof(asn_DEF_Member_tags_2) + /sizeof(asn_DEF_Member_tags_2[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Member_2, 5, /* Elements count */ - &asn_SPC_Member_2_specs /* Additional specs */ + &asn_SPC_Member_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_Set_1[] = { @@ -684,13 +752,15 @@ static asn_TYPE_member_t asn_MBR_Set_1[] = { .tag_mode = 0, .type = &asn_DEF_Member_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_Set_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Set_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_Set_1_specs = { +static asn_SET_OF_specifics_t asn_SPC_Set_specs_1 = { sizeof(struct Set), offsetof(struct Set, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ @@ -705,16 +775,18 @@ asn_TYPE_descriptor_t asn_DEF_Set = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Set_1_tags, - sizeof(asn_DEF_Set_1_tags) - /sizeof(asn_DEF_Set_1_tags[0]), /* 1 */ - asn_DEF_Set_1_tags, /* Same as above */ - sizeof(asn_DEF_Set_1_tags) - /sizeof(asn_DEF_Set_1_tags[0]), /* 1 */ + asn_DEF_Set_tags_1, + sizeof(asn_DEF_Set_tags_1) + /sizeof(asn_DEF_Set_tags_1[0]), /* 1 */ + asn_DEF_Set_tags_1, /* Same as above */ + sizeof(asn_DEF_Set_tags_1) + /sizeof(asn_DEF_Set_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Set_1, 1, /* Single element */ - &asn_SPC_Set_1_specs /* Additional specs */ + &asn_SPC_Set_specs_1 /* Additional specs */ }; @@ -761,6 +833,8 @@ static asn_TYPE_member_t asn_MBR_Sequence_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "a" }, { ATF_POINTER, 3, offsetof(struct Sequence, seq), @@ -768,6 +842,8 @@ static asn_TYPE_member_t asn_MBR_Sequence_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Sequence, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "seq" }, { ATF_POINTER, 2, offsetof(struct Sequence, b), @@ -775,6 +851,8 @@ static asn_TYPE_member_t asn_MBR_Sequence_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "b" }, { ATF_POINTER, 1, offsetof(struct Sequence, set), @@ -782,23 +860,26 @@ static asn_TYPE_member_t asn_MBR_Sequence_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Set, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "set" }, }; -static ber_tlv_tag_t asn_DEF_Sequence_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Sequence_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Sequence_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Sequence_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* a at 58 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* seq at 59 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* b at 61 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* set at 62 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Sequence_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Sequence_specs_1 = { sizeof(struct Sequence), offsetof(struct Sequence, _asn_ctx), - asn_MAP_Sequence_1_tag2el, + asn_MAP_Sequence_tag2el_1, 4, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ 1, /* Start extensions */ 5 /* Stop extensions */ }; @@ -812,16 +893,18 @@ asn_TYPE_descriptor_t asn_DEF_Sequence = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Sequence_1_tags, - sizeof(asn_DEF_Sequence_1_tags) - /sizeof(asn_DEF_Sequence_1_tags[0]), /* 1 */ - asn_DEF_Sequence_1_tags, /* Same as above */ - sizeof(asn_DEF_Sequence_1_tags) - /sizeof(asn_DEF_Sequence_1_tags[0]), /* 1 */ + asn_DEF_Sequence_tags_1, + sizeof(asn_DEF_Sequence_tags_1) + /sizeof(asn_DEF_Sequence_tags_1[0]), /* 1 */ + asn_DEF_Sequence_tags_1, /* Same as above */ + sizeof(asn_DEF_Sequence_tags_1) + /sizeof(asn_DEF_Sequence_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Sequence_1, 4, /* Elements count */ - &asn_SPC_Sequence_1_specs /* Additional specs */ + &asn_SPC_Sequence_specs_1 /* Additional specs */ }; @@ -866,6 +949,9 @@ TypeRef_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_Sequence.der_encoder; td->xer_decoder = asn_DEF_Sequence.xer_decoder; td->xer_encoder = asn_DEF_Sequence.xer_encoder; + td->uper_decoder = asn_DEF_Sequence.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Sequence.per_constraints; td->elements = asn_DEF_Sequence.elements; td->elements_count = asn_DEF_Sequence.elements_count; td->specifics = asn_DEF_Sequence.specifics; @@ -918,7 +1004,7 @@ TypeRef_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [TypeRef] >>> ***/ -static ber_tlv_tag_t asn_DEF_TypeRef_1_tags[] = { +static ber_tlv_tag_t asn_DEF_TypeRef_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; asn_TYPE_descriptor_t asn_DEF_TypeRef = { @@ -931,13 +1017,15 @@ asn_TYPE_descriptor_t asn_DEF_TypeRef = { TypeRef_encode_der, TypeRef_decode_xer, TypeRef_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_TypeRef_1_tags, - sizeof(asn_DEF_TypeRef_1_tags) - /sizeof(asn_DEF_TypeRef_1_tags[0]), /* 1 */ - asn_DEF_TypeRef_1_tags, /* Same as above */ - sizeof(asn_DEF_TypeRef_1_tags) - /sizeof(asn_DEF_TypeRef_1_tags[0]), /* 1 */ + asn_DEF_TypeRef_tags_1, + sizeof(asn_DEF_TypeRef_tags_1) + /sizeof(asn_DEF_TypeRef_tags_1[0]), /* 1 */ + asn_DEF_TypeRef_tags_1, /* Same as above */ + sizeof(asn_DEF_TypeRef_tags_1) + /sizeof(asn_DEF_TypeRef_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* Defined elsewhere */ 0 /* No specifics */ }; @@ -982,21 +1070,24 @@ static asn_TYPE_member_t asn_MBR_b_3[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Beta, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "b" }, }; -static ber_tlv_tag_t asn_DEF_b_3_tags[] = { +static ber_tlv_tag_t asn_DEF_b_tags_3[] = { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_b_3_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_b_tag2el_3[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* b at 70 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_b_3_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_b_specs_3 = { sizeof(struct b), offsetof(struct b, _asn_ctx), - asn_MAP_b_3_tag2el, + asn_MAP_b_tag2el_3, 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -1011,16 +1102,18 @@ asn_TYPE_descriptor_t asn_DEF_b_3 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_b_3_tags, - sizeof(asn_DEF_b_3_tags) - /sizeof(asn_DEF_b_3_tags[0]) - 1, /* 1 */ - asn_DEF_b_3_tags, /* Same as above */ - sizeof(asn_DEF_b_3_tags) - /sizeof(asn_DEF_b_3_tags[0]), /* 2 */ + asn_DEF_b_tags_3, + sizeof(asn_DEF_b_tags_3) + /sizeof(asn_DEF_b_tags_3[0]) - 1, /* 1 */ + asn_DEF_b_tags_3, /* Same as above */ + sizeof(asn_DEF_b_tags_3) + /sizeof(asn_DEF_b_tags_3[0]), /* 2 */ + 0, /* No PER visible constraints */ asn_MBR_b_3, 1, /* Elements count */ - &asn_SPC_b_3_specs /* Additional specs */ + &asn_SPC_b_specs_3 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_Alpha_1[] = { @@ -1029,6 +1122,8 @@ static asn_TYPE_member_t asn_MBR_Alpha_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Beta, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "a" }, { ATF_NOFLAGS, 0, offsetof(struct Alpha, b), @@ -1036,21 +1131,24 @@ static asn_TYPE_member_t asn_MBR_Alpha_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_b_3, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "b" }, }; -static ber_tlv_tag_t asn_DEF_Alpha_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Alpha_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Alpha_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Alpha_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* a at 68 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* b at 70 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Alpha_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Alpha_specs_1 = { sizeof(struct Alpha), offsetof(struct Alpha, _asn_ctx), - asn_MAP_Alpha_1_tag2el, + asn_MAP_Alpha_tag2el_1, 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -1064,16 +1162,18 @@ asn_TYPE_descriptor_t asn_DEF_Alpha = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Alpha_1_tags, - sizeof(asn_DEF_Alpha_1_tags) - /sizeof(asn_DEF_Alpha_1_tags[0]), /* 1 */ - asn_DEF_Alpha_1_tags, /* Same as above */ - sizeof(asn_DEF_Alpha_1_tags) - /sizeof(asn_DEF_Alpha_1_tags[0]), /* 1 */ + asn_DEF_Alpha_tags_1, + sizeof(asn_DEF_Alpha_tags_1) + /sizeof(asn_DEF_Alpha_tags_1[0]), /* 1 */ + asn_DEF_Alpha_tags_1, /* Same as above */ + sizeof(asn_DEF_Alpha_tags_1) + /sizeof(asn_DEF_Alpha_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Alpha_1, 2, /* Elements count */ - &asn_SPC_Alpha_1_specs /* Additional specs */ + &asn_SPC_Alpha_specs_1 /* Additional specs */ }; @@ -1113,6 +1213,8 @@ static asn_TYPE_member_t asn_MBR_Beta_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Alpha, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "b" }, { ATF_POINTER, 1, offsetof(struct Beta, g), @@ -1120,21 +1222,24 @@ static asn_TYPE_member_t asn_MBR_Beta_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Gamma, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "g" }, }; -static ber_tlv_tag_t asn_DEF_Beta_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Beta_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Beta_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Beta_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* b at 75 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* g at 76 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Beta_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Beta_specs_1 = { sizeof(struct Beta), offsetof(struct Beta, _asn_ctx), - asn_MAP_Beta_1_tag2el, + asn_MAP_Beta_tag2el_1, 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -1148,16 +1253,18 @@ asn_TYPE_descriptor_t asn_DEF_Beta = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Beta_1_tags, - sizeof(asn_DEF_Beta_1_tags) - /sizeof(asn_DEF_Beta_1_tags[0]), /* 1 */ - asn_DEF_Beta_1_tags, /* Same as above */ - sizeof(asn_DEF_Beta_1_tags) - /sizeof(asn_DEF_Beta_1_tags[0]), /* 1 */ + asn_DEF_Beta_tags_1, + sizeof(asn_DEF_Beta_tags_1) + /sizeof(asn_DEF_Beta_tags_1[0]), /* 1 */ + asn_DEF_Beta_tags_1, /* Same as above */ + sizeof(asn_DEF_Beta_tags_1) + /sizeof(asn_DEF_Beta_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Beta_1, 2, /* Elements count */ - &asn_SPC_Beta_1_specs /* Additional specs */ + &asn_SPC_Beta_specs_1 /* Additional specs */ }; @@ -1200,6 +1307,8 @@ static asn_TYPE_member_t asn_MBR_Gamma_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_TwoThree, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "o" }, { ATF_POINTER, 0, offsetof(struct Gamma, a), @@ -1207,6 +1316,8 @@ static asn_TYPE_member_t asn_MBR_Gamma_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Alpha, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "a" }, { ATF_POINTER, 0, offsetof(struct Gamma, b), @@ -1214,22 +1325,25 @@ static asn_TYPE_member_t asn_MBR_Gamma_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Beta, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "b" }, }; -static ber_tlv_tag_t asn_DEF_Gamma_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Gamma_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Gamma_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Gamma_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* o at 80 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* a at 81 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* b at 83 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Gamma_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Gamma_specs_1 = { sizeof(struct Gamma), offsetof(struct Gamma, _asn_ctx), - asn_MAP_Gamma_1_tag2el, + asn_MAP_Gamma_tag2el_1, 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -1243,16 +1357,18 @@ asn_TYPE_descriptor_t asn_DEF_Gamma = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Gamma_1_tags, - sizeof(asn_DEF_Gamma_1_tags) - /sizeof(asn_DEF_Gamma_1_tags[0]), /* 1 */ - asn_DEF_Gamma_1_tags, /* Same as above */ - sizeof(asn_DEF_Gamma_1_tags) - /sizeof(asn_DEF_Gamma_1_tags[0]), /* 1 */ + asn_DEF_Gamma_tags_1, + sizeof(asn_DEF_Gamma_tags_1) + /sizeof(asn_DEF_Gamma_tags_1[0]), /* 1 */ + asn_DEF_Gamma_tags_1, /* Same as above */ + sizeof(asn_DEF_Gamma_tags_1) + /sizeof(asn_DEF_Gamma_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Gamma_1, 3, /* Elements count */ - &asn_SPC_Gamma_1_specs /* Additional specs */ + &asn_SPC_Gamma_specs_1 /* Additional specs */ }; @@ -1303,28 +1419,30 @@ static asn_TYPE_member_t asn_MBR_OneTwo_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_TwoThree, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m12" }, }; -static ber_tlv_tag_t asn_DEF_OneTwo_1_tags[] = { +static ber_tlv_tag_t asn_DEF_OneTwo_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_OneTwo_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_OneTwo_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* m12 at 86 */ }; -static uint8_t asn_MAP_OneTwo_1_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { +static uint8_t asn_MAP_OneTwo_mmap_1[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { (1 << 7) }; -static asn_SET_specifics_t asn_SPC_OneTwo_1_specs = { +static asn_SET_specifics_t asn_SPC_OneTwo_specs_1 = { sizeof(struct OneTwo), offsetof(struct OneTwo, _asn_ctx), offsetof(struct OneTwo, _presence_map), - asn_MAP_OneTwo_1_tag2el, + asn_MAP_OneTwo_tag2el_1, 1, /* Count of tags in the map */ - asn_MAP_OneTwo_1_tag2el, /* Same as above */ + asn_MAP_OneTwo_tag2el_1, /* Same as above */ 1, /* Count of tags in the CXER map */ 0, /* Whether extensible */ - (unsigned int *)asn_MAP_OneTwo_1_mmap /* Mandatory elements map */ + (unsigned int *)asn_MAP_OneTwo_mmap_1 /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_OneTwo = { "OneTwo", @@ -1336,16 +1454,18 @@ asn_TYPE_descriptor_t asn_DEF_OneTwo = { SET_encode_der, SET_decode_xer, SET_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_OneTwo_1_tags, - sizeof(asn_DEF_OneTwo_1_tags) - /sizeof(asn_DEF_OneTwo_1_tags[0]), /* 1 */ - asn_DEF_OneTwo_1_tags, /* Same as above */ - sizeof(asn_DEF_OneTwo_1_tags) - /sizeof(asn_DEF_OneTwo_1_tags[0]), /* 1 */ + asn_DEF_OneTwo_tags_1, + sizeof(asn_DEF_OneTwo_tags_1) + /sizeof(asn_DEF_OneTwo_tags_1[0]), /* 1 */ + asn_DEF_OneTwo_tags_1, /* Same as above */ + sizeof(asn_DEF_OneTwo_tags_1) + /sizeof(asn_DEF_OneTwo_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_OneTwo_1, 1, /* Elements count */ - &asn_SPC_OneTwo_1_specs /* Additional specs */ + &asn_SPC_OneTwo_specs_1 /* Additional specs */ }; @@ -1396,28 +1516,30 @@ static asn_TYPE_member_t asn_MBR_TwoThree_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_ThreeOne, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m23" }, }; -static ber_tlv_tag_t asn_DEF_TwoThree_1_tags[] = { +static ber_tlv_tag_t asn_DEF_TwoThree_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_TwoThree_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_TwoThree_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* m23 at 87 */ }; -static uint8_t asn_MAP_TwoThree_1_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { +static uint8_t asn_MAP_TwoThree_mmap_1[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { (1 << 7) }; -static asn_SET_specifics_t asn_SPC_TwoThree_1_specs = { +static asn_SET_specifics_t asn_SPC_TwoThree_specs_1 = { sizeof(struct TwoThree), offsetof(struct TwoThree, _asn_ctx), offsetof(struct TwoThree, _presence_map), - asn_MAP_TwoThree_1_tag2el, + asn_MAP_TwoThree_tag2el_1, 1, /* Count of tags in the map */ - asn_MAP_TwoThree_1_tag2el, /* Same as above */ + asn_MAP_TwoThree_tag2el_1, /* Same as above */ 1, /* Count of tags in the CXER map */ 0, /* Whether extensible */ - (unsigned int *)asn_MAP_TwoThree_1_mmap /* Mandatory elements map */ + (unsigned int *)asn_MAP_TwoThree_mmap_1 /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_TwoThree = { "TwoThree", @@ -1429,16 +1551,18 @@ asn_TYPE_descriptor_t asn_DEF_TwoThree = { SET_encode_der, SET_decode_xer, SET_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_TwoThree_1_tags, - sizeof(asn_DEF_TwoThree_1_tags) - /sizeof(asn_DEF_TwoThree_1_tags[0]), /* 1 */ - asn_DEF_TwoThree_1_tags, /* Same as above */ - sizeof(asn_DEF_TwoThree_1_tags) - /sizeof(asn_DEF_TwoThree_1_tags[0]), /* 1 */ + asn_DEF_TwoThree_tags_1, + sizeof(asn_DEF_TwoThree_tags_1) + /sizeof(asn_DEF_TwoThree_tags_1[0]), /* 1 */ + asn_DEF_TwoThree_tags_1, /* Same as above */ + sizeof(asn_DEF_TwoThree_tags_1) + /sizeof(asn_DEF_TwoThree_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_TwoThree_1, 1, /* Elements count */ - &asn_SPC_TwoThree_1_specs /* Additional specs */ + &asn_SPC_TwoThree_specs_1 /* Additional specs */ }; @@ -1493,6 +1617,8 @@ static asn_TYPE_member_t asn_MBR_ThreeOne_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_OneTwo, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m31" }, { ATF_POINTER, 0, offsetof(struct ThreeOne, g), @@ -1500,29 +1626,31 @@ static asn_TYPE_member_t asn_MBR_ThreeOne_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Gamma, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "g" }, }; -static ber_tlv_tag_t asn_DEF_ThreeOne_1_tags[] = { +static ber_tlv_tag_t asn_DEF_ThreeOne_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_ThreeOne_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_ThreeOne_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* m31 at 88 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* g at 88 */ }; -static uint8_t asn_MAP_ThreeOne_1_mmap[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = { +static uint8_t asn_MAP_ThreeOne_mmap_1[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = { (1 << 7) | (1 << 6) }; -static asn_SET_specifics_t asn_SPC_ThreeOne_1_specs = { +static asn_SET_specifics_t asn_SPC_ThreeOne_specs_1 = { sizeof(struct ThreeOne), offsetof(struct ThreeOne, _asn_ctx), offsetof(struct ThreeOne, _presence_map), - asn_MAP_ThreeOne_1_tag2el, + asn_MAP_ThreeOne_tag2el_1, 2, /* Count of tags in the map */ - asn_MAP_ThreeOne_1_tag2el, /* Same as above */ + asn_MAP_ThreeOne_tag2el_1, /* Same as above */ 2, /* Count of tags in the CXER map */ 0, /* Whether extensible */ - (unsigned int *)asn_MAP_ThreeOne_1_mmap /* Mandatory elements map */ + (unsigned int *)asn_MAP_ThreeOne_mmap_1 /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_ThreeOne = { "ThreeOne", @@ -1534,15 +1662,17 @@ asn_TYPE_descriptor_t asn_DEF_ThreeOne = { SET_encode_der, SET_decode_xer, SET_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_ThreeOne_1_tags, - sizeof(asn_DEF_ThreeOne_1_tags) - /sizeof(asn_DEF_ThreeOne_1_tags[0]), /* 1 */ - asn_DEF_ThreeOne_1_tags, /* Same as above */ - sizeof(asn_DEF_ThreeOne_1_tags) - /sizeof(asn_DEF_ThreeOne_1_tags[0]), /* 1 */ + asn_DEF_ThreeOne_tags_1, + sizeof(asn_DEF_ThreeOne_tags_1) + /sizeof(asn_DEF_ThreeOne_tags_1[0]), /* 1 */ + asn_DEF_ThreeOne_tags_1, /* Same as above */ + sizeof(asn_DEF_ThreeOne_tags_1) + /sizeof(asn_DEF_ThreeOne_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_ThreeOne_1, 2, /* Elements count */ - &asn_SPC_ThreeOne_1_specs /* Additional specs */ + &asn_SPC_ThreeOne_specs_1 /* Additional specs */ }; diff --git a/tests/92-circular-loops-OK.asn1.-Pfindirect-choice b/tests/92-circular-loops-OK.asn1.-Pfindirect-choice index 391ca9113..7f0c38597 100644 --- a/tests/92-circular-loops-OK.asn1.-Pfindirect-choice +++ b/tests/92-circular-loops-OK.asn1.-Pfindirect-choice @@ -52,6 +52,8 @@ static asn_TYPE_member_t asn_MBR_Everything_1[] = { .tag_mode = +1, /* EXPLICIT tag at current level */ .type = &asn_DEF_Choice1, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "ch1" }, { ATF_POINTER, 0, offsetof(struct Everything, ch2), @@ -59,6 +61,8 @@ static asn_TYPE_member_t asn_MBR_Everything_1[] = { .tag_mode = +1, /* EXPLICIT tag at current level */ .type = &asn_DEF_Choice2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "ch2" }, { ATF_POINTER, 0, offsetof(struct Everything, ch3), @@ -66,6 +70,8 @@ static asn_TYPE_member_t asn_MBR_Everything_1[] = { .tag_mode = +1, /* EXPLICIT tag at current level */ .type = &asn_DEF_Choice3, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "ch3" }, { ATF_NOFLAGS, 0, offsetof(struct Everything, set), @@ -73,6 +79,8 @@ static asn_TYPE_member_t asn_MBR_Everything_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Set, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "set" }, { ATF_NOFLAGS, 0, offsetof(struct Everything, a), @@ -80,6 +88,8 @@ static asn_TYPE_member_t asn_MBR_Everything_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Alpha, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "a" }, { ATF_NOFLAGS, 0, offsetof(struct Everything, b), @@ -87,6 +97,8 @@ static asn_TYPE_member_t asn_MBR_Everything_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Beta, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "b" }, { ATF_NOFLAGS, 0, offsetof(struct Everything, g), @@ -94,6 +106,8 @@ static asn_TYPE_member_t asn_MBR_Everything_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Gamma, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "g" }, { ATF_NOFLAGS, 0, offsetof(struct Everything, ot), @@ -101,6 +115,8 @@ static asn_TYPE_member_t asn_MBR_Everything_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_OneTwo, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "ot" }, { ATF_NOFLAGS, 0, offsetof(struct Everything, tt), @@ -108,6 +124,8 @@ static asn_TYPE_member_t asn_MBR_Everything_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_TwoThree, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "tt" }, { ATF_NOFLAGS, 0, offsetof(struct Everything, to), @@ -115,13 +133,15 @@ static asn_TYPE_member_t asn_MBR_Everything_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_ThreeOne, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "to" }, }; -static ber_tlv_tag_t asn_DEF_Everything_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Everything_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Everything_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Everything_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ch1 at 15 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ch2 at 16 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ch3 at 17 */ @@ -133,11 +153,12 @@ static asn_TYPE_tag2member_t asn_MAP_Everything_1_tag2el[] = { { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 }, /* tt at 23 */ { (ASN_TAG_CLASS_CONTEXT | (9 << 2)), 9, 0, 0 } /* to at 25 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Everything_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Everything_specs_1 = { sizeof(struct Everything), offsetof(struct Everything, _asn_ctx), - asn_MAP_Everything_1_tag2el, + asn_MAP_Everything_tag2el_1, 10, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -151,16 +172,18 @@ asn_TYPE_descriptor_t asn_DEF_Everything = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Everything_1_tags, - sizeof(asn_DEF_Everything_1_tags) - /sizeof(asn_DEF_Everything_1_tags[0]), /* 1 */ - asn_DEF_Everything_1_tags, /* Same as above */ - sizeof(asn_DEF_Everything_1_tags) - /sizeof(asn_DEF_Everything_1_tags[0]), /* 1 */ + asn_DEF_Everything_tags_1, + sizeof(asn_DEF_Everything_tags_1) + /sizeof(asn_DEF_Everything_tags_1[0]), /* 1 */ + asn_DEF_Everything_tags_1, /* Same as above */ + sizeof(asn_DEF_Everything_tags_1) + /sizeof(asn_DEF_Everything_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Everything_1, 10, /* Elements count */ - &asn_SPC_Everything_1_specs /* Additional specs */ + &asn_SPC_Everything_specs_1 /* Additional specs */ }; @@ -214,6 +237,8 @@ static asn_TYPE_member_t asn_MBR_Choice1_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Everything, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "something" }, { ATF_POINTER, 0, offsetof(struct Choice1, choice.some2), @@ -221,21 +246,24 @@ static asn_TYPE_member_t asn_MBR_Choice1_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Everything, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "some2" }, }; -static asn_TYPE_tag2member_t asn_MAP_Choice1_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Choice1_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* something at 29 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* some2 at 32 */ }; -static asn_CHOICE_specifics_t asn_SPC_Choice1_1_specs = { +static asn_CHOICE_specifics_t asn_SPC_Choice1_specs_1 = { sizeof(struct Choice1), offsetof(struct Choice1, _asn_ctx), offsetof(struct Choice1, present), sizeof(((struct Choice1 *)0)->present), - asn_MAP_Choice1_1_tag2el, + asn_MAP_Choice1_tag2el_1, 2, /* Count of tags in the map */ - 1 /* Whether extensible */ + .canonical_order = 0, + .ext_start = 1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_Choice1 = { "Choice1", @@ -247,14 +275,16 @@ asn_TYPE_descriptor_t asn_DEF_Choice1 = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_Choice1_1, 2, /* Elements count */ - &asn_SPC_Choice1_1_specs /* Additional specs */ + &asn_SPC_Choice1_specs_1 /* Additional specs */ }; @@ -310,6 +340,8 @@ static asn_TYPE_member_t asn_MBR_Choice2_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_TypeRef, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "typeref" }, { ATF_POINTER, 0, offsetof(struct Choice2, choice.some3), @@ -317,21 +349,24 @@ static asn_TYPE_member_t asn_MBR_Choice2_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Everything, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "some3" }, }; -static asn_TYPE_tag2member_t asn_MAP_Choice2_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Choice2_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* typeref at 35 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* some3 at 38 */ }; -static asn_CHOICE_specifics_t asn_SPC_Choice2_1_specs = { +static asn_CHOICE_specifics_t asn_SPC_Choice2_specs_1 = { sizeof(struct Choice2), offsetof(struct Choice2, _asn_ctx), offsetof(struct Choice2, present), sizeof(((struct Choice2 *)0)->present), - asn_MAP_Choice2_1_tag2el, + asn_MAP_Choice2_tag2el_1, 2, /* Count of tags in the map */ - 1 /* Whether extensible */ + .canonical_order = 0, + .ext_start = 1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_Choice2 = { "Choice2", @@ -343,14 +378,16 @@ asn_TYPE_descriptor_t asn_DEF_Choice2 = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_Choice2_1, 2, /* Elements count */ - &asn_SPC_Choice2_1_specs /* Additional specs */ + &asn_SPC_Choice2_specs_1 /* Additional specs */ }; @@ -416,21 +453,24 @@ static asn_TYPE_member_t asn_MBR_a_2[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Everything, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "aa" }, }; -static ber_tlv_tag_t asn_DEF_a_2_tags[] = { +static ber_tlv_tag_t asn_DEF_a_tags_2[] = { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_a_2_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_a_tag2el_2[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* aa at 43 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_a_2_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_a_specs_2 = { sizeof(struct a), offsetof(struct a, _asn_ctx), - asn_MAP_a_2_tag2el, + asn_MAP_a_tag2el_2, 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -445,16 +485,18 @@ asn_TYPE_descriptor_t asn_DEF_a_2 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_a_2_tags, - sizeof(asn_DEF_a_2_tags) - /sizeof(asn_DEF_a_2_tags[0]) - 1, /* 1 */ - asn_DEF_a_2_tags, /* Same as above */ - sizeof(asn_DEF_a_2_tags) - /sizeof(asn_DEF_a_2_tags[0]), /* 2 */ + asn_DEF_a_tags_2, + sizeof(asn_DEF_a_tags_2) + /sizeof(asn_DEF_a_tags_2[0]) - 1, /* 1 */ + asn_DEF_a_tags_2, /* Same as above */ + sizeof(asn_DEF_a_tags_2) + /sizeof(asn_DEF_a_tags_2[0]), /* 2 */ + 0, /* No PER visible constraints */ asn_MBR_a_2, 1, /* Elements count */ - &asn_SPC_a_2_specs /* Additional specs */ + &asn_SPC_a_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_c_5[] = { @@ -463,14 +505,16 @@ static asn_TYPE_member_t asn_MBR_c_5[] = { .tag_mode = 0, .type = &asn_DEF_Choice3, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_c_5_tags[] = { +static ber_tlv_tag_t asn_DEF_c_tags_5[] = { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_c_5_specs = { +static asn_SET_OF_specifics_t asn_SPC_c_specs_5 = { sizeof(struct c), offsetof(struct c, _asn_ctx), 2, /* XER encoding is XMLValueList */ @@ -486,16 +530,18 @@ asn_TYPE_descriptor_t asn_DEF_c_5 = { SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_c_5_tags, - sizeof(asn_DEF_c_5_tags) - /sizeof(asn_DEF_c_5_tags[0]) - 1, /* 1 */ - asn_DEF_c_5_tags, /* Same as above */ - sizeof(asn_DEF_c_5_tags) - /sizeof(asn_DEF_c_5_tags[0]), /* 2 */ + asn_DEF_c_tags_5, + sizeof(asn_DEF_c_tags_5) + /sizeof(asn_DEF_c_tags_5[0]) - 1, /* 1 */ + asn_DEF_c_tags_5, /* Same as above */ + sizeof(asn_DEF_c_tags_5) + /sizeof(asn_DEF_c_tags_5[0]), /* 2 */ + 0, /* No PER visible constraints */ asn_MBR_c_5, 1, /* Single element */ - &asn_SPC_c_5_specs /* Additional specs */ + &asn_SPC_c_specs_5 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_Choice3_1[] = { @@ -504,6 +550,8 @@ static asn_TYPE_member_t asn_MBR_Choice3_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_a_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "a" }, { ATF_POINTER, 0, offsetof(struct Choice3, choice.b), @@ -511,6 +559,8 @@ static asn_TYPE_member_t asn_MBR_Choice3_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Everything, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "b" }, { ATF_POINTER, 0, offsetof(struct Choice3, choice.c), @@ -518,22 +568,25 @@ static asn_TYPE_member_t asn_MBR_Choice3_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_c_5, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "c" }, }; -static asn_TYPE_tag2member_t asn_MAP_Choice3_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Choice3_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* a at 43 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* b at 44 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* c at 46 */ }; -static asn_CHOICE_specifics_t asn_SPC_Choice3_1_specs = { +static asn_CHOICE_specifics_t asn_SPC_Choice3_specs_1 = { sizeof(struct Choice3), offsetof(struct Choice3, _asn_ctx), offsetof(struct Choice3, present), sizeof(((struct Choice3 *)0)->present), - asn_MAP_Choice3_1_tag2el, + asn_MAP_Choice3_tag2el_1, 3, /* Count of tags in the map */ - 0 /* Whether extensible */ + .canonical_order = 0, + .ext_start = -1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_Choice3 = { "Choice3", @@ -545,14 +598,16 @@ asn_TYPE_descriptor_t asn_DEF_Choice3 = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_Choice3_1, 3, /* Elements count */ - &asn_SPC_Choice3_1_specs /* Additional specs */ + &asn_SPC_Choice3_specs_1 /* Additional specs */ }; @@ -607,6 +662,8 @@ static asn_TYPE_member_t asn_MBR_Member_2[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "int" }, { ATF_POINTER, 0, offsetof(struct Member, set), @@ -614,6 +671,8 @@ static asn_TYPE_member_t asn_MBR_Member_2[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Set, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "set" }, { ATF_POINTER, 0, offsetof(struct Member, seq), @@ -621,6 +680,8 @@ static asn_TYPE_member_t asn_MBR_Member_2[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Sequence, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "seq" }, { ATF_POINTER, 2, offsetof(struct Member, set2), @@ -628,6 +689,8 @@ static asn_TYPE_member_t asn_MBR_Member_2[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Set, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "set2" }, { ATF_POINTER, 1, offsetof(struct Member, set3), @@ -635,31 +698,34 @@ static asn_TYPE_member_t asn_MBR_Member_2[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Set, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "set3" }, }; -static ber_tlv_tag_t asn_DEF_Member_2_tags[] = { +static ber_tlv_tag_t asn_DEF_Member_tags_2[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Member_2_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* int at 49 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* set at 50 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* seq at 51 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* set2 at 52 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* set3 at 55 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Member_2_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = { sizeof(struct Member), offsetof(struct Member, _asn_ctx), - asn_MAP_Member_2_tag2el, + asn_MAP_Member_tag2el_2, 5, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ 3, /* Start extensions */ 6 /* Stop extensions */ }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_Member_2 = { - "", - "", + "SEQUENCE", + "SEQUENCE", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, @@ -667,16 +733,18 @@ asn_TYPE_descriptor_t asn_DEF_Member_2 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Member_2_tags, - sizeof(asn_DEF_Member_2_tags) - /sizeof(asn_DEF_Member_2_tags[0]), /* 1 */ - asn_DEF_Member_2_tags, /* Same as above */ - sizeof(asn_DEF_Member_2_tags) - /sizeof(asn_DEF_Member_2_tags[0]), /* 1 */ + asn_DEF_Member_tags_2, + sizeof(asn_DEF_Member_tags_2) + /sizeof(asn_DEF_Member_tags_2[0]), /* 1 */ + asn_DEF_Member_tags_2, /* Same as above */ + sizeof(asn_DEF_Member_tags_2) + /sizeof(asn_DEF_Member_tags_2[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Member_2, 5, /* Elements count */ - &asn_SPC_Member_2_specs /* Additional specs */ + &asn_SPC_Member_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_Set_1[] = { @@ -685,13 +753,15 @@ static asn_TYPE_member_t asn_MBR_Set_1[] = { .tag_mode = 0, .type = &asn_DEF_Member_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_Set_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Set_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_Set_1_specs = { +static asn_SET_OF_specifics_t asn_SPC_Set_specs_1 = { sizeof(struct Set), offsetof(struct Set, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ @@ -706,16 +776,18 @@ asn_TYPE_descriptor_t asn_DEF_Set = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Set_1_tags, - sizeof(asn_DEF_Set_1_tags) - /sizeof(asn_DEF_Set_1_tags[0]), /* 1 */ - asn_DEF_Set_1_tags, /* Same as above */ - sizeof(asn_DEF_Set_1_tags) - /sizeof(asn_DEF_Set_1_tags[0]), /* 1 */ + asn_DEF_Set_tags_1, + sizeof(asn_DEF_Set_tags_1) + /sizeof(asn_DEF_Set_tags_1[0]), /* 1 */ + asn_DEF_Set_tags_1, /* Same as above */ + sizeof(asn_DEF_Set_tags_1) + /sizeof(asn_DEF_Set_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Set_1, 1, /* Single element */ - &asn_SPC_Set_1_specs /* Additional specs */ + &asn_SPC_Set_specs_1 /* Additional specs */ }; @@ -762,6 +834,8 @@ static asn_TYPE_member_t asn_MBR_Sequence_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "a" }, { ATF_POINTER, 3, offsetof(struct Sequence, seq), @@ -769,6 +843,8 @@ static asn_TYPE_member_t asn_MBR_Sequence_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Sequence, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "seq" }, { ATF_POINTER, 2, offsetof(struct Sequence, b), @@ -776,6 +852,8 @@ static asn_TYPE_member_t asn_MBR_Sequence_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "b" }, { ATF_POINTER, 1, offsetof(struct Sequence, set), @@ -783,23 +861,26 @@ static asn_TYPE_member_t asn_MBR_Sequence_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Set, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "set" }, }; -static ber_tlv_tag_t asn_DEF_Sequence_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Sequence_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Sequence_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Sequence_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* a at 58 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* seq at 59 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* b at 61 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* set at 62 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Sequence_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Sequence_specs_1 = { sizeof(struct Sequence), offsetof(struct Sequence, _asn_ctx), - asn_MAP_Sequence_1_tag2el, + asn_MAP_Sequence_tag2el_1, 4, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ 1, /* Start extensions */ 5 /* Stop extensions */ }; @@ -813,16 +894,18 @@ asn_TYPE_descriptor_t asn_DEF_Sequence = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Sequence_1_tags, - sizeof(asn_DEF_Sequence_1_tags) - /sizeof(asn_DEF_Sequence_1_tags[0]), /* 1 */ - asn_DEF_Sequence_1_tags, /* Same as above */ - sizeof(asn_DEF_Sequence_1_tags) - /sizeof(asn_DEF_Sequence_1_tags[0]), /* 1 */ + asn_DEF_Sequence_tags_1, + sizeof(asn_DEF_Sequence_tags_1) + /sizeof(asn_DEF_Sequence_tags_1[0]), /* 1 */ + asn_DEF_Sequence_tags_1, /* Same as above */ + sizeof(asn_DEF_Sequence_tags_1) + /sizeof(asn_DEF_Sequence_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Sequence_1, 4, /* Elements count */ - &asn_SPC_Sequence_1_specs /* Additional specs */ + &asn_SPC_Sequence_specs_1 /* Additional specs */ }; @@ -867,6 +950,9 @@ TypeRef_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->der_encoder = asn_DEF_Sequence.der_encoder; td->xer_decoder = asn_DEF_Sequence.xer_decoder; td->xer_encoder = asn_DEF_Sequence.xer_encoder; + td->uper_decoder = asn_DEF_Sequence.uper_decoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Sequence.per_constraints; td->elements = asn_DEF_Sequence.elements; td->elements_count = asn_DEF_Sequence.elements_count; td->specifics = asn_DEF_Sequence.specifics; @@ -919,7 +1005,7 @@ TypeRef_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [TypeRef] >>> ***/ -static ber_tlv_tag_t asn_DEF_TypeRef_1_tags[] = { +static ber_tlv_tag_t asn_DEF_TypeRef_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; asn_TYPE_descriptor_t asn_DEF_TypeRef = { @@ -932,13 +1018,15 @@ asn_TYPE_descriptor_t asn_DEF_TypeRef = { TypeRef_encode_der, TypeRef_decode_xer, TypeRef_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_TypeRef_1_tags, - sizeof(asn_DEF_TypeRef_1_tags) - /sizeof(asn_DEF_TypeRef_1_tags[0]), /* 1 */ - asn_DEF_TypeRef_1_tags, /* Same as above */ - sizeof(asn_DEF_TypeRef_1_tags) - /sizeof(asn_DEF_TypeRef_1_tags[0]), /* 1 */ + asn_DEF_TypeRef_tags_1, + sizeof(asn_DEF_TypeRef_tags_1) + /sizeof(asn_DEF_TypeRef_tags_1[0]), /* 1 */ + asn_DEF_TypeRef_tags_1, /* Same as above */ + sizeof(asn_DEF_TypeRef_tags_1) + /sizeof(asn_DEF_TypeRef_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ 0, 0, /* Defined elsewhere */ 0 /* No specifics */ }; @@ -983,21 +1071,24 @@ static asn_TYPE_member_t asn_MBR_b_3[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Beta, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "b" }, }; -static ber_tlv_tag_t asn_DEF_b_3_tags[] = { +static ber_tlv_tag_t asn_DEF_b_tags_3[] = { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_b_3_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_b_tag2el_3[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* b at 70 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_b_3_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_b_specs_3 = { sizeof(struct b), offsetof(struct b, _asn_ctx), - asn_MAP_b_3_tag2el, + asn_MAP_b_tag2el_3, 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -1012,16 +1103,18 @@ asn_TYPE_descriptor_t asn_DEF_b_3 = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_b_3_tags, - sizeof(asn_DEF_b_3_tags) - /sizeof(asn_DEF_b_3_tags[0]) - 1, /* 1 */ - asn_DEF_b_3_tags, /* Same as above */ - sizeof(asn_DEF_b_3_tags) - /sizeof(asn_DEF_b_3_tags[0]), /* 2 */ + asn_DEF_b_tags_3, + sizeof(asn_DEF_b_tags_3) + /sizeof(asn_DEF_b_tags_3[0]) - 1, /* 1 */ + asn_DEF_b_tags_3, /* Same as above */ + sizeof(asn_DEF_b_tags_3) + /sizeof(asn_DEF_b_tags_3[0]), /* 2 */ + 0, /* No PER visible constraints */ asn_MBR_b_3, 1, /* Elements count */ - &asn_SPC_b_3_specs /* Additional specs */ + &asn_SPC_b_specs_3 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_Alpha_1[] = { @@ -1030,6 +1123,8 @@ static asn_TYPE_member_t asn_MBR_Alpha_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Beta, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "a" }, { ATF_NOFLAGS, 0, offsetof(struct Alpha, b), @@ -1037,21 +1132,24 @@ static asn_TYPE_member_t asn_MBR_Alpha_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_b_3, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "b" }, }; -static ber_tlv_tag_t asn_DEF_Alpha_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Alpha_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Alpha_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Alpha_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* a at 68 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* b at 70 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Alpha_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Alpha_specs_1 = { sizeof(struct Alpha), offsetof(struct Alpha, _asn_ctx), - asn_MAP_Alpha_1_tag2el, + asn_MAP_Alpha_tag2el_1, 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -1065,16 +1163,18 @@ asn_TYPE_descriptor_t asn_DEF_Alpha = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Alpha_1_tags, - sizeof(asn_DEF_Alpha_1_tags) - /sizeof(asn_DEF_Alpha_1_tags[0]), /* 1 */ - asn_DEF_Alpha_1_tags, /* Same as above */ - sizeof(asn_DEF_Alpha_1_tags) - /sizeof(asn_DEF_Alpha_1_tags[0]), /* 1 */ + asn_DEF_Alpha_tags_1, + sizeof(asn_DEF_Alpha_tags_1) + /sizeof(asn_DEF_Alpha_tags_1[0]), /* 1 */ + asn_DEF_Alpha_tags_1, /* Same as above */ + sizeof(asn_DEF_Alpha_tags_1) + /sizeof(asn_DEF_Alpha_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Alpha_1, 2, /* Elements count */ - &asn_SPC_Alpha_1_specs /* Additional specs */ + &asn_SPC_Alpha_specs_1 /* Additional specs */ }; @@ -1114,6 +1214,8 @@ static asn_TYPE_member_t asn_MBR_Beta_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Alpha, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "b" }, { ATF_POINTER, 1, offsetof(struct Beta, g), @@ -1121,21 +1223,24 @@ static asn_TYPE_member_t asn_MBR_Beta_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Gamma, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "g" }, }; -static ber_tlv_tag_t asn_DEF_Beta_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Beta_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Beta_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Beta_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* b at 75 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* g at 76 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Beta_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Beta_specs_1 = { sizeof(struct Beta), offsetof(struct Beta, _asn_ctx), - asn_MAP_Beta_1_tag2el, + asn_MAP_Beta_tag2el_1, 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -1149,16 +1254,18 @@ asn_TYPE_descriptor_t asn_DEF_Beta = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Beta_1_tags, - sizeof(asn_DEF_Beta_1_tags) - /sizeof(asn_DEF_Beta_1_tags[0]), /* 1 */ - asn_DEF_Beta_1_tags, /* Same as above */ - sizeof(asn_DEF_Beta_1_tags) - /sizeof(asn_DEF_Beta_1_tags[0]), /* 1 */ + asn_DEF_Beta_tags_1, + sizeof(asn_DEF_Beta_tags_1) + /sizeof(asn_DEF_Beta_tags_1[0]), /* 1 */ + asn_DEF_Beta_tags_1, /* Same as above */ + sizeof(asn_DEF_Beta_tags_1) + /sizeof(asn_DEF_Beta_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Beta_1, 2, /* Elements count */ - &asn_SPC_Beta_1_specs /* Additional specs */ + &asn_SPC_Beta_specs_1 /* Additional specs */ }; @@ -1201,6 +1308,8 @@ static asn_TYPE_member_t asn_MBR_Gamma_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_TwoThree, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "o" }, { ATF_POINTER, 0, offsetof(struct Gamma, a), @@ -1208,6 +1317,8 @@ static asn_TYPE_member_t asn_MBR_Gamma_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Alpha, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "a" }, { ATF_POINTER, 0, offsetof(struct Gamma, b), @@ -1215,22 +1326,25 @@ static asn_TYPE_member_t asn_MBR_Gamma_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Beta, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "b" }, }; -static ber_tlv_tag_t asn_DEF_Gamma_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Gamma_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Gamma_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Gamma_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* o at 80 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* a at 81 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* b at 83 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Gamma_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Gamma_specs_1 = { sizeof(struct Gamma), offsetof(struct Gamma, _asn_ctx), - asn_MAP_Gamma_1_tag2el, + asn_MAP_Gamma_tag2el_1, 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -1244,16 +1358,18 @@ asn_TYPE_descriptor_t asn_DEF_Gamma = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Gamma_1_tags, - sizeof(asn_DEF_Gamma_1_tags) - /sizeof(asn_DEF_Gamma_1_tags[0]), /* 1 */ - asn_DEF_Gamma_1_tags, /* Same as above */ - sizeof(asn_DEF_Gamma_1_tags) - /sizeof(asn_DEF_Gamma_1_tags[0]), /* 1 */ + asn_DEF_Gamma_tags_1, + sizeof(asn_DEF_Gamma_tags_1) + /sizeof(asn_DEF_Gamma_tags_1[0]), /* 1 */ + asn_DEF_Gamma_tags_1, /* Same as above */ + sizeof(asn_DEF_Gamma_tags_1) + /sizeof(asn_DEF_Gamma_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Gamma_1, 3, /* Elements count */ - &asn_SPC_Gamma_1_specs /* Additional specs */ + &asn_SPC_Gamma_specs_1 /* Additional specs */ }; @@ -1304,28 +1420,30 @@ static asn_TYPE_member_t asn_MBR_OneTwo_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_TwoThree, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m12" }, }; -static ber_tlv_tag_t asn_DEF_OneTwo_1_tags[] = { +static ber_tlv_tag_t asn_DEF_OneTwo_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_OneTwo_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_OneTwo_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* m12 at 86 */ }; -static uint8_t asn_MAP_OneTwo_1_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { +static uint8_t asn_MAP_OneTwo_mmap_1[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { (1 << 7) }; -static asn_SET_specifics_t asn_SPC_OneTwo_1_specs = { +static asn_SET_specifics_t asn_SPC_OneTwo_specs_1 = { sizeof(struct OneTwo), offsetof(struct OneTwo, _asn_ctx), offsetof(struct OneTwo, _presence_map), - asn_MAP_OneTwo_1_tag2el, + asn_MAP_OneTwo_tag2el_1, 1, /* Count of tags in the map */ - asn_MAP_OneTwo_1_tag2el, /* Same as above */ + asn_MAP_OneTwo_tag2el_1, /* Same as above */ 1, /* Count of tags in the CXER map */ 0, /* Whether extensible */ - (unsigned int *)asn_MAP_OneTwo_1_mmap /* Mandatory elements map */ + (unsigned int *)asn_MAP_OneTwo_mmap_1 /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_OneTwo = { "OneTwo", @@ -1337,16 +1455,18 @@ asn_TYPE_descriptor_t asn_DEF_OneTwo = { SET_encode_der, SET_decode_xer, SET_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_OneTwo_1_tags, - sizeof(asn_DEF_OneTwo_1_tags) - /sizeof(asn_DEF_OneTwo_1_tags[0]), /* 1 */ - asn_DEF_OneTwo_1_tags, /* Same as above */ - sizeof(asn_DEF_OneTwo_1_tags) - /sizeof(asn_DEF_OneTwo_1_tags[0]), /* 1 */ + asn_DEF_OneTwo_tags_1, + sizeof(asn_DEF_OneTwo_tags_1) + /sizeof(asn_DEF_OneTwo_tags_1[0]), /* 1 */ + asn_DEF_OneTwo_tags_1, /* Same as above */ + sizeof(asn_DEF_OneTwo_tags_1) + /sizeof(asn_DEF_OneTwo_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_OneTwo_1, 1, /* Elements count */ - &asn_SPC_OneTwo_1_specs /* Additional specs */ + &asn_SPC_OneTwo_specs_1 /* Additional specs */ }; @@ -1397,28 +1517,30 @@ static asn_TYPE_member_t asn_MBR_TwoThree_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_ThreeOne, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m23" }, }; -static ber_tlv_tag_t asn_DEF_TwoThree_1_tags[] = { +static ber_tlv_tag_t asn_DEF_TwoThree_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_TwoThree_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_TwoThree_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* m23 at 87 */ }; -static uint8_t asn_MAP_TwoThree_1_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { +static uint8_t asn_MAP_TwoThree_mmap_1[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = { (1 << 7) }; -static asn_SET_specifics_t asn_SPC_TwoThree_1_specs = { +static asn_SET_specifics_t asn_SPC_TwoThree_specs_1 = { sizeof(struct TwoThree), offsetof(struct TwoThree, _asn_ctx), offsetof(struct TwoThree, _presence_map), - asn_MAP_TwoThree_1_tag2el, + asn_MAP_TwoThree_tag2el_1, 1, /* Count of tags in the map */ - asn_MAP_TwoThree_1_tag2el, /* Same as above */ + asn_MAP_TwoThree_tag2el_1, /* Same as above */ 1, /* Count of tags in the CXER map */ 0, /* Whether extensible */ - (unsigned int *)asn_MAP_TwoThree_1_mmap /* Mandatory elements map */ + (unsigned int *)asn_MAP_TwoThree_mmap_1 /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_TwoThree = { "TwoThree", @@ -1430,16 +1552,18 @@ asn_TYPE_descriptor_t asn_DEF_TwoThree = { SET_encode_der, SET_decode_xer, SET_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_TwoThree_1_tags, - sizeof(asn_DEF_TwoThree_1_tags) - /sizeof(asn_DEF_TwoThree_1_tags[0]), /* 1 */ - asn_DEF_TwoThree_1_tags, /* Same as above */ - sizeof(asn_DEF_TwoThree_1_tags) - /sizeof(asn_DEF_TwoThree_1_tags[0]), /* 1 */ + asn_DEF_TwoThree_tags_1, + sizeof(asn_DEF_TwoThree_tags_1) + /sizeof(asn_DEF_TwoThree_tags_1[0]), /* 1 */ + asn_DEF_TwoThree_tags_1, /* Same as above */ + sizeof(asn_DEF_TwoThree_tags_1) + /sizeof(asn_DEF_TwoThree_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_TwoThree_1, 1, /* Elements count */ - &asn_SPC_TwoThree_1_specs /* Additional specs */ + &asn_SPC_TwoThree_specs_1 /* Additional specs */ }; @@ -1494,6 +1618,8 @@ static asn_TYPE_member_t asn_MBR_ThreeOne_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_OneTwo, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m31" }, { ATF_POINTER, 0, offsetof(struct ThreeOne, g), @@ -1501,29 +1627,31 @@ static asn_TYPE_member_t asn_MBR_ThreeOne_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Gamma, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "g" }, }; -static ber_tlv_tag_t asn_DEF_ThreeOne_1_tags[] = { +static ber_tlv_tag_t asn_DEF_ThreeOne_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_ThreeOne_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_ThreeOne_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* m31 at 88 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* g at 88 */ }; -static uint8_t asn_MAP_ThreeOne_1_mmap[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = { +static uint8_t asn_MAP_ThreeOne_mmap_1[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = { (1 << 7) | (1 << 6) }; -static asn_SET_specifics_t asn_SPC_ThreeOne_1_specs = { +static asn_SET_specifics_t asn_SPC_ThreeOne_specs_1 = { sizeof(struct ThreeOne), offsetof(struct ThreeOne, _asn_ctx), offsetof(struct ThreeOne, _presence_map), - asn_MAP_ThreeOne_1_tag2el, + asn_MAP_ThreeOne_tag2el_1, 2, /* Count of tags in the map */ - asn_MAP_ThreeOne_1_tag2el, /* Same as above */ + asn_MAP_ThreeOne_tag2el_1, /* Same as above */ 2, /* Count of tags in the CXER map */ 0, /* Whether extensible */ - (unsigned int *)asn_MAP_ThreeOne_1_mmap /* Mandatory elements map */ + (unsigned int *)asn_MAP_ThreeOne_mmap_1 /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_ThreeOne = { "ThreeOne", @@ -1535,15 +1663,17 @@ asn_TYPE_descriptor_t asn_DEF_ThreeOne = { SET_encode_der, SET_decode_xer, SET_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_ThreeOne_1_tags, - sizeof(asn_DEF_ThreeOne_1_tags) - /sizeof(asn_DEF_ThreeOne_1_tags[0]), /* 1 */ - asn_DEF_ThreeOne_1_tags, /* Same as above */ - sizeof(asn_DEF_ThreeOne_1_tags) - /sizeof(asn_DEF_ThreeOne_1_tags[0]), /* 1 */ + asn_DEF_ThreeOne_tags_1, + sizeof(asn_DEF_ThreeOne_tags_1) + /sizeof(asn_DEF_ThreeOne_tags_1[0]), /* 1 */ + asn_DEF_ThreeOne_tags_1, /* Same as above */ + sizeof(asn_DEF_ThreeOne_tags_1) + /sizeof(asn_DEF_ThreeOne_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_ThreeOne_1, 2, /* Elements count */ - &asn_SPC_ThreeOne_1_specs /* Additional specs */ + &asn_SPC_ThreeOne_specs_1 /* Additional specs */ }; diff --git a/tests/93-asn1c-controls-OK.asn1.-P b/tests/93-asn1c-controls-OK.asn1.-P index f2d5fe362..0be9a2c60 100644 --- a/tests/93-asn1c-controls-OK.asn1.-P +++ b/tests/93-asn1c-controls-OK.asn1.-P @@ -26,6 +26,8 @@ static asn_TYPE_member_t asn_MBR_Sequence_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "ainl" }, { ATF_POINTER, 0, offsetof(struct Sequence, aptr), @@ -33,21 +35,24 @@ static asn_TYPE_member_t asn_MBR_Sequence_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "aptr" }, }; -static ber_tlv_tag_t asn_DEF_Sequence_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Sequence_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Sequence_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Sequence_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ainl at 15 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* aptr at 18 */ }; -static asn_SEQUENCE_specifics_t asn_SPC_Sequence_1_specs = { +static asn_SEQUENCE_specifics_t asn_SPC_Sequence_specs_1 = { sizeof(struct Sequence), offsetof(struct Sequence, _asn_ctx), - asn_MAP_Sequence_1_tag2el, + asn_MAP_Sequence_tag2el_1, 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -61,16 +66,18 @@ asn_TYPE_descriptor_t asn_DEF_Sequence = { SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Sequence_1_tags, - sizeof(asn_DEF_Sequence_1_tags) - /sizeof(asn_DEF_Sequence_1_tags[0]), /* 1 */ - asn_DEF_Sequence_1_tags, /* Same as above */ - sizeof(asn_DEF_Sequence_1_tags) - /sizeof(asn_DEF_Sequence_1_tags[0]), /* 1 */ + asn_DEF_Sequence_tags_1, + sizeof(asn_DEF_Sequence_tags_1) + /sizeof(asn_DEF_Sequence_tags_1[0]), /* 1 */ + asn_DEF_Sequence_tags_1, /* Same as above */ + sizeof(asn_DEF_Sequence_tags_1) + /sizeof(asn_DEF_Sequence_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Sequence_1, 2, /* Elements count */ - &asn_SPC_Sequence_1_specs /* Additional specs */ + &asn_SPC_Sequence_specs_1 /* Additional specs */ }; @@ -124,6 +131,8 @@ static asn_TYPE_member_t asn_MBR_Set_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Sequence, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "ainl" }, { ATF_POINTER, 0, offsetof(struct Set, aptr), @@ -131,29 +140,31 @@ static asn_TYPE_member_t asn_MBR_Set_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Sequence, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "aptr" }, }; -static ber_tlv_tag_t asn_DEF_Set_1_tags[] = { +static ber_tlv_tag_t asn_DEF_Set_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_Set_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Set_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ainl at 21 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* aptr at 24 */ }; -static uint8_t asn_MAP_Set_1_mmap[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = { +static uint8_t asn_MAP_Set_mmap_1[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = { (1 << 7) | (1 << 6) }; -static asn_SET_specifics_t asn_SPC_Set_1_specs = { +static asn_SET_specifics_t asn_SPC_Set_specs_1 = { sizeof(struct Set), offsetof(struct Set, _asn_ctx), offsetof(struct Set, _presence_map), - asn_MAP_Set_1_tag2el, + asn_MAP_Set_tag2el_1, 2, /* Count of tags in the map */ - asn_MAP_Set_1_tag2el, /* Same as above */ + asn_MAP_Set_tag2el_1, /* Same as above */ 2, /* Count of tags in the CXER map */ 0, /* Whether extensible */ - (unsigned int *)asn_MAP_Set_1_mmap /* Mandatory elements map */ + (unsigned int *)asn_MAP_Set_mmap_1 /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_Set = { "Set", @@ -165,16 +176,18 @@ asn_TYPE_descriptor_t asn_DEF_Set = { SET_encode_der, SET_decode_xer, SET_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_Set_1_tags, - sizeof(asn_DEF_Set_1_tags) - /sizeof(asn_DEF_Set_1_tags[0]), /* 1 */ - asn_DEF_Set_1_tags, /* Same as above */ - sizeof(asn_DEF_Set_1_tags) - /sizeof(asn_DEF_Set_1_tags[0]), /* 1 */ + asn_DEF_Set_tags_1, + sizeof(asn_DEF_Set_tags_1) + /sizeof(asn_DEF_Set_tags_1[0]), /* 1 */ + asn_DEF_Set_tags_1, /* Same as above */ + sizeof(asn_DEF_Set_tags_1) + /sizeof(asn_DEF_Set_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_Set_1, 2, /* Elements count */ - &asn_SPC_Set_1_specs /* Additional specs */ + &asn_SPC_Set_specs_1 /* Additional specs */ }; @@ -234,14 +247,16 @@ static asn_TYPE_member_t asn_MBR_setof_2[] = { .tag_mode = 0, .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "" }, }; -static ber_tlv_tag_t asn_DEF_setof_2_tags[] = { +static ber_tlv_tag_t asn_DEF_setof_tags_2[] = { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_SET_OF_specifics_t asn_SPC_setof_2_specs = { +static asn_SET_OF_specifics_t asn_SPC_setof_specs_2 = { sizeof(struct setof), offsetof(struct setof, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ @@ -257,16 +272,18 @@ asn_TYPE_descriptor_t asn_DEF_setof_2 = { SET_OF_encode_der, SET_OF_decode_xer, SET_OF_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_setof_2_tags, - sizeof(asn_DEF_setof_2_tags) - /sizeof(asn_DEF_setof_2_tags[0]) - 1, /* 1 */ - asn_DEF_setof_2_tags, /* Same as above */ - sizeof(asn_DEF_setof_2_tags) - /sizeof(asn_DEF_setof_2_tags[0]), /* 2 */ + asn_DEF_setof_tags_2, + sizeof(asn_DEF_setof_tags_2) + /sizeof(asn_DEF_setof_tags_2[0]) - 1, /* 1 */ + asn_DEF_setof_tags_2, /* Same as above */ + sizeof(asn_DEF_setof_tags_2) + /sizeof(asn_DEF_setof_tags_2[0]), /* 2 */ + 0, /* No PER visible constraints */ asn_MBR_setof_2, 1, /* Single element */ - &asn_SPC_setof_2_specs /* Additional specs */ + &asn_SPC_setof_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_Choice_1[] = { @@ -275,6 +292,8 @@ static asn_TYPE_member_t asn_MBR_Choice_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_setof_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "setof" }, { ATF_POINTER, 0, offsetof(struct Choice, choice.aptr), @@ -282,6 +301,8 @@ static asn_TYPE_member_t asn_MBR_Choice_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Sequence, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "aptr" }, { ATF_NOFLAGS, 0, offsetof(struct Choice, choice.ainl), @@ -289,22 +310,25 @@ static asn_TYPE_member_t asn_MBR_Choice_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_Sequence, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "ainl" }, }; -static asn_TYPE_tag2member_t asn_MAP_Choice_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_Choice_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* setof at 28 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* aptr at 30 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* ainl at 32 */ }; -static asn_CHOICE_specifics_t asn_SPC_Choice_1_specs = { +static asn_CHOICE_specifics_t asn_SPC_Choice_specs_1 = { sizeof(struct Choice), offsetof(struct Choice, _asn_ctx), offsetof(struct Choice, present), sizeof(((struct Choice *)0)->present), - asn_MAP_Choice_1_tag2el, + asn_MAP_Choice_tag2el_1, 3, /* Count of tags in the map */ - 0 /* Whether extensible */ + .canonical_order = 0, + .ext_start = -1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_Choice = { "Choice", @@ -316,13 +340,15 @@ asn_TYPE_descriptor_t asn_DEF_Choice = { CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ + 0, /* No PER visible constraints */ asn_MBR_Choice_1, 3, /* Elements count */ - &asn_SPC_Choice_1_specs /* Additional specs */ + &asn_SPC_Choice_specs_1 /* Additional specs */ }; diff --git a/tests/94-set-optionals-OK.asn1.-P b/tests/94-set-optionals-OK.asn1.-P index c1c4dd9ac..879cb069d 100644 --- a/tests/94-set-optionals-OK.asn1.-P +++ b/tests/94-set-optionals-OK.asn1.-P @@ -61,6 +61,8 @@ static asn_TYPE_member_t asn_MBR_TestSet_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_VisibleString, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m0" }, { ATF_POINTER, 1, offsetof(struct TestSet, m1), @@ -68,6 +70,8 @@ static asn_TYPE_member_t asn_MBR_TestSet_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_VisibleString, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m1" }, { ATF_NOFLAGS, 0, offsetof(struct TestSet, m2), @@ -75,6 +79,8 @@ static asn_TYPE_member_t asn_MBR_TestSet_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_VisibleString, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m2" }, { ATF_NOFLAGS, 0, offsetof(struct TestSet, m3), @@ -82,6 +88,8 @@ static asn_TYPE_member_t asn_MBR_TestSet_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_VisibleString, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m3" }, { ATF_POINTER, 1, offsetof(struct TestSet, m4), @@ -89,6 +97,8 @@ static asn_TYPE_member_t asn_MBR_TestSet_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_VisibleString, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m4" }, { ATF_NOFLAGS, 0, offsetof(struct TestSet, m5), @@ -96,6 +106,8 @@ static asn_TYPE_member_t asn_MBR_TestSet_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_VisibleString, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m5" }, { ATF_NOFLAGS, 0, offsetof(struct TestSet, m6), @@ -103,6 +115,8 @@ static asn_TYPE_member_t asn_MBR_TestSet_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_VisibleString, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m6" }, { ATF_NOFLAGS, 0, offsetof(struct TestSet, m7), @@ -110,6 +124,8 @@ static asn_TYPE_member_t asn_MBR_TestSet_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_VisibleString, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m7" }, { ATF_POINTER, 1, offsetof(struct TestSet, m8), @@ -117,6 +133,8 @@ static asn_TYPE_member_t asn_MBR_TestSet_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_VisibleString, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m8" }, { ATF_NOFLAGS, 0, offsetof(struct TestSet, m9), @@ -124,13 +142,15 @@ static asn_TYPE_member_t asn_MBR_TestSet_1[] = { .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_VisibleString, .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, .name = "m9" }, }; -static ber_tlv_tag_t asn_DEF_TestSet_1_tags[] = { +static ber_tlv_tag_t asn_DEF_TestSet_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) }; -static asn_TYPE_tag2member_t asn_MAP_TestSet_1_tag2el[] = { +static asn_TYPE_tag2member_t asn_MAP_TestSet_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* m0 at 15 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* m1 at 16 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* m2 at 17 */ @@ -142,20 +162,20 @@ static asn_TYPE_tag2member_t asn_MAP_TestSet_1_tag2el[] = { { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 }, /* m8 at 23 */ { (ASN_TAG_CLASS_CONTEXT | (9 << 2)), 9, 0, 0 } /* m9 at 24 */ }; -static uint8_t asn_MAP_TestSet_1_mmap[(10 + (8 * sizeof(unsigned int)) - 1) / 8] = { +static uint8_t asn_MAP_TestSet_mmap_1[(10 + (8 * sizeof(unsigned int)) - 1) / 8] = { (1 << 7) | (0 << 6) | (1 << 5) | (1 << 4) | (0 << 3) | (1 << 2) | (1 << 1) | (1 << 0), (0 << 7) | (1 << 6) }; -static asn_SET_specifics_t asn_SPC_TestSet_1_specs = { +static asn_SET_specifics_t asn_SPC_TestSet_specs_1 = { sizeof(struct TestSet), offsetof(struct TestSet, _asn_ctx), offsetof(struct TestSet, _presence_map), - asn_MAP_TestSet_1_tag2el, + asn_MAP_TestSet_tag2el_1, 10, /* Count of tags in the map */ - asn_MAP_TestSet_1_tag2el, /* Same as above */ + asn_MAP_TestSet_tag2el_1, /* Same as above */ 10, /* Count of tags in the CXER map */ 1, /* Whether extensible */ - (unsigned int *)asn_MAP_TestSet_1_mmap /* Mandatory elements map */ + (unsigned int *)asn_MAP_TestSet_mmap_1 /* Mandatory elements map */ }; asn_TYPE_descriptor_t asn_DEF_TestSet = { "TestSet", @@ -167,15 +187,17 @@ asn_TYPE_descriptor_t asn_DEF_TestSet = { SET_encode_der, SET_decode_xer, SET_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ 0, /* Use generic outmost tag fetcher */ - asn_DEF_TestSet_1_tags, - sizeof(asn_DEF_TestSet_1_tags) - /sizeof(asn_DEF_TestSet_1_tags[0]), /* 1 */ - asn_DEF_TestSet_1_tags, /* Same as above */ - sizeof(asn_DEF_TestSet_1_tags) - /sizeof(asn_DEF_TestSet_1_tags[0]), /* 1 */ + asn_DEF_TestSet_tags_1, + sizeof(asn_DEF_TestSet_tags_1) + /sizeof(asn_DEF_TestSet_tags_1[0]), /* 1 */ + asn_DEF_TestSet_tags_1, /* Same as above */ + sizeof(asn_DEF_TestSet_tags_1) + /sizeof(asn_DEF_TestSet_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ asn_MBR_TestSet_1, 10, /* Elements count */ - &asn_SPC_TestSet_1_specs /* Additional specs */ + &asn_SPC_TestSet_specs_1 /* Additional specs */ }; diff --git a/tests/95-choice-per-order-OK.asn1 b/tests/95-choice-per-order-OK.asn1 new file mode 100644 index 000000000..2aeb4f723 --- /dev/null +++ b/tests/95-choice-per-order-OK.asn1 @@ -0,0 +1,30 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .95 + +ModuleCHOICE-PER-Ordering + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 95 } + DEFINITIONS ::= +BEGIN + + Choice ::= CHOICE { + roid RELATIVE-OID, + bitstr BIT STRING, + ch CHOICE { + null NULL, + int INTEGER + }, + ..., + bool BOOLEAN + } + + Choice2 ::= CHOICE { + bitstr [0] BIT STRING, + roid [1] RELATIVE-OID + } + +END diff --git a/tests/95-choice-per-order-OK.asn1.-P b/tests/95-choice-per-order-OK.asn1.-P new file mode 100644 index 000000000..c1f726b25 --- /dev/null +++ b/tests/95-choice-per-order-OK.asn1.-P @@ -0,0 +1,284 @@ + +/*** <<< INCLUDES [Choice] >>> ***/ + +#include +#include +#include +#include +#include +#include + +/*** <<< DEPS [Choice] >>> ***/ + +typedef enum Choice_PR { + Choice_PR_NOTHING, /* No components present */ + Choice_PR_roid, + Choice_PR_bitstr, + Choice_PR_ch, + /* Extensions may appear below */ + Choice_PR_bool, +} Choice_PR; +typedef enum ch_PR { + ch_PR_NOTHING, /* No components present */ + ch_PR_null, + ch_PR_int, +} ch_PR; + +/*** <<< TYPE-DECLS [Choice] >>> ***/ + +typedef struct Choice { + Choice_PR present; + union Choice_u { + RELATIVE_OID_t roid; + BIT_STRING_t bitstr; + struct ch { + ch_PR present; + union Choice__ch_u { + NULL_t null; + INTEGER_t Int; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } ch; + /* + * This type is extensible, + * possible extensions are below. + */ + BOOLEAN_t bool; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} Choice_t; + +/*** <<< FUNC-DECLS [Choice] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Choice; + +/*** <<< STAT-DEFS [Choice] >>> ***/ + +static asn_TYPE_member_t asn_MBR_ch_4[] = { + { ATF_NOFLAGS, 0, offsetof(struct ch, choice.null), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)), + .tag_mode = 0, + .type = &asn_DEF_NULL, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "null" + }, + { ATF_NOFLAGS, 0, offsetof(struct ch, choice.Int), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = &asn_DEF_INTEGER, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "int" + }, +}; +static asn_TYPE_tag2member_t asn_MAP_ch_tag2el_4[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* int at 20 */ + { (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)), 0, 0, 0 } /* null at 18 */ +}; +static asn_CHOICE_specifics_t asn_SPC_ch_specs_4 = { + sizeof(struct ch), + offsetof(struct ch, _asn_ctx), + offsetof(struct ch, present), + sizeof(((struct ch *)0)->present), + asn_MAP_ch_tag2el_4, + 2, /* Count of tags in the map */ + .canonical_order = 0, + .ext_start = -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_ch_4 = { + "ch", + "ch", + CHOICE_free, + CHOICE_print, + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_decode_xer, + CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ + CHOICE_outmost_tag, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + 0, /* No PER visible constraints */ + asn_MBR_ch_4, + 2, /* Elements count */ + &asn_SPC_ch_specs_4 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_Choice_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct Choice, choice.roid), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (13 << 2)), + .tag_mode = 0, + .type = &asn_DEF_RELATIVE_OID, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "roid" + }, + { ATF_NOFLAGS, 0, offsetof(struct Choice, choice.bitstr), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), + .tag_mode = 0, + .type = &asn_DEF_BIT_STRING, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "bitstr" + }, + { ATF_NOFLAGS, 0, offsetof(struct Choice, choice.ch), + .tag = -1 /* Ambiguous tag (CHOICE?) */, + .tag_mode = 0, + .type = &asn_DEF_ch_4, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "ch" + }, + { ATF_NOFLAGS, 0, offsetof(struct Choice, choice.bool), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), + .tag_mode = 0, + .type = &asn_DEF_BOOLEAN, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "bool" + }, +}; +static asn_TYPE_tag2member_t asn_MAP_Choice_tag2el_1[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 3, 0, 0 }, /* bool at 22 */ + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 2, 0, 0 }, /* int at 20 */ + { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 1, 0, 0 }, /* bitstr at 16 */ + { (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)), 2, 0, 0 }, /* null at 18 */ + { (ASN_TAG_CLASS_UNIVERSAL | (13 << 2)), 0, 0, 0 } /* roid at 15 */ +}; +static asn_CHOICE_specifics_t asn_SPC_Choice_specs_1 = { + sizeof(struct Choice), + offsetof(struct Choice, _asn_ctx), + offsetof(struct Choice, present), + sizeof(((struct Choice *)0)->present), + asn_MAP_Choice_tag2el_1, + 5, /* Count of tags in the map */ + .canonical_order = 0, + .ext_start = 3 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_Choice = { + "Choice", + "Choice", + CHOICE_free, + CHOICE_print, + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_decode_xer, + CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ + CHOICE_outmost_tag, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + 0, /* No PER visible constraints */ + asn_MBR_Choice_1, + 4, /* Elements count */ + &asn_SPC_Choice_specs_1 /* Additional specs */ +}; + + +/*** <<< INCLUDES [Choice2] >>> ***/ + +#include +#include +#include + +/*** <<< DEPS [Choice2] >>> ***/ + +typedef enum Choice2_PR { + Choice2_PR_NOTHING, /* No components present */ + Choice2_PR_bitstr, + Choice2_PR_roid, +} Choice2_PR; + +/*** <<< TYPE-DECLS [Choice2] >>> ***/ + +typedef struct Choice2 { + Choice2_PR present; + union Choice2_u { + BIT_STRING_t bitstr; + RELATIVE_OID_t roid; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} Choice2_t; + +/*** <<< FUNC-DECLS [Choice2] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Choice2; + +/*** <<< STAT-DEFS [Choice2] >>> ***/ + +static asn_TYPE_member_t asn_MBR_Choice2_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct Choice2, choice.bitstr), + .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + .tag_mode = +1, /* EXPLICIT tag at current level */ + .type = &asn_DEF_BIT_STRING, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "bitstr" + }, + { ATF_NOFLAGS, 0, offsetof(struct Choice2, choice.roid), + .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + .tag_mode = +1, /* EXPLICIT tag at current level */ + .type = &asn_DEF_RELATIVE_OID, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "roid" + }, +}; +static asn_TYPE_tag2member_t asn_MAP_Choice2_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* bitstr at 26 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* roid at 27 */ +}; +static asn_CHOICE_specifics_t asn_SPC_Choice2_specs_1 = { + sizeof(struct Choice2), + offsetof(struct Choice2, _asn_ctx), + offsetof(struct Choice2, present), + sizeof(((struct Choice2 *)0)->present), + asn_MAP_Choice2_tag2el_1, + 2, /* Count of tags in the map */ + .canonical_order = 0, + .ext_start = -1 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_Choice2 = { + "Choice2", + "Choice2", + CHOICE_free, + CHOICE_print, + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_decode_xer, + CHOICE_encode_xer, + 0, /* No PER decoder, -gen-PER to enable */ + CHOICE_outmost_tag, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + 0, /* No PER visible constraints */ + asn_MBR_Choice2_1, + 2, /* Elements count */ + &asn_SPC_Choice2_specs_1 /* Additional specs */ +}; + diff --git a/tests/95-choice-per-order-OK.asn1.-Pgen-PER b/tests/95-choice-per-order-OK.asn1.-Pgen-PER new file mode 100644 index 000000000..68e9ad931 --- /dev/null +++ b/tests/95-choice-per-order-OK.asn1.-Pgen-PER @@ -0,0 +1,302 @@ + +/*** <<< INCLUDES [Choice] >>> ***/ + +#include +#include +#include +#include +#include +#include + +/*** <<< DEPS [Choice] >>> ***/ + +typedef enum Choice_PR { + Choice_PR_NOTHING, /* No components present */ + Choice_PR_roid, + Choice_PR_bitstr, + Choice_PR_ch, + /* Extensions may appear below */ + Choice_PR_bool, +} Choice_PR; +typedef enum ch_PR { + ch_PR_NOTHING, /* No components present */ + ch_PR_null, + ch_PR_int, +} ch_PR; + +/*** <<< TYPE-DECLS [Choice] >>> ***/ + +typedef struct Choice { + Choice_PR present; + union Choice_u { + RELATIVE_OID_t roid; + BIT_STRING_t bitstr; + struct ch { + ch_PR present; + union Choice__ch_u { + NULL_t null; + INTEGER_t Int; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } ch; + /* + * This type is extensible, + * possible extensions are below. + */ + BOOLEAN_t bool; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} Choice_t; + +/*** <<< FUNC-DECLS [Choice] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Choice; + +/*** <<< STAT-DEFS [Choice] >>> ***/ + +static asn_TYPE_member_t asn_MBR_ch_4[] = { + { ATF_NOFLAGS, 0, offsetof(struct ch, choice.null), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)), + .tag_mode = 0, + .type = &asn_DEF_NULL, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* No PER visible constraints */ + .default_value = 0, + .name = "null" + }, + { ATF_NOFLAGS, 0, offsetof(struct ch, choice.Int), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = &asn_DEF_INTEGER, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* No PER visible constraints */ + .default_value = 0, + .name = "int" + }, +}; +static int asn_MAP_ch_cmap_4[] = { 1, 0 }; +static asn_TYPE_tag2member_t asn_MAP_ch_tag2el_4[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* int at 20 */ + { (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)), 0, 0, 0 } /* null at 18 */ +}; +static asn_CHOICE_specifics_t asn_SPC_ch_specs_4 = { + sizeof(struct ch), + offsetof(struct ch, _asn_ctx), + offsetof(struct ch, present), + sizeof(((struct ch *)0)->present), + asn_MAP_ch_tag2el_4, + 2, /* Count of tags in the map */ + .canonical_order = asn_MAP_ch_cmap_4, /* Canonically sorted */ + .ext_start = -1 /* Extensions start */ +}; +static asn_per_constraints_t asn_PER_ch_constr_4 = { + { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_ch_4 = { + "ch", + "ch", + CHOICE_free, + CHOICE_print, + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_decode_xer, + CHOICE_encode_xer, + CHOICE_decode_uper, + CHOICE_outmost_tag, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + &asn_PER_ch_constr_4, + asn_MBR_ch_4, + 2, /* Elements count */ + &asn_SPC_ch_specs_4 /* Additional specs */ +}; + +static asn_per_constraints_t asn_PER_memb_ch_constr_4 = { + { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +static asn_TYPE_member_t asn_MBR_Choice_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct Choice, choice.roid), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (13 << 2)), + .tag_mode = 0, + .type = &asn_DEF_RELATIVE_OID, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* No PER visible constraints */ + .default_value = 0, + .name = "roid" + }, + { ATF_NOFLAGS, 0, offsetof(struct Choice, choice.bitstr), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), + .tag_mode = 0, + .type = &asn_DEF_BIT_STRING, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* No PER visible constraints */ + .default_value = 0, + .name = "bitstr" + }, + { ATF_NOFLAGS, 0, offsetof(struct Choice, choice.ch), + .tag = -1 /* Ambiguous tag (CHOICE?) */, + .tag_mode = 0, + .type = &asn_DEF_ch_4, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = &asn_PER_memb_ch_constr_4, + .default_value = 0, + .name = "ch" + }, + { ATF_NOFLAGS, 0, offsetof(struct Choice, choice.bool), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), + .tag_mode = 0, + .type = &asn_DEF_BOOLEAN, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* No PER visible constraints */ + .default_value = 0, + .name = "bool" + }, +}; +static int asn_MAP_Choice_cmap_1[] = { 2, 1, 0, 3 }; +static asn_TYPE_tag2member_t asn_MAP_Choice_tag2el_1[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 3, 0, 0 }, /* bool at 22 */ + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 2, 0, 0 }, /* int at 20 */ + { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 1, 0, 0 }, /* bitstr at 16 */ + { (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)), 2, 0, 0 }, /* null at 18 */ + { (ASN_TAG_CLASS_UNIVERSAL | (13 << 2)), 0, 0, 0 } /* roid at 15 */ +}; +static asn_CHOICE_specifics_t asn_SPC_Choice_specs_1 = { + sizeof(struct Choice), + offsetof(struct Choice, _asn_ctx), + offsetof(struct Choice, present), + sizeof(((struct Choice *)0)->present), + asn_MAP_Choice_tag2el_1, + 5, /* Count of tags in the map */ + .canonical_order = asn_MAP_Choice_cmap_1, /* Canonically sorted */ + .ext_start = 3 /* Extensions start */ +}; +static asn_per_constraints_t asn_PER_Choice_constr_1 = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_Choice = { + "Choice", + "Choice", + CHOICE_free, + CHOICE_print, + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_decode_xer, + CHOICE_encode_xer, + CHOICE_decode_uper, + CHOICE_outmost_tag, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + &asn_PER_Choice_constr_1, + asn_MBR_Choice_1, + 4, /* Elements count */ + &asn_SPC_Choice_specs_1 /* Additional specs */ +}; + + +/*** <<< INCLUDES [Choice2] >>> ***/ + +#include +#include +#include + +/*** <<< DEPS [Choice2] >>> ***/ + +typedef enum Choice2_PR { + Choice2_PR_NOTHING, /* No components present */ + Choice2_PR_bitstr, + Choice2_PR_roid, +} Choice2_PR; + +/*** <<< TYPE-DECLS [Choice2] >>> ***/ + +typedef struct Choice2 { + Choice2_PR present; + union Choice2_u { + BIT_STRING_t bitstr; + RELATIVE_OID_t roid; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} Choice2_t; + +/*** <<< FUNC-DECLS [Choice2] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Choice2; + +/*** <<< STAT-DEFS [Choice2] >>> ***/ + +static asn_TYPE_member_t asn_MBR_Choice2_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct Choice2, choice.bitstr), + .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + .tag_mode = +1, /* EXPLICIT tag at current level */ + .type = &asn_DEF_BIT_STRING, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* No PER visible constraints */ + .default_value = 0, + .name = "bitstr" + }, + { ATF_NOFLAGS, 0, offsetof(struct Choice2, choice.roid), + .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + .tag_mode = +1, /* EXPLICIT tag at current level */ + .type = &asn_DEF_RELATIVE_OID, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* No PER visible constraints */ + .default_value = 0, + .name = "roid" + }, +}; +static asn_TYPE_tag2member_t asn_MAP_Choice2_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* bitstr at 26 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* roid at 27 */ +}; +static asn_CHOICE_specifics_t asn_SPC_Choice2_specs_1 = { + sizeof(struct Choice2), + offsetof(struct Choice2, _asn_ctx), + offsetof(struct Choice2, present), + sizeof(((struct Choice2 *)0)->present), + asn_MAP_Choice2_tag2el_1, + 2, /* Count of tags in the map */ + .canonical_order = 0, + .ext_start = -1 /* Extensions start */ +}; +static asn_per_constraints_t asn_PER_Choice2_constr_1 = { + { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 } +}; +asn_TYPE_descriptor_t asn_DEF_Choice2 = { + "Choice2", + "Choice2", + CHOICE_free, + CHOICE_print, + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_decode_xer, + CHOICE_encode_xer, + CHOICE_decode_uper, + CHOICE_outmost_tag, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + &asn_PER_Choice2_constr_1, + asn_MBR_Choice2_1, + 2, /* Elements count */ + &asn_SPC_Choice2_specs_1 /* Additional specs */ +}; + From 194e03a2f14968f603e940450cb75a2c5895f5e4 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 26 Nov 2005 11:26:22 +0000 Subject: [PATCH 1012/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1012 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/file-dependencies | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/skeletons/file-dependencies b/skeletons/file-dependencies index 87e960981..ca43363c9 100644 --- a/skeletons/file-dependencies +++ b/skeletons/file-dependencies @@ -58,10 +58,8 @@ constraints.h constraints.c # Subtype constraints support xer_support.h xer_support.c # XML parsing xer_decoder.h xer_decoder.c # XER decoding support xer_encoder.h xer_encoder.c # XER encoding support -per_decoder.h per_support.h # PER declarations, just in case -#asn-decoder-template.c # Template for quick decoder creation - -CODEC-PER: # THIS IS A SPECIAL SECTION per_support.h per_support.c # PER parsing per_decoder.h per_decoder.c # PER decoding support +#asn-decoder-template.c # Template for quick decoder creation +CODEC-PER: # THIS IS A SPECIAL SECTION From cb38e73d194c941bd1927061778827597bca42b5 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 27 Nov 2005 12:40:43 +0000 Subject: [PATCH 1013/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1013 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/NativeInteger.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index 2e44eaa69..b974ebf9e 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -241,12 +241,13 @@ NativeInteger_decode_uper(asn_codec_ctx_t *opt_codec_ctx, memset(&tmpint, 0, sizeof tmpint); rval = INTEGER_decode_uper(opt_codec_ctx, td, constraints, &tmpintptr, pd); - if(rval.code == RC_OK) + if(rval.code == RC_OK) { if(asn_INTEGER2long(&tmpint, native)) rval.code = RC_FAIL; else ASN_DEBUG("NativeInteger %s got value %ld", td->name, *native); + } asn_DEF_INTEGER.free_struct(&asn_DEF_INTEGER, &tmpint, 1); return rval; From f16efeb4f4a22396a91ca2c4bd8bcfae7a90d315 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 27 Nov 2005 12:54:20 +0000 Subject: [PATCH 1014/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1014 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SET_OF.c | 2 +- tests/31-set-of-OK.asn1 | 2 - tests/31-set-of-OK.asn1.-EF | 2 - tests/31-set-of-OK.asn1.-P | 165 ------------------------------------ 4 files changed, 1 insertion(+), 170 deletions(-) diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index 251da390e..103817b41 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -901,7 +901,7 @@ SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, nelems = uper_get_length(pd, ct ? ct->effective_bits : -1, &repeat); ASN_DEBUG("Got to decode %d elements (eff %d)", - nelems, ct ? ct->effective_bits : -1); + (int)nelems, (int)ct ? ct->effective_bits : -1); if(nelems < 0) _ASN_DECODE_FAILED; } diff --git a/tests/31-set-of-OK.asn1 b/tests/31-set-of-OK.asn1 index ddfe51c7d..c8fa51eb1 100644 --- a/tests/31-set-of-OK.asn1 +++ b/tests/31-set-of-OK.asn1 @@ -37,6 +37,4 @@ BEGIN -- not to the SET OF's embedded SEQUENCE! } - SSS ::= SEQUENCE OF SET OF SEQUENCE OF BIT STRING - END diff --git a/tests/31-set-of-OK.asn1.-EF b/tests/31-set-of-OK.asn1.-EF index bf6f99d84..f97ce2a30 100644 --- a/tests/31-set-of-OK.asn1.-EF +++ b/tests/31-set-of-OK.asn1.-EF @@ -23,6 +23,4 @@ Stuff ::= SET { } } -SSS ::= SEQUENCE OF SET OF SEQUENCE OF BIT STRING - END diff --git a/tests/31-set-of-OK.asn1.-P b/tests/31-set-of-OK.asn1.-P index 23cf7f0d0..e53bfb488 100644 --- a/tests/31-set-of-OK.asn1.-P +++ b/tests/31-set-of-OK.asn1.-P @@ -520,168 +520,3 @@ asn_TYPE_descriptor_t asn_DEF_Stuff = { &asn_SPC_Stuff_specs_1 /* Additional specs */ }; - -/*** <<< INCLUDES [SSS] >>> ***/ - -#include -#include -#include -#include -#include - -/*** <<< TYPE-DECLS [SSS] >>> ***/ - -typedef struct SSS { - A_SEQUENCE_OF(struct Member { - A_SET_OF(struct Member { - A_SEQUENCE_OF(BIT_STRING_t) list; - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; - } ) list; - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; - } ) list; - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; -} SSS_t; - -/*** <<< FUNC-DECLS [SSS] >>> ***/ - -extern asn_TYPE_descriptor_t asn_DEF_SSS; - -/*** <<< STAT-DEFS [SSS] >>> ***/ - -static asn_TYPE_member_t asn_MBR_Member_3[] = { - { ATF_POINTER, 0, 0, - .tag = (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), - .tag_mode = 0, - .type = &asn_DEF_BIT_STRING, - .memb_constraints = 0, /* Defer constraints checking to the member type */ - .per_constraints = 0, /* PER is not compiled, use -gen-PER */ - .default_value = 0, - .name = "" - }, -}; -static ber_tlv_tag_t asn_DEF_Member_tags_3[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -static asn_SET_OF_specifics_t asn_SPC_Member_specs_3 = { - sizeof(struct Member), - offsetof(struct Member, _asn_ctx), - 0, /* XER encoding is XMLDelimitedItemList */ -}; -static /* Use -fall-defs-global to expose */ -asn_TYPE_descriptor_t asn_DEF_Member_3 = { - "SEQUENCE OF", - "SEQUENCE_OF", - SEQUENCE_OF_free, - SEQUENCE_OF_print, - SEQUENCE_OF_constraint, - SEQUENCE_OF_decode_ber, - SEQUENCE_OF_encode_der, - SEQUENCE_OF_decode_xer, - SEQUENCE_OF_encode_xer, - 0, /* No PER decoder, -gen-PER to enable */ - 0, /* Use generic outmost tag fetcher */ - asn_DEF_Member_tags_3, - sizeof(asn_DEF_Member_tags_3) - /sizeof(asn_DEF_Member_tags_3[0]), /* 1 */ - asn_DEF_Member_tags_3, /* Same as above */ - sizeof(asn_DEF_Member_tags_3) - /sizeof(asn_DEF_Member_tags_3[0]), /* 1 */ - 0, /* No PER visible constraints */ - asn_MBR_Member_3, - 1, /* Single element */ - &asn_SPC_Member_specs_3 /* Additional specs */ -}; - -static asn_TYPE_member_t asn_MBR_Member_2[] = { - { ATF_POINTER, 0, 0, - .tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), - .tag_mode = 0, - .type = &asn_DEF_Member_3, - .memb_constraints = 0, /* Defer constraints checking to the member type */ - .per_constraints = 0, /* PER is not compiled, use -gen-PER */ - .default_value = 0, - .name = "" - }, -}; -static ber_tlv_tag_t asn_DEF_Member_tags_2[] = { - (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) -}; -static asn_SET_OF_specifics_t asn_SPC_Member_specs_2 = { - sizeof(struct Member), - offsetof(struct Member, _asn_ctx), - 0, /* XER encoding is XMLDelimitedItemList */ -}; -static /* Use -fall-defs-global to expose */ -asn_TYPE_descriptor_t asn_DEF_Member_2 = { - "SET OF", - "SET_OF", - SET_OF_free, - SET_OF_print, - SET_OF_constraint, - SET_OF_decode_ber, - SET_OF_encode_der, - SET_OF_decode_xer, - SET_OF_encode_xer, - 0, /* No PER decoder, -gen-PER to enable */ - 0, /* Use generic outmost tag fetcher */ - asn_DEF_Member_tags_2, - sizeof(asn_DEF_Member_tags_2) - /sizeof(asn_DEF_Member_tags_2[0]), /* 1 */ - asn_DEF_Member_tags_2, /* Same as above */ - sizeof(asn_DEF_Member_tags_2) - /sizeof(asn_DEF_Member_tags_2[0]), /* 1 */ - 0, /* No PER visible constraints */ - asn_MBR_Member_2, - 1, /* Single element */ - &asn_SPC_Member_specs_2 /* Additional specs */ -}; - -static asn_TYPE_member_t asn_MBR_SSS_1[] = { - { ATF_POINTER, 0, 0, - .tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), - .tag_mode = 0, - .type = &asn_DEF_Member_2, - .memb_constraints = 0, /* Defer constraints checking to the member type */ - .per_constraints = 0, /* PER is not compiled, use -gen-PER */ - .default_value = 0, - .name = "" - }, -}; -static ber_tlv_tag_t asn_DEF_SSS_tags_1[] = { - (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) -}; -static asn_SET_OF_specifics_t asn_SPC_SSS_specs_1 = { - sizeof(struct SSS), - offsetof(struct SSS, _asn_ctx), - 0, /* XER encoding is XMLDelimitedItemList */ -}; -asn_TYPE_descriptor_t asn_DEF_SSS = { - "SSS", - "SSS", - SEQUENCE_OF_free, - SEQUENCE_OF_print, - SEQUENCE_OF_constraint, - SEQUENCE_OF_decode_ber, - SEQUENCE_OF_encode_der, - SEQUENCE_OF_decode_xer, - SEQUENCE_OF_encode_xer, - 0, /* No PER decoder, -gen-PER to enable */ - 0, /* Use generic outmost tag fetcher */ - asn_DEF_SSS_tags_1, - sizeof(asn_DEF_SSS_tags_1) - /sizeof(asn_DEF_SSS_tags_1[0]), /* 1 */ - asn_DEF_SSS_tags_1, /* Same as above */ - sizeof(asn_DEF_SSS_tags_1) - /sizeof(asn_DEF_SSS_tags_1[0]), /* 1 */ - 0, /* No PER visible constraints */ - asn_MBR_SSS_1, - 1, /* Single element */ - &asn_SPC_SSS_specs_1 /* Additional specs */ -}; - From 9747e679c8cbb43049b95fd332f67676986c734f Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 27 Nov 2005 13:06:56 +0000 Subject: [PATCH 1015/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1015 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 4 ++-- skeletons/INTEGER.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index cbd8a34fd..6a520426c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,10 +1,10 @@ -0.9.20: 2005-Nov-13 +0.9.20: 2005-Nov-27 * SET OF CHOICE, SEQUENCE OF CHOICE and a certain named S/O types are represented differently in XER. THIS IS AN ICOMPATIBLE CHANGE. (Test case 70) (Severity: low; Security impact: low) - * PER implementation has started + * PER implementation has begun * asn1c: Removed -ftypes88 command line option. 0.9.19: 2005-Oct-06 diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index dbb148598..c43ac6387 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -206,7 +206,7 @@ INTEGER_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, (void)td; (void)ilevel; - if(!st && !st->buf) + if(!st || !st->buf) ret = cb("", 8, app_key); else ret = INTEGER__dump(td, st, cb, app_key, 0); @@ -426,7 +426,7 @@ INTEGER_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, (void)ilevel; (void)flags; - if(!st && !st->buf) + if(!st || !st->buf) _ASN_ENCODE_FAILED; er.encoded = INTEGER__dump(td, st, cb, app_key, 1); From 17af7cc374d3fb8fc1a07e97e04ef29dc8a9bbd3 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Nov 2005 06:58:11 +0000 Subject: [PATCH 1016/1469] expanding range: <= 31 bits now git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1016 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/per_support.c | 16 ++++++++++------ skeletons/per_support.h | 2 +- skeletons/tests/check-PER.c | 19 +++++++++++++++++++ 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/skeletons/per_support.c b/skeletons/per_support.c index 506ca780a..9b048f0f4 100644 --- a/skeletons/per_support.c +++ b/skeletons/per_support.c @@ -6,7 +6,7 @@ #include /* - * Extract a small number of bits (<= 24) from the specified PER data pointer. + * Extract a small number of bits (<= 31) from the specified PER data pointer. */ int32_t per_get_few_bits(asn_per_data_t *pd, int nbits) { @@ -16,8 +16,6 @@ per_get_few_bits(asn_per_data_t *pd, int nbits) { if(nbits < 0 || pd->nboff + nbits > pd->nbits) return -1; - if(nbits == 0) - return 0; /* * Normalize position indicator. @@ -34,7 +32,7 @@ per_get_few_bits(asn_per_data_t *pd, int nbits) { * Extract specified number of bits. */ if(off <= 8) - accum = (buf[0]) >> (8 - off); + accum = nbits ? (buf[0]) >> (8 - off) : 0; else if(off <= 16) accum = ((buf[0] << 8) + buf[1]) >> (16 - off); else if(off <= 24) @@ -42,12 +40,18 @@ per_get_few_bits(asn_per_data_t *pd, int nbits) { else if(off <= 31) accum = ((buf[0] << 24) + (buf[1] << 16) + (buf[2] << 8) + (buf[3])) >> (32 - off); - else { + else if(nbits <= 31) { + asn_per_data_t tpd = *pd; + /* Here are we with our 31-bits limit plus 1..7 bits offset. */ + tpd.nboff -= nbits; + accum = per_get_few_bits(&tpd, nbits - 24) << 24; + accum |= per_get_few_bits(&tpd, 24); + } else { pd->nboff -= nbits; /* Oops, revert back */ return -1; } - return (accum & ((1 << nbits) - 1)); + return (accum & (((uint32_t)1 << nbits) - 1)); } /* diff --git a/skeletons/per_support.h b/skeletons/per_support.h index 25c925665..a8f15fbe1 100644 --- a/skeletons/per_support.h +++ b/skeletons/per_support.h @@ -21,7 +21,7 @@ typedef struct asn_per_data_s { } asn_per_data_t; /* - * Extract a small number of bits (<= 24) from the specified PER data pointer. + * Extract a small number of bits (<= 31) from the specified PER data pointer. * This function returns -1 if the specified number of bits could not be * extracted due to EOD or other conditions. */ diff --git a/skeletons/tests/check-PER.c b/skeletons/tests/check-PER.c index 94f5fe428..5fcb1aeeb 100644 --- a/skeletons/tests/check-PER.c +++ b/skeletons/tests/check-PER.c @@ -14,22 +14,27 @@ main() { z = per_get_few_bits(&pos, 32); assert(z == -1); + assert(pos.nbits == sizeof(buf) * 8); z = per_get_few_bits(&pos, 0); assert(z == 0); assert(pos.nboff == 0); + assert(pos.nbits == sizeof(buf) * 8); z = per_get_few_bits(&pos, 1); assert(z == 1); assert(pos.nboff == 1); + assert(pos.nbits == sizeof(buf) * 8); z = per_get_few_bits(&pos, 2); assert(z == 1); assert(pos.nboff == 3); + assert(pos.nbits == sizeof(buf) * 8); z = per_get_few_bits(&pos, 2); assert(z == 2); assert(pos.nboff == 5); + assert(pos.nbits == sizeof(buf) * 8); z = per_get_few_bits(&pos, 3); assert(z == 7); @@ -61,6 +66,20 @@ main() { z = per_get_few_bits(&pos, 24); assert(z == 14443711); + /* Get full 31-bit range */ + pos.buffer = buf; + pos.nboff = 7; + pos.nbits = sizeof(buf) * 8; + z = per_get_few_bits(&pos, 31); + assert(z == 1179384747); + + /* Get a bit shifted range */ + pos.buffer = buf; + pos.nboff = 6; + pos.nbits = sizeof(buf) * 8; + z = per_get_few_bits(&pos, 31); + assert(z == 1663434197); + pos.buffer = buf; pos.nboff = 0; pos.nbits = sizeof(buf) * 8; From a4ee0b50a7b6f559bf30b099d289bbe849c57d59 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Nov 2005 19:12:38 +0000 Subject: [PATCH 1017/1469] proper reacting on nested indefinite length containers git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1017 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/check-xxber.sh | 4 +++- asn1c/unber.c | 8 +++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/asn1c/check-xxber.sh b/asn1c/check-xxber.sh index ea989ec70..a5ebe7971 100755 --- a/asn1c/check-xxber.sh +++ b/asn1c/check-xxber.sh @@ -19,6 +19,8 @@ cat< $ORIG

    1¦ G

    + + EOM ./enber $ORIG | ./unber -p -i 0 - > $TEST 2>&1 @@ -31,7 +33,7 @@ if [ "$diffExitCode" = "0" ]; then fi # Append necessary terminator -echo '' >> $ORIG +echo '' >> $ORIG # Try trancoding again ./enber $ORIG | ./unber -p -i 0 - > $TEST 2>&1 diff --git a/asn1c/unber.c b/asn1c/unber.c index c573cfdb0..217613120 100644 --- a/asn1c/unber.c +++ b/asn1c/unber.c @@ -322,9 +322,10 @@ process_deeper(const char *fname, FILE *fp, asn1c_integer_t *offset, int level, effective_size += t_len + l_len; local_esize += t_len + l_len; - if(expect_eoc && tagbuf[0] == '\0' && tagbuf[1] == '\0') { + if(expect_eoc && !tagbuf[0] && !tagbuf[1]) { /* End of content octets */ - print_TL(1, *offset - 2, level - 1, 1, 2, 0, -1, effective_size); + print_TL(1, *offset - 2, level - 1, 1, 2, 0, -1, + effective_size); return PD_FINISHED; } @@ -350,7 +351,8 @@ process_deeper(const char *fname, FILE *fp, asn1c_integer_t *offset, int level, local_esize += dec; if(tlv_len == -1) { tblen = 0; - if(pdc == PD_FINISHED && limit < 0) + if(pdc == PD_FINISHED + && limit < 0 && !expect_eoc) return pdc; continue; } From e89865b4396e25949a0ddecdfcad5543ad15e2ff Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Nov 2005 19:15:28 +0000 Subject: [PATCH 1018/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1018 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_constr.c | 1 - 1 file changed, 1 deletion(-) diff --git a/libasn1fix/asn1fix_constr.c b/libasn1fix/asn1fix_constr.c index ea2fcf1f6..2c995cc1d 100644 --- a/libasn1fix/asn1fix_constr.c +++ b/libasn1fix/asn1fix_constr.c @@ -335,7 +335,6 @@ asn1f_check_constr_tags_distinct(arg_t *arg) { case ASN_CONSTR_SEQUENCE: case ASN_CONSTR_SET: case ASN_CONSTR_CHOICE: - DEBUG("Checking tags of members of constructed types"); break; default: return 0; From 229ed3cdd0b2942c52d1974aa8eb4cc894f638e5 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 30 Nov 2005 14:10:50 +0000 Subject: [PATCH 1019/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1019 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SEQUENCE.c | 1 + 1 file changed, 1 insertion(+) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index e3dfd1d48..decc56d80 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -1143,6 +1143,7 @@ SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, rv.consumed = 0; rv.code = RC_OK; + FREEMEM(opres); return rv; } From 7d9e582d73f440dc920ed2d1e56bca0cf9a730e1 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 30 Nov 2005 14:53:04 +0000 Subject: [PATCH 1020/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1020 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/webcgi/asn1c.cgi | 274 ++++++++++++++++++++++++++++++++--------- 1 file changed, 219 insertions(+), 55 deletions(-) diff --git a/asn1c/webcgi/asn1c.cgi b/asn1c/webcgi/asn1c.cgi index 3a39df0fa..e7650039f 100755 --- a/asn1c/webcgi/asn1c.cgi +++ b/asn1c/webcgi/asn1c.cgi @@ -35,8 +35,8 @@ $myName = $ENV{SCRIPT_NAME}; # URL of this particular script (without args) $homePath = "" . "Home" - . " >> asn1c" - . " >> Free Online ASN.1 Compiler" + . " → ASN.1" + . " → Online ASN.1 Compiler" . "

    "; ################################################### @@ -49,52 +49,115 @@ $|=1; # Enable AutoFlush (for older versions of Perl) my %binaryDecoders = ( x509 => { order => 1, + shorder => 11, type => 'X.509 Certificate', typeExt => 'X.509 Certificate', + description => 'X.509 in DER (not PEM!)', exe => 'x509dump', cmdopts => '-x', msg => '' }, tap0311 => { order => 2, + shorder => 4, type => TAP3, typeExt => 'GSM TAP3-11 data', + description => 'GSM TAP3-11 binary file', exe => 'tap3dump-11', cmdopts => '-x', msg => '' }, tap0310 => { order => 3, + shorder => 3, type => TAP3, typeExt => 'GSM TAP3-10 data', + description => 'GSM TAP3-10 binary file', exe => 'tap3dump-10', cmdopts => '-x', msg => '' }, tap0309 => { order => 4, + shorder => 2, type => TAP3, typeExt => 'GSM TAP3-09 data', + description => 'GSM TAP3-09 binary file', exe => 'tap3dump-09', cmdopts => '-x', msg => '' }, - mheg5 => { order => 5, + rrcDLCCCH => { order => 5, + shorder => 5, + type => 'RRC DL-CCCH-Message', + typeExt => 'RRC DL-CCCH-Message frame', + description => '3GPP RRC DL-CCCH-Message', + exe => 'rrc-dump', + cmdopts => '-p DL-CCCH-Message', + msg => '' + }, + + rrcULCCCH => { order => 6, + shorder => 6, + type => 'RRC UL-CCCH-Message', + typeExt => 'RRC UL-CCCH-Message frame', + description => '3GPP RRC UL-CCCH-Message', + exe => 'rrc-dump', + cmdopts => '-p UL-CCCH-Message', + msg => '' + }, + + rrcDLDCCH => { order => 7, + shorder => 7, + type => 'RRC DL-DCCH-Message', + typeExt => 'RRC DL-DCCH-Message frame', + description => '3GPP RRC DL-DCCH-Message', + exe => 'rrc-dump', + cmdopts => '-p DL-DCCH-Message', + msg => '' + }, + + rrcULDCCH => { order => 8, + shorder => 8, + type => 'RRC UL-DCCH-Message', + typeExt => 'RRC UL-DCCH-Message frame', + description => '3GPP RRC UL-DCCH-Message', + exe => 'rrc-dump', + cmdopts => '-p UL-DCCH-Message', + msg => '' + }, + + rrcPCCH => { order => 9, + shorder => 9, + type => 'RRC PCCH-Message', + typeExt => 'RRC PCCH-Message frame', + description => '3GPP RRC PCCH-Message', + exe => 'rrc-dump', + cmdopts => '-p PCCH-Message', + msg => '' + }, + + mheg5 => { order => 10, + shorder => 10, type => 'MHEG-5', typeExt => 'ISO MHEG-5 data', + description => 'ISO MHEG-5 stream file', exe => 'mheg5dump', cmdopts => '-x', msg => '' }, - ber => { order => 6, + ber => { order => 11, + shorder => 1, type => BER, typeExt => 'BER encoded data', + description => 'BER/DER/CER binary file', exe => 'unber', cmdopts => '', msg => "\n" } + ); my $redirect = ''; # No redirection by default @@ -193,10 +256,15 @@ sub makeArchive($$) { . "for i in ./*.[ch]; do if [ -L \$i ]; then" . " cp $TMPDIR/skeletons/\$i \$i.-;" . " mv \$i.- \$i;" - . " fi done && tar --dereference --ignore-failed-read --owner nobody --group nobody -zcf +tmp." . $$ . " *.[ch] Makefile* +Compiler.Log *.asn *.asn1" - . " && rm -f ./*.[ch] ./Makefile*" - . " && mv ./+tmp." . $$ . " $archName" - . " || rm -f ./+tmp." . $$); + . " fi done" + . " && find . -name '*.[ch]' -print0" + . " > ./+tmp." . $$ . ".files" + . " && tar --dereference --ignore-failed-read --owner nobody --group nobody -zcf +tmp." . $$ . ".arch --null --files-from +tmp." . $$ . ".files Makefile* +Compiler.Log *.asn *.asn1 *.ber *.cer *.der *.bin *.dat *.mhg *.txt" + . " && (cat ./+tmp.". $$ .".files | xargs -0 rm -f)" + . " && rm -f ./Makefile* ./+tmp.". $$ .".files" + . " && mv ./+tmp." . $$ . ".arch $archName" + . " || rm -f ./+tmp." . $$ . ".*" + ); undef unless -f $archName; } @@ -408,7 +476,7 @@ foreach my $fname (@gotNames) { print LOG "\n"; bark("Too strange filename: \"$fname\""); } - $_ .= '.asn1' unless(/asn[1]{0,1}$/i); + $_ .= '.asn1' unless(/[.](asn[1]?|[bcd]er|bin|dat|mhg|txt)$/i); @gotSafeNames = (@gotSafeNames, $_); print LOG "\t" . $_; } @@ -449,6 +517,8 @@ if($#gotSafeNames >= 0) { my $optEF = param('optEF'); my $optNT = param('optNT'); my $optCN = param('optCN'); + my $optMin = param('optMin'); + my $optNoXER = param('optNoXER'); $options .= " -Wdebug-lexer" if(defined($optDebugL) && $optDebugL eq "on"); $options .= " -E" if(defined($optE) && $optE eq "on"); @@ -478,17 +548,22 @@ if($#gotSafeNames >= 0) { # Unrecognized ASN.1 module format. # Try out several BER decoders. - foreach my $t (sort { $binaryDecoders{$a} cmp $binaryDecoders{$b} } - keys %binaryDecoders) { + foreach my $t (sort { $binaryDecoders{$a}{order} + <=> $binaryDecoders{$b}{order} } keys %binaryDecoders) { next unless ($fType eq 'auto' or $fType eq $t); my %dec = %{$binaryDecoders{$t}}; - my $ec = system("$SUIDHelper $TMPDIR $inChDir $dec{exe} $dec{cmdopts} @gotSafeNames > $TMPDIR/$inChDir/+UNBER.tmp 2>&1"); + $options = $dec{cmdopts}; + $options .= "-m" + if($dec{type} eq 'BER' && $optMin eq "on"); + $options =~ s/-x/-p/g + if($dec{type} ne 'BER' && $optNoXER eq "on"); + my $ec = system("$SUIDHelper $TMPDIR $inChDir $dec{exe} $options @gotSafeNames > $TMPDIR/$inChDir/+UNBER.tmp 2>&1"); next if ($ec != 0 and $t ne $fType and (-s "$TMPDIR/$inChDir/+UNBER.tmp" < 1000)); last unless open(U, "> $TMPDIR/$inChDir/+UNBER"); my $fnames = escapeHTML(join(", ", @gotNames)); print U "\n" . $dec{msg}; open(T, "< $TMPDIR/$inChDir/+UNBER.tmp"); @@ -521,40 +596,80 @@ if(-f $sessionDir . '/lastText') { if(param('resetText')) { unlink $sessionDir . '/lastText'; } else { - $rtt = "
      [refill with sample ASN.1 module text]"; + $rtt = "
    [refill with sample ASN.1 module text]"; } } -$form = - "

    qruo)j&5&5``me=kU+hHJR9xvFT={szOiOcqu>c4bu~?F|g@)s9 z52Q~9D{@b3LP~hilQ*4Ne&{~C7-Kw;jRD-|@P;u#3FgSLL@awCURz@`??&+MILXl4 zbkFP>Qv5J01Bvj)kQKH2Hz52CrbWccpS#uos5lz)%oIa-R-7SgF&xk<6VNQI1=WW=8M|YIKZ|TdAE?3?9IMPmI5IHNb z2NouLQ4(;2gSI%TrLJ4(nZ0tSKCo}7`SSst7o#ue8!(~Zzvveq0sO!eS0b|6H(Rdk z2^dkz%Ndj*iG_@zGEss(@JIhEw3y--p+5eWxnE+;(h@j*n@|tVFwhOUG#e8bbDQ%` zPEpq-GZVBT;hhBbN+=N}d7NVYjsGSBQaUM)Xo?QHUg>`#+ceW;SKB7i)SOBCsHy^N#kq5E7-^{V!z56?Xl%jXwulN!N z|6U1C%;)Z8i&3vV{cU|mm=Fhd29+(h_YvR;ACagYqADe`lWoj^% zziF<0f@1GkUb)&ZT^KQ?D|cqb4D71|TEfECYzc--4HoM#keN4RR7vBn`rA8*2}M^8 z;Zt&M=YYQB`y$>t&~@LhzR(_*eSIy=5EaN{zV)#)1_E|#Gsm^DoumK4i~(WJK%_C_ zzu=9)c*k`?UunUZ12+*_JD4A~p)Q+!?DdAqf9J&e#T@%=AK{*SoCCULAh;$|VCFxp zlXSg#ktoE!O*nw1K>W+%t)WX6dv8WSy1@lBu|Brifg=3L;x|I#5j28$n>_V*F4}x; za%5xB?#_2~gOCi-KHb+(`Tp}`c%OeBcCA8ioHO`POux_5?%)=RpoUUF&<;}RDTMHb za^*Jp+G$*O!eWoWkt1hetMkx{S2wUNtQQ?6wvyr-T&h~I9hy8D6ZE_8`1)XfyDtaW zivOia+5>G?g#Phb#0zANP5GOVD~2Xn@!QY?+0KkUGA!y7b1d4J*fdILQf(*Vdy zXbIkye7z4rv88|9&@xS`?0)UxjcM!GQzCW>#lNQ=vyEqt;i|+Ms#VzVx&mlmvJ-#B z&m1?y7|t5YX-}TWz~&X`VtR9qxnKjTH^>sm@7pN9zSmGcw1%w6ff~Bfk10jq>Oa#b zWz=qwDQ-VRlNs4@d0Nn9?UIe|MUar5IKP*J=58!F=f( znbp-;qicM5%j7NgOJMb_uw{-+d1q1(aNM=}j|})ZP-kNe$5k?R=4J1sFF63yD?mmn z_uJS6B_5f33S_U(qAHys=URyxnY#{|&*8TX)#m=g1>Tp))3gT5v@MYFVO@bf=)F&r zqZaJF5;ym&BSzKXueP=CzTwXnfhuyG>EGIRKi)~A zs&?zbZjF79Q?G0Gu&B6Nr~poC_OL{^X%0RB-0I96iPV=GZkZL=`N8i!-~n*Oc}-#b zn{mg;wk55;F72;od1g* z`2X7cS(#hJ&B1%X|1$|-366uz`X4sIf4clxnN!#;!6h(Q|A%Jqe>?<4jQ^*}pNN$; zCEgNT82I<6k_e2yD9TUbfZQly6c{987iP|%+Ko{CKj`9uup8)zl%k$s+1TVXB&kh^ zBS`>8Wn!9&;N*4l!n8%GVaxvW3^az+KBxRV3PAfNpx<>>$2CXJwYS*|1H2zurJoom zYW$8Sh&d{rflU2>^%9C-IouGGs=NXKn;RX@5KY2^sEL#fB> zW$H0h)D4L`mhzX7Gb5mxvxhA4-p!x1$93m2KVC)(TnsuTOLH3|6AF&auUk)j%$ z&^dMRoG{~C+39#RbbvkcS7868+yf3{xI1*{K!9SW!18OdyeO9N8vdt_-{3JdtNpzL zD-duC?zk5Z)frUA8E&ey5qDzZNnYBAx~kxd>I!0KoLk(lq-F|LG_#!gt!!XvvL$=X zwt-14$s+Mt>y}o(mAGUGNT1^Q;>sN16m{6P9c0lGoMO57rFm1G!;?%pi0{@Ds)9N2Ix))m#pHQk z4zmqwmNW_0rwq$KtF;>88DVL-&0TVCb+u_uI)U75?iG_*4cim_IV%38v`ydPJ;0_% zg<{-u*I*;@xP3i`?_53%kF?3b(}J*&d11tKRNZbaWBJ;7blrAL_9XYK#nBc$89EAVL7TP1>?^LH?M`MMOxVO zK#&l|v9=vYTGJvPGqLfFPT*8CKd>>KUCYq5-czCVtsq^c;--aZ!Q(^izRaMKg?D^? zYM2*yc%_wKGFhXfK`FdiDeCu>^kFVV=`b?gjl7Y6ZOoEp$YEvDSz~7~7yGW%1Fb9! zBtIsKPrWiuSEm;(4jg5&Nls>b!p~nZKQLr|5_nrQ(^i@7Fd2tR$oL zKB;lP|8arc0%7`<=y+N&tK27d@loN?Vd0Ue_olW!t6ev4g@XC_>C$VS?(EpY{aFU1 z?w98s-%1qhInmc%aQahD4^RL%*o@Ct{ty)~VvbiHdl{V+qzbHly*PfI3VWH#chMT{ zAK-Z5jqytj5I%|ydY&?z&Sg(PxaB0a|A+S8YU3MUA&80_$0w?ZZcG39vjIiY|3@YIU`1=QQB13cI2C8*j5Vb*ONOnvg?>+n6&G&uxr%+8>CT@ zyJBP!$I4Ua>=#FNKuQc1g`bz+^61ksFBR@Wv6szruBRK%N%c4Pi!Ow4=nyq(KLAPM zv{S7N=6RibYO7sYQ@~j$e`D3gLq0L9 z53M)c7t9%l-j;nln_KE<{~;Ie0KlSl$`Q9OY)-rtRmr3UodcxF$_?{A=r(I^!2CMKv3q=wSj&LD(1TuSOQ!+eCnd-ObR8$o8``20=M>*n74adT zz9a3J{8Pa1@*SaPd zn1fkL>O@=8L$RBnP2`QjZRxWH@3eAVwi)vT+H%SmLeVZu`UBHfz^j23Ti{ZNjh#a< z@`iPYUP%M|7EjcnU8@CnPc)%j;|7R0Ndp9jz*-3|w&CN&Qf)k&Df0(144#9PV66pA zbdQvqk^Zc8WFFBTqD_X)5W+Smn#NU{58`3emR;y8{@snGmAT}u%~#%;8iE$qUlv!m zw?1yrF!WxD1J}|G{?EsXmcOWUvpP&}@K0BavYsBeFOQn8F7~)w+jSH9N)qCVS-V|^YoutYu`mxm&n zFZQQ_WqS;9BZj__tsj_?T4djrbFr|r%$Q?~YKCB35?V1=Y_TN6k1eSK(>cPCT$<<- zT9f@mhCw@)w)mu1t^=~sn*Q%5I(aIoK>yQ9_1>09PMsy%V>b<+@$oo?>A7S*^o7Rz z5{nc8yx8~J&f>G~G?I2Yf-c!4ADAs?LVmKXK%8&?)}bHqTQ$~{k=a51nl(~;6g2%m z=bkNEfGS@_{kK@Mc$Al2)pmKJ59(X6M$Tr@$;OGcb#b?=q#9lm_aH+|N1ZJ?AmC6B z=@@`!5Ol<*?H;=akBWeffQ(=o%`<0IOT$IQACRCihv7!O45smnxlMgR8QXm#(kX)S zsC9?n1!tEc$LPzhp53<0x2^2dBWG3=+CWo&EO#(GdRS`fJB>CfZlp+c35{A$YtJKzh z)mT)zJ$4aMbP&(ZDxq~%wVc+J@Q+=3CR%3K@MMFFFo=7ic2M76a~EFMjfo?EkVpCRCQeV6grtJz-(~#rFT^ zLTvxdh5kSZD~U?W3Z-0_flEOBZ!V*h;Kz=ZBJK>1n9#INN*vPE^fk6E?A!1K<1*b)2{a-UA;Qz{{I2!`Wf&aGPO!!eLLB;w%e#rk{zQp#Q z)at(;Np?2Y|5zlu)Pc?kk8Qy0XS4X`_(b9OkQa(hsfAyFB0oTpe=#}r(0nz$z;dqn zJPKXqkS(UyAqyHL0}h_V3{<`D^%z`)#veDyb-RNnDfk&7|)8z6dUL{ z|0%DWXE}qRiQAjdk>`!;=U0A#?wNaUfgQW}XKEs_g8|?#ed5inloM#gO_}%|MY{`v z)r0maO$?}B5-``1_OFdM-_GMr957n}KZBR%?Wyx4y4NRsFvtl>ff~v*_4n=P0Rb>3 zyMo6hKC;yMz;DJq)jFpq;1ShJ!nd z#k!X#ZDlQXwa30`GuJcoPF?DD&mK%ecqow8f&OVf;RUVR?>LPpLEmb1rOo$>=&%{( zDlqVduJdP2A0Y@nst*!NBF0fONN<4t&{r7)>&3TR03@bgIEnozB?b0TTU*clTj za6CIdgB*YLqzctkhq#=Dm9jk7C*1^h8$dt<8DNEAQf(~Q?j=3f^9sT$yDX&rdR&Mm5!DtX5sXy#Mmb&KRx&i33Zs zj(&Vl7=+ByHJkOM@Kr%ALN5t%r<^YGDnfy)2jS(dLi3!ET~kgH_>b(uzEBquSLqJo za3a(w>0bA1yadTxL$PyA_r0!$TqYVYK7qDcb6D{DNfQrQU*JCofU%fmCVkUbX<$yM z3Hra3af3c5t+@GLD>LX#eps`1XahfK-^q9;zoPFQE86TFwOY|ya(H@Yb}{etj@ACD za@{YOZUpNjtz- zq{R(hHz@MP?H@H|4pu{zXA0$!$awMnge@mHr(q`qiFeRDrR{f>5n`QqCa}O)xZ8BW zt1`>x%32+M)iB938xu$w{^Iw8jP?%K<$q!H6>|1 zZD7R)kHuG37@iZg(Oaij4p5+U2G0D-bpb+caT(Qt8p};AY1lve4;ulo+eqUzn{qBh z40sT+f>UMh-rzC;F7gyfIod>AsbLCfd(5Las#Q|+)3o^@$aMq)9l&sv+=2ENH<9`) z{BWHcGtJdm=|XVGlODL5)uXE0!Gju7-TF&rbF-{AJhgwY2@9jg5ST<7@u;`m@)_90 z7Rk>fRmQYEEXuMZIeTF{Ugr=k!z-wL?}*uE;yTQYzKK0So_CzRA*K{#8UF&6Vwi|~ zki8hfX@Fppb-HKo@FzyX5a8@wd}+`z{gWnU?W)`bm1+dy(cd$Ax!uO?@Z{TiW(>#? zU$TJ@3^jKeG0|3x1d=fpv7xKA$lTK^SKl`ga}g?S-H%0OW6d+HDDy|6hg74StGHj! z2i4oWisFQ4kBU0tl2{aUsc(pM5{p0GCVGGe6MHpWNc+G$*Waz?)FhHokOi!KFqNbl}!iG^Akp1<)i#USE0&Z}JB0mqZlwM5=4thlS zYOiY95jW{|*q@W4#iT|6P!c;V#DC+CDHOP}YE!FOo~|cW%q@wiMckhyqK*Bjj0e-& zma6TIkZ(bW;bKros9S}&W0kodIQ3OxzNj3xZUWXiaw1%_YWrJ44cShwP8+24aEQ$6!LKH@NXZZ;Y^@5Gx_~ zTXtf+Htzo4<6QZ~n=ebmod?>E;JHap#35l5HDBkXB91%?j1A zDge}6g8+Jxf;qN~6e=gcP`d1$?>Nq{&A`lj@a+$m$B^YcHr6O!r3#b(+0n;&a0OWV z_*!-X<|W@MR=j$b4)GEMw9mRro~tw*Yi?o?J_=ohrp?IT&FHBog18yJ*f7l!p=iyP z_9x|xs5AO3Ko;I*<}8|3L%dH;nqj`rdPr`8wvpT7bu91Y%Uo7Z z(HH#}xCe3NIA2JY{@|zweOe&92d0yK8M%94aBiK{3GFevbyt)S{30e_C+O30Q&Oc9~5oi zN43UR)sbmC=Vq7)C}zZUs$LF89i?`}2&2BRN9RaUvQU>DccmA{`FJj}DML4EYxK{a z;1O(R8neklOH5A(!#mzRTbG1H?Pos;fEYinus!9Q7Kjnii#QX^LGWlgu6vhF^}aYw zm=+MQrE1-BUpWAxVmQKsm`E?#_@DrGh}6sFP}F)0#bvc%-s=S8sma<^<1yNsCRDBV zy_tkgF}ylU{TAwqr7us3ddf)+_}cU1qWWhDDA_VoJ*8Y@5mzfRne?58axro-!mx^N zuES|Wvt+f3_V;75X77Q)Q7)x5-%(v}5ja3R94=pLyl2nWcbUa(RE4gvOC14@vSLTB zar-cY1(>7z1W=7K=!FmARl0UmF3?|`(MY^*|L{6IFYfv1pW`5u@(uNHXtrCM?Q{0B zaie*kX54;1N%>Qt{r$mXhaMK}_2s0X?BaD@!b$$F;mZ4d_LQ{Rc7KHqjeuWHr>CGjI|q3MGqjQSlMlxus*5k&_cSrNHxVurAZ=SbCWYSXe=b zLHuz&P38@?B0EAAplkS zpO(bD@tz%i8Hl`Ccq2tDXTstB-Xl`rHu>H;w#Pv0g?=mDt+e+A$LeSaExfwi$QVD1 zUWFGz5bCFLcgB(O%KppJN_80*PB)26f$xmsU(5UtNFS&(Z`KzDK7eqlJmXfRP@40+ zC`IU1UZ^&9)zU{kKjsOXFDXiyV1E0f!3SC4D0Q=wPl}`bV8pi24HZHjgni;iCfEuj)0ss-rr!!gB`$jFSc|^nv6qZQ7%#m?E(CX z>U`azGMd`BOVl0nP{+tM3Jc> zFzEiU6N_SrYA*vI#%a{`hw3q$b%3~A0o8Dm6W5&_d2L_5J)hqKJu`N?wmx=OJkOa< zGoRV_+dmD0{z9>n0>mh%GMT*2ucyD!J>^M);J{ zHkiVb`av&S%Gc_=LpSjt)SyNI;zU+=&HbP;Js*v2+`Kz!tO9!+=aXY5iCiDd#)Oio z%pOS0<&AhCv5IhxXERzV*7ACNbl8c>Is8&0DgaWi;>^9&D-OoWcAk1l|wsb*zk7*2XAX~$GO`>d{ z5EpV;Cp^9oVjg`ddYw7tqVg#UGB?U|riEuu-l^ej~fR6#;($2(hkKz88y zaly)*XCvlIPJk&1ZKh73$d*hle(;-UW9K_|VpPQ3=Lr*y|L>LD>MNbC_uUH^HURKa z+-vvU4n(vjlhL7f#vkj>hBvH@U?%T|cx5X_u?VMl%E4nOb3Tv=?%ZI!eOK#y??nv;UmBY19(|IqpXpO>%fI>>iL0n&jTF%svq4NShY zcoKp>w9Y8c_{=$45PRlvE2Qd3xqBBvT$oJq5Dzr)Nk+MVw zT>E#-qB+u}QnnPSWk3OB3_DYaNb1m9s{lbr%HGJ0=LdllX@MlZh9pK@O+a`Ov)aB7l;sJ+8K;D zxN#%I0#DdiGHUw){Xzakphp5fheRtyc|XQoAKEFuU0keuUN%xDpeQiwgWYd!)NLrT zDKRfeR#{BJT$09m z!Qu+onD(9d3YGyuIW@E{5oMv~HuSU^V9#=5m(GZ}~hg!DAl7xVmroJK8zmBAFg5*sP&r{K@}~Rg+>*XeOiOo zz~B0zf9GU=;r%X5hPD;?q@>F_@)PdPFP}oMth983qD^x811z=dKWH`>I4`H!%2!A9 znPtyMxQd&zYL}(-RAlAieC<<5lfz?Nq1e=15tl2qBi%o&i#oM=(l^QQ8B>d~nxbtg zUs}nsCe1s8jjky7heTYaNZ&tP4qBSUVPgRsh(~{Pv2hneL}rO*r9nOT1yylSeai}A zQ?4&&zg~{L5A<&{7uD&YJu3&umsZ+|44kcJ{VtgwJ#m?>tNatRMmTwrGN-^GBQ{bm z`a1HC@_9}0n|8&;7wRw>g*2R2pG`m6Y>{Gg}-{DCg^XPF}|3PO#pIBW0=Bt7?2I5BNCYTWi|T36TG!5top zAIVE{P+b~;Vf7SG&5Hv2F$l`P&<)g22N}2woUfKvpZHGs#;_gyL%1=3PA<7+gHcS-9Sg}cHRvObsL|PYKOc-Dtx{2XE_f@R(&C_tKz{Ru!qptxBP(i^+PA&{!w1N}5kkGb zweT1|O%PJRr;1oY-#>O7TCV|k4ByvWcwN~8pMLA5{h)|%a)jq^H%{$WJBQY@6fSK5 zkWFn2ulluT-~JMSM{u*__H>^uW^n6JS*Jr!Y0 z1cavm*gw>N4I(j$9Gcv+a2*;SV~YWee$M~$l)JdYoCHOF8a@1#c}HPbR<%SR$lIjE zV^5%@8eF|(NR;NXIO5pL(=^#6zRgpKPSPv5Bi7+sO9d#o2XX2dBaHBj>U%_Kf%i}4 zSNYXO<`Y=Lia>OFh7*|^kh#KE0TlaD4i*z*?F$jvwXqz*!`kgl1dHMlY#4w@(SpS) zY*5iHdog^iA~>DU*E`{el0RIff86>8FK^9LZ$?e~zo#HK<>kt!PQpR8!lp3Figzjt zlrcMm*1NB$1nfY^Uj~Z>L%xC}Yl&to4cfL;2>2*iXQJ%5tFV*ehRfQV>=-U;DPEWX zKxwGB=-ybtKY|))uFNp*$OAz1_dzu@*GvxY=z3%MRR8VYFA`EjxQH}6Ho>yR3LtX% zf}d$A?)4v^WBIb1Gaed=W`O2wexIvN6}Oa0MdLVvCa2XHjsOv%uo2PUVTuq?O}UvG zG0#HHhbFQzrf*6jl(xMdoMAg#WG1%pVzlS-jqf7s1J)3fYk^0im-ImR>Z2-1&tc_W z3%Q|1I*Gb%#VN2>wO13-na>}s*oKkhM0kv<0^`wuww zj^Xrxsh=z*yHY~pIQ7miyAQNEUWz~JH=>|o!u%yyQ}v8d=k5w}aqRZS;T-d&=kamU@Q2e45m_seL}IPCI50K=W`_t#5m30w82e`?3fB zhcOA-ZRwj*REihydn$L~zAoMvP-kgKF&ALUM*pv3K|JNst5E09q!hiEtV%T>hu;KL zD#vylp(}WKzS<_$JHEH_XA&lKV55z(9uVYtmvec+&g^_4ZCgOE61#9aE?Z)69D!wz zj(dhcQ0!I#H3vIa$cQ;07}!+7z|4BF-?>3Ok-=a7AJ}bq((T$X9Ek5(1ykh0~*qQFy!eR$|gXvW44)pE=zpvKR zDJp0e@y{P@q^vl~lqPhNI)D3YVfKZ*+jk{f%*%jB>HuKlZsE@Y3?qM#ZPl+4oxhXz zkX)K0A(BPRA<*KF!VX7tdkTO}5ivDA`s2YbDL{Xe@+EU$;x>*M%hm55F7|u)TD?WH zS9)4r-Qp9&j1B|4O_;Uvip5&Q6aI+qHr00PvDN|UB-AJEc_9taMj_bm`HDd1G$EIa z`vA=^NaB$5C+0Vtto}a2Ud!whcD#pi^?ZB4mvk@DtPDWnQNJLX#u^RIJ{uW6Dvp;C zeYa)5VvICn+Y3>Tgmxc}94gkTU|GBS681E0u)X}`3(H!Z6_6`3_n^7(!&fQ4>{l$a z0y}V_%Og5j1V^Z5fu1RCiXw|&pT%j^8uJ2DP+e)Us7tHlKHc-&qMgWovVz@ls9K|x z^Y0&03bHQ|HAtUUAV}M$Wc(ZkvJF z@^aci#*4C#BWsA9K!jXMVYTY%H59LtQ`z-_4sLcubUD=-xrOa2opg_njOYD{lvs!! zL<6_^@3j=C0tSlcf_WquImqJdz61*ok!(7Kc3OiAAwj+)f{T9$HCAJP!M8g$Z*$)4@eS`#9OoR2wWfj$!w{0D#2B&A~jvw zQeB=F7}%jZ7k__A<8t3lmVPgkLQ`oLM<}xJq0ui4u&@MUJt_wK3(_eM zkzmGJgpjN#n?Tnam%rs!{At3%<4`Kt zL#A30d9rHisi*2`(Z`f$6{q8*&AC|)<@1kZ+5IWYI-QPBML!$w7aS#fGXxoN1L+MfP(K4i$CJ#po{^*v z-ZNoUVXbW!Sj->xr|};feK5s1W`P84)^@)z`C_g8<~s0Xa1&Eqq14~?PthojS6~qU zH=&E|v7@2B_UvhxxbfBKR95xJ7`Fe(F*!D7>jxR-$2@51FJ?^xc3{osXMq5g3s#Vc z#xTlAH*ZiB;8*sP&kF#iT1r*AlRu!c1wI^;LQifnx9d#|zYPED6ncT! z4xr5WXnOdpmfANj-%XqA@x)`rEw0RUTB({nj|gzmOV&;5PDsvi2epy9&%0h|sWYpt zdna?VNxi*CgeyCoZl#h);t+~c=jWr6 zpI4(C>W`-er;(8z3bHkXJl5nYb3AHj|Wrh$L z5LmHB8nW(502Xiuc-?4&C9R*t#sU0r13~&Ny_W1EWk1tRYSZ<>LirJXst~Hop&6(^ z3<+A9EfyvrbKV2Ve3k4i8#e}*_60|>L>M_k2KVKM=v36W72EK8$v6@2RF!;(=x}A~ z(I$9dJ}BS9I-;*C?Z%uRoE2w@W5@_At3|-Y8&p z87DmD`P`xh+Z_w!hnB(0P9I{oLHSFrZ5tUU-!G~af@N=| zH+T$W=x!DUa6;h5XJz2WSG6&m>xZumfF}Xvns-)9k7UtD`P3P3GozJXYxC223^+yT-*S>p@(saYUZ&uGU};3sdpC#ZTRW zx$&nbrSxspq}Ug4d798f9LK0?Kbn!#2k7Q-R$#HV-3Y@dE3`~TuSUqv@#|>br@vg4 zaBTyY88ny{^dZ{TEN6gBXifNhM`j8(a!$53NxOh3x4Jg479!1Hd?h$cT{_ z6RIi&3yv&HBhB~^&T@CKJBWWjhfF(f9p3e?yoUk3o^N+u!kzPK39X`rt&^gff5%2E zg+L}fsbhqyHHI!y{3No|m5#F&-}^xjea`^nZn?4^)%(?bE@gtCLgT1^vG^zbFn}U{ zqQb{Bz}q!@hPgv~{qOXta~5)js_t#0F~KMRNsWSF_?OWrjwx420apYm-T(lKz|<;G z)UKFJ>V&g#R)S{M51S#SmA9D#BP}7CWLto40hy+wk%bM zs#jB+u!t z>QHoQcMX+r>LxLAfNYS6a$@L4lF4Mhn$-l1=uo;1p2!5*j!(S1jTbNEUCRmrk=cSN z8&GMkyr>iusX-EoNYVZL<;3w2^-ZImIsCf3Ri z0B|j(mkbrJaSSK!u~^eeQR#YM|FKvl)=Vat8cU8tNcAS2L>|~#{wC5R{1Var#yOqB z>t;*d_N^26{3y~wJCv#P&q4FD6GF|0Twq_2i)5FPb*?I!W|^uV1PcGdJeo7XsF$Ru zh4i8>7v`y8$RJ$SpQ_YSRW|FXqd8zpku3)i=V@YPor2?p8{en4MKAw|pJZVj+*_ychCP5FGM)1hOnYK+ zpWBq1b*(-OWD{!t3+PJ1@gzzcU`WKf%{J25E1c%-8#y8!&YuyCkP$D!U#Qf^m6IOC zXUmUN|0eQ_MnYigQu=TpFKky#H_K_ct=z(R(EZ{Wp!B5d+#KuoaXq@wT z{VUN*O|cm9o!R=gD=nQr9iFN@R9X7c%=9Izm?J(ZkK44j8SrRu&Il_;DT9R(21j#1 zjzNPYiJ*YDfzT&^kP_BdYr6I2F3Y2@ZA!vUzN$IwsD4g>H-0~+1|mD^`pfSN*;)c) zTwKXnyPO{dJ`~Oc(ooLb&^_GNp#IEtJFg*BvdcEz)(wUH#FLVo5*F>!VbgAGT>AN; zS<(60S>+e9Gq97HYb+-|%f>nA;>U|(1nmkT3xZ%CotgaA!d?^s_yB{e4J)gE4{gc$ zFLsT)v|CAu1~-D~#ug}99~$q{+z>D+}l zntb^YV)p4E?i4`U%z=NxFNJ@1nCml9iBo)9YJ;SWg@6vfP?3ZTT!eh=fN=qn+gdm;LA>G{# zQi6Qrz4w3r-%r1_zO&Y>dFPpTpS|C`_c?2wc=ndj)d5V58+dzSs)aVC88W=bxn&b? zP?@bgD0-C$n(JdPd0_}LRF^6?1Nloq>$vHXnm^E7wXNw>)Y;x(eL{-;(3q9A=}l$S z!mrJ*UOD&EHkXi$EkTnX^Q`!m_5pvBvkO+FjZw#bV@RXQb|YaaU?bp3&bf1Gkba+| z_Ac9G{wh#4ZHMV|#VhtWK$?=Y7kKNl_-hoXzqzH$MLB3Q#6z!PCv;jADtYbMFlGDZ zl7e9K4D&Mgd9Z{gP4e)K*Eump!<}fZjt0I6(bI=v>Uy1?c%!RGc()|jwTCA) zFK+P*4?~Od-Z!EvCbG5>*TK^7gOP*j-_>EdgO84wgo61iz(gRFzQ@0&Jm(pDhTCKzsH%aRpd-?iG+|akpDM`)sLr$>PE> z?oMCKX2*wvm5Hb|@9C(L*$v~iVF^0C>w%@$X6T7!cvGdKqDuP^nLo{!Rj4pLvX*PF zY@GFx)FgJ5Z4@1a2xXlfp{JZRidmUcRR*P<_WfQDzAIYUtp};AC#O(D>CmAkGI79G zI;{~Ec%n8yV4+8o!YQa4%gcMH`(>yst>a_ej%J^PfA-jT-fp26J6}tP7k+i4TUv~# zQS1D&p`lAz??>AG?vLF9oIcj7CU4`L*zC!hdT$8~MSh#d=dvKymEpUa!N$gxI4aO2 z^}LAa#DHc=SzGxLb5XMr*O-s=n+!pq_f;iP)&dWWo+YygdGyhj!RNA8MJb|373biE zvZ*8rSGk4gI_)0+2TVLv&(pfa(=k(J4NQZlSlikruq{$+VAAu0_(f-%)-HA%Ve(VI zFl^Wsqo=XY=qD)O_JN%!FUrsSf#Y`Wshldg?1%mmsz#e_Y$CJnRVv-v#FHT)cSm*o z)}aVA_$^E{xhidPUU)Mj&a0NJC49>$6b8OutnV1H_c4(7du)Wp%i9Ji)ca4H6Zj7< z&X_C&@jG1Dy$Zo640rGFj_E$2O}YN9C>4Y4;W0)Btyv;LUU7P+Q2p>GkiAgVJ#DT# zn>D#3gR5=KSF16rucuNUm!>HLdS8z-j2THrYkF&#u3}i5a|G6dIm#0V!-@>fd+fj7 zp9XvuztnaQB7Vazrgz@b!Va5}W!LEt5LP9@-2Q?6QldYN}x;nbV%wON@r!y$WCC)wirY4=>w9lf|v=>?FC#ZK(FmJvII z6LDtU8j+!KT4MIx-qXNFuhB(nSr0zuf21N#v($C9qk>DokY|k~J?D-45V~%{ z$RI0328X8$EkP^_>u;2hM$BHWMboBl*v~0NgHN}6t#*)}MS5MwAu3bMcHQ=5P8e+S zFr-KdT78>BRl|Z{!Q$S7v== zoLaQ5A;7(}fo6B2V~)kp_2>I}PZGbC@htFjM2{l;ilK$Pbmn?$B2^9L$YUi3{Sgi{h;yy1P4jC6Y~4M8alo(w&Dh(uFl32gaNt_k zq;QR=_Y2coPT`b%|m-JYqC3Z2dC>bpaTSmjEwo-)*st z97N(hjmM)~@w1QQ{Ik_J?(|cMcSsRj? zGj{Yi{-9;?GZT@>n}vh?s18bZy;+v#4?EX8x_vmxM zD1Lv%>SsWe&eLUA&w6b}eb3QN)Q`A_->LjVE*}f5raOpKE}u;(jAvzu(?PbF$0Ezo z8WSGbmlZvN%umwFQZ2Y#j7XIe9AAK=u*bn#&6C2S%o*$}1XFnFDEo-<7qJ6fF4|G= zRHzI{9aLnIdDFL>x9&TewMKoCILohcc%)QPBM}euNO;3JoUoGS0eGM9gmj5!dYkWD ze*cCIsY`u5{!_H!6c97u^RD>Sar*SYLF3W%3T%Hd0uAmDd*C}Wz=iesQf$MLoD**? z`K~gbfm0kj;U5*(>!r7j!k#ICU-l4)7j2~8OK^0`V=#R!!YUy{F4l7;c{{Y<($N8g8Q zCT&aA_stZuN5Q2%ryJyMt0ki#Yj@3cd!Z#{Ec7F^h-9w}o7#BAr;+~ML|9Fby(%Yk zw%>*8OOT!&+H9`Ni*tu~#Y8}vGiV-dUUDW2TpW)MQr4W<=ld^4cF%YD?m=v|{n+-4 z;&wDwD#=UlgLl=lSX$FPITd)~X2r(+L-u@VUz?0{Mn|{Ulis{Ek#+-TQ4Od^ueue@ z^iH~a;P};nH$S*XYpZJ62eURVgGC6WCZ#h+cZP!_8>=y_oqX91n5g{Mv~AlTHOImM zXUgL@-M9EitvNVD%SU+!yqlkYB-SySx#magk@a97LlF~7PH(wA!1a@=h2X_-md>cH zt}nbk;NfAvQHNz8{8xa@M8;%Tx7S4=ulsR4Bct0$Zc5zG_ZyG+~o8qM}_d6<_Vb0kp7W9D8x1u4QS8+z(* zv0uQb{6^d&ui5T1*h7H*rg<+ZLXH^Gn0b@kArM;$LT9=;&>H)C6Ob5}=D(AdGnrH_ ziM-t~eN*CS{KZydu~@xn^JnW4V7K%rMm4)@>`30@{)p48(9Wl>ZQovv)ogKmG3*1u z`J=9DOSdc-vmiODf;mb>_9ul{)d%8g^;DJOBDTk8-< zE$q!jq=F9Qpp6%z9@7&=tMi7G9i@!@BpI4kEtI+CK*pprH@zg|r2rW<0ot5n0+O+W z-fs!7IgrGmJf0O83u{sZ8+1DGV`mNuF9(CpQfOkn32f_L%zW*s+`+)T4-L&LG<-)% z6u4jgy6);{)$B-62ijM)FywnB7bGy!z<_U~2rnLcwE5n3t3~up8WZw4YMi?q)sUpu zxv4(s#&Avial!Bc?jcsqLjbZ)6J*?{>1(xdY+n{WC*<6G0T1{V8-{1IpkbV3i+65F z+-e{R5R}>u8+vo?Yh)K(4ks&|2aW|Zp3XmZft}Q(?hiF#24@%U?Ug!r$v{ZyQ>&wSv*Ei|A?wavcQSr^8a#O?FL?LGq! z$xF33?RVdMqETW-FnM1XDzES}I-yqr9nWc1bwQfKZnm33zQV@+ks(doY%P*4sdp>& zxDc%s;PY`Vo*aLO{H6K$fQrnHg`h4nEh2W>BvrC$B$k(N1Gr#Qe=dAmqqZT&YVh3( zLh|k8!YyZsw;XH`#k^(q;P7VFgg}_h?N9l!XIQ33(PI&q+oE*+T;pJ;+>Ya|PGUA4 zX^$7RE58s{M8q5njkAXtooTO7KO(w)y)5g`aIJMFw=X-M+?_hv=l))(9xC8hYjz&? zHUPjj6YZ6J8VAhVrqmNiZisU`HegbW3}GJnZ>N$o1~%Y%<0-?18=t~d{ZHX%_txTS zfBI&cwFOf#?3W@n(3#B;119i51-WSJ#`P@X3Qq9n{BH%HH@L-R-*+MNz7x=TtP7fr z6b-D0=`IueiA*|9jB;RvGJz{u7Gc)pX^7W<~d{|t%Wao?372| zpZey;Wo=R#e4o1H{J}lOe^%+fm|1K7dXYL4dPto&ZmVcYqizk-WRbhaqRlI0lEs+X z4EkuD8(Z+`s{vZ;?(sD5o$lcr|Lu8Iy@>tJU%?d5nmQBG%Gr>niC`?N!B%J8?r^7C z`xEl+x7EN-;Y+#$^ABDf;TQX&?e`_!5+90>-`iekmoMU|_w3lz0N?4Zbfd8s0lB0=kC=&Vz&kA^E;g~Oln(&bKwUgR;=+WQU`zNHKjtTvX%W_2 zZ~dw3>4P-!VlfIq__UU^J^?opxdw^A#th(>nrH6x@pfi{;4~dy3k6Z@UIvNsC%Eeu?|ed!bpM}6DZ2qftZ8Vsom%O^#|?v|c6-Yq znmsw+HQ#pC6NDbG&9ACGA0#m@FC>>VoP8T`u_`|(S95B=F0UvOL-Sovo!F?mMX*&I zXo^wtj8p4#GW;-jtu-wE_F&3@sE!`<)2*j!&>cbKaPo$-M%D8nsVC)@6cgVZN}rTD zmhH-jI)>`Qzv-Kco96H)p=bx29ONgLF=M?Pc|xRx(}V#LT3I8$-f1N79iE)E-s9QM4dCU7$+;mhit1`O z8df}1H51SMoU3G?BVNy;vTky=T2{0+$NV5SESP7OcTrI@Q&DVB4Y^G( zAT=INMoII^qa9wO?S{J{PEnm1F6zA&?70s5w&{b}4p;o&G;Zj*SS?YfYLn=(puC8| zC&Ar`Zv%)Qu7k(5V!1^}9oSY1(7;V`;s(}e1pO8gqNZsBmuX_F-k}1Y4dYi|6`o+O zwtc@kG1nS>)pc(lD!&}mPnMsuearyBJxs&{eY)F@nb9nU901x^+ehAKmCx@fX>ZWQ zhabR>*q-@$tbfQ(jpx#7LRcF%`&5Tii6-Z*Q4rY*#CI>DD+?fFK9xEK=uQ>#;@^Z4 zmC7m=wMJdoNR{QC~IqujPk6P-T?R=aJMLdtHpF%YkNzppIiv>`X}m8v5= zujuqw^N>#rs6?J673m?m*YOm%T2#uha&!s6eNaWO{^*iiXUrAgD6#^^;&DjFZ~ zYbmE?2W0ZDA+SMbp=o`;S}+a%UDgNIr@NZSVa9^d=Z$t@)%xaxMFV14wbH(FI(eHz z#RG3)Q}$k?;n>eWR7|p4E?ur*H!3COvD@q2BL5F54oMX;j)~hbB0P+fR5y<#D?^NC zK*T95_zdi~7wYCc+4Y5acc0u8{`8boE1FJI^qsMf<07L<)M1`#a{uAg^||lU;q<`1 z{Fy&xEe-jV#kIY0pAS1_>coN5RZ)Pdz5Y# zSTmwPt^AY(o{(ON7?U_XIT7a}GMc!wr)UN61pVCW0jmwdt0jizi#af)G;i7% zZ&hA?_*awJfbkq=x9>%Z7s)ost_h&uyL-`Lv|M_Pg#HEnCDX15;Dla2)Ry&;7J25m z$j=3KvLyo_)#GWs*{K8Nx85;3)%j_s;UWd8;n3GjDP=83k}EN8k>zO1v#Bxrr#|kT zZUTNRx>UIdJjY*s=ITm4({jg)v3Q;!eYJ`>NnyzX%TeFdI_sLg)*dvbdysP2ZR@ zO%GHmpAR$R(>Jx}@r+M7r+-kudsXOg0rm#YflFr-r^!%B_RR?o-_1#vWu?l>UmG1q zSL-kUWD!LLj-45W`?gUo=k+!g$SEvNGC3r#*x0Aj-q=cmd|maNn%}3mr}C=nW|ZUS zkf;PlSa3p6t%^p#{1N4un?{L?V6wWq>+}rwKwIZ=uFb0h-d%qR-WBB3)8Yi3T?A0M zKtos+BBhC7O&ruEYvJ|(V2J!CUi@Z=K%fXH;=c@$|7mdi?_S0@st8$P zD=$caKt|_*f?^^$ALs!E{5Oq5o#lVI`EX?7Q$7$k5ef=r!F>|n@qvW#e-EbkKuG3) zp(yn4e{fBW|NZ@Yj6fj&H5A?@WkM|#~Re~Uf+wk9( z;Rq)G!#6=Dt_b4VBg0XN0TG}F*P(EjP-0I62v-N}_h>HyWQYexC#t>xF@oTUjxRv> z00hqN-y6#l7Vy6YLbw6}II7D(F(e#k;~y9TiAMc_L7-41u13K>WZ_7-(4Vq6=R$CG z32+4v0Drg; z28AR4j38 zk_C<)h?!H~k1 t<`!lUQy9$ZKKTDXg~gDC4tK(Gbu)Ew^K!AY0>hCgG#t#yDXS_6{y*}6joJVJ delta 94940 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¬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

    " -. "
     " -. "Pick the ASN.1 module or binary encoded data file:\n" -. "
    " -. "" -. "" -. "" -. "
     " -. "Or paste the ASN.1 text into the following area:$rtt\n" -. "
    " -. "\n" -. "
    \n" -. "These options may be used to control the compiler's behavior:
    \n" -. " Debug lexer (-Wdebug-lexer)
    \n" -. " Just parse and dump (do not verify) (-E)
    \n" -. " Parse, verify validity, and dump (-E -F)
    \n" -. " Use native machine types (e.g. double instead of REAL_t) (-fnative-types)
    \n" -. " Prevent name clashes in compiled output (-fcompound-names)
    \n" -. "... the command line ASN.1 compiler, asn1c, supports many other parameters." -. "" -. "
    " -. "" -. " (What is ASN.1?)" -. "
    "; +$form .= << "EOM"; + + + +
    +
    +These options may be used to control the compiler's behavior:
    + Debug lexer (-Wdebug-lexer)
    + Just parse and dump (do not verify) (-E)
    + Parse, verify validity, and dump (-E -F)
    + Use native machine types (e.g. double instead of REAL_t) (-fnative-types)
    + Prevent name clashes in compiled output (-fcompound-names)
    +... the command line ASN.1 compiler, asn1c, supports many other parameters. +
    +
    + + +
    +
    + Generate terser output while still preserving BER encoding information (BER decoder specific, -m)
    + Generate simple text dump instead of XER (no effect on BER decoder)
    +
    +
    + +
    + + +EOM +; # # Gather previous transactions to generate the history page. @@ -834,7 +965,7 @@ if($EnvironmentSetOK != 1 && $TMPDIR ne "/") { system("rm -rf $TMPDIR/ >/dev/null 2>&1"); } -print< Free Online ASN.1 Compiler @@ -857,10 +988,43 @@ $redirect TD#inputbox { border-right: dashed 1px rgb(200, 200, 200); } - TD#extrasmall { + DIV { + font-size: 10pt; + font-family: sans-serif; + } + DIV#extrasmall { + font-size: 7pt; + font-family: sans-serif; + } + DIV.options { + font-size: 7pt; + font-family: sans-serif; + padding-left: 1em; + margin-left: 1em; + } + DIV.options#options-bin { + visibility: hidden; + position: fixed; + } + DIV.optsbar#optsbar-lite { font-size: 7pt; } + DIV.optsbar { font-size: 8pt; font-family: sans-serif; + padding: 4pt; + border-left: dashed 1px rgb(200, 200, 200); } + + DIV#arrow { + float: left; + color: rgb(160,160,160); + } + + DIV#aarr { + display: block; + margin-left: 1em; + padding-left: 2pt; + } + A#modrefs { color: #606060; text-decoration: none; From 68a24641e44f346851add8c567ce221de8767126 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 30 Nov 2005 16:31:56 +0000 Subject: [PATCH 1021/1469] autoselectability git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1021 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/webcgi/asn1c.cgi | 99 +++++++++++++++++++++++++----------------- 1 file changed, 58 insertions(+), 41 deletions(-) diff --git a/asn1c/webcgi/asn1c.cgi b/asn1c/webcgi/asn1c.cgi index e7650039f..c5332d054 100755 --- a/asn1c/webcgi/asn1c.cgi +++ b/asn1c/webcgi/asn1c.cgi @@ -49,7 +49,7 @@ $|=1; # Enable AutoFlush (for older versions of Perl) my %binaryDecoders = ( x509 => { order => 1, - shorder => 11, + shorder => 6, type => 'X.509 Certificate', typeExt => 'X.509 Certificate', description => 'X.509 in DER (not PEM!)', @@ -88,74 +88,74 @@ my %binaryDecoders = ( msg => '' }, - rrcDLCCCH => { order => 5, + mheg5 => { order => 5, shorder => 5, + type => 'MHEG-5', + typeExt => 'ISO MHEG-5 data', + description => 'ISO MHEG-5 stream file', + exe => 'mheg5dump', + cmdopts => '-x', + msg => '' + }, + + ber => { order => 6, + shorder => 1, + type => BER, + typeExt => 'BER encoded data', + description => 'BER/DER/CER binary file', + exe => 'unber', + cmdopts => '', + msg => "\n" + }, + + rrcDLCCCH => { order => -1, # Not automatic + shorder => 7, type => 'RRC DL-CCCH-Message', typeExt => 'RRC DL-CCCH-Message frame', description => '3GPP RRC DL-CCCH-Message', exe => 'rrc-dump', - cmdopts => '-p DL-CCCH-Message', + cmdopts => '-p DL-CCCH-Message -oxer', msg => '' }, - rrcULCCCH => { order => 6, - shorder => 6, + rrcULCCCH => { order => -1, + shorder => 8, type => 'RRC UL-CCCH-Message', typeExt => 'RRC UL-CCCH-Message frame', description => '3GPP RRC UL-CCCH-Message', exe => 'rrc-dump', - cmdopts => '-p UL-CCCH-Message', + cmdopts => '-p UL-CCCH-Message -oxer', msg => '' }, - rrcDLDCCH => { order => 7, - shorder => 7, - type => 'RRC DL-DCCH-Message', + rrcDLDCCH => { order => -1, + shorder => 9, + type => 'RRC DL-DCCH-Message -oxer', typeExt => 'RRC DL-DCCH-Message frame', description => '3GPP RRC DL-DCCH-Message', exe => 'rrc-dump', - cmdopts => '-p DL-DCCH-Message', + cmdopts => '-p DL-DCCH-Message -oxer', msg => '' }, - rrcULDCCH => { order => 8, - shorder => 8, + rrcULDCCH => { order => -1, + shorder => 10, type => 'RRC UL-DCCH-Message', typeExt => 'RRC UL-DCCH-Message frame', description => '3GPP RRC UL-DCCH-Message', exe => 'rrc-dump', - cmdopts => '-p UL-DCCH-Message', + cmdopts => '-p UL-DCCH-Message -oxer', msg => '' }, - rrcPCCH => { order => 9, - shorder => 9, + rrcPCCH => { order => -1, + shorder => 11, type => 'RRC PCCH-Message', typeExt => 'RRC PCCH-Message frame', description => '3GPP RRC PCCH-Message', exe => 'rrc-dump', - cmdopts => '-p PCCH-Message', + cmdopts => '-p PCCH-Message -oxer', msg => '' - }, - - mheg5 => { order => 10, - shorder => 10, - type => 'MHEG-5', - typeExt => 'ISO MHEG-5 data', - description => 'ISO MHEG-5 stream file', - exe => 'mheg5dump', - cmdopts => '-x', - msg => '' - }, - - ber => { order => 11, - shorder => 1, - type => BER, - typeExt => 'BER encoded data', - description => 'BER/DER/CER binary file', - exe => 'unber', - cmdopts => '', - msg => "\n" } ); @@ -550,13 +550,16 @@ if($#gotSafeNames >= 0) { # Try out several BER decoders. foreach my $t (sort { $binaryDecoders{$a}{order} <=> $binaryDecoders{$b}{order} } keys %binaryDecoders) { - next unless ($fType eq 'auto' or $fType eq $t); my %dec = %{$binaryDecoders{$t}}; + next unless ($fType eq 'auto' or $fType eq $t); + next if($fType eq 'auto' and $dec{order} < 0); $options = $dec{cmdopts}; $options .= "-m" if($dec{type} eq 'BER' && $optMin eq "on"); - $options =~ s/-x/-p/g - if($dec{type} ne 'BER' && $optNoXER eq "on"); + if($dec{type} ne 'BER' && $optNoXER eq "on") { + $options =~ s/-x/-p/g; # Old way + $options =~ s/-oxer/-otext/g; # New way + } my $ec = system("$SUIDHelper $TMPDIR $inChDir $dec{exe} $options @gotSafeNames > $TMPDIR/$inChDir/+UNBER.tmp 2>&1"); next if ($ec != 0 and $t ne $fType and (-s "$TMPDIR/$inChDir/+UNBER.tmp" < 1000)); @@ -603,6 +606,7 @@ if(-f $sessionDir . '/lastText') { $form = << "EOM";
    @@ -722,11 +765,17 @@ These options may be used to control the compiler's behavior:
    - Generate terser output while still preserving BER encoding information (BER decoder specific, -m)
    - Generate simple text dump instead of XER (no effect on BER decoder)
    + Generate simple text dump instead of XER
    +
    +
    + Ignore protocol framing preamble (-s 4 -1 unber options to skip first 4 bytes)
    + Generate terser output while still preserving BER encoding information (-m unber option) +
    +
    +
    @@ -748,7 +797,6 @@ my @transactions = sort { $b cmp $a } my $CountHistoryItems = 0; my $CountGlobalItems = 0; my $CountShownItems = 0; -my $fullresp = param("fullresp"); foreach my $trans (sort { $b cmp $a } @transactions) { $CountGlobalItems++; next unless($trans =~ /^($safeTimeRE)--($safeFilenameRE)$/); @@ -847,30 +895,37 @@ foreach my $trans (sort { $b cmp $a } @transactions) { if $allowFetchResults; if($ec ne "0") { my ($eml, @resp); - open(H, '< ' . $sessionDir . '/' . $trans . '/+HelpResp') - and @resp = ; open(H, '< ' . $sessionDir . '/' . $trans . '/+HelpReq') and chomp($eml = ); + open(H, '< ' . $sessionDir . '/' . $trans . '/+HelpResp') + and @resp = ; if($#resp >= 0) { - shift(@resp) while($resp[0] =~ /^$/); - if($fullresp eq $tNum) { - my $r = join("
    ", @resp); - $r =~ s/ / /g; - $results .= "

    Analysis:"; - $results .= "
    (Hide full explanation)"; - $results .= "

    "; - $results .= $r; - $results .= "
    "; - $results .= "(Hide full explanation)"; - } else { - $results .= "

    Analysis: $resp[0]
    "; - $results .= "(Show full explanation)"; - } + $results .= "

    Analysis: "; + shift(@resp) while($resp[0] =~ /^\s+$/m); + my $shorten = $#resp >= 5; + my $headline = join("
    ", splice(@resp, 0, 5)); + my $fulltext = $headline . "
    " . join("
    ", @resp); + $headline =~ s/ / /g; + $fulltext =~ s/ / /g; + my $fhref = "a href=\"#\" onclick=\"return explanation($tNum, false);\""; + my $shref = "a href=\"#\" onclick=\"return explanation($tNum, true);\""; + $results .= "" + . "(<$fhref>⇐ less)" + . "

    $fulltext
    " + . "(<$fhref>⇐ less)" + . "" + if $shorten; + + $results .= "$headline"; + $results .= "... (<$shref>more ⇒)" if $shorten; + $results .= ""; } elsif($eml) { $results .= "

    " - . "Status: manual help requested
    " - . " by $eml,
    " - . "expect results in a few hours.
    "; + . "Status:
    manual help requested
    " + . " by $eml,
    " + . "expect results in a few hours."; } else { $results .= '

    ' . "To get free help, leave a return address:
    " @@ -906,9 +961,9 @@ foreach my $trans (sort { $b cmp $a } @transactions) { if($DynamicHistory eq 'yes') { # [Un-]limit number of history items $HistoryItemsHidden = $CountHistoryItems - $CountShownItems; + my $item = 'item'; if($HistoryItemsHidden > 0) { # Propose to expand the list. - my $item = 'item'; $HistoryItemsHidden == 1 or $item = 'items'; $history .= "" . "" @@ -917,7 +972,6 @@ if($DynamicHistory eq 'yes') { . "\n"; } elsif($HistoryShow eq "full" && $#transactions >= $MaxHistoryItems) { # Propose to shorten the list. - my $item = 'item'; $MaxHistoryItems == 1 or $item = 'items'; $history .= "" . "" @@ -1026,6 +1080,11 @@ $redirect visibility: hidden; position: fixed; } + DIV.options#options-ber { + visibility: hidden; + position: fixed; + } + DIV.optsbar#optsbar-lite { font-size: 7pt; } DIV.optsbar#optsbar-lite { font-size: 7pt; } DIV.optsbar { font-size: 8pt; @@ -1069,7 +1128,7 @@ $redirect_bottom


    The ASN.1 Compiler - Copyright © 2003, 2004, 2005 + Copyright © 2003, 2004, 2005, 2006 Lev Walkin <vlm@lionet.info>
    From 335c48773fb932b9399f944467efc7d0d1484edf Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 18 Aug 2006 06:41:48 +0000 Subject: [PATCH 1135/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1135 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/asn1c.1 | 12 ++---------- asn1c/asn1c.c | 1 - 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/asn1c/asn1c.1 b/asn1c/asn1c.1 index 5faa2ef24..aa33ceba9 100644 --- a/asn1c/asn1c.1 +++ b/asn1c/asn1c.1 @@ -23,7 +23,7 @@ and other encoding standards. .TP \fILanguage Options\fR .br -\fB\-fall-defs-global \-fbless-SIZE \-fcompound-names \-findirect-choice +\fB\-fbless-SIZE \-fcompound-names \-findirect-choice .BI "\-fknown-extern-type=" \fB\-fnative-types \-fno-constraints \-fno-include-deps \-funnamed-unions \-fskeletons-copy .TP @@ -74,15 +74,7 @@ Enable ASN.1 syntax tree fixer debugging during the fixing stage. .B \-Wdebug-compiler Enable debugging during the actual compile time. .SH LANGUAGE OPTIONS -.TP -.B \-fall-defs-global -Normally the compiler hides the definitions (asn1_DEF_xxx) of the inner -structure elements (members of SEQUENCE, SET and other types). This option -makes all such definitions global. -Using this option may pollute the namespace by making lots of asn1_DEF_xxx -structures globally visible, but will allow you to manipulate -(encode and decode) the individual members of any complex ASN.1 structure. -.TP + .TP .B \-fbless-SIZE Allow SIZE() constraint for INTEGER, ENUMERATED, and other types for which this constraint is normally prohibited by the standard. This is a violation of diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index 3e461dcb9..8a6cd0774 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -444,7 +444,6 @@ usage(const char *av0) { " -Wdebug-compiler --//-- compiler\n" "\n" -" -fall-defs-global Don't make the asn1_DEF_'s of structure members \"static\"\n" " -fbless-SIZE Allow SIZE() constraint for INTEGER etc (non-std.)\n" " -fcompound-names Disambiguate C's struct NAME's inside top-level types\n" " -findirect-choice Compile members of CHOICE as indirect pointers\n" From 509425ec363d27db619b861d1890983eac66e379 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 18 Aug 2006 06:54:09 +0000 Subject: [PATCH 1136/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1136 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/asn1c.1 | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/asn1c/asn1c.1 b/asn1c/asn1c.1 index aa33ceba9..1b30e6cd6 100644 --- a/asn1c/asn1c.1 +++ b/asn1c/asn1c.1 @@ -4,7 +4,8 @@ asn1c \- ASN.1 Compiler .SH SYNOPSIS asn1c [\fB\-E\fR [\fB-F\fR] | \fB\-P\fR | \fB\-R\fR] [\fB\-S\fR\fIdir\fR] [\fB-X\fR] - [\fB\-W\fR\fIdebug-\fR...] [\fB\-f\fR\fIoption\fR] [\fB\-gen-\fR\fIoption\fR] [\fB\-print-\fR\fIoption\fR] + [\fB\-W\fR\fIdebug-\fR...] [\fB\-f\fR\fIoption\fR] [\fB\-gen-\fR\fIoption\fR] [\fB\-pdu=\fR\fIoption\fR] + [\fB\-print-\fR\fIoption\fR] \fIinfile\fR... .SH DESCRIPTION asn1c compiles ASN.1 specifications into a set of @@ -29,7 +30,7 @@ and other encoding standards. .TP \fICodecs Generation Options\fR .br -.B \-gen-PER +.B \-gen-PER \-pdu=auto .TP \fIOutput Options\fR .br @@ -117,6 +118,9 @@ Copy support files (skeletons) rather than symlink them. .TP .B \-gen-PER Generate Packed Encoding Rules (PER) support code. +.TP +.B \-pdu=auto +Generate PDU tables by discovering Protocol Data Units automatically. .SH OUTPUT OPTIONS .TP .B \-print-constraints From dd4ebf568b039501d124ff4c9cf8892b2aff1e6d Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 18 Aug 2006 07:11:27 +0000 Subject: [PATCH 1137/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1137 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-usage.lyx | 132 ++++++++++++++++++++++++++++++++++++++------ doc/asn1c-usage.pdf | Bin 131974 -> 132679 bytes 2 files changed, 114 insertions(+), 18 deletions(-) diff --git a/doc/asn1c-usage.lyx b/doc/asn1c-usage.lyx index 9dbae7d8d..28b061946 100644 --- a/doc/asn1c-usage.lyx +++ b/doc/asn1c-usage.lyx @@ -71,7 +71,7 @@ status Open \backslash lhead{This document describes \backslash -href{http://lionet.info/asn1c}{asn1c-0.9.20}} +href{http://lionet.info/asn1c}{asn1c-0.9.21}} \layout Standard \backslash @@ -451,7 +451,7 @@ The following table summarizes the asn1c command line options. \begin_inset Tabular - + @@ -1006,6 +1006,76 @@ Copy support files rather than symlink them. \layout Standard +\series bold +\size small +Codecs Generation Options +\end_inset + + +\begin_inset Text + +\layout Standard + + +\series bold +\size small +Description +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\size small +-gen-PER +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size small +Generate Packed Encoding Rules (PER) support code. +\end_inset + + + + +\begin_inset Text + +\layout Standard + + +\size small +-pdu= +\emph on +auto +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size small +Generate PDU tables by discovering Protocol Data Units automatically. +\end_inset + + + + +\begin_inset Text + +\layout Standard + + \series bold \size small Output Options @@ -1155,7 +1225,7 @@ Restartable means that if the decoder encounters the end of the buffer, \emph default BER decoder (Basic Encoding Rules). This decoder would create and/or fill the target structure for you. - Please refer to Section + See Section \begin_inset LatexCommand \vref{sub:Decoding-BER} \end_inset @@ -1166,18 +1236,31 @@ BER decoder (Basic Encoding Rules). der_encoder This is the generic DER encoder (Distinguished Encoding Rules). This encoder will take the target structure and encode it into a series of bytes. - Please refer to Section + See Section \begin_inset LatexCommand \vref{sub:Encoding-DER} \end_inset +. + NOTE: DER encoding is a subset of BER. + Any BER decoder should be able to handle DER input. +\layout Description + +xer_decoder This is the generic XER decoder. + It takes both BASIC-XER or CANONICAL-XER encodings and deserializes the + data into a local, machine-dependent representation. + See Section +\begin_inset LatexCommand \vref{sub:Decoding-XER} + +\end_inset + . \layout Description xer_encoder This is the XER encoder (XML Encoding Rules). This encoder will take the target structure and represent it as an XML (text) document using either BASIC-XER or CANONICAL-XER encoding rules. - Please refer to Section + See Section \begin_inset LatexCommand \vref{sub:Encoding-XER} \end_inset @@ -1185,20 +1268,17 @@ xer_encoder This is the XER encoder (XML Encoding Rules). . \layout Description -xer_decoder This is the generic XER decoder. - It takes both BASIC-XER or CANONICAL-XER encodings and deserializes the - data into a local, machine-dependent representation. - Please refer to Section -\begin_inset LatexCommand \vref{sub:Decoding-XER} - -\end_inset +uper_decoder This is the Unaligned PER decoder. +\layout Description -. +uper_encoder This is the Unaligned Basic PER encoder. + This encoder will take the target structure and encode it into a series + of bytes. \layout Description check_constraints Check that the contents of the target structure are semantical ly valid and constrained to appropriate implicit or explicit subtype constraints. - Please refer to Section + See Section \begin_inset LatexCommand \vref{sub:Validating-the-target} \end_inset @@ -1210,7 +1290,7 @@ print_struct This function convert the contents of the passed target structure into human readable form. This form is not formal and cannot be converted back into the structure, but it may turn out to be useful for debugging or quick-n-dirty printing. - Please refer to Section + See Section \begin_inset LatexCommand \vref{sub:Printing-the-target} \end_inset @@ -1219,7 +1299,7 @@ print_struct This function convert the contents of the passed target structure \layout Description free_struct This is a generic disposal which frees the target structure. - Please refer to Section + See Section \begin_inset LatexCommand \vref{sub:Freeing-the-target} \end_inset @@ -1854,7 +1934,7 @@ Freeing the target structure Freeing the structure is slightly more complex than it may seem to. When the ASN.1 structure is freed, all the members of the structure and - their submembers etc etc are recursively freed too. + their submembers are recursively freed as well. But it might not be feasible to free the structure itself. Consider the following case: \layout LyX-Code @@ -1991,6 +2071,22 @@ free_struct \emph default function with the target structure pointer set to 0 (NULL), the function will do nothing. +\layout Standard + +For the programmer's convenience, the following macros are available: +\layout LyX-Code + +ASN_STRUCT_FREE(asn_DEF, ptr); +\layout LyX-Code + +ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF, ptr); +\layout Standard + +These macros bear the same semantics as the +\emph on +free_struct +\emph default + function invocation, discussed above. \layout Chapter @@ -2012,7 +2108,7 @@ Rectangle Encoder \layout Standard -This example will help you to create a simple BER and XER encoder of a +This example will help you create a simple BER and XER encoder of a \begin_inset Quotes sld \end_inset diff --git a/doc/asn1c-usage.pdf b/doc/asn1c-usage.pdf index de80368956e6d691c2abcc1a555ca61853132e6a..ce8c99216dc3071f646995123af4ae9576bc612d 100644 GIT binary patch delta 35784 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 S!P*FnNCI3!Ld#Ga{{H}U6W3<| delta 35194 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 From af558e41c0a07e79c2bd3736ca805d59243605e0 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 24 Aug 2006 23:50:07 +0000 Subject: [PATCH 1138/1469] proper layout git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1138 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/README | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/examples/README b/examples/README index bd67f7b49..5f554f2ba 100644 --- a/examples/README +++ b/examples/README @@ -1,17 +1,18 @@ -This directory contains several converters from a few known text formats into -the ASN.1 modules, as well as examples of these formats and the sample -converter's output (generated by `make`). +This directory contains a examples of ASN.1 converters. -To regenerate the .asn1 files from the original RFC texts, do `rm *.asn1; make`. - -To compile the files using asn1c, try +1. The ./sample.source.PKIX1 directory contains the X.509 Certificate decoder. - ../asn1c/asn1c -P rfc3280-*.asn1 +2. The ./sample.source.TAP3 directory contains the GSM TAP3 decoder. + Before trying to compile, read the README file in that directory. -1. The ./sample.source.PKIX1 directory contains the X.509 Certificate decoder. -2. The ./sample.source.TAP3 directory contains the GSM TAP3 decoder. Please - read the README file in that directory first. 3. The ./sample.source.MHEG5 directory contains the decoder for -ISO 13522 MHEG-5/ITU-T T.172 (Multimedia Hypermedia Experts Group, -Multimedia Presentations). + ISO 13522 MHEG-5/ITU-T T.172 (Multimedia Hypermedia Experts Group, + Multimedia Presentations). Read the README file in that directory. + +The crfc2asn1.pl script can be used to extract ASN.1 data from RFC texts. +For instance, it is used to extract X.509 ASN.1 modules from PKIX1 RFCs. +To regenerate the .asn1 files from the original RFC texts, do `rm *.asn1; make`. + +The clyx2asn1.pl script can be used to extract ASN.1 data from LyX editor files. + From 9bcc5990ba290e30aaed1a5eb3e0cc8bb4961aa2 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 25 Aug 2006 01:51:29 +0000 Subject: [PATCH 1139/1469] converter-sample.c instead of asn-decoder-template.c git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1139 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 1 + examples/sample.source.MHEG5/Makefile | 6 +++--- examples/sample.source.MHEG5/README | 21 +++++-------------- examples/sample.source.PKIX1/Makefile | 8 ++++--- examples/sample.source.PKIX1/README | 13 ++---------- examples/sample.source.TAP3/Makefile | 6 +++--- examples/sample.source.TAP3/README | 19 ++++------------- ...-decoder-template.c => converter-sample.c} | 0 skeletons/file-dependencies | 2 +- 9 files changed, 24 insertions(+), 52 deletions(-) rename skeletons/{asn-decoder-template.c => converter-sample.c} (100%) diff --git a/ChangeLog b/ChangeLog index e4dad7d10..1cba2fbc9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -9,6 +9,7 @@ * [typedef enum foo {}] foo_e; is now e_foo, see #1287989 * Refactored ValueSetTypeAssignment parsing. * First release of PER encoder (does not encode SETs yet). + * asn-decoder-template.c renamed into converter-sample.c 0.9.20: 2006-Mar-06 diff --git a/examples/sample.source.MHEG5/Makefile b/examples/sample.source.MHEG5/Makefile index c61e043db..7fe0f49d3 100644 --- a/examples/sample.source.MHEG5/Makefile +++ b/examples/sample.source.MHEG5/Makefile @@ -470,9 +470,9 @@ InterchangedObject.c: ../ISO13522-MHEG-5.asn regenerate.Makefile @touch InterchangedObject.c make -ASN_DECODER_TEMPLATE=../../skeletons/asn-decoder-template.c -$(TARGET).o: $(ASN_DECODER_TEMPLATE) - $(CC) $(CFLAGS) -Dasn_DEF=asn_DEF_InterchangedObject -o $(TARGET).o -c $(ASN_DECODER_TEMPLATE) +ASN_CONVERTER=../../skeletons/converter-sample.c +$(TARGET).o: $(ASN_CONVERTER) + $(CC) $(CFLAGS) -Dasn_DEF=asn_DEF_InterchangedObject -o $(TARGET).o -c $(ASN_CONVERTER) distclean: clean rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) diff --git a/examples/sample.source.MHEG5/README b/examples/sample.source.MHEG5/README index 2fe89c1e8..3b8dc0c63 100644 --- a/examples/sample.source.MHEG5/README +++ b/examples/sample.source.MHEG5/README @@ -13,6 +13,9 @@ THERE IS NO ISO13522-MHEG-5.asn FILE THERE YET! OBTAINING THE MHEG-5 SPECIFICATION ================================== +Due to licensing restrictions, asn1c can not include the MHEG-5 ASN.1 module +in its distribution. + To obtain the MHEG-5 ASN.1 specification, you should go to http://www.itu.int/ITU-T/asn1/database/itu-t/t/t172 and select the latest "Text" version of the corresponding ASN.1 module. @@ -26,23 +29,9 @@ mheg5dump USAGE The mheg5dump utility may be used to dump the contents of the BER-encoded MHEG-5 data record file: - ./mheg5dump -x tapfile.der # Print as XML (BASIC-XER) - -If necessary, a straightforward modification of the - ../../skeletons/asn-decoder-template.c -will allow you to build a converter from the XML (XER) MHEG-5 format -back into binary (BER). + ./mheg5dump tapfile.der # Print MHEG-5 stream as XML (BASIC-XER) The full list of recognized command line options may be obtained with - > ./mheg5dump -h - Usage: ./mheg5dump [options] ... - Where options are: - -b Set the i/o buffer size (default is 8192) - -c Check ASN.1 constraints after decoding - -d Enable debugging (-dd is even better) - -n Process files times - -s Set the stack usage limit - -p Print out the decoded contents - -x Print out as XML + ./mheg5dump -h diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index 8fecc54d9..6eb381fff 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -334,6 +334,8 @@ ASN_MODULE_HEADERS+=per_support.h ASN_MODULE_SOURCES+=per_support.c ASN_MODULE_HEADERS+=per_decoder.h ASN_MODULE_SOURCES+=per_decoder.c +ASN_MODULE_HEADERS+=per_encoder.h +ASN_MODULE_SOURCES+=per_encoder.c lib_LTLIBRARIES=libsomething.la @@ -371,9 +373,9 @@ Certificate.c: regenerate.Makefile @touch Certificate.c make -ASN_DECODER_TEMPLATE=../../skeletons/asn-decoder-template.c -$(TARGET).o: $(ASN_DECODER_TEMPLATE) - $(CC) $(CFLAGS) -Dasn_DEF=asn_DEF_Certificate -o $(TARGET).o -c $(ASN_DECODER_TEMPLATE) +ASN_CONVERTER=../../skeletons/converter-sample.c +$(TARGET).o: $(ASN_CONVERTER) + $(CC) $(CFLAGS) -Dasn_DEF=asn_DEF_Certificate -o $(TARGET).o -c $(ASN_CONVERTER) distclean: clean rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) diff --git a/examples/sample.source.PKIX1/README b/examples/sample.source.PKIX1/README index d204dab15..b28e817ad 100644 --- a/examples/sample.source.PKIX1/README +++ b/examples/sample.source.PKIX1/README @@ -5,7 +5,7 @@ GENERAL INFORMATION The X.509 (PKIX1) certificate decoder. Invoking `make` will compile the ASN.1 specifications from the rfc3280.txt in the above directory. -The ../../skeletons/asn-decoder-template.c will supply the missing +The ../../skeletons/converter-sample.c will supply the missing "int main()" routine which drives the decoding process. x509dump USAGE @@ -24,18 +24,9 @@ may be used to convert between PEM and DER. After convertsion, the x509dump utility may be used to dump the contents of the DER-encoded X.509 certificate: - ./x509dump -x certificate.der # Print as XML (BASIC-XER) + ./x509dump certificate.der # Print as XML (BASIC-XER) The full list of recognized command line options may be obtained with > ./x509dump -h - Usage: ./x509dump [options] ... - Where options are: - -b Set the i/o buffer size (default is 8192) - -c Check ASN.1 constraints after decoding - -d Enable debugging (-dd is even better) - -n Process files times - -s Set the stack usage limit - -p Print out the decoded contents - -x Print out as XML diff --git a/examples/sample.source.TAP3/Makefile b/examples/sample.source.TAP3/Makefile index abd99c9fc..24833598b 100644 --- a/examples/sample.source.TAP3/Makefile +++ b/examples/sample.source.TAP3/Makefile @@ -700,9 +700,9 @@ DataInterChange.c: ../tap3.asn1 regenerate.Makefile @touch DataInterChange.c make -ASN_DECODER_TEMPLATE=../../skeletons/asn-decoder-template.c -$(TARGET).o: $(ASN_DECODER_TEMPLATE) - $(CC) $(CFLAGS) -Dasn_DEF=asn_DEF_DataInterChange -o $(TARGET).o -c $(ASN_DECODER_TEMPLATE) +ASN_CONVERTER=../../skeletons/converter-sample.c +$(TARGET).o: $(ASN_CONVERTER) + $(CC) $(CFLAGS) -Dasn_DEF=asn_DEF_DataInterChange -o $(TARGET).o -c $(ASN_CONVERTER) distclean: clean rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) diff --git a/examples/sample.source.TAP3/README b/examples/sample.source.TAP3/README index 4df599493..e3f9a1f5c 100644 --- a/examples/sample.source.TAP3/README +++ b/examples/sample.source.TAP3/README @@ -11,6 +11,9 @@ THERE IS NO tap3.asn1 FILE THERE YET! OBTAINING THE TAP3 SPECIFICATION ================================ +Due to licensing restrictions, asn1c can not include the TAP3 ASN.1 module +in its distribution. + To obtain the TAP3 ASN.1 specification, you should go to http://www.gsmworld.com/using/billing/tap3_legal.html and agree with their licensing terms by clicking the "I ACCEPT" button. @@ -33,23 +36,9 @@ tap3dump USAGE The tap3dump utility may be used to dump the contents of the BER-encoded TAP3 data record file: - ./tap3dump -x tapfile.der # Print as XML (BASIC-XER) - -If necessary, a straightforward modification of the - ../../skeletons/asn-decoder-template.c -will allow you to build a converter from the XML (XER) TAP3 format -back into binary (BER). + ./tap3dump tapfile.ber # Print as XML (BASIC-XER) The full list of recognized command line options may be obtained with > ./tap3dump -h - Usage: ./tap3dump [options] ... - Where options are: - -b Set the i/o buffer size (default is 8192) - -c Check ASN.1 constraints after decoding - -d Enable debugging (-dd is even better) - -n Process files times - -s Set the stack usage limit - -p Print out the decoded contents - -x Print out as XML diff --git a/skeletons/asn-decoder-template.c b/skeletons/converter-sample.c similarity index 100% rename from skeletons/asn-decoder-template.c rename to skeletons/converter-sample.c diff --git a/skeletons/file-dependencies b/skeletons/file-dependencies index 972eea47d..a640145eb 100644 --- a/skeletons/file-dependencies +++ b/skeletons/file-dependencies @@ -61,6 +61,6 @@ xer_encoder.h xer_encoder.c # XER encoding support per_support.h per_support.c # PER parsing per_decoder.h per_decoder.c # PER decoding support per_encoder.h per_encoder.c # PER encoding support -#asn-decoder-template.c # Template for quick decoder creation +#converter-sample.c # A sample of transcoder CODEC-PER: # THIS IS A SPECIAL SECTION From b51ebb2e1fd09ba35bb1e85adc88581e1bea0902 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 25 Aug 2006 02:35:08 +0000 Subject: [PATCH 1140/1469] -Dasn_DEF is not -DPDU git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1140 59561ff5-6e30-0410-9f3c-9617f08c8826 --- doc/asn1c-quick.pdf | Bin 101967 -> 102144 bytes examples/sample.source.MHEG5/Makefile | 2 +- examples/sample.source.PKIX1/Makefile | 2 +- examples/sample.source.TAP3/Makefile | 2 +- skeletons/converter-sample.c | 17 +++++++++++------ 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/doc/asn1c-quick.pdf b/doc/asn1c-quick.pdf index c16b16ceb317b72fc022098040e8e60eef70e47d..e9910afef04198fd6f45137a1f28a80009816dbc 100644 GIT binary patch delta 57686 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 delta 57516 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

    c4o6FS#A}1=$aO z|8r6g|1y~&E`q88bTf`5#h7BWH}-^Q5g3L z$OsV@8N=mgytSWl|2QAlG0cCy-Z7qgY~U@lz;Z-#gdFC5IKoSg@ID+S&+$Hg9OivE z%=_>hImG+$9Ph((ybp&8V>-n9!r~%KxCs1K=96dmoc@Hj{51D}%>9F$BA(*$A8~&_ z_xF+~8J}`rBu{Yvhmda~*+U*@@&F;jm&HZ$7=PwbvYS)JZa(&1uzVo{xG$22x&I(9 z*$%ngfRgRJy>0yV!4G)(1LS^xPSf{uYQB%3Al^$lAb({D8K-iHmVeQ?(@9wbFI{y4>9>1RZE6H`xDl&vsNU^wxx3iKJB!~Hb7s+z6j9c@| z`K++G2#cSshnGTEuz6g{q#M>3?5&H*R9<^ApM^zOyQ`5}#9Lg*(OZDkG~4-Hz^&Z* z{6^MX^qWzBJE!v5g?4B2r)F_^Gn2<>6k4Cbk)00R$K>I3UN()t|LQ`Gt9jm3-rK8q zdnfD;F5sd=wsZb<9M^Lzb7E24|ABh&Dw)kMWP zitBA)Uxc=0+!xU{UXGvP=j$st26E0VvO?cwTmneEXIx*yt}EkvO9uWWdg3js*A4gt{t22NT- zO;Jymt_=Yim;V6)qksK(j^`c!T=#X~PaY8@WQ~ZBRH9T;O6#=<5>l*3sW#GMYlsJ( zRN^IQPKT;#YELniWsa(uV~&}{>#S3!bVV!KYGbQex6$hQV%d&Wb!JcYxjuQ?A9}Vw zpwDye&;5PBzSsA9`Q9)9lCT061v4wkDiOvoN*eieo>{#p>wm^GmAgs53wY}zm9s0# z(kdqcb`fRK+4Gh~#$8^M3iv+x!a1|b%C8K3doB55@&o5k&~~)<0r?f=bLLbmTH0na zBII|F56_!FvkbTM4}TB&P(|6&%5ajmmHa{SSx=Nz%(~pY>N)b~9A7zq;iB00P)+`0 z@;xgT%&J`a$D8*?sk=ltwFT*QF3ZBA2@>{S6 zuX%~44(H8Ca|9brtvPPWO|7h(=$&f&A{j~MxF7beQnr_}TC72ndB?wiix`h6F51ml zW=B%940}zf9gR#>`KjV}(B?d|9%6@~&LoF~VP;wD zr{kI(U_Fjh$1!#(1|Q1nt!K8Iw@ot+Bh5t2UXz4fUOn|o%uOt&eXYsI25c}R@fc?K z+bCO!68-DIw`N ziYYHD%y+4Ih{WprNU(#qKmyVV+V}{WaNzmq+xW-EyODgZ@myoSPASIJEk6&1XN)Z$iXx60O@p79PIA=Sc*_WE3!OB)o5`IfK?rI>zIK(4I>;p|G^D zxX+mRix z2Vy$$UY;y#?vZ?e?cXSFwf-h9hf`C_2zu6>4kfVcZlw(F>|HO5%y5jEYqD; z2uzk_j<%+oY%@()Ora)Ic8<0t0~3i|M5oK6vq{sqY2t3fadD~QI%)il7)MMo$+$^P ziZqV4ri17tVOwFMX~UZ?5Lzz!KYx)(F3dHtCIP=;q=4^2av|9VLO*Wji?c#c6*ahv z2sZ}v=;s!p!CTea-a|5ry zr{p@yD03Q1TtV4&e9U-(G#1xKwQyhglqpx~tZ2*o;48$xD_%4HhPKow==eA?wj#_cLxY9dz8cPO0$Xg=TK@kDc(kR%iufG zZ@_x(>Gj&p>)hGJ^MCAgy(xQMC&kg0wQ$yJh0h6V@hq(azTF7V%5#l0-_p)rtv&G! zRw<`d(mX9($y_Y!${UY;^_v(={c_gDini?I&VQ-mE|EtyzeQaB)#4V*ze@BI!V1ho z2kI*@fSjW(M|YaX5##z>%w^|Kro~*XilZ%NV-PXIZ#B1$5r22PVU|WM$3wC%*DB1! z3|1`Q+eMtA>Xq@ktQ}=#$S3D$%dd**+WFJ9%O8!$eN#1{23id%x>jC>A|VcfwfR zSw)hJ(JeMQ9)Ei@Yj1fzT`55SJ`E--o40Wi0h&= zpB^7U9a^-7`ZI15syp*bq@y}SN8JP|TwQnCl2z{x?1~e~m&FPJITNd+rq7r7hc8#U znJoN&0VXr_C6^Hk0UiN1moN(fhXzj4H>OGH{kNSCe+0dEaFJRmPj zWo~D5XdpE+m;4U_LqU?e=H@O*$i9<6E+HGMED8x4WZx9o!!p320s%x^kVU`+7gjYP zL7+XVo+@2%<;3UvX?#%HD?gQ zriqR7{SW@J?|dkKfeOwW^>19m9YY50 zD2j3`kc-Vi(2vfKVZTUo`L@n)xRb~r&+PmwQwkR!raO_#%g{0OAli`qKfezz4P#gLXdr>Cn42#;)U~~p|cAi61&~tG8eDns|gbo1yQ8W`-;p_$+>RbZH ze=#UeKr1_+K`E#htwu*t3ADNab#(6SJP2n;pxe+sv>(3zHV%>lthw{0&Pzx{!=cTU zaOPa+;Lc_kmR_g=3WM5}=ye=oE_O~s4pa)#?LbeVo#@x-PxwCE);X=SvGZ)_mx#bw zHyR1sGTes0WSZI4ojW?e>y!bBC`yC7e~v>N(X-HgGi=8|eX8(Xcs|~UH<1{*kF>F? zIJ+DN98ysVY_(_>S_23iM#s_L&_D6_#K9Pt`OJyVg3kX$YBUIXNqaIGHNw^e+Xm>< z5zOOk+#e6a%kX1(6Mmnhk=sZeSx6RCe>*=w zcH}{~qq%4~^zI6D7F|YHFavG5aR`^<3Op9J6?i*2jCbP0WEeh%&ys!kclay(J-$jf zq9In2PUe%1WIuU>yu(aqHZhMgzhi!2`*MWa$$ia-giquN@>=1TvGXARmwwOcImE3}nVI&9I$fK4h*kS6PlVvsSi- z9e~!eGudsh?PB+^t?av83D=h!%8lYyaBI2s%tY=S_aVQW-@v!>-}8SFf1<)*VV1BS zM&~r>?5}T{1}shi>2uLNXd z_089`_{S-i`ER~523Jn`$(6Chm9gtrVuQa7m1XquR|WkozpV`V+wqv;bx?k=GFb0# z=}^i;l=8z$SqtSr0KVX_a!jlAx8QO9s+Q`;Y3r)SRYG%zV*rPgf64#>?f2#Vr7QCuU2rA=@%7nO+gH^O@+zfwyCc``JfTk z0l@T5!2uv=i+`eWlOPCNOq0pQXx+qOxC}n^7`izf0vu<#f?LjH{@J>&LA#^oHBO^@gB--46(cFxc^@n`_2*)$k$14~Q1&KwsAt zINx1vRDhwka|EZ+@olW?Iu1IjdQ`wMg@(%9Vrj`8G^{Sr;;)B_c9h<0P&-lzt2==4 zhWd8gxvCvie|ioh6=Loj3#WTgRhwQ3_lJXwUQm%1fKp~Je>F5*O?Ab;&cANJq;>vk z|1?l0Hl*ZmV)DBBEI@E%9pHp+g*(RTldcyh*Vp%kcCu(YtkTZ9dT3!rR|_+g7NCJR zT$J5w5OgyT8zHGXqOXggVIVTEv ziB?8J8_-1kx^;=8V4&sLx^+qG=p0KNw`26vida`gJ5m||MBDL-Vall$!9bFNc_0`7 zvFa(N`JmF>8r6;p{(FQAdm>x}(iSQR7yl0-T=MTA-22}`xb)`{E(4iMDZ+jJ_Ym%T z6T;>He?7vno(T5?X=4h)75_sB_y2bguKc$UuKIa|t3l=}ig3;U9>TRZAw1x}M|faQ zga?7N0~Le^{|_NN2l1ypV;FQ&g=9O#Fo-e?5KZ<+361vZ00_%Z3=@WvIL?UPkwv z>^x(@7=e8!yP^Hs@42H_`nR(~t{zOdSUZ?Gc!YAFaLi1eU=U}wyHG0QWVv4lj?^mc z4v7z~nq2t`Dj(93lZ}}mgGU7B2e_m0HZqvDu|Xb7#&aJa3rMQ67*%E)w4pkJcK~0t zf8ZT4T@0;Y2OFGL+us9sk8rdLxvP|BJ6xZ+I?i`=HC_&F6M;7x>^5^S6Gy_4aDkzy z&`icYkySH1cjMwmt5b_@>W0!I+z0Zz4}T(mDS!T#$K>xWEx-G*J)>{I(LZd&A*D~1 zAdem7F{8qmMl>R`735(D>&;Xogj67se@b*(tbY%bCx9CQQhe4!4zsDK&}fK+nLIDH zd$H9Z@J!89nblN^ZT-U8sbfoDmB-@33Kwty2mbOHw*5G7^0Lcweqck30~+qTFYnd={@j7m*HS#B3<2lO~Ch0d6AXOOuf3 z)K8q8xI;ksqE#PDk;x;i1B8-G# zsxZzh$9d5A@-nU|GkuxiIBvjsIEdfdDrat`>Q3iVtn*{m&22?`@Hpqhf9y>ht`@BY zdd^)SXide;EJv~0TjMb_9(SDYhiTnx6T<5+)frF&ZpNWo23FX=l3lLBx?e{6pC%Ll64XNy}sh) zl$u}y+{+z?A3822%u|QaRFY+~mte?EB_&2kP=f-yn{{eJ#<1F?iz1ap0B~8YL5gD0 z3JKtAFyJm|3r*!Xf1%64WPulgP!8mptQLXSV;(9%AqTGd^|5>NM{HhpxF*aVVk#Ek z=#O75u6}v#gyKmqMt3dsFgDGeHK<_ZUCTDEAGGR7<5~H~XJ1%SGkI`f&gdEY6kKvZ ze_Y%)l!K1Pd;>HiGbX1_%vg}RAcNl=#)HIk$&qf+GXKo6e-voJaSO&Q#sb4Hwc4Dd zf)q|D$k94BM=Fi&cwkH~6=%*OzEuCcOoZgs^lF55-1-q%bSn z8Ad8D>fo0mU z{bjsaE50DLKzDB1Y_ybtYOH{)_uZ$%MYVcPA27z5>IH8BN#i+u@KmpD(f`KuT z=j8(YPJBIic2-v&W21;qf<$yC<^~;YLm3@zI@Sv2o5ndpe=RfvlO!*fwOU9ZIVBP|EsNdy^tMAQ z8dhcPm`T2kKh-BUW7zZ)*mPCyXqNxefM;$i^`2R}`MKJdieX-o=Z4Jz`8RLNZ=E=! zjNy>ZPuL*$BuYXNv^Q3=(1q<{NQ^k^oU2h2UZWCfL@5vn6zFso=A=-N#6=2VuB4KC zf4#-VS$2t(Nhvw@)S9RQOuS_2pb?9fWI13$bj=4kAv(IJL4GLg_Umnk=fZxyH;Tj7 zlqhnWp+x5dW*MI$5XB)|B#JyHNa&nUYz0nC06GKi#R_1PZPp-g46wpC;0Puoqd~FH z3An5lFwZqdTMEH`E4Q>teaDWP(S|khe}9~oKkc^+55D)o<-6uLKlLE@&KS0xxGT=%ppaKr2@t(iNx9$`Xr{p!~9>I4i#e)nrV+BZ5kwkn~P$`&-Jh>J@D*-Sx@{B@VI=yH(^X{ zG~@<2r$Aj1d2aQJ`|q2-dCHpSfA_7r_t{N5wyQNE* z*s42*tzJE5^4xf7)9MEv-gw{aXUWs)!&W@~&Bu?d9+{PqS}^J9qw+t$`skO3bErOk z1(Uap3Mkw;H|FBf1SSfB5m5p4;P51tlIBT)MN1Rp0}Mtt^BV#t7Zylre;{E0>KuI7 zz{U8+E-vEk>|kG{vkJ|K#YQtznI<41eqbVm_)QpL9?C4k`b`|iGdv5-gyS&gIf+4- zB^>Z3kw;EJTobtSQEgsjakF6R4T$yc^H<;!*f(ZjJl-4ARwkv z@yI1&mSadysq7#Ym8uWAE>)AkakEq^TmXNVeevon=E$`w_7VJwT-1hV;OT90AsquC z+N_;BOF1Lj5vz%sYRz@#$=U^4Zn|c%hJ;1EL2K2kRSv63t7iR%f6t#Doah+6a$HGk z<-B1jw&;SU-LVv|fA#EH_B0m0Y@V@lMZ>+zA8MX+OLC}R^@N9)R^0~}eA)SdP|AG@ zbA2FsD^_1vm|t5RxUF`YYHDOg->DUg`kZpUS*3QSJ4>Q{ikV_vQGgdqtWu<+T3utT zL$@(?fho3A+Ecm<(C*De-?=C_~C=D;6MU-Yes4* zWG|bUnt|2*p%gO?R7qS$rYEyFmn#V8hV{iq@k3yI$|2Qkon=gALA#|JheHQtnceKGL8WsIFmEtXQsN$YLgaHKPF?7#f_bzUGQmUm z5w!}TB%G=-&KVW?|4{P=DHA~C>Y&gf0iOH%Af|9f<*DoMY~wzh5B%FYBp+_>qHp-1oHpP348MVlG z7Xj5f1||EBkvs@cm5Tz!M8LzAO;R5)qycHUQ~gfFhKyQOM_9>&w|E+;Kc^x!{R7Hl z%d|qTX(D!aEEOj}g+&C!Ph@^7&en~*5a%O-F}z{=z@HH#S&`c1)vmeDyj+|+8>-f- zTk@#C$+ZEhSZtluA^d+9`Uz?r##~+1nUwnQY80=E(L(E4z<@k%MzD1_8GWM0;BrW; zxPHrZXR^j!t<-)8WvmBAETIX+=6lJXt$Nk!d^Pm`@bKgyIPCzx4NO{s0(_H9VRK6h ztdzJAFeCrwB`Lmq#p%}xe ztRGDiqxcz6Z{ys`HH*DB5Evvsk|`?}rk#=6I0I41q^{KgF-#yHYP}mRF0rG^%-!Aj znhk~i^jGmeC>g+{r{y(^XP?8U$hE6UOCdsc$(74XsdZ8i;q@ z9wqF(NAZ?I68fz(XfUnlLv?Lg&H#b9Fp0Ng~3Nd3Jt872$hd~KF3(J*d&D=qVu7bVNP&L9l<}K=kuqWsq=l`fd|V5pFGsA z`v(ww&0adyQ zC4A-=E*VWC4<)gWQMD9BU~jq7x@Se5zGk9*s86*E>PLzr%~dFC%r8V?PKE`rtnqt2@T zJ6z^o##&jF4JYvVv{3DEj@cNNyQv*mDS)-Iut_Xl#%RDoA)yY}Pu-ps9*xxj+yG6O z>#dI#8oc>ydp!X5_G6m=qQ9Byv2L{U+V}qpfr_PiY{ zdT*t@3Vk^b7_z!NtYJGdWV@-fDZBWfT%He3#h$vDiy35bVV-9U)(ls`?)M4Uv+JMx z4NVV;@!K>pho&_ja^$yQH(i{W27zX6IMOObu1tq%ti3zbgi(I7=&SM)ps_O9BB)x! zrs)w=kDSZFHSL$dK(Lx`7hX9HRmqoj=HL0ptEkV-n6077pCqFR;kb_y4in2KK;jVi z2TR(1J9tLQ`PXy{Z{gZfN#k;HWpZ*0bFZk7CFQ92=(vuAz=)8+iV%UczM$Y2^KnXU zN)^Aae(aanZNo>hBP{NmN}YIq&yx>_znTVbmu1UN=KgQiD||0eS-6Mp2QIhhFEfNp zo}X(uu~RaHtxtT}QOCM`vPsP6F{|auo^(XzoxSkda%94$AxP70jaq=Rc-4Yg0es8C zR4lJx+vIRN&$K}3qFf1_cM!Y?&W2~YF0U`oRQ6HKuzLb;%{}Gh&F2FSJY7bpAtPLH)=im>s`wO%)1CM^jGgwzRRIUZ$f}(|W|Y`aD5VIK zVi3+)uibQWfSZ7+g3JwQiRDl^$y}r}^?;obvIpF&rQiDmUyD%;cWyu1QM!Sae^64p zR&*czN|5`mMcp|SEoWxjh+~b5WKHO5l;$fdD(e(OXZo1_DAhaN*BWYR)SI)_*haFF z$%IO9l&6Sj3bJm{IV_9^>Kb(i%6={w0?BRupcKlHI2Jk==!s>doh^ycHddPEK+UF| z?T8{IFOl5HG`E19oUS&Y*o@Lrve#yGKn=w7e))`eJ2|^O^iY$yMRbn^Tu%PHxYKmd z{3+kR^&zUgPH*W`Y1nSwZdGR<5mD8&pk1u}M@vii9tQvocYeR{DMhj?|9!BiJE&#I z(1$V~wSL0}L12|sG8=vUjG&Ie_2*AdPDMfd!xNsw&ikXWHqDmjGX+sF#YK^Y7DIg^ z@p%8C!retu@H@85!iUtmwMEhVNI=fa4nh}`x>aJvggG%6-`}RqOLs*6m_i%FDgP37 zYFHsDc(X3ju$Pd)BHcvC&`3@{XUNVBTt6cOkf9<1(l1mYhtp?=>qry>jh?};rs93v zlWCS?A&8S%ussa)7H3G09md?%_L)+t?y=8gB`|~q)mK1|qSwG4Z|#t@0f!2%jR~Q7 zj9UV!$NG&9P2n)}y+$|Ka*waz5nyByU3ys*n`yg(q=yXb$e^XetblVw@T zNk57=G(^Y5`TAo;wmbV0@Bcs>b3Qr{z)zh8vG?|B*&|^lA|v^C!35-y=3q}3Y=NiV z5YNgLAV!eM^BbcCFFQ((rzLM@tloOd5VW_jfcQl+OX)#X^+GqSREiHOFJ+MfoN5BgR zwPvEbz-?y7LgCZ=*~_;56=vfrT;TXIihg}KDcjd#{`%n-^^5q+^9>mKvkx-`;JdK> zbSm!ImiJp9${o*3^>Y(3`tXh*!_mE3ke9a2_3UQ+stU9-U75ai^kagywnIwjg&Fgx zONyvc3Igeb#z+LuJJ~%l>Ei4DG}aj8Ae@pkA`k%n*l6n`%i%1UQS%->&rWGv{ARdW zeEu7KRY{x9@|Z-oE+8Ih*9%vTW7xc*R0JmlB8*OH~|5)1oSJYA&Ff2x|7Z*^c zlQM2WETV)k$~;xO%L(`)V7)#FIH=RC#Ok&PKuPLrcN&8`EjqkR>^5xXK9IA}QFC4_x^wJjg9$w~uyD zOSur3&7|lIEBKc;1mGWuY6yl|S_t`xVjma85DTnzX|;k~;dXTGtsOBG?hQ9$?higr zA2bWymk~K8u})>RsE(Y05nciP81_EC+S~3X{31;iLVR0H{@moF4US`iL16PxvrR1R zj|v_t7eAxuOh2@~CQ|vkP%kgXUAr3&nI%#jp-BpzT4@8^i?eR3T<0_yKJIfQz9#dxc|mq(H1{pVVL-I^riR;_y<` z?XAmg)a|FsEdVQFedWV7EcrCL!q~=;hVUq@;GS~+1guHE>n<*lsuO*U=!2hHJ{L9 zS1QQ^V^#;tTljE}1?&A9SjmmGGIJP-=!D1l)9n*h+gQG!Grw|TCB&2GK3f2&#v&R^ zSBC%-81Zj@%4FFfT!G^Ym2vQn*OYbllVO??L~gNn6}RExr>poc7qS|)?v95NqGZ13 zcZDzuWF>}Kz%P&`9jw+aS~_3aFpY$(UwLOpnPgGvPhSjLh4JA8u;)L#37R&k)#*k^ zGGd7mLu7{lYMNN#eQJ5iw6dZw8EGqfol#RHu33EP=8p9n9wuUf9Hbl5@`!Jpfg&ln zjb6lhEgMa9yHM>($hUB1wdBgi10Jhsz=O5j3cD3e&=0f;QYU#p!)hlo2buz@6pb$6 z1PJNr>M2Mse(s9+{^0Huy0Y_={Q;Apj0{JVGD7g900yodx#G%8D>;9qR6r{%S<-7M zqu<5Xi9pXfS|+?~RK`Rx-m#DtQeDe*xV=sEs&X4I^$)L$$duH^(sFql=x|s0!uw;EcCL}1JZQQ<6 z&`gv^M#hg}FFrQYSjr^1U&?|b7_|<863;0dj;ao!Ngh|i3zduphOoFUrgwUf2hCTw zS*%cW2Q^?MpRXLDu-E?<@^)AA(R^UzkP-BALjUgM;w@`(s|U~X3c!)&-XQvmL9P=t zJyGKB*ACo;p>*8hTnX_GijWw}!c0TJ(qzBQ4XN88(TlckwCC*LjDU~8$bZ6$JGp^1 zkMOv#W|+^kl44KS6>u9oynjsxccJwH5<)+hn4CMes-yI;=imr+y+_?6~+&$P<;?}03D&cLzaf@=1mIg5#kO|!{ADJ^_PPn7g zE#`jFGs{nq6t`a!JdI05$IEv|`_#~K8vkncODl#6z zwNQNa!nZ36#70rxEpJE@U>v6NVH=sMbFdP6VpkE4)lxFWNKQNh@pl1w0KIHck#F?? zRoO?TssX3^T-rTJD4-Gt$_RT8b_Vv(Qvj<2ODX^ZV%$dLuQavMfn+w*Bgjh)Nc?+2 zLl4WwO<40sIhT|e%t`Xn54iSET_xr0#`{L^n@ni7l7Mm~v&eu!Ri|_I6C1H_Tn}9K!VouEpyP3v_%w@1VXodR)1j-eci z6k82xM`=B{wYJRV>N>K{kUy82m*g{ABj0&pJ!5v(_17HjP#R1I2tbEzW`u1?FBq;v zVJu1%JZQKome@oHN{bN>ZD+#J@BSofKDp~@I`$=*H(mB+o z=FavM^MBIf$J*-I+ryh3xb}eNW>2X^DZDah+c$HF!?-pwo_p-!)wxPcXSe0i)Wo7( zCx9^J1*iz+DtMwU1yBLNGhu)$AqfB!F#+Ue1c{8%<+GL$OX=kp-Bx99)#*ATX>;BV&lmHeWw%?4 zQhZ{nPH-=_UFo0X_J=N~mnFss@E=ygjX)y=l|yN_QzljJAbal@%e%p3GEwZ~@6D-+ znuCpH3En)~67#}1I64&*7G7+&lH8nDL;{gfi#>ru9h}2KUYuj+?lM&nD^DKlm@n-j6 zbvVD>j&N8JMDFu54lxDT1=7NDfj4L%Vw@y_QVoHAY@ErzCKyrDTL&hrjz~zI zg!aXRhvJeCn3ZHglTy`a{_GpAO|yYn=l9n27OIngBnNhPT$nq_u2HV$%EOZ)7le*< zAW#uZaN7~Iu&=F#vVIVh@NEy?gJGIEkN@m3FSD5KrDw%s4L8fb?S!1@(>;+19Dp0% ziNw6&-5yoF4sbYFqGt>=X(Y@^vKXR7dg6H@C<56KpB5OV-~=gOcpXOr{l%TsyZI*4%);V!!?2s@!5!6xD44iT@tL@sRhg ziGsy$7C>PJDLRK?HK2uf$S;r8M!3KsLSjktBLuHoy>d@7X2#wrt^lXs(T8|@ zinqas^ge@gqtlpNQK4FR(1t4E?xo}@JI=)NOx>8c=H12+GWctknBMO$Wh5rVR*=rz=Uz3wAZMVK$p(c z4=p8z8%HWJ66O@k$)+S4S(a<_`(z!vHWGPf6HerQsQjYuJ8aAIu7S|_iv8s(=kIdu zDdM|N<#v}g2k_EAcB)8pBinNDLu3DIb4p4=&ytK5A^M*i9phsh-38D(kM`NP@r07x!eA#QCO#Zl_Uts;hwyY=28; zNdgDR;9g5^gabEzDxuc2ca*@Lxsz5dPJRMPtrpz`C*C9r%O9H3rCve)k5C;qqAkbf z|3KXPWg%~eJwuB7hbHbVzqfCN22>q#D1F~b)EwGTD0bJ@YoRlkh9NpG(LK>#t;AXe z`;jRs>5Z+mG$?Vx6}}lABqUk(64I_|%!kdRRxB<1G^ys}-g2ymA8EJy_r3uM)yJ)+ z-jRC8_=fwBzj8XFTs%NOr9;_c1EsliTeFyISPMPveQ1Zig=^zU<4a>b6Gy+X_nG%=hO2CSb7(5U zls@zH`0;d8ciu|uKNF?;{CYpb0HS0`mB}lv4g2yfBXqUd6Lz4}GdkfSRwOVpsCr$2 zuu0^)r|8fSsfFZ%JMo{s%4G9tS@T|5C37tbXxS>p{wgE@Mf^=Mv?Q;-1y_pxoFFG? zxL=~xjzY)qMCw|whQ*lAv${A*d=#a!^<3a9HHrwiLiGx?5`{ky!qiZv3?af5Lk4YJ zVJz=iXV5&pWE6(b|ru^R7UMNozy6(L5_lEt^@owrlRCz$f1DCCQ7{+$wz|duB2~0ZK zpGT_k>K2Qv0-;RHwhATiTo?5@hqc;pDCSVxlsM2_K#$VqECj?zKzk_1#-bp3|>JK7_c+F!spN83vGj>Dvo(uw>b zE1*vPy9nqAJPt5;N;YUij$qp;>d4jmFp;FfZk+;OqGGgtu5Vbac!`V1HZJpf^L$)> zcF_NOBw*94JR%%BGcci%a{4o0SmFrvQCIM|^Gb;D@!KiG^j}O*-^TA zIsKs|Ks8@@hNs2eW)fp}_!k>p1rrpQWs=cJ5wQq~EFqhZ6P=h!a;<}PY^{U)zR+4a zH^{YMGY9_JIgnUSX^SUAG^pL2JT+W!NI%n0r28$k(|@wPIXMmZfJYRJ>>9KVM-F%# z`LkU6rpEN%s)LnlZ@d&yQP?u-bR@sq_+0F&Q;|#EAkBR-*DyBBF2*y-}G>Pf&VQIW9i`4joY4&>h$ zjqP*Er0Vj3H-Eh5@MDI7{~aYVE@QU>s7_LP{;?nX^)9v*hzTP7q8d-RHs+AE?~iJG zUVNr}R(>Hsk$I1Ss2_tsBTQf^Y%zYSY^Zj+05T;#VP;s%yA_x9i1+UoBg5a?~Vg{w) zS@pm0C)2}hdn=|W&3{B6>N{_+Aw^ihizb~+>Tdgd+CB4njPbg`;*>lkm*g+zcH3|!)*_M1ETikEh5hcrWRg27y!j5E( zbcqB+%B+wm7a&LM!unxFP~i(Y*M^g=o+1kizf0NtF+HW+4MPfRjI)k|pCdyHIG2Gt zwi$`V8>MCSS#hG+y0IGZ1YK7tbE8eo1miH9&C0l>P*}X#Oa2p)Qeh!&*>5zKdT;An zS8l~5+j_rWcWUG$Tb8D9t9}uiPcbOAgGJUg>vb&NSex)YEM`lvzD~#c!&USz^4>aJp;36p6l;5Esc8@Rm#q zmqE97ah&sa7kp?zA0C?75Z(e8=(UJ>+`4z@K8hvZs3C+|P+0eY1To{quN?vtLlD8( zQ&)s(Jkl~u2zO0hrUWvm;~Q(aq~MmG$XJpxZ1%o#EhX` z7;8?VTQHBw&ty7q#~MQ27;Adc=Z1{x-K>bo!Z}O*o-{T1F`7c!fG6fzJRmKRWhkC2 z^x*&pfIp%e)Qh1TO}U%wfmj#M;vAVa-Pspo{58n`w+l+(oa^(czrwib`H%JQGj=%X zwmI=8>8xUcyieW48tsxM%buB2*8*3&SM*mK=%C&Fy1D0K>SfnSU7OD+a`U#4+ctFV z6dl2OKtq=iV+(ddtLso-FTA>VNI zsX29K=5D@BQBjAgj;3agF5vBEbmFmM4wru2^|pV8?6 z2HS6k=l}UOU(0IAaZm(1l(F$EOU{Jb%U|?!NJqWbJ5dJ7YisfwTQ@AyvNk}b-w z+*Y0_6)t7%O14+e+rHD@*JE0mUI~hXGc~qJBWwd;x?dw5%+J1WG4T%HcP1}QK@~M1 z$f?-KGT)GIq)EVW0we7lgE80C_0Pwm!}q0>J!OVF(Sp3x+2cps`-f0feMR*`&I`$F zflmCQ-OH-HfNsq^*iC*eq9zX)-p`@FHA{t3e8vd$B?-=wB?*zTAm6-&GbzZi0tGnQ zko6Ehk?J@GF(^mZV6r}vbg`gPRQ7xjS!Di9jDaQn(~ab{pBh5#g&@@}$@O$fZUTRx zff|hgA6Y#Ka=fM0)q8&QS#=Tql>_Sx3Yz|IGRk(00bgpV7xR&cRfM_%7OXsK&3=Fl zJ&IB}#=9YJti~$NIR0UA_i)15*cT19yK4HU0SIqpzTR_YwEd57_Uj*Aos)aef`MS# zC+Ka$;K$zsKu8jyZ6?1-9IK* zEWBK8^=1;abD&(OvFXfg5k*dDTEtvx^_C_4RFn+e)io>|H9x@NPHiJvcwKQ=#?V@0NpE!l~@&Y&N(uDZWvmCqvd8pr*qdqUGF_D3|c3P7zFuIL`zsh3x zoZ61@_53;p?2P)n`T)NN{eUJ>AOe`#o4U9}>xvlTp*k)Ya03h@Cz0YZyNTUKWfNo#X#}{{QvLai$Qs zfpLIr9C4T3y4|-Kjq5yuhnZT&hMNk>8NcDpW6VJugm*E00+(v>Q%T-c;a~Px>2M%$hx=mKc*LP|UIF z0>ng=Zlr{~`qyQ__^)f5dz=4w11c{VDVh%?tHt7Ww0BDbm@^^r#2x!(!60bn+#}l~ z0_#h#h96s%-SO;RVgSNkTh7B1aNorwl;v}Ok_I=RAagyuNj_}&YQLSH3D*bf8{H?` z`O0{Kv8)m8c)N*G)GMRA>w&ri1wXFBr%chsf~?FV;vSVP5e;;^>&Na{1T4R8LNB13 z!zkMAuZ9AP+z;HDe|lZ_e@jv|SAu4?{2${N6)P+K9x66C;UcVNK0T?DhzP{U;%fG> zOlOmAzeZLx|M=V!!h~!;MhJhgKh{w-X#8jOF)84gdK%A zV0KRPiP0rz+#73Fn#Uy@G=&43Y4Zi)iV4)-^Az=HZ|45$=@vHM=QQ+rT=@G55OFEy zcJ~8jWrsp1LI^Jf;$*NMFRw1V=M|YQ>as3BX6vyYPmZKaSG!QZAs}ijm3z8m;py`r zE|bbGy{fSh~l064aPYo}X zm{%~5vm7sN^VK$f9@$QmYviTOXi;x~UVH}i8enZO>XqU%l@SK8n8e)dCheH5Y(6HN znpSX#>d2*Sf>1PnNYx=`q_5|y!dytIO4Ei07A7|u;xB4r{hGSu?PP zria!h3WWM$PJqVW0;zOchieFOH>&5+lF|-MW}yq(+VJ@!(BT;(z&J}Nn}HBOrM>d% z-zlpP4lk$+;d0G{wG5-`=^oLGj9p2a$hLMm2yN9Nx&a57Dbx#RpIfyZHYHWUl=Ksz z@DpQ9PlO2xhbAT|bbfilXDj#?Mb{;_x0CgWy|r`9Ly8l-6fDnU&VCwX=fNq(i?+)l zhgoT&;v}=!cR+}fZ8|0)gcKxN1g66hDmhkU$|StMFhJ2US9HK0z06zCe#=>3T>+x^ zSP>c>k*buqi=>e4Kl)WJ#2yWx@h#D3EhCHYBS4#nAN#2^e5^Y=zd0 zlMu#%Vpjnd^TZYU3x5p)^JdacFFce+W{acN7Dfa>qv&!8-++~x`Tr&3x8)}NtSarU zrs3PS%ju6hchN+0cR(FNRe7BklmADbiK^K&hVdLpDu zOHb^49wyIQuEL%7@BhfJ#mXM%a{QL|ypLgvZ{>^YdY1^4Q<;{elsTdJ;yKHSXlyR|&~= zl=(x`dcG_s+7D)s%&BP4v`jf!liOtFL@%i1AE%bSkN5$kKET5)R$Hb-wph~sPNs8| z#P7OGZnF9G1!o2ppR`~3n<4;KW#6#~w$q;XY%lsZh(xaTeJ7}63_Vy0Nu*C6D}l0j zcikzma06$iF(eO;pqAn)&xXqK=XDW}8{^pLFF()M12qZ|(I`Rb*ry=ktKpmJy86E0 z2g}FJkv|oyrBA#D#?<6PsOcZf%tziwRBPMM1p^#hTsCa|!so#VG^pB-3PW!}tkX8Y z9E87D-u(}iPmaAnj)ezaPN}48OATzA=hKit-W-@H$}CB6H4&vbrF2teCG<#9j7%28 z^F)t$CQd0(zQP~KIC8KGDK1m1JXm{}S#z;O;`{f7M9HY30!4+zt0gTE-IAbrn>$5Z zCO*ZM3umK596L z+|TVu`hyePk+hk@)r0MfFCh;lWDefUTmHcCHnjsZjVJ$mk)0Vj9ScJKH}{mvPeqjt zq-q+-Tqurxw8!YMe36ZhLE>oJk0imi+?#r$l43vmc;Brd_m_5D+`!$w(ujZ~28XHiA#2`dTdG)uz(c<`dp zgh;J^kwQ5pEGfbHLfL{_2>M@&3*m|}qvY}>86rDSXcuq$$48GX&SfN3Nakl^`PuvnR+o!29y zQEb=7*<0Xude!lC9$>Lu^_Bam4Tev2bR6r(y4ZQ6^oAc)*SrBt;-x0*Xe%60&GM_i z%AW2@SNMD?)p?xwcwWcLB%qps zE|X*ix{AakzcXsFN?pa^)2L+m@6}__)#RgN=oI7_{)lYVDxwRL)(1|&1hrEN%ve2+ z@XKUq?vN`$X35!Zn$f-L34Pq)oCOWqWqJ7bpzS;HfE+w5%Si$QrJ{1-q4Z)l*9|R) z3CaKxXSXDxCvVr}rJlK=o-%O#kf{P7Y@}Dqzvat`7+fQ{m(s!*&}l+n4tJ8hNuC`-mRtlIa@ZcCSz4xwwdNrt>GT6Gd~7va8&-$k@Iu$2P8}%AZ70% z!Mnu)Rc<~H%;@SD@;4K4dkG-g!sxocMSTgidKcqA_0-#0a3BZhq<|Uh^(@F;)fH{P zQ7CGfz?T$$FUXXIhQg+V-lrA=HIUYXRE*C{FD)AN4n$N-NQ$(6{_gsO(*f?W_`cdH z9~#`HNI*aIB>XmHS>CRAOG>|Z7-JuD|9vO97L=U}n_Boa7Y48z4jl=tbS>_%8wj8! zcKi$GcM`r5Kapyrfu8wpV|%`h4Y-#43whN3@ID~aHU7YlF2>Y{(K?v~g7BrYM+Ny( zF1Skuu|?@8f0lJ%|2wmmf0&!*{e#rW=wZflfit8%?N>WeV#rT^JA}i=9j@L=aMqQA z&biAMN2ThGCca!t)orNy)h(4H;>)uxa_oKiGb*CIeqFciK`zt-Z~sGeOUUSto8C<;ER>xDbpwFC=y za1ZN_@OpeHW;<&oOCzHuhu%m)a}R>wJ4UKK=YvBWzu{Atrw{uNWfW5Kg{NNYekH^LJdNZE(n+v6 zJfb1hBY9p3bN^W^7>BqtuXcWjiPV5y3!OOz!u&^mEa<{e|9t=Ei+mUan@Kvf;ReK7 zhA@`iyq}IBDwFdb2mgPFHdcICSr;^%UP-7kS78M(2wPuid3SM8%cBam{Cwr3kzFhKH@uEKT6ZbVkE`$&n z`-s_u6RTf=F%y#=-30G=zJ#sa89ohvT}_{mYQ3qpP2csOHnI5MIR{vL)@JG zOFhvkc7b46fRVF-E*g!B0kiE-jWye_j9BCI#O{DGBfyh(L0O@6rckDm> z-zD?T-o&VRcKb9XQYz(*72bO%j)Q(!a;{?$ZFOv2z~n=-CV7O%q`fu~-fRkhXmNdU zUtTbB_O6z;N})$J+SE}&q%EYYsCjN8c;51oprf*XgA^sVrf8Qj5a9rpJ-^}&B=C=v z%C2q+}M_c|-esXd!6Heg^RO zjytyT1xRX)uns=RgjjbAdr^Yc?HTc@o-E%lQH!Md-WTb&p^NUFG^zK z4YZM=D=Bnt+8Wx5G2XM*t~n}Cf?8K$CnV|<24btcY6%|(0x*N1D{c;7!zb76iK4~D zWW`E-EkElb(Cb`C!=wSoesl@*`s0HGr2OWN55Z@|dEpO!j}uU7oP9z3HY$2xbPLNZ zgpeS5z{D*QlOXQ=n=UVQ7<0L>=8Dl@jlwEyLyi=s@!4AkEz=3b+)?LeWBT;UpKMMr zC`qyV!KoU&;CI0?mR5)VkGjD5pW{99x4gi{#PWaD1+GMyj zdZ_IGkpljQyujT;848vM_P=W;!oWz7*}49wkiebt6$T~+#*~7A0Cot$&d!nYi2x>? zB8dp50nWjcl7k3F_?^O4v5JoA=6aJ)?n7<+yj$6{XZj+|sB1Zc?67Yh|qzM=OTUL%7b}8ruHWgD+ z4C)mo_Bl!<4oH!y|*6k`YEh!bb@^=zFN|)g&Q<_6veD ziUSW8B|*YQf!Y=hD2-zg3koK}u0A|qoqz`YL>Ee%vA^EDBlc#q6Vl-4`xiGkUmuFv z-R(V{y+R%|8|}S(p3*^q$K2|+sh&S+=`ou8aa5rilhEHS!noO7Ww2)4RMeh>!wAwV zck7^^dV6^2#-?DFhQS+a`T1y-HaN`Il61J;cEs%-I#B>uqw16dug7g5zn)L-yRc=j z@UzbIxxly}dP7SZY@pH{lY*$~wT!M+TjFvhE?aMQ{I$PrP4lYKRXoPrjV9i!Nws4* z0YE5;K{SS%(fpbSgc2F`_2bP9Qg;Jv57810!6@ge< zy!DFQeVAh!v<^;@5A|0zr5Lt(%YS7c?#~&tZ$EvDNTR9Q>nC*vDU? zM=ywx@0sbmZ>7={yVKx;d;yZ&w#Sc9^#xj(WKN71%j=xW_%wGa&UG5O9E9BslSG9M zFu3TuRVp*P@H?(ri1S=tw+;Q4j1uVyS8J5<0DUS|(qCPF4vgWB8IAO`iFaySK8^Z} zqkEp4$GkM-P(~Y{>KR>4>3>ReM-}?_(fK54 zbhOs?uiP~fs&Wh})@XBqxnixMyR+P99cS>>|HL}Wl?6)^UL!O*xkHMWv<#cALmKSn zvpG{}AKbbgdm8k!BrUhvwa%qgOGO%|GfU|$a?F0kRDSn6Tj#)wTk;;~th+g1MwWOS zi=NY|XFYr^I4H5VtAYMxk{Ts+(KpLY(BEYUYl?3u*MA3KyR7d^qB{&{H1%OOKRGwH z-4p{7&NVkzEnZ1JhwRavmcbLP6m?iP*r9nR5F58z#5R8M={^jmiDLN&p?TA9YjSg*~NH4t@)XpPb~Y_%O&nK;c3ekERS8wR>9o$32+LsElc`7 z=dA;Cw{HXZr_{v5_d$qOv#+vaS2>pKa;2?Kt?G6fOC@^5<^7!7lLF^Q9!^|3BfswF zEnWL%&t8XD(8|}3t9)zBlI*BUFb~lI0&{8Dk~JS(Zj46V3Db#vP{X@R0eNxWX%snBTu;Qt9$}W30uUG}1(_UH zF~yCvbgf+7?Cq&Nkg(qWZ5}1F9+CfR>2ziHjMys};Fcgh6uDt1U|IcZvXx>V*3>%r z>QplrUzoi;#Rd&O@@D#r>pTPMKzE+t^}YT6~?*VlhpiBQi#@*drRl+Vx5! z4mvYm=M=0fdnQBm$--&q#{TC~XI{J7Axg4)B4{~HSM!(K&Ox2VOAN)`lM>{0Y(Qu2 z`&#AWSzfND+TFC+mR&joPson|z{q1;qz8P$+Su0uc6{i|)Y$CG=I{B?g4(Jj7Vad1F4PHeJw)5|MrMVm5 zVc5MRAAI3imp$ovypISe{oel^Xd|B%yjV9M@#7&#rXFu~BwJBFSt>(&2zsb`I5qnq zz5k}xvC=7C8t_=OK1>_|Eb^1dLG5S#m`VuQmyg;lWk+saSEQRbHphvmoPqd<-3n;7 zq7fO>C*CPbF)15f90Oc9RSzByb{1|@Yw|BOStH9-tG2HyZ26}RYM|$+Q{7nY8fXZ7 zK6_wRB;bDbv;&P#^OK3vR~8(fkxEUKKI*x$?E_`D85rmLoR@hi_ueZD+Qn6tfFJUz zTC2#4)zbj9&YZ0AVx;_}w)Z)vIk1?e$-G?62|6q%f6ScOrR#KGsEQ)_5`IwPpx-3R z^^Ms`S;eg;5}k($wv!j@fml4SHqo>|icORh&pJ#_%(b zw$;y|I@!*^KO5&l$CAt*RW7Cdb(V#`;% zl9a5+{ZQR49<7G5mNXV1z$-KV4V9sHXWLPZ`T&^RMwLzWSjDMsvD`Bf2?k%|t*cEv zbv)dCj|{`XxrF}>8lJYRMc(kPx?Gc(sv^L@QR+Av@3M2ECTI}Q*rJVawB~9&4f;2k z3|CKRzj+grh{x-?u~^mPE6;f5@fh+sW?Zm@&=I0ZP>0}Uulacx)Gb?;zC}gV1~oz6c?iHRT z)ods_qFh>mtQIiW4dWcM&IY^UTC_!aE^~4*z;fJcnul-!&5tW#2r|JO{L4O$TFk2M zD~d(*KySU5!xv?F_^7ROz#Eh_VRx#11#&AOC_TICwg~HTQ_&UV!|VuQb5thbu>F{L zg}X$b^5qrg2|GC}(;7LwIjG)dfGLNC*1a)ErFa2SjL)gj>-v}6rSVdJsTQ{XMus?r zRxXC{4r|d}_ivs3DnT3asW%=TgSMu}__)&$`tn!$#s^F3y8FLhS#cDeEEdCmy!VvF z|5ssO9TjEw{mak{EV?_TVP=>aW{?I6MMAnmLWCD->4)yFp-Vzq1nF+2LqQN}P*GYz zLAm4id+&R%_*?5ff6e;Lj&nX|?`NI0&fd@2{FJ>c7H}e>dt(94Cz|H}%I<)ZL@w~A zdtiCDC)u5#rZzRDp8=9@?;L!6-5cDnfU&sKX#gYxCA*ZC-3OOOTja3|Q8A)tPt4V~ zaye>SkSbS7_3uCCOL4xa)YHAN@W|;Q6Wk0@?8oeWS_oUqHKZ!Br;hphl)#En)5Z|Pl_Q~4?`pfCF4chG@l_T(y5RpqA z+r8Wm%%J*pkz5&~X$GN;t~(JIOhbVpyIrfF0r1W6+SwPoW&s23Ia$Zwh7#YcWpPFP zT%I^RfVU=t`&}=;RJwD#a9Y^#tiRbDm}a{;@bwq^c0!;{W#cg6W54pmS2r9;O?Ot+ z?d+qQ!)@8y(j4FS+&HS-ctLJ>Wnj8rkxcrn;QokzD`IzxW>rik!*X?Fw-!{{p{?bb9SV;<1FB#SbRw3a$;>`jqeN-OLu_I@VYAB zZnMe_(euNmrrTP(6Z^G4e&oxL(jUC{d#LrkqQg*cXkjs{=fRSi#a$}@@4i~U+!x|K z5IKXy;E0nawuUmrrU`ZLSJ96TTG4`+s4f}6F7fT&`-HLSx^G5pw+wt==QYGF%~qR9 zv&4?Hnqz3!jTX`_o_AB^#~br5Uku#PrIt$H?%c_Bz7XtS-h1^uPx60A6R^fXXZ>vYLqRRI{ZZFqf2dactPANY1vci98e45Qos%{J zA|T;ld_pnI+d}U6Yx37QsW}vOIBgSV(n>mB}oa#^Jb>nMYmnGC+p*3 zEnmzMnbJ4;-&duZ>r$YS9xhDj=8kq>4Y>nGeR^&mqrmD!c02S*H_AuTG(W?K_hm5` zybF~|THr<*lW(r3?>m_ia!*W}979ap4<=2Q!wH;d4h{^!6(nc#5ox^abojngpX(Z% z7tVt?^?abGKYh0zrk?n31Ur8kt5@fnO`i~-XwiF^ZeVj&gYbTK(*~2_I%iS+&`T9a z@R0P-j~q*(pq4Bfm~46Ipgidsy&+KJ+rGG6Yt<*~>`1O^wX78SW3o*6Le58@GJaXL zj3wgBayy18kLwihm^ye8KJTv**woRL^j+4hMaS*Vq1Ez+f8(t8Yu;7rm~sD-Acwh6 zi#jMtt=Ja_Qe!?&4+JwWkA6%liA3E8at9IvO!ZDfS+7=vwg@MDuM7v+$|Ao$dC2gH zsGR%237Kmu{S+*B_!9dCx|&-9QEZWk;@w)tMpy6PC1&-ls4wv%wel`rV%BfU-Wy5I zCUw@Tq_$|O#?VDD_!c?_-E_0d42Dzvuy9bnJ$EYF9wa5{mXLikklN03B9dGE958uO z!@jZ#)5`HE6&g3%f4}~=+J=rlN&lhv+fysU#-E=ryiPK|IBfU%^JltzFQ$Z;`k=If7H^+&ZZmT0 zghH@Eb3U4=2>kWkIZ`}BeD`(Oj-S`%X2pr)%fujqaZsgQ)XlGmL?(^_59vr2Pq|yd z#!~NnH1`Z+CccdZwk=sP1w6W1Fig=ukB$2o6yeT%R}v%ERf|2+c-^>X>eGN~`)GG= z(MIrHrrl&HX_dX+Tf1YW-FtW!csHBLYaOy!)b|*-$f#qSM)7CzG__^OO&H)hnMVc z7oF@l&r&b-ejiM?D-RRDDL$F`q;Ek3Zk(He1Z;TGDBt>J}56?4FXk7L*bEF@beRPY` z_0F+|Lyg(FxxYnrIK7ts7y>l5$4<>Ac4k{5am(^9xf}J-j=3RgPv)uozif)V{q@)c zfxKZR^T0oWPPXmCxI+(%pRhOwR8Vc&oAiRS(0k-Dli}bMPT)r4;^lP%niI)NM*=-p2DyL26j zi{>uyAx}`{go)7N*JPCStWxHgxeoRK?SE@!|IOT1k01toFYJT^+Jdq8wPj|l`Jm2xs9f&S)-*ml zQI6%aP32segH6(>VKApg! zlp)WVY+0Zlf0uNPW-we+1K9JpN<4_zY7>9$0sE4aC_34NT0ZE0s@*)CS2yC#ayG%T zX&(uW4)Ap{mAUi9J?_a)V?f&3v*JA|F|-v+%FN>SQ&~szuhZYXEidxr8!pV;=JDPs?H-twhn>^F-#mSm3mgI>wi!tFzBDVN*Ygsalhcc3 z`s7fJ$E7WWU;Oc$5;&Vmn+R6tZN^a?gfMciF~+Vjl2ehO;(G9xN(`>4D6qKx<}-R>8=R)$|>1%ZaBgT9-O+97;3Tw4H_DL*G!4R_6tJA{~~mk*yiF>KEj zM6HI(R+HCZQ~`$NXZvFd%~7hDdG#C|JZXRpyP5Xt!<+r-C;`?fU)ETUioqrARe{jh z6^-sa!L$*ree-bDy~Dg9Ky;*lbTjaH=$jne(I$eUDnNS9OA^3+^teE2(FBtA(jWyh z2ta(nDiyKG+T7(Dc+X0~(Zri@>Trp4re^}+2*;}-{#BntZpY#g(926YBj&+87v407 z(yHRhn92`iS%fUl<6mcyF~5SO7sb)=@%GVl(qxfs$uDZKF|Lz)_*>;(Fr~aJ5IWbn zbEc`jl3n#x%ss5_%8awrHAkg7E zkzLDN|lOa0#`8E`i7^QQF3U1dQT(at|3w&dC>DQ@A+FR z966)mPn=Yr$oSMrm@_aqINV7zq(H*XMYBhgcmDvydf?SvrV%uaouyOZ*`qH47k()h zS*C#}xPw>1qev^B5X)UI=et4qX+E4$T?SM3rJgmjz>a)2GB7BGT2dr+1YTYnmuo-0$mh5+sj3cer{)l8*(??*TRMoOpW`2 z74@s4vm#(i{CGs1mRrLz5|RO4OQx!c_3=>Cx04q4aViTvckgT9+!`_ni3nfpS3cG< z9K~gfQR5BX)>eqcA?dRQ&RZ;l^>`}~iE__WIEz0Dlm2v{CQc@r(z;P&bV2+r>?g;( zJH?m&C17zwNp5s;_rRocQ_#!+Cl~*FYdXFG)LKxmxrsP3W_sx5Q=A)uARKuvya%!B z)7I+2cVpy=&kgIYiga;Pb6hfLSF2Xn@STt1*n(q5>AW(-ax+9*0A})c>uIzd*j+^f z4PCS6)T_rYwobXs_o?cM(k{{HfZ;m)W*0(L?qss9sW-uPc5mISxD|-3@p{W_Xw^wr zZ++N63E0!(U=~7;9Oo}{*HCgt-^c7(Q}bOKMW*ZtX?C(l&mF~eoL>c54-hoa533Op^$G?I)do_{xVtLFByc$lI`!!V9<^%Fx@L=Q zfw^ldM&9r{O;VQ4*g~cq8BKB)$-u;hDZLST+Fa+7l2@g0S-e95U*`H5&aRL4dv}kR zlis+>5-Dlec_A`qv@$pO8u2fW6Ne^i0FT$cMt@DSO zY=B~ebHmFADsXmJUns#)?ftG+`!k!pe9*^2+42j+J_NL2W~KnjxTktn_cbAbsRK&? z><*pPo1Cdi{>3riA%D0cp$%1uc5n_TLraB3fDldqP_kS}@o~x%zQPl@jXTY{7Olp6 z*O8VMMOMd4O6iL!4#>KH#T|EbJF({_)q9#>>N7o5UnOUTt-!r&Q6oYS`@j(Y)MZb0 zmyO}Pkh|869Og-FAOwsCY%>+?FkzEBH{JyQsJLWO z0w+rY^r@(ovl+*-2$x!z>*|x#!sx{=SSX}>ugWtDzx@PtiNKxOV;au|xi1}eM3}RB zJxg+=ddlYF6#$~Cx6hc<7LGxm?tUkbuZRiTvldlH50jaXykLJ*Gwu~_pa{1MN$g-a z+gG<-HTq$8FwJ^`FV(Xc*) za-rx@+Iw_#oEkB=`%58anv@KN_msCO-Lh07tSeU?n>Of>tE3hYN26yHlck))o?48T zyv$mX@8^}{U*-rk3m!aB8Re3^==Hn|6aN`zJFP`UZEm(OOK@$bxl%NmbqYMtR zd+;LYH7nD$jqrY1hr;ChY8Ntmss21#38JP#)9hW0bc3w6Onk0?`_@WYKAZXW6p6b* zO5dLEcgWhLig7Oml^O?_P-wL`_#d^``l+eu^K<%&1kgaC$Pn@p(WtmISGqtMWfq-~ zAugj$jFOzhu`quTo~9~>&=vx$2!>r%*;;f^;yq6-t|@onJvw0xLCL6!@U*TJekqr^ z+0}c`)Z?2fX}$V`6KIH{*@Q@mlCIv+D?4A);53ivZKV^^nQptILZOW_J=KHSyV9tm z_?uZPUIC2>m3xb^^Ju9?v4hWDJ&hgSGEegnMHL@Ftg%XW-c~{KCo?&L-r#pJ_&UsM zvb_h2D4`qReRnHbs;FPu(!oWgL$ojN{F>M7aV(Hs(f^U|j?0c?U^N@Go?KC!{GsY= z#&;9KNv@MGq(@wnT{%@>X#z)uC0Ta)_Jz^j0ggoOGz1p>LHnewSMM3t_UyYUvmXW! zQ(ZhdxDXWN^F{u;GA*QH0|?jzs-8WgjEam5lFyn+VwY{f4?ag7d2PceIST4%DLJVK zd{^l4Z0H9F1eK=|l(cHz7WKgu>fF_iEdg^m;+G7Lj`-<(AN-3bAl5s3p}4|}%{itd z3-fN((uc({{~Yp(CCrh_?Jm=f`G1$2|E#^vF)=w126`GM=hMqY4NwWlyD`(Xirf&2 z=Gm}`766~BGS-}T6ji|2EDt$xC{45MKh_gNz2EL)z=a#M*sjz_`0xP~`Y1R!X)r{lW ze)O2vvp34qsvSOF&3}gPFk)O5ku}q;8;ZE+@{UCFCNVRI1R%kGp-r|}@~VeMNB4g9 z7%ZGp!+?y3gmj(Oj<8N`NRYDbDX}hP7E~svXFm-+_qd2LdCAjhzT8{%9A=bI5t=cW zHLTHX_N&pMSb0;2#msA@9^JjK40TS}wQPtZ=0ldU5Y`;l?qoVpd5Y#OOKiuJeQu9s zZdI*QUcB|O2pIlUMZWyl&%eLAbGP**ASJJpTyl+FK1t;{_}q_{J2kp9Yxb$98@p(9 zOl(oV9u+=8OD;;2o`Gk;Q->Mcuklm2&@Z4r^YRwuW$;xZ^6Mj;jLFg%yx?izlim%| zc@eP7XrXwueZ_jwqx8H^5(yKzqrup8p^{>|q@~)ZY~Y>$<+&>EyGfjvl$#3~t*Bhh zTJ-=^sj52=bk5E$5f5&B1|Ecf3G8@&FeV<_7RGzhugychT zHQ97rb}v2EXpAVSZl!ZhG^Lm#S6BxtD-{*JvLNxaN4gvp?$P%oF4}0R6-pt?399*w z*T$R>1IQ|OtF8AFS=}_W>Oi>vqrFXvR^Mp<5*GvHRqqkfbwaj@{8b-KkshQTXIHqdgEUfJ!_^EwQNM53 z`ze5Di~ruM_Zh(ePCVj}Spb|zfpgH%iDqoyxHt9SiHjK{oVBFiGLc zgzpaUQ=)C@+^LyV>87<$$;yN2?k~6s29PQwQfjr{ZQ?E9B}v^$yRE)UpiH1hkTbfm zrN1RX8xOm3c&Aqcp`?OEli;TGN}f#KQUowTzf>V)Kl=4Fh~=Ltp5*5{n|Hln4dvbl z+b|&fvF!7)Rr$Q$j3AzxCrx2&`^(y)l&k>w@MZ-6+RK`@;^wP4E#b%`3pduz(6K8H znAX6Hzw5q`zgxwAca@>x=zq(;kpFEp!%%pE2-9v3vSU8Dg7ok;HI#KQ@@^mt8YJ{u z0T>dFX>bD-f)E%TcMuK1f9k{18tAxN;@m;qAZ%gRZBLN;zXs?qHJ%^}s{eSo$N7JH z&9FAcJwYM_h~Ks`H={wi;t~)j1dc#JBt;=8eh7qL5G;Q8k*%_|ryZw&vJ?ygK|=mt z5lmM!wu%gaS&0T2<3iCGR166F(G{${-w&q?C-^@RDK9{_`2pDh9c z|I04|3i)f&}n}3G{X5kq9iMzXy+viGQg_V&`^!^jHjjoq8k+{ySg) zm^l_h{pAED`Bz*aQRqLG_dhX-f}s(RYX-5H9K-AaOnav1$ER4x`YBzgR${p?`%87K2~6hsLJ$bym@61meFK&%gBlj?3%s1S|%F zqcB#9AUSI!92?#!8*4iR5^iIIvb%4MwP6EAKw$UnCG1fWvS8`|uL!64??zw`PiuEi VA9p)@FxEaC0Ri*z-O^G4|1WsYidp~w diff --git a/examples/sample.source.MHEG5/Makefile b/examples/sample.source.MHEG5/Makefile index 7fe0f49d3..43e6b90cf 100644 --- a/examples/sample.source.MHEG5/Makefile +++ b/examples/sample.source.MHEG5/Makefile @@ -472,7 +472,7 @@ InterchangedObject.c: ../ISO13522-MHEG-5.asn regenerate.Makefile ASN_CONVERTER=../../skeletons/converter-sample.c $(TARGET).o: $(ASN_CONVERTER) - $(CC) $(CFLAGS) -Dasn_DEF=asn_DEF_InterchangedObject -o $(TARGET).o -c $(ASN_CONVERTER) + $(CC) $(CFLAGS) -DPDU=InterchangedObject -o $(TARGET).o -c $(ASN_CONVERTER) distclean: clean rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index 6eb381fff..8ea848d24 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -375,7 +375,7 @@ Certificate.c: regenerate.Makefile ASN_CONVERTER=../../skeletons/converter-sample.c $(TARGET).o: $(ASN_CONVERTER) - $(CC) $(CFLAGS) -Dasn_DEF=asn_DEF_Certificate -o $(TARGET).o -c $(ASN_CONVERTER) + $(CC) $(CFLAGS) -DPDU=Certificate -o $(TARGET).o -c $(ASN_CONVERTER) distclean: clean rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) diff --git a/examples/sample.source.TAP3/Makefile b/examples/sample.source.TAP3/Makefile index 24833598b..7b4f39776 100644 --- a/examples/sample.source.TAP3/Makefile +++ b/examples/sample.source.TAP3/Makefile @@ -702,7 +702,7 @@ DataInterChange.c: ../tap3.asn1 regenerate.Makefile ASN_CONVERTER=../../skeletons/converter-sample.c $(TARGET).o: $(ASN_CONVERTER) - $(CC) $(CFLAGS) -Dasn_DEF=asn_DEF_DataInterChange -o $(TARGET).o -c $(ASN_CONVERTER) + $(CC) $(CFLAGS) -DPDU=DataInterChange -o $(TARGET).o -c $(ASN_CONVERTER) distclean: clean rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) diff --git a/skeletons/converter-sample.c b/skeletons/converter-sample.c index dd0efdcef..3a76b764f 100644 --- a/skeletons/converter-sample.c +++ b/skeletons/converter-sample.c @@ -1,10 +1,10 @@ /* - * Generic decoder template for a selected ASN.1 type. - * Copyright (c) 2005 Lev Walkin . All rights reserved. + * Generic converter template for a selected ASN.1 type. + * Copyright (c) 2005, 2006 Lev Walkin . All rights reserved. * - * To compile with your own ASN.1 type, please redefine the asn_DEF as shown: + * To compile with your own ASN.1 type, please redefine the PDU as shown: * - * cc -Dasn_DEF=asn_DEF_MyCustomType -o myDecoder.o -c asn-decoder-template.c + * cc -DPDU=MyCustomType -o myDecoder.o -c converter-sample.c */ #ifdef HAVE_CONFIG_H #include @@ -21,7 +21,12 @@ #include #include /* for _ASN_DEFAULT_STACK_MAX */ -extern asn_TYPE_descriptor_t asn_DEF; /* ASN.1 type to be decoded */ +/* Convert "Type" defined by -DPDU into "asn_DEF_Type" */ +#define ASN_DEF_PDU(t) asn_DEF_ ## t +#define DEF_PDU_Type(t) ASN_DEF_PDU(t) +#define PDU_Type DEF_PDU_Type(PDU) + +extern asn_TYPE_descriptor_t PDU_Type; /* ASN.1 type to be decoded */ #ifdef ASN_PDU_COLLECTION /* Generated by asn1c: -pdu=... */ extern asn_TYPE_descriptor_t *asn_pdu_collection[]; #endif @@ -66,7 +71,7 @@ DEBUG(const char *fmt, ...) { int main(int ac, char **av) { - static asn_TYPE_descriptor_t *pduType = &asn_DEF; + static asn_TYPE_descriptor_t *pduType = &PDU_Type; ssize_t suggested_bufsize = 8192; /* close or equal to stdio buffer */ int number_of_iterations = 1; int num; From 6ed22c69860e322c29471aa2d57f980c49a3d7ae Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 25 Aug 2006 04:56:21 +0000 Subject: [PATCH 1141/1469] per encoding git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1141 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/converter-sample.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/skeletons/converter-sample.c b/skeletons/converter-sample.c index 3a76b764f..e5ab8da13 100644 --- a/skeletons/converter-sample.c +++ b/skeletons/converter-sample.c @@ -52,7 +52,8 @@ static enum input_format { /* Output data format selector */ static enum output_format { OUT_XER, /* -oxer: XER (XML) output */ - OUT_DER, /* -oder: DER output */ + OUT_DER, /* -oder: DER (BER) output */ + OUT_PER, /* -oper: Unaligned PER output */ OUT_TEXT, /* -otext: semi-structured text */ OUT_NULL /* -onull: No pretty-printing */ } oform; /* -o */ @@ -91,15 +92,17 @@ main(int ac, char **av) { if(optarg[0] == 'x') { iform = INP_XER; break; } if(pduType->uper_decoder && optarg[0] == 'p') { iform = INP_PER; break; } - fprintf(stderr, "-i: '%s': improper format selector", + fprintf(stderr, "-i: '%s': improper format selector\n", optarg); exit(EX_UNAVAILABLE); case 'o': if(optarg[0] == 'd') { oform = OUT_DER; break; } + if(pduType->uper_encoder + && optarg[0] == 'p') { oform = OUT_PER; break; } if(optarg[0] == 'x') { oform = OUT_XER; break; } if(optarg[0] == 't') { oform = OUT_TEXT; break; } if(optarg[0] == 'n') { oform = OUT_NULL; break; } - fprintf(stderr, "-o: '%s': improper format selector", + fprintf(stderr, "-o: '%s': improper format selector\n", optarg); exit(EX_UNAVAILABLE); case 'p': @@ -161,7 +164,11 @@ main(int ac, char **av) { " -iber Input is in BER (Basic Encoding Rules)%s\n", iform == INP_PER ? "" : " (DEFAULT)"); fprintf(stderr, - " -ixer Input is in XER (XML Encoding Rules)\n" + " -ixer Input is in XER (XML Encoding Rules)\n"); + if(pduType->uper_encoder) + fprintf(stderr, + " -oper Output in Unaligned PER (Packed Encoding Rules)\n"); + fprintf(stderr, " -oder Output in DER (Distinguished Encoding Rules)\n" " -oxer Output in XER (XML Encoding Rules) (DEFAULT)\n" " -otext Output in plain semi-structured text (dump)\n" @@ -247,6 +254,14 @@ main(int ac, char **av) { exit(EX_UNAVAILABLE); } break; + case OUT_PER: + erv = uper_encode(pduType, structure, write_out, stdout); + if(erv.encoded < 0) { + fprintf(stderr, "%s: Cannot convert into Unaligned PER\n", + fname); + exit(EX_UNAVAILABLE); + } + break; } ASN_STRUCT_FREE(*pduType, structure); From 24238062e650e8e2a0ca67815888a60419db8bd4 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 26 Aug 2006 03:29:15 +0000 Subject: [PATCH 1142/1469] tolerate bit string extensibility git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1142 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 20492c073..15616ea25 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -246,12 +246,12 @@ asn1c_lang_C_type_BIT_STRING(arg_t *arg) { out_name_chain(arg, ONC_avoid_keywords); OUT(" {\n"); TQ_FOR(v, &(expr->members), next) { - eidx++; if(v->expr_type != A1TC_UNIVERVAL) { OUT("/* Unexpected BIT STRING element: %s */\n", v->Identifier); continue; } + eidx++; OUT("\t"); out_name_chain(arg, ONC_noflags); OUT("_%s", MKID(v)); From b9cdbb1be33de0b74eb01a408f31edcec807dcf4 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Aug 2006 02:12:49 +0000 Subject: [PATCH 1143/1469] test whether bit string values are identifiers git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1143 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_bitstring.c | 28 ++++++++++++++++++++++++++-- tests/109-bit-string-SE.asn1 | 16 ++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 tests/109-bit-string-SE.asn1 diff --git a/libasn1fix/asn1fix_bitstring.c b/libasn1fix/asn1fix_bitstring.c index 8297f276b..f8adc753f 100644 --- a/libasn1fix/asn1fix_bitstring.c +++ b/libasn1fix/asn1fix_bitstring.c @@ -1,6 +1,7 @@ #include "asn1fix_internal.h" -int asn1f_fix_bit_string_value(arg_t *arg, asn1p_expr_t *ttype); +static int asn1f_fix_bit_string_type(arg_t *arg); +static int asn1f_fix_bit_string_value(arg_t *arg, asn1p_expr_t *ttype); static void asn1f_BS_remove_trailing_zero_bits(asn1p_value_t *value); static int asn1f_BS_unparsed_convert(arg_t *arg, asn1p_value_t *value, asn1p_expr_t *ttype); @@ -22,10 +23,33 @@ asn1f_fix_bit_string(arg_t *arg) { } } + if(expr->meta_type == AMT_TYPE + && expr->expr_type == ASN_BASIC_BIT_STRING) { + ret = asn1f_fix_bit_string_type(arg); + RET2RVAL(ret, r_value); + } + return r_value; } -int +static int +asn1f_fix_bit_string_type(arg_t *arg) { + asn1p_expr_t *expr = arg->expr; + asn1p_expr_t *v; + + TQ_FOR(v, &(expr->members), next) { + if(v->expr_type != A1TC_UNIVERVAL) { + FATAL("BIT STRING value at line %d " + "is not an identifier", + v->_lineno); + return -1; + } + } + + return 0; +} + +static int asn1f_fix_bit_string_value(arg_t *arg, asn1p_expr_t *ttype) { asn1p_expr_t *expr = arg->expr; int r_value = 0; diff --git a/tests/109-bit-string-SE.asn1 b/tests/109-bit-string-SE.asn1 new file mode 100644 index 000000000..a07f7a1c1 --- /dev/null +++ b/tests/109-bit-string-SE.asn1 @@ -0,0 +1,16 @@ + +-- SE: Semantic error + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .109 + +ModuleBitStringExtensibility + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 109 } + DEFINITIONS ::= +BEGIN + + T ::= BIT STRING { one(1), ... } + +END From adf419b9e14b8de6c6f3f0ba99e8e4c9704a9dec Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Aug 2006 02:24:24 +0000 Subject: [PATCH 1144/1469] identifier name clash git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1144 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_bitstring.c | 17 ++++++++++++++--- libasn1fix/asn1fix_enum.c | 3 +-- libasn1fix/asn1fix_integer.c | 15 +++++---------- libasn1fix/asn1fix_misc.c | 3 +-- tests/113-bit-string-SE.asn1 | 16 ++++++++++++++++ 5 files changed, 37 insertions(+), 17 deletions(-) create mode 100644 tests/113-bit-string-SE.asn1 diff --git a/libasn1fix/asn1fix_bitstring.c b/libasn1fix/asn1fix_bitstring.c index f8adc753f..e2f2434a8 100644 --- a/libasn1fix/asn1fix_bitstring.c +++ b/libasn1fix/asn1fix_bitstring.c @@ -36,17 +36,28 @@ static int asn1f_fix_bit_string_type(arg_t *arg) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *v; + int r_value = 0; + int ret; TQ_FOR(v, &(expr->members), next) { + /* Check identifier uniqueness as per 21.4 */ + ret = asn1f_check_unique_expr_child(arg, v, 0); + RET2RVAL(ret, r_value); + + if(v->expr_type == A1TC_EXTENSIBLE) { + FATAL("Extension marker (...) is not allowed " + "as a BIT STRING NamedBit at line %d ", + v->_lineno); + return -1; + } if(v->expr_type != A1TC_UNIVERVAL) { FATAL("BIT STRING value at line %d " - "is not an identifier", - v->_lineno); + "is not an identifier", v->_lineno); return -1; } } - return 0; + return r_value; } static int diff --git a/libasn1fix/asn1fix_enum.c b/libasn1fix/asn1fix_enum.c index ce2fc2fc6..cf03914f5 100644 --- a/libasn1fix/asn1fix_enum.c +++ b/libasn1fix/asn1fix_enum.c @@ -34,8 +34,7 @@ asn1f_fix_enum(arg_t *arg) { */ if(ev->expr_type == A1TC_EXTENSIBLE) { if(ext_marker) { - arg->eh(1, - "Enumeration %s at line %d: " + FATAL("Enumeration %s at line %d: " "Second extension marker is not allowed", expr->Identifier, ev->_lineno); diff --git a/libasn1fix/asn1fix_integer.c b/libasn1fix/asn1fix_integer.c index 8a1449118..0302acd25 100644 --- a/libasn1fix/asn1fix_integer.c +++ b/libasn1fix/asn1fix_integer.c @@ -38,20 +38,17 @@ asn1f_fix_integer(arg_t *arg) { * Found "...", check correctness. */ if(iv->expr_type == A1TC_EXTENSIBLE) { - arg->eh(1, - "INTEGER %s at line %d: " + FATAL("INTEGER %s at line %d: " "Extension marker is not allowed", expr->Identifier, - iv->_lineno - ); + iv->_lineno); rvalue = -1; continue; } if(iv->Identifier == NULL || iv->expr_type != A1TC_UNIVERVAL) { - arg->eh(1, - "INTEGER %s at line %d: " + FATAL("INTEGER %s at line %d: " "Unsupported enumeration element %s", expr->Identifier, iv->_lineno, @@ -62,8 +59,7 @@ asn1f_fix_integer(arg_t *arg) { } if(iv->value == NULL) { - arg->eh(1, - "INTEGER %s at line %d: " + FATAL("INTEGER %s at line %d: " "Value for the identifier %s " "must be set explicitly", expr->Identifier, @@ -84,8 +80,7 @@ asn1f_fix_integer(arg_t *arg) { } if(iv->value->type != ATV_INTEGER) { - arg->eh(1, - "INTEGER %s at line %d: " + FATAL("INTEGER %s at line %d: " "Value for the identifier %s " "is not compatible with INTEGER type", expr->Identifier, diff --git a/libasn1fix/asn1fix_misc.c b/libasn1fix/asn1fix_misc.c index 72317aa24..9e8cc07fb 100644 --- a/libasn1fix/asn1fix_misc.c +++ b/libasn1fix/asn1fix_misc.c @@ -294,8 +294,7 @@ asn1f_check_unique_expr_child(arg_t *arg, asn1p_expr_t *child, msg = opt_compare ?"Expressions clash" :"Identifiers name clash"; - arg->eh(1, - "%s: " + FATAL("%s: " "\"%s\" at line %d has similar %s with " "\"%s\" at line %d", msg, diff --git a/tests/113-bit-string-SE.asn1 b/tests/113-bit-string-SE.asn1 new file mode 100644 index 000000000..110e7644d --- /dev/null +++ b/tests/113-bit-string-SE.asn1 @@ -0,0 +1,16 @@ + +-- SE: Semantic error + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .113 + +ModuleBitStringExtensibility + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 113 } + DEFINITIONS ::= +BEGIN + + T ::= BIT STRING { one(1), one(2) } + +END From ade8b310cf4e34c466ff10d9583102870768728f Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Aug 2006 02:25:55 +0000 Subject: [PATCH 1145/1469] name module git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1145 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/113-bit-string-SE.asn1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/113-bit-string-SE.asn1 b/tests/113-bit-string-SE.asn1 index 110e7644d..79d456528 100644 --- a/tests/113-bit-string-SE.asn1 +++ b/tests/113-bit-string-SE.asn1 @@ -5,7 +5,7 @@ -- .spelio.software.asn1c.test (9363.1.5.1) -- .113 -ModuleBitStringExtensibility +ModuleBitStringIdentifierUniqueness { iso org(3) dod(6) internet (1) private(4) enterprise(1) spelio(9363) software(1) asn1c(5) test(1) 113 } DEFINITIONS ::= From f04c795a04f1b9d790007a4a77c4fe10236aa66b Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Aug 2006 02:30:41 +0000 Subject: [PATCH 1146/1469] non-negative value git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1146 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_bitstring.c | 19 +++++++++++++++++++ tests/114-bit-string-SE.asn1 | 16 ++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 tests/114-bit-string-SE.asn1 diff --git a/libasn1fix/asn1fix_bitstring.c b/libasn1fix/asn1fix_bitstring.c index e2f2434a8..f3d5ad731 100644 --- a/libasn1fix/asn1fix_bitstring.c +++ b/libasn1fix/asn1fix_bitstring.c @@ -55,6 +55,25 @@ asn1f_fix_bit_string_type(arg_t *arg) { "is not an identifier", v->_lineno); return -1; } + + /* 21.1 */ + if(v->value == NULL) { + FATAL("BIT STRING NamedBit value at line %d " + "must be explicitly specified in braces", + v->_lineno); + return -1; + } else if(v->value->type == ATV_REFERENCED) { + /* Resolve the value */ + if(asn1f_value_resolve(arg, v, 0)) + return -1; + } + if(v->value->type != ATV_INTEGER + || v->value->value.v_integer < 0) { + FATAL("BIT STRING NamedBit value at line %d: " + "non-negative integer value expected", + v->_lineno); + return -1; + } } return r_value; diff --git a/tests/114-bit-string-SE.asn1 b/tests/114-bit-string-SE.asn1 new file mode 100644 index 000000000..5006b0674 --- /dev/null +++ b/tests/114-bit-string-SE.asn1 @@ -0,0 +1,16 @@ + +-- SE: Semantic error + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .114 + +ModuleBitStringNegativeInteger + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 114 } + DEFINITIONS ::= +BEGIN + + T ::= BIT STRING { one(-2) } + +END From fad6952dff40817aa834148c05769fa700e0878e Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Aug 2006 02:33:35 +0000 Subject: [PATCH 1147/1469] test referenced value in BIT STRING git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1147 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/115-bit-string-OK.asn1 | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 tests/115-bit-string-OK.asn1 diff --git a/tests/115-bit-string-OK.asn1 b/tests/115-bit-string-OK.asn1 new file mode 100644 index 000000000..54334703a --- /dev/null +++ b/tests/115-bit-string-OK.asn1 @@ -0,0 +1,17 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .115 + +ModuleBitStringReferencedValue + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 115 } + DEFINITIONS ::= +BEGIN + + T ::= BIT STRING { one(a) } + a INTEGER ::= 123 + +END From 073a7c746b83e461e0e15e5278925f4d833a8be0 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Aug 2006 02:45:44 +0000 Subject: [PATCH 1148/1469] declashing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1148 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix.c | 2 +- libasn1fix/asn1fix_bitstring.c | 16 ++++++++++++---- libasn1fix/asn1fix_enum.c | 2 +- libasn1fix/asn1fix_integer.c | 5 +++-- libasn1fix/asn1fix_misc.c | 25 ++++++++++--------------- libasn1fix/asn1fix_misc.h | 10 ++++------ tests/116-bit-string-SE.asn1 | 16 ++++++++++++++++ 7 files changed, 47 insertions(+), 29 deletions(-) create mode 100644 tests/116-bit-string-SE.asn1 diff --git a/libasn1fix/asn1fix.c b/libasn1fix/asn1fix.c index 05118682f..8d2317f49 100644 --- a/libasn1fix/asn1fix.c +++ b/libasn1fix/asn1fix.c @@ -385,7 +385,7 @@ asn1f_fix_constructed(arg_t *arg) { } /* Check identifier distinctness */ - ret = asn1f_check_unique_expr(arg, NULL); + ret = asn1f_check_unique_expr(arg); RET2RVAL(ret, rvalue); /* Fix extensibility */ diff --git a/libasn1fix/asn1fix_bitstring.c b/libasn1fix/asn1fix_bitstring.c index f3d5ad731..5f30ea4f9 100644 --- a/libasn1fix/asn1fix_bitstring.c +++ b/libasn1fix/asn1fix_bitstring.c @@ -32,6 +32,10 @@ asn1f_fix_bit_string(arg_t *arg) { return r_value; } +static int _compare_value(asn1p_expr_t *expr1, asn1p_expr_t *expr2) { + return expr2->value->value.v_integer - expr1->value->value.v_integer; +} + static int asn1f_fix_bit_string_type(arg_t *arg) { asn1p_expr_t *expr = arg->expr; @@ -40,10 +44,6 @@ asn1f_fix_bit_string_type(arg_t *arg) { int ret; TQ_FOR(v, &(expr->members), next) { - /* Check identifier uniqueness as per 21.4 */ - ret = asn1f_check_unique_expr_child(arg, v, 0); - RET2RVAL(ret, r_value); - if(v->expr_type == A1TC_EXTENSIBLE) { FATAL("Extension marker (...) is not allowed " "as a BIT STRING NamedBit at line %d ", @@ -74,6 +74,14 @@ asn1f_fix_bit_string_type(arg_t *arg) { v->_lineno); return -1; } + + /* Check value uniqueness as per 21.4 */ + ret = asn1f_check_unique_expr_child(arg, v, + _compare_value, "value"); + RET2RVAL(ret, r_value); + /* Check identifier uniqueness as per 21.5 */ + ret = asn1f_check_unique_expr_child(arg, v, 0, "identifier"); + RET2RVAL(ret, r_value); } return r_value; diff --git a/libasn1fix/asn1fix_enum.c b/libasn1fix/asn1fix_enum.c index cf03914f5..570d23ae1 100644 --- a/libasn1fix/asn1fix_enum.c +++ b/libasn1fix/asn1fix_enum.c @@ -119,7 +119,7 @@ asn1f_fix_enum(arg_t *arg) { * 1.4 Check that all identifiers before the current one * differs from it. */ - ret = asn1f_check_unique_expr_child(arg, ev, NULL); + ret = asn1f_check_unique_expr_child(arg, ev, 0, "identifier"); RET2RVAL(ret, rvalue); } diff --git a/libasn1fix/asn1fix_integer.c b/libasn1fix/asn1fix_integer.c index 0302acd25..a5d0b6e74 100644 --- a/libasn1fix/asn1fix_integer.c +++ b/libasn1fix/asn1fix_integer.c @@ -92,12 +92,13 @@ asn1f_fix_integer(arg_t *arg) { /* * Check that all identifiers are distinct. */ - ret = asn1f_check_unique_expr_child(arg, iv, NULL); + ret = asn1f_check_unique_expr_child(arg, iv, 0, "identifier"); RET2RVAL(ret, rvalue); /* * Check that all values are distinct. */ - ret = asn1f_check_unique_expr_child(arg, iv, _compare_value); + ret = asn1f_check_unique_expr_child(arg, iv, + _compare_value, "value"); RET2RVAL(ret, rvalue); } diff --git a/libasn1fix/asn1fix_misc.c b/libasn1fix/asn1fix_misc.c index 9e8cc07fb..4af0fd8c5 100644 --- a/libasn1fix/asn1fix_misc.c +++ b/libasn1fix/asn1fix_misc.c @@ -236,15 +236,14 @@ asn1f_recurse_expr(arg_t *arg, int (*callback)(arg_t *arg)) { * Check that every child of a given expr has unique name or does not have any. */ int -asn1f_check_unique_expr(arg_t *arg, - int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b)) { +asn1f_check_unique_expr(arg_t *arg) { asn1p_expr_t *expr; int rvalue = 0; TQ_FOR(expr, &(arg->expr->members), next) { if(expr->Identifier) { int ret = asn1f_check_unique_expr_child(arg, expr, - opt_compare); + 0, "identifier"); if(ret) rvalue = -1; } else { /* @@ -263,9 +262,11 @@ asn1f_check_unique_expr(arg_t *arg, */ int asn1f_check_unique_expr_child(arg_t *arg, asn1p_expr_t *child, - int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b)) { + int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b), + const char *opt_property_name) { asn1p_expr_t *expr; - int rvalue = 0; + + if(!opt_property_name) opt_property_name = "property"; assert(child); assert(opt_compare || child->Identifier); @@ -290,26 +291,20 @@ asn1f_check_unique_expr_child(arg_t *arg, asn1p_expr_t *child, } if(ret == 0) { - char *msg; - msg = opt_compare - ?"Expressions clash" - :"Identifiers name clash"; - FATAL("%s: " + FATAL("Clash detected: " "\"%s\" at line %d has similar %s with " "\"%s\" at line %d", - msg, expr->Identifier, expr->_lineno, - opt_compare?"property":"name", + opt_property_name, child->Identifier, child->_lineno ); - - rvalue = -1; + return -1; } } - return rvalue; + return 0; } int diff --git a/libasn1fix/asn1fix_misc.h b/libasn1fix/asn1fix_misc.h index a90c5bedb..6dcd220d1 100644 --- a/libasn1fix/asn1fix_misc.h +++ b/libasn1fix/asn1fix_misc.h @@ -11,12 +11,9 @@ int asn1f_recurse_expr(arg_t *arg, int (*f)(arg_t *arg)); /* - * Check that every child of a given expr has unique name or does not have any. - * If opt_compare == NULL, the default comparison of the argument's - * names (identifiers) will be performed. + * Check that every child of a given expr has unique identifier. */ -int asn1f_check_unique_expr(arg_t *arg, - int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b)); +int asn1f_check_unique_expr(arg_t *arg); /* * Check that every preceeding child of the given expr is not @@ -25,7 +22,8 @@ int asn1f_check_unique_expr(arg_t *arg, * names (identifiers) will be performed. */ int asn1f_check_unique_expr_child(arg_t *arg, asn1p_expr_t *child, - int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b)); + int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b), + const char *opt_property_name); /* * Return number of children. diff --git a/tests/116-bit-string-SE.asn1 b/tests/116-bit-string-SE.asn1 new file mode 100644 index 000000000..f5967c041 --- /dev/null +++ b/tests/116-bit-string-SE.asn1 @@ -0,0 +1,16 @@ + +-- SE: Semantic error + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .116 + +ModuleBitStringSameValues + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 116 } + DEFINITIONS ::= +BEGIN + + T ::= BIT STRING { one(1), another(1) } + +END From ec4d87307195be5609df9a4e7468543f80396817 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Aug 2006 02:47:11 +0000 Subject: [PATCH 1149/1469] date git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1149 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 1cba2fbc9..d2c2c9e99 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9.21: 2006-Aug-17 +0.9.21: 2006-Aug-27 * skeletons/standard-modules directory is now used for standard types. * Fixed class field access problem (Test case 98) From 6a257b72717b9a7615093621f0ab24c1d01f62be Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 28 Aug 2006 06:14:14 +0000 Subject: [PATCH 1150/1469] update git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1150 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/README | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/asn1c/tests/README b/asn1c/tests/README index 5d37c1117..1d7b4c902 100644 --- a/asn1c/tests/README +++ b/asn1c/tests/README @@ -1,8 +1,8 @@ -This is a very funny test automation. The name of the check-N.c file is used -as a pointer to the file in ../../tests/N-*.asn1. This file is compiled -using the asn1c compiler from above directory. Then, everything is build -together in a temporary directory with a check-N.c used as a testing engine. +The name of the check-N.c file is used as a pointer to the file +../../tests/N-*.asn1. This ASN.1 file is compiled using the asn1c compiler +from the above directory. After that, everything is coompiled together +in a temporary directory with a check-N.c used as a testing engine. For manual execution of a specific test case, use the following pattern: From f9e71c73ad96d0aead1912051a47997cee2bf439 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 31 Aug 2006 01:02:20 +0000 Subject: [PATCH 1151/1469] update git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1151 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/data-70/README | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/asn1c/tests/data-70/README b/asn1c/tests/data-70/README index 4a47a5108..91019add6 100644 --- a/asn1c/tests/data-70/README +++ b/asn1c/tests/data-70/README @@ -1,8 +1,8 @@ Mode of operation: - Each of the *.in files is XER-decoded, then converted into DER, - then decoded from DER and encoded into XER again, and compared - to the original encoding. + Each of the *.in files is XER-decoded, then converted into DER or PER, + then decoded back from DER (PER), then encoded into XER again, + and finally compared to the original encoding. Naming conventions: From e745fcdc3a8f971892891ab5af2ea85f61ec3782 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 5 Sep 2006 16:18:34 +0000 Subject: [PATCH 1152/1469] support parsing realnumber tokens in constraints git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1152 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_constraint_compat.c | 3 + libasn1parser/asn1p_l.c | 3345 ++++++++++++------------ libasn1parser/asn1p_l.l | 24 + libasn1parser/asn1p_y.c | 2032 +++++++------- libasn1parser/asn1p_y.h | 381 +-- libasn1parser/asn1p_y.y | 21 +- skeletons/constr_SET.c | 145 +- skeletons/constr_SET.h | 2 + 8 files changed, 3092 insertions(+), 2861 deletions(-) diff --git a/libasn1fix/asn1fix_constraint_compat.c b/libasn1fix/asn1fix_constraint_compat.c index 844045f6e..96bd04256 100644 --- a/libasn1fix/asn1fix_constraint_compat.c +++ b/libasn1fix/asn1fix_constraint_compat.c @@ -9,6 +9,9 @@ int asn1constraint_compatible(asn1p_expr_type_e expr_type, enum asn1p_constraint_type_e constr_type, int fbless_SIZE) { + if(expr_type == ASN_BASIC_REAL) + return -1; /* Not yet supported */ + /* * X.680-0207, Table 9. */ diff --git a/libasn1parser/asn1p_l.c b/libasn1parser/asn1p_l.c index d4f152ff6..b57fd7e5c 100644 --- a/libasn1parser/asn1p_l.c +++ b/libasn1parser/asn1p_l.c @@ -21,8 +21,15 @@ /* Scanner skeleton version: * $Header$ + * $FreeBSD: src/usr.bin/lex/flex.skl,v 1.8 2004/01/06 19:03:44 nectar Exp $ */ +#if defined(__FreeBSD__) +#include +#else +#define __unused +#endif + #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 @@ -259,7 +266,7 @@ YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); static void *yy_flex_alloc YY_PROTO(( yy_size_t )); -static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); +static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )) __unused; static void yy_flex_free YY_PROTO(( void * )); #define yy_new_buffer yy_create_buffer @@ -312,233 +319,235 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 137 -#define YY_END_OF_BUFFER 138 -static yyconst short int yy_acclist[1258] = +#define YY_NUM_RULES 138 +#define YY_END_OF_BUFFER 139 +static yyconst short int yy_acclist[1264] = { 0, - 138, 136, 137, 131, 136, 137, 131, 137, 134, 136, - 137, 19, 136, 137, 134, 136, 137, 136, 137, 134, - 136, 137, 136, 137, 134, 136, 137, 136, 137, 33, - 136, 137, 32, 136, 137, 134, 136, 137, 136, 137, - 119, 120, 136, 137, 119, 120, 136, 137, 119, 120, - 136, 137, 119, 120, 136, 137, 119, 120, 136, 137, - 119, 120, 136, 137, 119, 120, 136, 137, 119, 120, - 136, 137, 119, 120, 136, 137, 119, 120, 136, 137, - 119, 120, 136, 137, 119, 120, 136, 137, 119, 120, - 136, 137, 119, 120, 136, 137, 119, 120, 136, 137, - - 119, 120, 136, 137, 119, 120, 136, 137, 119, 120, - 136, 137, 119, 120, 136, 137, 118, 136, 137, 134, - 136, 137, 9, 136, 137, 6, 137, 6, 136, 137, - 8, 136, 137, 8, 136, 137, 11, 13, 136, 137, - 11, 137, 13, 136, 137, 13, 136, 137, 13, 136, - 137, 21, 136, 137, 21, 137, 22, 136, 137, 16, - 136, 137, 16, 137, 18, 136, 137, 18, 136, 137, - 14, 136, 137, 15, 136, 137, 25, 27, 136, 137, - 27, 136, 137, 28, 137, 25, 26, 27, 136, 137, - 25, 26, 27, 136, 137, 129, 136, 137, 129, 137, - - 136, 137, 125, 136, 137, 136, 137, 136, 137, 124, - 136, 137, 127, 136, 137, 128, 136, 137, 126, 136, - 137, 130, 136, 137, 131, 19, 19, 116, 117, 5, - 31, 123, 10, 32, 119, 120, 119, 120, 119, 120, - 119, 120, 119, 120, 119, 120, 120, 119, 120, 119, - 120, 119, 120, 119, 120, 43, 119, 120, 119, 120, - 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, - 119, 120, 119, 120, 119, 120, 120, 120, 119, 120, - 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, - 119, 120, 119, 120, 120, 119, 120, 119, 120, 88, - - 119, 120, 119, 120, 120, 119, 120, 119, 120, 119, - 120, 119, 120, 120, 119, 120, 119, 120, 119, 120, - 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, - 120, 119, 120, 119, 120, 120, 120, 119, 120, 118, - 9, 7, 7, 12, 21, 20, 16, 25, 25, 26, - 25, 26, 129, 5, 124, 135, 116, 117, 31, 122, - 121, 119, 120, 120, 119, 120, 35, 119, 120, 36, - 119, 120, 119, 120, 119, 120, 119, 120, 40, 119, - 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, - 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, - - 120, 57, 119, 120, 119, 120, 119, 120, 119, 120, - 119, 120, 119, 120, 119, 120, 120, 120, 119, 120, - 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, - 119, 120, 80, 119, 120, 81, 119, 120, 119, 120, - 120, 119, 120, 119, 120, 119, 120, 120, 119, 120, - 91, 119, 120, 119, 120, 119, 120, 119, 120, 120, - 119, 120, 119, 120, 119, 120, 99, 119, 120, 119, - 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, - 120, 120, 119, 120, 119, 120, 119, 120, 120, 120, - 120, 119, 120, 118, 3, 17, 25, 26, 24, 25, - - 26, 124, 116, 117, 30, 29, 2, 1, 119, 120, - 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, - 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, - 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, - 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, - 119, 120, 65, 119, 120, 120, 120, 119, 120, 119, - 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, - 120, 119, 120, 119, 120, 83, 119, 120, 120, 119, - 120, 119, 120, 119, 120, 120, 119, 120, 119, 120, - 119, 120, 119, 120, 120, 96, 119, 120, 119, 120, - - 119, 120, 100, 119, 120, 119, 120, 119, 120, 119, - 120, 104, 119, 120, 106, 119, 120, 120, 119, 120, - 119, 120, 119, 120, 119, 120, 119, 120, 120, 120, - 120, 115, 119, 120, 3, 25, 26, 119, 120, 119, - 120, 119, 120, 39, 119, 120, 120, 119, 120, 119, - 120, 119, 120, 46, 119, 120, 119, 120, 119, 120, - 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, - 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, - 119, 120, 64, 119, 120, 120, 120, 120, 119, 120, - 119, 120, 119, 120, 119, 120, 119, 120, 119, 120, - - 119, 120, 119, 120, 119, 120, 119, 120, 120, 119, - 120, 87, 119, 120, 119, 120, 120, 119, 120, 119, - 120, 119, 120, 120, 119, 120, 119, 120, 119, 120, - 119, 120, 120, 120, 107, 119, 120, 119, 120, 119, - 120, 120, 119, 120, 120, 120, 120, 132, 25, 26, - 34, 119, 120, 119, 120, 119, 120, 120, 119, 120, - 119, 120, 45, 119, 120, 119, 120, 119, 120, 119, - 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, - 120, 119, 120, 119, 120, 59, 119, 120, 119, 120, - 119, 120, 119, 120, 119, 120, 120, 120, 120, 119, - - 120, 119, 120, 119, 120, 119, 120, 119, 120, 119, - 120, 119, 120, 119, 120, 119, 120, 119, 120, 120, - 85, 119, 120, 119, 120, 120, 119, 120, 119, 120, - 119, 120, 119, 120, 120, 119, 120, 119, 120, 101, - 119, 120, 102, 119, 120, 120, 120, 108, 119, 120, - 119, 120, 120, 120, 120, 120, 120, 25, 26, 119, - 120, 119, 120, 120, 42, 119, 120, 119, 120, 119, - 120, 119, 120, 119, 120, 51, 119, 120, 52, 119, - 120, 119, 120, 119, 120, 55, 119, 120, 119, 120, - 119, 120, 119, 120, 61, 119, 120, 119, 120, 119, - - 120, 120, 120, 120, 119, 120, 119, 120, 72, 119, - 120, 73, 119, 120, 119, 120, 119, 120, 119, 120, - 77, 119, 120, 119, 120, 119, 120, 119, 120, 120, - 119, 120, 120, 90, 119, 120, 119, 120, 93, 119, - 120, 95, 119, 120, 120, 119, 120, 119, 120, 120, - 120, 119, 120, 111, 120, 120, 120, 120, 120, 25, - 26, 119, 120, 119, 120, 120, 119, 120, 119, 120, - 119, 120, 119, 120, 119, 120, 54, 119, 120, 119, - 120, 119, 120, 60, 119, 120, 119, 120, 63, 119, - 120, 120, 120, 120, 120, 119, 120, 71, 119, 120, - - 74, 119, 120, 75, 119, 120, 119, 120, 119, 120, - 120, 119, 120, 120, 89, 119, 120, 120, 119, 120, - 120, 119, 120, 98, 119, 120, 120, 120, 119, 120, - 120, 120, 120, 120, 25, 26, 119, 120, 38, 119, - 120, 41, 120, 44, 119, 120, 47, 119, 120, 119, - 120, 119, 120, 119, 120, 119, 120, 119, 120, 120, - 120, 120, 69, 120, 119, 120, 119, 120, 119, 120, - 120, 119, 120, 120, 120, 119, 120, 120, 103, 120, - 120, 109, 119, 120, 120, 120, 120, 120, 133, 25, - 119, 120, 48, 119, 120, 119, 120, 50, 119, 120, - - 119, 120, 119, 120, 58, 119, 120, 119, 120, 120, - 120, 120, 70, 119, 120, 119, 120, 119, 120, 120, - 119, 120, 120, 120, 119, 120, 120, 119, 120, 120, - 112, 120, 120, 120, 120, 25, 37, 119, 120, 49, - 119, 120, 53, 119, 120, 119, 120, 119, 120, 120, - 120, 120, 119, 120, 119, 120, 120, 119, 120, 120, - 120, 119, 120, 120, 119, 120, 120, 120, 120, 120, - 25, 119, 120, 119, 120, 120, 120, 120, 76, 119, - 120, 78, 119, 120, 79, 120, 119, 120, 120, 120, - 119, 120, 120, 97, 119, 120, 120, 120, 120, 120, - - 25, 119, 120, 62, 119, 120, 67, 120, 120, 68, - 120, 119, 120, 84, 120, 120, 92, 119, 120, 120, - 105, 120, 120, 120, 114, 120, 25, 119, 120, 120, - 82, 119, 120, 120, 120, 120, 113, 120, 25, 119, - 120, 66, 120, 120, 94, 120, 110, 120, 25, 56, - 119, 120, 86, 120, 23, 25, 4 + 139, 137, 138, 132, 137, 138, 132, 138, 135, 137, + 138, 19, 137, 138, 135, 137, 138, 137, 138, 135, + 137, 138, 137, 138, 137, 138, 135, 137, 138, 137, + 138, 33, 137, 138, 32, 137, 138, 135, 137, 138, + 137, 138, 120, 121, 137, 138, 120, 121, 137, 138, + 120, 121, 137, 138, 120, 121, 137, 138, 120, 121, + 137, 138, 120, 121, 137, 138, 120, 121, 137, 138, + 120, 121, 137, 138, 120, 121, 137, 138, 120, 121, + 137, 138, 120, 121, 137, 138, 120, 121, 137, 138, + 120, 121, 137, 138, 120, 121, 137, 138, 120, 121, + + 137, 138, 120, 121, 137, 138, 120, 121, 137, 138, + 120, 121, 137, 138, 120, 121, 137, 138, 119, 137, + 138, 135, 137, 138, 9, 137, 138, 6, 138, 6, + 137, 138, 8, 137, 138, 8, 137, 138, 11, 13, + 137, 138, 11, 138, 13, 137, 138, 13, 137, 138, + 13, 137, 138, 21, 137, 138, 21, 138, 22, 137, + 138, 16, 137, 138, 16, 138, 18, 137, 138, 18, + 137, 138, 14, 137, 138, 15, 137, 138, 25, 27, + 137, 138, 27, 137, 138, 28, 138, 25, 26, 27, + 137, 138, 25, 26, 27, 137, 138, 130, 137, 138, + + 130, 138, 137, 138, 126, 137, 138, 137, 138, 137, + 138, 125, 137, 138, 128, 137, 138, 129, 137, 138, + 127, 137, 138, 131, 137, 138, 132, 19, 19, 117, + 118, 5, 31, 124, 10, 34, 32, 34, 120, 121, + 120, 121, 120, 121, 120, 121, 120, 121, 120, 121, + 121, 120, 121, 120, 121, 120, 121, 120, 121, 44, + 120, 121, 120, 121, 120, 121, 120, 121, 120, 121, + 120, 121, 120, 121, 120, 121, 120, 121, 120, 121, + 121, 121, 120, 121, 120, 121, 120, 121, 120, 121, + 120, 121, 120, 121, 120, 121, 120, 121, 121, 120, + + 121, 120, 121, 89, 120, 121, 120, 121, 121, 120, + 121, 120, 121, 120, 121, 120, 121, 121, 120, 121, + 120, 121, 120, 121, 120, 121, 120, 121, 120, 121, + 120, 121, 120, 121, 121, 120, 121, 120, 121, 121, + 121, 120, 121, 119, 9, 7, 7, 12, 21, 20, + 16, 25, 25, 26, 25, 26, 130, 5, 125, 136, + 117, 118, 31, 34, 123, 34, 122, 120, 121, 121, + 120, 121, 36, 120, 121, 37, 120, 121, 120, 121, + 120, 121, 120, 121, 41, 120, 121, 120, 121, 120, + 121, 120, 121, 120, 121, 120, 121, 120, 121, 120, + + 121, 120, 121, 120, 121, 120, 121, 58, 120, 121, + 120, 121, 120, 121, 120, 121, 120, 121, 120, 121, + 120, 121, 121, 121, 120, 121, 120, 121, 120, 121, + 120, 121, 120, 121, 120, 121, 120, 121, 81, 120, + 121, 82, 120, 121, 120, 121, 121, 120, 121, 120, + 121, 120, 121, 121, 120, 121, 92, 120, 121, 120, + 121, 120, 121, 120, 121, 121, 120, 121, 120, 121, + 120, 121, 100, 120, 121, 120, 121, 120, 121, 120, + 121, 120, 121, 120, 121, 120, 121, 121, 120, 121, + 120, 121, 120, 121, 121, 121, 121, 120, 121, 119, + + 3, 17, 25, 26, 24, 25, 26, 125, 117, 118, + 30, 29, 2, 1, 120, 121, 120, 121, 120, 121, + 120, 121, 120, 121, 120, 121, 120, 121, 120, 121, + 120, 121, 120, 121, 120, 121, 120, 121, 120, 121, + 120, 121, 120, 121, 120, 121, 120, 121, 120, 121, + 120, 121, 120, 121, 120, 121, 120, 121, 66, 120, + 121, 121, 121, 120, 121, 120, 121, 120, 121, 120, + 121, 120, 121, 120, 121, 120, 121, 120, 121, 120, + 121, 84, 120, 121, 121, 120, 121, 120, 121, 120, + 121, 121, 120, 121, 120, 121, 120, 121, 120, 121, + + 121, 97, 120, 121, 120, 121, 120, 121, 101, 120, + 121, 120, 121, 120, 121, 120, 121, 105, 120, 121, + 107, 120, 121, 121, 120, 121, 120, 121, 120, 121, + 120, 121, 120, 121, 121, 121, 121, 116, 120, 121, + 3, 25, 26, 120, 121, 120, 121, 120, 121, 40, + 120, 121, 121, 120, 121, 120, 121, 120, 121, 47, + 120, 121, 120, 121, 120, 121, 120, 121, 120, 121, + 120, 121, 120, 121, 120, 121, 120, 121, 120, 121, + 120, 121, 120, 121, 120, 121, 120, 121, 65, 120, + 121, 121, 121, 121, 120, 121, 120, 121, 120, 121, + + 120, 121, 120, 121, 120, 121, 120, 121, 120, 121, + 120, 121, 120, 121, 121, 120, 121, 88, 120, 121, + 120, 121, 121, 120, 121, 120, 121, 120, 121, 121, + 120, 121, 120, 121, 120, 121, 120, 121, 121, 121, + 108, 120, 121, 120, 121, 120, 121, 121, 120, 121, + 121, 121, 121, 133, 25, 26, 35, 120, 121, 120, + 121, 120, 121, 121, 120, 121, 120, 121, 46, 120, + 121, 120, 121, 120, 121, 120, 121, 120, 121, 120, + 121, 120, 121, 120, 121, 120, 121, 120, 121, 120, + 121, 60, 120, 121, 120, 121, 120, 121, 120, 121, + + 120, 121, 121, 121, 121, 120, 121, 120, 121, 120, + 121, 120, 121, 120, 121, 120, 121, 120, 121, 120, + 121, 120, 121, 120, 121, 121, 86, 120, 121, 120, + 121, 121, 120, 121, 120, 121, 120, 121, 120, 121, + 121, 120, 121, 120, 121, 102, 120, 121, 103, 120, + 121, 121, 121, 109, 120, 121, 120, 121, 121, 121, + 121, 121, 121, 25, 26, 120, 121, 120, 121, 121, + 43, 120, 121, 120, 121, 120, 121, 120, 121, 120, + 121, 52, 120, 121, 53, 120, 121, 120, 121, 120, + 121, 56, 120, 121, 120, 121, 120, 121, 120, 121, + + 62, 120, 121, 120, 121, 120, 121, 121, 121, 121, + 120, 121, 120, 121, 73, 120, 121, 74, 120, 121, + 120, 121, 120, 121, 120, 121, 78, 120, 121, 120, + 121, 120, 121, 120, 121, 121, 120, 121, 121, 91, + 120, 121, 120, 121, 94, 120, 121, 96, 120, 121, + 121, 120, 121, 120, 121, 121, 121, 120, 121, 112, + 121, 121, 121, 121, 121, 25, 26, 120, 121, 120, + 121, 121, 120, 121, 120, 121, 120, 121, 120, 121, + 120, 121, 55, 120, 121, 120, 121, 120, 121, 61, + 120, 121, 120, 121, 64, 120, 121, 121, 121, 121, + + 121, 120, 121, 72, 120, 121, 75, 120, 121, 76, + 120, 121, 120, 121, 120, 121, 121, 120, 121, 121, + 90, 120, 121, 121, 120, 121, 121, 120, 121, 99, + 120, 121, 121, 121, 120, 121, 121, 121, 121, 121, + 25, 26, 120, 121, 39, 120, 121, 42, 121, 45, + 120, 121, 48, 120, 121, 120, 121, 120, 121, 120, + 121, 120, 121, 120, 121, 121, 121, 121, 70, 121, + 120, 121, 120, 121, 120, 121, 121, 120, 121, 121, + 121, 120, 121, 121, 104, 121, 121, 110, 120, 121, + 121, 121, 121, 121, 134, 25, 120, 121, 49, 120, + + 121, 120, 121, 51, 120, 121, 120, 121, 120, 121, + 59, 120, 121, 120, 121, 121, 121, 121, 71, 120, + 121, 120, 121, 120, 121, 121, 120, 121, 121, 121, + 120, 121, 121, 120, 121, 121, 113, 121, 121, 121, + 121, 25, 38, 120, 121, 50, 120, 121, 54, 120, + 121, 120, 121, 120, 121, 121, 121, 121, 120, 121, + 120, 121, 121, 120, 121, 121, 121, 120, 121, 121, + 120, 121, 121, 121, 121, 121, 25, 120, 121, 120, + 121, 121, 121, 121, 77, 120, 121, 79, 120, 121, + 80, 121, 120, 121, 121, 121, 120, 121, 121, 98, + + 120, 121, 121, 121, 121, 121, 25, 120, 121, 63, + 120, 121, 68, 121, 121, 69, 121, 120, 121, 85, + 121, 121, 93, 120, 121, 121, 106, 121, 121, 121, + 115, 121, 25, 120, 121, 121, 83, 120, 121, 121, + 121, 121, 114, 121, 25, 120, 121, 67, 121, 121, + 95, 121, 111, 121, 25, 57, 120, 121, 87, 121, + 23, 25, 4 } ; -static yyconst short int yy_accept[736] = +static yyconst short int yy_accept[743] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 7, - 9, 12, 15, 18, 20, 23, 25, 28, 30, 33, - 36, 39, 41, 45, 49, 53, 57, 61, 65, 69, - 73, 77, 81, 85, 89, 93, 97, 101, 105, 109, - 113, 117, 120, 123, 126, 128, 131, 134, 137, 141, - 143, 146, 149, 152, 155, 157, 160, 163, 165, 168, - 171, 174, 177, 181, 184, 186, 191, 196, 199, 201, - 203, 206, 208, 210, 213, 216, 219, 222, 225, 225, - 226, 227, 228, 228, 229, 229, 230, 230, 230, 231, - - 232, 233, 234, 235, 235, 235, 237, 239, 241, 243, - 245, 247, 248, 250, 252, 254, 256, 259, 261, 263, - 265, 267, 269, 271, 273, 275, 277, 278, 279, 281, - 283, 285, 287, 289, 291, 293, 295, 296, 298, 300, - 303, 305, 306, 308, 310, 312, 314, 315, 317, 319, - 321, 323, 325, 327, 329, 331, 332, 334, 336, 337, - 338, 340, 340, 341, 341, 341, 341, 342, 343, 344, - 345, 346, 347, 348, 348, 349, 351, 353, 354, 355, - 355, 356, 357, 357, 357, 358, 358, 359, 359, 359, - 359, 359, 360, 361, 362, 364, 365, 367, 370, 373, - - 375, 377, 377, 379, 382, 384, 386, 388, 390, 392, - 394, 396, 398, 400, 402, 405, 407, 409, 411, 413, - 415, 417, 418, 419, 421, 423, 425, 427, 429, 431, - 433, 436, 439, 441, 442, 444, 446, 448, 449, 451, - 454, 456, 458, 460, 461, 463, 465, 467, 470, 472, - 474, 476, 478, 480, 482, 483, 485, 487, 489, 490, - 491, 492, 494, 495, 495, 495, 496, 497, 499, 502, - 503, 503, 504, 505, 506, 507, 508, 509, 509, 509, - 509, 511, 513, 515, 517, 519, 521, 523, 525, 527, - 529, 531, 533, 535, 537, 539, 541, 543, 545, 547, - - 549, 551, 553, 556, 557, 558, 560, 562, 564, 566, - 568, 570, 572, 574, 576, 579, 580, 582, 584, 586, - 587, 589, 591, 593, 595, 596, 599, 601, 603, 606, - 608, 610, 612, 615, 618, 619, 621, 623, 625, 627, - 629, 630, 631, 632, 635, 635, 635, 635, 635, 636, - 638, 638, 640, 642, 644, 647, 648, 650, 652, 654, - 657, 659, 661, 663, 665, 667, 669, 671, 673, 675, - 677, 679, 681, 683, 686, 687, 688, 689, 691, 693, - 695, 697, 699, 701, 703, 705, 707, 709, 710, 712, - 715, 717, 718, 720, 720, 722, 724, 725, 727, 729, - - 731, 733, 734, 735, 738, 740, 742, 743, 745, 746, - 747, 748, 748, 748, 749, 751, 751, 754, 756, 758, - 759, 761, 763, 766, 768, 770, 772, 774, 776, 778, - 780, 782, 784, 786, 789, 791, 793, 795, 797, 798, - 799, 800, 802, 804, 806, 808, 810, 812, 814, 816, - 818, 820, 820, 821, 824, 826, 827, 829, 831, 833, - 835, 836, 838, 840, 843, 846, 847, 848, 851, 853, - 854, 855, 856, 857, 858, 858, 858, 860, 860, 862, - 864, 865, 868, 870, 872, 874, 876, 879, 882, 884, - 886, 889, 891, 893, 895, 898, 900, 902, 903, 904, - - 905, 907, 909, 912, 915, 917, 919, 921, 924, 926, - 928, 930, 931, 933, 934, 937, 939, 942, 945, 946, - 948, 950, 951, 952, 954, 956, 957, 958, 959, 960, - 960, 962, 962, 964, 966, 967, 969, 971, 973, 975, - 977, 980, 982, 984, 987, 989, 992, 993, 994, 995, - 996, 998, 1001, 1004, 1007, 1009, 1011, 1012, 1014, 1015, - 1018, 1019, 1021, 1022, 1024, 1027, 1028, 1029, 1031, 1032, - 1033, 1034, 1035, 1035, 1035, 1037, 1037, 1039, 1042, 1044, - 1047, 1050, 1052, 1054, 1056, 1056, 1058, 1060, 1061, 1062, - 1063, 1065, 1067, 1069, 1071, 1072, 1074, 1075, 1076, 1078, - - 1079, 1079, 1081, 1082, 1085, 1086, 1087, 1088, 1089, 1089, - 1090, 1091, 1091, 1093, 1096, 1098, 1101, 1103, 1105, 1108, - 1110, 1111, 1112, 1113, 1116, 1118, 1120, 1121, 1123, 1124, - 1125, 1127, 1128, 1130, 1131, 1133, 1134, 1135, 1136, 1137, - 1137, 1140, 1143, 1146, 1148, 1150, 1151, 1152, 1153, 1155, - 1157, 1158, 1160, 1161, 1162, 1164, 1165, 1167, 1168, 1169, - 1170, 1171, 1172, 1172, 1174, 1176, 1177, 1178, 1179, 1182, - 1185, 1187, 1189, 1190, 1191, 1193, 1194, 1197, 1198, 1199, - 1200, 1201, 1202, 1202, 1204, 1207, 1209, 1210, 1212, 1214, - 1216, 1217, 1220, 1221, 1223, 1224, 1225, 1227, 1228, 1228, - - 1230, 1231, 1234, 1235, 1236, 1237, 1239, 1240, 1240, 1242, - 1244, 1245, 1247, 1249, 1250, 1250, 1253, 1255, 1257, 1257, - 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, - 1257, 1257, 1257, 1258, 1258 + 9, 12, 15, 18, 20, 23, 25, 27, 30, 32, + 35, 38, 41, 43, 47, 51, 55, 59, 63, 67, + 71, 75, 79, 83, 87, 91, 95, 99, 103, 107, + 111, 115, 119, 122, 125, 128, 130, 133, 136, 139, + 143, 145, 148, 151, 154, 157, 159, 162, 165, 167, + 170, 173, 176, 179, 183, 186, 188, 193, 198, 201, + 203, 205, 208, 210, 212, 215, 218, 221, 224, 227, + 227, 228, 229, 230, 230, 231, 231, 232, 232, 232, + + 232, 233, 234, 235, 236, 236, 237, 237, 239, 239, + 239, 241, 243, 245, 247, 249, 251, 252, 254, 256, + 258, 260, 263, 265, 267, 269, 271, 273, 275, 277, + 279, 281, 282, 283, 285, 287, 289, 291, 293, 295, + 297, 299, 300, 302, 304, 307, 309, 310, 312, 314, + 316, 318, 319, 321, 323, 325, 327, 329, 331, 333, + 335, 336, 338, 340, 341, 342, 344, 344, 345, 345, + 345, 345, 346, 347, 348, 349, 350, 351, 352, 352, + 353, 355, 357, 358, 359, 359, 360, 361, 361, 361, + 362, 362, 363, 363, 363, 363, 363, 365, 366, 367, + + 367, 368, 370, 371, 373, 376, 379, 381, 383, 383, + 385, 388, 390, 392, 394, 396, 398, 400, 402, 404, + 406, 408, 411, 413, 415, 417, 419, 421, 423, 424, + 425, 427, 429, 431, 433, 435, 437, 439, 442, 445, + 447, 448, 450, 452, 454, 455, 457, 460, 462, 464, + 466, 467, 469, 471, 473, 476, 478, 480, 482, 484, + 486, 488, 489, 491, 493, 495, 496, 497, 498, 500, + 501, 501, 501, 502, 503, 505, 508, 509, 509, 510, + 511, 512, 513, 514, 515, 515, 515, 515, 517, 519, + 521, 523, 525, 527, 529, 531, 533, 535, 537, 539, + + 541, 543, 545, 547, 549, 551, 553, 555, 557, 559, + 562, 563, 564, 566, 568, 570, 572, 574, 576, 578, + 580, 582, 585, 586, 588, 590, 592, 593, 595, 597, + 599, 601, 602, 605, 607, 609, 612, 614, 616, 618, + 621, 624, 625, 627, 629, 631, 633, 635, 636, 637, + 638, 641, 641, 641, 641, 641, 642, 644, 644, 646, + 648, 650, 653, 654, 656, 658, 660, 663, 665, 667, + 669, 671, 673, 675, 677, 679, 681, 683, 685, 687, + 689, 692, 693, 694, 695, 697, 699, 701, 703, 705, + 707, 709, 711, 713, 715, 716, 718, 721, 723, 724, + + 726, 726, 728, 730, 731, 733, 735, 737, 739, 740, + 741, 744, 746, 748, 749, 751, 752, 753, 754, 754, + 754, 755, 757, 757, 760, 762, 764, 765, 767, 769, + 772, 774, 776, 778, 780, 782, 784, 786, 788, 790, + 792, 795, 797, 799, 801, 803, 804, 805, 806, 808, + 810, 812, 814, 816, 818, 820, 822, 824, 826, 826, + 827, 830, 832, 833, 835, 837, 839, 841, 842, 844, + 846, 849, 852, 853, 854, 857, 859, 860, 861, 862, + 863, 864, 864, 864, 866, 866, 868, 870, 871, 874, + 876, 878, 880, 882, 885, 888, 890, 892, 895, 897, + + 899, 901, 904, 906, 908, 909, 910, 911, 913, 915, + 918, 921, 923, 925, 927, 930, 932, 934, 936, 937, + 939, 940, 943, 945, 948, 951, 952, 954, 956, 957, + 958, 960, 962, 963, 964, 965, 966, 966, 968, 968, + 970, 972, 973, 975, 977, 979, 981, 983, 986, 988, + 990, 993, 995, 998, 999, 1000, 1001, 1002, 1004, 1007, + 1010, 1013, 1015, 1017, 1018, 1020, 1021, 1024, 1025, 1027, + 1028, 1030, 1033, 1034, 1035, 1037, 1038, 1039, 1040, 1041, + 1041, 1041, 1043, 1043, 1045, 1048, 1050, 1053, 1056, 1058, + 1060, 1062, 1062, 1064, 1066, 1067, 1068, 1069, 1071, 1073, + + 1075, 1077, 1078, 1080, 1081, 1082, 1084, 1085, 1085, 1087, + 1088, 1091, 1092, 1093, 1094, 1095, 1095, 1096, 1097, 1097, + 1099, 1102, 1104, 1107, 1109, 1111, 1114, 1116, 1117, 1118, + 1119, 1122, 1124, 1126, 1127, 1129, 1130, 1131, 1133, 1134, + 1136, 1137, 1139, 1140, 1141, 1142, 1143, 1143, 1146, 1149, + 1152, 1154, 1156, 1157, 1158, 1159, 1161, 1163, 1164, 1166, + 1167, 1168, 1170, 1171, 1173, 1174, 1175, 1176, 1177, 1178, + 1178, 1180, 1182, 1183, 1184, 1185, 1188, 1191, 1193, 1195, + 1196, 1197, 1199, 1200, 1203, 1204, 1205, 1206, 1207, 1208, + 1208, 1210, 1213, 1215, 1216, 1218, 1220, 1222, 1223, 1226, + + 1227, 1229, 1230, 1231, 1233, 1234, 1234, 1236, 1237, 1240, + 1241, 1242, 1243, 1245, 1246, 1246, 1248, 1250, 1251, 1253, + 1255, 1256, 1256, 1259, 1261, 1263, 1263, 1263, 1263, 1263, + 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, + 1264, 1264 } ; static yyconst int yy_ec[256] = @@ -547,16 +556,16 @@ static yyconst int yy_ec[256] = 4, 4, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 6, 7, 1, 1, 1, 8, 9, 10, - 10, 11, 1, 12, 13, 14, 15, 16, 17, 18, - 18, 19, 20, 21, 18, 22, 23, 24, 25, 26, - 27, 28, 1, 10, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 1, 56, 57, 1, 1, 58, 59, 60, 61, - - 62, 63, 64, 65, 66, 67, 63, 68, 69, 70, - 71, 72, 63, 73, 74, 75, 76, 77, 63, 78, - 63, 79, 80, 81, 82, 1, 1, 1, 1, 1, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 19, 20, 21, 22, 19, 23, 24, 25, 26, 27, + 28, 29, 1, 10, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 1, 57, 58, 1, 1, 59, 60, 61, 62, + + 63, 64, 65, 66, 67, 68, 64, 69, 70, 71, + 72, 73, 64, 74, 75, 76, 77, 78, 64, 79, + 64, 80, 81, 82, 83, 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, 1, 1, 1, @@ -573,693 +582,704 @@ static yyconst int yy_ec[256] = 1, 1, 1, 1, 1 } ; -static yyconst int yy_meta[83] = +static yyconst int yy_meta[84] = { 0, 1, 2, 3, 4, 4, 1, 5, 1, 6, 1, - 1, 1, 7, 1, 1, 8, 8, 8, 8, 8, - 8, 8, 8, 9, 1, 1, 9, 1, 10, 10, - 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, + 1, 1, 1, 7, 1, 1, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 1, 1, 9, 1, 10, + 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 1, 1, 1, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 1, 1, 1, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, - 1, 13 + 12, 1, 13 } ; -static yyconst short int yy_base[761] = +static yyconst short int yy_base[768] = { 0, - 0, 0, 80, 83, 86, 97, 92, 94, 91, 101, - 89, 103, 185, 267, 349, 0, 1572, 1561, 119, 129, - 1557, 1555, 423, 137, 4413, 138, 1548, 103, 4413, 156, - 1537, 4413, 490, 184, 208, 190, 257, 285, 540, 205, - 546, 567, 561, 277, 585, 600, 606, 631, 634, 623, - 654, 1547, 697, 0, 4413, 4413, 1546, 1540, 4413, 4413, - 1536, 1538, 4413, 0, 0, 1541, 0, 0, 1522, 4413, - 4413, 4413, 0, 4413, 4413, 720, 801, 160, 199, 110, - 4413, 1529, 1529, 1526, 4413, 4413, 4413, 4413, 1531, 203, - 0, 1530, 1525, 1514, 86, 1510, 433, 1512, 123, 321, - - 1506, 4413, 689, 1487, 825, 709, 710, 725, 738, 741, - 756, 1499, 800, 806, 821, 829, 875, 878, 896, 893, - 909, 917, 932, 938, 935, 953, 112, 157, 968, 971, - 979, 994, 1005, 1016, 1022, 1033, 153, 1046, 1049, 1062, - 1070, 113, 1073, 1086, 1097, 1110, 102, 1126, 1132, 1143, - 1149, 1160, 1171, 1177, 1188, 116, 1194, 1210, 218, 242, - 1209, 0, 1493, 1258, 1270, 1282, 0, 4413, 1491, 4413, - 0, 4413, 0, 1476, 0, 1455, 254, 256, 4413, 0, - 1480, 4413, 1478, 0, 1477, 0, 1476, 114, 1451, 299, - 214, 801, 4413, 4413, 1293, 1471, 1277, 1278, 1293, 1294, - - 1343, 1470, 1351, 1354, 1367, 1375, 1383, 1391, 1404, 1412, - 1415, 1436, 1437, 1452, 1458, 1469, 1475, 1486, 1492, 1503, - 1514, 243, 216, 1527, 1535, 1538, 1553, 1556, 1559, 1585, - 1577, 1588, 1601, 251, 1609, 1622, 1630, 270, 1633, 1646, - 1654, 1662, 1670, 240, 1683, 1686, 1694, 1707, 1715, 1723, - 1731, 1744, 1752, 1765, 532, 1773, 1789, 1790, 104, 558, - 223, 1805, 1462, 1848, 1856, 1461, 4413, 220, 1430, 1458, - 1413, 1455, 1447, 4413, 4413, 4413, 4413, 315, 217, 1411, - 1850, 1851, 1866, 1872, 1883, 1889, 1905, 1906, 1921, 1929, - 1937, 1953, 1950, 1961, 1974, 1977, 1992, 1998, 2009, 2015, - - 2026, 2041, 2047, 431, 533, 2058, 2064, 2079, 2080, 2095, - 2101, 2116, 2119, 2127, 2140, 432, 2148, 2151, 2164, 559, - 2172, 2185, 2193, 2201, 502, 2209, 2217, 2230, 2238, 2241, - 2259, 2256, 2262, 2277, 504, 2280, 2283, 2300, 2306, 2317, - 560, 503, 420, 2333, 2376, 2398, 2420, 2432, 1437, 303, - 1407, 2416, 2432, 2448, 2417, 568, 2454, 2469, 2472, 2480, - 2493, 2501, 2509, 2522, 2530, 2543, 2551, 2559, 2567, 2582, - 2588, 2599, 2605, 2620, 534, 572, 593, 2621, 2641, 2638, - 2659, 2658, 2674, 2680, 2691, 2704, 2715, 613, 2712, 2728, - 2736, 570, 2744, 586, 2752, 2765, 599, 2778, 2781, 2789, - - 2802, 595, 608, 2813, 2819, 2830, 277, 2841, 615, 587, - 619, 759, 2884, 4413, 397, 1430, 2868, 2884, 2881, 656, - 2892, 2905, 2908, 2925, 2931, 2942, 2948, 2963, 2969, 2986, - 2992, 3003, 3009, 3020, 3026, 3037, 3043, 3059, 622, 682, - 672, 3060, 3075, 3081, 3092, 3098, 3113, 3119, 3130, 3145, - 3151, 723, 710, 3162, 3178, 711, 3175, 1401, 3186, 3199, - 638, 3207, 3222, 3225, 3228, 728, 753, 3243, 3246, 771, - 724, 760, 775, 776, 3294, 3306, 1399, 1408, 3290, 3303, - 611, 3306, 3321, 3327, 3338, 3344, 3355, 3361, 3372, 3383, - 3389, 3400, 3406, 3417, 3428, 3434, 3445, 862, 759, 782, - - 3451, 3462, 3473, 3479, 3490, 3496, 3511, 3512, 3527, 3533, - 1396, 819, 3544, 849, 3550, 1403, 3561, 3567, 779, 3582, - 3588, 790, 832, 3604, 1423, 840, 634, 786, 863, 3638, - 110, 0, 3632, 3633, 867, 3648, 3656, 3659, 3672, 3680, - 3688, 3696, 3709, 3717, 3725, 3733, 854, 928, 855, 868, - 3746, 3754, 3757, 3770, 3778, 3781, 766, 1396, 931, 3794, - 899, 1389, 937, 3815, 3802, 903, 939, 3818, 900, 935, - 942, 941, 3866, 1027, 943, 1376, 3850, 3861, 1407, 3867, - 3878, 3884, 3899, 3900, 987, 3915, 3916, 977, 978, 1014, - 1405, 3931, 3939, 3954, 1042, 1375, 1026, 1009, 1368, 947, - - 643, 1395, 1059, 3955, 1061, 958, 1048, 1065, 1243, 4413, - 1375, 1342, 3970, 3971, 3986, 3987, 4002, 1359, 4003, 4018, - 1054, 1020, 1067, 4024, 4035, 4046, 1013, 1357, 1083, 1072, - 1352, 1088, 1343, 1092, 1366, 1094, 1111, 1116, 1335, 1305, - 4052, 4063, 4069, 1334, 4080, 1024, 430, 1129, 4091, 4097, - 1144, 1338, 1135, 1140, 1326, 1121, 1315, 1152, 1154, 1148, - 1165, 1304, 1272, 1296, 4112, 1203, 1190, 1220, 4113, 4128, - 1328, 1292, 1251, 979, 1261, 1229, 0, 1252, 1283, 1242, - 1284, 1265, 1249, 1263, 4129, 1260, 1197, 1256, 1215, 1212, - 1210, 0, 1258, 1183, 1259, 1318, 1151, 1105, 1070, 1088, - - 1270, 0, 1158, 1326, 1337, 1046, 1014, 991, 906, 901, - 1257, 864, 861, 753, 686, 0, 712, 0, 543, 489, - 440, 407, 376, 380, 371, 365, 271, 257, 1042, 1158, - 135, 124, 4413, 4413, 4178, 4191, 4204, 4217, 4230, 4243, - 4255, 4259, 4270, 4283, 4296, 4307, 4318, 4323, 4328, 4333, - 4337, 4342, 4346, 4350, 4354, 4358, 4369, 4376, 4387, 4399 + 0, 0, 81, 84, 87, 99, 94, 96, 93, 108, + 91, 103, 186, 269, 352, 0, 1657, 1646, 130, 138, + 1645, 1643, 427, 146, 4507, 158, 207, 1633, 109, 230, + 493, 1621, 4507, 543, 268, 115, 274, 289, 488, 593, + 191, 599, 509, 215, 491, 621, 406, 638, 655, 658, + 678, 689, 1631, 733, 0, 4507, 4507, 1630, 1629, 4507, + 4507, 1621, 1622, 4507, 0, 0, 1622, 0, 0, 1602, + 4507, 4507, 4507, 0, 4507, 4507, 757, 839, 122, 166, + 127, 4507, 1612, 1609, 1604, 4507, 4507, 4507, 4507, 1605, + 201, 0, 1603, 1603, 1589, 96, 1585, 656, 1588, 772, + + 103, 807, 1580, 4507, 839, 857, 886, 907, 1565, 912, + 681, 757, 892, 903, 909, 962, 1578, 963, 978, 979, + 994, 1000, 1016, 1022, 1033, 1046, 1049, 1069, 1066, 1077, + 1090, 95, 79, 1105, 1108, 1116, 1131, 1142, 1153, 1159, + 1170, 147, 1183, 1186, 1199, 1207, 94, 1210, 1223, 1234, + 1247, 143, 1263, 1269, 1280, 1286, 1297, 1308, 1314, 1325, + 169, 1331, 1347, 194, 225, 1346, 0, 1572, 757, 943, + 1381, 0, 4507, 1570, 4507, 0, 4507, 0, 1554, 0, + 1536, 258, 333, 4507, 0, 1561, 4507, 1554, 0, 1552, + 0, 1550, 226, 1526, 204, 143, 1391, 4507, 866, 894, + + 4507, 1441, 1548, 1385, 1386, 1401, 1402, 1417, 1547, 1425, + 1428, 1441, 1449, 1491, 1492, 1508, 1509, 1524, 1540, 1546, + 1557, 1563, 1574, 1580, 1591, 1597, 1608, 1619, 223, 241, + 1632, 1640, 1643, 1658, 1661, 1664, 1690, 1682, 1693, 1706, + 226, 1714, 1727, 1735, 495, 1738, 1751, 1759, 1767, 1775, + 245, 1788, 1791, 1799, 1812, 1820, 1828, 1836, 1849, 1857, + 1870, 506, 1878, 1894, 1895, 470, 507, 221, 1910, 1546, + 1954, 1962, 1543, 4507, 285, 1505, 1533, 1489, 1531, 1530, + 4507, 4507, 4507, 4507, 436, 319, 1495, 1956, 1957, 1972, + 1978, 1989, 1995, 2011, 2012, 2027, 2035, 2043, 2059, 2056, + + 2067, 2080, 2083, 2098, 2104, 2115, 2121, 2132, 2147, 2153, + 469, 535, 2164, 2170, 2185, 2186, 2201, 2207, 2222, 2225, + 2233, 2246, 554, 2254, 2257, 2270, 205, 2278, 2291, 2299, + 2307, 523, 2315, 2323, 2336, 2344, 2347, 2365, 2362, 2368, + 2383, 557, 2386, 2389, 2406, 2412, 2423, 612, 528, 631, + 2439, 2473, 2496, 2519, 2531, 1517, 190, 1486, 2515, 2530, + 2546, 2543, 623, 2564, 2567, 2570, 2585, 2588, 2596, 2609, + 2617, 2630, 2641, 2647, 2658, 2669, 2684, 2690, 2701, 2707, + 2722, 248, 558, 632, 2723, 2743, 2740, 2761, 2760, 2776, + 2782, 2793, 2806, 2817, 613, 2814, 2830, 2838, 617, 2846, + + 309, 2854, 2867, 625, 2880, 2883, 2891, 2904, 636, 641, + 2915, 2921, 2932, 643, 2943, 668, 639, 621, 441, 2987, + 4507, 302, 1508, 2971, 2987, 2984, 649, 2995, 3008, 3011, + 3028, 3034, 3045, 3051, 3066, 3072, 3089, 3095, 3106, 3112, + 3123, 3129, 3140, 3146, 3162, 656, 680, 730, 3163, 3178, + 3184, 3195, 3201, 3216, 3222, 3233, 3248, 3254, 785, 878, + 3265, 3281, 511, 3278, 1482, 3289, 3302, 885, 3310, 3325, + 3328, 3331, 734, 664, 3346, 3349, 806, 735, 733, 830, + 880, 3398, 3410, 1481, 1461, 3364, 3404, 732, 3405, 3422, + 3421, 3437, 3438, 3453, 3454, 3469, 3475, 3486, 3492, 3503, + + 3514, 3525, 3531, 3542, 982, 790, 887, 3548, 3559, 3570, + 3576, 3587, 3593, 3608, 3609, 3624, 3630, 1445, 823, 3641, + 905, 3647, 1448, 3658, 3664, 933, 3679, 3685, 924, 984, + 3701, 1467, 987, 941, 918, 1000, 3735, 101, 0, 3729, + 3730, 1003, 3745, 3753, 3756, 3769, 3777, 3785, 3793, 3806, + 3814, 3822, 3830, 1012, 634, 1019, 1004, 3843, 3851, 3854, + 3867, 3875, 3878, 1056, 1444, 1028, 3891, 1042, 1427, 1022, + 3912, 3899, 1041, 1037, 3915, 1002, 1068, 1057, 1048, 3964, + 1381, 290, 1410, 3930, 3948, 1436, 3959, 3965, 3980, 3981, + 3996, 514, 4002, 4013, 1070, 1065, 1115, 1435, 4019, 4030, + + 4041, 1026, 1403, 1131, 1109, 1397, 1127, 798, 1425, 1138, + 4047, 1089, 1129, 1142, 1151, 1493, 4507, 1392, 1358, 4058, + 4064, 4079, 4080, 4095, 1374, 4096, 4111, 1111, 1146, 1124, + 4117, 4128, 4139, 1150, 1322, 1179, 1193, 1299, 1185, 1296, + 1196, 1318, 1220, 1202, 1205, 1254, 1218, 4145, 4156, 4162, + 1227, 4173, 1168, 1118, 1174, 4184, 4190, 1218, 1224, 1209, + 1255, 1148, 1229, 1138, 1272, 1233, 1257, 1273, 1126, 1012, + 1009, 4205, 1244, 1281, 1287, 4206, 4221, 1020, 966, 1302, + 1268, 915, 1306, 0, 1357, 1340, 1275, 1409, 902, 886, + 889, 4222, 822, 1291, 820, 779, 818, 1223, 0, 1349, + + 807, 1366, 1420, 805, 771, 742, 767, 1424, 0, 1288, + 1462, 1463, 796, 696, 670, 676, 697, 1379, 541, 539, + 504, 459, 0, 441, 0, 378, 422, 373, 397, 366, + 281, 275, 268, 280, 267, 814, 1166, 115, 100, 4507, + 4507, 4272, 4285, 4298, 4311, 4324, 4337, 4349, 4353, 4364, + 4377, 4390, 4401, 4412, 4417, 4422, 4427, 4431, 4436, 4440, + 4444, 4448, 4452, 4463, 4470, 4481, 4493 } ; -static yyconst short int yy_def[761] = +static yyconst short int yy_def[768] = { 0, - 734, 1, 735, 735, 735, 735, 736, 736, 737, 737, - 738, 738, 739, 739, 734, 15, 734, 734, 734, 734, - 734, 740, 734, 741, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 742, 734, 743, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 744, 744, 734, 745, 745, 734, 734, - 734, 734, 746, 734, 734, 747, 747, 734, 734, 23, - 734, 734, 734, 748, 734, 734, 734, 734, 734, 734, - 740, 740, 734, 749, 734, 750, 741, 741, 734, 734, - - 734, 734, 734, 734, 751, 33, 33, 33, 33, 33, - 33, 752, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 752, 752, 33, 33, - 33, 33, 33, 33, 33, 33, 752, 33, 33, 33, - 33, 752, 33, 33, 33, 33, 752, 33, 33, 33, - 33, 33, 33, 33, 33, 752, 33, 33, 752, 752, - 33, 753, 742, 734, 734, 734, 743, 734, 734, 734, - 744, 734, 745, 734, 746, 77, 77, 734, 734, 754, - 748, 734, 734, 755, 749, 756, 750, 734, 734, 757, - 734, 734, 734, 734, 751, 758, 33, 33, 33, 33, - - 33, 758, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 752, 752, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 752, 33, 33, 33, 752, 33, 33, - 33, 33, 33, 752, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 752, 33, 33, 33, 752, 752, - 752, 33, 753, 734, 734, 734, 734, 77, 77, 754, - 734, 755, 756, 734, 734, 734, 734, 757, 734, 734, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - - 33, 33, 33, 752, 752, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 752, 33, 33, 33, 752, - 33, 33, 33, 33, 752, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 752, 33, 33, 33, 33, 33, - 752, 752, 752, 33, 734, 734, 734, 734, 734, 77, - 734, 33, 33, 33, 33, 752, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 752, 752, 752, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 752, 33, 33, - 33, 752, 33, 195, 33, 33, 752, 33, 33, 33, - - 33, 752, 752, 33, 33, 33, 752, 33, 752, 752, - 752, 734, 734, 734, 77, 734, 33, 33, 33, 752, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 752, 752, - 752, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 195, 752, 33, 33, 752, 33, 195, 33, 33, - 752, 33, 33, 33, 33, 752, 752, 33, 33, 752, - 752, 752, 752, 752, 734, 734, 77, 734, 33, 33, - 752, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 752, 752, 752, - - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 195, 752, 33, 752, 33, 195, 33, 33, 752, 33, - 33, 752, 752, 33, 752, 752, 752, 752, 752, 734, - 77, 759, 33, 33, 752, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 752, 752, 752, 752, - 33, 33, 33, 33, 33, 33, 752, 195, 752, 33, - 752, 195, 752, 33, 33, 752, 752, 33, 752, 752, - 752, 752, 734, 760, 77, 734, 33, 33, 752, 33, - 33, 33, 33, 33, 195, 33, 33, 752, 752, 752, - 752, 33, 33, 33, 752, 195, 752, 752, 195, 752, - - 195, 752, 752, 33, 752, 752, 752, 752, 734, 734, - 746, 734, 33, 33, 33, 33, 33, 195, 33, 33, - 752, 752, 752, 33, 33, 33, 752, 195, 752, 752, - 195, 752, 195, 752, 752, 752, 752, 752, 746, 734, - 33, 33, 33, 195, 33, 752, 752, 752, 33, 33, - 752, 195, 752, 752, 195, 752, 195, 752, 752, 752, - 752, 746, 734, 195, 33, 752, 752, 752, 33, 33, - 752, 195, 752, 752, 195, 752, 195, 752, 752, 752, - 752, 746, 734, 195, 33, 752, 752, 752, 195, 752, - 752, 195, 752, 752, 752, 752, 752, 746, 734, 195, - - 752, 195, 752, 752, 752, 752, 746, 734, 195, 752, - 752, 752, 752, 746, 734, 195, 752, 746, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 0, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734 + 741, 1, 742, 742, 742, 742, 743, 743, 744, 744, + 745, 745, 746, 746, 741, 15, 741, 741, 741, 741, + 741, 747, 741, 748, 741, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 749, 741, 750, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 751, 751, 741, 752, 752, 741, + 741, 741, 741, 753, 741, 741, 754, 754, 741, 741, + 23, 741, 741, 741, 755, 741, 741, 741, 741, 741, + 741, 747, 747, 741, 756, 741, 757, 748, 748, 741, + + 741, 741, 741, 741, 741, 741, 741, 741, 741, 758, + 34, 34, 34, 34, 34, 34, 759, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 759, 759, 34, 34, 34, 34, 34, 34, 34, + 34, 759, 34, 34, 34, 34, 759, 34, 34, 34, + 34, 759, 34, 34, 34, 34, 34, 34, 34, 34, + 759, 34, 34, 759, 759, 34, 760, 749, 741, 741, + 741, 750, 741, 741, 741, 751, 741, 752, 741, 753, + 78, 78, 741, 741, 761, 755, 741, 741, 762, 756, + 763, 757, 741, 741, 764, 741, 741, 741, 741, 741, + + 741, 758, 765, 34, 34, 34, 34, 34, 765, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 759, 759, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 759, 34, 34, 34, 759, 34, 34, 34, 34, 34, + 759, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 759, 34, 34, 34, 759, 759, 759, 34, 760, + 741, 741, 741, 741, 78, 78, 761, 741, 762, 763, + 741, 741, 741, 741, 764, 741, 741, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 759, 759, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 759, 34, 34, 34, 759, 34, 34, 34, + 34, 759, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 759, 34, 34, 34, 34, 34, 759, 759, 759, + 34, 741, 741, 741, 741, 741, 78, 741, 34, 34, + 34, 34, 759, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 759, 759, 759, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 759, 34, 34, 34, 759, 34, + + 202, 34, 34, 759, 34, 34, 34, 34, 759, 759, + 34, 34, 34, 759, 34, 759, 759, 759, 741, 741, + 741, 78, 741, 34, 34, 34, 759, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 759, 759, 759, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 202, 759, + 34, 34, 759, 34, 202, 34, 34, 759, 34, 34, + 34, 34, 759, 759, 34, 34, 759, 759, 759, 759, + 759, 741, 741, 78, 741, 34, 34, 759, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + + 34, 34, 34, 34, 759, 759, 759, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 202, 759, 34, + 759, 34, 202, 34, 34, 759, 34, 34, 759, 759, + 34, 759, 759, 759, 759, 759, 741, 78, 766, 34, + 34, 759, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 759, 759, 759, 759, 34, 34, 34, + 34, 34, 34, 759, 202, 759, 34, 759, 202, 759, + 34, 34, 759, 759, 34, 759, 759, 759, 759, 741, + 767, 78, 741, 34, 34, 759, 34, 34, 34, 34, + 34, 202, 34, 34, 759, 759, 759, 759, 34, 34, + + 34, 759, 202, 759, 759, 202, 759, 202, 759, 759, + 34, 759, 759, 759, 759, 741, 741, 753, 741, 34, + 34, 34, 34, 34, 202, 34, 34, 759, 759, 759, + 34, 34, 34, 759, 202, 759, 759, 202, 759, 202, + 759, 759, 759, 759, 759, 753, 741, 34, 34, 34, + 202, 34, 759, 759, 759, 34, 34, 759, 202, 759, + 759, 202, 759, 202, 759, 759, 759, 759, 753, 741, + 202, 34, 759, 759, 759, 34, 34, 759, 202, 759, + 759, 202, 759, 202, 759, 759, 759, 759, 753, 741, + 202, 34, 759, 759, 759, 202, 759, 759, 202, 759, + + 759, 759, 759, 759, 753, 741, 202, 759, 202, 759, + 759, 759, 759, 753, 741, 202, 759, 759, 759, 759, + 753, 741, 202, 759, 753, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, + 0, 741, 741, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741 } ; -static yyconst short int yy_nxt[4496] = +static yyconst short int yy_nxt[4591] = { 0, 18, 19, 20, 19, 19, 21, 22, 23, 24, 25, - 18, 25, 26, 27, 28, 29, 30, 30, 30, 30, - 30, 30, 30, 31, 21, 32, 32, 18, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 40, 40, 40, - 42, 43, 44, 45, 40, 46, 47, 48, 49, 50, - 51, 40, 40, 40, 25, 21, 21, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, - 21, 25, 55, 56, 56, 55, 56, 56, 55, 56, - 56, 68, 57, 65, 60, 57, 60, 66, 58, 55, - - 56, 56, 61, 65, 61, 68, 62, 66, 62, 58, - 93, 89, 69, 102, 202, 70, 202, 63, 734, 63, - 90, 90, 90, 90, 202, 202, 69, 89, 202, 70, - 90, 90, 90, 90, 734, 190, 733, 89, 97, 97, - 97, 97, 95, 274, 575, 89, 89, 732, 191, 275, - 99, 176, 97, 97, 100, 100, 100, 100, 100, 100, - 100, 178, 178, 178, 178, 202, 734, 244, 71, 202, - 72, 103, 103, 103, 103, 103, 103, 103, 103, 238, - 341, 222, 71, 255, 72, 73, 74, 75, 74, 74, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - - 178, 178, 178, 178, 90, 90, 90, 90, 73, 73, - 73, 73, 73, 106, 223, 279, 113, 77, 279, 106, - 114, 234, 121, 106, 115, 106, 116, 106, 202, 106, - 202, 106, 106, 106, 106, 202, 117, 106, 106, 73, - 73, 73, 280, 118, 106, 280, 106, 119, 106, 106, - 120, 106, 202, 106, 202, 202, 106, 178, 178, 178, - 178, 176, 350, 202, 74, 73, 74, 73, 74, 75, - 74, 74, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 202, 259, 268, 269, 106, 305, 343, 202, - 73, 73, 73, 73, 73, 176, 106, 122, 123, 77, - - 106, 277, 260, 277, 304, 106, 138, 139, 124, 325, - 140, 278, 316, 125, 106, 261, 106, 277, 106, 277, - 141, 73, 73, 73, 106, 106, 106, 278, 106, 729, - 126, 320, 728, 106, 415, 142, 192, 192, 192, 192, - 192, 192, 192, 192, 176, 470, 74, 73, 74, 32, - 78, 79, 78, 78, 32, 32, 80, 32, 32, 32, - 81, 82, 32, 83, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - - 84, 84, 84, 85, 86, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 87, 32, - 88, 89, 202, 477, 97, 97, 97, 97, 176, 727, - 726, 188, 202, 202, 202, 725, 724, 93, 97, 97, - 723, 94, 94, 94, 94, 94, 94, 94, 94, 94, - 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, - 94, 94, 94, 94, 94, 94, 94, 667, 411, 95, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - - 96, 96, 105, 375, 388, 106, 106, 106, 106, 106, - 106, 106, 106, 722, 202, 202, 202, 721, 106, 107, - 106, 106, 106, 106, 106, 106, 106, 106, 106, 108, - 106, 109, 106, 110, 106, 106, 106, 106, 111, 106, - 106, 106, 106, 106, 202, 202, 202, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 106, - 202, 202, 202, 410, 129, 106, 397, 130, 403, 106, - 202, 106, 202, 106, 202, 106, 131, 132, 106, 106, - 106, 439, 133, 335, 106, 134, 106, 376, 734, 202, - - 106, 127, 106, 135, 106, 202, 106, 202, 106, 136, - 106, 202, 128, 143, 106, 106, 144, 720, 392, 342, - 202, 409, 458, 202, 145, 202, 106, 202, 106, 106, - 146, 202, 148, 106, 202, 106, 137, 440, 149, 106, - 420, 106, 150, 106, 456, 106, 202, 106, 106, 106, - 202, 153, 106, 151, 106, 734, 461, 147, 152, 154, - 106, 473, 106, 106, 106, 441, 106, 466, 202, 467, - 106, 106, 106, 106, 106, 157, 155, 106, 453, 106, - 535, 158, 106, 106, 202, 633, 474, 472, 160, 498, - 161, 570, 156, 106, 202, 106, 519, 106, 164, 164, - - 164, 164, 106, 159, 103, 103, 103, 103, 103, 103, - 103, 103, 165, 165, 165, 165, 165, 165, 166, 166, - 175, 481, 202, 202, 202, 175, 175, 175, 175, 175, - 175, 175, 175, 175, 175, 734, 202, 500, 106, 106, - 202, 499, 514, 175, 175, 175, 175, 175, 106, 106, - 106, 106, 106, 106, 106, 719, 197, 106, 106, 511, - 412, 412, 412, 412, 198, 202, 106, 106, 106, 512, - 106, 202, 202, 106, 175, 175, 175, 106, 202, 106, - 106, 106, 106, 202, 200, 106, 106, 202, 202, 106, - 199, 202, 718, 522, 202, 106, 526, 106, 202, 106, - - 175, 175, 202, 201, 106, 549, 175, 175, 175, 175, - 175, 175, 175, 175, 175, 175, 192, 192, 192, 192, - 192, 192, 192, 192, 175, 175, 175, 175, 175, 106, - 523, 202, 525, 527, 203, 106, 528, 529, 595, 106, - 414, 106, 177, 106, 202, 106, 563, 106, 106, 106, - 106, 550, 202, 204, 106, 175, 175, 175, 106, 566, - 106, 202, 106, 571, 205, 559, 202, 202, 106, 106, - 106, 206, 106, 202, 202, 202, 202, 106, 567, 202, - 202, 175, 196, 196, 196, 196, 196, 196, 196, 196, - 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, - - 196, 196, 196, 196, 106, 569, 207, 106, 547, 572, - 561, 202, 202, 202, 106, 202, 106, 106, 106, 106, - 208, 106, 106, 106, 209, 106, 106, 548, 588, 590, - 579, 591, 106, 210, 211, 106, 106, 106, 106, 106, - 202, 106, 212, 202, 106, 716, 213, 202, 106, 202, - 106, 202, 106, 202, 202, 611, 106, 106, 106, 202, - 106, 106, 214, 215, 106, 106, 602, 106, 217, 605, - 202, 106, 598, 106, 220, 106, 106, 106, 106, 106, - 216, 218, 106, 106, 176, 219, 106, 224, 607, 202, - 202, 202, 106, 632, 106, 221, 106, 106, 600, 734, - - 106, 106, 606, 225, 636, 597, 589, 106, 106, 106, - 106, 106, 106, 603, 106, 608, 106, 618, 106, 106, - 106, 202, 226, 106, 227, 202, 202, 106, 609, 609, - 609, 609, 202, 106, 106, 106, 202, 106, 202, 622, - 228, 229, 106, 730, 106, 106, 106, 230, 106, 621, - 691, 106, 715, 106, 202, 106, 714, 106, 202, 106, - 202, 106, 106, 232, 106, 106, 202, 231, 630, 731, - 106, 202, 233, 202, 106, 106, 106, 202, 106, 202, - 647, 106, 651, 235, 202, 106, 623, 106, 106, 106, - 106, 106, 106, 666, 106, 202, 236, 106, 629, 106, - - 202, 106, 106, 106, 202, 106, 202, 627, 610, 106, - 106, 106, 106, 106, 106, 106, 106, 237, 106, 646, - 239, 106, 637, 202, 635, 106, 106, 106, 202, 106, - 709, 634, 648, 202, 106, 240, 106, 638, 106, 106, - 106, 202, 242, 708, 654, 241, 243, 202, 653, 106, - 707, 106, 202, 106, 245, 106, 202, 658, 106, 730, - 202, 106, 656, 202, 202, 246, 202, 106, 659, 106, - 202, 106, 106, 106, 106, 106, 247, 202, 106, 248, - 106, 661, 106, 660, 106, 731, 106, 252, 106, 106, - 106, 106, 106, 676, 250, 202, 249, 106, 668, 106, - - 106, 251, 202, 106, 673, 674, 106, 671, 106, 202, - 106, 253, 106, 680, 106, 202, 106, 106, 106, 106, - 106, 678, 202, 106, 202, 106, 679, 106, 711, 106, - 256, 106, 202, 106, 681, 106, 254, 106, 106, 106, - 257, 202, 106, 258, 609, 609, 609, 609, 106, 106, - 106, 106, 106, 106, 202, 687, 262, 106, 106, 164, - 164, 164, 164, 202, 202, 701, 686, 702, 202, 202, - 202, 202, 202, 165, 165, 165, 165, 165, 165, 166, - 166, 264, 202, 688, 703, 166, 166, 166, 166, 166, - 166, 166, 166, 265, 693, 202, 202, 166, 166, 166, - - 166, 166, 166, 166, 166, 105, 106, 106, 700, 281, - 699, 696, 698, 692, 690, 694, 106, 106, 106, 106, - 106, 106, 106, 106, 610, 106, 106, 704, 705, 717, - 202, 710, 106, 282, 106, 106, 106, 106, 202, 689, - 202, 106, 106, 684, 683, 682, 677, 697, 695, 202, - 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, - 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, - 196, 196, 106, 675, 672, 664, 663, 662, 202, 657, - 106, 706, 106, 106, 106, 283, 106, 284, 655, 712, - 106, 106, 106, 106, 106, 106, 106, 106, 652, 106, - - 713, 644, 106, 640, 106, 639, 106, 202, 106, 631, - 106, 628, 106, 285, 286, 106, 106, 202, 106, 202, - 106, 612, 106, 106, 106, 599, 106, 288, 287, 596, - 106, 106, 106, 106, 106, 202, 562, 558, 532, 106, - 531, 106, 516, 106, 106, 106, 478, 106, 416, 349, - 289, 106, 106, 106, 106, 290, 106, 351, 106, 186, - 106, 291, 292, 106, 293, 106, 106, 184, 182, 295, - 180, 176, 294, 349, 162, 106, 106, 106, 106, 106, - 106, 106, 734, 202, 106, 106, 275, 106, 186, 184, - 271, 106, 180, 106, 296, 106, 176, 106, 106, 106, - - 106, 106, 267, 266, 106, 162, 106, 298, 106, 297, - 106, 202, 106, 194, 106, 106, 106, 106, 106, 193, - 189, 106, 186, 106, 301, 299, 184, 106, 300, 106, - 183, 106, 106, 106, 106, 106, 182, 182, 180, 102, - 106, 179, 106, 106, 106, 174, 106, 172, 102, 302, - 170, 106, 169, 106, 303, 106, 106, 106, 168, 162, - 104, 101, 106, 92, 106, 89, 106, 106, 106, 89, - 106, 734, 734, 306, 106, 106, 307, 308, 106, 106, - 309, 106, 106, 106, 734, 106, 106, 734, 106, 734, - 734, 312, 310, 734, 106, 106, 106, 106, 106, 106, - - 106, 106, 106, 311, 106, 313, 106, 106, 734, 734, - 734, 734, 734, 734, 106, 734, 106, 106, 106, 734, - 106, 734, 734, 734, 106, 106, 106, 106, 106, 106, - 106, 106, 734, 106, 734, 734, 314, 734, 106, 734, - 315, 317, 106, 734, 106, 734, 734, 734, 106, 106, - 106, 106, 106, 734, 318, 734, 734, 106, 734, 106, - 734, 106, 106, 106, 734, 106, 319, 734, 734, 106, - 106, 106, 106, 106, 106, 106, 106, 734, 106, 734, - 321, 106, 734, 106, 734, 106, 734, 106, 734, 106, - 734, 106, 734, 106, 106, 106, 734, 106, 734, 106, - - 322, 106, 106, 106, 734, 106, 734, 734, 323, 106, - 106, 106, 106, 106, 327, 106, 734, 734, 106, 324, - 734, 734, 326, 106, 106, 106, 106, 106, 734, 106, - 734, 106, 734, 106, 106, 106, 106, 106, 734, 734, - 734, 734, 328, 734, 106, 734, 106, 329, 106, 734, - 106, 734, 106, 734, 106, 106, 106, 734, 106, 330, - 106, 734, 106, 106, 106, 734, 106, 734, 734, 734, - 106, 106, 106, 106, 106, 734, 734, 734, 331, 106, - 734, 106, 734, 106, 734, 106, 734, 106, 734, 734, - 332, 106, 106, 106, 106, 106, 734, 334, 333, 734, - - 106, 734, 106, 734, 106, 734, 106, 734, 106, 734, - 734, 340, 106, 106, 106, 336, 106, 337, 106, 106, - 734, 106, 338, 734, 734, 734, 734, 734, 106, 106, - 106, 106, 106, 106, 106, 734, 339, 106, 106, 734, - 344, 734, 734, 734, 106, 734, 106, 734, 106, 345, - 345, 345, 345, 106, 734, 734, 734, 347, 347, 347, - 347, 734, 734, 346, 346, 346, 346, 346, 346, 346, - 346, 348, 348, 348, 348, 348, 348, 348, 348, 106, - 106, 734, 734, 734, 734, 734, 734, 353, 734, 106, - 106, 352, 106, 106, 106, 106, 734, 734, 106, 106, - - 734, 106, 734, 734, 734, 106, 354, 106, 734, 106, - 734, 106, 106, 355, 106, 106, 734, 734, 106, 734, - 106, 357, 106, 734, 106, 734, 106, 734, 106, 734, - 106, 106, 106, 358, 106, 106, 359, 106, 734, 734, - 734, 734, 734, 734, 106, 106, 106, 106, 106, 106, - 106, 734, 734, 106, 106, 734, 734, 356, 106, 734, - 106, 734, 106, 734, 106, 734, 106, 360, 106, 106, - 106, 361, 106, 734, 734, 734, 106, 106, 106, 106, - 106, 363, 106, 734, 362, 106, 734, 734, 734, 106, - 106, 106, 106, 106, 106, 734, 106, 734, 364, 734, - - 106, 106, 365, 106, 106, 366, 106, 734, 367, 106, - 734, 734, 734, 106, 734, 106, 106, 106, 106, 734, - 106, 106, 106, 734, 368, 106, 734, 106, 734, 734, - 734, 106, 734, 106, 734, 106, 734, 106, 106, 106, - 106, 369, 734, 734, 106, 370, 106, 734, 106, 734, - 106, 734, 106, 734, 106, 106, 106, 106, 106, 734, - 371, 734, 734, 106, 734, 106, 734, 372, 734, 106, - 106, 373, 734, 374, 106, 734, 106, 734, 734, 734, - 106, 734, 106, 734, 106, 734, 106, 106, 106, 106, - 106, 734, 734, 106, 734, 106, 734, 106, 734, 106, - - 734, 106, 734, 106, 734, 106, 106, 106, 106, 106, - 734, 378, 106, 734, 734, 379, 734, 734, 106, 106, - 106, 106, 106, 106, 106, 380, 734, 106, 106, 382, - 106, 734, 377, 734, 106, 734, 106, 386, 106, 734, - 106, 734, 106, 381, 106, 106, 383, 734, 106, 106, - 384, 734, 734, 734, 734, 106, 106, 106, 106, 106, - 106, 385, 106, 734, 106, 734, 106, 106, 106, 106, - 106, 734, 734, 387, 734, 106, 734, 106, 389, 106, - 106, 106, 734, 106, 734, 734, 734, 106, 106, 106, - 106, 106, 106, 106, 106, 734, 106, 394, 390, 106, - - 734, 106, 734, 106, 393, 106, 391, 106, 734, 734, - 734, 106, 106, 106, 106, 106, 734, 734, 734, 734, - 106, 734, 106, 734, 106, 395, 106, 734, 106, 396, - 106, 734, 106, 106, 106, 734, 106, 734, 106, 734, - 106, 106, 106, 734, 106, 734, 106, 734, 106, 106, - 106, 734, 106, 734, 734, 734, 106, 106, 106, 106, - 106, 734, 399, 734, 398, 106, 734, 106, 734, 106, - 106, 106, 734, 106, 734, 734, 734, 106, 106, 106, - 106, 106, 400, 734, 106, 106, 106, 401, 106, 106, - 734, 106, 734, 734, 734, 106, 734, 106, 106, 106, - - 106, 106, 106, 106, 106, 106, 106, 106, 734, 106, - 106, 734, 106, 734, 734, 734, 106, 734, 106, 106, - 106, 404, 106, 106, 106, 106, 106, 734, 106, 106, - 402, 405, 406, 734, 734, 106, 734, 734, 734, 106, - 734, 106, 734, 106, 734, 106, 106, 106, 106, 106, - 734, 734, 734, 734, 106, 734, 106, 734, 106, 734, - 106, 734, 106, 408, 734, 106, 734, 734, 734, 734, - 734, 407, 106, 734, 106, 734, 106, 345, 345, 345, - 345, 106, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 346, 346, 346, 346, 346, 346, 346, 346, 412, - - 412, 412, 412, 734, 734, 734, 734, 734, 734, 413, - 734, 734, 734, 346, 346, 346, 346, 346, 346, 346, - 346, 347, 347, 347, 347, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 348, 348, 348, 348, 348, - 348, 348, 348, 413, 734, 106, 106, 348, 348, 348, - 348, 348, 348, 348, 348, 106, 106, 106, 106, 106, - 106, 106, 418, 417, 106, 106, 734, 734, 734, 734, - 734, 106, 734, 106, 734, 106, 419, 106, 734, 414, - 106, 734, 421, 106, 734, 734, 734, 106, 734, 106, - 734, 106, 734, 106, 734, 106, 106, 106, 106, 422, - - 734, 106, 106, 734, 423, 734, 734, 734, 106, 106, - 106, 106, 106, 106, 734, 106, 734, 106, 734, 106, - 106, 106, 106, 106, 734, 734, 734, 734, 106, 734, - 106, 734, 106, 734, 424, 734, 106, 734, 106, 734, - 106, 106, 106, 734, 106, 426, 425, 734, 106, 106, - 106, 106, 106, 734, 734, 734, 734, 106, 734, 106, - 734, 427, 428, 106, 734, 106, 429, 734, 734, 106, - 106, 106, 106, 106, 430, 734, 734, 734, 106, 734, - 106, 734, 106, 431, 106, 734, 106, 432, 106, 734, - 106, 106, 106, 734, 106, 734, 106, 734, 106, 106, - - 106, 734, 106, 734, 433, 734, 106, 106, 106, 734, - 106, 106, 435, 734, 434, 106, 734, 106, 734, 734, - 734, 106, 734, 106, 734, 106, 734, 106, 106, 106, - 106, 106, 734, 734, 106, 436, 106, 734, 106, 734, - 106, 734, 106, 734, 106, 437, 438, 106, 106, 106, - 106, 734, 734, 106, 734, 734, 734, 442, 734, 106, - 106, 106, 106, 106, 106, 734, 734, 106, 106, 106, - 106, 443, 734, 444, 734, 734, 734, 106, 734, 106, - 106, 106, 106, 734, 106, 445, 106, 106, 106, 106, - 446, 734, 734, 734, 734, 734, 734, 106, 106, 447, - - 106, 106, 106, 106, 734, 734, 106, 106, 734, 106, - 734, 734, 449, 106, 734, 106, 734, 106, 734, 106, - 106, 106, 448, 106, 451, 734, 734, 452, 106, 734, - 106, 734, 106, 106, 106, 734, 734, 450, 734, 106, - 734, 106, 734, 106, 106, 106, 734, 106, 734, 734, - 734, 106, 106, 106, 106, 106, 106, 106, 106, 454, - 106, 734, 734, 106, 734, 106, 734, 106, 734, 106, - 734, 106, 734, 106, 734, 106, 106, 455, 734, 106, - 734, 106, 734, 106, 106, 106, 734, 106, 734, 457, - 734, 106, 106, 459, 106, 106, 734, 734, 734, 734, - - 106, 734, 734, 734, 106, 734, 106, 106, 106, 734, - 106, 734, 460, 106, 462, 734, 734, 106, 106, 106, - 106, 106, 463, 464, 106, 734, 106, 734, 106, 106, - 106, 106, 106, 734, 734, 734, 734, 106, 734, 734, - 734, 106, 106, 106, 734, 106, 734, 734, 106, 734, - 106, 468, 106, 465, 106, 734, 106, 734, 106, 106, - 106, 106, 106, 734, 734, 734, 734, 106, 734, 106, - 106, 106, 734, 106, 734, 469, 734, 734, 106, 734, - 106, 734, 106, 734, 106, 475, 475, 475, 475, 106, - 734, 734, 734, 734, 734, 734, 734, 106, 734, 476, - - 476, 476, 476, 476, 476, 476, 476, 106, 734, 106, - 106, 106, 479, 106, 734, 471, 106, 734, 734, 734, - 106, 106, 106, 106, 106, 106, 734, 106, 480, 106, - 734, 106, 106, 482, 106, 106, 734, 106, 734, 734, - 106, 734, 734, 734, 106, 734, 106, 106, 106, 106, - 734, 106, 483, 106, 106, 734, 106, 484, 734, 485, - 106, 734, 734, 734, 106, 734, 106, 734, 106, 734, - 106, 106, 106, 106, 106, 734, 734, 106, 734, 106, - 734, 106, 734, 486, 734, 106, 734, 106, 734, 106, - 106, 106, 106, 734, 488, 487, 106, 734, 106, 734, - - 734, 734, 106, 734, 106, 734, 106, 734, 106, 734, - 106, 106, 106, 734, 734, 106, 489, 106, 490, 734, - 734, 106, 734, 491, 734, 106, 734, 106, 734, 106, - 734, 106, 106, 106, 106, 106, 734, 493, 106, 734, - 106, 734, 106, 734, 492, 734, 106, 734, 106, 106, - 106, 106, 106, 734, 734, 106, 734, 106, 734, 106, - 734, 106, 494, 106, 734, 106, 106, 106, 106, 106, - 734, 734, 106, 734, 106, 734, 106, 734, 106, 496, - 106, 734, 106, 495, 106, 106, 106, 497, 106, 106, - 734, 106, 734, 501, 734, 734, 734, 734, 106, 106, - - 106, 106, 106, 106, 106, 734, 734, 106, 106, 734, - 106, 502, 503, 734, 106, 734, 106, 734, 106, 734, - 106, 106, 106, 106, 106, 734, 734, 106, 734, 106, - 505, 106, 734, 106, 734, 106, 734, 106, 504, 106, - 106, 106, 106, 506, 734, 734, 106, 734, 106, 507, - 734, 734, 106, 734, 106, 734, 106, 734, 106, 106, - 106, 106, 106, 734, 734, 734, 734, 106, 734, 106, - 734, 106, 734, 106, 106, 508, 734, 509, 106, 734, - 106, 734, 734, 734, 106, 734, 106, 734, 106, 734, - 106, 106, 106, 106, 106, 734, 734, 510, 734, 106, - - 734, 106, 734, 106, 106, 106, 513, 106, 734, 734, - 106, 734, 734, 734, 106, 106, 515, 106, 106, 106, - 734, 106, 734, 106, 734, 106, 106, 106, 106, 106, - 734, 518, 734, 517, 106, 734, 106, 734, 106, 734, - 106, 734, 106, 734, 734, 734, 106, 106, 106, 734, - 106, 106, 521, 734, 106, 106, 520, 106, 734, 734, - 734, 106, 734, 106, 106, 106, 106, 106, 106, 106, - 106, 106, 106, 106, 734, 106, 106, 734, 734, 734, - 734, 734, 106, 734, 106, 106, 106, 106, 734, 106, - 734, 106, 524, 734, 106, 475, 475, 475, 475, 734, - - 734, 734, 734, 734, 734, 734, 734, 734, 734, 476, - 476, 476, 476, 476, 476, 476, 476, 530, 734, 106, - 734, 476, 476, 476, 476, 476, 476, 476, 476, 106, - 734, 106, 106, 106, 734, 106, 734, 533, 106, 534, - 734, 734, 106, 734, 106, 106, 106, 106, 734, 106, - 106, 106, 734, 536, 106, 734, 106, 734, 734, 734, - 106, 734, 106, 734, 106, 734, 106, 106, 537, 106, - 106, 734, 734, 106, 538, 106, 734, 106, 734, 106, - 539, 106, 734, 106, 106, 106, 106, 106, 734, 734, - 106, 734, 106, 734, 106, 734, 106, 734, 106, 734, - - 106, 106, 106, 106, 106, 734, 734, 734, 540, 106, - 734, 106, 106, 106, 541, 106, 734, 734, 106, 734, - 106, 734, 106, 734, 106, 734, 106, 734, 106, 106, - 106, 106, 106, 734, 542, 106, 734, 106, 734, 106, - 734, 106, 734, 106, 734, 106, 106, 106, 106, 106, - 734, 734, 734, 543, 106, 734, 106, 106, 106, 734, - 106, 734, 734, 545, 544, 106, 734, 106, 734, 106, - 734, 106, 734, 106, 106, 106, 106, 106, 734, 734, - 106, 734, 106, 734, 546, 734, 106, 551, 106, 734, - 106, 106, 106, 106, 106, 734, 734, 734, 734, 106, - - 734, 106, 106, 106, 734, 106, 734, 734, 106, 552, - 106, 734, 106, 734, 106, 734, 106, 734, 106, 106, - 106, 106, 106, 734, 734, 106, 734, 106, 554, 106, - 734, 106, 734, 106, 734, 106, 553, 106, 106, 106, - 106, 106, 734, 734, 106, 734, 734, 734, 734, 734, - 106, 106, 106, 106, 106, 106, 106, 556, 555, 106, - 106, 734, 106, 734, 734, 734, 106, 734, 106, 734, - 106, 734, 106, 106, 106, 106, 106, 734, 734, 106, - 734, 106, 734, 560, 734, 106, 734, 106, 734, 106, - 106, 106, 106, 106, 734, 734, 106, 734, 106, 734, - - 106, 734, 106, 734, 106, 734, 106, 557, 106, 106, - 106, 106, 734, 734, 564, 106, 734, 106, 734, 734, - 565, 106, 734, 106, 734, 106, 734, 106, 734, 106, - 106, 106, 568, 106, 734, 734, 106, 734, 734, 573, - 573, 573, 573, 106, 734, 106, 734, 106, 734, 734, - 734, 734, 106, 574, 574, 574, 574, 574, 574, 574, - 574, 106, 106, 578, 734, 734, 734, 734, 577, 734, - 734, 106, 106, 106, 106, 106, 106, 106, 734, 734, - 106, 106, 734, 734, 734, 106, 734, 106, 106, 106, - 734, 106, 734, 580, 734, 106, 106, 106, 106, 106, - - 582, 106, 106, 581, 106, 734, 734, 106, 585, 106, - 734, 106, 734, 583, 734, 106, 734, 106, 734, 106, - 106, 106, 584, 106, 734, 106, 734, 106, 106, 106, - 734, 106, 734, 734, 734, 106, 106, 106, 106, 106, - 734, 586, 734, 734, 106, 734, 106, 734, 106, 734, - 106, 734, 106, 734, 106, 734, 106, 106, 106, 734, - 106, 587, 106, 734, 106, 106, 106, 734, 106, 734, - 734, 734, 106, 106, 106, 106, 106, 734, 592, 734, - 734, 106, 734, 106, 734, 106, 106, 106, 734, 106, - 734, 734, 734, 106, 106, 106, 106, 106, 106, 106, - - 106, 734, 106, 734, 734, 106, 734, 106, 734, 106, - 106, 106, 734, 106, 593, 734, 734, 106, 106, 106, - 106, 106, 106, 106, 106, 734, 106, 601, 594, 106, - 734, 106, 734, 106, 734, 106, 734, 106, 734, 734, - 734, 106, 106, 106, 106, 106, 734, 106, 734, 734, - 106, 734, 734, 734, 106, 734, 106, 604, 106, 106, - 734, 106, 734, 106, 734, 734, 106, 573, 573, 573, - 573, 734, 734, 734, 734, 734, 734, 734, 734, 106, - 734, 574, 574, 574, 574, 574, 574, 574, 574, 106, - 106, 106, 613, 106, 734, 734, 106, 734, 106, 734, - - 106, 734, 106, 734, 106, 734, 106, 106, 106, 106, - 106, 734, 734, 106, 734, 106, 615, 106, 734, 106, - 734, 106, 734, 106, 614, 106, 106, 106, 106, 106, - 734, 734, 106, 616, 734, 734, 734, 734, 106, 106, - 106, 617, 106, 106, 106, 106, 619, 106, 106, 734, - 734, 734, 734, 734, 106, 620, 106, 106, 106, 106, - 106, 734, 734, 106, 106, 734, 734, 734, 106, 734, - 106, 734, 106, 734, 106, 734, 624, 734, 106, 106, - 106, 625, 106, 106, 106, 734, 734, 106, 734, 734, - 626, 734, 734, 106, 106, 106, 106, 106, 106, 106, - - 106, 734, 106, 106, 734, 734, 734, 734, 734, 106, - 106, 641, 106, 106, 106, 106, 106, 642, 106, 106, - 734, 734, 734, 734, 734, 106, 106, 106, 106, 106, - 106, 106, 106, 734, 106, 106, 734, 734, 734, 734, - 734, 106, 106, 106, 106, 106, 106, 106, 643, 734, - 106, 106, 734, 106, 645, 734, 734, 106, 734, 106, - 734, 106, 734, 106, 106, 106, 106, 106, 734, 734, - 734, 734, 106, 734, 106, 106, 649, 734, 106, 734, - 734, 106, 734, 106, 734, 106, 734, 106, 650, 106, - 734, 106, 106, 106, 106, 106, 734, 734, 106, 734, - - 106, 734, 106, 734, 106, 734, 106, 734, 106, 106, - 106, 106, 106, 734, 734, 734, 734, 106, 734, 106, - 106, 106, 734, 106, 734, 734, 106, 665, 106, 734, - 106, 734, 106, 734, 106, 734, 106, 669, 670, 106, - 106, 106, 106, 734, 734, 106, 734, 734, 734, 734, - 734, 106, 106, 106, 106, 106, 106, 106, 106, 734, - 106, 106, 734, 734, 685, 734, 734, 106, 106, 106, - 106, 106, 106, 734, 734, 734, 106, 106, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 59, 59, 59, 59, 59, 59, 59, 59, 59, - - 59, 59, 59, 59, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 91, 91, 91, 91, 734, 91, 91, - 91, 91, 91, 91, 91, 91, 98, 98, 98, 734, - 98, 734, 98, 734, 98, 163, 163, 734, 163, 163, - 167, 167, 734, 734, 167, 167, 734, 167, 167, 167, - 167, 167, 167, 171, 171, 171, 171, 734, 171, 171, - 171, 171, 171, 171, 171, 171, 173, 173, 173, 173, - - 173, 173, 173, 173, 734, 173, 173, 175, 734, 734, - 734, 175, 175, 175, 175, 175, 175, 175, 176, 734, - 734, 734, 176, 176, 176, 176, 176, 176, 176, 181, - 181, 734, 181, 181, 185, 185, 734, 185, 185, 187, - 187, 734, 187, 187, 195, 734, 195, 195, 112, 112, - 734, 112, 112, 263, 734, 263, 263, 270, 734, 270, - 270, 272, 734, 272, 272, 273, 734, 273, 273, 276, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 196, 196, 734, 196, 196, 576, 576, 734, - 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, - - 574, 574, 574, 734, 734, 734, 574, 734, 734, 734, - 734, 574, 17, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734 + 18, 26, 25, 27, 28, 29, 30, 31, 31, 31, + 31, 31, 31, 31, 32, 21, 33, 33, 18, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 41, 41, + 41, 43, 44, 45, 46, 41, 47, 48, 49, 50, + 51, 52, 41, 41, 41, 25, 21, 21, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 54, 21, 25, 56, 57, 57, 56, 57, 57, 56, + 57, 57, 209, 69, 58, 66, 61, 58, 61, 67, + + 59, 56, 57, 57, 62, 69, 62, 209, 209, 63, + 66, 63, 59, 740, 67, 70, 195, 90, 71, 104, + 64, 94, 64, 183, 183, 183, 183, 70, 739, 196, + 71, 91, 91, 91, 91, 741, 582, 230, 90, 91, + 91, 91, 91, 181, 286, 111, 90, 98, 98, 98, + 98, 123, 741, 96, 90, 124, 209, 111, 125, 111, + 209, 245, 98, 98, 111, 229, 90, 183, 183, 183, + 183, 72, 287, 73, 100, 100, 100, 100, 100, 100, + 100, 100, 209, 72, 741, 73, 74, 75, 76, 75, + 75, 74, 74, 74, 74, 74, 74, 74, 74, 74, + + 74, 74, 91, 91, 91, 91, 284, 209, 284, 251, + 74, 74, 74, 74, 74, 90, 241, 285, 209, 78, + 101, 111, 422, 100, 102, 102, 102, 102, 102, 102, + 102, 111, 181, 111, 209, 111, 209, 262, 209, 209, + 111, 74, 74, 74, 105, 111, 106, 106, 106, 106, + 106, 106, 106, 106, 209, 111, 281, 111, 209, 111, + 266, 209, 282, 107, 141, 399, 75, 74, 75, 74, + 75, 76, 75, 75, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 311, 267, 350, 323, 275, + 276, 142, 107, 74, 74, 74, 74, 74, 111, 268, + + 181, 118, 78, 618, 111, 119, 446, 126, 111, 120, + 111, 121, 111, 312, 111, 332, 111, 111, 111, 111, + 286, 122, 741, 111, 74, 74, 74, 181, 357, 111, + 127, 128, 181, 111, 183, 183, 183, 183, 111, 484, + 736, 129, 735, 734, 181, 733, 465, 732, 287, 75, + 74, 75, 33, 79, 80, 79, 79, 33, 33, 81, + 33, 33, 33, 33, 82, 83, 33, 84, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 86, 87, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 88, 33, 89, 90, 111, 731, 284, 153, + 284, 730, 419, 419, 419, 419, 111, 729, 111, 285, + 111, 728, 94, 727, 209, 111, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 209, 209, 96, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + + 97, 97, 97, 97, 97, 97, 97, 105, 209, 108, + 108, 108, 108, 108, 108, 108, 108, 130, 111, 209, + 209, 143, 144, 421, 209, 145, 107, 741, 111, 726, + 111, 111, 111, 111, 131, 146, 209, 111, 139, 111, + 111, 209, 382, 521, 725, 625, 140, 348, 209, 111, + 147, 111, 209, 111, 209, 107, 110, 327, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 209, 342, 349, + 209, 209, 111, 112, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 113, 111, 114, 111, 115, 111, 111, + 111, 111, 116, 111, 111, 111, 111, 111, 404, 417, + + 383, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 111, 447, 209, 209, 395, 134, 111, + 209, 135, 410, 111, 209, 111, 209, 111, 209, 111, + 136, 137, 111, 111, 209, 209, 138, 209, 111, 209, + 148, 111, 209, 149, 209, 132, 209, 98, 98, 98, + 98, 150, 209, 111, 193, 111, 133, 151, 111, 209, + 111, 154, 98, 98, 416, 155, 158, 209, 111, 460, + 111, 209, 111, 468, 159, 111, 156, 111, 111, 481, + 418, 157, 463, 209, 152, 111, 427, 111, 111, 111, + + 162, 160, 111, 474, 111, 448, 163, 111, 111, 473, + 209, 111, 477, 596, 480, 488, 723, 161, 111, 111, + 111, 111, 111, 111, 505, 111, 166, 111, 164, 111, + 111, 111, 722, 111, 169, 169, 169, 169, 111, 721, + 506, 479, 530, 209, 165, 209, 209, 209, 209, 170, + 170, 170, 170, 170, 170, 171, 171, 180, 169, 169, + 169, 169, 180, 180, 180, 180, 180, 180, 180, 180, + 180, 180, 180, 170, 170, 170, 170, 170, 170, 171, + 171, 180, 180, 180, 180, 180, 105, 111, 106, 106, + 106, 106, 106, 106, 106, 106, 507, 111, 741, 111, + + 529, 111, 542, 209, 204, 107, 111, 534, 533, 209, + 716, 741, 180, 180, 180, 737, 715, 714, 209, 209, + 209, 105, 518, 197, 197, 197, 197, 197, 197, 197, + 197, 209, 709, 209, 107, 209, 209, 556, 180, 180, + 107, 640, 738, 209, 180, 180, 180, 180, 180, 180, + 180, 180, 180, 180, 180, 199, 199, 199, 199, 199, + 199, 199, 199, 180, 180, 180, 180, 180, 532, 107, + 566, 105, 107, 106, 106, 106, 106, 106, 106, 106, + 106, 182, 199, 199, 199, 199, 199, 199, 199, 199, + 107, 209, 535, 209, 180, 180, 180, 200, 209, 200, + + 209, 107, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 209, 107, + 180, 105, 111, 108, 108, 108, 108, 108, 108, 108, + 108, 209, 205, 111, 111, 707, 111, 209, 519, 111, + 107, 111, 536, 111, 526, 111, 209, 111, 706, 111, + 705, 111, 111, 207, 209, 271, 206, 557, 111, 171, + 171, 171, 171, 171, 171, 171, 171, 568, 699, 107, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 111, 111, 573, 209, 578, 209, 210, 577, + + 209, 570, 111, 111, 111, 111, 111, 111, 111, 111, + 208, 111, 111, 209, 696, 209, 209, 209, 111, 111, + 111, 111, 111, 212, 111, 209, 211, 111, 111, 554, + 111, 574, 209, 209, 111, 209, 111, 213, 111, 209, + 111, 209, 111, 111, 111, 214, 111, 579, 555, 111, + 209, 216, 111, 576, 209, 209, 111, 691, 111, 215, + 111, 209, 111, 111, 111, 111, 111, 586, 598, 209, + 209, 111, 612, 111, 217, 218, 111, 111, 209, 220, + 219, 209, 111, 209, 607, 690, 111, 595, 111, 111, + 111, 111, 634, 111, 597, 111, 111, 224, 111, 111, + + 221, 222, 209, 604, 614, 609, 111, 111, 111, 111, + 225, 111, 610, 111, 226, 111, 605, 227, 223, 111, + 111, 111, 209, 615, 209, 231, 111, 629, 209, 602, + 111, 209, 111, 228, 111, 111, 613, 209, 111, 111, + 209, 232, 209, 628, 209, 111, 111, 111, 111, 111, + 111, 209, 111, 642, 111, 209, 111, 111, 111, 209, + 233, 111, 234, 209, 209, 111, 674, 737, 689, 637, + 684, 111, 111, 111, 639, 111, 643, 653, 235, 236, + 111, 209, 111, 111, 111, 237, 111, 209, 630, 111, + 655, 111, 209, 111, 738, 111, 682, 111, 209, 111, + + 111, 239, 111, 111, 636, 238, 209, 654, 111, 209, + 240, 641, 111, 111, 111, 209, 111, 644, 209, 111, + 658, 242, 209, 111, 645, 111, 111, 111, 111, 111, + 111, 209, 111, 209, 243, 111, 209, 111, 673, 111, + 111, 111, 209, 111, 675, 660, 209, 111, 111, 111, + 111, 111, 111, 111, 111, 244, 111, 209, 246, 111, + 663, 679, 665, 111, 111, 111, 661, 111, 209, 671, + 209, 668, 111, 247, 111, 667, 111, 111, 111, 680, + 249, 209, 678, 248, 250, 209, 209, 111, 209, 111, + 670, 111, 252, 111, 209, 666, 111, 669, 710, 111, + + 209, 209, 683, 253, 209, 111, 686, 111, 693, 111, + 111, 111, 111, 111, 254, 209, 111, 255, 111, 209, + 111, 681, 111, 687, 111, 259, 111, 111, 111, 111, + 111, 209, 257, 664, 256, 111, 662, 111, 111, 258, + 698, 111, 685, 688, 111, 703, 111, 694, 111, 260, + 111, 695, 111, 209, 111, 111, 111, 111, 111, 718, + 708, 111, 209, 111, 659, 111, 697, 111, 263, 111, + 209, 111, 700, 111, 261, 111, 111, 111, 264, 209, + 111, 265, 616, 616, 616, 616, 111, 111, 111, 111, + 111, 111, 209, 272, 269, 111, 111, 171, 171, 171, + + 171, 171, 171, 171, 171, 105, 702, 197, 197, 197, + 197, 197, 197, 197, 197, 111, 111, 651, 288, 711, + 647, 701, 209, 646, 107, 111, 111, 111, 111, 111, + 111, 111, 111, 209, 111, 111, 712, 209, 209, 638, + 635, 111, 289, 111, 111, 111, 111, 111, 209, 209, + 111, 111, 724, 107, 110, 111, 619, 111, 111, 111, + 290, 111, 291, 617, 606, 111, 111, 111, 111, 111, + 111, 111, 111, 704, 111, 209, 209, 111, 603, 111, + 209, 111, 569, 111, 713, 111, 717, 565, 292, 293, + 111, 111, 539, 111, 616, 616, 616, 616, 111, 203, + + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 111, 111, 538, 523, 485, 719, 720, 423, 295, + 356, 111, 111, 111, 111, 111, 111, 294, 111, 111, + 111, 111, 358, 191, 189, 187, 185, 181, 111, 111, + 111, 111, 111, 297, 111, 296, 356, 111, 111, 167, + 741, 209, 282, 191, 111, 189, 111, 278, 111, 300, + 111, 298, 299, 111, 185, 617, 111, 301, 181, 302, + 111, 274, 111, 273, 111, 167, 111, 111, 111, 111, + 111, 209, 201, 111, 198, 111, 194, 111, 191, 111, + + 303, 111, 189, 111, 111, 111, 111, 111, 188, 187, + 111, 187, 111, 305, 111, 304, 111, 185, 111, 104, + 111, 111, 111, 111, 111, 184, 179, 111, 177, 111, + 308, 306, 104, 111, 307, 111, 175, 111, 111, 111, + 111, 111, 174, 173, 167, 109, 111, 103, 111, 111, + 111, 93, 111, 90, 90, 309, 741, 111, 741, 111, + 310, 111, 111, 111, 741, 741, 741, 741, 111, 741, + 111, 741, 111, 111, 111, 741, 111, 741, 741, 313, + 111, 111, 314, 315, 111, 111, 316, 111, 111, 111, + 741, 111, 111, 741, 111, 741, 741, 319, 317, 741, + + 111, 111, 111, 111, 111, 111, 111, 111, 111, 318, + 111, 320, 111, 111, 741, 741, 741, 741, 741, 741, + 111, 741, 111, 111, 111, 741, 111, 741, 741, 741, + 111, 111, 111, 111, 111, 111, 111, 111, 741, 111, + 741, 741, 321, 741, 111, 741, 322, 324, 111, 741, + 111, 741, 741, 741, 111, 111, 111, 111, 111, 741, + 325, 741, 741, 111, 741, 111, 741, 111, 111, 111, + 741, 111, 326, 741, 741, 111, 111, 111, 111, 111, + 111, 111, 111, 741, 111, 741, 328, 111, 741, 111, + 741, 111, 741, 111, 741, 111, 741, 111, 741, 111, + + 111, 111, 741, 111, 741, 111, 329, 111, 111, 111, + 741, 111, 741, 741, 330, 111, 111, 111, 111, 111, + 334, 111, 741, 741, 111, 331, 741, 741, 333, 111, + 111, 111, 111, 111, 741, 111, 741, 111, 741, 111, + 111, 111, 111, 111, 741, 741, 741, 741, 335, 741, + 111, 741, 111, 336, 111, 741, 111, 741, 111, 741, + 111, 111, 111, 741, 111, 337, 111, 741, 111, 111, + 111, 741, 111, 741, 741, 741, 111, 111, 111, 111, + 111, 741, 741, 741, 338, 111, 741, 111, 741, 111, + 741, 111, 741, 111, 741, 741, 339, 111, 111, 111, + + 111, 111, 741, 341, 340, 741, 111, 741, 111, 741, + 111, 741, 111, 741, 111, 741, 741, 347, 111, 111, + 111, 343, 111, 344, 111, 111, 741, 111, 345, 741, + 741, 741, 741, 741, 111, 111, 111, 111, 111, 111, + 111, 741, 346, 111, 111, 741, 351, 741, 741, 741, + 111, 741, 111, 741, 111, 352, 352, 352, 352, 111, + 741, 741, 741, 354, 354, 354, 354, 741, 741, 741, + 353, 353, 353, 353, 353, 353, 353, 353, 355, 355, + 355, 355, 355, 355, 355, 355, 111, 111, 741, 741, + 741, 741, 741, 741, 360, 741, 111, 111, 359, 111, + + 111, 111, 111, 741, 741, 111, 111, 741, 111, 741, + 741, 741, 111, 361, 111, 741, 111, 741, 111, 111, + 362, 111, 111, 741, 741, 111, 741, 111, 364, 111, + 741, 111, 741, 111, 741, 111, 741, 111, 111, 111, + 365, 111, 111, 366, 111, 741, 741, 741, 741, 741, + 741, 111, 111, 111, 111, 111, 111, 111, 741, 741, + 111, 111, 741, 741, 363, 111, 741, 111, 741, 111, + 741, 111, 741, 111, 367, 111, 111, 111, 368, 111, + 741, 741, 741, 111, 111, 111, 111, 111, 370, 111, + 741, 369, 111, 741, 741, 741, 111, 111, 111, 111, + + 111, 111, 741, 111, 741, 371, 741, 111, 111, 372, + 111, 111, 373, 111, 741, 374, 111, 741, 741, 741, + 111, 741, 111, 111, 111, 111, 741, 111, 111, 111, + 741, 375, 111, 741, 111, 741, 741, 741, 111, 741, + 111, 741, 111, 741, 111, 111, 111, 111, 376, 741, + 741, 111, 377, 111, 741, 111, 741, 111, 741, 111, + 741, 111, 111, 111, 111, 111, 741, 378, 741, 741, + 111, 741, 111, 741, 379, 741, 111, 111, 380, 741, + 381, 111, 741, 111, 741, 741, 741, 111, 741, 111, + 741, 111, 741, 111, 111, 111, 111, 111, 741, 741, + + 111, 741, 111, 741, 111, 741, 111, 741, 111, 741, + 111, 741, 111, 111, 111, 111, 111, 741, 385, 111, + 741, 741, 386, 741, 741, 111, 111, 111, 111, 111, + 111, 111, 387, 741, 111, 111, 389, 111, 741, 384, + 741, 111, 741, 111, 393, 111, 741, 111, 741, 111, + 388, 111, 111, 390, 741, 111, 111, 391, 741, 741, + 741, 741, 111, 111, 111, 111, 111, 111, 392, 111, + 741, 111, 741, 111, 111, 111, 111, 111, 741, 741, + 394, 741, 111, 741, 111, 396, 111, 111, 111, 741, + 111, 741, 741, 741, 111, 111, 111, 111, 111, 111, + + 111, 111, 741, 111, 401, 397, 111, 741, 111, 741, + 111, 400, 111, 398, 111, 741, 741, 741, 111, 111, + 111, 111, 111, 741, 741, 741, 741, 111, 741, 111, + 741, 111, 402, 111, 741, 111, 403, 111, 741, 111, + 111, 111, 741, 111, 741, 111, 741, 111, 111, 111, + 741, 111, 741, 111, 741, 111, 111, 111, 741, 111, + 741, 741, 741, 111, 111, 111, 111, 111, 741, 406, + 741, 405, 111, 741, 111, 741, 111, 111, 111, 741, + 111, 741, 741, 741, 111, 111, 111, 111, 111, 407, + 741, 111, 111, 111, 408, 111, 111, 741, 111, 741, + + 741, 741, 111, 741, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 741, 111, 111, 741, 111, + 741, 741, 741, 111, 741, 111, 111, 111, 411, 111, + 111, 111, 111, 111, 741, 111, 111, 409, 412, 413, + 741, 741, 111, 741, 741, 741, 111, 741, 111, 741, + 111, 741, 111, 111, 111, 111, 111, 741, 741, 741, + 741, 111, 741, 111, 741, 111, 741, 111, 741, 111, + 415, 741, 111, 741, 352, 352, 352, 352, 414, 111, + 741, 111, 741, 111, 741, 741, 741, 741, 111, 353, + 353, 353, 353, 353, 353, 353, 353, 419, 419, 419, + + 419, 741, 741, 741, 741, 741, 741, 741, 420, 741, + 741, 741, 353, 353, 353, 353, 353, 353, 353, 353, + 354, 354, 354, 354, 741, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 355, 355, 355, 355, 355, + 355, 355, 355, 420, 741, 111, 741, 355, 355, 355, + 355, 355, 355, 355, 355, 111, 741, 111, 741, 111, + 111, 425, 741, 424, 111, 741, 741, 741, 741, 741, + 111, 741, 111, 111, 111, 426, 111, 741, 421, 111, + 741, 741, 741, 111, 741, 111, 111, 111, 111, 741, + 111, 741, 111, 428, 111, 111, 741, 111, 429, 741, + + 111, 741, 741, 430, 111, 741, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 741, 111, 111, + 741, 741, 741, 741, 741, 111, 111, 111, 111, 111, + 431, 741, 111, 741, 111, 741, 111, 111, 111, 111, + 111, 741, 432, 741, 741, 111, 433, 111, 741, 111, + 741, 111, 741, 111, 741, 741, 741, 434, 111, 111, + 111, 111, 741, 435, 741, 741, 111, 436, 741, 741, + 111, 111, 111, 437, 111, 741, 741, 111, 741, 111, + 438, 111, 741, 111, 439, 111, 741, 111, 111, 111, + 111, 111, 741, 741, 741, 741, 111, 741, 111, 111, + + 111, 741, 111, 741, 440, 741, 741, 111, 741, 111, + 741, 111, 741, 111, 111, 442, 741, 441, 111, 741, + 111, 741, 741, 741, 111, 741, 111, 741, 111, 741, + 111, 111, 111, 111, 111, 741, 741, 111, 443, 111, + 741, 111, 741, 111, 741, 111, 741, 111, 444, 445, + 111, 111, 111, 111, 741, 741, 111, 741, 741, 741, + 449, 741, 111, 111, 111, 111, 111, 111, 741, 741, + 111, 111, 111, 111, 450, 741, 451, 741, 741, 741, + 111, 741, 111, 111, 111, 111, 741, 111, 452, 111, + 111, 111, 111, 453, 741, 741, 741, 741, 741, 741, + + 111, 111, 454, 111, 111, 111, 111, 741, 741, 111, + 111, 741, 111, 741, 741, 456, 111, 741, 111, 741, + 111, 741, 111, 111, 111, 455, 111, 458, 741, 741, + 459, 111, 741, 111, 741, 111, 111, 111, 741, 741, + 457, 741, 111, 741, 111, 741, 111, 111, 111, 741, + 111, 741, 741, 741, 111, 111, 111, 111, 111, 111, + 111, 111, 461, 111, 741, 741, 111, 741, 111, 741, + 111, 741, 111, 741, 111, 741, 111, 741, 111, 111, + 462, 741, 111, 741, 111, 741, 111, 111, 111, 741, + 111, 741, 464, 741, 111, 111, 466, 111, 111, 741, + + 741, 741, 741, 111, 741, 741, 741, 111, 741, 111, + 111, 111, 741, 111, 741, 467, 111, 469, 741, 741, + 111, 111, 111, 111, 111, 470, 471, 111, 741, 111, + 741, 111, 111, 111, 111, 111, 741, 741, 741, 741, + 111, 741, 741, 741, 111, 111, 111, 741, 111, 741, + 741, 111, 741, 111, 475, 111, 472, 111, 741, 111, + 741, 111, 111, 111, 111, 111, 741, 741, 741, 741, + 111, 741, 111, 111, 111, 741, 111, 741, 476, 741, + 741, 111, 741, 111, 741, 111, 741, 111, 482, 482, + 482, 482, 111, 741, 741, 741, 741, 741, 741, 741, + + 741, 111, 741, 483, 483, 483, 483, 483, 483, 483, + 483, 111, 741, 111, 111, 111, 486, 111, 478, 741, + 111, 741, 741, 741, 111, 111, 111, 111, 111, 111, + 741, 111, 487, 111, 741, 111, 111, 489, 111, 111, + 741, 111, 741, 741, 111, 741, 741, 741, 111, 741, + 111, 111, 111, 111, 741, 111, 490, 111, 111, 741, + 111, 491, 741, 492, 111, 741, 741, 741, 111, 741, + 111, 741, 111, 741, 111, 111, 111, 111, 111, 741, + 741, 111, 741, 111, 741, 111, 741, 493, 741, 111, + 741, 111, 741, 111, 111, 111, 111, 741, 495, 494, + + 111, 741, 111, 741, 741, 741, 111, 741, 111, 741, + 111, 741, 111, 741, 111, 111, 111, 741, 741, 111, + 496, 111, 497, 741, 741, 111, 741, 498, 741, 111, + 741, 111, 741, 111, 741, 111, 111, 111, 111, 111, + 741, 500, 111, 741, 111, 741, 111, 741, 499, 741, + 111, 741, 111, 111, 111, 111, 111, 741, 741, 111, + 741, 111, 741, 111, 741, 111, 501, 111, 741, 111, + 111, 111, 111, 111, 741, 741, 111, 741, 111, 741, + 111, 741, 111, 503, 111, 741, 111, 502, 111, 111, + 111, 504, 111, 111, 741, 111, 741, 508, 741, 741, + + 741, 741, 111, 111, 111, 111, 111, 111, 111, 741, + 741, 111, 111, 741, 111, 509, 510, 741, 111, 741, + 111, 741, 111, 741, 111, 111, 111, 111, 111, 741, + 741, 111, 741, 111, 512, 111, 741, 111, 741, 111, + 741, 111, 511, 111, 111, 111, 111, 513, 741, 741, + 111, 741, 111, 514, 741, 741, 111, 741, 111, 741, + 111, 741, 111, 111, 111, 111, 111, 741, 741, 741, + 741, 111, 741, 111, 741, 111, 741, 111, 111, 515, + 741, 516, 111, 741, 111, 741, 741, 741, 111, 741, + 111, 741, 111, 741, 111, 111, 111, 111, 111, 741, + + 741, 517, 741, 111, 741, 111, 741, 111, 111, 111, + 520, 111, 741, 741, 111, 741, 741, 741, 111, 111, + 522, 111, 111, 111, 741, 111, 741, 111, 741, 111, + 111, 111, 111, 111, 741, 525, 741, 524, 111, 741, + 111, 741, 111, 741, 111, 741, 111, 741, 741, 741, + 111, 111, 111, 741, 111, 111, 528, 741, 111, 111, + 527, 111, 741, 741, 741, 111, 741, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 741, 111, + 111, 741, 741, 741, 741, 741, 111, 741, 111, 111, + 111, 111, 741, 111, 111, 111, 531, 741, 111, 482, + + 482, 482, 482, 741, 111, 741, 111, 741, 111, 741, + 741, 741, 540, 111, 483, 483, 483, 483, 483, 483, + 483, 483, 537, 741, 741, 741, 483, 483, 483, 483, + 483, 483, 483, 483, 111, 111, 741, 741, 741, 741, + 741, 541, 741, 741, 111, 111, 111, 111, 111, 111, + 741, 111, 111, 111, 111, 543, 741, 741, 741, 741, + 741, 111, 111, 544, 111, 111, 111, 111, 111, 741, + 111, 111, 741, 741, 545, 546, 741, 111, 111, 111, + 111, 111, 111, 111, 111, 741, 111, 111, 741, 741, + 741, 741, 741, 111, 111, 111, 111, 111, 111, 111, + + 741, 741, 111, 111, 741, 111, 547, 548, 741, 111, + 741, 111, 741, 111, 741, 111, 111, 111, 111, 111, + 741, 741, 111, 741, 111, 741, 111, 549, 111, 741, + 111, 741, 111, 111, 111, 111, 111, 741, 741, 741, + 741, 111, 741, 111, 111, 111, 741, 111, 741, 741, + 741, 550, 111, 741, 111, 111, 111, 741, 111, 741, + 741, 552, 551, 111, 741, 111, 741, 111, 741, 111, + 741, 111, 111, 111, 111, 111, 741, 741, 111, 741, + 111, 741, 553, 741, 111, 558, 111, 741, 111, 111, + 111, 111, 111, 741, 741, 741, 741, 111, 741, 111, + + 111, 111, 741, 111, 741, 741, 111, 559, 111, 741, + 111, 741, 111, 741, 111, 741, 111, 111, 111, 111, + 111, 741, 741, 111, 741, 111, 561, 111, 741, 111, + 741, 111, 741, 111, 560, 111, 111, 111, 111, 111, + 741, 741, 111, 741, 741, 741, 741, 741, 111, 111, + 111, 111, 111, 111, 111, 563, 562, 111, 111, 741, + 111, 741, 741, 741, 111, 741, 111, 741, 111, 741, + 111, 111, 111, 111, 111, 741, 741, 111, 741, 111, + 741, 567, 741, 111, 741, 111, 741, 111, 111, 111, + 111, 111, 741, 741, 111, 741, 111, 741, 111, 741, + + 111, 741, 111, 741, 111, 564, 111, 111, 111, 111, + 741, 741, 571, 111, 741, 111, 741, 741, 572, 111, + 741, 111, 741, 111, 741, 111, 741, 111, 111, 111, + 575, 111, 741, 741, 111, 741, 580, 580, 580, 580, + 741, 111, 741, 111, 741, 111, 741, 741, 741, 741, + 111, 581, 581, 581, 581, 581, 581, 581, 581, 111, + 111, 585, 741, 741, 741, 741, 584, 741, 741, 111, + 111, 111, 111, 111, 111, 111, 741, 741, 111, 111, + 741, 741, 741, 111, 741, 111, 111, 111, 741, 111, + 741, 587, 741, 111, 111, 111, 111, 111, 589, 111, + + 111, 588, 111, 741, 741, 111, 592, 111, 741, 111, + 741, 590, 741, 111, 741, 111, 741, 111, 111, 111, + 591, 111, 741, 111, 741, 111, 111, 111, 741, 111, + 741, 741, 741, 111, 111, 111, 111, 111, 741, 593, + 741, 741, 111, 741, 111, 741, 111, 741, 111, 741, + 111, 741, 111, 741, 111, 111, 111, 741, 111, 594, + 111, 741, 111, 111, 111, 741, 111, 741, 741, 741, + 111, 111, 111, 111, 111, 741, 599, 741, 741, 111, + 741, 111, 741, 111, 111, 111, 741, 111, 741, 741, + 741, 111, 111, 111, 111, 111, 111, 111, 111, 741, + + 111, 741, 741, 111, 741, 111, 741, 111, 111, 111, + 741, 111, 600, 741, 741, 111, 111, 111, 111, 111, + 111, 111, 111, 741, 111, 608, 601, 111, 741, 111, + 741, 111, 741, 111, 741, 111, 741, 741, 741, 111, + 111, 111, 111, 111, 741, 111, 741, 741, 111, 741, + 741, 741, 111, 741, 111, 611, 111, 111, 741, 111, + 111, 111, 741, 741, 111, 580, 580, 580, 580, 741, + 111, 741, 111, 620, 111, 741, 741, 741, 111, 111, + 581, 581, 581, 581, 581, 581, 581, 581, 111, 111, + 111, 741, 111, 741, 741, 111, 741, 111, 741, 111, + + 741, 111, 741, 111, 741, 111, 741, 111, 111, 111, + 111, 111, 621, 622, 111, 741, 623, 741, 741, 741, + 111, 111, 111, 111, 111, 111, 111, 741, 741, 111, + 111, 741, 111, 741, 626, 741, 111, 741, 624, 741, + 111, 741, 111, 111, 111, 111, 111, 741, 741, 111, + 741, 111, 741, 627, 741, 111, 741, 111, 741, 111, + 111, 111, 111, 111, 741, 631, 741, 741, 111, 741, + 111, 111, 111, 632, 111, 741, 741, 111, 633, 111, + 741, 111, 741, 111, 741, 111, 741, 111, 111, 111, + 111, 111, 741, 741, 111, 741, 111, 741, 111, 741, + + 648, 741, 111, 741, 111, 741, 111, 111, 111, 111, + 111, 649, 741, 111, 741, 741, 741, 741, 741, 111, + 111, 111, 111, 111, 111, 111, 111, 741, 111, 111, + 741, 741, 741, 741, 741, 111, 111, 111, 111, 111, + 111, 111, 650, 741, 111, 111, 741, 111, 652, 741, + 741, 111, 741, 111, 741, 111, 741, 111, 111, 111, + 111, 111, 741, 741, 741, 741, 111, 741, 111, 111, + 656, 741, 111, 741, 741, 111, 741, 111, 741, 111, + 741, 111, 657, 111, 741, 111, 111, 111, 111, 111, + 741, 741, 111, 741, 111, 741, 111, 741, 111, 741, + + 111, 741, 111, 111, 111, 111, 111, 741, 741, 741, + 741, 111, 741, 111, 111, 111, 741, 111, 741, 741, + 111, 672, 111, 741, 111, 741, 111, 741, 111, 741, + 111, 676, 677, 111, 111, 111, 111, 741, 741, 111, + 741, 741, 741, 741, 741, 111, 111, 111, 111, 111, + 111, 111, 111, 741, 111, 111, 741, 741, 692, 741, + 741, 111, 111, 111, 111, 111, 111, 741, 741, 741, + 111, 111, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 65, 65, + + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 92, 92, 92, + 92, 741, 92, 92, 92, 92, 92, 92, 92, 92, + 99, 99, 99, 741, 99, 741, 99, 741, 99, 168, + 168, 741, 168, 168, 172, 172, 741, 741, 172, 172, + 741, 172, 172, 172, 172, 172, 172, 176, 176, 176, + 176, 741, 176, 176, 176, 176, 176, 176, 176, 176, + 178, 178, 178, 178, 178, 178, 178, 178, 741, 178, + + 178, 180, 741, 741, 741, 180, 180, 180, 180, 180, + 180, 180, 181, 741, 741, 741, 181, 181, 181, 181, + 181, 181, 181, 186, 186, 741, 186, 186, 190, 190, + 741, 190, 190, 192, 192, 741, 192, 192, 202, 741, + 202, 202, 117, 117, 741, 117, 117, 270, 741, 270, + 270, 277, 741, 277, 277, 279, 741, 279, 279, 280, + 741, 280, 280, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 203, 203, 741, 203, + 203, 583, 583, 741, 583, 583, 583, 583, 583, 583, + 583, 583, 583, 583, 581, 581, 581, 741, 741, 741, + + 581, 741, 741, 741, 741, 581, 17, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, 741, 741 } ; -static yyconst short int yy_chk[4496] = +static yyconst short int yy_chk[4591] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -1269,37 +1289,37 @@ static yyconst short int yy_chk[4496] = 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, 3, 3, 3, 4, 4, 4, 5, 5, - 5, 11, 3, 9, 7, 4, 8, 9, 5, 6, - - 6, 6, 7, 10, 8, 12, 7, 10, 8, 6, - 95, 28, 11, 28, 147, 11, 259, 7, 80, 8, - 19, 19, 19, 19, 127, 142, 12, 19, 156, 12, - 20, 20, 20, 20, 80, 99, 732, 20, 24, 24, - 24, 24, 95, 188, 531, 24, 26, 731, 99, 188, - 26, 531, 24, 24, 26, 26, 26, 26, 26, 26, - 26, 78, 78, 78, 78, 137, 80, 147, 11, 128, - 11, 30, 30, 30, 30, 30, 30, 30, 30, 142, - 259, 127, 12, 156, 12, 13, 13, 13, 13, 13, + 1, 1, 1, 3, 3, 3, 4, 4, 4, 5, + 5, 5, 133, 11, 3, 9, 7, 4, 8, 9, + + 5, 6, 6, 6, 7, 12, 8, 147, 132, 7, + 10, 8, 6, 739, 10, 11, 101, 29, 11, 29, + 7, 96, 8, 79, 79, 79, 79, 12, 738, 101, + 12, 19, 19, 19, 19, 81, 538, 133, 19, 20, + 20, 20, 20, 538, 196, 36, 20, 24, 24, 24, + 24, 36, 81, 96, 24, 36, 152, 36, 36, 36, + 142, 147, 24, 24, 36, 132, 26, 80, 80, 80, + 80, 11, 196, 11, 26, 26, 26, 26, 26, 26, + 26, 26, 161, 12, 81, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 79, 79, 79, 79, 90, 90, 90, 90, 13, 13, - 13, 13, 13, 34, 128, 191, 34, 13, 279, 36, - 34, 137, 36, 34, 34, 34, 34, 34, 223, 36, - 159, 36, 34, 36, 40, 261, 34, 35, 36, 13, - 13, 13, 191, 35, 40, 279, 40, 35, 40, 35, - 35, 35, 244, 40, 160, 222, 35, 178, 178, 178, - 178, 268, 268, 234, 13, 13, 13, 14, 14, 14, + 13, 13, 91, 91, 91, 91, 195, 164, 195, 152, + 13, 13, 13, 13, 13, 27, 142, 195, 327, 13, + 27, 41, 357, 27, 27, 27, 27, 27, 27, 27, + 27, 41, 357, 41, 268, 41, 229, 161, 165, 241, + 41, 13, 13, 13, 30, 44, 30, 30, 30, 30, + 30, 30, 30, 30, 230, 44, 193, 44, 251, 44, + 164, 382, 193, 30, 44, 327, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 238, 159, 177, 177, 37, 223, 261, 407, - 14, 14, 14, 14, 14, 177, 37, 37, 37, 14, - - 37, 190, 160, 190, 222, 37, 44, 44, 37, 244, - 44, 190, 234, 38, 38, 160, 44, 278, 44, 278, - 44, 14, 14, 14, 38, 44, 38, 278, 38, 728, - 38, 238, 727, 38, 350, 44, 100, 100, 100, 100, - 100, 100, 100, 100, 350, 407, 14, 14, 14, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 14, 14, 14, 14, 14, 229, 165, 268, 241, 182, + 182, 44, 30, 14, 14, 14, 14, 14, 35, 165, + + 182, 35, 14, 582, 37, 35, 382, 37, 35, 35, + 35, 35, 35, 230, 37, 251, 37, 35, 37, 38, + 286, 35, 401, 37, 14, 14, 14, 275, 275, 38, + 38, 38, 582, 38, 183, 183, 183, 183, 38, 422, + 735, 38, 734, 733, 422, 732, 401, 731, 286, 14, + 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, @@ -1308,476 +1328,485 @@ static yyconst short int yy_chk[4496] = 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 23, 343, 415, 97, 97, 97, 97, 415, 726, - 725, 97, 647, 304, 316, 724, 723, 23, 97, 97, - 722, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 15, 15, 15, 15, 15, 23, 47, 730, 285, 47, + 285, 729, 419, 419, 419, 419, 47, 728, 47, 285, + 47, 727, 23, 726, 724, 47, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 647, 343, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 311, 266, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 33, 304, 316, 33, 33, 33, 33, 33, - 33, 33, 33, 721, 325, 342, 335, 720, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 255, 305, 375, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 39, - 260, 320, 341, 342, 41, 41, 325, 41, 335, 39, - 356, 39, 392, 39, 376, 41, 41, 41, 39, 41, - 43, 375, 41, 255, 41, 42, 42, 305, 394, 410, - - 43, 39, 43, 42, 43, 377, 42, 402, 42, 43, - 42, 397, 39, 45, 45, 42, 45, 719, 320, 260, - 403, 341, 394, 481, 45, 388, 45, 409, 45, 46, - 45, 411, 46, 45, 439, 47, 43, 376, 47, 46, - 356, 46, 47, 46, 392, 47, 527, 47, 46, 47, - 461, 48, 50, 47, 47, 601, 397, 45, 47, 48, - 48, 410, 50, 49, 50, 377, 50, 402, 420, 403, - 48, 50, 48, 49, 48, 49, 48, 49, 388, 48, - 481, 49, 49, 51, 441, 601, 411, 409, 50, 439, - 51, 527, 48, 51, 440, 51, 461, 51, 53, 53, - - 53, 53, 51, 49, 103, 103, 103, 103, 103, 103, - 103, 103, 53, 53, 53, 53, 53, 53, 53, 53, - 76, 420, 453, 456, 717, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 452, 471, 441, 106, 107, - 466, 440, 456, 76, 76, 76, 76, 76, 106, 107, - 106, 107, 106, 107, 108, 715, 107, 106, 107, 452, - 412, 412, 412, 412, 108, 467, 108, 109, 108, 453, - 110, 499, 472, 108, 76, 76, 76, 109, 557, 109, - 110, 109, 110, 470, 110, 111, 109, 473, 474, 110, - 109, 519, 714, 466, 500, 111, 471, 111, 528, 111, - - 76, 77, 522, 111, 111, 499, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 192, 192, 192, 192, - 192, 192, 192, 192, 77, 77, 77, 77, 77, 113, - 467, 512, 470, 472, 113, 114, 473, 474, 557, 113, - 412, 113, 77, 113, 523, 114, 519, 114, 113, 114, - 115, 500, 526, 114, 114, 77, 77, 77, 116, 522, - 115, 514, 115, 528, 115, 512, 547, 549, 116, 115, - 116, 116, 116, 713, 498, 529, 712, 116, 523, 535, - 550, 77, 105, 105, 105, 105, 105, 105, 105, 105, - 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, - - 105, 105, 105, 105, 117, 526, 118, 118, 498, 529, - 514, 561, 569, 710, 117, 566, 117, 118, 117, 118, - 118, 118, 120, 117, 119, 119, 118, 498, 547, 549, - 535, 550, 120, 120, 120, 119, 120, 119, 121, 119, - 548, 120, 121, 559, 119, 709, 122, 570, 121, 563, - 121, 567, 121, 572, 571, 575, 122, 121, 122, 600, - 122, 123, 123, 123, 125, 122, 566, 124, 124, 569, - 606, 123, 561, 123, 125, 123, 125, 124, 125, 124, - 123, 124, 126, 125, 575, 124, 124, 129, 571, 588, - 589, 674, 126, 600, 126, 126, 126, 129, 563, 585, - - 130, 126, 570, 130, 606, 559, 548, 129, 131, 129, - 130, 129, 130, 567, 130, 572, 129, 585, 131, 130, - 131, 598, 131, 132, 132, 627, 590, 131, 574, 574, - 574, 574, 622, 132, 133, 132, 646, 132, 597, 589, - 132, 132, 132, 729, 133, 134, 133, 133, 133, 588, - 674, 135, 708, 133, 595, 134, 707, 134, 706, 134, - 607, 135, 136, 135, 134, 135, 621, 134, 598, 729, - 135, 603, 136, 605, 136, 138, 136, 608, 139, 623, - 622, 136, 627, 138, 630, 138, 590, 138, 139, 138, - 139, 140, 139, 646, 138, 629, 139, 139, 597, 141, - - 632, 140, 143, 140, 634, 140, 636, 595, 574, 141, - 140, 141, 143, 141, 143, 144, 143, 141, 141, 621, - 143, 143, 607, 637, 605, 144, 145, 144, 638, 144, - 700, 603, 623, 656, 144, 144, 145, 608, 145, 146, - 145, 648, 146, 699, 630, 145, 146, 653, 629, 146, - 698, 146, 654, 146, 148, 148, 651, 634, 146, 730, - 660, 149, 632, 697, 658, 148, 659, 148, 636, 148, - 703, 149, 150, 149, 148, 149, 149, 661, 151, 149, - 149, 638, 150, 637, 150, 730, 150, 153, 151, 152, - 151, 150, 151, 656, 151, 694, 150, 151, 648, 152, - - 153, 152, 667, 152, 653, 654, 154, 651, 152, 687, - 153, 154, 153, 660, 153, 666, 154, 155, 154, 153, - 154, 658, 691, 157, 690, 154, 659, 155, 703, 155, - 157, 155, 668, 157, 661, 157, 155, 157, 161, 158, - 158, 676, 157, 158, 609, 609, 609, 609, 161, 158, - 161, 158, 161, 158, 680, 667, 161, 161, 158, 164, - 164, 164, 164, 673, 678, 687, 666, 689, 688, 711, - 693, 695, 686, 164, 164, 164, 164, 164, 164, 164, - 164, 165, 701, 668, 691, 165, 165, 165, 165, 165, - 165, 165, 165, 166, 676, 679, 681, 166, 166, 166, - - 166, 166, 166, 166, 166, 195, 197, 198, 684, 197, - 683, 680, 682, 675, 673, 678, 197, 198, 197, 198, - 197, 198, 199, 200, 609, 197, 198, 693, 695, 711, - 696, 701, 199, 200, 199, 200, 199, 200, 704, 672, - 671, 199, 200, 664, 663, 662, 657, 681, 679, 705, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 201, 655, 652, 644, 640, 639, 635, 633, - 203, 696, 201, 204, 201, 201, 201, 203, 631, 704, - 203, 201, 203, 204, 203, 204, 205, 204, 628, 203, - - 705, 618, 204, 612, 206, 611, 205, 602, 205, 599, - 205, 596, 207, 205, 206, 205, 206, 591, 206, 579, - 208, 576, 207, 206, 207, 562, 207, 208, 207, 558, - 208, 207, 208, 209, 208, 525, 516, 511, 478, 208, - 477, 210, 458, 209, 211, 209, 416, 209, 351, 349, - 209, 210, 209, 210, 211, 210, 211, 280, 211, 273, - 210, 211, 211, 211, 212, 212, 213, 272, 271, 213, - 270, 269, 212, 266, 263, 212, 213, 212, 213, 212, - 213, 214, 202, 196, 212, 213, 189, 215, 187, 185, - 183, 214, 181, 214, 214, 214, 176, 215, 216, 215, - - 214, 215, 174, 169, 217, 163, 215, 217, 216, 216, - 216, 112, 216, 104, 217, 218, 217, 216, 217, 101, - 98, 219, 96, 217, 219, 218, 94, 218, 218, 218, - 93, 219, 220, 219, 218, 219, 92, 89, 84, 83, - 219, 82, 220, 221, 220, 69, 220, 66, 62, 220, - 61, 220, 58, 221, 221, 221, 224, 221, 57, 52, - 31, 27, 221, 22, 225, 21, 224, 226, 224, 18, - 224, 17, 0, 224, 225, 224, 225, 226, 225, 226, - 226, 226, 227, 225, 0, 228, 226, 0, 229, 0, - 0, 229, 227, 0, 227, 228, 227, 228, 229, 228, - - 229, 227, 229, 228, 228, 230, 231, 229, 0, 0, - 0, 0, 0, 0, 230, 0, 231, 232, 231, 0, - 231, 0, 0, 0, 230, 231, 230, 232, 230, 232, - 233, 232, 0, 230, 0, 0, 232, 0, 235, 0, - 233, 235, 233, 0, 233, 0, 0, 0, 235, 233, - 235, 236, 235, 0, 236, 0, 0, 235, 0, 237, - 0, 236, 239, 236, 0, 236, 237, 0, 0, 237, - 236, 237, 239, 237, 239, 240, 239, 0, 237, 0, - 239, 239, 0, 241, 0, 240, 0, 240, 0, 240, - 0, 242, 0, 241, 240, 241, 0, 241, 0, 243, - - 241, 242, 241, 242, 0, 242, 0, 0, 242, 243, - 242, 243, 245, 243, 246, 246, 0, 0, 243, 243, - 0, 0, 245, 247, 245, 246, 245, 246, 0, 246, - 0, 245, 0, 247, 246, 247, 248, 247, 0, 0, - 0, 0, 247, 0, 249, 0, 248, 249, 248, 0, - 248, 0, 250, 0, 249, 248, 249, 0, 249, 250, - 251, 0, 250, 249, 250, 0, 250, 0, 0, 0, - 251, 250, 251, 252, 251, 0, 0, 0, 251, 251, - 0, 253, 0, 252, 0, 252, 0, 252, 0, 0, - 252, 253, 252, 253, 254, 253, 0, 254, 253, 0, - - 253, 0, 256, 0, 254, 0, 254, 0, 254, 0, - 0, 258, 256, 254, 256, 256, 256, 256, 257, 258, - 0, 256, 256, 0, 0, 0, 0, 0, 257, 258, - 257, 258, 257, 258, 262, 0, 257, 257, 258, 0, - 262, 0, 0, 0, 262, 0, 262, 0, 262, 264, - 264, 264, 264, 262, 0, 0, 0, 265, 265, 265, - 265, 0, 0, 264, 264, 264, 264, 264, 264, 264, - 264, 265, 265, 265, 265, 265, 265, 265, 265, 281, - 282, 0, 0, 0, 0, 0, 0, 282, 0, 281, - 282, 281, 282, 281, 282, 283, 0, 0, 281, 282, - - 0, 284, 0, 0, 0, 283, 283, 283, 0, 283, - 0, 284, 285, 284, 283, 284, 0, 0, 286, 0, - 284, 286, 285, 0, 285, 0, 285, 0, 286, 0, - 286, 285, 286, 287, 287, 288, 288, 286, 0, 0, - 0, 0, 0, 0, 287, 288, 287, 288, 287, 288, - 289, 0, 0, 287, 288, 0, 0, 285, 290, 0, - 289, 0, 289, 0, 289, 0, 291, 289, 290, 289, - 290, 290, 290, 0, 0, 0, 291, 290, 291, 293, - 291, 292, 292, 0, 291, 291, 0, 0, 0, 293, - 294, 293, 292, 293, 292, 0, 292, 0, 293, 0, - - 294, 292, 294, 295, 294, 295, 296, 0, 296, 294, - 0, 0, 0, 295, 0, 295, 296, 295, 296, 0, - 296, 297, 295, 0, 297, 296, 0, 298, 0, 0, - 0, 297, 0, 297, 0, 297, 0, 298, 299, 298, - 297, 298, 0, 0, 300, 299, 298, 0, 299, 0, - 299, 0, 299, 0, 300, 301, 300, 299, 300, 0, - 300, 0, 0, 300, 0, 301, 0, 301, 0, 301, - 302, 301, 0, 302, 301, 0, 303, 0, 0, 0, - 302, 0, 302, 0, 302, 0, 303, 306, 303, 302, - 303, 0, 0, 307, 0, 303, 0, 306, 0, 306, - - 0, 306, 0, 307, 0, 307, 306, 307, 308, 309, - 0, 307, 307, 0, 0, 308, 0, 0, 308, 309, - 308, 309, 308, 309, 310, 309, 0, 308, 309, 311, - 311, 0, 306, 0, 310, 0, 310, 313, 310, 0, - 311, 0, 311, 310, 311, 312, 311, 0, 313, 311, - 312, 0, 0, 0, 0, 312, 314, 312, 313, 312, - 313, 312, 313, 0, 312, 0, 314, 313, 314, 315, - 314, 0, 0, 314, 0, 314, 0, 317, 317, 315, - 318, 315, 0, 315, 0, 0, 0, 317, 315, 317, - 318, 317, 318, 319, 318, 0, 317, 322, 318, 318, - - 0, 321, 0, 319, 321, 319, 319, 319, 0, 0, - 0, 321, 319, 321, 322, 321, 0, 0, 0, 0, - 321, 0, 323, 0, 322, 323, 322, 0, 322, 324, - 324, 0, 323, 322, 323, 0, 323, 0, 326, 0, - 324, 323, 324, 0, 324, 0, 327, 0, 326, 324, - 326, 0, 326, 0, 0, 0, 327, 326, 327, 328, - 327, 0, 328, 0, 327, 327, 0, 329, 0, 328, - 330, 328, 0, 328, 0, 0, 0, 329, 328, 329, - 330, 329, 330, 0, 330, 332, 329, 331, 331, 330, - 0, 333, 0, 0, 0, 332, 0, 332, 331, 332, - - 331, 333, 331, 333, 332, 333, 334, 331, 0, 336, - 333, 0, 337, 0, 0, 0, 334, 0, 334, 336, - 334, 336, 337, 336, 337, 334, 337, 0, 336, 338, - 332, 337, 338, 0, 0, 339, 0, 0, 0, 338, - 0, 338, 0, 338, 0, 339, 340, 339, 338, 339, - 0, 0, 0, 0, 339, 0, 340, 0, 340, 0, - 340, 0, 344, 340, 0, 340, 0, 0, 0, 0, - 0, 339, 344, 0, 344, 0, 344, 345, 345, 345, - 345, 344, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 345, 345, 345, 345, 345, 345, 345, 345, 346, - - 346, 346, 346, 0, 0, 0, 0, 0, 0, 346, - 0, 0, 0, 346, 346, 346, 346, 346, 346, 346, - 346, 347, 347, 347, 347, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, - 347, 347, 347, 348, 0, 352, 355, 348, 348, 348, - 348, 348, 348, 348, 348, 352, 355, 352, 355, 352, - 355, 353, 353, 352, 352, 355, 0, 0, 0, 0, - 0, 353, 0, 353, 0, 353, 354, 354, 0, 346, - 353, 0, 357, 357, 0, 0, 0, 354, 0, 354, - 0, 354, 0, 357, 0, 357, 354, 357, 358, 358, - - 0, 359, 357, 0, 359, 0, 0, 0, 358, 360, - 358, 359, 358, 359, 0, 359, 0, 358, 0, 360, - 359, 360, 361, 360, 0, 0, 0, 0, 360, 0, - 362, 0, 361, 0, 361, 0, 361, 0, 363, 0, - 362, 361, 362, 0, 362, 363, 362, 0, 363, 362, - 363, 364, 363, 0, 0, 0, 0, 363, 0, 365, - 0, 364, 365, 364, 0, 364, 365, 0, 0, 365, - 364, 365, 366, 365, 366, 0, 0, 0, 365, 0, - 367, 0, 366, 367, 366, 0, 366, 367, 368, 0, - 367, 366, 367, 0, 367, 0, 369, 0, 368, 367, - - 368, 0, 368, 0, 368, 0, 369, 368, 369, 0, - 369, 370, 370, 0, 369, 369, 0, 371, 0, 0, - 0, 370, 0, 370, 0, 370, 0, 371, 372, 371, - 370, 371, 0, 0, 373, 371, 371, 0, 372, 0, - 372, 0, 372, 0, 373, 372, 373, 372, 373, 374, - 378, 0, 0, 373, 0, 0, 0, 378, 0, 374, - 378, 374, 378, 374, 378, 0, 0, 380, 374, 378, - 379, 379, 0, 379, 0, 0, 0, 380, 0, 380, - 379, 380, 379, 0, 379, 380, 380, 382, 381, 379, - 381, 0, 0, 0, 0, 0, 0, 382, 381, 382, - - 381, 382, 381, 383, 0, 0, 382, 381, 0, 384, - 0, 0, 384, 383, 0, 383, 0, 383, 0, 384, - 385, 384, 383, 384, 386, 0, 0, 387, 384, 0, - 385, 0, 385, 386, 385, 0, 0, 385, 0, 385, - 0, 389, 0, 386, 387, 386, 0, 386, 0, 0, - 0, 389, 386, 389, 387, 389, 387, 390, 387, 389, - 389, 0, 0, 387, 0, 391, 0, 390, 0, 390, - 0, 390, 0, 393, 0, 391, 390, 391, 0, 391, - 0, 395, 0, 393, 391, 393, 0, 393, 0, 393, - 0, 395, 393, 395, 396, 395, 0, 0, 0, 0, - - 395, 0, 0, 0, 396, 0, 396, 398, 396, 0, - 399, 0, 396, 396, 398, 0, 0, 398, 400, 398, - 399, 398, 399, 400, 399, 0, 398, 0, 400, 399, - 400, 401, 400, 0, 0, 0, 0, 400, 0, 0, - 0, 401, 404, 401, 0, 401, 0, 0, 405, 0, - 401, 405, 404, 401, 404, 0, 404, 0, 405, 406, - 405, 404, 405, 0, 0, 0, 0, 405, 0, 406, - 408, 406, 0, 406, 0, 406, 0, 0, 406, 0, - 408, 0, 408, 0, 408, 413, 413, 413, 413, 408, - 0, 0, 0, 0, 0, 0, 0, 417, 0, 413, - - 413, 413, 413, 413, 413, 413, 413, 417, 0, 417, - 419, 417, 418, 418, 0, 408, 417, 0, 0, 0, - 419, 421, 419, 418, 419, 418, 0, 418, 419, 419, - 0, 421, 418, 421, 422, 421, 0, 423, 0, 0, - 421, 0, 0, 0, 422, 0, 422, 423, 422, 423, - 0, 423, 422, 422, 424, 0, 423, 424, 0, 425, - 425, 0, 0, 0, 424, 0, 424, 0, 424, 0, - 425, 426, 425, 424, 425, 0, 0, 427, 0, 425, - 0, 426, 0, 426, 0, 426, 0, 427, 0, 427, - 426, 427, 428, 0, 428, 427, 427, 0, 429, 0, - - 0, 0, 428, 0, 428, 0, 428, 0, 429, 0, - 429, 428, 429, 0, 0, 430, 429, 429, 430, 0, - 0, 431, 0, 431, 0, 430, 0, 430, 0, 430, - 0, 431, 432, 431, 430, 431, 0, 433, 433, 0, - 431, 0, 432, 0, 432, 0, 432, 0, 433, 434, - 433, 432, 433, 0, 0, 435, 0, 433, 0, 434, - 0, 434, 435, 434, 0, 435, 436, 435, 434, 435, - 0, 0, 437, 0, 435, 0, 436, 0, 436, 437, - 436, 0, 437, 436, 437, 436, 437, 438, 438, 442, - 0, 437, 0, 442, 0, 0, 0, 0, 438, 442, - - 438, 442, 438, 442, 443, 0, 0, 438, 442, 0, - 444, 443, 444, 0, 443, 0, 443, 0, 443, 0, - 444, 445, 444, 443, 444, 0, 0, 446, 0, 444, - 446, 445, 0, 445, 0, 445, 0, 446, 445, 446, - 445, 446, 447, 447, 0, 0, 446, 0, 448, 448, - 0, 0, 447, 0, 447, 0, 447, 0, 448, 449, - 448, 447, 448, 0, 0, 0, 0, 448, 0, 449, - 0, 449, 0, 449, 450, 449, 0, 450, 449, 0, - 451, 0, 0, 0, 450, 0, 450, 0, 450, 0, - 451, 454, 451, 450, 451, 0, 0, 451, 0, 451, - - 0, 454, 0, 454, 457, 454, 455, 455, 0, 0, - 454, 0, 0, 0, 457, 459, 457, 455, 457, 455, - 0, 455, 0, 457, 0, 459, 455, 459, 460, 459, - 0, 460, 0, 459, 459, 0, 462, 0, 460, 0, - 460, 0, 460, 0, 0, 0, 462, 460, 462, 0, - 462, 463, 463, 0, 464, 462, 462, 465, 0, 0, - 0, 463, 0, 463, 464, 463, 464, 465, 464, 465, - 463, 465, 468, 464, 0, 469, 465, 0, 0, 0, - 0, 0, 468, 0, 468, 469, 468, 469, 0, 469, - 0, 468, 469, 0, 469, 475, 475, 475, 475, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 475, - 475, 475, 475, 475, 475, 475, 475, 476, 0, 479, - 0, 476, 476, 476, 476, 476, 476, 476, 476, 479, - 0, 479, 480, 479, 0, 482, 0, 479, 479, 480, - 0, 0, 480, 0, 480, 482, 480, 482, 0, 482, - 483, 480, 0, 483, 482, 0, 484, 0, 0, 0, - 483, 0, 483, 0, 483, 0, 484, 485, 484, 483, - 484, 0, 0, 486, 485, 484, 0, 485, 0, 485, - 486, 485, 0, 486, 487, 486, 485, 486, 0, 0, - 488, 0, 486, 0, 487, 0, 487, 0, 487, 0, - - 488, 489, 488, 487, 488, 0, 0, 0, 489, 488, - 0, 489, 490, 489, 490, 489, 0, 0, 491, 0, - 489, 0, 490, 0, 490, 0, 490, 0, 491, 492, - 491, 490, 491, 0, 492, 493, 0, 491, 0, 492, - 0, 492, 0, 492, 0, 493, 494, 493, 492, 493, - 0, 0, 0, 493, 493, 0, 494, 495, 494, 0, - 494, 0, 0, 496, 494, 494, 0, 495, 0, 495, - 0, 495, 0, 496, 497, 496, 495, 496, 0, 0, - 501, 0, 496, 0, 497, 0, 497, 501, 497, 0, - 501, 502, 501, 497, 501, 0, 0, 0, 0, 501, - - 0, 502, 503, 502, 0, 502, 0, 0, 504, 502, - 502, 0, 503, 0, 503, 0, 503, 0, 504, 505, - 504, 503, 504, 0, 0, 506, 0, 504, 506, 505, - 0, 505, 0, 505, 0, 506, 505, 506, 505, 506, - 507, 508, 0, 0, 506, 0, 0, 0, 0, 0, - 507, 508, 507, 508, 507, 508, 509, 509, 507, 507, - 508, 0, 510, 0, 0, 0, 509, 0, 509, 0, - 509, 0, 510, 513, 510, 509, 510, 0, 0, 515, - 0, 510, 0, 513, 0, 513, 0, 513, 0, 515, - 517, 515, 513, 515, 0, 0, 518, 0, 515, 0, - - 517, 0, 517, 0, 517, 0, 518, 510, 518, 517, - 518, 520, 0, 0, 520, 518, 0, 521, 0, 0, - 521, 520, 0, 520, 0, 520, 0, 521, 0, 521, - 520, 521, 524, 524, 0, 0, 521, 0, 0, 530, - 530, 530, 530, 524, 0, 524, 0, 524, 0, 0, - 0, 0, 524, 530, 530, 530, 530, 530, 530, 530, - 530, 533, 534, 534, 0, 0, 0, 0, 533, 0, - 0, 533, 534, 533, 534, 533, 534, 536, 0, 0, - 533, 534, 0, 0, 0, 537, 0, 536, 538, 536, - 0, 536, 0, 536, 0, 537, 536, 537, 538, 537, - - 538, 539, 538, 537, 537, 0, 0, 538, 542, 540, - 0, 539, 0, 539, 0, 539, 0, 541, 0, 540, - 539, 540, 540, 540, 0, 542, 0, 541, 540, 541, - 0, 541, 0, 0, 0, 542, 541, 542, 543, 542, - 0, 543, 0, 0, 542, 0, 544, 0, 543, 0, - 543, 0, 543, 0, 545, 0, 544, 543, 544, 0, - 544, 545, 546, 0, 545, 544, 545, 0, 545, 0, - 0, 0, 546, 545, 546, 551, 546, 0, 551, 0, - 0, 546, 0, 552, 0, 551, 553, 551, 0, 551, - 0, 0, 0, 552, 551, 552, 553, 552, 553, 554, - - 553, 0, 552, 0, 0, 553, 0, 555, 0, 554, - 556, 554, 0, 554, 555, 0, 0, 555, 554, 555, - 556, 555, 556, 560, 556, 0, 555, 564, 556, 556, - 0, 565, 0, 560, 0, 560, 0, 560, 0, 0, - 0, 565, 560, 565, 564, 565, 0, 568, 0, 0, - 565, 0, 0, 0, 564, 0, 564, 568, 564, 568, - 0, 568, 0, 564, 0, 0, 568, 573, 573, 573, - 573, 0, 0, 0, 0, 0, 0, 0, 0, 577, - 0, 573, 573, 573, 573, 573, 573, 573, 573, 577, - 578, 577, 577, 577, 0, 0, 580, 0, 577, 0, - - 578, 0, 578, 0, 578, 0, 580, 581, 580, 578, - 580, 0, 0, 582, 0, 580, 582, 581, 0, 581, - 0, 581, 0, 582, 581, 582, 581, 582, 583, 584, - 0, 0, 582, 583, 0, 0, 0, 0, 583, 584, - 583, 584, 583, 584, 586, 587, 586, 583, 584, 0, - 0, 0, 0, 0, 586, 587, 586, 587, 586, 587, - 592, 0, 0, 586, 587, 0, 0, 0, 593, 0, - 592, 0, 592, 0, 592, 0, 592, 0, 593, 592, - 593, 593, 593, 594, 604, 0, 0, 593, 0, 0, - 594, 0, 0, 594, 604, 594, 604, 594, 604, 613, - - 614, 0, 594, 604, 0, 0, 0, 0, 0, 613, - 614, 613, 614, 613, 614, 615, 616, 615, 613, 614, - 0, 0, 0, 0, 0, 615, 616, 615, 616, 615, - 616, 617, 619, 0, 615, 616, 0, 0, 0, 0, - 0, 617, 619, 617, 619, 617, 619, 620, 617, 0, - 617, 619, 0, 624, 620, 0, 0, 620, 0, 620, - 0, 620, 0, 624, 625, 624, 620, 624, 0, 0, - 0, 0, 624, 0, 625, 626, 625, 0, 625, 0, - 0, 641, 0, 625, 0, 626, 0, 626, 626, 626, - 0, 641, 642, 641, 626, 641, 0, 0, 643, 0, - - 641, 0, 642, 0, 642, 0, 642, 0, 643, 645, - 643, 642, 643, 0, 0, 0, 0, 643, 0, 645, - 649, 645, 0, 645, 0, 0, 650, 645, 645, 0, - 649, 0, 649, 0, 649, 0, 650, 649, 650, 649, - 650, 665, 669, 0, 0, 650, 0, 0, 0, 0, - 0, 665, 669, 665, 669, 665, 669, 670, 685, 0, - 665, 669, 0, 0, 665, 0, 0, 670, 685, 670, - 685, 670, 685, 0, 0, 0, 670, 685, 735, 735, - 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, - 735, 736, 736, 736, 736, 736, 736, 736, 736, 736, - - 736, 736, 736, 736, 737, 737, 737, 737, 737, 737, - 737, 737, 737, 737, 737, 737, 737, 738, 738, 738, - 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, - 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, - 739, 739, 739, 740, 740, 740, 740, 0, 740, 740, - 740, 740, 740, 740, 740, 740, 741, 741, 741, 0, - 741, 0, 741, 0, 741, 742, 742, 0, 742, 742, - 743, 743, 0, 0, 743, 743, 0, 743, 743, 743, - 743, 743, 743, 744, 744, 744, 744, 0, 744, 744, - 744, 744, 744, 744, 744, 744, 745, 745, 745, 745, - - 745, 745, 745, 745, 0, 745, 745, 746, 0, 0, - 0, 746, 746, 746, 746, 746, 746, 746, 747, 0, - 0, 0, 747, 747, 747, 747, 747, 747, 747, 748, - 748, 0, 748, 748, 749, 749, 0, 749, 749, 750, - 750, 0, 750, 750, 751, 0, 751, 751, 752, 752, - 0, 752, 752, 753, 0, 753, 753, 754, 0, 754, - 754, 755, 0, 755, 755, 756, 0, 756, 756, 757, - 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, - 757, 757, 758, 758, 0, 758, 758, 759, 759, 0, - 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, - - 760, 760, 760, 0, 0, 0, 760, 0, 0, 0, - 0, 760, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734 - + 23, 23, 23, 23, 23, 23, 23, 31, 245, 31, + 31, 31, 31, 31, 31, 31, 31, 39, 39, 262, + 267, 45, 45, 419, 463, 45, 31, 592, 39, 722, + 39, 45, 39, 45, 39, 45, 332, 39, 43, 43, + 45, 349, 311, 463, 721, 592, 43, 266, 312, 43, + 45, 43, 720, 43, 719, 31, 34, 245, 43, 34, + 34, 34, 34, 34, 34, 34, 34, 323, 262, 267, + 342, 383, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 332, 349, + + 312, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 40, 383, 348, 395, 323, 42, 42, + 399, 42, 342, 40, 418, 40, 363, 40, 404, 42, + 42, 42, 40, 42, 350, 384, 42, 555, 42, 409, + 46, 46, 417, 46, 410, 40, 414, 98, 98, 98, + 98, 46, 427, 46, 98, 46, 40, 46, 48, 446, + 46, 48, 98, 98, 348, 48, 49, 474, 48, 395, + 48, 416, 48, 404, 49, 49, 48, 48, 50, 418, + 350, 48, 399, 447, 46, 49, 363, 49, 50, 49, + + 50, 49, 50, 410, 49, 384, 50, 50, 51, 409, + 717, 111, 414, 555, 417, 427, 716, 49, 51, 52, + 51, 111, 51, 111, 446, 111, 52, 51, 50, 52, + 111, 52, 715, 52, 54, 54, 54, 54, 52, 714, + 447, 416, 474, 448, 51, 488, 479, 473, 478, 54, + 54, 54, 54, 54, 54, 54, 54, 77, 169, 169, + 169, 169, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 169, 169, 169, 169, 169, 169, 169, + 169, 77, 77, 77, 77, 77, 100, 112, 100, 100, + 100, 100, 100, 100, 100, 100, 448, 112, 459, 112, + + 473, 112, 488, 506, 112, 100, 112, 479, 478, 713, + 707, 608, 77, 77, 77, 736, 706, 705, 704, 477, + 701, 102, 459, 102, 102, 102, 102, 102, 102, 102, + 102, 697, 696, 695, 100, 693, 519, 506, 77, 78, + 102, 608, 736, 480, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 105, 105, 105, 105, 105, + 105, 105, 105, 78, 78, 78, 78, 78, 477, 102, + 519, 106, 105, 106, 106, 106, 106, 106, 106, 106, + 106, 78, 199, 199, 199, 199, 199, 199, 199, 199, + 106, 460, 480, 481, 78, 78, 78, 107, 468, 107, + + 507, 105, 107, 107, 107, 107, 107, 107, 107, 107, + 200, 200, 200, 200, 200, 200, 200, 200, 521, 106, + 78, 108, 113, 108, 108, 108, 108, 108, 108, 108, + 108, 535, 113, 114, 113, 691, 113, 529, 460, 115, + 108, 113, 481, 114, 468, 114, 526, 114, 690, 115, + 689, 115, 114, 115, 534, 170, 114, 507, 115, 170, + 170, 170, 170, 170, 170, 170, 170, 521, 682, 108, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 116, 118, 529, 505, 535, 530, 118, 534, + + 533, 526, 116, 118, 116, 118, 116, 118, 119, 120, + 116, 116, 118, 536, 679, 576, 542, 557, 119, 120, + 119, 120, 119, 120, 121, 554, 119, 119, 120, 505, + 122, 530, 556, 678, 121, 570, 121, 121, 121, 602, + 122, 566, 122, 121, 122, 123, 123, 536, 505, 122, + 574, 124, 124, 533, 573, 568, 123, 671, 123, 123, + 123, 579, 124, 125, 124, 123, 124, 542, 557, 564, + 578, 124, 576, 125, 125, 125, 126, 125, 596, 127, + 126, 577, 125, 595, 570, 670, 126, 554, 126, 127, + 126, 127, 602, 127, 556, 126, 129, 129, 127, 128, + + 128, 128, 612, 566, 578, 573, 129, 130, 129, 128, + 129, 128, 574, 128, 129, 129, 568, 130, 128, 130, + 131, 130, 605, 579, 628, 134, 130, 596, 597, 564, + 131, 654, 131, 131, 131, 134, 577, 630, 135, 131, + 607, 135, 613, 595, 604, 134, 136, 134, 135, 134, + 135, 610, 135, 612, 134, 614, 136, 135, 136, 629, + 136, 137, 137, 634, 615, 136, 654, 737, 669, 605, + 664, 137, 138, 137, 607, 137, 613, 628, 137, 137, + 137, 653, 138, 139, 138, 138, 138, 655, 597, 140, + 630, 138, 636, 139, 737, 139, 662, 139, 639, 140, + + 141, 140, 139, 140, 604, 139, 637, 629, 140, 641, + 141, 610, 141, 143, 141, 644, 144, 614, 645, 141, + 634, 143, 660, 143, 615, 143, 144, 143, 144, 145, + 144, 658, 143, 643, 144, 144, 698, 146, 653, 145, + 148, 145, 663, 145, 655, 636, 666, 146, 145, 146, + 148, 146, 148, 149, 148, 146, 146, 673, 148, 148, + 639, 659, 641, 149, 150, 149, 637, 149, 661, 651, + 667, 645, 149, 149, 150, 644, 150, 151, 150, 660, + 151, 681, 658, 150, 151, 665, 668, 151, 687, 151, + 647, 151, 153, 153, 674, 643, 151, 646, 698, 154, + + 675, 710, 663, 153, 694, 153, 666, 153, 673, 154, + 155, 154, 153, 154, 154, 680, 156, 154, 154, 683, + 155, 661, 155, 667, 155, 158, 156, 157, 156, 155, + 156, 642, 156, 640, 155, 156, 638, 157, 158, 157, + 681, 157, 665, 668, 159, 687, 157, 674, 158, 159, + 158, 675, 158, 686, 159, 160, 159, 158, 159, 710, + 694, 162, 700, 159, 635, 160, 680, 160, 162, 160, + 685, 162, 683, 162, 160, 162, 166, 163, 163, 702, + 162, 163, 581, 581, 581, 581, 166, 163, 166, 163, + 166, 163, 718, 171, 166, 166, 163, 171, 171, 171, + + 171, 171, 171, 171, 171, 197, 686, 197, 197, 197, + 197, 197, 197, 197, 197, 204, 205, 625, 204, 700, + 619, 685, 688, 618, 197, 204, 205, 204, 205, 204, + 205, 206, 207, 703, 204, 205, 702, 708, 609, 606, + 603, 206, 207, 206, 207, 206, 207, 208, 598, 586, + 206, 207, 718, 197, 202, 210, 583, 208, 211, 208, + 208, 208, 210, 581, 569, 210, 208, 210, 211, 210, + 211, 212, 211, 688, 210, 711, 712, 211, 565, 213, + 532, 212, 523, 212, 703, 212, 708, 518, 212, 213, + 212, 213, 485, 213, 616, 616, 616, 616, 213, 202, + + 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, + 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, + 202, 214, 215, 484, 465, 423, 711, 712, 358, 215, + 356, 214, 215, 214, 215, 214, 215, 214, 216, 217, + 214, 215, 287, 280, 279, 278, 277, 276, 216, 217, + 216, 217, 216, 217, 218, 216, 273, 216, 217, 270, + 209, 203, 194, 192, 218, 190, 218, 188, 218, 219, + 219, 218, 218, 218, 186, 616, 220, 219, 181, 220, + 219, 179, 219, 174, 219, 168, 220, 221, 220, 219, + 220, 117, 109, 222, 103, 220, 99, 221, 97, 221, + + 221, 221, 95, 222, 223, 222, 221, 222, 94, 93, + 224, 90, 222, 224, 223, 223, 223, 85, 223, 84, + 224, 225, 224, 223, 224, 83, 70, 226, 67, 224, + 226, 225, 63, 225, 225, 225, 62, 226, 227, 226, + 225, 226, 59, 58, 53, 32, 226, 28, 227, 228, + 227, 22, 227, 21, 18, 227, 17, 227, 0, 228, + 228, 228, 231, 228, 0, 0, 0, 0, 228, 0, + 232, 0, 231, 233, 231, 0, 231, 0, 0, 231, + 232, 231, 232, 233, 232, 233, 233, 233, 234, 232, + 0, 235, 233, 0, 236, 0, 0, 236, 234, 0, + + 234, 235, 234, 235, 236, 235, 236, 234, 236, 235, + 235, 237, 238, 236, 0, 0, 0, 0, 0, 0, + 237, 0, 238, 239, 238, 0, 238, 0, 0, 0, + 237, 238, 237, 239, 237, 239, 240, 239, 0, 237, + 0, 0, 239, 0, 242, 0, 240, 242, 240, 0, + 240, 0, 0, 0, 242, 240, 242, 243, 242, 0, + 243, 0, 0, 242, 0, 244, 0, 243, 246, 243, + 0, 243, 244, 0, 0, 244, 243, 244, 246, 244, + 246, 247, 246, 0, 244, 0, 246, 246, 0, 248, + 0, 247, 0, 247, 0, 247, 0, 249, 0, 248, + + 247, 248, 0, 248, 0, 250, 248, 249, 248, 249, + 0, 249, 0, 0, 249, 250, 249, 250, 252, 250, + 253, 253, 0, 0, 250, 250, 0, 0, 252, 254, + 252, 253, 252, 253, 0, 253, 0, 252, 0, 254, + 253, 254, 255, 254, 0, 0, 0, 0, 254, 0, + 256, 0, 255, 256, 255, 0, 255, 0, 257, 0, + 256, 255, 256, 0, 256, 257, 258, 0, 257, 256, + 257, 0, 257, 0, 0, 0, 258, 257, 258, 259, + 258, 0, 0, 0, 258, 258, 0, 260, 0, 259, + 0, 259, 0, 259, 0, 0, 259, 260, 259, 260, + + 261, 260, 0, 261, 260, 0, 260, 0, 263, 0, + 261, 0, 261, 0, 261, 0, 0, 265, 263, 261, + 263, 263, 263, 263, 264, 265, 0, 263, 263, 0, + 0, 0, 0, 0, 264, 265, 264, 265, 264, 265, + 269, 0, 264, 264, 265, 0, 269, 0, 0, 0, + 269, 0, 269, 0, 269, 271, 271, 271, 271, 269, + 0, 0, 0, 272, 272, 272, 272, 0, 0, 0, + 271, 271, 271, 271, 271, 271, 271, 271, 272, 272, + 272, 272, 272, 272, 272, 272, 288, 289, 0, 0, + 0, 0, 0, 0, 289, 0, 288, 289, 288, 289, + + 288, 289, 290, 0, 0, 288, 289, 0, 291, 0, + 0, 0, 290, 290, 290, 0, 290, 0, 291, 292, + 291, 290, 291, 0, 0, 293, 0, 291, 293, 292, + 0, 292, 0, 292, 0, 293, 0, 293, 292, 293, + 294, 294, 295, 295, 293, 0, 0, 0, 0, 0, + 0, 294, 295, 294, 295, 294, 295, 296, 0, 0, + 294, 295, 0, 0, 292, 297, 0, 296, 0, 296, + 0, 296, 0, 298, 296, 297, 296, 297, 297, 297, + 0, 0, 0, 298, 297, 298, 300, 298, 299, 299, + 0, 298, 298, 0, 0, 0, 300, 301, 300, 299, + + 300, 299, 0, 299, 0, 300, 0, 301, 299, 301, + 302, 301, 302, 303, 0, 303, 301, 0, 0, 0, + 302, 0, 302, 303, 302, 303, 0, 303, 304, 302, + 0, 304, 303, 0, 305, 0, 0, 0, 304, 0, + 304, 0, 304, 0, 305, 306, 305, 304, 305, 0, + 0, 307, 306, 305, 0, 306, 0, 306, 0, 306, + 0, 307, 308, 307, 306, 307, 0, 307, 0, 0, + 307, 0, 308, 0, 308, 0, 308, 309, 308, 0, + 309, 308, 0, 310, 0, 0, 0, 309, 0, 309, + 0, 309, 0, 310, 313, 310, 309, 310, 0, 0, + + 314, 0, 310, 0, 313, 0, 313, 0, 313, 0, + 314, 0, 314, 313, 314, 315, 316, 0, 314, 314, + 0, 0, 315, 0, 0, 315, 316, 315, 316, 315, + 316, 317, 316, 0, 315, 316, 318, 318, 0, 313, + 0, 317, 0, 317, 320, 317, 0, 318, 0, 318, + 317, 318, 319, 318, 0, 320, 318, 319, 0, 0, + 0, 0, 319, 321, 319, 320, 319, 320, 319, 320, + 0, 319, 0, 321, 320, 321, 322, 321, 0, 0, + 321, 0, 321, 0, 324, 324, 322, 325, 322, 0, + 322, 0, 0, 0, 324, 322, 324, 325, 324, 325, + + 326, 325, 0, 324, 329, 325, 325, 0, 328, 0, + 326, 328, 326, 326, 326, 0, 0, 0, 328, 326, + 328, 329, 328, 0, 0, 0, 0, 328, 0, 330, + 0, 329, 330, 329, 0, 329, 331, 331, 0, 330, + 329, 330, 0, 330, 0, 333, 0, 331, 330, 331, + 0, 331, 0, 334, 0, 333, 331, 333, 0, 333, + 0, 0, 0, 334, 333, 334, 335, 334, 0, 335, + 0, 334, 334, 0, 336, 0, 335, 337, 335, 0, + 335, 0, 0, 0, 336, 335, 336, 337, 336, 337, + 0, 337, 339, 336, 338, 338, 337, 0, 340, 0, + + 0, 0, 339, 0, 339, 338, 339, 338, 340, 338, + 340, 339, 340, 341, 338, 0, 343, 340, 0, 344, + 0, 0, 0, 341, 0, 341, 343, 341, 343, 344, + 343, 344, 341, 344, 0, 343, 345, 339, 344, 345, + 0, 0, 346, 0, 0, 0, 345, 0, 345, 0, + 345, 0, 346, 347, 346, 345, 346, 0, 0, 0, + 0, 346, 0, 347, 0, 347, 0, 347, 0, 351, + 347, 0, 347, 0, 352, 352, 352, 352, 346, 351, + 0, 351, 0, 351, 0, 0, 0, 0, 351, 352, + 352, 352, 352, 352, 352, 352, 352, 353, 353, 353, + + 353, 0, 0, 0, 0, 0, 0, 0, 353, 0, + 0, 0, 353, 353, 353, 353, 353, 353, 353, 353, + 354, 354, 354, 354, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 354, 354, 354, 354, 354, + 354, 354, 354, 355, 0, 359, 0, 355, 355, 355, + 355, 355, 355, 355, 355, 359, 0, 359, 0, 359, + 360, 360, 0, 359, 359, 0, 0, 0, 0, 0, + 360, 0, 360, 362, 360, 361, 361, 0, 353, 360, + 0, 0, 0, 362, 0, 362, 361, 362, 361, 0, + 361, 0, 362, 364, 364, 361, 0, 365, 365, 0, + + 366, 0, 0, 366, 364, 0, 364, 365, 364, 365, + 366, 365, 366, 364, 366, 367, 365, 0, 368, 366, + 0, 0, 0, 0, 0, 367, 369, 367, 368, 367, + 368, 0, 368, 0, 367, 0, 369, 368, 369, 370, + 369, 0, 369, 0, 0, 369, 370, 371, 0, 370, + 0, 370, 0, 370, 0, 0, 0, 371, 370, 371, + 372, 371, 0, 372, 0, 0, 371, 372, 0, 0, + 372, 373, 372, 373, 372, 0, 0, 374, 0, 372, + 374, 373, 0, 373, 374, 373, 0, 374, 375, 374, + 373, 374, 0, 0, 0, 0, 374, 0, 375, 376, + + 375, 0, 375, 0, 375, 0, 0, 375, 0, 376, + 0, 376, 0, 376, 377, 377, 0, 376, 376, 0, + 378, 0, 0, 0, 377, 0, 377, 0, 377, 0, + 378, 379, 378, 377, 378, 0, 0, 380, 378, 378, + 0, 379, 0, 379, 0, 379, 0, 380, 379, 380, + 379, 380, 381, 385, 0, 0, 380, 0, 0, 0, + 385, 0, 381, 385, 381, 385, 381, 385, 0, 0, + 387, 381, 385, 386, 386, 0, 386, 0, 0, 0, + 387, 0, 387, 386, 387, 386, 0, 386, 387, 387, + 389, 388, 386, 388, 0, 0, 0, 0, 0, 0, + + 389, 388, 389, 388, 389, 388, 390, 0, 0, 389, + 388, 0, 391, 0, 0, 391, 390, 0, 390, 0, + 390, 0, 391, 392, 391, 390, 391, 393, 0, 0, + 394, 391, 0, 392, 0, 392, 393, 392, 0, 0, + 392, 0, 392, 0, 396, 0, 393, 394, 393, 0, + 393, 0, 0, 0, 396, 393, 396, 394, 396, 394, + 397, 394, 396, 396, 0, 0, 394, 0, 398, 0, + 397, 0, 397, 0, 397, 0, 400, 0, 398, 397, + 398, 0, 398, 0, 402, 0, 400, 398, 400, 0, + 400, 0, 400, 0, 402, 400, 402, 403, 402, 0, + + 0, 0, 0, 402, 0, 0, 0, 403, 0, 403, + 405, 403, 0, 406, 0, 403, 403, 405, 0, 0, + 405, 407, 405, 406, 405, 406, 407, 406, 0, 405, + 0, 407, 406, 407, 408, 407, 0, 0, 0, 0, + 407, 0, 0, 0, 408, 411, 408, 0, 408, 0, + 0, 412, 0, 408, 412, 411, 408, 411, 0, 411, + 0, 412, 413, 412, 411, 412, 0, 0, 0, 0, + 412, 0, 413, 415, 413, 0, 413, 0, 413, 0, + 0, 413, 0, 415, 0, 415, 0, 415, 420, 420, + 420, 420, 415, 0, 0, 0, 0, 0, 0, 0, + + 0, 424, 0, 420, 420, 420, 420, 420, 420, 420, + 420, 424, 0, 424, 426, 424, 425, 425, 415, 0, + 424, 0, 0, 0, 426, 428, 426, 425, 426, 425, + 0, 425, 426, 426, 0, 428, 425, 428, 429, 428, + 0, 430, 0, 0, 428, 0, 0, 0, 429, 0, + 429, 430, 429, 430, 0, 430, 429, 429, 431, 0, + 430, 431, 0, 432, 432, 0, 0, 0, 431, 0, + 431, 0, 431, 0, 432, 433, 432, 431, 432, 0, + 0, 434, 0, 432, 0, 433, 0, 433, 0, 433, + 0, 434, 0, 434, 433, 434, 435, 0, 435, 434, + + 434, 0, 436, 0, 0, 0, 435, 0, 435, 0, + 435, 0, 436, 0, 436, 435, 436, 0, 0, 437, + 436, 436, 437, 0, 0, 438, 0, 438, 0, 437, + 0, 437, 0, 437, 0, 438, 439, 438, 437, 438, + 0, 440, 440, 0, 438, 0, 439, 0, 439, 0, + 439, 0, 440, 441, 440, 439, 440, 0, 0, 442, + 0, 440, 0, 441, 0, 441, 442, 441, 0, 442, + 443, 442, 441, 442, 0, 0, 444, 0, 442, 0, + 443, 0, 443, 444, 443, 0, 444, 443, 444, 443, + 444, 445, 445, 449, 0, 444, 0, 449, 0, 0, + + 0, 0, 445, 449, 445, 449, 445, 449, 450, 0, + 0, 445, 449, 0, 451, 450, 451, 0, 450, 0, + 450, 0, 450, 0, 451, 452, 451, 450, 451, 0, + 0, 453, 0, 451, 453, 452, 0, 452, 0, 452, + 0, 453, 452, 453, 452, 453, 454, 454, 0, 0, + 453, 0, 455, 455, 0, 0, 454, 0, 454, 0, + 454, 0, 455, 456, 455, 454, 455, 0, 0, 0, + 0, 455, 0, 456, 0, 456, 0, 456, 457, 456, + 0, 457, 456, 0, 458, 0, 0, 0, 457, 0, + 457, 0, 457, 0, 458, 461, 458, 457, 458, 0, + + 0, 458, 0, 458, 0, 461, 0, 461, 464, 461, + 462, 462, 0, 0, 461, 0, 0, 0, 464, 466, + 464, 462, 464, 462, 0, 462, 0, 464, 0, 466, + 462, 466, 467, 466, 0, 467, 0, 466, 466, 0, + 469, 0, 467, 0, 467, 0, 467, 0, 0, 0, + 469, 467, 469, 0, 469, 470, 470, 0, 471, 469, + 469, 472, 0, 0, 0, 470, 0, 470, 471, 470, + 471, 472, 471, 472, 470, 472, 475, 471, 0, 476, + 472, 0, 0, 0, 0, 0, 475, 0, 475, 476, + 475, 476, 0, 476, 486, 475, 476, 0, 476, 482, + + 482, 482, 482, 0, 486, 0, 486, 0, 486, 0, + 0, 0, 486, 486, 482, 482, 482, 482, 482, 482, + 482, 482, 483, 0, 0, 0, 483, 483, 483, 483, + 483, 483, 483, 483, 487, 489, 0, 0, 0, 0, + 0, 487, 0, 0, 487, 489, 487, 489, 487, 489, + 0, 491, 490, 487, 489, 490, 0, 0, 0, 0, + 0, 491, 490, 491, 490, 491, 490, 492, 493, 0, + 491, 490, 0, 0, 492, 493, 0, 492, 493, 492, + 493, 492, 493, 494, 495, 0, 492, 493, 0, 0, + 0, 0, 0, 494, 495, 494, 495, 494, 495, 496, + + 0, 0, 494, 495, 0, 497, 496, 497, 0, 496, + 0, 496, 0, 496, 0, 497, 498, 497, 496, 497, + 0, 0, 499, 0, 497, 0, 498, 499, 498, 0, + 498, 0, 499, 500, 499, 498, 499, 0, 0, 0, + 0, 499, 0, 500, 501, 500, 0, 500, 0, 0, + 0, 500, 500, 0, 501, 502, 501, 0, 501, 0, + 0, 503, 501, 501, 0, 502, 0, 502, 0, 502, + 0, 503, 504, 503, 502, 503, 0, 0, 508, 0, + 503, 0, 504, 0, 504, 508, 504, 0, 508, 509, + 508, 504, 508, 0, 0, 0, 0, 508, 0, 509, + + 510, 509, 0, 509, 0, 0, 511, 509, 509, 0, + 510, 0, 510, 0, 510, 0, 511, 512, 511, 510, + 511, 0, 0, 513, 0, 511, 513, 512, 0, 512, + 0, 512, 0, 513, 512, 513, 512, 513, 514, 515, + 0, 0, 513, 0, 0, 0, 0, 0, 514, 515, + 514, 515, 514, 515, 516, 516, 514, 514, 515, 0, + 517, 0, 0, 0, 516, 0, 516, 0, 516, 0, + 517, 520, 517, 516, 517, 0, 0, 522, 0, 517, + 0, 520, 0, 520, 0, 520, 0, 522, 524, 522, + 520, 522, 0, 0, 525, 0, 522, 0, 524, 0, + + 524, 0, 524, 0, 525, 517, 525, 524, 525, 527, + 0, 0, 527, 525, 0, 528, 0, 0, 528, 527, + 0, 527, 0, 527, 0, 528, 0, 528, 527, 528, + 531, 531, 0, 0, 528, 0, 537, 537, 537, 537, + 0, 531, 0, 531, 0, 531, 0, 0, 0, 0, + 531, 537, 537, 537, 537, 537, 537, 537, 537, 540, + 541, 541, 0, 0, 0, 0, 540, 0, 0, 540, + 541, 540, 541, 540, 541, 543, 0, 0, 540, 541, + 0, 0, 0, 544, 0, 543, 545, 543, 0, 543, + 0, 543, 0, 544, 543, 544, 545, 544, 545, 546, + + 545, 544, 544, 0, 0, 545, 549, 547, 0, 546, + 0, 546, 0, 546, 0, 548, 0, 547, 546, 547, + 547, 547, 0, 549, 0, 548, 547, 548, 0, 548, + 0, 0, 0, 549, 548, 549, 550, 549, 0, 550, + 0, 0, 549, 0, 551, 0, 550, 0, 550, 0, + 550, 0, 552, 0, 551, 550, 551, 0, 551, 552, + 553, 0, 552, 551, 552, 0, 552, 0, 0, 0, + 553, 552, 553, 558, 553, 0, 558, 0, 0, 553, + 0, 559, 0, 558, 560, 558, 0, 558, 0, 0, + 0, 559, 558, 559, 560, 559, 560, 561, 560, 0, + + 559, 0, 0, 560, 0, 562, 0, 561, 563, 561, + 0, 561, 562, 0, 0, 562, 561, 562, 563, 562, + 563, 567, 563, 0, 562, 571, 563, 563, 0, 572, + 0, 567, 0, 567, 0, 567, 0, 0, 0, 572, + 567, 572, 571, 572, 0, 575, 0, 0, 572, 0, + 0, 0, 571, 0, 571, 575, 571, 575, 0, 575, + 584, 571, 0, 0, 575, 580, 580, 580, 580, 0, + 584, 0, 584, 584, 584, 0, 0, 0, 585, 584, + 580, 580, 580, 580, 580, 580, 580, 580, 585, 587, + 585, 0, 585, 0, 0, 588, 0, 585, 0, 587, + + 0, 587, 0, 587, 0, 588, 0, 588, 587, 588, + 589, 590, 588, 589, 588, 0, 590, 0, 0, 0, + 589, 590, 589, 590, 589, 590, 591, 0, 0, 589, + 590, 0, 593, 0, 593, 0, 591, 0, 591, 0, + 591, 0, 593, 594, 593, 591, 593, 0, 0, 599, + 0, 593, 0, 594, 0, 594, 0, 594, 0, 599, + 600, 599, 594, 599, 0, 599, 0, 0, 599, 0, + 600, 601, 600, 600, 600, 0, 0, 611, 601, 600, + 0, 601, 0, 601, 0, 601, 0, 611, 620, 611, + 601, 611, 0, 0, 621, 0, 611, 0, 620, 0, + + 620, 0, 620, 0, 621, 0, 621, 620, 621, 622, + 623, 622, 0, 621, 0, 0, 0, 0, 0, 622, + 623, 622, 623, 622, 623, 624, 626, 0, 622, 623, + 0, 0, 0, 0, 0, 624, 626, 624, 626, 624, + 626, 627, 624, 0, 624, 626, 0, 631, 627, 0, + 0, 627, 0, 627, 0, 627, 0, 631, 632, 631, + 627, 631, 0, 0, 0, 0, 631, 0, 632, 633, + 632, 0, 632, 0, 0, 648, 0, 632, 0, 633, + 0, 633, 633, 633, 0, 648, 649, 648, 633, 648, + 0, 0, 650, 0, 648, 0, 649, 0, 649, 0, + + 649, 0, 650, 652, 650, 649, 650, 0, 0, 0, + 0, 650, 0, 652, 656, 652, 0, 652, 0, 0, + 657, 652, 652, 0, 656, 0, 656, 0, 656, 0, + 657, 656, 657, 656, 657, 672, 676, 0, 0, 657, + 0, 0, 0, 0, 0, 672, 676, 672, 676, 672, + 676, 677, 692, 0, 672, 676, 0, 0, 672, 0, + 0, 677, 692, 677, 692, 677, 692, 0, 0, 0, + 677, 692, 742, 742, 742, 742, 742, 742, 742, 742, + 742, 742, 742, 742, 742, 743, 743, 743, 743, 743, + 743, 743, 743, 743, 743, 743, 743, 743, 744, 744, + + 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, + 744, 745, 745, 745, 745, 745, 745, 745, 745, 745, + 745, 745, 745, 745, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 747, 747, 747, + 747, 0, 747, 747, 747, 747, 747, 747, 747, 747, + 748, 748, 748, 0, 748, 0, 748, 0, 748, 749, + 749, 0, 749, 749, 750, 750, 0, 0, 750, 750, + 0, 750, 750, 750, 750, 750, 750, 751, 751, 751, + 751, 0, 751, 751, 751, 751, 751, 751, 751, 751, + 752, 752, 752, 752, 752, 752, 752, 752, 0, 752, + + 752, 753, 0, 0, 0, 753, 753, 753, 753, 753, + 753, 753, 754, 0, 0, 0, 754, 754, 754, 754, + 754, 754, 754, 755, 755, 0, 755, 755, 756, 756, + 0, 756, 756, 757, 757, 0, 757, 757, 758, 0, + 758, 758, 759, 759, 0, 759, 759, 760, 0, 760, + 760, 761, 0, 761, 761, 762, 0, 762, 762, 763, + 0, 763, 763, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 765, 765, 0, 765, + 765, 766, 766, 0, 766, 766, 766, 766, 766, 766, + 766, 766, 766, 766, 767, 767, 767, 0, 0, 0, + + 767, 0, 0, 0, 0, 767, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, 741, 741 } ; extern int yy_flex_debug; int yy_flex_debug = 1; -static yyconst short int yy_rule_linenum[137] = +static yyconst short int yy_rule_linenum[138] = { 0, - 95, 96, 98, 101, 103, 106, 108, 109, 110, 113, - 115, 116, 117, 129, 136, 143, 149, 158, 166, 174, - 175, 177, 196, 202, 203, 204, 205, 206, 209, 215, - 222, 229, 236, 243, 244, 245, 253, 254, 255, 256, - 257, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - - 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, - 343, 344, 349, 350, 351, 354, 359, 365, 373, 383, - 388, 390, 391, 395, 400, 405, 411, 412, 414, 420, - 433, 436, 461, 505, 507, 518 + 96, 97, 99, 102, 104, 107, 109, 110, 111, 114, + 116, 117, 118, 130, 137, 144, 150, 159, 167, 175, + 176, 178, 197, 203, 204, 205, 206, 207, 210, 216, + 223, 230, 237, 244, 251, 252, 253, 261, 262, 263, + 264, 265, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 351, 352, 357, 358, 359, 362, 367, 373, 381, + 391, 396, 398, 399, 403, 408, 413, 419, 420, 422, + 428, 441, 444, 469, 513, 515, 526 } ; static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; @@ -1825,6 +1854,7 @@ int asn1p_lexer_constructs_year = 0; int asn1p_as_pointer; static asn1c_integer_t _lex_atoi(const char *ptr); +static double _lex_atod(const char *ptr); /* * Check that the type is defined in the year of the standard choosen. @@ -1884,7 +1914,7 @@ static asn1c_integer_t _lex_atoi(const char *ptr); /* Newline */ /* White-space */ -#line 1888 "asn1p_l.c" +#line 1918 "asn1p_l.c" /* Macros after this point can all be overridden by user definitions in * section 1. @@ -2035,10 +2065,10 @@ YY_DECL register char *yy_cp, *yy_bp; register int yy_act; -#line 93 "asn1p_l.l" +#line 94 "asn1p_l.l" -#line 2042 "asn1p_l.c" +#line 2072 "asn1p_l.c" if ( yy_init ) { @@ -2086,18 +2116,19 @@ YY_DECL while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 735 ) + if ( yy_current_state >= 742 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *yy_state_ptr++ = yy_current_state; ++yy_cp; } - while ( yy_base[yy_current_state] != 4413 ); + while ( yy_base[yy_current_state] != 4507 ); yy_find_action: yy_current_state = *--yy_state_ptr; yy_lp = yy_accept[yy_current_state]; +goto find_rule; /* avoid `defined but not used' warning */ find_rule: /* we branch to this label when backing up */ for ( ; ; ) /* until we find what rule we matched */ { @@ -2130,13 +2161,13 @@ YY_DECL { if ( yy_act == 0 ) fprintf( stderr, "--scanner backing up\n" ); - else if ( yy_act < 137 ) + else if ( yy_act < 138 ) fprintf( stderr, "--accepting rule at line %d (\"%s\")\n", yy_rule_linenum[yy_act], yytext ); - else if ( yy_act == 137 ) + else if ( yy_act == 138 ) fprintf( stderr, "--accepting default rule (\"%s\")\n", yytext ); - else if ( yy_act == 138 ) + else if ( yy_act == 139 ) fprintf( stderr, "--(end of buffer or a NUL)\n" ); else fprintf( stderr, "--EOF (start condition %d)\n", YY_START ); @@ -2149,7 +2180,7 @@ case 1: yy_c_buf_p = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP -#line 95 "asn1p_l.l" +#line 96 "asn1p_l.l" /* Immediately terminated long comment */ YY_BREAK case 2: @@ -2157,67 +2188,67 @@ case 2: yy_c_buf_p = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP -#line 96 "asn1p_l.l" +#line 97 "asn1p_l.l" yy_push_state(idash_comment); /* Incorrect, but acceptable */ YY_BREAK case 3: YY_RULE_SETUP -#line 98 "asn1p_l.l" +#line 99 "asn1p_l.l" yy_pop_state(); /* Acceptable end of comment */ YY_BREAK case 4: YY_RULE_SETUP -#line 101 "asn1p_l.l" +#line 102 "asn1p_l.l" asn1p_as_pointer = 1; YY_BREAK case 5: YY_RULE_SETUP -#line 103 "asn1p_l.l" +#line 104 "asn1p_l.l" yy_push_state(dash_comment); YY_BREAK case 6: YY_RULE_SETUP -#line 106 "asn1p_l.l" +#line 107 "asn1p_l.l" yy_pop_state(); YY_BREAK case 7: YY_RULE_SETUP -#line 108 "asn1p_l.l" +#line 109 "asn1p_l.l" yy_pop_state(); /* End of comment */ YY_BREAK case 8: YY_RULE_SETUP -#line 109 "asn1p_l.l" +#line 110 "asn1p_l.l" /* Eat single dash */ YY_BREAK case 9: YY_RULE_SETUP -#line 110 "asn1p_l.l" +#line 111 "asn1p_l.l" /* Eat */ YY_BREAK case 10: YY_RULE_SETUP -#line 113 "asn1p_l.l" +#line 114 "asn1p_l.l" yy_push_state(cpp_comment); YY_BREAK case 11: YY_RULE_SETUP -#line 115 "asn1p_l.l" +#line 116 "asn1p_l.l" /* Eat */ YY_BREAK case 12: YY_RULE_SETUP -#line 116 "asn1p_l.l" +#line 117 "asn1p_l.l" yy_pop_state(); YY_BREAK case 13: YY_RULE_SETUP -#line 117 "asn1p_l.l" +#line 118 "asn1p_l.l" /* Eat */ YY_BREAK @@ -2230,7 +2261,7 @@ YY_RULE_SETUP case 14: YY_RULE_SETUP -#line 129 "asn1p_l.l" +#line 130 "asn1p_l.l" { yy_push_state(opaque); asn1p_lval.tv_opaque.buf = strdup(yytext); @@ -2240,7 +2271,7 @@ YY_RULE_SETUP YY_BREAK case 15: YY_RULE_SETUP -#line 136 "asn1p_l.l" +#line 137 "asn1p_l.l" { yy_pop_state(); asn1p_lval.tv_opaque.buf = strdup(yytext); @@ -2250,7 +2281,7 @@ YY_RULE_SETUP YY_BREAK case 16: YY_RULE_SETUP -#line 143 "asn1p_l.l" +#line 144 "asn1p_l.l" { asn1p_lval.tv_opaque.buf = strdup(yytext); asn1p_lval.tv_opaque.len = yyleng; @@ -2259,7 +2290,7 @@ YY_RULE_SETUP YY_BREAK case 17: YY_RULE_SETUP -#line 149 "asn1p_l.l" +#line 150 "asn1p_l.l" { fprintf(stderr, "ASN.1 Parser syncronization failure: " @@ -2271,7 +2302,7 @@ YY_RULE_SETUP YY_BREAK case 18: YY_RULE_SETUP -#line 158 "asn1p_l.l" +#line 159 "asn1p_l.l" { asn1p_lval.tv_opaque.buf = strdup(yytext); asn1p_lval.tv_opaque.len = yyleng; @@ -2281,7 +2312,7 @@ YY_RULE_SETUP case 19: YY_RULE_SETUP -#line 166 "asn1p_l.l" +#line 167 "asn1p_l.l" { asn1p_lval.tv_opaque.buf = 0; asn1p_lval.tv_opaque.len = 0; @@ -2292,17 +2323,17 @@ YY_RULE_SETUP case 20: YY_RULE_SETUP -#line 174 "asn1p_l.l" +#line 175 "asn1p_l.l" { QAPPEND(yytext, yyleng-1); } /* Add a single quote */ YY_BREAK case 21: YY_RULE_SETUP -#line 175 "asn1p_l.l" +#line 176 "asn1p_l.l" { QAPPEND(yytext, yyleng); } YY_BREAK case 22: YY_RULE_SETUP -#line 177 "asn1p_l.l" +#line 178 "asn1p_l.l" { yy_pop_state(); /* Do not append last quote: @@ -2323,7 +2354,7 @@ YY_RULE_SETUP case 23: YY_RULE_SETUP -#line 196 "asn1p_l.l" +#line 197 "asn1p_l.l" { const char *s = "ENCODING-CONTROL"; const char *p = s + sizeof("ENCODING-CONTROL") - 2; @@ -2333,33 +2364,33 @@ YY_RULE_SETUP YY_BREAK case 24: YY_RULE_SETUP -#line 202 "asn1p_l.l" +#line 203 "asn1p_l.l" unput('D'); unput('N'); unput('E'); yy_pop_state(); YY_BREAK case 25: YY_RULE_SETUP -#line 203 "asn1p_l.l" +#line 204 "asn1p_l.l" YY_BREAK case 26: YY_RULE_SETUP -#line 204 "asn1p_l.l" +#line 205 "asn1p_l.l" YY_BREAK case 27: YY_RULE_SETUP -#line 205 "asn1p_l.l" +#line 206 "asn1p_l.l" /* Eat everything else */ YY_BREAK case 28: YY_RULE_SETUP -#line 206 "asn1p_l.l" +#line 207 "asn1p_l.l" YY_BREAK case 29: YY_RULE_SETUP -#line 209 "asn1p_l.l" +#line 210 "asn1p_l.l" { /* " \t\r\n" weren't allowed in ASN.1:1990. */ asn1p_lval.tv_str = yytext; @@ -2368,7 +2399,7 @@ YY_RULE_SETUP YY_BREAK case 30: YY_RULE_SETUP -#line 215 "asn1p_l.l" +#line 216 "asn1p_l.l" { /* " \t\r\n" weren't allowed in ASN.1:1990. */ asn1p_lval.tv_str = strdup(yytext); @@ -2377,7 +2408,7 @@ YY_RULE_SETUP YY_BREAK case 31: YY_RULE_SETUP -#line 222 "asn1p_l.l" +#line 223 "asn1p_l.l" { asn1p_lval.a_int = _lex_atoi(yytext); if(errno == ERANGE) @@ -2387,7 +2418,7 @@ YY_RULE_SETUP YY_BREAK case 32: YY_RULE_SETUP -#line 229 "asn1p_l.l" +#line 230 "asn1p_l.l" { asn1p_lval.a_int = _lex_atoi(yytext); if(errno == ERANGE) @@ -2397,7 +2428,7 @@ YY_RULE_SETUP YY_BREAK case 33: YY_RULE_SETUP -#line 236 "asn1p_l.l" +#line 237 "asn1p_l.l" { asn1p_lval.a_int = _lex_atoi(yytext); if(errno == ERANGE) @@ -2407,17 +2438,27 @@ YY_RULE_SETUP YY_BREAK case 34: YY_RULE_SETUP -#line 243 "asn1p_l.l" -return TOK_ABSENT; +#line 244 "asn1p_l.l" +{ + asn1p_lval.a_dbl = _lex_atod(yytext); + if(errno == ERANGE) + return -1; + return TOK_realnumber; + } YY_BREAK case 35: YY_RULE_SETUP -#line 244 "asn1p_l.l" -return TOK_ALL; +#line 251 "asn1p_l.l" +return TOK_ABSENT; YY_BREAK case 36: YY_RULE_SETUP -#line 245 "asn1p_l.l" +#line 252 "asn1p_l.l" +return TOK_ALL; + YY_BREAK +case 37: +YY_RULE_SETUP +#line 253 "asn1p_l.l" { /* Appeared in 1990, removed in 1997 */ if(TYPE_LIFETIME(1990, 1997)) @@ -2427,88 +2468,88 @@ YY_RULE_SETUP REJECT; } YY_BREAK -case 37: +case 38: YY_RULE_SETUP -#line 253 "asn1p_l.l" +#line 261 "asn1p_l.l" return TOK_APPLICATION; YY_BREAK -case 38: +case 39: YY_RULE_SETUP -#line 254 "asn1p_l.l" +#line 262 "asn1p_l.l" return TOK_AUTOMATIC; YY_BREAK -case 39: +case 40: YY_RULE_SETUP -#line 255 "asn1p_l.l" +#line 263 "asn1p_l.l" return TOK_BEGIN; YY_BREAK -case 40: +case 41: YY_RULE_SETUP -#line 256 "asn1p_l.l" +#line 264 "asn1p_l.l" return TOK_BIT; YY_BREAK -case 41: +case 42: YY_RULE_SETUP -#line 257 "asn1p_l.l" +#line 265 "asn1p_l.l" { if(TYPE_LIFETIME(1994, 0)) return TOK_BMPString; REJECT; } YY_BREAK -case 42: +case 43: YY_RULE_SETUP -#line 262 "asn1p_l.l" +#line 270 "asn1p_l.l" return TOK_BOOLEAN; YY_BREAK -case 43: +case 44: YY_RULE_SETUP -#line 263 "asn1p_l.l" +#line 271 "asn1p_l.l" return TOK_BY; YY_BREAK -case 44: +case 45: YY_RULE_SETUP -#line 264 "asn1p_l.l" +#line 272 "asn1p_l.l" return TOK_CHARACTER; YY_BREAK -case 45: +case 46: YY_RULE_SETUP -#line 265 "asn1p_l.l" +#line 273 "asn1p_l.l" return TOK_CHOICE; YY_BREAK -case 46: +case 47: YY_RULE_SETUP -#line 266 "asn1p_l.l" +#line 274 "asn1p_l.l" return TOK_CLASS; YY_BREAK -case 47: +case 48: YY_RULE_SETUP -#line 267 "asn1p_l.l" +#line 275 "asn1p_l.l" return TOK_COMPONENT; YY_BREAK -case 48: +case 49: YY_RULE_SETUP -#line 268 "asn1p_l.l" +#line 276 "asn1p_l.l" return TOK_COMPONENTS; YY_BREAK -case 49: +case 50: YY_RULE_SETUP -#line 269 "asn1p_l.l" +#line 277 "asn1p_l.l" return TOK_CONSTRAINED; YY_BREAK -case 50: +case 51: YY_RULE_SETUP -#line 270 "asn1p_l.l" +#line 278 "asn1p_l.l" return TOK_CONTAINING; YY_BREAK -case 51: +case 52: YY_RULE_SETUP -#line 271 "asn1p_l.l" +#line 279 "asn1p_l.l" return TOK_DEFAULT; YY_BREAK -case 52: +case 53: YY_RULE_SETUP -#line 272 "asn1p_l.l" +#line 280 "asn1p_l.l" { /* Appeared in 1990, removed in 1997 */ if(TYPE_LIFETIME(1990, 1997)) @@ -2519,348 +2560,348 @@ YY_RULE_SETUP REJECT; } YY_BREAK -case 53: +case 54: YY_RULE_SETUP -#line 281 "asn1p_l.l" +#line 289 "asn1p_l.l" return TOK_DEFINITIONS; YY_BREAK -case 54: +case 55: YY_RULE_SETUP -#line 282 "asn1p_l.l" +#line 290 "asn1p_l.l" return TOK_EMBEDDED; YY_BREAK -case 55: +case 56: YY_RULE_SETUP -#line 283 "asn1p_l.l" +#line 291 "asn1p_l.l" return TOK_ENCODED; YY_BREAK -case 56: +case 57: YY_RULE_SETUP -#line 284 "asn1p_l.l" +#line 292 "asn1p_l.l" return TOK_ENCODING_CONTROL; YY_BREAK -case 57: +case 58: YY_RULE_SETUP -#line 285 "asn1p_l.l" +#line 293 "asn1p_l.l" return TOK_END; YY_BREAK -case 58: +case 59: YY_RULE_SETUP -#line 286 "asn1p_l.l" +#line 294 "asn1p_l.l" return TOK_ENUMERATED; YY_BREAK -case 59: +case 60: YY_RULE_SETUP -#line 287 "asn1p_l.l" +#line 295 "asn1p_l.l" return TOK_EXCEPT; YY_BREAK -case 60: +case 61: YY_RULE_SETUP -#line 288 "asn1p_l.l" +#line 296 "asn1p_l.l" return TOK_EXPLICIT; YY_BREAK -case 61: +case 62: YY_RULE_SETUP -#line 289 "asn1p_l.l" +#line 297 "asn1p_l.l" return TOK_EXPORTS; YY_BREAK -case 62: +case 63: YY_RULE_SETUP -#line 290 "asn1p_l.l" +#line 298 "asn1p_l.l" return TOK_EXTENSIBILITY; YY_BREAK -case 63: +case 64: YY_RULE_SETUP -#line 291 "asn1p_l.l" +#line 299 "asn1p_l.l" return TOK_EXTERNAL; YY_BREAK -case 64: +case 65: YY_RULE_SETUP -#line 292 "asn1p_l.l" +#line 300 "asn1p_l.l" return TOK_FALSE; YY_BREAK -case 65: +case 66: YY_RULE_SETUP -#line 293 "asn1p_l.l" +#line 301 "asn1p_l.l" return TOK_FROM; YY_BREAK -case 66: +case 67: YY_RULE_SETUP -#line 294 "asn1p_l.l" +#line 302 "asn1p_l.l" return TOK_GeneralizedTime; YY_BREAK -case 67: +case 68: YY_RULE_SETUP -#line 295 "asn1p_l.l" +#line 303 "asn1p_l.l" return TOK_GeneralString; YY_BREAK -case 68: +case 69: YY_RULE_SETUP -#line 296 "asn1p_l.l" +#line 304 "asn1p_l.l" return TOK_GraphicString; YY_BREAK -case 69: +case 70: YY_RULE_SETUP -#line 297 "asn1p_l.l" +#line 305 "asn1p_l.l" return TOK_IA5String; YY_BREAK -case 70: +case 71: YY_RULE_SETUP -#line 298 "asn1p_l.l" +#line 306 "asn1p_l.l" return TOK_IDENTIFIER; YY_BREAK -case 71: +case 72: YY_RULE_SETUP -#line 299 "asn1p_l.l" +#line 307 "asn1p_l.l" return TOK_IMPLICIT; YY_BREAK -case 72: +case 73: YY_RULE_SETUP -#line 300 "asn1p_l.l" +#line 308 "asn1p_l.l" return TOK_IMPLIED; YY_BREAK -case 73: +case 74: YY_RULE_SETUP -#line 301 "asn1p_l.l" +#line 309 "asn1p_l.l" return TOK_IMPORTS; YY_BREAK -case 74: +case 75: YY_RULE_SETUP -#line 302 "asn1p_l.l" +#line 310 "asn1p_l.l" return TOK_INCLUDES; YY_BREAK -case 75: +case 76: YY_RULE_SETUP -#line 303 "asn1p_l.l" +#line 311 "asn1p_l.l" return TOK_INSTANCE; YY_BREAK -case 76: +case 77: YY_RULE_SETUP -#line 304 "asn1p_l.l" +#line 312 "asn1p_l.l" return TOK_INSTRUCTIONS; YY_BREAK -case 77: +case 78: YY_RULE_SETUP -#line 305 "asn1p_l.l" +#line 313 "asn1p_l.l" return TOK_INTEGER; YY_BREAK -case 78: +case 79: YY_RULE_SETUP -#line 306 "asn1p_l.l" +#line 314 "asn1p_l.l" return TOK_INTERSECTION; YY_BREAK -case 79: +case 80: YY_RULE_SETUP -#line 307 "asn1p_l.l" +#line 315 "asn1p_l.l" return TOK_ISO646String; YY_BREAK -case 80: +case 81: YY_RULE_SETUP -#line 308 "asn1p_l.l" +#line 316 "asn1p_l.l" return TOK_MAX; YY_BREAK -case 81: +case 82: YY_RULE_SETUP -#line 309 "asn1p_l.l" +#line 317 "asn1p_l.l" return TOK_MIN; YY_BREAK -case 82: +case 83: YY_RULE_SETUP -#line 310 "asn1p_l.l" +#line 318 "asn1p_l.l" return TOK_MINUS_INFINITY; YY_BREAK -case 83: +case 84: YY_RULE_SETUP -#line 311 "asn1p_l.l" +#line 319 "asn1p_l.l" return TOK_NULL; YY_BREAK -case 84: +case 85: YY_RULE_SETUP -#line 312 "asn1p_l.l" +#line 320 "asn1p_l.l" return TOK_NumericString; YY_BREAK -case 85: +case 86: YY_RULE_SETUP -#line 313 "asn1p_l.l" +#line 321 "asn1p_l.l" return TOK_OBJECT; YY_BREAK -case 86: +case 87: YY_RULE_SETUP -#line 314 "asn1p_l.l" +#line 322 "asn1p_l.l" return TOK_ObjectDescriptor; YY_BREAK -case 87: +case 88: YY_RULE_SETUP -#line 315 "asn1p_l.l" +#line 323 "asn1p_l.l" return TOK_OCTET; YY_BREAK -case 88: +case 89: YY_RULE_SETUP -#line 316 "asn1p_l.l" +#line 324 "asn1p_l.l" return TOK_OF; YY_BREAK -case 89: +case 90: YY_RULE_SETUP -#line 317 "asn1p_l.l" +#line 325 "asn1p_l.l" return TOK_OPTIONAL; YY_BREAK -case 90: +case 91: YY_RULE_SETUP -#line 318 "asn1p_l.l" +#line 326 "asn1p_l.l" return TOK_PATTERN; YY_BREAK -case 91: +case 92: YY_RULE_SETUP -#line 319 "asn1p_l.l" +#line 327 "asn1p_l.l" return TOK_PDV; YY_BREAK -case 92: +case 93: YY_RULE_SETUP -#line 320 "asn1p_l.l" +#line 328 "asn1p_l.l" return TOK_PLUS_INFINITY; YY_BREAK -case 93: +case 94: YY_RULE_SETUP -#line 321 "asn1p_l.l" +#line 329 "asn1p_l.l" return TOK_PRESENT; YY_BREAK -case 94: +case 95: YY_RULE_SETUP -#line 322 "asn1p_l.l" +#line 330 "asn1p_l.l" return TOK_PrintableString; YY_BREAK -case 95: +case 96: YY_RULE_SETUP -#line 323 "asn1p_l.l" +#line 331 "asn1p_l.l" return TOK_PRIVATE; YY_BREAK -case 96: +case 97: YY_RULE_SETUP -#line 324 "asn1p_l.l" +#line 332 "asn1p_l.l" return TOK_REAL; YY_BREAK -case 97: +case 98: YY_RULE_SETUP -#line 325 "asn1p_l.l" +#line 333 "asn1p_l.l" return TOK_RELATIVE_OID; YY_BREAK -case 98: +case 99: YY_RULE_SETUP -#line 326 "asn1p_l.l" +#line 334 "asn1p_l.l" return TOK_SEQUENCE; YY_BREAK -case 99: +case 100: YY_RULE_SETUP -#line 327 "asn1p_l.l" +#line 335 "asn1p_l.l" return TOK_SET; YY_BREAK -case 100: +case 101: YY_RULE_SETUP -#line 328 "asn1p_l.l" +#line 336 "asn1p_l.l" return TOK_SIZE; YY_BREAK -case 101: +case 102: YY_RULE_SETUP -#line 329 "asn1p_l.l" +#line 337 "asn1p_l.l" return TOK_STRING; YY_BREAK -case 102: +case 103: YY_RULE_SETUP -#line 330 "asn1p_l.l" +#line 338 "asn1p_l.l" return TOK_SYNTAX; YY_BREAK -case 103: +case 104: YY_RULE_SETUP -#line 331 "asn1p_l.l" +#line 339 "asn1p_l.l" return TOK_T61String; YY_BREAK -case 104: +case 105: YY_RULE_SETUP -#line 332 "asn1p_l.l" +#line 340 "asn1p_l.l" return TOK_TAGS; YY_BREAK -case 105: +case 106: YY_RULE_SETUP -#line 333 "asn1p_l.l" +#line 341 "asn1p_l.l" return TOK_TeletexString; YY_BREAK -case 106: +case 107: YY_RULE_SETUP -#line 334 "asn1p_l.l" +#line 342 "asn1p_l.l" return TOK_TRUE; YY_BREAK -case 107: +case 108: YY_RULE_SETUP -#line 335 "asn1p_l.l" +#line 343 "asn1p_l.l" return TOK_UNION; YY_BREAK -case 108: +case 109: YY_RULE_SETUP -#line 336 "asn1p_l.l" +#line 344 "asn1p_l.l" return TOK_UNIQUE; YY_BREAK -case 109: +case 110: YY_RULE_SETUP -#line 337 "asn1p_l.l" +#line 345 "asn1p_l.l" return TOK_UNIVERSAL; YY_BREAK -case 110: +case 111: YY_RULE_SETUP -#line 338 "asn1p_l.l" +#line 346 "asn1p_l.l" { if(TYPE_LIFETIME(1994, 0)) return TOK_UniversalString; REJECT; } YY_BREAK -case 111: +case 112: YY_RULE_SETUP -#line 343 "asn1p_l.l" +#line 351 "asn1p_l.l" return TOK_UTCTime; YY_BREAK -case 112: +case 113: YY_RULE_SETUP -#line 344 "asn1p_l.l" +#line 352 "asn1p_l.l" { if(TYPE_LIFETIME(1994, 0)) return TOK_UTF8String; REJECT; } YY_BREAK -case 113: +case 114: YY_RULE_SETUP -#line 349 "asn1p_l.l" +#line 357 "asn1p_l.l" return TOK_VideotexString; YY_BREAK -case 114: +case 115: YY_RULE_SETUP -#line 350 "asn1p_l.l" +#line 358 "asn1p_l.l" return TOK_VisibleString; YY_BREAK -case 115: +case 116: YY_RULE_SETUP -#line 351 "asn1p_l.l" +#line 359 "asn1p_l.l" return TOK_WITH; YY_BREAK -case 116: +case 117: YY_RULE_SETUP -#line 354 "asn1p_l.l" +#line 362 "asn1p_l.l" { asn1p_lval.tv_str = strdup(yytext); return TOK_typefieldreference; } YY_BREAK -case 117: +case 118: YY_RULE_SETUP -#line 359 "asn1p_l.l" +#line 367 "asn1p_l.l" { asn1p_lval.tv_str = strdup(yytext); return TOK_valuefieldreference; } YY_BREAK -case 118: +case 119: YY_RULE_SETUP -#line 365 "asn1p_l.l" +#line 373 "asn1p_l.l" { asn1p_lval.tv_str = strdup(yytext); return TOK_identifier; @@ -2869,9 +2910,9 @@ YY_RULE_SETUP /* * objectclassreference */ -case 119: +case 120: YY_RULE_SETUP -#line 373 "asn1p_l.l" +#line 381 "asn1p_l.l" { asn1p_lval.tv_str = strdup(yytext); return TOK_capitalreference; @@ -2882,77 +2923,77 @@ YY_RULE_SETUP * NOTE: TOK_objectclassreference must be combined * with this token to produce true typereference. */ -case 120: +case 121: YY_RULE_SETUP -#line 383 "asn1p_l.l" +#line 391 "asn1p_l.l" { asn1p_lval.tv_str = strdup(yytext); return TOK_typereference; } YY_BREAK -case 121: +case 122: YY_RULE_SETUP -#line 388 "asn1p_l.l" +#line 396 "asn1p_l.l" return TOK_PPEQ; YY_BREAK -case 122: +case 123: YY_RULE_SETUP -#line 390 "asn1p_l.l" +#line 398 "asn1p_l.l" return TOK_ThreeDots; YY_BREAK -case 123: +case 124: YY_RULE_SETUP -#line 391 "asn1p_l.l" +#line 399 "asn1p_l.l" return TOK_TwoDots; YY_BREAK -case 124: +case 125: YY_RULE_SETUP -#line 395 "asn1p_l.l" +#line 403 "asn1p_l.l" { asn1p_lval.tv_str = strdup(yytext); return TOK_Literal; } YY_BREAK -case 125: +case 126: YY_RULE_SETUP -#line 400 "asn1p_l.l" +#line 408 "asn1p_l.l" { asn1p_lval.tv_str = strdup(yytext); return TOK_Literal; } YY_BREAK -case 126: +case 127: YY_RULE_SETUP -#line 405 "asn1p_l.l" +#line 413 "asn1p_l.l" { yy_push_state(with_syntax); asn1p_lval.tv_str = strdup(yytext); return TOK_Literal; } YY_BREAK -case 127: +case 128: YY_RULE_SETUP -#line 411 "asn1p_l.l" +#line 419 "asn1p_l.l" return '['; YY_BREAK -case 128: +case 129: YY_RULE_SETUP -#line 412 "asn1p_l.l" +#line 420 "asn1p_l.l" return ']'; YY_BREAK -case 129: +case 130: YY_RULE_SETUP -#line 414 "asn1p_l.l" +#line 422 "asn1p_l.l" { asn1p_lval.tv_opaque.buf = strdup(yytext); asn1p_lval.tv_opaque.len = yyleng; return TOK_whitespace; } YY_BREAK -case 130: +case 131: YY_RULE_SETUP -#line 420 "asn1p_l.l" +#line 428 "asn1p_l.l" { yy_pop_state(); if(YYSTATE == with_syntax) { @@ -2964,14 +3005,14 @@ YY_RULE_SETUP } YY_BREAK -case 131: +case 132: YY_RULE_SETUP -#line 433 "asn1p_l.l" +#line 441 "asn1p_l.l" /* Ignore whitespace */ YY_BREAK -case 132: +case 133: YY_RULE_SETUP -#line 436 "asn1p_l.l" +#line 444 "asn1p_l.l" { asn1c_integer_t v1 = -1, v2 = -1; char *p; @@ -2997,9 +3038,9 @@ YY_RULE_SETUP return TOK_tuple; } YY_BREAK -case 133: +case 134: YY_RULE_SETUP -#line 461 "asn1p_l.l" +#line 469 "asn1p_l.l" { asn1c_integer_t v1 = -1, v2 = -1, v3 = -1, v4 = -1; char *p; @@ -3043,14 +3084,14 @@ YY_RULE_SETUP return TOK_quadruple; } YY_BREAK -case 134: +case 135: YY_RULE_SETUP -#line 505 "asn1p_l.l" +#line 513 "asn1p_l.l" return yytext[0]; YY_BREAK -case 135: +case 136: YY_RULE_SETUP -#line 507 "asn1p_l.l" +#line 515 "asn1p_l.l" { if(TYPE_LIFETIME(1994, 0)) fprintf(stderr, "ERROR: "); @@ -3062,9 +3103,9 @@ YY_RULE_SETUP return -1; } YY_BREAK -case 136: +case 137: YY_RULE_SETUP -#line 518 "asn1p_l.l" +#line 526 "asn1p_l.l" { fprintf(stderr, "Unexpected token at line %d: \"%s\"\n", @@ -3086,19 +3127,19 @@ case YY_STATE_EOF(quoted): case YY_STATE_EOF(opaque): case YY_STATE_EOF(encoding_control): case YY_STATE_EOF(with_syntax): -#line 531 "asn1p_l.l" +#line 539 "asn1p_l.l" { while(YYSTATE != INITIAL) yy_pop_state(); yyterminate(); } YY_BREAK -case 137: +case 138: YY_RULE_SETUP -#line 538 "asn1p_l.l" +#line 546 "asn1p_l.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK -#line 3102 "asn1p_l.c" +#line 3143 "asn1p_l.c" case YY_END_OF_BUFFER: { @@ -3385,7 +3426,7 @@ static yy_state_type yy_get_previous_state() while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 735 ) + if ( yy_current_state >= 742 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -3415,11 +3456,11 @@ yy_state_type yy_current_state; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 735 ) + if ( yy_current_state >= 742 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 734); + yy_is_jam = (yy_current_state == 741); if ( ! yy_is_jam ) *yy_state_ptr++ = yy_current_state; @@ -3980,7 +4021,7 @@ int main() return 0; } #endif -#line 538 "asn1p_l.l" +#line 546 "asn1p_l.l" /* @@ -4010,3 +4051,19 @@ _lex_atoi(const char *ptr) { } return value; } + +static double +_lex_atod(const char *ptr) { + double value; + errno = 0; + value = strtod(ptr, 0); + if(errno) { + fprintf(stderr, + "Value \"%s\" at line %d is outside of `double` range " + "in this compiler! Please contact the asn1c author.\n", + ptr, yylineno); + errno = ERANGE; + } + return value; +} + diff --git a/libasn1parser/asn1p_l.l b/libasn1parser/asn1p_l.l index 2594b556e..33d2a143f 100644 --- a/libasn1parser/asn1p_l.l +++ b/libasn1parser/asn1p_l.l @@ -27,6 +27,7 @@ int asn1p_lexer_constructs_year = 0; int asn1p_as_pointer; static asn1c_integer_t _lex_atoi(const char *ptr); +static double _lex_atod(const char *ptr); /* * Check that the type is defined in the year of the standard choosen. @@ -240,6 +241,13 @@ WSP [\t\r\v\f\n ] return TOK_number; } +[-+]?[0-9]+[.]?([eE][-+]?)?[0-9]+ { + asn1p_lval.a_dbl = _lex_atod(yytext); + if(errno == ERANGE) + return -1; + return TOK_realnumber; + } + ABSENT return TOK_ABSENT; ALL return TOK_ALL; ANY { @@ -564,3 +572,19 @@ _lex_atoi(const char *ptr) { } return value; } + +static double +_lex_atod(const char *ptr) { + double value; + errno = 0; + value = strtod(ptr, 0); + if(errno) { + fprintf(stderr, + "Value \"%s\" at line %d is outside of `double` range " + "in this compiler! Please contact the asn1c author.\n", + ptr, yylineno); + errno = ERANGE; + } + return value; +} + diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index f99d215fd..ba23ed2e6 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -67,100 +67,101 @@ TOK_hstring = 263, TOK_identifier = 264, TOK_number = 265, - TOK_tuple = 266, - TOK_quadruple = 267, - TOK_number_negative = 268, - TOK_typereference = 269, - TOK_capitalreference = 270, - TOK_typefieldreference = 271, - TOK_valuefieldreference = 272, - TOK_Literal = 273, - TOK_ABSENT = 274, - TOK_ABSTRACT_SYNTAX = 275, - TOK_ALL = 276, - TOK_ANY = 277, - TOK_APPLICATION = 278, - TOK_AUTOMATIC = 279, - TOK_BEGIN = 280, - TOK_BIT = 281, - TOK_BMPString = 282, - TOK_BOOLEAN = 283, - TOK_BY = 284, - TOK_CHARACTER = 285, - TOK_CHOICE = 286, - TOK_CLASS = 287, - TOK_COMPONENT = 288, - TOK_COMPONENTS = 289, - TOK_CONSTRAINED = 290, - TOK_CONTAINING = 291, - TOK_DEFAULT = 292, - TOK_DEFINITIONS = 293, - TOK_DEFINED = 294, - TOK_EMBEDDED = 295, - TOK_ENCODED = 296, - TOK_ENCODING_CONTROL = 297, - TOK_END = 298, - TOK_ENUMERATED = 299, - TOK_EXPLICIT = 300, - TOK_EXPORTS = 301, - TOK_EXTENSIBILITY = 302, - TOK_EXTERNAL = 303, - TOK_FALSE = 304, - TOK_FROM = 305, - TOK_GeneralizedTime = 306, - TOK_GeneralString = 307, - TOK_GraphicString = 308, - TOK_IA5String = 309, - TOK_IDENTIFIER = 310, - TOK_IMPLICIT = 311, - TOK_IMPLIED = 312, - TOK_IMPORTS = 313, - TOK_INCLUDES = 314, - TOK_INSTANCE = 315, - TOK_INSTRUCTIONS = 316, - TOK_INTEGER = 317, - TOK_ISO646String = 318, - TOK_MAX = 319, - TOK_MIN = 320, - TOK_MINUS_INFINITY = 321, - TOK_NULL = 322, - TOK_NumericString = 323, - TOK_OBJECT = 324, - TOK_ObjectDescriptor = 325, - TOK_OCTET = 326, - TOK_OF = 327, - TOK_OPTIONAL = 328, - TOK_PATTERN = 329, - TOK_PDV = 330, - TOK_PLUS_INFINITY = 331, - TOK_PRESENT = 332, - TOK_PrintableString = 333, - TOK_PRIVATE = 334, - TOK_REAL = 335, - TOK_RELATIVE_OID = 336, - TOK_SEQUENCE = 337, - TOK_SET = 338, - TOK_SIZE = 339, - TOK_STRING = 340, - TOK_SYNTAX = 341, - TOK_T61String = 342, - TOK_TAGS = 343, - TOK_TeletexString = 344, - TOK_TRUE = 345, - TOK_TYPE_IDENTIFIER = 346, - TOK_UNIQUE = 347, - TOK_UNIVERSAL = 348, - TOK_UniversalString = 349, - TOK_UTCTime = 350, - TOK_UTF8String = 351, - TOK_VideotexString = 352, - TOK_VisibleString = 353, - TOK_WITH = 354, - TOK_EXCEPT = 355, - TOK_INTERSECTION = 356, - TOK_UNION = 357, - TOK_TwoDots = 358, - TOK_ThreeDots = 359 + TOK_number_negative = 266, + TOK_realnumber = 267, + TOK_tuple = 268, + TOK_quadruple = 269, + TOK_typereference = 270, + TOK_capitalreference = 271, + TOK_typefieldreference = 272, + TOK_valuefieldreference = 273, + TOK_Literal = 274, + TOK_ABSENT = 275, + TOK_ABSTRACT_SYNTAX = 276, + TOK_ALL = 277, + TOK_ANY = 278, + TOK_APPLICATION = 279, + TOK_AUTOMATIC = 280, + TOK_BEGIN = 281, + TOK_BIT = 282, + TOK_BMPString = 283, + TOK_BOOLEAN = 284, + TOK_BY = 285, + TOK_CHARACTER = 286, + TOK_CHOICE = 287, + TOK_CLASS = 288, + TOK_COMPONENT = 289, + TOK_COMPONENTS = 290, + TOK_CONSTRAINED = 291, + TOK_CONTAINING = 292, + TOK_DEFAULT = 293, + TOK_DEFINITIONS = 294, + TOK_DEFINED = 295, + TOK_EMBEDDED = 296, + TOK_ENCODED = 297, + TOK_ENCODING_CONTROL = 298, + TOK_END = 299, + TOK_ENUMERATED = 300, + TOK_EXPLICIT = 301, + TOK_EXPORTS = 302, + TOK_EXTENSIBILITY = 303, + TOK_EXTERNAL = 304, + TOK_FALSE = 305, + TOK_FROM = 306, + TOK_GeneralizedTime = 307, + TOK_GeneralString = 308, + TOK_GraphicString = 309, + TOK_IA5String = 310, + TOK_IDENTIFIER = 311, + TOK_IMPLICIT = 312, + TOK_IMPLIED = 313, + TOK_IMPORTS = 314, + TOK_INCLUDES = 315, + TOK_INSTANCE = 316, + TOK_INSTRUCTIONS = 317, + TOK_INTEGER = 318, + TOK_ISO646String = 319, + TOK_MAX = 320, + TOK_MIN = 321, + TOK_MINUS_INFINITY = 322, + TOK_NULL = 323, + TOK_NumericString = 324, + TOK_OBJECT = 325, + TOK_ObjectDescriptor = 326, + TOK_OCTET = 327, + TOK_OF = 328, + TOK_OPTIONAL = 329, + TOK_PATTERN = 330, + TOK_PDV = 331, + TOK_PLUS_INFINITY = 332, + TOK_PRESENT = 333, + TOK_PrintableString = 334, + TOK_PRIVATE = 335, + TOK_REAL = 336, + TOK_RELATIVE_OID = 337, + TOK_SEQUENCE = 338, + TOK_SET = 339, + TOK_SIZE = 340, + TOK_STRING = 341, + TOK_SYNTAX = 342, + TOK_T61String = 343, + TOK_TAGS = 344, + TOK_TeletexString = 345, + TOK_TRUE = 346, + TOK_TYPE_IDENTIFIER = 347, + TOK_UNIQUE = 348, + TOK_UNIVERSAL = 349, + TOK_UniversalString = 350, + TOK_UTCTime = 351, + TOK_UTF8String = 352, + TOK_VideotexString = 353, + TOK_VisibleString = 354, + TOK_WITH = 355, + TOK_EXCEPT = 356, + TOK_INTERSECTION = 357, + TOK_UNION = 358, + TOK_TwoDots = 359, + TOK_ThreeDots = 360 }; #endif #define TOK_PPEQ 258 @@ -171,100 +172,101 @@ #define TOK_hstring 263 #define TOK_identifier 264 #define TOK_number 265 -#define TOK_tuple 266 -#define TOK_quadruple 267 -#define TOK_number_negative 268 -#define TOK_typereference 269 -#define TOK_capitalreference 270 -#define TOK_typefieldreference 271 -#define TOK_valuefieldreference 272 -#define TOK_Literal 273 -#define TOK_ABSENT 274 -#define TOK_ABSTRACT_SYNTAX 275 -#define TOK_ALL 276 -#define TOK_ANY 277 -#define TOK_APPLICATION 278 -#define TOK_AUTOMATIC 279 -#define TOK_BEGIN 280 -#define TOK_BIT 281 -#define TOK_BMPString 282 -#define TOK_BOOLEAN 283 -#define TOK_BY 284 -#define TOK_CHARACTER 285 -#define TOK_CHOICE 286 -#define TOK_CLASS 287 -#define TOK_COMPONENT 288 -#define TOK_COMPONENTS 289 -#define TOK_CONSTRAINED 290 -#define TOK_CONTAINING 291 -#define TOK_DEFAULT 292 -#define TOK_DEFINITIONS 293 -#define TOK_DEFINED 294 -#define TOK_EMBEDDED 295 -#define TOK_ENCODED 296 -#define TOK_ENCODING_CONTROL 297 -#define TOK_END 298 -#define TOK_ENUMERATED 299 -#define TOK_EXPLICIT 300 -#define TOK_EXPORTS 301 -#define TOK_EXTENSIBILITY 302 -#define TOK_EXTERNAL 303 -#define TOK_FALSE 304 -#define TOK_FROM 305 -#define TOK_GeneralizedTime 306 -#define TOK_GeneralString 307 -#define TOK_GraphicString 308 -#define TOK_IA5String 309 -#define TOK_IDENTIFIER 310 -#define TOK_IMPLICIT 311 -#define TOK_IMPLIED 312 -#define TOK_IMPORTS 313 -#define TOK_INCLUDES 314 -#define TOK_INSTANCE 315 -#define TOK_INSTRUCTIONS 316 -#define TOK_INTEGER 317 -#define TOK_ISO646String 318 -#define TOK_MAX 319 -#define TOK_MIN 320 -#define TOK_MINUS_INFINITY 321 -#define TOK_NULL 322 -#define TOK_NumericString 323 -#define TOK_OBJECT 324 -#define TOK_ObjectDescriptor 325 -#define TOK_OCTET 326 -#define TOK_OF 327 -#define TOK_OPTIONAL 328 -#define TOK_PATTERN 329 -#define TOK_PDV 330 -#define TOK_PLUS_INFINITY 331 -#define TOK_PRESENT 332 -#define TOK_PrintableString 333 -#define TOK_PRIVATE 334 -#define TOK_REAL 335 -#define TOK_RELATIVE_OID 336 -#define TOK_SEQUENCE 337 -#define TOK_SET 338 -#define TOK_SIZE 339 -#define TOK_STRING 340 -#define TOK_SYNTAX 341 -#define TOK_T61String 342 -#define TOK_TAGS 343 -#define TOK_TeletexString 344 -#define TOK_TRUE 345 -#define TOK_TYPE_IDENTIFIER 346 -#define TOK_UNIQUE 347 -#define TOK_UNIVERSAL 348 -#define TOK_UniversalString 349 -#define TOK_UTCTime 350 -#define TOK_UTF8String 351 -#define TOK_VideotexString 352 -#define TOK_VisibleString 353 -#define TOK_WITH 354 -#define TOK_EXCEPT 355 -#define TOK_INTERSECTION 356 -#define TOK_UNION 357 -#define TOK_TwoDots 358 -#define TOK_ThreeDots 359 +#define TOK_number_negative 266 +#define TOK_realnumber 267 +#define TOK_tuple 268 +#define TOK_quadruple 269 +#define TOK_typereference 270 +#define TOK_capitalreference 271 +#define TOK_typefieldreference 272 +#define TOK_valuefieldreference 273 +#define TOK_Literal 274 +#define TOK_ABSENT 275 +#define TOK_ABSTRACT_SYNTAX 276 +#define TOK_ALL 277 +#define TOK_ANY 278 +#define TOK_APPLICATION 279 +#define TOK_AUTOMATIC 280 +#define TOK_BEGIN 281 +#define TOK_BIT 282 +#define TOK_BMPString 283 +#define TOK_BOOLEAN 284 +#define TOK_BY 285 +#define TOK_CHARACTER 286 +#define TOK_CHOICE 287 +#define TOK_CLASS 288 +#define TOK_COMPONENT 289 +#define TOK_COMPONENTS 290 +#define TOK_CONSTRAINED 291 +#define TOK_CONTAINING 292 +#define TOK_DEFAULT 293 +#define TOK_DEFINITIONS 294 +#define TOK_DEFINED 295 +#define TOK_EMBEDDED 296 +#define TOK_ENCODED 297 +#define TOK_ENCODING_CONTROL 298 +#define TOK_END 299 +#define TOK_ENUMERATED 300 +#define TOK_EXPLICIT 301 +#define TOK_EXPORTS 302 +#define TOK_EXTENSIBILITY 303 +#define TOK_EXTERNAL 304 +#define TOK_FALSE 305 +#define TOK_FROM 306 +#define TOK_GeneralizedTime 307 +#define TOK_GeneralString 308 +#define TOK_GraphicString 309 +#define TOK_IA5String 310 +#define TOK_IDENTIFIER 311 +#define TOK_IMPLICIT 312 +#define TOK_IMPLIED 313 +#define TOK_IMPORTS 314 +#define TOK_INCLUDES 315 +#define TOK_INSTANCE 316 +#define TOK_INSTRUCTIONS 317 +#define TOK_INTEGER 318 +#define TOK_ISO646String 319 +#define TOK_MAX 320 +#define TOK_MIN 321 +#define TOK_MINUS_INFINITY 322 +#define TOK_NULL 323 +#define TOK_NumericString 324 +#define TOK_OBJECT 325 +#define TOK_ObjectDescriptor 326 +#define TOK_OCTET 327 +#define TOK_OF 328 +#define TOK_OPTIONAL 329 +#define TOK_PATTERN 330 +#define TOK_PDV 331 +#define TOK_PLUS_INFINITY 332 +#define TOK_PRESENT 333 +#define TOK_PrintableString 334 +#define TOK_PRIVATE 335 +#define TOK_REAL 336 +#define TOK_RELATIVE_OID 337 +#define TOK_SEQUENCE 338 +#define TOK_SET 339 +#define TOK_SIZE 340 +#define TOK_STRING 341 +#define TOK_SYNTAX 342 +#define TOK_T61String 343 +#define TOK_TAGS 344 +#define TOK_TeletexString 345 +#define TOK_TRUE 346 +#define TOK_TYPE_IDENTIFIER 347 +#define TOK_UNIQUE 348 +#define TOK_UNIVERSAL 349 +#define TOK_UniversalString 350 +#define TOK_UTCTime 351 +#define TOK_UTF8String 352 +#define TOK_VideotexString 353 +#define TOK_VisibleString 354 +#define TOK_WITH 355 +#define TOK_EXCEPT 356 +#define TOK_INTERSECTION 357 +#define TOK_UNION 358 +#define TOK_TwoDots 359 +#define TOK_ThreeDots 360 @@ -374,6 +376,7 @@ typedef union { struct asn1p_expr_marker_s a_marker; /* OPTIONAL/DEFAULT */ enum asn1p_constr_pres_e a_pres; /* PRESENT/ABSENT/OPTIONAL */ asn1c_integer_t a_int; + double a_dbl; char *tv_str; struct { char *buf; @@ -385,7 +388,7 @@ typedef union { } tv_nametag; } yystype; /* Line 193 of /usr/local/share/bison/yacc.c. */ -#line 389 "asn1p_y.c" +#line 392 "asn1p_y.c" # define YYSTYPE yystype # define YYSTYPE_IS_TRIVIAL 1 #endif @@ -406,7 +409,7 @@ typedef struct yyltype /* Line 213 of /usr/local/share/bison/yacc.c. */ -#line 410 "asn1p_y.c" +#line 413 "asn1p_y.c" #if ! defined (yyoverflow) || YYERROR_VERBOSE @@ -504,20 +507,20 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 7 -#define YYLAST 838 +#define YYLAST 803 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 120 +#define YYNTOKENS 121 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 108 +#define YYNNTS 109 /* YYNRULES -- Number of rules. */ -#define YYNRULES 291 +#define YYNRULES 293 /* YYNRULES -- Number of states. */ -#define YYNSTATES 448 +#define YYNSTATES 450 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 359 +#define YYMAXUTOK 360 #define YYTRANSLATE(X) \ ((unsigned)(X) <= YYMAXUTOK ? yytranslate[X] : YYUNDEFTOK) @@ -528,16 +531,16 @@ static const unsigned char yytranslate[] = 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 116, 2, 2, 2, 2, 2, 2, - 109, 110, 2, 2, 112, 2, 117, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 113, 111, - 118, 2, 2, 2, 119, 2, 2, 2, 2, 2, + 2, 2, 2, 117, 2, 2, 2, 2, 2, 2, + 110, 111, 2, 2, 113, 2, 118, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 114, 112, + 119, 2, 2, 2, 120, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 114, 2, 115, 101, 2, 2, 2, 2, 2, + 2, 115, 2, 116, 102, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 107, 103, 108, 2, 2, 2, 2, + 2, 2, 2, 108, 104, 109, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -560,7 +563,8 @@ static const unsigned char yytranslate[] = 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 102, 104, 105, 106 + 95, 96, 97, 98, 99, 100, 101, 103, 105, 106, + 107 }; #if YYDEBUG @@ -595,132 +599,132 @@ static const unsigned short yyprhs[] = 688, 694, 696, 700, 702, 706, 707, 709, 711, 713, 715, 717, 719, 723, 728, 730, 734, 737, 741, 743, 747, 748, 750, 752, 755, 758, 762, 764, 768, 770, - 775, 780, 782, 784, 786, 788, 789, 791, 794, 799, - 800, 802, 804, 806, 807, 809, 811, 813, 815, 817, - 818, 820 + 775, 780, 782, 784, 786, 788, 790, 792, 793, 795, + 798, 803, 804, 806, 808, 810, 811, 813, 815, 817, + 819, 821, 822, 824 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const short yyrhs[] = { - 121, 0, -1, 122, -1, 123, -1, 122, 123, -1, - 224, 124, 38, 128, 3, 25, 131, 43, -1, -1, - 125, -1, 107, 126, 108, -1, 107, 108, -1, 127, - -1, 126, 127, -1, 227, -1, 227, 109, 10, 110, - -1, 10, -1, -1, 129, -1, 130, -1, 129, 130, - -1, 45, 88, -1, 56, 88, -1, 24, 88, -1, - 47, 57, -1, 15, 61, -1, -1, 132, -1, 133, - -1, 132, 133, -1, 135, -1, 141, -1, 147, -1, - 177, -1, 145, -1, -1, 42, 15, 134, -1, 187, - -1, 58, 136, 111, -1, 58, 50, -1, 138, -1, - 136, 138, -1, -1, 125, -1, 139, 50, 224, 137, - -1, 140, -1, 139, 112, 140, -1, 224, -1, 224, - 107, 108, -1, 227, -1, 46, 142, 111, -1, 46, - 21, 111, -1, 46, 111, -1, 143, -1, 142, 112, - 143, -1, 224, -1, 224, 107, 108, -1, 227, -1, - 107, 194, 108, -1, 224, 146, 3, 144, -1, 186, - -1, 171, -1, 171, 107, 150, 108, -1, 224, 3, - 167, -1, 224, 3, 157, -1, 224, 107, 148, 108, - 3, 167, -1, 224, 107, 148, 108, 3, 157, -1, - 149, -1, 148, 112, 149, -1, 224, -1, 224, 113, - 227, -1, 224, 113, 224, -1, 184, 113, 227, -1, - 184, 113, 224, -1, 151, -1, 150, 112, 151, -1, - 167, -1, 180, -1, 227, -1, 144, -1, -1, 153, - -1, 154, -1, 153, 112, 154, -1, 227, 167, 213, - -1, 167, 213, -1, 34, 72, 167, -1, 166, -1, - 156, -1, 155, 112, 156, -1, 227, 167, -1, 166, - -1, 167, -1, 32, 107, 159, 108, 161, -1, -1, - 92, -1, 160, -1, 159, 112, 160, -1, 16, 213, - -1, 17, 167, 158, 213, -1, 17, 175, 213, -1, - 17, 176, 213, -1, 16, 175, 213, -1, 16, 167, - 213, -1, 16, 176, 213, -1, -1, 162, -1, -1, - 99, 86, 107, 163, 164, 108, -1, 165, -1, 164, - 165, -1, 4, -1, 18, -1, 174, -1, 114, 164, - 115, -1, 106, -1, 106, 116, 181, -1, 106, 116, - 218, -1, 219, 169, 191, -1, -1, 168, 170, -1, - 146, -1, 31, 107, 155, 108, -1, 82, 107, 152, - 108, -1, 83, 107, 152, 108, -1, 82, 191, 72, - 226, 219, 169, -1, 83, 191, 72, 226, 219, 169, - -1, 22, -1, 22, 39, 29, 227, -1, 60, 72, - 171, -1, 14, -1, 14, 117, 224, -1, 225, 117, - 224, -1, 14, 117, 227, -1, 225, -1, 225, 117, - 172, -1, 173, -1, 172, 117, 173, -1, 174, -1, - 16, -1, 17, -1, 16, -1, 175, 117, 16, -1, - 175, 117, 17, -1, 15, -1, 227, 146, 3, 178, - -1, 180, -1, 181, -1, 227, 113, 178, -1, -1, - 107, 179, 183, -1, 67, -1, 49, -1, 90, -1, - 6, -1, 8, -1, 182, -1, 218, -1, 227, -1, - 224, 117, 227, -1, 7, -1, 11, -1, 12, -1, - 5, -1, 183, 5, -1, 28, -1, 67, -1, 80, - -1, 185, -1, 71, 85, -1, 69, 55, -1, 81, - -1, 48, -1, 40, 75, -1, 30, 85, -1, 95, - -1, 51, -1, 187, -1, 62, -1, 44, -1, 26, - 85, -1, 184, -1, 185, 215, -1, 27, -1, 52, - -1, 53, -1, 54, -1, 63, -1, 68, -1, 78, - -1, 87, -1, 89, -1, 94, -1, 96, -1, 97, - -1, 98, -1, 70, -1, 103, -1, 104, -1, 101, - -1, 102, -1, 100, -1, -1, 192, -1, 193, -1, - 84, 109, 194, 110, -1, 109, 194, 110, -1, 193, - 109, 194, 110, -1, 106, -1, 195, -1, 195, 112, - 106, -1, 195, 112, 106, 112, 195, -1, 196, -1, - 21, 100, 196, -1, 195, 188, 196, -1, 195, 189, - 196, -1, 196, 190, 196, -1, 199, 109, 194, 110, - -1, 109, 194, 110, -1, 200, -1, 201, -1, 200, - 198, 200, -1, 65, 198, 200, -1, 200, 198, 64, - -1, 65, 198, 64, -1, 207, -1, 202, -1, -1, - 35, 29, 107, 197, 183, -1, 105, -1, 105, 118, - -1, 118, 105, -1, 118, 105, 118, -1, 84, -1, - 50, -1, 49, -1, 90, -1, 218, -1, 182, -1, - 227, -1, 224, -1, 99, 33, 193, -1, 99, 34, - 107, 203, 108, -1, 204, -1, 203, 112, 204, -1, - 106, -1, 227, 191, 205, -1, -1, 206, -1, 77, - -1, 19, -1, 73, -1, 208, -1, 209, -1, 107, - 224, 108, -1, 208, 107, 210, 108, -1, 211, -1, - 210, 112, 211, -1, 119, 212, -1, 119, 117, 212, - -1, 227, -1, 212, 117, 227, -1, -1, 214, -1, - 73, -1, 37, 178, -1, 107, 108, -1, 107, 216, - 108, -1, 217, -1, 216, 112, 217, -1, 227, -1, - 227, 109, 218, 110, -1, 227, 109, 181, 110, -1, - 218, -1, 106, -1, 10, -1, 13, -1, -1, 220, - -1, 221, 223, -1, 114, 222, 10, 115, -1, -1, - 93, -1, 23, -1, 79, -1, -1, 56, -1, 45, - -1, 14, -1, 15, -1, 15, -1, -1, 227, -1, - 9, -1 + 122, 0, -1, 123, -1, 124, -1, 123, 124, -1, + 226, 125, 39, 129, 3, 26, 132, 44, -1, -1, + 126, -1, 108, 127, 109, -1, 108, 109, -1, 128, + -1, 127, 128, -1, 229, -1, 229, 110, 10, 111, + -1, 10, -1, -1, 130, -1, 131, -1, 130, 131, + -1, 46, 89, -1, 57, 89, -1, 25, 89, -1, + 48, 58, -1, 16, 62, -1, -1, 133, -1, 134, + -1, 133, 134, -1, 136, -1, 142, -1, 148, -1, + 178, -1, 146, -1, -1, 43, 16, 135, -1, 188, + -1, 59, 137, 112, -1, 59, 51, -1, 139, -1, + 137, 139, -1, -1, 126, -1, 140, 51, 226, 138, + -1, 141, -1, 140, 113, 141, -1, 226, -1, 226, + 108, 109, -1, 229, -1, 47, 143, 112, -1, 47, + 22, 112, -1, 47, 112, -1, 144, -1, 143, 113, + 144, -1, 226, -1, 226, 108, 109, -1, 229, -1, + 108, 195, 109, -1, 226, 147, 3, 145, -1, 187, + -1, 172, -1, 172, 108, 151, 109, -1, 226, 3, + 168, -1, 226, 3, 158, -1, 226, 108, 149, 109, + 3, 168, -1, 226, 108, 149, 109, 3, 158, -1, + 150, -1, 149, 113, 150, -1, 226, -1, 226, 114, + 229, -1, 226, 114, 226, -1, 185, 114, 229, -1, + 185, 114, 226, -1, 152, -1, 151, 113, 152, -1, + 168, -1, 181, -1, 229, -1, 145, -1, -1, 154, + -1, 155, -1, 154, 113, 155, -1, 229, 168, 214, + -1, 168, 214, -1, 35, 73, 168, -1, 167, -1, + 157, -1, 156, 113, 157, -1, 229, 168, -1, 167, + -1, 168, -1, 33, 108, 160, 109, 162, -1, -1, + 93, -1, 161, -1, 160, 113, 161, -1, 17, 214, + -1, 18, 168, 159, 214, -1, 18, 176, 214, -1, + 18, 177, 214, -1, 17, 176, 214, -1, 17, 168, + 214, -1, 17, 177, 214, -1, -1, 163, -1, -1, + 100, 87, 108, 164, 165, 109, -1, 166, -1, 165, + 166, -1, 4, -1, 19, -1, 175, -1, 115, 165, + 116, -1, 107, -1, 107, 117, 182, -1, 107, 117, + 219, -1, 221, 170, 192, -1, -1, 169, 171, -1, + 147, -1, 32, 108, 156, 109, -1, 83, 108, 153, + 109, -1, 84, 108, 153, 109, -1, 83, 192, 73, + 228, 221, 170, -1, 84, 192, 73, 228, 221, 170, + -1, 23, -1, 23, 40, 30, 229, -1, 61, 73, + 172, -1, 15, -1, 15, 118, 226, -1, 227, 118, + 226, -1, 15, 118, 229, -1, 227, -1, 227, 118, + 173, -1, 174, -1, 173, 118, 174, -1, 175, -1, + 17, -1, 18, -1, 17, -1, 176, 118, 17, -1, + 176, 118, 18, -1, 16, -1, 229, 147, 3, 179, + -1, 181, -1, 182, -1, 229, 114, 179, -1, -1, + 108, 180, 184, -1, 68, -1, 50, -1, 91, -1, + 6, -1, 8, -1, 183, -1, 219, -1, 229, -1, + 226, 118, 229, -1, 7, -1, 13, -1, 14, -1, + 5, -1, 184, 5, -1, 29, -1, 68, -1, 81, + -1, 186, -1, 72, 86, -1, 70, 56, -1, 82, + -1, 49, -1, 41, 76, -1, 31, 86, -1, 96, + -1, 52, -1, 188, -1, 63, -1, 45, -1, 27, + 86, -1, 185, -1, 186, 216, -1, 28, -1, 53, + -1, 54, -1, 55, -1, 64, -1, 69, -1, 79, + -1, 88, -1, 90, -1, 95, -1, 97, -1, 98, + -1, 99, -1, 71, -1, 104, -1, 105, -1, 102, + -1, 103, -1, 101, -1, -1, 193, -1, 194, -1, + 85, 110, 195, 111, -1, 110, 195, 111, -1, 194, + 110, 195, 111, -1, 107, -1, 196, -1, 196, 113, + 107, -1, 196, 113, 107, 113, 196, -1, 197, -1, + 22, 101, 197, -1, 196, 189, 197, -1, 196, 190, + 197, -1, 197, 191, 197, -1, 200, 110, 195, 111, + -1, 110, 195, 111, -1, 201, -1, 202, -1, 201, + 199, 201, -1, 66, 199, 201, -1, 201, 199, 65, + -1, 66, 199, 65, -1, 208, -1, 203, -1, -1, + 36, 30, 108, 198, 184, -1, 106, -1, 106, 119, + -1, 119, 106, -1, 119, 106, 119, -1, 85, -1, + 51, -1, 50, -1, 91, -1, 220, -1, 183, -1, + 229, -1, 226, -1, 100, 34, 194, -1, 100, 35, + 108, 204, 109, -1, 205, -1, 204, 113, 205, -1, + 107, -1, 229, 192, 206, -1, -1, 207, -1, 78, + -1, 20, -1, 74, -1, 209, -1, 210, -1, 108, + 226, 109, -1, 209, 108, 211, 109, -1, 212, -1, + 211, 113, 212, -1, 120, 213, -1, 120, 118, 213, + -1, 229, -1, 213, 118, 229, -1, -1, 215, -1, + 74, -1, 38, 179, -1, 108, 109, -1, 108, 217, + 109, -1, 218, -1, 217, 113, 218, -1, 229, -1, + 229, 110, 219, 111, -1, 229, 110, 182, 111, -1, + 219, -1, 107, -1, 10, -1, 11, -1, 219, -1, + 12, -1, -1, 222, -1, 223, 225, -1, 115, 224, + 10, 116, -1, -1, 94, -1, 24, -1, 80, -1, + -1, 57, -1, 46, -1, 15, -1, 16, -1, 16, + -1, -1, 229, -1, 9, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const unsigned short yyrline[] = { - 0, 323, 323, 329, 335, 351, 376, 378, 381, 385, - 390, 397, 405, 410, 414, 423, 425, 433, 437, 445, - 449, 452, 455, 459, 479, 481, 489, 493, 525, 529, - 538, 545, 558, 566, 565, 579, 591, 602, 607, 613, - 619, 621, 624, 635, 641, 647, 654, 660, 668, 672, - 675, 682, 688, 694, 701, 707, 716, 718, 728, 742, - 752, 768, 778, 794, 800, 807, 817, 827, 832, 839, - 846, 854, 864, 870, 876, 880, 888, 899, 921, 923, - 925, 931, 937, 945, 951, 958, 963, 969, 975, 981, - 984, 990, 1000, 1002, 1005, 1013, 1020, 1033, 1044, 1054, - 1065, 1075, 1086, 1097, 1099, 1106, 1104, 1113, 1118, 1124, - 1129, 1132, 1136, 1141, 1150, 1159, 1170, 1192, 1199, 1218, - 1222, 1228, 1234, 1240, 1250, 1260, 1266, 1277, 1291, 1300, - 1310, 1320, 1330, 1338, 1359, 1368, 1377, 1379, 1386, 1393, - 1399, 1403, 1409, 1429, 1439, 1441, 1442, 1449, 1449, 1454, - 1461, 1467, 1472, 1476, 1480, 1483, 1488, 1500, 1517, 1522, - 1527, 1560, 1570, 1584, 1586, 1587, 1588, 1589, 1590, 1591, - 1592, 1593, 1594, 1595, 1596, 1597, 1603, 1605, 1606, 1609, - 1616, 1628, 1630, 1634, 1638, 1639, 1640, 1641, 1642, 1646, - 1647, 1648, 1649, 1653, 1654, 1661, 1661, 1662, 1662, 1663, - 1665, 1667, 1672, 1676, 1685, 1689, 1694, 1699, 1702, 1708, - 1718, 1722, 1725, 1728, 1731, 1736, 1745, 1753, 1759, 1765, - 1772, 1780, 1788, 1797, 1800, 1804, 1803, 1814, 1816, 1817, - 1818, 1821, 1825, 1830, 1836, 1841, 1844, 1847, 1860, 1874, - 1878, 1883, 1887, 1892, 1899, 1912, 1914, 1917, 1921, 1924, - 1929, 1933, 1941, 1956, 1962, 1969, 1982, 1994, 2009, 2013, - 2030, 2035, 2038, 2043, 2065, 2070, 2075, 2081, 2087, 2095, - 2103, 2111, 2118, 2128, 2133, 2163, 2165, 2168, 2175, 2181, - 2183, 2184, 2185, 2188, 2190, 2191, 2194, 2199, 2206, 2213, - 2215, 2220 + 0, 326, 326, 332, 338, 354, 379, 381, 384, 388, + 393, 400, 408, 413, 417, 426, 428, 436, 440, 448, + 452, 455, 458, 462, 482, 484, 492, 496, 528, 532, + 541, 548, 561, 569, 568, 582, 594, 605, 610, 616, + 622, 624, 627, 638, 644, 650, 657, 663, 671, 675, + 678, 685, 691, 697, 704, 710, 719, 721, 731, 745, + 755, 771, 781, 797, 803, 810, 820, 830, 835, 842, + 849, 857, 867, 873, 879, 883, 891, 902, 924, 926, + 928, 934, 940, 948, 954, 961, 966, 972, 978, 984, + 987, 993, 1003, 1005, 1008, 1016, 1023, 1036, 1047, 1057, + 1068, 1078, 1089, 1100, 1102, 1109, 1107, 1116, 1121, 1127, + 1132, 1135, 1139, 1144, 1153, 1162, 1173, 1195, 1202, 1221, + 1225, 1231, 1237, 1243, 1253, 1263, 1269, 1280, 1294, 1303, + 1313, 1323, 1333, 1341, 1362, 1371, 1380, 1382, 1389, 1396, + 1402, 1406, 1412, 1432, 1442, 1444, 1445, 1452, 1452, 1457, + 1464, 1470, 1475, 1479, 1483, 1486, 1491, 1503, 1520, 1525, + 1530, 1563, 1573, 1587, 1589, 1590, 1591, 1592, 1593, 1594, + 1595, 1596, 1597, 1598, 1599, 1600, 1606, 1608, 1609, 1612, + 1619, 1631, 1633, 1637, 1641, 1642, 1643, 1644, 1645, 1649, + 1650, 1651, 1652, 1656, 1657, 1664, 1664, 1665, 1665, 1666, + 1668, 1670, 1675, 1679, 1688, 1692, 1697, 1702, 1705, 1711, + 1721, 1725, 1728, 1731, 1734, 1739, 1748, 1756, 1762, 1768, + 1775, 1783, 1791, 1800, 1803, 1807, 1806, 1817, 1819, 1820, + 1821, 1824, 1828, 1833, 1839, 1844, 1845, 1846, 1859, 1873, + 1877, 1882, 1886, 1891, 1898, 1911, 1913, 1916, 1920, 1923, + 1928, 1932, 1940, 1955, 1961, 1968, 1981, 1993, 2008, 2012, + 2029, 2034, 2037, 2042, 2064, 2069, 2074, 2080, 2086, 2094, + 2102, 2110, 2117, 2127, 2132, 2138, 2140, 2170, 2172, 2175, + 2182, 2188, 2190, 2191, 2192, 2195, 2197, 2198, 2201, 2206, + 2213, 2220, 2222, 2227 }; #endif @@ -731,46 +735,47 @@ static const char *const yytname[] = { "$end", "error", "$undefined", "TOK_PPEQ", "TOK_whitespace", "TOK_opaque", "TOK_bstring", "TOK_cstring", "TOK_hstring", "TOK_identifier", - "TOK_number", "TOK_tuple", "TOK_quadruple", "TOK_number_negative", - "TOK_typereference", "TOK_capitalreference", "TOK_typefieldreference", - "TOK_valuefieldreference", "TOK_Literal", "TOK_ABSENT", - "TOK_ABSTRACT_SYNTAX", "TOK_ALL", "TOK_ANY", "TOK_APPLICATION", - "TOK_AUTOMATIC", "TOK_BEGIN", "TOK_BIT", "TOK_BMPString", "TOK_BOOLEAN", - "TOK_BY", "TOK_CHARACTER", "TOK_CHOICE", "TOK_CLASS", "TOK_COMPONENT", - "TOK_COMPONENTS", "TOK_CONSTRAINED", "TOK_CONTAINING", "TOK_DEFAULT", - "TOK_DEFINITIONS", "TOK_DEFINED", "TOK_EMBEDDED", "TOK_ENCODED", - "TOK_ENCODING_CONTROL", "TOK_END", "TOK_ENUMERATED", "TOK_EXPLICIT", - "TOK_EXPORTS", "TOK_EXTENSIBILITY", "TOK_EXTERNAL", "TOK_FALSE", - "TOK_FROM", "TOK_GeneralizedTime", "TOK_GeneralString", - "TOK_GraphicString", "TOK_IA5String", "TOK_IDENTIFIER", "TOK_IMPLICIT", - "TOK_IMPLIED", "TOK_IMPORTS", "TOK_INCLUDES", "TOK_INSTANCE", - "TOK_INSTRUCTIONS", "TOK_INTEGER", "TOK_ISO646String", "TOK_MAX", - "TOK_MIN", "TOK_MINUS_INFINITY", "TOK_NULL", "TOK_NumericString", - "TOK_OBJECT", "TOK_ObjectDescriptor", "TOK_OCTET", "TOK_OF", - "TOK_OPTIONAL", "TOK_PATTERN", "TOK_PDV", "TOK_PLUS_INFINITY", - "TOK_PRESENT", "TOK_PrintableString", "TOK_PRIVATE", "TOK_REAL", - "TOK_RELATIVE_OID", "TOK_SEQUENCE", "TOK_SET", "TOK_SIZE", "TOK_STRING", - "TOK_SYNTAX", "TOK_T61String", "TOK_TAGS", "TOK_TeletexString", - "TOK_TRUE", "TOK_TYPE_IDENTIFIER", "TOK_UNIQUE", "TOK_UNIVERSAL", - "TOK_UniversalString", "TOK_UTCTime", "TOK_UTF8String", - "TOK_VideotexString", "TOK_VisibleString", "TOK_WITH", "TOK_EXCEPT", - "'^'", "TOK_INTERSECTION", "'|'", "TOK_UNION", "TOK_TwoDots", - "TOK_ThreeDots", "'{'", "'}'", "'('", "')'", "';'", "','", "':'", "'['", - "']'", "'!'", "'.'", "'<'", "'@'", "$accept", "ParsedGrammar", - "ModuleList", "ModuleSpecification", "optObjectIdentifier", - "ObjectIdentifier", "ObjectIdentifierBody", "ObjectIdentifierElement", - "optModuleSpecificationFlags", "ModuleSpecificationFlags", - "ModuleSpecificationFlag", "optModuleSpecificationBody", - "ModuleSpecificationBody", "ModuleSpecificationElement", "@1", - "ImportsDefinition", "ImportsBundleSet", "AssignedIdentifier", - "ImportsBundle", "ImportsList", "ImportsElement", "ExportsDefinition", - "ExportsBody", "ExportsElement", "ValueSet", "ValueSetTypeAssignment", - "DefinedType", "DataTypeReference", "ParameterArgumentList", - "ParameterArgumentName", "ActualParameterList", "ActualParameter", - "optComponentTypeLists", "ComponentTypeLists", "ComponentType", - "AlternativeTypeLists", "AlternativeType", "ObjectClass", "optUnique", - "FieldSpec", "ClassField", "optWithSyntax", "WithSyntax", "@2", - "WithSyntaxList", "WithSyntaxToken", "ExtensionAndException", "Type", + "TOK_number", "TOK_number_negative", "TOK_realnumber", "TOK_tuple", + "TOK_quadruple", "TOK_typereference", "TOK_capitalreference", + "TOK_typefieldreference", "TOK_valuefieldreference", "TOK_Literal", + "TOK_ABSENT", "TOK_ABSTRACT_SYNTAX", "TOK_ALL", "TOK_ANY", + "TOK_APPLICATION", "TOK_AUTOMATIC", "TOK_BEGIN", "TOK_BIT", + "TOK_BMPString", "TOK_BOOLEAN", "TOK_BY", "TOK_CHARACTER", "TOK_CHOICE", + "TOK_CLASS", "TOK_COMPONENT", "TOK_COMPONENTS", "TOK_CONSTRAINED", + "TOK_CONTAINING", "TOK_DEFAULT", "TOK_DEFINITIONS", "TOK_DEFINED", + "TOK_EMBEDDED", "TOK_ENCODED", "TOK_ENCODING_CONTROL", "TOK_END", + "TOK_ENUMERATED", "TOK_EXPLICIT", "TOK_EXPORTS", "TOK_EXTENSIBILITY", + "TOK_EXTERNAL", "TOK_FALSE", "TOK_FROM", "TOK_GeneralizedTime", + "TOK_GeneralString", "TOK_GraphicString", "TOK_IA5String", + "TOK_IDENTIFIER", "TOK_IMPLICIT", "TOK_IMPLIED", "TOK_IMPORTS", + "TOK_INCLUDES", "TOK_INSTANCE", "TOK_INSTRUCTIONS", "TOK_INTEGER", + "TOK_ISO646String", "TOK_MAX", "TOK_MIN", "TOK_MINUS_INFINITY", + "TOK_NULL", "TOK_NumericString", "TOK_OBJECT", "TOK_ObjectDescriptor", + "TOK_OCTET", "TOK_OF", "TOK_OPTIONAL", "TOK_PATTERN", "TOK_PDV", + "TOK_PLUS_INFINITY", "TOK_PRESENT", "TOK_PrintableString", + "TOK_PRIVATE", "TOK_REAL", "TOK_RELATIVE_OID", "TOK_SEQUENCE", + "TOK_SET", "TOK_SIZE", "TOK_STRING", "TOK_SYNTAX", "TOK_T61String", + "TOK_TAGS", "TOK_TeletexString", "TOK_TRUE", "TOK_TYPE_IDENTIFIER", + "TOK_UNIQUE", "TOK_UNIVERSAL", "TOK_UniversalString", "TOK_UTCTime", + "TOK_UTF8String", "TOK_VideotexString", "TOK_VisibleString", "TOK_WITH", + "TOK_EXCEPT", "'^'", "TOK_INTERSECTION", "'|'", "TOK_UNION", + "TOK_TwoDots", "TOK_ThreeDots", "'{'", "'}'", "'('", "')'", "';'", + "','", "':'", "'['", "']'", "'!'", "'.'", "'<'", "'@'", "$accept", + "ParsedGrammar", "ModuleList", "ModuleSpecification", + "optObjectIdentifier", "ObjectIdentifier", "ObjectIdentifierBody", + "ObjectIdentifierElement", "optModuleSpecificationFlags", + "ModuleSpecificationFlags", "ModuleSpecificationFlag", + "optModuleSpecificationBody", "ModuleSpecificationBody", + "ModuleSpecificationElement", "@1", "ImportsDefinition", + "ImportsBundleSet", "AssignedIdentifier", "ImportsBundle", + "ImportsList", "ImportsElement", "ExportsDefinition", "ExportsBody", + "ExportsElement", "ValueSet", "ValueSetTypeAssignment", "DefinedType", + "DataTypeReference", "ParameterArgumentList", "ParameterArgumentName", + "ActualParameterList", "ActualParameter", "optComponentTypeLists", + "ComponentTypeLists", "ComponentType", "AlternativeTypeLists", + "AlternativeType", "ObjectClass", "optUnique", "FieldSpec", + "ClassField", "optWithSyntax", "WithSyntax", "@2", "WithSyntaxList", + "WithSyntaxToken", "ExtensionAndException", "Type", "NSTD_IndirectMarker", "TypeDeclaration", "TypeDeclarationSet", "ComplexTypeReference", "ComplexTypeReferenceAmpList", "ComplexTypeReferenceElement", "PrimitiveFieldReference", "FieldName", @@ -786,9 +791,9 @@ static const char *const yytname[] = "SimpleTableConstraint", "ComponentRelationConstraint", "AtNotationList", "AtNotationElement", "ComponentIdList", "optMarker", "Marker", "UniverationDefinition", "UniverationList", - "UniverationElement", "SignedNumber", "optTag", "Tag", "TagTypeValue", - "TagClass", "TagPlicit", "TypeRefName", "ObjectClassReference", - "optIdentifier", "Identifier", 0 + "UniverationElement", "SignedNumber", "RealValue", "optTag", "Tag", + "TagTypeValue", "TagClass", "TagPlicit", "TypeRefName", + "ObjectClassReference", "optIdentifier", "Identifier", 0 }; #endif @@ -807,44 +812,45 @@ static const unsigned short yytoknum[] = 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 94, 356, 124, 357, 358, 359, 123, 125, 40, - 41, 59, 44, 58, 91, 93, 33, 46, 60, 64 + 355, 356, 94, 357, 124, 358, 359, 360, 123, 125, + 40, 41, 59, 44, 58, 91, 93, 33, 46, 60, + 64 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const unsigned char yyr1[] = { - 0, 120, 121, 122, 122, 123, 124, 124, 125, 125, - 126, 126, 127, 127, 127, 128, 128, 129, 129, 130, - 130, 130, 130, 130, 131, 131, 132, 132, 133, 133, - 133, 133, 133, 134, 133, 133, 135, 135, 136, 136, - 137, 137, 138, 139, 139, 140, 140, 140, 141, 141, - 141, 142, 142, 143, 143, 143, 144, 145, 146, 146, - 146, 147, 147, 147, 147, 148, 148, 149, 149, 149, - 149, 149, 150, 150, 151, 151, 151, 151, 152, 152, - 153, 153, 154, 154, 154, 154, 155, 155, 156, 156, - 156, 157, 158, 158, 159, 159, 160, 160, 160, 160, - 160, 160, 160, 161, 161, 163, 162, 164, 164, 165, - 165, 165, 165, 166, 166, 166, 167, 168, 169, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 171, 171, - 171, 171, 171, 171, 172, 172, 173, 174, 174, 175, - 175, 175, 176, 177, 178, 178, 178, 179, 178, 178, - 180, 180, 180, 180, 180, 180, 181, 181, 182, 182, - 182, 183, 183, 184, 184, 184, 184, 184, 184, 184, - 184, 184, 184, 184, 184, 184, 185, 185, 185, 186, - 186, 187, 187, 187, 187, 187, 187, 187, 187, 187, - 187, 187, 187, 187, 187, 188, 188, 189, 189, 190, - 191, 191, 192, 192, 193, 193, 194, 194, 194, 194, - 195, 195, 195, 195, 195, 196, 196, 196, 196, 196, - 196, 196, 196, 196, 196, 197, 196, 198, 198, 198, - 198, 199, 199, 200, 200, 200, 200, 200, 201, 202, - 202, 203, 203, 204, 204, 205, 205, 206, 206, 206, - 207, 207, 208, 209, 210, 210, 211, 211, 212, 212, - 213, 213, 214, 214, 215, 215, 216, 216, 217, 217, - 217, 217, 217, 218, 218, 219, 219, 220, 221, 222, - 222, 222, 222, 223, 223, 223, 224, 224, 225, 226, - 226, 227 + 0, 121, 122, 123, 123, 124, 125, 125, 126, 126, + 127, 127, 128, 128, 128, 129, 129, 130, 130, 131, + 131, 131, 131, 131, 132, 132, 133, 133, 134, 134, + 134, 134, 134, 135, 134, 134, 136, 136, 137, 137, + 138, 138, 139, 140, 140, 141, 141, 141, 142, 142, + 142, 143, 143, 144, 144, 144, 145, 146, 147, 147, + 147, 148, 148, 148, 148, 149, 149, 150, 150, 150, + 150, 150, 151, 151, 152, 152, 152, 152, 153, 153, + 154, 154, 155, 155, 155, 155, 156, 156, 157, 157, + 157, 158, 159, 159, 160, 160, 161, 161, 161, 161, + 161, 161, 161, 162, 162, 164, 163, 165, 165, 166, + 166, 166, 166, 167, 167, 167, 168, 169, 170, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 172, 172, + 172, 172, 172, 172, 173, 173, 174, 175, 175, 176, + 176, 176, 177, 178, 179, 179, 179, 180, 179, 179, + 181, 181, 181, 181, 181, 181, 182, 182, 183, 183, + 183, 184, 184, 185, 185, 185, 185, 185, 185, 185, + 185, 185, 185, 185, 185, 185, 186, 186, 186, 187, + 187, 188, 188, 188, 188, 188, 188, 188, 188, 188, + 188, 188, 188, 188, 188, 189, 189, 190, 190, 191, + 192, 192, 193, 193, 194, 194, 195, 195, 195, 195, + 196, 196, 196, 196, 196, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 198, 197, 199, 199, 199, + 199, 200, 200, 201, 201, 201, 201, 201, 202, 203, + 203, 204, 204, 205, 205, 206, 206, 207, 207, 207, + 208, 208, 209, 210, 211, 211, 212, 212, 213, 213, + 214, 214, 215, 215, 216, 216, 217, 217, 218, 218, + 218, 218, 218, 219, 219, 220, 220, 221, 221, 222, + 223, 224, 224, 224, 224, 225, 225, 225, 226, 226, + 227, 228, 228, 229 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -877,9 +883,9 @@ static const unsigned char yyr2[] = 5, 1, 3, 1, 3, 0, 1, 1, 1, 1, 1, 1, 3, 4, 1, 3, 2, 3, 1, 3, 0, 1, 1, 2, 2, 3, 1, 3, 1, 4, - 4, 1, 1, 1, 1, 0, 1, 2, 4, 0, - 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, - 1, 1 + 4, 1, 1, 1, 1, 1, 1, 0, 1, 2, + 4, 0, 1, 1, 1, 0, 1, 1, 1, 1, + 1, 0, 1, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -887,51 +893,51 @@ static const unsigned char yyr2[] = means the default is an error. */ static const unsigned short yydefact[] = { - 0, 286, 287, 0, 2, 3, 6, 1, 4, 0, - 0, 7, 291, 14, 9, 0, 10, 12, 15, 8, + 0, 288, 289, 0, 2, 3, 6, 1, 4, 0, + 0, 7, 293, 14, 9, 0, 10, 12, 15, 8, 11, 0, 0, 0, 0, 0, 0, 0, 16, 17, 0, 23, 21, 19, 22, 20, 0, 18, 13, 24, 181, 0, 0, 182, 183, 184, 0, 185, 186, 194, 187, 188, 189, 190, 191, 192, 193, 0, 25, 26, 28, 29, 32, 30, 31, 35, 0, 0, 33, 0, 50, 0, 51, 53, 55, 37, 0, 38, 0, 43, - 45, 47, 5, 27, 275, 128, 288, 0, 163, 0, + 45, 47, 5, 27, 277, 128, 290, 0, 163, 0, 0, 177, 170, 174, 176, 164, 0, 0, 165, 169, 173, 0, 0, 59, 179, 166, 58, 175, 132, 0, 34, 49, 48, 0, 0, 36, 39, 0, 0, 0, - 0, 279, 62, 61, 117, 276, 283, 0, 178, 172, - 171, 168, 167, 0, 65, 0, 166, 67, 0, 275, + 0, 281, 62, 61, 117, 278, 285, 0, 178, 172, + 171, 168, 167, 0, 65, 0, 166, 67, 0, 277, 0, 180, 0, 0, 52, 54, 40, 44, 46, 0, - 281, 282, 280, 0, 0, 200, 285, 284, 277, 129, + 283, 284, 282, 0, 0, 200, 287, 286, 279, 129, 131, 0, 0, 0, 0, 0, 57, 152, 158, 153, - 273, 159, 160, 274, 150, 151, 77, 0, 72, 74, + 273, 274, 159, 160, 150, 151, 77, 0, 72, 74, 75, 154, 155, 76, 272, 264, 0, 266, 271, 268, 137, 138, 133, 134, 136, 130, 149, 147, 143, 144, - 145, 0, 156, 41, 42, 275, 275, 0, 94, 0, + 145, 0, 156, 41, 42, 277, 277, 0, 94, 0, 125, 0, 0, 200, 200, 119, 118, 0, 0, 116, - 201, 202, 275, 66, 71, 70, 69, 68, 0, 0, - 233, 232, 0, 231, 234, 0, 206, 0, 0, 236, - 0, 207, 210, 0, 217, 218, 224, 223, 250, 251, - 235, 238, 237, 60, 275, 265, 0, 0, 0, 0, - 0, 0, 142, 139, 0, 262, 260, 260, 260, 96, - 261, 92, 260, 260, 103, 0, 278, 0, 275, 0, - 275, 0, 275, 0, 0, 0, 0, 64, 63, 0, - 0, 227, 0, 0, 0, 0, 0, 0, 56, 197, - 198, 195, 196, 0, 0, 0, 199, 0, 0, 0, - 0, 73, 267, 0, 0, 156, 135, 161, 148, 157, - 146, 263, 101, 0, 100, 102, 93, 260, 98, 99, - 0, 91, 104, 95, 0, 113, 0, 86, 89, 90, - 275, 127, 0, 0, 79, 80, 85, 260, 275, 289, - 0, 289, 0, 204, 0, 211, 225, 228, 229, 222, - 220, 239, 0, 252, 216, 208, 212, 213, 214, 0, - 221, 219, 0, 0, 254, 270, 269, 162, 140, 141, - 97, 0, 126, 0, 120, 275, 88, 275, 121, 275, - 83, 260, 275, 290, 122, 275, 203, 205, 0, 230, - 243, 0, 241, 200, 0, 215, 0, 256, 258, 253, - 0, 105, 114, 115, 87, 84, 81, 82, 117, 117, - 226, 240, 0, 245, 209, 257, 0, 255, 0, 123, - 124, 242, 248, 249, 247, 244, 246, 259, 109, 110, - 0, 0, 107, 111, 0, 106, 108, 112 + 201, 202, 277, 66, 71, 70, 69, 68, 276, 0, + 0, 233, 232, 0, 231, 234, 0, 206, 0, 0, + 236, 0, 207, 210, 0, 217, 218, 224, 223, 250, + 251, 275, 235, 238, 237, 60, 277, 265, 0, 0, + 0, 0, 0, 0, 142, 139, 0, 262, 260, 260, + 260, 96, 261, 92, 260, 260, 103, 0, 280, 0, + 277, 0, 277, 0, 277, 0, 0, 0, 0, 64, + 63, 0, 0, 227, 0, 0, 0, 0, 0, 0, + 56, 197, 198, 195, 196, 0, 0, 0, 199, 0, + 0, 0, 0, 73, 267, 0, 0, 156, 135, 161, + 148, 157, 146, 263, 101, 0, 100, 102, 93, 260, + 98, 99, 0, 91, 104, 95, 0, 113, 0, 86, + 89, 90, 277, 127, 0, 0, 79, 80, 85, 260, + 277, 291, 0, 291, 0, 204, 0, 211, 225, 228, + 229, 222, 220, 239, 0, 252, 216, 208, 212, 213, + 214, 0, 221, 219, 0, 0, 254, 270, 269, 162, + 140, 141, 97, 0, 126, 0, 120, 277, 88, 277, + 121, 277, 83, 260, 277, 292, 122, 277, 203, 205, + 0, 230, 243, 0, 241, 200, 0, 215, 0, 256, + 258, 253, 0, 105, 114, 115, 87, 84, 81, 82, + 117, 117, 226, 240, 0, 245, 209, 257, 0, 255, + 0, 123, 124, 242, 248, 249, 247, 244, 246, 259, + 109, 110, 0, 0, 107, 111, 0, 106, 108, 112 }; /* YYDEFGOTO[NTERM-NUM]. */ @@ -940,82 +946,82 @@ static const short yydefgoto[] = -1, 3, 4, 5, 10, 11, 15, 16, 27, 28, 29, 57, 58, 59, 110, 60, 76, 204, 77, 78, 79, 61, 71, 72, 176, 62, 102, 63, 133, 134, - 177, 178, 343, 344, 345, 336, 337, 122, 327, 207, - 208, 331, 332, 428, 441, 442, 346, 347, 154, 155, - 216, 103, 192, 193, 443, 267, 268, 64, 198, 259, - 199, 200, 239, 318, 104, 105, 106, 107, 304, 305, - 307, 219, 220, 221, 240, 241, 242, 398, 293, 243, - 244, 245, 246, 401, 402, 435, 436, 247, 248, 249, - 373, 374, 407, 269, 270, 141, 186, 187, 250, 124, - 125, 126, 153, 158, 251, 108, 392, 252 + 177, 178, 345, 346, 347, 338, 339, 122, 329, 207, + 208, 333, 334, 430, 443, 444, 348, 349, 154, 155, + 216, 103, 192, 193, 445, 269, 270, 64, 198, 261, + 199, 200, 240, 320, 104, 105, 106, 107, 306, 307, + 309, 219, 220, 221, 241, 242, 243, 400, 295, 244, + 245, 246, 247, 403, 404, 437, 438, 248, 249, 250, + 375, 376, 409, 271, 272, 141, 186, 187, 251, 252, + 124, 125, 126, 153, 158, 253, 108, 394, 254 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -403 +#define YYPACT_NINF -291 static const short yypact[] = { - 133, -403, -403, 18, 133, -403, -50, -403, -403, 50, - -14, -403, -403, -403, -403, 76, -403, -45, 165, -403, - -403, 62, 38, 69, 89, 81, 97, 184, 165, -403, - 116, -403, -403, -403, -403, -403, 172, -403, -403, 511, - -403, 216, 61, -403, -403, -403, 208, -403, -403, -403, - -403, -403, -403, -403, -403, -403, -403, 229, 511, -403, - -403, -403, -403, -403, -403, -403, 341, 664, -403, 132, - -403, 173, -403, 180, -403, -403, 32, -403, -25, -403, - 182, -403, -403, -403, -11, 174, -403, 222, -403, 232, - 248, -403, -403, -403, -403, -403, 271, 252, -403, -403, - -403, 740, 330, 234, -403, 236, -403, -403, 237, 336, - -403, -403, -403, 200, 241, -403, -403, 133, 200, 249, - 257, -1, -403, -403, -403, -403, 28, 200, -403, -403, - -403, -403, -403, 67, -403, 253, -403, 259, 263, 104, - 70, -403, 331, 192, -403, -403, -50, -403, -403, 289, - -403, -403, -403, 365, 588, -58, -403, -403, -403, -403, - -403, 376, 740, 200, 200, 225, -403, -403, -403, -403, - -403, -403, -403, -403, -403, -403, -403, 78, -403, -403, - -403, -403, -403, -403, -403, -403, 108, -403, -403, 273, - -403, -403, 266, -403, -403, -403, -403, -403, -403, -403, - -403, 267, 274, -403, -403, 154, 74, 141, -403, 275, - 347, 281, 324, 135, 179, -403, -403, 291, 225, -403, - -403, 292, -11, -403, -403, -403, -403, -403, 298, 377, - -403, -403, -24, -403, -403, 302, -403, 133, 225, -403, - 297, 226, 307, 305, -24, -403, -403, -403, 308, -403, - -403, -403, -403, -403, 104, -403, 87, 215, 335, 411, - 409, 192, -403, -403, 192, -403, 25, 91, 25, -403, - -403, 328, 91, 25, 325, 289, -403, 394, 60, 345, - 59, 353, 59, 354, 225, 317, 225, -403, -403, 453, - 322, 313, 327, 301, 332, 326, 334, 333, -403, -403, - -403, -403, -403, 338, 453, 453, -403, 453, 225, 309, - 315, -403, -403, 346, 348, -403, -403, -403, 435, -403, - -403, -403, -403, 361, -403, -403, -403, 25, -403, -403, - 359, -403, -403, -403, 409, 343, 186, -403, -403, -403, - 355, -403, 374, 349, 358, -403, -403, 25, 355, 409, - 363, 409, 362, -403, 364, -403, -403, -403, 360, -403, - -403, 292, 39, -403, -403, 367, -403, -403, -403, 366, - -403, -403, 23, 188, -403, -403, -403, -403, -403, -403, - -403, 370, -403, 215, -403, 60, -403, 355, -403, 54, - -403, 25, 355, -403, -403, 355, -403, -403, 411, -403, - -403, 189, -403, -58, 440, -403, 409, 356, -403, -403, - 315, -403, -403, -403, -403, -403, -403, -403, -403, -403, - 435, -403, 39, 177, 4, 356, 409, -403, 11, -403, - -403, -403, -403, -403, -403, -403, -403, -403, -403, -403, - 11, 36, -403, -403, 27, -403, -403, -403 + 159, -291, -291, 40, 159, -291, -39, -291, -291, 5, + 47, -291, -291, -291, -291, 17, -291, -22, 252, -291, + -291, 85, 84, 51, 59, 109, 87, 190, 252, -291, + 94, -291, -291, -291, -291, -291, 194, -291, -291, 475, + -291, 256, 76, -291, -291, -291, 180, -291, -291, -291, + -291, -291, -291, -291, -291, -291, -291, 230, 475, -291, + -291, -291, -291, -291, -291, -291, 332, 628, -291, 168, + -291, 132, -291, 174, -291, -291, 16, -291, -23, -291, + 182, -291, -291, -291, 1, 177, -291, 221, -291, 225, + 242, -291, -291, -291, -291, -291, 265, 237, -291, -291, + -291, 704, 340, 248, -291, 249, -291, -291, 240, 359, + -291, -291, -291, 155, 255, -291, -291, 159, 155, 257, + 259, 26, -291, -291, -291, -291, 8, 155, -291, -291, + -291, -291, -291, -6, -291, 254, -291, 258, 261, 193, + 71, -291, 323, 202, -291, -291, -39, -291, -291, 271, + -291, -291, -291, 360, 552, -50, -291, -291, -291, -291, + -291, 368, 704, 155, 155, 212, -291, -291, -291, -291, + -291, -291, -291, -291, -291, -291, -291, 78, -291, -291, + -291, -291, -291, -291, -291, -291, 133, -291, -291, 264, + -291, -291, 262, -291, -291, -291, -291, -291, -291, -291, + -291, 270, 269, -291, -291, 77, 27, 142, -291, 263, + 335, 281, 317, 156, 184, -291, -291, 282, 212, -291, + -291, 283, 1, -291, -291, -291, -291, -291, -291, 290, + 364, -291, -291, -49, -291, -291, 291, -291, 159, 212, + -291, 288, 211, 297, 296, -49, -291, -291, -291, 299, + -291, -291, -291, -291, -291, -291, 193, -291, 91, 321, + 311, 403, 400, 202, -291, -291, 202, -291, -27, 25, + -27, -291, -291, 319, 25, -27, 310, 271, -291, 386, + 37, 318, 70, 344, 70, 345, 212, 312, 212, -291, + -291, 450, 313, 305, 320, 226, 315, 324, 325, 322, + -291, -291, -291, -291, -291, 329, 450, 450, -291, 450, + 212, 460, 330, -291, -291, 326, 327, -291, -291, -291, + 430, -291, -291, -291, -291, 328, -291, -291, -291, -27, + -291, -291, 362, -291, -291, -291, 400, 334, 147, -291, + -291, -291, 337, -291, 380, 346, 343, -291, -291, -27, + 337, 400, 349, 400, 365, -291, 366, -291, -291, -291, + 356, -291, -291, 283, 10, -291, -291, 367, -291, -291, + -291, 370, -291, -291, -5, 152, -291, -291, -291, -291, + -291, -291, -291, 371, -291, 321, -291, 37, -291, 337, + -291, 4, -291, -27, 337, -291, -291, 337, -291, -291, + 403, -291, -291, 172, -291, -50, 432, -291, 400, 369, + -291, -291, 330, -291, -291, -291, -291, -291, -291, -291, + -291, -291, 430, -291, 10, 9, 247, 369, 400, -291, + 54, -291, -291, -291, -291, -291, -291, -291, -291, -291, + -291, -291, 54, 57, -291, -291, 34, -291, -291, -291 }; /* YYPGOTO[NTERM-NUM]. */ static const short yypgoto[] = { - -403, -403, -403, 476, -403, 337, -403, 466, -403, -403, - 454, -403, -403, 426, -403, -403, -403, -403, 410, -403, - 369, -403, -403, 372, 357, -403, -53, -403, -403, 329, - -403, 238, 211, -403, 105, -403, 111, 276, -403, -403, - 224, -403, -403, -403, 57, -402, -258, -83, -403, -57, - -403, 221, -403, 243, -137, 300, 303, -403, 0, -403, - -130, -250, -135, 106, -88, 1, -403, -3, -403, -403, - -403, -211, -403, 213, -5, 107, -12, -403, 264, -403, - -243, -403, -403, -403, 88, -403, -403, -403, -403, -403, - -403, 102, 109, -256, -403, -403, -403, 258, -105, -125, - -403, -403, -403, -403, 19, -403, 162, -9 + -291, -291, -291, 474, -291, 339, -291, 473, -291, -291, + 461, -291, -291, 434, -291, -291, -291, -291, 417, -291, + 376, -291, -291, 382, 358, -291, -46, -291, -291, 342, + -291, 241, 215, -291, 111, -291, 118, 284, -291, -291, + 231, -291, -291, -291, 65, -290, -275, -83, -291, -67, + -291, 228, -291, 251, -133, 306, 307, -291, 33, -291, + -132, -249, -131, 114, -33, -17, -291, -3, -291, -291, + -291, -211, -291, 219, -129, 113, -77, -291, 275, -291, + -247, -291, -291, -291, 97, -291, -291, -291, -291, -291, + -291, 112, 119, -252, -291, -291, -291, 268, -98, -291, + -92, -291, -291, -291, -291, 20, -291, 178, -9 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If @@ -1025,229 +1031,223 @@ static const short yypgoto[] = #define YYTABLE_NINF -261 static const short yytable[] = { - 17, 123, 281, 283, 181, 194, 17, 313, 181, 180, - 322, 324, 325, 135, 109, 438, 328, 329, 7, 6, - 338, 120, 150, 6, 18, 117, 217, 190, 191, 439, - 67, 438, 12, 74, 182, 188, 65, 81, 182, 446, - 438, 12, 446, 190, 191, 439, 1, 2, 12, 67, - 360, 218, 190, 191, 439, 65, 179, 9, 66, 12, - 13, 73, 264, 12, 21, 80, 371, 81, 12, 12, - 12, 380, 30, 156, 135, 1, 2, 66, 151, 12, - 170, 291, 69, 173, 157, 12, 13, 118, 342, 262, - 263, 390, 152, 342, 292, 80, 12, 170, 265, 31, - 173, 215, 136, 121, 74, 299, 300, 301, 302, 81, - 167, 168, 169, 12, 170, 171, 172, 173, 160, 181, - 137, 194, 266, 271, 180, 440, 181, 338, 264, 181, - 183, 189, 73, 412, 202, 417, 146, 80, 34, 288, - 406, 440, 447, 115, 445, 400, 159, 1, 2, 182, - 440, 188, 314, 174, 225, 227, 182, 32, 14, 182, - 335, 195, 201, 136, 265, 335, 335, -78, 121, 262, - 263, 179, 70, 121, 121, 161, 184, 33, 185, 162, - 22, 137, 224, 226, 19, 35, 253, 36, 121, 23, - 254, 264, 423, 184, 175, 339, 432, 39, 167, 168, - 169, 12, 170, 171, 172, 173, 1, 2, 323, 12, - 24, 165, 25, 285, 1, 2, 255, 12, 121, 217, - 256, 26, 1, 2, 12, 170, 38, 265, 173, 1, - 2, 68, 168, 297, 12, 170, 171, 172, 173, 1, - 2, 174, 280, 111, 218, 183, 228, 189, 315, 274, - 433, 319, 202, 275, 434, 202, 296, 386, 75, 196, - 229, 320, -260, 217, 321, 391, -260, 418, 121, 340, - 419, 348, 82, 348, 230, 231, 201, 355, 413, 352, - 201, 354, 175, 201, 112, 113, 282, 114, 218, 119, - 232, 127, 366, 367, 384, 368, 409, 421, 385, 197, - 410, 422, 339, 369, 415, 205, 206, 128, 168, 233, - 12, 170, 171, 172, 173, 234, 168, 129, 12, 170, - 171, 172, 173, 130, 235, 382, 131, 299, 300, 301, - 302, 236, 237, 138, 238, 294, 295, 132, 303, 143, - 393, 139, 393, 140, 84, 1, 2, 190, 191, 145, - 230, 190, 191, 403, 142, 85, 86, 148, 230, 85, - 86, 429, 430, 408, 149, 359, 163, 87, 40, 88, - 165, 89, 164, 370, 315, 209, 340, 378, 379, 222, - 348, 90, 257, 258, 260, 91, 277, 261, 278, 92, - 276, 234, 93, 43, 44, 45, 279, 408, 289, 234, - 284, 286, 201, 94, 47, 298, 290, 306, 95, 48, - 96, 49, 97, 403, 308, 310, 317, 437, 12, 50, - 326, 98, 99, 334, 330, 349, 351, 353, 51, 356, - 52, 357, 358, 362, 372, 53, 100, 54, 55, 56, - 377, 218, 363, 364, 365, 381, 387, 168, 101, 12, - 170, 171, 172, 173, 1, 2, 375, 388, 376, 383, - 168, 228, 12, 170, 171, 172, 173, 1, 2, 121, - 389, 394, 396, 426, 397, 229, 405, 411, 399, 404, - 8, 20, 37, 203, 83, 144, 116, 147, 229, 230, - 231, 223, 311, 350, 416, 166, 414, 444, 287, 333, - 341, 316, 230, 231, 420, 232, 272, 361, 309, 273, - 431, 424, 427, 395, 312, 425, 0, 0, 232, 0, - 12, 0, 0, 0, 233, 1, 2, 0, 0, 0, - 234, 0, 0, 0, 0, 0, 0, 233, 40, 235, - 0, 0, 0, 234, 0, 0, 0, 237, 0, 238, - 0, 0, 235, 41, 0, 0, 0, 42, 0, 0, - 237, 0, 238, 43, 44, 45, 0, 0, 0, 46, - 0, 0, 0, 0, 47, 0, 0, 0, 0, 48, - 0, 49, 0, 0, 0, 0, 0, 0, 0, 50, - 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, - 52, 0, 85, 86, 0, 53, 0, 54, 55, 56, - 210, 0, 0, 0, 87, 40, 88, 0, 89, 211, - 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, - 0, 0, 91, 0, 0, 0, 92, 0, 0, 93, - 43, 44, 45, 0, 0, 0, 0, 0, 212, 0, - 94, 47, 0, 0, 0, 95, 48, 96, 49, 97, - 0, 0, 0, 0, 0, 0, 50, 0, 98, 99, - 213, 214, 0, 0, 0, 51, 0, 52, 85, 86, - 0, 0, 53, 100, 54, 55, 56, 0, 0, 0, - 87, 40, 88, 0, 89, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, - 0, 0, 92, 0, 0, 93, 43, 44, 45, 0, - 0, 0, 0, 0, 0, 0, 94, 47, 0, 0, - 0, 95, 48, 96, 49, 97, 0, 0, 0, 0, - 0, 0, 50, 0, 98, 99, 0, 0, 0, 0, - 0, 51, 0, 52, 1, 2, 0, 0, 53, 100, - 54, 55, 56, 0, 0, 0, 87, 40, 88, 0, - 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 90, 0, 0, 0, 91, 0, 0, 0, 92, 0, - 0, 93, 43, 44, 45, 0, 0, 0, 0, 0, - 0, 0, 94, 47, 0, 0, 0, 95, 48, 96, - 49, 97, 0, 0, 0, 0, 0, 0, 50, 0, - 98, 99, 0, 0, 0, 0, 0, 51, 0, 52, - 0, 0, 0, 0, 53, 100, 54, 55, 56 + 17, 123, 283, 285, 12, 340, 17, 180, 181, 194, + 315, 266, 181, 12, 12, 13, 324, 326, 327, 12, + 6, 109, 330, 331, 6, 12, 12, 13, 117, 434, + 67, 1, 2, 74, 120, 217, 65, 81, 440, 344, + 7, 182, 188, 264, 265, 182, 12, 267, 362, 67, + 150, 190, 191, 441, 156, 65, 179, 293, 440, 66, + 218, 440, 73, 266, 373, 157, 80, 81, 135, 9, + 294, 190, 191, 441, 190, 191, 441, 382, 66, 12, + 12, 170, 171, 435, 136, 12, 18, 436, 21, 287, + 118, 1, 2, 264, 265, 30, 80, 392, 69, 267, + 12, 170, 171, 161, 74, 344, 151, 162, 215, 81, + 299, 337, 340, 408, 14, 266, 121, 402, 160, 121, + 152, 137, 268, 273, 180, 181, 19, 194, 115, 135, + 183, 189, 181, 73, 202, 181, 414, 146, 80, 290, + 32, 419, 121, 325, 337, 136, 31, 159, 33, 442, + 449, 267, 121, 448, 225, 227, 448, 354, 182, 356, + 188, 316, 195, 201, 12, 182, 447, 34, 182, 442, + 1, 2, 442, 179, 1, 2, 35, 337, 184, -78, + 185, 371, 137, 224, 226, 121, -260, 255, 70, 12, + -260, 256, 121, 36, 425, 1, 2, 341, 184, 167, + 168, 169, 12, 170, 171, 38, 172, 173, 167, 168, + 169, 12, 170, 171, 357, 172, 173, 1, 2, 168, + 39, 12, 170, 171, 228, 172, 173, 1, 2, 368, + 369, 75, 370, 168, 229, 12, 170, 171, 228, 172, + 173, 217, 257, 174, 112, 113, 258, 183, 230, 189, + 317, 276, 174, 321, 202, 277, 386, 202, 298, 388, + 387, 411, 231, 232, 282, 412, 218, 393, 22, 217, + 196, 342, 68, 350, 82, 350, 231, 23, 233, 201, + 111, 423, 114, 201, 175, 424, 201, 415, 205, 206, + 119, 361, 284, 175, 218, 127, 322, 234, 24, 323, + 25, 165, 420, 235, 341, 421, 417, 128, 121, 26, + 197, 129, 236, 301, 302, 303, 304, 235, 130, 237, + 238, 131, 239, 132, 305, 296, 297, 384, 190, 191, + 12, 170, 171, 85, 86, 84, 1, 2, 1, 2, + 190, 191, 395, 138, 395, 380, 381, 85, 86, 301, + 302, 303, 304, 431, 432, 405, 139, 140, 142, 87, + 40, 88, 143, 89, 145, 410, 148, 149, 163, 165, + 209, 222, 164, 90, 259, 279, 317, 91, 342, 278, + 260, 92, 350, 263, 93, 43, 44, 45, 262, 280, + 281, 291, 286, 288, 292, 94, 47, 300, 308, 410, + 95, 48, 96, 49, 97, 201, 310, 312, 319, 12, + 332, 50, 328, 98, 99, 405, 336, 351, 353, 439, + 51, 358, 52, 355, 359, 218, 360, 53, 100, 54, + 55, 56, 364, 366, 365, 379, 367, 377, 378, 168, + 101, 12, 170, 171, 228, 172, 173, 1, 2, 383, + 374, 385, 121, 389, 229, 390, 391, 168, 396, 12, + 170, 171, 228, 172, 173, 1, 2, 168, 230, 12, + 170, 171, 228, 172, 173, 401, 398, 399, 8, 413, + 406, 407, 231, 232, 12, 203, 230, 428, 20, 37, + 1, 2, 83, 116, 147, 144, 166, 313, 233, 352, + 231, 232, 418, 40, 223, 416, 289, 446, 335, 343, + 231, 318, 274, 275, 422, 363, 233, 234, 41, 426, + 311, 433, 42, 235, 429, 372, 314, 427, 43, 44, + 45, 397, 236, 0, 46, 234, 0, 0, 0, 47, + 238, 235, 239, 0, 48, 0, 49, 0, 0, 0, + 236, 235, 0, 0, 50, 0, 0, 0, 238, 0, + 239, 0, 0, 51, 0, 52, 0, 85, 86, 0, + 53, 0, 54, 55, 56, 210, 0, 0, 0, 87, + 40, 88, 0, 89, 211, 0, 0, 0, 0, 0, + 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, + 0, 92, 0, 0, 93, 43, 44, 45, 0, 0, + 0, 0, 0, 212, 0, 94, 47, 0, 0, 0, + 95, 48, 96, 49, 97, 0, 0, 0, 0, 0, + 0, 50, 0, 98, 99, 213, 214, 0, 0, 0, + 51, 0, 52, 85, 86, 0, 0, 53, 100, 54, + 55, 56, 0, 0, 0, 87, 40, 88, 0, 89, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, + 0, 0, 0, 91, 0, 0, 0, 92, 0, 0, + 93, 43, 44, 45, 0, 0, 0, 0, 0, 0, + 0, 94, 47, 0, 0, 0, 95, 48, 96, 49, + 97, 0, 0, 0, 0, 0, 0, 50, 0, 98, + 99, 0, 0, 0, 0, 0, 51, 0, 52, 1, + 2, 0, 0, 53, 100, 54, 55, 56, 0, 0, + 0, 87, 40, 88, 0, 89, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, + 0, 0, 0, 92, 0, 0, 93, 43, 44, 45, + 0, 0, 0, 0, 0, 0, 0, 94, 47, 0, + 0, 0, 95, 48, 96, 49, 97, 0, 0, 0, + 0, 0, 0, 50, 0, 98, 99, 0, 0, 0, + 0, 0, 51, 0, 52, 0, 0, 0, 0, 53, + 100, 54, 55, 56 }; static const short yycheck[] = { - 9, 84, 213, 214, 139, 142, 15, 257, 143, 139, - 266, 267, 268, 101, 67, 4, 272, 273, 0, 0, - 278, 32, 23, 4, 38, 50, 84, 16, 17, 18, - 39, 4, 9, 42, 139, 140, 39, 46, 143, 441, - 4, 9, 444, 16, 17, 18, 14, 15, 9, 58, - 293, 109, 16, 17, 18, 58, 139, 107, 39, 9, - 10, 42, 37, 9, 109, 46, 309, 76, 9, 9, - 9, 327, 10, 45, 162, 14, 15, 58, 79, 9, - 10, 105, 21, 13, 56, 9, 10, 112, 34, 15, - 16, 347, 93, 34, 118, 76, 9, 10, 73, 61, - 13, 154, 101, 114, 113, 101, 102, 103, 104, 118, - 6, 7, 8, 9, 10, 11, 12, 13, 127, 254, - 101, 258, 205, 206, 254, 114, 261, 385, 37, 264, - 139, 140, 113, 383, 143, 391, 117, 118, 57, 222, - 117, 114, 115, 111, 108, 106, 127, 14, 15, 254, - 114, 256, 257, 49, 163, 164, 261, 88, 108, 264, - 106, 142, 143, 162, 73, 106, 106, 108, 114, 15, - 16, 254, 111, 114, 114, 108, 106, 88, 108, 112, - 15, 162, 163, 164, 108, 88, 108, 3, 114, 24, - 112, 37, 403, 106, 90, 278, 19, 25, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 117, 9, - 45, 107, 47, 218, 14, 15, 108, 9, 114, 84, - 112, 56, 14, 15, 9, 10, 110, 73, 13, 14, - 15, 15, 7, 238, 9, 10, 11, 12, 13, 14, - 15, 49, 107, 111, 109, 254, 21, 256, 257, 108, - 73, 260, 261, 112, 77, 264, 237, 340, 50, 67, - 35, 261, 108, 84, 264, 348, 112, 392, 114, 278, - 395, 280, 43, 282, 49, 50, 257, 289, 383, 284, - 261, 286, 90, 264, 111, 112, 107, 107, 109, 107, - 65, 117, 304, 305, 108, 307, 108, 108, 112, 107, - 112, 112, 385, 308, 387, 16, 17, 85, 7, 84, - 9, 10, 11, 12, 13, 90, 7, 85, 9, 10, - 11, 12, 13, 75, 99, 334, 55, 101, 102, 103, - 104, 106, 107, 3, 109, 33, 34, 85, 112, 3, - 349, 107, 351, 107, 3, 14, 15, 16, 17, 108, - 49, 16, 17, 362, 117, 14, 15, 108, 49, 14, - 15, 418, 419, 372, 107, 64, 113, 26, 27, 28, - 107, 30, 113, 64, 383, 10, 385, 16, 17, 3, - 389, 40, 109, 117, 117, 44, 39, 113, 107, 48, - 115, 90, 51, 52, 53, 54, 72, 406, 100, 90, - 109, 109, 383, 62, 63, 108, 29, 100, 67, 68, - 69, 70, 71, 422, 109, 107, 5, 426, 9, 78, - 92, 80, 81, 29, 99, 72, 72, 110, 87, 107, - 89, 118, 105, 107, 119, 94, 95, 96, 97, 98, - 5, 109, 108, 110, 106, 86, 72, 7, 107, 9, - 10, 11, 12, 13, 14, 15, 110, 108, 110, 116, - 7, 21, 9, 10, 11, 12, 13, 14, 15, 114, - 112, 108, 110, 117, 110, 35, 110, 107, 118, 112, - 4, 15, 28, 146, 58, 113, 76, 118, 35, 49, - 50, 162, 254, 282, 389, 138, 385, 440, 222, 275, - 279, 258, 49, 50, 398, 65, 206, 294, 244, 206, - 422, 404, 410, 351, 256, 406, -1, -1, 65, -1, - 9, -1, -1, -1, 84, 14, 15, -1, -1, -1, - 90, -1, -1, -1, -1, -1, -1, 84, 27, 99, - -1, -1, -1, 90, -1, -1, -1, 107, -1, 109, - -1, -1, 99, 42, -1, -1, -1, 46, -1, -1, - 107, -1, 109, 52, 53, 54, -1, -1, -1, 58, - -1, -1, -1, -1, 63, -1, -1, -1, -1, 68, - -1, 70, -1, -1, -1, -1, -1, -1, -1, 78, - -1, -1, -1, -1, -1, -1, -1, -1, 87, -1, - 89, -1, 14, 15, -1, 94, -1, 96, 97, 98, - 22, -1, -1, -1, 26, 27, 28, -1, 30, 31, - -1, -1, -1, -1, -1, -1, -1, -1, 40, -1, - -1, -1, 44, -1, -1, -1, 48, -1, -1, 51, - 52, 53, 54, -1, -1, -1, -1, -1, 60, -1, - 62, 63, -1, -1, -1, 67, 68, 69, 70, 71, - -1, -1, -1, -1, -1, -1, 78, -1, 80, 81, - 82, 83, -1, -1, -1, 87, -1, 89, 14, 15, - -1, -1, 94, 95, 96, 97, 98, -1, -1, -1, - 26, 27, 28, -1, 30, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 40, -1, -1, -1, 44, -1, - -1, -1, 48, -1, -1, 51, 52, 53, 54, -1, - -1, -1, -1, -1, -1, -1, 62, 63, -1, -1, - -1, 67, 68, 69, 70, 71, -1, -1, -1, -1, - -1, -1, 78, -1, 80, 81, -1, -1, -1, -1, - -1, 87, -1, 89, 14, 15, -1, -1, 94, 95, - 96, 97, 98, -1, -1, -1, 26, 27, 28, -1, - 30, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 40, -1, -1, -1, 44, -1, -1, -1, 48, -1, - -1, 51, 52, 53, 54, -1, -1, -1, -1, -1, - -1, -1, 62, 63, -1, -1, -1, 67, 68, 69, - 70, 71, -1, -1, -1, -1, -1, -1, 78, -1, - 80, 81, -1, -1, -1, -1, -1, 87, -1, 89, - -1, -1, -1, -1, 94, 95, 96, 97, 98 + 9, 84, 213, 214, 9, 280, 15, 139, 139, 142, + 259, 38, 143, 9, 9, 10, 268, 269, 270, 9, + 0, 67, 274, 275, 4, 9, 9, 10, 51, 20, + 39, 15, 16, 42, 33, 85, 39, 46, 4, 35, + 0, 139, 140, 16, 17, 143, 9, 74, 295, 58, + 24, 17, 18, 19, 46, 58, 139, 106, 4, 39, + 110, 4, 42, 38, 311, 57, 46, 76, 101, 108, + 119, 17, 18, 19, 17, 18, 19, 329, 58, 9, + 9, 10, 11, 74, 101, 9, 39, 78, 110, 218, + 113, 15, 16, 16, 17, 10, 76, 349, 22, 74, + 9, 10, 11, 109, 113, 35, 80, 113, 154, 118, + 239, 107, 387, 118, 109, 38, 115, 107, 127, 115, + 94, 101, 205, 206, 256, 256, 109, 260, 112, 162, + 139, 140, 263, 113, 143, 266, 385, 117, 118, 222, + 89, 393, 115, 118, 107, 162, 62, 127, 89, 115, + 116, 74, 115, 443, 163, 164, 446, 286, 256, 288, + 258, 259, 142, 143, 9, 263, 109, 58, 266, 115, + 15, 16, 115, 256, 15, 16, 89, 107, 107, 109, + 109, 310, 162, 163, 164, 115, 109, 109, 112, 9, + 113, 113, 115, 3, 405, 15, 16, 280, 107, 6, + 7, 8, 9, 10, 11, 111, 13, 14, 6, 7, + 8, 9, 10, 11, 291, 13, 14, 15, 16, 7, + 26, 9, 10, 11, 12, 13, 14, 15, 16, 306, + 307, 51, 309, 7, 22, 9, 10, 11, 12, 13, + 14, 85, 109, 50, 112, 113, 113, 256, 36, 258, + 259, 109, 50, 262, 263, 113, 109, 266, 238, 342, + 113, 109, 50, 51, 108, 113, 110, 350, 16, 85, + 68, 280, 16, 282, 44, 284, 50, 25, 66, 259, + 112, 109, 108, 263, 91, 113, 266, 385, 17, 18, + 108, 65, 108, 91, 110, 118, 263, 85, 46, 266, + 48, 108, 394, 91, 387, 397, 389, 86, 115, 57, + 108, 86, 100, 102, 103, 104, 105, 91, 76, 107, + 108, 56, 110, 86, 113, 34, 35, 336, 17, 18, + 9, 10, 11, 15, 16, 3, 15, 16, 15, 16, + 17, 18, 351, 3, 353, 17, 18, 15, 16, 102, + 103, 104, 105, 420, 421, 364, 108, 108, 118, 27, + 28, 29, 3, 31, 109, 374, 109, 108, 114, 108, + 10, 3, 114, 41, 110, 40, 385, 45, 387, 116, + 118, 49, 391, 114, 52, 53, 54, 55, 118, 108, + 73, 101, 110, 110, 30, 63, 64, 109, 101, 408, + 68, 69, 70, 71, 72, 385, 110, 108, 5, 9, + 100, 79, 93, 81, 82, 424, 30, 73, 73, 428, + 88, 108, 90, 111, 119, 110, 106, 95, 96, 97, + 98, 99, 108, 111, 109, 5, 107, 111, 111, 7, + 108, 9, 10, 11, 12, 13, 14, 15, 16, 87, + 120, 117, 115, 73, 22, 109, 113, 7, 109, 9, + 10, 11, 12, 13, 14, 15, 16, 7, 36, 9, + 10, 11, 12, 13, 14, 119, 111, 111, 4, 108, + 113, 111, 50, 51, 9, 146, 36, 118, 15, 28, + 15, 16, 58, 76, 118, 113, 138, 256, 66, 284, + 50, 51, 391, 28, 162, 387, 222, 442, 277, 281, + 50, 260, 206, 206, 400, 296, 66, 85, 43, 406, + 245, 424, 47, 91, 412, 65, 258, 408, 53, 54, + 55, 353, 100, -1, 59, 85, -1, -1, -1, 64, + 108, 91, 110, -1, 69, -1, 71, -1, -1, -1, + 100, 91, -1, -1, 79, -1, -1, -1, 108, -1, + 110, -1, -1, 88, -1, 90, -1, 15, 16, -1, + 95, -1, 97, 98, 99, 23, -1, -1, -1, 27, + 28, 29, -1, 31, 32, -1, -1, -1, -1, -1, + -1, -1, -1, 41, -1, -1, -1, 45, -1, -1, + -1, 49, -1, -1, 52, 53, 54, 55, -1, -1, + -1, -1, -1, 61, -1, 63, 64, -1, -1, -1, + 68, 69, 70, 71, 72, -1, -1, -1, -1, -1, + -1, 79, -1, 81, 82, 83, 84, -1, -1, -1, + 88, -1, 90, 15, 16, -1, -1, 95, 96, 97, + 98, 99, -1, -1, -1, 27, 28, 29, -1, 31, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 41, + -1, -1, -1, 45, -1, -1, -1, 49, -1, -1, + 52, 53, 54, 55, -1, -1, -1, -1, -1, -1, + -1, 63, 64, -1, -1, -1, 68, 69, 70, 71, + 72, -1, -1, -1, -1, -1, -1, 79, -1, 81, + 82, -1, -1, -1, -1, -1, 88, -1, 90, 15, + 16, -1, -1, 95, 96, 97, 98, 99, -1, -1, + -1, 27, 28, 29, -1, 31, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 41, -1, -1, -1, 45, + -1, -1, -1, 49, -1, -1, 52, 53, 54, 55, + -1, -1, -1, -1, -1, -1, -1, 63, 64, -1, + -1, -1, 68, 69, 70, 71, 72, -1, -1, -1, + -1, -1, -1, 79, -1, 81, 82, -1, -1, -1, + -1, -1, 88, -1, 90, -1, -1, -1, -1, 95, + 96, 97, 98, 99 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const unsigned char yystos[] = { - 0, 14, 15, 121, 122, 123, 224, 0, 123, 107, - 124, 125, 9, 10, 108, 126, 127, 227, 38, 108, - 127, 109, 15, 24, 45, 47, 56, 128, 129, 130, - 10, 61, 88, 88, 57, 88, 3, 130, 110, 25, - 27, 42, 46, 52, 53, 54, 58, 63, 68, 70, - 78, 87, 89, 94, 96, 97, 98, 131, 132, 133, - 135, 141, 145, 147, 177, 187, 224, 227, 15, 21, - 111, 142, 143, 224, 227, 50, 136, 138, 139, 140, - 224, 227, 43, 133, 3, 14, 15, 26, 28, 30, - 40, 44, 48, 51, 62, 67, 69, 71, 80, 81, - 95, 107, 146, 171, 184, 185, 186, 187, 225, 146, - 134, 111, 111, 112, 107, 111, 138, 50, 112, 107, - 32, 114, 157, 167, 219, 220, 221, 117, 85, 85, - 75, 55, 85, 148, 149, 184, 185, 224, 3, 107, - 107, 215, 117, 3, 143, 108, 224, 140, 108, 107, - 23, 79, 93, 222, 168, 169, 45, 56, 223, 224, - 227, 108, 112, 113, 113, 107, 144, 6, 7, 8, - 10, 11, 12, 13, 49, 90, 144, 150, 151, 167, - 180, 182, 218, 227, 106, 108, 216, 217, 218, 227, - 16, 17, 172, 173, 174, 224, 67, 107, 178, 180, - 181, 224, 227, 125, 137, 16, 17, 159, 160, 10, - 22, 31, 60, 82, 83, 146, 170, 84, 109, 191, - 192, 193, 3, 149, 224, 227, 224, 227, 21, 35, - 49, 50, 65, 84, 90, 99, 106, 107, 109, 182, - 194, 195, 196, 199, 200, 201, 202, 207, 208, 209, - 218, 224, 227, 108, 112, 108, 112, 109, 117, 179, - 117, 113, 15, 16, 37, 73, 167, 175, 176, 213, - 214, 167, 175, 176, 108, 112, 115, 39, 107, 72, - 107, 191, 107, 191, 109, 194, 109, 157, 167, 100, - 29, 105, 118, 198, 33, 34, 224, 194, 108, 101, - 102, 103, 104, 112, 188, 189, 100, 190, 109, 198, - 107, 151, 217, 181, 218, 227, 173, 5, 183, 227, - 178, 178, 213, 117, 213, 213, 92, 158, 213, 213, - 99, 161, 162, 160, 29, 106, 155, 156, 166, 167, - 227, 171, 34, 152, 153, 154, 166, 167, 227, 72, - 152, 72, 194, 110, 194, 196, 107, 118, 105, 64, - 200, 193, 107, 108, 110, 106, 196, 196, 196, 194, - 64, 200, 119, 210, 211, 110, 110, 5, 16, 17, - 213, 86, 227, 116, 108, 112, 167, 72, 108, 112, - 213, 167, 226, 227, 108, 226, 110, 110, 197, 118, - 106, 203, 204, 227, 112, 110, 117, 212, 227, 108, - 112, 107, 181, 218, 156, 167, 154, 213, 219, 219, - 183, 108, 112, 191, 195, 212, 117, 211, 163, 169, - 169, 204, 19, 73, 77, 205, 206, 227, 4, 18, - 114, 164, 165, 174, 164, 108, 165, 115 + 0, 15, 16, 122, 123, 124, 226, 0, 124, 108, + 125, 126, 9, 10, 109, 127, 128, 229, 39, 109, + 128, 110, 16, 25, 46, 48, 57, 129, 130, 131, + 10, 62, 89, 89, 58, 89, 3, 131, 111, 26, + 28, 43, 47, 53, 54, 55, 59, 64, 69, 71, + 79, 88, 90, 95, 97, 98, 99, 132, 133, 134, + 136, 142, 146, 148, 178, 188, 226, 229, 16, 22, + 112, 143, 144, 226, 229, 51, 137, 139, 140, 141, + 226, 229, 44, 134, 3, 15, 16, 27, 29, 31, + 41, 45, 49, 52, 63, 68, 70, 72, 81, 82, + 96, 108, 147, 172, 185, 186, 187, 188, 227, 147, + 135, 112, 112, 113, 108, 112, 139, 51, 113, 108, + 33, 115, 158, 168, 221, 222, 223, 118, 86, 86, + 76, 56, 86, 149, 150, 185, 186, 226, 3, 108, + 108, 216, 118, 3, 144, 109, 226, 141, 109, 108, + 24, 80, 94, 224, 169, 170, 46, 57, 225, 226, + 229, 109, 113, 114, 114, 108, 145, 6, 7, 8, + 10, 11, 13, 14, 50, 91, 145, 151, 152, 168, + 181, 183, 219, 229, 107, 109, 217, 218, 219, 229, + 17, 18, 173, 174, 175, 226, 68, 108, 179, 181, + 182, 226, 229, 126, 138, 17, 18, 160, 161, 10, + 23, 32, 61, 83, 84, 147, 171, 85, 110, 192, + 193, 194, 3, 150, 226, 229, 226, 229, 12, 22, + 36, 50, 51, 66, 85, 91, 100, 107, 108, 110, + 183, 195, 196, 197, 200, 201, 202, 203, 208, 209, + 210, 219, 220, 226, 229, 109, 113, 109, 113, 110, + 118, 180, 118, 114, 16, 17, 38, 74, 168, 176, + 177, 214, 215, 168, 176, 177, 109, 113, 116, 40, + 108, 73, 108, 192, 108, 192, 110, 195, 110, 158, + 168, 101, 30, 106, 119, 199, 34, 35, 226, 195, + 109, 102, 103, 104, 105, 113, 189, 190, 101, 191, + 110, 199, 108, 152, 218, 182, 219, 229, 174, 5, + 184, 229, 179, 179, 214, 118, 214, 214, 93, 159, + 214, 214, 100, 162, 163, 161, 30, 107, 156, 157, + 167, 168, 229, 172, 35, 153, 154, 155, 167, 168, + 229, 73, 153, 73, 195, 111, 195, 197, 108, 119, + 106, 65, 201, 194, 108, 109, 111, 107, 197, 197, + 197, 195, 65, 201, 120, 211, 212, 111, 111, 5, + 17, 18, 214, 87, 229, 117, 109, 113, 168, 73, + 109, 113, 214, 168, 228, 229, 109, 228, 111, 111, + 198, 119, 107, 204, 205, 229, 113, 111, 118, 213, + 229, 109, 113, 108, 182, 219, 157, 168, 155, 214, + 221, 221, 184, 109, 113, 192, 196, 213, 118, 212, + 164, 170, 170, 205, 20, 74, 78, 206, 207, 229, + 4, 19, 115, 165, 166, 175, 165, 109, 166, 116 }; #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) @@ -1798,14 +1798,14 @@ yyparse (YYPARSE_PARAM_ARG) switch (yyn) { case 2: -#line 324 "asn1p_y.y" +#line 327 "asn1p_y.y" { *(void **)param = yyvsp[0].a_grammar; } break; case 3: -#line 330 "asn1p_y.y" +#line 333 "asn1p_y.y" { yyval.a_grammar = asn1p_new(); checkmem(yyval.a_grammar); @@ -1814,7 +1814,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 4: -#line 335 "asn1p_y.y" +#line 338 "asn1p_y.y" { yyval.a_grammar = yyvsp[-1].a_grammar; TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); @@ -1822,7 +1822,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 5: -#line 356 "asn1p_y.y" +#line 359 "asn1p_y.y" { if(yyvsp[-1].a_module) { @@ -1840,31 +1840,31 @@ yyparse (YYPARSE_PARAM_ARG) break; case 6: -#line 377 "asn1p_y.y" +#line 380 "asn1p_y.y" { yyval.a_oid = 0; } break; case 7: -#line 378 "asn1p_y.y" +#line 381 "asn1p_y.y" { yyval.a_oid = yyvsp[0].a_oid; } break; case 8: -#line 382 "asn1p_y.y" +#line 385 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; } break; case 9: -#line 385 "asn1p_y.y" +#line 388 "asn1p_y.y" { yyval.a_oid = 0; } break; case 10: -#line 391 "asn1p_y.y" +#line 394 "asn1p_y.y" { yyval.a_oid = asn1p_oid_new(); asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1874,7 +1874,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 11: -#line 397 "asn1p_y.y" +#line 400 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1884,7 +1884,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 12: -#line 406 "asn1p_y.y" +#line 409 "asn1p_y.y" { /* iso */ yyval.a_oid_arc.name = yyvsp[0].tv_str; yyval.a_oid_arc.number = -1; @@ -1892,7 +1892,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 13: -#line 410 "asn1p_y.y" +#line 413 "asn1p_y.y" { /* iso(1) */ yyval.a_oid_arc.name = yyvsp[-3].tv_str; yyval.a_oid_arc.number = yyvsp[-1].a_int; @@ -1900,7 +1900,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 14: -#line 414 "asn1p_y.y" +#line 417 "asn1p_y.y" { /* 1 */ yyval.a_oid_arc.name = 0; yyval.a_oid_arc.number = yyvsp[0].a_int; @@ -1908,61 +1908,61 @@ yyparse (YYPARSE_PARAM_ARG) break; case 15: -#line 424 "asn1p_y.y" +#line 427 "asn1p_y.y" { yyval.a_module_flags = MSF_NOFLAGS; } break; case 16: -#line 425 "asn1p_y.y" +#line 428 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; } break; case 17: -#line 434 "asn1p_y.y" +#line 437 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; } break; case 18: -#line 437 "asn1p_y.y" +#line 440 "asn1p_y.y" { yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags; } break; case 19: -#line 446 "asn1p_y.y" +#line 449 "asn1p_y.y" { yyval.a_module_flags = MSF_EXPLICIT_TAGS; } break; case 20: -#line 449 "asn1p_y.y" +#line 452 "asn1p_y.y" { yyval.a_module_flags = MSF_IMPLICIT_TAGS; } break; case 21: -#line 452 "asn1p_y.y" +#line 455 "asn1p_y.y" { yyval.a_module_flags = MSF_AUTOMATIC_TAGS; } break; case 22: -#line 455 "asn1p_y.y" +#line 458 "asn1p_y.y" { yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED; } break; case 23: -#line 459 "asn1p_y.y" +#line 462 "asn1p_y.y" { /* X.680Amd1 specifies TAG and XER */ if(strcmp(yyvsp[-1].tv_str, "TAG") == 0) { @@ -1981,26 +1981,26 @@ yyparse (YYPARSE_PARAM_ARG) break; case 24: -#line 480 "asn1p_y.y" +#line 483 "asn1p_y.y" { yyval.a_module = 0; } break; case 25: -#line 481 "asn1p_y.y" +#line 484 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; } break; case 26: -#line 490 "asn1p_y.y" +#line 493 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; } break; case 27: -#line 493 "asn1p_y.y" +#line 496 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; @@ -2031,14 +2031,14 @@ yyparse (YYPARSE_PARAM_ARG) break; case 28: -#line 526 "asn1p_y.y" +#line 529 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; } break; case 29: -#line 529 "asn1p_y.y" +#line 532 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -2051,7 +2051,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 30: -#line 538 "asn1p_y.y" +#line 541 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -2062,7 +2062,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 31: -#line 545 "asn1p_y.y" +#line 548 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -2073,7 +2073,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 32: -#line 558 "asn1p_y.y" +#line 561 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -2084,12 +2084,12 @@ yyparse (YYPARSE_PARAM_ARG) break; case 33: -#line 566 "asn1p_y.y" +#line 569 "asn1p_y.y" { asn1p_lexer_hack_push_encoding_control(); } break; case 34: -#line 567 "asn1p_y.y" +#line 570 "asn1p_y.y" { fprintf(stderr, "WARNING: ENCODING-CONTROL %s " @@ -2101,7 +2101,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 35: -#line 579 "asn1p_y.y" +#line 582 "asn1p_y.y" { return yyerror( "Attempt to redefine a standard basic string type, " @@ -2110,7 +2110,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 36: -#line 592 "asn1p_y.y" +#line 595 "asn1p_y.y" { if(!saved_aid && 0) return yyerror("Unterminated IMPORTS FROM, " @@ -2121,14 +2121,14 @@ yyparse (YYPARSE_PARAM_ARG) break; case 37: -#line 602 "asn1p_y.y" +#line 605 "asn1p_y.y" { return yyerror("Empty IMPORTS list"); } break; case 38: -#line 608 "asn1p_y.y" +#line 611 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -2137,7 +2137,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 39: -#line 613 "asn1p_y.y" +#line 616 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); @@ -2145,17 +2145,17 @@ yyparse (YYPARSE_PARAM_ARG) break; case 40: -#line 620 "asn1p_y.y" +#line 623 "asn1p_y.y" { memset(&yyval.a_aid, 0, sizeof(yyval.a_aid)); } break; case 41: -#line 621 "asn1p_y.y" +#line 624 "asn1p_y.y" { yyval.a_aid.oid = yyvsp[0].a_oid; } break; case 42: -#line 625 "asn1p_y.y" +#line 628 "asn1p_y.y" { yyval.a_xports = yyvsp[-3].a_xports; yyval.a_xports->fromModuleName = yyvsp[-1].tv_str; @@ -2167,7 +2167,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 43: -#line 636 "asn1p_y.y" +#line 639 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); @@ -2176,7 +2176,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 44: -#line 641 "asn1p_y.y" +#line 644 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); @@ -2184,7 +2184,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 45: -#line 648 "asn1p_y.y" +#line 651 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2194,7 +2194,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 46: -#line 654 "asn1p_y.y" +#line 657 "asn1p_y.y" { /* Completely equivalent to above */ yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2204,7 +2204,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 47: -#line 660 "asn1p_y.y" +#line 663 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2214,21 +2214,21 @@ yyparse (YYPARSE_PARAM_ARG) break; case 48: -#line 669 "asn1p_y.y" +#line 672 "asn1p_y.y" { yyval.a_xports = yyvsp[-1].a_xports; } break; case 49: -#line 672 "asn1p_y.y" +#line 675 "asn1p_y.y" { yyval.a_xports = 0; } break; case 50: -#line 675 "asn1p_y.y" +#line 678 "asn1p_y.y" { /* Empty EXPORTS clause effectively prohibits export. */ yyval.a_xports = asn1p_xports_new(); @@ -2237,7 +2237,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 51: -#line 683 "asn1p_y.y" +#line 686 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); assert(yyval.a_xports); @@ -2246,7 +2246,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 52: -#line 688 "asn1p_y.y" +#line 691 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); @@ -2254,7 +2254,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 53: -#line 695 "asn1p_y.y" +#line 698 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2264,7 +2264,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 54: -#line 701 "asn1p_y.y" +#line 704 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2274,7 +2274,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 55: -#line 707 "asn1p_y.y" +#line 710 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2284,12 +2284,12 @@ yyparse (YYPARSE_PARAM_ARG) break; case 56: -#line 716 "asn1p_y.y" +#line 719 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; } break; case 57: -#line 719 "asn1p_y.y" +#line 722 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -2300,14 +2300,14 @@ yyparse (YYPARSE_PARAM_ARG) break; case 58: -#line 729 "asn1p_y.y" +#line 732 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; } break; case 59: -#line 742 "asn1p_y.y" +#line 745 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2318,7 +2318,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 60: -#line 752 "asn1p_y.y" +#line 755 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2330,7 +2330,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 61: -#line 772 "asn1p_y.y" +#line 775 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -2340,7 +2340,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 62: -#line 778 "asn1p_y.y" +#line 781 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -2350,7 +2350,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 63: -#line 794 "asn1p_y.y" +#line 797 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-5].tv_str; @@ -2359,7 +2359,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 64: -#line 800 "asn1p_y.y" +#line 803 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-5].tv_str; @@ -2368,7 +2368,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 65: -#line 808 "asn1p_y.y" +#line 811 "asn1p_y.y" { int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); @@ -2381,7 +2381,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 66: -#line 817 "asn1p_y.y" +#line 820 "asn1p_y.y" { int ret; yyval.a_plist = yyvsp[-2].a_plist; @@ -2393,7 +2393,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 67: -#line 828 "asn1p_y.y" +#line 831 "asn1p_y.y" { yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; @@ -2401,7 +2401,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 68: -#line 832 "asn1p_y.y" +#line 835 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -2412,7 +2412,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 69: -#line 839 "asn1p_y.y" +#line 842 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -2423,7 +2423,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 70: -#line 846 "asn1p_y.y" +#line 849 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -2435,7 +2435,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 71: -#line 854 "asn1p_y.y" +#line 857 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -2447,7 +2447,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 72: -#line 865 "asn1p_y.y" +#line 868 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2456,7 +2456,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 73: -#line 870 "asn1p_y.y" +#line 873 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); @@ -2464,14 +2464,14 @@ yyparse (YYPARSE_PARAM_ARG) break; case 74: -#line 877 "asn1p_y.y" +#line 880 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; } break; case 75: -#line 880 "asn1p_y.y" +#line 883 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2483,7 +2483,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 76: -#line 888 "asn1p_y.y" +#line 891 "asn1p_y.y" { asn1p_ref_t *ref; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2498,7 +2498,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 77: -#line 899 "asn1p_y.y" +#line 902 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); yyval.a_expr->expr_type = A1TC_VALUESET; @@ -2508,17 +2508,17 @@ yyparse (YYPARSE_PARAM_ARG) break; case 78: -#line 922 "asn1p_y.y" +#line 925 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); } break; case 79: -#line 923 "asn1p_y.y" +#line 926 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; } break; case 80: -#line 926 "asn1p_y.y" +#line 929 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2527,7 +2527,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 81: -#line 931 "asn1p_y.y" +#line 934 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); @@ -2535,7 +2535,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 82: -#line 938 "asn1p_y.y" +#line 941 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -2546,7 +2546,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 83: -#line 945 "asn1p_y.y" +#line 948 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; yyvsp[0].a_marker.flags |= yyval.a_expr->marker.flags; @@ -2556,7 +2556,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 84: -#line 951 "asn1p_y.y" +#line 954 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2567,14 +2567,14 @@ yyparse (YYPARSE_PARAM_ARG) break; case 85: -#line 958 "asn1p_y.y" +#line 961 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; } break; case 86: -#line 964 "asn1p_y.y" +#line 967 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2583,7 +2583,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 87: -#line 969 "asn1p_y.y" +#line 972 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); @@ -2591,7 +2591,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 88: -#line 976 "asn1p_y.y" +#line 979 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -2600,14 +2600,14 @@ yyparse (YYPARSE_PARAM_ARG) break; case 89: -#line 981 "asn1p_y.y" +#line 984 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; } break; case 90: -#line 984 "asn1p_y.y" +#line 987 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; _fixup_anonymous_identifier(yyval.a_expr); @@ -2615,7 +2615,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 91: -#line 991 "asn1p_y.y" +#line 994 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); @@ -2626,17 +2626,17 @@ yyparse (YYPARSE_PARAM_ARG) break; case 92: -#line 1001 "asn1p_y.y" +#line 1004 "asn1p_y.y" { yyval.a_int = 0; } break; case 93: -#line 1002 "asn1p_y.y" +#line 1005 "asn1p_y.y" { yyval.a_int = 1; } break; case 94: -#line 1006 "asn1p_y.y" +#line 1009 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2647,7 +2647,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 95: -#line 1013 "asn1p_y.y" +#line 1016 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); @@ -2655,7 +2655,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 96: -#line 1023 "asn1p_y.y" +#line 1026 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2667,7 +2667,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 97: -#line 1033 "asn1p_y.y" +#line 1036 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); yyval.a_expr->Identifier = yyvsp[-3].tv_str; @@ -2680,7 +2680,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 98: -#line 1044 "asn1p_y.y" +#line 1047 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -2692,7 +2692,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 99: -#line 1054 "asn1p_y.y" +#line 1057 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2705,7 +2705,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 100: -#line 1065 "asn1p_y.y" +#line 1068 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -2717,7 +2717,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 101: -#line 1075 "asn1p_y.y" +#line 1078 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2730,7 +2730,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 102: -#line 1086 "asn1p_y.y" +#line 1089 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2743,31 +2743,31 @@ yyparse (YYPARSE_PARAM_ARG) break; case 103: -#line 1098 "asn1p_y.y" +#line 1101 "asn1p_y.y" { yyval.a_wsynt = 0; } break; case 104: -#line 1099 "asn1p_y.y" +#line 1102 "asn1p_y.y" { yyval.a_wsynt = yyvsp[0].a_wsynt; } break; case 105: -#line 1106 "asn1p_y.y" +#line 1109 "asn1p_y.y" { asn1p_lexer_hack_enable_with_syntax(); } break; case 106: -#line 1108 "asn1p_y.y" +#line 1111 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; } break; case 107: -#line 1114 "asn1p_y.y" +#line 1117 "asn1p_y.y" { yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); @@ -2775,7 +2775,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 108: -#line 1118 "asn1p_y.y" +#line 1121 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); @@ -2783,7 +2783,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 109: -#line 1125 "asn1p_y.y" +#line 1128 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_fromstring(yyvsp[0].tv_opaque.buf, 0); yyval.a_wchunk->type = WC_WHITESPACE; @@ -2791,14 +2791,14 @@ yyparse (YYPARSE_PARAM_ARG) break; case 110: -#line 1129 "asn1p_y.y" +#line 1132 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_fromstring(yyvsp[0].tv_str, 0); } break; case 111: -#line 1132 "asn1p_y.y" +#line 1135 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_fromstring(yyvsp[0].a_refcomp.name, 0); yyval.a_wchunk->type = WC_FIELD; @@ -2806,14 +2806,14 @@ yyparse (YYPARSE_PARAM_ARG) break; case 112: -#line 1136 "asn1p_y.y" +#line 1139 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_fromsyntax(yyvsp[-1].a_wsynt); } break; case 113: -#line 1142 "asn1p_y.y" +#line 1145 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2825,7 +2825,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 114: -#line 1150 "asn1p_y.y" +#line 1153 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2838,7 +2838,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 115: -#line 1159 "asn1p_y.y" +#line 1162 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2851,7 +2851,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 116: -#line 1171 "asn1p_y.y" +#line 1174 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; yyval.a_expr->tag = yyvsp[-2].a_tag; @@ -2874,7 +2874,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 117: -#line 1193 "asn1p_y.y" +#line 1196 "asn1p_y.y" { yyval.a_int = asn1p_as_pointer ? EM_INDIRECT : 0; asn1p_as_pointer = 0; @@ -2882,7 +2882,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 118: -#line 1200 "asn1p_y.y" +#line 1203 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->marker.flags |= yyvsp[-1].a_int; @@ -2902,14 +2902,14 @@ yyparse (YYPARSE_PARAM_ARG) break; case 119: -#line 1219 "asn1p_y.y" +#line 1222 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; } break; case 120: -#line 1222 "asn1p_y.y" +#line 1225 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2919,7 +2919,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 121: -#line 1228 "asn1p_y.y" +#line 1231 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2929,7 +2929,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 122: -#line 1234 "asn1p_y.y" +#line 1237 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2939,7 +2939,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 123: -#line 1240 "asn1p_y.y" +#line 1243 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2953,7 +2953,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 124: -#line 1250 "asn1p_y.y" +#line 1253 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2967,7 +2967,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 125: -#line 1260 "asn1p_y.y" +#line 1263 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2977,7 +2977,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 126: -#line 1266 "asn1p_y.y" +#line 1269 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2992,7 +2992,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 127: -#line 1277 "asn1p_y.y" +#line 1280 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3003,7 +3003,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 128: -#line 1292 "asn1p_y.y" +#line 1295 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -3015,7 +3015,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 129: -#line 1300 "asn1p_y.y" +#line 1303 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -3029,7 +3029,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 130: -#line 1310 "asn1p_y.y" +#line 1313 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -3043,7 +3043,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 131: -#line 1320 "asn1p_y.y" +#line 1323 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -3057,7 +3057,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 132: -#line 1330 "asn1p_y.y" +#line 1333 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -3069,7 +3069,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 133: -#line 1338 "asn1p_y.y" +#line 1341 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[0].a_ref; @@ -3092,7 +3092,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 134: -#line 1360 "asn1p_y.y" +#line 1363 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -3104,7 +3104,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 135: -#line 1368 "asn1p_y.y" +#line 1371 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[-2].a_ref; @@ -3115,7 +3115,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 137: -#line 1381 "asn1p_y.y" +#line 1384 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; @@ -3123,7 +3123,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 138: -#line 1386 "asn1p_y.y" +#line 1389 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; @@ -3131,7 +3131,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 139: -#line 1395 "asn1p_y.y" +#line 1398 "asn1p_y.y" { yyval.a_ref = asn1p_ref_new(yylineno); asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_AmpUppercase); @@ -3139,7 +3139,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 140: -#line 1399 "asn1p_y.y" +#line 1402 "asn1p_y.y" { yyval.a_ref = yyval.a_ref; asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_AmpUppercase); @@ -3147,7 +3147,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 141: -#line 1403 "asn1p_y.y" +#line 1406 "asn1p_y.y" { yyval.a_ref = yyval.a_ref; asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_Amplowercase); @@ -3155,7 +3155,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 142: -#line 1410 "asn1p_y.y" +#line 1413 "asn1p_y.y" { yyval.a_ref = asn1p_ref_new(yylineno); asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_CAPITALS); @@ -3163,7 +3163,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 143: -#line 1430 "asn1p_y.y" +#line 1433 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); @@ -3174,7 +3174,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 146: -#line 1442 "asn1p_y.y" +#line 1445 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -3185,12 +3185,12 @@ yyparse (YYPARSE_PARAM_ARG) break; case 147: -#line 1449 "asn1p_y.y" +#line 1452 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); } break; case 148: -#line 1449 "asn1p_y.y" +#line 1452 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); @@ -3199,7 +3199,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 149: -#line 1454 "asn1p_y.y" +#line 1457 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -3208,7 +3208,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 150: -#line 1462 "asn1p_y.y" +#line 1465 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -3217,7 +3217,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 151: -#line 1467 "asn1p_y.y" +#line 1470 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -3226,7 +3226,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 152: -#line 1472 "asn1p_y.y" +#line 1475 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); @@ -3234,7 +3234,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 153: -#line 1476 "asn1p_y.y" +#line 1479 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); @@ -3242,21 +3242,21 @@ yyparse (YYPARSE_PARAM_ARG) break; case 154: -#line 1480 "asn1p_y.y" +#line 1483 "asn1p_y.y" { yyval.a_value = yyval.a_value; } break; case 155: -#line 1483 "asn1p_y.y" +#line 1486 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; } break; case 156: -#line 1489 "asn1p_y.y" +#line 1492 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3271,7 +3271,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 157: -#line 1500 "asn1p_y.y" +#line 1503 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3289,7 +3289,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 158: -#line 1518 "asn1p_y.y" +#line 1521 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); @@ -3297,7 +3297,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 159: -#line 1522 "asn1p_y.y" +#line 1525 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); @@ -3306,7 +3306,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 160: -#line 1527 "asn1p_y.y" +#line 1530 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); @@ -3315,7 +3315,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 161: -#line 1561 "asn1p_y.y" +#line 1564 "asn1p_y.y" { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 1; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); @@ -3328,7 +3328,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 162: -#line 1570 "asn1p_y.y" +#line 1573 "asn1p_y.y" { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); @@ -3344,87 +3344,87 @@ yyparse (YYPARSE_PARAM_ARG) break; case 163: -#line 1585 "asn1p_y.y" +#line 1588 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BOOLEAN; } break; case 164: -#line 1586 "asn1p_y.y" +#line 1589 "asn1p_y.y" { yyval.a_type = ASN_BASIC_NULL; } break; case 165: -#line 1587 "asn1p_y.y" +#line 1590 "asn1p_y.y" { yyval.a_type = ASN_BASIC_REAL; } break; case 166: -#line 1588 "asn1p_y.y" +#line 1591 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; } break; case 167: -#line 1589 "asn1p_y.y" +#line 1592 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OCTET_STRING; } break; case 168: -#line 1590 "asn1p_y.y" +#line 1593 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; } break; case 169: -#line 1591 "asn1p_y.y" +#line 1594 "asn1p_y.y" { yyval.a_type = ASN_BASIC_RELATIVE_OID; } break; case 170: -#line 1592 "asn1p_y.y" +#line 1595 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EXTERNAL; } break; case 171: -#line 1593 "asn1p_y.y" +#line 1596 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; } break; case 172: -#line 1594 "asn1p_y.y" +#line 1597 "asn1p_y.y" { yyval.a_type = ASN_BASIC_CHARACTER_STRING; } break; case 173: -#line 1595 "asn1p_y.y" +#line 1598 "asn1p_y.y" { yyval.a_type = ASN_BASIC_UTCTime; } break; case 174: -#line 1596 "asn1p_y.y" +#line 1599 "asn1p_y.y" { yyval.a_type = ASN_BASIC_GeneralizedTime; } break; case 175: -#line 1597 "asn1p_y.y" +#line 1600 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; } break; case 176: -#line 1604 "asn1p_y.y" +#line 1607 "asn1p_y.y" { yyval.a_type = ASN_BASIC_INTEGER; } break; case 177: -#line 1605 "asn1p_y.y" +#line 1608 "asn1p_y.y" { yyval.a_type = ASN_BASIC_ENUMERATED; } break; case 178: -#line 1606 "asn1p_y.y" +#line 1609 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BIT_STRING; } break; case 179: -#line 1610 "asn1p_y.y" +#line 1613 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3434,7 +3434,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 180: -#line 1616 "asn1p_y.y" +#line 1619 "asn1p_y.y" { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; @@ -3448,12 +3448,12 @@ yyparse (YYPARSE_PARAM_ARG) break; case 181: -#line 1629 "asn1p_y.y" +#line 1632 "asn1p_y.y" { yyval.a_type = ASN_STRING_BMPString; } break; case 182: -#line 1630 "asn1p_y.y" +#line 1633 "asn1p_y.y" { yyval.a_type = ASN_STRING_GeneralString; fprintf(stderr, "WARNING: GeneralString is not fully supported\n"); @@ -3461,7 +3461,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 183: -#line 1634 "asn1p_y.y" +#line 1637 "asn1p_y.y" { yyval.a_type = ASN_STRING_GraphicString; fprintf(stderr, "WARNING: GraphicString is not fully supported\n"); @@ -3469,27 +3469,27 @@ yyparse (YYPARSE_PARAM_ARG) break; case 184: -#line 1638 "asn1p_y.y" +#line 1641 "asn1p_y.y" { yyval.a_type = ASN_STRING_IA5String; } break; case 185: -#line 1639 "asn1p_y.y" +#line 1642 "asn1p_y.y" { yyval.a_type = ASN_STRING_ISO646String; } break; case 186: -#line 1640 "asn1p_y.y" +#line 1643 "asn1p_y.y" { yyval.a_type = ASN_STRING_NumericString; } break; case 187: -#line 1641 "asn1p_y.y" +#line 1644 "asn1p_y.y" { yyval.a_type = ASN_STRING_PrintableString; } break; case 188: -#line 1642 "asn1p_y.y" +#line 1645 "asn1p_y.y" { yyval.a_type = ASN_STRING_T61String; fprintf(stderr, "WARNING: T61String is not fully supported\n"); @@ -3497,22 +3497,22 @@ yyparse (YYPARSE_PARAM_ARG) break; case 189: -#line 1646 "asn1p_y.y" +#line 1649 "asn1p_y.y" { yyval.a_type = ASN_STRING_TeletexString; } break; case 190: -#line 1647 "asn1p_y.y" +#line 1650 "asn1p_y.y" { yyval.a_type = ASN_STRING_UniversalString; } break; case 191: -#line 1648 "asn1p_y.y" +#line 1651 "asn1p_y.y" { yyval.a_type = ASN_STRING_UTF8String; } break; case 192: -#line 1649 "asn1p_y.y" +#line 1652 "asn1p_y.y" { yyval.a_type = ASN_STRING_VideotexString; fprintf(stderr, "WARNING: VideotexString is not fully supported\n"); @@ -3520,36 +3520,36 @@ yyparse (YYPARSE_PARAM_ARG) break; case 193: -#line 1653 "asn1p_y.y" +#line 1656 "asn1p_y.y" { yyval.a_type = ASN_STRING_VisibleString; } break; case 194: -#line 1654 "asn1p_y.y" +#line 1657 "asn1p_y.y" { yyval.a_type = ASN_STRING_ObjectDescriptor; } break; case 200: -#line 1666 "asn1p_y.y" +#line 1669 "asn1p_y.y" { yyval.a_constr = 0; } break; case 201: -#line 1667 "asn1p_y.y" +#line 1670 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; case 202: -#line 1673 "asn1p_y.y" +#line 1676 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); } break; case 203: -#line 1676 "asn1p_y.y" +#line 1679 "asn1p_y.y" { /* * This is a special case, for compatibility purposes. @@ -3560,21 +3560,21 @@ yyparse (YYPARSE_PARAM_ARG) break; case 204: -#line 1686 "asn1p_y.y" +#line 1689 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; } break; case 205: -#line 1689 "asn1p_y.y" +#line 1692 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); } break; case 206: -#line 1695 "asn1p_y.y" +#line 1698 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); yyval.a_constr->type = ACT_EL_EXT; @@ -3582,14 +3582,14 @@ yyparse (YYPARSE_PARAM_ARG) break; case 207: -#line 1699 "asn1p_y.y" +#line 1702 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; case 208: -#line 1702 "asn1p_y.y" +#line 1705 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3599,7 +3599,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 209: -#line 1708 "asn1p_y.y" +#line 1711 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3611,42 +3611,42 @@ yyparse (YYPARSE_PARAM_ARG) break; case 210: -#line 1719 "asn1p_y.y" +#line 1722 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; case 211: -#line 1722 "asn1p_y.y" +#line 1725 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_AEX, yyvsp[0].a_constr, 0); } break; case 212: -#line 1725 "asn1p_y.y" +#line 1728 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); } break; case 213: -#line 1728 "asn1p_y.y" +#line 1731 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); } break; case 214: -#line 1731 "asn1p_y.y" +#line 1734 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); } break; case 215: -#line 1737 "asn1p_y.y" +#line 1740 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -3658,7 +3658,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 216: -#line 1745 "asn1p_y.y" +#line 1748 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -3670,7 +3670,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 217: -#line 1753 "asn1p_y.y" +#line 1756 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3680,7 +3680,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 218: -#line 1759 "asn1p_y.y" +#line 1762 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3690,7 +3690,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 219: -#line 1765 "asn1p_y.y" +#line 1768 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3701,7 +3701,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 220: -#line 1772 "asn1p_y.y" +#line 1775 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3713,7 +3713,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 221: -#line 1780 "asn1p_y.y" +#line 1783 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3725,7 +3725,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 222: -#line 1788 "asn1p_y.y" +#line 1791 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3738,26 +3738,26 @@ yyparse (YYPARSE_PARAM_ARG) break; case 223: -#line 1797 "asn1p_y.y" +#line 1800 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; case 224: -#line 1800 "asn1p_y.y" +#line 1803 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; case 225: -#line 1804 "asn1p_y.y" +#line 1807 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); } break; case 226: -#line 1804 "asn1p_y.y" +#line 1807 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3769,41 +3769,41 @@ yyparse (YYPARSE_PARAM_ARG) break; case 227: -#line 1815 "asn1p_y.y" +#line 1818 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RANGE; } break; case 228: -#line 1816 "asn1p_y.y" +#line 1819 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RLRANGE; } break; case 229: -#line 1817 "asn1p_y.y" +#line 1820 "asn1p_y.y" { yyval.a_ctype = ACT_EL_LLRANGE; } break; case 230: -#line 1818 "asn1p_y.y" +#line 1821 "asn1p_y.y" { yyval.a_ctype = ACT_EL_ULRANGE; } break; case 231: -#line 1822 "asn1p_y.y" +#line 1825 "asn1p_y.y" { yyval.a_ctype = ACT_CT_SIZE; } break; case 232: -#line 1825 "asn1p_y.y" +#line 1828 "asn1p_y.y" { yyval.a_ctype = ACT_CT_FROM; } break; case 233: -#line 1831 "asn1p_y.y" +#line 1834 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -3812,7 +3812,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 234: -#line 1836 "asn1p_y.y" +#line 1839 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); @@ -3820,22 +3820,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 235: -#line 1841 "asn1p_y.y" - { - yyval.a_value = yyvsp[0].a_value; - } - break; - - case 236: -#line 1844 "asn1p_y.y" - { - yyval.a_value = yyvsp[0].a_value; - } - break; - case 237: -#line 1847 "asn1p_y.y" +#line 1846 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3850,7 +3836,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 238: -#line 1861 "asn1p_y.y" +#line 1860 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3865,35 +3851,35 @@ yyparse (YYPARSE_PARAM_ARG) break; case 239: -#line 1875 "asn1p_y.y" +#line 1874 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMP, yyvsp[0].a_constr, 0); } break; case 240: -#line 1878 "asn1p_y.y" +#line 1877 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); } break; case 241: -#line 1884 "asn1p_y.y" +#line 1883 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; case 242: -#line 1887 "asn1p_y.y" +#line 1886 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); } break; case 243: -#line 1893 "asn1p_y.y" +#line 1892 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3903,7 +3889,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 244: -#line 1899 "asn1p_y.y" +#line 1898 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3915,52 +3901,52 @@ yyparse (YYPARSE_PARAM_ARG) break; case 245: -#line 1913 "asn1p_y.y" +#line 1912 "asn1p_y.y" { yyval.a_pres = ACPRES_DEFAULT; } break; case 246: -#line 1914 "asn1p_y.y" +#line 1913 "asn1p_y.y" { yyval.a_pres = yyvsp[0].a_pres; } break; case 247: -#line 1918 "asn1p_y.y" +#line 1917 "asn1p_y.y" { yyval.a_pres = ACPRES_PRESENT; } break; case 248: -#line 1921 "asn1p_y.y" +#line 1920 "asn1p_y.y" { yyval.a_pres = ACPRES_ABSENT; } break; case 249: -#line 1924 "asn1p_y.y" +#line 1923 "asn1p_y.y" { yyval.a_pres = ACPRES_OPTIONAL; } break; case 250: -#line 1930 "asn1p_y.y" +#line 1929 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; case 251: -#line 1933 "asn1p_y.y" +#line 1932 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; case 252: -#line 1942 "asn1p_y.y" +#line 1941 "asn1p_y.y" { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; @@ -3976,14 +3962,14 @@ yyparse (YYPARSE_PARAM_ARG) break; case 253: -#line 1957 "asn1p_y.y" +#line 1956 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); } break; case 254: -#line 1963 "asn1p_y.y" +#line 1962 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3993,7 +3979,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 255: -#line 1969 "asn1p_y.y" +#line 1968 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -4005,7 +3991,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 256: -#line 1983 "asn1p_y.y" +#line 1982 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; @@ -4020,7 +4006,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 257: -#line 1994 "asn1p_y.y" +#line 1993 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; @@ -4036,14 +4022,14 @@ yyparse (YYPARSE_PARAM_ARG) break; case 258: -#line 2010 "asn1p_y.y" +#line 2009 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; } break; case 259: -#line 2013 "asn1p_y.y" +#line 2012 "asn1p_y.y" { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); @@ -4056,7 +4042,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 260: -#line 2031 "asn1p_y.y" +#line 2030 "asn1p_y.y" { yyval.a_marker.flags = EM_NOMARK; yyval.a_marker.default_value = 0; @@ -4064,12 +4050,12 @@ yyparse (YYPARSE_PARAM_ARG) break; case 261: -#line 2035 "asn1p_y.y" +#line 2034 "asn1p_y.y" { yyval.a_marker = yyvsp[0].a_marker; } break; case 262: -#line 2039 "asn1p_y.y" +#line 2038 "asn1p_y.y" { yyval.a_marker.flags = EM_OPTIONAL | EM_INDIRECT; yyval.a_marker.default_value = 0; @@ -4077,7 +4063,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 263: -#line 2043 "asn1p_y.y" +#line 2042 "asn1p_y.y" { yyval.a_marker.flags = EM_DEFAULT; yyval.a_marker.default_value = yyvsp[0].a_value; @@ -4085,7 +4071,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 264: -#line 2066 "asn1p_y.y" +#line 2065 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -4093,14 +4079,14 @@ yyparse (YYPARSE_PARAM_ARG) break; case 265: -#line 2070 "asn1p_y.y" +#line 2069 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; } break; case 266: -#line 2076 "asn1p_y.y" +#line 2075 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -4109,7 +4095,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 267: -#line 2081 "asn1p_y.y" +#line 2080 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); @@ -4117,7 +4103,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 268: -#line 2088 "asn1p_y.y" +#line 2087 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -4128,7 +4114,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 269: -#line 2095 "asn1p_y.y" +#line 2094 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -4140,7 +4126,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 270: -#line 2103 "asn1p_y.y" +#line 2102 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -4152,7 +4138,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 271: -#line 2111 "asn1p_y.y" +#line 2110 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -4163,7 +4149,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 272: -#line 2118 "asn1p_y.y" +#line 2117 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -4175,7 +4161,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 273: -#line 2129 "asn1p_y.y" +#line 2128 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); @@ -4183,112 +4169,120 @@ yyparse (YYPARSE_PARAM_ARG) break; case 274: -#line 2133 "asn1p_y.y" +#line 2132 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); } break; - case 275: -#line 2164 "asn1p_y.y" + case 276: +#line 2140 "asn1p_y.y" + { + yyval.a_value = asn1p_value_fromdouble(yyvsp[0].a_dbl); + checkmem(yyval.a_value); + } + break; + + case 277: +#line 2171 "asn1p_y.y" { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); } break; - case 276: -#line 2165 "asn1p_y.y" + case 278: +#line 2172 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; } break; - case 277: -#line 2169 "asn1p_y.y" + case 279: +#line 2176 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = yyvsp[0].a_tag.tag_mode; } break; - case 278: -#line 2176 "asn1p_y.y" + case 280: +#line 2183 "asn1p_y.y" { yyval.a_tag = yyvsp[-2].a_tag; yyval.a_tag.tag_value = yyvsp[-1].a_int; } break; - case 279: -#line 2182 "asn1p_y.y" + case 281: +#line 2189 "asn1p_y.y" { yyval.a_tag.tag_class = TC_CONTEXT_SPECIFIC; } break; - case 280: -#line 2183 "asn1p_y.y" + case 282: +#line 2190 "asn1p_y.y" { yyval.a_tag.tag_class = TC_UNIVERSAL; } break; - case 281: -#line 2184 "asn1p_y.y" + case 283: +#line 2191 "asn1p_y.y" { yyval.a_tag.tag_class = TC_APPLICATION; } break; - case 282: -#line 2185 "asn1p_y.y" + case 284: +#line 2192 "asn1p_y.y" { yyval.a_tag.tag_class = TC_PRIVATE; } break; - case 283: -#line 2189 "asn1p_y.y" + case 285: +#line 2196 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_DEFAULT; } break; - case 284: -#line 2190 "asn1p_y.y" + case 286: +#line 2197 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_IMPLICIT; } break; - case 285: -#line 2191 "asn1p_y.y" + case 287: +#line 2198 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_EXPLICIT; } break; - case 286: -#line 2195 "asn1p_y.y" + case 288: +#line 2202 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; } break; - case 287: -#line 2199 "asn1p_y.y" + case 289: +#line 2206 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; } break; - case 288: -#line 2207 "asn1p_y.y" + case 290: +#line 2214 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; } break; - case 289: -#line 2214 "asn1p_y.y" + case 291: +#line 2221 "asn1p_y.y" { yyval.tv_str = 0; } break; - case 290: -#line 2215 "asn1p_y.y" + case 292: +#line 2222 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; } break; - case 291: -#line 2221 "asn1p_y.y" + case 293: +#line 2228 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; @@ -4299,7 +4293,7 @@ yyparse (YYPARSE_PARAM_ARG) } /* Line 1016 of /usr/local/share/bison/yacc.c. */ -#line 4303 "asn1p_y.c" +#line 4297 "asn1p_y.c" yyvsp -= yylen; yyssp -= yylen; @@ -4518,7 +4512,7 @@ yyparse (YYPARSE_PARAM_ARG) } -#line 2227 "asn1p_y.y" +#line 2234 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.h b/libasn1parser/asn1p_y.h index b7b7f1a1b..3874ede45 100644 --- a/libasn1parser/asn1p_y.h +++ b/libasn1parser/asn1p_y.h @@ -40,100 +40,101 @@ TOK_hstring = 263, TOK_identifier = 264, TOK_number = 265, - TOK_tuple = 266, - TOK_quadruple = 267, - TOK_number_negative = 268, - TOK_typereference = 269, - TOK_capitalreference = 270, - TOK_typefieldreference = 271, - TOK_valuefieldreference = 272, - TOK_Literal = 273, - TOK_ABSENT = 274, - TOK_ABSTRACT_SYNTAX = 275, - TOK_ALL = 276, - TOK_ANY = 277, - TOK_APPLICATION = 278, - TOK_AUTOMATIC = 279, - TOK_BEGIN = 280, - TOK_BIT = 281, - TOK_BMPString = 282, - TOK_BOOLEAN = 283, - TOK_BY = 284, - TOK_CHARACTER = 285, - TOK_CHOICE = 286, - TOK_CLASS = 287, - TOK_COMPONENT = 288, - TOK_COMPONENTS = 289, - TOK_CONSTRAINED = 290, - TOK_CONTAINING = 291, - TOK_DEFAULT = 292, - TOK_DEFINITIONS = 293, - TOK_DEFINED = 294, - TOK_EMBEDDED = 295, - TOK_ENCODED = 296, - TOK_ENCODING_CONTROL = 297, - TOK_END = 298, - TOK_ENUMERATED = 299, - TOK_EXPLICIT = 300, - TOK_EXPORTS = 301, - TOK_EXTENSIBILITY = 302, - TOK_EXTERNAL = 303, - TOK_FALSE = 304, - TOK_FROM = 305, - TOK_GeneralizedTime = 306, - TOK_GeneralString = 307, - TOK_GraphicString = 308, - TOK_IA5String = 309, - TOK_IDENTIFIER = 310, - TOK_IMPLICIT = 311, - TOK_IMPLIED = 312, - TOK_IMPORTS = 313, - TOK_INCLUDES = 314, - TOK_INSTANCE = 315, - TOK_INSTRUCTIONS = 316, - TOK_INTEGER = 317, - TOK_ISO646String = 318, - TOK_MAX = 319, - TOK_MIN = 320, - TOK_MINUS_INFINITY = 321, - TOK_NULL = 322, - TOK_NumericString = 323, - TOK_OBJECT = 324, - TOK_ObjectDescriptor = 325, - TOK_OCTET = 326, - TOK_OF = 327, - TOK_OPTIONAL = 328, - TOK_PATTERN = 329, - TOK_PDV = 330, - TOK_PLUS_INFINITY = 331, - TOK_PRESENT = 332, - TOK_PrintableString = 333, - TOK_PRIVATE = 334, - TOK_REAL = 335, - TOK_RELATIVE_OID = 336, - TOK_SEQUENCE = 337, - TOK_SET = 338, - TOK_SIZE = 339, - TOK_STRING = 340, - TOK_SYNTAX = 341, - TOK_T61String = 342, - TOK_TAGS = 343, - TOK_TeletexString = 344, - TOK_TRUE = 345, - TOK_TYPE_IDENTIFIER = 346, - TOK_UNIQUE = 347, - TOK_UNIVERSAL = 348, - TOK_UniversalString = 349, - TOK_UTCTime = 350, - TOK_UTF8String = 351, - TOK_VideotexString = 352, - TOK_VisibleString = 353, - TOK_WITH = 354, - TOK_EXCEPT = 355, - TOK_INTERSECTION = 356, - TOK_UNION = 357, - TOK_TwoDots = 358, - TOK_ThreeDots = 359 + TOK_number_negative = 266, + TOK_realnumber = 267, + TOK_tuple = 268, + TOK_quadruple = 269, + TOK_typereference = 270, + TOK_capitalreference = 271, + TOK_typefieldreference = 272, + TOK_valuefieldreference = 273, + TOK_Literal = 274, + TOK_ABSENT = 275, + TOK_ABSTRACT_SYNTAX = 276, + TOK_ALL = 277, + TOK_ANY = 278, + TOK_APPLICATION = 279, + TOK_AUTOMATIC = 280, + TOK_BEGIN = 281, + TOK_BIT = 282, + TOK_BMPString = 283, + TOK_BOOLEAN = 284, + TOK_BY = 285, + TOK_CHARACTER = 286, + TOK_CHOICE = 287, + TOK_CLASS = 288, + TOK_COMPONENT = 289, + TOK_COMPONENTS = 290, + TOK_CONSTRAINED = 291, + TOK_CONTAINING = 292, + TOK_DEFAULT = 293, + TOK_DEFINITIONS = 294, + TOK_DEFINED = 295, + TOK_EMBEDDED = 296, + TOK_ENCODED = 297, + TOK_ENCODING_CONTROL = 298, + TOK_END = 299, + TOK_ENUMERATED = 300, + TOK_EXPLICIT = 301, + TOK_EXPORTS = 302, + TOK_EXTENSIBILITY = 303, + TOK_EXTERNAL = 304, + TOK_FALSE = 305, + TOK_FROM = 306, + TOK_GeneralizedTime = 307, + TOK_GeneralString = 308, + TOK_GraphicString = 309, + TOK_IA5String = 310, + TOK_IDENTIFIER = 311, + TOK_IMPLICIT = 312, + TOK_IMPLIED = 313, + TOK_IMPORTS = 314, + TOK_INCLUDES = 315, + TOK_INSTANCE = 316, + TOK_INSTRUCTIONS = 317, + TOK_INTEGER = 318, + TOK_ISO646String = 319, + TOK_MAX = 320, + TOK_MIN = 321, + TOK_MINUS_INFINITY = 322, + TOK_NULL = 323, + TOK_NumericString = 324, + TOK_OBJECT = 325, + TOK_ObjectDescriptor = 326, + TOK_OCTET = 327, + TOK_OF = 328, + TOK_OPTIONAL = 329, + TOK_PATTERN = 330, + TOK_PDV = 331, + TOK_PLUS_INFINITY = 332, + TOK_PRESENT = 333, + TOK_PrintableString = 334, + TOK_PRIVATE = 335, + TOK_REAL = 336, + TOK_RELATIVE_OID = 337, + TOK_SEQUENCE = 338, + TOK_SET = 339, + TOK_SIZE = 340, + TOK_STRING = 341, + TOK_SYNTAX = 342, + TOK_T61String = 343, + TOK_TAGS = 344, + TOK_TeletexString = 345, + TOK_TRUE = 346, + TOK_TYPE_IDENTIFIER = 347, + TOK_UNIQUE = 348, + TOK_UNIVERSAL = 349, + TOK_UniversalString = 350, + TOK_UTCTime = 351, + TOK_UTF8String = 352, + TOK_VideotexString = 353, + TOK_VisibleString = 354, + TOK_WITH = 355, + TOK_EXCEPT = 356, + TOK_INTERSECTION = 357, + TOK_UNION = 358, + TOK_TwoDots = 359, + TOK_ThreeDots = 360 }; #endif #define TOK_PPEQ 258 @@ -144,100 +145,101 @@ #define TOK_hstring 263 #define TOK_identifier 264 #define TOK_number 265 -#define TOK_tuple 266 -#define TOK_quadruple 267 -#define TOK_number_negative 268 -#define TOK_typereference 269 -#define TOK_capitalreference 270 -#define TOK_typefieldreference 271 -#define TOK_valuefieldreference 272 -#define TOK_Literal 273 -#define TOK_ABSENT 274 -#define TOK_ABSTRACT_SYNTAX 275 -#define TOK_ALL 276 -#define TOK_ANY 277 -#define TOK_APPLICATION 278 -#define TOK_AUTOMATIC 279 -#define TOK_BEGIN 280 -#define TOK_BIT 281 -#define TOK_BMPString 282 -#define TOK_BOOLEAN 283 -#define TOK_BY 284 -#define TOK_CHARACTER 285 -#define TOK_CHOICE 286 -#define TOK_CLASS 287 -#define TOK_COMPONENT 288 -#define TOK_COMPONENTS 289 -#define TOK_CONSTRAINED 290 -#define TOK_CONTAINING 291 -#define TOK_DEFAULT 292 -#define TOK_DEFINITIONS 293 -#define TOK_DEFINED 294 -#define TOK_EMBEDDED 295 -#define TOK_ENCODED 296 -#define TOK_ENCODING_CONTROL 297 -#define TOK_END 298 -#define TOK_ENUMERATED 299 -#define TOK_EXPLICIT 300 -#define TOK_EXPORTS 301 -#define TOK_EXTENSIBILITY 302 -#define TOK_EXTERNAL 303 -#define TOK_FALSE 304 -#define TOK_FROM 305 -#define TOK_GeneralizedTime 306 -#define TOK_GeneralString 307 -#define TOK_GraphicString 308 -#define TOK_IA5String 309 -#define TOK_IDENTIFIER 310 -#define TOK_IMPLICIT 311 -#define TOK_IMPLIED 312 -#define TOK_IMPORTS 313 -#define TOK_INCLUDES 314 -#define TOK_INSTANCE 315 -#define TOK_INSTRUCTIONS 316 -#define TOK_INTEGER 317 -#define TOK_ISO646String 318 -#define TOK_MAX 319 -#define TOK_MIN 320 -#define TOK_MINUS_INFINITY 321 -#define TOK_NULL 322 -#define TOK_NumericString 323 -#define TOK_OBJECT 324 -#define TOK_ObjectDescriptor 325 -#define TOK_OCTET 326 -#define TOK_OF 327 -#define TOK_OPTIONAL 328 -#define TOK_PATTERN 329 -#define TOK_PDV 330 -#define TOK_PLUS_INFINITY 331 -#define TOK_PRESENT 332 -#define TOK_PrintableString 333 -#define TOK_PRIVATE 334 -#define TOK_REAL 335 -#define TOK_RELATIVE_OID 336 -#define TOK_SEQUENCE 337 -#define TOK_SET 338 -#define TOK_SIZE 339 -#define TOK_STRING 340 -#define TOK_SYNTAX 341 -#define TOK_T61String 342 -#define TOK_TAGS 343 -#define TOK_TeletexString 344 -#define TOK_TRUE 345 -#define TOK_TYPE_IDENTIFIER 346 -#define TOK_UNIQUE 347 -#define TOK_UNIVERSAL 348 -#define TOK_UniversalString 349 -#define TOK_UTCTime 350 -#define TOK_UTF8String 351 -#define TOK_VideotexString 352 -#define TOK_VisibleString 353 -#define TOK_WITH 354 -#define TOK_EXCEPT 355 -#define TOK_INTERSECTION 356 -#define TOK_UNION 357 -#define TOK_TwoDots 358 -#define TOK_ThreeDots 359 +#define TOK_number_negative 266 +#define TOK_realnumber 267 +#define TOK_tuple 268 +#define TOK_quadruple 269 +#define TOK_typereference 270 +#define TOK_capitalreference 271 +#define TOK_typefieldreference 272 +#define TOK_valuefieldreference 273 +#define TOK_Literal 274 +#define TOK_ABSENT 275 +#define TOK_ABSTRACT_SYNTAX 276 +#define TOK_ALL 277 +#define TOK_ANY 278 +#define TOK_APPLICATION 279 +#define TOK_AUTOMATIC 280 +#define TOK_BEGIN 281 +#define TOK_BIT 282 +#define TOK_BMPString 283 +#define TOK_BOOLEAN 284 +#define TOK_BY 285 +#define TOK_CHARACTER 286 +#define TOK_CHOICE 287 +#define TOK_CLASS 288 +#define TOK_COMPONENT 289 +#define TOK_COMPONENTS 290 +#define TOK_CONSTRAINED 291 +#define TOK_CONTAINING 292 +#define TOK_DEFAULT 293 +#define TOK_DEFINITIONS 294 +#define TOK_DEFINED 295 +#define TOK_EMBEDDED 296 +#define TOK_ENCODED 297 +#define TOK_ENCODING_CONTROL 298 +#define TOK_END 299 +#define TOK_ENUMERATED 300 +#define TOK_EXPLICIT 301 +#define TOK_EXPORTS 302 +#define TOK_EXTENSIBILITY 303 +#define TOK_EXTERNAL 304 +#define TOK_FALSE 305 +#define TOK_FROM 306 +#define TOK_GeneralizedTime 307 +#define TOK_GeneralString 308 +#define TOK_GraphicString 309 +#define TOK_IA5String 310 +#define TOK_IDENTIFIER 311 +#define TOK_IMPLICIT 312 +#define TOK_IMPLIED 313 +#define TOK_IMPORTS 314 +#define TOK_INCLUDES 315 +#define TOK_INSTANCE 316 +#define TOK_INSTRUCTIONS 317 +#define TOK_INTEGER 318 +#define TOK_ISO646String 319 +#define TOK_MAX 320 +#define TOK_MIN 321 +#define TOK_MINUS_INFINITY 322 +#define TOK_NULL 323 +#define TOK_NumericString 324 +#define TOK_OBJECT 325 +#define TOK_ObjectDescriptor 326 +#define TOK_OCTET 327 +#define TOK_OF 328 +#define TOK_OPTIONAL 329 +#define TOK_PATTERN 330 +#define TOK_PDV 331 +#define TOK_PLUS_INFINITY 332 +#define TOK_PRESENT 333 +#define TOK_PrintableString 334 +#define TOK_PRIVATE 335 +#define TOK_REAL 336 +#define TOK_RELATIVE_OID 337 +#define TOK_SEQUENCE 338 +#define TOK_SET 339 +#define TOK_SIZE 340 +#define TOK_STRING 341 +#define TOK_SYNTAX 342 +#define TOK_T61String 343 +#define TOK_TAGS 344 +#define TOK_TeletexString 345 +#define TOK_TRUE 346 +#define TOK_TYPE_IDENTIFIER 347 +#define TOK_UNIQUE 348 +#define TOK_UNIVERSAL 349 +#define TOK_UniversalString 350 +#define TOK_UTCTime 351 +#define TOK_UTF8String 352 +#define TOK_VideotexString 353 +#define TOK_VisibleString 354 +#define TOK_WITH 355 +#define TOK_EXCEPT 356 +#define TOK_INTERSECTION 357 +#define TOK_UNION 358 +#define TOK_TwoDots 359 +#define TOK_ThreeDots 360 @@ -267,6 +269,7 @@ typedef union { struct asn1p_expr_marker_s a_marker; /* OPTIONAL/DEFAULT */ enum asn1p_constr_pres_e a_pres; /* PRESENT/ABSENT/OPTIONAL */ asn1c_integer_t a_int; + double a_dbl; char *tv_str; struct { char *buf; @@ -278,7 +281,7 @@ typedef union { } tv_nametag; } yystype; /* Line 1281 of /usr/local/share/bison/yacc.c. */ -#line 282 "asn1p_y.h" +#line 285 "asn1p_y.h" # define YYSTYPE yystype #endif diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index 3589a8e39..eacab98b2 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -92,6 +92,7 @@ static void _fixup_anonymous_identifier(asn1p_expr_t *expr); struct asn1p_expr_marker_s a_marker; /* OPTIONAL/DEFAULT */ enum asn1p_constr_pres_e a_pres; /* PRESENT/ABSENT/OPTIONAL */ asn1c_integer_t a_int; + double a_dbl; char *tv_str; struct { char *buf; @@ -114,9 +115,10 @@ static void _fixup_anonymous_identifier(asn1p_expr_t *expr); %token TOK_hstring %token TOK_identifier %token TOK_number +%token TOK_number_negative +%token TOK_realnumber %token TOK_tuple %token TOK_quadruple -%token TOK_number_negative %token TOK_typereference %token TOK_capitalreference /* "CLASS1" */ %token TOK_typefieldreference /* "&Pork" */ @@ -258,6 +260,7 @@ static void _fixup_anonymous_identifier(asn1p_expr_t *expr); %type SimpleValue %type DefinedValue %type SignedNumber +%type RealValue %type optComponentTypeLists %type ComponentTypeLists %type ComponentType @@ -1838,12 +1841,8 @@ SingleValue: checkmem($$); $$->type = ATV_TRUE; } - | SignedNumber { - $$ = $1; - } - | RestrictedCharacterStringValue { - $$ = $1; - } + | RealValue + | RestrictedCharacterStringValue | Identifier { asn1p_ref_t *ref; int ret; @@ -2136,6 +2135,14 @@ SignedNumber: } ; +RealValue: + SignedNumber + | TOK_realnumber { + $$ = asn1p_value_fromdouble($1); + checkmem($$); + } + ; + /* * SEQUENCE definition. * === EXAMPLE === diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index 6d2d6c15d..b43f0a875 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2003, 2004, 2005 Lev Walkin . + * Copyright (c) 2003, 2004, 2005, 2006 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ @@ -121,7 +121,10 @@ SET_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, int edx; /* SET element's index */ ASN_DEBUG("Decoding %s as SET", td->name); - + + if(_ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx)) + _ASN_DECODE_FAILED; + /* * Create the target structure if it is not present already. */ @@ -862,6 +865,144 @@ SET_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, _ASN_ENCODE_FAILED; } +asn_dec_rval_t +SET_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_SET_specifics_t *specs = (asn_SET_specifics_t *)td->specifics; + void *st = *sptr; /* Target structure. */ + int extpresent = 0; /* Extension additions are present */ + uint8_t *opres; /* Presence of optional root members */ + asn_per_data_t opmd; + asn_dec_rval_t rv; + int edx; + + (void)constraints; + + ASN_DEBUG("Decoding %s as SET", td->name); + + if(_ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx)) + _ASN_DECODE_FAILED; + + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) _ASN_DECODE_FAILED; + } + + ASN_DEBUG("Decoding %s as SEQUENCE (UPER)", td->name); + + /* Handle extensions */ + if(specs->ext_before >= 0) { + extpresent = per_get_few_bits(pd, 1); + if(extpresent < 0) _ASN_DECODE_FAILED; + } + + /* Prepare a place and read-in the presence bitmap */ + if(specs->roms_count) { + opres = (uint8_t *)MALLOC(((specs->roms_count + 7) >> 3) + 1); + if(!opres) _ASN_DECODE_FAILED; + /* Get the presence map */ + if(per_get_many_bits(pd, opres, 0, specs->roms_count)) { + FREEMEM(opres); + _ASN_DECODE_FAILED; + } + opmd.buffer = opres; + opmd.nboff = 0; + opmd.nbits = specs->roms_count; + ASN_DEBUG("Read in presence bitmap for %s of %d bits (%x..)", + td->name, specs->roms_count, *opres); + } else { + opres = 0; + memset(&opmd, 0, sizeof opmd); + } + + /* + * Get the sequence ROOT elements. + */ + for(edx = 0; edx < ((specs->ext_before < 0) + ? td->elements_count : specs->ext_before + 1); edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + /* Deal with optionality */ + if(elm->optional) { + int present = per_get_few_bits(&opmd, 1); + ASN_DEBUG("Member %s->%s is optional, p=%d (%d->%d)", + td->name, elm->name, present, + (int)opmd.nboff, (int)opmd.nbits); + if(present == 0) { + /* This element is not present */ + if(elm->default_value) { + /* Fill-in DEFAULT */ + if(elm->default_value(1, memb_ptr2)) { + FREEMEM(opres); + _ASN_DECODE_FAILED; + } + } + /* The member is just not present */ + continue; + } + /* Fall through */ + } + + /* Fetch the member from the stream */ + ASN_DEBUG("Decoding member %s in %s", elm->name, td->name); + rv = elm->type->uper_decoder(opt_codec_ctx, elm->type, + elm->per_constraints, memb_ptr2, pd); + if(rv.code != RC_OK) { + ASN_DEBUG("Failed decode %s in %s", + elm->name, td->name); + FREEMEM(opres); + return rv; + } + } + + /* + * Deal with extensions. + */ + if(extpresent) { + ASN_DEBUG("Extensibility for %s: NOT IMPLEMENTED", td->name); + _ASN_DECODE_FAILED; + } else { + for(edx = specs->roms_count; edx < specs->roms_count + + specs->aoms_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + if(!elm->default_value) continue; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + /* Set default value */ + if(elm->default_value(1, memb_ptr2)) { + FREEMEM(opres); + _ASN_DECODE_FAILED; + } + } + } + + rv.consumed = 0; + rv.code = RC_OK; + FREEMEM(opres); + return rv; +} + int SET_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { diff --git a/skeletons/constr_SET.h b/skeletons/constr_SET.h index 3adfb3367..0c78ed59c 100644 --- a/skeletons/constr_SET.h +++ b/skeletons/constr_SET.h @@ -52,6 +52,8 @@ ber_type_decoder_f SET_decode_ber; der_type_encoder_f SET_encode_der; xer_type_decoder_f SET_decode_xer; xer_type_encoder_f SET_encode_xer; +per_type_decoder_f SET_decode_uper; +per_type_encoder_f SET_encode_uper; /*********************** * Some handy helpers. * From ea3e32667f7d3ad314fb76c8a76c63419d134467 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 5 Sep 2006 16:20:36 +0000 Subject: [PATCH 1153/1469] oops git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1153 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SET.c | 138 ----------------------------------------- 1 file changed, 138 deletions(-) diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index b43f0a875..9b6012ff3 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -865,144 +865,6 @@ SET_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, _ASN_ENCODE_FAILED; } -asn_dec_rval_t -SET_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, - asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { - asn_SET_specifics_t *specs = (asn_SET_specifics_t *)td->specifics; - void *st = *sptr; /* Target structure. */ - int extpresent = 0; /* Extension additions are present */ - uint8_t *opres; /* Presence of optional root members */ - asn_per_data_t opmd; - asn_dec_rval_t rv; - int edx; - - (void)constraints; - - ASN_DEBUG("Decoding %s as SET", td->name); - - if(_ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx)) - _ASN_DECODE_FAILED; - - if(!st) { - st = *sptr = CALLOC(1, specs->struct_size); - if(!st) _ASN_DECODE_FAILED; - } - - ASN_DEBUG("Decoding %s as SEQUENCE (UPER)", td->name); - - /* Handle extensions */ - if(specs->ext_before >= 0) { - extpresent = per_get_few_bits(pd, 1); - if(extpresent < 0) _ASN_DECODE_FAILED; - } - - /* Prepare a place and read-in the presence bitmap */ - if(specs->roms_count) { - opres = (uint8_t *)MALLOC(((specs->roms_count + 7) >> 3) + 1); - if(!opres) _ASN_DECODE_FAILED; - /* Get the presence map */ - if(per_get_many_bits(pd, opres, 0, specs->roms_count)) { - FREEMEM(opres); - _ASN_DECODE_FAILED; - } - opmd.buffer = opres; - opmd.nboff = 0; - opmd.nbits = specs->roms_count; - ASN_DEBUG("Read in presence bitmap for %s of %d bits (%x..)", - td->name, specs->roms_count, *opres); - } else { - opres = 0; - memset(&opmd, 0, sizeof opmd); - } - - /* - * Get the sequence ROOT elements. - */ - for(edx = 0; edx < ((specs->ext_before < 0) - ? td->elements_count : specs->ext_before + 1); edx++) { - asn_TYPE_member_t *elm = &td->elements[edx]; - void *memb_ptr; /* Pointer to the member */ - void **memb_ptr2; /* Pointer to that pointer */ - - /* Fetch the pointer to this member */ - if(elm->flags & ATF_POINTER) { - memb_ptr2 = (void **)((char *)st + elm->memb_offset); - } else { - memb_ptr = (char *)st + elm->memb_offset; - memb_ptr2 = &memb_ptr; - } - - /* Deal with optionality */ - if(elm->optional) { - int present = per_get_few_bits(&opmd, 1); - ASN_DEBUG("Member %s->%s is optional, p=%d (%d->%d)", - td->name, elm->name, present, - (int)opmd.nboff, (int)opmd.nbits); - if(present == 0) { - /* This element is not present */ - if(elm->default_value) { - /* Fill-in DEFAULT */ - if(elm->default_value(1, memb_ptr2)) { - FREEMEM(opres); - _ASN_DECODE_FAILED; - } - } - /* The member is just not present */ - continue; - } - /* Fall through */ - } - - /* Fetch the member from the stream */ - ASN_DEBUG("Decoding member %s in %s", elm->name, td->name); - rv = elm->type->uper_decoder(opt_codec_ctx, elm->type, - elm->per_constraints, memb_ptr2, pd); - if(rv.code != RC_OK) { - ASN_DEBUG("Failed decode %s in %s", - elm->name, td->name); - FREEMEM(opres); - return rv; - } - } - - /* - * Deal with extensions. - */ - if(extpresent) { - ASN_DEBUG("Extensibility for %s: NOT IMPLEMENTED", td->name); - _ASN_DECODE_FAILED; - } else { - for(edx = specs->roms_count; edx < specs->roms_count - + specs->aoms_count; edx++) { - asn_TYPE_member_t *elm = &td->elements[edx]; - void *memb_ptr; /* Pointer to the member */ - void **memb_ptr2; /* Pointer to that pointer */ - - if(!elm->default_value) continue; - - /* Fetch the pointer to this member */ - if(elm->flags & ATF_POINTER) { - memb_ptr2 = (void **)((char *)st - + elm->memb_offset); - } else { - memb_ptr = (char *)st + elm->memb_offset; - memb_ptr2 = &memb_ptr; - } - - /* Set default value */ - if(elm->default_value(1, memb_ptr2)) { - FREEMEM(opres); - _ASN_DECODE_FAILED; - } - } - } - - rv.consumed = 0; - rv.code = RC_OK; - FREEMEM(opres); - return rv; -} - int SET_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { From a89a4b07b6dc451fac793e4a814ddb418bb0ee36 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 5 Sep 2006 16:21:14 +0000 Subject: [PATCH 1154/1469] real test git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1154 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/117-real-constraint-OK.asn1 | 16 ++++++++++++++++ tests/117-real-constraint-OK.asn1.-EF | 8 ++++++++ 2 files changed, 24 insertions(+) create mode 100644 tests/117-real-constraint-OK.asn1 create mode 100644 tests/117-real-constraint-OK.asn1.-EF diff --git a/tests/117-real-constraint-OK.asn1 b/tests/117-real-constraint-OK.asn1 new file mode 100644 index 000000000..7e0e5cd7c --- /dev/null +++ b/tests/117-real-constraint-OK.asn1 @@ -0,0 +1,16 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .117 + +ModuleRealConstraint + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 117 } + DEFINITIONS ::= +BEGIN + + R ::= REAL (0..3.14159265) + +END diff --git a/tests/117-real-constraint-OK.asn1.-EF b/tests/117-real-constraint-OK.asn1.-EF new file mode 100644 index 000000000..2745e1445 --- /dev/null +++ b/tests/117-real-constraint-OK.asn1.-EF @@ -0,0 +1,8 @@ +ModuleRealConstraint { iso org(3) dod(6) internet(1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 117 } +DEFINITIONS ::= +BEGIN + +R ::= REAL (0..3.141593) + +END From e690952f312a77abd4d86a548cc0e23a3e6b622e Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 8 Sep 2006 01:56:32 +0000 Subject: [PATCH 1155/1469] encoding bug git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1155 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/INTEGER.c | 1 + 1 file changed, 1 insertion(+) diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index e9f61ac01..3643465c2 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -598,6 +598,7 @@ INTEGER_encode_uper(asn_TYPE_descriptor_t *td, _ASN_ENCODE_FAILED; if(per_put_many_bits(po, buf, 8 * mayEncode)) _ASN_ENCODE_FAILED; + buf += mayEncode; } _ASN_ENCODED_OK(er); From 417494060a2d5aff18105cd90f3085b6ba194b81 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 8 Sep 2006 19:34:22 +0000 Subject: [PATCH 1156/1469] unused bits git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1156 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_constraint.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index b44b4ebc3..74bbb7af9 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -505,7 +505,7 @@ emit_size_determination_code(arg_t *arg, asn1p_expr_type_e etype) { case ASN_BASIC_BIT_STRING: OUT("if(st->size > 0) {\n"); OUT("\t/* Size in bits */\n"); - OUT("\tsize = 8 * (st->size - 1) - (st->buf[0] & 0x7);\n"); + OUT("\tsize = 8 * st->size - (st->bits_unused & 0x07);\n"); OUT("} else {\n"); OUT("\tsize = 0;\n"); OUT("}\n"); From b609cf66c9f4516ec882a7fe3b693db9f25b4f62 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 8 Sep 2006 19:38:11 +0000 Subject: [PATCH 1157/1469] bit string constraint checking changed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1157 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/19-param-OK.asn1.-P | 2 +- tests/72-same-names-OK.asn1.-P | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/19-param-OK.asn1.-P b/tests/19-param-OK.asn1.-P index 5f21cd418..a7f8e7b2d 100644 --- a/tests/19-param-OK.asn1.-P +++ b/tests/19-param-OK.asn1.-P @@ -46,7 +46,7 @@ memb_signature_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, if(st->size > 0) { /* Size in bits */ - size = 8 * (st->size - 1) - (st->buf[0] & 0x7); + size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } diff --git a/tests/72-same-names-OK.asn1.-P b/tests/72-same-names-OK.asn1.-P index 5f106f81e..38b1fe6dc 100644 --- a/tests/72-same-names-OK.asn1.-P +++ b/tests/72-same-names-OK.asn1.-P @@ -424,7 +424,7 @@ memb_a_constraint_3(asn_TYPE_descriptor_t *td, const void *sptr, if(st->size > 0) { /* Size in bits */ - size = 8 * (st->size - 1) - (st->buf[0] & 0x7); + size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } @@ -455,7 +455,7 @@ memb_a_constraint_8(asn_TYPE_descriptor_t *td, const void *sptr, if(st->size > 0) { /* Size in bits */ - size = 8 * (st->size - 1) - (st->buf[0] & 0x7); + size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } From 2cc16200b7cbe2555412023e0a440cd5a7affb91 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 9 Sep 2006 04:49:45 +0000 Subject: [PATCH 1158/1469] MEGACO (Media Gateway Control) protocol decoder git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1158 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 3 +- Makefile.in | 2 - asn1c/Makefile.in | 2 - asn1c/tests/Makefile.in | 2 - asn1c/webcgi/Makefile.in | 2 - doc/Makefile.in | 2 - examples/Makefile.am | 9 +- examples/Makefile.in | 11 +- examples/README | 9 +- examples/rfc3525.txt | 11931 +++++++++++++++++++++++ examples/sample.source.MEGACO/Makefile | 322 + examples/sample.source.MEGACO/README | 20 + examples/sample.source.MEGACO/config.h | 10 + libasn1compiler/Makefile.in | 2 - libasn1fix/Makefile.in | 2 - libasn1parser/Makefile.in | 2 - libasn1print/Makefile.in | 2 - skeletons/Makefile.in | 2 - skeletons/standard-modules/Makefile.in | 2 - skeletons/tests/Makefile.in | 2 - tests/Makefile.in | 2 - 21 files changed, 12308 insertions(+), 33 deletions(-) create mode 100644 examples/rfc3525.txt create mode 100644 examples/sample.source.MEGACO/Makefile create mode 100644 examples/sample.source.MEGACO/README create mode 100644 examples/sample.source.MEGACO/config.h diff --git a/ChangeLog b/ChangeLog index d2c2c9e99..543566704 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9.21: 2006-Aug-27 +0.9.21: 2006-Sep-08 * skeletons/standard-modules directory is now used for standard types. * Fixed class field access problem (Test case 98) @@ -10,6 +10,7 @@ * Refactored ValueSetTypeAssignment parsing. * First release of PER encoder (does not encode SETs yet). * asn-decoder-template.c renamed into converter-sample.c + * MEGACO (Media Gateway Control Protocol) decoder sample added. 0.9.20: 2006-Mar-06 diff --git a/Makefile.in b/Makefile.in index d035951b1..682c0824f 100644 --- a/Makefile.in +++ b/Makefile.in @@ -97,8 +97,6 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ -CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ -CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ diff --git a/asn1c/Makefile.in b/asn1c/Makefile.in index 1c9f15623..4f596bdb4 100644 --- a/asn1c/Makefile.in +++ b/asn1c/Makefile.in @@ -105,8 +105,6 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ -CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ -CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ diff --git a/asn1c/tests/Makefile.in b/asn1c/tests/Makefile.in index b1047f515..27f3f4bf1 100644 --- a/asn1c/tests/Makefile.in +++ b/asn1c/tests/Makefile.in @@ -62,8 +62,6 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ -CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ -CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ diff --git a/asn1c/webcgi/Makefile.in b/asn1c/webcgi/Makefile.in index bb227317b..36d081b96 100644 --- a/asn1c/webcgi/Makefile.in +++ b/asn1c/webcgi/Makefile.in @@ -83,8 +83,6 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ -CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ -CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ diff --git a/doc/Makefile.in b/doc/Makefile.in index 3e4fbecad..c636f1549 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -72,8 +72,6 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ -CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ -CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ diff --git a/examples/Makefile.am b/examples/Makefile.am index 76f23f605..a89d25e2a 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -6,11 +6,18 @@ ASN1_FILES_1 = \ rfc3280-PKIX1Explicit88.asn1 \ rfc3280-PKIX1Implicit88.asn1 -all: $(ASN1_FILES_1) +ASN1_SOURCE_2 = rfc3525.txt +ASN1_FILES_2 = \ + rfc3525-MEDIA-GATEWAY-CONTROL.asn1 + +all: $(ASN1_FILES_1) $(ASN1_FILES_2) $(ASN1_FILES_1): crfc2asn1.pl $(ASN1_SOURCE_1) ./crfc2asn1.pl $(ASN1_SOURCE_1) +$(ASN1_FILES_2): crfc2asn1.pl $(ASN1_SOURCE_2) + ./crfc2asn1.pl $(ASN1_SOURCE_2) + EXTRA_DIST = $(srcdir)/rfc*.txt \ $(srcdir)/sample.source.PKIX1/README \ $(srcdir)/sample.source.PKIX1/config.h \ diff --git a/examples/Makefile.in b/examples/Makefile.in index e835a8694..267dd2101 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -67,8 +67,6 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ -CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ -CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ @@ -170,6 +168,10 @@ ASN1_FILES_1 = \ rfc3280-PKIX1Explicit88.asn1 \ rfc3280-PKIX1Implicit88.asn1 +ASN1_SOURCE_2 = rfc3525.txt +ASN1_FILES_2 = \ + rfc3525-MEDIA-GATEWAY-CONTROL.asn1 + EXTRA_DIST = $(srcdir)/rfc*.txt \ $(srcdir)/sample.source.PKIX1/README \ $(srcdir)/sample.source.PKIX1/config.h \ @@ -367,11 +369,14 @@ uninstall-am: uninstall-dist_binSCRIPTS uninstall-info-am uninstall-dist_binSCRIPTS uninstall-info-am -all: $(ASN1_FILES_1) +all: $(ASN1_FILES_1) $(ASN1_FILES_2) $(ASN1_FILES_1): crfc2asn1.pl $(ASN1_SOURCE_1) ./crfc2asn1.pl $(ASN1_SOURCE_1) +$(ASN1_FILES_2): crfc2asn1.pl $(ASN1_SOURCE_2) + ./crfc2asn1.pl $(ASN1_SOURCE_2) + clean-local: cd sample.source.PKIX1 && make distclean cd sample.source.TAP3 && make distclean diff --git a/examples/README b/examples/README index 5f554f2ba..7d1e230b6 100644 --- a/examples/README +++ b/examples/README @@ -1,5 +1,5 @@ -This directory contains a examples of ASN.1 converters. +This directory contains a few examples. 1. The ./sample.source.PKIX1 directory contains the X.509 Certificate decoder. @@ -10,8 +10,13 @@ This directory contains a examples of ASN.1 converters. ISO 13522 MHEG-5/ITU-T T.172 (Multimedia Hypermedia Experts Group, Multimedia Presentations). Read the README file in that directory. +3. The ./sample.source.MEGACO directory contains the decoder for + Media Gateway Control Protocol data units as specified in rfc3525.txt. + The crfc2asn1.pl script can be used to extract ASN.1 data from RFC texts. -For instance, it is used to extract X.509 ASN.1 modules from PKIX1 RFCs. +For instance, it is used to extract X.509 ASN.1 modules from PKIX1 RFC +and MEGACO ASN.1 module from rfc3525.txt. + To regenerate the .asn1 files from the original RFC texts, do `rm *.asn1; make`. The clyx2asn1.pl script can be used to extract ASN.1 data from LyX editor files. diff --git a/examples/rfc3525.txt b/examples/rfc3525.txt new file mode 100644 index 000000000..80663cc2c --- /dev/null +++ b/examples/rfc3525.txt @@ -0,0 +1,11931 @@ + + + + + + +Network Working Group C. Groves +Request for Comments: 3525 M. Pantaleo +Obsoletes: 3015 LM Ericsson +Category: Standards Track T. Anderson + Consultant + T. Taylor + Nortel Networks + Editors + June 2003 + + + Gateway Control Protocol Version 1 + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (2003). All Rights Reserved. + +Abstract + + This document defines the protocol used between elements of a + physically decomposed multimedia gateway, i.e., a Media Gateway and a + Media Gateway Controller. The protocol presented in this document + meets the requirements for a media gateway control protocol as + presented in RFC 2805. + + This document replaces RFC 3015. It is the result of continued + cooperation between the IETF Megaco Working Group and ITU-T Study + Group 16. It incorporates the original text of RFC 3015, modified by + corrections and clarifications discussed on the Megaco + E-mail list and incorporated into the Study Group 16 Implementor's + Guide for Recommendation H.248. The present version of this document + underwent ITU-T Last Call as Recommendation H.248 Amendment 1. + Because of ITU-T renumbering, it was published by the ITU-T as + Recommendation H.248.1 (03/2002), Gateway Control Protocol Version 1. + + Users of this specification are advised to consult the H.248 Sub- + series Implementors' Guide at http://www.itu.int/itudoc/itu- + t/com16/implgd for additional corrections and clarifications. + + + + + +Groves, et al. Standards Track [Page 1] + +RFC 3525 Gateway Control Protocol June 2003 + + +Conventions used in this document + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in RFC 2119 [RFC2119]. + +Table of Contents + + 1 Scope.........................................................5 + 1.1 Changes From RFC 3015.....................................5 + 1.2 Differences From ITU-T Recommendation H.248.1 (03/2002)...5 + 2 References....................................................6 + 2.1 Normative references......................................6 + 2.2 Informative references....................................9 + 3 Definitions..................................................10 + 4 Abbreviations................................................11 + 5 Conventions..................................................12 + 6 Connection model.............................................13 + 6.1 Contexts.................................................16 + 6.2 Terminations.............................................17 + 6.2.1 Termination dynamics.................................21 + 6.2.2 TerminationIDs.......................................21 + 6.2.3 Packages.............................................22 + 6.2.4 Termination properties and descriptors...............23 + 6.2.5 Root Termination.....................................25 + 7 Commands.....................................................26 + 7.1 Descriptors..............................................27 + 7.1.1 Specifying parameters................................27 + 7.1.2 Modem descriptor.....................................28 + 7.1.3 Multiplex descriptor.................................28 + 7.1.4 Media descriptor.....................................29 + 7.1.5 TerminationState descriptor..........................29 + 7.1.6 Stream descriptor....................................30 + 7.1.7 LocalControl descriptor..............................31 + 7.1.8 Local and Remote descriptors.........................32 + 7.1.9 Events descriptor....................................35 + 7.1.10 EventBuffer descriptor..............................38 + 7.1.11 Signals descriptor..................................38 + 7.1.12 Audit descriptor....................................40 + 7.1.13 ServiceChange descriptor............................41 + 7.1.14 DigitMap descriptor.................................41 + 7.1.15 Statistics descriptor...............................46 + 7.1.16 Packages descriptor.................................47 + 7.1.17 ObservedEvents descriptor...........................47 + 7.1.18 Topology descriptor.................................47 + 7.1.19 Error Descriptor....................................50 + 7.2 Command Application Programming Interface................50 + 7.2.1 Add..................................................51 + + + +Groves, et al. Standards Track [Page 2] + +RFC 3525 Gateway Control Protocol June 2003 + + + 7.2.2 Modify...............................................52 + 7.2.3 Subtract.............................................53 + 7.2.4 Move.................................................55 + 7.2.5 AuditValue...........................................56 + 7.2.6 AuditCapabilities....................................59 + 7.2.7 Notify...............................................60 + 7.2.8 ServiceChange........................................61 + 7.2.9 Manipulating and Auditing Context Attributes.........65 + 7.2.10 Generic Command Syntax..............................66 + 7.3 Command Error Codes......................................66 + 8 Transactions.................................................66 + 8.1 Common parameters........................................68 + 8.1.1 Transaction Identifiers..............................68 + 8.1.2 Context Identifiers..................................68 + 8.2 Transaction Application Programming Interface............69 + 8.2.1 TransactionRequest...................................69 + 8.2.2 TransactionReply.....................................69 + 8.2.3 TransactionPending...................................71 + 8.3 Messages.................................................72 + 9 Transport....................................................72 + 9.1 Ordering of Commands.....................................73 + 9.2 Protection against Restart Avalanche.....................74 + 10 Security Considerations.....................................75 + 10.1 Protection of Protocol Connections......................75 + 10.2 Interim AH scheme.......................................76 + 10.3 Protection of Media Connections.........................77 + 11 MG-MGC Control Interface....................................78 + 11.1 Multiple Virtual MGs....................................78 + 11.2 Cold start..............................................79 + 11.3 Negotiation of protocol version.........................79 + 11.4 Failure of a MG.........................................80 + 11.5 Failure of an MGC.......................................81 + 12 Package definition..........................................82 + 12.1 Guidelines for defining packages........................82 + 12.1.1 Package.............................................83 + 12.1.2 Properties..........................................84 + 12.1.3 Events..............................................85 + 12.1.4 Signals.............................................85 + 12.1.5 Statistics..........................................86 + 12.1.6 Procedures..........................................86 + 12.2 Guidelines to defining Parameters to Events and Signals.86 + 12.3 Lists...................................................87 + 12.4 Identifiers.............................................87 + 12.5 Package registration....................................88 + 13 IANA Considerations.........................................88 + 13.1 Packages................................................88 + 13.2 Error codes.............................................89 + 13.3 ServiceChange reasons...................................89 + + + +Groves, et al. Standards Track [Page 3] + +RFC 3525 Gateway Control Protocol June 2003 + + + ANNEX A Binary encoding of the protocol.......................90 + A.1 Coding of wildcards......................................90 + A.2 ASN.1 syntax specification...............................92 + A.3 Digit maps and path names...............................111 + ANNEX B Text encoding of the protocol.........................113 + B.1 Coding of wildcards.....................................113 + B.2 ABNF specification......................................113 + B.3 Hexadecimal octet coding................................127 + B.4 Hexadecimal octet sequence..............................127 + ANNEX C Tags for media stream properties......................128 + C.1 General media attributes................................128 + C.2 Mux properties..........................................130 + C.3 General bearer properties...............................130 + C.4 General ATM properties..................................130 + C.5 Frame Relay.............................................134 + C.6 IP......................................................134 + C.7 ATM AAL2................................................134 + C.8 ATM AAL1................................................136 + C.9 Bearer capabilities.....................................137 + C.10 AAL5 properties........................................147 + C.11 SDP equivalents........................................148 + C.12 H.245..................................................149 + ANNEX D Transport over IP.....................................150 + D.1 Transport over IP/UDP using Application Level Framing ..150 + D.1.1 Providing At-Most-Once functionality................150 + D.1.2 Transaction identifiers and three-way handshake.....151 + D.1.3 Computing retransmission timers.....................152 + D.1.4 Provisional responses...............................153 + D.1.5 Repeating Requests, Responses and Acknowledgements..153 + D.2 Using TCP...............................................155 + D.2.1 Providing the At-Most-Once functionality............155 + D.2.2 Transaction identifiers and three-way handshake.....155 + D.2.3 Computing retransmission timers.....................156 + D.2.4 Provisional responses...............................156 + D.2.5 Ordering of commands................................156 + ANNEX E Basic packages.......................................157 + E.1 Generic.................................................157 + E.2 Base Root Package.......................................159 + E.3 Tone Generator Package..................................161 + E.4 Tone Detection Package..................................163 + E.5 Basic DTMF Generator Package............................166 + E.6 DTMF detection Package..................................167 + E.7 Call Progress Tones Generator Package...................169 + E.8 Call Progress Tones Detection Package...................171 + E.9 Analog Line Supervision Package.........................172 + E.10 Basic Continuity Package...............................175 + E.11 Network Package........................................178 + E.12 RTP Package............................................180 + + + +Groves, et al. Standards Track [Page 4] + +RFC 3525 Gateway Control Protocol June 2003 + + + E.13 TDM Circuit Package....................................182 + APPENDIX I EXAMPLE CALL FLOWS (INFORMATIVE)...................184 + A.1 Residential Gateway to Residential Gateway Call.........184 + A.1.1 Programming Residential GW Analog Line Terminations + for Idle Behavior...................................184 + A.1.2 Collecting Originator Digits and Initiating + Termination.........................................186 + APPENDIX II Changes From RFC 3015............................195 + Intellectual Property Rights..................................210 + Acknowledgments...............................................211 + Authors' Addresses............................................212 + Full Copyright Statement......................................213 + +1 Scope + + The present document, which is identical to the published version of + ITU-T Recommendation H.248.1 (03/2002) except as noted below, defines + the protocols used between elements of a physically decomposed + multimedia gateway. There are no functional differences from a + system view between a decomposed gateway, with distributed sub- + components potentially on more than one physical device, and a + monolithic gateway such as described in ITU-T Recommendation H.246. + This document does not define how gateways, multipoint control units + or interactive voice response units (IVRs) work. Instead it creates + a general framework that is suitable for these applications. + + Packet network interfaces may include IP, ATM or possibly others. + The interfaces will support a variety of Switched Circuit Network + (SCN) signalling systems, including tone signalling, ISDN, ISUP, QSIG + and GSM. National variants of these signalling systems will be + supported where applicable. + +1.1 Changes From RFC 3015 + + The differences between this document and RFC 3015 are documented in + Appendix II. + +1.2 Differences From ITU-T Recommendation H.248.1 (03/2002) + + This document differs from the corresponding ITU-T publication in the + following respects: + + - Added IETF front matter in place of the corresponding ITU-T + material. + + - The ITU-T summary is too H.323-specific and has been omitted. + + + + + +Groves, et al. Standards Track [Page 5] + +RFC 3525 Gateway Control Protocol June 2003 + + + - The IETF conventions have been stated as governing this document. + As discussed in section 5 below, this gives slightly greater + strength to "should" requirements. + + - The Scope section (just above) has been edited slightly to suit + its IETF context. + + - Added normative references to RFCs 2026 and 2119. + + - Figures 4, 5, and 6 show the centre of the context for greater + clarity. Also added Figure 6a showing an important additional + example. + + - Added a paragraph in section 7.1.18 which was approved in the + Implementor's Guide but lost inadvertently in the ITU-T approved + version. + + - This document incorporates corrections to the informative examples + in Appendix I which also appear in H.248.1 version 2, but which + were not picked up in H.248.1 (03/2002). + + - This document includes a new Appendix II listing all the changes + from RFC 3015. + + - This document includes an Acknowledgements section listing the + authors of RFC 3015 but also many other people who contributed to + the development of the Megaco/H.248.x protocol. + + - Moved the Intellectual Property declaration to its usual place in + an IETF document and added a reference to declarations on the IETF + web site. + +2 References + + The following ITU-T Recommendations and other references contain + provisions which, through reference in this text, constitute + provisions of this RFC. At the time of publication, the editions + indicated were valid. All Recommendations and other references are + subject to revision; all users of this RFC are therefore encouraged + to investigate the possibility of applying the most recent edition of + the Recommendations and other references listed below. A list of the + currently valid ITU-T Recommendations is regularly published. + +2.1 Normative references + + - ITU-T Recommendation H.225.0 (1999), Call signalling protocols and + media stream packetization for packet-based multimedia + communication systems. + + + +Groves, et al. Standards Track [Page 6] + +RFC 3525 Gateway Control Protocol June 2003 + + + - ITU-T Recommendation H.235 (1998), Security and encryption for + H-Series (H.323 and other H.245-based) multimedia terminals. + + - ITU-T Recommendation H.245 (1998), Control protocol for multimedia + communication. + + - ITU-T Recommendation H.246 (1998), Interworking of H-series + multimedia terminals with H-series multimedia terminals and + voice/voiceband terminals on GSTN and ISDN. + + - ITU-T Recommendation H.248.8 (2002), H.248 Error Codes and Service + Change Reasons. + + - ITU-T Recommendation H.323 (1999), Packet-based multimedia + communication systems. + + - ITU-T Recommendation I.363.1 (1996), B-ISDN ATM adaptation layer + (AAL) specification: Type 1 AAL. + + - ITU-T Recommendation I.363.2 (1997), B-ISDN ATM adaptation layer + (AAL) specification: Type 2 AAL. + + - ITU-T Recommendation I.363.5 (1996), B-ISDN ATM adaptation layer + (AAL) specification: Type 5 AAL. + + - ITU-T Recommendation I.366.1 (1998), Segmentation and Reassembly + Service Specific Convergence Sublayer for the AAL type 2. + + - ITU-T Recommendation I.366.2 (1999), AAL type 2 service specific + convergence sublayer for trunking. + + - ITU-T Recommendation I.371 (2000), Traffic control and congestion + control in B-ISDN. + + - ITU-T Recommendation Q.763 (1999), Signalling System No. 7 - ISDN + user part formats and codes. + + - ITU-T Recommendation Q.765.5 (2001), Application transport + mechanism - Bearer independent call control (BICC). + + - ITU-T Recommendation Q.931 (1998), ISDN user-network interface + layer 3 specification for basic call control. + + - ITU-T Recommendation Q.2630.1 (1999), AAL type 2 signalling + protocol (Capability Set 1). + + + + + + +Groves, et al. Standards Track [Page 7] + +RFC 3525 Gateway Control Protocol June 2003 + + + - ITU-T Recommendation Q.2931 (1995), Digital Subscriber Signalling + System No. 2 (DSS2) - User-Network Interface (UNI) - Layer 3 + specification for basic call/connection control. + + - ITU-T Recommendation Q.2941.1 (1997), Digital Subscriber + Signalling System No. 2 - Generic identifier transport. + + - ITU-T Recommendation Q.2961.1 (1995), Additional signalling + capabilities to support traffic parameters for the tagging option + and the sustainable call rate parameter set. + + - ITU-T Recommendation Q.2961.2 (1997), Additional traffic + parameters: Support of ATM transfer capability in the broadband + bearer capability information element. + + - ITU-T Recommendation Q.2965.1 (1999), Digital subscriber + signalling system No. 2 - Support of Quality of Service classes. + + - ITU-T Recommendation Q.2965.2 (1999), Digital subscriber + signalling system No. 2 - Signalling of individual Quality of + Service parameters. + + - ITU-T Recommendation V.76 (1996), Generic multiplexer using V.42 + LAPM-based procedures. + + - ITU-T Recommendation X.213 (1995), Information technology - Open + Systems Interconnection - Network service definition plus + Amendment 1 (1997), Addition of the Internet protocol address + format identifier. + + - ITU-T Recommendation X.680 (1997), Information technology - + Abstract Syntax Notation One (ASN.1): Specification of basic + notation. + + - ITU-T Recommendation X.690 (1997), Information Technology - ASN.1 + Encoding Rules: Specification of Basic Encoding Rules (BER), + Canonical Encoding Rules (CER) and Distinguished Encoding Rules + (DER). + + - ATM Forum (1996), ATM User-Network Interface (UNI) Signalling + Specification - Version 4.0. + + [RFC 1006] Rose, M. and D. Cass, "ISO Transport Service on top of the + TCP, Version 3", STD 35, RFC 1006, May 1987. + + [RFC 2026] Brander, S., "The Internet Standards Process -- Revision + 3", BCP 9, RFC 2026, October 1996. + + + + +Groves, et al. Standards Track [Page 8] + +RFC 3525 Gateway Control Protocol June 2003 + + + [RFC 2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [RFC 2234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", RFC 2234, November 1997. + + [RFC 2327] Handley, M. and V. Jacobson, "SDP: Session Description + Protocol", RFC 2327, April 1998. + + [RFC 2402] Kent, S. and R. Atkinson, "IP Authentication Header", RFC + 2402, November 1998. + + [RFC 2406] Kent, S. and R. Atkinson, "IP Encapsulating Security + Payload (ESP)", RFC 2406, November 1998. + +2.2 Informative references + + - ITU-T Recommendation E.180/Q.35 (1998), Technical characteristics + of tones for the telephone service. + + - CCITT Recommendation G.711 (1988), Pulse Code Modulation (PCM) of + voice frequencies. + + - ITU-T Recommendation H.221 (1999), Frame structure for a 64 to + 1920 kbit/s channel in audiovisual teleservices. + + - ITU T Recommendation H.223 (1996), Multiplexing protocol for low + bit rate multimedia communication. + + - ITU-T Recommendation H.226 (1998), Channel aggregation protocol + for multilink operation on circuit-switched networks + + - ITU-T Recommendation Q.724 (1998), Signalling procedures. + + - ITU-T Recommendation Q.764 (1999), Signalling system No. 7 - ISDN + user part signalling procedures. + + - ITU-T Recommendation Q.1902.4 (2001), Bearer independent call + control protocol - Basic call procedures. + + [RFC 768] Postel, J., "User Datagram Protocol", STD 6, RFC 768, + August 1980. + + [RFC 791] Postel, J., "Internet Protocol", STD 5, RFC 791, September + 1981. + + [RFC 793] Postel, J., "Transmission Control Protocol", STD 7, RFC + 793, September 1981. + + + +Groves, et al. Standards Track [Page 9] + +RFC 3525 Gateway Control Protocol June 2003 + + + [RFC 1661] Simpson, W., Ed., "The Point-to-Point Protocol (PPP)", STD + 51, RFC 1661, July 1994. + + [RFC 1889] Schulzrinne, H., Casner, S., Frederick, R. and V. + Jacobson, "RTP: A Transport Protocol for Real-Time + Applications", RFC 1889, January 1996. + + [RFC 1890] Schulzrinne, H. and G. Fokus, "RTP Profile for Audio and + Video Conferences with Minimal Control", RFC 1890, + January 1996. + + [RFC 2401] Kent, S. and R. Atkinson, "Security Architecture for the + Internet Protocol", RFC 2401, November 1998. + + [RFC 2460] Deering, S. and R. Hinden, "Internet Protocol, Version 6 + (IPv6) Specification", RFC 2460, December 1998. + + [RFC 2543] Handley, M., Schulzrinne, H., Schooler, E. and J. + Rosenberg, "SIP: Session Initiation Protocol", RFC 2543, + March 1999. + + [RFC 2805] Greene, N., Ramalho, M. and B. Rosen, "Media Gateway + Control Protocol Architecture and Requirements", RFC 2805, + April 2000. + +3 Definitions + + This document defines the following terms: + + Access gateway: + A type of gateway that provides a User-Network Interface (UNI) such + as ISDN. + + Descriptor: + A syntactic element of the protocol that groups related properties. + For instance, the properties of a media flow on the MG can be set by + the MGC by including the appropriate descriptor in a command. + + Media Gateway (MG): + The media gateway converts media provided in one type of network to + the format required in another type of network. For example, a MG + could terminate bearer channels from a switched circuit network + (e.g., DS0s) and media streams from a packet network (e.g., RTP + streams in an IP network). This gateway may be capable of processing + audio, video and T.120 alone or in any combination, and will be + capable of full duplex media translations. The MG may also play + audio/video messages and perform other IVR functions, or may perform + media conferencing. + + + +Groves, et al. Standards Track [Page 10] + +RFC 3525 Gateway Control Protocol June 2003 + + + Media Gateway Controller (MGC): + Controls the parts of the call state that pertain to connection + control for media channels in a MG. + + Multipoint Control Unit (MCU): + An entity that controls the setup and coordination of a multi-user + conference that typically includes processing of audio, video and + data. + + Residential gateway: + A gateway that interworks an analogue line to a packet network. A + residential gateway typically contains one or two analogue lines and + is located at the customer premises. + + SCN FAS signalling gateway: + This function contains the SCN Signalling Interface that terminates + SS7, ISDN or other signalling links where the call control channel + and bearer channels are collocated in the same physical span. + + SCN NFAS signalling gateway: + This function contains the SCN Signalling Interface that terminates + SS7 or other signalling links where the call control channels are + separated from bearer channels. + + Stream: + Bidirectional media or control flow received/sent by a media gateway + as part of a call or conference. + + Trunk: + A communication channel between two switching systems such as a DS0 + on a T1 or E1 line. + + Trunking gateway: + A gateway between SCN network and packet network that typically + terminates a large number of digital circuits. + +4 Abbreviations + + This RFC document uses the following abbreviations: + + ALF Application Layer Framing + + ATM Asynchronous Transfer Mode + + CAS Channel Associated Signalling + + DTMF Dual Tone Multi-Frequency + + + + +Groves, et al. Standards Track [Page 11] + +RFC 3525 Gateway Control Protocol June 2003 + + + FAS Facility Associated Signalling + + GSM Global System for Mobile communications + + GW GateWay + + IANA Internet Assigned Numbers Authority (superseded by Internet + Corporation for Assigned Names and Numbers - ICANN) + + IP Internet Protocol + + ISUP ISDN User Part + + IVR Interactive Voice Response + + MG Media Gateway + + MGC Media Gateway Controller + + NFAS Non-Facility Associated Signalling + + PRI Primary Rate Interface + + PSTN Public Switched Telephone Network + + QoS Quality of Service + + RTP Real-time Transport Protocol + + SCN Switched Circuit Network + + SG Signalling Gateway + + SS7 Signalling System No. 7 + +5 Conventions + + In the H.248.1 Recommendation, "SHALL" refers to a mandatory + requirement, while "SHOULD" refers to a suggested but optional + feature or procedure. The term "MAY" refers to an optional course of + action without expressing a preference. Note that these definition + are overridden in the present document by the RFC 2119 conventions + stated at the beginning of this document. RFC 2119 has a more + precise definition of "should" than is provided by the ITU-T. + + + + + + + +Groves, et al. Standards Track [Page 12] + +RFC 3525 Gateway Control Protocol June 2003 + + +6 Connection model + + The connection model for the protocol describes the logical entities, + or objects, within the Media Gateway that can be controlled by the + Media Gateway Controller. The main abstractions used in the + connection model are Terminations and Contexts. + + A Termination sources and/or sinks one or more streams. In a + multimedia conference, a Termination can be multimedia and sources or + sinks multiple media streams. The media stream parameters, as well + as modem, and bearer parameters are encapsulated within the + Termination. + + A Context is an association between a collection of Terminations. + There is a special type of Context, the null Context, which contains + all Terminations that are not associated to any other Termination. + For instance, in a decomposed access gateway, all idle lines are + represented by Terminations in the null Context. + + Following is a graphical depiction of these concepts. The diagram of + Figure 1 gives several examples and is not meant to be an + all-inclusive illustration. The asterisk box in each of the Contexts + represents the logical association of Terminations implied by the + Context. + + + + + + + + + + + + + + + + + + + + + + + + + + + +Groves, et al. Standards Track [Page 13] + +RFC 3525 Gateway Control Protocol June 2003 + + + +------------------------------------------------------+ + |Media Gateway | + | +-------------------------------------------------+ | + | |Context +-------------+ | | + | | | Termination | | | + | | |-------------| | | + | | +-------------+ +->| SCN Bearer |<---+-> + | | | Termination | +-----+ | | Channel | | | + | | |-------------| | |---+ +-------------+ | | + <-+--->| RTP Stream |---| * | | | + | | | | | |---+ +-------------+ | | + | | +-------------+ +-----+ | | Termination | | | + | | | |-------------| | | + | | +->| SCN Bearer |<---+-> + | | | Channel | | | + | | +-------------+ | | + | +-------------------------------------------------+ | + | | + | | + | +------------------------------+ | + | (NULL Context) |Context | | + | +-------------+ | +-------------+ | | + | | Termination | | +-----+ | Termination | | | + | |-------------| | | | |-------------| | | + | | SCN Bearer | | | * |------| SCN Bearer |<---+-> + | | Channel | | | | | Channel | | | + | +-------------+ | +-----+ +-------------+ | | + | +------------------------------+ | + | | + | | + | +-------------------------------------------------+ | + | |Context | | + | | +-------------+ +-------------+ | | + | | | Termination | +-----+ | Termination | | | + | | |-------------| | | |-------------| | | + <-+--->| SCN Bearer |---| * |------| SCN Bearer |<---+-> + | | | Channel | | | | Channel | | | + | | +-------------+ +-----+ +-------------+ | | + | +-------------------------------------------------+ | + | ___________________________________________________ | + +------------------------------------------------------+ + + Figure 1: Examples of Megaco/H.248 Connection Model + + + + + + + + +Groves, et al. Standards Track [Page 14] + +RFC 3525 Gateway Control Protocol June 2003 + + + The example in Figure 2 shows an example of one way to accomplish a + call-waiting scenario in a decomposed access gateway, illustrating + the relocation of a Termination between Contexts. Terminations T1 + and T2 belong to Context C1 in a two-way audio call. A second audio + call is waiting for T1 from Termination T3. T3 is alone in Context + C2. T1 accepts the call from T3, placing T2 on hold. This action + results in T1 moving into Context C2, as shown in Figure 3. + + +------------------------------------------------------+ + |Media Gateway | + | +-------------------------------------------------+ | + | |Context C1 | | + | | +-------------+ +-------------+ | | + | | | Term. T2 | +-----+ | Term. T1 | | | + | | |-------------| | | |-------------| | | + <-+--->| RTP Stream |---| * |------| SCN Bearer |<---+-> + | | | | | | | Channel | | | + | | +-------------+ +-----+ +-------------+ | | + | +-------------------------------------------------+ | + | | + | +-------------------------------------------------+ | + | |Context C2 | | + | | +-------------+ | | + | | +-----+ | Term. T3 | | | + | | | | |-------------| | | + | | | * |------| SCN Bearer |<---+-> + | | | | | Channel | | | + | | +-----+ +-------------+ | | + | +-------------------------------------------------+ | + +------------------------------------------------------+ + + Figure 2: Example Call Waiting Scenario / Alerting Applied to T1 + + + + + + + + + + + + + + + + + + + +Groves, et al. Standards Track [Page 15] + +RFC 3525 Gateway Control Protocol June 2003 + + + +------------------------------------------------------+ + |Media Gateway | + | +-------------------------------------------------+ | + | |Context C1 | | + | | +-------------+ | | + | | | Term. T2 | +-----+ | | + | | |-------------| | | | | + <-+--->| RTP Stream |---| * | | | + | | | | | | | | + | | +-------------+ +-----+ | | + | +-------------------------------------------------+ | + | | + | +-------------------------------------------------+ | + | |Context C2 | | + | | +-------------+ +-------------+ | | + | | | Term. T1 | +-----+ | Term. T3 | | | + | | |-------------| | | |-------------| | | + <-+--->| SCN Bearer |---| * |------| SCN Bearer |<---+-> + | | | Channel | | | | Channel | | | + | | +-------------+ +-----+ +-------------+ | | + | +-------------------------------------------------+ | + +------------------------------------------------------+ + + Figure 3. Example Call Waiting Scenario / Answer by T1 + +6.1 Contexts + + A Context is an association between a number of Terminations. The + Context describes the topology (who hears/sees whom) and the media + mixing and/or switching parameters if more than two Terminations are + involved in the association. + + There is a special Context called the null Context. It contains + Terminations that are not associated to any other Termination. + Terminations in the null Context can have their parameters examined + or modified, and may have events detected on them. + + In general, an Add command is used to add Terminations to Contexts. + If the MGC does not specify an existing Context to which the + Termination is to be added, the MG creates a new Context. A + Termination may be removed from a Context with a Subtract command, + and a Termination may be moved from one Context to another with a + Move command. A Termination SHALL exist in only one Context at a + time. + + + + + + + +Groves, et al. Standards Track [Page 16] + +RFC 3525 Gateway Control Protocol June 2003 + + + The maximum number of Terminations in a Context is a MG property. + Media gateways that offer only point-to-point connectivity might + allow at most two Terminations per Context. Media gateways that + support multipoint conferences might allow three or more Terminations + per Context. + +6.1.1 Context attributes and descriptors + + The attributes of Contexts are: + + - ContextID. + + - The topology (who hears/sees whom). + + The topology of a Context describes the flow of media between the + Terminations within a Context. In contrast, the mode of a + Termination (send/receive/...) describes the flow of the media at + the ingress/egress of the media gateway. + + - The priority is used for a Context in order to provide the MG with + information about a certain precedence handling for a Context. + The MGC can also use the priority to control autonomously the + traffic precedence in the MG in a smooth way in certain + situations (e.g., restart), when a lot of Contexts must be handled + simultaneously. Priority 0 is the lowest priority and a priority + of 15 is the highest priority. + + - An indicator for an emergency call is also provided to allow a + preference handling in the MG. + +6.1.2 Creating, deleting and modifying Contexts + + The protocol can be used to (implicitly) create Contexts and modify + the parameter values of existing Contexts. The protocol has commands + to add Terminations to Contexts, subtract them from Contexts, and to + move Terminations between Contexts. Contexts are deleted implicitly + when the last remaining Termination is subtracted or moved out. + +6.2 Terminations + + A Termination is a logical entity on a MG that sources and/or sinks + media and/or control streams. A Termination is described by a number + of characterizing Properties, which are grouped in a set of + Descriptors that are included in commands. Terminations have unique + identities (TerminationIDs), assigned by the MG at the time of their + creation. + + + + + +Groves, et al. Standards Track [Page 17] + +RFC 3525 Gateway Control Protocol June 2003 + + + Terminations representing physical entities have a semi-permanent + existence. For example, a Termination representing a TDM channel + might exist for as long as it is provisioned in the gateway. + Terminations representing ephemeral information flows, such as RTP + flows, would usually exist only for the duration of their use. + + Ephemeral Terminations are created by means of an Add command. They + are destroyed by means of a Subtract command. In contrast, when a + physical Termination is Added to or Subtracted from a Context, it is + taken from or to the null Context, respectively. + + Terminations may have signals applied to them (see 7.1.11). + Terminations may be programmed to detect Events, the occurrence of + which can trigger notification messages to the MGC, or action by the + MG. Statistics may be accumulated on a Termination. Statistics are + reported to the MGC upon request (by means of the AuditValue command, + see 7.2.5) and when the Termination is taken out of the call it is + in. + + Multimedia gateways may process multiplexed media streams. For + example, Recommendation H.221 describes a frame structure for + multiple media streams multiplexed on a number of digital 64 kbit/s + channels. Such a case is handled in the connection model in the + following way. For every bearer channel that carries part of the + multiplexed streams, there is a physical or ephemeral "bearer + Termination". The bearer Terminations that source/sink the digital + channels are connected to a separate Termination called the + "multiplexing Termination". The multiplexing termination is an + ephemeral termination representing a frame-oriented session. The + MultiplexDescriptor for this Termination describes the multiplex used + (e.g., H.221 for an H.320 session) and indicates the order in which + the contained digital channels are assembled into a frame. + + Multiplexing terminations may be cascades (e.g., H.226 multiplex of + digital channels feeding into a H.223 multiplex supporting an H.324 + session). + + The individual media streams carried in the session are described by + StreamDescriptors on the multiplexing Termination. These media + streams can be associated with streams sourced/sunk by Terminations + in the Context other than the bearer Terminations supporting the + multiplexing Termination. Each bearer Termination supports only a + single data stream. These data streams do not appear explicitly as + streams on the multiplexing Termination and they are hidden from the + rest of the context. + + Figures 4, 5, 6, and 6a illustrate typical applications of the + multiplexing termination and Multiplex Descriptor. + + + +Groves, et al. Standards Track [Page 18] + +RFC 3525 Gateway Control Protocol June 2003 + + + +-----------------------------------+ + | Context +-------+ | + +----+ | | | + Circuit 1 -|--| TC1|---------+ Tmux | | + | +----+ (Str 1) | | Audio +-----+ + | | | +-----*-----+ |----- + | +----+ | H.22x | Stream 1 | | + Circuit 2 -|--| TC2|---------+ multi-| | TR1 | + | +----+ (Str 1) | plex | |(RTP)| + | | | | Video | | + | +----+ | +-----*-----+ |----- + Circuit 3 -|--| TC3|---------+ | Stream 2 | | + / +----+ (Str 1) | | +-----+ + / | +-------+ | + / +-----------------\-----------------+ + Audio, video, and control \ + signals are carried in frames Tmux is an ephemeral with two + spanning the circuits. explicit Stream Descriptors + and a Multiplex Descriptor. + + Figure 4: Multiplexed Termination Scenario - Circuit to Packet + (Asterisks * denote the centre of the context) + + Context + +--------------------------------------+ + | +-------+ +-------+ | + +----+ | | | | +----+ + Circuit 1 ----| TC1|---+ Tmux1 | Audio | Tmux2 +---| TC4|--- + +----+ | +---*----+ | +----+ + | | | Str 1 | | | + +----+ | H.22x | | H.22x | +----+ + Circuit 2 ----| TC2|---+ multi-| | multi-+---| TC5|--- + +----+ | plex | | plex | +----+ + | | | Video | | | + +----+ | +---*----+ | +----+ + Circuit 3 ----| TC3|---+ | Str 2 | +---| TC6|--- + +----+ | | | | +----+ + | +-------+ +-------+ | + +-----------------\-----/--------------+ + \ / + Tmux1 and Tmux2 are ephemerals each with two + explicit Stream Descriptors and a Multiplex Descriptor. + + Figure 5: Multiplexed Termination Scenario - Circuit to Circuit + (Asterisks * denote the centre of the context) + + + + + + +Groves, et al. Standards Track [Page 19] + +RFC 3525 Gateway Control Protocol June 2003 + + + +-----------------------------------+ + | Context +-------+ | + +----+ | | | + Circuit 1 -|--| TC1|---------+ Tmux | | + | +----+ (Str 1) | | Audio +-----+ + | | | +-----*-----+ TR1 |----- + | +----+ | H.22x | Stream 1 |(RTP)| + Circuit 2 -|--| TC2|---------+ multi-| +-----+ + | +----+ (Str 1) | plex | | + | | | | Video +-----+ + | +----+ | +-----*-----+ TR2 |----- + Circuit 3 -|--| TC3|---------+ | Stream 2 |(RTP)| + / +----+ (Str 1) | | +-----+ + / | +-------+ | + / +-----------------\-----------------+ + Audio, video, and control \ Tmux is an ephemeral with two + signals are carried in frames explicit Stream Descriptors and + spanning the circuits. and a Multiplex Descriptor. + + Figure 6: Multiplexed Termination Scenario - Single to Multiple + Terminations + (Asterisks * denote the centre of the context) + + Context + +---------------------------------------------+ + | +-------+ +-------+ | + Cct 1 +----+ | | | | Audio +-----+ + ----| TC1|---+ Tmux1 | | Tmux2 +-----*-----| TR1 |----- + +----+ | | | | Stream 1 |(RTP)| + | | | Data | | +-----+ + Cct 2 +----+ | H.226 +-------+ H.223 | | + ----| TC2|---+ multi-|(Str 1)| multi-| Control +-----+ + +----+ | plex | | plex +-----*-----+ Tctl|----- + | | | | | Stream 3 +-----+ + Cct 3 +----+ | | | | | + ----| TC3|---+ | | | +-----+ + +----+ | | | +-----*-----+ TR2 |----- + | +-------+ | | Video |(RTP)| + | +-------+ Stream 2 +-----+ + | | + +---------------------------------------------+ + Tmux1 has a Multiplex Descriptor and a single data stream. + Tmux2 has a Multiplex Descriptor with a single bearer and + three explicit Stream Descriptors. + + Figure 6a: Multiplexed Termination Scenario - Cascaded Multiplexes + (Asterisks * denote the centre of the context) + Note: this figure does not appear in Rec. H.248.1 + + + +Groves, et al. Standards Track [Page 20] + +RFC 3525 Gateway Control Protocol June 2003 + + + Terminations may be created which represent multiplexed bearers, such + as an ATM AAL Type 2 bearer. When a new multiplexed bearer is to be + created, an ephemeral Termination is created in a Context established + for this purpose. When the Termination is subtracted, the + multiplexed bearer is destroyed. + +6.2.1 Termination dynamics + + The protocol can be used to create new Terminations and to modify + property values of existing Terminations. These modifications + include the possibility of adding or removing events and/or signals. + The Termination properties, and events and signals are described in + the ensuing subclauses. An MGC can only release/modify Terminations + and the resources that the Termination represents which it has + previously seized via, e.g., the Add command. + +6.2.2 TerminationIDs + + Terminations are referenced by a TerminationID, which is an arbitrary + schema chosen by the MG. + + TerminationIDs of physical Terminations are provisioned in the Media + Gateway. The TerminationIDs may be chosen to have structure. For + instance, a TerminationID may consist of trunk group and a trunk + within the group. + + A wildcarding mechanism using two types of wildcards can be used with + TerminationIDs. The two wildcards are ALL and CHOOSE. The former is + used to address multiple Terminations at once, while the latter is + used to indicate to a media gateway that it must select a Termination + satisfying the partially specified TerminationID. This allows, for + instance, that a MGC instructs a MG to choose a circuit within a + trunk group. + + When ALL is used in the TerminationID of a command, the effect is + identical to repeating the command with each of the matching + TerminationIDs. The use of ALL does not address the ROOT + termination. Since each of these commands may generate a response, + the size of the entire response may be large. If individual + responses are not required, a wildcard response may be requested. In + such a case, a single response is generated, which contains the UNION + of all of the individual responses which otherwise would have been + generated, with duplicate values suppressed. For instance, given a + Termination Ta with properties p1=a, p2=b and Termination Tb with + + + + + + + +Groves, et al. Standards Track [Page 21] + +RFC 3525 Gateway Control Protocol June 2003 + + + properties p2=c, p3=d, a UNION response would consist of a wildcarded + TerminationId and the sequence of properties p1=a, p2=b,c and p3=d. + Wildcard response may be particularly useful in the Audit commands. + + The encoding of the wildcarding mechanism is detailed in Annexes A + and B. + +6.2.3 Packages + + Different types of gateways may implement Terminations that have + widely differing characteristics. Variations in Terminations are + accommodated in the protocol by allowing Terminations to have + optional Properties, Events, Signals and Statistics implemented by + MGs. + + In order to achieve MG/MGC interoperability, such options are grouped + into Packages, and typically a Termination realizes a set of such + Packages. More information on definition of packages can be found in + clause 12. An MGC can audit a Termination to determine which + Packages it realizes. + + Properties, Events, Signals and Statistics defined in Packages, as + well as parameters to them, are referenced by identifiers (Ids). + Identifiers are scoped. For each package, PropertyIds, EventIds, + SignalIds, StatisticsIds and ParameterIds have unique name spaces and + the same identifier may be used in each of them. Two PropertyIds in + different packages may also have the same identifier, etc. + + To support a particular package the MG must support all properties, + signals, events and statistics defined in a package. It must also + support all Signal and Event parameters. The MG may support a subset + of the values listed in a package for a particular Property or + Parameter. + + When packages are extended, the properties, events, signals and + statistics defined in the base package can be referred to using + either the extended package name or the base package name. For + example, if Package A defines event e1, and Package B extends Package + A, then B/e1 is an event for a termination implementing Package B. By + definition, the MG MUST also implement the base Package, but it is + optional to publish the base package as an allowed interface. If it + does publish A, then A would be reported on the Package Descriptor + in AuditValue as well as B, and event A/e1 would be available on a + termination. If the MG does not publish A, then only B/e1 would be + available. If published through AuditValue, A/e1 and B/e1 are the + same event. + + + + + +Groves, et al. Standards Track [Page 22] + +RFC 3525 Gateway Control Protocol June 2003 + + + For improved interoperability and backward compatibility, an MG MAY + publish all Packages supported by its Terminations, including base + Packages from which extended Packages are derived. An exception to + this is in cases where the base packages are expressly "Designed to + be extended only". + +6.2.4 Termination properties and descriptors + + Terminations have properties. The properties have unique + PropertyIDs. Most properties have default values, which are + explicitly defined in this protocol specification or in a package + (see clause 12) or set by provisioning. If not provisioned + otherwise, the properties in all descriptors except TerminationState + and LocalControl default to empty/"no value" when a Termination is + first created or returned to the null Context. The default contents + of the two exceptions are described in 7.1.5 and 7.1.7. + + The provisioning of a property value in the MG will override any + default value, be it supplied in this protocol specification or in a + package. Therefore if it is essential for the MGC to have full + control over the property values of a Termination, it should supply + explicit values when ADDing the Termination to a Context. + Alternatively, for a physical Termination the MGC can determine any + provisioned property values by auditing the Termination while it is + in the NULL Context. + + There are a number of common properties for Terminations and + properties specific to media streams. The common properties are also + called the Termination state properties. For each media stream, + there are local properties and properties of the received and + transmitted flows. + + Properties not included in the base protocol are defined in Packages. + These properties are referred to by a name consisting of the + PackageName and a PropertyId. Most properties have default values + described in the Package description. Properties may be read-only or + read/write. The possible values of a property may be audited, as can + their current values. For properties that are read/write, the MGC + can set their values. A property may be declared as "Global" which + has a single value shared by all Terminations realizing the package. + Related properties are grouped into descriptors for convenience. + + When a Termination is added to a Context, the value of its read/write + properties can be set by including the appropriate descriptors as + parameters to the Add command. Similarly, a property of a + Termination in a Context may have its value changed by the Modify + command. + + + + +Groves, et al. Standards Track [Page 23] + +RFC 3525 Gateway Control Protocol June 2003 + + + Properties may also have their values changed when a Termination is + moved from one Context to another as a result of a Move command. In + some cases, descriptors are returned as output from a command. + + In general, if a Descriptor is completely omitted from one of the + aforementioned Commands, the properties in that Descriptor retain + their prior values for the Termination(s) upon which the Command + acts. On the other hand, if some read/write properties are omitted + from a Descriptor in a Command (i.e., the Descriptor is only + partially specified), those properties will be reset to their default + values for the Termination(s) upon which the Command acts, unless the + package specifies other behavior. For more details, see clause 7.1 + dealing with the individual Descriptors. + + The following table lists all of the possible descriptors and their + use. Not all descriptors are legal as input or output parameters to + every command. + + Descriptor name Description + + Modem Identifies modem type and properties when + applicable + + Mux Describes multiplex type for multimedia + Terminations (e.g., H.221, H.223, H.225.0) and + Terminations forming the input mux + + Media A list of media stream specifications (see 7.1.4) + + TerminationState Properties of a Termination (which can be defined + in Packages) that are not stream specific + + Stream A list of remote/local/localControl descriptors for + a single stream + + Local Contains properties that specify the media flows + that the MG receives from the remote entity. + + Remote Contains properties that specify the media flows + that the MG sends to the remote entity. + + LocalControl Contains properties (which can be defined in + packages) that are of interest between the MG and + the MGC. + + Events Describes events to be detected by the MG and what + to do when an event is detected. + + + + +Groves, et al. Standards Track [Page 24] + +RFC 3525 Gateway Control Protocol June 2003 + + + EventBuffer Describes events to be detected by the MG when + Event Buffering is active. + + Signals Describes signals (see 7.1.11) applied to + Terminations. + + Audit In Audit commands, identifies which information is + desired. + + Packages In AuditValue, returns a list of Packages realized + by Termination. + + DigitMap Defines patterns against which sequences of a + specified set of events are to be matched so they + can be reported as a group rather than singly. + + ServiceChange In ServiceChange, what, why service change + occurred, etc. + + ObservedEvents In Notify or AuditValue, report of events observed. + + Statistics In Subtract and Audit, report of Statistics kept on + a Termination. + + Topology Specifies flow directions between Terminations in a + Context. + + Error Contains an error code and optionally error text; + it may occur in command replies and in Notify + requests. + +6.2.5 Root Termination + + Occasionally, a command must refer to the entire gateway, rather than + a Termination within it. A special TerminationID, "Root" is reserved + for this purpose. Packages may be defined on Root. Root thus may + have properties, events and statistics (signals are not appropriate + for root). Accordingly, the root TerminationID may appear in: + + - a Modify command - to change a property or set an event + + - a Notify command - to report an event + + - an AuditValue return - to examine the values of properties and + statistics implemented on root + + - an AuditCapability - to determine what properties of root are + implemented + + + +Groves, et al. Standards Track [Page 25] + +RFC 3525 Gateway Control Protocol June 2003 + + + - a ServiceChange - to declare the gateway in or out of service. + + Any other use of the root TerminationID is an error. Error code + 410 - Incorrect identifier shall be returned in these cases. + +7 Commands + + The protocol provides commands for manipulating the logical entities + of the protocol connection model, Contexts and Terminations. + Commands provide control at the finest level of granularity supported + by the protocol. For example, Commands exist to add Terminations to + a Context, modify Terminations, subtract Terminations from a Context, + and audit properties of Contexts or Terminations. Commands provide + for complete control of the properties of Contexts and Terminations. + This includes specifying which events a Termination is to report, + which signals/actions are to be applied to a Termination and + specifying the topology of a Context (who hears/sees whom). + + Most commands are for the specific use of the Media Gateway + Controller as command initiator in controlling Media Gateways as + command responders. The exceptions are the Notify and ServiceChange + commands: Notify is sent from Media Gateway to Media Gateway + Controller, and ServiceChange may be sent by either entity. Below is + an overview of the commands; they are explained in more detail in + 7.2. + + 1) Add - The Add command adds a Termination to a Context. The Add + command on the first Termination in a Context is used to create a + Context. + + 2) Modify - The Modify command modifies the properties, events and + signals of a Termination. + + 3) Subtract - The Subtract command disconnects a Termination from its + Context and returns statistics on the Termination's participation + in the Context. The Subtract command on the last Termination in a + Context deletes the Context. + + 4) Move - The Move command atomically moves a Termination to another + Context. + + 5) AuditValue - The AuditValue command returns the current state of + properties, events, signals and statistics of Terminations. + + 6) AuditCapabilities - The AuditCapabilities command returns all the + possible values for Termination properties, events and signals + allowed by the Media Gateway. + + + + +Groves, et al. Standards Track [Page 26] + +RFC 3525 Gateway Control Protocol June 2003 + + + 7) Notify - The Notify command allows the Media Gateway to inform the + Media Gateway Controller of the occurrence of events in the Media + Gateway. + + 8) ServiceChange - The ServiceChange command allows the Media Gateway + to notify the Media Gateway Controller that a Termination or group + of Terminations is about to be taken out of service or has just + been returned to service. ServiceChange is also used by the MG to + announce its availability to a MGC (registration), and to notify + the MGC of impending or completed restart of the MG. The MGC may + announce a handover to the MG by sending it a ServiceChange + command. The MGC may also use ServiceChange to instruct the MG to + take a Termination or group of Terminations in or out of service. + + These commands are detailed in 7.2.1 through 7.2.8. + +7.1 Descriptors + + The parameters to a command are termed Descriptors. A descriptor + consists of a name and a list of items. Some items may have values. + Many Commands share common descriptors. This subclause enumerates + these descriptors. Descriptors may be returned as output from a + command. In any such return of descriptor contents, an empty + descriptor is represented by its name unaccompanied by any list. + Parameters and parameter usage specific to a given Command type are + described in the subclause that describes the Command. + +7.1.1 Specifying parameters + + Command parameters are structured into a number of descriptors. In + general, the text format of descriptors is + DescriptorName={parm=value, parm=value, ...}. + + Parameters may be fully specified, overspecified or underspecified: + + 1) Fully specified parameters have a single, unambiguous value that + the command initiator is instructing the command responder to use + for the specified parameter. + + 2) Underspecified parameters, using the CHOOSE value, allow the + command responder to choose any value it can support. + + 3) Overspecified parameters have a list of potential values. The + list order specifies the command initiator's order of preference + of selection. The command responder chooses one value from + the offered list and returns that value to the command initiator. + + + + + +Groves, et al. Standards Track [Page 27] + +RFC 3525 Gateway Control Protocol June 2003 + + + If a required descriptor other than the Audit descriptor is + unspecified (i.e., entirely absent) from a command, the previous + values set in that descriptor for that Termination, if any, are + retained. In commands other than Subtract, a missing Audit + descriptor is equivalent to an empty Audit descriptor. The Behaviour + of the MG with respect to unspecified parameters within a descriptor + varies with the descriptor concerned, as indicated in succeeding + subclauses. Whenever a parameter is underspecified or overspecified, + the descriptor containing the value chosen by the responder is + included as output from the command. + + Each command specifies the TerminationId the command operates on. + This TerminationId may be "wildcarded". When the TerminationId of a + command is wildcarded, the effect shall be as if the command was + repeated with each of the TerminationIds matched. + +7.1.2 Modem descriptor + + The Modem descriptor specifies the modem type and parameters, if any, + required for use in e.g., H.324 and text conversation. The + descriptor includes the following modem types: V.18, V.22, V.22 bis, + V.32, V.32 bis, V.34, V.90, V.91, Synchronous ISDN, and allows for + extensions. By default, no Modem descriptor is present in a + Termination. + +7.1.3 Multiplex descriptor + + In multimedia calls, a number of media streams are carried on a + (possibly different) number of bearers. The multiplex descriptor + associates the media and the bearers. The descriptor includes the + multiplex type: + + - H.221; + + - H.223; + + - H.226; + + - V.76; + + - possible extensions, + + and a set of TerminationIDs representing the multiplexed bearers, in + order. For example: + + Mux = H.221{ MyT3/1/2, MyT3/2/13, MyT3/3/6, MyT3/21/22} + + + + + +Groves, et al. Standards Track [Page 28] + +RFC 3525 Gateway Control Protocol June 2003 + + +7.1.4 Media descriptor + + The Media descriptor specifies the parameters for all the media + streams. These parameters are structured into two descriptors: a + TerminationState descriptor, which specifies the properties of a + Termination that are not stream dependent, and one or more Stream + descriptors each of which describes a single media stream. + + A stream is identified by a StreamID. The StreamID is used to link + the streams in a Context that belong together. Multiple streams + exiting a Termination shall be synchronized with each other. Within + the Stream descriptor, there are up to three subsidiary descriptors: + LocalControl, Local, and Remote. The relationship between these + descriptors is thus: + + Media descriptor + TerminationState Descriptor + Stream descriptor + LocalControl descriptor + Local descriptor + Remote descriptor + + As a convenience, LocalControl, Local, or Remote descriptors may be + included in the Media descriptor without an enclosing Stream + descriptor. In this case, the StreamID is assumed to be 1. + +7.1.5 TerminationState descriptor + + The TerminationState descriptor contains the ServiceStates property, + the EventBufferControl property and properties of a Termination + (defined in Packages) that are not stream specific. + + The ServiceStates property describes the overall state of the + Termination (not stream specific). A Termination can be in one of + the following states: "test", "out of service", or "in service". The + "test" state indicates that the Termination is being tested. The + state "out of service" indicates that the Termination cannot be used + for traffic. The state "in service" indicates that a Termination can + be used or is being used for normal traffic. "in service" is the + default state. + + + + + + + + + + + +Groves, et al. Standards Track [Page 29] + +RFC 3525 Gateway Control Protocol June 2003 + + + Values assigned to Properties may be simple values + (integer/string/enumeration) or may be underspecified, where more + than one value is supplied and the MG may make a choice: + + - Alternative Values - multiple values in a list, one of which must + be selected + + - Ranges - minimum and maximum values, any value between min and max + must be selected, boundary values included + + - Greater Than/Less Than - value must be greater/less than specified + value + + - CHOOSE Wildcard - the MG chooses from the allowed values for the + property + + The EventBufferControl property specifies whether events are buffered + following detection of an event in the Events descriptor, or + processed immediately. See 7.1.9 for details. + +7.1.6 Stream descriptor + + A Stream descriptor specifies the parameters of a single + bidirectional stream. These parameters are structured into three + descriptors: one that contains Termination properties specific to a + stream and one each for local and remote flows. The Stream + Descriptor includes a StreamID which identifies the stream. Streams + are created by specifying a new StreamID on one of the Terminations + in a Context. A stream is deleted by setting empty Local and Remote + descriptors for the stream with ReserveGroup and ReserveValue in + LocalControl set to "false" on all Terminations in the Context that + previously supported that stream. + + StreamIDs are of local significance between MGC and MG and they are + assigned by the MGC. Within a Context, StreamID is a means by which + to indicate which media flows are interconnected: streams with the + same StreamID are connected. + + If a Termination is moved from one Context to another, the effect on + the Context to which the Termination is moved is the same as in the + case that a new Termination were added with the same StreamIDs as the + moved Termination. + + + + + + + + + +Groves, et al. Standards Track [Page 30] + +RFC 3525 Gateway Control Protocol June 2003 + + +7.1.7 LocalControl descriptor + + The LocalControl descriptor contains the Mode property, the + ReserveGroup and ReserveValue properties and properties of a + Termination (defined in Packages) that are stream specific, and are + of interest between the MG and the MGC. Values of properties may be + underspecified as in 7.1.1. + + The allowed values for the mode property are send-only, receive-only, + send/receive, inactive and loop-back. "Send" and "receive" are with + respect to the exterior of the Context, so that, for example, a + stream set to mode=sendOnly does not pass received media into the + Context. The default value for the mode property is "Inactive". + Signals and Events are not affected by mode. + + The boolean-valued Reserve properties, ReserveValue and ReserveGroup, + of a Termination indicate what the MG is expected to do when it + receives a Local and/or Remote descriptor. + + If the value of a Reserve property is True, the MG SHALL reserve + resources for all alternatives specified in the Local and/or Remote + descriptors for which it currently has resources available. It SHALL + respond with the alternatives for which it reserves resources. If it + cannot not support any of the alternatives, it SHALL respond with a + reply to the MGC that contains empty Local and/or Remote descriptors. + If media begins to flow while more than a single alternative is + reserved, media packets may be sent/received on any of the + alternatives and must be processed, although only a single + alternative may be active at any given time. + + If the value of a Reserve property is False, the MG SHALL choose one + of the alternatives specified in the Local descriptor (if present) + and one of the alternatives specified in the Remote descriptor (if + present). If the MG has not yet reserved resources to support the + selected alternative, it SHALL reserve the resources. If, on the + other hand, it already reserved resources for the Termination + addressed (because of a prior exchange with ReserveValue and/or + ReserveGroup equal to True), it SHALL release any excess resources it + reserved previously. Finally, the MG shall send a reply to the MGC + containing the alternatives for the Local and/or Remote descriptor + that it selected. If the MG does not have sufficient resources to + support any of the alternatives specified, it SHALL respond with + error 510 (insufficient resources). + + The default value of ReserveValue and ReserveGroup is False. More + information on the use of the two Reserve properties is provided in + 7.1.8. + + + + +Groves, et al. Standards Track [Page 31] + +RFC 3525 Gateway Control Protocol June 2003 + + + A new setting of the LocalControl Descriptor completely replaces the + previous setting of that descriptor in the MG. Thus, to retain + information from the previous setting, the MGC must include that + information in the new setting. If the MGC wishes to delete some + information from the existing descriptor, it merely resends the + descriptor (in a Modify command) with the unwanted information + stripped out. + +7.1.8 Local and Remote descriptors + + The MGC uses Local and Remote descriptors to reserve and commit MG + resources for media decoding and encoding for the given Stream(s) and + Termination to which they apply. The MG includes these descriptors + in its response to indicate what it is actually prepared to support. + The MG SHALL include additional properties and their values in its + response if these properties are mandatory yet not present in the + requests made by the MGC (e.g., by specifying detailed video encoding + parameters where the MGC only specified the payload type). + + Local refers to the media received by the MG and Remote refers to the + media sent by the MG. + + When text encoding the protocol, the descriptors consist of session + descriptions as defined in SDP (RFC 2327). In session descriptions + sent from the MGC to the MG, the following exceptions to the syntax + of RFC 2327 are allowed: + + - the "s=", "t=" and "o=" lines are optional; + + - the use of CHOOSE is allowed in place of a single parameter value; + and + + - the use of alternatives is allowed in place of a single parameter + value. + + A Stream Descriptor specifies a single bi-directional media stream + and so a single session description MUST NOT include more than one + media description ("m=" line). A Stream Descriptor may contain + additional session descriptions as alternatives. Each media stream + for a termination must appear in distinct Stream Descriptors. When + multiple session descriptions are provided in one descriptor, the + "v=" lines are required as delimiters; otherwise they are optional in + session descriptions sent to the MG. Implementations shall accept + session descriptions that are fully conformant to RFC 2327. When + binary encoding the protocol the descriptor consists of groups of + properties (tag-value pairs) as specified in Annex C. Each such + group may contain the parameters of a session description. + + + + +Groves, et al. Standards Track [Page 32] + +RFC 3525 Gateway Control Protocol June 2003 + + + Below, the semantics of the Local and Remote descriptors are + specified in detail. The specification consists of two parts. The + first part specifies the interpretation of the contents of the + descriptor. The second part specifies the actions the MG must take + upon receiving the Local and Remote descriptors. The actions to be + taken by the MG depend on the values of the ReserveValue and + ReserveGroup properties of the LocalControl descriptor. + + Either the Local or the Remote descriptor or both may be: + + 1) unspecified (i.e., absent); + + 2) empty; + + 3) underspecified through use of CHOOSE in a property value; + + 4) fully specified; or + + 5) overspecified through presentation of multiple groups of + properties and possibly multiple property values in one or more of + these groups. + + Where the descriptors have been passed from the MGC to the MG, they + are interpreted according to the rules given in 7.1.1, with the + following additional comments for clarification: + + a) An unspecified Local or Remote descriptor is considered to be a + missing mandatory parameter. It requires the MG to use whatever + was last specified for that descriptor. It is possible that there + was no previously specified value, in which case the descriptor + concerned is ignored in further processing of the command. + + b) An empty Local (Remote) descriptor in a message from the MGC + signifies a request to release any resources reserved for the + media flow received (sent). + + c) If multiple groups of properties are present in a Local or Remote + descriptor or multiple values within a group, the order of + preference is descending. + + d) Underspecified or overspecified properties within a group of + properties sent by the MGC are requests for the MG to choose one + or more values which it can support for each of those properties. + In case of an overspecified property, the list of values is in + descending order of preference. + + Subject to the above rules, subsequent action depends on the values + of the ReserveValue and ReserveGroup properties in LocalControl. + + + +Groves, et al. Standards Track [Page 33] + +RFC 3525 Gateway Control Protocol June 2003 + + + If ReserveGroup is True, the MG reserves the resources required to + support any of the requested property group alternatives that it can + currently support. If ReserveValue is True, the MG reserves the + resources required to support any of the requested property value + alternatives that it can currently support. + + NOTE - If a Local or Remote descriptor contains multiple groups of + properties, and ReserveGroup is True, then the MG is requested to + reserve resources so that it can decode or encode the media stream + according to any of the alternatives. For instance, if the Local + descriptor contains two groups of properties, one specifying + packetized G.711 A-law audio and the other G.723.1 audio, the MG + reserves resources so that it can decode one audio stream encoded in + either G.711 A-law format or G.723.1 format. The MG does not have to + reserve resources to decode two audio streams simultaneously, one + encoded in G.711 A-law and one in G.723.1. The intention for the use + of ReserveValue is analogous. + + If ReserveGroup is true or ReserveValue is True, then the following + rules apply: + + - If the MG has insufficient resources to support all alternatives + requested by the MGC and the MGC requested resources in both Local + and Remote, the MG should reserve resources to support at least + one alternative each within Local and Remote. + + - If the MG has insufficient resources to support at least one + alternative within a Local (Remote) descriptor received from the + MGC, it shall return an empty Local (Remote) in response. + + - In its response to the MGC, when the MGC included Local and Remote + descriptors, the MG SHALL include Local and Remote descriptors for + all groups of properties and property values it reserved resources + for. If the MG is incapable of supporting at least one of the + alternatives within the Local (Remote) descriptor received from + the MGC, it SHALL return an empty Local (Remote) descriptor. + + - If the Mode property of the LocalControl descriptor is RecvOnly, + SendRecv, or LoopBack, the MG must be prepared to receive media + encoded according to any of the alternatives included in its + response to the MGC. + + If ReserveGroup is False and ReserveValue is False, then the MG + SHOULD apply the following rules to resolve Local and Remote to a + single alternative each: + + - The MG chooses the first alternative in Local for which it is able + to support at least one alternative in Remote. + + + +Groves, et al. Standards Track [Page 34] + +RFC 3525 Gateway Control Protocol June 2003 + + + - If the MG is unable to support at least one Local and one Remote + alternative, it returns Error 510 (Insufficient Resources). + + - The MG returns its selected alternative in each of Local and + Remote. + + A new setting of a Local or Remote descriptor completely replaces the + previous setting of that descriptor in the MG. Thus, to retain + information from the previous setting, the MGC must include that + information in the new setting. If the MGC wishes to delete some + information from the existing descriptor, it merely resends the + descriptor (in a Modify command) with the unwanted information + stripped out. + +7.1.9 Events descriptor + + The EventsDescriptor parameter contains a RequestIdentifier and a + list of events that the Media Gateway is requested to detect and + report. The RequestIdentifier is used to correlate the request with + the notifications that it may trigger. Requested events include, for + example, fax tones, continuity test results, and on-hook and off-hook + transitions. The RequestIdentifier is omitted if the + EventsDescriptor is empty (i.e., no events are specified). + + Each event in the descriptor contains the Event name, an optional + streamID, an optional KeepActive flag, and optional parameters. The + Event name consists of a Package Name (where the event is defined) + and an EventID. The ALL wildcard may be used for the EventID, + indicating that all events from the specified package have to be + detected. The default streamID is 0, indicating that the event to be + detected is not related to a particular media stream. Events can + have parameters. This allows a single event description to have some + variation in meaning without creating large numbers of individual + events. Further event parameters are defined in the package. + + If a digit map completion event is present or implied in the + EventsDescriptor, the EventDM parameter is used to carry either the + name or the value of the associated digit map. See 7.1.14 for + further details. + + When an event is processed against the contents of an active Events + Descriptor and found to be present in that descriptor ("recognized"), + the default action of the MG is to send a Notify command to the MGC. + Notification may be deferred if the event is absorbed into the + current dial string of an active digit map (see 7.1.14). Any other + action is for further study. Moreover, event recognition may cause + currently active signals to stop, or may cause the current Events + and/or Signals descriptor to be replaced, as described at the end of + + + +Groves, et al. Standards Track [Page 35] + +RFC 3525 Gateway Control Protocol June 2003 + + + this subclause. Unless the Events Descriptor is replaced by another + Events Descriptor, it remains active after an event has been + recognized. + + If the value of the EventBufferControl property equals LockStep, + following detection of such an event, normal handling of events is + suspended. Any event which is subsequently detected and occurs in + the EventBuffer descriptor is added to the end of the EventBuffer (a + FIFO queue), along with the time that it was detected. The MG SHALL + wait for a new EventsDescriptor to be loaded. A new EventsDescriptor + can be loaded either as the result of receiving a command with a new + EventsDescriptor, or by activating an embedded EventsDescriptor. + + If EventBufferControl equals Off, the MG continues processing based + on the active EventsDescriptor. + + In the case of an embedded EventsDescriptor being activated, the MG + continues event processing based on the newly activated + EventsDescriptor. + + NOTE 1 - For purposes of EventBuffer handling, activation of an + embedded EventsDescriptor is equivalent to receipt of a new + EventsDescriptor. + + When the MG receives a command with a new EventsDescriptor, one or + more events may have been buffered in the EventBuffer in the MG. The + value of EventBufferControl then determines how the MG treats such + buffered events. + + Case 1 + + If EventBufferControl equals LockStep and the MG receives a new + EventsDescriptor, it will check the FIFO EventBuffer and take the + following actions: + + 1) If the EventBuffer is empty, the MG waits for detection of events + based on the new EventsDescriptor. + + 2) If the EventBuffer is non-empty, the MG processes the FIFO queue + starting with the first event: + + a) If the event in the queue is in the events listed in the new + EventsDescriptor, the MG acts on the event and removes the + event from the EventBuffer. The time stamp of the Notify shall + be the time the event was actually detected. The MG then waits + for a new EventsDescriptor. While waiting for a new + EventsDescriptor, any events detected that appear in the + + + + +Groves, et al. Standards Track [Page 36] + +RFC 3525 Gateway Control Protocol June 2003 + + + EventsBufferDescriptor will be placed in the EventBuffer. When + a new EventsDescriptor is received, the event processing will + repeat from step 1. + + b) If the event is not in the new EventsDescriptor, the MG SHALL + discard the event and repeat from step 1. + + Case 2 + + If EventBufferControl equals Off and the MG receives a new + EventsDescriptor, it processes new events with the new + EventsDescriptor. + + If the MG receives a command instructing it to set the value of + EventBufferControl to Off, all events in the EventBuffer SHALL be + discarded. + + The MG may report several events in a single Transaction as long as + this does not unnecessarily delay the reporting of individual events. + + For procedures regarding transmitting the Notify command, refer to + the appropriate annex or Recommendation of the H.248 sub-series for + specific transport considerations. + + The default value of EventBufferControl is Off. + + NOTE 2 - Since the EventBufferControl property is in the + TerminationStateDescriptor, the MG might receive a command that + changes the EventBufferControl property and does not include an + EventsDescriptor. + + Normally, recognition of an event shall cause any active signals to + stop. When KeepActive is specified in the event, the MG shall not + interrupt any signals active on the Termination on which the event is + detected. + + An event can include an Embedded Signals descriptor and/or an + Embedded Events descriptor which, if present, replaces the current + Signals/Events descriptor when the event is recognized. It is + possible, for example, to specify that the dial-tone Signal be + generated when an off-hook Event is recognized, or that the dial-tone + Signal be stopped when a digit is recognized. A media gateway + controller shall not send EventsDescriptors with an event both marked + KeepActive and containing an embedded SignalsDescriptor. + + + + + + + +Groves, et al. Standards Track [Page 37] + +RFC 3525 Gateway Control Protocol June 2003 + + + Only one level of embedding is permitted. An embedded + EventsDescriptor SHALL NOT contain another embedded EventsDescriptor; + an embedded EventsDescriptor MAY contain an embedded + SignalsDescriptor. + + An EventsDescriptor received by a media gateway replaces any previous + Events descriptor. Event notification in process shall complete, and + events detected after the command containing the new EventsDescriptor + executes, shall be processed according to the new EventsDescriptor. + + An empty Events Descriptor disables all event recognition and + reporting. An empty EventBuffer Descriptor clears the EventBuffer + and disables all event accumulation in LockStep mode: the only events + reported will be those occurring while an Events Descriptor is + active. If an empty Events Descriptor is activated while the + Termination is operating in LockStep mode, the events buffer is + immediately cleared. + +7.1.10 EventBuffer descriptor + + The EventBuffer descriptor contains a list of events, with their + parameters if any, that the MG is requested to detect and buffer when + EventBufferControl equals LockStep (see 7.1.9). + +7.1.11 Signals descriptor + + Signals are MG generated media such as tones and announcements as + well as bearer-related signals such as hookswitch. More complex + signals may include a sequence of such simple signals interspersed + with and conditioned upon the receipt and analysis of media or + bearer-related signals. Examples include echoing of received data as + in Continuity Test package. Signals may also request preparation of + media content for future signals. + + A SignalsDescriptor is a parameter that contains the set of signals + that the Media Gateway is asked to apply to a Termination. A + SignalsDescriptor contains a number of signals and/or sequential + signal lists. A SignalsDescriptor may contain zero signals and + sequential signal lists. Support of sequential signal lists is + optional. + + Signals are defined in packages. Signals shall be named with a + Package name (in which the signal is defined) and a SignalID. No + wildcard shall be used in the SignalID. Signals that occur in a + SignalsDescriptor have an optional StreamID parameter (default is 0, + to indicate that the signal is not related to a particular media + stream), an optional signal type (see below), an optional duration + and possibly parameters defined in the package that defines the + + + +Groves, et al. Standards Track [Page 38] + +RFC 3525 Gateway Control Protocol June 2003 + + + signal. This allows a single signal to have some variation in + meaning, obviating the need to create large numbers of individual + signals. + + Finally, the optional parameter "notifyCompletion" allows a MGC to + indicate that it wishes to be notified when the signal finishes + playout. The possible cases are that the signal timed out (or + otherwise completed on its own), that it was interrupted by an event, + that it was halted when a Signals descriptor was replaced, or that it + stopped or never started for other reasons. If the notifyCompletion + parameter is not included in a Signals descriptor, notification is + generated only if the signal stopped or was never started for other + reasons. For reporting to occur, the signal completion event (see + E.1.2) must be enabled in the currently active Events descriptor. + + The duration is an integer value that is expressed in hundredths of a + second. + + There are three types of signals: + + - on/off - the signal lasts until it is turned off; + + - timeout - the signal lasts until it is turned off or a specific + period of time elapses; + + - brief - the signal will stop on its own unless a new Signals + descriptor is applied that causes it to stop; no timeout value is + needed. + + If a signal of default type other than TO has its type overridden to + type TO in the Signals descriptor, the duration parameter must be + present. + + If the signal type is specified in a SignalsDescriptor, it overrides + the default signal type (see 12.1.4). If duration is specified for + an on/off signal, it SHALL be ignored. + + A sequential signal list consists of a signal list identifier and a + sequence of signals to be played sequentially. Only the trailing + element of the sequence of signals in a sequential signal list may be + an on/off signal. The duration of a sequential signal list is the + sum of the durations of the signals it contains. + + Multiple signals and sequential signal lists in the same + SignalsDescriptor shall be played simultaneously. + + Signals are defined as proceeding from the Termination towards the + exterior of the Context unless otherwise specified in a package. + + + +Groves, et al. Standards Track [Page 39] + +RFC 3525 Gateway Control Protocol June 2003 + + + When the same Signal is applied to multiple Terminations within one + Transaction, the MG should consider using the same resource to + generate these Signals. + + Production of a Signal on a Termination is stopped by application of + a new SignalsDescriptor, or detection of an Event on the Termination + (see 7.1.9). + + A new SignalsDescriptor replaces any existing SignalsDescriptor. Any + signals applied to the Termination not in the replacement descriptor + shall be stopped, and new signals are applied, except as follows. + Signals present in the replacement descriptor and containing the + KeepActive flag shall be continued if they are currently playing and + have not already completed. If a replacement signal descriptor + contains a signal that is not currently playing and contains the + KeepActive flag, that signal SHALL be ignored. If the replacement + descriptor contains a sequential signal list with the same identifier + as the existing descriptor, then + + - the signal type and sequence of signals in the sequential signal + list in the replacement descriptor shall be ignored; and + + - the playing of the signals in the sequential signal list in the + existing descriptor shall not be interrupted. + +7.1.12 Audit descriptor + + The Audit descriptor specifies what information is to be audited. + The Audit descriptor specifies the list of descriptors to be + returned. Audit may be used in any command to force the return of + any descriptor containing the current values of its properties, + events, signals and statistics even if that descriptor was not + present in the command, or had no underspecified parameters. + Possible items in the Audit descriptor are: + + Modem + Mux + Events + Media + Signals + ObservedEvents + DigitMap + Statistics + Packages + EventBuffer + + + + + + +Groves, et al. Standards Track [Page 40] + +RFC 3525 Gateway Control Protocol June 2003 + + + Audit may be empty, in which case, no descriptors are returned. This + is useful in Subtract, to inhibit return of statistics, especially + when using wildcard. + +7.1.13 ServiceChange descriptor + + The ServiceChangeDescriptor contains the following parameters: + + . ServiceChangeMethod + . ServiceChangeReason + . ServiceChangeAddress + . ServiceChangeDelay + . ServiceChangeProfile + . ServiceChangeVersion + . ServiceChangeMGCId + . TimeStamp + . Extension + + See 7.2.8. + +7.1.14 DigitMap descriptor + +7.1.14.1 DigitMap definition, creation, modification and deletion + + A DigitMap is a dialing plan resident in the Media Gateway used for + detecting and reporting digit events received on a Termination. The + DigitMap descriptor contains a DigitMap name and the DigitMap to be + assigned. A digit map may be preloaded into the MG by management + action and referenced by name in an EventsDescriptor, may be defined + dynamically and subsequently referenced by name, or the actual + digitmap itself may be specified in the EventsDescriptor. It is + permissible for a digit map completion event within an Events + descriptor to refer by name to a DigitMap which is defined by a + DigitMap descriptor within the same command, regardless of the + transmitted order of the respective descriptors. + + DigitMaps defined in a DigitMapDescriptor can occur in any of the + standard Termination manipulation Commands of the protocol. A + DigitMap, once defined, can be used on all Terminations specified by + the (possibly wildcarded) TerminationID in such a command. DigitMaps + defined on the root Termination are global and can be used on every + Termination in the MG, provided that a DigitMap with the same name + has not been defined on the given Termination. When a DigitMap is + defined dynamically in a DigitMap descriptor: + + - A new DigitMap is created by specifying a name that is not yet + defined. The value shall be present. + + + + +Groves, et al. Standards Track [Page 41] + +RFC 3525 Gateway Control Protocol June 2003 + + + - A DigitMap value is updated by supplying a new value for a name + that is already defined. Terminations presently using the + digitmap shall continue to use the old definition; subsequent + EventsDescriptors specifying the name, including any + EventsDescriptor in the command containing the DigitMap + descriptor, shall use the new one. + + - A DigitMap is deleted by supplying an empty value for a name that + is already defined. Terminations presently using the digitmap + shall continue to use the old definition. + +7.1.14.2 DigitMap Timers + + The collection of digits according to a DigitMap may be protected by + three timers, viz. a start timer (T), short timer (S), and long timer + (L). + + 1) The start timer (T) is used prior to any digits having been + dialed. If the start timer is overridden with the value set to + zero (T=0), then the start timer shall be disabled. This implies + that the MG will wait indefinitely for digits. + + 2) If the Media Gateway can determine that at least one more digit is + needed for a digit string to match any of the allowed patterns in + the digit map, then the interdigit timer value should be set to a + long (L) duration (e.g., 16 seconds). + + 3) If the digit string has matched one of the patterns in a digit + map, but it is possible that more digits could be received which + would cause a match with a different pattern, then instead of + reporting the match immediately, the MG must apply the short timer + (S) and wait for more digits. + + The timers are configurable parameters to a DigitMap. Default values + of these timers should be provisioned on the MG, but can be + overridden by values specified within the DigitMap. + +7.1.14.3 DigitMap Syntax + + The formal syntax of the digit map is described by the DigitMap rule + in the formal syntax description of the protocol (see Annex A and + Annex B). A DigitMap, according to this syntax, is defined either by + a string or by a list of strings. Each string in the list is an + alternative event sequence, specified either as a sequence of digit + map symbols or as a regular expression of digit map symbols. These + digit map symbols, the digits "0" through "9" and letters "A" through + a maximum value depending on the signalling system concerned, but + never exceeding "K", correspond to specified events within a package + + + +Groves, et al. Standards Track [Page 42] + +RFC 3525 Gateway Control Protocol June 2003 + + + which has been designated in the Events descriptor on the Termination + to which the digit map is being applied. (The mapping between events + and digit map symbols is defined in the documentation for packages + associated with channel-associated signalling systems such as DTMF, + MF, or R2. Digits "0" through "9" MUST be mapped to the + corresponding digit events within the signalling system concerned. + Letters should be allocated in logical fashion, facilitating the use + of range notation for alternative events.) + + The letter "x" is used as a wildcard, designating any event + corresponding to symbols in the range "0"-"9". The string may also + contain explicit ranges and, more generally, explicit sets of + symbols, designating alternative events any one of which satisfies + that position of the digit map. Finally, the dot symbol "." stands + for zero or more repetitions of the event selector (event, range of + events, set of alternative events, or wildcard) that precedes it. As + a consequence of the third timing rule above, inter-event timing + while matching a terminal dot symbol uses the short timer by default. + + In addition to these event symbols, the string may contain "S" and + "L" inter-event timing specifiers and the "Z" duration modifier. "S" + and "L" respectively indicate that the MG should use the short (S) + timer or the long (L) timer for subsequent events, overriding the + timing rules described above. If an explicit timing specifier is in + effect in one alternative event sequence, but none is given in any + other candidate alternative, the timer value set by the explicit + timing specifier must be used. If all sequences with explicit timing + controls are dropped from the candidate set, timing reverts to the + default rules given above. Finally, if conflicting timing specifiers + are in effect in different alternative sequences, the long timer + shall be used. + + A "Z" designates a long duration event: placed in front of the + symbol(s) designating the event(s) which satisfy a given digit + position, it indicates that that position is satisfied only if the + duration of the event exceeds the long-duration threshold. The value + of this threshold is assumed to be provisioned in the MG. + +7.1.14.4 DigitMap Completion Event + + A digit map is active while the Events descriptor which invoked it is + active and it has not completed. A digit map completes when: + + - a timer has expired; or + + - an alternative event sequence has been matched and no other + alternative event sequence in the digit map could be matched + through detection of an additional event (unambiguous match); or + + + +Groves, et al. Standards Track [Page 43] + +RFC 3525 Gateway Control Protocol June 2003 + + + - an event has been detected such that a match to a complete + alternative event sequence of the digit map will be impossible no + matter what additional events are received. + + Upon completion, a digit map completion event as defined in the + package providing the events being mapped into the digit map shall be + generated. At that point the digit map is deactivated. Subsequent + events in the package are processed as per the currently active event + processing mechanisms. + +7.1.14.5 DigitMap Procedures + + Pending completion, successive events shall be processed according to + the following rules: + + 1) The "current dial string", an internal variable, is initially + empty. The set of candidate alternative event sequences includes + all of the alternatives specified in the digit map. + + 2) At each step, a timer is set to wait for the next event, based + either on the default timing rules given above or on explicit + timing specified in one or more alternative event sequences. If + the timer expires and a member of the candidate set of + alternatives is fully satisfied, a timeout completion with full + match is reported. If the timer expires and part or none of any + candidate alternative is satisfied, a timeout completion with + partial match is reported. + + 3) If an event is detected before the timer expires, it is mapped to + a digit string symbol and provisionally added to the end of the + current dial string. The duration of the event (long or not long) + is noted if and only if this is relevant in the current symbol + position (because at least one of the candidate alternative event + sequences includes the "Z" modifier at this position in the + sequence). + + 4) The current dial string is compared to the candidate alternative + event sequences. If and only if a sequence expecting a + long-duration event at this position is matched (i.e., the event + had long duration and met the specification for this position), + then any alternative event sequences not specifying a long + duration event at this position are discarded, and the current + dial string is modified by inserting a "Z" in front of the symbol + representing the latest event. Any sequence expecting a long- + duration event at this position but not matching the observed + event is discarded from the candidate set. If alternative event + sequences not specifying a long duration event in the given + + + + +Groves, et al. Standards Track [Page 44] + +RFC 3525 Gateway Control Protocol June 2003 + + + position remain in the candidate set after application of the + above rules, the observed event duration is treated as irrelevant + in assessing matches to them. + + 5) If exactly one candidate remains and it has been fully matched, a + completion event is generated indicating an unambiguous match. If + no candidates remain, the latest event is removed from the current + dial string and a completion event is generated indicating full + match if one of the candidates from the previous step was fully + satisfied before the latest event was detected, or partial match + otherwise. The event removed from the current dial string will + then be reported as per the currently active event processing + mechanisms. + + 6) If no completion event is reported out of step 5, processing + returns to step 2. + +7.1.14.6 DigitMap Activation + + A digit map is activated whenever a new Event descriptor is applied + to the Termination or embedded Event descriptor is activated, and + that Event descriptor contains a digit map completion event. The + digit map completion event contains an eventDM field in the requested + actions field. Each new activation of a digit map begins at step 1 + of the above procedure, with a clear current dial string. Any + previous contents of the current dial string from an earlier + activation are lost. + + A digit map completion event that does not contain an eventDM field + in its requested actions field is considered an error. Upon receipt + of such an event in an EventsDescriptor, a MG shall respond with an + error response, including Error 457 - Missing parameter in signal or + event. + +7.1.14.7 Interaction Of DigitMap and Event Processing + + While the digit map is activated, detection is enabled for all events + defined in the package containing the specified digit map completion + event. Normal event behaviour (e.g., stopping of signals unless the + digit completion event has the KeepActive flag enabled) continues to + apply for each such event detected, except that: + + - the events in the package containing the specified digit map + completion event other than the completion event itself are not + individually notified and have no side-effects unless separately + enabled; and + + + + + +Groves, et al. Standards Track [Page 45] + +RFC 3525 Gateway Control Protocol June 2003 + + + - an event that triggers a partial match completion event is not + recognized and therefore has no side effects until reprocessed + following the recognition of the digit map completion event. + +7.1.14.8 Wildcards + + Note that if a package contains a digit map completion event, then an + event specification consisting of the package name with a wildcarded + ItemID (Property Name) will activate a digit map; to that end, the + event specification must include an eventDM field according to + section 7.1.14.6. If the package also contains the digit events + themselves, this form of event specification will cause the + individual events to be reported to the MGC as they are detected. + +7.1.14.9 Example + + As an example, consider the following dial plan: + + 0 Local operator + + 00 Long-distance operator + + xxxx Local extension number (starts with 1-7) + + 8xxxxxxx Local number + + #xxxxxxx Off-site extension + + *xx Star services + + 91xxxxxxxxxx Long-distance number + + 9011 + up to 15 digits International number + + + + If the DTMF detection package described in E.6 is used to collect the + dialed digits, then the dialing plan shown above results in the + following digit map: + + (0| 00|[1-7]xxx|8xxxxxxx|Fxxxxxxx|Exx|91xxxxxxxxxx|9011x.) + +7.1.15 Statistics descriptor + + The Statistics Descriptor provides information describing the status + and usage of a Termination during its existence within a specific + Context. There is a set of standard statistics kept for each + Termination where appropriate (number of octets sent and received for + + + +Groves, et al. Standards Track [Page 46] + +RFC 3525 Gateway Control Protocol June 2003 + + + example). The particular statistical properties that are reported + for a given Termination are determined by the Packages realized by + the Termination. By default, statistics are reported when the + Termination is Subtracted from the Context. This behaviour can be + overridden by including an empty AuditDescriptor in the Subtract + command. Statistics may also be returned from the AuditValue + command, or any Add/Move/Modify command using the Audit descriptor. + + Statistics are cumulative; reporting Statistics does not reset them. + Statistics are reset when a Termination is Subtracted from a Context. + +7.1.16 Packages descriptor + + Used only with the AuditValue command, the PackageDescriptor returns + a list of Packages realized by the Termination. + +7.1.17 ObservedEvents descriptor + + ObservedEvents is supplied with the Notify command to inform the MGC + of which event(s) were detected. Used with the AuditValue command, + the ObservedEventsDescriptor returns events in the event buffer which + have not been Notified. ObservedEvents contains the + RequestIdentifier of the EventsDescriptor that triggered the + notification, the event(s) detected, optionally the detection time(s) + and any parameters of the observed event. Detection times are + reported with a precision of hundredths of a second. + +7.1.18 Topology descriptor + + A Topology descriptor is used to specify flow directions between + Terminations in a Context. Contrary to the descriptors in previous + subclauses, the Topology descriptor applies to a Context instead of a + Termination. The default topology of a Context is that each + Termination's transmission is received by all other Terminations. + The Topology descriptor is optional to implement. An MG that does + not support Topology descriptors, but receives a command containing + one, returns Error 444 Unsupported or unknown descriptor, and + optionally includes a string containing the name of the unsupported + Descriptor ("Topology") in the error text in the error descriptor. + + The Topology descriptor occurs before the commands in an action. It + is possible to have an action containing only a Topology descriptor, + provided that the Context to which the action applies already exists. + + + + + + + + +Groves, et al. Standards Track [Page 47] + +RFC 3525 Gateway Control Protocol June 2003 + + + A Topology descriptor consists of a sequence of triples of the form + (T1, T2, association). T1 and T2 specify Terminations within the + Context, possibly using the ALL or CHOOSE wildcard. The association + specifies how media flows between these two Terminations as follows. + + - (T1, T2, isolate) means that the Terminations matching T2 do not + receive media from the Terminations matching T1, nor vice versa. + + - (T1, T2, oneway) means that the Terminations that match T2 receive + media from the Terminations matching T1, but not vice versa. In + this case use of the ALL wildcard such that there are Terminations + that match both T1 and T2 is not allowed. + + - (T1, T2, bothway) means that the Terminations matching T2 receive + media from the Terminations matching T1, and vice versa. In this + case it is allowed to use wildcards such that there are + Terminations that match both T1 and T2. However, if there is a + Termination that matches both, no loopback is introduced. + + CHOOSE wildcards may be used in T1 and T2 as well, under the + following restrictions: + + - the action (see clause 8) of which the topology descriptor is part + contains an Add command in which a CHOOSE wildcard is used; + + - if a CHOOSE wildcard occurs in T1 or T2, then a partial name SHALL + NOT be specified. + + The CHOOSE wildcard in a Topology descriptor matches the + TerminationID that the MG assigns in the first Add command that uses + a CHOOSE wildcard in the same action. An existing Termination that + matches T1 or T2 in the Context to which a Termination is added, is + connected to the newly added Termination as specified by the Topology + descriptor. + + If a termination is not mentioned within a Topology Descriptor, any + topology associated with it remains unchanged. If, however, a new + termination is added into a context its association with the other + terminations within the context defaults to bothway, unless a + Topology Descriptor is given to change this (e.g., if T3 is added to + a context with T1 and T2 with topology (T3, T1, oneway) it will be + connected bothway to T2). + + Figure 7 and the table following it show some examples of the effect + of including topology descriptors in actions. In these examples it + is assumed that the topology descriptors are applied in sequence. + + + + + +Groves, et al. Standards Track [Page 48] + +RFC 3525 Gateway Control Protocol June 2003 + + + +------------------+ +------------------+ +------------------+ + | +----+ | | +----+ | | +----+ | + | | T2 | | | | T2 | | | | T2 | | + | +----+ | | +----+ | | +----+ | + | ^ ^ | | ^ | | ^ | + | | | | | | | | | | + | +--+ +--+ | | +---+ | | +--+ | + | | | | | | | | | | + | v v | | v | | | | + | +----+ +----+ | | +----+ +----+ | | +----+ +----+ | + | | T1 |<-->| T3 | | | | T1 |<-->| T3 | | | | T1 |<-->| T3 | | + | +----+ +----+ | | +----+ +----+ | | +----+ +----+ | + +------------------+ +------------------+ +------------------+ + 1. No Topology Desc. 2. T1, T2, Isolate 3. T3, T2, Oneway + + +------------------+ +------------------+ +------------------+ + | +----+ | | +----+ | | +----+ | + | | T2 | | | | T2 | | | | T2 | | + | +----+ | | +----+ | | +----+ | + | | | | ^ | | ^ ^ | + | | | | | | | | | | + | +--+ | | +---+ | | +--+ +--+ | + | | | | | | | | | | + | v | | v | | v v | + | +----+ +----+ | | +----+ +----+ | | +----+ +----+ | + | | T1 |<-->| T3 | | | | T1 |<-->| T3 | | | | T1 |<-->| T3 | | + | +----+ +----+ | | +----+ +----+ | | +----+ +----+ | + +------------------+ +------------------+ +------------------+ + 4. T2, T3 oneway 5. T2, T3 bothway 6. T1, T2 bothway + + Note: the direction of the arrow indicates the direction of flow. + + Figure 7: Example topologies + + Topology Description + + 1 No topology descriptors When no topology descriptors are + included, all Terminations have a + bothway connection to all other + Terminations. + + 2 T1, T2 Isolate Removes the connection between T1 and + T2. T3 has a bothway connection with + both T1 and T2. T1 and T2 have bothway + connection to T3. + + + + + + +Groves, et al. Standards Track [Page 49] + +RFC 3525 Gateway Control Protocol June 2003 + + + 3 T3, T2 oneway A oneway connection from T3 to T2 (i.e., + T2 receives media flow from T3). A + bothway connection between T1 and T3. + + 4 T2, T3 oneway A oneway connection between T2 to T3. + T1 and T3 remain bothway connected. + + 5 T2, T3 bothway T2 is bothway connected to T3. This + results in the same as 2. + + 6 T1, T2 bothway (T2, T3 All Terminations have a bothway + bothway and T1, T3 connection to all other Terminations. + bothway may be implied or + explicit). + + A oneway connection must be implemented in such a way that the other + Terminations in the Context are not aware of the change in topology. + +7.1.19 Error Descriptor + + If a responder encounters an error when processing a transaction + request, it must include an error descriptor in its response. A + Notify request may contain an error descriptor as well. + + An error descriptor consists of an IANA-registered error code, + optionally accompanied by an error text. H.248.8 contains a list of + valid error codes and error descriptions. + + An error descriptor shall be specified at the "deepest level" that is + semantically appropriate for the error being described and that is + possible given any parsing problems with the original request. An + error descriptor may refer to a syntactical construct other than + where it appears. For example, Error descriptor 422 - Syntax Error + in Action, could appear within a command even though it refers to the + larger construct - the action - and not the particular command within + which it appears. + +7.2 Command Application Programming Interface + + Following is an Application Programming Interface (API) describing + the Commands of the protocol. This API is shown to illustrate the + Commands and their parameters and is not intended to specify + implementation (e.g., via use of blocking function calls). It + describes the input parameters in parentheses after the command name + and the return values in front of the Command. This is only for + descriptive purposes; the actual Command syntax and encoding are + + + + + +Groves, et al. Standards Track [Page 50] + +RFC 3525 Gateway Control Protocol June 2003 + + + specified in later subclauses. The order of parameters to commands + is not fixed. Descriptors may appear as parameters to commands in + any order. The descriptors SHALL be processed in the order in which + they appear. + + Any reply to a command may contain an error descriptor; the API does + not specifically show this. + + All parameters enclosed by square brackets ([. . .]) are considered + optional. + +7.2.1 Add + + The Add Command adds a Termination to a Context. + + TerminationID + [,MediaDescriptor] + [,ModemDescriptor] + [,MuxDescriptor] + [,EventsDescriptor] + [,SignalsDescriptor] + [,DigitMapDescriptor] + [,ObservedEventsDescriptor] + [,EventBufferDescriptor] + [,StatisticsDescriptor] + [,PackagesDescriptor] + Add( TerminationID + [, MediaDescriptor] + [, ModemDescriptor] + [, MuxDescriptor] + [, EventsDescriptor] + [, EventBufferDescriptor] + [, SignalsDescriptor] + [, DigitMapDescriptor] + [, AuditDescriptor] + ) + + The TerminationID specifies the Termination to be added to the + Context. The Termination is either created, or taken from the null + Context. If a CHOOSE wildcard is used in the TerminationID, the + selected TerminationID will be returned. Wildcards may be used in an + Add, but such usage would be unusual. If the wildcard matches more + than one TerminationID, all possible matches are attempted, with + results reported for each one. The order of attempts when multiple + TerminationIDs match is not specified. + + The optional MediaDescriptor describes all media streams. + + + + +Groves, et al. Standards Track [Page 51] + +RFC 3525 Gateway Control Protocol June 2003 + + + The optional ModemDescriptor and MuxDescriptor specify a modem and + multiplexer if applicable. For convenience, if a Multiplex + descriptor is present in an Add command and lists any Terminations + that are not currently in the Context, such Terminations are added to + the Context as if individual Add commands listing the Terminations + were invoked. If an error occurs on such an implied Add, error 471 - + Implied Add for Multiplex failure shall be returned and further + processing of the command shall cease. + + The EventsDescriptor parameter is optional. If present, it provides + the list of events that should be detected on the Termination. + + The EventBufferDescriptor parameter is optional. If present, it + provides the list of events that the MG is requested to detect and + buffer when EventBufferControl equals LockStep. + + The SignalsDescriptor parameter is optional. If present, it provides + the list of signals that should be applied to the Termination. + + The DigitMapDescriptor parameter is optional. If present, it defines + a DigitMap definition that may be used in an EventsDescriptor. + + The AuditDescriptor is optional. If present, the command will return + descriptors as specified in the AuditDescriptor. + + All descriptors that can be modified could be returned by MG if a + parameter was underspecified or overspecified. ObservedEvents, + Statistics, and Packages, and the EventBuffer descriptors are + returned only if requested in the AuditDescriptor. + + Add SHALL NOT be used on a Termination with a serviceState of + "OutofService". + +7.2.2 Modify + + The Modify Command modifies the properties of a Termination. + + TerminationID + [,MediaDescriptor] + [,ModemDescriptor] + [,MuxDescriptor] + [,EventsDescriptor] + [,SignalsDescriptor] + [,DigitMapDescriptor] + [,ObservedEventsDescriptor] + [,EventBufferDescriptor] + [,StatisticsDescriptor] + [,PackagesDescriptor] + + + +Groves, et al. Standards Track [Page 52] + +RFC 3525 Gateway Control Protocol June 2003 + + + Modify( TerminationID + [, MediaDescriptor] + [, ModemDescriptor] + [, MuxDescriptor] + [, EventsDescriptor] + [, EventBufferDescriptor] + [, SignalsDescriptor] + [, DigitMapDescriptor] + [, AuditDescriptor] + ) + + The TerminationID may be specific if a single Termination in the + Context is to be modified. Use of wildcards in the TerminationID may + be appropriate for some operations. If the wildcard matches more + than one TerminationID, all possible matches are attempted, with + results reported for each one. The order of attempts when multiple + TerminationIDs match is not specified. The CHOOSE option is an + error, as the Modify command may only be used on existing + Terminations. + + For convenience, if a Multiplex Descriptor is present in a Modify + command, then: + + - if the new Multiplex Descriptor lists any Terminations that are + not currently in the Context, such Terminations are added to the + context as if individual commands listing the Terminations were + invoked. + + - if any Terminations listed previously in the Multiplex Descriptor + are no longer present in the new Multiplex Descriptor, they are + subtracted from the context as if individual Subtract commands + listing the Terminations were invoked. + + The remaining parameters to Modify are the same as those to Add. + Possible return values are the same as those to Add. + +7.2.3 Subtract + + The Subtract Command disconnects a Termination from its Context and + returns statistics on the Termination's participation in the Context. + + TerminationID + [,MediaDescriptor] + [,ModemDescriptor] + [,MuxDescriptor] + [,EventsDescriptor] + [,SignalsDescriptor] + [,DigitMapDescriptor] + + + +Groves, et al. Standards Track [Page 53] + +RFC 3525 Gateway Control Protocol June 2003 + + + [,ObservedEventsDescriptor] + [,EventBufferDescriptor] + [,StatisticsDescriptor] + [,PackagesDescriptor] + Subtract(TerminationID + [, AuditDescriptor] + ) + + TerminationID in the input parameters represents the Termination that + is being subtracted. The TerminationID may be specific or may be a + wildcard value indicating that all (or a set of related) Terminations + in the Context of the Subtract Command are to be subtracted. If the + wildcard matches more than one TerminationID, all possible matches + are attempted, with results reported for each one. The order of + attempts when multiple TerminationIDs match is not specified. + + The use of CHOOSE in the TerminationID is an error, as the Subtract + command may only be used on existing Terminations. + + ALL may be used as the ContextID as well as the TerminationId in a + Subtract, which would have the effect of deleting all Contexts, + deleting all ephemeral Terminations, and returning all physical + Terminations to Null Context. Subtract of a termination from the + Null Context is not allowed. + + For convenience, if a multiplexing Termination is the object of a + Subtract command, then any bearer Terminations listed in its + Multiplex Descriptor are subtracted from the context as if individual + Subtract commands listing the Terminations were invoked. + + By default, the Statistics parameter is returned to report + information collected on the Termination or Terminations specified in + the Command. The information reported applies to the Termination's + or Terminations' existence in the Context from which it or they are + being subtracted. + + The AuditDescriptor is optional. If present, the command will return + only those descriptors as specified in the AuditDescriptor, which may + be empty. If omitted, the Statistics descriptor is returned, by + default. Possible return values are the same as those to Add. + + When a provisioned Termination is Subtracted from a Context, its + property values shall revert to: + + - the default value, if specified for the property and not + overridden by provisioning; + + - otherwise, the provisioned value. + + + +Groves, et al. Standards Track [Page 54] + +RFC 3525 Gateway Control Protocol June 2003 + + +7.2.4 Move + + The Move Command moves a Termination to another Context from its + current Context in one atomic operation. The Move command is the + only command that refers to a Termination in a Context different from + that to which the command is applied. The Move command shall not be + used to move Terminations to or from the null Context. + + TerminationID + [,MediaDescriptor] + [,ModemDescriptor] + [,MuxDescriptor] + [,EventsDescriptor] + [,SignalsDescriptor] + [,DigitMapDescriptor] + [,ObservedEventsDescriptor] + [,EventBufferDescriptor] + [,StatisticsDescriptor] + [,PackagesDescriptor] + Move( TerminationID + [, MediaDescriptor] + [, ModemDescriptor] + [, MuxDescriptor] + [, EventsDescriptor] + [, EventBufferDescriptor] + [, SignalsDescriptor] + [, DigitMapDescriptor] + [, AuditDescriptor] + ) + + The TerminationID specifies the Termination to be moved. It may be + wildcarded, but CHOOSE shall not be used in the TerminationID. If + the wildcard matches more than one TerminationID, all possible + matches are attempted, with results reported for each one. The order + of attempts when multiple TerminationIDs match is not specified. The + Context to which the Termination is moved is indicated by the target + ContextId in the Action. If the last remaining Termination is moved + out of a Context, the Context is deleted. + + The Move command does not affect the properties of the Termination on + which it operates, except those properties explicitly modified by + descriptors included in the Move command. The AuditDescriptor with + the Statistics option, for example, would return statistics on the + Termination just prior to the Move. Possible descriptors returned + from Move are the same as for Add. + + + + + + +Groves, et al. Standards Track [Page 55] + +RFC 3525 Gateway Control Protocol June 2003 + + + For convenience, if a multiplexing Termination is the object of a + Move command, then any bearer Terminations listed in its Multiplex + Descriptor are also moved as if individual Move commands listing the + Terminations were invoked. + + Move SHALL NOT be used on a Termination with a serviceState of + "OutofService". + +7.2.5 AuditValue + + The AuditValue Command returns the current values of properties, + events, signals and statistics associated with Terminations. + + TerminationID + [,MediaDescriptor] + [,ModemDescriptor] + [,MuxDescriptor] + [,EventsDescriptor] + [,SignalsDescriptor] + [,DigitMapDescriptor] + [,ObservedEventsDescriptor] + [,EventBufferDescriptor] + [,StatisticsDescriptor] + [,PackagesDescriptor] + AuditValue(TerminationID, + AuditDescriptor + ) + + TerminationID may be specific or wildcarded. If the wildcard matches + more than one TerminationID, all possible matches are attempted, with + results reported for each one. The order of attempts when multiple + TerminationIDs match is not specified. If a wildcarded response is + requested, only one command return is generated, with the contents + containing the union of the values of all Terminations matching the + wildcard. This convention may reduce the volume of data required to + audit a group of Terminations. Use of CHOOSE is an error. + + The appropriate descriptors, with the current values for the + Termination, are returned from AuditValue. Values appearing in + multiple instances of a descriptor are defined to be alternate values + supported, with each parameter in a descriptor considered + independent. + + ObservedEvents returns a list of events in the EventBuffer. If the + ObservedEventsDescriptor is audited while a DigitMap is active, the + returned ObservedEvents descriptor also includes a digit map + completion event that shows the current dial string but does not show + a Termination method. + + + +Groves, et al. Standards Track [Page 56] + +RFC 3525 Gateway Control Protocol June 2003 + + + EventBuffer returns the set of events and associated parameter values + currently enabled in the EventBufferDescriptor. PackagesDescriptor + returns a list of packages realized by the Termination. + DigitMapDescriptor returns the name or value of the current DigitMap + for the Termination. DigitMap requested in an AuditValue command + with TerminationID ALL returns all DigitMaps in the gateway. + Statistics returns the current values of all statistics being kept on + the Termination. Specifying an empty Audit descriptor results in + only the TerminationID being returned. This may be useful to get a + list of TerminationIDs when used with wildcard. Annexes A and B + provide a special syntax for presenting such a list in condensed + form, such that the AuditValue command tag does not have to be + repeated for each TerminationID. + + AuditValue results depend on the Context, viz. specific, null, or + wildcarded. (Note that ContextID ALL does not include the null + Context.) The TerminationID may be specific, or wildcarded. + + The following are examples of what is returned in case the context + and/or the termination is wildcarded and a wildcarded response has + been specified. + + Assume that the gateway has 4 terminations: t1/1, t1/2, t2/1 and + t2/2. Assume that terminations t1/* have implemented packages aaa + and bbb and that terminations t2/* have implemented packages ccc and + ddd. Assume that Context 1 has t1/1 and t2/1 in it and that Context + 2 has t1/2 and t2/2 in it. + + The command: + + Context=1{AuditValue=t1/1{Audit{Packages}}} + + Returns: + + Context=1{AuditValue=t1/1{Packages{aaa,bbb}}} + + The command: + + Context=*{AuditValue=t2/*{Audit{Packages}}} + + Returns: + + Context=1{AuditValue=t2/1{Packages{ccc,ddd}}}, + Context=2{AuditValue=t2/2{Packages{ccc,ddd}}} + + The command: + + Context=*{W-AuditValue=t1/*{Audit{Packages}}} + + + +Groves, et al. Standards Track [Page 57] + +RFC 3525 Gateway Control Protocol June 2003 + + + Returns: + + Context=*{W-AuditValue=t1/*{Packages{aaa,bbb}}} + + Note: A wildcard response may also be used for other commands such as + Subtract. + + The following illustrates other information that can be obtained with + the AuditValue Command: + + ContextID TerminationID Information Obtained + + Specific wildcard Audit of matching Terminations in a Context + + Specific specific Audit of a single Termination in a Context + + Null Root Audit of Media Gateway state and events + + Null wildcard Audit of all matching Terminations in the + null Context + + Null specific Audit of a single Termination outside of any + Context + + All wildcard Audit of all matching Terminations and the + Context to which they are associated + + All Root List of all ContextIds (the ContextID list + should be returned by using multiple action + replies, each containing a ContextID from + the list) + + All Specific (Non-null) ContextID in which the + Termination currently exists + + + + + + + + + + + + + + + + + +Groves, et al. Standards Track [Page 58] + +RFC 3525 Gateway Control Protocol June 2003 + + +7.2.6 AuditCapabilities + + The AuditCapabilities Command returns the possible values of + properties, events, signals and statistics associated with + Terminations. + + TerminationID + [,MediaDescriptor] + [,ModemDescriptor] + [,MuxDescriptor] + [,EventsDescriptor] + [,SignalsDescriptor] + [,ObservedEventsDescriptor] + [,EventBufferDescriptor] + [,StatisticsDescriptor] + AuditCapabilities(TerminationID, + AuditDescriptor + ) + + The appropriate descriptors, with the possible values for the + Termination are returned from AuditCapabilities. Descriptors may be + repeated where there are multiple possible values. If a wildcarded + response is requested, only one command return is generated, with the + contents containing the union of the values of all Terminations + matching the wildcard. This convention may reduce the volume of data + required to audit a group of Terminations. + + Interpretation of what capabilities are requested for various values + of ContextID and TerminationID is the same as in AuditValue. + + The EventsDescriptor returns the list of possible events on the + Termination together with the list of all possible values for the + EventsDescriptor Parameters. EventBufferDescriptor returns the same + information as EventsDescriptor. The SignalsDescriptor returns the + list of possible signals that could be applied to the Termination + together with the list of all possible values for the Signals + Parameters. StatisticsDescriptor returns the names of the statistics + being kept on the termination. ObservedEventsDescriptor returns the + names of active events on the Termination. DigitMap and Packages are + not legal in AuditCapability. + + + + + + + + + + + +Groves, et al. Standards Track [Page 59] + +RFC 3525 Gateway Control Protocol June 2003 + + + The following illustrates other information that can be obtained with + the AuditCapabilties Command: + + ContextID TerminationID Information Obtained + + Specific wildcard Audit of matching Terminations in a Context + + Specific specific Audit of a single Termination in a Context + + Null Root Audit of MG state and events + + Null wildcard Audit of all matching Terminations in the + Null Context + + Null specific Audit of a single Termination outside of any + Context + + All wildcard Audit of all matching Terminations and the + Context to which they are associated + + All Root Same as for AuditValue + + All Specific Same as for AuditValue + +7.2.7 Notify + + The Notify Command allows the Media Gateway to notify the Media + Gateway Controller of events occurring within the Media Gateway. + + TerminationID + Notify(TerminationID, + ObservedEventsDescriptor, + [ErrorDescriptor] + ) + + The TerminationID parameter specifies the Termination issuing the + Notify Command. The TerminationID shall be a fully qualified name. + + The ObservedEventsDescriptor contains the RequestID and a list of + events that the Media Gateway detected in the order that they were + detected. Each event in the list is accompanied by parameters + associated with the event and optionally an indication of the time + that the event was detected. Procedures for sending Notify commands + with RequestID equal to 0 are for further study. + + Notify Commands with RequestID not equal to 0 shall occur only as the + result of detection of an event specified by an Events descriptor + which is active on the Termination concerned. + + + +Groves, et al. Standards Track [Page 60] + +RFC 3525 Gateway Control Protocol June 2003 + + + The RequestID returns the RequestID parameter of the EventsDescriptor + that triggered the Notify Command. It is used to correlate the + notification with the request that triggered it. The events in the + list must have been requested via the triggering EventsDescriptor or + embedded events descriptor unless the RequestID is 0 (which is for + further study). + + The ErrorDescriptor may be sent in the Notify Command as a result of + Error 518 - Event buffer full. + +7.2.8 ServiceChange + + The ServiceChange Command allows the Media Gateway to notify the + Media Gateway Controller that a Termination or group of Terminations + is about to be taken out of service or has just been returned to + service. The Media Gateway Controller may indicate that + Termination(s) shall be taken out of or returned to service. The + Media Gateway may notify the MGC that the capability of a Termination + has changed. It also allows a MGC to hand over control of a MG to + another MGC. + + TerminationID, + + [ServiceChangeDescriptor] + ServiceChange ( TerminationID, + ServiceChangeDescriptor + ) + + The TerminationID parameter specifies the Termination(s) that are + taken out of or returned to service. Wildcarding of Termination + names is permitted, with the exception that the CHOOSE mechanism + shall not be used. Use of the "Root" TerminationID indicates a + ServiceChange affecting the entire Media Gateway. + + The ServiceChangeDescriptor contains the following parameters as + required: + + - ServiceChangeMethod + - ServiceChangeReason + - ServiceChangeDelay + - ServiceChangeAddress + - ServiceChangeProfile + - ServiceChangeVersion + - ServiceChangeMgcId + - TimeStamp + + + + + + +Groves, et al. Standards Track [Page 61] + +RFC 3525 Gateway Control Protocol June 2003 + + + The ServiceChangeMethod parameter specifies the type of ServiceChange + that will or has occurred: + + 1) Graceful - indicates that the specified Terminations will be taken + out of service after the specified ServiceChangeDelay; established + connections are not yet affected, but the Media Gateway Controller + should refrain from establishing new connections and should + attempt to gracefully tear down existing connections on the + Termination(s) affected by the serviceChange command. The MG + should set Termination serviceState at the expiry of + ServiceChangeDelay or the removal of the Termination from an + active Context (whichever is first), to "out of service". + + 2) Forced - indicates that the specified Terminations were taken + abruptly out of service and any established connections associated + with them may be lost. For non-Root terminations, the MGC is + responsible for cleaning up the Context (if any) with which the + failed Termination is associated. At a minimum the Termination + shall be subtracted from the Context. The Termination + serviceState should be "out of service". For the root + termination, the MGC can assume that all connections are lost on + the MG and thus can consider that all the terminations have been + subtracted. + + 3) Restart - indicates that service will be restored on the specified + Terminations after expiration of the ServiceChangeDelay. The + serviceState should be set to "inService" upon expiry of + ServiceChangeDelay. + + 4) Disconnected - always applied with the Root TerminationID, + indicates that the MG lost communication with the MGC, but it was + subsequently restored to the same MGC (possibly after trying other + MGCs on a pre-provisioned list). Since MG state may have changed, + the MGC may wish to use the Audit command to resynchronize its + state with the MG's. + + 5) Handoff - sent from the MGC to the MG, this reason indicates that + the MGC is going out of service and a new MGC association must be + established. Sent from the MG to the MGC, this indicates that the + MG is attempting to establish a new association in accordance with + a Handoff received from the MGC with which it was previously + associated. + + 6) Failover - sent from MG to MGC to indicate the primary MG is out + of service and a secondary MG is taking over. This serviceChange + method is also sent from the MG to the MGC when the MG detects + that MGC has failed. + + + + +Groves, et al. Standards Track [Page 62] + +RFC 3525 Gateway Control Protocol June 2003 + + + 7) Another value whose meaning is mutually understood between the MG + and the MGC. + + The ServiceChangeReason parameter specifies the reason why the + ServiceChange has or will occur. It consists of an alphanumeric + token (IANA registered) and, optionally, an explanatory string. + + The optional ServiceChangeAddress parameter specifies the address + (e.g., IP port number for IP networks) to be used for subsequent + communications. It can be specified in the input parameter + descriptor or the returned result descriptor. ServiceChangeAddress + and ServiceChangeMgcId parameters must not both be present in the + ServiceChangeDescriptor or the ServiceChangeResultDescriptor. The + ServiceChangeAddress provides an address to be used within the + Context of the association currently being negotiated, while the + ServiceChangeMgcId provides an alternate address where the MG should + seek to establish another association. Note that the use of + ServiceChangeAddress is not encouraged. MGCs and MGs must be able to + cope with the ServiceChangeAddress being either a full address or + just a port number in the case of TCP transports. + + The optional ServiceChangeDelay parameter is expressed in seconds. + If the delay is absent or set to zero, the delay value should be + considered to be null. In the case of a "graceful" + ServiceChangeMethod, a null delay indicates that the Media Gateway + Controller should wait for the natural removal of existing + connections and should not establish new connections. For "graceful" + only, a null delay means the MG must not set serviceState "out of + service" until the Termination is in the null Context. + + The optional ServiceChangeProfile parameter specifies the Profile (if + any) of the protocol supported. The ServiceChangeProfile includes + the version of the profile supported. + + The optional ServiceChangeVersion parameter contains the protocol + version and is used if protocol version negotiation occurs (see + 11.3). + + The optional TimeStamp parameter specifies the actual time as kept by + the sender. As such, it is not necessarily absolute time according + to, for example, a local time zone - it merely establishes an + arbitrary starting time against which all future timestamps + transmitted by a sender during this association shall be compared. + It can be used by the responder to determine how its notion of time + differs from that of its correspondent. TimeStamp is sent with a + precision of hundredths of a second. + + + + + +Groves, et al. Standards Track [Page 63] + +RFC 3525 Gateway Control Protocol June 2003 + + + The optional Extension parameter may contain any value whose meaning + is mutually understood by the MG and MGC. + + A ServiceChange Command specifying the "Root" for the TerminationID + and ServiceChangeMethod equal to Restart is a registration command by + which a Media Gateway announces its existence to the Media Gateway + Controller. The Media Gateway may also announce a registration + command by specifying the "Root" for the TerminationID and + ServiceChangeMethod equal to Failover when the MG detects MGC + failures. The Media Gateway is expected to be provisioned with the + name of one primary and optionally some number of alternate Media + Gateway Controllers. Acknowledgement of the ServiceChange Command + completes the registration process, except when the MGC has returned + an alternative ServiceChangeMgcId as described in the following + paragraph. The MG may specify the transport ServiceChangeAddress to + be used by the MGC for sending messages in the ServiceChangeAddress + parameter in the input ServiceChangeDescriptor. The MG may specify + an address in the ServiceChangeAddress parameter of the ServiceChange + request, and the MGC may also do so in the ServiceChange reply. In + either case, the recipient must use the supplied address as the + destination for all subsequent transaction requests within the + association. At the same time, as indicated in clause 9, transaction + replies and pending indications must be sent to the address from + which the corresponding requests originated. This must be done even + if it implies extra messaging because commands and responses cannot + be packed together. The TimeStamp parameter shall be sent with a + registration command and its response. + + The Media Gateway Controller may return a ServiceChangeMgcId + parameter that describes the Media Gateway Controller that should + preferably be contacted for further service by the Media Gateway. In + this case the Media Gateway shall reissue the ServiceChange command + to the new Media Gateway Controller. The MGC specified in a + ServiceChangeMgcId, if provided, shall be contacted before any + further alternate MGCs. On a HandOff message from MGC to MG, the + ServiceChangeMgcId is the new MGC that will take over from the + current MGC. + + The return from ServiceChange is empty except when the Root + terminationID is used. In that case it includes the following + parameters as required: + + - ServiceChangeAddress, if the responding MGC wishes to specify a + new destination for messages from the MG for the remainder of the + association; + + - ServiceChangeMgcId, if the responding MGC does not wish to sustain + an association with the MG; + + + +Groves, et al. Standards Track [Page 64] + +RFC 3525 Gateway Control Protocol June 2003 + + + - ServiceChangeProfile, if the responder wishes to negotiate the + profile to be used for the association; + + - ServiceChangeVersion, if the responder wishes to negotiate the + version of the protocol to be used for the association. + + The following ServiceChangeReasons are defined. This list may be + extended by an IANA registration as outlined in 13.3. + + 900 Service Restored + 901 Cold Boot + 902 Warm Boot + 903 MGC Directed Change + 904 Termination malfunctioning + 905 Termination taken out of service + 906 Loss of lower layer connectivity (e.g., downstream sync) + 907 Transmission Failure + 908 MG Impending Failure + 909 MGC Impending Failure + 910 Media Capability Failure + 911 Modem Capability Failure + 912 Mux Capability Failure + 913 Signal Capability Failure + 914 Event Capability Failure + 915 State Loss + +7.2.9 Manipulating and Auditing Context Attributes + + The commands of the protocol as discussed in the preceding subclauses + apply to Terminations. This subclause specifies how Contexts are + manipulated and audited. + + Commands are grouped into actions (see clause 8). An action applies + to one Context. In addition to commands, an action may contain + Context manipulation and auditing instructions. + + An action request sent to a MG may include a request to audit + attributes of a Context. An action may also include a request to + change the attributes of a Context. + + The Context properties that may be included in an action reply are + used to return information to a MGC. This can be information + requested by an audit of Context attributes or details of the effect + of manipulation of a Context. + + + + + + + +Groves, et al. Standards Track [Page 65] + +RFC 3525 Gateway Control Protocol June 2003 + + + If a MG receives an action which contains both a request to audit + context attributes and a request to manipulate those attributes, the + response SHALL include the values of the attributes after processing + the manipulation request. + +7.2.10 Generic Command Syntax + + The protocol can be encoded in a binary format or in a text format. + MGCs should support both encoding formats. MGs may support both + formats. + + The protocol syntax for the binary format of the protocol is defined + in Annex A. Annex C specifies the encoding of the Local and Remote + descriptors for use with the binary format. + + A complete ABNF of the text encoding of the protocol per RFC 2234 is + given in Annex B. SDP is used as the encoding of the Local and + Remote descriptors for use with the text encoding as modified in + 7.1.8. + +7.3 Command Error Codes + + Errors consist of an IANA registered error code and an explanatory + string. Sending the explanatory string is optional. Implementations + are encouraged to append diagnostic information to the end of the + string. + + When a MG reports an error to a MGC, it does so in an error + descriptor. An error descriptor consists of an error code and + optionally the associated explanatory string. + + H.248.8 contains the error codes supported by Recommendations in the + H.248 sub-series. + +8 Transactions + + Commands between the Media Gateway Controller and the Media Gateway + are grouped into Transactions, each of which is identified by a + TransactionID. Transactions consist of one or more Actions. An + Action consists of a non-empty series of Commands, Context property + modifications, or Context property audits that are limited to + operating within a single Context. Consequently, each Action + typically specifies a ContextID. However, there are two + circumstances where a specific ContextID is not provided with an + Action. One is the case of modification of a Termination outside of + a Context. The other is where the controller requests the gateway to + create a new Context. Figure 8 is a graphic representation of the + Transaction, Action and Command relationships. + + + +Groves, et al. Standards Track [Page 66] + +RFC 3525 Gateway Control Protocol June 2003 + + + +----------------------------------------------------------+ + | Transaction x | + | +----------------------------------------------------+ | + | | Action 1 | | + | | +---------+ +---------+ +---------+ +---------+ | | + | | | Command | | Command | | Command | | Command | | | + | | | 1 | | 2 | | 3 | | 4 | | | + | | +---------+ +---------+ +---------+ +---------+ | | + | +----------------------------------------------------+ | + | | + | +----------------------------------------------------+ | + | | Action 2 | | + | | +---------+ | | + | | | Command | | | + | | | 1 | | | + | | +---------+ | | + | +----------------------------------------------------+ | + | | + | +----------------------------------------------------+ | + | | Action 3 | | + | | +---------+ +---------+ +---------+ | | + | | | Command | | Command | | Command | | | + | | | 1 | | 2 | | 3 | | | + | | +---------+ +---------+ +---------+ | | + | +----------------------------------------------------+ | + +----------------------------------------------------------+ + + Figure 8: Transactions, Actions and Commands + + Transactions are presented as TransactionRequests. Corresponding + responses to a TransactionRequest are received in a single reply, + possibly preceded by a number of TransactionPending messages (see + 8.2.3). + + Transactions guarantee ordered Command processing. That is, Commands + within a Transaction are executed sequentially. Ordering of + Transactions is NOT guaranteed - transactions may be executed in any + order, or simultaneously. + + At the first failing Command in a Transaction, processing of the + remaining Commands in that Transaction stops. If a command contains + a wildcarded TerminationID, the command is attempted with each of the + actual TerminationIDs matching the wildcard. A response within the + TransactionReply is included for each matching TerminationID, even if + one or more instances generated an error. If any TerminationID + matching a wildcard results in an error when executed, any commands + following the wildcarded command are not attempted. + + + + +Groves, et al. Standards Track [Page 67] + +RFC 3525 Gateway Control Protocol June 2003 + + + Commands may be marked as "Optional" which can override this + behaviour - if a command marked as Optional results in an error, + subsequent commands in the Transaction will be executed. If a + command fails, the MG shall as far as possible restore the state that + existed prior to the attempted execution of the command before + continuing with command processing. + + A TransactionReply includes the results for all of the Commands in + the corresponding TransactionRequest. The TransactionReply includes + the return values for the Commands that were executed successfully, + and the Command and error descriptor for any Command that failed. + + TransactionPending is used to periodically notify the receiver that a + Transaction has not completed yet, but is actively being processed. + + Applications SHOULD implement an application level timer per + transaction. Expiration of the timer should cause a retransmission + of the request. Receipt of a Reply should cancel the timer. Receipt + of Pending should restart the timer. + +8.1 Common parameters + +8.1.1 Transaction Identifiers + + Transactions are identified by a TransactionID, which is assigned by + sender and is unique within the scope of the sender. A response + containing an error descriptor to indicate that the TransactionID is + missing in a request shall use TransactionID 0 in the corresponding + TransactionReply. + +8.1.2 Context Identifiers + + Contexts are identified by a ContextID, which is assigned by the + Media Gateway and is unique within the scope of the Media Gateway. + The Media Gateway Controller shall use the ContextID supplied by the + Media Gateway in all subsequent Transactions relating to that + Context. The protocol makes reference to a distinguished value that + may be used by the Media Gateway Controller when referring to a + Termination that is currently not associated with a Context, namely + the null ContextID. + + The CHOOSE wildcard is used to request that the Media Gateway create + a new Context. + + The MGC may use the ALL wildcard to address all Contexts on the MG. + The null Context is not included when the ALL wildcard is used. + + + + + +Groves, et al. Standards Track [Page 68] + +RFC 3525 Gateway Control Protocol June 2003 + + + The MGC shall not use partially specified ContextIDs containing the + CHOOSE or ALL wildcards. + +8.2 Transaction Application Programming Interface + + Following is an Application Programming Interface (API) describing + the Transactions of the protocol. This API is shown to illustrate + the Transactions and their parameters and is not intended to specify + implementation (e.g., via use of blocking function calls). It will + describe the input parameters and return values expected to be used + by the various Transactions of the protocol from a very high level. + Transaction syntax and encodings are specified in later subclauses. + +8.2.1 TransactionRequest + + The TransactionRequest is invoked by the sender. There is one + Transaction per request invocation. A request contains one or more + Actions, each of which specifies its target Context and one or more + Commands per Context. + + TransactionRequest(TransactionId { + ContextID {Command ... Command}, + . . . + ContextID {Command ... Command } }) + + The TransactionID parameter must specify a value for later + correlation with the TransactionReply or TransactionPending response + from the receiver. + + The ContextID parameter must specify a value to pertain to all + Commands that follow up to either the next specification of a + ContextID parameter or the end of the TransactionRequest, whichever + comes first. + + The Command parameter represents one of the Commands mentioned in 7.2 + (Command Application Programming Interface). + +8.2.2 TransactionReply + + The TransactionReply is invoked by the receiver. There is one reply + invocation per transaction. A reply contains one or more Actions, + each of which must specify its target Context and one or more + Responses per Context. The TransactionReply is invoked by the + responder when it has processed the TransactionRequest. + + + + + + + +Groves, et al. Standards Track [Page 69] + +RFC 3525 Gateway Control Protocol June 2003 + + + A TransactionRequest has been processed: + + - when all actions in that TransactionRequest have been processed; + or + + - when an error is encountered in processing that + TransactionRequest, except when the error is in an optional + command. + + A command has been processed when all descriptors in that command + have been processed. + + A SignalsDescriptor is considered to have been processed when it has + been established that the descriptor is syntactically valid, the + requested signals are supported and they have been queued to be + applied. + + An EventsDescriptor or EventBufferDescriptor is considered to have + been processed when it has been established that the descriptor is + syntactically valid, the requested events can be observed, any + embedded signals can be generated, any embedded events can be + detected, and the MG has been brought into a state in which the + events will be detected. + + TransactionReply(TransactionID { + ContextID { Response ... Response }, + . . . + ContextID { Response ... Response } }) + + The TransactionID parameter must be the same as that of the + corresponding TransactionRequest. + + The ContextID parameter must specify a value to pertain to all + Responses for the action. The ContextID may be specific, all or + null. + + Each of the Response parameters represents a return value as + mentioned in 7.2, or an error descriptor if the command execution + encountered an error. Commands after the point of failure are not + processed and, therefore, Responses are not issued for them. + + An exception to this occurs if a command has been marked as optional + in the Transaction request. If the optional command generates an + error, the transaction still continues to execute, so the Reply + would, in this case, have Responses after an Error. + + Section 7.1.19 Error Descriptor specifies the generation of error + descriptors. The text below discusses several individual cases. + + + +Groves, et al. Standards Track [Page 70] + +RFC 3525 Gateway Control Protocol June 2003 + + + If the receiver encounters an error in processing a ContextID, the + requested Action response will consist of the Context ID and a single + error descriptor, 422 - Syntax Error in Action. + + If the receiver encounters an error such that it cannot determine a + legal Action, it will return a TransactionReply consisting of the + TransactionID and a single error descriptor, 422 - Syntax Error in + Action. If the end of an action cannot be reliably determined but + one or more commands can be parsed, it will process them and then + send 422 - Syntax Error in Action as the last action for the + transaction. If the receiver encounters an error such that is cannot + determine a legal Transaction, it will return a TransactionReply with + a null TransactionID and a single error descriptor (403 - Syntax + Error in TransactionRequest). + + If the end of a transaction cannot be reliably determined and one or + more Actions can be parsed, it will process them and then return 403 + - Syntax Error in Transaction as the last action reply for the + transaction. If no Actions can be parsed, it will return 403 - + Syntax Error in TransactionRequest as the only reply. + + If the terminationID cannot be reliably determined, it will send 442 + - Syntax Error in Command as the action reply. + + If the end of a command cannot be reliably determined, it will return + 442 - Syntax Error in Command as the reply to the last action it can + parse. + +8.2.3 TransactionPending + + The receiver invokes the TransactionPending. A TransactionPending + indicates that the Transaction is actively being processed, but has + not been completed. It is used to prevent the sender from assuming + the TransactionRequest was lost where the Transaction will take some + time to complete. + + TransactionPending(TransactionID { } ) + + The TransactionID parameter must be the same as that of the + corresponding TransactionRequest. A property of root + (normalMGExecutionTime) is settable by the MGC to indicate the + interval within which the MGC expects a response to any transaction + from the MG. Another property (normalMGCExecutionTime) is settable + by the MGC to indicate the interval within which the MG should expect + a response to any transaction from the MGC. Senders may receive more + than one TransactionPending for a command. If a duplicate request is + + + + + +Groves, et al. Standards Track [Page 71] + +RFC 3525 Gateway Control Protocol June 2003 + + + received when pending, the responder may send a duplicate pending + immediately, or continue waiting for its timer to trigger another + TransactionPending. + +8.3 Messages + + Multiple Transactions can be concatenated into a Message. Messages + have a header, which includes the identity of the sender. The + Message Identifier (MID) of a message is set to a provisioned name + (e.g., domain address/domain name/device name) of the entity + transmitting the message. Domain name is a suggested default. An + H.248.1 entity (MG/MGC) must consistently use the same MID in all + messages it originates for the duration of control association with + the peer (MGC/MG). + + Every Message contains a Version Number identifying the version of + the protocol the message conforms to. Versions consist of one or two + digits, beginning with version 1 for the present version of the + protocol. + + The transactions in a message are treated independently. There is no + order implied; there is no application or protocol acknowledgement of + a message. A message is essentially a transport mechanism. For + example, message X containing transaction requests A, B, and C may be + responded to with message Y containing replies to A and C and message + Z containing the reply to B. Likewise, message L containing request + D and message M containing request E may be responded to with message + N containing replies to both D and E. + +9 Transport + + The transport mechanism for the protocol should allow the reliable + transport of transactions between a MGC and MG. The transport shall + remain independent of what particular commands are being sent and + shall be applicable to all application states. There are several + transports defined for the protocol, which are defined in Annexes to + this RFC and other Recommendations of the H.248 + sub-series. Additional Transports may be defined as additional + + Recommendations of the H.248 sub-series. For transport of the + protocol over IP, MGCs shall implement both TCP and UDP/ALF, a MG + shall implement TCP or UDP/ALF or both. + + The MG is provisioned with a name or address (such as DNS name or IP + address) of a primary and zero or more secondary MGCs (see 7.2.8) + that is the address the MG uses to send messages to the MGC. If TCP + or UDP is used as the protocol transport and the port to which the + initial ServiceChange request is to be sent is not otherwise known, + + + +Groves, et al. Standards Track [Page 72] + +RFC 3525 Gateway Control Protocol June 2003 + + + that request should be sent to the default port number for the + protocol. This port number is 2944 for text-encoded operation or + 2945 for binary-encoded operation, for either UDP or TCP. The MGC + receives the message containing the ServiceChange request from the MG + and can determine the MG's address from it. As described in 7.2.8, + either the MG or the MGC may supply an address in the + ServiceChangeAddress parameter to which subsequent transaction + requests must be addressed, but responses (including the response to + the initial ServiceChange request) must always be sent back to the + address which was the source of the corresponding request. For + example, in IP networks, this is the source address in the IP header + and the source port number in the TCP/UDP/SCTP header. + +9.1 Ordering of Commands + + This RFC does not mandate that the underlying transport protocol + guarantees the sequencing of transactions sent to an entity. This + property tends to maximize the timeliness of actions, but it has a + few drawbacks. For example: + + - Notify commands may be delayed and arrive at the MGC after the + transmission of a new command changing the EventsDescriptor. + + - If a new command is transmitted before a previous one is + acknowledged, there is no guarantee that prior command will be + executed before the new one. + + Media Gateway Controllers that want to guarantee consistent operation + of the Media Gateway may use the following rules. These rules are + with respect to commands that are in different transactions. + Commands that are in the same transaction are executed in order (see + clause 8). + + 1) When a Media Gateway handles several Terminations, commands + pertaining to the different Terminations may be sent in parallel, + for example following a model where each Termination (or group of + Terminations) is controlled by its own process or its own thread. + + 2) On a Termination, there should normally be at most one outstanding + command (Add or Modify or Move), unless the outstanding commands + are in the same transaction. However, a Subtract command may be + issued at any time. In consequence, a Media Gateway may sometimes + receive a Modify command that applies to a previously subtracted + Termination. Such commands should be ignored, and an error code + should be returned. + + + + + + +Groves, et al. Standards Track [Page 73] + +RFC 3525 Gateway Control Protocol June 2003 + + + 3) For transports that do not guarantee in-sequence delivery of + messages (i.e., UDP), there should normally be on a given + Termination at most one outstanding Notify command at any time. + + 4) In some cases, an implicitly or explicitly wildcarded Subtract + command that applies to a group of Terminations may step in front + of a pending Add command. The Media Gateway Controller should + individually delete all Terminations for which an Add command was + pending at the time of the global Subtract command. Also, new Add + commands for Terminations named by the wildcarding (or implied in + a Multiplex descriptor) should not be sent until the wildcarded + Subtract command is acknowledged. + + 5) AuditValue and AuditCapability are not subject to any sequencing. + + 6) ServiceChange shall always be the first command sent by a MG as + defined by the restart procedure. Any other command or response + must be delivered after this ServiceChange command. + + These rules do not affect the command responder, which should always + respond to commands. + +9.2 Protection against Restart Avalanche + + In the event that a large number of Media Gateways are powered on + simultaneously and they were to all initiate a ServiceChange + transaction, the Media Gateway Controller would very likely be + swamped, leading to message losses and network congestion during the + critical period of service restoration. In order to prevent such + avalanches, the following behaviour is suggested: + + 1) When a Media Gateway is powered on, it should initiate a restart + timer to a random value, uniformly distributed between 0 and a + maximum waiting delay (MWD). Care should be taken to avoid + synchronicity of the random number generation between multiple + Media Gateways that would use the same algorithm. + + 2) The Media Gateway should then wait for either the end of this + timer or the detection of a local user activity, such as for + example an off-hook transition on a residential Media Gateway. + + 3) When the timer elapses, or when an activity is detected, the Media + Gateway should initiate the restart procedure. + + The restart procedure simply requires the MG to guarantee that the + first message that the Media Gateway Controller sees from this MG is + a ServiceChange message informing the Media Gateway Controller about + the restart. + + + +Groves, et al. Standards Track [Page 74] + +RFC 3525 Gateway Control Protocol June 2003 + + + NOTE - The value of MWD is a configuration parameter that depends + on the type of the Media Gateway. The following reasoning may be + used to determine the value of this delay on residential gateways. + + Media Gateway Controllers are typically dimensioned to handle the + peak hour traffic load, during which, in average, 10% of the lines + will be busy, placing calls whose average duration is typically 3 + minutes. The processing of a call typically involves 5 to 6 Media + Gateway Controller transactions between each Media Gateway and the + Media Gateway Controller. This simple calculation shows that the + Media Gateway Controller is expected to handle 5 to 6 transactions + for each Termination, every 30 minutes on average, or, to put it + otherwise, about one transaction per Termination every 5 to 6 minutes + on average. This suggests that a reasonable value of MWD for a + residential gateway would be 10 to 12 minutes. In the absence of + explicit configuration, residential gateways should adopt a value of + 600 seconds for MWD. + + The same reasoning suggests that the value of MWD should be much + shorter for trunking gateways or for business gateways, because they + handle a large number of Terminations, and also because the usage + rate of these Terminations is much higher than 10% during the peak + busy hour, a typical value being 60%. These Terminations, during the + peak hour, are this expected to contribute about one transaction per + minute to the Media Gateway Controller load. A reasonable algorithm + is to make the value of MWD per "trunk" Termination six times shorter + than the MWD per residential gateway, and also inversely proportional + to the number of Terminations that are being restarted. For example + MWD should be set to 2.5 seconds for a gateway that handles a T1 + line, or to 60 milliseconds for a gateway that handles a T3 line. + +10 Security Considerations + + This clause covers security when using the protocol in an IP + environment. + +10.1 Protection of Protocol Connections + + A security mechanism is clearly needed to prevent unauthorized + entities from using the protocol defined in this RFC for setting up + unauthorized calls or interfering with authorized calls. The + security mechanism for the protocol when transported over IP networks + is IPsec [RFC 2401 to RFC 2411]. + + The AH header [RFC 2402] affords data origin authentication, + connectionless integrity and optional anti-replay protection of + messages passed between the MG and the MGC. The ESP header [RFC + 2406] provides confidentiality of messages, if desired. For + + + +Groves, et al. Standards Track [Page 75] + +RFC 3525 Gateway Control Protocol June 2003 + + + instance, the ESP encryption service should be requested if the + session descriptions are used to carry session keys, as defined in + SDP. + + Implementations of the protocol defined in this RFC employing the ESP + header SHALL comply with section 5 of [RFC 2406], which defines a + minimum set of algorithms for integrity checking and encryption. + Similarly, implementations employing the AH header SHALL comply with + section 5 of [RFC 2402], which defines a minimum set of algorithms + for integrity checking using manual keys. + + Implementations SHOULD use IKE [RFC 2409] to permit more robust + keying options. Implementations employing IKE SHOULD support + authentication with RSA signatures and RSA public key encryption. + +10.2 Interim AH scheme + + Implementation of IPsec requires that the AH or ESP header be + inserted immediately after the IP header. This cannot be easily done + at the application level. Therefore, this presents a deployment + problem for the protocol defined in this RFC where the underlying + network implementation does not support IPsec. + + As an interim solution, an optional AH header is defined within the + H.248.1 protocol header. The header fields are exactly those of the + SPI, SEQUENCE NUMBER and DATA fields as defined in [RFC 2402]. The + semantics of the header fields are the same as the "transport mode" + of [RFC 2402], except for the calculation of the Integrity Check + Value (ICV). In IPsec, the ICV is calculated over the entire IP + packet including the IP header. This prevents spoofing of the IP + addresses. To retain the same functionality, the ICV calculation + should be performed across all the transactions (concatenated) in the + message prepended by a synthesized IP header consisting of a 32-bit + source IP address, a 32-bit destination address and a 16-bit UDP + destination port encoded as 20 hex digits. When the interim AH + mechanism is employed when TCP is the transport Layer, the UDP Port + above becomes the TCP port, and all other operations are the same. + + Implementations of the H.248.1 protocol SHALL implement IPsec where + the underlying operating system and the transport network supports + IPsec. Implementations of the protocol using IPv4 SHALL implement + the interim AH scheme. However, this interim scheme SHALL NOT be + used when the underlying network layer supports IPsec. IPv6 + implementations are assumed to support IPsec and SHALL NOT use the + interim AH scheme. + + + + + + +Groves, et al. Standards Track [Page 76] + +RFC 3525 Gateway Control Protocol June 2003 + + + All implementations of the interim AH mechanism SHALL comply with + section 5 of RFC 2402 which defines a minimum set of algorithms for + integrity checking using manual keys. + + The interim AH interim scheme does not provide protection against + eavesdropping, thus forbidding third parties from monitoring the + connections set up by a given Termination. Also, it does not provide + protection against replay attacks. These procedures do not + necessarily protect against denial of service attacks by misbehaving + MGs or misbehaving MGCs. However, they will provide an + identification of these misbehaving entities, which should then be + deprived of their authorization through maintenance procedures. + +10.3 Protection of Media Connections + + The protocol allows the MGC to provide MGs with "session keys" that + can be used to encrypt the audio messages, protecting against + eavesdropping. + + A specific problem of packet networks is "uncontrolled barge-in". + This attack can be performed by directing media packets to the IP + address and UDP port used by a connection. If no protection is + implemented, the packets must be decompressed and the signals must be + played on the "line side". + + A basic protection against this attack is to only accept packets from + known sources, checking for example that the IP source address and + UDP source port match the values announced in the Remote descriptor. + This has two inconveniences: it slows down connection establishment + and it can be fooled by source spoofing: + + - To enable the address-based protection, the MGC must obtain the + remote session description of the egress MG and pass it to the + ingress MG. This requires at least one network round trip, and + leaves us with a dilemma: either allow the call to proceed without + waiting for the round trip to complete, and risk for example, + "clipping" a remote announcement, or wait for the full round trip + and settle for slower call-set up procedures. + + - Source spoofing is only effective if the attacker can obtain valid + pairs of source destination addresses and ports, for example by + listening to a fraction of the traffic. To fight source spoofing, + one could try to control all access points to the network. But + this is in practice very hard to achieve. + + + + + + + +Groves, et al. Standards Track [Page 77] + +RFC 3525 Gateway Control Protocol June 2003 + + + An alternative to checking the source address is to encrypt and + authenticate the packets, using a secret key that is conveyed during + the call set-up procedure. This will not slow down the call set-up, + and provides strong protection against address spoofing. + +11 MG-MGC Control Interface + + The control association between MG and MGC is initiated at MG cold + start, and announced by a ServiceChange message, but can be changed + by subsequent events, such as failures or manual service events. + While the protocol does not have an explicit mechanism to support + multiple MGCs controlling a physical MG, it has been designed to + support the multiple logical MG (within a single physical MG) that + can be associated with different MGCs. + +11.1 Multiple Virtual MGs + + A physical Media Gateway may be partitioned into one or more Virtual + MGs. A virtual MG consists of a set of statically partitioned + physical Terminations and/or sets of ephemeral Terminations. A + physical Termination is controlled by one MGC. The model does not + require that other resources be statically allocated, just + Terminations. The mechanism for allocating Terminations to virtual + MGs is a management method outside the scope of the protocol. Each + of the virtual MGs appears to the MGC as a complete MG client. + + A physical MG may have only one network interface, which must be + shared across virtual MGs. In such a case, the packet/cell side + Termination is shared. It should be noted however, that in use, such + interfaces require an ephemeral instance of the Termination to be + created per flow, and thus sharing the Termination is + straightforward. This mechanism does lead to a complication, namely + that the MG must always know which of its controlling MGCs should be + notified if an event occurs on the interface. + + In normal operation, the Virtual MG will be instructed by the MGC to + create network flows (if it is the originating side), or to expect + flow requests (if it is the terminating side), and no confusion will + arise. However, if an unexpected event occurs, the Virtual MG must + know what to do with respect to the physical resources it is + controlling. + + If recovering from the event requires manipulation of a physical + interface's state, only one MGC should do so. These issues are + resolved by allowing any of the MGCs to create EventsDescriptors to + be notified of such events, but only one MGC can have read/write + + + + + +Groves, et al. Standards Track [Page 78] + +RFC 3525 Gateway Control Protocol June 2003 + + + access to the physical interface properties; all other MGCs have + read-only access. The management mechanism is used to designate + which MGC has read/write capability, and is designated the Master + MGC. + + Each virtual MG has its own Root Termination. In most cases the + values for the properties of the Root Termination are independently + settable by each MGC. Where there can only be one value, the + parameter is read-only to all but the Master MGC. + + ServiceChange may only be applied to a Termination or set of + Terminations partitioned to the Virtual MG or created (in the case of + ephemeral Terminations) by that Virtual MG. + +11.2 Cold start + + A MG is pre-provisioned by a management mechanism outside the scope + of this protocol with a primary and (optionally) an ordered list of + secondary MGCs. Upon a cold start of the MG, it will issue a + ServiceChange command with a "Restart" method, on the Root + Termination to its primary MGC. If the MGC accepts the MG, it sends + a Transaction Reply not including a ServiceChangeMgcId parameter. If + the MGC does not accept the MG's registration, it sends a Transaction + Reply, providing the address of an alternate MGC to be contacted by + including a ServiceChangeMgcId parameter. + + If the MG receives a Transaction Reply that includes a + ServiceChangeMgcId parameter, it sends a ServiceChange to the MGC + specified in the ServiceChangeMgcId. It continues this process until + it gets a controlling MGC to accept its registration, or it fails to + get a reply. Upon failure to obtain a reply, either from the primary + MGC, or a designated successor, the MG tries its pre-provisioned + secondary MGCs, in order. If the MG is unable to establish a control + relationship with any MGC, it shall wait a random amount of time as + described in 9.2 and then start contacting its primary, and if + necessary, its secondary MGCs again. + + It is possible that the reply to a ServiceChange with Restart will be + lost, and a command will be received by the MG prior to the receipt + of the ServiceChange response. The MG shall issue Error 505 - + Command Received before a ServiceChange Reply has been received. + +11.3 Negotiation of protocol version + + The first ServiceChange command from a MG shall contain the version + number of the protocol supported by the MG in the + ServiceChangeVersion parameter. Upon receiving such a message, if + the MGC supports only a lower version, then the MGC shall send a + + + +Groves, et al. Standards Track [Page 79] + +RFC 3525 Gateway Control Protocol June 2003 + + + ServiceChangeReply with the lower version and thereafter all the + messages between MG and MGC shall conform to the lower version of the + protocol. If the MG is unable to comply and it has established a + transport connection to the MGC, it should close that connection. In + any event, it should reject all subsequent requests from the MGC with + error 406 - Version Not Supported. + + If the MGC supports a higher version than the MG but is able to + support the lower version proposed by the MG, it shall send a + ServiceChangeReply with the lower version and thereafter all the + messages between MG and MGC shall conform to the lower version of the + protocol. If the MGC is unable to comply, it shall reject the + association, with error 406 - Version Not Supported. + + Protocol version negotiation may also occur at "handoff" and + "failover" ServiceChanges. + + When extending the protocol with new versions, the following rules + should be followed: + + 1) Existing protocol elements, i.e., procedures, parameters, + descriptor, property, values, should not be changed unless a + protocol error needs to be corrected or it becomes necessary to + change the operation of the service that is being supported by the + protocol. + + 2) The semantics of a command, a parameter, a descriptor, a property, + or a value should not be changed. + + 3) Established rules for formatting and encoding messages and + parameters should not be modified. + + 4) When information elements are found to be obsolete they can be + marked as not used. However, the identifier for that information + element will be marked as reserved. In that way it can not be + used in future versions. + +11.4 Failure of a MG + + If a MG fails, but is capable of sending a message to the MGC, it + sends a ServiceChange with an appropriate method (graceful or forced) + and specifies the Root TerminationID. When it returns to service, it + sends a ServiceChange with a "Restart" method. + + Allowing the MGC to send duplicate messages to both MGs accommodates + pairs of MGs that are capable of redundant failover of one of the + MGs. Only the Working MG shall accept or reject transactions. Upon + failover, the primary MG sends a ServiceChange command with a + + + +Groves, et al. Standards Track [Page 80] + +RFC 3525 Gateway Control Protocol June 2003 + + + "Failover" method and a "MG Impending Failure" reason. The MGC then + uses the secondary MG as the active MG. When the error condition is + repaired, the Working MG can send a "ServiceChange" with a "Restart" + method. + + Note: Redundant failover MGs require a reliable transport, because + the protocol provides no means for a secondary MG running ALF to + acknowledge messages sent from the MGC. + +11.5 Failure of an MGC + + If the MG detects a failure of its controlling MGC, it attempts to + contact the next MGC on its pre-provisioned list. It starts its + attempts at the beginning (primary MGC), unless that was the MGC that + failed, in which case it starts at its first secondary MGC. It sends + a ServiceChange message with a "Failover" method and a "MGC Impending + Failure" reason. If the MG is unable to establish a control + relationship with any MGC, it shall wait a random amount of time as + described in section 9.2 and then start again contacting its primary, + and (if necessary) its secondary MGCs. When contacting its + previously controlling MGC, the MG sends the ServiceChange message + with "Disconnected" method. + + In partial failure, or for manual maintenance reasons, an MGC may + wish to direct its controlled MGs to use a different MGC. To do so, + it sends a ServiceChange method to the MG with a "HandOff" method, + and its designated replacement in ServiceChangeMgcId. If "HandOff" + is supported, the MG shall send a ServiceChange message with a + "Handoff" method and a "MGC directed change" reason to the designated + MGC. If it fails to get a reply from the designated MGC, the MG + shall behave as if its MGC failed, and start contacting secondary + MGCs as specified in the previous paragraph. If the MG is unable to + establish a control relationship with any MGC, it shall wait a random + amount of time as described in 9.2 and then start contacting its + primary, and if necessary, its secondary MGCs again. + + No recommendation is made on how the MGCs involved in the Handoff + maintain state information; this is considered to be out of scope of + this RFC. The MGC and MG may take the following steps when Handoff + occurs. When the MGC initiates a HandOff, the handover should be + transparent to Operations on the Media Gateway. Transactions can be + executed in any order, and could be in progress when the + ServiceChange is executed. Accordingly, commands in progress + continue and replies to all commands from the original MGC must be + sent to the transport address from which they were sent. If the + service relationship with the sending MGC has ended, the replies + should be discarded. The MG may receive outstanding transaction + replies from the new MGC. No new messages shall be sent to the new + + + +Groves, et al. Standards Track [Page 81] + +RFC 3525 Gateway Control Protocol June 2003 + + + MGC until the control association is established. Repeated + transaction requests shall be directed to the new MGC. The MG shall + maintain state on all Terminations and Contexts. + + It is possible that the MGC could be implemented in such a way that a + failed MGC is replaced by a working MGC where the identity of the new + MGC is the same as the failed one. In such a case, + ServiceChangeMgcId would be specified with the previous value and the + MG shall behave as if the value was changed, and send a ServiceChange + message, as above. + + Pairs of MGCs that are capable of redundant failover can notify the + controlled MGs of the failover by the above mechanism. + +12 Package definition + + The primary mechanism for extension is by means of Packages. + Packages define additional Properties, Events, Signals and Statistics + that may occur on Terminations. + + Packages defined by IETF will appear in separate RFCs. + + Packages defined by ITU-T may appear in the relevant Recommendations + (e.g., as Recommendations of the H.248 sub-series). + + 1) A public document or a standard forum document, which can be + referenced as the document that describes the package following + the guideline above, should be specified. + + 2) The document shall specify the version of the Package that it + describes. + + 3) The document should be available on a public web server and should + have a stable URL. The site should provide a mechanism to provide + comments and appropriate responses should be returned. + +12.1 Guidelines for defining packages + + Packages define Properties, Events, Signals, and Statistics. + + Packages may also define new error codes according to the guidelines + given in 13.2. This is a matter of documentary convenience: the + package documentation is submitted to IANA in support of the error + code registration. If a package is modified, it is unnecessary to + provide IANA with a new document reference in support of the error + code unless the description of the error code itself is modified. + + + + + +Groves, et al. Standards Track [Page 82] + +RFC 3525 Gateway Control Protocol June 2003 + + + Names of all such defined constructs shall consist of the PackageID + (which uniquely identifies the package) and the ID of the item (which + uniquely identifies the item in that package). In the text encoding + the two shall be separated by a forward slash ("/") character. + Example: togen/playtone is the text encoding to refer to the play + tone signal in the tone generation package. + + A Package will contain the following sections: + +12.1.1 Package + + Overall description of the package, specifying: + + Package Name: only descriptive + + PackageID: is an identifier + + Description: + + Version: + + A new version of a package can only add additional Properties, + Events, Signals, Statistics and new possible values for an + existing parameter described in the original package. No + deletions or modifications shall be allowed. A version is an + integer in the range from 1 to 99. + + Designed to be extended only (Optional): + + This indicates that the package has been expressly designed to + be extended by others, not to be directly referenced. For + example, the package may not have any function on its own or be + nonsensical on its own. The MG SHOULD NOT publish this + PackageID when reporting packages. + + Extends (Optional): existing package Descriptor + + A package may extend an existing package. The version of the + original package must be specified. When a package extends + another package it shall only add additional Properties, + Events, Signals, Statistics and new possible values for an + existing parameter described in the original package. An + extended package shall not redefine or overload an identifier + defined in the original package and packages it may have + extended (multiple levels of extension). Hence, if package B + version 1 extends package A version 1, version 2 of B will not + be able to extend the A version 2 if A version 2 defines a name + already in B version 1. + + + +Groves, et al. Standards Track [Page 83] + +RFC 3525 Gateway Control Protocol June 2003 + + +12.1.2 Properties + + Properties defined by the package, specifying: + + Property Name: only descriptive + + PropertyID: is an identifier + + Description: + + Type: One of: + + Boolean + + String: UTF-8 string + + Octet String: A number of octets. See Annex A and Annex B.3 + for encoding + + Integer: 4 byte signed integer + + Double: 8 byte signed integer + + Character: unicode UTF-8 encoding of a single letter. Could be + more than one octet. + + Enumeration: one of a list of possible unique values (see 12.3) + + Sub-list: a list of several values from a list. The type of + sub-list SHALL also be specified. The type shall be chosen + from the types specified in this section (with the exception of + sub-list). For example, Type: sub-list of enumeration. The + encoding of sub-lists is specified in Annexes A and B.3. + + Possible values: + + A package MUST specify either a specific set of values or a + description of how values are determined. A package MUST also + specify a default value or the default behaviour when the value + is omitted from its descriptor. For example, a package may + specify that procedures related to the property are suspended + when its value is omitted. A default value (but not + procedures) + may be specified as provisionable. + + Defined in: + + Which H.248.1 descriptor the property is defined in. + + + +Groves, et al. Standards Track [Page 84] + +RFC 3525 Gateway Control Protocol June 2003 + + + LocalControl is for stream dependent properties. + TerminationState is for stream independent properties. These + are expected to be the most common cases, but it is possible + for properties to be defined in other descriptors. + + Characteristics: Read/Write or both, and (optionally), global: + + Indicates whether a property is read-only, or read-write, and + if it is global. If Global is omitted, the property is not + global. If a property is declared as global, the value of the + property is shared by all Terminations realizing the package. + +12.1.3 Events + + Events defined by the package, specifying: + + Event name: only descriptive + + EventID: is an identifier + + Description: + + EventsDescriptor Parameters: + + Parameters used by the MGC to configure the event, and found in + the EventsDescriptor. See 12.2. + + ObservedEventsDescriptor Parameters: + + Parameters returned to the MGC in Notify requests and in + replies to command requests from the MGC that audit + ObservedEventsDescriptor, and found in the + ObservedEventsDescriptor. See 12.2. + +12.1.4 Signals + + Signals defined by the package, specifying: + + Signal Name: only descriptive + + SignalID: is an identifier. SignalID is used in a + SignalsDescriptor + + Description + + SignalType: one of: + + OO (On/Off) + + + +Groves, et al. Standards Track [Page 85] + +RFC 3525 Gateway Control Protocol June 2003 + + + TO (TimeOut) + + BR (Brief) + + NOTE - SignalType may be defined such that it is dependent on the + value of one or more parameters. The package MUST specify a + default signal type. If the default type is TO, the package MUST + specify a default duration which may be provisioned. A default + duration is meaningless for BR. + + Duration: in hundredths of seconds + + Additional Parameters: see 12.2 + +12.1.5 Statistics + + Statistics defined by the package, specifying: + + Statistic name: only descriptive + + StatisticID: is an identifier + + StatisticID is used in a StatisticsDescriptor + + Description: + + Units: unit of measure, e.g., milliseconds, packets + +12.1.6 Procedures + + Additional guidance on the use of the package. + +12.2 Guidelines to defining Parameters to Events and Signals + + Parameter Name: only descriptive + + ParameterID: is an identifier. The textual ParameterID of parameters + to Events and Signals shall not start with "EPA" and "SPA", + respectively. The textual ParameterID shall also not be "ST", + "Stream", "SY", "SignalType", "DR", "Duration", "NC", + "NotifyCompletion", "KA", "Keepactive", "EB", "Embed", "DM" or + "DigitMap". + + Type: One of: + + Boolean + + String: UTF-8 octet string + + + +Groves, et al. Standards Track [Page 86] + +RFC 3525 Gateway Control Protocol June 2003 + + + Octet String: A number of octets. See Annex A and Annex B.3 for + encoding + + Integer: 4-octet signed integer + + Double: 8-octet signed integer + + Character: unicode UTF-8 encoding of a single letter. Could be + more than one octet. + + Enumeration: one of a list of possible unique values (see 12.3) + + Sub-list: a list of several values from a list (not supported for + statistics). The type of sub-list SHALL also be specified. The + type shall be chosen from the types specified in this section + (with the exception of sub-list). For example, Type: sub-list of + enumeration. The encoding of sub-lists is specified in Annexes A + and B.3. + + Possible values: + + A package MUST specify either a specific set of values or a + description of how values are determined. A package MUST also + specify a default value or the default behavior when the value is + omitted from its descriptor. For example, a package may specify + that procedures related to the parameter are suspended when it + value is omitted. A default value (but not procedures) may be + specified as provisionable. + + Description: + +12.3 Lists + + Possible values for parameters include enumerations. Enumerations + may be defined in a list. It is recommended that the list be IANA + registered so that packages that extend the list can be defined + without concern for conflicting names. + +12.4 Identifiers + + Identifiers in text encoding shall be strings of up to 64 characters, + containing no spaces, starting with an alphabetic character and + consisting of alphanumeric characters and/or digits, and possibly + including the special character underscore ("_"). + + + + + + + +Groves, et al. Standards Track [Page 87] + +RFC 3525 Gateway Control Protocol June 2003 + + + Identifiers in binary encoding are 2 octets long. + + Both text and binary values shall be specified for each identifier, + including identifiers used as values in enumerated types. + +12.5 Package registration + + A package can be registered with IANA for interoperability reasons. + See clause 13 for IANA Considerations. + +13 IANA Considerations + +13.1 Packages + + The following considerations SHALL be met to register a package with + IANA: + + 1) A unique string name, unique serial number and version number is + registered for each package. The string name is used with text + encoding. The serial number shall be used with binary encoding. + Serial Numbers 0x8000 to 0xFFFF are reserved for private use. + Serial number 0 is reserved. + + 2) A contact name, email and postal addresses for that contact shall + be specified. The contact information shall be updated by the + defining organization as necessary. + + 3) A reference to a document that describes the package, which should + be public: + + The document shall specify the version of the Package that it + describes. + + If the document is public, it should be located on a public web + server and should have a stable URL. The site should provide a + mechanism to provide comments and appropriate responses should be + returned. + + 4) Packages registered by other than recognized standards bodies + shall have a minimum package name length of 8 characters. + + 5) All other package names are first come-first served if all other + conditions are met. + + + + + + + + +Groves, et al. Standards Track [Page 88] + +RFC 3525 Gateway Control Protocol June 2003 + + +13.2 Error codes + + The following considerations SHALL be met to register an error code + with IANA: + + 1) An error number and a one-line (80-character maximum) string is + registered for each error. + + 2) A complete description of the conditions under which the error is + detected shall be included in a publicly available document. The + description shall be sufficiently clear to differentiate the error + from all other existing error codes. + + 3) The document should be available on a public web server and should + have a stable URL. + + 4) Error numbers registered by recognized standards bodies shall have + 3- or 4-character error numbers. + + 5) Error numbers registered by all other organizations or individuals + shall have 4-character error numbers. + + 6) An error number shall not be redefined nor modified except by the + organization or individual that originally defined it, or their + successors or assigns. + +13.3 ServiceChange reasons + + The following considerations SHALL be met to register service change + reason with IANA: + + 1) A one-phrase, 80-character maximum, unique reason code is + registered for each reason. + + 2) A complete description of the conditions under which the reason is + used is detected shall be included in a publicly available + document. The description shall be sufficiently clear to + differentiate the reason from all other existing reasons. + + 3) The document should be available on a public web server and should + have a stable URL. + + + + + + + + + + +Groves, et al. Standards Track [Page 89] + +RFC 3525 Gateway Control Protocol June 2003 + + +ANNEX A - Binary encoding of the protocol + + This annex specifies the syntax of messages using the notation + defined in Recommendation X.680; Information technology - Abstract + Syntax Notation One (ASN.1): Specification of basic notation. + Messages shall be encoded for transmission by applying the basic + encoding rules specified in Recommendation X.690, Information + Technology - ASN.1 Encoding Rules: Specification of Basic Encoding + Rules (BER), Canonical Encoding Rules (CER) and Distinguished + Encoding Rules. + +A.1 Coding of wildcards + + The use of wildcards ALL and CHOOSE is allowed in the protocol. This + allows a MGC to partially specify Termination IDs and to let the MG + choose from the values that conform to the partial specification. + Termination IDs may encode a hierarchy of names. This hierarchy is + provisioned. For instance, a TerminationID may consist of a trunk + group, a trunk within the group and a circuit. Wildcarding must be + possible at all levels. The following paragraphs explain how this is + achieved. + + The ASN.1 description uses octet strings of up to 8 octets in length + for Termination IDs. This means that Termination IDs consist of at + most 64 bits. A fully specified Termination ID may be preceded by a + sequence of wildcarding fields. A wildcarding field is one octet in + length. Bit 7 (the most significant bit) of this octet specifies + what type of wildcarding is invoked: if the bit value equals 1, then + the ALL wildcard is used; if the bit value if 0, then the CHOOSE + wildcard is used. Bit 6 of the wildcarding field specifies whether + the wildcarding pertains to one level in the hierarchical naming + scheme (bit value 0) or to the level of the hierarchy specified in + the wildcarding field plus all lower levels (bit value 1). Bits 0 + through 5 of the wildcarding field specify the bit position in the + Termination ID at which the wildcarding starts. + + We illustrate this scheme with some examples. In these examples, the + most significant bit in a string of bits appears on the left hand + side. + + Assume that Termination IDs are three octets long and that each octet + represents a level in a hierarchical naming scheme. A valid + Termination ID is: + + 00000001 00011110 01010101. + + + + + + +Groves, et al. Standards Track [Page 90] + +RFC 3525 Gateway Control Protocol June 2003 + + + Addressing ALL names with prefix 00000001 00011110 is done as + follows: + + wildcarding field: 10000111 + + Termination ID: 00000001 00011110 xxxxxxxx. + + The values of the bits labeled "x" is irrelevant and shall be ignored + by the receiver. + + Indicating to the receiver that it must choose a name with 00011110 + as the second octet is done as follows: + + wildcarding fields: 00010111 followed by 00000111 + + Termination ID: xxxxxxxx 00011110 xxxxxxxx. + + The first wildcard field indicates a CHOOSE wildcard for the level in + the naming hierarchy starting at bit 23, the highest level in our + assumed naming scheme. The second wildcard field indicates a CHOOSE + wildcard for the level in the naming hierarchy starting at bit 7, the + lowest level in our assumed naming scheme. + + Finally, a CHOOSE-wildcarded name with the highest level of the name + equal to 00000001 is specified as follows: + + wildcard field: 01001111 + + Termination ID: 0000001 xxxxxxxx xxxxxxxx . + + Bit value 1 at bit position 6 of the first octet of the wildcard + field indicates that the wildcarding pertains to the specified level + in the naming hierarchy and all lower levels. + + Context IDs may also be wildcarded. In the case of Context IDs, + however, specifying partial names is not allowed. Context ID 0x0 + SHALL be used to indicate the NULL Context, Context ID 0xFFFFFFFE + SHALL be used to indicate a CHOOSE wildcard, and Context ID + 0xFFFFFFFF SHALL be used to indicate an ALL wildcard. + + TerminationID 0xFFFFFFFFFFFFFFFF SHALL be used to indicate the ROOT + Termination. + + + + + + + + + +Groves, et al. Standards Track [Page 91] + +RFC 3525 Gateway Control Protocol June 2003 + + +A.2 ASN.1 syntax specification + + This subclause contains the ASN.1 specification of the H.248.1 + protocol syntax. + + NOTE 1 - In case a transport mechanism is used that employs + application level framing, the definition of Transaction below + changes. Refer to the annex or to the Recommendation of the H.248 + sub-series defining the transport mechanism for the definition that + applies in that case. + + NOTE 2 - The ASN.1 specification below contains a clause defining + TerminationIDList as a sequence of TerminationIDs. The length of + this sequence SHALL be one, except possibly when used in + contextAuditResult. + + NOTE 3 - This syntax specification does not enforce all + restrictions on element inclusions and values. Some additional + restrictions are stated in comments and other restrictions appear + in the text of this RFC. These additional restrictions + are part of the protocol even though not enforced by this + specification. + + NOTE 4 - The ASN.1 module in this Annex uses octet string types to + encode values for property parameter, signal parameter and event + parameter values and statistics. The actual types of these values + vary and are specified in Annex C or the relevant package + definition. + + A value is first BER-encoded based on its type using the table below. + The result of this BER-encoding is then encoded as an ASN.1 octet + string, "double wrapping" the value. The format specified in Annex C + or the package relates to BER encoding according to the following + table: + + Type Specified in Package ASN.1 BER Type + + String IA5String or UTF8String (Note 4) + + Integer (4 Octet) INTEGER + + Double (8 octet signed int) INTEGER (Note 3) + + Character (UTF-8, Note 1) IA5String + + Enumeration ENUMERATED + + Boolean BOOLEAN + + + +Groves, et al. Standards Track [Page 92] + +RFC 3525 Gateway Control Protocol June 2003 + + + Unsigned Integer (Note 2) INTEGER (Note 3) + + Octet (String) OCTET STRING + + Note 1: Can be more than one byte + + Note 2: Unsigned integer is referenced in Annex C + + Note 3: The BER encoding of INTEGER does not imply the use of 4 + bytes. + + Note 4: String should be encoded as IA5String when the contents + are all ASCII characters, but as UTF8String if it contains any + Non-ASCII characters. + + See ITU-T Rec. X.690, 8.7, for the definition of the encoding of an + octet string value. + + MEDIA-GATEWAY-CONTROL DEFINITIONS AUTOMATIC TAGS::= + BEGIN + + MegacoMessage ::= SEQUENCE + { + authHeader AuthenticationHeader OPTIONAL, + mess Message + } + + AuthenticationHeader ::= SEQUENCE + { + secParmIndex SecurityParmIndex, + seqNum SequenceNum, + ad AuthData + } + + SecurityParmIndex ::= OCTET STRING(SIZE(4)) + + SequenceNum ::= OCTET STRING(SIZE(4)) + + AuthData ::= OCTET STRING (SIZE (12..32)) + + Message ::= SEQUENCE + { + version INTEGER(0..99), + -- The version of the protocol defined here is equal to 1. + mId MId, -- Name/address of message originator + messageBody CHOICE + { + messageError ErrorDescriptor, + + + +Groves, et al. Standards Track [Page 93] + +RFC 3525 Gateway Control Protocol June 2003 + + + transactions SEQUENCE OF Transaction + }, + ... + } + + MId ::= CHOICE + { + ip4Address IP4Address, + ip6Address IP6Address, + domainName DomainName, + deviceName PathName, + mtpAddress OCTET STRING(SIZE(2..4)), + -- Addressing structure of mtpAddress: + -- 25 - 15 0 + -- | PC | NI | + -- 24 - 14 bits 2 bits + -- Note: 14 bits are defined for international use. + -- Two national options exist where the point code is 16 or 24 + -- bits. + -- To octet align the mtpAddress, the MSBs shall be encoded as 0s. + ... + } + + DomainName ::= SEQUENCE + { + name IA5String, + -- The name starts with an alphanumeric digit followed by a + -- sequence of alphanumeric digits, hyphens and dots. No two + -- dots shall occur consecutively. + portNumber INTEGER(0..65535) OPTIONAL + } + + IP4Address ::= SEQUENCE + { + address OCTET STRING (SIZE(4)), + portNumber INTEGER(0..65535) OPTIONAL + } + + IP6Address ::= SEQUENCE + { + address OCTET STRING (SIZE(16)), + portNumber INTEGER(0..65535) OPTIONAL + } + + PathName ::= IA5String(SIZE (1..64)) + -- See A.3 + + Transaction ::= CHOICE + + + +Groves, et al. Standards Track [Page 94] + +RFC 3525 Gateway Control Protocol June 2003 + + + { + transactionRequest TransactionRequest, + transactionPending TransactionPending, + transactionReply TransactionReply, + transactionResponseAck TransactionResponseAck, + -- use of response acks is dependent on underlying transport + ... + } + + TransactionId ::= INTEGER(0..4294967295) -- 32-bit unsigned integer + + TransactionRequest ::= SEQUENCE + { + transactionId TransactionId, + actions SEQUENCE OF ActionRequest, + ... + } + + TransactionPending ::= SEQUENCE + { + transactionId TransactionId, + ... + } + + TransactionReply ::= SEQUENCE + { + transactionId TransactionId, + immAckRequired NULL OPTIONAL, + transactionResult CHOICE + { + transactionError ErrorDescriptor, + actionReplies SEQUENCE OF ActionReply + }, + ... + } + + TransactionResponseAck ::= SEQUENCE OF TransactionAck + TransactionAck ::= SEQUENCE + { + firstAck TransactionId, + lastAck TransactionId OPTIONAL + } + + ErrorDescriptor ::= SEQUENCE + { + errorCode ErrorCode, + errorText ErrorText OPTIONAL + } + + + +Groves, et al. Standards Track [Page 95] + +RFC 3525 Gateway Control Protocol June 2003 + + + + ErrorCode ::= INTEGER(0..65535) + -- See clause 13 for IANA Considerations with respect to error codes + + ErrorText ::= IA5String + + ContextID ::= INTEGER(0..4294967295) + + -- Context NULL Value: 0 + -- Context CHOOSE Value: 4294967294 (0xFFFFFFFE) + -- Context ALL Value: 4294967295 (0xFFFFFFFF) + + + ActionRequest ::= SEQUENCE + { + contextId ContextID, + contextRequest ContextRequest OPTIONAL, + contextAttrAuditReq ContextAttrAuditRequest OPTIONAL, + commandRequests SEQUENCE OF CommandRequest + } + + ActionReply ::= SEQUENCE + { + contextId ContextID, + errorDescriptor ErrorDescriptor OPTIONAL, + contextReply ContextRequest OPTIONAL, + commandReply SEQUENCE OF CommandReply + } + + ContextRequest ::= SEQUENCE + { + priority INTEGER(0..15) OPTIONAL, + emergency BOOLEAN OPTIONAL, + topologyReq SEQUENCE OF TopologyRequest OPTIONAL, + ... + } + + ContextAttrAuditRequest ::= SEQUENCE + { + topology NULL OPTIONAL, + emergency NULL OPTIONAL, + priority NULL OPTIONAL, + ... + } + + CommandRequest ::= SEQUENCE + { + command Command, + + + +Groves, et al. Standards Track [Page 96] + +RFC 3525 Gateway Control Protocol June 2003 + + + optional NULL OPTIONAL, + wildcardReturn NULL OPTIONAL, + ... + } + + Command ::= CHOICE + { + addReq AmmRequest, + moveReq AmmRequest, + modReq AmmRequest, + -- Add, Move, Modify requests have the same parameters + subtractReq SubtractRequest, + auditCapRequest AuditRequest, + auditValueRequest AuditRequest, + notifyReq NotifyRequest, + serviceChangeReq ServiceChangeRequest, + ... + } + + CommandReply ::= CHOICE + { + addReply AmmsReply, + moveReply AmmsReply, + modReply AmmsReply, + subtractReply AmmsReply, + -- Add, Move, Modify, Subtract replies have the same parameters + auditCapReply AuditReply, + auditValueReply AuditReply, + notifyReply NotifyReply, + serviceChangeReply ServiceChangeReply, + ... + } + + TopologyRequest ::= SEQUENCE + { + terminationFrom TerminationID, + terminationTo TerminationID, + topologyDirection ENUMERATED + { + bothway(0), + isolate(1), + oneway(2) + }, + ... + } + + AmmRequest ::= SEQUENCE + { + + + +Groves, et al. Standards Track [Page 97] + +RFC 3525 Gateway Control Protocol June 2003 + + + terminationID TerminationIDList, + descriptors SEQUENCE OF AmmDescriptor, + -- At most one descriptor of each type (see AmmDescriptor) + -- allowed in the sequence. + ... + } + + AmmDescriptor ::= CHOICE + { + mediaDescriptor MediaDescriptor, + modemDescriptor ModemDescriptor, + muxDescriptor MuxDescriptor, + eventsDescriptor EventsDescriptor, + eventBufferDescriptor EventBufferDescriptor, + signalsDescriptor SignalsDescriptor, + digitMapDescriptor DigitMapDescriptor, + auditDescriptor AuditDescriptor, + ... + } + + AmmsReply ::= SEQUENCE + { + terminationID TerminationIDList, + terminationAudit TerminationAudit OPTIONAL, + ... + } + + SubtractRequest ::= SEQUENCE + { + terminationID TerminationIDList, + auditDescriptor AuditDescriptor OPTIONAL, + ... + } + + AuditRequest ::= SEQUENCE + { + terminationID TerminationID, + auditDescriptor AuditDescriptor, + ... + } + + AuditReply ::= CHOICE + { + contextAuditResult TerminationIDList, + error ErrorDescriptor, + auditResult AuditResult, + ... + } + + + +Groves, et al. Standards Track [Page 98] + +RFC 3525 Gateway Control Protocol June 2003 + + + + AuditResult ::= SEQUENCE + { + + terminationID TerminationID, + terminationAuditResult TerminationAudit + } + + TerminationAudit ::= SEQUENCE OF AuditReturnParameter + + AuditReturnParameter ::= CHOICE + { + errorDescriptor ErrorDescriptor, + mediaDescriptor MediaDescriptor, + modemDescriptor ModemDescriptor, + muxDescriptor MuxDescriptor, + eventsDescriptor EventsDescriptor, + eventBufferDescriptor EventBufferDescriptor, + signalsDescriptor SignalsDescriptor, + digitMapDescriptor DigitMapDescriptor, + observedEventsDescriptor ObservedEventsDescriptor, + statisticsDescriptor StatisticsDescriptor, + packagesDescriptor PackagesDescriptor, + emptyDescriptors AuditDescriptor, + ... + } + + AuditDescriptor ::= SEQUENCE + { + auditToken BIT STRING + { + muxToken(0), modemToken(1), mediaToken(2), + eventsToken(3), signalsToken(4), + digitMapToken(5), statsToken(6), + observedEventsToken(7), + packagesToken(8), eventBufferToken(9) + } OPTIONAL, + ... + } + + NotifyRequest ::= SEQUENCE + { + terminationID TerminationIDList, + observedEventsDescriptor ObservedEventsDescriptor, + errorDescriptor ErrorDescriptor OPTIONAL, + ... + } + + + + +Groves, et al. Standards Track [Page 99] + +RFC 3525 Gateway Control Protocol June 2003 + + + NotifyReply ::= SEQUENCE + { + terminationID TerminationIDList, + errorDescriptor ErrorDescriptor OPTIONAL, + ... + } + + ObservedEventsDescriptor ::= SEQUENCE + { + requestId RequestID, + observedEventLst SEQUENCE OF ObservedEvent + } + + ObservedEvent ::= SEQUENCE + { + eventName EventName, + streamID StreamID OPTIONAL, + eventParList SEQUENCE OF EventParameter, + timeNotation TimeNotation OPTIONAL, + ... + } + + EventName ::= PkgdName + + EventParameter ::= SEQUENCE + { + eventParameterName Name, + value Value, + -- For use of extraInfo see the comment related to PropertyParm + extraInfo CHOICE + { + relation Relation, + range BOOLEAN, + sublist BOOLEAN + } OPTIONAL, + ... + } + + ServiceChangeRequest ::= SEQUENCE + { + terminationID TerminationIDList, + serviceChangeParms ServiceChangeParm, + ... + } + + ServiceChangeReply ::= SEQUENCE + { + terminationID TerminationIDList, + + + +Groves, et al. Standards Track [Page 100] + +RFC 3525 Gateway Control Protocol June 2003 + + + serviceChangeResult ServiceChangeResult, + ... + } + + -- For ServiceChangeResult, no parameters are mandatory. Hence the + -- distinction between ServiceChangeParm and ServiceChangeResParm. + + ServiceChangeResult ::= CHOICE + { + errorDescriptor ErrorDescriptor, + serviceChangeResParms ServiceChangeResParm + } + + WildcardField ::= OCTET STRING(SIZE(1)) + + TerminationID ::= SEQUENCE + { + wildcard SEQUENCE OF WildcardField, + id OCTET STRING(SIZE(1..8)), + ... + } + -- See A.1 for explanation of wildcarding mechanism. + -- Termination ID 0xFFFFFFFFFFFFFFFF indicates the ROOT Termination. + + TerminationIDList ::= SEQUENCE OF TerminationID + + MediaDescriptor ::= SEQUENCE + { + + termStateDescr TerminationStateDescriptor OPTIONAL, + streams CHOICE + { + oneStream StreamParms, + multiStream SEQUENCE OF StreamDescriptor + } OPTIONAL, + ... + } + + StreamDescriptor ::= SEQUENCE + { + streamID StreamID, + streamParms StreamParms + } + + StreamParms ::= SEQUENCE + { + localControlDescriptor LocalControlDescriptor OPTIONAL, + localDescriptor LocalRemoteDescriptor OPTIONAL, + + + +Groves, et al. Standards Track [Page 101] + +RFC 3525 Gateway Control Protocol June 2003 + + + remoteDescriptor LocalRemoteDescriptor OPTIONAL, + ... + } + + LocalControlDescriptor ::= SEQUENCE + { + + streamMode StreamMode OPTIONAL, + reserveValue BOOLEAN OPTIONAL, + reserveGroup BOOLEAN OPTIONAL, + propertyParms SEQUENCE OF PropertyParm, + ... + } + + StreamMode ::= ENUMERATED + { + sendOnly(0), + recvOnly(1), + sendRecv(2), + inactive(3), + loopBack(4), + ... + } + + -- In PropertyParm, value is a SEQUENCE OF octet string. When sent + -- by an MGC the interpretation is as follows: + -- empty sequence means CHOOSE + -- one element sequence specifies value + -- If the sublist field is not selected, a longer sequence means + -- "choose one of the values" (i.e., value1 OR value2 OR ...) + -- If the sublist field is selected, + -- a sequence with more than one element encodes the value of a + -- list-valued property (i.e., value1 AND value2 AND ...). + -- The relation field may only be selected if the value sequence + -- has length 1. It indicates that the MG has to choose a value + -- for the property. E.g., x > 3 (using the greaterThan + -- value for relation) instructs the MG to choose any value larger + -- than 3 for property x. + -- The range field may only be selected if the value sequence + -- has length 2. It indicates that the MG has to choose a value + -- in the range between the first octet in the value sequence and + -- the trailing octet in the value sequence, including the + -- boundary values. + -- When sent by the MG, only responses to an AuditCapability request + -- may contain multiple values, a range, or a relation field. + + PropertyParm ::= SEQUENCE + { + + + +Groves, et al. Standards Track [Page 102] + +RFC 3525 Gateway Control Protocol June 2003 + + + name PkgdName, + value SEQUENCE OF OCTET STRING, + extraInfo CHOICE + { + relation Relation, + range BOOLEAN, + sublist BOOLEAN + } OPTIONAL, + ... + } + + Name ::= OCTET STRING(SIZE(2)) + + PkgdName ::= OCTET STRING(SIZE(4)) + -- represents Package Name (2 octets) plus Property, Event, + -- Signal Names or Statistics ID. (2 octets) + -- To wildcard a package use 0xFFFF for first two octets, choose + -- is not allowed. To reference native property tag specified in + -- Annex C, use 0x0000 as first two octets. + -- To wildcard a Property, Event, Signal, or Statistics ID, use + -- 0xFFFF for last two octets, choose is not allowed. + -- Wildcarding of Package Name is permitted only if Property, + -- Event, Signal, or Statistics ID are + -- also wildcarded. + + Relation ::= ENUMERATED + { + greaterThan(0), + smallerThan(1), + unequalTo(2), + ... + } + + LocalRemoteDescriptor ::= SEQUENCE + { + propGrps SEQUENCE OF PropertyGroup, + ... + } + + PropertyGroup ::= SEQUENCE OF PropertyParm + + TerminationStateDescriptor ::= SEQUENCE + { + propertyParms SEQUENCE OF PropertyParm, + eventBufferControl EventBufferControl OPTIONAL, + serviceState ServiceState OPTIONAL, + ... + } + + + +Groves, et al. Standards Track [Page 103] + +RFC 3525 Gateway Control Protocol June 2003 + + + + EventBufferControl ::= ENUMERATED + { + off(0), + lockStep(1), + ... + } + + ServiceState ::= ENUMERATED + + { + test(0), + outOfSvc(1), + inSvc(2), + ... + } + + MuxDescriptor ::= SEQUENCE + { + muxType MuxType, + termList SEQUENCE OF TerminationID, + nonStandardData NonStandardData OPTIONAL, + ... + } + + MuxType ::= ENUMERATED + { + h221(0), + h223(1), + h226(2), + v76(3), + ... + } + + StreamID ::= INTEGER(0..65535) -- 16-bit unsigned integer + + EventsDescriptor ::= SEQUENCE + { + requestID RequestID OPTIONAL, + -- RequestID must be present if eventList + -- is non empty + eventList SEQUENCE OF RequestedEvent, + ... + } + + RequestedEvent ::= SEQUENCE + { + pkgdName PkgdName, + + + +Groves, et al. Standards Track [Page 104] + +RFC 3525 Gateway Control Protocol June 2003 + + + streamID StreamID OPTIONAL, + eventAction RequestedActions OPTIONAL, + evParList SEQUENCE OF EventParameter, + ... + } + + RequestedActions ::= SEQUENCE + { + keepActive BOOLEAN OPTIONAL, + eventDM EventDM OPTIONAL, + secondEvent SecondEventsDescriptor OPTIONAL, + signalsDescriptor SignalsDescriptor OPTIONAL, + ... + } + + EventDM ::= CHOICE + { digitMapName DigitMapName, + digitMapValue DigitMapValue + } + + SecondEventsDescriptor ::= SEQUENCE + { + requestID RequestID OPTIONAL, + eventList SEQUENCE OF SecondRequestedEvent, + ... + } + + SecondRequestedEvent ::= SEQUENCE + { + pkgdName PkgdName, + streamID StreamID OPTIONAL, + eventAction SecondRequestedActions OPTIONAL, + evParList SEQUENCE OF EventParameter, + ... + } + + SecondRequestedActions ::= SEQUENCE + { + keepActive BOOLEAN OPTIONAL, + eventDM EventDM OPTIONAL, + signalsDescriptor SignalsDescriptor OPTIONAL, + ... + } + + EventBufferDescriptor ::= SEQUENCE OF EventSpec + + EventSpec ::= SEQUENCE + { + + + +Groves, et al. Standards Track [Page 105] + +RFC 3525 Gateway Control Protocol June 2003 + + + eventName EventName, + streamID StreamID OPTIONAL, + eventParList SEQUENCE OF EventParameter, + ... + } + + SignalsDescriptor ::= SEQUENCE OF SignalRequest + + SignalRequest ::=CHOICE + { + signal Signal, + seqSigList SeqSigList, + ... + } + + SeqSigList ::= SEQUENCE + { + id INTEGER(0..65535), + signalList SEQUENCE OF Signal + } + + Signal ::= SEQUENCE + { + signalName SignalName, + streamID StreamID OPTIONAL, + sigType SignalType OPTIONAL, + duration INTEGER (0..65535) OPTIONAL, + notifyCompletion NotifyCompletion OPTIONAL, + keepActive BOOLEAN OPTIONAL, + sigParList SEQUENCE OF SigParameter, + ... + } + + SignalType ::= ENUMERATED + { + brief(0), + onOff(1), + timeOut(2), + ... + } + + SignalName ::= PkgdName + + NotifyCompletion ::= BIT STRING + { + onTimeOut(0), onInterruptByEvent(1), + onInterruptByNewSignalDescr(2), otherReason(3) + } + + + +Groves, et al. Standards Track [Page 106] + +RFC 3525 Gateway Control Protocol June 2003 + + + + SigParameter ::= SEQUENCE + { + sigParameterName Name, + value Value, + -- For use of extraInfo see the comment related to PropertyParm + extraInfo CHOICE + { + relation Relation, + range BOOLEAN, + sublist BOOLEAN + + } OPTIONAL, + ... + } + + -- For an AuditCapReply with all events, the RequestID SHALL be ALL. + -- ALL is represented by 0xffffffff. + + RequestID ::= INTEGER(0..4294967295) -- 32-bit unsigned integer + + ModemDescriptor ::= SEQUENCE + { + mtl SEQUENCE OF ModemType, + mpl SEQUENCE OF PropertyParm, + nonStandardData NonStandardData OPTIONAL + } + + ModemType ::= ENUMERATED + { + v18(0), + v22(1), + v22bis(2), + v32(3), + v32bis(4), + v34(5), + v90(6), + v91(7), + synchISDN(8), + ... + } + + DigitMapDescriptor ::= SEQUENCE + { + digitMapName DigitMapName OPTIONAL, + digitMapValue DigitMapValue OPTIONAL + } + + + + +Groves, et al. Standards Track [Page 107] + +RFC 3525 Gateway Control Protocol June 2003 + + + DigitMapName ::= Name + + DigitMapValue ::= SEQUENCE + { + startTimer INTEGER(0..99) OPTIONAL, + shortTimer INTEGER(0..99) OPTIONAL, + longTimer INTEGER(0..99) OPTIONAL, + digitMapBody IA5String, + -- Units are seconds for start, short and long timers, and + -- hundreds of milliseconds for duration timer. Thus start, + -- short, and long range from 1 to 99 seconds and duration + -- from 100 ms to 9.9 s + -- See A.3 for explanation of digit map syntax + ... + } + + ServiceChangeParm ::= SEQUENCE + { + serviceChangeMethod ServiceChangeMethod, + serviceChangeAddress ServiceChangeAddress OPTIONAL, + serviceChangeVersion INTEGER(0..99) OPTIONAL, + serviceChangeProfile ServiceChangeProfile OPTIONAL, + serviceChangeReason Value, + -- A serviceChangeReason consists of a numeric reason code + -- and an optional text description. + -- The serviceChangeReason SHALL be a string consisting of + -- a decimal reason code, optionally followed by a single + -- space character and a textual description string. + -- This string is first BER-encoded as an IA5String. + -- The result of this BER-encoding is then encoded as + -- an ASN.1 OCTET STRING type, "double wrapping" the + -- value as was done for package elements. + serviceChangeDelay INTEGER(0..4294967295) OPTIONAL, + -- 32-bit unsigned integer + serviceChangeMgcId MId OPTIONAL, + timeStamp TimeNotation OPTIONAL, + nonStandardData NonStandardData OPTIONAL, + ... + } + + ServiceChangeAddress ::= CHOICE + { + portNumber INTEGER(0..65535), -- TCP/UDP port number + ip4Address IP4Address, + ip6Address IP6Address, + domainName DomainName, + deviceName PathName, + mtpAddress OCTET STRING(SIZE(2..4)), + + + +Groves, et al. Standards Track [Page 108] + +RFC 3525 Gateway Control Protocol June 2003 + + + ... + } + + ServiceChangeResParm ::= SEQUENCE + { + serviceChangeMgcId MId OPTIONAL, + serviceChangeAddress ServiceChangeAddress OPTIONAL, + serviceChangeVersion INTEGER(0..99) OPTIONAL, + serviceChangeProfile ServiceChangeProfile OPTIONAL, + timestamp TimeNotation OPTIONAL, + ... + } + + ServiceChangeMethod ::= ENUMERATED + + { + failover(0), + forced(1), + graceful(2), + restart(3), + disconnected(4), + handOff(5), + ... + } + + ServiceChangeProfile ::= SEQUENCE + { + profileName IA5String(SIZE (1..67)) + -- 64 characters for name, 1 for "/", 2 for version to match ABNF + } + + PackagesDescriptor ::= SEQUENCE OF PackagesItem + + PackagesItem ::= SEQUENCE + { + packageName Name, + packageVersion INTEGER(0..99), + ... + } + + StatisticsDescriptor ::= SEQUENCE OF StatisticsParameter + + StatisticsParameter ::= SEQUENCE + { + statName PkgdName, + statValue Value OPTIONAL + } + + + + +Groves, et al. Standards Track [Page 109] + +RFC 3525 Gateway Control Protocol June 2003 + + + NonStandardData ::= SEQUENCE + { + nonStandardIdentifier NonStandardIdentifier, + data OCTET STRING + } + + NonStandardIdentifier ::= CHOICE + { + object OBJECT IDENTIFIER, + h221NonStandard H221NonStandard, + experimental IA5String(SIZE(8)), + -- first two characters should be "X-" or "X+" + ... + } + + H221NonStandard ::= SEQUENCE + { t35CountryCode1 INTEGER(0..255), + t35CountryCode2 INTEGER(0..255), -- country, as per T.35 + t35Extension INTEGER(0..255), -- assigned nationally + manufacturerCode INTEGER(0..65535), -- assigned nationally + ... + } + + TimeNotation ::= SEQUENCE + { + date IA5String(SIZE(8)), -- yyyymmdd format + time IA5String(SIZE(8)) -- hhmmssss format + -- per ISO 8601:1988 + } + + Value ::= SEQUENCE OF OCTET STRING + + END + + + + + + + + + + + + + + + + + + +Groves, et al. Standards Track [Page 110] + +RFC 3525 Gateway Control Protocol June 2003 + + +A.3 Digit maps and path names + + From a syntactic viewpoint, digit maps are strings with syntactic + restrictions imposed upon them. The syntax of valid digit maps is + specified in ABNF [RFC 2234]. The syntax for digit maps presented in + this subclause is for illustrative purposes only. The definition of + digitMap in Annex B takes precedence in the case of differences + between the two. + + digitMap = (digitString / LWSP "(" LWSP digitStringList LWSP ")" + LWSP) + + digitStringList = digitString *( LWSP "|" LWSP digitString ) + digitString = 1*(digitStringElement) + digitStringElement = digitPosition [DOT] + digitPosition = digitMapLetter / digitMapRange + digitMapRange = ("x" / (LWSP "[" LWSP digitLetter LWSP "]" LWSP)) + digitLetter = *((DIGIT "-" DIGIT) /digitMapLetter) + digitMapLetter = DIGIT ;digits 0-9 + / %x41-4B / %x61-6B ;a-k and A-K + / "L"/ "S" ;Inter-event timers + ;(long, short) + / "Z" ;Long duration event + DOT = %x2E ; "." + LWSP = *(WSP / COMMENT / EOL) + WSP = SP / HTAB + COMMENT = ";" *(SafeChar / RestChar / WSP) EOL + EOL = (CR [LF]) / LF + SP = %x20 + HTAB = %x09 + CR = %x0D + LF = %x0A + SafeChar = DIGIT / ALPHA / "+" / "-" / "&" / "!" / "_" / "/" / + "'" / "?" / "@" / "^" / "`" / "~" / "*" / "$" / "\" / + "(" / ")" / "%" / "." + RestChar = ";" / "[" / "]" / "{" / "}" / ":" / "," / "#" / + "<" / ">" / "=" / %x22 + DIGIT = %x30-39 ; digits 0 through 9 + ALPHA = %x41-5A / %x61-7A; A-Z, a-z + + A path name is also a string with syntactic restrictions imposed upon + it. The ABNF production defining it is copied from Annex B. + + ; Total length of pathNAME must not exceed 64 chars. + pathNAME = ["*"] NAME *("/" / "*"/ ALPHA / DIGIT /"_" / "$" ) + ["@" pathDomainName ] + + + + + +Groves, et al. Standards Track [Page 111] + +RFC 3525 Gateway Control Protocol June 2003 + + + ; ABNF allows two or more consecutive "." although it is + ; meaningless in a path domain name. + pathDomainName = (ALPHA / DIGIT / "*" ) + *63(ALPHA / DIGIT / "-" + NAME = ALPHA *63(ALPHA / DIGIT / "_" ) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Groves, et al. Standards Track [Page 112] + +RFC 3525 Gateway Control Protocol June 2003 + + +ANNEX B - Text encoding of the protocol + +B.1 Coding of wildcards + + In a text encoding of the protocol, while TerminationIDs are + arbitrary, by judicious choice of names, the wildcard character, "*" + may be made more useful. When the wildcard character is encountered, + it will "match" all TerminationIDs having the same previous and + following characters (if appropriate). For example, if there were + TerminationIDs of R13/3/1, R13/3/2 and R13/3/3, the TerminationID + R13/3/* would match all of them. There are some circumstances where + ALL Terminations must be referred to. The TerminationID "*" + suffices, and is referred to as ALL. The CHOOSE TerminationID "$" + may be used to signal to the MG that it has to create an ephemeral + Termination or select an idle physical Termination. + +B.2 ABNF specification + + The protocol syntax is presented in ABNF according to RFC 2234. + + Note 1 - This syntax specification does not enforce all + restrictions on element inclusions and values. Some additional + restrictions are stated in comments and other restrictions appear + in the text of this RFC. These additional restrictions are part + of the protocol even though not enforced by this specification. + + Note 2 - The syntax is context-dependent. For example, "Add" can + be the AddToken or a NAME depending on the context in which it + occurs. + + Everything in the ABNF and text encoding is case insensitive. This + includes TerminationIDs, digitmap Ids etc. SDP is case sensitive as + per RFC 2327. + + ; NOTE -- The ABNF in this section uses the VALUE construct (or lists + ; of VALUE constructs) to encode various package element values + ; (properties, signal parameters, etc.). The types of these values + ; vary and are specified the relevant package definition. Several + ; such types are described in section 12.2. + ; + ; The ABNF specification for VALUE allows a quotedString form or a + ; collection of SafeChars. The encoding of package element values + ; into ABNF VALUES is specified below. If a type's encoding allows + ; characters other than SafeChars, the quotedString form MUST be used + ; for all values of that type, even for specific values that consist + ; only of SafeChars. + ; + + + + +Groves, et al. Standards Track [Page 113] + +RFC 3525 Gateway Control Protocol June 2003 + + + ; String: A string MUST use the quotedString form of VALUE and can + ; contain anything allowable in the quotedString form. + ; + ; Integer, Double, and Unsigned Integer: Decimal values can be + ; encoded using characters 0-9. Hexadecimal values must be prefixed + ; with '0x' and can use characters 0-9,a-f,A-F. An octal format is + ; not supported. Negative integers start with '-' and MUST be + ; Decimal. The SafeChar form of VALUE MUST be used. + ; + ; Character: A UTF-8 encoding of a single letter surrounded by + ; double quotes. + ; + ; Enumeration: An enumeration MUST use the SafeChar form of VALUE + ; and can contain anything allowable in the SafeChar form. + ; + ; Boolean: Boolean values are encoded as "on" and "off" and are + ; case insensitive. The SafeChar form of VALUE MUST be used. + ; + ; Future types: Any defined types MUST fit within + ; the ABNF specification of VALUE. Specifically, if a type's + ; encoding allows characters other than SafeChars, the quotedString + ; form MUST be used for all values of that type, even for specific + ; values that consist only of SafeChars. + ; + ; Note that there is no way to use the double quote character within + ; a value. + ; + ; Note that SDP disallows whitespace at the beginning of a line, + ; Megaco ABNF allows whitespace before the beginning of the SDP in + ; the Local/Remote descriptor. Parsers should accept whitespace + ; between the LBRKT following the Local/Remote token and the + ; beginning of the SDP. + + megacoMessage = LWSP [authenticationHeader SEP ] message + + authenticationHeader = AuthToken EQUAL SecurityParmIndex COLON + SequenceNum COLON AuthData + + SecurityParmIndex = "0x" 8(HEXDIG) + SequenceNum = "0x" 8(HEXDIG) + AuthData = "0x" 24*64(HEXDIG) + + message = MegacopToken SLASH Version SEP mId SEP + messageBody + ; The version of the protocol defined here is equal to 1. + + messageBody = ( errorDescriptor / transactionList ) + + + + +Groves, et al. Standards Track [Page 114] + +RFC 3525 Gateway Control Protocol June 2003 + + + transactionList = 1*( transactionRequest / transactionReply / + transactionPending / transactionResponseAck ) + ;Use of response acks is dependent on underlying transport + + + transactionPending = PendingToken EQUAL TransactionID LBRKT + RBRKT + + transactionResponseAck = ResponseAckToken LBRKT transactionAck + *(COMMA transactionAck) RBRKT + transactionAck = transactionID / (transactionID "-" transactionID) + + transactionRequest = TransToken EQUAL TransactionID LBRKT + actionRequest *(COMMA actionRequest) RBRKT + + actionRequest = CtxToken EQUAL ContextID LBRKT (( + contextRequest [COMMA commandRequestList]) + / commandRequestList) RBRKT + + contextRequest = ((contextProperties [COMMA contextAudit]) + / contextAudit) + + contextProperties = contextProperty *(COMMA contextProperty) + + ; at-most-once + contextProperty = (topologyDescriptor / priority / EmergencyToken) + + contextAudit = ContextAuditToken LBRKT contextAuditProperties + *(COMMA contextAuditProperties) RBRKT + + ; at-most-once + contextAuditProperties = ( TopologyToken / EmergencyToken / + PriorityToken ) + + ; "O-" indicates an optional command + ; "W-" indicates a wildcarded response to a command + commandRequestList = ["O-"] ["W-"] commandRequest + *(COMMA ["O-"] ["W-"]commandRequest) + + commandRequest = ( ammRequest / subtractRequest / auditRequest / + notifyRequest / serviceChangeRequest) + + transactionReply = ReplyToken EQUAL TransactionID LBRKT + [ ImmAckRequiredToken COMMA] + ( errorDescriptor / actionReplyList ) RBRKT + + actionReplyList = actionReply *(COMMA actionReply ) + + + + +Groves, et al. Standards Track [Page 115] + +RFC 3525 Gateway Control Protocol June 2003 + + + actionReply = CtxToken EQUAL ContextID LBRKT + ( errorDescriptor / commandReply ) / + (commandReply COMMA errorDescriptor) ) RBRKT + + commandReply = (( contextProperties [COMMA commandReplyList] ) / + commandReplyList ) + + + commandReplyList = commandReplys *(COMMA commandReplys ) + + commandReplys = (serviceChangeReply / auditReply / ammsReply / + notifyReply ) + + ;Add Move and Modify have the same request parameters + ammRequest = (AddToken / MoveToken / ModifyToken ) EQUAL + TerminationID [LBRKT ammParameter *(COMMA + ammParameter) RBRKT] + + ;at-most-once + ammParameter = (mediaDescriptor / modemDescriptor / + muxDescriptor / eventsDescriptor / + signalsDescriptor / digitMapDescriptor / + eventBufferDescriptor / auditDescriptor) + + ammsReply = (AddToken / MoveToken / ModifyToken / + SubtractToken ) EQUAL TerminationID [ LBRKT + terminationAudit RBRKT ] + + subtractRequest = SubtractToken EQUAL TerminationID + [ LBRKT auditDescriptor RBRKT] + + auditRequest = (AuditValueToken / AuditCapToken ) EQUAL + TerminationID LBRKT auditDescriptor RBRKT + + auditReply = (AuditValueToken / AuditCapToken ) + ( contextTerminationAudit / auditOther) + + auditOther = EQUAL TerminationID [LBRKT + terminationAudit RBRKT] + + terminationAudit = auditReturnParameter *(COMMA auditReturnParameter) + + contextTerminationAudit = EQUAL CtxToken ( terminationIDList / + LBRKT errorDescriptor RBRKT ) + + auditReturnParameter = (mediaDescriptor / modemDescriptor / + muxDescriptor / eventsDescriptor / + signalsDescriptor / digitMapDescriptor / + + + +Groves, et al. Standards Track [Page 116] + +RFC 3525 Gateway Control Protocol June 2003 + + + observedEventsDescriptor / eventBufferDescriptor / + statisticsDescriptor / packagesDescriptor / + errorDescriptor / auditItem) + + auditDescriptor = AuditToken LBRKT [ auditItem + *(COMMA auditItem) ] RBRKT + + notifyRequest = NotifyToken EQUAL TerminationID + LBRKT ( observedEventsDescriptor + [ COMMA errorDescriptor ] ) RBRKT + + notifyReply = NotifyToken EQUAL TerminationID + [ LBRKT errorDescriptor RBRKT ] + + serviceChangeRequest = ServiceChangeToken EQUAL TerminationID + LBRKT serviceChangeDescriptor RBRKT + + serviceChangeReply = ServiceChangeToken EQUAL TerminationID + [LBRKT (errorDescriptor / + serviceChangeReplyDescriptor) RBRKT] + + errorDescriptor = ErrorToken EQUAL ErrorCode + LBRKT [quotedString] RBRKT + + ErrorCode = 1*4(DIGIT) ; could be extended + + TransactionID = UINT32 + + mId = (( domainAddress / domainName ) + [":" portNumber]) / mtpAddress / deviceName + + ; ABNF allows two or more consecutive "." although it is meaningless + ; in a domain name. + domainName = "<" (ALPHA / DIGIT) *63(ALPHA / DIGIT / "-" / + ".") ">" + deviceName = pathNAME + + ;The values 0x0, 0xFFFFFFFE and 0xFFFFFFFF are reserved. + ContextID = (UINT32 / "*" / "-" / "$") + + domainAddress = "[" (IPv4address / IPv6address) "]" + ;RFC2373 contains the definition of IP6Addresses. + IPv6address = hexpart [ ":" IPv4address ] + IPv4address = V4hex DOT V4hex DOT V4hex DOT V4hex + V4hex = 1*3(DIGIT) ; "0".."255" + ; this production, while occurring in RFC2373, is not referenced + ; IPv6prefix = hexpart SLASH 1*2DIGIT + hexpart = hexseq "::" [ hexseq ] / "::" [ hexseq ] / hexseq + + + +Groves, et al. Standards Track [Page 117] + +RFC 3525 Gateway Control Protocol June 2003 + + + hexseq = hex4 *( ":" hex4) + hex4 = 1*4HEXDIG + + portNumber = UINT16 + + ; Addressing structure of mtpAddress: + ; 25 - 15 0 + ; | PC | NI | + ; 24 - 14 bits 2 bits + ; Note: 14 bits are defined for international use. + ; Two national options exist where the point code is 16 or 24 bits. + ; To octet align the mtpAddress the MSBs shall be encoded as 0s. + ; An octet shall be represented by 2 hex digits. + mtpAddress = MTPToken LBRKT 4*8 (HEXDIG) RBRKT + + terminationIDList = LBRKT TerminationID *(COMMA TerminationID) RBRKT + + ; Total length of pathNAME must not exceed 64 chars. + pathNAME = ["*"] NAME *("/" / "*"/ ALPHA / DIGIT /"_" / "$" ) + ["@" pathDomainName ] + + ; ABNF allows two or more consecutive "." although it is meaningless + ; in a path domain name. + pathDomainName = (ALPHA / DIGIT / "*" ) + *63(ALPHA / DIGIT / "-" / "*" / ".") + + TerminationID = "ROOT" / pathNAME / "$" / "*" + + mediaDescriptor = MediaToken LBRKT mediaParm *(COMMA mediaParm) RBRKT + + ; at-most one terminationStateDescriptor + ; and either streamParm(s) or streamDescriptor(s) but not both + mediaParm = (streamParm / streamDescriptor / + terminationStateDescriptor) + + ; at-most-once per item + streamParm = ( localDescriptor / remoteDescriptor / + localControlDescriptor ) + + streamDescriptor = StreamToken EQUAL StreamID LBRKT streamParm + *(COMMA streamParm) RBRKT + + localControlDescriptor = LocalControlToken LBRKT localParm + *(COMMA localParm) RBRKT + + ; at-most-once per item except for propertyParm + localParm = ( streamMode / propertyParm / reservedValueMode + / reservedGroupMode ) + + + +Groves, et al. Standards Track [Page 118] + +RFC 3525 Gateway Control Protocol June 2003 + + + + reservedValueMode = ReservedValueToken EQUAL ( "ON" / "OFF" ) + reservedGroupMode = ReservedGroupToken EQUAL ( "ON" / "OFF" ) + + streamMode = ModeToken EQUAL streamModes + + streamModes = (SendonlyToken / RecvonlyToken / SendrecvToken / + InactiveToken / LoopbackToken ) + + propertyParm = pkgdName parmValue + parmValue = (EQUAL alternativeValue/ INEQUAL VALUE) + alternativeValue = ( VALUE + / LSBRKT VALUE *(COMMA VALUE) RSBRKT + ; sublist (i.e., A AND B AND ...) + / LBRKT VALUE *(COMMA VALUE) RBRKT + ; alternatives (i.e., A OR B OR ...) + / LSBRKT VALUE COLON VALUE RSBRKT ) + ; range + + INEQUAL = LWSP (">" / "<" / "#" ) LWSP + LSBRKT = LWSP "[" LWSP + RSBRKT = LWSP "]" LWSP + + ; Note - The octet zero is not among the permitted characters in + ; octet string. As the current definition is limited to SDP, and a + ; zero octet would not be a legal character in SDP, this is not a + ; concern. + + localDescriptor = LocalToken LBRKT octetString RBRKT + + remoteDescriptor = RemoteToken LBRKT octetString RBRKT + + eventBufferDescriptor= EventBufferToken [ LBRKT eventSpec + *( COMMA eventSpec) RBRKT ] + + eventSpec = pkgdName [ LBRKT eventSpecParameter + *(COMMA eventSpecParameter) RBRKT ] + eventSpecParameter = (eventStream / eventOther) + + eventBufferControl = BufferToken EQUAL ( "OFF" / LockStepToken ) + + terminationStateDescriptor = TerminationStateToken LBRKT + terminationStateParm *( COMMA terminationStateParm ) RBRKT + + ; at-most-once per item except for propertyParm + terminationStateParm = (propertyParm / serviceStates / + eventBufferControl ) + + + + +Groves, et al. Standards Track [Page 119] + +RFC 3525 Gateway Control Protocol June 2003 + + + serviceStates = ServiceStatesToken EQUAL ( TestToken / + OutOfSvcToken / InSvcToken ) + + muxDescriptor = MuxToken EQUAL MuxType terminationIDList + + MuxType = ( H221Token / H223Token / H226Token / V76Token + / extensionParameter ) + + StreamID = UINT16 + pkgdName = (PackageName SLASH ItemID) ;specific item + / (PackageName SLASH "*") ;all items in package + / ("*" SLASH "*") ; all items supported by the MG + PackageName = NAME + ItemID = NAME + + eventsDescriptor = EventsToken [ EQUAL RequestID LBRKT + requestedEvent *( COMMA requestedEvent ) RBRKT ] + + requestedEvent = pkgdName [ LBRKT eventParameter + *( COMMA eventParameter ) RBRKT ] + + ; at-most-once each of KeepActiveToken , eventDM and eventStream + ;at most one of either embedWithSig or embedNoSig but not both + ;KeepActiveToken and embedWithSig must not both be present + eventParameter = ( embedWithSig / embedNoSig / KeepActiveToken + /eventDM / eventStream / eventOther ) + + embedWithSig = EmbedToken LBRKT signalsDescriptor + [COMMA embedFirst ] RBRKT + embedNoSig = EmbedToken LBRKT embedFirst RBRKT + + ; at-most-once of each + embedFirst = EventsToken [ EQUAL RequestID LBRKT + secondRequestedEvent *(COMMA secondRequestedEvent) RBRKT ] + + secondRequestedEvent = pkgdName [ LBRKT secondEventParameter + *( COMMA secondEventParameter ) RBRKT ] + + ; at-most-once each of embedSig , KeepActiveToken, eventDM or + ; eventStream + ; KeepActiveToken and embedSig must not both be present + secondEventParameter = ( embedSig / KeepActiveToken / eventDM / + eventStream / eventOther ) + + embedSig = EmbedToken LBRKT signalsDescriptor RBRKT + + eventStream = StreamToken EQUAL StreamID + + + + +Groves, et al. Standards Track [Page 120] + +RFC 3525 Gateway Control Protocol June 2003 + + + eventOther = eventParameterName parmValue + + eventParameterName = NAME + + eventDM = DigitMapToken EQUAL(( digitMapName ) / + (LBRKT digitMapValue RBRKT )) + + signalsDescriptor = SignalsToken LBRKT [ signalParm + *(COMMA signalParm)] RBRKT + + signalParm = signalList / signalRequest + + signalRequest = signalName [ LBRKT sigParameter + *(COMMA sigParameter) RBRKT ] + + signalList = SignalListToken EQUAL signalListId LBRKT + signalListParm *(COMMA signalListParm) RBRKT + + signalListId = UINT16 + + ;exactly once signalType, at most once duration and every signal + ;parameter + signalListParm = signalRequest + + signalName = pkgdName + ;at-most-once sigStream, at-most-once sigSignalType, + ;at-most-once sigDuration, every signalParameterName at most once + sigParameter = sigStream / sigSignalType / sigDuration / sigOther + / notifyCompletion / KeepActiveToken + sigStream = StreamToken EQUAL StreamID + sigOther = sigParameterName parmValue + sigParameterName = NAME + sigSignalType = SignalTypeToken EQUAL signalType + signalType = (OnOffToken / TimeOutToken / BriefToken) + sigDuration = DurationToken EQUAL UINT16 + notifyCompletion = NotifyCompletionToken EQUAL (LBRKT + notificationReason *(COMMA notificationReason) RBRKT) + + notificationReason = ( TimeOutToken / InterruptByEventToken + / InterruptByNewSignalsDescrToken + / OtherReasonToken ) + observedEventsDescriptor = ObservedEventsToken EQUAL RequestID + LBRKT observedEvent *(COMMA observedEvent) RBRKT + + ;time per event, because it might be buffered + observedEvent = [ TimeStamp LWSP COLON] LWSP + pkgdName [ LBRKT observedEventParameter + *(COMMA observedEventParameter) RBRKT ] + + + +Groves, et al. Standards Track [Page 121] + +RFC 3525 Gateway Control Protocol June 2003 + + + + ;at-most-once eventStream, every eventParameterName at most once + observedEventParameter = eventStream / eventOther + + ; For an AuditCapReply with all events, the RequestID should be ALL. + RequestID = ( UINT32 / "*" ) + + modemDescriptor = ModemToken (( EQUAL modemType) / + (LSBRKT modemType *(COMMA modemType) RSBRKT)) + [ LBRKT propertyParm *(COMMA propertyParm) RBRKT ] + + + ; at-most-once except for extensionParameter + modemType = (V32bisToken / V22bisToken / V18Token / + V22Token / V32Token / V34Token / V90Token / + V91Token / SynchISDNToken / extensionParameter) + + digitMapDescriptor = DigitMapToken EQUAL + ( ( LBRKT digitMapValue RBRKT ) / + (digitMapName [ LBRKT digitMapValue RBRKT ]) ) + digitMapName = NAME + digitMapValue = ["T" COLON Timer COMMA] ["S" COLON Timer COMMA] + ["L" COLON Timer COMMA] digitMap + Timer = 1*2DIGIT + ; Units are seconds for T, S, and L timers, and hundreds of + ; milliseconds for Z timer. Thus T, S, and L range from 1 to 99 + ; seconds and Z from 100 ms to 9.9 s + digitMap = (digitString / + LWSP "(" LWSP digitStringList LWSP ")" LWSP) + digitStringList = digitString *( LWSP "|" LWSP digitString ) + digitString = 1*(digitStringElement) + digitStringElement = digitPosition [DOT] + digitPosition = digitMapLetter / digitMapRange + digitMapRange = ("x" / (LWSP "[" LWSP digitLetter LWSP "]" LWSP)) + digitLetter = *((DIGIT "-" DIGIT ) / digitMapLetter) + digitMapLetter = DIGIT ;Basic event symbols + / %x41-4B / %x61-6B ; a-k, A-K + / "L" / "S" ;Inter-event timers (long, short) + / "Z" ;Long duration modifier + + ;at-most-once, and DigitMapToken and PackagesToken are not allowed + ;in AuditCapabilities command + auditItem = ( MuxToken / ModemToken / MediaToken / + SignalsToken / EventBufferToken / + DigitMapToken / StatsToken / EventsToken / + ObservedEventsToken / PackagesToken ) + + + + + +Groves, et al. Standards Track [Page 122] + +RFC 3525 Gateway Control Protocol June 2003 + + + serviceChangeDescriptor = ServicesToken LBRKT serviceChangeParm + *(COMMA serviceChangeParm) RBRKT + + ; each parameter at-most-once + ; at most one of either serviceChangeAddress or serviceChangeMgcId + ; but not both + ; serviceChangeMethod and serviceChangeReason are REQUIRED + serviceChangeParm = (serviceChangeMethod / serviceChangeReason / + serviceChangeDelay / serviceChangeAddress / + serviceChangeProfile / extension / TimeStamp / + serviceChangeMgcId / serviceChangeVersion ) + + serviceChangeReplyDescriptor = ServicesToken LBRKT + servChgReplyParm *(COMMA servChgReplyParm) RBRKT + + ; at-most-once. Version is REQUIRED on first ServiceChange response + ; at most one of either serviceChangeAddress or serviceChangeMgcId + ; but not both + servChgReplyParm = (serviceChangeAddress / serviceChangeMgcId / + serviceChangeProfile / serviceChangeVersion / + TimeStamp) + serviceChangeMethod = MethodToken EQUAL (FailoverToken / + ForcedToken / GracefulToken / RestartToken / + DisconnectedToken / HandOffToken / + extensionParameter) + ; A serviceChangeReason consists of a numeric reason code + ; and an optional text description. + ; A serviceChangeReason MUST be encoded using the quotedString + ; form of VALUE. + ; The quotedString SHALL contain a decimal reason code, + ; optionally followed by a single space character and a + ; textual description string. + + + serviceChangeReason = ReasonToken EQUAL VALUE + serviceChangeDelay = DelayToken EQUAL UINT32 + serviceChangeAddress = ServiceChangeAddressToken EQUAL ( mId / + portNumber ) + serviceChangeMgcId = MgcIdToken EQUAL mId + serviceChangeProfile = ProfileToken EQUAL NAME SLASH Version + serviceChangeVersion = VersionToken EQUAL Version + extension = extensionParameter parmValue + + packagesDescriptor = PackagesToken LBRKT packagesItem + *(COMMA packagesItem) RBRKT + + Version = 1*2(DIGIT) + packagesItem = NAME "-" UINT16 + + + +Groves, et al. Standards Track [Page 123] + +RFC 3525 Gateway Control Protocol June 2003 + + + + TimeStamp = Date "T" Time ; per ISO 8601:1988 + ; Date = yyyymmdd + Date = 8(DIGIT) + ; Time = hhmmssss + Time = 8(DIGIT) + statisticsDescriptor = StatsToken LBRKT statisticsParameter + *(COMMA statisticsParameter ) RBRKT + + ;at-most-once per item + statisticsParameter = pkgdName [EQUAL VALUE] + + topologyDescriptor = TopologyToken LBRKT topologyTriple + *(COMMA topologyTriple) RBRKT + topologyTriple = terminationA COMMA + terminationB COMMA topologyDirection + terminationA = TerminationID + terminationB = TerminationID + topologyDirection = BothwayToken / IsolateToken / OnewayToken + + priority = PriorityToken EQUAL UINT16 + + extensionParameter = "X" ("-" / "+") 1*6(ALPHA / DIGIT) + + ; octetString is used to describe SDP defined in RFC2327. + ; Caution should be taken if CRLF in RFC2327 is used. + ; To be safe, use EOL in this ABNF. + ; Whenever "}" appears in SDP, it is escaped by "\", e.g., "\}" + octetString = *(nonEscapeChar) + nonEscapeChar = ( "\}" / %x01-7C / %x7E-FF ) + ; Note - The double-quote character is not allowed in quotedString. + quotedString = DQUOTE *(SafeChar / RestChar/ WSP) DQUOTE + + UINT16 = 1*5(DIGIT) ; %x0-FFFF + UINT32 = 1*10(DIGIT) ; %x0-FFFFFFFF + + NAME = ALPHA *63(ALPHA / DIGIT / "_" ) + VALUE = quotedString / 1*(SafeChar) + SafeChar = DIGIT / ALPHA / "+" / "-" / "&" / + "!" / "_" / "/" / "\'" / "?" / "@" / + "^" / "`" / "~" / "*" / "$" / "\" / + "(" / ")" / "%" / "|" / "." + + EQUAL = LWSP %x3D LWSP ; "=" + COLON = %x3A ; ":" + LBRKT = LWSP %x7B LWSP ; "{" + RBRKT = LWSP %x7D LWSP ; "}" + COMMA = LWSP %x2C LWSP ; "," + + + +Groves, et al. Standards Track [Page 124] + +RFC 3525 Gateway Control Protocol June 2003 + + + DOT = %x2E ; "." + SLASH = %x2F ; "/" + ALPHA = %x41-5A / %x61-7A ; A-Z / a-z + DIGIT = %x30-39 ; 0-9 + DQUOTE = %x22 ; " (Double Quote) + HEXDIG = ( DIGIT / "A" / "B" / "C" / "D" / "E" / "F" ) + SP = %x20 ; space + HTAB = %x09 ; horizontal tab + CR = %x0D ; Carriage return + LF = %x0A ; linefeed + LWSP = *( WSP / COMMENT / EOL ) + EOL = (CR [LF] / LF ) + WSP = SP / HTAB ; white space + SEP = ( WSP / EOL / COMMENT) LWSP + COMMENT = ";" *(SafeChar/ RestChar / WSP / %x22) EOL + RestChar = ";" / "[" / "]" / "{" / "}" / ":" / "," / "#" / + "<" / ">" / "=" + + ; New Tokens added to sigParameter must take the format of SPA* + ; * may be of any form i.e., SPAM + ; New Tokens added to eventParameter must take the form of EPA* + ; * may be of any form i.e., EPAD + + AddToken = ("Add" / "A") + AuditToken = ("Audit" / "AT") + AuditCapToken = ("AuditCapability" / "AC") + AuditValueToken = ("AuditValue" / "AV") + AuthToken = ("Authentication" / "AU") + BothwayToken = ("Bothway" / "BW") + BriefToken = ("Brief" / "BR") + BufferToken = ("Buffer" / "BF") + CtxToken = ("Context" / "C") + ContextAuditToken = ("ContextAudit" / "CA") + DigitMapToken = ("DigitMap" / "DM") + DisconnectedToken = ("Disconnected" / "DC") + DelayToken = ("Delay" / "DL") + DurationToken = ("Duration" / "DR") + EmbedToken = ("Embed" / "EM") + EmergencyToken = ("Emergency" / "EG") + ErrorToken = ("Error" / "ER") + EventBufferToken = ("EventBuffer" / "EB") + EventsToken = ("Events" / "E") + FailoverToken = ("Failover" / "FL") + ForcedToken = ("Forced" / "FO") + GracefulToken = ("Graceful" / "GR") + H221Token = ("H221" ) + H223Token = ("H223" ) + H226Token = ("H226" ) + + + +Groves, et al. Standards Track [Page 125] + +RFC 3525 Gateway Control Protocol June 2003 + + + HandOffToken = ("HandOff" / "HO") + ImmAckRequiredToken = ("ImmAckRequired" / "IA") + InactiveToken = ("Inactive" / "IN") + IsolateToken = ("Isolate" / "IS") + InSvcToken = ("InService" / "IV") + InterruptByEventToken = ("IntByEvent" / "IBE") + InterruptByNewSignalsDescrToken + = ("IntBySigDescr" / "IBS") + KeepActiveToken = ("KeepActive" / "KA") + LocalToken = ("Local" / "L") + LocalControlToken = ("LocalControl" / "O") + LockStepToken = ("LockStep" / "SP") + LoopbackToken = ("Loopback" / "LB") + MediaToken = ("Media" / "M") + MegacopToken = ("MEGACO" / "!") + MethodToken = ("Method" / "MT") + MgcIdToken = ("MgcIdToTry" / "MG") + ModeToken = ("Mode" / "MO") + ModifyToken = ("Modify" / "MF") + ModemToken = ("Modem" / "MD") + MoveToken = ("Move" / "MV") + MTPToken = ("MTP") + MuxToken = ("Mux" / "MX") + NotifyToken = ("Notify" / "N") + NotifyCompletionToken = ("NotifyCompletion" / "NC") + ObservedEventsToken = ("ObservedEvents" / "OE") + OnewayToken = ("Oneway" / "OW") + OnOffToken = ("OnOff" / "OO") + OtherReasonToken = ("OtherReason" / "OR") + OutOfSvcToken = ("OutOfService" / "OS") + PackagesToken = ("Packages" / "PG") + PendingToken = ("Pending" / "PN") + PriorityToken = ("Priority" / "PR") + ProfileToken = ("Profile" / "PF") + ReasonToken = ("Reason" / "RE") + RecvonlyToken = ("ReceiveOnly" / "RC") + ReplyToken = ("Reply" / "P") + RestartToken = ("Restart" / "RS") + RemoteToken = ("Remote" / "R") + ReservedGroupToken = ("ReservedGroup" / "RG") + ReservedValueToken = ("ReservedValue" / "RV") + SendonlyToken = ("SendOnly" / "SO") + SendrecvToken = ("SendReceive" / "SR") + ServicesToken = ("Services" / "SV") + ServiceStatesToken = ("ServiceStates" / "SI") + ServiceChangeToken = ("ServiceChange" / "SC") + ServiceChangeAddressToken = ("ServiceChangeAddress" / "AD") + SignalListToken = ("SignalList" / "SL") + + + +Groves, et al. Standards Track [Page 126] + +RFC 3525 Gateway Control Protocol June 2003 + + + SignalsToken = ("Signals" / "SG") + SignalTypeToken = ("SignalType" / "SY") + StatsToken = ("Statistics" / "SA") + StreamToken = ("Stream" / "ST") + SubtractToken = ("Subtract" / "S") + SynchISDNToken = ("SynchISDN" / "SN") + TerminationStateToken = ("TerminationState" / "TS") + TestToken = ("Test" / "TE") + TimeOutToken = ("TimeOut" / "TO") + TopologyToken = ("Topology" / "TP") + TransToken = ("Transaction" / "T") + ResponseAckToken = ("TransactionResponseAck" / "K") + V18Token = ("V18") + V22Token = ("V22") + V22bisToken = ("V22b") + V32Token = ("V32") + V32bisToken = ("V32b") + V34Token = ("V34") + V76Token = ("V76") + V90Token = ("V90") + V91Token = ("V91") + VersionToken = ("Version" / "V") + +B.3 Hexadecimal octet coding + + Hexadecimal octet coding is a means for representing a string of + octets as a string of hexadecimal digits, with two digits + representing each octet. This octet encoding should be used when + encoding octet strings in the text version of the protocol. For each + octet, the 8-bit sequence is encoded as two hexadecimal digits. Bit + 0 is the first transmitted; bit 7 is the last. Bits 7-4 are encoded + as the first hexadecimal digit, with Bit 7 as MSB and Bit 4 as LSB. + Bits 3-0 are encoded as the second hexadecimal digit, with Bit 3 as + MSB and Bit 0 as LSB. Examples: + + Octet bit pattern Hexadecimal coding + 00011011 D8 + 11100100 27 + 10000011 10100010 11001000 00001001 C1451390 + +B.4 Hexadecimal octet sequence + + A hexadecimal octet sequence is an even number of hexadecimal digits, + terminated by a character. + + + + + + + +Groves, et al. Standards Track [Page 127] + +RFC 3525 Gateway Control Protocol June 2003 + + +ANNEX C - Tags for media stream properties + + Parameters for Local, Remote and LocalControl descriptors are + specified as tag-value pairs if binary encoding is used for the + protocol. This annex contains the property names (PropertyID), the + tags (Property tag), type of the property (Type) and the values + (Value). Values presented in the Value field when the field contains + references shall be regarded as "information". The reference + contains the normative values. If a value field does not contain a + reference, then the values in that field can be considered as + "normative". + + Tags are given as hexadecimal numbers in this annex. When setting + the value of a property, a MGC may underspecify the value according + to one of the mechanisms specified in 7.1.1. + + It is optional to support the properties in this Annex or any of its + sub-sections. For example, only three properties from C.3 and only + five properties from C.8 might be implemented. + + For type "enumeration" the value is represented by the value in + brackets, e.g., Send(0), Receive(1). Annex C properties with the + types "N bits" or "M Octets" should be treated as octet strings when + encoding the protocol. Properties with "N bit integer" shall be + treated as an integers. "String" shall be treated as an IA5String + when encoding the protocol. + + When a type is smaller than one octet, the value shall be stored in + the low-order bits of an octet string of size 1. + +C.1 General media attributes + + PropertyID Property Type Value + tag + + Media 1001 Enumeration Audio(0), Video(1), Data(2) + + Transmission 1002 Enumeration Send(0), Receive(1), + mode Send&Receive(2) + + Number of 1003 Unsigned 0-255 + Channels integer + + Sampling 1004 Unsigned 0-2^32 + rate integer + + Bitrate 1005 Integer (0..4294967295)NOTE - Units of + 100 bit/s. + + + +Groves, et al. Standards Track [Page 128] + +RFC 3525 Gateway Control Protocol June 2003 + + + ACodec 1006 Octet string Audio Codec Type: + Ref.: ITU-T Q.765 + Non-ITU-T codecs are defined + with the appropriate standards + organization under a defined + Organizational Identifier. + + Samplepp 1007 Unsigned Maximum samples or frames per + integer packet: 0..65535 + + Silencesupp 1008 Boolean Silence Suppression: True/False + + Encrypttype 1009 Octet string Ref.: ITU-T H.245 + + Encryptkey 100A Octet string Encryption key + size Ref.: ITU-T H.235 + (0..65535) + + Echocanc 100B Not Used. See H.248.1 E.13 for + an example of possible Echo + Control properties. + + Gain 100C Unsigned Gain in dB: 0..65535 + integer + + Jitterbuff 100D Unsigned Jitter buffer size in ms: + integer 0..65535 + + PropDelay 100E Unsigned Propagation Delay: 0..65535 + integer Maximum propagation delay in + milliseconds for the bearer + connection between two media + gateways. The maximum delay + will be dependent on the bearer + technology. + + RTPpayload 100F Integer Payload type in RTP Profile for + Audio and Video Conferences + with Minimal Control + Ref.: RFC 1890 + + + + + + + + + + + +Groves, et al. Standards Track [Page 129] + +RFC 3525 Gateway Control Protocol June 2003 + + +C.2 Mux properties + + PropertyID Property tag Type Value + + H222 2001 Octet string H222LogicalChannelParameters + Ref.: ITU-T H.245 + + H223 2002 Octet string H223LogicalChannelParameters + Ref.: ITU-T H.245 + + V76 2003 Octet string V76LogicalChannelParameters + Ref.: ITU-T H.245 + + H2250 2004 Octet string H2250LogicalChannelParameters + Ref.: ITU-T H.245 + +C.3 General bearer properties + + PropertyID Property Type Value + tag + + Mediatx 3001 Enumeration Media Transport TypeTDM + Circuit(0), ATM(1), FR(2), + Ipv4(3), Ipv6(4), ... + + BIR 3002 4 octets Value depends on transport + technology + + NSAP 3003 1-20 octets See NSAP. + Ref.: Annex A/X.213 + +C.4 General ATM properties + + PropertyID Property Type Value + tag + + AESA 4001 20 octets ATM End System Address + + VPVC 4002 4 octets: VPCI VPCI/VCI + in first two + least Ref.: ITU-T Q.2931 + significant + octets, VCI in + second two + octets + + + + + + +Groves, et al. Standards Track [Page 130] + +RFC 3525 Gateway Control Protocol June 2003 + + + SC 4003 Enumeration Service Category: CBR(0), + nrt-VBR1(1), nrt VBR2(2), + nrt-VBR3(3), rt-VBR1(4), + rt VBR2(5), rt-VBR3(6), + UBR1(7), UBR2(8), ABR(9). + Ref.: ATM Forum UNI 4.0 + + BCOB 4004 5-bit integer Broadband Bearer Class + Ref.: ITU-T Q.2961.2 + + BBTC 4005 7-bit integer Broadband Transfer Capability + Ref.: ITU-T Q.2961.1 + + ATC 4006 Enumeration I.371 ATM Traffic + CapabilityDBR(0), SBR1(1), + SBR2(2), SBR3(3), ABT/IT(4), + ABT/DT(5), ABR(6) + Ref.: ITU-T I.371 + + STC 4007 2 bits Susceptibility to clipping: + Bits + 2 1 + --- + 0 0 not susceptible to + clipping + 0 1 susceptible to + clipping + Ref.: ITU-T Q.2931 + + UPCC 4008 2 bits User Plane Connection + configuration: + Bits + 2 1 + --- + 0 0 point-to-point + 0 1 point-to-multipoint + Ref.: ITU-T Q.2931 + + PCR0 4009 24-bit integer Peak Cell Rate (For CLP = 0) + Ref.: ITU-T Q.2931 + + SCR0 400A 24-bit integer Sustainable Cell Rate (For + CLP = 0) + Ref.: ITU-T Q.2961.1 + + MBS0 400B 24-bit integer Maximum Burst Size (For CLP = + 0) + Ref.: ITU-T Q.2961.1 + + + +Groves, et al. Standards Track [Page 131] + +RFC 3525 Gateway Control Protocol June 2003 + + + PCR1 400C 24-bit integer Peak Cell Rate (For CLP = 0 + + 1) + Ref.: ITU-T Q.2931 + + SCR1 400D 24-bit integer Sustainable Cell Rate (For + CLP = 0 + 1) + Ref.: ITU-T Q.2961.1 + + MBS1 400E 24-bit integer Maximum Burst Size (For CLP = + 0 + 1) + Ref.: ITU-T Q.2961.1 + + BEI 400F Boolean Best Effort Indicator + Value 1 indicates that BEI is + to be included in the ATM + signaling; value 0 indicates + that BEI is not to be + included in the ATM + signaling. + Ref.: ATM Forum UNI 4.0 + + TI 4010 Boolean Tagging Indicator + Value 0 indicates that + tagging is not allowed; value + 1 indicates that tagging is + requested. + Ref.: ITU-T Q.2961.1 + + FD 4011 Boolean Frame Discard + Value 0 indicates that no + frame discard is allowed; + value 1 indicates that frame + discard is allowed. + Ref.: ATM Forum UNI 4.0 + + A2PCDV 4012 24-bit integer Acceptable 2-point CDV + Ref.: ITU-T Q.2965.2 + + C2PCDV 4013 24-bit integer Cumulative 2-point CDV + Ref.: ITU-T Q.2965.2 + + APPCDV 4014 24-bit integer Acceptable P-P CDV + Ref.: ATM Forum UNI 4.0 + + CPPCDV 4015 24-bit integer Cumulative P-P CDV + Ref.: ATM Forum UNI 4.0 + + + + + +Groves, et al. Standards Track [Page 132] + +RFC 3525 Gateway Control Protocol June 2003 + + + ACLR 4016 8-bit integer Acceptable Cell Loss Ratio + Ref.: ITU-T Q.2965.2, ATM + Forum UNI 4.0 + + MEETD 4017 16-bit integer Maximum End-to-end transit + delay + Ref.: ITU-T Q.2965.2, ATM + Forum UNI 4.0 + + CEETD 4018 16-bit integer Cumulative End-to-end transit + delay + Ref.: ITU-T Q.2965.2, ATM + Forum UNI 4.0 + + QosClass 4019 Integer 0-5 QoS Class + + QoS Class Meaning + + 0 Default QoS + associated + with the ATC + as defined + in ITU-T + Q.2961.2 + + 1 Stringent + + 2 Tolerant + + 3 Bi-level + + 4 Unbounded + + 5 Stringent + Bi-level + Ref.: ITU-T Q.2965.1 + + AALtype 401A 1 octet AAL Type + Bits + 8 7 6 5 4 3 2 1 + --------------- + 0 0 0 0 0 0 0 0 AAL for + voice + 0 0 0 0 0 0 0 1 AAL type 1 + 0 0 0 0 0 0 1 0 AAL type 2 + 0 0 0 0 0 0 1 1 AAL type + 3/4 + 0 0 0 0 0 1 0 1 AAL type 5 + + + +Groves, et al. Standards Track [Page 133] + +RFC 3525 Gateway Control Protocol June 2003 + + + 0 0 0 1 0 0 0 0 user- + defined AAL + Ref.: ITU-T Q.2931 + +C.5 Frame Relay + + PropertyID Property Type Value + tag + + DLCI 5001 Unsigned Data link connection + integer id + + CID 5002 Unsigned sub-channel id + integer + + SID/Noiselevel 5003 Unsigned silence insertion + integer descriptor + + Primary Payload 5004 Unsigned Primary Payload Type + type integer Covers FAX and codecs + +C.6 IP + + PropertyID Property tag Type Value + + IPv4 6001 32 bits Ipv4Address Ipv4Address + Ref.: IETF RFC 791 + + IPv6 6002 128 bits IPv6 Address + Ref.: IETF RFC 2460 + + Port 6003 Unsigned integer 0..65535 + + Porttype 6004 Enumerated TCP(0), UDP(1), SCTP(2) + + +C.7 ATM AAL2 + + PropertyID Property Type Value + tag + + AESA 7001 20 octets AAL2 service endpoint + address as defined in + the referenced + Recommendation. + ESEANSEA + Ref.: ITU-T Q.2630.1 + + + + +Groves, et al. Standards Track [Page 134] + +RFC 3525 Gateway Control Protocol June 2003 + + + BIR See C.3 4 octets Served user generated + reference as defined in + the referenced + Recommendation. + SUGR + Ref.: ITU-T Q.2630.1 + + ALC 7002 12 octets AAL2 link + characteristics as + defined in the + referenced + Recommendation. + Maximum/Average CPS-SDU + bit rate; + Maximum/Average CPS-SDU + size + Ref.: ITU-T Q.2630.1 + + SSCS 7003 I.366.2: Audio (8 Service specific + octets); Multirate (3 convergence sublayer + octets), or I.366.1: information as defined + SAR-assured (14 in: + octets);SAR-unassured - ITU-T Q.2630.1,and + (7 octets). used in: + - ITU-T I.366.2: + Audio/Multirate; + - ITU-T I.366.1: SAR- + assured/unassured. + Ref.: ITU-T Q.2630.1, + I.366.1 and I.366.2 + + SUT 7004 1..254 octets Served user transport + parameter as defined in + the referenced + Recommendation. + Ref.: ITU-T Q.2630.1 + + TCI 7005 Boolean Test connection + indicator as defined in + the referenced + Recommendation. + Ref.: ITU-T Q.2630.1 + + Timer_CU 7006 32-bit integer Timer-CU + Milliseconds to hold + partially filled cell + before sending. + + + + +Groves, et al. Standards Track [Page 135] + +RFC 3525 Gateway Control Protocol June 2003 + + + MaxCPSSDU 7007 8-bit integer Maximum Common Part + Sublayer Service Data + Unit + Ref.: ITU-T Q.2630.1 + + CID 7008 8 bits subchannel id: 0-255 + Ref.: ITU-T I.363.2 +C.8 ATM AAL1 + + PropertyID Property Type Value + tag + + BIR See table 4-29 octets GIT (Generic Identifier + in C.3 Transport) + Ref.: ITU-T Q.2941.1 + + AAL1ST 8001 1 octet AAL1 Subtype + Bits + 8 7 6 5 4 3 2 1 + --------------- + 0 0 0 0 0 0 0 0 null + 0 0 0 0 0 0 0 1 voiceband + signal transport on 64 kbit/s + 0 0 0 0 0 0 1 0 circuit + transport + 0 0 0 0 0 1 0 0 high-quality + audio signal transport + 0 0 0 0 0 1 0 1 video signal + transport + Ref.: ITU-T Q.2931 + + CBRR 8002 1 octet CBR Rate + Bits + 8 7 6 5 4 3 2 1 + --------------- + 0 0 0 0 0 0 0 1 64 kbit/s + 0 0 0 0 0 1 0 0 1544 kbit/s + 0 0 0 0 0 1 0 1 6312 kbit/s + 0 0 0 0 0 1 1 0 32 064 kbit/s + 0 0 0 0 0 1 1 1 44 736 kbit/s + 0 0 0 0 1 0 0 0 97 728 kbit/s + 0 0 0 1 0 0 0 0 2048 kbit/s + 0 0 0 1 0 0 0 1 8448 kbit/s + 0 0 0 1 0 0 1 0 34 368 kbit/s + 0 0 0 1 0 0 1 1 139 264 kbit/s + 0 1 0 0 0 0 0 0 n x 64 kbit/s + 0 1 0 0 0 0 0 1 n x 8 kbit/s + Ref.: ITU-T Q.2931 + + + +Groves, et al. Standards Track [Page 136] + +RFC 3525 Gateway Control Protocol June 2003 + + + MULT See table Multiplier, or n x 64k/8k/300 + in C.9 Ref.: ITU-T Q.2931 + + SCRI 8003 1 octet Source Clock Frequency Recovery + Method + Bits + 8 7 6 5 4 3 2 1 + --------------- + 0 0 0 0 0 0 0 0 null + 0 0 0 0 0 0 0 1 SRTS + 0 0 0 0 0 0 1 0 ACM + Ref.: ITU-T Q.2931 + + ECM 8004 1 octet Error Correction Method + Bits + 8 7 6 5 4 3 2 1 + --------------- + 0 0 0 0 0 0 0 0 null + 0 0 0 0 0 0 0 1 FEC - Loss + 0 0 0 0 0 0 1 0 FEC - Delay + Ref.: ITU-T Q.2931 + + SDTB 8005 16-bit Structured Data Transfer + integer Blocksize + Block size of SDT CBR service + Ref.: ITU-T I.363.1 + + PFCI 8006 8-bit Partially filled cells identifier + integer 1-47 + Ref.: ITU-T I.363.1 + +C.9 Bearer capabilities + + The table entries referencing Recommendation Q.931 refer to the + encoding in the bearer capability information element of Q.931, not + to the low layer information element. + + PropertyID Tag Type Value + + TMR 9001 1 octet Transmission Medium + Requirement (Q.763) + Bits + 87654321 + -------- + 00000000 speech + 00000001 spare + 00000010 64 kbit/s + unrestricted + + + +Groves, et al. Standards Track [Page 137] + +RFC 3525 Gateway Control Protocol June 2003 + + + 00000011 3.1 kHz audio + 00000100 reserved for + alternate speech (service + 2)/64 kbit/s unrestricted + (service 1) + 00000101 reserved for + alternate 64 kbit/s + unrestricted (service + 1)/speech (service 2) + 00000110 64 kbit/s preferred + + The assigned codepoints + listed below are all for + unrestricted service. + 00000111 2 x 64 kbit/s + 00001000 384 kbit/s + 00001001 1536 kbit/s + 00001010 1920 kbit/s + 00001011 + through + 00001111 spare + 00010000 + through + 00101010: + 3 x 64 kbit/s through + 29 x 64 kbit/s + except + 00010011 spare + 00100101 spare + + 00101011 + through + 11111111 spare + Ref.: ITU-T Q.763 + + TMRSR 9002 1 octet Transmission Medium + Requirement Subrate + 0 unspecified + 1 8 kbit/s + 2 16 kbit/s + 3 32 kbit/s + + Contcheck 9003 Boolean Continuity Check + 0 continuity check not + required on this circuit + 1 continuity check + required on this circuit + Ref.: ITU-T Q.763 + + + +Groves, et al. Standards Track [Page 138] + +RFC 3525 Gateway Control Protocol June 2003 + + + + ITC 9004 5 bits Information Transfer + Capability + Bits + 5 4 3 2 1 + --------- + 0 0 0 0 0 Speech + 0 1 0 0 0 Unrestricted + digital information + 0 1 0 0 1 Restricted + digital information + 1 0 0 0 0 3.1 kHz audio + 1 0 0 0 1 Unrestricted + digital information with + tones/announcements + 1 1 0 0 0 Video + All other values are + reserved. + Ref.: ITU-T Q.763 + + TransMode 9005 2 bits Transfer Mode + Bits + 2 1 + --- + 0 0 Circuit mode + 1 0 Packet mode + Ref.: ITU-T Q.931 + + TransRate 9006 5 bits Transfer Rate + Bits + 5 4 3 2 1 + --------- + 0 0 0 0 0 This code shall + be used for packet mode calls + 1 0 0 0 0 64 kbit/s + 1 0 0 0 1 2 x 64 kbit/s + 1 0 0 1 1 384 kbit/s + 1 0 1 0 1 1536 kbit/s + 1 0 1 1 1 1920 kbit/s + 1 1 0 0 0 Multirate (64 + kbit/s base rate) + Ref.: ITU-T Q.931 + + MULT 9007 7 bits Rate Multiplier + Any value from 2 to n + (maximum number of B- + channels) + Ref.: ITU-T Q.931 + + + +Groves, et al. Standards Track [Page 139] + +RFC 3525 Gateway Control Protocol June 2003 + + + + layer1prot 9008 5 bits User Information Layer 1 + Protocol + Bits + 5 4 3 2 1 + --------- + 0 0 0 0 1 ITU-T + standardized rate adaption + V.110 and X.30. + 0 0 0 1 0 Recommendation + G.711 m-law + 0 0 0 1 1 Recommendation + G.711 A-law + 0 0 1 0 0 Recommendation + G.721 32 kbit/s ADPCM and + Recommendation I.460 + 0 0 1 0 1 Recommendations + H.221 and H.242 + 0 0 1 1 0 Recommendations + H.223 and H.245 + 0 0 1 1 1 Non-ITU-T + standardized rate adaption. + 0 1 0 0 0 ITU-T + standardized rate adaption + V.120. + 0 1 0 0 1 ITU-T + standardized rate adaption + X.31 HDLC flag stuffing + All other values are + reserved. + Ref.: ITU Recommendation + Q.931 + + syncasync 9009 Boolean Synchronous/Asynchronous + 0 Synchronous data + 1 Asynchronous data + Ref.: ITU-T Q.931 + + negotiation 900A Boolean Negotiation + 0 In-band negotiation + possible + 1 In-band negotiation not + possible + Ref.: ITU-T Q.931 + + Userrate 900B 5 bits User Rate + Bits + 5 4 3 2 1 + + + +Groves, et al. Standards Track [Page 140] + +RFC 3525 Gateway Control Protocol June 2003 + + + --------- + 0 0 0 0 0 Rate is + indicated by E-bits specified + in Recommendation I.460 or + may be negotiated in-band + 0 0 0 0 1 0.6 kbit/s + Recommendations V.6 and X.1 + 0 0 0 1 0 1.2 kbit/s + Recommendation V.6 + 0 0 0 1 1 2.4 kbit/s + Recommendations V.6 and X.1 + 0 0 1 0 0 3.6 kbit/s + Recommendation V.6 + 0 0 1 0 1 4.8 kbit/s + Recommendations V.6 and X.1 + 0 0 1 1 0 7.2 kbit/s + Recommendation V.6 + 0 0 1 1 1 8 kbit/s + Recommendation I.460 + 0 1 0 0 0 9.6 kbit/s + Recommendations V.6 and X.1 + 0 1 0 0 1 14.4 kbit/s + Recommendation V.6 + 0 1 0 1 0 16 kbit/s + Recommendation I.460 + 0 1 0 1 1 19.2 kbit/s + Recommendation V.6 + 0 1 1 0 0 32 kbit/s + Recommendation I.460 + 0 1 1 0 1 38.4 kbit/s + Recommendation V.110 + 0 1 1 1 0 48 kbit/s + Recommendations V.6 and X.1 + 0 1 1 1 1 56 kbit/s + Recommendation V.6 + 1 0 0 1 0 57.6 kbit/s + Recommendation V.14 extended + 1 0 0 1 1 28.8 kbit/s + Recommendation V.110 + 1 0 1 0 0 24 kbit/s + Recommendation V.110 + 1 0 1 0 1 0.1345 kbit/s + Recommendation X.1 + 1 0 1 1 0 0.100 kbit/s + Recommendation X.1 + 1 0 1 1 1 0.075/1.2 + kbit/s Recommendations V.6 + and X.1 + + + +Groves, et al. Standards Track [Page 141] + +RFC 3525 Gateway Control Protocol June 2003 + + + 1 1 0 0 0 1.2/0.075 + kbit/s Recommendations V.6 + and X.1 + 1 1 0 0 1 0.050 kbit/s + Recommendations V.6 and X.1 + 1 1 0 1 0 0.075 kbit/s + Recommendations V.6 and X.1 + 1 1 0 1 1 0.110 kbit/s + Recommendations V.6 and X.1 + 1 1 1 0 0 0.150 kbit/s + Recommendations V.6 and X.1 + 1 1 1 0 1 0.200 kbit/s + Recommendations V.6 and X.1 + 1 1 1 1 0 0.300 kbit/s + Recommendations V.6 and X.1 + 1 1 1 1 1 12 kbit/s + Recommendation V.6 + All other values are + reserved. + Ref.: ITU-T Q.931 + INTRATE 900C 2 bits Intermediate Rate + Bits + 2 1 + --- + 0 0 Not used + 0 1 8 kbit/s + 1 0 16 kbit/s + 1 1 32 kbit/s + Ref.: ITU-T Q.931 + + nictx 900D Boolean Network Independent Clock + (NIC) on transmission + 0 Not required to send + data with network independent + clock + 1 Required to send data + with network independent + clock + Ref.: ITU-T Q.931 + + nicrx 900E Boolean Network independent clock + (NIC) on reception + 0 Cannot accept data with + network independent clock + (i.e., sender does not support + this optional procedure) + 1 Can accept data with + network independent clock + + + +Groves, et al. Standards Track [Page 142] + +RFC 3525 Gateway Control Protocol June 2003 + + + (i.e., sender does support + this optional procedure) + Ref.: ITU-T Q.931 + + flowconttx 900F Boolean Flow Control on transmission + (Tx) + 0 Not required to send + data with flow control + mechanism + 1 Required to send data + with flow control mechanism + Ref.: ITU-T Q.931 + + flowcontrx 9010 Boolean Flow control on reception + (Rx) + 0 Cannot accept data with + flow control mechanism (i.e., + sender does not support this + optional procedure) + 1 Can accept data with + flow control mechanism (i.e., + sender does support this + optional procedure) + Ref.: ITU-T Q.931 + + rateadapthdr 9011 Boolean Rate adaption header/no + header + 0 Rate adaption header + not included + 1 Rate adaption header + included + Ref.: ITU-T Q.931 + + multiframe 9012 Boolean Multiple frame establishment + support in data link + 0 Multiple frame + establishment not supported. + Only UI frames allowed + 1 Multiple frame + establishment supported + Ref.: ITU-T Q.931 + + OPMODE 9013 Boolean Mode of operation + 0 Bit transparent mode of + operation + 1 Protocol sensitive mode + of operation + Ref.: ITU-T Q.931 + + + +Groves, et al. Standards Track [Page 143] + +RFC 3525 Gateway Control Protocol June 2003 + + + + llidnegot 9014 Boolean Logical link identifier + negotiation + 0 Default, LLI = 256 only + 1 Full protocol + negotiation + Ref.: ITU-T Q.931 + + assign 9015 Boolean Assignor/assignee + 0 Message originator is + "default assignee" + 1 Message originator is + "assignor only" + Ref.: ITU-T Q.931 + + inbandneg 9016 Boolean In-band/out-band negotiation + 0 Negotiation is done + with USER INFORMATION + messages on a temporary + signalling connection + 1 Negotiation is done in- + band using logical link zero + Ref.: ITU-T Q.931 + + stopbits 9017 2 bits Number of stop bits + Bits + 2 1 + --- + 0 0 Not used + 0 1 1 bit + 1 0 1.5 bits + 1 1 2 bits + Ref.: ITU-T Q.931 + + databits 9018 2 bits Number of data bits excluding + parity bit if present + Bits + 2 1 + --- + 0 0 Not used + 0 1 5 bits + 1 0 7 bits + 1 1 8 bits + Ref.: ITU-T Q.931 + + parity 9019 3 bits Parity information + Bits + 3 2 1 + + + +Groves, et al. Standards Track [Page 144] + +RFC 3525 Gateway Control Protocol June 2003 + + + ------ + 0 0 0 Odd + 0 1 0 Even + 0 1 1 None + 1 0 0 Forced to 0 + 1 0 1 Forced to 1 + All other values are + reserved. + Ref.: ITU-T Q.931 + + duplexmode 901A Boolean Mode duplex + 0 Half duplex + 1 Full duplex + Ref.: ITU-T Q.931 + + modem 901B 6 bits Modem Type + Bits + 6 5 4 3 2 1 + ----------- + 0 0 0 0 0 0 through + 0 0 0 1 0 1 National use + 0 1 0 0 0 1 Rec. V.21 + 0 1 0 0 1 0 Rec. V.22 + 0 1 0 0 1 1 Rec. V.22 bis + 0 1 0 1 0 0 Rec. V.23 + 0 1 0 1 0 1 Rec. V.26 + 0 1 1 0 0 1 Rec. V.26 bis + 0 1 0 1 1 1 Rec. V.26 ter + 0 1 1 0 0 0 Rec. V.27 + 0 1 1 0 0 1 Rec. V.27 bis + 0 1 1 0 1 0 Rec. V.27 ter + 0 1 1 0 1 1 Rec. V.29 + 0 1 1 1 0 1 Rec. V.32 + 0 1 1 1 1 0 Rec. V.34 + 1 0 0 0 0 0 through + 1 0 1 1 1 1 National use + 1 1 0 0 0 0 through + 1 1 1 1 1 1 User specified + Ref.: ITU-T Q.931 + + layer2prot 901C 5 bits User information layer 2 + protocol + Bits + 5 4 3 2 1 + --------- + 0 0 0 1 0 Rec. Q.921/I.441 + 0 0 1 1 0 Rec. X.25, link + layer + + + +Groves, et al. Standards Track [Page 145] + +RFC 3525 Gateway Control Protocol June 2003 + + + 0 1 1 0 0 LAN logical link + control (ISO/IEC 8802 2) + All other values are + reserved. + Ref.: ITU-T Q.931 + + layer3prot 901D 5 bits User information layer 3 + protocol + Bits + 5 4 3 2 1 + --------- + 0 0 0 1 0 ITU-T Q.931 + 0 0 1 1 0 ITU-T X.25, + packet layer + 0 1 0 1 1 ISO/IEC TR 9577 + (Protocol identification in + the network layer) + All other values are + reserved. + Ref.: ITU-T Q.931 + + addlayer3prot 901E Octet Additional User Information + layer 3 protocol + Bits Bits + 4 3 2 1 4 3 2 1 + ------- ------- + 1 1 0 0 1 1 0 0 + Internet Protocol (RFC 791) + (ISO/IEC TR 9577) + 1 1 0 0 1 1 1 1 + Point-to-point Protocol (RFC + 1661) + Ref.: ITU-T Q.931 + + DialledN 901F 30 Dialled Number + octets + + DiallingN 9020 30 Dialling Number + octets + + ECHOCI 9021 Not Used. See H.248.1 E.13 + for an example of possible + Echo Control properties. + + NCI 9022 1 octet Nature of Connection + Indicators + Bits + 2 1 Satellite Indicator + + + +Groves, et al. Standards Track [Page 146] + +RFC 3525 Gateway Control Protocol June 2003 + + + --- + 0 0 no satellite circuit + in the connection + 0 1 one satellite circuit + in the connection + 1 0 two satellite + circuits in the connection + 1 1 spare + + Bits + 4 3 Continuity check + --- indicator + 0 0 continuity check not + required + 0 1 continuity check + required on this circuit + 1 0 continuity check + performed on a previous + circuit + 1 1 spare + + Bit + 5 Echo control device + - indicator + 0 outgoing echo control + device not included + 1 outgoing echo control + device included + + Bits + 8 7 6 Spare + Ref.: ITU-T Q.763 + + USI 9023 Octet User Service Information + string Ref.: ITU-T Q.763 Clause 3.57 + +C.10 AAL5 properties + + PropertyID Property Type Value + tag + + FMSDU A001 32-bit Forward Maximum CPCS-SDU Size: + integer Maximum CPCS-SDU size sent in the + direction from the calling user to + the called user. + Ref.: ITU-T Q.2931 + + + + + +Groves, et al. Standards Track [Page 147] + +RFC 3525 Gateway Control Protocol June 2003 + + + BMSDU A002 32-bit Backwards Maximum CPCS-SDU Size: + integer Maximum CPCS-SDU size sent in the + direction from the called user to + the calling user. + Ref.: ITU-T Q.2931 + + SSCS See table See table See table in C.7 + in C.7 in C.7 Additional values: + VPI/VCI + +C.11 SDP equivalents + + PropertyID Property Type Value + tag + + SDP_V B001 String Protocol Version + Ref.: RFC 2327 + + SDP_O B002 String Owner/creator and session ID + Ref.: RFC 2327 + + SDP_S B003 String Session name + Ref.: RFC 2327 + + SDP_I B004 String Session identifier + Ref.: RFC 2327 + + SDP_U B005 String URI of descriptor + Ref.: RFC 2327 + + SDC_E B006 String email address + Ref.: RFC 2327 + + SDP_P B007 String phone number + Ref.: RFC 2327 + + SDP_C B008 String Connection information + Ref.: RFC 2327 + + SDP_B B009 String Bandwidth Information + Ref.: RFC 2327 + + SDP_Z B00A String Time zone adjustment + Ref.: RFC 2327 + + SDP_K B00B String Encryption Key + Ref.: RFC 2327 + + + + +Groves, et al. Standards Track [Page 148] + +RFC 3525 Gateway Control Protocol June 2003 + + + SDP_A B00C String Zero or more session attributes + Ref.: RFC 2327 + + SDP_T B00D String Active Session Time + Ref.: RFC 2327 + + SDP_R B00E String Zero or more repeat times + Reference: RFC 2327 + + SDP_M B00F String Media type, port, transport and format + Ref.: RFC 2327 + +C.12 H.245 + + PropertyID Property Type Value + tag + + OLC C001 Octet The value of H.245 + OpenLogicalChannel structure. + string Ref.: ITU-T H.245 + + OLCack C002 Octet The value of H.245 + string OpenLogicalChannelAck structure. + Ref.: ITU-T H.245 + + OLCcnf C003 Octet The value of H.245 + string OpenLogicalChannelConfirm structure. + Ref.: ITU-T H.245 + + OLCrej C004 Octet The value of H.245 + string OpenLogicalChannelReject structure. + Ref.: ITU-T H.245 + + CLC C005 Octet The value of H.245 + string CloseLogicalChannel structure. + Ref.: ITU-T H.245 + + CLCack C006 Octet The value of H.245 + string CloseLogicalChannelAck structure. + Ref.: ITU-T H.245 + + + + + + + + + + + +Groves, et al. Standards Track [Page 149] + +RFC 3525 Gateway Control Protocol June 2003 + + +ANNEX D - Transport over IP + +D.1 Transport over IP/UDP using Application Level Framing (ALF) + + Protocol messages defined in this RFC may be transmitted over UDP. + When no port is provided by the peer (see 7.2.8), commands should be + sent to the default port number: 2944 for text-encoded operation, or + 2945 for binary-encoded operation. Responses must be sent to the + address and port from which the corresponding commands were sent. + + ALF is a set of techniques that allows an application, as opposed to + a stack, to affect how messages are sent to the other side. A + typical ALF technique is to allow an application to change the order + of messages sent when there is a queue after it has queued them. + There is no formal specification for ALF. The procedures in Annex + D.1 contain a minimum suggested set of ALF behaviours + + Implementors using IP/UDP with ALF should be aware of the + restrictions of the MTU on the maximum message size. + +D.1.1 Providing At-Most-Once functionality + + Messages, being carried over UDP, may be subject to losses. In the + absence of a timely response, commands are repeated. Most commands + are not idempotent. The state of the MG would become unpredictable + if, for example, Add commands were executed several times. The + transmission procedures shall thus provide an "At-Most-Once" + functionality. + + Peer protocol entities are expected to keep in memory a list of the + responses that they sent to recent transactions and a list of the + transactions that are currently outstanding. The transaction + identifier of each incoming message is compared to the transaction + identifiers of the recent responses sent to the same MId. If a match + is found, the entity does not execute the transaction, but simply + repeats the response. If no match is found, the message will be + compared to the list of currently outstanding transactions. If a + match is found in that list, indicating a duplicate transaction, the + entity does not execute the transaction (see D.1.4 for procedures on + sending TransactionPending). + + The procedure uses a long timer value, noted LONG-TIMER in the + following. The timer should be set larger than the maximum duration + of a transaction, which should take into account the maximum number + + + + + + + +Groves, et al. Standards Track [Page 150] + +RFC 3525 Gateway Control Protocol June 2003 + + + of repetitions, the maximum value of the repetition timer and the + maximum propagation delay of a packet in the network. A suggested + value is 30 seconds. + + The copy of the responses may be destroyed either LONG-TIMER seconds + after the response is issued, or when the entity receives a + confirmation that the response has been received, through the + "Response Acknowledgement parameter". For transactions that are + acknowledged through this parameter, the entity shall keep a copy of + the transaction-id for LONG-TIMER seconds after the response is + issued, in order to detect and ignore duplicate copies of the + transaction request that could be produced by the network. + +D.1.2 Transaction identifiers and three-way handshake + +D.1.2.1 Transaction identifiers + + Transaction identifiers are 32-bit integer numbers. A Media Gateway + Controller may decide to use a specific number space for each of the + MGs that they manage, or to use the same number space for all MGs + that belong to some arbitrary group. MGCs may decide to share the + load of managing a large MG between several independent processes. + These processes will share the same transaction number space. There + are multiple possible implementations of this sharing, such as having + a centralized allocation of transaction identifiers, or + pre-allocating non-overlapping ranges of identifiers to different + processes. The implementations shall guarantee that unique + transaction identifiers are allocated to all transactions that + originate from a logical MGC (identical mId). MGs can simply detect + duplicate transactions by looking at the transaction identifier and + mId only. + +D.1.2.2 Three-way handshake + + The TransactionResponse Acknowledgement parameter can be found in any + message. It carries a set of "confirmed transaction-id ranges". + Entities may choose to delete the copies of the responses to + transactions whose id is included in "confirmed transaction-id + ranges" received in the transaction response messages. They should + silently discard further commands when the transaction-id falls + within these ranges. + + The "confirmed transaction-id ranges" values shall not be used if + more than LONG-TIMER seconds have elapsed since the MG issued its + last response to that MGC, or when a MG resumes operation. In this + situation, transactions should be accepted and processed, without any + test on the transaction-id. + + + + +Groves, et al. Standards Track [Page 151] + +RFC 3525 Gateway Control Protocol June 2003 + + + Messages that carry the "Transaction Response Acknowledgement" + parameter may be transmitted in any order. The entity shall retain + the "confirmed transaction-id ranges" received for LONG-TIMER + seconds. + + In the binary encoding, if only the firstAck is present in a response + acknowledgement (see A.2), only one transaction is acknowledged. If + both firstAck and lastAck are present, then the range of transactions + from firstAck to lastAck is acknowledged. In the text encoding, a + horizontal dash is used to indicate a range of transactions being + acknowledged (see B.2). + +D.1.3 Computing retransmission timers + + It is the responsibility of the requesting entity to provide suitable + timeouts for all outstanding transactions, and to retry transactions + when timeouts have been exceeded. Furthermore, when repeated + transactions fail to be acknowledged, it is the responsibility of the + requesting entity to seek redundant services and/or clear existing or + pending connections. + + The specification purposely avoids specifying any value for the + retransmission timers. These values are typically network dependent. + The retransmission timers should normally estimate the timer value by + measuring the time spent between the sending of a command and the + return of a response. Implementations SHALL ensure that the + algorithm used to calculate retransmission timing performs an + exponentially increasing backoff of the retransmission timeout for + each retransmission or repetition after the first one. + + NOTE - One possibility is to use the algorithm implemented in + TCP-IP, which uses two variables: + + - The average acknowledgement delay (AAD), estimated through an + exponentially smoothed average of the observed delays. + + - The average deviation (ADEV), estimated through an exponentially + smoothed average of the absolute value of the difference between + the observed delay and the current average. The retransmission + timer, in TCP, is set to the sum of the average delay plus N times + the average deviation. The maximum value of the timer should + however be bounded for the protocol defined in this + RFC, in order to guarantee that no repeated packet + would be received by the gateways after LONG-TIMER seconds. A + suggested maximum value is 4 seconds. + + + + + + +Groves, et al. Standards Track [Page 152] + +RFC 3525 Gateway Control Protocol June 2003 + + + After any retransmission, the entity SHOULD do the following: + + - It should double the estimated value of the average delay, AAD. + + - It should compute a random value, uniformly distributed between + 0.5 AAD and AAD. + + - It should set the retransmission timer to the sum of that random + value and N times the average deviation. + + This procedure has two effects. Because it includes an exponentially + increasing component, it will automatically slow down the stream of + messages in case of congestion. Because it includes a random + component, it will break the potential synchronization between + notifications triggered by the same external event. + +D.1.4 Provisional responses + + Executing some transactions may require a long time. Long execution + times may interact with the timer-based retransmission procedure. + This may result either in an inordinate number of retransmissions, or + in timer values that become too long to be efficient. Entities that + can predict that a transaction will require a long execution time may + send a provisional response, "Transaction Pending". They SHOULD send + this response if they receive a repetition of a transaction that is + still being executed. + + Entities that receive a Transaction Pending shall switch to a + different repetition timer for repeating requests. The root + Termination has a property (ProvisionalResponseTimerValue), which can + be set to the requested maximum number of milliseconds between + receipt of a command and transmission of the TransactionPending + response. Upon receipt of a final response following receipt of + provisional responses, an immediate confirmation shall be sent, and + normal repetition timers shall be used thereafter. An entity that + sends a provisional response, SHALL include the immAckRequired field + in the ensuing final response, indicating that an immediate + confirmation is expected. Receipt of a Transaction Pending after + receipt of a reply shall be ignored. + +D.1.5 Repeating Requests, Responses and Acknowledgements + + The protocol is organized as a set of transactions, each of which is + composed of a request and a response, commonly referred to as an + acknowledgement. The protocol messages, being carried over UDP, may + be subject to losses. In the absence of a timely response, + transactions are repeated. Entities are expected to keep in memory a + + + + +Groves, et al. Standards Track [Page 153] + +RFC 3525 Gateway Control Protocol June 2003 + + + list of the responses that they sent to recent transactions, i.e., a + list of all the responses they sent over the last LONG-TIMER seconds, + and a list of the transactions that are currently being executed. + + The repetition mechanism is used to guard against three types of + possible errors: + + - transmission errors, when for example a packet is lost due to + noise on a line or congestion in a queue; + + - component failure, when for example an interface to a entity + becomes unavailable; + + - entity failure, when for example an entire entity becomes + unavailable. + + The entities should be able to derive from the past history an + estimate of the packet loss rate due to transmission errors. In a + properly configured system, this loss rate should be kept very low, + typically less than 1%. If a Media Gateway Controller or a Media + Gateway has to repeat a message more than a few times, it is very + legitimate to assume that something else than a transmission error is + occurring. For example, given a loss rate of 1%, the probability + that five consecutive transmission attempts fail is 1 in 100 billion, + an event that should occur less than once every 10 days for a Media + Gateway Controller that processes 1000 transactions per second. + (Indeed, the number of repetition that is considered excessive should + be a function of the prevailing packet loss rate.) We should note + that the "suspicion threshold", which we will call "Max1", is + normally lower than the "disconnection threshold", which should be + set to a larger value. + + A classic retransmission algorithm would simply count the number of + successive repetitions, and conclude that the association is broken + after retransmitting the packet an excessive number of times + (typically between 7 and 11 times.) In order to account for the + possibility of an undetected or in progress "failover", we modify + the classic algorithm so that if the Media Gateway receives a valid + ServiceChange message announcing a failover, it will start + transmitting outstanding commands to that new MGC. Responses to + commands are still transmitted to the source address of the command. + + In order to automatically adapt to network load, this RFC specifies + exponentially increasing timers. If the initial timer is set to 200 + milliseconds, the loss of a fifth retransmission will be detected + after about 6 seconds. This is probably an acceptable waiting delay + to detect a failover. The repetitions should continue after that + delay not only in order to perhaps overcome a transient connectivity + + + +Groves, et al. Standards Track [Page 154] + +RFC 3525 Gateway Control Protocol June 2003 + + + problem, but also in order to allow some more time for the execution + of a failover (waiting a total delay of 30 seconds is probably + acceptable). + + It is, however, important that the maximum delay of retransmissions + be bounded. Prior to any retransmission, it is checked that the time + elapsed since the sending of the initial datagram is no greater than + T-MAX. If more than T-MAX time has elapsed, the MG concludes that + the MGC has failed, and it begins its recovery process as described + in section 11.5. If the MG retries to connect to the current MGC it + shall use a ServiceChange with ServiceChangeMethod set to + Disconnected so that the new MGC will be aware that the MG lost one + or more transactions. The value T-MAX is related to the LONG-TIMER + value: the LONG-TIMER value is obtained by adding to T MAX the + maximum propagation delay in the network. + +D.2 Using TCP + + Protocol messages as defined in this RFC may be transmitted over TCP. + When no port is specified by the other side (see 7.2.8), the commands + should be sent to the default port. The defined protocol has + messages as the unit of transfer, while TCP is a stream-oriented + protocol. TPKT, according to RFC 1006, SHALL be used to delineate + messages within the TCP stream. + + In a transaction-oriented protocol, there are still ways for + transaction requests or responses to be lost. As such, it is + recommended that entities using TCP transport implement application + level timers for each request and each response, similar to those + specified for application level framing over UDP. + +D.2.1 Providing the At-Most-Once functionality + + Messages, being carried over TCP, are not subject to transport + losses, but loss of a transaction request or its reply may + nonetheless be noted in real implementations. In the absence of a + timely response, commands are repeated. Most commands are not + idempotent. The state of the MG would become unpredictable if, for + example, Add commands were executed several times. + + To guard against such losses, it is recommended that entities follow + the procedures in D.1.1. + +D.2.2 Transaction identifiers and three-way handshake + + For the same reasons, it is possible that transaction replies may be + lost even with a reliable delivery protocol such as TCP. It is + recommended that entities follow the procedures in D.1.2.2. + + + +Groves, et al. Standards Track [Page 155] + +RFC 3525 Gateway Control Protocol June 2003 + + +D.2.3 Computing retransmission timers + + With reliable delivery, the incidence of loss of a transaction + request or reply is expected to be very low. Therefore, only simple + timer mechanisms are required. Exponential back-off algorithms + should not be necessary, although they could be employed where, as in + an MGC, the code to do so is already required, since MGCs must + implement ALF/UDP as well as TCP. + +D.2.4 Provisional responses + + As with UDP, executing some transactions may require a long time. + Entities that can predict that a transaction will require a long + execution time may send a provisional response, "Transaction + Pending". They should send this response if they receive a + repetition of a transaction that is still being executed. + + Entities that receive a Transaction Pending shall switch to a longer + repetition timer for that transaction. + + Entities shall retain Transactions and replies until they are + confirmed. The basic procedure of D.1.4 should be followed, but + simple timer values should be sufficient. There is no need to send + an immediate confirmation upon receipt of a final response. + +D.2.5 Ordering of commands + + TCP provides ordered delivery of transactions. No special procedures + are required. It should be noted that ALF/UDP allows sending entity + to modify its behaviour under congestion, and in particular, could + reorder transactions when congestion is encountered. TCP could not + achieve the same results. + + + + + + + + + + + + + + + + + + + +Groves, et al. Standards Track [Page 156] + +RFC 3525 Gateway Control Protocol June 2003 + + +ANNEX E - Basic packages + + This annex contains definitions of some packages for use with + Recommendation H.248.1. + +E.1 Generic + + PackageID: g (0x0001) + Version: 1 + Extends: None + + Description: + Generic package for commonly encountered items. + +E.1.1 Properties + + None. + +E.1.2 Events + + Cause + + EventID: cause (0x0001) + Generic error event + + EventsDescriptor parameters: None + + ObservedEvents Descriptor Parameters: + + General Cause + ParameterID: Generalcause (0x0001) + + This parameter groups the failures into six groups, which + the MGC may act upon. + + Type: enumeration + + Possible values: + "NR" Normal Release (0x0001) + "UR" Unavailable Resources (0x0002) + "FT" Failure, Temporary (0x0003) + "FP" Failure, Permanent (0x0004) + "IW" Interworking Error (0x0005) + "UN" Unsupported (0x0006) + + Failure Cause + ParameterID: Failurecause (0x0002) + + + + +Groves, et al. Standards Track [Page 157] + +RFC 3525 Gateway Control Protocol June 2003 + + + Possible values: OCTET STRING + + Description: The Failure Cause is the value generated by the + Released equipment, i.e., a released network connection. + The concerned value is defined in the appropriate bearer + control protocol. + + Signal Completion + + EventID: sc (0x0002) + + Indicates the termination of a signal for which the + notifyCompletion parameter was set to enable reporting of a + completion event. For further procedural description, see 7.1.1, + 7.1.17 and 7.2.7. + + EventsDescriptor parameters: None + + ObservedEvents Descriptor parameters: + + Signal Identity + ParameterID: SigID (0x0001) + + This parameter identifies the signal which has terminated. + For a signal that is contained in a signal list, the signal + list identity parameter should also be returned indicating + the appropriate list. + + Type: Binary: octet (string), Text: string + + Possible values: a signal which has terminated. A signal + shall be identified using the pkgdName syntax without + wildcarding. + + Termination Method + ParameterID: Meth (0x0002) + + Indicates the means by which the signal terminated. + + Type: enumeration + + Possible values: + "TO" (0x0001) Signal timed out or otherwise completed on + its own + "EV" (0x0002) Interrupted by event + "SD" (0x0003) Halted by new Signals descriptor + "NC" (0x0004) Not completed, other cause + + + + +Groves, et al. Standards Track [Page 158] + +RFC 3525 Gateway Control Protocol June 2003 + + + Signal List ID + ParameterID: SLID (0x0003) + + Indicates to which signal list a signal belongs. The + SignalList ID is only returned in cases where the signal + resides in a signal list. + + Type: integer + + Possible values: any integer + +E.1.3 Signals + + None. + +E.1.4 Statistics + + None. + +E.2 Base Root Package + + PackageID: root (0x0002) + Version: 1 + Extends: None + + Description: + This package defines Gateway wide properties. + +E.2.1 Properties + + MaxNrOfContexts + PropertyID: maxNumberOfContexts (0x0001) + + The value of this property gives the maximum number of contexts + that can exist at any time. The NULL context is not included in + this number. + + Type: double + + Possible values: 1 and up + + Defined in: TerminationState + + Characteristics: read only + + MaxTerminationsPerContext + PropertyID: maxTerminationsPerContext (0x0002) + + + + +Groves, et al. Standards Track [Page 159] + +RFC 3525 Gateway Control Protocol June 2003 + + + The maximum number of allowed terminations in a context, see 6.1 + + Type: integer + + Possible values: any integer + + Defined in: TerminationState + + Characteristics: read only + + normalMGExecutionTime + PropertyId: normalMGExecutionTime (0x0003) + + Settable by the MGC to indicate the interval within which the MGC + expects a response to any transaction from the MG (exclusive of + network delay) + + Type: integer + + Possible values: any integer, represents milliseconds + + Defined in: TerminationState + + Characteristics: read / write + + normalMGCExecutionTime + PropertyId: normalMGCExecutionTime (0x0004) + + Settable by the MGC to indicate the interval within which the MG + should expects a response to any transaction from the MGC + (exclusive of network delay) + + Type: integer + + Possible values: any integer, represents milliseconds + + Defined in: TerminationState + + Characteristics: read / write + + MGProvisionalResponseTimerValue + PropertyId: MGProvisionalResponseTimerValue (0x0005) + + Indicates the time within which the MGC should expect a Pending + Response from the MG if a Transaction cannot be completed. + + Initially set to normalMGExecutionTime plus network delay, but may + be lowered. + + + +Groves, et al. Standards Track [Page 160] + +RFC 3525 Gateway Control Protocol June 2003 + + + Type: Integer + + Possible Values: any integer, represents milliseconds + + Defined in: TerminationState + + Characteristics: read / write + + MGCProvisionalResponseTimerValue + PropertyId: MGCProvisionalResponseTimerValue (0x0006) + + Indicates the time within which the MG should expect a Pending + Response from the MGC if a Transaction cannot be completed. + Initially set to normalMGCExecutionTime plus network delay, but + may be lowered. + + Type: Integer + + Possible Values: any integer, represents milliseconds + + Defined in: TerminationState + + Characteristics: read / write + +E.2.2 Events + + None. + +E.2.3 Signals + + None. + +E.2.4 Statistics + + None. + +E.2.5 Procedures + + None. + +E.3 Tone Generator Package + + PackageID: tonegen (0x0003) + Version: 1 + Extends: None + + + + + + +Groves, et al. Standards Track [Page 161] + +RFC 3525 Gateway Control Protocol June 2003 + + + Description: + + This package defines signals to generate audio tones. This + package does not specify parameter values. It is intended to be + extendable. Generally, tones are defined as an individual signal + with a parameter, ind, representing "interdigit" time delay, and a + tone id to be used with playtones. A tone id should be kept + consistent with any tone generation for the same tone. MGs are + expected to be provisioned with the characteristics of appropriate + tones for the country in which the MG is located. + + Designed to be extended only. + +E.3.1 Properties + + None. + +E.3.2 Events + + None. + +E.3.3 Signals + + Play tone + SignalID: pt (0x0001) + + Plays audio tone over an audio channel + + Signal Type: Brief + + Duration: Provisioned + + Additional parameters: + + Tone id list + ParameterID: tl (0x0001) + + Type: list of tone ids + + List of tones to be played in sequence. The list SHALL + contain one or more tone ids. + + Inter signal duration + ParameterID: ind (0x0002) + + Type: integer + + Timeout between two consecutive tones in milliseconds + + + +Groves, et al. Standards Track [Page 162] + +RFC 3525 Gateway Control Protocol June 2003 + + + + No tone ids are specified in this package. Packages that extend this + package can add possible values for tone id as well as adding + individual tone signals. + +E.3.4 Statistics + + None. + +E.3.5 Procedures + + None. + +E.4 Tone Detection Package + + PackageID: tonedet (0x0004) + Version: 1 + Extends: None + + This Package defines events for audio tone detection. Tones are + selected by name (tone id). MGs are expected to be provisioned with + the characteristics of appropriate tones for the country in which the + MG is located. + + Designed to be extended only: + This package does not specify parameter values. It is intended to + be extendable. + +E.4.1 Properties + + None. + +E.4.2 Events + + Start tone detected + EventID: std, 0x0001 + + Detects the start of a tone. The characteristics of positive tone + detection are implementation dependent. + + EventsDescriptor parameters: + + Tone id list + ParameterID: tl (0x0001) + + Type: list of tone ids + + + + + +Groves, et al. Standards Track [Page 163] + +RFC 3525 Gateway Control Protocol June 2003 + + + Possible values: The only tone id defined in this package is + "wild card" which is "*" in text encoding and 0x0000 in + binary. Extensions to this package would add possible + values for tone id. If tl is "wild card", any tone id is + detected. + + ObservedEventsDescriptor parameters: + + Tone id + ParameterID: tid (0x0003) + + Type: enumeration + + Possible values: "wildcard" as defined above is the only + value defined in this package. Extensions to this package + would add additional possible values for tone id. + + End tone detected + EventID: etd, 0x0002 + + Detects the end of a tone. + + EventDescriptor parameters: + + Tone id list + ParameterID: tl (0x0001) + + Type: enumeration or list of enumerated types + + Possible values: No possible values are specified in this + package. Extensions to this package would add possible + values for tone id. + + ObservedEventsDescriptor parameters: + + Tone id + ParameterID: tid (0x0003) + + Type: enumeration + + Possible values: "wildcard" as defined above is the only + value defined in this package. Extensions to this + package would add possible values for tone id. + + Duration + ParameterId: dur (0x0002) + + Type: integer, in milliseconds + + + +Groves, et al. Standards Track [Page 164] + +RFC 3525 Gateway Control Protocol June 2003 + + + + This parameter contains the duration of the tone from + first detection until it stopped. + + Long tone detected + EventID: ltd, 0x0003 + + Detects that a tone has been playing for at least a certain amount + of time. + + EventDescriptor parameters: + + Tone id list + ParameterID: tl (0x0001) + + Type: enumeration or list + + Possible values: "wildcard" as defined above is the only + value defined in this package. Extensions to this package + would add possible values for tone id. + + Duration + ParameterID: dur (0x0002) + + Type: integer, duration to test against + + Possible values: any legal integer, expressed in + milliseconds + + ObservedEventsDescriptor parameters: + + Tone id + ParameterID: tid (0x0003) + + Type: Enumeration + + Possible values: No possible values are specified in this + package. Extensions to this package would add possible + values for tone id. + +E.4.3 Signals + + None. + +E.4.4 Statistics + + None. + + + + +Groves, et al. Standards Track [Page 165] + +RFC 3525 Gateway Control Protocol June 2003 + + +E.4.5 Procedures + + None. + +E.5 Basic DTMF Generator Package + + PackageID: dg (0x0005) + Version: 1 + Extends: tonegen version 1 + + This package defines the basic DTMF tones as signals and extends the + allowed values of parameter tl of playtone in tonegen. + +E.5.1 Properties + + None. + +E.5.2 Events + + None. + +E.5.3 Signals + + DTMF character 0 + SignalID: d0 (0x0010) + + Generate DTMF 0 tone. The physical characteristic of DTMF 0 is + defined in the gateway. + + Signal Type: Brief + + Duration: Provisioned + + Additional parameters: + + None. + + Additional values: + + d0 (0x0010) is defined as a tone id for playtone + + The other DTMF characters are specified in exactly the same way. A + table with all signal names and signal IDs is included. Note that + each DTMF character is defined as both a signal and a tone id, thus + extending the basic tone generation package. Also note that DTMF + SignalIds are different from the names used in a digit map. + + + + + +Groves, et al. Standards Track [Page 166] + +RFC 3525 Gateway Control Protocol June 2003 + + + Signal name Signal ID/Tone id + + DTMF character 0 d0 (0x0010) + DTMF character 1 d1 (0x0011) + DTMF character 2 d2 (0x0012) + DTMF character 3 d3 (0x0013) + DTMF character 4 d4 (0x0014) + DTMF character 5 d5 (0x0015) + DTMF character 6 d6 (0x0016) + DTMF character 7 d7 (0x0017) + DTMF character 8 d8 (0x0018) + DTMF character 9 d9 (0x0019) + DTMF character * ds (0x0020) + DTMF character # do (0x0021) + DTMF character A da (0x001a) + DTMF character B db (0x001b) + DTMF character C dc (0x001c) + DTMF character D dd (0x001d) + +E.5.4 Statistics + + None. + +E.5.5 Procedures + + None. + +E.6 DTMF detection Package + + PackageID: dd (0x0006) + Version: 1 + Extends: tonedet version 1 + + This package defines the basic DTMF tones detection. This Package + extends the possible values of tone id in the "start tone detected" + "end tone detected" and "long tone detected" events. + + Additional tone id values are all tone ids described in package dg + (basic DTMF generator package). + + The following table maps DTMF events to digit map symbols as + described in 7.1.14. + + DTMF Event Symbol + + d0 "0" + d1 "1" + d2 "2" + + + +Groves, et al. Standards Track [Page 167] + +RFC 3525 Gateway Control Protocol June 2003 + + + d3 "3" + d4 "4" + d5 "5" + d6 "6" + d7 "7" + d8 "8" + d9 "9" + da "A" or "a" + db "B" or "b" + dc "C" or "c" + dd "D" or "d" + ds "E" or "e" + do "F" or "f" + +E.6.1 Properties + + None. + +E.6.2 Events + + DTMF digits + + EventIds are defined with the same names as the SignalIds defined + in the table found in E.5.3. + + DigitMap Completion Event + EventID: ce, 0x0004 + + Generated when a digit map completes as described in 7.1.14. + + EventsDescriptor parameters: None. + + ObservedEventsDescriptor parameters: + + DigitString + ParameterID: ds (0x0001) + + Type: string of digit map symbols (possibly empty) returned + as a quotedString + + Possible values: a sequence of the characters "0" through + "9", "A" through "F", and the long duration modifier "Z". + + Description: the portion of the current dial string as + described in 7.1.14 which matched part or all of an + alternative event sequence specified in the digit map. + + + + + +Groves, et al. Standards Track [Page 168] + +RFC 3525 Gateway Control Protocol June 2003 + + + Termination Method + ParameterID: Meth (0x0003) + + Type: enumeration + + Possible values: + + "UM" (0x0001) Unambiguous match + + "PM" (0x0002) Partial match, completion by timer expiry + or unmatched event + + "FM" (0x0003) Full match, completion by timer expiry or + unmatched event + + Description: indicates the reason for generation of the + event. See the procedures in 7.1.14. + +E.6.3 Signals + + None. + +E.6.4 Statistics + + None. + +E.6.5 Procedures + + Digit map processing is activated only if an events descriptor is + activated that contains a digit map completion event as defined in + Section E.6.2 and that digit map completion event contains an eventDM + field in the requested actions as defined in Section 7.1.9. Other + parameters such as KeepActive or embedded events of signals + descriptors may also be present in the events descriptor and do not + affect the activation of digit map processing. + +E.7 Call Progress Tones Generator Package + + PackageID: cg, 0x0007 + Version: 1 + Extends: tonegen version 1 + + This package defines the basic call progress tones as signals and + extends the allowed values of the tl parameter of playtone in + tonegen. + + + + + + +Groves, et al. Standards Track [Page 169] + +RFC 3525 Gateway Control Protocol June 2003 + + +E.7.1 Properties + + None. + +E.7.2 Events + + None. + +E.7.3 Signals + + Dial Tone + SignalID: dt (0x0030) + + Generate dial tone. The physical characteristic of dial tone is + available in the gateway. + + Signal Type: TimeOut + + Duration: Provisioned + + Additional parameters: + + None. + + Additional values: + + dt (0x0030) is defined as a tone id for playtone + + The other tones of this package are defined in exactly the same way. + A table with all signal names and signal IDs is included. Note that + each tone is defined as both a signal and a tone id, thus extending + the basic tone generation package. + + Signal Name Signal ID/tone id + + Dial Tone dt (0x0030) + Ringing Tone rt (0x0031) + Busy Tone bt (0x0032) + Congestion Tone ct (0x0033) + Special Information Tone sit(0x0034) + Warning Tone wt (0x0035) + Payphone Recognition Tone prt (0x0036) + Call Waiting Tone cw (0x0037) + Caller Waiting Tone cr (0x0038) + +E.7.4 Statistics + + None. + + + +Groves, et al. Standards Track [Page 170] + +RFC 3525 Gateway Control Protocol June 2003 + + +E.7.5 Procedures + + NOTE - The required set of tone ids corresponds to those defined + in Recommendation E.180/Q.35. See Recommendation E.180/Q.35 for + definition of the meanings of these tones. + + +E.8 Call Progress Tones Detection Package + + PackageID: cd (0x0008) + Version: 1 + Extends: tonedet version 1 + + This package defines the basic call progress detection tones. This + package extends the possible values of tone id in the "start tone + detected", "end tone detected" and "long tone detected" events. + + Additional values + + toneID values are defined for start tone detected, end tone + detected and long tone detected with the same values as those in + package cg (call progress tones generation package). + + The required set of tone ids corresponds to Recommendation + E.180/Q.35. See Recommendation E.180/Q.35 for definition of the + meanings of these tones. + +E.8.1 Properties + + None. + +E.8.2 Events + + Events are defined as in the call progress tones generator package + (cg) for the tones listed in the table of E.7.3. + +E.8.3 Signals + + None. + +E.8.4 Statistics + + None. + +E.8.5 Procedures + + None. + + + + +Groves, et al. Standards Track [Page 171] + +RFC 3525 Gateway Control Protocol June 2003 + + +E.9 Analog Line Supervision Package + + PackageID: al, 0x0009 + Version: 1 + Extends: None + + This package defines events and signals for an analog line. + + E.9.1 Properties + + None. + +E.9.2 Events + + onhook + EventID: on (0x0004) + + Detects handset going on hook. Whenever an events descriptor is + activated that requests monitoring for an on-hook event and the + line is already on-hook, then the MG shall behave according to the + setting of the "strict" parameter. + + EventDescriptor parameters: + + Strict Transition + ParameterID: strict (0x0001) + + Type: enumeration + + Possible values: "exact" (0x00), "state" (0x01), "failWrong" + (0x02) + + "exact" means that only an actual hook state transition to + on-hook is to be recognized; + + "state" means that the event is to be recognized either if + the hook state transition is detected or if the hook state + is already on-hook; + + "failWrong" means that if the hook state is already + on-hook, the command fails and an error is reported. + + ObservedEventsDescriptor parameters: + + Initial State + ParameterID: init (0x0002) + + Type: Boolean + + + +Groves, et al. Standards Track [Page 172] + +RFC 3525 Gateway Control Protocol June 2003 + + + Possible values: + + "True" means that the event was reported because the line + was already on-hook when the events descriptor containing + this event was activated; + + "False" means that the event represents an actual state + transition to on-hook. + + offhook + EventID: of (0x0005) + + Detects handset going off hook. Whenever an events descriptor is + activated that requests monitoring for an off-hook event and the + line is already off-hook, then the MG shall behave according to + the setting of the "strict" parameter. + + EventDescriptor parameters: + + Strict Transition + ParameterID: strict (0x0001) + + Type: enumeration + + Possible values: "exact" (0x00), "state" (0x01), "failWrong" + (0x02) + + "exact" means that only an actual hook state transition + to off-hook is to be recognized; + + "state" means that the event is to be recognized either + if the hook state transition is detected or if the hook + state is already off-hook; + + "failWrong" means that if the hook state is already off- + hook, the command fails and an error is reported. + + ObservedEventsDescriptor parameters + + Initial State + ParameterID: init (0x0002) + + Type: Boolean + + + + + + + + +Groves, et al. Standards Track [Page 173] + +RFC 3525 Gateway Control Protocol June 2003 + + + Possible values: + + "True" means that the event was reported because the line + was already off-hook when the events descriptor + containing this event was activated; + + "False" means that the event represents an actual state + transition to off-hook. + + flashhook + EventID: fl, 0x0006 + + Detects handset flash. A flash occurs when an onhook is followed + by an offhook between a minimum and maximum duration. + + EventDescriptor parameters: + + Minimum duration + ParameterID: mindur (0x0004) + + Type: integer in milliseconds + + Default value is provisioned. + + Maximum duration + ParameterID: maxdur (0x0005) + + Type: integer in milliseconds + + Default value is provisioned. + + ObservedEventsDescriptor parameters: + + None + +E.9.3 Signals + + ring + SignalID: ri, 0x0002 + + Applies ringing on the line + + Signal Type: TimeOut + + Duration: Provisioned + + + + + + +Groves, et al. Standards Track [Page 174] + +RFC 3525 Gateway Control Protocol June 2003 + + + Additional parameters: + + Cadence + ParameterID: cad (0x0006) + + Type: list of integers representing durations of alternating + on and off segments, constituting a complete ringing cycle + starting with an on. Units in milliseconds + + Default is fixed or provisioned. Restricted function MGs + may ignore cadence values they are incapable of generating. + + Frequency + ParameterID: freq (0x0007) + + Type: integer in Hz + + Default is fixed or provisioned. Restricted function MGs + may ignore frequency values they are incapable of + generating. + +E.9.4 Statistics + + None. + +E.9.5 Procedures + + If the MGC sets an EventsDescriptor containing a hook state + transition event (on-hook or off-hook) with the "strict" (0x0001) + parameter set to "failWrong", and the hook state is already what the + transition implies, the execution of the command containing that + EventsDescriptor fails. The MG SHALL include error code 540 + "Unexpected initial hook state" in its reponse. + +E.9.6 Error code + + This package defines a new error code: + + 540 - Unexpected initial hook state + + The procedure for use of this code is given in E.9.5. + +E.10 Basic Continuity Package + + PackageID: ct (0x000a) + Version: 1 + Extends: None + + + + +Groves, et al. Standards Track [Page 175] + +RFC 3525 Gateway Control Protocol June 2003 + + + This package defines events and signals for continuity test. The + continuity test includes provision of either a loopback or + transceiver functionality. + +E.10.1 Properties + + None. + +E.10.2 Events + + Completion + EventID: cmp, 0x0005 + + This event detects test completion of continuity test. + + EventDescriptor parameters + + None. + + ObservedEventsDescriptor parameters + + Result + ParameterID: res (0x0008) + + Type: enumeration + + Possible values: success (0x0001), failure (0x0000) + +E.10.3 Signals + + Continuity test + SignalID: ct (0x0003) + + Initiates sending of continuity test tone on the termination to + which it is applied. + + Signal Type: TimeOut + + Default value is provisioned + + Additional parameters: + + None. + + Respond + SignalID: rsp (0x0004) + + + + + +Groves, et al. Standards Track [Page 176] + +RFC 3525 Gateway Control Protocol June 2003 + + + The signal is used to respond to a continuity test. See E.10.5 + for further explanation. + + Signal Type: On/Off + + Default duration is provisioned + + Additional parameters: + + None. + +E.10.4 Statistics + + None. + +E.10.5 Procedures + + When a MGC wants to initiate a continuity test, it sends a command to + the MG containing: + + - a signals descriptor with the ct signal; and + + - an events descriptor containing the cmp event. + + Upon reception of a command containing the ct signal and cmp event, + the MG initiates the continuity test tone for the specified + Termination. If the return tone is detected and any other required + conditions are satisfied before the signal times out, the cmp event + shall be generated with the value of the result parameter equal to + success. In all other cases, the cmp event shall be generated with + the value of the result parameter equal to failure. + + When a MGC wants the MG to respond to a continuity test, it sends a + command to the MG containing a signals descriptor with the rsp + signal. Upon reception of a command with the rsp signal, the MG + either applies a loopback or (for 2-wire circuits) awaits reception + of a continuity test tone. In the loopback case, any incoming + information shall be reflected back as outgoing information. In the + 2-wire case, any time the appropriate test tone is received, the + appropriate response tone should be sent. The MGC determines when to + remove the rsp signal. + + When a continuity test is performed on a Termination, no echo devices + or codecs shall be active on that Termination. + + Performing voice path assurance as part of continuity testing is + provisioned by bilateral agreement between network operators. + + + + +Groves, et al. Standards Track [Page 177] + +RFC 3525 Gateway Control Protocol June 2003 + + + (Informative Note) Example tones and test procedure details are + given in Q.724 sections 7 and 8, Q.764 section 2.1.8 and Q.1902.4. + +E.11 Network Package + + PackageID: nt (0x000b) + Version: 1 + Extends: None + + This package defines properties of network terminations independent + of network type. + +E.11.1 Properties + + Maximum Jitter Buffer + PropertyID: jit (0x0007) + + This property puts a maximum size on the jitter buffer. + + Type: integer in milliseconds + + Possible values: This property is specified in milliseconds. + + Defined in: LocalControlDescriptor + + Characteristics: read/write + +E.11.2 Events + + network failure + EventID: netfail, 0x0005 + + The termination generates this event upon detection of a failure + due to external or internal network reasons. + + EventDescriptor parameters + + None. + + ObservedEventsDescriptor parameters + + cause + ParameterID: cs (0x0001) + + Type: string + + Possible values: any text string + + + + +Groves, et al. Standards Track [Page 178] + +RFC 3525 Gateway Control Protocol June 2003 + + + This parameter may be included with the failure event to + provide diagnostic information on the reason of failure. + + quality alert + EventID: qualert, 0x0006 + + This property allows the MG to indicate a loss of quality of the + network connection. The MG may do this by measuring packet loss, + interarrival jitter, propagation delay and then indicating this + using a percentage of quality loss. + + EventDescriptor parameters + + Threshold + ParameterId: th (0x0001) + + Type: integer + + Possible values: 0 to 99 + + Description: threshold for percent of quality loss measured, + calculated based on a provisioned method, that could take + into consideration packet loss, jitter, and delay for + example. Event is triggered when calculation exceeds the + threshold. + + ObservedEventsDescriptor parameters + + Threshold + ParameterId: th (0x0001) + + Type: integer + + Possible values: 0 to 99 + + Description: percent of quality loss measured, calculated + based on a provisioned method, that could take into + consideration packet loss, jitter, and delay for example. + +E.11.3 Signals + + None. + + + + + + + + + +Groves, et al. Standards Track [Page 179] + +RFC 3525 Gateway Control Protocol June 2003 + + +E.11.4 Statistics + + Duration + StatisticsID: dur (0x0001) + + Description: provides duration of time the termination has been in + the Context. + + Type: double, in milliseconds + + Octets Sent + StatisticID: os (0x0002) + + Type: double + + Possible values: any 64-bit integer + + Octets Received + StatisticID: or (0x0003) + + Type: double + + Possible values: any 64-bit integer + +E.11.5 Procedures + + None. + +E.12 RTP Package + + PackageID: rtp (0x000c) + Version: 1 + Extends: Network Package version 1 + + This package is used to support packet-based multimedia data transfer + by means of the Real-time Transport Protocol (RTP) [RFC 1889]. + +E.12.1 Properties + + None. + +E.12.2 Events + + Payload Transition + EventID: pltrans, 0x0001 + + This event detects and notifies when there is a transition of the + RTP payload format from one format to another. + + + +Groves, et al. Standards Track [Page 180] + +RFC 3525 Gateway Control Protocol June 2003 + + + EventDescriptor parameters + + None. + + ObservedEventsDescriptor parameters + + ParameterName: rtppayload + ParameterID: rtppltype, 0x01 + + Type: list of enumerated types. + + Possible values: The encoding method shall be specified by + using one or several valid encoding names, as defined in the + RTP AV Profile or registered with IANA. + +E.12.3 Signals + + None. + +E.12.4 Statistics + + Packets Sent + StatisticID: ps (0x0004) + + Type: double + + Possible values: any 64-bit integer + + Packets Received + StatisticID: pr (0x0005) + + Type: double + + Possible values: any 64-bit integer + + Packet Loss + StatisticID: pl (0x0006) + + Describes the current rate of packet loss on an RTP stream, as + defined in IETF RFC 1889. Packet loss is expressed as percentage + value: number of packets lost in the interval between two + reception reports, divided by the number of packets expected + during that interval. + + Type: double + + Possible values: a 32-bit whole number and a 32-bit fraction. + + + + +Groves, et al. Standards Track [Page 181] + +RFC 3525 Gateway Control Protocol June 2003 + + + Jitter + StatisticID: jit (0x0007) + + Requests the current value of the interarrival jitter on an RTP + stream as defined in IETF RFC 1889. Jitter measures the variation + in interarrival time for RTP data packets. + + Delay + StatisticID:delay (0x0008) + + Requests the current value of packet propagation delay expressed + in timestamp units. Same as average latency. + +E.12.5 Procedures + + None. + +E.13 TDM Circuit Package + + PackageID: tdmc (0x000d) + Version: 1 + Extends: Network Package version 1 + + This package may be used by any termination that supports gain and + echo control. It was originally intended for use on TDM circuits + but may be more widely used. + + + New versions or extensions of this package should take non-TDM use + into account. + +E.13.1 Properties + + Echo Cancellation + PropertyID: ec (0x0008) + + Type: boolean + + Possible values: + + "on" (when the echo cancellation is requested) and + + "off" (when it is turned off.) + + The default is provisioned. + + Defined in: LocalControlDescriptor + + + + +Groves, et al. Standards Track [Page 182] + +RFC 3525 Gateway Control Protocol June 2003 + + + Characteristics: read/write + + Gain Control + PropertyID: gain (0x000a) + + Gain control, or usage of of signal level adaptation and + noise level reduction is used to adapt the level of the signal. + However, it is necessary, for example for modem calls, to turn + off this function. + + Type: integer + + Possible values: + + The gain control parameter may either be specified as + "automatic" (0xffffffff), or as an explicit number of decibels + of gain (any other integer value). The default is provisioned + in the MG. + + Defined in: LocalControlDescriptor + + Characteristics: read/write + +E.13.2 Events + + None. + +E.13.3 Signals + + None. + +E.13.4 Statistics + + None. + +E.13.5 Procedures + + None. + + + + + + + + + + + + + +Groves, et al. Standards Track [Page 183] + +RFC 3525 Gateway Control Protocol June 2003 + + +APPENDIX I EXAMPLE CALL FLOWS (INFORMATIVE) + + All H.248.1 implementors must read the normative part of this RFC + carefully before implementing from it. The examples in this appendix + should not be used as stand-alone explanations of how to create + protocol messages. + + The examples in this appendix use SDP for encoding of the Local and + and Remote stream descriptors. SDP is defined in RFC 2327. If there + is is any discrepancy between the SDP in the examples, and RFC 2327, + the the RFC should be consulted for correctness. Audio profiles used + are are those defined in IETF RFC 1890, and others registered with + IANA. For example, G.711 A-law is called PCMA in SDP, and is + assigned profile 0. G.723.1 is called G723 and is profile 4; H.263 is + called H263 and is profile 34. See also + http://www.iana.org/assignments/rtp-parameters. + +A.1 Residential Gateway to Residential Gateway Call + + This example scenario illustrates the use of the elements of the + protocol to set up a Residential Gateway to Residential Gateway call + over an IP-based network. For simplicity, this example assumes that + both Residential Gateways involved in the call are controlled by the + same Media Gateway Controller. + +A.1.1 Programming Residential GW Analog Line Terminations for Idle + Behavior + + The following illustrates the API invocations from the Media Gateway + Controller and Media Gateways to get the Terminations in this + scenario programmed for idle behavior. Both the originating and + terminating Media Gateways have idle AnalogLine Terminations + programmed to look for call initiation events (i.e., -offhook) by + using the Modify Command with the appropriate parameters. The null + Context is used to indicate that the Terminations are not yet + involved in a Context. The ROOT termination is used to indicate the + entire MG instead of a termination within the MG. + + In this example, MG1 has the IP address 124.124.124.222, MG2 is + 125.125.125.111, and the MGC is 123.123.123.4. The default Megaco + port is 55555 for all three. + + 1. An MG registers with an MGC using the ServiceChange command: + + MG1 to MGC: + + MEGACO/1 [124.124.124.222] Transaction = 9998 { + Context = - { + + + +Groves, et al. Standards Track [Page 184] + +RFC 3525 Gateway Control Protocol June 2003 + + + ServiceChange = ROOT {Services { + Method=Restart, + ServiceChangeAddress=55555, Profile=ResGW/1} + } + } } + + 2. The MGC sends a reply: + + MGC to MG1: + + MEGACO/1 [123.123.123.4]:55555 Reply = 9998 { + Context = - {ServiceChange = ROOT { + Services {ServiceChangeAddress=55555, Profile=ResGW/1} } } } + + 3. The MGC programs a Termination in the NULL context. The + terminationId is A4444, the streamId is 1, the requestId in the + Events descriptor is 2222. The mId is the identifier of the sender + of this message, in this case, it is the IP address and port + [123.123.123.4]:55555. Mode for this stream is set to SendReceive. + "al" is the analog line supervision package. Local and Remote are + assumed to be provisioned. + + MGC to MG1: + + MEGACO/1 [123.123.123.4]:55555 Transaction = 9999 { + Context = - { + Modify = A4444 { + Media { Stream = 1 { + LocalControl { + Mode = SendReceive, + tdmc/gain=2, ; in dB, + tdmc/ec=on + }, + + } + }, + Events = 2222 {al/of(strict=state)} + } + } } + + + The dialplan script could have been loaded into the MG previously. + Its function would be to wait for the OffHook, turn on dialtone and + start collecting DTMF digits. However in this example, we use the + digit map, which is put into place after the offhook is detected + (step 5 below). + + + + + +Groves, et al. Standards Track [Page 185] + +RFC 3525 Gateway Control Protocol June 2003 + + + Note that the embedded EventsDescriptor could have been used to + combine steps 3 and 4 with steps 8 and 9, eliminating steps 6 and 7. + + 4. The MG1 accepts the Modify with this reply: + + MG1 to MGC: + + MEGACO/1 [124.124.124.222]:55555 + + Reply = 9999 { + Context = - {Modify = A4444} } + + 5. A similar exchange happens between MG2 and the MGC, resulting in + an idle Termination called A5555. + +A.1.2 Collecting Originator Digits and Initiating Termination + + The following builds upon the previously shown conditions. It + illustrates the transactions from the Media Gateway Controller and + originating Media Gateway (MG1) to get the originating Termination + (A4444) through the stages of digit collection required to initiate a + connection to the terminating Media Gateway (MG2). + + 6. MG1 detects an offhook event from User 1 and reports it to the + Media Gateway Controller via the Notify Command. + + MG1 to MGC: + + MEGACO/1 [124.124.124.222]:55555 Transaction = 10000 { + Context = - { + Notify = A4444 {ObservedEvents =2222 { + 19990729T22000000:al/of(init=false)}} + } } + + 7. And the Notify is acknowledged. + + MGC to MG1: + + MEGACO/1 [123.123.123.4]:55555 Reply = 10000 { + + Context = - {Notify = A4444} } + + + + + + + + + + +Groves, et al. Standards Track [Page 186] + +RFC 3525 Gateway Control Protocol June 2003 + + + 8. The MGC Modifies the termination to play dial tone, to look for + digits according to Dialplan0 and to look for the on-hook event now. + + MGC to MG1: + + MEGACO/1 [123.123.123.4]:55555 Transaction = 10001 { + Context = - { + Modify = A4444 { + Events = 2223 { + al/on(strict=state), dd/ce {DigitMap=Dialplan0} + }, + Signals {cg/dt}, + DigitMap= Dialplan0{ (0| 00|[1- + 7]xxx|8xxxxxxx|Fxxxxxxx|Exx|91xxxxxxxxxx|9011x.)} + } + } } + + 9. And the Modify is acknowledged. + + MG1 to MGC: + + MEGACO/1 [124.124.124.222]:55555 Reply = 10001 { + Context = - {Modify = A4444} } + + 10. Next, digits are accumulated by MG1 as they are dialed by User + 1. Dialtone is stopped upon detection of the first digit. When an + appropriate match is made of collected digits against the currently + programmed Dialplan for A4444, another Notify is sent to the Media + Gateway Controller. + + MG1 to MGC: + + MEGACO/1 [124.124.124.222]:55555 Transaction = 10002 { + Context = - { + Notify = A4444 {ObservedEvents =2223 { + 19990729T22010001:dd/ce{ds="916135551212",Meth=UM}}} + } } + + 11. And the Notify is acknowledged. + + MGC to MG1: + + MEGACO/1 [123.123.123.4]:55555 Reply = 10002 { + Context = - {Notify = A4444} } + + + 12. The controller then analyses the digits and determines that a + connection needs to be made from MG1 to MG2. Both the TDM + + + +Groves, et al. Standards Track [Page 187] + +RFC 3525 Gateway Control Protocol June 2003 + + + termination A4444, and an RTP termination are added to a new context + in MG1. Mode is ReceiveOnly since Remote descriptor values are not + yet specified. Preferred codecs are in the MGC's preferred order of + choice. + + MGC to MG1: + + MEGACO/1 [123.123.123.4]:55555 Transaction = 10003 { + Context = $ { + Add = A4444, + Add = $ { + Media { + Stream = 1 { + LocalControl { + Mode = ReceiveOnly, + + nt/jit=40 ; in ms + }, + Local { v=0 c=IN IP4 $ m=audio $ RTP/AVP 4 + a=ptime:30 v=0 c=IN IP4 $ m=audio $ RTP/AVP 0 + } + } + } + } + } } + + + NOTE - The MGC states its preferred parameter values as a series + of SDP blocks in Local. The MG fills in the Local Descriptor in + the Reply. + + 13. MG1 acknowledges the new Termination and fills in the Local IP + address and UDP port. It also makes a choice for the codec based on + the MGC preferences in Local. MG1 sets the RTP port to 2222. + + MG1 -> MGC: + + MEGACO/1 [124.124.124.222]:55555 Reply = 10003 { + Context = 2000 { + Add = A4444, + Add=A4445{ + Media { + Stream = 1 { + Local { v=0 o=- 2890844526 2890842807 IN IP4 + 124.124.124.222 s=- t= 0 0 c=IN IP4 124.124.124.222 m=audio 2222 + RTP/AVP 4 a=ptime:30 a=recvonly + } ; RTP profile for G.723.1 is 4 + } + + + +Groves, et al. Standards Track [Page 188] + +RFC 3525 Gateway Control Protocol June 2003 + + + } + } + } } + + 14. The MGC will now associate A5555 with a new Context on MG2, and + establish an RTP Stream (i.e., A5556 will be assigned), SendReceive + connection through to the originating user, User 1. The MGC also + sets ring on A5555. + + MGC to MG2: + + MEGACO/1 [123.123.123.4]:55555 Transaction = 50003 { + Context = $ { + Add = A5555 { Media { + Stream = 1 { + LocalControl {Mode = SendReceive} }}, + Events=1234{al/of(strict=state)}, + Signals {al/ri} + + }, + Add = $ {Media { + Stream = 1 { + LocalControl { + Mode = SendReceive, + nt/jit=40 ; in ms + }, + Local { v=0 c=IN IP4 $ m=audio $ RTP/AVP 4 + a=ptime:30 + }, + Remote { v=0 c=IN IP4 124.124.124.222 m=audio 2222 + RTP/AVP 4 a=ptime:30 + } ; RTP profile for G.723.1 is 4 + } + } + } + } } + + 15. This is acknowledged. The stream port number is different from + the control port number. In this case it is 1111 (in the SDP). + + MG2 to MGC: + + MEGACO/1 [125.125.125.111]:55555 Reply = 50003 { + Context = 5000 { + Add = A5555, + Add = A5556{ + Media { + Stream = 1 { + + + +Groves, et al. Standards Track [Page 189] + +RFC 3525 Gateway Control Protocol June 2003 + + + Local { v=0 o=- 7736844526 7736842807 IN IP4 + 125.125.125.111 s=- t= 0 0 c=IN IP4 125.125.125.111 m=audio 1111 + RTP/AVP 4 } + } ; RTP profile for G723.1 is 4 + } + } + + } } + + 16. The above IPAddr and UDPport need to be given to MG1 now. + + MGC to MG1: + + MEGACO/1 [123.123.123.4]:55555 Transaction = 10005 { + Context = 2000 { + Modify = A4444 { + Signals {cg/rt} + }, + Modify = A4445 { + Media { + Stream = 1 { + Remote { v=0 o=- 7736844526 7736842807 IN IP4 + 125.125.125.111 s=- t= 0 0 c=IN IP4 125.125.125.111 m=audio 1111 + RTP/AVP 4 + } + } ; RTP profile for G723.1 is 4 + } + } + } } + + + MG1 to MGC: + + MEGACO/1 [124.124.124.222]:55555 Reply = 10005 { + Context = 2000 {Modify = A4444, Modify = A4445} } + + 17. The two gateways are now connected and User 1 hears the + RingBack. The MG2 now waits until User2 picks up the receiver and + then the two-way call is established. + + + + + + + + + + + + +Groves, et al. Standards Track [Page 190] + +RFC 3525 Gateway Control Protocol June 2003 + + + From MG2 to MGC: + + MEGACO/1 [125.125.125.111]:55555 Transaction = 50005 { + Context = 5000 { + + Notify = A5555 {ObservedEvents =1234 { + 19990729T22020002:al/of(init=false)}} + } } + + From MGC to MG2: + + MEGACO/1 [123.123.123.4]:55555 Reply = 50005 { + Context = - {Notify = A5555} } + + From MGC to MG2: + + MEGACO/1 [123.123.123.4]:55555 Transaction = 50006 { + Context = 5000 { + Modify = A5555 { + Events = 1235 {al/on(strict=state)}, + Signals { } ; to turn off ringing + } + } } + + From MG2 to MGC: + + MEGACO/1 [125.125.125.111]:55555 Reply = 50006 { + Context = 5000 {Modify = A4445} } + + 18. Change mode on MG1 to SendReceive, and stop the ringback. + + MGC to MG1: + + MEGACO/1 [123.123.123.4]:55555 Transaction = 10006 { + Context = 2000 { + Modify = A4445 { + Media { + Stream = 1 { + LocalControl { + Mode=SendReceive + + } + } + } + }, + Modify = A4444 { + Signals { } + } + + + +Groves, et al. Standards Track [Page 191] + +RFC 3525 Gateway Control Protocol June 2003 + + + } } + + from MG1 to MGC: + + MEGACO/1 [124.124.124.222]:55555 Reply = 10006 { + Context = 2000 {Modify = A4445, Modify = A4444}} + + 19. The MGC decides to Audit the RTP termination on MG2. + + MGC -> MG2: + + MEGACO/1 [123.123.123.4]:55555 Transaction = 50007 { + Context = - {AuditValue = A5556{ + Audit{Media, DigitMap, Events, Signals, Packages, Statistics }} + } } + + 20. The MG2 replies. + + MG2 -> MGC: + + MEGACO/1 [125.125.125.111]:55555 Reply = 50007 { + Context = - { AuditValue = A5556 { + Media { + TerminationState { ServiceStates = InService, + Buffer = OFF }, + Stream = 1 { + LocalControl { Mode = SendReceive, + nt/jit=40 }, + Local { v=0 o=- 7736844526 7736842807 IN IP4 + 125.125.125.111 s=- t= 0 0 c=IN IP4 125.125.125.111 m=audio 1111 + RTP/AVP 4 a=ptime:30 + }, + Remote { v=0 o=- 2890844526 2890842807 IN IP4 + 124.124.124.222 s=- t= 0 0 c=IN IP4 124.124.124.222 m=audio 2222 + RTP/AVP 4 a=ptime:30 + } } }, + Events, + Signals, + DigitMap, + Packages {nt-1, rtp-1}, + Statistics { rtp/ps=1200, ; packets sent + nt/os=62300, ; octets sent + rtp/pr=700, ; packets received + nt/or=45100, ; octets received + rtp/pl=0.2, ; % packet loss + rtp/jit=20, + rtp/delay=40 } ; avg latency + } + + + +Groves, et al. Standards Track [Page 192] + +RFC 3525 Gateway Control Protocol June 2003 + + + } } + + 21. When the MGC receives an onhook signal from one of the MGs, it + brings down the call. In this example, the user at MG2 hangs up + first. + + From MG2 to MGC: + + MEGACO/1 [125.125.125.111]:55555 Transaction = 50008 { + Context = 5000 { + Notify = A5555 {ObservedEvents =1235 { + 19990729T24020002:al/on(init=false)} + } + } } + + From MGC to MG2: + + MEGACO/1 [123.123.123.4]:55555 Reply = 50008 { + + Context = - {Notify = A5555} } + + 22. The MGC now sends both MGs a Subtract to take down the call. + Only the subtracts to MG2 are shown here. Each termination has its + own set of statistics that it gathers. An MGC may not need to + request both to be returned. A5555 is a physical termination, and + A5556 is an RTP termination. + + From MGC to MG2: + + MEGACO/1 [123.123.123.4]:55555 Transaction = 50009 { + Context = 5000 { + Subtract = A5555 {Audit{Statistics}}, + Subtract = A5556 {Audit{Statistics}} + } } + + From MG2 to MGC: + + MEGACO/1 [125.125.125.111]:55555 Reply = 50009 { + Context = 5000 { + Subtract = A5555 { + Statistics { + nt/os=45123, ; Octets Sent + nt/dur=40 ; in seconds + } + }, + Subtract = A5556 { + Statistics { + rtp/ps=1245, ; packets sent + + + +Groves, et al. Standards Track [Page 193] + +RFC 3525 Gateway Control Protocol June 2003 + + + nt/os=62345, ; octets sent + rtp/pr=780, ; packets received + nt/or=45123, ; octets received + rtp/pl=10, ; % packets lost + rtp/jit=27, + rtp/delay=48 ; average latency + } + } + } } + + 23. The MGC now sets up both MG1 and MG2 to be ready to detect the + next off-hook event. See step 1. Note that this could be the + default state of a termination in the null context, and if this were + the case, no message need be sent from the MGC to the MG. Once a + termination returns to the null context, it goes back to the default + termination values for that termination. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Groves, et al. Standards Track [Page 194] + +RFC 3525 Gateway Control Protocol June 2003 + + +APPENDIX II Changes From RFC 3015 + + In the following table, "source" indicates when the change was first + approved. It has the following values: + + IG1100: H.248 Implementor's Guide approved in November, 2000 (as TD + Plen-39, Christian Groves, editor). + + IG0601: H.248 Implementor's Guide approved in June, 2001 (as TD + Plen-15, Christian Groves, editor). + + IGDUB: Draft H.248 Implementor's Guide approved at the Q.3 + Rapporteur's meeting held near Dublin, October 2001 (as TD-28, Terry + Anderson, editor). + + GEN0202: added at the Geneva meeting, February 2002, which consented + to H.248 v1 Amendment 1 (as TD Plen-36r1, Marcello Pantaleo, editor). + + ITUPOST: added in post-Geneva editing by the ITU-T. + + TTPOST: added in post-approval editing by the Megaco Chair, Tom + Taylor, who assembled this document for submission. + + Section Source Change + + 1 ITUPOST Reference changed from H.248 to H.248.1. + + 2.1 ITUPOST Reference added for error codes, changed from + H.248 Annex L to H.248.8 (2002). + + 2.1 IG1100 Corrected Q.765 reference to Q.765.5. + + 2.1 GEN0202 Added reference to X.690. + + 2.2 GEN0202 Added reference to H.226. + + 2.2 IGDUB Added informative references to Q.724, Q.764, + and Q.1902.4. + + 4 IG0601 Added expansion of ALF. + + 5 TTPOST Gave priority to IETF conventions (added at + start of document). + + + + + + + + +Groves, et al. Standards Track [Page 195] + +RFC 3525 Gateway Control Protocol June 2003 + + + 6.1.1 IG0601 Added text regarding use of wildcards for + context identifiers. (This information + already appeared in section 8.1.2. The IG + change subsequently disappeared.) + + 6.1.1 IG1100 Added ranking of priority values. + + 6.2 IGDUB Deleted definition of signals. + + 6.2 GEN0202 Expanded text and diagrams describing + multiplexing terminations. + + 6.2 TTPOST Added asterisks to multiplexing diagrams to + indicate centre of context. Added Figure 6a + showing cascading of multiplexes. + + 6.2.2 IG0601 Added text indicating that ALL does not + include ROOT. + + 6.2.3 IG1100 Added text clarifying what must be supported + to claim support of a package. + + 6.2.3 IG1100 Added text indicating what packages a peer can + indicate support for, when some of them are + extensions of others. + + 6.2.4 IG0601 Added text on ability of provisioning to + override default values, and need for MGC to + audit to learn the provisioned defaults. + + 6.2.4 IG0601 Added text indicating effect of omitting + specific properties from Descriptors in + commands modifying a termination. + Contradicted original text saying that omitted + properties retain their prior values (still + true for entirely-omitted Descriptors). + + 6.2.4 GEN0202 Modified above text to restrict it to + read/write properties, allow for default + behaviour in place of default values if so + specified in the property definition. + + 6.2.4 IGDUB Trimmed definition of signals Descriptor in + table and inserted cross-reference to section + 7.1.11. + + 6.2.4 IG1100 Added Topology and Error Descriptors to table. + + + + +Groves, et al. Standards Track [Page 196] + +RFC 3525 Gateway Control Protocol June 2003 + + + 6.2.5 IGDUB Specified error code to return if ROOT used + inappropriately. + + 7.1.1 IG1100 Added qualification to explanation of effect + of missing Audit Descriptor, excepting + Subtract. + + 7.1.3 GEN0202 Changed "inputs" to "bearers" to be consistent + with terminology in 6.2. + + 7.1.4 IG0601 Small change to make clear that more than one + of Local, Remote, and LocalControl can be + included in the default streamId. + + 7.1.7 IG0601 Default value for Mode specified to be + Inactive. + + 7.1.7 GEN0202 Added text requiring processing of media in + any of the reserved formats, where more than + one has been reserved in a given stream. + + 7.1.8 IGDUB Added restriction to at most one m= line per + session description. + + 7.1.9 IG0601 Text added to omit request identifier if the + EventsDescriptor is empty. Further text added + at end to indicate the effects of an empty + EventsDescriptor and an empty + EventBufferDescriptor. + + 7.1.9 IG0601 Fixed typo for destination of a Notify. + + 7.1.9 IG1100 Added note to say event remains active after + it has been notified, so long as it is still + present in the active Events Descriptor. + + 7.1.11 IGDUB Added definition of signals. + + 7.1.11 GEN0202 Modified definition to include example of more + complex signal, and added role of signal in + media preparation for future signals. + + 7.1.11 IGDUB The timeout completion reason was broadened to + include other circumstances where the signal + completed on its own. Text added to indicate + that if default signal type changed to TO, + duration parameter must be provided. + + + + +Groves, et al. Standards Track [Page 197] + +RFC 3525 Gateway Control Protocol June 2003 + + + 7.1.11 GEN0202 Removed reference to BR signal being "so + short" it will stop on its own. Added text + indicating that if the type of a signal is + changed to TO, the Duration parameter must be + supplied. + + 7.1.11 IG1100 Deleted text discussing type of Signals List. + + 7.1.12 GEN0202 Improved wording of introductory paragraph and + added text making content of returned + Descriptor clear. + + 7.1.14.2 GEN0202 Added text indicating that when the start + timer is set to 0, initial digit timing is + disabled and the MG waits indefinitely for + digits. + + 7.1.14.2 GEN0202 Added text pointing out that default digit + timer values should be provisioned, but can be + overridden in the digit map. + + 7.1.14.3 GEN0202 Changed result of long-short digit timer + conflict from undefined to long. + + 7.1.14.6 IG1100 Clarified that the digit map is provided by + the eventDM parameter, which must be present. + + 7.1.14.7 GEN0202 Added text clarifying that events covered by + the digit map completion event have no side- + effects unless separately enabled. + + 7.1.14.8 IG0601 Added requirement that the event specification + include the eventDM parameter. + + 7.1.17 IGDUB Added text to indicate timestamp is optional + and to include observed event parameters in + reported content. + + 7.1.17 GEN0202 Deleted provision that time is expressed in + UTC (since intention was to use format, not + time zone). + + 7.1.18 IGDUB Added text indicating error to return if + topology option not supported. + + + + + + + +Groves, et al. Standards Track [Page 198] + +RFC 3525 Gateway Control Protocol June 2003 + + + 7.1.18 IG1100 Added text clarifying effect of not mentioning + TTPOST a termination in a topology Descriptor, and + default topology for a new termination. (This + text got lost between the Dublin meeting and + the production of H.248 Amendment 1 out of the + Geneva 02/02 meeting. It has been added back + to the present document.) + + 7.1.19 IG1100 New section to describe Error Descriptor. + GEN0202 Slightly edited in Geneva 02/02 meeting. + ITUPOST Reference for error code documentation updated + to H.248.8. + + 7.1.19 IG0601 Added paragraph giving guidance on level at + which errors should be reported. + + 7.2 IG1100 Noted possibility of Error Descriptor in reply + to any command. + + 7.2.1 IG1100 Added EventBufferDescriptor as Add parameter. + + 7.2.1 IG1100 Removed restriction on use of CHOOSE wildcard. + + 7.2.2 IG1100 Added EventBufferDescriptor as Modify + parameter. + + 7.2.2 GEN0202 Added text on side-effects of Modify of a + multiplexing termination. + + 7.2.3 IG1100 Added prohibition against subtracting from the + NULL context. + + 7.2.3 GEN0202 Added text on side-effects of Subtract of a + multiplexing termination. + + 7.2.3 IGDUB Added text clarifying effect of empty + AuditDescriptor in Subtract. + + 7.2.4 IG1100 Added EventBufferDescriptor as Move parameter. + + 7.2.4 GEN0202 Removed misleading statement that Move acts as + subtract from original context. + + 7.2.4 IG1100 Clarified effect of Move on properties of the + moved termination. + + 7.2.4 GEN0202 Added text on side-effects of Move of a + multiplexing termination. + + + +Groves, et al. Standards Track [Page 199] + +RFC 3525 Gateway Control Protocol June 2003 + + + 7.2.5 IG1100 Added examples showing W- wildcard usage. + + 7.2.5 IG1100 Noted that returning a list of all contextIDs + requires that they be returned one per + ActionReply. + + 7.2.5 IG1100 Added table entry (ALL, specific) to determine + context in which termination currently + resides. + + 7.2.6 GEN0202 Added table similar to that in 7.2.5. + + 7.2.7 IG0601 Added TerminationID to API. + + 7.2.7 IGDUB Indicated timestamp was optional in Notify, to + accord with syntax. + + 7.2.7 IG1100 Noted possibility of sending Error Descriptor + in Notify. + + 7.2.8 IG0601 Added text to description of Forced method to + indicate that Forced on ROOT indicates a cold + restart (all context state lost). + + 7.2.8 IGDUB Amplified explanation of Disconnected method + to emphasize return to the previously + controlling MGC. + + 7.2.8 IG0601 Added text for MG use of Failover method when + it detects MGC failure. + + 7.2.8 IG1100 Added notes discouraging use of + ServiceChangeAddress and warning that it could + be either a full address or just a port + number. + + 7.2.8 IG0601 Added text indicating that timestamp does not + necessarily represent absolute time, only + local clock reading. + + 7.2.8 IGDUB Corrected "gateway" to "MGC" in discussion of + returned ServiceChangeMgcId parameter. + + 7.3 IG0601 Removed error code documentation to Annex L + ITUPOST (now H.248.8). + + 8 IG1100 Added requirement that an Action be non-empty. + + + + +Groves, et al. Standards Track [Page 200] + +RFC 3525 Gateway Control Protocol June 2003 + + + 8 GEN0202 Added context properties and context property + audit requests to commands as potential + contents of actions. + + 8.1.2 GEN0202 Added prohibition on using partial contextIDs + with ALL wildcards. + + 8.2.2 IG1100 Added text clarifying when in transaction + processing the requested actions have been + completed and a reply can be sent. + + 8.2.2 IG1100 Added ALL as allowed contextID in + TransactionReply. + + 8.2.2 GEN0202 Provided general reference to section 7.1.19 + for generation of error Descriptors. + + 8.2.2 IG0601 Corrected Actions to Commands when discussing + partially-understood action. + + 8.3 IG0601 Added text specifying that the same MId value + must be used by a given entity throughout the + life of a control association. + + 8.3 IG0601 Added text expanding on independence of + transactions from messages. + + 9 ITUPOST Indicated that additional transports may be + defined in separate Recommendations as well as + annexes to the primary specification. + + 9 IG0601 Gave specific example of "request source + address" for IP. + + 9.1 IG1100 Deleted restriction to one outstanding Notify + command on a termination at one time, since + this is transport-specific. + + 9.1 IG0601 Restored restriction, but noted that it + applied only to transport not guaranteeing + ordered delivery. + + 10.2 IG1100 Corrected length of synthesized address field + from 10 to 20 hex digits and indicated that + calculation should be over entire message, not + just one transaction. + + + + + +Groves, et al. Standards Track [Page 201] + +RFC 3525 Gateway Control Protocol June 2003 + + + 11.2 IG1100 Corrected text in first two paragraphs + describing use of ServiceChangeMgcId + parameter. + + 11.2 IG1100 Corrected "Transaction Accept" to "Transaction + Reply". + + 11.4 IG0601 Noted that support of redundant MGs requires + GEN0202 use of a reliable transport and support in the + MGC. Added more explanation in Geneva. + + 11.5 IG0601 Added text clarifying procedure if MG unable + to establish a control relationship with any + of its eligible MGCs. + + 11.5 IGDUB Added text indicating that when trying to + reestablish contact with the previously + controlling MGC the MG uses the Disconnected + method. + + 11.5 IG1100 Clarified handoff procedure. + + 11.5 GEN0202 Changed text on replies to transactions in + progress during handoff. Replies now + discarded when the service relationship with + the old MGC has ended, rather than sent to the + new MGC. The new MGC could still send replies + to requests sent to the old MGC. + + 12.1.1 GEN0202 Added optional package designation as + "designed to be extended only". + + 12.1.1 IG1100 Made prohibition on overloading of identifiers + in extended packages transitive through all + ancestors of the extended package. + + 12.1.2 IGDUB Clarified the set of types allowed for + properties. + + 12.1.2 GEN0202 Added requirement to specify the base type of + a sub-list. + + 12.1.2 GEN0202 Provided requirements for content of the + "Possible Values" template item, including + specification of default values or behaviour. + + + + + + +Groves, et al. Standards Track [Page 202] + +RFC 3525 Gateway Control Protocol June 2003 + + + 12.1.4 GEN0202 Added requirement to specify the default + signal type, and specify a default duration + for TO signals. Also noted that duration is + meaningless for BR, and that the signal type + might be dependent on the values of other + signal parameters. + + 12.2 GEN0202 Fixed section title (covers only event and + signal parameters, not properties or + statistics). + + 12.2 IG1100 Reserved SPA and EPA prefixes, so they are not + to be used for signal and event parameter + tokens. + + 12.2 IG0601 Expanded list of reserved prefixes. + + 12.2 IGDUB Clarified the set of types allowed for signal + and event parameters. + + 12.2 GEN0202 Added requirement to specify the base type of + a sub-list. + + 12.2 GEN0202 Provided requirements for content of the + "Possible Values" template item, including + specification of default values or behaviour. + + 12.4 IGDUB Corrected to indicate identifiers must start + with alphabetic rather than alphanumeric + character. + + 13.1 IG0601 Changed private range of binary package + identifiers to convenient hex values. + + A GEN0202 Removed versions from X.680 and X.690 + references. + + A.2 IGDUB Added note warning that the syntax alone does + not provide a complete description of the + constraints, but must be supplemented by a + reading of the text and comments. + + A.2 IG0601 Added description of double wrapping of + parameters declared as OCTET STRING. + + + + + + + +Groves, et al. Standards Track [Page 203] + +RFC 3525 Gateway Control Protocol June 2003 + + + A.2 GEN0202 Some editing of double wrapping description to + use ASN.1, BER in their proper places. Added + possibility of encoding strings as UTF8String, + but only if they contain non-ASCII characters. + + A.2 IGDUB Added line in table on double wrapping of true + octet strings. + + A.2 IG1100 Corrected and expanded comments describing + mtpAddress form of MId. Fixed maximum length + of mtpAddress both here and in + ServiceChangeAddress. + + A.2 IG0601 Inserted missing lines in IP4Address + production. + + A.2 IG0601 Modified TransactionResponseAck to allow + acknowledgement of multiple ranges of + transactionIds. + + A.2 IG0601 Corrected numerical value of CHOOSE as a + context identifier. + + A.2 IGDUB Added missing extension marker in + TopologyRequest. + + A.2 IG1100 AuditReply and AuditResult modified to bring + binary functionality into line with text + functionality. + + A.2 IG0601 Removed OPTIONAL tag from terminationID in + NotifyReply. + + A.2 IG0601 Added extraInfo substructure to EventParameter + and SigParameter. + + A.2 IG0601 Modified MediaDescriptor to make it optional + to specify a stream. + + A.2 IG0601 Added OPTIONAL tags to reserveValue and + reserveGroup. + + A.2 IGDUB Added to comments for pkgdName to indicate + applicability to event names, signal names, + and statisticIds as well as property. + + + + + + +Groves, et al. Standards Track [Page 204] + +RFC 3525 Gateway Control Protocol June 2003 + + + A.2 IG0601 RequestID made optional in EventsDescriptor + and SecondEventsDescriptor and comment added + saying it must be present if events are + present. + + A.2 IG1100 Added OPTIONAL tags on RequestActions and + SecondRequestedActions keepActive BOOLEANs. + + A.2 IG1100 Added comment to indicate requestID value to + use in an AuditCapReply. + + A.2 GEN0202 Added comment to DigitMapValue indicating time + units for timers. + + A.2 IG0601 Added comment indicating coding of Value for + GEN0202 ServiceChangeReason. Cleaned up in Geneva to + use ASN.1 and BER in their proper places. + + A.2 IG0601 Inserted missing extension marker in + ServiceChangeParm production. + + A.2 IG0601 Aligned definition of mtpAddress in + ServiceChangeAddress with that in MId. + + A.2 IG0601 Added timestamp to ServiceChangeResParm. + + A.2 IGDUB Changed type of profileName in + ServiceChangeProfile to IA5String. + + A.2 IG0601 Made returned value optional in + statisticsParameter, to support + auditCapability result. + + A.2 GEN0202 Added reference to ISO 8601:1988 for + TimeNotation. + + A.2 IG1100 Value production modified to support the + sublist parameter type. + + A.3 IG1100 Corrected ABNF for digitStringlisT, replacing + "/" with "|". + + A.3 IG1100 Added parentheses to digitMapRange production. + + A.3 IG1100 Replaced more abbreviated syntax for pathName + with fuller definition and constraints copied + from B.2. + + + + +Groves, et al. Standards Track [Page 205] + +RFC 3525 Gateway Control Protocol June 2003 + + + B.2 IGDUB Added note warning that the syntax alone does + not provide a complete description of the + constraints, but must be supplemented by a + reading of the text and comments. + + B.2 IG0601 Added note warning that the interpretation of + symbols is context-dependent. + + B.2 IG1100 Added comment to indicate case insensitivity + of protocol (excepting SDP) and ABNF. + + B.2 IG0601 Expanded upon and capitalized this comment. + + B.2 IG0601 Lengthy note added on the coding of the VALUE + construct. + + B.2 IGDUB Deleted sentence in note suggesting that + packages could add new types for properties, + parameters, or statistics. + + B.2 IG0601 Added note indicating that parsers should + allow for white space preceding the first line + of SDP in Local or Remote. + + B.2 IGDUB Added comments identifying the O- and W- tags. + + B.2 IG1100 Moved wildcard tag up from individual commands + to commandRequestList. + + B.2 GEN0202 Added additional error case to actionReply. + + B.2 IG0601 Modified syntax of auditOther to allow return + of terminationID only. + + B.2 IGDUB Corrected upper limit for V4hex. + + B.2 IG1100 Corrected and expanded comments describing + mtpAddress form of MId. + + B.2 IG0601 Modified comment to mediaParm to make + streamParms and StreamDescriptor mutually + exclusive. + + B.2 GEN0202 Modified comment further to indicate at most + one instance of terminationStateDescriptor. + + B.2 GEN0202 Expanded comment for streamParm to indicate + the restriction on repetition is per item. + + + +Groves, et al. Standards Track [Page 206] + +RFC 3525 Gateway Control Protocol June 2003 + + + B.2 IG0601 Modified "at most once" comments to localParm, + terminationStateParm, and modemType, to allow + multiple instances of propertyParm in the + first two cases and extensionParameter in the + last one. + + B.2 IG0601 Added note before description of Local and + Remote, pointing out that the octet value x00 + is not allowed in octetString. + + B.2 IG0601 Syntax for eventsDescriptor, embedFirst, and + eventBufferDescriptor modified to make + contents beyond token optional. + + B.2 IGDUB Replaced "event" by "item" in comment to + pkgdName because pkgdName applies to + properties, signals, and statistics as well. + + B.2 IG0601 Corrected placement of EQUAL in eventDM + production. + + B.2 IG1100 Added comment and syntax to indicate requestID + value to use in an AuditCapReply. + + B.2 IG1100 Corrected Modem Descriptor to allow package + items as properties. + + B.2 IG0601 Comment to modemType changed to allow multiple + instances of extensionParameter. + + B.2 GEN0202 Comment added to indicate units for Timer. + + B.2 IG1100 Added parentheses to digitMapRange production. + + B.2 IG1100 Added comment to serviceChangeParm, + restricting each parameter to one appearance. + + B.2 IG0601 Added comments making serviceChangeMgcId and + serviceChangeAddress mutually exclusive in + ServiceChangeParm and servChgReplyParm. + + B.2 IGDUB Added comment to serviceChangeParm indicating + that ServiceChangeMethod and + ServiceChangeReason are required. + + B.2 IG0601 Added Timestamp to servChgReplyParm. + + + + + +Groves, et al. Standards Track [Page 207] + +RFC 3525 Gateway Control Protocol June 2003 + + + B.2 IG0601 Added comment indicating coding of Value for + ServiceChangeReason. + + B.2 IG0601 Modified ServiceChangeAddress to use MId + definition for full address. + + B.2 IG1100 Made returned value optional in + statisticsParameter, to support + auditCapability result. + + B.2 IG1100 Changed topologyDescriptor to allow multiple + triples. + + B.2 IG0601 Added comment forbidding use of a double quote + within a quotedString value. + + B.2 IG1100 Reserved prefixes for new tokens added to + signalParameter and eventParameter, to avoid + collision with package names. + + B.2 IG1100 EmbedToken and EmergencyToken changed to + remove clash with EventBufferToken. + + B.3 IG1100 New section describing hexadecimal octet + encoding. + + B.4 IG1100 New section describing hex octet sequence. + + C IG1100 Added permission to use Annex C properties in + LocalControl as well as in Local and Remote. + + C IG0601 Added text making support of all properties of + Annex C optional. + + C IGDUB Added directions to reconcile tabulated + formats with allowed types for properties. + + C.1 IG1100 Corrected Q.765 reference to Q.765.5 for + ACodec. + + C.1 IG1100 Deprecated Echocanc codepoint in favour of + package-defined property. + + C.4 ITUPOST Updated references from Q.2961 to Q.2961.1. + + C.4 IGDUB Added details on format of VPVC. + + C.9 IG1100 Renamed USI to layer1prot. + + + +Groves, et al. Standards Track [Page 208] + +RFC 3525 Gateway Control Protocol June 2003 + + + C.9 IG1100 Deprecated ECHOCI codepoint in favour of + package-defined property. + + C.9 IG1100 Added new USI property. + + C.11 IG1100 Added m= line tag. + + D.1 IG0601 Added explanation of ALF. + + D.1.5 IGDUB Expanded text indicating that when trying to + reestablish contact with the previously + controlling MGC the MG uses the Disconnected + method. + + E.1.2 GEN0202 Added missing EventsDescriptor parameters + lines. + + E.1.2 GEN0202 For the Signal Completion event: + - corrected the description of how it is + enabled + - heavily edited the description of the Signal + Identity observed event parameter and added a + type. + + E.1.2 IGDUB The timeout completion reason for the Signal + Completion event was broadened to include + other circumstances where the signal completed + on its own. + + E.1.2 IG1100 Added signal list ID observed event parameter + to the Signal Completion event. + + E.2.1 IG0601 Added missing read only, read-write + specifications. + + E.2.1 IG0601 Split ProvisionalResponseTimer properties into + one for MG, one for MGC. + + E.3 GEN0202 Added "Designed to be extended only" to + tonegen package description. + + E.4 GEN0202 Added "Designed to be extended only" to + tonedet package description. + + E.4.2 GEN0202 Added type for tone ID observed parameter for + Long Tone Detected event. + + + + + +Groves, et al. Standards Track [Page 209] + +RFC 3525 Gateway Control Protocol June 2003 + + + E.6.2 IG1100 Corrected binary identifier for digit map + completion event to avoid clash with base + package. + + E.6.2 IG1100 Removed procedural text. + + E.6.5 IG1100 Added procedural text indicating where to find + the applicable digit map and indicating the + error to return if the parameter is missing. + + E.6.5 IG0601 Further modified procedural text. + + E.7.3 IG1100 Corrected text identifier for payphone + recognition tone to avoid clash with base + package. + + E.10.5 IGDUB Provided informative references for tones and + procedures for continuity check. + + E.13 GEN0202 Added note that TDM package could also apply + to other transports. + + E.13.1 IG1100 Changed default for echo cancellation from + "on" to provisioned. + + E.13.1 IG0601 Corrected type for gain property. + + Appendix TTPOST Included a number of corrections which were + I not picked up in H.248.1 Amendment 1 but which + do appear in H.248.1 v2. + +Intellectual Property Rights + + The ITU draws attention to the possibility that the practice or + implementation of this RFC may involve the use of a claimed + Intellectual Property Right. The ITU takes no position concerning + the evidence, validity or applicability of claimed Intellectual + Property Rights, whether asserted by ITU members or others outside of + the Recommendation development process. + + As of the date of approval of this RFC, the ITU had received notice + of intellectual property, protected by patents, which may be required + to implement this RFC. However, implementors are cautioned that this + may not represent the latest information and are therefore strongly + urged to consult the TSB patent database. + + + + + + +Groves, et al. Standards Track [Page 210] + +RFC 3525 Gateway Control Protocol June 2003 + + + The IETF has also received notice of intellectual property claims + relating to Megaco/H.248.1. Please consult the IETF IPR + announcements at http://www.ietf.org/ipr.html. + +Acknowledgments + + Megaco/H.248.1 is the result of hard work by many people in both the + IETF and in ITU-T Study Group 16. This section records those who + played a prominent role in ITU-T meetings, on the Megaco list, or + both. + + Megaco/H.248 owes a large initial debt to the MGCP protocol (RFC + 2705), and thus to its authors, Mauricio Arango, Andrew Dugan, Ike + Elliott, Christian Huitema, and Scott Pickett. Flemming Andreasen + does not appear on this list of authors, but was a major contributor + to the development of both MGCP and Megaco/H.248.1. RFC 3435 has an + extensive acknowledgement of many other people who worked on media + gateway control before Megaco got started. + + The authors of the first Megaco RFCs (2805, then 3015) were Fernando + Cuervo, Nancy Greene, Abdallah Rayhan, Christian Huitema, Brian + Rosen, and John Segers. Christian Groves conceived and was editor of + Annex C. The people most active on the Megaco list in the period + leading up to the completion of RFC 2885 were Brian Rosen, Tom + Taylor, Nancy Greene, Christian Huitema, Matt Holdrege, Chip Sharp, + John Segers, Michael Thomas, Henry Sinnreich, and Paul Sijben. The + people who sacrificed sleep and meals to complete the massive amount + of work required in the decisive Study Group 16 meeting of February, + 2000, were Michael Brown, Ranga Dendi, Larry Forni, Glen Freundlich, + Christian Groves, Alf Heidemark, Steve Magnell, Selvam Rengasami, + Rich Rubin, Klaus Sambor, John Segers, Chip Sharp, Tom Taylor, and + Stephen Terrill. + + The most active people on the Megaco list in the period since the + February 2000 have been Tom Taylor, Brian Rosen, Christian Groves, + Madhu Babu Brahmanapally, Troy Cauble, Terry Anderson, Chuong Nguyen, + and Kevin Boyle, but many other people have been regular + contributors. Brian Rosen did tremendous service in putting together + the Megaco interoperability tests. On the Study Group 16 side, the + editorial team for the final revised document in February, 2002 + included Christian Groves, Marcello Pantaleo, Terry Anderson, Peter + Leis, Kevin Boyle, and Tom Taylor. + + Tom Taylor as Megaco Chair managed the day to day operation of the + Megaco list, with Brian Rosen taking an equal share of the burden for + most of the last three years. Glen Freundlich as the Study Group 16 + Rapporteur ran the ITU-T meetings and ensured that all of the work at + hand was completed. Without Glen's determination the Megaco/H.248 + + + +Groves, et al. Standards Track [Page 211] + +RFC 3525 Gateway Control Protocol June 2003 + + + standard would have taken at least half a year longer to produce. + Christian Groves filled in ably as Rapporteur when Glen could no + longer take part. + +Authors' Addresses + + Terry L. Anderson + 24 Hill St + Bernardsville, NJ 07924 + USA + + EMail: tlatla@verizon.net + + + Christian Groves + Ericsson AsiaPacificLab Australia + 37/360 Elizabeth St + Melbourne, Victoria 3000 + Australia + + EMail: Christian.Groves@ericsson.com.au + + + Marcello Pantaleo + Ericsson Eurolab Deuschland + Ericsson Allee 1 + 52134 Herzogenrath, Germany + + EMail: Marcello.Pantaleo@eed.ericsson.se + + + Tom Taylor + Nortel Networks + 1852 Lorraine Ave, + Ottawa, Ontario + Canada K1H 6Z8 + + Phone: +1 613 736 0961 + EMail: taylor@nortelnetworks.com + + + + + + + + + + + + +Groves, et al. Standards Track [Page 212] + +RFC 3525 Gateway Control Protocol June 2003 + + +Full Copyright Statement + + Copyright (C) The Internet Society (2003). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + +Groves, et al. Standards Track [Page 213] + diff --git a/examples/sample.source.MEGACO/Makefile b/examples/sample.source.MEGACO/Makefile new file mode 100644 index 000000000..e250b52f7 --- /dev/null +++ b/examples/sample.source.MEGACO/Makefile @@ -0,0 +1,322 @@ +ASN_MODULE_SOURCES= \ + MegacoMessage.c \ + AuthenticationHeader.c \ + SecurityParmIndex.c \ + SequenceNum.c \ + AuthData.c \ + Message.c \ + MId.c \ + DomainName.c \ + IP4Address.c \ + IP6Address.c \ + PathName.c \ + Transaction.c \ + TransactionId.c \ + TransactionRequest.c \ + TransactionPending.c \ + TransactionReply.c \ + TransactionResponseAck.c \ + TransactionAck.c \ + ErrorDescriptor.c \ + ErrorCode.c \ + ErrorText.c \ + ContextID.c \ + ActionRequest.c \ + ActionReply.c \ + ContextRequest.c \ + ContextAttrAuditRequest.c \ + CommandRequest.c \ + Command.c \ + CommandReply.c \ + TopologyRequest.c \ + AmmRequest.c \ + AmmDescriptor.c \ + AmmsReply.c \ + SubtractRequest.c \ + AuditRequest.c \ + AuditReply.c \ + AuditResult.c \ + TerminationAudit.c \ + AuditReturnParameter.c \ + AuditDescriptor.c \ + NotifyRequest.c \ + NotifyReply.c \ + ObservedEventsDescriptor.c \ + ObservedEvent.c \ + EventName.c \ + EventParameter.c \ + ServiceChangeRequest.c \ + ServiceChangeReply.c \ + ServiceChangeResult.c \ + WildcardField.c \ + TerminationID.c \ + TerminationIDList.c \ + MediaDescriptor.c \ + StreamDescriptor.c \ + StreamParms.c \ + LocalControlDescriptor.c \ + StreamMode.c \ + PropertyParm.c \ + Name.c \ + PkgdName.c \ + Relation.c \ + LocalRemoteDescriptor.c \ + PropertyGroup.c \ + TerminationStateDescriptor.c \ + EventBufferControl.c \ + ServiceState.c \ + MuxDescriptor.c \ + MuxType.c \ + StreamID.c \ + EventsDescriptor.c \ + RequestedEvent.c \ + RequestedActions.c \ + EventDM.c \ + SecondEventsDescriptor.c \ + SecondRequestedEvent.c \ + SecondRequestedActions.c \ + EventBufferDescriptor.c \ + EventSpec.c \ + SignalsDescriptor.c \ + SignalRequest.c \ + SeqSigList.c \ + Signal.c \ + SignalType.c \ + SignalName.c \ + NotifyCompletion.c \ + SigParameter.c \ + RequestID.c \ + ModemDescriptor.c \ + ModemType.c \ + DigitMapDescriptor.c \ + DigitMapName.c \ + DigitMapValue.c \ + ServiceChangeParm.c \ + ServiceChangeAddress.c \ + ServiceChangeResParm.c \ + ServiceChangeMethod.c \ + ServiceChangeProfile.c \ + PackagesDescriptor.c \ + PackagesItem.c \ + StatisticsDescriptor.c \ + StatisticsParameter.c \ + NonStandardData.c \ + NonStandardIdentifier.c \ + H221NonStandard.c \ + TimeNotation.c \ + Value.c + +ASN_MODULE_HEADERS= \ + MegacoMessage.h \ + AuthenticationHeader.h \ + SecurityParmIndex.h \ + SequenceNum.h \ + AuthData.h \ + Message.h \ + MId.h \ + DomainName.h \ + IP4Address.h \ + IP6Address.h \ + PathName.h \ + Transaction.h \ + TransactionId.h \ + TransactionRequest.h \ + TransactionPending.h \ + TransactionReply.h \ + TransactionResponseAck.h \ + TransactionAck.h \ + ErrorDescriptor.h \ + ErrorCode.h \ + ErrorText.h \ + ContextID.h \ + ActionRequest.h \ + ActionReply.h \ + ContextRequest.h \ + ContextAttrAuditRequest.h \ + CommandRequest.h \ + Command.h \ + CommandReply.h \ + TopologyRequest.h \ + AmmRequest.h \ + AmmDescriptor.h \ + AmmsReply.h \ + SubtractRequest.h \ + AuditRequest.h \ + AuditReply.h \ + AuditResult.h \ + TerminationAudit.h \ + AuditReturnParameter.h \ + AuditDescriptor.h \ + NotifyRequest.h \ + NotifyReply.h \ + ObservedEventsDescriptor.h \ + ObservedEvent.h \ + EventName.h \ + EventParameter.h \ + ServiceChangeRequest.h \ + ServiceChangeReply.h \ + ServiceChangeResult.h \ + WildcardField.h \ + TerminationID.h \ + TerminationIDList.h \ + MediaDescriptor.h \ + StreamDescriptor.h \ + StreamParms.h \ + LocalControlDescriptor.h \ + StreamMode.h \ + PropertyParm.h \ + Name.h \ + PkgdName.h \ + Relation.h \ + LocalRemoteDescriptor.h \ + PropertyGroup.h \ + TerminationStateDescriptor.h \ + EventBufferControl.h \ + ServiceState.h \ + MuxDescriptor.h \ + MuxType.h \ + StreamID.h \ + EventsDescriptor.h \ + RequestedEvent.h \ + RequestedActions.h \ + EventDM.h \ + SecondEventsDescriptor.h \ + SecondRequestedEvent.h \ + SecondRequestedActions.h \ + EventBufferDescriptor.h \ + EventSpec.h \ + SignalsDescriptor.h \ + SignalRequest.h \ + SeqSigList.h \ + Signal.h \ + SignalType.h \ + SignalName.h \ + NotifyCompletion.h \ + SigParameter.h \ + RequestID.h \ + ModemDescriptor.h \ + ModemType.h \ + DigitMapDescriptor.h \ + DigitMapName.h \ + DigitMapValue.h \ + ServiceChangeParm.h \ + ServiceChangeAddress.h \ + ServiceChangeResParm.h \ + ServiceChangeMethod.h \ + ServiceChangeProfile.h \ + PackagesDescriptor.h \ + PackagesItem.h \ + StatisticsDescriptor.h \ + StatisticsParameter.h \ + NonStandardData.h \ + NonStandardIdentifier.h \ + H221NonStandard.h \ + TimeNotation.h \ + Value.h + +ASN_MODULE_HEADERS+=BOOLEAN.h +ASN_MODULE_SOURCES+=BOOLEAN.c +ASN_MODULE_HEADERS+=ENUMERATED.h +ASN_MODULE_SOURCES+=ENUMERATED.c +ASN_MODULE_HEADERS+=INTEGER.h +ASN_MODULE_HEADERS+=NativeEnumerated.h +ASN_MODULE_HEADERS+=IA5String.h +ASN_MODULE_SOURCES+=IA5String.c +ASN_MODULE_SOURCES+=INTEGER.c +ASN_MODULE_HEADERS+=NULL.h +ASN_MODULE_SOURCES+=NULL.c +ASN_MODULE_SOURCES+=NativeEnumerated.c +ASN_MODULE_HEADERS+=NativeInteger.h +ASN_MODULE_SOURCES+=NativeInteger.c +ASN_MODULE_HEADERS+=OBJECT_IDENTIFIER.h +ASN_MODULE_SOURCES+=OBJECT_IDENTIFIER.c +ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h +ASN_MODULE_SOURCES+=asn_SEQUENCE_OF.c +ASN_MODULE_HEADERS+=asn_SET_OF.h +ASN_MODULE_SOURCES+=asn_SET_OF.c +ASN_MODULE_HEADERS+=constr_CHOICE.h +ASN_MODULE_SOURCES+=constr_CHOICE.c +ASN_MODULE_HEADERS+=constr_SEQUENCE.h +ASN_MODULE_SOURCES+=constr_SEQUENCE.c +ASN_MODULE_HEADERS+=constr_SEQUENCE_OF.h +ASN_MODULE_SOURCES+=constr_SEQUENCE_OF.c +ASN_MODULE_HEADERS+=constr_SET_OF.h +ASN_MODULE_SOURCES+=constr_SET_OF.c +ASN_MODULE_HEADERS+=asn_application.h +ASN_MODULE_HEADERS+=asn_system.h +ASN_MODULE_HEADERS+=asn_codecs.h +ASN_MODULE_HEADERS+=asn_internal.h +ASN_MODULE_HEADERS+=OCTET_STRING.h +ASN_MODULE_SOURCES+=OCTET_STRING.c +ASN_MODULE_HEADERS+=BIT_STRING.h +ASN_MODULE_SOURCES+=BIT_STRING.c +ASN_MODULE_SOURCES+=asn_codecs_prim.c +ASN_MODULE_HEADERS+=asn_codecs_prim.h +ASN_MODULE_HEADERS+=ber_tlv_length.h +ASN_MODULE_SOURCES+=ber_tlv_length.c +ASN_MODULE_HEADERS+=ber_tlv_tag.h +ASN_MODULE_SOURCES+=ber_tlv_tag.c +ASN_MODULE_HEADERS+=ber_decoder.h +ASN_MODULE_SOURCES+=ber_decoder.c +ASN_MODULE_HEADERS+=der_encoder.h +ASN_MODULE_SOURCES+=der_encoder.c +ASN_MODULE_HEADERS+=constr_TYPE.h +ASN_MODULE_SOURCES+=constr_TYPE.c +ASN_MODULE_HEADERS+=constraints.h +ASN_MODULE_SOURCES+=constraints.c +ASN_MODULE_HEADERS+=xer_support.h +ASN_MODULE_SOURCES+=xer_support.c +ASN_MODULE_HEADERS+=xer_decoder.h +ASN_MODULE_SOURCES+=xer_decoder.c +ASN_MODULE_HEADERS+=xer_encoder.h +ASN_MODULE_SOURCES+=xer_encoder.c +ASN_MODULE_HEADERS+=per_support.h +ASN_MODULE_SOURCES+=per_support.c +ASN_MODULE_HEADERS+=per_decoder.h +ASN_MODULE_SOURCES+=per_decoder.c +ASN_MODULE_HEADERS+=per_encoder.h +ASN_MODULE_SOURCES+=per_encoder.c + + +lib_LTLIBRARIES=libsomething.la +libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) + +# This file may be used as an input for make(3) +# Remove the lines below to convert it into a pure .am file +TARGET = megacoDump +CFLAGS += -I. -DHAVE_CONFIG_H +OBJS=${ASN_MODULE_SOURCES:.c=.o} $(TARGET).o + +all: MegacoMessage.c $(TARGET) + +$(TARGET): ${OBJS} + $(CC) $(CFLAGS) -o $(TARGET) ${OBJS} $(LDFLAGS) $(LIBS) + +.SUFFIXES: +.SUFFIXES: .c .o + +.c.o: + $(CC) $(CFLAGS) -o $@ -c $< + +clean: + rm -f $(TARGET) + rm -f $(OBJS) + +regen: regenerate-from-asn1-source + +regenerate-from-asn1-source: + ../../asn1c/asn1c -fcompound-names -S ../../skeletons ../rfc3525-MEDIA-GATEWAY-CONTROL.asn1 + + +MegacoMessage.c: regenerate.Makefile + ./regenerate.Makefile + @touch MegacoMessage.c + make + +ASN_CONVERTER=../../skeletons/converter-sample.c +$(TARGET).o: $(ASN_CONVERTER) + $(CC) $(CFLAGS) -DPDU=MegacoMessage -o $(TARGET).o -c $(ASN_CONVERTER) + +distclean: clean + rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) + rm -f Makefile.am.sample diff --git a/examples/sample.source.MEGACO/README b/examples/sample.source.MEGACO/README new file mode 100644 index 000000000..fb1bfd9a4 --- /dev/null +++ b/examples/sample.source.MEGACO/README @@ -0,0 +1,20 @@ + +GENERAL INFORMATION +=================== + +The MEGACO (Media Gateway Control Protocol) PDU decoder. +Invoking `make` will compile the ASN.1 specifications from the rfc3525.txt +in the above directory. + +The ../../skeletons/converter-sample.c will supply the missing +"int main()" routine which drives the decoding process. + +megacoDump USAGE +============== + + ./megacoDump MegacoMessage.ber # Print as XML (BASIC-XER) + +The full list of recognized command line options may be obtained with + + > ./megacoDump -h + diff --git a/examples/sample.source.MEGACO/config.h b/examples/sample.source.MEGACO/config.h new file mode 100644 index 000000000..2dda9297a --- /dev/null +++ b/examples/sample.source.MEGACO/config.h @@ -0,0 +1,10 @@ + +extern int opt_debug; + +#define ASN_DEBUG(fmt, args...) do { \ + if(opt_debug < 2) break; \ + fprintf(stderr, fmt, ##args); \ + fprintf(stderr, " (%s:%d)\n", \ + __FILE__, __LINE__); \ + } while(0) + diff --git a/libasn1compiler/Makefile.in b/libasn1compiler/Makefile.in index 0d38fdb32..70e363a96 100644 --- a/libasn1compiler/Makefile.in +++ b/libasn1compiler/Makefile.in @@ -82,8 +82,6 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ -CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ -CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ diff --git a/libasn1fix/Makefile.in b/libasn1fix/Makefile.in index 43d3aad31..abae3fcb8 100644 --- a/libasn1fix/Makefile.in +++ b/libasn1fix/Makefile.in @@ -90,8 +90,6 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ -CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ -CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index a0e401a4e..99250caf1 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -89,8 +89,6 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ -CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ -CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ diff --git a/libasn1print/Makefile.in b/libasn1print/Makefile.in index 2bc160d1f..ed33fe594 100644 --- a/libasn1print/Makefile.in +++ b/libasn1print/Makefile.in @@ -80,8 +80,6 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ -CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ -CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ diff --git a/skeletons/Makefile.in b/skeletons/Makefile.in index 055250025..41cf39148 100644 --- a/skeletons/Makefile.in +++ b/skeletons/Makefile.in @@ -82,8 +82,6 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ -CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ -CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ diff --git a/skeletons/standard-modules/Makefile.in b/skeletons/standard-modules/Makefile.in index f19c5dd30..66f5f906e 100644 --- a/skeletons/standard-modules/Makefile.in +++ b/skeletons/standard-modules/Makefile.in @@ -73,8 +73,6 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ -CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ -CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ diff --git a/skeletons/tests/Makefile.in b/skeletons/tests/Makefile.in index fcc953be8..bb1fe5959 100644 --- a/skeletons/tests/Makefile.in +++ b/skeletons/tests/Makefile.in @@ -130,8 +130,6 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ -CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ -CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ diff --git a/tests/Makefile.in b/tests/Makefile.in index d2202025f..13a5f42c5 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -62,8 +62,6 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ -CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@ -CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ From b934492cdc2a338ab128cd3822b5cd691615c8ab Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 9 Sep 2006 11:06:11 +0000 Subject: [PATCH 1159/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1159 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/Makefile.am | 9 ++++++++- examples/Makefile.in | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/examples/Makefile.am b/examples/Makefile.am index a89d25e2a..6538fa161 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -10,7 +10,11 @@ ASN1_SOURCE_2 = rfc3525.txt ASN1_FILES_2 = \ rfc3525-MEDIA-GATEWAY-CONTROL.asn1 -all: $(ASN1_FILES_1) $(ASN1_FILES_2) +ASN1_SOURCE_3 = rfc4511.txt +ASN1_FILES_3 = \ + rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1.asn1 + +all: $(ASN1_FILES_1) $(ASN1_FILES_2) $(ASN_FILES_3) $(ASN1_FILES_1): crfc2asn1.pl $(ASN1_SOURCE_1) ./crfc2asn1.pl $(ASN1_SOURCE_1) @@ -18,6 +22,9 @@ $(ASN1_FILES_1): crfc2asn1.pl $(ASN1_SOURCE_1) $(ASN1_FILES_2): crfc2asn1.pl $(ASN1_SOURCE_2) ./crfc2asn1.pl $(ASN1_SOURCE_2) +$(ASN1_FILES_3): crfc2asn1.pl $(ASN1_SOURCE_3) + ./crfc2asn1.pl $(ASN1_SOURCE_3) + EXTRA_DIST = $(srcdir)/rfc*.txt \ $(srcdir)/sample.source.PKIX1/README \ $(srcdir)/sample.source.PKIX1/config.h \ diff --git a/examples/Makefile.in b/examples/Makefile.in index 267dd2101..db69c9dcc 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -172,6 +172,10 @@ ASN1_SOURCE_2 = rfc3525.txt ASN1_FILES_2 = \ rfc3525-MEDIA-GATEWAY-CONTROL.asn1 +ASN1_SOURCE_3 = rfc4511.txt +ASN1_FILES_3 = \ + rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1.asn1 + EXTRA_DIST = $(srcdir)/rfc*.txt \ $(srcdir)/sample.source.PKIX1/README \ $(srcdir)/sample.source.PKIX1/config.h \ @@ -369,7 +373,7 @@ uninstall-am: uninstall-dist_binSCRIPTS uninstall-info-am uninstall-dist_binSCRIPTS uninstall-info-am -all: $(ASN1_FILES_1) $(ASN1_FILES_2) +all: $(ASN1_FILES_1) $(ASN1_FILES_2) $(ASN_FILES_3) $(ASN1_FILES_1): crfc2asn1.pl $(ASN1_SOURCE_1) ./crfc2asn1.pl $(ASN1_SOURCE_1) @@ -377,6 +381,9 @@ $(ASN1_FILES_1): crfc2asn1.pl $(ASN1_SOURCE_1) $(ASN1_FILES_2): crfc2asn1.pl $(ASN1_SOURCE_2) ./crfc2asn1.pl $(ASN1_SOURCE_2) +$(ASN1_FILES_3): crfc2asn1.pl $(ASN1_SOURCE_3) + ./crfc2asn1.pl $(ASN1_SOURCE_3) + clean-local: cd sample.source.PKIX1 && make distclean cd sample.source.TAP3 && make distclean From 9cd2fdfe138c9b30c2e295e87a53f45a1021c2d7 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 9 Sep 2006 11:12:43 +0000 Subject: [PATCH 1160/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1160 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/Makefile.am | 17 +++++++++++++---- examples/Makefile.in | 24 +++++++++++++++++++----- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/examples/Makefile.am b/examples/Makefile.am index 6538fa161..649bd223b 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -12,7 +12,7 @@ ASN1_FILES_2 = \ ASN1_SOURCE_3 = rfc4511.txt ASN1_FILES_3 = \ - rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1.asn1 + rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1 all: $(ASN1_FILES_1) $(ASN1_FILES_2) $(ASN_FILES_3) @@ -33,11 +33,20 @@ EXTRA_DIST = $(srcdir)/rfc*.txt \ $(srcdir)/sample.source.TAP3/README \ $(srcdir)/sample.source.TAP3/config.h \ $(srcdir)/sample.source.TAP3/Makefile \ - $(srcdir)/sample.source.TAP3/regenerate.Makefile - -CLEANFILES = $(ASN1_FILES_1) + $(srcdir)/sample.source.TAP3/regenerate.Makefile \ + $(srcdir)/sample.source.MHEG5/README \ + $(srcdir)/sample.source.MHEG5/config.h \ + $(srcdir)/sample.source.MHEG5/Makefile \ + $(srcdir)/sample.source.MHEG5/regenerate.Makefile \ + $(srcdir)/sample.source.LDAP3/README \ + $(srcdir)/sample.source.LDAP3/config.h \ + $(srcdir)/sample.source.LDAP3/Makefile \ + $(srcdir)/sample.source.LDAP3/regenerate.Makefile + +CLEANFILES = $(ASN1_FILES_1) $(ASN1_FILES_2) $(ASN1_FILES_3) clean-local: cd sample.source.PKIX1 && make distclean cd sample.source.TAP3 && make distclean cd sample.source.MHEG5 && make distclean + cd sample.source.LDAP3 && make distclean diff --git a/examples/Makefile.in b/examples/Makefile.in index db69c9dcc..f7e95bd36 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -174,7 +174,7 @@ ASN1_FILES_2 = \ ASN1_SOURCE_3 = rfc4511.txt ASN1_FILES_3 = \ - rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1.asn1 + rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1 EXTRA_DIST = $(srcdir)/rfc*.txt \ $(srcdir)/sample.source.PKIX1/README \ @@ -184,9 +184,21 @@ EXTRA_DIST = $(srcdir)/rfc*.txt \ $(srcdir)/sample.source.TAP3/README \ $(srcdir)/sample.source.TAP3/config.h \ $(srcdir)/sample.source.TAP3/Makefile \ - $(srcdir)/sample.source.TAP3/regenerate.Makefile - -CLEANFILES = $(ASN1_FILES_1) + $(srcdir)/sample.source.TAP3/regenerate.Makefile \ + $(srcdir)/sample.source.MHEG5/README \ + $(srcdir)/sample.source.MHEG5/config.h \ + $(srcdir)/sample.source.MHEG5/Makefile \ + $(srcdir)/sample.source.MHEG5/regenerate.Makefile \ + $(srcdir)/sample.source.MEGACO/README \ + $(srcdir)/sample.source.MEGACO/config.h \ + $(srcdir)/sample.source.MEGACO/Makefile \ + $(srcdir)/sample.source.MEGACO/regenerate.Makefile \ + $(srcdir)/sample.source.LDAP3/README \ + $(srcdir)/sample.source.LDAP3/config.h \ + $(srcdir)/sample.source.LDAP3/Makefile \ + $(srcdir)/sample.source.LDAP3/regenerate.Makefile + +CLEANFILES = $(ASN1_FILES_1) $(ASN1_FILES_2) $(ASN1_FILES_3) all: all-am .SUFFIXES: @@ -256,7 +268,7 @@ CTAGS: distdir: $(DISTFILES) - $(mkdir_p) $(distdir)/$(srcdir) $(distdir)/$(srcdir)/sample.source.PKIX1 $(distdir)/$(srcdir)/sample.source.TAP3 + $(mkdir_p) $(distdir)/$(srcdir) $(distdir)/$(srcdir)/sample.source.LDAP3 $(distdir)/$(srcdir)/sample.source.MEGACO $(distdir)/$(srcdir)/sample.source.MHEG5 $(distdir)/$(srcdir)/sample.source.PKIX1 $(distdir)/$(srcdir)/sample.source.TAP3 @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ @@ -388,6 +400,8 @@ clean-local: cd sample.source.PKIX1 && make distclean cd sample.source.TAP3 && make distclean cd sample.source.MHEG5 && make distclean + cd sample.source.MEGACO && make distclean + cd sample.source.LDAP3 && make distclean # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: From b6873f52047e224707cb916e857aae2f7040ad35 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 9 Sep 2006 11:12:44 +0000 Subject: [PATCH 1161/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1161 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/Makefile.am | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/examples/Makefile.am b/examples/Makefile.am index 649bd223b..a73499a51 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -38,6 +38,10 @@ EXTRA_DIST = $(srcdir)/rfc*.txt \ $(srcdir)/sample.source.MHEG5/config.h \ $(srcdir)/sample.source.MHEG5/Makefile \ $(srcdir)/sample.source.MHEG5/regenerate.Makefile \ + $(srcdir)/sample.source.MEGACO/README \ + $(srcdir)/sample.source.MEGACO/config.h \ + $(srcdir)/sample.source.MEGACO/Makefile \ + $(srcdir)/sample.source.MEGACO/regenerate.Makefile \ $(srcdir)/sample.source.LDAP3/README \ $(srcdir)/sample.source.LDAP3/config.h \ $(srcdir)/sample.source.LDAP3/Makefile \ @@ -49,4 +53,5 @@ clean-local: cd sample.source.PKIX1 && make distclean cd sample.source.TAP3 && make distclean cd sample.source.MHEG5 && make distclean + cd sample.source.MEGACO && make distclean cd sample.source.LDAP3 && make distclean From b1604c7a524939d0d4b938f3f27721161b09b238 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 9 Sep 2006 11:19:13 +0000 Subject: [PATCH 1162/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1162 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/Makefile.am | 30 +++++------------------------- examples/Makefile.in | 32 ++++++-------------------------- 2 files changed, 11 insertions(+), 51 deletions(-) diff --git a/examples/Makefile.am b/examples/Makefile.am index a73499a51..27040ecb9 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -26,32 +26,12 @@ $(ASN1_FILES_3): crfc2asn1.pl $(ASN1_SOURCE_3) ./crfc2asn1.pl $(ASN1_SOURCE_3) EXTRA_DIST = $(srcdir)/rfc*.txt \ - $(srcdir)/sample.source.PKIX1/README \ - $(srcdir)/sample.source.PKIX1/config.h \ - $(srcdir)/sample.source.PKIX1/Makefile \ - $(srcdir)/sample.source.PKIX1/regenerate.Makefile \ - $(srcdir)/sample.source.TAP3/README \ - $(srcdir)/sample.source.TAP3/config.h \ - $(srcdir)/sample.source.TAP3/Makefile \ - $(srcdir)/sample.source.TAP3/regenerate.Makefile \ - $(srcdir)/sample.source.MHEG5/README \ - $(srcdir)/sample.source.MHEG5/config.h \ - $(srcdir)/sample.source.MHEG5/Makefile \ - $(srcdir)/sample.source.MHEG5/regenerate.Makefile \ - $(srcdir)/sample.source.MEGACO/README \ - $(srcdir)/sample.source.MEGACO/config.h \ - $(srcdir)/sample.source.MEGACO/Makefile \ - $(srcdir)/sample.source.MEGACO/regenerate.Makefile \ - $(srcdir)/sample.source.LDAP3/README \ - $(srcdir)/sample.source.LDAP3/config.h \ - $(srcdir)/sample.source.LDAP3/Makefile \ - $(srcdir)/sample.source.LDAP3/regenerate.Makefile + $(srcdir)/sample.source.*/README \ + $(srcdir)/sample.source.*/config.h \ + $(srcdir)/sample.source.*/Makefile \ + $(srcdir)/sample.source.*/regenerate.Makefile CLEANFILES = $(ASN1_FILES_1) $(ASN1_FILES_2) $(ASN1_FILES_3) clean-local: - cd sample.source.PKIX1 && make distclean - cd sample.source.TAP3 && make distclean - cd sample.source.MHEG5 && make distclean - cd sample.source.MEGACO && make distclean - cd sample.source.LDAP3 && make distclean + for dir in sample.source.*; do (cd $$dir && make distclean); done diff --git a/examples/Makefile.in b/examples/Makefile.in index f7e95bd36..b1499232a 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -177,26 +177,10 @@ ASN1_FILES_3 = \ rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1 EXTRA_DIST = $(srcdir)/rfc*.txt \ - $(srcdir)/sample.source.PKIX1/README \ - $(srcdir)/sample.source.PKIX1/config.h \ - $(srcdir)/sample.source.PKIX1/Makefile \ - $(srcdir)/sample.source.PKIX1/regenerate.Makefile \ - $(srcdir)/sample.source.TAP3/README \ - $(srcdir)/sample.source.TAP3/config.h \ - $(srcdir)/sample.source.TAP3/Makefile \ - $(srcdir)/sample.source.TAP3/regenerate.Makefile \ - $(srcdir)/sample.source.MHEG5/README \ - $(srcdir)/sample.source.MHEG5/config.h \ - $(srcdir)/sample.source.MHEG5/Makefile \ - $(srcdir)/sample.source.MHEG5/regenerate.Makefile \ - $(srcdir)/sample.source.MEGACO/README \ - $(srcdir)/sample.source.MEGACO/config.h \ - $(srcdir)/sample.source.MEGACO/Makefile \ - $(srcdir)/sample.source.MEGACO/regenerate.Makefile \ - $(srcdir)/sample.source.LDAP3/README \ - $(srcdir)/sample.source.LDAP3/config.h \ - $(srcdir)/sample.source.LDAP3/Makefile \ - $(srcdir)/sample.source.LDAP3/regenerate.Makefile + $(srcdir)/sample.source.*/README \ + $(srcdir)/sample.source.*/config.h \ + $(srcdir)/sample.source.*/Makefile \ + $(srcdir)/sample.source.*/regenerate.Makefile CLEANFILES = $(ASN1_FILES_1) $(ASN1_FILES_2) $(ASN1_FILES_3) all: all-am @@ -268,7 +252,7 @@ CTAGS: distdir: $(DISTFILES) - $(mkdir_p) $(distdir)/$(srcdir) $(distdir)/$(srcdir)/sample.source.LDAP3 $(distdir)/$(srcdir)/sample.source.MEGACO $(distdir)/$(srcdir)/sample.source.MHEG5 $(distdir)/$(srcdir)/sample.source.PKIX1 $(distdir)/$(srcdir)/sample.source.TAP3 + $(mkdir_p) $(distdir)/$(srcdir) $(distdir)/$(srcdir)/sample.source.* @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ @@ -397,11 +381,7 @@ $(ASN1_FILES_3): crfc2asn1.pl $(ASN1_SOURCE_3) ./crfc2asn1.pl $(ASN1_SOURCE_3) clean-local: - cd sample.source.PKIX1 && make distclean - cd sample.source.TAP3 && make distclean - cd sample.source.MHEG5 && make distclean - cd sample.source.MEGACO && make distclean - cd sample.source.LDAP3 && make distclean + for dir in sample.source.*; do (cd $$dir && make distclean); done # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: From 9e0ea0a7eac1b42f687c62d536834921b1dcdae8 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 9 Sep 2006 11:22:07 +0000 Subject: [PATCH 1163/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1163 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/Makefile.am | 2 +- examples/Makefile.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/Makefile.am b/examples/Makefile.am index 27040ecb9..c5c435e66 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -14,7 +14,7 @@ ASN1_SOURCE_3 = rfc4511.txt ASN1_FILES_3 = \ rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1 -all: $(ASN1_FILES_1) $(ASN1_FILES_2) $(ASN_FILES_3) +all: $(ASN1_FILES_1) $(ASN1_FILES_2) $(ASN1_FILES_3) $(ASN1_FILES_1): crfc2asn1.pl $(ASN1_SOURCE_1) ./crfc2asn1.pl $(ASN1_SOURCE_1) diff --git a/examples/Makefile.in b/examples/Makefile.in index b1499232a..8cb199cb5 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -369,7 +369,7 @@ uninstall-am: uninstall-dist_binSCRIPTS uninstall-info-am uninstall-dist_binSCRIPTS uninstall-info-am -all: $(ASN1_FILES_1) $(ASN1_FILES_2) $(ASN_FILES_3) +all: $(ASN1_FILES_1) $(ASN1_FILES_2) $(ASN1_FILES_3) $(ASN1_FILES_1): crfc2asn1.pl $(ASN1_SOURCE_1) ./crfc2asn1.pl $(ASN1_SOURCE_1) From 3ceb3261b3ffe73bafb4377d444f304d91f55d53 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 9 Sep 2006 11:26:09 +0000 Subject: [PATCH 1164/1469] LDAP3 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1164 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/README | 14 +- examples/crfc2asn1.pl | 15 +- examples/rfc4511.txt | 3811 +++++++++++++++++++++++++ examples/sample.source.LDAP3/Makefile | 200 ++ examples/sample.source.LDAP3/README | 20 + examples/sample.source.LDAP3/config.h | 10 + 6 files changed, 4064 insertions(+), 6 deletions(-) create mode 100644 examples/rfc4511.txt create mode 100644 examples/sample.source.LDAP3/Makefile create mode 100644 examples/sample.source.LDAP3/README create mode 100644 examples/sample.source.LDAP3/config.h diff --git a/examples/README b/examples/README index 7d1e230b6..2ce340a10 100644 --- a/examples/README +++ b/examples/README @@ -1,7 +1,8 @@ This directory contains a few examples. -1. The ./sample.source.PKIX1 directory contains the X.509 Certificate decoder. +1. The ./sample.source.PKIX1 directory contains the X.509 Certificate decoder, + as specified in rfc3280.txt. 2. The ./sample.source.TAP3 directory contains the GSM TAP3 decoder. Before trying to compile, read the README file in that directory. @@ -13,11 +14,16 @@ This directory contains a few examples. 3. The ./sample.source.MEGACO directory contains the decoder for Media Gateway Control Protocol data units as specified in rfc3525.txt. +4. The ./sample.source.LDAP3 directory contains the decoder for + Lightweight Directory Access Protocol version 3 PDU as specified in + rfc4211.txt. + The crfc2asn1.pl script can be used to extract ASN.1 data from RFC texts. -For instance, it is used to extract X.509 ASN.1 modules from PKIX1 RFC -and MEGACO ASN.1 module from rfc3525.txt. +For instance, it is used to extract X.509, MEGACO, and LDAPv3 ASN.1 modules +from the corresponding RFC texts (rfc3280.txt, rfc3525.txt, rfc4211.txt). -To regenerate the .asn1 files from the original RFC texts, do `rm *.asn1; make`. +To regenerate the .asn1 files from the original RFC texts, execute +`make clean; make` in the current directory. The clyx2asn1.pl script can be used to extract ASN.1 data from LyX editor files. diff --git a/examples/crfc2asn1.pl b/examples/crfc2asn1.pl index ecf757326..4a800f89a 100755 --- a/examples/crfc2asn1.pl +++ b/examples/crfc2asn1.pl @@ -31,7 +31,7 @@ if($inasn == 0) { # # The least correct way to find the start of ASN - # definition. + # definition. That is, to ask a user. # if(/^[ \t]*END[ \t]*(--.*)?$/) { print STDERR @@ -68,8 +68,19 @@ } } next unless $inasn; + } elsif(/^\s*DEFINITIONS\s*$/ + && $prevLine =~ /^\s*([A-Z][A-Za-z0-9-]*)\s*{[0-9a-z)( -]+}\s*$/) { + $_ = $prevLine . $prevComments . $_; + $modName = $1; + $currentFname = $rfcid . $modName. ".asn1"; + $inasn = 1; } else { - $prevLine = $_; + if(/^[ \t]*--/) { + $prevComments .= $_; + } else { + $prevComments = ''; + $prevLine = $_; + } next; } diff --git a/examples/rfc4511.txt b/examples/rfc4511.txt new file mode 100644 index 000000000..8041f3054 --- /dev/null +++ b/examples/rfc4511.txt @@ -0,0 +1,3811 @@ + + + + + + +Network Working Group J. Sermersheim, Ed. +Request for Comments: 4511 Novell, Inc. +Obsoletes: 2251, 2830, 3771 June 2006 +Category: Standards Track + + + Lightweight Directory Access Protocol (LDAP): The Protocol + +Status of This Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (2006). + +Abstract + + This document describes the protocol elements, along with their + semantics and encodings, of the Lightweight Directory Access Protocol + (LDAP). LDAP provides access to distributed directory services that + act in accordance with X.500 data and service models. These protocol + elements are based on those described in the X.500 Directory Access + Protocol (DAP). + +Table of Contents + + 1. Introduction ....................................................3 + 1.1. Relationship to Other LDAP Specifications ..................3 + 2. Conventions .....................................................3 + 3. Protocol Model ..................................................4 + 3.1. Operation and LDAP Message Layer Relationship ..............5 + 4. Elements of Protocol ............................................5 + 4.1. Common Elements ............................................5 + 4.1.1. Message Envelope ....................................6 + 4.1.2. String Types ........................................7 + 4.1.3. Distinguished Name and Relative Distinguished Name ..8 + 4.1.4. Attribute Descriptions ..............................8 + 4.1.5. Attribute Value .....................................8 + 4.1.6. Attribute Value Assertion ...........................9 + 4.1.7. Attribute and PartialAttribute ......................9 + 4.1.8. Matching Rule Identifier ...........................10 + 4.1.9. Result Message .....................................10 + 4.1.10. Referral ..........................................12 + + + +Sermersheim Standards Track [Page 1] + +RFC 4511 LDAPv3 June 2006 + + + 4.1.11. Controls ..........................................14 + 4.2. Bind Operation ............................................16 + 4.2.1. Processing of the Bind Request .....................17 + 4.2.2. Bind Response ......................................18 + 4.3. Unbind Operation ..........................................18 + 4.4. Unsolicited Notification ..................................19 + 4.4.1. Notice of Disconnection ............................19 + 4.5. Search Operation ..........................................20 + 4.5.1. Search Request .....................................20 + 4.5.2. Search Result ......................................27 + 4.5.3. Continuation References in the Search Result .......28 + 4.6. Modify Operation ..........................................31 + 4.7. Add Operation .............................................33 + 4.8. Delete Operation ..........................................34 + 4.9. Modify DN Operation .......................................34 + 4.10. Compare Operation ........................................36 + 4.11. Abandon Operation ........................................36 + 4.12. Extended Operation .......................................37 + 4.13. IntermediateResponse Message .............................39 + 4.13.1. Usage with LDAP ExtendedRequest and + ExtendedResponse ..................................40 + 4.13.2. Usage with LDAP Request Controls ..................40 + 4.14. StartTLS Operation .......................................40 + 4.14.1. StartTLS Request ..................................40 + 4.14.2. StartTLS Response .................................41 + 4.14.3. Removal of the TLS Layer ..........................41 + 5. Protocol Encoding, Connection, and Transfer ....................42 + 5.1. Protocol Encoding .........................................42 + 5.2. Transmission Control Protocol (TCP) .......................43 + 5.3. Termination of the LDAP session ...........................43 + 6. Security Considerations ........................................43 + 7. Acknowledgements ...............................................45 + 8. Normative References ...........................................46 + 9. Informative References .........................................48 + 10. IANA Considerations ...........................................48 + Appendix A. LDAP Result Codes .....................................49 + A.1. Non-Error Result Codes ....................................49 + A.2. Result Codes ..............................................49 + Appendix B. Complete ASN.1 Definition .............................54 + Appendix C. Changes ...............................................60 + C.1. Changes Made to RFC 2251 ..................................60 + C.2. Changes Made to RFC 2830 ..................................66 + C.3. Changes Made to RFC 3771 ..................................66 + + + + + + + + +Sermersheim Standards Track [Page 2] + +RFC 4511 LDAPv3 June 2006 + + +1. Introduction + + The Directory is "a collection of open systems cooperating to provide + directory services" [X.500]. A directory user, which may be a human + or other entity, accesses the Directory through a client (or + Directory User Agent (DUA)). The client, on behalf of the directory + user, interacts with one or more servers (or Directory System Agents + (DSA)). Clients interact with servers using a directory access + protocol. + + This document details the protocol elements of the Lightweight + Directory Access Protocol (LDAP), along with their semantics. + Following the description of protocol elements, it describes the way + in which the protocol elements are encoded and transferred. + +1.1. Relationship to Other LDAP Specifications + + This document is an integral part of the LDAP Technical Specification + [RFC4510], which obsoletes the previously defined LDAP technical + specification, RFC 3377, in its entirety. + + This document, together with [RFC4510], [RFC4513], and [RFC4512], + obsoletes RFC 2251 in its entirety. Section 3.3 is obsoleted by + [RFC4510]. Sections 4.2.1 (portions) and 4.2.2 are obsoleted by + [RFC4513]. Sections 3.2, 3.4, 4.1.3 (last paragraph), 4.1.4, 4.1.5, + 4.1.5.1, 4.1.9 (last paragraph), 5.1, 6.1, and 6.2 (last paragraph) + are obsoleted by [RFC4512]. The remainder of RFC 2251 is obsoleted + by this document. Appendix C.1 summarizes substantive changes in the + remainder. + + This document obsoletes RFC 2830, Sections 2 and 4. The remainder of + RFC 2830 is obsoleted by [RFC4513]. Appendix C.2 summarizes + substantive changes to the remaining sections. + + This document also obsoletes RFC 3771 in entirety. + +2. Conventions + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", and "MAY" in this document are + to be interpreted as described in [RFC2119]. + + Character names in this document use the notation for code points and + names from the Unicode Standard [Unicode]. For example, the letter + "a" may be represented as either or . + + + + + + +Sermersheim Standards Track [Page 3] + +RFC 4511 LDAPv3 June 2006 + + + Note: a glossary of terms used in Unicode can be found in [Glossary]. + Information on the Unicode character encoding model can be found in + [CharModel]. + + The term "transport connection" refers to the underlying transport + services used to carry the protocol exchange, as well as associations + established by these services. + + The term "TLS layer" refers to Transport Layer Security (TLS) + services used in providing security services, as well as associations + established by these services. + + The term "SASL layer" refers to Simply Authentication and Security + Layer (SASL) services used in providing security services, as well as + associations established by these services. + + The term "LDAP message layer" refers to the LDAP Message Protocol + Data Unit (PDU) services used in providing directory services, as + well as associations established by these services. + + The term "LDAP session" refers to combined services (transport + connection, TLS layer, SASL layer, LDAP message layer) and their + associations. + + See the table in Section 5 for an illustration of these four terms. + +3. Protocol Model + + The general model adopted by this protocol is one of clients + performing protocol operations against servers. In this model, a + client transmits a protocol request describing the operation to be + performed to a server. The server is then responsible for performing + the necessary operation(s) in the Directory. Upon completion of an + operation, the server typically returns a response containing + appropriate data to the requesting client. + + Protocol operations are generally independent of one another. Each + operation is processed as an atomic action, leaving the directory in + a consistent state. + + Although servers are required to return responses whenever such + responses are defined in the protocol, there is no requirement for + synchronous behavior on the part of either clients or servers. + Requests and responses for multiple operations generally may be + exchanged between a client and server in any order. If required, + synchronous behavior may be controlled by client applications. + + + + + +Sermersheim Standards Track [Page 4] + +RFC 4511 LDAPv3 June 2006 + + + The core protocol operations defined in this document can be mapped + to a subset of the X.500 (1993) Directory Abstract Service [X.511]. + However, there is not a one-to-one mapping between LDAP operations + and X.500 Directory Access Protocol (DAP) operations. Server + implementations acting as a gateway to X.500 directories may need to + make multiple DAP requests to service a single LDAP request. + +3.1. Operation and LDAP Message Layer Relationship + + Protocol operations are exchanged at the LDAP message layer. When + the transport connection is closed, any uncompleted operations at the + LDAP message layer are abandoned (when possible) or are completed + without transmission of the response (when abandoning them is not + possible). Also, when the transport connection is closed, the client + MUST NOT assume that any uncompleted update operations have succeeded + or failed. + +4. Elements of Protocol + + The protocol is described using Abstract Syntax Notation One + ([ASN.1]) and is transferred using a subset of ASN.1 Basic Encoding + Rules ([BER]). Section 5 specifies how the protocol elements are + encoded and transferred. + + In order to support future extensions to this protocol, extensibility + is implied where it is allowed per ASN.1 (i.e., sequence, set, + choice, and enumerated types are extensible). In addition, ellipses + (...) have been supplied in ASN.1 types that are explicitly + extensible as discussed in [RFC4520]. Because of the implied + extensibility, clients and servers MUST (unless otherwise specified) + ignore trailing SEQUENCE components whose tags they do not recognize. + + Changes to the protocol other than through the extension mechanisms + described here require a different version number. A client + indicates the version it is using as part of the BindRequest, + described in Section 4.2. If a client has not sent a Bind, the + server MUST assume the client is using version 3 or later. + + Clients may attempt to determine the protocol versions a server + supports by reading the 'supportedLDAPVersion' attribute from the + root DSE (DSA-Specific Entry) [RFC4512]. + +4.1. Common Elements + + This section describes the LDAPMessage envelope Protocol Data Unit + (PDU) format, as well as data type definitions, which are used in the + protocol operations. + + + + +Sermersheim Standards Track [Page 5] + +RFC 4511 LDAPv3 June 2006 + + +4.1.1. Message Envelope + + For the purposes of protocol exchanges, all protocol operations are + encapsulated in a common envelope, the LDAPMessage, which is defined + as follows: + + LDAPMessage ::= SEQUENCE { + messageID MessageID, + protocolOp CHOICE { + bindRequest BindRequest, + bindResponse BindResponse, + unbindRequest UnbindRequest, + searchRequest SearchRequest, + searchResEntry SearchResultEntry, + searchResDone SearchResultDone, + searchResRef SearchResultReference, + modifyRequest ModifyRequest, + modifyResponse ModifyResponse, + addRequest AddRequest, + addResponse AddResponse, + delRequest DelRequest, + delResponse DelResponse, + modDNRequest ModifyDNRequest, + modDNResponse ModifyDNResponse, + compareRequest CompareRequest, + compareResponse CompareResponse, + abandonRequest AbandonRequest, + extendedReq ExtendedRequest, + extendedResp ExtendedResponse, + ..., + intermediateResponse IntermediateResponse }, + controls [0] Controls OPTIONAL } + + MessageID ::= INTEGER (0 .. maxInt) + + maxInt INTEGER ::= 2147483647 -- (2^^31 - 1) -- + + The ASN.1 type Controls is defined in Section 4.1.11. + + The function of the LDAPMessage is to provide an envelope containing + common fields required in all protocol exchanges. At this time, the + only common fields are the messageID and the controls. + + If the server receives an LDAPMessage from the client in which the + LDAPMessage SEQUENCE tag cannot be recognized, the messageID cannot + be parsed, the tag of the protocolOp is not recognized as a request, + or the encoding structures or lengths of data fields are found to be + incorrect, then the server SHOULD return the Notice of Disconnection + + + +Sermersheim Standards Track [Page 6] + +RFC 4511 LDAPv3 June 2006 + + + described in Section 4.4.1, with the resultCode set to protocolError, + and MUST immediately terminate the LDAP session as described in + Section 5.3. + + In other cases where the client or server cannot parse an LDAP PDU, + it SHOULD abruptly terminate the LDAP session (Section 5.3) where + further communication (including providing notice) would be + pernicious. Otherwise, server implementations MUST return an + appropriate response to the request, with the resultCode set to + protocolError. + +4.1.1.1. MessageID + + All LDAPMessage envelopes encapsulating responses contain the + messageID value of the corresponding request LDAPMessage. + + The messageID of a request MUST have a non-zero value different from + the messageID of any other request in progress in the same LDAP + session. The zero value is reserved for the unsolicited notification + message. + + Typical clients increment a counter for each request. + + A client MUST NOT send a request with the same messageID as an + earlier request in the same LDAP session unless it can be determined + that the server is no longer servicing the earlier request (e.g., + after the final response is received, or a subsequent Bind + completes). Otherwise, the behavior is undefined. For this purpose, + note that Abandon and successfully abandoned operations do not send + responses. + +4.1.2. String Types + + The LDAPString is a notational convenience to indicate that, although + strings of LDAPString type encode as ASN.1 OCTET STRING types, the + [ISO10646] character set (a superset of [Unicode]) is used, encoded + following the UTF-8 [RFC3629] algorithm. Note that Unicode + characters U+0000 through U+007F are the same as ASCII 0 through 127, + respectively, and have the same single octet UTF-8 encoding. Other + Unicode characters have a multiple octet UTF-8 encoding. + + LDAPString ::= OCTET STRING -- UTF-8 encoded, + -- [ISO10646] characters + + The LDAPOID is a notational convenience to indicate that the + permitted value of this string is a (UTF-8 encoded) dotted-decimal + representation of an OBJECT IDENTIFIER. Although an LDAPOID is + + + + +Sermersheim Standards Track [Page 7] + +RFC 4511 LDAPv3 June 2006 + + + encoded as an OCTET STRING, values are limited to the definition of + given in Section 1.4 of [RFC4512]. + + LDAPOID ::= OCTET STRING -- Constrained to + -- [RFC4512] + + For example, + + 1.3.6.1.4.1.1466.1.2.3 + +4.1.3. Distinguished Name and Relative Distinguished Name + + An LDAPDN is defined to be the representation of a Distinguished Name + (DN) after encoding according to the specification in [RFC4514]. + + LDAPDN ::= LDAPString + -- Constrained to [RFC4514] + + A RelativeLDAPDN is defined to be the representation of a Relative + Distinguished Name (RDN) after encoding according to the + specification in [RFC4514]. + + RelativeLDAPDN ::= LDAPString + -- Constrained to [RFC4514] + +4.1.4. Attribute Descriptions + + The definition and encoding rules for attribute descriptions are + defined in Section 2.5 of [RFC4512]. Briefly, an attribute + description is an attribute type and zero or more options. + + AttributeDescription ::= LDAPString + -- Constrained to + -- [RFC4512] + +4.1.5. Attribute Value + + A field of type AttributeValue is an OCTET STRING containing an + encoded attribute value. The attribute value is encoded according to + the LDAP-specific encoding definition of its corresponding syntax. + The LDAP-specific encoding definitions for different syntaxes and + attribute types may be found in other documents and in particular + [RFC4517]. + + AttributeValue ::= OCTET STRING + + + + + + +Sermersheim Standards Track [Page 8] + +RFC 4511 LDAPv3 June 2006 + + + Note that there is no defined limit on the size of this encoding; + thus, protocol values may include multi-megabyte attribute values + (e.g., photographs). + + Attribute values may be defined that have arbitrary and non-printable + syntax. Implementations MUST NOT display or attempt to decode an + attribute value if its syntax is not known. The implementation may + attempt to discover the subschema of the source entry and to retrieve + the descriptions of 'attributeTypes' from it [RFC4512]. + + Clients MUST only send attribute values in a request that are valid + according to the syntax defined for the attributes. + +4.1.6. Attribute Value Assertion + + The AttributeValueAssertion (AVA) type definition is similar to the + one in the X.500 Directory standards. It contains an attribute + description and a matching rule ([RFC4512], Section 4.1.3) assertion + value suitable for that type. Elements of this type are typically + used to assert that the value in assertionValue matches a value of an + attribute. + + AttributeValueAssertion ::= SEQUENCE { + attributeDesc AttributeDescription, + assertionValue AssertionValue } + + AssertionValue ::= OCTET STRING + + The syntax of the AssertionValue depends on the context of the LDAP + operation being performed. For example, the syntax of the EQUALITY + matching rule for an attribute is used when performing a Compare + operation. Often this is the same syntax used for values of the + attribute type, but in some cases the assertion syntax differs from + the value syntax. See objectIdentiferFirstComponentMatch in + [RFC4517] for an example. + +4.1.7. Attribute and PartialAttribute + + Attributes and partial attributes consist of an attribute description + and attribute values. A PartialAttribute allows zero values, while + Attribute requires at least one value. + + PartialAttribute ::= SEQUENCE { + type AttributeDescription, + vals SET OF value AttributeValue } + + + + + + +Sermersheim Standards Track [Page 9] + +RFC 4511 LDAPv3 June 2006 + + + Attribute ::= PartialAttribute(WITH COMPONENTS { + ..., + vals (SIZE(1..MAX))}) + + No two of the attribute values may be equivalent as described by + Section 2.2 of [RFC4512]. The set of attribute values is unordered. + Implementations MUST NOT rely upon the ordering being repeatable. + +4.1.8. Matching Rule Identifier + + Matching rules are defined in Section 4.1.3 of [RFC4512]. A matching + rule is identified in the protocol by the printable representation of + either its or one of its short name descriptors + [RFC4512], e.g., 'caseIgnoreMatch' or '2.5.13.2'. + + MatchingRuleId ::= LDAPString + +4.1.9. Result Message + + The LDAPResult is the construct used in this protocol to return + success or failure indications from servers to clients. To various + requests, servers will return responses containing the elements found + in LDAPResult to indicate the final status of the protocol operation + request. + + LDAPResult ::= SEQUENCE { + resultCode ENUMERATED { + success (0), + operationsError (1), + protocolError (2), + timeLimitExceeded (3), + sizeLimitExceeded (4), + compareFalse (5), + compareTrue (6), + authMethodNotSupported (7), + strongerAuthRequired (8), + -- 9 reserved -- + referral (10), + adminLimitExceeded (11), + unavailableCriticalExtension (12), + confidentialityRequired (13), + saslBindInProgress (14), + noSuchAttribute (16), + undefinedAttributeType (17), + inappropriateMatching (18), + constraintViolation (19), + attributeOrValueExists (20), + invalidAttributeSyntax (21), + + + +Sermersheim Standards Track [Page 10] + +RFC 4511 LDAPv3 June 2006 + + + -- 22-31 unused -- + noSuchObject (32), + aliasProblem (33), + invalidDNSyntax (34), + -- 35 reserved for undefined isLeaf -- + aliasDereferencingProblem (36), + -- 37-47 unused -- + inappropriateAuthentication (48), + invalidCredentials (49), + insufficientAccessRights (50), + busy (51), + unavailable (52), + unwillingToPerform (53), + loopDetect (54), + -- 55-63 unused -- + namingViolation (64), + objectClassViolation (65), + notAllowedOnNonLeaf (66), + notAllowedOnRDN (67), + entryAlreadyExists (68), + objectClassModsProhibited (69), + -- 70 reserved for CLDAP -- + affectsMultipleDSAs (71), + -- 72-79 unused -- + other (80), + ... }, + matchedDN LDAPDN, + diagnosticMessage LDAPString, + referral [3] Referral OPTIONAL } + + The resultCode enumeration is extensible as defined in Section 3.8 of + [RFC4520]. The meanings of the listed result codes are given in + Appendix A. If a server detects multiple errors for an operation, + only one result code is returned. The server should return the + result code that best indicates the nature of the error encountered. + Servers may return substituted result codes to prevent unauthorized + disclosures. + + The diagnosticMessage field of this construct may, at the server's + option, be used to return a string containing a textual, human- + readable diagnostic message (terminal control and page formatting + characters should be avoided). As this diagnostic message is not + standardized, implementations MUST NOT rely on the values returned. + Diagnostic messages typically supplement the resultCode with + additional information. If the server chooses not to return a + textual diagnostic, the diagnosticMessage field MUST be empty. + + + + + +Sermersheim Standards Track [Page 11] + +RFC 4511 LDAPv3 June 2006 + + + For certain result codes (typically, but not restricted to + noSuchObject, aliasProblem, invalidDNSyntax, and + aliasDereferencingProblem), the matchedDN field is set (subject to + access controls) to the name of the last entry (object or alias) used + in finding the target (or base) object. This will be a truncated + form of the provided name or, if an alias was dereferenced while + attempting to locate the entry, of the resulting name. Otherwise, + the matchedDN field is empty. + +4.1.10. Referral + + The referral result code indicates that the contacted server cannot + or will not perform the operation and that one or more other servers + may be able to. Reasons for this include: + + - The target entry of the request is not held locally, but the server + has knowledge of its possible existence elsewhere. + + - The operation is restricted on this server -- perhaps due to a + read-only copy of an entry to be modified. + + The referral field is present in an LDAPResult if the resultCode is + set to referral, and it is absent with all other result codes. It + contains one or more references to one or more servers or services + that may be accessed via LDAP or other protocols. Referrals can be + returned in response to any operation request (except Unbind and + Abandon, which do not have responses). At least one URI MUST be + present in the Referral. + + During a Search operation, after the baseObject is located, and + entries are being evaluated, the referral is not returned. Instead, + continuation references, described in Section 4.5.3, are returned + when other servers would need to be contacted to complete the + operation. + + Referral ::= SEQUENCE SIZE (1..MAX) OF uri URI + + URI ::= LDAPString -- limited to characters permitted in + -- URIs + + If the client wishes to progress the operation, it contacts one of + the supported services found in the referral. If multiple URIs are + present, the client assumes that any supported URI may be used to + progress the operation. + + Clients that follow referrals MUST ensure that they do not loop + between servers. They MUST NOT repeatedly contact the same server + for the same request with the same parameters. Some clients use a + + + +Sermersheim Standards Track [Page 12] + +RFC 4511 LDAPv3 June 2006 + + + counter that is incremented each time referral handling occurs for an + operation, and these kinds of clients MUST be able to handle at least + ten nested referrals while progressing the operation. + + A URI for a server implementing LDAP and accessible via TCP/IP (v4 or + v6) [RFC793][RFC791] is written as an LDAP URL according to + [RFC4516]. + + Referral values that are LDAP URLs follow these rules: + + - If an alias was dereferenced, the part of the LDAP URL MUST be + present, with the new target object name. + + - It is RECOMMENDED that the part be present to avoid ambiguity. + + - If the part is present, the client uses this name in its next + request to progress the operation, and if it is not present the + client uses the same name as in the original request. + + - Some servers (e.g., participating in distributed indexing) may + provide a different filter in a URL of a referral for a Search + operation. + + - If the part of the LDAP URL is present, the client uses + this filter in its next request to progress this Search, and if it + is not present the client uses the same filter as it used for that + Search. + + - For Search, it is RECOMMENDED that the part be present to + avoid ambiguity. + + - If the part is missing, the scope of the original Search is + used by the client to progress the operation. + + - Other aspects of the new request may be the same as or different + from the request that generated the referral. + + Other kinds of URIs may be returned. The syntax and semantics of + such URIs is left to future specifications. Clients may ignore URIs + that they do not support. + + UTF-8 encoded characters appearing in the string representation of a + DN, search filter, or other fields of the referral value may not be + legal for URIs (e.g., spaces) and MUST be escaped using the % method + in [RFC3986]. + + + + + + +Sermersheim Standards Track [Page 13] + +RFC 4511 LDAPv3 June 2006 + + +4.1.11. Controls + + Controls provide a mechanism whereby the semantics and arguments of + existing LDAP operations may be extended. One or more controls may + be attached to a single LDAP message. A control only affects the + semantics of the message it is attached to. + + Controls sent by clients are termed 'request controls', and those + sent by servers are termed 'response controls'. + + Controls ::= SEQUENCE OF control Control + + Control ::= SEQUENCE { + controlType LDAPOID, + criticality BOOLEAN DEFAULT FALSE, + controlValue OCTET STRING OPTIONAL } + + The controlType field is the dotted-decimal representation of an + OBJECT IDENTIFIER that uniquely identifies the control. This + provides unambiguous naming of controls. Often, response control(s) + solicited by a request control share controlType values with the + request control. + + The criticality field only has meaning in controls attached to + request messages (except UnbindRequest). For controls attached to + response messages and the UnbindRequest, the criticality field SHOULD + be FALSE, and MUST be ignored by the receiving protocol peer. A + value of TRUE indicates that it is unacceptable to perform the + operation without applying the semantics of the control. + Specifically, the criticality field is applied as follows: + + - If the server does not recognize the control type, determines that + it is not appropriate for the operation, or is otherwise unwilling + to perform the operation with the control, and if the criticality + field is TRUE, the server MUST NOT perform the operation, and for + operations that have a response message, it MUST return with the + resultCode set to unavailableCriticalExtension. + + - If the server does not recognize the control type, determines that + it is not appropriate for the operation, or is otherwise unwilling + to perform the operation with the control, and if the criticality + field is FALSE, the server MUST ignore the control. + + - Regardless of criticality, if a control is applied to an + operation, it is applied consistently and impartially to the + entire operation. + + + + + +Sermersheim Standards Track [Page 14] + +RFC 4511 LDAPv3 June 2006 + + + The controlValue may contain information associated with the + controlType. Its format is defined by the specification of the + control. Implementations MUST be prepared to handle arbitrary + contents of the controlValue octet string, including zero bytes. It + is absent only if there is no value information that is associated + with a control of its type. When a controlValue is defined in terms + of ASN.1, and BER-encoded according to Section 5.1, it also follows + the extensibility rules in Section 4. + + Servers list the controlType of request controls they recognize in + the 'supportedControl' attribute in the root DSE (Section 5.1 of + [RFC4512]). + + Controls SHOULD NOT be combined unless the semantics of the + combination has been specified. The semantics of control + combinations, if specified, are generally found in the control + specification most recently published. When a combination of + controls is encountered whose semantics are invalid, not specified + (or not known), the message is considered not well-formed; thus, the + operation fails with protocolError. Controls with a criticality of + FALSE may be ignored in order to arrive at a valid combination. + Additionally, unless order-dependent semantics are given in a + specification, the order of a combination of controls in the SEQUENCE + is ignored. Where the order is to be ignored but cannot be ignored + by the server, the message is considered not well-formed, and the + operation fails with protocolError. Again, controls with a + criticality of FALSE may be ignored in order to arrive at a valid + combination. + + This document does not specify any controls. Controls may be + specified in other documents. Documents detailing control extensions + are to provide for each control: + + - the OBJECT IDENTIFIER assigned to the control, + + - direction as to what value the sender should provide for the + criticality field (note: the semantics of the criticality field are + defined above should not be altered by the control's + specification), + + - whether the controlValue field is present, and if so, the format of + its contents, + + - the semantics of the control, and + + - optionally, semantics regarding the combination of the control with + other controls. + + + + +Sermersheim Standards Track [Page 15] + +RFC 4511 LDAPv3 June 2006 + + +4.2. Bind Operation + + The function of the Bind operation is to allow authentication + information to be exchanged between the client and server. The Bind + operation should be thought of as the "authenticate" operation. + Operational, authentication, and security-related semantics of this + operation are given in [RFC4513]. + + The Bind request is defined as follows: + + BindRequest ::= [APPLICATION 0] SEQUENCE { + version INTEGER (1 .. 127), + name LDAPDN, + authentication AuthenticationChoice } + + AuthenticationChoice ::= CHOICE { + simple [0] OCTET STRING, + -- 1 and 2 reserved + sasl [3] SaslCredentials, + ... } + + SaslCredentials ::= SEQUENCE { + mechanism LDAPString, + credentials OCTET STRING OPTIONAL } + + Fields of the BindRequest are: + + - version: A version number indicating the version of the protocol to + be used at the LDAP message layer. This document describes version + 3 of the protocol. There is no version negotiation. The client + sets this field to the version it desires. If the server does not + support the specified version, it MUST respond with a BindResponse + where the resultCode is set to protocolError. + + - name: If not empty, the name of the Directory object that the + client wishes to bind as. This field may take on a null value (a + zero-length string) for the purposes of anonymous binds ([RFC4513], + Section 5.1) or when using SASL [RFC4422] authentication + ([RFC4513], Section 5.2). Where the server attempts to locate the + named object, it SHALL NOT perform alias dereferencing. + + - authentication: Information used in authentication. This type is + extensible as defined in Section 3.7 of [RFC4520]. Servers that do + not support a choice supplied by a client return a BindResponse + with the resultCode set to authMethodNotSupported. + + + + + + +Sermersheim Standards Track [Page 16] + +RFC 4511 LDAPv3 June 2006 + + + Textual passwords (consisting of a character sequence with a known + character set and encoding) transferred to the server using the + simple AuthenticationChoice SHALL be transferred as UTF-8 [RFC3629] + encoded [Unicode]. Prior to transfer, clients SHOULD prepare text + passwords as "query" strings by applying the SASLprep [RFC4013] + profile of the stringprep [RFC3454] algorithm. Passwords + consisting of other data (such as random octets) MUST NOT be + altered. The determination of whether a password is textual is a + local client matter. + +4.2.1. Processing of the Bind Request + + Before processing a BindRequest, all uncompleted operations MUST + either complete or be abandoned. The server may either wait for the + uncompleted operations to complete, or abandon them. The server then + proceeds to authenticate the client in either a single-step or + multi-step Bind process. Each step requires the server to return a + BindResponse to indicate the status of authentication. + + After sending a BindRequest, clients MUST NOT send further LDAP PDUs + until receiving the BindResponse. Similarly, servers SHOULD NOT + process or respond to requests received while processing a + BindRequest. + + If the client did not bind before sending a request and receives an + operationsError to that request, it may then send a BindRequest. If + this also fails or the client chooses not to bind on the existing + LDAP session, it may terminate the LDAP session, re-establish it, and + begin again by first sending a BindRequest. This will aid in + interoperating with servers implementing other versions of LDAP. + + Clients may send multiple Bind requests to change the authentication + and/or security associations or to complete a multi-stage Bind + process. Authentication from earlier binds is subsequently ignored. + + For some SASL authentication mechanisms, it may be necessary for the + client to invoke the BindRequest multiple times ([RFC4513], Section + 5.2). Clients MUST NOT invoke operations between two Bind requests + made as part of a multi-stage Bind. + + A client may abort a SASL bind negotiation by sending a BindRequest + with a different value in the mechanism field of SaslCredentials, or + an AuthenticationChoice other than sasl. + + + + + + + + +Sermersheim Standards Track [Page 17] + +RFC 4511 LDAPv3 June 2006 + + + If the client sends a BindRequest with the sasl mechanism field as an + empty string, the server MUST return a BindResponse with the + resultCode set to authMethodNotSupported. This will allow the client + to abort a negotiation if it wishes to try again with the same SASL + mechanism. + +4.2.2. Bind Response + + The Bind response is defined as follows. + + BindResponse ::= [APPLICATION 1] SEQUENCE { + COMPONENTS OF LDAPResult, + serverSaslCreds [7] OCTET STRING OPTIONAL } + + BindResponse consists simply of an indication from the server of the + status of the client's request for authentication. + + A successful Bind operation is indicated by a BindResponse with a + resultCode set to success. Otherwise, an appropriate result code is + set in the BindResponse. For BindResponse, the protocolError result + code may be used to indicate that the version number supplied by the + client is unsupported. + + If the client receives a BindResponse where the resultCode is set to + protocolError, it is to assume that the server does not support this + version of LDAP. While the client may be able proceed with another + version of this protocol (which may or may not require closing and + re-establishing the transport connection), how to proceed with + another version of this protocol is beyond the scope of this + document. Clients that are unable or unwilling to proceed SHOULD + terminate the LDAP session. + + The serverSaslCreds field is used as part of a SASL-defined bind + mechanism to allow the client to authenticate the server to which it + is communicating, or to perform "challenge-response" authentication. + If the client bound with the simple choice, or the SASL mechanism + does not require the server to return information to the client, then + this field SHALL NOT be included in the BindResponse. + +4.3. Unbind Operation + + The function of the Unbind operation is to terminate an LDAP session. + The Unbind operation is not the antithesis of the Bind operation as + the name implies. The naming of these operations are historical. + The Unbind operation should be thought of as the "quit" operation. + + + + + + +Sermersheim Standards Track [Page 18] + +RFC 4511 LDAPv3 June 2006 + + + The Unbind operation is defined as follows: + + UnbindRequest ::= [APPLICATION 2] NULL + + The client, upon transmission of the UnbindRequest, and the server, + upon receipt of the UnbindRequest, are to gracefully terminate the + LDAP session as described in Section 5.3. Uncompleted operations are + handled as specified in Section 3.1. + +4.4. Unsolicited Notification + + An unsolicited notification is an LDAPMessage sent from the server to + the client that is not in response to any LDAPMessage received by the + server. It is used to signal an extraordinary condition in the + server or in the LDAP session between the client and the server. The + notification is of an advisory nature, and the server will not expect + any response to be returned from the client. + + The unsolicited notification is structured as an LDAPMessage in which + the messageID is zero and protocolOp is set to the extendedResp + choice using the ExtendedResponse type (See Section 4.12). The + responseName field of the ExtendedResponse always contains an LDAPOID + that is unique for this notification. + + One unsolicited notification (Notice of Disconnection) is defined in + this document. The specification of an unsolicited notification + consists of: + + - the OBJECT IDENTIFIER assigned to the notification (to be specified + in the responseName, + + - the format of the contents of the responseValue (if any), + + - the circumstances which will cause the notification to be sent, and + + - the semantics of the message. + +4.4.1. Notice of Disconnection + + This notification may be used by the server to advise the client that + the server is about to terminate the LDAP session on its own + initiative. This notification is intended to assist clients in + distinguishing between an exceptional server condition and a + transient network failure. Note that this notification is not a + response to an Unbind requested by the client. Uncompleted + operations are handled as specified in Section 3.1. + + + + + +Sermersheim Standards Track [Page 19] + +RFC 4511 LDAPv3 June 2006 + + + The responseName is 1.3.6.1.4.1.1466.20036, the responseValue field + is absent, and the resultCode is used to indicate the reason for the + disconnection. When the strongerAuthRequired resultCode is returned + with this message, it indicates that the server has detected that an + established security association between the client and server has + unexpectedly failed or been compromised. + + Upon transmission of the Notice of Disconnection, the server + gracefully terminates the LDAP session as described in Section 5.3. + +4.5. Search Operation + + The Search operation is used to request a server to return, subject + to access controls and other restrictions, a set of entries matching + a complex search criterion. This can be used to read attributes from + a single entry, from entries immediately subordinate to a particular + entry, or from a whole subtree of entries. + +4.5.1. Search Request + + The Search request is defined as follows: + + SearchRequest ::= [APPLICATION 3] SEQUENCE { + baseObject LDAPDN, + scope ENUMERATED { + baseObject (0), + singleLevel (1), + wholeSubtree (2), + ... }, + derefAliases ENUMERATED { + neverDerefAliases (0), + derefInSearching (1), + derefFindingBaseObj (2), + derefAlways (3) }, + sizeLimit INTEGER (0 .. maxInt), + timeLimit INTEGER (0 .. maxInt), + typesOnly BOOLEAN, + filter Filter, + attributes AttributeSelection } + + AttributeSelection ::= SEQUENCE OF selector LDAPString + -- The LDAPString is constrained to + -- in Section 4.5.1.8 + + Filter ::= CHOICE { + and [0] SET SIZE (1..MAX) OF filter Filter, + or [1] SET SIZE (1..MAX) OF filter Filter, + not [2] Filter, + + + +Sermersheim Standards Track [Page 20] + +RFC 4511 LDAPv3 June 2006 + + + equalityMatch [3] AttributeValueAssertion, + substrings [4] SubstringFilter, + greaterOrEqual [5] AttributeValueAssertion, + lessOrEqual [6] AttributeValueAssertion, + present [7] AttributeDescription, + approxMatch [8] AttributeValueAssertion, + extensibleMatch [9] MatchingRuleAssertion, + ... } + + SubstringFilter ::= SEQUENCE { + type AttributeDescription, + substrings SEQUENCE SIZE (1..MAX) OF substring CHOICE { + initial [0] AssertionValue, -- can occur at most once + any [1] AssertionValue, + final [2] AssertionValue } -- can occur at most once + } + + MatchingRuleAssertion ::= SEQUENCE { + matchingRule [1] MatchingRuleId OPTIONAL, + type [2] AttributeDescription OPTIONAL, + matchValue [3] AssertionValue, + dnAttributes [4] BOOLEAN DEFAULT FALSE } + + Note that an X.500 "list"-like operation can be emulated by the + client requesting a singleLevel Search operation with a filter + checking for the presence of the 'objectClass' attribute, and that an + X.500 "read"-like operation can be emulated by a baseObject Search + operation with the same filter. A server that provides a gateway to + X.500 is not required to use the Read or List operations, although it + may choose to do so, and if it does, it must provide the same + semantics as the X.500 Search operation. + +4.5.1.1. SearchRequest.baseObject + + The name of the base object entry (or possibly the root) relative to + which the Search is to be performed. + +4.5.1.2. SearchRequest.scope + + Specifies the scope of the Search to be performed. The semantics (as + described in [X.511]) of the defined values of this field are: + + baseObject: The scope is constrained to the entry named by + baseObject. + + singleLevel: The scope is constrained to the immediate + subordinates of the entry named by baseObject. + + + + +Sermersheim Standards Track [Page 21] + +RFC 4511 LDAPv3 June 2006 + + + wholeSubtree: The scope is constrained to the entry named by + baseObject and to all its subordinates. + +4.5.1.3. SearchRequest.derefAliases + + An indicator as to whether or not alias entries (as defined in + [RFC4512]) are to be dereferenced during stages of the Search + operation. + + The act of dereferencing an alias includes recursively dereferencing + aliases that refer to aliases. + + Servers MUST detect looping while dereferencing aliases in order to + prevent denial-of-service attacks of this nature. + + The semantics of the defined values of this field are: + + neverDerefAliases: Do not dereference aliases in searching or in + locating the base object of the Search. + + derefInSearching: While searching subordinates of the base object, + dereference any alias within the search scope. Dereferenced + objects become the vertices of further search scopes where the + Search operation is also applied. If the search scope is + wholeSubtree, the Search continues in the subtree(s) of any + dereferenced object. If the search scope is singleLevel, the + search is applied to any dereferenced objects and is not applied + to their subordinates. Servers SHOULD eliminate duplicate entries + that arise due to alias dereferencing while searching. + + derefFindingBaseObj: Dereference aliases in locating the base + object of the Search, but not when searching subordinates of the + base object. + + derefAlways: Dereference aliases both in searching and in locating + the base object of the Search. + +4.5.1.4. SearchRequest.sizeLimit + + A size limit that restricts the maximum number of entries to be + returned as a result of the Search. A value of zero in this field + indicates that no client-requested size limit restrictions are in + effect for the Search. Servers may also enforce a maximum number of + entries to return. + + + + + + + +Sermersheim Standards Track [Page 22] + +RFC 4511 LDAPv3 June 2006 + + +4.5.1.5. SearchRequest.timeLimit + + A time limit that restricts the maximum time (in seconds) allowed for + a Search. A value of zero in this field indicates that no client- + requested time limit restrictions are in effect for the Search. + Servers may also enforce a maximum time limit for the Search. + +4.5.1.6. SearchRequest.typesOnly + + An indicator as to whether Search results are to contain both + attribute descriptions and values, or just attribute descriptions. + Setting this field to TRUE causes only attribute descriptions (and + not values) to be returned. Setting this field to FALSE causes both + attribute descriptions and values to be returned. + +4.5.1.7. SearchRequest.filter + + A filter that defines the conditions that must be fulfilled in order + for the Search to match a given entry. + + The 'and', 'or', and 'not' choices can be used to form combinations + of filters. At least one filter element MUST be present in an 'and' + or 'or' choice. The others match against individual attribute values + of entries in the scope of the Search. (Implementor's note: the + 'not' filter is an example of a tagged choice in an implicitly-tagged + module. In BER this is treated as if the tag were explicit.) + + A server MUST evaluate filters according to the three-valued logic of + [X.511] (1993), Clause 7.8.1. In summary, a filter is evaluated to + "TRUE", "FALSE", or "Undefined". If the filter evaluates to TRUE for + a particular entry, then the attributes of that entry are returned as + part of the Search result (subject to any applicable access control + restrictions). If the filter evaluates to FALSE or Undefined, then + the entry is ignored for the Search. + + A filter of the "and" choice is TRUE if all the filters in the SET OF + evaluate to TRUE, FALSE if at least one filter is FALSE, and + Undefined otherwise. A filter of the "or" choice is FALSE if all the + filters in the SET OF evaluate to FALSE, TRUE if at least one filter + is TRUE, and Undefined otherwise. A filter of the 'not' choice is + TRUE if the filter being negated is FALSE, FALSE if it is TRUE, and + Undefined if it is Undefined. + + A filter item evaluates to Undefined when the server would not be + able to determine whether the assertion value matches an entry. + Examples include: + + + + + +Sermersheim Standards Track [Page 23] + +RFC 4511 LDAPv3 June 2006 + + + - An attribute description in an equalityMatch, substrings, + greaterOrEqual, lessOrEqual, approxMatch, or extensibleMatch filter + is not recognized by the server. + + - The attribute type does not define the appropriate matching rule. + + - A MatchingRuleId in the extensibleMatch is not recognized by the + server or is not valid for the attribute type. + + - The type of filtering requested is not implemented. + + - The assertion value is invalid. + + For example, if a server did not recognize the attribute type + shoeSize, the filters (shoeSize=*), (shoeSize=12), (shoeSize>=12), + and (shoeSize<=12) would each evaluate to Undefined. + + Servers MUST NOT return errors if attribute descriptions or matching + rule ids are not recognized, assertion values are invalid, or the + assertion syntax is not supported. More details of filter processing + are given in Clause 7.8 of [X.511]. + +4.5.1.7.1. SearchRequest.filter.equalityMatch + + The matching rule for an equalityMatch filter is defined by the + EQUALITY matching rule for the attribute type or subtype. The filter + is TRUE when the EQUALITY rule returns TRUE as applied to the + attribute or subtype and the asserted value. + +4.5.1.7.2. SearchRequest.filter.substrings + + There SHALL be at most one 'initial' and at most one 'final' in the + 'substrings' of a SubstringFilter. If 'initial' is present, it SHALL + be the first element of 'substrings'. If 'final' is present, it + SHALL be the last element of 'substrings'. + + The matching rule for an AssertionValue in a substrings filter item + is defined by the SUBSTR matching rule for the attribute type or + subtype. The filter is TRUE when the SUBSTR rule returns TRUE as + applied to the attribute or subtype and the asserted value. + + Note that the AssertionValue in a substrings filter item conforms to + the assertion syntax of the EQUALITY matching rule for the attribute + type rather than to the assertion syntax of the SUBSTR matching rule + for the attribute type. Conceptually, the entire SubstringFilter is + converted into an assertion value of the substrings matching rule + prior to applying the rule. + + + + +Sermersheim Standards Track [Page 24] + +RFC 4511 LDAPv3 June 2006 + + +4.5.1.7.3. SearchRequest.filter.greaterOrEqual + + The matching rule for a greaterOrEqual filter is defined by the + ORDERING matching rule for the attribute type or subtype. The filter + is TRUE when the ORDERING rule returns FALSE as applied to the + attribute or subtype and the asserted value. + +4.5.1.7.4. SearchRequest.filter.lessOrEqual + + The matching rules for a lessOrEqual filter are defined by the + ORDERING and EQUALITY matching rules for the attribute type or + subtype. The filter is TRUE when either the ORDERING or EQUALITY + rule returns TRUE as applied to the attribute or subtype and the + asserted value. + +4.5.1.7.5. SearchRequest.filter.present + + A present filter is TRUE when there is an attribute or subtype of the + specified attribute description present in an entry, FALSE when no + attribute or subtype of the specified attribute description is + present in an entry, and Undefined otherwise. + +4.5.1.7.6. SearchRequest.filter.approxMatch + + An approxMatch filter is TRUE when there is a value of the attribute + type or subtype for which some locally-defined approximate matching + algorithm (e.g., spelling variations, phonetic match, etc.) returns + TRUE. If a value matches for equality, it also satisfies an + approximate match. If approximate matching is not supported for the + attribute, this filter item should be treated as an equalityMatch. + +4.5.1.7.7. SearchRequest.filter.extensibleMatch + + The fields of the extensibleMatch filter item are evaluated as + follows: + + - If the matchingRule field is absent, the type field MUST be + present, and an equality match is performed for that type. + + - If the type field is absent and the matchingRule is present, the + matchValue is compared against all attributes in an entry that + support that matchingRule. + + - If the type field is present and the matchingRule is present, the + matchValue is compared against the specified attribute type and its + subtypes. + + + + + +Sermersheim Standards Track [Page 25] + +RFC 4511 LDAPv3 June 2006 + + + - If the dnAttributes field is set to TRUE, the match is additionally + applied against all the AttributeValueAssertions in an entry's + distinguished name, and it evaluates to TRUE if there is at least + one attribute or subtype in the distinguished name for which the + filter item evaluates to TRUE. The dnAttributes field is present + to alleviate the need for multiple versions of generic matching + rules (such as word matching), where one applies to entries and + another applies to entries and DN attributes as well. + + The matchingRule used for evaluation determines the syntax for the + assertion value. Once the matchingRule and attribute(s) have been + determined, the filter item evaluates to TRUE if it matches at least + one attribute type or subtype in the entry, FALSE if it does not + match any attribute type or subtype in the entry, and Undefined if + the matchingRule is not recognized, the matchingRule is unsuitable + for use with the specified type, or the assertionValue is invalid. + +4.5.1.8. SearchRequest.attributes + + A selection list of the attributes to be returned from each entry + that matches the search filter. Attributes that are subtypes of + listed attributes are implicitly included. LDAPString values of this + field are constrained to the following Augmented Backus-Naur Form + (ABNF) [RFC4234]: + + attributeSelector = attributedescription / selectorspecial + + selectorspecial = noattrs / alluserattrs + + noattrs = %x31.2E.31 ; "1.1" + + alluserattrs = %x2A ; asterisk ("*") + + The production is defined in Section 2.5 of + [RFC4512]. + + There are three special cases that may appear in the attributes + selection list: + + 1. An empty list with no attributes requests the return of all + user attributes. + + 2. A list containing "*" (with zero or more attribute + descriptions) requests the return of all user attributes in + addition to other listed (operational) attributes. + + + + + + +Sermersheim Standards Track [Page 26] + +RFC 4511 LDAPv3 June 2006 + + + 3. A list containing only the OID "1.1" indicates that no + attributes are to be returned. If "1.1" is provided with other + attributeSelector values, the "1.1" attributeSelector is + ignored. This OID was chosen because it does not (and can not) + correspond to any attribute in use. + + Client implementors should note that even if all user attributes are + requested, some attributes and/or attribute values of the entry may + not be included in Search results due to access controls or other + restrictions. Furthermore, servers will not return operational + attributes, such as objectClasses or attributeTypes, unless they are + listed by name. Operational attributes are described in [RFC4512]. + + Attributes are returned at most once in an entry. If an attribute + description is named more than once in the list, the subsequent names + are ignored. If an attribute description in the list is not + recognized, it is ignored by the server. + +4.5.2. Search Result + + The results of the Search operation are returned as zero or more + SearchResultEntry and/or SearchResultReference messages, followed by + a single SearchResultDone message. + + SearchResultEntry ::= [APPLICATION 4] SEQUENCE { + objectName LDAPDN, + attributes PartialAttributeList } + + PartialAttributeList ::= SEQUENCE OF + partialAttribute PartialAttribute + + SearchResultReference ::= [APPLICATION 19] SEQUENCE + SIZE (1..MAX) OF uri URI + + SearchResultDone ::= [APPLICATION 5] LDAPResult + + Each SearchResultEntry represents an entry found during the Search. + Each SearchResultReference represents an area not yet explored during + the Search. The SearchResultEntry and SearchResultReference messages + may come in any order. Following all the SearchResultReference and + SearchResultEntry responses, the server returns a SearchResultDone + response, which contains an indication of success or details any + errors that have occurred. + + Each entry returned in a SearchResultEntry will contain all + appropriate attributes as specified in the attributes field of the + Search Request, subject to access control and other administrative + policy. Note that the PartialAttributeList may hold zero elements. + + + +Sermersheim Standards Track [Page 27] + +RFC 4511 LDAPv3 June 2006 + + + This may happen when none of the attributes of an entry were + requested or could be returned. Note also that the partialAttribute + vals set may hold zero elements. This may happen when typesOnly is + requested, access controls prevent the return of values, or other + reasons. + + Some attributes may be constructed by the server and appear in a + SearchResultEntry attribute list, although they are not stored + attributes of an entry. Clients SHOULD NOT assume that all + attributes can be modified, even if this is permitted by access + control. + + If the server's schema defines short names [RFC4512] for an attribute + type, then the server SHOULD use one of those names in attribute + descriptions for that attribute type (in preference to using the + [RFC4512] format of the attribute type's object + identifier). The server SHOULD NOT use the short name if that name + is known by the server to be ambiguous, or if it is otherwise likely + to cause interoperability problems. + +4.5.3. Continuation References in the Search Result + + If the server was able to locate the entry referred to by the + baseObject but was unable or unwilling to search one or more non- + local entries, the server may return one or more + SearchResultReference messages, each containing a reference to + another set of servers for continuing the operation. A server MUST + NOT return any SearchResultReference messages if it has not located + the baseObject and thus has not searched any entries. In this case, + it would return a SearchResultDone containing either a referral or + noSuchObject result code (depending on the server's knowledge of the + entry named in the baseObject). + + If a server holds a copy or partial copy of the subordinate naming + context (Section 5 of [RFC4512]), it may use the search filter to + determine whether or not to return a SearchResultReference response. + Otherwise, SearchResultReference responses are always returned when + in scope. + + The SearchResultReference is of the same data type as the Referral. + + If the client wishes to progress the Search, it issues a new Search + operation for each SearchResultReference that is returned. If + multiple URIs are present, the client assumes that any supported URI + may be used to progress the operation. + + + + + + +Sermersheim Standards Track [Page 28] + +RFC 4511 LDAPv3 June 2006 + + + Clients that follow search continuation references MUST ensure that + they do not loop between servers. They MUST NOT repeatedly contact + the same server for the same request with the same parameters. Some + clients use a counter that is incremented each time search result + reference handling occurs for an operation, and these kinds of + clients MUST be able to handle at least ten nested referrals while + progressing the operation. + + Note that the Abandon operation described in Section 4.11 applies + only to a particular operation sent at the LDAP message layer between + a client and server. The client must individually abandon subsequent + Search operations it wishes to. + + A URI for a server implementing LDAP and accessible via TCP/IP (v4 or + v6) [RFC793][RFC791] is written as an LDAP URL according to + [RFC4516]. + + SearchResultReference values that are LDAP URLs follow these rules: + + - The part of the LDAP URL MUST be present, with the new target + object name. The client uses this name when following the + reference. + + - Some servers (e.g., participating in distributed indexing) may + provide a different filter in the LDAP URL. + + - If the part of the LDAP URL is present, the client uses + this filter in its next request to progress this Search, and if it + is not present the client uses the same filter as it used for that + Search. + + - If the originating search scope was singleLevel, the part + of the LDAP URL will be "base". + + - It is RECOMMENDED that the part be present to avoid + ambiguity. In the absence of a part, the scope of the + original Search request is assumed. + + - Other aspects of the new Search request may be the same as or + different from the Search request that generated the + SearchResultReference. + + - The name of an unexplored subtree in a SearchResultReference need + not be subordinate to the base object. + + Other kinds of URIs may be returned. The syntax and semantics of + such URIs is left to future specifications. Clients may ignore URIs + that they do not support. + + + +Sermersheim Standards Track [Page 29] + +RFC 4511 LDAPv3 June 2006 + + + UTF-8-encoded characters appearing in the string representation of a + DN, search filter, or other fields of the referral value may not be + legal for URIs (e.g., spaces) and MUST be escaped using the % method + in [RFC3986]. + +4.5.3.1. Examples + + For example, suppose the contacted server (hosta) holds the entry + and the entry . It + knows that both LDAP servers (hostb) and (hostc) hold + (one is the master and the other server + a shadow), and that LDAP-capable server (hostd) holds the subtree + . If a wholeSubtree Search of + is requested to the contacted server, it may + return the following: + + SearchResultEntry for DC=Example,DC=NET + SearchResultEntry for CN=Manager,DC=Example,DC=NET + SearchResultReference { + ldap://hostb/OU=People,DC=Example,DC=NET??sub + ldap://hostc/OU=People,DC=Example,DC=NET??sub } + SearchResultReference { + ldap://hostd/OU=Roles,DC=Example,DC=NET??sub } + SearchResultDone (success) + + Client implementors should note that when following a + SearchResultReference, additional SearchResultReference may be + generated. Continuing the example, if the client contacted the + server (hostb) and issued the Search request for the subtree + , the server might respond as follows: + + SearchResultEntry for OU=People,DC=Example,DC=NET + SearchResultReference { + ldap://hoste/OU=Managers,OU=People,DC=Example,DC=NET??sub } + SearchResultReference { + ldap://hostf/OU=Consultants,OU=People,DC=Example,DC=NET??sub } + SearchResultDone (success) + + Similarly, if a singleLevel Search of is + requested to the contacted server, it may return the following: + + SearchResultEntry for CN=Manager,DC=Example,DC=NET + SearchResultReference { + ldap://hostb/OU=People,DC=Example,DC=NET??base + ldap://hostc/OU=People,DC=Example,DC=NET??base } + SearchResultReference { + ldap://hostd/OU=Roles,DC=Example,DC=NET??base } + SearchResultDone (success) + + + +Sermersheim Standards Track [Page 30] + +RFC 4511 LDAPv3 June 2006 + + + If the contacted server does not hold the base object for the Search, + but has knowledge of its possible location, then it may return a + referral to the client. In this case, if the client requests a + subtree Search of to hosta, the server returns a + SearchResultDone containing a referral. + + SearchResultDone (referral) { + ldap://hostg/DC=Example,DC=ORG??sub } + +4.6. Modify Operation + + The Modify operation allows a client to request that a modification + of an entry be performed on its behalf by a server. The Modify + Request is defined as follows: + + ModifyRequest ::= [APPLICATION 6] SEQUENCE { + object LDAPDN, + changes SEQUENCE OF change SEQUENCE { + operation ENUMERATED { + add (0), + delete (1), + replace (2), + ... }, + modification PartialAttribute } } + + Fields of the Modify Request are: + + - object: The value of this field contains the name of the entry to + be modified. The server SHALL NOT perform any alias dereferencing + in determining the object to be modified. + + - changes: A list of modifications to be performed on the entry. The + entire list of modifications MUST be performed in the order they + are listed as a single atomic operation. While individual + modifications may violate certain aspects of the directory schema + (such as the object class definition and Directory Information Tree + (DIT) content rule), the resulting entry after the entire list of + modifications is performed MUST conform to the requirements of the + directory model and controlling schema [RFC4512]. + + - operation: Used to specify the type of modification being + performed. Each operation type acts on the following + modification. The values of this field have the following + semantics, respectively: + + add: add values listed to the modification attribute, + creating the attribute if necessary. + + + + +Sermersheim Standards Track [Page 31] + +RFC 4511 LDAPv3 June 2006 + + + delete: delete values listed from the modification attribute. + If no values are listed, or if all current values of the + attribute are listed, the entire attribute is removed. + + replace: replace all existing values of the modification + attribute with the new values listed, creating the attribute + if it did not already exist. A replace with no value will + delete the entire attribute if it exists, and it is ignored + if the attribute does not exist. + + - modification: A PartialAttribute (which may have an empty SET + of vals) used to hold the attribute type or attribute type and + values being modified. + + Upon receipt of a Modify Request, the server attempts to perform the + necessary modifications to the DIT and returns the result in a Modify + Response, defined as follows: + + ModifyResponse ::= [APPLICATION 7] LDAPResult + + The server will return to the client a single Modify Response + indicating either the successful completion of the DIT modification, + or the reason that the modification failed. Due to the requirement + for atomicity in applying the list of modifications in the Modify + Request, the client may expect that no modifications of the DIT have + been performed if the Modify Response received indicates any sort of + error, and that all requested modifications have been performed if + the Modify Response indicates successful completion of the Modify + operation. Whether or not the modification was applied cannot be + determined by the client if the Modify Response was not received + (e.g., the LDAP session was terminated or the Modify operation was + abandoned). + + Servers MUST ensure that entries conform to user and system schema + rules or other data model constraints. The Modify operation cannot + be used to remove from an entry any of its distinguished values, + i.e., those values which form the entry's relative distinguished + name. An attempt to do so will result in the server returning the + notAllowedOnRDN result code. The Modify DN operation described in + Section 4.9 is used to rename an entry. + + For attribute types that specify no equality matching, the rules in + Section 2.5.1 of [RFC4512] are followed. + + Note that due to the simplifications made in LDAP, there is not a + direct mapping of the changes in an LDAP ModifyRequest onto the + changes of a DAP ModifyEntry operation, and different implementations + + + + +Sermersheim Standards Track [Page 32] + +RFC 4511 LDAPv3 June 2006 + + + of LDAP-DAP gateways may use different means of representing the + change. If successful, the final effect of the operations on the + entry MUST be identical. + +4.7. Add Operation + + The Add operation allows a client to request the addition of an entry + into the Directory. The Add Request is defined as follows: + + AddRequest ::= [APPLICATION 8] SEQUENCE { + entry LDAPDN, + attributes AttributeList } + + AttributeList ::= SEQUENCE OF attribute Attribute + + Fields of the Add Request are: + + - entry: the name of the entry to be added. The server SHALL NOT + dereference any aliases in locating the entry to be added. + + - attributes: the list of attributes that, along with those from the + RDN, make up the content of the entry being added. Clients MAY or + MAY NOT include the RDN attribute(s) in this list. Clients MUST + NOT supply NO-USER-MODIFICATION attributes such as the + createTimestamp or creatorsName attributes, since the server + maintains these automatically. + + Servers MUST ensure that entries conform to user and system schema + rules or other data model constraints. For attribute types that + specify no equality matching, the rules in Section 2.5.1 of [RFC4512] + are followed (this applies to the naming attribute in addition to any + multi-valued attributes being added). + + The entry named in the entry field of the AddRequest MUST NOT exist + for the AddRequest to succeed. The immediate superior (parent) of an + object or alias entry to be added MUST exist. For example, if the + client attempted to add , the + entry did not exist, and the entry did + exist, then the server would return the noSuchObject result code with + the matchedDN field containing . + + Upon receipt of an Add Request, a server will attempt to add the + requested entry. The result of the Add attempt will be returned to + the client in the Add Response, defined as follows: + + AddResponse ::= [APPLICATION 9] LDAPResult + + + + + +Sermersheim Standards Track [Page 33] + +RFC 4511 LDAPv3 June 2006 + + + A response of success indicates that the new entry has been added to + the Directory. + +4.8. Delete Operation + + The Delete operation allows a client to request the removal of an + entry from the Directory. The Delete Request is defined as follows: + + DelRequest ::= [APPLICATION 10] LDAPDN + + The Delete Request consists of the name of the entry to be deleted. + The server SHALL NOT dereference aliases while resolving the name of + the target entry to be removed. + + Only leaf entries (those with no subordinate entries) can be deleted + with this operation. + + Upon receipt of a Delete Request, a server will attempt to perform + the entry removal requested and return the result in the Delete + Response defined as follows: + + DelResponse ::= [APPLICATION 11] LDAPResult + +4.9. Modify DN Operation + + The Modify DN operation allows a client to change the Relative + Distinguished Name (RDN) of an entry in the Directory and/or to move + a subtree of entries to a new location in the Directory. The Modify + DN Request is defined as follows: + + ModifyDNRequest ::= [APPLICATION 12] SEQUENCE { + entry LDAPDN, + newrdn RelativeLDAPDN, + deleteoldrdn BOOLEAN, + newSuperior [0] LDAPDN OPTIONAL } + + Fields of the Modify DN Request are: + + - entry: the name of the entry to be changed. This entry may or may + not have subordinate entries. + + - newrdn: the new RDN of the entry. The value of the old RDN is + supplied when moving the entry to a new superior without changing + its RDN. Attribute values of the new RDN not matching any + attribute value of the entry are added to the entry, and an + appropriate error is returned if this fails. + + + + + +Sermersheim Standards Track [Page 34] + +RFC 4511 LDAPv3 June 2006 + + + - deleteoldrdn: a boolean field that controls whether the old RDN + attribute values are to be retained as attributes of the entry or + deleted from the entry. + + - newSuperior: if present, this is the name of an existing object + entry that becomes the immediate superior (parent) of the + existing entry. + + The server SHALL NOT dereference any aliases in locating the objects + named in entry or newSuperior. + + Upon receipt of a ModifyDNRequest, a server will attempt to perform + the name change and return the result in the Modify DN Response, + defined as follows: + + ModifyDNResponse ::= [APPLICATION 13] LDAPResult + + For example, if the entry named in the entry field was , the newrdn field was , and the + newSuperior field was absent, then this operation would attempt to + rename the entry as . If there was + already an entry with that name, the operation would fail with the + entryAlreadyExists result code. + + Servers MUST ensure that entries conform to user and system schema + rules or other data model constraints. For attribute types that + specify no equality matching, the rules in Section 2.5.1 of [RFC4512] + are followed (this pertains to newrdn and deleteoldrdn). + + The object named in newSuperior MUST exist. For example, if the + client attempted to add , the + entry did not exist, and the entry did + exist, then the server would return the noSuchObject result code with + the matchedDN field containing . + + If the deleteoldrdn field is TRUE, the attribute values forming the + old RDN (but not the new RDN) are deleted from the entry. If the + deleteoldrdn field is FALSE, the attribute values forming the old RDN + will be retained as non-distinguished attribute values of the entry. + + Note that X.500 restricts the ModifyDN operation to affect only + entries that are contained within a single server. If the LDAP + server is mapped onto DAP, then this restriction will apply, and the + affectsMultipleDSAs result code will be returned if this error + occurred. In general, clients MUST NOT expect to be able to perform + arbitrary movements of entries and subtrees between servers or + between naming contexts. + + + + +Sermersheim Standards Track [Page 35] + +RFC 4511 LDAPv3 June 2006 + + +4.10. Compare Operation + + The Compare operation allows a client to compare an assertion value + with the values of a particular attribute in a particular entry in + the Directory. The Compare Request is defined as follows: + + CompareRequest ::= [APPLICATION 14] SEQUENCE { + entry LDAPDN, + ava AttributeValueAssertion } + + Fields of the Compare Request are: + + - entry: the name of the entry to be compared. The server SHALL NOT + dereference any aliases in locating the entry to be compared. + + - ava: holds the attribute value assertion to be compared. + + Upon receipt of a Compare Request, a server will attempt to perform + the requested comparison and return the result in the Compare + Response, defined as follows: + + CompareResponse ::= [APPLICATION 15] LDAPResult + + The resultCode is set to compareTrue, compareFalse, or an appropriate + error. compareTrue indicates that the assertion value in the ava + field matches a value of the attribute or subtype according to the + attribute's EQUALITY matching rule. compareFalse indicates that the + assertion value in the ava field and the values of the attribute or + subtype did not match. Other result codes indicate either that the + result of the comparison was Undefined (Section 4.5.1.7), or that + some error occurred. + + Note that some directory systems may establish access controls that + permit the values of certain attributes (such as userPassword) to be + compared but not interrogated by other means. + +4.11. Abandon Operation + + The function of the Abandon operation is to allow a client to request + that the server abandon an uncompleted operation. The Abandon + Request is defined as follows: + + AbandonRequest ::= [APPLICATION 16] MessageID + + The MessageID is that of an operation that was requested earlier at + this LDAP message layer. The Abandon request itself has its own + MessageID. This is distinct from the MessageID of the earlier + operation being abandoned. + + + +Sermersheim Standards Track [Page 36] + +RFC 4511 LDAPv3 June 2006 + + + There is no response defined in the Abandon operation. Upon receipt + of an AbandonRequest, the server MAY abandon the operation identified + by the MessageID. Since the client cannot tell the difference + between a successfully abandoned operation and an uncompleted + operation, the application of the Abandon operation is limited to + uses where the client does not require an indication of its outcome. + + Abandon, Bind, Unbind, and StartTLS operations cannot be abandoned. + + In the event that a server receives an Abandon Request on a Search + operation in the midst of transmitting responses to the Search, that + server MUST cease transmitting entry responses to the abandoned + request immediately, and it MUST NOT send the SearchResultDone. Of + course, the server MUST ensure that only properly encoded LDAPMessage + PDUs are transmitted. + + The ability to abandon other (particularly update) operations is at + the discretion of the server. + + Clients should not send Abandon requests for the same operation + multiple times, and they MUST also be prepared to receive results + from operations they have abandoned (since these might have been in + transit when the Abandon was requested or might not be able to be + abandoned). + + Servers MUST discard Abandon requests for messageIDs they do not + recognize, for operations that cannot be abandoned, and for + operations that have already been abandoned. + +4.12. Extended Operation + + The Extended operation allows additional operations to be defined for + services not already available in the protocol; for example, to Add + operations to install transport layer security (see Section 4.14). + + The Extended operation allows clients to make requests and receive + responses with predefined syntaxes and semantics. These may be + defined in RFCs or be private to particular implementations. + + Each Extended operation consists of an Extended request and an + Extended response. + + ExtendedRequest ::= [APPLICATION 23] SEQUENCE { + requestName [0] LDAPOID, + requestValue [1] OCTET STRING OPTIONAL } + + + + + + +Sermersheim Standards Track [Page 37] + +RFC 4511 LDAPv3 June 2006 + + + The requestName is a dotted-decimal representation of the unique + OBJECT IDENTIFIER corresponding to the request. The requestValue is + information in a form defined by that request, encapsulated inside an + OCTET STRING. + + The server will respond to this with an LDAPMessage containing an + ExtendedResponse. + + ExtendedResponse ::= [APPLICATION 24] SEQUENCE { + COMPONENTS OF LDAPResult, + responseName [10] LDAPOID OPTIONAL, + responseValue [11] OCTET STRING OPTIONAL } + + The responseName field, when present, contains an LDAPOID that is + unique for this extended operation or response. This field is + optional (even when the extension specification defines an LDAPOID + for use in this field). The field will be absent whenever the server + is unable or unwilling to determine the appropriate LDAPOID to + return, for instance, when the requestName cannot be parsed or its + value is not recognized. + + Where the requestName is not recognized, the server returns + protocolError. (The server may return protocolError in other cases.) + + The requestValue and responseValue fields contain information + associated with the operation. The format of these fields is defined + by the specification of the Extended operation. Implementations MUST + be prepared to handle arbitrary contents of these fields, including + zero bytes. Values that are defined in terms of ASN.1 and BER- + encoded according to Section 5.1 also follow the extensibility rules + in Section 4. + + Servers list the requestName of Extended Requests they recognize in + the 'supportedExtension' attribute in the root DSE (Section 5.1 of + [RFC4512]). + + Extended operations may be specified in other documents. The + specification of an Extended operation consists of: + + - the OBJECT IDENTIFIER assigned to the requestName, + + - the OBJECT IDENTIFIER (if any) assigned to the responseName (note + that the same OBJECT IDENTIFIER may be used for both the + requestName and responseName), + + + + + + + +Sermersheim Standards Track [Page 38] + +RFC 4511 LDAPv3 June 2006 + + + - the format of the contents of the requestValue and responseValue + (if any), and + + - the semantics of the operation. + +4.13. IntermediateResponse Message + + While the Search operation provides a mechanism to return multiple + response messages for a single Search request, other operations, by + nature, do not provide for multiple response messages. + + The IntermediateResponse message provides a general mechanism for + defining single-request/multiple-response operations in LDAP. This + message is intended to be used in conjunction with the Extended + operation to define new single-request/multiple-response operations + or in conjunction with a control when extending existing LDAP + operations in a way that requires them to return Intermediate + response information. + + It is intended that the definitions and descriptions of Extended + operations and controls that make use of the IntermediateResponse + message will define the circumstances when an IntermediateResponse + message can be sent by a server and the associated meaning of an + IntermediateResponse message sent in a particular circumstance. + + IntermediateResponse ::= [APPLICATION 25] SEQUENCE { + responseName [0] LDAPOID OPTIONAL, + responseValue [1] OCTET STRING OPTIONAL } + + IntermediateResponse messages SHALL NOT be returned to the client + unless the client issues a request that specifically solicits their + return. This document defines two forms of solicitation: Extended + operation and request control. IntermediateResponse messages are + specified in documents describing the manner in which they are + solicited (i.e., in the Extended operation or request control + specification that uses them). These specifications include: + + - the OBJECT IDENTIFIER (if any) assigned to the responseName, + + - the format of the contents of the responseValue (if any), and + + - the semantics associated with the IntermediateResponse message. + + Extensions that allow the return of multiple types of + IntermediateResponse messages SHALL identify those types using unique + responseName values (note that one of these may specify no value). + + + + + +Sermersheim Standards Track [Page 39] + +RFC 4511 LDAPv3 June 2006 + + + Sections 4.13.1 and 4.13.2 describe additional requirements on the + inclusion of responseName and responseValue in IntermediateResponse + messages. + +4.13.1. Usage with LDAP ExtendedRequest and ExtendedResponse + + A single-request/multiple-response operation may be defined using a + single ExtendedRequest message to solicit zero or more + IntermediateResponse messages of one or more kinds, followed by an + ExtendedResponse message. + +4.13.2. Usage with LDAP Request Controls + + A control's semantics may include the return of zero or more + IntermediateResponse messages prior to returning the final result + code for the operation. One or more kinds of IntermediateResponse + messages may be sent in response to a request control. + + All IntermediateResponse messages associated with request controls + SHALL include a responseName. This requirement ensures that the + client can correctly identify the source of IntermediateResponse + messages when: + + - two or more controls using IntermediateResponse messages are + included in a request for any LDAP operation or + + - one or more controls using IntermediateResponse messages are + included in a request with an LDAP Extended operation that uses + IntermediateResponse messages. + +4.14. StartTLS Operation + + The Start Transport Layer Security (StartTLS) operation's purpose is + to initiate installation of a TLS layer. The StartTLS operation is + defined using the Extended operation mechanism described in Section + 4.12. + +4.14.1. StartTLS Request + + A client requests TLS establishment by transmitting a StartTLS + request message to the server. The StartTLS request is defined in + terms of an ExtendedRequest. The requestName is + "1.3.6.1.4.1.1466.20037", and the requestValue field is always + absent. + + + + + + + +Sermersheim Standards Track [Page 40] + +RFC 4511 LDAPv3 June 2006 + + + The client MUST NOT send any LDAP PDUs at this LDAP message layer + following this request until it receives a StartTLS Extended response + and, in the case of a successful response, completes TLS + negotiations. + + Detected sequencing problems (particularly those detailed in Section + 3.1.1 of [RFC4513]) result in the resultCode being set to + operationsError. + + If the server does not support TLS (whether by design or by current + configuration), it returns with the resultCode set to protocolError + as described in Section 4.12. + +4.14.2. StartTLS Response + + When a StartTLS request is received, servers supporting the operation + MUST return a StartTLS response message to the requestor. The + responseName is "1.3.6.1.4.1.1466.20037" when provided (see Section + 4.12). The responseValue is always absent. + + If the server is willing and able to negotiate TLS, it returns the + StartTLS response with the resultCode set to success. Upon client + receipt of a successful StartTLS response, protocol peers may + commence with TLS negotiation as discussed in Section 3 of [RFC4513]. + + If the server is otherwise unwilling or unable to perform this + operation, the server is to return an appropriate result code + indicating the nature of the problem. For example, if the TLS + subsystem is not presently available, the server may indicate this by + returning with the resultCode set to unavailable. In cases where a + non-success result code is returned, the LDAP session is left without + a TLS layer. + +4.14.3. Removal of the TLS Layer + + Either the client or server MAY remove the TLS layer and leave the + LDAP message layer intact by sending and receiving a TLS closure + alert. + + The initiating protocol peer sends the TLS closure alert and MUST + wait until it receives a TLS closure alert from the other peer before + sending further LDAP PDUs. + + When a protocol peer receives the initial TLS closure alert, it may + choose to allow the LDAP message layer to remain intact. In this + case, it MUST immediately transmit a TLS closure alert. Following + this, it MAY send and receive LDAP PDUs. + + + + +Sermersheim Standards Track [Page 41] + +RFC 4511 LDAPv3 June 2006 + + + Protocol peers MAY terminate the LDAP session after sending or + receiving a TLS closure alert. + +5. Protocol Encoding, Connection, and Transfer + + This protocol is designed to run over connection-oriented, reliable + transports, where the data stream is divided into octets (8-bit + units), with each octet and each bit being significant. + + One underlying service, LDAP over TCP, is defined in Section 5.2. + This service is generally applicable to applications providing or + consuming X.500-based directory services on the Internet. This + specification was generally written with the TCP mapping in mind. + Specifications detailing other mappings may encounter various + obstacles. + + Implementations of LDAP over TCP MUST implement the mapping as + described in Section 5.2. + + This table illustrates the relationship among the different layers + involved in an exchange between two protocol peers: + + +----------------------+ + | LDAP message layer | + +----------------------+ > LDAP PDUs + +----------------------+ < data + | SASL layer | + +----------------------+ > SASL-protected data + +----------------------+ < data + | TLS layer | + Application +----------------------+ > TLS-protected data + ------------+----------------------+ < data + Transport | transport connection | + +----------------------+ + +5.1. Protocol Encoding + + The protocol elements of LDAP SHALL be encoded for exchange using the + Basic Encoding Rules [BER] of [ASN.1] with the following + restrictions: + + - Only the definite form of length encoding is used. + + - OCTET STRING values are encoded in the primitive form only. + + - If the value of a BOOLEAN type is true, the encoding of the value + octet is set to hex "FF". + + + + +Sermersheim Standards Track [Page 42] + +RFC 4511 LDAPv3 June 2006 + + + - If a value of a type is its default value, it is absent. Only some + BOOLEAN and INTEGER types have default values in this protocol + definition. + + These restrictions are meant to ease the overhead of encoding and + decoding certain elements in BER. + + These restrictions do not apply to ASN.1 types encapsulated inside of + OCTET STRING values, such as attribute values, unless otherwise + stated. + +5.2. Transmission Control Protocol (TCP) + + The encoded LDAPMessage PDUs are mapped directly onto the TCP + [RFC793] bytestream using the BER-based encoding described in Section + 5.1. It is recommended that server implementations running over the + TCP provide a protocol listener on the Internet Assigned Numbers + Authority (IANA)-assigned LDAP port, 389 [PortReg]. Servers may + instead provide a listener on a different port number. Clients MUST + support contacting servers on any valid TCP port. + +5.3. Termination of the LDAP session + + Termination of the LDAP session is typically initiated by the client + sending an UnbindRequest (Section 4.3), or by the server sending a + Notice of Disconnection (Section 4.4.1). In these cases, each + protocol peer gracefully terminates the LDAP session by ceasing + exchanges at the LDAP message layer, tearing down any SASL layer, + tearing down any TLS layer, and closing the transport connection. + + A protocol peer may determine that the continuation of any + communication would be pernicious, and in this case, it may abruptly + terminate the session by ceasing communication and closing the + transport connection. + + In either case, when the LDAP session is terminated, uncompleted + operations are handled as specified in Section 3.1. + +6. Security Considerations + + This version of the protocol provides facilities for simple + authentication using a cleartext password, as well as any SASL + [RFC4422] mechanism. Installing SASL and/or TLS layers can provide + integrity and other data security services. + + It is also permitted that the server can return its credentials to + the client, if it chooses to do so. + + + + +Sermersheim Standards Track [Page 43] + +RFC 4511 LDAPv3 June 2006 + + + Use of cleartext password is strongly discouraged where the + underlying transport service cannot guarantee confidentiality and may + result in disclosure of the password to unauthorized parties. + + Servers are encouraged to prevent directory modifications by clients + that have authenticated anonymously [RFC4513]. + + Security considerations for authentication methods, SASL mechanisms, + and TLS are described in [RFC4513]. + + Note that SASL authentication exchanges do not provide data + confidentiality or integrity protection for the version or name + fields of the BindRequest or the resultCode, diagnosticMessage, or + referral fields of the BindResponse, nor for any information + contained in controls attached to Bind requests or responses. Thus, + information contained in these fields SHOULD NOT be relied on unless + it is otherwise protected (such as by establishing protections at the + transport layer). + + Implementors should note that various security factors (including + authentication and authorization information and data security + services) may change during the course of the LDAP session or even + during the performance of a particular operation. For instance, + credentials could expire, authorization identities or access controls + could change, or the underlying security layer(s) could be replaced + or terminated. Implementations should be robust in the handling of + changing security factors. + + In some cases, it may be appropriate to continue the operation even + in light of security factor changes. For instance, it may be + appropriate to continue an Abandon operation regardless of the + change, or to continue an operation when the change upgraded (or + maintained) the security factor. In other cases, it may be + appropriate to fail or alter the processing of the operation. For + instance, if confidential protections were removed, it would be + appropriate either to fail a request to return sensitive data or, + minimally, to exclude the return of sensitive data. + + Implementations that cache attributes and entries obtained via LDAP + MUST ensure that access controls are maintained if that information + is to be provided to multiple clients, since servers may have access + control policies that prevent the return of entries or attributes in + Search results except to particular authenticated clients. For + example, caches could serve result information only to the client + whose request caused it to be in the cache. + + + + + + +Sermersheim Standards Track [Page 44] + +RFC 4511 LDAPv3 June 2006 + + + Servers may return referrals or Search result references that + redirect clients to peer servers. It is possible for a rogue + application to inject such referrals into the data stream in an + attempt to redirect a client to a rogue server. Clients are advised + to be aware of this and possibly reject referrals when + confidentiality measures are not in place. Clients are advised to + reject referrals from the StartTLS operation. + + The matchedDN and diagnosticMessage fields, as well as some + resultCode values (e.g., attributeOrValueExists and + entryAlreadyExists), could disclose the presence or absence of + specific data in the directory that is subject to access and other + administrative controls. Server implementations should restrict + access to protected information equally under both normal and error + conditions. + + Protocol peers MUST be prepared to handle invalid and arbitrary- + length protocol encodings. Invalid protocol encodings include: BER + encoding exceptions, format string and UTF-8 encoding exceptions, + overflow exceptions, integer value exceptions, and binary mode on/off + flag exceptions. The LDAPv3 PROTOS [PROTOS-LDAP] test suite provides + excellent examples of these exceptions and test cases used to + discover flaws. + + In the event that a protocol peer senses an attack that in its nature + could cause damage due to further communication at any layer in the + LDAP session, the protocol peer should abruptly terminate the LDAP + session as described in Section 5.3. + +7. Acknowledgements + + This document is based on RFC 2251 by Mark Wahl, Tim Howes, and Steve + Kille. RFC 2251 was a product of the IETF ASID Working Group. + + It is also based on RFC 2830 by Jeff Hodges, RL "Bob" Morgan, and + Mark Wahl. RFC 2830 was a product of the IETF LDAPEXT Working Group. + + It is also based on RFC 3771 by Roger Harrison and Kurt Zeilenga. + RFC 3771 was an individual submission to the IETF. + + This document is a product of the IETF LDAPBIS Working Group. + Significant contributors of technical review and content include Kurt + Zeilenga, Steven Legg, and Hallvard Furuseth. + + + + + + + + +Sermersheim Standards Track [Page 45] + +RFC 4511 LDAPv3 June 2006 + + +8. Normative References + + [ASN.1] ITU-T Recommendation X.680 (07/2002) | ISO/IEC 8824- + 1:2002 "Information Technology - Abstract Syntax + Notation One (ASN.1): Specification of basic notation". + + [BER] ITU-T Rec. X.690 (07/2002) | ISO/IEC 8825-1:2002, + "Information technology - ASN.1 encoding rules: + Specification of Basic Encoding Rules (BER), Canonical + Encoding Rules (CER) and Distinguished Encoding Rules + (DER)", 2002. + + [ISO10646] Universal Multiple-Octet Coded Character Set (UCS) - + Architecture and Basic Multilingual Plane, ISO/IEC + 10646-1 : 1993. + + [RFC791] Postel, J., "Internet Protocol", STD 5, RFC 791, + September 1981. + + [RFC793] Postel, J., "Transmission Control Protocol", STD 7, RFC + 793, September 1981. + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [RFC3454] Hoffman P. and M. Blanchet, "Preparation of + Internationalized Strings ('stringprep')", RFC 3454, + December 2002. + + [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO + 10646", STD 63, RFC 3629, November 2003. + + [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, + "Uniform Resource Identifier (URI): Generic Syntax", + STD 66, RFC 3986, January 2005. + + [RFC4013] Zeilenga, K., "SASLprep: Stringprep Profile for User + Names and Passwords", RFC 4013, February 2005. + + [RFC4234] Crocker, D. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", RFC 4234, October 2005. + + [RFC4346] Dierks, T. and E. Rescorla, "The TLS Protocol Version + 1.1", RFC 4346, March 2006. + + [RFC4422] Melnikov, A., Ed. and K. Zeilenga, Ed., "Simple + Authentication and Security Layer (SASL)", RFC 4422, + June 2006. + + + +Sermersheim Standards Track [Page 46] + +RFC 4511 LDAPv3 June 2006 + + + [RFC4510] Zeilenga, K., Ed., "Lightweight Directory Access + Protocol (LDAP): Technical Specification Road Map", RFC + 4510, June 2006. + + [RFC4512] Zeilenga, K., Lightweight Directory Access Protocol + (LDAP): Directory Information Models", RFC 4512, June + 2006. + + [RFC4513] Harrison, R., Ed., "Lightweight Directory Access + Protocol (LDAP): Authentication Methods and Security + Mechanisms", RFC 4513, June 2006. + + [RFC4514] Zeilenga, K., Ed., "Lightweight Directory Access + Protocol (LDAP): String Representation of Distinguished + Names", RFC 4514, June 2006. + + [RFC4516] Smith, M., Ed. and T. Howes, "Lightweight Directory + Access Protocol (LDAP): Uniform Resource Locator", RFC + 4516, June 2006. + + [RFC4517] Legg, S., Ed., "Lightweight Directory Access Protocol + (LDAP): Syntaxes and Matching Rules", RFC 4517, June + 2006. + + [RFC4520] Zeilenga, K., "Internet Assigned Numbers Authority + (IANA) Considerations for the Lightweight Directory + Access Protocol (LDAP)", BCP 64, RFC 4520, June 2006. + + [Unicode] The Unicode Consortium, "The Unicode Standard, Version + 3.2.0" is defined by "The Unicode Standard, Version + 3.0" (Reading, MA, Addison-Wesley, 2000. ISBN 0-201- + 61633-5), as amended by the "Unicode Standard Annex + #27: Unicode 3.1" + (http://www.unicode.org/reports/tr27/) and by the + "Unicode Standard Annex #28: Unicode 3.2" + (http://www.unicode.org/reports/tr28/). + + [X.500] ITU-T Rec. X.500, "The Directory: Overview of Concepts, + Models and Service", 1993. + + [X.511] ITU-T Rec. X.511, "The Directory: Abstract Service + Definition", 1993. + + + + + + + + + +Sermersheim Standards Track [Page 47] + +RFC 4511 LDAPv3 June 2006 + + +9. Informative References + + [CharModel] Whistler, K. and M. Davis, "Unicode Technical Report + #17, Character Encoding Model", UTR17, + , August + 2000. + + [Glossary] The Unicode Consortium, "Unicode Glossary", + . + + [PortReg] IANA, "Port Numbers", + . + + [PROTOS-LDAP] University of Oulu, "PROTOS Test-Suite: c06-ldapv3" + . + +10. IANA Considerations + + The Internet Assigned Numbers Authority (IANA) has updated the LDAP + result code registry to indicate that this document provides the + definitive technical specification for result codes 0-36, 48-54, 64- + 70, 80-90. It is also noted that one resultCode value + (strongAuthRequired) has been renamed (to strongerAuthRequired). + + The IANA has also updated the LDAP Protocol Mechanism registry to + indicate that this document and [RFC4513] provides the definitive + technical specification for the StartTLS (1.3.6.1.4.1.1466.20037) + Extended operation. + + IANA has assigned LDAP Object Identifier 18 [RFC4520] to identify the + ASN.1 module defined in this document. + + Subject: Request for LDAP Object Identifier Registration + Person & email address to contact for further information: + Jim Sermersheim + Specification: RFC 4511 + Author/Change Controller: IESG + Comments: + Identifies the LDAP ASN.1 module + + + + + + + + + + + +Sermersheim Standards Track [Page 48] + +RFC 4511 LDAPv3 June 2006 + + +Appendix A. LDAP Result Codes + + This normative appendix details additional considerations regarding + LDAP result codes and provides a brief, general description of each + LDAP result code enumerated in Section 4.1.9. + + Additional result codes MAY be defined for use with extensions + [RFC4520]. Client implementations SHALL treat any result code that + they do not recognize as an unknown error condition. + + The descriptions provided here do not fully account for result code + substitutions used to prevent unauthorized disclosures (such as + substitution of noSuchObject for insufficientAccessRights, or + invalidCredentials for insufficientAccessRights). + +A.1. Non-Error Result Codes + + These result codes (called "non-error" result codes) do not indicate + an error condition: + + success (0), + compareFalse (5), + compareTrue (6), + referral (10), and + saslBindInProgress (14). + + The success, compareTrue, and compareFalse result codes indicate + successful completion (and, hence, are referred to as "successful" + result codes). + + The referral and saslBindInProgress result codes indicate the client + needs to take additional action to complete the operation. + +A.2. Result Codes + + Existing LDAP result codes are described as follows: + + success (0) + Indicates the successful completion of an operation. Note: + this code is not used with the Compare operation. See + compareFalse (5) and compareTrue (6). + + + + + + + + + + +Sermersheim Standards Track [Page 49] + +RFC 4511 LDAPv3 June 2006 + + + operationsError (1) + Indicates that the operation is not properly sequenced with + relation to other operations (of same or different type). + + For example, this code is returned if the client attempts to + StartTLS [RFC4346] while there are other uncompleted operations + or if a TLS layer was already installed. + + protocolError (2) + Indicates the server received data that is not well-formed. + + For Bind operation only, this code is also used to indicate + that the server does not support the requested protocol + version. + + For Extended operations only, this code is also used to + indicate that the server does not support (by design or + configuration) the Extended operation associated with the + requestName. + + For request operations specifying multiple controls, this may + be used to indicate that the server cannot ignore the order + of the controls as specified, or that the combination of the + specified controls is invalid or unspecified. + + timeLimitExceeded (3) + Indicates that the time limit specified by the client was + exceeded before the operation could be completed. + + sizeLimitExceeded (4) + Indicates that the size limit specified by the client was + exceeded before the operation could be completed. + + compareFalse (5) + Indicates that the Compare operation has successfully + completed and the assertion has evaluated to FALSE or + Undefined. + + compareTrue (6) + Indicates that the Compare operation has successfully + completed and the assertion has evaluated to TRUE. + + authMethodNotSupported (7) + Indicates that the authentication method or mechanism is not + supported. + + + + + + +Sermersheim Standards Track [Page 50] + +RFC 4511 LDAPv3 June 2006 + + + strongerAuthRequired (8) + Indicates the server requires strong(er) authentication in + order to complete the operation. + + When used with the Notice of Disconnection operation, this + code indicates that the server has detected that an + established security association between the client and + server has unexpectedly failed or been compromised. + + referral (10) + Indicates that a referral needs to be chased to complete the + operation (see Section 4.1.10). + + adminLimitExceeded (11) + Indicates that an administrative limit has been exceeded. + + unavailableCriticalExtension (12) + Indicates a critical control is unrecognized (see Section + 4.1.11). + + confidentialityRequired (13) + Indicates that data confidentiality protections are required. + + saslBindInProgress (14) + Indicates the server requires the client to send a new bind + request, with the same SASL mechanism, to continue the + authentication process (see Section 4.2). + + noSuchAttribute (16) + Indicates that the named entry does not contain the specified + attribute or attribute value. + + undefinedAttributeType (17) + Indicates that a request field contains an unrecognized + attribute description. + + inappropriateMatching (18) + Indicates that an attempt was made (e.g., in an assertion) to + use a matching rule not defined for the attribute type + concerned. + + constraintViolation (19) + Indicates that the client supplied an attribute value that + does not conform to the constraints placed upon it by the + data model. + + For example, this code is returned when multiple values are + supplied to an attribute that has a SINGLE-VALUE constraint. + + + +Sermersheim Standards Track [Page 51] + +RFC 4511 LDAPv3 June 2006 + + + attributeOrValueExists (20) + Indicates that the client supplied an attribute or value to + be added to an entry, but the attribute or value already + exists. + + invalidAttributeSyntax (21) + Indicates that a purported attribute value does not conform + to the syntax of the attribute. + + noSuchObject (32) + Indicates that the object does not exist in the DIT. + + aliasProblem (33) + Indicates that an alias problem has occurred. For example, + the code may used to indicate an alias has been dereferenced + that names no object. + + invalidDNSyntax (34) + Indicates that an LDAPDN or RelativeLDAPDN field (e.g., search + base, target entry, ModifyDN newrdn, etc.) of a request does + not conform to the required syntax or contains attribute + values that do not conform to the syntax of the attribute's + type. + + aliasDereferencingProblem (36) + Indicates that a problem occurred while dereferencing an + alias. Typically, an alias was encountered in a situation + where it was not allowed or where access was denied. + + inappropriateAuthentication (48) + Indicates the server requires the client that had attempted + to bind anonymously or without supplying credentials to + provide some form of credentials. + + invalidCredentials (49) + Indicates that the provided credentials (e.g., the user's name + and password) are invalid. + + insufficientAccessRights (50) + Indicates that the client does not have sufficient access + rights to perform the operation. + + busy (51) + Indicates that the server is too busy to service the + operation. + + + + + + +Sermersheim Standards Track [Page 52] + +RFC 4511 LDAPv3 June 2006 + + + unavailable (52) + Indicates that the server is shutting down or a subsystem + necessary to complete the operation is offline. + + unwillingToPerform (53) + Indicates that the server is unwilling to perform the + operation. + + loopDetect (54) + Indicates that the server has detected an internal loop (e.g., + while dereferencing aliases or chaining an operation). + + namingViolation (64) + Indicates that the entry's name violates naming restrictions. + + objectClassViolation (65) + Indicates that the entry violates object class restrictions. + + notAllowedOnNonLeaf (66) + Indicates that the operation is inappropriately acting upon a + non-leaf entry. + + notAllowedOnRDN (67) + Indicates that the operation is inappropriately attempting to + remove a value that forms the entry's relative distinguished + name. + + entryAlreadyExists (68) + Indicates that the request cannot be fulfilled (added, moved, + or renamed) as the target entry already exists. + + objectClassModsProhibited (69) + Indicates that an attempt to modify the object class(es) of + an entry's 'objectClass' attribute is prohibited. + + For example, this code is returned when a client attempts to + modify the structural object class of an entry. + + affectsMultipleDSAs (71) + Indicates that the operation cannot be performed as it would + affect multiple servers (DSAs). + + other (80) + Indicates the server has encountered an internal error. + + + + + + + +Sermersheim Standards Track [Page 53] + +RFC 4511 LDAPv3 June 2006 + + +Appendix B. Complete ASN.1 Definition + + This appendix is normative. + + Lightweight-Directory-Access-Protocol-V3 {1 3 6 1 1 18} + -- Copyright (C) The Internet Society (2006). This version of + -- this ASN.1 module is part of RFC 4511; see the RFC itself + -- for full legal notices. + DEFINITIONS + IMPLICIT TAGS + EXTENSIBILITY IMPLIED ::= + + BEGIN + + LDAPMessage ::= SEQUENCE { + messageID MessageID, + protocolOp CHOICE { + bindRequest BindRequest, + bindResponse BindResponse, + unbindRequest UnbindRequest, + searchRequest SearchRequest, + searchResEntry SearchResultEntry, + searchResDone SearchResultDone, + searchResRef SearchResultReference, + modifyRequest ModifyRequest, + modifyResponse ModifyResponse, + addRequest AddRequest, + addResponse AddResponse, + delRequest DelRequest, + delResponse DelResponse, + modDNRequest ModifyDNRequest, + modDNResponse ModifyDNResponse, + compareRequest CompareRequest, + compareResponse CompareResponse, + abandonRequest AbandonRequest, + extendedReq ExtendedRequest, + extendedResp ExtendedResponse, + ..., + intermediateResponse IntermediateResponse }, + controls [0] Controls OPTIONAL } + + MessageID ::= INTEGER (0 .. maxInt) + + maxInt INTEGER ::= 2147483647 -- (2^^31 - 1) -- + + LDAPString ::= OCTET STRING -- UTF-8 encoded, + -- [ISO10646] characters + + + + +Sermersheim Standards Track [Page 54] + +RFC 4511 LDAPv3 June 2006 + + + LDAPOID ::= OCTET STRING -- Constrained to + -- [RFC4512] + + LDAPDN ::= LDAPString -- Constrained to + -- [RFC4514] + + RelativeLDAPDN ::= LDAPString -- Constrained to + -- [RFC4514] + + AttributeDescription ::= LDAPString + -- Constrained to + -- [RFC4512] + + AttributeValue ::= OCTET STRING + + AttributeValueAssertion ::= SEQUENCE { + attributeDesc AttributeDescription, + assertionValue AssertionValue } + + AssertionValue ::= OCTET STRING + + PartialAttribute ::= SEQUENCE { + type AttributeDescription, + vals SET OF value AttributeValue } + + Attribute ::= PartialAttribute(WITH COMPONENTS { + ..., + vals (SIZE(1..MAX))}) + + MatchingRuleId ::= LDAPString + + LDAPResult ::= SEQUENCE { + resultCode ENUMERATED { + success (0), + operationsError (1), + protocolError (2), + timeLimitExceeded (3), + sizeLimitExceeded (4), + compareFalse (5), + compareTrue (6), + authMethodNotSupported (7), + strongerAuthRequired (8), + -- 9 reserved -- + referral (10), + adminLimitExceeded (11), + unavailableCriticalExtension (12), + confidentialityRequired (13), + saslBindInProgress (14), + + + +Sermersheim Standards Track [Page 55] + +RFC 4511 LDAPv3 June 2006 + + + noSuchAttribute (16), + undefinedAttributeType (17), + inappropriateMatching (18), + constraintViolation (19), + attributeOrValueExists (20), + invalidAttributeSyntax (21), + -- 22-31 unused -- + noSuchObject (32), + aliasProblem (33), + invalidDNSyntax (34), + -- 35 reserved for undefined isLeaf -- + aliasDereferencingProblem (36), + -- 37-47 unused -- + inappropriateAuthentication (48), + invalidCredentials (49), + insufficientAccessRights (50), + busy (51), + unavailable (52), + unwillingToPerform (53), + loopDetect (54), + -- 55-63 unused -- + namingViolation (64), + objectClassViolation (65), + notAllowedOnNonLeaf (66), + notAllowedOnRDN (67), + entryAlreadyExists (68), + objectClassModsProhibited (69), + -- 70 reserved for CLDAP -- + affectsMultipleDSAs (71), + -- 72-79 unused -- + other (80), + ... }, + matchedDN LDAPDN, + diagnosticMessage LDAPString, + referral [3] Referral OPTIONAL } + + Referral ::= SEQUENCE SIZE (1..MAX) OF uri URI + + URI ::= LDAPString -- limited to characters permitted in + -- URIs + + Controls ::= SEQUENCE OF control Control + + Control ::= SEQUENCE { + controlType LDAPOID, + criticality BOOLEAN DEFAULT FALSE, + controlValue OCTET STRING OPTIONAL } + + + + +Sermersheim Standards Track [Page 56] + +RFC 4511 LDAPv3 June 2006 + + + BindRequest ::= [APPLICATION 0] SEQUENCE { + version INTEGER (1 .. 127), + name LDAPDN, + authentication AuthenticationChoice } + + AuthenticationChoice ::= CHOICE { + simple [0] OCTET STRING, + -- 1 and 2 reserved + sasl [3] SaslCredentials, + ... } + + SaslCredentials ::= SEQUENCE { + mechanism LDAPString, + credentials OCTET STRING OPTIONAL } + + BindResponse ::= [APPLICATION 1] SEQUENCE { + COMPONENTS OF LDAPResult, + serverSaslCreds [7] OCTET STRING OPTIONAL } + + UnbindRequest ::= [APPLICATION 2] NULL + + SearchRequest ::= [APPLICATION 3] SEQUENCE { + baseObject LDAPDN, + scope ENUMERATED { + baseObject (0), + singleLevel (1), + wholeSubtree (2), + ... }, + derefAliases ENUMERATED { + neverDerefAliases (0), + derefInSearching (1), + derefFindingBaseObj (2), + derefAlways (3) }, + sizeLimit INTEGER (0 .. maxInt), + timeLimit INTEGER (0 .. maxInt), + typesOnly BOOLEAN, + filter Filter, + attributes AttributeSelection } + + AttributeSelection ::= SEQUENCE OF selector LDAPString + -- The LDAPString is constrained to + -- in Section 4.5.1.8 + + Filter ::= CHOICE { + and [0] SET SIZE (1..MAX) OF filter Filter, + or [1] SET SIZE (1..MAX) OF filter Filter, + not [2] Filter, + equalityMatch [3] AttributeValueAssertion, + + + +Sermersheim Standards Track [Page 57] + +RFC 4511 LDAPv3 June 2006 + + + substrings [4] SubstringFilter, + greaterOrEqual [5] AttributeValueAssertion, + lessOrEqual [6] AttributeValueAssertion, + present [7] AttributeDescription, + approxMatch [8] AttributeValueAssertion, + extensibleMatch [9] MatchingRuleAssertion, + ... } + + SubstringFilter ::= SEQUENCE { + type AttributeDescription, + substrings SEQUENCE SIZE (1..MAX) OF substring CHOICE { + initial [0] AssertionValue, -- can occur at most once + any [1] AssertionValue, + final [2] AssertionValue } -- can occur at most once + } + + MatchingRuleAssertion ::= SEQUENCE { + matchingRule [1] MatchingRuleId OPTIONAL, + type [2] AttributeDescription OPTIONAL, + matchValue [3] AssertionValue, + dnAttributes [4] BOOLEAN DEFAULT FALSE } + + SearchResultEntry ::= [APPLICATION 4] SEQUENCE { + objectName LDAPDN, + attributes PartialAttributeList } + + PartialAttributeList ::= SEQUENCE OF + partialAttribute PartialAttribute + + SearchResultReference ::= [APPLICATION 19] SEQUENCE + SIZE (1..MAX) OF uri URI + + SearchResultDone ::= [APPLICATION 5] LDAPResult + + ModifyRequest ::= [APPLICATION 6] SEQUENCE { + object LDAPDN, + changes SEQUENCE OF change SEQUENCE { + operation ENUMERATED { + add (0), + delete (1), + replace (2), + ... }, + modification PartialAttribute } } + + ModifyResponse ::= [APPLICATION 7] LDAPResult + + + + + + +Sermersheim Standards Track [Page 58] + +RFC 4511 LDAPv3 June 2006 + + + AddRequest ::= [APPLICATION 8] SEQUENCE { + entry LDAPDN, + attributes AttributeList } + + AttributeList ::= SEQUENCE OF attribute Attribute + + AddResponse ::= [APPLICATION 9] LDAPResult + + DelRequest ::= [APPLICATION 10] LDAPDN + + DelResponse ::= [APPLICATION 11] LDAPResult + + ModifyDNRequest ::= [APPLICATION 12] SEQUENCE { + entry LDAPDN, + newrdn RelativeLDAPDN, + deleteoldrdn BOOLEAN, + newSuperior [0] LDAPDN OPTIONAL } + + ModifyDNResponse ::= [APPLICATION 13] LDAPResult + + CompareRequest ::= [APPLICATION 14] SEQUENCE { + entry LDAPDN, + ava AttributeValueAssertion } + + CompareResponse ::= [APPLICATION 15] LDAPResult + + AbandonRequest ::= [APPLICATION 16] MessageID + + ExtendedRequest ::= [APPLICATION 23] SEQUENCE { + requestName [0] LDAPOID, + requestValue [1] OCTET STRING OPTIONAL } + + ExtendedResponse ::= [APPLICATION 24] SEQUENCE { + COMPONENTS OF LDAPResult, + responseName [10] LDAPOID OPTIONAL, + responseValue [11] OCTET STRING OPTIONAL } + + IntermediateResponse ::= [APPLICATION 25] SEQUENCE { + responseName [0] LDAPOID OPTIONAL, + responseValue [1] OCTET STRING OPTIONAL } + + END + + + + + + + + + +Sermersheim Standards Track [Page 59] + +RFC 4511 LDAPv3 June 2006 + + +Appendix C. Changes + + This appendix is non-normative. + + This appendix summarizes substantive changes made to RFC 2251, RFC + 2830, and RFC 3771. + +C.1. Changes Made to RFC 2251 + + This section summarizes the substantive changes made to Sections 1, + 2, 3.1, and 4, and the remainder of RFC 2251. Readers should + consult [RFC4512] and [RFC4513] for summaries of changes to other + sections. + +C.1.1. Section 1 (Status of this Memo) + + - Removed IESG note. Post publication of RFC 2251, mandatory LDAP + authentication mechanisms have been standardized which are + sufficient to remove this note. See [RFC4513] for authentication + mechanisms. + +C.1.2. Section 3.1 (Protocol Model) and others + + - Removed notes giving history between LDAP v1, v2, and v3. Instead, + added sufficient language so that this document can stand on its + own. + +C.1.3. Section 4 (Elements of Protocol) + + - Clarified where the extensibility features of ASN.1 apply to the + protocol. This change affected various ASN.1 types by the + inclusion of ellipses (...) to certain elements. + - Removed the requirement that servers that implement version 3 or + later MUST provide the 'supportedLDAPVersion' attribute. This + statement provided no interoperability advantages. + +C.1.4. Section 4.1.1 (Message Envelope) + + - There was a mandatory requirement for the server to return a + Notice of Disconnection and drop the transport connection when a + PDU is malformed in a certain way. This has been updated such that + the server SHOULD return the Notice of Disconnection, and it MUST + terminate the LDAP Session. + +C.1.5. Section 4.1.1.1 (Message ID) + + - Required that the messageID of requests MUST be non-zero as the + zero is reserved for Notice of Disconnection. + + + +Sermersheim Standards Track [Page 60] + +RFC 4511 LDAPv3 June 2006 + + + - Specified when it is and isn't appropriate to return an already + used messageID. RFC 2251 accidentally imposed synchronous server + behavior in its wording of this. + +C.1.6. Section 4.1.2 (String Types) + + - Stated that LDAPOID is constrained to from [RFC4512]. + +C.1.7. Section 4.1.5.1 (Binary Option) and others + + - Removed the Binary Option from the specification. There are + numerous interoperability problems associated with this method of + alternate attribute type encoding. Work to specify a suitable + replacement is ongoing. + +C.1.8. Section 4.1.8 (Attribute) + + - Combined the definitions of PartialAttribute and Attribute here, + and defined Attribute in terms of PartialAttribute. + +C.1.9. Section 4.1.10 (Result Message) + + - Renamed "errorMessage" to "diagnosticMessage" as it is allowed to + be sent for non-error results. + - Moved some language into Appendix A, and referred the reader there. + - Allowed matchedDN to be present for other result codes than those + listed in RFC 2251. + - Renamed the code "strongAuthRequired" to "strongerAuthRequired" to + clarify that this code may often be returned to indicate that a + stronger authentication is needed to perform a given operation. + +C.1.10. Section 4.1.11 (Referral) + + - Defined referrals in terms of URIs rather than URLs. + - Removed the requirement that all referral URIs MUST be equally + capable of progressing the operation. The statement was ambiguous + and provided no instructions on how to carry it out. + - Added the requirement that clients MUST NOT loop between servers. + - Clarified the instructions for using LDAPURLs in referrals, and in + doing so added a recommendation that the scope part be present. + - Removed imperatives which required clients to use URLs in specific + ways to progress an operation. These did nothing for + interoperability. + + + + + + + + +Sermersheim Standards Track [Page 61] + +RFC 4511 LDAPv3 June 2006 + + +C.1.11. Section 4.1.12 (Controls) + + - Specified how control values defined in terms of ASN.1 are to be + encoded. + - Noted that the criticality field is only applied to request + messages (except UnbindRequest), and must be ignored when present + on response messages and UnbindRequest. + - Specified that non-critical controls may be ignored at the + server's discretion. There was confusion in the original wording + which led some to believe that recognized controls may not be + ignored as long as they were associated with a proper request. + - Added language regarding combinations of controls and the ordering + of controls on a message. + - Specified that when the semantics of the combination of controls + is undefined or unknown, it results in a protocolError. + - Changed "The server MUST be prepared" to "Implementations MUST be + prepared" in paragraph 8 to reflect that both client and server + implementations must be able to handle this (as both parse + controls). + +C.1.12. Section 4.2 (Bind Operation) + + - Mandated that servers return protocolError when the version is not + supported. + - Disambiguated behavior when the simple authentication is used, the + name is empty, and the password is non-empty. + - Required servers to not dereference aliases for Bind. This was + added for consistency with other operations and to help ensure + data consistency. + - Required that textual passwords be transferred as UTF-8 encoded + Unicode, and added recommendations on string preparation. This was + to help ensure interoperability of passwords being sent from + different clients. + +C.1.13. Section 4.2.1 (Sequencing of the Bind Request) + + - This section was largely reorganized for readability, and language + was added to clarify the authentication state of failed and + abandoned Bind operations. + - Removed: "If a SASL transfer encryption or integrity mechanism has + been negotiated, that mechanism does not support the changing of + credentials from one identity to another, then the client MUST + instead establish a new connection." + If there are dependencies between multiple negotiations of a + particular SASL mechanism, the technical specification for that + SASL mechanism details how applications are to deal with them. + LDAP should not require any special handling. + - Dropped MUST imperative in paragraph 3 to align with [RFC2119]. + + + +Sermersheim Standards Track [Page 62] + +RFC 4511 LDAPv3 June 2006 + + + - Mandated that clients not send non-Bind operations while a Bind is + in progress, and suggested that servers not process them if they + are received. This is needed to ensure proper sequencing of the + Bind in relationship to other operations. + +C.1.14. Section 4.2.3 (Bind Response) + + - Moved most error-related text to Appendix A, and added text + regarding certain errors used in conjunction with the Bind + operation. + - Prohibited the server from specifying serverSaslCreds when not + appropriate. + +C.1.15. Section 4.3 (Unbind Operation) + + - Specified that both peers are to cease transmission and terminate + the LDAP session for the Unbind operation. + +C.1.16. Section 4.4 (Unsolicited Notification) + + - Added instructions for future specifications of Unsolicited + Notifications. + +C.1.17. Section 4.5.1 (Search Request) + + - SearchRequest attributes is now defined as an AttributeSelection + type rather than AttributeDescriptionList, and an ABNF is + provided. + - SearchRequest attributes may contain duplicate attribute + descriptions. This was previously prohibited. Now servers are + instructed to ignore subsequent names when they are duplicated. + This was relaxed in order to allow different short names and also + OIDs to be requested for an attribute. + - The present search filter now evaluates to Undefined when the + specified attribute is not known to the server. It used to + evaluate to FALSE, which caused behavior inconsistent with what + most would expect, especially when the 'not' operator was used. + - The Filter choice SubstringFilter substrings type is now defined + with a lower bound of 1. + - The SubstringFilter substrings 'initial, 'any', and 'final' types + are now AssertionValue rather than LDAPString. Also, added + imperatives stating that 'initial' (if present) must be listed + first, and 'final' (if present) must be listed last. + - Disambiguated the semantics of the derefAliases choices. There was + question as to whether derefInSearching applied to the base object + in a wholeSubtree Search. + - Added instructions for equalityMatch, substrings, greaterOrEqual, + lessOrEqual, and approxMatch. + + + +Sermersheim Standards Track [Page 63] + +RFC 4511 LDAPv3 June 2006 + + + +C.1.18. Section 4.5.2 (Search Result) + + - Recommended that servers not use attribute short names when it + knows they are ambiguous or may cause interoperability problems. + - Removed all mention of ExtendedResponse due to lack of + implementation. + +C.1.19. Section 4.5.3 (Continuation References in the Search Result) + + - Made changes similar to those made to Section 4.1.11. + +C.1.20. Section 4.5.3.1 (Example) + + - Fixed examples to adhere to changes made to Section 4.5.3. + +C.1.21. Section 4.6 (Modify Operation) + + - Replaced AttributeTypeAndValues with Attribute as they are + equivalent. + - Specified the types of modification changes that might + temporarily violate schema. Some readers were under the impression + that any temporary schema violation was allowed. + +C.1.22. Section 4.7 (Add Operation) + + - Aligned Add operation with X.511 in that the attributes of the RDN + are used in conjunction with the listed attributes to create the + entry. Previously, Add required that the distinguished values be + present in the listed attributes. + - Removed requirement that the objectClass attribute MUST be + specified as some DSE types do not require this attribute. + Instead, generic wording was added, requiring the added entry to + adhere to the data model. + - Removed recommendation regarding placement of objects. This is + covered in the data model document. + +C.1.23. Section 4.9 (Modify DN Operation) + + - Required servers to not dereference aliases for Modify DN. This + was added for consistency with other operations and to help ensure + data consistency. + - Allow Modify DN to fail when moving between naming contexts. + - Specified what happens when the attributes of the newrdn are not + present on the entry. + + + + + + +Sermersheim Standards Track [Page 64] + +RFC 4511 LDAPv3 June 2006 + + +C.1.24. Section 4.10 (Compare Operation) + + - Specified that compareFalse means that the Compare took place and + the result is false. There was confusion that led people to + believe that an Undefined match resulted in compareFalse. + - Required servers to not dereference aliases for Compare. This was + added for consistency with other operations and to help ensure + data consistency. + +C.1.25. Section 4.11 (Abandon Operation) + + - Explained that since Abandon returns no response, clients should + not use it if they need to know the outcome. + - Specified that Abandon and Unbind cannot be abandoned. + +C.1.26. Section 4.12 (Extended Operation) + + - Specified how values of Extended operations defined in terms of + ASN.1 are to be encoded. + - Added instructions on what Extended operation specifications + consist of. + - Added a recommendation that servers advertise supported Extended + operations. + +C.1.27. Section 5.2 (Transfer Protocols) + + - Moved referral-specific instructions into referral-related + sections. + +C.1.28. Section 7 (Security Considerations) + + - Reworded notes regarding SASL not protecting certain aspects of + the LDAP Bind messages. + - Noted that Servers are encouraged to prevent directory + modifications by clients that have authenticated anonymously + [RFC4513]. + - Added a note regarding the possibility of changes to security + factors (authentication, authorization, and data confidentiality). + - Warned against following referrals that may have been injected in + the data stream. + - Noted that servers should protect information equally, whether in + an error condition or not, and mentioned matchedDN, + diagnosticMessage, and resultCodes specifically. + - Added a note regarding malformed and long encodings. + + + + + + + +Sermersheim Standards Track [Page 65] + +RFC 4511 LDAPv3 June 2006 + + +C.1.29. Appendix A (Complete ASN.1 Definition) + + - Added "EXTENSIBILITY IMPLIED" to ASN.1 definition. + - Removed AttributeType. It is not used. + +C.2. Changes Made to RFC 2830 + + This section summarizes the substantive changes made to Sections of + RFC 2830. Readers should consult [RFC4513] for summaries of changes + to other sections. + +C.2.1. Section 2.3 (Response other than "success") + + - Removed wording indicating that referrals can be returned from + StartTLS. + - Removed requirement that only a narrow set of result codes can be + returned. Some result codes are required in certain scenarios, but + any other may be returned if appropriate. + - Removed requirement that the ExtendedResponse.responseName MUST be + present. There are circumstances where this is impossible, and + requiring this is at odds with language in Section 4.12. + +C.2.1. Section 4 (Closing a TLS Connection) + + - Reworded most of this section to align with definitions of the + LDAP protocol layers. + - Removed instructions on abrupt closure as this is covered in other + areas of the document (specifically, Section 5.3) + +C.3. Changes Made to RFC 3771 + + - Rewrote to fit into this document. In general, semantics were + preserved. Supporting and background language seen as redundant + due to its presence in this document was omitted. + + - Specified that Intermediate responses to a request may be of + different types, and one of the response types may be specified to + have no response value. + + + + + + + + + + + + + +Sermersheim Standards Track [Page 66] + +RFC 4511 LDAPv3 June 2006 + + +Editor's Address + + Jim Sermersheim + Novell, Inc. + 1800 South Novell Place + Provo, Utah 84606, USA + + Phone: +1 801 861-3088 + EMail: jimse@novell.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Sermersheim Standards Track [Page 67] + +RFC 4511 LDAPv3 June 2006 + + +Full Copyright Statement + + Copyright (C) The Internet Society (2006). + + This document is subject to the rights, licenses and restrictions + contained in BCP 78, and except as set forth therein, the authors + retain all their rights. + + This document and the information contained herein are provided on an + "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS + OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET + ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE + INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED + WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Intellectual Property + + The IETF takes no position regarding the validity or scope of any + Intellectual Property Rights or other rights that might be claimed to + pertain to the implementation or use of the technology described in + this document or the extent to which any license under such rights + might or might not be available; nor does it represent that it has + made any independent effort to identify any such rights. Information + on the procedures with respect to rights in RFC documents can be + found in BCP 78 and BCP 79. + + Copies of IPR disclosures made to the IETF Secretariat and any + assurances of licenses to be made available, or the result of an + attempt made to obtain a general license or permission for the use of + such proprietary rights by implementers or users of this + specification can be obtained from the IETF on-line IPR repository at + http://www.ietf.org/ipr. + + The IETF invites any interested party to bring to its attention any + copyrights, patents or patent applications, or other proprietary + rights that may cover technology that may be required to implement + this standard. Please address the information to the IETF at + ietf-ipr@ietf.org. + +Acknowledgement + + Funding for the RFC Editor function is provided by the IETF + Administrative Support Activity (IASA). + + + + + + + +Sermersheim Standards Track [Page 68] + diff --git a/examples/sample.source.LDAP3/Makefile b/examples/sample.source.LDAP3/Makefile new file mode 100644 index 000000000..7063af719 --- /dev/null +++ b/examples/sample.source.LDAP3/Makefile @@ -0,0 +1,200 @@ +ASN_MODULE_SOURCES= \ + LDAPMessage.c \ + MessageID.c \ + LDAPString.c \ + LDAPOID.c \ + LDAPDN.c \ + RelativeLDAPDN.c \ + AttributeDescription.c \ + AttributeValue.c \ + AttributeValueAssertion.c \ + AssertionValue.c \ + PartialAttribute.c \ + Attribute.c \ + MatchingRuleId.c \ + LDAPResult.c \ + Referral.c \ + URI.c \ + Controls.c \ + Control.c \ + BindRequest.c \ + AuthenticationChoice.c \ + SaslCredentials.c \ + BindResponse.c \ + UnbindRequest.c \ + SearchRequest.c \ + AttributeSelection.c \ + Filter.c \ + SubstringFilter.c \ + MatchingRuleAssertion.c \ + SearchResultEntry.c \ + PartialAttributeList.c \ + SearchResultReference.c \ + SearchResultDone.c \ + ModifyRequest.c \ + ModifyResponse.c \ + AddRequest.c \ + AttributeList.c \ + AddResponse.c \ + DelRequest.c \ + DelResponse.c \ + ModifyDNRequest.c \ + ModifyDNResponse.c \ + CompareRequest.c \ + CompareResponse.c \ + AbandonRequest.c \ + ExtendedRequest.c \ + ExtendedResponse.c \ + IntermediateResponse.c + +ASN_MODULE_HEADERS= \ + LDAPMessage.h \ + MessageID.h \ + LDAPString.h \ + LDAPOID.h \ + LDAPDN.h \ + RelativeLDAPDN.h \ + AttributeDescription.h \ + AttributeValue.h \ + AttributeValueAssertion.h \ + AssertionValue.h \ + PartialAttribute.h \ + Attribute.h \ + MatchingRuleId.h \ + LDAPResult.h \ + Referral.h \ + URI.h \ + Controls.h \ + Control.h \ + BindRequest.h \ + AuthenticationChoice.h \ + SaslCredentials.h \ + BindResponse.h \ + UnbindRequest.h \ + SearchRequest.h \ + AttributeSelection.h \ + Filter.h \ + SubstringFilter.h \ + MatchingRuleAssertion.h \ + SearchResultEntry.h \ + PartialAttributeList.h \ + SearchResultReference.h \ + SearchResultDone.h \ + ModifyRequest.h \ + ModifyResponse.h \ + AddRequest.h \ + AttributeList.h \ + AddResponse.h \ + DelRequest.h \ + DelResponse.h \ + ModifyDNRequest.h \ + ModifyDNResponse.h \ + CompareRequest.h \ + CompareResponse.h \ + AbandonRequest.h \ + ExtendedRequest.h \ + ExtendedResponse.h \ + IntermediateResponse.h + +ASN_MODULE_HEADERS+=BOOLEAN.h +ASN_MODULE_SOURCES+=BOOLEAN.c +ASN_MODULE_HEADERS+=ENUMERATED.h +ASN_MODULE_SOURCES+=ENUMERATED.c +ASN_MODULE_HEADERS+=INTEGER.h +ASN_MODULE_HEADERS+=NativeEnumerated.h +ASN_MODULE_SOURCES+=INTEGER.c +ASN_MODULE_HEADERS+=NULL.h +ASN_MODULE_SOURCES+=NULL.c +ASN_MODULE_SOURCES+=NativeEnumerated.c +ASN_MODULE_HEADERS+=NativeInteger.h +ASN_MODULE_SOURCES+=NativeInteger.c +ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h +ASN_MODULE_SOURCES+=asn_SEQUENCE_OF.c +ASN_MODULE_HEADERS+=asn_SET_OF.h +ASN_MODULE_SOURCES+=asn_SET_OF.c +ASN_MODULE_HEADERS+=constr_CHOICE.h +ASN_MODULE_SOURCES+=constr_CHOICE.c +ASN_MODULE_HEADERS+=constr_SEQUENCE.h +ASN_MODULE_SOURCES+=constr_SEQUENCE.c +ASN_MODULE_HEADERS+=constr_SEQUENCE_OF.h +ASN_MODULE_SOURCES+=constr_SEQUENCE_OF.c +ASN_MODULE_HEADERS+=constr_SET_OF.h +ASN_MODULE_SOURCES+=constr_SET_OF.c +ASN_MODULE_HEADERS+=asn_application.h +ASN_MODULE_HEADERS+=asn_system.h +ASN_MODULE_HEADERS+=asn_codecs.h +ASN_MODULE_HEADERS+=asn_internal.h +ASN_MODULE_HEADERS+=OCTET_STRING.h +ASN_MODULE_SOURCES+=OCTET_STRING.c +ASN_MODULE_HEADERS+=BIT_STRING.h +ASN_MODULE_SOURCES+=BIT_STRING.c +ASN_MODULE_SOURCES+=asn_codecs_prim.c +ASN_MODULE_HEADERS+=asn_codecs_prim.h +ASN_MODULE_HEADERS+=ber_tlv_length.h +ASN_MODULE_SOURCES+=ber_tlv_length.c +ASN_MODULE_HEADERS+=ber_tlv_tag.h +ASN_MODULE_SOURCES+=ber_tlv_tag.c +ASN_MODULE_HEADERS+=ber_decoder.h +ASN_MODULE_SOURCES+=ber_decoder.c +ASN_MODULE_HEADERS+=der_encoder.h +ASN_MODULE_SOURCES+=der_encoder.c +ASN_MODULE_HEADERS+=constr_TYPE.h +ASN_MODULE_SOURCES+=constr_TYPE.c +ASN_MODULE_HEADERS+=constraints.h +ASN_MODULE_SOURCES+=constraints.c +ASN_MODULE_HEADERS+=xer_support.h +ASN_MODULE_SOURCES+=xer_support.c +ASN_MODULE_HEADERS+=xer_decoder.h +ASN_MODULE_SOURCES+=xer_decoder.c +ASN_MODULE_HEADERS+=xer_encoder.h +ASN_MODULE_SOURCES+=xer_encoder.c +ASN_MODULE_HEADERS+=per_support.h +ASN_MODULE_SOURCES+=per_support.c +ASN_MODULE_HEADERS+=per_decoder.h +ASN_MODULE_SOURCES+=per_decoder.c +ASN_MODULE_HEADERS+=per_encoder.h +ASN_MODULE_SOURCES+=per_encoder.c + + +lib_LTLIBRARIES=libsomething.la +libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) + +# This file may be used as an input for make(3) +# Remove the lines below to convert it into a pure .am file +TARGET = ldap3dump +CFLAGS += -I. -DHAVE_CONFIG_H +OBJS=${ASN_MODULE_SOURCES:.c=.o} $(TARGET).o + +all: LDAPMessage.c $(TARGET) + +$(TARGET): ${OBJS} + $(CC) $(CFLAGS) -o $(TARGET) ${OBJS} $(LDFLAGS) $(LIBS) + +.SUFFIXES: +.SUFFIXES: .c .o + +.c.o: + $(CC) $(CFLAGS) -o $@ -c $< + +clean: + rm -f $(TARGET) + rm -f $(OBJS) + +regen: regenerate-from-asn1-source + +regenerate-from-asn1-source: + ../../asn1c/asn1c -fcompound-names -S ../../skeletons ../rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1 + + +LDAPMessage.c: regenerate.Makefile + ./regenerate.Makefile + @touch LDAPMessage.c + make + +ASN_CONVERTER=../../skeletons/converter-sample.c +$(TARGET).o: $(ASN_CONVERTER) + $(CC) $(CFLAGS) -DPDU=LDAPMessage -o $(TARGET).o -c $(ASN_CONVERTER) + +distclean: clean + rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) + rm -f Makefile.am.sample diff --git a/examples/sample.source.LDAP3/README b/examples/sample.source.LDAP3/README new file mode 100644 index 000000000..6fb4e4cb2 --- /dev/null +++ b/examples/sample.source.LDAP3/README @@ -0,0 +1,20 @@ + +GENERAL INFORMATION +=================== + +The LDAPv3 (Lightweight Directory Access Protocol) PDU decoder. +Invoking `make` will compile the ASN.1 specifications from the rfc4211.txt +in the above directory. + +The ../../skeletons/converter-sample.c will supply the missing +"int main()" routine which drives the decoding process. + +ldap3dump USAGE +============== + + ./ldap3dump LDAPMessage.ber # Print as XML (BASIC-XER) + +The full list of recognized command line options may be obtained with + + > ./ldap3dump -h + diff --git a/examples/sample.source.LDAP3/config.h b/examples/sample.source.LDAP3/config.h new file mode 100644 index 000000000..2dda9297a --- /dev/null +++ b/examples/sample.source.LDAP3/config.h @@ -0,0 +1,10 @@ + +extern int opt_debug; + +#define ASN_DEBUG(fmt, args...) do { \ + if(opt_debug < 2) break; \ + fprintf(stderr, fmt, ##args); \ + fprintf(stderr, " (%s:%d)\n", \ + __FILE__, __LINE__); \ + } while(0) + From 2a75f9c1dd1f4100b3586bd668134064ff26eda5 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 9 Sep 2006 11:40:23 +0000 Subject: [PATCH 1165/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1165 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/Makefile.in | 3 ++- examples/sample.source.LDAP3/sample-LDAPMessage-1.ber | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 examples/sample.source.LDAP3/sample-LDAPMessage-1.ber diff --git a/examples/Makefile.in b/examples/Makefile.in index 8cb199cb5..078632285 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -180,7 +180,8 @@ EXTRA_DIST = $(srcdir)/rfc*.txt \ $(srcdir)/sample.source.*/README \ $(srcdir)/sample.source.*/config.h \ $(srcdir)/sample.source.*/Makefile \ - $(srcdir)/sample.source.*/regenerate.Makefile + $(srcdir)/sample.source.*/regenerate.Makefile \ + $(srcdir)/sample.source.*/sample-* CLEANFILES = $(ASN1_FILES_1) $(ASN1_FILES_2) $(ASN1_FILES_3) all: all-am diff --git a/examples/sample.source.LDAP3/sample-LDAPMessage-1.ber b/examples/sample.source.LDAP3/sample-LDAPMessage-1.ber new file mode 100644 index 000000000..78b2ab50d --- /dev/null +++ b/examples/sample.source.LDAP3/sample-LDAPMessage-1.ber @@ -0,0 +1 @@ +0 ` uid=a,dc=com€password \ No newline at end of file From 2a4c670cf9e57babfd88bb530add6c65c38255a1 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 9 Sep 2006 12:02:18 +0000 Subject: [PATCH 1166/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1166 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/Makefile.am | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/Makefile.am b/examples/Makefile.am index c5c435e66..f10d6c1d0 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -29,7 +29,8 @@ EXTRA_DIST = $(srcdir)/rfc*.txt \ $(srcdir)/sample.source.*/README \ $(srcdir)/sample.source.*/config.h \ $(srcdir)/sample.source.*/Makefile \ - $(srcdir)/sample.source.*/regenerate.Makefile + $(srcdir)/sample.source.*/regenerate.Makefile \ + $(srcdir)/sample.source.*/sample-* CLEANFILES = $(ASN1_FILES_1) $(ASN1_FILES_2) $(ASN1_FILES_3) From ed176d2441530a714e3631a9de8d0013c8237a70 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 9 Sep 2006 12:09:47 +0000 Subject: [PATCH 1167/1469] sample X.509 certificate file git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1167 59561ff5-6e30-0410-9f3c-9617f08c8826 --- .../sample.source.PKIX1/sample-Certificate-1.der | Bin 0 -> 1128 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/sample.source.PKIX1/sample-Certificate-1.der diff --git a/examples/sample.source.PKIX1/sample-Certificate-1.der b/examples/sample.source.PKIX1/sample-Certificate-1.der new file mode 100644 index 0000000000000000000000000000000000000000..972ca914eda95eeabd95b9312749ebb63961f0c2 GIT binary patch literal 1128 zcmXqLVo5P*V)j|U%*4pVB;c}-r#pZ_WsBftGXw7f#^nZFY@Awc9&O*b7#Uev84Ma1 z8*&?PvN4CUun9AT2E#ZUKu(CExPd50hFzF1I5DS0!6z|0Rlzy4q|#8%Kn5hiB`g|} zk*W|H>>3mj6dD|&;Fnrbo?n!0sAwP$lIIqd$S5f(u+rBrFE7_CElw>eDJm^4(M!(H zHPklH1Sw$_RtgRA(*+sfmRVF>q6;-b!LgtqCo?&*Br`v+*g#I4%hJ-o+`!V%!o!&Sj4ykRkyd#8V3q5iu+_CI%sHMDn5R#lkg+?1(OrV(knQ1(E5Gh2$7g3e{nC9PWy zB-RIV{KycU*l>F3)pyobUs_n=5+axPm=wL+QE~L5wUAeSU8?%dC80-m<~uJrDyuW| zK+uv3AJNSYGdQxHk1=kjs{WcSqhx>j{r?pgth~!a=UuvZOz-jSaA~7OJMv$&Ewe9J z{j^}xY8N?&fZuZ#Cq2o@TX5puqXws6FZExXGh*ql>D?}~*wjY!?!3e6rY~h;W@KPo z+&IyovCn`Tm^ftlSy+In_?Q7dh$GC%_@9N`$btm;Sj1RFezl#v{b1M2im%=) zu8H3NaQR`Dh>d|iNLrr7!@$kJWr5QIhc-KCGE6SYK~0AGSQ8&|+S3E-L5?+GrUAwp zBg2xj&ol zaFR9N`+95jl*5NtF3`PyQBz*_U%&nC6|P$K7xO|@9_?oOZD_ym#hy0~+CLbtgjqZ} z<I5a{#VpjZd>|C>};{2{f<=i^H+kUKCH=` z@6XD^+_=0&^GMX*l<=ap*5}P7md!Y}mTk)&j>RljHJ41AC6w;fli)h{qw=f`40AHJ z&Iq{tzE5vb>P8Pc#eJd%T3lOs7H8Y9s}KJwKdt6|{@o@6om6QDud^9Di{2ELy$R`) QZ{=ak`nAkrjr@@o0NRP1Pyhe` literal 0 HcmV?d00001 From 7ccbecc00fa9c5df28e1f252b7368c495d7472d2 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 12 Sep 2006 04:21:30 +0000 Subject: [PATCH 1168/1469] asn1p_free -> asn1p_delete git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1168 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_module.c | 2 +- libasn1parser/asn1p_module.h | 2 +- libasn1parser/asn1parser.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libasn1parser/asn1p_module.c b/libasn1parser/asn1p_module.c index 0202f0ff3..8a47df667 100644 --- a/libasn1parser/asn1p_module.c +++ b/libasn1parser/asn1p_module.c @@ -52,7 +52,7 @@ asn1p_new() { void -asn1p_free(asn1p_t *asn) { +asn1p_delete(asn1p_t *asn) { if(asn) { asn1p_module_t *mod; while((mod = TQ_REMOVE(&(asn->modules), mod_next))) diff --git a/libasn1parser/asn1p_module.h b/libasn1parser/asn1p_module.h index 618c6e7df..5e7ce15dc 100644 --- a/libasn1parser/asn1p_module.h +++ b/libasn1parser/asn1p_module.h @@ -93,7 +93,7 @@ typedef struct asn1p_s { } asn1p_t; asn1p_t *asn1p_new(void); -void asn1p_free(asn1p_t *asn); +void asn1p_delete(asn1p_t *asn); #endif /* ASN1_PARSER_MODULE_H */ diff --git a/libasn1parser/asn1parser.c b/libasn1parser/asn1parser.c index 6c8faf00d..a2e2ae28a 100644 --- a/libasn1parser/asn1parser.c +++ b/libasn1parser/asn1parser.c @@ -56,7 +56,7 @@ asn1p_parse_buffer(const char *buffer, int size /* = -1 */, enum asn1p_flags fla if(_asn1p_fix_modules(a, "-")) return NULL; /* FIXME: destroy (a) */ } else if(a) { - asn1p_free(a); + asn1p_delete(a); a = NULL; } @@ -113,7 +113,7 @@ asn1p_parse_file(const char *filename, enum asn1p_flags flags) { if(_asn1p_fix_modules(a, filename)) return NULL; /* FIXME: destroy (a) */ } else if(a) { - asn1p_free(a); + asn1p_delete(a); a = NULL; } From 0d45efed0ad4d901c1224a287846aef5af27377e Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 12 Sep 2006 04:22:10 +0000 Subject: [PATCH 1169/1469] some flex version does not allow merged arguments git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1169 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/Makefile.am | 2 +- libasn1parser/Makefile.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libasn1parser/Makefile.am b/libasn1parser/Makefile.am index a1455f4d4..fcb0ef15f 100644 --- a/libasn1parser/Makefile.am +++ b/libasn1parser/Makefile.am @@ -1,7 +1,7 @@ AM_CFLAGS = @ADD_CFLAGS@ AM_YFLAGS = -p asn1p_ -d -AM_LFLAGS = -sp -Cem -Pasn1p_ -olex.yy.c +AM_LFLAGS = -s -p -Cem -Pasn1p_ -olex.yy.c noinst_LTLIBRARIES = libasn1parser.la diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index 99250caf1..822a73047 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -186,7 +186,7 @@ target_os = @target_os@ target_vendor = @target_vendor@ AM_CFLAGS = @ADD_CFLAGS@ AM_YFLAGS = -p asn1p_ -d -AM_LFLAGS = -sp -Cem -Pasn1p_ -olex.yy.c +AM_LFLAGS = -s -p -Cem -Pasn1p_ -olex.yy.c noinst_LTLIBRARIES = libasn1parser.la libasn1parser_la_LDFLAGS = -all-static libasn1parser_la_SOURCES = \ From 68319708558a914f83f912cc1d7d6b5c346962d9 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 12 Sep 2006 05:19:28 +0000 Subject: [PATCH 1170/1469] api change git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1170 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_bitstring.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libasn1fix/asn1fix_bitstring.c b/libasn1fix/asn1fix_bitstring.c index 5f30ea4f9..8cf6b95eb 100644 --- a/libasn1fix/asn1fix_bitstring.c +++ b/libasn1fix/asn1fix_bitstring.c @@ -229,14 +229,14 @@ asn1f_BS_unparsed_convert(arg_t *arg, asn1p_value_t *value, asn1p_expr_t *ttype) arg->expr->Identifier, arg->expr->_lineno ); - asn1p_free(asn); + asn1p_delete(asn); return -1; } bits = aI + 1; /* Number of bits is more than a last bit position */ bitbuf = calloc(1, 1 + ((bits + 7) / 8)); if(bitbuf == NULL) { - asn1p_free(asn); + asn1p_delete(asn); return -1; } @@ -281,7 +281,7 @@ asn1f_BS_unparsed_convert(arg_t *arg, asn1p_value_t *value, asn1p_expr_t *ttype) bitbuf[set_bit_pos>>3] |= 1 << (7-(set_bit_pos % 8)); } - asn1p_free(asn); + asn1p_delete(asn); free(value->value.string.buf); value->type = ATV_BITVECTOR; value->value.binary_vector.bits = bitbuf; From 95ca54751aec9451664069a0ef1432f700d6cfd3 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 12 Sep 2006 05:22:12 +0000 Subject: [PATCH 1171/1469] API change required _free -> _delete git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1171 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/asn1c.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index 8a6cd0774..9b1a3fcbd 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -259,7 +259,7 @@ main(int ac, char **av) { asn1p_module_t *mod; while((mod = TQ_REMOVE(&(new_asn->modules), mod_next))) TQ_ADD(&(asn->modules), mod, mod_next); - asn1p_free(new_asn); + asn1p_delete(new_asn); } else { asn = new_asn; } @@ -405,7 +405,7 @@ importStandardModules(asn1p_t *asn, const char *skeletons_dir) { mod->_tags |= MT_STANDARD_MODULE; TQ_ADD(&(asn->modules), mod, mod_next); } - asn1p_free(new_asn); + asn1p_delete(new_asn); #ifdef WIN32 } while(_findnext(dir, &c_file) == 0); From 8e3a79b7685542aca8b13db79e6584a7e5ce5f40 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 12 Sep 2006 06:19:15 +0000 Subject: [PATCH 1172/1469] new way of Makefile regeneration git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1172 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/Makefile.am | 2 +- examples/Makefile.in | 2 +- examples/README | 2 +- examples/sample.source.LDAP3/Makefile | 64 +++++++++++++++++--- examples/sample.source.MEGACO/Makefile | 60 ++++++++++++++++--- examples/sample.source.MHEG5/Makefile | 81 ++++++++++++++++++++----- examples/sample.source.PKIX1/Makefile | 38 +++++++++--- examples/sample.source.TAP3/Makefile | 83 ++++++++++++++++++++++---- 8 files changed, 275 insertions(+), 57 deletions(-) diff --git a/examples/Makefile.am b/examples/Makefile.am index f10d6c1d0..525ca4891 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -26,10 +26,10 @@ $(ASN1_FILES_3): crfc2asn1.pl $(ASN1_SOURCE_3) ./crfc2asn1.pl $(ASN1_SOURCE_3) EXTRA_DIST = $(srcdir)/rfc*.txt \ + $(srcdir)/sample.source.regen \ $(srcdir)/sample.source.*/README \ $(srcdir)/sample.source.*/config.h \ $(srcdir)/sample.source.*/Makefile \ - $(srcdir)/sample.source.*/regenerate.Makefile \ $(srcdir)/sample.source.*/sample-* CLEANFILES = $(ASN1_FILES_1) $(ASN1_FILES_2) $(ASN1_FILES_3) diff --git a/examples/Makefile.in b/examples/Makefile.in index 078632285..852a2981d 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -177,10 +177,10 @@ ASN1_FILES_3 = \ rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1 EXTRA_DIST = $(srcdir)/rfc*.txt \ + $(srcdir)/sample.source.regen \ $(srcdir)/sample.source.*/README \ $(srcdir)/sample.source.*/config.h \ $(srcdir)/sample.source.*/Makefile \ - $(srcdir)/sample.source.*/regenerate.Makefile \ $(srcdir)/sample.source.*/sample-* CLEANFILES = $(ASN1_FILES_1) $(ASN1_FILES_2) $(ASN1_FILES_3) diff --git a/examples/README b/examples/README index 2ce340a10..85247f390 100644 --- a/examples/README +++ b/examples/README @@ -2,7 +2,7 @@ This directory contains a few examples. 1. The ./sample.source.PKIX1 directory contains the X.509 Certificate decoder, - as specified in rfc3280.txt. + as specified in rfc3280.txt. Just type `make` in there to compile. 2. The ./sample.source.TAP3 directory contains the GSM TAP3 decoder. Before trying to compile, read the README file in that directory. diff --git a/examples/sample.source.LDAP3/Makefile b/examples/sample.source.LDAP3/Makefile index 7063af719..6337062eb 100644 --- a/examples/sample.source.LDAP3/Makefile +++ b/examples/sample.source.LDAP3/Makefile @@ -96,18 +96,60 @@ ASN_MODULE_HEADERS= \ ExtendedResponse.h \ IntermediateResponse.h +ASN_MODULE_HEADERS+=ANY.h +ASN_MODULE_SOURCES+=ANY.c +ASN_MODULE_HEADERS+=BMPString.h +ASN_MODULE_SOURCES+=BMPString.c +ASN_MODULE_HEADERS+=UTF8String.h ASN_MODULE_HEADERS+=BOOLEAN.h ASN_MODULE_SOURCES+=BOOLEAN.c ASN_MODULE_HEADERS+=ENUMERATED.h ASN_MODULE_SOURCES+=ENUMERATED.c ASN_MODULE_HEADERS+=INTEGER.h ASN_MODULE_HEADERS+=NativeEnumerated.h +ASN_MODULE_HEADERS+=GeneralString.h +ASN_MODULE_SOURCES+=GeneralString.c +ASN_MODULE_HEADERS+=GeneralizedTime.h +ASN_MODULE_SOURCES+=GeneralizedTime.c +ASN_MODULE_HEADERS+=GraphicString.h +ASN_MODULE_SOURCES+=GraphicString.c +ASN_MODULE_HEADERS+=IA5String.h +ASN_MODULE_SOURCES+=IA5String.c ASN_MODULE_SOURCES+=INTEGER.c +ASN_MODULE_HEADERS+=ISO646String.h +ASN_MODULE_SOURCES+=ISO646String.c ASN_MODULE_HEADERS+=NULL.h ASN_MODULE_SOURCES+=NULL.c ASN_MODULE_SOURCES+=NativeEnumerated.c ASN_MODULE_HEADERS+=NativeInteger.h ASN_MODULE_SOURCES+=NativeInteger.c +ASN_MODULE_HEADERS+=NativeReal.h +ASN_MODULE_SOURCES+=NativeReal.c +ASN_MODULE_HEADERS+=REAL.h +ASN_MODULE_HEADERS+=NumericString.h +ASN_MODULE_SOURCES+=NumericString.c +ASN_MODULE_HEADERS+=OBJECT_IDENTIFIER.h +ASN_MODULE_SOURCES+=OBJECT_IDENTIFIER.c +ASN_MODULE_HEADERS+=ObjectDescriptor.h +ASN_MODULE_SOURCES+=ObjectDescriptor.c +ASN_MODULE_HEADERS+=PrintableString.h +ASN_MODULE_SOURCES+=PrintableString.c +ASN_MODULE_SOURCES+=REAL.c +ASN_MODULE_HEADERS+=RELATIVE-OID.h +ASN_MODULE_SOURCES+=RELATIVE-OID.c +ASN_MODULE_HEADERS+=T61String.h +ASN_MODULE_SOURCES+=T61String.c +ASN_MODULE_HEADERS+=TeletexString.h +ASN_MODULE_SOURCES+=TeletexString.c +ASN_MODULE_HEADERS+=UTCTime.h +ASN_MODULE_SOURCES+=UTCTime.c +ASN_MODULE_SOURCES+=UTF8String.c +ASN_MODULE_HEADERS+=UniversalString.h +ASN_MODULE_SOURCES+=UniversalString.c +ASN_MODULE_HEADERS+=VideotexString.h +ASN_MODULE_SOURCES+=VideotexString.c +ASN_MODULE_HEADERS+=VisibleString.h +ASN_MODULE_SOURCES+=VisibleString.c ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h ASN_MODULE_SOURCES+=asn_SEQUENCE_OF.c ASN_MODULE_HEADERS+=asn_SET_OF.h @@ -119,6 +161,8 @@ ASN_MODULE_SOURCES+=constr_SEQUENCE.c ASN_MODULE_HEADERS+=constr_SEQUENCE_OF.h ASN_MODULE_SOURCES+=constr_SEQUENCE_OF.c ASN_MODULE_HEADERS+=constr_SET_OF.h +ASN_MODULE_HEADERS+=constr_SET.h +ASN_MODULE_SOURCES+=constr_SET.c ASN_MODULE_SOURCES+=constr_SET_OF.c ASN_MODULE_HEADERS+=asn_application.h ASN_MODULE_HEADERS+=asn_system.h @@ -154,6 +198,7 @@ ASN_MODULE_HEADERS+=per_decoder.h ASN_MODULE_SOURCES+=per_decoder.c ASN_MODULE_HEADERS+=per_encoder.h ASN_MODULE_SOURCES+=per_encoder.c +ASN_CONVERTER_SOURCES+=converter-sample.c lib_LTLIBRARIES=libsomething.la @@ -162,8 +207,8 @@ libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) # This file may be used as an input for make(3) # Remove the lines below to convert it into a pure .am file TARGET = ldap3dump -CFLAGS += -I. -DHAVE_CONFIG_H -OBJS=${ASN_MODULE_SOURCES:.c=.o} $(TARGET).o +CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=LDAPMessage +OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} all: LDAPMessage.c $(TARGET) @@ -183,18 +228,19 @@ clean: regen: regenerate-from-asn1-source regenerate-from-asn1-source: - ../../asn1c/asn1c -fcompound-names -S ../../skeletons ../rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1 + ../../asn1c/asn1c -S ../../skeletons -fcompound-names ../rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1 -LDAPMessage.c: regenerate.Makefile - ./regenerate.Makefile +LDAPMessage.c: ../sample.source.regen + ASN1CMDOPTS="-fcompound-names" \ + ASN1MODULES="../rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1" \ + ASN1PDU=LDAPMessage \ + PROGNAME=ldap3dump \ + ../sample.source.regen @touch LDAPMessage.c make -ASN_CONVERTER=../../skeletons/converter-sample.c -$(TARGET).o: $(ASN_CONVERTER) - $(CC) $(CFLAGS) -DPDU=LDAPMessage -o $(TARGET).o -c $(ASN_CONVERTER) - distclean: clean rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) + rm -f $(ASN_CONVERTER_SOURCES) $(ASN_CONVERTER_HEADERS) rm -f Makefile.am.sample diff --git a/examples/sample.source.MEGACO/Makefile b/examples/sample.source.MEGACO/Makefile index e250b52f7..ce3072666 100644 --- a/examples/sample.source.MEGACO/Makefile +++ b/examples/sample.source.MEGACO/Makefile @@ -214,22 +214,60 @@ ASN_MODULE_HEADERS= \ TimeNotation.h \ Value.h +ASN_MODULE_HEADERS+=ANY.h +ASN_MODULE_SOURCES+=ANY.c +ASN_MODULE_HEADERS+=BMPString.h +ASN_MODULE_SOURCES+=BMPString.c +ASN_MODULE_HEADERS+=UTF8String.h ASN_MODULE_HEADERS+=BOOLEAN.h ASN_MODULE_SOURCES+=BOOLEAN.c ASN_MODULE_HEADERS+=ENUMERATED.h ASN_MODULE_SOURCES+=ENUMERATED.c ASN_MODULE_HEADERS+=INTEGER.h ASN_MODULE_HEADERS+=NativeEnumerated.h +ASN_MODULE_HEADERS+=GeneralString.h +ASN_MODULE_SOURCES+=GeneralString.c +ASN_MODULE_HEADERS+=GeneralizedTime.h +ASN_MODULE_SOURCES+=GeneralizedTime.c +ASN_MODULE_HEADERS+=GraphicString.h +ASN_MODULE_SOURCES+=GraphicString.c ASN_MODULE_HEADERS+=IA5String.h ASN_MODULE_SOURCES+=IA5String.c ASN_MODULE_SOURCES+=INTEGER.c +ASN_MODULE_HEADERS+=ISO646String.h +ASN_MODULE_SOURCES+=ISO646String.c ASN_MODULE_HEADERS+=NULL.h ASN_MODULE_SOURCES+=NULL.c ASN_MODULE_SOURCES+=NativeEnumerated.c ASN_MODULE_HEADERS+=NativeInteger.h ASN_MODULE_SOURCES+=NativeInteger.c +ASN_MODULE_HEADERS+=NativeReal.h +ASN_MODULE_SOURCES+=NativeReal.c +ASN_MODULE_HEADERS+=REAL.h +ASN_MODULE_HEADERS+=NumericString.h +ASN_MODULE_SOURCES+=NumericString.c ASN_MODULE_HEADERS+=OBJECT_IDENTIFIER.h ASN_MODULE_SOURCES+=OBJECT_IDENTIFIER.c +ASN_MODULE_HEADERS+=ObjectDescriptor.h +ASN_MODULE_SOURCES+=ObjectDescriptor.c +ASN_MODULE_HEADERS+=PrintableString.h +ASN_MODULE_SOURCES+=PrintableString.c +ASN_MODULE_SOURCES+=REAL.c +ASN_MODULE_HEADERS+=RELATIVE-OID.h +ASN_MODULE_SOURCES+=RELATIVE-OID.c +ASN_MODULE_HEADERS+=T61String.h +ASN_MODULE_SOURCES+=T61String.c +ASN_MODULE_HEADERS+=TeletexString.h +ASN_MODULE_SOURCES+=TeletexString.c +ASN_MODULE_HEADERS+=UTCTime.h +ASN_MODULE_SOURCES+=UTCTime.c +ASN_MODULE_SOURCES+=UTF8String.c +ASN_MODULE_HEADERS+=UniversalString.h +ASN_MODULE_SOURCES+=UniversalString.c +ASN_MODULE_HEADERS+=VideotexString.h +ASN_MODULE_SOURCES+=VideotexString.c +ASN_MODULE_HEADERS+=VisibleString.h +ASN_MODULE_SOURCES+=VisibleString.c ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h ASN_MODULE_SOURCES+=asn_SEQUENCE_OF.c ASN_MODULE_HEADERS+=asn_SET_OF.h @@ -241,6 +279,8 @@ ASN_MODULE_SOURCES+=constr_SEQUENCE.c ASN_MODULE_HEADERS+=constr_SEQUENCE_OF.h ASN_MODULE_SOURCES+=constr_SEQUENCE_OF.c ASN_MODULE_HEADERS+=constr_SET_OF.h +ASN_MODULE_HEADERS+=constr_SET.h +ASN_MODULE_SOURCES+=constr_SET.c ASN_MODULE_SOURCES+=constr_SET_OF.c ASN_MODULE_HEADERS+=asn_application.h ASN_MODULE_HEADERS+=asn_system.h @@ -276,6 +316,7 @@ ASN_MODULE_HEADERS+=per_decoder.h ASN_MODULE_SOURCES+=per_decoder.c ASN_MODULE_HEADERS+=per_encoder.h ASN_MODULE_SOURCES+=per_encoder.c +ASN_CONVERTER_SOURCES+=converter-sample.c lib_LTLIBRARIES=libsomething.la @@ -284,8 +325,8 @@ libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) # This file may be used as an input for make(3) # Remove the lines below to convert it into a pure .am file TARGET = megacoDump -CFLAGS += -I. -DHAVE_CONFIG_H -OBJS=${ASN_MODULE_SOURCES:.c=.o} $(TARGET).o +CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=MegacoMessage +OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} all: MegacoMessage.c $(TARGET) @@ -305,18 +346,19 @@ clean: regen: regenerate-from-asn1-source regenerate-from-asn1-source: - ../../asn1c/asn1c -fcompound-names -S ../../skeletons ../rfc3525-MEDIA-GATEWAY-CONTROL.asn1 + ../../asn1c/asn1c -S ../../skeletons -fcompound-names ../rfc3525-MEDIA-GATEWAY-CONTROL.asn1 -MegacoMessage.c: regenerate.Makefile - ./regenerate.Makefile +MegacoMessage.c: ../sample.source.regen + ASN1CMDOPTS="-fcompound-names" \ + ASN1MODULES="../rfc3525-MEDIA-GATEWAY-CONTROL.asn1" \ + ASN1PDU=MegacoMessage \ + PROGNAME=megacoDump \ + ../sample.source.regen @touch MegacoMessage.c make -ASN_CONVERTER=../../skeletons/converter-sample.c -$(TARGET).o: $(ASN_CONVERTER) - $(CC) $(CFLAGS) -DPDU=MegacoMessage -o $(TARGET).o -c $(ASN_CONVERTER) - distclean: clean rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) + rm -f $(ASN_CONVERTER_SOURCES) $(ASN_CONVERTER_HEADERS) rm -f Makefile.am.sample diff --git a/examples/sample.source.MHEG5/Makefile b/examples/sample.source.MHEG5/Makefile index 43e6b90cf..dc3afa60d 100644 --- a/examples/sample.source.MHEG5/Makefile +++ b/examples/sample.source.MHEG5/Makefile @@ -186,7 +186,8 @@ ASN_MODULE_SOURCES= \ GenericBoolean.c \ GenericOctetString.c \ Colour.c \ - XYPosition.c + XYPosition.c \ + OctetString.c ASN_MODULE_HEADERS= \ InterchangedObject.h \ @@ -376,16 +377,63 @@ ASN_MODULE_HEADERS= \ GenericBoolean.h \ GenericOctetString.h \ Colour.h \ - XYPosition.h + XYPosition.h \ + OctetString.h +ASN_MODULE_HEADERS+=ANY.h +ASN_MODULE_SOURCES+=ANY.c +ASN_MODULE_HEADERS+=BMPString.h +ASN_MODULE_SOURCES+=BMPString.c +ASN_MODULE_HEADERS+=UTF8String.h ASN_MODULE_HEADERS+=BOOLEAN.h ASN_MODULE_SOURCES+=BOOLEAN.c ASN_MODULE_HEADERS+=ENUMERATED.h ASN_MODULE_SOURCES+=ENUMERATED.c ASN_MODULE_HEADERS+=INTEGER.h +ASN_MODULE_HEADERS+=NativeEnumerated.h +ASN_MODULE_HEADERS+=GeneralString.h +ASN_MODULE_SOURCES+=GeneralString.c +ASN_MODULE_HEADERS+=GeneralizedTime.h +ASN_MODULE_SOURCES+=GeneralizedTime.c +ASN_MODULE_HEADERS+=GraphicString.h +ASN_MODULE_SOURCES+=GraphicString.c +ASN_MODULE_HEADERS+=IA5String.h +ASN_MODULE_SOURCES+=IA5String.c ASN_MODULE_SOURCES+=INTEGER.c +ASN_MODULE_HEADERS+=ISO646String.h +ASN_MODULE_SOURCES+=ISO646String.c ASN_MODULE_HEADERS+=NULL.h ASN_MODULE_SOURCES+=NULL.c +ASN_MODULE_SOURCES+=NativeEnumerated.c +ASN_MODULE_HEADERS+=NativeInteger.h +ASN_MODULE_SOURCES+=NativeInteger.c +ASN_MODULE_HEADERS+=NativeReal.h +ASN_MODULE_SOURCES+=NativeReal.c +ASN_MODULE_HEADERS+=REAL.h +ASN_MODULE_HEADERS+=NumericString.h +ASN_MODULE_SOURCES+=NumericString.c +ASN_MODULE_HEADERS+=OBJECT_IDENTIFIER.h +ASN_MODULE_SOURCES+=OBJECT_IDENTIFIER.c +ASN_MODULE_HEADERS+=ObjectDescriptor.h +ASN_MODULE_SOURCES+=ObjectDescriptor.c +ASN_MODULE_HEADERS+=PrintableString.h +ASN_MODULE_SOURCES+=PrintableString.c +ASN_MODULE_SOURCES+=REAL.c +ASN_MODULE_HEADERS+=RELATIVE-OID.h +ASN_MODULE_SOURCES+=RELATIVE-OID.c +ASN_MODULE_HEADERS+=T61String.h +ASN_MODULE_SOURCES+=T61String.c +ASN_MODULE_HEADERS+=TeletexString.h +ASN_MODULE_SOURCES+=TeletexString.c +ASN_MODULE_HEADERS+=UTCTime.h +ASN_MODULE_SOURCES+=UTCTime.c +ASN_MODULE_SOURCES+=UTF8String.c +ASN_MODULE_HEADERS+=UniversalString.h +ASN_MODULE_SOURCES+=UniversalString.c +ASN_MODULE_HEADERS+=VideotexString.h +ASN_MODULE_SOURCES+=VideotexString.c +ASN_MODULE_HEADERS+=VisibleString.h +ASN_MODULE_SOURCES+=VisibleString.c ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h ASN_MODULE_SOURCES+=asn_SEQUENCE_OF.c ASN_MODULE_HEADERS+=asn_SET_OF.h @@ -428,6 +476,13 @@ ASN_MODULE_HEADERS+=xer_decoder.h ASN_MODULE_SOURCES+=xer_decoder.c ASN_MODULE_HEADERS+=xer_encoder.h ASN_MODULE_SOURCES+=xer_encoder.c +ASN_MODULE_HEADERS+=per_support.h +ASN_MODULE_SOURCES+=per_support.c +ASN_MODULE_HEADERS+=per_decoder.h +ASN_MODULE_SOURCES+=per_decoder.c +ASN_MODULE_HEADERS+=per_encoder.h +ASN_MODULE_SOURCES+=per_encoder.c +ASN_CONVERTER_SOURCES+=converter-sample.c lib_LTLIBRARIES=libsomething.la @@ -436,8 +491,8 @@ libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) # This file may be used as an input for make(3) # Remove the lines below to convert it into a pure .am file TARGET = mheg5dump -CFLAGS += -I. -DHAVE_CONFIG_H -OBJS=${ASN_MODULE_SOURCES:.c=.o} $(TARGET).o +CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=InterchangedObject +OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} all: InterchangedObject.c $(TARGET) @@ -460,20 +515,16 @@ regenerate-from-asn1-source: ../../asn1c/asn1c -S ../../skeletons -fcompound-names ../ISO13522-MHEG-5.asn -../ISO13522-MHEG-5.asn: - @echo The ../ISO13522-MHEG-5.asn file is not yet present. - @echo Please read the README file on how to obtain this file. - @exit 42 - -InterchangedObject.c: ../ISO13522-MHEG-5.asn regenerate.Makefile - ./regenerate.Makefile +InterchangedObject.c: ../sample.source.regen + ASN1CMDOPTS="-fcompound-names" \ + ASN1MODULES="../ISO13522-MHEG-5.asn" \ + ASN1PDU=InterchangedObject \ + PROGNAME=mheg5dump \ + ../sample.source.regen @touch InterchangedObject.c make -ASN_CONVERTER=../../skeletons/converter-sample.c -$(TARGET).o: $(ASN_CONVERTER) - $(CC) $(CFLAGS) -DPDU=InterchangedObject -o $(TARGET).o -c $(ASN_CONVERTER) - distclean: clean rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) + rm -f $(ASN_CONVERTER_SOURCES) $(ASN_CONVERTER_HEADERS) rm -f Makefile.am.sample diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index 8ea848d24..caa5b8512 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -265,20 +265,38 @@ ASN_MODULE_HEADERS+=ENUMERATED.h ASN_MODULE_SOURCES+=ENUMERATED.c ASN_MODULE_HEADERS+=INTEGER.h ASN_MODULE_HEADERS+=NativeEnumerated.h +ASN_MODULE_HEADERS+=GeneralString.h +ASN_MODULE_SOURCES+=GeneralString.c ASN_MODULE_HEADERS+=GeneralizedTime.h ASN_MODULE_SOURCES+=GeneralizedTime.c +ASN_MODULE_HEADERS+=GraphicString.h +ASN_MODULE_SOURCES+=GraphicString.c ASN_MODULE_HEADERS+=IA5String.h ASN_MODULE_SOURCES+=IA5String.c ASN_MODULE_SOURCES+=INTEGER.c +ASN_MODULE_HEADERS+=ISO646String.h +ASN_MODULE_SOURCES+=ISO646String.c +ASN_MODULE_HEADERS+=NULL.h +ASN_MODULE_SOURCES+=NULL.c ASN_MODULE_SOURCES+=NativeEnumerated.c ASN_MODULE_HEADERS+=NativeInteger.h ASN_MODULE_SOURCES+=NativeInteger.c +ASN_MODULE_HEADERS+=NativeReal.h +ASN_MODULE_SOURCES+=NativeReal.c +ASN_MODULE_HEADERS+=REAL.h ASN_MODULE_HEADERS+=NumericString.h ASN_MODULE_SOURCES+=NumericString.c ASN_MODULE_HEADERS+=OBJECT_IDENTIFIER.h ASN_MODULE_SOURCES+=OBJECT_IDENTIFIER.c +ASN_MODULE_HEADERS+=ObjectDescriptor.h +ASN_MODULE_SOURCES+=ObjectDescriptor.c ASN_MODULE_HEADERS+=PrintableString.h ASN_MODULE_SOURCES+=PrintableString.c +ASN_MODULE_SOURCES+=REAL.c +ASN_MODULE_HEADERS+=RELATIVE-OID.h +ASN_MODULE_SOURCES+=RELATIVE-OID.c +ASN_MODULE_HEADERS+=T61String.h +ASN_MODULE_SOURCES+=T61String.c ASN_MODULE_HEADERS+=TeletexString.h ASN_MODULE_SOURCES+=TeletexString.c ASN_MODULE_HEADERS+=UTCTime.h @@ -286,6 +304,8 @@ ASN_MODULE_SOURCES+=UTCTime.c ASN_MODULE_SOURCES+=UTF8String.c ASN_MODULE_HEADERS+=UniversalString.h ASN_MODULE_SOURCES+=UniversalString.c +ASN_MODULE_HEADERS+=VideotexString.h +ASN_MODULE_SOURCES+=VideotexString.c ASN_MODULE_HEADERS+=VisibleString.h ASN_MODULE_SOURCES+=VisibleString.c ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h @@ -336,6 +356,7 @@ ASN_MODULE_HEADERS+=per_decoder.h ASN_MODULE_SOURCES+=per_decoder.c ASN_MODULE_HEADERS+=per_encoder.h ASN_MODULE_SOURCES+=per_encoder.c +ASN_CONVERTER_SOURCES+=converter-sample.c lib_LTLIBRARIES=libsomething.la @@ -344,8 +365,8 @@ libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) # This file may be used as an input for make(3) # Remove the lines below to convert it into a pure .am file TARGET = x509dump -CFLAGS += -I. -DHAVE_CONFIG_H -OBJS=${ASN_MODULE_SOURCES:.c=.o} $(TARGET).o +CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=Certificate +OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} all: Certificate.c $(TARGET) @@ -368,15 +389,16 @@ regenerate-from-asn1-source: ../../asn1c/asn1c -S ../../skeletons ../rfc3280-PKIX1Explicit88.asn1 ../rfc3280-PKIX1Implicit88.asn1 -Certificate.c: regenerate.Makefile - ./regenerate.Makefile +Certificate.c: ../sample.source.regen + ASN1CMDOPTS="" \ + ASN1MODULES="../rfc3280-*.asn1" \ + ASN1PDU=Certificate \ + PROGNAME=x509dump \ + ../sample.source.regen @touch Certificate.c make -ASN_CONVERTER=../../skeletons/converter-sample.c -$(TARGET).o: $(ASN_CONVERTER) - $(CC) $(CFLAGS) -DPDU=Certificate -o $(TARGET).o -c $(ASN_CONVERTER) - distclean: clean rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) + rm -f $(ASN_CONVERTER_SOURCES) $(ASN_CONVERTER_HEADERS) rm -f Makefile.am.sample diff --git a/examples/sample.source.TAP3/Makefile b/examples/sample.source.TAP3/Makefile index 7b4f39776..f260ed48e 100644 --- a/examples/sample.source.TAP3/Makefile +++ b/examples/sample.source.TAP3/Makefile @@ -616,8 +616,60 @@ ASN_MODULE_HEADERS= \ NumberString.h \ PercentageRate.h +ASN_MODULE_HEADERS+=ANY.h +ASN_MODULE_SOURCES+=ANY.c +ASN_MODULE_HEADERS+=BMPString.h +ASN_MODULE_SOURCES+=BMPString.c +ASN_MODULE_HEADERS+=UTF8String.h +ASN_MODULE_HEADERS+=BOOLEAN.h +ASN_MODULE_SOURCES+=BOOLEAN.c +ASN_MODULE_HEADERS+=ENUMERATED.h +ASN_MODULE_SOURCES+=ENUMERATED.c ASN_MODULE_HEADERS+=INTEGER.h +ASN_MODULE_HEADERS+=NativeEnumerated.h +ASN_MODULE_HEADERS+=GeneralString.h +ASN_MODULE_SOURCES+=GeneralString.c +ASN_MODULE_HEADERS+=GeneralizedTime.h +ASN_MODULE_SOURCES+=GeneralizedTime.c +ASN_MODULE_HEADERS+=GraphicString.h +ASN_MODULE_SOURCES+=GraphicString.c +ASN_MODULE_HEADERS+=IA5String.h +ASN_MODULE_SOURCES+=IA5String.c ASN_MODULE_SOURCES+=INTEGER.c +ASN_MODULE_HEADERS+=ISO646String.h +ASN_MODULE_SOURCES+=ISO646String.c +ASN_MODULE_HEADERS+=NULL.h +ASN_MODULE_SOURCES+=NULL.c +ASN_MODULE_SOURCES+=NativeEnumerated.c +ASN_MODULE_HEADERS+=NativeInteger.h +ASN_MODULE_SOURCES+=NativeInteger.c +ASN_MODULE_HEADERS+=NativeReal.h +ASN_MODULE_SOURCES+=NativeReal.c +ASN_MODULE_HEADERS+=REAL.h +ASN_MODULE_HEADERS+=NumericString.h +ASN_MODULE_SOURCES+=NumericString.c +ASN_MODULE_HEADERS+=OBJECT_IDENTIFIER.h +ASN_MODULE_SOURCES+=OBJECT_IDENTIFIER.c +ASN_MODULE_HEADERS+=ObjectDescriptor.h +ASN_MODULE_SOURCES+=ObjectDescriptor.c +ASN_MODULE_HEADERS+=PrintableString.h +ASN_MODULE_SOURCES+=PrintableString.c +ASN_MODULE_SOURCES+=REAL.c +ASN_MODULE_HEADERS+=RELATIVE-OID.h +ASN_MODULE_SOURCES+=RELATIVE-OID.c +ASN_MODULE_HEADERS+=T61String.h +ASN_MODULE_SOURCES+=T61String.c +ASN_MODULE_HEADERS+=TeletexString.h +ASN_MODULE_SOURCES+=TeletexString.c +ASN_MODULE_HEADERS+=UTCTime.h +ASN_MODULE_SOURCES+=UTCTime.c +ASN_MODULE_SOURCES+=UTF8String.c +ASN_MODULE_HEADERS+=UniversalString.h +ASN_MODULE_SOURCES+=UniversalString.c +ASN_MODULE_HEADERS+=VideotexString.h +ASN_MODULE_SOURCES+=VideotexString.c +ASN_MODULE_HEADERS+=VisibleString.h +ASN_MODULE_SOURCES+=VisibleString.c ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h ASN_MODULE_SOURCES+=asn_SEQUENCE_OF.c ASN_MODULE_HEADERS+=asn_SET_OF.h @@ -629,6 +681,8 @@ ASN_MODULE_SOURCES+=constr_SEQUENCE.c ASN_MODULE_HEADERS+=constr_SEQUENCE_OF.h ASN_MODULE_SOURCES+=constr_SEQUENCE_OF.c ASN_MODULE_HEADERS+=constr_SET_OF.h +ASN_MODULE_HEADERS+=constr_SET.h +ASN_MODULE_SOURCES+=constr_SET.c ASN_MODULE_SOURCES+=constr_SET_OF.c ASN_MODULE_HEADERS+=asn_application.h ASN_MODULE_HEADERS+=asn_system.h @@ -658,6 +712,13 @@ ASN_MODULE_HEADERS+=xer_decoder.h ASN_MODULE_SOURCES+=xer_decoder.c ASN_MODULE_HEADERS+=xer_encoder.h ASN_MODULE_SOURCES+=xer_encoder.c +ASN_MODULE_HEADERS+=per_support.h +ASN_MODULE_SOURCES+=per_support.c +ASN_MODULE_HEADERS+=per_decoder.h +ASN_MODULE_SOURCES+=per_decoder.c +ASN_MODULE_HEADERS+=per_encoder.h +ASN_MODULE_SOURCES+=per_encoder.c +ASN_CONVERTER_SOURCES+=converter-sample.c lib_LTLIBRARIES=libsomething.la @@ -666,8 +727,8 @@ libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) # This file may be used as an input for make(3) # Remove the lines below to convert it into a pure .am file TARGET = tap3dump -CFLAGS += -I. -DHAVE_CONFIG_H -OBJS=${ASN_MODULE_SOURCES:.c=.o} $(TARGET).o +CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=DataInterChange +OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} all: DataInterChange.c $(TARGET) @@ -690,20 +751,16 @@ regenerate-from-asn1-source: ../../asn1c/asn1c -S ../../skeletons ../tap3.asn1 -../tap3.asn1: - @echo The ../tap3.asn1 file is not yet present. - @echo Please read the README file on how to obtain this file. - @exit 42 - -DataInterChange.c: ../tap3.asn1 regenerate.Makefile - ./regenerate.Makefile +DataInterChange.c: ../sample.source.regen + ASN1CMDOPTS="" \ + ASN1MODULES="../tap3.asn1" \ + ASN1PDU=DataInterChange \ + PROGNAME=tap3dump \ + ../sample.source.regen @touch DataInterChange.c make -ASN_CONVERTER=../../skeletons/converter-sample.c -$(TARGET).o: $(ASN_CONVERTER) - $(CC) $(CFLAGS) -DPDU=DataInterChange -o $(TARGET).o -c $(ASN_CONVERTER) - distclean: clean rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) + rm -f $(ASN_CONVERTER_SOURCES) $(ASN_CONVERTER_HEADERS) rm -f Makefile.am.sample From f74caae7159eb8e97cf24a90cecf3c8d878b95d2 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 12 Sep 2006 06:21:18 +0000 Subject: [PATCH 1173/1469] CONVERTER is now in dependencies git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1173 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_fdeps.c | 28 +++++++++++++--------------- libasn1compiler/asn1c_fdeps.h | 9 ++++++++- libasn1compiler/asn1c_save.c | 26 +++++++++++++++++++------- skeletons/file-dependencies | 4 +++- 4 files changed, 43 insertions(+), 24 deletions(-) diff --git a/libasn1compiler/asn1c_fdeps.c b/libasn1compiler/asn1c_fdeps.c index 80ba2f68b..eb83d7c8b 100644 --- a/libasn1compiler/asn1c_fdeps.c +++ b/libasn1compiler/asn1c_fdeps.c @@ -13,7 +13,7 @@ asn1c_activate_dependency(asn1c_fdeps_t *deps, asn1c_fdeps_t *cur, const char *d return 0; if(!cur) cur = deps; - if(cur->used_somewhere) + if(cur->usage != FDEP_NOTUSED) return 1; /* Already activated */ fname = data; @@ -37,7 +37,7 @@ asn1c_activate_dependency(asn1c_fdeps_t *deps, asn1c_fdeps_t *cur, const char *d } if(cur->filename && strcmp(cur->filename, fname) == 0) { - cur->used_somewhere = 1; + cur->usage = FDEP_REFERRED; /* Activate subdependencies */ for(i = 0; i < cur->el_count; i++) { @@ -62,16 +62,11 @@ asn1c_activate_dependency(asn1c_fdeps_t *deps, asn1c_fdeps_t *cur, const char *d asn1c_fdeps_t * asn1c_read_file_dependencies(arg_t *arg, const char *datadir) { + char buf[4096]; asn1c_fdeps_t *deps; asn1c_fdeps_t *cur; - char buf[4096]; FILE *f; - enum { - SS_DYNAMIC, /* Dynamic list of dependencies */ - SS_CODEC_PER, /* Use contents only if -gen-PER */ - SS_COMMON_FILES, /* Section for dependencies */ - SS_IGNORE /* Ignore contents of this section */ - } special_section = SS_DYNAMIC; + enum fdep_usage special_section = FDEP_REFERRED; (void)arg; @@ -101,22 +96,24 @@ asn1c_read_file_dependencies(arg_t *arg, const char *datadir) { * Special "prefix" section. */ if(strchr(p, ':')) { - special_section = SS_IGNORE; + special_section = FDEP_IGNORE; if(strcmp(p, "COMMON-FILES:") == 0) { - special_section = SS_COMMON_FILES; + special_section = FDEP_COMMON_FILES; + } else if(strcmp(p, "CONVERTER:") == 0) { + special_section = FDEP_CONVERTER; } else if((arg->flags & A1C_GEN_PER) && strcmp(p, "CODEC-PER:") == 0) { - special_section = SS_CODEC_PER; + special_section = FDEP_CODEC_PER; } break; } - if(special_section == SS_IGNORE) + if(special_section == FDEP_IGNORE) continue; d = asn1c_new_dep(p); assert(d); - d->used_somewhere = special_section; + d->usage = special_section; if(asn1c_dep_add(cur, d) == 1) cur = d; @@ -178,8 +175,9 @@ asn1c_deps_makelist(asn1c_fdeps_t *deps) { dlist = asn1c_new_dep(0); - if(deps->filename && deps->used_somewhere) { + if(deps->filename && deps->usage != FDEP_NOTUSED) { d = asn1c_new_dep(deps->filename); + d->usage = deps->usage; asn1c_dep_add(dlist, d); } diff --git a/libasn1compiler/asn1c_fdeps.h b/libasn1compiler/asn1c_fdeps.h index bb9496f92..27ef2c690 100644 --- a/libasn1compiler/asn1c_fdeps.h +++ b/libasn1compiler/asn1c_fdeps.h @@ -4,7 +4,14 @@ typedef struct asn1c_fdeps_s { char *filename; /* Or 0, if root. */ - int used_somewhere; /* Somefile refers to it */ + enum fdep_usage { + FDEP_IGNORE = -1, /* Ignore contents of the section */ + FDEP_NOTUSED = 0, + FDEP_REFERRED = 1, /* Dynamic list of dependencies */ + FDEP_CONVERTER = 2, /* Name of the int main() file */ + FDEP_COMMON_FILES = 3, /* Section for mandatory dependencies */ + FDEP_CODEC_PER = 4, /* Use contents only if -gen-PER */ + } usage; /* Some file refers to it */ struct asn1c_fdeps_s **elements; int el_size; diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c index 3fed83d5e..3e467afee 100644 --- a/libasn1compiler/asn1c_save.c +++ b/libasn1compiler/asn1c_save.c @@ -90,6 +90,8 @@ asn1c_save_compiled_output(arg_t *arg, const char *datadir, *dir_end++ = '/'; for(i = 0; i < dlist->el_count; i++) { + char *what_class; /* MODULE or CONVERTER */ + char *what_kind; /* HEADERS or SOURCES */ char *fname = dlist->elements[i]->filename; char *dotH; @@ -101,17 +103,26 @@ asn1c_save_compiled_output(arg_t *arg, const char *datadir, fclose(mkf); return -1; } - dotH = strrchr(fname, 'h'); - if(dotH && fnameelements[i]->usage) { + case FDEP_CONVERTER: what_class = "CONVERTER"; break; + default: what_class= "MODULE"; break; } + + /* HEADERS versus SOURCES */ + dotH = strrchr(fname, 'h'); + if(dotH && fnameflags & A1C_PDU_AUTO) { - fprintf(mkf, "ASN_MODULE_SOURCES+=pdu_collection.c\n"); + fprintf(mkf, "ASN_CONVERTER_SOURCES+=pdu_collection.c\n"); if(generate_pdu_collection_file(arg)) return -1; } @@ -125,7 +136,8 @@ asn1c_save_compiled_output(arg_t *arg, const char *datadir, "# Remove the lines below to convert it into a pure .am file\n" "TARGET = progname\n" "CFLAGS += -I.\n" - "OBJS=${ASN_MODULE_SOURCES:.c=.o} $(TARGET).o\n" + "OBJS=${ASN_MODULE_SOURCES:.c=.o}" + " ${ASN_CONVERTER_SOURCES:.c=.o}\n" "\nall: $(TARGET)\n" "\n$(TARGET): ${OBJS}" "\n\t$(CC) $(CFLAGS) -o $(TARGET) ${OBJS} $(LDFLAGS) $(LIBS)\n" diff --git a/skeletons/file-dependencies b/skeletons/file-dependencies index a640145eb..8fc6f03c0 100644 --- a/skeletons/file-dependencies +++ b/skeletons/file-dependencies @@ -61,6 +61,8 @@ xer_encoder.h xer_encoder.c # XER encoding support per_support.h per_support.c # PER parsing per_decoder.h per_decoder.c # PER decoding support per_encoder.h per_encoder.c # PER encoding support -#converter-sample.c # A sample of transcoder + +CONVERTER: # THIS IS A SPECIAL SECTION +converter-sample.c # A default name for sample transcoder CODEC-PER: # THIS IS A SPECIAL SECTION From 5d65f125a8d75fdcb9b3a2facd6e5ba903c206c9 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 12 Sep 2006 06:37:17 +0000 Subject: [PATCH 1174/1469] proper dependency tracking (regression fixed) git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1174 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.MHEG5/Makefile | 38 --------------------- examples/sample.source.PKIX1/Makefile | 20 ----------- examples/sample.source.TAP3/Makefile | 48 --------------------------- libasn1compiler/asn1c_fdeps.c | 5 ++- 4 files changed, 2 insertions(+), 109 deletions(-) diff --git a/examples/sample.source.MHEG5/Makefile b/examples/sample.source.MHEG5/Makefile index dc3afa60d..5625db506 100644 --- a/examples/sample.source.MHEG5/Makefile +++ b/examples/sample.source.MHEG5/Makefile @@ -382,58 +382,20 @@ ASN_MODULE_HEADERS= \ ASN_MODULE_HEADERS+=ANY.h ASN_MODULE_SOURCES+=ANY.c -ASN_MODULE_HEADERS+=BMPString.h -ASN_MODULE_SOURCES+=BMPString.c -ASN_MODULE_HEADERS+=UTF8String.h ASN_MODULE_HEADERS+=BOOLEAN.h ASN_MODULE_SOURCES+=BOOLEAN.c ASN_MODULE_HEADERS+=ENUMERATED.h ASN_MODULE_SOURCES+=ENUMERATED.c ASN_MODULE_HEADERS+=INTEGER.h ASN_MODULE_HEADERS+=NativeEnumerated.h -ASN_MODULE_HEADERS+=GeneralString.h -ASN_MODULE_SOURCES+=GeneralString.c -ASN_MODULE_HEADERS+=GeneralizedTime.h -ASN_MODULE_SOURCES+=GeneralizedTime.c -ASN_MODULE_HEADERS+=GraphicString.h -ASN_MODULE_SOURCES+=GraphicString.c ASN_MODULE_HEADERS+=IA5String.h ASN_MODULE_SOURCES+=IA5String.c ASN_MODULE_SOURCES+=INTEGER.c -ASN_MODULE_HEADERS+=ISO646String.h -ASN_MODULE_SOURCES+=ISO646String.c ASN_MODULE_HEADERS+=NULL.h ASN_MODULE_SOURCES+=NULL.c ASN_MODULE_SOURCES+=NativeEnumerated.c ASN_MODULE_HEADERS+=NativeInteger.h ASN_MODULE_SOURCES+=NativeInteger.c -ASN_MODULE_HEADERS+=NativeReal.h -ASN_MODULE_SOURCES+=NativeReal.c -ASN_MODULE_HEADERS+=REAL.h -ASN_MODULE_HEADERS+=NumericString.h -ASN_MODULE_SOURCES+=NumericString.c -ASN_MODULE_HEADERS+=OBJECT_IDENTIFIER.h -ASN_MODULE_SOURCES+=OBJECT_IDENTIFIER.c -ASN_MODULE_HEADERS+=ObjectDescriptor.h -ASN_MODULE_SOURCES+=ObjectDescriptor.c -ASN_MODULE_HEADERS+=PrintableString.h -ASN_MODULE_SOURCES+=PrintableString.c -ASN_MODULE_SOURCES+=REAL.c -ASN_MODULE_HEADERS+=RELATIVE-OID.h -ASN_MODULE_SOURCES+=RELATIVE-OID.c -ASN_MODULE_HEADERS+=T61String.h -ASN_MODULE_SOURCES+=T61String.c -ASN_MODULE_HEADERS+=TeletexString.h -ASN_MODULE_SOURCES+=TeletexString.c -ASN_MODULE_HEADERS+=UTCTime.h -ASN_MODULE_SOURCES+=UTCTime.c -ASN_MODULE_SOURCES+=UTF8String.c -ASN_MODULE_HEADERS+=UniversalString.h -ASN_MODULE_SOURCES+=UniversalString.c -ASN_MODULE_HEADERS+=VideotexString.h -ASN_MODULE_SOURCES+=VideotexString.c -ASN_MODULE_HEADERS+=VisibleString.h -ASN_MODULE_SOURCES+=VisibleString.c ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h ASN_MODULE_SOURCES+=asn_SEQUENCE_OF.c ASN_MODULE_HEADERS+=asn_SET_OF.h diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index caa5b8512..3d8047428 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -265,38 +265,20 @@ ASN_MODULE_HEADERS+=ENUMERATED.h ASN_MODULE_SOURCES+=ENUMERATED.c ASN_MODULE_HEADERS+=INTEGER.h ASN_MODULE_HEADERS+=NativeEnumerated.h -ASN_MODULE_HEADERS+=GeneralString.h -ASN_MODULE_SOURCES+=GeneralString.c ASN_MODULE_HEADERS+=GeneralizedTime.h ASN_MODULE_SOURCES+=GeneralizedTime.c -ASN_MODULE_HEADERS+=GraphicString.h -ASN_MODULE_SOURCES+=GraphicString.c ASN_MODULE_HEADERS+=IA5String.h ASN_MODULE_SOURCES+=IA5String.c ASN_MODULE_SOURCES+=INTEGER.c -ASN_MODULE_HEADERS+=ISO646String.h -ASN_MODULE_SOURCES+=ISO646String.c -ASN_MODULE_HEADERS+=NULL.h -ASN_MODULE_SOURCES+=NULL.c ASN_MODULE_SOURCES+=NativeEnumerated.c ASN_MODULE_HEADERS+=NativeInteger.h ASN_MODULE_SOURCES+=NativeInteger.c -ASN_MODULE_HEADERS+=NativeReal.h -ASN_MODULE_SOURCES+=NativeReal.c -ASN_MODULE_HEADERS+=REAL.h ASN_MODULE_HEADERS+=NumericString.h ASN_MODULE_SOURCES+=NumericString.c ASN_MODULE_HEADERS+=OBJECT_IDENTIFIER.h ASN_MODULE_SOURCES+=OBJECT_IDENTIFIER.c -ASN_MODULE_HEADERS+=ObjectDescriptor.h -ASN_MODULE_SOURCES+=ObjectDescriptor.c ASN_MODULE_HEADERS+=PrintableString.h ASN_MODULE_SOURCES+=PrintableString.c -ASN_MODULE_SOURCES+=REAL.c -ASN_MODULE_HEADERS+=RELATIVE-OID.h -ASN_MODULE_SOURCES+=RELATIVE-OID.c -ASN_MODULE_HEADERS+=T61String.h -ASN_MODULE_SOURCES+=T61String.c ASN_MODULE_HEADERS+=TeletexString.h ASN_MODULE_SOURCES+=TeletexString.c ASN_MODULE_HEADERS+=UTCTime.h @@ -304,8 +286,6 @@ ASN_MODULE_SOURCES+=UTCTime.c ASN_MODULE_SOURCES+=UTF8String.c ASN_MODULE_HEADERS+=UniversalString.h ASN_MODULE_SOURCES+=UniversalString.c -ASN_MODULE_HEADERS+=VideotexString.h -ASN_MODULE_SOURCES+=VideotexString.c ASN_MODULE_HEADERS+=VisibleString.h ASN_MODULE_SOURCES+=VisibleString.c ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h diff --git a/examples/sample.source.TAP3/Makefile b/examples/sample.source.TAP3/Makefile index f260ed48e..624ec8645 100644 --- a/examples/sample.source.TAP3/Makefile +++ b/examples/sample.source.TAP3/Makefile @@ -616,60 +616,14 @@ ASN_MODULE_HEADERS= \ NumberString.h \ PercentageRate.h -ASN_MODULE_HEADERS+=ANY.h -ASN_MODULE_SOURCES+=ANY.c -ASN_MODULE_HEADERS+=BMPString.h -ASN_MODULE_SOURCES+=BMPString.c -ASN_MODULE_HEADERS+=UTF8String.h -ASN_MODULE_HEADERS+=BOOLEAN.h -ASN_MODULE_SOURCES+=BOOLEAN.c -ASN_MODULE_HEADERS+=ENUMERATED.h -ASN_MODULE_SOURCES+=ENUMERATED.c ASN_MODULE_HEADERS+=INTEGER.h ASN_MODULE_HEADERS+=NativeEnumerated.h -ASN_MODULE_HEADERS+=GeneralString.h -ASN_MODULE_SOURCES+=GeneralString.c -ASN_MODULE_HEADERS+=GeneralizedTime.h -ASN_MODULE_SOURCES+=GeneralizedTime.c -ASN_MODULE_HEADERS+=GraphicString.h -ASN_MODULE_SOURCES+=GraphicString.c ASN_MODULE_HEADERS+=IA5String.h ASN_MODULE_SOURCES+=IA5String.c ASN_MODULE_SOURCES+=INTEGER.c -ASN_MODULE_HEADERS+=ISO646String.h -ASN_MODULE_SOURCES+=ISO646String.c -ASN_MODULE_HEADERS+=NULL.h -ASN_MODULE_SOURCES+=NULL.c ASN_MODULE_SOURCES+=NativeEnumerated.c ASN_MODULE_HEADERS+=NativeInteger.h ASN_MODULE_SOURCES+=NativeInteger.c -ASN_MODULE_HEADERS+=NativeReal.h -ASN_MODULE_SOURCES+=NativeReal.c -ASN_MODULE_HEADERS+=REAL.h -ASN_MODULE_HEADERS+=NumericString.h -ASN_MODULE_SOURCES+=NumericString.c -ASN_MODULE_HEADERS+=OBJECT_IDENTIFIER.h -ASN_MODULE_SOURCES+=OBJECT_IDENTIFIER.c -ASN_MODULE_HEADERS+=ObjectDescriptor.h -ASN_MODULE_SOURCES+=ObjectDescriptor.c -ASN_MODULE_HEADERS+=PrintableString.h -ASN_MODULE_SOURCES+=PrintableString.c -ASN_MODULE_SOURCES+=REAL.c -ASN_MODULE_HEADERS+=RELATIVE-OID.h -ASN_MODULE_SOURCES+=RELATIVE-OID.c -ASN_MODULE_HEADERS+=T61String.h -ASN_MODULE_SOURCES+=T61String.c -ASN_MODULE_HEADERS+=TeletexString.h -ASN_MODULE_SOURCES+=TeletexString.c -ASN_MODULE_HEADERS+=UTCTime.h -ASN_MODULE_SOURCES+=UTCTime.c -ASN_MODULE_SOURCES+=UTF8String.c -ASN_MODULE_HEADERS+=UniversalString.h -ASN_MODULE_SOURCES+=UniversalString.c -ASN_MODULE_HEADERS+=VideotexString.h -ASN_MODULE_SOURCES+=VideotexString.c -ASN_MODULE_HEADERS+=VisibleString.h -ASN_MODULE_SOURCES+=VisibleString.c ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h ASN_MODULE_SOURCES+=asn_SEQUENCE_OF.c ASN_MODULE_HEADERS+=asn_SET_OF.h @@ -681,8 +635,6 @@ ASN_MODULE_SOURCES+=constr_SEQUENCE.c ASN_MODULE_HEADERS+=constr_SEQUENCE_OF.h ASN_MODULE_SOURCES+=constr_SEQUENCE_OF.c ASN_MODULE_HEADERS+=constr_SET_OF.h -ASN_MODULE_HEADERS+=constr_SET.h -ASN_MODULE_SOURCES+=constr_SET.c ASN_MODULE_SOURCES+=constr_SET_OF.c ASN_MODULE_HEADERS+=asn_application.h ASN_MODULE_HEADERS+=asn_system.h diff --git a/libasn1compiler/asn1c_fdeps.c b/libasn1compiler/asn1c_fdeps.c index eb83d7c8b..e34cb6f52 100644 --- a/libasn1compiler/asn1c_fdeps.c +++ b/libasn1compiler/asn1c_fdeps.c @@ -13,7 +13,7 @@ asn1c_activate_dependency(asn1c_fdeps_t *deps, asn1c_fdeps_t *cur, const char *d return 0; if(!cur) cur = deps; - if(cur->usage != FDEP_NOTUSED) + if(cur->usage > FDEP_NOTUSED) return 1; /* Already activated */ fname = data; @@ -66,7 +66,7 @@ asn1c_read_file_dependencies(arg_t *arg, const char *datadir) { asn1c_fdeps_t *deps; asn1c_fdeps_t *cur; FILE *f; - enum fdep_usage special_section = FDEP_REFERRED; + enum fdep_usage special_section = FDEP_NOTUSED; (void)arg; @@ -112,7 +112,6 @@ asn1c_read_file_dependencies(arg_t *arg, const char *datadir) { continue; d = asn1c_new_dep(p); - assert(d); d->usage = special_section; if(asn1c_dep_add(cur, d) == 1) From ee06d2263a53353c818d6059c66694f37ed4e8cc Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 12 Sep 2006 06:47:11 +0000 Subject: [PATCH 1175/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1175 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.LDAP3/Makefile | 44 -------------------------- examples/sample.source.MEGACO/Makefile | 40 ----------------------- 2 files changed, 84 deletions(-) diff --git a/examples/sample.source.LDAP3/Makefile b/examples/sample.source.LDAP3/Makefile index 6337062eb..370bd6405 100644 --- a/examples/sample.source.LDAP3/Makefile +++ b/examples/sample.source.LDAP3/Makefile @@ -96,60 +96,18 @@ ASN_MODULE_HEADERS= \ ExtendedResponse.h \ IntermediateResponse.h -ASN_MODULE_HEADERS+=ANY.h -ASN_MODULE_SOURCES+=ANY.c -ASN_MODULE_HEADERS+=BMPString.h -ASN_MODULE_SOURCES+=BMPString.c -ASN_MODULE_HEADERS+=UTF8String.h ASN_MODULE_HEADERS+=BOOLEAN.h ASN_MODULE_SOURCES+=BOOLEAN.c ASN_MODULE_HEADERS+=ENUMERATED.h ASN_MODULE_SOURCES+=ENUMERATED.c ASN_MODULE_HEADERS+=INTEGER.h ASN_MODULE_HEADERS+=NativeEnumerated.h -ASN_MODULE_HEADERS+=GeneralString.h -ASN_MODULE_SOURCES+=GeneralString.c -ASN_MODULE_HEADERS+=GeneralizedTime.h -ASN_MODULE_SOURCES+=GeneralizedTime.c -ASN_MODULE_HEADERS+=GraphicString.h -ASN_MODULE_SOURCES+=GraphicString.c -ASN_MODULE_HEADERS+=IA5String.h -ASN_MODULE_SOURCES+=IA5String.c ASN_MODULE_SOURCES+=INTEGER.c -ASN_MODULE_HEADERS+=ISO646String.h -ASN_MODULE_SOURCES+=ISO646String.c ASN_MODULE_HEADERS+=NULL.h ASN_MODULE_SOURCES+=NULL.c ASN_MODULE_SOURCES+=NativeEnumerated.c ASN_MODULE_HEADERS+=NativeInteger.h ASN_MODULE_SOURCES+=NativeInteger.c -ASN_MODULE_HEADERS+=NativeReal.h -ASN_MODULE_SOURCES+=NativeReal.c -ASN_MODULE_HEADERS+=REAL.h -ASN_MODULE_HEADERS+=NumericString.h -ASN_MODULE_SOURCES+=NumericString.c -ASN_MODULE_HEADERS+=OBJECT_IDENTIFIER.h -ASN_MODULE_SOURCES+=OBJECT_IDENTIFIER.c -ASN_MODULE_HEADERS+=ObjectDescriptor.h -ASN_MODULE_SOURCES+=ObjectDescriptor.c -ASN_MODULE_HEADERS+=PrintableString.h -ASN_MODULE_SOURCES+=PrintableString.c -ASN_MODULE_SOURCES+=REAL.c -ASN_MODULE_HEADERS+=RELATIVE-OID.h -ASN_MODULE_SOURCES+=RELATIVE-OID.c -ASN_MODULE_HEADERS+=T61String.h -ASN_MODULE_SOURCES+=T61String.c -ASN_MODULE_HEADERS+=TeletexString.h -ASN_MODULE_SOURCES+=TeletexString.c -ASN_MODULE_HEADERS+=UTCTime.h -ASN_MODULE_SOURCES+=UTCTime.c -ASN_MODULE_SOURCES+=UTF8String.c -ASN_MODULE_HEADERS+=UniversalString.h -ASN_MODULE_SOURCES+=UniversalString.c -ASN_MODULE_HEADERS+=VideotexString.h -ASN_MODULE_SOURCES+=VideotexString.c -ASN_MODULE_HEADERS+=VisibleString.h -ASN_MODULE_SOURCES+=VisibleString.c ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h ASN_MODULE_SOURCES+=asn_SEQUENCE_OF.c ASN_MODULE_HEADERS+=asn_SET_OF.h @@ -161,8 +119,6 @@ ASN_MODULE_SOURCES+=constr_SEQUENCE.c ASN_MODULE_HEADERS+=constr_SEQUENCE_OF.h ASN_MODULE_SOURCES+=constr_SEQUENCE_OF.c ASN_MODULE_HEADERS+=constr_SET_OF.h -ASN_MODULE_HEADERS+=constr_SET.h -ASN_MODULE_SOURCES+=constr_SET.c ASN_MODULE_SOURCES+=constr_SET_OF.c ASN_MODULE_HEADERS+=asn_application.h ASN_MODULE_HEADERS+=asn_system.h diff --git a/examples/sample.source.MEGACO/Makefile b/examples/sample.source.MEGACO/Makefile index ce3072666..e2bd5e378 100644 --- a/examples/sample.source.MEGACO/Makefile +++ b/examples/sample.source.MEGACO/Makefile @@ -214,60 +214,22 @@ ASN_MODULE_HEADERS= \ TimeNotation.h \ Value.h -ASN_MODULE_HEADERS+=ANY.h -ASN_MODULE_SOURCES+=ANY.c -ASN_MODULE_HEADERS+=BMPString.h -ASN_MODULE_SOURCES+=BMPString.c -ASN_MODULE_HEADERS+=UTF8String.h ASN_MODULE_HEADERS+=BOOLEAN.h ASN_MODULE_SOURCES+=BOOLEAN.c ASN_MODULE_HEADERS+=ENUMERATED.h ASN_MODULE_SOURCES+=ENUMERATED.c ASN_MODULE_HEADERS+=INTEGER.h ASN_MODULE_HEADERS+=NativeEnumerated.h -ASN_MODULE_HEADERS+=GeneralString.h -ASN_MODULE_SOURCES+=GeneralString.c -ASN_MODULE_HEADERS+=GeneralizedTime.h -ASN_MODULE_SOURCES+=GeneralizedTime.c -ASN_MODULE_HEADERS+=GraphicString.h -ASN_MODULE_SOURCES+=GraphicString.c ASN_MODULE_HEADERS+=IA5String.h ASN_MODULE_SOURCES+=IA5String.c ASN_MODULE_SOURCES+=INTEGER.c -ASN_MODULE_HEADERS+=ISO646String.h -ASN_MODULE_SOURCES+=ISO646String.c ASN_MODULE_HEADERS+=NULL.h ASN_MODULE_SOURCES+=NULL.c ASN_MODULE_SOURCES+=NativeEnumerated.c ASN_MODULE_HEADERS+=NativeInteger.h ASN_MODULE_SOURCES+=NativeInteger.c -ASN_MODULE_HEADERS+=NativeReal.h -ASN_MODULE_SOURCES+=NativeReal.c -ASN_MODULE_HEADERS+=REAL.h -ASN_MODULE_HEADERS+=NumericString.h -ASN_MODULE_SOURCES+=NumericString.c ASN_MODULE_HEADERS+=OBJECT_IDENTIFIER.h ASN_MODULE_SOURCES+=OBJECT_IDENTIFIER.c -ASN_MODULE_HEADERS+=ObjectDescriptor.h -ASN_MODULE_SOURCES+=ObjectDescriptor.c -ASN_MODULE_HEADERS+=PrintableString.h -ASN_MODULE_SOURCES+=PrintableString.c -ASN_MODULE_SOURCES+=REAL.c -ASN_MODULE_HEADERS+=RELATIVE-OID.h -ASN_MODULE_SOURCES+=RELATIVE-OID.c -ASN_MODULE_HEADERS+=T61String.h -ASN_MODULE_SOURCES+=T61String.c -ASN_MODULE_HEADERS+=TeletexString.h -ASN_MODULE_SOURCES+=TeletexString.c -ASN_MODULE_HEADERS+=UTCTime.h -ASN_MODULE_SOURCES+=UTCTime.c -ASN_MODULE_SOURCES+=UTF8String.c -ASN_MODULE_HEADERS+=UniversalString.h -ASN_MODULE_SOURCES+=UniversalString.c -ASN_MODULE_HEADERS+=VideotexString.h -ASN_MODULE_SOURCES+=VideotexString.c -ASN_MODULE_HEADERS+=VisibleString.h -ASN_MODULE_SOURCES+=VisibleString.c ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h ASN_MODULE_SOURCES+=asn_SEQUENCE_OF.c ASN_MODULE_HEADERS+=asn_SET_OF.h @@ -279,8 +241,6 @@ ASN_MODULE_SOURCES+=constr_SEQUENCE.c ASN_MODULE_HEADERS+=constr_SEQUENCE_OF.h ASN_MODULE_SOURCES+=constr_SEQUENCE_OF.c ASN_MODULE_HEADERS+=constr_SET_OF.h -ASN_MODULE_HEADERS+=constr_SET.h -ASN_MODULE_SOURCES+=constr_SET.c ASN_MODULE_SOURCES+=constr_SET_OF.c ASN_MODULE_HEADERS+=asn_application.h ASN_MODULE_HEADERS+=asn_system.h From a411eeeadde4c976d13aba1e5d285f6cc5e9c3ce Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 13 Sep 2006 00:21:58 +0000 Subject: [PATCH 1176/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1176 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-assembly.sh | 1 + libasn1fix/check_fixer.c | 4 ++-- skeletons/GeneralizedTime.c | 7 ++++++- skeletons/UTCTime.c | 7 ++++++- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/asn1c/tests/check-assembly.sh b/asn1c/tests/check-assembly.sh index d3a5251bc..3abac0821 100755 --- a/asn1c/tests/check-assembly.sh +++ b/asn1c/tests/check-assembly.sh @@ -54,6 +54,7 @@ check-executable: compiled-module *.c* compiled-module: ${asn_module} ../../asn1c ../../asn1c -S ../../../skeletons -Wdebug-compiler \\ ${AFLAGS} ${asn_module} + rm -f converter-sample.c @touch compiled-module check-succeeded: check-executable diff --git a/libasn1fix/check_fixer.c b/libasn1fix/check_fixer.c index c4e3f9951..a35b4a318 100644 --- a/libasn1fix/check_fixer.c +++ b/libasn1fix/check_fixer.c @@ -189,7 +189,7 @@ check(const char *fname, mod->_tags |= MT_STANDARD_MODULE; TQ_ADD(&(asn->modules), mod, mod_next); } - asn1p_free(std_asn); + asn1p_delete(std_asn); } } @@ -236,7 +236,7 @@ check(const char *fname, /* * Destroy the asn. */ - asn1p_free(asn); + asn1p_delete(asn); return r_value; } diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 6d7855eef..0c3049355 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -6,9 +6,14 @@ #define _REENTRANT /* for Sun */ #include #include -#include #include +#ifdef __CYGWIN__ +#include "/usr/include/time.h" +#else +#include +#endif /* __CYGWIN__ */ + #if defined(WIN32) #pragma message( "PLEASE STOP AND READ!") #pragma message( " localtime_r is implemented via localtime(), which may be not thread-safe.") diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c index 3793a0e69..2a27718b1 100644 --- a/skeletons/UTCTime.c +++ b/skeletons/UTCTime.c @@ -5,9 +5,14 @@ #include #include #include -#include #include +#ifdef __CYGWIN__ +#include "/usr/include/time.h" +#else +#include +#endif /* __CYGWIN__ */ + #ifndef __ASN_INTERNAL_TEST_MODE__ /* From 493ec003f820a67504a1ed7601a982be8ca57679 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 13 Sep 2006 00:26:13 +0000 Subject: [PATCH 1177/1469] rename git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1177 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/Makefile.am | 2 +- examples/Makefile.in | 2 +- examples/sample.source.LDAP3/Makefile | 4 ++-- examples/sample.source.MEGACO/Makefile | 4 ++-- examples/sample.source.MHEG5/Makefile | 4 ++-- examples/sample.source.PKIX1/Makefile | 4 ++-- examples/sample.source.TAP3/Makefile | 4 ++-- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/examples/Makefile.am b/examples/Makefile.am index 525ca4891..9b5b07adc 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -26,7 +26,7 @@ $(ASN1_FILES_3): crfc2asn1.pl $(ASN1_SOURCE_3) ./crfc2asn1.pl $(ASN1_SOURCE_3) EXTRA_DIST = $(srcdir)/rfc*.txt \ - $(srcdir)/sample.source.regen \ + $(srcdir)/sample.regen.makefile \ $(srcdir)/sample.source.*/README \ $(srcdir)/sample.source.*/config.h \ $(srcdir)/sample.source.*/Makefile \ diff --git a/examples/Makefile.in b/examples/Makefile.in index 852a2981d..08d78a745 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -177,7 +177,7 @@ ASN1_FILES_3 = \ rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1 EXTRA_DIST = $(srcdir)/rfc*.txt \ - $(srcdir)/sample.source.regen \ + $(srcdir)/sample.regen.makefile \ $(srcdir)/sample.source.*/README \ $(srcdir)/sample.source.*/config.h \ $(srcdir)/sample.source.*/Makefile \ diff --git a/examples/sample.source.LDAP3/Makefile b/examples/sample.source.LDAP3/Makefile index 370bd6405..06a4ef77e 100644 --- a/examples/sample.source.LDAP3/Makefile +++ b/examples/sample.source.LDAP3/Makefile @@ -187,12 +187,12 @@ regenerate-from-asn1-source: ../../asn1c/asn1c -S ../../skeletons -fcompound-names ../rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1 -LDAPMessage.c: ../sample.source.regen +LDAPMessage.c: ../sample.regen.makefile ASN1CMDOPTS="-fcompound-names" \ ASN1MODULES="../rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1" \ ASN1PDU=LDAPMessage \ PROGNAME=ldap3dump \ - ../sample.source.regen + ../sample.regen.makefile @touch LDAPMessage.c make diff --git a/examples/sample.source.MEGACO/Makefile b/examples/sample.source.MEGACO/Makefile index e2bd5e378..601d454b0 100644 --- a/examples/sample.source.MEGACO/Makefile +++ b/examples/sample.source.MEGACO/Makefile @@ -309,12 +309,12 @@ regenerate-from-asn1-source: ../../asn1c/asn1c -S ../../skeletons -fcompound-names ../rfc3525-MEDIA-GATEWAY-CONTROL.asn1 -MegacoMessage.c: ../sample.source.regen +MegacoMessage.c: ../sample.regen.makefile ASN1CMDOPTS="-fcompound-names" \ ASN1MODULES="../rfc3525-MEDIA-GATEWAY-CONTROL.asn1" \ ASN1PDU=MegacoMessage \ PROGNAME=megacoDump \ - ../sample.source.regen + ../sample.regen.makefile @touch MegacoMessage.c make diff --git a/examples/sample.source.MHEG5/Makefile b/examples/sample.source.MHEG5/Makefile index 5625db506..dfceb9502 100644 --- a/examples/sample.source.MHEG5/Makefile +++ b/examples/sample.source.MHEG5/Makefile @@ -477,12 +477,12 @@ regenerate-from-asn1-source: ../../asn1c/asn1c -S ../../skeletons -fcompound-names ../ISO13522-MHEG-5.asn -InterchangedObject.c: ../sample.source.regen +InterchangedObject.c: ../sample.regen.makefile ASN1CMDOPTS="-fcompound-names" \ ASN1MODULES="../ISO13522-MHEG-5.asn" \ ASN1PDU=InterchangedObject \ PROGNAME=mheg5dump \ - ../sample.source.regen + ../sample.regen.makefile @touch InterchangedObject.c make diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index 3d8047428..964072540 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -369,12 +369,12 @@ regenerate-from-asn1-source: ../../asn1c/asn1c -S ../../skeletons ../rfc3280-PKIX1Explicit88.asn1 ../rfc3280-PKIX1Implicit88.asn1 -Certificate.c: ../sample.source.regen +Certificate.c: ../sample.regen.makefile ASN1CMDOPTS="" \ ASN1MODULES="../rfc3280-*.asn1" \ ASN1PDU=Certificate \ PROGNAME=x509dump \ - ../sample.source.regen + ../sample.regen.makefile @touch Certificate.c make diff --git a/examples/sample.source.TAP3/Makefile b/examples/sample.source.TAP3/Makefile index 624ec8645..43347598d 100644 --- a/examples/sample.source.TAP3/Makefile +++ b/examples/sample.source.TAP3/Makefile @@ -703,12 +703,12 @@ regenerate-from-asn1-source: ../../asn1c/asn1c -S ../../skeletons ../tap3.asn1 -DataInterChange.c: ../sample.source.regen +DataInterChange.c: ../sample.regen.makefile ASN1CMDOPTS="" \ ASN1MODULES="../tap3.asn1" \ ASN1PDU=DataInterChange \ PROGNAME=tap3dump \ - ../sample.source.regen + ../sample.regen.makefile @touch DataInterChange.c make From 94c92c0ce16ca98c08f456a18a4e26abcb432834 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 13 Sep 2006 02:10:23 +0000 Subject: [PATCH 1178/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1178 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/Makefile.am | 2 +- examples/Makefile.in | 2 +- examples/sample.makefile.regen | 50 ++++++++++++++++++++++++++ examples/sample.source.LDAP3/Makefile | 4 +-- examples/sample.source.MEGACO/Makefile | 4 +-- examples/sample.source.MHEG5/Makefile | 4 +-- examples/sample.source.PKIX1/Makefile | 4 +-- examples/sample.source.TAP3/Makefile | 4 +-- 8 files changed, 62 insertions(+), 12 deletions(-) create mode 100755 examples/sample.makefile.regen diff --git a/examples/Makefile.am b/examples/Makefile.am index 9b5b07adc..d0ecbd034 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -26,7 +26,7 @@ $(ASN1_FILES_3): crfc2asn1.pl $(ASN1_SOURCE_3) ./crfc2asn1.pl $(ASN1_SOURCE_3) EXTRA_DIST = $(srcdir)/rfc*.txt \ - $(srcdir)/sample.regen.makefile \ + $(srcdir)/sample.makefile.regen \ $(srcdir)/sample.source.*/README \ $(srcdir)/sample.source.*/config.h \ $(srcdir)/sample.source.*/Makefile \ diff --git a/examples/Makefile.in b/examples/Makefile.in index 08d78a745..26fa5c6f9 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -177,7 +177,7 @@ ASN1_FILES_3 = \ rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1 EXTRA_DIST = $(srcdir)/rfc*.txt \ - $(srcdir)/sample.regen.makefile \ + $(srcdir)/sample.makefile.regen \ $(srcdir)/sample.source.*/README \ $(srcdir)/sample.source.*/config.h \ $(srcdir)/sample.source.*/Makefile \ diff --git a/examples/sample.makefile.regen b/examples/sample.makefile.regen new file mode 100755 index 000000000..134e1f24d --- /dev/null +++ b/examples/sample.makefile.regen @@ -0,0 +1,50 @@ +#!/bin/sh + +if [ -z "$ASN1PDU" \ + -o -z "$ASN1MODULES" \ + -o -z "$PROGNAME" \ + ]; then + echo "ASN1PDU=\"$ASN1PDU\"" + echo "ASN1MODULES=\"$ASN1MODULES\"" + echo "PROGNAME=\"$PROGNAME\"" + echo "ASN1PDU, ASN1MODULES, and PROGNAME must be set" + exit +fi + +../../asn1c/asn1c -S ../../skeletons ${ASN1CMDOPTS} ${ASN1MODULES} || exit $? + +if [ ! -f Makefile.am.sample ]; then + echo "Makefile.am.sample is missing" + exit 1 +fi + +set -x +cat Makefile.am.sample \ + | sed -e "s/^CFLAGS.*/CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=${ASN1PDU}/" \ + | sed -e "s/^all: /all: ${ASN1PDU}.c /" \ + | sed -e "s/progname/${PROGNAME}/" \ + > Makefile.$$ + +( echo + echo "${ASN1PDU}.c: $0" + echo " ASN1CMDOPTS=\"${ASN1CMDOPTS}\" \\" + echo " ASN1MODULES=\"${ASN1MODULES}\" \\" + echo " ASN1PDU=${ASN1PDU} \\" + echo " PROGNAME=${PROGNAME} \\" + echo " $0" + echo " @touch ${ASN1PDU}.c" + echo " make" + echo + echo "distclean: clean" + echo ' rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS)' + echo ' rm -f $(ASN_CONVERTER_SOURCES) $(ASN_CONVERTER_HEADERS)' + echo " rm -f Makefile.am.sample" +) >> Makefile.$$ + +rm Makefile.am.sample || exit $? + +mv Makefile.$$ Makefile + +set +x +echo +echo "Makefile generation finished" diff --git a/examples/sample.source.LDAP3/Makefile b/examples/sample.source.LDAP3/Makefile index 06a4ef77e..f7dfc64ba 100644 --- a/examples/sample.source.LDAP3/Makefile +++ b/examples/sample.source.LDAP3/Makefile @@ -187,12 +187,12 @@ regenerate-from-asn1-source: ../../asn1c/asn1c -S ../../skeletons -fcompound-names ../rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1 -LDAPMessage.c: ../sample.regen.makefile +LDAPMessage.c: ../sample.makefile.regen ASN1CMDOPTS="-fcompound-names" \ ASN1MODULES="../rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1" \ ASN1PDU=LDAPMessage \ PROGNAME=ldap3dump \ - ../sample.regen.makefile + ../sample.makefile.regen @touch LDAPMessage.c make diff --git a/examples/sample.source.MEGACO/Makefile b/examples/sample.source.MEGACO/Makefile index 601d454b0..d922a9da1 100644 --- a/examples/sample.source.MEGACO/Makefile +++ b/examples/sample.source.MEGACO/Makefile @@ -309,12 +309,12 @@ regenerate-from-asn1-source: ../../asn1c/asn1c -S ../../skeletons -fcompound-names ../rfc3525-MEDIA-GATEWAY-CONTROL.asn1 -MegacoMessage.c: ../sample.regen.makefile +MegacoMessage.c: ../sample.makefile.regen ASN1CMDOPTS="-fcompound-names" \ ASN1MODULES="../rfc3525-MEDIA-GATEWAY-CONTROL.asn1" \ ASN1PDU=MegacoMessage \ PROGNAME=megacoDump \ - ../sample.regen.makefile + ../sample.makefile.regen @touch MegacoMessage.c make diff --git a/examples/sample.source.MHEG5/Makefile b/examples/sample.source.MHEG5/Makefile index dfceb9502..641f518ca 100644 --- a/examples/sample.source.MHEG5/Makefile +++ b/examples/sample.source.MHEG5/Makefile @@ -477,12 +477,12 @@ regenerate-from-asn1-source: ../../asn1c/asn1c -S ../../skeletons -fcompound-names ../ISO13522-MHEG-5.asn -InterchangedObject.c: ../sample.regen.makefile +InterchangedObject.c: ../sample.makefile.regen ASN1CMDOPTS="-fcompound-names" \ ASN1MODULES="../ISO13522-MHEG-5.asn" \ ASN1PDU=InterchangedObject \ PROGNAME=mheg5dump \ - ../sample.regen.makefile + ../sample.makefile.regen @touch InterchangedObject.c make diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index 964072540..30e89518d 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -369,12 +369,12 @@ regenerate-from-asn1-source: ../../asn1c/asn1c -S ../../skeletons ../rfc3280-PKIX1Explicit88.asn1 ../rfc3280-PKIX1Implicit88.asn1 -Certificate.c: ../sample.regen.makefile +Certificate.c: ../sample.makefile.regen ASN1CMDOPTS="" \ ASN1MODULES="../rfc3280-*.asn1" \ ASN1PDU=Certificate \ PROGNAME=x509dump \ - ../sample.regen.makefile + ../sample.makefile.regen @touch Certificate.c make diff --git a/examples/sample.source.TAP3/Makefile b/examples/sample.source.TAP3/Makefile index 43347598d..ed00cea89 100644 --- a/examples/sample.source.TAP3/Makefile +++ b/examples/sample.source.TAP3/Makefile @@ -703,12 +703,12 @@ regenerate-from-asn1-source: ../../asn1c/asn1c -S ../../skeletons ../tap3.asn1 -DataInterChange.c: ../sample.regen.makefile +DataInterChange.c: ../sample.makefile.regen ASN1CMDOPTS="" \ ASN1MODULES="../tap3.asn1" \ ASN1PDU=DataInterChange \ PROGNAME=tap3dump \ - ../sample.regen.makefile + ../sample.makefile.regen @touch DataInterChange.c make From ea226770fc3d202c6d51eede096777fd2d483b51 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 13 Sep 2006 02:51:20 +0000 Subject: [PATCH 1179/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1179 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 14 ++--- libasn1compiler/asn1c_misc.c | 38 ++++++++---- libasn1compiler/asn1c_misc.h | 1 + libasn1compiler/asn1c_out.h | 5 +- tests/104-param-1-OK.asn1.-P | 2 +- tests/105-param-2-OK.asn1.-P | 4 +- tests/106-param-constr-OK.asn1.-P | 2 +- tests/108-param-constr-3-OK.asn1.-P | 2 +- tests/110-param-3-OK.asn1.-P | 4 +- tests/19-param-OK.asn1.-P | 6 +- tests/31-set-of-OK.asn1.-P | 4 +- tests/32-sequence-of-OK.asn1.-P | 8 +-- tests/39-sequence-of-OK.asn1.-P | 2 +- tests/42-real-life-OK.asn1.-PR | 6 +- tests/43-recursion-OK.asn1.-P | 8 +-- tests/46-redefine-OK.asn1.-PR | 4 +- tests/50-constraint-OK.asn1.-P | 40 ++++++------- tests/50-constraint-OK.asn1.-Pgen-PER | 40 ++++++------- tests/59-choice-extended-OK.asn1.-P | 2 +- tests/65-multi-tag-OK.asn1.-P | 16 ++--- tests/65-multi-tag-OK.asn1.-Pfnative-types | 16 ++--- tests/66-ref-simple-OK.asn1.-P | 2 +- tests/70-xer-test-OK.asn1.-P | 36 +++++------ tests/72-same-names-OK.asn1.-P | 4 +- tests/73-circular-OK.asn1.-P | 12 ++-- tests/84-param-tags-OK.asn1.-P | 4 +- tests/92-circular-loops-OK.asn1.-P | 60 +++++++++---------- ...-circular-loops-OK.asn1.-Pfindirect-choice | 60 +++++++++---------- tests/93-asn1c-controls-OK.asn1.-P | 8 +-- 29 files changed, 214 insertions(+), 196 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 15616ea25..3ebd41796 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -79,9 +79,9 @@ static int emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode #define DEPENDENCIES do { \ emit_include_dependencies(arg); \ if(expr->expr_type == ASN_CONSTR_SET_OF) \ - GEN_INCLUDE("asn_SET_OF"); \ + GEN_INCLUDE_STD("asn_SET_OF"); \ if(expr->expr_type == ASN_CONSTR_SEQUENCE_OF) \ - GEN_INCLUDE("asn_SEQUENCE_OF"); \ + GEN_INCLUDE_STD("asn_SEQUENCE_OF"); \ } while(0) /* MKID_safe() without checking for reserved keywords */ @@ -328,7 +328,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { return -1; } - GEN_INCLUDE("constr_SEQUENCE"); + GEN_INCLUDE_STD("constr_SEQUENCE"); if(!arg->embed) GEN_DECLARE(expr); /* asn_DEF_xxx */ @@ -568,7 +568,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { tag2el_cxer = 0; } - GEN_INCLUDE("constr_SET"); + GEN_INCLUDE_STD("constr_SET"); if(!arg->embed) GEN_DECLARE(expr); /* asn_DEF_xxx */ @@ -770,9 +770,9 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { * Print out the table according to which parsing is performed. */ if(seq_of) { - GEN_INCLUDE("constr_SEQUENCE_OF"); + GEN_INCLUDE_STD("constr_SEQUENCE_OF"); } else { - GEN_INCLUDE("constr_SET_OF"); + GEN_INCLUDE_STD("constr_SET_OF"); } if(!arg->embed) GEN_DECLARE(expr); /* asn_DEF_xxx */ @@ -921,7 +921,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { return -1; } - GEN_INCLUDE("constr_CHOICE"); + GEN_INCLUDE_STD("constr_CHOICE"); if(!arg->embed) GEN_DECLARE(expr); /* asn_DEF_xxx */ diff --git a/libasn1compiler/asn1c_misc.c b/libasn1compiler/asn1c_misc.c index 742c02aa6..c8adce66c 100644 --- a/libasn1compiler/asn1c_misc.c +++ b/libasn1compiler/asn1c_misc.c @@ -109,7 +109,7 @@ asn1c_make_identifier(enum ami_flags_e flags, asn1p_expr_t *expr, ...) { continue; } - if(str != first && !nodelimiter) + if(str != first && !nodelimiter && !(flags & AMI_NODELIMITER)) *p++ = '_'; /* Delimiter between tokens */ nodelimiter = 0; @@ -150,6 +150,7 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { asn1p_expr_t *exprid = 0; asn1p_expr_t *top_parent; asn1p_expr_t *terminal; + int stdname = 0; char *typename; /* Rewind to the topmost parent expression */ @@ -215,16 +216,25 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { return "double"; else return "long"; - default: break; + default: + typename = 0; + switch(expr->expr_type) { + case ASN_BASIC_INTEGER: + typename = "NativeInteger"; break; + case ASN_BASIC_ENUMERATED: + typename = "NativeEnumerated"; break; + case ASN_BASIC_REAL: + typename = "NativeReal"; break; + default: + break; + } + break; } - switch(expr->expr_type) { - case ASN_BASIC_INTEGER: - return "NativeInteger"; - case ASN_BASIC_ENUMERATED: - return "NativeEnumerated"; - case ASN_BASIC_REAL: - return "NativeReal"; - default: break; + if(typename) { + if(_format != TNF_INCLUDE) + return typename; + stdname = 1; + break; } } /* Fall through */ @@ -233,6 +243,7 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { & (ASN_CONSTR_MASK | ASN_BASIC_MASK | ASN_STRING_MASK)) { if(_format == TNF_RSAFE) _format = TNF_CTYPE; + stdname = 1; typename = ASN_EXPR_TYPE2STR(expr->expr_type); } else { _format = TNF_RSAFE; @@ -242,9 +253,14 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { switch(_format) { case TNF_UNMODIFIED: - case TNF_INCLUDE: return asn1c_make_identifier(AMI_MASK_ONLY_SPACES, 0, exprid ? exprid->Identifier : typename, 0); + case TNF_INCLUDE: + return asn1c_make_identifier( + AMI_MASK_ONLY_SPACES | AMI_NODELIMITER, + 0, stdname ? "<" : "\"", + exprid ? exprid->Identifier : typename, + stdname ? ".h>" : ".h\"", 0); case TNF_SAFE: return asn1c_make_identifier(0, exprid, typename, 0); case TNF_CTYPE: /* C type */ diff --git a/libasn1compiler/asn1c_misc.h b/libasn1compiler/asn1c_misc.h index 23693a0db..b14a1555b 100644 --- a/libasn1compiler/asn1c_misc.h +++ b/libasn1compiler/asn1c_misc.h @@ -9,6 +9,7 @@ enum ami_flags_e { AMI_MASK_ONLY_SPACES = 1, /* Mask only spaces, everything else's safe */ AMI_CHECK_RESERVED = 2, /* Check against reserved keywords */ + AMI_NODELIMITER = 4, /* Do not put delimiter, just concatenate */ }; char *asn1c_make_identifier(enum ami_flags_e, asn1p_expr_t *expr, ...); diff --git a/libasn1compiler/asn1c_out.h b/libasn1compiler/asn1c_out.h index fb986cbf3..3b1f055d7 100644 --- a/libasn1compiler/asn1c_out.h +++ b/libasn1compiler/asn1c_out.h @@ -82,18 +82,19 @@ int asn1c_compiled_output(arg_t *arg, const char *fmt, ...); } while(0) /* Generate #include line */ +#define GEN_INCLUDE_STD(typename) GEN_INCLUDE("<" typename ".h>") #define GEN_INCLUDE(filename) do { \ int saved_target = arg->target->target; \ if(!filename) break; \ REDIR(OT_INCLUDES); \ - OUT_NOINDENT("#include <%s.h>\n", filename); \ + OUT_NOINDENT("#include %s\n", filename); \ REDIR(saved_target); \ } while(0) #define GEN_POSTINCLUDE(filename) do { \ int saved_target = arg->target->target; \ if(!filename) break; \ REDIR(OT_POST_INCLUDE); \ - OUT_NOINDENT("#include <%s.h>\n", filename); \ + OUT_NOINDENT("#include %s\n", filename); \ REDIR(saved_target); \ } while(0) diff --git a/tests/104-param-1-OK.asn1.-P b/tests/104-param-1-OK.asn1.-P index 2b7a50af6..24f4a64ab 100644 --- a/tests/104-param-1-OK.asn1.-P +++ b/tests/104-param-1-OK.asn1.-P @@ -117,7 +117,7 @@ asn_TYPE_descriptor_t asn_DEF_Collection_16P1 = { /*** <<< INCLUDES [Bunch] >>> ***/ -#include +#include "Collection.h" #include /*** <<< TYPE-DECLS [Bunch] >>> ***/ diff --git a/tests/105-param-2-OK.asn1.-P b/tests/105-param-2-OK.asn1.-P index 96de0624d..8a9b9f867 100644 --- a/tests/105-param-2-OK.asn1.-P +++ b/tests/105-param-2-OK.asn1.-P @@ -206,7 +206,7 @@ asn_TYPE_descriptor_t asn_DEF_SIGNED_16P1 = { /*** <<< INCLUDES [SignedREAL] >>> ***/ -#include +#include "SIGNED.h" /*** <<< TYPE-DECLS [SignedREAL] >>> ***/ @@ -330,7 +330,7 @@ asn_TYPE_descriptor_t asn_DEF_SignedREAL = { /*** <<< INCLUDES [SignedSET] >>> ***/ -#include +#include "SIGNED.h" /*** <<< TYPE-DECLS [SignedSET] >>> ***/ diff --git a/tests/106-param-constr-OK.asn1.-P b/tests/106-param-constr-OK.asn1.-P index 5910cfb88..1bca959ae 100644 --- a/tests/106-param-constr-OK.asn1.-P +++ b/tests/106-param-constr-OK.asn1.-P @@ -190,7 +190,7 @@ asn_TYPE_descriptor_t asn_DEF_Narrow_15P0 = { /*** <<< INCLUDES [NarrowInteger] >>> ***/ -#include +#include "Narrow.h" /*** <<< TYPE-DECLS [NarrowInteger] >>> ***/ diff --git a/tests/108-param-constr-3-OK.asn1.-P b/tests/108-param-constr-3-OK.asn1.-P index 33e3fd55d..b09030016 100644 --- a/tests/108-param-constr-3-OK.asn1.-P +++ b/tests/108-param-constr-3-OK.asn1.-P @@ -148,7 +148,7 @@ asn_TYPE_descriptor_t asn_DEF_MinMax_16P0 = { /*** <<< INCLUDES [ThreePlus] >>> ***/ -#include +#include "MinMax.h" /*** <<< TYPE-DECLS [ThreePlus] >>> ***/ diff --git a/tests/110-param-3-OK.asn1.-P b/tests/110-param-3-OK.asn1.-P index 154e8dabc..3cb1058b5 100644 --- a/tests/110-param-3-OK.asn1.-P +++ b/tests/110-param-3-OK.asn1.-P @@ -304,7 +304,7 @@ asn_TYPE_descriptor_t asn_DEF_Flag_16P1 = { /*** <<< INCLUDES [IntegerColorFlag] >>> ***/ -#include +#include "Flag.h" /*** <<< TYPE-DECLS [IntegerColorFlag] >>> ***/ @@ -428,7 +428,7 @@ asn_TYPE_descriptor_t asn_DEF_IntegerColorFlag = { /*** <<< INCLUDES [EnumeratedColorFlag] >>> ***/ -#include +#include "Flag.h" /*** <<< TYPE-DECLS [EnumeratedColorFlag] >>> ***/ diff --git a/tests/19-param-OK.asn1.-P b/tests/19-param-OK.asn1.-P index a7f8e7b2d..24b1313e1 100644 --- a/tests/19-param-OK.asn1.-P +++ b/tests/19-param-OK.asn1.-P @@ -4,7 +4,7 @@ #include #include #include -#include +#include "Name.h" #include /*** <<< TYPE-DECLS [SIGNED] >>> ***/ @@ -209,7 +209,7 @@ asn_TYPE_descriptor_t asn_DEF_SIGNED_15P0 = { /*** <<< INCLUDES [Certificate] >>> ***/ -#include +#include "SIGNED.h" /*** <<< TYPE-DECLS [Certificate] >>> ***/ @@ -355,7 +355,7 @@ extern asn_TYPE_descriptor_t asn_DEF_Name; /*** <<< POST-INCLUDE [Name] >>> ***/ -#include +#include "RelativeDistinguishedName.h" /*** <<< STAT-DEFS [Name] >>> ***/ diff --git a/tests/31-set-of-OK.asn1.-P b/tests/31-set-of-OK.asn1.-P index 38a76bdf9..3a8cb1b20 100644 --- a/tests/31-set-of-OK.asn1.-P +++ b/tests/31-set-of-OK.asn1.-P @@ -23,7 +23,7 @@ extern asn_TYPE_descriptor_t asn_DEF_Forest; /*** <<< POST-INCLUDE [Forest] >>> ***/ -#include +#include "Tree.h" /*** <<< STAT-DEFS [Forest] >>> ***/ @@ -237,7 +237,7 @@ extern asn_TYPE_descriptor_t asn_DEF_Stuff; /*** <<< POST-INCLUDE [Stuff] >>> ***/ -#include +#include "Forest.h" /*** <<< STAT-DEFS [Stuff] >>> ***/ diff --git a/tests/32-sequence-of-OK.asn1.-P b/tests/32-sequence-of-OK.asn1.-P index 5061e77f5..84f0ce032 100644 --- a/tests/32-sequence-of-OK.asn1.-P +++ b/tests/32-sequence-of-OK.asn1.-P @@ -23,7 +23,7 @@ extern asn_TYPE_descriptor_t asn_DEF_Programming; /*** <<< POST-INCLUDE [Programming] >>> ***/ -#include +#include "Fault.h" /*** <<< STAT-DEFS [Programming] >>> ***/ @@ -95,7 +95,7 @@ extern asn_TYPE_descriptor_t asn_DEF_Fault; /*** <<< POST-INCLUDE [Fault] >>> ***/ -#include +#include "Error.h" /*** <<< STAT-DEFS [Fault] >>> ***/ @@ -233,7 +233,7 @@ extern asn_TYPE_descriptor_t asn_DEF_SeqWithMandatory; /*** <<< POST-INCLUDE [SeqWithMandatory] >>> ***/ -#include +#include "Error.h" /*** <<< STAT-DEFS [SeqWithMandatory] >>> ***/ @@ -375,7 +375,7 @@ extern asn_TYPE_descriptor_t asn_DEF_SeqWithOptional; /*** <<< POST-INCLUDE [SeqWithOptional] >>> ***/ -#include +#include "Error.h" /*** <<< STAT-DEFS [SeqWithOptional] >>> ***/ diff --git a/tests/39-sequence-of-OK.asn1.-P b/tests/39-sequence-of-OK.asn1.-P index 6bddb71c2..4e6ed8c8f 100644 --- a/tests/39-sequence-of-OK.asn1.-P +++ b/tests/39-sequence-of-OK.asn1.-P @@ -31,7 +31,7 @@ extern asn_TYPE_descriptor_t asn_DEF_T; /*** <<< POST-INCLUDE [T] >>> ***/ -#include +#include "T2.h" /*** <<< STAT-DEFS [T] >>> ***/ diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index 1c99d1aa3..898d941f7 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -35,7 +35,7 @@ extern asn_TYPE_descriptor_t asn_DEF_LogLine; /*** <<< POST-INCLUDE [LogLine] >>> ***/ -#include +#include "VariablePartSet.h" /*** <<< CODE [LogLine] >>> ***/ @@ -175,7 +175,7 @@ asn_TYPE_descriptor_t asn_DEF_LogLine = { /*** <<< INCLUDES [VariablePartSet] >>> ***/ -#include +#include "ActionItem.h" #include #include #include @@ -209,7 +209,7 @@ extern asn_TYPE_descriptor_t asn_DEF_VariablePartSet; /*** <<< POST-INCLUDE [VariablePartSet] >>> ***/ -#include +#include "VariablePart.h" /*** <<< CODE [VariablePartSet] >>> ***/ diff --git a/tests/43-recursion-OK.asn1.-P b/tests/43-recursion-OK.asn1.-P index 7da8b2e71..7a0b0d357 100644 --- a/tests/43-recursion-OK.asn1.-P +++ b/tests/43-recursion-OK.asn1.-P @@ -40,7 +40,7 @@ extern asn_TYPE_descriptor_t asn_DEF_Test_structure_1; /*** <<< POST-INCLUDE [Test-structure-1] >>> ***/ -#include +#include "Test-structure-1.h" /*** <<< STAT-DEFS [Test-structure-1] >>> ***/ @@ -260,7 +260,7 @@ extern asn_TYPE_descriptor_t asn_DEF_Choice_1; /*** <<< POST-INCLUDE [Choice-1] >>> ***/ -#include +#include "Choice-1.h" /*** <<< STAT-DEFS [Choice-1] >>> ***/ @@ -423,7 +423,7 @@ extern asn_TYPE_descriptor_t asn_DEF_Test_structure_2; /*** <<< POST-INCLUDE [Test-structure-2] >>> ***/ -#include +#include "Test-structure-3.h" /*** <<< STAT-DEFS [Test-structure-2] >>> ***/ @@ -520,7 +520,7 @@ extern asn_TYPE_descriptor_t asn_DEF_Test_structure_3; /*** <<< POST-INCLUDE [Test-structure-3] >>> ***/ -#include +#include "Test-structure-2.h" /*** <<< STAT-DEFS [Test-structure-3] >>> ***/ diff --git a/tests/46-redefine-OK.asn1.-PR b/tests/46-redefine-OK.asn1.-PR index 0dc9674eb..3dc4a06e1 100644 --- a/tests/46-redefine-OK.asn1.-PR +++ b/tests/46-redefine-OK.asn1.-PR @@ -125,7 +125,7 @@ asn_TYPE_descriptor_t asn_DEF_PrimitiveType = { /*** <<< INCLUDES [ConstructedType] >>> ***/ -#include +#include "PrimitiveType.h" #include /*** <<< TYPE-DECLS [ConstructedType] >>> ***/ @@ -196,7 +196,7 @@ asn_TYPE_descriptor_t asn_DEF_ConstructedType = { /*** <<< INCLUDES [T] >>> ***/ -#include +#include "ConstructedType.h" /*** <<< TYPE-DECLS [T] >>> ***/ diff --git a/tests/50-constraint-OK.asn1.-P b/tests/50-constraint-OK.asn1.-P index 3e3bd6c0b..3cdcb3b78 100644 --- a/tests/50-constraint-OK.asn1.-P +++ b/tests/50-constraint-OK.asn1.-P @@ -125,7 +125,7 @@ asn_TYPE_descriptor_t asn_DEF_Int1 = { /*** <<< INCLUDES [Int2] >>> ***/ -#include +#include "Int1.h" /*** <<< TYPE-DECLS [Int2] >>> ***/ @@ -268,7 +268,7 @@ asn_TYPE_descriptor_t asn_DEF_Int2 = { /*** <<< INCLUDES [Int3] >>> ***/ -#include +#include "Int2.h" /*** <<< TYPE-DECLS [Int3] >>> ***/ @@ -415,7 +415,7 @@ asn_TYPE_descriptor_t asn_DEF_Int3 = { /*** <<< INCLUDES [Int4] >>> ***/ -#include +#include "Int3.h" /*** <<< TYPE-DECLS [Int4] >>> ***/ @@ -562,7 +562,7 @@ asn_TYPE_descriptor_t asn_DEF_Int4 = { /*** <<< INCLUDES [Int5] >>> ***/ -#include +#include "Int4.h" /*** <<< TYPE-DECLS [Int5] >>> ***/ @@ -980,7 +980,7 @@ asn_TYPE_descriptor_t asn_DEF_Str1 = { /*** <<< INCLUDES [Str2] >>> ***/ -#include +#include "Str1.h" /*** <<< TYPE-DECLS [Str2] >>> ***/ @@ -1139,7 +1139,7 @@ asn_TYPE_descriptor_t asn_DEF_Str2 = { /*** <<< INCLUDES [Str3] >>> ***/ -#include +#include "Str2.h" /*** <<< TYPE-DECLS [Str3] >>> ***/ @@ -1621,7 +1621,7 @@ asn_TYPE_descriptor_t asn_DEF_PER_Visible = { /*** <<< INCLUDES [PER-Visible-2] >>> ***/ -#include +#include "PER-Visible.h" /*** <<< TYPE-DECLS [PER-Visible-2] >>> ***/ @@ -1777,7 +1777,7 @@ asn_TYPE_descriptor_t asn_DEF_PER_Visible_2 = { /*** <<< INCLUDES [Not-PER-Visible-1] >>> ***/ -#include +#include "PER-Visible.h" /*** <<< TYPE-DECLS [Not-PER-Visible-1] >>> ***/ @@ -1933,7 +1933,7 @@ asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_1 = { /*** <<< INCLUDES [Not-PER-Visible-2] >>> ***/ -#include +#include "PER-Visible.h" /*** <<< TYPE-DECLS [Not-PER-Visible-2] >>> ***/ @@ -2089,7 +2089,7 @@ asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_2 = { /*** <<< INCLUDES [Not-PER-Visible-3] >>> ***/ -#include +#include "PER-Visible.h" /*** <<< TYPE-DECLS [Not-PER-Visible-3] >>> ***/ @@ -2245,7 +2245,7 @@ asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_3 = { /*** <<< INCLUDES [SIZE-but-not-FROM] >>> ***/ -#include +#include "PER-Visible.h" /*** <<< TYPE-DECLS [SIZE-but-not-FROM] >>> ***/ @@ -2404,7 +2404,7 @@ asn_TYPE_descriptor_t asn_DEF_SIZE_but_not_FROM = { /*** <<< INCLUDES [SIZE-and-FROM] >>> ***/ -#include +#include "PER-Visible.h" /*** <<< TYPE-DECLS [SIZE-and-FROM] >>> ***/ @@ -2563,7 +2563,7 @@ asn_TYPE_descriptor_t asn_DEF_SIZE_and_FROM = { /*** <<< INCLUDES [Neither-SIZE-nor-FROM] >>> ***/ -#include +#include "PER-Visible.h" /*** <<< TYPE-DECLS [Neither-SIZE-nor-FROM] >>> ***/ @@ -2869,7 +2869,7 @@ asn_TYPE_descriptor_t asn_DEF_Utf8_4 = { /*** <<< INCLUDES [Utf8-3] >>> ***/ -#include +#include "Utf8-2.h" /*** <<< TYPE-DECLS [Utf8-3] >>> ***/ @@ -3047,7 +3047,7 @@ asn_TYPE_descriptor_t asn_DEF_Utf8_3 = { /*** <<< INCLUDES [Utf8-2] >>> ***/ -#include +#include "Utf8-1.h" /*** <<< TYPE-DECLS [Utf8-2] >>> ***/ @@ -3319,7 +3319,7 @@ asn_TYPE_descriptor_t asn_DEF_Utf8_1 = { /*** <<< INCLUDES [VisibleIdentifier] >>> ***/ -#include +#include "Identifier.h" /*** <<< TYPE-DECLS [VisibleIdentifier] >>> ***/ @@ -3490,12 +3490,12 @@ asn_TYPE_descriptor_t asn_DEF_VisibleIdentifier = { /*** <<< INCLUDES [Sequence] >>> ***/ -#include -#include +#include "Int1.h" +#include "Int4.h" #include #include #include -#include +#include "Int5.h" #include /*** <<< DEPS [Sequence] >>> ***/ @@ -3923,7 +3923,7 @@ extern asn_TYPE_descriptor_t asn_DEF_SequenceOf; /*** <<< POST-INCLUDE [SequenceOf] >>> ***/ -#include +#include "Sequence.h" /*** <<< STAT-DEFS [SequenceOf] >>> ***/ diff --git a/tests/50-constraint-OK.asn1.-Pgen-PER b/tests/50-constraint-OK.asn1.-Pgen-PER index 53adbebe7..0112a2ca9 100644 --- a/tests/50-constraint-OK.asn1.-Pgen-PER +++ b/tests/50-constraint-OK.asn1.-Pgen-PER @@ -143,7 +143,7 @@ asn_TYPE_descriptor_t asn_DEF_Int1 = { /*** <<< INCLUDES [Int2] >>> ***/ -#include +#include "Int1.h" /*** <<< TYPE-DECLS [Int2] >>> ***/ @@ -308,7 +308,7 @@ asn_TYPE_descriptor_t asn_DEF_Int2 = { /*** <<< INCLUDES [Int3] >>> ***/ -#include +#include "Int2.h" /*** <<< TYPE-DECLS [Int3] >>> ***/ @@ -477,7 +477,7 @@ asn_TYPE_descriptor_t asn_DEF_Int3 = { /*** <<< INCLUDES [Int4] >>> ***/ -#include +#include "Int3.h" /*** <<< TYPE-DECLS [Int4] >>> ***/ @@ -646,7 +646,7 @@ asn_TYPE_descriptor_t asn_DEF_Int4 = { /*** <<< INCLUDES [Int5] >>> ***/ -#include +#include "Int4.h" /*** <<< TYPE-DECLS [Int5] >>> ***/ @@ -1126,7 +1126,7 @@ asn_TYPE_descriptor_t asn_DEF_Str1 = { /*** <<< INCLUDES [Str2] >>> ***/ -#include +#include "Str1.h" /*** <<< TYPE-DECLS [Str2] >>> ***/ @@ -1307,7 +1307,7 @@ asn_TYPE_descriptor_t asn_DEF_Str2 = { /*** <<< INCLUDES [Str3] >>> ***/ -#include +#include "Str2.h" /*** <<< TYPE-DECLS [Str3] >>> ***/ @@ -1855,7 +1855,7 @@ asn_TYPE_descriptor_t asn_DEF_PER_Visible = { /*** <<< INCLUDES [PER-Visible-2] >>> ***/ -#include +#include "PER-Visible.h" /*** <<< TYPE-DECLS [PER-Visible-2] >>> ***/ @@ -2033,7 +2033,7 @@ asn_TYPE_descriptor_t asn_DEF_PER_Visible_2 = { /*** <<< INCLUDES [Not-PER-Visible-1] >>> ***/ -#include +#include "PER-Visible.h" /*** <<< TYPE-DECLS [Not-PER-Visible-1] >>> ***/ @@ -2211,7 +2211,7 @@ asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_1 = { /*** <<< INCLUDES [Not-PER-Visible-2] >>> ***/ -#include +#include "PER-Visible.h" /*** <<< TYPE-DECLS [Not-PER-Visible-2] >>> ***/ @@ -2389,7 +2389,7 @@ asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_2 = { /*** <<< INCLUDES [Not-PER-Visible-3] >>> ***/ -#include +#include "PER-Visible.h" /*** <<< TYPE-DECLS [Not-PER-Visible-3] >>> ***/ @@ -2567,7 +2567,7 @@ asn_TYPE_descriptor_t asn_DEF_Not_PER_Visible_3 = { /*** <<< INCLUDES [SIZE-but-not-FROM] >>> ***/ -#include +#include "PER-Visible.h" /*** <<< TYPE-DECLS [SIZE-but-not-FROM] >>> ***/ @@ -2748,7 +2748,7 @@ asn_TYPE_descriptor_t asn_DEF_SIZE_but_not_FROM = { /*** <<< INCLUDES [SIZE-and-FROM] >>> ***/ -#include +#include "PER-Visible.h" /*** <<< TYPE-DECLS [SIZE-and-FROM] >>> ***/ @@ -2929,7 +2929,7 @@ asn_TYPE_descriptor_t asn_DEF_SIZE_and_FROM = { /*** <<< INCLUDES [Neither-SIZE-nor-FROM] >>> ***/ -#include +#include "PER-Visible.h" /*** <<< TYPE-DECLS [Neither-SIZE-nor-FROM] >>> ***/ @@ -3279,7 +3279,7 @@ asn_TYPE_descriptor_t asn_DEF_Utf8_4 = { /*** <<< INCLUDES [Utf8-3] >>> ***/ -#include +#include "Utf8-2.h" /*** <<< TYPE-DECLS [Utf8-3] >>> ***/ @@ -3479,7 +3479,7 @@ asn_TYPE_descriptor_t asn_DEF_Utf8_3 = { /*** <<< INCLUDES [Utf8-2] >>> ***/ -#include +#include "Utf8-1.h" /*** <<< TYPE-DECLS [Utf8-2] >>> ***/ @@ -3791,7 +3791,7 @@ asn_TYPE_descriptor_t asn_DEF_Utf8_1 = { /*** <<< INCLUDES [VisibleIdentifier] >>> ***/ -#include +#include "Identifier.h" /*** <<< TYPE-DECLS [VisibleIdentifier] >>> ***/ @@ -3980,12 +3980,12 @@ asn_TYPE_descriptor_t asn_DEF_VisibleIdentifier = { /*** <<< INCLUDES [Sequence] >>> ***/ -#include -#include +#include "Int1.h" +#include "Int4.h" #include #include #include -#include +#include "Int5.h" #include /*** <<< DEPS [Sequence] >>> ***/ @@ -4452,7 +4452,7 @@ extern asn_TYPE_descriptor_t asn_DEF_SequenceOf; /*** <<< POST-INCLUDE [SequenceOf] >>> ***/ -#include +#include "Sequence.h" /*** <<< STAT-DEFS [SequenceOf] >>> ***/ diff --git a/tests/59-choice-extended-OK.asn1.-P b/tests/59-choice-extended-OK.asn1.-P index 099dd9f82..3684a91f4 100644 --- a/tests/59-choice-extended-OK.asn1.-P +++ b/tests/59-choice-extended-OK.asn1.-P @@ -42,7 +42,7 @@ extern asn_TYPE_descriptor_t asn_DEF_Choice; /*** <<< POST-INCLUDE [Choice] >>> ***/ -#include +#include "Choice.h" /*** <<< STAT-DEFS [Choice] >>> ***/ diff --git a/tests/65-multi-tag-OK.asn1.-P b/tests/65-multi-tag-OK.asn1.-P index 8c8d860fd..7547825a9 100644 --- a/tests/65-multi-tag-OK.asn1.-P +++ b/tests/65-multi-tag-OK.asn1.-P @@ -1,7 +1,7 @@ /*** <<< INCLUDES [T1] >>> ***/ -#include +#include "T2.h" /*** <<< TYPE-DECLS [T1] >>> ***/ @@ -136,7 +136,7 @@ asn_TYPE_descriptor_t asn_DEF_T1 = { /*** <<< INCLUDES [T2] >>> ***/ -#include +#include "T3.h" /*** <<< TYPE-DECLS [T2] >>> ***/ @@ -269,7 +269,7 @@ asn_TYPE_descriptor_t asn_DEF_T2 = { /*** <<< INCLUDES [T3] >>> ***/ -#include +#include "T4.h" /*** <<< TYPE-DECLS [T3] >>> ***/ @@ -400,7 +400,7 @@ asn_TYPE_descriptor_t asn_DEF_T3 = { /*** <<< INCLUDES [T4] >>> ***/ -#include +#include "T5.h" /*** <<< TYPE-DECLS [T4] >>> ***/ @@ -526,7 +526,7 @@ asn_TYPE_descriptor_t asn_DEF_T4 = { /*** <<< INCLUDES [T5] >>> ***/ -#include +#include "T6.h" /*** <<< TYPE-DECLS [T5] >>> ***/ @@ -775,7 +775,7 @@ asn_TYPE_descriptor_t asn_DEF_T6 = { /*** <<< INCLUDES [T] >>> ***/ -#include +#include "Ts.h" /*** <<< TYPE-DECLS [T] >>> ***/ @@ -901,8 +901,8 @@ asn_TYPE_descriptor_t asn_DEF_T = { /*** <<< INCLUDES [Ts] >>> ***/ -#include -#include +#include "T2.h" +#include "T3.h" #include /*** <<< TYPE-DECLS [Ts] >>> ***/ diff --git a/tests/65-multi-tag-OK.asn1.-Pfnative-types b/tests/65-multi-tag-OK.asn1.-Pfnative-types index 9dad4c7d5..3b648ecf6 100644 --- a/tests/65-multi-tag-OK.asn1.-Pfnative-types +++ b/tests/65-multi-tag-OK.asn1.-Pfnative-types @@ -1,7 +1,7 @@ /*** <<< INCLUDES [T1] >>> ***/ -#include +#include "T2.h" /*** <<< TYPE-DECLS [T1] >>> ***/ @@ -136,7 +136,7 @@ asn_TYPE_descriptor_t asn_DEF_T1 = { /*** <<< INCLUDES [T2] >>> ***/ -#include +#include "T3.h" /*** <<< TYPE-DECLS [T2] >>> ***/ @@ -269,7 +269,7 @@ asn_TYPE_descriptor_t asn_DEF_T2 = { /*** <<< INCLUDES [T3] >>> ***/ -#include +#include "T4.h" /*** <<< TYPE-DECLS [T3] >>> ***/ @@ -400,7 +400,7 @@ asn_TYPE_descriptor_t asn_DEF_T3 = { /*** <<< INCLUDES [T4] >>> ***/ -#include +#include "T5.h" /*** <<< TYPE-DECLS [T4] >>> ***/ @@ -526,7 +526,7 @@ asn_TYPE_descriptor_t asn_DEF_T4 = { /*** <<< INCLUDES [T5] >>> ***/ -#include +#include "T6.h" /*** <<< TYPE-DECLS [T5] >>> ***/ @@ -775,7 +775,7 @@ asn_TYPE_descriptor_t asn_DEF_T6 = { /*** <<< INCLUDES [T] >>> ***/ -#include +#include "Ts.h" /*** <<< TYPE-DECLS [T] >>> ***/ @@ -901,8 +901,8 @@ asn_TYPE_descriptor_t asn_DEF_T = { /*** <<< INCLUDES [Ts] >>> ***/ -#include -#include +#include "T2.h" +#include "T3.h" #include /*** <<< TYPE-DECLS [Ts] >>> ***/ diff --git a/tests/66-ref-simple-OK.asn1.-P b/tests/66-ref-simple-OK.asn1.-P index 261a06a3d..2eecf5e17 100644 --- a/tests/66-ref-simple-OK.asn1.-P +++ b/tests/66-ref-simple-OK.asn1.-P @@ -1,7 +1,7 @@ /*** <<< INCLUDES [T] >>> ***/ -#include +#include "SimpleType.h" #include #include diff --git a/tests/70-xer-test-OK.asn1.-P b/tests/70-xer-test-OK.asn1.-P index 0b1b4f2e6..aa7e11e15 100644 --- a/tests/70-xer-test-OK.asn1.-P +++ b/tests/70-xer-test-OK.asn1.-P @@ -1,21 +1,21 @@ /*** <<< INCLUDES [PDU] >>> ***/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "Sequence.h" +#include "Set.h" +#include "SequenceOf.h" +#include "ExtensibleSet.h" +#include "ExtensibleSequence.h" +#include "ExtensibleSequence2.h" +#include "SetOfNULL.h" +#include "SetOfREAL.h" +#include "SetOfEnums.h" +#include "NamedSetOfNULL.h" +#include "NamedSetOfREAL.h" +#include "NamedSetOfEnums.h" +#include "SeqOfZuka.h" +#include "SetOfChoice.h" +#include "NamedSetOfChoice.h" #include /*** <<< DEPS [PDU] >>> ***/ @@ -293,7 +293,7 @@ extern asn_TYPE_descriptor_t asn_DEF_Sequence; /*** <<< POST-INCLUDE [Sequence] >>> ***/ -#include +#include "Sequence.h" /*** <<< STAT-DEFS [Sequence] >>> ***/ @@ -1694,7 +1694,7 @@ extern asn_TYPE_descriptor_t asn_DEF_SetOfChoice; /*** <<< POST-INCLUDE [SetOfChoice] >>> ***/ -#include +#include "SimpleChoice.h" /*** <<< STAT-DEFS [SetOfChoice] >>> ***/ @@ -1766,7 +1766,7 @@ extern asn_TYPE_descriptor_t asn_DEF_NamedSetOfChoice; /*** <<< POST-INCLUDE [NamedSetOfChoice] >>> ***/ -#include +#include "SimpleChoice.h" /*** <<< STAT-DEFS [NamedSetOfChoice] >>> ***/ diff --git a/tests/72-same-names-OK.asn1.-P b/tests/72-same-names-OK.asn1.-P index 38b1fe6dc..43b781307 100644 --- a/tests/72-same-names-OK.asn1.-P +++ b/tests/72-same-names-OK.asn1.-P @@ -2,8 +2,8 @@ /*** <<< INCLUDES [Type] >>> ***/ #include -#include -#include +#include "Type1.h" +#include "Type2.h" #include #include diff --git a/tests/73-circular-OK.asn1.-P b/tests/73-circular-OK.asn1.-P index 3dc73a4e0..1ab4dbf4f 100644 --- a/tests/73-circular-OK.asn1.-P +++ b/tests/73-circular-OK.asn1.-P @@ -29,7 +29,7 @@ extern asn_TYPE_descriptor_t asn_DEF_Type; /*** <<< POST-INCLUDE [Type] >>> ***/ -#include +#include "EpytRef.h" /*** <<< STAT-DEFS [Type] >>> ***/ @@ -130,7 +130,7 @@ asn_TYPE_descriptor_t asn_DEF_Type = { /*** <<< INCLUDES [EpytRef] >>> ***/ -#include +#include "Epyt.h" /*** <<< TYPE-DECLS [EpytRef] >>> ***/ @@ -285,8 +285,8 @@ extern asn_TYPE_descriptor_t asn_DEF_Epyt; /*** <<< POST-INCLUDE [Epyt] >>> ***/ -#include -#include +#include "Type.h" +#include "Ypet.h" /*** <<< STAT-DEFS [Epyt] >>> ***/ @@ -409,7 +409,7 @@ asn_TYPE_descriptor_t asn_DEF_Epyt = { #include #include -#include +#include "EnumType.h" #include #include #include @@ -460,7 +460,7 @@ extern asn_TYPE_descriptor_t asn_DEF_Ypet; /*** <<< POST-INCLUDE [Ypet] >>> ***/ -#include +#include "Epyt.h" /*** <<< CTABLES [Ypet] >>> ***/ diff --git a/tests/84-param-tags-OK.asn1.-P b/tests/84-param-tags-OK.asn1.-P index 8f1dc3df0..66749420e 100644 --- a/tests/84-param-tags-OK.asn1.-P +++ b/tests/84-param-tags-OK.asn1.-P @@ -194,7 +194,7 @@ asn_TYPE_descriptor_t asn_DEF_TestType_16P1 = { /*** <<< INCLUDES [TestChoice] >>> ***/ -#include +#include "TestType.h" #include /*** <<< DEPS [TestChoice] >>> ***/ @@ -465,7 +465,7 @@ asn_TYPE_descriptor_t asn_DEF_AutoType_34P1 = { /*** <<< INCLUDES [AutoChoice] >>> ***/ -#include +#include "AutoType.h" #include /*** <<< DEPS [AutoChoice] >>> ***/ diff --git a/tests/92-circular-loops-OK.asn1.-P b/tests/92-circular-loops-OK.asn1.-P index c0f1ca517..5570aa5b3 100644 --- a/tests/92-circular-loops-OK.asn1.-P +++ b/tests/92-circular-loops-OK.asn1.-P @@ -1,13 +1,13 @@ /*** <<< INCLUDES [Everything] >>> ***/ -#include -#include -#include -#include -#include -#include -#include +#include "Set.h" +#include "Alpha.h" +#include "Beta.h" +#include "Gamma.h" +#include "OneTwo.h" +#include "TwoThree.h" +#include "ThreeOne.h" #include /*** <<< FWD-DECLS [Everything] >>> ***/ @@ -40,9 +40,9 @@ extern asn_TYPE_descriptor_t asn_DEF_Everything; /*** <<< POST-INCLUDE [Everything] >>> ***/ -#include -#include -#include +#include "Choice1.h" +#include "Choice2.h" +#include "Choice3.h" /*** <<< STAT-DEFS [Everything] >>> ***/ @@ -227,7 +227,7 @@ extern asn_TYPE_descriptor_t asn_DEF_Choice1; /*** <<< POST-INCLUDE [Choice1] >>> ***/ -#include +#include "Everything.h" /*** <<< STAT-DEFS [Choice1] >>> ***/ @@ -290,7 +290,7 @@ asn_TYPE_descriptor_t asn_DEF_Choice1 = { /*** <<< INCLUDES [Choice2] >>> ***/ -#include +#include "TypeRef.h" #include /*** <<< DEPS [Choice2] >>> ***/ @@ -329,7 +329,7 @@ extern asn_TYPE_descriptor_t asn_DEF_Choice2; /*** <<< POST-INCLUDE [Choice2] >>> ***/ -#include +#include "Everything.h" /*** <<< STAT-DEFS [Choice2] >>> ***/ @@ -441,8 +441,8 @@ extern asn_TYPE_descriptor_t asn_DEF_Choice3; /*** <<< POST-INCLUDE [Choice3] >>> ***/ -#include -#include +#include "Everything.h" +#include "Choice3.h" /*** <<< STAT-DEFS [Choice3] >>> ***/ @@ -650,8 +650,8 @@ extern asn_TYPE_descriptor_t asn_DEF_Set; /*** <<< POST-INCLUDE [Set] >>> ***/ -#include -#include +#include "Set.h" +#include "Sequence.h" /*** <<< STAT-DEFS [Set] >>> ***/ @@ -822,8 +822,8 @@ extern asn_TYPE_descriptor_t asn_DEF_Sequence; /*** <<< POST-INCLUDE [Sequence] >>> ***/ -#include -#include +#include "Sequence.h" +#include "Set.h" /*** <<< STAT-DEFS [Sequence] >>> ***/ @@ -910,7 +910,7 @@ asn_TYPE_descriptor_t asn_DEF_Sequence = { /*** <<< INCLUDES [TypeRef] >>> ***/ -#include +#include "Sequence.h" /*** <<< TYPE-DECLS [TypeRef] >>> ***/ @@ -1061,7 +1061,7 @@ extern asn_TYPE_descriptor_t asn_DEF_Alpha; /*** <<< POST-INCLUDE [Alpha] >>> ***/ -#include +#include "Beta.h" /*** <<< STAT-DEFS [Alpha] >>> ***/ @@ -1203,8 +1203,8 @@ extern asn_TYPE_descriptor_t asn_DEF_Beta; /*** <<< POST-INCLUDE [Beta] >>> ***/ -#include -#include +#include "Alpha.h" +#include "Gamma.h" /*** <<< STAT-DEFS [Beta] >>> ***/ @@ -1296,9 +1296,9 @@ extern asn_TYPE_descriptor_t asn_DEF_Gamma; /*** <<< POST-INCLUDE [Gamma] >>> ***/ -#include -#include -#include +#include "TwoThree.h" +#include "Alpha.h" +#include "Beta.h" /*** <<< STAT-DEFS [Gamma] >>> ***/ @@ -1410,7 +1410,7 @@ extern asn_TYPE_descriptor_t asn_DEF_OneTwo; /*** <<< POST-INCLUDE [OneTwo] >>> ***/ -#include +#include "TwoThree.h" /*** <<< STAT-DEFS [OneTwo] >>> ***/ @@ -1507,7 +1507,7 @@ extern asn_TYPE_descriptor_t asn_DEF_TwoThree; /*** <<< POST-INCLUDE [TwoThree] >>> ***/ -#include +#include "ThreeOne.h" /*** <<< STAT-DEFS [TwoThree] >>> ***/ @@ -1607,8 +1607,8 @@ extern asn_TYPE_descriptor_t asn_DEF_ThreeOne; /*** <<< POST-INCLUDE [ThreeOne] >>> ***/ -#include -#include +#include "OneTwo.h" +#include "Gamma.h" /*** <<< STAT-DEFS [ThreeOne] >>> ***/ diff --git a/tests/92-circular-loops-OK.asn1.-Pfindirect-choice b/tests/92-circular-loops-OK.asn1.-Pfindirect-choice index 526ed9307..9c9170bcc 100644 --- a/tests/92-circular-loops-OK.asn1.-Pfindirect-choice +++ b/tests/92-circular-loops-OK.asn1.-Pfindirect-choice @@ -1,13 +1,13 @@ /*** <<< INCLUDES [Everything] >>> ***/ -#include -#include -#include -#include -#include -#include -#include +#include "Set.h" +#include "Alpha.h" +#include "Beta.h" +#include "Gamma.h" +#include "OneTwo.h" +#include "TwoThree.h" +#include "ThreeOne.h" #include /*** <<< FWD-DECLS [Everything] >>> ***/ @@ -40,9 +40,9 @@ extern asn_TYPE_descriptor_t asn_DEF_Everything; /*** <<< POST-INCLUDE [Everything] >>> ***/ -#include -#include -#include +#include "Choice1.h" +#include "Choice2.h" +#include "Choice3.h" /*** <<< STAT-DEFS [Everything] >>> ***/ @@ -227,7 +227,7 @@ extern asn_TYPE_descriptor_t asn_DEF_Choice1; /*** <<< POST-INCLUDE [Choice1] >>> ***/ -#include +#include "Everything.h" /*** <<< STAT-DEFS [Choice1] >>> ***/ @@ -329,8 +329,8 @@ extern asn_TYPE_descriptor_t asn_DEF_Choice2; /*** <<< POST-INCLUDE [Choice2] >>> ***/ -#include -#include +#include "TypeRef.h" +#include "Everything.h" /*** <<< STAT-DEFS [Choice2] >>> ***/ @@ -442,8 +442,8 @@ extern asn_TYPE_descriptor_t asn_DEF_Choice3; /*** <<< POST-INCLUDE [Choice3] >>> ***/ -#include -#include +#include "Everything.h" +#include "Choice3.h" /*** <<< STAT-DEFS [Choice3] >>> ***/ @@ -651,8 +651,8 @@ extern asn_TYPE_descriptor_t asn_DEF_Set; /*** <<< POST-INCLUDE [Set] >>> ***/ -#include -#include +#include "Set.h" +#include "Sequence.h" /*** <<< STAT-DEFS [Set] >>> ***/ @@ -823,8 +823,8 @@ extern asn_TYPE_descriptor_t asn_DEF_Sequence; /*** <<< POST-INCLUDE [Sequence] >>> ***/ -#include -#include +#include "Sequence.h" +#include "Set.h" /*** <<< STAT-DEFS [Sequence] >>> ***/ @@ -911,7 +911,7 @@ asn_TYPE_descriptor_t asn_DEF_Sequence = { /*** <<< INCLUDES [TypeRef] >>> ***/ -#include +#include "Sequence.h" /*** <<< TYPE-DECLS [TypeRef] >>> ***/ @@ -1062,7 +1062,7 @@ extern asn_TYPE_descriptor_t asn_DEF_Alpha; /*** <<< POST-INCLUDE [Alpha] >>> ***/ -#include +#include "Beta.h" /*** <<< STAT-DEFS [Alpha] >>> ***/ @@ -1204,8 +1204,8 @@ extern asn_TYPE_descriptor_t asn_DEF_Beta; /*** <<< POST-INCLUDE [Beta] >>> ***/ -#include -#include +#include "Alpha.h" +#include "Gamma.h" /*** <<< STAT-DEFS [Beta] >>> ***/ @@ -1297,9 +1297,9 @@ extern asn_TYPE_descriptor_t asn_DEF_Gamma; /*** <<< POST-INCLUDE [Gamma] >>> ***/ -#include -#include -#include +#include "TwoThree.h" +#include "Alpha.h" +#include "Beta.h" /*** <<< STAT-DEFS [Gamma] >>> ***/ @@ -1411,7 +1411,7 @@ extern asn_TYPE_descriptor_t asn_DEF_OneTwo; /*** <<< POST-INCLUDE [OneTwo] >>> ***/ -#include +#include "TwoThree.h" /*** <<< STAT-DEFS [OneTwo] >>> ***/ @@ -1508,7 +1508,7 @@ extern asn_TYPE_descriptor_t asn_DEF_TwoThree; /*** <<< POST-INCLUDE [TwoThree] >>> ***/ -#include +#include "ThreeOne.h" /*** <<< STAT-DEFS [TwoThree] >>> ***/ @@ -1608,8 +1608,8 @@ extern asn_TYPE_descriptor_t asn_DEF_ThreeOne; /*** <<< POST-INCLUDE [ThreeOne] >>> ***/ -#include -#include +#include "OneTwo.h" +#include "Gamma.h" /*** <<< STAT-DEFS [ThreeOne] >>> ***/ diff --git a/tests/93-asn1c-controls-OK.asn1.-P b/tests/93-asn1c-controls-OK.asn1.-P index c86f6cc2d..d778a7b63 100644 --- a/tests/93-asn1c-controls-OK.asn1.-P +++ b/tests/93-asn1c-controls-OK.asn1.-P @@ -83,7 +83,7 @@ asn_TYPE_descriptor_t asn_DEF_Sequence = { /*** <<< INCLUDES [Set] >>> ***/ -#include +#include "Sequence.h" #include /*** <<< DEPS [Set] >>> ***/ @@ -121,7 +121,7 @@ extern asn_TYPE_descriptor_t asn_DEF_Set; /*** <<< POST-INCLUDE [Set] >>> ***/ -#include +#include "Sequence.h" /*** <<< STAT-DEFS [Set] >>> ***/ @@ -193,7 +193,7 @@ asn_TYPE_descriptor_t asn_DEF_Set = { /*** <<< INCLUDES [Choice] >>> ***/ -#include +#include "Sequence.h" #include #include #include @@ -237,7 +237,7 @@ extern asn_TYPE_descriptor_t asn_DEF_Choice; /*** <<< POST-INCLUDE [Choice] >>> ***/ -#include +#include "Sequence.h" /*** <<< STAT-DEFS [Choice] >>> ***/ From d37b468be4f002d7dca39e40b001a2fc943a86fe Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 13 Sep 2006 02:59:46 +0000 Subject: [PATCH 1180/1469] memory layout git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1180 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/enber.c | 2 +- asn1c/unber.c | 31 +++++++++++++++---------------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/asn1c/enber.c b/asn1c/enber.c index 12dae96e9..5b4963859 100644 --- a/asn1c/enber.c +++ b/asn1c/enber.c @@ -136,7 +136,7 @@ process(const char *fname) { if((collector_size - collector_offset) <= len || !collector) { collector_size <<= 1; - collector = realloc(collector, collector_size); + collector = REALLOC(collector, collector_size); if(!collector) { perror("realloc()"); exit(EX_OSERR); diff --git a/asn1c/unber.c b/asn1c/unber.c index 561761192..4edf18f01 100644 --- a/asn1c/unber.c +++ b/asn1c/unber.c @@ -49,7 +49,7 @@ static int single_type_decoding = 0; /* -1 enables that */ static int minimalistic = 0; /* -m enables that */ static int pretty_printing = 1; /* -p disables that */ static int skip_bytes = 0; /* -s controls that */ -static char *indent_buffer = " "; /* -i controls that */ +static char indent_bytes[16] = " "; /* -i controls that */ int main(int ac, char **av) { @@ -66,10 +66,9 @@ main(int ac, char **av) { break; case 'i': i = atoi(optarg); - if(i >= 0 && i < 16) { - indent_buffer = alloca(i + 1); - memset(indent_buffer, ' ', i); - indent_buffer[i] = '\0'; + if(i >= 0 && i < (int)sizeof(indent_bytes)) { + memset(indent_bytes, ' ', i); + indent_bytes[i] = '\0'; } else { fprintf(stderr, "-i %s: Invalid indent value\n",optarg); exit(EX_USAGE); @@ -393,7 +392,7 @@ print_TL(int fin, asn1c_integer_t offset, int level, int constr, ssize_t tlen, b return; } - while(level-- > 0) printf(indent_buffer); /* Print indent */ + while(level-- > 0) printf(indent_bytes); /* Print indent */ printf(fin ? " 0 && tlv_len < 128*1024 /* VERY long OID! */) { - arcs = malloc(sizeof(*arcs) * (tlv_len + 1)); + arcs = MALLOC(sizeof(*arcs) * (tlv_len + 1)); if(arcs) { - vbuf = malloc(tlv_len + 1); + vbuf = MALLOC(tlv_len + 1); /* Not checking is intentional */ } } @@ -504,7 +503,7 @@ print_V(const char *fname, FILE *fp, ber_tlv_tag_t tlv_tag, ber_tlv_len_t tlv_le (BER_TAG_CLASS(tlv_tag) != ASN_TAG_CLASS_UNIVERSAL && pretty_printing) ) && (tlv_len > 0 && tlv_len < 128 * 1024)) { - vbuf = malloc(tlv_len + 1); + vbuf = MALLOC(tlv_len + 1); /* Not checking is intentional */ } break; @@ -522,8 +521,8 @@ print_V(const char *fname, FILE *fp, ber_tlv_tag_t tlv_tag, ber_tlv_len_t tlv_le if(ch == -1) { fprintf(stderr, "%s: Unexpected end of file (V)\n", fname); - if(vbuf) free(vbuf); - if(arcs) free(arcs); + if(vbuf) FREEMEM(vbuf); + if(arcs) FREEMEM(arcs); return -1; } switch(etype) { @@ -592,7 +591,7 @@ print_V(const char *fname, FILE *fp, ber_tlv_tag_t tlv_tag, ber_tlv_len_t tlv_le if(i) printf("."); printf("%" PRIuASN, arcs[i]); } - free(vbuf); + FREEMEM(vbuf); vbuf = 0; } } @@ -614,7 +613,7 @@ print_V(const char *fname, FILE *fp, ber_tlv_tag_t tlv_tag, ber_tlv_len_t tlv_le if(i) printf("."); printf("%" PRIuASN, arcs[i]); } - free(vbuf); + FREEMEM(vbuf); vbuf = 0; } } @@ -657,10 +656,10 @@ print_V(const char *fname, FILE *fp, ber_tlv_tag_t tlv_tag, ber_tlv_len_t tlv_le else printf("%c", vbuf[i]); } - free(vbuf); + FREEMEM(vbuf); } - if(arcs) free(arcs); + if(arcs) FREEMEM(arcs); return 0; } @@ -676,7 +675,7 @@ decode_tlv_from_string(const char *datastring) { int half; dsize = strlen(datastring) + 1; - dp = data = calloc(1, dsize); + dp = data = CALLOC(1, dsize); assert(data); for(half = 0, p = datastring; *p; p++) { From f5aff9265cc194fcc402276dce6c47675d7886be Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 13 Sep 2006 04:02:00 +0000 Subject: [PATCH 1181/1469] clarity git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1181 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/GeneralizedTime.c | 4 +- skeletons/OCTET_STRING.c | 2 +- skeletons/REAL.c | 6 +- skeletons/asn_SET_OF.c | 2 +- skeletons/constr_SET_OF.c | 2 +- skeletons/converter-sample.c | 122 +++++++++++++++++++---------------- 6 files changed, 75 insertions(+), 63 deletions(-) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 0c3049355..f864d8307 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -118,7 +118,7 @@ static long GMTOFF(struct tm a){ setenv("TZ", tzold, 1); \ *tzoldbuf = 0; \ if(tzold != tzoldbuf) \ - free(tzold); \ + FREEMEM(tzold); \ } else { \ unsetenv("TZ"); \ } \ @@ -671,7 +671,7 @@ asn_time2GT_frac(GeneralizedTime_t *opt_gt, const struct tm *tm, int frac_value, FREEMEM(opt_gt->buf); } else { opt_gt = (GeneralizedTime_t *)CALLOC(1, sizeof *opt_gt); - if(!opt_gt) { free(buf); return 0; } + if(!opt_gt) { FREEMEM(buf); return 0; } } opt_gt->buf = (unsigned char *)buf; diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index f2dd1c607..7b83b618a 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -1537,7 +1537,7 @@ OCTET_STRING_new_fromBuf(asn_TYPE_descriptor_t *td, const char *str, int len) { st = (OCTET_STRING_t *)CALLOC(1, specs->struct_size); if(st && str && OCTET_STRING_fromBuf(st, str, len)) { - free(st); + FREEMEM(st); st = NULL; } diff --git a/skeletons/REAL.c b/skeletons/REAL.c index dfaedf7db..51098c00b 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -119,7 +119,7 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) buflen = ret; break; } - if(buf != local_buf) free(buf); + if(buf != local_buf) FREEMEM(buf); buf = (char *)MALLOC(buflen); if(!buf) return -1; } while(1); @@ -219,7 +219,7 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key) } ret = cb(buf, buflen, app_key); - if(buf != local_buf) free(buf); + if(buf != local_buf) FREEMEM(buf); return (ret < 0) ? -1 : buflen; } @@ -322,7 +322,7 @@ REAL__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chunk_b b[chunk_size] = 0; /* nul-terminate */ value = strtod(b, &endptr); - free(b); + FREEMEM(b); if(endptr == b) return XPBD_BROKEN_ENCODING; if(asn_double2REAL(st, value)) diff --git a/skeletons/asn_SET_OF.c b/skeletons/asn_SET_OF.c index 367067747..944f2cb8a 100644 --- a/skeletons/asn_SET_OF.c +++ b/skeletons/asn_SET_OF.c @@ -77,7 +77,7 @@ asn_set_empty(void *asn_set_of_x) { while(as->count--) as->free(as->array[as->count]); } - free(as->array); + FREEMEM(as->array); as->array = 0; } as->count = 0; diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index 564296356..03c6fe28e 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -747,7 +747,7 @@ SET_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, if(encs[encs_count].buffer) FREEMEM(encs[encs_count].buffer); } - free(encs); + FREEMEM(encs); } _ASN_ENCODED_OK(er); } diff --git a/skeletons/converter-sample.c b/skeletons/converter-sample.c index e5ab8da13..e1e3dcc1d 100644 --- a/skeletons/converter-sample.c +++ b/skeletons/converter-sample.c @@ -271,57 +271,58 @@ main(int ac, char **av) { return 0; } -/* Dump the buffer */ -static int write_out(const void *buffer, size_t size, void *key) { - FILE *fp = (FILE *)key; - return (fwrite(buffer, 1, size, fp) == size) ? 0 : -1; -} - -static char *buffer; -static size_t buf_len; /* Length of meaningful contents */ -static size_t buf_size; /* Allocated memory */ -static size_t buf_offset; /* Offset from the start */ -static off_t buf_shifted; /* Number of bytes ever shifted */ -static int buf_nreallocs; /* Number of reallocations */ - -#define bufptr (buffer + buf_offset) -#define bufend (buffer + buf_offset + buf_len) +static struct dynamic_buffer { + char *data; /* Pointer to the data bytes */ + size_t offset; /* Offset from the start */ + size_t length; /* Length of meaningful contents */ + size_t allocated; /* Allocated memory for data */ + int nreallocs; /* Number of data reallocations */ + off_t bytes_shifted; /* Number of bytes ever shifted */ +} DynamicBuffer; /* * Ensure that the buffer contains at least this amount of free space. */ -static void buf_extend(const void *data2add, size_t bySize) { +static void add_bytes_to_buffer(const void *data2add, size_t bySize) { - DEBUG("buf_extend(%ld) { o=%ld l=%ld s=%ld }", - (long)bySize, (long)buf_offset, (long)buf_len, (long)buf_size); + DEBUG("add_bytes(%ld) { o=%ld l=%ld s=%ld }", + (long)bySize, + (long)DynamicBuffer.offset, + (long)DynamicBuffer.length, + (long)DynamicBuffer.allocated); - if(buf_size >= (buf_offset + buf_len + bySize)) { - /* Nothing to do */ - } else if(bySize <= buf_offset) { - DEBUG("\tContents shifted by %ld", (long)buf_offset); + if(DynamicBuffer.allocated + >= (DynamicBuffer.offset + DynamicBuffer.length + bySize)) { + /* No buffer reallocation is necessary */ + } else if(bySize <= DynamicBuffer.offset) { + DEBUG("\tContents shifted by %ld", DynamicBuffer.offset); /* Shift the buffer contents */ - memmove(buffer, buffer + buf_offset, buf_len); - buf_shifted += buf_offset; - buf_offset = 0; + memmove(DynamicBuffer.data, + DynamicBuffer.data + DynamicBuffer.offset, + DynamicBuffer.length); + DynamicBuffer.bytes_shifted += DynamicBuffer.offset; + DynamicBuffer.offset = 0; } else { - size_t newsize = (buf_size << 2) + bySize; - void *p = malloc(newsize); + size_t newsize = (DynamicBuffer.allocated << 2) + bySize; + void *p = MALLOC(newsize); if(!p) { - perror("realloc()"); + perror("malloc()"); exit(EX_OSERR); } - memcpy(p, buffer, buf_len); - free(buffer); - buffer = (char *)p; - buf_size = newsize; - buf_offset = 0; + memcpy(p, DynamicBuffer.data, DynamicBuffer.length); + FREEMEM(DynamicBuffer.data); + DynamicBuffer.data = (char *)p; + DynamicBuffer.offset = 0; + DynamicBuffer.allocated = newsize; + DynamicBuffer.nreallocs++; DEBUG("\tBuffer reallocated to %ld, %d time", - (long)newsize, ++buf_nreallocs); + newsize, DynamicBuffer.nreallocs); } - memcpy(buffer + buf_offset + buf_len, data2add, bySize); - buf_len += bySize; + memcpy(DynamicBuffer.data + DynamicBuffer.offset + DynamicBuffer.length, + data2add, bySize); + DynamicBuffer.length += bySize; } static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *fname, ssize_t suggested_bufsize) { @@ -355,7 +356,7 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *f /* prepare the file buffer */ if(fbuf_size != suggested_bufsize) { - fbuf = (char *)realloc(fbuf, suggested_bufsize); + fbuf = (char *)REALLOC(fbuf, suggested_bufsize); if(!fbuf) { perror("realloc()"); exit(EX_OSERR); @@ -363,11 +364,11 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *f fbuf_size = suggested_bufsize; } - buf_nreallocs = 0; - buf_shifted = 0; - buf_offset = 0; - buf_size = 0; - buf_len = 0; + DynamicBuffer.offset = 0; + DynamicBuffer.length = 0; + DynamicBuffer.allocated = 0; + DynamicBuffer.bytes_shifted = 0; + DynamicBuffer.nreallocs = 0; /* Pretend immediate EOF */ rval.code = RC_WMORE; @@ -380,11 +381,11 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *f /* * Copy the data over, or use the original buffer. */ - if(buf_size) { + if(DynamicBuffer.allocated) { /* Append the new data into the intermediate buffer */ - buf_extend(fbuf, rd); - i_bptr = bufptr; - i_size = buf_len; + add_bytes_to_buffer(fbuf, rd); + i_bptr = DynamicBuffer.data + DynamicBuffer.offset; + i_size = DynamicBuffer.allocated; } else { i_bptr = fbuf; i_size = rd; @@ -405,15 +406,16 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *f break; } DEBUG("decode(%ld) consumed %ld (%ld), code %d", - (long)buf_len, (long)rval.consumed, (long)i_size, + (long)DynamicBuffer.length, + (long)rval.consumed, (long)i_size, rval.code); - if(buf_size == 0) { + if(DynamicBuffer.allocated == 0) { /* - * Switch the remainder into the intermediate buffer. + * Flush the remainder into the intermediate buffer. */ if(rval.code != RC_FAIL && rval.consumed < rd) { - buf_extend(fbuf + rval.consumed, + add_bytes_to_buffer(fbuf + rval.consumed, rd - rval.consumed); rval.consumed = 0; } @@ -427,13 +429,17 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *f return structure; case RC_WMORE: DEBUG("RC_WMORE, continuing %ld with %ld..%ld..%ld", - (long)rval.consumed, (long)buf_offset, - (long)buf_len, (long)buf_size); + (long)rval.consumed, + (long)DynamicBuffer.offset, + (long)DynamicBuffer.length, + (long)DynamicBuffer.allocated); /* * Adjust position inside the source buffer. */ - buf_offset += rval.consumed; - buf_len -= rval.consumed; + if(DynamicBuffer.allocated) { + DynamicBuffer.offset += rval.consumed; + DynamicBuffer.length -= rval.consumed; + } rval.consumed = 0; continue; case RC_FAIL: @@ -449,7 +455,8 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *f fprintf(stderr, "%s: " "Decode failed past byte %ld: %s\n", - fname, (long)(buf_shifted + buf_offset + rval.consumed), + fname, (long)(DynamicBuffer.bytes_shifted + + DynamicBuffer.offset + rval.consumed), (rval.code == RC_WMORE) ? "Unexpected end of input" : "Input processing error"); @@ -457,3 +464,8 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *f return 0; } +/* Dump the buffer out to the specified FILE */ +static int write_out(const void *buffer, size_t size, void *key) { + FILE *fp = (FILE *)key; + return (fwrite(buffer, 1, size, fp) == size) ? 0 : -1; +} From cb9238215dae93ba4675148fb354acc3d1ec862a Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 13 Sep 2006 04:14:17 +0000 Subject: [PATCH 1182/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1182 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/converter-sample.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/skeletons/converter-sample.c b/skeletons/converter-sample.c index e1e3dcc1d..c8ee34f2d 100644 --- a/skeletons/converter-sample.c +++ b/skeletons/converter-sample.c @@ -293,7 +293,7 @@ static void add_bytes_to_buffer(const void *data2add, size_t bySize) { if(DynamicBuffer.allocated >= (DynamicBuffer.offset + DynamicBuffer.length + bySize)) { - /* No buffer reallocation is necessary */ + DEBUG("\tNo buffer reallocation is necessary"); } else if(bySize <= DynamicBuffer.offset) { DEBUG("\tContents shifted by %ld", DynamicBuffer.offset); @@ -316,7 +316,7 @@ static void add_bytes_to_buffer(const void *data2add, size_t bySize) { DynamicBuffer.offset = 0; DynamicBuffer.allocated = newsize; DynamicBuffer.nreallocs++; - DEBUG("\tBuffer reallocated to %ld, %d time", + DEBUG("\tBuffer reallocated to %ld (%d time)", newsize, DynamicBuffer.nreallocs); } @@ -385,7 +385,7 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *f /* Append the new data into the intermediate buffer */ add_bytes_to_buffer(fbuf, rd); i_bptr = DynamicBuffer.data + DynamicBuffer.offset; - i_size = DynamicBuffer.allocated; + i_size = DynamicBuffer.length; } else { i_bptr = fbuf; i_size = rd; @@ -428,11 +428,6 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *f if(fp != stdin) fclose(fp); return structure; case RC_WMORE: - DEBUG("RC_WMORE, continuing %ld with %ld..%ld..%ld", - (long)rval.consumed, - (long)DynamicBuffer.offset, - (long)DynamicBuffer.length, - (long)DynamicBuffer.allocated); /* * Adjust position inside the source buffer. */ @@ -440,6 +435,11 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *f DynamicBuffer.offset += rval.consumed; DynamicBuffer.length -= rval.consumed; } + DEBUG("RC_WMORE, continuing %ld with %ld..%ld..%ld", + (long)rval.consumed, + (long)DynamicBuffer.offset, + (long)DynamicBuffer.length, + (long)DynamicBuffer.allocated); rval.consumed = 0; continue; case RC_FAIL: From d3420d358659765680321b457f74ac9617fe7367 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 14 Sep 2006 10:35:20 +0000 Subject: [PATCH 1183/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1183 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1parser/asn1p_module.h | 8 +- libasn1parser/asn1p_y.c | 2212 +++++++++++++++++---------------- libasn1parser/asn1p_y.h | 2 +- libasn1parser/asn1p_y.y | 134 +- tests/49-real-life-OK.asn1 | 2 + tests/49-real-life-OK.asn1.-E | 2 + 6 files changed, 1197 insertions(+), 1163 deletions(-) diff --git a/libasn1parser/asn1p_module.h b/libasn1parser/asn1p_module.h index 5e7ce15dc..ad9eab04e 100644 --- a/libasn1parser/asn1p_module.h +++ b/libasn1parser/asn1p_module.h @@ -51,14 +51,14 @@ typedef struct asn1p_module_s { asn1p_module_flags_e module_flags; /* AUTOMATIC TAGS? */ /* - * List of everything that this module IMPORTS. + * List of everything that this module EXPORTS. */ - TQ_HEAD(struct asn1p_xports_s) imports; + TQ_HEAD(struct asn1p_xports_s) exports; /* - * List of everything that this module EXPORTS. + * List of everything that this module IMPORTS. */ - TQ_HEAD(struct asn1p_xports_s) exports; + TQ_HEAD(struct asn1p_xports_s) imports; /* * List of everything that this module defines itself. diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index ba23ed2e6..d1105a53f 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -336,6 +336,19 @@ static void _fixup_anonymous_identifier(asn1p_expr_t *expr); } \ } while(0) +#ifdef AL_IMPORT +#error AL_IMPORT DEFINED ELSEWHERE! +#endif +#define AL_IMPORT(to,where,from,field) do { \ + if(!(from)) break; \ + while(TQ_FIRST(&((from)->where))) { \ + TQ_ADD(&((to)->where), \ + TQ_REMOVE(&((from)->where), field), \ + field); \ + } \ + assert(TQ_FIRST(&((from)->where)) == 0); \ + } while(0) + /* Enabling traces. */ @@ -352,7 +365,7 @@ static void _fixup_anonymous_identifier(asn1p_expr_t *expr); #endif #ifndef YYSTYPE -#line 72 "asn1p_y.y" +#line 85 "asn1p_y.y" typedef union { asn1p_t *a_grammar; asn1p_module_flags_e a_module_flags; @@ -388,7 +401,7 @@ typedef union { } tv_nametag; } yystype; /* Line 193 of /usr/local/share/bison/yacc.c. */ -#line 392 "asn1p_y.c" +#line 405 "asn1p_y.c" # define YYSTYPE yystype # define YYSTYPE_IS_TRIVIAL 1 #endif @@ -409,7 +422,7 @@ typedef struct yyltype /* Line 213 of /usr/local/share/bison/yacc.c. */ -#line 413 "asn1p_y.c" +#line 426 "asn1p_y.c" #if ! defined (yyoverflow) || YYERROR_VERBOSE @@ -507,16 +520,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 7 -#define YYLAST 803 +#define YYLAST 816 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 121 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 109 +#define YYNNTS 112 /* YYNRULES -- Number of rules. */ -#define YYNRULES 293 +#define YYNRULES 296 /* YYNRULES -- Number of states. */ -#define YYNSTATES 450 +#define YYNSTATES 453 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 @@ -574,157 +587,158 @@ static const unsigned short yyprhs[] = { 0, 0, 3, 5, 7, 10, 19, 20, 22, 26, 29, 31, 34, 36, 41, 43, 44, 46, 48, 51, - 54, 57, 60, 63, 66, 67, 69, 71, 74, 76, - 78, 80, 82, 84, 85, 89, 91, 95, 98, 100, - 103, 104, 106, 111, 113, 117, 119, 123, 125, 129, - 133, 136, 138, 142, 144, 148, 150, 154, 159, 161, - 163, 168, 172, 176, 183, 190, 192, 196, 198, 202, - 206, 210, 214, 216, 220, 222, 224, 226, 228, 229, - 231, 233, 237, 241, 244, 248, 250, 252, 256, 259, - 261, 263, 269, 270, 272, 274, 278, 281, 286, 290, - 294, 298, 302, 306, 307, 309, 310, 317, 319, 322, - 324, 326, 328, 332, 334, 338, 342, 346, 347, 350, - 352, 357, 362, 367, 374, 381, 383, 388, 392, 394, - 398, 402, 406, 408, 412, 414, 418, 420, 422, 424, - 426, 430, 434, 436, 441, 443, 445, 449, 450, 454, - 456, 458, 460, 462, 464, 466, 468, 470, 474, 476, - 478, 480, 482, 485, 487, 489, 491, 493, 496, 499, - 501, 503, 506, 509, 511, 513, 515, 517, 519, 522, - 524, 527, 529, 531, 533, 535, 537, 539, 541, 543, + 54, 57, 60, 63, 66, 67, 69, 73, 75, 78, + 80, 82, 84, 85, 89, 91, 92, 94, 98, 101, + 103, 106, 107, 109, 114, 116, 120, 122, 126, 128, + 129, 131, 135, 139, 142, 144, 148, 150, 154, 156, + 160, 165, 167, 169, 174, 178, 182, 189, 196, 198, + 202, 204, 208, 212, 216, 220, 222, 226, 228, 230, + 232, 234, 235, 237, 239, 243, 247, 250, 254, 256, + 258, 262, 265, 267, 269, 275, 276, 278, 280, 284, + 287, 292, 296, 300, 304, 308, 312, 313, 315, 316, + 323, 325, 328, 330, 332, 334, 338, 340, 344, 348, + 352, 353, 356, 358, 363, 368, 373, 380, 387, 389, + 394, 398, 400, 404, 408, 412, 414, 418, 420, 424, + 426, 428, 430, 432, 436, 440, 442, 447, 449, 451, + 455, 456, 460, 462, 464, 466, 468, 470, 472, 474, + 476, 480, 482, 484, 486, 488, 491, 493, 495, 497, + 499, 502, 505, 507, 509, 512, 515, 517, 519, 521, + 523, 525, 528, 530, 533, 535, 537, 539, 541, 543, 545, 547, 549, 551, 553, 555, 557, 559, 561, 563, - 565, 566, 568, 570, 575, 579, 584, 586, 588, 592, - 598, 600, 604, 608, 612, 616, 621, 625, 627, 629, - 633, 637, 641, 645, 647, 649, 650, 656, 658, 661, - 664, 668, 670, 672, 674, 676, 678, 680, 682, 684, - 688, 694, 696, 700, 702, 706, 707, 709, 711, 713, - 715, 717, 719, 723, 728, 730, 734, 737, 741, 743, - 747, 748, 750, 752, 755, 758, 762, 764, 768, 770, - 775, 780, 782, 784, 786, 788, 790, 792, 793, 795, - 798, 803, 804, 806, 808, 810, 811, 813, 815, 817, - 819, 821, 822, 824 + 565, 567, 569, 571, 572, 574, 576, 581, 585, 590, + 592, 594, 598, 604, 606, 610, 614, 618, 622, 627, + 631, 633, 635, 639, 643, 647, 651, 653, 655, 656, + 662, 664, 667, 670, 674, 676, 678, 680, 682, 684, + 686, 688, 690, 694, 700, 702, 706, 708, 712, 713, + 715, 717, 719, 721, 723, 725, 729, 734, 736, 740, + 743, 747, 749, 753, 754, 756, 758, 761, 764, 768, + 770, 774, 776, 781, 786, 788, 790, 792, 794, 796, + 798, 799, 801, 804, 809, 810, 812, 814, 816, 817, + 819, 821, 823, 825, 827, 828, 830 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const short yyrhs[] = { 122, 0, -1, 123, -1, 124, -1, 123, 124, -1, - 226, 125, 39, 129, 3, 26, 132, 44, -1, -1, + 229, 125, 39, 129, 3, 26, 132, 44, -1, -1, 126, -1, 108, 127, 109, -1, 108, 109, -1, 128, - -1, 127, 128, -1, 229, -1, 229, 110, 10, 111, + -1, 127, 128, -1, 232, -1, 232, 110, 10, 111, -1, 10, -1, -1, 130, -1, 131, -1, 130, 131, -1, 46, 89, -1, 57, 89, -1, 25, 89, -1, - 48, 58, -1, 16, 62, -1, -1, 133, -1, 134, - -1, 133, 134, -1, 136, -1, 142, -1, 148, -1, - 178, -1, 146, -1, -1, 43, 16, 135, -1, 188, - -1, 59, 137, 112, -1, 59, 51, -1, 139, -1, - 137, 139, -1, -1, 126, -1, 140, 51, 226, 138, - -1, 141, -1, 140, 113, 141, -1, 226, -1, 226, - 108, 109, -1, 229, -1, 47, 143, 112, -1, 47, - 22, 112, -1, 47, 112, -1, 144, -1, 143, 113, - 144, -1, 226, -1, 226, 108, 109, -1, 229, -1, - 108, 195, 109, -1, 226, 147, 3, 145, -1, 187, - -1, 172, -1, 172, 108, 151, 109, -1, 226, 3, - 168, -1, 226, 3, 158, -1, 226, 108, 149, 109, - 3, 168, -1, 226, 108, 149, 109, 3, 158, -1, - 150, -1, 149, 113, 150, -1, 226, -1, 226, 114, - 229, -1, 226, 114, 226, -1, 185, 114, 229, -1, - 185, 114, 226, -1, 152, -1, 151, 113, 152, -1, - 168, -1, 181, -1, 229, -1, 145, -1, -1, 154, - -1, 155, -1, 154, 113, 155, -1, 229, 168, 214, - -1, 168, 214, -1, 35, 73, 168, -1, 167, -1, - 157, -1, 156, 113, 157, -1, 229, 168, -1, 167, - -1, 168, -1, 33, 108, 160, 109, 162, -1, -1, - 93, -1, 161, -1, 160, 113, 161, -1, 17, 214, - -1, 18, 168, 159, 214, -1, 18, 176, 214, -1, - 18, 177, 214, -1, 17, 176, 214, -1, 17, 168, - 214, -1, 17, 177, 214, -1, -1, 163, -1, -1, - 100, 87, 108, 164, 165, 109, -1, 166, -1, 165, - 166, -1, 4, -1, 19, -1, 175, -1, 115, 165, - 116, -1, 107, -1, 107, 117, 182, -1, 107, 117, - 219, -1, 221, 170, 192, -1, -1, 169, 171, -1, - 147, -1, 32, 108, 156, 109, -1, 83, 108, 153, - 109, -1, 84, 108, 153, 109, -1, 83, 192, 73, - 228, 221, 170, -1, 84, 192, 73, 228, 221, 170, - -1, 23, -1, 23, 40, 30, 229, -1, 61, 73, - 172, -1, 15, -1, 15, 118, 226, -1, 227, 118, - 226, -1, 15, 118, 229, -1, 227, -1, 227, 118, - 173, -1, 174, -1, 173, 118, 174, -1, 175, -1, - 17, -1, 18, -1, 17, -1, 176, 118, 17, -1, - 176, 118, 18, -1, 16, -1, 229, 147, 3, 179, - -1, 181, -1, 182, -1, 229, 114, 179, -1, -1, - 108, 180, 184, -1, 68, -1, 50, -1, 91, -1, - 6, -1, 8, -1, 183, -1, 219, -1, 229, -1, - 226, 118, 229, -1, 7, -1, 13, -1, 14, -1, - 5, -1, 184, 5, -1, 29, -1, 68, -1, 81, - -1, 186, -1, 72, 86, -1, 70, 56, -1, 82, - -1, 49, -1, 41, 76, -1, 31, 86, -1, 96, - -1, 52, -1, 188, -1, 63, -1, 45, -1, 27, - 86, -1, 185, -1, 186, 216, -1, 28, -1, 53, - -1, 54, -1, 55, -1, 64, -1, 69, -1, 79, - -1, 88, -1, 90, -1, 95, -1, 97, -1, 98, - -1, 99, -1, 71, -1, 104, -1, 105, -1, 102, - -1, 103, -1, 101, -1, -1, 193, -1, 194, -1, - 85, 110, 195, 111, -1, 110, 195, 111, -1, 194, - 110, 195, 111, -1, 107, -1, 196, -1, 196, 113, - 107, -1, 196, 113, 107, 113, 196, -1, 197, -1, - 22, 101, 197, -1, 196, 189, 197, -1, 196, 190, - 197, -1, 197, 191, 197, -1, 200, 110, 195, 111, - -1, 110, 195, 111, -1, 201, -1, 202, -1, 201, - 199, 201, -1, 66, 199, 201, -1, 201, 199, 65, - -1, 66, 199, 65, -1, 208, -1, 203, -1, -1, - 36, 30, 108, 198, 184, -1, 106, -1, 106, 119, - -1, 119, 106, -1, 119, 106, 119, -1, 85, -1, - 51, -1, 50, -1, 91, -1, 220, -1, 183, -1, - 229, -1, 226, -1, 100, 34, 194, -1, 100, 35, - 108, 204, 109, -1, 205, -1, 204, 113, 205, -1, - 107, -1, 229, 192, 206, -1, -1, 207, -1, 78, - -1, 20, -1, 74, -1, 209, -1, 210, -1, 108, - 226, 109, -1, 209, 108, 211, 109, -1, 212, -1, - 211, 113, 212, -1, 120, 213, -1, 120, 118, 213, - -1, 229, -1, 213, 118, 229, -1, -1, 215, -1, - 74, -1, 38, 179, -1, 108, 109, -1, 108, 217, - 109, -1, 218, -1, 217, 113, 218, -1, 229, -1, - 229, 110, 219, 111, -1, 229, 110, 182, 111, -1, - 219, -1, 107, -1, 10, -1, 11, -1, 219, -1, - 12, -1, -1, 222, -1, 223, 225, -1, 115, 224, - 10, 116, -1, -1, 94, -1, 24, -1, 80, -1, - -1, 57, -1, 46, -1, 15, -1, 16, -1, 16, - -1, -1, 229, -1, 9, -1 + 48, 58, -1, 16, 62, -1, -1, 133, -1, 144, + 137, 134, -1, 135, -1, 134, 135, -1, 151, -1, + 181, -1, 149, -1, -1, 43, 16, 136, -1, 191, + -1, -1, 138, -1, 59, 139, 112, -1, 59, 51, + -1, 141, -1, 139, 141, -1, -1, 126, -1, 142, + 51, 229, 140, -1, 143, -1, 142, 113, 143, -1, + 229, -1, 229, 108, 109, -1, 232, -1, -1, 145, + -1, 47, 146, 112, -1, 47, 22, 112, -1, 47, + 112, -1, 147, -1, 146, 113, 147, -1, 229, -1, + 229, 108, 109, -1, 232, -1, 108, 198, 109, -1, + 229, 150, 3, 148, -1, 190, -1, 175, -1, 175, + 108, 154, 109, -1, 229, 3, 171, -1, 229, 3, + 161, -1, 229, 108, 152, 109, 3, 171, -1, 229, + 108, 152, 109, 3, 161, -1, 153, -1, 152, 113, + 153, -1, 229, -1, 229, 114, 232, -1, 229, 114, + 229, -1, 188, 114, 232, -1, 188, 114, 229, -1, + 155, -1, 154, 113, 155, -1, 171, -1, 184, -1, + 232, -1, 148, -1, -1, 157, -1, 158, -1, 157, + 113, 158, -1, 232, 171, 217, -1, 171, 217, -1, + 35, 73, 171, -1, 170, -1, 160, -1, 159, 113, + 160, -1, 232, 171, -1, 170, -1, 171, -1, 33, + 108, 163, 109, 165, -1, -1, 93, -1, 164, -1, + 163, 113, 164, -1, 17, 217, -1, 18, 171, 162, + 217, -1, 18, 179, 217, -1, 18, 180, 217, -1, + 17, 179, 217, -1, 17, 171, 217, -1, 17, 180, + 217, -1, -1, 166, -1, -1, 100, 87, 108, 167, + 168, 109, -1, 169, -1, 168, 169, -1, 4, -1, + 19, -1, 178, -1, 115, 168, 116, -1, 107, -1, + 107, 117, 185, -1, 107, 117, 222, -1, 224, 173, + 195, -1, -1, 172, 174, -1, 150, -1, 32, 108, + 159, 109, -1, 83, 108, 156, 109, -1, 84, 108, + 156, 109, -1, 83, 195, 73, 231, 224, 173, -1, + 84, 195, 73, 231, 224, 173, -1, 23, -1, 23, + 40, 30, 232, -1, 61, 73, 175, -1, 15, -1, + 15, 118, 229, -1, 230, 118, 229, -1, 15, 118, + 232, -1, 230, -1, 230, 118, 176, -1, 177, -1, + 176, 118, 177, -1, 178, -1, 17, -1, 18, -1, + 17, -1, 179, 118, 17, -1, 179, 118, 18, -1, + 16, -1, 232, 150, 3, 182, -1, 184, -1, 185, + -1, 232, 114, 182, -1, -1, 108, 183, 187, -1, + 68, -1, 50, -1, 91, -1, 6, -1, 8, -1, + 186, -1, 222, -1, 232, -1, 229, 118, 232, -1, + 7, -1, 13, -1, 14, -1, 5, -1, 187, 5, + -1, 29, -1, 68, -1, 81, -1, 189, -1, 72, + 86, -1, 70, 56, -1, 82, -1, 49, -1, 41, + 76, -1, 31, 86, -1, 96, -1, 52, -1, 191, + -1, 63, -1, 45, -1, 27, 86, -1, 188, -1, + 189, 219, -1, 28, -1, 53, -1, 54, -1, 55, + -1, 64, -1, 69, -1, 79, -1, 88, -1, 90, + -1, 95, -1, 97, -1, 98, -1, 99, -1, 71, + -1, 104, -1, 105, -1, 102, -1, 103, -1, 101, + -1, -1, 196, -1, 197, -1, 85, 110, 198, 111, + -1, 110, 198, 111, -1, 197, 110, 198, 111, -1, + 107, -1, 199, -1, 199, 113, 107, -1, 199, 113, + 107, 113, 199, -1, 200, -1, 22, 101, 200, -1, + 199, 192, 200, -1, 199, 193, 200, -1, 200, 194, + 200, -1, 203, 110, 198, 111, -1, 110, 198, 111, + -1, 204, -1, 205, -1, 204, 202, 204, -1, 66, + 202, 204, -1, 204, 202, 65, -1, 66, 202, 65, + -1, 211, -1, 206, -1, -1, 36, 30, 108, 201, + 187, -1, 106, -1, 106, 119, -1, 119, 106, -1, + 119, 106, 119, -1, 85, -1, 51, -1, 50, -1, + 91, -1, 223, -1, 186, -1, 232, -1, 229, -1, + 100, 34, 197, -1, 100, 35, 108, 207, 109, -1, + 208, -1, 207, 113, 208, -1, 107, -1, 232, 195, + 209, -1, -1, 210, -1, 78, -1, 20, -1, 74, + -1, 212, -1, 213, -1, 108, 229, 109, -1, 212, + 108, 214, 109, -1, 215, -1, 214, 113, 215, -1, + 120, 216, -1, 120, 118, 216, -1, 232, -1, 216, + 118, 232, -1, -1, 218, -1, 74, -1, 38, 182, + -1, 108, 109, -1, 108, 220, 109, -1, 221, -1, + 220, 113, 221, -1, 232, -1, 232, 110, 222, 111, + -1, 232, 110, 185, 111, -1, 222, -1, 107, -1, + 10, -1, 11, -1, 222, -1, 12, -1, -1, 225, + -1, 226, 228, -1, 115, 227, 10, 116, -1, -1, + 94, -1, 24, -1, 80, -1, -1, 57, -1, 46, + -1, 15, -1, 16, -1, 16, -1, -1, 232, -1, + 9, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const unsigned short yyrline[] = { - 0, 326, 326, 332, 338, 354, 379, 381, 384, 388, - 393, 400, 408, 413, 417, 426, 428, 436, 440, 448, - 452, 455, 458, 462, 482, 484, 492, 496, 528, 532, - 541, 548, 561, 569, 568, 582, 594, 605, 610, 616, - 622, 624, 627, 638, 644, 650, 657, 663, 671, 675, - 678, 685, 691, 697, 704, 710, 719, 721, 731, 745, - 755, 771, 781, 797, 803, 810, 820, 830, 835, 842, - 849, 857, 867, 873, 879, 883, 891, 902, 924, 926, - 928, 934, 940, 948, 954, 961, 966, 972, 978, 984, - 987, 993, 1003, 1005, 1008, 1016, 1023, 1036, 1047, 1057, - 1068, 1078, 1089, 1100, 1102, 1109, 1107, 1116, 1121, 1127, - 1132, 1135, 1139, 1144, 1153, 1162, 1173, 1195, 1202, 1221, - 1225, 1231, 1237, 1243, 1253, 1263, 1269, 1280, 1294, 1303, - 1313, 1323, 1333, 1341, 1362, 1371, 1380, 1382, 1389, 1396, - 1402, 1406, 1412, 1432, 1442, 1444, 1445, 1452, 1452, 1457, - 1464, 1470, 1475, 1479, 1483, 1486, 1491, 1503, 1520, 1525, - 1530, 1563, 1573, 1587, 1589, 1590, 1591, 1592, 1593, 1594, - 1595, 1596, 1597, 1598, 1599, 1600, 1606, 1608, 1609, 1612, - 1619, 1631, 1633, 1637, 1641, 1642, 1643, 1644, 1645, 1649, - 1650, 1651, 1652, 1656, 1657, 1664, 1664, 1665, 1665, 1666, - 1668, 1670, 1675, 1679, 1688, 1692, 1697, 1702, 1705, 1711, - 1721, 1725, 1728, 1731, 1734, 1739, 1748, 1756, 1762, 1768, - 1775, 1783, 1791, 1800, 1803, 1807, 1806, 1817, 1819, 1820, - 1821, 1824, 1828, 1833, 1839, 1844, 1845, 1846, 1859, 1873, - 1877, 1882, 1886, 1891, 1898, 1911, 1913, 1916, 1920, 1923, - 1928, 1932, 1940, 1955, 1961, 1968, 1981, 1993, 2008, 2012, - 2029, 2034, 2037, 2042, 2064, 2069, 2074, 2080, 2086, 2094, - 2102, 2110, 2117, 2127, 2132, 2138, 2140, 2170, 2172, 2175, - 2182, 2188, 2190, 2191, 2192, 2195, 2197, 2198, 2201, 2206, - 2213, 2220, 2222, 2227 + 0, 342, 342, 348, 354, 370, 395, 397, 400, 404, + 409, 416, 424, 429, 433, 442, 444, 452, 456, 464, + 468, 471, 474, 478, 498, 500, 508, 517, 521, 536, + 544, 557, 565, 564, 578, 590, 592, 594, 605, 610, + 616, 622, 624, 627, 638, 644, 650, 657, 663, 672, + 674, 685, 689, 692, 699, 705, 711, 718, 724, 733, + 735, 745, 759, 769, 785, 795, 811, 817, 824, 834, + 844, 849, 856, 863, 871, 881, 887, 893, 897, 905, + 916, 938, 940, 942, 948, 954, 962, 968, 975, 980, + 986, 992, 998, 1001, 1007, 1017, 1019, 1022, 1030, 1037, + 1050, 1061, 1071, 1082, 1092, 1103, 1114, 1116, 1123, 1121, + 1130, 1135, 1141, 1146, 1149, 1153, 1158, 1167, 1176, 1187, + 1209, 1216, 1235, 1239, 1245, 1251, 1257, 1267, 1277, 1283, + 1294, 1308, 1317, 1327, 1337, 1347, 1355, 1376, 1385, 1394, + 1396, 1403, 1410, 1416, 1420, 1426, 1446, 1456, 1458, 1459, + 1466, 1466, 1471, 1478, 1484, 1489, 1493, 1497, 1500, 1505, + 1517, 1534, 1539, 1544, 1577, 1587, 1601, 1603, 1604, 1605, + 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1620, + 1622, 1623, 1626, 1633, 1645, 1647, 1651, 1655, 1656, 1657, + 1658, 1659, 1663, 1664, 1665, 1666, 1670, 1671, 1678, 1678, + 1679, 1679, 1680, 1682, 1684, 1689, 1693, 1702, 1706, 1711, + 1716, 1719, 1725, 1735, 1739, 1742, 1745, 1748, 1753, 1762, + 1770, 1776, 1782, 1789, 1797, 1805, 1814, 1817, 1821, 1820, + 1831, 1833, 1834, 1835, 1838, 1842, 1847, 1853, 1858, 1859, + 1860, 1873, 1887, 1891, 1896, 1900, 1905, 1912, 1925, 1927, + 1930, 1934, 1937, 1942, 1946, 1954, 1969, 1975, 1982, 1995, + 2007, 2022, 2026, 2043, 2048, 2051, 2056, 2078, 2083, 2088, + 2094, 2100, 2108, 2116, 2124, 2131, 2141, 2146, 2152, 2154, + 2184, 2186, 2189, 2196, 2202, 2204, 2205, 2206, 2209, 2211, + 2212, 2215, 2220, 2227, 2234, 2236, 2241 }; #endif @@ -761,29 +775,29 @@ static const char *const yytname[] = "TOK_EXCEPT", "'^'", "TOK_INTERSECTION", "'|'", "TOK_UNION", "TOK_TwoDots", "TOK_ThreeDots", "'{'", "'}'", "'('", "')'", "';'", "','", "':'", "'['", "']'", "'!'", "'.'", "'<'", "'@'", "$accept", - "ParsedGrammar", "ModuleList", "ModuleSpecification", + "ParsedGrammar", "ModuleList", "ModuleDefinition", "optObjectIdentifier", "ObjectIdentifier", "ObjectIdentifierBody", - "ObjectIdentifierElement", "optModuleSpecificationFlags", - "ModuleSpecificationFlags", "ModuleSpecificationFlag", - "optModuleSpecificationBody", "ModuleSpecificationBody", - "ModuleSpecificationElement", "@1", "ImportsDefinition", - "ImportsBundleSet", "AssignedIdentifier", "ImportsBundle", - "ImportsList", "ImportsElement", "ExportsDefinition", "ExportsBody", - "ExportsElement", "ValueSet", "ValueSetTypeAssignment", "DefinedType", - "DataTypeReference", "ParameterArgumentList", "ParameterArgumentName", - "ActualParameterList", "ActualParameter", "optComponentTypeLists", - "ComponentTypeLists", "ComponentType", "AlternativeTypeLists", - "AlternativeType", "ObjectClass", "optUnique", "FieldSpec", - "ClassField", "optWithSyntax", "WithSyntax", "@2", "WithSyntaxList", - "WithSyntaxToken", "ExtensionAndException", "Type", - "NSTD_IndirectMarker", "TypeDeclaration", "TypeDeclarationSet", - "ComplexTypeReference", "ComplexTypeReferenceAmpList", - "ComplexTypeReferenceElement", "PrimitiveFieldReference", "FieldName", - "DefinedObjectClass", "ValueDefinition", "Value", "@3", "SimpleValue", - "DefinedValue", "RestrictedCharacterStringValue", "Opaque", - "BasicTypeId", "BasicTypeId_UniverationCompatible", "BasicType", - "BasicString", "Union", "Intersection", "Except", "optConstraints", - "Constraints", "SetOfConstraints", "ElementSetSpecs", "ElementSetSpec", + "ObjectIdentifierElement", "optModuleDefinitionFlags", + "ModuleDefinitionFlags", "ModuleDefinitionFlag", "optModuleBody", + "ModuleBody", "AssignmentList", "Assignment", "@1", "optImports", + "ImportsDefinition", "ImportsBundleSet", "AssignedIdentifier", + "ImportsBundle", "ImportsList", "ImportsElement", "optExports", + "ExportsDefinition", "ExportsBody", "ExportsElement", "ValueSet", + "ValueSetTypeAssignment", "DefinedType", "DataTypeReference", + "ParameterArgumentList", "ParameterArgumentName", "ActualParameterList", + "ActualParameter", "optComponentTypeLists", "ComponentTypeLists", + "ComponentType", "AlternativeTypeLists", "AlternativeType", + "ObjectClass", "optUnique", "FieldSpec", "ClassField", "optWithSyntax", + "WithSyntax", "@2", "WithSyntaxList", "WithSyntaxToken", + "ExtensionAndException", "Type", "NSTD_IndirectMarker", + "TypeDeclaration", "TypeDeclarationSet", "ComplexTypeReference", + "ComplexTypeReferenceAmpList", "ComplexTypeReferenceElement", + "PrimitiveFieldReference", "FieldName", "DefinedObjectClass", + "ValueDefinition", "Value", "@3", "SimpleValue", "DefinedValue", + "RestrictedCharacterStringValue", "Opaque", "BasicTypeId", + "BasicTypeId_UniverationCompatible", "BasicType", "BasicString", + "Union", "Intersection", "Except", "optConstraints", "Constraints", + "SetOfConstraints", "ElementSetSpecs", "ElementSetSpec", "ConstraintSubtypeElement", "@4", "ConstraintRangeSpec", "ConstraintSpec", "SingleValue", "ContainedSubtype", "InnerTypeConstraint", "WithComponentsList", "WithComponentsElement", @@ -823,34 +837,34 @@ static const unsigned char yyr1[] = { 0, 121, 122, 123, 123, 124, 125, 125, 126, 126, 127, 127, 128, 128, 128, 129, 129, 130, 130, 131, - 131, 131, 131, 131, 132, 132, 133, 133, 134, 134, - 134, 134, 134, 135, 134, 134, 136, 136, 137, 137, - 138, 138, 139, 140, 140, 141, 141, 141, 142, 142, - 142, 143, 143, 144, 144, 144, 145, 146, 147, 147, - 147, 148, 148, 148, 148, 149, 149, 150, 150, 150, - 150, 150, 151, 151, 152, 152, 152, 152, 153, 153, - 154, 154, 155, 155, 155, 155, 156, 156, 157, 157, - 157, 158, 159, 159, 160, 160, 161, 161, 161, 161, - 161, 161, 161, 162, 162, 164, 163, 165, 165, 166, - 166, 166, 166, 167, 167, 167, 168, 169, 170, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 172, 172, - 172, 172, 172, 172, 173, 173, 174, 175, 175, 176, - 176, 176, 177, 178, 179, 179, 179, 180, 179, 179, - 181, 181, 181, 181, 181, 181, 182, 182, 183, 183, - 183, 184, 184, 185, 185, 185, 185, 185, 185, 185, - 185, 185, 185, 185, 185, 185, 186, 186, 186, 187, - 187, 188, 188, 188, 188, 188, 188, 188, 188, 188, - 188, 188, 188, 188, 188, 189, 189, 190, 190, 191, - 192, 192, 193, 193, 194, 194, 195, 195, 195, 195, - 196, 196, 196, 196, 196, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 198, 197, 199, 199, 199, - 199, 200, 200, 201, 201, 201, 201, 201, 202, 203, - 203, 204, 204, 205, 205, 206, 206, 207, 207, 207, - 208, 208, 209, 210, 211, 211, 212, 212, 213, 213, - 214, 214, 215, 215, 216, 216, 217, 217, 218, 218, - 218, 218, 218, 219, 219, 220, 220, 221, 221, 222, - 223, 224, 224, 224, 224, 225, 225, 225, 226, 226, - 227, 228, 228, 229 + 131, 131, 131, 131, 132, 132, 133, 134, 134, 135, + 135, 135, 136, 135, 135, 137, 137, 138, 138, 139, + 139, 140, 140, 141, 142, 142, 143, 143, 143, 144, + 144, 145, 145, 145, 146, 146, 147, 147, 147, 148, + 149, 150, 150, 150, 151, 151, 151, 151, 152, 152, + 153, 153, 153, 153, 153, 154, 154, 155, 155, 155, + 155, 156, 156, 157, 157, 158, 158, 158, 158, 159, + 159, 160, 160, 160, 161, 162, 162, 163, 163, 164, + 164, 164, 164, 164, 164, 164, 165, 165, 167, 166, + 168, 168, 169, 169, 169, 169, 170, 170, 170, 171, + 172, 173, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 175, 175, 175, 175, 175, 175, 176, 176, 177, + 178, 178, 179, 179, 179, 180, 181, 182, 182, 182, + 183, 182, 182, 184, 184, 184, 184, 184, 184, 185, + 185, 186, 186, 186, 187, 187, 188, 188, 188, 188, + 188, 188, 188, 188, 188, 188, 188, 188, 188, 189, + 189, 189, 190, 190, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 192, 192, + 193, 193, 194, 195, 195, 196, 196, 197, 197, 198, + 198, 198, 198, 199, 199, 199, 199, 199, 200, 200, + 200, 200, 200, 200, 200, 200, 200, 200, 201, 200, + 202, 202, 202, 202, 203, 203, 204, 204, 204, 204, + 204, 205, 206, 206, 207, 207, 208, 208, 209, 209, + 210, 210, 210, 211, 211, 212, 213, 214, 214, 215, + 215, 216, 216, 217, 217, 218, 218, 219, 219, 220, + 220, 221, 221, 221, 221, 221, 222, 222, 223, 223, + 224, 224, 225, 226, 227, 227, 227, 227, 228, 228, + 228, 229, 229, 230, 231, 231, 232 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -858,34 +872,34 @@ static const unsigned char yyr2[] = { 0, 2, 1, 1, 2, 8, 0, 1, 3, 2, 1, 2, 1, 4, 1, 0, 1, 1, 2, 2, - 2, 2, 2, 2, 0, 1, 1, 2, 1, 1, - 1, 1, 1, 0, 3, 1, 3, 2, 1, 2, - 0, 1, 4, 1, 3, 1, 3, 1, 3, 3, - 2, 1, 3, 1, 3, 1, 3, 4, 1, 1, - 4, 3, 3, 6, 6, 1, 3, 1, 3, 3, - 3, 3, 1, 3, 1, 1, 1, 1, 0, 1, - 1, 3, 3, 2, 3, 1, 1, 3, 2, 1, - 1, 5, 0, 1, 1, 3, 2, 4, 3, 3, - 3, 3, 3, 0, 1, 0, 6, 1, 2, 1, - 1, 1, 3, 1, 3, 3, 3, 0, 2, 1, - 4, 4, 4, 6, 6, 1, 4, 3, 1, 3, - 3, 3, 1, 3, 1, 3, 1, 1, 1, 1, - 3, 3, 1, 4, 1, 1, 3, 0, 3, 1, - 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, - 1, 1, 2, 1, 1, 1, 1, 2, 2, 1, - 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 0, 1, 3, 1, 2, 1, + 1, 1, 0, 3, 1, 0, 1, 3, 2, 1, + 2, 0, 1, 4, 1, 3, 1, 3, 1, 0, + 1, 3, 3, 2, 1, 3, 1, 3, 1, 3, + 4, 1, 1, 4, 3, 3, 6, 6, 1, 3, + 1, 3, 3, 3, 3, 1, 3, 1, 1, 1, + 1, 0, 1, 1, 3, 3, 2, 3, 1, 1, + 3, 2, 1, 1, 5, 0, 1, 1, 3, 2, + 4, 3, 3, 3, 3, 3, 0, 1, 0, 6, + 1, 2, 1, 1, 1, 3, 1, 3, 3, 3, + 0, 2, 1, 4, 4, 4, 6, 6, 1, 4, + 3, 1, 3, 3, 3, 1, 3, 1, 3, 1, + 1, 1, 1, 3, 3, 1, 4, 1, 1, 3, + 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, + 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, + 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 1, 1, 4, 3, 4, 1, 1, 3, 5, - 1, 3, 3, 3, 3, 4, 3, 1, 1, 3, - 3, 3, 3, 1, 1, 0, 5, 1, 2, 2, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 3, - 5, 1, 3, 1, 3, 0, 1, 1, 1, 1, - 1, 1, 3, 4, 1, 3, 2, 3, 1, 3, - 0, 1, 1, 2, 2, 3, 1, 3, 1, 4, - 4, 1, 1, 1, 1, 1, 1, 0, 1, 2, - 4, 0, 1, 1, 1, 0, 1, 1, 1, 1, - 1, 0, 1, 1 + 1, 1, 1, 0, 1, 1, 4, 3, 4, 1, + 1, 3, 5, 1, 3, 3, 3, 3, 4, 3, + 1, 1, 3, 3, 3, 3, 1, 1, 0, 5, + 1, 2, 2, 3, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 5, 1, 3, 1, 3, 0, 1, + 1, 1, 1, 1, 1, 3, 4, 1, 3, 2, + 3, 1, 3, 0, 1, 1, 2, 2, 3, 1, + 3, 1, 4, 4, 1, 1, 1, 1, 1, 1, + 0, 1, 2, 4, 0, 1, 1, 1, 0, 1, + 1, 1, 1, 1, 0, 1, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -893,361 +907,368 @@ static const unsigned char yyr2[] = means the default is an error. */ static const unsigned short yydefact[] = { - 0, 288, 289, 0, 2, 3, 6, 1, 4, 0, - 0, 7, 293, 14, 9, 0, 10, 12, 15, 8, + 0, 291, 292, 0, 2, 3, 6, 1, 4, 0, + 0, 7, 296, 14, 9, 0, 10, 12, 15, 8, 11, 0, 0, 0, 0, 0, 0, 0, 16, 17, - 0, 23, 21, 19, 22, 20, 0, 18, 13, 24, - 181, 0, 0, 182, 183, 184, 0, 185, 186, 194, - 187, 188, 189, 190, 191, 192, 193, 0, 25, 26, - 28, 29, 32, 30, 31, 35, 0, 0, 33, 0, - 50, 0, 51, 53, 55, 37, 0, 38, 0, 43, - 45, 47, 5, 27, 277, 128, 290, 0, 163, 0, - 0, 177, 170, 174, 176, 164, 0, 0, 165, 169, - 173, 0, 0, 59, 179, 166, 58, 175, 132, 0, - 34, 49, 48, 0, 0, 36, 39, 0, 0, 0, - 0, 281, 62, 61, 117, 278, 285, 0, 178, 172, - 171, 168, 167, 0, 65, 0, 166, 67, 0, 277, - 0, 180, 0, 0, 52, 54, 40, 44, 46, 0, - 283, 284, 282, 0, 0, 200, 287, 286, 279, 129, - 131, 0, 0, 0, 0, 0, 57, 152, 158, 153, - 273, 274, 159, 160, 150, 151, 77, 0, 72, 74, - 75, 154, 155, 76, 272, 264, 0, 266, 271, 268, - 137, 138, 133, 134, 136, 130, 149, 147, 143, 144, - 145, 0, 156, 41, 42, 277, 277, 0, 94, 0, - 125, 0, 0, 200, 200, 119, 118, 0, 0, 116, - 201, 202, 277, 66, 71, 70, 69, 68, 276, 0, - 0, 233, 232, 0, 231, 234, 0, 206, 0, 0, - 236, 0, 207, 210, 0, 217, 218, 224, 223, 250, - 251, 275, 235, 238, 237, 60, 277, 265, 0, 0, - 0, 0, 0, 0, 142, 139, 0, 262, 260, 260, - 260, 96, 261, 92, 260, 260, 103, 0, 280, 0, - 277, 0, 277, 0, 277, 0, 0, 0, 0, 64, - 63, 0, 0, 227, 0, 0, 0, 0, 0, 0, - 56, 197, 198, 195, 196, 0, 0, 0, 199, 0, - 0, 0, 0, 73, 267, 0, 0, 156, 135, 161, - 148, 157, 146, 263, 101, 0, 100, 102, 93, 260, - 98, 99, 0, 91, 104, 95, 0, 113, 0, 86, - 89, 90, 277, 127, 0, 0, 79, 80, 85, 260, - 277, 291, 0, 291, 0, 204, 0, 211, 225, 228, - 229, 222, 220, 239, 0, 252, 216, 208, 212, 213, - 214, 0, 221, 219, 0, 0, 254, 270, 269, 162, - 140, 141, 97, 0, 126, 0, 120, 277, 88, 277, - 121, 277, 83, 260, 277, 292, 122, 277, 203, 205, - 0, 230, 243, 0, 241, 200, 0, 215, 0, 256, - 258, 253, 0, 105, 114, 115, 87, 84, 81, 82, - 117, 117, 226, 240, 0, 245, 209, 257, 0, 255, - 0, 123, 124, 242, 248, 249, 247, 244, 246, 259, - 109, 110, 0, 0, 107, 111, 0, 106, 108, 112 + 0, 23, 21, 19, 22, 20, 0, 18, 13, 49, + 0, 0, 25, 35, 50, 0, 53, 0, 54, 56, + 58, 5, 0, 0, 36, 52, 51, 0, 0, 38, + 0, 39, 0, 44, 46, 48, 184, 0, 185, 186, + 187, 188, 189, 197, 190, 191, 192, 193, 194, 195, + 196, 26, 27, 31, 29, 30, 34, 0, 0, 55, + 57, 37, 40, 0, 0, 0, 32, 28, 280, 131, + 293, 0, 166, 0, 0, 180, 173, 177, 179, 167, + 0, 0, 168, 172, 176, 0, 0, 62, 182, 169, + 61, 178, 135, 0, 41, 45, 47, 33, 0, 284, + 65, 64, 120, 281, 288, 0, 181, 175, 174, 171, + 170, 0, 68, 0, 169, 70, 0, 280, 0, 183, + 0, 0, 42, 43, 0, 286, 287, 285, 0, 0, + 203, 290, 289, 282, 132, 134, 0, 0, 0, 0, + 0, 60, 155, 161, 156, 276, 277, 162, 163, 153, + 154, 80, 0, 75, 77, 78, 157, 158, 79, 275, + 267, 0, 269, 274, 271, 140, 141, 136, 137, 139, + 133, 152, 150, 146, 147, 148, 0, 159, 280, 280, + 0, 97, 0, 128, 0, 0, 203, 203, 122, 121, + 0, 0, 119, 204, 205, 280, 69, 74, 73, 72, + 71, 279, 0, 0, 236, 235, 0, 234, 237, 0, + 209, 0, 0, 239, 0, 210, 213, 0, 220, 221, + 227, 226, 253, 254, 278, 238, 241, 240, 63, 280, + 268, 0, 0, 0, 0, 0, 0, 145, 142, 0, + 265, 263, 263, 263, 99, 264, 95, 263, 263, 106, + 0, 283, 0, 280, 0, 280, 0, 280, 0, 0, + 0, 0, 67, 66, 0, 0, 230, 0, 0, 0, + 0, 0, 0, 59, 200, 201, 198, 199, 0, 0, + 0, 202, 0, 0, 0, 0, 76, 270, 0, 0, + 159, 138, 164, 151, 160, 149, 266, 104, 0, 103, + 105, 96, 263, 101, 102, 0, 94, 107, 98, 0, + 116, 0, 89, 92, 93, 280, 130, 0, 0, 82, + 83, 88, 263, 280, 294, 0, 294, 0, 207, 0, + 214, 228, 231, 232, 225, 223, 242, 0, 255, 219, + 211, 215, 216, 217, 0, 224, 222, 0, 0, 257, + 273, 272, 165, 143, 144, 100, 0, 129, 0, 123, + 280, 91, 280, 124, 280, 86, 263, 280, 295, 125, + 280, 206, 208, 0, 233, 246, 0, 244, 203, 0, + 218, 0, 259, 261, 256, 0, 108, 117, 118, 90, + 87, 84, 85, 120, 120, 229, 243, 0, 248, 212, + 260, 0, 258, 0, 126, 127, 245, 251, 252, 250, + 247, 249, 262, 112, 113, 0, 0, 110, 114, 0, + 109, 111, 115 }; /* YYDEFGOTO[NTERM-NUM]. */ static const short yydefgoto[] = { -1, 3, 4, 5, 10, 11, 15, 16, 27, 28, - 29, 57, 58, 59, 110, 60, 76, 204, 77, 78, - 79, 61, 71, 72, 176, 62, 102, 63, 133, 134, - 177, 178, 345, 346, 347, 338, 339, 122, 329, 207, - 208, 333, 334, 430, 443, 444, 348, 349, 154, 155, - 216, 103, 192, 193, 445, 269, 270, 64, 198, 261, - 199, 200, 240, 320, 104, 105, 106, 107, 306, 307, - 309, 219, 220, 221, 241, 242, 243, 400, 295, 244, - 245, 246, 247, 403, 404, 437, 438, 248, 249, 250, - 375, 376, 409, 271, 272, 141, 186, 187, 251, 252, - 124, 125, 126, 153, 158, 253, 108, 394, 254 + 29, 41, 42, 81, 82, 127, 53, 54, 60, 153, + 61, 62, 63, 43, 44, 47, 48, 181, 83, 116, + 84, 141, 142, 182, 183, 348, 349, 350, 341, 342, + 130, 332, 210, 211, 336, 337, 433, 446, 447, 351, + 352, 159, 160, 219, 117, 197, 198, 448, 272, 273, + 85, 203, 264, 204, 205, 243, 323, 118, 119, 120, + 121, 309, 310, 312, 222, 223, 224, 244, 245, 246, + 403, 298, 247, 248, 249, 250, 406, 407, 440, 441, + 251, 252, 253, 378, 379, 412, 274, 275, 149, 191, + 192, 254, 255, 132, 133, 134, 158, 163, 256, 122, + 397, 257 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -291 +#define YYPACT_NINF -357 static const short yypact[] = { - 159, -291, -291, 40, 159, -291, -39, -291, -291, 5, - 47, -291, -291, -291, -291, 17, -291, -22, 252, -291, - -291, 85, 84, 51, 59, 109, 87, 190, 252, -291, - 94, -291, -291, -291, -291, -291, 194, -291, -291, 475, - -291, 256, 76, -291, -291, -291, 180, -291, -291, -291, - -291, -291, -291, -291, -291, -291, -291, 230, 475, -291, - -291, -291, -291, -291, -291, -291, 332, 628, -291, 168, - -291, 132, -291, 174, -291, -291, 16, -291, -23, -291, - 182, -291, -291, -291, 1, 177, -291, 221, -291, 225, - 242, -291, -291, -291, -291, -291, 265, 237, -291, -291, - -291, 704, 340, 248, -291, 249, -291, -291, 240, 359, - -291, -291, -291, 155, 255, -291, -291, 159, 155, 257, - 259, 26, -291, -291, -291, -291, 8, 155, -291, -291, - -291, -291, -291, -6, -291, 254, -291, 258, 261, 193, - 71, -291, 323, 202, -291, -291, -39, -291, -291, 271, - -291, -291, -291, 360, 552, -50, -291, -291, -291, -291, - -291, 368, 704, 155, 155, 212, -291, -291, -291, -291, - -291, -291, -291, -291, -291, -291, -291, 78, -291, -291, - -291, -291, -291, -291, -291, -291, 133, -291, -291, 264, - -291, -291, 262, -291, -291, -291, -291, -291, -291, -291, - -291, 270, 269, -291, -291, 77, 27, 142, -291, 263, - 335, 281, 317, 156, 184, -291, -291, 282, 212, -291, - -291, 283, 1, -291, -291, -291, -291, -291, -291, 290, - 364, -291, -291, -49, -291, -291, 291, -291, 159, 212, - -291, 288, 211, 297, 296, -49, -291, -291, -291, 299, - -291, -291, -291, -291, -291, -291, 193, -291, 91, 321, - 311, 403, 400, 202, -291, -291, 202, -291, -27, 25, - -27, -291, -291, 319, 25, -27, 310, 271, -291, 386, - 37, 318, 70, 344, 70, 345, 212, 312, 212, -291, - -291, 450, 313, 305, 320, 226, 315, 324, 325, 322, - -291, -291, -291, -291, -291, 329, 450, 450, -291, 450, - 212, 460, 330, -291, -291, 326, 327, -291, -291, -291, - 430, -291, -291, -291, -291, 328, -291, -291, -291, -27, - -291, -291, 362, -291, -291, -291, 400, 334, 147, -291, - -291, -291, 337, -291, 380, 346, 343, -291, -291, -27, - 337, 400, 349, 400, 365, -291, 366, -291, -291, -291, - 356, -291, -291, 283, 10, -291, -291, 367, -291, -291, - -291, 370, -291, -291, -5, 152, -291, -291, -291, -291, - -291, -291, -291, 371, -291, 321, -291, 37, -291, 337, - -291, 4, -291, -27, 337, -291, -291, 337, -291, -291, - 403, -291, -291, 172, -291, -50, 432, -291, 400, 369, - -291, -291, 330, -291, -291, -291, -291, -291, -291, -291, - -291, -291, 430, -291, 10, 9, 247, 369, 400, -291, - 54, -291, -291, -291, -291, -291, -291, -291, -291, -291, - -291, -291, 54, 57, -291, -291, 34, -291, -291, -291 + 83, -357, -357, 18, 83, -357, -80, -357, -357, 64, + 3, -357, -357, -357, -357, 74, -357, 2, 266, -357, + -357, 139, 100, 88, 90, 148, 142, 230, 266, -357, + 135, -357, -357, -357, -357, -357, 242, -357, -357, 127, + 53, 233, -357, 238, -357, 177, -357, 80, -357, 199, + -357, -357, 173, 256, -357, -357, -357, 213, 206, -357, + 55, -357, 8, -357, 211, -357, -357, 308, -357, -357, + -357, -357, -357, -357, -357, -357, -357, -357, -357, -357, + -357, 256, -357, -357, -357, -357, -357, 345, 641, -357, + -357, -357, -357, 83, 213, 217, -357, -357, -23, 222, + -357, 257, -357, 271, 276, -357, -357, -357, -357, -357, + 303, 281, -357, -357, -357, 717, 359, 261, -357, 262, + -357, -357, 253, 372, -80, -357, -357, -357, 269, 6, + -357, -357, -357, -357, 134, 213, -357, -357, -357, -357, + -357, 89, -357, 264, -357, 273, 272, 95, 69, -357, + 277, 205, -357, -357, 300, -357, -357, -357, 373, 565, + -61, -357, -357, -357, -357, -357, 381, 717, 213, 213, + 445, -357, -357, -357, -357, -357, -357, -357, -357, -357, + -357, -357, 92, -357, -357, -357, -357, -357, -357, -357, + -357, 114, -357, -357, 278, -357, -357, 274, -357, -357, + -357, -357, -357, -357, -357, -357, 275, 282, 72, 40, + 117, -357, 279, 351, 293, 330, 87, 99, -357, -357, + 294, 445, -357, -357, 295, -23, -357, -357, -357, -357, + -357, -357, 305, 377, -357, -357, -79, -357, -357, 287, + -357, 83, 445, -357, 301, 229, 310, 302, -79, -357, + -357, -357, 312, -357, -357, -357, -357, -357, -357, 95, + -357, 27, 270, 311, 414, 412, 205, -357, -357, 205, + -357, 116, 126, 116, -357, -357, 332, 126, 116, 323, + 300, -357, 398, 41, 334, 4, 356, 4, 357, 445, + 320, 445, -357, -357, 491, 324, 315, 331, 225, 326, + 337, 329, 328, -357, -357, -357, -357, -357, 339, 491, + 491, -357, 491, 445, 291, 327, -357, -357, 338, 340, + -357, -357, -357, 443, -357, -357, -357, -357, 346, -357, + -357, -357, 116, -357, -357, 363, -357, -357, -357, 412, + 347, 138, -357, -357, -357, 348, -357, 389, 360, 352, + -357, -357, 116, 348, 412, 362, 412, 355, -357, 369, + -357, -357, -357, 349, -357, -357, 295, 51, -357, -357, + 370, -357, -357, -357, 371, -357, -357, 10, 145, -357, + -357, -357, -357, -357, -357, -357, 376, -357, 270, -357, + 41, -357, 348, -357, 46, -357, 116, 348, -357, -357, + 348, -357, -357, 414, -357, -357, 174, -357, -61, 463, + -357, 412, 368, -357, -357, 327, -357, -357, -357, -357, + -357, -357, -357, -357, -357, 443, -357, 51, 130, 234, + 368, 412, -357, 28, -357, -357, -357, -357, -357, -357, + -357, -357, -357, -357, -357, 28, 48, -357, -357, 16, + -357, -357, -357 }; /* YYPGOTO[NTERM-NUM]. */ static const short yypgoto[] = { - -291, -291, -291, 474, -291, 339, -291, 473, -291, -291, - 461, -291, -291, 434, -291, -291, -291, -291, 417, -291, - 376, -291, -291, 382, 358, -291, -46, -291, -291, 342, - -291, 241, 215, -291, 111, -291, 118, 284, -291, -291, - 231, -291, -291, -291, 65, -290, -275, -83, -291, -67, - -291, 228, -291, 251, -133, 306, 307, -291, 33, -291, - -132, -249, -131, 114, -33, -17, -291, -3, -291, -291, - -291, -211, -291, 219, -129, 113, -77, -291, 275, -291, - -247, -291, -291, -291, 97, -291, -291, -291, -291, -291, - -291, 112, 119, -252, -291, -291, -291, 268, -98, -291, - -92, -291, -291, -291, -291, 20, -291, 178, -9 + -357, -357, -357, 483, -357, 364, -357, 474, -357, -357, + 462, -357, -357, -357, 410, -357, -357, -357, -357, -357, + 432, -357, 399, -357, -357, -357, 437, 366, -357, -62, + -357, -357, 341, -357, 250, 210, -357, 121, -357, 120, + 292, -357, -357, 236, -357, -357, -357, 73, -356, -272, + -84, -357, -58, -357, 235, -357, 258, -146, 313, 314, + -357, -21, -357, -124, -255, -122, 122, -38, -1, -357, + 34, -357, -357, -357, -214, -357, 221, -25, 115, -69, + -357, 280, -357, -207, -357, -357, -357, 104, -357, -357, + -357, -357, -357, -357, 111, 123, -256, -357, -357, -357, + 283, -139, -357, -138, -357, -357, -357, -357, 1, -357, + 176, -9 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, parse error. */ -#define YYTABLE_NINF -261 +#define YYTABLE_NINF -264 static const short yytable[] = { - 17, 123, 283, 285, 12, 340, 17, 180, 181, 194, - 315, 266, 181, 12, 12, 13, 324, 326, 327, 12, - 6, 109, 330, 331, 6, 12, 12, 13, 117, 434, - 67, 1, 2, 74, 120, 217, 65, 81, 440, 344, - 7, 182, 188, 264, 265, 182, 12, 267, 362, 67, - 150, 190, 191, 441, 156, 65, 179, 293, 440, 66, - 218, 440, 73, 266, 373, 157, 80, 81, 135, 9, - 294, 190, 191, 441, 190, 191, 441, 382, 66, 12, - 12, 170, 171, 435, 136, 12, 18, 436, 21, 287, - 118, 1, 2, 264, 265, 30, 80, 392, 69, 267, - 12, 170, 171, 161, 74, 344, 151, 162, 215, 81, - 299, 337, 340, 408, 14, 266, 121, 402, 160, 121, - 152, 137, 268, 273, 180, 181, 19, 194, 115, 135, - 183, 189, 181, 73, 202, 181, 414, 146, 80, 290, - 32, 419, 121, 325, 337, 136, 31, 159, 33, 442, - 449, 267, 121, 448, 225, 227, 448, 354, 182, 356, - 188, 316, 195, 201, 12, 182, 447, 34, 182, 442, - 1, 2, 442, 179, 1, 2, 35, 337, 184, -78, - 185, 371, 137, 224, 226, 121, -260, 255, 70, 12, - -260, 256, 121, 36, 425, 1, 2, 341, 184, 167, - 168, 169, 12, 170, 171, 38, 172, 173, 167, 168, - 169, 12, 170, 171, 357, 172, 173, 1, 2, 168, - 39, 12, 170, 171, 228, 172, 173, 1, 2, 368, - 369, 75, 370, 168, 229, 12, 170, 171, 228, 172, - 173, 217, 257, 174, 112, 113, 258, 183, 230, 189, - 317, 276, 174, 321, 202, 277, 386, 202, 298, 388, - 387, 411, 231, 232, 282, 412, 218, 393, 22, 217, - 196, 342, 68, 350, 82, 350, 231, 23, 233, 201, - 111, 423, 114, 201, 175, 424, 201, 415, 205, 206, - 119, 361, 284, 175, 218, 127, 322, 234, 24, 323, - 25, 165, 420, 235, 341, 421, 417, 128, 121, 26, - 197, 129, 236, 301, 302, 303, 304, 235, 130, 237, - 238, 131, 239, 132, 305, 296, 297, 384, 190, 191, - 12, 170, 171, 85, 86, 84, 1, 2, 1, 2, - 190, 191, 395, 138, 395, 380, 381, 85, 86, 301, - 302, 303, 304, 431, 432, 405, 139, 140, 142, 87, - 40, 88, 143, 89, 145, 410, 148, 149, 163, 165, - 209, 222, 164, 90, 259, 279, 317, 91, 342, 278, - 260, 92, 350, 263, 93, 43, 44, 45, 262, 280, - 281, 291, 286, 288, 292, 94, 47, 300, 308, 410, - 95, 48, 96, 49, 97, 201, 310, 312, 319, 12, - 332, 50, 328, 98, 99, 405, 336, 351, 353, 439, - 51, 358, 52, 355, 359, 218, 360, 53, 100, 54, - 55, 56, 364, 366, 365, 379, 367, 377, 378, 168, - 101, 12, 170, 171, 228, 172, 173, 1, 2, 383, - 374, 385, 121, 389, 229, 390, 391, 168, 396, 12, - 170, 171, 228, 172, 173, 1, 2, 168, 230, 12, - 170, 171, 228, 172, 173, 401, 398, 399, 8, 413, - 406, 407, 231, 232, 12, 203, 230, 428, 20, 37, - 1, 2, 83, 116, 147, 144, 166, 313, 233, 352, - 231, 232, 418, 40, 223, 416, 289, 446, 335, 343, - 231, 318, 274, 275, 422, 363, 233, 234, 41, 426, - 311, 433, 42, 235, 429, 372, 314, 427, 43, 44, - 45, 397, 236, 0, 46, 234, 0, 0, 0, 47, - 238, 235, 239, 0, 48, 0, 49, 0, 0, 0, - 236, 235, 0, 0, 50, 0, 0, 0, 238, 0, - 239, 0, 0, 51, 0, 52, 0, 85, 86, 0, - 53, 0, 54, 55, 56, 210, 0, 0, 0, 87, - 40, 88, 0, 89, 211, 0, 0, 0, 0, 0, - 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, - 0, 92, 0, 0, 93, 43, 44, 45, 0, 0, - 0, 0, 0, 212, 0, 94, 47, 0, 0, 0, - 95, 48, 96, 49, 97, 0, 0, 0, 0, 0, - 0, 50, 0, 98, 99, 213, 214, 0, 0, 0, - 51, 0, 52, 85, 86, 0, 0, 53, 100, 54, - 55, 56, 0, 0, 0, 87, 40, 88, 0, 89, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, - 0, 0, 0, 91, 0, 0, 0, 92, 0, 0, - 93, 43, 44, 45, 0, 0, 0, 0, 0, 0, - 0, 94, 47, 0, 0, 0, 95, 48, 96, 49, - 97, 0, 0, 0, 0, 0, 0, 50, 0, 98, - 99, 0, 0, 0, 0, 0, 51, 0, 52, 1, - 2, 0, 0, 53, 100, 54, 55, 56, 0, 0, - 0, 87, 40, 88, 0, 89, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, - 0, 0, 0, 92, 0, 0, 93, 43, 44, 45, - 0, 0, 0, 0, 0, 0, 0, 94, 47, 0, - 0, 0, 95, 48, 96, 49, 97, 0, 0, 0, - 0, 0, 0, 50, 0, 98, 99, 0, 0, 0, - 0, 0, 51, 0, 52, 0, 0, 0, 0, 53, - 100, 54, 55, 56 + 17, 6, 286, 288, 199, 6, 17, 318, 187, 193, + 128, 343, 187, 12, 131, 327, 329, 330, 7, 12, + 443, 333, 334, 185, 220, 186, 123, 296, 9, 186, + 155, 50, 443, 195, 196, 444, 12, 175, 176, 347, + 297, 49, 18, 65, 88, 195, 196, 444, 50, 221, + 12, 65, 443, 64, 87, 12, 267, 268, 49, 93, + 12, 64, 12, 184, 12, 195, 196, 444, 1, 2, + 1, 2, 88, 12, 13, 45, 385, 143, 12, 175, + 176, 347, 87, 12, 13, 65, 156, 86, 267, 268, + 451, 365, 129, 451, 124, 64, 395, 218, 1, 2, + 157, 172, 173, 174, 12, 175, 176, 376, 177, 178, + 269, 340, 21, -81, 144, 86, 145, 199, 343, 129, + 187, 94, 193, 319, 271, 276, 165, 187, 411, 143, + 187, 445, 452, 417, 189, 185, 164, 186, 188, 194, + 422, 293, 207, 445, 186, 179, 270, 186, 340, 30, + 437, 200, 206, 340, 269, 129, 129, 450, 405, 228, + 230, 129, 31, 445, 269, 46, 144, 91, 145, 227, + 229, -24, 220, 14, 40, 184, 189, 32, 190, 33, + 161, -263, 12, 19, 220, -263, 180, 129, 1, 2, + 270, 162, 56, 57, 428, 285, 290, 221, 166, 344, + 270, 258, 167, 170, 438, 259, 34, 287, 439, 221, + 129, 172, 173, 174, 12, 175, 176, 302, 177, 178, + 1, 2, 12, 260, 59, 360, 279, 261, 1, 2, + 280, 35, 173, 36, 12, 175, 176, 231, 177, 178, + 371, 372, 301, 373, 328, 325, 38, 389, 326, 418, + 188, 390, 194, 320, 414, 179, 324, 207, 415, 423, + 207, 391, 424, 206, 357, 12, 359, 206, 39, 396, + 206, 1, 2, 201, 345, 234, 353, 51, 353, 12, + 175, 176, 22, 426, 66, 1, 2, 427, 374, 55, + 364, 23, 1, 2, 195, 196, 180, 52, 173, 67, + 12, 175, 176, 231, 177, 178, 344, 58, 420, 68, + 69, 70, 24, 202, 25, 90, 238, 208, 209, 95, + 71, 299, 300, 26, 96, 72, 126, 73, 195, 196, + 387, 304, 305, 306, 307, 74, 304, 305, 306, 307, + 135, 234, 308, 136, 75, 398, 76, 398, 98, 99, + 100, 77, 138, 78, 79, 80, 375, 137, 408, 139, + 99, 100, 146, 383, 384, 434, 435, 140, 413, 147, + 148, 150, 101, 66, 102, 151, 103, 154, 168, 320, + 170, 345, 238, 212, 225, 353, 104, 169, 262, 206, + 105, 282, 263, 265, 106, 281, 266, 107, 68, 69, + 70, 283, 413, 284, 289, 291, 294, 295, 108, 71, + 303, 311, 313, 109, 72, 110, 73, 111, 408, 322, + 315, 12, 442, 335, 74, 331, 112, 113, 339, 354, + 356, 358, 361, 75, 362, 76, 221, 363, 368, 369, + 77, 114, 78, 79, 80, 367, 370, 377, 382, 380, + 386, 381, 173, 115, 12, 175, 176, 231, 177, 178, + 1, 2, 392, 129, 388, 394, 401, 232, 404, 393, + 173, 399, 12, 175, 176, 231, 177, 178, 1, 2, + 402, 233, 410, 409, 416, 232, 431, 8, 152, 20, + 37, 97, 92, 125, 89, 234, 235, 355, 173, 233, + 12, 175, 176, 231, 177, 178, 1, 2, 226, 316, + 419, 236, 171, 234, 235, 421, 338, 292, 449, 346, + 366, 321, 277, 278, 429, 425, 432, 233, 314, 236, + 237, 436, 400, 0, 430, 0, 238, 0, 0, 0, + 0, 234, 235, 0, 317, 239, 0, 0, 237, 0, + 0, 0, 240, 241, 238, 242, 0, 236, 0, 0, + 0, 0, 0, 239, 0, 0, 0, 0, 0, 0, + 0, 241, 0, 242, 0, 0, 237, 0, 0, 0, + 99, 100, 238, 0, 0, 0, 0, 0, 213, 0, + 0, 239, 101, 66, 102, 0, 103, 214, 0, 241, + 0, 242, 0, 0, 0, 0, 104, 0, 0, 0, + 105, 0, 0, 0, 106, 0, 0, 107, 68, 69, + 70, 0, 0, 0, 0, 0, 215, 0, 108, 71, + 0, 0, 0, 109, 72, 110, 73, 111, 0, 0, + 0, 0, 0, 0, 74, 0, 112, 113, 216, 217, + 0, 0, 0, 75, 0, 76, 99, 100, 0, 0, + 77, 114, 78, 79, 80, 0, 0, 0, 101, 66, + 102, 0, 103, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 104, 0, 0, 0, 105, 0, 0, 0, + 106, 0, 0, 107, 68, 69, 70, 0, 0, 0, + 0, 0, 0, 0, 108, 71, 0, 0, 0, 109, + 72, 110, 73, 111, 0, 0, 0, 0, 0, 0, + 74, 0, 112, 113, 0, 0, 0, 0, 0, 75, + 0, 76, 1, 2, 0, 0, 77, 114, 78, 79, + 80, 0, 0, 0, 101, 66, 102, 0, 103, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, + 0, 0, 105, 0, 0, 0, 106, 0, 0, 107, + 68, 69, 70, 0, 0, 0, 0, 0, 0, 0, + 108, 71, 0, 0, 0, 109, 72, 110, 73, 111, + 0, 0, 0, 0, 0, 0, 74, 0, 112, 113, + 0, 0, 0, 0, 0, 75, 0, 76, 0, 0, + 0, 0, 77, 114, 78, 79, 80 }; static const short yycheck[] = { - 9, 84, 213, 214, 9, 280, 15, 139, 139, 142, - 259, 38, 143, 9, 9, 10, 268, 269, 270, 9, - 0, 67, 274, 275, 4, 9, 9, 10, 51, 20, - 39, 15, 16, 42, 33, 85, 39, 46, 4, 35, - 0, 139, 140, 16, 17, 143, 9, 74, 295, 58, - 24, 17, 18, 19, 46, 58, 139, 106, 4, 39, - 110, 4, 42, 38, 311, 57, 46, 76, 101, 108, - 119, 17, 18, 19, 17, 18, 19, 329, 58, 9, - 9, 10, 11, 74, 101, 9, 39, 78, 110, 218, - 113, 15, 16, 16, 17, 10, 76, 349, 22, 74, - 9, 10, 11, 109, 113, 35, 80, 113, 154, 118, - 239, 107, 387, 118, 109, 38, 115, 107, 127, 115, - 94, 101, 205, 206, 256, 256, 109, 260, 112, 162, - 139, 140, 263, 113, 143, 266, 385, 117, 118, 222, - 89, 393, 115, 118, 107, 162, 62, 127, 89, 115, - 116, 74, 115, 443, 163, 164, 446, 286, 256, 288, - 258, 259, 142, 143, 9, 263, 109, 58, 266, 115, - 15, 16, 115, 256, 15, 16, 89, 107, 107, 109, - 109, 310, 162, 163, 164, 115, 109, 109, 112, 9, - 113, 113, 115, 3, 405, 15, 16, 280, 107, 6, - 7, 8, 9, 10, 11, 111, 13, 14, 6, 7, - 8, 9, 10, 11, 291, 13, 14, 15, 16, 7, - 26, 9, 10, 11, 12, 13, 14, 15, 16, 306, - 307, 51, 309, 7, 22, 9, 10, 11, 12, 13, - 14, 85, 109, 50, 112, 113, 113, 256, 36, 258, - 259, 109, 50, 262, 263, 113, 109, 266, 238, 342, - 113, 109, 50, 51, 108, 113, 110, 350, 16, 85, - 68, 280, 16, 282, 44, 284, 50, 25, 66, 259, - 112, 109, 108, 263, 91, 113, 266, 385, 17, 18, - 108, 65, 108, 91, 110, 118, 263, 85, 46, 266, - 48, 108, 394, 91, 387, 397, 389, 86, 115, 57, - 108, 86, 100, 102, 103, 104, 105, 91, 76, 107, - 108, 56, 110, 86, 113, 34, 35, 336, 17, 18, - 9, 10, 11, 15, 16, 3, 15, 16, 15, 16, - 17, 18, 351, 3, 353, 17, 18, 15, 16, 102, - 103, 104, 105, 420, 421, 364, 108, 108, 118, 27, - 28, 29, 3, 31, 109, 374, 109, 108, 114, 108, - 10, 3, 114, 41, 110, 40, 385, 45, 387, 116, - 118, 49, 391, 114, 52, 53, 54, 55, 118, 108, - 73, 101, 110, 110, 30, 63, 64, 109, 101, 408, - 68, 69, 70, 71, 72, 385, 110, 108, 5, 9, - 100, 79, 93, 81, 82, 424, 30, 73, 73, 428, - 88, 108, 90, 111, 119, 110, 106, 95, 96, 97, - 98, 99, 108, 111, 109, 5, 107, 111, 111, 7, - 108, 9, 10, 11, 12, 13, 14, 15, 16, 87, - 120, 117, 115, 73, 22, 109, 113, 7, 109, 9, - 10, 11, 12, 13, 14, 15, 16, 7, 36, 9, - 10, 11, 12, 13, 14, 119, 111, 111, 4, 108, - 113, 111, 50, 51, 9, 146, 36, 118, 15, 28, - 15, 16, 58, 76, 118, 113, 138, 256, 66, 284, - 50, 51, 391, 28, 162, 387, 222, 442, 277, 281, - 50, 260, 206, 206, 400, 296, 66, 85, 43, 406, - 245, 424, 47, 91, 412, 65, 258, 408, 53, 54, - 55, 353, 100, -1, 59, 85, -1, -1, -1, 64, - 108, 91, 110, -1, 69, -1, 71, -1, -1, -1, - 100, 91, -1, -1, 79, -1, -1, -1, 108, -1, - 110, -1, -1, 88, -1, 90, -1, 15, 16, -1, - 95, -1, 97, 98, 99, 23, -1, -1, -1, 27, - 28, 29, -1, 31, 32, -1, -1, -1, -1, -1, - -1, -1, -1, 41, -1, -1, -1, 45, -1, -1, - -1, 49, -1, -1, 52, 53, 54, 55, -1, -1, - -1, -1, -1, 61, -1, 63, 64, -1, -1, -1, - 68, 69, 70, 71, 72, -1, -1, -1, -1, -1, - -1, 79, -1, 81, 82, 83, 84, -1, -1, -1, - 88, -1, 90, 15, 16, -1, -1, 95, 96, 97, - 98, 99, -1, -1, -1, 27, 28, 29, -1, 31, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 41, - -1, -1, -1, 45, -1, -1, -1, 49, -1, -1, - 52, 53, 54, 55, -1, -1, -1, -1, -1, -1, - -1, 63, 64, -1, -1, -1, 68, 69, 70, 71, - 72, -1, -1, -1, -1, -1, -1, 79, -1, 81, - 82, -1, -1, -1, -1, -1, 88, -1, 90, 15, - 16, -1, -1, 95, 96, 97, 98, 99, -1, -1, - -1, 27, 28, 29, -1, 31, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 41, -1, -1, -1, 45, - -1, -1, -1, 49, -1, -1, 52, 53, 54, 55, - -1, -1, -1, -1, -1, -1, -1, 63, 64, -1, - -1, -1, 68, 69, 70, 71, 72, -1, -1, -1, - -1, -1, -1, 79, -1, 81, 82, -1, -1, -1, - -1, -1, 88, -1, 90, -1, -1, -1, -1, 95, - 96, 97, 98, 99 + 9, 0, 216, 217, 150, 4, 15, 262, 147, 148, + 33, 283, 151, 9, 98, 271, 272, 273, 0, 9, + 4, 277, 278, 147, 85, 147, 88, 106, 108, 151, + 24, 40, 4, 17, 18, 19, 9, 10, 11, 35, + 119, 40, 39, 52, 53, 17, 18, 19, 57, 110, + 9, 60, 4, 52, 53, 9, 16, 17, 57, 51, + 9, 60, 9, 147, 9, 17, 18, 19, 15, 16, + 15, 16, 81, 9, 10, 22, 332, 115, 9, 10, + 11, 35, 81, 9, 10, 94, 80, 53, 16, 17, + 446, 298, 115, 449, 93, 94, 352, 159, 15, 16, + 94, 6, 7, 8, 9, 10, 11, 314, 13, 14, + 38, 107, 110, 109, 115, 81, 115, 263, 390, 115, + 259, 113, 261, 262, 208, 209, 135, 266, 118, 167, + 269, 115, 116, 388, 107, 259, 135, 259, 147, 148, + 396, 225, 151, 115, 266, 50, 74, 269, 107, 10, + 20, 150, 151, 107, 38, 115, 115, 109, 107, 168, + 169, 115, 62, 115, 38, 112, 167, 112, 167, 168, + 169, 44, 85, 109, 47, 259, 107, 89, 109, 89, + 46, 109, 9, 109, 85, 113, 91, 115, 15, 16, + 74, 57, 112, 113, 408, 108, 221, 110, 109, 283, + 74, 109, 113, 108, 74, 113, 58, 108, 78, 110, + 115, 6, 7, 8, 9, 10, 11, 242, 13, 14, + 15, 16, 9, 109, 51, 294, 109, 113, 15, 16, + 113, 89, 7, 3, 9, 10, 11, 12, 13, 14, + 309, 310, 241, 312, 118, 266, 111, 109, 269, 388, + 259, 113, 261, 262, 109, 50, 265, 266, 113, 397, + 269, 345, 400, 262, 289, 9, 291, 266, 26, 353, + 269, 15, 16, 68, 283, 50, 285, 44, 287, 9, + 10, 11, 16, 109, 28, 15, 16, 113, 313, 112, + 65, 25, 15, 16, 17, 18, 91, 59, 7, 43, + 9, 10, 11, 12, 13, 14, 390, 108, 392, 53, + 54, 55, 46, 108, 48, 109, 91, 17, 18, 108, + 64, 34, 35, 57, 16, 69, 109, 71, 17, 18, + 339, 102, 103, 104, 105, 79, 102, 103, 104, 105, + 118, 50, 113, 86, 88, 354, 90, 356, 3, 15, + 16, 95, 76, 97, 98, 99, 65, 86, 367, 56, + 15, 16, 3, 17, 18, 423, 424, 86, 377, 108, + 108, 118, 27, 28, 29, 3, 31, 108, 114, 388, + 108, 390, 91, 10, 3, 394, 41, 114, 110, 388, + 45, 40, 118, 118, 49, 116, 114, 52, 53, 54, + 55, 108, 411, 73, 110, 110, 101, 30, 63, 64, + 109, 101, 110, 68, 69, 70, 71, 72, 427, 5, + 108, 9, 431, 100, 79, 93, 81, 82, 30, 73, + 73, 111, 108, 88, 119, 90, 110, 106, 109, 111, + 95, 96, 97, 98, 99, 108, 107, 120, 5, 111, + 87, 111, 7, 108, 9, 10, 11, 12, 13, 14, + 15, 16, 73, 115, 117, 113, 111, 22, 119, 109, + 7, 109, 9, 10, 11, 12, 13, 14, 15, 16, + 111, 36, 111, 113, 108, 22, 118, 4, 124, 15, + 28, 81, 60, 94, 57, 50, 51, 287, 7, 36, + 9, 10, 11, 12, 13, 14, 15, 16, 167, 259, + 390, 66, 146, 50, 51, 394, 280, 225, 445, 284, + 299, 263, 209, 209, 409, 403, 415, 36, 248, 66, + 85, 427, 356, -1, 411, -1, 91, -1, -1, -1, + -1, 50, 51, -1, 261, 100, -1, -1, 85, -1, + -1, -1, 107, 108, 91, 110, -1, 66, -1, -1, + -1, -1, -1, 100, -1, -1, -1, -1, -1, -1, + -1, 108, -1, 110, -1, -1, 85, -1, -1, -1, + 15, 16, 91, -1, -1, -1, -1, -1, 23, -1, + -1, 100, 27, 28, 29, -1, 31, 32, -1, 108, + -1, 110, -1, -1, -1, -1, 41, -1, -1, -1, + 45, -1, -1, -1, 49, -1, -1, 52, 53, 54, + 55, -1, -1, -1, -1, -1, 61, -1, 63, 64, + -1, -1, -1, 68, 69, 70, 71, 72, -1, -1, + -1, -1, -1, -1, 79, -1, 81, 82, 83, 84, + -1, -1, -1, 88, -1, 90, 15, 16, -1, -1, + 95, 96, 97, 98, 99, -1, -1, -1, 27, 28, + 29, -1, 31, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 41, -1, -1, -1, 45, -1, -1, -1, + 49, -1, -1, 52, 53, 54, 55, -1, -1, -1, + -1, -1, -1, -1, 63, 64, -1, -1, -1, 68, + 69, 70, 71, 72, -1, -1, -1, -1, -1, -1, + 79, -1, 81, 82, -1, -1, -1, -1, -1, 88, + -1, 90, 15, 16, -1, -1, 95, 96, 97, 98, + 99, -1, -1, -1, 27, 28, 29, -1, 31, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 41, -1, + -1, -1, 45, -1, -1, -1, 49, -1, -1, 52, + 53, 54, 55, -1, -1, -1, -1, -1, -1, -1, + 63, 64, -1, -1, -1, 68, 69, 70, 71, 72, + -1, -1, -1, -1, -1, -1, 79, -1, 81, 82, + -1, -1, -1, -1, -1, 88, -1, 90, -1, -1, + -1, -1, 95, 96, 97, 98, 99 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const unsigned char yystos[] = { - 0, 15, 16, 122, 123, 124, 226, 0, 124, 108, - 125, 126, 9, 10, 109, 127, 128, 229, 39, 109, + 0, 15, 16, 122, 123, 124, 229, 0, 124, 108, + 125, 126, 9, 10, 109, 127, 128, 232, 39, 109, 128, 110, 16, 25, 46, 48, 57, 129, 130, 131, 10, 62, 89, 89, 58, 89, 3, 131, 111, 26, - 28, 43, 47, 53, 54, 55, 59, 64, 69, 71, - 79, 88, 90, 95, 97, 98, 99, 132, 133, 134, - 136, 142, 146, 148, 178, 188, 226, 229, 16, 22, - 112, 143, 144, 226, 229, 51, 137, 139, 140, 141, - 226, 229, 44, 134, 3, 15, 16, 27, 29, 31, - 41, 45, 49, 52, 63, 68, 70, 72, 81, 82, - 96, 108, 147, 172, 185, 186, 187, 188, 227, 147, - 135, 112, 112, 113, 108, 112, 139, 51, 113, 108, - 33, 115, 158, 168, 221, 222, 223, 118, 86, 86, - 76, 56, 86, 149, 150, 185, 186, 226, 3, 108, - 108, 216, 118, 3, 144, 109, 226, 141, 109, 108, - 24, 80, 94, 224, 169, 170, 46, 57, 225, 226, - 229, 109, 113, 114, 114, 108, 145, 6, 7, 8, - 10, 11, 13, 14, 50, 91, 145, 151, 152, 168, - 181, 183, 219, 229, 107, 109, 217, 218, 219, 229, - 17, 18, 173, 174, 175, 226, 68, 108, 179, 181, - 182, 226, 229, 126, 138, 17, 18, 160, 161, 10, - 23, 32, 61, 83, 84, 147, 171, 85, 110, 192, - 193, 194, 3, 150, 226, 229, 226, 229, 12, 22, - 36, 50, 51, 66, 85, 91, 100, 107, 108, 110, - 183, 195, 196, 197, 200, 201, 202, 203, 208, 209, - 210, 219, 220, 226, 229, 109, 113, 109, 113, 110, - 118, 180, 118, 114, 16, 17, 38, 74, 168, 176, - 177, 214, 215, 168, 176, 177, 109, 113, 116, 40, - 108, 73, 108, 192, 108, 192, 110, 195, 110, 158, - 168, 101, 30, 106, 119, 199, 34, 35, 226, 195, - 109, 102, 103, 104, 105, 113, 189, 190, 101, 191, - 110, 199, 108, 152, 218, 182, 219, 229, 174, 5, - 184, 229, 179, 179, 214, 118, 214, 214, 93, 159, - 214, 214, 100, 162, 163, 161, 30, 107, 156, 157, - 167, 168, 229, 172, 35, 153, 154, 155, 167, 168, - 229, 73, 153, 73, 195, 111, 195, 197, 108, 119, - 106, 65, 201, 194, 108, 109, 111, 107, 197, 197, - 197, 195, 65, 201, 120, 211, 212, 111, 111, 5, - 17, 18, 214, 87, 229, 117, 109, 113, 168, 73, - 109, 113, 214, 168, 228, 229, 109, 228, 111, 111, - 198, 119, 107, 204, 205, 229, 113, 111, 118, 213, - 229, 109, 113, 108, 182, 219, 157, 168, 155, 214, - 221, 221, 184, 109, 113, 192, 196, 213, 118, 212, - 164, 170, 170, 205, 20, 74, 78, 206, 207, 229, - 4, 19, 115, 165, 166, 175, 165, 109, 166, 116 + 47, 132, 133, 144, 145, 22, 112, 146, 147, 229, + 232, 44, 59, 137, 138, 112, 112, 113, 108, 51, + 139, 141, 142, 143, 229, 232, 28, 43, 53, 54, + 55, 64, 69, 71, 79, 88, 90, 95, 97, 98, + 99, 134, 135, 149, 151, 181, 191, 229, 232, 147, + 109, 112, 141, 51, 113, 108, 16, 135, 3, 15, + 16, 27, 29, 31, 41, 45, 49, 52, 63, 68, + 70, 72, 81, 82, 96, 108, 150, 175, 188, 189, + 190, 191, 230, 150, 229, 143, 109, 136, 33, 115, + 161, 171, 224, 225, 226, 118, 86, 86, 76, 56, + 86, 152, 153, 188, 189, 229, 3, 108, 108, 219, + 118, 3, 126, 140, 108, 24, 80, 94, 227, 172, + 173, 46, 57, 228, 229, 232, 109, 113, 114, 114, + 108, 148, 6, 7, 8, 10, 11, 13, 14, 50, + 91, 148, 154, 155, 171, 184, 186, 222, 232, 107, + 109, 220, 221, 222, 232, 17, 18, 176, 177, 178, + 229, 68, 108, 182, 184, 185, 229, 232, 17, 18, + 163, 164, 10, 23, 32, 61, 83, 84, 150, 174, + 85, 110, 195, 196, 197, 3, 153, 229, 232, 229, + 232, 12, 22, 36, 50, 51, 66, 85, 91, 100, + 107, 108, 110, 186, 198, 199, 200, 203, 204, 205, + 206, 211, 212, 213, 222, 223, 229, 232, 109, 113, + 109, 113, 110, 118, 183, 118, 114, 16, 17, 38, + 74, 171, 179, 180, 217, 218, 171, 179, 180, 109, + 113, 116, 40, 108, 73, 108, 195, 108, 195, 110, + 198, 110, 161, 171, 101, 30, 106, 119, 202, 34, + 35, 229, 198, 109, 102, 103, 104, 105, 113, 192, + 193, 101, 194, 110, 202, 108, 155, 221, 185, 222, + 232, 177, 5, 187, 232, 182, 182, 217, 118, 217, + 217, 93, 162, 217, 217, 100, 165, 166, 164, 30, + 107, 159, 160, 170, 171, 232, 175, 35, 156, 157, + 158, 170, 171, 232, 73, 156, 73, 198, 111, 198, + 200, 108, 119, 106, 65, 204, 197, 108, 109, 111, + 107, 200, 200, 200, 198, 65, 204, 120, 214, 215, + 111, 111, 5, 17, 18, 217, 87, 232, 117, 109, + 113, 171, 73, 109, 113, 217, 171, 231, 232, 109, + 231, 111, 111, 201, 119, 107, 207, 208, 232, 113, + 111, 118, 216, 232, 109, 113, 108, 185, 222, 160, + 171, 158, 217, 224, 224, 187, 109, 113, 195, 199, + 216, 118, 215, 167, 173, 173, 208, 20, 74, 78, + 209, 210, 232, 4, 19, 115, 168, 169, 178, 168, + 109, 169, 116 }; #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) @@ -1798,14 +1819,14 @@ yyparse (YYPARSE_PARAM_ARG) switch (yyn) { case 2: -#line 327 "asn1p_y.y" +#line 343 "asn1p_y.y" { *(void **)param = yyvsp[0].a_grammar; } break; case 3: -#line 333 "asn1p_y.y" +#line 349 "asn1p_y.y" { yyval.a_grammar = asn1p_new(); checkmem(yyval.a_grammar); @@ -1814,7 +1835,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 4: -#line 338 "asn1p_y.y" +#line 354 "asn1p_y.y" { yyval.a_grammar = yyvsp[-1].a_grammar; TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); @@ -1822,7 +1843,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 5: -#line 359 "asn1p_y.y" +#line 375 "asn1p_y.y" { if(yyvsp[-1].a_module) { @@ -1840,31 +1861,31 @@ yyparse (YYPARSE_PARAM_ARG) break; case 6: -#line 380 "asn1p_y.y" +#line 396 "asn1p_y.y" { yyval.a_oid = 0; } break; case 7: -#line 381 "asn1p_y.y" +#line 397 "asn1p_y.y" { yyval.a_oid = yyvsp[0].a_oid; } break; case 8: -#line 385 "asn1p_y.y" +#line 401 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; } break; case 9: -#line 388 "asn1p_y.y" +#line 404 "asn1p_y.y" { yyval.a_oid = 0; } break; case 10: -#line 394 "asn1p_y.y" +#line 410 "asn1p_y.y" { yyval.a_oid = asn1p_oid_new(); asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1874,7 +1895,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 11: -#line 400 "asn1p_y.y" +#line 416 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1884,7 +1905,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 12: -#line 409 "asn1p_y.y" +#line 425 "asn1p_y.y" { /* iso */ yyval.a_oid_arc.name = yyvsp[0].tv_str; yyval.a_oid_arc.number = -1; @@ -1892,7 +1913,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 13: -#line 413 "asn1p_y.y" +#line 429 "asn1p_y.y" { /* iso(1) */ yyval.a_oid_arc.name = yyvsp[-3].tv_str; yyval.a_oid_arc.number = yyvsp[-1].a_int; @@ -1900,7 +1921,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 14: -#line 417 "asn1p_y.y" +#line 433 "asn1p_y.y" { /* 1 */ yyval.a_oid_arc.name = 0; yyval.a_oid_arc.number = yyvsp[0].a_int; @@ -1908,61 +1929,61 @@ yyparse (YYPARSE_PARAM_ARG) break; case 15: -#line 427 "asn1p_y.y" +#line 443 "asn1p_y.y" { yyval.a_module_flags = MSF_NOFLAGS; } break; case 16: -#line 428 "asn1p_y.y" +#line 444 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; } break; case 17: -#line 437 "asn1p_y.y" +#line 453 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; } break; case 18: -#line 440 "asn1p_y.y" +#line 456 "asn1p_y.y" { yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags; } break; case 19: -#line 449 "asn1p_y.y" +#line 465 "asn1p_y.y" { yyval.a_module_flags = MSF_EXPLICIT_TAGS; } break; case 20: -#line 452 "asn1p_y.y" +#line 468 "asn1p_y.y" { yyval.a_module_flags = MSF_IMPLICIT_TAGS; } break; case 21: -#line 455 "asn1p_y.y" +#line 471 "asn1p_y.y" { yyval.a_module_flags = MSF_AUTOMATIC_TAGS; } break; case 22: -#line 458 "asn1p_y.y" +#line 474 "asn1p_y.y" { yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED; } break; case 23: -#line 462 "asn1p_y.y" +#line 478 "asn1p_y.y" { /* X.680Amd1 specifies TAG and XER */ if(strcmp(yyvsp[-1].tv_str, "TAG") == 0) { @@ -1981,77 +2002,49 @@ yyparse (YYPARSE_PARAM_ARG) break; case 24: -#line 483 "asn1p_y.y" +#line 499 "asn1p_y.y" { yyval.a_module = 0; } break; case 25: -#line 484 "asn1p_y.y" +#line 500 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; } break; case 26: -#line 493 "asn1p_y.y" +#line 509 "asn1p_y.y" { - yyval.a_module = yyvsp[0].a_module; + yyval.a_module = asn1p_module_new(); + AL_IMPORT(yyval.a_module, exports, yyvsp[-2].a_module, xp_next); + AL_IMPORT(yyval.a_module, imports, yyvsp[-1].a_module, xp_next); + AL_IMPORT(yyval.a_module, members, yyvsp[0].a_module, next); } break; case 27: -#line 496 "asn1p_y.y" - { - yyval.a_module = yyvsp[-1].a_module; - - /* Behave well when one of them is skipped. */ - if(!(yyvsp[-1].a_module)) { - if(yyvsp[0].a_module) yyval.a_module = yyvsp[0].a_module; - break; - } - -#ifdef MY_IMPORT -#error MY_IMPORT DEFINED ELSEWHERE! -#endif -#define MY_IMPORT(foo,field) do { \ - while(TQ_FIRST(&(yyvsp[0].a_module->foo))) { \ - TQ_ADD(&(yyval.a_module->foo), \ - TQ_REMOVE(&(yyvsp[0].a_module->foo), field), \ - field); \ - } \ - assert(TQ_FIRST(&(yyvsp[0].a_module->foo)) == 0); \ - } while(0) - - MY_IMPORT(imports, xp_next); - MY_IMPORT(exports, xp_next); - MY_IMPORT(members, next); -#undef MY_IMPORT - - } - break; - - case 28: -#line 529 "asn1p_y.y" +#line 518 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; } break; - case 29: -#line 532 "asn1p_y.y" + case 28: +#line 521 "asn1p_y.y" { - yyval.a_module = asn1p_module_new(); - checkmem(yyval.a_module); - if(yyvsp[0].a_xports) { - TQ_ADD(&(yyval.a_module->exports), yyvsp[0].a_xports, xp_next); + if(yyvsp[-1].a_module) { + yyval.a_module = yyvsp[-1].a_module; } else { - /* "EXPORTS ALL;" ? */ + yyval.a_module = yyvsp[0].a_module; + break; } + AL_IMPORT(yyval.a_module, members, yyvsp[0].a_module, next); } break; - case 30: -#line 541 "asn1p_y.y" + case 29: +#line 537 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -2061,8 +2054,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 31: -#line 548 "asn1p_y.y" + case 30: +#line 544 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -2072,8 +2065,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 32: -#line 561 "asn1p_y.y" + case 31: +#line 557 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -2083,13 +2076,13 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 33: -#line 569 "asn1p_y.y" + case 32: +#line 565 "asn1p_y.y" { asn1p_lexer_hack_push_encoding_control(); } break; - case 34: -#line 570 "asn1p_y.y" + case 33: +#line 566 "asn1p_y.y" { fprintf(stderr, "WARNING: ENCODING-CONTROL %s " @@ -2100,8 +2093,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 35: -#line 582 "asn1p_y.y" + case 34: +#line 578 "asn1p_y.y" { return yyerror( "Attempt to redefine a standard basic string type, " @@ -2109,7 +2102,12 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 36: + case 35: +#line 591 "asn1p_y.y" + { yyval.a_module = 0; } + break; + + case 37: #line 595 "asn1p_y.y" { if(!saved_aid && 0) @@ -2120,14 +2118,14 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 37: + case 38: #line 605 "asn1p_y.y" { return yyerror("Empty IMPORTS list"); } break; - case 38: + case 39: #line 611 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); @@ -2136,7 +2134,7 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 39: + case 40: #line 616 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; @@ -2144,17 +2142,17 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 40: + case 41: #line 623 "asn1p_y.y" { memset(&yyval.a_aid, 0, sizeof(yyval.a_aid)); } break; - case 41: + case 42: #line 624 "asn1p_y.y" { yyval.a_aid.oid = yyvsp[0].a_oid; } break; - case 42: + case 43: #line 628 "asn1p_y.y" { yyval.a_xports = yyvsp[-3].a_xports; @@ -2166,7 +2164,7 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 43: + case 44: #line 639 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); @@ -2175,7 +2173,7 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 44: + case 45: #line 644 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; @@ -2183,7 +2181,7 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 45: + case 46: #line 651 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); @@ -2193,7 +2191,7 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 46: + case 47: #line 657 "asn1p_y.y" { /* Completely equivalent to above */ yyval.a_expr = asn1p_expr_new(yylineno); @@ -2203,7 +2201,7 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 47: + case 48: #line 663 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); @@ -2213,22 +2211,40 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 48: -#line 672 "asn1p_y.y" + case 49: +#line 673 "asn1p_y.y" + { yyval.a_module = 0; } + break; + + case 50: +#line 674 "asn1p_y.y" + { + yyval.a_module = asn1p_module_new(); + checkmem(yyval.a_module); + if(yyvsp[0].a_xports) { + TQ_ADD(&(yyval.a_module->exports), yyvsp[0].a_xports, xp_next); + } else { + /* "EXPORTS ALL;" */ + } + } + break; + + case 51: +#line 686 "asn1p_y.y" { yyval.a_xports = yyvsp[-1].a_xports; } break; - case 49: -#line 675 "asn1p_y.y" + case 52: +#line 689 "asn1p_y.y" { yyval.a_xports = 0; } break; - case 50: -#line 678 "asn1p_y.y" + case 53: +#line 692 "asn1p_y.y" { /* Empty EXPORTS clause effectively prohibits export. */ yyval.a_xports = asn1p_xports_new(); @@ -2236,8 +2252,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 51: -#line 686 "asn1p_y.y" + case 54: +#line 700 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); assert(yyval.a_xports); @@ -2245,16 +2261,16 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 52: -#line 691 "asn1p_y.y" + case 55: +#line 705 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); } break; - case 53: -#line 698 "asn1p_y.y" + case 56: +#line 712 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2263,8 +2279,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 54: -#line 704 "asn1p_y.y" + case 57: +#line 718 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2273,8 +2289,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 55: -#line 710 "asn1p_y.y" + case 58: +#line 724 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2283,13 +2299,13 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 56: -#line 719 "asn1p_y.y" + case 59: +#line 733 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; } break; - case 57: -#line 722 "asn1p_y.y" + case 60: +#line 736 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -2299,15 +2315,15 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 58: -#line 732 "asn1p_y.y" + case 61: +#line 746 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; } break; - case 59: -#line 745 "asn1p_y.y" + case 62: +#line 759 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2317,8 +2333,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 60: -#line 755 "asn1p_y.y" + case 63: +#line 769 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2329,8 +2345,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 61: -#line 775 "asn1p_y.y" + case 64: +#line 789 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -2339,8 +2355,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 62: -#line 781 "asn1p_y.y" + case 65: +#line 795 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -2349,8 +2365,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 63: -#line 797 "asn1p_y.y" + case 66: +#line 811 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-5].tv_str; @@ -2358,8 +2374,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 64: -#line 803 "asn1p_y.y" + case 67: +#line 817 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-5].tv_str; @@ -2367,8 +2383,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 65: -#line 811 "asn1p_y.y" + case 68: +#line 825 "asn1p_y.y" { int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); @@ -2380,8 +2396,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 66: -#line 820 "asn1p_y.y" + case 69: +#line 834 "asn1p_y.y" { int ret; yyval.a_plist = yyvsp[-2].a_plist; @@ -2392,16 +2408,16 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 67: -#line 831 "asn1p_y.y" + case 70: +#line 845 "asn1p_y.y" { yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; } break; - case 68: -#line 835 "asn1p_y.y" + case 71: +#line 849 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -2411,8 +2427,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 69: -#line 842 "asn1p_y.y" + case 72: +#line 856 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -2422,8 +2438,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 70: -#line 849 "asn1p_y.y" + case 73: +#line 863 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -2434,8 +2450,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 71: -#line 857 "asn1p_y.y" + case 74: +#line 871 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -2446,8 +2462,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 72: -#line 868 "asn1p_y.y" + case 75: +#line 882 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2455,23 +2471,23 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 73: -#line 873 "asn1p_y.y" + case 76: +#line 887 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); } break; - case 74: -#line 880 "asn1p_y.y" + case 77: +#line 894 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; } break; - case 75: -#line 883 "asn1p_y.y" + case 78: +#line 897 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2482,8 +2498,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 76: -#line 891 "asn1p_y.y" + case 79: +#line 905 "asn1p_y.y" { asn1p_ref_t *ref; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2497,8 +2513,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 77: -#line 902 "asn1p_y.y" + case 80: +#line 916 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); yyval.a_expr->expr_type = A1TC_VALUESET; @@ -2507,18 +2523,18 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 78: -#line 925 "asn1p_y.y" + case 81: +#line 939 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); } break; - case 79: -#line 926 "asn1p_y.y" + case 82: +#line 940 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; } break; - case 80: -#line 929 "asn1p_y.y" + case 83: +#line 943 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2526,16 +2542,16 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 81: -#line 934 "asn1p_y.y" + case 84: +#line 948 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); } break; - case 82: -#line 941 "asn1p_y.y" + case 85: +#line 955 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -2545,8 +2561,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 83: -#line 948 "asn1p_y.y" + case 86: +#line 962 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; yyvsp[0].a_marker.flags |= yyval.a_expr->marker.flags; @@ -2555,8 +2571,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 84: -#line 954 "asn1p_y.y" + case 87: +#line 968 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2566,15 +2582,15 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 85: -#line 961 "asn1p_y.y" + case 88: +#line 975 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; } break; - case 86: -#line 967 "asn1p_y.y" + case 89: +#line 981 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2582,16 +2598,16 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 87: -#line 972 "asn1p_y.y" + case 90: +#line 986 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); } break; - case 88: -#line 979 "asn1p_y.y" + case 91: +#line 993 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -2599,23 +2615,23 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 89: -#line 984 "asn1p_y.y" + case 92: +#line 998 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; } break; - case 90: -#line 987 "asn1p_y.y" + case 93: +#line 1001 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; _fixup_anonymous_identifier(yyval.a_expr); } break; - case 91: -#line 994 "asn1p_y.y" + case 94: +#line 1008 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); @@ -2625,18 +2641,18 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 92: -#line 1004 "asn1p_y.y" + case 95: +#line 1018 "asn1p_y.y" { yyval.a_int = 0; } break; - case 93: -#line 1005 "asn1p_y.y" + case 96: +#line 1019 "asn1p_y.y" { yyval.a_int = 1; } break; - case 94: -#line 1009 "asn1p_y.y" + case 97: +#line 1023 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2646,16 +2662,16 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 95: -#line 1016 "asn1p_y.y" + case 98: +#line 1030 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); } break; - case 96: -#line 1026 "asn1p_y.y" + case 99: +#line 1040 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2666,8 +2682,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 97: -#line 1036 "asn1p_y.y" + case 100: +#line 1050 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); yyval.a_expr->Identifier = yyvsp[-3].tv_str; @@ -2679,8 +2695,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 98: -#line 1047 "asn1p_y.y" + case 101: +#line 1061 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -2691,8 +2707,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 99: -#line 1057 "asn1p_y.y" + case 102: +#line 1071 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2704,8 +2720,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 100: -#line 1068 "asn1p_y.y" + case 103: +#line 1082 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -2716,8 +2732,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 101: -#line 1078 "asn1p_y.y" + case 104: +#line 1092 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2729,8 +2745,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 102: -#line 1089 "asn1p_y.y" + case 105: +#line 1103 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2742,78 +2758,78 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 103: -#line 1101 "asn1p_y.y" + case 106: +#line 1115 "asn1p_y.y" { yyval.a_wsynt = 0; } break; - case 104: -#line 1102 "asn1p_y.y" + case 107: +#line 1116 "asn1p_y.y" { yyval.a_wsynt = yyvsp[0].a_wsynt; } break; - case 105: -#line 1109 "asn1p_y.y" + case 108: +#line 1123 "asn1p_y.y" { asn1p_lexer_hack_enable_with_syntax(); } break; - case 106: -#line 1111 "asn1p_y.y" + case 109: +#line 1125 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; } break; - case 107: -#line 1117 "asn1p_y.y" + case 110: +#line 1131 "asn1p_y.y" { yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); } break; - case 108: -#line 1121 "asn1p_y.y" + case 111: +#line 1135 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); } break; - case 109: -#line 1128 "asn1p_y.y" + case 112: +#line 1142 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_fromstring(yyvsp[0].tv_opaque.buf, 0); yyval.a_wchunk->type = WC_WHITESPACE; } break; - case 110: -#line 1132 "asn1p_y.y" + case 113: +#line 1146 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_fromstring(yyvsp[0].tv_str, 0); } break; - case 111: -#line 1135 "asn1p_y.y" + case 114: +#line 1149 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_fromstring(yyvsp[0].a_refcomp.name, 0); yyval.a_wchunk->type = WC_FIELD; } break; - case 112: -#line 1139 "asn1p_y.y" + case 115: +#line 1153 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_fromsyntax(yyvsp[-1].a_wsynt); } break; - case 113: -#line 1145 "asn1p_y.y" + case 116: +#line 1159 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2824,8 +2840,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 114: -#line 1153 "asn1p_y.y" + case 117: +#line 1167 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2837,8 +2853,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 115: -#line 1162 "asn1p_y.y" + case 118: +#line 1176 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2850,8 +2866,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 116: -#line 1174 "asn1p_y.y" + case 119: +#line 1188 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; yyval.a_expr->tag = yyvsp[-2].a_tag; @@ -2873,16 +2889,16 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 117: -#line 1196 "asn1p_y.y" + case 120: +#line 1210 "asn1p_y.y" { yyval.a_int = asn1p_as_pointer ? EM_INDIRECT : 0; asn1p_as_pointer = 0; } break; - case 118: -#line 1203 "asn1p_y.y" + case 121: +#line 1217 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->marker.flags |= yyvsp[-1].a_int; @@ -2901,15 +2917,15 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 119: -#line 1222 "asn1p_y.y" + case 122: +#line 1236 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; } break; - case 120: -#line 1225 "asn1p_y.y" + case 123: +#line 1239 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2918,8 +2934,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 121: -#line 1231 "asn1p_y.y" + case 124: +#line 1245 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2928,8 +2944,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 122: -#line 1237 "asn1p_y.y" + case 125: +#line 1251 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2938,8 +2954,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 123: -#line 1243 "asn1p_y.y" + case 126: +#line 1257 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2952,8 +2968,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 124: -#line 1253 "asn1p_y.y" + case 127: +#line 1267 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2966,8 +2982,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 125: -#line 1263 "asn1p_y.y" + case 128: +#line 1277 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -2976,8 +2992,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 126: -#line 1269 "asn1p_y.y" + case 129: +#line 1283 "asn1p_y.y" { int ret; yyval.a_expr = asn1p_expr_new(yylineno); @@ -2991,8 +3007,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 127: -#line 1280 "asn1p_y.y" + case 130: +#line 1294 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3002,8 +3018,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 128: -#line 1295 "asn1p_y.y" + case 131: +#line 1309 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -3014,8 +3030,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 129: -#line 1303 "asn1p_y.y" + case 132: +#line 1317 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -3028,8 +3044,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 130: -#line 1313 "asn1p_y.y" + case 133: +#line 1327 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -3042,8 +3058,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 131: -#line 1323 "asn1p_y.y" + case 134: +#line 1337 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -3056,8 +3072,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 132: -#line 1333 "asn1p_y.y" + case 135: +#line 1347 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -3068,8 +3084,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 133: -#line 1341 "asn1p_y.y" + case 136: +#line 1355 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[0].a_ref; @@ -3091,8 +3107,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 134: -#line 1363 "asn1p_y.y" + case 137: +#line 1377 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -3103,8 +3119,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 135: -#line 1371 "asn1p_y.y" + case 138: +#line 1385 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[-2].a_ref; @@ -3114,56 +3130,56 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 137: -#line 1384 "asn1p_y.y" + case 140: +#line 1398 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; } break; - case 138: -#line 1389 "asn1p_y.y" + case 141: +#line 1403 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; } break; - case 139: -#line 1398 "asn1p_y.y" + case 142: +#line 1412 "asn1p_y.y" { yyval.a_ref = asn1p_ref_new(yylineno); asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_AmpUppercase); } break; - case 140: -#line 1402 "asn1p_y.y" + case 143: +#line 1416 "asn1p_y.y" { yyval.a_ref = yyval.a_ref; asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_AmpUppercase); } break; - case 141: -#line 1406 "asn1p_y.y" + case 144: +#line 1420 "asn1p_y.y" { yyval.a_ref = yyval.a_ref; asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_Amplowercase); } break; - case 142: -#line 1413 "asn1p_y.y" + case 145: +#line 1427 "asn1p_y.y" { yyval.a_ref = asn1p_ref_new(yylineno); asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_CAPITALS); } break; - case 143: -#line 1433 "asn1p_y.y" + case 146: +#line 1447 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); @@ -3173,8 +3189,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 146: -#line 1445 "asn1p_y.y" + case 149: +#line 1459 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -3184,13 +3200,13 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 147: -#line 1452 "asn1p_y.y" + case 150: +#line 1466 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); } break; - case 148: -#line 1452 "asn1p_y.y" + case 151: +#line 1466 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); @@ -3198,8 +3214,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 149: -#line 1457 "asn1p_y.y" + case 152: +#line 1471 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -3207,8 +3223,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 150: -#line 1465 "asn1p_y.y" + case 153: +#line 1479 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -3216,8 +3232,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 151: -#line 1470 "asn1p_y.y" + case 154: +#line 1484 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -3225,38 +3241,38 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 152: -#line 1475 "asn1p_y.y" + case 155: +#line 1489 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); } break; - case 153: -#line 1479 "asn1p_y.y" + case 156: +#line 1493 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); } break; - case 154: -#line 1483 "asn1p_y.y" + case 157: +#line 1497 "asn1p_y.y" { yyval.a_value = yyval.a_value; } break; - case 155: -#line 1486 "asn1p_y.y" + case 158: +#line 1500 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; } break; - case 156: -#line 1492 "asn1p_y.y" + case 159: +#line 1506 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3270,8 +3286,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 157: -#line 1503 "asn1p_y.y" + case 160: +#line 1517 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3288,16 +3304,16 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 158: -#line 1521 "asn1p_y.y" + case 161: +#line 1535 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); } break; - case 159: -#line 1525 "asn1p_y.y" + case 162: +#line 1539 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); @@ -3305,8 +3321,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 160: -#line 1530 "asn1p_y.y" + case 163: +#line 1544 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); @@ -3314,8 +3330,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 161: -#line 1564 "asn1p_y.y" + case 164: +#line 1578 "asn1p_y.y" { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 1; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); @@ -3327,8 +3343,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 162: -#line 1573 "asn1p_y.y" + case 165: +#line 1587 "asn1p_y.y" { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); @@ -3343,88 +3359,88 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 163: -#line 1588 "asn1p_y.y" + case 166: +#line 1602 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BOOLEAN; } break; - case 164: -#line 1589 "asn1p_y.y" + case 167: +#line 1603 "asn1p_y.y" { yyval.a_type = ASN_BASIC_NULL; } break; - case 165: -#line 1590 "asn1p_y.y" + case 168: +#line 1604 "asn1p_y.y" { yyval.a_type = ASN_BASIC_REAL; } break; - case 166: -#line 1591 "asn1p_y.y" + case 169: +#line 1605 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; } break; - case 167: -#line 1592 "asn1p_y.y" + case 170: +#line 1606 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OCTET_STRING; } break; - case 168: -#line 1593 "asn1p_y.y" + case 171: +#line 1607 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; } break; - case 169: -#line 1594 "asn1p_y.y" + case 172: +#line 1608 "asn1p_y.y" { yyval.a_type = ASN_BASIC_RELATIVE_OID; } break; - case 170: -#line 1595 "asn1p_y.y" + case 173: +#line 1609 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EXTERNAL; } break; - case 171: -#line 1596 "asn1p_y.y" + case 174: +#line 1610 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; } break; - case 172: -#line 1597 "asn1p_y.y" + case 175: +#line 1611 "asn1p_y.y" { yyval.a_type = ASN_BASIC_CHARACTER_STRING; } break; - case 173: -#line 1598 "asn1p_y.y" + case 176: +#line 1612 "asn1p_y.y" { yyval.a_type = ASN_BASIC_UTCTime; } break; - case 174: -#line 1599 "asn1p_y.y" + case 177: +#line 1613 "asn1p_y.y" { yyval.a_type = ASN_BASIC_GeneralizedTime; } break; - case 175: -#line 1600 "asn1p_y.y" + case 178: +#line 1614 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; } break; - case 176: -#line 1607 "asn1p_y.y" + case 179: +#line 1621 "asn1p_y.y" { yyval.a_type = ASN_BASIC_INTEGER; } break; - case 177: -#line 1608 "asn1p_y.y" + case 180: +#line 1622 "asn1p_y.y" { yyval.a_type = ASN_BASIC_ENUMERATED; } break; - case 178: -#line 1609 "asn1p_y.y" + case 181: +#line 1623 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BIT_STRING; } break; - case 179: -#line 1613 "asn1p_y.y" + case 182: +#line 1627 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -3433,8 +3449,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 180: -#line 1619 "asn1p_y.y" + case 183: +#line 1633 "asn1p_y.y" { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; @@ -3447,109 +3463,109 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 181: -#line 1632 "asn1p_y.y" + case 184: +#line 1646 "asn1p_y.y" { yyval.a_type = ASN_STRING_BMPString; } break; - case 182: -#line 1633 "asn1p_y.y" + case 185: +#line 1647 "asn1p_y.y" { yyval.a_type = ASN_STRING_GeneralString; fprintf(stderr, "WARNING: GeneralString is not fully supported\n"); } break; - case 183: -#line 1637 "asn1p_y.y" + case 186: +#line 1651 "asn1p_y.y" { yyval.a_type = ASN_STRING_GraphicString; fprintf(stderr, "WARNING: GraphicString is not fully supported\n"); } break; - case 184: -#line 1641 "asn1p_y.y" + case 187: +#line 1655 "asn1p_y.y" { yyval.a_type = ASN_STRING_IA5String; } break; - case 185: -#line 1642 "asn1p_y.y" + case 188: +#line 1656 "asn1p_y.y" { yyval.a_type = ASN_STRING_ISO646String; } break; - case 186: -#line 1643 "asn1p_y.y" + case 189: +#line 1657 "asn1p_y.y" { yyval.a_type = ASN_STRING_NumericString; } break; - case 187: -#line 1644 "asn1p_y.y" + case 190: +#line 1658 "asn1p_y.y" { yyval.a_type = ASN_STRING_PrintableString; } break; - case 188: -#line 1645 "asn1p_y.y" + case 191: +#line 1659 "asn1p_y.y" { yyval.a_type = ASN_STRING_T61String; fprintf(stderr, "WARNING: T61String is not fully supported\n"); } break; - case 189: -#line 1649 "asn1p_y.y" + case 192: +#line 1663 "asn1p_y.y" { yyval.a_type = ASN_STRING_TeletexString; } break; - case 190: -#line 1650 "asn1p_y.y" + case 193: +#line 1664 "asn1p_y.y" { yyval.a_type = ASN_STRING_UniversalString; } break; - case 191: -#line 1651 "asn1p_y.y" + case 194: +#line 1665 "asn1p_y.y" { yyval.a_type = ASN_STRING_UTF8String; } break; - case 192: -#line 1652 "asn1p_y.y" + case 195: +#line 1666 "asn1p_y.y" { yyval.a_type = ASN_STRING_VideotexString; fprintf(stderr, "WARNING: VideotexString is not fully supported\n"); } break; - case 193: -#line 1656 "asn1p_y.y" + case 196: +#line 1670 "asn1p_y.y" { yyval.a_type = ASN_STRING_VisibleString; } break; - case 194: -#line 1657 "asn1p_y.y" + case 197: +#line 1671 "asn1p_y.y" { yyval.a_type = ASN_STRING_ObjectDescriptor; } break; - case 200: -#line 1669 "asn1p_y.y" + case 203: +#line 1683 "asn1p_y.y" { yyval.a_constr = 0; } break; - case 201: -#line 1670 "asn1p_y.y" + case 204: +#line 1684 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; - case 202: -#line 1676 "asn1p_y.y" + case 205: +#line 1690 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); } break; - case 203: -#line 1679 "asn1p_y.y" + case 206: +#line 1693 "asn1p_y.y" { /* * This is a special case, for compatibility purposes. @@ -3559,37 +3575,37 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 204: -#line 1689 "asn1p_y.y" + case 207: +#line 1703 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; } break; - case 205: -#line 1692 "asn1p_y.y" + case 208: +#line 1706 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); } break; - case 206: -#line 1698 "asn1p_y.y" + case 209: +#line 1712 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); yyval.a_constr->type = ACT_EL_EXT; } break; - case 207: -#line 1702 "asn1p_y.y" + case 210: +#line 1716 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; - case 208: -#line 1705 "asn1p_y.y" + case 211: +#line 1719 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3598,8 +3614,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 209: -#line 1711 "asn1p_y.y" + case 212: +#line 1725 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3610,43 +3626,43 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 210: -#line 1722 "asn1p_y.y" + case 213: +#line 1736 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; - case 211: -#line 1725 "asn1p_y.y" + case 214: +#line 1739 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_AEX, yyvsp[0].a_constr, 0); } break; - case 212: -#line 1728 "asn1p_y.y" + case 215: +#line 1742 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); } break; - case 213: -#line 1731 "asn1p_y.y" + case 216: +#line 1745 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); } break; - case 214: -#line 1734 "asn1p_y.y" + case 217: +#line 1748 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); } break; - case 215: -#line 1740 "asn1p_y.y" + case 218: +#line 1754 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -3657,8 +3673,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 216: -#line 1748 "asn1p_y.y" + case 219: +#line 1762 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -3669,8 +3685,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 217: -#line 1756 "asn1p_y.y" + case 220: +#line 1770 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3679,8 +3695,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 218: -#line 1762 "asn1p_y.y" + case 221: +#line 1776 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3689,8 +3705,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 219: -#line 1768 "asn1p_y.y" + case 222: +#line 1782 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3700,8 +3716,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 220: -#line 1775 "asn1p_y.y" + case 223: +#line 1789 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3712,8 +3728,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 221: -#line 1783 "asn1p_y.y" + case 224: +#line 1797 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3724,8 +3740,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 222: -#line 1791 "asn1p_y.y" + case 225: +#line 1805 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3737,27 +3753,27 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 223: -#line 1800 "asn1p_y.y" + case 226: +#line 1814 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; - case 224: -#line 1803 "asn1p_y.y" + case 227: +#line 1817 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; - case 225: -#line 1807 "asn1p_y.y" + case 228: +#line 1821 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); } break; - case 226: -#line 1807 "asn1p_y.y" + case 229: +#line 1821 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3768,42 +3784,42 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 227: -#line 1818 "asn1p_y.y" + case 230: +#line 1832 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RANGE; } break; - case 228: -#line 1819 "asn1p_y.y" + case 231: +#line 1833 "asn1p_y.y" { yyval.a_ctype = ACT_EL_RLRANGE; } break; - case 229: -#line 1820 "asn1p_y.y" + case 232: +#line 1834 "asn1p_y.y" { yyval.a_ctype = ACT_EL_LLRANGE; } break; - case 230: -#line 1821 "asn1p_y.y" + case 233: +#line 1835 "asn1p_y.y" { yyval.a_ctype = ACT_EL_ULRANGE; } break; - case 231: -#line 1825 "asn1p_y.y" + case 234: +#line 1839 "asn1p_y.y" { yyval.a_ctype = ACT_CT_SIZE; } break; - case 232: -#line 1828 "asn1p_y.y" + case 235: +#line 1842 "asn1p_y.y" { yyval.a_ctype = ACT_CT_FROM; } break; - case 233: -#line 1834 "asn1p_y.y" + case 236: +#line 1848 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -3811,8 +3827,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 234: -#line 1839 "asn1p_y.y" + case 237: +#line 1853 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); @@ -3820,8 +3836,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 237: -#line 1846 "asn1p_y.y" + case 240: +#line 1860 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3835,8 +3851,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 238: -#line 1860 "asn1p_y.y" + case 241: +#line 1874 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3850,36 +3866,36 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 239: -#line 1874 "asn1p_y.y" + case 242: +#line 1888 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMP, yyvsp[0].a_constr, 0); } break; - case 240: -#line 1877 "asn1p_y.y" + case 243: +#line 1891 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); } break; - case 241: -#line 1883 "asn1p_y.y" + case 244: +#line 1897 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; - case 242: -#line 1886 "asn1p_y.y" + case 245: +#line 1900 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); } break; - case 243: -#line 1892 "asn1p_y.y" + case 246: +#line 1906 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3888,8 +3904,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 244: -#line 1898 "asn1p_y.y" + case 247: +#line 1912 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3900,53 +3916,53 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 245: -#line 1912 "asn1p_y.y" + case 248: +#line 1926 "asn1p_y.y" { yyval.a_pres = ACPRES_DEFAULT; } break; - case 246: -#line 1913 "asn1p_y.y" + case 249: +#line 1927 "asn1p_y.y" { yyval.a_pres = yyvsp[0].a_pres; } break; - case 247: -#line 1917 "asn1p_y.y" + case 250: +#line 1931 "asn1p_y.y" { yyval.a_pres = ACPRES_PRESENT; } break; - case 248: -#line 1920 "asn1p_y.y" + case 251: +#line 1934 "asn1p_y.y" { yyval.a_pres = ACPRES_ABSENT; } break; - case 249: -#line 1923 "asn1p_y.y" + case 252: +#line 1937 "asn1p_y.y" { yyval.a_pres = ACPRES_OPTIONAL; } break; - case 250: -#line 1929 "asn1p_y.y" + case 253: +#line 1943 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; - case 251: -#line 1932 "asn1p_y.y" + case 254: +#line 1946 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; - case 252: -#line 1941 "asn1p_y.y" + case 255: +#line 1955 "asn1p_y.y" { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; @@ -3961,15 +3977,15 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 253: -#line 1956 "asn1p_y.y" + case 256: +#line 1970 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); } break; - case 254: -#line 1962 "asn1p_y.y" + case 257: +#line 1976 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3978,8 +3994,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 255: -#line 1968 "asn1p_y.y" + case 258: +#line 1982 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3990,8 +4006,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 256: -#line 1982 "asn1p_y.y" + case 259: +#line 1996 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; @@ -4005,8 +4021,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 257: -#line 1993 "asn1p_y.y" + case 260: +#line 2007 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; @@ -4021,15 +4037,15 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 258: -#line 2009 "asn1p_y.y" + case 261: +#line 2023 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; } break; - case 259: -#line 2012 "asn1p_y.y" + case 262: +#line 2026 "asn1p_y.y" { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); @@ -4041,52 +4057,52 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 260: -#line 2030 "asn1p_y.y" + case 263: +#line 2044 "asn1p_y.y" { yyval.a_marker.flags = EM_NOMARK; yyval.a_marker.default_value = 0; } break; - case 261: -#line 2034 "asn1p_y.y" + case 264: +#line 2048 "asn1p_y.y" { yyval.a_marker = yyvsp[0].a_marker; } break; - case 262: -#line 2038 "asn1p_y.y" + case 265: +#line 2052 "asn1p_y.y" { yyval.a_marker.flags = EM_OPTIONAL | EM_INDIRECT; yyval.a_marker.default_value = 0; } break; - case 263: -#line 2042 "asn1p_y.y" + case 266: +#line 2056 "asn1p_y.y" { yyval.a_marker.flags = EM_DEFAULT; yyval.a_marker.default_value = yyvsp[0].a_value; } break; - case 264: -#line 2065 "asn1p_y.y" + case 267: +#line 2079 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); } break; - case 265: -#line 2069 "asn1p_y.y" + case 268: +#line 2083 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; } break; - case 266: -#line 2075 "asn1p_y.y" + case 269: +#line 2089 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -4094,16 +4110,16 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 267: -#line 2080 "asn1p_y.y" + case 270: +#line 2094 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); } break; - case 268: -#line 2087 "asn1p_y.y" + case 271: +#line 2101 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -4113,8 +4129,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 269: -#line 2094 "asn1p_y.y" + case 272: +#line 2108 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -4125,8 +4141,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 270: -#line 2102 "asn1p_y.y" + case 273: +#line 2116 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -4137,8 +4153,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 271: -#line 2110 "asn1p_y.y" + case 274: +#line 2124 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -4148,8 +4164,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 272: -#line 2117 "asn1p_y.y" + case 275: +#line 2131 "asn1p_y.y" { yyval.a_expr = asn1p_expr_new(yylineno); checkmem(yyval.a_expr); @@ -4160,129 +4176,129 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 273: -#line 2128 "asn1p_y.y" + case 276: +#line 2142 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); } break; - case 274: -#line 2132 "asn1p_y.y" + case 277: +#line 2146 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); } break; - case 276: -#line 2140 "asn1p_y.y" + case 279: +#line 2154 "asn1p_y.y" { yyval.a_value = asn1p_value_fromdouble(yyvsp[0].a_dbl); checkmem(yyval.a_value); } break; - case 277: -#line 2171 "asn1p_y.y" + case 280: +#line 2185 "asn1p_y.y" { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); } break; - case 278: -#line 2172 "asn1p_y.y" + case 281: +#line 2186 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; } break; - case 279: -#line 2176 "asn1p_y.y" + case 282: +#line 2190 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = yyvsp[0].a_tag.tag_mode; } break; - case 280: -#line 2183 "asn1p_y.y" + case 283: +#line 2197 "asn1p_y.y" { yyval.a_tag = yyvsp[-2].a_tag; yyval.a_tag.tag_value = yyvsp[-1].a_int; } break; - case 281: -#line 2189 "asn1p_y.y" + case 284: +#line 2203 "asn1p_y.y" { yyval.a_tag.tag_class = TC_CONTEXT_SPECIFIC; } break; - case 282: -#line 2190 "asn1p_y.y" + case 285: +#line 2204 "asn1p_y.y" { yyval.a_tag.tag_class = TC_UNIVERSAL; } break; - case 283: -#line 2191 "asn1p_y.y" + case 286: +#line 2205 "asn1p_y.y" { yyval.a_tag.tag_class = TC_APPLICATION; } break; - case 284: -#line 2192 "asn1p_y.y" + case 287: +#line 2206 "asn1p_y.y" { yyval.a_tag.tag_class = TC_PRIVATE; } break; - case 285: -#line 2196 "asn1p_y.y" + case 288: +#line 2210 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_DEFAULT; } break; - case 286: -#line 2197 "asn1p_y.y" + case 289: +#line 2211 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_IMPLICIT; } break; - case 287: -#line 2198 "asn1p_y.y" + case 290: +#line 2212 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_EXPLICIT; } break; - case 288: -#line 2202 "asn1p_y.y" + case 291: +#line 2216 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; } break; - case 289: -#line 2206 "asn1p_y.y" + case 292: +#line 2220 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; } break; - case 290: -#line 2214 "asn1p_y.y" + case 293: +#line 2228 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; } break; - case 291: -#line 2221 "asn1p_y.y" + case 294: +#line 2235 "asn1p_y.y" { yyval.tv_str = 0; } break; - case 292: -#line 2222 "asn1p_y.y" + case 295: +#line 2236 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; } break; - case 293: -#line 2228 "asn1p_y.y" + case 296: +#line 2242 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; @@ -4293,7 +4309,7 @@ yyparse (YYPARSE_PARAM_ARG) } /* Line 1016 of /usr/local/share/bison/yacc.c. */ -#line 4297 "asn1p_y.c" +#line 4313 "asn1p_y.c" yyvsp -= yylen; yyssp -= yylen; @@ -4512,7 +4528,7 @@ yyparse (YYPARSE_PARAM_ARG) } -#line 2234 "asn1p_y.y" +#line 2248 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.h b/libasn1parser/asn1p_y.h index 3874ede45..19de33468 100644 --- a/libasn1parser/asn1p_y.h +++ b/libasn1parser/asn1p_y.h @@ -245,7 +245,7 @@ #ifndef YYSTYPE -#line 72 "asn1p_y.y" +#line 85 "asn1p_y.y" typedef union { asn1p_t *a_grammar; asn1p_module_flags_e a_module_flags; diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index eacab98b2..b252a7316 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -61,6 +61,19 @@ static void _fixup_anonymous_identifier(asn1p_expr_t *expr); } \ } while(0) +#ifdef AL_IMPORT +#error AL_IMPORT DEFINED ELSEWHERE! +#endif +#define AL_IMPORT(to,where,from,field) do { \ + if(!(from)) break; \ + while(TQ_FIRST(&((from)->where))) { \ + TQ_ADD(&((to)->where), \ + TQ_REMOVE(&((from)->where), field), \ + field); \ + } \ + assert(TQ_FIRST(&((from)->where)) == 0); \ + } while(0) + %} @@ -223,13 +236,16 @@ static void _fixup_anonymous_identifier(asn1p_expr_t *expr); * Types defined herein. */ %type ModuleList -%type ModuleSpecification -%type ModuleSpecificationBody -%type ModuleSpecificationElement -%type optModuleSpecificationBody /* Optional */ -%type optModuleSpecificationFlags -%type ModuleSpecificationFlags /* Set of FL */ -%type ModuleSpecificationFlag /* Single FL */ +%type ModuleDefinition +%type ModuleBody +%type AssignmentList +%type Assignment +%type optModuleBody /* Optional */ +%type optModuleDefinitionFlags +%type ModuleDefinitionFlags /* Set of FL */ +%type ModuleDefinitionFlag /* Single FL */ +%type optImports +%type optExports %type ImportsDefinition %type ImportsBundleSet %type ImportsBundle @@ -330,12 +346,12 @@ ParsedGrammar: ; ModuleList: - ModuleSpecification { + ModuleDefinition { $$ = asn1p_new(); checkmem($$); TQ_ADD(&($$->modules), $1, mod_next); } - | ModuleList ModuleSpecification { + | ModuleList ModuleDefinition { $$ = $1; TQ_ADD(&($$->modules), $2, mod_next); } @@ -351,11 +367,11 @@ ModuleList: * === EOF === */ -ModuleSpecification: +ModuleDefinition: TypeRefName optObjectIdentifier TOK_DEFINITIONS - optModuleSpecificationFlags + optModuleDefinitionFlags TOK_PPEQ TOK_BEGIN - optModuleSpecificationBody + optModuleBody TOK_END { if($7) { @@ -423,9 +439,9 @@ ObjectIdentifierElement: /* * Optional module flags. */ -optModuleSpecificationFlags: +optModuleDefinitionFlags: { $$ = MSF_NOFLAGS; } - | ModuleSpecificationFlags { + | ModuleDefinitionFlags { $$ = $1; } ; @@ -433,11 +449,11 @@ optModuleSpecificationFlags: /* * Module flags. */ -ModuleSpecificationFlags: - ModuleSpecificationFlag { +ModuleDefinitionFlags: + ModuleDefinitionFlag { $$ = $1; } - | ModuleSpecificationFlags ModuleSpecificationFlag { + | ModuleDefinitionFlags ModuleDefinitionFlag { $$ = $1 | $2; } ; @@ -445,7 +461,7 @@ ModuleSpecificationFlags: /* * Single module flag. */ -ModuleSpecificationFlag: +ModuleDefinitionFlag: TOK_EXPLICIT TOK_TAGS { $$ = MSF_EXPLICIT_TAGS; } @@ -479,9 +495,9 @@ ModuleSpecificationFlag: /* * Optional module body. */ -optModuleSpecificationBody: +optModuleBody: { $$ = 0; } - | ModuleSpecificationBody { + | ModuleBody { $$ = $1; } ; @@ -489,56 +505,36 @@ optModuleSpecificationBody: /* * ASN.1 Module body. */ -ModuleSpecificationBody: - ModuleSpecificationElement { - $$ = $1; +ModuleBody: + optExports optImports AssignmentList { + $$ = asn1p_module_new(); + AL_IMPORT($$, exports, $1, xp_next); + AL_IMPORT($$, imports, $2, xp_next); + AL_IMPORT($$, members, $3, next); } - | ModuleSpecificationBody ModuleSpecificationElement { - $$ = $1; + ; - /* Behave well when one of them is skipped. */ - if(!($1)) { - if($2) $$ = $2; +AssignmentList: + Assignment { + $$ = $1; + } + | AssignmentList Assignment { + if($1) { + $$ = $1; + } else { + $$ = $2; break; } - -#ifdef MY_IMPORT -#error MY_IMPORT DEFINED ELSEWHERE! -#endif -#define MY_IMPORT(foo,field) do { \ - while(TQ_FIRST(&($2->foo))) { \ - TQ_ADD(&($$->foo), \ - TQ_REMOVE(&($2->foo), field), \ - field); \ - } \ - assert(TQ_FIRST(&($2->foo)) == 0); \ - } while(0) - - MY_IMPORT(imports, xp_next); - MY_IMPORT(exports, xp_next); - MY_IMPORT(members, next); -#undef MY_IMPORT - + AL_IMPORT($$, members, $2, next); } ; + /* * One of the elements of ASN.1 module specification. */ -ModuleSpecificationElement: - ImportsDefinition { - $$ = $1; - } - | ExportsDefinition { - $$ = asn1p_module_new(); - checkmem($$); - if($1) { - TQ_ADD(&($$->exports), $1, xp_next); - } else { - /* "EXPORTS ALL;" ? */ - } - } - | DataTypeReference { +Assignment: + DataTypeReference { $$ = asn1p_module_new(); checkmem($$); assert($1->expr_type != A1TC_INVALID); @@ -591,6 +587,10 @@ ModuleSpecificationElement: * IMPORTS Type1, value FROM Module { iso standard(0) } ; * === EOF === */ +optImports: + { $$ = 0; } + | ImportsDefinition; + ImportsDefinition: TOK_IMPORTS ImportsBundleSet ';' { if(!saved_aid && 0) @@ -668,6 +668,20 @@ ImportsElement: } ; + +optExports: + { $$ = 0; } + | ExportsDefinition { + $$ = asn1p_module_new(); + checkmem($$); + if($1) { + TQ_ADD(&($$->exports), $1, xp_next); + } else { + /* "EXPORTS ALL;" */ + } + } + ; + ExportsDefinition: TOK_EXPORTS ExportsBody ';' { $$ = $2; diff --git a/tests/49-real-life-OK.asn1 b/tests/49-real-life-OK.asn1 index ef633fcb7..aeba3b063 100644 --- a/tests/49-real-life-OK.asn1 +++ b/tests/49-real-life-OK.asn1 @@ -19,4 +19,6 @@ BEGIN IMPORTS TypeB FROM ModuleB TypeC FROM ModuleC ; + Z ::= INTEGER -- Can't specify only EXPORTS & IMPOTS + END diff --git a/tests/49-real-life-OK.asn1.-E b/tests/49-real-life-OK.asn1.-E index 716776877..018bc6bd3 100644 --- a/tests/49-real-life-OK.asn1.-E +++ b/tests/49-real-life-OK.asn1.-E @@ -3,4 +3,6 @@ ModuleSetChoiceExtensibility { iso org(3) dod(6) internet(1) private(4) DEFINITIONS ::= BEGIN +Z ::= INTEGER + END From 9c1acb97ce46abe30ed8c1b2d67cdcbb507ca5dd Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 15 Sep 2006 16:34:12 +0000 Subject: [PATCH 1184/1469] do not free everything git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1184 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/check_fixer.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libasn1fix/check_fixer.c b/libasn1fix/check_fixer.c index a35b4a318..51e5bbf0a 100644 --- a/libasn1fix/check_fixer.c +++ b/libasn1fix/check_fixer.c @@ -236,7 +236,9 @@ check(const char *fname, /* * Destroy the asn. */ +#ifdef CLEAN_EVERYTHING asn1p_delete(asn); +#endif return r_value; } From e0fb1e8fd8c278caea8833fb4dddccea645ae346 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 15 Sep 2006 18:33:25 +0000 Subject: [PATCH 1185/1469] XER can decode long values git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1185 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 4 +- examples/sample.makefile.regen | 13 +++ examples/sample.source.LDAP3/Makefile | 13 +++ examples/sample.source.MEGACO/Makefile | 13 +++ examples/sample.source.PKIX1/Makefile | 13 +++ skeletons/INTEGER.c | 125 ++++++++++++++++++++++++- skeletons/converter-sample.c | 78 +++++++++------ 7 files changed, 222 insertions(+), 37 deletions(-) diff --git a/ChangeLog b/ChangeLog index 543566704..6c6a46560 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,14 +3,14 @@ * skeletons/standard-modules directory is now used for standard types. * Fixed class field access problem (Test case 98) - (Severity: medim; Security impact: none) + (Severity: medium; Security impact: none) * Refactored Information Object Classes parsing. * Refactored Parameterization support. * [typedef enum foo {}] foo_e; is now e_foo, see #1287989 * Refactored ValueSetTypeAssignment parsing. - * First release of PER encoder (does not encode SETs yet). * asn-decoder-template.c renamed into converter-sample.c * MEGACO (Media Gateway Control Protocol) decoder sample added. + * First release of PER encoder (does not encode SETs yet). 0.9.20: 2006-Mar-06 diff --git a/examples/sample.makefile.regen b/examples/sample.makefile.regen index 134e1f24d..0e28ab6a3 100755 --- a/examples/sample.makefile.regen +++ b/examples/sample.makefile.regen @@ -35,6 +35,19 @@ cat Makefile.am.sample \ echo " @touch ${ASN1PDU}.c" echo " make" echo + echo 'check: ${TARGET}' + echo " @if test -f ./sample-${ASN1PDU}-1.[db]er ; then \\" + echo " for f in ./sample-${ASN1PDU}-*.[db]er; do \\" + echo ' echo "Recoding $$f into XER and back..."; \' + echo ' ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$ || exit 2; \' + echo ' ./${TARGET} -ixer -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \' + echo ' diff ./.tmp.1.$$ ./.tmp.2.$$ || exit 2; \' + echo ' rm -f ./.tmp.[12].$$; \' + echo ' done; fi' + echo ' @echo ================' + echo ' @echo All tests passed' + echo ' @echo ================' + echo echo "distclean: clean" echo ' rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS)' echo ' rm -f $(ASN_CONVERTER_SOURCES) $(ASN_CONVERTER_HEADERS)' diff --git a/examples/sample.source.LDAP3/Makefile b/examples/sample.source.LDAP3/Makefile index f7dfc64ba..5483981c0 100644 --- a/examples/sample.source.LDAP3/Makefile +++ b/examples/sample.source.LDAP3/Makefile @@ -196,6 +196,19 @@ LDAPMessage.c: ../sample.makefile.regen @touch LDAPMessage.c make +check: ${TARGET} + @if test -f ./sample-LDAPMessage-1.[db]er ; then \ + for f in ./sample-LDAPMessage-*.[db]er; do \ + echo "Recoding $$f into XER and back..."; \ + ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$ || exit 2; \ + ./${TARGET} -ixer -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ + diff ./.tmp.1.$$ ./.tmp.2.$$ || exit 2; \ + rm -f ./.tmp.[12].$$; \ + done; fi + @echo ================ + @echo All tests passed + @echo ================ + distclean: clean rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) rm -f $(ASN_CONVERTER_SOURCES) $(ASN_CONVERTER_HEADERS) diff --git a/examples/sample.source.MEGACO/Makefile b/examples/sample.source.MEGACO/Makefile index d922a9da1..b1415a2d0 100644 --- a/examples/sample.source.MEGACO/Makefile +++ b/examples/sample.source.MEGACO/Makefile @@ -318,6 +318,19 @@ MegacoMessage.c: ../sample.makefile.regen @touch MegacoMessage.c make +check: ${TARGET} + @if test -f ./sample-MegacoMessage-1.[db]er ; then \ + for f in ./sample-MegacoMessage-*.[db]er; do \ + echo "Recoding $$f into XER and back..."; \ + ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$ || exit 2; \ + ./${TARGET} -ixer -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ + diff ./.tmp.1.$$ ./.tmp.2.$$ || exit 2; \ + rm -f ./.tmp.[12].$$; \ + done; fi + @echo ================ + @echo All tests passed + @echo ================ + distclean: clean rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) rm -f $(ASN_CONVERTER_SOURCES) $(ASN_CONVERTER_HEADERS) diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index 30e89518d..26ca7488f 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -378,6 +378,19 @@ Certificate.c: ../sample.makefile.regen @touch Certificate.c make +check: ${TARGET} + @if test -f ./sample-Certificate-1.[db]er ; then \ + for f in ./sample-Certificate-*.[db]er; do \ + echo "Recoding $$f into XER and back..."; \ + ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$ || exit 2; \ + ./${TARGET} -ixer -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ + diff ./.tmp.1.$$ ./.tmp.2.$$ || exit 2; \ + rm -f ./.tmp.[12].$$; \ + done; fi + @echo ================ + @echo All tests passed + @echo ================ + distclean: clean rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) rm -f $(ASN_CONVERTER_SOURCES) $(ASN_CONVERTER_HEADERS) diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 3643465c2..5a0eccee2 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -297,6 +297,20 @@ INTEGER_map_value2enum(asn_INTEGER_specifics_t *specs, long value) { INTEGER__compar_value2enum); } +static int +INTEGER_st_prealloc(INTEGER_t *st, int min_size) { + void *p = MALLOC(min_size + 1); + if(p) { + void *b = st->buf; + st->size = 0; + st->buf = p; + FREEMEM(b); + return 0; + } else { + return -1; + } +} + /* * Decode the chunk of XML text encoding INTEGER. */ @@ -310,11 +324,19 @@ INTEGER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chun const char *lstop = lstart + chunk_size; enum { ST_SKIPSPACE, + ST_SKIPSPHEX, ST_WAITDIGITS, ST_DIGITS, + ST_HEXDIGIT1, + ST_HEXDIGIT2, + ST_HEXCOLON, ST_EXTRASTUFF } state = ST_SKIPSPACE; + if(chunk_size) + ASN_DEBUG("INTEGER body %d 0x%2x..0x%2x", + chunk_size, *lstart, lstop[-1]); + /* * We may have received a tag here. It will be processed inline. * Use strtoul()-like code and serialize the result. @@ -323,7 +345,19 @@ INTEGER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chun int lv = *lp; switch(lv) { case 0x09: case 0x0a: case 0x0d: case 0x20: - if(state == ST_SKIPSPACE) continue; + switch(state) { + case ST_SKIPSPACE: + case ST_SKIPSPHEX: + continue; + case ST_HEXCOLON: + if(xer_is_whitespace(lp, lstop - lp)) { + lp = lstop - 1; + continue; + } + break; + default: + break; + } break; case 0x2d: /* '-' */ if(state == ST_SKIPSPACE) { @@ -340,7 +374,24 @@ INTEGER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chun break; case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: - if(state != ST_DIGITS) state = ST_DIGITS; + switch(state) { + case ST_DIGITS: break; + case ST_SKIPSPHEX: /* Fall through */ + case ST_HEXDIGIT1: + value = (lv - 0x30) << 4; + state = ST_HEXDIGIT2; + continue; + case ST_HEXDIGIT2: + value += (lv - 0x30); + state = ST_HEXCOLON; + st->buf[st->size++] = value; + continue; + case ST_HEXCOLON: + return XPBD_BROKEN_ENCODING; + default: + state = ST_DIGITS; + break; + } { long new_value = value * 10; @@ -381,22 +432,86 @@ INTEGER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chun ASN_DEBUG("Unknown identifier for INTEGER"); } return XPBD_BROKEN_ENCODING; + case 0x3a: /* ':' */ + if(state == ST_HEXCOLON) { + /* This colon is expected */ + state = ST_HEXDIGIT1; + continue; + } else if(state == ST_DIGITS) { + /* The colon here means that we have + * decoded the first two hexadecimal + * places as a decimal value. + * Switch decoding mode. */ + ASN_DEBUG("INTEGER re-evaluate as hex form"); + if(INTEGER_st_prealloc(st, (chunk_size/3) + 1)) + return XPBD_SYSTEM_FAILURE; + state = ST_SKIPSPHEX; + lp = lstart - 1; + continue; + } else { + ASN_DEBUG("state %d at %d", state, lp - lstart); + break; + } + /* [A-Fa-f] */ + case 0x41:case 0x42:case 0x43:case 0x44:case 0x45:case 0x46: + case 0x61:case 0x62:case 0x63:case 0x64:case 0x65:case 0x66: + switch(state) { + case ST_SKIPSPHEX: + case ST_SKIPSPACE: /* Fall through */ + case ST_HEXDIGIT1: + value = lv - ((lv < 0x61) ? 0x41 : 0x61); + value += 10; + value <<= 4; + state = ST_HEXDIGIT2; + continue; + case ST_HEXDIGIT2: + value += lv - ((lv < 0x61) ? 0x41 : 0x61); + value += 10; + st->buf[st->size++] = value; + state = ST_HEXCOLON; + continue; + case ST_DIGITS: + ASN_DEBUG("INTEGER re-evaluate as hex form"); + if(INTEGER_st_prealloc(st, (chunk_size/3) + 1)) + return XPBD_SYSTEM_FAILURE; + state = ST_SKIPSPHEX; + lp = lstart - 1; + continue; + default: + break; + } + break; } /* Found extra non-numeric stuff */ + ASN_DEBUG("Found non-numeric 0x%2x at %d", + lv, lp - lstart); state = ST_EXTRASTUFF; break; } - if(state != ST_DIGITS) { + switch(state) { + case ST_DIGITS: + /* Everything is cool */ + break; + case ST_HEXCOLON: + st->buf[st->size] = 0; /* Just in case termination */ + return XPBD_BODY_CONSUMED; + case ST_HEXDIGIT1: + case ST_HEXDIGIT2: + case ST_SKIPSPHEX: + return XPBD_BROKEN_ENCODING; + default: if(xer_is_whitespace(lp, lstop - lp)) { if(state != ST_EXTRASTUFF) return XPBD_NOT_BODY_IGNORE; - /* Fall through */ + break; } else { - ASN_DEBUG("No useful digits in output"); + ASN_DEBUG("INTEGER: No useful digits (state %d)", + state); return XPBD_BROKEN_ENCODING; /* No digits */ } + break; } value *= sign; /* Change sign, if needed */ diff --git a/skeletons/converter-sample.c b/skeletons/converter-sample.c index c8ee34f2d..d146f3262 100644 --- a/skeletons/converter-sample.c +++ b/skeletons/converter-sample.c @@ -35,8 +35,10 @@ extern asn_TYPE_descriptor_t *asn_pdu_collection[]; * Open file and parse its contens. */ static void *data_decode_from_file(asn_TYPE_descriptor_t *asnTypeOfPDU, - const char *fname, ssize_t suggested_bufsize); + FILE *f, const char *filename, ssize_t suggested_bufsize); static int write_out(const void *buffer, size_t size, void *key); +static FILE *argument_to_file(char *av[], int idx); +static char *argument_to_name(char *av[], int idx); int opt_debug; /* -d */ static int opt_check; /* -c */ @@ -71,7 +73,7 @@ DEBUG(const char *fmt, ...) { } int -main(int ac, char **av) { +main(int ac, char *av[]) { static asn_TYPE_descriptor_t *pduType = &PDU_Type; ssize_t suggested_bufsize = 8192; /* close or equal to stdio buffer */ int number_of_iterations = 1; @@ -206,15 +208,17 @@ main(int ac, char **av) { * Process all files in turn. */ for(ac_i = 0; ac_i < ac; ac_i++) { - char *fname = av[ac_i]; - void *structure; asn_enc_rval_t erv; + void *structure; /* Decoded structure */ + FILE *file = argument_to_file(av, ac_i); + char *name = argument_to_name(av, ac_i); /* * Decode the encoded structure from file. */ structure = data_decode_from_file(pduType, - fname, suggested_bufsize); + file, name, suggested_bufsize); + if(file && file != stdin) fclose(file); if(!structure) { /* Error message is already printed */ exit(EX_DATAERR); @@ -227,14 +231,14 @@ main(int ac, char **av) { if(asn_check_constraints(pduType, structure, errbuf, &errlen)) { fprintf(stderr, "%s: ASN.1 constraint " - "check failed: %s\n", fname, errbuf); + "check failed: %s\n", name, errbuf); exit(EX_DATAERR); } } switch(oform) { case OUT_NULL: - fprintf(stderr, "%s: decoded successfully\n", fname); + fprintf(stderr, "%s: decoded successfully\n", name); break; case OUT_TEXT: /* -otext */ asn_fprint(stdout, pduType, structure); @@ -242,7 +246,7 @@ main(int ac, char **av) { case OUT_XER: /* -oxer */ if(xer_fprint(stdout, pduType, structure)) { fprintf(stderr, "%s: Cannot convert into XML\n", - fname); + name); exit(EX_UNAVAILABLE); } break; @@ -250,7 +254,7 @@ main(int ac, char **av) { erv = der_encode(pduType, structure, write_out, stdout); if(erv.encoded < 0) { fprintf(stderr, "%s: Cannot convert into DER\n", - fname); + name); exit(EX_UNAVAILABLE); } break; @@ -258,7 +262,7 @@ main(int ac, char **av) { erv = uper_encode(pduType, structure, write_out, stdout); if(erv.encoded < 0) { fprintf(stderr, "%s: Cannot convert into Unaligned PER\n", - fname); + name); exit(EX_UNAVAILABLE); } break; @@ -325,7 +329,8 @@ static void add_bytes_to_buffer(const void *data2add, size_t bySize) { DynamicBuffer.length += bySize; } -static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *fname, ssize_t suggested_bufsize) { +static void * +data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *filename, ssize_t suggested_bufsize) { static char *fbuf; static ssize_t fbuf_size; static asn_codec_ctx_t s_codec_ctx; @@ -333,26 +338,18 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *f void *structure = 0; asn_dec_rval_t rval; size_t rd; - FILE *fp; + + if(!file) { + fprintf(stderr, "%s: %s\n", filename, strerror(errno)); + return 0; + } if(opt_stack) { s_codec_ctx.max_stack_size = opt_stack; opt_codec_ctx = &s_codec_ctx; } - if(strcmp(fname, "-")) { - DEBUG("Processing file %s", fname); - fp = fopen(fname, "r"); - } else { - DEBUG("Processing %s", "standard input"); - fname = "stdin"; - fp = stdin; - } - - if(!fp) { - fprintf(stderr, "%s: %s\n", fname, strerror(errno)); - return 0; - } + DEBUG("Processing %s", filename); /* prepare the file buffer */ if(fbuf_size != suggested_bufsize) { @@ -374,7 +371,7 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *f rval.code = RC_WMORE; rval.consumed = 0; - while((rd = fread(fbuf, 1, fbuf_size, fp)) || !feof(fp)) { + while((rd = fread(fbuf, 1, fbuf_size, file)) || !feof(file)) { char *i_bptr; size_t i_size; @@ -425,7 +422,6 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *f case RC_OK: DEBUG("RC_OK, finishing up with %ld", (long)rval.consumed); - if(fp != stdin) fclose(fp); return structure; case RC_WMORE: /* @@ -448,14 +444,12 @@ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, const char *f break; } - fclose(fp); - /* Clean up partially decoded structure */ ASN_STRUCT_FREE(*pduType, structure); fprintf(stderr, "%s: " "Decode failed past byte %ld: %s\n", - fname, (long)(DynamicBuffer.bytes_shifted + filename, (long)(DynamicBuffer.bytes_shifted + DynamicBuffer.offset + rval.consumed), (rval.code == RC_WMORE) ? "Unexpected end of input" @@ -469,3 +463,27 @@ static int write_out(const void *buffer, size_t size, void *key) { FILE *fp = (FILE *)key; return (fwrite(buffer, 1, size, fp) == size) ? 0 : -1; } + +static int argument_is_stdin(char *av[], int idx) { + if(strcmp(av[idx], "-")) { + return 0; /* Certainly not */ + } else { + /* This might be , unless `./program -- -` */ + if(strcmp(av[-1], "--")) + return 1; + else + return 0; + } +} + +static FILE *argument_to_file(char *av[], int idx) { + return argument_is_stdin(av, idx) + ? stdin + : fopen(av[idx], "r"); +} + +static char *argument_to_name(char *av[], int idx) { + return argument_is_stdin(av, idx) + ? "standard input" + : av[idx]; +} From f5216580411cdb6b2f2d1a95a6352aae391f4e13 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 15 Sep 2006 18:37:21 +0000 Subject: [PATCH 1186/1469] testing code git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1186 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.MHEG5/Makefile | 13 +++++++++++++ examples/sample.source.TAP3/Makefile | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/examples/sample.source.MHEG5/Makefile b/examples/sample.source.MHEG5/Makefile index 641f518ca..011b028c0 100644 --- a/examples/sample.source.MHEG5/Makefile +++ b/examples/sample.source.MHEG5/Makefile @@ -486,6 +486,19 @@ InterchangedObject.c: ../sample.makefile.regen @touch InterchangedObject.c make +check: ${TARGET} + @if test -f ./sample-InterchangedObject-1.[db]er ; then \ + for f in ./sample-InterchangedObject-*.[db]er; do \ + echo "Recoding $$f into XER and back..."; \ + ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$ || exit 2; \ + ./${TARGET} -ixer -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ + diff ./.tmp.1.$$ ./.tmp.2.$$ || exit 2; \ + rm -f ./.tmp.[12].$$; \ + done; fi + @echo ================ + @echo All tests passed + @echo ================ + distclean: clean rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) rm -f $(ASN_CONVERTER_SOURCES) $(ASN_CONVERTER_HEADERS) diff --git a/examples/sample.source.TAP3/Makefile b/examples/sample.source.TAP3/Makefile index ed00cea89..0d6dbcdb1 100644 --- a/examples/sample.source.TAP3/Makefile +++ b/examples/sample.source.TAP3/Makefile @@ -712,6 +712,19 @@ DataInterChange.c: ../sample.makefile.regen @touch DataInterChange.c make +check: ${TARGET} + @if test -f ./sample-DataInterChange-1.[db]er ; then \ + for f in ./sample-DataInterChange-*.[db]er; do \ + echo "Recoding $$f into XER and back..."; \ + ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$ || exit 2; \ + ./${TARGET} -ixer -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ + diff ./.tmp.1.$$ ./.tmp.2.$$ || exit 2; \ + rm -f ./.tmp.[12].$$; \ + done; fi + @echo ================ + @echo All tests passed + @echo ================ + distclean: clean rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) rm -f $(ASN_CONVERTER_SOURCES) $(ASN_CONVERTER_HEADERS) From 8a46324a585c231b23faea9b571ef51c1f67cc9c Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 15 Sep 2006 18:52:36 +0000 Subject: [PATCH 1187/1469] gcc 2.95.x does not like __attribute__ on typedefs git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1187 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_application.h | 3 +-- skeletons/asn_system.h | 10 ++++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/skeletons/asn_application.h b/skeletons/asn_application.h index 3f2a4504e..f40cd86ad 100644 --- a/skeletons/asn_application.h +++ b/skeletons/asn_application.h @@ -36,8 +36,7 @@ typedef int (asn_app_consume_bytes_f)(const void *buffer, size_t size, typedef void (asn_app_constraint_failed_f)(void *application_specific_key, struct asn_TYPE_descriptor_s *type_descriptor_which_failed, const void *structure_which_failed_ptr, - const char *error_message_format, ...) - __attribute__((format(printf, 4, 5))); + const char *error_message_format, ...) GCC_PRINTFLIKE(4, 5); #ifdef __cplusplus } diff --git a/skeletons/asn_system.h b/skeletons/asn_system.h index 568213f54..d7ebdaa4e 100644 --- a/skeletons/asn_system.h +++ b/skeletons/asn_system.h @@ -78,8 +78,14 @@ typedef unsigned int uint32_t; #endif /* WIN32 */ -#ifndef __GNUC__ -#define __attribute__(ignore) +#if __GNUC__ >= 3 +#ifndef GCC_PRINTFLIKE +#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var))) +#endif +#else +#ifndef GCC_PRINTFLIKE +#define GCC_PRINTFLIKE(fmt,var) /* nothing */ +#endif #endif #ifndef offsetof /* If not defined by */ From ebfee8e2f21b7b2385b5450956a3aa9ad3a4f63f Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 15 Sep 2006 22:45:40 +0000 Subject: [PATCH 1188/1469] translate the PDU to a proper alphabet git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1188 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.makefile.regen | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/examples/sample.makefile.regen b/examples/sample.makefile.regen index 0e28ab6a3..8c8be630d 100755 --- a/examples/sample.makefile.regen +++ b/examples/sample.makefile.regen @@ -4,10 +4,11 @@ if [ -z "$ASN1PDU" \ -o -z "$ASN1MODULES" \ -o -z "$PROGNAME" \ ]; then - echo "ASN1PDU=\"$ASN1PDU\"" + echo "ASN1CMDOPTS=\"$ASN1CMDOPTS\"" echo "ASN1MODULES=\"$ASN1MODULES\"" + echo "ASN1PDU=\"$ASN1PDU\"" echo "PROGNAME=\"$PROGNAME\"" - echo "ASN1PDU, ASN1MODULES, and PROGNAME must be set" + echo "ASN1PDU, ASN1MODULES, and PROGNAME are mandatory" exit fi @@ -18,6 +19,8 @@ if [ ! -f Makefile.am.sample ]; then exit 1 fi +ASN1PDU=`echo "$ASN1PDU" | tr - _` + set -x cat Makefile.am.sample \ | sed -e "s/^CFLAGS.*/CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=${ASN1PDU}/" \ From cf9b111d6fea982e596630616a8cf0c414e9741c Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 16 Sep 2006 03:42:09 +0000 Subject: [PATCH 1189/1469] LDAP against PROTOS git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1189 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.LDAP3/README | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/sample.source.LDAP3/README b/examples/sample.source.LDAP3/README index 6fb4e4cb2..4c58cc17c 100644 --- a/examples/sample.source.LDAP3/README +++ b/examples/sample.source.LDAP3/README @@ -6,8 +6,9 @@ The LDAPv3 (Lightweight Directory Access Protocol) PDU decoder. Invoking `make` will compile the ASN.1 specifications from the rfc4211.txt in the above directory. -The ../../skeletons/converter-sample.c will supply the missing -"int main()" routine which drives the decoding process. +This LDAP decoder has been successfully tested against the PROTOS c06-ldapv3 +security test suite: +http://www.ee.oulu.fi/research/ouspg/protos/testing/c06/ldapv3/index.html ldap3dump USAGE ============== From e44e7757e58c21bb7a66679e99135e98a245ba6a Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 16 Sep 2006 03:42:13 +0000 Subject: [PATCH 1190/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1190 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.MEGACO/README | 3 --- examples/sample.source.MHEG5/README | 8 +++----- examples/sample.source.PKIX1/README | 11 ++++------- 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/examples/sample.source.MEGACO/README b/examples/sample.source.MEGACO/README index fb1bfd9a4..447d932e1 100644 --- a/examples/sample.source.MEGACO/README +++ b/examples/sample.source.MEGACO/README @@ -6,9 +6,6 @@ The MEGACO (Media Gateway Control Protocol) PDU decoder. Invoking `make` will compile the ASN.1 specifications from the rfc3525.txt in the above directory. -The ../../skeletons/converter-sample.c will supply the missing -"int main()" routine which drives the decoding process. - megacoDump USAGE ============== diff --git a/examples/sample.source.MHEG5/README b/examples/sample.source.MHEG5/README index 3b8dc0c63..cfb56e5d7 100644 --- a/examples/sample.source.MHEG5/README +++ b/examples/sample.source.MHEG5/README @@ -5,10 +5,8 @@ GENERAL INFORMATION The ISO MHEG-5 (Multimedia Hypermedia Experts Group, Multimedia Presentations) decoder. -Invoking `make` will compile the ASN.1 specifications from the -../ISO13522-MHEG-5.asn file. - -THERE IS NO ISO13522-MHEG-5.asn FILE THERE YET! +Invoking `make` will first attempt compile the ASN.1 specifications from the +../ISO13522-MHEG-5.asn file. THERE IS NO ISO13522-MHEG-5.asn FILE THERE YET! OBTAINING THE MHEG-5 SPECIFICATION ================================== @@ -29,7 +27,7 @@ mheg5dump USAGE The mheg5dump utility may be used to dump the contents of the BER-encoded MHEG-5 data record file: - ./mheg5dump tapfile.der # Print MHEG-5 stream as XML (BASIC-XER) + ./mheg5dump tapfile.ber # Print MHEG-5 stream as XML (BASIC-XER) The full list of recognized command line options may be obtained with diff --git a/examples/sample.source.PKIX1/README b/examples/sample.source.PKIX1/README index b28e817ad..de8e12f89 100644 --- a/examples/sample.source.PKIX1/README +++ b/examples/sample.source.PKIX1/README @@ -5,16 +5,13 @@ GENERAL INFORMATION The X.509 (PKIX1) certificate decoder. Invoking `make` will compile the ASN.1 specifications from the rfc3280.txt in the above directory. -The ../../skeletons/converter-sample.c will supply the missing -"int main()" routine which drives the decoding process. - x509dump USAGE ============== -To use the code, you'll have to prepare an X.509 certificate in DER encoding. -The typical X.509 certificate will have a PEM form (DER encoded data wrapped -in base64, wrapped in PEM "BEGIN" and "END" sections). The openssl x509 utility -may be used to convert between PEM and DER. +To use the x509dump, you'll have to prepare an X.509 certificate +in DER encoding. The typical X.509 certificate will have a PEM format +(DER encoded data wrapped in base64, wrapped in PEM "BEGIN" and "END" sections). +The openssl x509 utility may be used to convert between PEM and DER. EXAMPLE: Convert 'certificate.pem' into 'certificate.der': From fa58cc722cff1222fc878aeac8733222c18b76f1 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 17 Sep 2006 00:20:47 +0000 Subject: [PATCH 1191/1469] -pdu=auto support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1191 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.makefile.regen | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/examples/sample.makefile.regen b/examples/sample.makefile.regen index 8c8be630d..04b5608bd 100755 --- a/examples/sample.makefile.regen +++ b/examples/sample.makefile.regen @@ -1,9 +1,9 @@ #!/bin/sh -if [ -z "$ASN1PDU" \ +if test -z "$ASN1PDU" \ -o -z "$ASN1MODULES" \ -o -z "$PROGNAME" \ - ]; then +; then echo "ASN1CMDOPTS=\"$ASN1CMDOPTS\"" echo "ASN1MODULES=\"$ASN1MODULES\"" echo "ASN1PDU=\"$ASN1PDU\"" @@ -12,18 +12,29 @@ if [ -z "$ASN1PDU" \ exit fi +ASN1PDU=`echo "$ASN1PDU" | tr - _` + ../../asn1c/asn1c -S ../../skeletons ${ASN1CMDOPTS} ${ASN1MODULES} || exit $? -if [ ! -f Makefile.am.sample ]; then +if test ! -f Makefile.am.sample ; then echo "Makefile.am.sample is missing" exit 1 fi -ASN1PDU=`echo "$ASN1PDU" | tr - _` +EXTRA_CFLAGS="" + +if test -f config.h ; then + EXTRA_CFLAGS="$EXTRA_CFLAGS -DHAVE_CONFIG_H" +fi + +FIXEDPDU=`echo "[$ASN1PDU]" | sed -e "s/.*-pdu=auto.*//"` +if test "$FIXEDPDU" ; then + EXTRA_CFLAGS="$EXTRA_CFLAGS -DASN_PDU_COLLECTION" +fi set -x cat Makefile.am.sample \ - | sed -e "s/^CFLAGS.*/CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=${ASN1PDU}/" \ + | sed -e "s/^CFLAGS.*/CFLAGS += -I. $EXTRA_CFLAGS -DPDU=${ASN1PDU}/" \ | sed -e "s/^all: /all: ${ASN1PDU}.c /" \ | sed -e "s/progname/${PROGNAME}/" \ > Makefile.$$ From 8658423a38b3ac9b31b465a02307bcd553e32241 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 17 Sep 2006 00:30:54 +0000 Subject: [PATCH 1192/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1192 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.makefile.regen | 2 +- examples/sample.source.LDAP3/Makefile | 2 +- examples/sample.source.MEGACO/Makefile | 2 +- examples/sample.source.MHEG5/Makefile | 2 +- examples/sample.source.PKIX1/Makefile | 2 +- examples/sample.source.TAP3/Makefile | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/sample.makefile.regen b/examples/sample.makefile.regen index 04b5608bd..57a5350bd 100755 --- a/examples/sample.makefile.regen +++ b/examples/sample.makefile.regen @@ -28,7 +28,7 @@ if test -f config.h ; then fi FIXEDPDU=`echo "[$ASN1PDU]" | sed -e "s/.*-pdu=auto.*//"` -if test "$FIXEDPDU" ; then +if test ! "$FIXEDPDU" ; then EXTRA_CFLAGS="$EXTRA_CFLAGS -DASN_PDU_COLLECTION" fi diff --git a/examples/sample.source.LDAP3/Makefile b/examples/sample.source.LDAP3/Makefile index 5483981c0..6f3c8cd16 100644 --- a/examples/sample.source.LDAP3/Makefile +++ b/examples/sample.source.LDAP3/Makefile @@ -163,7 +163,7 @@ libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) # This file may be used as an input for make(3) # Remove the lines below to convert it into a pure .am file TARGET = ldap3dump -CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=LDAPMessage +CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=LDAPMessage OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} all: LDAPMessage.c $(TARGET) diff --git a/examples/sample.source.MEGACO/Makefile b/examples/sample.source.MEGACO/Makefile index b1415a2d0..d8a930cec 100644 --- a/examples/sample.source.MEGACO/Makefile +++ b/examples/sample.source.MEGACO/Makefile @@ -285,7 +285,7 @@ libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) # This file may be used as an input for make(3) # Remove the lines below to convert it into a pure .am file TARGET = megacoDump -CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=MegacoMessage +CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=MegacoMessage OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} all: MegacoMessage.c $(TARGET) diff --git a/examples/sample.source.MHEG5/Makefile b/examples/sample.source.MHEG5/Makefile index 011b028c0..b07656a64 100644 --- a/examples/sample.source.MHEG5/Makefile +++ b/examples/sample.source.MHEG5/Makefile @@ -453,7 +453,7 @@ libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) # This file may be used as an input for make(3) # Remove the lines below to convert it into a pure .am file TARGET = mheg5dump -CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=InterchangedObject +CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=InterchangedObject OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} all: InterchangedObject.c $(TARGET) diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index 26ca7488f..8f902b295 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -345,7 +345,7 @@ libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) # This file may be used as an input for make(3) # Remove the lines below to convert it into a pure .am file TARGET = x509dump -CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=Certificate +CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=Certificate OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} all: Certificate.c $(TARGET) diff --git a/examples/sample.source.TAP3/Makefile b/examples/sample.source.TAP3/Makefile index 0d6dbcdb1..3dfb47f7b 100644 --- a/examples/sample.source.TAP3/Makefile +++ b/examples/sample.source.TAP3/Makefile @@ -679,7 +679,7 @@ libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) # This file may be used as an input for make(3) # Remove the lines below to convert it into a pure .am file TARGET = tap3dump -CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=DataInterChange +CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=DataInterChange OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} all: DataInterChange.c $(TARGET) From f556dd8a2a3ccc82706ac5e67d1f72449115325c Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 17 Sep 2006 00:38:30 +0000 Subject: [PATCH 1193/1469] *** empty log message *** git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1193 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.makefile.regen | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/sample.makefile.regen b/examples/sample.makefile.regen index 57a5350bd..7b6eae33b 100755 --- a/examples/sample.makefile.regen +++ b/examples/sample.makefile.regen @@ -27,7 +27,7 @@ if test -f config.h ; then EXTRA_CFLAGS="$EXTRA_CFLAGS -DHAVE_CONFIG_H" fi -FIXEDPDU=`echo "[$ASN1PDU]" | sed -e "s/.*-pdu=auto.*//"` +FIXEDPDU=`echo "[$ASN1CMDOPTS]" | sed -e "s/.*-pdu=auto.*//"` if test ! "$FIXEDPDU" ; then EXTRA_CFLAGS="$EXTRA_CFLAGS -DASN_PDU_COLLECTION" fi From 8d3e6d5a700454a569860e646d56d4664c1a24e2 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 17 Sep 2006 01:27:44 +0000 Subject: [PATCH 1194/1469] problem fixed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1194 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/BMPString.c | 3 ++- skeletons/UTF8String.c | 11 +++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/skeletons/BMPString.c b/skeletons/BMPString.c index 1bfb174f3..d6a9308f1 100644 --- a/skeletons/BMPString.c +++ b/skeletons/BMPString.c @@ -111,7 +111,7 @@ BMPString_decode_xer(asn_codec_ctx_t *opt_codec_ctx, if(1) { /* Swap byte order and trim encoding to 2 bytes */ uint32_t *wc = wcs; - uint32_t *wc_end = wcs + wcs_len + 1; + uint32_t *wc_end = wcs + wcs_len; uint16_t *dstwc = (uint16_t *)wcs; for(; wc < wc_end; wc++, dstwc++) { uint32_t wch = *wc; @@ -131,6 +131,7 @@ BMPString_decode_xer(asn_codec_ctx_t *opt_codec_ctx, rc.consumed = 0; return rc; } else { + dstwc[2 * wcs_len] = 0; wcs = (uint32_t *)dstwc; } } diff --git a/skeletons/UTF8String.c b/skeletons/UTF8String.c index 3cd574d5b..e3f738818 100644 --- a/skeletons/UTF8String.c +++ b/skeletons/UTF8String.c @@ -1,5 +1,6 @@ /*- - * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Copyright (c) 2003, 2004, 2006 Lev Walkin . + * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include @@ -103,6 +104,7 @@ UTF8String__process(const UTF8String_t *st, uint32_t *dst, size_t dstlen) { size_t length; uint8_t *buf = st->buf; uint8_t *end = buf + st->size; + uint32_t *dstend = dst + dstlen; for(length = 0; buf < end; length++) { int ch = *buf; @@ -127,7 +129,7 @@ UTF8String__process(const UTF8String_t *st, uint32_t *dst, size_t dstlen) { /* Check character sequence length */ if(buf + want > end) return U8E_TRUNC; - value = ch & (0xff >> (want + 1)); + value = ch & (0xff >> want); cend = buf + want; for(buf++; buf < cend; buf++) { ch = *buf; @@ -136,10 +138,11 @@ UTF8String__process(const UTF8String_t *st, uint32_t *dst, size_t dstlen) { } if(value < UTF8String_mv[want]) return U8E_NOTMIN; - if(dstlen) *dst++ = value; /* Record value */ + if(dst < dstend) + *dst++ = value; /* Record value */ } - if(dstlen) *dst = 0; /* zero-terminate */ + if(dst < dstend) *dst = 0; /* zero-terminate */ return length; } From 66cea38b0898d703138e3a64c2410a98006669ae Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 17 Sep 2006 02:57:40 +0000 Subject: [PATCH 1195/1469] this is necessary to avoid being unable to remove thousand sources (in RRC we have 4700 source files) git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1195 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.makefile.regen | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/sample.makefile.regen b/examples/sample.makefile.regen index 7b6eae33b..eb0958f0a 100755 --- a/examples/sample.makefile.regen +++ b/examples/sample.makefile.regen @@ -63,7 +63,8 @@ cat Makefile.am.sample \ echo ' @echo ================' echo echo "distclean: clean" - echo ' rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS)' + echo ' rm -f $(ASN_MODULE_SOURCES)' + echo ' rm -f $(ASN_MODULE_HEADERS)' echo ' rm -f $(ASN_CONVERTER_SOURCES) $(ASN_CONVERTER_HEADERS)' echo " rm -f Makefile.am.sample" ) >> Makefile.$$ From 6f0e0645952b825e0fa24ad589e6c6cb02a10ec7 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 17 Sep 2006 03:27:57 +0000 Subject: [PATCH 1196/1469] 3GPP Radio Resource Control git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1196 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/README | 15 +- examples/sample.source.RRC/Makefile | 4793 +++++++++++++++++++++++++++ examples/sample.source.RRC/README | 48 + examples/sample.source.RRC/config.h | 10 + 4 files changed, 4860 insertions(+), 6 deletions(-) create mode 100644 examples/sample.source.RRC/Makefile create mode 100644 examples/sample.source.RRC/README create mode 100644 examples/sample.source.RRC/config.h diff --git a/examples/README b/examples/README index 85247f390..2e317f54e 100644 --- a/examples/README +++ b/examples/README @@ -4,10 +4,7 @@ This directory contains a few examples. 1. The ./sample.source.PKIX1 directory contains the X.509 Certificate decoder, as specified in rfc3280.txt. Just type `make` in there to compile. -2. The ./sample.source.TAP3 directory contains the GSM TAP3 decoder. - Before trying to compile, read the README file in that directory. - -3. The ./sample.source.MHEG5 directory contains the decoder for +2. The ./sample.source.MHEG5 directory contains the decoder for ISO 13522 MHEG-5/ITU-T T.172 (Multimedia Hypermedia Experts Group, Multimedia Presentations). Read the README file in that directory. @@ -18,6 +15,14 @@ This directory contains a few examples. Lightweight Directory Access Protocol version 3 PDU as specified in rfc4211.txt. +5. The ./sample.source.TAP3 directory contains the GSM TAP3 decoder. + Before trying to compile, read the README file in that directory. + +6. The ./sample.source.RRC directory contains the 3GPP Radio Resource Control + decoder. Before trying to compile, read the README file in that directory. + +The clyx2asn1.pl script can be used to extract ASN.1 data from LyX editor files. + The crfc2asn1.pl script can be used to extract ASN.1 data from RFC texts. For instance, it is used to extract X.509, MEGACO, and LDAPv3 ASN.1 modules from the corresponding RFC texts (rfc3280.txt, rfc3525.txt, rfc4211.txt). @@ -25,5 +30,3 @@ from the corresponding RFC texts (rfc3280.txt, rfc3525.txt, rfc4211.txt). To regenerate the .asn1 files from the original RFC texts, execute `make clean; make` in the current directory. -The clyx2asn1.pl script can be used to extract ASN.1 data from LyX editor files. - diff --git a/examples/sample.source.RRC/Makefile b/examples/sample.source.RRC/Makefile new file mode 100644 index 000000000..f44792615 --- /dev/null +++ b/examples/sample.source.RRC/Makefile @@ -0,0 +1,4793 @@ +ASN_MODULE_SOURCES= \ + DL-DCCH-Message.c \ + DL-DCCH-MessageType.c \ + UL-DCCH-Message.c \ + UL-DCCH-MessageType.c \ + DL-CCCH-Message.c \ + DL-CCCH-MessageType.c \ + UL-CCCH-Message.c \ + UL-CCCH-MessageType.c \ + PCCH-Message.c \ + PCCH-MessageType.c \ + DL-SHCCH-Message.c \ + DL-SHCCH-MessageType.c \ + UL-SHCCH-Message.c \ + UL-SHCCH-MessageType.c \ + BCCH-FACH-Message.c \ + BCCH-FACH-MessageType.c \ + BCCH-BCH-Message.c \ + MCCH-Message.c \ + MCCH-MessageType.c \ + MSCH-Message.c \ + MSCH-MessageType.c \ + ActiveSetUpdate.c \ + ActiveSetUpdate-r3-IEs.c \ + ActiveSetUpdate-v4b0ext-IEs.c \ + ActiveSetUpdate-v590ext-IEs.c \ + ActiveSetUpdate-v690ext-IEs.c \ + ActiveSetUpdate-r6-IEs.c \ + ActiveSetUpdateComplete.c \ + ActiveSetUpdateFailure.c \ + AssistanceDataDelivery.c \ + AssistanceDataDelivery-r3-IEs.c \ + AssistanceDataDelivery-v3a0ext.c \ + AssistanceDataDelivery-v4b0ext-IEs.c \ + CellChangeOrderFromUTRAN.c \ + CellChangeOrderFromUTRAN-r3-IEs.c \ + CellChangeOrderFromUTRAN-v590ext-IEs.c \ + CellChangeOrderFromUTRANFailure.c \ + CellChangeOrderFromUTRANFailure-r3-IEs.c \ + CellUpdate.c \ + CellUpdate-v590ext.c \ + CellUpdate-v690ext-IEs.c \ + CellUpdate-v7xyext-IEs.c \ + CellUpdateConfirm.c \ + CellUpdateConfirm-r3-IEs.c \ + CellUpdateConfirm-v3a0ext.c \ + CellUpdateConfirm-v4b0ext-IEs.c \ + CellUpdateConfirm-v590ext-IEs.c \ + CellUpdateConfirm-v5d0ext-IEs.c \ + CellUpdateConfirm-r4-IEs.c \ + CellUpdateConfirm-r5-IEs.c \ + CellUpdateConfirm-r6-IEs.c \ + CellUpdateConfirm-v690ext-IEs.c \ + CellUpdateConfirm-r7-IEs.c \ + CellUpdateConfirm-CCCH.c \ + CounterCheck.c \ + CounterCheck-r3-IEs.c \ + CounterCheckResponse.c \ + DownlinkDirectTransfer.c \ + DownlinkDirectTransfer-r3-IEs.c \ + HandoverToUTRANCommand.c \ + HandoverToUTRANCommand-r3-IEs.c \ + HandoverToUTRANCommand-r4-IEs.c \ + HandoverToUTRANCommand-r5-IEs.c \ + HandoverToUTRANCommand-r6-IEs.c \ + HandoverToUTRANCommand-r7-IEs.c \ + HandoverToUTRANComplete.c \ + InitialDirectTransfer.c \ + InitialDirectTransfer-v3a0ext.c \ + InitialDirectTransfer-v590ext.c \ + InitialDirectTransfer-v690ext-IEs.c \ + HandoverFromUTRANCommand-GSM.c \ + HandoverFromUTRANCommand-GSM-r3-IEs.c \ + HandoverFromUTRANCommand-GSM-r6-IEs.c \ + HandoverFromUTRANCommand-GSM-v690ext-IEs.c \ + HandoverFromUTRANCommand-GERANIu.c \ + HandoverFromUTRANCommand-GERANIu-r5-IEs.c \ + HandoverFromUTRANCommand-CDMA2000.c \ + HandoverFromUTRANCommand-CDMA2000-r3-IEs.c \ + HandoverFromUTRANFailure.c \ + HandoverFromUtranFailure-v590ext-IEs.c \ + InterRATHandoverInfo.c \ + InterRATHandoverInfo-v390ext-IEs.c \ + InterRATHandoverInfo-v3a0ext-IEs.c \ + InterRATHandoverInfo-v3d0ext-IEs.c \ + InterRATHandoverInfo-v3g0ext-IEs.c \ + InterRATHandoverInfo-r3-add-ext-IEs.c \ + InterRATHandoverInfo-v4b0ext-IEs.c \ + InterRATHandoverInfo-v4d0ext-IEs.c \ + InterRATHandoverInfo-v590ext-IEs.c \ + InterRATHandoverInfo-v690ext1-IEs.c \ + InterRATHandoverInfo-v690ext-IEs.c \ + InterRATHandoverInfo-v7xyext-IEs.c \ + MeasurementControl.c \ + MeasurementControl-r3-IEs.c \ + MeasurementControl-v390ext.c \ + MeasurementControl-v3a0ext.c \ + MeasurementControl-r4-IEs.c \ + MeasurementControl-v590ext-IEs.c \ + MeasurementControl-v5b0ext-IEs.c \ + MeasurementControl-r6-IEs.c \ + MeasurementControl-v6a0ext-IEs.c \ + MeasurementControl-v7xyext-IEs.c \ + MeasurementControlFailure.c \ + MeasurementControlFailure-v590ext-IEs.c \ + MeasurementReport.c \ + MeasurementReport-v390ext.c \ + MeasurementReport-v4b0ext-IEs.c \ + MeasurementReport-v590ext-IEs.c \ + MeasurementReport-v5b0ext-IEs.c \ + MeasurementReport-v690ext-IEs.c \ + MeasurementReport-v7xyext-IEs.c \ + PagingType1.c \ + PagingType1-v590ext-IEs.c \ + PagingType2.c \ + PhysicalChannelReconfiguration.c \ + PhysicalChannelReconfiguration-r3-IEs.c \ + PhysicalChannelReconfiguration-v3a0ext.c \ + PhysicalChannelReconfiguration-v4b0ext-IEs.c \ + PhysicalChannelReconfiguration-v590ext-IEs.c \ + PhysicalChannelReconfiguration-r4-IEs.c \ + PhysicalChannelReconfiguration-r5-IEs.c \ + PhysicalChannelReconfiguration-r6-IEs.c \ + PhysicalChannelReconfiguration-v690ext-IEs.c \ + PhysicalChannelReconfiguration-r7-IEs.c \ + PhysicalChannelReconfigurationComplete.c \ + PhysicalChannelReconfigurationComplete-v7xyext-IEs.c \ + PhysicalChannelReconfigurationFailure.c \ + PhysicalSharedChannelAllocation.c \ + PhysicalSharedChannelAllocation-r3-IEs.c \ + PhysicalSharedChannelAllocation-r4-IEs.c \ + PhysicalSharedChannelAllocation-v690ext-IEs.c \ + PhysicalSharedChannelAllocation-v7xyext-IEs.c \ + PUSCHCapacityRequest.c \ + PUSCHCapacityRequest-v590ext.c \ + RadioBearerReconfiguration.c \ + RadioBearerReconfiguration-r3-IEs.c \ + RadioBearerReconfiguration-v3a0ext.c \ + RadioBearerReconfiguration-v4b0ext-IEs.c \ + RadioBearerReconfiguration-v590ext-IEs.c \ + RadioBearerReconfiguration-v5d0ext-IEs.c \ + RadioBearerReconfiguration-r4-IEs.c \ + RadioBearerReconfiguration-r5-IEs.c \ + RadioBearerReconfiguration-r6-IEs.c \ + RadioBearerReconfiguration-v690ext-IEs.c \ + RadioBearerReconfiguration-r7-IEs.c \ + RadioBearerReconfigurationComplete.c \ + RadioBearerReconfigurationComplete-v7xyext-IEs.c \ + RadioBearerReconfigurationFailure.c \ + RadioBearerRelease.c \ + RadioBearerRelease-r3-IEs.c \ + RadioBearerRelease-v3a0ext.c \ + RadioBearerRelease-v4b0ext-IEs.c \ + RadioBearerRelease-v590ext-IEs.c \ + RadioBearerRelease-r4-IEs.c \ + RadioBearerRelease-r5-IEs.c \ + RadioBearerRelease-v690ext-IEs.c \ + RadioBearerRelease-r6-IEs.c \ + RadioBearerRelease-r7-IEs.c \ + RadioBearerReleaseComplete.c \ + RadioBearerReleaseComplete-v7xyext-IEs.c \ + RadioBearerReleaseFailure.c \ + RadioBearerSetup.c \ + RadioBearerSetup-r3-IEs.c \ + RadioBearerSetup-v3a0ext.c \ + RadioBearerSetup-v4b0ext-IEs.c \ + RadioBearerSetup-v590ext-IEs.c \ + RadioBearerSetup-v5d0ext-IEs.c \ + RadioBearerSetup-r4-IEs.c \ + RadioBearerSetup-r5-IEs.c \ + RadioBearerSetup-v690ext-IEs.c \ + RadioBearerSetup-r6-IEs.c \ + RadioBearerSetup-r7-IEs.c \ + RadioBearerSetupComplete.c \ + RadioBearerSetupComplete-v7xyext-IEs.c \ + RadioBearerSetupFailure.c \ + RRCConnectionReject.c \ + RRCConnectionReject-r3-IEs.c \ + RRCConnectionReject-v690ext-IEs.c \ + RRCConnectionRelease.c \ + RRCConnectionRelease-r3-IEs.c \ + RRCConnectionRelease-r4-IEs.c \ + RRCConnectionRelease-v690ext-IEs.c \ + RRCConnectionRelease-CCCH.c \ + RRCConnectionRelease-CCCH-r3-IEs.c \ + RRCConnectionRelease-CCCH-r4-IEs.c \ + RRCConnectionRelease-CCCH-r5-IEs.c \ + RRCConnectionRelease-CCCH-v690ext-IEs.c \ + RRCConnectionReleaseComplete.c \ + RRCConnectionRequest.c \ + RRCConnectionRequest-v3d0ext-IEs.c \ + RRCConnectionRequest-v4b0ext-IEs.c \ + RRCConnectionRequest-v590ext-IEs.c \ + RRCConnectionRequest-v690ext-IEs.c \ + RRCConnectionSetup.c \ + RRCConnectionSetup-r3-IEs.c \ + RRCConnectionSetup-v4b0ext-IEs.c \ + RRCConnectionSetup-v590ext-IEs.c \ + RRCConnectionSetup-r4-IEs.c \ + RRCConnectionSetup-r5-IEs.c \ + RRCConnectionSetup-v690ext-IEs.c \ + RRCConnectionSetup-r6-IEs.c \ + RRCConnectionSetup-r7-IEs.c \ + RRCConnectionSetup-v7xyext-IEs.c \ + RRCConnectionSetupComplete.c \ + RRCConnectionSetupComplete-v370ext.c \ + RRCConnectionSetupComplete-v380ext-IEs.c \ + RRCConnectionSetupComplete-v3a0ext-IEs.c \ + RRCConnectionSetupComplete-v3g0ext-IEs.c \ + RRCConnectionSetupComplete-r3-add-ext-IEs.c \ + RRCConnectionSetupComplete-v4b0ext-IEs.c \ + RRCConnectionSetupComplete-v590ext-IEs.c \ + RRCConnectionSetupComplete-v5c0ext-IEs.c \ + RRCConnectionSetupComplete-v650ext-IEs.c \ + RRCConnectionSetupComplete-v680ext-IEs.c \ + RRCConnectionSetupComplete-v690ext-IEs.c \ + RRCConnectionSetupComplete-v7xyext-IEs.c \ + RRC-FailureInfo.c \ + RRC-FailureInfo-r3-IEs.c \ + RRCStatus.c \ + SecurityModeCommand.c \ + SecurityModeCommand-r3-IEs.c \ + SecurityModeComplete.c \ + SecurityModeFailure.c \ + SignallingConnectionRelease.c \ + SignallingConnectionRelease-r3-IEs.c \ + SignallingConnectionReleaseIndication.c \ + SystemInformation-BCH.c \ + SystemInformation-FACH.c \ + FirstSegment.c \ + FirstSegmentShort.c \ + SubsequentSegment.c \ + LastSegment.c \ + LastSegmentShort.c \ + CompleteSIB-List.c \ + CompleteSIB.c \ + CompleteSIBshort.c \ + SystemInformationChangeIndication.c \ + TransportChannelReconfiguration.c \ + TransportChannelReconfiguration-r3-IEs.c \ + TransportChannelReconfiguration-v3a0ext.c \ + TransportChannelReconfiguration-v4b0ext-IEs.c \ + TransportChannelReconfiguration-v590ext-IEs.c \ + TransportChannelReconfiguration-r4-IEs.c \ + TransportChannelReconfiguration-r5-IEs.c \ + TransportChannelReconfiguration-v690ext-IEs.c \ + TransportChannelReconfiguration-r6-IEs.c \ + TransportChannelReconfiguration-r7-IEs.c \ + TransportChannelReconfigurationComplete.c \ + TransportChannelReconfigurationComplete-v7xyext-IEs.c \ + TransportChannelReconfigurationFailure.c \ + TransportFormatCombinationControl.c \ + TransportFormatCombinationControlFailure.c \ + UECapabilityEnquiry.c \ + UECapabilityEnquiry-r3-IEs.c \ + UECapabilityEnquiry-v4b0ext-IEs.c \ + UECapabilityEnquiry-v590ext-IEs.c \ + UECapabilityEnquiry-v7xyext-IEs.c \ + UECapabilityInformation.c \ + UECapabilityInformation-v370ext.c \ + UECapabilityInformation-v380ext-IEs.c \ + UECapabilityInformation-v3a0ext-IEs.c \ + UECapabilityInformation-r3-add-ext-IEs.c \ + UECapabilityInformation-v4b0ext.c \ + UECapabilityInformation-v590ext.c \ + UECapabilityInformation-v5c0ext.c \ + UECapabilityInformation-v650ext-IEs.c \ + UECapabilityInformation-v680ext-IEs.c \ + UECapabilityInformation-v690ext-IEs.c \ + UECapabilityInformation-v7xyext-IEs.c \ + UECapabilityInformationConfirm.c \ + UECapabilityInformationConfirm-r3-IEs.c \ + UplinkDirectTransfer.c \ + UplinkDirectTransfer-v690ext-IEs.c \ + UplinkPhysicalChannelControl.c \ + UplinkPhysicalChannelControl-r3-IEs.c \ + UplinkPhysicalChannelControl-v4b0ext-IEs.c \ + UplinkPhysicalChannelControl-r4-IEs.c \ + UplinkPhysicalChannelControl-r5-IEs.c \ + UplinkPhysicalChannelControl-v690ext-IEs.c \ + UplinkPhysicalChannelControl-v6a0ext-IEs.c \ + UplinkPhysicalChannelControl-r7-IEs.c \ + URAUpdate.c \ + URAUpdateConfirm.c \ + URAUpdateConfirm-r3-IEs.c \ + URAUpdateConfirm-r5-IEs.c \ + URAUpdateConfirm-v690ext-IEs.c \ + URAUpdateConfirm-CCCH.c \ + URAUpdateConfirm-CCCH-r3-IEs.c \ + UTRANMobilityInformation.c \ + UTRANMobilityInformation-r3-IEs.c \ + UTRANMobilityInformation-v3a0ext-IEs.c \ + UTRANMobilityInformation-r5-IEs.c \ + UtranMobilityInformation-v690ext-IEs.c \ + UTRANMobilityInformationConfirm.c \ + UTRANMobilityInformationFailure.c \ + MBMSAccessInformation.c \ + MBMSCommonPTMRBInformation.c \ + MBMSCurrentCellPTMRBInformation.c \ + MBMSGeneralInformation.c \ + MBMSGeneralInformation-v7xyext-IEs.c \ + MBMSModificationRequest.c \ + MBMSModifiedServicesInformation.c \ + MBMSNeighbouringCellPTMRBInformation.c \ + MBMSSchedulingInformation.c \ + MBMSUnmodifiedServicesInformation.c \ + Ansi-41-IDNNS.c \ + CN-DomainIdentity.c \ + CN-DomainInformation.c \ + CN-DomainInformationFull.c \ + CN-DomainInformationList.c \ + CN-DomainInformationListFull.c \ + CN-DomainSysInfo.c \ + CN-DomainSysInfoList.c \ + CN-InformationInfo.c \ + CN-InformationInfo-r6.c \ + CN-InformationInfoFull.c \ + Digit.c \ + Gsm-map-IDNNS.c \ + IMEI.c \ + IMEI-Digit.c \ + IMSI-GSM-MAP.c \ + IntraDomainNasNodeSelector.c \ + LAI.c \ + MCC.c \ + MNC.c \ + MultiplePLMN-List-r6.c \ + NAS-Message.c \ + NAS-Synchronisation-Indicator.c \ + NAS-SystemInformationGSM-MAP.c \ + P-TMSI-GSM-MAP.c \ + PagingRecordTypeID.c \ + PLMN-Identity.c \ + PLMN-IdentityWithOptionalMCC-r6.c \ + PLMN-Type.c \ + RAB-Identity.c \ + RAI.c \ + RoutingAreaCode.c \ + RoutingParameter.c \ + TMSI-GSM-MAP.c \ + AccessClassBarred.c \ + AccessClassBarredList.c \ + AllowedIndicator.c \ + CellAccessRestriction.c \ + CellBarred.c \ + CellIdentity.c \ + CellIdentity-PerRL-List.c \ + CellSelectReselectInfoSIB-3-4.c \ + DomainSpecificAccessRestrictionForSharedNetwork-v670ext.c \ + DomainSpecificAccessRestrictionList-v670ext.c \ + DomainSpecificAccessRestrictionParam-v670ext.c \ + DomainSpecificAccessRestriction-v670ext.c \ + MapParameter.c \ + Mapping.c \ + Mapping-LCR-r4.c \ + MappingFunctionParameter.c \ + MappingFunctionParameterList.c \ + MappingFunctionType.c \ + MappingInfo.c \ + Q-Hyst-S.c \ + Q-Hyst-S-Fine.c \ + RAT.c \ + RAT-FDD-Info.c \ + RAT-FDD-InfoList.c \ + RAT-Identifier.c \ + RAT-TDD-Info.c \ + RAT-TDD-InfoList.c \ + ReservedIndicator.c \ + S-SearchQual.c \ + S-SearchRXLEV.c \ + SpeedDependentScalingFactor.c \ + T-Barred.c \ + T-Reselection-S.c \ + T-Reselection-S-Fine.c \ + TreselectionScalingFactor.c \ + UpperLimit.c \ + URA-Identity.c \ + URA-IdentityList.c \ + AccessStratumReleaseIndicator.c \ + ActivationTime.c \ + BackoffControlParams.c \ + C-RNTI.c \ + CapabilityUpdateRequirement.c \ + CapabilityUpdateRequirement-r4-ext.c \ + CapabilityUpdateRequirement-r4.c \ + CapabilityUpdateRequirement-r7-ext.c \ + CellUpdateCause.c \ + CellUpdateCause-ext.c \ + ChipRateCapability.c \ + ChipRateCapability-r7.c \ + CipheringAlgorithm.c \ + CipheringModeCommand.c \ + CipheringModeInfo.c \ + CN-DRX-CycleLengthCoefficient.c \ + CN-PagedUE-Identity.c \ + CompressedModeMeasCapability.c \ + CompressedModeMeasCapability-LCR-r4.c \ + CompressedModeMeasCapabFDDList.c \ + CompressedModeMeasCapabFDDList2.c \ + CompressedModeMeasCapabFDDList-ext.c \ + CompressedModeMeasCapabFDD.c \ + CompressedModeMeasCapabFDD2.c \ + CompressedModeMeasCapabFDD-ext.c \ + CompressedModeMeasCapabTDDList.c \ + CompressedModeMeasCapabTDD.c \ + CompressedModeMeasCapabGSMList.c \ + CompressedModeMeasCapabGSM.c \ + CompressedModeMeasCapabMC.c \ + CPCH-Parameters.c \ + DL-CapabilityWithSimultaneousHS-DSCHConfig.c \ + DL-DPCCH-BER.c \ + DL-PhysChCapabilityFDD.c \ + DL-PhysChCapabilityFDD-v380ext.c \ + SupportOfDedicatedPilotsForChEstimation.c \ + DL-PhysChCapabilityTDD.c \ + DL-PhysChCapabilityTDD-LCR-r4.c \ + DL-PhysChCapabilityTDD-768.c \ + DL-TransChCapability.c \ + DRAC-SysInfo.c \ + DRAC-SysInfoList.c \ + DSCH-RNTI.c \ + DelayRestrictionFlag.c \ + E-RNTI.c \ + ESN-DS-41.c \ + EstablishmentCause.c \ + FailureCauseWithProtErr.c \ + FailureCauseWithProtErrTrId.c \ + GroupIdentityWithReleaseInformation.c \ + GroupReleaseInformation.c \ + GSM-Measurements.c \ + H-RNTI.c \ + HSDSCH-physical-layer-category.c \ + UESpecificBehaviourInformation1idle.c \ + UESpecificBehaviourInformation1interRAT.c \ + IMSI-and-ESN-DS-41.c \ + IMSI-DS-41.c \ + InitialPriorityDelayList.c \ + InitialUE-Identity.c \ + IntegrityCheckInfo.c \ + IntegrityProtActivationInfo.c \ + IntegrityProtectionAlgorithm.c \ + IntegrityProtectionModeCommand.c \ + IntegrityProtectionModeInfo.c \ + IntegrityProtInitNumber.c \ + MaxHcContextSpace.c \ + MaxHcContextSpace-r5-ext.c \ + MaxROHC-ContextSessions-r4.c \ + MaximumAM-EntityNumberRLC-Cap.c \ + MaximumBitRate.c \ + MaximumRLC-WindowSize.c \ + MaxNoDPDCH-BitsTransmitted.c \ + MaxNoBits.c \ + MaxNoPhysChBitsReceived.c \ + MaxNoSCCPCH-RL.c \ + MaxNumberOfTF.c \ + MaxNumberOfTFC-DL.c \ + MaxNumberOfTFC-UL.c \ + MaxPhysChPerFrame.c \ + MaxPhysChPerFrame-768.c \ + MaxPhysChPerSubFrame-r4.c \ + MaxPhysChPerTimeslot.c \ + MaxPhysChPerTS.c \ + MaxPhysChPerTS-768.c \ + MaxSimultaneousCCTrCH-Count.c \ + MaxSimultaneousTransChsDL.c \ + MaxSimultaneousTransChsUL.c \ + MaxTransportBlocksDL.c \ + MaxTransportBlocksUL.c \ + MaxTS-PerFrame.c \ + MaxTS-PerSubFrame-r4.c \ + MeasurementCapability.c \ + MeasurementCapabilityExt.c \ + MeasurementCapabilityExt2.c \ + MeasurementCapability-r4-ext.c \ + MessageAuthenticationCode.c \ + MinimumSF-DL.c \ + MinimumSF-DL-768.c \ + MinimumSF-UL.c \ + MultiModeCapability.c \ + MultiRAT-Capability.c \ + MultiModeRAT-Capability-v590ext.c \ + MultiModeRAT-Capability-v680ext.c \ + N-300.c \ + N-301.c \ + N-302.c \ + N-304.c \ + N-308.c \ + N-310.c \ + N-312.c \ + N-312ext.c \ + N-312-r5.c \ + N-313.c \ + N-315.c \ + N-315ext.c \ + N-315-r5.c \ + N-AccessFails.c \ + N-AP-RetransMax.c \ + NetworkAssistedGPS-Supported.c \ + NF-BO-AllBusy.c \ + NF-BO-NoAICH.c \ + NF-BO-Mismatch.c \ + NS-BO-Busy.c \ + NS-IP.c \ + P-TMSI-and-RAI-GSM-MAP.c \ + PagingCause.c \ + PagingRecord.c \ + PagingRecord2-r5.c \ + PagingRecordList.c \ + PagingRecord2List-r5.c \ + PDCP-Capability.c \ + PDCP-Capability-r4-ext.c \ + PDCP-Capability-r5-ext.c \ + PDCP-Capability-r5-ext2.c \ + PhysicalChannelCapability.c \ + PhysicalChannelCapability-r7.c \ + PhysicalChannelCapability-LCR-r4.c \ + PhysicalChannelCapability-hspdsch-r5.c \ + PNBSCH-Allocation-r4.c \ + ProtocolErrorCause.c \ + ProtocolErrorIndicator.c \ + ProtocolErrorIndicatorWithMoreInfo.c \ + ProtocolErrorMoreInformation.c \ + RadioFrequencyBandFDD.c \ + RadioFrequencyBandFDD2.c \ + RadioFrequencyBandTDDList.c \ + RadioFrequencyBandTDD.c \ + RadioFrequencyBandGSM.c \ + Rb-timer-indicator.c \ + Re-EstablishmentTimer.c \ + RedirectionInfo.c \ + RedirectionInfo-r6.c \ + RejectionCause.c \ + ReleaseCause.c \ + RF-Capability.c \ + RF-Capability-r4-ext.c \ + RF-Capability-r7.c \ + RLC-Capability.c \ + RLC-Capability-r5-ext.c \ + RRC-ConnectionReleaseInformation.c \ + RRC-MessageSequenceNumber.c \ + RRC-MessageSequenceNumberList.c \ + RRC-StateIndicator.c \ + RRC-TransactionIdentifier.c \ + S-RNTI.c \ + S-RNTI-2.c \ + SecurityCapability.c \ + Serving-HSDSCH-CellInformation.c \ + SimultaneousSCCPCH-DPCH-Reception.c \ + SRNC-Identity.c \ + START-Value.c \ + STARTList.c \ + STARTSingle.c \ + CapabilityUpdateRequirement-r5.c \ + SystemSpecificCapUpdateReq.c \ + SystemSpecificCapUpdateReq-v590ext.c \ + SystemSpecificCapUpdateReq-r5.c \ + SystemSpecificCapUpdateReqList.c \ + SystemSpecificCapUpdateReqList-r5.c \ + T-300.c \ + T-301.c \ + T-302.c \ + T-304.c \ + T-305.c \ + T-307.c \ + T-308.c \ + T-309.c \ + T-310.c \ + T-311.c \ + T-312.c \ + T-313.c \ + T-314.c \ + T-315.c \ + T-316.c \ + T-317.c \ + T-318.c \ + T-CPCH.c \ + TMSI-and-LAI-GSM-MAP.c \ + TMSI-DS-41.c \ + TotalRLC-AM-BufferSize.c \ + TotalRLC-AM-BufferSize-r5-ext.c \ + TransmissionProbability.c \ + TransportChannelCapability.c \ + TurboSupport.c \ + TxRxFrequencySeparation.c \ + U-RNTI.c \ + U-RNTI-Group.c \ + U-RNTI-Short.c \ + UE-CapabilityContainer-IEs.c \ + UE-ConnTimersAndConstants.c \ + UE-ConnTimersAndConstants-v3a0ext.c \ + UE-ConnTimersAndConstants-r5.c \ + UE-IdleTimersAndConstants.c \ + UE-IdleTimersAndConstants-v3a0ext.c \ + UE-MultiModeRAT-Capability.c \ + UE-PowerClass.c \ + UE-PowerClassExt.c \ + UE-RadioAccessCapability.c \ + UE-RadioAccessCapabilityInfo.c \ + UE-RadioAccessCapability-v370ext.c \ + UE-RadioAccessCapability-v380ext.c \ + UE-RadioAccessCapability-v3a0ext.c \ + UE-RadioAccessCapability-v3g0ext.c \ + UE-RadioAccessCapability-v650ext.c \ + UE-RadioAccessCapability-v690ext.c \ + UE-RadioAccessCapability-v7xyext.c \ + UE-RadioAccessCapabBandFDDList2.c \ + UE-RadioAccessCapabBandFDD2.c \ + UE-PositioningCapabilityExt-v380.c \ + UE-PositioningCapabilityExt-v3a0.c \ + UE-PositioningCapabilityExt-v3g0.c \ + UE-RadioAccessCapabBandFDDList.c \ + UE-RadioAccessCapabBandFDDList-ext.c \ + UE-RadioAccessCapabBandFDD.c \ + UE-RadioAccessCapabBandFDD-ext.c \ + UE-RadioAccessCapability-v4b0ext.c \ + UE-RadioAccessCapabilityComp.c \ + UE-RadioAccessCapabilityComp-ext.c \ + UE-RadioAccessCapabilityComp-r7.c \ + UE-RadioAccessCapabilityComp2.c \ + RF-CapabilityComp.c \ + RF-CapabilityComp-r7.c \ + RF-CapabBandFDDComp.c \ + RF-CapabBandListFDDComp.c \ + RF-CapabBandListFDDComp-ext.c \ + UE-RadioAccessCapability-v590ext.c \ + UE-RadioAccessCapability-v5c0ext.c \ + UE-RadioAccessCapability-v680ext.c \ + UL-PhysChCapabilityFDD.c \ + UL-PhysChCapabilityFDD-r6.c \ + UL-PhysChCapabilityTDD.c \ + UL-PhysChCapabilityTDD-LCR-r4.c \ + PhysicalChannelCapability-edch-r6.c \ + UL-TransChCapability.c \ + UE-Positioning-Capability.c \ + UE-SecurityInformation.c \ + UE-SecurityInformation2.c \ + URA-UpdateCause.c \ + UTRAN-DRX-CycleLengthCoefficient.c \ + WaitTime.c \ + AlgorithmSpecificInfo.c \ + AlgorithmSpecificInfo-r4.c \ + CID-InclusionInfo-r4.c \ + COUNT-C.c \ + COUNT-C-MSB.c \ + DefaultConfigIdentity.c \ + DefaultConfigIdentity-r4.c \ + DefaultConfigIdentity-r5.c \ + DefaultConfigIdentity-r6.c \ + DefaultConfigMode.c \ + DDI.c \ + DL-AM-RLC-Mode.c \ + DL-AM-RLC-Mode-r5.c \ + DL-CounterSynchronisationInfo.c \ + DL-CounterSynchronisationInfo-r5.c \ + DL-LogicalChannelMapping.c \ + DL-LogicalChannelMapping-r5.c \ + DL-LogicalChannelMappingList.c \ + DL-LogicalChannelMappingList-r5.c \ + DL-Reception-Window-Size-r6.c \ + DL-RFC3095-r4.c \ + DL-RLC-Mode.c \ + DL-RLC-Mode-r5.c \ + DL-RLC-Mode-r6.c \ + DL-RLC-StatusInfo.c \ + DL-TM-RLC-Mode.c \ + DL-TransportChannelType.c \ + DL-TransportChannelType-r5.c \ + DL-UM-RLC-LI-size.c \ + DL-UM-RLC-Mode-r5.c \ + DL-UM-RLC-Mode-r6.c \ + ExpectReordering.c \ + ExplicitDiscard.c \ + HeaderCompressionInfo.c \ + HeaderCompressionInfoList.c \ + HeaderCompressionInfo-r4.c \ + HeaderCompressionInfoList-r4.c \ + LogicalChannelIdentity.c \ + LosslessSRNS-RelocSupport.c \ + MAC-d-HFN-initial-value.c \ + MAC-LogicalChannelPriority.c \ + MaxDAT.c \ + MaxDAT-Retransmissions.c \ + MaxMRW.c \ + MaxPDCP-SN-WindowSize.c \ + MaxRST.c \ + NoExplicitDiscard.c \ + PDCP-Info.c \ + PDCP-Info-r4.c \ + PDCP-InfoReconfig.c \ + PDCP-InfoReconfig-r4.c \ + PDCP-PDU-Header.c \ + PDCP-ROHC-TargetMode.c \ + PDCP-SN-Info.c \ + Poll-PDU.c \ + Poll-SDU.c \ + PollingInfo.c \ + PollWindow.c \ + PredefinedConfigIdentity.c \ + PredefinedConfigValueTag.c \ + PredefinedRB-Configuration.c \ + PreDefRadioConfiguration.c \ + PredefinedConfigStatusList.c \ + PredefinedConfigStatusInfo.c \ + PredefinedConfigStatusListComp.c \ + PredefinedConfigSetsWithDifferentValueTag.c \ + PredefinedConfigSetWithDifferentValueTag.c \ + PredefinedConfigValueTagList.c \ + PredefinedConfigStatusListVarSz.c \ + RAB-Info.c \ + RAB-Info-r6-ext.c \ + RAB-Info-r6.c \ + RAB-InformationList.c \ + RAB-InformationList-r6.c \ + RAB-InformationReconfigList.c \ + RAB-InformationReconfig.c \ + RAB-Info-Post.c \ + RAB-InformationSetup.c \ + RAB-InformationSetup-r4.c \ + RAB-InformationSetup-r5.c \ + RAB-InformationSetup-r6-ext.c \ + RAB-InformationSetup-r6.c \ + RAB-InformationSetupList.c \ + RAB-InformationSetupList-r4.c \ + RAB-InformationSetupList-r5.c \ + RAB-InformationSetupList-r6.c \ + RAB-InformationSetupList-r6-ext.c \ + RB-ActivationTimeInfo.c \ + RB-ActivationTimeInfoList.c \ + RB-COUNT-C-Information.c \ + RB-COUNT-C-InformationList.c \ + RB-COUNT-C-MSB-Information.c \ + RB-COUNT-C-MSB-InformationList.c \ + RB-Identity.c \ + RB-IdentityList.c \ + RB-InformationAffected.c \ + RB-InformationAffected-r5.c \ + RB-InformationAffected-r6.c \ + RB-InformationAffectedList.c \ + RB-InformationAffectedList-r5.c \ + RB-InformationAffectedList-r6.c \ + RB-InformationChanged-r6.c \ + RB-InformationChangedList-r6.c \ + RB-InformationReconfig.c \ + RB-InformationReconfig-r4.c \ + RB-InformationReconfig-r5.c \ + RB-InformationReconfig-r6.c \ + RB-InformationReconfigList.c \ + RB-InformationReconfigList-r4.c \ + RB-InformationReconfigList-r5.c \ + RB-InformationReconfigList-r6.c \ + RB-InformationReleaseList.c \ + RB-InformationSetup.c \ + RB-InformationSetup-r4.c \ + RB-InformationSetup-r5.c \ + RB-InformationSetup-r6.c \ + RB-InformationSetupList.c \ + RB-InformationSetupList-r4.c \ + RB-InformationSetupList-r5.c \ + RB-InformationSetupList-r6.c \ + RB-MappingInfo.c \ + RB-MappingInfo-r5.c \ + RB-MappingInfo-r6.c \ + RB-MappingOption.c \ + RB-MappingOption-r5.c \ + RB-MappingOption-r6.c \ + RB-PDCPContextRelocation.c \ + RB-PDCPContextRelocationList.c \ + RB-StopContinue.c \ + RB-WithPDCP-Info.c \ + RB-WithPDCP-InfoList.c \ + ReceivingWindowSize.c \ + RFC2507-Info.c \ + RFC3095-Info-r4.c \ + RLC-Info.c \ + RLC-Info-r5.c \ + RLC-Info-r6.c \ + RLC-Info-MCCH-r6.c \ + RLC-Info-MSCH-r6.c \ + RLC-Info-MTCH-r6.c \ + RLC-InfoChoice.c \ + RLC-InfoChoice-r5.c \ + RLC-InfoChoice-r6.c \ + RLC-PDU-Size.c \ + RLC-PDU-SizeList.c \ + RLC-SequenceNumber.c \ + RLC-SizeInfo.c \ + RLC-SizeExplicitList.c \ + ROHC-Profile-r4.c \ + ROHC-ProfileList-r4.c \ + ROHC-PacketSize-r4.c \ + ROHC-PacketSizeList-r4.c \ + SRB-InformationSetup.c \ + SRB-InformationSetup-r5.c \ + SRB-InformationSetup-r6.c \ + SRB-InformationSetupList.c \ + SRB-InformationSetupList-r5.c \ + SRB-InformationSetupList-r6.c \ + SRB-InformationSetupList2.c \ + SRB-InformationSetupList2-r6.c \ + TimerDAR-r6.c \ + TimerDiscard.c \ + TimerEPC.c \ + TimerMRW.c \ + TimerOSD-r6.c \ + TimerPoll.c \ + TimerPollPeriodic.c \ + TimerPollProhibit.c \ + TimerRST.c \ + TimerStatusPeriodic.c \ + TimerStatusProhibit.c \ + TransmissionRLC-Discard.c \ + TransmissionWindowSize.c \ + UL-AM-RLC-Mode.c \ + UL-CounterSynchronisationInfo.c \ + UL-LogicalChannelMapping.c \ + UL-LogicalChannelMapping-r6.c \ + UL-LogicalChannelMappingList.c \ + UL-LogicalChannelMappingList-r6.c \ + UL-LogicalChannelMappings.c \ + UL-LogicalChannelMappings-r6.c \ + UL-RFC3095-r4.c \ + UL-RLC-Mode.c \ + UL-TM-RLC-Mode.c \ + UL-UM-RLC-Mode.c \ + UL-TransportChannelType.c \ + UM-RLC-DuplAvoid-Reord-Info-r6.c \ + UM-RLC-OutOSeqDelivery-Info-r6.c \ + WindowSizeDAR-r6.c \ + WindowSizeOSD-r6.c \ + AddOrReconfMAC-dFlow.c \ + AllowedTFC-List.c \ + AllowedTFI-List.c \ + BitModeRLC-SizeInfo.c \ + BLER-QualityValue.c \ + ChannelCodingType.c \ + CodingRate.c \ + CommonDynamicTF-Info.c \ + CommonDynamicTF-Info-DynamicTTI.c \ + CommonDynamicTF-InfoList.c \ + CommonDynamicTF-InfoList-DynamicTTI.c \ + CommonTransChTFS.c \ + CommonTransChTFS-LCR.c \ + CPCH-SetID.c \ + CRC-Size.c \ + DedicatedDynamicTF-Info.c \ + DedicatedDynamicTF-Info-DynamicTTI.c \ + DedicatedDynamicTF-InfoList.c \ + DedicatedDynamicTF-InfoList-DynamicTTI.c \ + DedicatedTransChTFS.c \ + DL-AddReconfTransChInfo2List.c \ + DL-AddReconfTransChInfoList.c \ + DL-AddReconfTransChInfoList-r4.c \ + DL-AddReconfTransChInfoList-r5.c \ + DL-AddReconfTransChInformation.c \ + DL-AddReconfTransChInformation-r4.c \ + DL-AddReconfTransChInformation-r5.c \ + DL-AddReconfTransChInformation2.c \ + DL-CommonTransChInfo.c \ + DL-CommonTransChInfo-r4.c \ + DL-DeletedTransChInfoList.c \ + DL-DeletedTransChInfoList-r5.c \ + DL-TransportChannelIdentity.c \ + DL-TransportChannelIdentity-r5.c \ + DL-TrCH-Type.c \ + DL-TrCH-TypeId1-r5.c \ + DL-TrCH-TypeId2-r5.c \ + DRAC-ClassIdentity.c \ + DRAC-StaticInformation.c \ + DRAC-StaticInformationList.c \ + E-DCH-AddReconf-MAC-d-Flow.c \ + E-DCH-AddReconf-MAC-d-FlowList.c \ + E-DCH-MAC-d-FlowIdentity.c \ + E-DCH-MAC-d-FlowMaxRetrans.c \ + E-DCH-MAC-d-FlowMultiplexingList.c \ + E-DCH-MAC-d-FlowPowerOffset.c \ + E-DCH-TTI.c \ + ExplicitTFCS-Configuration.c \ + GainFactor.c \ + GainFactorInformation.c \ + HSDSCH-Info.c \ + HARQ-Info.c \ + HARQMemorySize.c \ + IndividualDL-CCTrCH-Info.c \ + IndividualDL-CCTrCH-InfoList.c \ + IndividualUL-CCTrCH-Info.c \ + IndividualUL-CCTrCH-InfoList.c \ + LogicalChannelByRB.c \ + LogicalChannelList.c \ + MAC-d-FlowIdentityDCHandHSDSCH.c \ + MAC-d-FlowIdentity.c \ + MAC-d-PDU-SizeInfo-List.c \ + MAC-d-PDUsizeInfo.c \ + MAC-hs-AddReconfQueue-List.c \ + MAC-hs-AddReconfQueue.c \ + MAC-hs-DelQueue-List.c \ + MAC-hs-DelQueue.c \ + MAC-hs-WindowSize.c \ + NumberOfTbSizeAndTTIList.c \ + MessType.c \ + Non-allowedTFC-List.c \ + NumberOfTransportBlocks.c \ + OctetModeRLC-SizeInfoType1.c \ + OctetModeRLC-SizeInfoType2.c \ + PowerOffsetInfoShort.c \ + PowerOffsetInformation.c \ + PowerOffsetPp-m.c \ + PreDefTransChConfiguration.c \ + QualityTarget.c \ + RateMatchingAttribute.c \ + ReferenceTFC-ID.c \ + RestrictedTrChInfo.c \ + RestrictedTrChInfoList.c \ + SemistaticTF-Information.c \ + SignalledGainFactors.c \ + SplitTFCI-Signalling.c \ + SplitType.c \ + T1-ReleaseTimer.c \ + TFC-Subset.c \ + TFC-SubsetList.c \ + TFC-Value.c \ + TFCI-Field2-Information.c \ + TFCI-Range.c \ + TFCI-RangeList.c \ + TFCS.c \ + TFCS-Identity.c \ + TFCS-IdentityPlain.c \ + TFCS-InfoForDSCH.c \ + TFCS-ReconfAdd.c \ + TFCS-Removal.c \ + TFCS-RemovalList.c \ + TimeDurationBeforeRetry.c \ + TM-SignallingInfo.c \ + TransmissionTimeInterval.c \ + TransmissionTimeValidity.c \ + TransportChannelIdentity.c \ + TransportChannelIdentityDCHandDSCH.c \ + TransportFormatSet.c \ + TransportFormatSet-LCR.c \ + UL-AddReconfTransChInfoList.c \ + UL-AddReconfTransChInfoList-r6.c \ + UL-AddReconfTransChInformation.c \ + UL-AddReconfTransChInformation-r6.c \ + UL-CommonTransChInfo.c \ + UL-CommonTransChInfo-r4.c \ + UL-ControlledTrChList.c \ + UL-DeletedTransChInfoList.c \ + UL-DeletedTransChInfoList-r6.c \ + UL-TransportChannelIdentity.c \ + UL-TransportChannelIdentity-r6.c \ + UL-TrCH-Type.c \ + USCH-TransportChannelsInfo.c \ + ACK-NACK-repetitionFactor.c \ + AC-To-ASC-Mapping.c \ + AC-To-ASC-MappingTable.c \ + AccessServiceClass-FDD.c \ + AccessServiceClass-TDD.c \ + AccessServiceClass-TDD-r7.c \ + AccessServiceClass-TDD-LCR-r4.c \ + AdditionalPRACH-TF-and-TFCS-CCCH-IEs.c \ + AdditionalPRACH-TF-and-TFCS-CCCH.c \ + AdditionalPRACH-TF-and-TFCS-CCCH-List.c \ + AICH-Info.c \ + AICH-PowerOffset.c \ + AICH-TransmissionTiming.c \ + AllocationPeriodInfo.c \ + Alpha.c \ + AP-AICH-ChannelisationCode.c \ + AP-PreambleScramblingCode.c \ + AP-Signature.c \ + AP-Signature-VCAM.c \ + AP-Subchannel.c \ + ASCSetting-FDD.c \ + ASCSetting-TDD.c \ + ASCSetting-TDD-r7.c \ + ASCSetting-TDD-LCR-r4.c \ + AvailableAP-Signature-VCAMList.c \ + AvailableAP-SignatureList.c \ + AvailableAP-SubchannelList.c \ + AvailableMinimumSF-ListVCAM.c \ + AvailableMinimumSF-VCAM.c \ + AvailableSignatures.c \ + AvailableSubChannelNumbers.c \ + BEACON-PL-Est.c \ + BurstType.c \ + Bler-Target.c \ + CCTrCH-PowerControlInfo.c \ + CCTrCH-PowerControlInfo-r4.c \ + CCTrCH-PowerControlInfo-r5.c \ + CCTrCH-PowerControlInfo-r7.c \ + CD-AccessSlotSubchannel.c \ + CD-AccessSlotSubchannelList.c \ + CD-CA-ICH-ChannelisationCode.c \ + CD-PreambleScramblingCode.c \ + CD-SignatureCode.c \ + CD-SignatureCodeList.c \ + CellAndChannelIdentity.c \ + CellParametersID.c \ + Cfntargetsfnframeoffset.c \ + ChannelAssignmentActive.c \ + ChannelisationCode256.c \ + ChannelReqParamsForUCSM.c \ + ClosedLoopTimingAdjMode.c \ + CodeNumberDSCH.c \ + CodeRange.c \ + CodeWordSet.c \ + CommonTimeslotInfo.c \ + CommonTimeslotInfoSCCPCH.c \ + ConstantValue.c \ + ConstantValueTdd.c \ + CPCH-PersistenceLevels.c \ + CPCH-PersistenceLevelsList.c \ + CPCH-SetInfo.c \ + CPCH-SetInfoList.c \ + CPCH-StatusIndicationMode.c \ + CQI-RepetitionFactor.c \ + CSICH-PowerOffset.c \ + DefaultDPCH-OffsetValueFDD.c \ + DefaultDPCH-OffsetValueTDD.c \ + DeltaPp-m.c \ + DeltaCQI.c \ + DeltaNACK.c \ + DeltaACK.c \ + DeltaSIR.c \ + DHS-Sync.c \ + DL-CCTrCh.c \ + DL-CCTrCh-r4.c \ + DL-CCTrCh-r7.c \ + DL-CCTrChList.c \ + DL-CCTrChList-r7.c \ + DL-CCTrChList-r4.c \ + DL-CCTrChListToRemove.c \ + DL-CCTrChTPCList.c \ + DL-ChannelisationCode.c \ + DL-ChannelisationCodeList.c \ + DL-CommonInformation.c \ + DL-CommonInformation-r4.c \ + DL-CommonInformation-r5.c \ + DL-CommonInformation-r6.c \ + DL-CommonInformation-r7.c \ + DL-CommonInformationPost.c \ + DL-CommonInformationPredef.c \ + DL-CompressedModeMethod.c \ + DL-DPCH-InfoCommon.c \ + DL-DPCH-InfoCommon-r4.c \ + DL-DPCH-InfoCommon-r6.c \ + DL-DPCH-InfoCommonPost.c \ + DL-DPCH-InfoCommonPredef.c \ + DL-DPCH-InfoPerRL.c \ + DL-DPCH-InfoPerRL-r4.c \ + DL-DPCH-InfoPerRL-r5.c \ + DL-DPCH-InfoPerRL-r6.c \ + DL-DPCH-InfoPerRL-r7.c \ + DL-FDPCH-InfoPerRL-r6.c \ + DL-DPCH-InfoPerRL-PostFDD.c \ + DL-DPCH-InfoPerRL-PostTDD.c \ + DL-DPCH-InfoPerRL-PostTDD-LCR-r4.c \ + DL-DPCH-PowerControlInfo.c \ + DL-FDPCH-InfoCommon-r6.c \ + DL-FrameType.c \ + DL-HSPDSCH-Information.c \ + DL-HSPDSCH-Information-r6.c \ + DL-HSPDSCH-Information-r7.c \ + DL-HSPDSCH-TS-Configuration.c \ + DL-HSPDSCH-TS-Configuration-VHCR.c \ + DL-InformationPerRL.c \ + DL-InformationPerRL-r4.c \ + DL-InformationPerRL-r5.c \ + DL-InformationPerRL-r5bis.c \ + DL-InformationPerRL-r6.c \ + DL-InformationPerRL-r7.c \ + DL-InformationPerRL-List.c \ + DL-InformationPerRL-List-r4.c \ + DL-InformationPerRL-List-r5.c \ + DL-InformationPerRL-List-r6.c \ + DL-InformationPerRL-List-r5bis.c \ + DL-InformationPerRL-List-r7.c \ + DL-InformationPerRL-ListPostFDD.c \ + DL-InformationPerRL-PostFDD.c \ + DL-InformationPerRL-PostTDD.c \ + DL-InformationPerRL-PostTDD-LCR-r4.c \ + DL-PDSCH-Information.c \ + Dl-rate-matching-restriction.c \ + DL-TPC-PowerOffsetPerRL.c \ + DL-TPC-PowerOffsetPerRL-List.c \ + DL-TS-ChannelisationCode.c \ + DL-TS-ChannelisationCode-VHCR.c \ + DL-TS-ChannelisationCodesShort.c \ + DL-TS-ChannelisationCodesShort-VHCR.c \ + DownlinkAdditionalTimeslots.c \ + DownlinkAdditionalTimeslots-VHCR.c \ + DownlinkAdditionalTimeslots-LCR-r4.c \ + DownlinkTimeslotsCodes.c \ + DownlinkTimeslotsCodes-VHCR.c \ + DownlinkTimeslotsCodes-LCR-r4.c \ + DPC-Mode.c \ + DPCCH-PowerOffset.c \ + DPCCH-PowerOffset2.c \ + DPCH-CompressedModeInfo.c \ + DPCH-CompressedModeStatusInfo.c \ + DPCH-FrameOffset.c \ + DSCH-Mapping.c \ + DSCH-MappingList.c \ + DSCH-RadioLinkIdentifier.c \ + DSCH-TransportChannelsInfo.c \ + DurationTimeInfo.c \ + DynamicPersistenceLevel.c \ + DynamicPersistenceLevelList.c \ + DynamicPersistenceLevelTF-List.c \ + DynamicTFInformationCCCH.c \ + E-AGCH-ChannelisationCode.c \ + E-AGCH-Information.c \ + E-DCH-MinimumSet-E-TFCI.c \ + E-DCH-ReconfigurationInfo.c \ + E-DCH-RL-InfoNewServingCell.c \ + E-DCH-RL-InfoOtherCell.c \ + E-DPCCH-Info.c \ + E-DPCCH-DPCCH-PowerOffset.c \ + E-DPDCH-Info.c \ + E-DPDCH-PeriodicyOfSchedInfo.c \ + E-DPDCH-PL-NonMax.c \ + E-DPDCH-Reference-E-TFCI.c \ + E-DPDCH-Reference-E-TFCIList.c \ + E-DPDCH-SchedulingInfoConfiguration.c \ + E-DPDCH-SchedulingTransmConfiguration.c \ + E-DPDCH-MaxChannelisationCodes.c \ + E-HICH-ChannelisationCode.c \ + E-HICH-Information.c \ + E-HICH-RGCH-SignatureSequence.c \ + E-RGCH-CombinationIndex.c \ + E-RGCH-Information.c \ + E-TFCI-TableIndex.c \ + EXT-UL-TimingAdvance.c \ + FACH-PCH-Information.c \ + FACH-PCH-InformationList.c \ + Feedback-cycle.c \ + FPACH-Info-r4.c \ + FrequencyInfo.c \ + FrequencyInfoFDD.c \ + FrequencyInfoTDD.c \ + HappyBit-DelayCondition.c \ + HARQ-Preamble-Mode.c \ + HS-ChannelisationCode-LCR.c \ + HS-PDSCH-Midamble-Configuration-TDD128.c \ + HS-SCCH-Info.c \ + HS-SCCH-Info-r6.c \ + HS-SCCH-Info-r7.c \ + HS-SCCH-Codes.c \ + HS-SCCH-TDD128.c \ + HS-SICH-Configuration-TDD128.c \ + HS-SCCH-TDD384.c \ + HS-SCCH-TDD384-r6.c \ + HS-SCCH-TDD768.c \ + HS-SICH-Configuration-TDD384.c \ + HS-SICH-Configuration-TDD768.c \ + HS-SICH-Power-Control-Info-TDD384.c \ + HS-SICH-Power-Control-Info-TDD768.c \ + IndividualTimeslotInfo.c \ + IndividualTimeslotInfo-VHCR.c \ + IndividualTimeslotInfo-LCR-r4.c \ + IndividualTimeslotInfo-LCR-r4-ext.c \ + IndividualTS-Interference.c \ + IndividualTS-InterferenceList.c \ + ITP.c \ + NidentifyAbort.c \ + MaxAllowedUL-TX-Power.c \ + MaxAvailablePCPCH-Number.c \ + MaxPowerIncrease-r4.c \ + MaxTFCI-Field2Value.c \ + Measurement-Feedback-Info.c \ + MidambleConfigurationBurstType1and3.c \ + MidambleConfigurationBurstType2.c \ + MidambleConfigurationBurstType2-VHCR.c \ + MidambleShiftAndBurstType.c \ + MidambleShiftAndBurstType-VHCR.c \ + MidambleShiftAndBurstType-DL.c \ + MidambleShiftAndBurstType-DL-VHCR.c \ + MidambleShiftAndBurstType-LCR-r4.c \ + MidambleShiftLong.c \ + MidambleShiftShort.c \ + MidambleShiftShort-VHCR.c \ + MinimumSpreadingFactor.c \ + MultiCodeInfo.c \ + N-EOT.c \ + N-GAP.c \ + N-PCH.c \ + N-StartMessage.c \ + NB01.c \ + NF-Max.c \ + NumberOfDPDCH.c \ + NumberOfFBI-Bits.c \ + OpenLoopPowerControl-TDD.c \ + OpenLoopPowerControl-IPDL-TDD-r4.c \ + PagingIndicatorLength.c \ + PC-Preamble.c \ + PCP-Length.c \ + PCPCH-ChannelInfo.c \ + PCPCH-ChannelInfoList.c \ + PCPICH-UsageForChannelEst.c \ + PDSCH-CapacityAllocationInfo.c \ + PDSCH-CapacityAllocationInfo-r4.c \ + PDSCH-CapacityAllocationInfo-r7.c \ + PDSCH-CodeInfo.c \ + PDSCH-CodeInfoList.c \ + PDSCH-CodeMap.c \ + PDSCH-CodeMapList.c \ + PDSCH-CodeMapping.c \ + PDSCH-Identity.c \ + PDSCH-Info.c \ + PDSCH-Info-r4.c \ + PDSCH-Info-r7.c \ + PDSCH-Info-LCR-r4.c \ + PDSCH-PowerControlInfo.c \ + PDSCH-SHO-DCH-Info.c \ + PDSCH-SysInfo.c \ + PDSCH-SysInfo-r7.c \ + PDSCH-SysInfo-HCR-r5.c \ + PDSCH-SysInfo-LCR-r4.c \ + PDSCH-SysInfoList.c \ + PDSCH-SysInfoList-r7.c \ + PDSCH-SysInfoList-HCR-r5.c \ + PDSCH-SysInfoList-LCR-r4.c \ + PDSCH-SysInfoList-SFN.c \ + PDSCH-SysInfoList-SFN-HCR-r5.c \ + PDSCH-SysInfoList-SFN-LCR-r4.c \ + PersistenceScalingFactor.c \ + PersistenceScalingFactorList.c \ + PI-CountPerFrame.c \ + PichChannelisationCodeList-LCR-r4.c \ + PICH-Info.c \ + PICH-Info-r7.c \ + PICH-Info-LCR-r4.c \ + PICH-PowerOffset.c \ + PilotBits128.c \ + PilotBits256.c \ + MeasurementPowerOffset.c \ + PLCCH-Info.c \ + PositionFixedOrFlexible.c \ + PowerControlAlgorithm.c \ + PowerOffsetPilot-pdpdch.c \ + PowerOffsetTPC-pdpdch.c \ + PowerRampStep.c \ + PRACH-ChanCodes-LCR-r4.c \ + PRACH-Definition-LCR-r4.c \ + PRACH-Midamble.c \ + PRACH-Partitioning.c \ + PRACH-Partitioning-r7.c \ + PRACH-Partitioning-LCR-r4.c \ + PRACH-PowerOffset.c \ + PRACH-RACH-Info.c \ + PRACH-RACH-Info-r7.c \ + PRACH-RACH-Info-LCR-r4.c \ + PRACH-SystemInformation.c \ + PRACH-SystemInformation-r7.c \ + PRACH-SystemInformation-LCR-r4.c \ + PRACH-SystemInformationList.c \ + PRACH-SystemInformationList-r7.c \ + PRACH-SystemInformationList-LCR-r4.c \ + PreambleRetransMax.c \ + PreambleScramblingCodeWordNumber.c \ + PreDefPhyChConfiguration.c \ + PrimaryCCPCH-Info.c \ + PrimaryCCPCH-Info-r4.c \ + PrimaryCCPCH-Info-r7.c \ + PrimaryCCPCH-Info-LCR-r4.c \ + PrimaryCCPCH-Info-LCR-r4-ext.c \ + PrimaryCCPCH-InfoPost.c \ + PrimaryCCPCH-InfoPostTDD-LCR-r4.c \ + PrimaryCCPCH-TX-Power.c \ + PrimaryCPICH-Info.c \ + PrimaryCPICH-TX-Power.c \ + PrimaryScramblingCode.c \ + PuncturingLimit.c \ + PUSCH-CapacityAllocationInfo.c \ + PUSCH-CapacityAllocationInfo-r4.c \ + PUSCH-CapacityAllocationInfo-r7.c \ + PUSCH-Identity.c \ + PUSCH-Info.c \ + PUSCH-Info-r4.c \ + PUSCH-Info-VHCR.c \ + PUSCH-Info-LCR-r4.c \ + PUSCH-PowerControlInfo-r4.c \ + PUSCH-PowerControlInfo-r7.c \ + PUSCH-SysInfo.c \ + PUSCH-SysInfo-VHCR.c \ + PUSCH-SysInfo-HCR-r5.c \ + PUSCH-SysInfo-LCR-r4.c \ + PUSCH-SysInfoList.c \ + PUSCH-SysInfoList-HCR-r5.c \ + PUSCH-SysInfoList-LCR-r4.c \ + PUSCH-SysInfoList-SFN.c \ + PUSCH-SysInfoList-SFN-HCR-r5.c \ + PUSCH-SysInfoList-SFN-LCR-r4.c \ + PUSCH-SysInfoList-SFN-VHCR.c \ + RACH-TransmissionParameters.c \ + ReducedScramblingCodeNumber.c \ + RepetitionPeriodAndLength.c \ + RepetitionPeriodLengthAndOffset.c \ + ReplacedPDSCH-CodeInfo.c \ + ReplacedPDSCH-CodeInfoList.c \ + RepPerLengthOffset-PICH.c \ + RepPerLengthOffset-MICH.c \ + RestrictedTrCH.c \ + RestrictedTrCH-InfoList.c \ + RL-AdditionInformation.c \ + RL-AdditionInformation-r6.c \ + RL-AdditionInformationList.c \ + RL-AdditionInformationList-r6.c \ + RL-IdentifierList.c \ + RL-RemovalInformationList.c \ + RPP.c \ + S-Field.c \ + SCCPCH-ChannelisationCode.c \ + SCCPCH-ChannelisationCode-VHCR.c \ + SCCPCH-ChannelisationCodeList.c \ + SCCPCH-ChannelisationCodeList-VHCR.c \ + SCCPCH-InfoForFACH.c \ + SCCPCH-InfoForFACH-r4.c \ + SCCPCH-SystemInformation.c \ + SCCPCH-SystemInformation-LCR-r4-ext.c \ + SCCPCH-SystemInformation-r7.c \ + SCCPCH-SystemInformationList.c \ + SCCPCH-SystemInformationList-r7.c \ + SCCPCH-SystemInformationList-LCR-r4-ext.c \ + SCCPCH-SystemInformation-MBMS-r6.c \ + SCCPCH-SystemInformation-MBMS-r7.c \ + ScramblingCodeChange.c \ + ScramblingCodeType.c \ + SecondaryCCPCH-Info.c \ + SecondaryCCPCH-Info-r4.c \ + SecondaryCCPCH-Info-r7.c \ + SecondaryCCPCH-Info-LCR-r4-ext.c \ + SecondaryCCPCHInfo-MBMS-r6.c \ + SecondaryCCPCHInfo-MBMS-r7.c \ + SecondaryCPICH-Info.c \ + SecondaryScramblingCode.c \ + SecondInterleavingMode.c \ + SF256-AndCodeNumber.c \ + SF512-AndCodeNumber.c \ + SF512-AndPilot.c \ + SF-PDSCH.c \ + SF-PRACH.c \ + SFN-TimeInfo.c \ + SpecialBurstScheduling.c \ + SpreadingFactor.c \ + SRB-delay.c \ + SSDT-CellIdentity.c \ + SSDT-Information.c \ + SSDT-Information-r4.c \ + SSDT-UL.c \ + SynchronisationParameters-r4.c \ + SYNC-UL-Procedure-r4.c \ + SYNC-UL-Info-r4.c \ + TDD-FPACH-CCode16-r4.c \ + TDD-UL-Interference.c \ + TDD-PICH-CCode.c \ + TDD768-PICH-CCode.c \ + TDD-PRACH-CCode8.c \ + TDD-PRACH-CCode16.c \ + TDD-PRACH-CCode-LCR-r4.c \ + TDD-PRACH-CCodeList.c \ + TDD768-PRACH-CCode8.c \ + TDD768-PRACH-CCode16.c \ + TDD768-PRACH-CCode32.c \ + TDD768-PRACH-CCodeList.c \ + TFC-ControlDuration.c \ + TFCI-Coding.c \ + TGCFN.c \ + TGD.c \ + TGL.c \ + TGMP.c \ + TGP-Sequence.c \ + TGPS-Reconfiguration-CFN.c \ + TGP-SequenceList.c \ + TGP-SequenceShort.c \ + TGPL.c \ + TGPRC.c \ + TGPS-ConfigurationParams.c \ + TGPSI.c \ + TGSN.c \ + TimeInfo.c \ + TimeslotList.c \ + TimeslotList-r4.c \ + TimeslotNumber.c \ + TimeslotNumber-LCR-r4.c \ + TimeslotNumber-PRACH-LCR-r4.c \ + TimeslotSync2.c \ + TimingOffset.c \ + TimingMaintainedSynchInd.c \ + TPC-CombinationIndex.c \ + TPC-CommandTargetRate.c \ + TPC-StepSizeFDD.c \ + TPC-StepSizeTDD.c \ + TreconfirmAbort.c \ + TX-DiversityMode.c \ + UARFCN.c \ + UCSM-Info.c \ + UL-CCTrCH.c \ + UL-CCTrCH-r4.c \ + UL-CCTrCH-r7.c \ + UL-CCTrCHList.c \ + UL-CCTrCHList-r4.c \ + UL-CCTrCHList-r7.c \ + UL-CCTrCHListToRemove.c \ + UL-CCTrChTPCList.c \ + UL-ChannelRequirement.c \ + UL-ChannelRequirement-r4.c \ + UL-ChannelRequirement-r5.c \ + UL-ChannelRequirementWithCPCH-SetID.c \ + UL-ChannelRequirementWithCPCH-SetID-r4.c \ + UL-ChannelRequirementWithCPCH-SetID-r5.c \ + UL-CompressedModeMethod.c \ + UL-DL-Mode.c \ + UL-DPCCH-SlotFormat.c \ + UL-DPCH-Info.c \ + UL-DPCH-Info-r4.c \ + UL-DPCH-Info-r5.c \ + UL-DPCH-Info-r6.c \ + UL-DPCH-Info-r7.c \ + UL-DPCH-InfoPostFDD.c \ + UL-DPCH-InfoPostTDD.c \ + UL-DPCH-InfoPostTDD-LCR-r4.c \ + UL-DPCH-InfoPredef.c \ + UL-DPCH-PowerControlInfo.c \ + UL-DPCH-PowerControlInfo-r4.c \ + UL-DPCH-PowerControlInfo-r5.c \ + UL-DPCH-PowerControlInfo-r6.c \ + UL-DPCH-PowerControlInfo-r7.c \ + UL-DPCH-PowerControlInfoPostFDD.c \ + UL-DPCH-PowerControlInfoPostTDD.c \ + UL-DPCH-PowerControlInfoPostTDD-LCR-r4.c \ + UL-DPCH-PowerControlInfoPredef.c \ + UL-EDCH-Information-r6.c \ + UL-Interference.c \ + UL-ScramblingCode.c \ + UL-SynchronisationParameters-r4.c \ + UL-TargetSIR.c \ + UL-TimingAdvance.c \ + UL-TimingAdvance-VHCR.c \ + UL-TimingAdvanceControl.c \ + UL-TimingAdvanceControl-r4.c \ + UL-TimingAdvanceControl-r7.c \ + UL-TimingAdvanceControl-LCR-r4.c \ + UL-TS-ChannelisationCode.c \ + UL-TS-ChannelisationCodeList.c \ + UL-TS-ChannelisationCodeList-r7.c \ + UL-TS-ChannelisationCode-VHCR.c \ + UL-TS-ChannelisationCodeList-VHCR.c \ + UplinkAdditionalTimeslots.c \ + UplinkAdditionalTimeslots-LCR-r4.c \ + UplinkAdditionalTimeslots-LCR-r7.c \ + UplinkTimeslotsCodes.c \ + UplinkTimeslotsCodes-VHCR.c \ + UplinkTimeslotsCodes-LCR-r4.c \ + UplinkTimeslotsCodes-LCR-r7.c \ + Wi-LCR.c \ + AcquisitionSatInfo.c \ + AcquisitionSatInfoList.c \ + AdditionalMeasurementID-List.c \ + AlmanacSatInfo.c \ + AlmanacSatInfoList.c \ + AverageRLC-BufferPayload.c \ + AzimuthAndElevation.c \ + BadSatList.c \ + Frequency-Band.c \ + BCCH-ARFCN.c \ + BLER-MeasurementResults.c \ + BLER-MeasurementResultsList.c \ + BLER-TransChIdList.c \ + BSIC-VerificationRequired.c \ + BSICReported.c \ + BurstModeParameters.c \ + CellDCH-ReportCriteria.c \ + CellDCH-ReportCriteria-LCR-r4.c \ + CellIndividualOffset.c \ + CellInfo.c \ + CellInfo-r4.c \ + CellInfoSI-RSCP.c \ + CellInfoSI-RSCP-LCR-r4.c \ + CellInfoSI-ECN0.c \ + CellInfoSI-ECN0-LCR-r4.c \ + CellInfoSI-HCS-RSCP.c \ + CellInfoSI-HCS-RSCP-LCR-r4.c \ + CellInfoSI-HCS-ECN0.c \ + CellInfoSI-HCS-ECN0-LCR-r4.c \ + CellMeasuredResults.c \ + CellMeasurementEventResults.c \ + CellMeasurementEventResults-LCR-r4.c \ + CellReportingQuantities.c \ + CellSelectReselectInfoSIB-11-12.c \ + CellSelectReselectInfoSIB-11-12-RSCP.c \ + CellSelectReselectInfoSIB-11-12-ECN0.c \ + CellSelectReselectInfoSIB-11-12-HCS-RSCP.c \ + CellSelectReselectInfoSIB-11-12-HCS-ECN0.c \ + CellSelectReselectInfo-v590ext.c \ + CellSelectReselectInfoPCHFACH-v5b0ext.c \ + CellSelectReselectInfoTreselectionScaling-v5c0ext.c \ + CellsForInterFreqMeasList.c \ + CellsForInterRATMeasList.c \ + CellsForIntraFreqMeasList.c \ + CellSynchronisationInfo.c \ + CellToReport.c \ + CellToReportList.c \ + CodePhaseSearchWindow.c \ + CountC-SFN-Frame-difference.c \ + CPICH-Ec-N0.c \ + CPICH-RSCP.c \ + DeltaPRC.c \ + DeltaQrxlevmin.c \ + DeltaRSCP.c \ + DeltaRSCPPerCell.c \ + DeltaRRC.c \ + DGPS-CorrectionSatInfo.c \ + DGPS-CorrectionSatInfoList.c \ + DiffCorrectionStatus.c \ + DL-TransportChannelBLER.c \ + DopplerUncertainty.c \ + EllipsoidPoint.c \ + EllipsoidPointAltitude.c \ + EllipsoidPointAltitudeEllipsoide.c \ + EllipsoidPointUncertCircle.c \ + EllipsoidPointUncertEllipse.c \ + EnvironmentCharacterisation.c \ + Event1a.c \ + Event1a-r4.c \ + Event1a-LCR-r4.c \ + Event1b.c \ + Event1b-r4.c \ + Event1b-LCR-r4.c \ + Event1c.c \ + Event1d.c \ + Event1e.c \ + Event1e-r6.c \ + Event1f.c \ + Event1f-r6.c \ + Event1j-r6.c \ + Event2a.c \ + Event2a-r6.c \ + Event2b.c \ + Event2b-r6.c \ + Event2c.c \ + Event2c-r6.c \ + Event2d.c \ + Event2d-r6.c \ + Event2e.c \ + Event2e-r6.c \ + Event2f.c \ + Event2f-r6.c \ + Event3a.c \ + Event3b.c \ + Event3c.c \ + Event3d.c \ + EventIDInterFreq.c \ + EventIDInterRAT.c \ + EventIDIntraFreq.c \ + EventResults.c \ + ExtraDopplerInfo.c \ + FACH-MeasurementOccasionInfo.c \ + FACH-MeasurementOccasionInfo-LCR-r4-ext.c \ + FilterCoefficient.c \ + FineSFN-SFN.c \ + ForbiddenAffectCell.c \ + ForbiddenAffectCell-r4.c \ + ForbiddenAffectCell-LCR-r4.c \ + ForbiddenAffectCellList.c \ + ForbiddenAffectCellList-r4.c \ + ForbiddenAffectCellList-LCR-r4.c \ + FreqQualityEstimateQuantity-FDD.c \ + FreqQualityEstimateQuantity-TDD.c \ + GPS-MeasurementParam.c \ + GPS-MeasurementParamList.c \ + GSM-CarrierRSSI.c \ + GSM-MeasuredResults.c \ + GSM-MeasuredResultsList.c \ + GPS-TOW-1msec.c \ + GPS-TOW-Assist.c \ + GPS-TOW-AssistList.c \ + HCS-CellReselectInformation-RSCP.c \ + HCS-CellReselectInformation-ECN0.c \ + HCS-NeighbouringCellInformation-RSCP.c \ + HCS-NeighbouringCellInformation-ECN0.c \ + HCS-PRIO.c \ + HCS-ServingCellInformation.c \ + HorizontalVelocity.c \ + HorizontalWithVerticalVelocity.c \ + HorizontalVelocityWithUncertainty.c \ + HorizontalWithVerticalVelocityAndUncertainty.c \ + Hysteresis.c \ + HysteresisInterFreq.c \ + InterFreqCell.c \ + InterFreqCell-LCR-r4.c \ + InterFreqCellID.c \ + InterFreqCellInfoList.c \ + InterFreqCellInfoList-r4.c \ + InterFreqCellInfoSI-List-RSCP.c \ + InterFreqCellInfoSI-List-ECN0.c \ + InterFreqCellInfoSI-List-HCS-RSCP.c \ + InterFreqCellInfoSI-List-HCS-ECN0.c \ + InterFreqCellInfoSI-List-RSCP-LCR.c \ + InterFreqCellInfoSI-List-ECN0-LCR.c \ + InterFreqCellInfoSI-List-HCS-RSCP-LCR.c \ + InterFreqCellInfoSI-List-HCS-ECN0-LCR.c \ + InterFreqCellList.c \ + InterFreqCellList-LCR-r4-ext.c \ + InterFreqCellMeasuredResultsList.c \ + InterFreqEvent.c \ + InterFreqEvent-r6.c \ + InterFreqEventList.c \ + InterFreqEventList-r6.c \ + InterFrequencyMeasuredResultsList-v590ext.c \ + Inter-FreqEventCriteria-v590ext.c \ + Inter-FreqEventCriteriaList-v590ext.c \ + Intra-FreqEventCriteriaList-v590ext.c \ + IntraFrequencyMeasuredResultsList-v590ext.c \ + IntraFreqReportingCriteria-1b-r5.c \ + PeriodicReportingInfo-1b.c \ + InterFreqEventResults.c \ + InterFreqEventResults-LCR-r4-ext.c \ + InterFreqMeasQuantity.c \ + InterFreqMeasuredResults.c \ + InterFreqMeasuredResultsList.c \ + InterFreqMeasurementSysInfo-RSCP.c \ + InterFreqMeasurementSysInfo-ECN0.c \ + InterFreqMeasurementSysInfo-HCS-RSCP.c \ + InterFreqMeasurementSysInfo-HCS-ECN0.c \ + InterFreqMeasurementSysInfo-RSCP-LCR-r4.c \ + InterFreqMeasurementSysInfo-ECN0-LCR-r4.c \ + InterFreqMeasurementSysInfo-HCS-RSCP-LCR-r4.c \ + InterFreqMeasurementSysInfo-HCS-ECN0-LCR-r4.c \ + InterFreqRACHRepCellsList.c \ + InterFreqRACHReportingInfo.c \ + InterFreqReportCriteria.c \ + InterFreqReportCriteria-r4.c \ + InterFreqReportCriteria-r6.c \ + InterFreqReportingCriteria.c \ + InterFreqReportingCriteria-r6.c \ + InterFreqReportingQuantity.c \ + InterFreqRepQuantityRACH-FDD.c \ + InterFreqRepQuantityRACH-TDD.c \ + InterFreqRepQuantityRACH-TDDList.c \ + InterFrequencyMeasurement.c \ + InterFrequencyMeasurement-r4.c \ + InterFrequencyMeasurement-r6.c \ + InterRAT-TargetCellDescription.c \ + InterRATCellID.c \ + InterRATCellInfoIndication.c \ + InterRATCellInfoList.c \ + InterRATCellInfoList-B.c \ + InterRATCellInfoList-r4.c \ + InterRATCellInfoList-r6.c \ + InterRATCellIndividualOffset.c \ + InterRATEvent.c \ + InterRATEventList.c \ + InterRATEventResults.c \ + InterRATInfo.c \ + InterRATInfo-r6.c \ + InterRATMeasQuantity.c \ + InterRATMeasuredResults.c \ + InterRATMeasuredResultsList.c \ + InterRATMeasurement.c \ + InterRATMeasurement-r4.c \ + InterRATMeasurement-r6.c \ + InterRATMeasurementSysInfo.c \ + InterRATMeasurementSysInfo-B.c \ + InterRATReportCriteria.c \ + InterRATReportingCriteria.c \ + InterRATReportingQuantity.c \ + IntraFreqCellID.c \ + IntraFreqCellInfoList.c \ + IntraFreqCellInfoList-r4.c \ + IntraFreqCellInfoSI-List-RSCP.c \ + IntraFreqCellInfoSI-List-ECN0.c \ + IntraFreqCellInfoSI-List-HCS-RSCP.c \ + IntraFreqCellInfoSI-List-HCS-ECN0.c \ + IntraFreqCellInfoSI-List-RSCP-LCR-r4.c \ + IntraFreqCellInfoSI-List-ECN0-LCR-r4.c \ + IntraFreqCellInfoSI-List-HCS-RSCP-LCR-r4.c \ + IntraFreqCellInfoSI-List-HCS-ECN0-LCR-r4.c \ + IntraFreqEvent.c \ + IntraFreqEvent-r4.c \ + IntraFreqEvent-LCR-r4.c \ + IntraFreqEvent-r6.c \ + IntraFreqEvent-1d-r5.c \ + IntraFreqEventCriteria.c \ + IntraFreqEventCriteria-r4.c \ + IntraFreqEventCriteria-LCR-r4.c \ + IntraFreqEventCriteria-r6.c \ + IntraFreqEventCriteriaList.c \ + IntraFreqEventCriteriaList-r4.c \ + IntraFreqEventCriteriaList-LCR-r4.c \ + IntraFreqEventCriteriaList-r6.c \ + IntraFreqEventResults.c \ + IntraFreqMeasQuantity.c \ + IntraFreqMeasQuantity-FDD.c \ + IntraFreqMeasQuantity-TDD.c \ + IntraFreqMeasQuantity-TDDList.c \ + IntraFreqMeasuredResultsList.c \ + IntraFreqMeasurementSysInfo-RSCP.c \ + IntraFreqMeasurementSysInfo-ECN0.c \ + IntraFreqMeasurementSysInfo-HCS-RSCP.c \ + IntraFreqMeasurementSysInfo-HCS-ECN0.c \ + IntraFreqMeasurementSysInfo-RSCP-LCR-r4.c \ + IntraFreqMeasurementSysInfo-ECN0-LCR-r4.c \ + IntraFreqMeasurementSysInfo-HCS-RSCP-LCR-r4.c \ + IntraFreqMeasurementSysInfo-HCS-ECN0-LCR-r4.c \ + IntraFreqReportCriteria.c \ + IntraFreqReportCriteria-r4.c \ + IntraFreqReportCriteria-r6.c \ + IntraFreqReportingCriteria.c \ + IntraFreqReportingCriteria-r4.c \ + IntraFreqReportingCriteria-LCR-r4.c \ + IntraFreqReportingCriteria-r6.c \ + IntraFreqReportingQuantity.c \ + IntraFreqReportingQuantityForRACH.c \ + IntraFreqRepQuantityRACH-FDD.c \ + IntraFreqRepQuantityRACH-TDD.c \ + IntraFreqRepQuantityRACH-TDDList.c \ + IntraFrequencyMeasurement.c \ + IntraFrequencyMeasurement-r4.c \ + IntraFrequencyMeasurement-r6.c \ + IODE.c \ + IP-Length.c \ + IP-PCCPCH-r4.c \ + IP-Spacing.c \ + IP-Spacing-TDD.c \ + IS-2000SpecificMeasInfo.c \ + MaxNumberOfReportingCellsType1.c \ + MaxNumberOfReportingCellsType2.c \ + MaxNumberOfReportingCellsType3.c \ + MaxReportedCellsOnRACH.c \ + MaxReportedCellsOnRACHinterFreq.c \ + MeasuredResults.c \ + MeasuredResults-v390ext.c \ + MeasuredResults-v590ext.c \ + MeasuredResults-v7xyext.c \ + MeasuredResults-LCR-r4.c \ + MeasuredResultsList.c \ + MeasuredResultsList-LCR-r4-ext.c \ + MeasuredResultsOnRACH.c \ + MeasuredResultsOnRACHinterFreq.c \ + MeasurementCommand.c \ + MeasurementCommand-r4.c \ + MeasurementCommand-r6.c \ + MeasurementControlSysInfo.c \ + MeasurementControlSysInfo-LCR-r4-ext.c \ + MeasurementIdentity.c \ + MeasurementQuantityGSM.c \ + MeasurementReportingMode.c \ + MeasurementType.c \ + MeasurementType-r4.c \ + MeasurementType-r6.c \ + MeasurementValidity.c \ + MonitoredCellRACH-List.c \ + MonitoredCellRACH-Result.c \ + MultipathIndicator.c \ + N-CR-T-CRMaxHyst.c \ + NavigationModelSatInfo.c \ + NavigationModelSatInfoList.c \ + EphemerisParameter.c \ + NC-Mode.c \ + Neighbour.c \ + Neighbour-v390ext.c \ + NeighbourList.c \ + NeighbourList-v390ext.c \ + NeighbourQuality.c \ + NewInterFreqCell.c \ + NewInterFreqCell-r4.c \ + NewInterFreqCellList.c \ + NewInterFreqCellList-r4.c \ + NewInterFreqCellSI-RSCP.c \ + NewInterFreqCellSI-ECN0.c \ + NewInterFreqCellSI-HCS-RSCP.c \ + NewInterFreqCellSI-HCS-ECN0.c \ + NewInterFreqCellSI-RSCP-LCR-r4.c \ + NewInterFreqCellSI-ECN0-LCR-r4.c \ + NewInterFreqCellSI-HCS-RSCP-LCR-r4.c \ + NewInterFreqCellSI-HCS-ECN0-LCR-r4.c \ + NewInterFreqCellSI-List-ECN0.c \ + NewInterFreqCellSI-List-HCS-RSCP.c \ + NewInterFreqCellSI-List-HCS-ECN0.c \ + NewInterFreqCellSI-List-RSCP.c \ + NewInterFreqCellSI-List-ECN0-LCR-r4.c \ + NewInterFreqCellSI-List-HCS-RSCP-LCR-r4.c \ + NewInterFreqCellSI-List-HCS-ECN0-LCR-r4.c \ + NewInterFreqCellSI-List-RSCP-LCR-r4.c \ + NewInterRATCell.c \ + NewInterRATCell-B.c \ + NewInterRATCellList.c \ + NewInterRATCellList-B.c \ + NewIntraFreqCell.c \ + NewIntraFreqCell-r4.c \ + NewIntraFreqCellList.c \ + NewIntraFreqCellList-r4.c \ + NewIntraFreqCellSI-RSCP.c \ + NewIntraFreqCellSI-ECN0.c \ + NewIntraFreqCellSI-HCS-RSCP.c \ + NewIntraFreqCellSI-HCS-ECN0.c \ + NewIntraFreqCellSI-RSCP-LCR-r4.c \ + NewIntraFreqCellSI-ECN0-LCR-r4.c \ + NewIntraFreqCellSI-HCS-RSCP-LCR-r4.c \ + NewIntraFreqCellSI-HCS-ECN0-LCR-r4.c \ + NewIntraFreqCellSI-List-RSCP.c \ + NewIntraFreqCellSI-List-ECN0.c \ + NewIntraFreqCellSI-List-HCS-RSCP.c \ + NewIntraFreqCellSI-List-HCS-ECN0.c \ + NewIntraFreqCellSI-List-RSCP-LCR-r4.c \ + NewIntraFreqCellSI-List-ECN0-LCR-r4.c \ + NewIntraFreqCellSI-List-HCS-RSCP-LCR-r4.c \ + NewIntraFreqCellSI-List-HCS-ECN0-LCR-r4.c \ + NonUsedFreqParameter.c \ + NonUsedFreqParameter-r6.c \ + NonUsedFreqParameterList.c \ + NonUsedFreqParameterList-r6.c \ + NonUsedFreqWList-r6.c \ + ObservedTimeDifferenceToGSM.c \ + OTDOA-SearchWindowSize.c \ + Pathloss.c \ + PenaltyTime-RSCP.c \ + PenaltyTime-ECN0.c \ + PendingTimeAfterTrigger.c \ + PeriodicalOrEventTrigger.c \ + PeriodicalReportingCriteria.c \ + PeriodicalWithReportingCellStatus.c \ + PLMNIdentitiesOfNeighbourCells.c \ + PLMNsOfInterFreqCellsList.c \ + PLMNsOfIntraFreqCellsList.c \ + PLMNsOfInterRATCellsList.c \ + PositionEstimate.c \ + PositioningMethod.c \ + PRC.c \ + PrimaryCCPCH-RSCP.c \ + Q-HCS.c \ + Q-OffsetS-N.c \ + Q-QualMin.c \ + Q-RxlevMin.c \ + QualityEventResults.c \ + QualityMeasuredResults.c \ + QualityMeasurement.c \ + QualityReportCriteria.c \ + QualityReportingCriteria.c \ + QualityReportingCriteriaSingle.c \ + QualityReportingQuantity.c \ + RAT-Type.c \ + ReferenceCellPosition.c \ + ReferenceLocation.c \ + ReferenceTimeDifferenceToCell.c \ + RemovedInterFreqCellList.c \ + RemovedInterRATCellList.c \ + RemovedIntraFreqCellList.c \ + ReplacementActivationThreshold.c \ + ReportDeactivationThreshold.c \ + ReportingAmount.c \ + ReportingCellStatus.c \ + ReportingCellStatusOpt.c \ + ReportingInfoForCellDCH.c \ + ReportingInfoForCellDCH-LCR-r4.c \ + ReportingInterval.c \ + ReportingIntervalLong.c \ + ReportingRange.c \ + RL-AdditionInfoList.c \ + RL-InformationLists.c \ + RLC-BuffersPayload.c \ + RRC.c \ + SatData.c \ + SatDataList.c \ + SatelliteStatus.c \ + SatID.c \ + SFN-Offset-Validity.c \ + SFN-SFN-Drift.c \ + SFN-SFN-ObsTimeDifference.c \ + SFN-SFN-ObsTimeDifference1.c \ + SFN-SFN-ObsTimeDifference2.c \ + SFN-SFN-OTD-Type.c \ + SFN-SFN-RelTimeDifference1.c \ + SFN-TOW-Uncertainty.c \ + SIR.c \ + SIR-MeasurementList.c \ + SIR-MeasurementResults.c \ + SIR-TFCS.c \ + SIR-TFCS-List.c \ + SIR-TimeslotList.c \ + SubFrame1Reserved.c \ + T-ADVinfo.c \ + T-CRMax.c \ + T-CRMaxHyst.c \ + TemporaryOffset1.c \ + TemporaryOffset2.c \ + TemporaryOffsetList.c \ + Threshold.c \ + Threshold-r6.c \ + ThreholdNonUsedFrequency-deltaList.c \ + ThresholdPositionChange.c \ + ThresholdSFN-GPS-TOW.c \ + ThresholdSFN-SFN-Change.c \ + ThresholdUsedFrequency.c \ + ThresholdUsedFrequency-r6.c \ + TimeInterval.c \ + TimeslotInfo.c \ + TimeslotInfo-LCR-r4.c \ + TimeslotInfoList.c \ + TimeslotInfoList-LCR-r4.c \ + TimeslotInfoList-r4.c \ + TimeslotISCP.c \ + TimeslotISCP-List.c \ + TimeslotListWithISCP.c \ + TimeslotWithISCP.c \ + TimeToTrigger.c \ + TrafficVolumeEventParam.c \ + TrafficVolumeEventResults.c \ + TrafficVolumeEventType.c \ + TrafficVolumeMeasQuantity.c \ + TrafficVolumeMeasSysInfo.c \ + TrafficVolumeMeasuredResults.c \ + TrafficVolumeMeasuredResultsList.c \ + TrafficVolumeMeasurement.c \ + TrafficVolumeMeasurementObjectList.c \ + TrafficVolumeReportCriteria.c \ + TrafficVolumeReportCriteriaSysInfo.c \ + TrafficVolumeReportingCriteria.c \ + TrafficVolumeReportingQuantity.c \ + TrafficVolumeThreshold.c \ + TransChCriteria.c \ + TransChCriteriaList.c \ + TransferMode.c \ + TransmittedPowerThreshold.c \ + TriggeringCondition1.c \ + TriggeringCondition2.c \ + TX-InterruptionAfterTrigger.c \ + UDRE.c \ + UE-6AB-Event.c \ + UE-6FG-Event.c \ + UE-AutonomousUpdateMode.c \ + UE-InternalEventParam.c \ + UE-InternalEventParamList.c \ + UE-InternalEventResults.c \ + UE-InternalMeasQuantity.c \ + UE-InternalMeasuredResults.c \ + UE-InternalMeasuredResults-r7.c \ + UE-InternalMeasuredResults-LCR-r4.c \ + UE-InternalMeasurement.c \ + UE-InternalMeasurement-r4.c \ + UE-InternalMeasurementSysInfo.c \ + UE-InternalReportCriteria.c \ + UE-InternalReportingCriteria.c \ + UE-InternalReportingQuantity.c \ + UE-InternalReportingQuantity-r4.c \ + UE-MeasurementQuantity.c \ + UE-RX-TX-ReportEntry.c \ + UE-RX-TX-ReportEntryList.c \ + UE-RX-TX-TimeDifferenceType1.c \ + UE-RX-TX-TimeDifferenceType2.c \ + UE-RX-TX-TimeDifferenceType2Info.c \ + UE-RX-TX-TimeDifferenceThreshold.c \ + UE-TransmittedPower.c \ + UE-TransmittedPowerTDD-List.c \ + UL-TrCH-Identity.c \ + UE-Positioning-Accuracy.c \ + UE-Positioning-CipherParameters.c \ + UE-Positioning-Error.c \ + UE-Positioning-ErrorCause.c \ + UE-Positioning-EventParam.c \ + UE-Positioning-EventParamList.c \ + UE-Positioning-EventSpecificInfo.c \ + UE-Positioning-GPS-AcquisitionAssistance.c \ + UE-Positioning-GPS-AdditionalAssistanceDataRequest.c \ + UE-Positioning-GPS-Almanac.c \ + UE-Positioning-GPS-AssistanceData.c \ + UE-Positioning-GPS-DGPS-Corrections.c \ + UE-Positioning-GPS-IonosphericModel.c \ + UE-Positioning-GPS-MeasurementResults.c \ + UE-Positioning-GPS-NavigationModel.c \ + UE-Positioning-GPS-NavModelAddDataReq.c \ + UE-Positioning-GPS-ReferenceCellInfo.c \ + UE-Positioning-GPS-ReferenceTime.c \ + UE-Positioning-GPS-UTC-Model.c \ + UE-Positioning-IPDL-Parameters.c \ + UE-Positioning-IPDL-Parameters-r4.c \ + UE-Positioning-IPDL-Parameters-TDD-r4-ext.c \ + UE-Positioning-MeasuredResults.c \ + UE-Positioning-MeasuredResults-v390ext.c \ + UE-Positioning-Measurement.c \ + UE-Positioning-Measurement-v390ext.c \ + UE-Positioning-Measurement-r4.c \ + UE-Positioning-Measurement-v7xyext.c \ + UE-Positioning-MeasurementEventResults.c \ + UE-Positioning-MeasurementInterval.c \ + UE-Positioning-MethodType.c \ + UE-Positioning-OTDOA-AssistanceData.c \ + UE-Positioning-OTDOA-AssistanceData-r4.c \ + UE-Positioning-OTDOA-AssistanceData-r4ext.c \ + UE-Positioning-OTDOA-AssistanceData-UEB.c \ + UE-Positioning-IPDL-Parameters-TDDList-r4-ext.c \ + UE-Positioning-OTDOA-Measurement.c \ + UE-Positioning-OTDOA-Measurement-v390ext.c \ + UE-Positioning-OTDOA-NeighbourCellInfo.c \ + UE-Positioning-OTDOA-NeighbourCellInfo-r4.c \ + UE-Positioning-OTDOA-NeighbourCellInfo-UEB.c \ + UE-Positioning-OTDOA-NeighbourCellList.c \ + UE-Positioning-OTDOA-NeighbourCellList-r4.c \ + UE-Positioning-OTDOA-NeighbourCellList-UEB.c \ + UE-Positioning-OTDOA-Quality.c \ + UE-Positioning-OTDOA-ReferenceCellInfo.c \ + UE-Positioning-OTDOA-ReferenceCellInfo-r4.c \ + UE-Positioning-OTDOA-ReferenceCellInfo-UEB.c \ + UE-Positioning-PositionEstimateInfo.c \ + UE-Positioning-ReportCriteria.c \ + UE-Positioning-ReportingQuantity.c \ + UE-Positioning-ReportingQuantity-v390ext.c \ + UE-Positioning-ReportingQuantity-r4.c \ + UE-Positioning-ReportingQuantity-v7xyext.c \ + UE-Positioning-ResponseTime.c \ + UTRA-CarrierRSSI.c \ + UTRAN-GPS-DriftRate.c \ + UTRAN-GPSReferenceTime.c \ + UTRAN-GPSReferenceTimeResult.c \ + VarianceOfRLC-BufferPayload.c \ + VelocityEstimate.c \ + W.c \ + BCC.c \ + BCCH-ModificationInfo.c \ + BCCH-ModificationTime.c \ + BSIC.c \ + CBS-DRX-Level1Information.c \ + CBS-DRX-Level1Information-extension-r6.c \ + CDMA2000-Message.c \ + CDMA2000-MessageList.c \ + CDMA2000-UMTS-Frequency-List.c \ + CellValueTag.c \ + ExpirationTimeFactor.c \ + FDD-UMTS-Frequency-List.c \ + FrequencyInfoCDMA2000.c \ + GERAN-SystemInfoBlock.c \ + GERAN-SystemInformation.c \ + GSM-BA-Range.c \ + GSM-BA-Range-List.c \ + GSM-Classmark2.c \ + GSM-Classmark3.c \ + GSM-MessageList.c \ + GSM-MS-RadioAccessCapability.c \ + GsmSecurityCapability.c \ + GSM-TargetCellInfoList.c \ + GSM-TargetCellInfo.c \ + IdentificationOfReceivedMessage.c \ + InterRAT-ChangeFailureCause.c \ + GERANIu-MessageList.c \ + GERANIu-RadioAccessCapability.c \ + InterRAT-UE-RadioAccessCapability.c \ + InterRAT-UE-RadioAccessCapabilityList.c \ + InterRAT-UE-RadioAccessCapability-v590ext.c \ + InterRAT-UE-RadioAccessCapability-v690ext.c \ + InterRAT-UE-SecurityCapability.c \ + InterRAT-UE-SecurityCapList.c \ + InterRAT-HO-FailureCause.c \ + MasterInformationBlock.c \ + MasterInformationBlock-v690ext.c \ + MIB-ValueTag.c \ + NCC.c \ + PLMN-ValueTag.c \ + PredefinedConfigIdentityAndValueTag.c \ + ProtocolErrorInformation.c \ + ReceivedMessageType.c \ + Rplmn-Information.c \ + Rplmn-Information-r4.c \ + SchedulingInformation.c \ + SchedulingInformationSIB.c \ + SchedulingInformationSIBSb.c \ + SegCount.c \ + SegmentIndex.c \ + SFN-Prime.c \ + SIB-Data-fixed.c \ + SIB-Data-variable.c \ + SIBOccurIdentity.c \ + SIBOccurrenceIdentityAndValueTag.c \ + SIBOccurValueTag.c \ + SIB-ReferenceList.c \ + SIBSb-ReferenceList.c \ + SIB-ReferenceListFACH.c \ + SIB-Type.c \ + SIB-TypeAndTag.c \ + SIBSb-TypeAndTag.c \ + SibOFF.c \ + SibOFF-List.c \ + SysInfoType1.c \ + SysInfoType1-v3a0ext-IEs.c \ + SysInfoType2.c \ + SysInfoType3.c \ + SysInfoType3-v4b0ext-IEs.c \ + SysInfoType3-v590ext.c \ + SysInfoType3-v5c0ext-IEs.c \ + SysInfoType3-v670ext.c \ + SysInfoType4.c \ + SysInfoType4-v4b0ext-IEs.c \ + SysInfoType4-v590ext.c \ + SysInfoType4-v5b0ext-IEs.c \ + SysInfoType4-v5c0ext-IEs.c \ + SysInfoType5.c \ + SysInfoType5-v4b0ext-IEs.c \ + SysInfoType5-v590ext-IEs.c \ + SysInfoType5-v650ext-IEs.c \ + SysInfoType5-v680ext-IEs.c \ + SysInfoType5-v690ext-IEs.c \ + SysInfoType5-v7xyext-IEs.c \ + SysInfoType5bis.c \ + SysInfoType6.c \ + SysInfoType6-v4b0ext-IEs.c \ + SysInfoType6-v590ext-IEs.c \ + SysInfoType6-v650ext-IEs.c \ + SysInfoType6-v690ext-IEs.c \ + SysInfoType6-v7xyext-IEs.c \ + SysInfoType7.c \ + SysInfoType8.c \ + SysInfoType9.c \ + SysInfoType10.c \ + SysInfoType11.c \ + SysInfoType11-v4b0ext-IEs.c \ + SysInfoType11-v590ext-IEs.c \ + SysInfoType11-v690ext-IEs.c \ + SysInfoType12.c \ + SysInfoType12-v4b0ext-IEs.c \ + SysInfoType12-v590ext-IEs.c \ + SysInfoType12-v690ext-IEs.c \ + SysInfoType13.c \ + SysInfoType13-v3a0ext-IEs.c \ + SysInfoType13-v4b0ext-IEs.c \ + SysInfoType13-v7xyext-IEs.c \ + SysInfoType13-1.c \ + SysInfoType13-2.c \ + SysInfoType13-3.c \ + SysInfoType13-4.c \ + SysInfoType14.c \ + SysInfoType15.c \ + SysInfoType15-v4b0ext-IEs.c \ + SysInfoType15-1.c \ + SysInfoType15-2.c \ + SysInfoType15-3.c \ + SysInfoType15-4.c \ + SysInfoType15-4-v3a0ext.c \ + SysInfoType15-4-v4b0ext.c \ + SysInfoType15-5.c \ + SysInfoType15-5-v3a0ext.c \ + SysInfoType16.c \ + SysInfoType17.c \ + SysInfoType17-v4b0ext-IEs.c \ + SysInfoType17-v590ext-IEs.c \ + SysInfoType17-v7xyext-IEs.c \ + SysInfoType18.c \ + SysInfoTypeSB1.c \ + SysInfoTypeSB2.c \ + TDD-UMTS-Frequency-List.c \ + ANSI-41-GlobalServiceRedirectInfo.c \ + ANSI-41-PrivateNeighbourListInfo.c \ + ANSI-41-RAND-Information.c \ + ANSI-41-UserZoneID-Information.c \ + ANSI-41-NAS-Parameter.c \ + Min-P-REV.c \ + NAS-SystemInformationANSI-41.c \ + NID.c \ + P-REV.c \ + SID.c \ + MBMS-AccessProbabilityFactor.c \ + MBMS-CellGroupIdentity-r6.c \ + MBMS-CommonCCTrChIdentity.c \ + MBMS-CommonPhyChIdentity.c \ + MBMS-CommonRBIdentity.c \ + MBMS-CommonRBInformation-r6.c \ + MBMS-CommonRBInformationList-r6.c \ + MBMS-CommonTrChIdentity.c \ + MBMS-ConnectedModeCountingScope.c \ + MBMS-CurrentCell-SCCPCH-r6.c \ + MBMS-CurrentCell-SCCPCHList-r6.c \ + MBMS-FACHCarryingMTCH-List.c \ + MBMS-JoinedInformation-r6.c \ + MBMS-L1CombiningSchedule-32.c \ + MBMS-L1CombiningSchedule-64.c \ + MBMS-L1CombiningSchedule-128.c \ + MBMS-L1CombiningSchedule-256.c \ + MBMS-L1CombiningSchedule-512.c \ + MBMS-L1CombiningSchedule-1024.c \ + MBMS-L1CombiningSchedule.c \ + MBMS-L1CombiningTransmTimeDiff.c \ + MBMS-L23Configuration.c \ + MBMS-LogicalChIdentity.c \ + MBMS-MCCH-ConfigurationInfo-r6.c \ + MBMS-MICHConfigurationInfo-r6.c \ + MBMS-MICHConfigurationInfo-r7.c \ + MBMS-MICHNotificationIndLength.c \ + MBMS-MICHPowerOffset.c \ + MBMS-ModifedService-r6.c \ + MBMS-ModifedServiceList-r6.c \ + MBMS-MSCH-ConfigurationInfo-r6.c \ + MBMS-MSCHSchedulingInfo.c \ + MBMS-NeighbouringCellSCCPCH-r6.c \ + MBMS-NeighbouringCellSCCPCHList-r6.c \ + MBMS-NI-CountPerFrame.c \ + MBMS-NumberOfNeighbourCells-r6.c \ + MBMS-PFLIndex.c \ + MBMS-PFLInfo.c \ + MBMS-PhyChInformation-r6.c \ + MBMS-PhyChInformationList-r6.c \ + MBMS-PL-ServiceRestrictInfo-r6.c \ + MBMS-PreferredFreqRequest-r6.c \ + MBMS-PreferredFrequencyInfo-r6.c \ + MBMS-PreferredFrequencyList-r6.c \ + MBMS-PTMActivationTime-r6.c \ + MBMS-PTM-RBInformation-C.c \ + MBMS-PTM-RBInformation-CList.c \ + MBMS-PTM-RBInformation-N.c \ + MBMS-PTM-RBInformation-NList.c \ + MBMS-Qoffset.c \ + MBMS-RequiredUEAction-Mod.c \ + MBMS-RequiredUEAction-UMod.c \ + MBMS-SCCPCHIdentity.c \ + MBMS-SCCPCHPwrOffsetDiff.c \ + MBMS-ServiceAccessInfo-r6.c \ + MBMS-ServiceAccessInfoList-r6.c \ + MBMS-ServiceIdentity-r6.c \ + MBMS-ServiceSchedulingInfo-r6.c \ + MBMS-ServiceSchedulingInfoList-r6.c \ + MBMS-ServiceTransmInfo.c \ + MBMS-ServiceTransmInfoList.c \ + MBMS-SessionIdentity.c \ + MBMS-ShortTransmissionID.c \ + MBMS-SIBType5-SCCPCH-r6.c \ + MBMS-SIBType5-SCCPCHList-r6.c \ + MBMS-SoftComb-TimingOffset.c \ + MBMS-TCTF-Presence.c \ + MBMS-TimersAndCounters-r6.c \ + MBMS-TransmissionIdentity.c \ + MBMS-TranspChInfoForCCTrCh-r6.c \ + MBMS-TranspChInfoForEachCCTrCh-r6.c \ + MBMS-TranspChInfoForEachTrCh-r6.c \ + MBMS-TranspChInfoForTrCh-r6.c \ + MBMS-TrCHInformation-Curr.c \ + MBMS-TrCHInformation-CurrList.c \ + MBMS-TrCHInformation-Neighb.c \ + MBMS-TrCHInformation-NeighbList.c \ + MBMS-TrCHInformation-SIB5.c \ + MBMS-TrCHInformation-SIB5List.c \ + MBMS-UnmodifiedService-r6.c \ + MBMS-UnmodifiedServiceList-r6.c \ + ToTargetRNC-Container.c \ + TargetRNC-ToSourceRNC-Container.c \ + InterRATHandoverInfoWithInterRATCapabilities-r3.c \ + InterRATHandoverInfoWithInterRATCapabilities-r3-IEs.c \ + InterRATHandoverInfoWithInterRATCapabilities-v390ext-IEs.c \ + InterRATHandoverInfoWithInterRATCapabilities-v690ext-IEs.c \ + RFC3095-ContextInfo-r5.c \ + RFC3095-ContextInfoList-r5.c \ + SRNC-RelocationInfo-r3.c \ + SRNC-RelocationInfo-r3-IEs.c \ + SRNC-RelocationInfo-v380ext-IEs.c \ + SRNC-RelocationInfo-v390ext-IEs.c \ + SRNC-RelocationInfo-v3a0ext-IEs.c \ + SRNC-RelocationInfo-v3b0ext-IEs.c \ + SRNC-RelocationInfo-v3c0ext-IEs.c \ + SRNC-RelocationInfo-v3d0ext-IEs.c \ + SRNC-RelocationInfo-v3g0ext-IEs.c \ + SRNC-RelocationInfo-v3h0ext-IEs.c \ + SRNC-RelocationInfo-v4d0ext-IEs.c \ + TPC-CombinationInfoList.c \ + STARTList2.c \ + SRNC-RelocationInfo-v4b0ext-IEs.c \ + SRNC-RelocationInfo-v590ext-IEs.c \ + SRNC-RelocationInfo-v5a0ext-IEs.c \ + SRNC-RelocationInfo-v5b0ext-IEs.c \ + SRNC-RelocationInfo-v5c0ext-IEs.c \ + SRNC-RelocationInfo-v7xyext-IEs.c \ + CipheringInfoPerRB-List-v3a0ext.c \ + CipheringStatusList.c \ + CipheringStatusCNdomain.c \ + CodeChangeStatusList.c \ + CodeChangeStatus.c \ + StoredCompressedModeInfo.c \ + StoredTGP-SequenceList.c \ + StoredTGP-Sequence.c \ + SRNC-RelocationInfo-r4-IEs.c \ + SRNC-RelocationInfo-r5-IEs.c \ + SRNC-RelocationInfo-v690ext-IEs.c \ + SRNC-RelocationInfo-r6-IEs.c \ + CalculationTimeForCiphering.c \ + CipheringInfoPerRB.c \ + CipheringInfoPerRB-r4.c \ + CipheringInfoPerRB-List.c \ + CipheringInfoPerRB-List-r4.c \ + CipheringStatus.c \ + CipheringStatusList-r4.c \ + CipheringStatusCNdomain-r4.c \ + CN-DomainInformation-v390ext.c \ + CN-DomainInformationList-v390ext.c \ + CompressedModeMeasCapability-r4.c \ + COUNT-C-List.c \ + COUNT-CSingle.c \ + DL-PhysChCapabilityFDD-r4.c \ + DL-PhysChCapabilityFDD-r5.c \ + DL-PhysChCapabilityTDD-r5.c \ + DL-PhysChCapabilityTDD-LCR-r5.c \ + DL-RFC3095-Context.c \ + ImplementationSpecificParams.c \ + IntegrityProtectionStatus.c \ + InterRAT-UE-RadioAccessCapabilityList-r5.c \ + IntraFreqReportingCriteria-r6-ext.c \ + MaxHcContextSpace-r5.c \ + MeasurementCapability-r4.c \ + MeasurementCommandWithType.c \ + MeasurementCommandWithType-r4.c \ + MeasurementCommandWithType-r6.c \ + OngoingMeasRep.c \ + OngoingMeasRep-r4.c \ + OngoingMeasRep-r5.c \ + OngoingMeasRep-r6.c \ + OngoingMeasRepList.c \ + OngoingMeasRepList-r4.c \ + OngoingMeasRepList-r5.c \ + OngoingMeasRepList-r6.c \ + PDCP-Capability-r4.c \ + PDCP-Capability-r5.c \ + PDCP-Capability-r6.c \ + PhysicalChannelCapability-r4.c \ + PhysicalChannelCapability-r5.c \ + RF-Capability-r4.c \ + RFC3095-ContextInfo.c \ + RFC3095-Context-List.c \ + RLC-Capability-r5.c \ + SRB-SpecificIntegrityProtInfo.c \ + SRB-SpecificIntegrityProtInfoList.c \ + StateOfRRC.c \ + StateOfRRC-Procedure.c \ + TotalRLC-AM-BufferSize-r5.c \ + TPC-Combination-Info.c \ + UE-MultiModeRAT-Capability-r5.c \ + UE-Positioning-Capability-r4.c \ + UE-Positioning-LastKnownPos.c \ + UE-RadioAccessCapability-r4.c \ + UE-RadioAccessCapability-r5.c \ + UE-RadioAccessCapability-r6.c \ + UE-RadioAccessCapability-r7.c \ + UL-RFC3095-Context.c + +ASN_MODULE_HEADERS= \ + DL-DCCH-Message.h \ + DL-DCCH-MessageType.h \ + UL-DCCH-Message.h \ + UL-DCCH-MessageType.h \ + DL-CCCH-Message.h \ + DL-CCCH-MessageType.h \ + UL-CCCH-Message.h \ + UL-CCCH-MessageType.h \ + PCCH-Message.h \ + PCCH-MessageType.h \ + DL-SHCCH-Message.h \ + DL-SHCCH-MessageType.h \ + UL-SHCCH-Message.h \ + UL-SHCCH-MessageType.h \ + BCCH-FACH-Message.h \ + BCCH-FACH-MessageType.h \ + BCCH-BCH-Message.h \ + MCCH-Message.h \ + MCCH-MessageType.h \ + MSCH-Message.h \ + MSCH-MessageType.h \ + ActiveSetUpdate.h \ + ActiveSetUpdate-r3-IEs.h \ + ActiveSetUpdate-v4b0ext-IEs.h \ + ActiveSetUpdate-v590ext-IEs.h \ + ActiveSetUpdate-v690ext-IEs.h \ + ActiveSetUpdate-r6-IEs.h \ + ActiveSetUpdateComplete.h \ + ActiveSetUpdateFailure.h \ + AssistanceDataDelivery.h \ + AssistanceDataDelivery-r3-IEs.h \ + AssistanceDataDelivery-v3a0ext.h \ + AssistanceDataDelivery-v4b0ext-IEs.h \ + CellChangeOrderFromUTRAN.h \ + CellChangeOrderFromUTRAN-r3-IEs.h \ + CellChangeOrderFromUTRAN-v590ext-IEs.h \ + CellChangeOrderFromUTRANFailure.h \ + CellChangeOrderFromUTRANFailure-r3-IEs.h \ + CellUpdate.h \ + CellUpdate-v590ext.h \ + CellUpdate-v690ext-IEs.h \ + CellUpdate-v7xyext-IEs.h \ + CellUpdateConfirm.h \ + CellUpdateConfirm-r3-IEs.h \ + CellUpdateConfirm-v3a0ext.h \ + CellUpdateConfirm-v4b0ext-IEs.h \ + CellUpdateConfirm-v590ext-IEs.h \ + CellUpdateConfirm-v5d0ext-IEs.h \ + CellUpdateConfirm-r4-IEs.h \ + CellUpdateConfirm-r5-IEs.h \ + CellUpdateConfirm-r6-IEs.h \ + CellUpdateConfirm-v690ext-IEs.h \ + CellUpdateConfirm-r7-IEs.h \ + CellUpdateConfirm-CCCH.h \ + CounterCheck.h \ + CounterCheck-r3-IEs.h \ + CounterCheckResponse.h \ + DownlinkDirectTransfer.h \ + DownlinkDirectTransfer-r3-IEs.h \ + HandoverToUTRANCommand.h \ + HandoverToUTRANCommand-r3-IEs.h \ + HandoverToUTRANCommand-r4-IEs.h \ + HandoverToUTRANCommand-r5-IEs.h \ + HandoverToUTRANCommand-r6-IEs.h \ + HandoverToUTRANCommand-r7-IEs.h \ + HandoverToUTRANComplete.h \ + InitialDirectTransfer.h \ + InitialDirectTransfer-v3a0ext.h \ + InitialDirectTransfer-v590ext.h \ + InitialDirectTransfer-v690ext-IEs.h \ + HandoverFromUTRANCommand-GSM.h \ + HandoverFromUTRANCommand-GSM-r3-IEs.h \ + HandoverFromUTRANCommand-GSM-r6-IEs.h \ + HandoverFromUTRANCommand-GSM-v690ext-IEs.h \ + HandoverFromUTRANCommand-GERANIu.h \ + HandoverFromUTRANCommand-GERANIu-r5-IEs.h \ + HandoverFromUTRANCommand-CDMA2000.h \ + HandoverFromUTRANCommand-CDMA2000-r3-IEs.h \ + HandoverFromUTRANFailure.h \ + HandoverFromUtranFailure-v590ext-IEs.h \ + InterRATHandoverInfo.h \ + InterRATHandoverInfo-v390ext-IEs.h \ + InterRATHandoverInfo-v3a0ext-IEs.h \ + InterRATHandoverInfo-v3d0ext-IEs.h \ + InterRATHandoverInfo-v3g0ext-IEs.h \ + InterRATHandoverInfo-r3-add-ext-IEs.h \ + InterRATHandoverInfo-v4b0ext-IEs.h \ + InterRATHandoverInfo-v4d0ext-IEs.h \ + InterRATHandoverInfo-v590ext-IEs.h \ + InterRATHandoverInfo-v690ext1-IEs.h \ + InterRATHandoverInfo-v690ext-IEs.h \ + InterRATHandoverInfo-v7xyext-IEs.h \ + MeasurementControl.h \ + MeasurementControl-r3-IEs.h \ + MeasurementControl-v390ext.h \ + MeasurementControl-v3a0ext.h \ + MeasurementControl-r4-IEs.h \ + MeasurementControl-v590ext-IEs.h \ + MeasurementControl-v5b0ext-IEs.h \ + MeasurementControl-r6-IEs.h \ + MeasurementControl-v6a0ext-IEs.h \ + MeasurementControl-v7xyext-IEs.h \ + MeasurementControlFailure.h \ + MeasurementControlFailure-v590ext-IEs.h \ + MeasurementReport.h \ + MeasurementReport-v390ext.h \ + MeasurementReport-v4b0ext-IEs.h \ + MeasurementReport-v590ext-IEs.h \ + MeasurementReport-v5b0ext-IEs.h \ + MeasurementReport-v690ext-IEs.h \ + MeasurementReport-v7xyext-IEs.h \ + PagingType1.h \ + PagingType1-v590ext-IEs.h \ + PagingType2.h \ + PhysicalChannelReconfiguration.h \ + PhysicalChannelReconfiguration-r3-IEs.h \ + PhysicalChannelReconfiguration-v3a0ext.h \ + PhysicalChannelReconfiguration-v4b0ext-IEs.h \ + PhysicalChannelReconfiguration-v590ext-IEs.h \ + PhysicalChannelReconfiguration-r4-IEs.h \ + PhysicalChannelReconfiguration-r5-IEs.h \ + PhysicalChannelReconfiguration-r6-IEs.h \ + PhysicalChannelReconfiguration-v690ext-IEs.h \ + PhysicalChannelReconfiguration-r7-IEs.h \ + PhysicalChannelReconfigurationComplete.h \ + PhysicalChannelReconfigurationComplete-v7xyext-IEs.h \ + PhysicalChannelReconfigurationFailure.h \ + PhysicalSharedChannelAllocation.h \ + PhysicalSharedChannelAllocation-r3-IEs.h \ + PhysicalSharedChannelAllocation-r4-IEs.h \ + PhysicalSharedChannelAllocation-v690ext-IEs.h \ + PhysicalSharedChannelAllocation-v7xyext-IEs.h \ + PUSCHCapacityRequest.h \ + PUSCHCapacityRequest-v590ext.h \ + RadioBearerReconfiguration.h \ + RadioBearerReconfiguration-r3-IEs.h \ + RadioBearerReconfiguration-v3a0ext.h \ + RadioBearerReconfiguration-v4b0ext-IEs.h \ + RadioBearerReconfiguration-v590ext-IEs.h \ + RadioBearerReconfiguration-v5d0ext-IEs.h \ + RadioBearerReconfiguration-r4-IEs.h \ + RadioBearerReconfiguration-r5-IEs.h \ + RadioBearerReconfiguration-r6-IEs.h \ + RadioBearerReconfiguration-v690ext-IEs.h \ + RadioBearerReconfiguration-r7-IEs.h \ + RadioBearerReconfigurationComplete.h \ + RadioBearerReconfigurationComplete-v7xyext-IEs.h \ + RadioBearerReconfigurationFailure.h \ + RadioBearerRelease.h \ + RadioBearerRelease-r3-IEs.h \ + RadioBearerRelease-v3a0ext.h \ + RadioBearerRelease-v4b0ext-IEs.h \ + RadioBearerRelease-v590ext-IEs.h \ + RadioBearerRelease-r4-IEs.h \ + RadioBearerRelease-r5-IEs.h \ + RadioBearerRelease-v690ext-IEs.h \ + RadioBearerRelease-r6-IEs.h \ + RadioBearerRelease-r7-IEs.h \ + RadioBearerReleaseComplete.h \ + RadioBearerReleaseComplete-v7xyext-IEs.h \ + RadioBearerReleaseFailure.h \ + RadioBearerSetup.h \ + RadioBearerSetup-r3-IEs.h \ + RadioBearerSetup-v3a0ext.h \ + RadioBearerSetup-v4b0ext-IEs.h \ + RadioBearerSetup-v590ext-IEs.h \ + RadioBearerSetup-v5d0ext-IEs.h \ + RadioBearerSetup-r4-IEs.h \ + RadioBearerSetup-r5-IEs.h \ + RadioBearerSetup-v690ext-IEs.h \ + RadioBearerSetup-r6-IEs.h \ + RadioBearerSetup-r7-IEs.h \ + RadioBearerSetupComplete.h \ + RadioBearerSetupComplete-v7xyext-IEs.h \ + RadioBearerSetupFailure.h \ + RRCConnectionReject.h \ + RRCConnectionReject-r3-IEs.h \ + RRCConnectionReject-v690ext-IEs.h \ + RRCConnectionRelease.h \ + RRCConnectionRelease-r3-IEs.h \ + RRCConnectionRelease-r4-IEs.h \ + RRCConnectionRelease-v690ext-IEs.h \ + RRCConnectionRelease-CCCH.h \ + RRCConnectionRelease-CCCH-r3-IEs.h \ + RRCConnectionRelease-CCCH-r4-IEs.h \ + RRCConnectionRelease-CCCH-r5-IEs.h \ + RRCConnectionRelease-CCCH-v690ext-IEs.h \ + RRCConnectionReleaseComplete.h \ + RRCConnectionRequest.h \ + RRCConnectionRequest-v3d0ext-IEs.h \ + RRCConnectionRequest-v4b0ext-IEs.h \ + RRCConnectionRequest-v590ext-IEs.h \ + RRCConnectionRequest-v690ext-IEs.h \ + RRCConnectionSetup.h \ + RRCConnectionSetup-r3-IEs.h \ + RRCConnectionSetup-v4b0ext-IEs.h \ + RRCConnectionSetup-v590ext-IEs.h \ + RRCConnectionSetup-r4-IEs.h \ + RRCConnectionSetup-r5-IEs.h \ + RRCConnectionSetup-v690ext-IEs.h \ + RRCConnectionSetup-r6-IEs.h \ + RRCConnectionSetup-r7-IEs.h \ + RRCConnectionSetup-v7xyext-IEs.h \ + RRCConnectionSetupComplete.h \ + RRCConnectionSetupComplete-v370ext.h \ + RRCConnectionSetupComplete-v380ext-IEs.h \ + RRCConnectionSetupComplete-v3a0ext-IEs.h \ + RRCConnectionSetupComplete-v3g0ext-IEs.h \ + RRCConnectionSetupComplete-r3-add-ext-IEs.h \ + RRCConnectionSetupComplete-v4b0ext-IEs.h \ + RRCConnectionSetupComplete-v590ext-IEs.h \ + RRCConnectionSetupComplete-v5c0ext-IEs.h \ + RRCConnectionSetupComplete-v650ext-IEs.h \ + RRCConnectionSetupComplete-v680ext-IEs.h \ + RRCConnectionSetupComplete-v690ext-IEs.h \ + RRCConnectionSetupComplete-v7xyext-IEs.h \ + RRC-FailureInfo.h \ + RRC-FailureInfo-r3-IEs.h \ + RRCStatus.h \ + SecurityModeCommand.h \ + SecurityModeCommand-r3-IEs.h \ + SecurityModeComplete.h \ + SecurityModeFailure.h \ + SignallingConnectionRelease.h \ + SignallingConnectionRelease-r3-IEs.h \ + SignallingConnectionReleaseIndication.h \ + SystemInformation-BCH.h \ + SystemInformation-FACH.h \ + FirstSegment.h \ + FirstSegmentShort.h \ + SubsequentSegment.h \ + LastSegment.h \ + LastSegmentShort.h \ + CompleteSIB-List.h \ + CompleteSIB.h \ + CompleteSIBshort.h \ + SystemInformationChangeIndication.h \ + TransportChannelReconfiguration.h \ + TransportChannelReconfiguration-r3-IEs.h \ + TransportChannelReconfiguration-v3a0ext.h \ + TransportChannelReconfiguration-v4b0ext-IEs.h \ + TransportChannelReconfiguration-v590ext-IEs.h \ + TransportChannelReconfiguration-r4-IEs.h \ + TransportChannelReconfiguration-r5-IEs.h \ + TransportChannelReconfiguration-v690ext-IEs.h \ + TransportChannelReconfiguration-r6-IEs.h \ + TransportChannelReconfiguration-r7-IEs.h \ + TransportChannelReconfigurationComplete.h \ + TransportChannelReconfigurationComplete-v7xyext-IEs.h \ + TransportChannelReconfigurationFailure.h \ + TransportFormatCombinationControl.h \ + TransportFormatCombinationControlFailure.h \ + UECapabilityEnquiry.h \ + UECapabilityEnquiry-r3-IEs.h \ + UECapabilityEnquiry-v4b0ext-IEs.h \ + UECapabilityEnquiry-v590ext-IEs.h \ + UECapabilityEnquiry-v7xyext-IEs.h \ + UECapabilityInformation.h \ + UECapabilityInformation-v370ext.h \ + UECapabilityInformation-v380ext-IEs.h \ + UECapabilityInformation-v3a0ext-IEs.h \ + UECapabilityInformation-r3-add-ext-IEs.h \ + UECapabilityInformation-v4b0ext.h \ + UECapabilityInformation-v590ext.h \ + UECapabilityInformation-v5c0ext.h \ + UECapabilityInformation-v650ext-IEs.h \ + UECapabilityInformation-v680ext-IEs.h \ + UECapabilityInformation-v690ext-IEs.h \ + UECapabilityInformation-v7xyext-IEs.h \ + UECapabilityInformationConfirm.h \ + UECapabilityInformationConfirm-r3-IEs.h \ + UplinkDirectTransfer.h \ + UplinkDirectTransfer-v690ext-IEs.h \ + UplinkPhysicalChannelControl.h \ + UplinkPhysicalChannelControl-r3-IEs.h \ + UplinkPhysicalChannelControl-v4b0ext-IEs.h \ + UplinkPhysicalChannelControl-r4-IEs.h \ + UplinkPhysicalChannelControl-r5-IEs.h \ + UplinkPhysicalChannelControl-v690ext-IEs.h \ + UplinkPhysicalChannelControl-v6a0ext-IEs.h \ + UplinkPhysicalChannelControl-r7-IEs.h \ + URAUpdate.h \ + URAUpdateConfirm.h \ + URAUpdateConfirm-r3-IEs.h \ + URAUpdateConfirm-r5-IEs.h \ + URAUpdateConfirm-v690ext-IEs.h \ + URAUpdateConfirm-CCCH.h \ + URAUpdateConfirm-CCCH-r3-IEs.h \ + UTRANMobilityInformation.h \ + UTRANMobilityInformation-r3-IEs.h \ + UTRANMobilityInformation-v3a0ext-IEs.h \ + UTRANMobilityInformation-r5-IEs.h \ + UtranMobilityInformation-v690ext-IEs.h \ + UTRANMobilityInformationConfirm.h \ + UTRANMobilityInformationFailure.h \ + MBMSAccessInformation.h \ + MBMSCommonPTMRBInformation.h \ + MBMSCurrentCellPTMRBInformation.h \ + MBMSGeneralInformation.h \ + MBMSGeneralInformation-v7xyext-IEs.h \ + MBMSModificationRequest.h \ + MBMSModifiedServicesInformation.h \ + MBMSNeighbouringCellPTMRBInformation.h \ + MBMSSchedulingInformation.h \ + MBMSUnmodifiedServicesInformation.h \ + Ansi-41-IDNNS.h \ + CN-DomainIdentity.h \ + CN-DomainInformation.h \ + CN-DomainInformationFull.h \ + CN-DomainInformationList.h \ + CN-DomainInformationListFull.h \ + CN-DomainSysInfo.h \ + CN-DomainSysInfoList.h \ + CN-InformationInfo.h \ + CN-InformationInfo-r6.h \ + CN-InformationInfoFull.h \ + Digit.h \ + Gsm-map-IDNNS.h \ + IMEI.h \ + IMEI-Digit.h \ + IMSI-GSM-MAP.h \ + IntraDomainNasNodeSelector.h \ + LAI.h \ + MCC.h \ + MNC.h \ + MultiplePLMN-List-r6.h \ + NAS-Message.h \ + NAS-Synchronisation-Indicator.h \ + NAS-SystemInformationGSM-MAP.h \ + P-TMSI-GSM-MAP.h \ + PagingRecordTypeID.h \ + PLMN-Identity.h \ + PLMN-IdentityWithOptionalMCC-r6.h \ + PLMN-Type.h \ + RAB-Identity.h \ + RAI.h \ + RoutingAreaCode.h \ + RoutingParameter.h \ + TMSI-GSM-MAP.h \ + AccessClassBarred.h \ + AccessClassBarredList.h \ + AllowedIndicator.h \ + CellAccessRestriction.h \ + CellBarred.h \ + CellIdentity.h \ + CellIdentity-PerRL-List.h \ + CellSelectReselectInfoSIB-3-4.h \ + DomainSpecificAccessRestrictionForSharedNetwork-v670ext.h \ + DomainSpecificAccessRestrictionList-v670ext.h \ + DomainSpecificAccessRestrictionParam-v670ext.h \ + DomainSpecificAccessRestriction-v670ext.h \ + MapParameter.h \ + Mapping.h \ + Mapping-LCR-r4.h \ + MappingFunctionParameter.h \ + MappingFunctionParameterList.h \ + MappingFunctionType.h \ + MappingInfo.h \ + Q-Hyst-S.h \ + Q-Hyst-S-Fine.h \ + RAT.h \ + RAT-FDD-Info.h \ + RAT-FDD-InfoList.h \ + RAT-Identifier.h \ + RAT-TDD-Info.h \ + RAT-TDD-InfoList.h \ + ReservedIndicator.h \ + S-SearchQual.h \ + S-SearchRXLEV.h \ + SpeedDependentScalingFactor.h \ + T-Barred.h \ + T-Reselection-S.h \ + T-Reselection-S-Fine.h \ + TreselectionScalingFactor.h \ + UpperLimit.h \ + URA-Identity.h \ + URA-IdentityList.h \ + AccessStratumReleaseIndicator.h \ + ActivationTime.h \ + BackoffControlParams.h \ + C-RNTI.h \ + CapabilityUpdateRequirement.h \ + CapabilityUpdateRequirement-r4-ext.h \ + CapabilityUpdateRequirement-r4.h \ + CapabilityUpdateRequirement-r7-ext.h \ + CellUpdateCause.h \ + CellUpdateCause-ext.h \ + ChipRateCapability.h \ + ChipRateCapability-r7.h \ + CipheringAlgorithm.h \ + CipheringModeCommand.h \ + CipheringModeInfo.h \ + CN-DRX-CycleLengthCoefficient.h \ + CN-PagedUE-Identity.h \ + CompressedModeMeasCapability.h \ + CompressedModeMeasCapability-LCR-r4.h \ + CompressedModeMeasCapabFDDList.h \ + CompressedModeMeasCapabFDDList2.h \ + CompressedModeMeasCapabFDDList-ext.h \ + CompressedModeMeasCapabFDD.h \ + CompressedModeMeasCapabFDD2.h \ + CompressedModeMeasCapabFDD-ext.h \ + CompressedModeMeasCapabTDDList.h \ + CompressedModeMeasCapabTDD.h \ + CompressedModeMeasCapabGSMList.h \ + CompressedModeMeasCapabGSM.h \ + CompressedModeMeasCapabMC.h \ + CPCH-Parameters.h \ + DL-CapabilityWithSimultaneousHS-DSCHConfig.h \ + DL-DPCCH-BER.h \ + DL-PhysChCapabilityFDD.h \ + DL-PhysChCapabilityFDD-v380ext.h \ + SupportOfDedicatedPilotsForChEstimation.h \ + DL-PhysChCapabilityTDD.h \ + DL-PhysChCapabilityTDD-LCR-r4.h \ + DL-PhysChCapabilityTDD-768.h \ + DL-TransChCapability.h \ + DRAC-SysInfo.h \ + DRAC-SysInfoList.h \ + DSCH-RNTI.h \ + DelayRestrictionFlag.h \ + E-RNTI.h \ + ESN-DS-41.h \ + EstablishmentCause.h \ + FailureCauseWithProtErr.h \ + FailureCauseWithProtErrTrId.h \ + GroupIdentityWithReleaseInformation.h \ + GroupReleaseInformation.h \ + GSM-Measurements.h \ + H-RNTI.h \ + HSDSCH-physical-layer-category.h \ + UESpecificBehaviourInformation1idle.h \ + UESpecificBehaviourInformation1interRAT.h \ + IMSI-and-ESN-DS-41.h \ + IMSI-DS-41.h \ + InitialPriorityDelayList.h \ + InitialUE-Identity.h \ + IntegrityCheckInfo.h \ + IntegrityProtActivationInfo.h \ + IntegrityProtectionAlgorithm.h \ + IntegrityProtectionModeCommand.h \ + IntegrityProtectionModeInfo.h \ + IntegrityProtInitNumber.h \ + MaxHcContextSpace.h \ + MaxHcContextSpace-r5-ext.h \ + MaxROHC-ContextSessions-r4.h \ + MaximumAM-EntityNumberRLC-Cap.h \ + MaximumBitRate.h \ + MaximumRLC-WindowSize.h \ + MaxNoDPDCH-BitsTransmitted.h \ + MaxNoBits.h \ + MaxNoPhysChBitsReceived.h \ + MaxNoSCCPCH-RL.h \ + MaxNumberOfTF.h \ + MaxNumberOfTFC-DL.h \ + MaxNumberOfTFC-UL.h \ + MaxPhysChPerFrame.h \ + MaxPhysChPerFrame-768.h \ + MaxPhysChPerSubFrame-r4.h \ + MaxPhysChPerTimeslot.h \ + MaxPhysChPerTS.h \ + MaxPhysChPerTS-768.h \ + MaxSimultaneousCCTrCH-Count.h \ + MaxSimultaneousTransChsDL.h \ + MaxSimultaneousTransChsUL.h \ + MaxTransportBlocksDL.h \ + MaxTransportBlocksUL.h \ + MaxTS-PerFrame.h \ + MaxTS-PerSubFrame-r4.h \ + MeasurementCapability.h \ + MeasurementCapabilityExt.h \ + MeasurementCapabilityExt2.h \ + MeasurementCapability-r4-ext.h \ + MessageAuthenticationCode.h \ + MinimumSF-DL.h \ + MinimumSF-DL-768.h \ + MinimumSF-UL.h \ + MultiModeCapability.h \ + MultiRAT-Capability.h \ + MultiModeRAT-Capability-v590ext.h \ + MultiModeRAT-Capability-v680ext.h \ + N-300.h \ + N-301.h \ + N-302.h \ + N-304.h \ + N-308.h \ + N-310.h \ + N-312.h \ + N-312ext.h \ + N-312-r5.h \ + N-313.h \ + N-315.h \ + N-315ext.h \ + N-315-r5.h \ + N-AccessFails.h \ + N-AP-RetransMax.h \ + NetworkAssistedGPS-Supported.h \ + NF-BO-AllBusy.h \ + NF-BO-NoAICH.h \ + NF-BO-Mismatch.h \ + NS-BO-Busy.h \ + NS-IP.h \ + P-TMSI-and-RAI-GSM-MAP.h \ + PagingCause.h \ + PagingRecord.h \ + PagingRecord2-r5.h \ + PagingRecordList.h \ + PagingRecord2List-r5.h \ + PDCP-Capability.h \ + PDCP-Capability-r4-ext.h \ + PDCP-Capability-r5-ext.h \ + PDCP-Capability-r5-ext2.h \ + PhysicalChannelCapability.h \ + PhysicalChannelCapability-r7.h \ + PhysicalChannelCapability-LCR-r4.h \ + PhysicalChannelCapability-hspdsch-r5.h \ + PNBSCH-Allocation-r4.h \ + ProtocolErrorCause.h \ + ProtocolErrorIndicator.h \ + ProtocolErrorIndicatorWithMoreInfo.h \ + ProtocolErrorMoreInformation.h \ + RadioFrequencyBandFDD.h \ + RadioFrequencyBandFDD2.h \ + RadioFrequencyBandTDDList.h \ + RadioFrequencyBandTDD.h \ + RadioFrequencyBandGSM.h \ + Rb-timer-indicator.h \ + Re-EstablishmentTimer.h \ + RedirectionInfo.h \ + RedirectionInfo-r6.h \ + RejectionCause.h \ + ReleaseCause.h \ + RF-Capability.h \ + RF-Capability-r4-ext.h \ + RF-Capability-r7.h \ + RLC-Capability.h \ + RLC-Capability-r5-ext.h \ + RRC-ConnectionReleaseInformation.h \ + RRC-MessageSequenceNumber.h \ + RRC-MessageSequenceNumberList.h \ + RRC-StateIndicator.h \ + RRC-TransactionIdentifier.h \ + S-RNTI.h \ + S-RNTI-2.h \ + SecurityCapability.h \ + Serving-HSDSCH-CellInformation.h \ + SimultaneousSCCPCH-DPCH-Reception.h \ + SRNC-Identity.h \ + START-Value.h \ + STARTList.h \ + STARTSingle.h \ + CapabilityUpdateRequirement-r5.h \ + SystemSpecificCapUpdateReq.h \ + SystemSpecificCapUpdateReq-v590ext.h \ + SystemSpecificCapUpdateReq-r5.h \ + SystemSpecificCapUpdateReqList.h \ + SystemSpecificCapUpdateReqList-r5.h \ + T-300.h \ + T-301.h \ + T-302.h \ + T-304.h \ + T-305.h \ + T-307.h \ + T-308.h \ + T-309.h \ + T-310.h \ + T-311.h \ + T-312.h \ + T-313.h \ + T-314.h \ + T-315.h \ + T-316.h \ + T-317.h \ + T-318.h \ + T-CPCH.h \ + TMSI-and-LAI-GSM-MAP.h \ + TMSI-DS-41.h \ + TotalRLC-AM-BufferSize.h \ + TotalRLC-AM-BufferSize-r5-ext.h \ + TransmissionProbability.h \ + TransportChannelCapability.h \ + TurboSupport.h \ + TxRxFrequencySeparation.h \ + U-RNTI.h \ + U-RNTI-Group.h \ + U-RNTI-Short.h \ + UE-CapabilityContainer-IEs.h \ + UE-ConnTimersAndConstants.h \ + UE-ConnTimersAndConstants-v3a0ext.h \ + UE-ConnTimersAndConstants-r5.h \ + UE-IdleTimersAndConstants.h \ + UE-IdleTimersAndConstants-v3a0ext.h \ + UE-MultiModeRAT-Capability.h \ + UE-PowerClass.h \ + UE-PowerClassExt.h \ + UE-RadioAccessCapability.h \ + UE-RadioAccessCapabilityInfo.h \ + UE-RadioAccessCapability-v370ext.h \ + UE-RadioAccessCapability-v380ext.h \ + UE-RadioAccessCapability-v3a0ext.h \ + UE-RadioAccessCapability-v3g0ext.h \ + UE-RadioAccessCapability-v650ext.h \ + UE-RadioAccessCapability-v690ext.h \ + UE-RadioAccessCapability-v7xyext.h \ + UE-RadioAccessCapabBandFDDList2.h \ + UE-RadioAccessCapabBandFDD2.h \ + UE-PositioningCapabilityExt-v380.h \ + UE-PositioningCapabilityExt-v3a0.h \ + UE-PositioningCapabilityExt-v3g0.h \ + UE-RadioAccessCapabBandFDDList.h \ + UE-RadioAccessCapabBandFDDList-ext.h \ + UE-RadioAccessCapabBandFDD.h \ + UE-RadioAccessCapabBandFDD-ext.h \ + UE-RadioAccessCapability-v4b0ext.h \ + UE-RadioAccessCapabilityComp.h \ + UE-RadioAccessCapabilityComp-ext.h \ + UE-RadioAccessCapabilityComp-r7.h \ + UE-RadioAccessCapabilityComp2.h \ + RF-CapabilityComp.h \ + RF-CapabilityComp-r7.h \ + RF-CapabBandFDDComp.h \ + RF-CapabBandListFDDComp.h \ + RF-CapabBandListFDDComp-ext.h \ + UE-RadioAccessCapability-v590ext.h \ + UE-RadioAccessCapability-v5c0ext.h \ + UE-RadioAccessCapability-v680ext.h \ + UL-PhysChCapabilityFDD.h \ + UL-PhysChCapabilityFDD-r6.h \ + UL-PhysChCapabilityTDD.h \ + UL-PhysChCapabilityTDD-LCR-r4.h \ + PhysicalChannelCapability-edch-r6.h \ + UL-TransChCapability.h \ + UE-Positioning-Capability.h \ + UE-SecurityInformation.h \ + UE-SecurityInformation2.h \ + URA-UpdateCause.h \ + UTRAN-DRX-CycleLengthCoefficient.h \ + WaitTime.h \ + AlgorithmSpecificInfo.h \ + AlgorithmSpecificInfo-r4.h \ + CID-InclusionInfo-r4.h \ + COUNT-C.h \ + COUNT-C-MSB.h \ + DefaultConfigIdentity.h \ + DefaultConfigIdentity-r4.h \ + DefaultConfigIdentity-r5.h \ + DefaultConfigIdentity-r6.h \ + DefaultConfigMode.h \ + DDI.h \ + DL-AM-RLC-Mode.h \ + DL-AM-RLC-Mode-r5.h \ + DL-CounterSynchronisationInfo.h \ + DL-CounterSynchronisationInfo-r5.h \ + DL-LogicalChannelMapping.h \ + DL-LogicalChannelMapping-r5.h \ + DL-LogicalChannelMappingList.h \ + DL-LogicalChannelMappingList-r5.h \ + DL-Reception-Window-Size-r6.h \ + DL-RFC3095-r4.h \ + DL-RLC-Mode.h \ + DL-RLC-Mode-r5.h \ + DL-RLC-Mode-r6.h \ + DL-RLC-StatusInfo.h \ + DL-TM-RLC-Mode.h \ + DL-TransportChannelType.h \ + DL-TransportChannelType-r5.h \ + DL-UM-RLC-LI-size.h \ + DL-UM-RLC-Mode-r5.h \ + DL-UM-RLC-Mode-r6.h \ + ExpectReordering.h \ + ExplicitDiscard.h \ + HeaderCompressionInfo.h \ + HeaderCompressionInfoList.h \ + HeaderCompressionInfo-r4.h \ + HeaderCompressionInfoList-r4.h \ + LogicalChannelIdentity.h \ + LosslessSRNS-RelocSupport.h \ + MAC-d-HFN-initial-value.h \ + MAC-LogicalChannelPriority.h \ + MaxDAT.h \ + MaxDAT-Retransmissions.h \ + MaxMRW.h \ + MaxPDCP-SN-WindowSize.h \ + MaxRST.h \ + NoExplicitDiscard.h \ + PDCP-Info.h \ + PDCP-Info-r4.h \ + PDCP-InfoReconfig.h \ + PDCP-InfoReconfig-r4.h \ + PDCP-PDU-Header.h \ + PDCP-ROHC-TargetMode.h \ + PDCP-SN-Info.h \ + Poll-PDU.h \ + Poll-SDU.h \ + PollingInfo.h \ + PollWindow.h \ + PredefinedConfigIdentity.h \ + PredefinedConfigValueTag.h \ + PredefinedRB-Configuration.h \ + PreDefRadioConfiguration.h \ + PredefinedConfigStatusList.h \ + PredefinedConfigStatusInfo.h \ + PredefinedConfigStatusListComp.h \ + PredefinedConfigSetsWithDifferentValueTag.h \ + PredefinedConfigSetWithDifferentValueTag.h \ + PredefinedConfigValueTagList.h \ + PredefinedConfigStatusListVarSz.h \ + RAB-Info.h \ + RAB-Info-r6-ext.h \ + RAB-Info-r6.h \ + RAB-InformationList.h \ + RAB-InformationList-r6.h \ + RAB-InformationReconfigList.h \ + RAB-InformationReconfig.h \ + RAB-Info-Post.h \ + RAB-InformationSetup.h \ + RAB-InformationSetup-r4.h \ + RAB-InformationSetup-r5.h \ + RAB-InformationSetup-r6-ext.h \ + RAB-InformationSetup-r6.h \ + RAB-InformationSetupList.h \ + RAB-InformationSetupList-r4.h \ + RAB-InformationSetupList-r5.h \ + RAB-InformationSetupList-r6.h \ + RAB-InformationSetupList-r6-ext.h \ + RB-ActivationTimeInfo.h \ + RB-ActivationTimeInfoList.h \ + RB-COUNT-C-Information.h \ + RB-COUNT-C-InformationList.h \ + RB-COUNT-C-MSB-Information.h \ + RB-COUNT-C-MSB-InformationList.h \ + RB-Identity.h \ + RB-IdentityList.h \ + RB-InformationAffected.h \ + RB-InformationAffected-r5.h \ + RB-InformationAffected-r6.h \ + RB-InformationAffectedList.h \ + RB-InformationAffectedList-r5.h \ + RB-InformationAffectedList-r6.h \ + RB-InformationChanged-r6.h \ + RB-InformationChangedList-r6.h \ + RB-InformationReconfig.h \ + RB-InformationReconfig-r4.h \ + RB-InformationReconfig-r5.h \ + RB-InformationReconfig-r6.h \ + RB-InformationReconfigList.h \ + RB-InformationReconfigList-r4.h \ + RB-InformationReconfigList-r5.h \ + RB-InformationReconfigList-r6.h \ + RB-InformationReleaseList.h \ + RB-InformationSetup.h \ + RB-InformationSetup-r4.h \ + RB-InformationSetup-r5.h \ + RB-InformationSetup-r6.h \ + RB-InformationSetupList.h \ + RB-InformationSetupList-r4.h \ + RB-InformationSetupList-r5.h \ + RB-InformationSetupList-r6.h \ + RB-MappingInfo.h \ + RB-MappingInfo-r5.h \ + RB-MappingInfo-r6.h \ + RB-MappingOption.h \ + RB-MappingOption-r5.h \ + RB-MappingOption-r6.h \ + RB-PDCPContextRelocation.h \ + RB-PDCPContextRelocationList.h \ + RB-StopContinue.h \ + RB-WithPDCP-Info.h \ + RB-WithPDCP-InfoList.h \ + ReceivingWindowSize.h \ + RFC2507-Info.h \ + RFC3095-Info-r4.h \ + RLC-Info.h \ + RLC-Info-r5.h \ + RLC-Info-r6.h \ + RLC-Info-MCCH-r6.h \ + RLC-Info-MSCH-r6.h \ + RLC-Info-MTCH-r6.h \ + RLC-InfoChoice.h \ + RLC-InfoChoice-r5.h \ + RLC-InfoChoice-r6.h \ + RLC-PDU-Size.h \ + RLC-PDU-SizeList.h \ + RLC-SequenceNumber.h \ + RLC-SizeInfo.h \ + RLC-SizeExplicitList.h \ + ROHC-Profile-r4.h \ + ROHC-ProfileList-r4.h \ + ROHC-PacketSize-r4.h \ + ROHC-PacketSizeList-r4.h \ + SRB-InformationSetup.h \ + SRB-InformationSetup-r5.h \ + SRB-InformationSetup-r6.h \ + SRB-InformationSetupList.h \ + SRB-InformationSetupList-r5.h \ + SRB-InformationSetupList-r6.h \ + SRB-InformationSetupList2.h \ + SRB-InformationSetupList2-r6.h \ + TimerDAR-r6.h \ + TimerDiscard.h \ + TimerEPC.h \ + TimerMRW.h \ + TimerOSD-r6.h \ + TimerPoll.h \ + TimerPollPeriodic.h \ + TimerPollProhibit.h \ + TimerRST.h \ + TimerStatusPeriodic.h \ + TimerStatusProhibit.h \ + TransmissionRLC-Discard.h \ + TransmissionWindowSize.h \ + UL-AM-RLC-Mode.h \ + UL-CounterSynchronisationInfo.h \ + UL-LogicalChannelMapping.h \ + UL-LogicalChannelMapping-r6.h \ + UL-LogicalChannelMappingList.h \ + UL-LogicalChannelMappingList-r6.h \ + UL-LogicalChannelMappings.h \ + UL-LogicalChannelMappings-r6.h \ + UL-RFC3095-r4.h \ + UL-RLC-Mode.h \ + UL-TM-RLC-Mode.h \ + UL-UM-RLC-Mode.h \ + UL-TransportChannelType.h \ + UM-RLC-DuplAvoid-Reord-Info-r6.h \ + UM-RLC-OutOSeqDelivery-Info-r6.h \ + WindowSizeDAR-r6.h \ + WindowSizeOSD-r6.h \ + AddOrReconfMAC-dFlow.h \ + AllowedTFC-List.h \ + AllowedTFI-List.h \ + BitModeRLC-SizeInfo.h \ + BLER-QualityValue.h \ + ChannelCodingType.h \ + CodingRate.h \ + CommonDynamicTF-Info.h \ + CommonDynamicTF-Info-DynamicTTI.h \ + CommonDynamicTF-InfoList.h \ + CommonDynamicTF-InfoList-DynamicTTI.h \ + CommonTransChTFS.h \ + CommonTransChTFS-LCR.h \ + CPCH-SetID.h \ + CRC-Size.h \ + DedicatedDynamicTF-Info.h \ + DedicatedDynamicTF-Info-DynamicTTI.h \ + DedicatedDynamicTF-InfoList.h \ + DedicatedDynamicTF-InfoList-DynamicTTI.h \ + DedicatedTransChTFS.h \ + DL-AddReconfTransChInfo2List.h \ + DL-AddReconfTransChInfoList.h \ + DL-AddReconfTransChInfoList-r4.h \ + DL-AddReconfTransChInfoList-r5.h \ + DL-AddReconfTransChInformation.h \ + DL-AddReconfTransChInformation-r4.h \ + DL-AddReconfTransChInformation-r5.h \ + DL-AddReconfTransChInformation2.h \ + DL-CommonTransChInfo.h \ + DL-CommonTransChInfo-r4.h \ + DL-DeletedTransChInfoList.h \ + DL-DeletedTransChInfoList-r5.h \ + DL-TransportChannelIdentity.h \ + DL-TransportChannelIdentity-r5.h \ + DL-TrCH-Type.h \ + DL-TrCH-TypeId1-r5.h \ + DL-TrCH-TypeId2-r5.h \ + DRAC-ClassIdentity.h \ + DRAC-StaticInformation.h \ + DRAC-StaticInformationList.h \ + E-DCH-AddReconf-MAC-d-Flow.h \ + E-DCH-AddReconf-MAC-d-FlowList.h \ + E-DCH-MAC-d-FlowIdentity.h \ + E-DCH-MAC-d-FlowMaxRetrans.h \ + E-DCH-MAC-d-FlowMultiplexingList.h \ + E-DCH-MAC-d-FlowPowerOffset.h \ + E-DCH-TTI.h \ + ExplicitTFCS-Configuration.h \ + GainFactor.h \ + GainFactorInformation.h \ + HSDSCH-Info.h \ + HARQ-Info.h \ + HARQMemorySize.h \ + IndividualDL-CCTrCH-Info.h \ + IndividualDL-CCTrCH-InfoList.h \ + IndividualUL-CCTrCH-Info.h \ + IndividualUL-CCTrCH-InfoList.h \ + LogicalChannelByRB.h \ + LogicalChannelList.h \ + MAC-d-FlowIdentityDCHandHSDSCH.h \ + MAC-d-FlowIdentity.h \ + MAC-d-PDU-SizeInfo-List.h \ + MAC-d-PDUsizeInfo.h \ + MAC-hs-AddReconfQueue-List.h \ + MAC-hs-AddReconfQueue.h \ + MAC-hs-DelQueue-List.h \ + MAC-hs-DelQueue.h \ + MAC-hs-WindowSize.h \ + NumberOfTbSizeAndTTIList.h \ + MessType.h \ + Non-allowedTFC-List.h \ + NumberOfTransportBlocks.h \ + OctetModeRLC-SizeInfoType1.h \ + OctetModeRLC-SizeInfoType2.h \ + PowerOffsetInfoShort.h \ + PowerOffsetInformation.h \ + PowerOffsetPp-m.h \ + PreDefTransChConfiguration.h \ + QualityTarget.h \ + RateMatchingAttribute.h \ + ReferenceTFC-ID.h \ + RestrictedTrChInfo.h \ + RestrictedTrChInfoList.h \ + SemistaticTF-Information.h \ + SignalledGainFactors.h \ + SplitTFCI-Signalling.h \ + SplitType.h \ + T1-ReleaseTimer.h \ + TFC-Subset.h \ + TFC-SubsetList.h \ + TFC-Value.h \ + TFCI-Field2-Information.h \ + TFCI-Range.h \ + TFCI-RangeList.h \ + TFCS.h \ + TFCS-Identity.h \ + TFCS-IdentityPlain.h \ + TFCS-InfoForDSCH.h \ + TFCS-ReconfAdd.h \ + TFCS-Removal.h \ + TFCS-RemovalList.h \ + TimeDurationBeforeRetry.h \ + TM-SignallingInfo.h \ + TransmissionTimeInterval.h \ + TransmissionTimeValidity.h \ + TransportChannelIdentity.h \ + TransportChannelIdentityDCHandDSCH.h \ + TransportFormatSet.h \ + TransportFormatSet-LCR.h \ + UL-AddReconfTransChInfoList.h \ + UL-AddReconfTransChInfoList-r6.h \ + UL-AddReconfTransChInformation.h \ + UL-AddReconfTransChInformation-r6.h \ + UL-CommonTransChInfo.h \ + UL-CommonTransChInfo-r4.h \ + UL-ControlledTrChList.h \ + UL-DeletedTransChInfoList.h \ + UL-DeletedTransChInfoList-r6.h \ + UL-TransportChannelIdentity.h \ + UL-TransportChannelIdentity-r6.h \ + UL-TrCH-Type.h \ + USCH-TransportChannelsInfo.h \ + ACK-NACK-repetitionFactor.h \ + AC-To-ASC-Mapping.h \ + AC-To-ASC-MappingTable.h \ + AccessServiceClass-FDD.h \ + AccessServiceClass-TDD.h \ + AccessServiceClass-TDD-r7.h \ + AccessServiceClass-TDD-LCR-r4.h \ + AdditionalPRACH-TF-and-TFCS-CCCH-IEs.h \ + AdditionalPRACH-TF-and-TFCS-CCCH.h \ + AdditionalPRACH-TF-and-TFCS-CCCH-List.h \ + AICH-Info.h \ + AICH-PowerOffset.h \ + AICH-TransmissionTiming.h \ + AllocationPeriodInfo.h \ + Alpha.h \ + AP-AICH-ChannelisationCode.h \ + AP-PreambleScramblingCode.h \ + AP-Signature.h \ + AP-Signature-VCAM.h \ + AP-Subchannel.h \ + ASCSetting-FDD.h \ + ASCSetting-TDD.h \ + ASCSetting-TDD-r7.h \ + ASCSetting-TDD-LCR-r4.h \ + AvailableAP-Signature-VCAMList.h \ + AvailableAP-SignatureList.h \ + AvailableAP-SubchannelList.h \ + AvailableMinimumSF-ListVCAM.h \ + AvailableMinimumSF-VCAM.h \ + AvailableSignatures.h \ + AvailableSubChannelNumbers.h \ + BEACON-PL-Est.h \ + BurstType.h \ + Bler-Target.h \ + CCTrCH-PowerControlInfo.h \ + CCTrCH-PowerControlInfo-r4.h \ + CCTrCH-PowerControlInfo-r5.h \ + CCTrCH-PowerControlInfo-r7.h \ + CD-AccessSlotSubchannel.h \ + CD-AccessSlotSubchannelList.h \ + CD-CA-ICH-ChannelisationCode.h \ + CD-PreambleScramblingCode.h \ + CD-SignatureCode.h \ + CD-SignatureCodeList.h \ + CellAndChannelIdentity.h \ + CellParametersID.h \ + Cfntargetsfnframeoffset.h \ + ChannelAssignmentActive.h \ + ChannelisationCode256.h \ + ChannelReqParamsForUCSM.h \ + ClosedLoopTimingAdjMode.h \ + CodeNumberDSCH.h \ + CodeRange.h \ + CodeWordSet.h \ + CommonTimeslotInfo.h \ + CommonTimeslotInfoSCCPCH.h \ + ConstantValue.h \ + ConstantValueTdd.h \ + CPCH-PersistenceLevels.h \ + CPCH-PersistenceLevelsList.h \ + CPCH-SetInfo.h \ + CPCH-SetInfoList.h \ + CPCH-StatusIndicationMode.h \ + CQI-RepetitionFactor.h \ + CSICH-PowerOffset.h \ + DefaultDPCH-OffsetValueFDD.h \ + DefaultDPCH-OffsetValueTDD.h \ + DeltaPp-m.h \ + DeltaCQI.h \ + DeltaNACK.h \ + DeltaACK.h \ + DeltaSIR.h \ + DHS-Sync.h \ + DL-CCTrCh.h \ + DL-CCTrCh-r4.h \ + DL-CCTrCh-r7.h \ + DL-CCTrChList.h \ + DL-CCTrChList-r7.h \ + DL-CCTrChList-r4.h \ + DL-CCTrChListToRemove.h \ + DL-CCTrChTPCList.h \ + DL-ChannelisationCode.h \ + DL-ChannelisationCodeList.h \ + DL-CommonInformation.h \ + DL-CommonInformation-r4.h \ + DL-CommonInformation-r5.h \ + DL-CommonInformation-r6.h \ + DL-CommonInformation-r7.h \ + DL-CommonInformationPost.h \ + DL-CommonInformationPredef.h \ + DL-CompressedModeMethod.h \ + DL-DPCH-InfoCommon.h \ + DL-DPCH-InfoCommon-r4.h \ + DL-DPCH-InfoCommon-r6.h \ + DL-DPCH-InfoCommonPost.h \ + DL-DPCH-InfoCommonPredef.h \ + DL-DPCH-InfoPerRL.h \ + DL-DPCH-InfoPerRL-r4.h \ + DL-DPCH-InfoPerRL-r5.h \ + DL-DPCH-InfoPerRL-r6.h \ + DL-DPCH-InfoPerRL-r7.h \ + DL-FDPCH-InfoPerRL-r6.h \ + DL-DPCH-InfoPerRL-PostFDD.h \ + DL-DPCH-InfoPerRL-PostTDD.h \ + DL-DPCH-InfoPerRL-PostTDD-LCR-r4.h \ + DL-DPCH-PowerControlInfo.h \ + DL-FDPCH-InfoCommon-r6.h \ + DL-FrameType.h \ + DL-HSPDSCH-Information.h \ + DL-HSPDSCH-Information-r6.h \ + DL-HSPDSCH-Information-r7.h \ + DL-HSPDSCH-TS-Configuration.h \ + DL-HSPDSCH-TS-Configuration-VHCR.h \ + DL-InformationPerRL.h \ + DL-InformationPerRL-r4.h \ + DL-InformationPerRL-r5.h \ + DL-InformationPerRL-r5bis.h \ + DL-InformationPerRL-r6.h \ + DL-InformationPerRL-r7.h \ + DL-InformationPerRL-List.h \ + DL-InformationPerRL-List-r4.h \ + DL-InformationPerRL-List-r5.h \ + DL-InformationPerRL-List-r6.h \ + DL-InformationPerRL-List-r5bis.h \ + DL-InformationPerRL-List-r7.h \ + DL-InformationPerRL-ListPostFDD.h \ + DL-InformationPerRL-PostFDD.h \ + DL-InformationPerRL-PostTDD.h \ + DL-InformationPerRL-PostTDD-LCR-r4.h \ + DL-PDSCH-Information.h \ + Dl-rate-matching-restriction.h \ + DL-TPC-PowerOffsetPerRL.h \ + DL-TPC-PowerOffsetPerRL-List.h \ + DL-TS-ChannelisationCode.h \ + DL-TS-ChannelisationCode-VHCR.h \ + DL-TS-ChannelisationCodesShort.h \ + DL-TS-ChannelisationCodesShort-VHCR.h \ + DownlinkAdditionalTimeslots.h \ + DownlinkAdditionalTimeslots-VHCR.h \ + DownlinkAdditionalTimeslots-LCR-r4.h \ + DownlinkTimeslotsCodes.h \ + DownlinkTimeslotsCodes-VHCR.h \ + DownlinkTimeslotsCodes-LCR-r4.h \ + DPC-Mode.h \ + DPCCH-PowerOffset.h \ + DPCCH-PowerOffset2.h \ + DPCH-CompressedModeInfo.h \ + DPCH-CompressedModeStatusInfo.h \ + DPCH-FrameOffset.h \ + DSCH-Mapping.h \ + DSCH-MappingList.h \ + DSCH-RadioLinkIdentifier.h \ + DSCH-TransportChannelsInfo.h \ + DurationTimeInfo.h \ + DynamicPersistenceLevel.h \ + DynamicPersistenceLevelList.h \ + DynamicPersistenceLevelTF-List.h \ + DynamicTFInformationCCCH.h \ + E-AGCH-ChannelisationCode.h \ + E-AGCH-Information.h \ + E-DCH-MinimumSet-E-TFCI.h \ + E-DCH-ReconfigurationInfo.h \ + E-DCH-RL-InfoNewServingCell.h \ + E-DCH-RL-InfoOtherCell.h \ + E-DPCCH-Info.h \ + E-DPCCH-DPCCH-PowerOffset.h \ + E-DPDCH-Info.h \ + E-DPDCH-PeriodicyOfSchedInfo.h \ + E-DPDCH-PL-NonMax.h \ + E-DPDCH-Reference-E-TFCI.h \ + E-DPDCH-Reference-E-TFCIList.h \ + E-DPDCH-SchedulingInfoConfiguration.h \ + E-DPDCH-SchedulingTransmConfiguration.h \ + E-DPDCH-MaxChannelisationCodes.h \ + E-HICH-ChannelisationCode.h \ + E-HICH-Information.h \ + E-HICH-RGCH-SignatureSequence.h \ + E-RGCH-CombinationIndex.h \ + E-RGCH-Information.h \ + E-TFCI-TableIndex.h \ + EXT-UL-TimingAdvance.h \ + FACH-PCH-Information.h \ + FACH-PCH-InformationList.h \ + Feedback-cycle.h \ + FPACH-Info-r4.h \ + FrequencyInfo.h \ + FrequencyInfoFDD.h \ + FrequencyInfoTDD.h \ + HappyBit-DelayCondition.h \ + HARQ-Preamble-Mode.h \ + HS-ChannelisationCode-LCR.h \ + HS-PDSCH-Midamble-Configuration-TDD128.h \ + HS-SCCH-Info.h \ + HS-SCCH-Info-r6.h \ + HS-SCCH-Info-r7.h \ + HS-SCCH-Codes.h \ + HS-SCCH-TDD128.h \ + HS-SICH-Configuration-TDD128.h \ + HS-SCCH-TDD384.h \ + HS-SCCH-TDD384-r6.h \ + HS-SCCH-TDD768.h \ + HS-SICH-Configuration-TDD384.h \ + HS-SICH-Configuration-TDD768.h \ + HS-SICH-Power-Control-Info-TDD384.h \ + HS-SICH-Power-Control-Info-TDD768.h \ + IndividualTimeslotInfo.h \ + IndividualTimeslotInfo-VHCR.h \ + IndividualTimeslotInfo-LCR-r4.h \ + IndividualTimeslotInfo-LCR-r4-ext.h \ + IndividualTS-Interference.h \ + IndividualTS-InterferenceList.h \ + ITP.h \ + NidentifyAbort.h \ + MaxAllowedUL-TX-Power.h \ + MaxAvailablePCPCH-Number.h \ + MaxPowerIncrease-r4.h \ + MaxTFCI-Field2Value.h \ + Measurement-Feedback-Info.h \ + MidambleConfigurationBurstType1and3.h \ + MidambleConfigurationBurstType2.h \ + MidambleConfigurationBurstType2-VHCR.h \ + MidambleShiftAndBurstType.h \ + MidambleShiftAndBurstType-VHCR.h \ + MidambleShiftAndBurstType-DL.h \ + MidambleShiftAndBurstType-DL-VHCR.h \ + MidambleShiftAndBurstType-LCR-r4.h \ + MidambleShiftLong.h \ + MidambleShiftShort.h \ + MidambleShiftShort-VHCR.h \ + MinimumSpreadingFactor.h \ + MultiCodeInfo.h \ + N-EOT.h \ + N-GAP.h \ + N-PCH.h \ + N-StartMessage.h \ + NB01.h \ + NF-Max.h \ + NumberOfDPDCH.h \ + NumberOfFBI-Bits.h \ + OpenLoopPowerControl-TDD.h \ + OpenLoopPowerControl-IPDL-TDD-r4.h \ + PagingIndicatorLength.h \ + PC-Preamble.h \ + PCP-Length.h \ + PCPCH-ChannelInfo.h \ + PCPCH-ChannelInfoList.h \ + PCPICH-UsageForChannelEst.h \ + PDSCH-CapacityAllocationInfo.h \ + PDSCH-CapacityAllocationInfo-r4.h \ + PDSCH-CapacityAllocationInfo-r7.h \ + PDSCH-CodeInfo.h \ + PDSCH-CodeInfoList.h \ + PDSCH-CodeMap.h \ + PDSCH-CodeMapList.h \ + PDSCH-CodeMapping.h \ + PDSCH-Identity.h \ + PDSCH-Info.h \ + PDSCH-Info-r4.h \ + PDSCH-Info-r7.h \ + PDSCH-Info-LCR-r4.h \ + PDSCH-PowerControlInfo.h \ + PDSCH-SHO-DCH-Info.h \ + PDSCH-SysInfo.h \ + PDSCH-SysInfo-r7.h \ + PDSCH-SysInfo-HCR-r5.h \ + PDSCH-SysInfo-LCR-r4.h \ + PDSCH-SysInfoList.h \ + PDSCH-SysInfoList-r7.h \ + PDSCH-SysInfoList-HCR-r5.h \ + PDSCH-SysInfoList-LCR-r4.h \ + PDSCH-SysInfoList-SFN.h \ + PDSCH-SysInfoList-SFN-HCR-r5.h \ + PDSCH-SysInfoList-SFN-LCR-r4.h \ + PersistenceScalingFactor.h \ + PersistenceScalingFactorList.h \ + PI-CountPerFrame.h \ + PichChannelisationCodeList-LCR-r4.h \ + PICH-Info.h \ + PICH-Info-r7.h \ + PICH-Info-LCR-r4.h \ + PICH-PowerOffset.h \ + PilotBits128.h \ + PilotBits256.h \ + MeasurementPowerOffset.h \ + PLCCH-Info.h \ + PositionFixedOrFlexible.h \ + PowerControlAlgorithm.h \ + PowerOffsetPilot-pdpdch.h \ + PowerOffsetTPC-pdpdch.h \ + PowerRampStep.h \ + PRACH-ChanCodes-LCR-r4.h \ + PRACH-Definition-LCR-r4.h \ + PRACH-Midamble.h \ + PRACH-Partitioning.h \ + PRACH-Partitioning-r7.h \ + PRACH-Partitioning-LCR-r4.h \ + PRACH-PowerOffset.h \ + PRACH-RACH-Info.h \ + PRACH-RACH-Info-r7.h \ + PRACH-RACH-Info-LCR-r4.h \ + PRACH-SystemInformation.h \ + PRACH-SystemInformation-r7.h \ + PRACH-SystemInformation-LCR-r4.h \ + PRACH-SystemInformationList.h \ + PRACH-SystemInformationList-r7.h \ + PRACH-SystemInformationList-LCR-r4.h \ + PreambleRetransMax.h \ + PreambleScramblingCodeWordNumber.h \ + PreDefPhyChConfiguration.h \ + PrimaryCCPCH-Info.h \ + PrimaryCCPCH-Info-r4.h \ + PrimaryCCPCH-Info-r7.h \ + PrimaryCCPCH-Info-LCR-r4.h \ + PrimaryCCPCH-Info-LCR-r4-ext.h \ + PrimaryCCPCH-InfoPost.h \ + PrimaryCCPCH-InfoPostTDD-LCR-r4.h \ + PrimaryCCPCH-TX-Power.h \ + PrimaryCPICH-Info.h \ + PrimaryCPICH-TX-Power.h \ + PrimaryScramblingCode.h \ + PuncturingLimit.h \ + PUSCH-CapacityAllocationInfo.h \ + PUSCH-CapacityAllocationInfo-r4.h \ + PUSCH-CapacityAllocationInfo-r7.h \ + PUSCH-Identity.h \ + PUSCH-Info.h \ + PUSCH-Info-r4.h \ + PUSCH-Info-VHCR.h \ + PUSCH-Info-LCR-r4.h \ + PUSCH-PowerControlInfo-r4.h \ + PUSCH-PowerControlInfo-r7.h \ + PUSCH-SysInfo.h \ + PUSCH-SysInfo-VHCR.h \ + PUSCH-SysInfo-HCR-r5.h \ + PUSCH-SysInfo-LCR-r4.h \ + PUSCH-SysInfoList.h \ + PUSCH-SysInfoList-HCR-r5.h \ + PUSCH-SysInfoList-LCR-r4.h \ + PUSCH-SysInfoList-SFN.h \ + PUSCH-SysInfoList-SFN-HCR-r5.h \ + PUSCH-SysInfoList-SFN-LCR-r4.h \ + PUSCH-SysInfoList-SFN-VHCR.h \ + RACH-TransmissionParameters.h \ + ReducedScramblingCodeNumber.h \ + RepetitionPeriodAndLength.h \ + RepetitionPeriodLengthAndOffset.h \ + ReplacedPDSCH-CodeInfo.h \ + ReplacedPDSCH-CodeInfoList.h \ + RepPerLengthOffset-PICH.h \ + RepPerLengthOffset-MICH.h \ + RestrictedTrCH.h \ + RestrictedTrCH-InfoList.h \ + RL-AdditionInformation.h \ + RL-AdditionInformation-r6.h \ + RL-AdditionInformationList.h \ + RL-AdditionInformationList-r6.h \ + RL-IdentifierList.h \ + RL-RemovalInformationList.h \ + RPP.h \ + S-Field.h \ + SCCPCH-ChannelisationCode.h \ + SCCPCH-ChannelisationCode-VHCR.h \ + SCCPCH-ChannelisationCodeList.h \ + SCCPCH-ChannelisationCodeList-VHCR.h \ + SCCPCH-InfoForFACH.h \ + SCCPCH-InfoForFACH-r4.h \ + SCCPCH-SystemInformation.h \ + SCCPCH-SystemInformation-LCR-r4-ext.h \ + SCCPCH-SystemInformation-r7.h \ + SCCPCH-SystemInformationList.h \ + SCCPCH-SystemInformationList-r7.h \ + SCCPCH-SystemInformationList-LCR-r4-ext.h \ + SCCPCH-SystemInformation-MBMS-r6.h \ + SCCPCH-SystemInformation-MBMS-r7.h \ + ScramblingCodeChange.h \ + ScramblingCodeType.h \ + SecondaryCCPCH-Info.h \ + SecondaryCCPCH-Info-r4.h \ + SecondaryCCPCH-Info-r7.h \ + SecondaryCCPCH-Info-LCR-r4-ext.h \ + SecondaryCCPCHInfo-MBMS-r6.h \ + SecondaryCCPCHInfo-MBMS-r7.h \ + SecondaryCPICH-Info.h \ + SecondaryScramblingCode.h \ + SecondInterleavingMode.h \ + SF256-AndCodeNumber.h \ + SF512-AndCodeNumber.h \ + SF512-AndPilot.h \ + SF-PDSCH.h \ + SF-PRACH.h \ + SFN-TimeInfo.h \ + SpecialBurstScheduling.h \ + SpreadingFactor.h \ + SRB-delay.h \ + SSDT-CellIdentity.h \ + SSDT-Information.h \ + SSDT-Information-r4.h \ + SSDT-UL.h \ + SynchronisationParameters-r4.h \ + SYNC-UL-Procedure-r4.h \ + SYNC-UL-Info-r4.h \ + TDD-FPACH-CCode16-r4.h \ + TDD-UL-Interference.h \ + TDD-PICH-CCode.h \ + TDD768-PICH-CCode.h \ + TDD-PRACH-CCode8.h \ + TDD-PRACH-CCode16.h \ + TDD-PRACH-CCode-LCR-r4.h \ + TDD-PRACH-CCodeList.h \ + TDD768-PRACH-CCode8.h \ + TDD768-PRACH-CCode16.h \ + TDD768-PRACH-CCode32.h \ + TDD768-PRACH-CCodeList.h \ + TFC-ControlDuration.h \ + TFCI-Coding.h \ + TGCFN.h \ + TGD.h \ + TGL.h \ + TGMP.h \ + TGP-Sequence.h \ + TGPS-Reconfiguration-CFN.h \ + TGP-SequenceList.h \ + TGP-SequenceShort.h \ + TGPL.h \ + TGPRC.h \ + TGPS-ConfigurationParams.h \ + TGPSI.h \ + TGSN.h \ + TimeInfo.h \ + TimeslotList.h \ + TimeslotList-r4.h \ + TimeslotNumber.h \ + TimeslotNumber-LCR-r4.h \ + TimeslotNumber-PRACH-LCR-r4.h \ + TimeslotSync2.h \ + TimingOffset.h \ + TimingMaintainedSynchInd.h \ + TPC-CombinationIndex.h \ + TPC-CommandTargetRate.h \ + TPC-StepSizeFDD.h \ + TPC-StepSizeTDD.h \ + TreconfirmAbort.h \ + TX-DiversityMode.h \ + UARFCN.h \ + UCSM-Info.h \ + UL-CCTrCH.h \ + UL-CCTrCH-r4.h \ + UL-CCTrCH-r7.h \ + UL-CCTrCHList.h \ + UL-CCTrCHList-r4.h \ + UL-CCTrCHList-r7.h \ + UL-CCTrCHListToRemove.h \ + UL-CCTrChTPCList.h \ + UL-ChannelRequirement.h \ + UL-ChannelRequirement-r4.h \ + UL-ChannelRequirement-r5.h \ + UL-ChannelRequirementWithCPCH-SetID.h \ + UL-ChannelRequirementWithCPCH-SetID-r4.h \ + UL-ChannelRequirementWithCPCH-SetID-r5.h \ + UL-CompressedModeMethod.h \ + UL-DL-Mode.h \ + UL-DPCCH-SlotFormat.h \ + UL-DPCH-Info.h \ + UL-DPCH-Info-r4.h \ + UL-DPCH-Info-r5.h \ + UL-DPCH-Info-r6.h \ + UL-DPCH-Info-r7.h \ + UL-DPCH-InfoPostFDD.h \ + UL-DPCH-InfoPostTDD.h \ + UL-DPCH-InfoPostTDD-LCR-r4.h \ + UL-DPCH-InfoPredef.h \ + UL-DPCH-PowerControlInfo.h \ + UL-DPCH-PowerControlInfo-r4.h \ + UL-DPCH-PowerControlInfo-r5.h \ + UL-DPCH-PowerControlInfo-r6.h \ + UL-DPCH-PowerControlInfo-r7.h \ + UL-DPCH-PowerControlInfoPostFDD.h \ + UL-DPCH-PowerControlInfoPostTDD.h \ + UL-DPCH-PowerControlInfoPostTDD-LCR-r4.h \ + UL-DPCH-PowerControlInfoPredef.h \ + UL-EDCH-Information-r6.h \ + UL-Interference.h \ + UL-ScramblingCode.h \ + UL-SynchronisationParameters-r4.h \ + UL-TargetSIR.h \ + UL-TimingAdvance.h \ + UL-TimingAdvance-VHCR.h \ + UL-TimingAdvanceControl.h \ + UL-TimingAdvanceControl-r4.h \ + UL-TimingAdvanceControl-r7.h \ + UL-TimingAdvanceControl-LCR-r4.h \ + UL-TS-ChannelisationCode.h \ + UL-TS-ChannelisationCodeList.h \ + UL-TS-ChannelisationCodeList-r7.h \ + UL-TS-ChannelisationCode-VHCR.h \ + UL-TS-ChannelisationCodeList-VHCR.h \ + UplinkAdditionalTimeslots.h \ + UplinkAdditionalTimeslots-LCR-r4.h \ + UplinkAdditionalTimeslots-LCR-r7.h \ + UplinkTimeslotsCodes.h \ + UplinkTimeslotsCodes-VHCR.h \ + UplinkTimeslotsCodes-LCR-r4.h \ + UplinkTimeslotsCodes-LCR-r7.h \ + Wi-LCR.h \ + AcquisitionSatInfo.h \ + AcquisitionSatInfoList.h \ + AdditionalMeasurementID-List.h \ + AlmanacSatInfo.h \ + AlmanacSatInfoList.h \ + AverageRLC-BufferPayload.h \ + AzimuthAndElevation.h \ + BadSatList.h \ + Frequency-Band.h \ + BCCH-ARFCN.h \ + BLER-MeasurementResults.h \ + BLER-MeasurementResultsList.h \ + BLER-TransChIdList.h \ + BSIC-VerificationRequired.h \ + BSICReported.h \ + BurstModeParameters.h \ + CellDCH-ReportCriteria.h \ + CellDCH-ReportCriteria-LCR-r4.h \ + CellIndividualOffset.h \ + CellInfo.h \ + CellInfo-r4.h \ + CellInfoSI-RSCP.h \ + CellInfoSI-RSCP-LCR-r4.h \ + CellInfoSI-ECN0.h \ + CellInfoSI-ECN0-LCR-r4.h \ + CellInfoSI-HCS-RSCP.h \ + CellInfoSI-HCS-RSCP-LCR-r4.h \ + CellInfoSI-HCS-ECN0.h \ + CellInfoSI-HCS-ECN0-LCR-r4.h \ + CellMeasuredResults.h \ + CellMeasurementEventResults.h \ + CellMeasurementEventResults-LCR-r4.h \ + CellReportingQuantities.h \ + CellSelectReselectInfoSIB-11-12.h \ + CellSelectReselectInfoSIB-11-12-RSCP.h \ + CellSelectReselectInfoSIB-11-12-ECN0.h \ + CellSelectReselectInfoSIB-11-12-HCS-RSCP.h \ + CellSelectReselectInfoSIB-11-12-HCS-ECN0.h \ + CellSelectReselectInfo-v590ext.h \ + CellSelectReselectInfoPCHFACH-v5b0ext.h \ + CellSelectReselectInfoTreselectionScaling-v5c0ext.h \ + CellsForInterFreqMeasList.h \ + CellsForInterRATMeasList.h \ + CellsForIntraFreqMeasList.h \ + CellSynchronisationInfo.h \ + CellToReport.h \ + CellToReportList.h \ + CodePhaseSearchWindow.h \ + CountC-SFN-Frame-difference.h \ + CPICH-Ec-N0.h \ + CPICH-RSCP.h \ + DeltaPRC.h \ + DeltaQrxlevmin.h \ + DeltaRSCP.h \ + DeltaRSCPPerCell.h \ + DeltaRRC.h \ + DGPS-CorrectionSatInfo.h \ + DGPS-CorrectionSatInfoList.h \ + DiffCorrectionStatus.h \ + DL-TransportChannelBLER.h \ + DopplerUncertainty.h \ + EllipsoidPoint.h \ + EllipsoidPointAltitude.h \ + EllipsoidPointAltitudeEllipsoide.h \ + EllipsoidPointUncertCircle.h \ + EllipsoidPointUncertEllipse.h \ + EnvironmentCharacterisation.h \ + Event1a.h \ + Event1a-r4.h \ + Event1a-LCR-r4.h \ + Event1b.h \ + Event1b-r4.h \ + Event1b-LCR-r4.h \ + Event1c.h \ + Event1d.h \ + Event1e.h \ + Event1e-r6.h \ + Event1f.h \ + Event1f-r6.h \ + Event1j-r6.h \ + Event2a.h \ + Event2a-r6.h \ + Event2b.h \ + Event2b-r6.h \ + Event2c.h \ + Event2c-r6.h \ + Event2d.h \ + Event2d-r6.h \ + Event2e.h \ + Event2e-r6.h \ + Event2f.h \ + Event2f-r6.h \ + Event3a.h \ + Event3b.h \ + Event3c.h \ + Event3d.h \ + EventIDInterFreq.h \ + EventIDInterRAT.h \ + EventIDIntraFreq.h \ + EventResults.h \ + ExtraDopplerInfo.h \ + FACH-MeasurementOccasionInfo.h \ + FACH-MeasurementOccasionInfo-LCR-r4-ext.h \ + FilterCoefficient.h \ + FineSFN-SFN.h \ + ForbiddenAffectCell.h \ + ForbiddenAffectCell-r4.h \ + ForbiddenAffectCell-LCR-r4.h \ + ForbiddenAffectCellList.h \ + ForbiddenAffectCellList-r4.h \ + ForbiddenAffectCellList-LCR-r4.h \ + FreqQualityEstimateQuantity-FDD.h \ + FreqQualityEstimateQuantity-TDD.h \ + GPS-MeasurementParam.h \ + GPS-MeasurementParamList.h \ + GSM-CarrierRSSI.h \ + GSM-MeasuredResults.h \ + GSM-MeasuredResultsList.h \ + GPS-TOW-1msec.h \ + GPS-TOW-Assist.h \ + GPS-TOW-AssistList.h \ + HCS-CellReselectInformation-RSCP.h \ + HCS-CellReselectInformation-ECN0.h \ + HCS-NeighbouringCellInformation-RSCP.h \ + HCS-NeighbouringCellInformation-ECN0.h \ + HCS-PRIO.h \ + HCS-ServingCellInformation.h \ + HorizontalVelocity.h \ + HorizontalWithVerticalVelocity.h \ + HorizontalVelocityWithUncertainty.h \ + HorizontalWithVerticalVelocityAndUncertainty.h \ + Hysteresis.h \ + HysteresisInterFreq.h \ + InterFreqCell.h \ + InterFreqCell-LCR-r4.h \ + InterFreqCellID.h \ + InterFreqCellInfoList.h \ + InterFreqCellInfoList-r4.h \ + InterFreqCellInfoSI-List-RSCP.h \ + InterFreqCellInfoSI-List-ECN0.h \ + InterFreqCellInfoSI-List-HCS-RSCP.h \ + InterFreqCellInfoSI-List-HCS-ECN0.h \ + InterFreqCellInfoSI-List-RSCP-LCR.h \ + InterFreqCellInfoSI-List-ECN0-LCR.h \ + InterFreqCellInfoSI-List-HCS-RSCP-LCR.h \ + InterFreqCellInfoSI-List-HCS-ECN0-LCR.h \ + InterFreqCellList.h \ + InterFreqCellList-LCR-r4-ext.h \ + InterFreqCellMeasuredResultsList.h \ + InterFreqEvent.h \ + InterFreqEvent-r6.h \ + InterFreqEventList.h \ + InterFreqEventList-r6.h \ + InterFrequencyMeasuredResultsList-v590ext.h \ + Inter-FreqEventCriteria-v590ext.h \ + Inter-FreqEventCriteriaList-v590ext.h \ + Intra-FreqEventCriteriaList-v590ext.h \ + IntraFrequencyMeasuredResultsList-v590ext.h \ + IntraFreqReportingCriteria-1b-r5.h \ + PeriodicReportingInfo-1b.h \ + InterFreqEventResults.h \ + InterFreqEventResults-LCR-r4-ext.h \ + InterFreqMeasQuantity.h \ + InterFreqMeasuredResults.h \ + InterFreqMeasuredResultsList.h \ + InterFreqMeasurementSysInfo-RSCP.h \ + InterFreqMeasurementSysInfo-ECN0.h \ + InterFreqMeasurementSysInfo-HCS-RSCP.h \ + InterFreqMeasurementSysInfo-HCS-ECN0.h \ + InterFreqMeasurementSysInfo-RSCP-LCR-r4.h \ + InterFreqMeasurementSysInfo-ECN0-LCR-r4.h \ + InterFreqMeasurementSysInfo-HCS-RSCP-LCR-r4.h \ + InterFreqMeasurementSysInfo-HCS-ECN0-LCR-r4.h \ + InterFreqRACHRepCellsList.h \ + InterFreqRACHReportingInfo.h \ + InterFreqReportCriteria.h \ + InterFreqReportCriteria-r4.h \ + InterFreqReportCriteria-r6.h \ + InterFreqReportingCriteria.h \ + InterFreqReportingCriteria-r6.h \ + InterFreqReportingQuantity.h \ + InterFreqRepQuantityRACH-FDD.h \ + InterFreqRepQuantityRACH-TDD.h \ + InterFreqRepQuantityRACH-TDDList.h \ + InterFrequencyMeasurement.h \ + InterFrequencyMeasurement-r4.h \ + InterFrequencyMeasurement-r6.h \ + InterRAT-TargetCellDescription.h \ + InterRATCellID.h \ + InterRATCellInfoIndication.h \ + InterRATCellInfoList.h \ + InterRATCellInfoList-B.h \ + InterRATCellInfoList-r4.h \ + InterRATCellInfoList-r6.h \ + InterRATCellIndividualOffset.h \ + InterRATEvent.h \ + InterRATEventList.h \ + InterRATEventResults.h \ + InterRATInfo.h \ + InterRATInfo-r6.h \ + InterRATMeasQuantity.h \ + InterRATMeasuredResults.h \ + InterRATMeasuredResultsList.h \ + InterRATMeasurement.h \ + InterRATMeasurement-r4.h \ + InterRATMeasurement-r6.h \ + InterRATMeasurementSysInfo.h \ + InterRATMeasurementSysInfo-B.h \ + InterRATReportCriteria.h \ + InterRATReportingCriteria.h \ + InterRATReportingQuantity.h \ + IntraFreqCellID.h \ + IntraFreqCellInfoList.h \ + IntraFreqCellInfoList-r4.h \ + IntraFreqCellInfoSI-List-RSCP.h \ + IntraFreqCellInfoSI-List-ECN0.h \ + IntraFreqCellInfoSI-List-HCS-RSCP.h \ + IntraFreqCellInfoSI-List-HCS-ECN0.h \ + IntraFreqCellInfoSI-List-RSCP-LCR-r4.h \ + IntraFreqCellInfoSI-List-ECN0-LCR-r4.h \ + IntraFreqCellInfoSI-List-HCS-RSCP-LCR-r4.h \ + IntraFreqCellInfoSI-List-HCS-ECN0-LCR-r4.h \ + IntraFreqEvent.h \ + IntraFreqEvent-r4.h \ + IntraFreqEvent-LCR-r4.h \ + IntraFreqEvent-r6.h \ + IntraFreqEvent-1d-r5.h \ + IntraFreqEventCriteria.h \ + IntraFreqEventCriteria-r4.h \ + IntraFreqEventCriteria-LCR-r4.h \ + IntraFreqEventCriteria-r6.h \ + IntraFreqEventCriteriaList.h \ + IntraFreqEventCriteriaList-r4.h \ + IntraFreqEventCriteriaList-LCR-r4.h \ + IntraFreqEventCriteriaList-r6.h \ + IntraFreqEventResults.h \ + IntraFreqMeasQuantity.h \ + IntraFreqMeasQuantity-FDD.h \ + IntraFreqMeasQuantity-TDD.h \ + IntraFreqMeasQuantity-TDDList.h \ + IntraFreqMeasuredResultsList.h \ + IntraFreqMeasurementSysInfo-RSCP.h \ + IntraFreqMeasurementSysInfo-ECN0.h \ + IntraFreqMeasurementSysInfo-HCS-RSCP.h \ + IntraFreqMeasurementSysInfo-HCS-ECN0.h \ + IntraFreqMeasurementSysInfo-RSCP-LCR-r4.h \ + IntraFreqMeasurementSysInfo-ECN0-LCR-r4.h \ + IntraFreqMeasurementSysInfo-HCS-RSCP-LCR-r4.h \ + IntraFreqMeasurementSysInfo-HCS-ECN0-LCR-r4.h \ + IntraFreqReportCriteria.h \ + IntraFreqReportCriteria-r4.h \ + IntraFreqReportCriteria-r6.h \ + IntraFreqReportingCriteria.h \ + IntraFreqReportingCriteria-r4.h \ + IntraFreqReportingCriteria-LCR-r4.h \ + IntraFreqReportingCriteria-r6.h \ + IntraFreqReportingQuantity.h \ + IntraFreqReportingQuantityForRACH.h \ + IntraFreqRepQuantityRACH-FDD.h \ + IntraFreqRepQuantityRACH-TDD.h \ + IntraFreqRepQuantityRACH-TDDList.h \ + IntraFrequencyMeasurement.h \ + IntraFrequencyMeasurement-r4.h \ + IntraFrequencyMeasurement-r6.h \ + IODE.h \ + IP-Length.h \ + IP-PCCPCH-r4.h \ + IP-Spacing.h \ + IP-Spacing-TDD.h \ + IS-2000SpecificMeasInfo.h \ + MaxNumberOfReportingCellsType1.h \ + MaxNumberOfReportingCellsType2.h \ + MaxNumberOfReportingCellsType3.h \ + MaxReportedCellsOnRACH.h \ + MaxReportedCellsOnRACHinterFreq.h \ + MeasuredResults.h \ + MeasuredResults-v390ext.h \ + MeasuredResults-v590ext.h \ + MeasuredResults-v7xyext.h \ + MeasuredResults-LCR-r4.h \ + MeasuredResultsList.h \ + MeasuredResultsList-LCR-r4-ext.h \ + MeasuredResultsOnRACH.h \ + MeasuredResultsOnRACHinterFreq.h \ + MeasurementCommand.h \ + MeasurementCommand-r4.h \ + MeasurementCommand-r6.h \ + MeasurementControlSysInfo.h \ + MeasurementControlSysInfo-LCR-r4-ext.h \ + MeasurementIdentity.h \ + MeasurementQuantityGSM.h \ + MeasurementReportingMode.h \ + MeasurementType.h \ + MeasurementType-r4.h \ + MeasurementType-r6.h \ + MeasurementValidity.h \ + MonitoredCellRACH-List.h \ + MonitoredCellRACH-Result.h \ + MultipathIndicator.h \ + N-CR-T-CRMaxHyst.h \ + NavigationModelSatInfo.h \ + NavigationModelSatInfoList.h \ + EphemerisParameter.h \ + NC-Mode.h \ + Neighbour.h \ + Neighbour-v390ext.h \ + NeighbourList.h \ + NeighbourList-v390ext.h \ + NeighbourQuality.h \ + NewInterFreqCell.h \ + NewInterFreqCell-r4.h \ + NewInterFreqCellList.h \ + NewInterFreqCellList-r4.h \ + NewInterFreqCellSI-RSCP.h \ + NewInterFreqCellSI-ECN0.h \ + NewInterFreqCellSI-HCS-RSCP.h \ + NewInterFreqCellSI-HCS-ECN0.h \ + NewInterFreqCellSI-RSCP-LCR-r4.h \ + NewInterFreqCellSI-ECN0-LCR-r4.h \ + NewInterFreqCellSI-HCS-RSCP-LCR-r4.h \ + NewInterFreqCellSI-HCS-ECN0-LCR-r4.h \ + NewInterFreqCellSI-List-ECN0.h \ + NewInterFreqCellSI-List-HCS-RSCP.h \ + NewInterFreqCellSI-List-HCS-ECN0.h \ + NewInterFreqCellSI-List-RSCP.h \ + NewInterFreqCellSI-List-ECN0-LCR-r4.h \ + NewInterFreqCellSI-List-HCS-RSCP-LCR-r4.h \ + NewInterFreqCellSI-List-HCS-ECN0-LCR-r4.h \ + NewInterFreqCellSI-List-RSCP-LCR-r4.h \ + NewInterRATCell.h \ + NewInterRATCell-B.h \ + NewInterRATCellList.h \ + NewInterRATCellList-B.h \ + NewIntraFreqCell.h \ + NewIntraFreqCell-r4.h \ + NewIntraFreqCellList.h \ + NewIntraFreqCellList-r4.h \ + NewIntraFreqCellSI-RSCP.h \ + NewIntraFreqCellSI-ECN0.h \ + NewIntraFreqCellSI-HCS-RSCP.h \ + NewIntraFreqCellSI-HCS-ECN0.h \ + NewIntraFreqCellSI-RSCP-LCR-r4.h \ + NewIntraFreqCellSI-ECN0-LCR-r4.h \ + NewIntraFreqCellSI-HCS-RSCP-LCR-r4.h \ + NewIntraFreqCellSI-HCS-ECN0-LCR-r4.h \ + NewIntraFreqCellSI-List-RSCP.h \ + NewIntraFreqCellSI-List-ECN0.h \ + NewIntraFreqCellSI-List-HCS-RSCP.h \ + NewIntraFreqCellSI-List-HCS-ECN0.h \ + NewIntraFreqCellSI-List-RSCP-LCR-r4.h \ + NewIntraFreqCellSI-List-ECN0-LCR-r4.h \ + NewIntraFreqCellSI-List-HCS-RSCP-LCR-r4.h \ + NewIntraFreqCellSI-List-HCS-ECN0-LCR-r4.h \ + NonUsedFreqParameter.h \ + NonUsedFreqParameter-r6.h \ + NonUsedFreqParameterList.h \ + NonUsedFreqParameterList-r6.h \ + NonUsedFreqWList-r6.h \ + ObservedTimeDifferenceToGSM.h \ + OTDOA-SearchWindowSize.h \ + Pathloss.h \ + PenaltyTime-RSCP.h \ + PenaltyTime-ECN0.h \ + PendingTimeAfterTrigger.h \ + PeriodicalOrEventTrigger.h \ + PeriodicalReportingCriteria.h \ + PeriodicalWithReportingCellStatus.h \ + PLMNIdentitiesOfNeighbourCells.h \ + PLMNsOfInterFreqCellsList.h \ + PLMNsOfIntraFreqCellsList.h \ + PLMNsOfInterRATCellsList.h \ + PositionEstimate.h \ + PositioningMethod.h \ + PRC.h \ + PrimaryCCPCH-RSCP.h \ + Q-HCS.h \ + Q-OffsetS-N.h \ + Q-QualMin.h \ + Q-RxlevMin.h \ + QualityEventResults.h \ + QualityMeasuredResults.h \ + QualityMeasurement.h \ + QualityReportCriteria.h \ + QualityReportingCriteria.h \ + QualityReportingCriteriaSingle.h \ + QualityReportingQuantity.h \ + RAT-Type.h \ + ReferenceCellPosition.h \ + ReferenceLocation.h \ + ReferenceTimeDifferenceToCell.h \ + RemovedInterFreqCellList.h \ + RemovedInterRATCellList.h \ + RemovedIntraFreqCellList.h \ + ReplacementActivationThreshold.h \ + ReportDeactivationThreshold.h \ + ReportingAmount.h \ + ReportingCellStatus.h \ + ReportingCellStatusOpt.h \ + ReportingInfoForCellDCH.h \ + ReportingInfoForCellDCH-LCR-r4.h \ + ReportingInterval.h \ + ReportingIntervalLong.h \ + ReportingRange.h \ + RL-AdditionInfoList.h \ + RL-InformationLists.h \ + RLC-BuffersPayload.h \ + RRC.h \ + SatData.h \ + SatDataList.h \ + SatelliteStatus.h \ + SatID.h \ + SFN-Offset-Validity.h \ + SFN-SFN-Drift.h \ + SFN-SFN-ObsTimeDifference.h \ + SFN-SFN-ObsTimeDifference1.h \ + SFN-SFN-ObsTimeDifference2.h \ + SFN-SFN-OTD-Type.h \ + SFN-SFN-RelTimeDifference1.h \ + SFN-TOW-Uncertainty.h \ + SIR.h \ + SIR-MeasurementList.h \ + SIR-MeasurementResults.h \ + SIR-TFCS.h \ + SIR-TFCS-List.h \ + SIR-TimeslotList.h \ + SubFrame1Reserved.h \ + T-ADVinfo.h \ + T-CRMax.h \ + T-CRMaxHyst.h \ + TemporaryOffset1.h \ + TemporaryOffset2.h \ + TemporaryOffsetList.h \ + Threshold.h \ + Threshold-r6.h \ + ThreholdNonUsedFrequency-deltaList.h \ + ThresholdPositionChange.h \ + ThresholdSFN-GPS-TOW.h \ + ThresholdSFN-SFN-Change.h \ + ThresholdUsedFrequency.h \ + ThresholdUsedFrequency-r6.h \ + TimeInterval.h \ + TimeslotInfo.h \ + TimeslotInfo-LCR-r4.h \ + TimeslotInfoList.h \ + TimeslotInfoList-LCR-r4.h \ + TimeslotInfoList-r4.h \ + TimeslotISCP.h \ + TimeslotISCP-List.h \ + TimeslotListWithISCP.h \ + TimeslotWithISCP.h \ + TimeToTrigger.h \ + TrafficVolumeEventParam.h \ + TrafficVolumeEventResults.h \ + TrafficVolumeEventType.h \ + TrafficVolumeMeasQuantity.h \ + TrafficVolumeMeasSysInfo.h \ + TrafficVolumeMeasuredResults.h \ + TrafficVolumeMeasuredResultsList.h \ + TrafficVolumeMeasurement.h \ + TrafficVolumeMeasurementObjectList.h \ + TrafficVolumeReportCriteria.h \ + TrafficVolumeReportCriteriaSysInfo.h \ + TrafficVolumeReportingCriteria.h \ + TrafficVolumeReportingQuantity.h \ + TrafficVolumeThreshold.h \ + TransChCriteria.h \ + TransChCriteriaList.h \ + TransferMode.h \ + TransmittedPowerThreshold.h \ + TriggeringCondition1.h \ + TriggeringCondition2.h \ + TX-InterruptionAfterTrigger.h \ + UDRE.h \ + UE-6AB-Event.h \ + UE-6FG-Event.h \ + UE-AutonomousUpdateMode.h \ + UE-InternalEventParam.h \ + UE-InternalEventParamList.h \ + UE-InternalEventResults.h \ + UE-InternalMeasQuantity.h \ + UE-InternalMeasuredResults.h \ + UE-InternalMeasuredResults-r7.h \ + UE-InternalMeasuredResults-LCR-r4.h \ + UE-InternalMeasurement.h \ + UE-InternalMeasurement-r4.h \ + UE-InternalMeasurementSysInfo.h \ + UE-InternalReportCriteria.h \ + UE-InternalReportingCriteria.h \ + UE-InternalReportingQuantity.h \ + UE-InternalReportingQuantity-r4.h \ + UE-MeasurementQuantity.h \ + UE-RX-TX-ReportEntry.h \ + UE-RX-TX-ReportEntryList.h \ + UE-RX-TX-TimeDifferenceType1.h \ + UE-RX-TX-TimeDifferenceType2.h \ + UE-RX-TX-TimeDifferenceType2Info.h \ + UE-RX-TX-TimeDifferenceThreshold.h \ + UE-TransmittedPower.h \ + UE-TransmittedPowerTDD-List.h \ + UL-TrCH-Identity.h \ + UE-Positioning-Accuracy.h \ + UE-Positioning-CipherParameters.h \ + UE-Positioning-Error.h \ + UE-Positioning-ErrorCause.h \ + UE-Positioning-EventParam.h \ + UE-Positioning-EventParamList.h \ + UE-Positioning-EventSpecificInfo.h \ + UE-Positioning-GPS-AcquisitionAssistance.h \ + UE-Positioning-GPS-AdditionalAssistanceDataRequest.h \ + UE-Positioning-GPS-Almanac.h \ + UE-Positioning-GPS-AssistanceData.h \ + UE-Positioning-GPS-DGPS-Corrections.h \ + UE-Positioning-GPS-IonosphericModel.h \ + UE-Positioning-GPS-MeasurementResults.h \ + UE-Positioning-GPS-NavigationModel.h \ + UE-Positioning-GPS-NavModelAddDataReq.h \ + UE-Positioning-GPS-ReferenceCellInfo.h \ + UE-Positioning-GPS-ReferenceTime.h \ + UE-Positioning-GPS-UTC-Model.h \ + UE-Positioning-IPDL-Parameters.h \ + UE-Positioning-IPDL-Parameters-r4.h \ + UE-Positioning-IPDL-Parameters-TDD-r4-ext.h \ + UE-Positioning-MeasuredResults.h \ + UE-Positioning-MeasuredResults-v390ext.h \ + UE-Positioning-Measurement.h \ + UE-Positioning-Measurement-v390ext.h \ + UE-Positioning-Measurement-r4.h \ + UE-Positioning-Measurement-v7xyext.h \ + UE-Positioning-MeasurementEventResults.h \ + UE-Positioning-MeasurementInterval.h \ + UE-Positioning-MethodType.h \ + UE-Positioning-OTDOA-AssistanceData.h \ + UE-Positioning-OTDOA-AssistanceData-r4.h \ + UE-Positioning-OTDOA-AssistanceData-r4ext.h \ + UE-Positioning-OTDOA-AssistanceData-UEB.h \ + UE-Positioning-IPDL-Parameters-TDDList-r4-ext.h \ + UE-Positioning-OTDOA-Measurement.h \ + UE-Positioning-OTDOA-Measurement-v390ext.h \ + UE-Positioning-OTDOA-NeighbourCellInfo.h \ + UE-Positioning-OTDOA-NeighbourCellInfo-r4.h \ + UE-Positioning-OTDOA-NeighbourCellInfo-UEB.h \ + UE-Positioning-OTDOA-NeighbourCellList.h \ + UE-Positioning-OTDOA-NeighbourCellList-r4.h \ + UE-Positioning-OTDOA-NeighbourCellList-UEB.h \ + UE-Positioning-OTDOA-Quality.h \ + UE-Positioning-OTDOA-ReferenceCellInfo.h \ + UE-Positioning-OTDOA-ReferenceCellInfo-r4.h \ + UE-Positioning-OTDOA-ReferenceCellInfo-UEB.h \ + UE-Positioning-PositionEstimateInfo.h \ + UE-Positioning-ReportCriteria.h \ + UE-Positioning-ReportingQuantity.h \ + UE-Positioning-ReportingQuantity-v390ext.h \ + UE-Positioning-ReportingQuantity-r4.h \ + UE-Positioning-ReportingQuantity-v7xyext.h \ + UE-Positioning-ResponseTime.h \ + UTRA-CarrierRSSI.h \ + UTRAN-GPS-DriftRate.h \ + UTRAN-GPSReferenceTime.h \ + UTRAN-GPSReferenceTimeResult.h \ + VarianceOfRLC-BufferPayload.h \ + VelocityEstimate.h \ + W.h \ + BCC.h \ + BCCH-ModificationInfo.h \ + BCCH-ModificationTime.h \ + BSIC.h \ + CBS-DRX-Level1Information.h \ + CBS-DRX-Level1Information-extension-r6.h \ + CDMA2000-Message.h \ + CDMA2000-MessageList.h \ + CDMA2000-UMTS-Frequency-List.h \ + CellValueTag.h \ + ExpirationTimeFactor.h \ + FDD-UMTS-Frequency-List.h \ + FrequencyInfoCDMA2000.h \ + GERAN-SystemInfoBlock.h \ + GERAN-SystemInformation.h \ + GSM-BA-Range.h \ + GSM-BA-Range-List.h \ + GSM-Classmark2.h \ + GSM-Classmark3.h \ + GSM-MessageList.h \ + GSM-MS-RadioAccessCapability.h \ + GsmSecurityCapability.h \ + GSM-TargetCellInfoList.h \ + GSM-TargetCellInfo.h \ + IdentificationOfReceivedMessage.h \ + InterRAT-ChangeFailureCause.h \ + GERANIu-MessageList.h \ + GERANIu-RadioAccessCapability.h \ + InterRAT-UE-RadioAccessCapability.h \ + InterRAT-UE-RadioAccessCapabilityList.h \ + InterRAT-UE-RadioAccessCapability-v590ext.h \ + InterRAT-UE-RadioAccessCapability-v690ext.h \ + InterRAT-UE-SecurityCapability.h \ + InterRAT-UE-SecurityCapList.h \ + InterRAT-HO-FailureCause.h \ + MasterInformationBlock.h \ + MasterInformationBlock-v690ext.h \ + MIB-ValueTag.h \ + NCC.h \ + PLMN-ValueTag.h \ + PredefinedConfigIdentityAndValueTag.h \ + ProtocolErrorInformation.h \ + ReceivedMessageType.h \ + Rplmn-Information.h \ + Rplmn-Information-r4.h \ + SchedulingInformation.h \ + SchedulingInformationSIB.h \ + SchedulingInformationSIBSb.h \ + SegCount.h \ + SegmentIndex.h \ + SFN-Prime.h \ + SIB-Data-fixed.h \ + SIB-Data-variable.h \ + SIBOccurIdentity.h \ + SIBOccurrenceIdentityAndValueTag.h \ + SIBOccurValueTag.h \ + SIB-ReferenceList.h \ + SIBSb-ReferenceList.h \ + SIB-ReferenceListFACH.h \ + SIB-Type.h \ + SIB-TypeAndTag.h \ + SIBSb-TypeAndTag.h \ + SibOFF.h \ + SibOFF-List.h \ + SysInfoType1.h \ + SysInfoType1-v3a0ext-IEs.h \ + SysInfoType2.h \ + SysInfoType3.h \ + SysInfoType3-v4b0ext-IEs.h \ + SysInfoType3-v590ext.h \ + SysInfoType3-v5c0ext-IEs.h \ + SysInfoType3-v670ext.h \ + SysInfoType4.h \ + SysInfoType4-v4b0ext-IEs.h \ + SysInfoType4-v590ext.h \ + SysInfoType4-v5b0ext-IEs.h \ + SysInfoType4-v5c0ext-IEs.h \ + SysInfoType5.h \ + SysInfoType5-v4b0ext-IEs.h \ + SysInfoType5-v590ext-IEs.h \ + SysInfoType5-v650ext-IEs.h \ + SysInfoType5-v680ext-IEs.h \ + SysInfoType5-v690ext-IEs.h \ + SysInfoType5-v7xyext-IEs.h \ + SysInfoType5bis.h \ + SysInfoType6.h \ + SysInfoType6-v4b0ext-IEs.h \ + SysInfoType6-v590ext-IEs.h \ + SysInfoType6-v650ext-IEs.h \ + SysInfoType6-v690ext-IEs.h \ + SysInfoType6-v7xyext-IEs.h \ + SysInfoType7.h \ + SysInfoType8.h \ + SysInfoType9.h \ + SysInfoType10.h \ + SysInfoType11.h \ + SysInfoType11-v4b0ext-IEs.h \ + SysInfoType11-v590ext-IEs.h \ + SysInfoType11-v690ext-IEs.h \ + SysInfoType12.h \ + SysInfoType12-v4b0ext-IEs.h \ + SysInfoType12-v590ext-IEs.h \ + SysInfoType12-v690ext-IEs.h \ + SysInfoType13.h \ + SysInfoType13-v3a0ext-IEs.h \ + SysInfoType13-v4b0ext-IEs.h \ + SysInfoType13-v7xyext-IEs.h \ + SysInfoType13-1.h \ + SysInfoType13-2.h \ + SysInfoType13-3.h \ + SysInfoType13-4.h \ + SysInfoType14.h \ + SysInfoType15.h \ + SysInfoType15-v4b0ext-IEs.h \ + SysInfoType15-1.h \ + SysInfoType15-2.h \ + SysInfoType15-3.h \ + SysInfoType15-4.h \ + SysInfoType15-4-v3a0ext.h \ + SysInfoType15-4-v4b0ext.h \ + SysInfoType15-5.h \ + SysInfoType15-5-v3a0ext.h \ + SysInfoType16.h \ + SysInfoType17.h \ + SysInfoType17-v4b0ext-IEs.h \ + SysInfoType17-v590ext-IEs.h \ + SysInfoType17-v7xyext-IEs.h \ + SysInfoType18.h \ + SysInfoTypeSB1.h \ + SysInfoTypeSB2.h \ + TDD-UMTS-Frequency-List.h \ + ANSI-41-GlobalServiceRedirectInfo.h \ + ANSI-41-PrivateNeighbourListInfo.h \ + ANSI-41-RAND-Information.h \ + ANSI-41-UserZoneID-Information.h \ + ANSI-41-NAS-Parameter.h \ + Min-P-REV.h \ + NAS-SystemInformationANSI-41.h \ + NID.h \ + P-REV.h \ + SID.h \ + MBMS-AccessProbabilityFactor.h \ + MBMS-CellGroupIdentity-r6.h \ + MBMS-CommonCCTrChIdentity.h \ + MBMS-CommonPhyChIdentity.h \ + MBMS-CommonRBIdentity.h \ + MBMS-CommonRBInformation-r6.h \ + MBMS-CommonRBInformationList-r6.h \ + MBMS-CommonTrChIdentity.h \ + MBMS-ConnectedModeCountingScope.h \ + MBMS-CurrentCell-SCCPCH-r6.h \ + MBMS-CurrentCell-SCCPCHList-r6.h \ + MBMS-FACHCarryingMTCH-List.h \ + MBMS-JoinedInformation-r6.h \ + MBMS-L1CombiningSchedule-32.h \ + MBMS-L1CombiningSchedule-64.h \ + MBMS-L1CombiningSchedule-128.h \ + MBMS-L1CombiningSchedule-256.h \ + MBMS-L1CombiningSchedule-512.h \ + MBMS-L1CombiningSchedule-1024.h \ + MBMS-L1CombiningSchedule.h \ + MBMS-L1CombiningTransmTimeDiff.h \ + MBMS-L23Configuration.h \ + MBMS-LogicalChIdentity.h \ + MBMS-MCCH-ConfigurationInfo-r6.h \ + MBMS-MICHConfigurationInfo-r6.h \ + MBMS-MICHConfigurationInfo-r7.h \ + MBMS-MICHNotificationIndLength.h \ + MBMS-MICHPowerOffset.h \ + MBMS-ModifedService-r6.h \ + MBMS-ModifedServiceList-r6.h \ + MBMS-MSCH-ConfigurationInfo-r6.h \ + MBMS-MSCHSchedulingInfo.h \ + MBMS-NeighbouringCellSCCPCH-r6.h \ + MBMS-NeighbouringCellSCCPCHList-r6.h \ + MBMS-NI-CountPerFrame.h \ + MBMS-NumberOfNeighbourCells-r6.h \ + MBMS-PFLIndex.h \ + MBMS-PFLInfo.h \ + MBMS-PhyChInformation-r6.h \ + MBMS-PhyChInformationList-r6.h \ + MBMS-PL-ServiceRestrictInfo-r6.h \ + MBMS-PreferredFreqRequest-r6.h \ + MBMS-PreferredFrequencyInfo-r6.h \ + MBMS-PreferredFrequencyList-r6.h \ + MBMS-PTMActivationTime-r6.h \ + MBMS-PTM-RBInformation-C.h \ + MBMS-PTM-RBInformation-CList.h \ + MBMS-PTM-RBInformation-N.h \ + MBMS-PTM-RBInformation-NList.h \ + MBMS-Qoffset.h \ + MBMS-RequiredUEAction-Mod.h \ + MBMS-RequiredUEAction-UMod.h \ + MBMS-SCCPCHIdentity.h \ + MBMS-SCCPCHPwrOffsetDiff.h \ + MBMS-ServiceAccessInfo-r6.h \ + MBMS-ServiceAccessInfoList-r6.h \ + MBMS-ServiceIdentity-r6.h \ + MBMS-ServiceSchedulingInfo-r6.h \ + MBMS-ServiceSchedulingInfoList-r6.h \ + MBMS-ServiceTransmInfo.h \ + MBMS-ServiceTransmInfoList.h \ + MBMS-SessionIdentity.h \ + MBMS-ShortTransmissionID.h \ + MBMS-SIBType5-SCCPCH-r6.h \ + MBMS-SIBType5-SCCPCHList-r6.h \ + MBMS-SoftComb-TimingOffset.h \ + MBMS-TCTF-Presence.h \ + MBMS-TimersAndCounters-r6.h \ + MBMS-TransmissionIdentity.h \ + MBMS-TranspChInfoForCCTrCh-r6.h \ + MBMS-TranspChInfoForEachCCTrCh-r6.h \ + MBMS-TranspChInfoForEachTrCh-r6.h \ + MBMS-TranspChInfoForTrCh-r6.h \ + MBMS-TrCHInformation-Curr.h \ + MBMS-TrCHInformation-CurrList.h \ + MBMS-TrCHInformation-Neighb.h \ + MBMS-TrCHInformation-NeighbList.h \ + MBMS-TrCHInformation-SIB5.h \ + MBMS-TrCHInformation-SIB5List.h \ + MBMS-UnmodifiedService-r6.h \ + MBMS-UnmodifiedServiceList-r6.h \ + ToTargetRNC-Container.h \ + TargetRNC-ToSourceRNC-Container.h \ + InterRATHandoverInfoWithInterRATCapabilities-r3.h \ + InterRATHandoverInfoWithInterRATCapabilities-r3-IEs.h \ + InterRATHandoverInfoWithInterRATCapabilities-v390ext-IEs.h \ + InterRATHandoverInfoWithInterRATCapabilities-v690ext-IEs.h \ + RFC3095-ContextInfo-r5.h \ + RFC3095-ContextInfoList-r5.h \ + SRNC-RelocationInfo-r3.h \ + SRNC-RelocationInfo-r3-IEs.h \ + SRNC-RelocationInfo-v380ext-IEs.h \ + SRNC-RelocationInfo-v390ext-IEs.h \ + SRNC-RelocationInfo-v3a0ext-IEs.h \ + SRNC-RelocationInfo-v3b0ext-IEs.h \ + SRNC-RelocationInfo-v3c0ext-IEs.h \ + SRNC-RelocationInfo-v3d0ext-IEs.h \ + SRNC-RelocationInfo-v3g0ext-IEs.h \ + SRNC-RelocationInfo-v3h0ext-IEs.h \ + SRNC-RelocationInfo-v4d0ext-IEs.h \ + TPC-CombinationInfoList.h \ + STARTList2.h \ + SRNC-RelocationInfo-v4b0ext-IEs.h \ + SRNC-RelocationInfo-v590ext-IEs.h \ + SRNC-RelocationInfo-v5a0ext-IEs.h \ + SRNC-RelocationInfo-v5b0ext-IEs.h \ + SRNC-RelocationInfo-v5c0ext-IEs.h \ + SRNC-RelocationInfo-v7xyext-IEs.h \ + CipheringInfoPerRB-List-v3a0ext.h \ + CipheringStatusList.h \ + CipheringStatusCNdomain.h \ + CodeChangeStatusList.h \ + CodeChangeStatus.h \ + StoredCompressedModeInfo.h \ + StoredTGP-SequenceList.h \ + StoredTGP-Sequence.h \ + SRNC-RelocationInfo-r4-IEs.h \ + SRNC-RelocationInfo-r5-IEs.h \ + SRNC-RelocationInfo-v690ext-IEs.h \ + SRNC-RelocationInfo-r6-IEs.h \ + CalculationTimeForCiphering.h \ + CipheringInfoPerRB.h \ + CipheringInfoPerRB-r4.h \ + CipheringInfoPerRB-List.h \ + CipheringInfoPerRB-List-r4.h \ + CipheringStatus.h \ + CipheringStatusList-r4.h \ + CipheringStatusCNdomain-r4.h \ + CN-DomainInformation-v390ext.h \ + CN-DomainInformationList-v390ext.h \ + CompressedModeMeasCapability-r4.h \ + COUNT-C-List.h \ + COUNT-CSingle.h \ + DL-PhysChCapabilityFDD-r4.h \ + DL-PhysChCapabilityFDD-r5.h \ + DL-PhysChCapabilityTDD-r5.h \ + DL-PhysChCapabilityTDD-LCR-r5.h \ + DL-RFC3095-Context.h \ + ImplementationSpecificParams.h \ + IntegrityProtectionStatus.h \ + InterRAT-UE-RadioAccessCapabilityList-r5.h \ + IntraFreqReportingCriteria-r6-ext.h \ + MaxHcContextSpace-r5.h \ + MeasurementCapability-r4.h \ + MeasurementCommandWithType.h \ + MeasurementCommandWithType-r4.h \ + MeasurementCommandWithType-r6.h \ + OngoingMeasRep.h \ + OngoingMeasRep-r4.h \ + OngoingMeasRep-r5.h \ + OngoingMeasRep-r6.h \ + OngoingMeasRepList.h \ + OngoingMeasRepList-r4.h \ + OngoingMeasRepList-r5.h \ + OngoingMeasRepList-r6.h \ + PDCP-Capability-r4.h \ + PDCP-Capability-r5.h \ + PDCP-Capability-r6.h \ + PhysicalChannelCapability-r4.h \ + PhysicalChannelCapability-r5.h \ + RF-Capability-r4.h \ + RFC3095-ContextInfo.h \ + RFC3095-Context-List.h \ + RLC-Capability-r5.h \ + SRB-SpecificIntegrityProtInfo.h \ + SRB-SpecificIntegrityProtInfoList.h \ + StateOfRRC.h \ + StateOfRRC-Procedure.h \ + TotalRLC-AM-BufferSize-r5.h \ + TPC-Combination-Info.h \ + UE-MultiModeRAT-Capability-r5.h \ + UE-Positioning-Capability-r4.h \ + UE-Positioning-LastKnownPos.h \ + UE-RadioAccessCapability-r4.h \ + UE-RadioAccessCapability-r5.h \ + UE-RadioAccessCapability-r6.h \ + UE-RadioAccessCapability-r7.h \ + UL-RFC3095-Context.h + +ASN_MODULE_HEADERS+=BOOLEAN.h +ASN_MODULE_SOURCES+=BOOLEAN.c +ASN_MODULE_HEADERS+=ENUMERATED.h +ASN_MODULE_SOURCES+=ENUMERATED.c +ASN_MODULE_HEADERS+=INTEGER.h +ASN_MODULE_HEADERS+=NativeEnumerated.h +ASN_MODULE_SOURCES+=INTEGER.c +ASN_MODULE_HEADERS+=NULL.h +ASN_MODULE_SOURCES+=NULL.c +ASN_MODULE_SOURCES+=NativeEnumerated.c +ASN_MODULE_HEADERS+=NativeInteger.h +ASN_MODULE_SOURCES+=NativeInteger.c +ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h +ASN_MODULE_SOURCES+=asn_SEQUENCE_OF.c +ASN_MODULE_HEADERS+=asn_SET_OF.h +ASN_MODULE_SOURCES+=asn_SET_OF.c +ASN_MODULE_HEADERS+=constr_CHOICE.h +ASN_MODULE_SOURCES+=constr_CHOICE.c +ASN_MODULE_HEADERS+=constr_SEQUENCE.h +ASN_MODULE_SOURCES+=constr_SEQUENCE.c +ASN_MODULE_HEADERS+=constr_SEQUENCE_OF.h +ASN_MODULE_SOURCES+=constr_SEQUENCE_OF.c +ASN_MODULE_HEADERS+=constr_SET_OF.h +ASN_MODULE_SOURCES+=constr_SET_OF.c +ASN_MODULE_HEADERS+=asn_application.h +ASN_MODULE_HEADERS+=asn_system.h +ASN_MODULE_HEADERS+=asn_codecs.h +ASN_MODULE_HEADERS+=asn_internal.h +ASN_MODULE_HEADERS+=OCTET_STRING.h +ASN_MODULE_SOURCES+=OCTET_STRING.c +ASN_MODULE_HEADERS+=BIT_STRING.h +ASN_MODULE_SOURCES+=BIT_STRING.c +ASN_MODULE_SOURCES+=asn_codecs_prim.c +ASN_MODULE_HEADERS+=asn_codecs_prim.h +ASN_MODULE_HEADERS+=ber_tlv_length.h +ASN_MODULE_SOURCES+=ber_tlv_length.c +ASN_MODULE_HEADERS+=ber_tlv_tag.h +ASN_MODULE_SOURCES+=ber_tlv_tag.c +ASN_MODULE_HEADERS+=ber_decoder.h +ASN_MODULE_SOURCES+=ber_decoder.c +ASN_MODULE_HEADERS+=der_encoder.h +ASN_MODULE_SOURCES+=der_encoder.c +ASN_MODULE_HEADERS+=constr_TYPE.h +ASN_MODULE_SOURCES+=constr_TYPE.c +ASN_MODULE_HEADERS+=constraints.h +ASN_MODULE_SOURCES+=constraints.c +ASN_MODULE_HEADERS+=xer_support.h +ASN_MODULE_SOURCES+=xer_support.c +ASN_MODULE_HEADERS+=xer_decoder.h +ASN_MODULE_SOURCES+=xer_decoder.c +ASN_MODULE_HEADERS+=xer_encoder.h +ASN_MODULE_SOURCES+=xer_encoder.c +ASN_MODULE_HEADERS+=per_support.h +ASN_MODULE_SOURCES+=per_support.c +ASN_MODULE_HEADERS+=per_decoder.h +ASN_MODULE_SOURCES+=per_decoder.c +ASN_MODULE_HEADERS+=per_encoder.h +ASN_MODULE_SOURCES+=per_encoder.c +ASN_CONVERTER_SOURCES+=converter-sample.c +ASN_CONVERTER_SOURCES+=pdu_collection.c + + +lib_LTLIBRARIES=libsomething.la +libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) + +# This file may be used as an input for make(3) +# Remove the lines below to convert it into a pure .am file +TARGET = rrc-dump +CFLAGS += -I. -DHAVE_CONFIG_H -DASN_PDU_COLLECTION -DPDU=DL_DCCH_Message +OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} + +all: DL_DCCH_Message.c $(TARGET) + +$(TARGET): ${OBJS} + $(CC) $(CFLAGS) -o $(TARGET) ${OBJS} $(LDFLAGS) $(LIBS) + +.SUFFIXES: +.SUFFIXES: .c .o + +.c.o: + $(CC) $(CFLAGS) -o $@ -c $< + +clean: + rm -f $(TARGET) + rm -f $(OBJS) + +regen: regenerate-from-asn1-source + +regenerate-from-asn1-source: + ../../asn1c/asn1c -S ../../skeletons -fcompound-names -pdu=auto -gen-PER ../rrc.asn1 + + +DL_DCCH_Message.c: ../sample.makefile.regen + ASN1CMDOPTS="-fcompound-names -pdu=auto -gen-PER" \ + ASN1MODULES="../rrc.asn1" \ + ASN1PDU=DL_DCCH_Message \ + PROGNAME=rrc-dump \ + ../sample.makefile.regen + @touch DL_DCCH_Message.c + make + +check: ${TARGET} + @if test -f ./sample-DL_DCCH_Message-1.[db]er ; then \ + for f in ./sample-DL_DCCH_Message-*.[db]er; do \ + echo "Recoding $$f into XER and back..."; \ + ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$ || exit 2; \ + ./${TARGET} -ixer -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ + diff ./.tmp.1.$$ ./.tmp.2.$$ || exit 2; \ + rm -f ./.tmp.[12].$$; \ + done; fi + @echo ================ + @echo All tests passed + @echo ================ + +distclean: clean + rm -f $(ASN_MODULE_SOURCES) + rm -f $(ASN_MODULE_HEADERS) + rm -f $(ASN_CONVERTER_SOURCES) $(ASN_CONVERTER_HEADERS) + rm -f Makefile.am.sample diff --git a/examples/sample.source.RRC/README b/examples/sample.source.RRC/README new file mode 100644 index 000000000..5639c583b --- /dev/null +++ b/examples/sample.source.RRC/README @@ -0,0 +1,48 @@ + +GENERAL INFORMATION +=================== + +The 3GPP TS 25.331 RRC (Radio Resource Control) PER decoder. +Invoking `make` will compile the ASN.1 specifications from the +../rrc.asn1 file. + +THERE IS NO rrc.asn1 FILE THERE YET! + +OBTAINING THE RRC SPECIFICATION +================================ + +Due to licensing restrictions, asn1c can not include the RRC ASN.1 module +in its distribution. + +To obtain the RRC ASN.1 specification, you should go to + http://www.3gpp.org/ftp/Specs/html-info/25331.htm +and download any version of RRC specification (preferably 7.1.0, 2006-06). + +A .ZIP file with a Microsoft Word .DOC files will download shortly. + +You should extract the ASN.1 modules from the chapter 11 of that .DOC file, +and save it as the ../rrc.asn1 file. The ../rrc.asn1 file should start with +the following line + "Class-definitions DEFINITIONS AUTOMATIC TAGS ::=" +and end with the "END" token. +Be careful not to copy any preambles, chapter titles and other non-ASN.1 text. + +After obtaining the rrc.asn1, type `make` in the directory containing +this README file. + +rrc-dump USAGE +============== + +The rrc-dump utility may be used to dump the contents of a PER-encoded +RRC protocol data unit. Since RRC specification contains multiple PDUs, +a PDU must be selected manually using -p command line option: + + ./rrc-dump -p DL-DCCH-Message message.per + ./rrc-dump -p PCCH-Message message.per + +The list of recognized PDUs may be obtained using `-p list`. + +The full list of recognized command line options may be obtained with + + > ./rrc-dump -h + diff --git a/examples/sample.source.RRC/config.h b/examples/sample.source.RRC/config.h new file mode 100644 index 000000000..2dda9297a --- /dev/null +++ b/examples/sample.source.RRC/config.h @@ -0,0 +1,10 @@ + +extern int opt_debug; + +#define ASN_DEBUG(fmt, args...) do { \ + if(opt_debug < 2) break; \ + fprintf(stderr, fmt, ##args); \ + fprintf(stderr, " (%s:%d)\n", \ + __FILE__, __LINE__); \ + } while(0) + From e26c9b6e6073e8045c7ca27b924247776a50baf1 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 17 Sep 2006 03:29:51 +0000 Subject: [PATCH 1197/1469] divide and conquer; fight with 4700 files of RRC git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1197 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.LDAP3/Makefile | 3 ++- examples/sample.source.MEGACO/Makefile | 3 ++- examples/sample.source.MHEG5/Makefile | 3 ++- examples/sample.source.PKIX1/Makefile | 3 ++- examples/sample.source.TAP3/Makefile | 3 ++- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/examples/sample.source.LDAP3/Makefile b/examples/sample.source.LDAP3/Makefile index 6f3c8cd16..7fae0bd66 100644 --- a/examples/sample.source.LDAP3/Makefile +++ b/examples/sample.source.LDAP3/Makefile @@ -210,6 +210,7 @@ check: ${TARGET} @echo ================ distclean: clean - rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) + rm -f $(ASN_MODULE_SOURCES) + rm -f $(ASN_MODULE_HEADERS) rm -f $(ASN_CONVERTER_SOURCES) $(ASN_CONVERTER_HEADERS) rm -f Makefile.am.sample diff --git a/examples/sample.source.MEGACO/Makefile b/examples/sample.source.MEGACO/Makefile index d8a930cec..21009c468 100644 --- a/examples/sample.source.MEGACO/Makefile +++ b/examples/sample.source.MEGACO/Makefile @@ -332,6 +332,7 @@ check: ${TARGET} @echo ================ distclean: clean - rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) + rm -f $(ASN_MODULE_SOURCES) + rm -f $(ASN_MODULE_HEADERS) rm -f $(ASN_CONVERTER_SOURCES) $(ASN_CONVERTER_HEADERS) rm -f Makefile.am.sample diff --git a/examples/sample.source.MHEG5/Makefile b/examples/sample.source.MHEG5/Makefile index b07656a64..cd3e0b65d 100644 --- a/examples/sample.source.MHEG5/Makefile +++ b/examples/sample.source.MHEG5/Makefile @@ -500,6 +500,7 @@ check: ${TARGET} @echo ================ distclean: clean - rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) + rm -f $(ASN_MODULE_SOURCES) + rm -f $(ASN_MODULE_HEADERS) rm -f $(ASN_CONVERTER_SOURCES) $(ASN_CONVERTER_HEADERS) rm -f Makefile.am.sample diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index 8f902b295..203879699 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -392,6 +392,7 @@ check: ${TARGET} @echo ================ distclean: clean - rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) + rm -f $(ASN_MODULE_SOURCES) + rm -f $(ASN_MODULE_HEADERS) rm -f $(ASN_CONVERTER_SOURCES) $(ASN_CONVERTER_HEADERS) rm -f Makefile.am.sample diff --git a/examples/sample.source.TAP3/Makefile b/examples/sample.source.TAP3/Makefile index 3dfb47f7b..65e4a5330 100644 --- a/examples/sample.source.TAP3/Makefile +++ b/examples/sample.source.TAP3/Makefile @@ -726,6 +726,7 @@ check: ${TARGET} @echo ================ distclean: clean - rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) + rm -f $(ASN_MODULE_SOURCES) + rm -f $(ASN_MODULE_HEADERS) rm -f $(ASN_CONVERTER_SOURCES) $(ASN_CONVERTER_HEADERS) rm -f Makefile.am.sample From 13d1c51735361825ad478cc40d516e16fb37c6d1 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 17 Sep 2006 03:53:11 +0000 Subject: [PATCH 1198/1469] description git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1198 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.makefile.regen | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/examples/sample.makefile.regen b/examples/sample.makefile.regen index eb0958f0a..64a3aad57 100755 --- a/examples/sample.makefile.regen +++ b/examples/sample.makefile.regen @@ -1,4 +1,15 @@ #!/bin/sh +# +# This script attempts to compile the given ASN.1 specification and then +# transforms the resulting Makefile.am.sample tailored to that specification +# into a customized Makefile. +# +# The information which is necessary for this script is passed from the +# Makefile which is going to be replaced with an updated Makefile. +# This is called "boot-strapping" and is frequently the source of inside jokes. +# +# $Id$ +# if test -z "$ASN1PDU" \ -o -z "$ASN1MODULES" \ @@ -12,7 +23,7 @@ if test -z "$ASN1PDU" \ exit fi -ASN1PDU=`echo "$ASN1PDU" | tr - _` +ASN1DEFPDU=`echo "$ASN1PDU" | tr - _` ../../asn1c/asn1c -S ../../skeletons ${ASN1CMDOPTS} ${ASN1MODULES} || exit $? @@ -21,33 +32,36 @@ if test ! -f Makefile.am.sample ; then exit 1 fi -EXTRA_CFLAGS="" - -if test -f config.h ; then - EXTRA_CFLAGS="$EXTRA_CFLAGS -DHAVE_CONFIG_H" -fi +CFLAGS="" FIXEDPDU=`echo "[$ASN1CMDOPTS]" | sed -e "s/.*-pdu=auto.*//"` if test ! "$FIXEDPDU" ; then - EXTRA_CFLAGS="$EXTRA_CFLAGS -DASN_PDU_COLLECTION" + CFLAGS="$CFLAGS -DASN_PDU_COLLECTION" +fi + +if test -f config.h ; then + CFLAGS="$CFLAGS -DHAVE_CONFIG_H" fi set -x cat Makefile.am.sample \ - | sed -e "s/^CFLAGS.*/CFLAGS += -I. $EXTRA_CFLAGS -DPDU=${ASN1PDU}/" \ + | sed -e "s/^CFLAGS.*/CFLAGS +=$CFLAGS -DPDU=${ASN1DEFPDU} -I./" \ | sed -e "s/^all: /all: ${ASN1PDU}.c /" \ | sed -e "s/progname/${PROGNAME}/" \ > Makefile.$$ ( echo echo "${ASN1PDU}.c: $0" + echo " make regen-makefile" + echo " @touch ${ASN1PDU}.c" + echo " make" + echo + echo "regen-makefile:" echo " ASN1CMDOPTS=\"${ASN1CMDOPTS}\" \\" echo " ASN1MODULES=\"${ASN1MODULES}\" \\" echo " ASN1PDU=${ASN1PDU} \\" echo " PROGNAME=${PROGNAME} \\" echo " $0" - echo " @touch ${ASN1PDU}.c" - echo " make" echo echo 'check: ${TARGET}' echo " @if test -f ./sample-${ASN1PDU}-1.[db]er ; then \\" From 70c232de00d5332a85c91d29ccc4e8af045d8b83 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 17 Sep 2006 04:01:29 +0000 Subject: [PATCH 1199/1469] proper git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1199 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.makefile.regen | 8 ++++---- examples/sample.source.LDAP3/Makefile | 9 ++++++--- examples/sample.source.MEGACO/Makefile | 9 ++++++--- examples/sample.source.MHEG5/Makefile | 9 ++++++--- examples/sample.source.PKIX1/Makefile | 9 ++++++--- examples/sample.source.RRC/Makefile | 19 +++++++++++-------- examples/sample.source.TAP3/Makefile | 9 ++++++--- 7 files changed, 45 insertions(+), 27 deletions(-) diff --git a/examples/sample.makefile.regen b/examples/sample.makefile.regen index 64a3aad57..f34f0a268 100755 --- a/examples/sample.makefile.regen +++ b/examples/sample.makefile.regen @@ -34,15 +34,15 @@ fi CFLAGS="" +if test -f config.h ; then + CFLAGS="$CFLAGS -DHAVE_CONFIG_H" +fi + FIXEDPDU=`echo "[$ASN1CMDOPTS]" | sed -e "s/.*-pdu=auto.*//"` if test ! "$FIXEDPDU" ; then CFLAGS="$CFLAGS -DASN_PDU_COLLECTION" fi -if test -f config.h ; then - CFLAGS="$CFLAGS -DHAVE_CONFIG_H" -fi - set -x cat Makefile.am.sample \ | sed -e "s/^CFLAGS.*/CFLAGS +=$CFLAGS -DPDU=${ASN1DEFPDU} -I./" \ diff --git a/examples/sample.source.LDAP3/Makefile b/examples/sample.source.LDAP3/Makefile index 7fae0bd66..d75f5692b 100644 --- a/examples/sample.source.LDAP3/Makefile +++ b/examples/sample.source.LDAP3/Makefile @@ -163,7 +163,7 @@ libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) # This file may be used as an input for make(3) # Remove the lines below to convert it into a pure .am file TARGET = ldap3dump -CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=LDAPMessage +CFLAGS += -DHAVE_CONFIG_H -DPDU=LDAPMessage -I. OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} all: LDAPMessage.c $(TARGET) @@ -188,13 +188,16 @@ regenerate-from-asn1-source: LDAPMessage.c: ../sample.makefile.regen + make regen-makefile + @touch LDAPMessage.c + make + +regen-makefile: ASN1CMDOPTS="-fcompound-names" \ ASN1MODULES="../rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1" \ ASN1PDU=LDAPMessage \ PROGNAME=ldap3dump \ ../sample.makefile.regen - @touch LDAPMessage.c - make check: ${TARGET} @if test -f ./sample-LDAPMessage-1.[db]er ; then \ diff --git a/examples/sample.source.MEGACO/Makefile b/examples/sample.source.MEGACO/Makefile index 21009c468..d05f4a450 100644 --- a/examples/sample.source.MEGACO/Makefile +++ b/examples/sample.source.MEGACO/Makefile @@ -285,7 +285,7 @@ libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) # This file may be used as an input for make(3) # Remove the lines below to convert it into a pure .am file TARGET = megacoDump -CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=MegacoMessage +CFLAGS += -DHAVE_CONFIG_H -DPDU=MegacoMessage -I. OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} all: MegacoMessage.c $(TARGET) @@ -310,13 +310,16 @@ regenerate-from-asn1-source: MegacoMessage.c: ../sample.makefile.regen + make regen-makefile + @touch MegacoMessage.c + make + +regen-makefile: ASN1CMDOPTS="-fcompound-names" \ ASN1MODULES="../rfc3525-MEDIA-GATEWAY-CONTROL.asn1" \ ASN1PDU=MegacoMessage \ PROGNAME=megacoDump \ ../sample.makefile.regen - @touch MegacoMessage.c - make check: ${TARGET} @if test -f ./sample-MegacoMessage-1.[db]er ; then \ diff --git a/examples/sample.source.MHEG5/Makefile b/examples/sample.source.MHEG5/Makefile index cd3e0b65d..8eea2448c 100644 --- a/examples/sample.source.MHEG5/Makefile +++ b/examples/sample.source.MHEG5/Makefile @@ -453,7 +453,7 @@ libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) # This file may be used as an input for make(3) # Remove the lines below to convert it into a pure .am file TARGET = mheg5dump -CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=InterchangedObject +CFLAGS += -DHAVE_CONFIG_H -DPDU=InterchangedObject -I. OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} all: InterchangedObject.c $(TARGET) @@ -478,13 +478,16 @@ regenerate-from-asn1-source: InterchangedObject.c: ../sample.makefile.regen + make regen-makefile + @touch InterchangedObject.c + make + +regen-makefile: ASN1CMDOPTS="-fcompound-names" \ ASN1MODULES="../ISO13522-MHEG-5.asn" \ ASN1PDU=InterchangedObject \ PROGNAME=mheg5dump \ ../sample.makefile.regen - @touch InterchangedObject.c - make check: ${TARGET} @if test -f ./sample-InterchangedObject-1.[db]er ; then \ diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index 203879699..c1846abc2 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -345,7 +345,7 @@ libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) # This file may be used as an input for make(3) # Remove the lines below to convert it into a pure .am file TARGET = x509dump -CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=Certificate +CFLAGS += -DHAVE_CONFIG_H -DPDU=Certificate -I. OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} all: Certificate.c $(TARGET) @@ -370,13 +370,16 @@ regenerate-from-asn1-source: Certificate.c: ../sample.makefile.regen + make regen-makefile + @touch Certificate.c + make + +regen-makefile: ASN1CMDOPTS="" \ ASN1MODULES="../rfc3280-*.asn1" \ ASN1PDU=Certificate \ PROGNAME=x509dump \ ../sample.makefile.regen - @touch Certificate.c - make check: ${TARGET} @if test -f ./sample-Certificate-1.[db]er ; then \ diff --git a/examples/sample.source.RRC/Makefile b/examples/sample.source.RRC/Makefile index f44792615..db38e980f 100644 --- a/examples/sample.source.RRC/Makefile +++ b/examples/sample.source.RRC/Makefile @@ -4740,10 +4740,10 @@ libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) # This file may be used as an input for make(3) # Remove the lines below to convert it into a pure .am file TARGET = rrc-dump -CFLAGS += -I. -DHAVE_CONFIG_H -DASN_PDU_COLLECTION -DPDU=DL_DCCH_Message +CFLAGS += -DHAVE_CONFIG_H -DASN_PDU_COLLECTION -DPDU=DL_DCCH_Message -I. OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} -all: DL_DCCH_Message.c $(TARGET) +all: DL-DCCH-Message.c $(TARGET) $(TARGET): ${OBJS} $(CC) $(CFLAGS) -o $(TARGET) ${OBJS} $(LDFLAGS) $(LIBS) @@ -4764,18 +4764,21 @@ regenerate-from-asn1-source: ../../asn1c/asn1c -S ../../skeletons -fcompound-names -pdu=auto -gen-PER ../rrc.asn1 -DL_DCCH_Message.c: ../sample.makefile.regen +DL-DCCH-Message.c: ../sample.makefile.regen + make regen-makefile + @touch DL-DCCH-Message.c + make + +regen-makefile: ASN1CMDOPTS="-fcompound-names -pdu=auto -gen-PER" \ ASN1MODULES="../rrc.asn1" \ - ASN1PDU=DL_DCCH_Message \ + ASN1PDU=DL-DCCH-Message \ PROGNAME=rrc-dump \ ../sample.makefile.regen - @touch DL_DCCH_Message.c - make check: ${TARGET} - @if test -f ./sample-DL_DCCH_Message-1.[db]er ; then \ - for f in ./sample-DL_DCCH_Message-*.[db]er; do \ + @if test -f ./sample-DL-DCCH-Message-1.[db]er ; then \ + for f in ./sample-DL-DCCH-Message-*.[db]er; do \ echo "Recoding $$f into XER and back..."; \ ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$ || exit 2; \ ./${TARGET} -ixer -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ diff --git a/examples/sample.source.TAP3/Makefile b/examples/sample.source.TAP3/Makefile index 65e4a5330..745868887 100644 --- a/examples/sample.source.TAP3/Makefile +++ b/examples/sample.source.TAP3/Makefile @@ -679,7 +679,7 @@ libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) # This file may be used as an input for make(3) # Remove the lines below to convert it into a pure .am file TARGET = tap3dump -CFLAGS += -I. -DHAVE_CONFIG_H -DPDU=DataInterChange +CFLAGS += -DHAVE_CONFIG_H -DPDU=DataInterChange -I. OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} all: DataInterChange.c $(TARGET) @@ -704,13 +704,16 @@ regenerate-from-asn1-source: DataInterChange.c: ../sample.makefile.regen + make regen-makefile + @touch DataInterChange.c + make + +regen-makefile: ASN1CMDOPTS="" \ ASN1MODULES="../tap3.asn1" \ ASN1PDU=DataInterChange \ PROGNAME=tap3dump \ ../sample.makefile.regen - @touch DataInterChange.c - make check: ${TARGET} @if test -f ./sample-DataInterChange-1.[db]er ; then \ From 43c8ac5bf208aee1b363408bbeda02de8381aaa3 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 17 Sep 2006 04:52:50 +0000 Subject: [PATCH 1200/1469] moved -DASN_PDU_COLLECTION into compiler git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1200 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.makefile.regen | 15 +- examples/sample.source.RRC/Makefile | 2 +- libasn1compiler/asn1c_save.c | 3 +- libasn1fix/asn1fix_class.c | 2 +- libasn1fix/asn1fix_constr.c | 2 +- libasn1fix/asn1fix_constraint_compat.c | 8 + libasn1fix/asn1fix_cws.c | 2 +- libasn1fix/asn1fix_misc.c | 2 + libasn1parser/asn1p_constr.c | 2 + libasn1parser/asn1p_constr.h | 3 +- libasn1parser/asn1p_expr.c | 8 +- libasn1parser/asn1p_expr.h | 2 +- libasn1parser/asn1p_module.c | 2 +- libasn1parser/asn1p_module.h | 26 +- libasn1parser/asn1p_value.c | 15 + libasn1parser/asn1p_value.h | 4 + libasn1parser/asn1p_y.c | 2395 ++++++++++++------------ libasn1parser/asn1p_y.h | 2 +- libasn1parser/asn1p_y.y | 177 +- libasn1parser/asn1parser.c | 33 +- libasn1print/asn1print.c | 18 +- 21 files changed, 1402 insertions(+), 1321 deletions(-) diff --git a/examples/sample.makefile.regen b/examples/sample.makefile.regen index f34f0a268..ba0351483 100755 --- a/examples/sample.makefile.regen +++ b/examples/sample.makefile.regen @@ -23,8 +23,6 @@ if test -z "$ASN1PDU" \ exit fi -ASN1DEFPDU=`echo "$ASN1PDU" | tr - _` - ../../asn1c/asn1c -S ../../skeletons ${ASN1CMDOPTS} ${ASN1MODULES} || exit $? if test ! -f Makefile.am.sample ; then @@ -32,20 +30,15 @@ if test ! -f Makefile.am.sample ; then exit 1 fi -CFLAGS="" - +ASN1DEFPDU=`echo "$ASN1PDU" | tr - _` +CFLAGS="-DPDU=${ASN1DEFPDU}" if test -f config.h ; then - CFLAGS="$CFLAGS -DHAVE_CONFIG_H" -fi - -FIXEDPDU=`echo "[$ASN1CMDOPTS]" | sed -e "s/.*-pdu=auto.*//"` -if test ! "$FIXEDPDU" ; then - CFLAGS="$CFLAGS -DASN_PDU_COLLECTION" + CFLAGS="-DHAVE_CONFIG_H $CFLAGS" fi set -x cat Makefile.am.sample \ - | sed -e "s/^CFLAGS.*/CFLAGS +=$CFLAGS -DPDU=${ASN1DEFPDU} -I./" \ + | sed -e "s/^CFLAGS += /CFLAGS += ${CFLAGS} /" \ | sed -e "s/^all: /all: ${ASN1PDU}.c /" \ | sed -e "s/progname/${PROGNAME}/" \ > Makefile.$$ diff --git a/examples/sample.source.RRC/Makefile b/examples/sample.source.RRC/Makefile index db38e980f..717e73425 100644 --- a/examples/sample.source.RRC/Makefile +++ b/examples/sample.source.RRC/Makefile @@ -4740,7 +4740,7 @@ libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) # This file may be used as an input for make(3) # Remove the lines below to convert it into a pure .am file TARGET = rrc-dump -CFLAGS += -DHAVE_CONFIG_H -DASN_PDU_COLLECTION -DPDU=DL_DCCH_Message -I. +CFLAGS += -DHAVE_CONFIG_H -DPDU=DL_DCCH_Message -DASN_PDU_COLLECTION -I. OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} all: DL-DCCH-Message.c $(TARGET) diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c index 3e467afee..06fc97dd8 100644 --- a/libasn1compiler/asn1c_save.c +++ b/libasn1compiler/asn1c_save.c @@ -135,7 +135,7 @@ asn1c_save_compiled_output(arg_t *arg, const char *datadir, "# This file may be used as an input for make(3)\n" "# Remove the lines below to convert it into a pure .am file\n" "TARGET = progname\n" - "CFLAGS += -I.\n" + "CFLAGS +=%s -I.\n" "OBJS=${ASN_MODULE_SOURCES:.c=.o}" " ${ASN_CONVERTER_SOURCES:.c=.o}\n" "\nall: $(TARGET)\n" @@ -150,6 +150,7 @@ asn1c_save_compiled_output(arg_t *arg, const char *datadir, "\n\trm -f $(OBJS)\n" "\nregen: regenerate-from-asn1-source\n" "\nregenerate-from-asn1-source:\n\t" + , (arg->flags & A1C_PDU_AUTO) ? " -DASN_PDU_COLLECTION" : "" ); for(i = 0; i < argc; i++) diff --git a/libasn1fix/asn1fix_class.c b/libasn1fix/asn1fix_class.c index bf3571935..32ad89634 100644 --- a/libasn1fix/asn1fix_class.c +++ b/libasn1fix/asn1fix_class.c @@ -65,7 +65,7 @@ asn1f_class_access(arg_t *arg, asn1p_module_t *mod, asn1p_expr_t *rhs_pspecs, as if(TQ_FIRST(&classfield->members)) { /* Already have something */ } else { - expr = asn1p_expr_new(classfield->_lineno); + expr = asn1p_expr_new(classfield->_lineno, mod); expr->expr_type = ASN_TYPE_ANY; expr->meta_type = AMT_TYPE; asn1p_expr_add(classfield, expr); diff --git a/libasn1fix/asn1fix_constr.c b/libasn1fix/asn1fix_constr.c index 353473d48..0421a52b4 100644 --- a/libasn1fix/asn1fix_constr.c +++ b/libasn1fix/asn1fix_constr.c @@ -152,7 +152,7 @@ asn1f_fix_constr_ext(arg_t *arg) { if(arg->mod->module_flags & MSF_EXTENSIBILITY_IMPLIED && ext_count == 0) { - v = asn1p_expr_new(0); + v = asn1p_expr_new(0, arg->mod); if(v) { v->Identifier = strdup("..."); v->expr_type = A1TC_EXTENSIBLE; diff --git a/libasn1fix/asn1fix_constraint_compat.c b/libasn1fix/asn1fix_constraint_compat.c index 96bd04256..954d5f524 100644 --- a/libasn1fix/asn1fix_constraint_compat.c +++ b/libasn1fix/asn1fix_constraint_compat.c @@ -87,6 +87,14 @@ asn1constraint_compatible(asn1p_expr_type_e expr_type, return 0; case ACT_CT_CTDBY: return 1; + case ACT_CT_CTNG: /* X.682, #11 */ + switch(expr_type) { + case ASN_BASIC_OCTET_STRING: + case ASN_BASIC_BIT_STRING: + return 1; + default: + return 0; + } case ACT_CA_SET: case ACT_CA_CRC: case ACT_CA_CSV: diff --git a/libasn1fix/asn1fix_cws.c b/libasn1fix/asn1fix_cws.c index b54571154..8931a92cf 100644 --- a/libasn1fix/asn1fix_cws.c +++ b/libasn1fix/asn1fix_cws.c @@ -192,7 +192,7 @@ _asn1f_assign_cell_value(arg_t *arg, struct asn1p_ioc_row_s *row, struct asn1p_i FATAL("Value %s at line %d is too large for this compiler! Contact the asn1c author.\n", p, arg->expr->_lineno); return -1; } - expr = asn1p_expr_new(arg->expr->_lineno); + expr = asn1p_expr_new(arg->expr->_lineno, arg->expr->module); expr->Identifier = p; expr->meta_type = AMT_VALUE; expr->expr_type = ASN_BASIC_INTEGER; diff --git a/libasn1fix/asn1fix_misc.c b/libasn1fix/asn1fix_misc.c index 4af0fd8c5..69d08bd62 100644 --- a/libasn1fix/asn1fix_misc.c +++ b/libasn1fix/asn1fix_misc.c @@ -81,6 +81,8 @@ asn1f_printable_value(asn1p_value_t *v) { /* Buffer is guaranteed to be null-terminated */ assert(v->value.string.buf[v->value.string.size] == '\0'); return (char *)v->value.string.buf; + case ATV_TYPE: + return ""; case ATV_BITVECTOR: { uint8_t *bitvector; diff --git a/libasn1parser/asn1p_constr.c b/libasn1parser/asn1p_constr.c index 7aa464ee2..ee8d1ebf1 100644 --- a/libasn1parser/asn1p_constr.c +++ b/libasn1parser/asn1p_constr.c @@ -169,6 +169,8 @@ asn1p_constraint_type2str(enum asn1p_constraint_type_e type) { return "MultipleTypeConstraints"; case ACT_CT_CTDBY: return "UserDefinedConstraint"; + case ACT_CT_CTNG: + return "ContentsConstraint"; case ACT_CA_SET: return "SET"; case ACT_CA_CRC: diff --git a/libasn1parser/asn1p_constr.h b/libasn1parser/asn1p_constr.h index 912fd8f70..bb6ba327e 100644 --- a/libasn1parser/asn1p_constr.h +++ b/libasn1parser/asn1p_constr.h @@ -26,11 +26,12 @@ typedef struct asn1p_constraint_s { ACT_CT_WCOMP, /* WITH COMPONENT */ ACT_CT_WCOMPS, /* WITH COMPONENTS */ ACT_CT_CTDBY, /* CONSTRAINED BY */ + ACT_CT_CTNG, /* CONTAINING Type */ /* * Arrays of constraints. */ ACT_CA_SET, /* A set of constraints: (c1)(c2) */ - ACT_CA_CRC, /* Comp. relation c-t: ({a})({@b}) */ + ACT_CA_CRC, /* Comp. relation c-t: ({a}{@b}) */ ACT_CA_CSV, /* Comma-separated constraints array */ ACT_CA_UNI, /* UNION (|) */ ACT_CA_INT, /* INTERSECTION (^) */ diff --git a/libasn1parser/asn1p_expr.c b/libasn1parser/asn1p_expr.c index 29919a148..8760066d6 100644 --- a/libasn1parser/asn1p_expr.c +++ b/libasn1parser/asn1p_expr.c @@ -13,13 +13,14 @@ static asn1p_value_t *value_resolver(asn1p_value_t *, void *arg); * Construct a new empty types collection. */ asn1p_expr_t * -asn1p_expr_new(int _lineno) { +asn1p_expr_new(int _lineno, asn1p_module_t *mod) { asn1p_expr_t *expr; expr = calloc(1, sizeof *expr); if(expr) { TQ_INIT(&(expr->members)); expr->spec_index = -1; + expr->module = mod; expr->_lineno = _lineno; } @@ -96,7 +97,7 @@ asn1p_expr_clone_impl(asn1p_expr_t *expr, int skip_extensions, asn1p_expr_t *(*r return NULL; /* Hard error */ } } - if(!clone) clone = asn1p_expr_new(expr->_lineno); + if(!clone) clone = asn1p_expr_new(expr->_lineno, expr->module); if(!clone) return NULL; /* @@ -106,7 +107,6 @@ asn1p_expr_clone_impl(asn1p_expr_t *expr, int skip_extensions, asn1p_expr_t *(*r CLCOPY(expr_type); CLCOPY(tag); CLCOPY(marker.flags); /* OPTIONAL/DEFAULT */ - CLCOPY(module); CLCOPY(_mark); clone->data = 0; /* Do not clone this */ @@ -165,7 +165,7 @@ value_resolver(asn1p_value_t *value, void *rarg) { } ref = value->value.reference; - tmpexpr = asn1p_expr_new(ref->_lineno); + tmpexpr = asn1p_expr_new(ref->_lineno, 0); tmpexpr->meta_type = AMT_TYPEREF; tmpexpr->expr_type = A1TC_REFERENCE; tmpexpr->reference = ref; diff --git a/libasn1parser/asn1p_expr.h b/libasn1parser/asn1p_expr.h index 32645efc4..babe53f55 100644 --- a/libasn1parser/asn1p_expr.h +++ b/libasn1parser/asn1p_expr.h @@ -271,7 +271,7 @@ typedef struct asn1p_expr_s { /* * Constructor and destructor. */ -asn1p_expr_t *asn1p_expr_new(int _lineno); +asn1p_expr_t *asn1p_expr_new(int _lineno, struct asn1p_module_s *); asn1p_expr_t *asn1p_expr_clone(asn1p_expr_t *, int skip_extensions); asn1p_expr_t *asn1p_expr_clone_with_resolver(asn1p_expr_t *, asn1p_expr_t *(*resolver)(asn1p_expr_t *to_resolve, void *resolver_arg), diff --git a/libasn1parser/asn1p_module.c b/libasn1parser/asn1p_module.c index 8a47df667..d030da786 100644 --- a/libasn1parser/asn1p_module.c +++ b/libasn1parser/asn1p_module.c @@ -12,8 +12,8 @@ asn1p_module_new() { mod = calloc(1, sizeof *mod); if(mod) { - TQ_INIT(&(mod->imports)); TQ_INIT(&(mod->exports)); + TQ_INIT(&(mod->imports)); TQ_INIT(&(mod->members)); } return mod; diff --git a/libasn1parser/asn1p_module.h b/libasn1parser/asn1p_module.h index ad9eab04e..25dcf1e7e 100644 --- a/libasn1parser/asn1p_module.h +++ b/libasn1parser/asn1p_module.h @@ -4,6 +4,18 @@ #ifndef ASN1_PARSER_MODULE_H #define ASN1_PARSER_MODULE_H +struct asn1p_module_s; + +/* + * A simple container for several modules. + */ +typedef struct asn1p_s { + TQ_HEAD(struct asn1p_module_s) modules; +} asn1p_t; + +asn1p_t *asn1p_new(void); +void asn1p_delete(asn1p_t *asn); + /* * Flags specific to a module. */ @@ -71,6 +83,9 @@ typedef struct asn1p_module_s { TQ_ENTRY(struct asn1p_module_s) mod_next; + /* All modules */ + asn1p_t *asn1p; + /* * Internally useful properties. */ @@ -85,15 +100,4 @@ typedef struct asn1p_module_s { asn1p_module_t *asn1p_module_new(void); void asn1p_module_free(asn1p_module_t *mod); -/* - * No more than a container for several modules. - */ -typedef struct asn1p_s { - TQ_HEAD(struct asn1p_module_s) modules; -} asn1p_t; - -asn1p_t *asn1p_new(void); -void asn1p_delete(asn1p_t *asn); - - #endif /* ASN1_PARSER_MODULE_H */ diff --git a/libasn1parser/asn1p_value.c b/libasn1parser/asn1p_value.c index cafc1f936..63c80c7e9 100644 --- a/libasn1parser/asn1p_value.c +++ b/libasn1parser/asn1p_value.c @@ -132,6 +132,16 @@ asn1p_value_fromint(asn1c_integer_t i) { return v; } +asn1p_value_t * +asn1p_value_fromtype(asn1p_expr_t *expr) { + asn1p_value_t *v = calloc(1, sizeof *v); + if(v) { + v->value.v_type = expr; + v->type = ATV_TYPE; + } + return v; +} + asn1p_value_t * asn1p_value_clone(asn1p_value_t *v) { return asn1p_value_clone_with_resolver(v, 0, 0); @@ -149,6 +159,8 @@ asn1p_value_clone_with_resolver(asn1p_value_t *v, return calloc(1, sizeof(*clone)); case ATV_REAL: return asn1p_value_fromdouble(v->value.v_double); + case ATV_TYPE: + return asn1p_value_fromtype(v->value.v_type); case ATV_INTEGER: case ATV_MIN: case ATV_MAX: @@ -213,6 +225,9 @@ asn1p_value_free(asn1p_value_t *v) { case ATV_NOVALUE: case ATV_NULL: break; + case ATV_TYPE: + asn1p_expr_free(v->value.v_type); + break; case ATV_REAL: case ATV_INTEGER: case ATV_MIN: diff --git a/libasn1parser/asn1p_value.h b/libasn1parser/asn1p_value.h index 1b5bbeec4..c260c27e3 100644 --- a/libasn1parser/asn1p_value.h +++ b/libasn1parser/asn1p_value.h @@ -5,6 +5,7 @@ #define ASN1_PARSER_VALUE_H struct asn1p_constraint_s; /* Forward declaration */ +struct asn1p_expr_s; /* * A wrapper around various kinds of values. @@ -15,6 +16,7 @@ typedef struct asn1p_value_s { */ enum { ATV_NOVALUE, + ATV_TYPE, /* A type (as in CONTAINING Type) */ ATV_NULL, /* A "NULL" value of type NULL. */ ATV_REAL, /* A constant floating-point value */ ATV_INTEGER, /* An integer constant */ @@ -34,6 +36,7 @@ typedef struct asn1p_value_s { union { struct asn1p_constraint_s *constraint; /* ValueSet */ + struct asn1p_expr_s *v_type; /* Type */ asn1p_ref_t *reference; asn1c_integer_t v_integer; double v_double; @@ -68,6 +71,7 @@ asn1p_value_t *asn1p_value_frombits(uint8_t *bits, int size_in_bits, int dc); asn1p_value_t *asn1p_value_frombuf(char *buffer, int size, int do_copy); asn1p_value_t *asn1p_value_fromdouble(double); asn1p_value_t *asn1p_value_fromint(asn1c_integer_t); +asn1p_value_t *asn1p_value_fromtype(struct asn1p_expr_s *); asn1p_value_t *asn1p_value_clone(asn1p_value_t *); asn1p_value_t *asn1p_value_clone_with_resolver(asn1p_value_t *, asn1p_value_t *(*resolver)(asn1p_value_t *, void *rarg), diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index d1105a53f..95195962f 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -312,6 +312,9 @@ static struct AssignedIdentifier *saved_aid; static asn1p_value_t *_convert_bitstring2binary(char *str, int base); static void _fixup_anonymous_identifier(asn1p_expr_t *expr); +static asn1p_module_t *currentModule; +#define NEW_EXPR() (asn1p_expr_new(yylineno, currentModule)) + #define checkmem(ptr) do { \ if(!(ptr)) \ return yyerror("Memory failure"); \ @@ -365,7 +368,7 @@ static void _fixup_anonymous_identifier(asn1p_expr_t *expr); #endif #ifndef YYSTYPE -#line 85 "asn1p_y.y" +#line 88 "asn1p_y.y" typedef union { asn1p_t *a_grammar; asn1p_module_flags_e a_module_flags; @@ -401,7 +404,7 @@ typedef union { } tv_nametag; } yystype; /* Line 193 of /usr/local/share/bison/yacc.c. */ -#line 405 "asn1p_y.c" +#line 408 "asn1p_y.c" # define YYSTYPE yystype # define YYSTYPE_IS_TRIVIAL 1 #endif @@ -422,7 +425,7 @@ typedef struct yyltype /* Line 213 of /usr/local/share/bison/yacc.c. */ -#line 426 "asn1p_y.c" +#line 429 "asn1p_y.c" #if ! defined (yyoverflow) || YYERROR_VERBOSE @@ -520,16 +523,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 7 -#define YYLAST 816 +#define YYLAST 834 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 121 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 112 +#define YYNNTS 117 /* YYNRULES -- Number of rules. */ -#define YYNRULES 296 +#define YYNRULES 302 /* YYNRULES -- Number of states. */ -#define YYNSTATES 453 +#define YYNSTATES 462 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 @@ -585,160 +588,163 @@ static const unsigned char yytranslate[] = YYRHS. */ static const unsigned short yyprhs[] = { - 0, 0, 3, 5, 7, 10, 19, 20, 22, 26, - 29, 31, 34, 36, 41, 43, 44, 46, 48, 51, - 54, 57, 60, 63, 66, 67, 69, 73, 75, 78, - 80, 82, 84, 85, 89, 91, 92, 94, 98, 101, - 103, 106, 107, 109, 114, 116, 120, 122, 126, 128, - 129, 131, 135, 139, 142, 144, 148, 150, 154, 156, - 160, 165, 167, 169, 174, 178, 182, 189, 196, 198, - 202, 204, 208, 212, 216, 220, 222, 226, 228, 230, - 232, 234, 235, 237, 239, 243, 247, 250, 254, 256, - 258, 262, 265, 267, 269, 275, 276, 278, 280, 284, - 287, 292, 296, 300, 304, 308, 312, 313, 315, 316, - 323, 325, 328, 330, 332, 334, 338, 340, 344, 348, - 352, 353, 356, 358, 363, 368, 373, 380, 387, 389, - 394, 398, 400, 404, 408, 412, 414, 418, 420, 424, - 426, 428, 430, 432, 436, 440, 442, 447, 449, 451, - 455, 456, 460, 462, 464, 466, 468, 470, 472, 474, - 476, 480, 482, 484, 486, 488, 491, 493, 495, 497, - 499, 502, 505, 507, 509, 512, 515, 517, 519, 521, - 523, 525, 528, 530, 533, 535, 537, 539, 541, 543, + 0, 0, 3, 5, 7, 10, 11, 21, 22, 24, + 28, 31, 33, 36, 38, 43, 45, 46, 48, 50, + 53, 56, 59, 62, 65, 68, 69, 71, 75, 77, + 80, 82, 84, 86, 87, 91, 93, 94, 96, 100, + 103, 105, 108, 109, 111, 116, 118, 122, 124, 128, + 130, 131, 133, 137, 141, 144, 146, 150, 152, 156, + 158, 162, 167, 169, 171, 176, 180, 184, 191, 198, + 200, 204, 206, 210, 214, 218, 222, 224, 228, 230, + 232, 234, 236, 237, 239, 241, 245, 249, 252, 256, + 258, 260, 264, 267, 269, 271, 277, 278, 280, 282, + 286, 289, 294, 298, 302, 306, 310, 314, 315, 317, + 318, 325, 327, 330, 332, 334, 336, 340, 342, 346, + 350, 354, 355, 358, 360, 365, 370, 375, 382, 389, + 391, 396, 400, 402, 406, 410, 414, 416, 420, 422, + 426, 428, 430, 432, 434, 438, 442, 444, 449, 451, + 453, 457, 458, 462, 464, 466, 468, 470, 472, 474, + 476, 478, 482, 484, 486, 488, 490, 493, 495, 497, + 499, 501, 504, 507, 509, 511, 514, 517, 519, 521, + 523, 525, 527, 530, 532, 535, 537, 539, 541, 543, 545, 547, 549, 551, 553, 555, 557, 559, 561, 563, - 565, 567, 569, 571, 572, 574, 576, 581, 585, 590, - 592, 594, 598, 604, 606, 610, 614, 618, 622, 627, - 631, 633, 635, 639, 643, 647, 651, 653, 655, 656, - 662, 664, 667, 670, 674, 676, 678, 680, 682, 684, - 686, 688, 690, 694, 700, 702, 706, 708, 712, 713, - 715, 717, 719, 721, 723, 725, 729, 734, 736, 740, - 743, 747, 749, 753, 754, 756, 758, 761, 764, 768, - 770, 774, 776, 781, 786, 788, 790, 792, 794, 796, - 798, 799, 801, 804, 809, 810, 812, 814, 816, 817, - 819, 821, 823, 825, 827, 828, 830 + 565, 567, 569, 571, 573, 574, 576, 578, 582, 584, + 589, 593, 598, 600, 602, 606, 612, 614, 618, 622, + 626, 630, 635, 639, 641, 643, 647, 651, 655, 659, + 661, 663, 665, 667, 669, 671, 673, 675, 677, 681, + 687, 689, 693, 695, 699, 700, 702, 704, 706, 708, + 710, 712, 714, 715, 721, 724, 726, 729, 732, 736, + 738, 740, 744, 749, 751, 755, 758, 762, 764, 768, + 769, 771, 773, 776, 779, 783, 785, 789, 791, 796, + 801, 803, 805, 807, 809, 811, 813, 814, 816, 819, + 824, 825, 827, 829, 831, 832, 834, 836, 838, 840, + 842, 843, 845 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const short yyrhs[] = { 122, 0, -1, 123, -1, 124, -1, 123, 124, -1, - 229, 125, 39, 129, 3, 26, 132, 44, -1, -1, - 126, -1, 108, 127, 109, -1, 108, 109, -1, 128, - -1, 127, 128, -1, 232, -1, 232, 110, 10, 111, - -1, 10, -1, -1, 130, -1, 131, -1, 130, 131, - -1, 46, 89, -1, 57, 89, -1, 25, 89, -1, - 48, 58, -1, 16, 62, -1, -1, 133, -1, 144, - 137, 134, -1, 135, -1, 134, 135, -1, 151, -1, - 181, -1, 149, -1, -1, 43, 16, 136, -1, 191, - -1, -1, 138, -1, 59, 139, 112, -1, 59, 51, - -1, 141, -1, 139, 141, -1, -1, 126, -1, 142, - 51, 229, 140, -1, 143, -1, 142, 113, 143, -1, - 229, -1, 229, 108, 109, -1, 232, -1, -1, 145, - -1, 47, 146, 112, -1, 47, 22, 112, -1, 47, - 112, -1, 147, -1, 146, 113, 147, -1, 229, -1, - 229, 108, 109, -1, 232, -1, 108, 198, 109, -1, - 229, 150, 3, 148, -1, 190, -1, 175, -1, 175, - 108, 154, 109, -1, 229, 3, 171, -1, 229, 3, - 161, -1, 229, 108, 152, 109, 3, 171, -1, 229, - 108, 152, 109, 3, 161, -1, 153, -1, 152, 113, - 153, -1, 229, -1, 229, 114, 232, -1, 229, 114, - 229, -1, 188, 114, 232, -1, 188, 114, 229, -1, - 155, -1, 154, 113, 155, -1, 171, -1, 184, -1, - 232, -1, 148, -1, -1, 157, -1, 158, -1, 157, - 113, 158, -1, 232, 171, 217, -1, 171, 217, -1, - 35, 73, 171, -1, 170, -1, 160, -1, 159, 113, - 160, -1, 232, 171, -1, 170, -1, 171, -1, 33, - 108, 163, 109, 165, -1, -1, 93, -1, 164, -1, - 163, 113, 164, -1, 17, 217, -1, 18, 171, 162, - 217, -1, 18, 179, 217, -1, 18, 180, 217, -1, - 17, 179, 217, -1, 17, 171, 217, -1, 17, 180, - 217, -1, -1, 166, -1, -1, 100, 87, 108, 167, - 168, 109, -1, 169, -1, 168, 169, -1, 4, -1, - 19, -1, 178, -1, 115, 168, 116, -1, 107, -1, - 107, 117, 185, -1, 107, 117, 222, -1, 224, 173, - 195, -1, -1, 172, 174, -1, 150, -1, 32, 108, - 159, 109, -1, 83, 108, 156, 109, -1, 84, 108, - 156, 109, -1, 83, 195, 73, 231, 224, 173, -1, - 84, 195, 73, 231, 224, 173, -1, 23, -1, 23, - 40, 30, 232, -1, 61, 73, 175, -1, 15, -1, - 15, 118, 229, -1, 230, 118, 229, -1, 15, 118, - 232, -1, 230, -1, 230, 118, 176, -1, 177, -1, - 176, 118, 177, -1, 178, -1, 17, -1, 18, -1, - 17, -1, 179, 118, 17, -1, 179, 118, 18, -1, - 16, -1, 232, 150, 3, 182, -1, 184, -1, 185, - -1, 232, 114, 182, -1, -1, 108, 183, 187, -1, - 68, -1, 50, -1, 91, -1, 6, -1, 8, -1, - 186, -1, 222, -1, 232, -1, 229, 118, 232, -1, - 7, -1, 13, -1, 14, -1, 5, -1, 187, 5, - -1, 29, -1, 68, -1, 81, -1, 189, -1, 72, - 86, -1, 70, 56, -1, 82, -1, 49, -1, 41, - 76, -1, 31, 86, -1, 96, -1, 52, -1, 191, - -1, 63, -1, 45, -1, 27, 86, -1, 188, -1, - 189, 219, -1, 28, -1, 53, -1, 54, -1, 55, - -1, 64, -1, 69, -1, 79, -1, 88, -1, 90, - -1, 95, -1, 97, -1, 98, -1, 99, -1, 71, - -1, 104, -1, 105, -1, 102, -1, 103, -1, 101, - -1, -1, 196, -1, 197, -1, 85, 110, 198, 111, - -1, 110, 198, 111, -1, 197, 110, 198, 111, -1, - 107, -1, 199, -1, 199, 113, 107, -1, 199, 113, - 107, 113, 199, -1, 200, -1, 22, 101, 200, -1, - 199, 192, 200, -1, 199, 193, 200, -1, 200, 194, - 200, -1, 203, 110, 198, 111, -1, 110, 198, 111, - -1, 204, -1, 205, -1, 204, 202, 204, -1, 66, - 202, 204, -1, 204, 202, 65, -1, 66, 202, 65, - -1, 211, -1, 206, -1, -1, 36, 30, 108, 201, - 187, -1, 106, -1, 106, 119, -1, 119, 106, -1, - 119, 106, 119, -1, 85, -1, 51, -1, 50, -1, - 91, -1, 223, -1, 186, -1, 232, -1, 229, -1, - 100, 34, 197, -1, 100, 35, 108, 207, 109, -1, - 208, -1, 207, 113, 208, -1, 107, -1, 232, 195, - 209, -1, -1, 210, -1, 78, -1, 20, -1, 74, - -1, 212, -1, 213, -1, 108, 229, 109, -1, 212, - 108, 214, 109, -1, 215, -1, 214, 113, 215, -1, - 120, 216, -1, 120, 118, 216, -1, 232, -1, 216, - 118, 232, -1, -1, 218, -1, 74, -1, 38, 182, - -1, 108, 109, -1, 108, 220, 109, -1, 221, -1, - 220, 113, 221, -1, 232, -1, 232, 110, 222, 111, - -1, 232, 110, 185, 111, -1, 222, -1, 107, -1, - 10, -1, 11, -1, 222, -1, 12, -1, -1, 225, - -1, 226, 228, -1, 115, 227, 10, 116, -1, -1, - 94, -1, 24, -1, 80, -1, -1, 57, -1, 46, - -1, 15, -1, 16, -1, 16, -1, -1, 232, -1, - 9, -1 + -1, 234, 125, 126, 39, 130, 3, 26, 133, 44, + -1, -1, 127, -1, 108, 128, 109, -1, 108, 109, + -1, 129, -1, 128, 129, -1, 237, -1, 237, 110, + 10, 111, -1, 10, -1, -1, 131, -1, 132, -1, + 131, 132, -1, 46, 89, -1, 57, 89, -1, 25, + 89, -1, 48, 58, -1, 16, 62, -1, -1, 134, + -1, 145, 138, 135, -1, 136, -1, 135, 136, -1, + 152, -1, 182, -1, 150, -1, -1, 43, 16, 137, + -1, 192, -1, -1, 139, -1, 59, 140, 112, -1, + 59, 51, -1, 142, -1, 140, 142, -1, -1, 127, + -1, 143, 51, 234, 141, -1, 144, -1, 143, 113, + 144, -1, 234, -1, 234, 108, 109, -1, 237, -1, + -1, 146, -1, 47, 147, 112, -1, 47, 22, 112, + -1, 47, 112, -1, 148, -1, 147, 113, 148, -1, + 234, -1, 234, 108, 109, -1, 237, -1, 108, 200, + 109, -1, 234, 151, 3, 149, -1, 191, -1, 176, + -1, 176, 108, 155, 109, -1, 234, 3, 172, -1, + 234, 3, 162, -1, 234, 108, 153, 109, 3, 172, + -1, 234, 108, 153, 109, 3, 162, -1, 154, -1, + 153, 113, 154, -1, 234, -1, 234, 114, 237, -1, + 234, 114, 234, -1, 189, 114, 237, -1, 189, 114, + 234, -1, 156, -1, 155, 113, 156, -1, 172, -1, + 185, -1, 237, -1, 149, -1, -1, 158, -1, 159, + -1, 158, 113, 159, -1, 237, 172, 222, -1, 172, + 222, -1, 35, 73, 172, -1, 171, -1, 161, -1, + 160, 113, 161, -1, 237, 172, -1, 171, -1, 172, + -1, 33, 108, 164, 109, 166, -1, -1, 93, -1, + 165, -1, 164, 113, 165, -1, 17, 222, -1, 18, + 172, 163, 222, -1, 18, 180, 222, -1, 18, 181, + 222, -1, 17, 180, 222, -1, 17, 172, 222, -1, + 17, 181, 222, -1, -1, 167, -1, -1, 100, 87, + 108, 168, 169, 109, -1, 170, -1, 169, 170, -1, + 4, -1, 19, -1, 179, -1, 115, 169, 116, -1, + 107, -1, 107, 117, 186, -1, 107, 117, 227, -1, + 229, 174, 196, -1, -1, 173, 175, -1, 151, -1, + 32, 108, 160, 109, -1, 83, 108, 157, 109, -1, + 84, 108, 157, 109, -1, 83, 196, 73, 236, 229, + 174, -1, 84, 196, 73, 236, 229, 174, -1, 23, + -1, 23, 40, 30, 237, -1, 61, 73, 176, -1, + 15, -1, 15, 118, 234, -1, 235, 118, 234, -1, + 15, 118, 237, -1, 235, -1, 235, 118, 177, -1, + 178, -1, 177, 118, 178, -1, 179, -1, 17, -1, + 18, -1, 17, -1, 180, 118, 17, -1, 180, 118, + 18, -1, 16, -1, 237, 151, 3, 183, -1, 185, + -1, 186, -1, 237, 114, 183, -1, -1, 108, 184, + 188, -1, 68, -1, 50, -1, 91, -1, 6, -1, + 8, -1, 187, -1, 227, -1, 237, -1, 234, 118, + 237, -1, 7, -1, 13, -1, 14, -1, 5, -1, + 188, 5, -1, 29, -1, 68, -1, 81, -1, 190, + -1, 72, 86, -1, 70, 56, -1, 82, -1, 49, + -1, 41, 76, -1, 31, 86, -1, 96, -1, 52, + -1, 192, -1, 63, -1, 45, -1, 27, 86, -1, + 189, -1, 190, 224, -1, 28, -1, 53, -1, 54, + -1, 55, -1, 64, -1, 69, -1, 79, -1, 88, + -1, 90, -1, 95, -1, 97, -1, 98, -1, 99, + -1, 71, -1, 104, -1, 105, -1, 102, -1, 103, + -1, 101, -1, -1, 197, -1, 198, -1, 110, 211, + 111, -1, 199, -1, 85, 110, 200, 111, -1, 110, + 200, 111, -1, 199, 110, 200, 111, -1, 107, -1, + 201, -1, 201, 113, 107, -1, 201, 113, 107, 113, + 201, -1, 202, -1, 22, 101, 202, -1, 201, 193, + 202, -1, 201, 194, 202, -1, 202, 195, 202, -1, + 203, 110, 200, 111, -1, 110, 200, 111, -1, 204, + -1, 205, -1, 204, 215, 204, -1, 66, 215, 204, + -1, 204, 215, 65, -1, 66, 215, 65, -1, 206, + -1, 85, -1, 51, -1, 50, -1, 91, -1, 228, + -1, 187, -1, 237, -1, 234, -1, 100, 34, 199, + -1, 100, 35, 108, 207, 109, -1, 208, -1, 207, + 113, 208, -1, 107, -1, 237, 196, 209, -1, -1, + 210, -1, 78, -1, 20, -1, 74, -1, 212, -1, + 216, -1, 214, -1, -1, 36, 30, 108, 213, 188, + -1, 37, 172, -1, 106, -1, 106, 119, -1, 119, + 106, -1, 119, 106, 119, -1, 217, -1, 218, -1, + 108, 234, 109, -1, 217, 108, 219, 109, -1, 220, + -1, 219, 113, 220, -1, 120, 221, -1, 120, 118, + 221, -1, 237, -1, 221, 118, 237, -1, -1, 223, + -1, 74, -1, 38, 183, -1, 108, 109, -1, 108, + 225, 109, -1, 226, -1, 225, 113, 226, -1, 237, + -1, 237, 110, 227, 111, -1, 237, 110, 186, 111, + -1, 227, -1, 107, -1, 10, -1, 11, -1, 227, + -1, 12, -1, -1, 230, -1, 231, 233, -1, 115, + 232, 10, 116, -1, -1, 94, -1, 24, -1, 80, + -1, -1, 57, -1, 46, -1, 15, -1, 16, -1, + 16, -1, -1, 237, -1, 9, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const unsigned short yyrline[] = { - 0, 342, 342, 348, 354, 370, 395, 397, 400, 404, - 409, 416, 424, 429, 433, 442, 444, 452, 456, 464, - 468, 471, 474, 478, 498, 500, 508, 517, 521, 536, - 544, 557, 565, 564, 578, 590, 592, 594, 605, 610, - 616, 622, 624, 627, 638, 644, 650, 657, 663, 672, - 674, 685, 689, 692, 699, 705, 711, 718, 724, 733, - 735, 745, 759, 769, 785, 795, 811, 817, 824, 834, - 844, 849, 856, 863, 871, 881, 887, 893, 897, 905, - 916, 938, 940, 942, 948, 954, 962, 968, 975, 980, - 986, 992, 998, 1001, 1007, 1017, 1019, 1022, 1030, 1037, - 1050, 1061, 1071, 1082, 1092, 1103, 1114, 1116, 1123, 1121, - 1130, 1135, 1141, 1146, 1149, 1153, 1158, 1167, 1176, 1187, - 1209, 1216, 1235, 1239, 1245, 1251, 1257, 1267, 1277, 1283, - 1294, 1308, 1317, 1327, 1337, 1347, 1355, 1376, 1385, 1394, - 1396, 1403, 1410, 1416, 1420, 1426, 1446, 1456, 1458, 1459, - 1466, 1466, 1471, 1478, 1484, 1489, 1493, 1497, 1500, 1505, - 1517, 1534, 1539, 1544, 1577, 1587, 1601, 1603, 1604, 1605, - 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1620, - 1622, 1623, 1626, 1633, 1645, 1647, 1651, 1655, 1656, 1657, - 1658, 1659, 1663, 1664, 1665, 1666, 1670, 1671, 1678, 1678, - 1679, 1679, 1680, 1682, 1684, 1689, 1693, 1702, 1706, 1711, - 1716, 1719, 1725, 1735, 1739, 1742, 1745, 1748, 1753, 1762, - 1770, 1776, 1782, 1789, 1797, 1805, 1814, 1817, 1821, 1820, - 1831, 1833, 1834, 1835, 1838, 1842, 1847, 1853, 1858, 1859, - 1860, 1873, 1887, 1891, 1896, 1900, 1905, 1912, 1925, 1927, - 1930, 1934, 1937, 1942, 1946, 1954, 1969, 1975, 1982, 1995, - 2007, 2022, 2026, 2043, 2048, 2051, 2056, 2078, 2083, 2088, - 2094, 2100, 2108, 2116, 2124, 2131, 2141, 2146, 2152, 2154, - 2184, 2186, 2189, 2196, 2202, 2204, 2205, 2206, 2209, 2211, - 2212, 2215, 2220, 2227, 2234, 2236, 2241 + 0, 349, 349, 355, 361, 378, 377, 406, 408, 411, + 415, 420, 427, 435, 440, 444, 453, 455, 463, 467, + 475, 479, 482, 485, 489, 509, 511, 519, 528, 532, + 547, 555, 568, 576, 575, 589, 601, 603, 605, 616, + 621, 627, 633, 635, 638, 649, 655, 661, 668, 674, + 683, 685, 696, 700, 703, 710, 716, 722, 729, 735, + 744, 746, 756, 770, 780, 796, 806, 822, 828, 835, + 845, 855, 860, 867, 874, 882, 892, 898, 904, 908, + 916, 927, 949, 951, 953, 959, 965, 973, 979, 986, + 991, 997, 1003, 1009, 1012, 1018, 1028, 1030, 1033, 1041, + 1048, 1061, 1072, 1082, 1093, 1103, 1114, 1125, 1127, 1134, + 1132, 1141, 1146, 1152, 1157, 1160, 1164, 1169, 1178, 1187, + 1198, 1220, 1227, 1246, 1250, 1256, 1262, 1268, 1278, 1288, + 1294, 1305, 1319, 1328, 1338, 1348, 1358, 1366, 1387, 1396, + 1405, 1407, 1414, 1421, 1427, 1431, 1437, 1457, 1467, 1469, + 1470, 1477, 1477, 1482, 1489, 1495, 1500, 1504, 1508, 1511, + 1516, 1528, 1545, 1550, 1555, 1588, 1598, 1612, 1614, 1615, + 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1625, + 1631, 1633, 1634, 1637, 1644, 1656, 1658, 1662, 1666, 1667, + 1668, 1669, 1670, 1674, 1675, 1676, 1677, 1681, 1682, 1689, + 1689, 1690, 1690, 1691, 1693, 1695, 1700, 1702, 1707, 1711, + 1720, 1724, 1729, 1734, 1737, 1743, 1753, 1757, 1760, 1763, + 1766, 1771, 1780, 1788, 1794, 1800, 1807, 1815, 1823, 1832, + 1837, 1841, 1846, 1852, 1857, 1858, 1859, 1872, 1886, 1890, + 1895, 1899, 1904, 1911, 1924, 1926, 1929, 1933, 1936, 1943, + 1945, 1946, 1951, 1949, 1961, 1969, 1971, 1972, 1973, 1975, + 1979, 1987, 2002, 2008, 2015, 2028, 2040, 2055, 2059, 2076, + 2081, 2084, 2089, 2111, 2116, 2121, 2127, 2133, 2141, 2149, + 2157, 2164, 2174, 2179, 2185, 2187, 2217, 2219, 2222, 2229, + 2235, 2237, 2238, 2239, 2242, 2244, 2245, 2248, 2253, 2260, + 2267, 2269, 2274 }; #endif @@ -775,11 +781,11 @@ static const char *const yytname[] = "TOK_EXCEPT", "'^'", "TOK_INTERSECTION", "'|'", "TOK_UNION", "TOK_TwoDots", "TOK_ThreeDots", "'{'", "'}'", "'('", "')'", "';'", "','", "':'", "'['", "']'", "'!'", "'.'", "'<'", "'@'", "$accept", - "ParsedGrammar", "ModuleList", "ModuleDefinition", + "ParsedGrammar", "ModuleList", "ModuleDefinition", "@1", "optObjectIdentifier", "ObjectIdentifier", "ObjectIdentifierBody", "ObjectIdentifierElement", "optModuleDefinitionFlags", "ModuleDefinitionFlags", "ModuleDefinitionFlag", "optModuleBody", - "ModuleBody", "AssignmentList", "Assignment", "@1", "optImports", + "ModuleBody", "AssignmentList", "Assignment", "@2", "optImports", "ImportsDefinition", "ImportsBundleSet", "AssignedIdentifier", "ImportsBundle", "ImportsList", "ImportsElement", "optExports", "ExportsDefinition", "ExportsBody", "ExportsElement", "ValueSet", @@ -788,20 +794,21 @@ static const char *const yytname[] = "ActualParameter", "optComponentTypeLists", "ComponentTypeLists", "ComponentType", "AlternativeTypeLists", "AlternativeType", "ObjectClass", "optUnique", "FieldSpec", "ClassField", "optWithSyntax", - "WithSyntax", "@2", "WithSyntaxList", "WithSyntaxToken", + "WithSyntax", "@3", "WithSyntaxList", "WithSyntaxToken", "ExtensionAndException", "Type", "NSTD_IndirectMarker", "TypeDeclaration", "TypeDeclarationSet", "ComplexTypeReference", "ComplexTypeReferenceAmpList", "ComplexTypeReferenceElement", "PrimitiveFieldReference", "FieldName", "DefinedObjectClass", - "ValueDefinition", "Value", "@3", "SimpleValue", "DefinedValue", + "ValueDefinition", "Value", "@4", "SimpleValue", "DefinedValue", "RestrictedCharacterStringValue", "Opaque", "BasicTypeId", "BasicTypeId_UniverationCompatible", "BasicType", "BasicString", - "Union", "Intersection", "Except", "optConstraints", "Constraints", - "SetOfConstraints", "ElementSetSpecs", "ElementSetSpec", - "ConstraintSubtypeElement", "@4", "ConstraintRangeSpec", - "ConstraintSpec", "SingleValue", "ContainedSubtype", - "InnerTypeConstraint", "WithComponentsList", "WithComponentsElement", - "optPresenceConstraint", "PresenceConstraint", "TableConstraint", + "Union", "Intersection", "Except", "optConstraints", "Constraint", + "SubtypeConstraint", "SetOfConstraints", "ElementSetSpecs", + "ElementSetSpec", "ConstraintSubtypeElement", "ConstraintSpec", + "SingleValue", "ContainedSubtype", "InnerTypeConstraint", + "WithComponentsList", "WithComponentsElement", "optPresenceConstraint", + "PresenceConstraint", "GeneralConstraint", "UserDefinedConstraint", + "@5", "ContentsConstraint", "ConstraintRangeSpec", "TableConstraint", "SimpleTableConstraint", "ComponentRelationConstraint", "AtNotationList", "AtNotationElement", "ComponentIdList", "optMarker", "Marker", "UniverationDefinition", "UniverationList", @@ -835,71 +842,73 @@ static const unsigned short yytoknum[] = /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const unsigned char yyr1[] = { - 0, 121, 122, 123, 123, 124, 125, 125, 126, 126, - 127, 127, 128, 128, 128, 129, 129, 130, 130, 131, - 131, 131, 131, 131, 132, 132, 133, 134, 134, 135, - 135, 135, 136, 135, 135, 137, 137, 138, 138, 139, - 139, 140, 140, 141, 142, 142, 143, 143, 143, 144, - 144, 145, 145, 145, 146, 146, 147, 147, 147, 148, - 149, 150, 150, 150, 151, 151, 151, 151, 152, 152, - 153, 153, 153, 153, 153, 154, 154, 155, 155, 155, - 155, 156, 156, 157, 157, 158, 158, 158, 158, 159, - 159, 160, 160, 160, 161, 162, 162, 163, 163, 164, - 164, 164, 164, 164, 164, 164, 165, 165, 167, 166, - 168, 168, 169, 169, 169, 169, 170, 170, 170, 171, - 172, 173, 174, 174, 174, 174, 174, 174, 174, 174, - 174, 175, 175, 175, 175, 175, 175, 176, 176, 177, - 178, 178, 179, 179, 179, 180, 181, 182, 182, 182, - 183, 182, 182, 184, 184, 184, 184, 184, 184, 185, - 185, 186, 186, 186, 187, 187, 188, 188, 188, 188, - 188, 188, 188, 188, 188, 188, 188, 188, 188, 189, - 189, 189, 190, 190, 191, 191, 191, 191, 191, 191, - 191, 191, 191, 191, 191, 191, 191, 191, 192, 192, - 193, 193, 194, 195, 195, 196, 196, 197, 197, 198, - 198, 198, 198, 199, 199, 199, 199, 199, 200, 200, - 200, 200, 200, 200, 200, 200, 200, 200, 201, 200, - 202, 202, 202, 202, 203, 203, 204, 204, 204, 204, - 204, 205, 206, 206, 207, 207, 208, 208, 209, 209, - 210, 210, 210, 211, 211, 212, 213, 214, 214, 215, - 215, 216, 216, 217, 217, 218, 218, 219, 219, 220, - 220, 221, 221, 221, 221, 221, 222, 222, 223, 223, - 224, 224, 225, 226, 227, 227, 227, 227, 228, 228, - 228, 229, 229, 230, 231, 231, 232 + 0, 121, 122, 123, 123, 125, 124, 126, 126, 127, + 127, 128, 128, 129, 129, 129, 130, 130, 131, 131, + 132, 132, 132, 132, 132, 133, 133, 134, 135, 135, + 136, 136, 136, 137, 136, 136, 138, 138, 139, 139, + 140, 140, 141, 141, 142, 143, 143, 144, 144, 144, + 145, 145, 146, 146, 146, 147, 147, 148, 148, 148, + 149, 150, 151, 151, 151, 152, 152, 152, 152, 153, + 153, 154, 154, 154, 154, 154, 155, 155, 156, 156, + 156, 156, 157, 157, 158, 158, 159, 159, 159, 159, + 160, 160, 161, 161, 161, 162, 163, 163, 164, 164, + 165, 165, 165, 165, 165, 165, 165, 166, 166, 168, + 167, 169, 169, 170, 170, 170, 170, 171, 171, 171, + 172, 173, 174, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 176, 176, 176, 176, 176, 176, 177, 177, + 178, 179, 179, 180, 180, 180, 181, 182, 183, 183, + 183, 184, 183, 183, 185, 185, 185, 185, 185, 185, + 186, 186, 187, 187, 187, 188, 188, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 190, 190, 190, 191, 191, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 193, + 193, 194, 194, 195, 196, 196, 197, 197, 198, 198, + 199, 199, 200, 200, 200, 200, 201, 201, 201, 201, + 201, 202, 202, 202, 202, 202, 202, 202, 202, 202, + 203, 203, 204, 204, 204, 204, 204, 205, 206, 206, + 207, 207, 208, 208, 209, 209, 210, 210, 210, 211, + 211, 211, 213, 212, 214, 215, 215, 215, 215, 216, + 216, 217, 218, 219, 219, 220, 220, 221, 221, 222, + 222, 223, 223, 224, 224, 225, 225, 226, 226, 226, + 226, 226, 227, 227, 228, 228, 229, 229, 230, 231, + 232, 232, 232, 232, 233, 233, 233, 234, 234, 235, + 236, 236, 237 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const unsigned char yyr2[] = { - 0, 2, 1, 1, 2, 8, 0, 1, 3, 2, - 1, 2, 1, 4, 1, 0, 1, 1, 2, 2, - 2, 2, 2, 2, 0, 1, 3, 1, 2, 1, - 1, 1, 0, 3, 1, 0, 1, 3, 2, 1, - 2, 0, 1, 4, 1, 3, 1, 3, 1, 0, - 1, 3, 3, 2, 1, 3, 1, 3, 1, 3, - 4, 1, 1, 4, 3, 3, 6, 6, 1, 3, - 1, 3, 3, 3, 3, 1, 3, 1, 1, 1, - 1, 0, 1, 1, 3, 3, 2, 3, 1, 1, - 3, 2, 1, 1, 5, 0, 1, 1, 3, 2, - 4, 3, 3, 3, 3, 3, 0, 1, 0, 6, - 1, 2, 1, 1, 1, 3, 1, 3, 3, 3, - 0, 2, 1, 4, 4, 4, 6, 6, 1, 4, - 3, 1, 3, 3, 3, 1, 3, 1, 3, 1, - 1, 1, 1, 3, 3, 1, 4, 1, 1, 3, - 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, - 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, - 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, + 0, 2, 1, 1, 2, 0, 9, 0, 1, 3, + 2, 1, 2, 1, 4, 1, 0, 1, 1, 2, + 2, 2, 2, 2, 2, 0, 1, 3, 1, 2, + 1, 1, 1, 0, 3, 1, 0, 1, 3, 2, + 1, 2, 0, 1, 4, 1, 3, 1, 3, 1, + 0, 1, 3, 3, 2, 1, 3, 1, 3, 1, + 3, 4, 1, 1, 4, 3, 3, 6, 6, 1, + 3, 1, 3, 3, 3, 3, 1, 3, 1, 1, + 1, 1, 0, 1, 1, 3, 3, 2, 3, 1, + 1, 3, 2, 1, 1, 5, 0, 1, 1, 3, + 2, 4, 3, 3, 3, 3, 3, 0, 1, 0, + 6, 1, 2, 1, 1, 1, 3, 1, 3, 3, + 3, 0, 2, 1, 4, 4, 4, 6, 6, 1, + 4, 3, 1, 3, 3, 3, 1, 3, 1, 3, + 1, 1, 1, 1, 3, 3, 1, 4, 1, 1, + 3, 0, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 1, 1, 1, 1, 2, 1, 1, 1, + 1, 2, 2, 1, 1, 2, 2, 1, 1, 1, + 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 1, 1, 4, 3, 4, 1, - 1, 3, 5, 1, 3, 3, 3, 3, 4, 3, - 1, 1, 3, 3, 3, 3, 1, 1, 0, 5, - 1, 2, 2, 3, 1, 1, 1, 1, 1, 1, - 1, 1, 3, 5, 1, 3, 1, 3, 0, 1, - 1, 1, 1, 1, 1, 3, 4, 1, 3, 2, - 3, 1, 3, 0, 1, 1, 2, 2, 3, 1, - 3, 1, 4, 4, 1, 1, 1, 1, 1, 1, - 0, 1, 2, 4, 0, 1, 1, 1, 0, 1, - 1, 1, 1, 1, 0, 1, 1 + 1, 1, 1, 1, 0, 1, 1, 3, 1, 4, + 3, 4, 1, 1, 3, 5, 1, 3, 3, 3, + 3, 4, 3, 1, 1, 3, 3, 3, 3, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, + 1, 3, 1, 3, 0, 1, 1, 1, 1, 1, + 1, 1, 0, 5, 2, 1, 2, 2, 3, 1, + 1, 3, 4, 1, 3, 2, 3, 1, 3, 0, + 1, 1, 2, 2, 3, 1, 3, 1, 4, 4, + 1, 1, 1, 1, 1, 1, 0, 1, 2, 4, + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, + 0, 1, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -907,368 +916,375 @@ static const unsigned char yyr2[] = means the default is an error. */ static const unsigned short yydefact[] = { - 0, 291, 292, 0, 2, 3, 6, 1, 4, 0, - 0, 7, 296, 14, 9, 0, 10, 12, 15, 8, - 11, 0, 0, 0, 0, 0, 0, 0, 16, 17, - 0, 23, 21, 19, 22, 20, 0, 18, 13, 49, - 0, 0, 25, 35, 50, 0, 53, 0, 54, 56, - 58, 5, 0, 0, 36, 52, 51, 0, 0, 38, - 0, 39, 0, 44, 46, 48, 184, 0, 185, 186, - 187, 188, 189, 197, 190, 191, 192, 193, 194, 195, - 196, 26, 27, 31, 29, 30, 34, 0, 0, 55, - 57, 37, 40, 0, 0, 0, 32, 28, 280, 131, - 293, 0, 166, 0, 0, 180, 173, 177, 179, 167, - 0, 0, 168, 172, 176, 0, 0, 62, 182, 169, - 61, 178, 135, 0, 41, 45, 47, 33, 0, 284, - 65, 64, 120, 281, 288, 0, 181, 175, 174, 171, - 170, 0, 68, 0, 169, 70, 0, 280, 0, 183, - 0, 0, 42, 43, 0, 286, 287, 285, 0, 0, - 203, 290, 289, 282, 132, 134, 0, 0, 0, 0, - 0, 60, 155, 161, 156, 276, 277, 162, 163, 153, - 154, 80, 0, 75, 77, 78, 157, 158, 79, 275, - 267, 0, 269, 274, 271, 140, 141, 136, 137, 139, - 133, 152, 150, 146, 147, 148, 0, 159, 280, 280, - 0, 97, 0, 128, 0, 0, 203, 203, 122, 121, - 0, 0, 119, 204, 205, 280, 69, 74, 73, 72, - 71, 279, 0, 0, 236, 235, 0, 234, 237, 0, - 209, 0, 0, 239, 0, 210, 213, 0, 220, 221, - 227, 226, 253, 254, 278, 238, 241, 240, 63, 280, - 268, 0, 0, 0, 0, 0, 0, 145, 142, 0, - 265, 263, 263, 263, 99, 264, 95, 263, 263, 106, - 0, 283, 0, 280, 0, 280, 0, 280, 0, 0, - 0, 0, 67, 66, 0, 0, 230, 0, 0, 0, - 0, 0, 0, 59, 200, 201, 198, 199, 0, 0, - 0, 202, 0, 0, 0, 0, 76, 270, 0, 0, - 159, 138, 164, 151, 160, 149, 266, 104, 0, 103, - 105, 96, 263, 101, 102, 0, 94, 107, 98, 0, - 116, 0, 89, 92, 93, 280, 130, 0, 0, 82, - 83, 88, 263, 280, 294, 0, 294, 0, 207, 0, - 214, 228, 231, 232, 225, 223, 242, 0, 255, 219, - 211, 215, 216, 217, 0, 224, 222, 0, 0, 257, - 273, 272, 165, 143, 144, 100, 0, 129, 0, 123, - 280, 91, 280, 124, 280, 86, 263, 280, 295, 125, - 280, 206, 208, 0, 233, 246, 0, 244, 203, 0, - 218, 0, 259, 261, 256, 0, 108, 117, 118, 90, - 87, 84, 85, 120, 120, 229, 243, 0, 248, 212, - 260, 0, 258, 0, 126, 127, 245, 251, 252, 250, - 247, 249, 262, 112, 113, 0, 0, 110, 114, 0, - 109, 111, 115 + 0, 297, 298, 0, 2, 3, 5, 1, 4, 7, + 0, 0, 8, 302, 15, 10, 0, 11, 13, 16, + 9, 12, 0, 0, 0, 0, 0, 0, 0, 17, + 18, 0, 24, 22, 20, 23, 21, 0, 19, 14, + 50, 0, 0, 26, 36, 51, 0, 54, 0, 55, + 57, 59, 6, 0, 0, 37, 53, 52, 0, 0, + 39, 0, 40, 0, 45, 47, 49, 185, 0, 186, + 187, 188, 189, 190, 198, 191, 192, 193, 194, 195, + 196, 197, 27, 28, 32, 30, 31, 35, 0, 0, + 56, 58, 38, 41, 0, 0, 0, 33, 29, 286, + 132, 299, 0, 167, 0, 0, 181, 174, 178, 180, + 168, 0, 0, 169, 173, 177, 0, 0, 63, 183, + 170, 62, 179, 136, 0, 42, 46, 48, 34, 0, + 290, 66, 65, 121, 287, 294, 0, 182, 176, 175, + 172, 171, 0, 69, 0, 170, 71, 0, 286, 0, + 184, 0, 0, 43, 44, 0, 292, 293, 291, 0, + 0, 204, 296, 295, 288, 133, 135, 0, 0, 0, + 0, 0, 61, 156, 162, 157, 282, 283, 163, 164, + 154, 155, 81, 0, 76, 78, 79, 158, 159, 80, + 281, 273, 0, 275, 280, 277, 141, 142, 137, 138, + 140, 134, 153, 151, 147, 148, 149, 0, 160, 286, + 286, 0, 98, 0, 129, 0, 0, 204, 204, 123, + 122, 0, 0, 120, 205, 206, 208, 286, 70, 75, + 74, 73, 72, 285, 0, 232, 231, 0, 230, 233, + 0, 212, 0, 235, 0, 213, 216, 0, 223, 224, + 229, 284, 234, 237, 236, 64, 286, 274, 0, 0, + 0, 0, 0, 0, 146, 143, 0, 271, 269, 269, + 269, 100, 270, 96, 269, 269, 107, 0, 289, 0, + 286, 0, 286, 0, 286, 0, 0, 0, 286, 0, + 0, 0, 249, 251, 250, 259, 260, 0, 68, 67, + 0, 255, 0, 0, 0, 0, 0, 60, 201, 202, + 199, 200, 0, 0, 0, 203, 0, 0, 0, 77, + 276, 0, 0, 160, 139, 165, 152, 161, 150, 272, + 105, 0, 104, 106, 97, 269, 102, 103, 0, 95, + 108, 99, 0, 117, 0, 90, 93, 94, 286, 131, + 0, 0, 83, 84, 89, 269, 286, 300, 0, 300, + 0, 0, 254, 0, 210, 207, 0, 0, 217, 256, + 257, 228, 226, 0, 238, 0, 222, 214, 218, 219, + 220, 0, 227, 225, 279, 278, 166, 144, 145, 101, + 0, 130, 0, 124, 286, 92, 286, 125, 286, 87, + 269, 286, 301, 126, 286, 209, 252, 261, 0, 0, + 263, 211, 258, 242, 0, 240, 204, 0, 221, 109, + 118, 119, 91, 88, 85, 86, 121, 121, 0, 0, + 265, 267, 262, 0, 239, 0, 244, 215, 0, 127, + 128, 253, 266, 0, 264, 241, 247, 248, 246, 243, + 245, 113, 114, 0, 0, 111, 115, 268, 0, 110, + 112, 116 }; /* YYDEFGOTO[NTERM-NUM]. */ static const short yydefgoto[] = { - -1, 3, 4, 5, 10, 11, 15, 16, 27, 28, - 29, 41, 42, 81, 82, 127, 53, 54, 60, 153, - 61, 62, 63, 43, 44, 47, 48, 181, 83, 116, - 84, 141, 142, 182, 183, 348, 349, 350, 341, 342, - 130, 332, 210, 211, 336, 337, 433, 446, 447, 351, - 352, 159, 160, 219, 117, 197, 198, 448, 272, 273, - 85, 203, 264, 204, 205, 243, 323, 118, 119, 120, - 121, 309, 310, 312, 222, 223, 224, 244, 245, 246, - 403, 298, 247, 248, 249, 250, 406, 407, 440, 441, - 251, 252, 253, 378, 379, 412, 274, 275, 149, 191, - 192, 254, 255, 132, 133, 134, 158, 163, 256, 122, - 397, 257 + -1, 3, 4, 5, 9, 11, 12, 16, 17, 28, + 29, 30, 42, 43, 82, 83, 128, 54, 55, 61, + 154, 62, 63, 64, 44, 45, 48, 49, 182, 84, + 117, 85, 142, 143, 183, 184, 351, 352, 353, 344, + 345, 131, 335, 211, 212, 339, 340, 438, 454, 455, + 354, 355, 160, 161, 220, 118, 198, 199, 456, 269, + 270, 86, 204, 261, 205, 206, 243, 326, 119, 120, + 121, 122, 313, 314, 316, 223, 224, 225, 226, 290, + 245, 246, 247, 248, 249, 250, 414, 415, 449, 450, + 291, 292, 428, 293, 303, 294, 295, 296, 409, 410, + 430, 271, 272, 150, 192, 193, 251, 252, 133, 134, + 135, 159, 164, 253, 123, 401, 254 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -357 +#define YYPACT_NINF -345 static const short yypact[] = { - 83, -357, -357, 18, 83, -357, -80, -357, -357, 64, - 3, -357, -357, -357, -357, 74, -357, 2, 266, -357, - -357, 139, 100, 88, 90, 148, 142, 230, 266, -357, - 135, -357, -357, -357, -357, -357, 242, -357, -357, 127, - 53, 233, -357, 238, -357, 177, -357, 80, -357, 199, - -357, -357, 173, 256, -357, -357, -357, 213, 206, -357, - 55, -357, 8, -357, 211, -357, -357, 308, -357, -357, - -357, -357, -357, -357, -357, -357, -357, -357, -357, -357, - -357, 256, -357, -357, -357, -357, -357, 345, 641, -357, - -357, -357, -357, 83, 213, 217, -357, -357, -23, 222, - -357, 257, -357, 271, 276, -357, -357, -357, -357, -357, - 303, 281, -357, -357, -357, 717, 359, 261, -357, 262, - -357, -357, 253, 372, -80, -357, -357, -357, 269, 6, - -357, -357, -357, -357, 134, 213, -357, -357, -357, -357, - -357, 89, -357, 264, -357, 273, 272, 95, 69, -357, - 277, 205, -357, -357, 300, -357, -357, -357, 373, 565, - -61, -357, -357, -357, -357, -357, 381, 717, 213, 213, - 445, -357, -357, -357, -357, -357, -357, -357, -357, -357, - -357, -357, 92, -357, -357, -357, -357, -357, -357, -357, - -357, 114, -357, -357, 278, -357, -357, 274, -357, -357, - -357, -357, -357, -357, -357, -357, 275, 282, 72, 40, - 117, -357, 279, 351, 293, 330, 87, 99, -357, -357, - 294, 445, -357, -357, 295, -23, -357, -357, -357, -357, - -357, -357, 305, 377, -357, -357, -79, -357, -357, 287, - -357, 83, 445, -357, 301, 229, 310, 302, -79, -357, - -357, -357, 312, -357, -357, -357, -357, -357, -357, 95, - -357, 27, 270, 311, 414, 412, 205, -357, -357, 205, - -357, 116, 126, 116, -357, -357, 332, 126, 116, 323, - 300, -357, 398, 41, 334, 4, 356, 4, 357, 445, - 320, 445, -357, -357, 491, 324, 315, 331, 225, 326, - 337, 329, 328, -357, -357, -357, -357, -357, 339, 491, - 491, -357, 491, 445, 291, 327, -357, -357, 338, 340, - -357, -357, -357, 443, -357, -357, -357, -357, 346, -357, - -357, -357, 116, -357, -357, 363, -357, -357, -357, 412, - 347, 138, -357, -357, -357, 348, -357, 389, 360, 352, - -357, -357, 116, 348, 412, 362, 412, 355, -357, 369, - -357, -357, -357, 349, -357, -357, 295, 51, -357, -357, - 370, -357, -357, -357, 371, -357, -357, 10, 145, -357, - -357, -357, -357, -357, -357, -357, 376, -357, 270, -357, - 41, -357, 348, -357, 46, -357, 116, 348, -357, -357, - 348, -357, -357, 414, -357, -357, 174, -357, -61, 463, - -357, 412, 368, -357, -357, 327, -357, -357, -357, -357, - -357, -357, -357, -357, -357, 443, -357, 51, 130, 234, - 368, 412, -357, 28, -357, -357, -357, -357, -357, -357, - -357, -357, -357, -357, -357, 28, 48, -357, -357, 16, - -357, -357, -357 + 179, -345, -345, 94, 179, -345, -345, -345, -345, -87, + 25, 118, -345, -345, -345, -345, 64, -345, 37, 234, + -345, -345, 106, 123, 107, 113, 164, 165, 260, 234, + -345, 157, -345, -345, -345, -345, -345, 247, -345, -345, + 177, 60, 235, -345, 239, -345, 175, -345, -72, -345, + 198, -345, -345, 147, 506, -345, -345, -345, 246, 199, + -345, 21, -345, 100, -345, 205, -345, -345, 299, -345, + -345, -345, -345, -345, -345, -345, -345, -345, -345, -345, + -345, -345, 506, -345, -345, -345, -345, -345, 273, 659, + -345, -345, -345, -345, 179, 246, 212, -345, -345, 16, + 242, -345, 237, -345, 254, 270, -345, -345, -345, -345, + -345, 306, 278, -345, -345, -345, 735, 376, 272, -345, + 275, -345, -345, 267, 383, -87, -345, -345, -345, 281, + 87, -345, -345, -345, -345, 14, 246, -345, -345, -345, + -345, -345, 36, -345, 276, -345, 277, 284, 91, 77, + -345, 341, 201, -345, -345, 214, -345, -345, -345, 377, + 583, 108, -345, -345, -345, -345, -345, 391, 735, 246, + 246, 435, -345, -345, -345, -345, -345, -345, -345, -345, + -345, -345, -345, 134, -345, -345, -345, -345, -345, -345, + -345, -345, 186, -345, -345, 285, -345, -345, 289, -345, + -345, -345, -345, -345, -345, -345, -345, 290, 282, 162, + 76, 211, -345, 293, 370, 303, 340, -52, 95, -345, + -345, 304, 390, -345, -345, -345, 305, 16, -345, -345, + -345, -345, -345, -345, 315, -345, -345, 114, -345, -345, + 210, -345, 435, -345, 308, 181, 317, 310, 114, -345, + -345, -345, -345, -345, -345, -345, 91, -345, 97, 301, + 279, 416, 413, 201, -345, -345, 201, -345, -13, 74, + -13, -345, -345, 330, 74, -13, 324, 214, -345, 398, + 61, 323, 68, 356, 68, 357, 435, 401, 319, 179, + 321, 325, -345, -345, -345, 327, -345, 435, -345, -345, + 497, 318, 332, 216, 329, 335, 342, -345, -345, -345, + -345, -345, 345, 497, 497, -345, 497, 435, 228, -345, + -345, 343, 344, -345, -345, -345, 453, -345, -345, -345, + -345, 349, -345, -345, -345, -13, -345, -345, 373, -345, + -345, -345, 413, 352, 220, -345, -345, -345, 319, -345, + 397, 362, 359, -345, -345, -13, 319, 413, 364, 413, + 365, 369, -345, 371, -345, -345, 358, 368, -345, -345, + 363, -345, -345, 435, 305, 8, -345, 374, -345, -345, + -345, 372, -345, -345, -345, -345, -345, -345, -345, -345, + 380, -345, 301, -345, 61, -345, 319, -345, 43, -345, + -13, 319, -345, -345, 319, -345, -345, -345, -5, 221, + -345, -345, -345, -345, 222, -345, 108, 452, -345, -345, + -345, -345, -345, -345, -345, -345, -345, -345, 416, 413, + 366, -345, -345, 358, -345, 8, 6, 271, 49, -345, + -345, 453, 366, 413, -345, -345, -345, -345, -345, -345, + -345, -345, -345, 49, 46, -345, -345, -345, 28, -345, + -345, -345 }; /* YYPGOTO[NTERM-NUM]. */ static const short yypgoto[] = { - -357, -357, -357, 483, -357, 364, -357, 474, -357, -357, - 462, -357, -357, -357, 410, -357, -357, -357, -357, -357, - 432, -357, 399, -357, -357, -357, 437, 366, -357, -62, - -357, -357, 341, -357, 250, 210, -357, 121, -357, 120, - 292, -357, -357, 236, -357, -357, -357, 73, -356, -272, - -84, -357, -58, -357, 235, -357, 258, -146, 313, 314, - -357, -21, -357, -124, -255, -122, 122, -38, -1, -357, - 34, -357, -357, -357, -214, -357, 221, -25, 115, -69, - -357, 280, -357, -207, -357, -357, -357, 104, -357, -357, - -357, -357, -357, -357, 111, 123, -256, -357, -357, -357, - 283, -139, -357, -138, -357, -357, -357, -357, 1, -357, - 176, -9 + -345, -345, -345, 485, -345, -345, 367, -345, 475, -345, + -345, 464, -345, -345, -345, 412, -345, -345, -345, -345, + -345, 434, -345, 404, -345, -345, -345, 438, 378, -345, + -79, -345, -345, 337, -345, 258, 232, -345, 119, -345, + 125, 296, -345, -345, 250, -345, -345, -345, 71, -344, + -271, -91, -345, -49, -345, 248, -345, 268, -132, 320, + 322, -345, 85, -345, -135, -252, -136, 103, -89, -78, + -345, -43, -345, -345, -345, -215, -345, -345, 229, -151, + 121, -126, -345, -84, -345, -345, -345, 101, -345, -345, + -345, -345, -345, -345, 291, -345, -345, -345, -345, 111, + 112, -246, -345, -345, -345, 288, -134, -345, -51, -345, + -345, -345, -345, 1, -345, 191, -10 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, parse error. */ -#define YYTABLE_NINF -264 +#define YYTABLE_NINF -270 static const short yytable[] = { - 17, 6, 286, 288, 199, 6, 17, 318, 187, 193, - 128, 343, 187, 12, 131, 327, 329, 330, 7, 12, - 443, 333, 334, 185, 220, 186, 123, 296, 9, 186, - 155, 50, 443, 195, 196, 444, 12, 175, 176, 347, - 297, 49, 18, 65, 88, 195, 196, 444, 50, 221, - 12, 65, 443, 64, 87, 12, 267, 268, 49, 93, - 12, 64, 12, 184, 12, 195, 196, 444, 1, 2, - 1, 2, 88, 12, 13, 45, 385, 143, 12, 175, - 176, 347, 87, 12, 13, 65, 156, 86, 267, 268, - 451, 365, 129, 451, 124, 64, 395, 218, 1, 2, - 157, 172, 173, 174, 12, 175, 176, 376, 177, 178, - 269, 340, 21, -81, 144, 86, 145, 199, 343, 129, - 187, 94, 193, 319, 271, 276, 165, 187, 411, 143, - 187, 445, 452, 417, 189, 185, 164, 186, 188, 194, - 422, 293, 207, 445, 186, 179, 270, 186, 340, 30, - 437, 200, 206, 340, 269, 129, 129, 450, 405, 228, - 230, 129, 31, 445, 269, 46, 144, 91, 145, 227, - 229, -24, 220, 14, 40, 184, 189, 32, 190, 33, - 161, -263, 12, 19, 220, -263, 180, 129, 1, 2, - 270, 162, 56, 57, 428, 285, 290, 221, 166, 344, - 270, 258, 167, 170, 438, 259, 34, 287, 439, 221, - 129, 172, 173, 174, 12, 175, 176, 302, 177, 178, - 1, 2, 12, 260, 59, 360, 279, 261, 1, 2, - 280, 35, 173, 36, 12, 175, 176, 231, 177, 178, - 371, 372, 301, 373, 328, 325, 38, 389, 326, 418, - 188, 390, 194, 320, 414, 179, 324, 207, 415, 423, - 207, 391, 424, 206, 357, 12, 359, 206, 39, 396, - 206, 1, 2, 201, 345, 234, 353, 51, 353, 12, - 175, 176, 22, 426, 66, 1, 2, 427, 374, 55, - 364, 23, 1, 2, 195, 196, 180, 52, 173, 67, - 12, 175, 176, 231, 177, 178, 344, 58, 420, 68, - 69, 70, 24, 202, 25, 90, 238, 208, 209, 95, - 71, 299, 300, 26, 96, 72, 126, 73, 195, 196, - 387, 304, 305, 306, 307, 74, 304, 305, 306, 307, - 135, 234, 308, 136, 75, 398, 76, 398, 98, 99, - 100, 77, 138, 78, 79, 80, 375, 137, 408, 139, - 99, 100, 146, 383, 384, 434, 435, 140, 413, 147, - 148, 150, 101, 66, 102, 151, 103, 154, 168, 320, - 170, 345, 238, 212, 225, 353, 104, 169, 262, 206, - 105, 282, 263, 265, 106, 281, 266, 107, 68, 69, - 70, 283, 413, 284, 289, 291, 294, 295, 108, 71, - 303, 311, 313, 109, 72, 110, 73, 111, 408, 322, - 315, 12, 442, 335, 74, 331, 112, 113, 339, 354, - 356, 358, 361, 75, 362, 76, 221, 363, 368, 369, - 77, 114, 78, 79, 80, 367, 370, 377, 382, 380, - 386, 381, 173, 115, 12, 175, 176, 231, 177, 178, - 1, 2, 392, 129, 388, 394, 401, 232, 404, 393, - 173, 399, 12, 175, 176, 231, 177, 178, 1, 2, - 402, 233, 410, 409, 416, 232, 431, 8, 152, 20, - 37, 97, 92, 125, 89, 234, 235, 355, 173, 233, - 12, 175, 176, 231, 177, 178, 1, 2, 226, 316, - 419, 236, 171, 234, 235, 421, 338, 292, 449, 346, - 366, 321, 277, 278, 429, 425, 432, 233, 314, 236, - 237, 436, 400, 0, 430, 0, 238, 0, 0, 0, - 0, 234, 235, 0, 317, 239, 0, 0, 237, 0, - 0, 0, 240, 241, 238, 242, 0, 236, 0, 0, - 0, 0, 0, 239, 0, 0, 0, 0, 0, 0, - 0, 241, 0, 242, 0, 0, 237, 0, 0, 0, - 99, 100, 238, 0, 0, 0, 0, 0, 213, 0, - 0, 239, 101, 66, 102, 0, 103, 214, 0, 241, - 0, 242, 0, 0, 0, 0, 104, 0, 0, 0, - 105, 0, 0, 0, 106, 0, 0, 107, 68, 69, - 70, 0, 0, 0, 0, 0, 215, 0, 108, 71, - 0, 0, 0, 109, 72, 110, 73, 111, 0, 0, - 0, 0, 0, 0, 74, 0, 112, 113, 216, 217, - 0, 0, 0, 75, 0, 76, 99, 100, 0, 0, - 77, 114, 78, 79, 80, 0, 0, 0, 101, 66, - 102, 0, 103, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 104, 0, 0, 0, 105, 0, 0, 0, - 106, 0, 0, 107, 68, 69, 70, 0, 0, 0, - 0, 0, 0, 0, 108, 71, 0, 0, 0, 109, - 72, 110, 73, 111, 0, 0, 0, 0, 0, 0, - 74, 0, 112, 113, 0, 0, 0, 0, 0, 75, - 0, 76, 1, 2, 0, 0, 77, 114, 78, 79, - 80, 0, 0, 0, 101, 66, 102, 0, 103, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, - 0, 0, 105, 0, 0, 0, 106, 0, 0, 107, - 68, 69, 70, 0, 0, 0, 0, 0, 0, 0, - 108, 71, 0, 0, 0, 109, 72, 110, 73, 111, - 0, 0, 0, 0, 0, 0, 74, 0, 112, 113, - 0, 0, 0, 0, 0, 75, 0, 76, 0, 0, - 0, 0, 77, 114, 78, 79, 80 + 18, 6, 283, 285, 13, 6, 18, 321, 132, 346, + 124, 87, 187, 186, 188, 194, 187, 13, 188, 200, + 244, 10, 330, 332, 333, 266, 446, 144, 336, 337, + 13, 51, 451, 221, 13, 14, 1, 2, 145, 87, + 57, 58, 50, 66, 89, 196, 197, 452, 51, 129, + 451, 66, 13, 451, 65, 88, 282, 185, 222, 50, + 162, 267, 65, 196, 197, 452, 196, 197, 452, 13, + 13, 163, 89, 13, 14, 1, 2, 13, 350, 144, + 447, 219, 46, 88, 448, 66, 13, 176, 177, 389, + 145, 306, 264, 265, 7, 125, 65, 173, 174, 175, + 13, 176, 177, 350, 178, 179, 13, 176, 177, 399, + 460, 156, 266, 429, 460, 413, 31, 146, 268, 273, + 187, 186, 188, 346, 194, 322, 166, 187, 200, 188, + 187, 130, 188, 92, 15, 360, 299, 165, 189, 195, + 420, 180, 208, 453, 461, 167, 367, 22, 267, 168, + 343, 94, 201, 207, 425, 459, 13, 19, 130, 230, + 232, 453, 1, 2, 453, 185, 381, 157, 343, 146, + 229, 231, 47, 20, 368, 343, 130, -82, 264, 265, + 221, 158, 181, 130, 190, 32, 191, 378, 379, 347, + 380, 130, 331, 221, 1, 2, 33, 362, 60, 171, + 266, 436, 34, 284, 190, 222, 130, 173, 174, 175, + 13, 176, 177, 95, 178, 179, 1, 2, 222, 372, + 301, -25, 35, 174, 41, 13, 176, 177, 233, 178, + 179, 209, 210, 302, 383, 174, 267, 13, 176, 177, + 233, 178, 179, 255, 304, 305, 189, 256, 195, 323, + 23, 180, 327, 208, 36, 13, 208, 395, 421, 24, + 207, 1, 2, 37, 207, 400, 235, 207, 39, 202, + 348, -269, 356, 40, 356, -269, 99, 130, 235, 52, + 25, 371, 26, 308, 309, 310, 311, 56, 100, 101, + 363, 27, 181, 382, 312, 257, 196, 197, 53, 258, + 102, 67, 103, 347, 104, 423, 59, 239, 91, 203, + 13, 176, 177, 96, 105, 97, 1, 2, 106, 239, + 276, 127, 107, 137, 277, 108, 69, 70, 71, 393, + 432, 434, 391, 394, 433, 435, 109, 72, 100, 101, + 138, 110, 73, 111, 74, 112, 139, 402, 328, 402, + 426, 329, 75, 427, 113, 114, 1, 2, 196, 197, + 136, 76, 140, 77, 141, 416, 387, 388, 78, 115, + 79, 80, 81, 308, 309, 310, 311, 439, 440, 147, + 148, 116, 323, 149, 348, 151, 152, 213, 356, 155, + 169, 170, 171, 207, 227, 259, 263, 174, 431, 13, + 176, 177, 233, 178, 179, 1, 2, 260, 262, 278, + 279, 280, 234, 281, 286, 297, 300, 307, 315, 431, + 317, 325, 13, 334, 338, 416, 287, 288, 342, 357, + 359, 361, 364, 457, 130, 366, 365, 369, 370, 373, + 235, 236, 174, 375, 13, 176, 177, 233, 178, 179, + 1, 2, 377, 376, 384, 385, 237, 234, 386, 174, + 390, 13, 176, 177, 233, 178, 179, 1, 2, 392, + 396, 397, 398, 403, 234, 238, 405, 406, 408, 411, + 407, 239, 412, 418, 443, 235, 236, 417, 419, 8, + 240, 21, 153, 38, 98, 93, 90, 241, 289, 126, + 242, 237, 235, 236, 174, 228, 13, 176, 177, 233, + 178, 179, 1, 2, 319, 13, 358, 424, 237, 422, + 238, 1, 2, 298, 458, 172, 239, 341, 324, 349, + 274, 441, 275, 374, 67, 240, 445, 238, 437, 318, + 0, 442, 241, 239, 444, 242, 320, 235, 236, 68, + 404, 0, 240, 0, 0, 0, 0, 0, 0, 69, + 70, 71, 242, 237, 0, 0, 0, 0, 0, 0, + 72, 0, 0, 0, 0, 73, 0, 74, 0, 0, + 0, 0, 238, 0, 0, 75, 0, 0, 239, 0, + 0, 0, 0, 0, 76, 0, 77, 240, 100, 101, + 0, 78, 0, 79, 80, 81, 214, 242, 0, 0, + 102, 67, 103, 0, 104, 215, 0, 0, 0, 0, + 0, 0, 0, 0, 105, 0, 0, 0, 106, 0, + 0, 0, 107, 0, 0, 108, 69, 70, 71, 0, + 0, 0, 0, 0, 216, 0, 109, 72, 0, 0, + 0, 110, 73, 111, 74, 112, 0, 0, 0, 0, + 0, 0, 75, 0, 113, 114, 217, 218, 0, 0, + 0, 76, 0, 77, 100, 101, 0, 0, 78, 115, + 79, 80, 81, 0, 0, 0, 102, 67, 103, 0, + 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 105, 0, 0, 0, 106, 0, 0, 0, 107, 0, + 0, 108, 69, 70, 71, 0, 0, 0, 0, 0, + 0, 0, 109, 72, 0, 0, 0, 110, 73, 111, + 74, 112, 0, 0, 0, 0, 0, 0, 75, 0, + 113, 114, 0, 0, 0, 0, 0, 76, 0, 77, + 1, 2, 0, 0, 78, 115, 79, 80, 81, 0, + 0, 0, 102, 67, 103, 0, 104, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 105, 0, 0, 0, + 106, 0, 0, 0, 107, 0, 0, 108, 69, 70, + 71, 0, 0, 0, 0, 0, 0, 0, 109, 72, + 0, 0, 0, 110, 73, 111, 74, 112, 0, 0, + 0, 0, 0, 0, 75, 0, 113, 114, 0, 0, + 0, 0, 0, 76, 0, 77, 0, 0, 0, 0, + 78, 115, 79, 80, 81 }; static const short yycheck[] = { - 9, 0, 216, 217, 150, 4, 15, 262, 147, 148, - 33, 283, 151, 9, 98, 271, 272, 273, 0, 9, - 4, 277, 278, 147, 85, 147, 88, 106, 108, 151, - 24, 40, 4, 17, 18, 19, 9, 10, 11, 35, - 119, 40, 39, 52, 53, 17, 18, 19, 57, 110, - 9, 60, 4, 52, 53, 9, 16, 17, 57, 51, - 9, 60, 9, 147, 9, 17, 18, 19, 15, 16, - 15, 16, 81, 9, 10, 22, 332, 115, 9, 10, - 11, 35, 81, 9, 10, 94, 80, 53, 16, 17, - 446, 298, 115, 449, 93, 94, 352, 159, 15, 16, - 94, 6, 7, 8, 9, 10, 11, 314, 13, 14, - 38, 107, 110, 109, 115, 81, 115, 263, 390, 115, - 259, 113, 261, 262, 208, 209, 135, 266, 118, 167, - 269, 115, 116, 388, 107, 259, 135, 259, 147, 148, - 396, 225, 151, 115, 266, 50, 74, 269, 107, 10, - 20, 150, 151, 107, 38, 115, 115, 109, 107, 168, - 169, 115, 62, 115, 38, 112, 167, 112, 167, 168, - 169, 44, 85, 109, 47, 259, 107, 89, 109, 89, - 46, 109, 9, 109, 85, 113, 91, 115, 15, 16, - 74, 57, 112, 113, 408, 108, 221, 110, 109, 283, - 74, 109, 113, 108, 74, 113, 58, 108, 78, 110, - 115, 6, 7, 8, 9, 10, 11, 242, 13, 14, - 15, 16, 9, 109, 51, 294, 109, 113, 15, 16, - 113, 89, 7, 3, 9, 10, 11, 12, 13, 14, - 309, 310, 241, 312, 118, 266, 111, 109, 269, 388, - 259, 113, 261, 262, 109, 50, 265, 266, 113, 397, - 269, 345, 400, 262, 289, 9, 291, 266, 26, 353, - 269, 15, 16, 68, 283, 50, 285, 44, 287, 9, - 10, 11, 16, 109, 28, 15, 16, 113, 313, 112, - 65, 25, 15, 16, 17, 18, 91, 59, 7, 43, - 9, 10, 11, 12, 13, 14, 390, 108, 392, 53, - 54, 55, 46, 108, 48, 109, 91, 17, 18, 108, - 64, 34, 35, 57, 16, 69, 109, 71, 17, 18, - 339, 102, 103, 104, 105, 79, 102, 103, 104, 105, - 118, 50, 113, 86, 88, 354, 90, 356, 3, 15, - 16, 95, 76, 97, 98, 99, 65, 86, 367, 56, - 15, 16, 3, 17, 18, 423, 424, 86, 377, 108, - 108, 118, 27, 28, 29, 3, 31, 108, 114, 388, - 108, 390, 91, 10, 3, 394, 41, 114, 110, 388, - 45, 40, 118, 118, 49, 116, 114, 52, 53, 54, - 55, 108, 411, 73, 110, 110, 101, 30, 63, 64, - 109, 101, 110, 68, 69, 70, 71, 72, 427, 5, - 108, 9, 431, 100, 79, 93, 81, 82, 30, 73, - 73, 111, 108, 88, 119, 90, 110, 106, 109, 111, - 95, 96, 97, 98, 99, 108, 107, 120, 5, 111, - 87, 111, 7, 108, 9, 10, 11, 12, 13, 14, - 15, 16, 73, 115, 117, 113, 111, 22, 119, 109, - 7, 109, 9, 10, 11, 12, 13, 14, 15, 16, - 111, 36, 111, 113, 108, 22, 118, 4, 124, 15, - 28, 81, 60, 94, 57, 50, 51, 287, 7, 36, - 9, 10, 11, 12, 13, 14, 15, 16, 167, 259, - 390, 66, 146, 50, 51, 394, 280, 225, 445, 284, - 299, 263, 209, 209, 409, 403, 415, 36, 248, 66, - 85, 427, 356, -1, 411, -1, 91, -1, -1, -1, - -1, 50, 51, -1, 261, 100, -1, -1, 85, -1, - -1, -1, 107, 108, 91, 110, -1, 66, -1, -1, - -1, -1, -1, 100, -1, -1, -1, -1, -1, -1, - -1, 108, -1, 110, -1, -1, 85, -1, -1, -1, - 15, 16, 91, -1, -1, -1, -1, -1, 23, -1, - -1, 100, 27, 28, 29, -1, 31, 32, -1, 108, - -1, 110, -1, -1, -1, -1, 41, -1, -1, -1, + 10, 0, 217, 218, 9, 4, 16, 259, 99, 280, + 89, 54, 148, 148, 148, 149, 152, 9, 152, 151, + 171, 108, 268, 269, 270, 38, 20, 116, 274, 275, + 9, 41, 4, 85, 9, 10, 15, 16, 116, 82, + 112, 113, 41, 53, 54, 17, 18, 19, 58, 33, + 4, 61, 9, 4, 53, 54, 108, 148, 110, 58, + 46, 74, 61, 17, 18, 19, 17, 18, 19, 9, + 9, 57, 82, 9, 10, 15, 16, 9, 35, 168, + 74, 160, 22, 82, 78, 95, 9, 10, 11, 335, + 168, 242, 16, 17, 0, 94, 95, 6, 7, 8, + 9, 10, 11, 35, 13, 14, 9, 10, 11, 355, + 454, 24, 38, 118, 458, 107, 10, 116, 209, 210, + 256, 256, 256, 394, 258, 259, 136, 263, 260, 263, + 266, 115, 266, 112, 109, 286, 227, 136, 148, 149, + 392, 50, 152, 115, 116, 109, 297, 110, 74, 113, + 107, 51, 151, 152, 400, 109, 9, 39, 115, 169, + 170, 115, 15, 16, 115, 256, 317, 80, 107, 168, + 169, 170, 112, 109, 300, 107, 115, 109, 16, 17, + 85, 94, 91, 115, 107, 62, 109, 313, 314, 280, + 316, 115, 118, 85, 15, 16, 89, 288, 51, 108, + 38, 416, 89, 108, 107, 110, 115, 6, 7, 8, + 9, 10, 11, 113, 13, 14, 15, 16, 110, 303, + 106, 44, 58, 7, 47, 9, 10, 11, 12, 13, + 14, 17, 18, 119, 318, 7, 74, 9, 10, 11, + 12, 13, 14, 109, 34, 35, 256, 113, 258, 259, + 16, 50, 262, 263, 89, 9, 266, 348, 392, 25, + 259, 15, 16, 3, 263, 356, 50, 266, 111, 68, + 280, 109, 282, 26, 284, 113, 3, 115, 50, 44, + 46, 65, 48, 102, 103, 104, 105, 112, 15, 16, + 289, 57, 91, 65, 113, 109, 17, 18, 59, 113, + 27, 28, 29, 394, 31, 396, 108, 91, 109, 108, + 9, 10, 11, 108, 41, 16, 15, 16, 45, 91, + 109, 109, 49, 86, 113, 52, 53, 54, 55, 109, + 109, 109, 342, 113, 113, 113, 63, 64, 15, 16, + 86, 68, 69, 70, 71, 72, 76, 357, 263, 359, + 401, 266, 79, 404, 81, 82, 15, 16, 17, 18, + 118, 88, 56, 90, 86, 375, 17, 18, 95, 96, + 97, 98, 99, 102, 103, 104, 105, 426, 427, 3, + 108, 108, 392, 108, 394, 118, 3, 10, 398, 108, + 114, 114, 108, 392, 3, 110, 114, 7, 408, 9, + 10, 11, 12, 13, 14, 15, 16, 118, 118, 116, + 40, 108, 22, 73, 110, 110, 101, 109, 101, 429, + 110, 5, 9, 93, 100, 435, 36, 37, 30, 73, + 73, 30, 111, 443, 115, 108, 111, 119, 106, 110, + 50, 51, 7, 108, 9, 10, 11, 12, 13, 14, + 15, 16, 107, 111, 111, 111, 66, 22, 5, 7, + 87, 9, 10, 11, 12, 13, 14, 15, 16, 117, + 73, 109, 113, 109, 22, 85, 111, 108, 120, 111, + 109, 91, 119, 111, 118, 50, 51, 113, 108, 4, + 100, 16, 125, 29, 82, 61, 58, 107, 108, 95, + 110, 66, 50, 51, 7, 168, 9, 10, 11, 12, + 13, 14, 15, 16, 256, 9, 284, 398, 66, 394, + 85, 15, 16, 227, 453, 147, 91, 277, 260, 281, + 210, 428, 210, 304, 28, 100, 435, 85, 417, 248, + -1, 429, 107, 91, 433, 110, 258, 50, 51, 43, + 359, -1, 100, -1, -1, -1, -1, -1, -1, 53, + 54, 55, 110, 66, -1, -1, -1, -1, -1, -1, + 64, -1, -1, -1, -1, 69, -1, 71, -1, -1, + -1, -1, 85, -1, -1, 79, -1, -1, 91, -1, + -1, -1, -1, -1, 88, -1, 90, 100, 15, 16, + -1, 95, -1, 97, 98, 99, 23, 110, -1, -1, + 27, 28, 29, -1, 31, 32, -1, -1, -1, -1, + -1, -1, -1, -1, 41, -1, -1, -1, 45, -1, + -1, -1, 49, -1, -1, 52, 53, 54, 55, -1, + -1, -1, -1, -1, 61, -1, 63, 64, -1, -1, + -1, 68, 69, 70, 71, 72, -1, -1, -1, -1, + -1, -1, 79, -1, 81, 82, 83, 84, -1, -1, + -1, 88, -1, 90, 15, 16, -1, -1, 95, 96, + 97, 98, 99, -1, -1, -1, 27, 28, 29, -1, + 31, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 41, -1, -1, -1, 45, -1, -1, -1, 49, -1, + -1, 52, 53, 54, 55, -1, -1, -1, -1, -1, + -1, -1, 63, 64, -1, -1, -1, 68, 69, 70, + 71, 72, -1, -1, -1, -1, -1, -1, 79, -1, + 81, 82, -1, -1, -1, -1, -1, 88, -1, 90, + 15, 16, -1, -1, 95, 96, 97, 98, 99, -1, + -1, -1, 27, 28, 29, -1, 31, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 41, -1, -1, -1, 45, -1, -1, -1, 49, -1, -1, 52, 53, 54, - 55, -1, -1, -1, -1, -1, 61, -1, 63, 64, + 55, -1, -1, -1, -1, -1, -1, -1, 63, 64, -1, -1, -1, 68, 69, 70, 71, 72, -1, -1, - -1, -1, -1, -1, 79, -1, 81, 82, 83, 84, - -1, -1, -1, 88, -1, 90, 15, 16, -1, -1, - 95, 96, 97, 98, 99, -1, -1, -1, 27, 28, - 29, -1, 31, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 41, -1, -1, -1, 45, -1, -1, -1, - 49, -1, -1, 52, 53, 54, 55, -1, -1, -1, - -1, -1, -1, -1, 63, 64, -1, -1, -1, 68, - 69, 70, 71, 72, -1, -1, -1, -1, -1, -1, - 79, -1, 81, 82, -1, -1, -1, -1, -1, 88, - -1, 90, 15, 16, -1, -1, 95, 96, 97, 98, - 99, -1, -1, -1, 27, 28, 29, -1, 31, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 41, -1, - -1, -1, 45, -1, -1, -1, 49, -1, -1, 52, - 53, 54, 55, -1, -1, -1, -1, -1, -1, -1, - 63, 64, -1, -1, -1, 68, 69, 70, 71, 72, - -1, -1, -1, -1, -1, -1, 79, -1, 81, 82, - -1, -1, -1, -1, -1, 88, -1, 90, -1, -1, - -1, -1, 95, 96, 97, 98, 99 + -1, -1, -1, -1, 79, -1, 81, 82, -1, -1, + -1, -1, -1, 88, -1, 90, -1, -1, -1, -1, + 95, 96, 97, 98, 99 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const unsigned char yystos[] = { - 0, 15, 16, 122, 123, 124, 229, 0, 124, 108, - 125, 126, 9, 10, 109, 127, 128, 232, 39, 109, - 128, 110, 16, 25, 46, 48, 57, 129, 130, 131, - 10, 62, 89, 89, 58, 89, 3, 131, 111, 26, - 47, 132, 133, 144, 145, 22, 112, 146, 147, 229, - 232, 44, 59, 137, 138, 112, 112, 113, 108, 51, - 139, 141, 142, 143, 229, 232, 28, 43, 53, 54, - 55, 64, 69, 71, 79, 88, 90, 95, 97, 98, - 99, 134, 135, 149, 151, 181, 191, 229, 232, 147, - 109, 112, 141, 51, 113, 108, 16, 135, 3, 15, - 16, 27, 29, 31, 41, 45, 49, 52, 63, 68, - 70, 72, 81, 82, 96, 108, 150, 175, 188, 189, - 190, 191, 230, 150, 229, 143, 109, 136, 33, 115, - 161, 171, 224, 225, 226, 118, 86, 86, 76, 56, - 86, 152, 153, 188, 189, 229, 3, 108, 108, 219, - 118, 3, 126, 140, 108, 24, 80, 94, 227, 172, - 173, 46, 57, 228, 229, 232, 109, 113, 114, 114, - 108, 148, 6, 7, 8, 10, 11, 13, 14, 50, - 91, 148, 154, 155, 171, 184, 186, 222, 232, 107, - 109, 220, 221, 222, 232, 17, 18, 176, 177, 178, - 229, 68, 108, 182, 184, 185, 229, 232, 17, 18, - 163, 164, 10, 23, 32, 61, 83, 84, 150, 174, - 85, 110, 195, 196, 197, 3, 153, 229, 232, 229, - 232, 12, 22, 36, 50, 51, 66, 85, 91, 100, - 107, 108, 110, 186, 198, 199, 200, 203, 204, 205, - 206, 211, 212, 213, 222, 223, 229, 232, 109, 113, - 109, 113, 110, 118, 183, 118, 114, 16, 17, 38, - 74, 171, 179, 180, 217, 218, 171, 179, 180, 109, - 113, 116, 40, 108, 73, 108, 195, 108, 195, 110, - 198, 110, 161, 171, 101, 30, 106, 119, 202, 34, - 35, 229, 198, 109, 102, 103, 104, 105, 113, 192, - 193, 101, 194, 110, 202, 108, 155, 221, 185, 222, - 232, 177, 5, 187, 232, 182, 182, 217, 118, 217, - 217, 93, 162, 217, 217, 100, 165, 166, 164, 30, - 107, 159, 160, 170, 171, 232, 175, 35, 156, 157, - 158, 170, 171, 232, 73, 156, 73, 198, 111, 198, - 200, 108, 119, 106, 65, 204, 197, 108, 109, 111, - 107, 200, 200, 200, 198, 65, 204, 120, 214, 215, - 111, 111, 5, 17, 18, 217, 87, 232, 117, 109, - 113, 171, 73, 109, 113, 217, 171, 231, 232, 109, - 231, 111, 111, 201, 119, 107, 207, 208, 232, 113, - 111, 118, 216, 232, 109, 113, 108, 185, 222, 160, - 171, 158, 217, 224, 224, 187, 109, 113, 195, 199, - 216, 118, 215, 167, 173, 173, 208, 20, 74, 78, - 209, 210, 232, 4, 19, 115, 168, 169, 178, 168, - 109, 169, 116 + 0, 15, 16, 122, 123, 124, 234, 0, 124, 125, + 108, 126, 127, 9, 10, 109, 128, 129, 237, 39, + 109, 129, 110, 16, 25, 46, 48, 57, 130, 131, + 132, 10, 62, 89, 89, 58, 89, 3, 132, 111, + 26, 47, 133, 134, 145, 146, 22, 112, 147, 148, + 234, 237, 44, 59, 138, 139, 112, 112, 113, 108, + 51, 140, 142, 143, 144, 234, 237, 28, 43, 53, + 54, 55, 64, 69, 71, 79, 88, 90, 95, 97, + 98, 99, 135, 136, 150, 152, 182, 192, 234, 237, + 148, 109, 112, 142, 51, 113, 108, 16, 136, 3, + 15, 16, 27, 29, 31, 41, 45, 49, 52, 63, + 68, 70, 72, 81, 82, 96, 108, 151, 176, 189, + 190, 191, 192, 235, 151, 234, 144, 109, 137, 33, + 115, 162, 172, 229, 230, 231, 118, 86, 86, 76, + 56, 86, 153, 154, 189, 190, 234, 3, 108, 108, + 224, 118, 3, 127, 141, 108, 24, 80, 94, 232, + 173, 174, 46, 57, 233, 234, 237, 109, 113, 114, + 114, 108, 149, 6, 7, 8, 10, 11, 13, 14, + 50, 91, 149, 155, 156, 172, 185, 187, 227, 237, + 107, 109, 225, 226, 227, 237, 17, 18, 177, 178, + 179, 234, 68, 108, 183, 185, 186, 234, 237, 17, + 18, 164, 165, 10, 23, 32, 61, 83, 84, 151, + 175, 85, 110, 196, 197, 198, 199, 3, 154, 234, + 237, 234, 237, 12, 22, 50, 51, 66, 85, 91, + 100, 107, 110, 187, 200, 201, 202, 203, 204, 205, + 206, 227, 228, 234, 237, 109, 113, 109, 113, 110, + 118, 184, 118, 114, 16, 17, 38, 74, 172, 180, + 181, 222, 223, 172, 180, 181, 109, 113, 116, 40, + 108, 73, 108, 196, 108, 196, 110, 36, 37, 108, + 200, 211, 212, 214, 216, 217, 218, 110, 162, 172, + 101, 106, 119, 215, 34, 35, 200, 109, 102, 103, + 104, 105, 113, 193, 194, 101, 195, 110, 215, 156, + 226, 186, 227, 237, 178, 5, 188, 237, 183, 183, + 222, 118, 222, 222, 93, 163, 222, 222, 100, 166, + 167, 165, 30, 107, 160, 161, 171, 172, 237, 176, + 35, 157, 158, 159, 171, 172, 237, 73, 157, 73, + 200, 30, 172, 234, 111, 111, 108, 200, 202, 119, + 106, 65, 204, 110, 199, 108, 111, 107, 202, 202, + 202, 200, 65, 204, 111, 111, 5, 17, 18, 222, + 87, 237, 117, 109, 113, 172, 73, 109, 113, 222, + 172, 236, 237, 109, 236, 111, 108, 109, 120, 219, + 220, 111, 119, 107, 207, 208, 237, 113, 111, 108, + 186, 227, 161, 172, 159, 222, 229, 229, 213, 118, + 221, 237, 109, 113, 109, 113, 196, 201, 168, 174, + 174, 188, 221, 118, 220, 208, 20, 74, 78, 209, + 210, 4, 19, 115, 169, 170, 179, 237, 169, 109, + 170, 116 }; #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) @@ -1819,14 +1835,14 @@ yyparse (YYPARSE_PARAM_ARG) switch (yyn) { case 2: -#line 343 "asn1p_y.y" +#line 350 "asn1p_y.y" { *(void **)param = yyvsp[0].a_grammar; } break; case 3: -#line 349 "asn1p_y.y" +#line 356 "asn1p_y.y" { yyval.a_grammar = asn1p_new(); checkmem(yyval.a_grammar); @@ -1835,7 +1851,7 @@ yyparse (YYPARSE_PARAM_ARG) break; case 4: -#line 354 "asn1p_y.y" +#line 361 "asn1p_y.y" { yyval.a_grammar = yyvsp[-1].a_grammar; TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next); @@ -1843,49 +1859,57 @@ yyparse (YYPARSE_PARAM_ARG) break; case 5: -#line 375 "asn1p_y.y" +#line 378 "asn1p_y.y" + { currentModule = asn1p_module_new(); } + break; + + case 6: +#line 383 "asn1p_y.y" { + yyval.a_module = currentModule; + if(yyvsp[-1].a_module) { - yyval.a_module = yyvsp[-1].a_module; + asn1p_module_t tmp = *(yyval.a_module); + *(yyval.a_module) = *(yyvsp[-1].a_module); + *(yyvsp[-1].a_module) = tmp; + asn1p_module_free(yyvsp[-1].a_module); } else { /* There's a chance that a module is just plain empty */ - yyval.a_module = asn1p_module_new(); } - checkmem(yyval.a_module); - yyval.a_module->ModuleName = yyvsp[-7].tv_str; + yyval.a_module->ModuleName = yyvsp[-8].tv_str; yyval.a_module->module_oid = yyvsp[-6].a_oid; yyval.a_module->module_flags = yyvsp[-4].a_module_flags; } break; - case 6: -#line 396 "asn1p_y.y" + case 7: +#line 407 "asn1p_y.y" { yyval.a_oid = 0; } break; - case 7: -#line 397 "asn1p_y.y" + case 8: +#line 408 "asn1p_y.y" { yyval.a_oid = yyvsp[0].a_oid; } break; - case 8: -#line 401 "asn1p_y.y" + case 9: +#line 412 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; } break; - case 9: -#line 404 "asn1p_y.y" + case 10: +#line 415 "asn1p_y.y" { yyval.a_oid = 0; } break; - case 10: -#line 410 "asn1p_y.y" + case 11: +#line 421 "asn1p_y.y" { yyval.a_oid = asn1p_oid_new(); asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1894,8 +1918,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 11: -#line 416 "asn1p_y.y" + case 12: +#line 427 "asn1p_y.y" { yyval.a_oid = yyvsp[-1].a_oid; asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc); @@ -1904,86 +1928,86 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 12: -#line 425 "asn1p_y.y" + case 13: +#line 436 "asn1p_y.y" { /* iso */ yyval.a_oid_arc.name = yyvsp[0].tv_str; yyval.a_oid_arc.number = -1; } break; - case 13: -#line 429 "asn1p_y.y" + case 14: +#line 440 "asn1p_y.y" { /* iso(1) */ yyval.a_oid_arc.name = yyvsp[-3].tv_str; yyval.a_oid_arc.number = yyvsp[-1].a_int; } break; - case 14: -#line 433 "asn1p_y.y" + case 15: +#line 444 "asn1p_y.y" { /* 1 */ yyval.a_oid_arc.name = 0; yyval.a_oid_arc.number = yyvsp[0].a_int; } break; - case 15: -#line 443 "asn1p_y.y" + case 16: +#line 454 "asn1p_y.y" { yyval.a_module_flags = MSF_NOFLAGS; } break; - case 16: -#line 444 "asn1p_y.y" + case 17: +#line 455 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; } break; - case 17: -#line 453 "asn1p_y.y" + case 18: +#line 464 "asn1p_y.y" { yyval.a_module_flags = yyvsp[0].a_module_flags; } break; - case 18: -#line 456 "asn1p_y.y" + case 19: +#line 467 "asn1p_y.y" { yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags; } break; - case 19: -#line 465 "asn1p_y.y" + case 20: +#line 476 "asn1p_y.y" { yyval.a_module_flags = MSF_EXPLICIT_TAGS; } break; - case 20: -#line 468 "asn1p_y.y" + case 21: +#line 479 "asn1p_y.y" { yyval.a_module_flags = MSF_IMPLICIT_TAGS; } break; - case 21: -#line 471 "asn1p_y.y" + case 22: +#line 482 "asn1p_y.y" { yyval.a_module_flags = MSF_AUTOMATIC_TAGS; } break; - case 22: -#line 474 "asn1p_y.y" + case 23: +#line 485 "asn1p_y.y" { yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED; } break; - case 23: -#line 478 "asn1p_y.y" + case 24: +#line 489 "asn1p_y.y" { /* X.680Amd1 specifies TAG and XER */ if(strcmp(yyvsp[-1].tv_str, "TAG") == 0) { @@ -2001,20 +2025,20 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 24: -#line 499 "asn1p_y.y" + case 25: +#line 510 "asn1p_y.y" { yyval.a_module = 0; } break; - case 25: -#line 500 "asn1p_y.y" + case 26: +#line 511 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; } break; - case 26: -#line 509 "asn1p_y.y" + case 27: +#line 520 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); AL_IMPORT(yyval.a_module, exports, yyvsp[-2].a_module, xp_next); @@ -2023,15 +2047,15 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 27: -#line 518 "asn1p_y.y" + case 28: +#line 529 "asn1p_y.y" { yyval.a_module = yyvsp[0].a_module; } break; - case 28: -#line 521 "asn1p_y.y" + case 29: +#line 532 "asn1p_y.y" { if(yyvsp[-1].a_module) { yyval.a_module = yyvsp[-1].a_module; @@ -2043,8 +2067,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 29: -#line 537 "asn1p_y.y" + case 30: +#line 548 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -2054,8 +2078,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 30: -#line 544 "asn1p_y.y" + case 31: +#line 555 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -2065,8 +2089,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 31: -#line 557 "asn1p_y.y" + case 32: +#line 568 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -2076,13 +2100,13 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 32: -#line 565 "asn1p_y.y" + case 33: +#line 576 "asn1p_y.y" { asn1p_lexer_hack_push_encoding_control(); } break; - case 33: -#line 566 "asn1p_y.y" + case 34: +#line 577 "asn1p_y.y" { fprintf(stderr, "WARNING: ENCODING-CONTROL %s " @@ -2093,8 +2117,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 34: -#line 578 "asn1p_y.y" + case 35: +#line 589 "asn1p_y.y" { return yyerror( "Attempt to redefine a standard basic string type, " @@ -2102,13 +2126,13 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 35: -#line 591 "asn1p_y.y" + case 36: +#line 602 "asn1p_y.y" { yyval.a_module = 0; } break; - case 37: -#line 595 "asn1p_y.y" + case 38: +#line 606 "asn1p_y.y" { if(!saved_aid && 0) return yyerror("Unterminated IMPORTS FROM, " @@ -2118,15 +2142,15 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 38: -#line 605 "asn1p_y.y" + case 39: +#line 616 "asn1p_y.y" { return yyerror("Empty IMPORTS list"); } break; - case 39: -#line 611 "asn1p_y.y" + case 40: +#line 622 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -2134,26 +2158,26 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 40: -#line 616 "asn1p_y.y" + case 41: +#line 627 "asn1p_y.y" { yyval.a_module = yyvsp[-1].a_module; TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next); } break; - case 41: -#line 623 "asn1p_y.y" + case 42: +#line 634 "asn1p_y.y" { memset(&yyval.a_aid, 0, sizeof(yyval.a_aid)); } break; - case 42: -#line 624 "asn1p_y.y" + case 43: +#line 635 "asn1p_y.y" { yyval.a_aid.oid = yyvsp[0].a_oid; } break; - case 43: -#line 628 "asn1p_y.y" + case 44: +#line 639 "asn1p_y.y" { yyval.a_xports = yyvsp[-3].a_xports; yyval.a_xports->fromModuleName = yyvsp[-1].tv_str; @@ -2164,8 +2188,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 44: -#line 639 "asn1p_y.y" + case 45: +#line 650 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); checkmem(yyval.a_xports); @@ -2173,51 +2197,51 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 45: -#line 644 "asn1p_y.y" + case 46: +#line 655 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); } break; - case 46: -#line 651 "asn1p_y.y" + case 47: +#line 662 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_REFERENCE; } break; - case 47: -#line 657 "asn1p_y.y" + case 48: +#line 668 "asn1p_y.y" { /* Completely equivalent to above */ - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[-2].tv_str; yyval.a_expr->expr_type = A1TC_REFERENCE; } break; - case 48: -#line 663 "asn1p_y.y" + case 49: +#line 674 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_REFERENCE; } break; - case 49: -#line 673 "asn1p_y.y" + case 50: +#line 684 "asn1p_y.y" { yyval.a_module = 0; } break; - case 50: -#line 674 "asn1p_y.y" + case 51: +#line 685 "asn1p_y.y" { yyval.a_module = asn1p_module_new(); checkmem(yyval.a_module); @@ -2229,22 +2253,22 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 51: -#line 686 "asn1p_y.y" + case 52: +#line 697 "asn1p_y.y" { yyval.a_xports = yyvsp[-1].a_xports; } break; - case 52: -#line 689 "asn1p_y.y" + case 53: +#line 700 "asn1p_y.y" { yyval.a_xports = 0; } break; - case 53: -#line 692 "asn1p_y.y" + case 54: +#line 703 "asn1p_y.y" { /* Empty EXPORTS clause effectively prohibits export. */ yyval.a_xports = asn1p_xports_new(); @@ -2252,8 +2276,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 54: -#line 700 "asn1p_y.y" + case 55: +#line 711 "asn1p_y.y" { yyval.a_xports = asn1p_xports_new(); assert(yyval.a_xports); @@ -2261,51 +2285,51 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 55: -#line 705 "asn1p_y.y" + case 56: +#line 716 "asn1p_y.y" { yyval.a_xports = yyvsp[-2].a_xports; TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next); } break; - case 56: -#line 712 "asn1p_y.y" + case 57: +#line 723 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_EXPORTVAR; } break; - case 57: -#line 718 "asn1p_y.y" + case 58: +#line 729 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[-2].tv_str; yyval.a_expr->expr_type = A1TC_EXPORTVAR; } break; - case 58: -#line 724 "asn1p_y.y" + case 59: +#line 735 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_EXPORTVAR; } break; - case 59: -#line 733 "asn1p_y.y" + case 60: +#line 744 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; } break; - case 60: -#line 736 "asn1p_y.y" + case 61: +#line 747 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -2315,17 +2339,17 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 61: -#line 746 "asn1p_y.y" + case 62: +#line 757 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; } break; - case 62: -#line 759 "asn1p_y.y" + case 63: +#line 770 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->reference = yyvsp[0].a_ref; yyval.a_expr->expr_type = A1TC_REFERENCE; @@ -2333,10 +2357,10 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 63: -#line 769 "asn1p_y.y" + case 64: +#line 780 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->reference = yyvsp[-3].a_ref; yyval.a_expr->rhs_pspecs = yyvsp[-1].a_expr; @@ -2345,8 +2369,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 64: -#line 789 "asn1p_y.y" + case 65: +#line 800 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -2355,8 +2379,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 65: -#line 795 "asn1p_y.y" + case 66: +#line 806 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-2].tv_str; @@ -2365,8 +2389,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 66: -#line 811 "asn1p_y.y" + case 67: +#line 822 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-5].tv_str; @@ -2374,8 +2398,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 67: -#line 817 "asn1p_y.y" + case 68: +#line 828 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->Identifier = yyvsp[-5].tv_str; @@ -2383,8 +2407,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 68: -#line 825 "asn1p_y.y" + case 69: +#line 836 "asn1p_y.y" { int ret; yyval.a_plist = asn1p_paramlist_new(yylineno); @@ -2396,8 +2420,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 69: -#line 834 "asn1p_y.y" + case 70: +#line 845 "asn1p_y.y" { int ret; yyval.a_plist = yyvsp[-2].a_plist; @@ -2408,16 +2432,16 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 70: -#line 845 "asn1p_y.y" + case 71: +#line 856 "asn1p_y.y" { yyval.a_parg.governor = NULL; yyval.a_parg.argument = yyvsp[0].tv_str; } break; - case 71: -#line 849 "asn1p_y.y" + case 72: +#line 860 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -2427,8 +2451,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 72: -#line 856 "asn1p_y.y" + case 73: +#line 867 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -2438,8 +2462,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 73: -#line 863 "asn1p_y.y" + case 74: +#line 874 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -2450,8 +2474,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 74: -#line 871 "asn1p_y.y" + case 75: +#line 882 "asn1p_y.y" { int ret; yyval.a_parg.governor = asn1p_ref_new(yylineno); @@ -2462,34 +2486,34 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 75: -#line 882 "asn1p_y.y" + case 76: +#line 893 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); } break; - case 76: -#line 887 "asn1p_y.y" + case 77: +#line 898 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); } break; - case 77: -#line 894 "asn1p_y.y" + case 78: +#line 905 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; } break; - case 78: -#line 897 "asn1p_y.y" + case 79: +#line 908 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->Identifier = "?"; yyval.a_expr->expr_type = A1TC_REFERENCE; @@ -2498,11 +2522,11 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 79: -#line 905 "asn1p_y.y" + case 80: +#line 916 "asn1p_y.y" { asn1p_ref_t *ref; - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[0].tv_str; yyval.a_expr->expr_type = A1TC_REFERENCE; @@ -2513,45 +2537,45 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 80: -#line 916 "asn1p_y.y" + case 81: +#line 927 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); yyval.a_expr->expr_type = A1TC_VALUESET; yyval.a_expr->meta_type = AMT_VALUESET; yyval.a_expr->constraints = yyvsp[0].a_constr; } break; - case 81: -#line 939 "asn1p_y.y" - { yyval.a_expr = asn1p_expr_new(yylineno); } + case 82: +#line 950 "asn1p_y.y" + { yyval.a_expr = NEW_EXPR(); } break; - case 82: -#line 940 "asn1p_y.y" + case 83: +#line 951 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; } break; - case 83: -#line 943 "asn1p_y.y" + case 84: +#line 954 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); } break; - case 84: -#line 948 "asn1p_y.y" + case 85: +#line 959 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); } break; - case 85: -#line 955 "asn1p_y.y" + case 86: +#line 966 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -2561,8 +2585,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 86: -#line 962 "asn1p_y.y" + case 87: +#line 973 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; yyvsp[0].a_marker.flags |= yyval.a_expr->marker.flags; @@ -2571,10 +2595,10 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 87: -#line 968 "asn1p_y.y" + case 88: +#line 979 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->meta_type = yyvsp[0].a_expr->meta_type; yyval.a_expr->expr_type = A1TC_COMPONENTS_OF; @@ -2582,32 +2606,32 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 88: -#line 975 "asn1p_y.y" + case 89: +#line 986 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; } break; - case 89: -#line 981 "asn1p_y.y" + case 90: +#line 992 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); } break; - case 90: -#line 986 "asn1p_y.y" + case 91: +#line 997 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); } break; - case 91: -#line 993 "asn1p_y.y" + case 92: +#line 1004 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; assert(yyval.a_expr->Identifier == 0); @@ -2615,23 +2639,23 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 92: -#line 998 "asn1p_y.y" + case 93: +#line 1009 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; } break; - case 93: -#line 1001 "asn1p_y.y" + case 94: +#line 1012 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; _fixup_anonymous_identifier(yyval.a_expr); } break; - case 94: -#line 1008 "asn1p_y.y" + case 95: +#line 1019 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; checkmem(yyval.a_expr); @@ -2641,20 +2665,20 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 95: -#line 1018 "asn1p_y.y" + case 96: +#line 1029 "asn1p_y.y" { yyval.a_int = 0; } break; - case 96: -#line 1019 "asn1p_y.y" + case 97: +#line 1030 "asn1p_y.y" { yyval.a_int = 1; } break; - case 97: -#line 1023 "asn1p_y.y" + case 98: +#line 1034 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_CLASSDEF; yyval.a_expr->meta_type = AMT_OBJECTCLASS; @@ -2662,18 +2686,18 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 98: -#line 1030 "asn1p_y.y" + case 99: +#line 1041 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); } break; - case 99: -#line 1040 "asn1p_y.y" + case 100: +#line 1051 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[-1].tv_str; yyval.a_expr->meta_type = AMT_OBJECTFIELD; @@ -2682,10 +2706,10 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 100: -#line 1050 "asn1p_y.y" + case 101: +#line 1061 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); yyval.a_expr->Identifier = yyvsp[-3].tv_str; yyval.a_expr->meta_type = AMT_OBJECTFIELD; yyval.a_expr->expr_type = A1TC_CLASSFIELD_FTVFS; /* FixedTypeValueFieldSpec */ @@ -2695,10 +2719,10 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 101: -#line 1061 "asn1p_y.y" + case 102: +#line 1072 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); yyval.a_expr->Identifier = yyvsp[-2].tv_str; yyval.a_expr->meta_type = AMT_OBJECTFIELD; yyval.a_expr->expr_type = A1TC_CLASSFIELD_VTVFS; @@ -2707,10 +2731,10 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 102: -#line 1071 "asn1p_y.y" + case 103: +#line 1082 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[-2].tv_str; yyval.a_expr->reference = yyvsp[-1].a_ref; @@ -2720,10 +2744,10 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 103: -#line 1082 "asn1p_y.y" + case 104: +#line 1093 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); yyval.a_expr->Identifier = yyvsp[-2].tv_str; yyval.a_expr->meta_type = AMT_OBJECTFIELD; yyval.a_expr->expr_type = A1TC_CLASSFIELD_VTVSFS; @@ -2732,10 +2756,10 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 104: -#line 1092 "asn1p_y.y" + case 105: +#line 1103 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[-2].tv_str; yyval.a_expr->meta_type = AMT_OBJECTFIELD; @@ -2745,10 +2769,10 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 105: -#line 1103 "asn1p_y.y" + case 106: +#line 1114 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->Identifier = yyvsp[-2].tv_str; yyval.a_expr->reference = yyvsp[-1].a_ref; @@ -2758,80 +2782,80 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 106: -#line 1115 "asn1p_y.y" + case 107: +#line 1126 "asn1p_y.y" { yyval.a_wsynt = 0; } break; - case 107: -#line 1116 "asn1p_y.y" + case 108: +#line 1127 "asn1p_y.y" { yyval.a_wsynt = yyvsp[0].a_wsynt; } break; - case 108: -#line 1123 "asn1p_y.y" + case 109: +#line 1134 "asn1p_y.y" { asn1p_lexer_hack_enable_with_syntax(); } break; - case 109: -#line 1125 "asn1p_y.y" + case 110: +#line 1136 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; } break; - case 110: -#line 1131 "asn1p_y.y" + case 111: +#line 1142 "asn1p_y.y" { yyval.a_wsynt = asn1p_wsyntx_new(); TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); } break; - case 111: -#line 1135 "asn1p_y.y" + case 112: +#line 1146 "asn1p_y.y" { yyval.a_wsynt = yyvsp[-1].a_wsynt; TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next); } break; - case 112: -#line 1142 "asn1p_y.y" + case 113: +#line 1153 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_fromstring(yyvsp[0].tv_opaque.buf, 0); yyval.a_wchunk->type = WC_WHITESPACE; } break; - case 113: -#line 1146 "asn1p_y.y" + case 114: +#line 1157 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_fromstring(yyvsp[0].tv_str, 0); } break; - case 114: -#line 1149 "asn1p_y.y" + case 115: +#line 1160 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_fromstring(yyvsp[0].a_refcomp.name, 0); yyval.a_wchunk->type = WC_FIELD; } break; - case 115: -#line 1153 "asn1p_y.y" + case 116: +#line 1164 "asn1p_y.y" { yyval.a_wchunk = asn1p_wsyntx_chunk_fromsyntax(yyvsp[-1].a_wsynt); } break; - case 116: -#line 1159 "asn1p_y.y" + case 117: +#line 1170 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); checkmem(yyval.a_expr->Identifier); @@ -2840,10 +2864,10 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 117: -#line 1167 "asn1p_y.y" + case 118: +#line 1178 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); checkmem(yyval.a_expr->Identifier); @@ -2853,10 +2877,10 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 118: -#line 1176 "asn1p_y.y" + case 119: +#line 1187 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); yyval.a_expr->value = yyvsp[0].a_value; @@ -2866,8 +2890,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 119: -#line 1188 "asn1p_y.y" + case 120: +#line 1199 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; yyval.a_expr->tag = yyvsp[-2].a_tag; @@ -2889,16 +2913,16 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 120: -#line 1210 "asn1p_y.y" + case 121: +#line 1221 "asn1p_y.y" { yyval.a_int = asn1p_as_pointer ? EM_INDIRECT : 0; asn1p_as_pointer = 0; } break; - case 121: -#line 1217 "asn1p_y.y" + case 122: +#line 1228 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; yyval.a_expr->marker.flags |= yyvsp[-1].a_int; @@ -2917,15 +2941,15 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 122: -#line 1236 "asn1p_y.y" + case 123: +#line 1247 "asn1p_y.y" { yyval.a_expr = yyvsp[0].a_expr; } break; - case 123: -#line 1239 "asn1p_y.y" + case 124: +#line 1250 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2934,8 +2958,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 124: -#line 1245 "asn1p_y.y" + case 125: +#line 1256 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2944,8 +2968,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 125: -#line 1251 "asn1p_y.y" + case 126: +#line 1262 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; assert(yyval.a_expr->expr_type == A1TC_INVALID); @@ -2954,10 +2978,10 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 126: -#line 1257 "asn1p_y.y" + case 127: +#line 1268 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->constraints = yyvsp[-4].a_constr; yyval.a_expr->expr_type = ASN_CONSTR_SEQUENCE_OF; @@ -2968,10 +2992,10 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 127: -#line 1267 "asn1p_y.y" + case 128: +#line 1278 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->constraints = yyvsp[-4].a_constr; yyval.a_expr->expr_type = ASN_CONSTR_SET_OF; @@ -2982,21 +3006,21 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 128: -#line 1277 "asn1p_y.y" + case 129: +#line 1288 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->expr_type = ASN_TYPE_ANY; yyval.a_expr->meta_type = AMT_TYPE; } break; - case 129: -#line 1283 "asn1p_y.y" + case 130: +#line 1294 "asn1p_y.y" { int ret; - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->reference = asn1p_ref_new(yylineno); ret = asn1p_ref_add_component(yyval.a_expr->reference, @@ -3007,10 +3031,10 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 130: -#line 1294 "asn1p_y.y" + case 131: +#line 1305 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->reference = yyvsp[0].a_ref; yyval.a_expr->expr_type = A1TC_INSTANCE; @@ -3018,8 +3042,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 131: -#line 1309 "asn1p_y.y" + case 132: +#line 1320 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -3030,8 +3054,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 132: -#line 1317 "asn1p_y.y" + case 133: +#line 1328 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -3044,8 +3068,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 133: -#line 1327 "asn1p_y.y" + case 134: +#line 1338 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -3058,8 +3082,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 134: -#line 1337 "asn1p_y.y" + case 135: +#line 1348 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -3072,8 +3096,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 135: -#line 1347 "asn1p_y.y" + case 136: +#line 1358 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -3084,8 +3108,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 136: -#line 1355 "asn1p_y.y" + case 137: +#line 1366 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[0].a_ref; @@ -3107,8 +3131,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 137: -#line 1377 "asn1p_y.y" + case 138: +#line 1388 "asn1p_y.y" { int ret; yyval.a_ref = asn1p_ref_new(yylineno); @@ -3119,8 +3143,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 138: -#line 1385 "asn1p_y.y" + case 139: +#line 1396 "asn1p_y.y" { int ret; yyval.a_ref = yyvsp[-2].a_ref; @@ -3130,56 +3154,56 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 140: -#line 1398 "asn1p_y.y" + case 141: +#line 1409 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_AmpUppercase; yyval.a_refcomp.name = yyvsp[0].tv_str; } break; - case 141: -#line 1403 "asn1p_y.y" + case 142: +#line 1414 "asn1p_y.y" { yyval.a_refcomp.lex_type = RLT_Amplowercase; yyval.a_refcomp.name = yyvsp[0].tv_str; } break; - case 142: -#line 1412 "asn1p_y.y" + case 143: +#line 1423 "asn1p_y.y" { yyval.a_ref = asn1p_ref_new(yylineno); asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_AmpUppercase); } break; - case 143: -#line 1416 "asn1p_y.y" + case 144: +#line 1427 "asn1p_y.y" { yyval.a_ref = yyval.a_ref; asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_AmpUppercase); } break; - case 144: -#line 1420 "asn1p_y.y" + case 145: +#line 1431 "asn1p_y.y" { yyval.a_ref = yyval.a_ref; asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_Amplowercase); } break; - case 145: -#line 1427 "asn1p_y.y" + case 146: +#line 1438 "asn1p_y.y" { yyval.a_ref = asn1p_ref_new(yylineno); asn1p_ref_add_component(yyval.a_ref, yyvsp[0].tv_str, RLT_CAPITALS); } break; - case 146: -#line 1447 "asn1p_y.y" + case 147: +#line 1458 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; assert(yyval.a_expr->Identifier == NULL); @@ -3189,8 +3213,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 149: -#line 1459 "asn1p_y.y" + case 150: +#line 1470 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -3200,13 +3224,13 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 150: -#line 1466 "asn1p_y.y" + case 151: +#line 1477 "asn1p_y.y" { asn1p_lexer_hack_push_opaque_state(); } break; - case 151: -#line 1466 "asn1p_y.y" + case 152: +#line 1477 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); @@ -3214,8 +3238,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 152: -#line 1471 "asn1p_y.y" + case 153: +#line 1482 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -3223,8 +3247,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 153: -#line 1479 "asn1p_y.y" + case 154: +#line 1490 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -3232,8 +3256,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 154: -#line 1484 "asn1p_y.y" + case 155: +#line 1495 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -3241,38 +3265,38 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 155: -#line 1489 "asn1p_y.y" + case 156: +#line 1500 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B'); checkmem(yyval.a_value); } break; - case 156: -#line 1493 "asn1p_y.y" + case 157: +#line 1504 "asn1p_y.y" { yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H'); checkmem(yyval.a_value); } break; - case 157: -#line 1497 "asn1p_y.y" + case 158: +#line 1508 "asn1p_y.y" { yyval.a_value = yyval.a_value; } break; - case 158: -#line 1500 "asn1p_y.y" + case 159: +#line 1511 "asn1p_y.y" { yyval.a_value = yyvsp[0].a_value; } break; - case 159: -#line 1506 "asn1p_y.y" + case 160: +#line 1517 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3286,8 +3310,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 160: -#line 1517 "asn1p_y.y" + case 161: +#line 1528 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3304,16 +3328,16 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 161: -#line 1535 "asn1p_y.y" + case 162: +#line 1546 "asn1p_y.y" { yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); checkmem(yyval.a_value); } break; - case 162: -#line 1539 "asn1p_y.y" + case 163: +#line 1550 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); @@ -3321,8 +3345,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 163: -#line 1544 "asn1p_y.y" + case 164: +#line 1555 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); @@ -3330,8 +3354,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 164: -#line 1578 "asn1p_y.y" + case 165: +#line 1589 "asn1p_y.y" { yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 1; yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1); @@ -3343,8 +3367,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 165: -#line 1587 "asn1p_y.y" + case 166: +#line 1598 "asn1p_y.y" { int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len; char *p = malloc(newsize + 1); @@ -3359,103 +3383,103 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 166: -#line 1602 "asn1p_y.y" + case 167: +#line 1613 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BOOLEAN; } break; - case 167: -#line 1603 "asn1p_y.y" + case 168: +#line 1614 "asn1p_y.y" { yyval.a_type = ASN_BASIC_NULL; } break; - case 168: -#line 1604 "asn1p_y.y" + case 169: +#line 1615 "asn1p_y.y" { yyval.a_type = ASN_BASIC_REAL; } break; - case 169: -#line 1605 "asn1p_y.y" + case 170: +#line 1616 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; } break; - case 170: -#line 1606 "asn1p_y.y" + case 171: +#line 1617 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OCTET_STRING; } break; - case 171: -#line 1607 "asn1p_y.y" + case 172: +#line 1618 "asn1p_y.y" { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; } break; - case 172: -#line 1608 "asn1p_y.y" + case 173: +#line 1619 "asn1p_y.y" { yyval.a_type = ASN_BASIC_RELATIVE_OID; } break; - case 173: -#line 1609 "asn1p_y.y" + case 174: +#line 1620 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EXTERNAL; } break; - case 174: -#line 1610 "asn1p_y.y" + case 175: +#line 1621 "asn1p_y.y" { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; } break; - case 175: -#line 1611 "asn1p_y.y" + case 176: +#line 1622 "asn1p_y.y" { yyval.a_type = ASN_BASIC_CHARACTER_STRING; } break; - case 176: -#line 1612 "asn1p_y.y" + case 177: +#line 1623 "asn1p_y.y" { yyval.a_type = ASN_BASIC_UTCTime; } break; - case 177: -#line 1613 "asn1p_y.y" + case 178: +#line 1624 "asn1p_y.y" { yyval.a_type = ASN_BASIC_GeneralizedTime; } break; - case 178: -#line 1614 "asn1p_y.y" + case 179: +#line 1625 "asn1p_y.y" { yyval.a_type = yyvsp[0].a_type; } break; - case 179: -#line 1621 "asn1p_y.y" + case 180: +#line 1632 "asn1p_y.y" { yyval.a_type = ASN_BASIC_INTEGER; } break; - case 180: -#line 1622 "asn1p_y.y" + case 181: +#line 1633 "asn1p_y.y" { yyval.a_type = ASN_BASIC_ENUMERATED; } break; - case 181: -#line 1623 "asn1p_y.y" + case 182: +#line 1634 "asn1p_y.y" { yyval.a_type = ASN_BASIC_BIT_STRING; } break; - case 182: -#line 1627 "asn1p_y.y" + case 183: +#line 1638 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->expr_type = yyvsp[0].a_type; yyval.a_expr->meta_type = AMT_TYPE; } break; - case 183: -#line 1633 "asn1p_y.y" + case 184: +#line 1644 "asn1p_y.y" { if(yyvsp[0].a_expr) { yyval.a_expr = yyvsp[0].a_expr; } else { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); } yyval.a_expr->expr_type = yyvsp[-1].a_type; @@ -3463,109 +3487,116 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 184: -#line 1646 "asn1p_y.y" + case 185: +#line 1657 "asn1p_y.y" { yyval.a_type = ASN_STRING_BMPString; } break; - case 185: -#line 1647 "asn1p_y.y" + case 186: +#line 1658 "asn1p_y.y" { yyval.a_type = ASN_STRING_GeneralString; fprintf(stderr, "WARNING: GeneralString is not fully supported\n"); } break; - case 186: -#line 1651 "asn1p_y.y" + case 187: +#line 1662 "asn1p_y.y" { yyval.a_type = ASN_STRING_GraphicString; fprintf(stderr, "WARNING: GraphicString is not fully supported\n"); } break; - case 187: -#line 1655 "asn1p_y.y" + case 188: +#line 1666 "asn1p_y.y" { yyval.a_type = ASN_STRING_IA5String; } break; - case 188: -#line 1656 "asn1p_y.y" + case 189: +#line 1667 "asn1p_y.y" { yyval.a_type = ASN_STRING_ISO646String; } break; - case 189: -#line 1657 "asn1p_y.y" + case 190: +#line 1668 "asn1p_y.y" { yyval.a_type = ASN_STRING_NumericString; } break; - case 190: -#line 1658 "asn1p_y.y" + case 191: +#line 1669 "asn1p_y.y" { yyval.a_type = ASN_STRING_PrintableString; } break; - case 191: -#line 1659 "asn1p_y.y" + case 192: +#line 1670 "asn1p_y.y" { yyval.a_type = ASN_STRING_T61String; fprintf(stderr, "WARNING: T61String is not fully supported\n"); } break; - case 192: -#line 1663 "asn1p_y.y" + case 193: +#line 1674 "asn1p_y.y" { yyval.a_type = ASN_STRING_TeletexString; } break; - case 193: -#line 1664 "asn1p_y.y" + case 194: +#line 1675 "asn1p_y.y" { yyval.a_type = ASN_STRING_UniversalString; } break; - case 194: -#line 1665 "asn1p_y.y" + case 195: +#line 1676 "asn1p_y.y" { yyval.a_type = ASN_STRING_UTF8String; } break; - case 195: -#line 1666 "asn1p_y.y" + case 196: +#line 1677 "asn1p_y.y" { yyval.a_type = ASN_STRING_VideotexString; fprintf(stderr, "WARNING: VideotexString is not fully supported\n"); } break; - case 196: -#line 1670 "asn1p_y.y" + case 197: +#line 1681 "asn1p_y.y" { yyval.a_type = ASN_STRING_VisibleString; } break; - case 197: -#line 1671 "asn1p_y.y" + case 198: +#line 1682 "asn1p_y.y" { yyval.a_type = ASN_STRING_ObjectDescriptor; } break; - case 203: -#line 1683 "asn1p_y.y" + case 204: +#line 1694 "asn1p_y.y" { yyval.a_constr = 0; } break; - case 204: -#line 1684 "asn1p_y.y" + case 205: +#line 1695 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; - case 205: -#line 1690 "asn1p_y.y" + case 207: +#line 1702 "asn1p_y.y" + { + yyval.a_constr = yyvsp[-1].a_constr; + } + break; + + case 208: +#line 1708 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0); } break; - case 206: -#line 1693 "asn1p_y.y" + case 209: +#line 1711 "asn1p_y.y" { /* * This is a special case, for compatibility purposes. @@ -3575,37 +3606,37 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 207: -#line 1703 "asn1p_y.y" + case 210: +#line 1721 "asn1p_y.y" { yyval.a_constr = yyvsp[-1].a_constr; } break; - case 208: -#line 1706 "asn1p_y.y" + case 211: +#line 1724 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr); } break; - case 209: -#line 1712 "asn1p_y.y" + case 212: +#line 1730 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); yyval.a_constr->type = ACT_EL_EXT; } break; - case 210: -#line 1716 "asn1p_y.y" + case 213: +#line 1734 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; - case 211: -#line 1719 "asn1p_y.y" + case 214: +#line 1737 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3614,8 +3645,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 212: -#line 1725 "asn1p_y.y" + case 215: +#line 1743 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -3626,43 +3657,43 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 213: -#line 1736 "asn1p_y.y" + case 216: +#line 1754 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; - case 214: -#line 1739 "asn1p_y.y" + case 217: +#line 1757 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_AEX, yyvsp[0].a_constr, 0); } break; - case 215: -#line 1742 "asn1p_y.y" + case 218: +#line 1760 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr); } break; - case 216: -#line 1745 "asn1p_y.y" + case 219: +#line 1763 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr); } break; - case 217: -#line 1748 "asn1p_y.y" + case 220: +#line 1766 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr); } break; - case 218: -#line 1754 "asn1p_y.y" + case 221: +#line 1772 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -3673,8 +3704,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 219: -#line 1762 "asn1p_y.y" + case 222: +#line 1780 "asn1p_y.y" { int ret; yyval.a_constr = asn1p_constraint_new(yylineno); @@ -3685,8 +3716,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 220: -#line 1770 "asn1p_y.y" + case 223: +#line 1788 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3695,8 +3726,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 221: -#line 1776 "asn1p_y.y" + case 224: +#line 1794 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3705,8 +3736,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 222: -#line 1782 "asn1p_y.y" + case 225: +#line 1800 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3716,8 +3747,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 223: -#line 1789 "asn1p_y.y" + case 226: +#line 1807 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3728,8 +3759,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 224: -#line 1797 "asn1p_y.y" + case 227: +#line 1815 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3740,8 +3771,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 225: -#line 1805 "asn1p_y.y" + case 228: +#line 1823 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3753,73 +3784,29 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 226: -#line 1814 "asn1p_y.y" - { - yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 227: -#line 1817 "asn1p_y.y" - { - yyval.a_constr = yyvsp[0].a_constr; - } - break; - - case 228: -#line 1821 "asn1p_y.y" - { asn1p_lexer_hack_push_opaque_state(); } - break; - case 229: -#line 1821 "asn1p_y.y" +#line 1832 "asn1p_y.y" { - yyval.a_constr = asn1p_constraint_new(yylineno); - checkmem(yyval.a_constr); - yyval.a_constr->type = ACT_CT_CTDBY; - yyval.a_constr->value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); - checkmem(yyval.a_constr->value); - yyval.a_constr->value->type = ATV_UNPARSED; + yyval.a_constr = yyvsp[0].a_constr; } break; case 230: -#line 1832 "asn1p_y.y" - { yyval.a_ctype = ACT_EL_RANGE; } - break; - - case 231: -#line 1833 "asn1p_y.y" - { yyval.a_ctype = ACT_EL_RLRANGE; } - break; - - case 232: -#line 1834 "asn1p_y.y" - { yyval.a_ctype = ACT_EL_LLRANGE; } - break; - - case 233: -#line 1835 "asn1p_y.y" - { yyval.a_ctype = ACT_EL_ULRANGE; } - break; - - case 234: -#line 1839 "asn1p_y.y" +#line 1838 "asn1p_y.y" { yyval.a_ctype = ACT_CT_SIZE; } break; - case 235: -#line 1842 "asn1p_y.y" + case 231: +#line 1841 "asn1p_y.y" { yyval.a_ctype = ACT_CT_FROM; } break; - case 236: -#line 1848 "asn1p_y.y" + case 232: +#line 1847 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(0); checkmem(yyval.a_value); @@ -3827,8 +3814,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 237: -#line 1853 "asn1p_y.y" + case 233: +#line 1852 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(1); checkmem(yyval.a_value); @@ -3836,8 +3823,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 240: -#line 1860 "asn1p_y.y" + case 236: +#line 1859 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3851,8 +3838,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 241: -#line 1874 "asn1p_y.y" + case 237: +#line 1873 "asn1p_y.y" { asn1p_ref_t *ref; int ret; @@ -3866,36 +3853,36 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 242: -#line 1888 "asn1p_y.y" + case 238: +#line 1887 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMP, yyvsp[0].a_constr, 0); } break; - case 243: -#line 1891 "asn1p_y.y" + case 239: +#line 1890 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0); } break; - case 244: -#line 1897 "asn1p_y.y" + case 240: +#line 1896 "asn1p_y.y" { yyval.a_constr = yyvsp[0].a_constr; } break; - case 245: -#line 1900 "asn1p_y.y" + case 241: +#line 1899 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr); } break; - case 246: -#line 1906 "asn1p_y.y" + case 242: +#line 1905 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3904,8 +3891,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 247: -#line 1912 "asn1p_y.y" + case 243: +#line 1911 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3916,53 +3903,99 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 248: -#line 1926 "asn1p_y.y" + case 244: +#line 1925 "asn1p_y.y" { yyval.a_pres = ACPRES_DEFAULT; } break; - case 249: -#line 1927 "asn1p_y.y" + case 245: +#line 1926 "asn1p_y.y" { yyval.a_pres = yyvsp[0].a_pres; } break; - case 250: -#line 1931 "asn1p_y.y" + case 246: +#line 1930 "asn1p_y.y" { yyval.a_pres = ACPRES_PRESENT; } break; - case 251: -#line 1934 "asn1p_y.y" + case 247: +#line 1933 "asn1p_y.y" { yyval.a_pres = ACPRES_ABSENT; } break; - case 252: -#line 1937 "asn1p_y.y" + case 248: +#line 1936 "asn1p_y.y" { yyval.a_pres = ACPRES_OPTIONAL; } break; + case 252: +#line 1951 "asn1p_y.y" + { asn1p_lexer_hack_push_opaque_state(); } + break; + case 253: -#line 1943 "asn1p_y.y" +#line 1951 "asn1p_y.y" { - yyval.a_constr = yyvsp[0].a_constr; + yyval.a_constr = asn1p_constraint_new(yylineno); + checkmem(yyval.a_constr); + yyval.a_constr->type = ACT_CT_CTDBY; + yyval.a_constr->value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0); + checkmem(yyval.a_constr->value); + yyval.a_constr->value->type = ATV_UNPARSED; } break; case 254: -#line 1946 "asn1p_y.y" +#line 1962 "asn1p_y.y" { - yyval.a_constr = yyvsp[0].a_constr; + yyval.a_constr = asn1p_constraint_new(yylineno); + yyval.a_constr->type = ACT_CT_CTNG; + yyval.a_constr->value = asn1p_value_fromtype(yyvsp[0].a_expr); } break; case 255: -#line 1955 "asn1p_y.y" +#line 1970 "asn1p_y.y" + { yyval.a_ctype = ACT_EL_RANGE; } + break; + + case 256: +#line 1971 "asn1p_y.y" + { yyval.a_ctype = ACT_EL_RLRANGE; } + break; + + case 257: +#line 1972 "asn1p_y.y" + { yyval.a_ctype = ACT_EL_LLRANGE; } + break; + + case 258: +#line 1973 "asn1p_y.y" + { yyval.a_ctype = ACT_EL_ULRANGE; } + break; + + case 259: +#line 1976 "asn1p_y.y" + { + yyval.a_constr = yyvsp[0].a_constr; + } + break; + + case 260: +#line 1979 "asn1p_y.y" + { + yyval.a_constr = yyvsp[0].a_constr; + } + break; + + case 261: +#line 1988 "asn1p_y.y" { asn1p_ref_t *ref = asn1p_ref_new(yylineno); asn1p_constraint_t *ct; @@ -3977,15 +4010,15 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 256: -#line 1970 "asn1p_y.y" + case 262: +#line 2003 "asn1p_y.y" { CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr); } break; - case 257: -#line 1976 "asn1p_y.y" + case 263: +#line 2009 "asn1p_y.y" { yyval.a_constr = asn1p_constraint_new(yylineno); checkmem(yyval.a_constr); @@ -3994,8 +4027,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 258: -#line 1982 "asn1p_y.y" + case 264: +#line 2015 "asn1p_y.y" { asn1p_constraint_t *ct; ct = asn1p_constraint_new(yylineno); @@ -4006,8 +4039,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 259: -#line 1996 "asn1p_y.y" + case 265: +#line 2029 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 2); int ret; @@ -4021,8 +4054,8 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 260: -#line 2007 "asn1p_y.y" + case 266: +#line 2040 "asn1p_y.y" { char *p = malloc(strlen(yyvsp[0].tv_str) + 3); int ret; @@ -4037,15 +4070,15 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 261: -#line 2023 "asn1p_y.y" + case 267: +#line 2056 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; } break; - case 262: -#line 2026 "asn1p_y.y" + case 268: +#line 2059 "asn1p_y.y" { int l1 = strlen(yyvsp[-2].tv_str); int l3 = strlen(yyvsp[0].tv_str); @@ -4057,71 +4090,71 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 263: -#line 2044 "asn1p_y.y" + case 269: +#line 2077 "asn1p_y.y" { yyval.a_marker.flags = EM_NOMARK; yyval.a_marker.default_value = 0; } break; - case 264: -#line 2048 "asn1p_y.y" + case 270: +#line 2081 "asn1p_y.y" { yyval.a_marker = yyvsp[0].a_marker; } break; - case 265: -#line 2052 "asn1p_y.y" + case 271: +#line 2085 "asn1p_y.y" { yyval.a_marker.flags = EM_OPTIONAL | EM_INDIRECT; yyval.a_marker.default_value = 0; } break; - case 266: -#line 2056 "asn1p_y.y" + case 272: +#line 2089 "asn1p_y.y" { yyval.a_marker.flags = EM_DEFAULT; yyval.a_marker.default_value = yyvsp[0].a_value; } break; - case 267: -#line 2079 "asn1p_y.y" + case 273: +#line 2112 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); } break; - case 268: -#line 2083 "asn1p_y.y" + case 274: +#line 2116 "asn1p_y.y" { yyval.a_expr = yyvsp[-1].a_expr; } break; - case 269: -#line 2089 "asn1p_y.y" + case 275: +#line 2122 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); } break; - case 270: -#line 2094 "asn1p_y.y" + case 276: +#line 2127 "asn1p_y.y" { yyval.a_expr = yyvsp[-2].a_expr; asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr); } break; - case 271: -#line 2101 "asn1p_y.y" + case 277: +#line 2134 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; @@ -4129,10 +4162,10 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 272: -#line 2108 "asn1p_y.y" + case 278: +#line 2141 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; @@ -4141,10 +4174,10 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 273: -#line 2116 "asn1p_y.y" + case 279: +#line 2149 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; @@ -4153,10 +4186,10 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 274: -#line 2124 "asn1p_y.y" + case 280: +#line 2157 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->expr_type = A1TC_UNIVERVAL; yyval.a_expr->meta_type = AMT_VALUE; @@ -4164,10 +4197,10 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 275: -#line 2131 "asn1p_y.y" + case 281: +#line 2164 "asn1p_y.y" { - yyval.a_expr = asn1p_expr_new(yylineno); + yyval.a_expr = NEW_EXPR(); checkmem(yyval.a_expr); yyval.a_expr->Identifier = strdup("..."); checkmem(yyval.a_expr->Identifier); @@ -4176,129 +4209,129 @@ yyparse (YYPARSE_PARAM_ARG) } break; - case 276: -#line 2142 "asn1p_y.y" + case 282: +#line 2175 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); } break; - case 277: -#line 2146 "asn1p_y.y" + case 283: +#line 2179 "asn1p_y.y" { yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int); checkmem(yyval.a_value); } break; - case 279: -#line 2154 "asn1p_y.y" + case 285: +#line 2187 "asn1p_y.y" { yyval.a_value = asn1p_value_fromdouble(yyvsp[0].a_dbl); checkmem(yyval.a_value); } break; - case 280: -#line 2185 "asn1p_y.y" + case 286: +#line 2218 "asn1p_y.y" { memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); } break; - case 281: -#line 2186 "asn1p_y.y" + case 287: +#line 2219 "asn1p_y.y" { yyval.a_tag = yyvsp[0].a_tag; } break; - case 282: -#line 2190 "asn1p_y.y" + case 288: +#line 2223 "asn1p_y.y" { yyval.a_tag = yyvsp[-1].a_tag; yyval.a_tag.tag_mode = yyvsp[0].a_tag.tag_mode; } break; - case 283: -#line 2197 "asn1p_y.y" + case 289: +#line 2230 "asn1p_y.y" { yyval.a_tag = yyvsp[-2].a_tag; yyval.a_tag.tag_value = yyvsp[-1].a_int; } break; - case 284: -#line 2203 "asn1p_y.y" + case 290: +#line 2236 "asn1p_y.y" { yyval.a_tag.tag_class = TC_CONTEXT_SPECIFIC; } break; - case 285: -#line 2204 "asn1p_y.y" + case 291: +#line 2237 "asn1p_y.y" { yyval.a_tag.tag_class = TC_UNIVERSAL; } break; - case 286: -#line 2205 "asn1p_y.y" + case 292: +#line 2238 "asn1p_y.y" { yyval.a_tag.tag_class = TC_APPLICATION; } break; - case 287: -#line 2206 "asn1p_y.y" + case 293: +#line 2239 "asn1p_y.y" { yyval.a_tag.tag_class = TC_PRIVATE; } break; - case 288: -#line 2210 "asn1p_y.y" + case 294: +#line 2243 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_DEFAULT; } break; - case 289: -#line 2211 "asn1p_y.y" + case 295: +#line 2244 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_IMPLICIT; } break; - case 290: -#line 2212 "asn1p_y.y" + case 296: +#line 2245 "asn1p_y.y" { yyval.a_tag.tag_mode = TM_EXPLICIT; } break; - case 291: -#line 2216 "asn1p_y.y" + case 297: +#line 2249 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; } break; - case 292: -#line 2220 "asn1p_y.y" + case 298: +#line 2253 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; } break; - case 293: -#line 2228 "asn1p_y.y" + case 299: +#line 2261 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; } break; - case 294: -#line 2235 "asn1p_y.y" + case 300: +#line 2268 "asn1p_y.y" { yyval.tv_str = 0; } break; - case 295: -#line 2236 "asn1p_y.y" + case 301: +#line 2269 "asn1p_y.y" { yyval.tv_str = yyvsp[0].tv_str; } break; - case 296: -#line 2242 "asn1p_y.y" + case 302: +#line 2275 "asn1p_y.y" { checkmem(yyvsp[0].tv_str); yyval.tv_str = yyvsp[0].tv_str; @@ -4309,7 +4342,7 @@ yyparse (YYPARSE_PARAM_ARG) } /* Line 1016 of /usr/local/share/bison/yacc.c. */ -#line 4313 "asn1p_y.c" +#line 4346 "asn1p_y.c" yyvsp -= yylen; yyssp -= yylen; @@ -4528,7 +4561,7 @@ yyparse (YYPARSE_PARAM_ARG) } -#line 2248 "asn1p_y.y" +#line 2281 "asn1p_y.y" diff --git a/libasn1parser/asn1p_y.h b/libasn1parser/asn1p_y.h index 19de33468..ee3af65b2 100644 --- a/libasn1parser/asn1p_y.h +++ b/libasn1parser/asn1p_y.h @@ -245,7 +245,7 @@ #ifndef YYSTYPE -#line 85 "asn1p_y.y" +#line 88 "asn1p_y.y" typedef union { asn1p_t *a_grammar; asn1p_module_flags_e a_module_flags; diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index b252a7316..9baa9ce68 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -37,6 +37,9 @@ static struct AssignedIdentifier *saved_aid; static asn1p_value_t *_convert_bitstring2binary(char *str, int base); static void _fixup_anonymous_identifier(asn1p_expr_t *expr); +static asn1p_module_t *currentModule; +#define NEW_EXPR() (asn1p_expr_new(yylineno, currentModule)) + #define checkmem(ptr) do { \ if(!(ptr)) \ return yyerror("Memory failure"); \ @@ -255,6 +258,7 @@ static void _fixup_anonymous_identifier(asn1p_expr_t *expr); %type ImportsElement %type ExportsElement %type ExtensionAndException +%type Type %type TypeDeclaration %type TypeDeclarationSet %type ComplexTypeReference @@ -266,7 +270,6 @@ static void _fixup_anonymous_identifier(asn1p_expr_t *expr); %type DefinedObjectClass %type ClassField %type ObjectClass -%type Type %type DataTypeReference /* Type1 ::= Type2 */ %type DefinedType %type ValueSet /* {a|b|c}*/ @@ -307,13 +310,17 @@ static void _fixup_anonymous_identifier(asn1p_expr_t *expr); %type TagClass TagTypeValue TagPlicit %type optTag /* [UNIVERSAL 0] IMPLICIT */ %type optConstraints -%type Constraints +%type Constraint +%type SubtypeConstraint +%type GeneralConstraint %type SetOfConstraints %type ElementSetSpecs /* 1..2,...,3 */ %type ElementSetSpec /* 1..2,...,3 */ %type ConstraintSubtypeElement /* 1..2 */ %type SimpleTableConstraint +%type UserDefinedConstraint %type TableConstraint +%type ContentsConstraint %type InnerTypeConstraint %type WithComponentsList %type WithComponentsElement @@ -368,23 +375,27 @@ ModuleList: */ ModuleDefinition: - TypeRefName optObjectIdentifier TOK_DEFINITIONS + TypeRefName { currentModule = asn1p_module_new(); } + optObjectIdentifier TOK_DEFINITIONS optModuleDefinitionFlags TOK_PPEQ TOK_BEGIN optModuleBody TOK_END { - if($7) { - $$ = $7; + $$ = currentModule; + + if($8) { + asn1p_module_t tmp = *($$); + *($$) = *($8); + *($8) = tmp; + asn1p_module_free($8); } else { /* There's a chance that a module is just plain empty */ - $$ = asn1p_module_new(); } - checkmem($$); $$->ModuleName = $1; - $$->module_oid = $2; - $$->module_flags = $4; + $$->module_oid = $3; + $$->module_flags = $5; } ; @@ -649,19 +660,19 @@ ImportsList: ImportsElement: TypeRefName { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->Identifier = $1; $$->expr_type = A1TC_REFERENCE; } | TypeRefName '{' '}' { /* Completely equivalent to above */ - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->Identifier = $1; $$->expr_type = A1TC_REFERENCE; } | Identifier { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->Identifier = $1; $$->expr_type = A1TC_REFERENCE; @@ -710,19 +721,19 @@ ExportsBody: ExportsElement: TypeRefName { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->Identifier = $1; $$->expr_type = A1TC_EXPORTVAR; } | TypeRefName '{' '}' { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->Identifier = $1; $$->expr_type = A1TC_EXPORTVAR; } | Identifier { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->Identifier = $1; $$->expr_type = A1TC_EXPORTVAR; @@ -757,7 +768,7 @@ DefinedType: * "Type" */ | ComplexTypeReference { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->reference = $1; $$->expr_type = A1TC_REFERENCE; @@ -767,7 +778,7 @@ DefinedType: * A parameterized assignment. */ | ComplexTypeReference '{' ActualParameterList '}' { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->reference = $1; $$->rhs_pspecs = $3; @@ -880,7 +891,7 @@ ParameterArgumentName: ActualParameterList: ActualParameter { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); asn1p_expr_add($$, $1); } @@ -895,7 +906,7 @@ ActualParameter: $$ = $1; } | SimpleValue { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->Identifier = "?"; $$->expr_type = A1TC_REFERENCE; @@ -904,7 +915,7 @@ ActualParameter: } | Identifier { asn1p_ref_t *ref; - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->Identifier = $1; $$->expr_type = A1TC_REFERENCE; @@ -914,7 +925,7 @@ ActualParameter: $$->value = asn1p_value_fromref(ref, 0); } | ValueSet { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); $$->expr_type = A1TC_VALUESET; $$->meta_type = AMT_VALUESET; $$->constraints = $1; @@ -923,7 +934,7 @@ ActualParameter: /* | '{' ActualParameter '}' { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); asn1p_expr_add($$, $2); $$->expr_type = A1TC_PARAMETRIZED; @@ -936,12 +947,12 @@ ActualParameter: * A collection of constructed data type members. */ optComponentTypeLists: - { $$ = asn1p_expr_new(yylineno); } + { $$ = NEW_EXPR(); } | ComponentTypeLists { $$ = $1; }; ComponentTypeLists: ComponentType { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); asn1p_expr_add($$, $1); } @@ -966,7 +977,7 @@ ComponentType: _fixup_anonymous_identifier($$); } | TOK_COMPONENTS TOK_OF Type { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->meta_type = $3->meta_type; $$->expr_type = A1TC_COMPONENTS_OF; @@ -979,7 +990,7 @@ ComponentType: AlternativeTypeLists: AlternativeType { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); asn1p_expr_add($$, $1); } @@ -1021,7 +1032,7 @@ optUnique: FieldSpec: ClassField { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->expr_type = A1TC_CLASSDEF; $$->meta_type = AMT_OBJECTCLASS; @@ -1038,7 +1049,7 @@ ClassField: /* TypeFieldSpec ::= typefieldreference TypeOptionalitySpec? */ TOK_typefieldreference optMarker { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->Identifier = $1; $$->meta_type = AMT_OBJECTFIELD; @@ -1048,7 +1059,7 @@ ClassField: /* FixedTypeValueFieldSpec ::= valuefieldreference Type UNIQUE ? ValueOptionalitySpec ? */ | TOK_valuefieldreference Type optUnique optMarker { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); $$->Identifier = $1; $$->meta_type = AMT_OBJECTFIELD; $$->expr_type = A1TC_CLASSFIELD_FTVFS; /* FixedTypeValueFieldSpec */ @@ -1059,7 +1070,7 @@ ClassField: /* VariableTypeValueFieldSpec ::= valuefieldreference FieldName ValueOptionalitySpec ? */ | TOK_valuefieldreference FieldName optMarker { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); $$->Identifier = $1; $$->meta_type = AMT_OBJECTFIELD; $$->expr_type = A1TC_CLASSFIELD_VTVFS; @@ -1069,7 +1080,7 @@ ClassField: /* ObjectFieldSpec ::= objectfieldreference DefinedObjectClass ObjectOptionalitySpec ? */ | TOK_valuefieldreference DefinedObjectClass optMarker { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->Identifier = $1; $$->reference = $2; @@ -1080,7 +1091,7 @@ ClassField: /* VariableTypeValueSetFieldSpec ::= valuesetfieldreference FieldName ValueOptionalitySpec ? */ | TOK_typefieldreference FieldName optMarker { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); $$->Identifier = $1; $$->meta_type = AMT_OBJECTFIELD; $$->expr_type = A1TC_CLASSFIELD_VTVSFS; @@ -1090,7 +1101,7 @@ ClassField: /* FixedTypeValueSetFieldSpec ::= valuesetfieldreference Type ValueSetOptionalitySpec ? */ | TOK_typefieldreference Type optMarker { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->Identifier = $1; $$->meta_type = AMT_OBJECTFIELD; @@ -1101,7 +1112,7 @@ ClassField: /* ObjectSetFieldSpec ::= objectsetfieldreference DefinedObjectClass ObjectOptionalitySpec ? */ | TOK_typefieldreference DefinedObjectClass optMarker { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->Identifier = $1; $$->reference = $2; @@ -1157,7 +1168,7 @@ WithSyntaxToken: ExtensionAndException: TOK_ThreeDots { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->Identifier = strdup("..."); checkmem($$->Identifier); @@ -1165,7 +1176,7 @@ ExtensionAndException: $$->meta_type = AMT_TYPE; } | TOK_ThreeDots '!' DefinedValue { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->Identifier = strdup("..."); checkmem($$->Identifier); @@ -1174,7 +1185,7 @@ ExtensionAndException: $$->meta_type = AMT_TYPE; } | TOK_ThreeDots '!' SignedNumber { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->Identifier = strdup("..."); $$->value = $3; @@ -1255,7 +1266,7 @@ TypeDeclarationSet: $$->meta_type = AMT_TYPE; } | TOK_SEQUENCE optConstraints TOK_OF optIdentifier optTag TypeDeclaration { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->constraints = $2; $$->expr_type = ASN_CONSTR_SEQUENCE_OF; @@ -1265,7 +1276,7 @@ TypeDeclarationSet: asn1p_expr_add($$, $6); } | TOK_SET optConstraints TOK_OF optIdentifier optTag TypeDeclaration { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->constraints = $2; $$->expr_type = ASN_CONSTR_SET_OF; @@ -1275,14 +1286,14 @@ TypeDeclarationSet: asn1p_expr_add($$, $6); } | TOK_ANY { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->expr_type = ASN_TYPE_ANY; $$->meta_type = AMT_TYPE; } | TOK_ANY TOK_DEFINED TOK_BY Identifier { int ret; - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->reference = asn1p_ref_new(yylineno); ret = asn1p_ref_add_component($$->reference, @@ -1292,7 +1303,7 @@ TypeDeclarationSet: $$->meta_type = AMT_TYPE; } | TOK_INSTANCE TOK_OF ComplexTypeReference { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->reference = $3; $$->expr_type = A1TC_INSTANCE; @@ -1625,7 +1636,7 @@ BasicTypeId_UniverationCompatible: BasicType: BasicTypeId { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->expr_type = $1; $$->meta_type = AMT_TYPE; @@ -1634,7 +1645,7 @@ BasicType: if($2) { $$ = $2; } else { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); } $$->expr_type = $1; @@ -1681,12 +1692,19 @@ Except: TOK_EXCEPT; optConstraints: { $$ = 0; } - | Constraints { + | Constraint { $$ = $1; } ; -Constraints: +Constraint: + SubtypeConstraint + | '(' GeneralConstraint ')' { + $$ = $2; + } + ; + +SubtypeConstraint: SetOfConstraints { CONSTRAINT_INSERT($$, ACT_CA_SET, $1, 0); } @@ -1811,28 +1829,9 @@ ConstraintSubtypeElement: $$->range_start->type = ATV_MIN; $$->range_stop->type = ATV_MAX; } - | TableConstraint { - $$ = $1; - } | InnerTypeConstraint { $$ = $1; } - | TOK_CONSTRAINED TOK_BY '{' - { asn1p_lexer_hack_push_opaque_state(); } Opaque /* '}' */ { - $$ = asn1p_constraint_new(yylineno); - checkmem($$); - $$->type = ACT_CT_CTDBY; - $$->value = asn1p_value_frombuf($5.buf, $5.len, 0); - checkmem($$->value); - $$->value->type = ATV_UNPARSED; - } - ; - -ConstraintRangeSpec: - TOK_TwoDots { $$ = ACT_EL_RANGE; } - | TOK_TwoDots '<' { $$ = ACT_EL_RLRANGE; } - | '<' TOK_TwoDots { $$ = ACT_EL_LLRANGE; } - | '<' TOK_TwoDots '<' { $$ = ACT_EL_ULRANGE; } ; ConstraintSpec: @@ -1939,6 +1938,40 @@ PresenceConstraint: } ; + +/* X.682 */ +GeneralConstraint: + UserDefinedConstraint + | TableConstraint + | ContentsConstraint + ; + +UserDefinedConstraint: + TOK_CONSTRAINED TOK_BY '{' + { asn1p_lexer_hack_push_opaque_state(); } Opaque /* '}' */ { + $$ = asn1p_constraint_new(yylineno); + checkmem($$); + $$->type = ACT_CT_CTDBY; + $$->value = asn1p_value_frombuf($5.buf, $5.len, 0); + checkmem($$->value); + $$->value->type = ATV_UNPARSED; + } + ; + +ContentsConstraint: + TOK_CONTAINING Type { + $$ = asn1p_constraint_new(yylineno); + $$->type = ACT_CT_CTNG; + $$->value = asn1p_value_fromtype($2); + } + ; + +ConstraintRangeSpec: + TOK_TwoDots { $$ = ACT_EL_RANGE; } + | TOK_TwoDots '<' { $$ = ACT_EL_RLRANGE; } + | '<' TOK_TwoDots { $$ = ACT_EL_LLRANGE; } + | '<' TOK_TwoDots '<' { $$ = ACT_EL_ULRANGE; } + ; TableConstraint: SimpleTableConstraint { $$ = $1; @@ -2077,7 +2110,7 @@ optUniverationDefinition: UniverationDefinition: '{' '}' { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); } | '{' UniverationList '}' { @@ -2087,7 +2120,7 @@ UniverationDefinition: UniverationList: UniverationElement { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); asn1p_expr_add($$, $1); } @@ -2099,14 +2132,14 @@ UniverationList: UniverationElement: Identifier { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->expr_type = A1TC_UNIVERVAL; $$->meta_type = AMT_VALUE; $$->Identifier = $1; } | Identifier '(' SignedNumber ')' { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->expr_type = A1TC_UNIVERVAL; $$->meta_type = AMT_VALUE; @@ -2114,7 +2147,7 @@ UniverationElement: $$->value = $3; } | Identifier '(' DefinedValue ')' { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->expr_type = A1TC_UNIVERVAL; $$->meta_type = AMT_VALUE; @@ -2122,14 +2155,14 @@ UniverationElement: $$->value = $3; } | SignedNumber { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->expr_type = A1TC_UNIVERVAL; $$->meta_type = AMT_VALUE; $$->value = $1; } | TOK_ThreeDots { - $$ = asn1p_expr_new(yylineno); + $$ = NEW_EXPR(); checkmem($$); $$->Identifier = strdup("..."); checkmem($$->Identifier); diff --git a/libasn1parser/asn1parser.c b/libasn1parser/asn1parser.c index a2e2ae28a..7d9a88d77 100644 --- a/libasn1parser/asn1parser.c +++ b/libasn1parser/asn1parser.c @@ -150,45 +150,14 @@ _asn1p_set_flags(enum asn1p_flags flags) { return 0; } -/* - * Perform last touches. - */ -static void -_asn1p_apply_module2expr(asn1p_expr_t *expr, asn1p_module_t *mod) { - asn1p_expr_t *e; - - expr->module = mod; /* This is a useful thing */ - - /* - * Do it to children also. - */ - TQ_FOR(e, &(expr->members), next) { - _asn1p_apply_module2expr(e, mod); - } - - /* - * Do to parameterization. - */ - if(expr->rhs_pspecs) { - TQ_FOR(e, &(expr->rhs_pspecs->members), next) { - _asn1p_apply_module2expr(e, mod); - } - } -} - static int _asn1p_fix_modules(asn1p_t *a, const char *fname) { asn1p_module_t *mod; TQ_FOR(mod, &(a->modules), mod_next) { - asn1p_expr_t *expr; - mod->source_file_name = strdup(fname); if(mod->source_file_name == NULL) return -1; - - TQ_FOR(expr, &(mod->members), next) { - _asn1p_apply_module2expr(expr, mod); - } + mod->asn1p = a; } return 0; } diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index 47cfb1f88..3462d1afe 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -190,6 +190,11 @@ asn1print_value(asn1p_value_t *val, enum asn1print_flags flags) { case ATV_REAL: printf("%f", val->value.v_double); return 0; + case ATV_TYPE: + asn1print_expr(val->value.v_type->module->asn1p, + val->value.v_type->module, + val->value.v_type, flags, 0); + return 0; case ATV_INTEGER: printf("%" PRIdASN, val->value.v_integer); return 0; @@ -349,10 +354,19 @@ asn1print_constraint(asn1p_constraint_t *ct, enum asn1print_flags flags) { } break; case ACT_CT_CTDBY: - printf("CONSTRAINED BY "); + printf("(CONSTRAINED BY "); assert(ct->value->type == ATV_UNPARSED); fwrite(ct->value->value.string.buf, 1, ct->value->value.string.size, stdout); + printf(")"); + break; + case ACT_CT_CTNG: + printf("(CONTAINING "); + asn1print_expr(ct->value->value.v_type->module->asn1p, + ct->value->value.v_type->module, + ct->value->value.v_type, + flags, 1); + printf(")"); break; case ACT_CA_SET: symno++; case ACT_CA_CRC: symno++; @@ -364,6 +378,7 @@ asn1print_constraint(asn1p_constraint_t *ct, enum asn1print_flags flags) { char *symtable[] = { " EXCEPT ", " ^ ", " | ", ",", "", "(" }; unsigned int i; + if(ct->type == ACT_CA_CRC) fputs("(", stdout); for(i = 0; i < ct->el_count; i++) { if(i) fputs(symtable[symno], stdout); if(ct->type == ACT_CA_CRC) fputs("{", stdout); @@ -373,6 +388,7 @@ asn1print_constraint(asn1p_constraint_t *ct, enum asn1print_flags flags) { && ct->type == ACT_CA_SET) fputs(")", stdout); } + if(ct->type == ACT_CA_CRC) fputs(")", stdout); } break; case ACT_CA_AEX: From fbceb5040dc3ac1bb385080056e79d4b140bd6b3 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 17 Sep 2006 06:31:08 +0000 Subject: [PATCH 1201/1469] XER reference types encoding error git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1201 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.makefile.regen | 17 + examples/sample.source.MHEG5/Makefile | 17 + libasn1compiler/asn1c_C.c | 6 +- tests/37-indirect-choice-OK.asn1 | 3 + tests/37-indirect-choice-OK.asn1.-EF | 6 + tests/37-indirect-choice-OK.asn1.-P | 819 ++++++++++++++++++++++++++ 6 files changed, 867 insertions(+), 1 deletion(-) create mode 100644 tests/37-indirect-choice-OK.asn1.-P diff --git a/examples/sample.makefile.regen b/examples/sample.makefile.regen index ba0351483..95c177945 100755 --- a/examples/sample.makefile.regen +++ b/examples/sample.makefile.regen @@ -65,6 +65,23 @@ cat Makefile.am.sample \ echo ' diff ./.tmp.1.$$ ./.tmp.2.$$ || exit 2; \' echo ' rm -f ./.tmp.[12].$$; \' echo ' done; fi' + echo " @if test -f ./sample-${ASN1PDU}-1.xer ; then \\" + echo " for f in ./sample-${ASN1PDU}-*.xer; do \\" + echo ' echo "Recoding $$f into DER and back..."; \' + echo ' ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$ || exit 2; \' + echo ' ./${TARGET} -iber -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \' + echo ' diff $$f ./.tmp.2.$$ || exit 2; \' + echo ' rm -f ./.tmp.[12].$$; \' + echo ' done; fi' + echo " @if test -f ./sample-${ASN1PDU}-1.per ; then \\" + echo " for f in ./sample-${ASN1PDU}-*.per; do \\" + echo ' echo "Recoding $$f into DER into XER and back..."; \' + echo ' ./${TARGET} -iper -oder $$f > ./.tmp.1.$$ || exit 2; \' + echo ' ./${TARGET} -ider -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \' + echo ' ./${TARGET} -ixer -oper ./.tmp.2.$$ > ./.tmp.1.$$ || exit 2; \' + echo ' diff $$f ./.tmp.1.$$ || exit 2; \' + echo ' rm -f ./.tmp.[12].$$; \' + echo ' done; fi' echo ' @echo ================' echo ' @echo All tests passed' echo ' @echo ================' diff --git a/examples/sample.source.MHEG5/Makefile b/examples/sample.source.MHEG5/Makefile index 8eea2448c..4a4f48fa8 100644 --- a/examples/sample.source.MHEG5/Makefile +++ b/examples/sample.source.MHEG5/Makefile @@ -498,6 +498,23 @@ check: ${TARGET} diff ./.tmp.1.$$ ./.tmp.2.$$ || exit 2; \ rm -f ./.tmp.[12].$$; \ done; fi + @if test -f ./sample-InterchangedObject-1.xer ; then \ + for f in ./sample-InterchangedObject-*.xer; do \ + echo "Recoding $$f into DER and back..."; \ + ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$ || exit 2; \ + ./${TARGET} -iber -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ + diff $$f ./.tmp.2.$$ || exit 2; \ + rm -f ./.tmp.[12].$$; \ + done; fi + @if test -f ./sample-InterchangedObject-1.per ; then \ + for f in ./sample-InterchangedObject-*.per; do \ + echo "Recoding $$f into DER into XER and back..."; \ + ./${TARGET} -iper -oder $$f > ./.tmp.1.$$ || exit 2; \ + ./${TARGET} -ider -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ + ./${TARGET} -ixer -oper ./.tmp.2.$$ > ./.tmp.1.$$ || exit 2; \ + diff $$f ./.tmp.1.$$ || exit 2; \ + rm -f ./.tmp.[12].$$; \ + done; fi @echo ================ @echo All tests passed @echo ================ diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 3ebd41796..18879d18c 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -2193,9 +2193,12 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { */ static int emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_count, int all_tags_count, int elements_count, enum etd_spec spec) { + asn1p_expr_t *terminal; int using_type_name = 0; char *p = MKID(expr); + terminal = asn1f_find_terminal_type_ex(arg->asn, expr); + if((arg->flags & A1C_GEN_PER) && (expr->constraints || expr->expr_type == ASN_BASIC_ENUMERATED @@ -2255,7 +2258,8 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ "use \"-gen-PER\" to enable */\n"); } - if(expr->expr_type == ASN_CONSTR_CHOICE) { + if(!terminal || terminal->expr_type == ASN_CONSTR_CHOICE) { + //if(expr->expr_type == ASN_CONSTR_CHOICE) { OUT("CHOICE_outmost_tag,\n"); } else { OUT("0,\t/* Use generic outmost tag fetcher */\n"); diff --git a/tests/37-indirect-choice-OK.asn1 b/tests/37-indirect-choice-OK.asn1 index 612479058..86b3b6656 100644 --- a/tests/37-indirect-choice-OK.asn1 +++ b/tests/37-indirect-choice-OK.asn1 @@ -31,5 +31,8 @@ BEGIN } Choice3 ::= [3] EXPLICIT Choice2 -- tags [3] [2] + Choice4 ::= [4] IMPLICIT Choice2 -- tags [4] + Choice5 ::= Choice2 -- tags [2] + Choice6 ::= Choice1 -- tags END diff --git a/tests/37-indirect-choice-OK.asn1.-EF b/tests/37-indirect-choice-OK.asn1.-EF index 896681567..b4031a8cc 100644 --- a/tests/37-indirect-choice-OK.asn1.-EF +++ b/tests/37-indirect-choice-OK.asn1.-EF @@ -24,4 +24,10 @@ Choice2 ::= [2] EXPLICIT CHOICE { Choice3 ::= [3] EXPLICIT Choice2 +Choice4 ::= [4] IMPLICIT Choice2 + +Choice5 ::= Choice2 + +Choice6 ::= Choice1 + END diff --git a/tests/37-indirect-choice-OK.asn1.-P b/tests/37-indirect-choice-OK.asn1.-P new file mode 100644 index 000000000..48e97aec4 --- /dev/null +++ b/tests/37-indirect-choice-OK.asn1.-P @@ -0,0 +1,819 @@ + +/*** <<< INCLUDES [T] >>> ***/ + +#include +#include +#include "Choice1.h" +#include "Choice2.h" +#include + +/*** <<< DEPS [T] >>> ***/ + +typedef enum T_PR { + T_PR_NOTHING, /* No components present */ + T_PR_t_a, + T_PR_t_b, + T_PR_t_c, + T_PR_t_d +} T_PR; + +/*** <<< TYPE-DECLS [T] >>> ***/ + +typedef struct T { + T_PR present; + union T_u { + INTEGER_t t_a; + OCTET_STRING_t t_b; + Choice1_t t_c; + Choice2_t t_d; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} T_t; + +/*** <<< FUNC-DECLS [T] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_T; + +/*** <<< STAT-DEFS [T] >>> ***/ + +static asn_TYPE_member_t asn_MBR_T_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct T, choice.t_a), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = &asn_DEF_INTEGER, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "t-a" + }, + { ATF_NOFLAGS, 0, offsetof(struct T, choice.t_b), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + .tag_mode = 0, + .type = &asn_DEF_OCTET_STRING, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "t-b" + }, + { ATF_NOFLAGS, 0, offsetof(struct T, choice.t_c), + .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + .tag_mode = +1, /* EXPLICIT tag at current level */ + .type = &asn_DEF_Choice1, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "t-c" + }, + { ATF_NOFLAGS, 0, offsetof(struct T, choice.t_d), + .tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_Choice2, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "t-d" + }, +}; +static asn_TYPE_tag2member_t asn_MAP_T_tag2el_1[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* t-a at 15 */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 1, 0, 0 }, /* t-b at 16 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 2, 0, 0 }, /* t-c at 17 */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* t-d at 19 */ +}; +static asn_CHOICE_specifics_t asn_SPC_T_specs_1 = { + sizeof(struct T), + offsetof(struct T, _asn_ctx), + offsetof(struct T, present), + sizeof(((struct T *)0)->present), + asn_MAP_T_tag2el_1, + 4, /* Count of tags in the map */ + .canonical_order = 0, + .ext_start = -1 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_T = { + "T", + "T", + CHOICE_free, + CHOICE_print, + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_decode_xer, + CHOICE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + CHOICE_outmost_tag, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + 0, /* No PER visible constraints */ + asn_MBR_T_1, + 4, /* Elements count */ + &asn_SPC_T_specs_1 /* Additional specs */ +}; + + +/*** <<< INCLUDES [Choice1] >>> ***/ + +#include +#include +#include + +/*** <<< DEPS [Choice1] >>> ***/ + +typedef enum Choice1_PR { + Choice1_PR_NOTHING, /* No components present */ + Choice1_PR_c_a, + Choice1_PR_c_b +} Choice1_PR; + +/*** <<< TYPE-DECLS [Choice1] >>> ***/ + +typedef struct Choice1 { + Choice1_PR present; + union Choice1_u { + OCTET_STRING_t c_a; + INTEGER_t c_b; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} Choice1_t; + +/*** <<< FUNC-DECLS [Choice1] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Choice1; + +/*** <<< STAT-DEFS [Choice1] >>> ***/ + +static asn_TYPE_member_t asn_MBR_Choice1_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct Choice1, choice.c_a), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + .tag_mode = 0, + .type = &asn_DEF_OCTET_STRING, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "c-a" + }, + { ATF_NOFLAGS, 0, offsetof(struct Choice1, choice.c_b), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = &asn_DEF_INTEGER, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "c-b" + }, +}; +static asn_TYPE_tag2member_t asn_MAP_Choice1_tag2el_1[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* c-b at 24 */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 0, 0, 0 } /* c-a at 22 */ +}; +static asn_CHOICE_specifics_t asn_SPC_Choice1_specs_1 = { + sizeof(struct Choice1), + offsetof(struct Choice1, _asn_ctx), + offsetof(struct Choice1, present), + sizeof(((struct Choice1 *)0)->present), + asn_MAP_Choice1_tag2el_1, + 2, /* Count of tags in the map */ + .canonical_order = 0, + .ext_start = -1 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_Choice1 = { + "Choice1", + "Choice1", + CHOICE_free, + CHOICE_print, + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_decode_xer, + CHOICE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + CHOICE_outmost_tag, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + 0, /* No PER visible constraints */ + asn_MBR_Choice1_1, + 2, /* Elements count */ + &asn_SPC_Choice1_specs_1 /* Additional specs */ +}; + + +/*** <<< INCLUDES [Choice2] >>> ***/ + +#include +#include +#include "Choice1.h" +#include + +/*** <<< DEPS [Choice2] >>> ***/ + +typedef enum Choice2_PR { + Choice2_PR_NOTHING, /* No components present */ + Choice2_PR_c_a, + Choice2_PR_c_b, + Choice2_PR_c_d, + Choice2_PR_c_e +} Choice2_PR; + +/*** <<< TYPE-DECLS [Choice2] >>> ***/ + +typedef struct Choice2 { + Choice2_PR present; + union Choice2_u { + OCTET_STRING_t c_a; + INTEGER_t c_b; + Choice1_t c_d; + Choice1_t c_e; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} Choice2_t; + +/*** <<< FUNC-DECLS [Choice2] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Choice2; + +/*** <<< STAT-DEFS [Choice2] >>> ***/ + +static asn_TYPE_member_t asn_MBR_Choice2_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct Choice2, choice.c_a), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + .tag_mode = 0, + .type = &asn_DEF_OCTET_STRING, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "c-a" + }, + { ATF_NOFLAGS, 0, offsetof(struct Choice2, choice.c_b), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = &asn_DEF_INTEGER, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "c-b" + }, + { ATF_NOFLAGS, 0, offsetof(struct Choice2, choice.c_d), + .tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + .tag_mode = +1, /* EXPLICIT tag at current level */ + .type = &asn_DEF_Choice1, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "c-d" + }, + { ATF_NOFLAGS, 0, offsetof(struct Choice2, choice.c_e), + .tag = (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + .tag_mode = +1, /* EXPLICIT tag at current level */ + .type = &asn_DEF_Choice1, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "c-e" + }, +}; +static ber_tlv_tag_t asn_DEF_Choice2_tags_1[] = { + (ASN_TAG_CLASS_CONTEXT | (2 << 2)) +}; +static asn_TYPE_tag2member_t asn_MAP_Choice2_tag2el_1[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* c-b at 28 */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 0, 0, 0 }, /* c-a at 27 */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* c-d at 29 */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 3, 0, 0 } /* c-e at 31 */ +}; +static asn_CHOICE_specifics_t asn_SPC_Choice2_specs_1 = { + sizeof(struct Choice2), + offsetof(struct Choice2, _asn_ctx), + offsetof(struct Choice2, present), + sizeof(((struct Choice2 *)0)->present), + asn_MAP_Choice2_tag2el_1, + 4, /* Count of tags in the map */ + .canonical_order = 0, + .ext_start = -1 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_Choice2 = { + "Choice2", + "Choice2", + CHOICE_free, + CHOICE_print, + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_decode_xer, + CHOICE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + CHOICE_outmost_tag, + asn_DEF_Choice2_tags_1, + sizeof(asn_DEF_Choice2_tags_1) + /sizeof(asn_DEF_Choice2_tags_1[0]), /* 1 */ + asn_DEF_Choice2_tags_1, /* Same as above */ + sizeof(asn_DEF_Choice2_tags_1) + /sizeof(asn_DEF_Choice2_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_Choice2_1, + 4, /* Elements count */ + &asn_SPC_Choice2_specs_1 /* Additional specs */ +}; + + +/*** <<< INCLUDES [Choice3] >>> ***/ + +#include "Choice2.h" + +/*** <<< TYPE-DECLS [Choice3] >>> ***/ + +typedef Choice2_t Choice3_t; + +/*** <<< FUNC-DECLS [Choice3] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Choice3; +asn_struct_free_f Choice3_free; +asn_struct_print_f Choice3_print; +asn_constr_check_f Choice3_constraint; +ber_type_decoder_f Choice3_decode_ber; +der_type_encoder_f Choice3_encode_der; +xer_type_decoder_f Choice3_decode_xer; +xer_type_encoder_f Choice3_encode_xer; + +/*** <<< CODE [Choice3] >>> ***/ + +int +Choice3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + /* Replace with underlying type checker */ + td->check_constraints = asn_DEF_Choice2.check_constraints; + return td->check_constraints(td, sptr, ctfailcb, app_key); +} + +/* + * This type is implemented using Choice2, + * so here we adjust the DEF accordingly. + */ +static void +Choice3_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Choice2.free_struct; + td->print_struct = asn_DEF_Choice2.print_struct; + td->ber_decoder = asn_DEF_Choice2.ber_decoder; + td->der_encoder = asn_DEF_Choice2.der_encoder; + td->xer_decoder = asn_DEF_Choice2.xer_decoder; + td->xer_encoder = asn_DEF_Choice2.xer_encoder; + td->uper_decoder = asn_DEF_Choice2.uper_decoder; + td->uper_encoder = asn_DEF_Choice2.uper_encoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Choice2.per_constraints; + td->elements = asn_DEF_Choice2.elements; + td->elements_count = asn_DEF_Choice2.elements_count; + td->specifics = asn_DEF_Choice2.specifics; +} + +void +Choice3_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Choice3_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Choice3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Choice3_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Choice3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Choice3_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Choice3_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Choice3_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Choice3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Choice3_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Choice3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Choice3_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + + +/*** <<< STAT-DEFS [Choice3] >>> ***/ + +static ber_tlv_tag_t asn_DEF_Choice3_tags_1[] = { + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_Choice3 = { + "Choice3", + "Choice3", + Choice3_free, + Choice3_print, + Choice3_constraint, + Choice3_decode_ber, + Choice3_encode_der, + Choice3_decode_xer, + Choice3_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + CHOICE_outmost_tag, + asn_DEF_Choice3_tags_1, + sizeof(asn_DEF_Choice3_tags_1) + /sizeof(asn_DEF_Choice3_tags_1[0]), /* 2 */ + asn_DEF_Choice3_tags_1, /* Same as above */ + sizeof(asn_DEF_Choice3_tags_1) + /sizeof(asn_DEF_Choice3_tags_1[0]), /* 2 */ + 0, /* No PER visible constraints */ + 0, 0, /* Defined elsewhere */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Choice4] >>> ***/ + +#include "Choice2.h" + +/*** <<< TYPE-DECLS [Choice4] >>> ***/ + +typedef Choice2_t Choice4_t; + +/*** <<< FUNC-DECLS [Choice4] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Choice4; +asn_struct_free_f Choice4_free; +asn_struct_print_f Choice4_print; +asn_constr_check_f Choice4_constraint; +ber_type_decoder_f Choice4_decode_ber; +der_type_encoder_f Choice4_encode_der; +xer_type_decoder_f Choice4_decode_xer; +xer_type_encoder_f Choice4_encode_xer; + +/*** <<< CODE [Choice4] >>> ***/ + +int +Choice4_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + /* Replace with underlying type checker */ + td->check_constraints = asn_DEF_Choice2.check_constraints; + return td->check_constraints(td, sptr, ctfailcb, app_key); +} + +/* + * This type is implemented using Choice2, + * so here we adjust the DEF accordingly. + */ +static void +Choice4_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Choice2.free_struct; + td->print_struct = asn_DEF_Choice2.print_struct; + td->ber_decoder = asn_DEF_Choice2.ber_decoder; + td->der_encoder = asn_DEF_Choice2.der_encoder; + td->xer_decoder = asn_DEF_Choice2.xer_decoder; + td->xer_encoder = asn_DEF_Choice2.xer_encoder; + td->uper_decoder = asn_DEF_Choice2.uper_decoder; + td->uper_encoder = asn_DEF_Choice2.uper_encoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Choice2.per_constraints; + td->elements = asn_DEF_Choice2.elements; + td->elements_count = asn_DEF_Choice2.elements_count; + td->specifics = asn_DEF_Choice2.specifics; +} + +void +Choice4_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Choice4_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Choice4_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Choice4_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Choice4_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Choice4_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Choice4_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Choice4_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Choice4_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Choice4_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Choice4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Choice4_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + + +/*** <<< STAT-DEFS [Choice4] >>> ***/ + +static ber_tlv_tag_t asn_DEF_Choice4_tags_1[] = { + (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_Choice4 = { + "Choice4", + "Choice4", + Choice4_free, + Choice4_print, + Choice4_constraint, + Choice4_decode_ber, + Choice4_encode_der, + Choice4_decode_xer, + Choice4_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + CHOICE_outmost_tag, + asn_DEF_Choice4_tags_1, + sizeof(asn_DEF_Choice4_tags_1) + /sizeof(asn_DEF_Choice4_tags_1[0]) - 1, /* 1 */ + asn_DEF_Choice4_tags_1, /* Same as above */ + sizeof(asn_DEF_Choice4_tags_1) + /sizeof(asn_DEF_Choice4_tags_1[0]), /* 2 */ + 0, /* No PER visible constraints */ + 0, 0, /* Defined elsewhere */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Choice5] >>> ***/ + +#include "Choice2.h" + +/*** <<< TYPE-DECLS [Choice5] >>> ***/ + +typedef Choice2_t Choice5_t; + +/*** <<< FUNC-DECLS [Choice5] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Choice5; +asn_struct_free_f Choice5_free; +asn_struct_print_f Choice5_print; +asn_constr_check_f Choice5_constraint; +ber_type_decoder_f Choice5_decode_ber; +der_type_encoder_f Choice5_encode_der; +xer_type_decoder_f Choice5_decode_xer; +xer_type_encoder_f Choice5_encode_xer; + +/*** <<< CODE [Choice5] >>> ***/ + +int +Choice5_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + /* Replace with underlying type checker */ + td->check_constraints = asn_DEF_Choice2.check_constraints; + return td->check_constraints(td, sptr, ctfailcb, app_key); +} + +/* + * This type is implemented using Choice2, + * so here we adjust the DEF accordingly. + */ +static void +Choice5_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Choice2.free_struct; + td->print_struct = asn_DEF_Choice2.print_struct; + td->ber_decoder = asn_DEF_Choice2.ber_decoder; + td->der_encoder = asn_DEF_Choice2.der_encoder; + td->xer_decoder = asn_DEF_Choice2.xer_decoder; + td->xer_encoder = asn_DEF_Choice2.xer_encoder; + td->uper_decoder = asn_DEF_Choice2.uper_decoder; + td->uper_encoder = asn_DEF_Choice2.uper_encoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Choice2.per_constraints; + td->elements = asn_DEF_Choice2.elements; + td->elements_count = asn_DEF_Choice2.elements_count; + td->specifics = asn_DEF_Choice2.specifics; +} + +void +Choice5_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Choice5_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Choice5_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Choice5_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Choice5_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Choice5_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Choice5_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Choice5_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Choice5_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Choice5_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Choice5_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Choice5_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + + +/*** <<< STAT-DEFS [Choice5] >>> ***/ + +static ber_tlv_tag_t asn_DEF_Choice5_tags_1[] = { + (ASN_TAG_CLASS_CONTEXT | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_Choice5 = { + "Choice5", + "Choice5", + Choice5_free, + Choice5_print, + Choice5_constraint, + Choice5_decode_ber, + Choice5_encode_der, + Choice5_decode_xer, + Choice5_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + CHOICE_outmost_tag, + asn_DEF_Choice5_tags_1, + sizeof(asn_DEF_Choice5_tags_1) + /sizeof(asn_DEF_Choice5_tags_1[0]), /* 1 */ + asn_DEF_Choice5_tags_1, /* Same as above */ + sizeof(asn_DEF_Choice5_tags_1) + /sizeof(asn_DEF_Choice5_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + 0, 0, /* Defined elsewhere */ + 0 /* No specifics */ +}; + + +/*** <<< INCLUDES [Choice6] >>> ***/ + +#include "Choice1.h" + +/*** <<< TYPE-DECLS [Choice6] >>> ***/ + +typedef Choice1_t Choice6_t; + +/*** <<< FUNC-DECLS [Choice6] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Choice6; +asn_struct_free_f Choice6_free; +asn_struct_print_f Choice6_print; +asn_constr_check_f Choice6_constraint; +ber_type_decoder_f Choice6_decode_ber; +der_type_encoder_f Choice6_encode_der; +xer_type_decoder_f Choice6_decode_xer; +xer_type_encoder_f Choice6_encode_xer; + +/*** <<< CODE [Choice6] >>> ***/ + +int +Choice6_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + /* Replace with underlying type checker */ + td->check_constraints = asn_DEF_Choice1.check_constraints; + return td->check_constraints(td, sptr, ctfailcb, app_key); +} + +/* + * This type is implemented using Choice1, + * so here we adjust the DEF accordingly. + */ +static void +Choice6_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_Choice1.free_struct; + td->print_struct = asn_DEF_Choice1.print_struct; + td->ber_decoder = asn_DEF_Choice1.ber_decoder; + td->der_encoder = asn_DEF_Choice1.der_encoder; + td->xer_decoder = asn_DEF_Choice1.xer_decoder; + td->xer_encoder = asn_DEF_Choice1.xer_encoder; + td->uper_decoder = asn_DEF_Choice1.uper_decoder; + td->uper_encoder = asn_DEF_Choice1.uper_encoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_Choice1.per_constraints; + td->elements = asn_DEF_Choice1.elements; + td->elements_count = asn_DEF_Choice1.elements_count; + td->specifics = asn_DEF_Choice1.specifics; +} + +void +Choice6_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + Choice6_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +Choice6_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + Choice6_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +Choice6_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + Choice6_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +Choice6_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + Choice6_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +Choice6_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + Choice6_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +Choice6_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + Choice6_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + + +/*** <<< STAT-DEFS [Choice6] >>> ***/ + +asn_TYPE_descriptor_t asn_DEF_Choice6 = { + "Choice6", + "Choice6", + Choice6_free, + Choice6_print, + Choice6_constraint, + Choice6_decode_ber, + Choice6_encode_der, + Choice6_decode_xer, + Choice6_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + CHOICE_outmost_tag, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + 0, /* No PER visible constraints */ + 0, 0, /* Defined elsewhere */ + 0 /* No specifics */ +}; + From 923ea54f72e2a1fee4233cdd8cd4a66159eeb991 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 17 Sep 2006 06:34:47 +0000 Subject: [PATCH 1202/1469] MHEG5 XER sample git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1202 59561ff5-6e30-0410-9f3c-9617f08c8826 --- .../sample-InterchangedObject-1.xer | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 examples/sample.source.MHEG5/sample-InterchangedObject-1.xer diff --git a/examples/sample.source.MHEG5/sample-InterchangedObject-1.xer b/examples/sample.source.MHEG5/sample-InterchangedObject-1.xer new file mode 100644 index 000000000..cd79a92cb --- /dev/null +++ b/examples/sample.source.MHEG5/sample-InterchangedObject-1.xer @@ -0,0 +1,97 @@ + + + + + smth + 0 + + + + + + 14 + + + ldskfjlsfd + + + + + + 22 + + + 3 + + + + + + 39 + + + + + + + + + 42 + + + 0 + + + + + + 45 + + + xxx + + + + + 113 + + + + + + a + 5 + + + + + + + + 103 + + + + + + 31 + + + + + + + + + + + + + + 3 + + 100 + 100 + + + From 1223d98fd4db5ea8843f99aedcfef20e7f7488ac Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 17 Sep 2006 08:23:35 +0000 Subject: [PATCH 1203/1469] more debugging git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1203 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_CHOICE.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 224e56a90..a0a6d76a2 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -616,7 +616,8 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, elm->type, memb_ptr2, elm->name, buf_ptr, size); XER_ADVANCE(tmprval.consumed); - ASN_DEBUG("XER/CHOICE: itdf: code=%d", tmprval.code); + ASN_DEBUG("XER/CHOICE: itdf: [%s] code=%d", + elm->type->name, tmprval.code); if(tmprval.code != RC_OK) RETURN(tmprval.code); assert(_fetch_present_idx(st, @@ -754,8 +755,13 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, break; } - ASN_DEBUG("Unexpected XML tag in CHOICE (ph=%d, tag=%s)", - ctx->phase, xml_tag); + ASN_DEBUG("Unexpected XML tag [%c%c%c%c] in CHOICE [%s]" + " (ph=%d, tag=%s)", + ch_size>0?((const uint8_t *)buf_ptr)[0]:'?', + ch_size>1?((const uint8_t *)buf_ptr)[1]:'?', + ch_size>2?((const uint8_t *)buf_ptr)[2]:'?', + ch_size>3?((const uint8_t *)buf_ptr)[3]:'?', + td->name, ctx->phase, xml_tag); break; } From 84444f913367a77d1d2d56a4977ff53d814b363e Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 17 Sep 2006 08:23:43 +0000 Subject: [PATCH 1204/1469] proper move git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1204 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/converter-sample.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/skeletons/converter-sample.c b/skeletons/converter-sample.c index d146f3262..79067a308 100644 --- a/skeletons/converter-sample.c +++ b/skeletons/converter-sample.c @@ -314,7 +314,9 @@ static void add_bytes_to_buffer(const void *data2add, size_t bySize) { perror("malloc()"); exit(EX_OSERR); } - memcpy(p, DynamicBuffer.data, DynamicBuffer.length); + memcpy(p, + DynamicBuffer.data + DynamicBuffer.offset, + DynamicBuffer.length); FREEMEM(DynamicBuffer.data); DynamicBuffer.data = (char *)p; DynamicBuffer.offset = 0; From 69130f07da22b099be0ac10fd1e1e52c1679c898 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 17 Sep 2006 08:26:41 +0000 Subject: [PATCH 1205/1469] more testing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1205 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.LDAP3/Makefile | 17 +++++++++++++++++ examples/sample.source.MEGACO/Makefile | 17 +++++++++++++++++ examples/sample.source.PKIX1/Makefile | 17 +++++++++++++++++ examples/sample.source.RRC/Makefile | 17 +++++++++++++++++ examples/sample.source.TAP3/Makefile | 17 +++++++++++++++++ 5 files changed, 85 insertions(+) diff --git a/examples/sample.source.LDAP3/Makefile b/examples/sample.source.LDAP3/Makefile index d75f5692b..1c4ff2340 100644 --- a/examples/sample.source.LDAP3/Makefile +++ b/examples/sample.source.LDAP3/Makefile @@ -208,6 +208,23 @@ check: ${TARGET} diff ./.tmp.1.$$ ./.tmp.2.$$ || exit 2; \ rm -f ./.tmp.[12].$$; \ done; fi + @if test -f ./sample-LDAPMessage-1.xer ; then \ + for f in ./sample-LDAPMessage-*.xer; do \ + echo "Recoding $$f into DER and back..."; \ + ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$ || exit 2; \ + ./${TARGET} -iber -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ + diff $$f ./.tmp.2.$$ || exit 2; \ + rm -f ./.tmp.[12].$$; \ + done; fi + @if test -f ./sample-LDAPMessage-1.per ; then \ + for f in ./sample-LDAPMessage-*.per; do \ + echo "Recoding $$f into DER into XER and back..."; \ + ./${TARGET} -iper -oder $$f > ./.tmp.1.$$ || exit 2; \ + ./${TARGET} -ider -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ + ./${TARGET} -ixer -oper ./.tmp.2.$$ > ./.tmp.1.$$ || exit 2; \ + diff $$f ./.tmp.1.$$ || exit 2; \ + rm -f ./.tmp.[12].$$; \ + done; fi @echo ================ @echo All tests passed @echo ================ diff --git a/examples/sample.source.MEGACO/Makefile b/examples/sample.source.MEGACO/Makefile index d05f4a450..fdc878b45 100644 --- a/examples/sample.source.MEGACO/Makefile +++ b/examples/sample.source.MEGACO/Makefile @@ -330,6 +330,23 @@ check: ${TARGET} diff ./.tmp.1.$$ ./.tmp.2.$$ || exit 2; \ rm -f ./.tmp.[12].$$; \ done; fi + @if test -f ./sample-MegacoMessage-1.xer ; then \ + for f in ./sample-MegacoMessage-*.xer; do \ + echo "Recoding $$f into DER and back..."; \ + ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$ || exit 2; \ + ./${TARGET} -iber -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ + diff $$f ./.tmp.2.$$ || exit 2; \ + rm -f ./.tmp.[12].$$; \ + done; fi + @if test -f ./sample-MegacoMessage-1.per ; then \ + for f in ./sample-MegacoMessage-*.per; do \ + echo "Recoding $$f into DER into XER and back..."; \ + ./${TARGET} -iper -oder $$f > ./.tmp.1.$$ || exit 2; \ + ./${TARGET} -ider -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ + ./${TARGET} -ixer -oper ./.tmp.2.$$ > ./.tmp.1.$$ || exit 2; \ + diff $$f ./.tmp.1.$$ || exit 2; \ + rm -f ./.tmp.[12].$$; \ + done; fi @echo ================ @echo All tests passed @echo ================ diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index c1846abc2..de54195c5 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -390,6 +390,23 @@ check: ${TARGET} diff ./.tmp.1.$$ ./.tmp.2.$$ || exit 2; \ rm -f ./.tmp.[12].$$; \ done; fi + @if test -f ./sample-Certificate-1.xer ; then \ + for f in ./sample-Certificate-*.xer; do \ + echo "Recoding $$f into DER and back..."; \ + ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$ || exit 2; \ + ./${TARGET} -iber -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ + diff $$f ./.tmp.2.$$ || exit 2; \ + rm -f ./.tmp.[12].$$; \ + done; fi + @if test -f ./sample-Certificate-1.per ; then \ + for f in ./sample-Certificate-*.per; do \ + echo "Recoding $$f into DER into XER and back..."; \ + ./${TARGET} -iper -oder $$f > ./.tmp.1.$$ || exit 2; \ + ./${TARGET} -ider -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ + ./${TARGET} -ixer -oper ./.tmp.2.$$ > ./.tmp.1.$$ || exit 2; \ + diff $$f ./.tmp.1.$$ || exit 2; \ + rm -f ./.tmp.[12].$$; \ + done; fi @echo ================ @echo All tests passed @echo ================ diff --git a/examples/sample.source.RRC/Makefile b/examples/sample.source.RRC/Makefile index 717e73425..862f2cac8 100644 --- a/examples/sample.source.RRC/Makefile +++ b/examples/sample.source.RRC/Makefile @@ -4785,6 +4785,23 @@ check: ${TARGET} diff ./.tmp.1.$$ ./.tmp.2.$$ || exit 2; \ rm -f ./.tmp.[12].$$; \ done; fi + @if test -f ./sample-DL-DCCH-Message-1.xer ; then \ + for f in ./sample-DL-DCCH-Message-*.xer; do \ + echo "Recoding $$f into DER and back..."; \ + ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$ || exit 2; \ + ./${TARGET} -iber -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ + diff $$f ./.tmp.2.$$ || exit 2; \ + rm -f ./.tmp.[12].$$; \ + done; fi + @if test -f ./sample-DL-DCCH-Message-1.per ; then \ + for f in ./sample-DL-DCCH-Message-*.per; do \ + echo "Recoding $$f into DER into XER and back..."; \ + ./${TARGET} -iper -oder $$f > ./.tmp.1.$$ || exit 2; \ + ./${TARGET} -ider -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ + ./${TARGET} -ixer -oper ./.tmp.2.$$ > ./.tmp.1.$$ || exit 2; \ + diff $$f ./.tmp.1.$$ || exit 2; \ + rm -f ./.tmp.[12].$$; \ + done; fi @echo ================ @echo All tests passed @echo ================ diff --git a/examples/sample.source.TAP3/Makefile b/examples/sample.source.TAP3/Makefile index 745868887..4dd100caf 100644 --- a/examples/sample.source.TAP3/Makefile +++ b/examples/sample.source.TAP3/Makefile @@ -724,6 +724,23 @@ check: ${TARGET} diff ./.tmp.1.$$ ./.tmp.2.$$ || exit 2; \ rm -f ./.tmp.[12].$$; \ done; fi + @if test -f ./sample-DataInterChange-1.xer ; then \ + for f in ./sample-DataInterChange-*.xer; do \ + echo "Recoding $$f into DER and back..."; \ + ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$ || exit 2; \ + ./${TARGET} -iber -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ + diff $$f ./.tmp.2.$$ || exit 2; \ + rm -f ./.tmp.[12].$$; \ + done; fi + @if test -f ./sample-DataInterChange-1.per ; then \ + for f in ./sample-DataInterChange-*.per; do \ + echo "Recoding $$f into DER into XER and back..."; \ + ./${TARGET} -iper -oder $$f > ./.tmp.1.$$ || exit 2; \ + ./${TARGET} -ider -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ + ./${TARGET} -ixer -oper ./.tmp.2.$$ > ./.tmp.1.$$ || exit 2; \ + diff $$f ./.tmp.1.$$ || exit 2; \ + rm -f ./.tmp.[12].$$; \ + done; fi @echo ================ @echo All tests passed @echo ================ From e1753a480b86df0f913db079addb5287eb2b0315 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 17 Sep 2006 08:28:32 +0000 Subject: [PATCH 1206/1469] tap -> mheg git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1206 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.MHEG5/README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/sample.source.MHEG5/README b/examples/sample.source.MHEG5/README index cfb56e5d7..91127ee9a 100644 --- a/examples/sample.source.MHEG5/README +++ b/examples/sample.source.MHEG5/README @@ -27,7 +27,7 @@ mheg5dump USAGE The mheg5dump utility may be used to dump the contents of the BER-encoded MHEG-5 data record file: - ./mheg5dump tapfile.ber # Print MHEG-5 stream as XML (BASIC-XER) + ./mheg5dump mhegscene.ber # Print MHEG-5 stream as XML (BASIC-XER) The full list of recognized command line options may be obtained with From e7e9bd95bfb27c0abbdf8aea06abfab6cc08f3b5 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 17 Sep 2006 11:02:53 +0000 Subject: [PATCH 1207/1469] more granular PER encoding git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1207 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.makefile.regen | 38 ++++--- examples/sample.source.MHEG5/Makefile | 26 ++--- examples/sample.source.RRC/Makefile | 34 +++--- skeletons/converter-sample.c | 144 +++++++++++++++++--------- skeletons/per_decoder.c | 7 +- skeletons/per_decoder.h | 3 +- skeletons/per_encoder.c | 20 ++-- skeletons/per_support.c | 1 + skeletons/per_support.h | 3 +- 9 files changed, 177 insertions(+), 99 deletions(-) diff --git a/examples/sample.makefile.regen b/examples/sample.makefile.regen index 95c177945..1b8f8c4ad 100755 --- a/examples/sample.makefile.regen +++ b/examples/sample.makefile.regen @@ -60,27 +60,39 @@ cat Makefile.am.sample \ echo " @if test -f ./sample-${ASN1PDU}-1.[db]er ; then \\" echo " for f in ./sample-${ASN1PDU}-*.[db]er; do \\" echo ' echo "Recoding $$f into XER and back..."; \' - echo ' ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$ || exit 2; \' - echo ' ./${TARGET} -ixer -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \' - echo ' diff ./.tmp.1.$$ ./.tmp.2.$$ || exit 2; \' - echo ' rm -f ./.tmp.[12].$$; \' + echo ' ./${TARGET} -iber -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -iber -oxer -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -iber -oxer -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -iber -oxer -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \' + echo ' diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \' + echo ' rm -f ./.tmp.[12].$$$$; \' echo ' done; fi' echo " @if test -f ./sample-${ASN1PDU}-1.xer ; then \\" echo " for f in ./sample-${ASN1PDU}-*.xer; do \\" echo ' echo "Recoding $$f into DER and back..."; \' - echo ' ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$ || exit 2; \' - echo ' ./${TARGET} -iber -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \' - echo ' diff $$f ./.tmp.2.$$ || exit 2; \' - echo ' rm -f ./.tmp.[12].$$; \' + echo ' ./${TARGET} -ixer -oder -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -ixer -oder -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -ixer -oder -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -ixer -oder -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \' + echo ' diff $$f ./.tmp.2.$$$$ || exit 2; \' + echo ' rm -f ./.tmp.[12].$$$$; \' echo ' done; fi' echo " @if test -f ./sample-${ASN1PDU}-1.per ; then \\" echo " for f in ./sample-${ASN1PDU}-*.per; do \\" echo ' echo "Recoding $$f into DER into XER and back..."; \' - echo ' ./${TARGET} -iper -oder $$f > ./.tmp.1.$$ || exit 2; \' - echo ' ./${TARGET} -ider -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \' - echo ' ./${TARGET} -ixer -oper ./.tmp.2.$$ > ./.tmp.1.$$ || exit 2; \' - echo ' diff $$f ./.tmp.1.$$ || exit 2; \' - echo ' rm -f ./.tmp.[12].$$; \' + echo ' ./${TARGET} -iper -oder -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -iper -oder -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -iper -oder -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -iper -oder -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \' + echo ' ./${TARGET} -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \' + echo ' diff $$f ./.tmp.1.$$$$ || exit 2; \' + echo ' rm -f ./.tmp.[12].$$$$; \' echo ' done; fi' echo ' @echo ================' echo ' @echo All tests passed' diff --git a/examples/sample.source.MHEG5/Makefile b/examples/sample.source.MHEG5/Makefile index 4a4f48fa8..db9e19505 100644 --- a/examples/sample.source.MHEG5/Makefile +++ b/examples/sample.source.MHEG5/Makefile @@ -493,27 +493,27 @@ check: ${TARGET} @if test -f ./sample-InterchangedObject-1.[db]er ; then \ for f in ./sample-InterchangedObject-*.[db]er; do \ echo "Recoding $$f into XER and back..."; \ - ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$ || exit 2; \ - ./${TARGET} -ixer -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ - diff ./.tmp.1.$$ ./.tmp.2.$$ || exit 2; \ - rm -f ./.tmp.[12].$$; \ + ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ + rm -f ./.tmp.[12].$$$$; \ done; fi @if test -f ./sample-InterchangedObject-1.xer ; then \ for f in ./sample-InterchangedObject-*.xer; do \ echo "Recoding $$f into DER and back..."; \ - ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$ || exit 2; \ - ./${TARGET} -iber -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ - diff $$f ./.tmp.2.$$ || exit 2; \ - rm -f ./.tmp.[12].$$; \ + ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + diff $$f ./.tmp.2.$$$$ || exit 2; \ + rm -f ./.tmp.[12].$$$$; \ done; fi @if test -f ./sample-InterchangedObject-1.per ; then \ for f in ./sample-InterchangedObject-*.per; do \ echo "Recoding $$f into DER into XER and back..."; \ - ./${TARGET} -iper -oder $$f > ./.tmp.1.$$ || exit 2; \ - ./${TARGET} -ider -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ - ./${TARGET} -ixer -oper ./.tmp.2.$$ > ./.tmp.1.$$ || exit 2; \ - diff $$f ./.tmp.1.$$ || exit 2; \ - rm -f ./.tmp.[12].$$; \ + ./${TARGET} -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ + diff $$f ./.tmp.1.$$$$ || exit 2; \ + rm -f ./.tmp.[12].$$$$; \ done; fi @echo ================ @echo All tests passed diff --git a/examples/sample.source.RRC/Makefile b/examples/sample.source.RRC/Makefile index 862f2cac8..f694fc438 100644 --- a/examples/sample.source.RRC/Makefile +++ b/examples/sample.source.RRC/Makefile @@ -4780,27 +4780,35 @@ check: ${TARGET} @if test -f ./sample-DL-DCCH-Message-1.[db]er ; then \ for f in ./sample-DL-DCCH-Message-*.[db]er; do \ echo "Recoding $$f into XER and back..."; \ - ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$ || exit 2; \ - ./${TARGET} -ixer -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ - diff ./.tmp.1.$$ ./.tmp.2.$$ || exit 2; \ - rm -f ./.tmp.[12].$$; \ + ./${TARGET} -iber -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ + rm -f ./.tmp.[12].$$$$; \ done; fi @if test -f ./sample-DL-DCCH-Message-1.xer ; then \ for f in ./sample-DL-DCCH-Message-*.xer; do \ echo "Recoding $$f into DER and back..."; \ - ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$ || exit 2; \ - ./${TARGET} -iber -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ - diff $$f ./.tmp.2.$$ || exit 2; \ - rm -f ./.tmp.[12].$$; \ + ./${TARGET} -ixer -oder -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + diff $$f ./.tmp.2.$$$$ || exit 2; \ + rm -f ./.tmp.[12].$$$$; \ done; fi @if test -f ./sample-DL-DCCH-Message-1.per ; then \ for f in ./sample-DL-DCCH-Message-*.per; do \ echo "Recoding $$f into DER into XER and back..."; \ - ./${TARGET} -iper -oder $$f > ./.tmp.1.$$ || exit 2; \ - ./${TARGET} -ider -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ - ./${TARGET} -ixer -oper ./.tmp.2.$$ > ./.tmp.1.$$ || exit 2; \ - diff $$f ./.tmp.1.$$ || exit 2; \ - rm -f ./.tmp.[12].$$; \ + ./${TARGET} -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ + diff $$f ./.tmp.1.$$$$ || exit 2; \ + rm -f ./.tmp.[12].$$$$; \ done; fi @echo ================ @echo All tests passed diff --git a/skeletons/converter-sample.c b/skeletons/converter-sample.c index 79067a308..3ee0b3b08 100644 --- a/skeletons/converter-sample.c +++ b/skeletons/converter-sample.c @@ -35,7 +35,7 @@ extern asn_TYPE_descriptor_t *asn_pdu_collection[]; * Open file and parse its contens. */ static void *data_decode_from_file(asn_TYPE_descriptor_t *asnTypeOfPDU, - FILE *f, const char *filename, ssize_t suggested_bufsize); + FILE *file, const char *name, ssize_t suggested_bufsize, int first_pdu); static int write_out(const void *buffer, size_t size, void *key); static FILE *argument_to_file(char *av[], int idx); static char *argument_to_name(char *av[], int idx); @@ -43,6 +43,7 @@ static char *argument_to_name(char *av[], int idx); int opt_debug; /* -d */ static int opt_check; /* -c */ static int opt_stack; /* -s */ +static int opt_onepdu; /* -1 */ /* Input data format selector */ static enum input_format { @@ -107,21 +108,9 @@ main(int ac, char *av[]) { fprintf(stderr, "-o: '%s': improper format selector\n", optarg); exit(EX_UNAVAILABLE); - case 'p': -#ifdef ASN_PDU_COLLECTION - { - asn_TYPE_descriptor_t **pdu = asn_pdu_collection; - if(optarg[0] < 'A' || optarg[0] > 'Z') { - fprintf(stderr, "Available PDU types:\n"); - for(; *pdu; pdu++) printf("%s\n", (*pdu)->name); - exit(0); - } - while(*pdu && strcmp((*pdu)->name, optarg)) pdu++; - if(*pdu) { pduType = *pdu; break; } - } -#endif /* ASN_PDU_COLLECTION */ - fprintf(stderr, "-p %s: Unrecognized PDU\n", optarg); - exit(EX_UNAVAILABLE); + case '1': + opt_onepdu = 1; + break; case 'b': suggested_bufsize = atoi(optarg); if(suggested_bufsize < 1 @@ -146,6 +135,21 @@ main(int ac, char *av[]) { exit(EX_UNAVAILABLE); } break; + case 'p': +#ifdef ASN_PDU_COLLECTION + { + asn_TYPE_descriptor_t **pdu = asn_pdu_collection; + if(optarg[0] < 'A' || optarg[0] > 'Z') { + fprintf(stderr, "Available PDU types:\n"); + for(; *pdu; pdu++) printf("%s\n", (*pdu)->name); + exit(0); + } + while(*pdu && strcmp((*pdu)->name, optarg)) pdu++; + if(*pdu) { pduType = *pdu; break; } + } +#endif /* ASN_PDU_COLLECTION */ + fprintf(stderr, "-p %s: Unrecognized PDU\n", optarg); + exit(EX_UNAVAILABLE); case 's': opt_stack = atoi(optarg); if(opt_stack < 0) { @@ -208,20 +212,26 @@ main(int ac, char *av[]) { * Process all files in turn. */ for(ac_i = 0; ac_i < ac; ac_i++) { - asn_enc_rval_t erv; - void *structure; /* Decoded structure */ - FILE *file = argument_to_file(av, ac_i); - char *name = argument_to_name(av, ac_i); + asn_enc_rval_t erv; + void *structure; /* Decoded structure */ + FILE *file = argument_to_file(av, ac_i); + char *name = argument_to_name(av, ac_i); + int first_pdu; + for(first_pdu = 1; first_pdu || !opt_onepdu; first_pdu = 0) { /* * Decode the encoded structure from file. */ structure = data_decode_from_file(pduType, - file, name, suggested_bufsize); - if(file && file != stdin) fclose(file); + file, name, suggested_bufsize, first_pdu); if(!structure) { - /* Error message is already printed */ - exit(EX_DATAERR); + if(errno) { + /* Error message is already printed */ + exit(EX_DATAERR); + } else { + /* EOF */ + break; + } } /* Check ASN.1 constraints */ @@ -257,6 +267,7 @@ main(int ac, char *av[]) { name); exit(EX_UNAVAILABLE); } + DEBUG("Encoded in %ld bytes of DER", (long)erv.encoded); break; case OUT_PER: erv = uper_encode(pduType, structure, write_out, stdout); @@ -265,10 +276,15 @@ main(int ac, char *av[]) { name); exit(EX_UNAVAILABLE); } + DEBUG("Encoded in %ld bits of UPER", (long)erv.encoded); break; } ASN_STRUCT_FREE(*pduType, structure); + } + + if(file && file != stdin) + fclose(file); } } @@ -279,6 +295,7 @@ static struct dynamic_buffer { char *data; /* Pointer to the data bytes */ size_t offset; /* Offset from the start */ size_t length; /* Length of meaningful contents */ + size_t unbit; /* Unused bits in the last byte */ size_t allocated; /* Allocated memory for data */ int nreallocs; /* Number of data reallocations */ off_t bytes_shifted; /* Number of bytes ever shifted */ @@ -332,17 +349,20 @@ static void add_bytes_to_buffer(const void *data2add, size_t bySize) { } static void * -data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *filename, ssize_t suggested_bufsize) { +data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *name, ssize_t suggested_bufsize, int on_first_pdu) { static char *fbuf; static ssize_t fbuf_size; static asn_codec_ctx_t s_codec_ctx; asn_codec_ctx_t *opt_codec_ctx = 0; void *structure = 0; asn_dec_rval_t rval; + size_t old_offset; + size_t new_offset; size_t rd; if(!file) { - fprintf(stderr, "%s: %s\n", filename, strerror(errno)); + fprintf(stderr, "%s: %s\n", name, strerror(errno)); + errno = EINVAL; return 0; } @@ -351,7 +371,7 @@ data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *fi opt_codec_ctx = &s_codec_ctx; } - DEBUG("Processing %s", filename); + DEBUG("Processing %s", name); /* prepare the file buffer */ if(fbuf_size != suggested_bufsize) { @@ -363,17 +383,23 @@ data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *fi fbuf_size = suggested_bufsize; } - DynamicBuffer.offset = 0; - DynamicBuffer.length = 0; - DynamicBuffer.allocated = 0; - DynamicBuffer.bytes_shifted = 0; - DynamicBuffer.nreallocs = 0; + if(on_first_pdu) { + DynamicBuffer.offset = 0; + DynamicBuffer.length = 0; + DynamicBuffer.unbit = 0; + DynamicBuffer.allocated = 0; + DynamicBuffer.bytes_shifted = 0; + DynamicBuffer.nreallocs = 0; + } + + old_offset = DynamicBuffer.bytes_shifted + DynamicBuffer.offset; /* Pretend immediate EOF */ rval.code = RC_WMORE; rval.consumed = 0; while((rd = fread(fbuf, 1, fbuf_size, file)) || !feof(file)) { + int ecbits = 0; /* Extra consumed bits in case of PER */ char *i_bptr; size_t i_size; @@ -390,6 +416,8 @@ data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *fi i_size = rd; } + DEBUG("Decoding %ld bytes", (long)i_size); + switch(iform) { case INP_BER: rval = ber_decode(opt_codec_ctx, pduType, @@ -401,7 +429,11 @@ data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *fi break; case INP_PER: rval = uper_decode(opt_codec_ctx, pduType, - (void **)&structure, i_bptr, i_size); + (void **)&structure, i_bptr, i_size, 0); + ecbits = rval.consumed % 8; /* Extra bits */ + DEBUG("PER unused %d bits (consumed %ld, %d)", + ecbits, (long)rval.consumed); + rval.consumed /= 8; /* Convert to value in bytes! */ break; } DEBUG("decode(%ld) consumed %ld (%ld), code %d", @@ -411,34 +443,37 @@ data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *fi if(DynamicBuffer.allocated == 0) { /* - * Flush the remainder into the intermediate buffer. + * Flush remainder into the intermediate buffer. */ if(rval.code != RC_FAIL && rval.consumed < rd) { + DEBUG("Saving %d bytes", rd - rval.consumed); add_bytes_to_buffer(fbuf + rval.consumed, rd - rval.consumed); rval.consumed = 0; } } + /* + * Adjust position inside the source buffer. + */ + if(DynamicBuffer.allocated) { + DynamicBuffer.offset += rval.consumed; + DynamicBuffer.length -= rval.consumed; + } else { + DynamicBuffer.bytes_shifted += rval.consumed; + } + switch(rval.code) { case RC_OK: DEBUG("RC_OK, finishing up with %ld", (long)rval.consumed); return structure; case RC_WMORE: - /* - * Adjust position inside the source buffer. - */ - if(DynamicBuffer.allocated) { - DynamicBuffer.offset += rval.consumed; - DynamicBuffer.length -= rval.consumed; - } DEBUG("RC_WMORE, continuing %ld with %ld..%ld..%ld", (long)rval.consumed, (long)DynamicBuffer.offset, (long)DynamicBuffer.length, (long)DynamicBuffer.allocated); - rval.consumed = 0; continue; case RC_FAIL: break; @@ -449,13 +484,24 @@ data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *fi /* Clean up partially decoded structure */ ASN_STRUCT_FREE(*pduType, structure); - fprintf(stderr, "%s: " - "Decode failed past byte %ld: %s\n", - filename, (long)(DynamicBuffer.bytes_shifted - + DynamicBuffer.offset + rval.consumed), - (rval.code == RC_WMORE) - ? "Unexpected end of input" - : "Input processing error"); + new_offset = DynamicBuffer.bytes_shifted + DynamicBuffer.offset; + + /* + * Print a message and return failure only if not EOF, + * unless this is our first PDU (empty file). + */ + if(on_first_pdu || new_offset != old_offset) { + fprintf(stderr, "%s: " + "Decode failed past byte %ld: %s\n", + name, (long)new_offset, + (rval.code == RC_WMORE) + ? "Unexpected end of input" + : "Input processing error"); + errno = (rval.code == RC_WMORE) ? ENOMSG : EBADMSG; + } else { + /* Got EOF after a few successful PDU */ + errno = 0; + } return 0; } diff --git a/skeletons/per_decoder.c b/skeletons/per_decoder.c index 506ad6741..bc5f569c1 100644 --- a/skeletons/per_decoder.c +++ b/skeletons/per_decoder.c @@ -3,10 +3,13 @@ #include asn_dec_rval_t -uper_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buffer, size_t size) { +uper_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buffer, size_t size, int skip_bits) { asn_codec_ctx_t s_codec_ctx; asn_per_data_t pd; + if(skip_bits < 0 || skip_bits > 7 || (skip_bits > 0 && !size)) + _ASN_DECODE_FAILED; + /* * Stack checker requires that the codec context * must be allocated on the stack. @@ -25,7 +28,7 @@ uper_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sp /* Fill in the position indicator */ pd.buffer = (const uint8_t *)buffer; - pd.nboff = 0; + pd.nboff = skip_bits; pd.nbits = 8 * size; /* 8 is CHAR_BIT from */ /* diff --git a/skeletons/per_decoder.h b/skeletons/per_decoder.h index 27fe064f0..23cb7d7a7 100644 --- a/skeletons/per_decoder.h +++ b/skeletons/per_decoder.h @@ -21,7 +21,8 @@ asn_dec_rval_t uper_decode(struct asn_codec_ctx_s *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, /* Type to decode */ void **struct_ptr, /* Pointer to a target structure's pointer */ const void *buffer, /* Data to be decoded */ - size_t size /* Size of data buffer */ + size_t size, /* Size of data buffer */ + int skip_bits /* Number of unused leading bits, 0..7 */ ); diff --git a/skeletons/per_encoder.c b/skeletons/per_encoder.c index 6ba28e53b..614dd2333 100644 --- a/skeletons/per_encoder.c +++ b/skeletons/per_encoder.c @@ -21,10 +21,20 @@ uper_encode(asn_TYPE_descriptor_t *td, void *sptr, asn_app_consume_bytes_f *cb, po.nbits = 8 * sizeof(po.tmpspace); po.outper = cb; po.op_key = app_key; + po.flushed_bytes = 0; er = td->uper_encoder(td, 0, sptr, &po); - if(er.encoded != -1 && _uper_encode_flush_outp(&po)) - _ASN_ENCODE_FAILED; + if(er.encoded != -1) { + size_t bits_to_flush; + + bits_to_flush = ((po.buffer - po.tmpspace) << 3) + po.nboff; + + /* Set number of bits encoded to a firm value */ + er.encoded = (po.flushed_bytes << 3) + bits_to_flush; + + if(_uper_encode_flush_outp(&po)) + _ASN_ENCODE_FAILED; + } return er; } @@ -52,7 +62,6 @@ static int encode_to_buffer_cb(const void *buffer, size_t size, void *key) { asn_enc_rval_t uper_encode_to_buffer(asn_TYPE_descriptor_t *td, void *sptr, void *buffer, size_t buffer_size) { enc_to_buf_arg key; - asn_enc_rval_t er; /* * Invoke type-specific encoder. @@ -65,10 +74,7 @@ uper_encode_to_buffer(asn_TYPE_descriptor_t *td, void *sptr, void *buffer, size_ ASN_DEBUG("Encoding \"%s\" using UNALIGNED PER", td->name); - er = uper_encode(td, sptr, encode_to_buffer_cb, &key); - if(er.encoded != -1) - er.encoded = buffer_size - key.left; - return er; + return uper_encode(td, sptr, encode_to_buffer_cb, &key); } static int diff --git a/skeletons/per_support.c b/skeletons/per_support.c index 9217038ec..b0149f896 100644 --- a/skeletons/per_support.c +++ b/skeletons/per_support.c @@ -210,6 +210,7 @@ per_put_few_bits(asn_per_outp_t *po, uint32_t bits, int obits) { po->tmpspace[0] = po->buffer[0]; po->buffer = po->tmpspace; po->nbits = 8 * sizeof(po->tmpspace); + po->flushed_bytes += complete_bytes; } /* diff --git a/skeletons/per_support.h b/skeletons/per_support.h index 7e5e5940a..420bb83c5 100644 --- a/skeletons/per_support.h +++ b/skeletons/per_support.h @@ -76,7 +76,8 @@ typedef struct asn_per_outp_s { size_t nbits; /* Number of bits left in (tmpspace) */ uint8_t tmpspace[32]; /* Preliminary storage to hold data */ int (*outper)(const void *data, size_t size, void *op_key); - void *op_key; + void *op_key; /* Key for (outper) data callback */ + size_t flushed_bytes; /* Bytes already flushed through (outper) */ } asn_per_outp_t; /* Output a small number of bits (<= 31) */ From b4ee56f8408baeb17b485b80b6687e1e3613589d Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 17 Sep 2006 11:22:00 +0000 Subject: [PATCH 1208/1469] debug git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1208 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/converter-sample.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/skeletons/converter-sample.c b/skeletons/converter-sample.c index 3ee0b3b08..d91bb9e7b 100644 --- a/skeletons/converter-sample.c +++ b/skeletons/converter-sample.c @@ -431,14 +431,12 @@ data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *na rval = uper_decode(opt_codec_ctx, pduType, (void **)&structure, i_bptr, i_size, 0); ecbits = rval.consumed % 8; /* Extra bits */ - DEBUG("PER unused %d bits (consumed %ld, %d)", - ecbits, (long)rval.consumed); rval.consumed /= 8; /* Convert to value in bytes! */ break; } - DEBUG("decode(%ld) consumed %ld (%ld), code %d", + DEBUG("decode(%ld) consumed %ld+%d (%ld), code %d", (long)DynamicBuffer.length, - (long)rval.consumed, (long)i_size, + (long)rval.consumed, ecbits, (long)i_size, rval.code); if(DynamicBuffer.allocated == 0) { From 76a5277f9733243abc3c61ef32f82d541e344dd6 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 17 Sep 2006 11:31:55 +0000 Subject: [PATCH 1209/1469] return number of bits git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1209 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/per_decoder.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/skeletons/per_decoder.c b/skeletons/per_decoder.c index bc5f569c1..f1b723f21 100644 --- a/skeletons/per_decoder.c +++ b/skeletons/per_decoder.c @@ -5,6 +5,7 @@ asn_dec_rval_t uper_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buffer, size_t size, int skip_bits) { asn_codec_ctx_t s_codec_ctx; + asn_dec_rval_t rval; asn_per_data_t pd; if(skip_bits < 0 || skip_bits > 7 || (skip_bits > 0 && !size)) @@ -36,6 +37,14 @@ uper_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sp */ if(!td->uper_decoder) _ASN_DECODE_FAILED; /* PER is not compiled in */ - return td->uper_decoder(opt_codec_ctx, td, 0, sptr, &pd); + rval = td->uper_decoder(opt_codec_ctx, td, 0, sptr, &pd); + if(rval.code == RC_FAIL) { + rval.consumed = 0; + } else { + /* Return the number of consumed bits */ + rval.consumed = ((pd.buffer - (const uint8_t *)buffer) << 3) + + pd.nboff - skip_bits; + } + return rval; } From f49ca904cc201c96951eee551b4f79f95f13322a Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 18 Sep 2006 20:04:14 +0000 Subject: [PATCH 1210/1469] more testing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1210 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.makefile.regen | 33 ++++++++-- examples/sample.source.LDAP3/Makefile | 61 +++++++++++++----- examples/sample.source.MHEG5/Makefile | 37 ++++++++++- examples/sample.source.PKIX1/Makefile | 61 +++++++++++++----- examples/sample.source.RRC/Makefile | 31 +++++++-- .../sample-DL-DCCH-Message-1-padded.per | Bin 0 -> 14 bytes .../sample-DL-DCCH-Message-1.per | Bin 0 -> 12 bytes examples/sample.source.TAP3/Makefile | 61 +++++++++++++----- 8 files changed, 225 insertions(+), 59 deletions(-) create mode 100644 examples/sample.source.RRC/sample-DL-DCCH-Message-1-padded.per create mode 100644 examples/sample.source.RRC/sample-DL-DCCH-Message-1.per diff --git a/examples/sample.makefile.regen b/examples/sample.makefile.regen index 1b8f8c4ad..b3b0e0d8b 100755 --- a/examples/sample.makefile.regen +++ b/examples/sample.makefile.regen @@ -44,7 +44,7 @@ cat Makefile.am.sample \ > Makefile.$$ ( echo - echo "${ASN1PDU}.c: $0" + echo "${ASN1PDU}.c: $0 ${ASN1MODULES}" echo " make regen-makefile" echo " @touch ${ASN1PDU}.c" echo " make" @@ -82,17 +82,36 @@ cat Makefile.am.sample \ echo ' rm -f ./.tmp.[12].$$$$; \' echo ' done; fi' echo " @if test -f ./sample-${ASN1PDU}-1.per ; then \\" - echo " for f in ./sample-${ASN1PDU}-*.per; do \\" + echo " for f in ./sample-${ASN1PDU}-[1-9].per; do \\" echo ' echo "Recoding $$f into DER into XER and back..."; \' - echo ' ./${TARGET} -iper -oder -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -iper -oder -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -iper -oder -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -iper -oder -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \' + echo ' ./${TARGET} -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \' + echo ' ./${TARGET} -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \' + echo ' diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \' + echo ' diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \' + echo ' diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \' echo ' ./${TARGET} -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \' echo ' ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \' + echo ' ./${TARGET} -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \' + echo ' diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 2; \' + echo ' rm -f ./.tmp.[1234].$$$$; \' + echo ' done; fi' + echo " @if test -f ./sample-${ASN1PDU}-1-padded.per ; then \\" + echo " for f in ./sample-${ASN1PDU}-[1-9]-padded.per; do \\" + echo ' echo "Recoding byte-padded $$f into DER into XER and back..."; \' + echo ' ./${TARGET} -per-padded -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -per-padded -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \' + echo ' ./${TARGET} -per-padded -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \' + echo ' ./${TARGET} -per-padded -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \' + echo ' diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \' + echo ' diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \' + echo ' diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \' + echo ' ./${TARGET} -per-padded -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \' echo ' ./${TARGET} -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \' echo ' diff $$f ./.tmp.1.$$$$ || exit 2; \' - echo ' rm -f ./.tmp.[12].$$$$; \' + echo ' rm -f ./.tmp.[1234].$$$$; \' echo ' done; fi' echo ' @echo ================' echo ' @echo All tests passed' diff --git a/examples/sample.source.LDAP3/Makefile b/examples/sample.source.LDAP3/Makefile index 1c4ff2340..6de7245e8 100644 --- a/examples/sample.source.LDAP3/Makefile +++ b/examples/sample.source.LDAP3/Makefile @@ -187,7 +187,7 @@ regenerate-from-asn1-source: ../../asn1c/asn1c -S ../../skeletons -fcompound-names ../rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1 -LDAPMessage.c: ../sample.makefile.regen +LDAPMessage.c: ../sample.makefile.regen ../rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1 make regen-makefile @touch LDAPMessage.c make @@ -203,27 +203,58 @@ check: ${TARGET} @if test -f ./sample-LDAPMessage-1.[db]er ; then \ for f in ./sample-LDAPMessage-*.[db]er; do \ echo "Recoding $$f into XER and back..."; \ - ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$ || exit 2; \ - ./${TARGET} -ixer -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ - diff ./.tmp.1.$$ ./.tmp.2.$$ || exit 2; \ - rm -f ./.tmp.[12].$$; \ + ./${TARGET} -iber -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ + rm -f ./.tmp.[12].$$$$; \ done; fi @if test -f ./sample-LDAPMessage-1.xer ; then \ for f in ./sample-LDAPMessage-*.xer; do \ echo "Recoding $$f into DER and back..."; \ - ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$ || exit 2; \ - ./${TARGET} -iber -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ - diff $$f ./.tmp.2.$$ || exit 2; \ - rm -f ./.tmp.[12].$$; \ + ./${TARGET} -ixer -oder -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + diff $$f ./.tmp.2.$$$$ || exit 2; \ + rm -f ./.tmp.[12].$$$$; \ done; fi @if test -f ./sample-LDAPMessage-1.per ; then \ - for f in ./sample-LDAPMessage-*.per; do \ + for f in ./sample-LDAPMessage-[1-9].per; do \ echo "Recoding $$f into DER into XER and back..."; \ - ./${TARGET} -iper -oder $$f > ./.tmp.1.$$ || exit 2; \ - ./${TARGET} -ider -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ - ./${TARGET} -ixer -oper ./.tmp.2.$$ > ./.tmp.1.$$ || exit 2; \ - diff $$f ./.tmp.1.$$ || exit 2; \ - rm -f ./.tmp.[12].$$; \ + ./${TARGET} -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ + ./${TARGET} -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ + diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \ + diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \ + ./${TARGET} -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 2; \ + rm -f ./.tmp.[1234].$$$$; \ + done; fi + @if test -f ./sample-LDAPMessage-1-padded.per ; then \ + for f in ./sample-LDAPMessage-[1-9]-padded.per; do \ + echo "Recoding byte-padded $$f into DER into XER and back..."; \ + ./${TARGET} -per-padded -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -per-padded -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -per-padded -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ + ./${TARGET} -per-padded -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ + diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \ + diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \ + ./${TARGET} -per-padded -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ + diff $$f ./.tmp.1.$$$$ || exit 2; \ + rm -f ./.tmp.[1234].$$$$; \ done; fi @echo ================ @echo All tests passed diff --git a/examples/sample.source.MHEG5/Makefile b/examples/sample.source.MHEG5/Makefile index db9e19505..53490efd9 100644 --- a/examples/sample.source.MHEG5/Makefile +++ b/examples/sample.source.MHEG5/Makefile @@ -477,7 +477,7 @@ regenerate-from-asn1-source: ../../asn1c/asn1c -S ../../skeletons -fcompound-names ../ISO13522-MHEG-5.asn -InterchangedObject.c: ../sample.makefile.regen +InterchangedObject.c: ../sample.makefile.regen ../ISO13522-MHEG-5.asn make regen-makefile @touch InterchangedObject.c make @@ -493,6 +493,10 @@ check: ${TARGET} @if test -f ./sample-InterchangedObject-1.[db]er ; then \ for f in ./sample-InterchangedObject-*.[db]er; do \ echo "Recoding $$f into XER and back..."; \ + ./${TARGET} -iber -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \ ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ ./${TARGET} -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ @@ -501,19 +505,46 @@ check: ${TARGET} @if test -f ./sample-InterchangedObject-1.xer ; then \ for f in ./sample-InterchangedObject-*.xer; do \ echo "Recoding $$f into DER and back..."; \ + ./${TARGET} -ixer -oder -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \ ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ diff $$f ./.tmp.2.$$$$ || exit 2; \ rm -f ./.tmp.[12].$$$$; \ done; fi @if test -f ./sample-InterchangedObject-1.per ; then \ - for f in ./sample-InterchangedObject-*.per; do \ + for f in ./sample-InterchangedObject-[1-9].per; do \ echo "Recoding $$f into DER into XER and back..."; \ + ./${TARGET} -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ + ./${TARGET} -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ + diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \ + diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \ ./${TARGET} -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 2; \ + rm -f ./.tmp.[1234].$$$$; \ + done; fi + @if test -f ./sample-InterchangedObject-1-padded.per ; then \ + for f in ./sample-InterchangedObject-[1-9]-padded.per; do \ + echo "Recoding byte-padded $$f into DER into XER and back..."; \ + ./${TARGET} -per-padded -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -per-padded -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -per-padded -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ + ./${TARGET} -per-padded -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ + diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \ + diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \ + ./${TARGET} -per-padded -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ ./${TARGET} -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ diff $$f ./.tmp.1.$$$$ || exit 2; \ - rm -f ./.tmp.[12].$$$$; \ + rm -f ./.tmp.[1234].$$$$; \ done; fi @echo ================ @echo All tests passed diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index de54195c5..b0fde7f7b 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -369,7 +369,7 @@ regenerate-from-asn1-source: ../../asn1c/asn1c -S ../../skeletons ../rfc3280-PKIX1Explicit88.asn1 ../rfc3280-PKIX1Implicit88.asn1 -Certificate.c: ../sample.makefile.regen +Certificate.c: ../sample.makefile.regen ../rfc3280-*.asn1 make regen-makefile @touch Certificate.c make @@ -385,27 +385,58 @@ check: ${TARGET} @if test -f ./sample-Certificate-1.[db]er ; then \ for f in ./sample-Certificate-*.[db]er; do \ echo "Recoding $$f into XER and back..."; \ - ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$ || exit 2; \ - ./${TARGET} -ixer -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ - diff ./.tmp.1.$$ ./.tmp.2.$$ || exit 2; \ - rm -f ./.tmp.[12].$$; \ + ./${TARGET} -iber -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ + rm -f ./.tmp.[12].$$$$; \ done; fi @if test -f ./sample-Certificate-1.xer ; then \ for f in ./sample-Certificate-*.xer; do \ echo "Recoding $$f into DER and back..."; \ - ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$ || exit 2; \ - ./${TARGET} -iber -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ - diff $$f ./.tmp.2.$$ || exit 2; \ - rm -f ./.tmp.[12].$$; \ + ./${TARGET} -ixer -oder -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + diff $$f ./.tmp.2.$$$$ || exit 2; \ + rm -f ./.tmp.[12].$$$$; \ done; fi @if test -f ./sample-Certificate-1.per ; then \ - for f in ./sample-Certificate-*.per; do \ + for f in ./sample-Certificate-[1-9].per; do \ echo "Recoding $$f into DER into XER and back..."; \ - ./${TARGET} -iper -oder $$f > ./.tmp.1.$$ || exit 2; \ - ./${TARGET} -ider -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ - ./${TARGET} -ixer -oper ./.tmp.2.$$ > ./.tmp.1.$$ || exit 2; \ - diff $$f ./.tmp.1.$$ || exit 2; \ - rm -f ./.tmp.[12].$$; \ + ./${TARGET} -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ + ./${TARGET} -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ + diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \ + diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \ + ./${TARGET} -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 2; \ + rm -f ./.tmp.[1234].$$$$; \ + done; fi + @if test -f ./sample-Certificate-1-padded.per ; then \ + for f in ./sample-Certificate-[1-9]-padded.per; do \ + echo "Recoding byte-padded $$f into DER into XER and back..."; \ + ./${TARGET} -per-padded -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -per-padded -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -per-padded -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ + ./${TARGET} -per-padded -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ + diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \ + diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \ + ./${TARGET} -per-padded -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ + diff $$f ./.tmp.1.$$$$ || exit 2; \ + rm -f ./.tmp.[1234].$$$$; \ done; fi @echo ================ @echo All tests passed diff --git a/examples/sample.source.RRC/Makefile b/examples/sample.source.RRC/Makefile index f694fc438..6e623894d 100644 --- a/examples/sample.source.RRC/Makefile +++ b/examples/sample.source.RRC/Makefile @@ -4764,7 +4764,7 @@ regenerate-from-asn1-source: ../../asn1c/asn1c -S ../../skeletons -fcompound-names -pdu=auto -gen-PER ../rrc.asn1 -DL-DCCH-Message.c: ../sample.makefile.regen +DL-DCCH-Message.c: ../sample.makefile.regen ../rrc.asn1 make regen-makefile @touch DL-DCCH-Message.c make @@ -4802,13 +4802,36 @@ check: ${TARGET} rm -f ./.tmp.[12].$$$$; \ done; fi @if test -f ./sample-DL-DCCH-Message-1.per ; then \ - for f in ./sample-DL-DCCH-Message-*.per; do \ + for f in ./sample-DL-DCCH-Message-[1-9].per; do \ echo "Recoding $$f into DER into XER and back..."; \ + ./${TARGET} -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ + ./${TARGET} -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ + diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \ + diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \ ./${TARGET} -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 2; \ + rm -f ./.tmp.[1234].$$$$; \ + done; fi + @if test -f ./sample-DL-DCCH-Message-1-padded.per ; then \ + for f in ./sample-DL-DCCH-Message-[1-9]-padded.per; do \ + echo "Recoding byte-padded $$f into DER into XER and back..."; \ + ./${TARGET} -per-padded -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -per-padded -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -per-padded -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ + ./${TARGET} -per-padded -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 1; \ + diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \ + diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 3; \ + ./${TARGET} -per-padded -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ ./${TARGET} -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ - diff $$f ./.tmp.1.$$$$ || exit 2; \ - rm -f ./.tmp.[12].$$$$; \ + diff $$f ./.tmp.1.$$$$ || exit 4; \ + rm -f ./.tmp.[1234].$$$$; \ done; fi @echo ================ @echo All tests passed diff --git a/examples/sample.source.RRC/sample-DL-DCCH-Message-1-padded.per b/examples/sample.source.RRC/sample-DL-DCCH-Message-1-padded.per new file mode 100644 index 0000000000000000000000000000000000000000..2ae327a3267067d41705ec950daf6d7190ab5bbd GIT binary patch literal 14 UcmWe_U|?W4&~Shu-T}w}02+@2H2?qr literal 0 HcmV?d00001 diff --git a/examples/sample.source.RRC/sample-DL-DCCH-Message-1.per b/examples/sample.source.RRC/sample-DL-DCCH-Message-1.per new file mode 100644 index 0000000000000000000000000000000000000000..584e85be7de0ad0c0e00e72eb17eefea9e6c65da GIT binary patch literal 12 TcmWe_U|>jaNMO)kz`y_i5F`R+ literal 0 HcmV?d00001 diff --git a/examples/sample.source.TAP3/Makefile b/examples/sample.source.TAP3/Makefile index 4dd100caf..e3826163c 100644 --- a/examples/sample.source.TAP3/Makefile +++ b/examples/sample.source.TAP3/Makefile @@ -703,7 +703,7 @@ regenerate-from-asn1-source: ../../asn1c/asn1c -S ../../skeletons ../tap3.asn1 -DataInterChange.c: ../sample.makefile.regen +DataInterChange.c: ../sample.makefile.regen ../tap3.asn1 make regen-makefile @touch DataInterChange.c make @@ -719,27 +719,58 @@ check: ${TARGET} @if test -f ./sample-DataInterChange-1.[db]er ; then \ for f in ./sample-DataInterChange-*.[db]er; do \ echo "Recoding $$f into XER and back..."; \ - ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$ || exit 2; \ - ./${TARGET} -ixer -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ - diff ./.tmp.1.$$ ./.tmp.2.$$ || exit 2; \ - rm -f ./.tmp.[12].$$; \ + ./${TARGET} -iber -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ + rm -f ./.tmp.[12].$$$$; \ done; fi @if test -f ./sample-DataInterChange-1.xer ; then \ for f in ./sample-DataInterChange-*.xer; do \ echo "Recoding $$f into DER and back..."; \ - ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$ || exit 2; \ - ./${TARGET} -iber -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ - diff $$f ./.tmp.2.$$ || exit 2; \ - rm -f ./.tmp.[12].$$; \ + ./${TARGET} -ixer -oder -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + diff $$f ./.tmp.2.$$$$ || exit 2; \ + rm -f ./.tmp.[12].$$$$; \ done; fi @if test -f ./sample-DataInterChange-1.per ; then \ - for f in ./sample-DataInterChange-*.per; do \ + for f in ./sample-DataInterChange-[1-9].per; do \ echo "Recoding $$f into DER into XER and back..."; \ - ./${TARGET} -iper -oder $$f > ./.tmp.1.$$ || exit 2; \ - ./${TARGET} -ider -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ - ./${TARGET} -ixer -oper ./.tmp.2.$$ > ./.tmp.1.$$ || exit 2; \ - diff $$f ./.tmp.1.$$ || exit 2; \ - rm -f ./.tmp.[12].$$; \ + ./${TARGET} -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ + ./${TARGET} -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ + diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \ + diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \ + ./${TARGET} -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 2; \ + rm -f ./.tmp.[1234].$$$$; \ + done; fi + @if test -f ./sample-DataInterChange-1-padded.per ; then \ + for f in ./sample-DataInterChange-[1-9]-padded.per; do \ + echo "Recoding byte-padded $$f into DER into XER and back..."; \ + ./${TARGET} -per-padded -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -per-padded -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -per-padded -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ + ./${TARGET} -per-padded -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ + diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \ + diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \ + ./${TARGET} -per-padded -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ + diff $$f ./.tmp.1.$$$$ || exit 2; \ + rm -f ./.tmp.[1234].$$$$; \ done; fi @echo ================ @echo All tests passed From cd83dde937e1d01f771a1320ec5442e208203b8a Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 18 Sep 2006 20:05:34 +0000 Subject: [PATCH 1211/1469] more debug and per support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1211 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/converter-sample.c | 250 ++++++++++++++++++++++++++++++----- 1 file changed, 214 insertions(+), 36 deletions(-) diff --git a/skeletons/converter-sample.c b/skeletons/converter-sample.c index d91bb9e7b..b423990ef 100644 --- a/skeletons/converter-sample.c +++ b/skeletons/converter-sample.c @@ -40,10 +40,11 @@ static int write_out(const void *buffer, size_t size, void *key); static FILE *argument_to_file(char *av[], int idx); static char *argument_to_name(char *av[], int idx); - int opt_debug; /* -d */ -static int opt_check; /* -c */ -static int opt_stack; /* -s */ -static int opt_onepdu; /* -1 */ + int opt_debug; /* -d (or -dd) */ +static int opt_check; /* -c (constraints checking) */ +static int opt_stack; /* -s (maximum stack size) */ +static int opt_ippad; /* -per-padded (PER input is byte-padded) */ +static int opt_onepdu; /* -1 (decode single PDU) */ /* Input data format selector */ static enum input_format { @@ -88,7 +89,7 @@ main(int ac, char *av[]) { /* * Pocess the command-line argments. */ - while((ch = getopt(ac, av, "i:o:b:cdn:p:hs:")) != -1) + while((ch = getopt(ac, av, "i:o:1b:cdn:p:hs:")) != -1) switch(ch) { case 'i': if(optarg[0] == 'b') { iform = INP_BER; break; } @@ -136,19 +137,24 @@ main(int ac, char *av[]) { } break; case 'p': + if(strcmp(optarg, "er-padded") == 0) { + opt_ippad = 1; + break; + } #ifdef ASN_PDU_COLLECTION - { + if(strcmp(optarg, "list") == 0) { + asn_TYPE_descriptor_t **pdu = asn_pdu_collection; + fprintf(stderr, "Available PDU types:\n"); + for(; *pdu; pdu++) printf("%s\n", (*pdu)->name); + exit(0); + } else if(optarg[0] >= 'A' && optarg[0] <= 'Z') { asn_TYPE_descriptor_t **pdu = asn_pdu_collection; - if(optarg[0] < 'A' || optarg[0] > 'Z') { - fprintf(stderr, "Available PDU types:\n"); - for(; *pdu; pdu++) printf("%s\n", (*pdu)->name); - exit(0); - } while(*pdu && strcmp((*pdu)->name, optarg)) pdu++; if(*pdu) { pduType = *pdu; break; } + fprintf(stderr, "-p %s: Unrecognized PDU\n", optarg); } #endif /* ASN_PDU_COLLECTION */ - fprintf(stderr, "-p %s: Unrecognized PDU\n", optarg); + fprintf(stderr, "-p %s: Unrecognized option\n", optarg); exit(EX_UNAVAILABLE); case 's': opt_stack = atoi(optarg); @@ -179,6 +185,9 @@ main(int ac, char *av[]) { " -oxer Output in XER (XML Encoding Rules) (DEFAULT)\n" " -otext Output in plain semi-structured text (dump)\n" " -onull Verify (decode) input, but do not output\n"); + if(pduType->uper_decoder) + fprintf(stderr, + " -per-padded Assume PER PDUs are byte-padded (-iper)\n"); #ifdef ASN_PDU_COLLECTION fprintf(stderr, " -p Specify PDU type to decode\n" @@ -292,30 +301,164 @@ main(int ac, char *av[]) { } static struct dynamic_buffer { - char *data; /* Pointer to the data bytes */ + uint8_t *data; /* Pointer to the data bytes */ size_t offset; /* Offset from the start */ size_t length; /* Length of meaningful contents */ - size_t unbit; /* Unused bits in the last byte */ + size_t unbits; /* Unused bits in the last byte */ size_t allocated; /* Allocated memory for data */ int nreallocs; /* Number of data reallocations */ off_t bytes_shifted; /* Number of bytes ever shifted */ } DynamicBuffer; +static void +buffer_dump() { + uint8_t *p = DynamicBuffer.data + DynamicBuffer.offset; + uint8_t *e = p + DynamicBuffer.length - (DynamicBuffer.unbits ? 1 : 0); + if(!opt_debug) return; + DEBUG("Buffer: { d=%p, o=%ld, l=%ld, u=%ld, a=%ld, s=%ld }", + DynamicBuffer.data, + (long)DynamicBuffer.offset, + (long)DynamicBuffer.length, + (long)DynamicBuffer.unbits, + (long)DynamicBuffer.allocated, + (long)DynamicBuffer.bytes_shifted); + for(; p < e; p++) { + fprintf(stderr, " %c%c%c%c%c%c%c%c", + ((*p >> 7) & 1) ? '1' : '0', + ((*p >> 6) & 1) ? '1' : '0', + ((*p >> 5) & 1) ? '1' : '0', + ((*p >> 4) & 1) ? '1' : '0', + ((*p >> 3) & 1) ? '1' : '0', + ((*p >> 2) & 1) ? '1' : '0', + ((*p >> 1) & 1) ? '1' : '0', + ((*p >> 0) & 1) ? '1' : '0'); + } + if(DynamicBuffer.unbits) { + int shift; + fprintf(stderr, " "); + for(shift = 7; shift >= DynamicBuffer.unbits; shift--) + fprintf(stderr, "%c", ((*p >> shift) & 1) ? '1' : '0'); + fprintf(stderr, " %d:%d\n", + DynamicBuffer.length - 1, 8 - DynamicBuffer.unbits); + } else { + fprintf(stderr, " %d\n", DynamicBuffer.length); + } +} + +/* + * Move the buffer content left N bits, possibly joining it with + * preceeding content. + */ +static void +buffer_shift_left(size_t offset, int bits) { + uint8_t *ptr = DynamicBuffer.data + DynamicBuffer.offset + offset; + uint8_t *end = DynamicBuffer.data + DynamicBuffer.offset + + DynamicBuffer.length - 1; + + if(!bits) return; + + DEBUG("Shifting left %d bits off %ld (o=%ld, u=%ld, l=%ld)", + bits, (long)offset, + (long)DynamicBuffer.offset, + (long)DynamicBuffer.unbits, + (long)DynamicBuffer.length); + + if(offset) { + int right; + right = ptr[0] >> (8 - bits); + + DEBUG("oleft: %c%c%c%c%c%c%c%c", + ((ptr[-1] >> 7) & 1) ? '1' : '0', + ((ptr[-1] >> 6) & 1) ? '1' : '0', + ((ptr[-1] >> 5) & 1) ? '1' : '0', + ((ptr[-1] >> 4) & 1) ? '1' : '0', + ((ptr[-1] >> 3) & 1) ? '1' : '0', + ((ptr[-1] >> 2) & 1) ? '1' : '0', + ((ptr[-1] >> 1) & 1) ? '1' : '0', + ((ptr[-1] >> 0) & 1) ? '1' : '0'); + + DEBUG("oriht: %c%c%c%c%c%c%c%c", + ((ptr[0] >> 7) & 1) ? '1' : '0', + ((ptr[0] >> 6) & 1) ? '1' : '0', + ((ptr[0] >> 5) & 1) ? '1' : '0', + ((ptr[0] >> 4) & 1) ? '1' : '0', + ((ptr[0] >> 3) & 1) ? '1' : '0', + ((ptr[0] >> 2) & 1) ? '1' : '0', + ((ptr[0] >> 1) & 1) ? '1' : '0', + ((ptr[0] >> 0) & 1) ? '1' : '0'); + + DEBUG("mriht: %c%c%c%c%c%c%c%c", + ((right >> 7) & 1) ? '1' : '0', + ((right >> 6) & 1) ? '1' : '0', + ((right >> 5) & 1) ? '1' : '0', + ((right >> 4) & 1) ? '1' : '0', + ((right >> 3) & 1) ? '1' : '0', + ((right >> 2) & 1) ? '1' : '0', + ((right >> 1) & 1) ? '1' : '0', + ((right >> 0) & 1) ? '1' : '0'); + + ptr[-1] = (ptr[-1] & (0xff << bits)) | right; + + DEBUG("after: %c%c%c%c%c%c%c%c", + ((ptr[-1] >> 7) & 1) ? '1' : '0', + ((ptr[-1] >> 6) & 1) ? '1' : '0', + ((ptr[-1] >> 5) & 1) ? '1' : '0', + ((ptr[-1] >> 4) & 1) ? '1' : '0', + ((ptr[-1] >> 3) & 1) ? '1' : '0', + ((ptr[-1] >> 2) & 1) ? '1' : '0', + ((ptr[-1] >> 1) & 1) ? '1' : '0', + ((ptr[-1] >> 0) & 1) ? '1' : '0'); + } + + buffer_dump(); + + for(; ptr < end; ptr++) { + int right = ptr[1] >> (8 - bits); + *ptr = (*ptr << bits) | right; + } + *ptr <<= bits; + + DEBUG("Unbits [%d=>", (int)DynamicBuffer.unbits); + if(DynamicBuffer.unbits == 0) { + DynamicBuffer.unbits += bits; + } else { + DynamicBuffer.unbits += bits; + if(DynamicBuffer.unbits > 7) { + DynamicBuffer.unbits -= 8; + DynamicBuffer.length--; + DynamicBuffer.bytes_shifted++; + } + } + DEBUG("Unbits =>%d]", (int)DynamicBuffer.unbits); + + buffer_dump(); + + DEBUG("Shifted. Now (o=%ld, u=%ld l=%ld)", + (long)DynamicBuffer.offset, + (long)DynamicBuffer.unbits, + (long)DynamicBuffer.length); + + +} + /* * Ensure that the buffer contains at least this amount of free space. */ -static void add_bytes_to_buffer(const void *data2add, size_t bySize) { +static void add_bytes_to_buffer(const void *data2add, size_t bytes) { + + if(bytes == 0) return; - DEBUG("add_bytes(%ld) { o=%ld l=%ld s=%ld }", - (long)bySize, + DEBUG("=> add_bytes(%ld) { o=%ld l=%ld u=%ld, s=%ld }", + (long)bytes, (long)DynamicBuffer.offset, (long)DynamicBuffer.length, + (long)DynamicBuffer.unbits, (long)DynamicBuffer.allocated); if(DynamicBuffer.allocated - >= (DynamicBuffer.offset + DynamicBuffer.length + bySize)) { + >= (DynamicBuffer.offset + DynamicBuffer.length + bytes)) { DEBUG("\tNo buffer reallocation is necessary"); - } else if(bySize <= DynamicBuffer.offset) { + } else if(bytes <= DynamicBuffer.offset) { DEBUG("\tContents shifted by %ld", DynamicBuffer.offset); /* Shift the buffer contents */ @@ -325,7 +468,7 @@ static void add_bytes_to_buffer(const void *data2add, size_t bySize) { DynamicBuffer.bytes_shifted += DynamicBuffer.offset; DynamicBuffer.offset = 0; } else { - size_t newsize = (DynamicBuffer.allocated << 2) + bySize; + size_t newsize = (DynamicBuffer.allocated << 2) + bytes; void *p = MALLOC(newsize); if(!p) { perror("malloc()"); @@ -343,14 +486,27 @@ static void add_bytes_to_buffer(const void *data2add, size_t bySize) { newsize, DynamicBuffer.nreallocs); } - memcpy(DynamicBuffer.data + DynamicBuffer.offset + DynamicBuffer.length, - data2add, bySize); - DynamicBuffer.length += bySize; + memcpy(DynamicBuffer.data + + DynamicBuffer.offset + DynamicBuffer.length, + data2add, bytes); + DynamicBuffer.length += bytes; + if(DynamicBuffer.unbits) { + int bits = DynamicBuffer.unbits; + DynamicBuffer.unbits = 0; + buffer_shift_left(DynamicBuffer.length - bytes, bits); + } + + DEBUG("<= add_bytes(%ld) { o=%ld l=%ld u=%ld, s=%ld }", + (long)bytes, + (long)DynamicBuffer.offset, + (long)DynamicBuffer.length, + (long)DynamicBuffer.unbits, + (long)DynamicBuffer.allocated); } static void * data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *name, ssize_t suggested_bufsize, int on_first_pdu) { - static char *fbuf; + static uint8_t *fbuf; static ssize_t fbuf_size; static asn_codec_ctx_t s_codec_ctx; asn_codec_ctx_t *opt_codec_ctx = 0; @@ -358,6 +514,7 @@ data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *na asn_dec_rval_t rval; size_t old_offset; size_t new_offset; + int tolerate_eof; size_t rd; if(!file) { @@ -386,7 +543,7 @@ data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *na if(on_first_pdu) { DynamicBuffer.offset = 0; DynamicBuffer.length = 0; - DynamicBuffer.unbit = 0; + DynamicBuffer.unbits = 0; DynamicBuffer.allocated = 0; DynamicBuffer.bytes_shifted = 0; DynamicBuffer.nreallocs = 0; @@ -398,7 +555,11 @@ data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *na rval.code = RC_WMORE; rval.consumed = 0; - while((rd = fread(fbuf, 1, fbuf_size, file)) || !feof(file)) { + for(tolerate_eof = 1; /* Allow EOF first time buffer is non-empty */ + (rd = fread(fbuf, 1, fbuf_size, file)) + || feof(file) == 0 + || (tolerate_eof && DynamicBuffer.length) + ;) { int ecbits = 0; /* Extra consumed bits in case of PER */ char *i_bptr; size_t i_size; @@ -407,7 +568,7 @@ data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *na * Copy the data over, or use the original buffer. */ if(DynamicBuffer.allocated) { - /* Append the new data into the intermediate buffer */ + /* Append new data into the existing dynamic buffer */ add_bytes_to_buffer(fbuf, rd); i_bptr = DynamicBuffer.data + DynamicBuffer.offset; i_size = DynamicBuffer.length; @@ -429,12 +590,18 @@ data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *na break; case INP_PER: rval = uper_decode(opt_codec_ctx, pduType, - (void **)&structure, i_bptr, i_size, 0); + (void **)&structure, i_bptr, i_size, 0, + DynamicBuffer.unbits); ecbits = rval.consumed % 8; /* Extra bits */ rval.consumed /= 8; /* Convert to value in bytes! */ + /* Check if input is byte-padded at the end */ + if(opt_ippad && ecbits && rval.code == RC_OK) { + rval.consumed++; + ecbits = 0; + } break; } - DEBUG("decode(%ld) consumed %ld+%d (%ld), code %d", + DEBUG("decode(%ld) consumed %ld+%db (%ld), code %d", (long)DynamicBuffer.length, (long)rval.consumed, ecbits, (long)i_size, rval.code); @@ -444,10 +611,12 @@ data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *na * Flush remainder into the intermediate buffer. */ if(rval.code != RC_FAIL && rval.consumed < rd) { - DEBUG("Saving %d bytes", rd - rval.consumed); add_bytes_to_buffer(fbuf + rval.consumed, - rd - rval.consumed); + rd - rval.consumed); + buffer_shift_left(0, ecbits); + DynamicBuffer.bytes_shifted = rval.consumed; rval.consumed = 0; + ecbits = 0; } } @@ -463,15 +632,20 @@ data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *na switch(rval.code) { case RC_OK: - DEBUG("RC_OK, finishing up with %ld", - (long)rval.consumed); + if(ecbits) buffer_shift_left(0, ecbits); + DEBUG("RC_OK, finishing up with %ld+%d", + (long)rval.consumed, ecbits); return structure; case RC_WMORE: - DEBUG("RC_WMORE, continuing %ld with %ld..%ld..%ld", + DEBUG("RC_WMORE, continuing read=%ld, cons=%ld " + " with %ld..%ld-%ld..%ld", + (long)rd, (long)rval.consumed, (long)DynamicBuffer.offset, (long)DynamicBuffer.length, + (long)DynamicBuffer.unbits, (long)DynamicBuffer.allocated); + if(!rd) tolerate_eof--; continue; case RC_FAIL: break; @@ -488,7 +662,11 @@ data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *na * Print a message and return failure only if not EOF, * unless this is our first PDU (empty file). */ - if(on_first_pdu || new_offset != old_offset) { + if((on_first_pdu || new_offset != old_offset || DynamicBuffer.length) + && (iform != INP_XER || on_first_pdu)) { + DEBUG("ofp %d, no=%ld, oo=%ld, dbl=%ld", + on_first_pdu, (long)new_offset, (long)old_offset, + (long)DynamicBuffer.length); fprintf(stderr, "%s: " "Decode failed past byte %ld: %s\n", name, (long)new_offset, @@ -497,7 +675,7 @@ data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *na : "Input processing error"); errno = (rval.code == RC_WMORE) ? ENOMSG : EBADMSG; } else { - /* Got EOF after a few successful PDU */ + /* Got EOF after a few successful PDUs */ errno = 0; } From 619448ed1d835d53eaba8e9e6d089c464bf3436d Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 18 Sep 2006 20:05:55 +0000 Subject: [PATCH 1212/1469] per encoding support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1212 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/INTEGER.c | 8 ++++---- skeletons/NativeEnumerated.c | 6 +++--- skeletons/OCTET_STRING.c | 23 ++++++++++++----------- skeletons/asn_codecs.h | 6 ++++++ skeletons/constr_CHOICE.c | 10 +++++----- skeletons/constr_SEQUENCE.c | 4 ++-- skeletons/constr_SET_OF.c | 9 +++++---- skeletons/per_decoder.c | 17 +++++++++++------ skeletons/per_decoder.h | 3 ++- skeletons/per_support.c | 6 ++++++ 10 files changed, 56 insertions(+), 36 deletions(-) diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 5a0eccee2..9c8b9ed3a 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -571,7 +571,7 @@ INTEGER_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, if(ct && ct->flags & APC_EXTENSIBLE) { int inext = per_get_few_bits(pd, 1); - if(inext < 0) _ASN_DECODE_FAILED; + if(inext < 0) _ASN_DECODE_STARVED; if(inext) ct = 0; } @@ -599,7 +599,7 @@ INTEGER_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ASN_DEBUG("Integer with range %d bits", ct->range_bits); if(ct->range_bits >= 0) { long value = per_get_few_bits(pd, ct->range_bits); - if(value < 0) _ASN_DECODE_FAILED; + if(value < 0) _ASN_DECODE_STARVED; ASN_DEBUG("Got value %ld + low %ld", value, ct->lower_bound); value += ct->lower_bound; @@ -619,14 +619,14 @@ INTEGER_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, /* Get the PER length */ len = uper_get_length(pd, -1, &repeat); - if(len < 0) _ASN_DECODE_FAILED; + if(len < 0) _ASN_DECODE_STARVED; p = REALLOC(st->buf, st->size + len + 1); if(!p) _ASN_DECODE_FAILED; st->buf = (uint8_t *)p; ret = per_get_many_bits(pd, &st->buf[st->size], 0, 8 * len); - if(ret < 0) _ASN_DECODE_FAILED; + if(ret < 0) _ASN_DECODE_STARVED; st->size += len; } while(repeat); st->buf[st->size] = 0; /* JIC */ diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c index fa16eb07b..e3af1ca49 100644 --- a/skeletons/NativeEnumerated.c +++ b/skeletons/NativeEnumerated.c @@ -96,13 +96,13 @@ NativeEnumerated_decode_uper(asn_codec_ctx_t *opt_codec_ctx, if(ct->flags & APC_EXTENSIBLE) { int inext = per_get_few_bits(pd, 1); - if(inext < 0) _ASN_DECODE_FAILED; + if(inext < 0) _ASN_DECODE_STARVED; if(inext) ct = 0; } if(ct && ct->range_bits >= 0) { value = per_get_few_bits(pd, ct->range_bits); - if(value < 0) _ASN_DECODE_FAILED; + if(value < 0) _ASN_DECODE_STARVED; if(value >= (specs->extension ? specs->extension - 1 : specs->map_count)) _ASN_DECODE_FAILED; @@ -113,7 +113,7 @@ NativeEnumerated_decode_uper(asn_codec_ctx_t *opt_codec_ctx, * X.691, #10.6: normally small non-negative whole number; */ value = uper_get_nsnnwn(pd); - if(value < 0) _ASN_DECODE_FAILED; + if(value < 0) _ASN_DECODE_STARVED; value += specs->extension - 1; if(value >= specs->map_count) _ASN_DECODE_FAILED; diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 7b83b618a..3bef5608c 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2003, 2004, 2005 Lev Walkin . + * Copyright (c) 2003, 2004, 2005, 2006 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ @@ -1231,7 +1231,7 @@ OCTET_STRING_decode_uper(asn_codec_ctx_t *opt_codec_ctx, if(ct->flags & APC_EXTENSIBLE) { int inext = per_get_few_bits(pd, 1); - if(inext < 0) RETURN(RC_FAIL); + if(inext < 0) RETURN(RC_WMORE); if(inext) ct = &asn_DEF_OCTET_STRING_constraint; consumed_myself = 0; } @@ -1254,7 +1254,7 @@ OCTET_STRING_decode_uper(asn_codec_ctx_t *opt_codec_ctx, if(ct->effective_bits == 0) { int ret = per_get_many_bits(pd, st->buf, 0, unit_bits * ct->upper_bound); - if(ret < 0) RETURN(RC_FAIL); + if(ret < 0) RETURN(RC_WMORE); consumed_myself += unit_bits * ct->upper_bound; st->buf[st->size] = 0; if(unit_bits == 1 && (ct->upper_bound & 0x7)) @@ -1271,11 +1271,12 @@ OCTET_STRING_decode_uper(asn_codec_ctx_t *opt_codec_ctx, /* Get the PER length */ len_bits = uper_get_length(pd, ct->effective_bits, &repeat); - if(len_bits < 0) RETURN(RC_FAIL); + if(len_bits < 0) RETURN(RC_WMORE); len_bits += ct->lower_bound; - ASN_DEBUG("Got per length eb %ld, len %ld", - (long)ct->effective_bits, (long)len_bits); + ASN_DEBUG("Got PER length eb %ld, len %ld, %s (%s)", + (long)ct->effective_bits, (long)len_bits, + repeat ? "repeat" : "once", td->name); if(unit_bits == 1) { len_bytes = (len_bits + 7) >> 3; if(len_bits & 0x7) @@ -1290,7 +1291,7 @@ OCTET_STRING_decode_uper(asn_codec_ctx_t *opt_codec_ctx, st->buf = (uint8_t *)p; ret = per_get_many_bits(pd, &st->buf[st->size], 0, len_bits); - if(ret < 0) RETURN(RC_FAIL); + if(ret < 0) RETURN(RC_WMORE); st->size += len_bytes; } while(repeat); st->buf[st->size] = 0; /* nul-terminate */ @@ -1327,8 +1328,8 @@ OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td, sizeinunits = sizeinunits * 8 - (st->bits_unused & 0x07); } - ASN_DEBUG("Encoding %s into %d units", - td->name, sizeinunits); + ASN_DEBUG("Encoding %s into %d units of %d bits", + td->name, sizeinunits, unit_bits); /* Figure out wheter size lies within PER visible consrtaint */ @@ -1361,7 +1362,7 @@ OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td, ret = per_put_few_bits(po, sizeinunits - ct->lower_bound, ct->effective_bits); if(ret) _ASN_ENCODE_FAILED; - ret = per_put_many_bits(po, st->buf, sizeinunits); + ret = per_put_many_bits(po, st->buf, sizeinunits * unit_bits); if(ret) _ASN_ENCODE_FAILED; _ASN_ENCODED_OK(er); } @@ -1381,7 +1382,7 @@ OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td, ASN_DEBUG("Encoding %d of %d", maySave, sizeinunits); - ret = per_put_many_bits(po, buf, maySave); + ret = per_put_many_bits(po, buf, maySave * unit_bits); if(ret) _ASN_ENCODE_FAILED; if(unit_bits == 1) diff --git a/skeletons/asn_codecs.h b/skeletons/asn_codecs.h index bd6b946f9..1ee737760 100644 --- a/skeletons/asn_codecs.h +++ b/skeletons/asn_codecs.h @@ -93,6 +93,12 @@ typedef struct asn_dec_rval_s { tmp_error.consumed = 0; \ return tmp_error; \ } while(0) +#define _ASN_DECODE_STARVED do { \ + asn_dec_rval_t tmp_error; \ + tmp_error.code = RC_WMORE; \ + tmp_error.consumed = 0; \ + return tmp_error; \ +} while(0) #ifdef __cplusplus } diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index a0a6d76a2..b8d6fa9a7 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -852,22 +852,22 @@ CHOICE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, if(ct && ct->flags & APC_EXTENSIBLE) { value = per_get_few_bits(pd, 1); - if(value < 0) _ASN_DECODE_FAILED; + if(value < 0) _ASN_DECODE_STARVED; if(value) ct = 0; /* Not restricted */ } if(ct && ct->range_bits >= 0) { value = per_get_few_bits(pd, ct->range_bits); - if(value < 0) _ASN_DECODE_FAILED; - if(value > ct->upper_bound) - _ASN_DECODE_FAILED; + if(value < 0) _ASN_DECODE_STARVED; ASN_DEBUG("CHOICE %s got index %d in range %d", td->name, value, ct->range_bits); + if(value > ct->upper_bound) + _ASN_DECODE_FAILED; } else { if(specs->ext_start == -1) _ASN_DECODE_FAILED; value = uper_get_nsnnwn(pd); - if(value < 0) _ASN_DECODE_FAILED; + if(value < 0) _ASN_DECODE_STARVED; value += specs->ext_start; if(value >= td->elements_count) _ASN_DECODE_FAILED; diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 9b7dcf328..b76943434 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -1048,7 +1048,7 @@ SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, /* Handle extensions */ if(specs->ext_before >= 0) { extpresent = per_get_few_bits(pd, 1); - if(extpresent < 0) _ASN_DECODE_FAILED; + if(extpresent < 0) _ASN_DECODE_STARVED; } /* Prepare a place and read-in the presence bitmap */ @@ -1058,7 +1058,7 @@ SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, /* Get the presence map */ if(per_get_many_bits(pd, opres, 0, specs->roms_count)) { FREEMEM(opres); - _ASN_DECODE_FAILED; + _ASN_DECODE_STARVED; } opmd.buffer = opres; opmd.nboff = 0; diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index 03c6fe28e..09f27db53 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -883,7 +883,7 @@ SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, if(ct && ct->flags & APC_EXTENSIBLE) { int value = per_get_few_bits(pd, 1); - if(value < 0) _ASN_DECODE_FAILED; + if(value < 0) _ASN_DECODE_STARVED; if(value) ct = 0; /* Not restricted! */ } @@ -892,7 +892,7 @@ SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, nelems = per_get_few_bits(pd, ct->effective_bits); ASN_DEBUG("Preparing to fetch %ld+%ld elements from %s", (long)nelems, ct->lower_bound, td->name); - if(nelems < 0) _ASN_DECODE_FAILED; + if(nelems < 0) _ASN_DECODE_STARVED; nelems += ct->lower_bound; } else { nelems = -1; @@ -905,7 +905,7 @@ SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ct ? ct->effective_bits : -1, &repeat); ASN_DEBUG("Got to decode %d elements (eff %d)", (int)nelems, (int)ct ? ct->effective_bits : -1); - if(nelems < 0) _ASN_DECODE_FAILED; + if(nelems < 0) _ASN_DECODE_STARVED; } for(i = 0; i < nelems; i++) { @@ -921,12 +921,13 @@ SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ASN_DEBUG("Failed to add element into %s", td->name); /* Fall through */ + rv.code == RC_FAIL; } else { ASN_DEBUG("Failed decoding %s of %s (SET OF)", elm->type->name, td->name); } if(ptr) ASN_STRUCT_FREE(*elm->type, ptr); - _ASN_DECODE_FAILED; + return rv; } nelems = -1; /* Allow uper_get_length() */ diff --git a/skeletons/per_decoder.c b/skeletons/per_decoder.c index f1b723f21..16dee3696 100644 --- a/skeletons/per_decoder.c +++ b/skeletons/per_decoder.c @@ -3,12 +3,14 @@ #include asn_dec_rval_t -uper_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buffer, size_t size, int skip_bits) { +uper_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buffer, size_t size, int skip_bits, int unused_bits) { asn_codec_ctx_t s_codec_ctx; asn_dec_rval_t rval; asn_per_data_t pd; - if(skip_bits < 0 || skip_bits > 7 || (skip_bits > 0 && !size)) + if(skip_bits < 0 || skip_bits > 7 + || unused_bits < 0 || unused_bits > 7 + || (unused_bits > 0 && !size)) _ASN_DECODE_FAILED; /* @@ -30,7 +32,9 @@ uper_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sp /* Fill in the position indicator */ pd.buffer = (const uint8_t *)buffer; pd.nboff = skip_bits; - pd.nbits = 8 * size; /* 8 is CHAR_BIT from */ + pd.nbits = 8 * size - unused_bits; /* 8 is CHAR_BIT from */ + if(pd.nboff > pd.nbits) + _ASN_DECODE_FAILED; /* * Invoke type-specific decoder. @@ -38,12 +42,13 @@ uper_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sp if(!td->uper_decoder) _ASN_DECODE_FAILED; /* PER is not compiled in */ rval = td->uper_decoder(opt_codec_ctx, td, 0, sptr, &pd); - if(rval.code == RC_FAIL) { - rval.consumed = 0; - } else { + if(rval.code == RC_OK) { /* Return the number of consumed bits */ rval.consumed = ((pd.buffer - (const uint8_t *)buffer) << 3) + pd.nboff - skip_bits; + } else { + /* PER codec is not a restartable */ + rval.consumed = 0; } return rval; } diff --git a/skeletons/per_decoder.h b/skeletons/per_decoder.h index 23cb7d7a7..26aaf5940 100644 --- a/skeletons/per_decoder.h +++ b/skeletons/per_decoder.h @@ -22,7 +22,8 @@ asn_dec_rval_t uper_decode(struct asn_codec_ctx_s *opt_codec_ctx, void **struct_ptr, /* Pointer to a target structure's pointer */ const void *buffer, /* Data to be decoded */ size_t size, /* Size of data buffer */ - int skip_bits /* Number of unused leading bits, 0..7 */ + int skip_bits, /* Number of unused leading bits, 0..7 */ + int unused_bits /* Number of unused tailing bits, 0..7 */ ); diff --git a/skeletons/per_support.c b/skeletons/per_support.c index b0149f896..c83441931 100644 --- a/skeletons/per_support.c +++ b/skeletons/per_support.c @@ -18,6 +18,9 @@ per_get_few_bits(asn_per_data_t *pd, int nbits) { if(nbits < 0 || pd->nboff + nbits > pd->nbits) return -1; + ASN_DEBUG("[PER get %d bits from %p+%d bits]", + nbits, pd->buffer, pd->nboff); + /* * Normalize position indicator. */ @@ -190,6 +193,9 @@ per_put_few_bits(asn_per_outp_t *po, uint32_t bits, int obits) { if(obits <= 0 || obits >= 32) return obits ? -1 : 0; + ASN_DEBUG("[PER put %d bits to %p+%d bits]", + obits, po->buffer, po->nboff); + /* * Normalize position indicator. */ From d4f903d4a9fbc2dc5ab4adcf3cd464b62857ad70 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 18 Sep 2006 20:26:24 +0000 Subject: [PATCH 1213/1469] more debug git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1213 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/converter-sample.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/skeletons/converter-sample.c b/skeletons/converter-sample.c index b423990ef..7ed49df8f 100644 --- a/skeletons/converter-sample.c +++ b/skeletons/converter-sample.c @@ -264,16 +264,18 @@ main(int ac, char *av[]) { break; case OUT_XER: /* -oxer */ if(xer_fprint(stdout, pduType, structure)) { - fprintf(stderr, "%s: Cannot convert into XML\n", - name); + fprintf(stderr, + "%s: Cannot convert %s into XML\n", + name, pduType->name); exit(EX_UNAVAILABLE); } break; case OUT_DER: erv = der_encode(pduType, structure, write_out, stdout); if(erv.encoded < 0) { - fprintf(stderr, "%s: Cannot convert into DER\n", - name); + fprintf(stderr, + "%s: Cannot convert %s into DER\n", + name, pduType->name); exit(EX_UNAVAILABLE); } DEBUG("Encoded in %ld bytes of DER", (long)erv.encoded); @@ -281,8 +283,9 @@ main(int ac, char *av[]) { case OUT_PER: erv = uper_encode(pduType, structure, write_out, stdout); if(erv.encoded < 0) { - fprintf(stderr, "%s: Cannot convert into Unaligned PER\n", - name); + fprintf(stderr, + "%s: Cannot convert %s into Unaligned PER\n", + name, pduType->name); exit(EX_UNAVAILABLE); } DEBUG("Encoded in %ld bits of UPER", (long)erv.encoded); From de70d6995234a9465058eb7c04641bda623f2e66 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 18 Sep 2006 21:19:32 +0000 Subject: [PATCH 1214/1469] debugging git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1214 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.makefile.regen | 31 ++++++------ examples/sample.source.LDAP3/Makefile | 31 ++++++------ examples/sample.source.RRC/Makefile | 44 +++++++++++------- .../sample-BCCH-BCH-Message-2-padded.per | Bin 0 -> 22 bytes skeletons/OCTET_STRING.c | 7 ++- skeletons/asn_codecs.h | 2 + skeletons/asn_codecs_prim.c | 26 +++-------- skeletons/converter-sample.c | 6 ++- skeletons/xer_decoder.c | 2 + 9 files changed, 78 insertions(+), 71 deletions(-) create mode 100644 examples/sample.source.RRC/sample-BCCH-BCH-Message-2-padded.per diff --git a/examples/sample.makefile.regen b/examples/sample.makefile.regen index b3b0e0d8b..57a0daef0 100755 --- a/examples/sample.makefile.regen +++ b/examples/sample.makefile.regen @@ -57,8 +57,8 @@ cat Makefile.am.sample \ echo " $0" echo echo 'check: ${TARGET}' - echo " @if test -f ./sample-${ASN1PDU}-1.[db]er ; then \\" - echo " for f in ./sample-${ASN1PDU}-*.[db]er; do \\" + echo " @if test -f sample-${ASN1PDU}-1.[db]er ; then \\" + echo " for f in sample-${ASN1PDU}-*.[db]er; do \\" echo ' echo "Recoding $$f into XER and back..."; \' echo ' ./${TARGET} -iber -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \' echo ' ./${TARGET} -iber -oxer -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \' @@ -69,8 +69,8 @@ cat Makefile.am.sample \ echo ' diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \' echo ' rm -f ./.tmp.[12].$$$$; \' echo ' done; fi' - echo " @if test -f ./sample-${ASN1PDU}-1.xer ; then \\" - echo " for f in ./sample-${ASN1PDU}-*.xer; do \\" + echo " @if test -f sample-${ASN1PDU}-1.xer ; then \\" + echo " for f in sample-${ASN1PDU}-*.xer; do \\" echo ' echo "Recoding $$f into DER and back..."; \' echo ' ./${TARGET} -ixer -oder -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \' echo ' ./${TARGET} -ixer -oder -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \' @@ -81,8 +81,8 @@ cat Makefile.am.sample \ echo ' diff $$f ./.tmp.2.$$$$ || exit 2; \' echo ' rm -f ./.tmp.[12].$$$$; \' echo ' done; fi' - echo " @if test -f ./sample-${ASN1PDU}-1.per ; then \\" - echo " for f in ./sample-${ASN1PDU}-[1-9].per; do \\" + echo " @if test -f sample-${ASN1PDU}-1.per ; then \\" + echo " for f in sample-${ASN1PDU}-[1-9].per; do \\" echo ' echo "Recoding $$f into DER into XER and back..."; \' echo ' ./${TARGET} -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \' echo ' ./${TARGET} -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \' @@ -97,19 +97,20 @@ cat Makefile.am.sample \ echo ' diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 2; \' echo ' rm -f ./.tmp.[1234].$$$$; \' echo ' done; fi' - echo " @if test -f ./sample-${ASN1PDU}-1-padded.per ; then \\" - echo " for f in ./sample-${ASN1PDU}-[1-9]-padded.per; do \\" + echo " @if test -f sample-${ASN1PDU}-1-padded.per ; then \\" + echo " for f in sample-*-[1-9]-padded.per; do \\" + echo ' pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z-]+)-[0-9].*/\1/"`; \' echo ' echo "Recoding byte-padded $$f into DER into XER and back..."; \' - echo ' ./${TARGET} -per-padded -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -per-padded -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \' - echo ' ./${TARGET} -per-padded -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \' - echo ' ./${TARGET} -per-padded -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \' + echo ' ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \' + echo ' ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \' + echo ' ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \' echo ' diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \' echo ' diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \' echo ' diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \' - echo ' ./${TARGET} -per-padded -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \' - echo ' ./${TARGET} -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -per-padded -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \' + echo ' ./${TARGET} -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \' echo ' diff $$f ./.tmp.1.$$$$ || exit 2; \' echo ' rm -f ./.tmp.[1234].$$$$; \' echo ' done; fi' diff --git a/examples/sample.source.LDAP3/Makefile b/examples/sample.source.LDAP3/Makefile index 6de7245e8..86a7917a6 100644 --- a/examples/sample.source.LDAP3/Makefile +++ b/examples/sample.source.LDAP3/Makefile @@ -200,8 +200,8 @@ regen-makefile: ../sample.makefile.regen check: ${TARGET} - @if test -f ./sample-LDAPMessage-1.[db]er ; then \ - for f in ./sample-LDAPMessage-*.[db]er; do \ + @if test -f sample-LDAPMessage-1.[db]er ; then \ + for f in sample-LDAPMessage-*.[db]er; do \ echo "Recoding $$f into XER and back..."; \ ./${TARGET} -iber -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ ./${TARGET} -iber -oxer -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ @@ -212,8 +212,8 @@ check: ${TARGET} diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ rm -f ./.tmp.[12].$$$$; \ done; fi - @if test -f ./sample-LDAPMessage-1.xer ; then \ - for f in ./sample-LDAPMessage-*.xer; do \ + @if test -f sample-LDAPMessage-1.xer ; then \ + for f in sample-LDAPMessage-*.xer; do \ echo "Recoding $$f into DER and back..."; \ ./${TARGET} -ixer -oder -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ ./${TARGET} -ixer -oder -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ @@ -224,8 +224,8 @@ check: ${TARGET} diff $$f ./.tmp.2.$$$$ || exit 2; \ rm -f ./.tmp.[12].$$$$; \ done; fi - @if test -f ./sample-LDAPMessage-1.per ; then \ - for f in ./sample-LDAPMessage-[1-9].per; do \ + @if test -f sample-LDAPMessage-1.per ; then \ + for f in sample-LDAPMessage-[1-9].per; do \ echo "Recoding $$f into DER into XER and back..."; \ ./${TARGET} -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ ./${TARGET} -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ @@ -240,19 +240,20 @@ check: ${TARGET} diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 2; \ rm -f ./.tmp.[1234].$$$$; \ done; fi - @if test -f ./sample-LDAPMessage-1-padded.per ; then \ - for f in ./sample-LDAPMessage-[1-9]-padded.per; do \ + @if test -f sample-LDAPMessage-1-padded.per ; then \ + for f in sample-*-[1-9]-padded.per; do \ + pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z-]+)-[0-9].*/\1/"`; \ echo "Recoding byte-padded $$f into DER into XER and back..."; \ - ./${TARGET} -per-padded -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -per-padded -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -per-padded -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ - ./${TARGET} -per-padded -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ + ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ + ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \ diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \ - ./${TARGET} -per-padded -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -per-padded -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ diff $$f ./.tmp.1.$$$$ || exit 2; \ rm -f ./.tmp.[1234].$$$$; \ done; fi diff --git a/examples/sample.source.RRC/Makefile b/examples/sample.source.RRC/Makefile index 6e623894d..313abb19a 100644 --- a/examples/sample.source.RRC/Makefile +++ b/examples/sample.source.RRC/Makefile @@ -4777,8 +4777,8 @@ regen-makefile: ../sample.makefile.regen check: ${TARGET} - @if test -f ./sample-DL-DCCH-Message-1.[db]er ; then \ - for f in ./sample-DL-DCCH-Message-*.[db]er; do \ + @if test -f sample-DL-DCCH-Message-1.[db]er ; then \ + for f in sample-DL-DCCH-Message-*.[db]er; do \ echo "Recoding $$f into XER and back..."; \ ./${TARGET} -iber -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ ./${TARGET} -iber -oxer -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ @@ -4789,8 +4789,8 @@ check: ${TARGET} diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ rm -f ./.tmp.[12].$$$$; \ done; fi - @if test -f ./sample-DL-DCCH-Message-1.xer ; then \ - for f in ./sample-DL-DCCH-Message-*.xer; do \ + @if test -f sample-DL-DCCH-Message-1.xer ; then \ + for f in sample-DL-DCCH-Message-*.xer; do \ echo "Recoding $$f into DER and back..."; \ ./${TARGET} -ixer -oder -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ ./${TARGET} -ixer -oder -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ @@ -4801,8 +4801,8 @@ check: ${TARGET} diff $$f ./.tmp.2.$$$$ || exit 2; \ rm -f ./.tmp.[12].$$$$; \ done; fi - @if test -f ./sample-DL-DCCH-Message-1.per ; then \ - for f in ./sample-DL-DCCH-Message-[1-9].per; do \ + @if test -f sample-DL-DCCH-Message-1.per ; then \ + for f in sample-DL-DCCH-Message-[1-9].per; do \ echo "Recoding $$f into DER into XER and back..."; \ ./${TARGET} -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ ./${TARGET} -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ @@ -4817,20 +4817,28 @@ check: ${TARGET} diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 2; \ rm -f ./.tmp.[1234].$$$$; \ done; fi - @if test -f ./sample-DL-DCCH-Message-1-padded.per ; then \ - for f in ./sample-DL-DCCH-Message-[1-9]-padded.per; do \ + @if test -f sample-DL-DCCH-Message-1-padded.per ; then \ + for f in sample-*-[1-9]-padded.per; do \ + pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z-]+)-[0-9].*/\1/"`; \ echo "Recoding byte-padded $$f into DER into XER and back..."; \ - ./${TARGET} -per-padded -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -per-padded -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -per-padded -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ - ./${TARGET} -per-padded -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ - diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 1; \ + echo "./${TARGET} -per-padded -p $$pdu -iper -oxer -b 1 $$f > ./.tmp.1.$$$$"; \ + ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ + echo "./${TARGET} -per-padded -p $$pdu -iper -oxer -b 17 $$f > ./.tmp.2.$$$$"; \ + ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ + echo "./${TARGET} -per-padded -p $$pdu -iper -oxer -b 33 $$f > ./.tmp.3.$$$$"; \ + ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ + echo "./${TARGET} -per-padded -p $$pdu -iper -oxer -b 980 $$f > ./.tmp.4.$$$$"; \ + ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \ - diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 3; \ - ./${TARGET} -per-padded -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ - diff $$f ./.tmp.1.$$$$ || exit 4; \ + diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \ + echo "./${TARGET} -per-padded -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$"; \ + ./${TARGET} -per-padded -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + echo "./${TARGET} -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$"; \ + ./${TARGET} -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + echo "./${TARGET} -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$"; \ + ./${TARGET} -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ + diff $$f ./.tmp.1.$$$$ || exit 2; \ rm -f ./.tmp.[1234].$$$$; \ done; fi @echo ================ diff --git a/examples/sample.source.RRC/sample-BCCH-BCH-Message-2-padded.per b/examples/sample.source.RRC/sample-BCCH-BCH-Message-2-padded.per new file mode 100644 index 0000000000000000000000000000000000000000..0d6babcd4500ade5f03f6436acdc42ef13b8128c GIT binary patch literal 22 ccmZS3W2g@c1%k-PX<17{l~zZsn#!O608ZcsiU0rr literal 0 HcmV?d00001 diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 3bef5608c..3a83bd98c 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -1328,8 +1328,11 @@ OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td, sizeinunits = sizeinunits * 8 - (st->bits_unused & 0x07); } - ASN_DEBUG("Encoding %s into %d units of %d bits", - td->name, sizeinunits, unit_bits); + ASN_DEBUG("Encoding %s into %d units of %d bits" + " (%d..%d, effective %d)%s", + td->name, sizeinunits, unit_bits, + ct->lower_bound, ct->upper_bound, + ct->effective_bits, ct_extensible ? " EXT" : ""); /* Figure out wheter size lies within PER visible consrtaint */ diff --git a/skeletons/asn_codecs.h b/skeletons/asn_codecs.h index 1ee737760..4a251d940 100644 --- a/skeletons/asn_codecs.h +++ b/skeletons/asn_codecs.h @@ -62,6 +62,7 @@ typedef struct asn_enc_rval_s { tmp_error.encoded = -1; \ tmp_error.failed_type = td; \ tmp_error.structure_ptr = sptr; \ + ASN_DEBUG("Failed to encode element %s", td->name); \ return tmp_error; \ } while(0) #define _ASN_ENCODED_OK(rval) do { \ @@ -91,6 +92,7 @@ typedef struct asn_dec_rval_s { asn_dec_rval_t tmp_error; \ tmp_error.code = RC_FAIL; \ tmp_error.consumed = 0; \ + ASN_DEBUG("Failed to decode element %s", td->name); \ return tmp_error; \ } while(0) #define _ASN_DECODE_STARVED do { \ diff --git a/skeletons/asn_codecs_prim.c b/skeletons/asn_codecs_prim.c index 97dc22aff..4e5c63937 100644 --- a/skeletons/asn_codecs_prim.c +++ b/skeletons/asn_codecs_prim.c @@ -22,11 +22,7 @@ ber_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, */ if(st == NULL) { st = (ASN__PRIMITIVE_TYPE_t *)CALLOC(1, sizeof(*st)); - if(st == NULL) { - rval.code = RC_FAIL; - rval.consumed = 0; - return rval; - } + if(st == NULL) _ASN_DECODE_FAILED; *sptr = (void *)st; } @@ -59,17 +55,13 @@ ber_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, if(sizeof(st->size) != sizeof(length) && (ber_tlv_len_t)st->size != length) { st->size = 0; - rval.code = RC_FAIL; - rval.consumed = 0; - return rval; + _ASN_DECODE_FAILED; } st->buf = (uint8_t *)MALLOC(length + 1); if(!st->buf) { st->size = 0; - rval.code = RC_FAIL; - rval.consumed = 0; - return rval; + _ASN_DECODE_FAILED; } memcpy(st->buf, buf_ptr, length); @@ -249,12 +241,7 @@ xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, */ if(!*sptr) { *sptr = CALLOC(1, struct_size); - if(!*sptr) { - asn_dec_rval_t rval; - rval.code = RC_FAIL; - rval.consumed = 0; - return rval; - } + if(!*sptr) _ASN_DECODE_FAILED; } memset(&s_ctx, 0, sizeof(s_ctx)); @@ -284,8 +271,7 @@ xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, /* * This decoder does not like empty stuff. */ - rc.code = RC_FAIL; - rc.consumed = 0; + _ASN_DECODE_FAILED; } } break; @@ -300,6 +286,8 @@ xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, rc.consumed = 0; if(s_arg.want_more) rc.code = RC_WMORE; + else + _ASN_DECODE_FAILED; break; } return rc; diff --git a/skeletons/converter-sample.c b/skeletons/converter-sample.c index 7ed49df8f..1013e6535 100644 --- a/skeletons/converter-sample.c +++ b/skeletons/converter-sample.c @@ -665,8 +665,10 @@ data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *na * Print a message and return failure only if not EOF, * unless this is our first PDU (empty file). */ - if((on_first_pdu || new_offset != old_offset || DynamicBuffer.length) - && (iform != INP_XER || on_first_pdu)) { + if(on_first_pdu + || DynamicBuffer.length + || new_offset - old_offset > ((iform == INP_XER)?sizeof("\r\n")-1:0) + ) { DEBUG("ofp %d, no=%ld, oo=%ld, dbl=%ld", on_first_pdu, (long)new_offset, (long)old_offset, (long)DynamicBuffer.length); diff --git a/skeletons/xer_decoder.c b/skeletons/xer_decoder.c index 2b3f16a6e..161dc78ce 100644 --- a/skeletons/xer_decoder.c +++ b/skeletons/xer_decoder.c @@ -173,6 +173,8 @@ xer_check_tag(const void *buf_ptr, int size, const char *need_tag) { #define RETURN(_code) do { \ rval.code = _code; \ rval.consumed = consumed_myself; \ + if(rval.code != RC_OK) \ + ASN_DEBUG("Failed with %d", rval.code); \ return rval; \ } while(0) From 774407b31f58d4763fb05c90b51dab66d4ed033d Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 18 Sep 2006 21:30:04 +0000 Subject: [PATCH 1215/1469] more debug git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1215 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.makefile.regen | 66 ++++++++------------ examples/sample.source.LDAP3/Makefile | 66 ++++++++------------ examples/sample.source.MEGACO/Makefile | 66 ++++++++++++-------- examples/sample.source.MHEG5/Makefile | 83 ++++++++++---------------- examples/sample.source.PKIX1/Makefile | 83 ++++++++++---------------- examples/sample.source.RRC/Makefile | 73 ++++++++-------------- examples/sample.source.TAP3/Makefile | 83 ++++++++++---------------- 7 files changed, 211 insertions(+), 309 deletions(-) diff --git a/examples/sample.makefile.regen b/examples/sample.makefile.regen index 57a0daef0..daac595d6 100755 --- a/examples/sample.makefile.regen +++ b/examples/sample.makefile.regen @@ -59,61 +59,43 @@ cat Makefile.am.sample \ echo 'check: ${TARGET}' echo " @if test -f sample-${ASN1PDU}-1.[db]er ; then \\" echo " for f in sample-${ASN1PDU}-*.[db]er; do \\" - echo ' echo "Recoding $$f into XER and back..."; \' - echo ' ./${TARGET} -iber -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -iber -oxer -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -iber -oxer -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -iber -oxer -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \' + echo ' for b in 1 17 33 980 8192; do \' + echo ' echo "Recoding $$f into XER and back ($$b)..."; \' + echo ' ./${TARGET} -b $$b -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -b $$b -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \' echo ' diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \' echo ' rm -f ./.tmp.[12].$$$$; \' - echo ' done; fi' + echo ' done; done; fi' echo " @if test -f sample-${ASN1PDU}-1.xer ; then \\" echo " for f in sample-${ASN1PDU}-*.xer; do \\" - echo ' echo "Recoding $$f into DER and back..."; \' - echo ' ./${TARGET} -ixer -oder -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -ixer -oder -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -ixer -oder -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -ixer -oder -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \' + echo ' for b in 1 17 33 980 8192; do \' + echo ' echo "Recoding $$f into DER and back ($$b)..."; \' + echo ' ./${TARGET} -b $$b -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \' echo ' diff $$f ./.tmp.2.$$$$ || exit 2; \' echo ' rm -f ./.tmp.[12].$$$$; \' - echo ' done; fi' + echo ' done; done; fi' echo " @if test -f sample-${ASN1PDU}-1.per ; then \\" echo " for f in sample-${ASN1PDU}-[1-9].per; do \\" - echo ' echo "Recoding $$f into DER into XER and back..."; \' - echo ' ./${TARGET} -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \' - echo ' ./${TARGET} -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \' - echo ' ./${TARGET} -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \' - echo ' diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \' - echo ' diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \' - echo ' diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \' - echo ' ./${TARGET} -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \' - echo ' ./${TARGET} -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \' + echo ' for b in 1 17 33 980 8192; do \' + echo ' echo "Recoding $$f into DER into XER and back ($$b)..."; \' + echo ' ./${TARGET} -b $$b -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \' + echo ' ./${TARGET} -b $$b -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \' echo ' diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 2; \' - echo ' rm -f ./.tmp.[1234].$$$$; \' - echo ' done; fi' + echo ' rm -f ./.tmp.[123].$$$$; \' + echo ' done; done; fi' echo " @if test -f sample-${ASN1PDU}-1-padded.per ; then \\" echo " for f in sample-*-[1-9]-padded.per; do \\" echo ' pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z-]+)-[0-9].*/\1/"`; \' - echo ' echo "Recoding byte-padded $$f into DER into XER and back..."; \' - echo ' ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \' - echo ' ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \' - echo ' ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \' - echo ' diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \' - echo ' diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \' - echo ' diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \' - echo ' ./${TARGET} -per-padded -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \' - echo ' ./${TARGET} -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \' + echo ' for b in 1 17 33 980 8192; do \' + echo ' echo "Recoding byte-padded $$f into DER into XER and back ($$b)..."; \' + echo ' ./${TARGET} -b $$b -per-padded -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -b $$b -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \' + echo ' ./${TARGET} -b $$b -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \' echo ' diff $$f ./.tmp.1.$$$$ || exit 2; \' - echo ' rm -f ./.tmp.[1234].$$$$; \' - echo ' done; fi' + echo ' rm -f ./.tmp.[12].$$$$; \' + echo ' done; done; fi' echo ' @echo ================' echo ' @echo All tests passed' echo ' @echo ================' diff --git a/examples/sample.source.LDAP3/Makefile b/examples/sample.source.LDAP3/Makefile index 86a7917a6..2e1ab8976 100644 --- a/examples/sample.source.LDAP3/Makefile +++ b/examples/sample.source.LDAP3/Makefile @@ -202,61 +202,43 @@ regen-makefile: check: ${TARGET} @if test -f sample-LDAPMessage-1.[db]er ; then \ for f in sample-LDAPMessage-*.[db]er; do \ - echo "Recoding $$f into XER and back..."; \ - ./${TARGET} -iber -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + for b in 1 17 33 980 8192; do \ + echo "Recoding $$f into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ rm -f ./.tmp.[12].$$$$; \ - done; fi + done; done; fi @if test -f sample-LDAPMessage-1.xer ; then \ for f in sample-LDAPMessage-*.xer; do \ - echo "Recoding $$f into DER and back..."; \ - ./${TARGET} -ixer -oder -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + for b in 1 17 33 980 8192; do \ + echo "Recoding $$f into DER and back ($$b)..."; \ + ./${TARGET} -b $$b -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ diff $$f ./.tmp.2.$$$$ || exit 2; \ rm -f ./.tmp.[12].$$$$; \ - done; fi + done; done; fi @if test -f sample-LDAPMessage-1.per ; then \ for f in sample-LDAPMessage-[1-9].per; do \ - echo "Recoding $$f into DER into XER and back..."; \ - ./${TARGET} -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ - ./${TARGET} -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ - diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ - diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \ - diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \ - ./${TARGET} -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \ + for b in 1 17 33 980 8192; do \ + echo "Recoding $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -b $$b -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \ diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 2; \ - rm -f ./.tmp.[1234].$$$$; \ - done; fi + rm -f ./.tmp.[123].$$$$; \ + done; done; fi @if test -f sample-LDAPMessage-1-padded.per ; then \ for f in sample-*-[1-9]-padded.per; do \ pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z-]+)-[0-9].*/\1/"`; \ - echo "Recoding byte-padded $$f into DER into XER and back..."; \ - ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ - ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ - diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ - diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \ - diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \ - ./${TARGET} -per-padded -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ + for b in 1 17 33 980 8192; do \ + echo "Recoding byte-padded $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -per-padded -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -b $$b -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ diff $$f ./.tmp.1.$$$$ || exit 2; \ - rm -f ./.tmp.[1234].$$$$; \ - done; fi + rm -f ./.tmp.[12].$$$$; \ + done; done; fi @echo ================ @echo All tests passed @echo ================ diff --git a/examples/sample.source.MEGACO/Makefile b/examples/sample.source.MEGACO/Makefile index fdc878b45..62df62aed 100644 --- a/examples/sample.source.MEGACO/Makefile +++ b/examples/sample.source.MEGACO/Makefile @@ -309,7 +309,7 @@ regenerate-from-asn1-source: ../../asn1c/asn1c -S ../../skeletons -fcompound-names ../rfc3525-MEDIA-GATEWAY-CONTROL.asn1 -MegacoMessage.c: ../sample.makefile.regen +MegacoMessage.c: ../sample.makefile.regen ../rfc3525-MEDIA-GATEWAY-CONTROL.asn1 make regen-makefile @touch MegacoMessage.c make @@ -322,31 +322,45 @@ regen-makefile: ../sample.makefile.regen check: ${TARGET} - @if test -f ./sample-MegacoMessage-1.[db]er ; then \ - for f in ./sample-MegacoMessage-*.[db]er; do \ - echo "Recoding $$f into XER and back..."; \ - ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$ || exit 2; \ - ./${TARGET} -ixer -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ - diff ./.tmp.1.$$ ./.tmp.2.$$ || exit 2; \ - rm -f ./.tmp.[12].$$; \ - done; fi - @if test -f ./sample-MegacoMessage-1.xer ; then \ - for f in ./sample-MegacoMessage-*.xer; do \ - echo "Recoding $$f into DER and back..."; \ - ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$ || exit 2; \ - ./${TARGET} -iber -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ - diff $$f ./.tmp.2.$$ || exit 2; \ - rm -f ./.tmp.[12].$$; \ - done; fi - @if test -f ./sample-MegacoMessage-1.per ; then \ - for f in ./sample-MegacoMessage-*.per; do \ - echo "Recoding $$f into DER into XER and back..."; \ - ./${TARGET} -iper -oder $$f > ./.tmp.1.$$ || exit 2; \ - ./${TARGET} -ider -oxer ./.tmp.1.$$ > ./.tmp.2.$$ || exit 2; \ - ./${TARGET} -ixer -oper ./.tmp.2.$$ > ./.tmp.1.$$ || exit 2; \ - diff $$f ./.tmp.1.$$ || exit 2; \ - rm -f ./.tmp.[12].$$; \ - done; fi + @if test -f sample-MegacoMessage-1.[db]er ; then \ + for f in sample-MegacoMessage-*.[db]er; do \ + for b in 1 17 33 980 8192; do \ + echo "Recoding $$f into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ + rm -f ./.tmp.[12].$$$$; \ + done; done; fi + @if test -f sample-MegacoMessage-1.xer ; then \ + for f in sample-MegacoMessage-*.xer; do \ + for b in 1 17 33 980 8192; do \ + echo "Recoding $$f into DER and back ($$b)..."; \ + ./${TARGET} -b $$b -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + diff $$f ./.tmp.2.$$$$ || exit 2; \ + rm -f ./.tmp.[12].$$$$; \ + done; done; fi + @if test -f sample-MegacoMessage-1.per ; then \ + for f in sample-MegacoMessage-[1-9].per; do \ + for b in 1 17 33 980 8192; do \ + echo "Recoding $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -b $$b -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \ + diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 2; \ + rm -f ./.tmp.[123].$$$$; \ + done; done; fi + @if test -f sample-MegacoMessage-1-padded.per ; then \ + for f in sample-*-[1-9]-padded.per; do \ + pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z-]+)-[0-9].*/\1/"`; \ + for b in 1 17 33 980 8192; do \ + echo "Recoding byte-padded $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -per-padded -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -b $$b -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ + diff $$f ./.tmp.1.$$$$ || exit 2; \ + rm -f ./.tmp.[12].$$$$; \ + done; done; fi @echo ================ @echo All tests passed @echo ================ diff --git a/examples/sample.source.MHEG5/Makefile b/examples/sample.source.MHEG5/Makefile index 53490efd9..7dfede272 100644 --- a/examples/sample.source.MHEG5/Makefile +++ b/examples/sample.source.MHEG5/Makefile @@ -490,62 +490,45 @@ regen-makefile: ../sample.makefile.regen check: ${TARGET} - @if test -f ./sample-InterchangedObject-1.[db]er ; then \ - for f in ./sample-InterchangedObject-*.[db]er; do \ - echo "Recoding $$f into XER and back..."; \ - ./${TARGET} -iber -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + @if test -f sample-InterchangedObject-1.[db]er ; then \ + for f in sample-InterchangedObject-*.[db]er; do \ + for b in 1 17 33 980 8192; do \ + echo "Recoding $$f into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ rm -f ./.tmp.[12].$$$$; \ - done; fi - @if test -f ./sample-InterchangedObject-1.xer ; then \ - for f in ./sample-InterchangedObject-*.xer; do \ - echo "Recoding $$f into DER and back..."; \ - ./${TARGET} -ixer -oder -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + done; done; fi + @if test -f sample-InterchangedObject-1.xer ; then \ + for f in sample-InterchangedObject-*.xer; do \ + for b in 1 17 33 980 8192; do \ + echo "Recoding $$f into DER and back ($$b)..."; \ + ./${TARGET} -b $$b -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ diff $$f ./.tmp.2.$$$$ || exit 2; \ rm -f ./.tmp.[12].$$$$; \ - done; fi - @if test -f ./sample-InterchangedObject-1.per ; then \ - for f in ./sample-InterchangedObject-[1-9].per; do \ - echo "Recoding $$f into DER into XER and back..."; \ - ./${TARGET} -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ - ./${TARGET} -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ - diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ - diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \ - diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \ - ./${TARGET} -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \ + done; done; fi + @if test -f sample-InterchangedObject-1.per ; then \ + for f in sample-InterchangedObject-[1-9].per; do \ + for b in 1 17 33 980 8192; do \ + echo "Recoding $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -b $$b -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \ diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 2; \ - rm -f ./.tmp.[1234].$$$$; \ - done; fi - @if test -f ./sample-InterchangedObject-1-padded.per ; then \ - for f in ./sample-InterchangedObject-[1-9]-padded.per; do \ - echo "Recoding byte-padded $$f into DER into XER and back..."; \ - ./${TARGET} -per-padded -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -per-padded -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -per-padded -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ - ./${TARGET} -per-padded -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ - diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ - diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \ - diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \ - ./${TARGET} -per-padded -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ + rm -f ./.tmp.[123].$$$$; \ + done; done; fi + @if test -f sample-InterchangedObject-1-padded.per ; then \ + for f in sample-*-[1-9]-padded.per; do \ + pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z-]+)-[0-9].*/\1/"`; \ + for b in 1 17 33 980 8192; do \ + echo "Recoding byte-padded $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -per-padded -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -b $$b -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ diff $$f ./.tmp.1.$$$$ || exit 2; \ - rm -f ./.tmp.[1234].$$$$; \ - done; fi + rm -f ./.tmp.[12].$$$$; \ + done; done; fi @echo ================ @echo All tests passed @echo ================ diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index b0fde7f7b..6d7557b5b 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -382,62 +382,45 @@ regen-makefile: ../sample.makefile.regen check: ${TARGET} - @if test -f ./sample-Certificate-1.[db]er ; then \ - for f in ./sample-Certificate-*.[db]er; do \ - echo "Recoding $$f into XER and back..."; \ - ./${TARGET} -iber -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + @if test -f sample-Certificate-1.[db]er ; then \ + for f in sample-Certificate-*.[db]er; do \ + for b in 1 17 33 980 8192; do \ + echo "Recoding $$f into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ rm -f ./.tmp.[12].$$$$; \ - done; fi - @if test -f ./sample-Certificate-1.xer ; then \ - for f in ./sample-Certificate-*.xer; do \ - echo "Recoding $$f into DER and back..."; \ - ./${TARGET} -ixer -oder -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + done; done; fi + @if test -f sample-Certificate-1.xer ; then \ + for f in sample-Certificate-*.xer; do \ + for b in 1 17 33 980 8192; do \ + echo "Recoding $$f into DER and back ($$b)..."; \ + ./${TARGET} -b $$b -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ diff $$f ./.tmp.2.$$$$ || exit 2; \ rm -f ./.tmp.[12].$$$$; \ - done; fi - @if test -f ./sample-Certificate-1.per ; then \ - for f in ./sample-Certificate-[1-9].per; do \ - echo "Recoding $$f into DER into XER and back..."; \ - ./${TARGET} -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ - ./${TARGET} -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ - diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ - diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \ - diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \ - ./${TARGET} -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \ + done; done; fi + @if test -f sample-Certificate-1.per ; then \ + for f in sample-Certificate-[1-9].per; do \ + for b in 1 17 33 980 8192; do \ + echo "Recoding $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -b $$b -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \ diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 2; \ - rm -f ./.tmp.[1234].$$$$; \ - done; fi - @if test -f ./sample-Certificate-1-padded.per ; then \ - for f in ./sample-Certificate-[1-9]-padded.per; do \ - echo "Recoding byte-padded $$f into DER into XER and back..."; \ - ./${TARGET} -per-padded -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -per-padded -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -per-padded -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ - ./${TARGET} -per-padded -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ - diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ - diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \ - diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \ - ./${TARGET} -per-padded -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ + rm -f ./.tmp.[123].$$$$; \ + done; done; fi + @if test -f sample-Certificate-1-padded.per ; then \ + for f in sample-*-[1-9]-padded.per; do \ + pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z-]+)-[0-9].*/\1/"`; \ + for b in 1 17 33 980 8192; do \ + echo "Recoding byte-padded $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -per-padded -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -b $$b -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ diff $$f ./.tmp.1.$$$$ || exit 2; \ - rm -f ./.tmp.[1234].$$$$; \ - done; fi + rm -f ./.tmp.[12].$$$$; \ + done; done; fi @echo ================ @echo All tests passed @echo ================ diff --git a/examples/sample.source.RRC/Makefile b/examples/sample.source.RRC/Makefile index 313abb19a..1ff6d82c3 100644 --- a/examples/sample.source.RRC/Makefile +++ b/examples/sample.source.RRC/Makefile @@ -4779,68 +4779,43 @@ regen-makefile: check: ${TARGET} @if test -f sample-DL-DCCH-Message-1.[db]er ; then \ for f in sample-DL-DCCH-Message-*.[db]er; do \ - echo "Recoding $$f into XER and back..."; \ - ./${TARGET} -iber -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + for b in 1 17 33 980 8192; do \ + echo "Recoding $$f into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ rm -f ./.tmp.[12].$$$$; \ - done; fi + done; done; fi @if test -f sample-DL-DCCH-Message-1.xer ; then \ for f in sample-DL-DCCH-Message-*.xer; do \ - echo "Recoding $$f into DER and back..."; \ - ./${TARGET} -ixer -oder -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + for b in 1 17 33 980 8192; do \ + echo "Recoding $$f into DER and back ($$b)..."; \ + ./${TARGET} -b $$b -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ diff $$f ./.tmp.2.$$$$ || exit 2; \ rm -f ./.tmp.[12].$$$$; \ - done; fi + done; done; fi @if test -f sample-DL-DCCH-Message-1.per ; then \ for f in sample-DL-DCCH-Message-[1-9].per; do \ - echo "Recoding $$f into DER into XER and back..."; \ - ./${TARGET} -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ - ./${TARGET} -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ - diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ - diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \ - diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \ - ./${TARGET} -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \ + for b in 1 17 33 980 8192; do \ + echo "Recoding $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -b $$b -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \ diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 2; \ - rm -f ./.tmp.[1234].$$$$; \ - done; fi + rm -f ./.tmp.[123].$$$$; \ + done; done; fi @if test -f sample-DL-DCCH-Message-1-padded.per ; then \ for f in sample-*-[1-9]-padded.per; do \ pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z-]+)-[0-9].*/\1/"`; \ - echo "Recoding byte-padded $$f into DER into XER and back..."; \ - echo "./${TARGET} -per-padded -p $$pdu -iper -oxer -b 1 $$f > ./.tmp.1.$$$$"; \ - ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ - echo "./${TARGET} -per-padded -p $$pdu -iper -oxer -b 17 $$f > ./.tmp.2.$$$$"; \ - ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ - echo "./${TARGET} -per-padded -p $$pdu -iper -oxer -b 33 $$f > ./.tmp.3.$$$$"; \ - ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ - echo "./${TARGET} -per-padded -p $$pdu -iper -oxer -b 980 $$f > ./.tmp.4.$$$$"; \ - ./${TARGET} -per-padded -p $$pdu -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ - diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ - diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \ - diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \ - echo "./${TARGET} -per-padded -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$"; \ - ./${TARGET} -per-padded -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - echo "./${TARGET} -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$"; \ - ./${TARGET} -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - echo "./${TARGET} -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$"; \ - ./${TARGET} -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ + for b in 1 17 33 980 8192; do \ + echo "Recoding byte-padded $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -per-padded -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -b $$b -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ diff $$f ./.tmp.1.$$$$ || exit 2; \ - rm -f ./.tmp.[1234].$$$$; \ - done; fi + rm -f ./.tmp.[12].$$$$; \ + done; done; fi @echo ================ @echo All tests passed @echo ================ diff --git a/examples/sample.source.TAP3/Makefile b/examples/sample.source.TAP3/Makefile index e3826163c..5b1bb8f65 100644 --- a/examples/sample.source.TAP3/Makefile +++ b/examples/sample.source.TAP3/Makefile @@ -716,62 +716,45 @@ regen-makefile: ../sample.makefile.regen check: ${TARGET} - @if test -f ./sample-DataInterChange-1.[db]er ; then \ - for f in ./sample-DataInterChange-*.[db]er; do \ - echo "Recoding $$f into XER and back..."; \ - ./${TARGET} -iber -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + @if test -f sample-DataInterChange-1.[db]er ; then \ + for f in sample-DataInterChange-*.[db]er; do \ + for b in 1 17 33 980 8192; do \ + echo "Recoding $$f into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ rm -f ./.tmp.[12].$$$$; \ - done; fi - @if test -f ./sample-DataInterChange-1.xer ; then \ - for f in ./sample-DataInterChange-*.xer; do \ - echo "Recoding $$f into DER and back..."; \ - ./${TARGET} -ixer -oder -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder -b 17 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder -b 33 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder -b 980 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + done; done; fi + @if test -f sample-DataInterChange-1.xer ; then \ + for f in sample-DataInterChange-*.xer; do \ + for b in 1 17 33 980 8192; do \ + echo "Recoding $$f into DER and back ($$b)..."; \ + ./${TARGET} -b $$b -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ diff $$f ./.tmp.2.$$$$ || exit 2; \ rm -f ./.tmp.[12].$$$$; \ - done; fi - @if test -f ./sample-DataInterChange-1.per ; then \ - for f in ./sample-DataInterChange-[1-9].per; do \ - echo "Recoding $$f into DER into XER and back..."; \ - ./${TARGET} -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ - ./${TARGET} -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ - diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ - diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \ - diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \ - ./${TARGET} -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \ + done; done; fi + @if test -f sample-DataInterChange-1.per ; then \ + for f in sample-DataInterChange-[1-9].per; do \ + for b in 1 17 33 980 8192; do \ + echo "Recoding $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -b $$b -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \ diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 2; \ - rm -f ./.tmp.[1234].$$$$; \ - done; fi - @if test -f ./sample-DataInterChange-1-padded.per ; then \ - for f in ./sample-DataInterChange-[1-9]-padded.per; do \ - echo "Recoding byte-padded $$f into DER into XER and back..."; \ - ./${TARGET} -per-padded -iper -oxer -b 1 $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -per-padded -iper -oxer -b 17 $$f > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -per-padded -iper -oxer -b 33 $$f > ./.tmp.3.$$$$ || exit 2; \ - ./${TARGET} -per-padded -iper -oxer -b 980 $$f > ./.tmp.4.$$$$ || exit 2; \ - diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ - diff ./.tmp.2.$$$$ ./.tmp.3.$$$$ || exit 2; \ - diff ./.tmp.3.$$$$ ./.tmp.4.$$$$ || exit 2; \ - ./${TARGET} -per-padded -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ + rm -f ./.tmp.[123].$$$$; \ + done; done; fi + @if test -f sample-DataInterChange-1-padded.per ; then \ + for f in sample-*-[1-9]-padded.per; do \ + pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z-]+)-[0-9].*/\1/"`; \ + for b in 1 17 33 980 8192; do \ + echo "Recoding byte-padded $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -per-padded -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -b $$b -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ diff $$f ./.tmp.1.$$$$ || exit 2; \ - rm -f ./.tmp.[1234].$$$$; \ - done; fi + rm -f ./.tmp.[12].$$$$; \ + done; done; fi @echo ================ @echo All tests passed @echo ================ From c8d9052e998dcf74b59a48d497fb787cde6973fe Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 18 Sep 2006 21:36:30 +0000 Subject: [PATCH 1216/1469] c89 git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1216 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/check-PER.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/skeletons/tests/check-PER.c b/skeletons/tests/check-PER.c index 6d355e839..aeb247704 100644 --- a/skeletons/tests/check-PER.c +++ b/skeletons/tests/check-PER.c @@ -128,13 +128,14 @@ static int Ignore(const void *data, size_t size, void *op_key) { static void check_per_encoding() { asn_per_outp_t po; + int ret; + po.buffer = po.tmpspace; po.nboff = 0; po.nbits = 0; po.outper = Ignore; po.op_key = 0; po.tmpspace[0] = 0xff; - int ret; ret = per_put_few_bits(&po, 0, 0); assert(ret == 0); From 4450c350680f157bb910b56519ed7e42b118e145 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 18 Sep 2006 21:46:50 +0000 Subject: [PATCH 1217/1469] no errno git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1217 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/converter-sample.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/skeletons/converter-sample.c b/skeletons/converter-sample.c index 1013e6535..bc4aab87c 100644 --- a/skeletons/converter-sample.c +++ b/skeletons/converter-sample.c @@ -678,6 +678,12 @@ data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *na (rval.code == RC_WMORE) ? "Unexpected end of input" : "Input processing error"); +#ifndef ENOMSG +#define ENOMSG EINVAL +#endif +#ifndef EBADMSG +#define EBADMSG EINVAL +#endif errno = (rval.code == RC_WMORE) ? ENOMSG : EBADMSG; } else { /* Got EOF after a few successful PDUs */ From 82a310934966fd193c7ecfa5f5e0a9c06d388662 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 18 Sep 2006 22:30:25 +0000 Subject: [PATCH 1218/1469] added LDAPv4 and MEGACO git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1218 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/webcgi/asn1c.cgi | 64 +++++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 25 deletions(-) diff --git a/asn1c/webcgi/asn1c.cgi b/asn1c/webcgi/asn1c.cgi index a57703022..244ba49cf 100755 --- a/asn1c/webcgi/asn1c.cgi +++ b/asn1c/webcgi/asn1c.cgi @@ -54,7 +54,6 @@ my %binaryDecoders = ( typeExt => 'X.509 Certificate', description => 'X.509 in DER (not PEM!)', exe => 'x509dump', - cmdopts => '-x', msg => '' }, @@ -64,7 +63,6 @@ my %binaryDecoders = ( typeExt => 'GSM TAP3-11 data', description => 'GSM TAP3-11 binary file', exe => 'tap3dump-11', - cmdopts => '-x', msg => '' }, @@ -74,7 +72,6 @@ my %binaryDecoders = ( typeExt => 'GSM TAP3-10 data', description => 'GSM TAP3-10 binary file', exe => 'tap3dump-10', - cmdopts => '-x', msg => '' }, @@ -84,21 +81,37 @@ my %binaryDecoders = ( typeExt => 'GSM TAP3-09 data', description => 'GSM TAP3-09 binary file', exe => 'tap3dump-09', - cmdopts => '-x', msg => '' }, - mheg5 => { order => 5, + ldap3 => { order => 5, shorder => 5, + type => 'LDAPv3', + typeExt => 'IETF LDAPv3 message', + description => 'IETF LDAPv3 message', + exe => 'ldap3dump', + msg => '' + }, + + megaco => { order => 6, + shorder => 6, + type => 'MEGACO', + typeExt => 'MEGACO (H.248.1) data', + description => 'MEGACO (H.248.1) message', + exe => 'megacoDump', + msg => '' + }, + + mheg5 => { order => 7, + shorder => 7, type => 'MHEG-5', typeExt => 'ISO MHEG-5 data', description => 'ISO MHEG-5 stream file', exe => 'mheg5dump', - cmdopts => '-x', msg => '' }, - ber => { order => 6, + ber => { order => 8, shorder => 1, type => BER, typeExt => 'BER encoded data', @@ -109,52 +122,52 @@ my %binaryDecoders = ( }, rrcDLCCCH => { order => -1, # Not automatic - shorder => 7, + shorder => 9, type => 'RRC DL-CCCH-Message', typeExt => 'RRC DL-CCCH-Message frame', description => '3GPP RRC DL-CCCH-Message', exe => 'rrc-dump', - cmdopts => '-p DL-CCCH-Message -oxer', + cmdopts => '-p DL-CCCH-Message', msg => '' }, rrcULCCCH => { order => -1, - shorder => 8, + shorder => 10, type => 'RRC UL-CCCH-Message', typeExt => 'RRC UL-CCCH-Message frame', description => '3GPP RRC UL-CCCH-Message', exe => 'rrc-dump', - cmdopts => '-p UL-CCCH-Message -oxer', + cmdopts => '-p UL-CCCH-Message', msg => '' }, rrcDLDCCH => { order => -1, - shorder => 9, - type => 'RRC DL-DCCH-Message -oxer', + shorder => 11, + type => 'RRC DL-DCCH-Message', typeExt => 'RRC DL-DCCH-Message frame', description => '3GPP RRC DL-DCCH-Message', exe => 'rrc-dump', - cmdopts => '-p DL-DCCH-Message -oxer', + cmdopts => '-p DL-DCCH-Message', msg => '' }, rrcULDCCH => { order => -1, - shorder => 10, + shorder => 12, type => 'RRC UL-DCCH-Message', typeExt => 'RRC UL-DCCH-Message frame', description => '3GPP RRC UL-DCCH-Message', exe => 'rrc-dump', - cmdopts => '-p UL-DCCH-Message -oxer', + cmdopts => '-p UL-DCCH-Message', msg => '' }, rrcPCCH => { order => -1, - shorder => 11, + shorder => 13, type => 'RRC PCCH-Message', typeExt => 'RRC PCCH-Message frame', description => '3GPP RRC PCCH-Message', exe => 'rrc-dump', - cmdopts => '-p PCCH-Message -oxer', + cmdopts => '-p PCCH-Message', msg => '' } @@ -565,9 +578,9 @@ if($#gotSafeNames >= 0) { next unless ($fType eq 'auto' or $fType eq $t); next if($fType eq 'auto' and $dec{order} < 0); my $options = $dec{cmdopts} . ($specOpts{$t} || ""); - if(($dec{type} ne 'BER') && optGet('optNoXER')) { - $options =~ s/-x/-p/g; # Old way - $options =~ s/-oxer/-otext/g; # New way + if(($dec{type} ne 'BER')) { + $options .= ' -otext' if optGet('optText'); + $options .= ' -1' if optGet('optOnly1'); } my $ec = system("$SUIDHelper $TMPDIR $inChDir $dec{exe} $options @gotSafeNames > $TMPDIR/$inChDir/+UNBER.tmp 2>&1"); next if ($ec != 0 and $t ne $fType @@ -691,7 +704,7 @@ function explanation(id, showFull) {

    -
    Pick the ASN.1 module text or binary encoded data file:
    +
    Pick the ASN.1 module text or binary encoded data file:
    -
    +
    These options may be used to control the compiler's behavior:
    Debug lexer (-Wdebug-lexer)
    Just parse and dump (do not verify) (-E)
    Parse, verify validity, and dump (-E -F)
    Use native machine types (e.g. double instead of REAL_t) (-fnative-types)
    + Generate PER support (-gen-PER), default is BER, DER and XER
    Prevent name clashes in compiled output (-fcompound-names)
    ... the command line ASN.1 compiler, asn1c, supports many other parameters.
    @@ -790,8 +794,8 @@ These options may be used to control the compiler's behavior:
    -
    -(What is ASN.1?) +
    +(Available disk space: $freeSpace)
    @@ -843,7 +847,7 @@ foreach my $trans (sort { $b cmp $a } @transactions) { local $_ = "" + . "&fetch=$safeNames[$i]\" class=modrefs>" . escapeHTML($Names[$i]) . ""; @markedNames = (@markedNames, $_); @@ -955,8 +959,8 @@ foreach my $trans (sort { $b cmp $a } @transactions) { $trColor = ' BGCOLOR=#d0ffe0' if $CountHistoryItems == 1; $history .= "" - . "$tNum" - . "
    [$tNum" + . "
    [
    " . join(", ", @markedNames) . "" - . "
    " + . "" . $results . "
    " . "" @@ -1026,7 +1030,7 @@ unless($history) { } $content .= - "
    \n" + "
    \n" . "

    ASN.1 Input

    \n" . "$form" . "
    $history \n" @@ -1064,7 +1068,7 @@ $redirect color: #404040; font-family: monospace; } - TH#num { + TH.num { font-size: 8pt; font-family: sans-serif; } @@ -1072,14 +1076,14 @@ $redirect font-size: 10pt; font-family: sans-serif; } - TD#inputbox { + TD.inputbox { border-right: dashed 1px rgb(200, 200, 200); } DIV { font-size: 10pt; font-family: sans-serif; } - DIV#extrasmall { + .extrasmall { font-size: 7pt; font-family: sans-serif; } @@ -1091,11 +1095,11 @@ $redirect margin-left: 1em; } DIV.options#options-bin { - visibility: hidden; + display: none; position: fixed; } DIV.options#options-ber { - visibility: hidden; + display: none; position: fixed; } DIV.optsbar#optsbar-lite { font-size: 7pt; } @@ -1107,26 +1111,26 @@ $redirect border-left: dashed 1px rgb(200, 200, 200); } - DIV#arrow { + DIV.arrow { float: left; color: rgb(160,160,160); } - DIV#aarr { + DIV.aarr { display: block; margin-left: 1em; padding-bottom: 5px; padding-left: 2pt; } - A#modrefs { + A.modrefs { color: #606060; text-decoration: none; } - A:hover#modrefs { + A:hover.modrefs { text-decoration: underline; } - A:visited#modrefs { + A:visited.modrefs { color: #b06060; } From 95eac35a1b80dc40cd376527281b5711f4f75b9d Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 16 Nov 2006 12:53:11 +0000 Subject: [PATCH 1268/1469] sizes and line endings git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1268 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/webcgi/asn1c.cgi | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/asn1c/webcgi/asn1c.cgi b/asn1c/webcgi/asn1c.cgi index 053c5648f..257684aaf 100755 --- a/asn1c/webcgi/asn1c.cgi +++ b/asn1c/webcgi/asn1c.cgi @@ -232,6 +232,20 @@ sub isoTime() { $cachedTime = "$tm[5]-$tm[4]-$tm[3]T$tm[2]:$tm[1]:$tm[0]"; } +sub humanFriendlySize($) { + my $size = shift; + if($size > (1024 * 1024)) { + $size >>= 20; + $size .= " Mb"; + } elsif($size > 1024) { + $size >>= 10; + $size .= " Kb"; + } elsif($size > 0) { + $size .= " bytes"; + } + return $size; +} + # Create the necessary environment for chrooting into. sub prepareChrootEnvironment() { return 1 if(-d $TMPDIR); # Envuronment already exists @@ -432,8 +446,9 @@ unless($session) { if($targetFile ne '') { open(I, '< ' . $targetFile) or bark("Invalid or outdated request $!"); - printf "Content-Type: text/plain\n\n"; - print while ; + printf "Content-Type: text/plain\r\n\r\n"; + # Do not slurp 'cause of potentially huge size + while() { s/\n/\r\n/g; print; } exit(0); } } @@ -859,6 +874,7 @@ foreach my $trans (sort { $b cmp $a } @transactions) { my $resCode = "log"; my $resText = "Show compiler log"; + my $decodedSize = 0; if($ec eq "0") { $results = "" @@ -872,6 +888,8 @@ foreach my $trans (sort { $b cmp $a } @transactions) { $msg = 'This looks like ' . $type; } $results = "$msg
    \n"; + $decodedSize = humanFriendlySize( + -s $sessionDir . '/' . $trans . '/+UNBER'); if(-f $sessionDir . '/' . $trans . '/+UNBER.EXIT') { $results = "" . "$type: " @@ -891,8 +909,10 @@ foreach my $trans (sort { $b cmp $a } @transactions) { . "$why
    \n"; } + $archiveSize = humanFriendlySize( + -s $sessionDir . '/' . $trans . '/+Archive.tgz'); $allowFetchResults = $ec eq "0" - && (-f $sessionDir . '/' . $trans . '/+Archive.tgz' + && ($archiveSize || -f $sessionDir . '/' . $trans . '/Makefile.am.sample'); $results .= "" @@ -902,6 +922,7 @@ foreach my $trans (sort { $b cmp $a } @transactions) { . "&file=$f" . "&show=$resCode\">" . "$resText" + . ($decodedSize ? " ($decodedSize)" : '') . ($ec ? ' ←' : '') . ""; $results .= "
    \n" @@ -909,7 +930,7 @@ foreach my $trans (sort { $b cmp $a } @transactions) { . escapeHTML($origTime) . "&file=$f" . "&show=tgz\">" - . "Fetch compiled C sources (.tgz) ←" + . "Fetch compiled C sources ($archiveSize .tgz) ←" if $allowFetchResults; if($ec ne "0") { my ($eml, @resp); From 7d39839fed87da011d486285acedbca11674a6a1 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 21 Nov 2006 10:38:50 +0000 Subject: [PATCH 1269/1469] ntohl git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1269 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_system.h | 9 +++++++++ skeletons/constr_SET.c | 8 +------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/skeletons/asn_system.h b/skeletons/asn_system.h index 6dcca0eb4..f920efc99 100644 --- a/skeletons/asn_system.h +++ b/skeletons/asn_system.h @@ -26,6 +26,12 @@ #define snprintf _snprintf #define vsnprintf _vsnprintf +/* To avoid linking with ws2_32.lib, here's the definition of ntohl() */ +#define sys_ntohl(l) ((((l) << 24) & 0xff000000) + | (((l) << 16) & 0xff0000) + | (((l) << 8) & 0xff00) + | ((l) & 0xff)) + #ifdef _MSC_VER /* MSVS.Net */ #ifndef __cplusplus #define inline __inline @@ -74,6 +80,9 @@ typedef unsigned int uint32_t; #endif /* defined(sun) */ #endif +#include /* for ntohl() */ +#define sys_ntohl(foo) ntohl(foo) + #endif /* defined(__vxworks) */ #endif /* WIN32 */ diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index 2c5d5d0b4..ecf56617a 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -6,12 +6,6 @@ #include #include -#ifndef WIN32 -#include /* for ntohl() */ -#else -#include /* for ntohl() */ -#endif - /* Check that all the mandatory members are present */ static int _SET_is_populated(asn_TYPE_descriptor_t *td, void *st); @@ -411,7 +405,7 @@ _SET_is_populated(asn_TYPE_descriptor_t *td, void *st) { midx = edx/(8 * sizeof(specs->_mandatory_elements[0])); pres = ((unsigned int *)((char *)st+specs->pres_offset))[midx]; - must = ntohl(specs->_mandatory_elements[midx]); + must = sys_ntohl(specs->_mandatory_elements[midx]); if((pres & must) == must) { /* From 0840962a0880f6a2f36bf4dfe2780503d755101e Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 21 Nov 2006 10:39:52 +0000 Subject: [PATCH 1270/1469] dtd for bit string git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1270 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1print/asn1print.c | 4 ++++ tests/125-bitstring-constraint-OK.asn1.-X | 8 ++++++++ 2 files changed, 12 insertions(+) create mode 100644 tests/125-bitstring-constraint-OK.asn1.-X diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index bf2481890..6f67f2c74 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -849,6 +849,8 @@ asn1print_expr_dtd(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, enum a if(TQ_FIRST(&expr->members)) { int extensible = 0; + if(expr->expr_type == ASN_BASIC_BIT_STRING) + dont_involve_children = 1; printf(" ("); TQ_FOR(se, &(expr->members), next) { if(se->expr_type == A1TC_EXTENSIBLE) { @@ -870,6 +872,8 @@ asn1print_expr_dtd(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, enum a printf("*"); else if(se->marker.flags) printf("?"); + else if(expr->expr_type == ASN_BASIC_BIT_STRING) + printf("?"); } if(TQ_NEXT(se, next) && TQ_NEXT(se, next)->expr_type != A1TC_EXTENSIBLE) { diff --git a/tests/125-bitstring-constraint-OK.asn1.-X b/tests/125-bitstring-constraint-OK.asn1.-X new file mode 100644 index 000000000..64a21c416 --- /dev/null +++ b/tests/125-bitstring-constraint-OK.asn1.-X @@ -0,0 +1,8 @@ + + + + + From 1daeca001b9acb393c02f90b1ade89452b740b25 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 24 Nov 2006 11:20:27 +0000 Subject: [PATCH 1271/1469] BMPString and UniversalString support git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1271 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/data-119/data-119-18.in | 10 + asn1c/tests/data-119/data-119-19.in | 10 + asn1c/tests/data-119/data-119-20-P.in | 3 + asn1c/tests/data-119/data-119-21-P.in | 3 + asn1c/tests/data-119/data-119-22-P.in | 3 + asn1c/tests/data-119/data-119-23-P.in | 3 + asn1c/tests/data-119/data-119-24-P.in | 3 + asn1c/tests/data-119/data-119-25-P.in | 3 + libasn1compiler/asn1c_C.c | 44 +- libasn1compiler/asn1c_constraint.c | 3 +- libasn1fix/asn1fix_constraint_compat.c | 4 +- skeletons/ANY.c | 2 +- skeletons/BIT_STRING.c | 2 +- skeletons/BMPString.c | 19 +- skeletons/OCTET_STRING.c | 394 ++++++++++------ skeletons/OCTET_STRING.h | 8 +- skeletons/UniversalString.c | 17 +- tests/119-per-strings-OK.asn1 | 10 + tests/119-per-strings-OK.asn1.-EF | 14 +- tests/119-per-strings-OK.asn1.-Pgen-PER | 583 ++++++++++++++++++++++-- 20 files changed, 956 insertions(+), 182 deletions(-) create mode 100644 asn1c/tests/data-119/data-119-18.in create mode 100644 asn1c/tests/data-119/data-119-19.in create mode 100644 asn1c/tests/data-119/data-119-20-P.in create mode 100644 asn1c/tests/data-119/data-119-21-P.in create mode 100644 asn1c/tests/data-119/data-119-22-P.in create mode 100644 asn1c/tests/data-119/data-119-23-P.in create mode 100644 asn1c/tests/data-119/data-119-24-P.in create mode 100644 asn1c/tests/data-119/data-119-25-P.in diff --git a/asn1c/tests/data-119/data-119-18.in b/asn1c/tests/data-119/data-119-18.in new file mode 100644 index 000000000..619502d81 --- /dev/null +++ b/asn1c/tests/data-119/data-119-18.in @@ -0,0 +1,10 @@ + + + abra kadabra + AAAAZZZZ + шеÑÑ‚ÑŒ! + ABC + ABCabc (extensibility in play) + ABXZ + + diff --git a/asn1c/tests/data-119/data-119-19.in b/asn1c/tests/data-119/data-119-19.in new file mode 100644 index 000000000..c5e8f0965 --- /dev/null +++ b/asn1c/tests/data-119/data-119-19.in @@ -0,0 +1,10 @@ + + + kadabra + AAAAZZZZ + шеÑÑ‚ÑŒ! + ABC + ABCabc (extensibility in play) + ABXZ + + diff --git a/asn1c/tests/data-119/data-119-20-P.in b/asn1c/tests/data-119/data-119-20-P.in new file mode 100644 index 000000000..53c198175 --- /dev/null +++ b/asn1c/tests/data-119/data-119-20-P.in @@ -0,0 +1,3 @@ + + abcd + diff --git a/asn1c/tests/data-119/data-119-21-P.in b/asn1c/tests/data-119/data-119-21-P.in new file mode 100644 index 000000000..d2d47d8be --- /dev/null +++ b/asn1c/tests/data-119/data-119-21-P.in @@ -0,0 +1,3 @@ + + abcd + diff --git a/asn1c/tests/data-119/data-119-22-P.in b/asn1c/tests/data-119/data-119-22-P.in new file mode 100644 index 000000000..6eb9a3e4a --- /dev/null +++ b/asn1c/tests/data-119/data-119-22-P.in @@ -0,0 +1,3 @@ + + + diff --git a/asn1c/tests/data-119/data-119-23-P.in b/asn1c/tests/data-119/data-119-23-P.in new file mode 100644 index 000000000..d25089237 --- /dev/null +++ b/asn1c/tests/data-119/data-119-23-P.in @@ -0,0 +1,3 @@ + + + diff --git a/asn1c/tests/data-119/data-119-24-P.in b/asn1c/tests/data-119/data-119-24-P.in new file mode 100644 index 000000000..094b45d88 --- /dev/null +++ b/asn1c/tests/data-119/data-119-24-P.in @@ -0,0 +1,3 @@ + + ABC + diff --git a/asn1c/tests/data-119/data-119-25-P.in b/asn1c/tests/data-119/data-119-25-P.in new file mode 100644 index 000000000..6da8b82cd --- /dev/null +++ b/asn1c/tests/data-119/data-119-25-P.in @@ -0,0 +1,3 @@ + + ABC + diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index bc9102ecd..489483901 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1825,14 +1825,16 @@ emit_single_member_PER_constraint(arg_t *arg, asn1cnst_range_t *range, int alpha } } - if(1) { + if(alphabetsize) { + ebits = rbits; + } else { /* X.691, #10.9.4.1 */ for(ebits = 0; ebits <= 16; ebits++) if(r <= 1 << ebits) break; if(ebits == 17 || range->right.value >= 65536) ebits = -1; - } else { + if(0) { /* X.691, #10.5.7.1 */ for(ebits = 0; ebits <= 8; ebits++) if(r <= 1 << ebits) break; @@ -1843,11 +1845,25 @@ emit_single_member_PER_constraint(arg_t *arg, asn1cnst_range_t *range, int alpha ebits = -1; } } + } OUT("{ APC_CONSTRAINED%s,%s% d, % d, ", range->extensible ? " | APC_EXTENSIBLE" : "", range->extensible ? " " : "\t", rbits, ebits); + + if(alphabetsize) { + asn1c_integer_t lv = range->left.value; + asn1c_integer_t rv = range->right.value; + int gcmt = 0; + if(lv > 0x7fffffff) { lv = 0x7fffffff; gcmt++; } + if(rv > 0x7fffffff) { rv = 0x7fffffff; gcmt++; } + if(gcmt) { + OUT("% " PRIdASN ", % " PRIdASN " }", + lv, rv); + goto pcmt; + } + } } else { if(range->extensible) { OUT("{ APC_SEMI_CONSTRAINED | APC_EXTENSIBLE, " @@ -1862,6 +1878,8 @@ emit_single_member_PER_constraint(arg_t *arg, asn1cnst_range_t *range, int alpha OUT("{ APC_UNCONSTRAINED,\t-1, -1, 0, 0 }"); } + pcmt: + /* * Print some courtesy debug information. */ @@ -1948,8 +1966,30 @@ emit_member_PER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { expr->combined_constraints, ACT_CT_FROM, 0, 0, 0); DEBUG("Emitting FROM constraint for %s", expr->Identifier); + + if((range->left.type == ARE_MIN && range->right.type == ARE_MAX) + || range->not_PER_visible) { + switch(etype) { + case ASN_STRING_BMPString: + range->left.type = ARE_VALUE; + range->left.value = 0; + range->right.type = ARE_VALUE; + range->right.value = 65535; + range->not_PER_visible = 0; + range->extensible = 0; + break; + case ASN_STRING_UniversalString: + OUT("{ APC_CONSTRAINED,\t32, 32," + " 0, 2147483647 }" + " /* special case 1 */\n"); + goto avoid; + default: + break; + } + } if(emit_single_member_PER_constraint(arg, range, 1, 0)) return -1; + avoid: asn1constraint_range_free(range); } else { range = asn1constraint_compute_PER_range(etype, diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index 2fd8885fc..1e2efa45f 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -72,7 +72,7 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { case ASN_BASIC_BIT_STRING: case ASN_BASIC_OCTET_STRING: produce_st = 1; - break; + break; default: if(etype & ASN_STRING_MASK) produce_st = 1; @@ -222,7 +222,6 @@ asn1c_emit_constraint_tables(arg_t *arg, int got_size) { return 0; } - if(range->left.type == ARE_MIN && range->right.type == ARE_MAX) { /* diff --git a/libasn1fix/asn1fix_constraint_compat.c b/libasn1fix/asn1fix_constraint_compat.c index 82abf1756..24dc24db6 100644 --- a/libasn1fix/asn1fix_constraint_compat.c +++ b/libasn1fix/asn1fix_constraint_compat.c @@ -128,7 +128,7 @@ asn1constraint_default_alphabet(asn1p_expr_type_e expr_type) { DECL_notPV(utf8, 0x00, 0x7fffffff); /* Not PER-visible */ DECL(bmp, 0x00, 65533); /* 64K-2 cells */ DECL(uint7, 0x00, 0x7f); - DECL(uint31, 0x00, 0x7fffffff); + DECL(uint32, 0x00, 0xffffffff); DECL(Space, 0x20, 0x20); DECL(ApostropheAndParens, 0x27, 0x29); DECL(PlusTillColon, 0x2b, 0x3a); @@ -213,7 +213,7 @@ asn1constraint_default_alphabet(asn1p_expr_type_e expr_type) { assert(range_utf8.not_PER_visible); return &range_utf8; case ASN_STRING_UniversalString: - return &range_uint31; + return &range_uint32; case ASN_BASIC_UTCTime: /* Permitted alphabet constraint is not applicable */ assert(range_UTCTime.not_PER_visible); diff --git a/skeletons/ANY.c b/skeletons/ANY.c index 612238b60..0ad60d0a0 100644 --- a/skeletons/ANY.c +++ b/skeletons/ANY.c @@ -9,7 +9,7 @@ static asn_OCTET_STRING_specifics_t asn_DEF_ANY_specs = { sizeof(ANY_t), offsetof(ANY_t, _asn_ctx), - 2 /* Special indicator that this is an ANY type */ + ASN_OSUBV_ANY }; asn_TYPE_descriptor_t asn_DEF_ANY = { "ANY", diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index dd6d946f5..8acea86c9 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -15,7 +15,7 @@ static ber_tlv_tag_t asn_DEF_BIT_STRING_tags[] = { static asn_OCTET_STRING_specifics_t asn_DEF_BIT_STRING_specs = { sizeof(BIT_STRING_t), offsetof(BIT_STRING_t, _asn_ctx), - 1, /* Special indicator that this is a BIT STRING type */ + ASN_OSUBV_BIT }; asn_TYPE_descriptor_t asn_DEF_BIT_STRING = { "BIT STRING", diff --git a/skeletons/BMPString.c b/skeletons/BMPString.c index d6a9308f1..072bd075f 100644 --- a/skeletons/BMPString.c +++ b/skeletons/BMPString.c @@ -13,6 +13,16 @@ static ber_tlv_tag_t asn_DEF_BMPString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (30 << 2)), /* [UNIVERSAL 30] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; +static asn_OCTET_STRING_specifics_t asn_DEF_BMPString_specs = { + sizeof(BMPString_t), + offsetof(BMPString_t, _asn_ctx), + ASN_OSUBV_U16 /* 16-bits character */ +}; +static asn_per_constraints_t asn_DEF_BMPString_constraints = { + { APC_CONSTRAINED, 16, 16, 0, 65535 }, + { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 }, + 0, 0 +}; asn_TYPE_descriptor_t asn_DEF_BMPString = { "BMPString", "BMPString", @@ -23,7 +33,8 @@ asn_TYPE_descriptor_t asn_DEF_BMPString = { OCTET_STRING_encode_der, BMPString_decode_xer, /* Convert from UTF-8 */ BMPString_encode_xer, /* Convert to UTF-8 */ - 0, 0, + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_BMPString_tags, sizeof(asn_DEF_BMPString_tags) @@ -31,9 +42,9 @@ asn_TYPE_descriptor_t asn_DEF_BMPString = { asn_DEF_BMPString_tags, sizeof(asn_DEF_BMPString_tags) / sizeof(asn_DEF_BMPString_tags[0]), - 0, /* No PER visible constraints */ + &asn_DEF_BMPString_constraints, 0, 0, /* No members */ - 0 /* No specifics */ + &asn_DEF_BMPString_specs }; /* @@ -131,7 +142,7 @@ BMPString_decode_xer(asn_codec_ctx_t *opt_codec_ctx, rc.consumed = 0; return rc; } else { - dstwc[2 * wcs_len] = 0; + dstwc[wcs_len] = 0; /* nul-terminate */ wcs = (uint32_t *)dstwc; } } diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 7313498f8..584def8b4 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -17,10 +17,12 @@ static ber_tlv_tag_t asn_DEF_OCTET_STRING_tags[] = { static asn_OCTET_STRING_specifics_t asn_DEF_OCTET_STRING_specs = { sizeof(OCTET_STRING_t), offsetof(OCTET_STRING_t, _asn_ctx), - 0 + ASN_OSUBV_STR }; -static asn_per_constraint_t asn_DEF_OCTET_STRING_constraint = { - APC_SEMI_CONSTRAINED, -1, -1, 0, 0 +static asn_per_constraints_t asn_DEF_OCTET_STRING_constraints = { + { APC_CONSTRAINED, 8, 8, 0, 255 }, + { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 }, + 0, 0 }; asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { "OCTET STRING", /* Canonical name */ @@ -102,15 +104,6 @@ asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { st->size = _es; \ } while(0) -/* - * Internal variant of the OCTET STRING. - */ -typedef enum OS_type { - _TT_GENERIC = 0, /* Just a random OCTET STRING */ - _TT_BIT_STRING = 1, /* BIT STRING type, a special case */ - _TT_ANY = 2 /* ANY type, a special case too */ -} OS_type_e; - /* * The main reason why ASN.1 is still alive is that too much time and effort * is necessary for learning it more or less adequately, thus creating a gut @@ -185,11 +178,11 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, struct _stack *stck; /* Expectations stack structure */ struct _stack_el *sel = 0; /* Stack element */ int tlv_constr; - OS_type_e type_variant = (OS_type_e)specs->subvariant; + enum asn_OS_Subvariant type_variant = specs->subvariant; ASN_DEBUG("Decoding %s as %s (frame %ld)", td->name, - (type_variant == _TT_GENERIC) ? + (type_variant == ASN_OSUBV_STR) ? "OCTET STRING" : "OS-SpecialCase", (long)size); @@ -230,7 +223,7 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, * Jump into stackless primitive decoding. */ _CH_PHASE(ctx, 3); - if(type_variant == _TT_ANY && tag_mode != 1) + if(type_variant == ASN_OSUBV_ANY && tag_mode != 1) APPEND(buf_ptr, rval.consumed); ADVANCE(rval.consumed); goto phase3; @@ -309,7 +302,7 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, ASN_DEBUG("Eat EOC; wn=%d--", sel->want_nulls); - if(type_variant == _TT_ANY + if(type_variant == ASN_OSUBV_ANY && (tag_mode != 1 || sel->cont_level)) APPEND("\0\0", 2); @@ -334,10 +327,10 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, * depending on ASN.1 type being decoded. */ switch(type_variant) { - case _TT_BIT_STRING: + case ASN_OSUBV_BIT: /* X.690: 8.6.4.1, NOTE 2 */ /* Fall through */ - case _TT_GENERIC: + case ASN_OSUBV_STR: default: if(sel) { int level = sel->cont_level; @@ -352,7 +345,7 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, /* else, Fall through */ } /* Fall through */ - case _TT_ANY: + case ASN_OSUBV_ANY: expected_tag = tlv_tag; break; } @@ -397,7 +390,7 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, } else { sel->left = tlv_len; } - if(type_variant == _TT_ANY + if(type_variant == ASN_OSUBV_ANY && (tag_mode != 1 || sel->cont_level)) APPEND(buf_ptr, tlvl); sel->got += tlvl; @@ -431,7 +424,7 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, len = ((ber_tlv_len_t)size < sel->left) ? (ber_tlv_len_t)size : sel->left; if(len > 0) { - if(type_variant == _TT_BIT_STRING + if(type_variant == ASN_OSUBV_BIT && sel->bits_chopped == 0) { /* Put the unused-bits-octet away */ st->bits_unused = *(const uint8_t *)buf_ptr; @@ -464,7 +457,7 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, if(size < (size_t)ctx->left) { if(!size) RETURN(RC_WMORE); - if(type_variant == _TT_BIT_STRING && !ctx->context) { + if(type_variant == ASN_OSUBV_BIT && !ctx->context) { st->bits_unused = *(const uint8_t *)buf_ptr; ctx->left--; ADVANCE(1); @@ -475,7 +468,7 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, ADVANCE(size); RETURN(RC_WMORE); } else { - if(type_variant == _TT_BIT_STRING + if(type_variant == ASN_OSUBV_BIT && !ctx->context && ctx->left) { st->bits_unused = *(const uint8_t *)buf_ptr; ctx->left--; @@ -502,14 +495,14 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, /* * BIT STRING-specific processing. */ - if(type_variant == _TT_BIT_STRING && st->size) { + if(type_variant == ASN_OSUBV_BIT && st->size) { /* Finalize BIT STRING: zero out unused bits. */ st->buf[st->size-1] &= 0xff << st->bits_unused; } ASN_DEBUG("Took %ld bytes to encode %s: [%s]:%ld", (long)consumed_myself, td->name, - (type_variant == _TT_GENERIC) ? (char *)st->buf : "", + (type_variant == ASN_OSUBV_STR) ? (char *)st->buf : "", (long)st->size); @@ -528,7 +521,7 @@ OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *sptr, ? (asn_OCTET_STRING_specifics_t *)td->specifics : &asn_DEF_OCTET_STRING_specs; BIT_STRING_t *st = (BIT_STRING_t *)sptr; - OS_type_e type_variant = (OS_type_e)specs->subvariant; + enum asn_OS_Subvariant type_variant = specs->subvariant; int fix_last_byte = 0; ASN_DEBUG("%s %s as OCTET STRING", @@ -537,10 +530,11 @@ OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *sptr, /* * Write tags. */ - if(type_variant != _TT_ANY || tag_mode == 1) { + if(type_variant != ASN_OSUBV_ANY || tag_mode == 1) { er.encoded = der_write_tags(td, - (type_variant == _TT_BIT_STRING) + st->size, - tag_mode, type_variant == _TT_ANY, tag, cb, app_key); + (type_variant == ASN_OSUBV_BIT) + st->size, + tag_mode, type_variant == ASN_OSUBV_ANY, tag, + cb, app_key); if(er.encoded == -1) { er.failed_type = td; er.structure_ptr = sptr; @@ -548,19 +542,19 @@ OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *sptr, } } else { /* Disallow: [] IMPLICIT ANY */ - assert(type_variant != _TT_ANY || tag_mode != -1); + assert(type_variant != ASN_OSUBV_ANY || tag_mode != -1); er.encoded = 0; } if(!cb) { - er.encoded += (type_variant == _TT_BIT_STRING) + st->size; + er.encoded += (type_variant == ASN_OSUBV_BIT) + st->size; _ASN_ENCODED_OK(er); } /* * Prepare to deal with the last octet of BIT STRING. */ - if(type_variant == _TT_BIT_STRING) { + if(type_variant == ASN_OSUBV_BIT) { uint8_t b = st->bits_unused & 0x07; if(b && st->size) fix_last_byte = 1; _ASN_CALLBACK(&b, 1); @@ -1198,36 +1192,50 @@ OCTET_STRING_decode_xer_utf8(asn_codec_ctx_t *opt_codec_ctx, } static int -OCTET_STRING_per_get_expanded(asn_per_data_t *po, uint8_t *buf, - size_t size, long lb, long ub, int (*code2value)(unsigned int), - int unit_bits) { - uint8_t *end = buf + size; +OCTET_STRING_per_get_characters(asn_per_data_t *po, uint8_t *buf, + size_t units, unsigned int bpc, unsigned int unit_bits, + long lb, long ub, asn_per_constraints_t *pc) { + uint8_t *end = buf + units * bpc; ASN_DEBUG("Expanding %d characters into (%ld..%ld):%d", - (int)size, lb, ub, unit_bits); + (int)units, lb, ub, unit_bits); /* X.691: 27.5.4 */ - if(ub <= (2 << (unit_bits - 1))) { + if((unsigned long)ub <= ((unsigned long)2 << (unit_bits - 1))) { /* Decode without translation */ lb = 0; - } else if(code2value) { - for(; buf < end; buf++) { - int code = per_get_few_bits(po, unit_bits); + } else if(pc && pc->code2value) { + if(unit_bits > 16) + return 1; /* FATAL: can't have constrained + * UniversalString with more than + * 16 million code points */ + for(; buf < end; buf += bpc) { int value; + int code = per_get_few_bits(po, unit_bits); if(code < 0) return -1; /* WMORE */ - value = code2value(code); + value = pc->code2value(code); if(value < 0) { ASN_DEBUG("Code %d (0x%02x) is" " not in map (%ld..%ld)", code, code, lb, ub); return 1; /* FATAL */ } - *buf = value; + switch(bpc) { + case 1: *buf = value; break; + case 2: buf[0] = value >> 8; buf[1] = value; break; + case 4: buf[0] = value >> 24; buf[1] = value >> 16; + buf[2] = value >> 8; buf[3] = value; break; + } } return 0; } - for(; buf < end; buf++) { + /* Shortcut the no-op copying to the aligned structure */ + if(lb == 0 && (unit_bits == 8 * bpc)) { + return per_get_many_bits(po, buf, 0, unit_bits * units); + } + + for(; buf < end; buf += bpc) { int code = per_get_few_bits(po, unit_bits); int ch = code + lb; if(code < 0) return -1; /* WMORE */ @@ -1236,28 +1244,42 @@ OCTET_STRING_per_get_expanded(asn_per_data_t *po, uint8_t *buf, ch, lb, ub); return 1; /* FATAL */ } - *buf = ch; + switch(bpc) { + case 1: *buf = ch; break; + case 2: buf[0] = ch >> 8; buf[1] = ch; break; + case 4: buf[0] = ch >> 24; buf[1] = ch >> 16; + buf[2] = ch >> 8; buf[3] = ch; break; + } } return 0; } static int -OCTET_STRING_per_put_squeezed(asn_per_outp_t *po, const uint8_t *buf, - size_t size, long lb, long ub, int (*value2code)(unsigned int), - int unit_bits) { - const uint8_t *end = buf + size; +OCTET_STRING_per_put_characters(asn_per_outp_t *po, const uint8_t *buf, + size_t units, unsigned int bpc, unsigned int unit_bits, + long lb, long ub, asn_per_constraints_t *pc) { + const uint8_t *end = buf + units * bpc; - ASN_DEBUG("Squeezing %d bytes into (%ld..%ld):%d", - (int)size, lb, ub, unit_bits); + ASN_DEBUG("Squeezing %d characters into (%ld..%ld):%d (%d bpc)", + (int)units, lb, ub, unit_bits, bpc); /* X.691: 27.5.4 */ - if(ub <= (2 << (unit_bits - 1))) { + if((unsigned long)ub <= ((unsigned long)2 << (unit_bits - 1))) { /* Encode as is */ lb = 0; - } else if(value2code) { - for(; buf < end; buf++) { - int code = value2code(*buf); + } else if(pc && pc->value2code) { + for(; buf < end; buf += bpc) { + int code; + uint32_t value; + switch(bpc) { + case 1: value = *(const uint8_t *)buf; break; + case 2: value = (buf[0] << 8) | buf[1]; break; + case 4: value = (buf[0] << 24) | (buf[1] << 16) + | (buf[2] << 8) | buf[3]; break; + default: return -1; + } + code = pc->value2code(value); if(code < 0) { ASN_DEBUG("Character %d (0x%02x) is" " not in map (%ld..%ld)", @@ -1269,8 +1291,22 @@ OCTET_STRING_per_put_squeezed(asn_per_outp_t *po, const uint8_t *buf, } } - for(ub -= lb; buf < end; buf++) { - int ch = *buf - lb; + /* Shortcut the no-op copying to the aligned structure */ + if(lb == 0 && (unit_bits == 8 * bpc)) { + return per_put_many_bits(po, buf, unit_bits * units); + } + + for(ub -= lb; buf < end; buf += bpc) { + int ch; + uint32_t value; + switch(bpc) { + case 1: value = *(const uint8_t *)buf; break; + case 2: value = (buf[0] << 8) | buf[1]; break; + case 4: value = (buf[0] << 24) | (buf[1] << 16) + | (buf[2] << 8) | buf[3]; break; + default: return -1; + } + ch = value - lb; if(ch < 0 || ch > ub) { ASN_DEBUG("Character %d (0x%02x)" " is out of range (%ld..%ld)", @@ -1294,18 +1330,60 @@ OCTET_STRING_decode_uper(asn_codec_ctx_t *opt_codec_ctx, : &asn_DEF_OCTET_STRING_specs; asn_per_constraints_t *pc = constraints ? constraints : td->per_constraints; - asn_per_constraint_t *cv = pc ? &pc->value : 0; - asn_per_constraint_t *ct = pc ? &pc->size - : &asn_DEF_OCTET_STRING_constraint; + asn_per_constraint_t *cval; + asn_per_constraint_t *csiz; asn_dec_rval_t rval = { RC_OK, 0 }; BIT_STRING_t *st = (BIT_STRING_t *)*sptr; ssize_t consumed_myself = 0; int repeat; - int unit_bits = (specs->subvariant != 1) * 7 + 1; - int expand = 0; + enum { + OS__BPC_BIT = 0, + OS__BPC_CHAR = 1, + OS__BPC_U16 = 2, + OS__BPC_U32 = 4 + } bpc; /* Bytes per character */ + unsigned int unit_bits; + unsigned int canonical_unit_bits; (void)opt_codec_ctx; + if(pc) { + cval = &pc->value; + csiz = &pc->size; + } else { + cval = &asn_DEF_OCTET_STRING_constraints.value; + csiz = &asn_DEF_OCTET_STRING_constraints.size; + } + + switch(specs->subvariant) { + default: + case ASN_OSUBV_ANY: + ASN_DEBUG("Unrecognized subvariant %d", specs->subvariant); + RETURN(RC_FAIL); + case ASN_OSUBV_BIT: + canonical_unit_bits = unit_bits = 1; + bpc = OS__BPC_BIT; + break; + case ASN_OSUBV_STR: + canonical_unit_bits = unit_bits = 8; + if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; + bpc = OS__BPC_CHAR; + break; + case ASN_OSUBV_U16: + canonical_unit_bits = unit_bits = 16; + if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; + bpc = OS__BPC_U16; + break; + case ASN_OSUBV_U32: + canonical_unit_bits = unit_bits = 32; + if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; + bpc = OS__BPC_U32; + break; + } + /* * Allocate the string. */ @@ -1314,29 +1392,26 @@ OCTET_STRING_decode_uper(asn_codec_ctx_t *opt_codec_ctx, if(!st) RETURN(RC_FAIL); } - if(cv && (cv->flags & APC_CONSTRAINED)) { - unit_bits = cv->range_bits; - if(unit_bits != 8) expand = 1; - } - ASN_DEBUG("PER Decoding %s size %ld .. %ld bits %d", - ct->flags & APC_EXTENSIBLE ? "extensible" : "non-extensible", - ct->lower_bound, ct->upper_bound, ct->effective_bits); + csiz->flags & APC_EXTENSIBLE ? "extensible" : "non-extensible", + csiz->lower_bound, csiz->upper_bound, csiz->effective_bits); - if(ct->flags & APC_EXTENSIBLE) { + if(csiz->flags & APC_EXTENSIBLE) { int inext = per_get_few_bits(pd, 1); if(inext < 0) RETURN(RC_WMORE); - if(inext) ct = &asn_DEF_OCTET_STRING_constraint; - consumed_myself = 0; + if(inext) { + csiz = &asn_DEF_OCTET_STRING_constraints.size; + cval = &asn_DEF_OCTET_STRING_constraints.value; + unit_bits = canonical_unit_bits; + } } - if(ct->effective_bits >= 0 - && (!st->buf || st->size < ct->upper_bound)) { + if(csiz->effective_bits >= 0) { FREEMEM(st->buf); - if(unit_bits == 1) { - st->size = (ct->upper_bound + 7) >> 3; + if(bpc) { + st->size = csiz->upper_bound * bpc; } else { - st->size = ct->upper_bound; + st->size = (csiz->upper_bound + 7) >> 3; } st->buf = (uint8_t *)MALLOC(st->size + 1); if(!st->buf) { st->size = 0; RETURN(RC_FAIL); } @@ -1345,59 +1420,65 @@ OCTET_STRING_decode_uper(asn_codec_ctx_t *opt_codec_ctx, /* X.691, #16.5: zero-length encoding */ /* X.691, #16.6: short fixed length encoding (up to 2 octets) */ /* X.691, #16.7: long fixed length encoding (up to 64K octets) */ - if(ct->effective_bits == 0) { + if(csiz->effective_bits == 0) { int ret; - if(expand) { - ret = OCTET_STRING_per_get_expanded(pd, st->buf, - cv->upper_bound, - cv->lower_bound, cv->upper_bound, - pc->code2value, unit_bits); + if(bpc) { + ASN_DEBUG("Encoding OCTET STRING size %ld", + csiz->upper_bound); + ret = OCTET_STRING_per_get_characters(pd, st->buf, + csiz->upper_bound, bpc, unit_bits, + cval->lower_bound, cval->upper_bound, pc); if(ret > 0) RETURN(RC_FAIL); } else { + ASN_DEBUG("Encoding BIT STRING size %ld", + csiz->upper_bound); ret = per_get_many_bits(pd, st->buf, 0, - unit_bits * ct->upper_bound); + unit_bits * csiz->upper_bound); } if(ret < 0) RETURN(RC_WMORE); - consumed_myself += unit_bits * ct->upper_bound; + consumed_myself += unit_bits * csiz->upper_bound; st->buf[st->size] = 0; - if(unit_bits == 1 && (ct->upper_bound & 0x7)) - st->bits_unused = 8 - (ct->upper_bound & 0x7); + if(bpc == 0) { + int ubs = (csiz->upper_bound & 0x7); + st->bits_unused = ubs ? 8 - ubs : 0; + } RETURN(RC_OK); } st->size = 0; do { + ssize_t raw_len; ssize_t len_bytes; ssize_t len_bits; void *p; int ret; /* Get the PER length */ - len_bits = uper_get_length(pd, ct->effective_bits, &repeat); - if(len_bits < 0) RETURN(RC_WMORE); - len_bits += ct->lower_bound; + raw_len = uper_get_length(pd, csiz->effective_bits, &repeat); + if(raw_len < 0) RETURN(RC_WMORE); + raw_len += csiz->lower_bound; ASN_DEBUG("Got PER length eb %ld, len %ld, %s (%s)", - (long)ct->effective_bits, (long)len_bits, + (long)csiz->effective_bits, (long)raw_len, repeat ? "repeat" : "once", td->name); - if(unit_bits == 1 && !expand) { + if(bpc) { + len_bytes = raw_len * bpc; + len_bits = len_bytes * unit_bits; + } else { + len_bits = raw_len; len_bytes = (len_bits + 7) >> 3; if(len_bits & 0x7) st->bits_unused = 8 - (len_bits & 0x7); /* len_bits be multiple of 16K if repeat is set */ - } else { - len_bytes = len_bits; - len_bits = len_bytes << 3; } p = REALLOC(st->buf, st->size + len_bytes + 1); if(!p) RETURN(RC_FAIL); st->buf = (uint8_t *)p; - if(expand) { - ret = OCTET_STRING_per_get_expanded(pd, - &st->buf[st->size], len_bytes, - cv->lower_bound, cv->upper_bound, - pc->code2value, unit_bits); + if(bpc) { + ret = OCTET_STRING_per_get_characters(pd, + &st->buf[st->size], raw_len, bpc, unit_bits, + cval->lower_bound, cval->upper_bound, pc); if(ret > 0) RETURN(RC_FAIL); } else { ret = per_get_many_bits(pd, &st->buf[st->size], @@ -1420,46 +1501,85 @@ OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td, : &asn_DEF_OCTET_STRING_specs; asn_per_constraints_t *pc = constraints ? constraints : td->per_constraints; - asn_per_constraint_t *cv = pc ? &pc->value : 0; - asn_per_constraint_t *ct = pc ? &pc->size - : &asn_DEF_OCTET_STRING_constraint; + asn_per_constraint_t *cval; + asn_per_constraint_t *csiz; const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; - asn_enc_rval_t er = { 0, 0 }; - int ct_extensible = ct->flags & APC_EXTENSIBLE; + asn_enc_rval_t er = { 0, 0, 0 }; int inext = 0; /* Lies not within extension root */ - int unit_bits = (specs->subvariant != 1) * 7 + 1; - int sizeinunits = st->size; + unsigned int unit_bits; + unsigned int canonical_unit_bits; + unsigned int sizeinunits; const uint8_t *buf; - int squeeze = 0; int ret; + enum { + OS__BPC_BIT = 0, + OS__BPC_CHAR = 1, + OS__BPC_U16 = 2, + OS__BPC_U32 = 4 + } bpc; /* Bytes per character */ + int ct_extensible; if(!st || (!st->buf && st->size)) _ASN_ENCODE_FAILED; - if(unit_bits == 1) { - ASN_DEBUG("BIT STRING of %d bytes, %d bits unused", - sizeinunits, st->bits_unused); - sizeinunits = sizeinunits * 8 - (st->bits_unused & 0x07); + if(pc) { + cval = &pc->value; + csiz = &pc->size; + } else { + cval = &asn_DEF_OCTET_STRING_constraints.value; + csiz = &asn_DEF_OCTET_STRING_constraints.size; } + ct_extensible = csiz->flags & APC_EXTENSIBLE; - if(cv && (cv->flags & APC_CONSTRAINED)) { - unit_bits = cv->range_bits; - if(unit_bits != 8) squeeze = 1; + switch(specs->subvariant) { + default: + case ASN_OSUBV_ANY: + _ASN_ENCODE_FAILED; + case ASN_OSUBV_BIT: + canonical_unit_bits = unit_bits = 1; + bpc = OS__BPC_BIT; + sizeinunits = st->size * 8 - (st->bits_unused & 0x07); + ASN_DEBUG("BIT STRING of %d bytes, %d bits unused", + sizeinunits, st->bits_unused); + break; + case ASN_OSUBV_STR: + canonical_unit_bits = unit_bits = 8; + if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; + bpc = OS__BPC_CHAR; + sizeinunits = st->size; + break; + case ASN_OSUBV_U16: + canonical_unit_bits = unit_bits = 16; + if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; + bpc = OS__BPC_U16; + sizeinunits = st->size / 2; + break; + case ASN_OSUBV_U32: + canonical_unit_bits = unit_bits = 32; + if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; + bpc = OS__BPC_U32; + sizeinunits = st->size / 4; + break; } ASN_DEBUG("Encoding %s into %d units of %d bits" " (%ld..%ld, effective %d)%s", td->name, sizeinunits, unit_bits, - ct->lower_bound, ct->upper_bound, - ct->effective_bits, ct_extensible ? " EXT" : ""); + csiz->lower_bound, csiz->upper_bound, + csiz->effective_bits, ct_extensible ? " EXT" : ""); /* Figure out wheter size lies within PER visible constraint */ - if(ct->effective_bits >= 0) { - if(sizeinunits < ct->lower_bound - || sizeinunits > ct->upper_bound) { + if(csiz->effective_bits >= 0) { + if((int)sizeinunits < csiz->lower_bound + || (int)sizeinunits > csiz->upper_bound) { if(ct_extensible) { - ct = &asn_DEF_OCTET_STRING_constraint; + cval = &asn_DEF_OCTET_STRING_constraints.value; + csiz = &asn_DEF_OCTET_STRING_constraints.size; + unit_bits = canonical_unit_bits; inext = 1; } else _ASN_ENCODE_FAILED; @@ -1477,17 +1597,17 @@ OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td, /* X.691, #16.5: zero-length encoding */ /* X.691, #16.6: short fixed length encoding (up to 2 octets) */ /* X.691, #16.7: long fixed length encoding (up to 64K octets) */ - if(ct->effective_bits >= 0) { + if(csiz->effective_bits >= 0) { ASN_DEBUG("Encoding %d bytes (%ld), length in %d bits", - st->size, sizeinunits - ct->lower_bound, - ct->effective_bits); - ret = per_put_few_bits(po, sizeinunits - ct->lower_bound, - ct->effective_bits); + st->size, sizeinunits - csiz->lower_bound, + csiz->effective_bits); + ret = per_put_few_bits(po, sizeinunits - csiz->lower_bound, + csiz->effective_bits); if(ret) _ASN_ENCODE_FAILED; - if(squeeze) { - ret = OCTET_STRING_per_put_squeezed(po, st->buf, - sizeinunits, cv->lower_bound, cv->upper_bound, - pc->value2code, unit_bits); + if(bpc) { + ret = OCTET_STRING_per_put_characters(po, st->buf, + sizeinunits, bpc, unit_bits, + cval->lower_bound, cval->upper_bound, pc); } else { ret = per_put_many_bits(po, st->buf, sizeinunits * unit_bits); @@ -1512,19 +1632,19 @@ OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td, ASN_DEBUG("Encoding %ld of %ld", (long)maySave, (long)sizeinunits); - if(squeeze) { - ret = OCTET_STRING_per_put_squeezed(po, buf, - maySave, cv->lower_bound, cv->upper_bound, - pc->value2code, unit_bits); + if(bpc) { + ret = OCTET_STRING_per_put_characters(po, buf, + maySave, bpc, unit_bits, + cval->lower_bound, cval->upper_bound, pc); } else { ret = per_put_many_bits(po, buf, maySave * unit_bits); } if(ret) _ASN_ENCODE_FAILED; - if(unit_bits == 1 && !squeeze) - buf += maySave >> 3; + if(bpc) + buf += maySave * bpc; else - buf += maySave; + buf += maySave >> 3; sizeinunits -= maySave; assert(!(maySave & 0x07) || !sizeinunits); } diff --git a/skeletons/OCTET_STRING.h b/skeletons/OCTET_STRING.h index 5150161a7..8df9a182d 100644 --- a/skeletons/OCTET_STRING.h +++ b/skeletons/OCTET_STRING.h @@ -70,7 +70,13 @@ typedef struct asn_OCTET_STRING_specifics_s { int struct_size; /* Size of the structure */ int ctx_offset; /* Offset of the asn_struct_ctx_t member */ - int subvariant; /* {0,1,2} for O-S, BIT STRING or ANY */ + enum asn_OS_Subvariant { + ASN_OSUBV_ANY, /* The open type (ANY) */ + ASN_OSUBV_BIT, /* BIT STRING */ + ASN_OSUBV_STR, /* String types, not {BMP,Universal}String */ + ASN_OSUBV_U16, /* 16-bit character (BMPString) */ + ASN_OSUBV_U32 /* 32-bit character (UniversalString) */ + } subvariant; } asn_OCTET_STRING_specifics_t; #ifdef __cplusplus diff --git a/skeletons/UniversalString.c b/skeletons/UniversalString.c index a39e56990..7d16781f5 100644 --- a/skeletons/UniversalString.c +++ b/skeletons/UniversalString.c @@ -13,6 +13,16 @@ static ber_tlv_tag_t asn_DEF_UniversalString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (28 << 2)), /* [UNIVERSAL 28] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; +static asn_OCTET_STRING_specifics_t asn_DEF_UniversalString_specs = { + sizeof(UniversalString_t), + offsetof(UniversalString_t, _asn_ctx), + ASN_OSUBV_U32 /* 32-bits character */ +}; +static asn_per_constraints_t asn_DEF_UniversalString_constraints = { + { APC_CONSTRAINED, 32, 32, 0, 2147483647 }, + { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 }, + 0, 0 +}; asn_TYPE_descriptor_t asn_DEF_UniversalString = { "UniversalString", "UniversalString", @@ -23,7 +33,8 @@ asn_TYPE_descriptor_t asn_DEF_UniversalString = { OCTET_STRING_encode_der, UniversalString_decode_xer, /* Convert from UTF-8 */ UniversalString_encode_xer, /* Convert into UTF-8 */ - 0, 0, + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_UniversalString_tags, sizeof(asn_DEF_UniversalString_tags) @@ -31,9 +42,9 @@ asn_TYPE_descriptor_t asn_DEF_UniversalString = { asn_DEF_UniversalString_tags, sizeof(asn_DEF_UniversalString_tags) / sizeof(asn_DEF_UniversalString_tags[0]), - 0, /* No PER visible constraints */ + &asn_DEF_UniversalString_constraints, 0, 0, /* No members */ - 0 /* No specifics */ + &asn_DEF_UniversalString_specs }; diff --git a/tests/119-per-strings-OK.asn1 b/tests/119-per-strings-OK.asn1 index 856b51be0..ae1ec46f9 100644 --- a/tests/119-per-strings-OK.asn1 +++ b/tests/119-per-strings-OK.asn1 @@ -31,6 +31,16 @@ BEGIN ut-c UTF8String (SIZE(6)) OPTIONAL, ut-ce UTF8String (SIZE(6,...)) OPTIONAL, ut-ir UTF8String (FROM("A"|"Z")) OPTIONAL, + bm BMPString OPTIONAL, + bm-c BMPString (FROM("A".."Z")) OPTIONAL, + bm-cs BMPString (SIZE(6)) OPTIONAL, + bm-ce BMPString (FROM("A".."Z",...)) OPTIONAL, + bm-ir BMPString (FROM("A".."B"|"X".."Z")) OPTIONAL, + us UniversalString OPTIONAL, + us-c UniversalString (FROM("A".."Z")) OPTIONAL, + us-cs UniversalString (SIZE(6)) OPTIONAL, + us-ce UniversalString (FROM("A".."Z",...)) OPTIONAL, + us-ir UniversalString (FROM("A".."B"|"X".."Z")) OPTIONAL, real REAL OPTIONAL, oid OBJECT IDENTIFIER OPTIONAL } diff --git a/tests/119-per-strings-OK.asn1.-EF b/tests/119-per-strings-OK.asn1.-EF index 7ec858d1e..7819c03fd 100644 --- a/tests/119-per-strings-OK.asn1.-EF +++ b/tests/119-per-strings-OK.asn1.-EF @@ -23,8 +23,18 @@ PDU ::= SEQUENCE { ut-c [16] IMPLICIT UTF8String (SIZE(6)) OPTIONAL, ut-ce [17] IMPLICIT UTF8String (SIZE(6,...)) OPTIONAL, ut-ir [18] IMPLICIT UTF8String (FROM("A" | "Z")) OPTIONAL, - real [19] IMPLICIT REAL OPTIONAL, - oid [20] IMPLICIT OBJECT IDENTIFIER OPTIONAL + bm [19] IMPLICIT BMPString OPTIONAL, + bm-c [20] IMPLICIT BMPString (FROM("A".."Z")) OPTIONAL, + bm-cs [21] IMPLICIT BMPString (SIZE(6)) OPTIONAL, + bm-ce [22] IMPLICIT BMPString (FROM("A".."Z",...)) OPTIONAL, + bm-ir [23] IMPLICIT BMPString (FROM("A".."B" | "X".."Z")) OPTIONAL, + us [24] IMPLICIT UniversalString OPTIONAL, + us-c [25] IMPLICIT UniversalString (FROM("A".."Z")) OPTIONAL, + us-cs [26] IMPLICIT UniversalString (SIZE(6)) OPTIONAL, + us-ce [27] IMPLICIT UniversalString (FROM("A".."Z",...)) OPTIONAL, + us-ir [28] IMPLICIT UniversalString (FROM("A".."B" | "X".."Z")) OPTIONAL, + real [29] IMPLICIT REAL OPTIONAL, + oid [30] IMPLICIT OBJECT IDENTIFIER OPTIONAL } END diff --git a/tests/119-per-strings-OK.asn1.-Pgen-PER b/tests/119-per-strings-OK.asn1.-Pgen-PER index e94558e3a..3a24fda9d 100644 --- a/tests/119-per-strings-OK.asn1.-Pgen-PER +++ b/tests/119-per-strings-OK.asn1.-Pgen-PER @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include #include #include @@ -43,6 +45,16 @@ typedef struct PDU { UTF8String_t *ut_c /* OPTIONAL */; UTF8String_t *ut_ce /* OPTIONAL */; UTF8String_t *ut_ir /* OPTIONAL */; + BMPString_t *bm /* OPTIONAL */; + BMPString_t *bm_c /* OPTIONAL */; + BMPString_t *bm_cs /* OPTIONAL */; + BMPString_t *bm_ce /* OPTIONAL */; + BMPString_t *bm_ir /* OPTIONAL */; + UniversalString_t *us /* OPTIONAL */; + UniversalString_t *us_c /* OPTIONAL */; + UniversalString_t *us_cs /* OPTIONAL */; + UniversalString_t *us_ce /* OPTIONAL */; + UniversalString_t *us_ir /* OPTIONAL */; REAL_t *real /* OPTIONAL */; OBJECT_IDENTIFIER_t *oid /* OPTIONAL */; @@ -277,6 +289,162 @@ static int check_permitted_alphabet_21(const void *sptr) { return 0; } +static int check_permitted_alphabet_23(const void *sptr) { + /* The underlying type is BMPString */ + const BMPString_t *st = (const BMPString_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + if(st->size % 2) return -1; /* (size%2)! */ + for(; ch < end; ch += 2) { + uint16_t cv = (ch[0] << 8) + | ch[1]; + if(!(cv >= 65 && cv <= 90)) return -1; + } + return 0; +} + +static int check_permitted_alphabet_24(const void *sptr) { + /* The underlying type is BMPString */ + const BMPString_t *st = (const BMPString_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + if(st->size % 2) return -1; /* (size%2)! */ + for(; ch < end; ch += 2) { + uint16_t cv = (ch[0] << 8) + | ch[1]; + if(!(cv <= 65533)) return -1; + } + return 0; +} + +static int check_permitted_alphabet_25(const void *sptr) { + /* The underlying type is BMPString */ + const BMPString_t *st = (const BMPString_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + if(st->size % 2) return -1; /* (size%2)! */ + for(; ch < end; ch += 2) { + uint16_t cv = (ch[0] << 8) + | ch[1]; + if(!(cv >= 65 && cv <= 90)) return -1; + } + return 0; +} + +static int permitted_alphabet_table_26[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* AB */ + 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 5, 0, 0, 0, 0, 0, /* XYZ */ +}; +static int permitted_alphabet_code2value_26[5] = { +65,66,88,89,90,}; + + +static int check_permitted_alphabet_26(const void *sptr) { + int *table = permitted_alphabet_table_26; + /* The underlying type is BMPString */ + const BMPString_t *st = (const BMPString_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + if(st->size % 2) return -1; /* (size%2)! */ + for(; ch < end; ch += 2) { + uint16_t cv = (ch[0] << 8) + | ch[1]; + if(cv > 255) return -1; + if(!table[cv]) return -1; + } + return 0; +} + +static int check_permitted_alphabet_28(const void *sptr) { + /* The underlying type is UniversalString */ + const UniversalString_t *st = (const UniversalString_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + if(st->size % 4) return -1; /* (size%4)! */ + for(; ch < end; ch += 4) { + uint32_t cv = (ch[0] << 24) + | (ch[1] << 16) + | (ch[2] << 8) + | ch[3]; + if(!(cv >= 65 && cv <= 90)) return -1; + } + return 0; +} + +static int check_permitted_alphabet_29(const void *sptr) { + /* The underlying type is UniversalString */ + const UniversalString_t *st = (const UniversalString_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + if(st->size % 4) return -1; /* (size%4)! */ + for(; ch < end; ch += 4) { + uint32_t cv = (ch[0] << 24) + | (ch[1] << 16) + | (ch[2] << 8) + | ch[3]; + if(!(1 /* Constraint matches natural range of cv */)) return -1; + } + return 0; +} + +static int check_permitted_alphabet_30(const void *sptr) { + /* The underlying type is UniversalString */ + const UniversalString_t *st = (const UniversalString_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + if(st->size % 4) return -1; /* (size%4)! */ + for(; ch < end; ch += 4) { + uint32_t cv = (ch[0] << 24) + | (ch[1] << 16) + | (ch[2] << 8) + | ch[3]; + if(!(cv >= 65 && cv <= 90)) return -1; + } + return 0; +} + +static int permitted_alphabet_table_31[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* AB */ + 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 5, 0, 0, 0, 0, 0, /* XYZ */ +}; +static int permitted_alphabet_code2value_31[5] = { +65,66,88,89,90,}; + + +static int check_permitted_alphabet_31(const void *sptr) { + int *table = permitted_alphabet_table_31; + /* The underlying type is UniversalString */ + const UniversalString_t *st = (const UniversalString_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + if(st->size % 4) return -1; /* (size%4)! */ + for(; ch < end; ch += 4) { + uint32_t cv = (ch[0] << 24) + | (ch[1] << 16) + | (ch[2] << 8) + | ch[3]; + if(cv > 255) return -1; + if(!table[cv]) return -1; + } + return 0; +} + /*** <<< CODE [PDU] >>> ***/ @@ -672,6 +840,224 @@ memb_ut_ir_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, } } +static int +memb_bm_c_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BMPString_t *st = (const BMPString_t *)sptr; + + if(!sptr) { + _ASN_CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(!check_permitted_alphabet_23(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_bm_cs_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BMPString_t *st = (const BMPString_t *)sptr; + size_t size; + + if(!sptr) { + _ASN_CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size >> 1; /* 2 byte per character */ + + if((size == 6) + && !check_permitted_alphabet_24(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_bm_ce_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BMPString_t *st = (const BMPString_t *)sptr; + + if(!sptr) { + _ASN_CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(!check_permitted_alphabet_25(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_bm_ir_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BMPString_t *st = (const BMPString_t *)sptr; + + if(!sptr) { + _ASN_CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(!check_permitted_alphabet_26(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int asn_PER_MAP_bm_ir_26_v2c(unsigned int value) { + if(value >= sizeof(permitted_alphabet_table_26)/sizeof(permitted_alphabet_table_26[0])) + return -1; + return permitted_alphabet_table_26[value] - 1; +} +static int asn_PER_MAP_bm_ir_26_c2v(unsigned int code) { + if(code >= sizeof(permitted_alphabet_code2value_26)/sizeof(permitted_alphabet_code2value_26[0])) + return -1; + return permitted_alphabet_code2value_26[code]; +} +static int +memb_us_c_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const UniversalString_t *st = (const UniversalString_t *)sptr; + + if(!sptr) { + _ASN_CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(!check_permitted_alphabet_28(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_us_cs_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const UniversalString_t *st = (const UniversalString_t *)sptr; + size_t size; + + if(!sptr) { + _ASN_CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size >> 2; /* 4 byte per character */ + + if((size == 6) + && !check_permitted_alphabet_29(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_us_ce_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const UniversalString_t *st = (const UniversalString_t *)sptr; + + if(!sptr) { + _ASN_CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(!check_permitted_alphabet_30(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_us_ir_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const UniversalString_t *st = (const UniversalString_t *)sptr; + + if(!sptr) { + _ASN_CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(!check_permitted_alphabet_31(st)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int asn_PER_MAP_us_ir_31_v2c(unsigned int value) { + if(value >= sizeof(permitted_alphabet_table_31)/sizeof(permitted_alphabet_table_31[0])) + return -1; + return permitted_alphabet_table_31[value] - 1; +} +static int asn_PER_MAP_us_ir_31_c2v(unsigned int code) { + if(code >= sizeof(permitted_alphabet_code2value_31)/sizeof(permitted_alphabet_code2value_31[0])) + return -1; + return permitted_alphabet_code2value_31[code]; +} /*** <<< CTDEFS [PDU] >>> ***/ @@ -749,6 +1135,49 @@ static asn_per_constraints_t asn_PER_memb_ut_ir_constr_21 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; +static asn_per_constraints_t asn_PER_memb_bm_c_constr_23 = { + { APC_CONSTRAINED, 5, 5, 65, 90 } /* (65..90) */, + { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 } /* (SIZE(0..MAX)) */, + 0, 0 /* No PER character map necessary */ +}; +static asn_per_constraints_t asn_PER_memb_bm_cs_constr_24 = { + { APC_CONSTRAINED, 16, 16, 0, 65533 } /* (0..65533) */, + { APC_CONSTRAINED, 0, 0, 6, 6 } /* (SIZE(6..6)) */, + 0, 0 /* No PER character map necessary */ +}; +static asn_per_constraints_t asn_PER_memb_bm_ce_constr_25 = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 } /* (SIZE(0..MAX)) */, + 0, 0 /* No PER character map necessary */ +}; +static asn_per_constraints_t asn_PER_memb_bm_ir_constr_26 = { + { APC_CONSTRAINED, 3, 3, 65, 90 } /* (65..90) */, + { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 } /* (SIZE(0..MAX)) */, + asn_PER_MAP_bm_ir_26_v2c, /* Value to PER code map */ + asn_PER_MAP_bm_ir_26_c2v /* PER code to value map */ +}; +static asn_per_constraints_t asn_PER_memb_us_c_constr_28 = { + { APC_CONSTRAINED, 5, 5, 65, 90 } /* (65..90) */, + { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 } /* (SIZE(0..MAX)) */, + 0, 0 /* No PER character map necessary */ +}; +static asn_per_constraints_t asn_PER_memb_us_cs_constr_29 = { + { APC_CONSTRAINED, 32, 32, 0, 2147483647 } /* (0..4294967295) */, + { APC_CONSTRAINED, 0, 0, 6, 6 } /* (SIZE(6..6)) */, + 0, 0 /* No PER character map necessary */ +}; +static asn_per_constraints_t asn_PER_memb_us_ce_constr_30 = { + { APC_CONSTRAINED, 32, 32, 0, 2147483647 } /* special case 1 */ + , + { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 } /* (SIZE(0..MAX)) */, + 0, 0 /* No PER character map necessary */ +}; +static asn_per_constraints_t asn_PER_memb_us_ir_constr_31 = { + { APC_CONSTRAINED, 3, 3, 65, 90 } /* (65..90) */, + { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 } /* (SIZE(0..MAX)) */, + asn_PER_MAP_us_ir_31_v2c, /* Value to PER code map */ + asn_PER_MAP_us_ir_31_c2v /* PER code to value map */ +}; /*** <<< STAT-DEFS [PDU] >>> ***/ @@ -799,7 +1228,7 @@ asn_TYPE_descriptor_t asn_DEF_many_2 = { }; static asn_TYPE_member_t asn_MBR_PDU_1[] = { - { ATF_POINTER, 21, offsetof(struct PDU, many), + { ATF_POINTER, 31, offsetof(struct PDU, many), .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), .tag_mode = 0, .type = &asn_DEF_many_2, @@ -808,7 +1237,7 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .default_value = 0, .name = "many" }, - { ATF_POINTER, 20, offsetof(struct PDU, ia5), + { ATF_POINTER, 30, offsetof(struct PDU, ia5), .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_IA5String, @@ -817,7 +1246,7 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .default_value = 0, .name = "ia5" }, - { ATF_POINTER, 19, offsetof(struct PDU, ia5_c), + { ATF_POINTER, 29, offsetof(struct PDU, ia5_c), .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_IA5String, @@ -826,7 +1255,7 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .default_value = 0, .name = "ia5-c" }, - { ATF_POINTER, 18, offsetof(struct PDU, ia5_ce), + { ATF_POINTER, 28, offsetof(struct PDU, ia5_ce), .tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_IA5String, @@ -835,7 +1264,7 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .default_value = 0, .name = "ia5-ce" }, - { ATF_POINTER, 17, offsetof(struct PDU, ia5_ir), + { ATF_POINTER, 27, offsetof(struct PDU, ia5_ir), .tag = (ASN_TAG_CLASS_CONTEXT | (4 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_IA5String, @@ -844,7 +1273,7 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .default_value = 0, .name = "ia5-ir" }, - { ATF_POINTER, 16, offsetof(struct PDU, vs), + { ATF_POINTER, 26, offsetof(struct PDU, vs), .tag = (ASN_TAG_CLASS_CONTEXT | (5 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_VisibleString, @@ -853,7 +1282,7 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .default_value = 0, .name = "vs" }, - { ATF_POINTER, 15, offsetof(struct PDU, vs_c), + { ATF_POINTER, 25, offsetof(struct PDU, vs_c), .tag = (ASN_TAG_CLASS_CONTEXT | (6 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_VisibleString, @@ -862,7 +1291,7 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .default_value = 0, .name = "vs-c" }, - { ATF_POINTER, 14, offsetof(struct PDU, vs_ce), + { ATF_POINTER, 24, offsetof(struct PDU, vs_ce), .tag = (ASN_TAG_CLASS_CONTEXT | (7 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_VisibleString, @@ -871,7 +1300,7 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .default_value = 0, .name = "vs-ce" }, - { ATF_POINTER, 13, offsetof(struct PDU, vs_ir), + { ATF_POINTER, 23, offsetof(struct PDU, vs_ir), .tag = (ASN_TAG_CLASS_CONTEXT | (8 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_VisibleString, @@ -880,7 +1309,7 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .default_value = 0, .name = "vs-ir" }, - { ATF_POINTER, 12, offsetof(struct PDU, pr), + { ATF_POINTER, 22, offsetof(struct PDU, pr), .tag = (ASN_TAG_CLASS_CONTEXT | (9 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_PrintableString, @@ -889,7 +1318,7 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .default_value = 0, .name = "pr" }, - { ATF_POINTER, 11, offsetof(struct PDU, pr_c), + { ATF_POINTER, 21, offsetof(struct PDU, pr_c), .tag = (ASN_TAG_CLASS_CONTEXT | (10 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_PrintableString, @@ -898,7 +1327,7 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .default_value = 0, .name = "pr-c" }, - { ATF_POINTER, 10, offsetof(struct PDU, pr_ir), + { ATF_POINTER, 20, offsetof(struct PDU, pr_ir), .tag = (ASN_TAG_CLASS_CONTEXT | (11 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_PrintableString, @@ -907,7 +1336,7 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .default_value = 0, .name = "pr-ir" }, - { ATF_POINTER, 9, offsetof(struct PDU, ns), + { ATF_POINTER, 19, offsetof(struct PDU, ns), .tag = (ASN_TAG_CLASS_CONTEXT | (12 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_NumericString, @@ -916,7 +1345,7 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .default_value = 0, .name = "ns" }, - { ATF_POINTER, 8, offsetof(struct PDU, ns_c), + { ATF_POINTER, 18, offsetof(struct PDU, ns_c), .tag = (ASN_TAG_CLASS_CONTEXT | (13 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_NumericString, @@ -925,7 +1354,7 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .default_value = 0, .name = "ns-c" }, - { ATF_POINTER, 7, offsetof(struct PDU, ns_ce), + { ATF_POINTER, 17, offsetof(struct PDU, ns_ce), .tag = (ASN_TAG_CLASS_CONTEXT | (14 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_NumericString, @@ -934,7 +1363,7 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .default_value = 0, .name = "ns-ce" }, - { ATF_POINTER, 6, offsetof(struct PDU, ns_ir), + { ATF_POINTER, 16, offsetof(struct PDU, ns_ir), .tag = (ASN_TAG_CLASS_CONTEXT | (15 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_NumericString, @@ -943,7 +1372,7 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .default_value = 0, .name = "ns-ir" }, - { ATF_POINTER, 5, offsetof(struct PDU, ut_c), + { ATF_POINTER, 15, offsetof(struct PDU, ut_c), .tag = (ASN_TAG_CLASS_CONTEXT | (16 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_UTF8String, @@ -952,7 +1381,7 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .default_value = 0, .name = "ut-c" }, - { ATF_POINTER, 4, offsetof(struct PDU, ut_ce), + { ATF_POINTER, 14, offsetof(struct PDU, ut_ce), .tag = (ASN_TAG_CLASS_CONTEXT | (17 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_UTF8String, @@ -961,7 +1390,7 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .default_value = 0, .name = "ut-ce" }, - { ATF_POINTER, 3, offsetof(struct PDU, ut_ir), + { ATF_POINTER, 13, offsetof(struct PDU, ut_ir), .tag = (ASN_TAG_CLASS_CONTEXT | (18 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_UTF8String, @@ -970,9 +1399,99 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .default_value = 0, .name = "ut-ir" }, - { ATF_POINTER, 2, offsetof(struct PDU, real), + { ATF_POINTER, 12, offsetof(struct PDU, bm), .tag = (ASN_TAG_CLASS_CONTEXT | (19 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_BMPString, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* No PER visible constraints */ + .default_value = 0, + .name = "bm" + }, + { ATF_POINTER, 11, offsetof(struct PDU, bm_c), + .tag = (ASN_TAG_CLASS_CONTEXT | (20 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_BMPString, + .memb_constraints = memb_bm_c_constraint_1, + .per_constraints = &asn_PER_memb_bm_c_constr_23, + .default_value = 0, + .name = "bm-c" + }, + { ATF_POINTER, 10, offsetof(struct PDU, bm_cs), + .tag = (ASN_TAG_CLASS_CONTEXT | (21 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_BMPString, + .memb_constraints = memb_bm_cs_constraint_1, + .per_constraints = &asn_PER_memb_bm_cs_constr_24, + .default_value = 0, + .name = "bm-cs" + }, + { ATF_POINTER, 9, offsetof(struct PDU, bm_ce), + .tag = (ASN_TAG_CLASS_CONTEXT | (22 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_BMPString, + .memb_constraints = memb_bm_ce_constraint_1, + .per_constraints = &asn_PER_memb_bm_ce_constr_25, + .default_value = 0, + .name = "bm-ce" + }, + { ATF_POINTER, 8, offsetof(struct PDU, bm_ir), + .tag = (ASN_TAG_CLASS_CONTEXT | (23 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_BMPString, + .memb_constraints = memb_bm_ir_constraint_1, + .per_constraints = &asn_PER_memb_bm_ir_constr_26, + .default_value = 0, + .name = "bm-ir" + }, + { ATF_POINTER, 7, offsetof(struct PDU, us), + .tag = (ASN_TAG_CLASS_CONTEXT | (24 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_UniversalString, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* No PER visible constraints */ + .default_value = 0, + .name = "us" + }, + { ATF_POINTER, 6, offsetof(struct PDU, us_c), + .tag = (ASN_TAG_CLASS_CONTEXT | (25 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_UniversalString, + .memb_constraints = memb_us_c_constraint_1, + .per_constraints = &asn_PER_memb_us_c_constr_28, + .default_value = 0, + .name = "us-c" + }, + { ATF_POINTER, 5, offsetof(struct PDU, us_cs), + .tag = (ASN_TAG_CLASS_CONTEXT | (26 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_UniversalString, + .memb_constraints = memb_us_cs_constraint_1, + .per_constraints = &asn_PER_memb_us_cs_constr_29, + .default_value = 0, + .name = "us-cs" + }, + { ATF_POINTER, 4, offsetof(struct PDU, us_ce), + .tag = (ASN_TAG_CLASS_CONTEXT | (27 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_UniversalString, + .memb_constraints = memb_us_ce_constraint_1, + .per_constraints = &asn_PER_memb_us_ce_constr_30, + .default_value = 0, + .name = "us-ce" + }, + { ATF_POINTER, 3, offsetof(struct PDU, us_ir), + .tag = (ASN_TAG_CLASS_CONTEXT | (28 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_UniversalString, + .memb_constraints = memb_us_ir_constraint_1, + .per_constraints = &asn_PER_memb_us_ir_constr_31, + .default_value = 0, + .name = "us-ir" + }, + { ATF_POINTER, 2, offsetof(struct PDU, real), + .tag = (ASN_TAG_CLASS_CONTEXT | (29 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_REAL, .memb_constraints = 0, /* Defer constraints checking to the member type */ .per_constraints = 0, /* No PER visible constraints */ @@ -980,7 +1499,7 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .name = "real" }, { ATF_POINTER, 1, offsetof(struct PDU, oid), - .tag = (ASN_TAG_CLASS_CONTEXT | (20 << 2)), + .tag = (ASN_TAG_CLASS_CONTEXT | (30 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_OBJECT_IDENTIFIER, .memb_constraints = 0, /* Defer constraints checking to the member type */ @@ -989,7 +1508,7 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .name = "oid" }, }; -static int asn_MAP_PDU_oms_1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; +static int asn_MAP_PDU_oms_1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 }; static ber_tlv_tag_t asn_DEF_PDU_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; @@ -1013,16 +1532,26 @@ static asn_TYPE_tag2member_t asn_MAP_PDU_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (16 << 2)), 16, 0, 0 }, /* ut-c at 31 */ { (ASN_TAG_CLASS_CONTEXT | (17 << 2)), 17, 0, 0 }, /* ut-ce at 32 */ { (ASN_TAG_CLASS_CONTEXT | (18 << 2)), 18, 0, 0 }, /* ut-ir at 33 */ - { (ASN_TAG_CLASS_CONTEXT | (19 << 2)), 19, 0, 0 }, /* real at 34 */ - { (ASN_TAG_CLASS_CONTEXT | (20 << 2)), 20, 0, 0 } /* oid at 35 */ + { (ASN_TAG_CLASS_CONTEXT | (19 << 2)), 19, 0, 0 }, /* bm at 34 */ + { (ASN_TAG_CLASS_CONTEXT | (20 << 2)), 20, 0, 0 }, /* bm-c at 35 */ + { (ASN_TAG_CLASS_CONTEXT | (21 << 2)), 21, 0, 0 }, /* bm-cs at 36 */ + { (ASN_TAG_CLASS_CONTEXT | (22 << 2)), 22, 0, 0 }, /* bm-ce at 37 */ + { (ASN_TAG_CLASS_CONTEXT | (23 << 2)), 23, 0, 0 }, /* bm-ir at 38 */ + { (ASN_TAG_CLASS_CONTEXT | (24 << 2)), 24, 0, 0 }, /* us at 39 */ + { (ASN_TAG_CLASS_CONTEXT | (25 << 2)), 25, 0, 0 }, /* us-c at 40 */ + { (ASN_TAG_CLASS_CONTEXT | (26 << 2)), 26, 0, 0 }, /* us-cs at 41 */ + { (ASN_TAG_CLASS_CONTEXT | (27 << 2)), 27, 0, 0 }, /* us-ce at 42 */ + { (ASN_TAG_CLASS_CONTEXT | (28 << 2)), 28, 0, 0 }, /* us-ir at 43 */ + { (ASN_TAG_CLASS_CONTEXT | (29 << 2)), 29, 0, 0 }, /* real at 44 */ + { (ASN_TAG_CLASS_CONTEXT | (30 << 2)), 30, 0, 0 } /* oid at 45 */ }; static asn_SEQUENCE_specifics_t asn_SPC_PDU_specs_1 = { sizeof(struct PDU), offsetof(struct PDU, _asn_ctx), asn_MAP_PDU_tag2el_1, - 21, /* Count of tags in the map */ + 31, /* Count of tags in the map */ asn_MAP_PDU_oms_1, /* Optional members */ - 21, 0, /* Root/Additions */ + 31, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; @@ -1047,7 +1576,7 @@ asn_TYPE_descriptor_t asn_DEF_PDU = { /sizeof(asn_DEF_PDU_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_PDU_1, - 21, /* Elements count */ + 31, /* Elements count */ &asn_SPC_PDU_specs_1 /* Additional specs */ }; From 9354a11c451e69d744da0881444ec9082cb239b3 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 24 Nov 2006 11:26:56 +0000 Subject: [PATCH 1272/1469] new test git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1272 59561ff5-6e30-0410-9f3c-9617f08c8826 --- .../sample-DL-CCCH-Message-2.per | Bin 0 -> 107 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/sample.source.RRC/sample-DL-CCCH-Message-2.per diff --git a/examples/sample.source.RRC/sample-DL-CCCH-Message-2.per b/examples/sample.source.RRC/sample-DL-CCCH-Message-2.per new file mode 100644 index 0000000000000000000000000000000000000000..ac8e881b4414e8206409f3a5432f560b3f238916 GIT binary patch literal 107 zcmV-x0F?hQ_a;M~J)%eu-Ap(!>XgZY14+~3g!t+(02Et&9m5gq^$a^*Sv NfKZ_f5Q2gj6gZgkF3SJ_ literal 0 HcmV?d00001 From db1b77ce05cc4f1d177204f14b6e550526625a9f Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 24 Nov 2006 11:27:37 +0000 Subject: [PATCH 1273/1469] PER support for BMPString and UniversalString git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1273 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 96f13e6ad..58647a21a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,12 +1,12 @@ -0.9.22: 2006-Oct-20 +0.9.22: 2006-Nov-24 * Added -pdu=all and -pdu= switches to asn1c. * Added PER support for most known-multiplier string types: - IA5String, VisibleString, PrintableString; + IA5String, VisibleString, PrintableString, BMPString, UniversalString; useful types: GeneralizedTime, UTCTime, ObjectDescriptor; as well as REAL and OBJECT IDENTIFIER. - TODO: SET, UniversalString and BMPString. + TODO: SET type. * Multiple enhancements by Daniele Varrazzo * Fixed explicit tagging of an in-lined constructed type. (Severity: low; Security impact: none). From 0a885a65657689f0a7181d5250dc83a2ebd5e2b8 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 27 Nov 2006 13:31:35 +0000 Subject: [PATCH 1274/1469] ntohl streamlined git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1274 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_system.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/skeletons/asn_system.h b/skeletons/asn_system.h index f920efc99..b1e0212ec 100644 --- a/skeletons/asn_system.h +++ b/skeletons/asn_system.h @@ -27,9 +27,9 @@ #define vsnprintf _vsnprintf /* To avoid linking with ws2_32.lib, here's the definition of ntohl() */ -#define sys_ntohl(l) ((((l) << 24) & 0xff000000) - | (((l) << 16) & 0xff0000) - | (((l) << 8) & 0xff00) +#define sys_ntohl(l) ((((l) << 24) & 0xff000000) \ + | (((l) << 16) & 0xff0000) \ + | (((l) << 8) & 0xff00) \ | ((l) & 0xff)) #ifdef _MSC_VER /* MSVS.Net */ From 1b91c61be83c97cb3d77a8274a3369584b29ced2 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 6 Dec 2006 08:39:47 +0000 Subject: [PATCH 1275/1469] do not account negatives git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1275 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_internal.h | 1 + 1 file changed, 1 insertion(+) diff --git a/skeletons/asn_internal.h b/skeletons/asn_internal.h index 67f055a62..ff6327786 100644 --- a/skeletons/asn_internal.h +++ b/skeletons/asn_internal.h @@ -70,6 +70,7 @@ static inline void ASN_DEBUG(const char *fmt, ...) { (void)fmt; } int __nl = ((nl) != 0); \ int __i; \ if(__nl) _ASN_CALLBACK("\n", 1); \ + if(__level < 0) __level = 0; \ for(__i = 0; __i < __level; __i++) \ _ASN_CALLBACK(" ", 4); \ er.encoded += __nl + 4 * __level; \ From 206313dde8325e008644da931ce63f4339799da8 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 21 Feb 2007 19:27:45 +0000 Subject: [PATCH 1276/1469] bits unused constraint failure git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1276 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/BIT_STRING.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index 8acea86c9..9b9827127 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -50,7 +50,8 @@ BIT_STRING_constraint(asn_TYPE_descriptor_t *td, const void *sptr, const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; if(st && st->buf) { - if(st->size == 1 && st->bits_unused) { + if((st->size == 0 && st->bits_unused) + || st->bits_unused < 0 || st->bits_unused > 7) { _ASN_CTFAIL(app_key, td, sptr, "%s: invalid padding byte (%s:%d)", td->name, __FILE__, __LINE__); From a325c8b17d45c2b42f0c995590bda4b3bbf479ab Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 23 Feb 2007 19:30:10 +0000 Subject: [PATCH 1277/1469] freeing properly git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1277 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SET_OF.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index e6ba98547..11eac57a2 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -808,16 +808,16 @@ SET_OF_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { asn_set_empty(list); /* Remove (list->array) */ - if(!contents_only) { - FREEMEM(ptr); - } - specs = (asn_SET_OF_specifics_t *)td->specifics; ctx = (asn_struct_ctx_t *)((char *)ptr + specs->ctx_offset); if(ctx->ptr) { ASN_STRUCT_FREE(*elm->type, ctx->ptr); ctx->ptr = 0; } + + if(!contents_only) { + FREEMEM(ptr); + } } } From b1287d2ffa4efba61777b5e4fb959be9037b7bd9 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 14 May 2007 14:58:21 +0000 Subject: [PATCH 1278/1469] rehashed attributes instead of using .cvsignore git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1278 59561ff5-6e30-0410-9f3c-9617f08c8826 From f4b08fd8b756ece940cf367ca01c10cefa548b23 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 15 May 2007 10:04:48 +0000 Subject: [PATCH 1279/1469] fixed broken data due to svn import git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1279 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/data-62/data-62-08-L.ber | Bin 15 -> 15 bytes asn1c/tests/data-62/data-62-18-B.ber | Bin 14 -> 14 bytes asn1c/tests/data-62/data-62-22.ber | Bin 15 -> 15 bytes asn1c/tests/data-62/data-62-23-B.ber | Bin 15 -> 15 bytes asn1c/tests/data-62/data-62-30-L.ber | Bin 29 -> 29 bytes asn1c/tests/data-70/data-70-28.in | 6 +++--- asn1c/tests/data-70/data-70-33.in | 4 +--- asn1c/tests/data-70/data-70-47.in | 6 +++--- 8 files changed, 7 insertions(+), 9 deletions(-) diff --git a/asn1c/tests/data-62/data-62-08-L.ber b/asn1c/tests/data-62/data-62-08-L.ber index d127e0882d89aaac98aa70965cf46e286d7b763f..f20de4509707700d28194e826c54bcfa5612e121 100644 GIT binary patch literal 15 WcmXruWnyGq$R^BEl3HBC$^ZZp2?EIg literal 15 WcmXruVq#=n$R^BEl3HBC$^ZZo-vY(} diff --git a/asn1c/tests/data-62/data-62-18-B.ber b/asn1c/tests/data-62/data-62-18-B.ber index 8200bcaf8ec907902dc026040a4f41308337f14c..7e10c513e3bfa0408f36c02300f6ad3b97606f74 100644 GIT binary patch literal 14 VcmXruUC8~gL71f^wYY?V0RSO01R?+c literal 14 VcmXruTFCvdL71f^wYY?V0RSNk1RnqZ diff --git a/asn1c/tests/data-62/data-62-22.ber b/asn1c/tests/data-62/data-62-22.ber index 93111e9f4528787ae78c17a8948f418bb760eda3..a9a984d690b3d60b6158af59043f792be011c4df 100644 GIT binary patch literal 15 WcmXruUC8~gVShEtb|zK^1_l5s1O!I_ literal 15 WcmXruTFCvdVShEtb|zK^1_l5r+5|)Z diff --git a/asn1c/tests/data-62/data-62-23-B.ber b/asn1c/tests/data-62/data-62-23-B.ber index a1f5af9b8bed55a1ec496e1662b807fd6ff39902..1b9067128137e9c3c06794a742d27d92c95de244 100644 GIT binary patch literal 15 WcmXruUC8~gVShF2b|zK^1_l5s3j|02 literal 15 WcmXruTFCvdVShF2b|zK^1_l5r;RHnh diff --git a/asn1c/tests/data-62/data-62-30-L.ber b/asn1c/tests/data-62/data-62-30-L.ber index b80bed39978ef2e0827bac4057e0695b8438d0ed..d7f43ae66ac461507c3bddc5de711302e9b279ad 100644 GIT binary patch literal 29 kcmdnc(7 - - - + + + diff --git a/asn1c/tests/data-70/data-70-33.in b/asn1c/tests/data-70/data-70-33.in index ad59cdf1c..1ba85a9df 100644 --- a/asn1c/tests/data-70/data-70-33.in +++ b/asn1c/tests/data-70/data-70-33.in @@ -1,7 +1,5 @@ - - - + diff --git a/asn1c/tests/data-70/data-70-47.in b/asn1c/tests/data-70/data-70-47.in index 5a5725619..c0a8981c5 100644 --- a/asn1c/tests/data-70/data-70-47.in +++ b/asn1c/tests/data-70/data-70-47.in @@ -1,6 +1,6 @@ - - - + + + From d4e35387e8e6279f10ed5691785c9415fe0d2c69 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 23 May 2007 10:15:39 +0000 Subject: [PATCH 1280/1469] further svnization git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1285 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/Makefile.am | 2 +- asn1c/tests/Makefile.in | 2 +- examples/Makefile.am | 2 +- examples/Makefile.in | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/asn1c/tests/Makefile.am b/asn1c/tests/Makefile.am index 85b0856ca..3d89ed264 100644 --- a/asn1c/tests/Makefile.am +++ b/asn1c/tests/Makefile.am @@ -15,7 +15,7 @@ EXTRA_DIST = \ data-119 dist-hook: - rm -rf `find $(distdir) -name CVS -or -name .cvsignore` + rm -rf `find $(distdir) -name .svn` clean: rm -rf test-* diff --git a/asn1c/tests/Makefile.in b/asn1c/tests/Makefile.in index c264d27d3..235bddded 100644 --- a/asn1c/tests/Makefile.in +++ b/asn1c/tests/Makefile.in @@ -406,7 +406,7 @@ uninstall-am: uninstall-info-am dist-hook: - rm -rf `find $(distdir) -name CVS -or -name .cvsignore` + rm -rf `find $(distdir) -name .svn` clean: rm -rf test-* diff --git a/examples/Makefile.am b/examples/Makefile.am index 74783506b..a78996d73 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -35,7 +35,7 @@ EXTRA_DIST = $(srcdir)/rfc*.txt \ $(srcdir)/sample.makefile.regen dist-hook: - rm -rf `find $(distdir) -name CVS -or -name .cvsignore` + rm -rf `find $(distdir) -name .svn` rm -rf `find $(distdir) -name "*.core" -or -name ".tmp.*"` rm -rf `find $(distdir) -name "*.[ch].??????"` diff --git a/examples/Makefile.in b/examples/Makefile.in index 828085174..274218995 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -387,7 +387,7 @@ $(ASN1_FILES_3): crfc2asn1.pl $(ASN1_SOURCE_3) ./crfc2asn1.pl $(ASN1_SOURCE_3) dist-hook: - rm -rf `find $(distdir) -name CVS -or -name .cvsignore` + rm -rf `find $(distdir) -name .svn` rm -rf `find $(distdir) -name "*.core" -or -name ".tmp.*"` rm -rf `find $(distdir) -name "*.[ch].??????"` From b8bdf5f60a7b6208a5837c733a3437065d15339e Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 30 May 2007 17:42:00 +0000 Subject: [PATCH 1281/1469] some helpful hint git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1289 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/ber_decoder.h | 1 + skeletons/der_encoder.h | 1 + 2 files changed, 2 insertions(+) diff --git a/skeletons/ber_decoder.h b/skeletons/ber_decoder.h index 768133b67..9fe2e895d 100644 --- a/skeletons/ber_decoder.h +++ b/skeletons/ber_decoder.h @@ -17,6 +17,7 @@ struct asn_codec_ctx_s; /* Forward declaration */ /* * The BER decoder of any type. * This function may be invoked directly from the application. + * The der_encode() function (der_encoder.h) is an opposite to ber_decode(). */ asn_dec_rval_t ber_decode(struct asn_codec_ctx_s *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, diff --git a/skeletons/der_encoder.h b/skeletons/der_encoder.h index 4e2fb06c2..61431c6db 100644 --- a/skeletons/der_encoder.h +++ b/skeletons/der_encoder.h @@ -15,6 +15,7 @@ struct asn_TYPE_descriptor_s; /* Forward declaration */ /* * The DER encoder of any type. May be invoked by the application. + * The ber_decode() function (ber_decoder.h) is an opposite of der_encode(). */ asn_enc_rval_t der_encode(struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ From cf67741ff0534fd7ca2dfd292106665117fa2bec Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 5 Jun 2007 08:07:39 +0000 Subject: [PATCH 1282/1469] a file for testing TAP3-11 decoding git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1290 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.TAP3/Makefile | 2 +- .../sample-DataInterChange-1.ber | Bin 0 -> 372 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 examples/sample.source.TAP3/sample-DataInterChange-1.ber diff --git a/examples/sample.source.TAP3/Makefile b/examples/sample.source.TAP3/Makefile index b00a114c3..ac783655e 100644 --- a/examples/sample.source.TAP3/Makefile +++ b/examples/sample.source.TAP3/Makefile @@ -700,7 +700,7 @@ clean: regen: regenerate-from-asn1-source regenerate-from-asn1-source: - ../../asn1c/asn1c -S ../../skeletons -pdu=DataInterChange ../tap3.asn1 + asn1c -pdu=DataInterChange ../tap3.asn1 DataInterChange.c: ../sample.makefile.regen ../tap3.asn1 diff --git a/examples/sample.source.TAP3/sample-DataInterChange-1.ber b/examples/sample.source.TAP3/sample-DataInterChange-1.ber new file mode 100644 index 0000000000000000000000000000000000000000..a47ce5cb11958875377a059f1015b4831812c6e9 GIT binary patch literal 372 zcmYdnVk}6hjBj*d4R;N4bBS*>V~z0f_HvESWi>W5H!!cykqqE7GB7YTFacsq15*?8 z_{MZrZ3CcKePc2n$!y$m@r|C0%<+x3j9jUT@r~@vuAxEo0Yddz{PCHLjPZ@~jI8k) z%#250$2XQRGN-xLH)aXdH)it1H)epO;kMgo*EgDT#Wz}jM6DPZVLUMyj~gh*#Lx%g zvLyRuDb+VhGSoM6N!2&X0M&rB=`wqjPl<2jVB*~vZ_OmbheOT!1z Date: Sat, 23 Jun 2007 17:02:00 +0000 Subject: [PATCH 1283/1469] REAL fixed; verify constraints as well git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1291 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/REAL.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/skeletons/REAL.c b/skeletons/REAL.c index df5b9b36d..5e93ac8ac 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -453,16 +453,16 @@ asn_REAL2double(const REAL_t *st, double *dbl_value) { return -1; } - if((octv & 0x03) == 0x11) { - /* 8.5.6.4, case d) */ + elen = (octv & 0x03); /* bits 2 to 1; 8.5.6.4 */ + if(elen == 0x03) { /* bits 2 to 1 = 11; 8.5.6.4, case d) */ elen = st->buf[1]; /* unsigned binary number */ if(elen == 0 || st->size <= (int)(2 + elen)) { errno = EINVAL; return -1; } + /* FIXME: verify constraints of case d) */ ptr = &st->buf[2]; } else { - elen = (octv & 0x03); ptr = &st->buf[1]; } From 33b87bd08579c5b5d22629e5b5bdebe33638d8ee Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Jun 2007 17:35:56 +0000 Subject: [PATCH 1284/1469] some fixes git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1292 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_internal.h | 5 +++-- libasn1fix/asn1fix_param.c | 4 +++- skeletons/constr_SEQUENCE.c | 4 ++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/libasn1compiler/asn1c_internal.h b/libasn1compiler/asn1c_internal.h index c37620cda..fb8cc1e29 100644 --- a/libasn1compiler/asn1c_internal.h +++ b/libasn1compiler/asn1c_internal.h @@ -24,15 +24,16 @@ #ifdef WIN32 #include +#include +#include #define open _open #define close _close -#define alloca _alloca #define snprintf _snprintf #define vsnprintf _vsnprintf #else -#include /* for open(2) */ #include /* for glob(3) */ #endif +#include /* for open(2) */ #ifdef HAVE_SYS_PARAM_H #include /* For MAXPATHLEN */ diff --git a/libasn1fix/asn1fix_param.c b/libasn1fix/asn1fix_param.c index 6b3a62940..f8e3a2e73 100644 --- a/libasn1fix/asn1fix_param.c +++ b/libasn1fix/asn1fix_param.c @@ -50,8 +50,9 @@ asn1f_parameterization_fork(arg_t *arg, asn1p_expr_t *expr, asn1p_expr_t *rhs_ps rarg.lhs_params = expr->lhs_params; rarg.rhs_pspecs = rhs_pspecs; exc = asn1p_expr_clone_with_resolver(expr, resolve_expr, &rarg); + if(!exc) return NULL; rpc = asn1p_expr_clone(rhs_pspecs, 0); - assert(exc && rpc); + assert(rpc); /* * Create a new specialization. @@ -137,6 +138,7 @@ resolve_expr(asn1p_expr_t *expr_to_resolve, void *resolver_arg) { expr->Identifier, expr->meta_type, expr->expr_type); if(expr->meta_type == AMT_TYPE || expr->meta_type == AMT_VALUE + || expr->meta_type == AMT_TYPEREF || expr->meta_type == AMT_VALUESET) { DEBUG("Target is a simple type %s", ASN_EXPR_TYPE2STR(expr->expr_type)); diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 5b57342c0..2b0ac3def 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -1078,7 +1078,7 @@ SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, * Get the sequence ROOT elements. */ for(edx = 0; edx < ((specs->ext_before < 0) - ? td->elements_count : specs->ext_before + 1); edx++) { + ? td->elements_count : specs->ext_before - 1); edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ @@ -1219,7 +1219,7 @@ SEQUENCE_encode_uper(asn_TYPE_descriptor_t *td, * Get the sequence ROOT elements. */ for(edx = 0; edx < ((specs->ext_before < 0) - ? td->elements_count : specs->ext_before + 1); edx++) { + ? td->elements_count : specs->ext_before - 1); edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ From b686d8c9399f2ead22a09eabe3fe6053e226eabd Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Jun 2007 18:33:31 +0000 Subject: [PATCH 1285/1469] copyright year git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1293 59561ff5-6e30-0410-9f3c-9617f08c8826 --- COPYING | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/COPYING b/COPYING index 6657cdb72..7740d28c2 100644 --- a/COPYING +++ b/COPYING @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2003, 2004, 2005, 2006 Lev Walkin + * Copyright (c) 2003, 2004, 2005, 2006, 2007 Lev Walkin * All rights reserved. * * Redistribution and use in source and binary forms, with or without From 1b5bd9fe093a64178409abe801baccc5ce0151ee Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Jun 2007 18:33:41 +0000 Subject: [PATCH 1286/1469] not needed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1294 59561ff5-6e30-0410-9f3c-9617f08c8826 --- NEWS | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 NEWS diff --git a/NEWS b/NEWS deleted file mode 100644 index e69de29bb..000000000 From 06cf6a525a7e61cac2afec49cceb7caf99c2b1b6 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Jun 2007 18:41:51 +0000 Subject: [PATCH 1287/1469] slightly updated mode of operation git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1295 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-119.-fnative-types.-gen-PER.c | 6 +++--- asn1c/tests/check-119.-gen-PER.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/asn1c/tests/check-119.-fnative-types.-gen-PER.c b/asn1c/tests/check-119.-fnative-types.-gen-PER.c index 969ee6449..421459d2a 100644 --- a/asn1c/tests/check-119.-fnative-types.-gen-PER.c +++ b/asn1c/tests/check-119.-fnative-types.-gen-PER.c @@ -1,8 +1,8 @@ /* * Mode of operation: - * Each of the *.in files is XER-decoded, then converted into DER, - * then decoded from DER and encoded into XER again. The resulting - * stream is compared with the corresponding .out file. + * Each of the *.in files is XER-decoded, then converted into PER, + * then decoded back from PER, then encoded into XER again, + * and finally compared to the original encoding. */ #undef NDEBUG #include diff --git a/asn1c/tests/check-119.-gen-PER.c b/asn1c/tests/check-119.-gen-PER.c index 969ee6449..421459d2a 100644 --- a/asn1c/tests/check-119.-gen-PER.c +++ b/asn1c/tests/check-119.-gen-PER.c @@ -1,8 +1,8 @@ /* * Mode of operation: - * Each of the *.in files is XER-decoded, then converted into DER, - * then decoded from DER and encoded into XER again. The resulting - * stream is compared with the corresponding .out file. + * Each of the *.in files is XER-decoded, then converted into PER, + * then decoded back from PER, then encoded into XER again, + * and finally compared to the original encoding. */ #undef NDEBUG #include From ec88ee417bf09ffb73fb316336a5d2d9a8b3e53a Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Jun 2007 19:37:28 +0000 Subject: [PATCH 1288/1469] newer env version git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1296 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_internal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/asn_internal.h b/skeletons/asn_internal.h index ff6327786..3f99452f4 100644 --- a/skeletons/asn_internal.h +++ b/skeletons/asn_internal.h @@ -20,7 +20,7 @@ extern "C" { #endif /* Environment version might be used to avoid running with the old library */ -#define ASN1C_ENVIRONMENT_VERSION 920 /* Compile-time version */ +#define ASN1C_ENVIRONMENT_VERSION 922 /* Compile-time version */ int get_asn1c_environment_version(void); /* Run-time version */ #define CALLOC(nmemb, size) calloc(nmemb, size) From 237e4efa19aa68f55dab0898decbdb669e7dc909 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Jun 2007 20:05:49 +0000 Subject: [PATCH 1289/1469] extensibility fix git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1297 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 489483901..d8aa01fbb 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -309,8 +309,8 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *v; int elements; /* Number of elements */ - int ext_start = -1; - int ext_stop = -1; + int ext_start = -2; + int ext_stop = -2; tag2el_t *tag2el = NULL; int tag2el_count = 0; int tags_count; @@ -446,9 +446,9 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { OUT("0, 0, 0,\t/* Optional elements (not needed) */\n"); } OUT("%d,\t/* Start extensions */\n", - ext_start); + ext_start<0 ? -1 : ext_start); OUT("%d\t/* Stop extensions */\n", - (ext_stop Date: Sat, 23 Jun 2007 20:06:04 +0000 Subject: [PATCH 1290/1469] extensibility fix, at least git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1298 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/126-per-extensions-OK.asn1 | 20 +++++ tests/126-per-extensions-OK.asn1.-Pgen-PER | 89 ++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 tests/126-per-extensions-OK.asn1 create mode 100644 tests/126-per-extensions-OK.asn1.-Pgen-PER diff --git a/tests/126-per-extensions-OK.asn1 b/tests/126-per-extensions-OK.asn1 new file mode 100644 index 000000000..c4729d326 --- /dev/null +++ b/tests/126-per-extensions-OK.asn1 @@ -0,0 +1,20 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .126 + +ModulePERExtensions + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 126 } + DEFINITIONS AUTOMATIC TAGS ::= +BEGIN + + PDU ::= SEQUENCE { + ..., + str-o IA5String OPTIONAL, + str-m IA5String + } + +END diff --git a/tests/126-per-extensions-OK.asn1.-Pgen-PER b/tests/126-per-extensions-OK.asn1.-Pgen-PER new file mode 100644 index 000000000..8517c0235 --- /dev/null +++ b/tests/126-per-extensions-OK.asn1.-Pgen-PER @@ -0,0 +1,89 @@ + +/*** <<< INCLUDES [PDU] >>> ***/ + +#include +#include + +/*** <<< TYPE-DECLS [PDU] >>> ***/ + +typedef struct PDU { + /* + * This type is extensible, + * possible extensions are below. + */ + IA5String_t *str_o /* OPTIONAL */; + IA5String_t *str_m; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} PDU_t; + +/*** <<< FUNC-DECLS [PDU] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_PDU; + +/*** <<< STAT-DEFS [PDU] >>> ***/ + +static asn_TYPE_member_t asn_MBR_PDU_1[] = { + { ATF_POINTER, 2, offsetof(struct PDU, str_o), + .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_IA5String, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* No PER visible constraints */ + .default_value = 0, + .name = "str-o" + }, + { ATF_POINTER, 1, offsetof(struct PDU, str_m), + .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_IA5String, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* No PER visible constraints */ + .default_value = 0, + .name = "str-m" + }, +}; +static int asn_MAP_PDU_oms_1[] = { 0, 1 }; +static ber_tlv_tag_t asn_DEF_PDU_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_TYPE_tag2member_t asn_MAP_PDU_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* str-o at 16 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* str-m at 17 */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_PDU_specs_1 = { + sizeof(struct PDU), + offsetof(struct PDU, _asn_ctx), + asn_MAP_PDU_tag2el_1, + 2, /* Count of tags in the map */ + asn_MAP_PDU_oms_1, /* Optional members */ + 0, 2, /* Root/Additions */ + -1, /* Start extensions */ + 3 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_PDU = { + "PDU", + "PDU", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + SEQUENCE_decode_uper, + SEQUENCE_encode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_PDU_tags_1, + sizeof(asn_DEF_PDU_tags_1) + /sizeof(asn_DEF_PDU_tags_1[0]), /* 1 */ + asn_DEF_PDU_tags_1, /* Same as above */ + sizeof(asn_DEF_PDU_tags_1) + /sizeof(asn_DEF_PDU_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_PDU_1, + 2, /* Elements count */ + &asn_SPC_PDU_specs_1 /* Additional specs */ +}; + From 9cb44403fddfdc31bf9d7f09751e6cce2217584d Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Jun 2007 20:07:04 +0000 Subject: [PATCH 1291/1469] bit of description change git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1299 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c.spec.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asn1c.spec.in b/asn1c.spec.in index c4050e9a8..8a1d08fa2 100644 --- a/asn1c.spec.in +++ b/asn1c.spec.in @@ -46,7 +46,7 @@ rm -rf $RPM_BUILD_ROOT %changelog * Sun Sep 18 2006 Lev Walkin -- Mentioned PER support +- Added PER support into description * Sun Sep 26 2004 Lev Walkin - All manuals are now getting installed, including new ones: unber.1 and enber.1 From 104518c30c61ecab9b6b5cf136dee24785f62f9b Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Jun 2007 20:17:00 +0000 Subject: [PATCH 1292/1469] second sequence production extensibility fix git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1300 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 58647a21a..da130e92b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9.22: 2006-Nov-24 +0.9.22: 2007-Jun-23 * Added -pdu=all and -pdu= switches to asn1c. * Added PER support for most known-multiplier string types: @@ -12,6 +12,8 @@ (Severity: low; Security impact: none). * Memory leak fixed in SET OF / SEQUENCE OF when wrong encoding is encountered. (Severity: medium; Security impact: low) + * Fixed extensibility handling of second SEQUENCE production. + (Severity: low; Security impact: none) 0.9.21: 2006-Sep-17 From a34f8acc3ee3b5b67635d72c1620edd9e521582a Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Jun 2007 20:17:58 +0000 Subject: [PATCH 1293/1469] new PER tests git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1301 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/Makefile.am | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/asn1c/tests/Makefile.am b/asn1c/tests/Makefile.am index 3d89ed264..38b8ca60c 100644 --- a/asn1c/tests/Makefile.am +++ b/asn1c/tests/Makefile.am @@ -12,7 +12,8 @@ EXTRA_DIST = \ check-*.c* \ data-62 \ data-70 \ - data-119 + data-119 \ + data-126 dist-hook: rm -rf `find $(distdir) -name .svn` From f5758d10b396b7b3cea100f7e25703d319f3b64a Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Jun 2007 20:18:06 +0000 Subject: [PATCH 1294/1469] new PER tests git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1302 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/Makefile.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/asn1c/tests/Makefile.in b/asn1c/tests/Makefile.in index 235bddded..41ff0a6c9 100644 --- a/asn1c/tests/Makefile.in +++ b/asn1c/tests/Makefile.in @@ -166,7 +166,8 @@ EXTRA_DIST = \ check-*.c* \ data-62 \ data-70 \ - data-119 + data-119 \ + data-126 all: all-am From f76be7272df46977054ddd71bb0a1511d27cb4b8 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Jun 2007 20:18:15 +0000 Subject: [PATCH 1295/1469] new PER tests git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1303 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-126.-gen-PER.c | 303 ++++++++++++++++++++++++++++ asn1c/tests/data-126/README | 6 + asn1c/tests/data-126/data-126-01.in | 3 + 3 files changed, 312 insertions(+) create mode 100644 asn1c/tests/check-126.-gen-PER.c create mode 100644 asn1c/tests/data-126/README create mode 100644 asn1c/tests/data-126/data-126-01.in diff --git a/asn1c/tests/check-126.-gen-PER.c b/asn1c/tests/check-126.-gen-PER.c new file mode 100644 index 000000000..aa12f1bee --- /dev/null +++ b/asn1c/tests/check-126.-gen-PER.c @@ -0,0 +1,303 @@ +/* + * Mode of operation: + * Each of the *.in files is XER-decoded, then converted into PER, + * compared with *.out file, then decoded and compared with the original. + */ +#undef NDEBUG +#include +#include +#include +#include /* for chdir(2) */ +#include +#include +#include +#include +#include + +#include + +static unsigned char buf[4096]; +static int buf_offset; + +static int +_buf_writer(const void *buffer, size_t size, void *app_key) { + unsigned char *b, *bend; + (void)app_key; + assert(buf_offset + size < sizeof(buf)); + memcpy(buf + buf_offset, buffer, size); + b = buf + buf_offset; + bend = b + size; + fprintf(stderr, "=> ["); + for(; b < bend; b++) { + if(*b >= 32 && *b < 127 && *b != '%') + fprintf(stderr, "%c", *b); + else + fprintf(stderr, "%%%02x", *b); + } + fprintf(stderr, "]:%ld\n", (long)size); + buf_offset += size; + return 0; +} + +enum enctype { + AS_PER, + AS_DER, + AS_XER, + AS_CXER, +}; + +static void +save_object_as(PDU_t *st, enum enctype how) { + asn_enc_rval_t rval; /* Return value */ + + buf_offset = 0; + + /* + * Save object using specified method. + */ + switch(how) { + case AS_PER: + rval = uper_encode(&asn_DEF_PDU, st, _buf_writer, 0); + assert(rval.encoded > 0); + fprintf(stderr, "SAVED OBJECT IN SIZE %d\n", buf_offset); + return; + case AS_DER: + rval = der_encode(&asn_DEF_PDU, st, + _buf_writer, 0); + break; + case AS_XER: + rval = xer_encode(&asn_DEF_PDU, st, XER_F_BASIC, + _buf_writer, 0); + break; + case AS_CXER: + rval = xer_encode(&asn_DEF_PDU, st, XER_F_CANONICAL, + _buf_writer, 0); + break; + } + + if (rval.encoded == -1) { + fprintf(stderr, + "Cannot encode %s: %s\n", + rval.failed_type->name, strerror(errno)); + assert(rval.encoded != -1); + return; + } + + fprintf(stderr, "SAVED OBJECT IN SIZE %d\n", buf_offset); +} + +static PDU_t * +load_object_from(const char *fname, char *fbuf, int size, enum enctype how) { + asn_dec_rval_t rval; + PDU_t *st = 0; + int csize = 1; + + if(getenv("INITIAL_CHUNK_SIZE")) + csize = atoi(getenv("INITIAL_CHUNK_SIZE")); + + /* Perform multiple iterations with multiple chunks sizes */ + for(; csize < 20; csize += 1) { + int fbuf_offset = 0; + int fbuf_left = size; + int fbuf_chunk = csize; + + fprintf(stderr, "LOADING OBJECT OF SIZE %d FROM [%s] as %s," + " chunks %d\n", + size, fname, how==AS_PER?"PER":"XER", csize); + + if(st) asn_DEF_PDU.free_struct(&asn_DEF_PDU, st, 0); + st = 0; + + do { + fprintf(stderr, "Decoding bytes %d..%d (left %d)\n", + fbuf_offset, + fbuf_chunk < fbuf_left + ? fbuf_chunk : fbuf_left, + fbuf_left); + if(st) { + fprintf(stderr, "=== currently ===\n"); + asn_fprint(stderr, &asn_DEF_PDU, st); + fprintf(stderr, "=== end ===\n"); + } + switch(how) { + case AS_XER: + rval = xer_decode(0, &asn_DEF_PDU, (void **)&st, + fbuf + fbuf_offset, + fbuf_chunk < fbuf_left + ? fbuf_chunk : fbuf_left); + break; + case AS_PER: + rval = uper_decode(0, &asn_DEF_PDU, + (void **)&st, fbuf + fbuf_offset, + fbuf_chunk < fbuf_left + ? fbuf_chunk : fbuf_left, 0, 0); + if(rval.code == RC_WMORE) { + if(fbuf_chunk == fbuf_left) { + fprintf(stderr, "-> PER decode error (%d bits of %d bytes) \n", rval.consumed, size); + rval.code = RC_FAIL; + rval.consumed += 7; + rval.consumed /= 8; + } else { + rval.consumed = 0; /* Not restartable */ + ASN_STRUCT_FREE(asn_DEF_PDU, st); + st = 0; + fprintf(stderr, "-> PER wants more\n"); + } + } else { + fprintf(stderr, "-> PER ret %d/%d\n", + rval.code, rval.consumed); + /* uper_decode() returns _bits_ */ + rval.consumed += 7; + rval.consumed /= 8; + } + break; + } + fbuf_offset += rval.consumed; + fbuf_left -= rval.consumed; + if(rval.code == RC_WMORE) + fbuf_chunk += 1; /* Give little more */ + else + fbuf_chunk = csize; /* Back off */ + } while(fbuf_left && rval.code == RC_WMORE); + + assert(rval.code == RC_OK); + if(how == AS_PER) { + fprintf(stderr, "[left %d, off %d, size %d]\n", + fbuf_left, fbuf_offset, size); + assert(fbuf_offset == size); + } else { + assert(fbuf_offset - size < 2 + || (fbuf_offset + 1 /* "\n" */ == size + && fbuf[size - 1] == '\n') + || (fbuf_offset + 2 /* "\r\n" */ == size + && fbuf[size - 2] == '\r' + && fbuf[size - 1] == '\n') + ); + } + } + + if(st) asn_fprint(stderr, &asn_DEF_PDU, st); + return st; +} + +static int +xer_encoding_equal(char *obuf, size_t osize, char *nbuf, size_t nsize) { + char *oend = obuf + osize; + char *nend = nbuf + nsize; + + if((osize && !nsize) || (!osize && nsize)) + return 0; /* not equal apriori */ + + while(1) { + while(obuf < oend && isspace(*obuf)) obuf++; + while(nbuf < nend && isspace(*nbuf)) nbuf++; + + if(obuf == oend || nbuf == nend) { + if(obuf == oend && nbuf == nend) + break; + fprintf(stderr, "%s data in reconstructed encoding\n", + (obuf == oend) ? "More" : "Less"); + return 0; + } + + if(*obuf != *nbuf) { + printf("%c%c != %c%c\n", + obuf[0], obuf[1], + nbuf[0], nbuf[1]); + return 0; + } + obuf++, nbuf++; + } + + return 1; +} + +static void +process_XER_data(const char *fname, char *fbuf, int size) { + PDU_t *st; + int ret; + + st = load_object_from(fname, fbuf, size, AS_XER); + if(!st) return; + + /* Save and re-load as DER */ + save_object_as(st, AS_PER); + st = load_object_from("buffer", buf, buf_offset, AS_PER); + assert(st); + + save_object_as(st, AS_XER); + fprintf(stderr, "=== original ===\n"); + fwrite(fbuf, 1, size, stderr); + fprintf(stderr, "=== re-encoded ===\n"); + fwrite(buf, 1, buf_offset, stderr); + fprintf(stderr, "=== end ===\n"); + + assert(xer_encoding_equal(fbuf, size, buf, buf_offset)); + + asn_DEF_PDU.free_struct(&asn_DEF_PDU, st, 0); +} + +/* + * Decode the .der files and try to regenerate them. + */ +static int +process(const char *fname) { + char fbuf[4096]; + char *ext = strrchr(fname, '.'); + int ret; + int rd; + FILE *fp; + + if(ext == 0 || strcmp(ext, ".in")) + return 0; + + fprintf(stderr, "\nProcessing file [../%s]\n", fname); + + snprintf(fbuf, sizeof(fbuf), "../data-126/%s", fname); + fp = fopen(fbuf, "r"); + assert(fp); + + rd = fread(fbuf, 1, sizeof(fbuf), fp); + fclose(fp); + + assert(rd < sizeof(fbuf)); /* expect small files */ + + process_XER_data(fname, fbuf, rd); + + fprintf(stderr, "Finished [%s]\n", fname); + + return 1; +} + +int +main() { + DIR *dir; + struct dirent *dent; + int processed_files = 0; + char *str; + + /* Process a specific test file */ + str = getenv("DATA_126_FILE"); + if(str && strncmp(str, "data-126-", 9) == 0) { + process(str); + return 0; + } + + dir = opendir("../data-126"); + assert(dir); + + /* + * Process each file in that directory. + */ + while((dent = readdir(dir))) { + if(strncmp(dent->d_name, "data-126-", 9) == 0) + if(process(dent->d_name)) + processed_files++; + } + + assert(processed_files); + closedir(dir); + + return 0; +} + diff --git a/asn1c/tests/data-126/README b/asn1c/tests/data-126/README new file mode 100644 index 000000000..19fa8684a --- /dev/null +++ b/asn1c/tests/data-126/README @@ -0,0 +1,6 @@ +Mode of operation: + + Each of the *.in files is XER-decoded, then converted into PER, + then compared with the .out file, then decoded back into XER + and compared to the original .in file content. + diff --git a/asn1c/tests/data-126/data-126-01.in b/asn1c/tests/data-126/data-126-01.in new file mode 100644 index 000000000..d01eb548e --- /dev/null +++ b/asn1c/tests/data-126/data-126-01.in @@ -0,0 +1,3 @@ + + + From ff523783388fc6717b89d622a68f5086a7959a85 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Jun 2007 23:36:51 +0000 Subject: [PATCH 1296/1469] comments git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1304 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-119.-fnative-types.-gen-PER.c | 2 +- asn1c/tests/check-119.-gen-PER.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/asn1c/tests/check-119.-fnative-types.-gen-PER.c b/asn1c/tests/check-119.-fnative-types.-gen-PER.c index 421459d2a..d5ffdc6b6 100644 --- a/asn1c/tests/check-119.-fnative-types.-gen-PER.c +++ b/asn1c/tests/check-119.-fnative-types.-gen-PER.c @@ -234,7 +234,7 @@ process_XER_data(const char *fname, enum expectation expectation, char *fbuf, in st = load_object_from(fname, expectation, fbuf, size, AS_XER); if(!st) return; - /* Save and re-load as DER */ + /* Save and re-load as PER */ save_object_as(st, expectation, AS_PER); if(expectation == EXP_PER_NOCOMP) return; /* Already checked */ diff --git a/asn1c/tests/check-119.-gen-PER.c b/asn1c/tests/check-119.-gen-PER.c index 421459d2a..d5ffdc6b6 100644 --- a/asn1c/tests/check-119.-gen-PER.c +++ b/asn1c/tests/check-119.-gen-PER.c @@ -234,7 +234,7 @@ process_XER_data(const char *fname, enum expectation expectation, char *fbuf, in st = load_object_from(fname, expectation, fbuf, size, AS_XER); if(!st) return; - /* Save and re-load as DER */ + /* Save and re-load as PER */ save_object_as(st, expectation, AS_PER); if(expectation == EXP_PER_NOCOMP) return; /* Already checked */ From 252357f7875bc3f456461c4201950003c90af1e9 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 23 Jun 2007 23:50:25 +0000 Subject: [PATCH 1297/1469] extensibility in SEQUENCE uper writer git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1305 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-126.-gen-PER.c | 32 +++++++- skeletons/constr_SEQUENCE.c | 116 ++++++++++++++++++++++++-- skeletons/per_encoder.c | 135 ++++++++++++++++++++++--------- skeletons/per_encoder.h | 22 ++++- skeletons/per_support.c | 23 ++++++ skeletons/per_support.h | 6 ++ 6 files changed, 287 insertions(+), 47 deletions(-) diff --git a/asn1c/tests/check-126.-gen-PER.c b/asn1c/tests/check-126.-gen-PER.c index aa12f1bee..5df2c789a 100644 --- a/asn1c/tests/check-126.-gen-PER.c +++ b/asn1c/tests/check-126.-gen-PER.c @@ -212,6 +212,35 @@ xer_encoding_equal(char *obuf, size_t osize, char *nbuf, size_t nsize) { return 1; } +static void +compare_with_data_out(const char *fname, char *buf, int size) { + char outName[256]; + char fbuf[1024]; + size_t rd; + FILE *f; + + sprintf(outName, "../data-126/%s", fname); + strcpy(outName + strlen(outName) - 3, ".out"); + + fprintf(stderr, "Comparing PER output with [%s]\n", outName); + + f = fopen(outName, "r"); + if(f) { + assert(f); + rd = fread(fbuf, 1, sizeof(fbuf), f); + assert(rd); + fclose(f); + + assert(rd == size); + assert(memcmp(fbuf, buf, rd) == 0); + fprintf(stderr, "XER->PER recoding .in->.out match.\n"); + } else if(getenv("REGENERATE")) { + f = fopen(outName, "w"); + fwrite(buf, 1, size, f); + fclose(f); + } +} + static void process_XER_data(const char *fname, char *fbuf, int size) { PDU_t *st; @@ -220,8 +249,9 @@ process_XER_data(const char *fname, char *fbuf, int size) { st = load_object_from(fname, fbuf, size, AS_XER); if(!st) return; - /* Save and re-load as DER */ + /* Save and re-load as PER */ save_object_as(st, AS_PER); + compare_with_data_out(fname, buf, buf_offset); st = load_object_from("buffer", buf, buf_offset, AS_PER); assert(st); diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 2b0ac3def..a6d12fa2e 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2003, 2004, 2005, 2006 Lev Walkin . + * Copyright (c) 2003, 2004, 2005, 2006, 2007 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ @@ -1162,12 +1162,87 @@ SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, return rv; } +/* + * #10.1, #10.2 + */ +static int +uper_put_open_type(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { + void *buf; + ssize_t size; + + size = uper_encode_to_new_buffer(td, constraints, sptr, &buf); + if(size <= 0) return -1; + + while(size) { + ssize_t maySave = uper_put_length(po, size); + if(maySave < 0) break; + if(per_put_many_bits(po, buf, maySave * 8)) break; + buf = (char *)buf + maySave; + size -= maySave; + } + + if(size) { + FREEMEM(buf); + return -1; + } + + return 0; +} + +static int +SEQUENCE_handle_extensions(asn_TYPE_descriptor_t *td, void *sptr, + asn_per_outp_t *po1, asn_per_outp_t *po2) { + asn_SEQUENCE_specifics_t *specs + = (asn_SEQUENCE_specifics_t *)td->specifics; + int num = 0; + int edx; + + if(specs->ext_before < 0) + return 0; + + /* Find out which extensions are present */ + for(edx = specs->ext_after + 1; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + int present; + + if(!IN_EXTENSION_GROUP(specs, edx)) + continue; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)sptr + elm->memb_offset); + present = (*memb_ptr2 != 0); + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + present = 1; + } + + ASN_DEBUG("checking ext %d is present => %d", edx, present); + num += present; + + /* Encode as presence marker */ + if(po1 && per_put_few_bits(po1, present, 1)) + return -1; + /* Encode as open type field */ + if(po2 && present && uper_put_open_type(elm->type, + elm->per_constraints, *memb_ptr2, po2)) + return -1; + + } + + return num; +} + asn_enc_rval_t SEQUENCE_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics; asn_enc_rval_t er; + int n_extensions; int edx; int i; @@ -1179,8 +1254,18 @@ SEQUENCE_encode_uper(asn_TYPE_descriptor_t *td, er.encoded = 0; ASN_DEBUG("Encoding %s as SEQUENCE (UPER)", td->name); - if(specs->ext_before >= 0) - _ASN_ENCODE_FAILED; /* We don't encode extensions yet */ + + + /* + * X.691#18.1 Whether structure is extensible + * and whether to encode extensions + */ + if(specs->ext_before >= 0) { + n_extensions = SEQUENCE_handle_extensions(td, sptr, 0, 0); + per_put_few_bits(po, n_extensions ? 1 : 0, 1); + } else { + n_extensions = 0; /* There are no extensions to encode */ + } /* Encode a presence bitmap */ for(i = 0; i < specs->roms_count; i++) { @@ -1216,10 +1301,11 @@ SEQUENCE_encode_uper(asn_TYPE_descriptor_t *td, } /* - * Get the sequence ROOT elements. + * Encode the sequence ROOT elements. */ + ASN_DEBUG("ext_after = %d, ec = %d, eb = %d", specs->ext_after, td->elements_count, specs->ext_before); for(edx = 0; edx < ((specs->ext_before < 0) - ? td->elements_count : specs->ext_before - 1); edx++) { + ? td->elements_count : specs->ext_after); edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ @@ -1244,12 +1330,32 @@ SEQUENCE_encode_uper(asn_TYPE_descriptor_t *td, if(elm->default_value && elm->default_value(0, memb_ptr2) == 1) continue; + ASN_DEBUG("encoding root %d", edx); er = elm->type->uper_encoder(elm->type, elm->per_constraints, *memb_ptr2, po); if(er.encoded == -1) return er; } + /* No extensions to encode */ + if(!n_extensions) _ASN_ENCODED_OK(er); + + ASN_DEBUG("Length of %d bit-map", n_extensions); + /* #18.8. Write down the presence bit-map length. */ + if(uper_put_nslength(po, n_extensions)) + _ASN_ENCODE_FAILED; + + ASN_DEBUG("Bit-map of %d elements", n_extensions); + /* #18.7. Encoding the extensions presence bit-map. */ + /* TODO: act upon NOTE in #18.7 for canonical PER */ + if(SEQUENCE_handle_extensions(td, sptr, po, 0) != n_extensions) + _ASN_ENCODE_FAILED; + + ASN_DEBUG("Writing %d extensions", n_extensions); + /* #18.9. Encode extensions as open type fields. */ + if(SEQUENCE_handle_extensions(td, sptr, 0, po) != n_extensions) + _ASN_ENCODE_FAILED; + _ASN_ENCODED_OK(er); } diff --git a/skeletons/per_encoder.c b/skeletons/per_encoder.c index 614dd2333..960981adb 100644 --- a/skeletons/per_encoder.c +++ b/skeletons/per_encoder.c @@ -2,41 +2,11 @@ #include #include -/* Flush partially filled buffer */ -static int _uper_encode_flush_outp(asn_per_outp_t *po); +static asn_enc_rval_t uper_encode_internal(asn_TYPE_descriptor_t *td, asn_per_constraints_t *, void *sptr, asn_app_consume_bytes_f *cb, void *app_key); asn_enc_rval_t uper_encode(asn_TYPE_descriptor_t *td, void *sptr, asn_app_consume_bytes_f *cb, void *app_key) { - asn_per_outp_t po; - asn_enc_rval_t er; - - /* - * Invoke type-specific encoder. - */ - if(!td || !td->uper_encoder) - _ASN_ENCODE_FAILED; /* PER is not compiled in */ - - po.buffer = po.tmpspace; - po.nboff = 0; - po.nbits = 8 * sizeof(po.tmpspace); - po.outper = cb; - po.op_key = app_key; - po.flushed_bytes = 0; - - er = td->uper_encoder(td, 0, sptr, &po); - if(er.encoded != -1) { - size_t bits_to_flush; - - bits_to_flush = ((po.buffer - po.tmpspace) << 3) + po.nboff; - - /* Set number of bits encoded to a firm value */ - er.encoded = (po.flushed_bytes << 3) + bits_to_flush; - - if(_uper_encode_flush_outp(&po)) - _ASN_ENCODE_FAILED; - } - - return er; + return uper_encode_internal(td, 0, sptr, cb, app_key); } /* @@ -63,20 +33,70 @@ asn_enc_rval_t uper_encode_to_buffer(asn_TYPE_descriptor_t *td, void *sptr, void *buffer, size_t buffer_size) { enc_to_buf_arg key; - /* - * Invoke type-specific encoder. - */ - if(!td || !td->uper_encoder) - _ASN_ENCODE_FAILED; /* PER is not compiled in */ - key.buffer = buffer; key.left = buffer_size; - ASN_DEBUG("Encoding \"%s\" using UNALIGNED PER", td->name); + if(td) ASN_DEBUG("Encoding \"%s\" using UNALIGNED PER", td->name); - return uper_encode(td, sptr, encode_to_buffer_cb, &key); + return uper_encode_internal(td, 0, sptr, encode_to_buffer_cb, &key); } +typedef struct enc_dyn_arg { + void *buffer; + size_t length; + size_t allocated; +} enc_dyn_arg; +static int +encode_dyn_cb(const void *buffer, size_t size, void *key) { + enc_dyn_arg *arg = key; + if(arg->length + size >= arg->allocated) { + void *p; + arg->allocated = arg->allocated ? (arg->allocated << 2) : size; + p = REALLOC(arg->buffer, arg->allocated); + if(!p) { + FREEMEM(arg->buffer); + memset(arg, 0, sizeof(*arg)); + return -1; + } + arg->buffer = p; + } + memcpy(((char *)arg->buffer) + arg->length, buffer, size); + arg->length += size; + return 0; +} +ssize_t +uper_encode_to_new_buffer(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, void **buffer_r) { + asn_enc_rval_t er; + enc_dyn_arg key; + + memset(&key, 0, sizeof(key)); + + er = uper_encode_internal(td, constraints, sptr, encode_dyn_cb, &key); + switch(er.encoded) { + case -1: + FREEMEM(key.buffer); + return -1; + case 0: + FREEMEM(key.buffer); + key.buffer = MALLOC(1); + if(key.buffer) { + *(char *)key.buffer = '\0'; + *buffer_r = key.buffer; + return 1; + } else { + return -1; + } + default: + *buffer_r = key.buffer; + return ((er.encoded + 7) >> 3); + } +} + +/* + * Internally useful functions. + */ + +/* Flush partially filled buffer */ static int _uper_encode_flush_outp(asn_per_outp_t *po) { uint8_t *buf; @@ -93,3 +113,38 @@ _uper_encode_flush_outp(asn_per_outp_t *po) { return po->outper(po->tmpspace, buf - po->tmpspace, po->op_key); } + +static asn_enc_rval_t +uper_encode_internal(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_app_consume_bytes_f *cb, void *app_key) { + asn_per_outp_t po; + asn_enc_rval_t er; + + /* + * Invoke type-specific encoder. + */ + if(!td || !td->uper_encoder) + _ASN_ENCODE_FAILED; /* PER is not compiled in */ + + po.buffer = po.tmpspace; + po.nboff = 0; + po.nbits = 8 * sizeof(po.tmpspace); + po.outper = cb; + po.op_key = app_key; + po.flushed_bytes = 0; + + er = td->uper_encoder(td, constraints, sptr, &po); + if(er.encoded != -1) { + size_t bits_to_flush; + + bits_to_flush = ((po.buffer - po.tmpspace) << 3) + po.nboff; + + /* Set number of bits encoded to a firm value */ + er.encoded = (po.flushed_bytes << 3) + bits_to_flush; + + if(_uper_encode_flush_outp(&po)) + _ASN_ENCODE_FAILED; + } + + return er; +} + diff --git a/skeletons/per_encoder.h b/skeletons/per_encoder.h index 9ac130b73..32de08294 100644 --- a/skeletons/per_encoder.h +++ b/skeletons/per_encoder.h @@ -16,6 +16,9 @@ struct asn_TYPE_descriptor_s; /* Forward declaration */ /* * Unaligned PER encoder of any ASN.1 type. May be invoked by the application. + * WARNING: This function returns the number of encoded bits in the .encoded + * field of the return value. Use the following formula to convert to bytes: + * bytes = ((.encoded + 7) / 8) */ asn_enc_rval_t uper_encode(struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ @@ -23,7 +26,11 @@ asn_enc_rval_t uper_encode(struct asn_TYPE_descriptor_s *type_descriptor, void *app_key /* Arbitrary callback argument */ ); -/* A variant of uper_encode() which encodes data into the existing buffer */ +/* + * A variant of uper_encode() which encodes data into the existing buffer + * WARNING: This function returns the number of encoded bits in the .encoded + * field of the return value. + */ asn_enc_rval_t uper_encode_to_buffer( struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ @@ -31,6 +38,19 @@ asn_enc_rval_t uper_encode_to_buffer( size_t buffer_size /* Initial buffer size (max) */ ); +/* + * A variant of uper_encode_to_buffer() which allocates buffer itself. + * Returns the number of bytes in the buffer or -1 in case of failure. + * WARNING: This function produces a "Production of the complete encoding", + * with length of at least one octet. Contrast this to precise bit-preserving + * encoding of uper_encode() and uper_encode_to_buffer(). + */ +ssize_t uper_encode_to_new_buffer( + struct asn_TYPE_descriptor_s *type_descriptor, + asn_per_constraints_t *constraints, + void *struct_ptr, /* Structure to be encoded */ + void **buffer_r /* Buffer allocated and returned */ +); /* * Type of the generic PER encoder function. diff --git a/skeletons/per_support.c b/skeletons/per_support.c index 0bb3d4b73..73e2a8dc4 100644 --- a/skeletons/per_support.c +++ b/skeletons/per_support.c @@ -318,3 +318,26 @@ uper_put_length(asn_per_outp_t *po, size_t length) { ? -1 : (ssize_t)(length << 14); } + +/* + * Put the normally small length "n" into the stream. + * This procedure used to encode length of extensions bit-maps + * for SET and SEQUENCE types. + */ +int +uper_put_nslength(asn_per_outp_t *po, size_t length) { + + if(length <= 64) { + /* #10.9.3.4 */ + if(length == 0) return -1; + return per_put_few_bits(po, length-1, 7) ? -1 : 0; + } else { + if(uper_put_length(po, length) != length) { + /* This might happen in case of >16K extensions */ + return -1; + } + } + + return 0; +} + diff --git a/skeletons/per_support.h b/skeletons/per_support.h index 2708724d9..4e7e6bdad 100644 --- a/skeletons/per_support.h +++ b/skeletons/per_support.h @@ -95,6 +95,12 @@ int per_put_many_bits(asn_per_outp_t *po, const uint8_t *src, int put_nbits); */ ssize_t uper_put_length(asn_per_outp_t *po, size_t whole_length); +/* + * Put the normally small length "n" to the Unaligned PER stream. + * Returns 0 or -1. + */ +int uper_put_nslength(asn_per_outp_t *po, size_t length); + /* * Put the normally small non-negative whole number. */ From c0eae7c0082b1663ebee9a59edc1f397ff0b41ea Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 24 Jun 2007 00:35:51 +0000 Subject: [PATCH 1298/1469] encoding per sequence git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1306 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-126.-gen-PER.c | 12 ++++++------ asn1c/tests/data-126/data-126-01.out | Bin 0 -> 4 bytes skeletons/constr_SEQUENCE.c | 14 ++++++++++---- 3 files changed, 16 insertions(+), 10 deletions(-) create mode 100644 asn1c/tests/data-126/data-126-01.out diff --git a/asn1c/tests/check-126.-gen-PER.c b/asn1c/tests/check-126.-gen-PER.c index 5df2c789a..eac2793d0 100644 --- a/asn1c/tests/check-126.-gen-PER.c +++ b/asn1c/tests/check-126.-gen-PER.c @@ -224,8 +224,12 @@ compare_with_data_out(const char *fname, char *buf, int size) { fprintf(stderr, "Comparing PER output with [%s]\n", outName); - f = fopen(outName, "r"); - if(f) { + if(getenv("REGENERATE")) { + f = fopen(outName, "w"); + fwrite(buf, 1, size, f); + fclose(f); + } else { + f = fopen(outName, "r"); assert(f); rd = fread(fbuf, 1, sizeof(fbuf), f); assert(rd); @@ -234,10 +238,6 @@ compare_with_data_out(const char *fname, char *buf, int size) { assert(rd == size); assert(memcmp(fbuf, buf, rd) == 0); fprintf(stderr, "XER->PER recoding .in->.out match.\n"); - } else if(getenv("REGENERATE")) { - f = fopen(outName, "w"); - fwrite(buf, 1, size, f); - fclose(f); } } diff --git a/asn1c/tests/data-126/data-126-01.out b/asn1c/tests/data-126/data-126-01.out new file mode 100644 index 0000000000000000000000000000000000000000..0f23c822888fda0c6adba98531da0515d72fa2b0 GIT binary patch literal 4 LcmZp4a9{uc14sb^ literal 0 HcmV?d00001 diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index a6d12fa2e..9f870f75b 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -1170,9 +1170,11 @@ uper_put_open_type(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints void *buf; ssize_t size; + ASN_DEBUG("Encoding as open type %s", td->name); size = uper_encode_to_new_buffer(td, constraints, sptr, &buf); if(size <= 0) return -1; + ASN_DEBUG("Putting %s of length %d", td->name, size); while(size) { ssize_t maySave = uper_put_length(po, size); if(maySave < 0) break; @@ -1194,7 +1196,8 @@ SEQUENCE_handle_extensions(asn_TYPE_descriptor_t *td, void *sptr, asn_per_outp_t *po1, asn_per_outp_t *po2) { asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics; - int num = 0; + int exts_present = 0; + int exts_count = 0; int edx; if(specs->ext_before < 0) @@ -1207,8 +1210,10 @@ SEQUENCE_handle_extensions(asn_TYPE_descriptor_t *td, void *sptr, void **memb_ptr2; /* Pointer to that pointer */ int present; - if(!IN_EXTENSION_GROUP(specs, edx)) + if(!IN_EXTENSION_GROUP(specs, edx)) { + ASN_DEBUG("%d is not extension", edx); continue; + } /* Fetch the pointer to this member */ if(elm->flags & ATF_POINTER) { @@ -1221,7 +1226,8 @@ SEQUENCE_handle_extensions(asn_TYPE_descriptor_t *td, void *sptr, } ASN_DEBUG("checking ext %d is present => %d", edx, present); - num += present; + exts_count++; + exts_present += present; /* Encode as presence marker */ if(po1 && per_put_few_bits(po1, present, 1)) @@ -1233,7 +1239,7 @@ SEQUENCE_handle_extensions(asn_TYPE_descriptor_t *td, void *sptr, } - return num; + return exts_present ? exts_count : 0; } asn_enc_rval_t From 02cd28b45ae4eecf82c9fe272a831341765406ab Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 24 Jun 2007 06:26:47 +0000 Subject: [PATCH 1299/1469] uper extensions decoding git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1307 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SEQUENCE.c | 302 +++++++++++++++++++++++++++++------- skeletons/per_decoder.c | 1 + skeletons/per_support.c | 48 +++++- skeletons/per_support.h | 7 + 4 files changed, 302 insertions(+), 56 deletions(-) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 9f870f75b..5e16f574a 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -1026,12 +1026,168 @@ SEQUENCE_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return 0; } +/* + * #10.1, #10.2 + */ +static int +uper_put_open_type(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { + void *buf; + ssize_t size; + + ASN_DEBUG("Encoding as open type %s", td->name); + size = uper_encode_to_new_buffer(td, constraints, sptr, &buf); + if(size <= 0) return -1; + + ASN_DEBUG("Putting %s of length %d", td->name, size); + while(size) { + ssize_t maySave = uper_put_length(po, size); + if(maySave < 0) break; + if(per_put_many_bits(po, buf, maySave * 8)) break; + buf = (char *)buf + maySave; + size -= maySave; + } + + if(size) { + FREEMEM(buf); + return -1; + } + + return 0; +} + +typedef struct uper_ugot_key { + asn_per_data_t oldpd; /* Old per data source */ + size_t unclaimed; + int repeat; +} uper_ugot_key; +static int +uper_ugot_refill(asn_per_data_t *pd) { + uper_ugot_key *arg = pd->refill_key; + ssize_t next_chunk_bytes, next_chunk_bits; + ssize_t consumed; + ssize_t avail; + + asn_per_data_t *oldpd = &arg->oldpd; + + /* Advance our position to where pd is */ + consumed = (pd->buffer - oldpd->buffer) << 3; + ASN_DEBUG("Refilling [consumed: %d bits from %d (%d->%d)] now [%d (%d->%d)]", + consumed, + oldpd->nbits - oldpd->nboff, oldpd->nboff, oldpd->nbits, + pd->nbits - pd->nboff, pd->nboff, pd->nbits); + oldpd->nbits -= consumed; + oldpd->buffer = pd->buffer; + oldpd->nboff = pd->nboff; + + if(arg->unclaimed) { + /* Refill the container */ + if(per_get_few_bits(oldpd, 0)) + return -1; + assert(0); + } + + if(!arg->repeat) { + ASN_DEBUG("Want more but refill doesn't have it"); + assert(0); + return -1; + } + + next_chunk_bytes = uper_get_length(oldpd, -1, &arg->repeat); + ASN_DEBUG("Open type length %d bytes, old %d (%d->%d)", + next_chunk_bytes, oldpd->nbits - oldpd->nboff, oldpd->nboff, oldpd->nbits); + if(next_chunk_bytes < 0) return -1; + if(next_chunk_bytes == 0 || !arg->repeat) + pd->refill = 0; /* No more refills, naturally */ + pd->buffer = oldpd->buffer; + pd->nboff = oldpd->nboff; + pd->nbits = oldpd->nbits; + next_chunk_bits = next_chunk_bytes << 3; + avail = pd->nbits - pd->nboff; + if(avail >= next_chunk_bits) { + pd->nbits = pd->nboff + next_chunk_bits; + arg->unclaimed = 0; + } else { + arg->unclaimed = next_chunk_bits - avail; + } + return 0; +} + +asn_dec_rval_t +uper_get_open_type(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + uper_ugot_key arg; + asn_dec_rval_t rv; + ssize_t padding; + + _ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx); + + ASN_DEBUG("Getting open type from %d bits (%d+%d), %p", pd->nbits - pd->nboff, pd->nboff, pd->nbits, pd->buffer); + arg.oldpd = *pd; + pd->refill = uper_ugot_refill; + pd->refill_key = &arg; + pd->nbits = pd->nboff; /* 0 bits at this point, wait for refill */ + arg.unclaimed = 0; + arg.repeat = 1; + + rv = td->uper_decoder(opt_codec_ctx, td, constraints, sptr, pd); + + /* Skip data not consumed by the decoder */ + while(arg.unclaimed) { + int toget = 24; + if(arg.unclaimed < toget) { + toget = arg.unclaimed; + arg.unclaimed = 0; + } else { + arg.unclaimed -= toget; + } + switch(per_get_few_bits(pd, toget)) { + case -1: _ASN_DECODE_STARVED; + case 0: continue; + default: + /* Padding must be blank */ + ASN_DEBUG("Non-blank unconsumed padding"); + _ASN_DECODE_FAILED; + } + } + + if(arg.repeat) { + ASN_DEBUG("Not consumed the whole thing"); + rv.code = RC_FAIL; + return rv; + } + + padding = pd->nbits - pd->nboff; + if(padding > 7) { + ASN_DEBUG("Too large padding in open type %d", padding); + rv.code = RC_FAIL; + return rv; + } + + ASN_DEBUG("nboff = %d, nbits %d, padding = %d, plus %d/%p", pd->nboff, pd->nbits, padding, pd->buffer - arg.oldpd.buffer, arg.oldpd.buffer); + pd->nboff += padding; + assert((ssize_t)pd->nboff <= (ssize_t)pd->nbits); + pd->refill = arg.oldpd.refill; + pd->refill_key = arg.oldpd.refill_key; + + return rv; +} + +static int +uper_skip_open_type(asn_codec_ctx_t *opt_codec_ctx, asn_per_data_t *pd) { + asn_dec_rval_t rv; + rv = uper_get_open_type(opt_codec_ctx, 0, 0, 0, pd); + if(rv.code != RC_OK) + return -1; + else + return 0; +} + asn_dec_rval_t SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics; void *st = *sptr; /* Target structure. */ - int extpresent = 0; /* Extension additions are present */ + int extpresent; /* Extension additions are present */ uint8_t *opres; /* Presence of optional root members */ asn_per_data_t opmd; asn_dec_rval_t rv; @@ -1053,6 +1209,8 @@ SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, if(specs->ext_before >= 0) { extpresent = per_get_few_bits(pd, 1); if(extpresent < 0) _ASN_DECODE_STARVED; + } else { + extpresent = 0; } /* Prepare a place and read-in the presence bitmap */ @@ -1077,12 +1235,14 @@ SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, /* * Get the sequence ROOT elements. */ - for(edx = 0; edx < ((specs->ext_before < 0) - ? td->elements_count : specs->ext_before - 1); edx++) { + for(edx = 0; edx < td->elements_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ + if(IN_EXTENSION_GROUP(specs, edx)) + continue; + /* Fetch the pointer to this member */ if(elm->flags & ATF_POINTER) { memb_ptr2 = (void **)((char *)st + elm->memb_offset); @@ -1124,71 +1284,108 @@ SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } } + /* Optionality map is not needed anymore */ + FREEMEM(opres); + /* * Deal with extensions. */ if(extpresent) { - ASN_DEBUG("Extensibility for %s: NOT IMPLEMENTED", td->name); - _ASN_DECODE_FAILED; - } else { - for(edx = specs->roms_count; edx < specs->roms_count - + specs->aoms_count; edx++) { - asn_TYPE_member_t *elm = &td->elements[edx]; - void *memb_ptr; /* Pointer to the member */ - void **memb_ptr2; /* Pointer to that pointer */ + ssize_t bmlength; + uint8_t *epres; /* Presence of extension members */ + asn_per_data_t epmd; - if(!elm->default_value) continue; + bmlength = uper_get_nslength(pd); + if(bmlength < 0) _ASN_DECODE_STARVED; - /* Fetch the pointer to this member */ - if(elm->flags & ATF_POINTER) { - memb_ptr2 = (void **)((char *)st - + elm->memb_offset); - } else { - memb_ptr = (char *)st + elm->memb_offset; - memb_ptr2 = &memb_ptr; - } + ASN_DEBUG("Extensions %d present in %s", bmlength, td->name); - /* Set default value */ - if(elm->default_value(1, memb_ptr2)) { - FREEMEM(opres); - _ASN_DECODE_FAILED; - } + epres = (uint8_t *)MALLOC((bmlength + 15) >> 3); + if(!epres) _ASN_DECODE_STARVED; + + /* Get the extensions map */ + if(per_get_many_bits(pd, epres, 0, bmlength)) + _ASN_DECODE_STARVED; + + epmd.buffer = epres; + epmd.nboff = 0; + epmd.nbits = bmlength; + ASN_DEBUG("Read in extensions bitmap for %s of %d bits (%x..)", + td->name, bmlength, *epres); + + /* Go over extensions and read them in */ + for(edx = specs->ext_after + 1; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + int present; + + if(!IN_EXTENSION_GROUP(specs, edx)) { + ASN_DEBUG("%d is not extension", edx); + continue; } - } - rv.consumed = 0; - rv.code = RC_OK; - FREEMEM(opres); - return rv; -} + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (void *)((char *)st + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } -/* - * #10.1, #10.2 - */ -static int -uper_put_open_type(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { - void *buf; - ssize_t size; + present = per_get_few_bits(&epmd, 1); + if(present <= 0) { + if(present < 0) break; /* No more extensions */ + continue; + } - ASN_DEBUG("Encoding as open type %s", td->name); - size = uper_encode_to_new_buffer(td, constraints, sptr, &buf); - if(size <= 0) return -1; + ASN_DEBUG("Decoding member %s in %s %p", elm->name, td->name, *memb_ptr2); + rv = uper_get_open_type(opt_codec_ctx, elm->type, + elm->per_constraints, memb_ptr2, pd); + if(rv.code != RC_OK) { + FREEMEM(epres); + return rv; + } + } + + /* Skip over overflow extensions which aren't present + * in this system's version of the protocol */ + while(per_get_few_bits(&epmd, 1) >= 0) { + if(uper_skip_open_type(opt_codec_ctx, pd)) { + FREEMEM(epres); + _ASN_DECODE_STARVED; + } + } - ASN_DEBUG("Putting %s of length %d", td->name, size); - while(size) { - ssize_t maySave = uper_put_length(po, size); - if(maySave < 0) break; - if(per_put_many_bits(po, buf, maySave * 8)) break; - buf = (char *)buf + maySave; - size -= maySave; + FREEMEM(epres); } - if(size) { - FREEMEM(buf); - return -1; + /* Fill DEFAULT members in extensions */ + for(edx = specs->roms_count; edx < specs->roms_count + + specs->aoms_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void **memb_ptr2; /* Pointer to member pointer */ + + if(!elm->default_value) continue; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + + elm->memb_offset); + if(*memb_ptr2) continue; + } else { + continue; /* Extensions are all optionals */ + } + + /* Set default value */ + if(elm->default_value(1, memb_ptr2)) { + _ASN_DECODE_FAILED; + } } - return 0; + rv.consumed = 0; + rv.code = RC_OK; + return rv; } static int @@ -1336,7 +1533,6 @@ SEQUENCE_encode_uper(asn_TYPE_descriptor_t *td, if(elm->default_value && elm->default_value(0, memb_ptr2) == 1) continue; - ASN_DEBUG("encoding root %d", edx); er = elm->type->uper_encoder(elm->type, elm->per_constraints, *memb_ptr2, po); if(er.encoded == -1) diff --git a/skeletons/per_decoder.c b/skeletons/per_decoder.c index 16dee3696..2e460da25 100644 --- a/skeletons/per_decoder.c +++ b/skeletons/per_decoder.c @@ -30,6 +30,7 @@ uper_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sp } /* Fill in the position indicator */ + memset(&pd, 0, sizeof(pd)); pd.buffer = (const uint8_t *)buffer; pd.nboff = skip_bits; pd.nbits = 8 * size - unused_bits; /* 8 is CHAR_BIT from */ diff --git a/skeletons/per_support.c b/skeletons/per_support.c index 73e2a8dc4..228fd1117 100644 --- a/skeletons/per_support.c +++ b/skeletons/per_support.c @@ -12,14 +12,33 @@ int32_t per_get_few_bits(asn_per_data_t *pd, int nbits) { size_t off; /* Next after last bit offset */ + ssize_t nleft; uint32_t accum; const uint8_t *buf; - if(nbits < 0 || pd->nboff + nbits > pd->nbits) + if(nbits < 0) return -1; - ASN_DEBUG("[PER get %d bits from %p+%d bits]", - nbits, pd->buffer, pd->nboff); + nleft = pd->nbits - pd->nboff; + if(nbits > nleft) { + int32_t tailv, vhead; + if(!pd->refill || nbits > 31) return -1; + /* Accumulate unused bytes before refill */ + ASN_DEBUG("Obtain the rest %d bits", nleft); + tailv = per_get_few_bits(pd, nleft); + if(tailv < 0) return -1; + /* Refill (replace pd contents with new data) */ + if(pd->refill(pd)) + return -1; + nbits -= nleft; + vhead = per_get_few_bits(pd, nbits); + /* Combine the rest of previous pd with the head of new one */ + tailv = (tailv << nbits) | vhead; /* Could == -1 */ + return tailv; + } + + ASN_DEBUG("[PER get %d bits from %p+%d bits, %d available]", + nbits, pd->buffer, pd->nboff, nleft); /* * Normalize position indicator. @@ -129,6 +148,29 @@ uper_get_length(asn_per_data_t *pd, int ebits, int *repeat) { return (16384 * value); } +/* + * Get the normally small length "n". + * This procedure used to decode length of extensions bit-maps + * for SET and SEQUENCE types. + */ +ssize_t +uper_get_nslength(asn_per_data_t *pd) { + ssize_t length; + + if(per_get_few_bits(pd, 1) == 0) { + ASN_DEBUG("l=?"); + length = per_get_few_bits(pd, 6); + ASN_DEBUG("l=%d", length); + if(length < 0) return -1; + return length + 1; + } else { + int repeat; + length = uper_get_length(pd, -1, &repeat); + if(length >= 0 && !repeat) return length; + return -1; /* Error, or do not support >16K extensions */ + } +} + /* * Get the normally small non-negative whole number. * X.691, #10.6 diff --git a/skeletons/per_support.h b/skeletons/per_support.h index 4e7e6bdad..c22bc7263 100644 --- a/skeletons/per_support.h +++ b/skeletons/per_support.h @@ -40,6 +40,8 @@ typedef struct asn_per_data_s { const uint8_t *buffer; /* Pointer to the octet stream */ size_t nboff; /* Bit offset to the meaningful bit */ size_t nbits; /* Number of bits in the stream */ + int (*refill)(struct asn_per_data_s *); + void *refill_key; } asn_per_data_t; /* @@ -64,6 +66,11 @@ ssize_t uper_get_length(asn_per_data_t *pd, int effective_bound_bits, int *repeat); +/* + * Get the normally small length "n". + */ +ssize_t uper_get_nslength(asn_per_data_t *pd); + /* * Get the normally small non-negative whole number. */ From ab946212620c0f00fcf8bfac57979a0cf0fc6a27 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 24 Jun 2007 08:06:53 +0000 Subject: [PATCH 1300/1469] git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1308 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/data-126/data-126-02.in | 3 +++ asn1c/tests/data-126/data-126-02.out | Bin 0 -> 4 bytes 2 files changed, 3 insertions(+) create mode 100644 asn1c/tests/data-126/data-126-02.in create mode 100644 asn1c/tests/data-126/data-126-02.out diff --git a/asn1c/tests/data-126/data-126-02.in b/asn1c/tests/data-126/data-126-02.in new file mode 100644 index 000000000..d01eb548e --- /dev/null +++ b/asn1c/tests/data-126/data-126-02.in @@ -0,0 +1,3 @@ + + + diff --git a/asn1c/tests/data-126/data-126-02.out b/asn1c/tests/data-126/data-126-02.out new file mode 100644 index 0000000000000000000000000000000000000000..0f23c822888fda0c6adba98531da0515d72fa2b0 GIT binary patch literal 4 LcmZp4a9{uc14sb^ literal 0 HcmV?d00001 From 498b5870883fe3378e0e309b6ded5bf9d10120f9 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 24 Jun 2007 08:08:45 +0000 Subject: [PATCH 1301/1469] per encoding must fail git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1309 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/data-126/README | 4 ++++ .../data-126/{data-126-02.in => data-126-02-P.in} | 0 .../data-126/{data-126-02.out => data-126-02-P.out} | Bin 3 files changed, 4 insertions(+) rename asn1c/tests/data-126/{data-126-02.in => data-126-02-P.in} (100%) rename asn1c/tests/data-126/{data-126-02.out => data-126-02-P.out} (100%) diff --git a/asn1c/tests/data-126/README b/asn1c/tests/data-126/README index 19fa8684a..07ff013e6 100644 --- a/asn1c/tests/data-126/README +++ b/asn1c/tests/data-126/README @@ -4,3 +4,7 @@ Mode of operation: then compared with the .out file, then decoded back into XER and compared to the original .in file content. +Naming conventions: + +*-P.in - PER decoding of .out file must fail. + diff --git a/asn1c/tests/data-126/data-126-02.in b/asn1c/tests/data-126/data-126-02-P.in similarity index 100% rename from asn1c/tests/data-126/data-126-02.in rename to asn1c/tests/data-126/data-126-02-P.in diff --git a/asn1c/tests/data-126/data-126-02.out b/asn1c/tests/data-126/data-126-02-P.out similarity index 100% rename from asn1c/tests/data-126/data-126-02.out rename to asn1c/tests/data-126/data-126-02-P.out From 4ce9874cfcc83d474d94df66d4ca6b2d62f60c6a Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 24 Jun 2007 08:24:47 +0000 Subject: [PATCH 1302/1469] git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1310 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/data-126/data-126-03-P.in | 3 +++ asn1c/tests/data-126/data-126-03-P.out | Bin 0 -> 4 bytes asn1c/tests/data-126/data-126-04-P.in | 3 +++ asn1c/tests/data-126/data-126-04-P.out | 1 + asn1c/tests/data-126/data-126-05-P.in | 3 +++ asn1c/tests/data-126/data-126-05-P.out | 1 + 6 files changed, 11 insertions(+) create mode 100644 asn1c/tests/data-126/data-126-03-P.in create mode 100644 asn1c/tests/data-126/data-126-03-P.out create mode 100644 asn1c/tests/data-126/data-126-04-P.in create mode 100644 asn1c/tests/data-126/data-126-04-P.out create mode 100644 asn1c/tests/data-126/data-126-05-P.in create mode 100644 asn1c/tests/data-126/data-126-05-P.out diff --git a/asn1c/tests/data-126/data-126-03-P.in b/asn1c/tests/data-126/data-126-03-P.in new file mode 100644 index 000000000..d01eb548e --- /dev/null +++ b/asn1c/tests/data-126/data-126-03-P.in @@ -0,0 +1,3 @@ + + + diff --git a/asn1c/tests/data-126/data-126-03-P.out b/asn1c/tests/data-126/data-126-03-P.out new file mode 100644 index 0000000000000000000000000000000000000000..d7a555ebcbb0b3e28562663b1e81e71fec181f3f GIT binary patch literal 4 LcmZp4XkY*U1IPhF literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-126/data-126-04-P.in b/asn1c/tests/data-126/data-126-04-P.in new file mode 100644 index 000000000..d01eb548e --- /dev/null +++ b/asn1c/tests/data-126/data-126-04-P.in @@ -0,0 +1,3 @@ + + + diff --git a/asn1c/tests/data-126/data-126-04-P.out b/asn1c/tests/data-126/data-126-04-P.out new file mode 100644 index 000000000..7c9ea7fcc --- /dev/null +++ b/asn1c/tests/data-126/data-126-04-P.out @@ -0,0 +1 @@ +@@@ \ No newline at end of file diff --git a/asn1c/tests/data-126/data-126-05-P.in b/asn1c/tests/data-126/data-126-05-P.in new file mode 100644 index 000000000..d01eb548e --- /dev/null +++ b/asn1c/tests/data-126/data-126-05-P.in @@ -0,0 +1,3 @@ + + + diff --git a/asn1c/tests/data-126/data-126-05-P.out b/asn1c/tests/data-126/data-126-05-P.out new file mode 100644 index 000000000..6a910924a --- /dev/null +++ b/asn1c/tests/data-126/data-126-05-P.out @@ -0,0 +1 @@ +@€ \ No newline at end of file From e9b0ae2211f451ae82b529248d21841c661183cf Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 24 Jun 2007 08:34:58 +0000 Subject: [PATCH 1303/1469] git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1311 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/data-126/data-126-02-P.out | Bin 4 -> 5 bytes asn1c/tests/data-126/data-126-04-P.out | Bin 4 -> 5 bytes asn1c/tests/data-126/data-126-05-P.out | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/asn1c/tests/data-126/data-126-02-P.out b/asn1c/tests/data-126/data-126-02-P.out index 0f23c822888fda0c6adba98531da0515d72fa2b0..11deabc098f2510a7daf091109880082886145af 100644 GIT binary patch literal 5 McmZp4IKaRF00qhcf&c&j literal 4 LcmZp4a9{uc14sb^ diff --git a/asn1c/tests/data-126/data-126-04-P.out b/asn1c/tests/data-126/data-126-04-P.out index 7c9ea7fcc9d326bb32ac10cc63b37bd195d56686..54a8a52bb3acc0aa1502847cfbbfe8d66f0f4706 100644 GIT binary patch literal 5 McmZp4XkcIf00jyGLI3~& literal 4 LcmZp4aBu(s1Bd}a diff --git a/asn1c/tests/data-126/data-126-05-P.out b/asn1c/tests/data-126/data-126-05-P.out index 6a910924a..7c9ea7fcc 100644 --- a/asn1c/tests/data-126/data-126-05-P.out +++ b/asn1c/tests/data-126/data-126-05-P.out @@ -1 +1 @@ -@€ \ No newline at end of file +@@@ \ No newline at end of file From 72455f63afb3589ab0f3a6e2a4bdcb279a2a6179 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 24 Jun 2007 08:38:34 +0000 Subject: [PATCH 1304/1469] added tests git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1312 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-126.-gen-PER.c | 44 ++++++++++++--- skeletons/constr_SEQUENCE.c | 91 ++++++++++++++++++++++---------- 2 files changed, 100 insertions(+), 35 deletions(-) diff --git a/asn1c/tests/check-126.-gen-PER.c b/asn1c/tests/check-126.-gen-PER.c index eac2793d0..8217a64ce 100644 --- a/asn1c/tests/check-126.-gen-PER.c +++ b/asn1c/tests/check-126.-gen-PER.c @@ -87,7 +87,7 @@ save_object_as(PDU_t *st, enum enctype how) { } static PDU_t * -load_object_from(const char *fname, char *fbuf, int size, enum enctype how) { +load_object_from(const char *fname, char *fbuf, int size, enum enctype how, int mustfail) { asn_dec_rval_t rval; PDU_t *st = 0; int csize = 1; @@ -109,11 +109,12 @@ load_object_from(const char *fname, char *fbuf, int size, enum enctype how) { st = 0; do { - fprintf(stderr, "Decoding bytes %d..%d (left %d)\n", + fprintf(stderr, "Decoding bytes %d..%d (left %d) [%s]\n", fbuf_offset, fbuf_chunk < fbuf_left ? fbuf_chunk : fbuf_left, - fbuf_left); + fbuf_left, + fname); if(st) { fprintf(stderr, "=== currently ===\n"); asn_fprint(stderr, &asn_DEF_PDU, st); @@ -137,6 +138,10 @@ load_object_from(const char *fname, char *fbuf, int size, enum enctype how) { rval.code = RC_FAIL; rval.consumed += 7; rval.consumed /= 8; + if(mustfail) { + fprintf(stderr, "-> (this was expected failure)\n"); + return 0; + } } else { rval.consumed = 0; /* Not restartable */ ASN_STRUCT_FREE(asn_DEF_PDU, st); @@ -144,11 +149,20 @@ load_object_from(const char *fname, char *fbuf, int size, enum enctype how) { fprintf(stderr, "-> PER wants more\n"); } } else { - fprintf(stderr, "-> PER ret %d/%d\n", - rval.code, rval.consumed); + fprintf(stderr, "-> PER ret %d/%d mf=%d\n", + rval.code, rval.consumed, mustfail); /* uper_decode() returns _bits_ */ rval.consumed += 7; rval.consumed /= 8; + if((mustfail?1:0) == (rval.code == RC_FAIL)) { + if(mustfail) { + fprintf(stderr, "-> (this was expected failure)\n"); + return; + } + } else { + fprintf(stderr, "-> (unexpected %s)\n", mustfail ? "success" : "failure"); + //rval.code = RC_FAIL; + } } break; } @@ -224,17 +238,33 @@ compare_with_data_out(const char *fname, char *buf, int size) { fprintf(stderr, "Comparing PER output with [%s]\n", outName); + if(strstr(outName, "-0-6-P.out")) { + f = fopen(outName, "w"); + fbuf[0] = 0x81; + fbuf[1] = 0x40; + fbuf[2] = 0x80; + fbuf[3] = 0x00; + fbuf[4] = 0x00; + fwrite(fbuf, 1, 5, f); + fclose(f); + } + if(getenv("REGENERATE")) { f = fopen(outName, "w"); fwrite(buf, 1, size, f); fclose(f); } else { + int mustfail = outName[strlen(outName)-5] == 'P'; f = fopen(outName, "r"); assert(f); rd = fread(fbuf, 1, sizeof(fbuf), f); assert(rd); fclose(f); + fprintf(stderr, "Trying to decode [%s]\n", outName); + load_object_from(outName, fbuf, rd, AS_PER, mustfail); + if(mustfail) return; + assert(rd == size); assert(memcmp(fbuf, buf, rd) == 0); fprintf(stderr, "XER->PER recoding .in->.out match.\n"); @@ -246,13 +276,13 @@ process_XER_data(const char *fname, char *fbuf, int size) { PDU_t *st; int ret; - st = load_object_from(fname, fbuf, size, AS_XER); + st = load_object_from(fname, fbuf, size, AS_XER, 0); if(!st) return; /* Save and re-load as PER */ save_object_as(st, AS_PER); compare_with_data_out(fname, buf, buf_offset); - st = load_object_from("buffer", buf, buf_offset, AS_PER); + st = load_object_from("buffer", buf, buf_offset, AS_PER, 0); assert(st); save_object_as(st, AS_XER); diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 5e16f574a..5d099ae98 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -1071,44 +1071,60 @@ uper_ugot_refill(asn_per_data_t *pd) { /* Advance our position to where pd is */ consumed = (pd->buffer - oldpd->buffer) << 3; - ASN_DEBUG("Refilling [consumed: %d bits from %d (%d->%d)] now [%d (%d->%d)]", + ASN_DEBUG("REFILLING [consumed: %d bits from %d (%d->%d)] now [%d (%d->%d)] uncl %d", consumed, oldpd->nbits - oldpd->nboff, oldpd->nboff, oldpd->nbits, - pd->nbits - pd->nboff, pd->nboff, pd->nbits); + pd->nbits - pd->nboff, pd->nboff, pd->nbits, arg->unclaimed); oldpd->nbits -= consumed; oldpd->buffer = pd->buffer; oldpd->nboff = pd->nboff; + oldpd->nboff = pd->nbits; if(arg->unclaimed) { /* Refill the container */ - if(per_get_few_bits(oldpd, 0)) + if(per_get_few_bits(oldpd, 1)) return -1; - assert(0); + if(oldpd->nboff == 0) { + assert(0); + return -1; + } + pd->buffer = oldpd->buffer; + pd->nboff = oldpd->nboff - 1; + pd->nbits = oldpd->nbits; + ASN_DEBUG("===================="); + return 0; } if(!arg->repeat) { ASN_DEBUG("Want more but refill doesn't have it"); - assert(0); return -1; } next_chunk_bytes = uper_get_length(oldpd, -1, &arg->repeat); - ASN_DEBUG("Open type length %d bytes, old %d (%d->%d)", - next_chunk_bytes, oldpd->nbits - oldpd->nboff, oldpd->nboff, oldpd->nbits); + ASN_DEBUG("Open type LENGTH %d bytes, old %d (%d->%d) repeat %d", + next_chunk_bytes, oldpd->nbits - oldpd->nboff, oldpd->nboff, oldpd->nbits, arg->repeat); if(next_chunk_bytes < 0) return -1; - if(next_chunk_bytes == 0 || !arg->repeat) + assert(next_chunk_bytes || !arg->repeat); + if(next_chunk_bytes == 0) pd->refill = 0; /* No more refills, naturally */ pd->buffer = oldpd->buffer; pd->nboff = oldpd->nboff; pd->nbits = oldpd->nbits; next_chunk_bits = next_chunk_bytes << 3; avail = pd->nbits - pd->nboff; + ASN_DEBUG("now at %d bits, want %d", + ((((int)pd->buffer ) & 0x7) << 3) + pd->nboff, + next_chunk_bits); + ASN_DEBUG("avail = %d", avail); if(avail >= next_chunk_bits) { pd->nbits = pd->nboff + next_chunk_bits; arg->unclaimed = 0; } else { arg->unclaimed = next_chunk_bits - avail; + ASN_DEBUG("Parent has %d, require %d, will claim %d", avail, next_chunk_bits, arg->unclaimed); } + ASN_DEBUG("now at %d bits", + ((((int)pd->buffer ) & 0x7) << 3) + pd->nboff); return 0; } @@ -1131,18 +1147,47 @@ uper_get_open_type(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, rv = td->uper_decoder(opt_codec_ctx, td, constraints, sptr, pd); + ASN_DEBUG("Open type unconsumed unclaimed=%d, repeat=%d, nbdiff=%d (%d->%d, old=%d (%d->%d))", + arg.unclaimed, arg.repeat, + pd->nbits - pd->nboff, pd->nboff, pd->nbits, + arg.oldpd.nbits - arg.oldpd.nboff, arg.oldpd.nboff, arg.oldpd.nbits); + ASN_DEBUG("now at %d bits", + ((((int)pd->buffer ) & 0x7) << 3) + pd->nboff); + + padding = pd->nbits - pd->nboff; + if(padding > 7) { + ASN_DEBUG("Too large padding in open type %p (%d->%d) %d", + pd->buffer, pd->nboff, pd->nbits, padding); + rv.code = RC_FAIL; + return rv; + } + + ASN_DEBUG("nboff = %d, nbits %d, padding = %d, plus %d/%p", pd->nboff, pd->nbits, padding, pd->buffer - arg.oldpd.buffer, arg.oldpd.buffer); + switch(per_get_few_bits(pd, padding)) { + case -1: + ASN_DEBUG("Padding skip failed"); + _ASN_DECODE_FAILED; + case 0: break; + default: + ASN_DEBUG("Non-blank padding"); + _ASN_DECODE_FAILED; + } + pd->refill = arg.oldpd.refill; + pd->refill_key = arg.oldpd.refill_key; + /* Skip data not consumed by the decoder */ while(arg.unclaimed) { int toget = 24; - if(arg.unclaimed < toget) { + if(arg.unclaimed < toget) toget = arg.unclaimed; - arg.unclaimed = 0; - } else { - arg.unclaimed -= toget; - } + arg.unclaimed -= toget; switch(per_get_few_bits(pd, toget)) { - case -1: _ASN_DECODE_STARVED; - case 0: continue; + case -1: + ASN_DEBUG("Claim of %d failed", toget); + _ASN_DECODE_STARVED; + case 0: + ASN_DEBUG("Got claim of %d", toget); + continue; default: /* Padding must be blank */ ASN_DEBUG("Non-blank unconsumed padding"); @@ -1150,25 +1195,15 @@ uper_get_open_type(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } } + ASN_DEBUG("now at %d bits", + ((((int)pd->buffer ) & 0x7) << 3) + pd->nboff); + if(arg.repeat) { ASN_DEBUG("Not consumed the whole thing"); rv.code = RC_FAIL; return rv; } - padding = pd->nbits - pd->nboff; - if(padding > 7) { - ASN_DEBUG("Too large padding in open type %d", padding); - rv.code = RC_FAIL; - return rv; - } - - ASN_DEBUG("nboff = %d, nbits %d, padding = %d, plus %d/%p", pd->nboff, pd->nbits, padding, pd->buffer - arg.oldpd.buffer, arg.oldpd.buffer); - pd->nboff += padding; - assert((ssize_t)pd->nboff <= (ssize_t)pd->nbits); - pd->refill = arg.oldpd.refill; - pd->refill_key = arg.oldpd.refill_key; - return rv; } From da435e226f354edd1f9fbf910ec446f499b0098b Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 24 Jun 2007 08:45:10 +0000 Subject: [PATCH 1305/1469] more tests git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1313 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/data-126/data-126-06-P.in | 3 +++ asn1c/tests/data-126/data-126-06-P.out | Bin 0 -> 3 bytes asn1c/tests/data-126/data-126-07-P.in | 3 +++ asn1c/tests/data-126/data-126-07-P.out | 1 + asn1c/tests/data-126/data-126-08-P.in | 3 +++ asn1c/tests/data-126/data-126-08-P.out | 1 + 6 files changed, 11 insertions(+) create mode 100644 asn1c/tests/data-126/data-126-06-P.in create mode 100644 asn1c/tests/data-126/data-126-06-P.out create mode 100644 asn1c/tests/data-126/data-126-07-P.in create mode 100644 asn1c/tests/data-126/data-126-07-P.out create mode 100644 asn1c/tests/data-126/data-126-08-P.in create mode 100644 asn1c/tests/data-126/data-126-08-P.out diff --git a/asn1c/tests/data-126/data-126-06-P.in b/asn1c/tests/data-126/data-126-06-P.in new file mode 100644 index 000000000..d01eb548e --- /dev/null +++ b/asn1c/tests/data-126/data-126-06-P.in @@ -0,0 +1,3 @@ + + + diff --git a/asn1c/tests/data-126/data-126-06-P.out b/asn1c/tests/data-126/data-126-06-P.out new file mode 100644 index 0000000000000000000000000000000000000000..90ad5151406a61ffffffa98784a3b8f5204304f4 GIT binary patch literal 3 KcmZp4U;qFD1^~hU literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-126/data-126-07-P.in b/asn1c/tests/data-126/data-126-07-P.in new file mode 100644 index 000000000..d01eb548e --- /dev/null +++ b/asn1c/tests/data-126/data-126-07-P.in @@ -0,0 +1,3 @@ + + + diff --git a/asn1c/tests/data-126/data-126-07-P.out b/asn1c/tests/data-126/data-126-07-P.out new file mode 100644 index 000000000..8979b4fb1 --- /dev/null +++ b/asn1c/tests/data-126/data-126-07-P.out @@ -0,0 +1 @@ +@@ \ No newline at end of file diff --git a/asn1c/tests/data-126/data-126-08-P.in b/asn1c/tests/data-126/data-126-08-P.in new file mode 100644 index 000000000..d01eb548e --- /dev/null +++ b/asn1c/tests/data-126/data-126-08-P.in @@ -0,0 +1,3 @@ + + + diff --git a/asn1c/tests/data-126/data-126-08-P.out b/asn1c/tests/data-126/data-126-08-P.out new file mode 100644 index 000000000..e84a902c5 --- /dev/null +++ b/asn1c/tests/data-126/data-126-08-P.out @@ -0,0 +1 @@ +@€ \ No newline at end of file From 7917a3e027d8895213249f0995dcaeafc7ac156d Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 24 Jun 2007 08:45:31 +0000 Subject: [PATCH 1306/1469] complex data git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1314 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-126.-gen-PER.c | 24 ++++++++++++++++++++---- skeletons/constr_SEQUENCE.c | 5 ++--- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/asn1c/tests/check-126.-gen-PER.c b/asn1c/tests/check-126.-gen-PER.c index 8217a64ce..4d0775bfc 100644 --- a/asn1c/tests/check-126.-gen-PER.c +++ b/asn1c/tests/check-126.-gen-PER.c @@ -238,14 +238,30 @@ compare_with_data_out(const char *fname, char *buf, int size) { fprintf(stderr, "Comparing PER output with [%s]\n", outName); - if(strstr(outName, "-0-6-P.out")) { + if(strstr(outName, "-06-P.out")) { + f = fopen(outName, "w"); + fbuf[0] = 0x81; + fbuf[1] = 0x40; + fbuf[2] = 0x00; + fwrite(fbuf, 1, 3, f); + fclose(f); + } + + if(strstr(outName, "-07-P.out")) { + f = fopen(outName, "w"); + fbuf[0] = 0x81; + fbuf[1] = 0x40; + fbuf[2] = 0x40; + fwrite(fbuf, 1, 3, f); + fclose(f); + } + + if(strstr(outName, "-08-P.out")) { f = fopen(outName, "w"); fbuf[0] = 0x81; fbuf[1] = 0x40; fbuf[2] = 0x80; - fbuf[3] = 0x00; - fbuf[4] = 0x00; - fwrite(fbuf, 1, 5, f); + fwrite(fbuf, 1, 3, f); fclose(f); } diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 5d099ae98..ec04992f3 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -1249,6 +1249,7 @@ SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } /* Prepare a place and read-in the presence bitmap */ + memset(&opmd, 0, sizeof(opmd)); if(specs->roms_count) { opres = (uint8_t *)MALLOC(((specs->roms_count + 7) >> 3) + 1); if(!opres) _ASN_DECODE_FAILED; @@ -1258,13 +1259,11 @@ SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, _ASN_DECODE_STARVED; } opmd.buffer = opres; - opmd.nboff = 0; opmd.nbits = specs->roms_count; ASN_DEBUG("Read in presence bitmap for %s of %d bits (%x..)", td->name, specs->roms_count, *opres); } else { opres = 0; - memset(&opmd, 0, sizeof opmd); } /* @@ -1342,8 +1341,8 @@ SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, if(per_get_many_bits(pd, epres, 0, bmlength)) _ASN_DECODE_STARVED; + memset(&epmd, 0, sizeof(epmd)); epmd.buffer = epres; - epmd.nboff = 0; epmd.nbits = bmlength; ASN_DEBUG("Read in extensions bitmap for %s of %d bits (%x..)", td->name, bmlength, *epres); From 77b2df78ce095915bca29fc2605103f4b05a3dda Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 24 Jun 2007 08:47:29 +0000 Subject: [PATCH 1307/1469] internal testing fixed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1315 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/check-PER.c | 1 + 1 file changed, 1 insertion(+) diff --git a/skeletons/tests/check-PER.c b/skeletons/tests/check-PER.c index aeb247704..e0fb72e75 100644 --- a/skeletons/tests/check-PER.c +++ b/skeletons/tests/check-PER.c @@ -7,6 +7,7 @@ check_per_decoding() { uint8_t tmpbuf[10]; int32_t z; asn_per_data_t pos; + memset(&pos, 0, sizeof(pos)); pos.buffer = buf; pos.nboff = 0; From b66891e9817978c881ce990c4e08ba22a9a6d2e9 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 24 Jun 2007 09:04:25 +0000 Subject: [PATCH 1308/1469] svn:ignore set git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1316 59561ff5-6e30-0410-9f3c-9617f08c8826 From baa2b223fd21195ec832d869887f110029e8ed58 Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 24 Jun 2007 09:13:16 +0000 Subject: [PATCH 1309/1469] reautomakified git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1317 59561ff5-6e30-0410-9f3c-9617f08c8826 --- Makefile.in | 14 ++++++++++---- asn1c/Makefile.in | 12 +++++++++--- asn1c/tests/Makefile.in | 12 +++++++++--- asn1c/webcgi/Makefile.in | 12 +++++++++--- doc/Makefile.in | 12 +++++++++--- examples/Makefile.in | 12 +++++++++--- libasn1compiler/Makefile.in | 12 +++++++++--- libasn1fix/Makefile.in | 12 +++++++++--- libasn1parser/Makefile.in | 12 +++++++++--- libasn1print/Makefile.in | 12 +++++++++--- skeletons/Makefile.in | 12 +++++++++--- skeletons/standard-modules/Makefile.in | 12 +++++++++--- skeletons/tests/Makefile.in | 12 +++++++++--- tests/Makefile.in | 12 +++++++++--- 14 files changed, 127 insertions(+), 43 deletions(-) diff --git a/Makefile.in b/Makefile.in index 682c0824f..4145e3bc9 100644 --- a/Makefile.in +++ b/Makefile.in @@ -40,7 +40,7 @@ target_triplet = @target@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/asn1c.spec.in \ $(srcdir)/config.h.in $(top_srcdir)/configure AUTHORS COPYING \ - ChangeLog INSTALL NEWS TODO config.guess config.sub depcomp \ + ChangeLog INSTALL TODO config.guess config.sub depcomp \ install-sh ltconfig ltmain.sh missing mkinstalldirs subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -114,6 +114,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -145,12 +146,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -167,23 +166,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/asn1c/Makefile.in b/asn1c/Makefile.in index 4f596bdb4..bcc763896 100644 --- a/asn1c/Makefile.in +++ b/asn1c/Makefile.in @@ -122,6 +122,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -153,12 +154,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -175,23 +174,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/asn1c/tests/Makefile.in b/asn1c/tests/Makefile.in index 41ff0a6c9..d8ee83925 100644 --- a/asn1c/tests/Makefile.in +++ b/asn1c/tests/Makefile.in @@ -79,6 +79,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -110,12 +111,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -132,23 +131,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/asn1c/webcgi/Makefile.in b/asn1c/webcgi/Makefile.in index 36d081b96..d3ef9e91f 100644 --- a/asn1c/webcgi/Makefile.in +++ b/asn1c/webcgi/Makefile.in @@ -100,6 +100,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -131,12 +132,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -153,23 +152,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/doc/Makefile.in b/doc/Makefile.in index c636f1549..46a1ab838 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -89,6 +89,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -120,12 +121,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -142,23 +141,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/examples/Makefile.in b/examples/Makefile.in index 274218995..79973d077 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -84,6 +84,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -115,12 +116,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -137,23 +136,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/libasn1compiler/Makefile.in b/libasn1compiler/Makefile.in index 70e363a96..3323458ae 100644 --- a/libasn1compiler/Makefile.in +++ b/libasn1compiler/Makefile.in @@ -99,6 +99,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -130,12 +131,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -152,23 +151,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/libasn1fix/Makefile.in b/libasn1fix/Makefile.in index abae3fcb8..dd5c049d7 100644 --- a/libasn1fix/Makefile.in +++ b/libasn1fix/Makefile.in @@ -107,6 +107,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -138,12 +139,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -160,23 +159,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index 822a73047..c0a8c8e27 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -106,6 +106,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -137,12 +138,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -159,23 +158,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/libasn1print/Makefile.in b/libasn1print/Makefile.in index ed33fe594..4104fb4d3 100644 --- a/libasn1print/Makefile.in +++ b/libasn1print/Makefile.in @@ -97,6 +97,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -128,12 +129,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -150,23 +149,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/skeletons/Makefile.in b/skeletons/Makefile.in index 502a71bc3..d31ea9499 100644 --- a/skeletons/Makefile.in +++ b/skeletons/Makefile.in @@ -99,6 +99,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -130,12 +131,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -152,23 +151,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/skeletons/standard-modules/Makefile.in b/skeletons/standard-modules/Makefile.in index 66f5f906e..0fc1ddf80 100644 --- a/skeletons/standard-modules/Makefile.in +++ b/skeletons/standard-modules/Makefile.in @@ -90,6 +90,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -121,12 +122,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -143,23 +142,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/skeletons/tests/Makefile.in b/skeletons/tests/Makefile.in index bb1fe5959..8d01f3651 100644 --- a/skeletons/tests/Makefile.in +++ b/skeletons/tests/Makefile.in @@ -147,6 +147,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -178,12 +179,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -200,23 +199,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/tests/Makefile.in b/tests/Makefile.in index 13a5f42c5..a629c2f90 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -79,6 +79,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -110,12 +111,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -132,23 +131,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ From fc8003fbae9992977ec61f118616cc039a082ead Mon Sep 17 00:00:00 2001 From: vlm Date: Sun, 24 Jun 2007 09:14:19 +0000 Subject: [PATCH 1310/1469] extensions in sequence git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1318 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index da130e92b..eb8c8da08 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7,6 +7,7 @@ useful types: GeneralizedTime, UTCTime, ObjectDescriptor; as well as REAL and OBJECT IDENTIFIER. TODO: SET type. + * Added PER support for extensions in SEQUENCE. * Multiple enhancements by Daniele Varrazzo * Fixed explicit tagging of an in-lined constructed type. (Severity: low; Security impact: none). From 26b48ca31596be7c50a9e24f71670adde5dfbf3e Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 02:51:10 +0000 Subject: [PATCH 1311/1469] per_get_undo() git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1319 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SEQUENCE.c | 8 ++++---- skeletons/per_decoder.c | 1 + skeletons/per_support.c | 23 +++++++++++++++++++---- skeletons/per_support.h | 14 +++++++++----- 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index ec04992f3..4267d84e9 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -1078,7 +1078,6 @@ uper_ugot_refill(asn_per_data_t *pd) { oldpd->nbits -= consumed; oldpd->buffer = pd->buffer; oldpd->nboff = pd->nboff; - oldpd->nboff = pd->nbits; if(arg->unclaimed) { /* Refill the container */ @@ -1091,6 +1090,7 @@ uper_ugot_refill(asn_per_data_t *pd) { pd->buffer = oldpd->buffer; pd->nboff = oldpd->nboff - 1; pd->nbits = oldpd->nbits; + pd->moved = oldpd->moved - 1; ASN_DEBUG("===================="); return 0; } @@ -1110,12 +1110,12 @@ uper_ugot_refill(asn_per_data_t *pd) { pd->buffer = oldpd->buffer; pd->nboff = oldpd->nboff; pd->nbits = oldpd->nbits; + pd->moved = oldpd->moved; next_chunk_bits = next_chunk_bytes << 3; avail = pd->nbits - pd->nboff; - ASN_DEBUG("now at %d bits, want %d", + ASN_DEBUG("now at %d bits, want %d, avail %d", ((((int)pd->buffer ) & 0x7) << 3) + pd->nboff, - next_chunk_bits); - ASN_DEBUG("avail = %d", avail); + next_chunk_bits, avail); if(avail >= next_chunk_bits) { pd->nbits = pd->nboff + next_chunk_bits; arg->unclaimed = 0; diff --git a/skeletons/per_decoder.c b/skeletons/per_decoder.c index 2e460da25..4e120a4b0 100644 --- a/skeletons/per_decoder.c +++ b/skeletons/per_decoder.c @@ -47,6 +47,7 @@ uper_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sp /* Return the number of consumed bits */ rval.consumed = ((pd.buffer - (const uint8_t *)buffer) << 3) + pd.nboff - skip_bits; + assert(rval.consumed == pd.moved); } else { /* PER codec is not a restartable */ rval.consumed = 0; diff --git a/skeletons/per_support.c b/skeletons/per_support.c index 228fd1117..f38422ad1 100644 --- a/skeletons/per_support.c +++ b/skeletons/per_support.c @@ -6,13 +6,23 @@ #include #include +void +per_get_undo(asn_per_data_t *pd, int nbits) { + if(pd->nboff < nbits) { + assert(pd->nboff < nbits); + } else { + pd->nboff -= nbits; + pd->moved -= nbits; + } +} + /* * Extract a small number of bits (<= 31) from the specified PER data pointer. */ int32_t per_get_few_bits(asn_per_data_t *pd, int nbits) { size_t off; /* Next after last bit offset */ - ssize_t nleft; + ssize_t nleft; /* Number of bits left in this stream */ uint32_t accum; const uint8_t *buf; @@ -48,7 +58,9 @@ per_get_few_bits(asn_per_data_t *pd, int nbits) { pd->nbits -= (pd->nboff & ~0x07); pd->nboff &= 0x07; } - off = (pd->nboff += nbits); + pd->moved += nbits; + pd->nboff += nbits; + off = pd->nboff; buf = pd->buffer; /* @@ -66,11 +78,14 @@ per_get_few_bits(asn_per_data_t *pd, int nbits) { else if(nbits <= 31) { asn_per_data_t tpd = *pd; /* Here are we with our 31-bits limit plus 1..7 bits offset. */ - tpd.nboff -= nbits; + per_get_undo(&tpd, nbits); + /* The number of available bits in the stream allow + * for the following operations to take place without + * invoking the ->refill() function */ accum = per_get_few_bits(&tpd, nbits - 24) << 24; accum |= per_get_few_bits(&tpd, 24); } else { - pd->nboff -= nbits; /* Oops, revert back */ + per_get_undo(pd, nbits); return -1; } diff --git a/skeletons/per_support.h b/skeletons/per_support.h index c22bc7263..bf06f0567 100644 --- a/skeletons/per_support.h +++ b/skeletons/per_support.h @@ -37,11 +37,12 @@ typedef struct asn_per_constraints_s { * This structure describes a position inside an incoming PER bit stream. */ typedef struct asn_per_data_s { - const uint8_t *buffer; /* Pointer to the octet stream */ - size_t nboff; /* Bit offset to the meaningful bit */ - size_t nbits; /* Number of bits in the stream */ - int (*refill)(struct asn_per_data_s *); - void *refill_key; + const uint8_t *buffer; /* Pointer to the octet stream */ + size_t nboff; /* Bit offset to the meaningful bit */ + size_t nbits; /* Number of bits in the stream */ + size_t moved; /* Number of bits moved through this bit stream */ + int (*refill)(struct asn_per_data_s *); + void *refill_key; } asn_per_data_t; /* @@ -51,6 +52,9 @@ typedef struct asn_per_data_s { */ int32_t per_get_few_bits(asn_per_data_t *per_data, int get_nbits); +/* Undo the immediately preceeding "get_few_bits" operation */ +void per_get_undo(asn_per_data_t *per_data, int get_nbits); + /* * Extract a large number of bits from the specified PER data pointer. * This function returns -1 if the specified number of bits could not be From a06e8b2638274a4cd42ec76f6f0ecdc45e79d111 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 03:16:35 +0000 Subject: [PATCH 1312/1469] moving git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1320 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SEQUENCE.c | 30 ++++++++++++++++-------------- skeletons/per_support.c | 6 +++--- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 4267d84e9..a0d81a1c6 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -1058,26 +1058,27 @@ uper_put_open_type(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints typedef struct uper_ugot_key { asn_per_data_t oldpd; /* Old per data source */ size_t unclaimed; + size_t ot_moved; /* Number of bits moved by OT processing */ int repeat; } uper_ugot_key; static int uper_ugot_refill(asn_per_data_t *pd) { uper_ugot_key *arg = pd->refill_key; ssize_t next_chunk_bytes, next_chunk_bits; - ssize_t consumed; ssize_t avail; asn_per_data_t *oldpd = &arg->oldpd; - /* Advance our position to where pd is */ - consumed = (pd->buffer - oldpd->buffer) << 3; - ASN_DEBUG("REFILLING [consumed: %d bits from %d (%d->%d)] now [%d (%d->%d)] uncl %d", - consumed, + ASN_DEBUG("REFILLING [from %d (%d->%d)] now [%d (%d->%d)] uncl %d", oldpd->nbits - oldpd->nboff, oldpd->nboff, oldpd->nbits, pd->nbits - pd->nboff, pd->nboff, pd->nbits, arg->unclaimed); - oldpd->nbits -= consumed; + + /* Advance our position to where pd is */ oldpd->buffer = pd->buffer; - oldpd->nboff = pd->nboff; + oldpd->nboff = pd->nboff; + oldpd->nbits -= pd->moved - arg->ot_moved; + oldpd->moved += pd->moved - arg->ot_moved; + arg->ot_moved = pd->moved; if(arg->unclaimed) { /* Refill the container */ @@ -1090,7 +1091,6 @@ uper_ugot_refill(asn_per_data_t *pd) { pd->buffer = oldpd->buffer; pd->nboff = oldpd->nboff - 1; pd->nbits = oldpd->nbits; - pd->moved = oldpd->moved - 1; ASN_DEBUG("===================="); return 0; } @@ -1104,13 +1104,13 @@ uper_ugot_refill(asn_per_data_t *pd) { ASN_DEBUG("Open type LENGTH %d bytes, old %d (%d->%d) repeat %d", next_chunk_bytes, oldpd->nbits - oldpd->nboff, oldpd->nboff, oldpd->nbits, arg->repeat); if(next_chunk_bytes < 0) return -1; - assert(next_chunk_bytes || !arg->repeat); - if(next_chunk_bytes == 0) + if(next_chunk_bytes == 0) { pd->refill = 0; /* No more refills, naturally */ + assert(!arg->repeat); /* Implementation guarantee */ + } pd->buffer = oldpd->buffer; pd->nboff = oldpd->nboff; pd->nbits = oldpd->nbits; - pd->moved = oldpd->moved; next_chunk_bits = next_chunk_bytes << 3; avail = pd->nbits - pd->nboff; ASN_DEBUG("now at %d bits, want %d, avail %d", @@ -1139,11 +1139,12 @@ uper_get_open_type(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ASN_DEBUG("Getting open type from %d bits (%d+%d), %p", pd->nbits - pd->nboff, pd->nboff, pd->nbits, pd->buffer); arg.oldpd = *pd; + arg.unclaimed = 0; + arg.ot_moved = 0; + arg.repeat = 1; pd->refill = uper_ugot_refill; pd->refill_key = &arg; pd->nbits = pd->nboff; /* 0 bits at this point, wait for refill */ - arg.unclaimed = 0; - arg.repeat = 1; rv = td->uper_decoder(opt_codec_ctx, td, constraints, sptr, pd); @@ -1163,6 +1164,7 @@ uper_get_open_type(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } ASN_DEBUG("nboff = %d, nbits %d, padding = %d, plus %d/%p", pd->nboff, pd->nbits, padding, pd->buffer - arg.oldpd.buffer, arg.oldpd.buffer); + ASN_DEBUG("Getting padding of %d bits", padding); switch(per_get_few_bits(pd, padding)) { case -1: ASN_DEBUG("Padding skip failed"); @@ -1177,7 +1179,7 @@ uper_get_open_type(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, /* Skip data not consumed by the decoder */ while(arg.unclaimed) { - int toget = 24; + size_t toget = 24; if(arg.unclaimed < toget) toget = arg.unclaimed; arg.unclaimed -= toget; diff --git a/skeletons/per_support.c b/skeletons/per_support.c index f38422ad1..c9c9594b0 100644 --- a/skeletons/per_support.c +++ b/skeletons/per_support.c @@ -8,8 +8,8 @@ void per_get_undo(asn_per_data_t *pd, int nbits) { - if(pd->nboff < nbits) { - assert(pd->nboff < nbits); + if((ssize_t)pd->nboff < nbits) { + assert((ssize_t)pd->nboff < nbits); } else { pd->nboff -= nbits; pd->moved -= nbits; @@ -389,7 +389,7 @@ uper_put_nslength(asn_per_outp_t *po, size_t length) { if(length == 0) return -1; return per_put_few_bits(po, length-1, 7) ? -1 : 0; } else { - if(uper_put_length(po, length) != length) { + if(uper_put_length(po, length) != (ssize_t)length) { /* This might happen in case of >16K extensions */ return -1; } From 8c2c5c446a45227dd388a17c97804556cf354b29 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 06:46:04 +0000 Subject: [PATCH 1313/1469] counting overhead git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1321 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SEQUENCE.c | 85 ++++++++++++++++++++----------------- skeletons/per_decoder.c | 2 + 2 files changed, 47 insertions(+), 40 deletions(-) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index a0d81a1c6..bcdf2ca28 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -1069,9 +1069,10 @@ uper_ugot_refill(asn_per_data_t *pd) { asn_per_data_t *oldpd = &arg->oldpd; - ASN_DEBUG("REFILLING [from %d (%d->%d)] now [%d (%d->%d)] uncl %d", - oldpd->nbits - oldpd->nboff, oldpd->nboff, oldpd->nbits, - pd->nbits - pd->nboff, pd->nboff, pd->nbits, arg->unclaimed); + ASN_DEBUG("REFILLING (%+db) [from %d (%d->%d)_%d] now [%d (%d->%d)_%d] uncl %d", + pd->buffer - oldpd->buffer, + oldpd->nbits - oldpd->nboff, oldpd->nboff, oldpd->nbits, oldpd->moved, + pd->nbits - pd->nboff, pd->nboff, pd->nbits, pd->moved, arg->unclaimed); /* Advance our position to where pd is */ oldpd->buffer = pd->buffer; @@ -1101,30 +1102,25 @@ uper_ugot_refill(asn_per_data_t *pd) { } next_chunk_bytes = uper_get_length(oldpd, -1, &arg->repeat); - ASN_DEBUG("Open type LENGTH %d bytes, old %d (%d->%d) repeat %d", - next_chunk_bytes, oldpd->nbits - oldpd->nboff, oldpd->nboff, oldpd->nbits, arg->repeat); + ASN_DEBUG("Open type LENGTH %d bytes at off %d, repeat %d", + next_chunk_bytes, oldpd->moved, arg->repeat); if(next_chunk_bytes < 0) return -1; if(next_chunk_bytes == 0) { pd->refill = 0; /* No more refills, naturally */ assert(!arg->repeat); /* Implementation guarantee */ } - pd->buffer = oldpd->buffer; - pd->nboff = oldpd->nboff; - pd->nbits = oldpd->nbits; next_chunk_bits = next_chunk_bytes << 3; - avail = pd->nbits - pd->nboff; - ASN_DEBUG("now at %d bits, want %d, avail %d", - ((((int)pd->buffer ) & 0x7) << 3) + pd->nboff, - next_chunk_bits, avail); + avail = oldpd->nbits - oldpd->nboff; if(avail >= next_chunk_bits) { - pd->nbits = pd->nboff + next_chunk_bits; + pd->nbits = oldpd->nboff + next_chunk_bits; arg->unclaimed = 0; } else { + pd->nbits = oldpd->nbits; arg->unclaimed = next_chunk_bits - avail; ASN_DEBUG("Parent has %d, require %d, will claim %d", avail, next_chunk_bits, arg->unclaimed); } - ASN_DEBUG("now at %d bits", - ((((int)pd->buffer ) & 0x7) << 3) + pd->nboff); + pd->buffer = oldpd->buffer; + pd->nboff = oldpd->nboff; return 0; } @@ -1144,36 +1140,48 @@ uper_get_open_type(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, arg.repeat = 1; pd->refill = uper_ugot_refill; pd->refill_key = &arg; - pd->nbits = pd->nboff; /* 0 bits at this point, wait for refill */ + pd->nbits = pd->nboff; /* 0 good bits at this point, will refill */ + pd->moved = 0; /* This now counts the open type size in bits */ rv = td->uper_decoder(opt_codec_ctx, td, constraints, sptr, pd); - ASN_DEBUG("Open type unconsumed unclaimed=%d, repeat=%d, nbdiff=%d (%d->%d, old=%d (%d->%d))", - arg.unclaimed, arg.repeat, + ASN_DEBUG("Open type %s consumed %d off of %d unclaimed=%d, repeat=%d, nbdiff=%d (%d->%d, old=%d (%d->%d))", + td->name, pd->moved, arg.oldpd.moved, arg.unclaimed, arg.repeat, pd->nbits - pd->nboff, pd->nboff, pd->nbits, arg.oldpd.nbits - arg.oldpd.nboff, arg.oldpd.nboff, arg.oldpd.nbits); - ASN_DEBUG("now at %d bits", - ((((int)pd->buffer ) & 0x7) << 3) + pd->nboff); - padding = pd->nbits - pd->nboff; - if(padding > 7) { - ASN_DEBUG("Too large padding in open type %p (%d->%d) %d", - pd->buffer, pd->nboff, pd->nbits, padding); - rv.code = RC_FAIL; - return rv; + padding = pd->moved % 8; + if(padding) { + if(padding > 7) { + ASN_DEBUG("Too large padding %d in open type", + padding); + rv.code = RC_FAIL; + return rv; + } + ASN_DEBUG("Getting padding of %d bits", padding); + switch(per_get_few_bits(pd, padding)) { + case -1: + ASN_DEBUG("Padding skip failed"); + _ASN_DECODE_FAILED; + case 0: break; + default: + ASN_DEBUG("Non-blank padding"); + _ASN_DECODE_FAILED; + } } - - ASN_DEBUG("nboff = %d, nbits %d, padding = %d, plus %d/%p", pd->nboff, pd->nbits, padding, pd->buffer - arg.oldpd.buffer, arg.oldpd.buffer); - ASN_DEBUG("Getting padding of %d bits", padding); - switch(per_get_few_bits(pd, padding)) { - case -1: - ASN_DEBUG("Padding skip failed"); - _ASN_DECODE_FAILED; - case 0: break; - default: - ASN_DEBUG("Non-blank padding"); - _ASN_DECODE_FAILED; + if(pd->nbits != pd->nboff) { + ASN_DEBUG("Open type container overhead of %d off %d bits!", pd->nbits - pd->nboff, arg.oldpd.moved + pd->moved); + if(0) _ASN_DECODE_FAILED; + /* Ignore unwanted overheads */ + arg.oldpd.moved += pd->nbits - pd->nboff; + //pd->moved += pd->nbits - pd->nboff; + pd->nboff = pd->nbits; } + arg.oldpd.nbits -= pd->moved - arg.ot_moved; + arg.oldpd.moved += pd->moved - arg.ot_moved; + pd->nboff = arg.oldpd.nboff; + pd->nbits = arg.oldpd.nbits; + pd->moved = arg.oldpd.moved; pd->refill = arg.oldpd.refill; pd->refill_key = arg.oldpd.refill_key; @@ -1197,9 +1205,6 @@ uper_get_open_type(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } } - ASN_DEBUG("now at %d bits", - ((((int)pd->buffer ) & 0x7) << 3) + pd->nboff); - if(arg.repeat) { ASN_DEBUG("Not consumed the whole thing"); rv.code = RC_FAIL; diff --git a/skeletons/per_decoder.c b/skeletons/per_decoder.c index 4e120a4b0..de9dc5503 100644 --- a/skeletons/per_decoder.c +++ b/skeletons/per_decoder.c @@ -47,6 +47,8 @@ uper_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sp /* Return the number of consumed bits */ rval.consumed = ((pd.buffer - (const uint8_t *)buffer) << 3) + pd.nboff - skip_bits; + ASN_DEBUG("PER decoding consumed %d, counted %d", + rval.consumed, pd.moved); assert(rval.consumed == pd.moved); } else { /* PER codec is not a restartable */ From 356d6d2a431047389cc897373959001515fad53c Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 06:46:31 +0000 Subject: [PATCH 1314/1469] testing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1322 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-126.-gen-PER.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/asn1c/tests/check-126.-gen-PER.c b/asn1c/tests/check-126.-gen-PER.c index 4d0775bfc..71efbbf80 100644 --- a/asn1c/tests/check-126.-gen-PER.c +++ b/asn1c/tests/check-126.-gen-PER.c @@ -134,7 +134,7 @@ load_object_from(const char *fname, char *fbuf, int size, enum enctype how, int ? fbuf_chunk : fbuf_left, 0, 0); if(rval.code == RC_WMORE) { if(fbuf_chunk == fbuf_left) { - fprintf(stderr, "-> PER decode error (%d bits of %d bytes) \n", rval.consumed, size); + fprintf(stderr, "-> PER decode error (%d bits of %d bytes (c=%d,l=%d)) \n", rval.consumed, size, fbuf_chunk, fbuf_left); rval.code = RC_FAIL; rval.consumed += 7; rval.consumed /= 8; @@ -161,7 +161,7 @@ load_object_from(const char *fname, char *fbuf, int size, enum enctype how, int } } else { fprintf(stderr, "-> (unexpected %s)\n", mustfail ? "success" : "failure"); - //rval.code = RC_FAIL; + rval.code = RC_FAIL; } } break; From 7bbba23c5aef6e407ef1d1b80b2d6781e9d9e6d9 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 06:47:18 +0000 Subject: [PATCH 1315/1469] git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1323 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-126.-gen-PER.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/asn1c/tests/check-126.-gen-PER.c b/asn1c/tests/check-126.-gen-PER.c index 71efbbf80..86244efd0 100644 --- a/asn1c/tests/check-126.-gen-PER.c +++ b/asn1c/tests/check-126.-gen-PER.c @@ -43,7 +43,6 @@ enum enctype { AS_PER, AS_DER, AS_XER, - AS_CXER, }; static void @@ -69,10 +68,6 @@ save_object_as(PDU_t *st, enum enctype how) { rval = xer_encode(&asn_DEF_PDU, st, XER_F_BASIC, _buf_writer, 0); break; - case AS_CXER: - rval = xer_encode(&asn_DEF_PDU, st, XER_F_CANONICAL, - _buf_writer, 0); - break; } if (rval.encoded == -1) { @@ -127,6 +122,9 @@ load_object_from(const char *fname, char *fbuf, int size, enum enctype how, int fbuf_chunk < fbuf_left ? fbuf_chunk : fbuf_left); break; + case AS_DER: + assert(0); + break; case AS_PER: rval = uper_decode(0, &asn_DEF_PDU, (void **)&st, fbuf + fbuf_offset, @@ -157,7 +155,7 @@ load_object_from(const char *fname, char *fbuf, int size, enum enctype how, int if((mustfail?1:0) == (rval.code == RC_FAIL)) { if(mustfail) { fprintf(stderr, "-> (this was expected failure)\n"); - return; + return 0; } } else { fprintf(stderr, "-> (unexpected %s)\n", mustfail ? "success" : "failure"); @@ -281,7 +279,7 @@ compare_with_data_out(const char *fname, char *buf, int size) { load_object_from(outName, fbuf, rd, AS_PER, mustfail); if(mustfail) return; - assert(rd == size); + assert(rd == (size_t)size); assert(memcmp(fbuf, buf, rd) == 0); fprintf(stderr, "XER->PER recoding .in->.out match.\n"); } @@ -290,7 +288,6 @@ compare_with_data_out(const char *fname, char *buf, int size) { static void process_XER_data(const char *fname, char *fbuf, int size) { PDU_t *st; - int ret; st = load_object_from(fname, fbuf, size, AS_XER, 0); if(!st) return; @@ -320,7 +317,6 @@ static int process(const char *fname) { char fbuf[4096]; char *ext = strrchr(fname, '.'); - int ret; int rd; FILE *fp; @@ -336,7 +332,7 @@ process(const char *fname) { rd = fread(fbuf, 1, sizeof(fbuf), fp); fclose(fp); - assert(rd < sizeof(fbuf)); /* expect small files */ + assert((size_t)rd < sizeof(fbuf)); /* expect small files */ process_XER_data(fname, fbuf, rd); From ea493dc7939e4b0bf7f7a5a219f183408f393742 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 07:18:54 +0000 Subject: [PATCH 1316/1469] couting overhead git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1324 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SEQUENCE.c | 18 +++++++----------- skeletons/per_support.c | 4 ++-- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index bcdf2ca28..8af6cb9d4 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -1092,7 +1092,7 @@ uper_ugot_refill(asn_per_data_t *pd) { pd->buffer = oldpd->buffer; pd->nboff = oldpd->nboff - 1; pd->nbits = oldpd->nbits; - ASN_DEBUG("===================="); + ASN_DEBUG("Return from unclaimed"); return 0; } @@ -1145,10 +1145,9 @@ uper_get_open_type(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, rv = td->uper_decoder(opt_codec_ctx, td, constraints, sptr, pd); - ASN_DEBUG("Open type %s consumed %d off of %d unclaimed=%d, repeat=%d, nbdiff=%d (%d->%d, old=%d (%d->%d))", - td->name, pd->moved, arg.oldpd.moved, arg.unclaimed, arg.repeat, - pd->nbits - pd->nboff, pd->nboff, pd->nbits, - arg.oldpd.nbits - arg.oldpd.nboff, arg.oldpd.nboff, arg.oldpd.nbits); + ASN_DEBUG("Open type %s consumed %d off of %d unclaimed=%d, repeat=%d", + td->name, pd->moved, arg.oldpd.moved, + arg.unclaimed, arg.repeat); padding = pd->moved % 8; if(padding) { @@ -1170,12 +1169,9 @@ uper_get_open_type(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } } if(pd->nbits != pd->nboff) { - ASN_DEBUG("Open type container overhead of %d off %d bits!", pd->nbits - pd->nboff, arg.oldpd.moved + pd->moved); - if(0) _ASN_DECODE_FAILED; - /* Ignore unwanted overheads */ - arg.oldpd.moved += pd->nbits - pd->nboff; - //pd->moved += pd->nbits - pd->nboff; - pd->nboff = pd->nbits; + ASN_DEBUG("Open type container overhead of %d bits!", pd->nbits - pd->nboff); + if(1) _ASN_DECODE_FAILED; + arg.unclaimed += pd->nbits - pd->nboff; } arg.oldpd.nbits -= pd->moved - arg.ot_moved; arg.oldpd.moved += pd->moved - arg.ot_moved; diff --git a/skeletons/per_support.c b/skeletons/per_support.c index c9c9594b0..6187f2c1e 100644 --- a/skeletons/per_support.c +++ b/skeletons/per_support.c @@ -47,8 +47,8 @@ per_get_few_bits(asn_per_data_t *pd, int nbits) { return tailv; } - ASN_DEBUG("[PER get %d bits from %p+%d bits, %d available]", - nbits, pd->buffer, pd->nboff, nleft); + ASN_DEBUG("[PER get %d bits from (%d@%d+%d)]", + nbits, pd->moved, pd->nboff, nleft); /* * Normalize position indicator. From 442f420519d3acda9c6fbbc5cf91d60f8a6a1e9e Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 07:40:39 +0000 Subject: [PATCH 1317/1469] -per-padding -> -per-nopad git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1325 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.RRC/Makefile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/sample.source.RRC/Makefile b/examples/sample.source.RRC/Makefile index bd8251cbf..22c5436dc 100644 --- a/examples/sample.source.RRC/Makefile +++ b/examples/sample.source.RRC/Makefile @@ -4823,19 +4823,19 @@ check-per: ./${TARGET} -J0.0001 -n 1000 -b $$b -iper -onull $$f || exit 2; \ ./${TARGET} -J0.001 -n 1000 -b $$b -iper -onull $$f || exit 2; \ done; done; fi - @if test -f sample-DL-DCCH-Message-1-padded.per ; then \ - for f in sample-*-[1-9]-padded.per; do \ + @if test -f sample-DL-DCCH-Message-1-nopad.per ; then \ + for f in sample-*-[1-9]-nopad.per; do \ pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z-]+)-[0-9].*/\1/"`; \ for b in 1 17 33 980 8192; do \ - echo "Recoding byte-padded $$f into DER into XER and back ($$b)..."; \ - ./${TARGET} -b $$b -per-padded -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + echo "Recoding unpadded $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -per-nopad -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ ./${TARGET} -b $$b -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ ./${TARGET} -b $$b -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ diff $$f ./.tmp.1.$$$$ || exit 2; \ rm -f ./.tmp.[12].$$$$; \ echo "Test junking $$f (please wait)..."; \ - ./${TARGET} -J0.0001 -n 1000 -b $$b -per-padded -iper -onull $$f || exit 2; \ - ./${TARGET} -J0.001 -n 1000 -b $$b -per-padded -iper -onull $$f || exit 2; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -per-nopad -iper -onull $$f || exit 2; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -per-nopad -iper -onull $$f || exit 2; \ done; done; fi distclean: clean From 894c75ab2ca12d451296d01d9c5b00b367e871a4 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 07:46:17 +0000 Subject: [PATCH 1318/1469] binary file git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1326 59561ff5-6e30-0410-9f3c-9617f08c8826 From 6cada1e6394ec68cc0ac06e04f4c473e77d5325e Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 07:47:25 +0000 Subject: [PATCH 1319/1469] padded git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1327 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ...2-padded.per => sample-BCCH-BCH-Message-2.per} | Bin ...e-2.per => sample-DL-CCCH-Message-2-nopad.per} | Bin .../sample-DL-DCCH-Message-1-nopad.per | Bin 0 -> 12 bytes .../sample-DL-DCCH-Message-1-padded.per | Bin 14 -> 0 bytes .../sample-DL-DCCH-Message-1.per | Bin 12 -> 14 bytes 5 files changed, 0 insertions(+), 0 deletions(-) rename examples/sample.source.RRC/{sample-BCCH-BCH-Message-2-padded.per => sample-BCCH-BCH-Message-2.per} (100%) rename examples/sample.source.RRC/{sample-DL-CCCH-Message-2.per => sample-DL-CCCH-Message-2-nopad.per} (100%) create mode 100644 examples/sample.source.RRC/sample-DL-DCCH-Message-1-nopad.per delete mode 100644 examples/sample.source.RRC/sample-DL-DCCH-Message-1-padded.per diff --git a/examples/sample.source.RRC/sample-BCCH-BCH-Message-2-padded.per b/examples/sample.source.RRC/sample-BCCH-BCH-Message-2.per similarity index 100% rename from examples/sample.source.RRC/sample-BCCH-BCH-Message-2-padded.per rename to examples/sample.source.RRC/sample-BCCH-BCH-Message-2.per diff --git a/examples/sample.source.RRC/sample-DL-CCCH-Message-2.per b/examples/sample.source.RRC/sample-DL-CCCH-Message-2-nopad.per similarity index 100% rename from examples/sample.source.RRC/sample-DL-CCCH-Message-2.per rename to examples/sample.source.RRC/sample-DL-CCCH-Message-2-nopad.per diff --git a/examples/sample.source.RRC/sample-DL-DCCH-Message-1-nopad.per b/examples/sample.source.RRC/sample-DL-DCCH-Message-1-nopad.per new file mode 100644 index 0000000000000000000000000000000000000000..584e85be7de0ad0c0e00e72eb17eefea9e6c65da GIT binary patch literal 12 TcmWe_U|>jaNMO)kz`y_i5F`R+ literal 0 HcmV?d00001 diff --git a/examples/sample.source.RRC/sample-DL-DCCH-Message-1-padded.per b/examples/sample.source.RRC/sample-DL-DCCH-Message-1-padded.per deleted file mode 100644 index 2ae327a3267067d41705ec950daf6d7190ab5bbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14 UcmWe_U|?W4&~Shu-T}w}02+@2H2?qr diff --git a/examples/sample.source.RRC/sample-DL-DCCH-Message-1.per b/examples/sample.source.RRC/sample-DL-DCCH-Message-1.per index 584e85be7de0ad0c0e00e72eb17eefea9e6c65da..2ae327a3267067d41705ec950daf6d7190ab5bbd 100644 GIT binary patch literal 14 UcmWe_U|?W4&~Shu-T}w}02+@2H2?qr literal 12 TcmWe_U|>jaNMO)kz`y_i5F`R+ From 120ab78d34ff1b85466c8f1f92d26b3ebe7669e7 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 08:07:40 +0000 Subject: [PATCH 1320/1469] git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1328 59561ff5-6e30-0410-9f3c-9617f08c8826 From a472cf2d45ffe81a66f4b78b5e1cb55b0a07d7e3 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 08:24:50 +0000 Subject: [PATCH 1321/1469] padding change git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1329 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.makefile.regen | 52 ++++++++++++++--------------- examples/sample.source.RRC/Makefile | 52 ++++++++++++++--------------- skeletons/converter-sample.c | 30 ++++++++--------- skeletons/per_decoder.c | 34 +++++++++++++++++++ skeletons/per_decoder.h | 14 +++++++- 5 files changed, 114 insertions(+), 68 deletions(-) diff --git a/examples/sample.makefile.regen b/examples/sample.makefile.regen index b1f4a646a..5e189478c 100755 --- a/examples/sample.makefile.regen +++ b/examples/sample.makefile.regen @@ -75,12 +75,12 @@ set +x echo ' for b in 1 17 33 980 8192; do \' echo ' echo "Recoding $$f into XER and back ($$b)..."; \' echo ' ./${TARGET} -b $$b -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -b $$b -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \' - echo ' diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \' + echo ' ./${TARGET} -b $$b -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \' + echo ' diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 4; \' echo ' rm -f ./.tmp.[12].$$$$; \' echo ' echo "Test junking $$f (please wait)..."; \' - echo ' ./${TARGET} -J0.0001 -n 1000 -b $$b -iber -onull $$f || exit 2; \' - echo ' ./${TARGET} -J0.001 -n 1000 -b $$b -iber -onull $$f || exit 2; \' + echo ' ./${TARGET} -J0.0001 -n 1000 -b $$b -iber -onull $$f || exit 5; \' + echo ' ./${TARGET} -J0.001 -n 1000 -b $$b -iber -onull $$f || exit 6; \' echo ' done; done; fi' echo echo 'check-xer:' @@ -89,41 +89,41 @@ set +x echo ' for b in 1 17 33 980 8192; do \' echo ' echo "Recoding $$f into DER and back ($$b)..."; \' echo ' ./${TARGET} -b $$b -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \' - echo ' diff $$f ./.tmp.2.$$$$ || exit 2; \' + echo ' ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \' + echo ' diff $$f ./.tmp.2.$$$$ || exit 4; \' echo ' rm -f ./.tmp.[12].$$$$; \' echo ' echo "Test junking $$f (please wait)..."; \' - echo ' ./${TARGET} -J0.0001 -n 1000 -b $$b -ixer -onull $$f || exit 2; \' - echo ' ./${TARGET} -J0.001 -n 1000 -b $$b -ixer -onull $$f || exit 2; \' + echo ' ./${TARGET} -J0.0001 -n 1000 -b $$b -ixer -onull $$f || exit 5; \' + echo ' ./${TARGET} -J0.001 -n 1000 -b $$b -ixer -onull $$f || exit 6; \' echo ' done; done; fi' echo echo 'check-per:' - echo " @if test -f sample-${ASN1PDU}-1.per ; then \\" - echo " for f in sample-${ASN1PDU}-[1-9].per; do \\" + echo " @if test -f sample-${ASN1PDU}-1-nopad.per ; then \\" + echo " for f in sample-${ASN1PDU}-[1-9]-nopad.per; do \\" echo ' for b in 1 17 33 980 8192; do \' - echo ' echo "Recoding $$f into DER into XER and back ($$b)..."; \' - echo ' ./${TARGET} -b $$b -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \' - echo ' ./${TARGET} -b $$b -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \' - echo ' diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 2; \' + echo ' echo "Recoding non-padded $$f into DER into XER and back ($$b)..."; \' + echo ' ./${TARGET} -b $$b -per-nopad -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \' + echo ' ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \' + echo ' ./${TARGET} -b $$b -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 4; \' + echo ' diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 5; \' echo ' rm -f ./.tmp.[123].$$$$; \' echo ' echo "Test junking $$f (please wait)..."; \' - echo ' ./${TARGET} -J0.0001 -n 1000 -b $$b -iper -onull $$f || exit 2; \' - echo ' ./${TARGET} -J0.001 -n 1000 -b $$b -iper -onull $$f || exit 2; \' + echo ' ./${TARGET} -J0.0001 -n 1000 -b $$b -per-nopad -iper -onull $$f || exit 6; \' + echo ' ./${TARGET} -J0.001 -n 1000 -b $$b -per-nopad -iper -onull $$f || exit 7; \' echo ' done; done; fi' - echo " @if test -f sample-${ASN1PDU}-1-padded.per ; then \\" - echo " for f in sample-*-[1-9]-padded.per; do \\" + echo " @if test -f sample-${ASN1PDU}-1.per ; then \\" + echo " for f in sample-*-[1-9].per; do \\" echo ' pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z-]+)-[0-9].*/\1/"`; \' echo ' for b in 1 17 33 980 8192; do \' - echo ' echo "Recoding byte-padded $$f into DER into XER and back ($$b)..."; \' - echo ' ./${TARGET} -b $$b -per-padded -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \' - echo ' ./${TARGET} -b $$b -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \' - echo ' ./${TARGET} -b $$b -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \' - echo ' diff $$f ./.tmp.1.$$$$ || exit 2; \' + echo ' echo "Recoding $$f into DER into XER and back ($$b)..."; \' + echo ' ./${TARGET} -b $$b -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 3; \' + echo ' ./${TARGET} -b $$b -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 4; \' + echo ' ./${TARGET} -b $$b -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 5; \' + echo ' diff $$f ./.tmp.1.$$$$ || exit 6; \' echo ' rm -f ./.tmp.[12].$$$$; \' echo ' echo "Test junking $$f (please wait)..."; \' - echo ' ./${TARGET} -J0.0001 -n 1000 -b $$b -per-padded -iper -onull $$f || exit 2; \' - echo ' ./${TARGET} -J0.001 -n 1000 -b $$b -per-padded -iper -onull $$f || exit 2; \' + echo ' ./${TARGET} -J0.0001 -n 1000 -b $$b -iper -onull $$f || exit 7; \' + echo ' ./${TARGET} -J0.001 -n 1000 -b $$b -iper -onull $$f || exit 8; \' echo ' done; done; fi' echo echo "distclean: clean" diff --git a/examples/sample.source.RRC/Makefile b/examples/sample.source.RRC/Makefile index 22c5436dc..5ecd357e5 100644 --- a/examples/sample.source.RRC/Makefile +++ b/examples/sample.source.RRC/Makefile @@ -4787,12 +4787,12 @@ check-ber: for b in 1 17 33 980 8192; do \ echo "Recoding $$f into XER and back ($$b)..."; \ ./${TARGET} -b $$b -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -b $$b -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -b $$b -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 4; \ rm -f ./.tmp.[12].$$$$; \ echo "Test junking $$f (please wait)..."; \ - ./${TARGET} -J0.0001 -n 1000 -b $$b -iber -onull $$f || exit 2; \ - ./${TARGET} -J0.001 -n 1000 -b $$b -iber -onull $$f || exit 2; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -iber -onull $$f || exit 5; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -iber -onull $$f || exit 6; \ done; done; fi check-xer: @@ -4801,41 +4801,41 @@ check-xer: for b in 1 17 33 980 8192; do \ echo "Recoding $$f into DER and back ($$b)..."; \ ./${TARGET} -b $$b -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - diff $$f ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \ + diff $$f ./.tmp.2.$$$$ || exit 4; \ rm -f ./.tmp.[12].$$$$; \ echo "Test junking $$f (please wait)..."; \ - ./${TARGET} -J0.0001 -n 1000 -b $$b -ixer -onull $$f || exit 2; \ - ./${TARGET} -J0.001 -n 1000 -b $$b -ixer -onull $$f || exit 2; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -ixer -onull $$f || exit 5; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -ixer -onull $$f || exit 6; \ done; done; fi check-per: - @if test -f sample-DL-DCCH-Message-1.per ; then \ - for f in sample-DL-DCCH-Message-[1-9].per; do \ + @if test -f sample-DL-DCCH-Message-1-nopad.per ; then \ + for f in sample-DL-DCCH-Message-[1-9]-nopad.per; do \ for b in 1 17 33 980 8192; do \ - echo "Recoding $$f into DER into XER and back ($$b)..."; \ - ./${TARGET} -b $$b -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -b $$b -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \ - diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 2; \ + echo "Recoding non-padded $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -per-nopad -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \ + ./${TARGET} -b $$b -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 4; \ + diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 5; \ rm -f ./.tmp.[123].$$$$; \ echo "Test junking $$f (please wait)..."; \ - ./${TARGET} -J0.0001 -n 1000 -b $$b -iper -onull $$f || exit 2; \ - ./${TARGET} -J0.001 -n 1000 -b $$b -iper -onull $$f || exit 2; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -per-nopad -iper -onull $$f || exit 6; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -per-nopad -iper -onull $$f || exit 7; \ done; done; fi - @if test -f sample-DL-DCCH-Message-1-nopad.per ; then \ - for f in sample-*-[1-9]-nopad.per; do \ + @if test -f sample-DL-DCCH-Message-1.per ; then \ + for f in sample-*-[1-9].per; do \ pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z-]+)-[0-9].*/\1/"`; \ for b in 1 17 33 980 8192; do \ - echo "Recoding unpadded $$f into DER into XER and back ($$b)..."; \ - ./${TARGET} -b $$b -per-nopad -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -b $$b -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -b $$b -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ - diff $$f ./.tmp.1.$$$$ || exit 2; \ + echo "Recoding $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 3; \ + ./${TARGET} -b $$b -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 4; \ + ./${TARGET} -b $$b -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 5; \ + diff $$f ./.tmp.1.$$$$ || exit 6; \ rm -f ./.tmp.[12].$$$$; \ echo "Test junking $$f (please wait)..."; \ - ./${TARGET} -J0.0001 -n 1000 -b $$b -per-nopad -iper -onull $$f || exit 2; \ - ./${TARGET} -J0.001 -n 1000 -b $$b -per-nopad -iper -onull $$f || exit 2; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -iper -onull $$f || exit 7; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -iper -onull $$f || exit 8; \ done; done; fi distclean: clean diff --git a/skeletons/converter-sample.c b/skeletons/converter-sample.c index 1e541c998..4f5b8ed27 100644 --- a/skeletons/converter-sample.c +++ b/skeletons/converter-sample.c @@ -15,7 +15,6 @@ #include /* for getopt(3) */ #include /* for strerror(3) */ #include /* for EX_* exit codes */ -#include /* for assert(3) */ #include /* for errno */ #include @@ -43,7 +42,7 @@ static char *argument_to_name(char *av[], int idx); int opt_debug; /* -d (or -dd) */ static int opt_check; /* -c (constraints checking) */ static int opt_stack; /* -s (maximum stack size) */ -static int opt_ippad; /* -per-padded (PER input is byte-padded) */ +static int opt_nopad; /* -per-nopad (PER input is not padded) */ static int opt_onepdu; /* -1 (decode single PDU) */ /* Input data format selector */ @@ -146,8 +145,8 @@ main(int ac, char *av[]) { } break; case 'p': - if(strcmp(optarg, "er-padded") == 0) { - opt_ippad = 1; + if(strcmp(optarg, "er-nopad") == 0) { + opt_nopad = 1; break; } #ifdef ASN_PDU_COLLECTION @@ -207,7 +206,7 @@ main(int ac, char *av[]) { " -onull Verify (decode) input, but do not output\n"); if(pduType->uper_decoder) fprintf(stderr, - " -per-padded Assume PER PDUs are byte-padded (-iper)\n"); + " -per-nopad Assume PER PDUs are not padded (-iper)\n"); #ifdef ASN_PDU_COLLECTION fprintf(stderr, " -p Specify PDU type to decode\n" @@ -631,23 +630,24 @@ data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *na (void **)&structure, i_bptr, i_size); break; case INP_PER: + if(opt_nopad) rval = uper_decode(opt_codec_ctx, pduType, (void **)&structure, i_bptr, i_size, 0, DynamicBuffer.unbits); - /* PER requires returns number of bits, but a catch! */ + else + rval = uper_decode_complete(opt_codec_ctx, pduType, + (void **)&structure, i_bptr, i_size); switch(rval.code) { case RC_OK: - /* Check if input is byte-padded at the end */ - if(opt_ippad && (rval.consumed % 8)) { - rval.consumed /= 8; - rval.consumed++; - ecbits = 0; - break; - } /* Fall through */ case RC_FAIL: - ecbits = rval.consumed % 8; /* Extra bits */ - rval.consumed /= 8; /* Convert into bytes! */ + if(opt_nopad) { + /* uper_decode() returns bits! */ + /* Extra bits */ + ecbits = rval.consumed % 8; + /* Convert into bytes! */ + rval.consumed /= 8; + } break; case RC_WMORE: /* PER does not support restartability */ diff --git a/skeletons/per_decoder.c b/skeletons/per_decoder.c index de9dc5503..2b3d2e298 100644 --- a/skeletons/per_decoder.c +++ b/skeletons/per_decoder.c @@ -2,6 +2,40 @@ #include #include +/* + * Decode a "Production of a complete encoding", X.691#10.1. + * The complete encoding contains at least one byte, and is an integral + * multiple of 8 bytes. + */ +asn_dec_rval_t +uper_decode_complete(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buffer, size_t size) { + asn_dec_rval_t rval; + + rval = uper_decode(opt_codec_ctx, td, sptr, buffer, size, 0, 0); + if(rval.consumed) { + /* + * We've always given 8-aligned data, + * so convert bits to integral bytes. + */ + rval.consumed += 7; + rval.consumed >>= 3; + } else if(rval.code == RC_OK) { + if(size) { + if(((uint8_t *)buffer)[0] == 0) { + rval.consumed = 1; /* 1 byte */ + } else { + ASN_DEBUG("Expecting single zeroed byte"); + rval.code = RC_FAIL; + } + } else { + /* Must contain at least 8 bits. */ + rval.code = RC_WMORE; + } + } + + return rval; +} + asn_dec_rval_t uper_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buffer, size_t size, int skip_bits, int unused_bits) { asn_codec_ctx_t s_codec_ctx; diff --git a/skeletons/per_decoder.h b/skeletons/per_decoder.h index 26aaf5940..8397a545f 100644 --- a/skeletons/per_decoder.h +++ b/skeletons/per_decoder.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2005 Lev Walkin . All rights reserved. + * Copyright (c) 2005, 2007 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _PER_DECODER_H_ @@ -14,8 +14,20 @@ extern "C" { struct asn_TYPE_descriptor_s; /* Forward declaration */ +/* + * Unaligned PER decoder of a "complete encoding" as per X.691#10.1. + * On success, this call always returns (.consumed >= 1), as per X.691#10.1.3. + */ +asn_dec_rval_t uper_decode_complete(struct asn_codec_ctx_s *opt_codec_ctx, + struct asn_TYPE_descriptor_s *type_descriptor, /* Type to decode */ + void **struct_ptr, /* Pointer to a target structure's pointer */ + const void *buffer, /* Data to be decoded */ + size_t size /* Size of data buffer */ + ); + /* * Unaligned PER decoder of any ASN.1 type. May be invoked by the application. + * WARNING: This call returns the number of BITS read from the stream. Beware. */ asn_dec_rval_t uper_decode(struct asn_codec_ctx_s *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, /* Type to decode */ From 9235d8ba90be7027ba6c36dbdffdbc42e30c310f Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 08:31:05 +0000 Subject: [PATCH 1322/1469] binary data remains binary git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1330 59561ff5-6e30-0410-9f3c-9617f08c8826 From ad471afef3fce4dc93fdfba65c61e4532a5b09a0 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 08:33:51 +0000 Subject: [PATCH 1323/1469] proper file, not tampered with by svn git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1331 59561ff5-6e30-0410-9f3c-9617f08c8826 --- .../sample-Certificate-1.der | Bin 1128 -> 1128 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/sample.source.PKIX1/sample-Certificate-1.der b/examples/sample.source.PKIX1/sample-Certificate-1.der index 972ca914eda95eeabd95b9312749ebb63961f0c2..e82877d1b464fe79a0c3b3aca04ba7058e8b487c 100644 GIT binary patch delta 80 zcmaFC@q%N50w*sUr&gOs+jriHn(G93EiDbq4J-{UOe~Boqr`b9KHq^*FnI-IBqQ%; TCZ=FUB*8f5yNtY(ZCG>wvd9+5 delta 80 zcmaFC@q%N50w)(6r&gOs+jp*sn(G9(EG-Sp4J-{UOe~Boqr|x;KHq^*FnI-IBqP^m TCZ=FUB*8f5yNq0uZCG>wu3#3b From 986d2926805b4f3289395278db25bd5c9efbedbb Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 08:36:39 +0000 Subject: [PATCH 1324/1469] per changes git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1332 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.LDAP3/Makefile | 52 +++++++++++++------------- examples/sample.source.TAP3/Makefile | 54 +++++++++++++-------------- 2 files changed, 53 insertions(+), 53 deletions(-) diff --git a/examples/sample.source.LDAP3/Makefile b/examples/sample.source.LDAP3/Makefile index ed190fc89..b47bbcc81 100644 --- a/examples/sample.source.LDAP3/Makefile +++ b/examples/sample.source.LDAP3/Makefile @@ -210,12 +210,12 @@ check-ber: for b in 1 17 33 980 8192; do \ echo "Recoding $$f into XER and back ($$b)..."; \ ./${TARGET} -b $$b -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -b $$b -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -b $$b -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 4; \ rm -f ./.tmp.[12].$$$$; \ echo "Test junking $$f (please wait)..."; \ - ./${TARGET} -J0.0001 -n 1000 -b $$b -iber -onull $$f || exit 2; \ - ./${TARGET} -J0.001 -n 1000 -b $$b -iber -onull $$f || exit 2; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -iber -onull $$f || exit 5; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -iber -onull $$f || exit 6; \ done; done; fi check-xer: @@ -224,41 +224,41 @@ check-xer: for b in 1 17 33 980 8192; do \ echo "Recoding $$f into DER and back ($$b)..."; \ ./${TARGET} -b $$b -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - diff $$f ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \ + diff $$f ./.tmp.2.$$$$ || exit 4; \ rm -f ./.tmp.[12].$$$$; \ echo "Test junking $$f (please wait)..."; \ - ./${TARGET} -J0.0001 -n 1000 -b $$b -ixer -onull $$f || exit 2; \ - ./${TARGET} -J0.001 -n 1000 -b $$b -ixer -onull $$f || exit 2; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -ixer -onull $$f || exit 5; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -ixer -onull $$f || exit 6; \ done; done; fi check-per: - @if test -f sample-LDAPMessage-1.per ; then \ - for f in sample-LDAPMessage-[1-9].per; do \ + @if test -f sample-LDAPMessage-1-nopad.per ; then \ + for f in sample-LDAPMessage-[1-9]-nopad.per; do \ for b in 1 17 33 980 8192; do \ - echo "Recoding $$f into DER into XER and back ($$b)..."; \ - ./${TARGET} -b $$b -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -b $$b -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \ - diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 2; \ + echo "Recoding non-padded $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -per-nopad -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \ + ./${TARGET} -b $$b -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 4; \ + diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 5; \ rm -f ./.tmp.[123].$$$$; \ echo "Test junking $$f (please wait)..."; \ - ./${TARGET} -J0.0001 -n 1000 -b $$b -iper -onull $$f || exit 2; \ - ./${TARGET} -J0.001 -n 1000 -b $$b -iper -onull $$f || exit 2; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -per-nopad -iper -onull $$f || exit 6; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -per-nopad -iper -onull $$f || exit 7; \ done; done; fi - @if test -f sample-LDAPMessage-1-padded.per ; then \ - for f in sample-*-[1-9]-padded.per; do \ + @if test -f sample-LDAPMessage-1.per ; then \ + for f in sample-*-[1-9].per; do \ pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z-]+)-[0-9].*/\1/"`; \ for b in 1 17 33 980 8192; do \ - echo "Recoding byte-padded $$f into DER into XER and back ($$b)..."; \ - ./${TARGET} -b $$b -per-padded -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -b $$b -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -b $$b -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ - diff $$f ./.tmp.1.$$$$ || exit 2; \ + echo "Recoding $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 3; \ + ./${TARGET} -b $$b -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 4; \ + ./${TARGET} -b $$b -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 5; \ + diff $$f ./.tmp.1.$$$$ || exit 6; \ rm -f ./.tmp.[12].$$$$; \ echo "Test junking $$f (please wait)..."; \ - ./${TARGET} -J0.0001 -n 1000 -b $$b -per-padded -iper -onull $$f || exit 2; \ - ./${TARGET} -J0.001 -n 1000 -b $$b -per-padded -iper -onull $$f || exit 2; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -iper -onull $$f || exit 7; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -iper -onull $$f || exit 8; \ done; done; fi distclean: clean diff --git a/examples/sample.source.TAP3/Makefile b/examples/sample.source.TAP3/Makefile index ac783655e..491d08cea 100644 --- a/examples/sample.source.TAP3/Makefile +++ b/examples/sample.source.TAP3/Makefile @@ -700,7 +700,7 @@ clean: regen: regenerate-from-asn1-source regenerate-from-asn1-source: - asn1c -pdu=DataInterChange ../tap3.asn1 + ../../asn1c/asn1c -S ../../skeletons -pdu=DataInterChange ../tap3.asn1 DataInterChange.c: ../sample.makefile.regen ../tap3.asn1 @@ -726,12 +726,12 @@ check-ber: for b in 1 17 33 980 8192; do \ echo "Recoding $$f into XER and back ($$b)..."; \ ./${TARGET} -b $$b -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -b $$b -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -b $$b -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 4; \ rm -f ./.tmp.[12].$$$$; \ echo "Test junking $$f (please wait)..."; \ - ./${TARGET} -J0.0001 -n 1000 -b $$b -iber -onull $$f || exit 2; \ - ./${TARGET} -J0.001 -n 1000 -b $$b -iber -onull $$f || exit 2; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -iber -onull $$f || exit 5; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -iber -onull $$f || exit 6; \ done; done; fi check-xer: @@ -740,41 +740,41 @@ check-xer: for b in 1 17 33 980 8192; do \ echo "Recoding $$f into DER and back ($$b)..."; \ ./${TARGET} -b $$b -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - diff $$f ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \ + diff $$f ./.tmp.2.$$$$ || exit 4; \ rm -f ./.tmp.[12].$$$$; \ echo "Test junking $$f (please wait)..."; \ - ./${TARGET} -J0.0001 -n 1000 -b $$b -ixer -onull $$f || exit 2; \ - ./${TARGET} -J0.001 -n 1000 -b $$b -ixer -onull $$f || exit 2; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -ixer -onull $$f || exit 5; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -ixer -onull $$f || exit 6; \ done; done; fi check-per: - @if test -f sample-DataInterChange-1.per ; then \ - for f in sample-DataInterChange-[1-9].per; do \ + @if test -f sample-DataInterChange-1-nopad.per ; then \ + for f in sample-DataInterChange-[1-9]-nopad.per; do \ for b in 1 17 33 980 8192; do \ - echo "Recoding $$f into DER into XER and back ($$b)..."; \ - ./${TARGET} -b $$b -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -b $$b -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \ - diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 2; \ + echo "Recoding non-padded $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -per-nopad -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \ + ./${TARGET} -b $$b -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 4; \ + diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 5; \ rm -f ./.tmp.[123].$$$$; \ echo "Test junking $$f (please wait)..."; \ - ./${TARGET} -J0.0001 -n 1000 -b $$b -iper -onull $$f || exit 2; \ - ./${TARGET} -J0.001 -n 1000 -b $$b -iper -onull $$f || exit 2; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -per-nopad -iper -onull $$f || exit 6; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -per-nopad -iper -onull $$f || exit 7; \ done; done; fi - @if test -f sample-DataInterChange-1-padded.per ; then \ - for f in sample-*-[1-9]-padded.per; do \ + @if test -f sample-DataInterChange-1.per ; then \ + for f in sample-*-[1-9].per; do \ pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z-]+)-[0-9].*/\1/"`; \ for b in 1 17 33 980 8192; do \ - echo "Recoding byte-padded $$f into DER into XER and back ($$b)..."; \ - ./${TARGET} -b $$b -per-padded -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -b $$b -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -b $$b -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ - diff $$f ./.tmp.1.$$$$ || exit 2; \ + echo "Recoding $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 3; \ + ./${TARGET} -b $$b -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 4; \ + ./${TARGET} -b $$b -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 5; \ + diff $$f ./.tmp.1.$$$$ || exit 6; \ rm -f ./.tmp.[12].$$$$; \ echo "Test junking $$f (please wait)..."; \ - ./${TARGET} -J0.0001 -n 1000 -b $$b -per-padded -iper -onull $$f || exit 2; \ - ./${TARGET} -J0.001 -n 1000 -b $$b -per-padded -iper -onull $$f || exit 2; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -iper -onull $$f || exit 7; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -iper -onull $$f || exit 8; \ done; done; fi distclean: clean From eab0cdd61c890348aedc91948b56aef105dbc071 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 08:37:20 +0000 Subject: [PATCH 1325/1469] per changes git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1333 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.PKIX1/Makefile | 52 +++++++++++++-------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index 1a79ca7f4..da4029e4b 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -392,12 +392,12 @@ check-ber: for b in 1 17 33 980 8192; do \ echo "Recoding $$f into XER and back ($$b)..."; \ ./${TARGET} -b $$b -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -b $$b -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -b $$b -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 4; \ rm -f ./.tmp.[12].$$$$; \ echo "Test junking $$f (please wait)..."; \ - ./${TARGET} -J0.0001 -n 1000 -b $$b -iber -onull $$f || exit 2; \ - ./${TARGET} -J0.001 -n 1000 -b $$b -iber -onull $$f || exit 2; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -iber -onull $$f || exit 5; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -iber -onull $$f || exit 6; \ done; done; fi check-xer: @@ -406,41 +406,41 @@ check-xer: for b in 1 17 33 980 8192; do \ echo "Recoding $$f into DER and back ($$b)..."; \ ./${TARGET} -b $$b -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - diff $$f ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \ + diff $$f ./.tmp.2.$$$$ || exit 4; \ rm -f ./.tmp.[12].$$$$; \ echo "Test junking $$f (please wait)..."; \ - ./${TARGET} -J0.0001 -n 1000 -b $$b -ixer -onull $$f || exit 2; \ - ./${TARGET} -J0.001 -n 1000 -b $$b -ixer -onull $$f || exit 2; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -ixer -onull $$f || exit 5; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -ixer -onull $$f || exit 6; \ done; done; fi check-per: - @if test -f sample-Certificate-1.per ; then \ - for f in sample-Certificate-[1-9].per; do \ + @if test -f sample-Certificate-1-nopad.per ; then \ + for f in sample-Certificate-[1-9]-nopad.per; do \ for b in 1 17 33 980 8192; do \ - echo "Recoding $$f into DER into XER and back ($$b)..."; \ - ./${TARGET} -b $$b -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -b $$b -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \ - diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 2; \ + echo "Recoding non-padded $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -per-nopad -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \ + ./${TARGET} -b $$b -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 4; \ + diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 5; \ rm -f ./.tmp.[123].$$$$; \ echo "Test junking $$f (please wait)..."; \ - ./${TARGET} -J0.0001 -n 1000 -b $$b -iper -onull $$f || exit 2; \ - ./${TARGET} -J0.001 -n 1000 -b $$b -iper -onull $$f || exit 2; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -per-nopad -iper -onull $$f || exit 6; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -per-nopad -iper -onull $$f || exit 7; \ done; done; fi - @if test -f sample-Certificate-1-padded.per ; then \ - for f in sample-*-[1-9]-padded.per; do \ + @if test -f sample-Certificate-1.per ; then \ + for f in sample-*-[1-9].per; do \ pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z-]+)-[0-9].*/\1/"`; \ for b in 1 17 33 980 8192; do \ - echo "Recoding byte-padded $$f into DER into XER and back ($$b)..."; \ - ./${TARGET} -b $$b -per-padded -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -b $$b -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -b $$b -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ - diff $$f ./.tmp.1.$$$$ || exit 2; \ + echo "Recoding $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 3; \ + ./${TARGET} -b $$b -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 4; \ + ./${TARGET} -b $$b -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 5; \ + diff $$f ./.tmp.1.$$$$ || exit 6; \ rm -f ./.tmp.[12].$$$$; \ echo "Test junking $$f (please wait)..."; \ - ./${TARGET} -J0.0001 -n 1000 -b $$b -per-padded -iper -onull $$f || exit 2; \ - ./${TARGET} -J0.001 -n 1000 -b $$b -per-padded -iper -onull $$f || exit 2; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -iper -onull $$f || exit 7; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -iper -onull $$f || exit 8; \ done; done; fi distclean: clean From 9a36220869b7e2fafb1be75ebba9ce1639140c56 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 09:22:10 +0000 Subject: [PATCH 1326/1469] .tmp files ignored git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1334 59561ff5-6e30-0410-9f3c-9617f08c8826 From 71bb6ccf6a7c8c0fa5c49d1a4d217444af39de13 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 09:25:38 +0000 Subject: [PATCH 1327/1469] -C git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1335 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/data-126/README | 1 + asn1c/tests/data-126/data-126-09-C.in | 3 +++ asn1c/tests/data-126/data-126-09-C.out | Bin 0 -> 4 bytes 3 files changed, 4 insertions(+) create mode 100644 asn1c/tests/data-126/data-126-09-C.in create mode 100644 asn1c/tests/data-126/data-126-09-C.out diff --git a/asn1c/tests/data-126/README b/asn1c/tests/data-126/README index 07ff013e6..6201b6c8c 100644 --- a/asn1c/tests/data-126/README +++ b/asn1c/tests/data-126/README @@ -6,5 +6,6 @@ Mode of operation: Naming conventions: +*-C.in - Comparison of .out might fail, but decoding succeeds *-P.in - PER decoding of .out file must fail. diff --git a/asn1c/tests/data-126/data-126-09-C.in b/asn1c/tests/data-126/data-126-09-C.in new file mode 100644 index 000000000..d01eb548e --- /dev/null +++ b/asn1c/tests/data-126/data-126-09-C.in @@ -0,0 +1,3 @@ + + + diff --git a/asn1c/tests/data-126/data-126-09-C.out b/asn1c/tests/data-126/data-126-09-C.out new file mode 100644 index 0000000000000000000000000000000000000000..1b6cb8f29ed03756185f65c914a5528772867476 GIT binary patch literal 4 LcmZp2P+$N60}KG; literal 0 HcmV?d00001 From 232c4b987df53afafc448d093cb4d56a9cd62297 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 09:43:52 +0000 Subject: [PATCH 1328/1469] special git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1336 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/data-126/data-126-10-C.in | 3 +++ asn1c/tests/data-126/data-126-10-C.out | Bin 0 -> 6 bytes 2 files changed, 3 insertions(+) create mode 100644 asn1c/tests/data-126/data-126-10-C.in create mode 100644 asn1c/tests/data-126/data-126-10-C.out diff --git a/asn1c/tests/data-126/data-126-10-C.in b/asn1c/tests/data-126/data-126-10-C.in new file mode 100644 index 000000000..d01eb548e --- /dev/null +++ b/asn1c/tests/data-126/data-126-10-C.in @@ -0,0 +1,3 @@ + + + diff --git a/asn1c/tests/data-126/data-126-10-C.out b/asn1c/tests/data-126/data-126-10-C.out new file mode 100644 index 0000000000000000000000000000000000000000..fe55c5f8b65b5260299214311d337626a2b3db1b GIT binary patch literal 6 NcmbQ>z`)SJ000H10Z{+| literal 0 HcmV?d00001 From 32193f184bcdafd559fd5a8c3d5f71de30e71378 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 09:52:44 +0000 Subject: [PATCH 1329/1469] decoding unknown extensions git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1337 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SEQUENCE.c | 44 +++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 8af6cb9d4..ad737ffb4 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -1210,10 +1210,33 @@ uper_get_open_type(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, return rv; } +asn_dec_rval_t +uper_sot_suck(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_dec_rval_t rv; + + (void)opt_codec_ctx; + (void)td; + (void)constraints; + (void)sptr; + + while(per_get_few_bits(pd, 24) >= 0); + + rv.code = RC_OK; + rv.consumed = pd->moved; + + return rv; +} + static int uper_skip_open_type(asn_codec_ctx_t *opt_codec_ctx, asn_per_data_t *pd) { + asn_TYPE_descriptor_t s_td; asn_dec_rval_t rv; - rv = uper_get_open_type(opt_codec_ctx, 0, 0, 0, pd); + + s_td.name = ""; + s_td.uper_decoder = uper_sot_suck; + + rv = uper_get_open_type(opt_codec_ctx, &s_td, 0, 0, pd); if(rv.code != RC_OK) return -1; else @@ -1387,11 +1410,17 @@ SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, /* Skip over overflow extensions which aren't present * in this system's version of the protocol */ - while(per_get_few_bits(&epmd, 1) >= 0) { - if(uper_skip_open_type(opt_codec_ctx, pd)) { - FREEMEM(epres); - _ASN_DECODE_STARVED; + for(;;) { + switch(per_get_few_bits(&epmd, 1)) { + case -1: break; + case 0: continue; + default: + if(uper_skip_open_type(opt_codec_ctx, pd)) { + FREEMEM(epres); + _ASN_DECODE_STARVED; + } } + break; } FREEMEM(epres); @@ -1445,7 +1474,7 @@ SEQUENCE_handle_extensions(asn_TYPE_descriptor_t *td, void *sptr, int present; if(!IN_EXTENSION_GROUP(specs, edx)) { - ASN_DEBUG("%d is not extension", edx); + ASN_DEBUG("%s (@%d) is not extension", elm->type->name, edx); continue; } @@ -1459,7 +1488,8 @@ SEQUENCE_handle_extensions(asn_TYPE_descriptor_t *td, void *sptr, present = 1; } - ASN_DEBUG("checking ext %d is present => %d", edx, present); + ASN_DEBUG("checking %s (@%d) present => %d", + elm->type->name, edx, present); exts_count++; exts_present += present; From 4707db76858be9d3d9f441a64f2d2b67f9e977bb Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 09:54:17 +0000 Subject: [PATCH 1330/1469] diverging git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1338 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-126.-gen-PER.c | 45 ++++++++++---------------------- 1 file changed, 14 insertions(+), 31 deletions(-) diff --git a/asn1c/tests/check-126.-gen-PER.c b/asn1c/tests/check-126.-gen-PER.c index 86244efd0..db210b4c0 100644 --- a/asn1c/tests/check-126.-gen-PER.c +++ b/asn1c/tests/check-126.-gen-PER.c @@ -230,45 +230,23 @@ compare_with_data_out(const char *fname, char *buf, int size) { char fbuf[1024]; size_t rd; FILE *f; + char lastChar; + int mustfail, compare; sprintf(outName, "../data-126/%s", fname); strcpy(outName + strlen(outName) - 3, ".out"); fprintf(stderr, "Comparing PER output with [%s]\n", outName); - if(strstr(outName, "-06-P.out")) { - f = fopen(outName, "w"); - fbuf[0] = 0x81; - fbuf[1] = 0x40; - fbuf[2] = 0x00; - fwrite(fbuf, 1, 3, f); - fclose(f); - } - - if(strstr(outName, "-07-P.out")) { - f = fopen(outName, "w"); - fbuf[0] = 0x81; - fbuf[1] = 0x40; - fbuf[2] = 0x40; - fwrite(fbuf, 1, 3, f); - fclose(f); - } + lastChar = outName[strlen(outName)-5]; + mustfail = lastChar == 'P'; + compare = lastChar != 'C'; - if(strstr(outName, "-08-P.out")) { - f = fopen(outName, "w"); - fbuf[0] = 0x81; - fbuf[1] = 0x40; - fbuf[2] = 0x80; - fwrite(fbuf, 1, 3, f); - fclose(f); - } - - if(getenv("REGENERATE")) { + if(compare && getenv("REGENERATE")) { f = fopen(outName, "w"); fwrite(buf, 1, size, f); fclose(f); } else { - int mustfail = outName[strlen(outName)-5] == 'P'; f = fopen(outName, "r"); assert(f); rd = fread(fbuf, 1, sizeof(fbuf), f); @@ -279,9 +257,14 @@ compare_with_data_out(const char *fname, char *buf, int size) { load_object_from(outName, fbuf, rd, AS_PER, mustfail); if(mustfail) return; - assert(rd == (size_t)size); - assert(memcmp(fbuf, buf, rd) == 0); - fprintf(stderr, "XER->PER recoding .in->.out match.\n"); + if(compare) { + assert(rd == (size_t)size); + assert(memcmp(fbuf, buf, rd) == 0); + fprintf(stderr, "XER->PER recoding .in->.out match.\n"); + } else { + assert(rd != (size_t)size || memcmp(fbuf, buf, rd)); + fprintf(stderr, "XER->PER recoding .in->.out diverge.\n"); + } } } From c8386493877419f07039b3961f1db4a25ae6642e Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 09:55:21 +0000 Subject: [PATCH 1331/1469] new data git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1339 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/data-126/data-126-11-C.in | 3 +++ asn1c/tests/data-126/data-126-11-C.out | Bin 0 -> 4 bytes 2 files changed, 3 insertions(+) create mode 100644 asn1c/tests/data-126/data-126-11-C.in create mode 100644 asn1c/tests/data-126/data-126-11-C.out diff --git a/asn1c/tests/data-126/data-126-11-C.in b/asn1c/tests/data-126/data-126-11-C.in new file mode 100644 index 000000000..d01eb548e --- /dev/null +++ b/asn1c/tests/data-126/data-126-11-C.in @@ -0,0 +1,3 @@ + + + diff --git a/asn1c/tests/data-126/data-126-11-C.out b/asn1c/tests/data-126/data-126-11-C.out new file mode 100644 index 0000000000000000000000000000000000000000..0f23c822888fda0c6adba98531da0515d72fa2b0 GIT binary patch literal 4 LcmZp4a9{uc14sb^ literal 0 HcmV?d00001 From 3b04fba8fd226cf50e6f6ffbbf11ca58f2960306 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 10:02:00 +0000 Subject: [PATCH 1332/1469] removed eol-style git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1340 59561ff5-6e30-0410-9f3c-9617f08c8826 From 2fca3ee87563d310e94e97e12c5e58edd3162160 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 10:14:11 +0000 Subject: [PATCH 1333/1469] new twists git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1341 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-126.-gen-PER.c | 2 +- asn1c/tests/data-126/data-126-01.out | Bin 4 -> 4 bytes skeletons/constr_CHOICE.c | 2 +- tests/126-per-extensions-OK.asn1 | 12 +++++++++++- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/asn1c/tests/check-126.-gen-PER.c b/asn1c/tests/check-126.-gen-PER.c index db210b4c0..b28ed7999 100644 --- a/asn1c/tests/check-126.-gen-PER.c +++ b/asn1c/tests/check-126.-gen-PER.c @@ -242,7 +242,7 @@ compare_with_data_out(const char *fname, char *buf, int size) { mustfail = lastChar == 'P'; compare = lastChar != 'C'; - if(compare && getenv("REGENERATE")) { + if((compare && !mustfail) && getenv("REGENERATE")) { f = fopen(outName, "w"); fwrite(buf, 1, size, f); fclose(f); diff --git a/asn1c/tests/data-126/data-126-01.out b/asn1c/tests/data-126/data-126-01.out index 0f23c822888fda0c6adba98531da0515d72fa2b0..776f21344d954b0c47f40172c106f4e468fd6eb2 100644 GIT binary patch literal 4 LcmZp65MTfR0`LIT literal 4 LcmZp4a9{uc14sb^ diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 4c5414de2..912febebc 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, 2005, 2006 Lev Walkin . + * Copyright (c) 2003, 2004, 2005, 2006, 2007 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ diff --git a/tests/126-per-extensions-OK.asn1 b/tests/126-per-extensions-OK.asn1 index c4729d326..26503cd06 100644 --- a/tests/126-per-extensions-OK.asn1 +++ b/tests/126-per-extensions-OK.asn1 @@ -14,7 +14,17 @@ BEGIN PDU ::= SEQUENCE { ..., str-o IA5String OPTIONAL, - str-m IA5String + str-m IA5String, + singl Singleton, + pdu-2 PDU-2 + } + + Singleton ::= SEQUENCE { + mandatory IA5String DEFAULT "z" + } + + PDU-2 ::= CHOICE { + str-p2 IA5String } END From 1ee15e3c2d1299a2f992364cb22fea50f62edcac Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 10:24:36 +0000 Subject: [PATCH 1334/1469] no eol-style git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1342 59561ff5-6e30-0410-9f3c-9617f08c8826 From f99b211e77b6bba9e4568585561a30b9eb5e36a0 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 10:25:34 +0000 Subject: [PATCH 1335/1469] no eol-style git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1343 59561ff5-6e30-0410-9f3c-9617f08c8826 From 110cf50b26601db2555bfc455fc05b4195dd5273 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 23:54:13 +0000 Subject: [PATCH 1336/1469] new data git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1344 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/data-126/data-126-12.in | 4 ++++ asn1c/tests/data-126/data-126-12.out | Bin 0 -> 7 bytes asn1c/tests/data-126/data-126-13.in | 4 ++++ asn1c/tests/data-126/data-126-13.out | Bin 0 -> 8 bytes asn1c/tests/data-126/data-126-14.in | 4 ++++ asn1c/tests/data-126/data-126-14.out | Bin 0 -> 9 bytes asn1c/tests/data-126/data-126-15.in | 4 ++++ asn1c/tests/data-126/data-126-15.out | Bin 0 -> 7 bytes asn1c/tests/data-126/data-126-16.in | 4 ++++ asn1c/tests/data-126/data-126-16.out | 1 + asn1c/tests/data-126/data-126-17.in | 4 ++++ asn1c/tests/data-126/data-126-17.out | 1 + 12 files changed, 26 insertions(+) create mode 100644 asn1c/tests/data-126/data-126-12.in create mode 100644 asn1c/tests/data-126/data-126-12.out create mode 100644 asn1c/tests/data-126/data-126-13.in create mode 100644 asn1c/tests/data-126/data-126-13.out create mode 100644 asn1c/tests/data-126/data-126-14.in create mode 100644 asn1c/tests/data-126/data-126-14.out create mode 100644 asn1c/tests/data-126/data-126-15.in create mode 100644 asn1c/tests/data-126/data-126-15.out create mode 100644 asn1c/tests/data-126/data-126-16.in create mode 100644 asn1c/tests/data-126/data-126-16.out create mode 100644 asn1c/tests/data-126/data-126-17.in create mode 100644 asn1c/tests/data-126/data-126-17.out diff --git a/asn1c/tests/data-126/data-126-12.in b/asn1c/tests/data-126/data-126-12.in new file mode 100644 index 000000000..2b17d34a4 --- /dev/null +++ b/asn1c/tests/data-126/data-126-12.in @@ -0,0 +1,4 @@ + + + + diff --git a/asn1c/tests/data-126/data-126-12.out b/asn1c/tests/data-126/data-126-12.out new file mode 100644 index 0000000000000000000000000000000000000000..095b6fe76b72e276a4b7c90b2419ccbd16c0bed2 GIT binary patch literal 7 OcmZop5Ma + a + + diff --git a/asn1c/tests/data-126/data-126-13.out b/asn1c/tests/data-126/data-126-13.out new file mode 100644 index 0000000000000000000000000000000000000000..0b771834b3d288c6115405ea7c023a1759d5aadb GIT binary patch literal 8 PcmZopP>@m3U|;|M2?POX literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-126/data-126-14.in b/asn1c/tests/data-126/data-126-14.in new file mode 100644 index 000000000..eacad9190 --- /dev/null +++ b/asn1c/tests/data-126/data-126-14.in @@ -0,0 +1,4 @@ + + ab + + diff --git a/asn1c/tests/data-126/data-126-14.out b/asn1c/tests/data-126/data-126-14.out new file mode 100644 index 0000000000000000000000000000000000000000..d0447630f820b35d30a928e38ebe39e93e32da50 GIT binary patch literal 9 QcmZopFwn7R&|qKy01b=+AOHXW literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-126/data-126-15.in b/asn1c/tests/data-126/data-126-15.in new file mode 100644 index 000000000..add216d67 --- /dev/null +++ b/asn1c/tests/data-126/data-126-15.in @@ -0,0 +1,4 @@ + + + z + diff --git a/asn1c/tests/data-126/data-126-15.out b/asn1c/tests/data-126/data-126-15.out new file mode 100644 index 0000000000000000000000000000000000000000..3de83749dbd0b0c5db412fa484c65c8d788d3f0a GIT binary patch literal 7 OcmZop5Ma>YUjP6HVgbtl literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-126/data-126-16.in b/asn1c/tests/data-126/data-126-16.in new file mode 100644 index 000000000..58c0bb5a7 --- /dev/null +++ b/asn1c/tests/data-126/data-126-16.in @@ -0,0 +1,4 @@ + + a + z + diff --git a/asn1c/tests/data-126/data-126-16.out b/asn1c/tests/data-126/data-126-16.out new file mode 100644 index 000000000..88371928c --- /dev/null +++ b/asn1c/tests/data-126/data-126-16.out @@ -0,0 +1 @@ +ƒ`  (  \ No newline at end of file diff --git a/asn1c/tests/data-126/data-126-17.in b/asn1c/tests/data-126/data-126-17.in new file mode 100644 index 000000000..74e870eea --- /dev/null +++ b/asn1c/tests/data-126/data-126-17.in @@ -0,0 +1,4 @@ + + ab + z + diff --git a/asn1c/tests/data-126/data-126-17.out b/asn1c/tests/data-126/data-126-17.out new file mode 100644 index 000000000..47962bc35 --- /dev/null +++ b/asn1c/tests/data-126/data-126-17.out @@ -0,0 +1 @@ +ƒ`0,8€(  \ No newline at end of file From 182758f3d7ed96627de9135a0d283feb19a98a2e Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 23:56:54 +0000 Subject: [PATCH 1337/1469] instrumentation git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1345 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/check-126.-gen-PER.c | 2 +- skeletons/constr_SEQUENCE.c | 35 +++++++++++++++++++++++--------- skeletons/per_encoder.c | 1 + skeletons/per_encoder.h | 4 ++-- skeletons/per_support.c | 21 +++++++++++-------- tests/126-per-extensions-OK.asn1 | 7 ++++--- 6 files changed, 45 insertions(+), 25 deletions(-) diff --git a/asn1c/tests/check-126.-gen-PER.c b/asn1c/tests/check-126.-gen-PER.c index b28ed7999..8b590b18d 100644 --- a/asn1c/tests/check-126.-gen-PER.c +++ b/asn1c/tests/check-126.-gen-PER.c @@ -104,7 +104,7 @@ load_object_from(const char *fname, char *fbuf, int size, enum enctype how, int st = 0; do { - fprintf(stderr, "Decoding bytes %d..%d (left %d) [%s]\n", + fprintf(stderr, "\nDecoding bytes %d..%d (left %d) [%s]\n", fbuf_offset, fbuf_chunk < fbuf_left ? fbuf_chunk : fbuf_left, diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index ad737ffb4..c824c04aa 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -1092,7 +1092,7 @@ uper_ugot_refill(asn_per_data_t *pd) { pd->buffer = oldpd->buffer; pd->nboff = oldpd->nboff - 1; pd->nbits = oldpd->nbits; - ASN_DEBUG("Return from unclaimed"); + ASN_DEBUG("Return from UNCLAIMED"); return 0; } @@ -1133,7 +1133,7 @@ uper_get_open_type(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, _ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx); - ASN_DEBUG("Getting open type from %d bits (%d+%d), %p", pd->nbits - pd->nboff, pd->nboff, pd->nbits, pd->buffer); + ASN_DEBUG("Getting open type off %d (%d+%d), %p", pd->moved, pd->nboff, pd->nbits, pd->buffer); arg.oldpd = *pd; arg.unclaimed = 0; arg.ot_moved = 0; @@ -1149,22 +1149,32 @@ uper_get_open_type(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, td->name, pd->moved, arg.oldpd.moved, arg.unclaimed, arg.repeat); + ASN_DEBUG("OT1 moved %d, estimated %d uncl=%d", + arg.oldpd.moved, + arg.oldpd.nboff + ((((int)arg.oldpd.buffer) & 0x7) << 3), + arg.unclaimed + ); + padding = pd->moved % 8; if(padding) { + int32_t pvalue; if(padding > 7) { ASN_DEBUG("Too large padding %d in open type", padding); rv.code = RC_FAIL; return rv; } + padding = 8 - padding; ASN_DEBUG("Getting padding of %d bits", padding); - switch(per_get_few_bits(pd, padding)) { + pvalue = per_get_few_bits(pd, padding); + switch(pvalue) { case -1: ASN_DEBUG("Padding skip failed"); - _ASN_DECODE_FAILED; + _ASN_DECODE_STARVED; case 0: break; default: - ASN_DEBUG("Non-blank padding"); + ASN_DEBUG("Non-blank padding (%d bits 0x%02x)", + padding, pvalue); _ASN_DECODE_FAILED; } } @@ -1173,15 +1183,15 @@ uper_get_open_type(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, if(1) _ASN_DECODE_FAILED; arg.unclaimed += pd->nbits - pd->nboff; } - arg.oldpd.nbits -= pd->moved - arg.ot_moved; - arg.oldpd.moved += pd->moved - arg.ot_moved; - pd->nboff = arg.oldpd.nboff; - pd->nbits = arg.oldpd.nbits; - pd->moved = arg.oldpd.moved; + + /* Adjust pd back so it points to original data */ + pd->nbits = arg.oldpd.nbits - (pd->moved - arg.ot_moved); + pd->moved = arg.oldpd.moved + (pd->moved - arg.ot_moved); pd->refill = arg.oldpd.refill; pd->refill_key = arg.oldpd.refill_key; /* Skip data not consumed by the decoder */ + if(arg.unclaimed) ASN_DEBUG("Getting unclaimed %d", arg.unclaimed); while(arg.unclaimed) { size_t toget = 24; if(arg.unclaimed < toget) @@ -1201,6 +1211,8 @@ uper_get_open_type(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } } + assert(pd->moved == pd->nboff + ((((int)pd->buffer) & 0x7) << 3)); + if(arg.repeat) { ASN_DEBUG("Not consumed the whole thing"); rv.code = RC_FAIL; @@ -1411,6 +1423,7 @@ SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, /* Skip over overflow extensions which aren't present * in this system's version of the protocol */ for(;;) { + ASN_DEBUG("Getting overflow extensions"); switch(per_get_few_bits(&epmd, 1)) { case -1: break; case 0: continue; @@ -1580,6 +1593,8 @@ SEQUENCE_encode_uper(asn_TYPE_descriptor_t *td, void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ + ASN_DEBUG("About to encode %s", elm->type->name); + /* Fetch the pointer to this member */ if(elm->flags & ATF_POINTER) { memb_ptr2 = (void **)((char *)sptr + elm->memb_offset); diff --git a/skeletons/per_encoder.c b/skeletons/per_encoder.c index 960981adb..f4bace060 100644 --- a/skeletons/per_encoder.c +++ b/skeletons/per_encoder.c @@ -88,6 +88,7 @@ uper_encode_to_new_buffer(asn_TYPE_descriptor_t *td, asn_per_constraints_t *cons } default: *buffer_r = key.buffer; + ASN_DEBUG("Complete encoded in %d bits", er.encoded); return ((er.encoded + 7) >> 3); } } diff --git a/skeletons/per_encoder.h b/skeletons/per_encoder.h index 32de08294..95a6506e4 100644 --- a/skeletons/per_encoder.h +++ b/skeletons/per_encoder.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2006 Lev Walkin . All rights reserved. + * Copyright (c) 2006, 2007 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _PER_ENCODER_H_ @@ -42,7 +42,7 @@ asn_enc_rval_t uper_encode_to_buffer( * A variant of uper_encode_to_buffer() which allocates buffer itself. * Returns the number of bytes in the buffer or -1 in case of failure. * WARNING: This function produces a "Production of the complete encoding", - * with length of at least one octet. Contrast this to precise bit-preserving + * with length of at least one octet. Contrast this to precise bit-packing * encoding of uper_encode() and uper_encode_to_buffer(). */ ssize_t uper_encode_to_new_buffer( diff --git a/skeletons/per_support.c b/skeletons/per_support.c index 6187f2c1e..bfd733aa5 100644 --- a/skeletons/per_support.c +++ b/skeletons/per_support.c @@ -34,7 +34,7 @@ per_get_few_bits(asn_per_data_t *pd, int nbits) { int32_t tailv, vhead; if(!pd->refill || nbits > 31) return -1; /* Accumulate unused bytes before refill */ - ASN_DEBUG("Obtain the rest %d bits", nleft); + ASN_DEBUG("Obtain the rest %d bits (want %d)", nleft, nbits); tailv = per_get_few_bits(pd, nleft); if(tailv < 0) return -1; /* Refill (replace pd contents with new data) */ @@ -47,9 +47,6 @@ per_get_few_bits(asn_per_data_t *pd, int nbits) { return tailv; } - ASN_DEBUG("[PER get %d bits from (%d@%d+%d)]", - nbits, pd->moved, pd->nboff, nleft); - /* * Normalize position indicator. */ @@ -89,7 +86,12 @@ per_get_few_bits(asn_per_data_t *pd, int nbits) { return -1; } - return (accum & (((uint32_t)1 << nbits) - 1)); + accum &= (((uint32_t)1 << nbits) - 1); + + ASN_DEBUG("[PER got %d bits from (%d@%d+%d) => 0x%x]", + nbits, pd->moved, pd->nboff, nleft, accum); + + return accum; } /* @@ -172,12 +174,13 @@ ssize_t uper_get_nslength(asn_per_data_t *pd) { ssize_t length; + ASN_DEBUG("Getting normally small length"); + if(per_get_few_bits(pd, 1) == 0) { - ASN_DEBUG("l=?"); - length = per_get_few_bits(pd, 6); + length = per_get_few_bits(pd, 6) + 1; + if(length <= 0) return -1; ASN_DEBUG("l=%d", length); - if(length < 0) return -1; - return length + 1; + return length; } else { int repeat; length = uper_get_length(pd, -1, &repeat); diff --git a/tests/126-per-extensions-OK.asn1 b/tests/126-per-extensions-OK.asn1 index 26503cd06..3d7086633 100644 --- a/tests/126-per-extensions-OK.asn1 +++ b/tests/126-per-extensions-OK.asn1 @@ -16,15 +16,16 @@ BEGIN str-o IA5String OPTIONAL, str-m IA5String, singl Singleton, - pdu-2 PDU-2 + pdu-2 PDU-2 OPTIONAL } Singleton ::= SEQUENCE { - mandatory IA5String DEFAULT "z" + opt-z IA5String DEFAULT "z" } PDU-2 ::= CHOICE { - str-p2 IA5String + str-p2 IA5String, + ... } END From ee5fe12a259e131a1d842381e12bf4dd1cd075fa Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 26 Jun 2007 23:58:16 +0000 Subject: [PATCH 1338/1469] pdu added git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1346 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/126-per-extensions-OK.asn1.-Pgen-PER | 214 ++++++++++++++++++++- 1 file changed, 206 insertions(+), 8 deletions(-) diff --git a/tests/126-per-extensions-OK.asn1.-Pgen-PER b/tests/126-per-extensions-OK.asn1.-Pgen-PER index 8517c0235..7f7626acc 100644 --- a/tests/126-per-extensions-OK.asn1.-Pgen-PER +++ b/tests/126-per-extensions-OK.asn1.-Pgen-PER @@ -2,8 +2,14 @@ /*** <<< INCLUDES [PDU] >>> ***/ #include +#include "Singleton.h" #include +/*** <<< FWD-DECLS [PDU] >>> ***/ + +struct PDU_2; +struct Singleton; + /*** <<< TYPE-DECLS [PDU] >>> ***/ typedef struct PDU { @@ -13,6 +19,8 @@ typedef struct PDU { */ IA5String_t *str_o /* OPTIONAL */; IA5String_t *str_m; + struct Singleton *singl; + struct PDU_2 *pdu_2 /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; @@ -22,10 +30,14 @@ typedef struct PDU { extern asn_TYPE_descriptor_t asn_DEF_PDU; +/*** <<< POST-INCLUDE [PDU] >>> ***/ + +#include "PDU-2.h" + /*** <<< STAT-DEFS [PDU] >>> ***/ static asn_TYPE_member_t asn_MBR_PDU_1[] = { - { ATF_POINTER, 2, offsetof(struct PDU, str_o), + { ATF_POINTER, 4, offsetof(struct PDU, str_o), .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_IA5String, @@ -34,7 +46,7 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .default_value = 0, .name = "str-o" }, - { ATF_POINTER, 1, offsetof(struct PDU, str_m), + { ATF_POINTER, 3, offsetof(struct PDU, str_m), .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ .type = &asn_DEF_IA5String, @@ -43,24 +55,44 @@ static asn_TYPE_member_t asn_MBR_PDU_1[] = { .default_value = 0, .name = "str-m" }, + { ATF_POINTER, 2, offsetof(struct PDU, singl), + .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_Singleton, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* No PER visible constraints */ + .default_value = 0, + .name = "singl" + }, + { ATF_POINTER, 1, offsetof(struct PDU, pdu_2), + .tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + .tag_mode = +1, /* EXPLICIT tag at current level */ + .type = &asn_DEF_PDU_2, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* No PER visible constraints */ + .default_value = 0, + .name = "pdu-2" + }, }; -static int asn_MAP_PDU_oms_1[] = { 0, 1 }; +static int asn_MAP_PDU_oms_1[] = { 0, 1, 2, 3 }; static ber_tlv_tag_t asn_DEF_PDU_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_PDU_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* str-o at 16 */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* str-m at 17 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* str-m at 17 */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* singl at 18 */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* pdu-2 at 19 */ }; static asn_SEQUENCE_specifics_t asn_SPC_PDU_specs_1 = { sizeof(struct PDU), offsetof(struct PDU, _asn_ctx), asn_MAP_PDU_tag2el_1, - 2, /* Count of tags in the map */ + 4, /* Count of tags in the map */ asn_MAP_PDU_oms_1, /* Optional members */ - 0, 2, /* Root/Additions */ + 0, 4, /* Root/Additions */ -1, /* Start extensions */ - 3 /* Stop extensions */ + 5 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_PDU = { "PDU", @@ -83,7 +115,173 @@ asn_TYPE_descriptor_t asn_DEF_PDU = { /sizeof(asn_DEF_PDU_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_PDU_1, - 2, /* Elements count */ + 4, /* Elements count */ &asn_SPC_PDU_specs_1 /* Additional specs */ }; + +/*** <<< INCLUDES [Singleton] >>> ***/ + +#include +#include + +/*** <<< TYPE-DECLS [Singleton] >>> ***/ + +typedef struct Singleton { + IA5String_t *opt_z /* DEFAULT z */; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} Singleton_t; + +/*** <<< FUNC-DECLS [Singleton] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_Singleton; + +/*** <<< STAT-DEFS [Singleton] >>> ***/ + +static asn_TYPE_member_t asn_MBR_Singleton_1[] = { + { ATF_POINTER, 1, offsetof(struct Singleton, opt_z), + .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_IA5String, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* No PER visible constraints */ + .default_value = 0, + .name = "opt-z" + }, +}; +static int asn_MAP_Singleton_oms_1[] = { 0 }; +static ber_tlv_tag_t asn_DEF_Singleton_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_TYPE_tag2member_t asn_MAP_Singleton_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* opt-z at 23 */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_Singleton_specs_1 = { + sizeof(struct Singleton), + offsetof(struct Singleton, _asn_ctx), + asn_MAP_Singleton_tag2el_1, + 1, /* Count of tags in the map */ + asn_MAP_Singleton_oms_1, /* Optional members */ + 1, 0, /* Root/Additions */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_Singleton = { + "Singleton", + "Singleton", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + SEQUENCE_decode_uper, + SEQUENCE_encode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Singleton_tags_1, + sizeof(asn_DEF_Singleton_tags_1) + /sizeof(asn_DEF_Singleton_tags_1[0]), /* 1 */ + asn_DEF_Singleton_tags_1, /* Same as above */ + sizeof(asn_DEF_Singleton_tags_1) + /sizeof(asn_DEF_Singleton_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_Singleton_1, + 1, /* Elements count */ + &asn_SPC_Singleton_specs_1 /* Additional specs */ +}; + + +/*** <<< INCLUDES [PDU-2] >>> ***/ + +#include +#include + +/*** <<< DEPS [PDU-2] >>> ***/ + +typedef enum PDU_2_PR { + PDU_2_PR_NOTHING, /* No components present */ + PDU_2_PR_str_p2, + /* Extensions may appear below */ + +} PDU_2_PR; + +/*** <<< TYPE-DECLS [PDU-2] >>> ***/ + +typedef struct PDU_2 { + PDU_2_PR present; + union PDU_2_u { + IA5String_t str_p2; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} PDU_2_t; + +/*** <<< FUNC-DECLS [PDU-2] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_PDU_2; + +/*** <<< CTDEFS [PDU-2] >>> ***/ + +static asn_per_constraints_t asn_PER_type_PDU_2_constr_1 = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; + +/*** <<< STAT-DEFS [PDU-2] >>> ***/ + +static asn_TYPE_member_t asn_MBR_PDU_2_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct PDU_2, choice.str_p2), + .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_IA5String, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* No PER visible constraints */ + .default_value = 0, + .name = "str-p2" + }, +}; +static asn_TYPE_tag2member_t asn_MAP_PDU_2_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* str-p2 at 27 */ +}; +static asn_CHOICE_specifics_t asn_SPC_PDU_2_specs_1 = { + sizeof(struct PDU_2), + offsetof(struct PDU_2, _asn_ctx), + offsetof(struct PDU_2, present), + sizeof(((struct PDU_2 *)0)->present), + asn_MAP_PDU_2_tag2el_1, + 1, /* Count of tags in the map */ + .canonical_order = 0, + .ext_start = 1 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_PDU_2 = { + "PDU-2", + "PDU-2", + CHOICE_free, + CHOICE_print, + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_decode_xer, + CHOICE_encode_xer, + CHOICE_decode_uper, + CHOICE_encode_uper, + CHOICE_outmost_tag, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + &asn_PER_type_PDU_2_constr_1, + asn_MBR_PDU_2_1, + 1, /* Elements count */ + &asn_SPC_PDU_2_specs_1 /* Additional specs */ +}; + From e20f9d3d9e6150ffa20531dca2401b930fa5f8cf Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 27 Jun 2007 01:53:06 +0000 Subject: [PATCH 1339/1469] -X git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1347 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/data-126/README | 1 + asn1c/tests/data-126/data-126-17.out | Bin 9 -> 8 bytes asn1c/tests/data-126/data-126-18-X.in | 4 ++++ asn1c/tests/data-126/data-126-18-X.out | Bin 0 -> 8 bytes 4 files changed, 5 insertions(+) create mode 100644 asn1c/tests/data-126/data-126-18-X.in create mode 100644 asn1c/tests/data-126/data-126-18-X.out diff --git a/asn1c/tests/data-126/README b/asn1c/tests/data-126/README index 6201b6c8c..99ab58483 100644 --- a/asn1c/tests/data-126/README +++ b/asn1c/tests/data-126/README @@ -8,4 +8,5 @@ Naming conventions: *-C.in - Comparison of .out might fail, but decoding succeeds *-P.in - PER decoding of .out file must fail. +*-X.in - Final XER comparison must fail. diff --git a/asn1c/tests/data-126/data-126-17.out b/asn1c/tests/data-126/data-126-17.out index 47962bc35c2937cf5dcc806de3d27310d17b653f..f0398edb5051ce33a1ba04975bc9b11a75673bcd 100644 GIT binary patch literal 8 PcmZopFwn7R5MTfR3p@e{ literal 9 QcmZopFwn7R(BNMH01iq5&j0`b diff --git a/asn1c/tests/data-126/data-126-18-X.in b/asn1c/tests/data-126/data-126-18-X.in new file mode 100644 index 000000000..9f56752ef --- /dev/null +++ b/asn1c/tests/data-126/data-126-18-X.in @@ -0,0 +1,4 @@ + + ab + + diff --git a/asn1c/tests/data-126/data-126-18-X.out b/asn1c/tests/data-126/data-126-18-X.out new file mode 100644 index 0000000000000000000000000000000000000000..f0398edb5051ce33a1ba04975bc9b11a75673bcd GIT binary patch literal 8 PcmZopFwn7R5MTfR3p@e{ literal 0 HcmV?d00001 From 0931f5766f0fb39aa5fb34c4add66d9a6e7a0a9d Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 27 Jun 2007 01:54:57 +0000 Subject: [PATCH 1340/1469] optionality handling git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1348 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 3 +- asn1c/tests/check-126.-gen-PER.c | 5 +- asn1c/tests/data-126/data-126-15.out | Bin 7 -> 6 bytes asn1c/tests/data-126/data-126-16.out | Bin 8 -> 7 bytes libasn1compiler/asn1c_C.c | 90 +++++++++++++++++++-- skeletons/constr_SEQUENCE.c | 6 +- tests/126-per-extensions-OK.asn1.-Pgen-PER | 28 ++++++- 7 files changed, 121 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index eb8c8da08..56273ddae 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9.22: 2007-Jun-23 +0.9.22: 2007-Jun-26 * Added -pdu=all and -pdu= switches to asn1c. * Added PER support for most known-multiplier string types: @@ -15,6 +15,7 @@ is encountered. (Severity: medium; Security impact: low) * Fixed extensibility handling of second SEQUENCE production. (Severity: low; Security impact: none) + * Added DEFAULT handling for known multiplier string. 0.9.21: 2006-Sep-17 diff --git a/asn1c/tests/check-126.-gen-PER.c b/asn1c/tests/check-126.-gen-PER.c index 8b590b18d..6a8e866fa 100644 --- a/asn1c/tests/check-126.-gen-PER.c +++ b/asn1c/tests/check-126.-gen-PER.c @@ -288,7 +288,10 @@ process_XER_data(const char *fname, char *fbuf, int size) { fwrite(buf, 1, buf_offset, stderr); fprintf(stderr, "=== end ===\n"); - assert(xer_encoding_equal(fbuf, size, buf, buf_offset)); + if(fname[strlen(fname) - 4] == 'X') + assert(!xer_encoding_equal(fbuf, size, buf, buf_offset)); + else + assert(xer_encoding_equal(fbuf, size, buf, buf_offset)); asn_DEF_PDU.free_struct(&asn_DEF_PDU, st, 0); } diff --git a/asn1c/tests/data-126/data-126-15.out b/asn1c/tests/data-126/data-126-15.out index 3de83749dbd0b0c5db412fa484c65c8d788d3f0a..e278c6ba3d2387cbf11f638595fad471a19022c2 100644 GIT binary patch literal 6 NcmZop5MU5s000G80R#X5 literal 7 OcmZop5Ma>YUjP6HVgbtl diff --git a/asn1c/tests/data-126/data-126-16.out b/asn1c/tests/data-126/data-126-16.out index 88371928c28e0024d3a77b39eaf9861291b23d4e..bebf853ca96e1577316cb9dc0afe52bb7ab8ddef 100644 GIT binary patch literal 7 OcmZopP>@j&U;qFIYynUJ literal 8 PcmZopP>@m3;9md$3Bm#w diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index d8aa01fbb..ef0c86884 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -2056,6 +2056,35 @@ emit_member_PER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { return 0; } +static int +safe_string(const uint8_t *buf, int size) { + const uint8_t *end = buf + size; + for(; buf < end; buf++) { + int ch = *buf; + if((ch < 0x20 || ch > 0x7e) || ch == '"') + return 0; + } + return 1; +} + +static void +emit_default_value(arg_t *arg, asn1p_value_t *v) { + + OUT("static uint8_t defv[] = "); + assert(v->type == ATV_STRING); + + if(safe_string(v->value.string.buf, v->value.string.size)) { + OUT("\"%s\";\n", v->value.string.buf); + } else { + uint8_t *b = v->value.string.buf; + uint8_t *e = v->value.string.size + b; + OUT("{ "); + for(;b < e; b++) + OUT("0x%02x, ", *b); + OUT("0 };\n"); + } +} + static int try_inline_default(arg_t *arg, asn1p_expr_t *expr, int out) { int save_target = arg->target->target; @@ -2074,7 +2103,14 @@ try_inline_default(arg_t *arg, asn1p_expr_t *expr, int out) { fits_long = asn1c_type_fits_long(arg, expr)!=FL_NOTFIT; if(fits_long && !expr->marker.default_value->value.v_integer) expr->marker.flags &= ~EM_INDIRECT; - if(!out) return 1; + if(!out) { + OUT("asn_DFL_%d_set_%" PRIdASN + ",\t/* DEFAULT %" PRIdASN " */\n", + expr->_type_unique_index, + expr->marker.default_value->value.v_integer, + expr->marker.default_value->value.v_integer); + return 1; + } REDIR(OT_STAT_DEFS); OUT("static int asn_DFL_%d_set_%" PRIdASN "(int set_value, void **sptr) {\n", expr->_type_unique_index, @@ -2125,7 +2161,52 @@ try_inline_default(arg_t *arg, asn1p_expr_t *expr, int out) { //expr->marker.flags &= ~EM_INDIRECT; return 0; default: - break; + if(etype & ASN_STRING_KM_MASK) { + if(expr->marker.default_value == NULL + || expr->marker.default_value->type != ATV_STRING) + break; + if(!out) { + OUT("asn_DFL_%d_set,\t/* DEFAULT \"%s\" */\n", + expr->_type_unique_index, + expr->marker.default_value->value.string.buf); + return 1; + } + REDIR(OT_STAT_DEFS); + OUT("static int asn_DFL_%d_set(int set_value, void **sptr) {\n", expr->_type_unique_index); + INDENT(+1); + emit_default_value(arg, expr->marker.default_value); + OUT("%s *st = *sptr;\n", asn1c_type_name(arg, expr, TNF_CTYPE)); + OUT("\n"); + OUT("if(!st) {\n"); + OUT("\tif(!set_value) return -1;\t/* Not a default value */\n"); + OUT("\tst = (*sptr = CALLOC(1, sizeof(*st)));\n"); + OUT("\tif(!st) return -1;\n"); + OUT("}\n"); + OUT("\n"); + OUT("if(set_value) {\n"); + INDENT(+1); + OUT("uint8_t *ptr = MALLOC(sizeof(defv));\n"); + OUT("if(!ptr) return -1;\n"); + OUT("memcpy(ptr, &defv, sizeof(defv));\n"); + OUT("FREEMEM(st->buf);\n"); + OUT("st->buf = ptr;\n"); + OUT("st->size = sizeof(defv) - 1;\n"); + OUT("return 0;\n"); + INDENT(-1); + OUT("} else {\n"); + INDENT(+1); + OUT("if(st->size != (sizeof(defv) - 1)\n"); + OUT("|| memcmp(st->buf, &defv, sizeof(defv) - 1))\n"); + OUT("\treturn 0;\n"); + OUT("return 1;\n"); + INDENT(-1); + OUT("}\n"); OUT("\n"); + INDENT(-1); + OUT("}\n"); + REDIR(save_target); + return 1; + } + break; } return 0; } @@ -2247,11 +2328,6 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { } if(C99_MODE) OUT(".default_value = "); if(try_inline_default(arg, expr, 0)) { - OUT("asn_DFL_%d_set_%" PRIdASN - ",\t/* DEFAULT %" PRIdASN " */\n", - expr->_type_unique_index, - expr->marker.default_value->value.v_integer, - expr->marker.default_value->value.v_integer); } else { OUT("0,\n"); } diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index c824c04aa..f82ebc698 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -1337,6 +1337,7 @@ SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, FREEMEM(opres); _ASN_DECODE_FAILED; } + ASN_DEBUG("Filled-in default"); } /* The member is just not present */ continue; @@ -1612,8 +1613,11 @@ SEQUENCE_encode_uper(asn_TYPE_descriptor_t *td, } /* Eliminate default values */ - if(elm->default_value && elm->default_value(0, memb_ptr2) == 1) + ASN_DEBUG("Defv %p mptr %p\n", elm->default_value, memb_ptr2); + ASN_DEBUG("Do not encode default: %s\n", (*(char **)(*memb_ptr2))); + if(elm->default_value && elm->default_value(0, memb_ptr2) == 1) { continue; + } er = elm->type->uper_encoder(elm->type, elm->per_constraints, *memb_ptr2, po); diff --git a/tests/126-per-extensions-OK.asn1.-Pgen-PER b/tests/126-per-extensions-OK.asn1.-Pgen-PER index 7f7626acc..326a705c1 100644 --- a/tests/126-per-extensions-OK.asn1.-Pgen-PER +++ b/tests/126-per-extensions-OK.asn1.-Pgen-PER @@ -140,6 +140,32 @@ extern asn_TYPE_descriptor_t asn_DEF_Singleton; /*** <<< STAT-DEFS [Singleton] >>> ***/ +static int asn_DFL_2_set(int set_value, void **sptr) { + static uint8_t defv[] = "z"; + IA5String_t *st = *sptr; + + if(!st) { + if(!set_value) return -1; /* Not a default value */ + st = (*sptr = CALLOC(1, sizeof(*st))); + if(!st) return -1; + } + + if(set_value) { + uint8_t *ptr = MALLOC(sizeof(defv)); + if(!ptr) return -1; + memcpy(ptr, &defv, sizeof(defv)); + FREEMEM(st->buf); + st->buf = ptr; + st->size = sizeof(defv) - 1; + return 0; + } else { + if(st->size != (sizeof(defv) - 1) + || memcmp(st->buf, &defv, sizeof(defv) - 1)) + return 0; + return 1; + } + +} static asn_TYPE_member_t asn_MBR_Singleton_1[] = { { ATF_POINTER, 1, offsetof(struct Singleton, opt_z), .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), @@ -147,7 +173,7 @@ static asn_TYPE_member_t asn_MBR_Singleton_1[] = { .type = &asn_DEF_IA5String, .memb_constraints = 0, /* Defer constraints checking to the member type */ .per_constraints = 0, /* No PER visible constraints */ - .default_value = 0, + .default_value = asn_DFL_2_set, /* DEFAULT "z" */ .name = "opt-z" }, }; From 13280c823c0830b63e156f76d53dc00f1b6e3ac3 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 27 Jun 2007 02:11:08 +0000 Subject: [PATCH 1341/1469] no harmful debug git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1349 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SEQUENCE.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index f82ebc698..5e1a05383 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -1613,11 +1613,8 @@ SEQUENCE_encode_uper(asn_TYPE_descriptor_t *td, } /* Eliminate default values */ - ASN_DEBUG("Defv %p mptr %p\n", elm->default_value, memb_ptr2); - ASN_DEBUG("Do not encode default: %s\n", (*(char **)(*memb_ptr2))); - if(elm->default_value && elm->default_value(0, memb_ptr2) == 1) { + if(elm->default_value && elm->default_value(0, memb_ptr2) == 1) continue; - } er = elm->type->uper_encoder(elm->type, elm->per_constraints, *memb_ptr2, po); From 5d3db2f40cbc6e045503ebeb169309dde7a9dae9 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 27 Jun 2007 04:09:37 +0000 Subject: [PATCH 1342/1469] shared stuff split off to per_opentype.[ch] git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1350 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SEQUENCE.c | 236 +--------------------------------- skeletons/file-dependencies | 1 + skeletons/per_opentype.c | 245 ++++++++++++++++++++++++++++++++++++ skeletons/per_opentype.h | 22 ++++ skeletons/per_support.c | 3 +- skeletons/per_support.h | 3 +- 6 files changed, 276 insertions(+), 234 deletions(-) create mode 100644 skeletons/per_opentype.c create mode 100644 skeletons/per_opentype.h diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 5e1a05383..0cfcdade2 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -5,6 +5,7 @@ */ #include #include +#include /* * Number of bytes left for this structure. @@ -1026,235 +1027,6 @@ SEQUENCE_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return 0; } -/* - * #10.1, #10.2 - */ -static int -uper_put_open_type(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { - void *buf; - ssize_t size; - - ASN_DEBUG("Encoding as open type %s", td->name); - size = uper_encode_to_new_buffer(td, constraints, sptr, &buf); - if(size <= 0) return -1; - - ASN_DEBUG("Putting %s of length %d", td->name, size); - while(size) { - ssize_t maySave = uper_put_length(po, size); - if(maySave < 0) break; - if(per_put_many_bits(po, buf, maySave * 8)) break; - buf = (char *)buf + maySave; - size -= maySave; - } - - if(size) { - FREEMEM(buf); - return -1; - } - - return 0; -} - -typedef struct uper_ugot_key { - asn_per_data_t oldpd; /* Old per data source */ - size_t unclaimed; - size_t ot_moved; /* Number of bits moved by OT processing */ - int repeat; -} uper_ugot_key; -static int -uper_ugot_refill(asn_per_data_t *pd) { - uper_ugot_key *arg = pd->refill_key; - ssize_t next_chunk_bytes, next_chunk_bits; - ssize_t avail; - - asn_per_data_t *oldpd = &arg->oldpd; - - ASN_DEBUG("REFILLING (%+db) [from %d (%d->%d)_%d] now [%d (%d->%d)_%d] uncl %d", - pd->buffer - oldpd->buffer, - oldpd->nbits - oldpd->nboff, oldpd->nboff, oldpd->nbits, oldpd->moved, - pd->nbits - pd->nboff, pd->nboff, pd->nbits, pd->moved, arg->unclaimed); - - /* Advance our position to where pd is */ - oldpd->buffer = pd->buffer; - oldpd->nboff = pd->nboff; - oldpd->nbits -= pd->moved - arg->ot_moved; - oldpd->moved += pd->moved - arg->ot_moved; - arg->ot_moved = pd->moved; - - if(arg->unclaimed) { - /* Refill the container */ - if(per_get_few_bits(oldpd, 1)) - return -1; - if(oldpd->nboff == 0) { - assert(0); - return -1; - } - pd->buffer = oldpd->buffer; - pd->nboff = oldpd->nboff - 1; - pd->nbits = oldpd->nbits; - ASN_DEBUG("Return from UNCLAIMED"); - return 0; - } - - if(!arg->repeat) { - ASN_DEBUG("Want more but refill doesn't have it"); - return -1; - } - - next_chunk_bytes = uper_get_length(oldpd, -1, &arg->repeat); - ASN_DEBUG("Open type LENGTH %d bytes at off %d, repeat %d", - next_chunk_bytes, oldpd->moved, arg->repeat); - if(next_chunk_bytes < 0) return -1; - if(next_chunk_bytes == 0) { - pd->refill = 0; /* No more refills, naturally */ - assert(!arg->repeat); /* Implementation guarantee */ - } - next_chunk_bits = next_chunk_bytes << 3; - avail = oldpd->nbits - oldpd->nboff; - if(avail >= next_chunk_bits) { - pd->nbits = oldpd->nboff + next_chunk_bits; - arg->unclaimed = 0; - } else { - pd->nbits = oldpd->nbits; - arg->unclaimed = next_chunk_bits - avail; - ASN_DEBUG("Parent has %d, require %d, will claim %d", avail, next_chunk_bits, arg->unclaimed); - } - pd->buffer = oldpd->buffer; - pd->nboff = oldpd->nboff; - return 0; -} - -asn_dec_rval_t -uper_get_open_type(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, - asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { - uper_ugot_key arg; - asn_dec_rval_t rv; - ssize_t padding; - - _ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx); - - ASN_DEBUG("Getting open type off %d (%d+%d), %p", pd->moved, pd->nboff, pd->nbits, pd->buffer); - arg.oldpd = *pd; - arg.unclaimed = 0; - arg.ot_moved = 0; - arg.repeat = 1; - pd->refill = uper_ugot_refill; - pd->refill_key = &arg; - pd->nbits = pd->nboff; /* 0 good bits at this point, will refill */ - pd->moved = 0; /* This now counts the open type size in bits */ - - rv = td->uper_decoder(opt_codec_ctx, td, constraints, sptr, pd); - - ASN_DEBUG("Open type %s consumed %d off of %d unclaimed=%d, repeat=%d", - td->name, pd->moved, arg.oldpd.moved, - arg.unclaimed, arg.repeat); - - ASN_DEBUG("OT1 moved %d, estimated %d uncl=%d", - arg.oldpd.moved, - arg.oldpd.nboff + ((((int)arg.oldpd.buffer) & 0x7) << 3), - arg.unclaimed - ); - - padding = pd->moved % 8; - if(padding) { - int32_t pvalue; - if(padding > 7) { - ASN_DEBUG("Too large padding %d in open type", - padding); - rv.code = RC_FAIL; - return rv; - } - padding = 8 - padding; - ASN_DEBUG("Getting padding of %d bits", padding); - pvalue = per_get_few_bits(pd, padding); - switch(pvalue) { - case -1: - ASN_DEBUG("Padding skip failed"); - _ASN_DECODE_STARVED; - case 0: break; - default: - ASN_DEBUG("Non-blank padding (%d bits 0x%02x)", - padding, pvalue); - _ASN_DECODE_FAILED; - } - } - if(pd->nbits != pd->nboff) { - ASN_DEBUG("Open type container overhead of %d bits!", pd->nbits - pd->nboff); - if(1) _ASN_DECODE_FAILED; - arg.unclaimed += pd->nbits - pd->nboff; - } - - /* Adjust pd back so it points to original data */ - pd->nbits = arg.oldpd.nbits - (pd->moved - arg.ot_moved); - pd->moved = arg.oldpd.moved + (pd->moved - arg.ot_moved); - pd->refill = arg.oldpd.refill; - pd->refill_key = arg.oldpd.refill_key; - - /* Skip data not consumed by the decoder */ - if(arg.unclaimed) ASN_DEBUG("Getting unclaimed %d", arg.unclaimed); - while(arg.unclaimed) { - size_t toget = 24; - if(arg.unclaimed < toget) - toget = arg.unclaimed; - arg.unclaimed -= toget; - switch(per_get_few_bits(pd, toget)) { - case -1: - ASN_DEBUG("Claim of %d failed", toget); - _ASN_DECODE_STARVED; - case 0: - ASN_DEBUG("Got claim of %d", toget); - continue; - default: - /* Padding must be blank */ - ASN_DEBUG("Non-blank unconsumed padding"); - _ASN_DECODE_FAILED; - } - } - - assert(pd->moved == pd->nboff + ((((int)pd->buffer) & 0x7) << 3)); - - if(arg.repeat) { - ASN_DEBUG("Not consumed the whole thing"); - rv.code = RC_FAIL; - return rv; - } - - return rv; -} - -asn_dec_rval_t -uper_sot_suck(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, - asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { - asn_dec_rval_t rv; - - (void)opt_codec_ctx; - (void)td; - (void)constraints; - (void)sptr; - - while(per_get_few_bits(pd, 24) >= 0); - - rv.code = RC_OK; - rv.consumed = pd->moved; - - return rv; -} - -static int -uper_skip_open_type(asn_codec_ctx_t *opt_codec_ctx, asn_per_data_t *pd) { - asn_TYPE_descriptor_t s_td; - asn_dec_rval_t rv; - - s_td.name = ""; - s_td.uper_decoder = uper_sot_suck; - - rv = uper_get_open_type(opt_codec_ctx, &s_td, 0, 0, pd); - if(rv.code != RC_OK) - return -1; - else - return 0; -} - asn_dec_rval_t SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { @@ -1413,7 +1185,7 @@ SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } ASN_DEBUG("Decoding member %s in %s %p", elm->name, td->name, *memb_ptr2); - rv = uper_get_open_type(opt_codec_ctx, elm->type, + rv = uper_open_type_get(opt_codec_ctx, elm->type, elm->per_constraints, memb_ptr2, pd); if(rv.code != RC_OK) { FREEMEM(epres); @@ -1429,7 +1201,7 @@ SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, case -1: break; case 0: continue; default: - if(uper_skip_open_type(opt_codec_ctx, pd)) { + if(uper_open_type_skip(opt_codec_ctx, pd)) { FREEMEM(epres); _ASN_DECODE_STARVED; } @@ -1511,7 +1283,7 @@ SEQUENCE_handle_extensions(asn_TYPE_descriptor_t *td, void *sptr, if(po1 && per_put_few_bits(po1, present, 1)) return -1; /* Encode as open type field */ - if(po2 && present && uper_put_open_type(elm->type, + if(po2 && present && uper_open_type_put(elm->type, elm->per_constraints, *memb_ptr2, po2)) return -1; diff --git a/skeletons/file-dependencies b/skeletons/file-dependencies index 8fc6f03c0..c2a5dae72 100644 --- a/skeletons/file-dependencies +++ b/skeletons/file-dependencies @@ -61,6 +61,7 @@ xer_encoder.h xer_encoder.c # XER encoding support per_support.h per_support.c # PER parsing per_decoder.h per_decoder.c # PER decoding support per_encoder.h per_encoder.c # PER encoding support +per_opentype.h per_opentype.c # PER "open type" handling CONVERTER: # THIS IS A SPECIAL SECTION converter-sample.c # A default name for sample transcoder diff --git a/skeletons/per_opentype.c b/skeletons/per_opentype.c new file mode 100644 index 000000000..f2cac938f --- /dev/null +++ b/skeletons/per_opentype.c @@ -0,0 +1,245 @@ +/* + * Copyright (c) 2007 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include + +typedef struct uper_ugot_key { + asn_per_data_t oldpd; /* Old per data source */ + size_t unclaimed; + size_t ot_moved; /* Number of bits moved by OT processing */ + int repeat; +} uper_ugot_key; + +static int uper_ugot_refill(asn_per_data_t *pd); +static asn_dec_rval_t uper_sot_suck(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd); + +/* + * #10.1, #10.2 + */ +int +uper_open_type_put(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { + void *buf; + ssize_t size; + + ASN_DEBUG("Encoding as open type %s", td->name); + size = uper_encode_to_new_buffer(td, constraints, sptr, &buf); + if(size <= 0) return -1; + + ASN_DEBUG("Putting %s of length %d", td->name, size); + while(size) { + ssize_t maySave = uper_put_length(po, size); + if(maySave < 0) break; + if(per_put_many_bits(po, buf, maySave * 8)) break; + buf = (char *)buf + maySave; + size -= maySave; + } + + if(size) { + FREEMEM(buf); + return -1; + } + + return 0; +} + +asn_dec_rval_t +uper_open_type_get(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + uper_ugot_key arg; + asn_dec_rval_t rv; + ssize_t padding; + + _ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx); + + ASN_DEBUG("Getting open type off %d (%d+%d), %p", pd->moved, pd->nboff, pd->nbits, pd->buffer); + arg.oldpd = *pd; + arg.unclaimed = 0; + arg.ot_moved = 0; + arg.repeat = 1; + pd->refill = uper_ugot_refill; + pd->refill_key = &arg; + pd->nbits = pd->nboff; /* 0 good bits at this point, will refill */ + pd->moved = 0; /* This now counts the open type size in bits */ + + rv = td->uper_decoder(opt_codec_ctx, td, constraints, sptr, pd); + + ASN_DEBUG("Open type %s consumed %d off of %d unclaimed=%d, repeat=%d", + td->name, pd->moved, arg.oldpd.moved, + arg.unclaimed, arg.repeat); + + ASN_DEBUG("OT1 moved %d, estimated %d uncl=%d", + arg.oldpd.moved, + arg.oldpd.nboff + ((((int)arg.oldpd.buffer) & 0x7) << 3), + arg.unclaimed + ); + + padding = pd->moved % 8; + if(padding) { + int32_t pvalue; + if(padding > 7) { + ASN_DEBUG("Too large padding %d in open type", + padding); + rv.code = RC_FAIL; + return rv; + } + padding = 8 - padding; + ASN_DEBUG("Getting padding of %d bits", padding); + pvalue = per_get_few_bits(pd, padding); + switch(pvalue) { + case -1: + ASN_DEBUG("Padding skip failed"); + _ASN_DECODE_STARVED; + case 0: break; + default: + ASN_DEBUG("Non-blank padding (%d bits 0x%02x)", + padding, pvalue); + _ASN_DECODE_FAILED; + } + } + if(pd->nbits != pd->nboff) { + ASN_DEBUG("Open type container overhead of %d bits!", pd->nbits - pd->nboff); + if(1) _ASN_DECODE_FAILED; + arg.unclaimed += pd->nbits - pd->nboff; + } + + /* Adjust pd back so it points to original data */ + pd->nbits = arg.oldpd.nbits - (pd->moved - arg.ot_moved); + pd->moved = arg.oldpd.moved + (pd->moved - arg.ot_moved); + pd->refill = arg.oldpd.refill; + pd->refill_key = arg.oldpd.refill_key; + + /* Skip data not consumed by the decoder */ + if(arg.unclaimed) ASN_DEBUG("Getting unclaimed %d", arg.unclaimed); + while(arg.unclaimed) { + size_t toget = 24; + if(arg.unclaimed < toget) + toget = arg.unclaimed; + arg.unclaimed -= toget; + switch(per_get_few_bits(pd, toget)) { + case -1: + ASN_DEBUG("Claim of %d failed", toget); + _ASN_DECODE_STARVED; + case 0: + ASN_DEBUG("Got claim of %d", toget); + continue; + default: + /* Padding must be blank */ + ASN_DEBUG("Non-blank unconsumed padding"); + _ASN_DECODE_FAILED; + } + } + + assert(pd->moved == pd->nboff + ((((int)pd->buffer) & 0x7) << 3)); + + if(arg.repeat) { + ASN_DEBUG("Not consumed the whole thing"); + rv.code = RC_FAIL; + return rv; + } + + return rv; +} + +int +uper_open_type_skip(asn_codec_ctx_t *opt_codec_ctx, asn_per_data_t *pd) { + asn_TYPE_descriptor_t s_td; + asn_dec_rval_t rv; + + s_td.name = ""; + s_td.uper_decoder = uper_sot_suck; + + rv = uper_open_type_get(opt_codec_ctx, &s_td, 0, 0, pd); + if(rv.code != RC_OK) + return -1; + else + return 0; +} + +/* + * Internal functions. + */ + +static asn_dec_rval_t +uper_sot_suck(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_dec_rval_t rv; + + (void)opt_codec_ctx; + (void)td; + (void)constraints; + (void)sptr; + + while(per_get_few_bits(pd, 24) >= 0); + + rv.code = RC_OK; + rv.consumed = pd->moved; + + return rv; +} + +static int +uper_ugot_refill(asn_per_data_t *pd) { + uper_ugot_key *arg = pd->refill_key; + ssize_t next_chunk_bytes, next_chunk_bits; + ssize_t avail; + + asn_per_data_t *oldpd = &arg->oldpd; + + ASN_DEBUG("REFILLING (%+db) [from %d (%d->%d)_%d] now [%d (%d->%d)_%d] uncl %d", + pd->buffer - oldpd->buffer, + oldpd->nbits - oldpd->nboff, oldpd->nboff, oldpd->nbits, oldpd->moved, + pd->nbits - pd->nboff, pd->nboff, pd->nbits, pd->moved, arg->unclaimed); + + /* Advance our position to where pd is */ + oldpd->buffer = pd->buffer; + oldpd->nboff = pd->nboff; + oldpd->nbits -= pd->moved - arg->ot_moved; + oldpd->moved += pd->moved - arg->ot_moved; + arg->ot_moved = pd->moved; + + if(arg->unclaimed) { + /* Refill the container */ + if(per_get_few_bits(oldpd, 1)) + return -1; + if(oldpd->nboff == 0) { + assert(0); + return -1; + } + pd->buffer = oldpd->buffer; + pd->nboff = oldpd->nboff - 1; + pd->nbits = oldpd->nbits; + ASN_DEBUG("Return from UNCLAIMED"); + return 0; + } + + if(!arg->repeat) { + ASN_DEBUG("Want more but refill doesn't have it"); + return -1; + } + + next_chunk_bytes = uper_get_length(oldpd, -1, &arg->repeat); + ASN_DEBUG("Open type LENGTH %d bytes at off %d, repeat %d", + next_chunk_bytes, oldpd->moved, arg->repeat); + if(next_chunk_bytes < 0) return -1; + if(next_chunk_bytes == 0) { + pd->refill = 0; /* No more refills, naturally */ + assert(!arg->repeat); /* Implementation guarantee */ + } + next_chunk_bits = next_chunk_bytes << 3; + avail = oldpd->nbits - oldpd->nboff; + if(avail >= next_chunk_bits) { + pd->nbits = oldpd->nboff + next_chunk_bits; + arg->unclaimed = 0; + } else { + pd->nbits = oldpd->nbits; + arg->unclaimed = next_chunk_bits - avail; + ASN_DEBUG("Parent has %d, require %d, will claim %d", avail, next_chunk_bits, arg->unclaimed); + } + pd->buffer = oldpd->buffer; + pd->nboff = oldpd->nboff; + return 0; +} diff --git a/skeletons/per_opentype.h b/skeletons/per_opentype.h new file mode 100644 index 000000000..facfaa637 --- /dev/null +++ b/skeletons/per_opentype.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2007 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _PER_OPENTYPE_H_ +#define _PER_OPENTYPE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +asn_dec_rval_t uper_open_type_get(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd); + +int uper_open_type_skip(asn_codec_ctx_t *opt_codec_ctx, asn_per_data_t *pd); + +int uper_open_type_put(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po); + +#ifdef __cplusplus +} +#endif + +#endif /* _PER_OPENTYPE_H_ */ diff --git a/skeletons/per_support.c b/skeletons/per_support.c index bfd733aa5..9406d963e 100644 --- a/skeletons/per_support.c +++ b/skeletons/per_support.c @@ -1,5 +1,6 @@ /* - * Copyright (c) 2005, 2006 Lev Walkin . All rights reserved. + * Copyright (c) 2005, 2006, 2007 Lev Walkin . + * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include diff --git a/skeletons/per_support.h b/skeletons/per_support.h index bf06f0567..653c3517e 100644 --- a/skeletons/per_support.h +++ b/skeletons/per_support.h @@ -1,5 +1,6 @@ /* - * Copyright (c) 2005, 2006 Lev Walkin . All rights reserved. + * Copyright (c) 2005, 2006, 2007 Lev Walkin . + * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _PER_SUPPORT_H_ From 8ee5d26fe20bd780c8e59c55694bc47d38fa5c6d Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 27 Jun 2007 04:17:51 +0000 Subject: [PATCH 1343/1469] not an invariant git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1351 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/per_opentype.c | 1 + 1 file changed, 1 insertion(+) diff --git a/skeletons/per_opentype.c b/skeletons/per_opentype.c index f2cac938f..4d624f043 100644 --- a/skeletons/per_opentype.c +++ b/skeletons/per_opentype.c @@ -133,6 +133,7 @@ uper_open_type_get(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } } + if(0) /* Special debugging assert */ assert(pd->moved == pd->nboff + ((((int)pd->buffer) & 0x7) << 3)); if(arg.repeat) { From 6357827c3d4a670b1b7c9c8ed4fded0fd3e10a14 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Jun 2007 01:42:04 +0000 Subject: [PATCH 1344/1469] new members git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1352 59561ff5-6e30-0410-9f3c-9617f08c8826 --- tests/126-per-extensions-OK.asn1 | 6 ++- tests/126-per-extensions-OK.asn1.-Pgen-PER | 46 ++++++++++++++++------ 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/tests/126-per-extensions-OK.asn1 b/tests/126-per-extensions-OK.asn1 index 3d7086633..7d121730b 100644 --- a/tests/126-per-extensions-OK.asn1 +++ b/tests/126-per-extensions-OK.asn1 @@ -24,8 +24,10 @@ BEGIN } PDU-2 ::= CHOICE { - str-p2 IA5String, - ... + main [3] INTEGER, + ..., + ext1 [1] INTEGER, + ext0 [0] INTEGER } END diff --git a/tests/126-per-extensions-OK.asn1.-Pgen-PER b/tests/126-per-extensions-OK.asn1.-Pgen-PER index 326a705c1..91aac0cc3 100644 --- a/tests/126-per-extensions-OK.asn1.-Pgen-PER +++ b/tests/126-per-extensions-OK.asn1.-Pgen-PER @@ -222,16 +222,17 @@ asn_TYPE_descriptor_t asn_DEF_Singleton = { /*** <<< INCLUDES [PDU-2] >>> ***/ -#include +#include #include /*** <<< DEPS [PDU-2] >>> ***/ typedef enum PDU_2_PR { PDU_2_PR_NOTHING, /* No components present */ - PDU_2_PR_str_p2, + PDU_2_PR_main, /* Extensions may appear below */ - + PDU_2_PR_ext1, + PDU_2_PR_ext0 } PDU_2_PR; /*** <<< TYPE-DECLS [PDU-2] >>> ***/ @@ -239,11 +240,13 @@ typedef enum PDU_2_PR { typedef struct PDU_2 { PDU_2_PR present; union PDU_2_u { - IA5String_t str_p2; + INTEGER_t main; /* * This type is extensible, * possible extensions are below. */ + INTEGER_t ext1; + INTEGER_t ext0; } choice; /* Context for parsing across buffer boundaries */ @@ -265,18 +268,39 @@ static asn_per_constraints_t asn_PER_type_PDU_2_constr_1 = { /*** <<< STAT-DEFS [PDU-2] >>> ***/ static asn_TYPE_member_t asn_MBR_PDU_2_1[] = { - { ATF_NOFLAGS, 0, offsetof(struct PDU_2, choice.str_p2), + { ATF_NOFLAGS, 0, offsetof(struct PDU_2, choice.main), + .tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_INTEGER, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* No PER visible constraints */ + .default_value = 0, + .name = "main" + }, + { ATF_NOFLAGS, 0, offsetof(struct PDU_2, choice.ext1), + .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_INTEGER, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* No PER visible constraints */ + .default_value = 0, + .name = "ext1" + }, + { ATF_NOFLAGS, 0, offsetof(struct PDU_2, choice.ext0), .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), .tag_mode = -1, /* IMPLICIT tag at current level */ - .type = &asn_DEF_IA5String, + .type = &asn_DEF_INTEGER, .memb_constraints = 0, /* Defer constraints checking to the member type */ .per_constraints = 0, /* No PER visible constraints */ .default_value = 0, - .name = "str-p2" + .name = "ext0" }, }; +static int asn_MAP_PDU_2_cmap_1[] = { 0, 2, 1 }; static asn_TYPE_tag2member_t asn_MAP_PDU_2_tag2el_1[] = { - { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* str-p2 at 27 */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 2, 0, 0 }, /* ext0 at 31 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ext1 at 29 */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 0, 0, 0 } /* main at 27 */ }; static asn_CHOICE_specifics_t asn_SPC_PDU_2_specs_1 = { sizeof(struct PDU_2), @@ -284,8 +308,8 @@ static asn_CHOICE_specifics_t asn_SPC_PDU_2_specs_1 = { offsetof(struct PDU_2, present), sizeof(((struct PDU_2 *)0)->present), asn_MAP_PDU_2_tag2el_1, - 1, /* Count of tags in the map */ - .canonical_order = 0, + 3, /* Count of tags in the map */ + .canonical_order = asn_MAP_PDU_2_cmap_1, /* Canonically sorted */ .ext_start = 1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_PDU_2 = { @@ -307,7 +331,7 @@ asn_TYPE_descriptor_t asn_DEF_PDU_2 = { 0, /* No tags (count) */ &asn_PER_type_PDU_2_constr_1, asn_MBR_PDU_2_1, - 1, /* Elements count */ + 3, /* Elements count */ &asn_SPC_PDU_2_specs_1 /* Additional specs */ }; From 147206dfdab46c4abc4eb800cb25285ac1679cad Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Jun 2007 01:43:34 +0000 Subject: [PATCH 1345/1469] more test items git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1353 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/tests/data-126/data-126-19.in | 7 +++++++ asn1c/tests/data-126/data-126-19.out | Bin 0 -> 59 bytes asn1c/tests/data-126/data-126-20.in | 7 +++++++ asn1c/tests/data-126/data-126-20.out | Bin 0 -> 60 bytes asn1c/tests/data-126/data-126-21.in | 7 +++++++ asn1c/tests/data-126/data-126-21.out | Bin 0 -> 12 bytes 6 files changed, 21 insertions(+) create mode 100644 asn1c/tests/data-126/data-126-19.in create mode 100644 asn1c/tests/data-126/data-126-19.out create mode 100644 asn1c/tests/data-126/data-126-20.in create mode 100644 asn1c/tests/data-126/data-126-20.out create mode 100644 asn1c/tests/data-126/data-126-21.in create mode 100644 asn1c/tests/data-126/data-126-21.out diff --git a/asn1c/tests/data-126/data-126-19.in b/asn1c/tests/data-126/data-126-19.in new file mode 100644 index 000000000..42d3595e4 --- /dev/null +++ b/asn1c/tests/data-126/data-126-19.in @@ -0,0 +1,7 @@ + + some long string spanning multiple bytes + zzz-zzz-zzz-zzz + +
    42
    +
    +
    diff --git a/asn1c/tests/data-126/data-126-19.out b/asn1c/tests/data-126/data-126-19.out new file mode 100644 index 0000000000000000000000000000000000000000..5cc830eb12c2fb923949c8d2e49348af5c4e3f8f GIT binary patch literal 59 zcmZoJa_X!8_SA86-J2JdU!E>6E0Ot;cz3ton-^wZZ(jE2of(ky`Le#jkNWj-(|&z@ OnGdF3Fc@$KFaQ85R3bY7 literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-126/data-126-20.in b/asn1c/tests/data-126/data-126-20.in new file mode 100644 index 000000000..2e26d4c25 --- /dev/null +++ b/asn1c/tests/data-126/data-126-20.in @@ -0,0 +1,7 @@ + + some long string spanning multiple bytes + zzz-zzz-zzz-zzz + + 13 + + diff --git a/asn1c/tests/data-126/data-126-20.out b/asn1c/tests/data-126/data-126-20.out new file mode 100644 index 0000000000000000000000000000000000000000..6a5d6dd4fdb1b63f1c49eb97df47b116b5f00402 GIT binary patch literal 60 zcmZoJa_X!8_SA86-J2JdU!E>6E0Ot;cz3ton-^wZZ(jE2of(ky`Le#jkNWj-(|&z@ PnGdF3FnBO12wVUFO+zC3 literal 0 HcmV?d00001 diff --git a/asn1c/tests/data-126/data-126-21.in b/asn1c/tests/data-126/data-126-21.in new file mode 100644 index 000000000..3ea60bde8 --- /dev/null +++ b/asn1c/tests/data-126/data-126-21.in @@ -0,0 +1,7 @@ + + + + + 0 + + diff --git a/asn1c/tests/data-126/data-126-21.out b/asn1c/tests/data-126/data-126-21.out new file mode 100644 index 0000000000000000000000000000000000000000..865a90a14a8ef7464c7d55c7c10e026758b0be79 GIT binary patch literal 12 TcmZoJ5Ma Date: Fri, 29 Jun 2007 01:45:03 +0000 Subject: [PATCH 1346/1469] PER extensibility support for CHOICE types git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1354 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_CHOICE.c | 45 +++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 912febebc..a9eb71941 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -5,6 +5,7 @@ */ #include #include +#include /* * Number of bytes left for this structure. @@ -871,8 +872,6 @@ CHOICE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, value += specs->ext_start; if(value >= td->elements_count) _ASN_DECODE_FAILED; - ASN_DEBUG("NOT IMPLEMENTED YET"); - _ASN_DECODE_FAILED; } /* Adjust if canonical order is different from natural order */ @@ -892,11 +891,17 @@ CHOICE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } ASN_DEBUG("Discovered CHOICE %s encodes %s", td->name, elm->name); - rv = elm->type->uper_decoder(opt_codec_ctx, elm->type, + if(ct && ct->range_bits >= 0) { + rv = elm->type->uper_decoder(opt_codec_ctx, elm->type, + elm->per_constraints, memb_ptr2, pd); + } else { + rv = uper_open_type_get(opt_codec_ctx, elm->type, elm->per_constraints, memb_ptr2, pd); + } + if(rv.code != RC_OK) - ASN_DEBUG("Failed to decode %s in %s (CHOICE)", - elm->name, td->name); + ASN_DEBUG("Failed to decode %s in %s (CHOICE) %d", + elm->name, td->name, rv.code); return rv; } @@ -951,18 +956,6 @@ CHOICE_encode_uper(asn_TYPE_descriptor_t *td, if(per_put_few_bits(po, 0, 1)) _ASN_ENCODE_FAILED; - if(ct && ct->range_bits >= 0) { - if(per_put_few_bits(po, present, ct->range_bits)) - _ASN_ENCODE_FAILED; - } else { - if(specs->ext_start == -1) - _ASN_ENCODE_FAILED; - if(uper_put_nsnnwn(po, present - specs->ext_start)) - _ASN_ENCODE_FAILED; - ASN_DEBUG("NOT IMPLEMENTED YET"); - _ASN_ENCODE_FAILED; - } - elm = &td->elements[present]; if(elm->flags & ATF_POINTER) { /* Member is a pointer to another structure */ @@ -972,8 +965,24 @@ CHOICE_encode_uper(asn_TYPE_descriptor_t *td, memb_ptr = (char *)sptr + elm->memb_offset; } - return elm->type->uper_encoder(elm->type, elm->per_constraints, + if(ct && ct->range_bits >= 0) { + if(per_put_few_bits(po, present, ct->range_bits)) + _ASN_ENCODE_FAILED; + + return elm->type->uper_encoder(elm->type, elm->per_constraints, memb_ptr, po); + } else { + asn_enc_rval_t rval; + if(specs->ext_start == -1) + _ASN_ENCODE_FAILED; + if(uper_put_nsnnwn(po, present - specs->ext_start)) + _ASN_ENCODE_FAILED; + if(uper_open_type_put(elm->type, elm->per_constraints, + memb_ptr, po)) + _ASN_ENCODE_FAILED; + rval.encoded = 0; + _ASN_ENCODED_OK(rval); + } } From 0faf003d77005533876da64cbb505850a2a9ef40 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Jun 2007 02:28:05 +0000 Subject: [PATCH 1347/1469] more debugging git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1355 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/per_support.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/skeletons/per_support.c b/skeletons/per_support.c index 9406d963e..e572fa8cd 100644 --- a/skeletons/per_support.c +++ b/skeletons/per_support.c @@ -7,6 +7,20 @@ #include #include +char * +per_data_string(asn_per_data_t *pd) { + static char buf[2][32]; + static int n; + n = (n+1) % 2; + snprintf(buf[n], sizeof(buf), + "{m=%d span %+d[%d..%d] (%d)}", + pd->moved, + (((int)pd->buffer) & 0xf), + pd->nboff, pd->nbits, + pd->nbits - pd->nboff); + return buf[n]; +} + void per_get_undo(asn_per_data_t *pd, int nbits) { if((ssize_t)pd->nboff < nbits) { @@ -89,8 +103,12 @@ per_get_few_bits(asn_per_data_t *pd, int nbits) { accum &= (((uint32_t)1 << nbits) - 1); - ASN_DEBUG("[PER got %d bits from (%d@%d+%d) => 0x%x]", - nbits, pd->moved, pd->nboff, nleft, accum); + ASN_DEBUG(" [PER got %2d<=%2d bits => span %d %+d[%d..%d] (%d) => 0x%x]", + nbits, nleft, + pd->moved, + (((int)pd->buffer) & 0xf), + pd->nboff, pd->nbits, pd->nbits - pd->nboff, + accum); return accum; } From d934f25d7bdf89ba662a72ab7c75aa6e5e994ab7 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Jun 2007 02:28:10 +0000 Subject: [PATCH 1348/1469] more debugging git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1356 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/per_support.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/skeletons/per_support.h b/skeletons/per_support.h index 653c3517e..7cb1a0ca3 100644 --- a/skeletons/per_support.h +++ b/skeletons/per_support.h @@ -81,6 +81,9 @@ ssize_t uper_get_nslength(asn_per_data_t *pd); */ ssize_t uper_get_nsnnwn(asn_per_data_t *pd); +/* Non-thread-safe debugging function, don't use it */ +char *per_data_string(asn_per_data_t *pd); + /* * This structure supports forming PER output. */ From b08408b8464f1d6422b4d74bfd214adc65be0476 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Jun 2007 02:28:50 +0000 Subject: [PATCH 1349/1469] simple version of open type reader git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1357 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/per_opentype.c | 210 +++++++++++++++++++++++++++++---------- 1 file changed, 155 insertions(+), 55 deletions(-) diff --git a/skeletons/per_opentype.c b/skeletons/per_opentype.c index 4d624f043..1c3a49a77 100644 --- a/skeletons/per_opentype.c +++ b/skeletons/per_opentype.c @@ -15,47 +15,103 @@ typedef struct uper_ugot_key { } uper_ugot_key; static int uper_ugot_refill(asn_per_data_t *pd); -static asn_dec_rval_t uper_sot_suck(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd); +static int per_skip_bits(asn_per_data_t *pd, int skip_nbits); +static asn_dec_rval_t uper_sot_suck(asn_codec_ctx_t *, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd); /* + * Encode an "open type field". * #10.1, #10.2 */ int uper_open_type_put(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { void *buf; + void *bptr; ssize_t size; + size_t toGo; + + ASN_DEBUG("Open type put %s ...", td->name); - ASN_DEBUG("Encoding as open type %s", td->name); size = uper_encode_to_new_buffer(td, constraints, sptr, &buf); if(size <= 0) return -1; - ASN_DEBUG("Putting %s of length %d", td->name, size); - while(size) { - ssize_t maySave = uper_put_length(po, size); + for(bptr = buf, toGo = size; toGo;) { + ssize_t maySave = uper_put_length(po, toGo); if(maySave < 0) break; - if(per_put_many_bits(po, buf, maySave * 8)) break; - buf = (char *)buf + maySave; - size -= maySave; + if(per_put_many_bits(po, bptr, maySave * 8)) break; + bptr = (char *)bptr + maySave; + toGo -= maySave; } - if(size) { - FREEMEM(buf); - return -1; - } + FREEMEM(buf); + if(toGo) return -1; + + ASN_DEBUG("Open type put %s of length %d + overhead (1byte?)", + td->name, size); return 0; } -asn_dec_rval_t -uper_open_type_get(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, +static asn_dec_rval_t +uper_open_type_get_simple(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_dec_rval_t rv; + ssize_t chunk_bytes; + int repeat; + uint8_t *buf = 0; + size_t bufLen = 0; + size_t bufSize = 0; + asn_per_data_t spd; + + _ASN_STACK_OVERFLOW_CHECK(ctx); + + ASN_DEBUG("Getting open type %s from %s", td->name, + per_data_string(pd)); + + do { + chunk_bytes = uper_get_length(pd, -1, &repeat); + if(chunk_bytes < 0) { + FREEMEM(buf); + _ASN_DECODE_STARVED; + } + if(bufLen + chunk_bytes > bufSize) { + void *ptr; + bufSize = chunk_bytes + (bufSize << 2); + ptr = REALLOC(buf, bufSize); + if(!ptr) { + FREEMEM(buf); + _ASN_DECODE_FAILED; + } + buf = ptr; + } + if(per_get_many_bits(pd, buf + bufLen, 0, chunk_bytes << 3)) { + FREEMEM(buf); + _ASN_DECODE_STARVED; + } + bufLen += chunk_bytes; + } while(repeat); + + memset(&spd, 0, sizeof(spd)); + spd.buffer = buf; + spd.nbits = bufLen << 3; + + rv = td->uper_decoder(ctx, td, constraints, sptr, &spd); + + FREEMEM(buf); + + return rv; +} + +static asn_dec_rval_t GCC_NOTUSED +uper_open_type_get_complex(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { uper_ugot_key arg; asn_dec_rval_t rv; ssize_t padding; - _ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx); + _ASN_STACK_OVERFLOW_CHECK(ctx); - ASN_DEBUG("Getting open type off %d (%d+%d), %p", pd->moved, pd->nboff, pd->nbits, pd->buffer); + ASN_DEBUG("Getting open type %s from %s", td->name, + per_data_string(pd)); arg.oldpd = *pd; arg.unclaimed = 0; arg.ot_moved = 0; @@ -65,17 +121,28 @@ uper_open_type_get(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, pd->nbits = pd->nboff; /* 0 good bits at this point, will refill */ pd->moved = 0; /* This now counts the open type size in bits */ - rv = td->uper_decoder(opt_codec_ctx, td, constraints, sptr, pd); + /*asn_debug_indent += 4;*/ + rv = td->uper_decoder(ctx, td, constraints, sptr, pd); + /*asn_debug_indent -= 4;*/ - ASN_DEBUG("Open type %s consumed %d off of %d unclaimed=%d, repeat=%d", - td->name, pd->moved, arg.oldpd.moved, - arg.unclaimed, arg.repeat); +#define UPDRESTOREPD do { \ + /* buffer and nboff are valid, preserve them. */ \ + pd->nbits = arg.oldpd.nbits - (pd->moved - arg.ot_moved); \ + pd->moved = arg.oldpd.moved + (pd->moved - arg.ot_moved); \ + pd->refill = arg.oldpd.refill; \ + pd->refill_key = arg.oldpd.refill_key; \ + } while(0) - ASN_DEBUG("OT1 moved %d, estimated %d uncl=%d", - arg.oldpd.moved, - arg.oldpd.nboff + ((((int)arg.oldpd.buffer) & 0x7) << 3), - arg.unclaimed - ); + if(rv.code != RC_OK) { + UPDRESTOREPD; + return rv; + } + + ASN_DEBUG("OpenType %s pd%s old%s unclaimed=%d, repeat=%d" + , td->name, + per_data_string(pd), + per_data_string(&arg.oldpd), + arg.unclaimed, arg.repeat); padding = pd->moved % 8; if(padding) { @@ -84,6 +151,7 @@ uper_open_type_get(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ASN_DEBUG("Too large padding %d in open type", padding); rv.code = RC_FAIL; + UPDRESTOREPD; return rv; } padding = 8 - padding; @@ -92,50 +160,48 @@ uper_open_type_get(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, switch(pvalue) { case -1: ASN_DEBUG("Padding skip failed"); + UPDRESTOREPD; _ASN_DECODE_STARVED; case 0: break; default: ASN_DEBUG("Non-blank padding (%d bits 0x%02x)", padding, pvalue); + UPDRESTOREPD; _ASN_DECODE_FAILED; } } - if(pd->nbits != pd->nboff) { - ASN_DEBUG("Open type container overhead of %d bits!", pd->nbits - pd->nboff); - if(1) _ASN_DECODE_FAILED; - arg.unclaimed += pd->nbits - pd->nboff; + if(pd->nboff != pd->nbits) { + ASN_DEBUG("Open type %s overhead pd%s old%s", td->name, + per_data_string(pd), per_data_string(&arg.oldpd)); + if(1) { + UPDRESTOREPD; + _ASN_DECODE_FAILED; + } else { + arg.unclaimed += pd->nbits - pd->nboff; + } } /* Adjust pd back so it points to original data */ - pd->nbits = arg.oldpd.nbits - (pd->moved - arg.ot_moved); - pd->moved = arg.oldpd.moved + (pd->moved - arg.ot_moved); - pd->refill = arg.oldpd.refill; - pd->refill_key = arg.oldpd.refill_key; + UPDRESTOREPD; /* Skip data not consumed by the decoder */ if(arg.unclaimed) ASN_DEBUG("Getting unclaimed %d", arg.unclaimed); - while(arg.unclaimed) { - size_t toget = 24; - if(arg.unclaimed < toget) - toget = arg.unclaimed; - arg.unclaimed -= toget; - switch(per_get_few_bits(pd, toget)) { + if(arg.unclaimed) { + switch(per_skip_bits(pd, arg.unclaimed)) { case -1: - ASN_DEBUG("Claim of %d failed", toget); + ASN_DEBUG("Claim of %d failed", arg.unclaimed); _ASN_DECODE_STARVED; case 0: - ASN_DEBUG("Got claim of %d", toget); - continue; + ASN_DEBUG("Got claim of %d", arg.unclaimed); + break; default: /* Padding must be blank */ ASN_DEBUG("Non-blank unconsumed padding"); _ASN_DECODE_FAILED; } + arg.unclaimed = 0; } - if(0) /* Special debugging assert */ - assert(pd->moved == pd->nboff + ((((int)pd->buffer) & 0x7) << 3)); - if(arg.repeat) { ASN_DEBUG("Not consumed the whole thing"); rv.code = RC_FAIL; @@ -145,15 +211,25 @@ uper_open_type_get(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, return rv; } + +asn_dec_rval_t +uper_open_type_get(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + + return uper_open_type_get_simple(ctx, td, constraints, + sptr, pd); + +} + int -uper_open_type_skip(asn_codec_ctx_t *opt_codec_ctx, asn_per_data_t *pd) { +uper_open_type_skip(asn_codec_ctx_t *ctx, asn_per_data_t *pd) { asn_TYPE_descriptor_t s_td; asn_dec_rval_t rv; s_td.name = ""; s_td.uper_decoder = uper_sot_suck; - rv = uper_open_type_get(opt_codec_ctx, &s_td, 0, 0, pd); + rv = uper_open_type_get(ctx, &s_td, 0, 0, pd); if(rv.code != RC_OK) return -1; else @@ -165,11 +241,11 @@ uper_open_type_skip(asn_codec_ctx_t *opt_codec_ctx, asn_per_data_t *pd) { */ static asn_dec_rval_t -uper_sot_suck(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, +uper_sot_suck(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_dec_rval_t rv; - (void)opt_codec_ctx; + (void)ctx; (void)td; (void)constraints; (void)sptr; @@ -190,10 +266,8 @@ uper_ugot_refill(asn_per_data_t *pd) { asn_per_data_t *oldpd = &arg->oldpd; - ASN_DEBUG("REFILLING (%+db) [from %d (%d->%d)_%d] now [%d (%d->%d)_%d] uncl %d", - pd->buffer - oldpd->buffer, - oldpd->nbits - oldpd->nboff, oldpd->nboff, oldpd->nbits, oldpd->moved, - pd->nbits - pd->nboff, pd->nboff, pd->nbits, pd->moved, arg->unclaimed); + ASN_DEBUG("REFILLING pd->moved=%d, oldpd->moved=%d", + pd->moved, oldpd->moved); /* Advance our position to where pd is */ oldpd->buffer = pd->buffer; @@ -213,7 +287,7 @@ uper_ugot_refill(asn_per_data_t *pd) { pd->buffer = oldpd->buffer; pd->nboff = oldpd->nboff - 1; pd->nbits = oldpd->nbits; - ASN_DEBUG("Return from UNCLAIMED"); + ASN_DEBUG("UNCLAIMED <- return from (pd->moved=%d)", pd->moved); return 0; } @@ -235,12 +309,38 @@ uper_ugot_refill(asn_per_data_t *pd) { if(avail >= next_chunk_bits) { pd->nbits = oldpd->nboff + next_chunk_bits; arg->unclaimed = 0; + ASN_DEBUG("!+Parent frame %d bits, alloting %d [%d..%d] (%d)", + next_chunk_bits, oldpd->moved, + oldpd->nboff, oldpd->nbits, + oldpd->nbits - oldpd->nboff); } else { pd->nbits = oldpd->nbits; arg->unclaimed = next_chunk_bits - avail; - ASN_DEBUG("Parent has %d, require %d, will claim %d", avail, next_chunk_bits, arg->unclaimed); + ASN_DEBUG("!-Parent frame %d, require %d, will claim %d", avail, next_chunk_bits, arg->unclaimed); } pd->buffer = oldpd->buffer; pd->nboff = oldpd->nboff; + ASN_DEBUG("Refilled pd%s old%s", + per_data_string(pd), per_data_string(oldpd)); return 0; } + +static int +per_skip_bits(asn_per_data_t *pd, int skip_nbits) { + int hasNonZeroBits = 0; + while(skip_nbits > 0) { + int skip; + if(skip_nbits < skip) + skip = skip_nbits; + else + skip = 24; + skip_nbits -= skip; + + switch(per_get_few_bits(pd, skip)) { + case -1: return -1; /* Starving */ + case 0: continue; /* Skipped empty space */ + default: hasNonZeroBits = 1; continue; + } + } + return hasNonZeroBits; +} From 39422fb8ea6f1a0d01744227a4937c9b12d5abf4 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Jun 2007 11:25:49 +0000 Subject: [PATCH 1350/1469] simple version of open type decoder completed git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1358 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/per_opentype.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/skeletons/per_opentype.c b/skeletons/per_opentype.c index 1c3a49a77..2e5a7e118 100644 --- a/skeletons/per_opentype.c +++ b/skeletons/per_opentype.c @@ -18,6 +18,8 @@ static int uper_ugot_refill(asn_per_data_t *pd); static int per_skip_bits(asn_per_data_t *pd, int skip_nbits); static asn_dec_rval_t uper_sot_suck(asn_codec_ctx_t *, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd); +int asn_debug_indent; + /* * Encode an "open type field". * #10.1, #10.2 @@ -61,10 +63,11 @@ uper_open_type_get_simple(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, size_t bufLen = 0; size_t bufSize = 0; asn_per_data_t spd; + size_t padding; _ASN_STACK_OVERFLOW_CHECK(ctx); - ASN_DEBUG("Getting open type %s from %s", td->name, + ASN_DEBUG("Getting open type %s from %s...", td->name, per_data_string(pd)); do { @@ -90,14 +93,30 @@ uper_open_type_get_simple(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, bufLen += chunk_bytes; } while(repeat); + ASN_DEBUG("Getting open type %s encoded in %d bytes", td->name, + bufLen); + memset(&spd, 0, sizeof(spd)); spd.buffer = buf; spd.nbits = bufLen << 3; + asn_debug_indent += 4; rv = td->uper_decoder(ctx, td, constraints, sptr, &spd); + asn_debug_indent -= 4; FREEMEM(buf); + /* Check padding validity */ + padding = spd.nbits - spd.nboff; + if(padding >= 8) { + ASN_DEBUG("Too large padding %d in open type", padding); + _ASN_DECODE_FAILED; + } else if(per_get_few_bits(&spd, padding)) { + /* Can't be "no more data", then it's non-zero padding */ + ASN_DEBUG("Non-zero padding"); + _ASN_DECODE_FAILED; + } + return rv; } @@ -121,9 +140,9 @@ uper_open_type_get_complex(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, pd->nbits = pd->nboff; /* 0 good bits at this point, will refill */ pd->moved = 0; /* This now counts the open type size in bits */ - /*asn_debug_indent += 4;*/ + asn_debug_indent += 4; rv = td->uper_decoder(ctx, td, constraints, sptr, pd); - /*asn_debug_indent -= 4;*/ + asn_debug_indent -= 4; #define UPDRESTOREPD do { \ /* buffer and nboff are valid, preserve them. */ \ From 36fc702cec3477fb71d4b27a417290a14b8cd86b Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Jun 2007 11:32:25 +0000 Subject: [PATCH 1351/1469] removed non-threadsafe stuff from code path git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1359 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/per_opentype.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/skeletons/per_opentype.c b/skeletons/per_opentype.c index 2e5a7e118..5a7439f7a 100644 --- a/skeletons/per_opentype.c +++ b/skeletons/per_opentype.c @@ -67,8 +67,7 @@ uper_open_type_get_simple(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, _ASN_STACK_OVERFLOW_CHECK(ctx); - ASN_DEBUG("Getting open type %s from %s...", td->name, - per_data_string(pd)); + ASN_DEBUG("Getting open type %s...", td->name); do { chunk_bytes = uper_get_length(pd, -1, &repeat); From d97308e7befc01baefd9aa98e929551ae080539d Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Jun 2007 11:38:57 +0000 Subject: [PATCH 1352/1469] thread safety to the masses git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1360 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_internal.h | 17 ++++++++++++----- skeletons/asn_system.h | 8 +++++++- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/skeletons/asn_internal.h b/skeletons/asn_internal.h index 3f99452f4..674ed5117 100644 --- a/skeletons/asn_internal.h +++ b/skeletons/asn_internal.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2003, 2004, 2005 Lev Walkin . + * Copyright (c) 2003, 2004, 2005, 2007 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ @@ -35,10 +35,17 @@ int get_asn1c_environment_version(void); /* Run-time version */ #ifndef ASN_DEBUG /* If debugging code is not defined elsewhere... */ #if EMIT_ASN_DEBUG == 1 /* And it was asked to emit this code... */ #ifdef __GNUC__ -#define ASN_DEBUG(fmt, args...) do { \ - fprintf(stderr, fmt, ##args); \ - fprintf(stderr, " (%s:%d)\n", \ - __FILE__, __LINE__); \ +#ifdef ASN_THREAD_SAFE +#define asn_debug_indent 0 +#endif +int asn_debug_indent; +#endif +#define ASN_DEBUG(fmt, args...) do { \ + int adi = asn_debug_indent; \ + while(adi--) fprintf(stderr, " "); \ + fprintf(stderr, fmt, ##args); \ + fprintf(stderr, " (%s:%d)\n", \ + __FILE__, __LINE__); \ } while(0) #else /* !__GNUC__ */ void ASN_DEBUG_f(const char *fmt, ...); diff --git a/skeletons/asn_system.h b/skeletons/asn_system.h index b1e0212ec..51af1dfbf 100644 --- a/skeletons/asn_system.h +++ b/skeletons/asn_system.h @@ -1,5 +1,6 @@ /*- - * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Copyright (c) 2003, 2004, 2007 Lev Walkin . + * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ /* @@ -103,6 +104,11 @@ typedef unsigned int uint32_t; #endif #endif +/* Figure out if thread safety is requested */ +#if !defined(ASN_THREAD_SAFE) && (defined(THREAD_SAFE) || define(_REENTRANT)) +#define ASN_THREAD_SAFE +#endif /* Thread safety */ + #ifndef offsetof /* If not defined by */ #define offsetof(s, m) ((ptrdiff_t)&(((s *)0)->m) - (ptrdiff_t)((s *)0)) #endif /* offsetof */ From bed38ddc060cfc0370616e9f17a18761292a2d6b Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Jun 2007 12:10:50 +0000 Subject: [PATCH 1353/1469] fixed macros git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1361 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_internal.h | 4 ++-- skeletons/asn_system.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/skeletons/asn_internal.h b/skeletons/asn_internal.h index 674ed5117..249d7ef64 100644 --- a/skeletons/asn_internal.h +++ b/skeletons/asn_internal.h @@ -37,9 +37,9 @@ int get_asn1c_environment_version(void); /* Run-time version */ #ifdef __GNUC__ #ifdef ASN_THREAD_SAFE #define asn_debug_indent 0 -#endif +#else /* !ASN_THREAD_SAFE */ int asn_debug_indent; -#endif +#endif /* ASN_THREAD_SAFE */ #define ASN_DEBUG(fmt, args...) do { \ int adi = asn_debug_indent; \ while(adi--) fprintf(stderr, " "); \ diff --git a/skeletons/asn_system.h b/skeletons/asn_system.h index 51af1dfbf..fe696454e 100644 --- a/skeletons/asn_system.h +++ b/skeletons/asn_system.h @@ -105,7 +105,7 @@ typedef unsigned int uint32_t; #endif /* Figure out if thread safety is requested */ -#if !defined(ASN_THREAD_SAFE) && (defined(THREAD_SAFE) || define(_REENTRANT)) +#if !defined(ASN_THREAD_SAFE) && (defined(THREAD_SAFE) || defined(_REENTRANT)) #define ASN_THREAD_SAFE #endif /* Thread safety */ From 4416cc63cc5565d687243e943ea9ceb70ff8e27d Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Jun 2007 12:44:01 +0000 Subject: [PATCH 1354/1469] ability to display title git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1362 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/converter-sample.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/skeletons/converter-sample.c b/skeletons/converter-sample.c index 4f5b8ed27..0a682a275 100644 --- a/skeletons/converter-sample.c +++ b/skeletons/converter-sample.c @@ -1,6 +1,7 @@ /* * Generic converter template for a selected ASN.1 type. - * Copyright (c) 2005, 2006 Lev Walkin . All rights reserved. + * Copyright (c) 2005, 2006, 2007 Lev Walkin . + * All rights reserved. * * To compile with your own ASN.1 type, please redefine the PDU as shown: * @@ -186,6 +187,11 @@ main(int ac, char *av[]) { #endif /* JUNKTEST */ case 'h': default: +#ifdef ASN_CONVERTER_TITLE +#define _AXS(x) #x +#define _ASX(x) _AXS(x) + fprintf(stderr, "%s\n", _ASX(ASN_CONVERTER_TITLE)); +#endif fprintf(stderr, "Usage: %s [options] ...\n", av[0]); fprintf(stderr, "Where options are:\n"); if(pduType->uper_decoder) From 4362b1da54997981cfbaaac67e667d06b26e8734 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Jun 2007 12:46:06 +0000 Subject: [PATCH 1355/1469] Open Mobile Alliance UserPlane Location Protocol git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1363 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 3 +- examples/README | 8 +- examples/sample.makefile.regen | 6 +- examples/sample.source.LDAP3/Makefile | 5 +- examples/sample.source.MEGACO/Makefile | 54 ++-- examples/sample.source.PKIX1/Makefile | 2 + examples/sample.source.RRC/Makefile | 2 + examples/sample.source.TAP3/Makefile | 7 +- examples/sample.source.ULP/Makefile | 339 +++++++++++++++++++++++++ examples/sample.source.ULP/README | 53 ++++ examples/sample.source.ULP/config.h | 10 + 11 files changed, 453 insertions(+), 36 deletions(-) create mode 100644 examples/sample.source.ULP/Makefile create mode 100644 examples/sample.source.ULP/README create mode 100644 examples/sample.source.ULP/config.h diff --git a/ChangeLog b/ChangeLog index 56273ddae..6afb54ec7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9.22: 2007-Jun-26 +0.9.22: 2007-Jun-29 * Added -pdu=all and -pdu= switches to asn1c. * Added PER support for most known-multiplier string types: @@ -16,6 +16,7 @@ * Fixed extensibility handling of second SEQUENCE production. (Severity: low; Security impact: none) * Added DEFAULT handling for known multiplier string. + * Added a sample OMA ULP decoder (./examples/sample.source.ULP). 0.9.21: 2006-Sep-17 diff --git a/examples/README b/examples/README index 42910a846..e97683d6d 100644 --- a/examples/README +++ b/examples/README @@ -15,11 +15,15 @@ This directory contains a few examples. Lightweight Directory Access Protocol version 3 PDU as specified in rfc4211.txt. +6. The ./sample.source.RRC directory contains the 3GPP Radio Resource Control + decoder. Just type `make` in there to compile. + 5. The ./sample.source.TAP3 directory contains the GSM TAP3 decoder. Before trying to compile, read the README file in that directory. -6. The ./sample.source.RRC directory contains the 3GPP Radio Resource Control - decoder. Just type `make` in there to compile. +6. The ./sample.source.ULP directory contains the Open Mobile Alliance + UserPlane Location Protocol decoder. Before trying to compile, read the + README file in that directory. The clyx2asn1.pl script can be used to extract ASN.1 data from LyX editor files. diff --git a/examples/sample.makefile.regen b/examples/sample.makefile.regen index 5e189478c..50551b29f 100755 --- a/examples/sample.makefile.regen +++ b/examples/sample.makefile.regen @@ -39,9 +39,8 @@ if test ! -f Makefile.am.sample ; then fi EXTRA_CFLAGS="-DJUNKTEST" -if test -f config.h ; then - EXTRA_CFLAGS="-DHAVE_CONFIG_H ${EXTRA_CFLAGS}" -fi +test -f config.h && EXTRA_CFLAGS="-DHAVE_CONFIG_H ${EXTRA_CFLAGS}" +test -n "$TITLE" && EXTRA_CFLAGS="-DASN_CONVERTER_TITLE=\"$TITLE\" ${EXTRA_CFLAGS}" set -x cat Makefile.am.sample \ @@ -58,6 +57,7 @@ set +x echo " make" echo echo "regen-makefile:" + test -n "$TITLE" && echo " TITLE=\"$TITLE\" \\" echo " ASN1CMDOPTS=\"${ASN1CMDOPTS}\" \\" echo " ASN1MODULES=\"${ASN1MODULES}\" \\" echo " ASN1PDU=${ASN1PDU} \\" diff --git a/examples/sample.source.LDAP3/Makefile b/examples/sample.source.LDAP3/Makefile index b47bbcc81..c47e22f21 100644 --- a/examples/sample.source.LDAP3/Makefile +++ b/examples/sample.source.LDAP3/Makefile @@ -154,6 +154,8 @@ ASN_MODULE_HEADERS+=per_decoder.h ASN_MODULE_SOURCES+=per_decoder.c ASN_MODULE_HEADERS+=per_encoder.h ASN_MODULE_SOURCES+=per_encoder.c +ASN_MODULE_HEADERS+=per_opentype.h +ASN_MODULE_SOURCES+=per_opentype.c ASN_CONVERTER_SOURCES+=converter-sample.c @@ -163,7 +165,7 @@ libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) # This file may be used as an input for make(3) # Remove the lines below to convert it into a pure .am file TARGET = ldap3dump -CFLAGS += -DHAVE_CONFIG_H -DJUNKTEST -DPDU=LDAPMessage -I. +CFLAGS += -DASN_CONVERTER_TITLE="Lightweight Directory Access Protocol V3 decoder" -DHAVE_CONFIG_H -DJUNKTEST -DPDU=LDAPMessage -I. OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} all: LDAPMessage.c $(TARGET) @@ -193,6 +195,7 @@ LDAPMessage.c: ../sample.makefile.regen ../rfc4511-Lightweight-Directory-Access- make regen-makefile: + TITLE="Lightweight Directory Access Protocol V3 decoder" \ ASN1CMDOPTS="-fcompound-names" \ ASN1MODULES="../rfc4511-Lightweight-Directory-Access-Protocol-V3.asn1" \ ASN1PDU=LDAPMessage \ diff --git a/examples/sample.source.MEGACO/Makefile b/examples/sample.source.MEGACO/Makefile index 47507af06..1784c30bf 100644 --- a/examples/sample.source.MEGACO/Makefile +++ b/examples/sample.source.MEGACO/Makefile @@ -276,6 +276,8 @@ ASN_MODULE_HEADERS+=per_decoder.h ASN_MODULE_SOURCES+=per_decoder.c ASN_MODULE_HEADERS+=per_encoder.h ASN_MODULE_SOURCES+=per_encoder.c +ASN_MODULE_HEADERS+=per_opentype.h +ASN_MODULE_SOURCES+=per_opentype.c ASN_CONVERTER_SOURCES+=converter-sample.c @@ -332,12 +334,12 @@ check-ber: for b in 1 17 33 980 8192; do \ echo "Recoding $$f into XER and back ($$b)..."; \ ./${TARGET} -b $$b -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -b $$b -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -b $$b -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 4; \ rm -f ./.tmp.[12].$$$$; \ echo "Test junking $$f (please wait)..."; \ - ./${TARGET} -J0.0001 -n 1000 -b $$b -iber -onull $$f || exit 2; \ - ./${TARGET} -J0.001 -n 1000 -b $$b -iber -onull $$f || exit 2; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -iber -onull $$f || exit 5; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -iber -onull $$f || exit 6; \ done; done; fi check-xer: @@ -346,41 +348,41 @@ check-xer: for b in 1 17 33 980 8192; do \ echo "Recoding $$f into DER and back ($$b)..."; \ ./${TARGET} -b $$b -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - diff $$f ./.tmp.2.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \ + diff $$f ./.tmp.2.$$$$ || exit 4; \ rm -f ./.tmp.[12].$$$$; \ echo "Test junking $$f (please wait)..."; \ - ./${TARGET} -J0.0001 -n 1000 -b $$b -ixer -onull $$f || exit 2; \ - ./${TARGET} -J0.001 -n 1000 -b $$b -ixer -onull $$f || exit 2; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -ixer -onull $$f || exit 5; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -ixer -onull $$f || exit 6; \ done; done; fi check-per: - @if test -f sample-MegacoMessage-1.per ; then \ - for f in sample-MegacoMessage-[1-9].per; do \ + @if test -f sample-MegacoMessage-1-nopad.per ; then \ + for f in sample-MegacoMessage-[1-9]-nopad.per; do \ for b in 1 17 33 980 8192; do \ - echo "Recoding $$f into DER into XER and back ($$b)..."; \ - ./${TARGET} -b $$b -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -b $$b -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 2; \ - diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 2; \ + echo "Recoding non-padded $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -per-nopad -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \ + ./${TARGET} -b $$b -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 4; \ + diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 5; \ rm -f ./.tmp.[123].$$$$; \ echo "Test junking $$f (please wait)..."; \ - ./${TARGET} -J0.0001 -n 1000 -b $$b -iper -onull $$f || exit 2; \ - ./${TARGET} -J0.001 -n 1000 -b $$b -iper -onull $$f || exit 2; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -per-nopad -iper -onull $$f || exit 6; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -per-nopad -iper -onull $$f || exit 7; \ done; done; fi - @if test -f sample-MegacoMessage-1-padded.per ; then \ - for f in sample-*-[1-9]-padded.per; do \ + @if test -f sample-MegacoMessage-1.per ; then \ + for f in sample-*-[1-9].per; do \ pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z-]+)-[0-9].*/\1/"`; \ for b in 1 17 33 980 8192; do \ - echo "Recoding byte-padded $$f into DER into XER and back ($$b)..."; \ - ./${TARGET} -b $$b -per-padded -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ - ./${TARGET} -b $$b -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 2; \ - ./${TARGET} -b $$b -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 2; \ - diff $$f ./.tmp.1.$$$$ || exit 2; \ + echo "Recoding $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 3; \ + ./${TARGET} -b $$b -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 4; \ + ./${TARGET} -b $$b -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 5; \ + diff $$f ./.tmp.1.$$$$ || exit 6; \ rm -f ./.tmp.[12].$$$$; \ echo "Test junking $$f (please wait)..."; \ - ./${TARGET} -J0.0001 -n 1000 -b $$b -per-padded -iper -onull $$f || exit 2; \ - ./${TARGET} -J0.001 -n 1000 -b $$b -per-padded -iper -onull $$f || exit 2; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -iper -onull $$f || exit 7; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -iper -onull $$f || exit 8; \ done; done; fi distclean: clean diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index da4029e4b..112b5173a 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -336,6 +336,8 @@ ASN_MODULE_HEADERS+=per_decoder.h ASN_MODULE_SOURCES+=per_decoder.c ASN_MODULE_HEADERS+=per_encoder.h ASN_MODULE_SOURCES+=per_encoder.c +ASN_MODULE_HEADERS+=per_opentype.h +ASN_MODULE_SOURCES+=per_opentype.c ASN_CONVERTER_SOURCES+=converter-sample.c diff --git a/examples/sample.source.RRC/Makefile b/examples/sample.source.RRC/Makefile index 5ecd357e5..6c5dd4a12 100644 --- a/examples/sample.source.RRC/Makefile +++ b/examples/sample.source.RRC/Makefile @@ -4730,6 +4730,8 @@ ASN_MODULE_HEADERS+=per_decoder.h ASN_MODULE_SOURCES+=per_decoder.c ASN_MODULE_HEADERS+=per_encoder.h ASN_MODULE_SOURCES+=per_encoder.c +ASN_MODULE_HEADERS+=per_opentype.h +ASN_MODULE_SOURCES+=per_opentype.c ASN_CONVERTER_SOURCES+=converter-sample.c ASN_CONVERTER_SOURCES+=pdu_collection.c diff --git a/examples/sample.source.TAP3/Makefile b/examples/sample.source.TAP3/Makefile index 491d08cea..6a44b5b47 100644 --- a/examples/sample.source.TAP3/Makefile +++ b/examples/sample.source.TAP3/Makefile @@ -618,8 +618,6 @@ ASN_MODULE_HEADERS= \ ASN_MODULE_HEADERS+=INTEGER.h ASN_MODULE_HEADERS+=NativeEnumerated.h -ASN_MODULE_HEADERS+=IA5String.h -ASN_MODULE_SOURCES+=IA5String.c ASN_MODULE_SOURCES+=INTEGER.c ASN_MODULE_SOURCES+=NativeEnumerated.c ASN_MODULE_HEADERS+=NativeInteger.h @@ -670,6 +668,8 @@ ASN_MODULE_HEADERS+=per_decoder.h ASN_MODULE_SOURCES+=per_decoder.c ASN_MODULE_HEADERS+=per_encoder.h ASN_MODULE_SOURCES+=per_encoder.c +ASN_MODULE_HEADERS+=per_opentype.h +ASN_MODULE_SOURCES+=per_opentype.c ASN_CONVERTER_SOURCES+=converter-sample.c @@ -679,7 +679,7 @@ libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) # This file may be used as an input for make(3) # Remove the lines below to convert it into a pure .am file TARGET = tap3dump -CFLAGS += -DHAVE_CONFIG_H -DJUNKTEST -DPDU=DataInterChange -I. +CFLAGS += -DASN_CONVERTER_TITLE="GSM TAP3 (Transferred Account Procedure, Version 3) decoder" -DHAVE_CONFIG_H -DJUNKTEST -DPDU=DataInterChange -I. OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} all: DataInterChange.c $(TARGET) @@ -709,6 +709,7 @@ DataInterChange.c: ../sample.makefile.regen ../tap3.asn1 make regen-makefile: + TITLE="GSM TAP3 (Transferred Account Procedure, Version 3) decoder" \ ASN1CMDOPTS="" \ ASN1MODULES="../tap3.asn1" \ ASN1PDU=DataInterChange \ diff --git a/examples/sample.source.ULP/Makefile b/examples/sample.source.ULP/Makefile new file mode 100644 index 000000000..417be53d2 --- /dev/null +++ b/examples/sample.source.ULP/Makefile @@ -0,0 +1,339 @@ +ASN_MODULE_SOURCES= \ + ULP-PDU.c \ + UlpMessage.c \ + SUPLINIT.c \ + Notification.c \ + NotificationType.c \ + EncodingType.c \ + FormatIndicator.c \ + SLPMode.c \ + MAC.c \ + KeyIdentity.c \ + SUPLSTART.c \ + SETCapabilities.c \ + PosTechnology.c \ + PrefMethod.c \ + PosProtocol.c \ + SUPLRESPONSE.c \ + SETAuthKey.c \ + KeyIdentity4.c \ + SUPLPOSINIT.c \ + RequestedAssistData.c \ + NavigationModel.c \ + SatelliteInfo.c \ + SatelliteInfoElement.c \ + SUPLPOS.c \ + PosPayLoad.c \ + SUPLEND.c \ + SUPLAUTHREQ.c \ + SETNonce.c \ + KeyIdentity2.c \ + SUPLAUTHRESP.c \ + SPCAuthKey.c \ + KeyIdentity3.c \ + Version.c \ + SessionID.c \ + SetSessionID.c \ + SETId.c \ + SlpSessionID.c \ + IPAddress.c \ + SLPAddress.c \ + FQDN.c \ + Ver.c \ + LocationId.c \ + Status.c \ + CellInfo.c \ + Position.c \ + PositionEstimate.c \ + AltitudeInfo.c \ + CdmaCellInformation.c \ + GsmCellInformation.c \ + WcdmaCellInformation.c \ + FrequencyInfo.c \ + FrequencyInfoFDD.c \ + FrequencyInfoTDD.c \ + UARFCN.c \ + NMR.c \ + NMRelement.c \ + MeasuredResultsList.c \ + MeasuredResults.c \ + CellMeasuredResultsList.c \ + UTRA-CarrierRSSI.c \ + CellMeasuredResults.c \ + CellParametersID.c \ + TGSN.c \ + PrimaryCCPCH-RSCP.c \ + TimeslotISCP.c \ + TimeslotISCP-List.c \ + PrimaryCPICH-Info.c \ + CPICH-Ec-N0.c \ + CPICH-RSCP.c \ + Pathloss.c \ + StatusCode.c \ + QoP.c \ + Velocity.c \ + Horvel.c \ + Horandvervel.c \ + Horveluncert.c \ + Horandveruncert.c \ + PosMethod.c + +ASN_MODULE_HEADERS= \ + ULP-PDU.h \ + UlpMessage.h \ + SUPLINIT.h \ + Notification.h \ + NotificationType.h \ + EncodingType.h \ + FormatIndicator.h \ + SLPMode.h \ + MAC.h \ + KeyIdentity.h \ + SUPLSTART.h \ + SETCapabilities.h \ + PosTechnology.h \ + PrefMethod.h \ + PosProtocol.h \ + SUPLRESPONSE.h \ + SETAuthKey.h \ + KeyIdentity4.h \ + SUPLPOSINIT.h \ + RequestedAssistData.h \ + NavigationModel.h \ + SatelliteInfo.h \ + SatelliteInfoElement.h \ + SUPLPOS.h \ + PosPayLoad.h \ + SUPLEND.h \ + SUPLAUTHREQ.h \ + SETNonce.h \ + KeyIdentity2.h \ + SUPLAUTHRESP.h \ + SPCAuthKey.h \ + KeyIdentity3.h \ + Version.h \ + SessionID.h \ + SetSessionID.h \ + SETId.h \ + SlpSessionID.h \ + IPAddress.h \ + SLPAddress.h \ + FQDN.h \ + Ver.h \ + LocationId.h \ + Status.h \ + CellInfo.h \ + Position.h \ + PositionEstimate.h \ + AltitudeInfo.h \ + CdmaCellInformation.h \ + GsmCellInformation.h \ + WcdmaCellInformation.h \ + FrequencyInfo.h \ + FrequencyInfoFDD.h \ + FrequencyInfoTDD.h \ + UARFCN.h \ + NMR.h \ + NMRelement.h \ + MeasuredResultsList.h \ + MeasuredResults.h \ + CellMeasuredResultsList.h \ + UTRA-CarrierRSSI.h \ + CellMeasuredResults.h \ + CellParametersID.h \ + TGSN.h \ + PrimaryCCPCH-RSCP.h \ + TimeslotISCP.h \ + TimeslotISCP-List.h \ + PrimaryCPICH-Info.h \ + CPICH-Ec-N0.h \ + CPICH-RSCP.h \ + Pathloss.h \ + StatusCode.h \ + QoP.h \ + Velocity.h \ + Horvel.h \ + Horandvervel.h \ + Horveluncert.h \ + Horandveruncert.h \ + PosMethod.h + +ASN_MODULE_HEADERS+=BOOLEAN.h +ASN_MODULE_SOURCES+=BOOLEAN.c +ASN_MODULE_HEADERS+=ENUMERATED.h +ASN_MODULE_SOURCES+=ENUMERATED.c +ASN_MODULE_HEADERS+=INTEGER.h +ASN_MODULE_HEADERS+=NativeEnumerated.h +ASN_MODULE_HEADERS+=GeneralizedTime.h +ASN_MODULE_SOURCES+=GeneralizedTime.c +ASN_MODULE_HEADERS+=IA5String.h +ASN_MODULE_SOURCES+=IA5String.c +ASN_MODULE_SOURCES+=INTEGER.c +ASN_MODULE_SOURCES+=NativeEnumerated.c +ASN_MODULE_HEADERS+=NativeInteger.h +ASN_MODULE_SOURCES+=NativeInteger.c +ASN_MODULE_HEADERS+=UTCTime.h +ASN_MODULE_SOURCES+=UTCTime.c +ASN_MODULE_HEADERS+=VisibleString.h +ASN_MODULE_SOURCES+=VisibleString.c +ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h +ASN_MODULE_SOURCES+=asn_SEQUENCE_OF.c +ASN_MODULE_HEADERS+=asn_SET_OF.h +ASN_MODULE_SOURCES+=asn_SET_OF.c +ASN_MODULE_HEADERS+=constr_CHOICE.h +ASN_MODULE_SOURCES+=constr_CHOICE.c +ASN_MODULE_HEADERS+=constr_SEQUENCE.h +ASN_MODULE_SOURCES+=constr_SEQUENCE.c +ASN_MODULE_HEADERS+=constr_SEQUENCE_OF.h +ASN_MODULE_SOURCES+=constr_SEQUENCE_OF.c +ASN_MODULE_HEADERS+=constr_SET_OF.h +ASN_MODULE_SOURCES+=constr_SET_OF.c +ASN_MODULE_HEADERS+=asn_application.h +ASN_MODULE_HEADERS+=asn_system.h +ASN_MODULE_HEADERS+=asn_codecs.h +ASN_MODULE_HEADERS+=asn_internal.h +ASN_MODULE_HEADERS+=OCTET_STRING.h +ASN_MODULE_SOURCES+=OCTET_STRING.c +ASN_MODULE_HEADERS+=BIT_STRING.h +ASN_MODULE_SOURCES+=BIT_STRING.c +ASN_MODULE_SOURCES+=asn_codecs_prim.c +ASN_MODULE_HEADERS+=asn_codecs_prim.h +ASN_MODULE_HEADERS+=ber_tlv_length.h +ASN_MODULE_SOURCES+=ber_tlv_length.c +ASN_MODULE_HEADERS+=ber_tlv_tag.h +ASN_MODULE_SOURCES+=ber_tlv_tag.c +ASN_MODULE_HEADERS+=ber_decoder.h +ASN_MODULE_SOURCES+=ber_decoder.c +ASN_MODULE_HEADERS+=der_encoder.h +ASN_MODULE_SOURCES+=der_encoder.c +ASN_MODULE_HEADERS+=constr_TYPE.h +ASN_MODULE_SOURCES+=constr_TYPE.c +ASN_MODULE_HEADERS+=constraints.h +ASN_MODULE_SOURCES+=constraints.c +ASN_MODULE_HEADERS+=xer_support.h +ASN_MODULE_SOURCES+=xer_support.c +ASN_MODULE_HEADERS+=xer_decoder.h +ASN_MODULE_SOURCES+=xer_decoder.c +ASN_MODULE_HEADERS+=xer_encoder.h +ASN_MODULE_SOURCES+=xer_encoder.c +ASN_MODULE_HEADERS+=per_support.h +ASN_MODULE_SOURCES+=per_support.c +ASN_MODULE_HEADERS+=per_decoder.h +ASN_MODULE_SOURCES+=per_decoder.c +ASN_MODULE_HEADERS+=per_encoder.h +ASN_MODULE_SOURCES+=per_encoder.c +ASN_MODULE_HEADERS+=per_opentype.h +ASN_MODULE_SOURCES+=per_opentype.c +ASN_CONVERTER_SOURCES+=converter-sample.c + + +lib_LTLIBRARIES=libsomething.la +libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) + +# This file may be used as an input for make(3) +# Remove the lines below to convert it into a pure .am file +TARGET = ulp-dump +CFLAGS += -DASN_CONVERTER_TITLE="OMA UserPlane Location Protocol decoder" -DHAVE_CONFIG_H -DJUNKTEST -DPDU=ULP_PDU -I. +OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} + +all: ULP-PDU.c $(TARGET) + +$(TARGET): ${OBJS} + $(CC) $(CFLAGS) -o $(TARGET) ${OBJS} $(LDFLAGS) $(LIBS) + +.SUFFIXES: +.SUFFIXES: .c .o + +.c.o: + $(CC) $(CFLAGS) -o $@ -c $< + +clean: + rm -f $(TARGET) + rm -f $(OBJS) + +regen: regenerate-from-asn1-source + +regenerate-from-asn1-source: + ../../asn1c/asn1c -S ../../skeletons -pdu=ULP-PDU -fcompound-names -gen-PER ../ulp.asn1 + + +ULP-PDU.c: ../sample.makefile.regen ../ulp.asn1 + make regen-makefile + @touch ULP-PDU.c + make + +regen-makefile: + TITLE="OMA UserPlane Location Protocol decoder" \ + ASN1CMDOPTS="-fcompound-names -gen-PER" \ + ASN1MODULES="../ulp.asn1" \ + ASN1PDU=ULP-PDU \ + PROGNAME=ulp-dump \ + ../sample.makefile.regen + +check: ${TARGET} check-ber check-xer check-per + @echo ================ + @echo All tests passed + @echo ================ + +check-ber: + @if test -f sample-ULP-PDU-1.[db]er ; then \ + for f in sample-ULP-PDU-*.[db]er; do \ + for b in 1 17 33 980 8192; do \ + echo "Recoding $$f into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \ + diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 4; \ + rm -f ./.tmp.[12].$$$$; \ + echo "Test junking $$f (please wait)..."; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -iber -onull $$f || exit 5; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -iber -onull $$f || exit 6; \ + done; done; fi + +check-xer: + @if test -f sample-ULP-PDU-1.xer ; then \ + for f in sample-ULP-PDU-*.xer; do \ + for b in 1 17 33 980 8192; do \ + echo "Recoding $$f into DER and back ($$b)..."; \ + ./${TARGET} -b $$b -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \ + diff $$f ./.tmp.2.$$$$ || exit 4; \ + rm -f ./.tmp.[12].$$$$; \ + echo "Test junking $$f (please wait)..."; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -ixer -onull $$f || exit 5; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -ixer -onull $$f || exit 6; \ + done; done; fi + +check-per: + @if test -f sample-ULP-PDU-1-nopad.per ; then \ + for f in sample-ULP-PDU-[1-9]-nopad.per; do \ + for b in 1 17 33 980 8192; do \ + echo "Recoding non-padded $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -per-nopad -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \ + ./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \ + ./${TARGET} -b $$b -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 4; \ + diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 5; \ + rm -f ./.tmp.[123].$$$$; \ + echo "Test junking $$f (please wait)..."; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -per-nopad -iper -onull $$f || exit 6; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -per-nopad -iper -onull $$f || exit 7; \ + done; done; fi + @if test -f sample-ULP-PDU-1.per ; then \ + for f in sample-*-[1-9].per; do \ + pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z-]+)-[0-9].*/\1/"`; \ + for b in 1 17 33 980 8192; do \ + echo "Recoding $$f into DER into XER and back ($$b)..."; \ + ./${TARGET} -b $$b -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 3; \ + ./${TARGET} -b $$b -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 4; \ + ./${TARGET} -b $$b -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 5; \ + diff $$f ./.tmp.1.$$$$ || exit 6; \ + rm -f ./.tmp.[12].$$$$; \ + echo "Test junking $$f (please wait)..."; \ + ./${TARGET} -J0.0001 -n 1000 -b $$b -iper -onull $$f || exit 7; \ + ./${TARGET} -J0.001 -n 1000 -b $$b -iper -onull $$f || exit 8; \ + done; done; fi + +distclean: clean + rm -f $(ASN_MODULE_SOURCES) + rm -f $(ASN_MODULE_HEADERS) + rm -f $(ASN_CONVERTER_SOURCES) $(ASN_CONVERTER_HEADERS) + rm -f Makefile.am.sample diff --git a/examples/sample.source.ULP/README b/examples/sample.source.ULP/README new file mode 100644 index 000000000..88f715876 --- /dev/null +++ b/examples/sample.source.ULP/README @@ -0,0 +1,53 @@ + +GENERAL INFORMATION +=================== + +The OMA ULP (UserPlane Location Protocol) decoder. +Invoking `make` will compile the ASN.1 specifications from the +../ulp.asn1 file. + +THERE IS NO ulp.asn1 FILE THERE YET! + +OBTAINING THE ULP SPECIFICATION +=============================== + +Due to unclear stanza of Open Mobile Alliance regarding the extraction of +ASN.1 modules from their documents, and also due to some OMA membership +concerns, asn1c can not include the ULP ASN.1 module in its distribution. + +To obtain the ULP ASN.1 specification, you should go to + http://www.openmobilealliance.org/UseAgreement.html +and agree with their licensing terms by clicking the "I ACCEPT" button. + +Then, go to http://member.openmobilealliance.org/ftp/Public_documents/LOC/Permanent_documents/ +and download the necessary specification file. For example, one of these: + Version 1.0 specifications (Candidate versions): + OMA-TS-ULP-V1_0-20070122-C.zip (V1.0, 2007 January 22) + OMA-TS-ULP-V1_0-20070613-C.zip (V1.0, 2007 June 13) + Version 2.0 specification (Draft version): + OMA-TS-ULP-V2_0-20070625-D.zip (V2.0, 2007 April 25) + +A .ZIP file with several Microsoft Word .DOC files will download shortly. + +You should extract the ASN.1 module from the section 8 of these .DOC files +and save it as the ../ulp.asn1 file. The ../ulp.asn1 file should start with +the following line + "ULP DEFINITIONS IMPLICIT TAGS ::=" +and end with the "END" token. +Be careful not to copy any non-ASN.1 preambles from that .DOC file. + +After obtaining the tap3.asn1, type `make` in the directory containing +this README file. + +ulp-dump USAGE +============== + +The ulp-dump utility may be used to dump the contents of the PER-encoded +ULP message record file: + + ./ulp-dump ulpfile.per # Print as XML (BASIC-XER) + +The full list of recognized command line options may be obtained with + + > ./ulp-dump -h + diff --git a/examples/sample.source.ULP/config.h b/examples/sample.source.ULP/config.h new file mode 100644 index 000000000..2dda9297a --- /dev/null +++ b/examples/sample.source.ULP/config.h @@ -0,0 +1,10 @@ + +extern int opt_debug; + +#define ASN_DEBUG(fmt, args...) do { \ + if(opt_debug < 2) break; \ + fprintf(stderr, fmt, ##args); \ + fprintf(stderr, " (%s:%d)\n", \ + __FILE__, __LINE__); \ + } while(0) + From 7489c7f0d86bc7ef1367c7f3b11e82d0b04702a8 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Jun 2007 12:59:12 +0000 Subject: [PATCH 1356/1469] testing data git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1364 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.ULP/Makefile | 7 ++++--- examples/sample.source.ULP/sample-ULP-PDU-1.per | Bin 0 -> 29 bytes examples/sample.source.ULP/sample-ULP-PDU-2.per | Bin 0 -> 24 bytes 3 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 examples/sample.source.ULP/sample-ULP-PDU-1.per create mode 100644 examples/sample.source.ULP/sample-ULP-PDU-2.per diff --git a/examples/sample.source.ULP/Makefile b/examples/sample.source.ULP/Makefile index 417be53d2..ac47e222a 100644 --- a/examples/sample.source.ULP/Makefile +++ b/examples/sample.source.ULP/Makefile @@ -225,6 +225,7 @@ ASN_MODULE_SOURCES+=per_encoder.c ASN_MODULE_HEADERS+=per_opentype.h ASN_MODULE_SOURCES+=per_opentype.c ASN_CONVERTER_SOURCES+=converter-sample.c +ASN_CONVERTER_SOURCES+=pdu_collection.c lib_LTLIBRARIES=libsomething.la @@ -233,7 +234,7 @@ libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) # This file may be used as an input for make(3) # Remove the lines below to convert it into a pure .am file TARGET = ulp-dump -CFLAGS += -DASN_CONVERTER_TITLE="OMA UserPlane Location Protocol decoder" -DHAVE_CONFIG_H -DJUNKTEST -DPDU=ULP_PDU -I. +CFLAGS += -DASN_CONVERTER_TITLE="OMA UserPlane Location Protocol decoder" -DHAVE_CONFIG_H -DJUNKTEST -DPDU=ULP_PDU -DASN_PDU_COLLECTION -I. OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} all: ULP-PDU.c $(TARGET) @@ -254,7 +255,7 @@ clean: regen: regenerate-from-asn1-source regenerate-from-asn1-source: - ../../asn1c/asn1c -S ../../skeletons -pdu=ULP-PDU -fcompound-names -gen-PER ../ulp.asn1 + ../../asn1c/asn1c -S ../../skeletons -pdu=ULP-PDU -pdu=auto -fcompound-names -gen-PER ../ulp.asn1 ULP-PDU.c: ../sample.makefile.regen ../ulp.asn1 @@ -264,7 +265,7 @@ ULP-PDU.c: ../sample.makefile.regen ../ulp.asn1 regen-makefile: TITLE="OMA UserPlane Location Protocol decoder" \ - ASN1CMDOPTS="-fcompound-names -gen-PER" \ + ASN1CMDOPTS="-pdu=auto -fcompound-names -gen-PER" \ ASN1MODULES="../ulp.asn1" \ ASN1PDU=ULP-PDU \ PROGNAME=ulp-dump \ diff --git a/examples/sample.source.ULP/sample-ULP-PDU-1.per b/examples/sample.source.ULP/sample-ULP-PDU-1.per new file mode 100644 index 0000000000000000000000000000000000000000..ed388e05916711de95f689bed9ad21085237bf1e GIT binary patch literal 29 lcmZROWn^GzU~p_ziTsp31}hx@003Iy2y*}c literal 0 HcmV?d00001 diff --git a/examples/sample.source.ULP/sample-ULP-PDU-2.per b/examples/sample.source.ULP/sample-ULP-PDU-2.per new file mode 100644 index 0000000000000000000000000000000000000000..8267f50d429d54e0820d4939588069607ecc8794 GIT binary patch literal 24 fcmZRO;9>xRU!T3t*ev*=b6~|^o>K>Z91s8iXaEZ9 literal 0 HcmV?d00001 From a6114bd5b3c57cf484879c54fdd93331845b7a68 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Jun 2007 13:22:29 +0000 Subject: [PATCH 1357/1469] another testcase git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1365 59561ff5-6e30-0410-9f3c-9617f08c8826 --- .../sample.source.ULP/sample-ULP-PDU-1.xer | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 examples/sample.source.ULP/sample-ULP-PDU-1.xer diff --git a/examples/sample.source.ULP/sample-ULP-PDU-1.xer b/examples/sample.source.ULP/sample-ULP-PDU-1.xer new file mode 100644 index 000000000..e2b0d781a --- /dev/null +++ b/examples/sample.source.ULP/sample-ULP-PDU-1.xer @@ -0,0 +1,53 @@ + + 29 + + 1 + 0 + 0 + + + + 1 + + 61 01 08 34 06 04 00 F0 + + + + + + + + + + + + + + + + + + + + + + + + + + 310 + 41 + 2021 + 12044 + + + + + + 4 + 15 + 7 + + + + From a7560f6a93c83a168baf5016dbc85b4f10355555 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Jun 2007 13:27:48 +0000 Subject: [PATCH 1358/1469] starving instead of failing if no more data git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1366 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/BOOLEAN.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c index bb4697c28..2c2bbcf2f 100644 --- a/skeletons/BOOLEAN.c +++ b/skeletons/BOOLEAN.c @@ -257,7 +257,7 @@ BOOLEAN_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, switch(per_get_few_bits(pd, 1)) { case 1: *st = 1; break; case 0: *st = 0; break; - case -1: default: _ASN_DECODE_FAILED; + case -1: default: _ASN_DECODE_STARVED; } ASN_DEBUG("%s decoded as %s", td->name, *st ? "TRUE" : "FALSE"); From 4e8d27b3b4764095ea0da99b5d447f154043d156 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Jun 2007 14:02:09 +0000 Subject: [PATCH 1359/1469] exact files git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1367 59561ff5-6e30-0410-9f3c-9617f08c8826 From c20e054d0a0ed958b80f22ca2f0e23cc6fa143b9 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Jun 2007 14:02:33 +0000 Subject: [PATCH 1360/1469] no line conversion git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1368 59561ff5-6e30-0410-9f3c-9617f08c8826 From e1a9079dde991d0b6e88dc81bd3ebd14aaac4a1f Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Jun 2007 15:21:12 +0000 Subject: [PATCH 1361/1469] Additional message type git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1369 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.ULP/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/sample.source.ULP/Makefile b/examples/sample.source.ULP/Makefile index ac47e222a..d1661c89f 100644 --- a/examples/sample.source.ULP/Makefile +++ b/examples/sample.source.ULP/Makefile @@ -255,7 +255,7 @@ clean: regen: regenerate-from-asn1-source regenerate-from-asn1-source: - ../../asn1c/asn1c -S ../../skeletons -pdu=ULP-PDU -pdu=auto -fcompound-names -gen-PER ../ulp.asn1 + ../../asn1c/asn1c -S ../../skeletons -pdu=ULP-PDU -pdu=SUPLINIT -fcompound-names -gen-PER ../ulp.asn1 ULP-PDU.c: ../sample.makefile.regen ../ulp.asn1 @@ -265,7 +265,7 @@ ULP-PDU.c: ../sample.makefile.regen ../ulp.asn1 regen-makefile: TITLE="OMA UserPlane Location Protocol decoder" \ - ASN1CMDOPTS="-pdu=auto -fcompound-names -gen-PER" \ + ASN1CMDOPTS="-pdu=SUPLINIT -fcompound-names -gen-PER" \ ASN1MODULES="../ulp.asn1" \ ASN1PDU=ULP-PDU \ PROGNAME=ulp-dump \ From 53fa9efb7b3eebcaf8e477e7b9c14aef75a50e9c Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Jun 2007 15:33:33 +0000 Subject: [PATCH 1362/1469] no eol conversion git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1370 59561ff5-6e30-0410-9f3c-9617f08c8826 From 3dc56b982453839887383eaa6bf38bfe256d97cf Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Jun 2007 16:01:51 +0000 Subject: [PATCH 1363/1469] proper types for printing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1371 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/per_opentype.c | 2 +- skeletons/per_support.c | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/skeletons/per_opentype.c b/skeletons/per_opentype.c index 5a7439f7a..ec61ae3c9 100644 --- a/skeletons/per_opentype.c +++ b/skeletons/per_opentype.c @@ -183,7 +183,7 @@ uper_open_type_get_complex(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, case 0: break; default: ASN_DEBUG("Non-blank padding (%d bits 0x%02x)", - padding, pvalue); + padding, (int)pvalue); UPDRESTOREPD; _ASN_DECODE_FAILED; } diff --git a/skeletons/per_support.c b/skeletons/per_support.c index e572fa8cd..2e4e52755 100644 --- a/skeletons/per_support.c +++ b/skeletons/per_support.c @@ -108,7 +108,7 @@ per_get_few_bits(asn_per_data_t *pd, int nbits) { pd->moved, (((int)pd->buffer) & 0xf), pd->nboff, pd->nbits, pd->nbits - pd->nboff, - accum); + (int)accum); return accum; } @@ -273,7 +273,7 @@ per_put_few_bits(asn_per_outp_t *po, uint32_t bits, int obits) { if(obits <= 0 || obits >= 32) return obits ? -1 : 0; ASN_DEBUG("[PER put %d bits %x to %p+%d bits]", - obits, bits, po->buffer, po->nboff); + obits, (int)bits, po->buffer, po->nboff); /* * Normalize position indicator. @@ -310,7 +310,8 @@ per_put_few_bits(asn_per_outp_t *po, uint32_t bits, int obits) { /* Clear data of debris before meaningful bits */ bits &= (((uint32_t)1 << obits) - 1); - ASN_DEBUG("[PER out %d %u/%x (t=%d,o=%d) %x&%x=%x]", obits, bits, bits, + ASN_DEBUG("[PER out %d %u/%x (t=%d,o=%d) %x&%x=%x]", obits, + (int)bits, (int)bits, po->nboff - obits, off, buf[0], omsk&0xff, buf[0] & omsk); if(off <= 8) /* Completely within 1 byte */ @@ -339,7 +340,7 @@ per_put_few_bits(asn_per_outp_t *po, uint32_t bits, int obits) { } ASN_DEBUG("[PER out %u/%x => %02x buf+%d]", - bits, bits, buf[0], po->buffer - po->tmpspace); + (int)bits, (int)bits, buf[0], po->buffer - po->tmpspace); return 0; } From 77a1f66b6f665d809d98d1625df2cdbdf8c4a1ac Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Jun 2007 16:34:47 +0000 Subject: [PATCH 1364/1469] no eol mangling git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1372 59561ff5-6e30-0410-9f3c-9617f08c8826 From a0a8e7c368567a2009d8dc0b7dfdb8797ddd2314 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Jun 2007 17:33:04 +0000 Subject: [PATCH 1365/1469] memory problem git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1373 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/per_opentype.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/skeletons/per_opentype.c b/skeletons/per_opentype.c index ec61ae3c9..25c6d711e 100644 --- a/skeletons/per_opentype.c +++ b/skeletons/per_opentype.c @@ -103,17 +103,24 @@ uper_open_type_get_simple(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, rv = td->uper_decoder(ctx, td, constraints, sptr, &spd); asn_debug_indent -= 4; - FREEMEM(buf); - - /* Check padding validity */ - padding = spd.nbits - spd.nboff; - if(padding >= 8) { - ASN_DEBUG("Too large padding %d in open type", padding); - _ASN_DECODE_FAILED; - } else if(per_get_few_bits(&spd, padding)) { - /* Can't be "no more data", then it's non-zero padding */ - ASN_DEBUG("Non-zero padding"); - _ASN_DECODE_FAILED; + if(rv.code == RC_OK) { + /* Check padding validity */ + padding = spd.nbits - spd.nboff; + if(padding < 8 && per_get_few_bits(&spd, padding) == 0) { + /* Everything is cool */ + FREEMEM(buf); + return rv; + } + FREEMEM(buf); + if(padding >= 8) { + ASN_DEBUG("Too large padding %d in open type", padding); + _ASN_DECODE_FAILED; + } else { + ASN_DEBUG("Non-zero padding"); + _ASN_DECODE_FAILED; + } + } else { + FREEMEM(buf); } return rv; From ce82ea5264efe75f9ade27936e48ff80d66ed934 Mon Sep 17 00:00:00 2001 From: vlm Date: Fri, 29 Jun 2007 23:23:05 +0000 Subject: [PATCH 1366/1469] ignore RC_WMORE git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1374 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/per_opentype.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/skeletons/per_opentype.c b/skeletons/per_opentype.c index 25c6d711e..c749c8c6c 100644 --- a/skeletons/per_opentype.c +++ b/skeletons/per_opentype.c @@ -121,6 +121,8 @@ uper_open_type_get_simple(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, } } else { FREEMEM(buf); + /* rv.code could be RC_WMORE, nonsense in this context */ + rv.code = RC_FAIL; /* Noone would give us more */ } return rv; From d61622f158df762633d0bd701eb883c47b0aa563 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 23 Jul 2007 06:47:27 +0000 Subject: [PATCH 1367/1469] new library git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1379 59561ff5-6e30-0410-9f3c-9617f08c8826 From 77ead21bc8019d8f1bc2987d79b91e921971b089 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 23 Jul 2007 06:48:04 +0000 Subject: [PATCH 1368/1469] new library for testing git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1380 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/Makefile.am | 59 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/skeletons/Makefile.am b/skeletons/Makefile.am index 85d03411e..125fb164b 100644 --- a/skeletons/Makefile.am +++ b/skeletons/Makefile.am @@ -1,5 +1,5 @@ -SUBDIRS = standard-modules tests +SUBDIRS = . standard-modules tests dist_pkgdata_DATA = \ $(srcdir)/README \ @@ -9,3 +9,60 @@ dist_pkgdata_DATA = \ uninstall-local: -@echo -n " " -rm -f -r $(DESTDIR)$(pkgdatadir) + +check_LTLIBRARIES = libasn1cskeletons.la + +libasn1cskeletons_la_SOURCES = \ + ANY.c ANY.h \ + BIT_STRING.c BIT_STRING.h \ + BMPString.c BMPString.h \ + BOOLEAN.c BOOLEAN.h \ + ENUMERATED.c ENUMERATED.h \ + GeneralString.c GeneralString.h \ + GeneralizedTime.c GeneralizedTime.h \ + GraphicString.c GraphicString.h \ + IA5String.c IA5String.h \ + INTEGER.c INTEGER.h \ + ISO646String.c ISO646String.h \ + NULL.c NULL.h \ + NativeEnumerated.c NativeEnumerated.h \ + NativeInteger.c NativeInteger.h \ + NativeReal.c NativeReal.h \ + NumericString.c NumericString.h \ + OBJECT_IDENTIFIER.c OBJECT_IDENTIFIER.h \ + OCTET_STRING.c OCTET_STRING.h \ + ObjectDescriptor.c ObjectDescriptor.h \ + PrintableString.c PrintableString.h \ + REAL.c REAL.h \ + RELATIVE-OID.c RELATIVE-OID.h \ + T61String.c T61String.h \ + TeletexString.c TeletexString.h \ + UTCTime.c UTCTime.h \ + UTF8String.c UTF8String.h \ + UniversalString.c UniversalString.h \ + VideotexString.c VideotexString.h \ + VisibleString.c VisibleString.h \ + asn_SEQUENCE_OF.c asn_SEQUENCE_OF.h \ + asn_SET_OF.c asn_SET_OF.h \ + asn_application.h asn_codecs.h \ + asn_codecs_prim.c asn_codecs_prim.h \ + asn_internal.h asn_system.h \ + ber_decoder.c ber_decoder.h \ + ber_tlv_length.c ber_tlv_length.h \ + ber_tlv_tag.c ber_tlv_tag.h \ + constr_CHOICE.c constr_CHOICE.h \ + constr_SEQUENCE.c constr_SEQUENCE.h \ + constr_SEQUENCE_OF.c constr_SEQUENCE_OF.h \ + constr_SET.c constr_SET.h \ + constr_SET_OF.c constr_SET_OF.h \ + constr_TYPE.c constr_TYPE.h \ + constraints.c constraints.h \ + der_encoder.c der_encoder.h \ + per_decoder.c per_decoder.h \ + per_encoder.c per_encoder.h \ + per_opentype.c per_opentype.h \ + per_support.c per_support.h \ + xer_decoder.c xer_decoder.h \ + xer_encoder.c xer_encoder.h \ + xer_support.c xer_support.h + From 46ffdf6dca8387a7d7b899567aff1690fd95e737 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 23 Jul 2007 06:48:26 +0000 Subject: [PATCH 1369/1469] utilizing new library git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1381 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/tests/Makefile.am | 1 + skeletons/tests/Makefile.in | 13 +++----- skeletons/tests/check-GeneralizedTime.c | 39 +++-------------------- skeletons/tests/check-INTEGER.c | 14 +++------ skeletons/tests/check-OCTET_STRING.c | 18 +++++------ skeletons/tests/check-OIDs.c | 19 +++-------- skeletons/tests/check-PER.c | 4 ++- skeletons/tests/check-REAL.c | 19 +++-------- skeletons/tests/check-UTCTime.c | 42 +++---------------------- skeletons/tests/check-UTF8String.c | 14 +++------ skeletons/tests/check-XER.c | 6 ++-- skeletons/tests/check-ber_tlv_tag.c | 4 ++- skeletons/tests/check-length.c | 21 +++++-------- 13 files changed, 57 insertions(+), 157 deletions(-) diff --git a/skeletons/tests/Makefile.am b/skeletons/tests/Makefile.am index a664a6f61..fc53663ae 100644 --- a/skeletons/tests/Makefile.am +++ b/skeletons/tests/Makefile.am @@ -13,6 +13,7 @@ check_PROGRAMS = \ check-XER \ check-PER +AM_LDFLAGS = $(top_srcdir)/skeletons/libasn1cskeletons.la LDADD = -lm TESTS = $(check_PROGRAMS) diff --git a/skeletons/tests/Makefile.in b/skeletons/tests/Makefile.in index 8d01f3651..8a7af24c9 100644 --- a/skeletons/tests/Makefile.in +++ b/skeletons/tests/Makefile.in @@ -147,7 +147,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ -GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -179,10 +178,12 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -YFLAGS = @YFLAGS@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -199,30 +200,23 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ -htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ -localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ -psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ @@ -232,6 +226,7 @@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ AM_CPPFLAGS = -I$(top_srcdir)/skeletons +AM_LDFLAGS = $(top_srcdir)/skeletons/libasn1cskeletons.la LDADD = -lm TESTS = $(check_PROGRAMS) all: all-am diff --git a/skeletons/tests/check-GeneralizedTime.c b/skeletons/tests/check-GeneralizedTime.c index b56fa0b9e..63d2e664e 100644 --- a/skeletons/tests/check-GeneralizedTime.c +++ b/skeletons/tests/check-GeneralizedTime.c @@ -1,6 +1,8 @@ -#define __ASN_INTERNAL_TEST_MODE__ +#include +#include +#include + #include -#include #include /* for pow(3) */ static void @@ -264,36 +266,3 @@ main(int ac, char **av) { return 0; } -/* - * Dummy function. - */ - -asn_enc_rval_t -OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - asn_enc_rval_t erval; - - (void)td; - (void)ptr; - (void)tag_mode; - (void)tag; - (void)cb; - (void)app_key; - - memset(&erval, 0, sizeof(erval)); - return erval; -} - -asn_enc_rval_t -OCTET_STRING_encode_xer_utf8(asn_TYPE_descriptor_t *td, void *ptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { - asn_enc_rval_t erval; - - (void)td; - (void)ptr; - (void)ilevel; - (void)flags; - (void)cb; - (void)app_key; - - memset(&erval, 0, sizeof(erval)); - return erval; -} diff --git a/skeletons/tests/check-INTEGER.c b/skeletons/tests/check-INTEGER.c index fccce287e..bacb618e7 100644 --- a/skeletons/tests/check-INTEGER.c +++ b/skeletons/tests/check-INTEGER.c @@ -1,13 +1,7 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include + +#include static char *shared_scratch_start; diff --git a/skeletons/tests/check-OCTET_STRING.c b/skeletons/tests/check-OCTET_STRING.c index 120e9c81c..e03ecf514 100644 --- a/skeletons/tests/check-OCTET_STRING.c +++ b/skeletons/tests/check-OCTET_STRING.c @@ -1,16 +1,12 @@ -#define EMIT_ASN_DEBUG 1 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include #include +#define EMIT_ASN_DEBUG 1 +#include +#include + enum encoding_type { HEX, BINARY, UTF8 }; static void diff --git a/skeletons/tests/check-OIDs.c b/skeletons/tests/check-OIDs.c index b7fafe0b1..7609ed128 100644 --- a/skeletons/tests/check-OIDs.c +++ b/skeletons/tests/check-OIDs.c @@ -1,16 +1,10 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - +#include +#include #include +#include +#include + static int _print(const void *buffer, size_t size, void *app_key) { (void)app_key; @@ -443,6 +437,3 @@ main() { return 0; } -asn_dec_rval_t OCTET_STRING_decode_uper(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *cts, void **sptr, asn_per_data_t *pd) { asn_dec_rval_t rv = { 0, 0 }; (void)ctx; (void)td; (void)cts; (void)sptr; (void)pd; return rv; } - -asn_enc_rval_t OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *cts, void *sptr, asn_per_outp_t *po) { asn_enc_rval_t er = { 0, 0, 0 }; (void)td; (void)cts; (void)sptr; (void)po; return er; } diff --git a/skeletons/tests/check-PER.c b/skeletons/tests/check-PER.c index e0fb72e75..12e700c46 100644 --- a/skeletons/tests/check-PER.c +++ b/skeletons/tests/check-PER.c @@ -1,6 +1,8 @@ -#include +#include #include +#include + static void check_per_decoding() { uint8_t buf[] = { 0xB7, 0x19, 0x2F, 0xEE, 0xAD }; diff --git a/skeletons/tests/check-REAL.c b/skeletons/tests/check-REAL.c index 3a868aafd..f3aff9c72 100644 --- a/skeletons/tests/check-REAL.c +++ b/skeletons/tests/check-REAL.c @@ -1,14 +1,9 @@ +#include +#include +#include + #define EMIT_ASN_DEBUG 1 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include static char reconstructed[2][512]; static int reconstr_lens[2]; @@ -286,7 +281,3 @@ main() { return 0; } - -asn_dec_rval_t OCTET_STRING_decode_uper(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *cts, void **sptr, asn_per_data_t *pd) { asn_dec_rval_t rv = { 0, 0 }; (void)ctx; (void)td; (void)cts; (void)sptr; (void)pd; return rv; } - -asn_enc_rval_t OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *cts, void *sptr, asn_per_outp_t *po) { asn_enc_rval_t er = { 0, 0, 0 }; (void)td; (void)cts; (void)sptr; (void)po; return er; } diff --git a/skeletons/tests/check-UTCTime.c b/skeletons/tests/check-UTCTime.c index 81dde5600..e1c25565c 100644 --- a/skeletons/tests/check-UTCTime.c +++ b/skeletons/tests/check-UTCTime.c @@ -1,7 +1,9 @@ -#define __ASN_INTERNAL_TEST_MODE__ +#include +#include +#include + #include -#include -#include +#include static void check(char *time_str, time_t sample, int as_gmt) { @@ -58,37 +60,3 @@ main(int ac, char **av) { return 0; } - -/* - * Dummy function. - */ - -asn_enc_rval_t -OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - asn_enc_rval_t erval; - - (void)td; - (void)ptr; - (void)tag_mode; - (void)tag; - (void)cb; - (void)app_key; - - memset(&erval, 0, sizeof(erval)); - return erval; -} - -asn_enc_rval_t -OCTET_STRING_encode_xer_utf8(asn_TYPE_descriptor_t *td, void *ptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { - asn_enc_rval_t erval; - - (void)td; - (void)ptr; - (void)ilevel; - (void)flags; - (void)cb; - (void)app_key; - - memset(&erval, 0, sizeof(erval)); - return erval; -} diff --git a/skeletons/tests/check-UTF8String.c b/skeletons/tests/check-UTF8String.c index 8a90b2426..64b5d2e15 100644 --- a/skeletons/tests/check-UTF8String.c +++ b/skeletons/tests/check-UTF8String.c @@ -1,15 +1,9 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include #include +#include + static void check(int expect_length, char *buf, int buflen) { UTF8String_t st; diff --git a/skeletons/tests/check-XER.c b/skeletons/tests/check-XER.c index 6e2f1ce5a..82cd0e4ad 100644 --- a/skeletons/tests/check-XER.c +++ b/skeletons/tests/check-XER.c @@ -1,7 +1,9 @@ -#include -#include +#include #include +#include +#include + static void check(char *tag, char *name, xer_check_tag_e value) { xer_check_tag_e xct; diff --git a/skeletons/tests/check-ber_tlv_tag.c b/skeletons/tests/check-ber_tlv_tag.c index 98d5c3e37..7553086ef 100644 --- a/skeletons/tests/check-ber_tlv_tag.c +++ b/skeletons/tests/check-ber_tlv_tag.c @@ -1,7 +1,9 @@ #include +#include #include -#include +#include +#include struct tag_control_s { int taglen; diff --git a/skeletons/tests/check-length.c b/skeletons/tests/check-length.c index 56ec0db3b..8c2b64b73 100644 --- a/skeletons/tests/check-length.c +++ b/skeletons/tests/check-length.c @@ -1,16 +1,11 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#undef ADVANCE -#undef RETURN -#undef LEFT -#include - +#include +#include + +#include +#include +#include +#include +#include uint8_t *buf; size_t buf_size; From 7f05da5a35e40b1f7b8c10b5707e08ae0781fbab Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 23 Jul 2007 06:49:56 +0000 Subject: [PATCH 1370/1469] regeneration git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1382 59561ff5-6e30-0410-9f3c-9617f08c8826 --- Makefile.in | 12 +- asn1c/Makefile.in | 12 +- asn1c/tests/Makefile.in | 12 +- asn1c/webcgi/Makefile.in | 12 +- doc/Makefile.in | 12 +- examples/Makefile.in | 12 +- libasn1compiler/Makefile.in | 12 +- libasn1fix/Makefile.in | 12 +- libasn1parser/Makefile.in | 12 +- libasn1print/Makefile.in | 12 +- skeletons/Makefile.in | 214 ++++++++++++++++++++++--- skeletons/standard-modules/Makefile.in | 12 +- tests/Makefile.in | 12 +- 13 files changed, 229 insertions(+), 129 deletions(-) diff --git a/Makefile.in b/Makefile.in index 4145e3bc9..8eda01a9b 100644 --- a/Makefile.in +++ b/Makefile.in @@ -114,7 +114,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ -GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -146,10 +145,12 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -YFLAGS = @YFLAGS@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -166,30 +167,23 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ -htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ -localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ -psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/asn1c/Makefile.in b/asn1c/Makefile.in index bcc763896..4f596bdb4 100644 --- a/asn1c/Makefile.in +++ b/asn1c/Makefile.in @@ -122,7 +122,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ -GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -154,10 +153,12 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -YFLAGS = @YFLAGS@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -174,30 +175,23 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ -htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ -localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ -psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/asn1c/tests/Makefile.in b/asn1c/tests/Makefile.in index d8ee83925..41ff0a6c9 100644 --- a/asn1c/tests/Makefile.in +++ b/asn1c/tests/Makefile.in @@ -79,7 +79,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ -GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -111,10 +110,12 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -YFLAGS = @YFLAGS@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -131,30 +132,23 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ -htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ -localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ -psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/asn1c/webcgi/Makefile.in b/asn1c/webcgi/Makefile.in index d3ef9e91f..36d081b96 100644 --- a/asn1c/webcgi/Makefile.in +++ b/asn1c/webcgi/Makefile.in @@ -100,7 +100,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ -GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -132,10 +131,12 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -YFLAGS = @YFLAGS@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -152,30 +153,23 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ -htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ -localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ -psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/doc/Makefile.in b/doc/Makefile.in index 46a1ab838..c636f1549 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -89,7 +89,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ -GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -121,10 +120,12 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -YFLAGS = @YFLAGS@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -141,30 +142,23 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ -htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ -localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ -psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/examples/Makefile.in b/examples/Makefile.in index 79973d077..274218995 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -84,7 +84,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ -GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -116,10 +115,12 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -YFLAGS = @YFLAGS@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -136,30 +137,23 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ -htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ -localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ -psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/libasn1compiler/Makefile.in b/libasn1compiler/Makefile.in index 3323458ae..70e363a96 100644 --- a/libasn1compiler/Makefile.in +++ b/libasn1compiler/Makefile.in @@ -99,7 +99,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ -GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -131,10 +130,12 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -YFLAGS = @YFLAGS@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -151,30 +152,23 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ -htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ -localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ -psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/libasn1fix/Makefile.in b/libasn1fix/Makefile.in index dd5c049d7..abae3fcb8 100644 --- a/libasn1fix/Makefile.in +++ b/libasn1fix/Makefile.in @@ -107,7 +107,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ -GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -139,10 +138,12 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -YFLAGS = @YFLAGS@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -159,30 +160,23 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ -htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ -localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ -psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index c0a8c8e27..822a73047 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -106,7 +106,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ -GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -138,10 +137,12 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -YFLAGS = @YFLAGS@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -158,30 +159,23 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ -htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ -localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ -psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/libasn1print/Makefile.in b/libasn1print/Makefile.in index 4104fb4d3..ed33fe594 100644 --- a/libasn1print/Makefile.in +++ b/libasn1print/Makefile.in @@ -97,7 +97,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ -GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -129,10 +128,12 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -YFLAGS = @YFLAGS@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -149,30 +150,23 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ -htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ -localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ -psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/skeletons/Makefile.in b/skeletons/Makefile.in index d31ea9499..4a3a6bc15 100644 --- a/skeletons/Makefile.in +++ b/skeletons/Makefile.in @@ -47,8 +47,35 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = +libasn1cskeletons_la_LIBADD = +am_libasn1cskeletons_la_OBJECTS = ANY.lo BIT_STRING.lo BMPString.lo \ + BOOLEAN.lo ENUMERATED.lo GeneralString.lo GeneralizedTime.lo \ + GraphicString.lo IA5String.lo INTEGER.lo ISO646String.lo \ + NULL.lo NativeEnumerated.lo NativeInteger.lo NativeReal.lo \ + NumericString.lo OBJECT_IDENTIFIER.lo OCTET_STRING.lo \ + ObjectDescriptor.lo PrintableString.lo REAL.lo RELATIVE-OID.lo \ + T61String.lo TeletexString.lo UTCTime.lo UTF8String.lo \ + UniversalString.lo VideotexString.lo VisibleString.lo \ + asn_SEQUENCE_OF.lo asn_SET_OF.lo asn_codecs_prim.lo \ + ber_decoder.lo ber_tlv_length.lo ber_tlv_tag.lo \ + constr_CHOICE.lo constr_SEQUENCE.lo constr_SEQUENCE_OF.lo \ + constr_SET.lo constr_SET_OF.lo constr_TYPE.lo constraints.lo \ + der_encoder.lo per_decoder.lo per_encoder.lo per_opentype.lo \ + per_support.lo xer_decoder.lo xer_encoder.lo xer_support.lo +libasn1cskeletons_la_OBJECTS = $(am_libasn1cskeletons_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(libasn1cskeletons_la_SOURCES) +DIST_SOURCES = $(libasn1cskeletons_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ @@ -99,7 +126,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ -GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -131,10 +157,12 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -YFLAGS = @YFLAGS@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -151,30 +179,23 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ -htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ -localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ -psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ @@ -183,15 +204,71 @@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ -SUBDIRS = standard-modules tests +SUBDIRS = . standard-modules tests dist_pkgdata_DATA = \ $(srcdir)/README \ $(srcdir)/*.[ch] \ $(srcdir)/file-dependencies +check_LTLIBRARIES = libasn1cskeletons.la +libasn1cskeletons_la_SOURCES = \ + ANY.c ANY.h \ + BIT_STRING.c BIT_STRING.h \ + BMPString.c BMPString.h \ + BOOLEAN.c BOOLEAN.h \ + ENUMERATED.c ENUMERATED.h \ + GeneralString.c GeneralString.h \ + GeneralizedTime.c GeneralizedTime.h \ + GraphicString.c GraphicString.h \ + IA5String.c IA5String.h \ + INTEGER.c INTEGER.h \ + ISO646String.c ISO646String.h \ + NULL.c NULL.h \ + NativeEnumerated.c NativeEnumerated.h \ + NativeInteger.c NativeInteger.h \ + NativeReal.c NativeReal.h \ + NumericString.c NumericString.h \ + OBJECT_IDENTIFIER.c OBJECT_IDENTIFIER.h \ + OCTET_STRING.c OCTET_STRING.h \ + ObjectDescriptor.c ObjectDescriptor.h \ + PrintableString.c PrintableString.h \ + REAL.c REAL.h \ + RELATIVE-OID.c RELATIVE-OID.h \ + T61String.c T61String.h \ + TeletexString.c TeletexString.h \ + UTCTime.c UTCTime.h \ + UTF8String.c UTF8String.h \ + UniversalString.c UniversalString.h \ + VideotexString.c VideotexString.h \ + VisibleString.c VisibleString.h \ + asn_SEQUENCE_OF.c asn_SEQUENCE_OF.h \ + asn_SET_OF.c asn_SET_OF.h \ + asn_application.h asn_codecs.h \ + asn_codecs_prim.c asn_codecs_prim.h \ + asn_internal.h asn_system.h \ + ber_decoder.c ber_decoder.h \ + ber_tlv_length.c ber_tlv_length.h \ + ber_tlv_tag.c ber_tlv_tag.h \ + constr_CHOICE.c constr_CHOICE.h \ + constr_SEQUENCE.c constr_SEQUENCE.h \ + constr_SEQUENCE_OF.c constr_SEQUENCE_OF.h \ + constr_SET.c constr_SET.h \ + constr_SET_OF.c constr_SET_OF.h \ + constr_TYPE.c constr_TYPE.h \ + constraints.c constraints.h \ + der_encoder.c der_encoder.h \ + per_decoder.c per_decoder.h \ + per_encoder.c per_encoder.h \ + per_opentype.c per_opentype.h \ + per_support.c per_support.h \ + xer_decoder.c xer_decoder.h \ + xer_encoder.c xer_encoder.h \ + xer_support.c xer_support.h + all: all-recursive .SUFFIXES: +.SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -222,6 +299,95 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +clean-checkLTLIBRARIES: + -test -z "$(check_LTLIBRARIES)" || rm -f $(check_LTLIBRARIES) + @list='$(check_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libasn1cskeletons.la: $(libasn1cskeletons_la_OBJECTS) $(libasn1cskeletons_la_DEPENDENCIES) + $(LINK) $(libasn1cskeletons_la_LDFLAGS) $(libasn1cskeletons_la_OBJECTS) $(libasn1cskeletons_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ANY.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BIT_STRING.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BMPString.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BOOLEAN.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ENUMERATED.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GeneralString.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GeneralizedTime.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GraphicString.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/IA5String.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/INTEGER.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ISO646String.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NULL.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NativeEnumerated.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NativeInteger.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NativeReal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NumericString.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OBJECT_IDENTIFIER.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OCTET_STRING.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ObjectDescriptor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PrintableString.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/REAL.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RELATIVE-OID.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/T61String.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TeletexString.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UTCTime.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UTF8String.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UniversalString.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/VideotexString.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/VisibleString.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn_SEQUENCE_OF.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn_SET_OF.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn_codecs_prim.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber_decoder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber_tlv_length.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber_tlv_tag.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/constr_CHOICE.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/constr_SEQUENCE.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/constr_SEQUENCE_OF.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/constr_SET.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/constr_SET_OF.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/constr_TYPE.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/constraints.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/der_encoder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/per_decoder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/per_encoder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/per_opentype.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/per_support.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xer_decoder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xer_encoder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xer_support.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + mostlyclean-libtool: -rm -f *.lo @@ -424,6 +590,7 @@ distdir: $(DISTFILES) fi; \ done check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_LTLIBRARIES) check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive @@ -457,12 +624,14 @@ maintainer-clean-generic: @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive -clean-am: clean-generic clean-libtool mostlyclean-am +clean-am: clean-checkLTLIBRARIES clean-generic clean-libtool \ + mostlyclean-am distclean: distclean-recursive + -rm -rf ./$(DEPDIR) -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool \ - distclean-tags +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags dvi: dvi-recursive @@ -485,12 +654,14 @@ install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive -mostlyclean-am: mostlyclean-generic mostlyclean-libtool +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf: pdf-recursive @@ -506,17 +677,18 @@ uninstall-am: uninstall-dist_pkgdataDATA uninstall-info-am \ uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ - clean clean-generic clean-libtool clean-recursive ctags \ - ctags-recursive distclean distclean-generic distclean-libtool \ + clean clean-checkLTLIBRARIES clean-generic clean-libtool \ + clean-recursive ctags ctags-recursive distclean \ + distclean-compile distclean-generic distclean-libtool \ distclean-recursive distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dist_pkgdataDATA install-exec \ install-exec-am install-info install-info-am install-man \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ - maintainer-clean-recursive mostlyclean mostlyclean-generic \ - mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \ - tags tags-recursive uninstall uninstall-am \ + maintainer-clean-recursive mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool mostlyclean-recursive \ + pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ uninstall-dist_pkgdataDATA uninstall-info-am uninstall-local diff --git a/skeletons/standard-modules/Makefile.in b/skeletons/standard-modules/Makefile.in index 0fc1ddf80..66f5f906e 100644 --- a/skeletons/standard-modules/Makefile.in +++ b/skeletons/standard-modules/Makefile.in @@ -90,7 +90,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ -GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -122,10 +121,12 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -YFLAGS = @YFLAGS@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -142,30 +143,23 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ -htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ -localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ -psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/tests/Makefile.in b/tests/Makefile.in index a629c2f90..13a5f42c5 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -79,7 +79,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ -GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -111,10 +110,12 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -YFLAGS = @YFLAGS@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -131,30 +132,23 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ -htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ -localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ -psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ From 9bfb2d1dabbaf70bac77183d0bc4b49b039e51b1 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 23 Jul 2007 07:47:04 +0000 Subject: [PATCH 1371/1469] extensibility encoding git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1383 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/NativeEnumerated.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c index e3af1ca49..12b079e1a 100644 --- a/skeletons/NativeEnumerated.c +++ b/skeletons/NativeEnumerated.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Copyright (c) 2004, 2007 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ /* @@ -177,7 +177,7 @@ NativeEnumerated_encode_uper(asn_TYPE_descriptor_t *td, inext = 1; } if(ct->flags & APC_EXTENSIBLE) { - if(per_put_few_bits(po, inext, 0)) + if(per_put_few_bits(po, inext, 1)) _ASN_ENCODE_FAILED; ct = 0; } else if(inext) { @@ -196,7 +196,10 @@ NativeEnumerated_encode_uper(asn_TYPE_descriptor_t *td, /* * X.691, #10.6: normally small non-negative whole number; */ - if(uper_put_nsnnwn(po, value - (specs->extension - 1))) + ASN_DEBUG("value = %d, ext = %d, inext = %d, res = %d", + value, specs->extension, inext, + value - (inext ? (specs->extension - 1) : 0)); + if(uper_put_nsnnwn(po, value - (inext ? (specs->extension - 1) : 0))) _ASN_ENCODE_FAILED; _ASN_ENCODED_OK(er); From a1166c0c514738121d411bf2313f1e37b1bb4b10 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 23 Jul 2007 09:56:41 +0000 Subject: [PATCH 1372/1469] more debug git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1384 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/per_support.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/skeletons/per_support.c b/skeletons/per_support.c index 2e4e52755..e8299c730 100644 --- a/skeletons/per_support.c +++ b/skeletons/per_support.c @@ -103,11 +103,13 @@ per_get_few_bits(asn_per_data_t *pd, int nbits) { accum &= (((uint32_t)1 << nbits) - 1); - ASN_DEBUG(" [PER got %2d<=%2d bits => span %d %+d[%d..%d] (%d) => 0x%x]", + ASN_DEBUG(" [PER got %2d<=%2d bits => span %d %+d[%d..%d]:%02x (%d) => 0x%x]", nbits, nleft, pd->moved, (((int)pd->buffer) & 0xf), - pd->nboff, pd->nbits, pd->nbits - pd->nboff, + pd->nboff, pd->nbits, + pd->buffer[0], + pd->nbits - pd->nboff, (int)accum); return accum; From d024d0bc569f52c46b4fc39cac991cd6e691d9c6 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 23 Jul 2007 09:57:00 +0000 Subject: [PATCH 1373/1469] natural constraint is only valid in the root of enumeration git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1385 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/NativeEnumerated.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c index 12b079e1a..b6b47e139 100644 --- a/skeletons/NativeEnumerated.c +++ b/skeletons/NativeEnumerated.c @@ -179,7 +179,7 @@ NativeEnumerated_encode_uper(asn_TYPE_descriptor_t *td, if(ct->flags & APC_EXTENSIBLE) { if(per_put_few_bits(po, inext, 1)) _ASN_ENCODE_FAILED; - ct = 0; + if(inext) ct = 0; } else if(inext) { _ASN_ENCODE_FAILED; } From 76d6f3762b7de417c3f6bf5368a966036f0002eb Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 23 Jul 2007 09:58:25 +0000 Subject: [PATCH 1374/1469] proper going over elements git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1386 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/constr_SEQUENCE.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 0cfcdade2..db3c92581 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -1360,12 +1360,16 @@ SEQUENCE_encode_uper(asn_TYPE_descriptor_t *td, * Encode the sequence ROOT elements. */ ASN_DEBUG("ext_after = %d, ec = %d, eb = %d", specs->ext_after, td->elements_count, specs->ext_before); - for(edx = 0; edx < ((specs->ext_before < 0) - ? td->elements_count : specs->ext_after); edx++) { + for(edx = 0; edx < ((specs->ext_after < 0) + ? td->elements_count : specs->ext_before - 1); edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ + if(IN_EXTENSION_GROUP(specs, edx)) + continue; + ASN_DEBUG("About to encode %s", elm->type->name); /* Fetch the pointer to this member */ @@ -1388,6 +1392,7 @@ SEQUENCE_encode_uper(asn_TYPE_descriptor_t *td, if(elm->default_value && elm->default_value(0, memb_ptr2) == 1) continue; + ASN_DEBUG("Encoding %s->%s", td->name, elm->name); er = elm->type->uper_encoder(elm->type, elm->per_constraints, *memb_ptr2, po); if(er.encoded == -1) From 77dbdf3216d3a33650cf01f4c40966be2b1cdeb3 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 23 Jul 2007 10:03:31 +0000 Subject: [PATCH 1375/1469] native eol style git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1387 59561ff5-6e30-0410-9f3c-9617f08c8826 From de56a174215e3bc3eb95b1e744127631b2394384 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 23 Jul 2007 11:40:42 +0000 Subject: [PATCH 1376/1469] short probe git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1388 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.ULP/sample-ULP-PDU-2.per | Bin 24 -> 8 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/sample.source.ULP/sample-ULP-PDU-2.per b/examples/sample.source.ULP/sample-ULP-PDU-2.per index 8267f50d429d54e0820d4939588069607ecc8794..4612edac26dcd77f7180a2534e2f1e34be0c0d01 100644 GIT binary patch literal 8 NcmZRO;9>xR0{{W60OJ4v literal 24 fcmZRO;9>xRU!T3t*ev*=b6~|^o>K>Z91s8iXaEZ9 From 83b901d8e98c769f66031df68196b6ca0583b0bb Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 27 Aug 2007 23:57:45 +0000 Subject: [PATCH 1377/1469] upgraded compatibility git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1389 59561ff5-6e30-0410-9f3c-9617f08c8826 --- Makefile.in | 12 +- aclocal.m4 | 1595 ++-- asn1c/Makefile.in | 12 +- asn1c/tests/Makefile.in | 12 +- asn1c/webcgi/Makefile.in | 12 +- config.h.in | 10 +- configure | 9257 ++++++++++++++---------- configure.in | 4 + doc/Makefile.in | 12 +- examples/Makefile.in | 12 +- examples/clyx2asn1.pl | 4 +- examples/crfc2asn1.pl | 5 +- libasn1compiler/Makefile.in | 12 +- libasn1compiler/asn1c_compat.c | 5 + libasn1fix/Makefile.in | 12 +- libasn1parser/Makefile.in | 12 +- libasn1parser/expr-h.pl | 2 +- libasn1print/Makefile.in | 12 +- skeletons/Makefile.in | 12 +- skeletons/standard-modules/Makefile.in | 12 +- skeletons/tests/Makefile.in | 12 +- tests/Makefile.in | 12 +- 22 files changed, 6697 insertions(+), 4353 deletions(-) diff --git a/Makefile.in b/Makefile.in index 8eda01a9b..4145e3bc9 100644 --- a/Makefile.in +++ b/Makefile.in @@ -114,6 +114,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -145,12 +146,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -167,23 +166,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/aclocal.m4 b/aclocal.m4 index acd9cd23b..b05cd26b8 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -13,7 +13,7 @@ # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- -# serial 47 AC_PROG_LIBTOOL +# serial 48 AC_PROG_LIBTOOL # AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) @@ -123,7 +123,7 @@ esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. -Xsed='sed -e s/^X//' +Xsed='sed -e 1s/^X//' [sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] # Same as above, but do not quote variable references. @@ -143,7 +143,7 @@ rm="rm -f" default_ofile=libtool can_build_shared=yes -# All known linkers require a `.a' archive for static linking (except M$VC, +# All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a ltmain="$ac_aux_dir/ltmain.sh" @@ -163,6 +163,7 @@ test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" @@ -182,15 +183,17 @@ old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) - old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) - old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi +_LT_CC_BASENAME([$compiler]) + # Only perform the check for file, if the check method requires it case $deplibs_check_method in file_magic*) @@ -231,11 +234,56 @@ AC_DEFUN([_LT_AC_SYS_COMPILER], # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_AC_SYS_COMPILER +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +AC_DEFUN([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` +]) + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +AC_DEFUN([_LT_COMPILER_BOILERPLATE], +[ac_outfile=conftest.$ac_objext +printf "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +AC_DEFUN([_LT_LINKER_BOILERPLATE], +[ac_outfile=conftest.$ac_objext +printf "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm conftest* +])# _LT_LINKER_BOILERPLATE + + # _LT_AC_SYS_LIBPATH_AIX # ---------------------- # Links a minimal program and checks the executable @@ -308,15 +356,15 @@ fi # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. -if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test -z "$ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... - if (echo_test_string="`eval $cmd`") 2>/dev/null && - echo_test_string="`eval $cmd`" && + if (echo_test_string=`eval $cmd`) 2>/dev/null && + echo_test_string=`eval $cmd` && (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null then break @@ -485,7 +533,7 @@ x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then - case "`/usr/bin/file conftest.o`" in + case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*linux*) @@ -536,6 +584,22 @@ x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) CFLAGS="$SAVE_CFLAGS" fi ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) LD="${LD-ld} -64" ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], [*-*-cygwin* | *-*-mingw* | *-*-pw32*) AC_CHECK_TOOL(DLLTOOL, dlltool, false) @@ -567,7 +631,7 @@ AC_CACHE_CHECK([$1], [$2], # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) @@ -577,8 +641,10 @@ AC_CACHE_CHECK([$1], [$2], echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s conftest.err; then + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi @@ -604,11 +670,16 @@ AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], LDFLAGS="$LDFLAGS $3" printf "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The compiler can only warn and ignore the option if not recognized + # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi else $2=yes fi @@ -667,11 +738,55 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl lt_cv_sys_max_cmd_len=8192; ;; - *) + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. - while (test "X"`$CONFIG_SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ = "XX$teststring") >/dev/null 2>&1 && new_result=`expr "X$teststring" : ".*" 2>&1` && lt_cv_sys_max_cmd_len=$new_result && @@ -697,7 +812,7 @@ fi # _LT_AC_CHECK_DLFCN -# -------------------- +# ------------------ AC_DEFUN([_LT_AC_CHECK_DLFCN], [AC_CHECK_HEADERS(dlfcn.h)dnl ])# _LT_AC_CHECK_DLFCN @@ -705,7 +820,7 @@ AC_DEFUN([_LT_AC_CHECK_DLFCN], # _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) -# ------------------------------------------------------------------ +# --------------------------------------------------------------------- AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "$cross_compiling" = yes; then : @@ -771,17 +886,19 @@ int main () else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } + else + puts (dlerror ()); exit (status); }] EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) 2>/dev/null + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; - x$lt_unknown|x*) $3 ;; + x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed @@ -793,7 +910,7 @@ rm -fr conftest* # AC_LIBTOOL_DLOPEN_SELF -# ------------------- +# ---------------------- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "x$enable_dlopen" != xyes; then @@ -864,7 +981,7 @@ else test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" - eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" @@ -877,7 +994,7 @@ else ]) if test "x$lt_cv_dlopen_self" = xyes; then - LDFLAGS="$LDFLAGS $link_static_flag" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_AC_TRY_DLOPEN_SELF( @@ -925,7 +1042,7 @@ AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) @@ -937,11 +1054,13 @@ AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings - if test ! -s out/conftest.err; then + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi - chmod u+w . + chmod u+w . 2>&AS_MESSAGE_LOG_FD $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation @@ -1005,8 +1124,8 @@ AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_AC_TAGVAR(hardcode_action, $1)= if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ - test -n "$_LT_AC_TAGVAR(runpath_var $1)" || \ - test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)"="Xyes" ; then + test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ + test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existant directories. if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && @@ -1173,7 +1292,7 @@ beos*) shlibpath_var=LIBRARY_PATH ;; -bsdi4*) +bsdi[[45]]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -1201,7 +1320,8 @@ cygwin* | mingw* | pw32*) dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' @@ -1231,7 +1351,7 @@ cygwin* | mingw* | pw32*) ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac ;; @@ -1254,7 +1374,7 @@ darwin* | rhapsody*) soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` @@ -1289,8 +1409,17 @@ kfreebsd*-gnu) dynamic_linker='GNU ld.so' ;; -freebsd*) - objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[123]]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) @@ -1308,14 +1437,19 @@ freebsd*) freebsd2*) shlibpath_overrides_runpath=yes ;; - freebsd3.[01]* | freebsdelf3.[01]*) + freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; - *) # from 3.2 on + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; + freebsd*) # from 4.6 on + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; esac ;; @@ -1335,7 +1469,7 @@ hpux9* | hpux10* | hpux11*) version_type=sunos need_lib_prefix=no need_version=no - case "$host_cpu" in + case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes @@ -1375,6 +1509,18 @@ hpux9* | hpux10* | hpux11*) postinstall_cmds='chmod 555 $lib' ;; +interix3*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; @@ -1434,7 +1580,7 @@ linux*) # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then - lt_ld_extra=`$SED -e 's/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g' /etc/ld.so.conf | tr '\n' ' '` + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi @@ -1496,8 +1642,13 @@ nto-qnx*) openbsd*) version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no - need_version=yes + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH @@ -1535,13 +1686,6 @@ osf3* | osf4* | osf5*) sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; -sco3.2v5*) - version_type=osf - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - ;; - solaris*) version_type=linux need_lib_prefix=no @@ -1567,7 +1711,7 @@ sunos4*) need_version=yes ;; -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' @@ -1600,6 +1744,29 @@ sysv4*MP*) fi ;; +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -1613,6 +1780,11 @@ uts4*) esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi ])# AC_LIBTOOL_SYS_DYNAMIC_LINKER @@ -1637,6 +1809,9 @@ if test -f "$ltmain" && test -n "$tagnames"; then AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) fi fi + if test -z "$LTCFLAGS"; then + eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" + fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. @@ -1663,7 +1838,9 @@ if test -f "$ltmain" && test -n "$tagnames"; then case $tagname in CXX) - if test -n "$CXX" && test "X$CXX" != "Xno"; then + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then AC_LIBTOOL_LANG_CXX_CONFIG else tagname="" @@ -1725,7 +1902,7 @@ AC_DEFUN([AC_LIBTOOL_DLOPEN], # AC_LIBTOOL_WIN32_DLL # -------------------- -# declare package support for building win32 dll's +# declare package support for building win32 DLLs AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) ])# AC_LIBTOOL_WIN32_DLL @@ -1763,7 +1940,7 @@ AC_ARG_ENABLE([shared], # AC_DISABLE_SHARED # ----------------- -#- set the default shared flag to --disable-shared +# set the default shared flag to --disable-shared AC_DEFUN([AC_DISABLE_SHARED], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_SHARED(no) @@ -1899,7 +2076,7 @@ dnl not every word. This closes a longstanding sh security hole. if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) - file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then @@ -2009,7 +2186,7 @@ AC_CACHE_VAL(lt_cv_path_LD, if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. + # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; @@ -2146,7 +2332,7 @@ gnu*) hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file - case "$host_cpu" in + case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so @@ -2162,6 +2348,11 @@ hpux10.20* | hpux11*) esac ;; +interix3*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; @@ -2174,15 +2365,6 @@ irix5* | irix6* | nonstopux*) # This must be Linux ELF. linux*) - case $host_cpu in - alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*) - lt_cv_deplibs_check_method=pass_all ;; - *) - # glibc up to 2.1.1 does not perform some relocations on ARM - # this will be overridden with pass_all, but let us keep it just in case - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; - esac - lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` lt_cv_deplibs_check_method=pass_all ;; @@ -2205,12 +2387,10 @@ nto-qnx*) ;; openbsd*) - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else - lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; @@ -2218,15 +2398,11 @@ osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; -sco3.2v5*) - lt_cv_deplibs_check_method=pass_all - ;; - solaris*) lt_cv_deplibs_check_method=pass_all ;; -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' @@ -2247,10 +2423,13 @@ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) siemens) lt_cv_deplibs_check_method=pass_all ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; esac ;; -sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac @@ -2270,36 +2449,43 @@ AC_DEFUN([AC_PROG_NM], # Let the user override the test. lt_cv_path_NM="$NM" else - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/${ac_tool_prefix}nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" break ;; *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac ;; esac - esac - fi + fi + done + IFS="$lt_save_ifs" done - IFS="$lt_save_ifs" test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi]) NM="$lt_cv_path_NM" @@ -2331,13 +2517,13 @@ esac # ----------------------------------- # sets LIBLTDL to the link flags for the libltdl convenience library and # LTDLINCL to the include flags for the libltdl header and adds -# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL -# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If -# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will -# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with -# '${top_srcdir}/' (note the single quotes!). If your package is not -# flat and you're not using automake, define top_builddir and -# top_srcdir appropriately in the Makefiles. +# --enable-ltdl-convenience to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, +# it is assumed to be `libltdl'. LIBLTDL will be prefixed with +# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/' +# (note the single quotes!). If your package is not flat and you're not +# using automake, define top_builddir and top_srcdir appropriately in +# the Makefiles. AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl case $enable_ltdl_convenience in @@ -2356,13 +2542,13 @@ AC_DEFUN([AC_LIBLTDL_CONVENIENCE], # ----------------------------------- # sets LIBLTDL to the link flags for the libltdl installable library and # LTDLINCL to the include flags for the libltdl header and adds -# --enable-ltdl-install to the configure arguments. Note that LIBLTDL -# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If -# DIRECTORY is not provided and an installed libltdl is not found, it is -# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' -# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single -# quotes!). If your package is not flat and you're not using automake, -# define top_builddir and top_srcdir appropriately in the Makefiles. +# --enable-ltdl-install to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, +# and an installed libltdl is not found, it is assumed to be `libltdl'. +# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and top_srcdir +# appropriately in the Makefiles. # In the future, this macro may have to be called after AC_PROG_LIBTOOL. AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl @@ -2400,10 +2586,21 @@ AC_DEFUN([AC_LIBTOOL_CXX], # --------------- AC_DEFUN([_LT_AC_LANG_CXX], [AC_REQUIRE([AC_PROG_CXX]) -AC_REQUIRE([AC_PROG_CXXCPP]) +AC_REQUIRE([_LT_AC_PROG_CXXCPP]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) ])# _LT_AC_LANG_CXX +# _LT_AC_PROG_CXXCPP +# ------------------ +AC_DEFUN([_LT_AC_PROG_CXXCPP], +[ +AC_REQUIRE([AC_PROG_CXX]) +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +fi +])# _LT_AC_PROG_CXXCPP # AC_LIBTOOL_F77 # -------------- @@ -2443,7 +2640,7 @@ _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) # AC_LIBTOOL_RC -# -------------- +# ------------- # enable support for Windows resource files AC_DEFUN([AC_LIBTOOL_RC], [AC_REQUIRE([LT_AC_PROG_RC]) @@ -2476,36 +2673,9 @@ lt_simple_link_test_code='int main(){return(0);}\n' _LT_AC_SYS_COMPILER -# -# Check for any special shared library compilation flags. -# -_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= -if test "$GCC" = no; then - case $host_os in - sco3.2v5*) - _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' - ;; - esac -fi -if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then - AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) - if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[ ]]" >/dev/null; then : - else - AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) - _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no - fi -fi - - -# -# Check to make sure the static flag actually works. -# -AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], - _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), - $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), - [], - [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) - +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) @@ -2515,9 +2685,9 @@ AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_SYS_LIB_STRIP -AC_LIBTOOL_DLOPEN_SELF($1) +AC_LIBTOOL_DLOPEN_SELF -# Report which librarie types wil actually be built +# Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) @@ -2526,7 +2696,7 @@ test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. -case "$host_os" in +case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then @@ -2538,43 +2708,6 @@ aix3*) aix4* | aix5*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no - fi - ;; - darwin* | rhapsody*) - if test "$GCC" = yes; then - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - case "$host_os" in - rhapsody* | darwin1.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' - ;; - 10.*) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' - ;; - esac - fi - ;; - esac - output_verbose_link_cmd='echo' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring' - _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_automatic, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac @@ -2601,7 +2734,7 @@ AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], [AC_LANG_PUSH(C++) AC_REQUIRE([AC_PROG_CXX]) -AC_REQUIRE([AC_PROG_CXXCPP]) +AC_REQUIRE([_LT_AC_PROG_CXXCPP]) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(allow_undefined_flag, $1)= @@ -2613,6 +2746,7 @@ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= _LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= @@ -2630,7 +2764,7 @@ _LT_AC_TAGVAR(postdeps, $1)= _LT_AC_TAGVAR(compiler_lib_search_path, $1)= # Source file extension for C++ test sources. -ac_ext=cc +ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o @@ -2640,11 +2774,15 @@ _LT_AC_TAGVAR(objext, $1)=$objext lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests -lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' +lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD @@ -2655,18 +2793,18 @@ lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else - unset lt_cv_prog_gnu_ld + $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else - unset lt_cv_path_LD + $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC -cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` +_LT_CC_BASENAME([$compiler]) # We don't want -fno-exception wen compiling C++ code, so set the # no_builtin_flag separately @@ -2755,6 +2893,7 @@ case $host_os in ;; esac done + ;; esac exp_sym_flag='-bexport' @@ -2773,7 +2912,7 @@ case $host_os in _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GXX" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) + case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` @@ -2792,8 +2931,12 @@ case $host_os in _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi + ;; esac shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi else # not using gcc if test "$host_cpu" = ia64; then @@ -2820,12 +2963,12 @@ case $host_os in _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX @@ -2834,16 +2977,26 @@ case $host_os in # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - # -bexpall does not export symbols beginning with underscore (_) - _LT_AC_TAGVAR(always_export_symbols, $1)=yes # Exported symbols can be pulled into shared objects from archives - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds it's shared libraries. - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + # This is similar to how AIX traditionally builds its shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + chorus*) case $cc_basename in *) @@ -2862,7 +3015,7 @@ case $host_os in _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then @@ -2871,70 +3024,81 @@ case $host_os in echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - darwin* | rhapsody*) - if test "$GXX" = yes; then - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - case "$host_os" in - rhapsody* | darwin1.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + if test "$GXX" = yes ; then + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' - ;; - 10.*) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' - ;; - esac + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac fi - ;; - esac - lt_int_apple_cc_single_mod=no - output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes - fi - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - fi - _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_automatic, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; + ;; dgux*) case $cc_basename in - ec++) + ec++*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; - ghcx) + ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no @@ -2945,14 +3109,14 @@ case $host_os in ;; esac ;; - freebsd[12]*) + freebsd[[12]]*) # C++ shared libraries reported to be fairly broken before switch to ELF _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; - freebsd* | kfreebsd*-gnu) + freebsd* | kfreebsd*-gnu | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_AC_TAGVAR(ld_shlibs, $1)=yes @@ -2969,11 +3133,11 @@ case $host_os in # location of the library. case $cc_basename in - CC) + CC*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; - aCC) + aCC*) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when @@ -2983,7 +3147,7 @@ case $host_os in # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then @@ -2997,33 +3161,22 @@ case $host_os in ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then - case "$host_cpu" in - hppa*64*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - ia64*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ;; *) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi - case "$host_cpu" in - hppa*64*) - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - ia64*) + case $host_cpu in + hppa*64*|ia64*) _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. ;; *) _LT_AC_TAGVAR(hardcode_direct, $1)=yes @@ -3034,14 +3187,17 @@ case $host_os in esac case $cc_basename in - CC) + CC*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; - aCC) - case "$host_cpu" in - hppa*64*|ia64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + aCC*) + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' @@ -3060,9 +3216,12 @@ case $host_os in *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then - case "$host_cpu" in - ia64*|hppa*64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' @@ -3076,11 +3235,25 @@ case $host_os in ;; esac ;; + interix3*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; irix5* | irix6*) case $cc_basename in - CC) + CC*) # SGI C++ - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is @@ -3091,7 +3264,7 @@ case $host_os in *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' fi @@ -3104,7 +3277,7 @@ case $host_os in ;; linux*) case $cc_basename in - KCC) + KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file @@ -3129,18 +3302,42 @@ case $host_os in # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; - icpc) + icpc*) # Intel C++ with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; - cxx) - # Compaq C++ + pgCC*) + # Portland Group C++ compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' @@ -3170,7 +3367,7 @@ case $host_os in ;; mvs*) case $cc_basename in - cxx) + cxx*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; @@ -3191,9 +3388,25 @@ case $host_os in # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; + openbsd2*) + # C++ shared libraries are fairly broken + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + openbsd*) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + ;; osf3*) case $cc_basename in - KCC) + KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file @@ -3209,14 +3422,14 @@ case $host_os in _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; - RCC) + RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; - cxx) + cxx*) _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: @@ -3234,7 +3447,7 @@ case $host_os in *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: @@ -3253,7 +3466,7 @@ case $host_os in ;; osf4* | osf5*) case $cc_basename in - KCC) + KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file @@ -3268,17 +3481,17 @@ case $host_os in # the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; - RCC) + RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; - cxx) + cxx*) _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ $rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' @@ -3297,7 +3510,7 @@ case $host_os in *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: @@ -3318,27 +3531,14 @@ case $host_os in # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; - sco*) - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - case $cc_basename in - CC) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; sunos4*) case $cc_basename in - CC) + CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; - lcc) + lcc*) # Lucid # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no @@ -3351,36 +3551,33 @@ case $host_os in ;; solaris*) case $cc_basename in - CC) + CC*) # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The C++ compiler is used as linker so we must use $wl # flag to pass the commands to the underlying system - # linker. + # linker. We must also pass each convience library through + # to the system linker between allextract/defaultextract. + # The C++ compiler will combine linker options so we + # cannot just pass the convience library names through + # without $wl. # Supported since Solaris 2.6 (maybe 2.5.1?) - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is @@ -3388,7 +3585,7 @@ case $host_os in # in the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; - gcx) + gcx*) # Green Hills C++ Compiler _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' @@ -3426,12 +3623,63 @@ case $host_os in ;; esac ;; - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + # So that behaviour is only enabled if SCOABSPATH is set to a + # non-empty value in the environment. Most likely only useful for + # creating official distributions of packages. + # This is a hack until libtool officially supports absolute path + # names for shared libraries. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac ;; tandem*) case $cc_basename in - NCC) + NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no @@ -3464,8 +3712,6 @@ AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) -AC_LIBTOOL_SYS_LIB_STRIP -AC_LIBTOOL_DLOPEN_SELF($1) AC_LIBTOOL_CONFIG($1) @@ -3483,7 +3729,7 @@ lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld ])# AC_LIBTOOL_LANG_CXX_CONFIG # AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) -# ------------------------ +# ------------------------------------ # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary @@ -3537,7 +3783,7 @@ if AC_TRY_EVAL(ac_compile); then # The `*' in the case matches for architectures that use `case' in # $output_verbose_cmd can trigger glob expansion during the loop # eval without this substitution. - output_verbose_link_cmd="`$echo \"X$output_verbose_link_cmd\" | $Xsed -e \"$no_glob_subst\"`" + output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"` for p in `eval $output_verbose_link_cmd`; do case $p in @@ -3613,13 +3859,37 @@ fi $rm -f confest.$objext +# PORTME: override above test on systems where it is broken +ifelse([$1],[CXX], +[case $host_os in +interix3*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_AC_TAGVAR(predep_objects,$1)= + _LT_AC_TAGVAR(postdep_objects,$1)= + _LT_AC_TAGVAR(postdeps,$1)= + ;; + +solaris*) + case $cc_basename in + CC*) + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + _LT_AC_TAGVAR(postdeps,$1)='-lCstd -lCrun' + ;; + esac + ;; +esac +]) + case " $_LT_AC_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac ])# AC_LIBTOOL_POSTDEP_PREDEP # AC_LIBTOOL_LANG_F77_CONFIG -# ------------------------ +# -------------------------- # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. @@ -3663,12 +3933,16 @@ lt_simple_link_test_code=" program t\n end\n" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${F77-"f77"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC -cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` +_LT_CC_BASENAME([$compiler]) AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) @@ -3678,7 +3952,7 @@ test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. -case "$host_os" in +case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then @@ -3687,7 +3961,9 @@ aix3*) fi ;; aix4* | aix5*) - test "$enable_shared" = yes && enable_static=no + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi ;; esac AC_MSG_RESULT([$enable_shared]) @@ -3697,8 +3973,6 @@ AC_MSG_CHECKING([whether to build static libraries]) test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) -test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - _LT_AC_TAGVAR(GCC, $1)="$G77" _LT_AC_TAGVAR(LD, $1)="$LD" @@ -3708,8 +3982,6 @@ AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) -AC_LIBTOOL_SYS_LIB_STRIP - AC_LIBTOOL_CONFIG($1) @@ -3738,20 +4010,27 @@ _LT_AC_TAGVAR(objext, $1)=$objext lt_simple_compile_test_code="class foo {}\n" # Code to be used in simple link tests -lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n' +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${GCJ-"gcj"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds + AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) @@ -3759,8 +4038,6 @@ AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) -AC_LIBTOOL_SYS_LIB_STRIP -AC_LIBTOOL_DLOPEN_SELF($1) AC_LIBTOOL_CONFIG($1) @@ -3770,7 +4047,7 @@ CC="$lt_save_CC" # AC_LIBTOOL_LANG_RC_CONFIG -# -------------------------- +# ------------------------- # Ensure that the configuration vars for the Windows resource compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. @@ -3794,11 +4071,16 @@ lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${RC-"windres"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes AC_LIBTOOL_CONFIG($1) @@ -3828,7 +4110,7 @@ if test -f "$ltmain"; then # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ @@ -3934,7 +4216,7 @@ ifelse([$1], [], # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a @@ -3945,11 +4227,11 @@ ifelse([$1], [], SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="$SED -e s/^X//" +Xsed="$SED -e 1s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. -if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH # The names of the tagged configurations supported by this script. available_tags= @@ -3980,6 +4262,12 @@ fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo @@ -3991,6 +4279,9 @@ AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + # A language-specific compiler. CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) @@ -4056,7 +4347,7 @@ max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) -# Must we lock files when doing compilation ? +# Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? @@ -4330,9 +4621,6 @@ symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' -# Transform the above into a raw symbol and a C symbol. -symxfrm='\1 \2\3 \3' - # Transform an extracted symbol line into a proper C declaration lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" @@ -4354,15 +4642,31 @@ hpux*) # Its linker distinguishes data from code symbols lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; +linux*) + if test "$host_cpu" = ia64; then + symcode='[[ABCDGIRSTW]]' + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + fi + ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; -solaris* | sysv5*) +solaris*) symcode='[[BDRT]]' ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; sysv4) symcode='[[DFNSTU]]' ;; @@ -4385,8 +4689,11 @@ esac # Try without a prefix undercore, then with it. for ac_symprfx in "" "_"; do + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + # Write the raw and C identifiers. - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no @@ -4542,6 +4849,10 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) # DJGPP does not support shared libraries at all _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ;; + interix3*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic @@ -4550,7 +4861,7 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. - case "$host_cpu" in + case $host_cpu in hppa*64*|ia64*) ;; *) @@ -4575,18 +4886,28 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) ;; chorus*) case $cc_basename in - cxch68) + cxch68*) # Green Hills C++ Compiler # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; dgux*) case $cc_basename in - ec++) + ec++*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; - ghcx) + ghcx*) # Green Hills C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; @@ -4594,22 +4915,22 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) ;; esac ;; - freebsd* | kfreebsd*-gnu) + freebsd* | kfreebsd*-gnu | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in - CC) + CC*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; - aCC) + aCC*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" - case "$host_cpu" in + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in hppa*64*|ia64*) # +Z the default ;; @@ -4622,9 +4943,13 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) ;; esac ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; irix5* | irix6* | nonstopux*) case $cc_basename in - CC) + CC*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. @@ -4635,18 +4960,24 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) ;; linux*) case $cc_basename in - KCC) + KCC*) # KAI C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; - icpc) + icpc* | ecpc*) # Intel C++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; - cxx) + pgCC*) + # Portland Group C++ compiler. + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. @@ -4663,7 +4994,7 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) ;; mvs*) case $cc_basename in - cxx) + cxx*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) @@ -4674,14 +5005,14 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) ;; osf3* | osf4* | osf5*) case $cc_basename in - KCC) + KCC*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; - RCC) + RCC*) # Rational C++ 2.4.1 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; - cxx) + cxx*) # Digital/Compaq C++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha @@ -4695,24 +5026,15 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) ;; psos*) ;; - sco*) - case $cc_basename in - CC) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - *) - ;; - esac - ;; solaris*) case $cc_basename in - CC) + CC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; - gcx) + gcx*) # Green Hills C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; @@ -4722,12 +5044,12 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) ;; sunos4*) case $cc_basename in - CC) + CC*) # Sun C++ 4.x _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; - lcc) + lcc*) # Lucid _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; @@ -4737,7 +5059,7 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) ;; tandem*) case $cc_basename in - NCC) + NCC*) # NonStop-UX NCC 3.20 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; @@ -4745,7 +5067,14 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) ;; esac ;; - unixware*) + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac ;; vxworks*) ;; @@ -4792,6 +5121,11 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; + interix3*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. @@ -4808,7 +5142,7 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. - case "$host_cpu" in + case $host_cpu in hppa*64*|ia64*) # +Z the default ;; @@ -4834,6 +5168,16 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being @@ -4845,7 +5189,7 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. - case "$host_cpu" in + case $host_cpu in hppa*64*|ia64*) # +Z the default ;; @@ -4869,12 +5213,19 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) ;; linux*) - case $CC in + case $cc_basename in icc* | ecc*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; ccc*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. @@ -4889,15 +5240,15 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; - sco3.2v5*) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' - ;; - solaris*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac ;; sunos4*) @@ -4906,7 +5257,7 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + sysv4 | sysv4.2uw2* | sysv4.3*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' @@ -4919,6 +5270,17 @@ AC_MSG_CHECKING([for $compiler option to produce PIC]) fi ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + uts4*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' @@ -4946,7 +5308,7 @@ if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi -case "$host_os" in +case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= @@ -4955,6 +5317,16 @@ case "$host_os" in _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" ;; esac + +# +# Check to make sure the static flag actually works. +# +wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\" +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) ]) @@ -4979,7 +5351,7 @@ ifelse([$1],[CXX],[ _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw*) - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([[^ ]]*\) [[^ ]]*/\1 DATA/;/^I /d;/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' ;; *) _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' @@ -5022,7 +5394,8 @@ ifelse([$1],[CXX],[ # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= - + # Just being paranoid about ensuring that cc_basename is set. + _LT_CC_BASENAME([$compiler]) case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time @@ -5032,6 +5405,10 @@ ifelse([$1],[CXX],[ with_gnu_ld=no fi ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; openbsd*) with_gnu_ld=no ;; @@ -5042,6 +5419,27 @@ ifelse([$1],[CXX],[ # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) @@ -5092,10 +5490,10 @@ EOF _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then @@ -5104,9 +5502,55 @@ EOF echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else - ld_shlibs=no + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + interix3*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; @@ -5120,7 +5564,7 @@ EOF fi ;; - solaris* | sysv5*) + solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <&2 @@ -5141,6 +5585,33 @@ EOF fi ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + sunos4*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= @@ -5148,31 +5619,6 @@ EOF _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; - linux*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_cmds, $1)="$tmp_archive_cmds" - supports_anon_versioning=no - case `$LD -v 2>/dev/null` in - *\ [01].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - if test $supports_anon_versioning = yes; then - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ -cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ -$echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - else - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="$tmp_archive_cmds" - fi - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' @@ -5183,16 +5629,11 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ ;; esac - if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then - runpath_var=LD_RUN_PATH - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= - fi + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) @@ -5204,7 +5645,7 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - if test "$GCC" = yes && test -z "$link_static_flag"; then + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported @@ -5238,6 +5679,7 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ break fi done + ;; esac exp_sym_flag='-bexport' @@ -5256,7 +5698,7 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) + case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` @@ -5275,8 +5717,12 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi + ;; esac shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi else # not using gcc if test "$host_cpu" = ia64; then @@ -5284,11 +5730,11 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else - if test "$aix_use_runtimelinking" = yes; then + if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' - fi + fi fi fi @@ -5302,12 +5748,12 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX @@ -5316,13 +5762,11 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - # -bexpall does not export symbols beginning with underscore (_) - _LT_AC_TAGVAR(always_export_symbols, $1)=yes # Exported symbols can be pulled into shared objects from archives - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds it's shared libraries. - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + # This is similar to how AIX traditionally builds its shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; @@ -5335,7 +5779,7 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; - bsdi4*) + bsdi[[45]]*) _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; @@ -5356,57 +5800,57 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' - fix_srcfile_path='`cygpath -w "$srcfile"`' + _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; darwin* | rhapsody*) - if test "$GXX" = yes ; then - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - case "$host_os" in - rhapsody* | darwin1.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' - ;; - 10.*) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' - ;; - esac - fi - ;; + case $host_os in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; esac - lt_int_apple_cc_single_mod=no - output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes - fi - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - fi - _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else - _LT_AC_TAGVAR(ld_shlibs, $1)=no + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac fi ;; @@ -5440,7 +5884,7 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | kfreebsd*-gnu) + freebsd* | kfreebsd*-gnu | dragonfly*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes @@ -5463,47 +5907,62 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; - hpux10* | hpux11*) + hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then - case "$host_cpu" in - hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else - case "$host_cpu" in - hppa*64*|ia64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then - case "$host_cpu" in - hppa*64*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; - ia64*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - ;; *) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' @@ -5551,6 +6010,7 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else @@ -5596,7 +6056,7 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ - $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' @@ -5604,21 +6064,15 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; - sco3.2v5*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ;; - solaris*) _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' if test "$GCC" = yes; then + wlarc='${wl}' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else + wlarc='' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' @@ -5627,8 +6081,18 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) # Supported since Solaris 2.6 (maybe 2.5.1?) - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; + *) + # The compiler driver will combine linker options so we + # cannot just pass the convience library names through + # without $wl, iff we do not link with $LD. + # Luckily, gcc supports the same syntax we need for Sun Studio. + # Supported since Solaris 2.6 (maybe 2.5.1?) + case $wlarc in + '') + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; + *) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; + esac ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; @@ -5685,36 +6149,45 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ fi ;; - sysv4.2uw2*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - hardcode_runpath_var=yes - runpath_var=LD_RUN_PATH - ;; + runpath_var='LD_RUN_PATH' - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) - _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' if test "$GCC" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi - runpath_var='LD_RUN_PATH' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; - sysv5*) - _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' - # $CC -shared without GNU ld will not create a library from C++ - # object files and a static libstdc++, better avoid it by now - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi ;; uts4*) @@ -5732,11 +6205,6 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - # # Do we need to explicitly link libc? # @@ -5764,6 +6232,7 @@ x|xyes) libobjs=conftest.$ac_objext deplibs= wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= @@ -5889,7 +6358,7 @@ lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do - test ! -f $lt_ac_sed && break + test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in @@ -5914,8 +6383,8 @@ for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do fi done done -SED=$lt_cv_path_SED ]) +SED=$lt_cv_path_SED AC_MSG_RESULT([$SED]) ]) diff --git a/asn1c/Makefile.in b/asn1c/Makefile.in index 4f596bdb4..bcc763896 100644 --- a/asn1c/Makefile.in +++ b/asn1c/Makefile.in @@ -122,6 +122,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -153,12 +154,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -175,23 +174,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/asn1c/tests/Makefile.in b/asn1c/tests/Makefile.in index 41ff0a6c9..d8ee83925 100644 --- a/asn1c/tests/Makefile.in +++ b/asn1c/tests/Makefile.in @@ -79,6 +79,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -110,12 +111,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -132,23 +131,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/asn1c/webcgi/Makefile.in b/asn1c/webcgi/Makefile.in index 36d081b96..d3ef9e91f 100644 --- a/asn1c/webcgi/Makefile.in +++ b/asn1c/webcgi/Makefile.in @@ -100,6 +100,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -131,12 +132,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -153,23 +152,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/config.h.in b/config.h.in index 0133b2b04..799d891d6 100644 --- a/config.h.in +++ b/config.h.in @@ -6,12 +6,18 @@ /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H +/* Define to 1 if you have the `iberty' library (-liberty). */ +#undef HAVE_LIBIBERTY + /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `mergesort' function. */ #undef HAVE_MERGESORT +/* Define to 1 if you have the `mkstemps' function. */ +#undef HAVE_MKSTEMPS + /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H @@ -80,8 +86,8 @@ /* Define to `int64_t' if does not define. */ #undef intmax_t -/* Define to `long' if does not define. */ +/* Define to `long int' if does not define. */ #undef off_t -/* Define to `unsigned' if does not define. */ +/* Define to `unsigned int' if does not define. */ #undef size_t diff --git a/configure b/configure index 0f65610fc..97621be06 100755 --- a/configure +++ b/configure @@ -1,8 +1,9 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.59. +# Generated by GNU Autoconf 2.60. # -# Copyright (C) 2003 Free Software Foundation, Inc. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## @@ -16,11 +17,35 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then - set -o posix + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi +BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset @@ -29,8 +54,43 @@ else fi +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +as_nl=' +' +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + # Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done PS1='$ ' PS2='> ' PS4='+ ' @@ -44,18 +104,19 @@ do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else - $as_unset $as_var + ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1; then +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi -if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false @@ -63,157 +124,386 @@ fi # Name of the executable. -as_me=`$as_basename "$0" || +as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)$' \| \ - . : '\(.\)' 2>/dev/null || + X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } - /^X\/\(\/\/\)$/{ s//\1/; q; } - /^X\/\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` +# CDPATH. +$as_unset CDPATH -# PATH needs CR, and LINENO needs CR and PATH. -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi + + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. fi +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi - ;; - esac - # We did not find ourselves, most probably we were run as `sh COMMAND' - # in which case we are not to be found in the path. - if test "x$as_myself" = x; then - as_myself=$0 - fi - if test ! -f "$as_myself"; then - { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +for as_dir in /usr/bin/posix$PATH_SEPARATOR/bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for as_base in sh bash ksh sh5; do - case $as_dir in + case $as_dir in /*) - if ("$as_dir/$as_base" -c ' + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +: +(as_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( as_lineno_1=$LINENO as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell autoconf@gnu.org about your system, + echo including any error possibly output before this + echo message +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, and appends trailing '-' during - # substitution so that $LINENO is not a special case at line end. + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno N - s,$,-, - : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop - s,-$,, - s,^['$as_cr_digits']*\n,, + s/-\n.*// ' >$as_me.lineno && - chmod +x $as_me.lineno || + chmod +x "$as_me.lineno" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensible to this). - . ./$as_me.lineno + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" # Exit status is that of the last command. exit } -case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in - *c*,-n*) ECHO_N= ECHO_C=' -' ECHO_T=' ' ;; - *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; - *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; esac -if expr a : '\(a\)' >/dev/null 2>&1; then +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir +fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then - # We could just check for DJGPP; but this test a) works b) is more generic - # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). - if test -f conf$$.exe; then - # Don't use ln at all; we don't have any links + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' - else - as_ln_s='ln -s' - fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi -rm -f conf$$ conf$$.exe conf$$.file +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: @@ -222,7 +512,19 @@ else as_mkdir_p=false fi -as_executable_p="test -f" +# Find out whether ``test -x'' works. Don't use a zero-byte file, as +# systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + as_executable_p="test -x" +else + as_executable_p=: +fi +rm -f conf$$.file # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -231,15 +533,6 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" -# IFS -# We need space, tab and new line, in precisely that order. -as_nl=' -' -IFS=" $as_nl" - -# CDPATH. -$as_unset CDPATH - # Check that we are running under the correct shell. @@ -395,29 +688,26 @@ tagnames=${tagnames+${tagnames},}CXX tagnames=${tagnames+${tagnames},}F77 +exec 7<&0 &1 + # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` -exec 6>&1 - # # Initializations. # ac_default_prefix=/usr/local +ac_clean_files= ac_config_libobj_dir=. +LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} -# Maximum number of lines to put in a shell here document. -# This variable seems obsolete. It should probably be removed, and -# only ac_max_sed_lines should be used. -: ${ac_max_here_lines=38} - # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= @@ -454,17 +744,148 @@ ac_includes_default="\ #endif #if HAVE_INTTYPES_H # include -#else -# if HAVE_STDINT_H -# include -# endif +#endif +#if HAVE_STDINT_H +# include #endif #if HAVE_UNISTD_H # include #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CPP CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL CONFIGURE_DEPENDS YACC LEX LEXLIB LEX_OUTPUT_ROOT ADD_CFLAGS LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL +PATH_SEPARATOR +PACKAGE_NAME +PACKAGE_TARNAME +PACKAGE_VERSION +PACKAGE_STRING +PACKAGE_BUGREPORT +exec_prefix +prefix +program_transform_name +bindir +sbindir +libexecdir +datarootdir +datadir +sysconfdir +sharedstatedir +localstatedir +includedir +oldincludedir +docdir +infodir +htmldir +dvidir +pdfdir +psdir +libdir +localedir +mandir +DEFS +ECHO_C +ECHO_N +ECHO_T +LIBS +build_alias +host_alias +target_alias +build +build_cpu +build_vendor +build_os +host +host_cpu +host_vendor +host_os +target +target_cpu +target_vendor +target_os +INSTALL_PROGRAM +INSTALL_SCRIPT +INSTALL_DATA +CYGPATH_W +PACKAGE +VERSION +ACLOCAL +AUTOCONF +AUTOMAKE +AUTOHEADER +MAKEINFO +install_sh +STRIP +INSTALL_STRIP_PROGRAM +mkdir_p +AWK +SET_MAKE +am__leading_dot +AMTAR +am__tar +am__untar +MAINTAINER_MODE_TRUE +MAINTAINER_MODE_FALSE +MAINT +CC +CFLAGS +LDFLAGS +CPPFLAGS +ac_ct_CC +EXEEXT +OBJEXT +DEPDIR +am__include +am__quote +AMDEP_TRUE +AMDEP_FALSE +AMDEPBACKSLASH +CCDEPMODE +am__fastdepCC_TRUE +am__fastdepCC_FALSE +GREP +EGREP +LN_S +ECHO +AR +RANLIB +CPP +CXX +CXXFLAGS +ac_ct_CXX +CXXDEPMODE +am__fastdepCXX_TRUE +am__fastdepCXX_FALSE +CXXCPP +F77 +FFLAGS +ac_ct_F77 +LIBTOOL +CONFIGURE_DEPENDS +YACC +YFLAGS +LEX +LEXLIB +LEX_OUTPUT_ROOT +ADD_CFLAGS +LIBOBJS +LTLIBOBJS' ac_subst_files='' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +CPPFLAGS +CPP +CXX +CXXFLAGS +CCC +CXXCPP +F77 +FFLAGS +YACC +YFLAGS' + # Initialize some variables set by options. ac_init_help= @@ -491,34 +912,48 @@ x_libraries=NONE # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' +datarootdir='${prefix}/share' +datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' +docdir='${datarootdir}/doc/${PACKAGE}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' ac_prev= +ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" + eval $ac_prev=\$ac_option ac_prev= continue fi - ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + case $ac_option in + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; + esac # Accept the important Cygnus configure options, so we can diagnose typos. - case $ac_option in + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; @@ -540,12 +975,18 @@ do --config-cache | -C) cache_file=config.cache ;; - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) + -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. @@ -553,7 +994,17 @@ do { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` - eval "enable_$ac_feature=no" ;; + eval enable_$ac_feature=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` @@ -562,11 +1013,7 @@ do { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` - case $ac_option in - *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; - *) ac_optarg=yes ;; - esac - eval "enable_$ac_feature='$ac_optarg'" ;; + eval enable_$ac_feature=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ @@ -593,6 +1040,12 @@ do -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; @@ -617,13 +1070,16 @@ do | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) + | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) @@ -688,6 +1144,16 @@ do | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; @@ -744,11 +1210,7 @@ do { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` - case $ac_option in - *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; - *) ac_optarg=yes ;; - esac - eval "with_$ac_package='$ac_optarg'" ;; + eval with_$ac_package=\$ac_optarg ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` @@ -757,7 +1219,7 @@ do { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/-/_/g'` - eval "with_$ac_package=no" ;; + eval with_$ac_package=no ;; --x) # Obsolete; use --with-x. @@ -788,8 +1250,7 @@ Try \`$0 --help' for more information." >&2 expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } - ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` - eval "$ac_envvar='$ac_optarg'" + eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) @@ -809,27 +1270,19 @@ if test -n "$ac_prev"; then { (exit 1); exit 1; }; } fi -# Be sure to have absolute paths. -for ac_var in exec_prefix prefix -do - eval ac_val=$`echo $ac_var` - case $ac_val in - [\\/$]* | ?:[\\/]* | NONE | '' ) ;; - *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; };; - esac -done - -# Be sure to have absolute paths. -for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ - localstatedir libdir includedir oldincludedir infodir mandir +# Be sure to have absolute directory names. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir do - eval ac_val=$`echo $ac_var` + eval ac_val=\$$ac_var case $ac_val in - [\\/$]* | ?:[\\/]* ) ;; - *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; };; + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac + { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } done # There might be people who depend on the old broken behavior: `$host' @@ -856,96 +1309,78 @@ test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + { echo "$as_me: error: Working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + { echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } + + # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_confdir=`(dirname "$0") 2>/dev/null || + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$0" || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X"$0" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then + if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 - { (exit 1); exit 1; }; } - else - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } - fi fi -(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || - { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } -srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` -ac_env_build_alias_set=${build_alias+set} -ac_env_build_alias_value=$build_alias -ac_cv_env_build_alias_set=${build_alias+set} -ac_cv_env_build_alias_value=$build_alias -ac_env_host_alias_set=${host_alias+set} -ac_env_host_alias_value=$host_alias -ac_cv_env_host_alias_set=${host_alias+set} -ac_cv_env_host_alias_value=$host_alias -ac_env_target_alias_set=${target_alias+set} -ac_env_target_alias_value=$target_alias -ac_cv_env_target_alias_set=${target_alias+set} -ac_cv_env_target_alias_value=$target_alias -ac_env_CC_set=${CC+set} -ac_env_CC_value=$CC -ac_cv_env_CC_set=${CC+set} -ac_cv_env_CC_value=$CC -ac_env_CFLAGS_set=${CFLAGS+set} -ac_env_CFLAGS_value=$CFLAGS -ac_cv_env_CFLAGS_set=${CFLAGS+set} -ac_cv_env_CFLAGS_value=$CFLAGS -ac_env_LDFLAGS_set=${LDFLAGS+set} -ac_env_LDFLAGS_value=$LDFLAGS -ac_cv_env_LDFLAGS_set=${LDFLAGS+set} -ac_cv_env_LDFLAGS_value=$LDFLAGS -ac_env_CPPFLAGS_set=${CPPFLAGS+set} -ac_env_CPPFLAGS_value=$CPPFLAGS -ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} -ac_cv_env_CPPFLAGS_value=$CPPFLAGS -ac_env_CPP_set=${CPP+set} -ac_env_CPP_value=$CPP -ac_cv_env_CPP_set=${CPP+set} -ac_cv_env_CPP_value=$CPP -ac_env_CXX_set=${CXX+set} -ac_env_CXX_value=$CXX -ac_cv_env_CXX_set=${CXX+set} -ac_cv_env_CXX_value=$CXX -ac_env_CXXFLAGS_set=${CXXFLAGS+set} -ac_env_CXXFLAGS_value=$CXXFLAGS -ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} -ac_cv_env_CXXFLAGS_value=$CXXFLAGS -ac_env_CXXCPP_set=${CXXCPP+set} -ac_env_CXXCPP_value=$CXXCPP -ac_cv_env_CXXCPP_set=${CXXCPP+set} -ac_cv_env_CXXCPP_value=$CXXCPP -ac_env_F77_set=${F77+set} -ac_env_F77_value=$F77 -ac_cv_env_F77_set=${F77+set} -ac_cv_env_F77_value=$F77 -ac_env_FFLAGS_set=${FFLAGS+set} -ac_env_FFLAGS_value=$FFLAGS -ac_cv_env_FFLAGS_set=${FFLAGS+set} -ac_cv_env_FFLAGS_value=$FFLAGS - -# + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# # Report the --help message. # if test "$ac_init_help" = "long"; then @@ -972,9 +1407,6 @@ Configuration: -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] -_ACEOF - - cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] @@ -992,15 +1424,22 @@ Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data [PREFIX/share] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] - --infodir=DIR info documentation [PREFIX/info] - --mandir=DIR man documentation [PREFIX/man] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF @@ -1026,10 +1465,8 @@ Optional Features: --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer - --enable-shared[=PKGS] - build shared libraries [default=yes] - --enable-static[=PKGS] - build static libraries [default=yes] + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-dependency-tracking speeds up one-time build @@ -1044,139 +1481,111 @@ Optional Packages: --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-pic try to use only PIC/non-PIC objects [default=use both] - --with-tags[=TAGS] - include additional configurations [automatic] + --with-tags[=TAGS] include additional configurations [automatic] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory - CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have - headers in a nonstandard directory + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor F77 Fortran 77 compiler command FFLAGS Fortran 77 compiler flags + YACC The `Yet Another C Compiler' implementation to use. Defaults to + the first program found out of: `bison -y', `byacc', `yacc'. + YFLAGS The list of arguments that will be passed by default to $YACC. + This script will default YFLAGS to the empty string to avoid a + default value of `-d' given by some make applications. Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. _ACEOF +ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. - ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d $ac_dir || continue + test -d "$ac_dir" || continue ac_builddir=. -if test "$ac_dir" != .; then +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix case $srcdir in - .) # No --srcdir option. We are building in place. + .) # We are building in place. ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; -esac - -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac - - cd $ac_dir - # Check for guested configure; otherwise get Cygnus style configure. - if test -f $ac_srcdir/configure.gnu; then - echo - $SHELL $ac_srcdir/configure.gnu --help=recursive - elif test -f $ac_srcdir/configure; then - echo - $SHELL $ac_srcdir/configure --help=recursive - elif test -f $ac_srcdir/configure.ac || - test -f $ac_srcdir/configure.in; then - echo - $ac_configure --help +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi - cd $ac_popdir + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } done fi -test -n "$ac_init_help" && exit 0 +test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF +configure +generated by GNU Autoconf 2.60 -Copyright (C) 2003 Free Software Foundation, Inc. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF - exit 0 + exit fi -exec 5>config.log -cat >&5 <<_ACEOF +cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was -generated by GNU Autoconf 2.59. Invocation command line was +generated by GNU Autoconf 2.60. Invocation command line was $ $0 $@ _ACEOF +exec 5>>config.log { cat <<_ASUNAME ## --------- ## @@ -1195,7 +1604,7 @@ uname -v = `(uname -v) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` @@ -1209,6 +1618,7 @@ do test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done +IFS=$as_save_IFS } >&5 @@ -1230,7 +1640,6 @@ _ACEOF ac_configure_args= ac_configure_args0= ac_configure_args1= -ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do @@ -1241,7 +1650,7 @@ do -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + *\'*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in @@ -1263,9 +1672,7 @@ do -* ) ac_must_keep_next=true ;; esac fi - ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" - # Get rid of the leading space. - ac_sep=" " + ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done @@ -1276,8 +1683,8 @@ $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_ # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. -# WARNING: Be sure not to use single quotes in there, as some shells, -# such as our DU 5.0 friend, will then `close' the trap. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { @@ -1290,20 +1697,34 @@ trap 'exit_status=$? _ASBOX echo # The following way of writing the cache mishandles newlines in values, -{ +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done (set) 2>&1 | - case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in - *ac_space=\ *) + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) sed -n \ - "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" - ;; + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( *) - sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; - esac; -} + esac | + sort +) echo cat <<\_ASBOX @@ -1314,22 +1735,28 @@ _ASBOX echo for ac_var in $ac_subst_vars do - eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX -## ------------- ## -## Output files. ## -## ------------- ## +## ------------------- ## +## File substitutions. ## +## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do - eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + echo "$ac_var='\''$ac_val'\''" done | sort echo fi @@ -1341,26 +1768,24 @@ _ASBOX ## ----------- ## _ASBOX echo - sed "/^$/d" confdefs.h | sort + cat confdefs.h echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 - rm -f core *.core && - rm -rf conftest* confdefs* conf$$* $ac_clean_files && + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status - ' 0 +' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo >confdefs.h +rm -f -r conftest* confdefs.h # Predefined preprocessor variables. @@ -1391,14 +1816,17 @@ _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi +if test -n "$CONFIG_SITE"; then + set x "$CONFIG_SITE" +elif test "x$prefix" != xNONE; then + set x "$prefix/share/config.site" "$prefix/etc/config.site" +else + set x "$ac_default_prefix/share/config.site" \ + "$ac_default_prefix/etc/config.site" fi -for ac_site_file in $CONFIG_SITE; do +shift +for ac_site_file +do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} @@ -1414,8 +1842,8 @@ if test -r "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in - [\\/]* | ?:[\\/]* ) . $cache_file;; - *) . ./$cache_file;; + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; esac fi else @@ -1427,12 +1855,11 @@ fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false -for ac_var in `(set) 2>&1 | - sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do +for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val="\$ac_cv_env_${ac_var}_value" - eval ac_new_val="\$ac_env_${ac_var}_value" + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 @@ -1457,8 +1884,7 @@ echo "$as_me: current value: $ac_new_val" >&2;} # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) - ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in @@ -1475,12 +1901,6 @@ echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start ov { (exit 1); exit 1; }; } fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - @@ -1497,107 +1917,162 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break - elif test -f $ac_dir/install.sh; then + elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break - elif test -f $ac_dir/shtool; then + elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then - { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 -echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 +echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} { (exit 1); exit 1; }; } fi -ac_config_guess="$SHELL $ac_aux_dir/config.guess" -ac_config_sub="$SHELL $ac_aux_dir/config.sub" -ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + # Make sure we can run config.sub. -$ac_config_sub sun4 >/dev/null 2>&1 || - { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 -echo "$as_me: error: cannot run $ac_config_sub" >&2;} +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 +echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} { (exit 1); exit 1; }; } -echo "$as_me:$LINENO: checking build system type" >&5 -echo $ECHO_N "checking build system type... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6; } if test "${ac_cv_build+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - ac_cv_build_alias=$build_alias -test -z "$ac_cv_build_alias" && - ac_cv_build_alias=`$ac_config_guess` -test -z "$ac_cv_build_alias" && + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 echo "$as_me: error: cannot guess build type; you must specify one" >&2;} { (exit 1); exit 1; }; } -ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || - { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 -echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 +echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} { (exit 1); exit 1; }; } fi -echo "$as_me:$LINENO: result: $ac_cv_build" >&5 -echo "${ECHO_T}$ac_cv_build" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 +echo "$as_me: error: invalid value of canonical build" >&2;} + { (exit 1); exit 1; }; };; +esac build=$ac_cv_build -build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` - - -echo "$as_me:$LINENO: checking host system type" >&5 -echo $ECHO_N "checking host system type... $ECHO_C" >&6 +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ echo "$as_me:$LINENO: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6; } if test "${ac_cv_host+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - ac_cv_host_alias=$host_alias -test -z "$ac_cv_host_alias" && - ac_cv_host_alias=$ac_cv_build_alias -ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || - { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 -echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 +echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} { (exit 1); exit 1; }; } +fi fi -echo "$as_me:$LINENO: result: $ac_cv_host" >&5 -echo "${ECHO_T}$ac_cv_host" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 +echo "$as_me: error: invalid value of canonical host" >&2;} + { (exit 1); exit 1; }; };; +esac host=$ac_cv_host -host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` - - -echo "$as_me:$LINENO: checking target system type" >&5 -echo $ECHO_N "checking target system type... $ECHO_C" >&6 +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +{ echo "$as_me:$LINENO: checking target system type" >&5 +echo $ECHO_N "checking target system type... $ECHO_C" >&6; } if test "${ac_cv_target+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - ac_cv_target_alias=$target_alias -test "x$ac_cv_target_alias" = "x" && - ac_cv_target_alias=$ac_cv_host_alias -ac_cv_target=`$ac_config_sub $ac_cv_target_alias` || - { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_target_alias failed" >&5 -echo "$as_me: error: $ac_config_sub $ac_cv_target_alias failed" >&2;} + if test "x$target_alias" = x; then + ac_cv_target=$ac_cv_host +else + ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || + { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&5 +echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&2;} { (exit 1); exit 1; }; } +fi fi -echo "$as_me:$LINENO: result: $ac_cv_target" >&5 -echo "${ECHO_T}$ac_cv_target" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_target" >&5 +echo "${ECHO_T}$ac_cv_target" >&6; } +case $ac_cv_target in +*-*-*) ;; +*) { { echo "$as_me:$LINENO: error: invalid value of canonical target" >&5 +echo "$as_me: error: invalid value of canonical target" >&2;} + { (exit 1); exit 1; }; };; +esac target=$ac_cv_target -target_cpu=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -target_vendor=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -target_os=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_target +shift +target_cpu=$1 +target_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +target_os=$* +IFS=$ac_save_IFS +case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. @@ -1621,8 +2096,8 @@ am__api_version="1.9" # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. -echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 -echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -1644,7 +2119,7 @@ case $as_dir/ in # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. @@ -1663,21 +2138,22 @@ case $as_dir/ in ;; esac done +IFS=$as_save_IFS fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is - # removed, or if the path is relative. + # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi -echo "$as_me:$LINENO: result: $INSTALL" >&5 -echo "${ECHO_T}$INSTALL" >&6 +{ echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. @@ -1687,8 +2163,8 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -echo "$as_me:$LINENO: checking whether build environment is sane" >&5 -echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; } # Just in case sleep 1 echo timestamp > conftest.file @@ -1730,20 +2206,20 @@ echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi -echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 +{ echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } test "$program_prefix" != NONE && - program_transform_name="s,^,$program_prefix,;$program_transform_name" + program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && - program_transform_name="s,\$,$program_suffix,;$program_transform_name" + program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. echo might interpret backslashes. # By default was `s,x,x', remove it if useless. cat <<\_ACEOF >conftest.sed s/[\\$]/&&/g;s/;s,x,x,$// _ACEOF program_transform_name=`echo $program_transform_name | sed -f conftest.sed` -rm conftest.sed +rm -f conftest.sed # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` @@ -1795,8 +2271,8 @@ for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -1809,54 +2285,57 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then - echo "$as_me:$LINENO: result: $AWK" >&5 -echo "${ECHO_T}$AWK" >&6 + { echo "$as_me:$LINENO: result: $AWK" >&5 +echo "${ECHO_T}$AWK" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + test -n "$AWK" && break done -echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` -if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then +{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } +set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF +SHELL = /bin/sh all: - @echo 'ac_maketemp="$(MAKE)"' + @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac rm -f conftest.make fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } SET_MAKE= else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi @@ -1927,8 +2406,8 @@ if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -1941,32 +2420,34 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - echo "$as_me:$LINENO: result: $STRIP" >&5 -echo "${ECHO_T}$STRIP" >&6 + { echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -1979,27 +2460,41 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS - test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 -echo "${ECHO_T}$ac_ct_STRIP" >&6 + { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +echo "${ECHO_T}$ac_ct_STRIP" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi - STRIP=$ac_ct_STRIP + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi else STRIP="$ac_cv_prog_STRIP" fi @@ -2020,17 +2515,17 @@ am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' -echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 -echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6 - # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. +{ echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 +echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6; } + # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then - enableval="$enable_maintainer_mode" - USE_MAINTAINER_MODE=$enableval + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no -fi; - echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 -echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6 +fi + + { echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 +echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then @@ -2045,10 +2540,9 @@ fi -# Check whether --enable-shared or --disable-shared was given. +# Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then - enableval="$enable_shared" - p=${PACKAGE-default} + enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; @@ -2067,12 +2561,12 @@ if test "${enable_shared+set}" = set; then esac else enable_shared=yes -fi; +fi + -# Check whether --enable-static or --disable-static was given. +# Check whether --enable-static was given. if test "${enable_static+set}" = set; then - enableval="$enable_static" - p=${PACKAGE-default} + enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; @@ -2091,12 +2585,12 @@ if test "${enable_static+set}" = set; then esac else enable_static=yes -fi; +fi + -# Check whether --enable-fast-install or --disable-fast-install was given. +# Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then - enableval="$enable_fast_install" - p=${PACKAGE-default} + enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; @@ -2115,11 +2609,12 @@ if test "${enable_fast_install+set}" = set; then esac else enable_fast_install=yes -fi; +fi + DEPDIR="${am__leading_dot}deps" - ac_config_commands="$ac_config_commands depfiles" +ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} @@ -2129,8 +2624,8 @@ am__doit: .PHONY: am__doit END # If we don't find an include directive, just comment out the code. -echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 -echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; } am__include="#" am__quote= _am_result=none @@ -2157,15 +2652,15 @@ if test "$am__include" = "#"; then fi -echo "$as_me:$LINENO: result: $_am_result" >&5 -echo "${ECHO_T}$_am_result" >&6 +{ echo "$as_me:$LINENO: result: $_am_result" >&5 +echo "${ECHO_T}$_am_result" >&6; } rm -f confinc confmf -# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. +# Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then - enableval="$enable_dependency_tracking" + enableval=$enable_dependency_tracking; +fi -fi; if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' @@ -2190,8 +2685,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -2204,32 +2699,34 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -2242,36 +2739,51 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 + { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -2284,74 +2796,34 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi - CC=$ac_ct_CC -else - CC="$ac_cv_prog_CC" -fi + fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -2365,7 +2837,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue @@ -2376,6 +2848,7 @@ do fi done done +IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. @@ -2393,22 +2866,23 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then - for ac_prog in cl + for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -2421,36 +2895,38 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC - for ac_prog in cl + for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -2463,29 +2939,45 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 + { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + test -n "$ac_ct_CC" && break done - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi fi fi @@ -2498,21 +2990,35 @@ See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. -echo "$as_me:$LINENO:" \ - "checking for C compiler version" >&5 +echo "$as_me:$LINENO: checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 - (eval $ac_compiler --version &5) 2>&5 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 - (eval $ac_compiler -v &5) 2>&5 +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 - (eval $ac_compiler -V &5) 2>&5 +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } @@ -2537,46 +3043,70 @@ ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 -echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` -if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 - (eval $ac_link_default) 2>&5 +# +# List of possible output files, starting from the most likely. +# The algorithm is not robust to junk in `.', hence go to wildcards (a.*) +# only as a last resort. b.out is created by i960 compilers. +ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' +# +# The IRIX 6 linker writes into existing files which may not be +# executable, retaining their permissions. Remove them first so a +# subsequent execution test works. +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { (ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link_default") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then - # Find the output, starting from the most likely. This scheme is -# not robust to junk in `.', hence go to wildcards (a.*) only as a last -# resort. - -# Be careful to initialize this variable, since it used to be cached. -# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. -ac_cv_exeext= -# b.out is created by i960 compilers. -for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files do test -f "$ac_file" || continue case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) - ;; - conftest.$ac_ext ) - # This is the source file. + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - # FIXME: I believe we export ac_cv_exeext for Libtool, - # but it would be cool to find out if it's true. Does anybody - # maintain Libtool? --akim. - export ac_cv_exeext + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. break;; * ) break;; esac done +test "$ac_cv_exeext" = no && ac_cv_exeext= + else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 @@ -2589,19 +3119,23 @@ See \`config.log' for more details." >&2;} fi ac_exeext=$ac_cv_exeext -echo "$as_me:$LINENO: result: $ac_file" >&5 -echo "${ECHO_T}$ac_file" >&6 +{ echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6; } -# Check the compiler produces executables we can run. If not, either +# Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. -echo "$as_me:$LINENO: checking whether the C compiler works" >&5 -echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -2620,22 +3154,27 @@ See \`config.log' for more details." >&2;} fi fi fi -echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 +{ echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save -# Check the compiler produces executables we can run. If not, either +# Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. -echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 -echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 -echo "$as_me:$LINENO: result: $cross_compiling" >&5 -echo "${ECHO_T}$cross_compiling" >&6 - -echo "$as_me:$LINENO: checking for suffix of executables" >&5 -echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 +{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } +{ echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6; } + +{ echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then @@ -2646,9 +3185,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - export ac_cv_exeext break;; * ) break;; esac @@ -2662,14 +3200,14 @@ See \`config.log' for more details." >&2;} fi rm -f conftest$ac_cv_exeext -echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 -echo "${ECHO_T}$ac_cv_exeext" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT -echo "$as_me:$LINENO: checking for suffix of object files" >&5 -echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -2689,14 +3227,20 @@ main () } _ACEOF rm -f conftest.o conftest.obj -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then - for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac @@ -2714,12 +3258,12 @@ fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 -echo "${ECHO_T}$ac_cv_objext" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT -echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -2742,24 +3286,36 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -2768,24 +3324,28 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_compiler_gnu=no + ac_compiler_gnu=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS -CFLAGS="-g" -echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 -echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - cat >conftest.$ac_ext <<_ACEOF + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -2801,24 +3361,147 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -2827,12 +3510,20 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_prog_cc_g=no + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag fi -echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then @@ -2848,12 +3539,12 @@ else CFLAGS= fi fi -echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 -echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 -if test "${ac_cv_prog_cc_stdc+set}" = set; then +{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - ac_cv_prog_cc_stdc=no + ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -2887,12 +3578,17 @@ static char *f (char * (*g) (char **, int), char **p, ...) /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std1 is added to get + as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std1. */ + that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; @@ -2907,205 +3603,74 @@ return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; return 0; } _ACEOF -# Don't try gcc -ansi; that turns off useful extensions and -# breaks some systems' header files. -# AIX -qlanglvl=ansi -# Ultrix and OSF/1 -std1 -# HP-UX 10.20 and later -Ae -# HP-UX older versions -Aa -D_HPUX_SOURCE -# SVR4 -Xc -D__EXTENSIONS__ -for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then - ac_cv_prog_cc_stdc=$ac_arg -break + ac_cv_prog_cc_c89=$ac_arg else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext + +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break done -rm -f conftest.$ac_ext conftest.$ac_objext +rm -f conftest.$ac_ext CC=$ac_save_CC fi - -case "x$ac_cv_prog_cc_stdc" in - x|xno) - echo "$as_me:$LINENO: result: none needed" >&5 -echo "${ECHO_T}none needed" >&6 ;; +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6; } ;; + xno) + { echo "$as_me:$LINENO: result: unsupported" >&5 +echo "${ECHO_T}unsupported" >&6; } ;; *) - echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 - CC="$CC $ac_cv_prog_cc_stdc" ;; + CC="$CC $ac_cv_prog_cc_c89" + { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; esac -# Some people use a C++ compiler to compile C. Since we use `exit', -# in C++ we need to declare it. In case someone uses the same compiler -# for both compiling C and C++ we need to have the C++ compiler decide -# the declaration of exit, since it's the most demanding environment. -cat >conftest.$ac_ext <<_ACEOF -#ifndef __cplusplus - choke me -#endif -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - for ac_declaration in \ - '' \ - 'extern "C" void std::exit (int) throw (); using std::exit;' \ - 'extern "C" void std::exit (int); using std::exit;' \ - 'extern "C" void exit (int) throw ();' \ - 'extern "C" void exit (int);' \ - 'void exit (int);' -do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -#include -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -continue -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -rm -f conftest* -if test -n "$ac_declaration"; then - echo '#ifdef __cplusplus' >>confdefs.h - echo $ac_declaration >>confdefs.h - echo '#endif' >>confdefs.h -fi - -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -3114,8 +3679,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= -echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 -echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; } if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -3204,8 +3769,8 @@ else fi fi -echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 -echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 +{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type @@ -3221,8 +3786,8 @@ else fi -echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 -echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 +echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6; } if test "${lt_cv_path_SED+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -3275,37 +3840,184 @@ SED=$lt_cv_path_SED fi -echo "$as_me:$LINENO: result: $SED" >&5 -echo "${ECHO_T}$SED" >&6 +{ echo "$as_me:$LINENO: result: $SED" >&5 +echo "${ECHO_T}$SED" >&6; } + +{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; } +if test "${ac_cv_path_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Extract the first word of "grep ggrep" to use in msg output +if test -z "$GREP"; then +set dummy grep ggrep; ac_prog_name=$2 +if test "${ac_cv_path_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_path_GREP_found=false +# Loop through the user's path and test for each of PROGNAME-LIST +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_executable_p "$ac_path_GREP"; } || continue + # Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + + $ac_path_GREP_found && break 3 + done +done + +done +IFS=$as_save_IFS + + +fi + +GREP="$ac_cv_path_GREP" +if test -z "$GREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } +fi + +else + ac_cv_path_GREP=$GREP +fi + + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +echo "${ECHO_T}$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + -echo "$as_me:$LINENO: checking for egrep" >&5 -echo $ECHO_N "checking for egrep... $ECHO_C" >&6 -if test "${ac_cv_prog_egrep+set}" = set; then +{ echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + # Extract the first word of "egrep" to use in msg output +if test -z "$EGREP"; then +set dummy egrep; ac_prog_name=$2 +if test "${ac_cv_path_EGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - if echo a | (grep -E '(a|b)') >/dev/null 2>&1 - then ac_cv_prog_egrep='grep -E' - else ac_cv_prog_egrep='egrep' + ac_path_EGREP_found=false +# Loop through the user's path and test for each of PROGNAME-LIST +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_executable_p "$ac_path_EGREP"; } || continue + # Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + + $ac_path_EGREP_found && break 3 + done +done + +done +IFS=$as_save_IFS + + +fi + +EGREP="$ac_cv_path_EGREP" +if test -z "$EGREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } +fi + +else + ac_cv_path_EGREP=$EGREP +fi + + + fi fi -echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 -echo "${ECHO_T}$ac_cv_prog_egrep" >&6 - EGREP=$ac_cv_prog_egrep +{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" -# Check whether --with-gnu-ld or --without-gnu-ld was given. +# Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then - withval="$with_gnu_ld" - test "$withval" = no || with_gnu_ld=yes + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no -fi; +fi + ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. - echo "$as_me:$LINENO: checking for ld used by $CC" >&5 -echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw @@ -3334,11 +4046,11 @@ echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 ;; esac elif test "$with_gnu_ld" = yes; then - echo "$as_me:$LINENO: checking for GNU ld" >&5 -echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; } else - echo "$as_me:$LINENO: checking for non-GNU ld" >&5 -echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; } fi if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -3371,17 +4083,17 @@ fi LD="$lt_cv_path_LD" if test -n "$LD"; then - echo "$as_me:$LINENO: result: $LD" >&5 -echo "${ECHO_T}$LD" >&6 + { echo "$as_me:$LINENO: result: $LD" >&5 +echo "${ECHO_T}$LD" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } -echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 -echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; } if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -3395,20 +4107,20 @@ case `$LD -v 2>&1 &5 -echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5 +echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld -echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 -echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 +echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6; } if test "${lt_cv_ld_reload_flag+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_ld_reload_flag='-r' fi -echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 -echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 +echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; @@ -3416,8 +4128,8 @@ case $reload_flag in esac reload_cmds='$LD$reload_flag -o $output$reload_objs' -echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 -echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 +echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6; } if test "${lt_cv_path_NM+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -3458,23 +4170,23 @@ else test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi fi -echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 -echo "${ECHO_T}$lt_cv_path_NM" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 +echo "${ECHO_T}$lt_cv_path_NM" >&6; } NM="$lt_cv_path_NM" -echo "$as_me:$LINENO: checking whether ln -s works" >&5 -echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether ln -s works" >&5 +echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } else - echo "$as_me:$LINENO: result: no, using $LN_S" >&5 -echo "${ECHO_T}no, using $LN_S" >&6 + { echo "$as_me:$LINENO: result: no, using $LN_S" >&5 +echo "${ECHO_T}no, using $LN_S" >&6; } fi -echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5 -echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5 +echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6; } if test "${lt_cv_deplibs_check_method+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -3656,8 +4368,8 @@ sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7* | sysv4*uw2*) esac fi -echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 -echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 +echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6; } file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown @@ -3672,11 +4384,11 @@ LTCC=${LTCC-"$CC"} compiler=$CC -# Check whether --enable-libtool-lock or --disable-libtool-lock was given. +# Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then - enableval="$enable_libtool_lock" + enableval=$enable_libtool_lock; +fi -fi; test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good @@ -3703,7 +4415,7 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 3706 "configure"' > conftest.$ac_ext + echo '#line 4418 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -3788,8 +4500,8 @@ x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" - echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 -echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 +echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6; } if test "${lt_cv_cc_needs_belf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -3815,24 +4527,36 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -3841,9 +4565,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -lt_cv_cc_needs_belf=no + lt_cv_cc_needs_belf=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -3852,8 +4577,8 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi -echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 -echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 +echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" @@ -3870,8 +4595,8 @@ ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 -echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -3905,8 +4630,13 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 @@ -3931,9 +4661,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi + rm -f conftest.err conftest.$ac_ext - # OK, works on sane cases. Now check whether non-existent headers + # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -3943,8 +4674,13 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 @@ -3971,6 +4707,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_preproc_ok=: break fi + rm -f conftest.err conftest.$ac_ext done @@ -3988,8 +4725,8 @@ fi else ac_cv_prog_CPP=$CPP fi -echo "$as_me:$LINENO: result: $CPP" >&5 -echo "${ECHO_T}$CPP" >&6 +{ echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do @@ -4012,8 +4749,13 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 @@ -4038,9 +4780,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi + rm -f conftest.err conftest.$ac_ext - # OK, works on sane cases. Now check whether non-existent headers + # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -4050,8 +4793,13 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 @@ -4078,6 +4826,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_preproc_ok=: break fi + rm -f conftest.err conftest.$ac_ext done @@ -4100,8 +4849,8 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -4125,24 +4874,36 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -4151,9 +4912,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_header_stdc=no + ac_cv_header_stdc=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. @@ -4209,6 +4971,7 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include +#include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) @@ -4228,18 +4991,27 @@ main () for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) - exit(2); - exit (0); + return 2; + return 0; } _ACEOF rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -4252,12 +5024,14 @@ sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi + + fi fi -echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -echo "${ECHO_T}$ac_cv_header_stdc" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF @@ -4280,9 +5054,9 @@ for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF @@ -4296,24 +5070,36 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -4322,12 +5108,14 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_Header=no" + eval "$as_ac_Header=no" fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 @@ -4342,18 +5130,19 @@ done for ac_header in dlfcn.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -4364,24 +5153,36 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -4390,15 +5191,16 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -4407,8 +5209,13 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 @@ -4432,9 +5239,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -4458,25 +5266,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------------ ## -## Report this to the AC_PACKAGE_NAME lists. ## -## ------------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -4488,18 +5290,22 @@ fi done -ac_ext=cc +ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -n "$ac_tool_prefix"; then - for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -4512,36 +5318,38 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then - echo "$as_me:$LINENO: result: $CXX" >&5 -echo "${ECHO_T}$CXX" >&6 + { echo "$as_me:$LINENO: result: $CXX" >&5 +echo "${ECHO_T}$CXX" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX - for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -4554,55 +5362,85 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then - echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 -echo "${ECHO_T}$ac_ct_CXX" >&6 + { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 +echo "${ECHO_T}$ac_ct_CXX" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + test -n "$ac_ct_CXX" && break done -test -n "$ac_ct_CXX" || ac_ct_CXX="g++" - CXX=$ac_ct_CXX + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi fi - + fi +fi # Provide some information about the compiler. -echo "$as_me:$LINENO:" \ - "checking for C++ compiler version" >&5 +echo "$as_me:$LINENO: checking for C++ compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 - (eval $ac_compiler --version &5) 2>&5 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 - (eval $ac_compiler -v &5) 2>&5 +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 - (eval $ac_compiler -V &5) 2>&5 +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } -echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; } if test "${ac_cv_cxx_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -4625,24 +5463,36 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -4651,24 +5501,28 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_compiler_gnu=no + ac_compiler_gnu=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi -echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; } GXX=`test $ac_compiler_gnu = yes && echo yes` ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS -CXXFLAGS="-g" -echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 -echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 +echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cxx_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - cat >conftest.$ac_ext <<_ACEOF + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -4684,24 +5538,36 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -4710,70 +5576,53 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_prog_cxx_g=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -for ac_declaration in \ - '' \ - 'extern "C" void std::exit (int) throw (); using std::exit;' \ - 'extern "C" void std::exit (int); using std::exit;' \ - 'extern "C" void exit (int) throw ();' \ - 'extern "C" void exit (int);' \ - 'void exit (int);' -do - cat >conftest.$ac_ext <<_ACEOF + CXXFLAGS="" + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -$ac_declaration -#include + int main () { -exit (42); + ; return 0; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -4782,62 +5631,92 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -continue -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -$ac_declaration + int main () { -exit (42); + ; return 0; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then - break + ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -rm -f conftest* -if test -n "$ac_declaration"; then - echo '#ifdef __cplusplus' >>confdefs.h - echo $ac_declaration >>confdefs.h - echo '#endif' >>confdefs.h + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -ac_ext=cc +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -4845,8 +5724,8 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu depcc="$CXX" am_compiler_list= -echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 -echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; } if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -4935,8 +5814,8 @@ else fi fi -echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 -echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6 +{ echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type @@ -4952,13 +5831,13 @@ else fi -ac_ext=cc +ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 -echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 +echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6; } if test -z "$CXXCPP"; then if test "${ac_cv_prog_CXXCPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -4988,8 +5867,13 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 @@ -5014,9 +5898,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi + rm -f conftest.err conftest.$ac_ext - # OK, works on sane cases. Now check whether non-existent headers + # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -5026,8 +5911,13 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 @@ -5054,6 +5944,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_preproc_ok=: break fi + rm -f conftest.err conftest.$ac_ext done @@ -5071,8 +5962,8 @@ fi else ac_cv_prog_CXXCPP=$CXXCPP fi -echo "$as_me:$LINENO: result: $CXXCPP" >&5 -echo "${ECHO_T}$CXXCPP" >&6 +{ echo "$as_me:$LINENO: result: $CXXCPP" >&5 +echo "${ECHO_T}$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do @@ -5095,8 +5986,13 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 @@ -5121,9 +6017,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi + rm -f conftest.err conftest.$ac_ext - # OK, works on sane cases. Now check whether non-existent headers + # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -5133,8 +6030,13 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 @@ -5161,6 +6063,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_preproc_ok=: break fi + rm -f conftest.err conftest.$ac_ext done @@ -5176,7 +6079,7 @@ See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi -ac_ext=cc +ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -5188,12 +6091,12 @@ ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test -n "$ac_tool_prefix"; then - for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran + for ac_prog in g77 f77 xlf frt pgf77 cf77 fort77 fl32 af77 f90 xlf90 pgf90 pghpf epcf90 gfortran g95 f95 fort xlf95 ifort ifc efc pgf95 lf95 ftn do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5206,36 +6109,38 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_F77="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi F77=$ac_cv_prog_F77 if test -n "$F77"; then - echo "$as_me:$LINENO: result: $F77" >&5 -echo "${ECHO_T}$F77" >&6 + { echo "$as_me:$LINENO: result: $F77" >&5 +echo "${ECHO_T}$F77" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + test -n "$F77" && break done fi if test -z "$F77"; then ac_ct_F77=$F77 - for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran + for ac_prog in g77 f77 xlf frt pgf77 cf77 fort77 fl32 af77 f90 xlf90 pgf90 pghpf epcf90 gfortran g95 f95 fort xlf95 ifort ifc efc pgf95 lf95 ftn do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5248,48 +6153,78 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_F77="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi ac_ct_F77=$ac_cv_prog_ac_ct_F77 if test -n "$ac_ct_F77"; then - echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 -echo "${ECHO_T}$ac_ct_F77" >&6 + { echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 +echo "${ECHO_T}$ac_ct_F77" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + test -n "$ac_ct_F77" && break done - F77=$ac_ct_F77 + if test "x$ac_ct_F77" = x; then + F77="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + F77=$ac_ct_F77 + fi fi # Provide some information about the compiler. -echo "$as_me:5278:" \ - "checking for Fortran 77 compiler version" >&5 +echo "$as_me:$LINENO: checking for Fortran 77 compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 - (eval $ac_compiler --version &5) 2>&5 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 - (eval $ac_compiler -v &5) 2>&5 +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 - (eval $ac_compiler -V &5) 2>&5 +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } @@ -5299,8 +6234,8 @@ rm -f a.out # input file. (Note that this only needs to work for GNU compilers.) ac_save_ext=$ac_ext ac_ext=F -echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6; } if test "${ac_cv_f77_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5313,24 +6248,36 @@ else end _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_f77_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -5339,20 +6286,21 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_compiler_gnu=no + ac_compiler_gnu=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_f77_compiler_gnu=$ac_compiler_gnu fi -echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6; } ac_ext=$ac_save_ext ac_test_FFLAGS=${FFLAGS+set} ac_save_FFLAGS=$FFLAGS FFLAGS= -echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 -echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 +echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_f77_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5363,24 +6311,36 @@ cat >conftest.$ac_ext <<_ACEOF end _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_f77_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -5389,13 +6349,14 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_prog_f77_g=no + ac_cv_prog_f77_g=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 -echo "${ECHO_T}$ac_cv_prog_f77_g" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 +echo "${ECHO_T}$ac_cv_prog_f77_g" >&6; } if test "$ac_test_FFLAGS" = set; then FFLAGS=$ac_save_FFLAGS elif test $ac_cv_prog_f77_g = yes; then @@ -5424,8 +6385,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! # find the maximum length of command line arguments -echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 -echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 +echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6; } if test "${lt_cv_sys_max_cmd_len+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5489,19 +6450,19 @@ else fi if test -n $lt_cv_sys_max_cmd_len ; then - echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 -echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6 + { echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 +echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6; } else - echo "$as_me:$LINENO: result: none" >&5 -echo "${ECHO_T}none" >&6 + { echo "$as_me:$LINENO: result: none" >&5 +echo "${ECHO_T}none" >&6; } fi # Check for command to grab the raw symbol name followed by C symbol from nm. -echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 -echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 +echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6; } if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5689,15 +6650,15 @@ if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - echo "$as_me:$LINENO: result: failed" >&5 -echo "${ECHO_T}failed" >&6 + { echo "$as_me:$LINENO: result: failed" >&5 +echo "${ECHO_T}failed" >&6; } else - echo "$as_me:$LINENO: result: ok" >&5 -echo "${ECHO_T}ok" >&6 + { echo "$as_me:$LINENO: result: ok" >&5 +echo "${ECHO_T}ok" >&6; } fi -echo "$as_me:$LINENO: checking for objdir" >&5 -echo $ECHO_N "checking for objdir... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for objdir" >&5 +echo $ECHO_N "checking for objdir... $ECHO_C" >&6; } if test "${lt_cv_objdir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5711,8 +6672,8 @@ else fi rmdir .libs 2>/dev/null fi -echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 -echo "${ECHO_T}$lt_cv_objdir" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 +echo "${ECHO_T}$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir @@ -5763,8 +6724,8 @@ with_gnu_ld="$lt_cv_prog_gnu_ld" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5777,32 +6738,34 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AR="${ac_tool_prefix}ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then - echo "$as_me:$LINENO: result: $AR" >&5 -echo "${ECHO_T}$AR" >&6 + { echo "$as_me:$LINENO: result: $AR" >&5 +echo "${ECHO_T}$AR" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5815,27 +6778,41 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AR="ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS - test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false" fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then - echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 -echo "${ECHO_T}$ac_ct_AR" >&6 + { echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 +echo "${ECHO_T}$ac_ct_AR" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi - AR=$ac_ct_AR + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi else AR="$ac_cv_prog_AR" fi @@ -5843,8 +6820,8 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5857,32 +6834,34 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then - echo "$as_me:$LINENO: result: $RANLIB" >&5 -echo "${ECHO_T}$RANLIB" >&6 + { echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5895,27 +6874,41 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS - test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then - echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 -echo "${ECHO_T}$ac_ct_RANLIB" >&6 + { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi - RANLIB=$ac_ct_RANLIB + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi else RANLIB="$ac_cv_prog_RANLIB" fi @@ -5923,8 +6916,8 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5937,32 +6930,34 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - echo "$as_me:$LINENO: result: $STRIP" >&5 -echo "${ECHO_T}$STRIP" >&6 + { echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5975,27 +6970,41 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS - test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 -echo "${ECHO_T}$ac_ct_STRIP" >&6 + { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +echo "${ECHO_T}$ac_ct_STRIP" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi - STRIP=$ac_ct_STRIP + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi else STRIP="$ac_cv_prog_STRIP" fi @@ -6042,8 +7051,8 @@ fi case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then - echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 -echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 +echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6; } if test "${lt_cv_path_MAGIC_CMD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -6095,17 +7104,17 @@ fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then - echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 -echo "${ECHO_T}$MAGIC_CMD" >&6 + { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +echo "${ECHO_T}$MAGIC_CMD" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then - echo "$as_me:$LINENO: checking for file" >&5 -echo $ECHO_N "checking for file... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for file" >&5 +echo $ECHO_N "checking for file... $ECHO_C" >&6; } if test "${lt_cv_path_MAGIC_CMD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -6157,11 +7166,11 @@ fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then - echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 -echo "${ECHO_T}$MAGIC_CMD" >&6 + { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +echo "${ECHO_T}$MAGIC_CMD" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi else @@ -6176,21 +7185,21 @@ esac enable_dlopen=no enable_win32_dll=no -# Check whether --enable-libtool-lock or --disable-libtool-lock was given. +# Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then - enableval="$enable_libtool_lock" + enableval=$enable_libtool_lock; +fi -fi; test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes -# Check whether --with-pic or --without-pic was given. +# Check whether --with-pic was given. if test "${with_pic+set}" = set; then - withval="$with_pic" - pic_mode="$withval" + withval=$with_pic; pic_mode="$withval" else pic_mode=default -fi; +fi + test -z "$pic_mode" && pic_mode=default # Use C for the default configuration in the libtool script @@ -6250,8 +7259,8 @@ fi # # Check to make sure the static flag actually works. # -echo "$as_me:$LINENO: checking if $compiler static flag $lt_prog_compiler_static works" >&5 -echo $ECHO_N "checking if $compiler static flag $lt_prog_compiler_static works... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_prog_compiler_static works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_prog_compiler_static works... $ECHO_C" >&6; } if test "${lt_prog_compiler_static_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -6273,8 +7282,8 @@ else LDFLAGS="$save_LDFLAGS" fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 -echo "${ECHO_T}$lt_prog_compiler_static_works" >&6 +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 +echo "${ECHO_T}$lt_prog_compiler_static_works" >&6; } if test x"$lt_prog_compiler_static_works" = xyes; then : @@ -6291,8 +7300,8 @@ if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' -echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -6309,11 +7318,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6312: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7321: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:6316: \$? = $ac_status" >&5 + echo "$as_me:7325: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -6324,8 +7333,8 @@ else $rm conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" @@ -6339,8 +7348,8 @@ lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= -echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' @@ -6516,16 +7525,16 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 esac fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic" >&6 +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then -echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6; } if test "${lt_prog_compiler_pic_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -6542,11 +7551,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6545: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7554: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:6549: \$? = $ac_status" >&5 + echo "$as_me:7558: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -6557,8 +7566,8 @@ else $rm conftest* fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6 +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6; } if test x"$lt_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in @@ -6581,8 +7590,8 @@ case "$host_os" in ;; esac -echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_c_o+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -6602,11 +7611,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6605: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7614: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:6609: \$? = $ac_status" >&5 + echo "$as_me:7618: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -6626,23 +7635,23 @@ else $rm conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user - echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no - echo "$as_me:$LINENO: result: $hard_links" >&5 -echo "${ECHO_T}$hard_links" >&6 + { echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6; } if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} @@ -6652,8 +7661,8 @@ else need_locks=no fi -echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } runpath_var= allow_undefined_flag= @@ -6985,24 +7994,36 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -7016,8 +8037,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi @@ -7046,24 +8069,36 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -7077,8 +8112,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi @@ -7500,8 +8537,8 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi esac fi -echo "$as_me:$LINENO: result: $ld_shlibs" >&5 -echo "${ECHO_T}$ld_shlibs" >&6 +{ echo "$as_me:$LINENO: result: $ld_shlibs" >&5 +echo "${ECHO_T}$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" @@ -7526,8 +8563,8 @@ x|xyes) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. - echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext @@ -7563,16 +8600,16 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& cat conftest.err 1>&5 fi $rm conftest* - echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 -echo "${ECHO_T}$archive_cmds_need_lc" >&6 + { echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 +echo "${ECHO_T}$archive_cmds_need_lc" >&6; } ;; esac fi ;; esac -echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } library_names_spec= libname_spec='lib$name' soname_spec= @@ -8111,12 +9148,12 @@ uts4*) dynamic_linker=no ;; esac -echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -echo "${ECHO_T}$dynamic_linker" >&6 +{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no -echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || \ test -n "$runpath_var " || \ @@ -8140,8 +9177,8 @@ else # directories. hardcode_action=unsupported fi -echo "$as_me:$LINENO: result: $hardcode_action" >&5 -echo "${ECHO_T}$hardcode_action" >&6 +{ echo "$as_me:$LINENO: result: $hardcode_action" >&5 +echo "${ECHO_T}$hardcode_action" >&6; } if test "$hardcode_action" = relink; then # Fast installation is not supported @@ -8154,29 +9191,29 @@ fi striplib= old_striplib= -echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi ;; *) - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } ;; esac fi @@ -8208,8 +9245,8 @@ else darwin*) # if libdl is installed we need to link against it - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -8222,40 +9259,52 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -8264,14 +9313,15 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_dl_dlopen=no + ac_cv_lib_dl_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else @@ -8285,8 +9335,8 @@ fi ;; *) - echo "$as_me:$LINENO: checking for shl_load" >&5 -echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for shl_load" >&5 +echo $ECHO_N "checking for shl_load... $ECHO_C" >&6; } if test "${ac_cv_func_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -8313,53 +9363,59 @@ cat >>conftest.$ac_ext <<_ACEOF #undef shl_load -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char shl_load (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_shl_load) || defined (__stub___shl_load) +#if defined __stub_shl_load || defined __stub___shl_load choke me -#else -char (*f) () = shl_load; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != shl_load; +return shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -8368,18 +9424,19 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_func_shl_load=no + ac_cv_func_shl_load=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 -echo "${ECHO_T}$ac_cv_func_shl_load" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +echo "${ECHO_T}$ac_cv_func_shl_load" >&6; } if test $ac_cv_func_shl_load = yes; then lt_cv_dlopen="shl_load" else - echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 -echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6; } if test "${ac_cv_lib_dld_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -8392,40 +9449,52 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char shl_load (); int main () { -shl_load (); +return shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -8434,19 +9503,20 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_dld_shl_load=no + ac_cv_lib_dld_shl_load=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6; } if test $ac_cv_lib_dld_shl_load = yes; then lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else - echo "$as_me:$LINENO: checking for dlopen" >&5 -echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for dlopen" >&5 +echo $ECHO_N "checking for dlopen... $ECHO_C" >&6; } if test "${ac_cv_func_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -8473,53 +9543,59 @@ cat >>conftest.$ac_ext <<_ACEOF #undef dlopen -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_dlopen) || defined (__stub___dlopen) +#if defined __stub_dlopen || defined __stub___dlopen choke me -#else -char (*f) () = dlopen; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != dlopen; +return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -8528,18 +9604,19 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_func_dlopen=no + ac_cv_func_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 -echo "${ECHO_T}$ac_cv_func_dlopen" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +echo "${ECHO_T}$ac_cv_func_dlopen" >&6; } if test $ac_cv_func_dlopen = yes; then lt_cv_dlopen="dlopen" else - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -8552,40 +9629,52 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -8594,19 +9683,20 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_dl_dlopen=no + ac_cv_lib_dl_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else - echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 -echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6; } if test "${ac_cv_lib_svld_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -8619,40 +9709,52 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -8661,19 +9763,20 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_svld_dlopen=no + ac_cv_lib_svld_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6; } if test $ac_cv_lib_svld_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else - echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 -echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6; } if test "${ac_cv_lib_dld_dld_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -8686,40 +9789,52 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dld_link (); int main () { -dld_link (); +return dld_link (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -8728,14 +9843,15 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_dld_dld_link=no + ac_cv_lib_dld_dld_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6; } if test $ac_cv_lib_dld_dld_link = yes; then lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi @@ -8775,8 +9891,8 @@ fi save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" - echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 -echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6; } if test "${lt_cv_dlopen_self+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -8786,7 +9902,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <&5 -echo "${ECHO_T}$lt_cv_dlopen_self" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" - echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 -echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6; } if test "${lt_cv_dlopen_self_static+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -8884,7 +10000,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <&5 -echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" @@ -8989,13 +10105,13 @@ fi # Report which librarie types wil actually be built -echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 -echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 -echo "$as_me:$LINENO: result: $can_build_shared" >&5 -echo "${ECHO_T}$can_build_shared" >&6 +{ echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6; } +{ echo "$as_me:$LINENO: result: $can_build_shared" >&5 +echo "${ECHO_T}$can_build_shared" >&6; } -echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 -echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and @@ -9052,15 +10168,15 @@ aix4* | aix5*) fi ;; esac -echo "$as_me:$LINENO: result: $enable_shared" >&5 -echo "${ECHO_T}$enable_shared" >&6 +{ echo "$as_me:$LINENO: result: $enable_shared" >&5 +echo "${ECHO_T}$enable_shared" >&6; } -echo "$as_me:$LINENO: checking whether to build static libraries" >&5 -echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes -echo "$as_me:$LINENO: result: $enable_static" >&5 -echo "${ECHO_T}$enable_static" >&6 +{ echo "$as_me:$LINENO: result: $enable_static" >&5 +echo "${ECHO_T}$enable_static" >&6; } # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh @@ -9543,11 +10659,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" -# Check whether --with-tags or --without-tags was given. +# Check whether --with-tags was given. if test "${with_tags+set}" = set; then - withval="$with_tags" - tagnames="$withval" -fi; + withval=$with_tags; tagnames="$withval" +fi + if test -f "$ltmain" && test -n "$tagnames"; then if test ! -f "${ofile}"; then @@ -9596,7 +10712,7 @@ echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} case $tagname in CXX) if test -n "$CXX" && test "X$CXX" != "Xno"; then - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -9688,18 +10804,18 @@ if test "$GXX" = yes; then # Set up default GNU C++ configuration -# Check whether --with-gnu-ld or --without-gnu-ld was given. +# Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then - withval="$with_gnu_ld" - test "$withval" = no || with_gnu_ld=yes + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no -fi; +fi + ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. - echo "$as_me:$LINENO: checking for ld used by $CC" >&5 -echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw @@ -9728,11 +10844,11 @@ echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 ;; esac elif test "$with_gnu_ld" = yes; then - echo "$as_me:$LINENO: checking for GNU ld" >&5 -echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; } else - echo "$as_me:$LINENO: checking for non-GNU ld" >&5 -echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; } fi if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -9765,17 +10881,17 @@ fi LD="$lt_cv_path_LD" if test -n "$LD"; then - echo "$as_me:$LINENO: result: $LD" >&5 -echo "${ECHO_T}$LD" >&6 + { echo "$as_me:$LINENO: result: $LD" >&5 +echo "${ECHO_T}$LD" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } -echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 -echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; } if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -9789,8 +10905,8 @@ case `$LD -v 2>&1 &5 -echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5 +echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld @@ -9840,8 +10956,8 @@ else fi # PORTME: fill in a description of your system's C++ link characteristics -echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) @@ -9948,24 +11064,36 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -9979,8 +11107,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi @@ -10010,24 +11140,36 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -10041,8 +11183,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi @@ -10668,8 +11812,8 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ld_shlibs_CXX=no ;; esac -echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 -echo "${ECHO_T}$ld_shlibs_CXX" >&6 +{ echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +echo "${ECHO_T}$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" @@ -10785,8 +11929,8 @@ lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= -echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then @@ -11037,16 +12181,16 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 esac fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6 +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then -echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6; } if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -11063,11 +12207,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:11066: $lt_compile\"" >&5) + (eval echo "\"\$as_me:12210: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:11070: \$? = $ac_status" >&5 + echo "$as_me:12214: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -11078,8 +12222,8 @@ else $rm conftest* fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6 +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in @@ -11102,8 +12246,8 @@ case "$host_os" in ;; esac -echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -11123,11 +12267,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:11126: $lt_compile\"" >&5) + (eval echo "\"\$as_me:12270: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:11130: \$? = $ac_status" >&5 + echo "$as_me:12274: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -11147,23 +12291,23 @@ else $rm conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user - echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no - echo "$as_me:$LINENO: result: $hard_links" >&5 -echo "${ECHO_T}$hard_links" >&6 + { echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6; } if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} @@ -11173,8 +12317,8 @@ else need_locks=no fi -echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in @@ -11198,8 +12342,8 @@ echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared librar ;; esac -echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 -echo "${ECHO_T}$ld_shlibs_CXX" >&6 +{ echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +echo "${ECHO_T}$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" @@ -11224,8 +12368,8 @@ x|xyes) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. - echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext @@ -11261,16 +12405,16 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& cat conftest.err 1>&5 fi $rm conftest* - echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 -echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6 + { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 +echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6; } ;; esac fi ;; esac -echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } library_names_spec= libname_spec='lib$name' soname_spec= @@ -11809,12 +12953,12 @@ uts4*) dynamic_linker=no ;; esac -echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -echo "${ECHO_T}$dynamic_linker" >&6 +{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no -echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || \ test -n "$runpath_var CXX" || \ @@ -11838,8 +12982,8 @@ else # directories. hardcode_action_CXX=unsupported fi -echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 -echo "${ECHO_T}$hardcode_action_CXX" >&6 +{ echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 +echo "${ECHO_T}$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink; then # Fast installation is not supported @@ -11852,29 +12996,29 @@ fi striplib= old_striplib= -echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi ;; *) - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } ;; esac fi @@ -11906,8 +13050,8 @@ else darwin*) # if libdl is installed we need to link against it - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -11920,40 +13064,52 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -11962,14 +13118,15 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_dl_dlopen=no + ac_cv_lib_dl_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else @@ -11983,8 +13140,8 @@ fi ;; *) - echo "$as_me:$LINENO: checking for shl_load" >&5 -echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for shl_load" >&5 +echo $ECHO_N "checking for shl_load... $ECHO_C" >&6; } if test "${ac_cv_func_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -12011,53 +13168,59 @@ cat >>conftest.$ac_ext <<_ACEOF #undef shl_load -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char shl_load (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_shl_load) || defined (__stub___shl_load) +#if defined __stub_shl_load || defined __stub___shl_load choke me -#else -char (*f) () = shl_load; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != shl_load; +return shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -12066,18 +13229,19 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_func_shl_load=no + ac_cv_func_shl_load=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 -echo "${ECHO_T}$ac_cv_func_shl_load" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +echo "${ECHO_T}$ac_cv_func_shl_load" >&6; } if test $ac_cv_func_shl_load = yes; then lt_cv_dlopen="shl_load" else - echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 -echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6; } if test "${ac_cv_lib_dld_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -12090,40 +13254,52 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char shl_load (); int main () { -shl_load (); +return shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -12132,19 +13308,20 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_dld_shl_load=no + ac_cv_lib_dld_shl_load=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6; } if test $ac_cv_lib_dld_shl_load = yes; then lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else - echo "$as_me:$LINENO: checking for dlopen" >&5 -echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for dlopen" >&5 +echo $ECHO_N "checking for dlopen... $ECHO_C" >&6; } if test "${ac_cv_func_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -12171,53 +13348,59 @@ cat >>conftest.$ac_ext <<_ACEOF #undef dlopen -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_dlopen) || defined (__stub___dlopen) +#if defined __stub_dlopen || defined __stub___dlopen choke me -#else -char (*f) () = dlopen; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != dlopen; +return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -12226,18 +13409,19 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_func_dlopen=no + ac_cv_func_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 -echo "${ECHO_T}$ac_cv_func_dlopen" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +echo "${ECHO_T}$ac_cv_func_dlopen" >&6; } if test $ac_cv_func_dlopen = yes; then lt_cv_dlopen="dlopen" else - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -12250,40 +13434,52 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -12292,19 +13488,20 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_dl_dlopen=no + ac_cv_lib_dl_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else - echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 -echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6; } if test "${ac_cv_lib_svld_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -12317,40 +13514,52 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -12359,19 +13568,20 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_svld_dlopen=no + ac_cv_lib_svld_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6; } if test $ac_cv_lib_svld_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else - echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 -echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6; } if test "${ac_cv_lib_dld_dld_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -12384,40 +13594,52 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dld_link (); int main () { -dld_link (); +return dld_link (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -12426,14 +13648,15 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_dld_dld_link=no + ac_cv_lib_dld_dld_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6; } if test $ac_cv_lib_dld_dld_link = yes; then lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi @@ -12473,8 +13696,8 @@ fi save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" - echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 -echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6; } if test "${lt_cv_dlopen_self+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -12484,7 +13707,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <&5 -echo "${ECHO_T}$lt_cv_dlopen_self" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" - echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 -echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6; } if test "${lt_cv_dlopen_self_static+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -12582,7 +13805,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <&5 -echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" @@ -13164,13 +14387,13 @@ compiler=$CC compiler_F77=$CC cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` -echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 -echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 -echo "$as_me:$LINENO: result: $can_build_shared" >&5 -echo "${ECHO_T}$can_build_shared" >&6 +{ echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6; } +{ echo "$as_me:$LINENO: result: $can_build_shared" >&5 +echo "${ECHO_T}$can_build_shared" >&6; } -echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 -echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and @@ -13187,15 +14410,15 @@ aix4* | aix5*) test "$enable_shared" = yes && enable_static=no ;; esac -echo "$as_me:$LINENO: result: $enable_shared" >&5 -echo "${ECHO_T}$enable_shared" >&6 +{ echo "$as_me:$LINENO: result: $enable_shared" >&5 +echo "${ECHO_T}$enable_shared" >&6; } -echo "$as_me:$LINENO: checking whether to build static libraries" >&5 -echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes -echo "$as_me:$LINENO: result: $enable_static" >&5 -echo "${ECHO_T}$enable_static" >&6 +{ echo "$as_me:$LINENO: result: $enable_static" >&5 +echo "${ECHO_T}$enable_static" >&6; } test "$ld_shlibs_F77" = no && can_build_shared=no @@ -13206,8 +14429,8 @@ lt_prog_compiler_wl_F77= lt_prog_compiler_pic_F77= lt_prog_compiler_static_F77= -echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl_F77='-Wl,' @@ -13383,16 +14606,16 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 esac fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6 +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_F77"; then -echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6; } if test "${lt_prog_compiler_pic_works_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -13409,11 +14632,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:13412: $lt_compile\"" >&5) + (eval echo "\"\$as_me:14635: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:13416: \$? = $ac_status" >&5 + echo "$as_me:14639: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -13424,8 +14647,8 @@ else $rm conftest* fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6 +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6; } if test x"$lt_prog_compiler_pic_works_F77" = xyes; then case $lt_prog_compiler_pic_F77 in @@ -13448,8 +14671,8 @@ case "$host_os" in ;; esac -echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -13469,11 +14692,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:13472: $lt_compile\"" >&5) + (eval echo "\"\$as_me:14695: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:13476: \$? = $ac_status" >&5 + echo "$as_me:14699: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -13493,23 +14716,23 @@ else $rm conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user - echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no - echo "$as_me:$LINENO: result: $hard_links" >&5 -echo "${ECHO_T}$hard_links" >&6 + { echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6; } if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} @@ -13519,8 +14742,8 @@ else need_locks=no fi -echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } runpath_var= allow_undefined_flag_F77= @@ -13842,24 +15065,36 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_f77_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -13873,8 +15108,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi @@ -13893,24 +15130,36 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_f77_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -13924,8 +15173,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi @@ -14347,8 +15598,8 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi esac fi -echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 -echo "${ECHO_T}$ld_shlibs_F77" >&6 +{ echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 +echo "${ECHO_T}$ld_shlibs_F77" >&6; } test "$ld_shlibs_F77" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" @@ -14373,8 +15624,8 @@ x|xyes) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. - echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext @@ -14410,16 +15661,16 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& cat conftest.err 1>&5 fi $rm conftest* - echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 -echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6 + { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 +echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6; } ;; esac fi ;; esac -echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } library_names_spec= libname_spec='lib$name' soname_spec= @@ -14958,12 +16209,12 @@ uts4*) dynamic_linker=no ;; esac -echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -echo "${ECHO_T}$dynamic_linker" >&6 +{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no -echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } hardcode_action_F77= if test -n "$hardcode_libdir_flag_spec_F77" || \ test -n "$runpath_var F77" || \ @@ -14987,8 +16238,8 @@ else # directories. hardcode_action_F77=unsupported fi -echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 -echo "${ECHO_T}$hardcode_action_F77" >&6 +{ echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 +echo "${ECHO_T}$hardcode_action_F77" >&6; } if test "$hardcode_action_F77" = relink; then # Fast installation is not supported @@ -15001,29 +16252,29 @@ fi striplib= old_striplib= -echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi ;; *) - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } ;; esac fi @@ -15446,7 +16697,6 @@ CC="$lt_save_CC" if test -n "$GCJ" && test "X$GCJ" != "Xno"; then - # Source file extension for Java test sources. ac_ext=java @@ -15485,8 +16735,8 @@ if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' -echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -15503,11 +16753,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15506: $lt_compile\"" >&5) + (eval echo "\"\$as_me:16756: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:15510: \$? = $ac_status" >&5 + echo "$as_me:16760: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -15518,8 +16768,8 @@ else $rm conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" @@ -15533,8 +16783,8 @@ lt_prog_compiler_wl_GCJ= lt_prog_compiler_pic_GCJ= lt_prog_compiler_static_GCJ= -echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl_GCJ='-Wl,' @@ -15710,16 +16960,16 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 esac fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6 +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_GCJ"; then -echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6; } if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -15736,11 +16986,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15739: $lt_compile\"" >&5) + (eval echo "\"\$as_me:16989: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:15743: \$? = $ac_status" >&5 + echo "$as_me:16993: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -15751,8 +17001,8 @@ else $rm conftest* fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6 +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6; } if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then case $lt_prog_compiler_pic_GCJ in @@ -15775,8 +17025,8 @@ case "$host_os" in ;; esac -echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -15796,11 +17046,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15799: $lt_compile\"" >&5) + (eval echo "\"\$as_me:17049: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:15803: \$? = $ac_status" >&5 + echo "$as_me:17053: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -15820,23 +17070,23 @@ else $rm conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user - echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no - echo "$as_me:$LINENO: result: $hard_links" >&5 -echo "${ECHO_T}$hard_links" >&6 + { echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6; } if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} @@ -15846,8 +17096,8 @@ else need_locks=no fi -echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } runpath_var= allow_undefined_flag_GCJ= @@ -16179,24 +17429,36 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -16210,8 +17472,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi @@ -16240,24 +17504,36 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -16271,8 +17547,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi @@ -16694,8 +17972,8 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi esac fi -echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 -echo "${ECHO_T}$ld_shlibs_GCJ" >&6 +{ echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 +echo "${ECHO_T}$ld_shlibs_GCJ" >&6; } test "$ld_shlibs_GCJ" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" @@ -16720,8 +17998,8 @@ x|xyes) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. - echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext @@ -16757,16 +18035,16 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& cat conftest.err 1>&5 fi $rm conftest* - echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 -echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6 + { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 +echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6; } ;; esac fi ;; esac -echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } library_names_spec= libname_spec='lib$name' soname_spec= @@ -17305,12 +18583,12 @@ uts4*) dynamic_linker=no ;; esac -echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -echo "${ECHO_T}$dynamic_linker" >&6 +{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no -echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } hardcode_action_GCJ= if test -n "$hardcode_libdir_flag_spec_GCJ" || \ test -n "$runpath_var GCJ" || \ @@ -17334,8 +18612,8 @@ else # directories. hardcode_action_GCJ=unsupported fi -echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 -echo "${ECHO_T}$hardcode_action_GCJ" >&6 +{ echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 +echo "${ECHO_T}$hardcode_action_GCJ" >&6; } if test "$hardcode_action_GCJ" = relink; then # Fast installation is not supported @@ -17348,29 +18626,29 @@ fi striplib= old_striplib= -echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi ;; *) - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } ;; esac fi @@ -17402,8 +18680,8 @@ else darwin*) # if libdl is installed we need to link against it - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -17416,40 +18694,52 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -17458,14 +18748,15 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_dl_dlopen=no + ac_cv_lib_dl_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else @@ -17479,8 +18770,8 @@ fi ;; *) - echo "$as_me:$LINENO: checking for shl_load" >&5 -echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for shl_load" >&5 +echo $ECHO_N "checking for shl_load... $ECHO_C" >&6; } if test "${ac_cv_func_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -17507,53 +18798,59 @@ cat >>conftest.$ac_ext <<_ACEOF #undef shl_load -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char shl_load (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_shl_load) || defined (__stub___shl_load) +#if defined __stub_shl_load || defined __stub___shl_load choke me -#else -char (*f) () = shl_load; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != shl_load; +return shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -17562,18 +18859,19 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_func_shl_load=no + ac_cv_func_shl_load=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 -echo "${ECHO_T}$ac_cv_func_shl_load" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +echo "${ECHO_T}$ac_cv_func_shl_load" >&6; } if test $ac_cv_func_shl_load = yes; then lt_cv_dlopen="shl_load" else - echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 -echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6; } if test "${ac_cv_lib_dld_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -17586,40 +18884,52 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char shl_load (); int main () { -shl_load (); +return shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -17628,19 +18938,20 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_dld_shl_load=no + ac_cv_lib_dld_shl_load=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6; } if test $ac_cv_lib_dld_shl_load = yes; then lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else - echo "$as_me:$LINENO: checking for dlopen" >&5 -echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for dlopen" >&5 +echo $ECHO_N "checking for dlopen... $ECHO_C" >&6; } if test "${ac_cv_func_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -17667,53 +18978,59 @@ cat >>conftest.$ac_ext <<_ACEOF #undef dlopen -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_dlopen) || defined (__stub___dlopen) +#if defined __stub_dlopen || defined __stub___dlopen choke me -#else -char (*f) () = dlopen; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != dlopen; +return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -17722,18 +19039,19 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_func_dlopen=no + ac_cv_func_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 -echo "${ECHO_T}$ac_cv_func_dlopen" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +echo "${ECHO_T}$ac_cv_func_dlopen" >&6; } if test $ac_cv_func_dlopen = yes; then lt_cv_dlopen="dlopen" else - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -17746,40 +19064,52 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -17788,19 +19118,20 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_dl_dlopen=no + ac_cv_lib_dl_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else - echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 -echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6; } if test "${ac_cv_lib_svld_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -17813,40 +19144,52 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -17855,19 +19198,20 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_svld_dlopen=no + ac_cv_lib_svld_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6; } if test $ac_cv_lib_svld_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else - echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 -echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6; } if test "${ac_cv_lib_dld_dld_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -17880,40 +19224,52 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dld_link (); int main () { -dld_link (); +return dld_link (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -17922,14 +19278,15 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_dld_dld_link=no + ac_cv_lib_dld_dld_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6; } if test $ac_cv_lib_dld_dld_link = yes; then lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi @@ -17969,8 +19326,8 @@ fi save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" - echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 -echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6; } if test "${lt_cv_dlopen_self+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -17980,7 +19337,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <&5 -echo "${ECHO_T}$lt_cv_dlopen_self" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" - echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 -echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6; } if test "${lt_cv_dlopen_self_static+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -18078,7 +19435,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <&5 -echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" @@ -18597,7 +19954,6 @@ CC="$lt_save_CC" RC) - # Source file extension for RC test sources. ac_ext=rc @@ -19093,18 +20449,18 @@ LIBTOOL='$(SHELL) $(top_builddir)/libtool' -# Check whether --enable-autoconf or --disable-autoconf was given. +# Check whether --enable-autoconf was given. if test "${enable_autoconf+set}" = set; then - enableval="$enable_autoconf" - enable_autoconf=$enableval + enableval=$enable_autoconf; enable_autoconf=$enableval else enable_autoconf=yes -fi; +fi + # Extract the first word of "autoconf", so it can be a program name with args. set dummy autoconf; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_AUTOCONF+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -19119,32 +20475,33 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_AUTOCONF="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS test -z "$ac_cv_path_AUTOCONF" && ac_cv_path_AUTOCONF="@echo autoconf not available" ;; esac fi AUTOCONF=$ac_cv_path_AUTOCONF - if test -n "$AUTOCONF"; then - echo "$as_me:$LINENO: result: $AUTOCONF" >&5 -echo "${ECHO_T}$AUTOCONF" >&6 + { echo "$as_me:$LINENO: result: $AUTOCONF" >&5 +echo "${ECHO_T}$AUTOCONF" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + # Extract the first word of "autoheader", so it can be a program name with args. set dummy autoheader; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_AUTOHEADER+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -19159,28 +20516,29 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_AUTOHEADER="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS test -z "$ac_cv_path_AUTOHEADER" && ac_cv_path_AUTOHEADER="@echo autoheader not available" ;; esac fi AUTOHEADER=$ac_cv_path_AUTOHEADER - if test -n "$AUTOHEADER"; then - echo "$as_me:$LINENO: result: $AUTOHEADER" >&5 -echo "${ECHO_T}$AUTOHEADER" >&6 + { echo "$as_me:$LINENO: result: $AUTOHEADER" >&5 +echo "${ECHO_T}$AUTOHEADER" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + if test -z "$AUTOCONF"; then enable_autoconf=no ; fi if test -z "$AUTOHEADER"; then enable_autoconf=no ; fi if test x$enable_autoconf = xyes; then @@ -19196,8 +20554,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -19210,32 +20568,34 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -19248,36 +20608,51 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 + { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -19290,74 +20665,34 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi - CC=$ac_ct_CC -else - CC="$ac_cv_prog_CC" -fi + fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -19371,7 +20706,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue @@ -19382,6 +20717,7 @@ do fi done done +IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. @@ -19399,22 +20735,23 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then - for ac_prog in cl + for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -19427,36 +20764,38 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC - for ac_prog in cl + for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -19469,29 +20808,45 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 + { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + test -n "$ac_ct_CC" && break done - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi fi fi @@ -19504,27 +20859,41 @@ See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. -echo "$as_me:$LINENO:" \ - "checking for C compiler version" >&5 +echo "$as_me:$LINENO: checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 - (eval $ac_compiler --version &5) 2>&5 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 - (eval $ac_compiler -v &5) 2>&5 +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 - (eval $ac_compiler -V &5) 2>&5 +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } -echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -19547,24 +20916,36 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -19573,24 +20954,28 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_compiler_gnu=no + ac_compiler_gnu=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS -CFLAGS="-g" -echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 -echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - cat >conftest.$ac_ext <<_ACEOF + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -19606,24 +20991,147 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -19632,12 +21140,20 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_prog_cc_g=no + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag fi -echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then @@ -19653,12 +21169,12 @@ else CFLAGS= fi fi -echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 -echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 -if test "${ac_cv_prog_cc_stdc+set}" = set; then +{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - ac_cv_prog_cc_stdc=no + ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -19692,12 +21208,17 @@ static char *f (char * (*g) (char **, int), char **p, ...) /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std1 is added to get + as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std1. */ + that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; @@ -19712,205 +21233,74 @@ return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; return 0; } _ACEOF -# Don't try gcc -ansi; that turns off useful extensions and -# breaks some systems' header files. -# AIX -qlanglvl=ansi -# Ultrix and OSF/1 -std1 -# HP-UX 10.20 and later -Ae -# HP-UX older versions -Aa -D_HPUX_SOURCE -# SVR4 -Xc -D__EXTENSIONS__ -for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then - ac_cv_prog_cc_stdc=$ac_arg -break + ac_cv_prog_cc_c89=$ac_arg else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext + +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break done -rm -f conftest.$ac_ext conftest.$ac_objext +rm -f conftest.$ac_ext CC=$ac_save_CC fi - -case "x$ac_cv_prog_cc_stdc" in - x|xno) - echo "$as_me:$LINENO: result: none needed" >&5 -echo "${ECHO_T}none needed" >&6 ;; +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6; } ;; + xno) + { echo "$as_me:$LINENO: result: unsupported" >&5 +echo "${ECHO_T}unsupported" >&6; } ;; *) - echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 - CC="$CC $ac_cv_prog_cc_stdc" ;; + CC="$CC $ac_cv_prog_cc_c89" + { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; esac -# Some people use a C++ compiler to compile C. Since we use `exit', -# in C++ we need to declare it. In case someone uses the same compiler -# for both compiling C and C++ we need to have the C++ compiler decide -# the declaration of exit, since it's the most demanding environment. -cat >conftest.$ac_ext <<_ACEOF -#ifndef __cplusplus - choke me -#endif -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - for ac_declaration in \ - '' \ - 'extern "C" void std::exit (int) throw (); using std::exit;' \ - 'extern "C" void std::exit (int); using std::exit;' \ - 'extern "C" void exit (int) throw ();' \ - 'extern "C" void exit (int);' \ - 'void exit (int);' -do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -#include -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -continue -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -rm -f conftest* -if test -n "$ac_declaration"; then - echo '#ifdef __cplusplus' >>confdefs.h - echo $ac_declaration >>confdefs.h - echo '#endif' >>confdefs.h -fi - -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -19919,8 +21309,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= -echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 -echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; } if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -20009,8 +21399,8 @@ else fi fi -echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 -echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 +{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type @@ -20031,8 +21421,8 @@ ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 -echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -20066,8 +21456,13 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 @@ -20092,9 +21487,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi + rm -f conftest.err conftest.$ac_ext - # OK, works on sane cases. Now check whether non-existent headers + # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -20104,8 +21500,13 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 @@ -20132,6 +21533,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_preproc_ok=: break fi + rm -f conftest.err conftest.$ac_ext done @@ -20149,8 +21551,8 @@ fi else ac_cv_prog_CPP=$CPP fi -echo "$as_me:$LINENO: result: $CPP" >&5 -echo "${ECHO_T}$CPP" >&6 +{ echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do @@ -20173,8 +21575,13 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 @@ -20199,9 +21606,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi + rm -f conftest.err conftest.$ac_ext - # OK, works on sane cases. Now check whether non-existent headers + # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -20211,8 +21619,13 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 @@ -20239,6 +21652,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_preproc_ok=: break fi + rm -f conftest.err conftest.$ac_ext done @@ -20273,8 +21687,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. -echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 -echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -20296,7 +21710,7 @@ case $as_dir/ in # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. @@ -20315,21 +21729,22 @@ case $as_dir/ in ;; esac done +IFS=$as_save_IFS fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is - # removed, or if the path is relative. + # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi -echo "$as_me:$LINENO: result: $INSTALL" >&5 -echo "${ECHO_T}$INSTALL" >&6 +{ echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. @@ -20339,43 +21754,44 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -echo "$as_me:$LINENO: checking whether ln -s works" >&5 -echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether ln -s works" >&5 +echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } else - echo "$as_me:$LINENO: result: no, using $LN_S" >&5 -echo "${ECHO_T}no, using $LN_S" >&6 + { echo "$as_me:$LINENO: result: no, using $LN_S" >&5 +echo "${ECHO_T}no, using $LN_S" >&6; } fi -echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` -if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then +{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } +set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF +SHELL = /bin/sh all: - @echo 'ac_maketemp="$(MAKE)"' + @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac rm -f conftest.make fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } SET_MAKE= else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi @@ -20383,8 +21799,8 @@ for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_YACC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -20397,25 +21813,27 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_YACC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then - echo "$as_me:$LINENO: result: $YACC" >&5 -echo "${ECHO_T}$YACC" >&6 + { echo "$as_me:$LINENO: result: $YACC" >&5 +echo "${ECHO_T}$YACC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" @@ -20424,8 +21842,8 @@ for ac_prog in flex lex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_LEX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -20438,33 +21856,35 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_LEX="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi LEX=$ac_cv_prog_LEX if test -n "$LEX"; then - echo "$as_me:$LINENO: result: $LEX" >&5 -echo "${ECHO_T}$LEX" >&6 + { echo "$as_me:$LINENO: result: $LEX" >&5 +echo "${ECHO_T}$LEX" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test -z "$LEXLIB" then - echo "$as_me:$LINENO: checking for yywrap in -lfl" >&5 -echo $ECHO_N "checking for yywrap in -lfl... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for yywrap in -lfl" >&5 +echo $ECHO_N "checking for yywrap in -lfl... $ECHO_C" >&6; } if test "${ac_cv_lib_fl_yywrap+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -20477,40 +21897,52 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char yywrap (); int main () { -yywrap (); +return yywrap (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -20519,19 +21951,20 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_fl_yywrap=no + ac_cv_lib_fl_yywrap=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_fl_yywrap" >&5 -echo "${ECHO_T}$ac_cv_lib_fl_yywrap" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_fl_yywrap" >&5 +echo "${ECHO_T}$ac_cv_lib_fl_yywrap" >&6; } if test $ac_cv_lib_fl_yywrap = yes; then LEXLIB="-lfl" else - echo "$as_me:$LINENO: checking for yywrap in -ll" >&5 -echo $ECHO_N "checking for yywrap in -ll... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for yywrap in -ll" >&5 +echo $ECHO_N "checking for yywrap in -ll... $ECHO_C" >&6; } if test "${ac_cv_lib_l_yywrap+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -20544,40 +21977,52 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char yywrap (); int main () { -yywrap (); +return yywrap (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -20586,14 +22031,15 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_l_yywrap=no + ac_cv_lib_l_yywrap=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_l_yywrap" >&5 -echo "${ECHO_T}$ac_cv_lib_l_yywrap" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_l_yywrap" >&5 +echo "${ECHO_T}$ac_cv_lib_l_yywrap" >&6; } if test $ac_cv_lib_l_yywrap = yes; then LEXLIB="-ll" fi @@ -20603,8 +22049,8 @@ fi fi if test "x$LEX" != "x:"; then - echo "$as_me:$LINENO: checking lex output file root" >&5 -echo $ECHO_N "checking lex output file root... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking lex output file root" >&5 +echo $ECHO_N "checking lex output file root... $ECHO_C" >&6; } if test "${ac_cv_prog_lex_root+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -20614,8 +22060,13 @@ cat >conftest.l <<_ACEOF %% %% _ACEOF -{ (eval echo "$as_me:$LINENO: \"$LEX conftest.l\"") >&5 - (eval $LEX conftest.l) 2>&5 +{ (ac_try="$LEX conftest.l" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$LEX conftest.l") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } @@ -20629,13 +22080,13 @@ echo "$as_me: error: cannot find output from $LEX; giving up" >&2;} { (exit 1); exit 1; }; } fi fi -echo "$as_me:$LINENO: result: $ac_cv_prog_lex_root" >&5 -echo "${ECHO_T}$ac_cv_prog_lex_root" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_prog_lex_root" >&5 +echo "${ECHO_T}$ac_cv_prog_lex_root" >&6; } rm -f conftest.l LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root -echo "$as_me:$LINENO: checking whether yytext is a pointer" >&5 -echo $ECHO_N "checking whether yytext is a pointer... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether yytext is a pointer" >&5 +echo $ECHO_N "checking whether yytext is a pointer... $ECHO_C" >&6; } if test "${ac_cv_prog_lex_yytext_pointer+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -20650,24 +22101,36 @@ cat >conftest.$ac_ext <<_ACEOF `cat $LEX_OUTPUT_ROOT.c` _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -20676,15 +22139,17 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS rm -f "${LEX_OUTPUT_ROOT}.c" fi -echo "$as_me:$LINENO: result: $ac_cv_prog_lex_yytext_pointer" >&5 -echo "${ECHO_T}$ac_cv_prog_lex_yytext_pointer" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_prog_lex_yytext_pointer" >&5 +echo "${ECHO_T}$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then cat >>confdefs.h <<\_ACEOF @@ -20699,8 +22164,8 @@ if test "$LEX" = :; then fi # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -20716,28 +22181,29 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_AR="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS test -z "$ac_cv_path_AR" && ac_cv_path_AR="ar" ;; esac fi AR=$ac_cv_path_AR - if test -n "$AR"; then - echo "$as_me:$LINENO: result: $AR" >&5 -echo "${ECHO_T}$AR" >&6 + { echo "$as_me:$LINENO: result: $AR" >&5 +echo "${ECHO_T}$AR" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + case "$host_os" in cygwin) case "$target" in @@ -20747,13 +22213,13 @@ cygwin) ;; esac -# Check whether --enable-Werror or --disable-Werror was given. +# Check whether --enable-Werror was given. if test "${enable_Werror+set}" = set; then - enableval="$enable_Werror" - enable_werror=$enableval + enableval=$enable_Werror; enable_werror=$enableval else enable_werror=no -fi; +fi + if test x$enable_werror = xyes; then ADD_CFLAGS="-Werror -W -Wpointer-arith" fi @@ -20772,8 +22238,8 @@ case "$GCC" in esac -echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -20797,24 +22263,36 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -20823,9 +22301,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_header_stdc=no + ac_cv_header_stdc=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. @@ -20881,6 +22360,7 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include +#include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) @@ -20900,18 +22380,27 @@ main () for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) - exit(2); - exit (0); + return 2; + return 0; } _ACEOF rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -20924,12 +22413,14 @@ sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi + + fi fi -echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -echo "${ECHO_T}$ac_cv_header_stdc" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF @@ -20942,18 +22433,19 @@ fi for ac_header in sys/param.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -20964,24 +22456,36 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -20990,15 +22494,16 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -21007,8 +22512,13 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 @@ -21032,9 +22542,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -21058,25 +22569,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------------ ## -## Report this to the AC_PACKAGE_NAME lists. ## -## ------------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -21089,8 +22594,8 @@ fi done -echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5 -echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5 +echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6; } if test "${ac_cv_c_bigendian+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -21116,24 +22621,36 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -21159,24 +22676,36 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -21185,14 +22714,15 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_c_bigendian=no + ac_cv_c_bigendian=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -# It does not; compile a test program. + # It does not; compile a test program. if test "$cross_compiling" = yes; then # try to guess the endianness by grepping values into an object file ac_cv_c_bigendian=unknown @@ -21202,11 +22732,11 @@ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; -short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; +short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; +short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; } -short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; -short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; +short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; +short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; } int main () @@ -21217,24 +22747,36 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -21253,8 +22795,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -21262,27 +22806,41 @@ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ +$ac_includes_default int main () { + /* Are we little or big endian? From Harbison&Steele. */ union { - long l; - char c[sizeof (long)]; + long int l; + char c[sizeof (long int)]; } u; u.l = 1; - exit (u.c[sizeof (long) - 1] == 1); + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; } _ACEOF rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -21295,13 +22853,16 @@ sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_c_bigendian=yes fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi + + fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5 -echo "${ECHO_T}$ac_cv_c_bigendian" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5 +echo "${ECHO_T}$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in yes) @@ -21319,8 +22880,8 @@ presetting ac_cv_c_bigendian=no (or yes) will help" >&2;} { (exit 1); exit 1; }; } ;; esac -echo "$as_me:$LINENO: checking for off_t" >&5 -echo $ECHO_N "checking for off_t... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for off_t" >&5 +echo $ECHO_N "checking for off_t... $ECHO_C" >&6; } if test "${ac_cv_type_off_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -21331,36 +22892,49 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default +typedef off_t ac__type_new_; int main () { -if ((off_t *) 0) +if ((ac__type_new_ *) 0) return 0; -if (sizeof (off_t)) +if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -21369,24 +22943,25 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_type_off_t=no + ac_cv_type_off_t=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5 -echo "${ECHO_T}$ac_cv_type_off_t" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5 +echo "${ECHO_T}$ac_cv_type_off_t" >&6; } if test $ac_cv_type_off_t = yes; then : else cat >>confdefs.h <<_ACEOF -#define off_t long +#define off_t long int _ACEOF fi -echo "$as_me:$LINENO: checking for size_t" >&5 -echo $ECHO_N "checking for size_t... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for size_t" >&5 +echo $ECHO_N "checking for size_t... $ECHO_C" >&6; } if test "${ac_cv_type_size_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -21397,36 +22972,49 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default +typedef size_t ac__type_new_; int main () { -if ((size_t *) 0) +if ((ac__type_new_ *) 0) return 0; -if (sizeof (size_t)) +if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -21435,24 +23023,25 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_type_size_t=no + ac_cv_type_size_t=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 -echo "${ECHO_T}$ac_cv_type_size_t" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 +echo "${ECHO_T}$ac_cv_type_size_t" >&6; } if test $ac_cv_type_size_t = yes; then : else cat >>confdefs.h <<_ACEOF -#define size_t unsigned +#define size_t unsigned int _ACEOF fi -echo "$as_me:$LINENO: checking whether struct tm is in sys/time.h or time.h" >&5 -echo $ECHO_N "checking whether struct tm is in sys/time.h or time.h... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether struct tm is in sys/time.h or time.h" >&5 +echo $ECHO_N "checking whether struct tm is in sys/time.h or time.h... $ECHO_C" >&6; } if test "${ac_cv_struct_tm+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -21474,24 +23063,36 @@ struct tm *tp; tp->tm_sec; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -21500,12 +23101,13 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_struct_tm=sys/time.h + ac_cv_struct_tm=sys/time.h fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_struct_tm" >&5 -echo "${ECHO_T}$ac_cv_struct_tm" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_struct_tm" >&5 +echo "${ECHO_T}$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then cat >>confdefs.h <<\_ACEOF @@ -21514,8 +23116,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for intmax_t" >&5 -echo $ECHO_N "checking for intmax_t... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for intmax_t" >&5 +echo $ECHO_N "checking for intmax_t... $ECHO_C" >&6; } if test "${ac_cv_type_intmax_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -21526,36 +23128,49 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default +typedef intmax_t ac__type_new_; int main () { -if ((intmax_t *) 0) +if ((ac__type_new_ *) 0) return 0; -if (sizeof (intmax_t)) +if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -21564,12 +23179,13 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_type_intmax_t=no + ac_cv_type_intmax_t=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_type_intmax_t" >&5 -echo "${ECHO_T}$ac_cv_type_intmax_t" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_type_intmax_t" >&5 +echo "${ECHO_T}$ac_cv_type_intmax_t" >&6; } if test $ac_cv_type_intmax_t = yes; then : else @@ -21586,9 +23202,9 @@ fi for ac_func in strtoimax strtoll do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF @@ -21614,53 +23230,59 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -21669,13 +23291,15 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -21688,9 +23312,9 @@ done for ac_func in mergesort do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF @@ -21716,53 +23340,59 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -21771,13 +23401,15 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -21787,83 +23419,286 @@ fi done - ac_config_headers="$ac_config_headers config.h" +for ac_func in mkstemps +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ - ac_config_files="$ac_config_files skeletons/standard-modules/Makefile skeletons/tests/Makefile libasn1compiler/Makefile libasn1parser/Makefile libasn1print/Makefile asn1c/webcgi/Makefile asn1c/tests/Makefile libasn1fix/Makefile skeletons/Makefile examples/Makefile tests/Makefile asn1c/Makefile doc/Makefile asn1c.spec Makefile" -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. +#ifdef __STDC__ +# include +#else +# include +#endif -_ACEOF +#undef $ac_func -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () { - (set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" - ;; - esac; -} | - sed ' - t clear - : clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - : end' >>confcache -if diff $cache_file confcache >/dev/null 2>&1; then :; else - if test -w $cache_file; then - test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" - cat confcache >$cache_file - else - echo "not updating unwritable cache $cache_file" - fi +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" fi -rm -f confcache -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/; -s/:*\${srcdir}:*/:/; -s/:*@srcdir@:*/:/; -s/^\([^=]*=[ ]*\):*/\1/; -s/:*$//; -s/^[^=]*=[ ]*$//; -}' fi +done + + + +{ echo "$as_me:$LINENO: checking for getopt in -liberty" >&5 +echo $ECHO_N "checking for getopt in -liberty... $ECHO_C" >&6; } +if test "${ac_cv_lib_iberty_getopt+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-liberty $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char getopt (); +int +main () +{ +return getopt (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_iberty_getopt=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_iberty_getopt=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_iberty_getopt" >&5 +echo "${ECHO_T}$ac_cv_lib_iberty_getopt" >&6; } +if test $ac_cv_lib_iberty_getopt = yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBIBERTY 1 +_ACEOF + + LIBS="-liberty $LIBS" + +fi + + +ac_config_headers="$ac_config_headers config.h" + + +ac_config_files="$ac_config_files skeletons/standard-modules/Makefile skeletons/tests/Makefile libasn1compiler/Makefile libasn1parser/Makefile libasn1print/Makefile asn1c/webcgi/Makefile asn1c/tests/Makefile libasn1fix/Makefile skeletons/Makefile examples/Makefile tests/Makefile asn1c/Makefile doc/Makefile asn1c.spec Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { echo "$as_me:$LINENO: updating cache $cache_file" >&5 +echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H @@ -21871,11 +23706,12 @@ ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. - ac_i=`echo "$ac_i" | - sed 's/\$U\././;s/\.o$//;s/\.obj$//'` - # 2. Add them. - ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" - ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs @@ -21948,11 +23784,35 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then - set -o posix + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi +BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset @@ -21961,8 +23821,43 @@ else fi +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +as_nl=' +' +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + # Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done PS1='$ ' PS2='> ' PS4='+ ' @@ -21976,18 +23871,19 @@ do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else - $as_unset $as_var + ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1; then +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi -if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false @@ -21995,159 +23891,120 @@ fi # Name of the executable. -as_me=`$as_basename "$0" || +as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)$' \| \ - . : '\(.\)' 2>/dev/null || + X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } - /^X\/\(\/\/\)$/{ s//\1/; q; } - /^X\/\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` -# PATH needs CR, and LINENO needs CR and PATH. -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi +# CDPATH. +$as_unset CDPATH - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done - ;; - esac - # We did not find ourselves, most probably we were run as `sh COMMAND' - # in which case we are not to be found in the path. - if test "x$as_myself" = x; then - as_myself=$0 - fi - if test ! -f "$as_myself"; then - { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 -echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for as_base in sh bash ksh sh5; do - case $as_dir in - /*) - if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, and appends trailing '-' during - # substitution so that $LINENO is not a special case at line end. + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno N - s,$,-, - : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop - s,-$,, - s,^['$as_cr_digits']*\n,, + s/-\n.*// ' >$as_me.lineno && - chmod +x $as_me.lineno || - { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 -echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + chmod +x "$as_me.lineno" || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensible to this). - . ./$as_me.lineno + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" # Exit status is that of the last command. exit } -case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in - *c*,-n*) ECHO_N= ECHO_C=' -' ECHO_T=' ' ;; - *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; - *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; esac -if expr a : '\(a\)' >/dev/null 2>&1; then +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir +fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then - # We could just check for DJGPP; but this test a) works b) is more generic - # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). - if test -f conf$$.exe; then - # Don't use ln at all; we don't have any links + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' - else - as_ln_s='ln -s' - fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi -rm -f conf$$ conf$$.exe conf$$.file +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: @@ -22156,7 +24013,19 @@ else as_mkdir_p=false fi -as_executable_p="test -f" +# Find out whether ``test -x'' works. Don't use a zero-byte file, as +# systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + as_executable_p="test -x" +else + as_executable_p=: +fi +rm -f conf$$.file # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -22165,31 +24034,14 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" -# IFS -# We need space, tab and new line, in precisely that order. -as_nl=' -' -IFS=" $as_nl" - -# CDPATH. -$as_unset CDPATH - exec 6>&1 -# Open the log real soon, to keep \$[0] and so on meaningful, and to +# Save the log message, to keep $[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. Logging --version etc. is OK. -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX -} >&5 -cat >&5 <<_CSEOF - +# values after options handling. +ac_log=" This file was extended by $as_me, which was -generated by GNU Autoconf 2.59. Invocation command line was +generated by GNU Autoconf 2.60. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -22197,30 +24049,20 @@ generated by GNU Autoconf 2.59. Invocation command line was CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ -_CSEOF -echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 -echo >&5 +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + _ACEOF +cat >>$CONFIG_STATUS <<_ACEOF # Files that config.status was made for. -if test -n "$ac_config_files"; then - echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_headers"; then - echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_links"; then - echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS -fi +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" -if test -n "$ac_config_commands"; then - echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS -fi +_ACEOF cat >>$CONFIG_STATUS <<\_ACEOF - ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. @@ -22247,19 +24089,21 @@ Configuration commands: $config_commands Report bugs to ." -_ACEOF +_ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status -configured by $0, generated by GNU Autoconf 2.59, - with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" +configured by $0, generated by GNU Autoconf 2.60, + with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" -Copyright (C) 2003 Free Software Foundation, Inc. +Copyright (C) 2006 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." -srcdir=$srcdir -INSTALL="$INSTALL" + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF @@ -22270,39 +24114,24 @@ while test $# != 0 do case $1 in --*=*) - ac_option=`expr "x$1" : 'x\([^=]*\)='` - ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; - -*) + *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; - *) # This is not an option, so the user has probably given explicit - # arguments. - ac_option=$1 - ac_need_defaults=false;; esac case $ac_option in # Handling of the options. -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; - --version | --vers* | -V ) - echo "$ac_cs_version"; exit 0 ;; - --he | --h) - # Conflict between --help and --header - { { echo "$as_me:$LINENO: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&5 -echo "$as_me: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&2;} - { (exit 1); exit 1; }; };; - --help | --hel | -h ) - echo "$ac_cs_usage"; exit 0 ;; - --debug | --d* | -d ) + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + echo "$ac_cs_version"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift @@ -22312,18 +24141,24 @@ Try \`$0 --help' for more information." >&2;} $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + { echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. - -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&5 -echo "$as_me: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&2;} + -*) { echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; - *) ac_config_targets="$ac_config_targets $1" ;; + *) ac_config_targets="$ac_config_targets $1" + ac_need_defaults=false ;; esac shift @@ -22339,51 +24174,63 @@ fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then - echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 - exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + CONFIG_SHELL=$SHELL + export CONFIG_SHELL + exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + echo "$ac_log" +} >&5 +_ACEOF cat >>$CONFIG_STATUS <<_ACEOF # -# INIT-COMMANDS section. +# INIT-COMMANDS # - AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF - - cat >>$CONFIG_STATUS <<\_ACEOF + +# Handling of arguments. for ac_config_target in $ac_config_targets do - case "$ac_config_target" in - # Handling of arguments. - "skeletons/standard-modules/Makefile" ) CONFIG_FILES="$CONFIG_FILES skeletons/standard-modules/Makefile" ;; - "skeletons/tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES skeletons/tests/Makefile" ;; - "libasn1compiler/Makefile" ) CONFIG_FILES="$CONFIG_FILES libasn1compiler/Makefile" ;; - "libasn1parser/Makefile" ) CONFIG_FILES="$CONFIG_FILES libasn1parser/Makefile" ;; - "libasn1print/Makefile" ) CONFIG_FILES="$CONFIG_FILES libasn1print/Makefile" ;; - "asn1c/webcgi/Makefile" ) CONFIG_FILES="$CONFIG_FILES asn1c/webcgi/Makefile" ;; - "asn1c/tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES asn1c/tests/Makefile" ;; - "libasn1fix/Makefile" ) CONFIG_FILES="$CONFIG_FILES libasn1fix/Makefile" ;; - "skeletons/Makefile" ) CONFIG_FILES="$CONFIG_FILES skeletons/Makefile" ;; - "examples/Makefile" ) CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; - "tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; - "asn1c/Makefile" ) CONFIG_FILES="$CONFIG_FILES asn1c/Makefile" ;; - "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; - "asn1c.spec" ) CONFIG_FILES="$CONFIG_FILES asn1c.spec" ;; - "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + case $ac_config_target in + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "skeletons/standard-modules/Makefile") CONFIG_FILES="$CONFIG_FILES skeletons/standard-modules/Makefile" ;; + "skeletons/tests/Makefile") CONFIG_FILES="$CONFIG_FILES skeletons/tests/Makefile" ;; + "libasn1compiler/Makefile") CONFIG_FILES="$CONFIG_FILES libasn1compiler/Makefile" ;; + "libasn1parser/Makefile") CONFIG_FILES="$CONFIG_FILES libasn1parser/Makefile" ;; + "libasn1print/Makefile") CONFIG_FILES="$CONFIG_FILES libasn1print/Makefile" ;; + "asn1c/webcgi/Makefile") CONFIG_FILES="$CONFIG_FILES asn1c/webcgi/Makefile" ;; + "asn1c/tests/Makefile") CONFIG_FILES="$CONFIG_FILES asn1c/tests/Makefile" ;; + "libasn1fix/Makefile") CONFIG_FILES="$CONFIG_FILES libasn1fix/Makefile" ;; + "skeletons/Makefile") CONFIG_FILES="$CONFIG_FILES skeletons/Makefile" ;; + "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; + "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; + "asn1c/Makefile") CONFIG_FILES="$CONFIG_FILES asn1c/Makefile" ;; + "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "asn1c.spec") CONFIG_FILES="$CONFIG_FILES asn1c.spec" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done + # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely @@ -22395,364 +24242,471 @@ if $ac_need_defaults; then fi # Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason to put it here, and in addition, +# simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. -# Create a temporary directory, and hook for its removal unless debugging. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. $debug || { - trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } - # Create a (secure) tmp directory for tmp files. { - tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { - tmp=./confstat$$-$RANDOM - (umask 077 && mkdir $tmp) + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } -_ACEOF - -cat >>$CONFIG_STATUS <<_ACEOF - # -# CONFIG_FILES section. +# Set up the sed scripts for CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h -if test -n "\$CONFIG_FILES"; then - # Protect against being on the right side of a sed subst in config.status. - sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; - s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF -s,@SHELL@,$SHELL,;t t -s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t -s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t -s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t -s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t -s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t -s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t -s,@exec_prefix@,$exec_prefix,;t t -s,@prefix@,$prefix,;t t -s,@program_transform_name@,$program_transform_name,;t t -s,@bindir@,$bindir,;t t -s,@sbindir@,$sbindir,;t t -s,@libexecdir@,$libexecdir,;t t -s,@datadir@,$datadir,;t t -s,@sysconfdir@,$sysconfdir,;t t -s,@sharedstatedir@,$sharedstatedir,;t t -s,@localstatedir@,$localstatedir,;t t -s,@libdir@,$libdir,;t t -s,@includedir@,$includedir,;t t -s,@oldincludedir@,$oldincludedir,;t t -s,@infodir@,$infodir,;t t -s,@mandir@,$mandir,;t t -s,@build_alias@,$build_alias,;t t -s,@host_alias@,$host_alias,;t t -s,@target_alias@,$target_alias,;t t -s,@DEFS@,$DEFS,;t t -s,@ECHO_C@,$ECHO_C,;t t -s,@ECHO_N@,$ECHO_N,;t t -s,@ECHO_T@,$ECHO_T,;t t -s,@LIBS@,$LIBS,;t t -s,@build@,$build,;t t -s,@build_cpu@,$build_cpu,;t t -s,@build_vendor@,$build_vendor,;t t -s,@build_os@,$build_os,;t t -s,@host@,$host,;t t -s,@host_cpu@,$host_cpu,;t t -s,@host_vendor@,$host_vendor,;t t -s,@host_os@,$host_os,;t t -s,@target@,$target,;t t -s,@target_cpu@,$target_cpu,;t t -s,@target_vendor@,$target_vendor,;t t -s,@target_os@,$target_os,;t t -s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t -s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t -s,@INSTALL_DATA@,$INSTALL_DATA,;t t -s,@CYGPATH_W@,$CYGPATH_W,;t t -s,@PACKAGE@,$PACKAGE,;t t -s,@VERSION@,$VERSION,;t t -s,@ACLOCAL@,$ACLOCAL,;t t -s,@AUTOCONF@,$AUTOCONF,;t t -s,@AUTOMAKE@,$AUTOMAKE,;t t -s,@AUTOHEADER@,$AUTOHEADER,;t t -s,@MAKEINFO@,$MAKEINFO,;t t -s,@install_sh@,$install_sh,;t t -s,@STRIP@,$STRIP,;t t -s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t -s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t -s,@mkdir_p@,$mkdir_p,;t t -s,@AWK@,$AWK,;t t -s,@SET_MAKE@,$SET_MAKE,;t t -s,@am__leading_dot@,$am__leading_dot,;t t -s,@AMTAR@,$AMTAR,;t t -s,@am__tar@,$am__tar,;t t -s,@am__untar@,$am__untar,;t t -s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t -s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t -s,@MAINT@,$MAINT,;t t -s,@CC@,$CC,;t t -s,@CFLAGS@,$CFLAGS,;t t -s,@LDFLAGS@,$LDFLAGS,;t t -s,@CPPFLAGS@,$CPPFLAGS,;t t -s,@ac_ct_CC@,$ac_ct_CC,;t t -s,@EXEEXT@,$EXEEXT,;t t -s,@OBJEXT@,$OBJEXT,;t t -s,@DEPDIR@,$DEPDIR,;t t -s,@am__include@,$am__include,;t t -s,@am__quote@,$am__quote,;t t -s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t -s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t -s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t -s,@CCDEPMODE@,$CCDEPMODE,;t t -s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t -s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t -s,@EGREP@,$EGREP,;t t -s,@LN_S@,$LN_S,;t t -s,@ECHO@,$ECHO,;t t -s,@AR@,$AR,;t t -s,@ac_ct_AR@,$ac_ct_AR,;t t -s,@RANLIB@,$RANLIB,;t t -s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t -s,@CPP@,$CPP,;t t -s,@CXX@,$CXX,;t t -s,@CXXFLAGS@,$CXXFLAGS,;t t -s,@ac_ct_CXX@,$ac_ct_CXX,;t t -s,@CXXDEPMODE@,$CXXDEPMODE,;t t -s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t -s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t -s,@CXXCPP@,$CXXCPP,;t t -s,@F77@,$F77,;t t -s,@FFLAGS@,$FFLAGS,;t t -s,@ac_ct_F77@,$ac_ct_F77,;t t -s,@LIBTOOL@,$LIBTOOL,;t t -s,@CONFIGURE_DEPENDS@,$CONFIGURE_DEPENDS,;t t -s,@YACC@,$YACC,;t t -s,@LEX@,$LEX,;t t -s,@LEXLIB@,$LEXLIB,;t t -s,@LEX_OUTPUT_ROOT@,$LEX_OUTPUT_ROOT,;t t -s,@ADD_CFLAGS@,$ADD_CFLAGS,;t t -s,@LIBOBJS@,$LIBOBJS,;t t -s,@LTLIBOBJS@,$LTLIBOBJS,;t t -CEOF +if test -n "$CONFIG_FILES"; then _ACEOF - cat >>$CONFIG_STATUS <<\_ACEOF - # Split the substitutions into bite-sized pieces for seds with - # small command number limits, like on Digital OSF/1 and HP-UX. - ac_max_sed_lines=48 - ac_sed_frag=1 # Number of current file. - ac_beg=1 # First line for current file. - ac_end=$ac_max_sed_lines # Line after last line for current file. - ac_more_lines=: - ac_sed_cmds= - while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag - else - sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag - fi - if test ! -s $tmp/subs.frag; then - ac_more_lines=false - else - # The purpose of the label and of the branching condition is to - # speed up the sed processing (if there are no `@' at all, there - # is no need to browse any of the substitutions). - # These are the two extra sed commands mentioned above. - (echo ':t - /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" - else - ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" - fi - ac_sed_frag=`expr $ac_sed_frag + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_lines` - fi - done - if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat + + +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + cat >conf$$subs.sed <<_ACEOF +SHELL!$SHELL$ac_delim +PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim +PACKAGE_NAME!$PACKAGE_NAME$ac_delim +PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim +PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim +PACKAGE_STRING!$PACKAGE_STRING$ac_delim +PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim +exec_prefix!$exec_prefix$ac_delim +prefix!$prefix$ac_delim +program_transform_name!$program_transform_name$ac_delim +bindir!$bindir$ac_delim +sbindir!$sbindir$ac_delim +libexecdir!$libexecdir$ac_delim +datarootdir!$datarootdir$ac_delim +datadir!$datadir$ac_delim +sysconfdir!$sysconfdir$ac_delim +sharedstatedir!$sharedstatedir$ac_delim +localstatedir!$localstatedir$ac_delim +includedir!$includedir$ac_delim +oldincludedir!$oldincludedir$ac_delim +docdir!$docdir$ac_delim +infodir!$infodir$ac_delim +htmldir!$htmldir$ac_delim +dvidir!$dvidir$ac_delim +pdfdir!$pdfdir$ac_delim +psdir!$psdir$ac_delim +libdir!$libdir$ac_delim +localedir!$localedir$ac_delim +mandir!$mandir$ac_delim +DEFS!$DEFS$ac_delim +ECHO_C!$ECHO_C$ac_delim +ECHO_N!$ECHO_N$ac_delim +ECHO_T!$ECHO_T$ac_delim +LIBS!$LIBS$ac_delim +build_alias!$build_alias$ac_delim +host_alias!$host_alias$ac_delim +target_alias!$target_alias$ac_delim +build!$build$ac_delim +build_cpu!$build_cpu$ac_delim +build_vendor!$build_vendor$ac_delim +build_os!$build_os$ac_delim +host!$host$ac_delim +host_cpu!$host_cpu$ac_delim +host_vendor!$host_vendor$ac_delim +host_os!$host_os$ac_delim +target!$target$ac_delim +target_cpu!$target_cpu$ac_delim +target_vendor!$target_vendor$ac_delim +target_os!$target_os$ac_delim +INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim +INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim +INSTALL_DATA!$INSTALL_DATA$ac_delim +CYGPATH_W!$CYGPATH_W$ac_delim +PACKAGE!$PACKAGE$ac_delim +VERSION!$VERSION$ac_delim +ACLOCAL!$ACLOCAL$ac_delim +AUTOCONF!$AUTOCONF$ac_delim +AUTOMAKE!$AUTOMAKE$ac_delim +AUTOHEADER!$AUTOHEADER$ac_delim +MAKEINFO!$MAKEINFO$ac_delim +install_sh!$install_sh$ac_delim +STRIP!$STRIP$ac_delim +INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim +mkdir_p!$mkdir_p$ac_delim +AWK!$AWK$ac_delim +SET_MAKE!$SET_MAKE$ac_delim +am__leading_dot!$am__leading_dot$ac_delim +AMTAR!$AMTAR$ac_delim +am__tar!$am__tar$ac_delim +am__untar!$am__untar$ac_delim +MAINTAINER_MODE_TRUE!$MAINTAINER_MODE_TRUE$ac_delim +MAINTAINER_MODE_FALSE!$MAINTAINER_MODE_FALSE$ac_delim +MAINT!$MAINT$ac_delim +CC!$CC$ac_delim +CFLAGS!$CFLAGS$ac_delim +LDFLAGS!$LDFLAGS$ac_delim +CPPFLAGS!$CPPFLAGS$ac_delim +ac_ct_CC!$ac_ct_CC$ac_delim +EXEEXT!$EXEEXT$ac_delim +OBJEXT!$OBJEXT$ac_delim +DEPDIR!$DEPDIR$ac_delim +am__include!$am__include$ac_delim +am__quote!$am__quote$ac_delim +AMDEP_TRUE!$AMDEP_TRUE$ac_delim +AMDEP_FALSE!$AMDEP_FALSE$ac_delim +AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim +CCDEPMODE!$CCDEPMODE$ac_delim +am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim +am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim +GREP!$GREP$ac_delim +EGREP!$EGREP$ac_delim +LN_S!$LN_S$ac_delim +ECHO!$ECHO$ac_delim +AR!$AR$ac_delim +RANLIB!$RANLIB$ac_delim +CPP!$CPP$ac_delim +CXX!$CXX$ac_delim +_ACEOF + + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then + break + elif $ac_last_try; then + { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi -fi # test -n "$CONFIG_FILES" +done + +ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` +if test -n "$ac_eof"; then + ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` + ac_eof=`expr $ac_eof + 1` +fi + +cat >>$CONFIG_STATUS <<_ACEOF +cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +_ACEOF +sed ' +s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g +s/^/s,@/; s/!/@,|#_!!_#|/ +:n +t n +s/'"$ac_delim"'$/,g/; t +s/$/\\/; p +N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n +' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF +CEOF$ac_eof +_ACEOF + + +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + cat >conf$$subs.sed <<_ACEOF +CXXFLAGS!$CXXFLAGS$ac_delim +ac_ct_CXX!$ac_ct_CXX$ac_delim +CXXDEPMODE!$CXXDEPMODE$ac_delim +am__fastdepCXX_TRUE!$am__fastdepCXX_TRUE$ac_delim +am__fastdepCXX_FALSE!$am__fastdepCXX_FALSE$ac_delim +CXXCPP!$CXXCPP$ac_delim +F77!$F77$ac_delim +FFLAGS!$FFLAGS$ac_delim +ac_ct_F77!$ac_ct_F77$ac_delim +LIBTOOL!$LIBTOOL$ac_delim +CONFIGURE_DEPENDS!$CONFIGURE_DEPENDS$ac_delim +YACC!$YACC$ac_delim +YFLAGS!$YFLAGS$ac_delim +LEX!$LEX$ac_delim +LEXLIB!$LEXLIB$ac_delim +LEX_OUTPUT_ROOT!$LEX_OUTPUT_ROOT$ac_delim +ADD_CFLAGS!$ADD_CFLAGS$ac_delim +LIBOBJS!$LIBOBJS$ac_delim +LTLIBOBJS!$LTLIBOBJS$ac_delim +_ACEOF + + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 19; then + break + elif $ac_last_try; then + { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` +if test -n "$ac_eof"; then + ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` + ac_eof=`expr $ac_eof + 1` +fi +cat >>$CONFIG_STATUS <<_ACEOF +cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end _ACEOF +sed ' +s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g +s/^/s,@/; s/!/@,|#_!!_#|/ +:n +t n +s/'"$ac_delim"'$/,g/; t +s/$/\\/; p +N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n +' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF +:end +s/|#_!!_#|//g +CEOF$ac_eof +_ACEOF + + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi + cat >>$CONFIG_STATUS <<\_ACEOF -for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case $ac_file in - - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - * ) ac_file_in=$ac_file.in ;; +fi # test -n "$CONFIG_FILES" + + +for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 +echo "$as_me: error: Invalid tag $ac_tag." >&2;} + { (exit 1); exit 1; }; };; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + ac_file_inputs="$ac_file_inputs $ac_f" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input="Generated from "`IFS=: + echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + fi + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin";; + esac + ;; esac - # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. - ac_dir=`(dirname "$ac_file") 2>/dev/null || + ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { as_dir="$ac_dir" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || + while :; do + case $as_dir in #( + *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } - ac_builddir=. -if test "$ac_dir" != .; then +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix case $srcdir in - .) # No --srcdir option. We are building in place. + .) # We are building in place. ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; -esac + case $ac_mode in + :F) + # + # CONFIG_FILE + # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac +_ACEOF - if test x"$ac_file" != x-; then - { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - rm -f "$ac_file" - fi - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - if test x"$ac_file" = x-; then - configure_input= - else - configure_input="$ac_file. " - fi - configure_input=$configure_input"Generated from `echo $ac_file_in | - sed 's,.*/,,'` by configure." - - # First look for the input files in the build tree, otherwise in the - # src tree. - ac_file_inputs=`IFS=: - for f in $ac_file_in; do - case $f in - -) echo $tmp/stdin ;; - [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - echo "$f";; - *) # Relative - if test -f "$f"; then - # Build tree - echo "$f" - elif test -f "$srcdir/$f"; then - # Source tree - echo "$srcdir/$f" - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - fi;; - esac - done` || { (exit 1); exit 1; } +cat >>$CONFIG_STATUS <<\_ACEOF +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= + +case `sed -n '/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p +' $ac_file_inputs` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac _ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub @@ -22760,248 +24714,130 @@ _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s,@configure_input@,$configure_input,;t t -s,@srcdir@,$ac_srcdir,;t t -s,@abs_srcdir@,$ac_abs_srcdir,;t t -s,@top_srcdir@,$ac_top_srcdir,;t t -s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t -s,@builddir@,$ac_builddir,;t t -s,@abs_builddir@,$ac_abs_builddir,;t t -s,@top_builddir@,$ac_top_builddir,;t t -s,@abs_top_builddir@,$ac_abs_top_builddir,;t t -s,@INSTALL@,$ac_INSTALL,;t t -" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out - rm -f $tmp/stdin - if test x"$ac_file" != x-; then - mv $tmp/out $ac_file - else - cat $tmp/out - rm -f $tmp/out - fi - -done -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF - -# -# CONFIG_HEADER section. -# - -# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -# NAME is the cpp macro being defined and VALUE is the value it is being given. -# -# ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='[ ].*$,\1#\2' -ac_dC=' ' -ac_dD=',;t' -# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_uB='$,\1#\2define\3' -ac_uC=' ' -ac_uD=',;t' - -for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". +s&@configure_input@&$configure_input&;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" >$tmp/out + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} + + rm -f "$tmp/stdin" case $ac_file in - - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - * ) ac_file_in=$ac_file.in ;; + -) cat "$tmp/out"; rm -f "$tmp/out";; + *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; esac - - test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - - # First look for the input files in the build tree, otherwise in the - # src tree. - ac_file_inputs=`IFS=: - for f in $ac_file_in; do - case $f in - -) echo $tmp/stdin ;; - [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - # Do quote $f, to prevent DOS paths from being IFS'd. - echo "$f";; - *) # Relative - if test -f "$f"; then - # Build tree - echo "$f" - elif test -f "$srcdir/$f"; then - # Source tree - echo "$srcdir/$f" - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - fi;; - esac - done` || { (exit 1); exit 1; } - # Remove the trailing spaces. - sed 's/[ ]*$//' $ac_file_inputs >$tmp/in - + ;; + :H) + # + # CONFIG_HEADER + # _ACEOF -# Transform confdefs.h into two sed scripts, `conftest.defines' and -# `conftest.undefs', that substitutes the proper values into -# config.h.in to produce config.h. The first handles `#define' -# templates, and the second `#undef' templates. -# And first: Protect against being on the right side of a sed subst in -# config.status. Protect against being in an unquoted here document -# in config.status. -rm -f conftest.defines conftest.undefs -# Using a here document instead of a string reduces the quoting nightmare. -# Putting comments in sed scripts is not portable. -# -# `end' is used to avoid that the second main sed command (meant for -# 0-ary CPP macros) applies to n-ary macro definitions. -# See the Autoconf documentation for `clear'. -cat >confdef2sed.sed <<\_ACEOF -s/[\\&,]/\\&/g -s,[\\$`],\\&,g -t clear -: clear -s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp -t end -s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp -: end -_ACEOF -# If some macros were called several times there might be several times -# the same #defines, which is useless. Nevertheless, we may not want to -# sort them, since we want the *last* AC-DEFINE to be honored. -uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines -sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs -rm -f confdef2sed.sed - -# This sed command replaces #undef with comments. This is necessary, for +# Transform confdefs.h into a sed script `conftest.defines', that +# substitutes the proper values into config.h.in to produce config.h. +rm -f conftest.defines conftest.tail +# First, append a space to every undef/define line, to ease matching. +echo 's/$/ /' >conftest.defines +# Then, protect against being on the right side of a sed subst, or in +# an unquoted here document, in config.status. If some macros were +# called several times there might be several #defines for the same +# symbol, which is useless. But do not sort them, since the last +# AC_DEFINE must be honored. +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where +# NAME is the cpp macro being defined, VALUE is the value it is being given. +# PARAMS is the parameter list in the macro definition--in most cases, it's +# just an empty string. +ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*' +ac_dB='\\)[ (].*,\\1define\\2' +ac_dC=' ' +ac_dD=' ,' + +uniq confdefs.h | + sed -n ' + t rset + :rset + s/^[ ]*#[ ]*define[ ][ ]*// + t ok + d + :ok + s/[\\&,]/\\&/g + s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p + s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p + ' >>conftest.defines + +# Remove the space that was appended to ease matching. +# Then replace #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. -cat >>conftest.undefs <<\_ACEOF -s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, -_ACEOF - -# Break up conftest.defines because some shells have a limit on the size -# of here documents, and old seds have small limits too (100 cmds). -echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS -echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS -echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS -echo ' :' >>$CONFIG_STATUS -rm -f conftest.tail -while grep . conftest.defines >/dev/null +# (The regexp can be short, since the line contains either #define or #undef.) +echo 's/ $// +s,^[ #]*u.*,/* & */,' >>conftest.defines + +# Break up conftest.defines: +ac_max_sed_lines=50 + +# First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1" +# Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2" +# Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1" +# et cetera. +ac_in='$ac_file_inputs' +ac_out='"$tmp/out1"' +ac_nxt='"$tmp/out2"' + +while : do - # Write a limited-size here document to $tmp/defines.sed. - echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS - # Speed up: don't consider the non `#define' lines. - echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS - # Work around the forget-to-reset-the-flag bug. - echo 't clr' >>$CONFIG_STATUS - echo ': clr' >>$CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS + # Write a here document: + cat >>$CONFIG_STATUS <<_ACEOF + # First, check the format of the line: + cat >"\$tmp/defines.sed" <<\\CEOF +/^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def +/^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def +b +:def +_ACEOF + sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS echo 'CEOF - sed -f $tmp/defines.sed $tmp/in >$tmp/out - rm -f $tmp/in - mv $tmp/out $tmp/in -' >>$CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail + sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS + ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in + sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail + grep . conftest.tail >/dev/null || break rm -f conftest.defines mv conftest.tail conftest.defines done -rm -f conftest.defines -echo ' fi # grep' >>$CONFIG_STATUS -echo >>$CONFIG_STATUS - -# Break up conftest.undefs because some shells have a limit on the size -# of here documents, and old seds have small limits too (100 cmds). -echo ' # Handle all the #undef templates' >>$CONFIG_STATUS -rm -f conftest.tail -while grep . conftest.undefs >/dev/null -do - # Write a limited-size here document to $tmp/undefs.sed. - echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS - # Speed up: don't consider the non `#undef' - echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS - # Work around the forget-to-reset-the-flag bug. - echo 't clr' >>$CONFIG_STATUS - echo ': clr' >>$CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS - echo 'CEOF - sed -f $tmp/undefs.sed $tmp/in >$tmp/out - rm -f $tmp/in - mv $tmp/out $tmp/in -' >>$CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail - rm -f conftest.undefs - mv conftest.tail conftest.undefs -done -rm -f conftest.undefs +rm -f conftest.defines conftest.tail +echo "ac_result=$ac_in" >>$CONFIG_STATUS cat >>$CONFIG_STATUS <<\_ACEOF - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - if test x"$ac_file" = x-; then - echo "/* Generated by configure. */" >$tmp/config.h - else - echo "/* $ac_file. Generated by configure. */" >$tmp/config.h - fi - cat $tmp/in >>$tmp/config.h - rm -f $tmp/in if test x"$ac_file" != x-; then - if diff $ac_file $tmp/config.h >/dev/null 2>&1; then + echo "/* $configure_input */" >"$tmp/config.h" + cat "$ac_result" >>"$tmp/config.h" + if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else - ac_dir=`(dirname "$ac_file") 2>/dev/null || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } - rm -f $ac_file - mv $tmp/config.h $ac_file + mv "$tmp/config.h" $ac_file fi else - cat $tmp/config.h - rm -f $tmp/config.h + echo "/* $configure_input */" + cat "$ac_result" fi + rm -f "$tmp/out12" # Compute $ac_file's index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do @@ -23012,135 +24848,39 @@ for _am_header in $config_headers :; do _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done -echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null || +echo "timestamp for $ac_file" >`$as_dirname -- $ac_file || $as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X$ac_file : 'X\(//\)[^/]' \| \ X$ac_file : 'X\(//\)$' \| \ - X$ac_file : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X$ac_file : 'X\(/\)' \| . 2>/dev/null || echo X$ac_file | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'`/stamp-h$_am_stamp_count -done -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF - -# -# CONFIG_COMMANDS section. -# -for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue - ac_dest=`echo "$ac_file" | sed 's,:.*,,'` - ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_dir=`(dirname "$ac_dest") 2>/dev/null || -$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_dest" : 'X\(//\)[^/]' \| \ - X"$ac_dest" : 'X\(//\)$' \| \ - X"$ac_dest" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$ac_dest" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } - - ac_builddir=. - -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi - -case $srcdir in - .) # No --srcdir option. We are building in place. - ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; -esac + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; -esac + :C) { echo "$as_me:$LINENO: executing $ac_file commands" >&5 +echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac - { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 -echo "$as_me: executing $ac_dest commands" >&6;} - case $ac_dest in - depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. @@ -23150,18 +24890,29 @@ echo "$as_me: executing $ac_dest commands" >&6;} # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then - dirpart=`(dirname "$mf") 2>/dev/null || + dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$mf" : 'X\(/\)' \| . 2>/dev/null || echo X"$mf" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` else continue fi @@ -23183,53 +24934,79 @@ echo X"$mf" | sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue - fdir=`(dirname "$file") 2>/dev/null || + fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$file" : 'X\(/\)' \| . 2>/dev/null || echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p $dirpart/$fdir - else - as_dir=$dirpart/$fdir + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { as_dir=$dirpart/$fdir + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || + while :; do + case $as_dir in #( + *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 -echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } - # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ;; + esac -done -_ACEOF +done # for ac_tag -cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } _ACEOF diff --git a/configure.in b/configure.in index 941c7c423..1bbbb7517 100644 --- a/configure.in +++ b/configure.in @@ -77,6 +77,10 @@ AC_CHECK_TYPE(intmax_t, int64_t) AC_CHECK_FUNCS(strtoimax strtoll) AC_CHECK_FUNCS(mergesort) +AC_CHECK_FUNCS(mkstemps) + +dnl For mingw +AC_CHECK_LIB(iberty, getopt) AM_CONFIG_HEADER(config.h) diff --git a/doc/Makefile.in b/doc/Makefile.in index c636f1549..46a1ab838 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -89,6 +89,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -120,12 +121,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -142,23 +141,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/examples/Makefile.in b/examples/Makefile.in index 274218995..79973d077 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -84,6 +84,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -115,12 +116,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -137,23 +136,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/examples/clyx2asn1.pl b/examples/clyx2asn1.pl index 77251bf85..c1a26478b 100755 --- a/examples/clyx2asn1.pl +++ b/examples/clyx2asn1.pl @@ -1,10 +1,10 @@ -#!/usr/bin/perl +#!/usr/bin/env perl # # $Id$ # $Author$ # -# Simple tool that extracts known ASN.1 modules from the stream of LyX data. +# Simple tool to extract known ASN.1 modules from the stream of LyX data. # if($#ARGV == -1) { diff --git a/examples/crfc2asn1.pl b/examples/crfc2asn1.pl index 4a800f89a..745919486 100755 --- a/examples/crfc2asn1.pl +++ b/examples/crfc2asn1.pl @@ -1,11 +1,10 @@ -#!/usr/bin/perl +#!/usr/bin/env perl # # $Id$ # $Author$ # -# Simple tool that fetches the ASN.1 specifications from the -# given set of RFC files. +# Simple tool to fetch the ASN.1 specifications from the given set of RFC files. # diff --git a/libasn1compiler/Makefile.in b/libasn1compiler/Makefile.in index 70e363a96..3323458ae 100644 --- a/libasn1compiler/Makefile.in +++ b/libasn1compiler/Makefile.in @@ -99,6 +99,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -130,12 +131,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -152,23 +151,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/libasn1compiler/asn1c_compat.c b/libasn1compiler/asn1c_compat.c index a6e65781a..d89d7f1e1 100644 --- a/libasn1compiler/asn1c_compat.c +++ b/libasn1compiler/asn1c_compat.c @@ -13,6 +13,11 @@ #endif #endif +#ifdef HAVE_MKSTEMPS +#undef mkstemp +#define mkstemp(foo) mkstemps(foo, 0) +#endif + FILE * asn1c_open_file(const char *name, const char *ext, char **opt_tmpname) { int created = 1; diff --git a/libasn1fix/Makefile.in b/libasn1fix/Makefile.in index abae3fcb8..dd5c049d7 100644 --- a/libasn1fix/Makefile.in +++ b/libasn1fix/Makefile.in @@ -107,6 +107,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -138,12 +139,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -160,23 +159,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/libasn1parser/Makefile.in b/libasn1parser/Makefile.in index 822a73047..c0a8c8e27 100644 --- a/libasn1parser/Makefile.in +++ b/libasn1parser/Makefile.in @@ -106,6 +106,7 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -137,12 +138,10 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ YACC = @YACC@ -ac_ct_AR = @ac_ct_AR@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -159,23 +158,30 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ diff --git a/libasn1parser/expr-h.pl b/libasn1parser/expr-h.pl index ce916d7b7..8b1e08052 100755 --- a/libasn1parser/expr-h.pl +++ b/libasn1parser/expr-h.pl @@ -1,4 +1,4 @@ -#!/usr/bin/perl +#!/usr/bin/env perl print< Date: Tue, 2 Oct 2007 11:03:02 +0000 Subject: [PATCH 1378/1469] Fixed [1579558] (TZ longer than 64 chars on solaris, with FREEMEM redefined). git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1390 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/GeneralizedTime.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 653849a3e..10b73ad27 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -105,10 +105,13 @@ static long GMTOFF(struct tm a){ tzold = getenv("TZ"); \ if(tzold) { \ size_t tzlen = strlen(tzold); \ - if(tzlen < sizeof(tzoldbuf)) \ + if(tzlen < sizeof(tzoldbuf)) { \ tzold = memcpy(tzoldbuf, tzold, tzlen + 1); \ - else \ - tzold = strdup(tzold); /* Ignore error */ \ + } else { \ + char *dupptr = tzold; + tzold = MALLOC(tzlen + 1); \ + if(tzold) memcpy(tzold, dupptr, tzlen + 1); \ + } \ setenv("TZ", "UTC", 1); \ } \ tzset(); \ From f394b7f27430cd215407ad3ad647f1b696e6c01e Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 2 Oct 2007 11:23:24 +0000 Subject: [PATCH 1379/1469] missed backslash git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1391 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/GeneralizedTime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 10b73ad27..2f84dff93 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -108,7 +108,7 @@ static long GMTOFF(struct tm a){ if(tzlen < sizeof(tzoldbuf)) { \ tzold = memcpy(tzoldbuf, tzold, tzlen + 1); \ } else { \ - char *dupptr = tzold; + char *dupptr = tzold; \ tzold = MALLOC(tzlen + 1); \ if(tzold) memcpy(tzold, dupptr, tzlen + 1); \ } \ From fea6602591fa7bd899b9f875b327444536f8219c Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 6 Nov 2007 01:48:46 +0000 Subject: [PATCH 1380/1469] C90-compliant negative LONG_MIN git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1392 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_C.c | 17 +++++++------- libasn1compiler/asn1c_constraint.c | 22 +++++++++---------- libasn1compiler/asn1c_out.h | 17 ++++++++++++++ tests/90-cond-int-type-OK.asn1.-P | 6 ++--- .../90-cond-int-type-OK.asn1.-Pfnative-types | 6 ++--- tests/90-cond-int-type-OK.asn1.-Pgen-PER | 12 +++++----- 6 files changed, 49 insertions(+), 31 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index ef0c86884..e2b4401a1 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1859,8 +1859,7 @@ emit_single_member_PER_constraint(arg_t *arg, asn1cnst_range_t *range, int alpha if(lv > 0x7fffffff) { lv = 0x7fffffff; gcmt++; } if(rv > 0x7fffffff) { rv = 0x7fffffff; gcmt++; } if(gcmt) { - OUT("% " PRIdASN ", % " PRIdASN " }", - lv, rv); + OINTS(lv); OUT(", "); OINTS(rv); OUT(" }"); goto pcmt; } } @@ -1872,8 +1871,8 @@ emit_single_member_PER_constraint(arg_t *arg, asn1cnst_range_t *range, int alpha OUT("{ APC_SEMI_CONSTRAINED,\t-1, -1, "); } } - OUT("% " PRIdASN ", % " PRIdASN " }", - range->left.value, range->right.value); + OINTS(range->left.value); OUT(", "); + OINTS(range->right.value); OUT(" }"); } else { OUT("{ APC_UNCONSTRAINED,\t-1, -1, 0, 0 }"); } @@ -2129,12 +2128,14 @@ try_inline_default(arg_t *arg, asn1p_expr_t *expr, int out) { OUT("/* Install default value %" PRIdASN " */\n", expr->marker.default_value->value.v_integer); if(fits_long) { - OUT("*st = %" PRIdASN ";\n", - expr->marker.default_value->value.v_integer); + OUT("*st = "); + OINT(expr->marker.default_value->value.v_integer); + OUT(";\n"); OUT("return 0;\n"); } else { - OUT("return asn_long2INTEGER(st, %" PRIdASN ");\n", - expr->marker.default_value->value.v_integer); + OUT("return asn_long2INTEGER(st, "); + OINT(expr->marker.default_value->value.v_integer); + OUT(");\n"); } INDENT(-1); OUT("} else {\n"); diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index 1e2efa45f..ea9df8038 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -495,20 +495,20 @@ emit_range_comparison_code(arg_t *arg, asn1cnst_range_t *range, const char *varn } if(ignore_left) { - OUT("%s <= %" PRIdASN, varname, - r->right.value); + OUT("%s <= ", varname); + OINT(r->right.value); } else if(ignore_right) { - OUT("%s >= %" PRIdASN, varname, - r->left.value); + OUT("%s >= ", varname); + OINT(r->left.value); } else if(r->left.value == r->right.value) { - OUT("%s == %" PRIdASN, varname, - r->right.value); + OUT("%s == ", varname); + OINT(r->right.value); } else { - OUT("%s >= %" PRIdASN " && %s <= %" PRIdASN, - varname, - r->left.value, - varname, - r->right.value); + OUT("%s >= ", varname); + OINT(r->left.value); + OUT(" && "); + OUT("%s <= ", varname); + OINT(r->right.value); } if(r != range) OUT(")"); generated_something = 1; diff --git a/libasn1compiler/asn1c_out.h b/libasn1compiler/asn1c_out.h index 0523cbcfb..04d7ff2f2 100644 --- a/libasn1compiler/asn1c_out.h +++ b/libasn1compiler/asn1c_out.h @@ -108,4 +108,21 @@ int asn1c_compiled_output(arg_t *arg, const char *fmt, ...); REDIR(saved_target); \ } while(0) +/* + * Format LONG_MIN according to C90 rules. + */ +#define OINT(iv) do { \ + if(iv == (-2147483647L - 1)) \ + OUT("(-2147483647L - 1)"); \ + else \ + OUT("%" PRIdASN, iv); \ +} while(0) + +#define OINTS(iv) do { \ + if(iv == (-2147483647L - 1)) \ + OUT("(-2147483647L - 1)"); \ + else \ + OUT("% " PRIdASN, iv); \ +} while(0) + #endif /* _ASN1_COMPILED_OUTPUT_H_ */ diff --git a/tests/90-cond-int-type-OK.asn1.-P b/tests/90-cond-int-type-OK.asn1.-P index 431e42cee..5055e4d78 100644 --- a/tests/90-cond-int-type-OK.asn1.-P +++ b/tests/90-cond-int-type-OK.asn1.-P @@ -1754,7 +1754,7 @@ OK_IntegerInRange3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= -2147483648 && value <= 2147483647)) { + if((value >= (-2147483647L - 1) && value <= 2147483647)) { /* Constraint check succeeded */ return 0; } else { @@ -1895,7 +1895,7 @@ OK_IntegerInRange4_constraint(asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if(((value == -2147483648) || (value == 2147483647))) { + if(((value == (-2147483647L - 1)) || (value == 2147483647))) { /* Constraint check succeeded */ return 0; } else { @@ -2042,7 +2042,7 @@ OK_IntegerInRange5_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - if(((value == -2147483648) || (value == 2147483647))) { + if(((value == (-2147483647L - 1)) || (value == 2147483647))) { /* Constraint check succeeded */ return 0; } else { diff --git a/tests/90-cond-int-type-OK.asn1.-Pfnative-types b/tests/90-cond-int-type-OK.asn1.-Pfnative-types index 344c89a08..461e5eb5f 100644 --- a/tests/90-cond-int-type-OK.asn1.-Pfnative-types +++ b/tests/90-cond-int-type-OK.asn1.-Pfnative-types @@ -1741,7 +1741,7 @@ OK_IntegerInRange3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= -2147483648 && value <= 2147483647)) { + if((value >= (-2147483647L - 1) && value <= 2147483647)) { /* Constraint check succeeded */ return 0; } else { @@ -1882,7 +1882,7 @@ OK_IntegerInRange4_constraint(asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if(((value == -2147483648) || (value == 2147483647))) { + if(((value == (-2147483647L - 1)) || (value == 2147483647))) { /* Constraint check succeeded */ return 0; } else { @@ -2023,7 +2023,7 @@ OK_IntegerInRange5_constraint(asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if(((value == -2147483648) || (value == 2147483647))) { + if(((value == (-2147483647L - 1)) || (value == 2147483647))) { /* Constraint check succeeded */ return 0; } else { diff --git a/tests/90-cond-int-type-OK.asn1.-Pgen-PER b/tests/90-cond-int-type-OK.asn1.-Pgen-PER index c7e90db24..d7957cbae 100644 --- a/tests/90-cond-int-type-OK.asn1.-Pgen-PER +++ b/tests/90-cond-int-type-OK.asn1.-Pgen-PER @@ -2060,7 +2060,7 @@ OK_IntegerInRange3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if((value >= -2147483648 && value <= 2147483647)) { + if((value >= (-2147483647L - 1) && value <= 2147483647)) { /* Constraint check succeeded */ return 0; } else { @@ -2155,7 +2155,7 @@ OK_IntegerInRange3_encode_uper(asn_TYPE_descriptor_t *td, /*** <<< CTDEFS [OK-IntegerInRange3] >>> ***/ static asn_per_constraints_t asn_PER_type_OK_IntegerInRange3_constr_1 = { - { APC_CONSTRAINED, 32, -1, -2147483648, 2147483647 } /* (-2147483648..2147483647) */, + { APC_CONSTRAINED, 32, -1, (-2147483647L - 1), 2147483647 } /* (-2147483648..2147483647) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; @@ -2227,7 +2227,7 @@ OK_IntegerInRange4_constraint(asn_TYPE_descriptor_t *td, const void *sptr, value = *(const long *)sptr; - if(((value == -2147483648) || (value == 2147483647))) { + if(((value == (-2147483647L - 1)) || (value == 2147483647))) { /* Constraint check succeeded */ return 0; } else { @@ -2322,7 +2322,7 @@ OK_IntegerInRange4_encode_uper(asn_TYPE_descriptor_t *td, /*** <<< CTDEFS [OK-IntegerInRange4] >>> ***/ static asn_per_constraints_t asn_PER_type_OK_IntegerInRange4_constr_1 = { - { APC_CONSTRAINED, 32, -1, -2147483648, 2147483647 } /* (-2147483648..2147483647) */, + { APC_CONSTRAINED, 32, -1, (-2147483647L - 1), 2147483647 } /* (-2147483648..2147483647) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; @@ -2400,7 +2400,7 @@ OK_IntegerInRange5_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - if(((value == -2147483648) || (value == 2147483647))) { + if(((value == (-2147483647L - 1)) || (value == 2147483647))) { /* Constraint check succeeded */ return 0; } else { @@ -2495,7 +2495,7 @@ OK_IntegerInRange5_encode_uper(asn_TYPE_descriptor_t *td, /*** <<< CTDEFS [OK-IntegerInRange5] >>> ***/ static asn_per_constraints_t asn_PER_type_OK_IntegerInRange5_constr_1 = { - { APC_CONSTRAINED | APC_EXTENSIBLE, 32, -1, -2147483648, 2147483647 } /* (-2147483648..2147483647,...) */, + { APC_CONSTRAINED | APC_EXTENSIBLE, 32, -1, (-2147483647L - 1), 2147483647 } /* (-2147483648..2147483647,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; From 126a4557bb953da71eefd369c81ed15f475aee49 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 6 Nov 2007 02:35:13 +0000 Subject: [PATCH 1381/1469] 32-bit integer decode/encode in per git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1393 59561ff5-6e30-0410-9f3c-9617f08c8826 --- .../tests/check-127.-fnative-types.-gen-PER.c | 69 +++++++++++++++++++ skeletons/INTEGER.c | 26 +++++-- tests/127-per-long-OK.asn1 | 19 +++++ 3 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 asn1c/tests/check-127.-fnative-types.-gen-PER.c create mode 100644 tests/127-per-long-OK.asn1 diff --git a/asn1c/tests/check-127.-fnative-types.-gen-PER.c b/asn1c/tests/check-127.-fnative-types.-gen-PER.c new file mode 100644 index 000000000..9cca644b6 --- /dev/null +++ b/asn1c/tests/check-127.-fnative-types.-gen-PER.c @@ -0,0 +1,69 @@ +#undef NDEBUG +#include +#include +#include +#include +#include +#include +#include + +#include + +void +verify(T_t *ti) { + asn_enc_rval_t er; + asn_dec_rval_t rv; + unsigned char buf[8]; + T_t *to = 0; + + fprintf(stderr, "IN: { %ld, %ld }\n", + ti->small32range, ti->full32range); + + er = uper_encode_to_buffer(&asn_DEF_T, ti, buf, sizeof buf); + assert(er.encoded == 64); + + rv = uper_decode(0, &asn_DEF_T, (void *)&to, buf, sizeof buf, 0, 0); + assert(rv.code == RC_OK); + + fprintf(stderr, "ENC: %2x%2x%2x%2x %2x%2x%2x%2x\n", + buf[0], buf[1], buf[2], buf[3], + buf[4], buf[5], buf[6], buf[7]); + fprintf(stderr, "OUT: { %ld, %ld } vs { %ld, %ld }\n", + ti->small32range, ti->full32range, + to->small32range, to->full32range); + assert(ti->small32range == to->small32range); + assert(ti->full32range == to->full32range); + + xer_fprint(stderr, &asn_DEF_T, ti); + xer_fprint(stderr, &asn_DEF_T, to); +} + +int main() { + T_t ti; + + ti.small32range = 0; + ti.full32range = 0; + verify(&ti); + + ti.small32range = -1; + ti.full32range = -1; + verify(&ti); + + ti.small32range = -2000000000; + ti.full32range = (-2147483647L - 1); + verify(&ti); + + ti.small32range = -1999999999; + ti.full32range = (-2147483647L); + verify(&ti); + + ti.small32range = 2000000000; + ti.full32range = 2147483647; + verify(&ti); + + ti.small32range = 1999999999; + ti.full32range = 2147483647 - 1; + verify(&ti); + + return 0; +} diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 0cbbbaab1..60afa77f7 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -598,8 +598,18 @@ INTEGER_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, /* #10.5.6 */ ASN_DEBUG("Integer with range %d bits", ct->range_bits); if(ct->range_bits >= 0) { - long value = per_get_few_bits(pd, ct->range_bits); - if(value < 0) _ASN_DECODE_STARVED; + long value; + if(ct->range_bits == 32) { + long lhalf; + value = per_get_few_bits(pd, 16); + if(value < 0) _ASN_DECODE_STARVED; + lhalf = per_get_few_bits(pd, 16); + if(lhalf < 0) _ASN_DECODE_STARVED; + value = (value << 16) | lhalf; + } else { + value = per_get_few_bits(pd, ct->range_bits); + if(value < 0) _ASN_DECODE_STARVED; + } ASN_DEBUG("Got value %ld + low %ld", value, ct->lower_bound); value += ct->lower_bound; @@ -695,9 +705,17 @@ INTEGER_encode_uper(asn_TYPE_descriptor_t *td, /* #10.5.6 */ ASN_DEBUG("Encoding integer with range %d bits", ct->range_bits); - if(per_put_few_bits(po, value - ct->lower_bound, + if(ct->range_bits == 32) { + /* TODO: extend to >32 bits */ + long v = value - ct->lower_bound; + if(per_put_few_bits(po, v >> 1, 31) + || per_put_few_bits(po, v, 1)) + _ASN_ENCODE_FAILED; + } else { + if(per_put_few_bits(po, value - ct->lower_bound, ct->range_bits)) - _ASN_ENCODE_FAILED; + _ASN_ENCODE_FAILED; + } _ASN_ENCODED_OK(er); } diff --git a/tests/127-per-long-OK.asn1 b/tests/127-per-long-OK.asn1 new file mode 100644 index 000000000..61d89aaea --- /dev/null +++ b/tests/127-per-long-OK.asn1 @@ -0,0 +1,19 @@ + +-- OK: Everything is fine + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .127 + +ModulePERLong + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 127 } + DEFINITIONS AUTOMATIC TAGS ::= +BEGIN + + T ::= SEQUENCE { + small32range INTEGER (-2000000000..2000000000), + full32range INTEGER (-2147483648..2147483647) + } + +END From b6053b4d88be6356c34dc288bd06a4cbc21e322d Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 6 Nov 2007 06:23:31 +0000 Subject: [PATCH 1382/1469] unsigned long support: conversion routines git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1394 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/INTEGER.c | 59 ++++++++++++++++++++++++- skeletons/INTEGER.h | 2 + skeletons/asn_system.h | 1 + skeletons/tests/check-INTEGER.c | 77 +++++++++++++++++++++++++++++++++ 4 files changed, 138 insertions(+), 1 deletion(-) diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 60afa77f7..7fe3e84db 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2003, 2004, 2005, 2006 Lev Walkin . + * Copyright (c) 2003, 2004, 2005, 2006, 2007 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ @@ -797,6 +797,63 @@ asn_INTEGER2long(const INTEGER_t *iptr, long *lptr) { return 0; } +int +asn_INTEGER2ulong(const INTEGER_t *iptr, unsigned long *lptr) { + uint8_t *b, *end; + unsigned long l; + size_t size; + + if(!iptr || !iptr->buf || !lptr) { + errno = EINVAL; + return -1; + } + + b = iptr->buf; + size = iptr->size; + end = b + size; + + /* If all extra leading bytes are zeroes, ignore them */ + for(; size > sizeof(unsigned long); b++, size--) { + if(*b) { + /* Value won't fit unsigned long */ + errno = ERANGE; + return -1; + } + } + + /* Conversion engine */ + for(l = 0; b < end; b++) + l = (l << 8) | *b; + + *lptr = l; + return 0; +} + +int +asn_ulong2INTEGER(INTEGER_t *st, unsigned long value) { + uint8_t *buf; + uint8_t *end; + uint8_t *b; + int shr; + + if(value <= LONG_MAX) + return asn_long2INTEGER(st, value); + + buf = (uint8_t *)MALLOC(1 + sizeof(value)); + if(!buf) return -1; + + end = buf + (sizeof(value) + 1); + buf[0] = 0; + for(b = buf, shr = (sizeof(long)-1)*8; b < end; shr -= 8) + *(++b) = value >> shr; + + if(st->buf) FREEMEM(st->buf); + st->buf = buf; + st->size = 1 + sizeof(value); + + return 0; +} + int asn_long2INTEGER(INTEGER_t *st, long value) { uint8_t *buf, *bp; diff --git a/skeletons/INTEGER.h b/skeletons/INTEGER.h index 62832b12e..b87c794c0 100644 --- a/skeletons/INTEGER.h +++ b/skeletons/INTEGER.h @@ -51,7 +51,9 @@ per_type_encoder_f INTEGER_encode_uper; * -1/ENOMEM: Memory allocation failed (in asn_long2INTEGER()). */ int asn_INTEGER2long(const INTEGER_t *i, long *l); +int asn_INTEGER2ulong(const INTEGER_t *i, unsigned long *l); int asn_long2INTEGER(INTEGER_t *i, long l); +int asn_ulong2INTEGER(INTEGER_t *i, unsigned long l); /* * Convert the integer value into the corresponding enumeration map entry. diff --git a/skeletons/asn_system.h b/skeletons/asn_system.h index fe696454e..193a97506 100644 --- a/skeletons/asn_system.h +++ b/skeletons/asn_system.h @@ -17,6 +17,7 @@ #include /* For *alloc(3) */ #include /* For memcpy(3) */ #include /* For size_t */ +#include /* For LONG_MAX */ #include /* For va_start */ #include /* for offsetof and ptrdiff_t */ diff --git a/skeletons/tests/check-INTEGER.c b/skeletons/tests/check-INTEGER.c index bacb618e7..a299fcd58 100644 --- a/skeletons/tests/check-INTEGER.c +++ b/skeletons/tests/check-INTEGER.c @@ -74,6 +74,74 @@ check(uint8_t *buf, int size, long check_long, int check_ret) { } } +static void +check_unsigned(uint8_t *buf, int size, unsigned long check_long, int check_ret) { + char scratch[128]; + char verify[32]; + INTEGER_t val; + uint8_t *buf_end = buf + size; + int ret; + unsigned long rlong = 123; + + assert(buf); + assert(size >= 0); + + val.buf = buf; + val.size = size; + + printf("Testing: ["); + for(; buf < buf_end; buf++) { + if(buf != val.buf) printf(":"); + printf("%02x", *buf); + } + printf("]: "); + + ret = asn_INTEGER2ulong(&val, &rlong); + printf(" (%lu, %d) vs (%lu, %d)\n", + rlong, ret, check_long, check_ret); + assert(ret == check_ret); + printf("%lu %lu\n", rlong, check_long); + assert(rlong == check_long); + + if(check_ret == 0) { + INTEGER_t val2; + unsigned long rlong2; + val2.buf = 0; + val2.size = 0; + ret = asn_ulong2INTEGER(&val2, rlong); + assert(ret == 0); + assert(val2.buf); + if(val2.size > val.size) { + /* At least as compact */ + printf("val2.size=%d, val.size=%d\n", + (int)val2.size, (int)val.size); + assert(val2.size <= val.size); + } + ret = asn_INTEGER2ulong(&val, &rlong2); + assert(ret == 0); + assert(rlong == rlong2); + } + + return 0; + + shared_scratch_start = scratch; + ret = INTEGER_print(&asn_DEF_INTEGER, &val, 0, _print2buf, scratch); + assert(shared_scratch_start < scratch + sizeof(scratch)); + assert(ret == 0); + ret = snprintf(verify, sizeof(verify), "%ld", check_long); + assert(ret < sizeof(verify)); + ret = strcmp(scratch, verify); + printf(" [%s] vs [%s]: %d%s\n", + scratch, verify, ret, + (check_ret == -1)?" (expected to fail)":"" + ); + if(check_ret == -1) { + assert(strcmp(scratch, verify)); + } else { + assert(strcmp(scratch, verify) == 0); + } +} + static void check_xer(int tofail, char *xmldata, long orig_value) { INTEGER_t *st = 0; @@ -117,6 +185,11 @@ main(int ac, char **av) { uint8_t buf11[] = { 0x80, 0, 0, 0 }; uint8_t buf12[] = { 0x80, 0 }; uint8_t buf13[] = { 0x80 }; + uint8_t buf14[] = { 0x00, 0x80, 0x00, 0x00 }; + uint8_t buf15[] = { 0x00, 0x80, 0x00, 0x00, 0x00 }; + uint8_t buf16[] = { 0x00, 0xff, 0xff, 0x00, 0x00 }; + +#define UCHECK(buf, val, ret) check_unsigned(buf, sizeof(buf), val, ret) #define CHECK(buf, val, ret) check(buf, sizeof(buf), val, ret) @@ -130,9 +203,13 @@ main(int ac, char **av) { CHECK(buf8, 0x7F7E7D7C, 0); CHECK(buf9, 0x7F7E7D7C, 0); CHECK(buf10, 0x7F7E7D7C, 0); + UCHECK(buf10, 0x7F7E7D7C, 0); CHECK(buf11, -2147483647-1, 0); /* 0x80000000 */ CHECK(buf12, -32768, 0); CHECK(buf13, -128, 0); + UCHECK(buf14, 0x800000, 0); + UCHECK(buf15, 0x80000000, 0); + UCHECK(buf16, 0xffff0000, 0); check_xer(-1, "", 0); check_xer(-1, "", 0); From 55c3274824a1c37373c30098936372d639276689 Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 10 Nov 2007 02:05:23 +0000 Subject: [PATCH 1383/1469] problem reported by ExtraHop networks git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1395 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/INTEGER.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 7fe3e84db..3a548e671 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -576,6 +576,8 @@ INTEGER_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } FREEMEM(st->buf); + st->buf = 0; + st->size = 0; if(ct) { if(ct->flags & APC_SEMI_CONSTRAINED) { st->buf = (uint8_t *)CALLOC(1, 2); @@ -586,11 +588,7 @@ INTEGER_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, st->buf = (uint8_t *)MALLOC(1 + size + 1); if(!st->buf) _ASN_DECODE_FAILED; st->size = size; - } else { - st->size = 0; } - } else { - st->size = 0; } /* X.691, #12.2.2 */ From bbccfff63a93cc3bb6194077c418181e619a4663 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 13 Nov 2007 05:09:35 +0000 Subject: [PATCH 1384/1469] stdint only if not specifying types directly git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1396 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_system.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/skeletons/asn_system.h b/skeletons/asn_system.h index 193a97506..39a1f9e60 100644 --- a/skeletons/asn_system.h +++ b/skeletons/asn_system.h @@ -24,7 +24,6 @@ #ifdef WIN32 #include -#include #define snprintf _snprintf #define vsnprintf _vsnprintf @@ -52,6 +51,8 @@ typedef unsigned int uint32_t; #define finite _finite #define copysign _copysign #define ilogb _logb +#else /* !_MSC_VER */ +#include #endif /* _MSC_VER */ #else /* !WIN32 */ From 4bd42eb585375ba1fbb4476545e66f5c320aa8a1 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 13 Nov 2007 22:29:18 +0000 Subject: [PATCH 1385/1469] Windows patch by Cyril Pertsev git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1397 59561ff5-6e30-0410-9f3c-9617f08c8826 --- asn1c/webcgi/asn1c-suid-helper.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/asn1c/webcgi/asn1c-suid-helper.c b/asn1c/webcgi/asn1c-suid-helper.c index 9a878fe89..a334f1f2c 100644 --- a/asn1c/webcgi/asn1c-suid-helper.c +++ b/asn1c/webcgi/asn1c-suid-helper.c @@ -6,6 +6,14 @@ #include #include +#ifdef WIN32 +#define setuid(s) +#define getuid() +#define setgid(s) +#define getgid() +#define chroot(p) (-1) +#endif + /* * This program chroots into a given directory, * then executes the asn1c command with strict arguments checking. From ac1d02962234fa6733fa27cb3aa7ddafa26ecd2c Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 13 Nov 2007 22:30:09 +0000 Subject: [PATCH 1386/1469] Windows patch by Cyril Pertsev git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1398 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1compiler/asn1c_compat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libasn1compiler/asn1c_compat.c b/libasn1compiler/asn1c_compat.c index d89d7f1e1..17dd90689 100644 --- a/libasn1compiler/asn1c_compat.c +++ b/libasn1compiler/asn1c_compat.c @@ -7,7 +7,7 @@ #ifndef DEFFILEMODE /* Normally in */ #ifdef WIN32 -#define DEFFILEMODE 0 +#define DEFFILEMODE (S_IREAD|S_IWRITE) #else #define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) #endif From 1f8c3e0d10a13094a6b726f65621fee97ae1b2b9 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 13 Nov 2007 23:32:38 +0000 Subject: [PATCH 1387/1469] ASSUMESTDTYPES git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1399 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/asn_system.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/skeletons/asn_system.h b/skeletons/asn_system.h index 39a1f9e60..0a9b092c3 100644 --- a/skeletons/asn_system.h +++ b/skeletons/asn_system.h @@ -37,6 +37,7 @@ #ifndef __cplusplus #define inline __inline #endif +#ifndef ASSUMESTDTYPES /* Standard types have been defined elsewhere */ #define ssize_t SSIZE_T typedef char int8_t; typedef short int16_t; @@ -44,6 +45,7 @@ typedef int int32_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; +#endif /* ASSUMESTDTYPES */ #define WIN32_LEAN_AND_MEAN #include #include From 3811ffc9c3262340907c22f22f0546d0408837c0 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 13 Nov 2007 23:53:13 +0000 Subject: [PATCH 1388/1469] remove MSVC warnings git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1400 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/INTEGER.c | 6 +++--- skeletons/NativeInteger.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 3a548e671..a51dd11b8 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -384,7 +384,7 @@ INTEGER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chun case ST_HEXDIGIT2: value += (lv - 0x30); state = ST_HEXCOLON; - st->buf[st->size++] = value; + st->buf[st->size++] = (uint8_t)value; continue; case ST_HEXCOLON: return XPBD_BROKEN_ENCODING; @@ -467,7 +467,7 @@ INTEGER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chun case ST_HEXDIGIT2: value += lv - ((lv < 0x61) ? 0x41 : 0x61); value += 10; - st->buf[st->size++] = value; + st->buf[st->size++] = (uint8_t)value; state = ST_HEXCOLON; continue; case ST_DIGITS: @@ -843,7 +843,7 @@ asn_ulong2INTEGER(INTEGER_t *st, unsigned long value) { end = buf + (sizeof(value) + 1); buf[0] = 0; for(b = buf, shr = (sizeof(long)-1)*8; b < end; shr -= 8) - *(++b) = value >> shr; + *(++b) = (uint8_t)(value >> shr); if(st->buf) FREEMEM(st->buf); st->buf = buf; diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index 34599f618..b251ee7a7 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -145,7 +145,7 @@ NativeInteger_encode_der(asn_TYPE_descriptor_t *sd, void *ptr, /* Prepare a fake INTEGER */ for(p = buf + sizeof(buf) - 1; p >= buf; p--, native >>= 8) - *p = native; + *p = (uint8_t)native; tmp.buf = buf; tmp.size = sizeof(buf); From 12164c45ff53facc3a379d64902a1d2c7cc926e7 Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 3 Dec 2007 13:41:36 +0000 Subject: [PATCH 1389/1469] unsigned integer of 32-bit widtth support for per git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1401 59561ff5-6e30-0410-9f3c-9617f08c8826 --- .../tests/check-127.-fnative-types.-gen-PER.c | 48 +- libasn1compiler/asn1c_C.c | 32 +- libasn1compiler/asn1c_constraint.c | 61 ++- libasn1compiler/asn1c_misc.c | 17 +- libasn1compiler/asn1c_misc.h | 6 +- skeletons/INTEGER.c | 58 +- skeletons/INTEGER.h | 2 + skeletons/NativeEnumerated.c | 2 +- skeletons/NativeInteger.c | 30 +- tests/110-param-3-OK.asn1.-P | 4 +- tests/127-per-long-OK.asn1 | 4 +- tests/127-per-long-OK.asn1.-Pgen-PER | 507 ++++++++++++++++++ tests/42-real-life-OK.asn1.-PR | 4 +- tests/50-constraint-OK.asn1.-P | 12 +- tests/50-constraint-OK.asn1.-Pgen-PER | 12 +- tests/66-ref-simple-OK.asn1.-P | 4 +- tests/70-xer-test-OK.asn1.-P | 12 +- tests/73-circular-OK.asn1.-P | 4 +- tests/90-cond-int-type-OK.asn1.-P | 199 ++++--- .../90-cond-int-type-OK.asn1.-Pfnative-types | 199 ++++--- tests/90-cond-int-type-OK.asn1.-Pgen-PER | 199 ++++--- 21 files changed, 1036 insertions(+), 380 deletions(-) create mode 100644 tests/127-per-long-OK.asn1.-Pgen-PER diff --git a/asn1c/tests/check-127.-fnative-types.-gen-PER.c b/asn1c/tests/check-127.-fnative-types.-gen-PER.c index 9cca644b6..34b6d748f 100644 --- a/asn1c/tests/check-127.-fnative-types.-gen-PER.c +++ b/asn1c/tests/check-127.-fnative-types.-gen-PER.c @@ -9,30 +9,36 @@ #include -void -verify(T_t *ti) { +static void +verify(int testNo, T_t *ti) { asn_enc_rval_t er; asn_dec_rval_t rv; - unsigned char buf[8]; + unsigned char buf[16]; T_t *to = 0; - fprintf(stderr, "IN: { %ld, %ld }\n", - ti->small32range, ti->full32range); + fprintf(stderr, "%d IN: { %ld, %ld, %lu, %lu }\n", testNo, + ti->small32range, ti->full32range, + ti->unsigned32, ti->unsplit32); er = uper_encode_to_buffer(&asn_DEF_T, ti, buf, sizeof buf); - assert(er.encoded == 64); + assert(er.encoded == 8 * sizeof(buf)); rv = uper_decode(0, &asn_DEF_T, (void *)&to, buf, sizeof buf, 0, 0); assert(rv.code == RC_OK); - fprintf(stderr, "ENC: %2x%2x%2x%2x %2x%2x%2x%2x\n", + fprintf(stderr, "%d ENC: %2x%2x%2x%2x %2x%2x%2x%2x\n", testNo, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); - fprintf(stderr, "OUT: { %ld, %ld } vs { %ld, %ld }\n", + fprintf(stderr, "%d OUT: { %ld, %ld, %lu, %lu } vs { %ld, %ld, %lu, %lu }\n", + testNo, ti->small32range, ti->full32range, - to->small32range, to->full32range); + ti->unsigned32, ti->unsplit32, + to->small32range, to->full32range, + to->unsigned32, to->unsplit32); assert(ti->small32range == to->small32range); assert(ti->full32range == to->full32range); + assert(ti->unsigned32 == to->unsigned32); + assert(ti->unsplit32 == to->unsplit32); xer_fprint(stderr, &asn_DEF_T, ti); xer_fprint(stderr, &asn_DEF_T, to); @@ -43,27 +49,39 @@ int main() { ti.small32range = 0; ti.full32range = 0; - verify(&ti); + ti.unsigned32 = 0; + ti.unsplit32 = 5; + verify(1, &ti); ti.small32range = -1; ti.full32range = -1; - verify(&ti); + ti.unsigned32 = 1; + ti.unsplit32 = 300; + verify(2, &ti); ti.small32range = -2000000000; ti.full32range = (-2147483647L - 1); - verify(&ti); + ti.unsigned32 = 4000000000; + ti.unsplit32 = 500; + verify(3, &ti); ti.small32range = -1999999999; ti.full32range = (-2147483647L); - verify(&ti); + ti.unsigned32 = 4294967295UL; + ti.unsplit32 = 600; + verify(4, &ti); ti.small32range = 2000000000; ti.full32range = 2147483647; - verify(&ti); + ti.unsigned32 = 4294967295UL - 100; + ti.unsplit32 = 4294967290UL; + verify(5, &ti); ti.small32range = 1999999999; ti.full32range = 2147483647 - 1; - verify(&ti); + ti.unsigned32 = 4294967295UL - 1; + ti.unsplit32 = 4294967290UL - 1; + verify(6, &ti); return 0; } diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index e2b4401a1..be7f059af 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -222,9 +222,28 @@ asn1c_lang_C_type_common_INTEGER(arg_t *arg) { OUT("0,\t/* Enumeration is not extensible */\n"); } if(expr->expr_type == ASN_BASIC_ENUMERATED) - OUT("1\t/* Strict enumeration */\n"); + OUT("1,\t/* Strict enumeration */\n"); else - OUT("0\n"); + OUT("0,\n"); + OUT("0,\t/* Native long size */\n"); + OUT("0\n"); + INDENT(-1); + OUT("};\n"); + } + + if(expr->expr_type == ASN_BASIC_INTEGER + && asn1c_type_fits_long(arg, expr) == FL_FITS_UNSIGN) { + REDIR(OT_STAT_DEFS); + OUT("static asn_INTEGER_specifics_t asn_SPC_%s_specs_%d = {\n", + MKID(expr), expr->_type_unique_index); + INDENT(+1); + OUT("0,\t"); + OUT("0,\t"); + OUT("0,\t"); + OUT("0,\t"); + OUT("0,\n"); + OUT("0,\t/* Native long size */\n"); + OUT("1\t/* Unsigned representation */\n"); INDENT(-1); OUT("};\n"); } @@ -1112,7 +1131,10 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { if((expr->expr_type == ASN_BASIC_ENUMERATED) || (0 /* -- prohibited by X.693:8.3.4 */ && expr->expr_type == ASN_BASIC_INTEGER - && expr_elements_count(arg, expr))) + && expr_elements_count(arg, expr)) + || (expr->expr_type == ASN_BASIC_INTEGER + && asn1c_type_fits_long(arg, expr) == FL_FITS_UNSIGN) + ) etd_spec = ETD_HAS_SPECIFICS; else etd_spec = ETD_NO_SPECIFICS; @@ -2289,7 +2311,9 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { || expr->expr_type == ASN_BASIC_ENUMERATED || (0 /* -- prohibited by X.693:8.3.4 */ && expr->expr_type == ASN_BASIC_INTEGER - && expr_elements_count(arg, expr)); + && expr_elements_count(arg, expr)) + || (expr->expr_type == ASN_BASIC_INTEGER + && asn1c_type_fits_long(arg, expr) == FL_FITS_UNSIGN); if(C99_MODE) OUT(".type = "); OUT("&asn_DEF_"); if(complex_contents) { diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index ea9df8038..2b1420e81 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -12,6 +12,7 @@ static int emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype, as static int emit_size_determination_code(arg_t *arg, asn1p_expr_type_e etype); static asn1p_expr_type_e _find_terminal_type(arg_t *arg); static int emit_range_comparison_code(arg_t *arg, asn1cnst_range_t *range, const char *varname, asn1c_integer_t natural_start, asn1c_integer_t natural_stop); +static int native_long_sign(asn1cnst_range_t *r); /* -1, 0, 1 */ int asn1c_emit_constraint_checking_code(arg_t *arg) { @@ -91,7 +92,11 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { switch(etype) { case ASN_BASIC_INTEGER: case ASN_BASIC_ENUMERATED: - OUT("long value;\n"); + if(native_long_sign(r_value) >= 0) { + OUT("unsigned long value;\n"); + } else { + OUT("long value;\n"); + } break; case ASN_BASIC_REAL: OUT("double value;\n"); @@ -132,6 +137,19 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { REDIR(OT_CODE); INDENT(+1); + /* + * Optimization for unsigned longs. + */ + if(!r_size && r_value + && (etype == ASN_BASIC_INTEGER + || etype == ASN_BASIC_ENUMERATED) + && native_long_sign(r_value) == 0) { + OUT("\n"); + OUT("/* Constraint check succeeded */\n"); + OUT("return 0;\n"); + return 0; + } + /* * Here is an if() {} else {} consrtaint checking code. */ @@ -578,9 +596,15 @@ emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype, asn1cnst_rang switch(etype) { case ASN_BASIC_INTEGER: case ASN_BASIC_ENUMERATED: - if(asn1c_type_fits_long(arg, arg->expr) != FL_NOTFIT) { + if(asn1c_type_fits_long(arg, arg->expr) == FL_FITS_UNSIGN) { + OUT("value = *(const unsigned long *)sptr;\n"); + } else if(asn1c_type_fits_long(arg, arg->expr) != FL_NOTFIT) { OUT("value = *(const long *)sptr;\n"); } else { + /* + * In some cases we can explore our knowledge of + * underlying INTEGER_t->buf format. + */ if(r_value->el_count == 0 && ( /* Speed-up common case: (0..MAX) */ @@ -598,14 +622,26 @@ emit_value_determination_code(arg_t *arg, asn1p_expr_type_e etype, asn1cnst_rang break; } - OUT("if(asn_INTEGER2long(st, &value)) {\n"); + if(native_long_sign(r_value) >= 0) { + /* Special case for treating unsigned longs */ + OUT("if(asn_INTEGER2ulong(st, &value)) {\n"); INDENT(+1); OUT("_ASN_CTFAIL(app_key, td, sptr,\n"); OUT("\t\"%%s: value too large (%%s:%%d)\",\n"); OUT("\ttd->name, __FILE__, __LINE__);\n"); OUT("return -1;\n"); INDENT(-1); - OUT("}\n"); + OUT("}\n"); + } else { + OUT("if(asn_INTEGER2long(st, &value)) {\n"); + INDENT(+1); + OUT("_ASN_CTFAIL(app_key, td, sptr,\n"); + OUT("\t\"%%s: value too large (%%s:%%d)\",\n"); + OUT("\ttd->name, __FILE__, __LINE__);\n"); + OUT("return -1;\n"); + INDENT(-1); + OUT("}\n"); + } } break; case ASN_BASIC_REAL: @@ -652,3 +688,20 @@ _find_terminal_type(arg_t *arg) { return A1TC_INVALID; } +static int +native_long_sign(asn1cnst_range_t *r) { + if(r->left.type == ARE_VALUE + && r->left.value >= 0 + && r->right.type == ARE_VALUE + && r->right.value > 2147483647UL + && r->right.value <= 4294967295UL) { + if(r->el_count == 0 + && r->left.value == 0 + && r->right.value == 4294967295UL) + return 0; + else + return 1; + } else { + return -1; + } +} diff --git a/libasn1compiler/asn1c_misc.c b/libasn1compiler/asn1c_misc.c index 543a165b3..f48ab081e 100644 --- a/libasn1compiler/asn1c_misc.c +++ b/libasn1compiler/asn1c_misc.c @@ -215,6 +215,8 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { case TNF_RSAFE: if(expr->expr_type == ASN_BASIC_REAL) return "double"; + else if(asn1c_type_fits_long(arg, expr) == FL_FITS_UNSIGN) + return "unsigned long"; else return "long"; default: @@ -278,7 +280,7 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { /* * Check whether the specified INTEGER or ENUMERATED type can be represented - * using the generic 'long' type. + * using the generic 'long' or 'unsigned long' type. */ enum asn1c_fitslong_e asn1c_type_fits_long(arg_t *arg, asn1p_expr_t *expr) { @@ -339,7 +341,7 @@ asn1c_type_fits_long(arg_t *arg, asn1p_expr_t *expr) { right = range->right; /* Use 4 instead of sizeof(long) is justified! */ if(right.type == ARE_VALUE && right.value <= 4) - return FL_FITSOK; + return FL_FITS_SIGNED; } asn1constraint_range_free(range); } @@ -364,6 +366,15 @@ asn1c_type_fits_long(arg_t *arg, asn1p_expr_t *expr) { right = range->right; asn1constraint_range_free(range); + /* Special case for unsigned */ + if(left.type == ARE_VALUE + && left.value >= 0 + && right.type == ARE_VALUE + && right.value > 2147483647 + && right.value <= 4294967295UL) + return FL_FITS_UNSIGN; + + /* If some fixed value is outside of target range, not fit */ if(left.type == ARE_VALUE && (left.value < LEFTMIN || left.value > RIGHTMAX)) @@ -378,6 +389,6 @@ asn1c_type_fits_long(arg_t *arg, asn1p_expr_t *expr) { ? FL_FORCED : FL_NOTFIT; } - return FL_FITSOK; + return FL_FITS_SIGNED; } diff --git a/libasn1compiler/asn1c_misc.h b/libasn1compiler/asn1c_misc.h index b14a1555b..6e2acb516 100644 --- a/libasn1compiler/asn1c_misc.h +++ b/libasn1compiler/asn1c_misc.h @@ -30,12 +30,14 @@ char *asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format); * using the generic 'long' type. * Return values: * FL_NOTFIT: No, it cannot be represented using long. - * FL_FITSOK: It can be represented using long. + * FL_FITS_SIGNED: It can be represented using signed long. + * FL_FITS_UNSIGN: It can be represented using unsigned long. * FL_FORCED: Probably can't, but -fnative-types is in force. */ enum asn1c_fitslong_e { FL_NOTFIT, - FL_FITSOK, + FL_FITS_SIGNED, + FL_FITS_UNSIGN, FL_FORCED, }; enum asn1c_fitslong_e asn1c_type_fits_long(arg_t *arg, asn1p_expr_t *expr); diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index a51dd11b8..54a402b3c 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -158,7 +158,9 @@ INTEGER__dump(asn_TYPE_descriptor_t *td, const INTEGER_t *st, asn_app_consume_by } else { scrsize = sizeof(scratch); scr = scratch; - ret = snprintf(scr, scrsize, "%ld", accum); + ret = snprintf(scr, scrsize, + (specs && specs->field_unsigned) + ?"%lu":"%ld", accum); } assert(ret > 0 && (size_t)ret < scrsize); return (cb(scr, ret, app_key) < 0) ? -1 : ret; @@ -554,6 +556,7 @@ INTEGER_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, asn_dec_rval_t INTEGER_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; asn_dec_rval_t rval = { RC_OK, 0 }; INTEGER_t *st = (INTEGER_t *)*sptr; asn_per_constraint_t *ct; @@ -611,7 +614,9 @@ INTEGER_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ASN_DEBUG("Got value %ld + low %ld", value, ct->lower_bound); value += ct->lower_bound; - if(asn_long2INTEGER(st, value)) + if((specs && specs->field_unsigned) + ? asn_ulong2INTEGER(st, value) + : asn_long2INTEGER(st, value)) _ASN_DECODE_FAILED; return rval; } @@ -657,6 +662,7 @@ INTEGER_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_enc_rval_t INTEGER_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { + asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; asn_enc_rval_t er; INTEGER_t *st = (INTEGER_t *)sptr; const uint8_t *buf; @@ -673,21 +679,41 @@ INTEGER_encode_uper(asn_TYPE_descriptor_t *td, if(ct) { int inext = 0; - if(asn_INTEGER2long(st, &value)) - _ASN_ENCODE_FAILED; - /* Check proper range */ - if(ct->flags & APC_SEMI_CONSTRAINED) { - if(value < ct->lower_bound) - inext = 1; - } else if(ct->range_bits >= 0) { - if(value < ct->lower_bound - || value > ct->upper_bound) - inext = 1; + if(specs && specs->field_unsigned) { + unsigned long uval; + if(asn_INTEGER2ulong(st, &uval)) + _ASN_ENCODE_FAILED; + /* Check proper range */ + if(ct->flags & APC_SEMI_CONSTRAINED) { + if(uval < (unsigned long)ct->lower_bound) + inext = 1; + } else if(ct->range_bits >= 0) { + if(uval < (unsigned long)ct->lower_bound + || uval > (unsigned long)ct->upper_bound) + inext = 1; + } + ASN_DEBUG("Value %lu (%02x/%d) lb %lu ub %lu %s", + uval, st->buf[0], st->size, + ct->lower_bound, ct->upper_bound, + inext ? "ext" : "fix"); + value = uval; + } else { + if(asn_INTEGER2long(st, &value)) + _ASN_ENCODE_FAILED; + /* Check proper range */ + if(ct->flags & APC_SEMI_CONSTRAINED) { + if(value < ct->lower_bound) + inext = 1; + } else if(ct->range_bits >= 0) { + if(value < ct->lower_bound + || value > ct->upper_bound) + inext = 1; + } + ASN_DEBUG("Value %ld (%02x/%d) lb %ld ub %ld %s", + value, st->buf[0], st->size, + ct->lower_bound, ct->upper_bound, + inext ? "ext" : "fix"); } - ASN_DEBUG("Value %ld (%02x/%d) lb %ld ub %ld %s", - value, st->buf[0], st->size, - ct->lower_bound, ct->upper_bound, - inext ? "ext" : "fix"); if(ct->flags & APC_EXTENSIBLE) { if(per_put_few_bits(po, inext, 1)) _ASN_ENCODE_FAILED; diff --git a/skeletons/INTEGER.h b/skeletons/INTEGER.h index b87c794c0..8411bfcdd 100644 --- a/skeletons/INTEGER.h +++ b/skeletons/INTEGER.h @@ -30,6 +30,8 @@ typedef struct asn_INTEGER_specifics_s { int map_count; /* Elements in either map */ int extension; /* This map is extensible */ int strict_enumeration; /* Enumeration set is fixed */ + int field_width; /* Size of native integer */ + int field_unsigned; /* Signed=0, unsigned=1 */ } asn_INTEGER_specifics_t; asn_struct_print_f INTEGER_print; diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c index b6b47e139..1554220f8 100644 --- a/skeletons/NativeEnumerated.c +++ b/skeletons/NativeEnumerated.c @@ -196,7 +196,7 @@ NativeEnumerated_encode_uper(asn_TYPE_descriptor_t *td, /* * X.691, #10.6: normally small non-negative whole number; */ - ASN_DEBUG("value = %d, ext = %d, inext = %d, res = %d", + ASN_DEBUG("value = %ld, ext = %d, inext = %d, res = %ld", value, specs->extension, inext, value - (inext ? (specs->extension - 1) : 0)); if(uper_put_nsnnwn(po, value - (inext ? (specs->extension - 1) : 0))) diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index b251ee7a7..abdb71a8c 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -48,6 +48,7 @@ asn_dec_rval_t NativeInteger_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **nint_ptr, const void *buf_ptr, size_t size, int tag_mode) { + asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; long *native = (long *)*nint_ptr; asn_dec_rval_t rval; ber_tlv_len_t length; @@ -105,7 +106,9 @@ NativeInteger_decode_ber(asn_codec_ctx_t *opt_codec_ctx, tmp.buf = (uint8_t *)unconst_buf.nonconstbuf; tmp.size = length; - if(asn_INTEGER2long(&tmp, &l)) { + if((specs&&specs->field_unsigned) + ? asn_INTEGER2ulong(&tmp, &l) + : asn_INTEGER2long(&tmp, &l)) { rval.code = RC_FAIL; rval.consumed = 0; return rval; @@ -167,6 +170,7 @@ asn_dec_rval_t NativeInteger_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, const void *buf_ptr, size_t size) { + asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; asn_dec_rval_t rval; INTEGER_t st; void *st_ptr = (void *)&st; @@ -182,7 +186,9 @@ NativeInteger_decode_xer(asn_codec_ctx_t *opt_codec_ctx, opt_mname, buf_ptr, size); if(rval.code == RC_OK) { long l; - if(asn_INTEGER2long(&st, &l)) { + if((specs&&specs->field_unsigned) + ? asn_INTEGER2ulong(&st, &l) + : asn_INTEGER2long(&st, &l)) { rval.code = RC_FAIL; rval.consumed = 0; } else { @@ -205,6 +211,7 @@ asn_enc_rval_t NativeInteger_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { + asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; char scratch[32]; /* Enough for 64-bit int */ asn_enc_rval_t er; const long *native = (const long *)sptr; @@ -214,7 +221,9 @@ NativeInteger_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, if(!native) _ASN_ENCODE_FAILED; - er.encoded = snprintf(scratch, sizeof(scratch), "%ld", *native); + er.encoded = snprintf(scratch, sizeof(scratch), + (specs && specs->field_unsigned) + ? "%lu" : "%ld", *native); if(er.encoded <= 0 || (size_t)er.encoded >= sizeof(scratch) || cb(scratch, er.encoded, app_key) < 0) _ASN_ENCODE_FAILED; @@ -227,6 +236,7 @@ NativeInteger_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; asn_dec_rval_t rval; long *native = (long *)*sptr; INTEGER_t tmpint; @@ -244,7 +254,9 @@ NativeInteger_decode_uper(asn_codec_ctx_t *opt_codec_ctx, rval = INTEGER_decode_uper(opt_codec_ctx, td, constraints, &tmpintptr, pd); if(rval.code == RC_OK) { - if(asn_INTEGER2long(&tmpint, native)) + if((specs&&specs->field_unsigned) + ? asn_INTEGER2ulong(&tmpint, native) + : asn_INTEGER2long(&tmpint, native)) rval.code = RC_FAIL; else ASN_DEBUG("NativeInteger %s got value %ld", @@ -258,6 +270,7 @@ NativeInteger_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_enc_rval_t NativeInteger_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { + asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; asn_enc_rval_t er; long native; INTEGER_t tmpint; @@ -269,7 +282,9 @@ NativeInteger_encode_uper(asn_TYPE_descriptor_t *td, ASN_DEBUG("Encoding NativeInteger %s %ld (UPER)", td->name, native); memset(&tmpint, 0, sizeof(tmpint)); - if(asn_long2INTEGER(&tmpint, native)) + if((specs&&specs->field_unsigned) + ? asn_ulong2INTEGER(&tmpint, native) + : asn_long2INTEGER(&tmpint, native)) _ASN_ENCODE_FAILED; er = INTEGER_encode_uper(td, constraints, &tmpint, po); ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); @@ -282,6 +297,7 @@ NativeInteger_encode_uper(asn_TYPE_descriptor_t *td, int NativeInteger_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; const long *native = (const long *)sptr; char scratch[32]; /* Enough for 64-bit int */ int ret; @@ -290,7 +306,9 @@ NativeInteger_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, (void)ilevel; /* Unused argument */ if(native) { - ret = snprintf(scratch, sizeof(scratch), "%ld", *native); + ret = snprintf(scratch, sizeof(scratch), + (specs && specs->field_unsigned) + ? "%lu" : "%ld", *native); assert(ret > 0 && (size_t)ret < sizeof(scratch)); return (cb(scratch, ret, app_key) < 0) ? -1 : 0; } else { diff --git a/tests/110-param-3-OK.asn1.-P b/tests/110-param-3-OK.asn1.-P index 3cb1058b5..9bd39a9b2 100644 --- a/tests/110-param-3-OK.asn1.-P +++ b/tests/110-param-3-OK.asn1.-P @@ -222,7 +222,9 @@ static asn_INTEGER_specifics_t asn_SPC_field_specs_7 = { asn_MAP_field_enum2value_7, /* N => "tag"; sorted by N */ 3, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ - 1 /* Strict enumeration */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 }; static ber_tlv_tag_t asn_DEF_field_tags_7[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) diff --git a/tests/127-per-long-OK.asn1 b/tests/127-per-long-OK.asn1 index 61d89aaea..ad1c50082 100644 --- a/tests/127-per-long-OK.asn1 +++ b/tests/127-per-long-OK.asn1 @@ -13,7 +13,9 @@ BEGIN T ::= SEQUENCE { small32range INTEGER (-2000000000..2000000000), - full32range INTEGER (-2147483648..2147483647) + full32range INTEGER (-2147483648..2147483647), + unsigned32 INTEGER (0..4294967295), + unsplit32 INTEGER (5..500|600..4294967290) } END diff --git a/tests/127-per-long-OK.asn1.-Pgen-PER b/tests/127-per-long-OK.asn1.-Pgen-PER new file mode 100644 index 000000000..439468bd4 --- /dev/null +++ b/tests/127-per-long-OK.asn1.-Pgen-PER @@ -0,0 +1,507 @@ + +/*** <<< INCLUDES [T] >>> ***/ + +#include +#include + +/*** <<< TYPE-DECLS [T] >>> ***/ + +typedef struct T { + long small32range; + long full32range; + unsigned long unsigned32; + unsigned long unsplit32; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} T_t; + +/*** <<< FUNC-DECLS [T] >>> ***/ + +/* extern asn_TYPE_descriptor_t asn_DEF_unsigned32_4; // (Use -fall-defs-global to expose) */ +/* extern asn_TYPE_descriptor_t asn_DEF_unsplit32_5; // (Use -fall-defs-global to expose) */ +extern asn_TYPE_descriptor_t asn_DEF_T; + +/*** <<< CODE [T] >>> ***/ + +static int +unsigned32_4_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + unsigned long value; + + if(!sptr) { + _ASN_CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const unsigned long *)sptr; + + /* Constraint check succeeded */ + return 0; +} + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static void +unsigned32_4_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_NativeInteger.free_struct; + td->print_struct = asn_DEF_NativeInteger.print_struct; + td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; + td->der_encoder = asn_DEF_NativeInteger.der_encoder; + td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; + td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; + td->elements = asn_DEF_NativeInteger.elements; + td->elements_count = asn_DEF_NativeInteger.elements_count; + /* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */ +} + +static void +unsigned32_4_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + unsigned32_4_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +static int +unsigned32_4_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + unsigned32_4_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +static asn_dec_rval_t +unsigned32_4_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + unsigned32_4_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +static asn_enc_rval_t +unsigned32_4_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + unsigned32_4_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +static asn_dec_rval_t +unsigned32_4_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + unsigned32_4_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +static asn_enc_rval_t +unsigned32_4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + unsigned32_4_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +static asn_dec_rval_t +unsigned32_4_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + unsigned32_4_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + +static asn_enc_rval_t +unsigned32_4_encode_uper(asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, + void *structure, asn_per_outp_t *per_out) { + unsigned32_4_inherit_TYPE_descriptor(td); + return td->uper_encoder(td, constraints, structure, per_out); +} + +static int +unsplit32_5_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + unsigned long value; + + if(!sptr) { + _ASN_CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const unsigned long *)sptr; + + if(((value >= 5 && value <= 500) || (value >= 600 && value <= 4294967290))) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static void +unsplit32_5_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_NativeInteger.free_struct; + td->print_struct = asn_DEF_NativeInteger.print_struct; + td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; + td->der_encoder = asn_DEF_NativeInteger.der_encoder; + td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; + td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; + td->elements = asn_DEF_NativeInteger.elements; + td->elements_count = asn_DEF_NativeInteger.elements_count; + /* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */ +} + +static void +unsplit32_5_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + unsplit32_5_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +static int +unsplit32_5_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + unsplit32_5_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +static asn_dec_rval_t +unsplit32_5_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + unsplit32_5_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +static asn_enc_rval_t +unsplit32_5_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + unsplit32_5_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +static asn_dec_rval_t +unsplit32_5_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + unsplit32_5_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +static asn_enc_rval_t +unsplit32_5_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + unsplit32_5_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +static asn_dec_rval_t +unsplit32_5_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { + unsplit32_5_inherit_TYPE_descriptor(td); + return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); +} + +static asn_enc_rval_t +unsplit32_5_encode_uper(asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, + void *structure, asn_per_outp_t *per_out) { + unsplit32_5_inherit_TYPE_descriptor(td); + return td->uper_encoder(td, constraints, structure, per_out); +} + +static int +memb_small32range_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + _ASN_CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= -2000000000 && value <= 2000000000)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_full32range_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + _ASN_CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= (-2147483647L - 1) && value <= 2147483647)) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_unsigned32_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + unsigned long value; + + if(!sptr) { + _ASN_CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const unsigned long *)sptr; + + /* Constraint check succeeded */ + return 0; +} + +static int +memb_unsplit32_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + unsigned long value; + + if(!sptr) { + _ASN_CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const unsigned long *)sptr; + + if(((value >= 5 && value <= 500) || (value >= 600 && value <= 4294967290))) { + /* Constraint check succeeded */ + return 0; + } else { + _ASN_CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + + +/*** <<< CTDEFS [T] >>> ***/ + +static asn_per_constraints_t asn_PER_type_unsigned32_constr_4 = { + { APC_CONSTRAINED, 32, -1, 0, 4294967295 } /* (0..4294967295) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_per_constraints_t asn_PER_type_unsplit32_constr_5 = { + { APC_CONSTRAINED, 32, -1, 5, 4294967290 } /* (5..4294967290) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_per_constraints_t asn_PER_memb_small32range_constr_2 = { + { APC_CONSTRAINED, 32, -1, -2000000000, 2000000000 } /* (-2000000000..2000000000) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_per_constraints_t asn_PER_memb_full32range_constr_3 = { + { APC_CONSTRAINED, 32, -1, (-2147483647L - 1), 2147483647 } /* (-2147483648..2147483647) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_per_constraints_t asn_PER_memb_unsigned32_constr_4 = { + { APC_CONSTRAINED, 32, -1, 0, 4294967295 } /* (0..4294967295) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_per_constraints_t asn_PER_memb_unsplit32_constr_5 = { + { APC_CONSTRAINED, 32, -1, 5, 4294967290 } /* (5..4294967290) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; + +/*** <<< STAT-DEFS [T] >>> ***/ + +static asn_INTEGER_specifics_t asn_SPC_unsigned32_specs_4 = { + 0, 0, 0, 0, 0, + 0, /* Native long size */ + 1 /* Unsigned representation */ +}; +static ber_tlv_tag_t asn_DEF_unsigned32_tags_4[] = { + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_unsigned32_4 = { + "unsigned32", + "unsigned32", + unsigned32_4_free, + unsigned32_4_print, + unsigned32_4_constraint, + unsigned32_4_decode_ber, + unsigned32_4_encode_der, + unsigned32_4_decode_xer, + unsigned32_4_encode_xer, + unsigned32_4_decode_uper, + unsigned32_4_encode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_unsigned32_tags_4, + sizeof(asn_DEF_unsigned32_tags_4) + /sizeof(asn_DEF_unsigned32_tags_4[0]) - 1, /* 1 */ + asn_DEF_unsigned32_tags_4, /* Same as above */ + sizeof(asn_DEF_unsigned32_tags_4) + /sizeof(asn_DEF_unsigned32_tags_4[0]), /* 2 */ + &asn_PER_type_unsigned32_constr_4, + 0, 0, /* No members */ + &asn_SPC_unsigned32_specs_4 /* Additional specs */ +}; + +static asn_INTEGER_specifics_t asn_SPC_unsplit32_specs_5 = { + 0, 0, 0, 0, 0, + 0, /* Native long size */ + 1 /* Unsigned representation */ +}; +static ber_tlv_tag_t asn_DEF_unsplit32_tags_5[] = { + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_unsplit32_5 = { + "unsplit32", + "unsplit32", + unsplit32_5_free, + unsplit32_5_print, + unsplit32_5_constraint, + unsplit32_5_decode_ber, + unsplit32_5_encode_der, + unsplit32_5_decode_xer, + unsplit32_5_encode_xer, + unsplit32_5_decode_uper, + unsplit32_5_encode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_unsplit32_tags_5, + sizeof(asn_DEF_unsplit32_tags_5) + /sizeof(asn_DEF_unsplit32_tags_5[0]) - 1, /* 1 */ + asn_DEF_unsplit32_tags_5, /* Same as above */ + sizeof(asn_DEF_unsplit32_tags_5) + /sizeof(asn_DEF_unsplit32_tags_5[0]), /* 2 */ + &asn_PER_type_unsplit32_constr_5, + 0, 0, /* No members */ + &asn_SPC_unsplit32_specs_5 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_T_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct T, small32range), + .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_NativeInteger, + .memb_constraints = memb_small32range_constraint_1, + .per_constraints = &asn_PER_memb_small32range_constr_2, + .default_value = 0, + .name = "small32range" + }, + { ATF_NOFLAGS, 0, offsetof(struct T, full32range), + .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_NativeInteger, + .memb_constraints = memb_full32range_constraint_1, + .per_constraints = &asn_PER_memb_full32range_constr_3, + .default_value = 0, + .name = "full32range" + }, + { ATF_NOFLAGS, 0, offsetof(struct T, unsigned32), + .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_unsigned32_4, + .memb_constraints = memb_unsigned32_constraint_1, + .per_constraints = &asn_PER_memb_unsigned32_constr_4, + .default_value = 0, + .name = "unsigned32" + }, + { ATF_NOFLAGS, 0, offsetof(struct T, unsplit32), + .tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_unsplit32_5, + .memb_constraints = memb_unsplit32_constraint_1, + .per_constraints = &asn_PER_memb_unsplit32_constr_5, + .default_value = 0, + .name = "unsplit32" + }, +}; +static ber_tlv_tag_t asn_DEF_T_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_TYPE_tag2member_t asn_MAP_T_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* small32range at 15 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* full32range at 16 */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* unsigned32 at 17 */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* unsplit32 at 18 */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_T_specs_1 = { + sizeof(struct T), + offsetof(struct T, _asn_ctx), + asn_MAP_T_tag2el_1, + 4, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_T = { + "T", + "T", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + SEQUENCE_decode_uper, + SEQUENCE_encode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_T_tags_1, + sizeof(asn_DEF_T_tags_1) + /sizeof(asn_DEF_T_tags_1[0]), /* 1 */ + asn_DEF_T_tags_1, /* Same as above */ + sizeof(asn_DEF_T_tags_1) + /sizeof(asn_DEF_T_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_T_1, + 4, /* Elements count */ + &asn_SPC_T_specs_1 /* Additional specs */ +}; + diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index 898d941f7..0fd30dca0 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -736,7 +736,9 @@ static asn_INTEGER_specifics_t asn_SPC_accept_as_specs_2 = { asn_MAP_accept_as_enum2value_2, /* N => "tag"; sorted by N */ 3, /* Number of elements in the maps */ 4, /* Extensions before this member */ - 1 /* Strict enumeration */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 }; static ber_tlv_tag_t asn_DEF_accept_as_tags_2[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) diff --git a/tests/50-constraint-OK.asn1.-P b/tests/50-constraint-OK.asn1.-P index 67923076b..5fcd1a910 100644 --- a/tests/50-constraint-OK.asn1.-P +++ b/tests/50-constraint-OK.asn1.-P @@ -3759,7 +3759,9 @@ static asn_INTEGER_specifics_t asn_SPC_enum_c_specs_6 = { asn_MAP_enum_c_enum2value_6, /* N => "tag"; sorted by N */ 3, /* Number of elements in the maps */ 3, /* Extensions before this member */ - 1 /* Strict enumeration */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 }; static ber_tlv_tag_t asn_DEF_enum_c_tags_6[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) @@ -4088,7 +4090,9 @@ static asn_INTEGER_specifics_t asn_SPC_Enum0_specs_1 = { asn_MAP_Enum0_enum2value_1, /* N => "tag"; sorted by N */ 2, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ - 1 /* Strict enumeration */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 }; static ber_tlv_tag_t asn_DEF_Enum0_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) @@ -4251,7 +4255,9 @@ static asn_INTEGER_specifics_t asn_SPC_Enum1_specs_1 = { asn_MAP_Enum1_enum2value_1, /* N => "tag"; sorted by N */ 2, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ - 1 /* Strict enumeration */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 }; static ber_tlv_tag_t asn_DEF_Enum1_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) diff --git a/tests/50-constraint-OK.asn1.-Pgen-PER b/tests/50-constraint-OK.asn1.-Pgen-PER index 4a9591427..74903a6a2 100644 --- a/tests/50-constraint-OK.asn1.-Pgen-PER +++ b/tests/50-constraint-OK.asn1.-Pgen-PER @@ -4384,7 +4384,9 @@ static asn_INTEGER_specifics_t asn_SPC_enum_c_specs_6 = { asn_MAP_enum_c_enum2value_6, /* N => "tag"; sorted by N */ 3, /* Number of elements in the maps */ 3, /* Extensions before this member */ - 1 /* Strict enumeration */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 }; static ber_tlv_tag_t asn_DEF_enum_c_tags_6[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) @@ -4751,7 +4753,9 @@ static asn_INTEGER_specifics_t asn_SPC_Enum0_specs_1 = { asn_MAP_Enum0_enum2value_1, /* N => "tag"; sorted by N */ 2, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ - 1 /* Strict enumeration */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 }; static ber_tlv_tag_t asn_DEF_Enum0_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) @@ -4940,7 +4944,9 @@ static asn_INTEGER_specifics_t asn_SPC_Enum1_specs_1 = { asn_MAP_Enum1_enum2value_1, /* N => "tag"; sorted by N */ 2, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ - 1 /* Strict enumeration */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 }; static ber_tlv_tag_t asn_DEF_Enum1_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) diff --git a/tests/66-ref-simple-OK.asn1.-P b/tests/66-ref-simple-OK.asn1.-P index 2eecf5e17..9d315e248 100644 --- a/tests/66-ref-simple-OK.asn1.-P +++ b/tests/66-ref-simple-OK.asn1.-P @@ -184,7 +184,9 @@ static asn_INTEGER_specifics_t asn_SPC_SimpleType_specs_1 = { asn_MAP_SimpleType_enum2value_1, /* N => "tag"; sorted by N */ 3, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ - 1 /* Strict enumeration */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 }; static ber_tlv_tag_t asn_DEF_SimpleType_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) diff --git a/tests/70-xer-test-OK.asn1.-P b/tests/70-xer-test-OK.asn1.-P index aa7e11e15..e109a8b30 100644 --- a/tests/70-xer-test-OK.asn1.-P +++ b/tests/70-xer-test-OK.asn1.-P @@ -616,7 +616,9 @@ static asn_INTEGER_specifics_t asn_SPC_enum_specs_4 = { asn_MAP_enum_enum2value_4, /* N => "tag"; sorted by N */ 2, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ - 1 /* Strict enumeration */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 }; static ber_tlv_tag_t asn_DEF_enum_tags_4[] = { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), @@ -1146,7 +1148,9 @@ static asn_INTEGER_specifics_t asn_SPC_Member_specs_2 = { asn_MAP_Member_enum2value_2, /* N => "tag"; sorted by N */ 2, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ - 1 /* Strict enumeration */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 }; static ber_tlv_tag_t asn_DEF_Member_tags_2[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) @@ -1467,7 +1471,9 @@ static asn_INTEGER_specifics_t asn_SPC_name_specs_2 = { asn_MAP_name_enum2value_2, /* N => "tag"; sorted by N */ 2, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ - 1 /* Strict enumeration */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 }; static ber_tlv_tag_t asn_DEF_name_tags_2[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) diff --git a/tests/73-circular-OK.asn1.-P b/tests/73-circular-OK.asn1.-P index 1ab4dbf4f..fe581b668 100644 --- a/tests/73-circular-OK.asn1.-P +++ b/tests/73-circular-OK.asn1.-P @@ -821,7 +821,9 @@ static asn_INTEGER_specifics_t asn_SPC_EnumType_specs_1 = { asn_MAP_EnumType_enum2value_1, /* N => "tag"; sorted by N */ 2, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ - 1 /* Strict enumeration */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 }; static ber_tlv_tag_t asn_DEF_EnumType_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) diff --git a/tests/90-cond-int-type-OK.asn1.-P b/tests/90-cond-int-type-OK.asn1.-P index 5055e4d78..08f92d4d6 100644 --- a/tests/90-cond-int-type-OK.asn1.-P +++ b/tests/90-cond-int-type-OK.asn1.-P @@ -557,11 +557,11 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerMinHigh = { /*** <<< INCLUDES [NO-IntegerLowHigh] >>> ***/ -#include +#include /*** <<< TYPE-DECLS [NO-IntegerLowHigh] >>> ***/ -typedef INTEGER_t NO_IntegerLowHigh_t; +typedef unsigned long NO_IntegerLowHigh_t; /*** <<< FUNC-DECLS [NO-IntegerLowHigh] >>> ***/ @@ -579,8 +579,7 @@ xer_type_encoder_f NO_IntegerLowHigh_encode_xer; int NO_IntegerLowHigh_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { - const INTEGER_t *st = (const INTEGER_t *)sptr; - long value; + unsigned long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, @@ -589,12 +588,7 @@ NO_IntegerLowHigh_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - if(asn_INTEGER2long(st, &value)) { - _ASN_CTFAIL(app_key, td, sptr, - "%s: value too large (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } + value = *(const unsigned long *)sptr; if((value >= 1 && value <= 3000000000)) { /* Constraint check succeeded */ @@ -608,24 +602,24 @@ NO_IntegerLowHigh_constraint(asn_TYPE_descriptor_t *td, const void *sptr, } /* - * This type is implemented using INTEGER, + * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void NO_IntegerLowHigh_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { - td->free_struct = asn_DEF_INTEGER.free_struct; - td->print_struct = asn_DEF_INTEGER.print_struct; - td->ber_decoder = asn_DEF_INTEGER.ber_decoder; - td->der_encoder = asn_DEF_INTEGER.der_encoder; - td->xer_decoder = asn_DEF_INTEGER.xer_decoder; - td->xer_encoder = asn_DEF_INTEGER.xer_encoder; - td->uper_decoder = asn_DEF_INTEGER.uper_decoder; - td->uper_encoder = asn_DEF_INTEGER.uper_encoder; + td->free_struct = asn_DEF_NativeInteger.free_struct; + td->print_struct = asn_DEF_NativeInteger.print_struct; + td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; + td->der_encoder = asn_DEF_NativeInteger.der_encoder; + td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; + td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) - td->per_constraints = asn_DEF_INTEGER.per_constraints; - td->elements = asn_DEF_INTEGER.elements; - td->elements_count = asn_DEF_INTEGER.elements_count; - td->specifics = asn_DEF_INTEGER.specifics; + td->per_constraints = asn_DEF_NativeInteger.per_constraints; + td->elements = asn_DEF_NativeInteger.elements; + td->elements_count = asn_DEF_NativeInteger.elements_count; + /* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */ } void @@ -675,6 +669,11 @@ NO_IntegerLowHigh_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerLowHigh] >>> ***/ +static asn_INTEGER_specifics_t asn_SPC_NO_IntegerLowHigh_specs_1 = { + 0, 0, 0, 0, 0, + 0, /* Native long size */ + 1 /* Unsigned representation */ +}; static ber_tlv_tag_t asn_DEF_NO_IntegerLowHigh_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -698,7 +697,7 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerLowHigh = { /sizeof(asn_DEF_NO_IntegerLowHigh_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ 0, 0, /* No members */ - 0 /* No specifics */ + &asn_SPC_NO_IntegerLowHigh_specs_1 /* Additional specs */ }; @@ -1145,11 +1144,11 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerLowestMax = { /*** <<< INCLUDES [NO-IntegerOutRange] >>> ***/ -#include +#include /*** <<< TYPE-DECLS [NO-IntegerOutRange] >>> ***/ -typedef INTEGER_t NO_IntegerOutRange_t; +typedef unsigned long NO_IntegerOutRange_t; /*** <<< FUNC-DECLS [NO-IntegerOutRange] >>> ***/ @@ -1167,8 +1166,7 @@ xer_type_encoder_f NO_IntegerOutRange_encode_xer; int NO_IntegerOutRange_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { - const INTEGER_t *st = (const INTEGER_t *)sptr; - long value; + unsigned long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, @@ -1177,12 +1175,7 @@ NO_IntegerOutRange_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - if(asn_INTEGER2long(st, &value)) { - _ASN_CTFAIL(app_key, td, sptr, - "%s: value too large (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } + value = *(const unsigned long *)sptr; if((value >= 3000000000 && value <= 3000000001)) { /* Constraint check succeeded */ @@ -1196,24 +1189,24 @@ NO_IntegerOutRange_constraint(asn_TYPE_descriptor_t *td, const void *sptr, } /* - * This type is implemented using INTEGER, + * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void NO_IntegerOutRange_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { - td->free_struct = asn_DEF_INTEGER.free_struct; - td->print_struct = asn_DEF_INTEGER.print_struct; - td->ber_decoder = asn_DEF_INTEGER.ber_decoder; - td->der_encoder = asn_DEF_INTEGER.der_encoder; - td->xer_decoder = asn_DEF_INTEGER.xer_decoder; - td->xer_encoder = asn_DEF_INTEGER.xer_encoder; - td->uper_decoder = asn_DEF_INTEGER.uper_decoder; - td->uper_encoder = asn_DEF_INTEGER.uper_encoder; + td->free_struct = asn_DEF_NativeInteger.free_struct; + td->print_struct = asn_DEF_NativeInteger.print_struct; + td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; + td->der_encoder = asn_DEF_NativeInteger.der_encoder; + td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; + td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) - td->per_constraints = asn_DEF_INTEGER.per_constraints; - td->elements = asn_DEF_INTEGER.elements; - td->elements_count = asn_DEF_INTEGER.elements_count; - td->specifics = asn_DEF_INTEGER.specifics; + td->per_constraints = asn_DEF_NativeInteger.per_constraints; + td->elements = asn_DEF_NativeInteger.elements; + td->elements_count = asn_DEF_NativeInteger.elements_count; + /* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */ } void @@ -1263,6 +1256,11 @@ NO_IntegerOutRange_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerOutRange] >>> ***/ +static asn_INTEGER_specifics_t asn_SPC_NO_IntegerOutRange_specs_1 = { + 0, 0, 0, 0, 0, + 0, /* Native long size */ + 1 /* Unsigned representation */ +}; static ber_tlv_tag_t asn_DEF_NO_IntegerOutRange_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -1286,17 +1284,17 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerOutRange = { /sizeof(asn_DEF_NO_IntegerOutRange_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ 0, 0, /* No members */ - 0 /* No specifics */ + &asn_SPC_NO_IntegerOutRange_specs_1 /* Additional specs */ }; /*** <<< INCLUDES [NO-IntegerOutValue] >>> ***/ -#include +#include /*** <<< TYPE-DECLS [NO-IntegerOutValue] >>> ***/ -typedef INTEGER_t NO_IntegerOutValue_t; +typedef unsigned long NO_IntegerOutValue_t; /*** <<< FUNC-DECLS [NO-IntegerOutValue] >>> ***/ @@ -1314,8 +1312,7 @@ xer_type_encoder_f NO_IntegerOutValue_encode_xer; int NO_IntegerOutValue_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { - const INTEGER_t *st = (const INTEGER_t *)sptr; - long value; + unsigned long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, @@ -1324,12 +1321,7 @@ NO_IntegerOutValue_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - if(asn_INTEGER2long(st, &value)) { - _ASN_CTFAIL(app_key, td, sptr, - "%s: value too large (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } + value = *(const unsigned long *)sptr; if((value == 3000000000)) { /* Constraint check succeeded */ @@ -1343,24 +1335,24 @@ NO_IntegerOutValue_constraint(asn_TYPE_descriptor_t *td, const void *sptr, } /* - * This type is implemented using INTEGER, + * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void NO_IntegerOutValue_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { - td->free_struct = asn_DEF_INTEGER.free_struct; - td->print_struct = asn_DEF_INTEGER.print_struct; - td->ber_decoder = asn_DEF_INTEGER.ber_decoder; - td->der_encoder = asn_DEF_INTEGER.der_encoder; - td->xer_decoder = asn_DEF_INTEGER.xer_decoder; - td->xer_encoder = asn_DEF_INTEGER.xer_encoder; - td->uper_decoder = asn_DEF_INTEGER.uper_decoder; - td->uper_encoder = asn_DEF_INTEGER.uper_encoder; + td->free_struct = asn_DEF_NativeInteger.free_struct; + td->print_struct = asn_DEF_NativeInteger.print_struct; + td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; + td->der_encoder = asn_DEF_NativeInteger.der_encoder; + td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; + td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) - td->per_constraints = asn_DEF_INTEGER.per_constraints; - td->elements = asn_DEF_INTEGER.elements; - td->elements_count = asn_DEF_INTEGER.elements_count; - td->specifics = asn_DEF_INTEGER.specifics; + td->per_constraints = asn_DEF_NativeInteger.per_constraints; + td->elements = asn_DEF_NativeInteger.elements; + td->elements_count = asn_DEF_NativeInteger.elements_count; + /* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */ } void @@ -1410,6 +1402,11 @@ NO_IntegerOutValue_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerOutValue] >>> ***/ +static asn_INTEGER_specifics_t asn_SPC_NO_IntegerOutValue_specs_1 = { + 0, 0, 0, 0, 0, + 0, /* Native long size */ + 1 /* Unsigned representation */ +}; static ber_tlv_tag_t asn_DEF_NO_IntegerOutValue_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -1433,7 +1430,7 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerOutValue = { /sizeof(asn_DEF_NO_IntegerOutValue_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ 0, 0, /* No members */ - 0 /* No specifics */ + &asn_SPC_NO_IntegerOutValue_specs_1 /* Additional specs */ }; @@ -2150,11 +2147,11 @@ asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange5 = { /*** <<< INCLUDES [NO-IntegerInRange6] >>> ***/ -#include +#include /*** <<< TYPE-DECLS [NO-IntegerInRange6] >>> ***/ -typedef INTEGER_t NO_IntegerInRange6_t; +typedef unsigned long NO_IntegerInRange6_t; /*** <<< FUNC-DECLS [NO-IntegerInRange6] >>> ***/ @@ -2172,8 +2169,7 @@ xer_type_encoder_f NO_IntegerInRange6_encode_xer; int NO_IntegerInRange6_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { - const INTEGER_t *st = (const INTEGER_t *)sptr; - long value; + unsigned long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, @@ -2182,43 +2178,31 @@ NO_IntegerInRange6_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - if(asn_INTEGER2long(st, &value)) { - _ASN_CTFAIL(app_key, td, sptr, - "%s: value too large (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } + value = *(const unsigned long *)sptr; - if((value >= 0 && value <= 4294967295)) { - /* Constraint check succeeded */ - return 0; - } else { - _ASN_CTFAIL(app_key, td, sptr, - "%s: constraint failed (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } + /* Constraint check succeeded */ + return 0; } /* - * This type is implemented using INTEGER, + * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void NO_IntegerInRange6_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { - td->free_struct = asn_DEF_INTEGER.free_struct; - td->print_struct = asn_DEF_INTEGER.print_struct; - td->ber_decoder = asn_DEF_INTEGER.ber_decoder; - td->der_encoder = asn_DEF_INTEGER.der_encoder; - td->xer_decoder = asn_DEF_INTEGER.xer_decoder; - td->xer_encoder = asn_DEF_INTEGER.xer_encoder; - td->uper_decoder = asn_DEF_INTEGER.uper_decoder; - td->uper_encoder = asn_DEF_INTEGER.uper_encoder; + td->free_struct = asn_DEF_NativeInteger.free_struct; + td->print_struct = asn_DEF_NativeInteger.print_struct; + td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; + td->der_encoder = asn_DEF_NativeInteger.der_encoder; + td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; + td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) - td->per_constraints = asn_DEF_INTEGER.per_constraints; - td->elements = asn_DEF_INTEGER.elements; - td->elements_count = asn_DEF_INTEGER.elements_count; - td->specifics = asn_DEF_INTEGER.specifics; + td->per_constraints = asn_DEF_NativeInteger.per_constraints; + td->elements = asn_DEF_NativeInteger.elements; + td->elements_count = asn_DEF_NativeInteger.elements_count; + /* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */ } void @@ -2268,6 +2252,11 @@ NO_IntegerInRange6_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerInRange6] >>> ***/ +static asn_INTEGER_specifics_t asn_SPC_NO_IntegerInRange6_specs_1 = { + 0, 0, 0, 0, 0, + 0, /* Native long size */ + 1 /* Unsigned representation */ +}; static ber_tlv_tag_t asn_DEF_NO_IntegerInRange6_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -2291,7 +2280,7 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerInRange6 = { /sizeof(asn_DEF_NO_IntegerInRange6_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ 0, 0, /* No members */ - 0 /* No specifics */ + &asn_SPC_NO_IntegerInRange6_specs_1 /* Additional specs */ }; diff --git a/tests/90-cond-int-type-OK.asn1.-Pfnative-types b/tests/90-cond-int-type-OK.asn1.-Pfnative-types index 461e5eb5f..4c898f8fd 100644 --- a/tests/90-cond-int-type-OK.asn1.-Pfnative-types +++ b/tests/90-cond-int-type-OK.asn1.-Pfnative-types @@ -550,11 +550,11 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerMinHigh = { /*** <<< INCLUDES [NO-IntegerLowHigh] >>> ***/ -#include +#include /*** <<< TYPE-DECLS [NO-IntegerLowHigh] >>> ***/ -typedef INTEGER_t NO_IntegerLowHigh_t; +typedef unsigned long NO_IntegerLowHigh_t; /*** <<< FUNC-DECLS [NO-IntegerLowHigh] >>> ***/ @@ -572,8 +572,7 @@ xer_type_encoder_f NO_IntegerLowHigh_encode_xer; int NO_IntegerLowHigh_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { - const INTEGER_t *st = (const INTEGER_t *)sptr; - long value; + unsigned long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, @@ -582,12 +581,7 @@ NO_IntegerLowHigh_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - if(asn_INTEGER2long(st, &value)) { - _ASN_CTFAIL(app_key, td, sptr, - "%s: value too large (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } + value = *(const unsigned long *)sptr; if((value >= 1 && value <= 3000000000)) { /* Constraint check succeeded */ @@ -601,24 +595,24 @@ NO_IntegerLowHigh_constraint(asn_TYPE_descriptor_t *td, const void *sptr, } /* - * This type is implemented using INTEGER, + * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void NO_IntegerLowHigh_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { - td->free_struct = asn_DEF_INTEGER.free_struct; - td->print_struct = asn_DEF_INTEGER.print_struct; - td->ber_decoder = asn_DEF_INTEGER.ber_decoder; - td->der_encoder = asn_DEF_INTEGER.der_encoder; - td->xer_decoder = asn_DEF_INTEGER.xer_decoder; - td->xer_encoder = asn_DEF_INTEGER.xer_encoder; - td->uper_decoder = asn_DEF_INTEGER.uper_decoder; - td->uper_encoder = asn_DEF_INTEGER.uper_encoder; + td->free_struct = asn_DEF_NativeInteger.free_struct; + td->print_struct = asn_DEF_NativeInteger.print_struct; + td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; + td->der_encoder = asn_DEF_NativeInteger.der_encoder; + td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; + td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) - td->per_constraints = asn_DEF_INTEGER.per_constraints; - td->elements = asn_DEF_INTEGER.elements; - td->elements_count = asn_DEF_INTEGER.elements_count; - td->specifics = asn_DEF_INTEGER.specifics; + td->per_constraints = asn_DEF_NativeInteger.per_constraints; + td->elements = asn_DEF_NativeInteger.elements; + td->elements_count = asn_DEF_NativeInteger.elements_count; + /* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */ } void @@ -668,6 +662,11 @@ NO_IntegerLowHigh_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerLowHigh] >>> ***/ +static asn_INTEGER_specifics_t asn_SPC_NO_IntegerLowHigh_specs_1 = { + 0, 0, 0, 0, 0, + 0, /* Native long size */ + 1 /* Unsigned representation */ +}; static ber_tlv_tag_t asn_DEF_NO_IntegerLowHigh_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -691,7 +690,7 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerLowHigh = { /sizeof(asn_DEF_NO_IntegerLowHigh_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ 0, 0, /* No members */ - 0 /* No specifics */ + &asn_SPC_NO_IntegerLowHigh_specs_1 /* Additional specs */ }; @@ -1132,11 +1131,11 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerLowestMax = { /*** <<< INCLUDES [NO-IntegerOutRange] >>> ***/ -#include +#include /*** <<< TYPE-DECLS [NO-IntegerOutRange] >>> ***/ -typedef INTEGER_t NO_IntegerOutRange_t; +typedef unsigned long NO_IntegerOutRange_t; /*** <<< FUNC-DECLS [NO-IntegerOutRange] >>> ***/ @@ -1154,8 +1153,7 @@ xer_type_encoder_f NO_IntegerOutRange_encode_xer; int NO_IntegerOutRange_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { - const INTEGER_t *st = (const INTEGER_t *)sptr; - long value; + unsigned long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, @@ -1164,12 +1162,7 @@ NO_IntegerOutRange_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - if(asn_INTEGER2long(st, &value)) { - _ASN_CTFAIL(app_key, td, sptr, - "%s: value too large (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } + value = *(const unsigned long *)sptr; if((value >= 3000000000 && value <= 3000000001)) { /* Constraint check succeeded */ @@ -1183,24 +1176,24 @@ NO_IntegerOutRange_constraint(asn_TYPE_descriptor_t *td, const void *sptr, } /* - * This type is implemented using INTEGER, + * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void NO_IntegerOutRange_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { - td->free_struct = asn_DEF_INTEGER.free_struct; - td->print_struct = asn_DEF_INTEGER.print_struct; - td->ber_decoder = asn_DEF_INTEGER.ber_decoder; - td->der_encoder = asn_DEF_INTEGER.der_encoder; - td->xer_decoder = asn_DEF_INTEGER.xer_decoder; - td->xer_encoder = asn_DEF_INTEGER.xer_encoder; - td->uper_decoder = asn_DEF_INTEGER.uper_decoder; - td->uper_encoder = asn_DEF_INTEGER.uper_encoder; + td->free_struct = asn_DEF_NativeInteger.free_struct; + td->print_struct = asn_DEF_NativeInteger.print_struct; + td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; + td->der_encoder = asn_DEF_NativeInteger.der_encoder; + td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; + td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) - td->per_constraints = asn_DEF_INTEGER.per_constraints; - td->elements = asn_DEF_INTEGER.elements; - td->elements_count = asn_DEF_INTEGER.elements_count; - td->specifics = asn_DEF_INTEGER.specifics; + td->per_constraints = asn_DEF_NativeInteger.per_constraints; + td->elements = asn_DEF_NativeInteger.elements; + td->elements_count = asn_DEF_NativeInteger.elements_count; + /* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */ } void @@ -1250,6 +1243,11 @@ NO_IntegerOutRange_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerOutRange] >>> ***/ +static asn_INTEGER_specifics_t asn_SPC_NO_IntegerOutRange_specs_1 = { + 0, 0, 0, 0, 0, + 0, /* Native long size */ + 1 /* Unsigned representation */ +}; static ber_tlv_tag_t asn_DEF_NO_IntegerOutRange_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -1273,17 +1271,17 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerOutRange = { /sizeof(asn_DEF_NO_IntegerOutRange_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ 0, 0, /* No members */ - 0 /* No specifics */ + &asn_SPC_NO_IntegerOutRange_specs_1 /* Additional specs */ }; /*** <<< INCLUDES [NO-IntegerOutValue] >>> ***/ -#include +#include /*** <<< TYPE-DECLS [NO-IntegerOutValue] >>> ***/ -typedef INTEGER_t NO_IntegerOutValue_t; +typedef unsigned long NO_IntegerOutValue_t; /*** <<< FUNC-DECLS [NO-IntegerOutValue] >>> ***/ @@ -1301,8 +1299,7 @@ xer_type_encoder_f NO_IntegerOutValue_encode_xer; int NO_IntegerOutValue_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { - const INTEGER_t *st = (const INTEGER_t *)sptr; - long value; + unsigned long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, @@ -1311,12 +1308,7 @@ NO_IntegerOutValue_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - if(asn_INTEGER2long(st, &value)) { - _ASN_CTFAIL(app_key, td, sptr, - "%s: value too large (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } + value = *(const unsigned long *)sptr; if((value == 3000000000)) { /* Constraint check succeeded */ @@ -1330,24 +1322,24 @@ NO_IntegerOutValue_constraint(asn_TYPE_descriptor_t *td, const void *sptr, } /* - * This type is implemented using INTEGER, + * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void NO_IntegerOutValue_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { - td->free_struct = asn_DEF_INTEGER.free_struct; - td->print_struct = asn_DEF_INTEGER.print_struct; - td->ber_decoder = asn_DEF_INTEGER.ber_decoder; - td->der_encoder = asn_DEF_INTEGER.der_encoder; - td->xer_decoder = asn_DEF_INTEGER.xer_decoder; - td->xer_encoder = asn_DEF_INTEGER.xer_encoder; - td->uper_decoder = asn_DEF_INTEGER.uper_decoder; - td->uper_encoder = asn_DEF_INTEGER.uper_encoder; + td->free_struct = asn_DEF_NativeInteger.free_struct; + td->print_struct = asn_DEF_NativeInteger.print_struct; + td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; + td->der_encoder = asn_DEF_NativeInteger.der_encoder; + td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; + td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) - td->per_constraints = asn_DEF_INTEGER.per_constraints; - td->elements = asn_DEF_INTEGER.elements; - td->elements_count = asn_DEF_INTEGER.elements_count; - td->specifics = asn_DEF_INTEGER.specifics; + td->per_constraints = asn_DEF_NativeInteger.per_constraints; + td->elements = asn_DEF_NativeInteger.elements; + td->elements_count = asn_DEF_NativeInteger.elements_count; + /* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */ } void @@ -1397,6 +1389,11 @@ NO_IntegerOutValue_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerOutValue] >>> ***/ +static asn_INTEGER_specifics_t asn_SPC_NO_IntegerOutValue_specs_1 = { + 0, 0, 0, 0, 0, + 0, /* Native long size */ + 1 /* Unsigned representation */ +}; static ber_tlv_tag_t asn_DEF_NO_IntegerOutValue_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -1420,7 +1417,7 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerOutValue = { /sizeof(asn_DEF_NO_IntegerOutValue_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ 0, 0, /* No members */ - 0 /* No specifics */ + &asn_SPC_NO_IntegerOutValue_specs_1 /* Additional specs */ }; @@ -2131,11 +2128,11 @@ asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange5 = { /*** <<< INCLUDES [NO-IntegerInRange6] >>> ***/ -#include +#include /*** <<< TYPE-DECLS [NO-IntegerInRange6] >>> ***/ -typedef INTEGER_t NO_IntegerInRange6_t; +typedef unsigned long NO_IntegerInRange6_t; /*** <<< FUNC-DECLS [NO-IntegerInRange6] >>> ***/ @@ -2153,8 +2150,7 @@ xer_type_encoder_f NO_IntegerInRange6_encode_xer; int NO_IntegerInRange6_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { - const INTEGER_t *st = (const INTEGER_t *)sptr; - long value; + unsigned long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, @@ -2163,43 +2159,31 @@ NO_IntegerInRange6_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - if(asn_INTEGER2long(st, &value)) { - _ASN_CTFAIL(app_key, td, sptr, - "%s: value too large (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } + value = *(const unsigned long *)sptr; - if((value >= 0 && value <= 4294967295)) { - /* Constraint check succeeded */ - return 0; - } else { - _ASN_CTFAIL(app_key, td, sptr, - "%s: constraint failed (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } + /* Constraint check succeeded */ + return 0; } /* - * This type is implemented using INTEGER, + * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void NO_IntegerInRange6_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { - td->free_struct = asn_DEF_INTEGER.free_struct; - td->print_struct = asn_DEF_INTEGER.print_struct; - td->ber_decoder = asn_DEF_INTEGER.ber_decoder; - td->der_encoder = asn_DEF_INTEGER.der_encoder; - td->xer_decoder = asn_DEF_INTEGER.xer_decoder; - td->xer_encoder = asn_DEF_INTEGER.xer_encoder; - td->uper_decoder = asn_DEF_INTEGER.uper_decoder; - td->uper_encoder = asn_DEF_INTEGER.uper_encoder; + td->free_struct = asn_DEF_NativeInteger.free_struct; + td->print_struct = asn_DEF_NativeInteger.print_struct; + td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; + td->der_encoder = asn_DEF_NativeInteger.der_encoder; + td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; + td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) - td->per_constraints = asn_DEF_INTEGER.per_constraints; - td->elements = asn_DEF_INTEGER.elements; - td->elements_count = asn_DEF_INTEGER.elements_count; - td->specifics = asn_DEF_INTEGER.specifics; + td->per_constraints = asn_DEF_NativeInteger.per_constraints; + td->elements = asn_DEF_NativeInteger.elements; + td->elements_count = asn_DEF_NativeInteger.elements_count; + /* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */ } void @@ -2249,6 +2233,11 @@ NO_IntegerInRange6_encode_xer(asn_TYPE_descriptor_t *td, void *structure, /*** <<< STAT-DEFS [NO-IntegerInRange6] >>> ***/ +static asn_INTEGER_specifics_t asn_SPC_NO_IntegerInRange6_specs_1 = { + 0, 0, 0, 0, 0, + 0, /* Native long size */ + 1 /* Unsigned representation */ +}; static ber_tlv_tag_t asn_DEF_NO_IntegerInRange6_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -2272,7 +2261,7 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerInRange6 = { /sizeof(asn_DEF_NO_IntegerInRange6_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ 0, 0, /* No members */ - 0 /* No specifics */ + &asn_SPC_NO_IntegerInRange6_specs_1 /* Additional specs */ }; diff --git a/tests/90-cond-int-type-OK.asn1.-Pgen-PER b/tests/90-cond-int-type-OK.asn1.-Pgen-PER index d7957cbae..5b16f4607 100644 --- a/tests/90-cond-int-type-OK.asn1.-Pgen-PER +++ b/tests/90-cond-int-type-OK.asn1.-Pgen-PER @@ -653,11 +653,11 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerMinHigh = { /*** <<< INCLUDES [NO-IntegerLowHigh] >>> ***/ -#include +#include /*** <<< TYPE-DECLS [NO-IntegerLowHigh] >>> ***/ -typedef INTEGER_t NO_IntegerLowHigh_t; +typedef unsigned long NO_IntegerLowHigh_t; /*** <<< FUNC-DECLS [NO-IntegerLowHigh] >>> ***/ @@ -677,8 +677,7 @@ per_type_encoder_f NO_IntegerLowHigh_encode_uper; int NO_IntegerLowHigh_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { - const INTEGER_t *st = (const INTEGER_t *)sptr; - long value; + unsigned long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, @@ -687,12 +686,7 @@ NO_IntegerLowHigh_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - if(asn_INTEGER2long(st, &value)) { - _ASN_CTFAIL(app_key, td, sptr, - "%s: value too large (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } + value = *(const unsigned long *)sptr; if((value >= 1 && value <= 3000000000)) { /* Constraint check succeeded */ @@ -706,24 +700,24 @@ NO_IntegerLowHigh_constraint(asn_TYPE_descriptor_t *td, const void *sptr, } /* - * This type is implemented using INTEGER, + * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void NO_IntegerLowHigh_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { - td->free_struct = asn_DEF_INTEGER.free_struct; - td->print_struct = asn_DEF_INTEGER.print_struct; - td->ber_decoder = asn_DEF_INTEGER.ber_decoder; - td->der_encoder = asn_DEF_INTEGER.der_encoder; - td->xer_decoder = asn_DEF_INTEGER.xer_decoder; - td->xer_encoder = asn_DEF_INTEGER.xer_encoder; - td->uper_decoder = asn_DEF_INTEGER.uper_decoder; - td->uper_encoder = asn_DEF_INTEGER.uper_encoder; + td->free_struct = asn_DEF_NativeInteger.free_struct; + td->print_struct = asn_DEF_NativeInteger.print_struct; + td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; + td->der_encoder = asn_DEF_NativeInteger.der_encoder; + td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; + td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) - td->per_constraints = asn_DEF_INTEGER.per_constraints; - td->elements = asn_DEF_INTEGER.elements; - td->elements_count = asn_DEF_INTEGER.elements_count; - td->specifics = asn_DEF_INTEGER.specifics; + td->per_constraints = asn_DEF_NativeInteger.per_constraints; + td->elements = asn_DEF_NativeInteger.elements; + td->elements_count = asn_DEF_NativeInteger.elements_count; + /* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */ } void @@ -796,6 +790,11 @@ static asn_per_constraints_t asn_PER_type_NO_IntegerLowHigh_constr_1 = { /*** <<< STAT-DEFS [NO-IntegerLowHigh] >>> ***/ +static asn_INTEGER_specifics_t asn_SPC_NO_IntegerLowHigh_specs_1 = { + 0, 0, 0, 0, 0, + 0, /* Native long size */ + 1 /* Unsigned representation */ +}; static ber_tlv_tag_t asn_DEF_NO_IntegerLowHigh_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -820,7 +819,7 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerLowHigh = { /sizeof(asn_DEF_NO_IntegerLowHigh_tags_1[0]), /* 1 */ &asn_PER_type_NO_IntegerLowHigh_constr_1, 0, 0, /* No members */ - 0 /* No specifics */ + &asn_SPC_NO_IntegerLowHigh_specs_1 /* Additional specs */ }; @@ -1345,11 +1344,11 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerLowestMax = { /*** <<< INCLUDES [NO-IntegerOutRange] >>> ***/ -#include +#include /*** <<< TYPE-DECLS [NO-IntegerOutRange] >>> ***/ -typedef INTEGER_t NO_IntegerOutRange_t; +typedef unsigned long NO_IntegerOutRange_t; /*** <<< FUNC-DECLS [NO-IntegerOutRange] >>> ***/ @@ -1369,8 +1368,7 @@ per_type_encoder_f NO_IntegerOutRange_encode_uper; int NO_IntegerOutRange_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { - const INTEGER_t *st = (const INTEGER_t *)sptr; - long value; + unsigned long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, @@ -1379,12 +1377,7 @@ NO_IntegerOutRange_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - if(asn_INTEGER2long(st, &value)) { - _ASN_CTFAIL(app_key, td, sptr, - "%s: value too large (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } + value = *(const unsigned long *)sptr; if((value >= 3000000000 && value <= 3000000001)) { /* Constraint check succeeded */ @@ -1398,24 +1391,24 @@ NO_IntegerOutRange_constraint(asn_TYPE_descriptor_t *td, const void *sptr, } /* - * This type is implemented using INTEGER, + * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void NO_IntegerOutRange_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { - td->free_struct = asn_DEF_INTEGER.free_struct; - td->print_struct = asn_DEF_INTEGER.print_struct; - td->ber_decoder = asn_DEF_INTEGER.ber_decoder; - td->der_encoder = asn_DEF_INTEGER.der_encoder; - td->xer_decoder = asn_DEF_INTEGER.xer_decoder; - td->xer_encoder = asn_DEF_INTEGER.xer_encoder; - td->uper_decoder = asn_DEF_INTEGER.uper_decoder; - td->uper_encoder = asn_DEF_INTEGER.uper_encoder; + td->free_struct = asn_DEF_NativeInteger.free_struct; + td->print_struct = asn_DEF_NativeInteger.print_struct; + td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; + td->der_encoder = asn_DEF_NativeInteger.der_encoder; + td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; + td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) - td->per_constraints = asn_DEF_INTEGER.per_constraints; - td->elements = asn_DEF_INTEGER.elements; - td->elements_count = asn_DEF_INTEGER.elements_count; - td->specifics = asn_DEF_INTEGER.specifics; + td->per_constraints = asn_DEF_NativeInteger.per_constraints; + td->elements = asn_DEF_NativeInteger.elements; + td->elements_count = asn_DEF_NativeInteger.elements_count; + /* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */ } void @@ -1488,6 +1481,11 @@ static asn_per_constraints_t asn_PER_type_NO_IntegerOutRange_constr_1 = { /*** <<< STAT-DEFS [NO-IntegerOutRange] >>> ***/ +static asn_INTEGER_specifics_t asn_SPC_NO_IntegerOutRange_specs_1 = { + 0, 0, 0, 0, 0, + 0, /* Native long size */ + 1 /* Unsigned representation */ +}; static ber_tlv_tag_t asn_DEF_NO_IntegerOutRange_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -1512,17 +1510,17 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerOutRange = { /sizeof(asn_DEF_NO_IntegerOutRange_tags_1[0]), /* 1 */ &asn_PER_type_NO_IntegerOutRange_constr_1, 0, 0, /* No members */ - 0 /* No specifics */ + &asn_SPC_NO_IntegerOutRange_specs_1 /* Additional specs */ }; /*** <<< INCLUDES [NO-IntegerOutValue] >>> ***/ -#include +#include /*** <<< TYPE-DECLS [NO-IntegerOutValue] >>> ***/ -typedef INTEGER_t NO_IntegerOutValue_t; +typedef unsigned long NO_IntegerOutValue_t; /*** <<< FUNC-DECLS [NO-IntegerOutValue] >>> ***/ @@ -1542,8 +1540,7 @@ per_type_encoder_f NO_IntegerOutValue_encode_uper; int NO_IntegerOutValue_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { - const INTEGER_t *st = (const INTEGER_t *)sptr; - long value; + unsigned long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, @@ -1552,12 +1549,7 @@ NO_IntegerOutValue_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - if(asn_INTEGER2long(st, &value)) { - _ASN_CTFAIL(app_key, td, sptr, - "%s: value too large (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } + value = *(const unsigned long *)sptr; if((value == 3000000000)) { /* Constraint check succeeded */ @@ -1571,24 +1563,24 @@ NO_IntegerOutValue_constraint(asn_TYPE_descriptor_t *td, const void *sptr, } /* - * This type is implemented using INTEGER, + * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void NO_IntegerOutValue_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { - td->free_struct = asn_DEF_INTEGER.free_struct; - td->print_struct = asn_DEF_INTEGER.print_struct; - td->ber_decoder = asn_DEF_INTEGER.ber_decoder; - td->der_encoder = asn_DEF_INTEGER.der_encoder; - td->xer_decoder = asn_DEF_INTEGER.xer_decoder; - td->xer_encoder = asn_DEF_INTEGER.xer_encoder; - td->uper_decoder = asn_DEF_INTEGER.uper_decoder; - td->uper_encoder = asn_DEF_INTEGER.uper_encoder; + td->free_struct = asn_DEF_NativeInteger.free_struct; + td->print_struct = asn_DEF_NativeInteger.print_struct; + td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; + td->der_encoder = asn_DEF_NativeInteger.der_encoder; + td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; + td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) - td->per_constraints = asn_DEF_INTEGER.per_constraints; - td->elements = asn_DEF_INTEGER.elements; - td->elements_count = asn_DEF_INTEGER.elements_count; - td->specifics = asn_DEF_INTEGER.specifics; + td->per_constraints = asn_DEF_NativeInteger.per_constraints; + td->elements = asn_DEF_NativeInteger.elements; + td->elements_count = asn_DEF_NativeInteger.elements_count; + /* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */ } void @@ -1661,6 +1653,11 @@ static asn_per_constraints_t asn_PER_type_NO_IntegerOutValue_constr_1 = { /*** <<< STAT-DEFS [NO-IntegerOutValue] >>> ***/ +static asn_INTEGER_specifics_t asn_SPC_NO_IntegerOutValue_specs_1 = { + 0, 0, 0, 0, 0, + 0, /* Native long size */ + 1 /* Unsigned representation */ +}; static ber_tlv_tag_t asn_DEF_NO_IntegerOutValue_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -1685,7 +1682,7 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerOutValue = { /sizeof(asn_DEF_NO_IntegerOutValue_tags_1[0]), /* 1 */ &asn_PER_type_NO_IntegerOutValue_constr_1, 0, 0, /* No members */ - 0 /* No specifics */ + &asn_SPC_NO_IntegerOutValue_specs_1 /* Additional specs */ }; @@ -2532,11 +2529,11 @@ asn_TYPE_descriptor_t asn_DEF_OK_IntegerInRange5 = { /*** <<< INCLUDES [NO-IntegerInRange6] >>> ***/ -#include +#include /*** <<< TYPE-DECLS [NO-IntegerInRange6] >>> ***/ -typedef INTEGER_t NO_IntegerInRange6_t; +typedef unsigned long NO_IntegerInRange6_t; /*** <<< FUNC-DECLS [NO-IntegerInRange6] >>> ***/ @@ -2556,8 +2553,7 @@ per_type_encoder_f NO_IntegerInRange6_encode_uper; int NO_IntegerInRange6_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { - const INTEGER_t *st = (const INTEGER_t *)sptr; - long value; + unsigned long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, @@ -2566,43 +2562,31 @@ NO_IntegerInRange6_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return -1; } - if(asn_INTEGER2long(st, &value)) { - _ASN_CTFAIL(app_key, td, sptr, - "%s: value too large (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } + value = *(const unsigned long *)sptr; - if((value >= 0 && value <= 4294967295)) { - /* Constraint check succeeded */ - return 0; - } else { - _ASN_CTFAIL(app_key, td, sptr, - "%s: constraint failed (%s:%d)", - td->name, __FILE__, __LINE__); - return -1; - } + /* Constraint check succeeded */ + return 0; } /* - * This type is implemented using INTEGER, + * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void NO_IntegerInRange6_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { - td->free_struct = asn_DEF_INTEGER.free_struct; - td->print_struct = asn_DEF_INTEGER.print_struct; - td->ber_decoder = asn_DEF_INTEGER.ber_decoder; - td->der_encoder = asn_DEF_INTEGER.der_encoder; - td->xer_decoder = asn_DEF_INTEGER.xer_decoder; - td->xer_encoder = asn_DEF_INTEGER.xer_encoder; - td->uper_decoder = asn_DEF_INTEGER.uper_decoder; - td->uper_encoder = asn_DEF_INTEGER.uper_encoder; + td->free_struct = asn_DEF_NativeInteger.free_struct; + td->print_struct = asn_DEF_NativeInteger.print_struct; + td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; + td->der_encoder = asn_DEF_NativeInteger.der_encoder; + td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; + td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) - td->per_constraints = asn_DEF_INTEGER.per_constraints; - td->elements = asn_DEF_INTEGER.elements; - td->elements_count = asn_DEF_INTEGER.elements_count; - td->specifics = asn_DEF_INTEGER.specifics; + td->per_constraints = asn_DEF_NativeInteger.per_constraints; + td->elements = asn_DEF_NativeInteger.elements; + td->elements_count = asn_DEF_NativeInteger.elements_count; + /* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */ } void @@ -2675,6 +2659,11 @@ static asn_per_constraints_t asn_PER_type_NO_IntegerInRange6_constr_1 = { /*** <<< STAT-DEFS [NO-IntegerInRange6] >>> ***/ +static asn_INTEGER_specifics_t asn_SPC_NO_IntegerInRange6_specs_1 = { + 0, 0, 0, 0, 0, + 0, /* Native long size */ + 1 /* Unsigned representation */ +}; static ber_tlv_tag_t asn_DEF_NO_IntegerInRange6_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; @@ -2699,7 +2688,7 @@ asn_TYPE_descriptor_t asn_DEF_NO_IntegerInRange6 = { /sizeof(asn_DEF_NO_IntegerInRange6_tags_1[0]), /* 1 */ &asn_PER_type_NO_IntegerInRange6_constr_1, 0, 0, /* No members */ - 0 /* No specifics */ + &asn_SPC_NO_IntegerInRange6_specs_1 /* Additional specs */ }; From 5568124650c3191e520070da8701027e716a7acd Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 3 Dec 2007 14:58:39 +0000 Subject: [PATCH 1390/1469] do not include iberty if getopt is available by default. hurts CYGWIN git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1402 59561ff5-6e30-0410-9f3c-9617f08c8826 --- config.h.in | 3 - configure | 6578 ++++++++++++++++++++++---------------------------- configure.in | 2 +- 3 files changed, 2948 insertions(+), 3635 deletions(-) diff --git a/config.h.in b/config.h.in index 799d891d6..0a2cf45b6 100644 --- a/config.h.in +++ b/config.h.in @@ -6,9 +6,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H -/* Define to 1 if you have the `iberty' library (-liberty). */ -#undef HAVE_LIBIBERTY - /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H diff --git a/configure b/configure index 97621be06..ce224f0e4 100755 --- a/configure +++ b/configure @@ -571,15 +571,15 @@ fi # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. -if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test -z "$ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... - if (echo_test_string="`eval $cmd`") 2>/dev/null && - echo_test_string="`eval $cmd`" && + if (echo_test_string=`eval $cmd`) 2>/dev/null && + echo_test_string=`eval $cmd` && (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null then break @@ -3811,7 +3811,7 @@ lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do - test ! -f $lt_ac_sed && break + test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in @@ -3836,10 +3836,10 @@ for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do fi done done -SED=$lt_cv_path_SED fi +SED=$lt_cv_path_SED { echo "$as_me:$LINENO: result: $SED" >&5 echo "${ECHO_T}$SED" >&6; } @@ -4063,7 +4063,7 @@ else if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. + # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &6; } if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - # I'd rather use --version here, but apparently some GNU ld's only accept -v. + # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6; } @@ -4137,36 +4146,43 @@ else # Let the user override the test. lt_cv_path_NM="$NM" else - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/${ac_tool_prefix}nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" break ;; *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac ;; esac - esac - fi + fi + done + IFS="$lt_save_ifs" done - IFS="$lt_save_ifs" test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi fi @@ -4213,7 +4229,7 @@ beos*) lt_cv_deplibs_check_method=pass_all ;; -bsdi4*) +bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so @@ -4236,13 +4252,13 @@ darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; -freebsd* | kfreebsd*-gnu) +freebsd* | kfreebsd*-gnu | dragonfly*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; @@ -4258,7 +4274,7 @@ gnu*) hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file - case "$host_cpu" in + case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so @@ -4274,6 +4290,11 @@ hpux10.20* | hpux11*) esac ;; +interix3*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; @@ -4286,15 +4307,6 @@ irix5* | irix6* | nonstopux*) # This must be Linux ELF. linux*) - case $host_cpu in - alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*) - lt_cv_deplibs_check_method=pass_all ;; - *) - # glibc up to 2.1.1 does not perform some relocations on ARM - # this will be overridden with pass_all, but let us keep it just in case - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; - esac - lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` lt_cv_deplibs_check_method=pass_all ;; @@ -4317,12 +4329,10 @@ nto-qnx*) ;; openbsd*) - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object' + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else - lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; @@ -4330,15 +4340,11 @@ osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; -sco3.2v5*) - lt_cv_deplibs_check_method=pass_all - ;; - solaris*) lt_cv_deplibs_check_method=pass_all ;; -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' @@ -4359,10 +4365,13 @@ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) siemens) lt_cv_deplibs_check_method=pass_all ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; esac ;; -sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7* | sysv4*uw2*) +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac @@ -4380,6 +4389,9 @@ test -z "$deplibs_check_method" && deplibs_check_method=unknown # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + # Allow CC to be a program name with arguments. compiler=$CC @@ -4415,7 +4427,7 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 4418 "configure"' > conftest.$ac_ext + echo '#line 4430 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -4458,7 +4470,7 @@ x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then - case "`/usr/bin/file conftest.o`" in + case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*linux*) @@ -4584,6 +4596,26 @@ echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6; } CFLAGS="$SAVE_CFLAGS" fi ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) LD="${LD-ld} -64" ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + esac @@ -5831,7 +5863,12 @@ else fi -ac_ext=cpp + + +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -6085,6 +6122,8 @@ ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +fi + ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' @@ -6426,11 +6465,55 @@ else lt_cv_sys_max_cmd_len=8192; ;; - *) + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. - while (test "X"`$CONFIG_SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ = "XX$teststring") >/dev/null 2>&1 && new_result=`expr "X$teststring" : ".*" 2>&1` && lt_cv_sys_max_cmd_len=$new_result && @@ -6476,9 +6559,6 @@ symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' -# Transform the above into a raw symbol and a C symbol. -symxfrm='\1 \2\3 \3' - # Transform an extracted symbol line into a proper C declaration lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" @@ -6500,15 +6580,31 @@ hpux*) # Its linker distinguishes data from code symbols lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; +linux*) + if test "$host_cpu" = ia64; then + symcode='[ABCDGIRSTW]' + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + fi + ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; -solaris* | sysv5*) +solaris*) symcode='[BDRT]' ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; sysv4) symcode='[DFNSTU]' ;; @@ -6531,8 +6627,11 @@ esac # Try without a prefix undercore, then with it. for ac_symprfx in "" "_"; do + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + # Write the raw and C identifiers. - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no @@ -6694,7 +6793,7 @@ esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. -Xsed='sed -e s/^X//' +Xsed='sed -e 1s/^X//' sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' # Same as above, but do not quote variable references. @@ -6714,7 +6813,7 @@ rm="rm -f" default_ofile=libtool can_build_shared=yes -# All known linkers require a `.a' archive for static linking (except M$VC, +# All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a ltmain="$ac_aux_dir/ltmain.sh" @@ -7019,6 +7118,7 @@ test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" @@ -7038,15 +7138,26 @@ old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) - old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) - old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + # Only perform the check for file, if the check method requires it case $deplibs_check_method in file_magic*) @@ -7072,7 +7183,7 @@ else if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) - file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then @@ -7134,7 +7245,7 @@ else if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) - file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then @@ -7229,68 +7340,25 @@ lt_simple_link_test_code='int main(){return(0);}\n' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + # Allow CC to be a program name with arguments. compiler=$CC -# -# Check for any special shared library compilation flags. -# -lt_prog_cc_shlib= -if test "$GCC" = no; then - case $host_os in - sco3.2v5*) - lt_prog_cc_shlib='-belf' - ;; - esac -fi -if test -n "$lt_prog_cc_shlib"; then - { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&5 -echo "$as_me: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&2;} - if echo "$old_CC $old_CFLAGS " | grep "[ ]$lt_prog_cc_shlib[ ]" >/dev/null; then : - else - { echo "$as_me:$LINENO: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 -echo "$as_me: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} - lt_cv_prog_cc_can_build_shared=no - fi -fi - - -# -# Check to make sure the static flag actually works. -# -{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_prog_compiler_static works" >&5 -echo $ECHO_N "checking if $compiler static flag $lt_prog_compiler_static works... $ECHO_C" >&6; } -if test "${lt_prog_compiler_static_works+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_prog_compiler_static_works=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_prog_compiler_static" - printf "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - else - lt_prog_compiler_static_works=yes - fi - fi - $rm conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 -echo "${ECHO_T}$lt_prog_compiler_static_works" >&6; } - -if test x"$lt_prog_compiler_static_works" = xyes; then - : -else - lt_prog_compiler_static= -fi +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +printf "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* +ac_outfile=conftest.$ac_objext +printf "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm conftest* @@ -7315,18 +7383,20 @@ else # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7321: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7389: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:7325: \$? = $ac_status" >&5 + echo "$as_me:7393: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s conftest.err; then + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi @@ -7387,6 +7457,11 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } lt_prog_compiler_pic='-fno-common' ;; + interix3*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. @@ -7403,7 +7478,7 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. - case "$host_cpu" in + case $host_cpu in hppa*64*|ia64*) # +Z the default ;; @@ -7429,6 +7504,16 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic='-qnocommon' + lt_prog_compiler_wl='-Wl,' + ;; + esac + ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being @@ -7440,7 +7525,7 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. - case "$host_cpu" in + case $host_cpu in hppa*64*|ia64*) # +Z the default ;; @@ -7464,12 +7549,19 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } ;; linux*) - case $CC in + case $cc_basename in icc* | ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. @@ -7484,15 +7576,15 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } lt_prog_compiler_static='-non_shared' ;; - sco3.2v5*) - lt_prog_compiler_pic='-Kpic' - lt_prog_compiler_static='-dn' - ;; - solaris*) - lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac ;; sunos4*) @@ -7501,7 +7593,7 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } lt_prog_compiler_static='-Bstatic' ;; - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' @@ -7514,6 +7606,17 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } fi ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' @@ -7548,18 +7651,20 @@ else # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7554: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7657: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:7558: \$? = $ac_status" >&5 + echo "$as_me:7661: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s conftest.err; then + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_pic_works=yes fi fi @@ -7580,7 +7685,7 @@ else fi fi -case "$host_os" in +case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= @@ -7590,6 +7695,48 @@ case "$host_os" in ;; esac +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; } +if test "${lt_prog_compiler_static_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_static_works=yes + fi + else + lt_prog_compiler_static_works=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 +echo "${ECHO_T}$lt_prog_compiler_static_works" >&6; } + +if test x"$lt_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_c_o+set}" = set; then @@ -7608,23 +7755,25 @@ else # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7614: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7761: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:7618: \$? = $ac_status" >&5 + echo "$as_me:7765: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings - if test ! -s out/conftest.err; then + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi - chmod u+w . + chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation @@ -7700,6 +7849,16 @@ echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared librar # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` case $host_os in cygwin* | mingw* | pw32*) @@ -7710,6 +7869,10 @@ echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared librar with_gnu_ld=no fi ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; openbsd*) with_gnu_ld=no ;; @@ -7720,6 +7883,27 @@ echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared librar # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) @@ -7770,10 +7954,10 @@ EOF allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then @@ -7782,7 +7966,53 @@ EOF echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + interix3*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + archive_cmds='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi else ld_shlibs=no fi @@ -7798,7 +8028,7 @@ EOF fi ;; - solaris* | sysv5*) + solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <&2 @@ -7819,6 +8049,33 @@ EOF fi ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= @@ -7826,31 +8083,6 @@ EOF hardcode_shlibpath_var=no ;; - linux*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_cmds="$tmp_archive_cmds" - supports_anon_versioning=no - case `$LD -v 2>/dev/null` in - *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - if test $supports_anon_versioning = yes; then - archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ -cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ -$echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - else - archive_expsym_cmds="$tmp_archive_cmds" - fi - else - ld_shlibs=no - fi - ;; - *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' @@ -7861,16 +8093,11 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ ;; esac - if test "$ld_shlibs" = yes; then - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec= - fi + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) @@ -7882,7 +8109,7 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes - if test "$GCC" = yes && test -z "$link_static_flag"; then + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported @@ -7916,6 +8143,7 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ break fi done + ;; esac exp_sym_flag='-bexport' @@ -7934,7 +8162,7 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ link_all_deplibs=yes if test "$GCC" = yes; then - case $host_os in aix4.012|aix4.012.*) + case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` @@ -7953,8 +8181,12 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi + ;; esac shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi else # not using gcc if test "$host_cpu" = ia64; then @@ -7962,11 +8194,11 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else - if test "$aix_use_runtimelinking" = yes; then + if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' - fi + fi fi fi @@ -8045,12 +8277,12 @@ rm -f core conftest.err conftest.$ac_objext \ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF @@ -8124,13 +8356,11 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' - # -bexpall does not export symbols beginning with underscore (_) - always_export_symbols=yes # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec=' ' + whole_archive_flag_spec='$convenience' archive_cmds_need_lc=yes - # This is similar to how AIX traditionally builds it's shared libraries. - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; @@ -8143,7 +8373,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ld_shlibs=no ;; - bsdi4*) + bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; @@ -8169,52 +8399,52 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; darwin* | rhapsody*) - if test "$GXX" = yes ; then - archive_cmds_need_lc=no - case "$host_os" in - rhapsody* | darwin1.[012]) - allow_undefined_flag='-undefined suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - allow_undefined_flag='-flat_namespace -undefined suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[012]) - allow_undefined_flag='-flat_namespace -undefined suppress' - ;; - 10.*) - allow_undefined_flag='-undefined dynamic_lookup' - ;; - esac - fi - ;; + case $host_os in + rhapsody* | darwin1.[012]) + allow_undefined_flag='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; esac - lt_int_apple_cc_single_mod=no - output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes - fi - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - archive_cmds='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - else - archive_cmds='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - fi - module_cmds='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported - whole_archive_flag_spec='-all_load $convenience' + whole_archive_flag_spec='' link_all_deplibs=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else - ld_shlibs=no + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs=no + ;; + esac fi ;; @@ -8248,7 +8478,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | kfreebsd*-gnu) + freebsd* | kfreebsd*-gnu | dragonfly*) archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes @@ -8271,47 +8501,62 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi export_dynamic_flag_spec='${wl}-E' ;; - hpux10* | hpux11*) + hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then - case "$host_cpu" in - hppa*64*|ia64*) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + hardcode_direct=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; + ia64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; *) archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else - case "$host_cpu" in - hppa*64*|ia64*) - archive_cmds='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then - case "$host_cpu" in - hppa*64*) - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) hardcode_libdir_flag_spec_ld='+b $libdir' - hardcode_libdir_separator=: hardcode_direct=no hardcode_shlibpath_var=no ;; - ia64*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=no - hardcode_shlibpath_var=no - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; *) - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: hardcode_direct=yes export_dynamic_flag_spec='${wl}-E' @@ -8359,6 +8604,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_shlibpath_var=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else @@ -8404,7 +8650,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ - $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' @@ -8412,21 +8658,15 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_separator=: ;; - sco3.2v5*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='${wl}-Bexport' - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ;; - solaris*) no_undefined_flag=' -z text' if test "$GCC" = yes; then + wlarc='${wl}' archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else + wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' @@ -8435,8 +8675,18 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; - *) # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + *) + # The compiler driver will combine linker options so we + # cannot just pass the convience library names through + # without $wl, iff we do not link with $LD. + # Luckily, gcc supports the same syntax we need for Sun Studio. + # Supported since Solaris 2.6 (maybe 2.5.1?) + case $wlarc in + '') + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + *) + whole_archive_flag_spec='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; + esac ;; esac link_all_deplibs=yes ;; @@ -8493,36 +8743,45 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi fi ;; - sysv4.2uw2*) - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=no + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no hardcode_shlibpath_var=no - hardcode_runpath_var=yes - runpath_var=LD_RUN_PATH - ;; + runpath_var='LD_RUN_PATH' - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) - no_undefined_flag='${wl}-z ${wl}text' if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else - archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no ;; - sysv5*) - no_undefined_flag=' -z text' - # $CC -shared without GNU ld will not create a library from C++ - # object files and a static libstdc++, better avoid it by now - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - hardcode_libdir_flag_spec= + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi ;; uts4*) @@ -8541,11 +8800,6 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi echo "${ECHO_T}$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - # # Do we need to explicitly link libc? # @@ -8578,6 +8832,7 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= @@ -8710,7 +8965,7 @@ beos*) shlibpath_var=LIBRARY_PATH ;; -bsdi4*) +bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -8738,7 +8993,8 @@ cygwin* | mingw* | pw32*) dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' @@ -8768,7 +9024,7 @@ cygwin* | mingw* | pw32*) ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; @@ -8791,7 +9047,7 @@ darwin* | rhapsody*) soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` @@ -8826,8 +9082,17 @@ kfreebsd*-gnu) dynamic_linker='GNU ld.so' ;; -freebsd*) - objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) @@ -8845,14 +9110,19 @@ freebsd*) freebsd2*) shlibpath_overrides_runpath=yes ;; - freebsd3.01* | freebsdelf3.01*) + freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; - *) # from 3.2 on + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; + freebsd*) # from 4.6 on + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; esac ;; @@ -8872,7 +9142,7 @@ hpux9* | hpux10* | hpux11*) version_type=sunos need_lib_prefix=no need_version=no - case "$host_cpu" in + case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes @@ -8912,6 +9182,18 @@ hpux9* | hpux10* | hpux11*) postinstall_cmds='chmod 555 $lib' ;; +interix3*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; @@ -8971,7 +9253,7 @@ linux*) # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then - lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi @@ -9033,8 +9315,13 @@ nto-qnx*) openbsd*) version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no - need_version=yes + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH @@ -9072,13 +9359,6 @@ osf3* | osf4* | osf5*) sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; -sco3.2v5*) - version_type=osf - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - ;; - solaris*) version_type=linux need_lib_prefix=no @@ -9104,7 +9384,7 @@ sunos4*) need_version=yes ;; -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' @@ -9137,6 +9417,29 @@ sysv4*MP*) fi ;; +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -9152,12 +9455,17 @@ esac echo "${ECHO_T}$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || \ - test -n "$runpath_var " || \ - test "X$hardcode_automatic"="Xyes" ; then + test -n "$runpath_var" || \ + test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct" != no && @@ -9886,7 +10194,7 @@ fi test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" - eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" @@ -9902,7 +10210,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) 2>/dev/null + (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_unknown|x*) lt_cv_dlopen_self=no ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed @@ -9988,7 +10298,7 @@ fi echo "${ECHO_T}$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then - LDFLAGS="$LDFLAGS $link_static_flag" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6; } if test "${lt_cv_dlopen_self_static+set}" = set; then @@ -10000,7 +10310,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) 2>/dev/null + (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed @@ -10104,7 +10416,7 @@ echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6; } fi -# Report which librarie types wil actually be built +# Report which library types will actually be built { echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6; } { echo "$as_me:$LINENO: result: $can_build_shared" >&5 @@ -10116,7 +10428,7 @@ test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. -case "$host_os" in +case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then @@ -10128,43 +10440,6 @@ aix3*) aix4* | aix5*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no - fi - ;; - darwin* | rhapsody*) - if test "$GCC" = yes; then - archive_cmds_need_lc=no - case "$host_os" in - rhapsody* | darwin1.[012]) - allow_undefined_flag='-undefined suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - allow_undefined_flag='-flat_namespace -undefined suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[012]) - allow_undefined_flag='-flat_namespace -undefined suppress' - ;; - 10.*) - allow_undefined_flag='-undefined dynamic_lookup' - ;; - esac - fi - ;; - esac - output_verbose_link_cmd='echo' - archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring' - module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's - archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - hardcode_direct=no - hardcode_automatic=yes - hardcode_shlibpath_var=unsupported - whole_archive_flag_spec='-all_load $convenience' - link_all_deplibs=yes - else - ld_shlibs=no fi ;; esac @@ -10191,7 +10466,7 @@ if test -f "$ltmain"; then # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ @@ -10295,7 +10570,7 @@ echo "$as_me: creating $ofile" >&6;} # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a @@ -10306,11 +10581,11 @@ echo "$as_me: creating $ofile" >&6;} SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="$SED -e s/^X//" +Xsed="$SED -e 1s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. -if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH # The names of the tagged configurations supported by this script. available_tags= @@ -10340,6 +10615,12 @@ fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo @@ -10351,6 +10632,9 @@ AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + # A language-specific compiler. CC=$lt_compiler @@ -10416,7 +10700,7 @@ max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o -# Must we lock files when doing compilation ? +# Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? @@ -10681,6 +10965,9 @@ echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} fi fi + if test -z "$LTCFLAGS"; then + eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" + fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. @@ -10711,7 +10998,9 @@ echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} case $tagname in CXX) - if test -n "$CXX" && test "X$CXX" != "Xno"; then + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -10731,6 +11020,7 @@ hardcode_libdir_flag_spec_CXX= hardcode_libdir_flag_spec_ld_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= @@ -10748,7 +11038,7 @@ postdeps_CXX= compiler_lib_search_path_CXX= # Source file extension for C++ test sources. -ac_ext=cc +ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o @@ -10758,17 +11048,34 @@ objext_CXX=$objext lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests -lt_simple_link_test_code='int main(int, char *) { return(0); }\n' +lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + # Allow CC to be a program name with arguments. compiler=$CC +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +printf "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +printf "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm conftest* + + # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD @@ -10779,18 +11086,27 @@ lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else - unset lt_cv_prog_gnu_ld + $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else - unset lt_cv_path_LD + $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC compiler_CXX=$CC -cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + # We don't want -fno-exception wen compiling C++ code, so set the # no_builtin_flag separately @@ -10861,7 +11177,7 @@ else if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. + # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &6; } if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - # I'd rather use --version here, but apparently some GNU ld's only accept -v. + # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 conftest.$ac_ext <<_ACEOF @@ -11195,16 +11516,26 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' - # -bexpall does not export symbols beginning with underscore (_) - always_export_symbols_CXX=yes # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_CXX=' ' + whole_archive_flag_spec_CXX='$convenience' archive_cmds_need_lc_CXX=yes - # This is similar to how AIX traditionally builds it's shared libraries. - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + chorus*) case $cc_basename in *) @@ -11223,7 +11554,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then @@ -11232,70 +11563,81 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[012]) + allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + whole_archive_flag_spec_CXX='' + link_all_deplibs_CXX=yes - darwin* | rhapsody*) - if test "$GXX" = yes; then - archive_cmds_need_lc_CXX=no - case "$host_os" in - rhapsody* | darwin1.[012]) - allow_undefined_flag_CXX='-undefined suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - allow_undefined_flag_CXX='-flat_namespace -undefined suppress' + if test "$GXX" = yes ; then + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[012]) - allow_undefined_flag_CXX='-flat_namespace -undefined suppress' - ;; - 10.*) - allow_undefined_flag_CXX='-undefined dynamic_lookup' - ;; - esac + archive_cmds_CXX='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_CXX=no + ;; + esac fi - ;; - esac - lt_int_apple_cc_single_mod=no - output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes - fi - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - else - archive_cmds_CXX='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - fi - module_cmds_CXX='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - hardcode_direct_CXX=no - hardcode_automatic_CXX=yes - hardcode_shlibpath_var_CXX=unsupported - whole_archive_flag_spec_CXX='-all_load $convenience' - link_all_deplibs_CXX=yes - else - ld_shlibs_CXX=no - fi - ;; + ;; dgux*) case $cc_basename in - ec++) + ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; - ghcx) + ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no @@ -11306,14 +11648,14 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; esac ;; - freebsd12*) + freebsd[12]*) # C++ shared libraries reported to be fairly broken before switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; - freebsd* | kfreebsd*-gnu) + freebsd* | kfreebsd*-gnu | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes @@ -11330,11 +11672,11 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi # location of the library. case $cc_basename in - CC) + CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; - aCC) + aCC*) archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when @@ -11344,7 +11686,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then @@ -11358,33 +11700,22 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then - case "$host_cpu" in - hppa*64*) - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) hardcode_libdir_flag_spec_ld_CXX='+b $libdir' - hardcode_libdir_separator_CXX=: - ;; - ia64*) - hardcode_libdir_flag_spec_CXX='-L$libdir' ;; *) - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi - case "$host_cpu" in - hppa*64*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - ;; - ia64*) + case $host_cpu in + hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. ;; *) hardcode_direct_CXX=yes @@ -11395,14 +11726,17 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi esac case $cc_basename in - CC) + CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; - aCC) - case "$host_cpu" in - hppa*64*|ia64*) - archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' @@ -11421,9 +11755,12 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then - case "$host_cpu" in - ia64*|hppa*64*) - archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' @@ -11437,11 +11774,25 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; esac ;; + interix3*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; irix5* | irix6*) case $cc_basename in - CC) + CC*) # SGI C++ - archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is @@ -11452,7 +11803,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' fi @@ -11465,7 +11816,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; linux*) case $cc_basename in - KCC) + KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file @@ -11490,17 +11841,41 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; - icpc) + icpc*) # Intel C++ with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac archive_cmds_need_lc_CXX=no - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; - cxx) + pgCC*) + # Portland Group C++ compiler + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' @@ -11531,7 +11906,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; mvs*) case $cc_basename in - cxx) + cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; @@ -11552,9 +11927,25 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; + openbsd2*) + # C++ shared libraries are fairly broken + ld_shlibs_CXX=no + ;; + openbsd*) + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + ;; osf3*) case $cc_basename in - KCC) + KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file @@ -11570,14 +11961,14 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; - RCC) + RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; - cxx) + cxx*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: @@ -11595,7 +11986,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: @@ -11614,7 +12005,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; osf4* | osf5*) case $cc_basename in - KCC) + KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file @@ -11629,17 +12020,17 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi # the KAI C++ compiler. old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; - RCC) + RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; - cxx) + cxx*) allow_undefined_flag_CXX=' -expect_unresolved \*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ $rm $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' @@ -11658,7 +12049,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: @@ -11679,27 +12070,14 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; - sco*) - archive_cmds_need_lc_CXX=no - case $cc_basename in - CC) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; sunos4*) case $cc_basename in - CC) + CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; - lcc) + lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no @@ -11712,36 +12090,33 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; solaris*) case $cc_basename in - CC) + CC*) # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in - solaris2.0-5 | solaris2.0-5.*) ;; + solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The C++ compiler is used as linker so we must use $wl # flag to pass the commands to the underlying system - # linker. + # linker. We must also pass each convience library through + # to the system linker between allextract/defaultextract. + # The C++ compiler will combine linker options so we + # cannot just pass the convience library names through + # without $wl. # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; esac link_all_deplibs_CXX=yes - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[LR]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is @@ -11749,7 +12124,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; - gcx) + gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' @@ -11787,23 +12162,74 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; esac ;; - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no - ;; - tandem*) + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + case $cc_basename in - NCC) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; - vxworks*) + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + # So that behaviour is only enabled if SCOABSPATH is set to a + # non-empty value in the environment. Most likely only useful for + # creating official distributions of packages. + # This is a hack until libtool officially supports absolute path + # names for shared libraries. + no_undefined_flag_CXX='${wl}-z,text' + allow_undefined_flag_CXX='${wl}-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; @@ -11845,7 +12271,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 # The `*' in the case matches for architectures that use `case' in # $output_verbose_cmd can trigger glob expansion during the loop # eval without this substitution. - output_verbose_link_cmd="`$echo \"X$output_verbose_link_cmd\" | $Xsed -e \"$no_glob_subst\"`" + output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"` for p in `eval $output_verbose_link_cmd`; do case $p in @@ -11921,6 +12347,29 @@ fi $rm -f confest.$objext +# PORTME: override above test on systems where it is broken +case $host_os in +interix3*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; + +solaris*) + case $cc_basename in + CC*) + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + postdeps_CXX='-lCstd -lCrun' + ;; + esac + ;; +esac + + case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac @@ -11968,6 +12417,10 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; + interix3*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic @@ -11976,7 +12429,7 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. - case "$host_cpu" in + case $host_cpu in hppa*64*|ia64*) ;; *) @@ -12001,18 +12454,28 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } ;; chorus*) case $cc_basename in - cxch68) + cxch68*) # Green Hills C++ Compiler # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic_CXX='-qnocommon' + lt_prog_compiler_wl_CXX='-Wl,' + ;; + esac + ;; dgux*) case $cc_basename in - ec++) + ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; - ghcx) + ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; @@ -12020,22 +12483,22 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } ;; esac ;; - freebsd* | kfreebsd*-gnu) + freebsd* | kfreebsd*-gnu | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in - CC) + CC*) lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; - aCC) + aCC*) lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" - case "$host_cpu" in + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + case $host_cpu in hppa*64*|ia64*) # +Z the default ;; @@ -12048,9 +12511,13 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } ;; esac ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; irix5* | irix6* | nonstopux*) case $cc_basename in - CC) + CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. @@ -12061,18 +12528,24 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } ;; linux*) case $cc_basename in - KCC) + KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; - icpc) + icpc* | ecpc*) # Intel C++ lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; - cxx) + pgCC*) + # Portland Group C++ compiler. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. @@ -12089,7 +12562,7 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } ;; mvs*) case $cc_basename in - cxx) + cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) @@ -12100,14 +12573,14 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } ;; osf3* | osf4* | osf5*) case $cc_basename in - KCC) + KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; - RCC) + RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; - cxx) + cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha @@ -12121,24 +12594,15 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } ;; psos*) ;; - sco*) - case $cc_basename in - CC) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - *) - ;; - esac - ;; solaris*) case $cc_basename in - CC) + CC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; - gcx) + gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; @@ -12148,12 +12612,12 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } ;; sunos4*) case $cc_basename in - CC) + CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; - lcc) + lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; @@ -12163,7 +12627,7 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } ;; tandem*) case $cc_basename in - NCC) + NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; @@ -12171,7 +12635,14 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } ;; esac ;; - unixware*) + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac ;; vxworks*) ;; @@ -12204,18 +12675,20 @@ else # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:12210: $lt_compile\"" >&5) + (eval echo "\"\$as_me:12681: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:12214: \$? = $ac_status" >&5 + echo "$as_me:12685: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s conftest.err; then + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_pic_works_CXX=yes fi fi @@ -12236,7 +12709,7 @@ else fi fi -case "$host_os" in +case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= @@ -12246,6 +12719,48 @@ case "$host_os" in ;; esac +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; } +if test "${lt_prog_compiler_static_works_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_static_works_CXX=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_static_works_CXX=yes + fi + else + lt_prog_compiler_static_works_CXX=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_CXX" >&5 +echo "${ECHO_T}$lt_prog_compiler_static_works_CXX" >&6; } + +if test x"$lt_prog_compiler_static_works_CXX" = xyes; then + : +else + lt_prog_compiler_static_CXX= +fi + + { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then @@ -12264,23 +12779,25 @@ else # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:12270: $lt_compile\"" >&5) + (eval echo "\"\$as_me:12785: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:12274: \$? = $ac_status" >&5 + echo "$as_me:12789: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings - if test ! -s out/conftest.err; then + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi - chmod u+w . + chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation @@ -12335,7 +12852,7 @@ echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared librar export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw*) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([^ ]*\) [^ ]*/\1 DATA/;/^I /d;/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' @@ -12346,11 +12863,6 @@ echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared librar echo "${ECHO_T}$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - # # Do we need to explicitly link libc? # @@ -12383,6 +12895,7 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= @@ -12515,7 +13028,7 @@ beos*) shlibpath_var=LIBRARY_PATH ;; -bsdi4*) +bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -12543,7 +13056,8 @@ cygwin* | mingw* | pw32*) dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' @@ -12573,7 +13087,7 @@ cygwin* | mingw* | pw32*) ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; @@ -12596,7 +13110,7 @@ darwin* | rhapsody*) soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` @@ -12631,8 +13145,17 @@ kfreebsd*-gnu) dynamic_linker='GNU ld.so' ;; -freebsd*) - objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) @@ -12650,14 +13173,19 @@ freebsd*) freebsd2*) shlibpath_overrides_runpath=yes ;; - freebsd3.01* | freebsdelf3.01*) + freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; - *) # from 3.2 on + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; + freebsd*) # from 4.6 on + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; esac ;; @@ -12677,7 +13205,7 @@ hpux9* | hpux10* | hpux11*) version_type=sunos need_lib_prefix=no need_version=no - case "$host_cpu" in + case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes @@ -12717,6 +13245,18 @@ hpux9* | hpux10* | hpux11*) postinstall_cmds='chmod 555 $lib' ;; +interix3*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; @@ -12776,7 +13316,7 @@ linux*) # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then - lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi @@ -12838,8 +13378,13 @@ nto-qnx*) openbsd*) version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no - need_version=yes + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH @@ -12877,13 +13422,6 @@ osf3* | osf4* | osf5*) sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; -sco3.2v5*) - version_type=osf - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - ;; - solaris*) version_type=linux need_lib_prefix=no @@ -12909,7 +13447,7 @@ sunos4*) need_version=yes ;; -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' @@ -12942,6 +13480,29 @@ sysv4*MP*) fi ;; +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -12957,12 +13518,17 @@ esac echo "${ECHO_T}$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || \ - test -n "$runpath_var CXX" || \ - test "X$hardcode_automatic_CXX"="Xyes" ; then + test -n "$runpath_var_CXX" || \ + test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_CXX" != no && @@ -12994,1248 +13560,343 @@ elif test "$shlibpath_overrides_runpath" = yes || enable_fast_install=needless fi -striplib= -old_striplib= -{ echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6; } -if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } - else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - ;; - *) - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } - ;; - esac -fi -if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_CXX \ + CC_CXX \ + LD_CXX \ + lt_prog_compiler_wl_CXX \ + lt_prog_compiler_pic_CXX \ + lt_prog_compiler_static_CXX \ + lt_prog_compiler_no_builtin_flag_CXX \ + export_dynamic_flag_spec_CXX \ + thread_safe_flag_spec_CXX \ + whole_archive_flag_spec_CXX \ + enable_shared_with_static_runtimes_CXX \ + old_archive_cmds_CXX \ + old_archive_from_new_cmds_CXX \ + predep_objects_CXX \ + postdep_objects_CXX \ + predeps_CXX \ + postdeps_CXX \ + compiler_lib_search_path_CXX \ + archive_cmds_CXX \ + archive_expsym_cmds_CXX \ + postinstall_cmds_CXX \ + postuninstall_cmds_CXX \ + old_archive_from_expsyms_cmds_CXX \ + allow_undefined_flag_CXX \ + no_undefined_flag_CXX \ + export_symbols_cmds_CXX \ + hardcode_libdir_flag_spec_CXX \ + hardcode_libdir_flag_spec_ld_CXX \ + hardcode_libdir_separator_CXX \ + hardcode_automatic_CXX \ + module_cmds_CXX \ + module_expsym_cmds_CXX \ + lt_cv_prog_compiler_c_o_CXX \ + exclude_expsyms_CXX \ + include_expsyms_CXX; do - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes + case $var in + old_archive_cmds_CXX | \ + old_archive_from_new_cmds_CXX | \ + archive_cmds_CXX | \ + archive_expsym_cmds_CXX | \ + module_cmds_CXX | \ + module_expsym_cmds_CXX | \ + old_archive_from_expsyms_cmds_CXX | \ + export_symbols_cmds_CXX | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; + esac - mingw* | pw32*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; +cfgfile="$ofile" - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname - darwin*) - # if libdl is installed we need to link against it - { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dl_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL - ac_cv_lib_dl_dlopen=no -fi +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } -if test $ac_cv_lib_dl_dlopen = yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else +# Whether or not to build static libraries. +build_old_libs=$enable_static - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX -fi +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX - ;; +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install - *) - { echo "$as_me:$LINENO: checking for shl_load" >&5 -echo $ECHO_N "checking for shl_load... $ECHO_C" >&6; } -if test "${ac_cv_func_shl_load+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define shl_load to an innocuous variant, in case declares shl_load. - For example, HP-UX 11i declares gettimeofday. */ -#define shl_load innocuous_shl_load +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char shl_load (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os -#ifdef __STDC__ -# include -#else -# include -#endif +# An echo program that does not interpret backslashes. +echo=$lt_echo -#undef shl_load +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_shl_load || defined __stub___shl_load -choke me -#endif +# A C compiler. +LTCC=$lt_LTCC -int -main () -{ -return shl_load (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_shl_load=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS - ac_cv_func_shl_load=no -fi +# A language-specific compiler. +CC=$lt_compiler_CXX -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 -echo "${ECHO_T}$ac_cv_func_shl_load" >&6; } -if test $ac_cv_func_shl_load = yes; then - lt_cv_dlopen="shl_load" -else - { echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 -echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6; } -if test "${ac_cv_lib_dld_shl_load+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +# Is the compiler the GNU C compiler? +with_gcc=$GCC_CXX -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (); -int -main () -{ -return shl_load (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dld_shl_load=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +# An ERE matcher. +EGREP=$lt_EGREP - ac_cv_lib_dld_shl_load=no -fi +# The linker used to build libraries. +LD=$lt_LD_CXX -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6; } -if test $ac_cv_lib_dld_shl_load = yes; then - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" -else - { echo "$as_me:$LINENO: checking for dlopen" >&5 -echo $ECHO_N "checking for dlopen... $ECHO_C" >&6; } -if test "${ac_cv_func_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define dlopen to an innocuous variant, in case declares dlopen. - For example, HP-UX 11i declares gettimeofday. */ -#define dlopen innocuous_dlopen +# Whether we need hard or soft links. +LN_S=$lt_LN_S -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char dlopen (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ +# A BSD-compatible nm program. +NM=$lt_NM -#ifdef __STDC__ -# include -#else -# include -#endif +# A symbol stripping program +STRIP=$lt_STRIP -#undef dlopen +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_dlopen || defined __stub___dlopen -choke me -#endif +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" - ac_cv_func_dlopen=no -fi +# Used on cygwin: assembler. +AS="$AS" -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 -echo "${ECHO_T}$ac_cv_func_dlopen" >&6; } -if test $ac_cv_func_dlopen = yes; then - lt_cv_dlopen="dlopen" -else - { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +# The name of the directory that contains temporary libtool files. +objdir=$objdir -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dl_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds - ac_cv_lib_dl_dlopen=no -fi +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } -if test $ac_cv_lib_dl_dlopen = yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - { echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 -echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6; } -if test "${ac_cv_lib_svld_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +# Object file suffix (normally "o"). +objext="$ac_objext" -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_svld_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_svld_dlopen=no -fi +# Old archive suffix (normally "a"). +libext="$libext" -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6; } -if test $ac_cv_lib_svld_dlopen = yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -else - { echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 -echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6; } -if test "${ac_cv_lib_dld_dld_link+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dld_link (); -int -main () -{ -return dld_link (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dld_dld_link=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +# Executable file suffix (normally ""). +exeext="$exeext" - ac_cv_lib_dld_dld_link=no -fi +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX +pic_mode=$pic_mode -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6; } -if test $ac_cv_lib_dld_dld_link = yes; then - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" -fi +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX -fi +# Must we lock files when doing compilation? +need_locks=$lt_need_locks +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix -fi +# Do we need a version for libraries? +need_version=$need_version +# Whether dlopen is supported. +dlopen_support=$enable_dlopen -fi +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static -fi +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX -fi +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX - ;; - esac +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" +# Library versioning type. +version_type=$version_type - save_LDFLAGS="$LDFLAGS" - eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" +# Format of library name prefix. +libname_spec=$lt_libname_spec - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec - { echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 -echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6; } -if test "${lt_cv_dlopen_self+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext < -#endif +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_CXX +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds -#include +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds -#ifdef __cplusplus -extern "C" void exit (int); -#endif +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX -void fnord() { int i=42;} -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - /* dlclose (self); */ - } +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_CXX - exit (status); -} -EOF - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_unknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no - fi -fi -rm -fr conftest* +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_CXX +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_CXX -fi -{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self" >&6; } +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_CXX - if test "x$lt_cv_dlopen_self" = xyes; then - LDFLAGS="$LDFLAGS $link_static_flag" - { echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 -echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6; } -if test "${lt_cv_dlopen_self_static+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self_static=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext < -#endif +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method -#include +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX -#ifdef __cplusplus -extern "C" void exit (int); -#endif +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds -void fnord() { int i=42;} -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - /* dlclose (self); */ - } +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - exit (status); -} -EOF - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address -fi -{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6; } - fi +# This is the shared library runtime path variable. +runpath_var=$runpath_var - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac +# This is the shared library path variable. +shlibpath_var=$shlibpath_var - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs -# The else clause should only fire when bootstrapping the -# libtool distribution, otherwise you forgot to ship ltmain.sh -# with your package, and you will get complaints that there are -# no rules to generate ltmain.sh. -if test -f "$ltmain"; then - # See if we are running on zsh, and set the options which allow our commands through - # without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - # Now quote all the things that may contain metacharacters while being - # careful not to overquote the AC_SUBSTed values. We take copies of the - # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ - SED SHELL STRIP \ - libname_spec library_names_spec soname_spec extract_expsyms_cmds \ - old_striplib striplib file_magic_cmd finish_cmds finish_eval \ - deplibs_check_method reload_flag reload_cmds need_locks \ - lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ - lt_cv_sys_global_symbol_to_c_name_address \ - sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ - old_postinstall_cmds old_postuninstall_cmds \ - compiler_CXX \ - CC_CXX \ - LD_CXX \ - lt_prog_compiler_wl_CXX \ - lt_prog_compiler_pic_CXX \ - lt_prog_compiler_static_CXX \ - lt_prog_compiler_no_builtin_flag_CXX \ - export_dynamic_flag_spec_CXX \ - thread_safe_flag_spec_CXX \ - whole_archive_flag_spec_CXX \ - enable_shared_with_static_runtimes_CXX \ - old_archive_cmds_CXX \ - old_archive_from_new_cmds_CXX \ - predep_objects_CXX \ - postdep_objects_CXX \ - predeps_CXX \ - postdeps_CXX \ - compiler_lib_search_path_CXX \ - archive_cmds_CXX \ - archive_expsym_cmds_CXX \ - postinstall_cmds_CXX \ - postuninstall_cmds_CXX \ - old_archive_from_expsyms_cmds_CXX \ - allow_undefined_flag_CXX \ - no_undefined_flag_CXX \ - export_symbols_cmds_CXX \ - hardcode_libdir_flag_spec_CXX \ - hardcode_libdir_flag_spec_ld_CXX \ - hardcode_libdir_separator_CXX \ - hardcode_automatic_CXX \ - module_cmds_CXX \ - module_expsym_cmds_CXX \ - lt_cv_prog_compiler_c_o_CXX \ - exclude_expsyms_CXX \ - include_expsyms_CXX; do - - case $var in - old_archive_cmds_CXX | \ - old_archive_from_new_cmds_CXX | \ - archive_cmds_CXX | \ - archive_expsym_cmds_CXX | \ - module_cmds_CXX | \ - module_expsym_cmds_CXX | \ - old_archive_from_expsyms_cmds_CXX | \ - export_symbols_cmds_CXX | \ - extract_expsyms_cmds | reload_cmds | finish_cmds | \ - postinstall_cmds | postuninstall_cmds | \ - old_postinstall_cmds | old_postuninstall_cmds | \ - sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) - # Double-quote double-evaled strings. - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" - ;; - *) - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" - ;; - esac - done - - case $lt_echo in - *'\$0 --fallback-echo"') - lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` - ;; - esac - -cfgfile="$ofile" - - cat <<__EOF__ >> "$cfgfile" -# ### BEGIN LIBTOOL TAG CONFIG: $tagname - -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_CXX - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# The host system. -host_alias=$host_alias -host=$host - -# An echo program that does not interpret backslashes. -echo=$lt_echo - -# The archiver. -AR=$lt_AR -AR_FLAGS=$lt_AR_FLAGS - -# A C compiler. -LTCC=$lt_LTCC - -# A language-specific compiler. -CC=$lt_compiler_CXX - -# Is the compiler the GNU C compiler? -with_gcc=$GCC_CXX - -# An ERE matcher. -EGREP=$lt_EGREP - -# The linker used to build libraries. -LD=$lt_LD_CXX - -# Whether we need hard or soft links. -LN_S=$lt_LN_S - -# A BSD-compatible nm program. -NM=$lt_NM - -# A symbol stripping program -STRIP=$lt_STRIP - -# Used to examine libraries when file_magic_cmd begins "file" -MAGIC_CMD=$MAGIC_CMD - -# Used on cygwin: DLL creation program. -DLLTOOL="$DLLTOOL" - -# Used on cygwin: object dumper. -OBJDUMP="$OBJDUMP" - -# Used on cygwin: assembler. -AS="$AS" - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_CXX - -# Object file suffix (normally "o"). -objext="$ac_objext" - -# Old archive suffix (normally "a"). -libext="$libext" - -# Shared library suffix (normally ".so"). -shrext_cmds='$shrext_cmds' - -# Executable file suffix (normally ""). -exeext="$exeext" - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_CXX -pic_mode=$pic_mode - -# What is the maximum length of a command? -max_cmd_len=$lt_cv_sys_max_cmd_len - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX - -# Must we lock files when doing compilation ? -need_locks=$lt_need_locks - -# Do we need the lib prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_CXX - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX - -# Library versioning type. -version_type=$version_type - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Commands used to build and install an old-style archive. -RANLIB=$lt_RANLIB -old_archive_cmds=$lt_old_archive_cmds_CXX -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX - -# Commands used to build and install a shared archive. -archive_cmds=$lt_archive_cmds_CXX -archive_expsym_cmds=$lt_archive_expsym_cmds_CXX -postinstall_cmds=$lt_postinstall_cmds -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to build a loadable module (assumed same as above if empty) -module_cmds=$lt_module_cmds_CXX -module_expsym_cmds=$lt_module_expsym_cmds_CXX - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects=$lt_predep_objects_CXX - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects=$lt_postdep_objects_CXX - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps=$lt_predeps_CXX - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps=$lt_postdeps_CXX - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_CXX - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd=$lt_file_magic_cmd - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_CXX - -# Flag that forces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_CXX - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval=$lt_finish_eval - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# This is the shared library runtime path variable. -runpath_var=$runpath_var - -# This is the shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_CXX - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does @@ -14376,16 +14037,42 @@ lt_simple_link_test_code=" program t\n end\n" # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + # Allow CC to be a program name with arguments. compiler=$CC -# Allow CC to be a program name with arguments. +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +printf "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +printf "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm conftest* + + +# Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${F77-"f77"} compiler=$CC compiler_F77=$CC -cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + { echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6; } @@ -14398,7 +14085,7 @@ test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. -case "$host_os" in +case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then @@ -14407,7 +14094,9 @@ aix3*) fi ;; aix4* | aix5*) - test "$enable_shared" = yes && enable_static=no + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi ;; esac { echo "$as_me:$LINENO: result: $enable_shared" >&5 @@ -14420,8 +14109,6 @@ test "$enable_shared" = yes || enable_static=yes { echo "$as_me:$LINENO: result: $enable_static" >&5 echo "${ECHO_T}$enable_static" >&6; } -test "$ld_shlibs_F77" = no && can_build_shared=no - GCC_F77="$G77" LD_F77="$LD" @@ -14468,6 +14155,11 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } lt_prog_compiler_pic_F77='-fno-common' ;; + interix3*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. @@ -14484,7 +14176,7 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. - case "$host_cpu" in + case $host_cpu in hppa*64*|ia64*) # +Z the default ;; @@ -14510,6 +14202,16 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' fi ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic_F77='-qnocommon' + lt_prog_compiler_wl_F77='-Wl,' + ;; + esac + ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being @@ -14521,7 +14223,7 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } lt_prog_compiler_wl_F77='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. - case "$host_cpu" in + case $host_cpu in hppa*64*|ia64*) # +Z the default ;; @@ -14545,12 +14247,19 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } ;; linux*) - case $CC in + case $cc_basename in icc* | ecc*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-static' ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-fpic' + lt_prog_compiler_static_F77='-Bstatic' + ;; ccc*) lt_prog_compiler_wl_F77='-Wl,' # All Alpha code is PIC. @@ -14565,15 +14274,15 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } lt_prog_compiler_static_F77='-non_shared' ;; - sco3.2v5*) - lt_prog_compiler_pic_F77='-Kpic' - lt_prog_compiler_static_F77='-dn' - ;; - solaris*) - lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + lt_prog_compiler_wl_F77='-Qoption ld ';; + *) + lt_prog_compiler_wl_F77='-Wl,';; + esac ;; sunos4*) @@ -14582,7 +14291,7 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } lt_prog_compiler_static_F77='-Bstatic' ;; - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' @@ -14595,6 +14304,17 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } fi ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_can_build_shared_F77=no + ;; + uts4*) lt_prog_compiler_pic_F77='-pic' lt_prog_compiler_static_F77='-Bstatic' @@ -14629,18 +14349,20 @@ else # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:14635: $lt_compile\"" >&5) + (eval echo "\"\$as_me:14355: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:14639: \$? = $ac_status" >&5 + echo "$as_me:14359: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s conftest.err; then + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_pic_works_F77=yes fi fi @@ -14661,7 +14383,7 @@ else fi fi -case "$host_os" in +case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_F77= @@ -14671,6 +14393,48 @@ case "$host_os" in ;; esac +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" +{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; } +if test "${lt_prog_compiler_static_works_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_static_works_F77=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_static_works_F77=yes + fi + else + lt_prog_compiler_static_works_F77=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_F77" >&5 +echo "${ECHO_T}$lt_prog_compiler_static_works_F77" >&6; } + +if test x"$lt_prog_compiler_static_works_F77" = xyes; then + : +else + lt_prog_compiler_static_F77= +fi + + { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then @@ -14689,23 +14453,25 @@ else # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:14695: $lt_compile\"" >&5) + (eval echo "\"\$as_me:14459: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:14699: \$? = $ac_status" >&5 + echo "$as_me:14463: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings - if test ! -s out/conftest.err; then + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_F77=yes fi fi - chmod u+w . + chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation @@ -14781,6 +14547,16 @@ echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared librar # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` case $host_os in cygwin* | mingw* | pw32*) @@ -14791,6 +14567,10 @@ echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared librar with_gnu_ld=no fi ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; openbsd*) with_gnu_ld=no ;; @@ -14801,6 +14581,27 @@ echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared librar # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_F77='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_F77= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) @@ -14851,10 +14652,10 @@ EOF allow_undefined_flag_F77=unsupported always_export_symbols_F77=no enable_shared_with_static_runtimes_F77=yes - export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then @@ -14863,9 +14664,55 @@ EOF echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else - ld_shlibs=no + ld_shlibs_F77=no + fi + ;; + + interix3*) + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + export_dynamic_flag_spec_F77='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + archive_cmds_F77='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + else + ld_shlibs_F77=no fi ;; @@ -14879,7 +14726,7 @@ EOF fi ;; - solaris* | sysv5*) + solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs_F77=no cat <&2 @@ -14900,6 +14747,33 @@ EOF fi ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs_F77=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + ;; + sunos4*) archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= @@ -14907,31 +14781,6 @@ EOF hardcode_shlibpath_var_F77=no ;; - linux*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_cmds_F77="$tmp_archive_cmds" - supports_anon_versioning=no - case `$LD -v 2>/dev/null` in - *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - if test $supports_anon_versioning = yes; then - archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ -cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ -$echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - else - archive_expsym_cmds_F77="$tmp_archive_cmds" - fi - else - ld_shlibs_F77=no - fi - ;; - *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' @@ -14942,16 +14791,11 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ ;; esac - if test "$ld_shlibs_F77" = yes; then - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_F77='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec_F77= - fi + if test "$ld_shlibs_F77" = no; then + runpath_var= + hardcode_libdir_flag_spec_F77= + export_dynamic_flag_spec_F77= + whole_archive_flag_spec_F77= fi else # PORTME fill in a description of your system's linker (not GNU ld) @@ -14963,7 +14807,7 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_F77=yes - if test "$GCC" = yes && test -z "$link_static_flag"; then + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_F77=unsupported @@ -14997,6 +14841,7 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ break fi done + ;; esac exp_sym_flag='-bexport' @@ -15015,7 +14860,7 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ link_all_deplibs_F77=yes if test "$GCC" = yes; then - case $host_os in aix4.012|aix4.012.*) + case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` @@ -15034,8 +14879,12 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_libdir_separator_F77= fi + ;; esac shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi else # not using gcc if test "$host_cpu" = ia64; then @@ -15043,11 +14892,11 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else - if test "$aix_use_runtimelinking" = yes; then + if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' - fi + fi fi fi @@ -15116,12 +14965,12 @@ rm -f core conftest.err conftest.$ac_objext \ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_F77="-z nodefs" - archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF @@ -15185,13 +15034,11 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi # -berok will link without error, but may produce a broken library. no_undefined_flag_F77=' ${wl}-bernotok' allow_undefined_flag_F77=' ${wl}-berok' - # -bexpall does not export symbols beginning with underscore (_) - always_export_symbols_F77=yes # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_F77=' ' + whole_archive_flag_spec_F77='$convenience' archive_cmds_need_lc_F77=yes - # This is similar to how AIX traditionally builds it's shared libraries. - archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; @@ -15204,7 +15051,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ld_shlibs_F77=no ;; - bsdi4*) + bsdi[45]*) export_dynamic_flag_spec_F77=-rdynamic ;; @@ -15225,57 +15072,57 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi old_archive_From_new_cmds_F77='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs' - fix_srcfile_path='`cygpath -w "$srcfile"`' + fix_srcfile_path_F77='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes_F77=yes ;; darwin* | rhapsody*) - if test "$GXX" = yes ; then - archive_cmds_need_lc_F77=no - case "$host_os" in - rhapsody* | darwin1.[012]) - allow_undefined_flag_F77='-undefined suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - allow_undefined_flag_F77='-flat_namespace -undefined suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[012]) - allow_undefined_flag_F77='-flat_namespace -undefined suppress' - ;; - 10.*) - allow_undefined_flag_F77='-undefined dynamic_lookup' - ;; - esac - fi - ;; + case $host_os in + rhapsody* | darwin1.[012]) + allow_undefined_flag_F77='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; esac - lt_int_apple_cc_single_mod=no - output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes - fi - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - archive_cmds_F77='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - else - archive_cmds_F77='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - fi - module_cmds_F77='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + archive_cmds_need_lc_F77=no hardcode_direct_F77=no hardcode_automatic_F77=yes hardcode_shlibpath_var_F77=unsupported - whole_archive_flag_spec_F77='-all_load $convenience' + whole_archive_flag_spec_F77='' link_all_deplibs_F77=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else - ld_shlibs_F77=no + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_F77=no + ;; + esac fi ;; @@ -15309,7 +15156,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | kfreebsd*-gnu) + freebsd* | kfreebsd*-gnu | dragonfly*) archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes @@ -15332,47 +15179,62 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi export_dynamic_flag_spec_F77='${wl}-E' ;; - hpux10* | hpux11*) + hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then - case "$host_cpu" in - hppa*64*|ia64*) + archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + + hardcode_direct_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; + ia64*) + archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; *) archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else - case "$host_cpu" in - hppa*64*|ia64*) - archive_cmds_F77='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + case $host_cpu in + hppa*64*) + archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) - archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then - case "$host_cpu" in - hppa*64*) - hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + + case $host_cpu in + hppa*64*|ia64*) hardcode_libdir_flag_spec_ld_F77='+b $libdir' - hardcode_libdir_separator_F77=: - hardcode_direct_F77=no - hardcode_shlibpath_var_F77=no - ;; - ia64*) - hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_direct_F77=no hardcode_shlibpath_var_F77=no - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L_F77=yes ;; *) - hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_F77=: hardcode_direct_F77=yes export_dynamic_flag_spec_F77='${wl}-E' @@ -15420,6 +15282,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_shlibpath_var_F77=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' export_dynamic_flag_spec_F77='${wl}-E' else @@ -15465,7 +15328,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ - $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_F77='-rpath $libdir' @@ -15473,21 +15336,15 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_separator_F77=: ;; - sco3.2v5*) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var_F77=no - export_dynamic_flag_spec_F77='${wl}-Bexport' - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ;; - solaris*) no_undefined_flag_F77=' -z text' if test "$GCC" = yes; then + wlarc='${wl}' archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else + wlarc='' archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' @@ -15496,8 +15353,18 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_shlibpath_var_F77=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; - *) # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; + *) + # The compiler driver will combine linker options so we + # cannot just pass the convience library names through + # without $wl, iff we do not link with $LD. + # Luckily, gcc supports the same syntax we need for Sun Studio. + # Supported since Solaris 2.6 (maybe 2.5.1?) + case $wlarc in + '') + whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; + *) + whole_archive_flag_spec_F77='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; + esac ;; esac link_all_deplibs_F77=yes ;; @@ -15554,36 +15421,45 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi fi ;; - sysv4.2uw2*) - archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_F77=yes - hardcode_minus_L_F77=no + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) + no_undefined_flag_F77='${wl}-z,text' + archive_cmds_need_lc_F77=no hardcode_shlibpath_var_F77=no - hardcode_runpath_var=yes - runpath_var=LD_RUN_PATH - ;; + runpath_var='LD_RUN_PATH' - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) - no_undefined_flag_F77='${wl}-z ${wl}text' if test "$GCC" = yes; then - archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else - archive_cmds_F77='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var_F77=no ;; - sysv5*) - no_undefined_flag_F77=' -z text' - # $CC -shared without GNU ld will not create a library from C++ - # object files and a static libstdc++, better avoid it by now - archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - hardcode_libdir_flag_spec_F77= + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_F77='${wl}-z,text' + allow_undefined_flag_F77='${wl}-z,nodefs' + archive_cmds_need_lc_F77=no hardcode_shlibpath_var_F77=no + hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + export_dynamic_flag_spec_F77='${wl}-Bexport' runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi ;; uts4*) @@ -15602,11 +15478,6 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi echo "${ECHO_T}$ld_shlibs_F77" >&6; } test "$ld_shlibs_F77" = no && can_build_shared=no -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - # # Do we need to explicitly link libc? # @@ -15639,6 +15510,7 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_F77 + pic_flag=$lt_prog_compiler_pic_F77 compiler_flags=-v linker_flags=-v verstring= @@ -15771,7 +15643,7 @@ beos*) shlibpath_var=LIBRARY_PATH ;; -bsdi4*) +bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -15799,7 +15671,8 @@ cygwin* | mingw* | pw32*) dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' @@ -15829,7 +15702,7 @@ cygwin* | mingw* | pw32*) ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; @@ -15852,7 +15725,7 @@ darwin* | rhapsody*) soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` @@ -15887,8 +15760,17 @@ kfreebsd*-gnu) dynamic_linker='GNU ld.so' ;; -freebsd*) - objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) @@ -15906,14 +15788,19 @@ freebsd*) freebsd2*) shlibpath_overrides_runpath=yes ;; - freebsd3.01* | freebsdelf3.01*) + freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; - *) # from 3.2 on + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; + freebsd*) # from 4.6 on + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; esac ;; @@ -15933,7 +15820,7 @@ hpux9* | hpux10* | hpux11*) version_type=sunos need_lib_prefix=no need_version=no - case "$host_cpu" in + case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes @@ -15973,6 +15860,18 @@ hpux9* | hpux10* | hpux11*) postinstall_cmds='chmod 555 $lib' ;; +interix3*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; @@ -16032,7 +15931,7 @@ linux*) # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then - lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi @@ -16094,8 +15993,13 @@ nto-qnx*) openbsd*) version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no - need_version=yes + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH @@ -16133,13 +16037,6 @@ osf3* | osf4* | osf5*) sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; -sco3.2v5*) - version_type=osf - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - ;; - solaris*) version_type=linux need_lib_prefix=no @@ -16165,7 +16062,7 @@ sunos4*) need_version=yes ;; -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' @@ -16198,6 +16095,29 @@ sysv4*MP*) fi ;; +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -16213,12 +16133,17 @@ esac echo "${ECHO_T}$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } hardcode_action_F77= if test -n "$hardcode_libdir_flag_spec_F77" || \ - test -n "$runpath_var F77" || \ - test "X$hardcode_automatic_F77"="Xyes" ; then + test -n "$runpath_var_F77" || \ + test "X$hardcode_automatic_F77" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_F77" != no && @@ -16250,36 +16175,6 @@ elif test "$shlibpath_overrides_runpath" = yes || enable_fast_install=needless fi -striplib= -old_striplib= -{ echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6; } -if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } - else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - ;; - *) - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } - ;; - esac -fi - - # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh @@ -16294,7 +16189,7 @@ if test -f "$ltmain"; then # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ @@ -16395,6 +16290,12 @@ fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo @@ -16406,6 +16307,9 @@ AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + # A language-specific compiler. CC=$lt_compiler_F77 @@ -16471,7 +16375,7 @@ max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 -# Must we lock files when doing compilation ? +# Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? @@ -16708,26 +16612,55 @@ objext_GCJ=$objext lt_simple_compile_test_code="class foo {}\n" # Code to be used in simple link tests -lt_simple_link_test_code='public class conftest { public static void main(String argv) {}; }\n' +lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + # Allow CC to be a program name with arguments. compiler=$CC +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +printf "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +printf "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm conftest* + + # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${GCJ-"gcj"} compiler=$CC compiler_GCJ=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + # GCJ did not exist at the time GCC didn't implicitly link libc in. archive_cmds_need_lc_GCJ=no +old_archive_cmds_GCJ=$old_archive_cmds + lt_prog_compiler_no_builtin_flag_GCJ= @@ -16750,18 +16683,20 @@ else # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:16756: $lt_compile\"" >&5) + (eval echo "\"\$as_me:16689: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:16760: \$? = $ac_status" >&5 + echo "$as_me:16693: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s conftest.err; then + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi @@ -16822,6 +16757,11 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } lt_prog_compiler_pic_GCJ='-fno-common' ;; + interix3*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. @@ -16838,7 +16778,7 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. - case "$host_cpu" in + case $host_cpu in hppa*64*|ia64*) # +Z the default ;; @@ -16864,6 +16804,16 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' fi ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic_GCJ='-qnocommon' + lt_prog_compiler_wl_GCJ='-Wl,' + ;; + esac + ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being @@ -16875,7 +16825,7 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } lt_prog_compiler_wl_GCJ='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. - case "$host_cpu" in + case $host_cpu in hppa*64*|ia64*) # +Z the default ;; @@ -16899,12 +16849,19 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } ;; linux*) - case $CC in + case $cc_basename in icc* | ecc*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-static' ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-fpic' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; ccc*) lt_prog_compiler_wl_GCJ='-Wl,' # All Alpha code is PIC. @@ -16919,15 +16876,15 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } lt_prog_compiler_static_GCJ='-non_shared' ;; - sco3.2v5*) - lt_prog_compiler_pic_GCJ='-Kpic' - lt_prog_compiler_static_GCJ='-dn' - ;; - solaris*) - lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + lt_prog_compiler_wl_GCJ='-Qoption ld ';; + *) + lt_prog_compiler_wl_GCJ='-Wl,';; + esac ;; sunos4*) @@ -16936,7 +16893,7 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } lt_prog_compiler_static_GCJ='-Bstatic' ;; - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' @@ -16949,6 +16906,17 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } fi ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_can_build_shared_GCJ=no + ;; + uts4*) lt_prog_compiler_pic_GCJ='-pic' lt_prog_compiler_static_GCJ='-Bstatic' @@ -16983,18 +16951,20 @@ else # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:16989: $lt_compile\"" >&5) + (eval echo "\"\$as_me:16957: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:16993: \$? = $ac_status" >&5 + echo "$as_me:16961: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s conftest.err; then + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_pic_works_GCJ=yes fi fi @@ -17015,7 +16985,7 @@ else fi fi -case "$host_os" in +case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_GCJ= @@ -17025,6 +16995,48 @@ case "$host_os" in ;; esac +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\" +{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; } +if test "${lt_prog_compiler_static_works_GCJ+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_static_works_GCJ=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_static_works_GCJ=yes + fi + else + lt_prog_compiler_static_works_GCJ=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_GCJ" >&5 +echo "${ECHO_T}$lt_prog_compiler_static_works_GCJ" >&6; } + +if test x"$lt_prog_compiler_static_works_GCJ" = xyes; then + : +else + lt_prog_compiler_static_GCJ= +fi + + { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then @@ -17043,23 +17055,25 @@ else # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:17049: $lt_compile\"" >&5) + (eval echo "\"\$as_me:17061: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:17053: \$? = $ac_status" >&5 + echo "$as_me:17065: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings - if test ! -s out/conftest.err; then + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_GCJ=yes fi fi - chmod u+w . + chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation @@ -17135,6 +17149,16 @@ echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared librar # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` case $host_os in cygwin* | mingw* | pw32*) @@ -17145,6 +17169,10 @@ echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared librar with_gnu_ld=no fi ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; openbsd*) with_gnu_ld=no ;; @@ -17155,6 +17183,27 @@ echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared librar # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_GCJ= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) @@ -17205,10 +17254,10 @@ EOF allow_undefined_flag_GCJ=unsupported always_export_symbols_GCJ=no enable_shared_with_static_runtimes_GCJ=yes - export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then @@ -17217,9 +17266,55 @@ EOF echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else - ld_shlibs=no + ld_shlibs_GCJ=no + fi + ;; + + interix3*) + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + export_dynamic_flag_spec_GCJ='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_GCJ='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_GCJ='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + archive_cmds_GCJ='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + else + ld_shlibs_GCJ=no fi ;; @@ -17233,7 +17328,7 @@ EOF fi ;; - solaris* | sysv5*) + solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs_GCJ=no cat <&2 @@ -17254,6 +17349,33 @@ EOF fi ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs_GCJ=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + esac + ;; + sunos4*) archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= @@ -17261,31 +17383,6 @@ EOF hardcode_shlibpath_var_GCJ=no ;; - linux*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_cmds_GCJ="$tmp_archive_cmds" - supports_anon_versioning=no - case `$LD -v 2>/dev/null` in - *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - if test $supports_anon_versioning = yes; then - archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ -cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ -$echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - else - archive_expsym_cmds_GCJ="$tmp_archive_cmds" - fi - else - ld_shlibs_GCJ=no - fi - ;; - *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' @@ -17296,16 +17393,11 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ ;; esac - if test "$ld_shlibs_GCJ" = yes; then - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec_GCJ= - fi + if test "$ld_shlibs_GCJ" = no; then + runpath_var= + hardcode_libdir_flag_spec_GCJ= + export_dynamic_flag_spec_GCJ= + whole_archive_flag_spec_GCJ= fi else # PORTME fill in a description of your system's linker (not GNU ld) @@ -17317,7 +17409,7 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_GCJ=yes - if test "$GCC" = yes && test -z "$link_static_flag"; then + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_GCJ=unsupported @@ -17351,6 +17443,7 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ break fi done + ;; esac exp_sym_flag='-bexport' @@ -17369,7 +17462,7 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ link_all_deplibs_GCJ=yes if test "$GCC" = yes; then - case $host_os in aix4.012|aix4.012.*) + case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` @@ -17388,8 +17481,12 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_libdir_separator_GCJ= fi + ;; esac shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi else # not using gcc if test "$host_cpu" = ia64; then @@ -17397,11 +17494,11 @@ $echo "local: *; };" >> $output_objdir/$libname.ver~ # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else - if test "$aix_use_runtimelinking" = yes; then + if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' - fi + fi fi fi @@ -17480,12 +17577,12 @@ rm -f core conftest.err conftest.$ac_objext \ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_GCJ="-z nodefs" - archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF @@ -17559,13 +17656,11 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi # -berok will link without error, but may produce a broken library. no_undefined_flag_GCJ=' ${wl}-bernotok' allow_undefined_flag_GCJ=' ${wl}-berok' - # -bexpall does not export symbols beginning with underscore (_) - always_export_symbols_GCJ=yes # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_GCJ=' ' + whole_archive_flag_spec_GCJ='$convenience' archive_cmds_need_lc_GCJ=yes - # This is similar to how AIX traditionally builds it's shared libraries. - archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; @@ -17578,7 +17673,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ld_shlibs_GCJ=no ;; - bsdi4*) + bsdi[45]*) export_dynamic_flag_spec_GCJ=-rdynamic ;; @@ -17599,57 +17694,57 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi old_archive_From_new_cmds_GCJ='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs' - fix_srcfile_path='`cygpath -w "$srcfile"`' + fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes_GCJ=yes ;; darwin* | rhapsody*) - if test "$GXX" = yes ; then - archive_cmds_need_lc_GCJ=no - case "$host_os" in - rhapsody* | darwin1.[012]) - allow_undefined_flag_GCJ='-undefined suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - allow_undefined_flag_GCJ='-flat_namespace -undefined suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[012]) - allow_undefined_flag_GCJ='-flat_namespace -undefined suppress' - ;; - 10.*) - allow_undefined_flag_GCJ='-undefined dynamic_lookup' - ;; - esac - fi - ;; + case $host_os in + rhapsody* | darwin1.[012]) + allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; esac - lt_int_apple_cc_single_mod=no - output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes - fi - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - archive_cmds_GCJ='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - else - archive_cmds_GCJ='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - fi - module_cmds_GCJ='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + archive_cmds_need_lc_GCJ=no hardcode_direct_GCJ=no hardcode_automatic_GCJ=yes hardcode_shlibpath_var_GCJ=unsupported - whole_archive_flag_spec_GCJ='-all_load $convenience' + whole_archive_flag_spec_GCJ='' link_all_deplibs_GCJ=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds_GCJ='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else - ld_shlibs_GCJ=no + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_GCJ=no + ;; + esac fi ;; @@ -17683,7 +17778,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | kfreebsd*-gnu) + freebsd* | kfreebsd*-gnu | dragonfly*) archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes @@ -17706,47 +17801,62 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi export_dynamic_flag_spec_GCJ='${wl}-E' ;; - hpux10* | hpux11*) + hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then - case "$host_cpu" in - hppa*64*|ia64*) + archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + + hardcode_direct_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; + ia64*) + archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; *) archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else - case "$host_cpu" in - hppa*64*|ia64*) - archive_cmds_GCJ='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + case $host_cpu in + hppa*64*) + archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) - archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then - case "$host_cpu" in - hppa*64*) - hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + + case $host_cpu in + hppa*64*|ia64*) hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' - hardcode_libdir_separator_GCJ=: - hardcode_direct_GCJ=no - hardcode_shlibpath_var_GCJ=no - ;; - ia64*) - hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_direct_GCJ=no hardcode_shlibpath_var_GCJ=no - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L_GCJ=yes ;; *) - hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' @@ -17794,6 +17904,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_shlibpath_var_GCJ=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' export_dynamic_flag_spec_GCJ='${wl}-E' else @@ -17839,7 +17950,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi allow_undefined_flag_GCJ=' -expect_unresolved \*' archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ - $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_GCJ='-rpath $libdir' @@ -17847,21 +17958,15 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_separator_GCJ=: ;; - sco3.2v5*) - archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var_GCJ=no - export_dynamic_flag_spec_GCJ='${wl}-Bexport' - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ;; - solaris*) no_undefined_flag_GCJ=' -z text' if test "$GCC" = yes; then + wlarc='${wl}' archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else + wlarc='' archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' @@ -17870,8 +17975,18 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_shlibpath_var_GCJ=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; - *) # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;; + *) + # The compiler driver will combine linker options so we + # cannot just pass the convience library names through + # without $wl, iff we do not link with $LD. + # Luckily, gcc supports the same syntax we need for Sun Studio. + # Supported since Solaris 2.6 (maybe 2.5.1?) + case $wlarc in + '') + whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;; + *) + whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; + esac ;; esac link_all_deplibs_GCJ=yes ;; @@ -17928,36 +18043,45 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi fi ;; - sysv4.2uw2*) - archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_GCJ=yes - hardcode_minus_L_GCJ=no + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) + no_undefined_flag_GCJ='${wl}-z,text' + archive_cmds_need_lc_GCJ=no hardcode_shlibpath_var_GCJ=no - hardcode_runpath_var=yes - runpath_var=LD_RUN_PATH - ;; + runpath_var='LD_RUN_PATH' - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) - no_undefined_flag_GCJ='${wl}-z ${wl}text' if test "$GCC" = yes; then - archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else - archive_cmds_GCJ='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var_GCJ=no ;; - sysv5*) - no_undefined_flag_GCJ=' -z text' - # $CC -shared without GNU ld will not create a library from C++ - # object files and a static libstdc++, better avoid it by now - archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - hardcode_libdir_flag_spec_GCJ= + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_GCJ='${wl}-z,text' + allow_undefined_flag_GCJ='${wl}-z,nodefs' + archive_cmds_need_lc_GCJ=no hardcode_shlibpath_var_GCJ=no + hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator_GCJ=':' + link_all_deplibs_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-Bexport' runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi ;; uts4*) @@ -17976,11 +18100,6 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi echo "${ECHO_T}$ld_shlibs_GCJ" >&6; } test "$ld_shlibs_GCJ" = no && can_build_shared=no -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - # # Do we need to explicitly link libc? # @@ -18013,6 +18132,7 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_GCJ + pic_flag=$lt_prog_compiler_pic_GCJ compiler_flags=-v linker_flags=-v verstring= @@ -18070,1472 +18190,611 @@ if test "$GCC" = yes; then sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix4* | aix5*) - version_type=linux - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi4*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32*) - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $rm \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" - ;; - mingw*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH printed by - # mingw gcc, but we are running on Cygwin. Gcc prints its search - # path with ; separators, and with drive letters. We can handle the - # drive letters (cygwin fileutils understands them), so leave them, - # especially as we might pass files found there to a mingw objdump, - # which wouldn't understand a cygwinified path. Ahh. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' - ;; - esac - ;; - - *) - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - ;; - esac - dynamic_linker='Win32 ld.exe' - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' - # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. - if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` - else - sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' - fi - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd1*) - dynamic_linker=no - ;; - -kfreebsd*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -freebsd*) - objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.01* | freebsdelf3.01*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - *) # from 3.2 on - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case "$host_cpu" in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555. - postinstall_cmds='chmod 555 $lib' - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -knetbsd*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -nto-qnx*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -openbsd*) - version_type=sunos - need_lib_prefix=no - need_version=yes - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -sco3.2v5*) - version_type=osf - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - export_dynamic_flag_spec='${wl}-Blargedynsym' - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -echo "${ECHO_T}$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -{ echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } -hardcode_action_GCJ= -if test -n "$hardcode_libdir_flag_spec_GCJ" || \ - test -n "$runpath_var GCJ" || \ - test "X$hardcode_automatic_GCJ"="Xyes" ; then - - # We can hardcode non-existant directories. - if test "$hardcode_direct_GCJ" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && - test "$hardcode_minus_L_GCJ" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action_GCJ=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action_GCJ=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action_GCJ=unsupported -fi -{ echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 -echo "${ECHO_T}$hardcode_action_GCJ" >&6; } - -if test "$hardcode_action_GCJ" = relink; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - -striplib= -old_striplib= -{ echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6; } -if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } - else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - ;; - *) - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } - ;; - esac -fi - -if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dl_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_dl_dlopen=no -fi - -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } -if test $ac_cv_lib_dl_dlopen = yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - -fi - - ;; - - *) - { echo "$as_me:$LINENO: checking for shl_load" >&5 -echo $ECHO_N "checking for shl_load... $ECHO_C" >&6; } -if test "${ac_cv_func_shl_load+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define shl_load to an innocuous variant, in case declares shl_load. - For example, HP-UX 11i declares gettimeofday. */ -#define shl_load innocuous_shl_load - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char shl_load (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef shl_load - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_shl_load || defined __stub___shl_load -choke me -#endif - -int -main () -{ -return shl_load (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_shl_load=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_shl_load=no -fi - -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 -echo "${ECHO_T}$ac_cv_func_shl_load" >&6; } -if test $ac_cv_func_shl_load = yes; then - lt_cv_dlopen="shl_load" -else - { echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 -echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6; } -if test "${ac_cv_lib_dld_shl_load+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (); -int -main () -{ -return shl_load (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dld_shl_load=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_dld_shl_load=no -fi - -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6; } -if test $ac_cv_lib_dld_shl_load = yes; then - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" -else - { echo "$as_me:$LINENO: checking for dlopen" >&5 -echo $ECHO_N "checking for dlopen... $ECHO_C" >&6; } -if test "${ac_cv_func_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define dlopen to an innocuous variant, in case declares dlopen. - For example, HP-UX 11i declares gettimeofday. */ -#define dlopen innocuous_dlopen - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char dlopen (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef dlopen - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_dlopen || defined __stub___dlopen -choke me -#endif - -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_dlopen=no -fi - -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 -echo "${ECHO_T}$ac_cv_func_dlopen" >&6; } -if test $ac_cv_func_dlopen = yes; then - lt_cv_dlopen="dlopen" -else - { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dl_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_dl_dlopen=no -fi - -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } -if test $ac_cv_lib_dl_dlopen = yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - { echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 -echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6; } -if test "${ac_cv_lib_svld_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_svld_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_svld_dlopen=no -fi - -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6; } -if test $ac_cv_lib_svld_dlopen = yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -else - { echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 -echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6; } -if test "${ac_cv_lib_dld_dld_link+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dld_link (); -int -main () -{ -return dld_link (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dld_dld_link=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_dld_dld_link=no + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi +need_lib_prefix=unknown +hardcode_into_libs=no -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6; } -if test $ac_cv_lib_dld_dld_link = yes; then - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" -fi +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; -fi +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; -fi +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; -fi +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes -fi + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; -fi +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + freebsd*) # from 4.6 on + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' ;; esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - { echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 -echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6; } -if test "${lt_cv_dlopen_self+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext < -#endif +interix3*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; -#include +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes -#ifdef __cplusplus -extern "C" void exit (int); -#endif + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi -void fnord() { int i=42;} -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - /* dlclose (self); */ - } +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; - exit (status); -} -EOF - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_unknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' fi -fi -rm -fr conftest* - + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; -fi -{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self" >&6; } +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; - if test "x$lt_cv_dlopen_self" = xyes; then - LDFLAGS="$LDFLAGS $link_static_flag" - { echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 -echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6; } -if test "${lt_cv_dlopen_self_static+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self_static=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext < -#endif +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; -#include +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; -#ifdef __cplusplus -extern "C" void exit (int); -#endif +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; -void fnord() { int i=42;} -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - /* dlclose (self); */ - } +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; - exit (status); -} -EOF - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; esac - else : - # compilation failed - lt_cv_dlopen_self_static=no fi -fi -rm -fr conftest* + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; +*) + dynamic_linker=no + ;; +esac +{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi -{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6; } - fi - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac +{ echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } +hardcode_action_GCJ= +if test -n "$hardcode_libdir_flag_spec_GCJ" || \ + test -n "$runpath_var_GCJ" || \ + test "X$hardcode_automatic_GCJ" = "Xyes" ; then - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac + # We can hardcode non-existant directories. + if test "$hardcode_direct_GCJ" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && + test "$hardcode_minus_L_GCJ" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_GCJ=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_GCJ=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_GCJ=unsupported +fi +{ echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 +echo "${ECHO_T}$hardcode_action_GCJ" >&6; } - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac +if test "$hardcode_action_GCJ" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless fi @@ -19552,7 +18811,7 @@ if test -f "$ltmain"; then # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ @@ -19653,6 +18912,12 @@ fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo @@ -19664,6 +18929,9 @@ AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + # A language-specific compiler. CC=$lt_compiler_GCJ @@ -19729,7 +18997,7 @@ max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ -# Must we lock files when doing compilation ? +# Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? @@ -19972,15 +19240,42 @@ lt_simple_link_test_code="$lt_simple_compile_test_code" # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + # Allow CC to be a program name with arguments. compiler=$CC +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +printf "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +printf "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm conftest* + + # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${RC-"windres"} compiler=$CC compiler_RC=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + lt_cv_prog_compiler_c_o_RC=yes # The else clause should only fire when bootstrapping the @@ -19996,7 +19291,7 @@ if test -f "$ltmain"; then # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ @@ -20097,6 +19392,12 @@ fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo @@ -20108,6 +19409,9 @@ AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + # A language-specific compiler. CC=$lt_compiler_RC @@ -20173,7 +19477,7 @@ max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC -# Must we lock files when doing compilation ? +# Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? @@ -23529,14 +22833,12 @@ fi done - -{ echo "$as_me:$LINENO: checking for getopt in -liberty" >&5 -echo $ECHO_N "checking for getopt in -liberty... $ECHO_C" >&6; } -if test "${ac_cv_lib_iberty_getopt+set}" = set; then +{ echo "$as_me:$LINENO: checking for library containing getopt" >&5 +echo $ECHO_N "checking for library containing getopt... $ECHO_C" >&6; } +if test "${ac_cv_search_getopt+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - ac_check_lib_save_LIBS=$LIBS -LIBS="-liberty $LIBS" + ac_func_search_save_LIBS=$LIBS cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -23559,7 +22861,14 @@ return getopt (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext +for ac_lib in '' iberty; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; @@ -23593,26 +22902,33 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then - ac_cv_lib_iberty_getopt=yes + ac_cv_search_getopt=$ac_res else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_cv_lib_iberty_getopt=no + fi rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS + conftest$ac_exeext + if test "${ac_cv_search_getopt+set}" = set; then + break fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_iberty_getopt" >&5 -echo "${ECHO_T}$ac_cv_lib_iberty_getopt" >&6; } -if test $ac_cv_lib_iberty_getopt = yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBIBERTY 1 -_ACEOF - - LIBS="-liberty $LIBS" +done +if test "${ac_cv_search_getopt+set}" = set; then + : +else + ac_cv_search_getopt=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_search_getopt" >&5 +echo "${ECHO_T}$ac_cv_search_getopt" >&6; } +ac_res=$ac_cv_search_getopt +if test "$ac_res" != no; then + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi diff --git a/configure.in b/configure.in index 1bbbb7517..b81d87273 100644 --- a/configure.in +++ b/configure.in @@ -80,7 +80,7 @@ AC_CHECK_FUNCS(mergesort) AC_CHECK_FUNCS(mkstemps) dnl For mingw -AC_CHECK_LIB(iberty, getopt) +AC_SEARCH_LIBS(getopt, iberty) AM_CONFIG_HEADER(config.h) From 0128522af58994d35a56f47041f677e8fcb8e85d Mon Sep 17 00:00:00 2001 From: vlm Date: Mon, 3 Dec 2007 15:13:31 +0000 Subject: [PATCH 1391/1469] necessary types added git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1403 59561ff5-6e30-0410-9f3c-9617f08c8826 --- examples/sample.source.TAP3/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/sample.source.TAP3/Makefile b/examples/sample.source.TAP3/Makefile index 6a44b5b47..44240f6da 100644 --- a/examples/sample.source.TAP3/Makefile +++ b/examples/sample.source.TAP3/Makefile @@ -618,6 +618,8 @@ ASN_MODULE_HEADERS= \ ASN_MODULE_HEADERS+=INTEGER.h ASN_MODULE_HEADERS+=NativeEnumerated.h +ASN_MODULE_HEADERS+=IA5String.h +ASN_MODULE_SOURCES+=IA5String.c ASN_MODULE_SOURCES+=INTEGER.c ASN_MODULE_SOURCES+=NativeEnumerated.c ASN_MODULE_HEADERS+=NativeInteger.h From 4e92816a265a6db556e6f2c75107fa1d2cd0dc77 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 4 Dec 2007 00:27:38 +0000 Subject: [PATCH 1392/1469] check for iberty before mkstemps: mingw fix git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1404 59561ff5-6e30-0410-9f3c-9617f08c8826 --- configure | 164 +++++++++++++++++++++++++-------------------------- configure.in | 6 +- 2 files changed, 85 insertions(+), 85 deletions(-) diff --git a/configure b/configure index ce224f0e4..68a8b90cf 100755 --- a/configure +++ b/configure @@ -22501,38 +22501,18 @@ _ACEOF fi - - -for ac_func in strtoimax strtoll -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -{ echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } -if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then +{ echo "$as_me:$LINENO: checking for library containing getopt" >&5 +echo $ECHO_N "checking for library containing getopt... $ECHO_C" >&6; } +if test "${ac_cv_search_getopt+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - cat >conftest.$ac_ext <<_ACEOF + ac_func_search_save_LIBS=$LIBS +cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC @@ -22540,23 +22520,23 @@ cat >>conftest.$ac_ext <<_ACEOF #ifdef __cplusplus extern "C" #endif -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$ac_func || defined __stub___$ac_func -choke me -#endif - +char getopt (); int main () { -return $ac_func (); +return getopt (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext +for ac_lib in '' iberty; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; @@ -22590,30 +22570,40 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then - eval "$as_ac_var=yes" + ac_cv_search_getopt=$ac_res else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - eval "$as_ac_var=no" + fi rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + conftest$ac_exeext + if test "${ac_cv_search_getopt+set}" = set; then + break fi -ac_res=`eval echo '${'$as_ac_var'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +done +if test "${ac_cv_search_getopt+set}" = set; then + : +else + ac_cv_search_getopt=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_search_getopt" >&5 +echo "${ECHO_T}$ac_cv_search_getopt" >&6; } +ac_res=$ac_cv_search_getopt +if test "$ac_res" != no; then + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi -done -for ac_func in mergesort + + +for ac_func in strtoimax strtoll do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 @@ -22723,7 +22713,7 @@ fi done -for ac_func in mkstemps +for ac_func in mergesort do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 @@ -22833,18 +22823,36 @@ fi done -{ echo "$as_me:$LINENO: checking for library containing getopt" >&5 -echo $ECHO_N "checking for library containing getopt... $ECHO_C" >&6; } -if test "${ac_cv_search_getopt+set}" = set; then +for ac_func in mkstemps +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - ac_func_search_save_LIBS=$LIBS -cat >conftest.$ac_ext <<_ACEOF + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC @@ -22852,23 +22860,23 @@ cat >>conftest.$ac_ext <<_ACEOF #ifdef __cplusplus extern "C" #endif -char getopt (); +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + int main () { -return getopt (); +return $ac_func (); ; return 0; } _ACEOF -for ac_lib in '' iberty; do - if test -z "$ac_lib"; then - ac_res="none required" - else - ac_res=-l$ac_lib - LIBS="-l$ac_lib $ac_func_search_save_LIBS" - fi - rm -f conftest.$ac_objext conftest$ac_exeext +rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; @@ -22902,35 +22910,27 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then - ac_cv_search_getopt=$ac_res + eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - + eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext - if test "${ac_cv_search_getopt+set}" = set; then - break -fi -done -if test "${ac_cv_search_getopt+set}" = set; then - : -else - ac_cv_search_getopt=no -fi -rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS + conftest$ac_exeext conftest.$ac_ext fi -{ echo "$as_me:$LINENO: result: $ac_cv_search_getopt" >&5 -echo "${ECHO_T}$ac_cv_search_getopt" >&6; } -ac_res=$ac_cv_search_getopt -if test "$ac_res" != no; then - test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF fi +done ac_config_headers="$ac_config_headers config.h" diff --git a/configure.in b/configure.in index b81d87273..4830b718a 100644 --- a/configure.in +++ b/configure.in @@ -75,13 +75,13 @@ AC_TYPE_SIZE_T AC_STRUCT_TM AC_CHECK_TYPE(intmax_t, int64_t) +dnl For mingw +AC_SEARCH_LIBS(getopt, iberty) + AC_CHECK_FUNCS(strtoimax strtoll) AC_CHECK_FUNCS(mergesort) AC_CHECK_FUNCS(mkstemps) -dnl For mingw -AC_SEARCH_LIBS(getopt, iberty) - AM_CONFIG_HEADER(config.h) AC_OUTPUT( \ From 9c3374be226e557251455c3089f8fc0e4e93c318 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 4 Dec 2007 11:32:37 +0000 Subject: [PATCH 1393/1469] mentioned full-width 32 bit integers git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1405 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index 6afb54ec7..d5739e3db 100644 --- a/ChangeLog +++ b/ChangeLog @@ -17,6 +17,7 @@ (Severity: low; Security impact: none) * Added DEFAULT handling for known multiplier string. * Added a sample OMA ULP decoder (./examples/sample.source.ULP). + * Added full-width 32-bit integer encoding support in PER. 0.9.21: 2006-Sep-17 From 86058b318edb18af6c7b3fd4624800147c66c1f6 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 1 Jan 2008 20:04:52 +0000 Subject: [PATCH 1394/1469] with -> as git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1406 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix_constr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libasn1fix/asn1fix_constr.c b/libasn1fix/asn1fix_constr.c index 47c210f99..e486a3321 100644 --- a/libasn1fix/asn1fix_constr.c +++ b/libasn1fix/asn1fix_constr.c @@ -427,7 +427,7 @@ _asn1f_compare_tags(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b) { char *p = (a->expr_type == A1TC_EXTENSIBLE) ?"potentially ":""; FATAL("Processing %s at line %d: component \"%s\" at line %d %shas the same tag " - "with component \"%s\" at line %d", + "as component \"%s\" at line %d", arg->expr->Identifier, arg->expr->_lineno, a->Identifier, From d02b460727f8252825c29e93fb93c67b29f30a62 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 20 Nov 2008 05:15:11 +0000 Subject: [PATCH 1395/1469] memory OOB issue on Windows and with non-standard allocators; by Sheng Yu git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1407 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 5 ++++- skeletons/INTEGER.c | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index d5739e3db..4e8a038d1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9.22: 2007-Jun-29 +0.9.22: 2008-Nov-19 * Added -pdu=all and -pdu= switches to asn1c. * Added PER support for most known-multiplier string types: @@ -18,6 +18,9 @@ * Added DEFAULT handling for known multiplier string. * Added a sample OMA ULP decoder (./examples/sample.source.ULP). * Added full-width 32-bit integer encoding support in PER. + * Fixed 1-byte OOB write issue with non-standard and Windows + memory allocators (Severity: low; Security impact: medium). + Reported by Sheng Yu. 0.9.21: 2006-Sep-17 diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 54a402b3c..f016131a1 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -868,8 +868,8 @@ asn_ulong2INTEGER(INTEGER_t *st, unsigned long value) { end = buf + (sizeof(value) + 1); buf[0] = 0; - for(b = buf, shr = (sizeof(long)-1)*8; b < end; shr -= 8) - *(++b) = (uint8_t)(value >> shr); + for(b = buf + 1, shr = (sizeof(long)-1)*8; b < end; shr -= 8, b++) + *b = (uint8_t)(value >> shr); if(st->buf) FREEMEM(st->buf); st->buf = buf; From e19f685ad7991df45dcc7114e53f7ebeb4a12d6c Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 10 Mar 2010 23:05:56 +0000 Subject: [PATCH 1396/1469] minutes fix, courtesy IP Fabrics, Inc. git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1408 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/GeneralizedTime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 2f84dff93..9d683efe4 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -666,7 +666,7 @@ asn_time2GT_frac(GeneralizedTime_t *opt_gt, const struct tm *tm, int frac_value, int ret; gmtoff %= 86400; ret = snprintf(p, buf_size - size, "%+03ld%02ld", - gmtoff / 3600, labs(gmtoff % 3600)); + gmtoff / 3600, labs(gmtoff % 3600) / 60); if(ret != 5) { FREEMEM(buf); errno = EINVAL; From f5ab8ba08c82d6283fe35a9678b6bac4e1fe2337 Mon Sep 17 00:00:00 2001 From: vlm Date: Wed, 10 Mar 2010 23:09:29 +0000 Subject: [PATCH 1397/1469] attribution git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1409 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ChangeLog b/ChangeLog index 4e8a038d1..e15f2d331 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,10 @@ +0.9.23: 2010-Mar-10 + + * GeneralizedTime fix for working with time offsets which are not + representable in whole hours. (Severity: low; Security impact: low) + Thanks to IP Fabrics, Inc. + 0.9.22: 2008-Nov-19 * Added -pdu=all and -pdu= switches to asn1c. From 7a52a6f0900edf2b0bdec4ad64e5788cf36e44f8 Mon Sep 17 00:00:00 2001 From: vlm Date: Thu, 7 Oct 2010 08:25:37 +0000 Subject: [PATCH 1398/1469] Added -fincludes-quoted to generate #includes in double instead of quotes. git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1410 59561ff5-6e30-0410-9f3c-9617f08c8826 --- ChangeLog | 4 +++- asn1c/asn1c.c | 3 +++ libasn1compiler/asn1c_fdeps.c | 3 +++ libasn1compiler/asn1c_out.h | 7 ++++++- libasn1compiler/asn1c_save.c | 10 ++++++++-- libasn1compiler/asn1compiler.h | 7 ++++++- 6 files changed, 29 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index e15f2d331..58b381c29 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,9 +1,11 @@ -0.9.23: 2010-Mar-10 +0.9.23: 2010-Oct-07 * GeneralizedTime fix for working with time offsets which are not representable in whole hours. (Severity: low; Security impact: low) Thanks to IP Fabrics, Inc. + * Added -fincludes-quoted to asn1c to generate #includes in "double" + instead of quotes. 0.9.22: 2008-Nov-19 diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index 742a0b232..08a3690cf 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -97,6 +97,8 @@ main(int ac, char **av) { asn1_compiler_flags |= A1C_NO_CONSTRAINTS; } else if(strcmp(optarg, "no-include-deps") == 0) { asn1_compiler_flags |= A1C_NO_INCLUDE_DEPS; + } else if(strcmp(optarg, "includes-quoted") == 0) { + asn1_compiler_flags |= A1C_INCLUDES_QUOTED; } else if(strcmp(optarg, "unnamed-unions") == 0) { asn1_compiler_flags |= A1C_UNNAMED_UNIONS; } else if(strcmp(optarg, "skeletons-copy") == 0) { @@ -454,6 +456,7 @@ usage(const char *av0) { " -fbless-SIZE Allow SIZE() constraint for INTEGER etc (non-std.)\n" " -fcompound-names Disambiguate C's struct NAME's inside top-level types\n" " -findirect-choice Compile members of CHOICE as indirect pointers\n" +" -fincludes-quoted Generate #includes in \"double\" instead of quotes\n" " -fknown-extern-type= Pretend the specified type is known\n" " -fnative-types Use \"long\" instead of INTEGER_t whenever possible, etc.\n" " -fno-constraints Do not generate constraint checking code\n" diff --git a/libasn1compiler/asn1c_fdeps.c b/libasn1compiler/asn1c_fdeps.c index e34cb6f52..231a47ccb 100644 --- a/libasn1compiler/asn1c_fdeps.c +++ b/libasn1compiler/asn1c_fdeps.c @@ -25,6 +25,9 @@ asn1c_activate_dependency(asn1c_fdeps_t *deps, asn1c_fdeps_t *cur, const char *d if(start) { start++; end = strchr(start, '>'); + } else if((start = strchr(data, '\"'))) { + start++; + end = strchr(start, '\"'); } if(end) { char *p = alloca((end - start) + 1); diff --git a/libasn1compiler/asn1c_out.h b/libasn1compiler/asn1c_out.h index 04d7ff2f2..d68f3a854 100644 --- a/libasn1compiler/asn1c_out.h +++ b/libasn1compiler/asn1c_out.h @@ -83,7 +83,12 @@ int asn1c_compiled_output(arg_t *arg, const char *fmt, ...); } while(0) /* Generate #include line */ -#define GEN_INCLUDE_STD(typename) GEN_INCLUDE("<" typename ".h>") +#define GEN_INCLUDE_STD(typename) do { \ + if((arg->flags & A1C_INCLUDES_QUOTED)) { \ + GEN_INCLUDE("\"" typename ".h\""); \ + } else { \ + GEN_INCLUDE("<" typename ".h>"); \ + } } while(0) #define GEN_INCLUDE(filename) do { \ int saved_target = arg->target->target; \ if(!filename) break; \ diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c index 1785d7d1a..f348f1972 100644 --- a/libasn1compiler/asn1c_save.c +++ b/libasn1compiler/asn1c_save.c @@ -6,6 +6,11 @@ #include "asn1c_save.h" #include "asn1c_out.h" +#define HINCLUDE(s) \ + ((arg->flags & A1C_INCLUDES_QUOTED) \ + ? fprintf(fp_h, "#include \"%s\"\n", s) \ + : fprintf(fp_h, "#include <%s>\n", s)) \ + static int asn1c_dump_streams(arg_t *arg, asn1c_fdeps_t *, int, char **); static int asn1c_print_streams(arg_t *arg); static int asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *, int, char **); @@ -240,7 +245,8 @@ asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *deps, int optc, char **argv) { "#define\t_%s_H_\n" "\n", header_id, header_id); - fprintf(fp_h, "\n#include \n"); + fprintf(fp_h, "\n"); + HINCLUDE("asn_application.h"); #define SAVE_STREAM(fp, idx, msg, actdep) do { \ if(TQ_FIRST(&(cs->destination[idx].chunks)) && *msg) \ @@ -265,7 +271,7 @@ asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *deps, int optc, char **argv) { fprintf(fp_h, "\n#endif\t/* _%s_H_ */\n", header_id); - fprintf(fp_c, "#include \n\n"); + HINCLUDE("asn_internal.h"); fprintf(fp_c, "#include \"%s.h\"\n\n", expr->Identifier); if(arg->flags & A1C_NO_INCLUDE_DEPS) SAVE_STREAM(fp_c, OT_POST_INCLUDE, "", 1); diff --git a/libasn1compiler/asn1compiler.h b/libasn1compiler/asn1compiler.h index 607826263..c8c9b9b24 100644 --- a/libasn1compiler/asn1compiler.h +++ b/libasn1compiler/asn1compiler.h @@ -67,7 +67,12 @@ enum asn1c_flags { */ A1C_PDU_ALL = 0x2000, A1C_PDU_AUTO = 0x4000, - A1C_PDU_TYPE = 0x8000 + A1C_PDU_TYPE = 0x8000, + /* + * -fincludes-quoted + * Avoid generating #include , generate "foo" instead. + */ + A1C_INCLUDES_QUOTED = 0x10000 }; /* From 717b9a5e2e8e1c67a65917767d2c8f57fc91ecb6 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Mon, 1 Mar 2010 09:32:24 +0100 Subject: [PATCH 1399/1469] Initial support for mder --- libasn1compiler/asn1c_C.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index be7f059af..f4a34bfde 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1238,6 +1238,9 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("td->print_struct = asn_DEF_%s.print_struct;\n", type_name); OUT("td->ber_decoder = asn_DEF_%s.ber_decoder;\n", type_name); OUT("td->der_encoder = asn_DEF_%s.der_encoder;\n", type_name); + OUT("/*Sancane comment: Next code is generated in asn1c_C.c 1241*/\n"); + OUT("/*td->mder_decoder = asn_DEF_%s.mder_decoder;*/\n", type_name); + OUT("/*td->mder_encoder = asn_DEF_%s.mder_encoder;*/\n", type_name); OUT("td->xer_decoder = asn_DEF_%s.xer_decoder;\n", type_name); OUT("td->xer_encoder = asn_DEF_%s.xer_encoder;\n", type_name); OUT("td->uper_decoder = asn_DEF_%s.uper_decoder;\n", type_name); @@ -1410,6 +1413,8 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("asn_constr_check_f %s_constraint;\n", p); OUT("ber_type_decoder_f %s_decode_ber;\n", p); OUT("der_type_encoder_f %s_encode_der;\n", p); + OUT("/*mder_type_decoder_f %s_decode_mder;*/\n", p); + OUT("/*mder_type_encoder_f %s_encode_mder;*/\n", p); OUT("xer_type_decoder_f %s_decode_xer;\n", p); OUT("xer_type_encoder_f %s_encode_xer;\n", p); if(arg->flags & A1C_GEN_PER) { @@ -2449,6 +2454,8 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ FUNCREF(constraint); FUNCREF(decode_ber); FUNCREF(encode_der); + /* FUNCREF(decode_mder); */ + /* FUNCREF(encode_mder); */ FUNCREF(decode_xer); FUNCREF(encode_xer); if(arg->flags & A1C_GEN_PER) { From 6847e068bc3fe06e0f905fe907c3077af78c32f5 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Tue, 2 Mar 2010 21:16:37 +0100 Subject: [PATCH 1400/1469] Linking mder libraries when asn1c compiler is executed --- skeletons/mder_encoder.c | 23 ++++++++++++++++++ skeletons/mder_encoder.h | 51 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 skeletons/mder_encoder.c create mode 100644 skeletons/mder_encoder.h diff --git a/skeletons/mder_encoder.c b/skeletons/mder_encoder.c new file mode 100644 index 000000000..b5e165e69 --- /dev/null +++ b/skeletons/mder_encoder.c @@ -0,0 +1,23 @@ +/*- + * Copyright (c) 2010 Santiago Carot-Nemesio . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +asn_enc_rval_t mder_encode(struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, asn_app_consume_bytes_f *consume_bytes_cb, + void *app_key) +{ + asn_enc_rval_t t; + return t; +} + +asn_enc_rval_t mder_encode_to_buffer( + struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, + void *buffer, size_t buffer_size) +{ + asn_enc_rval_t t; + return t; +} diff --git a/skeletons/mder_encoder.h b/skeletons/mder_encoder.h new file mode 100644 index 000000000..6e5ed578b --- /dev/null +++ b/skeletons/mder_encoder.h @@ -0,0 +1,51 @@ +/*- + * Copyright (c) 2010 Santiago Carot-Nemesio . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _MDER_ENCODER_H_ +#define _MDER_ENCODER_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * The MDER encoder of any type. May be invoked by the application. + * The ber_decode() function (ber_decoder.h) is an opposite of der_encode(). + */ +asn_enc_rval_t mder_encode(struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, /* Structure to be encoded */ + asn_app_consume_bytes_f *consume_bytes_cb, + void *app_key /* Arbitrary callback argument */ + ); + +/* A variant of mder_encode() which encodes data into the pre-allocated buffer */ +asn_enc_rval_t mder_encode_to_buffer( + struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, /* Structure to be encoded */ + void *buffer, /* Pre-allocated buffer */ + size_t buffer_size /* Initial buffer size (maximum) */ + ); + +/* + * Type of the generic MDER encoder. + */ +typedef asn_enc_rval_t (mder_type_encoder_f)( + struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, /* Structure to be encoded */ + int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ + ber_tlv_tag_t tag, + asn_app_consume_bytes_f *consume_bytes_cb, /* Callback */ + void *app_key /* Arbitrary callback argument */ + ); + +#ifdef __cplusplus +} +#endif + +#endif /* _MDER_ENCODER_H_ */ From 2aaeff4a2fac08d91a450476faf48a44ee794c7e Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Tue, 2 Mar 2010 21:17:19 +0100 Subject: [PATCH 1401/1469] linked mder libraries when asn1c is executed --- skeletons/file-dependencies | 1 + 1 file changed, 1 insertion(+) diff --git a/skeletons/file-dependencies b/skeletons/file-dependencies index c2a5dae72..442a70d1a 100644 --- a/skeletons/file-dependencies +++ b/skeletons/file-dependencies @@ -53,6 +53,7 @@ ber_tlv_length.h ber_tlv_length.c # BER TLV L (length) ber_tlv_tag.h ber_tlv_tag.c # BER TLV T (tag) ber_decoder.h ber_decoder.c # BER decoder support code der_encoder.h der_encoder.c # DER encoder support code +mder_encoder.h mder_encoder.c # MDER encoder support code constr_TYPE.h constr_TYPE.c # Description of a type constraints.h constraints.c # Subtype constraints support xer_support.h xer_support.c # XML parsing From 8517d57607714b0a364827e51e3acb527e3bf6f0 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Thu, 4 Mar 2010 16:14:00 +0100 Subject: [PATCH 1402/1469] Adding support for integer encoder using MDER --- libasn1compiler/asn1c_C.c | 23 +++++++++++++++++++---- skeletons/INTEGER.c | 15 +++++++++++++++ skeletons/INTEGER.h | 1 + skeletons/constr_TYPE.h | 2 ++ 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index f4a34bfde..c62c7731c 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1238,9 +1238,8 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("td->print_struct = asn_DEF_%s.print_struct;\n", type_name); OUT("td->ber_decoder = asn_DEF_%s.ber_decoder;\n", type_name); OUT("td->der_encoder = asn_DEF_%s.der_encoder;\n", type_name); - OUT("/*Sancane comment: Next code is generated in asn1c_C.c 1241*/\n"); OUT("/*td->mder_decoder = asn_DEF_%s.mder_decoder;*/\n", type_name); - OUT("/*td->mder_encoder = asn_DEF_%s.mder_encoder;*/\n", type_name); + OUT("td->mder_encoder = asn_DEF_%s.mder_encoder;\n", type_name); OUT("td->xer_decoder = asn_DEF_%s.xer_decoder;\n", type_name); OUT("td->xer_encoder = asn_DEF_%s.xer_encoder;\n", type_name); OUT("td->uper_decoder = asn_DEF_%s.uper_decoder;\n", type_name); @@ -1334,6 +1333,22 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("}\n"); OUT("\n"); + p = MKID(expr); + if(HIDE_INNER_DEFS) OUT("static "); + OUT("asn_enc_rval_t\n"); + OUT("%s", p); + if(HIDE_INNER_DEFS) OUT("_%d", expr->_type_unique_index); + OUT("_encode_mder(asn_TYPE_descriptor_t *td,\n"); + INDENTED( + OUT("\tvoid *structure, int tag_mode, ber_tlv_tag_t tag,\n"); + OUT("\tasn_app_consume_bytes_f *cb, void *app_key) {\n"); + OUT("%s_%d_inherit_TYPE_descriptor(td);\n", + p, expr->_type_unique_index); + OUT("return td->mder_encoder(td, structure, tag_mode, tag, cb, app_key);\n"); + ); + OUT("}\n"); + OUT("\n"); + p = MKID(expr); if(HIDE_INNER_DEFS) OUT("static "); OUT("asn_dec_rval_t\n"); @@ -1414,7 +1429,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("ber_type_decoder_f %s_decode_ber;\n", p); OUT("der_type_encoder_f %s_encode_der;\n", p); OUT("/*mder_type_decoder_f %s_decode_mder;*/\n", p); - OUT("/*mder_type_encoder_f %s_encode_mder;*/\n", p); + OUT("mder_type_encoder_f %s_encode_mder;\n", p); OUT("xer_type_decoder_f %s_decode_xer;\n", p); OUT("xer_type_encoder_f %s_encode_xer;\n", p); if(arg->flags & A1C_GEN_PER) { @@ -2455,7 +2470,7 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ FUNCREF(decode_ber); FUNCREF(encode_der); /* FUNCREF(decode_mder); */ - /* FUNCREF(encode_mder); */ + FUNCREF(encode_mder); FUNCREF(decode_xer); FUNCREF(encode_xer); if(arg->flags & A1C_GEN_PER) { diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index f016131a1..4c118a2fe 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -22,6 +22,7 @@ asn_TYPE_descriptor_t asn_DEF_INTEGER = { asn_generic_no_constraint, ber_decode_primitive, INTEGER_encode_der, + INTEGER_encode_mder, INTEGER_decode_xer, INTEGER_encode_xer, INTEGER_decode_uper, /* Unaligned PER decoder */ @@ -36,6 +37,20 @@ asn_TYPE_descriptor_t asn_DEF_INTEGER = { 0 /* No specifics */ }; + +/* + * Encode INTEGER type using MDER. + */ +asn_enc_rval_t +INTEGER_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + + asn_enc_rval_t r; + ASN_DEBUG("Implement Integer"); + return r; +} + /* * Encode INTEGER type using DER. */ diff --git a/skeletons/INTEGER.h b/skeletons/INTEGER.h index 8411bfcdd..05a9b499e 100644 --- a/skeletons/INTEGER.h +++ b/skeletons/INTEGER.h @@ -37,6 +37,7 @@ typedef struct asn_INTEGER_specifics_s { asn_struct_print_f INTEGER_print; ber_type_decoder_f INTEGER_decode_ber; der_type_encoder_f INTEGER_encode_der; +mder_type_encoder_f INTEGER_encode_mder; xer_type_decoder_f INTEGER_decode_xer; xer_type_encoder_f INTEGER_encode_xer; per_type_decoder_f INTEGER_decode_uper; diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index 95507c809..c8a24f929 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -37,6 +37,7 @@ typedef struct asn_struct_ctx_s { #include /* Basic Encoding Rules decoder */ #include /* Distinguished Encoding Rules encoder */ +#include /* Medical Device Encoding Rules encoder */ #include /* Decoder of XER (XML, text) */ #include /* Encoder into XER (XML, text) */ #include /* Packet Encoding Rules decoder */ @@ -95,6 +96,7 @@ typedef struct asn_TYPE_descriptor_s { asn_constr_check_f *check_constraints; /* Constraints validator */ ber_type_decoder_f *ber_decoder; /* Generic BER decoder */ der_type_encoder_f *der_encoder; /* Canonical DER encoder */ + mder_type_encoder_f *mder_encoder; /* MDER encoder */ xer_type_decoder_f *xer_decoder; /* Generic XER decoder */ xer_type_encoder_f *xer_encoder; /* [Canonical] XER encoder */ per_type_decoder_f *uper_decoder; /* Unaligned PER decoder */ From 88085e332bfc02d78dc33706e78264f4c62bda76 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Sun, 7 Mar 2010 09:58:23 +0100 Subject: [PATCH 1403/1469] Working in mder encoder for INTEGERs --- skeletons/INTEGER.c | 2 +- skeletons/NativeInteger.c | 64 ++++++++++++++++++++++++++++++--------- skeletons/NativeInteger.h | 1 + skeletons/constr_TYPE.h | 3 +- skeletons/mder_encoder.c | 11 +++++-- skeletons/mder_encoder.h | 2 +- 6 files changed, 63 insertions(+), 20 deletions(-) diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 4c118a2fe..31fcaadff 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -47,7 +47,7 @@ INTEGER_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t r; - ASN_DEBUG("Implement Integer"); + printf("Implement MDER Integer\n"); return r; } diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index abdb71a8c..f8505d408 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -27,6 +27,7 @@ asn_TYPE_descriptor_t asn_DEF_NativeInteger = { asn_generic_no_constraint, NativeInteger_decode_ber, NativeInteger_encode_der, + NativeInteger_encode_mder, NativeInteger_decode_xer, NativeInteger_encode_xer, NativeInteger_decode_uper, /* Unaligned PER decoder */ @@ -126,6 +127,27 @@ NativeInteger_decode_ber(asn_codec_ctx_t *opt_codec_ctx, return rval; } +#ifdef WORDS_BIGENDIAN /* Opportunistic optimization */ +#define _PREPARE_INTEGER_T(tmp,native) do { \ \ + tmp.buf = (uint8_t *)&native; \ + tmp.size = sizeof(native); \ +} while(0) +#else /* Works even if WORDS_BIGENDIAN is not set where should've been */ +#define _PREPARE_INTEGER_T(tmp,native) do { \ + /* set where should've been */ \ + uint8_t buf[sizeof(native)]; \ + uint8_t *p; \ + \ + /* Prepare a fake INTEGER */ \ + for(p = buf + sizeof(buf) - 1; p >= buf; p--, native >>= 8) \ + *p = (uint8_t)native; \ + \ + tmp.buf = buf; \ + tmp.size = sizeof(buf); \ +} while(0) +#endif /* WORDS_BIGENDIAN */ + + /* * Encode the NativeInteger using the standard INTEGER type DER encoder. */ @@ -137,25 +159,39 @@ NativeInteger_encode_der(asn_TYPE_descriptor_t *sd, void *ptr, asn_enc_rval_t erval; INTEGER_t tmp; -#ifdef WORDS_BIGENDIAN /* Opportunistic optimization */ + _PREPARE_INTEGER_T(tmp, native); - tmp.buf = (uint8_t *)&native; - tmp.size = sizeof(native); + /* Encode fake INTEGER */ + erval = INTEGER_encode_der(sd, &tmp, tag_mode, tag, cb, app_key); + if(erval.encoded == -1) { + assert(erval.structure_ptr == &tmp); + erval.structure_ptr = ptr; + } + return erval; +} -#else /* Works even if WORDS_BIGENDIAN is not set where should've been */ - uint8_t buf[sizeof(native)]; - uint8_t *p; +/* + * Encode the NativeInteger using MDER encoder. + */ +asn_enc_rval_t +NativeInteger_encode_mder(asn_TYPE_descriptor_t *sd, void *ptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + unsigned long native = *(unsigned long *)ptr; /* Disable sign ext. */ + asn_enc_rval_t erval; + INTEGER_t tmp; + int i; - /* Prepare a fake INTEGER */ - for(p = buf + sizeof(buf) - 1; p >= buf; p--, native >>= 8) - *p = (uint8_t)native; + printf("name: %s\n", sd->name); + printf("xml_tag: %s\n", sd->xml_tag); + _PREPARE_INTEGER_T(tmp,native); + printf("INTEGER len %d\n", tmp.size); + for (i=0; i. + * Copyright (c) 2010 Santiago Carot-Nemesio . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ @@ -79,7 +80,7 @@ typedef ber_tlv_tag_t (asn_outmost_tag_f)( /* The instance of the above function type; used internally. */ asn_outmost_tag_f asn_TYPE_outmost_tag; - + /* * The definitive description of the destination language's structure. */ diff --git a/skeletons/mder_encoder.c b/skeletons/mder_encoder.c index b5e165e69..f3d3912f6 100644 --- a/skeletons/mder_encoder.c +++ b/skeletons/mder_encoder.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2010 Santiago Carot-Nemesio . + * Copyright (c) 2010 Santiago Carot-Nemesio . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ @@ -10,8 +10,13 @@ asn_enc_rval_t mder_encode(struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, asn_app_consume_bytes_f *consume_bytes_cb, void *app_key) { - asn_enc_rval_t t; - return t; + /* + * Invoke type-specific encoder. + */ + return type_descriptor->mder_encoder(type_descriptor, + struct_ptr, /* Pointer to the destination structure */ + 0, 0, + consume_bytes_cb, app_key); } asn_enc_rval_t mder_encode_to_buffer( diff --git a/skeletons/mder_encoder.h b/skeletons/mder_encoder.h index 6e5ed578b..0f848d15a 100644 --- a/skeletons/mder_encoder.h +++ b/skeletons/mder_encoder.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2010 Santiago Carot-Nemesio . + * Copyright (c) 2010 Santiago Carot-Nemesio . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ From 9b6d9a64d3cb43d171ee24b468fcacad06328448 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Sun, 14 Mar 2010 11:45:08 +0100 Subject: [PATCH 1404/1469] ASN1C Code generator automatically write restricted inetger size for mder integers TODO: Revise check range limits for integers and use custom function instead of "asn1constraint_compute_PER_range" --- libasn1compiler/asn1c_C.c | 61 +++++++++++++++++++++++++++++++- skeletons/NativeInteger.c | 1 + skeletons/file-dependencies | 1 + skeletons/mder_encoder.h | 2 +- skeletons/mder_support.h | 69 +++++++++++++++++++++++++++++++++++++ 5 files changed, 132 insertions(+), 2 deletions(-) create mode 100644 skeletons/mder_support.h diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index c62c7731c..0cad5939c 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -42,6 +42,7 @@ static int expr_as_xmlvaluelist(arg_t *arg, asn1p_expr_t *expr); static int expr_elements_count(arg_t *arg, asn1p_expr_t *expr); static int emit_single_member_PER_constraint(arg_t *arg, asn1cnst_range_t *range, int juscountvalues, char *type); static int emit_member_PER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx); +static int emit_member_MDER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx); static int emit_member_table(arg_t *arg, asn1p_expr_t *expr); static int emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count, const char *opt_modifier); static int emit_include_dependencies(arg_t *arg); @@ -2418,13 +2419,58 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { return 0; } +static int +emit_member_MDER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { + asn1cnst_range_t *r_value; + asn1p_expr_type_e etype; + asn1p_constraint_t *ct; + char *p = MKID(expr); + + etype = expr_get_type(arg, expr); + switch (etype) { + case ASN_BASIC_INTEGER: + OUT("static mder_restricted_int " + "asn_MDER_%s_%s_constr_%d = ", + pfx, p, expr->_type_unique_index); + ct = expr->combined_constraints; + r_value=asn1constraint_compute_PER_range(etype, ct, ACT_EL_RANGE,0,0,0); + if (!r_value) { + OUT("INVALID;\n"); + return 1; + } else if (r_value->left.value == 0) { + /* Unsigned Integer */ + if (r_value->right.value == 255) + OUT("INT_U8;\n"); + else if (r_value->right.value == 65535) + OUT("INT_U16;\n"); + else if (r_value->right.value == 4294967295UL) + OUT("INT_U32;\n"); + else + OUT("INVALID;\n"); + return 1; + } + /* Check signed integer */ + if ((r_value->left.value == -128) && (r_value->right.value == 127)) + OUT("INT_I8;\n"); + else if ((r_value->left.value == -32768) && (r_value->right.value == 32767)) + OUT("INT_I16;\n"); + else if ((r_value->left.value == (-2147483647L - 1)) && (r_value->right.value == 2147483647L)) + OUT("INT_I32;\n"); + else + OUT("INVALID;\n"); + return 1; + default: + return 0; + } +} + /* * Generate "asn_DEF_XXX" type definition. */ static int emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_count, int all_tags_count, int elements_count, enum etd_spec spec) { asn1p_expr_t *terminal; - int using_type_name = 0; + int using_type_name = 0, mder_constr; char *p = MKID(expr); terminal = asn1f_find_terminal_type_ex(arg->asn, expr); @@ -2432,6 +2478,8 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ if(emit_member_PER_constraints(arg, expr, "type")) return -1; + mder_constr = emit_member_MDER_constraints(arg, expr, "type"); + if(HIDE_INNER_DEFS) OUT("static /* Use -fall-defs-global to expose */\n"); OUT("asn_TYPE_descriptor_t asn_DEF_%s", p); @@ -2563,6 +2611,16 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ OUT("&asn_SPC_%s_specs_%d\t/* Additional specs */\n", p, expr->_type_unique_index); } + + /* MDER Contraints */ + if (mder_constr) { + OUT("/* Include next field in asn_TYPE_descriptor_t */\n"); + OUT("/* &asn_MDER_type_%s_constr_%d */\t/* type: asn_mder_contraints_t*/\n", + p, expr->_type_unique_index); + } else { + OUT("0\t/* No MDER restricted type */\n"); + } + INDENT(-1); OUT("};\n"); OUT("\n"); @@ -2875,3 +2933,4 @@ static int compar_cameo(const void *ap, const void *bp) { return 0; } + diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index f8505d408..ea8d04b1d 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -184,6 +184,7 @@ NativeInteger_encode_mder(asn_TYPE_descriptor_t *sd, void *ptr, printf("name: %s\n", sd->name); printf("xml_tag: %s\n", sd->xml_tag); + printf("specific %p\n", sd->specifics); _PREPARE_INTEGER_T(tmp,native); printf("INTEGER len %d\n", tmp.size); for (i=0; i +#include #ifdef __cplusplus extern "C" { @@ -16,7 +17,6 @@ struct asn_TYPE_descriptor_s; /* Forward declaration */ /* * The MDER encoder of any type. May be invoked by the application. - * The ber_decode() function (ber_decoder.h) is an opposite of der_encode(). */ asn_enc_rval_t mder_encode(struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ diff --git a/skeletons/mder_support.h b/skeletons/mder_support.h new file mode 100644 index 000000000..9e1fed397 --- /dev/null +++ b/skeletons/mder_support.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2010 Santiago Carot-Nemesio . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _MDER_SUPPORT_H_ +#define _MDER_SUPPORT_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Size constraints shall be used for all INTEGER data types to define the + * value range of the integer. + */ +typedef enum { + INVALID, + INT_U8, + INT_I8, + INT_U16, + INT_I16, + INT_U32, + INT_I32 +} mder_restricted_int; + +/* + * Get the number of octets needed to encode/decode an integer type + */ +#define GET_INT_SIZE(_int,_size) do { \ + switch (_int) { \ + case INT_U8: \ + case INT_I8: \ + _size = 1; \ + break; \ + case INT_U16: \ + case INT_I16: \ + _size = 2; \ + break; \ + case INT_U32: \ + case INT_I32: \ + _size = 4; \ + break; \ + default: \ + _size = 0; \ + } \ +} while (0) + +/* + * Size constraints shall be used for all BIT STRING data types to define the + * value range of the bit string. + */ +typedef enum { + INVALID, + BITS_8 = 1, + BITS_16 = 2, + BITS_32 = 4 +} mder_restrincted_bits; + +/* + * Pre-computed MDER Subtype constrint info (if is restricted type). + */ +typedef void *asn_mder_contraints_t; + +#ifdef __cplusplus +} +#endif + +#endif /* _MDER_SUPPORT_H_ */ From 49b7dc2ed96d21733daef38967e3d3f9ac5c6466 Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Sun, 14 Mar 2010 21:21:47 +0100 Subject: [PATCH 1405/1469] Added mder encoder in some types needed for encode uint8 --- skeletons/BIT_STRING.c | 2 ++ skeletons/NativeEnumerated.c | 2 ++ skeletons/OCTET_STRING.c | 11 +++++++++++ skeletons/OCTET_STRING.h | 2 ++ skeletons/constr_TYPE.h | 1 + 5 files changed, 18 insertions(+) diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index 9b9827127..df0a63a41 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -1,4 +1,5 @@ /*- + * Copyright (c) 2010 Jose Antonio Santos-Cadenas . * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ @@ -25,6 +26,7 @@ asn_TYPE_descriptor_t asn_DEF_BIT_STRING = { BIT_STRING_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_mder, OCTET_STRING_decode_xer_binary, BIT_STRING_encode_xer, OCTET_STRING_decode_uper, /* Unaligned PER decoder */ diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c index 1554220f8..a5bb2deb8 100644 --- a/skeletons/NativeEnumerated.c +++ b/skeletons/NativeEnumerated.c @@ -1,4 +1,5 @@ /*- + * Copyright (c) 2010 Jose Antonio Santos-Cadenas . * Copyright (c) 2004, 2007 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ @@ -26,6 +27,7 @@ asn_TYPE_descriptor_t asn_DEF_NativeEnumerated = { asn_generic_no_constraint, NativeInteger_decode_ber, NativeInteger_encode_der, + NativeInteger_encode_mder, NativeInteger_decode_xer, NativeEnumerated_encode_xer, NativeEnumerated_decode_uper, diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 584def8b4..766b6bcd7 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -1,4 +1,5 @@ /*- + * Copyright (c) 2010 Jose Antonio Santos-Cadenas . * Copyright (c) 2003, 2004, 2005, 2006 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. @@ -32,6 +33,7 @@ asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { asn_generic_no_constraint, OCTET_STRING_decode_ber, OCTET_STRING_encode_der, + OCTET_STRING_encode_mder, OCTET_STRING_decode_xer_hex, OCTET_STRING_encode_xer, OCTET_STRING_decode_uper, /* Unaligned PER decoder */ @@ -576,6 +578,15 @@ OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *sptr, _ASN_ENCODE_FAILED; } +asn_enc_rval_t +OCTET_STRING_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) +{ + ASN_DEBUG("TODO: implement this"); + _ASN_ENCODE_FAILED; +} + asn_enc_rval_t OCTET_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, diff --git a/skeletons/OCTET_STRING.h b/skeletons/OCTET_STRING.h index 8df9a182d..984849b71 100644 --- a/skeletons/OCTET_STRING.h +++ b/skeletons/OCTET_STRING.h @@ -1,4 +1,5 @@ /*- + * Copyright (c) 2010 Jose Antonio Santos-Cadenas . * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ @@ -25,6 +26,7 @@ asn_struct_print_f OCTET_STRING_print; asn_struct_print_f OCTET_STRING_print_utf8; ber_type_decoder_f OCTET_STRING_decode_ber; der_type_encoder_f OCTET_STRING_encode_der; +mder_type_encoder_f OCTET_STRING_encode_mder; xer_type_decoder_f OCTET_STRING_decode_xer_hex; /* Hexadecimal */ xer_type_decoder_f OCTET_STRING_decode_xer_binary; /* 01010111010 */ xer_type_decoder_f OCTET_STRING_decode_xer_utf8; /* ASCII/UTF-8 */ diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index 94248f35e..f6f42b320 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -118,6 +118,7 @@ typedef struct asn_TYPE_descriptor_s { asn_per_constraints_t *per_constraints; /* PER compiled constraints */ + /* asn_mder_constraints_t *mder_constraints; /* MDER constraints */ /* * An ASN.1 production type members (members of SEQUENCE, SET, CHOICE). */ From 8f5574c5917bcbb9a11294bb85e6b3b34c8fcefe Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Mon, 15 Mar 2010 18:53:03 +0100 Subject: [PATCH 1406/1469] Encoding integer in mder (need improvement) --- libasn1compiler/asn1c_C.c | 7 ++++--- skeletons/INTEGER.c | 33 +++++++++++++++++++++++++++++++-- skeletons/NativeInteger.c | 14 +++++++------- skeletons/asn_codecs_prim.c | 29 +++++++++++++++++++++++++++++ skeletons/asn_codecs_prim.h | 2 ++ skeletons/constr_TYPE.h | 4 +++- skeletons/mder_support.h | 6 +++--- 7 files changed, 79 insertions(+), 16 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 0cad5939c..cb8246405 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -2429,6 +2429,7 @@ emit_member_MDER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { etype = expr_get_type(arg, expr); switch (etype) { case ASN_BASIC_INTEGER: + OUT("\n"); OUT("static mder_restricted_int " "asn_MDER_%s_%s_constr_%d = ", pfx, p, expr->_type_unique_index); @@ -2605,17 +2606,17 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ switch(spec) { case ETD_NO_SPECIFICS: - OUT("0\t/* No specifics */\n"); + OUT("0, \t/* No specifics */\n"); break; case ETD_HAS_SPECIFICS: - OUT("&asn_SPC_%s_specs_%d\t/* Additional specs */\n", + OUT("&asn_SPC_%s_specs_%d,\t/* Additional specs */\n", p, expr->_type_unique_index); } /* MDER Contraints */ if (mder_constr) { OUT("/* Include next field in asn_TYPE_descriptor_t */\n"); - OUT("/* &asn_MDER_type_%s_constr_%d */\t/* type: asn_mder_contraints_t*/\n", + OUT("&asn_MDER_type_%s_constr_%d\t/* type: asn_mder_contraints_t */\n", p, expr->_type_unique_index); } else { OUT("0\t/* No MDER restricted type */\n"); diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 31fcaadff..f7340740f 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -45,10 +45,39 @@ asn_enc_rval_t INTEGER_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - + INTEGER_t *st = (INTEGER_t *)sptr; + int size, shift, i; asn_enc_rval_t r; + + GET_INT_SIZE(*(mder_restricted_int *)td->mder_constraints, size); + printf("integer size = %d\n", size); + + printf("INTEGER len %d\n", st->size); + for (i=0; isize; i++) + printf ("%hx ", st->buf[i]); + printf("\n"); + printf("Implement MDER Integer\n"); - return r; + + if (!st->buf) + goto end; + shift = st->size - size; + if(shift) { + uint8_t *nb = st->buf; + uint8_t *end, *buf = st->buf + shift; + st->size -= shift; /* New size, minus bad bytes */ + end = nb + st->size; + + for(; nb < end; nb++, buf++) + *nb = *buf; + } + +end: + printf("INTEGER len %d\n", st->size); + for (i=0; isize; i++) + printf ("%hx ", st->buf[i]); + printf("\n"); + return mder_encode_primitive(td, sptr, tag_mode, tag, cb, app_key); } /* diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index ea8d04b1d..8f9fed26b 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -182,14 +182,14 @@ NativeInteger_encode_mder(asn_TYPE_descriptor_t *sd, void *ptr, INTEGER_t tmp; int i; - printf("name: %s\n", sd->name); - printf("xml_tag: %s\n", sd->xml_tag); - printf("specific %p\n", sd->specifics); +// printf("name: %s\n", sd->name); +// printf("xml_tag: %s\n", sd->xml_tag); +// printf("specific %p\n", sd->specifics); _PREPARE_INTEGER_T(tmp,native); - printf("INTEGER len %d\n", tmp.size); - for (i=0; iname, tag_mode); + + + if(cb && st->buf) { + if(cb(st->buf, st->size, app_key) < 0) { + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = sptr; + return erval; + } + } else { + assert(st->buf || st->size == 0); + } + + erval.encoded += st->size; + _ASN_ENCODED_OK(erval); +} + void ASN__PRIMITIVE_TYPE_free(asn_TYPE_descriptor_t *td, void *sptr, int contents_only) { diff --git a/skeletons/asn_codecs_prim.h b/skeletons/asn_codecs_prim.h index 0f683fdd0..5c38c34e3 100644 --- a/skeletons/asn_codecs_prim.h +++ b/skeletons/asn_codecs_prim.h @@ -20,6 +20,8 @@ asn_struct_free_f ASN__PRIMITIVE_TYPE_free; ber_type_decoder_f ber_decode_primitive; der_type_encoder_f der_encode_primitive; +mder_type_encoder_f mder_encode_primitive; + /* * A callback specification for the xer_decode_primitive() function below. */ diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index f6f42b320..bf59ec071 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -118,7 +118,6 @@ typedef struct asn_TYPE_descriptor_s { asn_per_constraints_t *per_constraints; /* PER compiled constraints */ - /* asn_mder_constraints_t *mder_constraints; /* MDER constraints */ /* * An ASN.1 production type members (members of SEQUENCE, SET, CHOICE). */ @@ -130,6 +129,9 @@ typedef struct asn_TYPE_descriptor_s { * functions above. */ void *specifics; + + /* mder constraints */ + asn_mder_contraints_t mder_constraints; /* MDER compiled constraints */ } asn_TYPE_descriptor_t; /* diff --git a/skeletons/mder_support.h b/skeletons/mder_support.h index 9e1fed397..2bde0c4aa 100644 --- a/skeletons/mder_support.h +++ b/skeletons/mder_support.h @@ -15,7 +15,7 @@ extern "C" { * value range of the integer. */ typedef enum { - INVALID, + INT_INVALID, INT_U8, INT_I8, INT_U16, @@ -51,7 +51,7 @@ typedef enum { * value range of the bit string. */ typedef enum { - INVALID, + BITS_INVALID, BITS_8 = 1, BITS_16 = 2, BITS_32 = 4 @@ -60,7 +60,7 @@ typedef enum { /* * Pre-computed MDER Subtype constrint info (if is restricted type). */ -typedef void *asn_mder_contraints_t; +typedef void* asn_mder_contraints_t; #ifdef __cplusplus } From 008c3daecfba9b6f37177b593382a603bbb0f308 Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Mon, 15 Mar 2010 22:03:50 +0100 Subject: [PATCH 1407/1469] Bug and INTEGER encoded to buffer * Bug encoding INTEGERS in mder corrected * INTEGER mder encoding to buffer * Started decoding --- skeletons/INTEGER.c | 12 +---------- skeletons/Makefile.am | 4 +++- skeletons/asn_codecs_prim.c | 2 +- skeletons/constr_TYPE.h | 1 + skeletons/mder_decoder.h | 42 +++++++++++++++++++++++++++++++++++++ skeletons/mder_encoder.c | 40 ++++++++++++++++++++++++++++++++--- 6 files changed, 85 insertions(+), 16 deletions(-) create mode 100644 skeletons/mder_decoder.h diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index f7340740f..eda9dbfa7 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -46,16 +46,10 @@ INTEGER_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { INTEGER_t *st = (INTEGER_t *)sptr; - int size, shift, i; + int size, shift; asn_enc_rval_t r; GET_INT_SIZE(*(mder_restricted_int *)td->mder_constraints, size); - printf("integer size = %d\n", size); - - printf("INTEGER len %d\n", st->size); - for (i=0; isize; i++) - printf ("%hx ", st->buf[i]); - printf("\n"); printf("Implement MDER Integer\n"); @@ -73,10 +67,6 @@ INTEGER_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, } end: - printf("INTEGER len %d\n", st->size); - for (i=0; isize; i++) - printf ("%hx ", st->buf[i]); - printf("\n"); return mder_encode_primitive(td, sptr, tag_mode, tag, cb, app_key); } diff --git a/skeletons/Makefile.am b/skeletons/Makefile.am index 125fb164b..aa685050b 100644 --- a/skeletons/Makefile.am +++ b/skeletons/Makefile.am @@ -64,5 +64,7 @@ libasn1cskeletons_la_SOURCES = \ per_support.c per_support.h \ xer_decoder.c xer_decoder.h \ xer_encoder.c xer_encoder.h \ - xer_support.c xer_support.h + xer_support.c xer_support.h \ + mder_encoder.c mder_encoder.h \ + mder_decoder.c mder_decoder.h diff --git a/skeletons/asn_codecs_prim.c b/skeletons/asn_codecs_prim.c index b8522a4d3..c6e9a9285 100644 --- a/skeletons/asn_codecs_prim.c +++ b/skeletons/asn_codecs_prim.c @@ -139,7 +139,7 @@ mder_encode_primitive(asn_TYPE_descriptor_t *td, void *sptr, assert(st->buf || st->size == 0); } - erval.encoded += st->size; + erval.encoded = st->size; _ASN_ENCODED_OK(erval); } diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index bf59ec071..298c7b36f 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -39,6 +39,7 @@ typedef struct asn_struct_ctx_s { #include /* Basic Encoding Rules decoder */ #include /* Distinguished Encoding Rules encoder */ #include /* Medical Device Encoding Rules encoder */ +// #include /* Medical Device Encoding Rules decoder */ #include /* Decoder of XER (XML, text) */ #include /* Encoder into XER (XML, text) */ #include /* Packet Encoding Rules decoder */ diff --git a/skeletons/mder_decoder.h b/skeletons/mder_decoder.h new file mode 100644 index 000000000..cf662dd1a --- /dev/null +++ b/skeletons/mder_decoder.h @@ -0,0 +1,42 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _MDER_DECODER_H_ +#define _MDER_DECODER_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ +struct asn_codec_ctx_s; /* Forward declaration */ + +/* + * The MDER decoder of any type. + * This function may be invoked directly from the application. + * The mder_encode() function (mder_encoder.h) is an opposite to mder_decode(). + */ +asn_dec_rval_t mder_decode(struct asn_codec_ctx_s *opt_codec_ctx, + struct asn_TYPE_descriptor_s *type_descriptor, + void **struct_ptr, /* Pointer to a target structure's pointer */ + const void *buffer, /* Data to be decoded */ + size_t size /* Size of that buffer */ + ); + +/* + * Type of generic function which decodes the byte stream into the structure. + */ +typedef asn_dec_rval_t (mder_type_decoder_f)( + struct asn_codec_ctx_s *opt_codec_ctx, + struct asn_TYPE_descriptor_s *type_descriptor, + void **struct_ptr, const void *buf_ptr, size_t size, + int tag_mode); + +#ifdef __cplusplus +} +#endif + +#endif /* _MDER_DECODER_H_ */ diff --git a/skeletons/mder_encoder.c b/skeletons/mder_encoder.c index f3d3912f6..275c3defc 100644 --- a/skeletons/mder_encoder.c +++ b/skeletons/mder_encoder.c @@ -1,5 +1,6 @@ /*- - * Copyright (c) 2010 Santiago Carot-Nemesio . + * Copyright (c) 2010 Santiago Carot-Nemesio + * Copyright (c) 2010 Jose Antonio Santos-Cadenas * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ @@ -19,10 +20,43 @@ asn_enc_rval_t mder_encode(struct asn_TYPE_descriptor_s *type_descriptor, consume_bytes_cb, app_key); } +/* +* Argument type and callback necessary for der_encode_to_buffer(). +*/ +typedef struct enc_to_buf_arg { + void *buffer; + size_t left; +} enc_to_buf_arg; + +static int encode_to_buffer_cb(const void *buffer, size_t size, void *key) { + enc_to_buf_arg *arg = (enc_to_buf_arg *)key; + + if(arg->left < size) + return -1; /* Data exceeds the available buffer size */ + + memcpy(arg->buffer, buffer, size); + arg->buffer = ((char *)arg->buffer) + size; + arg->left -= size; + + return 0; +} + asn_enc_rval_t mder_encode_to_buffer( struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, void *buffer, size_t buffer_size) { - asn_enc_rval_t t; - return t; + enc_to_buf_arg arg; + asn_enc_rval_t ec; + + arg.buffer = buffer; + arg.left = buffer_size; + + ec = type_descriptor->mder_encoder(type_descriptor, + struct_ptr, /* Pointer to the destination structure */ + 0, 0, encode_to_buffer_cb, &arg); + if(ec.encoded != -1) { + assert(ec.encoded == (ssize_t)(buffer_size - arg.left)); + /* Return the encoded contents size */ + } + return ec; } From 43b4a454b661de25721e89f782d9e62b5b21e100 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Tue, 16 Mar 2010 19:56:22 +0100 Subject: [PATCH 1408/1469] Added mder contraint value in asn_TYPE_descriptor_t. --- libasn1compiler/asn1c_C.c | 10 ++++------ skeletons/BIT_STRING.c | 4 +++- skeletons/INTEGER.c | 4 +++- skeletons/NULL.c | 13 ++++++++++++- skeletons/NULL.h | 2 ++ skeletons/NativeEnumerated.c | 4 +++- skeletons/NativeInteger.c | 6 ++++-- skeletons/NativeInteger.h | 1 + skeletons/OCTET_STRING.c | 4 +++- skeletons/constr_TYPE.h | 2 +- 10 files changed, 36 insertions(+), 14 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index cb8246405..e3280d5f5 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -2614,13 +2614,11 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ } /* MDER Contraints */ - if (mder_constr) { - OUT("/* Include next field in asn_TYPE_descriptor_t */\n"); - OUT("&asn_MDER_type_%s_constr_%d\t/* type: asn_mder_contraints_t */\n", - p, expr->_type_unique_index); - } else { + if (mder_constr) + OUT("&asn_MDER_type_%s_constr_%d\n", + p, expr->_type_unique_index); + else OUT("0\t/* No MDER restricted type */\n"); - } INDENT(-1); OUT("};\n"); diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index df0a63a41..7a1bdff48 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -1,5 +1,6 @@ /*- * Copyright (c) 2010 Jose Antonio Santos-Cadenas . + * Copyright (c) 2010 Santiago Carot-Nemesio * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ @@ -40,7 +41,8 @@ asn_TYPE_descriptor_t asn_DEF_BIT_STRING = { / sizeof(asn_DEF_BIT_STRING_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ - &asn_DEF_BIT_STRING_specs + &asn_DEF_BIT_STRING_specs, + 0 /* MDER contraints (defined by asn1c compiler) */ }; /* diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index eda9dbfa7..5507c5f92 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -1,5 +1,6 @@ /*- * Copyright (c) 2003, 2004, 2005, 2006, 2007 Lev Walkin . + * Copyright (c) 2010 Santiago Carot-Nemesio * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ @@ -34,7 +35,8 @@ asn_TYPE_descriptor_t asn_DEF_INTEGER = { sizeof(asn_DEF_INTEGER_tags) / sizeof(asn_DEF_INTEGER_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ - 0 /* No specifics */ + 0, /* No specifics */ + 0 /* MDER contraints (defined by asn1c compiler) */ }; diff --git a/skeletons/NULL.c b/skeletons/NULL.c index 6d3316f1c..d71f426c0 100644 --- a/skeletons/NULL.c +++ b/skeletons/NULL.c @@ -21,6 +21,7 @@ asn_TYPE_descriptor_t asn_DEF_NULL = { asn_generic_no_constraint, BOOLEAN_decode_ber, /* Implemented in terms of BOOLEAN */ NULL_encode_der, /* Special handling of DER encoding */ + NULL_encode_mder, NULL_decode_xer, NULL_encode_xer, NULL_decode_uper, /* Unaligned PER decoder */ @@ -32,9 +33,19 @@ asn_TYPE_descriptor_t asn_DEF_NULL = { sizeof(asn_DEF_NULL_tags) / sizeof(asn_DEF_NULL_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ - 0 /* No specifics */ + 0, /* No specifics */ + 0 /* MDER contraints (defined by asn1c compiler) */ }; +asn_enc_rval_t +NULL_encode_mder(asn_TYPE_descriptor_t *td, void *ptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + + printf("TODO: Encode MDER NULL"); + _ASN_ENCODE_FAILED; +} + asn_enc_rval_t NULL_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, diff --git a/skeletons/NULL.h b/skeletons/NULL.h index 131e77592..55aced96b 100644 --- a/skeletons/NULL.h +++ b/skeletons/NULL.h @@ -1,5 +1,6 @@ /*- * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Copyright (c) 2010 Santiago Carot-Nemesio * Redistribution and modifications are permitted subject to BSD license. */ #ifndef ASN_TYPE_NULL_H @@ -21,6 +22,7 @@ extern asn_TYPE_descriptor_t asn_DEF_NULL; asn_struct_print_f NULL_print; der_type_encoder_f NULL_encode_der; +mder_type_encoder_f NULL_encode_mder; xer_type_decoder_f NULL_decode_xer; xer_type_encoder_f NULL_encode_xer; per_type_decoder_f NULL_decode_uper; diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c index a5bb2deb8..8abd9de06 100644 --- a/skeletons/NativeEnumerated.c +++ b/skeletons/NativeEnumerated.c @@ -1,5 +1,6 @@ /*- * Copyright (c) 2010 Jose Antonio Santos-Cadenas . + * Copyright (c) 2010 Santiago Carot-Nemesio * Copyright (c) 2004, 2007 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ @@ -39,7 +40,8 @@ asn_TYPE_descriptor_t asn_DEF_NativeEnumerated = { sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ - 0 /* No specifics */ + 0, /* No specifics */ + 0 /* MDER contraints (defined by asn1c compiler) */ }; asn_enc_rval_t diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index 8f9fed26b..b67e3a667 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -1,5 +1,6 @@ -/*- +/* * Copyright (c) 2004, 2005, 2006 Lev Walkin . + * Copyright (c) 2010 Santiago Carot-Nemesio * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ @@ -39,7 +40,8 @@ asn_TYPE_descriptor_t asn_DEF_NativeInteger = { sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ - 0 /* No specifics */ + 0, /* No specifics */ + 0 /* MDER contraints (defined by asn1c compiler) */ }; /* diff --git a/skeletons/NativeInteger.h b/skeletons/NativeInteger.h index 1b60f4d3f..f635993f9 100644 --- a/skeletons/NativeInteger.h +++ b/skeletons/NativeInteger.h @@ -1,5 +1,6 @@ /*- * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Copyright (c) 2010 Santiago Carot-Nemesio * Redistribution and modifications are permitted subject to BSD license. */ /* diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 766b6bcd7..a7c8a5997 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -1,5 +1,6 @@ /*- * Copyright (c) 2010 Jose Antonio Santos-Cadenas . + * Copyright (c) 2010 Santiago Carot-Nemesio * Copyright (c) 2003, 2004, 2005, 2006 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. @@ -47,7 +48,8 @@ asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { / sizeof(asn_DEF_OCTET_STRING_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ - &asn_DEF_OCTET_STRING_specs + &asn_DEF_OCTET_STRING_specs, + 0 /* MDER contraints (defined by asn1c compiler) */ }; #undef _CH_PHASE diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index 298c7b36f..659c945e8 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -132,7 +132,7 @@ typedef struct asn_TYPE_descriptor_s { void *specifics; /* mder constraints */ - asn_mder_contraints_t mder_constraints; /* MDER compiled constraints */ + asn_mder_contraints_t mder_constraints; } asn_TYPE_descriptor_t; /* From 504d96e67f37e4b78167640c6fbd60cfb9aab1dc Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Tue, 16 Mar 2010 20:34:41 +0100 Subject: [PATCH 1409/1469] fixed bug generating mder code. Checking type before coding restricted integer mder subtype. --- libasn1compiler/asn1c_C.c | 9 ++++++--- skeletons/INTEGER.c | 7 +++++-- skeletons/NativeInteger.c | 8 -------- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index e3280d5f5..122db3985 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -2436,7 +2436,8 @@ emit_member_MDER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { ct = expr->combined_constraints; r_value=asn1constraint_compute_PER_range(etype, ct, ACT_EL_RANGE,0,0,0); if (!r_value) { - OUT("INVALID;\n"); + OUT("INT_INVALID;\n"); + OUT("\n"); return 1; } else if (r_value->left.value == 0) { /* Unsigned Integer */ @@ -2447,7 +2448,8 @@ emit_member_MDER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { else if (r_value->right.value == 4294967295UL) OUT("INT_U32;\n"); else - OUT("INVALID;\n"); + OUT("INT_INVALID;\n"); + OUT("\n"); return 1; } /* Check signed integer */ @@ -2458,7 +2460,8 @@ emit_member_MDER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { else if ((r_value->left.value == (-2147483647L - 1)) && (r_value->right.value == 2147483647L)) OUT("INT_I32;\n"); else - OUT("INVALID;\n"); + OUT("INT_INVALID;\n"); + OUT("\n"); return 1; default: return 0; diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 5507c5f92..6161bebf6 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -48,12 +48,15 @@ INTEGER_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { INTEGER_t *st = (INTEGER_t *)sptr; + mder_restricted_int *rint; int size, shift; asn_enc_rval_t r; - GET_INT_SIZE(*(mder_restricted_int *)td->mder_constraints, size); + rint = (mder_restricted_int *)td->mder_constraints; + if (*rint == INT_INVALID) + _ASN_ENCODE_FAILED; - printf("Implement MDER Integer\n"); + GET_INT_SIZE(*rint, size); if (!st->buf) goto end; diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index b67e3a667..b245567bf 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -182,16 +182,8 @@ NativeInteger_encode_mder(asn_TYPE_descriptor_t *sd, void *ptr, unsigned long native = *(unsigned long *)ptr; /* Disable sign ext. */ asn_enc_rval_t erval; INTEGER_t tmp; - int i; -// printf("name: %s\n", sd->name); -// printf("xml_tag: %s\n", sd->xml_tag); -// printf("specific %p\n", sd->specifics); _PREPARE_INTEGER_T(tmp,native); -// printf("INTEGER len %d\n", tmp.size); -// for (i=0; i Date: Wed, 17 Mar 2010 21:18:33 +0100 Subject: [PATCH 1410/1469] Added initial support for restricted BIT STRING types for MDER --- libasn1compiler/asn1c_C.c | 29 +++++++++++++++++++++++------ skeletons/mder_support.h | 2 +- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 122db3985..cce5cd4d5 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -2432,13 +2432,12 @@ emit_member_MDER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { OUT("\n"); OUT("static mder_restricted_int " "asn_MDER_%s_%s_constr_%d = ", - pfx, p, expr->_type_unique_index); + pfx, p, expr->_type_unique_index); ct = expr->combined_constraints; r_value=asn1constraint_compute_PER_range(etype, ct, ACT_EL_RANGE,0,0,0); if (!r_value) { OUT("INT_INVALID;\n"); - OUT("\n"); - return 1; + break; } else if (r_value->left.value == 0) { /* Unsigned Integer */ if (r_value->right.value == 255) @@ -2449,8 +2448,7 @@ emit_member_MDER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { OUT("INT_U32;\n"); else OUT("INT_INVALID;\n"); - OUT("\n"); - return 1; + break; } /* Check signed integer */ if ((r_value->left.value == -128) && (r_value->right.value == 127)) @@ -2461,11 +2459,30 @@ emit_member_MDER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { OUT("INT_I32;\n"); else OUT("INT_INVALID;\n"); + break; + case ASN_BASIC_BIT_STRING: OUT("\n"); - return 1; + OUT("static mder_restricted_bits " + "asn_MDER_%s_%s_constr_%d = ", + pfx, p, expr->_type_unique_index); + ct = expr->combined_constraints; + r_value=asn1constraint_compute_PER_range(etype, ct, ACT_CT_SIZE,0,0,0); + if (!r_value) + OUT("INT_INVALID;\n"); + else if (r_value->left.value == 8) + OUT("BITS_8;\n"); + else if (r_value->left.value == 16) + OUT("BITS_16;\n"); + else if (r_value->left.value == 32) + OUT("BITS_32;\n"); + else + OUT("BITS_INVALID;\n"); + break; default: return 0; } + OUT("\n"); + return 1; } /* diff --git a/skeletons/mder_support.h b/skeletons/mder_support.h index 2bde0c4aa..ead85839f 100644 --- a/skeletons/mder_support.h +++ b/skeletons/mder_support.h @@ -55,7 +55,7 @@ typedef enum { BITS_8 = 1, BITS_16 = 2, BITS_32 = 4 -} mder_restrincted_bits; +} mder_restricted_bits; /* * Pre-computed MDER Subtype constrint info (if is restricted type). From 20c30d5f34305bbe0fd46e5c673413a739768e56 Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Thu, 18 Mar 2010 21:27:29 +0100 Subject: [PATCH 1411/1469] Added infraestructura for decoding an integer. Warnnings solved. --- libasn1compiler/asn1c_C.c | 19 +++++++++++++++++-- skeletons/BIT_STRING.c | 1 + skeletons/INTEGER.c | 9 +++++++++ skeletons/INTEGER.h | 1 + skeletons/NativeEnumerated.c | 1 + skeletons/NativeInteger.c | 12 ++++++++++++ skeletons/NativeInteger.h | 1 + skeletons/OBJECT_IDENTIFIER.c | 2 ++ skeletons/OCTET_STRING.c | 11 ++++++++++- skeletons/OCTET_STRING.h | 1 + skeletons/RELATIVE-OID.c | 2 ++ skeletons/constr_TYPE.h | 3 ++- skeletons/file-dependencies | 1 + 13 files changed, 60 insertions(+), 4 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index cce5cd4d5..a634704c3 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1350,6 +1350,21 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("}\n"); OUT("\n"); + p = MKID(expr); + if(HIDE_INNER_DEFS) OUT("static "); + OUT("asn_dec_rval_t\n"); + OUT("%s", p); + if(HIDE_INNER_DEFS) OUT("_%d", expr->_type_unique_index); + OUT("_decode_mder(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,\n"); + INDENTED( + OUT("\tvoid **structure, const void *bufptr, size_t size, int tag_mode) {\n"); + OUT("%s_%d_inherit_TYPE_descriptor(td);\n", + p, expr->_type_unique_index); + OUT("return td->mder_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);\n"); + ); + OUT("}\n"); + OUT("\n"); + p = MKID(expr); if(HIDE_INNER_DEFS) OUT("static "); OUT("asn_dec_rval_t\n"); @@ -1429,7 +1444,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("asn_constr_check_f %s_constraint;\n", p); OUT("ber_type_decoder_f %s_decode_ber;\n", p); OUT("der_type_encoder_f %s_encode_der;\n", p); - OUT("/*mder_type_decoder_f %s_decode_mder;*/\n", p); + OUT("mder_type_decoder_f %s_decode_mder;\n", p); OUT("mder_type_encoder_f %s_encode_mder;\n", p); OUT("xer_type_decoder_f %s_decode_xer;\n", p); OUT("xer_type_encoder_f %s_encode_xer;\n", p); @@ -2538,7 +2553,7 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ FUNCREF(constraint); FUNCREF(decode_ber); FUNCREF(encode_der); - /* FUNCREF(decode_mder); */ + FUNCREF(decode_mder); FUNCREF(encode_mder); FUNCREF(decode_xer); FUNCREF(encode_xer); diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index 7a1bdff48..a6f87ae2f 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -27,6 +27,7 @@ asn_TYPE_descriptor_t asn_DEF_BIT_STRING = { BIT_STRING_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_decode_mder, OCTET_STRING_encode_mder, OCTET_STRING_decode_xer_binary, BIT_STRING_encode_xer, diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 6161bebf6..288484989 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -23,6 +23,7 @@ asn_TYPE_descriptor_t asn_DEF_INTEGER = { asn_generic_no_constraint, ber_decode_primitive, INTEGER_encode_der, + INTEGER_decode_mder, INTEGER_encode_mder, INTEGER_decode_xer, INTEGER_encode_xer, @@ -40,6 +41,14 @@ asn_TYPE_descriptor_t asn_DEF_INTEGER = { }; +asn_dec_rval_t +INTEGER_decode_mder(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, + void **sptr, const void *buf_ptr, size_t size, int tag_mode) { + ASN_DEBUG("TODO: implement INTEGER_decode_mder"); + _ASN_DECODE_FAILED; +} + /* * Encode INTEGER type using MDER. */ diff --git a/skeletons/INTEGER.h b/skeletons/INTEGER.h index 05a9b499e..faf02d77f 100644 --- a/skeletons/INTEGER.h +++ b/skeletons/INTEGER.h @@ -37,6 +37,7 @@ typedef struct asn_INTEGER_specifics_s { asn_struct_print_f INTEGER_print; ber_type_decoder_f INTEGER_decode_ber; der_type_encoder_f INTEGER_encode_der; +mder_type_decoder_f INTEGER_decode_mder; mder_type_encoder_f INTEGER_encode_mder; xer_type_decoder_f INTEGER_decode_xer; xer_type_encoder_f INTEGER_encode_xer; diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c index 8abd9de06..5c95455e5 100644 --- a/skeletons/NativeEnumerated.c +++ b/skeletons/NativeEnumerated.c @@ -28,6 +28,7 @@ asn_TYPE_descriptor_t asn_DEF_NativeEnumerated = { asn_generic_no_constraint, NativeInteger_decode_ber, NativeInteger_encode_der, + NativeInteger_decode_mder, NativeInteger_encode_mder, NativeInteger_decode_xer, NativeEnumerated_encode_xer, diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index b245567bf..afabbf743 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -28,6 +28,7 @@ asn_TYPE_descriptor_t asn_DEF_NativeInteger = { asn_generic_no_constraint, NativeInteger_decode_ber, NativeInteger_encode_der, + NativeInteger_decode_mder, NativeInteger_encode_mder, NativeInteger_decode_xer, NativeInteger_encode_xer, @@ -194,6 +195,17 @@ NativeInteger_encode_mder(asn_TYPE_descriptor_t *sd, void *ptr, return erval; } +/* + * Decode INTEGER type. + */ +asn_dec_rval_t +NativeInteger_decode_mder(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, + void **nint_ptr, const void *buf_ptr, size_t size, int tag_mode) { + ASN_DEBUG("TODO: implement NativeInteger_decode_mder"); + _ASN_DECODE_FAILED; +} + /* * Decode the chunk of XML text encoding INTEGER. */ diff --git a/skeletons/NativeInteger.h b/skeletons/NativeInteger.h index f635993f9..84c10f3db 100644 --- a/skeletons/NativeInteger.h +++ b/skeletons/NativeInteger.h @@ -26,6 +26,7 @@ asn_struct_free_f NativeInteger_free; asn_struct_print_f NativeInteger_print; ber_type_decoder_f NativeInteger_decode_ber; der_type_encoder_f NativeInteger_encode_der; +mder_type_decoder_f NativeInteger_decode_mder; mder_type_encoder_f NativeInteger_encode_mder; xer_type_decoder_f NativeInteger_decode_xer; xer_type_encoder_f NativeInteger_encode_xer; diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index 0d7043e6b..61f558deb 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -22,6 +22,8 @@ asn_TYPE_descriptor_t asn_DEF_OBJECT_IDENTIFIER = { OBJECT_IDENTIFIER_constraint, ber_decode_primitive, der_encode_primitive, + 0, /* TODO insert mder encoder */ + 0, /* TODO insert mder decoder */ OBJECT_IDENTIFIER_decode_xer, OBJECT_IDENTIFIER_encode_xer, OCTET_STRING_decode_uper, diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index a7c8a5997..5d0f83bc0 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -34,6 +34,7 @@ asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { asn_generic_no_constraint, OCTET_STRING_decode_ber, OCTET_STRING_encode_der, + OCTET_STRING_decode_mder, OCTET_STRING_encode_mder, OCTET_STRING_decode_xer_hex, OCTET_STRING_encode_xer, @@ -580,12 +581,20 @@ OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *sptr, _ASN_ENCODE_FAILED; } +asn_dec_rval_t +OCTET_STRING_decode_mder(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, + void **sptr, const void *buf_ptr, size_t size, int tag_mode) { + ASN_DEBUG("TODO: implement OCTET_STRING_decode_mder"); + _ASN_DECODE_FAILED; +} + asn_enc_rval_t OCTET_STRING_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - ASN_DEBUG("TODO: implement this"); + ASN_DEBUG("TODO: implement OCTET_STRING_encode_mder"); _ASN_ENCODE_FAILED; } diff --git a/skeletons/OCTET_STRING.h b/skeletons/OCTET_STRING.h index 984849b71..0efc9577d 100644 --- a/skeletons/OCTET_STRING.h +++ b/skeletons/OCTET_STRING.h @@ -26,6 +26,7 @@ asn_struct_print_f OCTET_STRING_print; asn_struct_print_f OCTET_STRING_print_utf8; ber_type_decoder_f OCTET_STRING_decode_ber; der_type_encoder_f OCTET_STRING_encode_der; +mder_type_decoder_f OCTET_STRING_decode_mder; mder_type_encoder_f OCTET_STRING_encode_mder; xer_type_decoder_f OCTET_STRING_decode_xer_hex; /* Hexadecimal */ xer_type_decoder_f OCTET_STRING_decode_xer_binary; /* 01010111010 */ diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index 983fc094d..4cf946023 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -24,6 +24,8 @@ asn_TYPE_descriptor_t asn_DEF_RELATIVE_OID = { asn_generic_no_constraint, ber_decode_primitive, der_encode_primitive, + 0, /* TODO insert mder encoder */ + 0, /* TODO insert mder decoder */ RELATIVE_OID_decode_xer, RELATIVE_OID_encode_xer, OCTET_STRING_decode_uper, diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index 659c945e8..29d11aab9 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -39,7 +39,7 @@ typedef struct asn_struct_ctx_s { #include /* Basic Encoding Rules decoder */ #include /* Distinguished Encoding Rules encoder */ #include /* Medical Device Encoding Rules encoder */ -// #include /* Medical Device Encoding Rules decoder */ +#include /* Medical Device Encoding Rules decoder */ #include /* Decoder of XER (XML, text) */ #include /* Encoder into XER (XML, text) */ #include /* Packet Encoding Rules decoder */ @@ -98,6 +98,7 @@ typedef struct asn_TYPE_descriptor_s { asn_constr_check_f *check_constraints; /* Constraints validator */ ber_type_decoder_f *ber_decoder; /* Generic BER decoder */ der_type_encoder_f *der_encoder; /* Canonical DER encoder */ + mder_type_decoder_f *mder_decoder; /* MDER decoder */ mder_type_encoder_f *mder_encoder; /* MDER encoder */ xer_type_decoder_f *xer_decoder; /* Generic XER decoder */ xer_type_encoder_f *xer_encoder; /* [Canonical] XER encoder */ diff --git a/skeletons/file-dependencies b/skeletons/file-dependencies index f9b6214c6..41f87f476 100644 --- a/skeletons/file-dependencies +++ b/skeletons/file-dependencies @@ -55,6 +55,7 @@ ber_decoder.h ber_decoder.c # BER decoder support code der_encoder.h der_encoder.c # DER encoder support code mder_support.h # MDER restricted types mder_encoder.h mder_encoder.c # MDER encoder support code +mder_decoder.h mder_decoder.c # MDER decoder support code constr_TYPE.h constr_TYPE.c # Description of a type constraints.h constraints.c # Subtype constraints support xer_support.h xer_support.c # XML parsing From 7a28dd71618cf98fd6f1762e4ae1a473b62384ea Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Fri, 19 Mar 2010 12:06:21 +0100 Subject: [PATCH 1412/1469] Changed copyright --- skeletons/OCTET_STRING.c | 2 +- skeletons/OCTET_STRING.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 5d0f83bc0..a06fdbe70 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -1,6 +1,6 @@ /*- * Copyright (c) 2010 Jose Antonio Santos-Cadenas . - * Copyright (c) 2010 Santiago Carot-Nemesio + * Copyright (c) 2010 Santiago Carot-Nemesio . * Copyright (c) 2003, 2004, 2005, 2006 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. diff --git a/skeletons/OCTET_STRING.h b/skeletons/OCTET_STRING.h index 0efc9577d..2b1437d5c 100644 --- a/skeletons/OCTET_STRING.h +++ b/skeletons/OCTET_STRING.h @@ -1,5 +1,6 @@ /*- * Copyright (c) 2010 Jose Antonio Santos-Cadenas . + * Copyright (c) 2010 Santiago Carot-Nemesio . * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ From 8994f1d46c78abcfb00df9db3060af10d478308a Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Fri, 19 Mar 2010 15:57:33 +0100 Subject: [PATCH 1413/1469] First decode of a native integer(needs more checks) --- libasn1compiler/asn1c_C.c | 2 +- skeletons/INTEGER.c | 2 +- skeletons/NativeInteger.c | 55 ++++++++++++++++++++++++++++++++++++--- skeletons/mder_support.h | 15 +++++++++++ 4 files changed, 68 insertions(+), 6 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index a634704c3..e25cc95b5 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1239,7 +1239,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("td->print_struct = asn_DEF_%s.print_struct;\n", type_name); OUT("td->ber_decoder = asn_DEF_%s.ber_decoder;\n", type_name); OUT("td->der_encoder = asn_DEF_%s.der_encoder;\n", type_name); - OUT("/*td->mder_decoder = asn_DEF_%s.mder_decoder;*/\n", type_name); + OUT("td->mder_decoder = asn_DEF_%s.mder_decoder;\n", type_name); OUT("td->mder_encoder = asn_DEF_%s.mder_encoder;\n", type_name); OUT("td->xer_decoder = asn_DEF_%s.xer_decoder;\n", type_name); OUT("td->xer_encoder = asn_DEF_%s.xer_encoder;\n", type_name); diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 288484989..184fad159 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -591,7 +591,7 @@ INTEGER_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, (void)ilevel; (void)flags; - + if(!st || !st->buf) _ASN_ENCODE_FAILED; diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index afabbf743..cb9089819 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -131,7 +131,8 @@ NativeInteger_decode_ber(asn_codec_ctx_t *opt_codec_ctx, } #ifdef WORDS_BIGENDIAN /* Opportunistic optimization */ -#define _PREPARE_INTEGER_T(tmp,native) do { \ \ +#define _PREPARE_INTEGER_T(tmp,native) do { \ + \ tmp.buf = (uint8_t *)&native; \ tmp.size = sizeof(native); \ } while(0) @@ -202,8 +203,54 @@ asn_dec_rval_t NativeInteger_decode_mder(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **nint_ptr, const void *buf_ptr, size_t size, int tag_mode) { - ASN_DEBUG("TODO: implement NativeInteger_decode_mder"); - _ASN_DECODE_FAILED; + + asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; + long *native = (long *)*nint_ptr; + asn_dec_rval_t rval; + mder_restricted_int *rint; + int length, unsig; + INTEGER_t tmp; + union { + const void *constbuf; + void *nonconstbuf; + } unconst_buf; + long l; + + rint = (mder_restricted_int *)td->mder_constraints; + if (*rint == INT_INVALID) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + + GET_INT_SIZE(*rint, length); + GET_INT_UNSIGNED(*rint, unsig); + + if(!native) { + native = (long *)(*nint_ptr = CALLOC(1, sizeof(*native))); + if(native == NULL) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + } + + unconst_buf.constbuf = buf_ptr; + tmp.buf = (uint8_t *)unconst_buf.nonconstbuf; + tmp.size = length; + + if((unsig) ? asn_INTEGER2ulong(&tmp, &l) : asn_INTEGER2long(&tmp, &l)) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + + *native = l; + + rval.code = RC_OK; + rval.consumed = length; + + return rval; } /* @@ -225,7 +272,7 @@ NativeInteger_decode_xer(asn_codec_ctx_t *opt_codec_ctx, } memset(&st, 0, sizeof(st)); - rval = INTEGER_decode_xer(opt_codec_ctx, td, &st_ptr, + rval = INTEGER_decode_xer(opt_codec_ctx, td, &st_ptr, opt_mname, buf_ptr, size); if(rval.code == RC_OK) { long l; diff --git a/skeletons/mder_support.h b/skeletons/mder_support.h index ead85839f..2898d380b 100644 --- a/skeletons/mder_support.h +++ b/skeletons/mder_support.h @@ -46,6 +46,21 @@ typedef enum { } \ } while (0) +#define GET_INT_UNSIGNED(_int,_unsign) do { \ + switch (_int) { \ + case INT_U8: \ + case INT_U16: \ + case INT_U32: \ + _unsign = 1; \ + break; \ + case INT_I8: \ + case INT_I16: \ + case INT_I32: \ + default: \ + _unsign = 0; \ + } \ +} while (0) + /* * Size constraints shall be used for all BIT STRING data types to define the * value range of the bit string. From 5e434faa8cbf4eb9aa469c19b44978ec23275cc9 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Sat, 20 Mar 2010 09:40:22 +0100 Subject: [PATCH 1414/1469] added initial support for encoding of BIT STRING restricted types * Add more checks --- skeletons/INTEGER.c | 23 +++++++++++------------ skeletons/OCTET_STRING.c | 24 +++++++++++++++++++++++- skeletons/asn_codecs_prim.c | 5 ++++- skeletons/mder_encoder.c | 2 +- 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 184fad159..1a8d19cc1 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -67,20 +67,19 @@ INTEGER_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, GET_INT_SIZE(*rint, size); - if (!st->buf) - goto end; - shift = st->size - size; - if(shift) { - uint8_t *nb = st->buf; - uint8_t *end, *buf = st->buf + shift; - st->size -= shift; /* New size, minus bad bytes */ - end = nb + st->size; - - for(; nb < end; nb++, buf++) - *nb = *buf; + if (st->buf) { + shift = st->size - size; + if(shift) { + uint8_t *nb = st->buf; + uint8_t *end, *buf = st->buf + shift; + st->size -= shift; /* New size, minus bad bytes */ + end = nb + st->size; + + for(; nb < end; nb++, buf++) + *nb = *buf; + } } -end: return mder_encode_primitive(td, sptr, tag_mode, tag, cb, app_key); } diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index a06fdbe70..9552e641c 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -594,7 +594,29 @@ OCTET_STRING_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - ASN_DEBUG("TODO: implement OCTET_STRING_encode_mder"); + asn_enc_rval_t er; + BIT_STRING_t *st = (BIT_STRING_t *)sptr; + mder_restricted_bits *rbits; + ssize_t size; + + rbits = (mder_restricted_bits *)td->mder_constraints; + if (!rbits) + /* OCTET STRING */ + size = st->size; + else if (*rbits != INT_INVALID) + /* Restricted BIT STRING */ + size = (ssize_t) *rbits; + else + _ASN_ENCODE_FAILED; + + er.encoded = size; + + if (cb) + /* Invoke callback for the main part of the buffer */ + _ASN_CALLBACK(st->buf, size); + + _ASN_ENCODED_OK(er); +cb_failed: _ASN_ENCODE_FAILED; } diff --git a/skeletons/asn_codecs_prim.c b/skeletons/asn_codecs_prim.c index c6e9a9285..fdaea7ebc 100644 --- a/skeletons/asn_codecs_prim.c +++ b/skeletons/asn_codecs_prim.c @@ -1,5 +1,8 @@ /*- - * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Copyright (c) 2003, 2004 Lev Walkin . + * Copyright (c) 2010 Santiago Carot-Nemesio + * Copyright (c) 2010 Jose Antonio Santos-Cadenas + * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include diff --git a/skeletons/mder_encoder.c b/skeletons/mder_encoder.c index 275c3defc..a5b65c4d7 100644 --- a/skeletons/mder_encoder.c +++ b/skeletons/mder_encoder.c @@ -21,7 +21,7 @@ asn_enc_rval_t mder_encode(struct asn_TYPE_descriptor_s *type_descriptor, } /* -* Argument type and callback necessary for der_encode_to_buffer(). +* Argument type and callback necessary for mder_encode_to_buffer(). */ typedef struct enc_to_buf_arg { void *buffer; From 60f191574be4cd0deaf68669a54330d04dcc65ca Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Sat, 20 Mar 2010 16:42:49 +0100 Subject: [PATCH 1415/1469] Adding initial support to code OCTET STRING type with MDER --- libasn1compiler/asn1c_C.c | 34 +++++++++++++++++++++++++--------- skeletons/BIT_STRING.c | 27 ++++++++++++++++++++++++++- skeletons/BIT_STRING.h | 6 +++++- skeletons/OCTET_STRING.c | 22 ---------------------- skeletons/mder_support.h | 7 ++++++- 5 files changed, 62 insertions(+), 34 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index e25cc95b5..6f30d0065 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -2448,12 +2448,13 @@ emit_member_MDER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { OUT("static mder_restricted_int " "asn_MDER_%s_%s_constr_%d = ", pfx, p, expr->_type_unique_index); - ct = expr->combined_constraints; - r_value=asn1constraint_compute_PER_range(etype, ct, ACT_EL_RANGE,0,0,0); - if (!r_value) { + if (!expr->constraints) { OUT("INT_INVALID;\n"); break; - } else if (r_value->left.value == 0) { + } + ct = expr->combined_constraints; + r_value = asn1constraint_compute_PER_range(etype, ct, ACT_EL_RANGE,0,0,0); + if (r_value->left.value == 0) { /* Unsigned Integer */ if (r_value->right.value == 255) OUT("INT_U8;\n"); @@ -2477,14 +2478,16 @@ emit_member_MDER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { break; case ASN_BASIC_BIT_STRING: OUT("\n"); - OUT("static mder_restricted_bits " + OUT("static mder_restricted_bit_str " "asn_MDER_%s_%s_constr_%d = ", pfx, p, expr->_type_unique_index); + if (!expr->constraints) { + OUT("BITS_INVALID;\n"); + break; + } ct = expr->combined_constraints; - r_value=asn1constraint_compute_PER_range(etype, ct, ACT_CT_SIZE,0,0,0); - if (!r_value) - OUT("INT_INVALID;\n"); - else if (r_value->left.value == 8) + r_value = asn1constraint_compute_PER_range(etype, ct, ACT_CT_SIZE,0,0,0); + if (r_value->left.value == 8) OUT("BITS_8;\n"); else if (r_value->left.value == 16) OUT("BITS_16;\n"); @@ -2493,6 +2496,19 @@ emit_member_MDER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { else OUT("BITS_INVALID;\n"); break; + case ASN_BASIC_OCTET_STRING: + OUT("\n"); + OUT("static mder_octet_str " + "asn_MDER_%s_%s_constr_%d = ", + pfx, p, expr->_type_unique_index); + if (!expr->constraints) { + OUT("VARIABLE_OCTET_STRING;\n"); + break; + } + ct = expr->combined_constraints; + r_value = asn1constraint_compute_PER_range(etype, ct, ACT_CT_SIZE,0,0,0); + OUT("FIXED_OCTET_STRING;\n"); + break; default: return 0; } diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index a6f87ae2f..2a6d278b8 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -28,7 +28,7 @@ asn_TYPE_descriptor_t asn_DEF_BIT_STRING = { OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ OCTET_STRING_decode_mder, - OCTET_STRING_encode_mder, + BIT_STRING_encode_mder, OCTET_STRING_decode_xer_binary, BIT_STRING_encode_xer, OCTET_STRING_decode_uper, /* Unaligned PER decoder */ @@ -77,6 +77,31 @@ static char *_bit_pattern[16] = { "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111" }; +asn_enc_rval_t +BIT_STRING_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) +{ + asn_enc_rval_t er; + BIT_STRING_t *st = (BIT_STRING_t *)sptr; + mder_restricted_bit_str *rbs; + ssize_t size; + + rbs = (mder_restricted_bit_str *)td->mder_constraints; + if (*rbs == INT_INVALID) + _ASN_ENCODE_FAILED; + + er.encoded = (ssize_t) *rbs; + + if (cb) + /* Invoke callback for the main part of the buffer */ + _ASN_CALLBACK(st->buf, (ssize_t) *rbs); + + _ASN_ENCODED_OK(er); +cb_failed: + _ASN_ENCODE_FAILED; +} + asn_enc_rval_t BIT_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, diff --git a/skeletons/BIT_STRING.h b/skeletons/BIT_STRING.h index 732e878bc..556531c11 100644 --- a/skeletons/BIT_STRING.h +++ b/skeletons/BIT_STRING.h @@ -1,5 +1,8 @@ /*- - * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Copyright (c) 2003 Lev Walkin . + * Copyright (c) 2010 Santiago Carot-Nemesio . + * Copyright (c) 2010 Jose Antonio Santos-Cadenas . + * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _BIT_STRING_H_ @@ -24,6 +27,7 @@ extern asn_TYPE_descriptor_t asn_DEF_BIT_STRING; asn_struct_print_f BIT_STRING_print; /* Human-readable output */ asn_constr_check_f BIT_STRING_constraint; +mder_type_encoder_f BIT_STRING_encode_mder; xer_type_encoder_f BIT_STRING_encode_xer; #ifdef __cplusplus diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 9552e641c..52d7ca298 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -594,28 +594,6 @@ OCTET_STRING_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - asn_enc_rval_t er; - BIT_STRING_t *st = (BIT_STRING_t *)sptr; - mder_restricted_bits *rbits; - ssize_t size; - - rbits = (mder_restricted_bits *)td->mder_constraints; - if (!rbits) - /* OCTET STRING */ - size = st->size; - else if (*rbits != INT_INVALID) - /* Restricted BIT STRING */ - size = (ssize_t) *rbits; - else - _ASN_ENCODE_FAILED; - - er.encoded = size; - - if (cb) - /* Invoke callback for the main part of the buffer */ - _ASN_CALLBACK(st->buf, size); - - _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } diff --git a/skeletons/mder_support.h b/skeletons/mder_support.h index 2898d380b..b7aea899b 100644 --- a/skeletons/mder_support.h +++ b/skeletons/mder_support.h @@ -70,7 +70,12 @@ typedef enum { BITS_8 = 1, BITS_16 = 2, BITS_32 = 4 -} mder_restricted_bits; +} mder_restricted_bit_str; + +typedef enum { + FIXED_OCTET_STRING, + VARIABLE_OCTET_STRING +} mder_octet_str; /* * Pre-computed MDER Subtype constrint info (if is restricted type). From 157d46cc2cdc579ae1ef0c56538080f6c823cad6 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Sat, 20 Mar 2010 20:59:28 +0100 Subject: [PATCH 1416/1469] Added support for ending od fixed OCTET STRINGs with MDER --- skeletons/BIT_STRING.c | 4 +++- skeletons/OCTET_STRING.c | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index 2a6d278b8..5c9537c0c 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -85,7 +85,9 @@ BIT_STRING_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, asn_enc_rval_t er; BIT_STRING_t *st = (BIT_STRING_t *)sptr; mder_restricted_bit_str *rbs; - ssize_t size; + + if(!st || (!st->buf && st->size)) + _ASN_ENCODE_FAILED; rbs = (mder_restricted_bit_str *)td->mder_constraints; if (*rbs == INT_INVALID) diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 52d7ca298..d674e1fa1 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -594,6 +594,27 @@ OCTET_STRING_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + mder_octet_str *oct; + asn_enc_rval_t er; + ssize_t size = 0; + + if(!st || (!st->buf && st->size)) + _ASN_ENCODE_FAILED; + + oct = (mder_octet_str *)td->mder_constraints; + if (*oct == VARIABLE_OCTET_STRING) { + /* TO DO: Encode length */ + size = 2; + _ASN_ENCODE_FAILED; + } + size += st->size; + if (cb) + /* Invoke callback for the main part of the buffer */ + _ASN_CALLBACK(st->buf, size); + + er.encoded = size; + _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } From e7c8e1d4a755389b8f7b81c86aa1d7a9d670a6bd Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Sat, 20 Mar 2010 21:05:53 +0100 Subject: [PATCH 1417/1469] Added aditional checks in BIT STRINGs and OCTET STRINGs --- skeletons/BIT_STRING.c | 9 ++++----- skeletons/OCTET_STRING.c | 7 +++---- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index 5c9537c0c..c6de3a47d 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -84,13 +84,12 @@ BIT_STRING_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, { asn_enc_rval_t er; BIT_STRING_t *st = (BIT_STRING_t *)sptr; - mder_restricted_bit_str *rbs; + mder_restricted_bit_str *rbs = (mder_restricted_bit_str *)td->mder_constraints;; - if(!st || (!st->buf && st->size)) + if (!rbs || !st || (!st->buf && st->size)) _ASN_ENCODE_FAILED; - - rbs = (mder_restricted_bit_str *)td->mder_constraints; - if (*rbs == INT_INVALID) + + if (!rbs || (*rbs == INT_INVALID)) _ASN_ENCODE_FAILED; er.encoded = (ssize_t) *rbs; diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index d674e1fa1..c90706a93 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -595,14 +595,13 @@ OCTET_STRING_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, asn_app_consume_bytes_f *cb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; - mder_octet_str *oct; + mder_octet_str *oct = (mder_octet_str *)td->mder_constraints; asn_enc_rval_t er; ssize_t size = 0; - if(!st || (!st->buf && st->size)) + if (!oct || !st || (!st->buf && st->size)) _ASN_ENCODE_FAILED; - - oct = (mder_octet_str *)td->mder_constraints; + if (*oct == VARIABLE_OCTET_STRING) { /* TO DO: Encode length */ size = 2; From 233c07d0177f1c60d72a64697130ba6200ac562b Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Sun, 21 Mar 2010 00:18:05 +0100 Subject: [PATCH 1418/1469] Added INTEGER decodification and used it by nativeinteger --- skeletons/INTEGER.c | 38 ++++++++++++++++++++++++++++++++++++-- skeletons/NativeInteger.c | 38 ++++++++++++++------------------------ 2 files changed, 50 insertions(+), 26 deletions(-) diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 1a8d19cc1..2412033c6 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -45,8 +45,42 @@ asn_dec_rval_t INTEGER_decode_mder(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buf_ptr, size_t size, int tag_mode) { - ASN_DEBUG("TODO: implement INTEGER_decode_mder"); - _ASN_DECODE_FAILED; + + INTEGER_t *integer = (INTEGER_t *)*sptr; + asn_dec_rval_t rval; + mder_restricted_int *rint; + int length; + union { + const void *constbuf; + void *nonconstbuf; + } unconst_buf; + + rint = (mder_restricted_int *)td->mder_constraints; + if (*rint == INT_INVALID) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + + GET_INT_SIZE(*rint, length); + + if(!integer) { + integer = (INTEGER_t *)(*sptr = CALLOC(1, sizeof(*integer))); + if(integer == NULL) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + } + + unconst_buf.constbuf = buf_ptr; + integer->buf = (uint8_t *)unconst_buf.nonconstbuf; + integer->size = length; + + rval.code = RC_OK; + rval.consumed = length; + + return rval; } /* diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index cb9089819..fafc649b0 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -204,27 +204,12 @@ NativeInteger_decode_mder(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **nint_ptr, const void *buf_ptr, size_t size, int tag_mode) { - asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; long *native = (long *)*nint_ptr; asn_dec_rval_t rval; mder_restricted_int *rint; - int length, unsig; - INTEGER_t tmp; - union { - const void *constbuf; - void *nonconstbuf; - } unconst_buf; + INTEGER_t *tmp = NULL; long l; - - rint = (mder_restricted_int *)td->mder_constraints; - if (*rint == INT_INVALID) { - rval.code = RC_FAIL; - rval.consumed = 0; - return rval; - } - - GET_INT_SIZE(*rint, length); - GET_INT_UNSIGNED(*rint, unsig); + int unsig; if(!native) { native = (long *)(*nint_ptr = CALLOC(1, sizeof(*native))); @@ -235,21 +220,26 @@ NativeInteger_decode_mder(asn_codec_ctx_t *opt_codec_ctx, } } - unconst_buf.constbuf = buf_ptr; - tmp.buf = (uint8_t *)unconst_buf.nonconstbuf; - tmp.size = length; + rval = INTEGER_decode_mder(opt_codec_ctx, td, (void **)&tmp, + buf_ptr, size, tag_mode); + GET_INT_UNSIGNED(*rint, unsig); - if((unsig) ? asn_INTEGER2ulong(&tmp, &l) : asn_INTEGER2long(&tmp, &l)) { + if (rval.code != RC_OK){ + return rval; + } + + rint = (mder_restricted_int *)td->mder_constraints; + GET_INT_UNSIGNED(*rint, unsig); + + if((unsig) ? asn_INTEGER2ulong(tmp, &l) : asn_INTEGER2long(tmp, &l)) { rval.code = RC_FAIL; rval.consumed = 0; return rval; } + free(tmp); *native = l; - rval.code = RC_OK; - rval.consumed = length; - return rval; } From 0f428c67479f891f7e2ad493a69ffd6099246e1b Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Sun, 21 Mar 2010 12:47:34 +0100 Subject: [PATCH 1419/1469] added support for encoding of Variable octet string --- skeletons/OCTET_STRING.c | 14 ++++++-------- skeletons/mder_support.h | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index c90706a93..065def658 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -597,22 +597,20 @@ OCTET_STRING_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; mder_octet_str *oct = (mder_octet_str *)td->mder_constraints; asn_enc_rval_t er; - ssize_t size = 0; if (!oct || !st || (!st->buf && st->size)) _ASN_ENCODE_FAILED; - + + er.encoded = 0; if (*oct == VARIABLE_OCTET_STRING) { - /* TO DO: Encode length */ - size = 2; - _ASN_ENCODE_FAILED; + MDER_OUTPUT_INT_U16_LENGTH(st->size); + er.encoded += 2; } - size += st->size; if (cb) /* Invoke callback for the main part of the buffer */ - _ASN_CALLBACK(st->buf, size); + _ASN_CALLBACK(st->buf, st->size); - er.encoded = size; + er.encoded += st->size; _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; diff --git a/skeletons/mder_support.h b/skeletons/mder_support.h index b7aea899b..fe1160ff8 100644 --- a/skeletons/mder_support.h +++ b/skeletons/mder_support.h @@ -82,6 +82,28 @@ typedef enum { */ typedef void* asn_mder_contraints_t; +#ifdef WORDS_BIGENDIAN /* Opportunistic optimization */ +#define MDER_OUTPUT_INT_U16_LENGTH(len) do { \ + if ((len < 0) || (len > 65535)) \ + goto cb_failed; \ + if (cb) { \ + uint16_t aux = (uint16_t)len; \ + _ASN_CALLBACK((uint8_t *)&aux, 2); \ + } \ +} while (0) +#else /* Works even if WORDS_BIGENDIAN is not set where should've been */ +#define MDER_OUTPUT_INT_U16_LENGTH(len) do { \ + if ((len < 0) || (len > 65535)) \ + goto cb_failed; \ + if (cb) { \ + uint8_t lbuf[2]; /* length for variable O-S */ \ + lbuf[0] = (len >> 8) & 0xff; \ + lbuf[1] = len & 0xff; \ + _ASN_CALLBACK(lbuf, 2); \ + } \ +} while (0) +#endif + #ifdef __cplusplus } #endif From 1ed29dfb90aa3bf5ae9cbcbe8072cdfb51a8b836 Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Sun, 21 Mar 2010 13:08:20 +0100 Subject: [PATCH 1420/1469] Some checks in integer and coding style in bit_string --- skeletons/BIT_STRING.c | 4 ++-- skeletons/INTEGER.c | 4 ++-- skeletons/NativeInteger.c | 10 ++++++++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index c6de3a47d..dd7208ec3 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -84,11 +84,11 @@ BIT_STRING_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, { asn_enc_rval_t er; BIT_STRING_t *st = (BIT_STRING_t *)sptr; - mder_restricted_bit_str *rbs = (mder_restricted_bit_str *)td->mder_constraints;; + mder_restricted_bit_str *rbs = (mder_restricted_bit_str *)td->mder_constraints; if (!rbs || !st || (!st->buf && st->size)) _ASN_ENCODE_FAILED; - + if (!rbs || (*rbs == INT_INVALID)) _ASN_ENCODE_FAILED; diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 2412033c6..866c85517 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -56,7 +56,7 @@ INTEGER_decode_mder(asn_codec_ctx_t *opt_codec_ctx, } unconst_buf; rint = (mder_restricted_int *)td->mder_constraints; - if (*rint == INT_INVALID) { + if (!rint || *rint == INT_INVALID) { rval.code = RC_FAIL; rval.consumed = 0; return rval; @@ -96,7 +96,7 @@ INTEGER_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, asn_enc_rval_t r; rint = (mder_restricted_int *)td->mder_constraints; - if (*rint == INT_INVALID) + if (!rint || *rint == INT_INVALID) _ASN_ENCODE_FAILED; GET_INT_SIZE(*rint, size); diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index fafc649b0..91eb32195 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -211,6 +211,14 @@ NativeInteger_decode_mder(asn_codec_ctx_t *opt_codec_ctx, long l; int unsig; + rint = (mder_restricted_int *)td->mder_constraints; + if (!rint || *rint == INT_INVALID) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + + if(!native) { native = (long *)(*nint_ptr = CALLOC(1, sizeof(*native))); if(native == NULL) { @@ -222,13 +230,11 @@ NativeInteger_decode_mder(asn_codec_ctx_t *opt_codec_ctx, rval = INTEGER_decode_mder(opt_codec_ctx, td, (void **)&tmp, buf_ptr, size, tag_mode); - GET_INT_UNSIGNED(*rint, unsig); if (rval.code != RC_OK){ return rval; } - rint = (mder_restricted_int *)td->mder_constraints; GET_INT_UNSIGNED(*rint, unsig); if((unsig) ? asn_INTEGER2ulong(tmp, &l) : asn_INTEGER2long(tmp, &l)) { From c527eb7b9fd539b0c80fee220f6eda39db97c78d Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Sun, 21 Mar 2010 16:27:39 +0100 Subject: [PATCH 1421/1469] initial support for encode/decode of SEQUENCE types using MDER --- skeletons/constr_SEQUENCE.c | 26 +++++++++++++++++++++++++- skeletons/constr_SEQUENCE.h | 2 ++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index db3c92581..b221a9354 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -505,7 +505,6 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, RETURN(RC_OK); } - /* * The DER encoder of the SEQUENCE type. */ @@ -591,6 +590,31 @@ SEQUENCE_encode_der(asn_TYPE_descriptor_t *td, _ASN_ENCODED_OK(erval); } +/* + * The decoder of the SEQUENCE type. + */ +asn_dec_rval_t +SEQUENCE_decode_mder(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, + void **sptr, const void *buf_ptr, size_t size, int tag_mode) { + asn_dec_rval_t rval; + + printf("TODO: Implement MDER SEQUENCE encoder"); + _ASN_DECODE_FAILED; +} + +/* + * The MDER encoder of the SEQUENCE type. + */ +asn_enc_rval_t +SEQUENCE_encode_mder(asn_TYPE_descriptor_t *td, + void *sptr, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t rval; + + printf("TODO: Implement MDER SEQUENCE encoder"); + _ASN_ENCODE_FAILED; +} #undef XER_ADVANCE #define XER_ADVANCE(num_bytes) do { \ diff --git a/skeletons/constr_SEQUENCE.h b/skeletons/constr_SEQUENCE.h index 5f589d5c1..5a3fd5d3a 100644 --- a/skeletons/constr_SEQUENCE.h +++ b/skeletons/constr_SEQUENCE.h @@ -48,6 +48,8 @@ asn_struct_print_f SEQUENCE_print; asn_constr_check_f SEQUENCE_constraint; ber_type_decoder_f SEQUENCE_decode_ber; der_type_encoder_f SEQUENCE_encode_der; +mder_type_decoder_f SEQUENCE_decode_mder; +mder_type_encoder_f SEQUENCE_encode_mder; xer_type_decoder_f SEQUENCE_decode_xer; xer_type_encoder_f SEQUENCE_encode_xer; per_type_decoder_f SEQUENCE_decode_uper; From 839aebe5b9c4e8fed7d321eddd3296d0c67f7b59 Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Mon, 22 Mar 2010 09:11:06 +0100 Subject: [PATCH 1422/1469] Mder decoder --- skeletons/mder_decoder.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 skeletons/mder_decoder.c diff --git a/skeletons/mder_decoder.c b/skeletons/mder_decoder.c new file mode 100644 index 000000000..d42ce49fb --- /dev/null +++ b/skeletons/mder_decoder.c @@ -0,0 +1,40 @@ +/*- + * Copyright (c) 2010 Jose Antonio Santos-Cadenas + * Redistribution and modifications are permitted subject to BSD license. + */ +#include + +/* + * The MDER decoder of any type. + */ +asn_dec_rval_t +mder_decode(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *type_descriptor, + void **struct_ptr, const void *ptr, size_t size) { + asn_codec_ctx_t s_codec_ctx; + + /* + * Stack checker requires that the codec context + * must be allocated on the stack. + */ + if(opt_codec_ctx) { + if(opt_codec_ctx->max_stack_size) { + s_codec_ctx = *opt_codec_ctx; + opt_codec_ctx = &s_codec_ctx; + } + } else { + /* If context is not given, be security-conscious anyway */ + memset(&s_codec_ctx, 0, sizeof(s_codec_ctx)); + s_codec_ctx.max_stack_size = _ASN_DEFAULT_STACK_MAX; + opt_codec_ctx = &s_codec_ctx; + } + + /* + * Invoke type-specific decoder. + */ + return type_descriptor->mder_decoder(opt_codec_ctx, type_descriptor, + struct_ptr, /* Pointer to the destination structure */ + ptr, size, /* Buffer and its size */ + 0 /* Default tag mode is 0 */ + ); +} From b7aaa9ca7015018d6c28277eb351c40c4138d8b9 Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Thu, 25 Mar 2010 18:25:55 +0100 Subject: [PATCH 1423/1469] Octec string decode --- libasn1compiler/asn1c_C.c | 6 ++--- skeletons/OCTET_STRING.c | 46 ++++++++++++++++++++++++++++++++++----- skeletons/mder_support.h | 5 +++++ 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 6f30d0065..f103c14f2 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -599,7 +599,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { OUT("static asn_TYPE_member_t asn_MBR_%s_%d[] = {\n", MKID(expr), expr->_type_unique_index); - + elements = 0; INDENTED(TQ_FOR(v, &(expr->members), next) { if(v->expr_type == A1TC_EXTENSIBLE) { @@ -2502,12 +2502,12 @@ emit_member_MDER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { "asn_MDER_%s_%s_constr_%d = ", pfx, p, expr->_type_unique_index); if (!expr->constraints) { - OUT("VARIABLE_OCTET_STRING;\n"); + OUT("{ VARIABLE_OCTET_STRING, 0 };\n"); break; } ct = expr->combined_constraints; r_value = asn1constraint_compute_PER_range(etype, ct, ACT_CT_SIZE,0,0,0); - OUT("FIXED_OCTET_STRING;\n"); + OUT("{ FIXED_OCTET_STRING, %d };\n", r_value->left.value); break; default: return 0; diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 065def658..e55a6f3e0 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -146,7 +146,7 @@ OS__add_stack_el(struct _stack *st) { nel = (struct _stack_el *)CALLOC(1, sizeof(struct _stack_el)); if(nel == NULL) return NULL; - + if(st->tail) { /* Increase a subcontainment depth */ nel->cont_level = st->tail->cont_level + 1; @@ -585,8 +585,44 @@ asn_dec_rval_t OCTET_STRING_decode_mder(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buf_ptr, size_t size, int tag_mode) { - ASN_DEBUG("TODO: implement OCTET_STRING_decode_mder"); - _ASN_DECODE_FAILED; + + OCTET_STRING_t *st = (OCTET_STRING_t *)*sptr; + mder_octet_str *oct = (mder_octet_str *)td->mder_constraints; + asn_dec_rval_t rval; + char *data; + + if (!oct) + _ASN_DECODE_FAILED; + + /* + * Create the string if does not exist. + */ + if(st == NULL) { + st = (OCTET_STRING_t *)(*sptr = CALLOC(1, sizeof(OCTET_STRING_t))); + if(st == NULL) + _ASN_DECODE_FAILED; + } + + if (oct->type == VARIABLE_OCTET_STRING) { + st->size = 0; + st->size = ((uint8_t *)buf_ptr)[0]; + st->size = (st->size << 8) | ((uint8_t *)buf_ptr)[1]; + rval.consumed = 2; + data = (char *)buf_ptr + 2; + } else { + st->size = oct->size; + rval.consumed = 0; + data = (char *)buf_ptr; + } + if (size < (st->size + rval.consumed)) + _ASN_DECODE_FAILED; + + if (OCTET_STRING_fromBuf(st, data, st->size) != 0) + _ASN_DECODE_FAILED; + + rval.code = RC_OK; + rval.consumed += st->size; + return rval; } asn_enc_rval_t @@ -602,7 +638,7 @@ OCTET_STRING_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, _ASN_ENCODE_FAILED; er.encoded = 0; - if (*oct == VARIABLE_OCTET_STRING) { + if (oct->type == VARIABLE_OCTET_STRING) { MDER_OUTPUT_INT_U16_LENGTH(st->size); er.encoded += 2; } @@ -768,7 +804,7 @@ OCTET_STRING__handle_control_chars(void *struct_ptr, const void *chunk_buf, size return 0; } } - + return -1; /* No, it's not */ } diff --git a/skeletons/mder_support.h b/skeletons/mder_support.h index fe1160ff8..49063fe5f 100644 --- a/skeletons/mder_support.h +++ b/skeletons/mder_support.h @@ -75,6 +75,11 @@ typedef enum { typedef enum { FIXED_OCTET_STRING, VARIABLE_OCTET_STRING +} mder_octet_str_types; + +typedef struct{ + mder_octet_str_types type; + int size; } mder_octet_str; /* From 02c7c1b9bf6e30b8278813fbe3b00ad6eea83b7a Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Sun, 28 Mar 2010 21:51:00 +0200 Subject: [PATCH 1424/1469] Bit string decoding --- skeletons/BIT_STRING.c | 35 +++++++++++++++++++++++++++++++++-- skeletons/BIT_STRING.h | 1 + 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index dd7208ec3..96f679eb8 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -27,7 +27,7 @@ asn_TYPE_descriptor_t asn_DEF_BIT_STRING = { BIT_STRING_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ - OCTET_STRING_decode_mder, + BIT_STRING_decode_mder, BIT_STRING_encode_mder, OCTET_STRING_decode_xer_binary, BIT_STRING_encode_xer, @@ -77,6 +77,37 @@ static char *_bit_pattern[16] = { "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111" }; +asn_dec_rval_t +BIT_STRING_decode_mder(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, + void **sptr, const void *buf_ptr, size_t size, int tag_mode) { + + asn_dec_rval_t rval; + BIT_STRING_t *bs = (BIT_STRING_t *)*sptr; + mder_restricted_bit_str *rbs = (mder_restricted_bit_str *)td->mder_constraints; + + if (!rbs || *rbs == INT_INVALID) + _ASN_DECODE_FAILED; + + if(bs == NULL) { + bs = (BIT_STRING_t *)(*sptr = CALLOC(1, sizeof(BIT_STRING_t))); + if(bs == NULL) + _ASN_DECODE_FAILED; + } + + bs->size = *rbs; + if (bs->buf) + free(bs->buf); + bs->buf = CALLOC(1, bs->size); + if (!memcpy(bs->buf, buf_ptr, bs->size)) + _ASN_DECODE_FAILED; + + rval.code = RC_OK; + rval.consumed = bs->size; + + return rval; +} + asn_enc_rval_t BIT_STRING_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, @@ -89,7 +120,7 @@ BIT_STRING_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, if (!rbs || !st || (!st->buf && st->size)) _ASN_ENCODE_FAILED; - if (!rbs || (*rbs == INT_INVALID)) + if (*rbs == INT_INVALID) _ASN_ENCODE_FAILED; er.encoded = (ssize_t) *rbs; diff --git a/skeletons/BIT_STRING.h b/skeletons/BIT_STRING.h index 556531c11..4b3173db3 100644 --- a/skeletons/BIT_STRING.h +++ b/skeletons/BIT_STRING.h @@ -28,6 +28,7 @@ extern asn_TYPE_descriptor_t asn_DEF_BIT_STRING; asn_struct_print_f BIT_STRING_print; /* Human-readable output */ asn_constr_check_f BIT_STRING_constraint; mder_type_encoder_f BIT_STRING_encode_mder; +mder_type_decoder_f BIT_STRING_decode_mder; xer_type_encoder_f BIT_STRING_encode_xer; #ifdef __cplusplus From bf7124cc65dba873a91bf00e3e36f0380b3b3701 Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Mon, 29 Mar 2010 17:35:06 +0200 Subject: [PATCH 1425/1469] Coding style in generated code --- libasn1compiler/asn1c_C.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index f103c14f2..58883559f 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -2428,6 +2428,7 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { if(emit_member_PER_constraints(arg, expr, "memb")) return -1; + //TODO Insert mder constraints here REDIR(save_target); @@ -2499,15 +2500,20 @@ emit_member_MDER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { case ASN_BASIC_OCTET_STRING: OUT("\n"); OUT("static mder_octet_str " - "asn_MDER_%s_%s_constr_%d = ", + "asn_MDER_%s_%s_constr_%d = {\n", pfx, p, expr->_type_unique_index); + INDENT(+1); if (!expr->constraints) { - OUT("{ VARIABLE_OCTET_STRING, 0 };\n"); - break; + OUT("VARIABLE_OCTET_STRING,\n"); + OUT("0\n"); + } else { + ct = expr->combined_constraints; + r_value = asn1constraint_compute_PER_range(etype, ct, ACT_CT_SIZE,0,0,0); + OUT("FIXED_OCTET_STRING,\n"); + OUT("%d\n", r_value->left.value); } - ct = expr->combined_constraints; - r_value = asn1constraint_compute_PER_range(etype, ct, ACT_CT_SIZE,0,0,0); - OUT("{ FIXED_OCTET_STRING, %d };\n", r_value->left.value); + INDENT(-1); + OUT("};\n"); break; default: return 0; From 1fb7589760535d4b3dfb086a4b4f866b755aacdf Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Tue, 30 Mar 2010 19:27:35 +0200 Subject: [PATCH 1426/1469] Mder contraints for sequences --- libasn1compiler/asn1c_C.c | 42 ++++++++++++++++++++++++++++++++------- skeletons/constr_TYPE.h | 1 + 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 58883559f..c2e3be715 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -2270,6 +2270,21 @@ try_inline_default(arg_t *arg, asn1p_expr_t *expr, int out) { return 0; } +static int +has_mder_constraints(arg_t *arg, asn1p_expr_t *expr) { + asn1p_expr_type_e etype; + + etype = expr_get_type(arg, expr); + switch (etype) { + case ASN_BASIC_INTEGER: + case ASN_BASIC_BIT_STRING: + case ASN_BASIC_OCTET_STRING: + return 1; + default: + return 0; + } +} + static int emit_member_table(arg_t *arg, asn1p_expr_t *expr) { int save_target; @@ -2394,12 +2409,26 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { } if(C99_MODE) OUT(".name = "); if(expr->_anonymous_type && !strcmp(expr->Identifier, "Member")) { - OUT("\"\"\n"); + OUT("\"\",\n"); } else { - OUT("\"%s\"\n", expr->Identifier); + OUT("\"%s\",\n", expr->Identifier); + } + if(C99_MODE) OUT(".mder_constraints = "); + if(has_mder_constraints(arg, expr)/*TODO: check if there are mder constraints*/) { + OUT("&asn_MDER_memb_%s_constr_%d\n", MKID(expr), + expr->_type_unique_index); + } else { + OUT("0\t/* No mder constraints */\n", expr->Identifier); } - OUT("},\n"); INDENT(-1); + OUT("},\n"); + + save_target = arg->target->target; + REDIR(OT_CODE); + + emit_member_MDER_constraints(arg, expr, "memb"); + + REDIR(save_target); if(!expr->constraints || (arg->flags & A1C_NO_CONSTRAINTS)) return 0; @@ -2428,7 +2457,6 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { if(emit_member_PER_constraints(arg, expr, "memb")) return -1; - //TODO Insert mder constraints here REDIR(save_target); @@ -2449,7 +2477,7 @@ emit_member_MDER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { OUT("static mder_restricted_int " "asn_MDER_%s_%s_constr_%d = ", pfx, p, expr->_type_unique_index); - if (!expr->constraints) { + if (!expr->combined_constraints) { OUT("INT_INVALID;\n"); break; } @@ -2482,7 +2510,7 @@ emit_member_MDER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { OUT("static mder_restricted_bit_str " "asn_MDER_%s_%s_constr_%d = ", pfx, p, expr->_type_unique_index); - if (!expr->constraints) { + if (!expr->combined_constraints) { OUT("BITS_INVALID;\n"); break; } @@ -2503,7 +2531,7 @@ emit_member_MDER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { "asn_MDER_%s_%s_constr_%d = {\n", pfx, p, expr->_type_unique_index); INDENT(+1); - if (!expr->constraints) { + if (!expr->combined_constraints) { OUT("VARIABLE_OCTET_STRING,\n"); OUT("0\n"); } else { diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index 29d11aab9..0644f2835 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -156,6 +156,7 @@ typedef struct asn_TYPE_member_s { asn_per_constraints_t *per_constraints; /* PER compiled constraints */ int (*default_value)(int setval, void **sptr); /* DEFAULT */ char *name; /* ASN.1 identifier of the element */ + asn_mder_contraints_t mder_constraints; /* mder constraints */ } asn_TYPE_member_t; /* From fc3d6de3c99bb1fb958c9c722d68abc2d9b41ee8 Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Wed, 31 Mar 2010 12:42:34 +0200 Subject: [PATCH 1427/1469] Encoding sequences --- skeletons/constr_SEQUENCE.c | 46 ++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index b221a9354..2429e0730 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -130,7 +130,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, int edx; /* SEQUENCE element's index */ ASN_DEBUG("Decoding %s as SEQUENCE", td->name); - + /* * Create the target structure if it is not present already. */ @@ -145,7 +145,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, * Restore parsing context. */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); - + /* * Start to parse where left previously */ @@ -389,7 +389,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ctx->step |= 1; /* Confirm entering next microphase */ microphase2: ASN_DEBUG("Inside SEQUENCE %s MF2", td->name); - + /* * Compute the position of the member inside a structure, * and also a type of containment (it may be contained @@ -431,7 +431,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, case RC_FAIL: /* Fatal error */ RETURN(RC_FAIL); } /* switch(rval) */ - + ADVANCE(rval.consumed); } /* for(all structure members) */ @@ -501,7 +501,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, PHASE_OUT(ctx); } - + RETURN(RC_OK); } @@ -610,10 +610,40 @@ asn_enc_rval_t SEQUENCE_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { - asn_enc_rval_t rval; - printf("TODO: Implement MDER SEQUENCE encoder"); - _ASN_ENCODE_FAILED; + size_t computed_size = 0; + asn_enc_rval_t erval; + ssize_t ret; + int edx; + + erval.encoded = 0; + + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + asn_enc_rval_t tmperval; + void *memb_ptr; + asn_mder_contraints_t prev_const; + + if(elm->optional) + _ASN_ENCODE_FAILED; + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + } + + prev_const = elm->type->mder_constraints; + elm->type->mder_constraints = elm->mder_constraints; + tmperval = elm->type->mder_encoder(elm->type, memb_ptr, + elm->tag_mode, elm->tag, + cb, app_key); + elm->type->mder_constraints = prev_const; + if(tmperval.encoded == -1) + return tmperval; + erval.encoded +=tmperval.encoded; + } + + _ASN_ENCODED_OK(erval); } #undef XER_ADVANCE From f7fc835922793ca90c8d31b0a6c493c406a8c3ae Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Fri, 2 Apr 2010 13:05:03 +0200 Subject: [PATCH 1428/1469] Generate contraints only for neccesary types in SEQUENCE types. --- libasn1compiler/asn1c_C.c | 14 ++++++++------ skeletons/constr_SEQUENCE.c | 22 +++++++++++++++------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index c2e3be715..ab87dbad9 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -2270,6 +2270,7 @@ try_inline_default(arg_t *arg, asn1p_expr_t *expr, int out) { return 0; } +/* static int has_mder_constraints(arg_t *arg, asn1p_expr_t *expr) { asn1p_expr_type_e etype; @@ -2284,6 +2285,7 @@ has_mder_constraints(arg_t *arg, asn1p_expr_t *expr) { return 0; } } +*/ static int emit_member_table(arg_t *arg, asn1p_expr_t *expr) { @@ -2414,20 +2416,18 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { OUT("\"%s\",\n", expr->Identifier); } if(C99_MODE) OUT(".mder_constraints = "); - if(has_mder_constraints(arg, expr)/*TODO: check if there are mder constraints*/) { + if(expr->constraints) OUT("&asn_MDER_memb_%s_constr_%d\n", MKID(expr), expr->_type_unique_index); - } else { - OUT("0\t/* No mder constraints */\n", expr->Identifier); - } + else + OUT("0\t/* No MDER visible constraints */\n"); + INDENT(-1); OUT("},\n"); save_target = arg->target->target; REDIR(OT_CODE); - emit_member_MDER_constraints(arg, expr, "memb"); - REDIR(save_target); if(!expr->constraints || (arg->flags & A1C_NO_CONSTRAINTS)) @@ -2458,6 +2458,8 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { if(emit_member_PER_constraints(arg, expr, "memb")) return -1; + emit_member_MDER_constraints(arg, expr, "memb"); + REDIR(save_target); return 0; diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 2429e0730..f25d06b8f 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -622,25 +622,33 @@ SEQUENCE_encode_mder(asn_TYPE_descriptor_t *td, asn_TYPE_member_t *elm = &td->elements[edx]; asn_enc_rval_t tmperval; void *memb_ptr; - asn_mder_contraints_t prev_const; + asn_mder_contraints_t prev_constr; if(elm->optional) _ASN_ENCODE_FAILED; - if(elm->flags & ATF_POINTER) { + + if (elm->flags & ATF_POINTER) memb_ptr = *(void **)((char *)sptr + elm->memb_offset); - } else { + else memb_ptr = (void *)((char *)sptr + elm->memb_offset); + + if (elm->mder_constraints) { + /* Member constraints prevail */ + prev_constr = elm->type->mder_constraints; + elm->type->mder_constraints = elm->mder_constraints; } - prev_const = elm->type->mder_constraints; - elm->type->mder_constraints = elm->mder_constraints; tmperval = elm->type->mder_encoder(elm->type, memb_ptr, elm->tag_mode, elm->tag, cb, app_key); - elm->type->mder_constraints = prev_const; + + if (elm->mder_constraints) + /* Restore contraints for basic type */ + elm->type->mder_constraints = prev_constr; + if(tmperval.encoded == -1) return tmperval; - erval.encoded +=tmperval.encoded; + erval.encoded += tmperval.encoded; } _ASN_ENCODED_OK(erval); From c1c4fa6c24ef51bac164f5fb4b814cfe1276fd1a Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Fri, 2 Apr 2010 17:22:45 +0200 Subject: [PATCH 1429/1469] Initial support for encoding/decoding SEQUENCE_OF --- libasn1compiler/asn1c_C.c | 17 ----------------- skeletons/constr_SEQUENCE_OF.c | 12 ++++++++++++ skeletons/constr_SEQUENCE_OF.h | 2 ++ skeletons/constr_SET_OF.c | 11 +++++++++++ skeletons/constr_SET_OF.h | 1 + 5 files changed, 26 insertions(+), 17 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index ab87dbad9..e4fa0c558 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -2270,23 +2270,6 @@ try_inline_default(arg_t *arg, asn1p_expr_t *expr, int out) { return 0; } -/* -static int -has_mder_constraints(arg_t *arg, asn1p_expr_t *expr) { - asn1p_expr_type_e etype; - - etype = expr_get_type(arg, expr); - switch (etype) { - case ASN_BASIC_INTEGER: - case ASN_BASIC_BIT_STRING: - case ASN_BASIC_OCTET_STRING: - return 1; - default: - return 0; - } -} -*/ - static int emit_member_table(arg_t *arg, asn1p_expr_t *expr) { int save_target; diff --git a/skeletons/constr_SEQUENCE_OF.c b/skeletons/constr_SEQUENCE_OF.c index aa101176d..cc2bfff7f 100644 --- a/skeletons/constr_SEQUENCE_OF.c +++ b/skeletons/constr_SEQUENCE_OF.c @@ -87,6 +87,18 @@ SEQUENCE_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, return erval; } +/* + * The DER encoder of the SEQUENCE OF type. + */ +asn_enc_rval_t +SEQUENCE_OF_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er; + printf("TODO: Implement SEQUENCE_OF encoder\n"); + _ASN_ENCODE_FAILED; +} + asn_enc_rval_t SEQUENCE_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, diff --git a/skeletons/constr_SEQUENCE_OF.h b/skeletons/constr_SEQUENCE_OF.h index e2272f326..4aa70ad6b 100644 --- a/skeletons/constr_SEQUENCE_OF.h +++ b/skeletons/constr_SEQUENCE_OF.h @@ -20,9 +20,11 @@ extern "C" { #define SEQUENCE_OF_print SET_OF_print #define SEQUENCE_OF_constraint SET_OF_constraint #define SEQUENCE_OF_decode_ber SET_OF_decode_ber +#define SEQUENCE_OF_decode_mder SET_OF_decode_mder #define SEQUENCE_OF_decode_xer SET_OF_decode_xer #define SEQUENCE_OF_decode_uper SET_OF_decode_uper der_type_encoder_f SEQUENCE_OF_encode_der; +mder_type_encoder_f SEQUENCE_OF_encode_mder; xer_type_encoder_f SEQUENCE_OF_encode_xer; per_type_encoder_f SEQUENCE_OF_encode_uper; diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index 11eac57a2..452ae4f90 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -454,6 +454,17 @@ SET_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, _ASN_ENCODED_OK(erval); } +/* + * MDER Decode SET OF type. + */ +asn_dec_rval_t +SET_OF_decode_mder(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, + void **nint_ptr, const void *buf_ptr, size_t size, int tag_mode) { + printf("TODO: Implement decode of SET_OF\n"); + _ASN_DECODE_FAILED; +} + #undef XER_ADVANCE #define XER_ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ diff --git a/skeletons/constr_SET_OF.h b/skeletons/constr_SET_OF.h index bcd096629..df1c95303 100644 --- a/skeletons/constr_SET_OF.h +++ b/skeletons/constr_SET_OF.h @@ -30,6 +30,7 @@ asn_struct_print_f SET_OF_print; asn_constr_check_f SET_OF_constraint; ber_type_decoder_f SET_OF_decode_ber; der_type_encoder_f SET_OF_encode_der; +mder_type_decoder_f SET_OF_decode_mder; xer_type_decoder_f SET_OF_decode_xer; xer_type_encoder_f SET_OF_encode_xer; per_type_decoder_f SET_OF_decode_uper; From cbb1b5b05ddbf2cba7703fc4c1ae8ee1e7041731 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Fri, 2 Apr 2010 21:10:54 +0200 Subject: [PATCH 1430/1469] Added support for encoding SEQUENCE OF ASN1 types --- skeletons/constr_SEQUENCE.c | 5 ++-- skeletons/constr_SEQUENCE_OF.c | 53 +++++++++++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index f25d06b8f..80de6d515 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -627,9 +627,10 @@ SEQUENCE_encode_mder(asn_TYPE_descriptor_t *td, if(elm->optional) _ASN_ENCODE_FAILED; - if (elm->flags & ATF_POINTER) + if (elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)sptr + elm->memb_offset); - else + if(!memb_ptr) continue; + } else memb_ptr = (void *)((char *)sptr + elm->memb_offset); if (elm->mder_constraints) { diff --git a/skeletons/constr_SEQUENCE_OF.c b/skeletons/constr_SEQUENCE_OF.c index cc2bfff7f..b546d54cc 100644 --- a/skeletons/constr_SEQUENCE_OF.c +++ b/skeletons/constr_SEQUENCE_OF.c @@ -94,8 +94,59 @@ asn_enc_rval_t SEQUENCE_OF_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { + asn_TYPE_member_t *elm = td->elements; + asn_anonymous_sequence_ *list = _A_SEQUENCE_FROM_VOID(sptr); asn_enc_rval_t er; - printf("TODO: Implement SEQUENCE_OF encoder\n"); + size_t computed_size = 0; + ssize_t encoding_size = 0; + int edx; + + /* + * Gather the length of the underlying members sequence. + */ + for(edx = 0; edx < list->count; edx++) { + void *memb_ptr = list->array[edx]; + if(!memb_ptr) continue; + er = elm->type->mder_encoder(elm->type, memb_ptr, + 0, elm->tag, + 0, 0); + if(er.encoded == -1) + return er; + computed_size += er.encoded; + } + + if(!cb) { + er.encoded = computed_size + 4; /* +4 count and length*/ + _ASN_ENCODED_OK(er); + } + + /* Encode count of elements */ + MDER_OUTPUT_INT_U16_LENGTH(list->count); + + /* Encode octets length */ + MDER_OUTPUT_INT_U16_LENGTH(computed_size); + + /* + * Encode all members. + */ + for(edx = 0; edx < list->count; edx++) { + void *memb_ptr = list->array[edx]; + if(!memb_ptr) continue; + er = elm->type->mder_encoder(elm->type, memb_ptr, + 0, elm->tag, + cb, app_key); + if(er.encoded == -1) + return er; + encoding_size += er.encoded; + } + + if(computed_size != (size_t)encoding_size) + goto cb_failed; + + er.encoded = computed_size + 4; /* +4 count and length*/ + _ASN_ENCODED_OK(er); + +cb_failed: _ASN_ENCODE_FAILED; } From 82505c929e9495a83eb1afcbca0c05731d0db416 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Sat, 3 Apr 2010 19:48:15 +0200 Subject: [PATCH 1431/1469] updated macros for mder --- skeletons/mder_support.h | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/skeletons/mder_support.h b/skeletons/mder_support.h index 49063fe5f..33de74aa6 100644 --- a/skeletons/mder_support.h +++ b/skeletons/mder_support.h @@ -87,23 +87,26 @@ typedef struct{ */ typedef void* asn_mder_contraints_t; -#ifdef WORDS_BIGENDIAN /* Opportunistic optimization */ -#define MDER_OUTPUT_INT_U16_LENGTH(len) do { \ - if ((len < 0) || (len > 65535)) \ +#define CHECK_UINT16(_len) do { \ + if (((_len) < 0) || ((_len) > 65535)) \ goto cb_failed; \ +} while (0) + +#ifdef WORDS_BIGENDIAN /* Opportunistic optimization */ +#define MDER_OUTPUT_INT_U16_LENGTH(_len) do { \ + CHECK_UINT16(_len); \ if (cb) { \ - uint16_t aux = (uint16_t)len; \ + uint16_t aux = (uint16_t)(_len); \ _ASN_CALLBACK((uint8_t *)&aux, 2); \ } \ } while (0) #else /* Works even if WORDS_BIGENDIAN is not set where should've been */ -#define MDER_OUTPUT_INT_U16_LENGTH(len) do { \ - if ((len < 0) || (len > 65535)) \ - goto cb_failed; \ +#define MDER_OUTPUT_INT_U16_LENGTH(_len) do { \ + CHECK_UINT16(_len); \ if (cb) { \ uint8_t lbuf[2]; /* length for variable O-S */ \ - lbuf[0] = (len >> 8) & 0xff; \ - lbuf[1] = len & 0xff; \ + lbuf[0] = ((_len) >> 8) & 0xff; \ + lbuf[1] = (_len) & 0xff; \ _ASN_CALLBACK(lbuf, 2); \ } \ } while (0) From 439d57c70875bfc7617b5ed245743a2b727d0662 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Sat, 3 Apr 2010 20:22:34 +0200 Subject: [PATCH 1432/1469] New api changed for integers --- libasn1compiler/asn1c_C.c | 4 ++-- skeletons/INTEGER.c | 9 ++++++--- skeletons/NativeInteger.c | 4 ++-- skeletons/asn_codecs_prim.c | 6 +++--- skeletons/asn_codecs_prim.h | 1 - skeletons/mder_encoder.c | 2 +- skeletons/mder_encoder.h | 5 ++--- 7 files changed, 16 insertions(+), 15 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index e4fa0c558..44a1f7b77 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1341,11 +1341,11 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { if(HIDE_INNER_DEFS) OUT("_%d", expr->_type_unique_index); OUT("_encode_mder(asn_TYPE_descriptor_t *td,\n"); INDENTED( - OUT("\tvoid *structure, int tag_mode, ber_tlv_tag_t tag,\n"); + OUT("\tvoid *structure, asn_mder_contraints_t constr,\n"); OUT("\tasn_app_consume_bytes_f *cb, void *app_key) {\n"); OUT("%s_%d_inherit_TYPE_descriptor(td);\n", p, expr->_type_unique_index); - OUT("return td->mder_encoder(td, structure, tag_mode, tag, cb, app_key);\n"); + OUT("return td->mder_encoder(td, structure, 0, cb, app_key);\n"); ); OUT("}\n"); OUT("\n"); diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 866c85517..ab249aba5 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -88,14 +88,17 @@ INTEGER_decode_mder(asn_codec_ctx_t *opt_codec_ctx, */ asn_enc_rval_t INTEGER_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, - int tag_mode, ber_tlv_tag_t tag, + asn_mder_contraints_t constr, asn_app_consume_bytes_f *cb, void *app_key) { INTEGER_t *st = (INTEGER_t *)sptr; mder_restricted_int *rint; int size, shift; asn_enc_rval_t r; - rint = (mder_restricted_int *)td->mder_constraints; + /* specifics constraints prevail */ + rint = (constr) ? (mder_restricted_int *)constr : + (mder_restricted_int *)td->mder_constraints; + if (!rint || *rint == INT_INVALID) _ASN_ENCODE_FAILED; @@ -114,7 +117,7 @@ INTEGER_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, } } - return mder_encode_primitive(td, sptr, tag_mode, tag, cb, app_key); + return mder_encode_primitive(td, sptr, constr, cb, app_key); } /* diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index 91eb32195..08306b2cd 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -179,7 +179,7 @@ NativeInteger_encode_der(asn_TYPE_descriptor_t *sd, void *ptr, */ asn_enc_rval_t NativeInteger_encode_mder(asn_TYPE_descriptor_t *sd, void *ptr, - int tag_mode, ber_tlv_tag_t tag, + asn_mder_contraints_t constr, asn_app_consume_bytes_f *cb, void *app_key) { unsigned long native = *(unsigned long *)ptr; /* Disable sign ext. */ asn_enc_rval_t erval; @@ -188,7 +188,7 @@ NativeInteger_encode_mder(asn_TYPE_descriptor_t *sd, void *ptr, _PREPARE_INTEGER_T(tmp,native); /* Encode fake INTEGER */ - erval = INTEGER_encode_mder(sd, &tmp, tag_mode, tag, cb, app_key); + erval = INTEGER_encode_mder(sd, &tmp, constr, cb, app_key); if(erval.encoded == -1) { assert(erval.structure_ptr == &tmp); erval.structure_ptr = ptr; diff --git a/skeletons/asn_codecs_prim.c b/skeletons/asn_codecs_prim.c index fdaea7ebc..55a6f6f2b 100644 --- a/skeletons/asn_codecs_prim.c +++ b/skeletons/asn_codecs_prim.c @@ -122,13 +122,13 @@ der_encode_primitive(asn_TYPE_descriptor_t *td, void *sptr, */ asn_enc_rval_t mder_encode_primitive(asn_TYPE_descriptor_t *td, void *sptr, - int tag_mode, ber_tlv_tag_t tag, + asn_mder_contraints_t constr, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t erval; ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)sptr; - ASN_DEBUG("%s %s as a primitive type (tm=%d)", - cb?"Encoding":"Estimating", td->name, tag_mode); + ASN_DEBUG("%s %s as a primitive type ", + cb?"Encoding":"Estimating", td->name); if(cb && st->buf) { diff --git a/skeletons/asn_codecs_prim.h b/skeletons/asn_codecs_prim.h index 5c38c34e3..e5bf766e0 100644 --- a/skeletons/asn_codecs_prim.h +++ b/skeletons/asn_codecs_prim.h @@ -19,7 +19,6 @@ typedef struct ASN__PRIMITIVE_TYPE_s { asn_struct_free_f ASN__PRIMITIVE_TYPE_free; ber_type_decoder_f ber_decode_primitive; der_type_encoder_f der_encode_primitive; - mder_type_encoder_f mder_encode_primitive; /* diff --git a/skeletons/mder_encoder.c b/skeletons/mder_encoder.c index a5b65c4d7..4a62e86de 100644 --- a/skeletons/mder_encoder.c +++ b/skeletons/mder_encoder.c @@ -16,7 +16,7 @@ asn_enc_rval_t mder_encode(struct asn_TYPE_descriptor_s *type_descriptor, */ return type_descriptor->mder_encoder(type_descriptor, struct_ptr, /* Pointer to the destination structure */ - 0, 0, + 0, /* No specifics constraints */ consume_bytes_cb, app_key); } diff --git a/skeletons/mder_encoder.h b/skeletons/mder_encoder.h index ca490b0f8..47fb2f212 100644 --- a/skeletons/mder_encoder.h +++ b/skeletons/mder_encoder.h @@ -37,9 +37,8 @@ asn_enc_rval_t mder_encode_to_buffer( */ typedef asn_enc_rval_t (mder_type_encoder_f)( struct asn_TYPE_descriptor_s *type_descriptor, - void *struct_ptr, /* Structure to be encoded */ - int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ - ber_tlv_tag_t tag, + void *struct_ptr, /* Structure to be encoded */ + asn_mder_contraints_t constr, /* Specific constraints */ asn_app_consume_bytes_f *consume_bytes_cb, /* Callback */ void *app_key /* Arbitrary callback argument */ ); From f2b8d8c2942a92fe58213f1c86a7de74a8e8985c Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Sat, 3 Apr 2010 20:37:13 +0200 Subject: [PATCH 1433/1469] Updated Octet Strings and Bit Strings to new API. Fixed bug in BIT String encoder --- skeletons/BIT_STRING.c | 11 +++++++++-- skeletons/INTEGER.c | 3 +++ skeletons/OCTET_STRING.c | 11 +++++++++-- skeletons/mder_encoder.c | 2 +- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index 96f679eb8..2360de987 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -110,17 +110,24 @@ BIT_STRING_decode_mder(asn_codec_ctx_t *opt_codec_ctx, asn_enc_rval_t BIT_STRING_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, - int tag_mode, ber_tlv_tag_t tag, + asn_mder_contraints_t constr, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t er; BIT_STRING_t *st = (BIT_STRING_t *)sptr; mder_restricted_bit_str *rbs = (mder_restricted_bit_str *)td->mder_constraints; + ASN_DEBUG("%s %s as BIT STRING", + cb?"Encoding":"Estimating", td->name); + + /* specifics constraints prevail */ + rbs = (constr) ? (mder_restricted_bit_str *)constr : + (mder_restricted_bit_str *)td->mder_constraints; + if (!rbs || !st || (!st->buf && st->size)) _ASN_ENCODE_FAILED; - if (*rbs == INT_INVALID) + if (*rbs == BITS_INVALID) _ASN_ENCODE_FAILED; er.encoded = (ssize_t) *rbs; diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index ab249aba5..4414ac8a5 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -95,6 +95,9 @@ INTEGER_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, int size, shift; asn_enc_rval_t r; + ASN_DEBUG("%s %s as INTEGER", + cb?"Encoding":"Estimating", td->name); + /* specifics constraints prevail */ rint = (constr) ? (mder_restricted_int *)constr : (mder_restricted_int *)td->mder_constraints; diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index e55a6f3e0..287639b5c 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -627,13 +627,20 @@ OCTET_STRING_decode_mder(asn_codec_ctx_t *opt_codec_ctx, asn_enc_rval_t OCTET_STRING_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, - int tag_mode, ber_tlv_tag_t tag, + asn_mder_contraints_t constr, asn_app_consume_bytes_f *cb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; - mder_octet_str *oct = (mder_octet_str *)td->mder_constraints; + mder_octet_str *oct; asn_enc_rval_t er; + ASN_DEBUG("%s %s as OCTET STRING", + cb?"Estimating":"Encoding", td->name); + + /* specifics constraints prevail */ + oct = (constr) ? (mder_octet_str *)constr : + (mder_octet_str *)td->mder_constraints; + if (!oct || !st || (!st->buf && st->size)) _ASN_ENCODE_FAILED; diff --git a/skeletons/mder_encoder.c b/skeletons/mder_encoder.c index 4a62e86de..aae95d276 100644 --- a/skeletons/mder_encoder.c +++ b/skeletons/mder_encoder.c @@ -53,7 +53,7 @@ asn_enc_rval_t mder_encode_to_buffer( ec = type_descriptor->mder_encoder(type_descriptor, struct_ptr, /* Pointer to the destination structure */ - 0, 0, encode_to_buffer_cb, &arg); + 0, encode_to_buffer_cb, &arg); if(ec.encoded != -1) { assert(ec.encoded == (ssize_t)(buffer_size - arg.left)); /* Return the encoded contents size */ From 8c6567e4fc0c8208f01323489596e599ef55a78a Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Sat, 3 Apr 2010 20:54:59 +0200 Subject: [PATCH 1434/1469] added security checks before coding an octet string --- libasn1compiler/asn1c_C.c | 2 +- skeletons/OCTET_STRING.c | 3 +++ skeletons/mder_support.h | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 44a1f7b77..1ee08440d 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1345,7 +1345,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { OUT("\tasn_app_consume_bytes_f *cb, void *app_key) {\n"); OUT("%s_%d_inherit_TYPE_descriptor(td);\n", p, expr->_type_unique_index); - OUT("return td->mder_encoder(td, structure, 0, cb, app_key);\n"); + OUT("return td->mder_encoder(td, structure, constr, cb, app_key);\n"); ); OUT("}\n"); OUT("\n"); diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 287639b5c..ee3fffddf 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -644,6 +644,9 @@ OCTET_STRING_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, if (!oct || !st || (!st->buf && st->size)) _ASN_ENCODE_FAILED; + if ((oct->type == FIXED_OCTET_STRING) && (st->size != oct->size)) + _ASN_ENCODE_FAILED; + er.encoded = 0; if (oct->type == VARIABLE_OCTET_STRING) { MDER_OUTPUT_INT_U16_LENGTH(st->size); diff --git a/skeletons/mder_support.h b/skeletons/mder_support.h index 33de74aa6..db3ff8c6b 100644 --- a/skeletons/mder_support.h +++ b/skeletons/mder_support.h @@ -83,7 +83,7 @@ typedef struct{ } mder_octet_str; /* - * Pre-computed MDER Subtype constrint info (if is restricted type). + * Pre-computed MDER Subtype constraint info. */ typedef void* asn_mder_contraints_t; From e5b25f17df24ee43d7e1edbcc88e695f95b59f51 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Sat, 3 Apr 2010 21:17:12 +0200 Subject: [PATCH 1435/1469] Updated sequence coder. With new API is not yet neccesary change contraints for the type when member specified new contraints in the sequence --- skeletons/constr_SEQUENCE.c | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 80de6d515..1d233777b 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -608,7 +608,7 @@ SEQUENCE_decode_mder(asn_codec_ctx_t *opt_codec_ctx, */ asn_enc_rval_t SEQUENCE_encode_mder(asn_TYPE_descriptor_t *td, - void *sptr, int tag_mode, ber_tlv_tag_t tag, + void *sptr, asn_mder_contraints_t constr, asn_app_consume_bytes_f *cb, void *app_key) { size_t computed_size = 0; @@ -622,7 +622,6 @@ SEQUENCE_encode_mder(asn_TYPE_descriptor_t *td, asn_TYPE_member_t *elm = &td->elements[edx]; asn_enc_rval_t tmperval; void *memb_ptr; - asn_mder_contraints_t prev_constr; if(elm->optional) _ASN_ENCODE_FAILED; @@ -633,20 +632,10 @@ SEQUENCE_encode_mder(asn_TYPE_descriptor_t *td, } else memb_ptr = (void *)((char *)sptr + elm->memb_offset); - if (elm->mder_constraints) { - /* Member constraints prevail */ - prev_constr = elm->type->mder_constraints; - elm->type->mder_constraints = elm->mder_constraints; - } - tmperval = elm->type->mder_encoder(elm->type, memb_ptr, - elm->tag_mode, elm->tag, + elm->mder_constraints, cb, app_key); - if (elm->mder_constraints) - /* Restore contraints for basic type */ - elm->type->mder_constraints = prev_constr; - if(tmperval.encoded == -1) return tmperval; erval.encoded += tmperval.encoded; From 8819812cdc9dc181d595d80cc18b3e64d42f5c8b Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Sat, 3 Apr 2010 21:32:29 +0200 Subject: [PATCH 1436/1469] Updated SEQUENCE OF to new API. --- skeletons/constr_SEQUENCE_OF.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/skeletons/constr_SEQUENCE_OF.c b/skeletons/constr_SEQUENCE_OF.c index b546d54cc..11b478e4d 100644 --- a/skeletons/constr_SEQUENCE_OF.c +++ b/skeletons/constr_SEQUENCE_OF.c @@ -88,11 +88,11 @@ SEQUENCE_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, } /* - * The DER encoder of the SEQUENCE OF type. + * The MDER encoder of the SEQUENCE OF type. */ asn_enc_rval_t SEQUENCE_OF_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, - int tag_mode, ber_tlv_tag_t tag, + asn_mder_contraints_t constr, asn_app_consume_bytes_f *cb, void *app_key) { asn_TYPE_member_t *elm = td->elements; asn_anonymous_sequence_ *list = _A_SEQUENCE_FROM_VOID(sptr); @@ -108,7 +108,7 @@ SEQUENCE_OF_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, void *memb_ptr = list->array[edx]; if(!memb_ptr) continue; er = elm->type->mder_encoder(elm->type, memb_ptr, - 0, elm->tag, + elm->mder_constraints, 0, 0); if(er.encoded == -1) return er; @@ -133,7 +133,7 @@ SEQUENCE_OF_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, void *memb_ptr = list->array[edx]; if(!memb_ptr) continue; er = elm->type->mder_encoder(elm->type, memb_ptr, - 0, elm->tag, + elm->mder_constraints, cb, app_key); if(er.encoded == -1) return er; From 6352f9757961ea837f1b7c70e0cbac9df9c2b9a2 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Sun, 4 Apr 2010 20:46:39 +0200 Subject: [PATCH 1437/1469] Added initial support for encoding/decoding CHOICE type using MDER --- skeletons/constr_CHOICE.c | 27 +++++++++++++++++++++++++++ skeletons/constr_CHOICE.h | 4 ++++ skeletons/constr_SEQUENCE.c | 1 + skeletons/constr_SEQUENCE.h | 4 +++- skeletons/constr_SEQUENCE_OF.c | 1 + skeletons/constr_SEQUENCE_OF.h | 4 +++- skeletons/mder_decoder.c | 2 ++ skeletons/mder_decoder.h | 4 +++- skeletons/mder_encoder.h | 3 ++- 9 files changed, 46 insertions(+), 4 deletions(-) diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index a9eb71941..f5f21312e 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -1,4 +1,6 @@ /* + * Copyright (c) 2010 Santiago Carot-Nemesio + * Copyright (c) 2010 Jose Antonio Santos-Cadenas * Copyright (c) 2003, 2004, 2005, 2006, 2007 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. @@ -444,6 +446,31 @@ CHOICE_encode_der(asn_TYPE_descriptor_t *td, void *sptr, return erval; } +/* + * The MDER decoder of the CHOICE OF type. + */ +asn_dec_rval_t +CHOICE_decode_mder(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, + void **sptr, const void *buf_ptr, size_t size, int tag_mode) { + asn_dec_rval_t rval; + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + + printf("TODO: Decode CHOICE\n"); + RETURN(RC_FAIL); +} +/* + * The MDER encoder of the CHOICE type. + */ +asn_enc_rval_t +CHOICE_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, + asn_mder_contraints_t constr, + asn_app_consume_bytes_f *cb, void *app_key) { + + printf("TODO: Encode CHOICE\n"); + _ASN_ENCODE_FAILED; +} + ber_tlv_tag_t CHOICE_outmost_tag(asn_TYPE_descriptor_t *td, const void *ptr, int tag_mode, ber_tlv_tag_t tag) { asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; diff --git a/skeletons/constr_CHOICE.h b/skeletons/constr_CHOICE.h index 83404e6d4..c7065520f 100644 --- a/skeletons/constr_CHOICE.h +++ b/skeletons/constr_CHOICE.h @@ -1,4 +1,6 @@ /*- + * Copyright (c) 2010 Santiago Carot-Nemesio + * Copyright (c) 2010 Jose Antonio Santos-Cadenas * Copyright (c) 2003, 2004, 2005 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. @@ -44,6 +46,8 @@ asn_struct_print_f CHOICE_print; asn_constr_check_f CHOICE_constraint; ber_type_decoder_f CHOICE_decode_ber; der_type_encoder_f CHOICE_encode_der; +mder_type_decoder_f CHOICE_decode_mder; +mder_type_encoder_f CHOICE_encode_mder; xer_type_decoder_f CHOICE_decode_xer; xer_type_encoder_f CHOICE_encode_xer; per_type_decoder_f CHOICE_decode_uper; diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 1d233777b..58a3f943a 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -1,4 +1,5 @@ /*- + * Copyright (c) 2010 Santiago Carot-Nemesio * Copyright (c) 2003, 2004, 2005, 2006, 2007 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. diff --git a/skeletons/constr_SEQUENCE.h b/skeletons/constr_SEQUENCE.h index 5a3fd5d3a..9eb299fad 100644 --- a/skeletons/constr_SEQUENCE.h +++ b/skeletons/constr_SEQUENCE.h @@ -1,5 +1,7 @@ /*- - * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Copyright (c) 2010 Santiago Carot-Nemesio + * Copyright (c) 2003, 2004 Lev Walkin . + * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _CONSTR_SEQUENCE_H_ diff --git a/skeletons/constr_SEQUENCE_OF.c b/skeletons/constr_SEQUENCE_OF.c index 11b478e4d..33eccd005 100644 --- a/skeletons/constr_SEQUENCE_OF.c +++ b/skeletons/constr_SEQUENCE_OF.c @@ -1,4 +1,5 @@ /*- + * Copyright (c) 2010 Santiago Carot-Nemesio * Copyright (c) 2003, 2004, 2006 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. diff --git a/skeletons/constr_SEQUENCE_OF.h b/skeletons/constr_SEQUENCE_OF.h index 4aa70ad6b..d6797719b 100644 --- a/skeletons/constr_SEQUENCE_OF.h +++ b/skeletons/constr_SEQUENCE_OF.h @@ -1,5 +1,7 @@ /*- - * Copyright (c) 2003, 2005 Lev Walkin . All rights reserved. + * Copyright (c) 2010 Santiago Carot-Nemesio + * Copyright (c) 2003, 2005 Lev Walkin . + * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _CONSTR_SEQUENCE_OF_H_ diff --git a/skeletons/mder_decoder.c b/skeletons/mder_decoder.c index d42ce49fb..2797e4fa0 100644 --- a/skeletons/mder_decoder.c +++ b/skeletons/mder_decoder.c @@ -1,5 +1,7 @@ /*- + * Copyright (c) 2010 Santiago Carot-Nemesio * Copyright (c) 2010 Jose Antonio Santos-Cadenas + * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include diff --git a/skeletons/mder_decoder.h b/skeletons/mder_decoder.h index cf662dd1a..9b9e12ebc 100644 --- a/skeletons/mder_decoder.h +++ b/skeletons/mder_decoder.h @@ -1,5 +1,7 @@ /*- - * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Copyright (c) 2010 Santiago Carot-Nemesio + * Copyright (c) 2010 Jose Antonio Santos-Cadenas + * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _MDER_DECODER_H_ diff --git a/skeletons/mder_encoder.h b/skeletons/mder_encoder.h index 47fb2f212..0af2ea538 100644 --- a/skeletons/mder_encoder.h +++ b/skeletons/mder_encoder.h @@ -1,5 +1,6 @@ /*- - * Copyright (c) 2010 Santiago Carot-Nemesio . + * Copyright (c) 2010 Santiago Carot-Nemesio + * Copyright (c) 2010 Jose Antonio Santos-Cadenas * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ From 07001c4e746f0fde2b649ae15b81ace303dabb67 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Mon, 5 Apr 2010 10:47:07 +0200 Subject: [PATCH 1438/1469] Initial support for encoding of CHOICE types in MDER. TODO: * Code tags in explicit member of CHOICE types. * Implicit tags should begin in 1, not in 0. --- skeletons/constr_CHOICE.c | 64 +++++++++++++++++++++++++++++++++- skeletons/constr_SEQUENCE.c | 3 ++ skeletons/constr_SEQUENCE_OF.c | 3 ++ 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index f5f21312e..5c27662e9 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -466,8 +466,70 @@ asn_enc_rval_t CHOICE_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, asn_mder_contraints_t constr, asn_app_consume_bytes_f *cb, void *app_key) { + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elm; /* CHOICE element */ + asn_enc_rval_t erval; + void *memb_ptr; + int present; + + if(!sptr) _ASN_ENCODE_FAILED; + + ASN_DEBUG("%s %s as CHOICE", + cb?"Encoding":"Estimating", td->name); - printf("TODO: Encode CHOICE\n"); + present = _fetch_present_idx(sptr, + specs->pres_offset, specs->pres_size); + + /* + * If the structure was not initialized, it cannot be encoded: + * can't deduce what to encode in the choice type. + */ + if(present <= 0 || present > td->elements_count) + _ASN_ENCODE_FAILED; + + /* + * Seek over the present member of the structure. + */ + elm = &td->elements[present-1]; + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(memb_ptr == 0) + /* All elements are mandatory in MDER */ + _ASN_ENCODE_FAILED; + } else + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + + /* we need to pre-compute the member size */ + erval = elm->type->mder_encoder(elm->type, memb_ptr, + elm->mder_constraints, 0, 0); + + if(erval.encoded == -1) + return erval; + + if(!cb) { + erval.encoded += 4; /* +4 tag and length*/ + _ASN_ENCODED_OK(erval); + } + + /* Encode count of elements */ + MDER_OUTPUT_INT_U16_LENGTH(1); + + /* Encode octets length */ + MDER_OUTPUT_INT_U16_LENGTH(erval.encoded); + + /* + * Encode the single underlying member. + */ + erval = elm->type->mder_encoder(elm->type, memb_ptr, + elm->mder_constraints, cb, app_key); + if(erval.encoded == -1) + return erval; + + erval.encoded += 4; + printf("Encoded CHOICE member in %ld bytes", + (long)erval.encoded); + return erval; +cb_failed: _ASN_ENCODE_FAILED; } diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 58a3f943a..de42ead08 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -617,6 +617,9 @@ SEQUENCE_encode_mder(asn_TYPE_descriptor_t *td, ssize_t ret; int edx; + ASN_DEBUG("%s %s as SEQUENCE", + cb?"Encoding":"Estimating", td->name); + erval.encoded = 0; for(edx = 0; edx < td->elements_count; edx++) { diff --git a/skeletons/constr_SEQUENCE_OF.c b/skeletons/constr_SEQUENCE_OF.c index 33eccd005..5f7d7019a 100644 --- a/skeletons/constr_SEQUENCE_OF.c +++ b/skeletons/constr_SEQUENCE_OF.c @@ -102,6 +102,9 @@ SEQUENCE_OF_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, ssize_t encoding_size = 0; int edx; + ASN_DEBUG("%s %s as SEQUENCE OF", + cb?"Encoding":"Estimating", td->name); + /* * Gather the length of the underlying members sequence. */ From 5576674da7c55a3f17f0ff158f2cefa4b9417c04 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Mon, 5 Apr 2010 11:08:23 +0200 Subject: [PATCH 1439/1469] Fixed some issues in OCTECT STRING in MDER TODO. Fix next matter: If OCTET String is not fixed then not generate OCTET STRING CONSTRAINT because we know that if there is not contraint then it is a VARIABLE STRING --- skeletons/OCTET_STRING.c | 6 +++--- skeletons/constr_CHOICE.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index ee3fffddf..7e33cf6f4 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -641,14 +641,14 @@ OCTET_STRING_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, oct = (constr) ? (mder_octet_str *)constr : (mder_octet_str *)td->mder_constraints; - if (!oct || !st || (!st->buf && st->size)) + if (!st || (!st->buf && st->size)) _ASN_ENCODE_FAILED; - if ((oct->type == FIXED_OCTET_STRING) && (st->size != oct->size)) + if (oct && (oct->type == FIXED_OCTET_STRING) && (st->size != oct->size)) _ASN_ENCODE_FAILED; er.encoded = 0; - if (oct->type == VARIABLE_OCTET_STRING) { + if ((!oct) || (oct && (oct->type == VARIABLE_OCTET_STRING))) { MDER_OUTPUT_INT_U16_LENGTH(st->size); er.encoded += 2; } diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 5c27662e9..72cd7aebb 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -511,7 +511,7 @@ CHOICE_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, _ASN_ENCODED_OK(erval); } - /* Encode count of elements */ + /* Encode element's tag */ MDER_OUTPUT_INT_U16_LENGTH(1); /* Encode octets length */ From 3382b8e9cdd48a43936820c494a277c6da8d0b75 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Tue, 6 Apr 2010 07:06:36 +0200 Subject: [PATCH 1440/1469] Appropiated choice types are generated according to MDER tag rules. --- libasn1compiler/asn1c_C.c | 77 ++++++++++++++++++++++++++++++++++++++- skeletons/constr_CHOICE.h | 1 + 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 1ee08440d..50dbf5d9c 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -45,6 +45,7 @@ static int emit_member_PER_constraints(arg_t *arg, asn1p_expr_t *expr, const cha static int emit_member_MDER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx); static int emit_member_table(arg_t *arg, asn1p_expr_t *expr); static int emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count, const char *opt_modifier); +static int emit_MDER_tag2member_table(arg_t *arg, tag2el_t *tag2el, int tag2el_count); static int emit_include_dependencies(arg_t *arg); static asn1p_expr_t *terminal_structable(arg_t *arg, asn1p_expr_t *expr); static int expr_defined_recursively(arg_t *arg, asn1p_expr_t *expr); @@ -925,6 +926,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { int all_tags_count; enum tvm_compat tv_mode; int *cmap = 0; + int genMder; /* * Fetch every inner tag from the tag to elements map. @@ -993,6 +995,11 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { */ emit_tag2member_map(arg, tag2el, tag2el_count, 0); + /* + * Generate choice_ids for MDER coder/decoder + */ + genMder = emit_MDER_tag2member_table(arg, tag2el, tag2el_count); + OUT("static asn_CHOICE_specifics_t asn_SPC_%s_specs_%d = {\n", MKID(expr), expr->_type_unique_index); INDENTED( @@ -1016,8 +1023,14 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { MKID(expr), expr->_type_unique_index); else OUT("0,\n"); if(C99_MODE) OUT(".ext_start = "); - OUT("%d\t/* Extensions start */\n", + OUT("%d,\t/* Extensions start */\n", compute_extensions_start(expr)); + if(C99_MODE) OUT(".sorted_tags = "); + if(genMder) + OUT("asn_MDER_tag2member_%s_table%d\n", + MKID(expr), expr->_type_unique_index); + else + OUT("0\t/* Invalid definition of choice type for MDER */\n"); ); OUT("};\n"); @@ -1717,6 +1730,68 @@ emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count, const char * return 0; } +static int +emit_MDER_tag2member_table(arg_t *arg, tag2el_t *tag2el, int tag2el_count) { + asn1p_expr_t *expr = arg->expr; + uint16_t *stags; + int type, i; + + if(!tag2el_count) + return 0; /* No top level tags */ + + type = tag2el[0].el_tag.tag_mode; /* All tags should be equal to that */ + if (type == TM_IMPLICIT) + return 0; + + for(i = 1; i < tag2el_count; i++) + if (type != tag2el[i].el_tag.tag_mode) + return 0; /* Tags shall be explicit or implicit in MDER, not mixed */ + + stags = calloc(tag2el_count, sizeof(asn1c_integer_t)); + if (!stags) + return 0; + + for(i = 0; i < tag2el_count; i++) { + if (type != TM_EXPLICIT) { + /* Implicit tag */ + if (((tag2el[i].el_no + 1) < 0) || ((tag2el[i].el_no + 1) > 65535)) { + /* Tag can't be encoded in an uint16_t */ + free(stags); + return 0; + } + stags[tag2el[i].el_no] = (uint16_t)tag2el[i].el_no + 1; + continue; + } + /* Explicit tag */ + if ((tag2el[i].el_tag.tag_value < 0) || (tag2el[i].el_tag.tag_value > 65535)) { + /* Tag can't be encoded in an uint16_t*/ + free(stags); + return 0; + } + stags[tag2el[i].el_no] = (uint16_t)tag2el[i].el_tag.tag_value; + } + + /* Check if value of tags are assigned sequentially */ + if (type == TM_EXPLICIT) + for (i = 0; i < (tag2el_count - 1); i++) + if (stags[i] >= tag2el[i+1].el_tag.tag_value) { + /* Tags are not assigned sequentially */ + free(stags); + return 0; + } + OUT("/* MDER Tags are %s */\n", (type == TM_EXPLICIT) ? "explicit" : "implicit"); + OUT("static uint16_t asn_MDER_tag2member_%s_table%d[] = {", + MKID(expr), expr->_type_unique_index); + + for(i = 0; i < tag2el_count; i++) { + OUT("%d%s", stags[i], + (i + 1 < tag2el_count) ? "," : ""); + } + OUT("};\n"); + + free(stags); + return 1; +} static enum tvm_compat emit_tags_vectors(arg_t *arg, asn1p_expr_t *expr, int *tags_count_r, int *all_tags_count_r) { struct asn1p_type_tag_s *tags = 0; /* Effective tags */ diff --git a/skeletons/constr_CHOICE.h b/skeletons/constr_CHOICE.h index c7065520f..d5176e911 100644 --- a/skeletons/constr_CHOICE.h +++ b/skeletons/constr_CHOICE.h @@ -36,6 +36,7 @@ typedef struct asn_CHOICE_specifics_s { * Extensions-related stuff. */ int ext_start; /* First member of extensions, or -1 */ + uint16_t *sorted_tags; /* Tags used by MDER encoder and decoder */ } asn_CHOICE_specifics_t; /* From 7cde7338f2ffd2896b6c720de2a42aff70da1bf7 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Tue, 6 Apr 2010 07:26:52 +0200 Subject: [PATCH 1441/1469] Full support for encoding choice types using MDER --- skeletons/constr_CHOICE.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 72cd7aebb..e1ce28f2d 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -472,7 +472,7 @@ CHOICE_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, void *memb_ptr; int present; - if(!sptr) _ASN_ENCODE_FAILED; + if (!(sptr && specs->sorted_tags)) _ASN_ENCODE_FAILED; ASN_DEBUG("%s %s as CHOICE", cb?"Encoding":"Estimating", td->name); @@ -512,7 +512,7 @@ CHOICE_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, } /* Encode element's tag */ - MDER_OUTPUT_INT_U16_LENGTH(1); + MDER_OUTPUT_INT_U16_LENGTH(specs->sorted_tags[present-1]); /* Encode octets length */ MDER_OUTPUT_INT_U16_LENGTH(erval.encoded); @@ -526,8 +526,6 @@ CHOICE_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, return erval; erval.encoded += 4; - printf("Encoded CHOICE member in %ld bytes", - (long)erval.encoded); return erval; cb_failed: _ASN_ENCODE_FAILED; From 295b9aca40ae23d220b7d4417b9083b8222242c3 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Tue, 6 Apr 2010 14:52:58 +0200 Subject: [PATCH 1442/1469] Fixed Octet string subject in relation with contrained size --- libasn1compiler/asn1c_C.c | 19 ++++++------------- skeletons/ANY.c | 3 +++ skeletons/OCTET_STRING.c | 30 ++++++++++++++++-------------- skeletons/mder_support.h | 5 +---- 4 files changed, 26 insertions(+), 31 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 50dbf5d9c..8ea0e1ce3 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -2586,22 +2586,15 @@ emit_member_MDER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { OUT("BITS_INVALID;\n"); break; case ASN_BASIC_OCTET_STRING: + if (!expr->combined_constraints) + return 0; OUT("\n"); OUT("static mder_octet_str " - "asn_MDER_%s_%s_constr_%d = {\n", + "asn_MDER_%s_%s_constr_%d = ", pfx, p, expr->_type_unique_index); - INDENT(+1); - if (!expr->combined_constraints) { - OUT("VARIABLE_OCTET_STRING,\n"); - OUT("0\n"); - } else { - ct = expr->combined_constraints; - r_value = asn1constraint_compute_PER_range(etype, ct, ACT_CT_SIZE,0,0,0); - OUT("FIXED_OCTET_STRING,\n"); - OUT("%d\n", r_value->left.value); - } - INDENT(-1); - OUT("};\n"); + ct = expr->combined_constraints; + r_value = asn1constraint_compute_PER_range(etype, ct, ACT_CT_SIZE,0,0,0); + OUT("%d;\n", r_value->left.value); break; default: return 0; diff --git a/skeletons/ANY.c b/skeletons/ANY.c index 0ad60d0a0..d898c837d 100644 --- a/skeletons/ANY.c +++ b/skeletons/ANY.c @@ -19,6 +19,8 @@ asn_TYPE_descriptor_t asn_DEF_ANY = { asn_generic_no_constraint, OCTET_STRING_decode_ber, OCTET_STRING_encode_der, + OCTET_STRING_decode_mder, + OCTET_STRING_encode_mder, OCTET_STRING_decode_xer_hex, ANY_encode_xer, 0, 0, @@ -27,6 +29,7 @@ asn_TYPE_descriptor_t asn_DEF_ANY = { 0, /* No PER visible constraints */ 0, 0, /* No members */ &asn_DEF_ANY_specs, + 0 /* MDER contraints (defined by asn1c compiler) */ }; diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 7e33cf6f4..c112efc27 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -591,8 +591,6 @@ OCTET_STRING_decode_mder(asn_codec_ctx_t *opt_codec_ctx, asn_dec_rval_t rval; char *data; - if (!oct) - _ASN_DECODE_FAILED; /* * Create the string if does not exist. @@ -603,14 +601,14 @@ OCTET_STRING_decode_mder(asn_codec_ctx_t *opt_codec_ctx, _ASN_DECODE_FAILED; } - if (oct->type == VARIABLE_OCTET_STRING) { + if (!oct) { st->size = 0; st->size = ((uint8_t *)buf_ptr)[0]; st->size = (st->size << 8) | ((uint8_t *)buf_ptr)[1]; rval.consumed = 2; data = (char *)buf_ptr + 2; } else { - st->size = oct->size; + st->size = *oct; rval.consumed = 0; data = (char *)buf_ptr; } @@ -641,22 +639,26 @@ OCTET_STRING_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, oct = (constr) ? (mder_octet_str *)constr : (mder_octet_str *)td->mder_constraints; - if (!st || (!st->buf && st->size)) + if (!(st && st->buf)) _ASN_ENCODE_FAILED; - if (oct && (oct->type == FIXED_OCTET_STRING) && (st->size != oct->size)) + if (oct && (st->size != *oct)) _ASN_ENCODE_FAILED; - er.encoded = 0; - if ((!oct) || (oct && (oct->type == VARIABLE_OCTET_STRING))) { - MDER_OUTPUT_INT_U16_LENGTH(st->size); + er.encoded = st->size; + if (!oct) + /* Variable Octet String */ er.encoded += 2; - } - if (cb) - /* Invoke callback for the main part of the buffer */ - _ASN_CALLBACK(st->buf, st->size); - er.encoded += st->size; + if(!cb) + _ASN_ENCODED_OK(er); + + if (!oct) + MDER_OUTPUT_INT_U16_LENGTH(st->size); + + /* Invoke callback for the main part of the buffer */ + _ASN_CALLBACK(st->buf, st->size); + _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; diff --git a/skeletons/mder_support.h b/skeletons/mder_support.h index db3ff8c6b..efe9224d8 100644 --- a/skeletons/mder_support.h +++ b/skeletons/mder_support.h @@ -77,10 +77,7 @@ typedef enum { VARIABLE_OCTET_STRING } mder_octet_str_types; -typedef struct{ - mder_octet_str_types type; - int size; -} mder_octet_str; +typedef uint16_t mder_octet_str; /* * Pre-computed MDER Subtype constraint info. From 79d67b89c51d12fad8a7c607e394754225a79dae Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Tue, 6 Apr 2010 20:59:12 +0200 Subject: [PATCH 1443/1469] Added to myself in copyright. Tested ANY DEFINED BY. --- skeletons/ANY.c | 4 +++- skeletons/ANY.h | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/skeletons/ANY.c b/skeletons/ANY.c index d898c837d..1175be5c4 100644 --- a/skeletons/ANY.c +++ b/skeletons/ANY.c @@ -1,5 +1,7 @@ /*- - * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Copyright (c) 2004 Lev Walkin . + * Copyright (c) 2010 Santiago Carot-Nemesio . + * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include diff --git a/skeletons/ANY.h b/skeletons/ANY.h index b7d92fa98..1b9d7f676 100644 --- a/skeletons/ANY.h +++ b/skeletons/ANY.h @@ -1,5 +1,7 @@ /*- - * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Copyright (c) 2004 Lev Walkin . + * Copyright (c) 2010 Santiago Carot-Nemesio . + * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef ASN_TYPE_ANY_H From 2d60251ab625ed8ababfd03e2f97c6f3c70d6d40 Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Tue, 6 Apr 2010 22:20:22 +0200 Subject: [PATCH 1444/1469] Decode sequence in mder Also changed some decode functions in order to provide an extra parameter (mder_constraints). --- libasn1compiler/asn1c_C.c | 5 ++-- skeletons/BIT_STRING.c | 13 ++++++--- skeletons/INTEGER.c | 9 ++++-- skeletons/NativeInteger.c | 9 +++--- skeletons/OCTET_STRING.c | 6 ++-- skeletons/constr_SEQUENCE.c | 58 +++++++++++++++++++++++++++++++++---- skeletons/mder_decoder.h | 3 +- 7 files changed, 82 insertions(+), 21 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 8ea0e1ce3..e094407f9 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1370,10 +1370,11 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { if(HIDE_INNER_DEFS) OUT("_%d", expr->_type_unique_index); OUT("_decode_mder(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,\n"); INDENTED( - OUT("\tvoid **structure, const void *bufptr, size_t size, int tag_mode) {\n"); + OUT("\tvoid **structure, const void *bufptr, size_t size,\n"); + OUT("\tasn_mder_contraints_t constr) {\n"); OUT("%s_%d_inherit_TYPE_descriptor(td);\n", p, expr->_type_unique_index); - OUT("return td->mder_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);\n"); + OUT("return td->mder_decoder(opt_codec_ctx, td, structure, bufptr, size, constr);\n"); ); OUT("}\n"); OUT("\n"); diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index 2360de987..b63643cb1 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -79,12 +79,15 @@ static char *_bit_pattern[16] = { asn_dec_rval_t BIT_STRING_decode_mder(asn_codec_ctx_t *opt_codec_ctx, - asn_TYPE_descriptor_t *td, - void **sptr, const void *buf_ptr, size_t size, int tag_mode) { + asn_TYPE_descriptor_t *td, void **sptr, const void *buf_ptr, + size_t size, asn_mder_contraints_t constr) { asn_dec_rval_t rval; BIT_STRING_t *bs = (BIT_STRING_t *)*sptr; - mder_restricted_bit_str *rbs = (mder_restricted_bit_str *)td->mder_constraints; + mder_restricted_bit_str *rbs; + + rbs = (constr) ? (mder_restricted_bit_str *)constr : + (mder_restricted_bit_str *)td->mder_constraints; if (!rbs || *rbs == INT_INVALID) _ASN_DECODE_FAILED; @@ -96,6 +99,8 @@ BIT_STRING_decode_mder(asn_codec_ctx_t *opt_codec_ctx, } bs->size = *rbs; + if (bs->size > size) + _ASN_DECODE_FAILED; if (bs->buf) free(bs->buf); bs->buf = CALLOC(1, bs->size); @@ -115,7 +120,7 @@ BIT_STRING_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, { asn_enc_rval_t er; BIT_STRING_t *st = (BIT_STRING_t *)sptr; - mder_restricted_bit_str *rbs = (mder_restricted_bit_str *)td->mder_constraints; + mder_restricted_bit_str *rbs; ASN_DEBUG("%s %s as BIT STRING", cb?"Encoding":"Estimating", td->name); diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 4414ac8a5..c8149ed7e 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -43,8 +43,8 @@ asn_TYPE_descriptor_t asn_DEF_INTEGER = { asn_dec_rval_t INTEGER_decode_mder(asn_codec_ctx_t *opt_codec_ctx, - asn_TYPE_descriptor_t *td, - void **sptr, const void *buf_ptr, size_t size, int tag_mode) { + asn_TYPE_descriptor_t *td, void **sptr, const void *buf_ptr, + size_t size, asn_mder_contraints_t constr) { INTEGER_t *integer = (INTEGER_t *)*sptr; asn_dec_rval_t rval; @@ -55,7 +55,8 @@ INTEGER_decode_mder(asn_codec_ctx_t *opt_codec_ctx, void *nonconstbuf; } unconst_buf; - rint = (mder_restricted_int *)td->mder_constraints; + rint = (constr) ? (mder_restricted_int *)constr : + (mder_restricted_int *)td->mder_constraints; if (!rint || *rint == INT_INVALID) { rval.code = RC_FAIL; rval.consumed = 0; @@ -73,6 +74,8 @@ INTEGER_decode_mder(asn_codec_ctx_t *opt_codec_ctx, } } + if(length > size) + _ASN_DECODE_FAILED; unconst_buf.constbuf = buf_ptr; integer->buf = (uint8_t *)unconst_buf.nonconstbuf; integer->size = length; diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index 08306b2cd..57032d630 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -201,8 +201,8 @@ NativeInteger_encode_mder(asn_TYPE_descriptor_t *sd, void *ptr, */ asn_dec_rval_t NativeInteger_decode_mder(asn_codec_ctx_t *opt_codec_ctx, - asn_TYPE_descriptor_t *td, - void **nint_ptr, const void *buf_ptr, size_t size, int tag_mode) { + asn_TYPE_descriptor_t *td, void **nint_ptr, + const void *buf_ptr, size_t size, asn_mder_contraints_t constr) { long *native = (long *)*nint_ptr; asn_dec_rval_t rval; @@ -211,7 +211,8 @@ NativeInteger_decode_mder(asn_codec_ctx_t *opt_codec_ctx, long l; int unsig; - rint = (mder_restricted_int *)td->mder_constraints; + rint = (constr) ? (mder_restricted_int *)constr : + (mder_restricted_int *)td->mder_constraints; if (!rint || *rint == INT_INVALID) { rval.code = RC_FAIL; rval.consumed = 0; @@ -229,7 +230,7 @@ NativeInteger_decode_mder(asn_codec_ctx_t *opt_codec_ctx, } rval = INTEGER_decode_mder(opt_codec_ctx, td, (void **)&tmp, - buf_ptr, size, tag_mode); + buf_ptr, size, constr); if (rval.code != RC_OK){ return rval; diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index c112efc27..801b6622e 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -583,8 +583,8 @@ OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *sptr, asn_dec_rval_t OCTET_STRING_decode_mder(asn_codec_ctx_t *opt_codec_ctx, - asn_TYPE_descriptor_t *td, - void **sptr, const void *buf_ptr, size_t size, int tag_mode) { + asn_TYPE_descriptor_t *td, void **sptr, const void *buf_ptr, + size_t size, asn_mder_contraints_t constr) { OCTET_STRING_t *st = (OCTET_STRING_t *)*sptr; mder_octet_str *oct = (mder_octet_str *)td->mder_constraints; @@ -602,6 +602,8 @@ OCTET_STRING_decode_mder(asn_codec_ctx_t *opt_codec_ctx, } if (!oct) { + if (size < 2) + _ASN_DECODE_FAILED; st->size = 0; st->size = ((uint8_t *)buf_ptr)[0]; st->size = (st->size << 8) | ((uint8_t *)buf_ptr)[1]; diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index de42ead08..b0dbdd4d0 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -596,12 +596,60 @@ SEQUENCE_encode_der(asn_TYPE_descriptor_t *td, */ asn_dec_rval_t SEQUENCE_decode_mder(asn_codec_ctx_t *opt_codec_ctx, - asn_TYPE_descriptor_t *td, - void **sptr, const void *buf_ptr, size_t size, int tag_mode) { - asn_dec_rval_t rval; + asn_TYPE_descriptor_t *td, void **sptr, + const void *ptr, size_t size, asn_mder_contraints_t constr) { - printf("TODO: Implement MDER SEQUENCE encoder"); - _ASN_DECODE_FAILED; + asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics; + asn_TYPE_member_t *elements = td->elements; + + void *st = *sptr; /* Target structure. */ + asn_dec_rval_t rval; /* Return code */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + int edx; /* SEQUENCE element's index */ + + ASN_DEBUG("Decoding %s as SEQUENCE", td->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *sptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; + void **memb_ptr2; + + if(elm->optional) + _ASN_DECODE_FAILED; + + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + /* + * A pointer to a pointer + * holding the start of the structure + */ + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + rval = elm->type->mder_decoder(opt_codec_ctx, elm->type, + memb_ptr2, ptr, size, elm->mder_constraints); + if (rval.code != RC_OK) + RETURN(RC_FAIL); + + ptr = ((const char *)ptr) + rval.consumed; + size -= rval.consumed; + consumed_myself += rval.consumed; + } + RETURN(RC_OK); } /* diff --git a/skeletons/mder_decoder.h b/skeletons/mder_decoder.h index 9b9e12ebc..b42c3df6f 100644 --- a/skeletons/mder_decoder.h +++ b/skeletons/mder_decoder.h @@ -8,6 +8,7 @@ #define _MDER_DECODER_H_ #include +#include #ifdef __cplusplus extern "C" { @@ -35,7 +36,7 @@ typedef asn_dec_rval_t (mder_type_decoder_f)( struct asn_codec_ctx_s *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, void **struct_ptr, const void *buf_ptr, size_t size, - int tag_mode); + asn_mder_contraints_t constr); #ifdef __cplusplus } From 943ec39e0c55df78adb713c953e83dcd8065e9bd Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Fri, 9 Apr 2010 16:55:22 +0200 Subject: [PATCH 1445/1469] Added support for decode sequence_of --- skeletons/constr_CHOICE.c | 15 +++++----- skeletons/constr_SEQUENCE_OF.c | 53 ++++++++++++++++++++++++++++++++++ skeletons/constr_SEQUENCE_OF.h | 4 +-- skeletons/constr_SET_OF.c | 17 ++++++----- skeletons/mder_support.h | 6 ++++ 5 files changed, 78 insertions(+), 17 deletions(-) diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index e1ce28f2d..82b2eda50 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -136,7 +136,7 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, * Restore parsing context. */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); - + /* * Start to parse where left previously */ @@ -275,7 +275,7 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, case RC_FAIL: /* Fatal error */ RETURN(rval.code); } /* switch(rval) */ - + ADVANCE(rval.consumed); } while(0); @@ -351,7 +351,7 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, /* No meaningful work here */ break; } - + RETURN(RC_OK); } @@ -451,8 +451,9 @@ CHOICE_encode_der(asn_TYPE_descriptor_t *td, void *sptr, */ asn_dec_rval_t CHOICE_decode_mder(asn_codec_ctx_t *opt_codec_ctx, - asn_TYPE_descriptor_t *td, - void **sptr, const void *buf_ptr, size_t size, int tag_mode) { + asn_TYPE_descriptor_t *td, void **sptr, const void *buf_ptr, + size_t size, asn_mder_contraints_t constr) { + asn_dec_rval_t rval; ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ @@ -991,7 +992,7 @@ CHOICE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, elm->name, td->name, rv.code); return rv; } - + asn_enc_rval_t CHOICE_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { @@ -1071,7 +1072,7 @@ CHOICE_encode_uper(asn_TYPE_descriptor_t *td, _ASN_ENCODED_OK(rval); } } - + int CHOICE_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, diff --git a/skeletons/constr_SEQUENCE_OF.c b/skeletons/constr_SEQUENCE_OF.c index 5f7d7019a..0bbd9b71f 100644 --- a/skeletons/constr_SEQUENCE_OF.c +++ b/skeletons/constr_SEQUENCE_OF.c @@ -8,6 +8,19 @@ #include #include +#undef ADVANCE +#define ADVANCE(n_bytes) do { \ + ptr = ((const char *)ptr) + n_bytes; \ + consumed_myself += n_bytes; \ + size -= n_bytes; \ +}while(0) + +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ +} while(0) /* * The DER encoder of the SEQUENCE OF type. */ @@ -88,6 +101,46 @@ SEQUENCE_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, return erval; } +asn_dec_rval_t +SEQUENCE_OF_decode_mder(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, + const void *ptr, size_t size, asn_mder_contraints_t constr) { + + asn_TYPE_member_t *elm = td->elements; + asn_anonymous_sequence_ *list = *((asn_anonymous_sequence_ **)sptr); + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + int edx, rec_size; + asn_dec_rval_t rval; /* Return code */ + + if (size < 4) + _ASN_DECODE_FAILED; + MDER_INPUT_INT_U16(list->count, ptr); + ADVANCE(2); + MDER_INPUT_INT_U16(rec_size, ptr); + ADVANCE(2); + + if (rec_size > size) + _ASN_DECODE_FAILED; + + /* Allocate memory for the return type*/ + if (list->array) + free(list->array); + list->size = rec_size * sizeof(*list->array); + list->array = CALLOC(rec_size, sizeof(*list->array)); + if (!list->array) + RETURN(RC_FAIL); + + for(edx = 0; edx < list->count; edx++) { + rval = elm->type->mder_decoder(opt_codec_ctx, elm->type, + &list->array[edx], ptr, size, constr); + if (rval.code != RC_OK) + RETURN(RC_FAIL); + ADVANCE(rval.consumed); + } + + RETURN(RC_OK); +} + /* * The MDER encoder of the SEQUENCE OF type. */ diff --git a/skeletons/constr_SEQUENCE_OF.h b/skeletons/constr_SEQUENCE_OF.h index d6797719b..df5e4784c 100644 --- a/skeletons/constr_SEQUENCE_OF.h +++ b/skeletons/constr_SEQUENCE_OF.h @@ -1,6 +1,6 @@ /*- * Copyright (c) 2010 Santiago Carot-Nemesio - * Copyright (c) 2003, 2005 Lev Walkin . + * Copyright (c) 2003, 2005 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ @@ -22,11 +22,11 @@ extern "C" { #define SEQUENCE_OF_print SET_OF_print #define SEQUENCE_OF_constraint SET_OF_constraint #define SEQUENCE_OF_decode_ber SET_OF_decode_ber -#define SEQUENCE_OF_decode_mder SET_OF_decode_mder #define SEQUENCE_OF_decode_xer SET_OF_decode_xer #define SEQUENCE_OF_decode_uper SET_OF_decode_uper der_type_encoder_f SEQUENCE_OF_encode_der; mder_type_encoder_f SEQUENCE_OF_encode_mder; +mder_type_decoder_f SEQUENCE_OF_decode_mder; xer_type_encoder_f SEQUENCE_OF_encode_xer; per_type_encoder_f SEQUENCE_OF_encode_uper; diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index 452ae4f90..f9cbc9b7b 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -86,7 +86,7 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ ASN_DEBUG("Decoding %s as SET OF", td->name); - + /* * Create the target structure if it is not present already. */ @@ -101,7 +101,7 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, * Restore parsing context. */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); - + /* * Start to parse where left previously */ @@ -201,7 +201,7 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, */ ctx->step |= 1; /* Confirm entering next microphase */ microphase2: - + /* * Invoke the member fetch routine according to member's type */ @@ -231,7 +231,7 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ctx->ptr = 0; RETURN(RC_FAIL); } /* switch(rval) */ - + ADVANCE(rval.consumed); } /* for(all list members) */ @@ -260,7 +260,7 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, PHASE_OUT(ctx); } - + RETURN(RC_OK); } @@ -459,8 +459,9 @@ SET_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, */ asn_dec_rval_t SET_OF_decode_mder(asn_codec_ctx_t *opt_codec_ctx, - asn_TYPE_descriptor_t *td, - void **nint_ptr, const void *buf_ptr, size_t size, int tag_mode) { + asn_TYPE_descriptor_t *td, void **nint_ptr, const void *buf_ptr, + size_t size, asn_mder_contraints_t constr) { + printf("TODO: Implement decode of SET_OF\n"); _ASN_DECODE_FAILED; } @@ -895,7 +896,7 @@ SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, if(!st) { st = *sptr = CALLOC(1, specs->struct_size); if(!st) _ASN_DECODE_FAILED; - } + } list = _A_SET_FROM_VOID(st); /* Figure out which constraints to use */ diff --git a/skeletons/mder_support.h b/skeletons/mder_support.h index efe9224d8..b3062756f 100644 --- a/skeletons/mder_support.h +++ b/skeletons/mder_support.h @@ -109,6 +109,12 @@ typedef void* asn_mder_contraints_t; } while (0) #endif +#define MDER_INPUT_INT_U16(_int, _buf) do { \ + _int = 0; \ + _int = ((uint8_t *)_buf)[0]; \ + _int = (_int << 8) | ((uint8_t *)_buf)[1]; \ +}while (0) + #ifdef __cplusplus } #endif From ff889ffffa497222bf7b19162670bf01a8718452 Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Fri, 9 Apr 2010 21:31:59 +0200 Subject: [PATCH 1446/1469] Removed compiling warnings and copyright added --- libasn1compiler/asn1c_C.c | 7 +++++++ skeletons/INTEGER.c | 2 +- skeletons/INTEGER.h | 1 + skeletons/NativeInteger.c | 10 ++++++---- skeletons/asn_codecs_prim.h | 1 + skeletons/constr_SEQUENCE.c | 4 +--- skeletons/constr_SEQUENCE.h | 1 + skeletons/constr_SEQUENCE_OF.c | 1 + skeletons/constr_SEQUENCE_OF.h | 1 + skeletons/constr_TYPE.h | 1 + skeletons/mder_support.h | 1 + 11 files changed, 22 insertions(+), 8 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index e094407f9..6ce7e95fc 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1,3 +1,10 @@ +/* + * Copyright (c) 2010 Jose Antonio Santos-Cadenas + * Copyright (c) 2010 Santiago Carot-Nemesio . + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ + /* * Don't look into this file. First, because it's a mess, and second, because * it's a brain of the compiler, and you don't wanna mess with brains do you? ;) diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index c8149ed7e..0f9688414 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -1,6 +1,7 @@ /*- * Copyright (c) 2003, 2004, 2005, 2006, 2007 Lev Walkin . * Copyright (c) 2010 Santiago Carot-Nemesio + * Copyright (c) 2010 Jose Antonio Santos-Cadenas . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ @@ -96,7 +97,6 @@ INTEGER_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, INTEGER_t *st = (INTEGER_t *)sptr; mder_restricted_int *rint; int size, shift; - asn_enc_rval_t r; ASN_DEBUG("%s %s as INTEGER", cb?"Encoding":"Estimating", td->name); diff --git a/skeletons/INTEGER.h b/skeletons/INTEGER.h index faf02d77f..f373295f2 100644 --- a/skeletons/INTEGER.h +++ b/skeletons/INTEGER.h @@ -1,5 +1,6 @@ /*- * Copyright (c) 2003, 2005 Lev Walkin . All rights reserved. + * Copyright (c) 2010 Jose Antonio Santos-Cadenas . * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _INTEGER_H_ diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index 57032d630..971fa6d12 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -1,6 +1,7 @@ /* * Copyright (c) 2004, 2005, 2006 Lev Walkin . * Copyright (c) 2010 Santiago Carot-Nemesio + * Copyright (c) 2010 Jose Antonio Santos-Cadenas . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ @@ -111,7 +112,7 @@ NativeInteger_decode_ber(asn_codec_ctx_t *opt_codec_ctx, tmp.size = length; if((specs&&specs->field_unsigned) - ? asn_INTEGER2ulong(&tmp, &l) + ? asn_INTEGER2ulong(&tmp, (unsigned long *)&l) : asn_INTEGER2long(&tmp, &l)) { rval.code = RC_FAIL; rval.consumed = 0; @@ -238,7 +239,8 @@ NativeInteger_decode_mder(asn_codec_ctx_t *opt_codec_ctx, GET_INT_UNSIGNED(*rint, unsig); - if((unsig) ? asn_INTEGER2ulong(tmp, &l) : asn_INTEGER2long(tmp, &l)) { + if((unsig) ? asn_INTEGER2ulong(tmp, (unsigned long *)&l) : + asn_INTEGER2long(tmp, &l)) { rval.code = RC_FAIL; rval.consumed = 0; return rval; @@ -274,7 +276,7 @@ NativeInteger_decode_xer(asn_codec_ctx_t *opt_codec_ctx, if(rval.code == RC_OK) { long l; if((specs&&specs->field_unsigned) - ? asn_INTEGER2ulong(&st, &l) + ? asn_INTEGER2ulong(&st, (unsigned long *)&l) : asn_INTEGER2long(&st, &l)) { rval.code = RC_FAIL; rval.consumed = 0; @@ -342,7 +344,7 @@ NativeInteger_decode_uper(asn_codec_ctx_t *opt_codec_ctx, &tmpintptr, pd); if(rval.code == RC_OK) { if((specs&&specs->field_unsigned) - ? asn_INTEGER2ulong(&tmpint, native) + ? asn_INTEGER2ulong(&tmpint, (unsigned long *)native) : asn_INTEGER2long(&tmpint, native)) rval.code = RC_FAIL; else diff --git a/skeletons/asn_codecs_prim.h b/skeletons/asn_codecs_prim.h index e5bf766e0..d245cbfcf 100644 --- a/skeletons/asn_codecs_prim.h +++ b/skeletons/asn_codecs_prim.h @@ -1,5 +1,6 @@ /*- * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Copyright (c) 2010 Jose Antonio Santos-Cadenas . * Redistribution and modifications are permitted subject to BSD license. */ #ifndef ASN_CODECS_PRIM_H diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index b0dbdd4d0..91dfc2764 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -1,4 +1,5 @@ /*- + * Copyright (c) 2010 Jose Antonio Santos-Cadenas . * Copyright (c) 2010 Santiago Carot-Nemesio * Copyright (c) 2003, 2004, 2005, 2006, 2007 Lev Walkin . * All rights reserved. @@ -600,7 +601,6 @@ SEQUENCE_decode_mder(asn_codec_ctx_t *opt_codec_ctx, const void *ptr, size_t size, asn_mder_contraints_t constr) { asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics; - asn_TYPE_member_t *elements = td->elements; void *st = *sptr; /* Target structure. */ asn_dec_rval_t rval; /* Return code */ @@ -660,9 +660,7 @@ SEQUENCE_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, asn_mder_contraints_t constr, asn_app_consume_bytes_f *cb, void *app_key) { - size_t computed_size = 0; asn_enc_rval_t erval; - ssize_t ret; int edx; ASN_DEBUG("%s %s as SEQUENCE", diff --git a/skeletons/constr_SEQUENCE.h b/skeletons/constr_SEQUENCE.h index 9eb299fad..280f4dd25 100644 --- a/skeletons/constr_SEQUENCE.h +++ b/skeletons/constr_SEQUENCE.h @@ -1,5 +1,6 @@ /*- * Copyright (c) 2010 Santiago Carot-Nemesio + * Copyright (c) 2010 Jose Antonio Santos-Cadenas * Copyright (c) 2003, 2004 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. diff --git a/skeletons/constr_SEQUENCE_OF.c b/skeletons/constr_SEQUENCE_OF.c index 0bbd9b71f..9a165dc9e 100644 --- a/skeletons/constr_SEQUENCE_OF.c +++ b/skeletons/constr_SEQUENCE_OF.c @@ -1,4 +1,5 @@ /*- + * Copyright (c) 2010 Jose Antonio Santos Cadenas * Copyright (c) 2010 Santiago Carot-Nemesio * Copyright (c) 2003, 2004, 2006 Lev Walkin . * All rights reserved. diff --git a/skeletons/constr_SEQUENCE_OF.h b/skeletons/constr_SEQUENCE_OF.h index df5e4784c..e17839600 100644 --- a/skeletons/constr_SEQUENCE_OF.h +++ b/skeletons/constr_SEQUENCE_OF.h @@ -1,4 +1,5 @@ /*- + * Copyright (c) 2010 Jose Antonio Santos Cadenas * Copyright (c) 2010 Santiago Carot-Nemesio * Copyright (c) 2003, 2005 Lev Walkin . * All rights reserved. diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index 0644f2835..73a3b8e21 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -1,6 +1,7 @@ /*- * Copyright (c) 2003, 2004, 2005, 2006 Lev Walkin . * Copyright (c) 2010 Santiago Carot-Nemesio . + * Copyright (c) 2010 Jose Antonio Santos-Cadenas . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ diff --git a/skeletons/mder_support.h b/skeletons/mder_support.h index b3062756f..126bf943e 100644 --- a/skeletons/mder_support.h +++ b/skeletons/mder_support.h @@ -1,4 +1,5 @@ /* + * Copyright (c) 2010 Jose Antonio Santos-Cadenas . * Copyright (c) 2010 Santiago Carot-Nemesio . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. From 996d182188d5612cc84a657e7a3a859eb2d43733 Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Sat, 10 Apr 2010 20:18:26 +0200 Subject: [PATCH 1447/1469] Added support for choice decoding in mder --- skeletons/constr_CHOICE.c | 56 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 3 deletions(-) diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 82b2eda50..bebd726ab 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -43,6 +43,14 @@ consumed_myself += num; \ } while(0) +#undef ADVANCE_MDER +#define ADVANCE_MDER(num_bytes) do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num;\ + size -= num; \ + consumed_myself += num; \ + } while(0) + /* * Switch to the next phase of parsing. */ @@ -451,14 +459,56 @@ CHOICE_encode_der(asn_TYPE_descriptor_t *td, void *sptr, */ asn_dec_rval_t CHOICE_decode_mder(asn_codec_ctx_t *opt_codec_ctx, - asn_TYPE_descriptor_t *td, void **sptr, const void *buf_ptr, + asn_TYPE_descriptor_t *td, void **sptr, const void *ptr, size_t size, asn_mder_contraints_t constr) { + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; asn_dec_rval_t rval; ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + int *presentp, present_tag, i; + uint16_t comp_size; + asn_TYPE_member_t *elm; /* CHOICE element */ + void *memb_ptr; - printf("TODO: Decode CHOICE\n"); - RETURN(RC_FAIL); + if (!*sptr) { + /* Alloc memory for the target structure */ + *sptr = CALLOC(1, specs->struct_size); + if (!*sptr) + RETURN(RC_FAIL); + } + + if(size < 4) + RETURN(RC_FAIL); + MDER_INPUT_INT_U16(present_tag, ptr); + ADVANCE_MDER(2); + + presentp = (int *)((*(const char **)sptr) + specs->pres_offset); + for (i = 0; i < td->elements_count; i++) { + if (specs->sorted_tags[i] == present_tag) { + *presentp = i + 1; + break; + } + } + if(*presentp <= 0 || *presentp > td->elements_count) + RETURN(RC_FAIL); + + MDER_INPUT_INT_U16(comp_size, ptr); + ADVANCE_MDER(2); + if (comp_size > size) + _ASN_DECODE_FAILED; + + elm = &td->elements[*presentp - 1]; + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)(*(char **)sptr + elm->memb_offset); + if(memb_ptr == 0) + /* All elements are mandatory in MDER */ + _ASN_DECODE_FAILED; + } else + memb_ptr = (void *)(*(char **)sptr + elm->memb_offset); + rval = elm->type->mder_decoder(opt_codec_ctx, elm->type, &memb_ptr, ptr, + size, elm->mder_constraints); + consumed_myself += rval.consumed; + RETURN(rval.code); } /* * The MDER encoder of the CHOICE type. From ccdea9b9dc66297f61d34385b74aef2fca013b29 Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Wed, 14 Apr 2010 00:02:14 +0200 Subject: [PATCH 1448/1469] Added functions to notify error in non supported mder types --- skeletons/file-dependencies | 2 +- skeletons/mder_decoder.c | 9 +++++++++ skeletons/mder_decoder.h | 2 ++ skeletons/mder_encoder.c | 8 ++++++++ skeletons/mder_encoder.h | 2 ++ 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/skeletons/file-dependencies b/skeletons/file-dependencies index 41f87f476..9701217c3 100644 --- a/skeletons/file-dependencies +++ b/skeletons/file-dependencies @@ -27,7 +27,7 @@ PrintableString.h PrintableString.c REAL.h REAL.c INTEGER.h RELATIVE-OID.h RELATIVE-OID.c OBJECT_IDENTIFIER.h T61String.h T61String.c -TeletexString.h TeletexString.c +TeletexString.h TeletexString.c UTCTime.h UTCTime.c GeneralizedTime.h UTF8String.h UTF8String.c UniversalString.h UniversalString.c UTF8String.h diff --git a/skeletons/mder_decoder.c b/skeletons/mder_decoder.c index 2797e4fa0..4fdaa25d6 100644 --- a/skeletons/mder_decoder.c +++ b/skeletons/mder_decoder.c @@ -40,3 +40,12 @@ mder_decode(asn_codec_ctx_t *opt_codec_ctx, 0 /* Default tag mode is 0 */ ); } + +asn_dec_rval_t +NON_SUP_decode_mder(struct asn_codec_ctx_s *opt_codec_ctx, + struct asn_TYPE_descriptor_s *td, + void **struct_ptr, const void *buf_ptr, size_t size, + asn_mder_contraints_t constr) { + + _ASN_DECODE_FAILED; +} diff --git a/skeletons/mder_decoder.h b/skeletons/mder_decoder.h index b42c3df6f..42559740f 100644 --- a/skeletons/mder_decoder.h +++ b/skeletons/mder_decoder.h @@ -38,6 +38,8 @@ typedef asn_dec_rval_t (mder_type_decoder_f)( void **struct_ptr, const void *buf_ptr, size_t size, asn_mder_contraints_t constr); +mder_type_decoder_f NON_SUP_decode_mder; + #ifdef __cplusplus } #endif diff --git a/skeletons/mder_encoder.c b/skeletons/mder_encoder.c index aae95d276..542cd88ca 100644 --- a/skeletons/mder_encoder.c +++ b/skeletons/mder_encoder.c @@ -60,3 +60,11 @@ asn_enc_rval_t mder_encode_to_buffer( } return ec; } + +asn_enc_rval_t +NON_SUP_encode_mder(struct asn_TYPE_descriptor_s *td, void *sptr, + asn_mder_contraints_t constr, + asn_app_consume_bytes_f *consume_bytes_cb, void *app_key) { + + _ASN_ENCODE_FAILED; +} diff --git a/skeletons/mder_encoder.h b/skeletons/mder_encoder.h index 0af2ea538..2b19733ef 100644 --- a/skeletons/mder_encoder.h +++ b/skeletons/mder_encoder.h @@ -44,6 +44,8 @@ typedef asn_enc_rval_t (mder_type_encoder_f)( void *app_key /* Arbitrary callback argument */ ); +mder_type_encoder_f NON_SUP_encode_mder; + #ifdef __cplusplus } #endif From 9c10dadfab69c9dd9e91b49a650724da372af0a1 Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Wed, 14 Apr 2010 00:21:01 +0200 Subject: [PATCH 1449/1469] Added mder encoding to OBJECT_IDENTIFIER & RELATIVE-OID --- skeletons/OBJECT_IDENTIFIER.c | 21 ++++++++++++++++++--- skeletons/OBJECT_IDENTIFIER.h | 22 +++++++++++++--------- skeletons/RELATIVE-OID.c | 20 ++++++++++++++++++-- skeletons/RELATIVE-OID.h | 4 ++++ 4 files changed, 53 insertions(+), 14 deletions(-) diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index 61f558deb..d9a4bad24 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -22,8 +22,8 @@ asn_TYPE_descriptor_t asn_DEF_OBJECT_IDENTIFIER = { OBJECT_IDENTIFIER_constraint, ber_decode_primitive, der_encode_primitive, - 0, /* TODO insert mder encoder */ - 0, /* TODO insert mder decoder */ + OBJECT_IDENTIFIER_encode_mder, + OBJECT_IDENTIFIER_decode_mder, OBJECT_IDENTIFIER_decode_xer, OBJECT_IDENTIFIER_encode_xer, OCTET_STRING_decode_uper, @@ -92,7 +92,7 @@ OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed in * type, there is still possible to fit it when there * are few unused high bits in the arc value * representaion. - * + * * Moreover, there is a possibility that the * number could actually fit the arc space, given * that add is negative, but we don't handle @@ -728,4 +728,19 @@ OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length, } } +asn_enc_rval_t +OBJECT_IDENTIFIER_encode_mder(struct asn_TYPE_descriptor_s *td, void *sptr, + asn_mder_contraints_t constr, + asn_app_consume_bytes_f *consume_bytes_cb, void *app_key) { + + _ASN_ENCODE_FAILED; +} +asn_dec_rval_t +OBJECT_IDENTIFIER_decode_mder(struct asn_codec_ctx_s *opt_codec_ctx, + struct asn_TYPE_descriptor_s *td, + void **struct_ptr, const void *buf_ptr, size_t size, + asn_mder_contraints_t constr) { + + _ASN_DECODE_FAILED; +} diff --git a/skeletons/OBJECT_IDENTIFIER.h b/skeletons/OBJECT_IDENTIFIER.h index 2bb5d0323..410b0a28f 100644 --- a/skeletons/OBJECT_IDENTIFIER.h +++ b/skeletons/OBJECT_IDENTIFIER.h @@ -8,6 +8,8 @@ #include #include +#include +#include #ifdef __cplusplus extern "C" { @@ -22,6 +24,8 @@ asn_constr_check_f OBJECT_IDENTIFIER_constraint; der_type_encoder_f OBJECT_IDENTIFIER_encode_der; xer_type_decoder_f OBJECT_IDENTIFIER_decode_xer; xer_type_encoder_f OBJECT_IDENTIFIER_encode_xer; +mder_type_decoder_f OBJECT_IDENTIFIER_decode_mder; +mder_type_encoder_f OBJECT_IDENTIFIER_encode_mder; /********************************** * Some handy conversion routines * @@ -30,7 +34,7 @@ xer_type_encoder_f OBJECT_IDENTIFIER_encode_xer; /* * This function fills an (_arcs) array with OBJECT IDENTIFIER arcs * up to specified (_arc_slots) elements. - * + * * EXAMPLE: * void print_arcs(OBJECT_IDENTIFIER_t *oid) { * unsigned long fixed_arcs[10]; // Try with fixed space first @@ -39,7 +43,7 @@ xer_type_encoder_f OBJECT_IDENTIFIER_encode_xer; * int arc_slots = sizeof(fixed_arcs)/sizeof(fixed_arcs[0]); // 10 * int count; // Real number of arcs. * int i; - * + * * count = OBJECT_IDENTIFIER_get_arcs(oid, arcs, * arc_type_size, arc_slots); * // If necessary, reallocate arcs array and try again. @@ -51,20 +55,20 @@ xer_type_encoder_f OBJECT_IDENTIFIER_encode_xer; * arc_type_size, arc_slots); * assert(count == arc_slots); * } - * + * * // Print the contents of the arcs array. * for(i = 0; i < count; i++) * printf("%d\n", arcs[i]); - * + * * // Avoid memory leak. * if(arcs != fixed_arcs) free(arcs); * } - * + * * RETURN VALUES: * -1/EINVAL: Invalid arguments (oid is missing) * -1/ERANGE: One or more arcs have value out of array cell type range. * >=0: Number of arcs contained in the OBJECT IDENTIFIER - * + * * WARNING: The function always returns the real number of arcs, * even if there is no sufficient (_arc_slots) provided. */ @@ -108,14 +112,14 @@ ssize_t OBJECT_IDENTIFIER__dump_arc(uint8_t *arcbuf, int arclen, int add, * * If (oid_txt_length == -1), the strlen() will be invoked to determine the * size of the (oid_text) string. - * + * * After return, the optional (opt_oid_text_end) is set to the character after * the last parsed one. (opt_oid_text_end) is never less than (oid_text). - * + * * RETURN VALUES: * -1: Parse error. * >= 0: Number of arcs contained in the OBJECT IDENTIFIER. - * + * * WARNING: The function always returns the real number of arcs, * even if there is no sufficient (_arc_slots) provided. * This is useful for (_arc_slots) value estimation. diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index 4cf946023..1b636178a 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -24,8 +24,8 @@ asn_TYPE_descriptor_t asn_DEF_RELATIVE_OID = { asn_generic_no_constraint, ber_decode_primitive, der_encode_primitive, - 0, /* TODO insert mder encoder */ - 0, /* TODO insert mder decoder */ + RELATIVE_OID_encode_mder, + RELATIVE_OID_decode_mder, RELATIVE_OID_decode_xer, RELATIVE_OID_encode_xer, OCTET_STRING_decode_uper, @@ -242,3 +242,19 @@ RELATIVE_OID_set_arcs(RELATIVE_OID_t *roid, void *arcs, unsigned int arc_type_si return 0; } +asn_enc_rval_t +RELATIVE_OID_encode_mder(struct asn_TYPE_descriptor_s *td, void *sptr, + asn_mder_contraints_t constr, + asn_app_consume_bytes_f *consume_bytes_cb, void *app_key) { + + _ASN_ENCODE_FAILED; +} + +asn_dec_rval_t +RELATIVE_OID_decode_mder(struct asn_codec_ctx_s *opt_codec_ctx, + struct asn_TYPE_descriptor_s *td, + void **struct_ptr, const void *buf_ptr, size_t size, + asn_mder_contraints_t constr) { + + _ASN_DECODE_FAILED; +} diff --git a/skeletons/RELATIVE-OID.h b/skeletons/RELATIVE-OID.h index 2235cfddf..834c681a2 100644 --- a/skeletons/RELATIVE-OID.h +++ b/skeletons/RELATIVE-OID.h @@ -6,6 +6,8 @@ #define _RELATIVE_OID_H_ #include +#include +#include #ifdef __cplusplus extern "C" { @@ -19,6 +21,8 @@ extern asn_TYPE_descriptor_t asn_DEF_RELATIVE_OID; asn_struct_print_f RELATIVE_OID_print; xer_type_decoder_f RELATIVE_OID_decode_xer; xer_type_encoder_f RELATIVE_OID_encode_xer; +mder_type_decoder_f RELATIVE_OID_decode_mder; +mder_type_encoder_f RELATIVE_OID_encode_mder; /********************************** * Some handy conversion routines * From ead80644dd05dddd82336f828d45b54d0d380556 Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Wed, 14 Apr 2010 20:03:13 +0200 Subject: [PATCH 1450/1469] Added mder error for all non supported types --- skeletons/BMPString.c | 2 ++ skeletons/BOOLEAN.c | 4 +++- skeletons/ENUMERATED.c | 2 ++ skeletons/GeneralString.c | 2 ++ skeletons/GeneralizedTime.c | 4 +++- skeletons/GraphicString.c | 2 ++ skeletons/IA5String.c | 2 ++ skeletons/ISO646String.c | 2 ++ skeletons/NULL.c | 12 ++---------- skeletons/NULL.h | 1 - skeletons/NativeEnumerated.c | 4 ++-- skeletons/NativeReal.c | 6 ++++-- skeletons/NumericString.c | 2 ++ skeletons/OBJECT_IDENTIFIER.c | 2 +- skeletons/ObjectDescriptor.c | 2 ++ skeletons/PrintableString.c | 4 +++- skeletons/REAL.c | 2 ++ skeletons/RELATIVE-OID.c | 2 +- skeletons/T61String.c | 2 ++ skeletons/TeletexString.c | 2 ++ skeletons/UTCTime.c | 2 ++ skeletons/UTF8String.c | 2 ++ skeletons/UniversalString.c | 2 ++ skeletons/VideotexString.c | 2 ++ skeletons/VisibleString.c | 2 ++ 25 files changed, 51 insertions(+), 20 deletions(-) diff --git a/skeletons/BMPString.c b/skeletons/BMPString.c index 072bd075f..cf76b2df7 100644 --- a/skeletons/BMPString.c +++ b/skeletons/BMPString.c @@ -31,6 +31,8 @@ asn_TYPE_descriptor_t asn_DEF_BMPString = { asn_generic_no_constraint, /* No constraint by default */ OCTET_STRING_decode_ber, OCTET_STRING_encode_der, + NON_SUP_decode_mder, + NON_SUP_encode_mder, BMPString_decode_xer, /* Convert from UTF-8 */ BMPString_encode_xer, /* Convert to UTF-8 */ OCTET_STRING_decode_uper, diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c index 2c2bbcf2f..28974506a 100644 --- a/skeletons/BOOLEAN.c +++ b/skeletons/BOOLEAN.c @@ -20,6 +20,8 @@ asn_TYPE_descriptor_t asn_DEF_BOOLEAN = { asn_generic_no_constraint, BOOLEAN_decode_ber, BOOLEAN_encode_der, + NON_SUP_decode_mder, + NON_SUP_encode_mder, BOOLEAN_decode_xer, BOOLEAN_encode_xer, BOOLEAN_decode_uper, /* Unaligned PER decoder */ @@ -96,7 +98,7 @@ BOOLEAN_decode_ber(asn_codec_ctx_t *opt_codec_ctx, ASN_DEBUG("Took %ld/%ld bytes to encode %s, value=%d", (long)rval.consumed, (long)length, td->name, *st); - + return rval; } diff --git a/skeletons/ENUMERATED.c b/skeletons/ENUMERATED.c index 90761a2d7..c525430e3 100644 --- a/skeletons/ENUMERATED.c +++ b/skeletons/ENUMERATED.c @@ -22,6 +22,8 @@ asn_TYPE_descriptor_t asn_DEF_ENUMERATED = { asn_generic_no_constraint, ber_decode_primitive, INTEGER_encode_der, /* Implemented in terms of INTEGER */ + NON_SUP_decode_mder, + NON_SUP_encode_mder, INTEGER_decode_xer, /* This is temporary! */ INTEGER_encode_xer, ENUMERATED_decode_uper, /* Unaligned PER decoder */ diff --git a/skeletons/GeneralString.c b/skeletons/GeneralString.c index 01b606bed..260a66caf 100644 --- a/skeletons/GeneralString.c +++ b/skeletons/GeneralString.c @@ -20,6 +20,8 @@ asn_TYPE_descriptor_t asn_DEF_GeneralString = { asn_generic_unknown_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, + NON_SUP_decode_mder, + NON_SUP_encode_mder, OCTET_STRING_decode_xer_hex, OCTET_STRING_encode_xer, OCTET_STRING_decode_uper, /* Implemented in terms of OCTET STRING */ diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 9d683efe4..7f59ebedb 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -163,6 +163,8 @@ asn_TYPE_descriptor_t asn_DEF_GeneralizedTime = { GeneralizedTime_constraint, /* Check validity of time */ OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ GeneralizedTime_encode_der, + NON_SUP_decode_mder, + NON_SUP_encode_mder, OCTET_STRING_decode_xer_utf8, GeneralizedTime_encode_xer, OCTET_STRING_decode_uper, @@ -253,7 +255,7 @@ GeneralizedTime_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, gt = asn_time2GT_frac(0, &tm, fv, fd, 1); if(!gt) _ASN_ENCODE_FAILED; - + rv = OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags, cb, app_key); ASN_STRUCT_FREE(asn_DEF_GeneralizedTime, gt); diff --git a/skeletons/GraphicString.c b/skeletons/GraphicString.c index 7d59d5224..6cbb58f8e 100644 --- a/skeletons/GraphicString.c +++ b/skeletons/GraphicString.c @@ -20,6 +20,8 @@ asn_TYPE_descriptor_t asn_DEF_GraphicString = { asn_generic_unknown_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, + NON_SUP_decode_mder, + NON_SUP_encode_mder, OCTET_STRING_decode_xer_hex, OCTET_STRING_encode_xer, /* Can't expect it to be ASCII/UTF8 */ OCTET_STRING_decode_uper, /* Implemented in terms of OCTET STRING */ diff --git a/skeletons/IA5String.c b/skeletons/IA5String.c index 02ecd3ee7..66ce56c7c 100644 --- a/skeletons/IA5String.c +++ b/skeletons/IA5String.c @@ -25,6 +25,8 @@ asn_TYPE_descriptor_t asn_DEF_IA5String = { IA5String_constraint, /* Constraint on the alphabet */ OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, + NON_SUP_decode_mder, + NON_SUP_encode_mder, OCTET_STRING_decode_xer_utf8, OCTET_STRING_encode_xer_utf8, OCTET_STRING_decode_uper, diff --git a/skeletons/ISO646String.c b/skeletons/ISO646String.c index d6ded0efa..efeeba8ad 100644 --- a/skeletons/ISO646String.c +++ b/skeletons/ISO646String.c @@ -25,6 +25,8 @@ asn_TYPE_descriptor_t asn_DEF_ISO646String = { VisibleString_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, + NON_SUP_decode_mder, + NON_SUP_encode_mder, OCTET_STRING_decode_xer_utf8, OCTET_STRING_encode_xer_utf8, OCTET_STRING_decode_uper, diff --git a/skeletons/NULL.c b/skeletons/NULL.c index d71f426c0..d23c27428 100644 --- a/skeletons/NULL.c +++ b/skeletons/NULL.c @@ -21,7 +21,8 @@ asn_TYPE_descriptor_t asn_DEF_NULL = { asn_generic_no_constraint, BOOLEAN_decode_ber, /* Implemented in terms of BOOLEAN */ NULL_encode_der, /* Special handling of DER encoding */ - NULL_encode_mder, + NON_SUP_decode_mder, + NON_SUP_encode_mder, NULL_decode_xer, NULL_encode_xer, NULL_decode_uper, /* Unaligned PER decoder */ @@ -37,15 +38,6 @@ asn_TYPE_descriptor_t asn_DEF_NULL = { 0 /* MDER contraints (defined by asn1c compiler) */ }; -asn_enc_rval_t -NULL_encode_mder(asn_TYPE_descriptor_t *td, void *ptr, - int tag_mode, ber_tlv_tag_t tag, - asn_app_consume_bytes_f *cb, void *app_key) { - - printf("TODO: Encode MDER NULL"); - _ASN_ENCODE_FAILED; -} - asn_enc_rval_t NULL_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, diff --git a/skeletons/NULL.h b/skeletons/NULL.h index 55aced96b..d09368d20 100644 --- a/skeletons/NULL.h +++ b/skeletons/NULL.h @@ -22,7 +22,6 @@ extern asn_TYPE_descriptor_t asn_DEF_NULL; asn_struct_print_f NULL_print; der_type_encoder_f NULL_encode_der; -mder_type_encoder_f NULL_encode_mder; xer_type_decoder_f NULL_decode_xer; xer_type_encoder_f NULL_encode_xer; per_type_decoder_f NULL_decode_uper; diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c index 5c95455e5..68f232ae6 100644 --- a/skeletons/NativeEnumerated.c +++ b/skeletons/NativeEnumerated.c @@ -28,8 +28,8 @@ asn_TYPE_descriptor_t asn_DEF_NativeEnumerated = { asn_generic_no_constraint, NativeInteger_decode_ber, NativeInteger_encode_der, - NativeInteger_decode_mder, - NativeInteger_encode_mder, + NON_SUP_decode_mder, + NON_SUP_encode_mder, NativeInteger_decode_xer, NativeEnumerated_encode_xer, NativeEnumerated_decode_uper, diff --git a/skeletons/NativeReal.c b/skeletons/NativeReal.c index a1ff91e18..6252c6aca 100644 --- a/skeletons/NativeReal.c +++ b/skeletons/NativeReal.c @@ -28,6 +28,8 @@ asn_TYPE_descriptor_t asn_DEF_NativeReal = { asn_generic_no_constraint, NativeReal_decode_ber, NativeReal_encode_der, + NON_SUP_decode_mder, + NON_SUP_encode_mder, NativeReal_decode_xer, NativeReal_encode_xer, NativeReal_decode_uper, @@ -145,7 +147,7 @@ NativeReal_encode_der(asn_TYPE_descriptor_t *td, void *ptr, erval.structure_ptr = ptr; return erval; } - + /* Encode a fake REAL */ erval = der_encode_primitive(td, &tmp, tag_mode, tag, cb, app_key); if(erval.encoded == -1) { @@ -216,7 +218,7 @@ NativeReal_encode_uper(asn_TYPE_descriptor_t *td, if(asn_double2REAL(&tmp, Dbl)) _ASN_ENCODE_FAILED; - + /* Encode a DER REAL */ erval = OCTET_STRING_encode_uper(td, NULL, &tmp, po); if(erval.encoded == -1) diff --git a/skeletons/NumericString.c b/skeletons/NumericString.c index 50fe4491b..ce90b98fb 100644 --- a/skeletons/NumericString.c +++ b/skeletons/NumericString.c @@ -45,6 +45,8 @@ asn_TYPE_descriptor_t asn_DEF_NumericString = { NumericString_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, + NON_SUP_decode_mder, + NON_SUP_encode_mder, OCTET_STRING_decode_xer_utf8, OCTET_STRING_encode_xer_utf8, OCTET_STRING_decode_uper, diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index d9a4bad24..f2096d475 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -22,8 +22,8 @@ asn_TYPE_descriptor_t asn_DEF_OBJECT_IDENTIFIER = { OBJECT_IDENTIFIER_constraint, ber_decode_primitive, der_encode_primitive, - OBJECT_IDENTIFIER_encode_mder, OBJECT_IDENTIFIER_decode_mder, + OBJECT_IDENTIFIER_encode_mder, OBJECT_IDENTIFIER_decode_xer, OBJECT_IDENTIFIER_encode_xer, OCTET_STRING_decode_uper, diff --git a/skeletons/ObjectDescriptor.c b/skeletons/ObjectDescriptor.c index cd8e8a386..7fe0d84ea 100644 --- a/skeletons/ObjectDescriptor.c +++ b/skeletons/ObjectDescriptor.c @@ -20,6 +20,8 @@ asn_TYPE_descriptor_t asn_DEF_ObjectDescriptor = { asn_generic_unknown_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, + NON_SUP_decode_mder, + NON_SUP_encode_mder, OCTET_STRING_decode_xer_utf8, OCTET_STRING_encode_xer_utf8, OCTET_STRING_decode_uper, diff --git a/skeletons/PrintableString.c b/skeletons/PrintableString.c index c8ee3ae3c..1e259db97 100644 --- a/skeletons/PrintableString.c +++ b/skeletons/PrintableString.c @@ -19,7 +19,7 @@ static int _PrintableString_alphabet[256] = { 0,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, /* abcdefghijklmno */ 64,65,66,67,68,69,70,71,72,73,74, 0, 0, 0, 0, 0, /* pqrstuvwxyz */ }; -static int _PrintableString_code2value[74] = { +static int _PrintableString_code2value[74] = { 32,39,40,41,43,44,45,46,47,48,49,50,51,52,53,54, 55,56,57,58,61,63,65,66,67,68,69,70,71,72,73,74, 75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90, @@ -55,6 +55,8 @@ asn_TYPE_descriptor_t asn_DEF_PrintableString = { PrintableString_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, + NON_SUP_decode_mder, + NON_SUP_encode_mder, OCTET_STRING_decode_xer_utf8, OCTET_STRING_encode_xer_utf8, OCTET_STRING_decode_uper, diff --git a/skeletons/REAL.c b/skeletons/REAL.c index 5e93ac8ac..1d79bf587 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -41,6 +41,8 @@ asn_TYPE_descriptor_t asn_DEF_REAL = { asn_generic_no_constraint, ber_decode_primitive, der_encode_primitive, + NON_SUP_decode_mder, + NON_SUP_encode_mder, REAL_decode_xer, REAL_encode_xer, REAL_decode_uper, diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index 1b636178a..499c0ac17 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -24,8 +24,8 @@ asn_TYPE_descriptor_t asn_DEF_RELATIVE_OID = { asn_generic_no_constraint, ber_decode_primitive, der_encode_primitive, - RELATIVE_OID_encode_mder, RELATIVE_OID_decode_mder, + RELATIVE_OID_encode_mder, RELATIVE_OID_decode_xer, RELATIVE_OID_encode_xer, OCTET_STRING_decode_uper, diff --git a/skeletons/T61String.c b/skeletons/T61String.c index 98461bbbf..5237b6404 100644 --- a/skeletons/T61String.c +++ b/skeletons/T61String.c @@ -20,6 +20,8 @@ asn_TYPE_descriptor_t asn_DEF_T61String = { asn_generic_unknown_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, + NON_SUP_decode_mder, + NON_SUP_encode_mder, OCTET_STRING_decode_xer_hex, OCTET_STRING_encode_xer, OCTET_STRING_decode_uper, diff --git a/skeletons/TeletexString.c b/skeletons/TeletexString.c index cc2acada7..fa1c9b633 100644 --- a/skeletons/TeletexString.c +++ b/skeletons/TeletexString.c @@ -20,6 +20,8 @@ asn_TYPE_descriptor_t asn_DEF_TeletexString = { asn_generic_unknown_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, + NON_SUP_decode_mder, + NON_SUP_encode_mder, OCTET_STRING_decode_xer_hex, OCTET_STRING_encode_xer, OCTET_STRING_decode_uper, diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c index 0abe1db74..af82de7ef 100644 --- a/skeletons/UTCTime.c +++ b/skeletons/UTCTime.c @@ -36,6 +36,8 @@ asn_TYPE_descriptor_t asn_DEF_UTCTime = { UTCTime_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + NON_SUP_decode_mder, + NON_SUP_encode_mder, OCTET_STRING_decode_xer_utf8, UTCTime_encode_xer, OCTET_STRING_decode_uper, diff --git a/skeletons/UTF8String.c b/skeletons/UTF8String.c index 7e73d7759..9f3207e64 100644 --- a/skeletons/UTF8String.c +++ b/skeletons/UTF8String.c @@ -21,6 +21,8 @@ asn_TYPE_descriptor_t asn_DEF_UTF8String = { UTF8String_constraint, /* Check for invalid codes, etc. */ OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, + NON_SUP_decode_mder, + NON_SUP_encode_mder, OCTET_STRING_decode_xer_utf8, OCTET_STRING_encode_xer_utf8, OCTET_STRING_decode_uper, diff --git a/skeletons/UniversalString.c b/skeletons/UniversalString.c index 7d16781f5..74448e93e 100644 --- a/skeletons/UniversalString.c +++ b/skeletons/UniversalString.c @@ -31,6 +31,8 @@ asn_TYPE_descriptor_t asn_DEF_UniversalString = { asn_generic_no_constraint, OCTET_STRING_decode_ber, OCTET_STRING_encode_der, + NON_SUP_decode_mder, + NON_SUP_encode_mder, UniversalString_decode_xer, /* Convert from UTF-8 */ UniversalString_encode_xer, /* Convert into UTF-8 */ OCTET_STRING_decode_uper, diff --git a/skeletons/VideotexString.c b/skeletons/VideotexString.c index df7233e5e..8e244fa95 100644 --- a/skeletons/VideotexString.c +++ b/skeletons/VideotexString.c @@ -20,6 +20,8 @@ asn_TYPE_descriptor_t asn_DEF_VideotexString = { asn_generic_unknown_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, + NON_SUP_decode_mder, + NON_SUP_encode_mder, OCTET_STRING_decode_xer_hex, OCTET_STRING_encode_xer, OCTET_STRING_decode_uper, /* Implemented in terms of OCTET STRING */ diff --git a/skeletons/VisibleString.c b/skeletons/VisibleString.c index 3487b6f93..5887b9e6d 100644 --- a/skeletons/VisibleString.c +++ b/skeletons/VisibleString.c @@ -25,6 +25,8 @@ asn_TYPE_descriptor_t asn_DEF_VisibleString = { VisibleString_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, + NON_SUP_decode_mder, + NON_SUP_encode_mder, OCTET_STRING_decode_xer_utf8, OCTET_STRING_encode_xer_utf8, OCTET_STRING_decode_uper, From 398211c6245f600d25cce1623c364244a26b6b5d Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Thu, 15 Apr 2010 19:03:47 +0200 Subject: [PATCH 1451/1469] Fixed warning in mder decode functions related with const pointers --- skeletons/OCTET_STRING.c | 10 +++++----- skeletons/constr_CHOICE.c | 2 +- skeletons/mder_support.h | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 801b6622e..97a9f3eb9 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -589,7 +589,7 @@ OCTET_STRING_decode_mder(asn_codec_ctx_t *opt_codec_ctx, OCTET_STRING_t *st = (OCTET_STRING_t *)*sptr; mder_octet_str *oct = (mder_octet_str *)td->mder_constraints; asn_dec_rval_t rval; - char *data; + const char *data; /* @@ -605,14 +605,14 @@ OCTET_STRING_decode_mder(asn_codec_ctx_t *opt_codec_ctx, if (size < 2) _ASN_DECODE_FAILED; st->size = 0; - st->size = ((uint8_t *)buf_ptr)[0]; - st->size = (st->size << 8) | ((uint8_t *)buf_ptr)[1]; + st->size = ((const uint8_t *)buf_ptr)[0]; + st->size = (st->size << 8) | ((const uint8_t *)buf_ptr)[1]; rval.consumed = 2; - data = (char *)buf_ptr + 2; + data = (const char *)buf_ptr + 2; } else { st->size = *oct; rval.consumed = 0; - data = (char *)buf_ptr; + data = (const char *)buf_ptr; } if (size < (st->size + rval.consumed)) _ASN_DECODE_FAILED; diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index bebd726ab..a6f0fb9f3 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -482,7 +482,7 @@ CHOICE_decode_mder(asn_codec_ctx_t *opt_codec_ctx, MDER_INPUT_INT_U16(present_tag, ptr); ADVANCE_MDER(2); - presentp = (int *)((*(const char **)sptr) + specs->pres_offset); + presentp = (int *)((*(char **)sptr) + specs->pres_offset); for (i = 0; i < td->elements_count; i++) { if (specs->sorted_tags[i] == present_tag) { *presentp = i + 1; diff --git a/skeletons/mder_support.h b/skeletons/mder_support.h index 126bf943e..69880c94e 100644 --- a/skeletons/mder_support.h +++ b/skeletons/mder_support.h @@ -110,10 +110,10 @@ typedef void* asn_mder_contraints_t; } while (0) #endif -#define MDER_INPUT_INT_U16(_int, _buf) do { \ - _int = 0; \ - _int = ((uint8_t *)_buf)[0]; \ - _int = (_int << 8) | ((uint8_t *)_buf)[1]; \ +#define MDER_INPUT_INT_U16(_int, _buf) do { \ + _int = 0; \ + _int = ((const uint8_t *)_buf)[0]; \ + _int = (_int << 8) | ((const uint8_t *)_buf)[1]; \ }while (0) #ifdef __cplusplus From c9633a8530fe1c149b3361157bacbf176e23b7bf Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Sat, 17 Apr 2010 12:11:03 +0200 Subject: [PATCH 1452/1469] Removed mder_octet_str_types type. Above type is not yet neccessary because OCTET STRING constraint are marked with mder_octet_str when it has an explicit SIZE constraint --- skeletons/mder_support.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/skeletons/mder_support.h b/skeletons/mder_support.h index 69880c94e..3b34ff558 100644 --- a/skeletons/mder_support.h +++ b/skeletons/mder_support.h @@ -73,11 +73,6 @@ typedef enum { BITS_32 = 4 } mder_restricted_bit_str; -typedef enum { - FIXED_OCTET_STRING, - VARIABLE_OCTET_STRING -} mder_octet_str_types; - typedef uint16_t mder_octet_str; /* From 3bf7968eab171a9a1390fbb875b751ca968dd97d Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Sat, 17 Apr 2010 13:15:42 +0200 Subject: [PATCH 1453/1469] Fixed linker error with mder encoder/decoder libraries. --- skeletons/Makefile.in | 3 ++- skeletons/mder_support.h | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/skeletons/Makefile.in b/skeletons/Makefile.in index 75aae0bb0..4f69a44db 100644 --- a/skeletons/Makefile.in +++ b/skeletons/Makefile.in @@ -61,7 +61,8 @@ am_libasn1cskeletons_la_OBJECTS = ANY.lo BIT_STRING.lo BMPString.lo \ constr_CHOICE.lo constr_SEQUENCE.lo constr_SEQUENCE_OF.lo \ constr_SET.lo constr_SET_OF.lo constr_TYPE.lo constraints.lo \ der_encoder.lo per_decoder.lo per_encoder.lo per_opentype.lo \ - per_support.lo xer_decoder.lo xer_encoder.lo xer_support.lo + per_support.lo xer_decoder.lo xer_encoder.lo xer_support.lo \ + mder_decoder.lo mder_encoder.lo libasn1cskeletons_la_OBJECTS = $(am_libasn1cskeletons_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp diff --git a/skeletons/mder_support.h b/skeletons/mder_support.h index 3b34ff558..6342b4f3e 100644 --- a/skeletons/mder_support.h +++ b/skeletons/mder_support.h @@ -73,6 +73,9 @@ typedef enum { BITS_32 = 4 } mder_restricted_bit_str; +/* + * Pre-computed O-S contraints if they are present + */ typedef uint16_t mder_octet_str; /* From 2948606bc6b59f435a4a47685cf10d8e478e33c0 Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Sun, 2 May 2010 23:39:24 +0200 Subject: [PATCH 1454/1469] Solved problem in choice decoding --- libasn1compiler/asn1c_C.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 6ce7e95fc..5eba24fc8 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1748,8 +1748,6 @@ emit_MDER_tag2member_table(arg_t *arg, tag2el_t *tag2el, int tag2el_count) { return 0; /* No top level tags */ type = tag2el[0].el_tag.tag_mode; /* All tags should be equal to that */ - if (type == TM_IMPLICIT) - return 0; for(i = 1; i < tag2el_count; i++) if (type != tag2el[i].el_tag.tag_mode) @@ -1760,7 +1758,7 @@ emit_MDER_tag2member_table(arg_t *arg, tag2el_t *tag2el, int tag2el_count) { return 0; for(i = 0; i < tag2el_count; i++) { - if (type != TM_EXPLICIT) { + if (type == TM_DEFAULT) { /* Implicit tag */ if (((tag2el[i].el_no + 1) < 0) || ((tag2el[i].el_no + 1) > 65535)) { /* Tag can't be encoded in an uint16_t */ From 4c1244d38c2644f7c9e3a0f2f3484f88527ea6aa Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Mon, 3 May 2010 22:04:05 +0200 Subject: [PATCH 1455/1469] Undo changes --- libasn1compiler/asn1c_C.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 5eba24fc8..6ce7e95fc 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1748,6 +1748,8 @@ emit_MDER_tag2member_table(arg_t *arg, tag2el_t *tag2el, int tag2el_count) { return 0; /* No top level tags */ type = tag2el[0].el_tag.tag_mode; /* All tags should be equal to that */ + if (type == TM_IMPLICIT) + return 0; for(i = 1; i < tag2el_count; i++) if (type != tag2el[i].el_tag.tag_mode) @@ -1758,7 +1760,7 @@ emit_MDER_tag2member_table(arg_t *arg, tag2el_t *tag2el, int tag2el_count) { return 0; for(i = 0; i < tag2el_count; i++) { - if (type == TM_DEFAULT) { + if (type != TM_EXPLICIT) { /* Implicit tag */ if (((tag2el[i].el_no + 1) < 0) || ((tag2el[i].el_no + 1) > 65535)) { /* Tag can't be encoded in an uint16_t */ From 1e96fe3f5f124abf1d01b74f8329cbce2dd3449f Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Tue, 4 May 2010 22:01:53 +0200 Subject: [PATCH 1456/1469] Adding recovery from previously attemps with not enough bytes Decode continues in the next call of the function, recovering de decoding where it was. --- skeletons/BIT_STRING.c | 7 +++++-- skeletons/INTEGER.c | 7 +++++-- skeletons/OCTET_STRING.c | 14 +++++++++---- skeletons/constr_CHOICE.c | 27 +++++++++++++++++++++---- skeletons/constr_SEQUENCE.c | 17 +++++++++++++--- skeletons/constr_SEQUENCE_OF.c | 37 ++++++++++++++++++++++++++-------- 6 files changed, 86 insertions(+), 23 deletions(-) diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index b63643cb1..9ee800bbc 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -99,8 +99,11 @@ BIT_STRING_decode_mder(asn_codec_ctx_t *opt_codec_ctx, } bs->size = *rbs; - if (bs->size > size) - _ASN_DECODE_FAILED; + if (bs->size > size) { + rval.code = RC_WMORE; + rval.consumed = 0; + return rval; + } if (bs->buf) free(bs->buf); bs->buf = CALLOC(1, bs->size); diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 0f9688414..b8b8a2c02 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -75,8 +75,11 @@ INTEGER_decode_mder(asn_codec_ctx_t *opt_codec_ctx, } } - if(length > size) - _ASN_DECODE_FAILED; + if(length > size) { + rval.code = RC_WMORE; + rval.consumed = 0; + return rval; + } unconst_buf.constbuf = buf_ptr; integer->buf = (uint8_t *)unconst_buf.nonconstbuf; integer->size = length; diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 97a9f3eb9..47a4d06a8 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -602,8 +602,11 @@ OCTET_STRING_decode_mder(asn_codec_ctx_t *opt_codec_ctx, } if (!oct) { - if (size < 2) - _ASN_DECODE_FAILED; + if (size < 2) { + rval.code = RC_WMORE; + rval.consumed = 0; + return rval; + } st->size = 0; st->size = ((const uint8_t *)buf_ptr)[0]; st->size = (st->size << 8) | ((const uint8_t *)buf_ptr)[1]; @@ -614,8 +617,11 @@ OCTET_STRING_decode_mder(asn_codec_ctx_t *opt_codec_ctx, rval.consumed = 0; data = (const char *)buf_ptr; } - if (size < (st->size + rval.consumed)) - _ASN_DECODE_FAILED; + if (size < (st->size + rval.consumed)) { + rval.code = RC_WMORE; + rval.consumed = 0; + return rval; + } if (OCTET_STRING_fromBuf(st, data, st->size) != 0) _ASN_DECODE_FAILED; diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index a6f0fb9f3..0568ef9c1 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -469,6 +469,7 @@ CHOICE_decode_mder(asn_codec_ctx_t *opt_codec_ctx, uint16_t comp_size; asn_TYPE_member_t *elm; /* CHOICE element */ void *memb_ptr; + asn_struct_ctx_t *ctx; if (!*sptr) { /* Alloc memory for the target structure */ @@ -477,8 +478,18 @@ CHOICE_decode_mder(asn_codec_ctx_t *opt_codec_ctx, RETURN(RC_FAIL); } - if(size < 4) + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)*sptr + specs->ctx_offset); + if (!ctx) RETURN(RC_FAIL); + if (ctx->phase > 0) + goto phase1; + + if (size < 2) { + RETURN(RC_WMORE); + } MDER_INPUT_INT_U16(present_tag, ptr); ADVANCE_MDER(2); @@ -492,12 +503,20 @@ CHOICE_decode_mder(asn_codec_ctx_t *opt_codec_ctx, if(*presentp <= 0 || *presentp > td->elements_count) RETURN(RC_FAIL); + ctx->ptr = presentp; + ctx->phase = 1; +phase1: + if (ctx->phase > 1) + goto phase2; + if (size < 2) { + RETURN(RC_WMORE); + } MDER_INPUT_INT_U16(comp_size, ptr); ADVANCE_MDER(2); - if (comp_size > size) - _ASN_DECODE_FAILED; + ctx->phase = 2; - elm = &td->elements[*presentp - 1]; +phase2: + elm = &td->elements[*(int *)ctx->ptr - 1]; if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)(*(char **)sptr + elm->memb_offset); if(memb_ptr == 0) diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 91dfc2764..795585c4a 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -604,6 +604,7 @@ SEQUENCE_decode_mder(asn_codec_ctx_t *opt_codec_ctx, void *st = *sptr; /* Target structure. */ asn_dec_rval_t rval; /* Return code */ + asn_struct_ctx_t *ctx; ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ int edx; /* SEQUENCE element's index */ @@ -620,7 +621,14 @@ SEQUENCE_decode_mder(asn_codec_ctx_t *opt_codec_ctx, } } - for(edx = 0; edx < td->elements_count; edx++) { + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + if (!ctx) + _ASN_DECODE_FAILED; + + for(edx = ctx->context; edx < td->elements_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; void **memb_ptr2; @@ -642,12 +650,15 @@ SEQUENCE_decode_mder(asn_codec_ctx_t *opt_codec_ctx, rval = elm->type->mder_decoder(opt_codec_ctx, elm->type, memb_ptr2, ptr, size, elm->mder_constraints); + + consumed_myself += rval.consumed; + ctx->context = edx; + if (rval.code != RC_OK) - RETURN(RC_FAIL); + RETURN(rval.code); ptr = ((const char *)ptr) + rval.consumed; size -= rval.consumed; - consumed_myself += rval.consumed; } RETURN(RC_OK); } diff --git a/skeletons/constr_SEQUENCE_OF.c b/skeletons/constr_SEQUENCE_OF.c index 9a165dc9e..9d7dc4d19 100644 --- a/skeletons/constr_SEQUENCE_OF.c +++ b/skeletons/constr_SEQUENCE_OF.c @@ -112,31 +112,52 @@ SEQUENCE_OF_decode_mder(asn_codec_ctx_t *opt_codec_ctx, ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ int edx, rec_size; asn_dec_rval_t rval; /* Return code */ + asn_struct_ctx_t *ctx; + asn_SET_OF_specifics_t *specs; - if (size < 4) + specs = (asn_SET_OF_specifics_t *)td->specifics; + + if (!list) { + list = *sptr = CALLOC(1, specs->struct_size); + if(list == 0) { + RETURN(RC_FAIL); + } + } + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)list + specs->ctx_offset); + if (!ctx) _ASN_DECODE_FAILED; + + if (ctx->phase == 1) + goto phase1; + if (size < 4) { + RETURN(RC_WMORE); + } MDER_INPUT_INT_U16(list->count, ptr); ADVANCE(2); MDER_INPUT_INT_U16(rec_size, ptr); ADVANCE(2); - if (rec_size > size) - _ASN_DECODE_FAILED; - /* Allocate memory for the return type*/ if (list->array) free(list->array); - list->size = rec_size * sizeof(*list->array); + list->size = list->count * sizeof(*list->array); list->array = CALLOC(rec_size, sizeof(*list->array)); if (!list->array) RETURN(RC_FAIL); + ctx->phase = 1; - for(edx = 0; edx < list->count; edx++) { +phase1: + + for(edx = ctx->context; edx < list->count; edx++) { rval = elm->type->mder_decoder(opt_codec_ctx, elm->type, &list->array[edx], ptr, size, constr); - if (rval.code != RC_OK) - RETURN(RC_FAIL); ADVANCE(rval.consumed); + ctx->context = edx; + if (rval.code != RC_OK) + RETURN(rval.code); } RETURN(RC_OK); From 045984a038463a44f70d2bba142a1f8bd27fab44 Mon Sep 17 00:00:00 2001 From: Jose Antonio Santos Cadenas Date: Sun, 6 Jun 2010 15:04:24 +0200 Subject: [PATCH 1457/1469] Solve a problem encoding mder when the octect string length is 0 --- skeletons/OCTET_STRING.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 47a4d06a8..0210ce512 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -647,7 +647,10 @@ OCTET_STRING_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, oct = (constr) ? (mder_octet_str *)constr : (mder_octet_str *)td->mder_constraints; - if (!(st && st->buf)) + if (!st) + _ASN_ENCODE_FAILED; + + if ((st->size > 0) && !st->buf) _ASN_ENCODE_FAILED; if (oct && (st->size != *oct)) From 957748d24bbcda2871808bfe498b89a482ff5600 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Tue, 21 Sep 2010 14:58:05 +0200 Subject: [PATCH 1458/1469] Fix compilation warning in Integer MDER decoder --- skeletons/INTEGER.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index b8b8a2c02..fdb07ada7 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -50,7 +50,7 @@ INTEGER_decode_mder(asn_codec_ctx_t *opt_codec_ctx, INTEGER_t *integer = (INTEGER_t *)*sptr; asn_dec_rval_t rval; mder_restricted_int *rint; - int length; + unsigned int length; union { const void *constbuf; void *nonconstbuf; From 368f1434cb4300935f51426ce9f03817572213e3 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Tue, 21 Sep 2010 15:52:46 +0200 Subject: [PATCH 1459/1469] Supress warning in mder encode for constr_CHOICE types --- skeletons/constr_CHOICE.c | 5 +++-- skeletons/mder_support.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 0568ef9c1..fbb5bcfe4 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -540,7 +540,7 @@ CHOICE_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, asn_TYPE_member_t *elm; /* CHOICE element */ asn_enc_rval_t erval; void *memb_ptr; - int present; + int present, tag; if (!(sptr && specs->sorted_tags)) _ASN_ENCODE_FAILED; @@ -582,7 +582,8 @@ CHOICE_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, } /* Encode element's tag */ - MDER_OUTPUT_INT_U16_LENGTH(specs->sorted_tags[present-1]); + tag = specs->sorted_tags[present-1]; + MDER_OUTPUT_INT_U16_LENGTH(tag); /* Encode octets length */ MDER_OUTPUT_INT_U16_LENGTH(erval.encoded); diff --git a/skeletons/mder_support.h b/skeletons/mder_support.h index 6342b4f3e..9142aafeb 100644 --- a/skeletons/mder_support.h +++ b/skeletons/mder_support.h @@ -91,7 +91,7 @@ typedef void* asn_mder_contraints_t; #ifdef WORDS_BIGENDIAN /* Opportunistic optimization */ #define MDER_OUTPUT_INT_U16_LENGTH(_len) do { \ CHECK_UINT16(_len); \ - if (cb) { \ + if (cb) { \ uint16_t aux = (uint16_t)(_len); \ _ASN_CALLBACK((uint8_t *)&aux, 2); \ } \ From d49c7d99f8a90156806c3e1bcc157cae3d583b62 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Tue, 21 Sep 2010 16:05:33 +0200 Subject: [PATCH 1460/1469] Supress warnings in Sequence_of types --- skeletons/constr_SEQUENCE_OF.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/skeletons/constr_SEQUENCE_OF.c b/skeletons/constr_SEQUENCE_OF.c index 9d7dc4d19..1a9a11607 100644 --- a/skeletons/constr_SEQUENCE_OF.c +++ b/skeletons/constr_SEQUENCE_OF.c @@ -172,10 +172,8 @@ SEQUENCE_OF_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, asn_app_consume_bytes_f *cb, void *app_key) { asn_TYPE_member_t *elm = td->elements; asn_anonymous_sequence_ *list = _A_SEQUENCE_FROM_VOID(sptr); + int edx, computed_size = 0, encoding_size = 0; asn_enc_rval_t er; - size_t computed_size = 0; - ssize_t encoding_size = 0; - int edx; ASN_DEBUG("%s %s as SEQUENCE OF", cb?"Encoding":"Estimating", td->name); @@ -219,7 +217,7 @@ SEQUENCE_OF_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, encoding_size += er.encoded; } - if(computed_size != (size_t)encoding_size) + if(computed_size != encoding_size) goto cb_failed; er.encoded = computed_size + 4; /* +4 count and length*/ From 676fa15e163bccaa7b92860e54b0f608cc8dc41f Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Tue, 21 Sep 2010 16:20:31 +0200 Subject: [PATCH 1461/1469] Supress warnings in BIT_STRING types --- skeletons/BIT_STRING.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index 9ee800bbc..a86027509 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -99,7 +99,7 @@ BIT_STRING_decode_mder(asn_codec_ctx_t *opt_codec_ctx, } bs->size = *rbs; - if (bs->size > size) { + if ((size_t)bs->size > size) { rval.code = RC_WMORE; rval.consumed = 0; return rval; From c4fe79e534c5cc42e67a4502fa2c0529a1756ba8 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Mon, 18 Oct 2010 15:46:29 +0200 Subject: [PATCH 1462/1469] Fix compilation warning in BIT_STRING mder_decoder --- skeletons/BIT_STRING.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index f6313199c..d7f1de15f 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -87,7 +87,7 @@ BIT_STRING_decode_mder(asn_codec_ctx_t *opt_codec_ctx, rbs = (constr) ? (mder_restricted_bit_str *)constr : (mder_restricted_bit_str *)td->mder_constraints; - if (!rbs || *rbs == INT_INVALID) + if (!rbs || *rbs == BITS_INVALID) _ASN_DECODE_FAILED; if(bs == NULL) { From c8215cb426cf6945abdfc56beec031c9bb0e9a5d Mon Sep 17 00:00:00 2001 From: Lev Walkin Date: Sun, 24 Oct 2010 19:11:58 -0700 Subject: [PATCH 1463/1469] Added failing MDER encoder/decoder to avoid compile errors in tests. --- skeletons/constr_SET.c | 18 ++++++++++++++++++ skeletons/constr_SET.h | 2 ++ skeletons/constr_SET_OF.c | 11 ++++++++++- skeletons/constr_SET_OF.h | 1 + 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index ecf56617a..cc052b13f 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -570,6 +570,24 @@ SET_encode_der(asn_TYPE_descriptor_t *td, _ASN_ENCODED_OK(er); } +asn_dec_rval_t +SET_decode_mder(struct asn_codec_ctx_s *opt_codec_ctx, + struct asn_TYPE_descriptor_s *td, + void **struct_ptr, const void *buf_ptr, size_t size, + asn_mder_contraints_t constr) { + + _ASN_DECODE_FAILED; +} + +asn_enc_rval_t +SET_encode_mder(struct asn_TYPE_descriptor_s *td, void *sptr, + asn_mder_contraints_t constr, + asn_app_consume_bytes_f *consume_bytes_cb, void *app_key) { + + _ASN_ENCODE_FAILED; +} + + #undef XER_ADVANCE #define XER_ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ diff --git a/skeletons/constr_SET.h b/skeletons/constr_SET.h index 0c78ed59c..8a2819a3e 100644 --- a/skeletons/constr_SET.h +++ b/skeletons/constr_SET.h @@ -50,6 +50,8 @@ asn_struct_print_f SET_print; asn_constr_check_f SET_constraint; ber_type_decoder_f SET_decode_ber; der_type_encoder_f SET_encode_der; +mder_type_decoder_f SET_decode_mder; +mder_type_encoder_f SET_encode_mder; xer_type_decoder_f SET_decode_xer; xer_type_encoder_f SET_encode_xer; per_type_decoder_f SET_decode_uper; diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index 220fe1e41..56e09d033 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -462,10 +462,19 @@ SET_OF_decode_mder(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **nint_ptr, const void *buf_ptr, size_t size, asn_mder_contraints_t constr) { - printf("TODO: Implement decode of SET_OF\n"); + ASN_DEBUG("TODO: Implement decode of SET_OF"); _ASN_DECODE_FAILED; } +asn_enc_rval_t +SET_OF_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er; + + _ASN_ENCODE_FAILED; +} + #undef XER_ADVANCE #define XER_ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ diff --git a/skeletons/constr_SET_OF.h b/skeletons/constr_SET_OF.h index df1c95303..2e8be82d3 100644 --- a/skeletons/constr_SET_OF.h +++ b/skeletons/constr_SET_OF.h @@ -31,6 +31,7 @@ asn_constr_check_f SET_OF_constraint; ber_type_decoder_f SET_OF_decode_ber; der_type_encoder_f SET_OF_encode_der; mder_type_decoder_f SET_OF_decode_mder; +der_type_encoder_f SET_OF_encode_mder; xer_type_decoder_f SET_OF_decode_xer; xer_type_encoder_f SET_OF_encode_xer; per_type_decoder_f SET_OF_decode_uper; From b17109c588850798080a4f13d4f3b6debeb3304f Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Fri, 29 Oct 2010 17:41:07 +0200 Subject: [PATCH 1464/1469] Remove functions to encode/decode non-supported mder SET_OF type --- skeletons/constr_SET_OF.c | 21 --------------------- skeletons/constr_SET_OF.h | 2 -- 2 files changed, 23 deletions(-) diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index 56e09d033..d6aef1259 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -454,27 +454,6 @@ SET_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, _ASN_ENCODED_OK(erval); } -/* - * MDER Decode SET OF type. - */ -asn_dec_rval_t -SET_OF_decode_mder(asn_codec_ctx_t *opt_codec_ctx, - asn_TYPE_descriptor_t *td, void **nint_ptr, const void *buf_ptr, - size_t size, asn_mder_contraints_t constr) { - - ASN_DEBUG("TODO: Implement decode of SET_OF"); - _ASN_DECODE_FAILED; -} - -asn_enc_rval_t -SET_OF_encode_mder(asn_TYPE_descriptor_t *td, void *sptr, - int ilevel, enum xer_encoder_flags_e flags, - asn_app_consume_bytes_f *cb, void *app_key) { - asn_enc_rval_t er; - - _ASN_ENCODE_FAILED; -} - #undef XER_ADVANCE #define XER_ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ diff --git a/skeletons/constr_SET_OF.h b/skeletons/constr_SET_OF.h index 2e8be82d3..bcd096629 100644 --- a/skeletons/constr_SET_OF.h +++ b/skeletons/constr_SET_OF.h @@ -30,8 +30,6 @@ asn_struct_print_f SET_OF_print; asn_constr_check_f SET_OF_constraint; ber_type_decoder_f SET_OF_decode_ber; der_type_encoder_f SET_OF_encode_der; -mder_type_decoder_f SET_OF_decode_mder; -der_type_encoder_f SET_OF_encode_mder; xer_type_decoder_f SET_OF_decode_xer; xer_type_encoder_f SET_OF_encode_xer; per_type_decoder_f SET_OF_decode_uper; From b90d779d29a39e0e485009d93af7be9a55553245 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Thu, 28 Oct 2010 18:49:37 +0200 Subject: [PATCH 1465/1469] Supress initilization from uncompatible pointer for non-supported mder types --- libasn1compiler/asn1c_C.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 248c6b8e5..e14eb64c0 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -2612,6 +2612,26 @@ emit_member_MDER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { return 1; } +static int +is_valid_mder_type(arg_t *arg, asn1p_expr_t *expr) +{ + asn1p_expr_type_e etype; + + etype = expr_get_type(arg, expr); + switch (etype) { + case ASN_BASIC_INTEGER: + case ASN_BASIC_BIT_STRING: + case ASN_BASIC_OCTET_STRING: + case ASN_CONSTR_SEQUENCE: + case ASN_CONSTR_SEQUENCE_OF: + case ASN_CONSTR_CHOICE: + case ASN_TYPE_ANY: + return 1; + default: + return 0; + } +} + /* * Generate "asn_DEF_XXX" type definition. */ @@ -2660,13 +2680,20 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ OUT("_" #foo ",\n"); \ } while(0) +#define MDER_FUNCREF(foo) do { \ + if(is_valid_mder_type(arg, expr)) \ + FUNCREF(foo); \ + else \ + OUT("NON_SUP_" #foo ",\n"); \ +} while(0) + FUNCREF(free); FUNCREF(print); FUNCREF(constraint); FUNCREF(decode_ber); FUNCREF(encode_der); - FUNCREF(decode_mder); - FUNCREF(encode_mder); + MDER_FUNCREF(decode_mder); + MDER_FUNCREF(encode_mder); FUNCREF(decode_xer); FUNCREF(encode_xer); if(arg->flags & A1C_GEN_PER) { From c4645c2746b99e839affe1706ebc548f7054a31c Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Fri, 29 Oct 2010 16:24:02 +0200 Subject: [PATCH 1466/1469] Fix error generating constraints for non supported MDER types --- libasn1compiler/asn1c_C.c | 42 +++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index e14eb64c0..5f40930b1 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -2354,6 +2354,26 @@ try_inline_default(arg_t *arg, asn1p_expr_t *expr, int out) { return 0; } +static int +is_valid_mder_type(arg_t *arg, asn1p_expr_t *expr) +{ + asn1p_expr_type_e etype; + + etype = expr_get_type(arg, expr); + switch (etype) { + case ASN_BASIC_INTEGER: + case ASN_BASIC_BIT_STRING: + case ASN_BASIC_OCTET_STRING: + case ASN_CONSTR_SEQUENCE: + case ASN_CONSTR_SEQUENCE_OF: + case ASN_CONSTR_CHOICE: + case ASN_TYPE_ANY: + return 1; + default: + return 0; + } +} + static int emit_member_table(arg_t *arg, asn1p_expr_t *expr) { int save_target; @@ -2483,7 +2503,7 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { OUT("\"%s\",\n", expr->Identifier); } if(C99_MODE) OUT(".mder_constraints = "); - if(expr->constraints) + if(expr->constraints && is_valid_mder_type(arg, expr)) OUT("&asn_MDER_memb_%s_constr_%d\n", MKID(expr), expr->_type_unique_index); else @@ -2612,26 +2632,6 @@ emit_member_MDER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { return 1; } -static int -is_valid_mder_type(arg_t *arg, asn1p_expr_t *expr) -{ - asn1p_expr_type_e etype; - - etype = expr_get_type(arg, expr); - switch (etype) { - case ASN_BASIC_INTEGER: - case ASN_BASIC_BIT_STRING: - case ASN_BASIC_OCTET_STRING: - case ASN_CONSTR_SEQUENCE: - case ASN_CONSTR_SEQUENCE_OF: - case ASN_CONSTR_CHOICE: - case ASN_TYPE_ANY: - return 1; - default: - return 0; - } -} - /* * Generate "asn_DEF_XXX" type definition. */ From 1d40f261caf491b6316ba89aeec8cf046f49b5e6 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Fri, 29 Oct 2010 18:13:33 +0200 Subject: [PATCH 1467/1469] Remove functions to encode/decode non-supported mder SET type --- skeletons/constr_SET.c | 18 ------------------ skeletons/constr_SET.h | 2 -- 2 files changed, 20 deletions(-) diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index cc052b13f..ecf56617a 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -570,24 +570,6 @@ SET_encode_der(asn_TYPE_descriptor_t *td, _ASN_ENCODED_OK(er); } -asn_dec_rval_t -SET_decode_mder(struct asn_codec_ctx_s *opt_codec_ctx, - struct asn_TYPE_descriptor_s *td, - void **struct_ptr, const void *buf_ptr, size_t size, - asn_mder_contraints_t constr) { - - _ASN_DECODE_FAILED; -} - -asn_enc_rval_t -SET_encode_mder(struct asn_TYPE_descriptor_s *td, void *sptr, - asn_mder_contraints_t constr, - asn_app_consume_bytes_f *consume_bytes_cb, void *app_key) { - - _ASN_ENCODE_FAILED; -} - - #undef XER_ADVANCE #define XER_ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ diff --git a/skeletons/constr_SET.h b/skeletons/constr_SET.h index 8a2819a3e..0c78ed59c 100644 --- a/skeletons/constr_SET.h +++ b/skeletons/constr_SET.h @@ -50,8 +50,6 @@ asn_struct_print_f SET_print; asn_constr_check_f SET_constraint; ber_type_decoder_f SET_decode_ber; der_type_encoder_f SET_encode_der; -mder_type_decoder_f SET_decode_mder; -mder_type_encoder_f SET_encode_mder; xer_type_decoder_f SET_decode_xer; xer_type_encoder_f SET_encode_xer; per_type_decoder_f SET_decode_uper; From 5a9b0ae08a29808dd2289b9f9349449b7c7e5731 Mon Sep 17 00:00:00 2001 From: Lev Walkin Date: Sun, 12 Dec 2010 02:09:11 -0800 Subject: [PATCH 1468/1469] 32/64 bit fixes --- skeletons/BIT_STRING.c | 1 - skeletons/INTEGER.c | 6 ++--- skeletons/per_decoder.c | 4 ++-- skeletons/per_encoder.c | 2 +- skeletons/per_opentype.c | 51 ++++++++++++++++++++-------------------- skeletons/per_support.c | 40 ++++++++++++++----------------- 6 files changed, 49 insertions(+), 55 deletions(-) diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index d7f1de15f..7ee644441 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -4,7 +4,6 @@ */ #include #include -#include /* * BIT STRING basic type description. diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index ed6ce1530..a1c8bdc46 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -542,7 +542,7 @@ INTEGER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chun lp = lstart - 1; continue; } else { - ASN_DEBUG("state %d at %d", state, lp - lstart); + ASN_DEBUG("state %d at %ld", state, (long)(lp - lstart)); break; } /* [A-Fa-f] */ @@ -577,8 +577,8 @@ INTEGER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chun } /* Found extra non-numeric stuff */ - ASN_DEBUG("Found non-numeric 0x%2x at %d", - lv, lp - lstart); + ASN_DEBUG("Found non-numeric 0x%2x at %ld", + lv, (long)(lp - lstart)); state = ST_EXTRASTUFF; break; } diff --git a/skeletons/per_decoder.c b/skeletons/per_decoder.c index 2b3d2e298..95cc74f33 100644 --- a/skeletons/per_decoder.c +++ b/skeletons/per_decoder.c @@ -81,8 +81,8 @@ uper_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sp /* Return the number of consumed bits */ rval.consumed = ((pd.buffer - (const uint8_t *)buffer) << 3) + pd.nboff - skip_bits; - ASN_DEBUG("PER decoding consumed %d, counted %d", - rval.consumed, pd.moved); + ASN_DEBUG("PER decoding consumed %ld, counted %ld", + (long)rval.consumed, (long)pd.moved); assert(rval.consumed == pd.moved); } else { /* PER codec is not a restartable */ diff --git a/skeletons/per_encoder.c b/skeletons/per_encoder.c index f4bace060..e76ef74a9 100644 --- a/skeletons/per_encoder.c +++ b/skeletons/per_encoder.c @@ -88,7 +88,7 @@ uper_encode_to_new_buffer(asn_TYPE_descriptor_t *td, asn_per_constraints_t *cons } default: *buffer_r = key.buffer; - ASN_DEBUG("Complete encoded in %d bits", er.encoded); + ASN_DEBUG("Complete encoded in %ld bits", (long)er.encoded); return ((er.encoded + 7) >> 3); } } diff --git a/skeletons/per_opentype.c b/skeletons/per_opentype.c index c749c8c6c..6034d463f 100644 --- a/skeletons/per_opentype.c +++ b/skeletons/per_opentype.c @@ -47,8 +47,8 @@ uper_open_type_put(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints FREEMEM(buf); if(toGo) return -1; - ASN_DEBUG("Open type put %s of length %d + overhead (1byte?)", - td->name, size); + ASN_DEBUG("Open type put %s of length %ld + overhead (1byte?)", + td->name, (long)size); return 0; } @@ -92,8 +92,8 @@ uper_open_type_get_simple(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, bufLen += chunk_bytes; } while(repeat); - ASN_DEBUG("Getting open type %s encoded in %d bytes", td->name, - bufLen); + ASN_DEBUG("Getting open type %s encoded in %ld bytes", td->name, + (long)bufLen); memset(&spd, 0, sizeof(spd)); spd.buffer = buf; @@ -113,7 +113,7 @@ uper_open_type_get_simple(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, } FREEMEM(buf); if(padding >= 8) { - ASN_DEBUG("Too large padding %d in open type", padding); + ASN_DEBUG("Too large padding %ld in open type", (long)padding); _ASN_DECODE_FAILED; } else { ASN_DEBUG("Non-zero padding"); @@ -165,24 +165,24 @@ uper_open_type_get_complex(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, return rv; } - ASN_DEBUG("OpenType %s pd%s old%s unclaimed=%d, repeat=%d" + ASN_DEBUG("OpenType %s pd%s old%s unclaimed=%ld, repeat=%ld" , td->name, per_data_string(pd), per_data_string(&arg.oldpd), - arg.unclaimed, arg.repeat); + (long)arg.unclaimed, (long)arg.repeat); padding = pd->moved % 8; if(padding) { int32_t pvalue; if(padding > 7) { - ASN_DEBUG("Too large padding %d in open type", - padding); + ASN_DEBUG("Too large padding %ld in open type", + (long)padding); rv.code = RC_FAIL; UPDRESTOREPD; return rv; } padding = 8 - padding; - ASN_DEBUG("Getting padding of %d bits", padding); + ASN_DEBUG("Getting padding of %ld bits", (long)padding); pvalue = per_get_few_bits(pd, padding); switch(pvalue) { case -1: @@ -191,8 +191,8 @@ uper_open_type_get_complex(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, _ASN_DECODE_STARVED; case 0: break; default: - ASN_DEBUG("Non-blank padding (%d bits 0x%02x)", - padding, (int)pvalue); + ASN_DEBUG("Non-blank padding (%ld bits 0x%02x)", + (long)padding, (int)pvalue); UPDRESTOREPD; _ASN_DECODE_FAILED; } @@ -212,14 +212,14 @@ uper_open_type_get_complex(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, UPDRESTOREPD; /* Skip data not consumed by the decoder */ - if(arg.unclaimed) ASN_DEBUG("Getting unclaimed %d", arg.unclaimed); if(arg.unclaimed) { + ASN_DEBUG("Getting unclaimed %ld", (long)arg.unclaimed); switch(per_skip_bits(pd, arg.unclaimed)) { case -1: - ASN_DEBUG("Claim of %d failed", arg.unclaimed); + ASN_DEBUG("Claim of %ld failed", (long)arg.unclaimed); _ASN_DECODE_STARVED; case 0: - ASN_DEBUG("Got claim of %d", arg.unclaimed); + ASN_DEBUG("Got claim of %ld", (long)arg.unclaimed); break; default: /* Padding must be blank */ @@ -293,8 +293,8 @@ uper_ugot_refill(asn_per_data_t *pd) { asn_per_data_t *oldpd = &arg->oldpd; - ASN_DEBUG("REFILLING pd->moved=%d, oldpd->moved=%d", - pd->moved, oldpd->moved); + ASN_DEBUG("REFILLING pd->moved=%ld, oldpd->moved=%ld", + (long)pd->moved, (long)oldpd->moved); /* Advance our position to where pd is */ oldpd->buffer = pd->buffer; @@ -314,7 +314,7 @@ uper_ugot_refill(asn_per_data_t *pd) { pd->buffer = oldpd->buffer; pd->nboff = oldpd->nboff - 1; pd->nbits = oldpd->nbits; - ASN_DEBUG("UNCLAIMED <- return from (pd->moved=%d)", pd->moved); + ASN_DEBUG("UNCLAIMED <- return from (pd->moved=%ld)", (long)pd->moved); return 0; } @@ -324,8 +324,8 @@ uper_ugot_refill(asn_per_data_t *pd) { } next_chunk_bytes = uper_get_length(oldpd, -1, &arg->repeat); - ASN_DEBUG("Open type LENGTH %d bytes at off %d, repeat %d", - next_chunk_bytes, oldpd->moved, arg->repeat); + ASN_DEBUG("Open type LENGTH %ld bytes at off %ld, repeat %ld", + (long)next_chunk_bytes, (long)oldpd->moved, (long)arg->repeat); if(next_chunk_bytes < 0) return -1; if(next_chunk_bytes == 0) { pd->refill = 0; /* No more refills, naturally */ @@ -336,14 +336,15 @@ uper_ugot_refill(asn_per_data_t *pd) { if(avail >= next_chunk_bits) { pd->nbits = oldpd->nboff + next_chunk_bits; arg->unclaimed = 0; - ASN_DEBUG("!+Parent frame %d bits, alloting %d [%d..%d] (%d)", - next_chunk_bits, oldpd->moved, - oldpd->nboff, oldpd->nbits, - oldpd->nbits - oldpd->nboff); + ASN_DEBUG("!+Parent frame %ld bits, alloting %ld [%ld..%ld] (%ld)", + (long)next_chunk_bits, (long)oldpd->moved, + (long)oldpd->nboff, (long)oldpd->nbits, + (long)oldpd->nbits - oldpd->nboff); } else { pd->nbits = oldpd->nbits; arg->unclaimed = next_chunk_bits - avail; - ASN_DEBUG("!-Parent frame %d, require %d, will claim %d", avail, next_chunk_bits, arg->unclaimed); + ASN_DEBUG("!-Parent frame %ld, require %ld, will claim %ld", + (long)avail, (long)next_chunk_bits, (long)arg->unclaimed); } pd->buffer = oldpd->buffer; pd->nboff = oldpd->nboff; diff --git a/skeletons/per_support.c b/skeletons/per_support.c index e8299c730..e57b3186d 100644 --- a/skeletons/per_support.c +++ b/skeletons/per_support.c @@ -13,11 +13,11 @@ per_data_string(asn_per_data_t *pd) { static int n; n = (n+1) % 2; snprintf(buf[n], sizeof(buf), - "{m=%d span %+d[%d..%d] (%d)}", - pd->moved, - (((int)pd->buffer) & 0xf), - pd->nboff, pd->nbits, - pd->nbits - pd->nboff); + "{m=%ld span %+ld[%ld..%ld] (%ld)}", + (long)pd->moved, + (((long int)pd->buffer) & 0xf), + (long)pd->nboff, (long)pd->nbits, + (long)(pd->nbits - pd->nboff)); return buf[n]; } @@ -49,7 +49,8 @@ per_get_few_bits(asn_per_data_t *pd, int nbits) { int32_t tailv, vhead; if(!pd->refill || nbits > 31) return -1; /* Accumulate unused bytes before refill */ - ASN_DEBUG("Obtain the rest %d bits (want %d)", nleft, nbits); + ASN_DEBUG("Obtain the rest %ld bits (want %ld)", + (long)nleft, (long)nbits); tailv = per_get_few_bits(pd, nleft); if(tailv < 0) return -1; /* Refill (replace pd contents with new data) */ @@ -103,15 +104,6 @@ per_get_few_bits(asn_per_data_t *pd, int nbits) { accum &= (((uint32_t)1 << nbits) - 1); - ASN_DEBUG(" [PER got %2d<=%2d bits => span %d %+d[%d..%d]:%02x (%d) => 0x%x]", - nbits, nleft, - pd->moved, - (((int)pd->buffer) & 0xf), - pd->nboff, pd->nbits, - pd->buffer[0], - pd->nbits - pd->nboff, - (int)accum); - return accum; } @@ -200,7 +192,7 @@ uper_get_nslength(asn_per_data_t *pd) { if(per_get_few_bits(pd, 1) == 0) { length = per_get_few_bits(pd, 6) + 1; if(length <= 0) return -1; - ASN_DEBUG("l=%d", length); + ASN_DEBUG("l=%ld", (long)length); return length; } else { int repeat; @@ -275,7 +267,7 @@ per_put_few_bits(asn_per_outp_t *po, uint32_t bits, int obits) { if(obits <= 0 || obits >= 32) return obits ? -1 : 0; ASN_DEBUG("[PER put %d bits %x to %p+%d bits]", - obits, (int)bits, po->buffer, po->nboff); + obits, (int)bits, po->buffer, (int)po->nboff); /* * Normalize position indicator. @@ -291,8 +283,8 @@ per_put_few_bits(asn_per_outp_t *po, uint32_t bits, int obits) { */ if(po->nboff + obits > po->nbits) { int complete_bytes = (po->buffer - po->tmpspace); - ASN_DEBUG("[PER output %d complete + %d]", - complete_bytes, po->flushed_bytes); + ASN_DEBUG("[PER output %d complete + %ld]", + complete_bytes, (long)po->flushed_bytes); if(po->outper(po->tmpspace, complete_bytes, po->op_key) < 0) return -1; if(po->nboff) @@ -312,9 +304,11 @@ per_put_few_bits(asn_per_outp_t *po, uint32_t bits, int obits) { /* Clear data of debris before meaningful bits */ bits &= (((uint32_t)1 << obits) - 1); - ASN_DEBUG("[PER out %d %u/%x (t=%d,o=%d) %x&%x=%x]", obits, + ASN_DEBUG("[PER out %d %u/%x (t=%ld,o=%d) %x&%x=%x]", obits, (int)bits, (int)bits, - po->nboff - obits, off, buf[0], omsk&0xff, buf[0] & omsk); + (long)(po->nboff - obits), + (unsigned)off, (unsigned)buf[0], + (unsigned)omsk&0xff, (unsigned)(buf[0] & omsk)); if(off <= 8) /* Completely within 1 byte */ bits <<= (8 - off), @@ -341,8 +335,8 @@ per_put_few_bits(asn_per_outp_t *po, uint32_t bits, int obits) { ASN_DEBUG("<-[PER out split %d]", obits); } - ASN_DEBUG("[PER out %u/%x => %02x buf+%d]", - (int)bits, (int)bits, buf[0], po->buffer - po->tmpspace); + ASN_DEBUG("[PER out %u/%x => %02x buf+%ld]", + (int)bits, (int)bits, buf[0], (long)(po->buffer - po->tmpspace)); return 0; } From 04f22ee53daa48f4f0c0fd794868a7abee5666f7 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Mon, 13 Dec 2010 20:02:00 +0100 Subject: [PATCH 1469/1469] Generate constraints only for valid MDER types. INTEGER, BIT STRING and OCTET STRING are valid constrained types with medical devices encoding rules. --- libasn1compiler/asn1c_C.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 5f40930b1..6aefef8e2 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -2374,6 +2374,22 @@ is_valid_mder_type(arg_t *arg, asn1p_expr_t *expr) } } +static int +valid_mder_constraints(arg_t *arg, asn1p_expr_t *expr) +{ + asn1p_expr_type_e etype; + + etype = expr_get_type(arg, expr); + switch (etype) { + case ASN_BASIC_INTEGER: + case ASN_BASIC_BIT_STRING: + case ASN_BASIC_OCTET_STRING: + return 1; + default: + return 0; + } +} + static int emit_member_table(arg_t *arg, asn1p_expr_t *expr) { int save_target; @@ -2503,7 +2519,7 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { OUT("\"%s\",\n", expr->Identifier); } if(C99_MODE) OUT(".mder_constraints = "); - if(expr->constraints && is_valid_mder_type(arg, expr)) + if(expr->constraints && valid_mder_constraints(arg, expr)) OUT("&asn_MDER_memb_%s_constr_%d\n", MKID(expr), expr->_type_unique_index); else